From ef1e7eb8e65f50dbba8527cd9ffc42a0a518907a Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Tue, 30 Jun 2026 18:41:18 +0200 Subject: [PATCH 01/38] Lucy v2 (Etappe 1.1): echte Vokal-Mundformen + Blick ohne Schielen - Lippensync: spektraler Schwerpunkt -> aa/ih/ou-Mundformen statt nur Pegel ("Mund auf/zu") - Augen blicken auf weit entfernten Punkt in Kamerarichtung -> kein Konvergenz-Schielen bei naher Kamera Co-Authored-By: Claude Opus 4.8 --- .../src/renderer/src/components/Avatar3D.tsx | 185 ++++++++++++++++++ .../src/renderer/src/lib/voice/audio.ts | 175 +++++++++++++++++ 2 files changed, 360 insertions(+) create mode 100644 client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx create mode 100644 client/lucy-desktop/src/renderer/src/lib/voice/audio.ts diff --git a/client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx b/client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx new file mode 100644 index 0000000..698ec67 --- /dev/null +++ b/client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx @@ -0,0 +1,185 @@ +import { Canvas, useFrame } from "@react-three/fiber" +import { OrbitControls } from "@react-three/drei" +import { useEffect, useRef, useState, type MutableRefObject } from "react" +import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js" +import { Object3D, Vector3 } from "three" +import { VRM, VRMLoaderPlugin, VRMUtils } from "@pixiv/three-vrm" +import type { Emotion } from "../lib/voice/sentiment" + +// 3D-Avatar (VRM): Lippensync (Mund folgt TTS-Pegel), Blinzeln, Mimik, lebendige Idle-/Sprech-Bewegung. +// Liest Live-Werte aus Mutable-Refs (kein Re-Render pro Frame). + +type LevelRef = MutableRefObject<{ current: number; aa?: number; ih?: number; ou?: number }> +type EmotionRef = MutableRefObject + +const REST: Record = { + leftUpperArm: [0, 0, 1.2], rightUpperArm: [0, 0, -1.2], leftLowerArm: [0, -0.2, 0], rightLowerArm: [0, 0.2, 0], +} +function setBone(vrm: VRM, name: string, x: number, y: number, z: number) { + const b = vrm.humanoid?.getNormalizedBoneNode(name as any) + if (b) b.rotation.set(x, y, z) +} +function applyRestPose(vrm: VRM) { + for (const [name, r] of Object.entries(REST)) setBone(vrm, name, r[0], r[1], r[2]) + vrm.humanoid?.update() +} + +function applyIdle(vrm: VRM, t: number, level: number, lookYaw: number, lookPitch: number, lean: number, speak: number) { + const breathe = Math.sin(t * 1.6), sway = Math.sin(t * 0.45), weight = Math.sin(t * 0.32), weight2 = Math.sin(t * 0.21 + 1) + const emph = Math.min(1, level * 1.6) + // Sprech-Rhythmus: organischer Doppel-Takt -> Kopf nickt/betont auf der Stimme + const beat = Math.sin(t * 2.4) + Math.sin(t * 3.7) * 0.5 + const nod = (emph * 0.05 + speak * 0.02) * beat + emph * Math.sin(t * 1.3) * 0.03 + const tilt = Math.sin(t * 0.7 + 0.5) * 0.03 + speak * Math.sin(t * 0.9) * 0.045 // gelegentliches Kopf-Neigen + setBone(vrm, "hips", 0, weight * 0.06, weight * 0.04 + weight2 * 0.02) + setBone(vrm, "spine", breathe * 0.03 + lean * 0.08 + speak * emph * 0.03, sway * 0.03, -weight * 0.04) + setBone(vrm, "chest", breathe * 0.025 + lean * 0.025, sway * 0.022, weight2 * 0.012) + setBone(vrm, "upperChest", breathe * 0.018, sway * 0.01, 0) + setBone(vrm, "neck", lookPitch * 0.4 + nod * 0.5, lookYaw * 0.4, tilt * 0.5) + setBone(vrm, "head", lookPitch * 0.6 + nod + Math.sin(t * 0.6) * 0.02, + lookYaw * 0.6 + Math.sin(t * 0.27) * 0.035, tilt + Math.sin(t * 0.5) * 0.025) + // Arme: lebhafterer Schwung um die Ruhepose + dezente Sprech-Geste — SICHER (kleine Amplituden) + const armSwing = Math.sin(t * 0.8) * 0.05 + speak * Math.sin(t * 1.6) * 0.045 + const lift = speak * emph * 0.07 // hebt die Arme beim Reden minimal an (mit den Händen reden) + setBone(vrm, "leftUpperArm", -lift, 0, 1.16 + armSwing + weight * 0.05) + setBone(vrm, "rightUpperArm", -lift, 0, -1.16 - armSwing + weight * 0.05) + setBone(vrm, "leftLowerArm", 0, -0.18 - Math.sin(t * 0.8) * 0.04 - speak * 0.07, 0) + setBone(vrm, "rightLowerArm", 0, 0.18 + Math.sin(t * 0.8) * 0.04 + speak * 0.07, 0) +} + +const EXPRESSIONS = ["happy", "angry", "sad", "surprised", "relaxed"] as const +const EMO_TO_EXPR: Record = { + neutral: null, happy: "happy", angry: "angry", sad: "sad", surprised: "surprised", relaxed: "relaxed", +} + +function VrmModel({ url, audioLevel, emotion, status, onError }: { + url: string; audioLevel: LevelRef; emotion: EmotionRef; status: MutableRefObject; onError: (m: string) => void +}) { + const [vrm, setVrm] = useState(null) + const smooth = useRef>({}) + const blink = useRef({ t: 0, next: 3, active: 0 }) + const motion = useRef({ yaw: 0, pitch: 0, tYaw: 0, tPitch: 0, t: 0, next: 2.5, lean: 0 }) + const think = useRef(0) // 0..1 Nachdenk-Pose-Blend + const speak = useRef(0) // 0..1 Sprech-Lebendigkeit + const gaze = useRef(new Object3D()) // weit entfernter Blickpunkt (gegen Schielen bei naher Kamera) + const headPos = useRef(new Vector3()) + const camPos = useRef(new Vector3()) + + useEffect(() => { + let disposed = false, loaded: VRM | null = null + const loader = new GLTFLoader() + loader.register((parser) => new VRMLoaderPlugin(parser)) + loader.load(url, (gltf) => { + if (disposed) return + const v = gltf.userData.vrm as VRM | undefined + if (!v) { onError("Datei enthaelt kein gueltiges VRM-Modell."); return } + VRMUtils.removeUnnecessaryVertices(gltf.scene) + if (v.meta?.metaVersion === "0") VRMUtils.rotateVRM0(v) + v.scene.rotation.y = Math.PI + applyRestPose(v) + loaded = v; setVrm(v) + }, undefined, (err) => { console.error("VRM-Load:", err); onError("Avatar konnte nicht geladen werden.") }) + return () => { disposed = true; if (loaded) VRMUtils.deepDispose(loaded.scene); setVrm(null) } + }, [url, onError]) + + useFrame((state, delta) => { + if (!vrm) return + const target = audioLevel.current?.current ?? 0 + // Blick zur Kamera, aber auf einen WEIT entfernten Punkt in Kamerarichtung -> Augen laufen + // nicht zusammen (kein Schielen bei naher Kamera), wirken aber weiter "auf dich gerichtet". + if (vrm.lookAt) { + const headNode = vrm.humanoid?.getNormalizedBoneNode("head") + const hp = headPos.current + if (headNode) headNode.getWorldPosition(hp); else hp.set(0, 1.3, 0) + const cp = camPos.current.copy(state.camera.position) + gaze.current.position.copy(cp).sub(hp).multiplyScalar(4).add(hp) // 4x = Blickpunkt weit dahinter + vrm.lookAt.target = gaze.current + } + const st = status.current + const spk = (speak.current += (((st === "speaking") ? 1 : 0) - speak.current) * Math.min(1, delta * 4)) + const m = motion.current + m.t += delta + if (m.t > m.next) { + // beim Sprechen häufiger + eher zur Kamera (engagiert), sonst lebhaftes Umschauen + const range = spk > 0.5 ? 0.28 : 0.6 + m.tYaw = (Math.random() - 0.5) * range; m.tPitch = (Math.random() - 0.5) * 0.3 + m.t = 0; m.next = (spk > 0.5 ? 1.4 : 1.9) + Math.random() * 2.6 + } + m.yaw += (m.tYaw - m.yaw) * Math.min(1, delta * 1.8) + m.pitch += (m.tPitch - m.pitch) * Math.min(1, delta * 1.8) + // Nachdenk-Blend hoch wenn 'thinking'/'transcribing', sonst runter + const wantThink = (st === "thinking" || st === "transcribing") ? 1 : 0 + think.current += (wantThink - think.current) * Math.min(1, delta * 2.5) + const th = think.current + const attentive = st === "listening" ? 1 : 0 + m.lean += ((Math.min(1, target * 1.6) + attentive * 0.5) - m.lean) * Math.min(1, delta * 3) + // Beim Nachdenken: Blick zur Seite/oben (pensiv, weg von der Kamera) statt zufälligem Umschauen + const tc = state.clock.elapsedTime + // Nachdenken: Blick zur Seite/leicht nach oben (pensiv, weg von der Kamera) + Kopf-Neigung. + // KEINE Arm-Bewegung (risikolos; die Hand-zum-Kinn-Pose liess sich blind nicht sauber treffen). + const yaw = m.yaw + th * (-0.38 + Math.sin(tc * 0.5) * 0.05) + const pitch = m.pitch + th * (-0.12) + applyIdle(vrm, tc, target * (1 - th * 0.5), yaw, pitch, m.lean, spk) + if (th > 0.02) { + // sanftes nachdenkliches Kopf-Neigen (nur Roll dazu, Idle-Kopfbewegung bleibt erhalten) + setBone(vrm, "head", pitch * 0.6 + Math.sin(tc * 0.6) * 0.015, yaw * 0.6 + Math.sin(tc * 0.27) * 0.025, + Math.sin(tc * 0.5) * 0.02 + th * 0.14) + vrm.humanoid?.update() + } + + const em = vrm.expressionManager + if (em) { + // Lippensync v2: echte Vokal-Mundformen (aa/ih/ou) aus der Audio-Analyse statt nur "Mund auf". + // Fallback auf den Gesamtpegel (target) fuer aa, falls keine Mundform-Werte vorliegen. + const lv = audioLevel.current + const visTargets: Record = { + aa: lv?.aa ?? target, ih: lv?.ih ?? 0, ou: lv?.ou ?? 0, + } + for (const v of ["aa", "ih", "ou"]) { + const cv = smooth.current[v] ?? 0 + const nv = cv + (visTargets[v] - cv) * Math.min(1, delta * 14) // schnell genug fuers Sprechen + smooth.current[v] = nv; em.setValue(v, nv) + } + const want = EMO_TO_EXPR[emotion.current] + for (const name of EXPRESSIONS) { + const tv = want === name ? 0.75 : 0 + const cv = smooth.current[name] ?? 0 + const nv = cv + (tv - cv) * Math.min(1, delta * 4) + smooth.current[name] = nv; em.setValue(name, nv) + } + const b = blink.current + b.t += delta + if (b.active <= 0 && b.t > b.next) { b.active = 0.16; b.t = 0; b.next = 3 + Math.random() * 4 } + let blinkVal = 0 + if (b.active > 0) { b.active -= delta; const p = 1 - b.active / 0.16; blinkVal = 1 - Math.abs(p - 0.5) * 2 } + em.setValue("blink", Math.max(0, blinkVal)) + } + vrm.update(delta) + }) + + return vrm ? : null +} + +export function Avatar3D({ url, audioLevel, emotion, status = "idle" }: { + url: string; audioLevel: LevelRef; emotion: EmotionRef; status?: string +}) { + const [err, setErr] = useState(null) + const statusRef = useRef(status); statusRef.current = status + return ( +
+ + + + + + + + {err && ( +
{err}
+ )} +
+ ) +} diff --git a/client/lucy-desktop/src/renderer/src/lib/voice/audio.ts b/client/lucy-desktop/src/renderer/src/lib/voice/audio.ts new file mode 100644 index 0000000..f7a3921 --- /dev/null +++ b/client/lucy-desktop/src/renderer/src/lib/voice/audio.ts @@ -0,0 +1,175 @@ +// Audio-Wiedergabe + Pegelmessung fuers Lippensync (Avatar liest level.current). +// Zwei Wege: enqueue(WAV-Buffer) [z.B. Warmup] und playPcmStream(PCM16-Stream) [die Live-Antwort, +// lueckenlos via Web-Audio-Scheduling, niedrige Time-to-first-audio]. +// +// LIPPENSYNC v2: statt nur einem Pegel ("Mund auf/zu") leiten wir aus dem Frequenz-Spektrum +// echte Vokal-MUNDFORMEN ab (level.aa/ih/ou). Idee: die Helligkeit des Klangs (spektraler +// Schwerpunkt) verraet grob den Vokal — helle Laute (i/e) = breiter Mund, dunkle (o/u) = runder +// Mund, mittig = offenes "a". Das ist nicht phonetisch exakt, sieht aber lebendig+passend aus. +function smoothstep(a: number, b: number, x: number): number { + const t = Math.max(0, Math.min(1, (x - a) / (b - a))) + return t * t * (3 - 2 * t) +} + +export class AudioQueue { + private ctx: AudioContext + private analyser: AnalyserNode + private gain: GainNode + private queue: ArrayBuffer[] = [] + private playing = false + private raf = 0 + private freq: Uint8Array + // aktiver PCM-Stream (fuer Barge-in/clear): geplante Quellen + Abbruchsignal + private streamSources: AudioBufferSourceNode[] = [] + private streamCancelled = false + // current = Gesamt-Pegel (Aura/Bewegung); aa/ih/ou = Mundform-Gewichte fuer den Avatar + readonly level = { current: 0, aa: 0, ih: 0, ou: 0 } + onSpeaking?: (speaking: boolean) => void + + static readVolume(): number { + const raw = localStorage.getItem("lucy_volume") + if (raw === null || raw === "") return 0.8 + const v = Number(raw) + return Number.isNaN(v) ? 0.8 : Math.max(0, Math.min(1.5, v)) + } + + constructor() { + const Ctor = window.AudioContext || (window as any).webkitAudioContext + this.ctx = new Ctor() + this.analyser = this.ctx.createAnalyser() + this.analyser.fftSize = 256 + this.analyser.smoothingTimeConstant = 0.6 + this.gain = this.ctx.createGain() + this.gain.gain.value = AudioQueue.readVolume() + this.analyser.connect(this.gain) + this.gain.connect(this.ctx.destination) + this.freq = new Uint8Array(this.analyser.frequencyBinCount) + window.addEventListener("lucy-volume", (e: Event) => { + const v = Number((e as CustomEvent).detail) + if (!Number.isNaN(v)) this.gain.gain.value = Math.max(0, Math.min(1.5, v)) + }) + } + + async enqueue(buf: ArrayBuffer) { + this.queue.push(buf) + if (!this.playing) await this.playNext() + } + + clear() { + this.queue = [] + // laufenden Stream stoppen (Barge-in) + this.streamCancelled = true + for (const s of this.streamSources) { try { s.stop() } catch { /* */ } } + this.streamSources = [] + } + + // Spielt einen fortlaufenden PCM16-mono-Stream lueckenlos ab: jede Frame-Charge wird auf der + // Audio-Uhr direkt hinter die vorige geplant (kein onended-Gap). LEAD_IN puffert gegen Underruns. + async playPcmStream(stream: ReadableStream, sampleRate: number): Promise { + if (this.ctx.state === "suspended") { try { await this.ctx.resume() } catch { /* */ } } + this.streamCancelled = false + this.streamSources = [] + const reader = stream.getReader() + const LEAD_IN = 0.35 // Startpuffer: mehr Vorlauf -> Generierung bleibt vor der Wiedergabe (weniger Unterläufe/Stocken) + let nextTime = 0, started = false, leftoverByte = -1, lastEnd = 0 + this.onSpeaking?.(true) + this.startMeter() + try { + for (;;) { + const { done, value } = await reader.read() + if (done || this.streamCancelled) break + if (!value || value.length === 0) continue + // ungerades Rest-Byte der vorigen Charge voranstellen, damit Int16-Frames sauber bleiben + let bytes: Uint8Array + if (leftoverByte >= 0) { + bytes = new Uint8Array(value.length + 1) + bytes[0] = leftoverByte + bytes.set(value, 1) + } else { + bytes = value + } + const usable = bytes.length - (bytes.length % 2) + leftoverByte = usable < bytes.length ? bytes[bytes.length - 1] : -1 + if (usable === 0) continue + // in ein eigenes, 2-Byte-ausgerichtetes Buffer kopieren (value.byteOffset evtl. ungerade) + const aligned = new Uint8Array(usable) + aligned.set(bytes.subarray(0, usable)) + const i16 = new Int16Array(aligned.buffer) + const f32 = new Float32Array(i16.length) + for (let i = 0; i < i16.length; i++) f32[i] = i16[i] / 32768 + const audioBuf = this.ctx.createBuffer(1, f32.length, sampleRate) + audioBuf.copyToChannel(f32, 0) + const src = this.ctx.createBufferSource() + src.buffer = audioBuf + src.connect(this.analyser) + if (!started) { nextTime = this.ctx.currentTime + LEAD_IN; started = true } + if (nextTime < this.ctx.currentTime) nextTime = this.ctx.currentTime + 0.02 // Underrun-Schutz + src.start(nextTime) + this.streamSources.push(src) + src.onended = () => { + const i = this.streamSources.indexOf(src) + if (i >= 0) this.streamSources.splice(i, 1) + } + nextTime += audioBuf.duration + lastEnd = nextTime + } + } finally { + try { reader.releaseLock() } catch { /* */ } + } + // bis zum Ende der letzten geplanten Charge warten (sofern nicht abgebrochen) + if (!this.streamCancelled) { + const waitMs = Math.max(0, (lastEnd - this.ctx.currentTime) * 1000) + await new Promise((r) => setTimeout(r, waitMs + 60)) + } + this.onSpeaking?.(false) + this.stopMeter() + } + + private async playNext(): Promise { + const buf = this.queue.shift() + if (!buf) { this.playing = false; this.stopMeter(); this.onSpeaking?.(false); return } + this.playing = true + this.onSpeaking?.(true) + if (this.ctx.state === "suspended") { try { await this.ctx.resume() } catch { /* */ } } + let audioBuf: AudioBuffer + try { audioBuf = await this.ctx.decodeAudioData(buf.slice(0)) } catch { return this.playNext() } + const src = this.ctx.createBufferSource() + src.buffer = audioBuf + src.connect(this.analyser) + src.onended = () => { void this.playNext() } + src.start() + this.startMeter() + } + + private startMeter() { + cancelAnimationFrame(this.raf) + const tick = () => { + this.analyser.getByteFrequencyData(this.freq as any) + const n = Math.min(this.freq.length, 48) + let sum = 0, wsum = 0 + for (let i = 2; i < n; i++) { const m = this.freq[i]; sum += m; wsum += m * i } + const avg = sum / (n - 2) / 255 + const open = Math.min(1, avg * 1.9) + this.level.current = open + // Spektraler Schwerpunkt 0..1 (wo sitzt die Klang-Energie) -> grobe Vokal-Form + const c = sum > 0 ? wsum / sum : 2 + const cN = Math.max(0, Math.min(1, (c - 2) / (n - 2))) + const bright = smoothstep(0.42, 0.72, cN) // hell -> i/e (breiter Mund) + const dark = 1 - smoothstep(0.22, 0.5, cN) // dunkel -> o/u (runder Mund) + const ih = open * bright + const ou = open * dark + const aa = open * (1 - Math.max(bright, dark) * 0.85) // sonst offenes "a" + // leichte Glaettung gegen Flackern + this.level.aa += (aa - this.level.aa) * 0.5 + this.level.ih += (ih - this.level.ih) * 0.5 + this.level.ou += (ou - this.level.ou) * 0.5 + this.raf = requestAnimationFrame(tick) + } + tick() + } + + private stopMeter() { + cancelAnimationFrame(this.raf) + this.level.current = 0; this.level.aa = 0; this.level.ih = 0; this.level.ou = 0 + } +} From ac475ba509cd3d17a66890d78226c4d0e9c9158b Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Tue, 30 Jun 2026 19:01:55 +0200 Subject: [PATCH 02/38] Lucy v2 (Etappe 1.2): echte Bewegungs-Clips (.vrma) + lebendiges Gesicht - @pixiv/three-vrm-animation: VRMA-Clips laden/abspielen (AnimationMixer) - Ruhiger prozeduraler Leerlauf als Basis; echte Thinking-Pose blendet beim Nachdenken ein - (.vrma sind Gesten, kein Ruhe-Loop -> nicht als Dauerschleife; Einmal-Einschuebe folgen) - Blick-Sakkaden gegen eingefrorenes Gesicht - VRMA-Clips: tk256ailab/vrm-viewer (MIT), siehe public/vrma/ATTRIBUTION.md Co-Authored-By: Claude Opus 4.8 --- client/lucy-desktop/package-lock.json | 3790 +++++++++++++++++ client/lucy-desktop/package.json | 35 + .../src/renderer/public/vrma/ATTRIBUTION.md | 11 + .../src/renderer/public/vrma/Blush.vrma | Bin 0 -> 118448 bytes .../src/renderer/public/vrma/Clapping.vrma | Bin 0 -> 118448 bytes .../src/renderer/public/vrma/Goodbye.vrma | Bin 0 -> 118448 bytes .../src/renderer/public/vrma/LookAround.vrma | Bin 0 -> 118448 bytes .../src/renderer/public/vrma/Relax.vrma | Bin 0 -> 118448 bytes .../src/renderer/public/vrma/Sad.vrma | Bin 0 -> 118448 bytes .../src/renderer/public/vrma/Surprised.vrma | Bin 0 -> 118448 bytes .../src/renderer/public/vrma/Thinking.vrma | Bin 0 -> 118448 bytes .../src/renderer/src/components/Avatar3D.tsx | 153 +- 12 files changed, 3936 insertions(+), 53 deletions(-) create mode 100644 client/lucy-desktop/package-lock.json create mode 100644 client/lucy-desktop/package.json create mode 100644 client/lucy-desktop/src/renderer/public/vrma/ATTRIBUTION.md create mode 100644 client/lucy-desktop/src/renderer/public/vrma/Blush.vrma create mode 100644 client/lucy-desktop/src/renderer/public/vrma/Clapping.vrma create mode 100644 client/lucy-desktop/src/renderer/public/vrma/Goodbye.vrma create mode 100644 client/lucy-desktop/src/renderer/public/vrma/LookAround.vrma create mode 100644 client/lucy-desktop/src/renderer/public/vrma/Relax.vrma create mode 100644 client/lucy-desktop/src/renderer/public/vrma/Sad.vrma create mode 100644 client/lucy-desktop/src/renderer/public/vrma/Surprised.vrma create mode 100644 client/lucy-desktop/src/renderer/public/vrma/Thinking.vrma diff --git a/client/lucy-desktop/package-lock.json b/client/lucy-desktop/package-lock.json new file mode 100644 index 0000000..b6a4c1b --- /dev/null +++ b/client/lucy-desktop/package-lock.json @@ -0,0 +1,3790 @@ +{ + "name": "lucy-desktop", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "lucy-desktop", + "version": "0.1.0", + "dependencies": { + "@pixiv/three-vrm": "^3.4.0", + "@pixiv/three-vrm-animation": "^3.5.4", + "@react-three/drei": "^9.114.0", + "@react-three/fiber": "^8.17.10", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "three": "^0.169.0" + }, + "devDependencies": { + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@types/three": "^0.169.0", + "@vitejs/plugin-react": "^4.3.4", + "electron": "^33.2.1", + "electron-vite": "^3.0.0", + "typescript": "^5.6.3", + "vite": "^6.0.3" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz", + "integrity": "sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", + "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", + "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@electron/get": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", + "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mediapipe/tasks-vision": { + "version": "0.10.17", + "resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.17.tgz", + "integrity": "sha512-CZWV/q6TTe8ta61cZXjfnnHsfWIdFhms03M9T7Cnd5y2mdpylJM0rF1qRq+wsQVRMLz1OYPVEBU9ph2Bx8cxrg==", + "license": "Apache-2.0" + }, + "node_modules/@monogrid/gainmap-js": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@monogrid/gainmap-js/-/gainmap-js-3.4.0.tgz", + "integrity": "sha512-2Z0FATFHaoYJ8b+Y4y4Hgfn3FRFwuU5zRrk+9dFWp4uGAdHGqVEdP7HP+gLA3X469KXHmfupJaUbKo1b/aDKIg==", + "license": "MIT", + "dependencies": { + "promise-worker-transferable": "^1.0.4" + }, + "peerDependencies": { + "three": ">= 0.159.0" + } + }, + "node_modules/@pixiv/three-vrm": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@pixiv/three-vrm/-/three-vrm-3.5.4.tgz", + "integrity": "sha512-hY0MnmKVLUebFR9QN9vCRXo0rZmLpxjLVZAupQv5qDDGCKZuNxlOts9PqTkWlzhkMLLdhB48AF+P4PCy/DFOzA==", + "license": "MIT", + "dependencies": { + "@pixiv/three-vrm-core": "3.5.4", + "@pixiv/three-vrm-materials-hdr-emissive-multiplier": "3.5.4", + "@pixiv/three-vrm-materials-mtoon": "3.5.4", + "@pixiv/three-vrm-materials-v0compat": "3.5.4", + "@pixiv/three-vrm-node-constraint": "3.5.4", + "@pixiv/three-vrm-springbone": "3.5.4" + }, + "peerDependencies": { + "three": ">=0.137" + } + }, + "node_modules/@pixiv/three-vrm-animation": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@pixiv/three-vrm-animation/-/three-vrm-animation-3.5.4.tgz", + "integrity": "sha512-yVJL7LoVwZ0fsW2SJhfa0bqIMcfTzBKyc1q/LeKqAtEv63BEQ9VUudx5ikd4zIkgvXwjxw7vGl2zvedrexFisg==", + "license": "MIT", + "dependencies": { + "@pixiv/three-vrm-core": "3.5.4", + "@pixiv/types-vrmc-vrm-1.0": "3.5.4", + "@pixiv/types-vrmc-vrm-animation-1.0": "3.5.4" + }, + "peerDependencies": { + "three": ">=0.137" + } + }, + "node_modules/@pixiv/three-vrm-core": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@pixiv/three-vrm-core/-/three-vrm-core-3.5.4.tgz", + "integrity": "sha512-CgaxZ4qX6JmE2oKsOVGGlheT011qP4bBZGUaMJJ5iQINI999+cveIdISe459B+AMYD1dU5h1+xCtDthLQNH1Bg==", + "license": "MIT", + "dependencies": { + "@pixiv/types-vrm-0.0": "3.5.4", + "@pixiv/types-vrmc-vrm-1.0": "3.5.4" + }, + "peerDependencies": { + "three": ">=0.137" + } + }, + "node_modules/@pixiv/three-vrm-materials-hdr-emissive-multiplier": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@pixiv/three-vrm-materials-hdr-emissive-multiplier/-/three-vrm-materials-hdr-emissive-multiplier-3.5.4.tgz", + "integrity": "sha512-3BPZ42qW38cHhP+imqEnqTFsltvYkHA/t4VzWFdQ9sngWt0NiFAOotEsv8gZn1ZgKE9VRQezXne6s5aRWQlQqA==", + "license": "MIT", + "dependencies": { + "@pixiv/types-vrmc-materials-hdr-emissive-multiplier-1.0": "3.5.4" + }, + "peerDependencies": { + "three": ">=0.137" + } + }, + "node_modules/@pixiv/three-vrm-materials-mtoon": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@pixiv/three-vrm-materials-mtoon/-/three-vrm-materials-mtoon-3.5.4.tgz", + "integrity": "sha512-vLHt7IYZxlijbCMa5TRRf6gaQjA65F/d7oZBNfZW3XC8sBg57ZV0M/xBAJm2d6UwVmTbBd9NG9li/Y9yuupDQw==", + "license": "MIT", + "dependencies": { + "@pixiv/types-vrm-0.0": "3.5.4", + "@pixiv/types-vrmc-materials-mtoon-1.0": "3.5.4" + }, + "peerDependencies": { + "three": ">=0.137" + } + }, + "node_modules/@pixiv/three-vrm-materials-v0compat": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@pixiv/three-vrm-materials-v0compat/-/three-vrm-materials-v0compat-3.5.4.tgz", + "integrity": "sha512-qRRtg8vYFBRJpsa3evruWqmXr0Gwd8uJXwxxUKuKtrIN0Hw0hJsRLHkg9E238Q8xRTnoycdkSgX4VvVknvtXBA==", + "license": "MIT", + "dependencies": { + "@pixiv/types-vrm-0.0": "3.5.4", + "@pixiv/types-vrmc-materials-mtoon-1.0": "3.5.4" + }, + "peerDependencies": { + "three": ">=0.137" + } + }, + "node_modules/@pixiv/three-vrm-node-constraint": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@pixiv/three-vrm-node-constraint/-/three-vrm-node-constraint-3.5.4.tgz", + "integrity": "sha512-nyAghDrYNp0Z2siEaY2+th+FzZdDs9EJy8K576Mpw9cy3jwtCJuTHBQmGzKkrgoLaBfrso+3Tdfgr62AJV0m1w==", + "license": "MIT", + "dependencies": { + "@pixiv/types-vrmc-node-constraint-1.0": "3.5.4" + }, + "peerDependencies": { + "three": ">=0.137" + } + }, + "node_modules/@pixiv/three-vrm-springbone": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@pixiv/three-vrm-springbone/-/three-vrm-springbone-3.5.4.tgz", + "integrity": "sha512-8KWA7vHU+OnW6XcZPnDuUrjjPFRzmv2yxcTMNCYQvBS547/Iqo0RLbQvpO/ppceLTNJFY2TGXAWJU67aeazWjw==", + "license": "MIT", + "dependencies": { + "@pixiv/types-vrm-0.0": "3.5.4", + "@pixiv/types-vrmc-springbone-1.0": "3.5.4", + "@pixiv/types-vrmc-springbone-extended-collider-1.0": "3.5.4" + }, + "peerDependencies": { + "three": ">=0.137" + } + }, + "node_modules/@pixiv/types-vrm-0.0": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@pixiv/types-vrm-0.0/-/types-vrm-0.0-3.5.4.tgz", + "integrity": "sha512-g9VMPikJxKJ/XgnhXxnqj6ejVhQ9WwOEUp7KyyZHsqRnHcQfSqyZFTs9wkAMCbwCqHXX/lg9+9Ogj8KhxCkbXw==", + "license": "MIT" + }, + "node_modules/@pixiv/types-vrmc-materials-hdr-emissive-multiplier-1.0": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@pixiv/types-vrmc-materials-hdr-emissive-multiplier-1.0/-/types-vrmc-materials-hdr-emissive-multiplier-1.0-3.5.4.tgz", + "integrity": "sha512-h9GEQ3q1VTylL/P40kJ8uoQhfUYY54NhTG6Xsnl4X0jf7oHh8MKXYnMMn903hXml6082Yjx1C6x3DKckdnophg==", + "license": "MIT" + }, + "node_modules/@pixiv/types-vrmc-materials-mtoon-1.0": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@pixiv/types-vrmc-materials-mtoon-1.0/-/types-vrmc-materials-mtoon-1.0-3.5.4.tgz", + "integrity": "sha512-AU5sOcsbmcnzRPfgfk7fzKhk5lNm2MqrbvtAsSlhylVMdlzrmXqIfRuexABcB9k+ysTp49qIFioot9KRlQcDUw==", + "license": "MIT" + }, + "node_modules/@pixiv/types-vrmc-node-constraint-1.0": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@pixiv/types-vrmc-node-constraint-1.0/-/types-vrmc-node-constraint-1.0-3.5.4.tgz", + "integrity": "sha512-RRbK5NNvZv4ewRELezueCiDB11FGkt4pdZR/UJ027DJPaNzd6rls2OEJ8weQ3OmgHZpbx/BtdpX2JWX5WZZd/Q==", + "license": "MIT" + }, + "node_modules/@pixiv/types-vrmc-springbone-1.0": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@pixiv/types-vrmc-springbone-1.0/-/types-vrmc-springbone-1.0-3.5.4.tgz", + "integrity": "sha512-NO7HTRBuWEe89Wo9BRI5hX1kWVkZzA4YWg9XALSTLdIT8HMiArL4NRse/CF91jNuLcTGfPEWlBJyq9SciAQxAg==", + "license": "MIT" + }, + "node_modules/@pixiv/types-vrmc-springbone-extended-collider-1.0": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@pixiv/types-vrmc-springbone-extended-collider-1.0/-/types-vrmc-springbone-extended-collider-1.0-3.5.4.tgz", + "integrity": "sha512-uzJmcRh/iHYnZPtnq6N1+jb+T/ptYNCyFEoArkWGNXHSfPjTkMcheTQkL5iMNvTE6hqhyMRVMha9OmbvyLmmUQ==", + "license": "MIT" + }, + "node_modules/@pixiv/types-vrmc-vrm-1.0": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@pixiv/types-vrmc-vrm-1.0/-/types-vrmc-vrm-1.0-3.5.4.tgz", + "integrity": "sha512-pkjT4QXT/Hp6rcq8J8EFEHIldbtPGYWOTaWdoRGMA8/KzJI5PdekZ6AUYbnSP6ElfJ3BSZ01DxxpQZa/UNsFqA==", + "license": "MIT" + }, + "node_modules/@pixiv/types-vrmc-vrm-animation-1.0": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@pixiv/types-vrmc-vrm-animation-1.0/-/types-vrmc-vrm-animation-1.0-3.5.4.tgz", + "integrity": "sha512-qIl/RO+WnWcBlu/PdTpPtm+YRum8RNtNNigndd/V9dJ9mWeFVI6TThc5i+qbFQjTF/I5ka0HojfeujesIYc1IA==", + "license": "MIT", + "dependencies": { + "@pixiv/types-vrmc-vrm-1.0": "3.5.4" + } + }, + "node_modules/@react-spring/animated": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.5.tgz", + "integrity": "sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==", + "license": "MIT", + "dependencies": { + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/core": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.5.tgz", + "integrity": "sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==", + "license": "MIT", + "dependencies": { + "@react-spring/animated": "~9.7.5", + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-spring/donate" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/rafz": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.5.tgz", + "integrity": "sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==", + "license": "MIT" + }, + "node_modules/@react-spring/shared": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.5.tgz", + "integrity": "sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==", + "license": "MIT", + "dependencies": { + "@react-spring/rafz": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/three": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/three/-/three-9.7.5.tgz", + "integrity": "sha512-RxIsCoQfUqOS3POmhVHa1wdWS0wyHAUway73uRLp3GAL5U2iYVNdnzQsep6M2NZ994BlW8TcKuMtQHUqOsy6WA==", + "license": "MIT", + "dependencies": { + "@react-spring/animated": "~9.7.5", + "@react-spring/core": "~9.7.5", + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "@react-three/fiber": ">=6.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "three": ">=0.126" + } + }, + "node_modules/@react-spring/types": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.5.tgz", + "integrity": "sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==", + "license": "MIT" + }, + "node_modules/@react-three/drei": { + "version": "9.122.0", + "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-9.122.0.tgz", + "integrity": "sha512-SEO/F/rBCTjlLez7WAlpys+iGe9hty4rNgjZvgkQeXFSiwqD4Hbk/wNHMAbdd8vprO2Aj81mihv4dF5bC7D0CA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@mediapipe/tasks-vision": "0.10.17", + "@monogrid/gainmap-js": "^3.0.6", + "@react-spring/three": "~9.7.5", + "@use-gesture/react": "^10.3.1", + "camera-controls": "^2.9.0", + "cross-env": "^7.0.3", + "detect-gpu": "^5.0.56", + "glsl-noise": "^0.0.0", + "hls.js": "^1.5.17", + "maath": "^0.10.8", + "meshline": "^3.3.1", + "react-composer": "^5.0.3", + "stats-gl": "^2.2.8", + "stats.js": "^0.17.0", + "suspend-react": "^0.1.3", + "three-mesh-bvh": "^0.7.8", + "three-stdlib": "^2.35.6", + "troika-three-text": "^0.52.0", + "tunnel-rat": "^0.1.2", + "utility-types": "^3.11.0", + "zustand": "^5.0.1" + }, + "peerDependencies": { + "@react-three/fiber": "^8", + "react": "^18", + "react-dom": "^18", + "three": ">=0.137" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/@react-three/fiber": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.18.0.tgz", + "integrity": "sha512-FYZZqD0UUHUswKz3LQl2Z7H24AhD14XGTsIRw3SJaXUxyfVMi+1yiZGmqTcPt/CkPpdU7rrxqcyQ1zJE5DjvIQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@types/react-reconciler": "^0.26.7", + "@types/webxr": "*", + "base64-js": "^1.5.1", + "buffer": "^6.0.3", + "its-fine": "^1.0.6", + "react-reconciler": "^0.27.0", + "react-use-measure": "^2.1.7", + "scheduler": "^0.21.0", + "suspend-react": "^0.1.3", + "zustand": "^3.7.1" + }, + "peerDependencies": { + "expo": ">=43.0", + "expo-asset": ">=8.4", + "expo-file-system": ">=11.0", + "expo-gl": ">=11.0", + "react": ">=18 <19", + "react-dom": ">=18 <19", + "react-native": ">=0.64", + "three": ">=0.133" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + }, + "expo-asset": { + "optional": true + }, + "expo-file-system": { + "optional": true + }, + "expo-gl": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/@react-three/fiber/node_modules/zustand": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", + "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", + "license": "MIT", + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", + "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz", + "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz", + "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz", + "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", + "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", + "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", + "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", + "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", + "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", + "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", + "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", + "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", + "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", + "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", + "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", + "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", + "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", + "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", + "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", + "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", + "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", + "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", + "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", + "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", + "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tweenjs/tween.js": { + "version": "23.1.3", + "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", + "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==", + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/draco3d": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.10.tgz", + "integrity": "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==", + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "20.19.43", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz", + "integrity": "sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/offscreencanvas": { + "version": "2019.7.3", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", + "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.31", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.31.tgz", + "integrity": "sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/react-reconciler": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.26.7.tgz", + "integrity": "sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stats.js": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.4.tgz", + "integrity": "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==", + "license": "MIT" + }, + "node_modules/@types/three": { + "version": "0.169.0", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.169.0.tgz", + "integrity": "sha512-oan7qCgJBt03wIaK+4xPWclYRPG9wzcg7Z2f5T8xYTNEF95kh0t0lklxLLYBDo7gQiGLYzE6iF4ta7nXF2bcsw==", + "license": "MIT", + "dependencies": { + "@tweenjs/tween.js": "~23.1.3", + "@types/stats.js": "*", + "@types/webxr": "*", + "@webgpu/types": "*", + "fflate": "~0.8.2", + "meshoptimizer": "~0.18.1" + } + }, + "node_modules/@types/webxr": { + "version": "0.5.24", + "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.24.tgz", + "integrity": "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==", + "license": "MIT" + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@use-gesture/core": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz", + "integrity": "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==", + "license": "MIT" + }, + "node_modules/@use-gesture/react": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.1.tgz", + "integrity": "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==", + "license": "MIT", + "dependencies": { + "@use-gesture/core": "10.3.1" + }, + "peerDependencies": { + "react": ">= 16.8.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@webgpu/types": { + "version": "0.1.71", + "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.71.tgz", + "integrity": "sha512-mMy8/ODcKhab808co15eW+yN+HgXoQxRQHTiBV9Mrvl1r0ufnid7YOcI+gi4eUWSWl9ezD6TW2KXccrL8HCh2A==", + "license": "BSD-3-Clause" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.40", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.40.tgz", + "integrity": "sha512-BSSLZ9/Cjjv7Gtj5B68ZzXcXUg8iOf3fme+FCuh8rC/Go+Kmh8cox7M3A8dolou16s64QjLPOSdngh7GxXvkSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/browserslist": { + "version": "4.28.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.4.tgz", + "integrity": "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.38", + "caniuse-lite": "^1.0.30001799", + "electron-to-chromium": "^1.5.376", + "node-releases": "^2.0.48", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/camera-controls": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-2.10.1.tgz", + "integrity": "sha512-KnaKdcvkBJ1Irbrzl8XD6WtZltkRjp869Jx8c0ujs9K+9WD+1D7ryBsCiVqJYUqt6i/HR5FxT7RLASieUD+Q5w==", + "license": "MIT", + "peerDependencies": { + "three": ">=0.126.1" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001799", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", + "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detect-gpu": { + "version": "5.0.70", + "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.70.tgz", + "integrity": "sha512-bqerEP1Ese6nt3rFkwPnGbsUF9a4q+gMmpTVVOEzoCyeCc+y7/RvJnQZJx1JwhgQI5Ntg0Kgat8Uu7XpBqnz1w==", + "license": "MIT", + "dependencies": { + "webgl-constants": "^1.1.1" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/draco3d": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz", + "integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==", + "license": "Apache-2.0" + }, + "node_modules/electron": { + "version": "33.4.11", + "resolved": "https://registry.npmjs.org/electron/-/electron-33.4.11.tgz", + "integrity": "sha512-xmdAs5QWRkInC7TpXGNvzo/7exojubk+72jn1oJL7keNeIlw7xNglf8TGtJtkR4rWC5FJq0oXiIXPS9BcK2Irg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@electron/get": "^2.0.0", + "@types/node": "^20.9.0", + "extract-zip": "^2.0.1" + }, + "bin": { + "electron": "cli.js" + }, + "engines": { + "node": ">= 12.20.55" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.380", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.380.tgz", + "integrity": "sha512-W6d5AbuEoRayO447cqrg6lKJIlscgRnnxOZl/08kfV71BQDoEBC7Wwis68z87LjyK6f4kWyTaubuDbhHKrZkbA==", + "dev": true, + "license": "ISC" + }, + "node_modules/electron-vite": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/electron-vite/-/electron-vite-3.1.0.tgz", + "integrity": "sha512-M7aAzaRvSl5VO+6KN4neJCYLHLpF/iWo5ztchI/+wMxIieDZQqpbCYfaEHHHPH6eupEzfvZdLYdPdmvGqoVe0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.26.10", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "cac": "^6.7.14", + "esbuild": "^0.25.1", + "magic-string": "^0.30.17", + "picocolors": "^1.1.1" + }, + "bin": { + "electron-vite": "bin/electron-vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@swc/core": "^1.0.0", + "vite": "^4.0.0 || ^5.0.0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + } + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fflate": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.3.tgz", + "integrity": "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==", + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/global-agent/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glsl-noise": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/glsl-noise/-/glsl-noise-0.0.0.tgz", + "integrity": "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==", + "license": "MIT" + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hls.js": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.6.16.tgz", + "integrity": "sha512-VSIRpLfRwlAAdGL4wiTucx2ScRipo0ed1FBatWkyt832jC4CReKstga6yIhYVwGu9LOBjuX9wzmRMeQdBJtzEA==", + "license": "Apache-2.0" + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/its-fine": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.2.5.tgz", + "integrity": "sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==", + "license": "MIT", + "dependencies": { + "@types/react-reconciler": "^0.28.0" + }, + "peerDependencies": { + "react": ">=18.0" + } + }, + "node_modules/its-fine/node_modules/@types/react-reconciler": { + "version": "0.28.9", + "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.9.tgz", + "integrity": "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/maath": { + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/maath/-/maath-0.10.8.tgz", + "integrity": "sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g==", + "license": "MIT", + "peerDependencies": { + "@types/three": ">=0.134.0", + "three": ">=0.134.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meshline": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/meshline/-/meshline-3.3.1.tgz", + "integrity": "sha512-/TQj+JdZkeSUOl5Mk2J7eLcYTLiQm2IDzmlSvYm7ov15anEcDJ92GHqqazxTSreeNgfnYu24kiEvvv0WlbCdFQ==", + "license": "MIT", + "peerDependencies": { + "three": ">=0.137" + } + }, + "node_modules/meshoptimizer": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.18.1.tgz", + "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==", + "license": "MIT" + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.15", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", + "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.50", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.50.tgz", + "integrity": "sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/potpack": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", + "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==", + "license": "ISC" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-worker-transferable": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/promise-worker-transferable/-/promise-worker-transferable-1.0.4.tgz", + "integrity": "sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==", + "license": "Apache-2.0", + "dependencies": { + "is-promise": "^2.1.0", + "lie": "^3.0.2" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-composer": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/react-composer/-/react-composer-5.0.3.tgz", + "integrity": "sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA==", + "license": "MIT", + "dependencies": { + "prop-types": "^15.6.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-dom/node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-reconciler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.27.0.tgz", + "integrity": "sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.21.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-use-measure": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.7.tgz", + "integrity": "sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.13", + "react-dom": ">=16.13" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/rollup": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", + "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.62.2", + "@rollup/rollup-android-arm64": "4.62.2", + "@rollup/rollup-darwin-arm64": "4.62.2", + "@rollup/rollup-darwin-x64": "4.62.2", + "@rollup/rollup-freebsd-arm64": "4.62.2", + "@rollup/rollup-freebsd-x64": "4.62.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", + "@rollup/rollup-linux-arm-musleabihf": "4.62.2", + "@rollup/rollup-linux-arm64-gnu": "4.62.2", + "@rollup/rollup-linux-arm64-musl": "4.62.2", + "@rollup/rollup-linux-loong64-gnu": "4.62.2", + "@rollup/rollup-linux-loong64-musl": "4.62.2", + "@rollup/rollup-linux-ppc64-gnu": "4.62.2", + "@rollup/rollup-linux-ppc64-musl": "4.62.2", + "@rollup/rollup-linux-riscv64-gnu": "4.62.2", + "@rollup/rollup-linux-riscv64-musl": "4.62.2", + "@rollup/rollup-linux-s390x-gnu": "4.62.2", + "@rollup/rollup-linux-x64-gnu": "4.62.2", + "@rollup/rollup-linux-x64-musl": "4.62.2", + "@rollup/rollup-openbsd-x64": "4.62.2", + "@rollup/rollup-openharmony-arm64": "4.62.2", + "@rollup/rollup-win32-arm64-msvc": "4.62.2", + "@rollup/rollup-win32-ia32-msvc": "4.62.2", + "@rollup/rollup-win32-x64-gnu": "4.62.2", + "@rollup/rollup-win32-x64-msvc": "4.62.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", + "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/stats-gl": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/stats-gl/-/stats-gl-2.4.2.tgz", + "integrity": "sha512-g5O9B0hm9CvnM36+v7SFl39T7hmAlv541tU81ME8YeSb3i1CIP5/QdDeSB3A0la0bKNHpxpwxOVRo2wFTYEosQ==", + "license": "MIT", + "dependencies": { + "@types/three": "*", + "three": "^0.170.0" + }, + "peerDependencies": { + "@types/three": "*", + "three": "*" + } + }, + "node_modules/stats-gl/node_modules/three": { + "version": "0.170.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.170.0.tgz", + "integrity": "sha512-FQK+LEpYc0fBD+J8g6oSEyyNzjp+Q7Ks1C568WWaoMRLW+TkNNWmenWeGgJjV105Gd+p/2ql1ZcjYvNiPZBhuQ==", + "license": "MIT" + }, + "node_modules/stats.js": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz", + "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==", + "license": "MIT" + }, + "node_modules/sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/suspend-react": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.1.3.tgz", + "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==", + "license": "MIT", + "peerDependencies": { + "react": ">=17.0" + } + }, + "node_modules/three": { + "version": "0.169.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.169.0.tgz", + "integrity": "sha512-Ed906MA3dR4TS5riErd4QBsRGPcx+HBDX2O5yYE5GqJeFQTPU+M56Va/f/Oph9X7uZo3W3o4l2ZhBZ6f6qUv0w==", + "license": "MIT" + }, + "node_modules/three-mesh-bvh": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.7.8.tgz", + "integrity": "sha512-BGEZTOIC14U0XIRw3tO4jY7IjP7n7v24nv9JXS1CyeVRWOCkcOMhRnmENUjuV39gktAw4Ofhr0OvIAiTspQrrw==", + "deprecated": "Deprecated due to three.js version incompatibility. Please use v0.8.0, instead.", + "license": "MIT", + "peerDependencies": { + "three": ">= 0.151.0" + } + }, + "node_modules/three-stdlib": { + "version": "2.36.1", + "resolved": "https://registry.npmjs.org/three-stdlib/-/three-stdlib-2.36.1.tgz", + "integrity": "sha512-XyGQrFmNQ5O/IoKm556ftwKsBg11TIb301MB5dWNicziQBEs2g3gtOYIf7pFiLa0zI2gUwhtCjv9fmjnxKZ1Cg==", + "license": "MIT", + "dependencies": { + "@types/draco3d": "^1.4.0", + "@types/offscreencanvas": "^2019.6.4", + "@types/webxr": "^0.5.2", + "draco3d": "^1.4.1", + "fflate": "^0.6.9", + "potpack": "^1.0.1" + }, + "peerDependencies": { + "three": ">=0.128.0" + } + }, + "node_modules/three-stdlib/node_modules/fflate": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz", + "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/troika-three-text": { + "version": "0.52.4", + "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.52.4.tgz", + "integrity": "sha512-V50EwcYGruV5rUZ9F4aNsrytGdKcXKALjEtQXIOBfhVoZU9VAqZNIoGQ3TMiooVqFAbR1w15T+f+8gkzoFzawg==", + "license": "MIT", + "dependencies": { + "bidi-js": "^1.0.2", + "troika-three-utils": "^0.52.4", + "troika-worker-utils": "^0.52.0", + "webgl-sdf-generator": "1.1.1" + }, + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/troika-three-utils": { + "version": "0.52.4", + "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.52.4.tgz", + "integrity": "sha512-NORAStSVa/BDiG52Mfudk4j1FG4jC4ILutB3foPnfGbOeIs9+G5vZLa0pnmnaftZUGm4UwSoqEpWdqvC7zms3A==", + "license": "MIT", + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/troika-worker-utils": { + "version": "0.52.0", + "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.52.0.tgz", + "integrity": "sha512-W1CpvTHykaPH5brv5VHLfQo9D1OYuo0cSBEUQFFT/nBUzM8iD6Lq2/tgG/f1OelbAS1WtaTPQzE5uM49egnngw==", + "license": "MIT" + }, + "node_modules/tunnel-rat": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/tunnel-rat/-/tunnel-rat-0.1.2.tgz", + "integrity": "sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==", + "license": "MIT", + "dependencies": { + "zustand": "^4.3.2" + } + }, + "node_modules/tunnel-rat/node_modules/zustand": { + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.7.tgz", + "integrity": "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==", + "license": "MIT", + "dependencies": { + "use-sync-external-store": "^1.2.2" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0.6", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + }, + "node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/vite": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", + "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/webgl-constants": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/webgl-constants/-/webgl-constants-1.1.1.tgz", + "integrity": "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==" + }, + "node_modules/webgl-sdf-generator": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/webgl-sdf-generator/-/webgl-sdf-generator-1.1.1.tgz", + "integrity": "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==", + "license": "MIT" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/zustand": { + "version": "5.0.14", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.14.tgz", + "integrity": "sha512-/8tAspM5LMPr28b3fwLYrtdj77ECpfZviaP75CMTnwO8ISyaE4GDIG/9rDDYq/cH9D2Xw2A2RXglLInmVBQB/g==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } + } + } +} diff --git a/client/lucy-desktop/package.json b/client/lucy-desktop/package.json new file mode 100644 index 0000000..b366cf4 --- /dev/null +++ b/client/lucy-desktop/package.json @@ -0,0 +1,35 @@ +{ + "name": "lucy-desktop", + "version": "0.1.0", + "description": "Lucy — lokaler Sprach-Companion (Hermes-Hirn auf der Box, lokale Stimme auf der 9070 XT)", + "main": "out/main/index.js", + "type": "module", + "scripts": { + "dev": "electron-vite dev", + "build": "electron-vite build", + "preview": "electron-vite preview" + }, + "dependencies": { + "@pixiv/three-vrm": "^3.4.0", + "@pixiv/three-vrm-animation": "^3.5.4", + "@react-three/drei": "^9.114.0", + "@react-three/fiber": "^8.17.10", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "three": "^0.169.0" + }, + "devDependencies": { + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@types/three": "^0.169.0", + "@vitejs/plugin-react": "^4.3.4", + "electron": "^33.2.1", + "electron-vite": "^3.0.0", + "typescript": "^5.6.3", + "vite": "^6.0.3" + }, + "allowScripts": { + "electron": true, + "esbuild": true + } +} diff --git a/client/lucy-desktop/src/renderer/public/vrma/ATTRIBUTION.md b/client/lucy-desktop/src/renderer/public/vrma/ATTRIBUTION.md new file mode 100644 index 0000000..030b322 --- /dev/null +++ b/client/lucy-desktop/src/renderer/public/vrma/ATTRIBUTION.md @@ -0,0 +1,11 @@ +# VRMA-Animationen — Quelle & Lizenz + +Die `.vrma`-Bewegungs-Clips in diesem Ordner stammen aus: + +**tk256ailab/vrm-viewer** — https://github.com/tk256ailab/vrm-viewer +Lizenz: **MIT** · Copyright (c) 2025 TK256 + +Die MIT-Lizenz erlaubt Nutzung, Modifikation und Weitergabe; der Copyright- +Hinweis ist beizubehalten (= diese Datei). + +Genutzte Clips: Relax, Thinking, LookAround, Surprised, Sad, Clapping, Goodbye, Blush. diff --git a/client/lucy-desktop/src/renderer/public/vrma/Blush.vrma b/client/lucy-desktop/src/renderer/public/vrma/Blush.vrma new file mode 100644 index 0000000000000000000000000000000000000000..22d57326d81bcbb33fd25eab7ed609d37b8a98da GIT binary patch literal 118448 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 NK&g@84TBg@{C_?>Uh@C| literal 0 HcmV?d00001 diff --git a/client/lucy-desktop/src/renderer/public/vrma/Clapping.vrma b/client/lucy-desktop/src/renderer/public/vrma/Clapping.vrma new file mode 100644 index 0000000000000000000000000000000000000000..58784e89d398323165f4a36dbbb4ebc3fb8046b0 GIT binary patch literal 118448 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¨Ccux|EtN5;%ec5;8oCPYb^U~YeYMye-yTK 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

|_5q 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 DbYGd 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≷~__n=cpe!Vba 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 z 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 literal 0 HcmV?d00001 diff --git a/client/lucy-desktop/src/renderer/public/vrma/Relax.vrma b/client/lucy-desktop/src/renderer/public/vrma/Relax.vrma new file mode 100644 index 0000000000000000000000000000000000000000..8ab2fa1b8580f71930768c0d27d368f1a911f280 GIT binary patch literal 118448 zcmcG$cR0NmhEEt0F68 z?-dz|tjuKmt~;;y>*b|h==c5PuddE{T<4r?pX+(z8!fi(LQQwy$AL0 zH$_kG;o%h$5*Qq!XEkh!o_mItO+$;S`X$GzJf)C zuYf*O!BUd^pSpFKije$Ydv$4DODf*2B^B@2l8Se1NyU4%q~cv$Qt`emsd(pBWylKl zZfV7Px3uEDTUznnEvHRV7|U8*RmVx3uEDTUznnEvtC%mQ}oW%PQWx zWfkw;vWoX^S;c#|tm3^}R`K2~t9b90RlIkbRJ?baRJ?baRJ?baRJ?baRJ?baRJ?ba zRJ?baRJ?baRJ?baRJ?baR=jtcR=jtcR)BX8@2n>e@Ea=+^$QI6-i7q=l?McP`F|%u z`kfHKmA5|}M3U(Sju>*-R4U&iY>RIW92Fn9N{7ZP~MX0)rf5T8H{|yTc z3@rem?b)SofvS--~Mgr7009@Vcwsu`tFzg3Z{F;xonTY;;3O{Gx36`!ho^fO9T`Tpiy zWmtr&OY|F588)FRfq#Q4!zxtmqTis(unSc!{2NpmmZ9n!{RUNrZK#UkU!zn#ke?<0 z+YPF^8b5<@&%arzEX(+ff!L)CBjHA;1VE+viM+LP)^TnhDD+g15`Db#OmL*=!lP`|Ye zmH(AO{nj>Ap7b+HC86KQungN!N$5AIGHgS2_xug24BJp$Cx3$~!!}em#9yOSx35yt z_^k|87pk98Do(#ys|?#varzCa4BJrMwtj;u!!}eGsNbN1S$Q=rE3c+y<<+!Fc{OcPUQL^nSJNit)wD@@HEmK}O`DWg(GfLE|QG!R>zdV>S}dN?@Q8%m8#B}T?r?~V5g z4#EB?4oQ)Yz;E&;FE#&qwTaI(9lQd3RGm;uOJj`M$oHS8oPSL!0sQ@}^MCVA%(2w| z*9U%8f$|+(YO=)S=MU*77A1oEulbh7cxm{NyTtN)Ui@Q#%;I|z`eT5p`S*zb#{hG) z@8R{20hXrUW7!`ABodSFk>k%1GTC=O{d0t=^t)I5Il^3mHuwu=m!Ujk(-PnQ<29tl zmS*KM5UJF{tRzDH`5I`#CGp_T5oTuQAmgS6a77~kcMmP(Zc{w8-DzKap z&cfWRoDt5#(zKir&QfAh&Io5Ila({VVYn)1gtNpTYOJa*y(Wfw1*j@gEH0<$IS=gH zb>#Tqu_OQfkgxi!Z`fFQK%gJ~Ezn;-+u^$PjnGrp=RrswM=FPZuM%f9L) zdcJ-^CDZ@<*pI*Q_wo+44-EVPi`So$-}aOT{0PUCRr2dz0iIqHyZMEL%KiU&HlS*p z{4?51)ngs&<>@C6#U};-ds?9C#{4s9Kycthe4_9p57nMk+i~y<4fXf>c?s1O|A*nS z*HASMewb9oB6w~2J|S>|SFmmH*njq?>Z$!RsM?h! zNGG%}_n((mwdwvD?dugP_mBq%{irxqtMH#0rI%K92EUI7emBiCY3(1 zstxjeLfN*gx(oj}{vXTy#HI8)s_gw2pHk+m>OcK3_Ae=_Y@tLpWgE1rjQDZ?72D&N6BDE095 z^Y;w)!p6lgNoUi}mcwySJ{BQ*JypRSzmWa#aLa0#ac5&AOJj*8{xj`tJY01r_<@7; zAG8BT-oLk0ii?r4nWcrX%v{ph(AWseEi*H`f|uqe`!_!al~t;aSc;#Djm*N_+|oj3 zW?7n#$-nuOB&f1^n46hk0dG>WEs3SM)Y8~OW>Rv@zoeo%my=36W#WxZC8lN;_(|2+ zNFtG8sUwk?{wyT3e>O8v6=(iaN-EL(k(kVX;`pC(GBGkSH

8kh&WhTl_|77C&+Q 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 literal 0 HcmV?d00001 diff --git a/client/lucy-desktop/src/renderer/public/vrma/Sad.vrma b/client/lucy-desktop/src/renderer/public/vrma/Sad.vrma new file mode 100644 index 0000000000000000000000000000000000000000..32c9197b27e6ddbd40dc904eba0b9c63e564f06d GIT binary patch literal 118448 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 literal 0 HcmV?d00001 diff --git a/client/lucy-desktop/src/renderer/public/vrma/Surprised.vrma b/client/lucy-desktop/src/renderer/public/vrma/Surprised.vrma new file mode 100644 index 0000000000000000000000000000000000000000..23b8904e7165ac62f100186324c50ceccf41aca6 GIT binary patch literal 118448 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
+
+
+ + Lucy + {!overlay && {error || STATUS_LABEL[status]}} +
+
+ + + + + +
+
+ +
+
+
+
+ + + {speaking && lastAssistant &&
{lastAssistant}
} + {!ready && ( +
+ +
Lucy waermt auf …
+ {!overlay &&
Die lokale Stimme wird vorbereitet — einen Moment, Commander.
} +
+ )} + {overlay && ( +
+ {busy && } + {error || STATUS_LABEL[status]} +
+ )} +
+
+ {!overlay && ( +
+ {busy && } + {error || STATUS_LABEL[status]} +
+ )} + {micBtn} + {ready && ( +
+ + +
+ )} + {!overlay && ( +
+ {inputMode === "vad" + ? <>Freisprechen aktiv{vadListening ? : null} · Leertaste geht auch · Hotkey global + : <>Halten zum Sprechen · Leertaste · Hotkey global} +
+ )} +
+
+ + {!overlay && ( +
+
+ Gespräch + +
+
+ {messages.length === 0 && ( +

Halte den Knopf (oder die Leertaste) und sprich. Lucy hört zu, denkt mit + Hermes' vollem Gedächtnis und antwortet in ihrer lokalen Stimme.

+ )} + {messages.map((m, i) => ( +
+ {m.role === "user" ? "Du" : "Lucy"} +
+ {m.text + ? (m.role === "assistant" ? : m.text) + : } + {m.role === "assistant" && m.text && ( + + )} +
+
+ ))} +
+
+
+ )} +
+
+ ) +} diff --git a/client/lucy-desktop/src/renderer/src/components/ChatMarkdown.tsx b/client/lucy-desktop/src/renderer/src/components/ChatMarkdown.tsx new file mode 100644 index 0000000..ce4f52b --- /dev/null +++ b/client/lucy-desktop/src/renderer/src/components/ChatMarkdown.tsx @@ -0,0 +1,60 @@ +import { useState, type ReactNode } from "react" +import ReactMarkdown from "react-markdown" +import remarkGfm from "remark-gfm" + +// Chat-Markdown fuer Lucys Antworten: Code-Bloecke mit Kopier-Knopf, Links oeffnen im System-Browser, +// gaengige Formatierung (fett/listen/inline-code). Die STIMME liest davon nichts vor — cleanForTTS +// filtert Code/Links vorm Sprechen; hier geht es rein um die lesbare/kopierbare Anzeige. + +function CopyBtn({ text, label = "Kopieren" }: { text: string; label?: string }) { + const [done, setDone] = useState(false) + return ( + + ) +} + +function nodeText(children: ReactNode): string { + if (children == null) return "" + if (typeof children === "string" || typeof children === "number") return String(children) + if (Array.isArray(children)) return children.map(nodeText).join("") + // @ts-expect-error – React-Element-Kinder + if (children?.props?.children) return nodeText(children.props.children) + return "" +} + +export function ChatMarkdown({ text }: { text: string }) { + return ( +
+ ( + { e.preventDefault(); if (href) void window.lucy?.openExternal(href) }}> + {children} + + ), + // pre durchreichen -> der Code-Block baut seinen eigenen Container (kein
in
)
+          pre: ({ children }) => <>{children},
+          code: ({ className, children, ...props }) => {
+            const raw = nodeText(children).replace(/\n$/, "")
+            const isBlock = /language-/.test(className || "") || raw.includes("\n")
+            if (!isBlock) return {children}
+            const lang = (className || "").replace(/language-/, "") || "code"
+            return (
+              
+
{lang}
+
{children}
+
+ ) + }, + }} + >{text} +
+ ) +} diff --git a/client/lucy-desktop/src/renderer/src/config.ts b/client/lucy-desktop/src/renderer/src/config.ts new file mode 100644 index 0000000..df4fbb2 --- /dev/null +++ b/client/lucy-desktop/src/renderer/src/config.ts @@ -0,0 +1,35 @@ +// Zentrale Endpunkte. Hirn + STT laufen auf der BOX (wie die WebUI), die Stimme LOKAL (pocket-tts, CPU). +export const BOX_URL = "http://192.168.178.151:9001" // MC2-Backend: /api/voice/stt, /api/voice/chat +export const TTS_URL = "http://127.0.0.1:8130" // lokaler Lucy-TTS (pocket-tts, vom Main-Prozess gespawnt) + +// Persona/Anrede: Lucy spricht den Nutzer als "Commander" an. ECHTE Umlaute erzwingen (sonst klingt TTS grausam). +export const SYSTEM_PROMPT = + "Du bist Lucy, eine gesprochene Assistentin, und redest den Nutzer mit „Commander“ an. " + + "Antworte natürlich und freundlich, aber SEHR KNAPP: in der Regel 1 bis 3 ganze, gut vorlesbare Sätze, " + + "nur das Wesentliche. Hol nicht aus, zähle nicht alles auf — lange Erklärungen nur, wenn ausdrücklich gewünscht. " + + "Halte den gesprochenen Teil in reinem Fließtext (keine Aufzählungszeichen, keine Emojis). " + + "NUR wenn der Commander ausdrücklich nach Code, Befehlen oder einem Link fragt, gib diese im Text aus — " + + "Code in Markdown-Codeblöcken (```), Links als vollständige URL. Diese werden angezeigt, aber NICHT vorgelesen; " + + "sprich dann nur eine kurze Einleitung dazu (z. B. „Hier ist das Skript, Commander.“). " + + "Verwende IMMER echte deutsche Umlaute (ä, ö, ü, ß) und NIEMALS ae, oe, ue oder ss als Ersatz. " + + "Schreibe Zahlen, Modellbezeichnungen und Abkürzungen EXAKT und normal (z. B. „RX 9070 XT“, „4 GB“, " + + "„25 Grad“) — schreibe Ziffern NIEMALS als Wörter aus und interpretiere sie nicht als Komma-/Dezimalzahlen." + +declare global { + interface Window { + lucy?: { + minimize: () => Promise + close: () => Promise + setMode: (m: "full" | "overlay") => Promise<"full" | "overlay"> + getMode: () => Promise<"full" | "overlay"> + togglePin: () => Promise + onMode: (cb: (m: "full" | "overlay") => void) => () => void + onHotkey: (cb: () => void) => () => void + captureScreen: () => Promise + listWindows: () => Promise<{ id: string; name: string }[]> + captureWindow: (id: string) => Promise + captureByName: (q: string) => Promise<{ name: string; image: string } | null> + openExternal: (url: string) => Promise + } + } +} diff --git a/client/lucy-desktop/src/renderer/src/styles.css b/client/lucy-desktop/src/renderer/src/styles.css new file mode 100644 index 0000000..8d60615 --- /dev/null +++ b/client/lucy-desktop/src/renderer/src/styles.css @@ -0,0 +1,230 @@ +* { box-sizing: border-box; margin: 0; padding: 0; } +:root { color-scheme: dark; } +html, body, #root { height: 100%; } +body { + font-family: system-ui, -apple-system, "Segoe UI", sans-serif; + color: #e5e7eb; overflow: hidden; background: transparent; /* frameless+transparent: App malt den Hintergrund */ +} + +/* ---- App-Rahmen: Titelleiste + Body ---- */ +.app { display: flex; flex-direction: column; height: 100%; overflow: hidden; } +.app.full { + background: radial-gradient(1200px 800px at 50% 30%, #14141f 0%, #0a0a0f 70%); + border: 1px solid rgba(255,255,255,0.08); border-radius: 14px; +} +.app.overlay { background: transparent; } + +.titlebar { + flex-shrink: 0; height: 34px; display: flex; align-items: center; justify-content: space-between; + padding: 0 6px 0 12px; -webkit-app-region: drag; user-select: none; +} +.app.overlay .titlebar { height: 28px; opacity: 0.35; transition: opacity 0.2s; } +.app.overlay:hover .titlebar { opacity: 1; } +.drag { display: flex; align-items: center; gap: 8px; min-width: 0; flex: 1; } +.dot { width: 9px; height: 9px; border-radius: 50%; flex-shrink: 0; box-shadow: 0 0 8px currentColor; } +.ttl { font-size: 12px; font-weight: 600; letter-spacing: 0.04em; color: #cbd5e1; } +.ttlStatus { font-size: 11px; color: #6b7280; margin-left: 6px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } +.winbtns { display: flex; gap: 2px; -webkit-app-region: no-drag; } +.wb { + width: 28px; height: 24px; border: none; background: transparent; color: #9ca3af; cursor: pointer; + border-radius: 6px; font-size: 13px; display: flex; align-items: center; justify-content: center; +} +.wb:hover { background: rgba(255,255,255,0.1); color: #e5e7eb; } +.wb.close:hover { background: #ef4444; color: #fff; } +.wb[data-on="true"] { color: #7dd3fc; } + +.body { flex: 1; min-height: 0; display: flex; gap: 14px; padding: 0 14px 14px; } +.app.overlay .body { padding: 0; } + +.stage { + position: relative; display: flex; flex-direction: column; flex: 1; min-width: 0; + border: 1px solid rgba(255,255,255,0.07); border-radius: 14px; + background: rgba(255,255,255,0.02); overflow: hidden; +} +.app.overlay .stage { border: none; background: transparent; } +.avatarWrap { flex: 1; min-height: 0; position: relative; overflow: hidden; border-radius: 14px; } + +/* --- digitaler Raum (animierter Sci-Fi-Backdrop, Etappe 2B) --- */ +.digitalRoom { + position: absolute; inset: 0; z-index: 0; overflow: hidden; + background: + radial-gradient(60% 50% at 50% 16%, rgba(125,211,252,0.10), transparent 70%), + radial-gradient(70% 60% at 82% 92%, rgba(167,139,250,0.10), transparent 70%), + radial-gradient(60% 60% at 12% 88%, rgba(52,211,153,0.06), transparent 70%), + linear-gradient(180deg, #0b0b15 0%, #07070d 100%); + box-shadow: inset 0 0 130px 36px rgba(0,0,0,0.55); /* Vignette -> Tiefe */ +} +.digitalRoom::before { /* sanft driftendes Aurora-Licht */ + content: ""; position: absolute; inset: -20%; z-index: 0; + background: + radial-gradient(40% 40% at 30% 32%, rgba(125,211,252,0.12), transparent 70%), + radial-gradient(45% 45% at 74% 42%, rgba(167,139,250,0.12), transparent 70%); + filter: blur(22px); animation: auroraDrift 22s ease-in-out infinite alternate; +} +.digitalRoom::after { /* perspektivisches Neon-Gitter am Boden */ + content: ""; position: absolute; left: -25%; right: -25%; bottom: -12%; height: 58%; + background-image: linear-gradient(rgba(125,211,252,0.13) 1px, transparent 1px), + linear-gradient(90deg, rgba(125,211,252,0.10) 1px, transparent 1px); + background-size: 46px 46px; + transform: perspective(440px) rotateX(62deg); transform-origin: bottom center; + -webkit-mask-image: linear-gradient(transparent, #000 65%); + animation: gridDrift 14s linear infinite; +} +/* schwebende Partikel (zwei Ebenen -> Parallax-Tiefe), nahtlos gekachelt */ +.dust { + position: absolute; inset: 0; z-index: 0; pointer-events: none; opacity: 0.7; + background-image: radial-gradient(1.6px 1.6px at 50% 50%, rgba(125,211,252,0.55), transparent 60%); + background-size: 96px 96px; animation: dustRise 24s linear infinite; +} +.dust::after { + content: ""; position: absolute; inset: 0; + background-image: radial-gradient(1.3px 1.3px at 30% 70%, rgba(167,139,250,0.5), transparent 60%); + background-size: 140px 140px; animation: dustRise2 38s linear infinite; +} +@keyframes gridDrift { to { background-position: 0 46px, 46px 0; } } +@keyframes auroraDrift { from { transform: translate(-3%, -2%) scale(1); } to { transform: translate(4%, 3%) scale(1.08); } } +@keyframes dustRise { to { background-position: 0 -96px; } } +@keyframes dustRise2 { to { background-position: 0 -140px; } } +.app.overlay .digitalRoom { display: none; } /* Overlay floatet -> nur Avatar + Aura */ + +.aura { position: absolute; inset: 0; z-index: 1; pointer-events: none; will-change: transform, opacity; } +.avatarCanvas { z-index: 2; } + +.subtitle { + position: absolute; left: 7%; right: 7%; bottom: 14px; z-index: 3; text-align: center; max-height: 40%; + overflow: hidden; pointer-events: none; border-radius: 10px; padding: 8px 14px; + font-size: 15px; line-height: 1.45; color: #eef2f7; + text-shadow: 0 1px 6px #000, 0 0 16px rgba(0,0,0,0.6); + background: linear-gradient(transparent, rgba(8,8,14,0.45)); animation: subIn 0.2s ease; +} +@keyframes subIn { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } } +.app.overlay .subtitle { font-size: 13px; bottom: 34px; } + +.warmOverlay { + position: absolute; inset: 0; display: flex; flex-direction: column; + align-items: center; justify-content: center; gap: 14px; text-align: center; padding: 24px; + background: rgba(10,10,15,0.72); backdrop-filter: blur(3px); z-index: 5; +} +.warmTitle { font-size: 16px; color: #e5e7eb; } +.warmSub { font-size: 13px; color: #9ca3af; max-width: 340px; line-height: 1.5; } +.spinner.big { width: 30px; height: 30px; border-width: 3px; } + +.overlayCaption { + position: absolute; left: 0; right: 0; bottom: 8px; display: flex; gap: 6px; justify-content: center; + align-items: center; font-size: 12px; color: #cbd5e1; text-shadow: 0 1px 4px #000; pointer-events: none; +} + +.controls { + flex-shrink: 0; display: flex; flex-direction: column; align-items: center; gap: 12px; + padding: 16px; border-top: 1px solid rgba(255,255,255,0.07); background: rgba(0,0,0,0.25); +} +.app.overlay .controls { border: none; background: transparent; padding: 8px; gap: 6px; } +.status { display: flex; align-items: center; gap: 8px; font-size: 14px; } +.spinner { + width: 14px; height: 14px; border: 2px solid rgba(255,255,255,0.25); border-top-color: #7dd3fc; + border-radius: 50%; animation: spin 0.8s linear infinite; +} +@keyframes spin { to { transform: rotate(360deg); } } + +.mic { + width: 72px; height: 72px; border-radius: 50%; cursor: pointer; user-select: none; + display: flex; align-items: center; justify-content: center; + border: 2px solid rgba(125,211,252,0.5); background: rgba(125,211,252,0.12); color: #7dd3fc; + transition: transform 0.12s, background 0.12s, border-color 0.12s; +} +.app.overlay .mic { width: 56px; height: 56px; } +.mic:hover { background: rgba(125,211,252,0.2); transform: scale(1.05); } +.mic.rec { + border-color: #f87171; background: rgba(248,113,113,0.2); color: #fca5a5; transform: scale(1.1); + box-shadow: 0 0 24px rgba(248,113,113,0.35); +} +.mic.disabled { opacity: 0.4; cursor: default; border-color: rgba(255,255,255,0.2); background: rgba(255,255,255,0.04); color: #6b7280; } +.mic.disabled:hover { transform: none; background: rgba(255,255,255,0.04); } +.hint { font-size: 11px; color: #6b7280; display: flex; align-items: center; gap: 6px; flex-wrap: wrap; justify-content: center; } +.hint kbd { background: rgba(255,255,255,0.1); border-radius: 4px; padding: 1px 5px; font-family: monospace; } + +.modeToggle { display: inline-flex; gap: 2px; padding: 2px; border-radius: 9px; background: rgba(255,255,255,0.05); } +.modeToggle button { + border: none; background: transparent; color: #9ca3af; cursor: pointer; + font-size: 11px; padding: 4px 10px; border-radius: 7px; transition: background 0.12s, color 0.12s; +} +.modeToggle button:hover { color: #e5e7eb; } +.modeToggle button.on { background: rgba(125,211,252,0.18); color: #7dd3fc; } +.app.overlay .modeToggle { display: none; } +.vadDot { width: 7px; height: 7px; border-radius: 50%; background: #34d399; box-shadow: 0 0 8px #34d399; animation: pulse 1s infinite; } + +.side { + width: 320px; flex-shrink: 0; display: flex; flex-direction: column; + border: 1px solid rgba(255,255,255,0.07); border-radius: 14px; background: rgba(255,255,255,0.02); +} +.sideHead { + display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; + border-bottom: 1px solid rgba(255,255,255,0.07); + font-size: 11px; text-transform: uppercase; letter-spacing: 0.05em; color: #9ca3af; +} +.iconBtn { background: none; border: none; color: #9ca3af; cursor: pointer; font-size: 15px; } +.iconBtn:hover { color: #e5e7eb; } + +.conv { flex: 1; overflow-y: auto; padding: 16px; display: flex; flex-direction: column; gap: 12px; } +.empty { font-size: 12px; color: #9ca3af; line-height: 1.6; } +.msg { display: flex; flex-direction: column; gap: 4px; } +.msg.user { align-items: flex-end; } +.msg.assistant { align-items: flex-start; } +.who { font-size: 10px; text-transform: uppercase; letter-spacing: 0.05em; color: #6b7280; padding: 0 4px; } +.bubble { + max-width: 88%; white-space: pre-wrap; word-break: break-word; border-radius: 16px; + padding: 8px 12px; font-size: 14px; line-height: 1.5; +} +.msg.user .bubble { background: rgba(125,211,252,0.14); border-bottom-right-radius: 4px; } +.msg.assistant .bubble { background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.07); border-bottom-left-radius: 4px; } +.dots { display: inline-flex; gap: 4px; } +.dots i { width: 6px; height: 6px; border-radius: 50%; background: #6b7280; animation: pulse 1s infinite; } +.dots i:nth-child(2) { animation-delay: 0.15s; } +.dots i:nth-child(3) { animation-delay: 0.3s; } +@keyframes pulse { 0%, 100% { opacity: 0.3; } 50% { opacity: 1; } } + +::-webkit-scrollbar { width: 8px; } +::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.12); border-radius: 4px; } + +/* ---- Etappe 2: guter Chat (Markdown, Code-Bloecke, Links, Kopieren) ---- */ +.bubble { position: relative; } +.md { white-space: normal; } +.md > :first-child { margin-top: 0; } +.md > :last-child { margin-bottom: 0; } +.md p { margin: 0 0 8px; } +.md ul, .md ol { margin: 4px 0 8px; padding-left: 20px; } +.md li { margin: 2px 0; } +.md strong { color: #f1f5f9; font-weight: 650; } +.md a.mdLink { color: #7dd3fc; text-decoration: underline; cursor: pointer; word-break: break-all; } +.md a.mdLink:hover { color: #bae6fd; } +.mdInlineCode { + font-family: ui-monospace, "Cascadia Code", Consolas, monospace; font-size: 12.5px; + background: rgba(125,211,252,0.10); border: 1px solid rgba(125,211,252,0.18); + border-radius: 5px; padding: 1px 5px; word-break: break-word; +} +.codeBlock { + margin: 8px 0; border-radius: 10px; overflow: hidden; + border: 1px solid rgba(255,255,255,0.10); background: #0c0c14; +} +.codeBar { + display: flex; align-items: center; justify-content: space-between; + padding: 4px 8px 4px 12px; background: rgba(255,255,255,0.04); border-bottom: 1px solid rgba(255,255,255,0.08); +} +.codeLang { font-size: 10px; text-transform: uppercase; letter-spacing: 0.06em; color: #6b7280; } +.codeBlock pre { margin: 0; padding: 10px 12px; overflow-x: auto; } +.codeBlock code { + font-family: ui-monospace, "Cascadia Code", Consolas, monospace; font-size: 12.5px; line-height: 1.5; + color: #e5e7eb; white-space: pre; +} +.copyBtn { + border: 1px solid rgba(125,211,252,0.3); background: rgba(125,211,252,0.10); color: #7dd3fc; + font-size: 11px; padding: 2px 8px; border-radius: 6px; cursor: pointer; -webkit-app-region: no-drag; +} +.copyBtn:hover { background: rgba(125,211,252,0.2); } +.msgCopy { + position: absolute; top: 4px; right: 4px; width: 22px; height: 22px; border: none; + background: rgba(255,255,255,0.06); color: #9ca3af; border-radius: 6px; cursor: pointer; + font-size: 12px; opacity: 0; transition: opacity 0.12s; -webkit-app-region: no-drag; +} +.msg.assistant .bubble:hover .msgCopy { opacity: 1; } +.msgCopy:hover { background: rgba(255,255,255,0.14); color: #e5e7eb; } From feba73a11a925e970d380487ed4a7b5fabba9f37 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Tue, 30 Jun 2026 19:20:39 +0200 Subject: [PATCH 05/38] Lucy v2 (Etappe 3+4): Mimik nach Bedeutung + Overlay v2 Etappe 3 (natuerlich reagieren, App-Teil): - optionaler -Tag von Hermes -> Avatar-Mimik nach Inhalt (Fallback: Sentiment-Heuristik) - Tag wird aus Anzeige UND Sprachausgabe entfernt (stripEmoTag) Etappe 4 (aus der App ausbrechen): - Geistmodus: Overlay durchklickbar (setIgnoreMouseEvents+forward), AUSSER ueber .clickable-Zonen -> Lucy sitzt auf dem Desktop, Arbeit dahinter laeuft weiter, Bedienelemente bleiben klickbar - Overlay-Blasen: Links (oeffnen/kopieren) + Code (kopieren/in App ansehen) griffbereit ohne Chat-Panel - neue IPC win:setClickThrough + preload setClickThrough Co-Authored-By: Claude Opus 4.8 --- client/lucy-desktop/src/main/index.ts | 7 + client/lucy-desktop/src/preload/index.ts | 1 + client/lucy-desktop/src/renderer/src/App.tsx | 44 ++- .../lucy-desktop/src/renderer/src/config.ts | 6 +- .../renderer/src/lib/voice/useVoiceAgent.ts | 314 ++++++++++++++++++ .../lucy-desktop/src/renderer/src/styles.css | 20 ++ 6 files changed, 389 insertions(+), 3 deletions(-) create mode 100644 client/lucy-desktop/src/renderer/src/lib/voice/useVoiceAgent.ts diff --git a/client/lucy-desktop/src/main/index.ts b/client/lucy-desktop/src/main/index.ts index 94a318b..b982435 100644 --- a/client/lucy-desktop/src/main/index.ts +++ b/client/lucy-desktop/src/main/index.ts @@ -114,6 +114,13 @@ ipcMain.handle("win:togglePin", () => { pinned = !pinned; win?.setAlwaysOnTop(pi // Links im echten System-Browser oeffnen (nicht im App-Fenster); nur http(s) erlauben ipcMain.handle("open:external", (_e, url: string) => { if (/^https?:\/\//i.test(url)) void shell.openExternal(url) }) +// Geistmodus (Overlay v2): Fenster durchklickbar machen -> Lucy "sitzt" auf dem Desktop, du arbeitest +// dahinter weiter. forward:true liefert weiter Hover-Events an den Renderer, damit er ueber Lucys +// Bedienelementen kurzzeitig wieder klickbar schalten kann. +ipcMain.handle("win:setClickThrough", (_e, on: boolean) => { + win?.setIgnoreMouseEvents(!!on, { forward: true }); return !!on +}) + // ---- Bildschirm-Sicht (Lucys Augen) ---- const CAP = { width: 1280, height: 720 } ipcMain.handle("screen:capture", async () => { diff --git a/client/lucy-desktop/src/preload/index.ts b/client/lucy-desktop/src/preload/index.ts index d4d0299..db46276 100644 --- a/client/lucy-desktop/src/preload/index.ts +++ b/client/lucy-desktop/src/preload/index.ts @@ -13,6 +13,7 @@ contextBridge.exposeInMainWorld("lucy", { captureWindow: (id: string) => ipcRenderer.invoke("screen:captureWindow", id), captureByName: (q: string) => ipcRenderer.invoke("screen:captureByName", q), openExternal: (url: string) => ipcRenderer.invoke("open:external", url), // Link im System-Browser + setClickThrough: (on: boolean) => ipcRenderer.invoke("win:setClickThrough", on), // Geistmodus (Overlay v2) // Events aus dem Main-Prozess (Tray/Hotkey/Modus) onMode: (cb: (m: "full" | "overlay") => void) => { const h = (_e: unknown, m: "full" | "overlay") => cb(m) diff --git a/client/lucy-desktop/src/renderer/src/App.tsx b/client/lucy-desktop/src/renderer/src/App.tsx index 3957738..e6e46e7 100644 --- a/client/lucy-desktop/src/renderer/src/App.tsx +++ b/client/lucy-desktop/src/renderer/src/App.tsx @@ -23,6 +23,7 @@ export default function App() { const endRef = useRef(null) const [mode, setMode] = useState<"full" | "overlay">("full") const [pinned, setPinned] = useState(false) + const [ghost, setGhost] = useState(false) // Geistmodus: Fenster durchklickbar (nur Overlay) useEffect(() => { endRef.current?.scrollIntoView({ behavior: "smooth", block: "end" }) }, [messages]) @@ -32,6 +33,22 @@ export default function App() { return window.lucy?.onMode(setMode) }, []) + // Geistmodus (Overlay v2): Fenster durchklickbar, AUSSER der Zeiger ist ueber Lucys Bedienelementen + // (.clickable). So sitzt sie auf dem Desktop, du arbeitest dahinter weiter, kannst sie aber bedienen. + useEffect(() => { + if (!(ghost && mode === "overlay")) { void window.lucy?.setClickThrough(false); return } + let ignoring = false + const set = (ig: boolean) => { if (ig !== ignoring) { ignoring = ig; void window.lucy?.setClickThrough(ig) } } + set(true) + const onMove = (e: MouseEvent) => { + const el = document.elementFromPoint(e.clientX, e.clientY) as HTMLElement | null + set(!(el && el.closest(".clickable"))) + } + window.addEventListener("mousemove", onMove) + return () => { window.removeEventListener("mousemove", onMove); void window.lucy?.setClickThrough(false) } + }, [ghost, mode]) + useEffect(() => { if (mode !== "overlay") setGhost(false) }, [mode]) // Geistmodus nur im Overlay + // Leertaste = Push-to-talk (halten) useEffect(() => { const isField = (el: EventTarget | null) => @@ -68,6 +85,10 @@ export default function App() { const statusColor = status === "error" ? "#f87171" : speaking ? "#7dd3fc" : "#9ca3af" const overlay = mode === "overlay" const lastAssistant = [...messages].reverse().find((m) => m.role === "assistant")?.text?.trim() || "" + // Overlay-Blasen: Links/Code aus der letzten Antwort griffbereit (im Overlay gibt es kein Chat-Panel) + const ovLinks = overlay ? Array.from(new Set(lastAssistant.match(/https?:\/\/[^\s)]+/g) || [])).slice(0, 3) : [] + const ovCode = overlay ? (lastAssistant.match(/```[\w]*\n?([\s\S]*?)```/)?.[1] || "").trim() : "" + const shortUrl = (u: string) => u.replace(/^https?:\/\/(www\.)?/, "") const micBtn = ( + {overlay && } @@ -116,6 +138,24 @@ export default function App() { {!overlay &&
Die lokale Stimme wird vorbereitet — einen Moment, Commander.
}
)} + {overlay && (ovLinks.length > 0 || ovCode) && ( +
+ {ovLinks.map((l, i) => ( +
+ 🔗 {shortUrl(l)} + + +
+ ))} + {ovCode && ( +
+ ⌘ Code-Schnipsel + + +
+ )} +
+ )} {overlay && (
{busy && } @@ -123,7 +163,7 @@ export default function App() {
)}
-
+
{!overlay && (
{busy && } diff --git a/client/lucy-desktop/src/renderer/src/config.ts b/client/lucy-desktop/src/renderer/src/config.ts index df4fbb2..835f514 100644 --- a/client/lucy-desktop/src/renderer/src/config.ts +++ b/client/lucy-desktop/src/renderer/src/config.ts @@ -13,7 +13,10 @@ export const SYSTEM_PROMPT = "sprich dann nur eine kurze Einleitung dazu (z. B. „Hier ist das Skript, Commander.“). " + "Verwende IMMER echte deutsche Umlaute (ä, ö, ü, ß) und NIEMALS ae, oe, ue oder ss als Ersatz. " + "Schreibe Zahlen, Modellbezeichnungen und Abkürzungen EXAKT und normal (z. B. „RX 9070 XT“, „4 GB“, " + - "„25 Grad“) — schreibe Ziffern NIEMALS als Wörter aus und interpretiere sie nicht als Komma-/Dezimalzahlen." + "„25 Grad“) — schreibe Ziffern NIEMALS als Wörter aus und interpretiere sie nicht als Komma-/Dezimalzahlen. " + + "Du kannst optional GANZ AM ENDE deiner Antwort einen Stimmungs-Tag anhängen: , , " + + ", , oder . Er wird nicht angezeigt oder vorgelesen " + + "und steuert nur deinen Gesichtsausdruck — wähle ihn passend zum Inhalt deiner Antwort." declare global { interface Window { @@ -30,6 +33,7 @@ declare global { captureWindow: (id: string) => Promise captureByName: (q: string) => Promise<{ name: string; image: string } | null> openExternal: (url: string) => Promise + setClickThrough: (on: boolean) => Promise } } } diff --git a/client/lucy-desktop/src/renderer/src/lib/voice/useVoiceAgent.ts b/client/lucy-desktop/src/renderer/src/lib/voice/useVoiceAgent.ts new file mode 100644 index 0000000..5a965de --- /dev/null +++ b/client/lucy-desktop/src/renderer/src/lib/voice/useVoiceAgent.ts @@ -0,0 +1,314 @@ +import { useCallback, useEffect, useRef, useState } from "react" +import { usePushToTalk } from "./usePushToTalk" +import { useVAD } from "./useVAD" +import { AudioQueue } from "./audio" +import { sentimentToEmotion, type Emotion } from "./sentiment" +import { BOX_URL, TTS_URL, SYSTEM_PROMPT } from "../../config" + +// Voll-Duplex-Schleife: PTT -> Box /stt -> Box /chat (SSE Hermes) -> CHUNKS -> lokal /tts -> AudioQueue. +// Hirn+STT = Box (wie WebUI), Stimme = lokal (pocket-tts, CPU). Antwort wird in groessere Bloecke +// gebuendelt (>=MIN_CHUNK Zeichen, kein Mini-Satz-Babble) und satzweise frueh gesprochen. +// Warm-Gate beim Start: Bedienung erst frei, wenn der TTS-Dienst antwortet (Modell geladen). + +export type VoiceStatus = "warming" | "idle" | "listening" | "transcribing" | "thinking" | "speaking" | "error" +export interface ChatMsg { role: "user" | "assistant"; text: string } + +// Hermes schreibt manchmal ASCII-Umlaute (ue/ae/oe/ss) statt ä/ö/ü/ß -> pocket-tts liest die falsch vor. +// Gezielt häufige UMLAUT-Stämme zurückwandeln. KONSERVATIV: nur Muster, bei denen ASCII fast immer ein +// Umlaut ist (echte "ue"-Wörter wie aktuell/neue/Quelle bleiben unangetastet — die sind hier NICHT gelistet). +const UMLAUT_FIX: [RegExp, string][] = [ + [/ueber/gi, "über"], [/\bfuer\b/gi, "für"], [/natuerlich/gi, "natürlich"], [/zurueck/gi, "zurück"], + [/unterstuetz/gi, "unterstütz"], [/ueberpruef/gi, "überprüf"], [/\bpruef/gi, "prüf"], [/gefuehl/gi, "gefühl"], + [/\bfuehl/gi, "fühl"], [/\bfuehr/gi, "führ"], [/\bfuenf/gi, "fünf"], [/\bgruen/gi, "grün"], [/\bfrueh/gi, "früh"], + [/\bglueck/gi, "glück"], [/\bstueck/gi, "stück"], [/gemuetlich/gi, "gemütlich"], [/verfueg/gi, "verfüg"], + [/\bmoecht/gi, "möcht"], [/\bkoenn/gi, "könn"], [/\bwuerd/gi, "würd"], [/\bmuess/gi, "müss"], [/\bduerf/gi, "dürf"], + [/\bhaett/gi, "hätt"], [/\bwaer/gi, "wär"], [/\bspaet/gi, "spät"], + [/\btaeglich/gi, "täglich"], [/\bnaechst/gi, "nächst"], [/\baehnlich/gi, "ähnlich"], [/waehrend/gi, "während"], + [/\bwaehl/gi, "wähl"], [/erklaer/gi, "erklär"], [/\bschoen/gi, "schön"], [/\bgroess/gi, "größ"], [/\bhoer/gi, "hör"], + [/\boeffn/gi, "öffn"], [/\bboese/gi, "böse"], [/\bloesch/gi, "lösch"], [/\bstoer/gi, "stör"], [/koennt/gi, "könnt"], + // erweitert (30.06.): weitere häufige Stämme + sicheres -ität-Suffix. KONSERVATIV gewählt; + // der TTS-Server (_fix_umlauts) hat zusätzlich ein Netz. neu/aktuell/Steuer/Feuer bleiben unberührt. + [/itaet/gi, "ität"], + [/\bmoeglich/gi, "möglich"], [/gespraech/gi, "gespräch"], [/\bmaerz/gi, "märz"], + [/geschaeft/gi, "geschäft"], [/gefaehr/gi, "gefähr"], [/\bhaeng/gi, "häng"], [/\blaeng/gi, "läng"], + [/\bmaenner/gi, "männer"], [/\bmaedchen/gi, "mädchen"], [/\bvaeter/gi, "väter"], [/\btraeum/gi, "träum"], + [/\bsaetz/gi, "sätz"], [/\bplaetz/gi, "plätz"], [/\bkaelte/gi, "kälte"], [/\bzaehl/gi, "zähl"], + [/\baerg/gi, "ärg"], [/\baerzt/gi, "ärzt"], [/aeusser/gi, "äußer"], + [/\btuer/gi, "tür"], [/\bkueche/gi, "küche"], [/buech/gi, "büch"], [/\bbuero/gi, "büro"], [/\bbuerg/gi, "bürg"], + [/\bsued/gi, "süd"], [/schueler/gi, "schüler"], [/uebung/gi, "übung"], [/kuenstl/gi, "künstl"], + [/\bmuede/gi, "müde"], [/\bmuell/gi, "müll"], [/\bdrueck/gi, "drück"], [/stuetz/gi, "stütz"], + [/\bmoebel/gi, "möbel"], [/loes/gi, "lös"], [/voellig/gi, "völlig"], [/zwoelf/gi, "zwölf"], + [/\bkoenig/gi, "könig"], [/\bhoeh/gi, "höh"], [/\bdoerf/gi, "dörf"], [/\bwoert/gi, "wört"], +] +export function restoreUmlauts(s: string): string { + let out = s + for (const [re, rep] of UMLAUT_FIX) out = out.replace(re, rep as string) + return out +} + +// Optionaler Stimmungs-Tag, den Hermes ans Ende haengen kann ( ...). Steuert NUR den +// Gesichtsausdruck -> wird vor Anzeige UND vor dem Vorlesen entfernt. Fallback = Sentiment-Heuristik. +const EMO_TAG = //i +function stripEmoTag(s: string): string { return s.replace(//gi, "").trimEnd() } + +function cleanForTTS(s: string): string { + return restoreUmlauts(s) + .replace(/```[\s\S]*?```/g, " ").replace(/`([^`]*)`/g, "$1") + .replace(/\[([^\]]+)\]\([^)]+\)/g, "$1") + .replace(/https?:\/\/\S+/gi, " ").replace(/www\.\S+/gi, " ").replace(/\b\S+@\S+\.\S+\b/g, " ") + .replace(/[*_#>~|`]+/g, " ").replace(/^\s*[-•·]\s+/gm, " ") + .replace(/\s*&\s*/g, " und ") + .replace(/(\d)\s*%/g, "$1 Prozent").replace(/%/g, " Prozent ") + .replace(/(\d)\s*°\s*C?/g, "$1 Grad").replace(/°/g, " Grad ") + .replace(/\s*=\s*/g, " gleich ").replace(/\s*\/\s*/g, " ") + .replace(/[\u{1F300}-\u{1FAFF}\u{2600}-\u{27BF}\u{2190}-\u{21FF}\u{2B00}-\u{2BFF}]/gu, "") + .replace(/\s+/g, " ").trim() +} + +// FRISCHE Session pro App-Start (NICHT in localStorage persistieren). Sonst wächst der Hermes-Verlauf +// über alle Starts hinweg unbegrenzt (gesehen: 97k+ Tokens) -> Degeneration/Wiederhol-Schleifen. +// Dauerhaftes Gedächtnis liegt ohnehin in Mem0 (sessionunabhängig) -> Continuity bleibt erhalten. +function newSessionId(): string { + return "lucy-" + Math.random().toString(36).slice(2) + Date.now().toString(36) +} + +async function ttsToBuffer(text: string): Promise { + const r = await fetch(`${TTS_URL}/tts`, { + method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ text }), + }) + if (!r.ok) throw new Error(`TTS ${r.status}`) + return r.arrayBuffer() +} + +// Streamt die Stimme (PCM16) und spielt sie lueckenlos ab, sobald die ersten Chunks da sind +// (Time-to-first-audio ~1s statt der ganzen Generierung). Liefert true, wenn etwas gesprochen wurde. +async function ttsStreamPlay(queue: AudioQueue, text: string): Promise { + const r = await fetch(`${TTS_URL}/tts/stream`, { + method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ text }), + }) + if (!r.ok || !r.body) throw new Error(`TTS ${r.status}`) + const sr = Number(r.headers.get("X-Sample-Rate") || "24000") + await queue.playPcmStream(r.body, sr) + return true +} + +// Bildschirm-Sicht: erkennt im Gesagten die Bitte, auf den Schirm zu schauen +const VISION_RX = /\b(schau|sieh|siehst|guck|guckst|zeig|bildschirm|screen|monitor|fenster|erkennst?|lies (mir|das)|was (steht|ist) (da|hier|auf)|auf meinem (bildschirm|schirm|screen))\b/i +function extractWindowName(text: string): string | null { + // grobe Heuristik: Wort/Phrase nach 'fenster|app|programm|in|auf|bei|im' + const m = text.match(/(?:fenster|app|programm|in|auf|bei|im)\s+([A-Za-zÄÖÜäöü][\w.+\- ]{2,28})/i) + if (!m) return null + return m[1].replace(/\b(an|fenster|programm|app|bildschirm|schirm|screen|siehst|du)\b/gi, "").trim() || null +} + +export function useVoiceAgent() { + const [status, setStatus] = useState("warming") + const [ready, setReady] = useState(false) + const [messages, setMessages] = useState([]) + const [error, setError] = useState(null) + const [inputMode, setInputModeState] = useState<"ptt" | "vad">( + () => (localStorage.getItem("lucy_input_mode") === "vad" ? "vad" : "ptt")) + const [vadListening, setVadListening] = useState(false) + const setInputMode = useCallback((m: "ptt" | "vad") => { + localStorage.setItem("lucy_input_mode", m); setInputModeState(m) + }, []) + + const audioLevel = useRef({ current: 0 }) + const emotion = useRef("neutral") + const queueRef = useRef(null) + const sessionId = useRef(newSessionId()) + // Live-Status fuer die Eingabe-Sperre (ohne pressStart-Closure neu zu binden) + const statusRef = useRef("warming") + useEffect(() => { statusRef.current = status }, [status]) + + const ensureQueue = useCallback(() => { + if (!queueRef.current) { + const q = new AudioQueue() + q.onSpeaking = (sp) => setStatus((s) => (sp ? "speaking" : s === "speaking" ? "idle" : s)) + queueRef.current = q + audioLevel.current = q.level + } + return queueRef.current + }, []) + + // --- Warm-Gate: warten bis der lokale TTS-Dienst geladen ist, bevor die Bedienung frei wird --- + // pocket_server serviert /health erst, wenn das Modell fertig geladen ist (FastAPI-lifespan). + // Der Main-Prozess spawnt den Server beim App-Start; hier nur pollen. + useEffect(() => { + let cancelled = false + ;(async () => { + for (let i = 0; i < 120 && !cancelled; i++) { + try { + const h = await (await fetch(`${TTS_URL}/health`)).json() + if (h.status === "ok") break + } catch { /* Dienst startet evtl. noch (Spawn + Modell-Load) */ } + await new Promise((r) => setTimeout(r, 1000)) + } + if (cancelled) return + // ein Aufwaerm-Satz (primt alle lazy Pfade); Audio verwerfen + try { await ttsToBuffer("Alles bereit, Commander.") } catch { /* */ } + if (cancelled) return + setReady(true); setStatus("idle") + })() + return () => { cancelled = true } + }, []) + + // Ein kompletter Turn: User-Text (+ optional Bildschirm-Bilder, Multi-Monitor) -> Hermes (SSE) -> Stimme. + const runTurn = useCallback(async (userText: string, images?: string[]) => { + const queue = ensureQueue() + setStatus("thinking") + let assistant = "" + setMessages((m) => [...m, { role: "assistant", text: "" }]) + + let spokeAny = false, ttsFailed = false + try { + const r = await fetch(`${BOX_URL}/api/voice/chat`, { + method: "POST", headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ text: userText, session_id: sessionId.current, system: SYSTEM_PROMPT, images: images || [] }), + }) + if (!r.ok || !r.body) throw new Error(`Agent ${r.status}`) + const reader = r.body.getReader() + const dec = new TextDecoder() + let sse = "" + for (;;) { + const { done, value } = await reader.read() + if (done) break + sse += dec.decode(value, { stream: true }) + const events = sse.split("\n\n"); sse = events.pop() || "" + for (const ev of events) { + const lines = ev.split("\n") + // Hermes mischt Tool-Fortschritt (event: hermes.tool.progress) in den Stream. Das sind KEINE + // Chat-Chunks -> nicht als solche parsen (ein Tool-Hickup mit error-Objekt darf die Antwort + // nicht abbrechen). Optional koennte man hier Tool-Status anzeigen. + const evType = lines.find((l) => l.startsWith("event:"))?.slice(6).trim() + if (evType && evType.startsWith("hermes.")) continue // Tool-Fortschritt (Status bleibt 'thinking') + const line = lines.find((l) => l.startsWith("data:")) + if (!line) continue + const data = line.slice(5).trim() + if (data === "[DONE]") continue + let json: any + try { json = JSON.parse(data) } catch { continue } + if (json.error) { + const msg = typeof json.error === "string" + ? json.error + : (json.error?.message || JSON.stringify(json.error)) + throw new Error(msg) + } + const delta = json.choices?.[0]?.delta?.content || "" + if (!delta) continue + assistant += delta + emotion.current = sentimentToEmotion(assistant) + setMessages((m) => { const c = m.slice(); c[c.length - 1] = { role: "assistant", text: stripEmoTag(restoreUmlauts(assistant)) }; return c }) + } + } + if (!assistant.trim()) { setStatus("idle"); return } + // Defensiv: falls Hermes mal seinen internen Umschlag durchreicht (Mid-Turn), NICHT vorlesen. + if (assistant.includes("OUT-OF-BAND USER MESSAGE")) { + setStatus("error") + setError("Nachricht kam mitten im Turn an — bitte warten, bis Lucy fertig ist, dann erneut fragen.") + return + } + // Stimmungs-Tag (falls vorhanden) -> Avatar-Mimik nach BEDEUTUNG (sonst bleibt Sentiment-Heuristik). + const emo = assistant.match(EMO_TAG) + if (emo) emotion.current = emo[1].toLowerCase() as Emotion + // Ganze Antwort STREAMEN -> erstes Audio nach ~1s, lueckenlos (pocket-tts splittet intern in + // Saetze mit natuerlicher Prosodie). Kein Chunking noetig (real-time RTF ~0.74). + const spoken = cleanForTTS(stripEmoTag(assistant)) + if (spoken) { + try { await ttsStreamPlay(queue, spoken); spokeAny = true } + catch (e) { ttsFailed = true; console.error("TTS-Fehler:", e) } + } + if (!spokeAny) { + setStatus("error") + setError(ttsFailed ? "Sprachausgabe fehlgeschlagen — laeuft der lokale TTS-Dienst?" : "Keine Sprachausgabe erzeugt.") + } + } catch (e: any) { + setStatus("error"); setError(`Agent-Antwort fehlgeschlagen: ${e.message}`) + } + }, [ensureQueue]) + + // Bildschirm-Sicht: Bild(er) erfassen (gezieltes Fenster per Name, sonst ALLE Monitore) + const captureForVision = useCallback(async (userText: string): Promise<{ images: string[]; label: string }> => { + if (!window.lucy) return { images: [], label: "" } + try { + const name = extractWindowName(userText) + if (name) { + const hit = await window.lucy.captureByName(name) + if (hit?.image) return { images: [hit.image], label: ` 👁 ${hit.name}` } + } + const shots = (await window.lucy.captureScreen()).filter(Boolean) + if (shots.length) return { images: shots, label: shots.length > 1 ? ` 👁 ${shots.length} Bildschirme` : " 👁 Bildschirm" } + } catch (e) { console.error("Bildschirm-Capture:", e) } + return { images: [], label: "" } + }, []) + + const handleAudio = useCallback(async (blob: Blob) => { + setError(null) + ensureQueue().clear() + setStatus("transcribing") + let userText = "" + try { + const fd = new FormData() + fd.append("audio", blob, "rec.webm") + const r = await fetch(`${BOX_URL}/api/voice/stt`, { method: "POST", body: fd }) + if (!r.ok) throw new Error(`STT ${r.status}`) + userText = (await r.json()).text?.trim() || "" + } catch (e: any) { + setStatus("error"); setError(`Spracherkennung fehlgeschlagen: ${e.message}`); return + } + if (!userText) { setStatus("idle"); return } + // Bittet der Nutzer Lucy, auf den Bildschirm zu schauen? -> Bild(er) erfassen + mitschicken. + const vis = VISION_RX.test(userText) ? await captureForVision(userText) : { images: [] as string[], label: "" } + setMessages((m) => [...m, { role: "user", text: userText + vis.label }]) + await runTurn(userText, vis.images) + }, [ensureQueue, runTurn, captureForVision]) + + // Auge-Button: Lucy aktiv auf den Bildschirm schauen lassen (ohne Sprachbefehl) + const lookAtScreen = useCallback(async () => { + if (!ready || statusRef.current === "thinking" || statusRef.current === "transcribing") return + setError(null); ensureQueue().clear() + let images: string[] = [] + try { images = ((await window.lucy?.captureScreen()) || []).filter(Boolean) } catch { /* */ } + const prompt = "Schau auf meinen Bildschirm und sag mir kurz, was du darauf siehst." + const label = images.length > 1 ? ` 👁 ${images.length} Bildschirme` : " 👁 Bildschirm" + setMessages((m) => [...m, { role: "user", text: prompt + label }]) + await runTurn(prompt, images) + }, [ensureQueue, runTurn, ready]) + + const { recording, start, stop } = usePushToTalk(handleAudio) + + // Freisprech-VAD: nur im vad-Modus, und nur wenn Lucy IDLE ist (paused sonst) -> keine Rückkopplung, + // keine Mid-Turn-Nachricht. ensureQueue() vor handleAudio, damit Barge-in/Audio bereit ist. + useVAD({ + enabled: ready && inputMode === "vad", + paused: status !== "idle", + onUtterance: (blob) => { ensureQueue(); void handleAudio(blob) }, + onListening: setVadListening, + }) + + const pressStart = useCallback(() => { + if (!ready) return + // Waehrend das Gehirn arbeitet (STT/Hermes-Turn laeuft) KEINEN neuen Turn starten: eine zweite + // Nachricht mitten im Turn liefert Hermes als "OUT-OF-BAND" aus -> Modell echot den Umschlag. + // Barge-in beim SPRECHEN bleibt erlaubt (Hermes-Turn ist dann fertig) -> queue.clear() in handleAudio. + if (statusRef.current === "transcribing" || statusRef.current === "thinking") return + ensureQueue() + setStatus("listening") + void start() + }, [ready, ensureQueue, start]) + + const pressEnd = useCallback(() => { stop() }, [stop]) + + const reset = useCallback(() => { + queueRef.current?.clear() + setMessages([]); setError(null); setStatus("idle") + sessionId.current = newSessionId() // frischer Gesprächsfaden (Mem0-Gedächtnis bleibt) + }, []) + + useEffect(() => { + if (!recording && status === "listening") setStatus("transcribing") + }, [recording, status]) + + return { status, ready, messages, error, recording, audioLevel, emotion, pressStart, pressEnd, reset, + inputMode, setInputMode, vadListening, lookAtScreen } +} diff --git a/client/lucy-desktop/src/renderer/src/styles.css b/client/lucy-desktop/src/renderer/src/styles.css index 8d60615..6bc079d 100644 --- a/client/lucy-desktop/src/renderer/src/styles.css +++ b/client/lucy-desktop/src/renderer/src/styles.css @@ -114,6 +114,26 @@ body { align-items: center; font-size: 12px; color: #cbd5e1; text-shadow: 0 1px 4px #000; pointer-events: none; } +/* --- Overlay v2: griffbereite Blasen fuer Links/Code (behindern nicht, jederzeit ignorierbar) --- */ +.overlayBubbles { + position: absolute; left: 6px; right: 6px; bottom: 28px; z-index: 4; + display: flex; flex-direction: column; gap: 5px; align-items: stretch; +} +.bubbleChip { + display: flex; align-items: center; gap: 4px; padding: 3px 4px 3px 9px; border-radius: 9px; + background: rgba(12,12,20,0.82); border: 1px solid rgba(125,211,252,0.25); + backdrop-filter: blur(4px); box-shadow: 0 3px 12px rgba(0,0,0,0.4); +} +.bubbleChip .chipTxt { + flex: 1; min-width: 0; font-size: 11px; color: #cbd5e1; + white-space: nowrap; overflow: hidden; text-overflow: ellipsis; +} +.bubbleChip button { + flex-shrink: 0; width: 22px; height: 20px; border: none; border-radius: 6px; cursor: pointer; + background: rgba(125,211,252,0.14); color: #7dd3fc; font-size: 11px; -webkit-app-region: no-drag; +} +.bubbleChip button:hover { background: rgba(125,211,252,0.28); } + .controls { flex-shrink: 0; display: flex; flex-direction: column; align-items: center; gap: 12px; padding: 16px; border-top: 1px solid rgba(255,255,255,0.07); background: rgba(0,0,0,0.25); From c3c7c2ca910da7998938be385d26d99cd5ee2efe Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Tue, 30 Jun 2026 19:35:06 +0200 Subject: [PATCH 06/38] Lucy v2 (MateEngine-Verhalten): Blickfolgen + Streicheln + Ziehen - Mauszeiger-Verfolgung: Main pollt globalen Cursor (screen.getCursorScreenPoint), Renderer richtet Augen (lookAt-Offset in Kamera-Achsen) + dezent Kopf/Nacken danach aus - Antippen/Streicheln: Klick auf den Avatar -> kurze freudige Reaktion (Laecheln + Kopf-Wackeln) - Ziehen: im Overlay ist der Avatar eine Drag-Region (am Koerper greifen -> Fenster verschieben), Kamera-Drehung (OrbitControls) im Overlay aus; Blasen/Knoepfe bleiben no-drag - neue IPC-Events: lucy:cursor (+ preload onCursor) Co-Authored-By: Claude Opus 4.8 --- client/lucy-desktop/src/main/index.ts | 21 ++++++++- client/lucy-desktop/src/preload/index.ts | 6 +++ client/lucy-desktop/src/renderer/src/App.tsx | 10 ++++- .../src/renderer/src/components/Avatar3D.tsx | 44 ++++++++++++++++--- .../lucy-desktop/src/renderer/src/config.ts | 1 + .../lucy-desktop/src/renderer/src/styles.css | 3 ++ 6 files changed, 75 insertions(+), 10 deletions(-) diff --git a/client/lucy-desktop/src/main/index.ts b/client/lucy-desktop/src/main/index.ts index b982435..a05c1cf 100644 --- a/client/lucy-desktop/src/main/index.ts +++ b/client/lucy-desktop/src/main/index.ts @@ -1,4 +1,4 @@ -import { app, BrowserWindow, ipcMain, Tray, Menu, globalShortcut, nativeImage, desktopCapturer, shell } from "electron" +import { app, BrowserWindow, ipcMain, Tray, Menu, globalShortcut, nativeImage, desktopCapturer, shell, screen } from "electron" import { spawn, ChildProcess } from "child_process" import { join } from "path" @@ -20,6 +20,22 @@ let tray: Tray | null = null let ttsProc: ChildProcess | null = null let mode: "full" | "overlay" = "full" let pinned = false +let cursorTimer: ReturnType | null = null + +// MateEngine-Idee: Lucy folgt dem Mauszeiger. Der Zeiger ist auch AUSSERHALB des Fensters (Geistmodus), +// daher global pollen (screen.getCursorScreenPoint) und die Richtung relativ zu Lucys Kopf an den Renderer geben. +function startCursorTracking() { + if (cursorTimer) return + cursorTimer = setInterval(() => { + if (!win || win.isDestroyed() || !win.isVisible()) return + const b = win.getBounds() + const p = screen.getCursorScreenPoint() + const cx = b.x + b.width / 2 + const cy = b.y + b.height * 0.38 // ungefaehre Kopfhoehe im Fenster + win.webContents.send("lucy:cursor", { x: (p.x - cx) / Math.max(1, b.width), y: (p.y - cy) / Math.max(1, b.height) }) + }, 40) // ~25 Hz reicht fuers Blickfolgen, kostet kaum Last +} +function stopCursorTracking() { if (cursorTimer) { clearInterval(cursorTimer); cursorTimer = null } } async function ensureTtsServer() { try { @@ -150,8 +166,9 @@ app.whenReady().then(() => { createWindow() buildTray() registerHotkey() + startCursorTracking() app.on("activate", () => { if (BrowserWindow.getAllWindows().length === 0) createWindow() }) }) app.on("window-all-closed", () => { /* im Tray weiterlaufen lassen; Beenden nur über Tray/Quit */ }) -app.on("before-quit", () => { stopTtsServer(); globalShortcut.unregisterAll(); tray?.destroy() }) +app.on("before-quit", () => { stopCursorTracking(); stopTtsServer(); globalShortcut.unregisterAll(); tray?.destroy() }) diff --git a/client/lucy-desktop/src/preload/index.ts b/client/lucy-desktop/src/preload/index.ts index db46276..3a5c51f 100644 --- a/client/lucy-desktop/src/preload/index.ts +++ b/client/lucy-desktop/src/preload/index.ts @@ -25,4 +25,10 @@ contextBridge.exposeInMainWorld("lucy", { ipcRenderer.on("lucy:hotkey", h) return () => ipcRenderer.removeListener("lucy:hotkey", h) }, + // Mauszeiger-Position (relativ zu Lucys Kopf) -> Blickfolgen + onCursor: (cb: (p: { x: number; y: number }) => void) => { + const h = (_e: unknown, p: { x: number; y: number }) => cb(p) + ipcRenderer.on("lucy:cursor", h) + return () => ipcRenderer.removeListener("lucy:cursor", h) + }, }) diff --git a/client/lucy-desktop/src/renderer/src/App.tsx b/client/lucy-desktop/src/renderer/src/App.tsx index e6e46e7..b653f15 100644 --- a/client/lucy-desktop/src/renderer/src/App.tsx +++ b/client/lucy-desktop/src/renderer/src/App.tsx @@ -21,6 +21,8 @@ export default function App() { inputMode, setInputMode, vadListening, lookAtScreen } = useVoiceAgent() const holding = useRef(false) const endRef = useRef(null) + const cursor = useRef({ x: 0, y: 0 }) // Mauszeiger relativ zu Lucys Kopf (Blickfolgen) + const pat = useRef(0) // Zaehler: Antippen/Streicheln des Avatars const [mode, setMode] = useState<"full" | "overlay">("full") const [pinned, setPinned] = useState(false) const [ghost, setGhost] = useState(false) // Geistmodus: Fenster durchklickbar (nur Overlay) @@ -49,6 +51,9 @@ export default function App() { }, [ghost, mode]) useEffect(() => { if (mode !== "overlay") setGhost(false) }, [mode]) // Geistmodus nur im Overlay + // Mauszeiger-Verfolgung (MateEngine-Idee): Position vom Main-Prozess in den Avatar-Blick fuettern + useEffect(() => window.lucy?.onCursor((p) => { cursor.current = p }), []) + // Leertaste = Push-to-talk (halten) useEffect(() => { const isField = (el: EventTarget | null) => @@ -126,10 +131,11 @@ export default function App() {
-
+
{ pat.current += 1 }} + title={overlay ? "Ziehen zum Verschieben · Antippen zum Streicheln" : "Antippen zum Streicheln"}>
- + {speaking && lastAssistant &&
{lastAssistant}
} {!ready && (
diff --git a/client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx b/client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx index d028aee..6284ffe 100644 --- a/client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx +++ b/client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx @@ -14,6 +14,8 @@ import type { Emotion } from "../lib/voice/sentiment" type LevelRef = MutableRefObject<{ current: number; aa?: number; ih?: number; ou?: number }> type EmotionRef = MutableRefObject +type CursorRef = MutableRefObject<{ x: number; y: number }> +type NumRef = MutableRefObject // Welche Clips geladen werden (Dateien unter public/vrma/, MIT-Lizenz, siehe ATTRIBUTION.md). // Die .vrma sind GESTEN (kein echter Ruhe-Loop) -> nur fuer klare Zustaende/Einschuebe nutzen, @@ -75,8 +77,9 @@ const EMO_TO_EXPR: Record = { neutral: null, happy: "happy", angry: "angry", sad: "sad", surprised: "surprised", relaxed: "relaxed", } -function VrmModel({ url, audioLevel, emotion, status, onError }: { - url: string; audioLevel: LevelRef; emotion: EmotionRef; status: MutableRefObject; onError: (m: string) => void +function VrmModel({ url, audioLevel, emotion, status, cursor, pat, onError }: { + url: string; audioLevel: LevelRef; emotion: EmotionRef; status: MutableRefObject + cursor?: CursorRef; pat?: NumRef; onError: (m: string) => void }) { const [vrm, setVrm] = useState(null) const smooth = useRef>({}) @@ -86,6 +89,10 @@ function VrmModel({ url, audioLevel, emotion, status, onError }: { const gaze = useRef(new Object3D()) // weit entfernter Blickpunkt (gegen Schielen bei naher Kamera) const headPos = useRef(new Vector3()) const camPos = useRef(new Vector3()) + const camRight = useRef(new Vector3()) + const camUp = useRef(new Vector3()) + const patReact = useRef(0) // 0..1 Reaktion aufs Antippen/Streicheln + const lastPat = useRef(0) // Bewegungs-Clips const mixer = useRef(null) const actions = useRef>({}) @@ -182,6 +189,17 @@ function VrmModel({ url, audioLevel, emotion, status, onError }: { } else { applyIdleProcedural(vrm, tc, target, lean.current, spk) // ruhiger Leerlauf } + // MateEngine-Idee: Kopf dreht sich dezent zum Mauszeiger (Augen folgen unten im lookAt-Block) + const cur = cursor?.current + if (cur) { + const hx = Math.max(-1, Math.min(1, cur.x)), hy = Math.max(-1, Math.min(1, cur.y)) + addBone(vrm, "neck", hy * 0.06, hx * 0.10, 0) + addBone(vrm, "head", hy * 0.08, hx * 0.14, 0) + } + // Antippen/Streicheln: kurze freudige Reaktion (Kopf-Wackeln; Laecheln in der Mimik unten) + if (pat && pat.current !== lastPat.current) { lastPat.current = pat.current; patReact.current = 1 } + patReact.current *= Math.max(0, 1 - delta * 1.4) + if (patReact.current > 0.01) addBone(vrm, "head", -patReact.current * 0.05, 0, Math.sin(tc * 18) * patReact.current * 0.06) // Blick: weit entfernter Punkt in Kamerarichtung -> Augen parallel (kein Schielen), wirkt "auf dich". if (vrm.lookAt) { @@ -190,6 +208,15 @@ function VrmModel({ url, audioLevel, emotion, status, onError }: { if (headNode) headNode.getWorldPosition(hp); else hp.set(0, 1.3, 0) const cp = camPos.current.copy(state.camera.position) gaze.current.position.copy(cp).sub(hp).multiplyScalar(4).add(hp) + // Augen folgen dem Mauszeiger: Blickpunkt in Kamera-Rechts/Hoch-Richtung verschieben + if (cur) { + const e = state.camera.matrixWorld.elements + camRight.current.set(e[0], e[1], e[2]).normalize() + camUp.current.set(e[4], e[5], e[6]).normalize() + const cx = Math.max(-1.5, Math.min(1.5, cur.x)), cy = Math.max(-1.5, Math.min(1.5, cur.y)) + gaze.current.position.addScaledVector(camRight.current, cx * 1.8) + gaze.current.position.addScaledVector(camUp.current, -cy * 1.8) + } // dezente Blick-Mikrobewegung (Sakkaden) -> das Gesicht wirkt nicht eingefroren const s = sac.current s.t += delta @@ -225,6 +252,8 @@ function VrmModel({ url, audioLevel, emotion, status, onError }: { const expr = brk.current.name === "Relax" ? "happy" : "relaxed" em.setValue(expr, Math.max(smooth.current[expr] ?? 0, brk.current.w * 0.35)) } + // Streichel-Reaktion: Laecheln + if (patReact.current > 0.01) em.setValue("happy", Math.max(smooth.current.happy ?? 0, patReact.current * 0.85)) const b = blink.current b.t += delta if (b.active <= 0 && b.t > b.next) { b.active = 0.16; b.t = 0; b.next = 3 + Math.random() * 4 } @@ -238,8 +267,9 @@ function VrmModel({ url, audioLevel, emotion, status, onError }: { return vrm ? : null } -export function Avatar3D({ url, audioLevel, emotion, status = "idle" }: { +export function Avatar3D({ url, audioLevel, emotion, status = "idle", cursor, pat, controls = true }: { url: string; audioLevel: LevelRef; emotion: EmotionRef; status?: string + cursor?: CursorRef; pat?: NumRef; controls?: boolean }) { const [err, setErr] = useState(null) const statusRef = useRef(status); statusRef.current = status @@ -249,9 +279,11 @@ export function Avatar3D({ url, audioLevel, emotion, status = "idle" }: { - - + + {controls && ( + + )} {err && (
Promise onMode: (cb: (m: "full" | "overlay") => void) => () => void onHotkey: (cb: () => void) => () => void + onCursor: (cb: (p: { x: number; y: number }) => void) => () => void captureScreen: () => Promise listWindows: () => Promise<{ id: string; name: string }[]> captureWindow: (id: string) => Promise diff --git a/client/lucy-desktop/src/renderer/src/styles.css b/client/lucy-desktop/src/renderer/src/styles.css index 6bc079d..7b5fb63 100644 --- a/client/lucy-desktop/src/renderer/src/styles.css +++ b/client/lucy-desktop/src/renderer/src/styles.css @@ -43,6 +43,9 @@ body { } .app.overlay .stage { border: none; background: transparent; } .avatarWrap { flex: 1; min-height: 0; position: relative; overflow: hidden; border-radius: 14px; } +/* Overlay: Lucy am Koerper greifen & ueber den Desktop ziehen (Bedienelemente bleiben no-drag) */ +.app.overlay .avatarWrap { -webkit-app-region: drag; } +.app.overlay .overlayBubbles, .app.overlay .overlayBubbles * { -webkit-app-region: no-drag; } /* --- digitaler Raum (animierter Sci-Fi-Backdrop, Etappe 2B) --- */ .digitalRoom { From 38f8c96b665cb711c1f987f766439851680ea03a Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Tue, 30 Jun 2026 19:41:43 +0200 Subject: [PATCH 07/38] Lucy v2 (MateEngine komplett): an den Rand ducken + Tanzen zur Musik Rand-ducken: - Overlay-Fenster gleitet nach ~15s Nicht-Naehe an den Bildschirmrand (Sliver sichtbar), kommt zurueck bei Annaeherung; Tray-Menuepunkt "An den Rand ducken/Hervorholen"; weiche Bounds-Animation (easeInOut) - pinned/full unterdruecken Auto-Ducken; showWin/applyMode setzen sauber zurueck Tanzen zur Musik: - Main: setDisplayMediaRequestHandler -> System-Audio per Loopback fuer getDisplayMedia - useDanceAudio: nimmt System-Ton ab, misst Bass-Energie -> danceLevel (Video-Track verworfen) - Avatar: rhythmische Ganzkoerper-Tanzbewegung + Huepfen, skaliert mit der Energie - "Tanzen"-Knopf im Vollfenster Co-Authored-By: Claude Opus 4.8 --- client/lucy-desktop/src/main/index.ts | 88 ++++++++++++++++--- client/lucy-desktop/src/renderer/src/App.tsx | 8 +- .../src/renderer/src/components/Avatar3D.tsx | 24 +++-- .../renderer/src/lib/voice/useDanceAudio.ts | 48 ++++++++++ .../lucy-desktop/src/renderer/src/styles.css | 9 ++ 5 files changed, 161 insertions(+), 16 deletions(-) create mode 100644 client/lucy-desktop/src/renderer/src/lib/voice/useDanceAudio.ts diff --git a/client/lucy-desktop/src/main/index.ts b/client/lucy-desktop/src/main/index.ts index a05c1cf..3f73c8b 100644 --- a/client/lucy-desktop/src/main/index.ts +++ b/client/lucy-desktop/src/main/index.ts @@ -1,4 +1,4 @@ -import { app, BrowserWindow, ipcMain, Tray, Menu, globalShortcut, nativeImage, desktopCapturer, shell, screen } from "electron" +import { app, BrowserWindow, ipcMain, Tray, Menu, globalShortcut, nativeImage, desktopCapturer, shell, screen, session } from "electron" import { spawn, ChildProcess } from "child_process" import { join } from "path" @@ -33,10 +33,61 @@ function startCursorTracking() { const cx = b.x + b.width / 2 const cy = b.y + b.height * 0.38 // ungefaehre Kopfhoehe im Fenster win.webContents.send("lucy:cursor", { x: (p.x - cx) / Math.max(1, b.width), y: (p.y - cy) / Math.max(1, b.height) }) + // Auto-Ducken: im Overlay nach Nicht-Naehe an den Rand; bei Annaeherung an den Rest hervorholen + if (mode === "overlay" && !pinned && !boundsAnim) { + const now = Date.now() + const inWin = p.x >= b.x && p.y >= b.y && p.x <= b.x + b.width && p.y <= b.y + b.height + if (inWin) lastNear = now + if (!tucked && now - lastNear > AUTO_TUCK_MS) tuckToEdge() + else if (tucked) { + const wa = screen.getDisplayNearestPoint({ x: b.x, y: b.y }).workArea + if (p.x >= wa.x + wa.width - SLIVER - 12 && p.y >= b.y - 12 && p.y <= b.y + b.height + 12) { lastNear = now; untuck() } + } + } }, 40) // ~25 Hz reicht fuers Blickfolgen, kostet kaum Last } function stopCursorTracking() { if (cursorTimer) { clearInterval(cursorTimer); cursorTimer = null } } +// --- An den Rand ducken (MateEngine-Idee) --- +type Rect = { x: number; y: number; width: number; height: number } +let tucked = false +let prevBounds: Rect | null = null +let lastNear = Date.now() +let boundsAnim: ReturnType | null = null +const SLIVER = 58 // sichtbarer Rest am Rand, wenn geduckt +const AUTO_TUCK_MS = 15000 // nach so langer Nicht-Naehe im Overlay automatisch ducken + +function animateBounds(target: Rect, after?: () => void) { + if (!win) return + if (boundsAnim) { clearInterval(boundsAnim); boundsAnim = null } + const start = win.getBounds(); const t0 = Date.now(); const dur = 260 + boundsAnim = setInterval(() => { + if (!win || win.isDestroyed()) { if (boundsAnim) clearInterval(boundsAnim); boundsAnim = null; return } + const k = Math.min(1, (Date.now() - t0) / dur) + const e = k < 0.5 ? 2 * k * k : 1 - Math.pow(-2 * k + 2, 2) / 2 // easeInOutQuad + win.setBounds({ + x: Math.round(start.x + (target.x - start.x) * e), + y: Math.round(start.y + (target.y - start.y) * e), + width: target.width, height: target.height, + }) + if (k >= 1) { if (boundsAnim) clearInterval(boundsAnim); boundsAnim = null; after?.() } + }, 16) +} +function tuckToEdge() { + if (!win || mode !== "overlay" || tucked) return + prevBounds = win.getBounds() + const wa = screen.getDisplayNearestPoint({ x: prevBounds.x, y: prevBounds.y }).workArea + animateBounds({ x: wa.x + wa.width - SLIVER, y: prevBounds.y, width: prevBounds.width, height: prevBounds.height }) + tucked = true; setTrayMenu() +} +function untuck() { + if (!win || !tucked) return + const t = prevBounds || win.getBounds() + animateBounds({ x: t.x, y: t.y, width: t.width, height: t.height }) + tucked = false; setTrayMenu() +} +function toggleTuck() { if (tucked) untuck(); else tuckToEdge() } + async function ensureTtsServer() { try { const r = await fetch(`${TTS}/health`) @@ -56,6 +107,8 @@ function stopTtsServer() { function applyMode(next: "full" | "overlay") { if (!win) return + // beim Verlassen des Overlays ggf. Duck-Zustand zuruecksetzen (Position wiederherstellen) + if (tucked && next !== "overlay") { tucked = false; if (prevBounds) win.setPosition(prevBounds.x, prevBounds.y) } mode = next const overlay = next === "overlay" const size = overlay ? OVERLAY_SIZE : FULL_SIZE @@ -64,6 +117,7 @@ function applyMode(next: "full" | "overlay") { win.setResizable(!overlay) if (overlay) win.setMinimumSize(280, 360); else win.setMinimumSize(420, 420) win.webContents.send("lucy:mode", next) + lastNear = Date.now(); setTrayMenu() } function createWindow() { @@ -85,6 +139,7 @@ function createWindow() { function showWin() { if (!win) { createWindow(); return } if (win.isMinimized()) win.restore() + if (tucked) untuck() win.show(); win.focus() } @@ -99,17 +154,21 @@ function lucyIcon() { return nativeImage.createFromBitmap(buf, { width: s, height: s }) } +function setTrayMenu() { + if (!tray) return + tray.setContextMenu(Menu.buildFromTemplate([ + { label: "Lucy zeigen", click: showWin }, + { label: "Overlay-Modus", type: "checkbox", checked: mode === "overlay", + click: (mi) => { applyMode(mi.checked ? "overlay" : "full"); showWin() } }, + { label: tucked ? "Hervorholen" : "An den Rand ducken", enabled: mode === "overlay", click: toggleTuck }, + { type: "separator" }, + { label: "Beenden", click: () => { app.quit() } }, + ])) +} function buildTray() { tray = new Tray(lucyIcon()) tray.setToolTip("Lucy") - const menu = Menu.buildFromTemplate([ - { label: "Lucy zeigen", click: showWin }, - { label: "Overlay-Modus", type: "checkbox", checked: false, - click: (mi) => { applyMode(mi.checked ? "overlay" : "full"); showWin() } }, - { type: "separator" }, - { label: "Beenden", click: () => { app.quit() } }, - ]) - tray.setContextMenu(menu) + setTrayMenu() tray.on("click", showWin) } @@ -167,8 +226,17 @@ app.whenReady().then(() => { buildTray() registerHotkey() startCursorTracking() + // Tanzen zur Musik: System-Audio (Loopback) fuer getDisplayMedia bereitstellen, ohne System-Picker + session.defaultSession.setDisplayMediaRequestHandler((_req, callback) => { + desktopCapturer.getSources({ types: ["screen"] }) + .then((sources) => callback({ video: sources[0], audio: "loopback" })) + .catch(() => { try { callback({}) } catch { /* */ } }) + }, { useSystemPicker: false }) app.on("activate", () => { if (BrowserWindow.getAllWindows().length === 0) createWindow() }) }) app.on("window-all-closed", () => { /* im Tray weiterlaufen lassen; Beenden nur über Tray/Quit */ }) -app.on("before-quit", () => { stopCursorTracking(); stopTtsServer(); globalShortcut.unregisterAll(); tray?.destroy() }) +app.on("before-quit", () => { + if (boundsAnim) clearInterval(boundsAnim) + stopCursorTracking(); stopTtsServer(); globalShortcut.unregisterAll(); tray?.destroy() +}) diff --git a/client/lucy-desktop/src/renderer/src/App.tsx b/client/lucy-desktop/src/renderer/src/App.tsx index b653f15..4577ace 100644 --- a/client/lucy-desktop/src/renderer/src/App.tsx +++ b/client/lucy-desktop/src/renderer/src/App.tsx @@ -3,6 +3,7 @@ import { Avatar3D } from "./components/Avatar3D" import { AuraGlow } from "./components/AuraGlow" import { ChatMarkdown } from "./components/ChatMarkdown" import { useVoiceAgent } from "./lib/voice/useVoiceAgent" +import { useDanceAudio } from "./lib/voice/useDanceAudio" const FIXED_AVATAR = "/avatar.vrm" @@ -19,6 +20,7 @@ const STATUS_LABEL: Record = { export default function App() { const { status, ready, messages, error, recording, audioLevel, emotion, pressStart, pressEnd, reset, inputMode, setInputMode, vadListening, lookAtScreen } = useVoiceAgent() + const { danceLevel, dancing, toggleDance } = useDanceAudio() const holding = useRef(false) const endRef = useRef(null) const cursor = useRef({ x: 0, y: 0 }) // Mauszeiger relativ zu Lucys Kopf (Blickfolgen) @@ -135,7 +137,7 @@ export default function App() { title={overlay ? "Ziehen zum Verschieben · Antippen zum Streicheln" : "Antippen zum Streicheln"}>
- + {speaking && lastAssistant &&
{lastAssistant}
} {!ready && (
@@ -183,6 +185,10 @@ export default function App() {
)} + {ready && ( + + )} {!overlay && (
{inputMode === "vad" diff --git a/client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx b/client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx index 6284ffe..91f5245 100644 --- a/client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx +++ b/client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx @@ -77,9 +77,9 @@ const EMO_TO_EXPR: Record = { neutral: null, happy: "happy", angry: "angry", sad: "sad", surprised: "surprised", relaxed: "relaxed", } -function VrmModel({ url, audioLevel, emotion, status, cursor, pat, onError }: { +function VrmModel({ url, audioLevel, emotion, status, cursor, pat, dance, onError }: { url: string; audioLevel: LevelRef; emotion: EmotionRef; status: MutableRefObject - cursor?: CursorRef; pat?: NumRef; onError: (m: string) => void + cursor?: CursorRef; pat?: NumRef; dance?: NumRef; onError: (m: string) => void }) { const [vrm, setVrm] = useState(null) const smooth = useRef>({}) @@ -200,6 +200,20 @@ function VrmModel({ url, audioLevel, emotion, status, cursor, pat, onError }: { if (pat && pat.current !== lastPat.current) { lastPat.current = pat.current; patReact.current = 1 } patReact.current *= Math.max(0, 1 - delta * 1.4) if (patReact.current > 0.01) addBone(vrm, "head", -patReact.current * 0.05, 0, Math.sin(tc * 18) * patReact.current * 0.06) + // Tanzen zur Musik: rhythmische Ganzkoerper-Bewegung, skaliert mit der Bass-Energie + const dl = dance?.current ?? 0 + if (dl > 0.03) { + const bt = tc * 5.5 + addBone(vrm, "hips", 0, Math.sin(bt * 0.5) * 0.14 * dl, Math.sin(bt) * 0.07 * dl) + addBone(vrm, "spine", 0, Math.sin(bt * 0.5) * 0.06 * dl, Math.sin(bt) * 0.06 * dl) + addBone(vrm, "chest", 0, 0, Math.sin(bt + 0.5) * 0.05 * dl) + addBone(vrm, "head", Math.sin(bt) * 0.05 * dl, Math.sin(bt * 0.5) * 0.05 * dl, Math.sin(bt) * 0.05 * dl) + addBone(vrm, "leftUpperArm", 0, 0, Math.sin(bt) * 0.3 * dl) + addBone(vrm, "rightUpperArm", 0, 0, -Math.sin(bt) * 0.3 * dl) + vrm.scene.position.y = Math.abs(Math.sin(bt)) * 0.05 * dl // Huepfen + } else if (vrm.scene.position.y !== 0) { + vrm.scene.position.y += (0 - vrm.scene.position.y) * Math.min(1, delta * 5) + } // Blick: weit entfernter Punkt in Kamerarichtung -> Augen parallel (kein Schielen), wirkt "auf dich". if (vrm.lookAt) { @@ -267,9 +281,9 @@ function VrmModel({ url, audioLevel, emotion, status, cursor, pat, onError }: { return vrm ? : null } -export function Avatar3D({ url, audioLevel, emotion, status = "idle", cursor, pat, controls = true }: { +export function Avatar3D({ url, audioLevel, emotion, status = "idle", cursor, pat, dance, controls = true }: { url: string; audioLevel: LevelRef; emotion: EmotionRef; status?: string - cursor?: CursorRef; pat?: NumRef; controls?: boolean + cursor?: CursorRef; pat?: NumRef; dance?: NumRef; controls?: boolean }) { const [err, setErr] = useState(null) const statusRef = useRef(status); statusRef.current = status @@ -279,7 +293,7 @@ export function Avatar3D({ url, audioLevel, emotion, status = "idle", cursor, pa - + {controls && ( diff --git a/client/lucy-desktop/src/renderer/src/lib/voice/useDanceAudio.ts b/client/lucy-desktop/src/renderer/src/lib/voice/useDanceAudio.ts new file mode 100644 index 0000000..5dde94c --- /dev/null +++ b/client/lucy-desktop/src/renderer/src/lib/voice/useDanceAudio.ts @@ -0,0 +1,48 @@ +import { useCallback, useEffect, useRef, useState } from "react" + +// Tanzen zur Musik (MateEngine-Idee): nimmt den SYSTEM-Ton per Loopback ab (getDisplayMedia, der +// Main-Prozess liefert audio:"loopback") und misst die Bass-Energie. Daraus speist sich danceLevel, +// das der Avatar in eine rhythmische Tanzbewegung umsetzt. Kein Video wird verwendet (Track sofort gestoppt). +export function useDanceAudio() { + const level = useRef(0) + const [dancing, setDancing] = useState(false) + const ctxRef = useRef(null) + const streamRef = useRef(null) + const rafRef = useRef(0) + + const stop = useCallback(() => { + cancelAnimationFrame(rafRef.current) + streamRef.current?.getTracks().forEach((t) => { try { t.stop() } catch { /* */ } }) + streamRef.current = null + ctxRef.current?.close().catch(() => {}); ctxRef.current = null + level.current = 0; setDancing(false) + }, []) + + const start = useCallback(async () => { + try { + // Video wird vom Handler verlangt, brauchen wir aber nicht -> sofort stoppen, nur Audio behalten + const stream = await navigator.mediaDevices.getDisplayMedia({ video: true, audio: true }) + stream.getVideoTracks().forEach((t) => t.stop()) + if (stream.getAudioTracks().length === 0) { stream.getTracks().forEach((t) => t.stop()); throw new Error("kein System-Audio") } + const ctx = new (window.AudioContext || (window as any).webkitAudioContext)() + const src = ctx.createMediaStreamSource(stream) + const an = ctx.createAnalyser(); an.fftSize = 256; an.smoothingTimeConstant = 0.7 + src.connect(an) + const freq = new Uint8Array(an.frequencyBinCount) + const tick = () => { + an.getByteFrequencyData(freq) + let s = 0; for (let i = 1; i < 10; i++) s += freq[i] // Bass-/Kick-Bereich + level.current = Math.min(1, (s / 9 / 255) * 1.7) + rafRef.current = requestAnimationFrame(tick) + } + tick() + ctxRef.current = ctx; streamRef.current = stream + setDancing(true) + } catch (e) { console.error("Tanz-Audio:", e); stop() } + }, [stop]) + + const toggleDance = useCallback(() => { dancing ? stop() : void start() }, [dancing, start, stop]) + + useEffect(() => () => stop(), [stop]) + return { danceLevel: level, dancing, toggleDance } +} diff --git a/client/lucy-desktop/src/renderer/src/styles.css b/client/lucy-desktop/src/renderer/src/styles.css index 7b5fb63..90849ff 100644 --- a/client/lucy-desktop/src/renderer/src/styles.css +++ b/client/lucy-desktop/src/renderer/src/styles.css @@ -176,6 +176,15 @@ body { .app.overlay .modeToggle { display: none; } .vadDot { width: 7px; height: 7px; border-radius: 50%; background: #34d399; box-shadow: 0 0 8px #34d399; animation: pulse 1s infinite; } +.danceBtn { + border: 1px solid rgba(167,139,250,0.35); background: rgba(167,139,250,0.12); color: #c4b5fd; + font-size: 11px; padding: 4px 12px; border-radius: 9px; cursor: pointer; -webkit-app-region: no-drag; + transition: background 0.12s, color 0.12s; +} +.danceBtn:hover { background: rgba(167,139,250,0.22); color: #ddd6fe; } +.danceBtn.on { background: rgba(167,139,250,0.3); color: #ede9fe; border-color: rgba(167,139,250,0.6); } +.app.overlay .danceBtn { display: none; } /* im Overlay kein Platz -> nur im Vollfenster */ + .side { width: 320px; flex-shrink: 0; display: flex; flex-direction: column; border: 1px solid rgba(255,255,255,0.07); border-radius: 14px; background: rgba(255,255,255,0.02); From 3c0a24feb7b23caf3686af87f4a50f0149111503 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Tue, 30 Jun 2026 21:34:37 +0200 Subject: [PATCH 08/38] Lucy v2: Blick-Vertikale korrigiert + Performance entschaerft - Mauszeiger-Verfolgung: Hoch/Runter war invertiert -> Vorzeichen fuer Augen + Kopf/Nacken gedreht - Performance: animierten filter:blur (Aurora) entfernt, dpr auf [1,1.5] gedeckelt, Partikel auf eine Ebene reduziert (Ruckeln gemeldet) - (visuelle Abnahme durch User steht noch aus) Co-Authored-By: Claude Opus 4.8 --- .../src/renderer/src/components/Avatar3D.tsx | 9 ++++---- .../lucy-desktop/src/renderer/src/styles.css | 22 +++++++------------ 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx b/client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx index 91f5245..e1893fb 100644 --- a/client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx +++ b/client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx @@ -193,8 +193,8 @@ function VrmModel({ url, audioLevel, emotion, status, cursor, pat, dance, onErro const cur = cursor?.current if (cur) { const hx = Math.max(-1, Math.min(1, cur.x)), hy = Math.max(-1, Math.min(1, cur.y)) - addBone(vrm, "neck", hy * 0.06, hx * 0.10, 0) - addBone(vrm, "head", hy * 0.08, hx * 0.14, 0) + addBone(vrm, "neck", -hy * 0.06, hx * 0.10, 0) + addBone(vrm, "head", -hy * 0.08, hx * 0.14, 0) } // Antippen/Streicheln: kurze freudige Reaktion (Kopf-Wackeln; Laecheln in der Mimik unten) if (pat && pat.current !== lastPat.current) { lastPat.current = pat.current; patReact.current = 1 } @@ -229,7 +229,7 @@ function VrmModel({ url, audioLevel, emotion, status, cursor, pat, dance, onErro camUp.current.set(e[4], e[5], e[6]).normalize() const cx = Math.max(-1.5, Math.min(1.5, cur.x)), cy = Math.max(-1.5, Math.min(1.5, cur.y)) gaze.current.position.addScaledVector(camRight.current, cx * 1.8) - gaze.current.position.addScaledVector(camUp.current, -cy * 1.8) + gaze.current.position.addScaledVector(camUp.current, cy * 1.8) } // dezente Blick-Mikrobewegung (Sakkaden) -> das Gesicht wirkt nicht eingefroren const s = sac.current @@ -289,7 +289,8 @@ export function Avatar3D({ url, audioLevel, emotion, status = "idle", cursor, pa const statusRef = useRef(status); statusRef.current = status return (
- + diff --git a/client/lucy-desktop/src/renderer/src/styles.css b/client/lucy-desktop/src/renderer/src/styles.css index 90849ff..6009ed4 100644 --- a/client/lucy-desktop/src/renderer/src/styles.css +++ b/client/lucy-desktop/src/renderer/src/styles.css @@ -57,12 +57,12 @@ body { linear-gradient(180deg, #0b0b15 0%, #07070d 100%); box-shadow: inset 0 0 130px 36px rgba(0,0,0,0.55); /* Vignette -> Tiefe */ } -.digitalRoom::before { /* sanft driftendes Aurora-Licht */ - content: ""; position: absolute; inset: -20%; z-index: 0; +.digitalRoom::before { /* sanft driftendes Aurora-Licht (KEIN filter:blur -> Verlaeufe sind weich genug, spart GPU) */ + content: ""; position: absolute; inset: -20%; z-index: 0; will-change: transform; background: radial-gradient(40% 40% at 30% 32%, rgba(125,211,252,0.12), transparent 70%), radial-gradient(45% 45% at 74% 42%, rgba(167,139,250,0.12), transparent 70%); - filter: blur(22px); animation: auroraDrift 22s ease-in-out infinite alternate; + animation: auroraDrift 26s ease-in-out infinite alternate; } .digitalRoom::after { /* perspektivisches Neon-Gitter am Boden */ content: ""; position: absolute; left: -25%; right: -25%; bottom: -12%; height: 58%; @@ -73,21 +73,15 @@ body { -webkit-mask-image: linear-gradient(transparent, #000 65%); animation: gridDrift 14s linear infinite; } -/* schwebende Partikel (zwei Ebenen -> Parallax-Tiefe), nahtlos gekachelt */ +/* schwebende Partikel (eine Ebene, nahtlos gekachelt) -> dezente Tiefe, guenstig */ .dust { - position: absolute; inset: 0; z-index: 0; pointer-events: none; opacity: 0.7; - background-image: radial-gradient(1.6px 1.6px at 50% 50%, rgba(125,211,252,0.55), transparent 60%); - background-size: 96px 96px; animation: dustRise 24s linear infinite; -} -.dust::after { - content: ""; position: absolute; inset: 0; - background-image: radial-gradient(1.3px 1.3px at 30% 70%, rgba(167,139,250,0.5), transparent 60%); - background-size: 140px 140px; animation: dustRise2 38s linear infinite; + position: absolute; inset: 0; z-index: 0; pointer-events: none; opacity: 0.6; + background-image: radial-gradient(1.6px 1.6px at 50% 50%, rgba(125,211,252,0.5), transparent 60%); + background-size: 110px 110px; animation: dustRise 30s linear infinite; } @keyframes gridDrift { to { background-position: 0 46px, 46px 0; } } @keyframes auroraDrift { from { transform: translate(-3%, -2%) scale(1); } to { transform: translate(4%, 3%) scale(1.08); } } -@keyframes dustRise { to { background-position: 0 -96px; } } -@keyframes dustRise2 { to { background-position: 0 -140px; } } +@keyframes dustRise { to { background-position: 0 -110px; } } .app.overlay .digitalRoom { display: none; } /* Overlay floatet -> nur Avatar + Aura */ .aura { position: absolute; inset: 0; z-index: 1; pointer-events: none; will-change: transform, opacity; } From 996715533279b31d6ef4ccd879e144edfe6b41c8 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 2 Jul 2026 10:29:01 +0200 Subject: [PATCH 09/38] Backend: Box-Sync + Drift-Fixes (Review P0-3) - deploy/llama-swap.config.yaml: Live-Box-Config jetzt versioniert (war untracked + veraltet) - config.py: Template -fa 1 -> -fa on (Box-Standard) - llamaswap.py: cache-reuse NICHT bei mmproj-Modellen anhaengen (verifizierte Vision-Falle) - voice.py: Thinking-Deaktivierung fuer Voice-Chat (MC_VOICE_NO_THINK) - connect.py: IDE-Snippets zeigen nur noch die coding-Lane Co-Authored-By: Claude Fable 5 --- backend/config.py | 2 +- backend/routers/voice.py | 5 ++++ backend/services/connect.py | 20 ++++++------- backend/services/llamaswap.py | 4 ++- deploy/llama-swap.config.yaml | 56 +++++++++++++++++++++++++++++++++++ 5 files changed, 75 insertions(+), 12 deletions(-) create mode 100644 deploy/llama-swap.config.yaml diff --git a/backend/config.py b/backend/config.py index 051092e..0f7058c 100644 --- a/backend/config.py +++ b/backend/config.py @@ -32,7 +32,7 @@ MEM0_SERVICE_URL = os.environ.get("MC_MEM0_SERVICE_URL", "http://127.0.0.1:8765" # macht llama-server ohnehin automatisch pro Slot (KV-Reuse). _DEFAULT_CMD_TEMPLATE = ( "llama-server -m {model} --host 127.0.0.1 --port ${PORT} " - "-c {ctx} -ngl 999 -fa 1 --no-mmap" + "-c {ctx} -ngl 999 -fa on --no-mmap" ) CMD_TEMPLATE = os.environ.get("MC_CMD_TEMPLATE", _DEFAULT_CMD_TEMPLATE) if "{model}" not in CMD_TEMPLATE: diff --git a/backend/routers/voice.py b/backend/routers/voice.py index 72a7ceb..2ce0980 100644 --- a/backend/routers/voice.py +++ b/backend/routers/voice.py @@ -208,6 +208,11 @@ async def voice_chat(body: ChatIn) -> StreamingResponse: user_text = f"[Bildschirm-Sicht — das ist gerade auf dem/den Schirm(en) zu sehen:\n{safe_desc}\n]\n\n{body.text}" messages.append({"role": "user", "content": user_text}) payload = {"model": body.model or HERMES_API_MODEL, "messages": messages, "stream": True} + # Lucys Hirn (Qwen3.6) ist ein Thinking-Modell -> für die gesprochene Assistentin Thinking AUS, + # sonst generiert es tausende Reasoning-Token VOR der kurzen Antwort (gemessen: 11k Token, ~30s TTFB). + # Gleiches Muster wie die fast-Spur im Gateway (gateway_proxy.py) und die Mem0-Extraktion. + if os.environ.get("MC_VOICE_NO_THINK", "1") not in ("0", "false", "False"): + payload["chat_template_kwargs"] = {"enable_thinking": False} headers = { "Authorization": f"Bearer {HERMES_API_KEY}", "X-Hermes-Session-Id": body.session_id, diff --git a/backend/services/connect.py b/backend/services/connect.py index d7fb102..df6c794 100644 --- a/backend/services/connect.py +++ b/backend/services/connect.py @@ -15,9 +15,9 @@ from config import LLAMA_SWAP_URL, MEM0_SERVICE_URL, PORT DEFAULT_HOST = "192.168.178.151" -# Modelle/Lanes, die der Gateway anbietet. Lanes zuerst: 'coding' (agentischer Coder) ist der -# Standard für IDEs, 'chat' für Allgemeines; dahinter die direkten Aliase. -GATEWAY_MODELS = ["coding", "chat", "fast", "heavy", "coder", "vision"] +# IDEs bekommen NUR die 'coding'-Lane zu sehen — die Lane routet intern selbst auf das +# passende Modell (Coder/Heavy/…). Ein einziger Eintrag, kein manuelles Modell-Wählen mehr. +IDE_MODEL = "coding" def _gw(host: str) -> str: @@ -44,7 +44,7 @@ def build_snippets(host: str = DEFAULT_HOST, "npm": "@ai-sdk/openai-compatible", "name": "Bosgame Gateway", "options": {"baseURL": gw, "apiKey": "local"}, - "models": {m: {"name": m} for m in GATEWAY_MODELS}, + "models": {IDE_MODEL: {"name": IDE_MODEL}}, } } }, indent=2) @@ -61,8 +61,8 @@ def build_snippets(host: str = DEFAULT_HOST, "bosgame": { "api_url": gw, "available_models": [ - {"name": m, "display_name": m, "max_tokens": 131072, - "capabilities": {"tools": True}} for m in GATEWAY_MODELS + {"name": IDE_MODEL, "display_name": IDE_MODEL, "max_tokens": 131072, + "capabilities": {"tools": True}} ], } } @@ -70,15 +70,15 @@ def build_snippets(host: str = DEFAULT_HOST, "assistant": { "default_model": { "provider": "openai_compatible", - "model": "coding" + "model": IDE_MODEL } } }, indent=2) cont = json.dumps({ "models": [ - {"title": f"Bosgame / {m}", "provider": "openai", "model": m, - "apiBase": gw, "apiKey": "local"} for m in ("coding", "chat", "coder") + {"title": f"Bosgame / {IDE_MODEL}", "provider": "openai", "model": IDE_MODEL, + "apiBase": gw, "apiKey": "local"} ] }, indent=2) @@ -115,7 +115,7 @@ def build_snippets(host: str = DEFAULT_HOST, # Leitung 1 — das MODELL. Alle Snippets zeigen auf den OpenAI-kompatiblen Gateway. "tools": { "cline": {"label": "Roo Code / Cline", "lang": "json", "snippet": cline, - "note": "OpenAI-Provider → Gateway. Lane 'coding' (agentischer Coder); 'chat' für Allgemeines."}, + "note": "OpenAI-Provider → Gateway. Nur Lane 'coding' — die Box routet intern selbst."}, "cursor": {"label": "Cursor", "lang": "json", "snippet": cursor, "note": "Einstellungen ➔ Models ➔ OpenAI API key + Base URL."}, "opencode": {"label": "OpenCode", "lang": "jsonc", "snippet": opencode, diff --git a/backend/services/llamaswap.py b/backend/services/llamaswap.py index dea4396..c4791a1 100644 --- a/backend/services/llamaswap.py +++ b/backend/services/llamaswap.py @@ -221,7 +221,9 @@ def register_model(model_path: str, role: str | None = None, ctx: int = 8192, # KV-Cache-Reuse über Turns (Prompt-Cache wiederverwenden) — hilft allen Chat-Modellen # (Agent-Hirn, Coding, Multi-Turn). Spiegelt die auf der Box bewährten Flags wider, damit # neu installierte Modelle nicht hinter dem hand-getunten Stand zurückbleiben (Drift-Fix). - if "--cache-reuse" not in cmd: + # NICHT bei Vision-Modellen: --cache-reuse + --mmproj bricht llama-server (live verifiziert, + # deshalb fahren vision/scout auf der Box ohne cache-reuse). + if "--cache-reuse" not in cmd and "--mmproj" not in cmd: cmd += " --cache-reuse 256 -cram 16384" # IDE-Coding profitiert von Nebenläufigkeit; sonst Default 1 Slot = voller Kontext/Anfrage # (--parallel teilt den Kontext HART auf die Slots auf, s. docs/OPTIMIZATION_PLAN.md §9.4 V6). diff --git a/deploy/llama-swap.config.yaml b/deploy/llama-swap.config.yaml new file mode 100644 index 0000000..67f3c93 --- /dev/null +++ b/deploy/llama-swap.config.yaml @@ -0,0 +1,56 @@ +# Auto-generiert von provision.sh - per Mission Control erweiterbar +healthCheckTimeout: 300 +globalTTL: 0 + +models: + Qwen3.6-35B-A3B: + cmd: | + llama-server -m /srv/models/Qwen3.6-35B-A3B-MTP-GGUF/Qwen3.6-35B-A3B-UD-Q4_K_M.gguf --host 127.0.0.1 --port ${PORT} -c 65536 -ngl 999 -fa on --no-mmap --jinja --parallel 1 -cram 16384 --spec-type draft-mtp --spec-draft-n-max 3 + ttl: 0 + aliases: + - hermes + - fast + Qwen3.5-122B-A10B: + cmd: | + llama-server -m /srv/models/Qwen3.5-122B-A10B-GGUF/Q4_K_M/Qwen3.5-122B-A10B-Q4_K_M-00001-of-00003.gguf --host 127.0.0.1 --port ${PORT} -c 32768 -ngl 999 -fa on --no-mmap --jinja --cache-reuse 256 -cram 16384 + ttl: 600 + aliases: + - heavy + Qwen3-Coder-Next: + cmd: | + llama-server -m /srv/models/Qwen3-Coder-Next-GGUF/Qwen3-Coder-Next-Q4_K_M.gguf --host 127.0.0.1 --port ${PORT} -c 131072 -ngl 999 -fa on --no-mmap --jinja --cache-reuse 256 -cram 16384 + ttl: 600 + aliases: + - coder + Qwen3-VL-8B-Instruct: + cmd: | + llama-server -m /srv/models/Qwen3-VL-8B-Instruct-GGUF/Qwen3VL-8B-Instruct-Q4_K_M.gguf --host 127.0.0.1 --port ${PORT} -c 32768 -ngl 999 -fa on --no-mmap --mmproj /srv/models/Qwen3-VL-8B-Instruct-GGUF/mmproj-Qwen3VL-8B-Instruct-F16.gguf --jinja + ttl: 300 + aliases: + - vision + Qwen3-Embedding-0.6B: + cmd: | + llama-server -m /srv/models/Qwen3-Embedding-0.6B-GGUF/Qwen3-Embedding-0.6B-Q8_0.gguf --host 127.0.0.1 --port ${PORT} --embedding --pooling last -ngl 999 -fa on --no-mmap -c 8192 + ttl: 0 + aliases: + - embed + Qwen3-Coder-30B-A3B-Instruct: + cmd: | + llama-server -m /srv/models/Qwen3-Coder-30B-A3B-Instruct-GGUF/Qwen3-Coder-30B-A3B-Instruct-Q4_K_M.gguf --host 127.0.0.1 --port ${PORT} -c 131072 -ngl 999 -fa on --no-mmap --jinja --cache-reuse 256 -cram 16384 + ttl: 300 + aliases: + - coder-lite + GLM-4.6V-Flash: + cmd: | + llama-server -m /srv/models/GLM-4.6V-Flash-GGUF/GLM-4.6V-Flash-Q4_K_M.gguf --host 127.0.0.1 --port ${PORT} -c 131072 -ngl 999 -fa on --no-mmap --mmproj /srv/models/GLM-4.6V-Flash-GGUF/mmproj-BF16.gguf --jinja + ttl: 300 + aliases: + - scout +groups: + brains: + swap: false + persist: true + members: + - Qwen3-Embedding-0.6B + - Qwen3-VL-8B-Instruct + - Qwen3.6-35B-A3B From 2db839aef9d71c5c0995dec65f726adb4cfc735c Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 2 Jul 2026 10:29:12 +0200 Subject: [PATCH 10/38] Memory-Guards + Voice-Sidecar-Install robuster - mem0_service: Junk-Fact-Guard post-extraction (Regex + sofortiges Delete), custom_instructions praezisiert - mc2-memory-Plugin: Recall-Schwelle 0.3->0.5, Trivial-Turn-Filter (Begruessung/Quittungen nicht lernen) - voice_service/install.sh: Python-3.12-venv via uv, Piper-Binary + DE-Stimmen, Chatterbox best-effort Co-Authored-By: Claude Fable 5 --- hermes/plugins/mc2-memory/__init__.py | 25 +++++++++++- mem0_service/app.py | 57 ++++++++++++++++++++++++--- voice_service/install.sh | 36 ++++++++++++----- 3 files changed, 101 insertions(+), 17 deletions(-) diff --git a/hermes/plugins/mc2-memory/__init__.py b/hermes/plugins/mc2-memory/__init__.py index e19c56e..9fba4fb 100644 --- a/hermes/plugins/mc2-memory/__init__.py +++ b/hermes/plugins/mc2-memory/__init__.py @@ -24,6 +24,7 @@ from __future__ import annotations import logging import os import queue +import re import threading import time from typing import Any, Dict, List, Optional @@ -37,8 +38,11 @@ log = logging.getLogger(__name__) MC_URL = os.environ.get("MC_URL", "http://127.0.0.1:9001").rstrip("/") MC_TOKEN = os.environ.get("MC_TOKEN", "") RECALL_LIMIT = int(os.environ.get("MC2_MEMORY_RECALL_LIMIT", "5")) -RECALL_MIN_SCORE = float(os.environ.get("MC2_MEMORY_RECALL_MIN_SCORE", "0.3")) -MIN_USER_LEN = int(os.environ.get("MC2_MEMORY_MIN_USER_LEN", "12")) # zu Kurzes nicht lernen +# 0.5 statt 0.3: nur starke Treffer einblenden → weniger Rausch-Fakten UND ein stabilerer +# Prompt-Prefix (oft leer), damit --cache-reuse über Turns greift. +RECALL_MIN_SCORE = float(os.environ.get("MC2_MEMORY_RECALL_MIN_SCORE", "0.5")) +# 25 statt 12: triviale Kurz-Turns (Begrüßung/Quittung) gar nicht erst zum Lernen schicken. +MIN_USER_LEN = int(os.environ.get("MC2_MEMORY_MIN_USER_LEN", "25")) # zu Kurzes nicht lernen # Anti-Memory-Poisoning (Stufe 0 Security): aus Turns mit untrusted Bildschirm-/Web-Inhalt NICHT # auto-lernen. Lucys Bildschirm-Sicht prependet diesen Marker an die User-Message (voice.py); auf dem # Schirm sichtbarer Text könnte Injection-Anweisungen tragen, die sonst DAUERHAFT ins Gedächtnis @@ -46,6 +50,20 @@ MIN_USER_LEN = int(os.environ.get("MC2_MEMORY_MIN_USER_LEN", "12")) # zu Kurzes SKIP_UNTRUSTED = os.environ.get("MC2_MEMORY_SKIP_UNTRUSTED", "1") not in ("0", "false", "False", "no") UNTRUSTED_MARKERS = ("[Bildschirm-Sicht",) +# Triviale Turns, die keinen dauerhaften Fakt tragen (reine Begrüßung/Quittung, Aufwärm-/Test- +# Kommandos) → gar nicht erst zum Auto-Lernen schicken. Spart Extraktions-Läufe und verhindert +# Müll-Fakten aus Meta-/Ablauf-Turns. +_TRIVIAL_TURN_RE = re.compile( + r"^\s*(?:(?:hi|hallo|hey|moin|servus|guten\s+(?:morgen|tag|abend)|danke\w*|" + r"ok(?:ay)?|alles\s+klar|passt|super|top|cool|nice|ja|nein|jo|jup|jap)[\s.,!?]*)+$" + r"|^\s*(?:aufw(?:ä|ae)rmen|/?test)\b", + re.IGNORECASE, +) + + +def _is_trivial_turn(text: str) -> bool: + return bool(_TRIVIAL_TURN_RE.search(text or "")) + def _headers() -> dict: return {"X-MC-Token": MC_TOKEN} if MC_TOKEN else {} @@ -124,6 +142,9 @@ class MC2MemoryProvider(MemoryProvider): u = (user_content or "").strip() if len(u) < MIN_USER_LEN: return + if _is_trivial_turn(u): + log.debug("mc2-memory: trivialer Turn (Begrüßung/Quittung/Aufwärmen) — Auto-Lernen übersprungen") + return if SKIP_UNTRUSTED and any(m in u for m in UNTRUSTED_MARKERS): log.debug("mc2-memory: Turn mit untrusted Bildschirm-/Web-Inhalt — Auto-Lernen übersprungen") return diff --git a/mem0_service/app.py b/mem0_service/app.py index c9cb1b9..75b65b5 100644 --- a/mem0_service/app.py +++ b/mem0_service/app.py @@ -20,6 +20,7 @@ Bind: 127.0.0.1 (nur lokal; MC2 proxyt nach außen). import logging import os +import re from contextlib import asynccontextmanager from fastapi import FastAPI, HTTPException @@ -95,12 +96,19 @@ def build_memory() -> Memory: "custom_instructions": ( "RELEVANZ (ZWINGEND, WICHTIGSTE REGEL): Extrahiere NUR dauerhaft nützliche Fakten ÜBER DEN " "NUTZER (Identität, Vorlieben, Arbeitsweise), seine Projekte/Entscheidungen/Stände, stabile " - "Fakten über Stack/Tools/Infrastruktur sowie verbindliche Regeln und Workflows. IGNORIERE " - "VOLLSTÄNDIG und gib KEINE Fakten zurück bei: Tagesnachrichten und Welt-/Politik-/Börsen-/" - "Promi-Ereignissen, Wetter, allgemeinem Weltwissen ohne Bezug zum Nutzer, vom Assistenten " - "erzeugten Zusammenfassungen oder Recherche-Ergebnissen, Smalltalk, sowie Meta-Aussagen über " - "den Gesprächsverlauf (z.B. 'der Nutzer fragt nach X', 'der Nutzer möchte Y prüfen', 'der " - "Assistent tat Z'). Speichere nur, was in Wochen noch nützlich ist; im Zweifel NICHT speichern. " + "Fakten über Stack/Tools/Infrastruktur sowie verbindliche Regeln und Workflows. " + "NIEMALS FAKTEN ÜBER DEN ASSISTENTEN SELBST (ZWINGEND): Extrahiere KEINE Aussagen über den " + "Assistenten/die KI (Hermes, Lucy), seine Fähigkeiten, seinen Zustand, seine Tools/MCP-Server, " + "seine Cronjobs, Commit-/Versionsstände oder welche Modelle er nutzt. Das Subjekt eines Fakts " + "ist IMMER der Nutzer oder sein Projekt — niemals 'der Assistent', 'Hermes' oder 'Lucy'. " + "KEINE ZEITGEBUNDENEN ZUSTÄNDE: Ignoriere transiente Momentaufnahmen (Fehler-/Job-Läufe, " + "Commit-Rückstand, Versions-Updates, 'gerade dabei'-/'hochgefahren'-/'aufgewärmt'-Status, " + "Test- und Onboarding-Fragen). IGNORIERE VOLLSTÄNDIG und gib KEINE Fakten zurück bei: " + "Tagesnachrichten und Welt-/Politik-/Börsen-/Promi-Ereignissen, Wetter, allgemeinem Weltwissen " + "ohne Bezug zum Nutzer, vom Assistenten erzeugten Zusammenfassungen oder Recherche-Ergebnissen, " + "Smalltalk, sowie Meta-Aussagen über den Gesprächsverlauf (z.B. 'der Nutzer fragt nach X', " + "'der Nutzer möchte Y prüfen', 'der Assistent tat Z'). Speichere nur, was in Wochen noch " + "nützlich ist; im Zweifel NICHT speichern. " "SPRACHE (ZWINGEND): Formuliere ALLE Fakten auf DEUTSCH — unabhängig von der " "Eingabesprache, niemals auf Englisch übersetzen. Eigennamen, Befehle, Pfade, Modell- und " "Produktnamen sowie etablierte Fachbegriffe (z.B. PowerShell-Push, Deploy, Qwen3.6, Neovim, " @@ -327,6 +335,30 @@ def classify_facts(facts: list[tuple[str, str]]) -> dict: return {} +# Deterministischer Guard: mem0-OSS extrahiert trotz custom_instructions hartnäckig Fakten ÜBER +# den Assistenten selbst (Hermes/Lucy) und transiente Zustände (Commit-Rückstand, Cronjob-Läufe, +# Onboarding-/Test-Fragen). Diese Muster werden nach der Extraktion verworfen (der Fakt wird wieder +# gelöscht) — reine Sicherungsschicht, unabhängig vom Extraktions-LLM. +_JUNK_FACT_PATTERNS = [ + r"^\s*(?:der|die|das)\s+assistent", # "Der Assistent ..." (Selbstbeschreibung) + r"\bassistent(?:in)?\s+(?:hermes|lucy)\b", # "... Assistent Hermes/Lucy ..." + r"\bhermes[- ]agent\b", + r"commits?\s+hinter", # Versions-Rückstand (transient) + r"\bcronjob\b", + r"beim\s+letzten\s+(?:lauf|mal)", + r"onboarding[-\s]?frage|\btest-?frage\b", + r"hat\s+den\s+assistenten\s+gebeten", + r"auf\s+betriebstemperatur|hochgefahren", + r"aktualisiert\s+sein\s+ged(?:ä|ae)chtnis", # Selbst-Meta über das Gedächtnis +] +_JUNK_FACT_RE = re.compile("|".join(_JUNK_FACT_PATTERNS), re.IGNORECASE) + + +def _is_junk_fact(text: str) -> bool: + """True, wenn der extrahierte Fakt Assistenten-Meta oder ein transienter Zustand ist.""" + return bool(_JUNK_FACT_RE.search(text or "")) + + @app.post("/learn") def learn(body: LearnIn) -> dict: """Auto-Lernen: Gesprächs-Turns/Text durchreichen → Mem0 EXTRAHIERT Fakten selbst @@ -342,6 +374,19 @@ def learn(body: LearnIn) -> dict: ) results = res.get("results", []) + # Guard: frisch extrahierte Assistenten-Meta/transiente Fakten sofort wieder verwerfen. + kept = [] + for r in results: + if r.get("event") in ("ADD", "UPDATE") and _is_junk_fact(r.get("memory", "")): + try: + mem().delete(r["id"]) + except Exception: + log.debug("Junk-Fakt-Löschung fehlgeschlagen für %s", r.get("id")) + log.info("mem0 guard: Junk-Fakt verworfen: %s", (r.get("memory") or "")[:80]) + continue + kept.append(r) + results = kept + cats: dict = {} if body.classify: to_classify = [(r["id"], r.get("memory", "")) for r in results diff --git a/voice_service/install.sh b/voice_service/install.sh index adca95d..2c06050 100644 --- a/voice_service/install.sh +++ b/voice_service/install.sh @@ -7,30 +7,48 @@ set -euo pipefail SRC="${MC2_SRC:-$HOME/mission-control-v2}" VENV="$HOME/.voice/venv" VOICES="$HOME/.voice/voices" -PY="${VOICE_PYTHON:-python3.12}" +UV="$(command -v uv || echo "$HOME/.local/bin/uv")" -command -v "$PY" >/dev/null 2>&1 || PY=python3 # Fallback, falls python3.12 nicht im PATH +# torch/chatterbox brauchen Python ≤3.13 — das Default-python3 der Box ist 3.14. Darum das venv +# bevorzugt per uv mit gemanagtem Python 3.12 anlegen (wie das mem0-venv). pip läuft via `uv pip`. +pipi() { + if [ -x "$UV" ]; then "$UV" pip install --python "$VENV/bin/python" "$@" + else "$VENV/bin/python" -m pip install "$@"; fi +} -# --- venv ------------------------------------------------------------------- +# --- venv (Python 3.12) ----------------------------------------------------- if [ ! -x "$VENV/bin/python" ]; then - echo "[voice] Erstelle venv ($PY) → $VENV" - "$PY" -m venv "$VENV" + echo "[voice] Erstelle venv (Python 3.12) → $VENV" + if [ -x "$UV" ]; then "$UV" venv --python 3.12 "$VENV" + elif command -v python3.12 >/dev/null 2>&1; then python3.12 -m venv "$VENV" + else echo "[voice] FATAL: weder uv noch python3.12 vorhanden."; exit 1; fi fi -"$VENV/bin/python" -m pip install -q --upgrade pip +echo "[voice] venv-Python: $("$VENV/bin/python" --version 2>&1)" # --- Kern-Deps (STT + Piper + Server) — required ---------------------------- echo "[voice] Installiere Kern-Abhängigkeiten …" -"$VENV/bin/python" -m pip install -q -r "$SRC/voice_service/requirements.txt" +pipi -q -r "$SRC/voice_service/requirements.txt" # --- Chatterbox (Premium-TTS) — best-effort, CPU-torch (kein 2-GB-CUDA-Wheel) ---- echo "[voice] Installiere Chatterbox (Premium-TTS, CPU-torch) — best-effort …" -if "$VENV/bin/python" -m pip install -q --index-url https://download.pytorch.org/whl/cpu torch torchaudio \ - && "$VENV/bin/python" -m pip install -q chatterbox-tts; then +if pipi -q --index-url https://download.pytorch.org/whl/cpu torch torchaudio \ + && pipi -q chatterbox-tts; then echo "[voice] Chatterbox bereit." else echo "[voice] WARN: Chatterbox-Install fehlgeschlagen — Piper bleibt als Default-Stimme aktiv." fi +# --- Piper-Binary (offiziell, bringt espeak-ng mit) → ~/.voice/piper ----------- +if [ ! -x "$HOME/.voice/piper/piper" ]; then + echo "[voice] Lade Piper-Binary …" + curl -fsSL "https://github.com/rhasspy/piper/releases/download/2023.11.14-2/piper_linux_x86_64.tar.gz" \ + -o /tmp/piper.tgz \ + && tar xzf /tmp/piper.tgz -C "$HOME/.voice" \ + && rm -f /tmp/piper.tgz \ + && echo "[voice] Piper-Binary: $("$HOME/.voice/piper/piper" --version 2>&1 | head -1 || echo installiert)" \ + || echo "[voice] WARN: Piper-Binary-Download fehlgeschlagen." +fi + # --- Piper-Stimmen (Deutsch) nach ~/.voice/voices --------------------------- mkdir -p "$VOICES" BASE="https://huggingface.co/rhasspy/piper-voices/resolve/main/de/de_DE" From aff01057006bb02744c5932856b4d6707e414961 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 2 Jul 2026 10:29:22 +0200 Subject: [PATCH 11/38] Lucy v2: voice-core-Adapter, VAD, Overlay-Feinschliff + Projekt-Dateien - voice-core/: STT/TTS hinter Engine-Interfaces (pocket/box austauschbar), SpeechScheduler ausgelagert - useVAD (Freisprechen, adaptive RMS-Schwelle), usePushToTalk, sentiment - Avatar3D/config/styles-Feinschliff, AuraGlow - electron.vite.config, tsconfig, Starter-BATs, .gitignore (out/, avatar.vrm) Co-Authored-By: Claude Fable 5 --- client/lucy-desktop/.gitignore | 6 + client/lucy-desktop/Lucy-Check.bat | 8 + client/lucy-desktop/Lucy-Dev-Debug.bat | 13 ++ client/lucy-desktop/Lucy-Neustart.bat | 12 ++ .../lucy-desktop/Verknuepfung-erstellen.bat | 7 + client/lucy-desktop/electron.vite.config.ts | 17 ++ client/lucy-desktop/lucy.ico | Bin 0 -> 16608 bytes client/lucy-desktop/src/renderer/index.html | 13 ++ .../src/renderer/src/components/AuraGlow.tsx | 47 +++++ .../src/renderer/src/components/Avatar3D.tsx | 57 +++++- .../lucy-desktop/src/renderer/src/config.ts | 19 +- .../src/renderer/src/lib/voice/sentiment.ts | 14 ++ .../renderer/src/lib/voice/usePushToTalk.ts | 45 +++++ .../src/renderer/src/lib/voice/useVAD.ts | 121 +++++++++++++ .../renderer/src/lib/voice/useVoiceAgent.ts | 167 ++++++++++++------ client/lucy-desktop/src/renderer/src/main.tsx | 10 ++ .../lucy-desktop/src/renderer/src/styles.css | 26 +++ .../renderer/src/voice-core/engines/boxStt.ts | 16 ++ .../src/voice-core/engines/pocketTts.ts | 39 ++++ .../src/renderer/src/voice-core/index.ts | 14 ++ .../src/renderer/src/voice-core/speech.ts | 84 +++++++++ .../src/renderer/src/voice-core/types.ts | 27 +++ client/lucy-desktop/start-lucy.cmd | 9 + client/lucy-desktop/tsconfig.json | 15 ++ 24 files changed, 727 insertions(+), 59 deletions(-) create mode 100644 client/lucy-desktop/.gitignore create mode 100644 client/lucy-desktop/Lucy-Check.bat create mode 100644 client/lucy-desktop/Lucy-Dev-Debug.bat create mode 100644 client/lucy-desktop/Lucy-Neustart.bat create mode 100644 client/lucy-desktop/Verknuepfung-erstellen.bat create mode 100644 client/lucy-desktop/electron.vite.config.ts create mode 100644 client/lucy-desktop/lucy.ico create mode 100644 client/lucy-desktop/src/renderer/index.html create mode 100644 client/lucy-desktop/src/renderer/src/components/AuraGlow.tsx create mode 100644 client/lucy-desktop/src/renderer/src/lib/voice/sentiment.ts create mode 100644 client/lucy-desktop/src/renderer/src/lib/voice/usePushToTalk.ts create mode 100644 client/lucy-desktop/src/renderer/src/lib/voice/useVAD.ts create mode 100644 client/lucy-desktop/src/renderer/src/main.tsx create mode 100644 client/lucy-desktop/src/renderer/src/voice-core/engines/boxStt.ts create mode 100644 client/lucy-desktop/src/renderer/src/voice-core/engines/pocketTts.ts create mode 100644 client/lucy-desktop/src/renderer/src/voice-core/index.ts create mode 100644 client/lucy-desktop/src/renderer/src/voice-core/speech.ts create mode 100644 client/lucy-desktop/src/renderer/src/voice-core/types.ts create mode 100644 client/lucy-desktop/start-lucy.cmd create mode 100644 client/lucy-desktop/tsconfig.json diff --git a/client/lucy-desktop/.gitignore b/client/lucy-desktop/.gitignore new file mode 100644 index 0000000..d6530a4 --- /dev/null +++ b/client/lucy-desktop/.gitignore @@ -0,0 +1,6 @@ +node_modules/ +out/ +dist/ +*.log +# Avatar-VRM ist gross + Lizenz/Redistribution -> nicht committen (lokal/Box vorhalten) +src/renderer/public/avatar.vrm diff --git a/client/lucy-desktop/Lucy-Check.bat b/client/lucy-desktop/Lucy-Check.bat new file mode 100644 index 0000000..ccdbf37 --- /dev/null +++ b/client/lucy-desktop/Lucy-Check.bat @@ -0,0 +1,8 @@ +@echo off +chcp 65001 >nul +cd /d "%~dp0" +curl -s -m 5 http://127.0.0.1:8130/health > lucy_check.log 2>&1 +echo.>> lucy_check.log +echo --- electron/vite/pocket laeuft? --->> lucy_check.log +powershell -NoProfile -Command "Get-CimInstance Win32_Process | Where-Object { $_.CommandLine -match 'pocket_server:app|electron-vite|lucy-desktop' } | ForEach-Object { $_.Name + ' ' + $_.ProcessId }" >> lucy_check.log 2>&1 +type lucy_check.log diff --git a/client/lucy-desktop/Lucy-Dev-Debug.bat b/client/lucy-desktop/Lucy-Dev-Debug.bat new file mode 100644 index 0000000..58233aa --- /dev/null +++ b/client/lucy-desktop/Lucy-Dev-Debug.bat @@ -0,0 +1,13 @@ +@echo off +chcp 65001 >nul +cd /d "F:\Coding Stuff\mission-control-2\client\lucy-desktop" +echo Beende haengende Versuche (ohne mich selbst)... +powershell -NoProfile -Command "Get-CimInstance Win32_Process | Where-Object { $_.Name -eq 'electron.exe' -or $_.CommandLine -match 'electron-vite|pocket_server:app|start-lucy' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force -EA SilentlyContinue }" +timeout /t 2 >nul +echo Starte 'npm run dev' mit Log-Capture... +start /b "" cmd /c "npm run dev > dev.log 2>&1" +timeout /t 22 >nul +echo === dev.log === +type dev.log +echo. +echo (laeuft im Hintergrund weiter, falls erfolgreich) diff --git a/client/lucy-desktop/Lucy-Neustart.bat b/client/lucy-desktop/Lucy-Neustart.bat new file mode 100644 index 0000000..af9d02e --- /dev/null +++ b/client/lucy-desktop/Lucy-Neustart.bat @@ -0,0 +1,12 @@ +@echo off +chcp 65001 >nul +REM Hygiene: Recon-Log mit Token entfernen +del /q "F:\Coding Stuff\mission-control-2\box_recon.log" 2>nul +echo Beende laufende Lucy-Instanz (pocket_server :8130 + Electron/Vite)... +powershell -NoProfile -ExecutionPolicy Bypass -Command "Get-CimInstance Win32_Process | Where-Object { $_.CommandLine -match 'pocket_server:app|lucy-desktop|electron-vite' } | ForEach-Object { Write-Output ('kill ' + $_.ProcessId + ' ' + $_.Name); Stop-Process -Id $_.ProcessId -Force -ErrorAction SilentlyContinue }" +timeout /t 2 >nul +echo. +echo Starte Lucy neu (frischer Voice-Server + Client mit erweitertem Umlaut-Fix)... +start "" "F:\Coding Stuff\mission-control-2\client\lucy-desktop\start-lucy.cmd" +timeout /t 3 >nul +echo Fertig. diff --git a/client/lucy-desktop/Verknuepfung-erstellen.bat b/client/lucy-desktop/Verknuepfung-erstellen.bat new file mode 100644 index 0000000..c5aed20 --- /dev/null +++ b/client/lucy-desktop/Verknuepfung-erstellen.bat @@ -0,0 +1,7 @@ +@echo off +chcp 65001 >nul +powershell -NoProfile -ExecutionPolicy Bypass -Command "$ws=New-Object -ComObject WScript.Shell; $p=Join-Path ([Environment]::GetFolderPath('Desktop')) 'Lucy.lnk'; $l=$ws.CreateShortcut($p); $l.TargetPath='F:\Coding Stuff\mission-control-2\client\lucy-desktop\start-lucy.cmd'; $l.WorkingDirectory='F:\Coding Stuff\mission-control-2\client\lucy-desktop'; $l.IconLocation='F:\Coding Stuff\mission-control-2\client\lucy-desktop\lucy.ico'; $l.Description='Lucy - lokaler Sprach-Companion starten'; $l.Save(); Write-Output ('OK: ' + $p)" > lucy_shortcut.log 2>&1 +type lucy_shortcut.log +echo. +echo Fertig - "Lucy" liegt jetzt auf dem Desktop. +pause diff --git a/client/lucy-desktop/electron.vite.config.ts b/client/lucy-desktop/electron.vite.config.ts new file mode 100644 index 0000000..a620993 --- /dev/null +++ b/client/lucy-desktop/electron.vite.config.ts @@ -0,0 +1,17 @@ +import { defineConfig } from "electron-vite" +import react from "@vitejs/plugin-react" +import { resolve } from "path" + +export default defineConfig({ + main: { + build: { rollupOptions: { input: { index: resolve(__dirname, "src/main/index.ts") } } }, + }, + preload: { + build: { rollupOptions: { input: { index: resolve(__dirname, "src/preload/index.ts") } } }, + }, + renderer: { + root: resolve(__dirname, "src/renderer"), + build: { rollupOptions: { input: { index: resolve(__dirname, "src/renderer/index.html") } } }, + plugins: [react()], + }, +}) diff --git a/client/lucy-desktop/lucy.ico b/client/lucy-desktop/lucy.ico new file mode 100644 index 0000000000000000000000000000000000000000..f5849fe7fd99fdbf4e072111883606be83f48b8c GIT binary patch literal 16608 zcmZ{M3p`Zm|Npp!R6~*^CaJYuCrOgbR93bX)2_<4VY*TwNvO=ltyGfQwiL@~+epe3 za!FUX!!PjP!hdvTfDc}$ANs;yh5X{O4VCkDQ6Kn1({HQW zRut-4qMrPq7Wi8C)Q|f@P^dW-@E^76pod3Ls4c`DKWyE7)@P_~-yO3Lp;*!8?qOWF zb>g{Er_(VZ!q7$4!T)TDJ{)5mbHifip}7aF(T8#uXw5yAwq@i}eZbOt+Yc9R*|vCn zSfT!XYhV35)Xi22C-jlKC;hqjH-F(m_t5Ys!u;i+q>b5uVuw$Uz#%2Tc zKpJ^iFYhzIu-9+J;~`dVXyv^fGu&n;w1$++D+TSnU;ZNSpODA@*!NCx?y9`Qj~XP{ zCoV8?R5Wj~YR>c4BsCJu10)abGRVr{5LK>SU1NeU#n}OO89ir1a2eI*tcz9W(Q@69 zBvE+#ZVxl8>At`-l^8Eofd~0@4!gE%pxv%;)!7O!`}<8^_KIIiLRhr(nlX}C^e|ES z%KssDhxElhmpUi*%fRj+S#!X-A=A;I*~cT^mYE+(Svk`!G=DI^&@XQ!XJ9pCB?CmdwG-yd-qJ_pmpB0WNlBz(fNV+;|24BbM9e(3m`lyXS#W~ z-P*h1;&)b~(Qo;jWAfT~VsaLnd`#dapFcyWOMHcX=FiuV$M6lIWl(`CqBHwp(4El6 z&AI)l>T`77Rdsu9^?0z?6ekt+wYrbHe0=GbliC)PliXr#w~cs&8`rGCx0I`SVE)21 zCNdALahJZ|K~LtbiKtlBHm)me>vQNoF-OzQ=(i1rF6IdB%%G~B?NF47Y;+)S)E&yn z66z5RBnHxT{5(jTj}|C`iH>9G=b*cVbmLNK|i9b5o<~b>vw{T@gMu+TNSy*l^AE{&+BFX`A#M`@MEPTHPaQR?k!CRr`d1f@{*)*-6Q zcqXl4;sGA5$joG*F#H}q$NZMqGNP_Bu{7Yj$LDK=Tk0`p$8T#{<`2HZGYG_Ut9k8@ zZ4TE|7lZd~c1iYr6Y&BjioJdtjfGLC>MQ4yE>RmTvCn0l)#6I+=sIo2cB+#n$FNkK zu?8|Ze&Wt;$A14VhU5L94x*}Yp!?B2jV9qi%Ted@o=(PGTscOaR*7bXh{#=xS@gMm-z#(tKl67>/_<(nB_(iEXs+Pd&H=Sp@%ODLDT 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 literal 0 HcmV?d00001 diff --git a/client/lucy-desktop/src/renderer/index.html b/client/lucy-desktop/src/renderer/index.html new file mode 100644 index 0000000..4dd41d5 --- /dev/null +++ b/client/lucy-desktop/src/renderer/index.html @@ -0,0 +1,13 @@ + + + + + + + Lucy + + +

+ + + diff --git a/client/lucy-desktop/src/renderer/src/components/AuraGlow.tsx b/client/lucy-desktop/src/renderer/src/components/AuraGlow.tsx new file mode 100644 index 0000000..f1ad2fb --- /dev/null +++ b/client/lucy-desktop/src/renderer/src/components/AuraGlow.tsx @@ -0,0 +1,47 @@ +import { useEffect, useRef, type MutableRefObject } from "react" + +// Status-als-Licht: reaktive Aura hinter Lucy. Farbe = Status (hört zu / denkt / spricht), Intensität +// pulst mit dem Sprech-Pegel. Liest audioLevel per rAF (kein Re-Render pro Frame). +type LevelRef = MutableRefObject<{ current: number }> + +const COLORS: Record = { + warming: [120, 130, 150], idle: [125, 211, 252], listening: [56, 189, 248], + transcribing: [167, 139, 250], thinking: [251, 191, 36], speaking: [52, 211, 153], + error: [248, 113, 113], +} + +export function AuraGlow({ status, audioLevel }: { status: string; audioLevel: LevelRef }) { + const ref = useRef(null) + const statusRef = useRef(status); statusRef.current = status + const phase = useRef(0) + + useEffect(() => { + let raf = 0, last = performance.now() + const tick = (now: number) => { + const dt = Math.min(0.05, (now - last) / 1000); last = now + phase.current += dt + const el = ref.current + if (el) { + const s = statusRef.current + const [r, g, b] = COLORS[s] || COLORS.idle + const lvl = audioLevel.current?.current ?? 0 + // Grund-Puls je Status + Sprech-Reaktivität + const base = s === "thinking" || s === "transcribing" ? 0.45 + Math.sin(phase.current * 2.2) * 0.18 + : s === "listening" ? 0.55 + Math.sin(phase.current * 3) * 0.12 + : s === "speaking" ? 0.4 + Math.min(0.6, lvl * 1.8) + : s === "error" ? 0.6 + : 0.32 + Math.sin(phase.current * 1.1) * 0.06 // idle: ruhiges Atmen + const intensity = Math.max(0.15, Math.min(1, base)) + const scale = 1 + intensity * 0.18 + (s === "speaking" ? lvl * 0.25 : 0) + el.style.background = `radial-gradient(circle at 50% 42%, rgba(${r},${g},${b},${0.5 * intensity}) 0%, rgba(${r},${g},${b},${0.18 * intensity}) 32%, transparent 62%)` + el.style.transform = `scale(${scale})` + el.style.opacity = String(0.5 + intensity * 0.5) + } + raf = requestAnimationFrame(tick) + } + raf = requestAnimationFrame(tick) + return () => cancelAnimationFrame(raf) + }, [audioLevel]) + + return
+} diff --git a/client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx b/client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx index e1893fb..229530f 100644 --- a/client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx +++ b/client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx @@ -2,7 +2,7 @@ import { Canvas, useFrame } from "@react-three/fiber" import { OrbitControls } from "@react-three/drei" import { useEffect, useRef, useState, type MutableRefObject } from "react" import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js" -import { Object3D, Vector3, AnimationMixer, LoopPingPong, LoopOnce, type AnimationAction } from "three" +import { Object3D, Vector3, AnimationMixer, LoopPingPong, LoopOnce, AdditiveBlending, DoubleSide, type AnimationAction } from "three" import { VRM, VRMLoaderPlugin, VRMUtils } from "@pixiv/three-vrm" import { VRMAnimationLoaderPlugin, createVRMAnimationClip, type VRMAnimation } from "@pixiv/three-vrm-animation" import type { Emotion } from "../lib/voice/sentiment" @@ -281,25 +281,72 @@ function VrmModel({ url, audioLevel, emotion, status, cursor, pat, dance, onErro return vrm ? : null } +// Hologramm-Beiwerk: Projektor-Sockel (Glow-Ringe am Boden) + schwebender Kristall daneben. +// Reine Additiv-Meshes -> berühren die VRM-Materialien NICHT (voll reversibel per Toggle). +function HoloRig() { + const ringA = useRef(null), ringB = useRef(null), crystal = useRef(null) + useFrame((s, d) => { + const t = s.clock.elapsedTime + if (ringA.current) ringA.current.rotation.z += d * 0.3 + if (ringB.current) ringB.current.rotation.z -= d * 0.55 + if (crystal.current) { + crystal.current.rotation.y += d * 1.1 + crystal.current.rotation.x = Math.sin(t * 0.8) * 0.3 + crystal.current.position.y = 1.18 + Math.sin(t * 1.6) * 0.04 + } + }) + const cyan = "#4fd8ff" + return ( + + {/* Projektor-Sockel: weicher Glow-Disc + zwei rotierende Ringe am Boden (Fuesse bei y=0) */} + + + + + + {/* schwebender Kristall neben ihr (Schulterhoehe) */} + + + + + + ) +} + export function Avatar3D({ url, audioLevel, emotion, status = "idle", cursor, pat, dance, controls = true }: { url: string; audioLevel: LevelRef; emotion: EmotionRef; status?: string cursor?: CursorRef; pat?: NumRef; dance?: NumRef; controls?: boolean }) { const [err, setErr] = useState(null) + const [holo, setHolo] = useState(() => localStorage.getItem("lucy_holo") !== "0") // Hologramm-Look, Standard: an const statusRef = useRef(status); statusRef.current = status + const toggleHolo = () => setHolo((h) => { const n = !h; localStorage.setItem("lucy_holo", n ? "1" : "0"); return n }) return ( -
+
- - - + {holo ? ( + <> + + {/* Rim von hinten -> Silhouetten-Glow */} + + + + ) : ( + <> + + + + + )} {controls && ( )} + {holo && (<>
)} + {err && (
, , " + ", , oder . Er wird nicht angezeigt oder vorgelesen " + "und steuert nur deinen Gesichtsausdruck — wähle ihn passend zum Inhalt deiner Antwort." diff --git a/client/lucy-desktop/src/renderer/src/lib/voice/sentiment.ts b/client/lucy-desktop/src/renderer/src/lib/voice/sentiment.ts new file mode 100644 index 0000000..10d781e --- /dev/null +++ b/client/lucy-desktop/src/renderer/src/lib/voice/sentiment.ts @@ -0,0 +1,14 @@ +// Leichtgewichtige Stimmungs-Heuristik → treibt Lucys Mimik. Regelbasiert (kein Modell). +export type Emotion = "neutral" | "happy" | "angry" | "sad" | "surprised" | "relaxed" + +const RULES: [Emotion, RegExp][] = [ + ["happy", /(super|toll|klasse|freu|cool|prima|perfekt|danke|großartig|wunderbar|gerne|haha)/i], + ["surprised", /(wow|wirklich\?|krass|unglaublich|echt\?|tatsächlich|\?!|!\?|oha)/i], + ["angry", /(fehler|kaputt|mist|verdammt|nervt|schlecht|problem|ärgerlich|leider nicht|geht nicht)/i], + ["sad", /(leider|schade|traurig|tut mir leid|entschuldigung|sorry|bedauere)/i], +] + +export function sentimentToEmotion(text: string): Emotion { + for (const [emo, rx] of RULES) if (rx.test(text)) return emo + return "neutral" +} diff --git a/client/lucy-desktop/src/renderer/src/lib/voice/usePushToTalk.ts b/client/lucy-desktop/src/renderer/src/lib/voice/usePushToTalk.ts new file mode 100644 index 0000000..6ced677 --- /dev/null +++ b/client/lucy-desktop/src/renderer/src/lib/voice/usePushToTalk.ts @@ -0,0 +1,45 @@ +import { useCallback, useEffect, useRef, useState } from "react" + +// Push-to-talk-Aufnahme via MediaRecorder. start beim Druecken, stop beim Loslassen -> Audio-Blob an onAudio. +export function usePushToTalk(onAudio: (blob: Blob) => void) { + const [recording, setRecording] = useState(false) + const recRef = useRef(null) + const chunksRef = useRef([]) + const streamRef = useRef(null) + + const start = useCallback(async () => { + if (recRef.current) return + let stream: MediaStream + try { + stream = await navigator.mediaDevices.getUserMedia({ audio: true }) + } catch (e) { + console.error("Mikrofon-Zugriff verweigert:", e) + return + } + streamRef.current = stream + const mime = MediaRecorder.isTypeSupported("audio/webm;codecs=opus") ? "audio/webm;codecs=opus" : "audio/webm" + const rec = new MediaRecorder(stream, { mimeType: mime }) + chunksRef.current = [] + rec.ondataavailable = (e) => { if (e.data.size) chunksRef.current.push(e.data) } + rec.onstop = () => { + const blob = new Blob(chunksRef.current, { type: mime }) + streamRef.current?.getTracks().forEach((t) => t.stop()) + streamRef.current = null + recRef.current = null + setRecording(false) + if (blob.size > 1200) onAudio(blob) + } + rec.start() + recRef.current = rec + setRecording(true) + }, [onAudio]) + + const stop = useCallback(() => { recRef.current?.stop() }, []) + + useEffect(() => () => { + recRef.current?.stop() + streamRef.current?.getTracks().forEach((t) => t.stop()) + }, []) + + return { recording, start, stop } +} diff --git a/client/lucy-desktop/src/renderer/src/lib/voice/useVAD.ts b/client/lucy-desktop/src/renderer/src/lib/voice/useVAD.ts new file mode 100644 index 0000000..27fca5d --- /dev/null +++ b/client/lucy-desktop/src/renderer/src/lib/voice/useVAD.ts @@ -0,0 +1,121 @@ +import { useEffect, useRef } from "react" + +// Freisprech-VAD (Voice Activity Detection): lauscht dauerhaft am Mikro, erkennt Sprech-Beginn/-Ende +// per Energie und liefert komplette Äußerungen als Blob. RÜCKKOPPLUNGS-SCHUTZ: `paused` (Lucy denkt/spricht) +// stoppt die Erkennung -> Lucys eigene Stimme triggert das Mikro nicht; + echoCancellation + Abkling-Sperre. + +interface VADOptions { + enabled: boolean // VAD-Modus an? + paused: boolean // Lucy beschäftigt (thinking/speaking/listening) -> nicht aufnehmen + onUtterance: (blob: Blob) => void + onListening?: (active: boolean) => void // UI: gerade Sprache am Aufnehmen? +} + +// Erkennung per ZEIT-DOMÄNEN-RMS mit ADAPTIVEM Rausch-Pegel (kalibriert sich aufs Mikro) — robuster +// als feste Frequenz-Schwellen. Schwellen werden relativ zum gemessenen Rauschen berechnet. +const START_FRAMES = 3 // so viele laute Frames in Folge -> Start (gegen Klick-Fehlstarts) +const SILENCE_MS = 900 // so lange Stille -> Äußerung zu Ende +const COOLDOWN_MS = 450 // nach Pause-Ende kurz taub (Echo/Lautsprecher abklingen lassen) + +export function useVAD({ enabled, paused, onUtterance, onListening }: VADOptions) { + const pausedRef = useRef(paused); pausedRef.current = paused + const onUtt = useRef(onUtterance); onUtt.current = onUtterance + const onLst = useRef(onListening); onLst.current = onListening + const resumeAt = useRef(0) + + // Abkling-Sperre: sobald Lucy fertig ist (paused true->false), kurz nicht lauschen + useEffect(() => { if (!paused) resumeAt.current = performance.now() + COOLDOWN_MS }, [paused]) + + useEffect(() => { + if (!enabled) return + let cancelled = false + let stream: MediaStream | null = null + let ctx: AudioContext | null = null + let raf = 0 + let rec: MediaRecorder | null = null + let chunks: Blob[] = [] + let speaking = false + let silenceStart = 0 + let voiceFrames = 0 + + const setListening = (v: boolean) => onLst.current?.(v) + + ;(async () => { + try { + stream = await navigator.mediaDevices.getUserMedia({ + audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true }, + }) + } catch (e) { + console.error("VAD: Mikrofon-Zugriff verweigert", e); return + } + if (cancelled) { stream.getTracks().forEach((t) => t.stop()); return } + + const Ctor = window.AudioContext || (window as any).webkitAudioContext + ctx = new Ctor() + try { await ctx.resume() } catch { /* */ } // WICHTIG: sonst bleibt der Context 'suspended' -> nur Nullen + const srcNode = ctx.createMediaStreamSource(stream) + const analyser = ctx.createAnalyser() + analyser.fftSize = 1024 + srcNode.connect(analyser) + const wave = new Uint8Array(analyser.fftSize) + let noiseFloor = 0.015 // adaptiver Rausch-Pegel (kalibriert sich auf das Mikro) + const mime = MediaRecorder.isTypeSupported("audio/webm;codecs=opus") ? "audio/webm;codecs=opus" : "audio/webm" + + const startRec = () => { + chunks = [] + rec = new MediaRecorder(stream!, { mimeType: mime }) + rec.ondataavailable = (e) => { if (e.data.size) chunks.push(e.data) } + rec.onstop = () => { + const blob = new Blob(chunks, { type: mime }) + if (!cancelled && blob.size > 2400) onUtt.current(blob) // Mini-Blobs (Klicks) verwerfen + } + rec.start() + setListening(true) + } + const stopRec = (emit: boolean) => { + if (rec && rec.state !== "inactive") { + if (!emit) rec.onstop = null + rec.stop() + } + rec = null + setListening(false) + } + + const tick = () => { + if (cancelled) return + analyser.getByteTimeDomainData(wave) + let sq = 0 + for (let i = 0; i < wave.length; i++) { const v = (wave[i] - 128) / 128; sq += v * v } + const level = Math.sqrt(sq / wave.length) // RMS-Pegel 0..1 + const now = performance.now() + // Rausch-Pegel langsam an leise Phasen angleichen (nur wenn nicht geredet wird) + if (!speaking) noiseFloor += (Math.min(level, noiseFloor * 1.6 + 0.004) - noiseFloor) * 0.05 + const startTh = Math.max(0.02, noiseFloor * 2.8) // Sprache: deutlich über dem Rauschen + const stopTh = Math.max(0.012, noiseFloor * 1.7) // Stille: nahe am Rauschen + + if (pausedRef.current || now < resumeAt.current) { + if (speaking) { speaking = false; voiceFrames = 0; silenceStart = 0; stopRec(false) } // verwerfen + } else if (!speaking) { + if (level > startTh) { voiceFrames++; if (voiceFrames >= START_FRAMES) { speaking = true; silenceStart = 0; startRec() } } + else voiceFrames = 0 + } else { + if (level < stopTh) { + if (!silenceStart) silenceStart = now + else if (now - silenceStart > SILENCE_MS) { speaking = false; silenceStart = 0; stopRec(true) } + } else silenceStart = 0 + } + raf = requestAnimationFrame(tick) + } + tick() + })() + + return () => { + cancelled = true + cancelAnimationFrame(raf) + try { if (rec && rec.state !== "inactive") { rec.onstop = null; rec.stop() } } catch { /* */ } + stream?.getTracks().forEach((t) => t.stop()) + try { ctx?.close() } catch { /* */ } + onLst.current?.(false) + } + }, [enabled]) +} diff --git a/client/lucy-desktop/src/renderer/src/lib/voice/useVoiceAgent.ts b/client/lucy-desktop/src/renderer/src/lib/voice/useVoiceAgent.ts index 5a965de..66b2e96 100644 --- a/client/lucy-desktop/src/renderer/src/lib/voice/useVoiceAgent.ts +++ b/client/lucy-desktop/src/renderer/src/lib/voice/useVoiceAgent.ts @@ -3,7 +3,8 @@ import { usePushToTalk } from "./usePushToTalk" import { useVAD } from "./useVAD" import { AudioQueue } from "./audio" import { sentimentToEmotion, type Emotion } from "./sentiment" -import { BOX_URL, TTS_URL, SYSTEM_PROMPT } from "../../config" +import { BOX_URL, SYSTEM_PROMPT } from "../../config" +import { stt, tts, SpeechScheduler } from "../../voice-core" // Voll-Duplex-Schleife: PTT -> Box /stt -> Box /chat (SSE Hermes) -> CHUNKS -> lokal /tts -> AudioQueue. // Hirn+STT = Box (wie WebUI), Stimme = lokal (pocket-tts, CPU). Antwort wird in groessere Bloecke @@ -13,6 +14,13 @@ import { BOX_URL, TTS_URL, SYSTEM_PROMPT } from "../../config" export type VoiceStatus = "warming" | "idle" | "listening" | "transcribing" | "thinking" | "speaking" | "error" export interface ChatMsg { role: "user" | "assistant"; text: string } +// Perf-Diagnose (Client): Zeit pro Stufe ab „Mikro losgelassen". Aus via localStorage lucy_perf=0. +// Perf-Diagnose: NUR Console (kein POST an den pocket_server mehr — der generiert Audio; POSTs +// mittendrin verursachten hakelige Sprachausgabe). Diagnose ist durch (Thinking war die Ursache). +const PERF = typeof localStorage !== "undefined" && localStorage.getItem("lucy_perf") === "1" // opt-in statt default +function plogSend(msg: string) { if (PERF) console.log(`[lucy-perf] ${msg}`) } +function plog(label: string, ms: number) { plogSend(`${label} = ${Math.round(ms)}ms`) } + // Hermes schreibt manchmal ASCII-Umlaute (ue/ae/oe/ss) statt ä/ö/ü/ß -> pocket-tts liest die falsch vor. // Gezielt häufige UMLAUT-Stämme zurückwandeln. KONSERVATIV: nur Muster, bei denen ASCII fast immer ein // Umlaut ist (echte "ue"-Wörter wie aktuell/neue/Quelle bleiben unangetastet — die sind hier NICHT gelistet). @@ -51,10 +59,23 @@ export function restoreUmlauts(s: string): string { const EMO_TAG = //i function stripEmoTag(s: string): string { return s.replace(//gi, "").trimEnd() } +// Hermes hängt bei selbst erzeugten Medien (z.B. eigener Screenshot via pc-control) einen Roh-Token +// „MEDIA:" an. Das ist weder Sprech- noch Anzeigetext -> überall entfernen (bis Medien echt +// gerendert werden). Betrifft auch Lucys eigene Bildschirm-Sicht, die den Screenshot ohnehin schon liefert. +function stripMedia(s: string): string { + return s.replace(/\bMEDIA:\S+/gi, "").replace(/[ \t]{2,}/g, " ").replace(/[ \t]+\n/g, "\n").trimEnd() +} + function cleanForTTS(s: string): string { return restoreUmlauts(s) .replace(/```[\s\S]*?```/g, " ").replace(/`([^`]*)`/g, "$1") .replace(/\[([^\]]+)\]\([^)]+\)/g, "$1") + .replace(/\bMEDIA:\S+/gi, " ") + // Zeitzonen-Codes (UTC/CET/GMT…) + evtl. angehängte Zeit: Pocket mangelt die Akronyme zu + // Kauderwelsch -> aus der Stimme entfernen (Anzeige behält sie). Lucy sagt die lokale Zeit ohnehin. + .replace(/\b(?:UTC|GMT|CET|CEST|MEZ|MESZ|PST|PDT|EST|EDT)\b\s*[+\-]?\d{0,2}(?::\d{2})?/gi, " ") + // Zahlen/Uhrzeiten (18:01 -> „achtzehn Uhr eins", 2026 -> „zweitausend…") normalisiert jetzt + // der lokale pocket_server (text_norm.py, num2words) — kontextsicher (Modellnummern bleiben). .replace(/https?:\/\/\S+/gi, " ").replace(/www\.\S+/gi, " ").replace(/\b\S+@\S+\.\S+\b/g, " ") .replace(/[*_#>~|`]+/g, " ").replace(/^\s*[-•·]\s+/gm, " ") .replace(/\s*&\s*/g, " und ") @@ -72,26 +93,6 @@ function newSessionId(): string { return "lucy-" + Math.random().toString(36).slice(2) + Date.now().toString(36) } -async function ttsToBuffer(text: string): Promise { - const r = await fetch(`${TTS_URL}/tts`, { - method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ text }), - }) - if (!r.ok) throw new Error(`TTS ${r.status}`) - return r.arrayBuffer() -} - -// Streamt die Stimme (PCM16) und spielt sie lueckenlos ab, sobald die ersten Chunks da sind -// (Time-to-first-audio ~1s statt der ganzen Generierung). Liefert true, wenn etwas gesprochen wurde. -async function ttsStreamPlay(queue: AudioQueue, text: string): Promise { - const r = await fetch(`${TTS_URL}/tts/stream`, { - method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ text }), - }) - if (!r.ok || !r.body) throw new Error(`TTS ${r.status}`) - const sr = Number(r.headers.get("X-Sample-Rate") || "24000") - await queue.playPcmStream(r.body, sr) - return true -} - // Bildschirm-Sicht: erkennt im Gesagten die Bitte, auf den Schirm zu schauen const VISION_RX = /\b(schau|sieh|siehst|guck|guckst|zeig|bildschirm|screen|monitor|fenster|erkennst?|lies (mir|das)|was (steht|ist) (da|hier|auf)|auf meinem (bildschirm|schirm|screen))\b/i function extractWindowName(text: string): string | null { @@ -116,6 +117,10 @@ export function useVoiceAgent() { const audioLevel = useRef({ current: 0 }) const emotion = useRef("neutral") const queueRef = useRef(null) + const schedulerRef = useRef(null) + const turnAbortRef = useRef(null) // laufenden Turn abbrechen (Barge-in) + const thinkingRef = useRef(false) // Hermes werkelt noch (Tools) -> Status nach Filler zurück auf 'thinking' + const turnT0 = useRef(0) // Perf: Startzeit des aktuellen Turns (Mikro losgelassen) const sessionId = useRef(newSessionId()) // Live-Status fuer die Eingabe-Sperre (ohne pressStart-Closure neu zu binden) const statusRef = useRef("warming") @@ -124,9 +129,15 @@ export function useVoiceAgent() { const ensureQueue = useCallback(() => { if (!queueRef.current) { const q = new AudioQueue() - q.onSpeaking = (sp) => setStatus((s) => (sp ? "speaking" : s === "speaking" ? "idle" : s)) queueRef.current = q audioLevel.current = q.level + // Satz-Pipelining: der Scheduler spricht einzelne Sätze, sobald sie aus dem Hirn-Stream + // fertig sind. Er (nicht die Queue) treibt den „speaking"-Status, damit es zwischen Sätzen + // nicht flackert (die Queue pausiert die Pegelmessung je Satz). + const sch = new SpeechScheduler(tts, q) + // Nach dem Filler-Satz zurück auf 'thinking', solange Hermes noch werkelt (sonst flackert's auf idle). + sch.onBusy = (busy) => setStatus((s) => (busy ? "speaking" : thinkingRef.current ? "thinking" : s === "speaking" ? "idle" : s)) + schedulerRef.current = sch } return queueRef.current }, []) @@ -137,16 +148,10 @@ export function useVoiceAgent() { useEffect(() => { let cancelled = false ;(async () => { - for (let i = 0; i < 120 && !cancelled; i++) { - try { - const h = await (await fetch(`${TTS_URL}/health`)).json() - if (h.status === "ok") break - } catch { /* Dienst startet evtl. noch (Spawn + Modell-Load) */ } - await new Promise((r) => setTimeout(r, 1000)) - } + await tts.waitReady(120_000) if (cancelled) return // ein Aufwaerm-Satz (primt alle lazy Pfade); Audio verwerfen - try { await ttsToBuffer("Alles bereit, Commander.") } catch { /* */ } + try { await tts.synthesize("Alles bereit, Commander.") } catch { /* */ } if (cancelled) return setReady(true); setStatus("idle") })() @@ -156,21 +161,60 @@ export function useVoiceAgent() { // Ein kompletter Turn: User-Text (+ optional Bildschirm-Bilder, Multi-Monitor) -> Hermes (SSE) -> Stimme. const runTurn = useCallback(async (userText: string, images?: string[]) => { const queue = ensureQueue() + const scheduler = schedulerRef.current! + // Vorherigen Turn (falls noch am Streamen) hart abbrechen -> kein „Weiterreden" nach Barge-in. + turnAbortRef.current?.abort() + const ac = new AbortController() + turnAbortRef.current = ac + scheduler.clear(); queue.clear() // frischer Turn: evtl. Reste aus vorherigem Sprechen verwerfen setStatus("thinking") + thinkingRef.current = true // Hermes werkelt (evtl. Tools) -> Status nach Filler zurück auf 'thinking' let assistant = "" + let firstToken = true setMessages((m) => [...m, { role: "assistant", text: "" }]) - let spokeAny = false, ttsFailed = false + // GANZE Antwort in EINEM Stream an Pocket (nach Hermes-Ende). Pocket kürzt intern den ersten + // Chunk (FAST_FIRST) -> schnelles erstes Audio, konsistente Prosodie, wenige Collapse-Regens. + // (Client-seitiges Satz-Chunking kämpfte gegen genau diese Optimierung -> verworfen.) + let dispatchedAny = false + let aborted = false + // --- Inkrementelles Sprechen bei TOOL-Turns ------------------------------------------------ + // Ohne Tools bleibt alles Ein-Stück (Flush erst am Ende) -> gleiche Prosodie/FAST_FIRST wie bisher. + // Sobald Hermes ein Tool anstößt (hermes.*-Event), sprechen wir die bis dahin FERTIGEN Sätze schon + // -> Lucy redet, WÄHREND das Tool läuft, statt am Ende alles am Stück (sonst 30s+ Totstille bei Tool-Ketten). + let spokenLen = 0 + const SENT_END = /[.!?…](?=[\s"“”„)\]]|$)/g + const flushSpeakable = (force: boolean) => { + const raw = assistant.slice(spokenLen) + if (!raw.trim()) return + if (!force && ((raw.match(/```/g)?.length || 0) % 2) === 1) return // offener Code-Zaun -> warten + let upto = raw.length + if (!force) { + let last = -1, m: RegExpExecArray | null + SENT_END.lastIndex = 0 + while ((m = SENT_END.exec(raw))) last = m.index + 1 + if (last < 0) return // noch kein ganzer Satz fertig -> warten + upto = last + } + spokenLen += upto + const seg = cleanForTTS(stripEmoTag(raw.slice(0, upto))) + if (seg) { scheduler.push(seg); dispatchedAny = true } + } + // Sofort-Kontext: lokale Zeit/Datum mitgeben -> Lucy braucht dafür KEIN Tool (spart den 13s-Tool-Tanz). + const timeCtx = `\n\n[Sofort-Kontext, DIREKT nutzbar OHNE Tool: Lokale Zeit/Datum beim Commander ist ` + + `${new Date().toLocaleString("de-DE", { weekday: "long", day: "numeric", month: "long", year: "numeric", hour: "2-digit", minute: "2-digit" })} Uhr.]` try { const r = await fetch(`${BOX_URL}/api/voice/chat`, { method: "POST", headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ text: userText, session_id: sessionId.current, system: SYSTEM_PROMPT, images: images || [] }), + body: JSON.stringify({ text: userText, session_id: sessionId.current, system: SYSTEM_PROMPT + timeCtx, images: images || [] }), + signal: ac.signal, }) if (!r.ok || !r.body) throw new Error(`Agent ${r.status}`) const reader = r.body.getReader() const dec = new TextDecoder() let sse = "" for (;;) { + if (ac.signal.aborted) break const { done, value } = await reader.read() if (done) break sse += dec.decode(value, { stream: true }) @@ -181,7 +225,16 @@ export function useVoiceAgent() { // Chat-Chunks -> nicht als solche parsen (ein Tool-Hickup mit error-Objekt darf die Antwort // nicht abbrechen). Optional koennte man hier Tool-Status anzeigen. const evType = lines.find((l) => l.startsWith("event:"))?.slice(6).trim() - if (evType && evType.startsWith("hermes.")) continue // Tool-Fortschritt (Status bleibt 'thinking') + if (evType && evType.startsWith("hermes.")) { + // Tool-Fortschritt (Status bleibt 'thinking'). Für die „denkt-lange"-Diagnose zeigen wir + // die Agent-Aktivität mit Zeitstempel -> so sieht man, ob Tools/Reasoning die Zeit fressen. + if (PERF) { + const dt = lines.find((l) => l.startsWith("data:"))?.slice(5).trim().slice(0, 140) || "" + plogSend(`Hermes ${evType} +${Math.round(performance.now() - turnT0.current)}ms ${dt}`) + } + flushSpeakable(false) // Tool läuft an -> die bis hier fertigen Sätze schon sprechen (redet WÄHREND das Tool arbeitet) + continue + } const line = lines.find((l) => l.startsWith("data:")) if (!line) continue const data = line.slice(5).trim() @@ -196,33 +249,39 @@ export function useVoiceAgent() { } const delta = json.choices?.[0]?.delta?.content || "" if (!delta) continue + if (firstToken) { firstToken = false; plog("Chat-TTFB (1. Hermes-Token)", performance.now() - turnT0.current) } assistant += delta + // Defensiv: falls Hermes seinen internen Umschlag durchreicht (Mid-Turn) -> NICHTS vorlesen. + if (assistant.includes("OUT-OF-BAND USER MESSAGE")) { aborted = true; scheduler.clear(); queue.clear(); break } emotion.current = sentimentToEmotion(assistant) - setMessages((m) => { const c = m.slice(); c[c.length - 1] = { role: "assistant", text: stripEmoTag(restoreUmlauts(assistant)) }; return c }) + setMessages((m) => { const c = m.slice(); c[c.length - 1] = { role: "assistant", text: stripEmoTag(stripMedia(restoreUmlauts(assistant))) }; return c }) } + if (aborted) break } - if (!assistant.trim()) { setStatus("idle"); return } - // Defensiv: falls Hermes mal seinen internen Umschlag durchreicht (Mid-Turn), NICHT vorlesen. - if (assistant.includes("OUT-OF-BAND USER MESSAGE")) { + if (ac.signal.aborted) return // Turn wurde unterbrochen (Barge-in) -> still beenden + if (aborted) { setStatus("error") setError("Nachricht kam mitten im Turn an — bitte warten, bis Lucy fertig ist, dann erneut fragen.") return } + if (!assistant.trim()) { setStatus("idle"); return } // Stimmungs-Tag (falls vorhanden) -> Avatar-Mimik nach BEDEUTUNG (sonst bleibt Sentiment-Heuristik). const emo = assistant.match(EMO_TAG) if (emo) emotion.current = emo[1].toLowerCase() as Emotion - // Ganze Antwort STREAMEN -> erstes Audio nach ~1s, lueckenlos (pocket-tts splittet intern in - // Saetze mit natuerlicher Prosodie). Kein Chunking noetig (real-time RTF ~0.74). - const spoken = cleanForTTS(stripEmoTag(assistant)) - if (spoken) { - try { await ttsStreamPlay(queue, spoken); spokeAny = true } - catch (e) { ttsFailed = true; console.error("TTS-Fehler:", e) } - } - if (!spokeAny) { + // Rest sprechen: bei Tool-Turns wurde schon segmentweise geflusht; hier kommt das letzte Segment + // (bzw. bei Turns OHNE Tools die GANZE Antwort in einem Rutsch -> FAST_FIRST, gleiche Prosodie wie bisher). + thinkingRef.current = false // Hermes fertig -> nach der Antwort darf der Status auf idle (kein Rückfall auf 'thinking') + plog("Text an TTS (Rest)", performance.now() - turnT0.current) + flushSpeakable(true) + await scheduler.idle() // warten, bis Lucy fertig gesprochen hat + if (dispatchedAny && !scheduler.playedAny) { setStatus("error") - setError(ttsFailed ? "Sprachausgabe fehlgeschlagen — laeuft der lokale TTS-Dienst?" : "Keine Sprachausgabe erzeugt.") + setError("Sprachausgabe fehlgeschlagen — laeuft der lokale TTS-Dienst?") + } else if (!dispatchedAny) { + setStatus("idle") } } catch (e: any) { + if (e?.name === "AbortError" || ac.signal.aborted) return // absichtlich abgebrochen (Barge-in) setStatus("error"); setError(`Agent-Antwort fehlgeschlagen: ${e.message}`) } }, [ensureQueue]) @@ -244,15 +303,16 @@ export function useVoiceAgent() { const handleAudio = useCallback(async (blob: Blob) => { setError(null) + turnT0.current = performance.now() // Perf: Startpunkt = Mikro losgelassen + turnAbortRef.current?.abort() // Barge-in: laufenden Hirn-Turn stoppen (kein Nachschieben) + thinkingRef.current = false ensureQueue().clear() + schedulerRef.current?.clear() // Barge-in: wartende Sätze mit verwerfen setStatus("transcribing") let userText = "" try { - const fd = new FormData() - fd.append("audio", blob, "rec.webm") - const r = await fetch(`${BOX_URL}/api/voice/stt`, { method: "POST", body: fd }) - if (!r.ok) throw new Error(`STT ${r.status}`) - userText = (await r.json()).text?.trim() || "" + userText = await stt.transcribe(blob) + plog("STT (Mikro->Text)", performance.now() - turnT0.current) } catch (e: any) { setStatus("error"); setError(`Spracherkennung fehlgeschlagen: ${e.message}`); return } @@ -266,7 +326,7 @@ export function useVoiceAgent() { // Auge-Button: Lucy aktiv auf den Bildschirm schauen lassen (ohne Sprachbefehl) const lookAtScreen = useCallback(async () => { if (!ready || statusRef.current === "thinking" || statusRef.current === "transcribing") return - setError(null); ensureQueue().clear() + setError(null); turnT0.current = performance.now(); ensureQueue().clear(); schedulerRef.current?.clear() let images: string[] = [] try { images = ((await window.lucy?.captureScreen()) || []).filter(Boolean) } catch { /* */ } const prompt = "Schau auf meinen Bildschirm und sag mir kurz, was du darauf siehst." @@ -300,7 +360,10 @@ export function useVoiceAgent() { const pressEnd = useCallback(() => { stop() }, [stop]) const reset = useCallback(() => { + turnAbortRef.current?.abort() + thinkingRef.current = false queueRef.current?.clear() + schedulerRef.current?.clear() setMessages([]); setError(null); setStatus("idle") sessionId.current = newSessionId() // frischer Gesprächsfaden (Mem0-Gedächtnis bleibt) }, []) diff --git a/client/lucy-desktop/src/renderer/src/main.tsx b/client/lucy-desktop/src/renderer/src/main.tsx new file mode 100644 index 0000000..f7629cd --- /dev/null +++ b/client/lucy-desktop/src/renderer/src/main.tsx @@ -0,0 +1,10 @@ +import React from "react" +import ReactDOM from "react-dom/client" +import App from "./App" +import "./styles.css" + +ReactDOM.createRoot(document.getElementById("root")!).render( + + + , +) diff --git a/client/lucy-desktop/src/renderer/src/styles.css b/client/lucy-desktop/src/renderer/src/styles.css index 6009ed4..850de3b 100644 --- a/client/lucy-desktop/src/renderer/src/styles.css +++ b/client/lucy-desktop/src/renderer/src/styles.css @@ -254,3 +254,29 @@ body { } .msg.assistant .bubble:hover .msgCopy { opacity: 1; } .msgCopy:hover { background: rgba(255,255,255,0.14); color: #e5e7eb; } + +/* ---- Hologramm-Look (Holo-Lucy): Silhouetten-Glow + Scanlines + Cyan-Tint ---- */ +/* drop-shadow folgt der Alpha-Silhouette des transparenten WebGL-Canvas -> billiger „Bloom"-Halo */ +.avatarCanvas.holo canvas { + filter: drop-shadow(0 0 5px rgba(90,222,255,0.85)) drop-shadow(0 0 15px rgba(56,190,255,0.5)); +} +.holoTint { + position: absolute; inset: 0; z-index: 2; pointer-events: none; mix-blend-mode: screen; + background: radial-gradient(ellipse 60% 55% at 50% 42%, rgba(60,200,255,0.12), rgba(30,120,255,0.05) 62%, transparent 82%); +} +.holoScan { + position: absolute; inset: 0; z-index: 3; pointer-events: none; mix-blend-mode: screen; + background: repeating-linear-gradient(0deg, rgba(120,230,255,0.07) 0px, rgba(120,230,255,0.07) 1px, transparent 2px, transparent 4px); + animation: holoFlicker 4s infinite; +} +@keyframes holoFlicker { + 0%, 100% { opacity: 0.5; } 48% { opacity: 0.46; } 50% { opacity: 0.72; } 52% { opacity: 0.45; } + 70% { opacity: 0.55; } 71% { opacity: 0.4; } 72% { opacity: 0.55; } 92% { opacity: 0.6; } +} +.holoToggle { + position: absolute; top: 6px; right: 6px; z-index: 6; -webkit-app-region: no-drag; + width: 26px; height: 24px; border-radius: 7px; cursor: pointer; font-size: 13px; + border: 1px solid rgba(125,211,252,0.35); background: rgba(12,12,20,0.5); color: #7dd3fc; +} +.holoToggle:hover { background: rgba(125,211,252,0.2); } +.holoToggle.on { background: rgba(125,211,252,0.28); color: #bae6fd; } diff --git a/client/lucy-desktop/src/renderer/src/voice-core/engines/boxStt.ts b/client/lucy-desktop/src/renderer/src/voice-core/engines/boxStt.ts new file mode 100644 index 0000000..e117fea --- /dev/null +++ b/client/lucy-desktop/src/renderer/src/voice-core/engines/boxStt.ts @@ -0,0 +1,16 @@ +// Box-STT-Adapter — Spracherkennung läuft auf der Box (MC2 /api/voice/stt -> faster-whisper). +import { BOX_URL } from "../../config" +import type { SttEngine } from "../types" + +export class BoxSttEngine implements SttEngine { + readonly id = "box-whisper" + constructor(private readonly baseUrl: string = BOX_URL) {} + + async transcribe(audio: Blob): Promise { + const fd = new FormData() + fd.append("audio", audio, "rec.webm") + const r = await fetch(`${this.baseUrl}/api/voice/stt`, { method: "POST", body: fd }) + if (!r.ok) throw new Error(`STT ${r.status}`) + return (await r.json()).text?.trim() || "" + } +} diff --git a/client/lucy-desktop/src/renderer/src/voice-core/engines/pocketTts.ts b/client/lucy-desktop/src/renderer/src/voice-core/engines/pocketTts.ts new file mode 100644 index 0000000..9a13c54 --- /dev/null +++ b/client/lucy-desktop/src/renderer/src/voice-core/engines/pocketTts.ts @@ -0,0 +1,39 @@ +// Pocket-TTS-Adapter — kapselt den lokalen pocket_server (CPU, vom Main-Prozess gespawnt). +// Endpunkte: POST /tts {text}->WAV, POST /tts/stream {text}->PCM16 (+ X-Sample-Rate), GET /health. +import { TTS_URL } from "../../config" +import type { TtsEngine, TtsStreamHandle } from "../types" + +export class PocketTtsEngine implements TtsEngine { + readonly id = "pocket" + constructor(private readonly baseUrl: string = TTS_URL) {} + + async synthesize(text: string): Promise { + const r = await fetch(`${this.baseUrl}/tts`, { + method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ text }), + }) + if (!r.ok) throw new Error(`TTS ${r.status}`) + return r.arrayBuffer() + } + + async synthesizeStream(text: string): Promise { + const r = await fetch(`${this.baseUrl}/tts/stream`, { + method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ text }), + }) + if (!r.ok || !r.body) throw new Error(`TTS ${r.status}`) + const sampleRate = Number(r.headers.get("X-Sample-Rate") || "24000") + return { stream: r.body, sampleRate } + } + + // pocket_server serviert /health erst, wenn das Modell fertig geladen ist (FastAPI-lifespan). + async waitReady(timeoutMs = 120_000): Promise { + const deadline = Date.now() + timeoutMs + while (Date.now() < deadline) { + try { + const h = await (await fetch(`${this.baseUrl}/health`)).json() + if (h.status === "ok") return true + } catch { /* Dienst startet evtl. noch (Spawn + Modell-Load) */ } + await new Promise((r) => setTimeout(r, 1000)) + } + return false + } +} diff --git a/client/lucy-desktop/src/renderer/src/voice-core/index.ts b/client/lucy-desktop/src/renderer/src/voice-core/index.ts new file mode 100644 index 0000000..67723c6 --- /dev/null +++ b/client/lucy-desktop/src/renderer/src/voice-core/index.ts @@ -0,0 +1,14 @@ +// voice-core — öffentliche API + aktive Engine-Auswahl. +// Aktuell fest: Pocket-TTS (lokal, Kyutai — macht auch Lucys Voice-Cloning) + Box-Whisper-STT. +// TTS-Engines beschränkt auf pocket (live) + f5 (GPU-Option). ElevenLabs/Edge/Chatterbox/Piper +// waren nur im alten Web-Pfad und sind hier bewusst NICHT dabei. Der Voice-Agent importiert NUR von hier. +import { PocketTtsEngine } from "./engines/pocketTts" +import { BoxSttEngine } from "./engines/boxStt" +import type { SttEngine, TtsEngine } from "./types" + +export const tts: TtsEngine = new PocketTtsEngine() +export const stt: SttEngine = new BoxSttEngine() + +export { SpeechScheduler } from "./speech" +export type { AudioSink } from "./speech" +export type { SttEngine, TtsEngine, TtsStreamHandle } from "./types" diff --git a/client/lucy-desktop/src/renderer/src/voice-core/speech.ts b/client/lucy-desktop/src/renderer/src/voice-core/speech.ts new file mode 100644 index 0000000..1742264 --- /dev/null +++ b/client/lucy-desktop/src/renderer/src/voice-core/speech.ts @@ -0,0 +1,84 @@ +// SpeechScheduler — Satz-Pipelining fürs Voll-Duplex-Gefühl (Etappe 2, Schritt 1). +// Nimmt einzelne SÄTZE entgegen, während das Hirn noch streamt, und spricht sie lückenlos +// nacheinander: erstes Audio nach dem ERSTEN Satz statt nach der ganzen Antwort. +// Barge-in-fest über eine Generation (clear() verwirft laufende + wartende Sätze). +import type { TtsEngine, TtsStreamHandle } from "./types" + +// Perf-Diagnose: misst hörbare Stille + Synthese-Zeit je Satz. Abschalten via localStorage lucy_perf=0. +const PERF = typeof localStorage !== "undefined" && localStorage.getItem("lucy_perf") !== "0" + +/** Minimaler Audio-Ausgang (AudioQueue erfüllt diese Form) — hält voice-core von der UI entkoppelt. */ +export interface AudioSink { + playPcmStream(stream: ReadableStream, sampleRate: number): Promise +} + +export class SpeechScheduler { + private pending: string[] = [] + private running = false + private gen = 0 + private lastPlayEnd = 0 // Zeitstempel Ende des vorigen Satzes (für die „Stille davor"-Messung) + /** true, sobald mindestens ein Satz seit dem letzten clear() gesprochen wurde (für Fehlererkennung). */ + playedAny = false + /** Aktiv-Signal: true beim ersten Satz, false wenn alles gesprochen ist (treibt den „speaking"-Status). */ + onBusy?: (busy: boolean) => void + + constructor(private readonly tts: TtsEngine, private readonly sink: AudioSink) {} + + /** Einen fertigen Satz einreihen (leere werden ignoriert) und ggf. den Pump starten. */ + push(text: string): void { + const t = text.trim() + if (!t) return + this.pending.push(t) + if (!this.running) void this.pump() + } + + /** Barge-in / frischer Turn: laufende + wartende Sätze verwerfen. Der Audio-Sink wird separat + * gestoppt (queue.clear()). Setzt die Fehler-/Erfolgs-Erkennung zurück. */ + clear(): void { + this.gen++ + this.pending = [] + this.playedAny = false + this.lastPlayEnd = 0 + } + + /** Wartet, bis alle eingereihten Sätze gesprochen sind. */ + async idle(): Promise { + while (this.running || this.pending.length) await new Promise((r) => setTimeout(r, 40)) + } + + private synth(text: string): Promise { + return this.tts.synthesizeStream(text).catch((e) => { console.error("TTS-Fehler:", e); return null }) + } + + private async pump(): Promise { + if (this.running) return + this.running = true + this.onBusy?.(true) + try { + // SERIELL, KEIN Prefetch: der pocket_server ist Single-Instanz. synthesizeStream liefert den + // Handle schon bei TTFB (Server generiert den Body noch) -> ein vorab angestoßenes Segment + // würde den laufenden Lauf KONKURRIEREN lassen (gemessen bei Tool-Turns: gen 17s statt 5s, + // TTFB-Spitze 14.7s). Gaplessness INNERHALB einer Antwort macht ohnehin der Server (Satz-Split + // + _compress_gaps); hier werden nur die Segmente/Tool-Häppchen der Reihe nach gesprochen. + let idx = 0 + while (this.pending.length) { + const myGen = this.gen + const tWait = performance.now() + const handle = await this.synth(this.pending.shift()!) + const synthWait = performance.now() - tWait + if (myGen !== this.gen) { if (handle) handle.stream.cancel().catch(() => {}); continue } // ge-cleared -> Server sofort freigeben + if (!handle) continue // Synthese fehlgeschlagen -> nächsten Satz versuchen + const gap = this.lastPlayEnd ? tWait - this.lastPlayEnd : 0 // hörbare Stille seit dem letzten Satz + const tPlay = performance.now() + await this.sink.playPcmStream(handle.stream, handle.sampleRate) + this.lastPlayEnd = performance.now() + this.playedAny = true + if (PERF) console.log(`[lucy-perf] TTS Satz #${idx}: Stille davor=${Math.round(gap)}ms · Synth-Warten=${Math.round(synthWait)}ms · Spieldauer=${Math.round(this.lastPlayEnd - tPlay)}ms`) + idx++ + } + } finally { + this.running = false + this.onBusy?.(false) + } + } +} diff --git a/client/lucy-desktop/src/renderer/src/voice-core/types.ts b/client/lucy-desktop/src/renderer/src/voice-core/types.ts new file mode 100644 index 0000000..d465768 --- /dev/null +++ b/client/lucy-desktop/src/renderer/src/voice-core/types.ts @@ -0,0 +1,27 @@ +// voice-core — Engine-Adapter-Interface (Etappe 0 des Greenfield-Umbaus). +// Ziel: STT/TTS-Backends hinter EINEM Vertrag, damit pocket | f5 | piper | elevenlabs | edge +// austauschbar sind (Config/Picker) und der Voice-Agent nicht mehr direkt an URLs klebt. + +export interface SttEngine { + /** Stabiler Bezeichner der Engine (z. B. "box-whisper"). */ + readonly id: string + /** Audio (webm/opus/wav …) -> erkannter Text (leer, wenn nichts verstanden). */ + transcribe(audio: Blob): Promise +} + +/** Ergebnis einer Streaming-Synthese: fortlaufender PCM16-mono-Stream + Samplerate. */ +export interface TtsStreamHandle { + readonly stream: ReadableStream + readonly sampleRate: number +} + +export interface TtsEngine { + /** Stabiler Bezeichner der Engine (z. B. "pocket"). */ + readonly id: string + /** Vollständige Synthese in einen dekodierbaren Audio-Buffer (z. B. WAV) — für Warm-up. */ + synthesize(text: string): Promise + /** Streaming-PCM16-Synthese für niedrige Time-to-first-audio (die Live-Antwort). */ + synthesizeStream(text: string): Promise + /** Bereitschafts-/Warm-Gate: true, sobald die Engine antwortet (Modell evtl. lazy geladen). */ + waitReady(timeoutMs?: number): Promise +} diff --git a/client/lucy-desktop/start-lucy.cmd b/client/lucy-desktop/start-lucy.cmd new file mode 100644 index 0000000..54b36f3 --- /dev/null +++ b/client/lucy-desktop/start-lucy.cmd @@ -0,0 +1,9 @@ +@echo off +title Lucy (Dev) +cd /d "%~dp0" +echo Starte Lucy ... (dieses Fenster offen lassen; schliessen = Lucy beenden) +echo. +call npm run dev +echo. +echo Lucy wurde beendet. Taste druecken zum Schliessen. +pause >nul diff --git a/client/lucy-desktop/tsconfig.json b/client/lucy-desktop/tsconfig.json new file mode 100644 index 0000000..90dc141 --- /dev/null +++ b/client/lucy-desktop/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "bundler", + "jsx": "react-jsx", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "resolveJsonModule": true, + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "types": ["node", "electron-vite/node"] + }, + "include": ["src"] +} From 09a1c985149e13497c3625664a3d009938cbeb92 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 2 Jul 2026 10:29:33 +0200 Subject: [PATCH 12/38] Lucy-TTS/F5: Skripte + Batches versionieren, schwere Assets ignoriert - pocket_server.py (Produktions-TTS mit Stimmen-Waechter), text_norm, Bench-/Diag-Skripte - lucy-f5: f5_server/f5_test/bench_dml (DirectML-Experiment, Phase C/D offen) - .gitignore: venvs/Modelle/Audio/Logs der beiden Ordner + box_recon/gemma_swap-Scratch Co-Authored-By: Claude Fable 5 --- .gitignore | 26 + client/lucy-f5/bench_dml.py | 268 +++ client/lucy-f5/dakeqq_infer.py | 298 +++ client/lucy-f5/f5_server.py | 196 ++ client/lucy-f5/f5_test.py | 44 + client/lucy-f5/lucy_ref.txt | 1 + client/lucy-f5/vocab.txt | 2545 +++++++++++++++++++++ client/lucy-f5/vocab_v1.txt | 2545 +++++++++++++++++++++ client/lucy-tts/B2-Test.bat | 12 + client/lucy-tts/Lucy-Samples-erzeugen.bat | 13 + client/lucy-tts/Lucy-Startklar.bat | 13 + client/lucy-tts/Sweep-B2.bat | 12 + client/lucy-tts/TTFB-Test.bat | 9 + client/lucy-tts/Umlaut-Test.bat | 9 + client/lucy-tts/analyze.py | 50 + client/lucy-tts/bench_b2.py | 67 + client/lucy-tts/bench_lucy.py | 109 + client/lucy-tts/debug_stream.py | 32 + client/lucy-tts/diag_clip.py | 41 + client/lucy-tts/diag_noiseclamp.py | 40 + client/lucy-tts/diag_stream2.py | 57 + client/lucy-tts/diag_stream3.py | 59 + client/lucy-tts/diag_voice_f0.py | 44 + client/lucy-tts/final_test.py | 47 + client/lucy-tts/lucy_ready.py | 60 + client/lucy-tts/make_samples.py | 64 + client/lucy-tts/measure_fix.py | 38 + client/lucy-tts/oute_pc.py | 45 + client/lucy-tts/pocket_server.py | 471 ++++ client/lucy-tts/ptts_preset.py | 47 + client/lucy-tts/ptts_test.py | 45 + client/lucy-tts/render_desktop.py | 28 + client/lucy-tts/speed_test.py | 20 + client/lucy-tts/stress_de.py | 47 + client/lucy-tts/sweep_b2.py | 105 + client/lucy-tts/sweep_quality.py | 53 + client/lucy-tts/sweep_quality2.py | 45 + client/lucy-tts/test_text_norm.py | 28 + client/lucy-tts/text_norm.py | 120 + client/lucy-tts/transcribe.py | 19 + client/lucy-tts/ttfb_test.py | 50 + client/lucy-tts/tune_front_loud.py | 79 + client/lucy-tts/tune_lsd.py | 33 + client/lucy-tts/tune_lsd_v2.py | 56 + client/lucy-tts/tune_natural.py | 61 + client/lucy-tts/tune_tailfix.py | 63 + client/lucy-tts/tune_temp_final.py | 40 + client/lucy-tts/umlaut_test.py | 49 + client/lucy-tts/verify_clip.py | 28 + 49 files changed, 8231 insertions(+) create mode 100644 client/lucy-f5/bench_dml.py create mode 100644 client/lucy-f5/dakeqq_infer.py create mode 100644 client/lucy-f5/f5_server.py create mode 100644 client/lucy-f5/f5_test.py create mode 100644 client/lucy-f5/lucy_ref.txt create mode 100644 client/lucy-f5/vocab.txt create mode 100644 client/lucy-f5/vocab_v1.txt create mode 100644 client/lucy-tts/B2-Test.bat create mode 100644 client/lucy-tts/Lucy-Samples-erzeugen.bat create mode 100644 client/lucy-tts/Lucy-Startklar.bat create mode 100644 client/lucy-tts/Sweep-B2.bat create mode 100644 client/lucy-tts/TTFB-Test.bat create mode 100644 client/lucy-tts/Umlaut-Test.bat create mode 100644 client/lucy-tts/analyze.py create mode 100644 client/lucy-tts/bench_b2.py create mode 100644 client/lucy-tts/bench_lucy.py create mode 100644 client/lucy-tts/debug_stream.py create mode 100644 client/lucy-tts/diag_clip.py create mode 100644 client/lucy-tts/diag_noiseclamp.py create mode 100644 client/lucy-tts/diag_stream2.py create mode 100644 client/lucy-tts/diag_stream3.py create mode 100644 client/lucy-tts/diag_voice_f0.py create mode 100644 client/lucy-tts/final_test.py create mode 100644 client/lucy-tts/lucy_ready.py create mode 100644 client/lucy-tts/make_samples.py create mode 100644 client/lucy-tts/measure_fix.py create mode 100644 client/lucy-tts/oute_pc.py create mode 100644 client/lucy-tts/pocket_server.py create mode 100644 client/lucy-tts/ptts_preset.py create mode 100644 client/lucy-tts/ptts_test.py create mode 100644 client/lucy-tts/render_desktop.py create mode 100644 client/lucy-tts/speed_test.py create mode 100644 client/lucy-tts/stress_de.py create mode 100644 client/lucy-tts/sweep_b2.py create mode 100644 client/lucy-tts/sweep_quality.py create mode 100644 client/lucy-tts/sweep_quality2.py create mode 100644 client/lucy-tts/test_text_norm.py create mode 100644 client/lucy-tts/text_norm.py create mode 100644 client/lucy-tts/transcribe.py create mode 100644 client/lucy-tts/ttfb_test.py create mode 100644 client/lucy-tts/tune_front_loud.py create mode 100644 client/lucy-tts/tune_lsd.py create mode 100644 client/lucy-tts/tune_lsd_v2.py create mode 100644 client/lucy-tts/tune_natural.py create mode 100644 client/lucy-tts/tune_tailfix.py create mode 100644 client/lucy-tts/tune_temp_final.py create mode 100644 client/lucy-tts/umlaut_test.py create mode 100644 client/lucy-tts/verify_clip.py diff --git a/.gitignore b/.gitignore index 7933ebe..4de0978 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,29 @@ frontend/dist/avatar.vrm # Env / local *.env .DS_Store + +# Box-Recon-/Scratch-Skripte (lokale Diagnose, nicht fürs Repo) +box_recon* +gemma_swap* + +# Lucy-TTS/F5-Experimente: nur Code/Batch committen — venvs, Modelle, Audio, Logs bleiben lokal +client/lucy-tts/ptts-venv/ +client/lucy-tts/venv/ +client/lucy-tts/llamacpp-vulkan/ +client/lucy-tts/llamacpp-vulkan.zip +client/lucy-tts/models/ +client/lucy-tts/out_*/ +client/lucy-tts/*.wav +client/lucy-tts/*.mp3 +client/lucy-tts/*.log +client/lucy-tts/*.safetensors +client/lucy-tts/*.json +client/lucy-f5/.cache/ +client/lucy-f5/F5-TTS-ONNX/ +client/lucy-f5/onnx_de/ +client/lucy-f5/onnx_f32/ +client/lucy-f5/vocos-mel-24khz/ +client/lucy-f5/*.onnx +client/lucy-f5/*.safetensors +client/lucy-f5/*.wav +client/lucy-f5/*.zip diff --git a/client/lucy-f5/bench_dml.py b/client/lucy-f5/bench_dml.py new file mode 100644 index 0000000..3f5c976 --- /dev/null +++ b/client/lucy-f5/bench_dml.py @@ -0,0 +1,268 @@ +import re +import site +import time +import jieba +import torch +import onnxruntime +import soundfile as sf +import numpy as np +from pydub import AudioSegment +from pypinyin import lazy_pinyin, Style +python_package_path = site.getsitepackages()[-1] + +BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-f5" +vocab_path = BASE + r"\vocab_v1.txt" +onnx_model_A = BASE + r"\onnx_f32\F5_Preprocess.onnx" +onnx_model_B = BASE + r"\onnx_f32\F5_Transformer.onnx" +onnx_model_C = BASE + r"\onnx_f32\F5_Decode.onnx" +generated_audio = BASE + r"\bench_out.wav" +test_in_english = True # eingebaute engl. Referenz -> kein Chinesisch/Pinyin; Tempo ist sprachunabhängig + +if test_in_english: + reference_audio = python_package_path + "/f5_tts/infer/examples/basic/basic_ref_en.wav" + ref_text = "Some call me nature, others call me mother nature." + # realistischer Satz-Längen-Benchmark (wie eine echte Lucy-Antwort): + gen_text = "Of course, Commander. I will restart the service, check the logs, and let you know once everything is running again." +else: + reference_audio = python_package_path + "/f5_tts/infer/examples/basic/basic_ref_zh.wav" # The reference audio path. + ref_text = "对,这就是我,万人敬仰的太乙真人。" # The ASR result of reference audio. + gen_text = "对,这就是我,万人敬仰的大可奇奇。" # The target TTS. + + +import os as _os +ORT_Accelerate_Providers = [_os.environ.get("BENCH_PROVIDER", "DmlExecutionProvider")] # DML (9070 XT) oder CPUExecutionProvider + # else keep empty. +RANDOM_SEED = 9527 # Set seed to reproduce the generated audio +NFE_STEP = int(_os.environ.get("BENCH_NFE", "32")) if (_os := __import__("os")) else 32 # via env testbar +FUSE_NFE = 1 # Maintain the same values as the exported model. +SPEED = 1.0 # Set for talking speed. Only works with dynamic_axes=True +MAX_THREADS = 8 # Max CPU parallel threads. +DEVICE_ID = 0 # The GPU id, default to 0. +MODEL_SAMPLE_RATE = 24000 # Do not modify it. +HOP_LENGTH = 256 # It affects the generated audio length and speech speed. + +if "OpenVINOExecutionProvider" in ORT_Accelerate_Providers: + provider_options = [ + { + 'device_type': 'CPU', # [CPU, NPU, GPU, GPU.0, GPU.1]] + 'precision': 'ACCURACY', # [FP32, FP16, ACCURACY] + 'num_of_threads': MAX_THREADS, + 'num_streams': 1, + 'enable_opencl_throttling': True, + 'enable_qdq_optimizer': False # Enable it carefully + } + ] +elif "CUDAExecutionProvider" in ORT_Accelerate_Providers: + provider_options = [ + { + 'device_id': DEVICE_ID, + 'gpu_mem_limit': 8 * 1024 * 1024 * 1024, # 8 GB + 'arena_extend_strategy': 'kNextPowerOfTwo', + 'cudnn_conv_algo_search': 'EXHAUSTIVE', + 'cudnn_conv_use_max_workspace': '1', + 'do_copy_in_default_stream': '1', + 'cudnn_conv1d_pad_to_nc1d': '1', + 'enable_cuda_graph': '0', # Set to '0' to avoid potential errors when enabled. + 'use_tf32': '0' + } + ] +else: + # Please config by yourself for others providers. + provider_options = None + + +with open(vocab_path, "r", encoding="utf-8") as f: + vocab_char_map = {} + for i, char in enumerate(f): + vocab_char_map[char[:-1]] = i +vocab_size = len(vocab_char_map) + + +# From the official code +def convert_char_to_pinyin(text_list, polyphone=True): + if jieba.dt.initialized is False: + jieba.default_logger.setLevel(50) # CRITICAL + jieba.initialize() + + final_text_list = [] + custom_trans = str.maketrans( + {";": ",", "“": '"', "”": '"', "‘": "'", "’": "'"} + ) # add custom trans here, to address oov + + def is_chinese(c): + return ( + "\u3100" <= c <= "\u9fff" # common chinese characters + ) + + for text in text_list: + char_list = [] + text = text.translate(custom_trans) + for seg in jieba.cut(text): + seg_byte_len = len(bytes(seg, "UTF-8")) + if seg_byte_len == len(seg): # if pure alphabets and symbols + if char_list and seg_byte_len > 1 and char_list[-1] not in " :'\"": + char_list.append(" ") + char_list.extend(seg) + elif polyphone and seg_byte_len == 3 * len(seg): # if pure east asian characters + seg_ = lazy_pinyin(seg, style=Style.TONE3, tone_sandhi=True) + for i, c in enumerate(seg): + if is_chinese(c): + char_list.append(" ") + char_list.append(seg_[i]) + else: # if mixed characters, alphabets and symbols + for c in seg: + if ord(c) < 256: + char_list.extend(c) + elif is_chinese(c): + char_list.append(" ") + char_list.extend(lazy_pinyin(c, style=Style.TONE3, tone_sandhi=True)) + else: + char_list.append(c) + final_text_list.append(char_list) + return final_text_list + + +# From the official code +def list_str_to_idx( + text: list[str] | list[list[str]], + vocab_char_map: dict[str, int], # {char: idx} + padding_value=-1 +): + get_idx = vocab_char_map.get + list_idx_tensors = [torch.tensor([get_idx(c, 0) for c in t], dtype=torch.int32) for t in text] + text = torch.nn.utils.rnn.pad_sequence(list_idx_tensors, padding_value=padding_value, batch_first=True) + return text + + +def normalize_to_int16(audio): + max_val = np.max(np.abs(audio)) + scaling_factor = 32767.0 / max_val if max_val > 0 else 1.0 + return (audio * float(scaling_factor)).astype(np.int16) + + +# ONNX Runtime settings +onnxruntime.set_seed(RANDOM_SEED) +session_opts = onnxruntime.SessionOptions() +session_opts.log_severity_level = 4 # fatal level = 4, it an adjustable value. +session_opts.log_verbosity_level = 4 # fatal level = 4, it an adjustable value. +session_opts.inter_op_num_threads = MAX_THREADS # Run different nodes with num_threads. Set 0 for auto. +session_opts.intra_op_num_threads = MAX_THREADS # Under the node, execute the operators with num_threads. Set 0 for auto. +session_opts.enable_cpu_mem_arena = True # True for execute speed; False for less memory usage. +session_opts.execution_mode = onnxruntime.ExecutionMode.ORT_SEQUENTIAL +session_opts.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_ALL +session_opts.add_session_config_entry("session.intra_op.allow_spinning", "1") +session_opts.add_session_config_entry("session.inter_op.allow_spinning", "1") +session_opts.add_session_config_entry("session.set_denormal_as_zero", "1") + +session_opts.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_ALL +ort_session_A = onnxruntime.InferenceSession(onnx_model_A, sess_options=session_opts, providers=['CPUExecutionProvider'], provider_options=None) +model_type = ort_session_A._inputs_meta[0].type +in_name_A = ort_session_A.get_inputs() +out_name_A = ort_session_A.get_outputs() +in_name_A0 = in_name_A[0].name +in_name_A1 = in_name_A[1].name +in_name_A2 = in_name_A[2].name +out_name_A0 = out_name_A[0].name +out_name_A1 = out_name_A[1].name +out_name_A2 = out_name_A[2].name +out_name_A3 = out_name_A[3].name +out_name_A4 = out_name_A[4].name +out_name_A5 = out_name_A[5].name +out_name_A6 = out_name_A[6].name +out_name_A7 = out_name_A[7].name + +if "CPUExecutionProvider" in ORT_Accelerate_Providers or not ORT_Accelerate_Providers: + session_opts.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_ALL +else: + session_opts.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_BASIC +ort_session_B = onnxruntime.InferenceSession(onnx_model_B, sess_options=session_opts, providers=ORT_Accelerate_Providers, provider_options=provider_options) +ORT_Accelerate_Providers = ort_session_B.get_providers()[0] +# For Windows DirectML + Intel/AMD/Nvidia GPU, +# pip install onnxruntime-directml --upgrade +# ort_session_B = onnxruntime.InferenceSession(onnx_model_B, sess_options=session_opts, providers=['DmlExecutionProvider']) +print(f"\nUsable Providers: {ORT_Accelerate_Providers}") +model_dtype = ort_session_B._inputs_meta[0].type +in_name_B = ort_session_B.get_inputs() +out_name_B = ort_session_B.get_outputs() +in_name_B0 = in_name_B[0].name +in_name_B1 = in_name_B[1].name +in_name_B2 = in_name_B[2].name +in_name_B3 = in_name_B[3].name +in_name_B4 = in_name_B[4].name +in_name_B5 = in_name_B[5].name +in_name_B6 = in_name_B[6].name +in_name_B7 = in_name_B[7].name +out_name_B0 = out_name_B[0].name +out_name_B1 = out_name_B[1].name + +session_opts.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_ALL +ort_session_C = onnxruntime.InferenceSession(onnx_model_C, sess_options=session_opts, providers=['CPUExecutionProvider'], provider_options=None) +in_name_C = ort_session_C.get_inputs() +out_name_C = ort_session_C.get_outputs() +in_name_C0 = in_name_C[0].name +in_name_C1 = in_name_C[1].name +out_name_C0 = out_name_C[0].name + +# Load the input audio +print(f"\nReference Audio: {reference_audio}") +audio = np.array(AudioSegment.from_file(reference_audio).set_channels(1).set_frame_rate(MODEL_SAMPLE_RATE).get_array_of_samples(), dtype=np.float32) +audio = normalize_to_int16(audio) +audio_len = len(audio) +audio = audio.reshape(1, 1, -1) + +zh_pause_punc = r"。,、;:?!" +ref_text_len = len(ref_text.encode('utf-8')) + 3 * len(re.findall(zh_pause_punc, ref_text)) +gen_text_len = len(gen_text.encode('utf-8')) + 3 * len(re.findall(zh_pause_punc, gen_text)) +ref_audio_len = audio_len // HOP_LENGTH + 1 +max_duration = np.array([ref_audio_len + int(ref_audio_len / ref_text_len * gen_text_len / SPEED)], dtype=np.int64) +gen_text = convert_char_to_pinyin([ref_text + gen_text]) +text_ids = list_str_to_idx(gen_text, vocab_char_map).numpy() +time_step = np.array([0], dtype=np.int32) + +if "CPUExecutionProvider" in ORT_Accelerate_Providers or not ORT_Accelerate_Providers: + device_type = 'cpu' +elif "CUDAExecutionProvider" in ORT_Accelerate_Providers or "TensorrtExecutionProvider" in ORT_Accelerate_Providers: + device_type = 'cuda' +elif "DmlExecutionProvider" in ORT_Accelerate_Providers: + device_type = 'dml' +else: + device_type = None + +def run_pipeline(): + a_out = ort_session_A.run( + [out_name_A0, out_name_A1, out_name_A2, out_name_A3, out_name_A4, out_name_A5, out_name_A6, out_name_A7], + {in_name_A0: audio, in_name_A1: text_ids, in_name_A2: max_duration}) + noise, rope_cos_q, rope_sin_q, rope_cos_k, rope_sin_k, cat_mel_text, cat_mel_text_drop, ref_signal_len = a_out + ts = np.array([0], dtype=np.int32) + if device_type: + inputs = [onnxruntime.OrtValue.ortvalue_from_numpy(x, device_type, DEVICE_ID) for x in + (noise, rope_cos_q, rope_sin_q, rope_cos_k, rope_sin_k, cat_mel_text, cat_mel_text_drop, ts)] + outputs = [inputs[0], inputs[-1]] + iob = ort_session_B.io_binding() + for i in range(len(inputs)): + iob.bind_ortvalue_input(name=in_name_B[i].name, ortvalue=inputs[i]) + for i in range(len(outputs)): + iob.bind_ortvalue_output(name=out_name_B[i].name, ortvalue=outputs[i]) + for _ in range(0, NFE_STEP, FUSE_NFE): + ort_session_B.run_with_iobinding(iob) + noise = onnxruntime.OrtValue.numpy(iob.get_outputs()[0]) + else: + for _ in range(0, NFE_STEP - 1, FUSE_NFE): + noise, ts = ort_session_B.run( + [out_name_B0, out_name_B1], + {in_name_B0: noise, in_name_B1: rope_cos_q, in_name_B2: rope_sin_q, in_name_B3: rope_cos_k, + in_name_B4: rope_sin_k, in_name_B5: cat_mel_text, in_name_B6: cat_mel_text_drop, in_name_B7: ts}) + return ort_session_C.run([out_name_C0], {in_name_C0: noise, in_name_C1: ref_signal_len})[0] + +print(f"\nProvider={ORT_Accelerate_Providers} device_type={device_type} NFE={NFE_STEP}") +print("Warmup (DML kompiliert beim 1. Lauf die Shader) ...") +t0 = time.time(); _ = run_pipeline(); print(f" warmup gen = {time.time()-t0:.2f}s") +best = 1e9 +for k in range(2): + t0 = time.time(); gen = run_pipeline(); dt = time.time() - t0; best = min(best, dt) + print(f" run {k+1}: gen = {dt:.2f}s") +audio_s = gen.reshape(-1).shape[0] / MODEL_SAMPLE_RATE +sf.write(generated_audio, gen.reshape(-1), MODEL_SAMPLE_RATE, format='WAVEX') +rtf = best / max(audio_s, 0.01) +print(f"\n=== ERGEBNIS NFE={NFE_STEP} === audio={audio_s:.2f}s gen(best)={best:.2f}s RTF={rtf:.2f} " + f"({'REAL-TIME' if rtf < 1 else 'zu langsam'})") diff --git a/client/lucy-f5/dakeqq_infer.py b/client/lucy-f5/dakeqq_infer.py new file mode 100644 index 0000000..bf98269 --- /dev/null +++ b/client/lucy-f5/dakeqq_infer.py @@ -0,0 +1,298 @@ +import re +import site +import time +import jieba +import torch +import onnxruntime +import soundfile as sf +import numpy as np +from pydub import AudioSegment +from pypinyin import lazy_pinyin, Style +python_package_path = site.getsitepackages()[-1] + +vocab_path = "/home/DakeQQ/Downloads/F5TTS_v1_Base/vocab.txt" # The F5-TTS model vocab download path. URL: https://huggingface.co/SWivid/F5-TTS/tree/main/F5TTS_v1_Base +onnx_model_A = "/home/DakeQQ/Downloads/F5_Optimized/F5_Preprocess.onnx" # The exported onnx model path. +onnx_model_B = "/home/DakeQQ/Downloads/F5_Optimized/F5_Transformer.onnx" # The exported onnx model path. +onnx_model_C = "/home/DakeQQ/Downloads/F5_Optimized/F5_Decode.onnx" # The exported onnx model path. +generated_audio = "./generated_audio.wav" +test_in_english = False + +if test_in_english: + reference_audio = python_package_path + "/f5_tts/infer/examples/basic/basic_ref_en.wav" + ref_text = "Some call me nature, others call me mother nature." + gen_text = "Some call me Dake, others call me QQ." +else: + reference_audio = python_package_path + "/f5_tts/infer/examples/basic/basic_ref_zh.wav" # The reference audio path. + ref_text = "对,这就是我,万人敬仰的太乙真人。" # The ASR result of reference audio. + gen_text = "对,这就是我,万人敬仰的大可奇奇。" # The target TTS. + + +ORT_Accelerate_Providers = ['CPUExecutionProvider'] # If you have accelerate devices for : ['CUDAExecutionProvider', 'TensorrtExecutionProvider', 'CoreMLExecutionProvider', 'DmlExecutionProvider', 'OpenVINOExecutionProvider', 'ROCMExecutionProvider', 'MIGraphXExecutionProvider', 'AzureExecutionProvider'] + # else keep empty. +RANDOM_SEED = 9527 # Set seed to reproduce the generated audio +NFE_STEP = 32 # F5-TTS model setting, 0~31 +FUSE_NFE = 1 # Maintain the same values as the exported model. +SPEED = 1.0 # Set for talking speed. Only works with dynamic_axes=True +MAX_THREADS = 8 # Max CPU parallel threads. +DEVICE_ID = 0 # The GPU id, default to 0. +MODEL_SAMPLE_RATE = 24000 # Do not modify it. +HOP_LENGTH = 256 # It affects the generated audio length and speech speed. + +if "OpenVINOExecutionProvider" in ORT_Accelerate_Providers: + provider_options = [ + { + 'device_type': 'CPU', # [CPU, NPU, GPU, GPU.0, GPU.1]] + 'precision': 'ACCURACY', # [FP32, FP16, ACCURACY] + 'num_of_threads': MAX_THREADS, + 'num_streams': 1, + 'enable_opencl_throttling': True, + 'enable_qdq_optimizer': False # Enable it carefully + } + ] +elif "CUDAExecutionProvider" in ORT_Accelerate_Providers: + provider_options = [ + { + 'device_id': DEVICE_ID, + 'gpu_mem_limit': 8 * 1024 * 1024 * 1024, # 8 GB + 'arena_extend_strategy': 'kNextPowerOfTwo', + 'cudnn_conv_algo_search': 'EXHAUSTIVE', + 'cudnn_conv_use_max_workspace': '1', + 'do_copy_in_default_stream': '1', + 'cudnn_conv1d_pad_to_nc1d': '1', + 'enable_cuda_graph': '0', # Set to '0' to avoid potential errors when enabled. + 'use_tf32': '0' + } + ] +else: + # Please config by yourself for others providers. + provider_options = None + + +with open(vocab_path, "r", encoding="utf-8") as f: + vocab_char_map = {} + for i, char in enumerate(f): + vocab_char_map[char[:-1]] = i +vocab_size = len(vocab_char_map) + + +# From the official code +def convert_char_to_pinyin(text_list, polyphone=True): + if jieba.dt.initialized is False: + jieba.default_logger.setLevel(50) # CRITICAL + jieba.initialize() + + final_text_list = [] + custom_trans = str.maketrans( + {";": ",", "“": '"', "”": '"', "‘": "'", "’": "'"} + ) # add custom trans here, to address oov + + def is_chinese(c): + return ( + "\u3100" <= c <= "\u9fff" # common chinese characters + ) + + for text in text_list: + char_list = [] + text = text.translate(custom_trans) + for seg in jieba.cut(text): + seg_byte_len = len(bytes(seg, "UTF-8")) + if seg_byte_len == len(seg): # if pure alphabets and symbols + if char_list and seg_byte_len > 1 and char_list[-1] not in " :'\"": + char_list.append(" ") + char_list.extend(seg) + elif polyphone and seg_byte_len == 3 * len(seg): # if pure east asian characters + seg_ = lazy_pinyin(seg, style=Style.TONE3, tone_sandhi=True) + for i, c in enumerate(seg): + if is_chinese(c): + char_list.append(" ") + char_list.append(seg_[i]) + else: # if mixed characters, alphabets and symbols + for c in seg: + if ord(c) < 256: + char_list.extend(c) + elif is_chinese(c): + char_list.append(" ") + char_list.extend(lazy_pinyin(c, style=Style.TONE3, tone_sandhi=True)) + else: + char_list.append(c) + final_text_list.append(char_list) + return final_text_list + + +# From the official code +def list_str_to_idx( + text: list[str] | list[list[str]], + vocab_char_map: dict[str, int], # {char: idx} + padding_value=-1 +): + get_idx = vocab_char_map.get + list_idx_tensors = [torch.tensor([get_idx(c, 0) for c in t], dtype=torch.int32) for t in text] + text = torch.nn.utils.rnn.pad_sequence(list_idx_tensors, padding_value=padding_value, batch_first=True) + return text + + +def normalize_to_int16(audio): + max_val = np.max(np.abs(audio)) + scaling_factor = 32767.0 / max_val if max_val > 0 else 1.0 + return (audio * float(scaling_factor)).astype(np.int16) + + +# ONNX Runtime settings +onnxruntime.set_seed(RANDOM_SEED) +session_opts = onnxruntime.SessionOptions() +session_opts.log_severity_level = 4 # fatal level = 4, it an adjustable value. +session_opts.log_verbosity_level = 4 # fatal level = 4, it an adjustable value. +session_opts.inter_op_num_threads = MAX_THREADS # Run different nodes with num_threads. Set 0 for auto. +session_opts.intra_op_num_threads = MAX_THREADS # Under the node, execute the operators with num_threads. Set 0 for auto. +session_opts.enable_cpu_mem_arena = True # True for execute speed; False for less memory usage. +session_opts.execution_mode = onnxruntime.ExecutionMode.ORT_SEQUENTIAL +session_opts.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_ALL +session_opts.add_session_config_entry("session.intra_op.allow_spinning", "1") +session_opts.add_session_config_entry("session.inter_op.allow_spinning", "1") +session_opts.add_session_config_entry("session.set_denormal_as_zero", "1") + +session_opts.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_ALL +ort_session_A = onnxruntime.InferenceSession(onnx_model_A, sess_options=session_opts, providers=['CPUExecutionProvider'], provider_options=None) +model_type = ort_session_A._inputs_meta[0].type +in_name_A = ort_session_A.get_inputs() +out_name_A = ort_session_A.get_outputs() +in_name_A0 = in_name_A[0].name +in_name_A1 = in_name_A[1].name +in_name_A2 = in_name_A[2].name +out_name_A0 = out_name_A[0].name +out_name_A1 = out_name_A[1].name +out_name_A2 = out_name_A[2].name +out_name_A3 = out_name_A[3].name +out_name_A4 = out_name_A[4].name +out_name_A5 = out_name_A[5].name +out_name_A6 = out_name_A[6].name +out_name_A7 = out_name_A[7].name + +if "CPUExecutionProvider" in ORT_Accelerate_Providers or not ORT_Accelerate_Providers: + session_opts.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_ALL +else: + session_opts.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_BASIC +ort_session_B = onnxruntime.InferenceSession(onnx_model_B, sess_options=session_opts, providers=ORT_Accelerate_Providers, provider_options=provider_options) +ORT_Accelerate_Providers = ort_session_B.get_providers()[0] +# For Windows DirectML + Intel/AMD/Nvidia GPU, +# pip install onnxruntime-directml --upgrade +# ort_session_B = onnxruntime.InferenceSession(onnx_model_B, sess_options=session_opts, providers=['DmlExecutionProvider']) +print(f"\nUsable Providers: {ORT_Accelerate_Providers}") +model_dtype = ort_session_B._inputs_meta[0].type +in_name_B = ort_session_B.get_inputs() +out_name_B = ort_session_B.get_outputs() +in_name_B0 = in_name_B[0].name +in_name_B1 = in_name_B[1].name +in_name_B2 = in_name_B[2].name +in_name_B3 = in_name_B[3].name +in_name_B4 = in_name_B[4].name +in_name_B5 = in_name_B[5].name +in_name_B6 = in_name_B[6].name +in_name_B7 = in_name_B[7].name +out_name_B0 = out_name_B[0].name +out_name_B1 = out_name_B[1].name + +session_opts.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_ALL +ort_session_C = onnxruntime.InferenceSession(onnx_model_C, sess_options=session_opts, providers=['CPUExecutionProvider'], provider_options=None) +in_name_C = ort_session_C.get_inputs() +out_name_C = ort_session_C.get_outputs() +in_name_C0 = in_name_C[0].name +in_name_C1 = in_name_C[1].name +out_name_C0 = out_name_C[0].name + +# Load the input audio +print(f"\nReference Audio: {reference_audio}") +audio = np.array(AudioSegment.from_file(reference_audio).set_channels(1).set_frame_rate(MODEL_SAMPLE_RATE).get_array_of_samples(), dtype=np.float32) +audio = normalize_to_int16(audio) +audio_len = len(audio) +audio = audio.reshape(1, 1, -1) + +zh_pause_punc = r"。,、;:?!" +ref_text_len = len(ref_text.encode('utf-8')) + 3 * len(re.findall(zh_pause_punc, ref_text)) +gen_text_len = len(gen_text.encode('utf-8')) + 3 * len(re.findall(zh_pause_punc, gen_text)) +ref_audio_len = audio_len // HOP_LENGTH + 1 +max_duration = np.array([ref_audio_len + int(ref_audio_len / ref_text_len * gen_text_len / SPEED)], dtype=np.int64) +gen_text = convert_char_to_pinyin([ref_text + gen_text]) +text_ids = list_str_to_idx(gen_text, vocab_char_map).numpy() +time_step = np.array([0], dtype=np.int32) + +if "CPUExecutionProvider" in ORT_Accelerate_Providers or not ORT_Accelerate_Providers: + device_type = 'cpu' +elif "CUDAExecutionProvider" in ORT_Accelerate_Providers or "TensorrtExecutionProvider" in ORT_Accelerate_Providers: + device_type = 'cuda' +elif "DmlExecutionProvider" in ORT_Accelerate_Providers: + device_type = 'dml' +else: + device_type = None + +print("\n\nRun F5-TTS by ONNX Runtime.") +start_count = time.time() +noise, rope_cos_q, rope_sin_q, rope_cos_k, rope_sin_k, cat_mel_text, cat_mel_text_drop, ref_signal_len = ort_session_A.run( + [out_name_A0, out_name_A1, out_name_A2, out_name_A3, out_name_A4, out_name_A5, out_name_A6, out_name_A7], + { + in_name_A0: audio, + in_name_A1: text_ids, + in_name_A2: max_duration + }) + +if device_type: + inputs = [ + onnxruntime.OrtValue.ortvalue_from_numpy(noise, device_type, DEVICE_ID), + onnxruntime.OrtValue.ortvalue_from_numpy(rope_cos_q, device_type, DEVICE_ID), + onnxruntime.OrtValue.ortvalue_from_numpy(rope_sin_q, device_type, DEVICE_ID), + onnxruntime.OrtValue.ortvalue_from_numpy(rope_cos_k, device_type, DEVICE_ID), + onnxruntime.OrtValue.ortvalue_from_numpy(rope_sin_k, device_type, DEVICE_ID), + onnxruntime.OrtValue.ortvalue_from_numpy(cat_mel_text, device_type, DEVICE_ID), + onnxruntime.OrtValue.ortvalue_from_numpy(cat_mel_text_drop, device_type, DEVICE_ID), + onnxruntime.OrtValue.ortvalue_from_numpy(time_step, device_type, DEVICE_ID) + ] + outputs = [ + inputs[0], + inputs[-1] + ] + + io_binding = ort_session_B.io_binding() + for i in range(len(inputs)): + io_binding.bind_ortvalue_input( + name=in_name_B[i].name, + ortvalue=inputs[i] + ) + for i in range(len(outputs)): + io_binding.bind_ortvalue_output( + name=out_name_B[i].name, + ortvalue=outputs[i] + ) + + print("NFE_STEP: 0") + for i in range(0, NFE_STEP, FUSE_NFE): + ort_session_B.run_with_iobinding(io_binding) + print(f"NFE_STEP: {i + FUSE_NFE}") + noise = onnxruntime.OrtValue.numpy(io_binding.get_outputs()[0]) +else: + print("NFE_STEP: 0") + for i in range(0, NFE_STEP - 1, FUSE_NFE): + noise, time_step = ort_session_B.run( + [out_name_B0, out_name_B1], + { + in_name_B0: noise, + in_name_B1: rope_cos_q, + in_name_B2: rope_sin_q, + in_name_B3: rope_cos_k, + in_name_B4: rope_sin_k, + in_name_B5: cat_mel_text, + in_name_B6: cat_mel_text_drop, + in_name_B7: time_step + }) + print(f"NFE_STEP: {i + FUSE_NFE}") + +generated_signal = ort_session_C.run( + [out_name_C0], + { + in_name_C0: noise, + in_name_C1: ref_signal_len + })[0] +end_count = time.time() + +# Save to audio +sf.write(generated_audio, generated_signal.reshape(-1), MODEL_SAMPLE_RATE, format='WAVEX') +print(f"\nAudio generation is complete.\n\nONNXRuntime Time Cost in Seconds:\n{end_count - start_count:.3f}") diff --git a/client/lucy-f5/f5_server.py b/client/lucy-f5/f5_server.py new file mode 100644 index 0000000..87d9806 --- /dev/null +++ b/client/lucy-f5/f5_server.py @@ -0,0 +1,196 @@ +# -*- coding: utf-8 -*- +"""Lucy-Stimme v2: F5-TTS (deutsch) via ONNX Runtime + DirectML (9070 XT, nativ Windows, kein ROCm). +Non-autoregressiv -> keine Kollaps-/Wiederhol-/Männerstimmen-Fehler wie pocket. Satzweises Streaming. +Modelliert nach dem verifizierten DML-Benchmark (bench_dml.py) + Export_F5-Preprocessing + pocket_server-Struktur.""" +import os, io, re, time, threading, logging +import numpy as np, soundfile as sf, librosa, jieba, torch +import onnxruntime as ort +from pypinyin import lazy_pinyin, Style +from fastapi import FastAPI +from fastapi.responses import Response, JSONResponse, StreamingResponse +from pydantic import BaseModel +from contextlib import asynccontextmanager + +log = logging.getLogger("lucy-f5"); logging.basicConfig(level=logging.INFO) +BASE = os.path.dirname(os.path.abspath(__file__)) +ONNX_DIR = os.environ.get("LUCY_F5_ONNX", os.path.join(BASE, "onnx_de")) +VOCAB = os.environ.get("LUCY_F5_VOCAB", os.path.join(BASE, "vocab.txt")) +REF_WAV = os.environ.get("LUCY_F5_REF", os.path.join(BASE, "lucy_ref.wav")) +REF_TXT = os.environ.get("LUCY_F5_REF_TXT", os.path.join(BASE, "lucy_ref.txt")) +PROVIDER = os.environ.get("LUCY_F5_PROVIDER", "DmlExecutionProvider") +NFE_STEP = int(os.environ.get("LUCY_F5_NFE", "32")) # MUSS zum Export passen (Zeitplan ist eingebacken) +TARGET_RMS = float(os.environ.get("LUCY_TARGET_RMS", "0.09")) +SR = 24000; HOP_LENGTH = 256 +STATE, LOCK = {}, threading.Lock() + +# ---- Text-Preprocessing (aus Export_F5.py; für Deutsch laufen Nicht-CJK-Zeichen einfach durch) ---- +def _load_vocab(path): + m = {} + with open(path, "r", encoding="utf-8") as f: + for i, ch in enumerate(f): + m[ch[:-1]] = i + return m + +def convert_char_to_pinyin(text_list, polyphone=True): + if jieba.dt.initialized is False: + jieba.default_logger.setLevel(50); jieba.initialize() + out, trans = [], str.maketrans({";": ",", "“": '"', "”": '"', "‘": "'", "’": "'"}) + def is_zh(c): return "㄀" <= c <= "鿿" + for text in text_list: + cl = []; text = text.translate(trans) + for seg in jieba.cut(text): + blen = len(bytes(seg, "UTF-8")) + if blen == len(seg): + if cl and blen > 1 and cl[-1] not in " :'\"": cl.append(" ") + cl.extend(seg) + elif polyphone and blen == 3 * len(seg): + pin = lazy_pinyin(seg, style=Style.TONE3, tone_sandhi=True) + for i, c in enumerate(seg): + if is_zh(c): cl.append(" ") + cl.append(pin[i]) + else: + for c in seg: + if ord(c) < 256: cl.extend(c) + elif is_zh(c): cl.append(" "); cl.extend(lazy_pinyin(c, style=Style.TONE3, tone_sandhi=True)) + else: cl.append(c) + out.append(cl) + return out + +def list_str_to_idx(text, vocab_map, padding_value=-1): + get = vocab_map.get + tensors = [torch.tensor([get(c, 0) for c in t], dtype=torch.int32) for t in text] + return torch.nn.utils.rnn.pad_sequence(tensors, padding_value=padding_value, batch_first=True).numpy() + +_ZH_PUNC = r"。,、;:?!" +def _text_len(s): return len(s.encode("utf-8")) + 3 * len(re.findall(_ZH_PUNC, s)) + +# ---- Satz-Splitter (wie pocket) ---- +_SENT_RX = re.compile(r".+?(?:[.!?…]+(?:\s|$)|$)", re.S) +def split_sentences(text, min_len=30): + parts = [m.group(0).strip() for m in _SENT_RX.finditer(text.strip())] + out = [] + for p in parts: + if not p: continue + if out and len(out[-1]) < min_len: out[-1] = f"{out[-1]} {p}" + else: out.append(p) + return out or [text.strip()] + +def cleanup(a, sr): + """F5-Output putzen: Stille-Trim hinten, RMS-Norm auf TARGET_RMS, Peak-Clamp, 80ms-Pads.""" + a = np.asarray(a, dtype=np.float32).reshape(-1) + if a.size == 0: return a + rev, _ = librosa.effects.trim(a[::-1], top_db=40); a = rev[::-1] if rev.size else a + yt, _ = librosa.effects.trim(a, top_db=40); a = yt if yt.size else a + rms = float(np.sqrt(np.mean(a ** 2))) or 1e-9 + a = a * (TARGET_RMS / rms) + peak = float(np.max(np.abs(a))) + if peak > 0.95: a = a * (0.95 / peak) + fi = min(int(0.008 * sr), a.size // 2) + if fi > 0: + a[:fi] *= np.linspace(0., 1., fi, dtype=np.float32); a[-fi:] *= np.linspace(1., 0., fi, dtype=np.float32) + pad = np.zeros(int(0.08 * sr), dtype=np.float32) + return np.concatenate([pad, a, pad]) + +def _to_pcm16(a): + a = np.asarray(a, dtype=np.float32).reshape(-1) + np.clip(a, -0.95, 0.95, out=a) + return (a * 32767.0).astype(" np.ndarray: + s = STATE + ref_text = s["ref_text"] + rt_len = _text_len(ref_text); gt_len = max(_text_len(gen_text), 1) + ref_audio_len = s["ref_audio"].shape[-1] // HOP_LENGTH + 1 + max_duration = np.array([ref_audio_len + int(ref_audio_len / rt_len * gt_len)], dtype=np.int64) + text = convert_char_to_pinyin([ref_text + gen_text]) + text_ids = list_str_to_idx(text, s["vocab"]) + A = s["A"].run(s["A_out"], {s["A_in"][0]: s["ref_audio"], s["A_in"][1]: text_ids, s["A_in"][2]: max_duration}) + noise, rcq, rsq, rck, rsk, cmt, cmtd, ref_signal_len = A + dev = s["dev"] + if dev: # DirectML/CUDA: io_binding, Tensoren GPU-resident über die NFE-Schleife + ts = np.array([0], dtype=np.int32) + ins = [ort.OrtValue.ortvalue_from_numpy(x, dev, 0) for x in (noise, rcq, rsq, rck, rsk, cmt, cmtd, ts)] + outs = [ins[0], ins[-1]] + iob = s["B"].io_binding() + for i in range(len(ins)): iob.bind_ortvalue_input(name=s["B_in"][i], ortvalue=ins[i]) + for i in range(len(outs)): iob.bind_ortvalue_output(name=s["B_out"][i], ortvalue=outs[i]) + for _ in range(0, NFE_STEP, 1): s["B"].run_with_iobinding(iob) + noise = ort.OrtValue.numpy(iob.get_outputs()[0]) + else: + ts = np.array([0], dtype=np.int32) + for _ in range(0, NFE_STEP - 1, 1): + noise, ts = s["B"].run(s["B_out"], {s["B_in"][0]: noise, s["B_in"][1]: rcq, s["B_in"][2]: rsq, + s["B_in"][3]: rck, s["B_in"][4]: rsk, s["B_in"][5]: cmt, s["B_in"][6]: cmtd, s["B_in"][7]: ts}) + out = s["C"].run([s["C_out"]], {s["C_in"][0]: noise, s["C_in"][1]: ref_signal_len})[0] + a = np.asarray(out).reshape(-1).astype(np.float32) + if a.dtype != np.float32 or np.max(np.abs(a)) > 1.5: # int16-Decoder -> auf float + a = a / 32768.0 + return a + +@asynccontextmanager +async def lifespan(app): + t0 = time.time(); log.info("Lade F5 ONNX (%s) ...", PROVIDER) + so = ort.SessionOptions(); so.log_severity_level = 4 + so.graph_optimization_level = ort.GraphOptimizationLevel.ORT_ENABLE_ALL + A = ort.InferenceSession(os.path.join(ONNX_DIR, "F5_Preprocess.onnx"), so, providers=["CPUExecutionProvider"]) + B = ort.InferenceSession(os.path.join(ONNX_DIR, "F5_Transformer.onnx"), so, providers=[PROVIDER]) + C = ort.InferenceSession(os.path.join(ONNX_DIR, "F5_Decode.onnx"), so, providers=["CPUExecutionProvider"]) + prov = B.get_providers()[0] + dev = "dml" if "Dml" in prov else ("cuda" if "CUDA" in prov or "Tensorrt" in prov else None) + # Lucy-Referenz als int16 laden (Decoder/Preprocess erwartet int16-Pfad) + ref, _sr = sf.read(REF_WAV, dtype="float32", always_2d=False) + ref = np.asarray(ref, dtype=np.float32).reshape(-1) + if _sr != SR: ref = librosa.resample(ref, orig_sr=_sr, target_sr=SR) + mx = np.max(np.abs(ref)) or 1.0 + ref_i16 = (ref * (32767.0 / mx)).astype(np.int16).reshape(1, 1, -1) + STATE.update( + A=A, B=B, C=C, dev=dev, prov=prov, + A_in=[i.name for i in A.get_inputs()], A_out=[o.name for o in A.get_outputs()], + B_in=[i.name for i in B.get_inputs()], B_out=[o.name for o in B.get_outputs()], + C_in=[i.name for i in C.get_inputs()], C_out=C.get_outputs()[0].name, + vocab=_load_vocab(VOCAB), ref_audio=ref_i16, + ref_text=open(REF_TXT, encoding="utf-8").read().strip(), + ) + log.info("Lucy-F5 bereit in %.1fs (Provider=%s, dev=%s, NFE=%d)", time.time() - t0, prov, dev, NFE_STEP) + yield + STATE.clear() + +app = FastAPI(title="Lucy TTS (F5/DirectML)", lifespan=lifespan) + +class Req(BaseModel): + text: str + +@app.get("/health") +def health(): + return {"status": "ok" if "A" in STATE else "loading", "engine": "f5-tts", + "provider": STATE.get("prov"), "nfe": NFE_STEP, "sr": SR} + +@app.post("/tts") +def tts(req: Req): + if "A" not in STATE: return JSONResponse({"error": "loading"}, status_code=503) + t0 = time.time() + parts = [] + with LOCK: + for sent in split_sentences(req.text): + parts.append(cleanup(_infer(sent), SR)) + a = np.concatenate(parts) if parts else np.zeros(0, np.float32) + buf = io.BytesIO(); sf.write(buf, a, SR, format="WAV", subtype="PCM_16"); buf.seek(0) + dur = a.size / SR; gen = time.time() - t0 + log.info("/tts %dZ audio=%.1fs gen=%.1fs rtf=%.2f", len(req.text), dur, gen, gen / max(dur, 0.01)) + return Response(buf.read(), media_type="audio/wav", + headers={"X-Audio-Seconds": f"{dur:.2f}", "X-Gen-Seconds": f"{gen:.2f}"}) + +@app.post("/tts/stream") +def tts_stream(req: Req): + if "A" not in STATE: return JSONResponse({"error": "loading"}, status_code=503) + sentences = split_sentences(req.text) + def pcm(): + t0 = time.time(); total = 0; first = True + with LOCK: + for sent in sentences: + a = cleanup(_infer(sent), SR); total += a.size + if first: log.info("/tts/stream TTFB=%.2fs (%d Sätze)", time.time() - t0, len(sentences)); first = False + yield _to_pcm16(a) + log.info("/tts/stream %dZ audio=%.1fs gen=%.1fs", len(req.text), total / SR, time.time() - t0) + return StreamingResponse(pcm(), media_type="application/octet-stream", headers={"X-Sample-Rate": str(SR)}) diff --git a/client/lucy-f5/f5_test.py b/client/lucy-f5/f5_test.py new file mode 100644 index 0000000..d35db51 --- /dev/null +++ b/client/lucy-f5/f5_test.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +"""F5-TTS Qualitäts-/Tempo-Test (CPU): dt. Finetune + Lucy-Klon. Gleiche Sätze wie pocket -> A/B.""" +import os, time, soundfile as sf, numpy as np, torch +# torchcodec/ffmpeg fehlt -> torchaudio.load/save auf soundfile umbiegen (wie bei OuteTTS-Patch) +import torchaudio +def _ta_load(path, *a, **k): + data, sr = sf.read(str(path), dtype="float32", always_2d=True) + return torch.from_numpy(data.T.copy()), sr +def _ta_save(path, tensor, sr, *a, **k): + arr = np.asarray(tensor.detach().cpu().numpy()) + sf.write(str(path), arr.T if arr.ndim == 2 else arr, sr) +torchaudio.load = _ta_load +torchaudio.save = _ta_save +from f5_tts.api import F5TTS + +BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-f5" +OUT = r"C:\Users\TobisPC\Desktop\lucy_f5_test"; os.makedirs(OUT, exist_ok=True) +ref = os.path.join(BASE, "lucy_ref.wav") +ref_text = open(os.path.join(BASE, "lucy_ref.txt"), encoding="utf-8").read().strip() +print("REF_TEXT:", ref_text[:80], flush=True) + +t0 = time.time() +f5 = F5TTS(model="F5TTS_Base", + ckpt_file=os.path.join(BASE, "model_f5tts_german.safetensors"), + vocab_file=os.path.join(BASE, "vocab.txt"), device="cpu") +print(f"Modell geladen in {time.time()-t0:.1f}s (Vocoder evtl. erst geladen)", flush=True) + +SENT = { + "kurz": "Hallo Commander, ich höre dich.", + "mittel":"Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", + "lang": "Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft.", +} +for name, text in SENT.items(): + t0 = time.time() + wav, sr, _ = f5.infer(ref_file=ref, ref_text=ref_text, gen_text=text, + nfe_step=32, target_rms=0.1, remove_silence=True) + dt = time.time() - t0 + wav = np.asarray(wav, dtype=np.float32).reshape(-1) + peak = float(np.max(np.abs(wav))) # Peak-Limiter gegen Clipping (F5 traf 1.0) + if peak > 0.95: wav = wav * (0.95 / peak) + sf.write(os.path.join(OUT, f"{name}.wav"), wav, sr) + secs = len(wav) / sr + print(f"[{name:6}] gen={dt:6.1f}s audio={secs:5.1f}s RTF={dt/max(secs,0.01):5.2f}", flush=True) +print("F5_TEST_DONE", flush=True) diff --git a/client/lucy-f5/lucy_ref.txt b/client/lucy-f5/lucy_ref.txt new file mode 100644 index 0000000..d8a4918 --- /dev/null +++ b/client/lucy-f5/lucy_ref.txt @@ -0,0 +1 @@ +Hallo, schön, dass du da bist. Ich bin deine persönliche Assistentin und begleite dich durch deinen Tag. \ No newline at end of file diff --git a/client/lucy-f5/vocab.txt b/client/lucy-f5/vocab.txt new file mode 100644 index 0000000..a30a90c --- /dev/null +++ b/client/lucy-f5/vocab.txt @@ -0,0 +1,2545 @@ + +! +" +# +$ +% +& +' +( +) +* ++ +, +- +. +/ +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +: +; += +> +? +@ +A +B +C +D +E +F +G +H +I +J +K +L +M +N +O +P +Q +R +S +T +U +V +W +X +Y +Z +[ +\ +] +_ +a +a1 +ai1 +ai2 +ai3 +ai4 +an1 +an3 +an4 +ang1 +ang2 +ang4 +ao1 +ao2 +ao3 +ao4 +b +ba +ba1 +ba2 +ba3 +ba4 +bai1 +bai2 +bai3 +bai4 +ban1 +ban2 +ban3 +ban4 +bang1 +bang2 +bang3 +bang4 +bao1 +bao2 +bao3 +bao4 +bei +bei1 +bei2 +bei3 +bei4 +ben1 +ben2 +ben3 +ben4 +beng +beng1 +beng2 +beng3 +beng4 +bi1 +bi2 +bi3 +bi4 +bian1 +bian2 +bian3 +bian4 +biao1 +biao2 +biao3 +bie1 +bie2 +bie3 +bie4 +bin1 +bin4 +bing1 +bing2 +bing3 +bing4 +bo +bo1 +bo2 +bo3 +bo4 +bu2 +bu3 +bu4 +c +ca1 +cai1 +cai2 +cai3 +cai4 +can1 +can2 +can3 +can4 +cang1 +cang2 +cao1 +cao2 +cao3 +ce4 +cen1 +cen2 +ceng1 +ceng2 +ceng4 +cha1 +cha2 +cha3 +cha4 +chai1 +chai2 +chan1 +chan2 +chan3 +chan4 +chang1 +chang2 +chang3 +chang4 +chao1 +chao2 +chao3 +che1 +che2 +che3 +che4 +chen1 +chen2 +chen3 +chen4 +cheng1 +cheng2 +cheng3 +cheng4 +chi1 +chi2 +chi3 +chi4 +chong1 +chong2 +chong3 +chong4 +chou1 +chou2 +chou3 +chou4 +chu1 +chu2 +chu3 +chu4 +chua1 +chuai1 +chuai2 +chuai3 +chuai4 +chuan1 +chuan2 +chuan3 +chuan4 +chuang1 +chuang2 +chuang3 +chuang4 +chui1 +chui2 +chun1 +chun2 +chun3 +chuo1 +chuo4 +ci1 +ci2 +ci3 +ci4 +cong1 +cong2 +cou4 +cu1 +cu4 +cuan1 +cuan2 +cuan4 +cui1 +cui3 +cui4 +cun1 +cun2 +cun4 +cuo1 +cuo2 +cuo4 +d +da +da1 +da2 +da3 +da4 +dai1 +dai2 +dai3 +dai4 +dan1 +dan2 +dan3 +dan4 +dang1 +dang2 +dang3 +dang4 +dao1 +dao2 +dao3 +dao4 +de +de1 +de2 +dei3 +den4 +deng1 +deng2 +deng3 +deng4 +di1 +di2 +di3 +di4 +dia3 +dian1 +dian2 +dian3 +dian4 +diao1 +diao3 +diao4 +die1 +die2 +die4 +ding1 +ding2 +ding3 +ding4 +diu1 +dong1 +dong3 +dong4 +dou1 +dou2 +dou3 +dou4 +du1 +du2 +du3 +du4 +duan1 +duan2 +duan3 +duan4 +dui1 +dui4 +dun1 +dun3 +dun4 +duo1 +duo2 +duo3 +duo4 +e +e1 +e2 +e3 +e4 +ei2 +en1 +en4 +er +er2 +er3 +er4 +f +fa1 +fa2 +fa3 +fa4 +fan1 +fan2 +fan3 +fan4 +fang1 +fang2 +fang3 +fang4 +fei1 +fei2 +fei3 +fei4 +fen1 +fen2 +fen3 +fen4 +feng1 +feng2 +feng3 +feng4 +fo2 +fou2 +fou3 +fu1 +fu2 +fu3 +fu4 +g +ga1 +ga2 +ga3 +ga4 +gai1 +gai2 +gai3 +gai4 +gan1 +gan2 +gan3 +gan4 +gang1 +gang2 +gang3 +gang4 +gao1 +gao2 +gao3 +gao4 +ge1 +ge2 +ge3 +ge4 +gei2 +gei3 +gen1 +gen2 +gen3 +gen4 +geng1 +geng3 +geng4 +gong1 +gong3 +gong4 +gou1 +gou2 +gou3 +gou4 +gu +gu1 +gu2 +gu3 +gu4 +gua1 +gua2 +gua3 +gua4 +guai1 +guai2 +guai3 +guai4 +guan1 +guan2 +guan3 +guan4 +guang1 +guang2 +guang3 +guang4 +gui1 +gui2 +gui3 +gui4 +gun3 +gun4 +guo1 +guo2 +guo3 +guo4 +h +ha1 +ha2 +ha3 +hai1 +hai2 +hai3 +hai4 +han1 +han2 +han3 +han4 +hang1 +hang2 +hang4 +hao1 +hao2 +hao3 +hao4 +he1 +he2 +he4 +hei1 +hen2 +hen3 +hen4 +heng1 +heng2 +heng4 +hong1 +hong2 +hong3 +hong4 +hou1 +hou2 +hou3 +hou4 +hu1 +hu2 +hu3 +hu4 +hua1 +hua2 +hua4 +huai2 +huai4 +huan1 +huan2 +huan3 +huan4 +huang1 +huang2 +huang3 +huang4 +hui1 +hui2 +hui3 +hui4 +hun1 +hun2 +hun4 +huo +huo1 +huo2 +huo3 +huo4 +i +j +ji1 +ji2 +ji3 +ji4 +jia +jia1 +jia2 +jia3 +jia4 +jian1 +jian2 +jian3 +jian4 +jiang1 +jiang2 +jiang3 +jiang4 +jiao1 +jiao2 +jiao3 +jiao4 +jie1 +jie2 +jie3 +jie4 +jin1 +jin2 +jin3 +jin4 +jing1 +jing2 +jing3 +jing4 +jiong3 +jiu1 +jiu2 +jiu3 +jiu4 +ju1 +ju2 +ju3 +ju4 +juan1 +juan2 +juan3 +juan4 +jue1 +jue2 +jue4 +jun1 +jun4 +k +ka1 +ka2 +ka3 +kai1 +kai2 +kai3 +kai4 +kan1 +kan2 +kan3 +kan4 +kang1 +kang2 +kang4 +kao1 +kao2 +kao3 +kao4 +ke1 +ke2 +ke3 +ke4 +ken3 +keng1 +kong1 +kong3 +kong4 +kou1 +kou2 +kou3 +kou4 +ku1 +ku2 +ku3 +ku4 +kua1 +kua3 +kua4 +kuai3 +kuai4 +kuan1 +kuan2 +kuan3 +kuang1 +kuang2 +kuang4 +kui1 +kui2 +kui3 +kui4 +kun1 +kun3 +kun4 +kuo4 +l +la +la1 +la2 +la3 +la4 +lai2 +lai4 +lan2 +lan3 +lan4 +lang1 +lang2 +lang3 +lang4 +lao1 +lao2 +lao3 +lao4 +le +le1 +le4 +lei +lei1 +lei2 +lei3 +lei4 +leng1 +leng2 +leng3 +leng4 +li +li1 +li2 +li3 +li4 +lia3 +lian2 +lian3 +lian4 +liang2 +liang3 +liang4 +liao1 +liao2 +liao3 +liao4 +lie1 +lie2 +lie3 +lie4 +lin1 +lin2 +lin3 +lin4 +ling2 +ling3 +ling4 +liu1 +liu2 +liu3 +liu4 +long1 +long2 +long3 +long4 +lou1 +lou2 +lou3 +lou4 +lu1 +lu2 +lu3 +lu4 +luan2 +luan3 +luan4 +lun1 +lun2 +lun4 +luo1 +luo2 +luo3 +luo4 +lv2 +lv3 +lv4 +lve3 +lve4 +m +ma +ma1 +ma2 +ma3 +ma4 +mai2 +mai3 +mai4 +man1 +man2 +man3 +man4 +mang2 +mang3 +mao1 +mao2 +mao3 +mao4 +me +mei2 +mei3 +mei4 +men +men1 +men2 +men4 +meng +meng1 +meng2 +meng3 +meng4 +mi1 +mi2 +mi3 +mi4 +mian2 +mian3 +mian4 +miao1 +miao2 +miao3 +miao4 +mie1 +mie4 +min2 +min3 +ming2 +ming3 +ming4 +miu4 +mo1 +mo2 +mo3 +mo4 +mou1 +mou2 +mou3 +mu2 +mu3 +mu4 +n +n2 +na1 +na2 +na3 +na4 +nai2 +nai3 +nai4 +nan1 +nan2 +nan3 +nan4 +nang1 +nang2 +nang3 +nao1 +nao2 +nao3 +nao4 +ne +ne2 +ne4 +nei3 +nei4 +nen4 +neng2 +ni1 +ni2 +ni3 +ni4 +nian1 +nian2 +nian3 +nian4 +niang2 +niang4 +niao2 +niao3 +niao4 +nie1 +nie4 +nin2 +ning2 +ning3 +ning4 +niu1 +niu2 +niu3 +niu4 +nong2 +nong4 +nou4 +nu2 +nu3 +nu4 +nuan3 +nuo2 +nuo4 +nv2 +nv3 +nve4 +o +o1 +o2 +ou1 +ou2 +ou3 +ou4 +p +pa1 +pa2 +pa4 +pai1 +pai2 +pai3 +pai4 +pan1 +pan2 +pan4 +pang1 +pang2 +pang4 +pao1 +pao2 +pao3 +pao4 +pei1 +pei2 +pei4 +pen1 +pen2 +pen4 +peng1 +peng2 +peng3 +peng4 +pi1 +pi2 +pi3 +pi4 +pian1 +pian2 +pian4 +piao1 +piao2 +piao3 +piao4 +pie1 +pie2 +pie3 +pin1 +pin2 +pin3 +pin4 +ping1 +ping2 +po1 +po2 +po3 +po4 +pou1 +pu1 +pu2 +pu3 +pu4 +q +qi1 +qi2 +qi3 +qi4 +qia1 +qia3 +qia4 +qian1 +qian2 +qian3 +qian4 +qiang1 +qiang2 +qiang3 +qiang4 +qiao1 +qiao2 +qiao3 +qiao4 +qie1 +qie2 +qie3 +qie4 +qin1 +qin2 +qin3 +qin4 +qing1 +qing2 +qing3 +qing4 +qiong1 +qiong2 +qiu1 +qiu2 +qiu3 +qu1 +qu2 +qu3 +qu4 +quan1 +quan2 +quan3 +quan4 +que1 +que2 +que4 +qun2 +r +ran2 +ran3 +rang1 +rang2 +rang3 +rang4 +rao2 +rao3 +rao4 +re2 +re3 +re4 +ren2 +ren3 +ren4 +reng1 +reng2 +ri4 +rong1 +rong2 +rong3 +rou2 +rou4 +ru2 +ru3 +ru4 +ruan2 +ruan3 +rui3 +rui4 +run4 +ruo4 +s +sa1 +sa2 +sa3 +sa4 +sai1 +sai4 +san1 +san2 +san3 +san4 +sang1 +sang3 +sang4 +sao1 +sao2 +sao3 +sao4 +se4 +sen1 +seng1 +sha1 +sha2 +sha3 +sha4 +shai1 +shai2 +shai3 +shai4 +shan1 +shan3 +shan4 +shang +shang1 +shang3 +shang4 +shao1 +shao2 +shao3 +shao4 +she1 +she2 +she3 +she4 +shei2 +shen1 +shen2 +shen3 +shen4 +sheng1 +sheng2 +sheng3 +sheng4 +shi +shi1 +shi2 +shi3 +shi4 +shou1 +shou2 +shou3 +shou4 +shu1 +shu2 +shu3 +shu4 +shua1 +shua2 +shua3 +shua4 +shuai1 +shuai3 +shuai4 +shuan1 +shuan4 +shuang1 +shuang3 +shui2 +shui3 +shui4 +shun3 +shun4 +shuo1 +shuo4 +si1 +si2 +si3 +si4 +song1 +song3 +song4 +sou1 +sou3 +sou4 +su1 +su2 +su4 +suan1 +suan4 +sui1 +sui2 +sui3 +sui4 +sun1 +sun3 +suo +suo1 +suo2 +suo3 +t +ta1 +ta2 +ta3 +ta4 +tai1 +tai2 +tai4 +tan1 +tan2 +tan3 +tan4 +tang1 +tang2 +tang3 +tang4 +tao1 +tao2 +tao3 +tao4 +te4 +teng2 +ti1 +ti2 +ti3 +ti4 +tian1 +tian2 +tian3 +tiao1 +tiao2 +tiao3 +tiao4 +tie1 +tie2 +tie3 +tie4 +ting1 +ting2 +ting3 +tong1 +tong2 +tong3 +tong4 +tou +tou1 +tou2 +tou4 +tu1 +tu2 +tu3 +tu4 +tuan1 +tuan2 +tui1 +tui2 +tui3 +tui4 +tun1 +tun2 +tun4 +tuo1 +tuo2 +tuo3 +tuo4 +u +v +w +wa +wa1 +wa2 +wa3 +wa4 +wai1 +wai3 +wai4 +wan1 +wan2 +wan3 +wan4 +wang1 +wang2 +wang3 +wang4 +wei1 +wei2 +wei3 +wei4 +wen1 +wen2 +wen3 +wen4 +weng1 +weng4 +wo1 +wo2 +wo3 +wo4 +wu1 +wu2 +wu3 +wu4 +x +xi1 +xi2 +xi3 +xi4 +xia1 +xia2 +xia4 +xian1 +xian2 +xian3 +xian4 +xiang1 +xiang2 +xiang3 +xiang4 +xiao1 +xiao2 +xiao3 +xiao4 +xie1 +xie2 +xie3 +xie4 +xin1 +xin2 +xin4 +xing1 +xing2 +xing3 +xing4 +xiong1 +xiong2 +xiu1 +xiu3 +xiu4 +xu +xu1 +xu2 +xu3 +xu4 +xuan1 +xuan2 +xuan3 +xuan4 +xue1 +xue2 +xue3 +xue4 +xun1 +xun2 +xun4 +y +ya +ya1 +ya2 +ya3 +ya4 +yan1 +yan2 +yan3 +yan4 +yang1 +yang2 +yang3 +yang4 +yao1 +yao2 +yao3 +yao4 +ye1 +ye2 +ye3 +ye4 +yi +yi1 +yi2 +yi3 +yi4 +yin1 +yin2 +yin3 +yin4 +ying1 +ying2 +ying3 +ying4 +yo1 +yong1 +yong2 +yong3 +yong4 +you1 +you2 +you3 +you4 +yu1 +yu2 +yu3 +yu4 +yuan1 +yuan2 +yuan3 +yuan4 +yue1 +yue4 +yun1 +yun2 +yun3 +yun4 +z +za1 +za2 +za3 +zai1 +zai3 +zai4 +zan1 +zan2 +zan3 +zan4 +zang1 +zang4 +zao1 +zao2 +zao3 +zao4 +ze2 +ze4 +zei2 +zen3 +zeng1 +zeng4 +zha1 +zha2 +zha3 +zha4 +zhai1 +zhai2 +zhai3 +zhai4 +zhan1 +zhan2 +zhan3 +zhan4 +zhang1 +zhang2 +zhang3 +zhang4 +zhao1 +zhao2 +zhao3 +zhao4 +zhe +zhe1 +zhe2 +zhe3 +zhe4 +zhen1 +zhen2 +zhen3 +zhen4 +zheng1 +zheng2 +zheng3 +zheng4 +zhi1 +zhi2 +zhi3 +zhi4 +zhong1 +zhong2 +zhong3 +zhong4 +zhou1 +zhou2 +zhou3 +zhou4 +zhu1 +zhu2 +zhu3 +zhu4 +zhua1 +zhua2 +zhua3 +zhuai1 +zhuai3 +zhuai4 +zhuan1 +zhuan2 +zhuan3 +zhuan4 +zhuang1 +zhuang4 +zhui1 +zhui4 +zhun1 +zhun2 +zhun3 +zhuo1 +zhuo2 +zi +zi1 +zi2 +zi3 +zi4 +zong1 +zong2 +zong3 +zong4 +zou1 +zou2 +zou3 +zou4 +zu1 +zu2 +zu3 +zuan1 +zuan3 +zuan4 +zui2 +zui3 +zui4 +zun1 +zuo +zuo1 +zuo2 +zuo3 +zuo4 +{ +~ +¡ +¢ +£ +¥ +§ +¨ +© +« +® +¯ +° +± +² +³ +´ +µ +· +¹ +º +» +¼ +½ +¾ +¿ +À +Á + +à +Ä +Å +Æ +Ç +È +É +Ê +Í +Î +Ñ +Ó +Ö +× +Ø +Ú +Ü +Ý +Þ +ß +à +á +â +ã +ä +å +æ +ç +è +é +ê +ë +ì +í +î +ï +ð +ñ +ò +ó +ô +õ +ö +ø +ù +ú +û +ü +ý +Ā +ā +ă +ą +ć +Č +č +Đ +đ +ē +ė +ę +ě +ĝ +ğ +ħ +ī +į +İ +ı +Ł +ł +ń +ņ +ň +ŋ +Ō +ō +ő +œ +ř +Ś +ś +Ş +ş +Š +š +Ť +ť +ũ +ū +ź +Ż +ż +Ž +ž +ơ +ư +ǎ +ǐ +ǒ +ǔ +ǚ +ș +ț +ɑ +ɔ +ɕ +ə +ɛ +ɜ +ɡ +ɣ +ɪ +ɫ +ɴ +ɹ +ɾ +ʃ +ʊ +ʌ +ʒ +ʔ +ʰ +ʷ +ʻ +ʾ +ʿ +ˈ +ː +˙ +˜ +ˢ +́ +̅ +Α +Β +Δ +Ε +Θ +Κ +Λ +Μ +Ξ +Π +Σ +Τ +Φ +Χ +Ψ +Ω +ά +έ +ή +ί +α +β +γ +δ +ε +ζ +η +θ +ι +κ +λ +μ +ν +ξ +ο +π +ρ +ς +σ +τ +υ +φ +χ +ψ +ω +ϊ +ό +ύ +ώ +ϕ +ϵ +Ё +А +Б +В +Г +Д +Е +Ж +З +И +Й +К +Л +М +Н +О +П +Р +С +Т +У +Ф +Х +Ц +Ч +Ш +Щ +Ы +Ь +Э +Ю +Я +а +б +в +г +д +е +ж +з +и +й +к +л +м +н +о +п +р +с +т +у +ф +х +ц +ч +ш +щ +ъ +ы +ь +э +ю +я +ё +і +ְ +ִ +ֵ +ֶ +ַ +ָ +ֹ +ּ +־ +ׁ +א +ב +ג +ד +ה +ו +ז +ח +ט +י +כ +ל +ם +מ +ן +נ +ס +ע +פ +ק +ר +ש +ת +أ +ب +ة +ت +ج +ح +د +ر +ز +س +ص +ط +ع +ق +ك +ل +م +ن +ه +و +ي +َ +ُ +ِ +ْ +ก +ข +ง +จ +ต +ท +น +ป +ย +ร +ว +ส +ห +อ +ฮ +ั +า +ี +ึ +โ +ใ +ไ +่ +้ +์ +ḍ +Ḥ +ḥ +ṁ +ṃ +ṅ +ṇ +Ṛ +ṛ +Ṣ +ṣ +Ṭ +ṭ +ạ +ả +Ấ +ấ +ầ +ậ +ắ +ằ +ẻ +ẽ +ế +ề +ể +ễ +ệ +ị +ọ +ỏ +ố +ồ +ộ +ớ +ờ +ở +ụ +ủ +ứ +ữ +ἀ +ἁ +Ἀ +ἐ +ἔ +ἰ +ἱ +ὀ +ὁ +ὐ +ὲ +ὸ +ᾶ +᾽ +ῆ +ῇ +ῶ +‎ +‑ +‒ +– +— +― +‖ +† +‡ +• +… +‧ +‬ +′ +″ +⁄ +⁡ +⁰ +⁴ +⁵ +⁶ +⁷ +⁸ +⁹ +₁ +₂ +₃ +€ +₱ +₹ +₽ +℃ +ℏ +ℓ +№ +ℝ +™ +⅓ +⅔ +⅛ +→ +∂ +∈ +∑ +− +∗ +√ +∞ +∫ +≈ +≠ +≡ +≤ +≥ +⋅ +⋯ +█ +♪ +⟨ +⟩ +、 +。 +《 +》 +「 +」 +【 +】 +あ +う +え +お +か +が +き +ぎ +く +ぐ +け +げ +こ +ご +さ +し +じ +す +ず +せ +ぜ +そ +ぞ +た +だ +ち +っ +つ +で +と +ど +な +に +ね +の +は +ば +ひ +ぶ +へ +べ +ま +み +む +め +も +ゃ +や +ゆ +ょ +よ +ら +り +る +れ +ろ +わ +を +ん +ァ +ア +ィ +イ +ウ +ェ +エ +オ +カ +ガ +キ +ク +ケ +ゲ +コ +ゴ +サ +ザ +シ +ジ +ス +ズ +セ +ゾ +タ +ダ +チ +ッ +ツ +テ +デ +ト +ド +ナ +ニ +ネ +ノ +バ +パ +ビ +ピ +フ +プ +ヘ +ベ +ペ +ホ +ボ +ポ +マ +ミ +ム +メ +モ +ャ +ヤ +ュ +ユ +ョ +ヨ +ラ +リ +ル +レ +ロ +ワ +ン +・ +ー +ㄋ +ㄍ +ㄎ +ㄏ +ㄓ +ㄕ +ㄚ +ㄜ +ㄟ +ㄤ +ㄥ +ㄧ +ㄱ +ㄴ +ㄷ +ㄹ +ㅁ +ㅂ +ㅅ +ㅈ +ㅍ +ㅎ +ㅏ +ㅓ +ㅗ +ㅜ +ㅡ +ㅣ +㗎 +가 +각 +간 +갈 +감 +갑 +갓 +갔 +강 +같 +개 +거 +건 +걸 +겁 +것 +겉 +게 +겠 +겨 +결 +겼 +경 +계 +고 +곤 +골 +곱 +공 +과 +관 +광 +교 +구 +국 +굴 +귀 +귄 +그 +근 +글 +금 +기 +긴 +길 +까 +깍 +깔 +깜 +깨 +께 +꼬 +꼭 +꽃 +꾸 +꿔 +끔 +끗 +끝 +끼 +나 +난 +날 +남 +납 +내 +냐 +냥 +너 +넘 +넣 +네 +녁 +년 +녕 +노 +녹 +놀 +누 +눈 +느 +는 +늘 +니 +님 +닙 +다 +닥 +단 +달 +닭 +당 +대 +더 +덕 +던 +덥 +데 +도 +독 +동 +돼 +됐 +되 +된 +될 +두 +둑 +둥 +드 +들 +등 +디 +따 +딱 +딸 +땅 +때 +떤 +떨 +떻 +또 +똑 +뚱 +뛰 +뜻 +띠 +라 +락 +란 +람 +랍 +랑 +래 +랜 +러 +런 +럼 +렇 +레 +려 +력 +렵 +렸 +로 +록 +롬 +루 +르 +른 +를 +름 +릉 +리 +릴 +림 +마 +막 +만 +많 +말 +맑 +맙 +맛 +매 +머 +먹 +멍 +메 +면 +명 +몇 +모 +목 +몸 +못 +무 +문 +물 +뭐 +뭘 +미 +민 +밌 +밑 +바 +박 +밖 +반 +받 +발 +밤 +밥 +방 +배 +백 +밸 +뱀 +버 +번 +벌 +벚 +베 +벼 +벽 +별 +병 +보 +복 +본 +볼 +봐 +봤 +부 +분 +불 +비 +빔 +빛 +빠 +빨 +뼈 +뽀 +뿅 +쁘 +사 +산 +살 +삼 +샀 +상 +새 +색 +생 +서 +선 +설 +섭 +섰 +성 +세 +셔 +션 +셨 +소 +속 +손 +송 +수 +숙 +순 +술 +숫 +숭 +숲 +쉬 +쉽 +스 +슨 +습 +슷 +시 +식 +신 +실 +싫 +심 +십 +싶 +싸 +써 +쓰 +쓴 +씌 +씨 +씩 +씬 +아 +악 +안 +않 +알 +야 +약 +얀 +양 +얘 +어 +언 +얼 +엄 +업 +없 +었 +엉 +에 +여 +역 +연 +염 +엽 +영 +옆 +예 +옛 +오 +온 +올 +옷 +옹 +와 +왔 +왜 +요 +욕 +용 +우 +운 +울 +웃 +워 +원 +월 +웠 +위 +윙 +유 +육 +윤 +으 +은 +을 +음 +응 +의 +이 +익 +인 +일 +읽 +임 +입 +있 +자 +작 +잔 +잖 +잘 +잡 +잤 +장 +재 +저 +전 +점 +정 +제 +져 +졌 +조 +족 +좀 +종 +좋 +죠 +주 +준 +줄 +중 +줘 +즈 +즐 +즘 +지 +진 +집 +짜 +짝 +쩌 +쪼 +쪽 +쫌 +쭈 +쯔 +찌 +찍 +차 +착 +찾 +책 +처 +천 +철 +체 +쳐 +쳤 +초 +촌 +추 +출 +춤 +춥 +춰 +치 +친 +칠 +침 +칩 +칼 +커 +켓 +코 +콩 +쿠 +퀴 +크 +큰 +큽 +키 +킨 +타 +태 +터 +턴 +털 +테 +토 +통 +투 +트 +특 +튼 +틀 +티 +팀 +파 +팔 +패 +페 +펜 +펭 +평 +포 +폭 +표 +품 +풍 +프 +플 +피 +필 +하 +학 +한 +할 +함 +합 +항 +해 +햇 +했 +행 +허 +험 +형 +혜 +호 +혼 +홀 +화 +회 +획 +후 +휴 +흐 +흔 +희 +히 +힘 +ﷺ +ﷻ +! +, +? +� +𠮶 diff --git a/client/lucy-f5/vocab_v1.txt b/client/lucy-f5/vocab_v1.txt new file mode 100644 index 0000000..a30a90c --- /dev/null +++ b/client/lucy-f5/vocab_v1.txt @@ -0,0 +1,2545 @@ + +! +" +# +$ +% +& +' +( +) +* ++ +, +- +. +/ +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +: +; += +> +? +@ +A +B +C +D +E +F +G +H +I +J +K +L +M +N +O +P +Q +R +S +T +U +V +W +X +Y +Z +[ +\ +] +_ +a +a1 +ai1 +ai2 +ai3 +ai4 +an1 +an3 +an4 +ang1 +ang2 +ang4 +ao1 +ao2 +ao3 +ao4 +b +ba +ba1 +ba2 +ba3 +ba4 +bai1 +bai2 +bai3 +bai4 +ban1 +ban2 +ban3 +ban4 +bang1 +bang2 +bang3 +bang4 +bao1 +bao2 +bao3 +bao4 +bei +bei1 +bei2 +bei3 +bei4 +ben1 +ben2 +ben3 +ben4 +beng +beng1 +beng2 +beng3 +beng4 +bi1 +bi2 +bi3 +bi4 +bian1 +bian2 +bian3 +bian4 +biao1 +biao2 +biao3 +bie1 +bie2 +bie3 +bie4 +bin1 +bin4 +bing1 +bing2 +bing3 +bing4 +bo +bo1 +bo2 +bo3 +bo4 +bu2 +bu3 +bu4 +c +ca1 +cai1 +cai2 +cai3 +cai4 +can1 +can2 +can3 +can4 +cang1 +cang2 +cao1 +cao2 +cao3 +ce4 +cen1 +cen2 +ceng1 +ceng2 +ceng4 +cha1 +cha2 +cha3 +cha4 +chai1 +chai2 +chan1 +chan2 +chan3 +chan4 +chang1 +chang2 +chang3 +chang4 +chao1 +chao2 +chao3 +che1 +che2 +che3 +che4 +chen1 +chen2 +chen3 +chen4 +cheng1 +cheng2 +cheng3 +cheng4 +chi1 +chi2 +chi3 +chi4 +chong1 +chong2 +chong3 +chong4 +chou1 +chou2 +chou3 +chou4 +chu1 +chu2 +chu3 +chu4 +chua1 +chuai1 +chuai2 +chuai3 +chuai4 +chuan1 +chuan2 +chuan3 +chuan4 +chuang1 +chuang2 +chuang3 +chuang4 +chui1 +chui2 +chun1 +chun2 +chun3 +chuo1 +chuo4 +ci1 +ci2 +ci3 +ci4 +cong1 +cong2 +cou4 +cu1 +cu4 +cuan1 +cuan2 +cuan4 +cui1 +cui3 +cui4 +cun1 +cun2 +cun4 +cuo1 +cuo2 +cuo4 +d +da +da1 +da2 +da3 +da4 +dai1 +dai2 +dai3 +dai4 +dan1 +dan2 +dan3 +dan4 +dang1 +dang2 +dang3 +dang4 +dao1 +dao2 +dao3 +dao4 +de +de1 +de2 +dei3 +den4 +deng1 +deng2 +deng3 +deng4 +di1 +di2 +di3 +di4 +dia3 +dian1 +dian2 +dian3 +dian4 +diao1 +diao3 +diao4 +die1 +die2 +die4 +ding1 +ding2 +ding3 +ding4 +diu1 +dong1 +dong3 +dong4 +dou1 +dou2 +dou3 +dou4 +du1 +du2 +du3 +du4 +duan1 +duan2 +duan3 +duan4 +dui1 +dui4 +dun1 +dun3 +dun4 +duo1 +duo2 +duo3 +duo4 +e +e1 +e2 +e3 +e4 +ei2 +en1 +en4 +er +er2 +er3 +er4 +f +fa1 +fa2 +fa3 +fa4 +fan1 +fan2 +fan3 +fan4 +fang1 +fang2 +fang3 +fang4 +fei1 +fei2 +fei3 +fei4 +fen1 +fen2 +fen3 +fen4 +feng1 +feng2 +feng3 +feng4 +fo2 +fou2 +fou3 +fu1 +fu2 +fu3 +fu4 +g +ga1 +ga2 +ga3 +ga4 +gai1 +gai2 +gai3 +gai4 +gan1 +gan2 +gan3 +gan4 +gang1 +gang2 +gang3 +gang4 +gao1 +gao2 +gao3 +gao4 +ge1 +ge2 +ge3 +ge4 +gei2 +gei3 +gen1 +gen2 +gen3 +gen4 +geng1 +geng3 +geng4 +gong1 +gong3 +gong4 +gou1 +gou2 +gou3 +gou4 +gu +gu1 +gu2 +gu3 +gu4 +gua1 +gua2 +gua3 +gua4 +guai1 +guai2 +guai3 +guai4 +guan1 +guan2 +guan3 +guan4 +guang1 +guang2 +guang3 +guang4 +gui1 +gui2 +gui3 +gui4 +gun3 +gun4 +guo1 +guo2 +guo3 +guo4 +h +ha1 +ha2 +ha3 +hai1 +hai2 +hai3 +hai4 +han1 +han2 +han3 +han4 +hang1 +hang2 +hang4 +hao1 +hao2 +hao3 +hao4 +he1 +he2 +he4 +hei1 +hen2 +hen3 +hen4 +heng1 +heng2 +heng4 +hong1 +hong2 +hong3 +hong4 +hou1 +hou2 +hou3 +hou4 +hu1 +hu2 +hu3 +hu4 +hua1 +hua2 +hua4 +huai2 +huai4 +huan1 +huan2 +huan3 +huan4 +huang1 +huang2 +huang3 +huang4 +hui1 +hui2 +hui3 +hui4 +hun1 +hun2 +hun4 +huo +huo1 +huo2 +huo3 +huo4 +i +j +ji1 +ji2 +ji3 +ji4 +jia +jia1 +jia2 +jia3 +jia4 +jian1 +jian2 +jian3 +jian4 +jiang1 +jiang2 +jiang3 +jiang4 +jiao1 +jiao2 +jiao3 +jiao4 +jie1 +jie2 +jie3 +jie4 +jin1 +jin2 +jin3 +jin4 +jing1 +jing2 +jing3 +jing4 +jiong3 +jiu1 +jiu2 +jiu3 +jiu4 +ju1 +ju2 +ju3 +ju4 +juan1 +juan2 +juan3 +juan4 +jue1 +jue2 +jue4 +jun1 +jun4 +k +ka1 +ka2 +ka3 +kai1 +kai2 +kai3 +kai4 +kan1 +kan2 +kan3 +kan4 +kang1 +kang2 +kang4 +kao1 +kao2 +kao3 +kao4 +ke1 +ke2 +ke3 +ke4 +ken3 +keng1 +kong1 +kong3 +kong4 +kou1 +kou2 +kou3 +kou4 +ku1 +ku2 +ku3 +ku4 +kua1 +kua3 +kua4 +kuai3 +kuai4 +kuan1 +kuan2 +kuan3 +kuang1 +kuang2 +kuang4 +kui1 +kui2 +kui3 +kui4 +kun1 +kun3 +kun4 +kuo4 +l +la +la1 +la2 +la3 +la4 +lai2 +lai4 +lan2 +lan3 +lan4 +lang1 +lang2 +lang3 +lang4 +lao1 +lao2 +lao3 +lao4 +le +le1 +le4 +lei +lei1 +lei2 +lei3 +lei4 +leng1 +leng2 +leng3 +leng4 +li +li1 +li2 +li3 +li4 +lia3 +lian2 +lian3 +lian4 +liang2 +liang3 +liang4 +liao1 +liao2 +liao3 +liao4 +lie1 +lie2 +lie3 +lie4 +lin1 +lin2 +lin3 +lin4 +ling2 +ling3 +ling4 +liu1 +liu2 +liu3 +liu4 +long1 +long2 +long3 +long4 +lou1 +lou2 +lou3 +lou4 +lu1 +lu2 +lu3 +lu4 +luan2 +luan3 +luan4 +lun1 +lun2 +lun4 +luo1 +luo2 +luo3 +luo4 +lv2 +lv3 +lv4 +lve3 +lve4 +m +ma +ma1 +ma2 +ma3 +ma4 +mai2 +mai3 +mai4 +man1 +man2 +man3 +man4 +mang2 +mang3 +mao1 +mao2 +mao3 +mao4 +me +mei2 +mei3 +mei4 +men +men1 +men2 +men4 +meng +meng1 +meng2 +meng3 +meng4 +mi1 +mi2 +mi3 +mi4 +mian2 +mian3 +mian4 +miao1 +miao2 +miao3 +miao4 +mie1 +mie4 +min2 +min3 +ming2 +ming3 +ming4 +miu4 +mo1 +mo2 +mo3 +mo4 +mou1 +mou2 +mou3 +mu2 +mu3 +mu4 +n +n2 +na1 +na2 +na3 +na4 +nai2 +nai3 +nai4 +nan1 +nan2 +nan3 +nan4 +nang1 +nang2 +nang3 +nao1 +nao2 +nao3 +nao4 +ne +ne2 +ne4 +nei3 +nei4 +nen4 +neng2 +ni1 +ni2 +ni3 +ni4 +nian1 +nian2 +nian3 +nian4 +niang2 +niang4 +niao2 +niao3 +niao4 +nie1 +nie4 +nin2 +ning2 +ning3 +ning4 +niu1 +niu2 +niu3 +niu4 +nong2 +nong4 +nou4 +nu2 +nu3 +nu4 +nuan3 +nuo2 +nuo4 +nv2 +nv3 +nve4 +o +o1 +o2 +ou1 +ou2 +ou3 +ou4 +p +pa1 +pa2 +pa4 +pai1 +pai2 +pai3 +pai4 +pan1 +pan2 +pan4 +pang1 +pang2 +pang4 +pao1 +pao2 +pao3 +pao4 +pei1 +pei2 +pei4 +pen1 +pen2 +pen4 +peng1 +peng2 +peng3 +peng4 +pi1 +pi2 +pi3 +pi4 +pian1 +pian2 +pian4 +piao1 +piao2 +piao3 +piao4 +pie1 +pie2 +pie3 +pin1 +pin2 +pin3 +pin4 +ping1 +ping2 +po1 +po2 +po3 +po4 +pou1 +pu1 +pu2 +pu3 +pu4 +q +qi1 +qi2 +qi3 +qi4 +qia1 +qia3 +qia4 +qian1 +qian2 +qian3 +qian4 +qiang1 +qiang2 +qiang3 +qiang4 +qiao1 +qiao2 +qiao3 +qiao4 +qie1 +qie2 +qie3 +qie4 +qin1 +qin2 +qin3 +qin4 +qing1 +qing2 +qing3 +qing4 +qiong1 +qiong2 +qiu1 +qiu2 +qiu3 +qu1 +qu2 +qu3 +qu4 +quan1 +quan2 +quan3 +quan4 +que1 +que2 +que4 +qun2 +r +ran2 +ran3 +rang1 +rang2 +rang3 +rang4 +rao2 +rao3 +rao4 +re2 +re3 +re4 +ren2 +ren3 +ren4 +reng1 +reng2 +ri4 +rong1 +rong2 +rong3 +rou2 +rou4 +ru2 +ru3 +ru4 +ruan2 +ruan3 +rui3 +rui4 +run4 +ruo4 +s +sa1 +sa2 +sa3 +sa4 +sai1 +sai4 +san1 +san2 +san3 +san4 +sang1 +sang3 +sang4 +sao1 +sao2 +sao3 +sao4 +se4 +sen1 +seng1 +sha1 +sha2 +sha3 +sha4 +shai1 +shai2 +shai3 +shai4 +shan1 +shan3 +shan4 +shang +shang1 +shang3 +shang4 +shao1 +shao2 +shao3 +shao4 +she1 +she2 +she3 +she4 +shei2 +shen1 +shen2 +shen3 +shen4 +sheng1 +sheng2 +sheng3 +sheng4 +shi +shi1 +shi2 +shi3 +shi4 +shou1 +shou2 +shou3 +shou4 +shu1 +shu2 +shu3 +shu4 +shua1 +shua2 +shua3 +shua4 +shuai1 +shuai3 +shuai4 +shuan1 +shuan4 +shuang1 +shuang3 +shui2 +shui3 +shui4 +shun3 +shun4 +shuo1 +shuo4 +si1 +si2 +si3 +si4 +song1 +song3 +song4 +sou1 +sou3 +sou4 +su1 +su2 +su4 +suan1 +suan4 +sui1 +sui2 +sui3 +sui4 +sun1 +sun3 +suo +suo1 +suo2 +suo3 +t +ta1 +ta2 +ta3 +ta4 +tai1 +tai2 +tai4 +tan1 +tan2 +tan3 +tan4 +tang1 +tang2 +tang3 +tang4 +tao1 +tao2 +tao3 +tao4 +te4 +teng2 +ti1 +ti2 +ti3 +ti4 +tian1 +tian2 +tian3 +tiao1 +tiao2 +tiao3 +tiao4 +tie1 +tie2 +tie3 +tie4 +ting1 +ting2 +ting3 +tong1 +tong2 +tong3 +tong4 +tou +tou1 +tou2 +tou4 +tu1 +tu2 +tu3 +tu4 +tuan1 +tuan2 +tui1 +tui2 +tui3 +tui4 +tun1 +tun2 +tun4 +tuo1 +tuo2 +tuo3 +tuo4 +u +v +w +wa +wa1 +wa2 +wa3 +wa4 +wai1 +wai3 +wai4 +wan1 +wan2 +wan3 +wan4 +wang1 +wang2 +wang3 +wang4 +wei1 +wei2 +wei3 +wei4 +wen1 +wen2 +wen3 +wen4 +weng1 +weng4 +wo1 +wo2 +wo3 +wo4 +wu1 +wu2 +wu3 +wu4 +x +xi1 +xi2 +xi3 +xi4 +xia1 +xia2 +xia4 +xian1 +xian2 +xian3 +xian4 +xiang1 +xiang2 +xiang3 +xiang4 +xiao1 +xiao2 +xiao3 +xiao4 +xie1 +xie2 +xie3 +xie4 +xin1 +xin2 +xin4 +xing1 +xing2 +xing3 +xing4 +xiong1 +xiong2 +xiu1 +xiu3 +xiu4 +xu +xu1 +xu2 +xu3 +xu4 +xuan1 +xuan2 +xuan3 +xuan4 +xue1 +xue2 +xue3 +xue4 +xun1 +xun2 +xun4 +y +ya +ya1 +ya2 +ya3 +ya4 +yan1 +yan2 +yan3 +yan4 +yang1 +yang2 +yang3 +yang4 +yao1 +yao2 +yao3 +yao4 +ye1 +ye2 +ye3 +ye4 +yi +yi1 +yi2 +yi3 +yi4 +yin1 +yin2 +yin3 +yin4 +ying1 +ying2 +ying3 +ying4 +yo1 +yong1 +yong2 +yong3 +yong4 +you1 +you2 +you3 +you4 +yu1 +yu2 +yu3 +yu4 +yuan1 +yuan2 +yuan3 +yuan4 +yue1 +yue4 +yun1 +yun2 +yun3 +yun4 +z +za1 +za2 +za3 +zai1 +zai3 +zai4 +zan1 +zan2 +zan3 +zan4 +zang1 +zang4 +zao1 +zao2 +zao3 +zao4 +ze2 +ze4 +zei2 +zen3 +zeng1 +zeng4 +zha1 +zha2 +zha3 +zha4 +zhai1 +zhai2 +zhai3 +zhai4 +zhan1 +zhan2 +zhan3 +zhan4 +zhang1 +zhang2 +zhang3 +zhang4 +zhao1 +zhao2 +zhao3 +zhao4 +zhe +zhe1 +zhe2 +zhe3 +zhe4 +zhen1 +zhen2 +zhen3 +zhen4 +zheng1 +zheng2 +zheng3 +zheng4 +zhi1 +zhi2 +zhi3 +zhi4 +zhong1 +zhong2 +zhong3 +zhong4 +zhou1 +zhou2 +zhou3 +zhou4 +zhu1 +zhu2 +zhu3 +zhu4 +zhua1 +zhua2 +zhua3 +zhuai1 +zhuai3 +zhuai4 +zhuan1 +zhuan2 +zhuan3 +zhuan4 +zhuang1 +zhuang4 +zhui1 +zhui4 +zhun1 +zhun2 +zhun3 +zhuo1 +zhuo2 +zi +zi1 +zi2 +zi3 +zi4 +zong1 +zong2 +zong3 +zong4 +zou1 +zou2 +zou3 +zou4 +zu1 +zu2 +zu3 +zuan1 +zuan3 +zuan4 +zui2 +zui3 +zui4 +zun1 +zuo +zuo1 +zuo2 +zuo3 +zuo4 +{ +~ +¡ +¢ +£ +¥ +§ +¨ +© +« +® +¯ +° +± +² +³ +´ +µ +· +¹ +º +» +¼ +½ +¾ +¿ +À +Á + +à +Ä +Å +Æ +Ç +È +É +Ê +Í +Î +Ñ +Ó +Ö +× +Ø +Ú +Ü +Ý +Þ +ß +à +á +â +ã +ä +å +æ +ç +è +é +ê +ë +ì +í +î +ï +ð +ñ +ò +ó +ô +õ +ö +ø +ù +ú +û +ü +ý +Ā +ā +ă +ą +ć +Č +č +Đ +đ +ē +ė +ę +ě +ĝ +ğ +ħ +ī +į +İ +ı +Ł +ł +ń +ņ +ň +ŋ +Ō +ō +ő +œ +ř +Ś +ś +Ş +ş +Š +š +Ť +ť +ũ +ū +ź +Ż +ż +Ž +ž +ơ +ư +ǎ +ǐ +ǒ +ǔ +ǚ +ș +ț +ɑ +ɔ +ɕ +ə +ɛ +ɜ +ɡ +ɣ +ɪ +ɫ +ɴ +ɹ +ɾ +ʃ +ʊ +ʌ +ʒ +ʔ +ʰ +ʷ +ʻ +ʾ +ʿ +ˈ +ː +˙ +˜ +ˢ +́ +̅ +Α +Β +Δ +Ε +Θ +Κ +Λ +Μ +Ξ +Π +Σ +Τ +Φ +Χ +Ψ +Ω +ά +έ +ή +ί +α +β +γ +δ +ε +ζ +η +θ +ι +κ +λ +μ +ν +ξ +ο +π +ρ +ς +σ +τ +υ +φ +χ +ψ +ω +ϊ +ό +ύ +ώ +ϕ +ϵ +Ё +А +Б +В +Г +Д +Е +Ж +З +И +Й +К +Л +М +Н +О +П +Р +С +Т +У +Ф +Х +Ц +Ч +Ш +Щ +Ы +Ь +Э +Ю +Я +а +б +в +г +д +е +ж +з +и +й +к +л +м +н +о +п +р +с +т +у +ф +х +ц +ч +ш +щ +ъ +ы +ь +э +ю +я +ё +і +ְ +ִ +ֵ +ֶ +ַ +ָ +ֹ +ּ +־ +ׁ +א +ב +ג +ד +ה +ו +ז +ח +ט +י +כ +ל +ם +מ +ן +נ +ס +ע +פ +ק +ר +ש +ת +أ +ب +ة +ت +ج +ح +د +ر +ز +س +ص +ط +ع +ق +ك +ل +م +ن +ه +و +ي +َ +ُ +ِ +ْ +ก +ข +ง +จ +ต +ท +น +ป +ย +ร +ว +ส +ห +อ +ฮ +ั +า +ี +ึ +โ +ใ +ไ +่ +้ +์ +ḍ +Ḥ +ḥ +ṁ +ṃ +ṅ +ṇ +Ṛ +ṛ +Ṣ +ṣ +Ṭ +ṭ +ạ +ả +Ấ +ấ +ầ +ậ +ắ +ằ +ẻ +ẽ +ế +ề +ể +ễ +ệ +ị +ọ +ỏ +ố +ồ +ộ +ớ +ờ +ở +ụ +ủ +ứ +ữ +ἀ +ἁ +Ἀ +ἐ +ἔ +ἰ +ἱ +ὀ +ὁ +ὐ +ὲ +ὸ +ᾶ +᾽ +ῆ +ῇ +ῶ +‎ +‑ +‒ +– +— +― +‖ +† +‡ +• +… +‧ +‬ +′ +″ +⁄ +⁡ +⁰ +⁴ +⁵ +⁶ +⁷ +⁸ +⁹ +₁ +₂ +₃ +€ +₱ +₹ +₽ +℃ +ℏ +ℓ +№ +ℝ +™ +⅓ +⅔ +⅛ +→ +∂ +∈ +∑ +− +∗ +√ +∞ +∫ +≈ +≠ +≡ +≤ +≥ +⋅ +⋯ +█ +♪ +⟨ +⟩ +、 +。 +《 +》 +「 +」 +【 +】 +あ +う +え +お +か +が +き +ぎ +く +ぐ +け +げ +こ +ご +さ +し +じ +す +ず +せ +ぜ +そ +ぞ +た +だ +ち +っ +つ +で +と +ど +な +に +ね +の +は +ば +ひ +ぶ +へ +べ +ま +み +む +め +も +ゃ +や +ゆ +ょ +よ +ら +り +る +れ +ろ +わ +を +ん +ァ +ア +ィ +イ +ウ +ェ +エ +オ +カ +ガ +キ +ク +ケ +ゲ +コ +ゴ +サ +ザ +シ +ジ +ス +ズ +セ +ゾ +タ +ダ +チ +ッ +ツ +テ +デ +ト +ド +ナ +ニ +ネ +ノ +バ +パ +ビ +ピ +フ +プ +ヘ +ベ +ペ +ホ +ボ +ポ +マ +ミ +ム +メ +モ +ャ +ヤ +ュ +ユ +ョ +ヨ +ラ +リ +ル +レ +ロ +ワ +ン +・ +ー +ㄋ +ㄍ +ㄎ +ㄏ +ㄓ +ㄕ +ㄚ +ㄜ +ㄟ +ㄤ +ㄥ +ㄧ +ㄱ +ㄴ +ㄷ +ㄹ +ㅁ +ㅂ +ㅅ +ㅈ +ㅍ +ㅎ +ㅏ +ㅓ +ㅗ +ㅜ +ㅡ +ㅣ +㗎 +가 +각 +간 +갈 +감 +갑 +갓 +갔 +강 +같 +개 +거 +건 +걸 +겁 +것 +겉 +게 +겠 +겨 +결 +겼 +경 +계 +고 +곤 +골 +곱 +공 +과 +관 +광 +교 +구 +국 +굴 +귀 +귄 +그 +근 +글 +금 +기 +긴 +길 +까 +깍 +깔 +깜 +깨 +께 +꼬 +꼭 +꽃 +꾸 +꿔 +끔 +끗 +끝 +끼 +나 +난 +날 +남 +납 +내 +냐 +냥 +너 +넘 +넣 +네 +녁 +년 +녕 +노 +녹 +놀 +누 +눈 +느 +는 +늘 +니 +님 +닙 +다 +닥 +단 +달 +닭 +당 +대 +더 +덕 +던 +덥 +데 +도 +독 +동 +돼 +됐 +되 +된 +될 +두 +둑 +둥 +드 +들 +등 +디 +따 +딱 +딸 +땅 +때 +떤 +떨 +떻 +또 +똑 +뚱 +뛰 +뜻 +띠 +라 +락 +란 +람 +랍 +랑 +래 +랜 +러 +런 +럼 +렇 +레 +려 +력 +렵 +렸 +로 +록 +롬 +루 +르 +른 +를 +름 +릉 +리 +릴 +림 +마 +막 +만 +많 +말 +맑 +맙 +맛 +매 +머 +먹 +멍 +메 +면 +명 +몇 +모 +목 +몸 +못 +무 +문 +물 +뭐 +뭘 +미 +민 +밌 +밑 +바 +박 +밖 +반 +받 +발 +밤 +밥 +방 +배 +백 +밸 +뱀 +버 +번 +벌 +벚 +베 +벼 +벽 +별 +병 +보 +복 +본 +볼 +봐 +봤 +부 +분 +불 +비 +빔 +빛 +빠 +빨 +뼈 +뽀 +뿅 +쁘 +사 +산 +살 +삼 +샀 +상 +새 +색 +생 +서 +선 +설 +섭 +섰 +성 +세 +셔 +션 +셨 +소 +속 +손 +송 +수 +숙 +순 +술 +숫 +숭 +숲 +쉬 +쉽 +스 +슨 +습 +슷 +시 +식 +신 +실 +싫 +심 +십 +싶 +싸 +써 +쓰 +쓴 +씌 +씨 +씩 +씬 +아 +악 +안 +않 +알 +야 +약 +얀 +양 +얘 +어 +언 +얼 +엄 +업 +없 +었 +엉 +에 +여 +역 +연 +염 +엽 +영 +옆 +예 +옛 +오 +온 +올 +옷 +옹 +와 +왔 +왜 +요 +욕 +용 +우 +운 +울 +웃 +워 +원 +월 +웠 +위 +윙 +유 +육 +윤 +으 +은 +을 +음 +응 +의 +이 +익 +인 +일 +읽 +임 +입 +있 +자 +작 +잔 +잖 +잘 +잡 +잤 +장 +재 +저 +전 +점 +정 +제 +져 +졌 +조 +족 +좀 +종 +좋 +죠 +주 +준 +줄 +중 +줘 +즈 +즐 +즘 +지 +진 +집 +짜 +짝 +쩌 +쪼 +쪽 +쫌 +쭈 +쯔 +찌 +찍 +차 +착 +찾 +책 +처 +천 +철 +체 +쳐 +쳤 +초 +촌 +추 +출 +춤 +춥 +춰 +치 +친 +칠 +침 +칩 +칼 +커 +켓 +코 +콩 +쿠 +퀴 +크 +큰 +큽 +키 +킨 +타 +태 +터 +턴 +털 +테 +토 +통 +투 +트 +특 +튼 +틀 +티 +팀 +파 +팔 +패 +페 +펜 +펭 +평 +포 +폭 +표 +품 +풍 +프 +플 +피 +필 +하 +학 +한 +할 +함 +합 +항 +해 +햇 +했 +행 +허 +험 +형 +혜 +호 +혼 +홀 +화 +회 +획 +후 +휴 +흐 +흔 +희 +히 +힘 +ﷺ +ﷻ +! +, +? +� +𠮶 diff --git a/client/lucy-tts/B2-Test.bat b/client/lucy-tts/B2-Test.bat new file mode 100644 index 0000000..41b3855 --- /dev/null +++ b/client/lucy-tts/B2-Test.bat @@ -0,0 +1,12 @@ +@echo off +chcp 65001 >nul +cd /d "F:\Coding Stuff\mission-control-2\client\lucy-tts" +echo B2-Test: seriell vs. 3 Worker (laedt mehrere Modelle - kann ein paar Minuten dauern)... +echo. +"ptts-venv\Scripts\python.exe" bench_b2.py > bench_b2.log 2>&1 +type bench_b2.log +echo. +echo ============================================================ +echo Fertig. WAVs in: %USERPROFILE%\Desktop\lucy_samples (b2_serial / b2_parallel_3w) +echo ============================================================ +pause diff --git a/client/lucy-tts/Lucy-Samples-erzeugen.bat b/client/lucy-tts/Lucy-Samples-erzeugen.bat new file mode 100644 index 0000000..223a4f4 --- /dev/null +++ b/client/lucy-tts/Lucy-Samples-erzeugen.bat @@ -0,0 +1,13 @@ +@echo off +chcp 65001 >nul +cd /d "F:\Coding Stuff\mission-control-2\client\lucy-tts" +echo Erzeuge Lucy-Hoerproben (A1 safetensors-Cache + A2 Referenz-Cleaning)... +echo Modell laedt offline aus dem lokalen Cache - das kann ein paar Minuten dauern. +echo. +"ptts-venv\Scripts\python.exe" make_samples.py > make_samples.log 2>&1 +type make_samples.log +echo. +echo ============================================================ +echo Fertig. Samples liegen in: %USERPROFILE%\Desktop\lucy_samples +echo ============================================================ +pause diff --git a/client/lucy-tts/Lucy-Startklar.bat b/client/lucy-tts/Lucy-Startklar.bat new file mode 100644 index 0000000..ad182f0 --- /dev/null +++ b/client/lucy-tts/Lucy-Startklar.bat @@ -0,0 +1,13 @@ +@echo off +chcp 65001 >nul +cd /d "F:\Coding Stuff\mission-control-2\client\lucy-tts" +echo Lucy-Startklar-Check: bootet die Stimme + rendert finale Samples auf den Desktop... +echo (Modell laedt offline aus dem Cache - ein paar Sekunden) +echo. +"ptts-venv\Scripts\python.exe" lucy_ready.py > lucy_ready.log 2>&1 +type lucy_ready.log +echo. +echo ============================================================ +echo Samples: %USERPROFILE%\Desktop\lucy_samples (lucy_final_*) +echo ============================================================ +pause diff --git a/client/lucy-tts/Sweep-B2.bat b/client/lucy-tts/Sweep-B2.bat new file mode 100644 index 0000000..be757f6 --- /dev/null +++ b/client/lucy-tts/Sweep-B2.bat @@ -0,0 +1,12 @@ +@echo off +chcp 65001 >nul +cd /d "F:\Coding Stuff\mission-control-2\client\lucy-tts" +echo B2-Sweep: WORKERS x THREADS finden (laedt viele Modelle - dauert ein paar Minuten)... +echo. +"ptts-venv\Scripts\python.exe" sweep_b2.py > sweep_b2.log 2>&1 +echo ============================================================ +type sweep_b2_result.json 2>nul +echo. +echo (Volllog: sweep_b2.log) +echo ============================================================ +pause diff --git a/client/lucy-tts/TTFB-Test.bat b/client/lucy-tts/TTFB-Test.bat new file mode 100644 index 0000000..9207079 --- /dev/null +++ b/client/lucy-tts/TTFB-Test.bat @@ -0,0 +1,9 @@ +@echo off +chcp 65001 >nul +cd /d "F:\Coding Stuff\mission-control-2\client\lucy-tts" +echo TTFB-Test (seriell): kurzer-erster-Chunk an/aus... +echo. +"ptts-venv\Scripts\python.exe" ttfb_test.py > ttfb_test.log 2>&1 +type ttfb_test.log +echo. +pause diff --git a/client/lucy-tts/Umlaut-Test.bat b/client/lucy-tts/Umlaut-Test.bat new file mode 100644 index 0000000..183076f --- /dev/null +++ b/client/lucy-tts/Umlaut-Test.bat @@ -0,0 +1,9 @@ +@echo off +chcp 65001 >nul +cd /d "F:\Coding Stuff\mission-control-2\client\lucy-tts" +echo Umlaut-Test: Logik-Check + Vorher/Nachher-Audio... +echo. +"ptts-venv\Scripts\python.exe" umlaut_test.py > umlaut_test.log 2>&1 +type umlaut_test.log +echo. +pause diff --git a/client/lucy-tts/analyze.py b/client/lucy-tts/analyze.py new file mode 100644 index 0000000..5f3ed0a --- /dev/null +++ b/client/lucy-tts/analyze.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +"""Stimm-RÖNTGEN: liest Wörter + Wort-genaue Zeiten + PAUSEN + Prosodie (F0/Tempo) aus einer WAV. +So sieht man beim Tunen objektiv, wo Pocket zu lange Pausen macht (Komma!), nuschelt, oder monoton wird. + +Nutzung: python analyze.py +""" +import sys, numpy as np, soundfile as sf, librosa +from faster_whisper import WhisperModel + +p = sys.argv[1] +a, sr = sf.read(p) +a = np.asarray(a, dtype=np.float32).reshape(-1) +dur = len(a) / sr + +w = WhisperModel("small", device="cpu", compute_type="int8") +segs, _ = w.transcribe(p, language="de", beam_size=5, word_timestamps=True) +words = [x for s in segs for x in (s.words or [])] +txt = " ".join(x.word.strip() for x in words) + +print(f"=== {p.split(chr(92))[-1]} ===") +print(f"Dauer {dur:.2f}s | {len(words)} Wörter | Tempo {len(words)/max(dur,0.01):.1f} Wörter/s") +print(f"TEXT: {txt}\n") + +print("WORT-TIMING & PAUSE danach:") +pauses = [] +for i, x in enumerate(words): + gap = (words[i + 1].start - x.end) if i + 1 < len(words) else 0.0 + flag = " <=== LANG" if gap >= 0.30 else (" <- Pause" if gap >= 0.15 else "") + if gap >= 0.15: + pauses.append((x.word.strip(), gap)) + print(f" {x.start:5.2f}-{x.end:5.2f} {x.word.strip():16} Pause: {gap*1000:4.0f}ms{flag}") + +# Rand-Stille +env = np.abs(a) > 0.015 +lead = (np.argmax(env) / sr * 1000) if env.any() else 0 +tail = ((len(a) - 1 - np.argmax(env[::-1])) if env.any() else len(a)) +tail_ms = (len(a) - tail) / sr * 1000 + +# Prosodie: F0 (Tonhöhe) über stimmhafte Frames +f0 = librosa.yin(a, fmin=80, fmax=400, sr=sr, frame_length=1024) +f0v = f0[(f0 > 90) & (f0 < 380)] +if f0v.size: + med = float(np.median(f0v)); rng = float(np.percentile(f0v, 90) - np.percentile(f0v, 10)) +else: + med = rng = 0.0 + +print(f"\nPAUSEN gesamt: {len(pauses)} (>=150ms) | längste: " + + (", ".join(f'nach „{w_}\": {g*1000:.0f}ms' for w_, g in sorted(pauses, key=lambda t: -t[1])[:4]) or "keine")) +print(f"RAND-STILLE: vorne {lead:.0f}ms, hinten {tail_ms:.0f}ms") +print(f"TONHÖHE: median {med:.0f}Hz, Spanne {rng:.0f}Hz ({'monoton' if rng < 40 else 'lebendig' if rng > 90 else 'ok'})") diff --git a/client/lucy-tts/bench_b2.py b/client/lucy-tts/bench_b2.py new file mode 100644 index 0000000..94f541c --- /dev/null +++ b/client/lucy-tts/bench_b2.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +"""bench_b2.py — verifiziert B2 (Worker-Pool) end-to-end mit den ECHTEN pocket_server-Funktionen. +Misst die Wall-Clock einer langen, mehrsätzigen Antwort SERIELL (1 Modell) vs. 3 WORKER parallel, +prüft die Reihenfolge (geordnete Ausgabe) und legt beide Ergebnis-WAVs auf den Desktop. +""" +import os, time +import numpy as np, soundfile as sf, librosa +from concurrent.futures import ProcessPoolExecutor +from pocket_tts import TTSModel +import pocket_server as ps + +DESK = os.path.join(os.path.expanduser("~"), "Desktop", "lucy_samples") +os.makedirs(DESK, exist_ok=True) + +LONG = ("Guten Morgen, Commander. Das nächtliche Backup ist sauber durchgelaufen. " + "Es gab keine Fehler in den Protokollen. Der Dienst läuft stabil weiter. " + "Ich habe die Modelle vorgewärmt und die Engine antwortet zügig. " + "Wenn du möchtest, starte ich jetzt den Tagesbericht und fasse die offenen Punkte zusammen.") + + +def _serial(): + m = TTSModel.load_model(language=ps.LANG, lsd_decode_steps=ps.LSD, temp=ps.TEMP, + noise_clamp=ps.NOISE_CLAMP, quantize=ps.QUANTIZE) + ref = ps._prep_ref() + try: + vs = m.get_state_for_audio_prompt(ps.VOICE_ST) + except Exception: + vs = m.get_state_for_audio_prompt(ref) + ref_audio, _ = librosa.load(ref, sr=m.sample_rate, mono=True) + ps.STATE.clear() + ps.STATE.update(m=m, vs=vs, sr=m.sample_rate, ref_fp=ps._fingerprint(ref_audio, m.sample_rate)) + sents = ps._split_sentences(LONG) + t0 = time.time() + parts = list(ps._gen_sentences_ordered(sents)) # pool=None -> serieller Zweig (LOCK) + dt = time.time() - t0 + a = np.concatenate(parts) + sf.write(os.path.join(DESK, "b2_serial.wav"), a, m.sample_rate) + ps.STATE.clear(); del m + return dt, a.size / 24000, len(sents) + + +def _parallel(nworkers): + ps.STATE.clear() + pool = ProcessPoolExecutor(max_workers=nworkers, initializer=ps._worker_init) + list(pool.map(ps._warmup, range(nworkers))) # alle Worker vorab hochfahren + ref = ps._prep_ref() + ref_audio, _ = librosa.load(ref, sr=24000, mono=True) + ps.STATE.update(sr=24000, ref_fp=ps._fingerprint(ref_audio, 24000), pool=pool) + sents = ps._split_sentences(LONG) + t0 = time.time() + parts = list(ps._gen_sentences_ordered(sents)) # pool -> parallel, geordnet + dt = time.time() - t0 + a = np.concatenate(parts) + sf.write(os.path.join(DESK, f"b2_parallel_{nworkers}w.wav"), a, 24000) + pool.shutdown(wait=True); ps.STATE.clear() + return dt, a.size / 24000, len(sents) + + +if __name__ == "__main__": + print(f"Text: {len(LONG)} Zeichen") + ds, audio_s, n = _serial() + print(f"SERIELL : {ds:5.2f}s wall ({n} Saetze, {audio_s:4.1f}s Audio) -> b2_serial.wav") + dp, _, _ = _parallel(3) + print(f"3 WORKER: {dp:5.2f}s wall -> b2_parallel_3w.wav") + if dp > 0: + print(f"Speedup : {ds/dp:.2f}x (Audio gleich lang -> nur Generierzeit zaehlt)") + print("B2_DONE") diff --git a/client/lucy-tts/bench_lucy.py b/client/lucy-tts/bench_lucy.py new file mode 100644 index 0000000..23973fb --- /dev/null +++ b/client/lucy-tts/bench_lucy.py @@ -0,0 +1,109 @@ +# -*- coding: utf-8 -*- +"""bench_lucy.py — A3/B1: misst Lucys Stimme (pocket-tts) über temp/lsd. + +Metriken je Konfig: RTF, gen-Zeit und ROHE Kollaps-Rate (EINE Generierung, OHNE best-of-N-Gate) +— also genau das, was der Stimm-Wächter aktuell wegbügeln muss (= Latenz-Treiber). Niedrigere +temp sollte die rohe Kollaps-Rate senken -> weniger Regenerationen -> niedrigere effektive Latenz. + +Nutzung (im ptts-venv der lucy-tts-Maschine): + python bench_lucy.py # Default-Sweep + python bench_lucy.py --reps 5 + python bench_lucy.py --temps 0.7,0.8,0.9 --lsds 8,10,12 + python bench_lucy.py --whisper # + Verständlichkeits-Check (faster-whisper) + +Reuse: Kollaps-Logik (F0 + MFCC-Fingerabdruck) und cleanup() kommen 1:1 aus pocket_server.py, +damit der Benchmark exakt die Produktions-Kriterien misst. +""" +import os, time, argparse, statistics as st +import numpy as np, soundfile as sf, librosa +from pocket_tts import TTSModel +import pocket_server as ps + +SENT = { + "kurz": "Hallo Commander, ich höre dich.", + "mittel": "Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", + "lang": "Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die " + "Protokolle und melde mich, sobald alles wieder läuft.", +} + + +def _voice_state(m): + """Voice-State laden: bevorzugt das gecachte safetensors (A1), sonst aus der Referenz klonen.""" + if os.path.exists(ps.VOICE_ST): + try: + return m.get_state_for_audio_prompt(ps.VOICE_ST) + except Exception as e: + print(f" (safetensors-Load fehlgeschlagen, klone aus Referenz: {e})") + return m.get_state_for_audio_prompt(ps._prep_ref()) + + +def _raw_gen(m, vs, ref_fp, text, sr): + """EINE rohe Generierung (kein Gate). -> (gen_s, audio_s, male, sim, audio).""" + t0 = time.time() + audio = m.generate_audio(vs, ps.LEAD + text, frames_after_eos=ps.FEOS) + gen = time.time() - t0 + a = audio.numpy() if hasattr(audio, "numpy") else np.asarray(audio) + a = np.asarray(a, dtype=np.float32).reshape(-1) + f0 = ps._voiced_f0(a, sr) + male = (f0 == f0) and f0 < ps.F0_FLOOR # NaN-sicher + fp = ps._fingerprint(ps._crop_lead(a, sr), sr) + sim = float(np.dot(ref_fp, fp)) if (ref_fp is not None and fp is not None) else 1.0 + return gen, a.size / sr, bool(male), sim, a + + +def main(): + ap = argparse.ArgumentParser() + ap.add_argument("--temps", default="0.7,0.8,0.9") + ap.add_argument("--lsds", default="8,10") + ap.add_argument("--reps", type=int, default=4) + ap.add_argument("--whisper", action="store_true") + args = ap.parse_args() + temps = [float(x) for x in args.temps.split(",")] + lsds = [int(x) for x in args.lsds.split(",")] + + OUT = os.path.join(ps.BASE, "out_bench"); os.makedirs(OUT, exist_ok=True) + ref = ps._prep_ref() + print(f"LANG={ps.LANG} quantize={ps.QUANTIZE} noise_clamp={ps.NOISE_CLAMP} " + f"F0_FLOOR={ps.F0_FLOOR} FP_FLOOR={ps.FP_FLOOR} reps={args.reps}") + print(f"{'temp':>5} {'lsd':>4} | {'RTF':>5} {'gen/s':>6} | " + f"{'collapse%':>9} {'sim_min':>7} {'sim_avg':>7}") + rows = [] + for lsd in lsds: + for temp in temps: + m = TTSModel.load_model(language=ps.LANG, lsd_decode_steps=lsd, temp=temp, + noise_clamp=ps.NOISE_CLAMP, quantize=ps.QUANTIZE) + sr = m.sample_rate + ref_audio, _ = librosa.load(ref, sr=sr, mono=True) + ref_fp = ps._fingerprint(ref_audio, sr) + vs = _voice_state(m) + rtfs, gens, sims, collapses, n = [], [], [], 0, 0 + for name, text in SENT.items(): + for r in range(args.reps): + gen, asec, male, sim, a = _raw_gen(m, vs, ref_fp, text, sr) + rtfs.append(gen / max(asec, 0.01)); gens.append(gen); sims.append(sim) + collapses += int(male or sim < ps.FP_FLOOR); n += 1 + if r == 0: # ein Sample je Satz zum Reinhören + sf.write(os.path.join(OUT, f"t{temp}_l{lsd}_{name}.wav"), ps.cleanup(a, sr), sr) + cr = 100.0 * collapses / max(n, 1) + print(f"{temp:>5} {lsd:>4} | {st.mean(rtfs):>5.2f} {st.mean(gens):>6.2f} | " + f"{cr:>8.1f}% {min(sims):>7.3f} {st.mean(sims):>7.3f}") + rows.append((temp, lsd, st.mean(rtfs), cr, min(sims))) + del m + + best = sorted(rows, key=lambda x: (x[3], x[2]))[0] # min Kollaps, dann beste RTF + print(f"\n>> Vorschlag: temp={best[0]} lsd={best[1]} " + f"(collapse={best[3]:.1f}%, RTF={best[2]:.2f}) -> in pocket_server via " + f"LUCY_TEMP / LUCY_LSD setzen.") + + if args.whisper: + print("\n=== Whisper-Verständlichkeit (faster-whisper small/int8) ===") + from faster_whisper import WhisperModel + import glob + wm = WhisperModel("small", device="cpu", compute_type="int8") + for p in sorted(glob.glob(os.path.join(OUT, "*.wav"))): + segs, _ = wm.transcribe(p, language="de", beam_size=5) + print(os.path.basename(p), "::", " ".join(s.text.strip() for s in segs)) + + +if __name__ == "__main__": + main() diff --git a/client/lucy-tts/debug_stream.py b/client/lucy-tts/debug_stream.py new file mode 100644 index 0000000..e70f934 --- /dev/null +++ b/client/lucy-tts/debug_stream.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +"""Debug: warum greift der Onset-Crop auf dem 1s-Kopf des Streams nicht? + Roh-RMS für Gain-Kalibrierung.""" +import os, numpy as np, librosa, soundfile as sf +from pocket_tts import TTSModel + +BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" +src,_ = librosa.load(os.path.join(BASE,"ref.mp3"), sr=24000, mono=True) +srt,_ = librosa.effects.trim(src, top_db=30); ref=os.path.join(BASE,"ref.wav") +sf.write(ref, srt[:int(18*24000)], 24000) + +m = TTSModel.load_model(language="german_24l", lsd_decode_steps=6, temp=0.9) +vs = m.get_state_for_audio_prompt(ref); sr = m.sample_rate +LEAD = "Tja. " +text = LEAD + "Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu." + +chunks = [] +for c in m.generate_audio_stream(vs, text, frames_after_eos=4): + c = c.numpy() if hasattr(c,"numpy") else np.asarray(c) + chunks.append(np.asarray(c,dtype=np.float32).reshape(-1)) +print(f"#chunks={len(chunks)} chunk_sizes_ms={[round(x.size/sr*1000) for x in chunks[:8]]}") +full = np.concatenate(chunks) +print(f"full dur={full.size/sr:.2f}s peak={np.abs(full).max():.3f} rms={np.sqrt(np.mean(full**2)):.3f}") + +head = full[:int(1.0*sr)] +for td in (45, 35, 25, 20): + iv = librosa.effects.split(head, top_db=td) + segs = [(round(s/sr,2), round(e/sr,2)) for s,e in iv] + print(f"HEAD top_db={td}: {len(iv)} segs {segs}") +# voller Onset-Crop (wie nicht-stream) zum Vergleich +ivf = librosa.effects.split(full, top_db=35) +print(f"FULL top_db=35: {len(ivf)} segs erste3={[(round(s/sr,2),round(e/sr,2)) for s,e in ivf[:3]]}") +print("DBG_DONE") diff --git a/client/lucy-tts/diag_clip.py b/client/lucy-tts/diag_clip.py new file mode 100644 index 0000000..43c7bfd --- /dev/null +++ b/client/lucy-tts/diag_clip.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +"""Diagnose: schneidet das Modell selbst vorne/hinten ab, oder mein Trim? +Misst Stille-Anteil am Anfang/Ende des ROHEN Outputs (vor jedem Trim).""" +import os, time, numpy as np, soundfile as sf, librosa +from pocket_tts import TTSModel + +BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" +OUT = os.path.join(BASE, "out_diag"); os.makedirs(OUT, exist_ok=True) +y, _ = librosa.load(os.path.join(BASE, "ref.mp3"), sr=24000, mono=True) +yt, _ = librosa.effects.trim(y, top_db=30); ref = os.path.join(BASE, "ref.wav") +sf.write(ref, yt[:int(18*24000)], 24000) + +SENT = { + "kurz": "Hallo Commander, ich höre dich.", + "lang": "Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft.", +} + +def lead_tail_silence(a, sr): + """Wie viel ms am Anfang/Ende liegen unter -40dB vom Peak (= 'Stille')?""" + a = np.abs(np.asarray(a, dtype=np.float32).reshape(-1)) + if a.size == 0: return 0.0, 0.0, 0.0 + peak = a.max() + 1e-9 + thr = peak * (10 ** (-40/20)) # -40 dB + above = np.where(a > thr)[0] + if above.size == 0: return a.size/sr*1000, a.size/sr*1000, 0.0 + lead = above[0] / sr * 1000 + tail = (a.size - 1 - above[-1]) / sr * 1000 + return lead, tail, a.size/sr*1000 + +m = TTSModel.load_model(language="german_24l", lsd_decode_steps=4) +vs = m.get_state_for_audio_prompt(ref) +sr = m.sample_rate +for name, text in SENT.items(): + for feos in [None, 4, 8]: + a = m.generate_audio(vs, text, frames_after_eos=feos) + a = a.numpy() if hasattr(a, "numpy") else np.asarray(a) + a = a.reshape(-1) + lead, tail, total = lead_tail_silence(a, sr) + sf.write(os.path.join(OUT, f"raw_{name}_feos{feos}.wav"), a, sr) + print(f"[{name:5} feos={str(feos):4}] total={total:7.1f}ms lead_sil={lead:6.1f}ms tail_sil={tail:6.1f}ms peak={np.abs(a).max():.3f}", flush=True) +print("DIAG_DONE", flush=True) diff --git a/client/lucy-tts/diag_noiseclamp.py b/client/lucy-tts/diag_noiseclamp.py new file mode 100644 index 0000000..7216b06 --- /dev/null +++ b/client/lucy-tts/diag_noiseclamp.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +"""Stabilität gegen Stimm-Kollaps: temp 0.9 mit/ohne noise_clamp. F0-Verteilung + Whisper + RTF. +Mehr Samples, um einen Kollaps (tiefe F0) zu provozieren und zu sehen, ob noise_clamp ihn dämpft.""" +import os, time, numpy as np, librosa, soundfile as sf +from pocket_tts import TTSModel +from faster_whisper import WhisperModel + +BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" +src,_ = librosa.load(os.path.join(BASE,"ref.mp3"), sr=24000, mono=True) +srt,_ = librosa.effects.trim(src, top_db=30); ref=os.path.join(BASE,"ref.wav") +sf.write(ref, srt[:int(18*24000)], 24000) +LEAD="Tja. " +TEXTS = ["Hallo Commander, ich höre dich.","Natürlich, das mache ich sofort für dich.", + "Die Hitze ist heute wirklich heftig.","Klar, ich kümmere mich gleich darum.", + "Guten Morgen, Commander, alles sauber.","Kein Problem, ich erledige das jetzt.", + "Das Backup lief ohne Fehler durch.","Verstanden, Commander, ich bleibe dran."] +w = WhisperModel("small", device="cpu", compute_type="int8") + +def f0_of(a, sr): + f0,_,_ = librosa.pyin(a, fmin=80, fmax=400, sr=sr, frame_length=1024) + v=f0[~np.isnan(f0)]; return float(np.median(v)) if v.size else float("nan") + +def run(temp, nc): + m = TTSModel.load_model(language="german_24l", lsd_decode_steps=6, temp=temp, noise_clamp=nc) + vs = m.get_state_for_audio_prompt(ref); sr=m.sample_rate + print(f"=== temp={temp} noise_clamp={nc} ===", flush=True) + f0s=[]; rtfs=[] + for i in range(12): + t=TEXTS[i%len(TEXTS)] + t0=time.time(); a=m.generate_audio(vs, LEAD+t, frames_after_eos=4); dt=time.time()-t0 + a=a.numpy() if hasattr(a,"numpy") else np.asarray(a); a=np.asarray(a,dtype=np.float32).reshape(-1) + f0=f0_of(a,sr); f0s.append(f0); rtfs.append(dt/max(a.size/sr,0.01)) + flag=" <<< MÄNNLICH/Kollaps?" if (f0==f0 and f0<150) else "" + print(f" [{i:2}] F0={f0:6.1f}Hz{flag}", flush=True) + arr=np.array([x for x in f0s if x==x]) + print(f" -> F0 median {np.median(arr):.0f} min {arr.min():.0f} max {arr.max():.0f} | RTF~{np.median(rtfs):.2f}", flush=True) + +run(0.9, None) +run(0.9, 3.0) +print("NC_DONE") diff --git a/client/lucy-tts/diag_stream2.py b/client/lucy-tts/diag_stream2.py new file mode 100644 index 0000000..eaa546a --- /dev/null +++ b/client/lucy-tts/diag_stream2.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +"""Warum 'manchmal zu laut' + 'Stimme verändert sich am Anfang'? Stream-Kopf-Logik N× laufen lassen +und Gain, Crop-Punkt, Kopf-Segmente, Whisper-Start, rms/peak protokollieren.""" +import os, numpy as np, librosa, soundfile as sf +from pocket_tts import TTSModel +from faster_whisper import WhisperModel + +BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" +src,_ = librosa.load(os.path.join(BASE,"ref.mp3"), sr=24000, mono=True) +srt,_ = librosa.effects.trim(src, top_db=30); ref=os.path.join(BASE,"ref.wav") +sf.write(ref, srt[:int(18*24000)], 24000) +TARGET_RMS=0.09; LEAD="Tja. " +m = TTSModel.load_model(language="german_24l", lsd_decode_steps=6, temp=0.9) +vs = m.get_state_for_audio_prompt(ref); sr=m.sample_rate +w = WhisperModel("small", device="cpu", compute_type="int8") +TEXTS = ["Hallo Commander, ich höre dich.", + "Natürlich, Commander. Das Backup ist sauber durchgelaufen."] + +def run_once(text): + chunks=[] + for c in m.generate_audio_stream(vs, LEAD+text, frames_after_eos=4): + c=c.numpy() if hasattr(c,"numpy") else np.asarray(c) + chunks.append(np.asarray(c,dtype=np.float32).reshape(-1)) + full=np.concatenate(chunks) + # Kopf adaptiv (wie Server): bis >=2 Segmente oder 2.5s + head=[]; hl=0; head_arr=None + for c in chunks: + head.append(c); hl+=c.size + if hl < int(0.5*sr): continue + a=np.concatenate(head) + if len(librosa.effects.split(a, top_db=35))>=2 or hl>=int(2.5*sr): + head_arr=a; break + if head_arr is None: head_arr=np.concatenate(head) + iv=librosa.effects.split(head_arr, top_db=35) + segs=[(round(s/sr,2),round(e/sr,2)) for s,e in iv] + # Gain aus voiced (aktuelle Server-Logik) + voiced=np.concatenate([head_arr[s:e] for s,e in iv]) if len(iv) else head_arr + rms=float(np.sqrt(np.mean(voiced**2))) or 1e-9 + gain=TARGET_RMS/rms + # Crop (aktuell): kurz vor echtem Wort + if len(iv)>=2: + cut=max(iv[0][1], iv[1][0]-int(0.06*sr)); cropped=full[cut:] + else: + cropped=full + out=np.clip(cropped*gain,-0.95,0.95) + sf.write(os.path.join(BASE,"out_diag_s.wav"), out, sr) + seg,_=w.transcribe(os.path.join(BASE,"out_diag_s.wav"), language="de", beam_size=5) + start=(" ".join(x.text for x in seg)).strip()[:30] + return dict(segs=segs, voiced_rms=round(rms,3), gain=round(gain,2), + out_rms=round(float(np.sqrt(np.mean(out**2))),3), out_peak=round(float(np.abs(out).max()),3), + start=start) + +for text in TEXTS: + print(f"=== {text[:30]!r} ===") + for i in range(4): + print(f" run{i}:", run_once(text)) +print("DIAG2_DONE") diff --git a/client/lucy-tts/diag_stream3.py b/client/lucy-tts/diag_stream3.py new file mode 100644 index 0000000..66bd950 --- /dev/null +++ b/client/lucy-tts/diag_stream3.py @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- +"""Test der ROBUSTEN Stream-Kopf-Logik: fester 1.8s-Kopf + Crop am ersten SUBSTANZIELLEN Wort-Segment +(ignoriert Mini-Blips) + FIXER Gain. Ziel: Start immer echtes Wort, out_rms stabil ~0.09, kein Clip.""" +import os, numpy as np, librosa, soundfile as sf +from pocket_tts import TTSModel +from faster_whisper import WhisperModel + +BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" +src,_ = librosa.load(os.path.join(BASE,"ref.mp3"), sr=24000, mono=True) +srt,_ = librosa.effects.trim(src, top_db=30); ref=os.path.join(BASE,"ref.wav") +sf.write(ref, srt[:int(18*24000)], 24000) +TARGET_RMS=0.09; LEAD="Tja. " +BASE_GAIN = TARGET_RMS / 0.18 # ~0.5 (raw full-rms ~0.18 konsistent) +GMIN, GMAX = 0.7*BASE_GAIN, 1.4*BASE_GAIN # Gain-Clamp -> kann NIE explodieren +HEAD_FIXED = int(2.0*24000) +m = TTSModel.load_model(language="german_24l", lsd_decode_steps=6, temp=0.9) +vs = m.get_state_for_audio_prompt(ref); sr=m.sample_rate +w = WhisperModel("small", device="cpu", compute_type="int8") +TEXTS = ["Hallo Commander, ich höre dich.", + "Natürlich, Commander. Das Backup ist sauber durchgelaufen."] + +def crop_and_gain(a): + """Crop am ersten SUBSTANZIELLEN Wort-Segment nach dem Lead (>=0.2s, ignoriert Mini-Blips); + Gain aus voiced-rms, GECLAMPT (kann nie explodieren).""" + iv = librosa.effects.split(a, top_db=35) + voiced = np.concatenate([a[s:e] for s,e in iv]) if len(iv) else a + rms = float(np.sqrt(np.mean(voiced**2))) or 1e-9 + gain = float(np.clip(TARGET_RMS/rms, GMIN, GMAX)) + cut = 0 + if len(iv) >= 2: + for k in range(1, len(iv)): + if (iv[k][1]-iv[k][0]) >= int(0.20*sr): + cut = max(iv[k-1][1], iv[k][0]-int(0.06*sr)); break + return a[cut:], round(cut/sr,2), round(gain,2) + +def run_once(text): + head=[]; hl=0; head_done=False; head_arr=None; rest=[] + for c in m.generate_audio_stream(vs, LEAD+text, frames_after_eos=4): + c=c.numpy() if hasattr(c,"numpy") else np.asarray(c); c=np.asarray(c,dtype=np.float32).reshape(-1) + if not head_done: + head.append(c); hl+=c.size + if hl>=HEAD_FIXED: head_arr=np.concatenate(head); head_done=True + else: rest.append(c) + if head_arr is None: head_arr=np.concatenate(head) + cropped_head, cutpt, gain = crop_and_gain(head_arr) + full = np.concatenate([cropped_head]+rest) + out=np.clip(full*gain,-0.95,0.95) + sf.write(os.path.join(BASE,"out_diag_s3.wav"), out, sr) + seg,_=w.transcribe(os.path.join(BASE,"out_diag_s3.wav"), language="de", beam_size=5) + start=(" ".join(x.text for x in seg)).strip()[:32] + return dict(cut=cutpt, gain=gain, out_rms=round(float(np.sqrt(np.mean(out**2))),3), + out_peak=round(float(np.abs(out).max()),3), start=start) + +print(f"gain-clamp=[{round(GMIN,2)},{round(GMAX,2)}] head={HEAD_FIXED/24000}s") +for text in TEXTS: + print(f"=== {text[:28]!r} ===") + for i in range(5): + print(f" run{i}:", run_once(text)) +print("DIAG3_DONE") diff --git a/client/lucy-tts/diag_voice_f0.py b/client/lucy-tts/diag_voice_f0.py new file mode 100644 index 0000000..cedd9b7 --- /dev/null +++ b/client/lucy-tts/diag_voice_f0.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +"""Verifiziert die 'Stimme wurde männlich'-Hypothese: misst F0 (Grundfrequenz) vieler Generierungen +bei temp 0.9 vs 0.7. Weiblich (Saber-Klon) ~180-240Hz, männlich-Drift (Default 'juergen') ~100-140Hz. +Sucht Ausreißer = Stimm-Identitäts-Kollaps.""" +import os, numpy as np, librosa, soundfile as sf +from pocket_tts import TTSModel + +BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" +src,_ = librosa.load(os.path.join(BASE,"ref.mp3"), sr=24000, mono=True) +srt,_ = librosa.effects.trim(src, top_db=30); ref=os.path.join(BASE,"ref.wav") +sf.write(ref, srt[:int(18*24000)], 24000) +LEAD="Tja. " +TEXTS = [ + "Hallo Commander, ich höre dich.", + "Natürlich, Commander, das mache ich sofort.", + "Die Hitze in Hamburg ist heute wirklich heftig.", + "Klar, ich kümmere mich gleich darum für dich.", + "Guten Morgen, Commander, alles läuft sauber.", + "Das Backup ist durchgelaufen, keine Fehler.", +] + +def median_f0(a, sr): + f0,_,_ = librosa.pyin(a, fmin=80, fmax=400, sr=sr, frame_length=1024) + v = f0[~np.isnan(f0)] + return float(np.median(v)) if v.size else float("nan") + +def run(temp): + m = TTSModel.load_model(language="german_24l", lsd_decode_steps=6, temp=temp) + vs = m.get_state_for_audio_prompt(ref); sr=m.sample_rate + print(f"=== temp={temp} ===", flush=True) + f0s=[] + for i,t in enumerate(TEXTS): + a = m.generate_audio(vs, LEAD+t, frames_after_eos=4) + a = a.numpy() if hasattr(a,"numpy") else np.asarray(a) + a = np.asarray(a,dtype=np.float32).reshape(-1) + f0 = median_f0(a, sr); f0s.append(f0) + flag = " <<< MÄNNLICH?" if (f0==f0 and f0<150) else "" + print(f" [{i}] F0={f0:6.1f}Hz{flag} ({t[:30]})", flush=True) + arr=np.array([x for x in f0s if x==x]) + print(f" -> median {np.median(arr):.0f}Hz, min {arr.min():.0f}, max {arr.max():.0f}", flush=True) + +run(0.9) +run(0.7) +print("F0_DONE") diff --git a/client/lucy-tts/final_test.py b/client/lucy-tts/final_test.py new file mode 100644 index 0000000..3b80707 --- /dev/null +++ b/client/lucy-tts/final_test.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +"""ABSCHLUSS-TEST: beweist die Prompt-Wirkung. Dieselbe Lucy-Antwort im NEUEN Stil (kurze Sätze, +Punkte) vs. ALTEM Stil (Komma-Kette). Rendert auf :8134 + Desktop, misst Pausen (Whisper).""" +import os, io, json, urllib.request +import numpy as np, soundfile as sf +from faster_whisper import WhisperModel + +SERVER = "http://127.0.0.1:8134/tts" +OUT = os.path.join(os.path.expanduser("~"), "Desktop", "lucy_test"); os.makedirs(OUT, exist_ok=True) + +# Gleicher Inhalt, zwei Stile — so würde Lucy VORHER (Komma-Kette) und NACHHER (Prompt: kurze Sätze) antworten. +PAIRS = [ + ("A_backup", + "Klar, Commander, das Backup ist heute Nacht durchgelaufen, es gab keine Fehler, und die Datenbank läuft stabil bei 92 Prozent.", + "Klar, Commander. Das Backup lief heute Nacht durch. Keine Fehler. Die Datenbank ist stabil bei 92 Prozent."), + ("B_status", + "Also, wenn ich das kurz zusammenfasse, die Verbindung war weg, dann lief das Update durch, danach musste ich neu starten, und jetzt sind alle Dienste wieder oben.", + "Kurz zusammengefasst, Commander. Die Verbindung war weg. Das Update lief durch. Ich musste neu starten. Jetzt sind alle Dienste wieder oben."), +] + +def render(text): + req = urllib.request.Request(SERVER, data=json.dumps({"text": text}).encode("utf-8"), + headers={"Content-Type": "application/json"}) + return urllib.request.urlopen(req, timeout=180).read() + +w = WhisperModel("small", device="cpu", compute_type="int8") + +def measure(tag, text): + wav = render(text); path = os.path.join(OUT, tag + ".wav"); open(path, "wb").write(wav) + a, sr = sf.read(io.BytesIO(wav)); a = np.asarray(a, dtype=np.float32).reshape(-1); dur = len(a)/sr + segs, _ = w.transcribe(path, language="de", beam_size=5, word_timestamps=True) + words = [x for s in segs for x in (s.words or [])] + gaps = [words[i+1].start - words[i].end for i in range(len(words)-1)] + lang = [(words[i].word.strip(), gaps[i]) for i in range(len(gaps)) if gaps[i] >= 0.30] + total_pause = sum(g for g in gaps if g >= 0.15) + return dur, len(lang), total_pause, lang + +for name, alt, neu in PAIRS: + d_a, n_a, tp_a, l_a = measure(f"{name}_ALT_komma", alt) + d_n, n_n, tp_n, l_n = measure(f"{name}_NEU_kurz", neu) + print(f"\n### {name}") + print(f" ALT (Komma-Kette): {d_a:4.1f}s | {n_a} LANG-Pausen | Summe Pausen {tp_a*1000:4.0f}ms") + print(f" LANG: " + (", ".join(f'„{ww}\"={gg*1000:.0f}ms' for ww, gg in l_a) or "keine")) + print(f" NEU (kurze Sätze): {d_n:4.1f}s | {n_n} LANG-Pausen | Summe Pausen {tp_n*1000:4.0f}ms") + print(f" LANG: " + (", ".join(f'„{ww}\"={gg*1000:.0f}ms' for ww, gg in l_n) or "keine")) + print(f" -> {d_a-d_n:+.1f}s Dauer, {tp_a*1000-tp_n*1000:+.0f}ms Pausen-Summe") +print("\n=== ABSCHLUSS-TEST FERTIG === (WAVs im Desktop\\lucy_test)") diff --git a/client/lucy-tts/lucy_ready.py b/client/lucy-tts/lucy_ready.py new file mode 100644 index 0000000..fca201b --- /dev/null +++ b/client/lucy-tts/lucy_ready.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- +"""lucy_ready.py — Startklar-Check + finale Samples in EINEM Lauf. +Bootet den ECHTEN Server (FastAPI-TestClient triggert lifespan: Modell-Load, A1-Cache, STATE), +prüft /health, und rendert die finalen Hörproben über die REALEN Endpoints /tts und /tts/stream +(exakt das, was die Lucy-App auf :8130 aufruft) — inkl. Live-TTFB der Streaming-Antwort. +Legt die Samples auf den Desktop, schreibt lucy_ready_report.json. +""" +import os, time, json +import numpy as np, soundfile as sf +from fastapi.testclient import TestClient +import pocket_server as ps + +DESK = os.path.join(os.path.expanduser("~"), "Desktop", "lucy_samples") +os.makedirs(DESK, exist_ok=True) + +SENT = { + "kurz": "Hallo Commander, ich höre dich.", + "mittel": "Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", + "lang": "Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die " + "Protokolle und melde mich, sobald alles wieder läuft.", +} +LONG = ("Guten Morgen, Commander. " + "Das nächtliche Backup ist sauber durchgelaufen und es gab keine Fehler. " + "Der Dienst läuft stabil und die Engine antwortet zügig. " + "Wenn du möchtest, fasse ich die offenen Punkte für heute zusammen.") + +report = {} +t0 = time.time() +with TestClient(ps.app) as c: # <-- triggert lifespan (echter Boot) + report["boot_s"] = round(time.time() - t0, 1) + h = c.get("/health").json() + report["health"] = h + print(f"BOOT in {report['boot_s']}s health={h}") + + for name, text in SENT.items(): # /tts (ganze Datei) -> Desktop + t = time.time(); r = c.post("/tts", json={"text": text}); dt = time.time() - t + assert r.status_code == 200, f"/tts {name} -> {r.status_code}" + open(os.path.join(DESK, f"lucy_final_{name}.wav"), "wb").write(r.content) + print(f"/tts {name:6}: {dt:4.2f}s audio={r.headers.get('X-Audio-Seconds')}s") + + # /tts/stream: lange Antwort wie Lucy LIVE spricht -> TTFB messen + PCM zu WAV + sr = int(h.get("sr") or 24000) + t = time.time(); first = None; chunks = [] + with c.stream("POST", "/tts/stream", json={"text": LONG}) as s: + sr = int(s.headers.get("X-Sample-Rate", sr)) + for ch in s.iter_bytes(): + if ch: + if first is None: + first = time.time() - t + chunks.append(ch) + a = np.frombuffer(b"".join(chunks), dtype=" {p}") + ps.STATE.clear() + del m + + +if __name__ == "__main__": + print("=== A2 AN (Highpass+Norm) + A1 safetensors-Cache ===") + build(ref_clean=True, tag="clean", use_cache=True) + print("\n=== A2 AUS (Roh-Referenz, direkt geklont) ===") + build(ref_clean=False, tag="raw", use_cache=False) + print(f"\nFERTIG. Samples liegen in: {DESK}") diff --git a/client/lucy-tts/measure_fix.py b/client/lucy-tts/measure_fix.py new file mode 100644 index 0000000..a9080b9 --- /dev/null +++ b/client/lucy-tts/measure_fix.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +"""Fix-Verifikation: rendert die Problem-/Regressionssätze auf :8134, misst Pausen + IST (Whisper).""" +import os, io, json, urllib.request +import numpy as np, soundfile as sf +from faster_whisper import WhisperModel + +SERVER = "http://127.0.0.1:8134/tts" +OUT = os.path.join(os.environ["TEMP"], "lucy_fix"); os.makedirs(OUT, exist_ok=True) + +TESTS = [ + ("01_kurz", "Schön, dass du da bist, Commander."), + ("07_lang", "Guten Morgen, Commander. Das nächtliche Backup ist um 3 Uhr durchgelaufen, es gab keine Fehler, und die Datenbank läuft mit 92 Prozent Auslastung völlig stabil."), + ("08_sehr_lang","Also, Commander, wenn ich das kurz zusammenfassen darf: heute früh war die Verbindung weg, dann lief das Update durch, danach musste ich zweimal neu starten, und jetzt sind endlich alle Dienste oben, das Gedächtnis ist warm, und wir können ganz entspannt weitermachen."), + ("09_akronyme", "Die CPU der RX 9070 XT und die GPU laufen mit ROCm, sagt der PC über das LAN. Es ist 21 Uhr UTC."), +] + +def render(text): + req = urllib.request.Request(SERVER, data=json.dumps({"text": text}).encode("utf-8"), + headers={"Content-Type": "application/json"}) + return urllib.request.urlopen(req, timeout=180).read() + +w = WhisperModel("small", device="cpu", compute_type="int8") +for name, text in TESTS: + wav = render(text) + path = os.path.join(OUT, name + ".wav"); open(path, "wb").write(wav) + a, sr = sf.read(io.BytesIO(wav)); a = np.asarray(a, dtype=np.float32).reshape(-1); dur = len(a)/sr + segs, _ = w.transcribe(path, language="de", beam_size=5, word_timestamps=True) + words = [x for s in segs for x in (s.words or [])] + got = " ".join(x.word.strip() for x in words) + pauses = [(words[i].word.strip(), words[i+1].start - words[i].end) + for i in range(len(words)-1) if (words[i+1].start - words[i].end) >= 0.25] + print(f"\n### {name} {dur:.1f}s {len(words)} Wörter") + print(f"IST: {got}") + if pauses: + print("PAUSEN>=250ms: " + ", ".join(f'„{ww}\"={gg*1000:.0f}ms' for ww, gg in sorted(pauses, key=lambda t:-t[1])[:6])) + else: + print("PAUSEN>=250ms: KEINE") +print("\n=== FERTIG ===") diff --git a/client/lucy-tts/oute_pc.py b/client/lucy-tts/oute_pc.py new file mode 100644 index 0000000..7819554 --- /dev/null +++ b/client/lucy-tts/oute_pc.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +import os, time, numpy as np, soundfile as sf, librosa, torch, torchaudio +def _ta_load(p,*a,**k): + x,sr=sf.read(p,dtype="float32"); return torch.from_numpy((x.T if x.ndim>1 else x[None,:]).copy()),sr +def _ta_save(p,t,sample_rate=24000,*a,**k): + sr=k.get("sample_rate",sample_rate); x=t.detach().cpu().numpy() + sf.write(p,(x.T if x.ndim>1 else x.reshape(-1)),int(sr)) +torchaudio.load=_ta_load; torchaudio.save=_ta_save +def _wl(f,sr=16000): + y,_=librosa.load(f,sr=sr,mono=True); return y.astype(np.float32) +try: + import whisper.audio as _wa; _wa.load_audio=_wl + import whisper.transcribe as _wt; _wt.load_audio=_wl +except Exception as e: print("whisper-patch:", e, flush=True) +import outetts + +BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" +ref = os.path.join(BASE, "ref.wav") +y,_ = librosa.load(os.path.join(BASE,"ref.mp3"), sr=24000, mono=True) +yt,_ = librosa.effects.trim(y, top_db=30) +sf.write(ref, yt[:int(14*24000)], 24000) + +cfg = outetts.ModelConfig( + model_path=os.path.join(BASE,"models","OuteTTS-1.0-1B-Q8_0.gguf"), + tokenizer_path="OuteAI/Llama-OuteTTS-1.0-1B", + interface_version=outetts.InterfaceVersion.V3, + backend=outetts.Backend.LLAMACPP, +) +cfg.n_gpu_layers = 999 +t0=time.time(); iface=outetts.Interface(config=cfg); print(f"[iface] {time.time()-t0:.1f}s", flush=True) +spk=iface.create_speaker(ref); print("[clone ok]", flush=True) + +OUT=os.path.join(BASE,"out"); os.makedirs(OUT,exist_ok=True) +SENT={ + "kurz":"Hallo Commander, ich höre dich.", + "mittel":"Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", + "lang":"Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft.", +} +for name,text in SENT.items(): + for run in ("cold","warm"): + t0=time.time(); out=iface.generate(config=outetts.GenerationConfig(text=text, speaker=spk)); dt=time.time()-t0 + p=os.path.join(OUT,f"{name}.wav"); out.save(p) + x,sr=sf.read(p); secs=len(x)/sr + print(f"[{name:6} {run:4}] gen={dt:5.2f}s audio={secs:5.2f}s RTF={dt/max(secs,0.01):.2f}", flush=True) +print("PC_DONE", flush=True) diff --git a/client/lucy-tts/pocket_server.py b/client/lucy-tts/pocket_server.py new file mode 100644 index 0000000..b3e3bc9 --- /dev/null +++ b/client/lucy-tts/pocket_server.py @@ -0,0 +1,471 @@ +# -*- coding: utf-8 -*- +"""Lucy-Stimme: Pocket TTS (Kyutai) als lokaler CPU-Dienst. Klont Lucys Saber-Stimme, real-time, kein GPU.""" +import os, io, re, time, threading, logging +import numpy as np, soundfile as sf, librosa +from scipy.signal import butter, sosfilt +from fastapi import FastAPI +from fastapi.responses import Response, JSONResponse, StreamingResponse +from pydantic import BaseModel +from contextlib import asynccontextmanager +from concurrent.futures import ProcessPoolExecutor +from pocket_tts import TTSModel, export_model_state +from text_norm import normalize_numbers, fix_acronyms # Zahlen-Normalisierung + Akronym-Fix für die Stimme + +log = logging.getLogger("lucy-tts"); logging.basicConfig(level=logging.INFO) +BASE = os.path.dirname(os.path.abspath(__file__)) +REF_MP3 = os.path.join(BASE, "ref.mp3") +LANG = os.environ.get("LUCY_LANG", "german_24l") +# Vom User per Ohr getunt (2026-06-28): lsd 10 + noise_clamp 2.5 + ref18 (Sweep-Sieger: sauberes +# 'Commander', Timbre + logische Betonung, wenig Rauschen). temp 0.9 (lebendig). Per Env umschaltbar. +LSD = int(os.environ.get("LUCY_LSD", "16")) # 16 statt 10: glattere Prosodie/Komma-Übergänge (User-A/B 2026-07-01), RTF bleibt <1 +TEMP = float(os.environ.get("LUCY_TEMP", "0.9")) +def _parse_nc(v): # noise_clamp: Zahl, oder None bei "none"/leer/0 + return None if v.strip().lower() in ("", "none", "0") else float(v) +NOISE_CLAMP = _parse_nc(os.environ.get("LUCY_NOISE_CLAMP", "2.5")) # dämpft Artefakte+Rauschen+Kollaps; 3.0 = rauschärmer +FEOS = int(os.environ.get("LUCY_FRAMES_AFTER_EOS", "4")) # kurze Sätze bekamen sonst 0ms Schwanz +TARGET_RMS = float(os.environ.get("LUCY_TARGET_RMS", "0.09")) # User: 0.09 u. 0.06 beide gut -> 0.09 Default +LEAD = os.environ.get("LUCY_LEAD", "Tja. ") # Wegwerf-Lead-Wort -> natürlicher Onset fürs echte 1. Wort +QUANTIZE = os.environ.get("LUCY_QUANTIZE", "1") not in ("0", "false", "False") # int8: ~27% schneller, lt. Doku ohne Qualitätsverlust +PAD_S = float(os.environ.get("LUCY_PAD_S", "0.025")) # Satz-Polster (klein = flüssigere Übergänge bei langen Antworten) +TAIL_DB = int(os.environ.get("LUCY_TAIL_DB", "30")) # Tail-Trim (dB unter Peak): kleiner = mehr Nachlauf-Stille weg = kürzere Satz-Pausen (gemessen: 45 ließ 500-680ms stehen) +MAX_GAP_S = float(os.environ.get("LUCY_MAX_GAP", "0.20")) # interne Sprech-Pausen deckeln: Pockets Komma-Pausen ziehen bis 580ms -> hart auf 200ms kappen (flüssiger) +F0_FLOOR = float(os.environ.get("LUCY_F0_FLOOR", "160")) # Hz: drunter = männlicher Kollaps (Klon~220, male~100) +FP_FLOOR = float(os.environ.get("LUCY_FP_FLOOR", "0.94")) # Fingerabdruck-Ähnlichkeit (ohne MFCC0): drunter = Stimm-Drift (gut 0.956-0.98, drift 0.928) +MAX_TRIES = int(os.environ.get("LUCY_MAX_TRIES", "3")) # max. Versuche gegen Stimm-Anomalien +FP_MIN_S = float(os.environ.get("LUCY_FP_MIN_S", "2.0")) # B3: FP-Drift-Gate erst ab so viel stimmhafter Dauer (kurze Audios = verrauschter Fingerabdruck = Fehlalarm). F0-Gate bleibt immer aktiv. +# A1: Voice-State einmalig nach safetensors exportieren -> Start lädt kvcache statt neu zu klonen. +VOICE_ST = os.environ.get("LUCY_VOICE_ST", os.path.join(BASE, "lucy_voice.safetensors")) +FORCE_RECLONE = os.environ.get("LUCY_FORCE_RECLONE", "0") not in ("0", "false", "False") +# A2: Referenz-Cleaning (pocket reproduziert die Sample-Qualität mit) — Highpass + Peak-Norm, abschaltbar. +REF_CLEAN = os.environ.get("LUCY_REF_CLEAN", "1") not in ("0", "false", "False") +REF_HPF_HZ = float(os.environ.get("LUCY_REF_HPF_HZ", "70")) # Rumpel/Netzbrumm raus +REF_SECONDS = float(os.environ.get("LUCY_REF_SECONDS", "18")) # Klon-Referenzlänge +# B2: parallele Satz-Worker. SWEEP-ERGEBNIS (9700X, german_24l, 30.06.): seriell hat die BESTE +# TTFB (3.6s vs 6–8s Pool) UND RTF 0.74<1 (generiert schneller als Echtzeit -> Streaming spielt +# lückenlos). Daher Default 0 = seriell für Lucys Live-Stimme. Der Pool (>=1) lohnt NUR für +# Batch-/tts (ganze Datei am Stück): Durchsatz-Sweet-Spot 4w×2t (RTF 0.44) bzw. 3w×2t (RTF 0.50). +# Threads pro Worker via LUCY_WORKER_THREADS. +WORKERS = int(os.environ.get("LUCY_WORKERS", "0")) +# TTFB-Opt „kurzer erster Chunk": erster Stream-Chunk bleibt kurz -> Lucy spricht früher. +# MIT B3 (FP-Gate überspringt kurze Audios) GEMESSEN STARK: TTFB 1.31s statt 3.74s (30.06.), +# Wall ~gleich, RTF<1 (lückenlos). Daher Default AN. (Ohne B3 wäre es schlechter -> beides gehört +# zusammen.) Nur Stream-Pfad. +FAST_FIRST = os.environ.get("LUCY_FAST_FIRST", "1") not in ("0", "false", "False") +MIN_LEN = int(os.environ.get("LUCY_MIN_LEN", "55")) # Chunk-Bündelung: größer = weniger Übergänge = flüssiger +# Laufzeit-Regler (POST /tune, OHNE Neustart) -> Prosodie live nach Ohr A/B-testen. +# temp/lsd/noise_clamp sind Modell-Load-Params und NICHT hier drin (die brauchen einen Neustart). +TUNE = {"min_len": MIN_LEN, "pad_s": PAD_S, "fast_first": FAST_FIRST} +# Umlaut-Fix: LLM (Hermes/Qwen) gibt manchmal ASCII-Umlaute aus (ueber/schoen/maerz) -> pocket liest +# „ue" wörtlich. Wir wandeln NUR bekannte Ganzwörter zurück (sicher: „neue/aktuell/Steuer" bleiben). +UMLAUT_FIX = os.environ.get("LUCY_UMLAUT_FIX", "1") not in ("0", "false", "False") +STATE, LOCK = {}, threading.Lock() + +# Bekannte deutsche Umlaut-Wörter (korrekt geschrieben). Die ASCII-Schlüssel (ä->ae, ö->oe, ü->ue, +# ß->ss) werden daraus AUTOMATISCH abgeleitet -> wenig Fehlerquelle. Erweiterbar via LUCY_UMLAUT_EXTRA. +_UML_WORDS = ( + "über überall übrigens übernehmen überzeugt überprüfen für fürs fünf fünfzehn fünfzig müssen " + "müsste müssten können könnt könnte könnten könig königin möchte möchten möchtest möglich " + "möglichst möglichkeit würde würden würdest müde prüfen prüft prüfung zurück natürlich gemütlich " + "grün grüne grüße grüßen drücken dürfen darüber gegenüber dafür wofür hierfür führen führt " + "führung fühlen gefühl gefühle tür türen glück glücklich stück stücke brücke küche kühl " + "kühlschrank früh früher frühstück frühling bücher büro bürger südlich süden schüler schützen " + "wünschen wünsche übung übungen künstler künstlich rücken rückkehr brüder lücke müll gründe " + "gründen begründung vergnügen " + "schön schöne schöner schönste schönheit möbel höher höhe hören gehört gehören größe größer " + "größte öffnen öffnet geöffnet öffentlich öl östlich löschen löffel lösung lösen börse dörfer " + "wörter wörterbuch völlig völker störung stören zwölf böse höflich öfter vögel mögen " + "ähnlich änderung ändern ärger ärgern ärztin äußern äußerst gespräch gespräche hängen länger " + "länge mädchen männer märz nächste nächsten nähe näher qualität universität städte tätigkeit " + "täglich träume träumen väter wäre wären während wärme zähne erklären erklärung verändern " + "gefährlich geschäft geschäfte jährlich käse hände kälte plätze sätze wälder fähig fähigkeit" +).split() + +def _build_umlaut_map(): + words = list(_UML_WORDS) + extra = os.environ.get("LUCY_UMLAUT_EXTRA", "") + words += [w.strip() for w in extra.replace(",", " ").split() if w.strip()] + # gängige Flexionsendungen mitnehmen -> deckt mögliche/möglichen/größeren/schönes... ab. + # Bogus-Formen (z.B. „möchtee") sind harmlos: sie tauchen in echtem Text nie auf. + endings = ("", "e", "en", "er", "es", "em", "n", "s") + m = {} + for w in words: + base = w.lower() + for suf in endings: + wl = base + suf + ascii_w = wl.replace("ä", "ae").replace("ö", "oe").replace("ü", "ue").replace("ß", "ss") + if ascii_w != wl: # nur echte Umlaut-Wörter + m.setdefault(ascii_w, wl) + return m + +_UML_MAP = _build_umlaut_map() +_UML_RX = re.compile(r"\b(" + "|".join(sorted((re.escape(k) for k in _UML_MAP), key=len, reverse=True)) + + r")\b", re.IGNORECASE) if _UML_MAP else None + +def _fix_umlauts(text: str) -> str: + """Wandelt NUR bekannte ASCII-Umlaut-Ganzwörter zurück (ueber->über), case-erhaltend.""" + if not UMLAUT_FIX or not _UML_RX: + return text + def _repl(mo): + s = mo.group(0); u = _UML_MAP[s.lower()] + return u[:1].upper() + u[1:] if s[:1].isupper() else u + return _UML_RX.sub(_repl, text) + +def _prep_ref(): + """A2: Klon-Referenz aufbereiten. pocket-tts reproduziert die Sample-Qualität mit, daher optional + Highpass (Rumpeln/Netzbrumm) + Peak-Normalisierung. Per LUCY_REF_CLEAN=0 abschaltbar (A/B per Ohr).""" + ref = os.path.join(BASE, "ref.wav") + y, _ = librosa.load(REF_MP3, sr=24000, mono=True) + y, _ = librosa.effects.trim(y, top_db=30) + if REF_CLEAN: + sos = butter(4, REF_HPF_HZ, btype="highpass", fs=24000, output="sos") + y = sosfilt(sos, y).astype(np.float32) + # nach dem Highpass nochmal randstille trimmen, dann Peak-Norm gegen zu leise/zu laute Referenz + y, _ = librosa.effects.trim(y, top_db=30) + peak = float(np.max(np.abs(y))) or 1.0 + y = (y * (0.95 / peak)).astype(np.float32) + sf.write(ref, y[: int(REF_SECONDS * 24000)], 24000) + return ref + +def _drop_tail_blip(a: np.ndarray, sr: int) -> np.ndarray: + """Entfernt das End-'taa': isolierter, sehr leiser + kurzer Schwanz-Blip (Modell-Halluzination, + intermittierend bei temp 0.9). Verifiziert: trifft Blip (rms-ratio 0.15), schont echte Kurzwörter + wie 'Fehler' (ratio 0.55). Bedingung ALLE: große Lücke + viel leiser als Sprache + kurz.""" + for _ in range(3): # bis zu 3 Blips hintereinander + iv = librosa.effects.split(a, top_db=35) + if len(iv) < 2: + break + speech_rms = float(np.median([np.sqrt(np.mean(a[s:e] ** 2)) for s, e in iv[:-1]])) + s, e = iv[-1] + last_dur = (e - s) / sr + last_rms = float(np.sqrt(np.mean(a[s:e] ** 2))) + gap = (s - iv[-2][1]) / sr + if gap > 0.35 and last_rms < 0.30 * speech_rms and last_dur < 0.35: + a = a[: iv[-2][1]] + else: + break + return a + +def _crop_lead(a: np.ndarray, sr: int) -> np.ndarray: + """Schneidet das Wegwerf-Lead-Wort weg -> echtes 1. Wort behält seinen vollen, natürlichen Onset + (pocket-tts startet sonst mid-Phonem = 'vorne abgeschnitten'). Schnitt KURZ VOR dem echten Wort + (nicht direkt hinter dem Lead), damit auch die variable, teils lange Pause nach 'Tja.' verschwindet.""" + iv = librosa.effects.split(a, top_db=35) + if len(iv) >= 2: + cut = max(iv[0][1], iv[1][0] - int(0.06 * sr)) # 60ms vor echtem Wort, aber hinter dem Lead + a = a[cut:] + return a + +def _compress_gaps(a: np.ndarray, sr: int, max_gap: float = MAX_GAP_S, top_db: int = 30) -> np.ndarray: + """Deckelt INTERNE Sprech-Pausen (Pockets Komma-Pausen ziehen gemessen bis 580ms) auf max_gap. + Findet stimmhafte Segmente, fügt sie mit gekappter Lücke wieder zusammen -> flüssiger, ohne die + Sprache selbst anzutasten (nur Stille wird gekürzt). Onset-Vorlauf + Schwanz bleiben unberührt.""" + if a.size == 0 or max_gap <= 0: + return a + iv = librosa.effects.split(a, top_db=top_db) + if len(iv) < 2: + return a + cap = int(max_gap * sr) + out = [a[: iv[0][1]]] # Kopf inkl. natürlichem Onset-Vorlauf + for k in range(1, len(iv)): + g0 = iv[k - 1][1] + keep = min(iv[k][0] - g0, cap) + if keep > 0: + out.append(a[g0 : g0 + keep]) # gekappte Pause (Wort-Ausklang bleibt erhalten) + out.append(a[iv[k][0] : iv[k][1]]) # nächstes stimmhaftes Segment + out.append(a[iv[-1][1] :]) # Schwanz (bereits getrimmt) + return np.concatenate(out) + +def cleanup(a: np.ndarray, sr: int) -> np.ndarray: + """v4 (2026-06-28): Onset-Fix + RMS-Lautstärke + Blip-Killer. + - _drop_tail_blip gegen End-'taa' + - _crop_lead entfernt Wegwerf-Lead -> voller Onset vorne (kein Abschneiden mehr) + - nur HINTEN trimmen (vorne unangetastet), RMS-Normalisierung auf TARGET_RMS (statt lautem Peak 0.95) + - 8ms-Fades + 80ms-Atempause vorne+hinten.""" + a = np.asarray(a, dtype=np.float32).reshape(-1) + if a.size == 0: return a + a = _drop_tail_blip(a, sr) + a = _crop_lead(a, sr) + # nur den Schwanz trimmen (vorderen Onset behalten) + rev, _ = librosa.effects.trim(a[::-1], top_db=TAIL_DB) + a = rev[::-1] if rev.size else a + a = _compress_gaps(a, sr) # interne Komma-Pausen deckeln (größter Glättungs-Gewinn bei langen Sätzen) + # RMS-Normalisierung auf Zielpegel (gegen 'zu laut') + Peak-Sicherheits-Clamp + rms = float(np.sqrt(np.mean(a ** 2))) or 1e-9 + a = a * (TARGET_RMS / rms) + peak = float(np.max(np.abs(a))) + if peak > 0.9: a = a * (0.9 / peak) + fi = min(int(0.008 * sr), a.size // 2) # 8ms Fade gegen Klicks + if fi > 0: + a[:fi] *= np.linspace(0.0, 1.0, fi, dtype=np.float32) + a[-fi:] *= np.linspace(1.0, 0.0, fi, dtype=np.float32) + pad = np.zeros(int(TUNE["pad_s"] * sr), dtype=np.float32) # Atempause/Anti-Klick (klein -> flüssiger Satz-Übergang) + return np.concatenate([pad, a, pad]) + +@asynccontextmanager +async def lifespan(app): + t0 = time.time() + ref = _prep_ref() # ref.wav immer erzeugen -> Worker + Fingerabdruck + need_export = FORCE_RECLONE or not os.path.exists(VOICE_ST) or \ + os.path.getmtime(VOICE_ST) < os.path.getmtime(REF_MP3) + if WORKERS >= 1: + # B2-Pool: safetensors einmalig erzeugen (kurz ein Modell), dann RAM freigeben; Worker + # laden ihre eigene Instanz aus dem Cache. Hauptprozess hält danach KEIN Modell. + log.info("Starte Worker-Pool (%d) — pocket-tts %s lsd=%d temp=%.2f nc=%s quantize=%s", + WORKERS, LANG, LSD, TEMP, NOISE_CLAMP, QUANTIZE) + if need_export: + log.info("Erzeuge Voice-Cache %s ...", os.path.basename(VOICE_ST)) + mtmp = TTSModel.load_model(language=LANG, lsd_decode_steps=LSD, temp=TEMP, + noise_clamp=NOISE_CLAMP, quantize=QUANTIZE) + try: + export_model_state(mtmp.get_state_for_audio_prompt(ref), VOICE_ST) + except Exception as e: + log.warning("Voice-Export fehlgeschlagen (Worker klonen selbst): %s", e) + sr0 = mtmp.sample_rate + del mtmp + else: + sr0 = 24000 + ref_audio, _ = librosa.load(ref, sr=sr0, mono=True) + STATE.update(sr=sr0, ref_fp=_fingerprint(ref_audio, sr0)) + pool = ProcessPoolExecutor(max_workers=WORKERS, initializer=_worker_init) + list(pool.map(_warmup, range(WORKERS))) # alle Worker vorab hochfahren + STATE["pool"] = pool + log.info("Worker-Pool bereit (%d Prozesse) in %.1fs", WORKERS, time.time() - t0) + else: + log.info("Seriell — pocket-tts %s lsd=%d temp=%.2f nc=%s quantize=%s", + LANG, LSD, TEMP, NOISE_CLAMP, QUANTIZE) + m = TTSModel.load_model(language=LANG, lsd_decode_steps=LSD, temp=TEMP, + noise_clamp=NOISE_CLAMP, quantize=QUANTIZE) + if need_export: + log.info("Klone Stimme aus Referenz -> Export %s", os.path.basename(VOICE_ST)) + vs = m.get_state_for_audio_prompt(ref) + try: + export_model_state(vs, VOICE_ST); log.info("Voice-State exportiert") + except Exception as e: + log.warning("Voice-Export fehlgeschlagen (nutze Live-Klon): %s", e) + else: + log.info("Lade gecachten Voice-State <- %s", os.path.basename(VOICE_ST)) + try: + vs = m.get_state_for_audio_prompt(VOICE_ST) + except Exception as e: + log.warning("Cache-Load fehlgeschlagen, klone neu: %s", e) + vs = m.get_state_for_audio_prompt(ref) + ref_audio, _ = librosa.load(ref, sr=m.sample_rate, mono=True) + STATE.update(m=m, vs=vs, sr=m.sample_rate, ref_fp=_fingerprint(ref_audio, m.sample_rate)) + log.info("Lucy-Stimme bereit in %.1fs (sr=%d)", time.time() - t0, m.sample_rate) + yield + pool = STATE.get("pool") + if pool is not None: + pool.shutdown(wait=False, cancel_futures=True) + STATE.clear() + +app = FastAPI(title="Lucy TTS (Pocket)", lifespan=lifespan) + +class Req(BaseModel): + text: str + +class PerfIn(BaseModel): + msg: str = "" + +class TuneIn(BaseModel): + min_len: int | None = None # Chunk-Bündelung (größer = flüssiger, langsamere TTFB später) + pad_s: float | None = None # Pause zwischen Stücken (Sekunden) + fast_first: bool | None = None # erster Satz kurz halten (schnelle TTFB) an/aus + +def _ready() -> bool: + return STATE.get("pool") is not None or "m" in STATE + +def _gen_sentences_ordered(sentences): + """Liefert je Satz fertiges float32-Audio IN REIHENFOLGE. Mit Worker-Pool laufen alle Sätze + parallel (bis WORKERS gleichzeitig), werden aber in Eingabereihenfolge ausgegeben -> niedrige + TTFB + korrekte Reihenfolge. Ohne Pool: seriell im Hauptprozess (wie bisher, unter LOCK).""" + pool = STATE.get("pool") + sr = STATE["sr"] + if pool is not None: + for fut in [pool.submit(_worker_gen, s) for s in sentences]: + yield fut.result() + else: + with LOCK: + for s in sentences: + yield cleanup(_gen_gated_core(STATE, s), sr) + +@app.get("/health") +def health(): + return {"status": "ok" if _ready() else "loading", "engine": "pocket-tts", "lang": LANG, + "sr": STATE.get("sr"), "workers": WORKERS, "device": "cpu"} + +@app.post("/perf") +def perf(body: PerfIn): + """Client-Perf-Zeilen in DIESES Terminal loggen (der Nutzer hat den TTS-Log eh offen) -> + „Lucy denkt lange"-Diagnose ohne Browser-DevTools.""" + log.info("[lucy-perf] %s", body.msg) + return {"ok": True} + +@app.get("/tune") +def tune_get(): + """Aktuelle Laufzeit-Regler. temp/lsd/nc stehen separat (Modell-Load, Neustart nötig).""" + return {**TUNE, "note": "temp/lsd/noise_clamp brauchen Neustart (Env LUCY_TEMP/LSD/NOISE_CLAMP)"} + +@app.post("/tune") +def tune_set(body: TuneIn): + """Prosodie live ändern OHNE Neustart -> nächste Äußerung nutzt die neuen Werte.""" + if body.min_len is not None: TUNE["min_len"] = max(1, int(body.min_len)) + if body.pad_s is not None: TUNE["pad_s"] = max(0.0, float(body.pad_s)) + if body.fast_first is not None: TUNE["fast_first"] = bool(body.fast_first) + log.info("[tune] %s", TUNE) + return TUNE + +@app.post("/tts") +def tts(req: Req): + if not _ready(): + return JSONResponse({"error": "loading"}, status_code=503) + t0 = time.time(); sr = STATE["sr"] + parts = list(_gen_sentences_ordered(_split_sentences(fix_acronyms(normalize_numbers(_fix_umlauts(req.text))), min_len=TUNE["min_len"]))) + a = np.concatenate(parts) if parts else np.zeros(0, np.float32) + buf = io.BytesIO(); sf.write(buf, a, sr, format="WAV", subtype="PCM_16"); buf.seek(0) + dur = a.size / sr; gen = time.time() - t0 + log.info("/tts %dZ audio=%.1fs gen=%.1fs rtf=%.2f", len(req.text), dur, gen, gen / max(dur, 0.01)) + return Response(buf.read(), media_type="audio/wav", + headers={"X-Audio-Seconds": f"{dur:.2f}", "X-Gen-Seconds": f"{gen:.2f}"}) + +def _voiced_f0(a: np.ndarray, sr: int) -> float: + """Schnelle Grundfrequenz-Schätzung auf dem längsten stimmhaften Segment (max 0.6s) via yin. + Für das Stimm-Kollaps-Gate: Klon ~220Hz, männlicher Default ~100Hz.""" + a = np.asarray(a, dtype=np.float32).reshape(-1) + iv = librosa.effects.split(a, top_db=35) + if not len(iv): + return float("nan") + s, e = max(iv, key=lambda x: x[1] - x[0]) + seg = a[s:min(e, s + int(0.6 * sr))] + if seg.size < int(0.1 * sr): + return float("nan") + fv = librosa.yin(seg, fmin=80, fmax=400, sr=sr, frame_length=1024) + return float(np.median(fv)) if fv.size else float("nan") + +def _fingerprint(a: np.ndarray, sr: int) -> np.ndarray: + """Stimm-Fingerabdruck (MFCC mean+std über stimmhafte Frames, normiert). Für den Drift-Wächter: + erkennt JEDEN Stimm-Wechsel (auch weiblich->andere weiblich, das der F0-Wächter durchließ).""" + a = np.asarray(a, dtype=np.float32).reshape(-1) + iv = librosa.effects.split(a, top_db=30) + if len(iv): + a = np.concatenate([a[s:e] for s, e in iv]) + if a.size < int(0.2 * sr): + return None + m = librosa.feature.mfcc(y=a, sr=sr, n_mfcc=20)[1:] # MFCC0 (Energie) weglassen -> amplituden-invariant + v = np.concatenate([m.mean(1), m.std(1)]) + return (v / (np.linalg.norm(v) + 1e-9)).astype(np.float32) + +def _gen_gated_core(st: dict, text: str) -> np.ndarray: + """Einen Satz erzeugen mit DOPPEL-Wächter (best-of-N): männlicher Kollaps (F0 neu generieren; am Ende den ref-ähnlichsten, + nicht-männlichen Kandidaten behalten. `st` = Zustand (STATE im Hauptprozess, _W im Worker).""" + best_a, best_score = None, -2.0 + m, vs, sr, ref_fp = st["m"], st["vs"], st["sr"], st.get("ref_fp") + for attempt in range(MAX_TRIES): + audio = m.generate_audio(vs, LEAD + text, frames_after_eos=FEOS) + a = audio.numpy() if hasattr(audio, "numpy") else np.asarray(audio) + a = np.asarray(a, dtype=np.float32).reshape(-1) + f0 = _voiced_f0(a, sr) + male = f0 == f0 and f0 < F0_FLOOR + cropped = _crop_lead(a, sr) # ohne Lead -> vergleichbar mit Referenz + # B3: FP-Drift nur bei genug stimmhafter Dauer prüfen (kurze Audios -> Fingerabdruck unzuverlässig -> Fehlalarm) + iv = librosa.effects.split(cropped, top_db=30) + voiced_s = (sum(int(e - s) for s, e in iv) / sr) if len(iv) else 0.0 + fp = _fingerprint(cropped, sr) if voiced_s >= FP_MIN_S else None + sim = float(np.dot(ref_fp, fp)) if (ref_fp is not None and fp is not None) else 1.0 + score = sim - (1.0 if male else 0.0) # männlich hart abstrafen + if score > best_score: + best_score, best_a = score, a + if not male and sim >= FP_FLOOR: # gut genug -> stop + break + log.warning("Stimm-Anomalie (F0=%.0f male=%s sim=%.3f<%.2f) -> regeneriere (try %d)", + f0, male, sim, FP_FLOOR, attempt + 1) + return best_a + +def _gen_gated(text: str) -> np.ndarray: + """Serieller Hauptprozess-Pfad (nutzt STATE). Wird auch von make_samples.py verwendet.""" + return _gen_gated_core(STATE, text) + +# --- B2: persistenter Worker-Pool (je Prozess eigene Modellinstanz + Voice-State aus A1-Cache) ----- +_W: dict = {} # Per-Prozess-Zustand des Workers + +def _worker_init(): + """Einmal pro Worker-Prozess: Torch-Threads pinnen (gegen Oversubscription), Modell laden, + Voice-State aus dem safetensors-Cache (A1) ziehen (Fallback: live klonen).""" + try: + import torch + torch.set_num_threads(int(os.environ.get("LUCY_WORKER_THREADS", "2"))) + except Exception: + pass + m = TTSModel.load_model(language=LANG, lsd_decode_steps=LSD, temp=TEMP, + noise_clamp=NOISE_CLAMP, quantize=QUANTIZE) + try: + vs = m.get_state_for_audio_prompt(VOICE_ST) + except Exception: + vs = m.get_state_for_audio_prompt(_prep_ref()) + ref_audio, _ = librosa.load(os.path.join(BASE, "ref.wav"), sr=m.sample_rate, mono=True) + _W.update(m=m, vs=vs, sr=m.sample_rate, ref_fp=_fingerprint(ref_audio, m.sample_rate)) + +def _worker_gen(text: str) -> np.ndarray: + """Im Worker: Satz mit Doppel-Wächter erzeugen + cleanup. Rückgabe = fertiges float32-PCM (picklebar).""" + return np.asarray(cleanup(_gen_gated_core(_W, text), _W["sr"]), dtype=np.float32) + +def _warmup(_): + if "m" not in _W: + _worker_init() + return _W["sr"] + +_SENT_RX = re.compile(r".+?(?:[.!?…]+(?:\s|$)|$)", re.S) + +def _split_sentences(text: str, min_len: int = 55, keep_first_short: bool = False) -> list[str]: + """Text in Sätze zerlegen und sehr kurze Teile bündeln. Für satzweise Generierung + + F0-Gate pro Satz -> ein Kollaps in der Mitte langer Antworten erreicht den Nutzer NIE. + keep_first_short=True: der ERSTE Teil bleibt eigenständig (auch wenn kurz) -> schnellste TTFB + im Stream (Lucy fängt früher an zu sprechen), Rest wird normal gebündelt.""" + parts = [m.group(0).strip() for m in _SENT_RX.finditer(text.strip())] + out: list[str] = [] + for p in parts: + if not p: + continue + if not out: + out.append(p) # erster Teil + elif keep_first_short and len(out) == 1: + out.append(p) # zweiter Teil startet frisch -> Index 0 bleibt kurz + elif len(out[-1]) < min_len: + out[-1] = f"{out[-1]} {p}" + else: + out.append(p) + return out or [text.strip()] + +def _to_pcm16(a: np.ndarray, gain: float) -> bytes: + """float -> 16-bit-PCM (LE), mit Gain + Sicherheits-Clip.""" + a = np.asarray(a, dtype=np.float32).reshape(-1) * gain + np.clip(a, -0.95, 0.95, out=a) + return (a * 32767.0).astype(" {OUT}") diff --git a/client/lucy-tts/speed_test.py b/client/lucy-tts/speed_test.py new file mode 100644 index 0000000..5017ace --- /dev/null +++ b/client/lucy-tts/speed_test.py @@ -0,0 +1,20 @@ +import time +from llama_cpp import Llama + +MODEL = r"F:\Coding Stuff\mission-control-2\client\lucy-tts\models\OuteTTS-1.0-1B-Q8_0.gguf" + +t0 = time.time() +llm = Llama(model_path=MODEL, n_gpu_layers=999, n_ctx=8192, verbose=True) +print(f"[load] {time.time()-t0:.1f}s", flush=True) + +prompt = "Guten Tag, mein Name ist" +# warmup +llm(prompt, max_tokens=16, temperature=0.8) +# messen +for i in range(2): + t0 = time.time() + out = llm(prompt, max_tokens=300, temperature=0.8) + dt = time.time() - t0 + n = out["usage"]["completion_tokens"] + print(f"[run {i+1}] {n} tokens in {dt:.2f}s = {n/dt:.1f} tok/s", flush=True) +print("SPEED_DONE", flush=True) diff --git a/client/lucy-tts/stress_de.py b/client/lucy-tts/stress_de.py new file mode 100644 index 0000000..b46c8b8 --- /dev/null +++ b/client/lucy-tts/stress_de.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +"""Deutscher TTS-Stresstest: rendert 10 Sätze (typische DE-Fallen, alle Längen), transkribiert per +Whisper (SOLL vs IST) und misst Pausen/Prosodie. Server muss auf :8134 laufen (pocket_server /tts).""" +import os, io, json, urllib.request +import numpy as np, soundfile as sf, librosa +from faster_whisper import WhisperModel + +SERVER = "http://127.0.0.1:8134/tts" +OUT = r"C:\Users\TobisPC\Desktop\lucy_de_stress"; os.makedirs(OUT, exist_ok=True) + +TESTS = [ + ("01_kurz_umlaut", "kurz", "Schön, dass du da bist, Commander."), + ("02_kurz_zahlen", "kurz", "Es ist 21 Uhr 40, und wir haben noch 16 GB frei."), + ("03_komposita", "mittel", "Die Geschwindigkeitsbegrenzung und die Aufmerksamkeitsspanne sind heute besonders wichtig."), + ("04_ss_sch_ch", "mittel", "Ich weiß nicht, ob die Straße noch frei ist, aber ich schaue gleich mal nach."), + ("05_umlaut_haeufung", "mittel", "Über fünf Türme, größere Bäume und schöne Flüsse führt die Röhre nach Süden."), + ("06_fremdwoerter", "mittel", "Das Backup-Skript läuft im Terminal, der Router ist online und der Server antwortet sofort."), + ("07_lang_gemischt", "lang", "Guten Morgen, Commander. Das nächtliche Backup ist um 3 Uhr durchgelaufen, es gab keine Fehler, und die Datenbank läuft mit 92 Prozent Auslastung völlig stabil."), + ("08_sehr_lang", "sehr lang", "Also, Commander, wenn ich das kurz zusammenfassen darf: heute früh war die Verbindung weg, dann lief das Update durch, danach musste ich zweimal neu starten, und jetzt sind endlich alle Dienste oben, das Gedächtnis ist warm, und wir können ganz entspannt weitermachen."), + ("09_akronyme", "mittel", "Die CPU der RX 9070 XT und die GPU laufen mit ROCm, sagt der PC über das LAN."), + ("10_zungenbrecher", "kurz", "Der Frühstücksfleischklößchenlieferant frühstückt fröhlich am frühen Freitag."), +] + +def render(text): + req = urllib.request.Request(SERVER, data=json.dumps({"text": text}).encode("utf-8"), + headers={"Content-Type": "application/json"}) + return urllib.request.urlopen(req, timeout=180).read() + +w = WhisperModel("small", device="cpu", compute_type="int8") +for name, length, text in TESTS: + wav = render(text) + path = os.path.join(OUT, name + ".wav") + open(path, "wb").write(wav) + a, sr = sf.read(io.BytesIO(wav)); a = np.asarray(a, dtype=np.float32).reshape(-1); dur = len(a) / sr + segs, _ = w.transcribe(path, language="de", beam_size=5, word_timestamps=True) + words = [x for s in segs for x in (s.words or [])] + got = " ".join(x.word.strip() for x in words) + pauses = [(words[i].word.strip(), words[i + 1].start - words[i].end) + for i in range(len(words) - 1) if (words[i + 1].start - words[i].end) >= 0.25] + f0 = librosa.yin(a, fmin=80, fmax=400, sr=sr, frame_length=1024); f0v = f0[(f0 > 90) & (f0 < 380)] + med = np.median(f0v) if f0v.size else 0; rng = (np.percentile(f0v, 90) - np.percentile(f0v, 10)) if f0v.size else 0 + print(f"\n### {name} [{length}] {dur:.1f}s Tempo {len(words)/max(dur,.01):.1f}W/s F0 {med:.0f}Hz/Spanne {rng:.0f}") + print(f"SOLL: {text}") + print(f"IST : {got}") + if pauses: + print("PAUSEN: " + ", ".join(f'„{ww}"={gg*1000:.0f}ms' for ww, gg in sorted(pauses, key=lambda t: -t[1])[:6])) +print("\n=== STRESSTEST FERTIG ===") diff --git a/client/lucy-tts/sweep_b2.py b/client/lucy-tts/sweep_b2.py new file mode 100644 index 0000000..6bcaef0 --- /dev/null +++ b/client/lucy-tts/sweep_b2.py @@ -0,0 +1,105 @@ +# -*- coding: utf-8 -*- +"""sweep_b2.py — findet den B2-Sweet-Spot auf DIESER Maschine (Ryzen 9700X, 8C/16T). +Variiert WORKERS × THREADS-pro-Worker und misst je Konfig auf einer langen, mehrsätzigen Antwort: + - wall : Gesamt-Wall-Clock (Generierung der ganzen Antwort) + - ttfb : Time-to-first-audio (Reaktionszeit = erster Satz fertig) + - audio : erzeugte Audiolänge (variiert leicht, da temp>0 stochastisch) + - RTF : wall/audio (längen-normalisiert -> fairer Durchsatz-Vergleich; <1 = schneller als Echtzeit) +Nutzt die ECHTEN pocket_server-Funktionen (_worker_init/_warmup/_gen_sentences_ordered). +Schreibt sweep_b2_result.json + eine Tabelle und nennt am Ende den Sweet Spot. +""" +import os, time, json, statistics as st +import numpy as np, librosa +from concurrent.futures import ProcessPoolExecutor +from pocket_tts import TTSModel +import pocket_server as ps + +BASE = ps.BASE +LONG = ("Guten Morgen, Commander. " + "Das nächtliche Backup ist sauber durchgelaufen und es gab keine Fehler. " + "Der Dienst läuft stabil und die Engine antwortet zügig. " + "Ich habe die Modelle vorgewärmt und die Latenz im Blick behalten. " + "Die Protokolle zeigen keine Auffälligkeiten in den letzten Stunden. " + "Wenn du möchtest, fasse ich die offenen Punkte für heute zusammen. " + "Danach kümmere ich mich um die anstehenden Updates und melde mich wieder.") + +# (workers, threads_pro_worker). Ziel: workers*threads ~ 6–8 (8 physische Kerne). +CONFIGS = [("seriell", 0, 0), ("pool", 2, 4), ("pool", 2, 3), + ("pool", 3, 2), ("pool", 3, 3), ("pool", 4, 2)] +REPS = 3 + + +def _measure(sents): + """Eine Durchführung: (wall, ttfb, audio_s) über den aktuell in STATE gesetzten Pfad.""" + t0 = time.time(); first = None; total = 0 + for i, a in enumerate(ps._gen_sentences_ordered(sents)): + if i == 0: + first = time.time() - t0 + total += a.size + return time.time() - t0, first, total / 24000.0 + + +def run_serial(reps): + m = TTSModel.load_model(language=ps.LANG, lsd_decode_steps=ps.LSD, temp=ps.TEMP, + noise_clamp=ps.NOISE_CLAMP, quantize=ps.QUANTIZE) + ref = ps._prep_ref() + try: + vs = m.get_state_for_audio_prompt(ps.VOICE_ST) + except Exception: + vs = m.get_state_for_audio_prompt(ref) + ra, _ = librosa.load(ref, sr=m.sample_rate, mono=True) + ps.STATE.clear() + ps.STATE.update(m=m, vs=vs, sr=m.sample_rate, ref_fp=ps._fingerprint(ra, m.sample_rate)) + sents = ps._split_sentences(LONG) + rows = [_measure(sents) for _ in range(reps)] + ps.STATE.clear(); del m + return rows, len(sents) + + +def run_pool(workers, threads, reps): + os.environ["LUCY_WORKER_THREADS"] = str(threads) # vom Worker beim Spawn gelesen + pool = ProcessPoolExecutor(max_workers=workers, initializer=ps._worker_init) + list(pool.map(ps._warmup, range(workers))) + ref = ps._prep_ref(); ra, _ = librosa.load(ref, sr=24000, mono=True) + ps.STATE.clear() + ps.STATE.update(sr=24000, ref_fp=ps._fingerprint(ra, 24000), pool=pool) + sents = ps._split_sentences(LONG) + rows = [_measure(sents) for _ in range(reps)] + pool.shutdown(wait=True); ps.STATE.clear() + return rows, len(sents) + + +if __name__ == "__main__": + results = [] + print(f"Text: {len(LONG)} Zeichen, REPS={REPS}\n") + print(f"{'config':>14} | {'wall':>6} {'ttfb':>6} {'audio':>6} {'RTF':>5}") + print("-" * 48) + for kind, w, t in CONFIGS: + try: + rows, nsent = (run_serial(REPS) if kind == "seriell" else run_pool(w, t, REPS)) + except Exception as e: + print(f"{kind} w{w} t{t}: FEHLER {e}") + continue + wall = st.median([r[0] for r in rows]) + ttfb = st.median([r[1] for r in rows]) + audio = st.median([r[2] for r in rows]) + rtf = wall / max(audio, 0.01) + label = "seriell(1×all)" if kind == "seriell" else f"{w}w×{t}t" + print(f"{label:>14} | {wall:6.2f} {ttfb:6.2f} {audio:6.2f} {rtf:5.2f}") + results.append(dict(label=label, kind=kind, workers=(1 if kind == "seriell" else w), + threads=t, wall=wall, ttfb=ttfb, audio=audio, rtf=rtf, sents=nsent)) + + json.dump(results, open(os.path.join(BASE, "sweep_b2_result.json"), "w"), indent=2) + + pool_rows = [r for r in results if r["kind"] == "pool"] + if pool_rows: + best_tput = min(pool_rows, key=lambda r: r["rtf"]) + best_ttfb = min(pool_rows, key=lambda r: r["ttfb"]) + # Sweet Spot: bester Durchsatz, aber TTFB nicht >20% über dem TTFB-Sieger (Reaktion zählt) + cand = [r for r in pool_rows if r["ttfb"] <= best_ttfb["ttfb"] * 1.20] + sweet = min(cand, key=lambda r: r["rtf"]) if cand else best_tput + print("\n>> bester Durchsatz :", best_tput["label"], f"(RTF {best_tput['rtf']:.2f})") + print(">> beste Reaktion :", best_ttfb["label"], f"(TTFB {best_ttfb['ttfb']:.2f}s)") + print(">> SWEET SPOT :", sweet["label"], + f"-> LUCY_WORKERS={sweet['workers']} LUCY_WORKER_THREADS={sweet['threads']}") + print("SWEEP_DONE") diff --git a/client/lucy-tts/sweep_quality.py b/client/lucy-tts/sweep_quality.py new file mode 100644 index 0000000..d046428 --- /dev/null +++ b/client/lucy-tts/sweep_quality.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +"""Qualitäts-Sweep: noise_clamp (nie getestet, Hypothese: dämpft Artefakte+Kollaps) × lsd, temp 0.9. +Produktions-äquivalente Verarbeitung (LEAD + cleanup v4 wie der Server) -> faires A/B gegen lucy_final.""" +import os, time, numpy as np, soundfile as sf, librosa +from pocket_tts import TTSModel + +BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" +OUT = r"C:\Users\TobisPC\Desktop\lucy_quality_sweep"; os.makedirs(OUT, exist_ok=True) +src, _ = librosa.load(os.path.join(BASE, "ref.mp3"), sr=24000, mono=True) +srt, _ = librosa.effects.trim(src, top_db=30); ref = os.path.join(BASE, "ref.wav") +sf.write(ref, srt[:int(18*24000)], 24000) +LEAD, TARGET_RMS = "Tja. ", 0.09 +SENT = {"kurz":"Hallo Commander, ich höre dich.", + "mittel":"Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", + "lang":"Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft."} + +def crop_lead(a, sr): + iv = librosa.effects.split(a, top_db=35) + if len(iv) >= 2: + cut = max(iv[0][1], iv[1][0] - int(0.06*sr)); a = a[cut:] + return a +def cleanup(a, sr): + a = np.asarray(a, dtype=np.float32).reshape(-1) + if a.size == 0: return a + a = crop_lead(a, sr) + rev,_ = librosa.effects.trim(a[::-1], top_db=45); a = rev[::-1] if rev.size else a + rms = float(np.sqrt(np.mean(a**2))) or 1e-9; a = a*(TARGET_RMS/rms) + peak = float(np.max(np.abs(a))) + if peak > 0.9: a = a*(0.9/peak) + fi = min(int(0.008*sr), a.size//2) + if fi>0: a[:fi]*=np.linspace(0.,1.,fi,dtype=np.float32); a[-fi:]*=np.linspace(1.,0.,fi,dtype=np.float32) + pad = np.zeros(int(0.08*sr), dtype=np.float32) + return np.concatenate([pad, a, pad]) + +# (tag, lsd, noise_clamp) +COMBOS = [ + ("A_baseline_lsd6_ncNone", 6, None), + ("B_lsd6_nc2", 6, 2.0), + ("C_lsd6_nc3", 6, 3.0), + ("D_lsd10_nc3", 10, 3.0), +] +for tag, lsd, nc in COMBOS: + t0 = time.time() + m = TTSModel.load_model(language="german_24l", lsd_decode_steps=lsd, temp=0.9, noise_clamp=nc) + vs = m.get_state_for_audio_prompt(ref); sr = m.sample_rate + print(f"== {tag} (load {time.time()-t0:.1f}s) ==", flush=True) + for name, text in SENT.items(): + t0 = time.time(); a = m.generate_audio(vs, LEAD+text, frames_after_eos=4); dt = time.time()-t0 + a = a.numpy() if hasattr(a,"numpy") else np.asarray(a) + a = cleanup(a, sr); secs = a.size/sr + sf.write(os.path.join(OUT, f"{tag}_{name}.wav"), a, sr) + print(f" [{name:6}] gen={dt:4.1f}s audio={secs:4.1f}s RTF={dt/max(secs,0.01):.2f}", flush=True) +print("SWEEP_DONE", flush=True) diff --git a/client/lucy-tts/sweep_quality2.py b/client/lucy-tts/sweep_quality2.py new file mode 100644 index 0000000..f757a61 --- /dev/null +++ b/client/lucy-tts/sweep_quality2.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +"""Sweep 2 (Feinschliff): lsd 10 (glättet Rauschen) × noise_clamp 2/2.5/3, temp 0.9. +Ziel: sauberes 'Commander' (nicht erzwungen, = niedrigeres nc) + wenig Rauschen (= höheres lsd).""" +import os, time, numpy as np, soundfile as sf, librosa +from pocket_tts import TTSModel + +BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" +OUT = r"C:\Users\TobisPC\Desktop\lucy_sweep2"; os.makedirs(OUT, exist_ok=True) +src, _ = librosa.load(os.path.join(BASE, "ref.mp3"), sr=24000, mono=True) +srt, _ = librosa.effects.trim(src, top_db=30); ref = os.path.join(BASE, "ref.wav") +sf.write(ref, srt[:int(18*24000)], 24000) +LEAD, TARGET_RMS = "Tja. ", 0.09 +SENT = {"kurz":"Hallo Commander, ich höre dich.", + "mittel":"Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", + "lang":"Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft."} + +def crop_lead(a, sr): + iv = librosa.effects.split(a, top_db=35) + if len(iv) >= 2: a = a[max(iv[0][1], iv[1][0]-int(0.06*sr)):] + return a +def cleanup(a, sr): + a = np.asarray(a, dtype=np.float32).reshape(-1) + if a.size == 0: return a + a = crop_lead(a, sr) + rev,_ = librosa.effects.trim(a[::-1], top_db=45); a = rev[::-1] if rev.size else a + rms = float(np.sqrt(np.mean(a**2))) or 1e-9; a = a*(TARGET_RMS/rms) + peak = float(np.max(np.abs(a))) + if peak > 0.9: a = a*(0.9/peak) + fi = min(int(0.008*sr), a.size//2) + if fi>0: a[:fi]*=np.linspace(0.,1.,fi,dtype=np.float32); a[-fi:]*=np.linspace(1.,0.,fi,dtype=np.float32) + return np.concatenate([np.zeros(int(0.08*sr),dtype=np.float32), a, np.zeros(int(0.08*sr),dtype=np.float32)]) + +for nc in [2.0, 2.5, 3.0]: + tag = f"lsd10_nc{str(nc).replace('.','p')}" + t0 = time.time() + m = TTSModel.load_model(language="german_24l", lsd_decode_steps=10, temp=0.9, noise_clamp=nc) + vs = m.get_state_for_audio_prompt(ref); sr = m.sample_rate + print(f"== {tag} (load {time.time()-t0:.1f}s) ==", flush=True) + for name, text in SENT.items(): + t0 = time.time(); a = m.generate_audio(vs, LEAD+text, frames_after_eos=4); dt = time.time()-t0 + a = a.numpy() if hasattr(a,"numpy") else np.asarray(a) + a = cleanup(a, sr); secs = a.size/sr + sf.write(os.path.join(OUT, f"{tag}_{name}.wav"), a, sr) + print(f" [{name:6}] gen={dt:4.1f}s audio={secs:4.1f}s RTF={dt/max(secs,0.01):.2f}", flush=True) +print("SWEEP2_DONE", flush=True) diff --git a/client/lucy-tts/test_text_norm.py b/client/lucy-tts/test_text_norm.py new file mode 100644 index 0000000..9db52f6 --- /dev/null +++ b/client/lucy-tts/test_text_norm.py @@ -0,0 +1,28 @@ +"""Prüft normalize_numbers: Einheiten/Uhrzeiten/Dezimalzahlen verbalisieren, Modellnummern schützen.""" +from text_norm import normalize_numbers as N + +def check(name, text, must_have=(), must_not=()): + out = N(text) + ok = all(h in out for h in must_have) and all(x not in out for x in must_not) + print(f"{'PASS' if ok else 'FAIL'} {name}: \"{text}\" -> \"{out}\"") + return ok + +allok = True +allok &= check("Uhrzeit", "Es ist 18:01 Uhr.", must_have=["achtzehn Uhr", "eins"], must_not=[":", "18:"]) +allok &= check("Uhrzeit :00", "Um 18:00.", must_have=["achtzehn Uhr"], must_not=[":"]) +allok &= check("Uhrzeit HH:MM", "Treffen um 9:30 Uhr.", must_have=["neun Uhr", "dreißig"], must_not=[":"]) +allok &= check("Einheit GB verbalisiert", "Sie hat 16 GB Speicher.", must_have=["sechzehn GB"], must_not=[" 16 "]) +allok &= check("Einheit TB + GB", "8 TB und 32 GB RAM.", must_have=["acht TB", "zweiunddreißig GB", "RAM"]) +allok &= check("Dezimal verbalisiert", "Läuft mit 4.5 GHz.", must_have=["vier Komma", "fünf", "GHz"], must_not=["4.5"]) +allok &= check("Modellnummer geschützt", "Die RX 9070 XT ist schnell.", must_have=["9070", "XT"], must_not=["neuntausend"]) +allok &= check("Version geschützt", "Qwen3.6 nutzt Version 2.", must_have=["Qwen3.6", "zwei"], must_not=["Qwen3.sechs"]) +allok &= check("Modell H100 geschützt", "Das braucht eine H100.", must_have=["H100"]) +allok &= check("Zahl im Text", "Ich habe 5 Äpfel.", must_have=["fünf", "Äpfel"], must_not=[" 5 "]) +allok &= check("Prozent", "Das sind 50 Prozent.", must_have=["fünfzig Prozent"]) +allok &= check("Grad", "Es sind 25 Grad.", must_have=["fünfundzwanzig Grad"]) +allok &= check("Jahr", "Im Jahr 2026.", must_have=["zweitausend"], must_not=["2026"]) +allok &= check("Datum-Ordinal", "Am 3. Januar.", must_have=["Januar"], must_not=["3. Januar", " 3 "]) +allok &= check("große ID roh", "Fehler 123456.", must_have=["123456"]) + +print("\nALLE TESTS GRÜN" if allok else "\nES GAB FEHLER") +raise SystemExit(0 if allok else 1) diff --git a/client/lucy-tts/text_norm.py b/client/lucy-tts/text_norm.py new file mode 100644 index 0000000..6795630 --- /dev/null +++ b/client/lucy-tts/text_norm.py @@ -0,0 +1,120 @@ +"""Deutsche Zahlen-/Uhrzeit-Normalisierung für Lucys Stimme (num2words). + +Eigenständig (nur re + num2words, KEIN torch/pocket_tts-Import), damit schnell testbar und von +pocket_server importierbar. + +Kernidee: Zahlen im Fließtext verbalisieren ("18:01" -> "achtzehn Uhr eins", "16 GB" -> "sechzehn +GB", "4.5" -> "vier Komma fünf"), aber Modell-/Versionsnummern SCHÜTZEN ("RX 9070 XT", "Qwen3.6", +"H100" bleiben roh — die soll man nicht als Kardinalzahl lesen). Abschaltbar via LUCY_NUM_NORM=0. +""" +import os +import re + +try: + from num2words import num2words as _n2w +except Exception: # Lib fehlt -> No-op (Stimme läuft trotzdem) + _n2w = None + +# AUS per Default (2026-07-01, empirisch via Whisper-Rücktranskription verifiziert): Pocket german_24l +# spricht ROHE Ziffern ("21 Uhr 40", "16 GB", "4.5 GHz", "9:30") sauber. Vorverbalisierte deutsche +# Kompositzahlen ("einundzwanzig") ZERBRICHT das Modell zu Kauderwelsch ("ein Mund", "ein Aus-20"). +# Also NICHT verbalisieren. Mit LUCY_NUM_NORM=1 wieder anschaltbar (falls je ein Modell es braucht). +NUM_NORM = os.environ.get("LUCY_NUM_NORM", "0") not in ("0", "false", "False") + +_MONTHS = "Januar Februar März April Mai Juni Juli August September Oktober November Dezember".split() +_MONTH_RX = "|".join(_MONTHS) +# FULLY-uppercase 2+-Einheiten, neben denen Zahlen VERBALISIERT werden (sechzehn GB) — im Gegensatz +# zu Modell-Akronymen (RX/XT/RTX), wo die Ziffern roh bleiben (RX 9070 XT). Gemischt-Case-Einheiten +# (GHz/MHz/kg/km/Grad/Prozent) werden von der Akronym-Regel eh nicht erfasst -> dort wird ohnehin verbalisiert. +_CAPS_UNITS = {"GB", "TB", "MB", "KB", "PB", "EB", "KW", "MW"} + + +# Garble-Kandidaten (Whisper-verifiziert): Pocket german_24l kann diese Akronyme/Codes NICHT sauber +# sprechen ("ROCm"->"AOC HM", "UTC"->Kauderwelsch) -> Ersatz durch gesprochene/buchstabierte Form. +# Erweiterbar via LUCY_ACRONYM_EXTRA="ABC=A B C,XYZ=..." (neue Fälle findet transcribe.py). +_ACRONYM_FIX = { + "ROCm": "Rockem", "UTC": "U T C", "GMT": "G M T", + "CEST": "C E S T", "CET": "C E T", "MESZ": "M E S Z", "MEZ": "M E Z", + "NVMe": "N V M E", "PCIe": "P C I E", +} + +def _build_acr(): + m = dict(_ACRONYM_FIX) + for pair in os.environ.get("LUCY_ACRONYM_EXTRA", "").split(","): + if "=" in pair: + k, v = pair.split("=", 1) + if k.strip(): + m[k.strip()] = v.strip() + return m + +_ACR_MAP = _build_acr() +_ACR_RX = re.compile(r"\b(" + "|".join(re.escape(k) for k in sorted(_ACR_MAP, key=len, reverse=True)) + r")\b") if _ACR_MAP else None + +ACR_ON = os.environ.get("LUCY_ACRONYM", "1") not in ("0", "false", "False") # A/B-Abschaltung + +def fix_acronyms(text: str) -> str: + """Garble-anfällige Akronyme durch gesprochene Form ersetzen (ROCm -> Rockem, UTC -> U T C).""" + return _ACR_RX.sub(lambda m: _ACR_MAP[m.group(0)], text) if (_ACR_RX and ACR_ON) else text + + +def _card(v) -> str: + try: + return _n2w(int(v), lang="de") + except Exception: + return str(v) + + +def normalize_numbers(text: str) -> str: + if not NUM_NORM or _n2w is None: + return text + + masks: list[str] = [] + def _mask(s: str) -> str: + masks.append(s) + return f"\x00{len(masks) - 1}\x00" + + # 1) Uhrzeiten: "18:01 Uhr"/"18:01" -> "18 Uhr 01", "18:00" -> "18 Uhr" (Ziffern verbalisiert Schritt 6) + text = re.sub(r"\b(\d{1,2}):00(\s*Uhr)?\b", r"\1 Uhr", text) + text = re.sub(r"\b(\d{1,2}):(\d{2})\s*Uhr\b", r"\1 Uhr \2", text) + text = re.sub(r"\b(\d{1,2}):(\d{2})\b", r"\1 Uhr \2", text) + + # 2) Datums-Ordinalzahlen: "3. Januar" -> "dritter Januar" + def _ord(m): + try: + return f"{_n2w(int(m.group(1)), to='ordinal', lang='de')} {m.group(2)}" + except Exception: + return m.group(0) + text = re.sub(rf"\b(\d{{1,2}})\.\s+({_MONTH_RX})\b", _ord, text) + + # 3) Modell-/Versions-Token (Buchstabe UND Ziffer, evtl. mit Punkten: Qwen3.6, H100, v2.1, RTX4090) + # -> ganzes Token maskieren (nie verbalisieren). Satz-Endpunkt/-Komma bleibt draußen. + def _mask_model(m): + tok = m.group(0); trail = "" + while tok and tok[-1] in ".,": + trail = tok[-1] + trail; tok = tok[:-1] + if re.search(r"[A-Za-zÄÖÜäöü]", tok) and re.search(r"\d", tok): + return _mask(tok) + trail + return m.group(0) + text = re.sub(r"[A-Za-zÄÖÜäöü0-9]+(?:[.,][A-Za-zÄÖÜäöü0-9]+)*", _mask_model, text) + + # 4) Standalone-Dezimalzahl (nur Ziffern, kein Buchstabe): "4.5" -> "vier Komma fünf" + # (Nachkommastellen ziffernweise, wie im Deutschen üblich). + def _dec(m): + return f"{_card(m.group(1))} Komma {' '.join(_card(d) for d in m.group(2))}" + text = re.sub(r"(? verbalisieren; Modell-Akronym (RX/XT) -> roh maskieren. + def _by_ctx(num, acr): + return num if acr.upper() in _CAPS_UNITS else _mask(num) + text = re.sub(r"\b([A-ZÄÖÜ]{2,})\s+(\d{1,6})\b", lambda m: f"{m.group(1)} {_by_ctx(m.group(2), m.group(1))}", text) + text = re.sub(r"\b(\d{1,6})\s+([A-ZÄÖÜ]{2,})\b", lambda m: f"{_by_ctx(m.group(1), m.group(2))} {m.group(2)}", text) + + # 6) verbleibende reine Ganzzahlen (0..9999) verbalisieren; größere roh lassen (IDs/Codes) + def _c(m): + v = int(m.group(0)) + return _n2w(v, lang="de") if v <= 9999 else m.group(0) + text = re.sub(r"(? 1 else r"C:\Users\TobisPC\Desktop\lucy_pocket_tune" +w = WhisperModel("small", device="cpu", compute_type="int8") +for p in sorted(glob.glob(os.path.join(DIR, "*.wav"))): + a, sr = sf.read(p) + seg, _ = w.transcribe(p, language="de", beam_size=5) + txt = " ".join(s.text for s in seg).strip() + print(f"[{os.path.basename(p)}] ({len(a)/sr:.1f}s)") + print(f" HÖRT WHISPER: {txt}\n") diff --git a/client/lucy-tts/ttfb_test.py b/client/lucy-tts/ttfb_test.py new file mode 100644 index 0000000..ff2910d --- /dev/null +++ b/client/lucy-tts/ttfb_test.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +"""ttfb_test.py — misst die Stream-TTFB im SERIELLEN Pfad mit kurzem erstem Chunk an/aus. +Ein Modell-Load, dann je Modus 3 Durchläufe -> Median. Belegt, ob keep_first_short Lucys +Sprechbeginn beschleunigt, ohne den Rest zu verschlechtern. +""" +import time, statistics as st +import numpy as np, librosa +from pocket_tts import TTSModel +import pocket_server as ps + +LONG = ("Guten Morgen, Commander. " + "Das nächtliche Backup ist sauber durchgelaufen und es gab keine Fehler. " + "Der Dienst läuft stabil und die Engine antwortet zügig. " + "Ich habe die Modelle vorgewärmt und die Latenz im Blick behalten. " + "Die Protokolle zeigen keine Auffälligkeiten in den letzten Stunden. " + "Wenn du möchtest, fasse ich die offenen Punkte für heute zusammen. " + "Danach kümmere ich mich um die anstehenden Updates und melde mich wieder.") + +m = TTSModel.load_model(language=ps.LANG, lsd_decode_steps=ps.LSD, temp=ps.TEMP, + noise_clamp=ps.NOISE_CLAMP, quantize=ps.QUANTIZE) +ref = ps._prep_ref() +try: + vs = m.get_state_for_audio_prompt(ps.VOICE_ST) +except Exception: + vs = m.get_state_for_audio_prompt(ref) +ra, _ = librosa.load(ref, sr=m.sample_rate, mono=True) +ps.STATE.clear() +ps.STATE.update(m=m, vs=vs, sr=m.sample_rate, ref_fp=ps._fingerprint(ra, m.sample_rate)) + + +def measure(keep_first): + sents = ps._split_sentences(LONG, keep_first_short=keep_first) + t0 = time.time(); first = None; total = 0 + for i, a in enumerate(ps._gen_sentences_ordered(sents)): + if i == 0: + first = time.time() - t0 + total += a.size + return first, time.time() - t0, total / 24000.0, len(sents), sents[0] + + +if __name__ == "__main__": + for keep in (False, True): + ttfbs, walls = [], [] + n = s0 = None + for _ in range(3): + f, w, au, n, s0 = measure(keep) + ttfbs.append(f); walls.append(w) + print(f"keep_first_short={str(keep):5} | TTFB={st.median(ttfbs):4.2f}s wall={st.median(walls):5.2f}s " + f"chunks={n} erster='{s0[:38]}'") + print("TTFB_DONE") diff --git a/client/lucy-tts/tune_front_loud.py b/client/lucy-tts/tune_front_loud.py new file mode 100644 index 0000000..0f5f92b --- /dev/null +++ b/client/lucy-tts/tune_front_loud.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- +"""Fix: (1) 'vorne abgeschnitten' = Modell startet mid-Phonem -> Lead-Wort voranstellen, +in flow generieren, dann in der STILLE-LÜCKE davor schneiden (voller Onset bleibt). +(2) 'zu laut' = RMS-Normalisierung auf Zielpegel statt Peak 0.95.""" +import os, numpy as np, soundfile as sf, librosa +from pocket_tts import TTSModel +from faster_whisper import WhisperModel + +BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" +OUT = r"C:\Users\TobisPC\Desktop\lucy_front_loud"; os.makedirs(OUT, exist_ok=True) +src, _ = librosa.load(os.path.join(BASE, "ref.mp3"), sr=24000, mono=True) +srt, _ = librosa.effects.trim(src, top_db=30); ref = os.path.join(BASE, "ref.wav") +sf.write(ref, srt[:int(18*24000)], 24000) + +SENT = { + "kurz": "Hallo Commander, ich höre dich.", + "lang": "Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft.", +} +LEAD = "Tja. " # Wegwerf-Lead -> erzeugt natürlichen Onset fürs echte erste Wort + +def drop_tail_blip(a, sr): + for _ in range(3): + iv = librosa.effects.split(a, top_db=35) + if len(iv) < 2: break + srms = float(np.median([np.sqrt(np.mean(a[s:e]**2)) for s,e in iv[:-1]])) + s,e = iv[-1]; dur=(e-s)/sr; rms=float(np.sqrt(np.mean(a[s:e]**2))); gap=(s-iv[-2][1])/sr + if gap>0.35 and rms<0.30*srms and dur<0.35: a = a[:iv[-2][1]] + else: break + return a + +def crop_lead(a, sr): + """Schneide in der Lücke NACH dem Lead-Wort -> echtes 1. Wort voll erhalten.""" + iv = librosa.effects.split(a, top_db=35) + if len(iv) >= 2: + # Ende des 1. (Lead-)Segments + kleiner Sicherheitsabstand in die Lücke + cut = iv[0][1] + int(0.03*sr) + nxt = iv[1][0] + cut = min(cut, max(iv[0][1], nxt - int(0.04*sr))) # mind. 40ms Stille vor echtem Wort lassen + a = a[cut:] + return a + +def finalize(a, sr, target_rms, peak_cap=0.9, front_trim=False): + a = np.asarray(a, dtype=np.float32).reshape(-1) + if front_trim: + yt,_ = librosa.effects.trim(a, top_db=45); a = yt if yt.size else a + else: + # nur HINTEN trimmen (vorne unangetastet lassen) + rev,_ = librosa.effects.trim(a[::-1], top_db=45); a = rev[::-1] if rev.size else a + # RMS-Normalisierung auf Zielpegel + rms = float(np.sqrt(np.mean(a**2))) or 1e-9 + a = a * (target_rms / rms) + peak = float(np.max(np.abs(a))) + if peak > peak_cap: a = a * (peak_cap / peak) # Sicherheits-Clamp + fi = min(int(0.008*sr), a.size//2) + if fi>0: + a[:fi]*=np.linspace(0.,1.,fi,dtype=np.float32); a[-fi:]*=np.linspace(1.,0.,fi,dtype=np.float32) + pad = np.zeros(int(0.08*sr), dtype=np.float32) + return np.concatenate([pad, a, pad]) + +m = TTSModel.load_model(language="german_24l", lsd_decode_steps=6, temp=0.9) +vs = m.get_state_for_audio_prompt(ref); sr = m.sample_rate +w = WhisperModel("small", device="cpu", compute_type="int8") + +for name, text in SENT.items(): + # Onset-Fix-Roh: mit Lead generieren, Tail-Blip weg, Lead wegschneiden + raw = m.generate_audio(vs, LEAD + text, frames_after_eos=4) + raw = raw.numpy() if hasattr(raw,"numpy") else np.asarray(raw) + raw = np.asarray(raw, dtype=np.float32).reshape(-1) + raw = drop_tail_blip(raw, sr) + cropped = crop_lead(raw, sr) + for tr in [0.12, 0.09, 0.06]: + out = finalize(cropped, sr, tr, front_trim=False) + sf.write(os.path.join(OUT, f"{name}_onset_rms{int(tr*100):02d}.wav"), out, sr) + # Whisper-Check: Output darf NICHT mit Lead beginnen + sf.write(os.path.join(OUT, f"_chk_{name}.wav"), finalize(cropped, sr, 0.09), sr) + seg,_ = w.transcribe(os.path.join(OUT, f"_chk_{name}.wav"), language="de", beam_size=5) + txt = " ".join(s.text for s in seg).strip() + print(f"[{name}] Whisper-Start: {txt[:55]!r}", flush=True) +print("FRONT_LOUD_DONE", flush=True) diff --git a/client/lucy-tts/tune_lsd.py b/client/lucy-tts/tune_lsd.py new file mode 100644 index 0000000..0307ce7 --- /dev/null +++ b/client/lucy-tts/tune_lsd.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +import os, time, glob, numpy as np, soundfile as sf, librosa +from pocket_tts import TTSModel + +BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" +OUT = os.path.join(BASE, "out_tune"); os.makedirs(OUT, exist_ok=True) +y, _ = librosa.load(os.path.join(BASE, "ref.mp3"), sr=24000, mono=True) +yt, _ = librosa.effects.trim(y, top_db=30); ref = os.path.join(BASE, "ref.wav") +sf.write(ref, yt[:int(18*24000)], 24000) + +SENT = { + "kurz": "Hallo Commander, ich höre dich.", + "mittel":"Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", + "lang": "Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft.", +} +def light_trim(a, sr): + a = np.asarray(a, dtype=np.float32).reshape(-1) + yt, _ = librosa.effects.trim(a, top_db=30) + return yt if yt.size else a + +for lsd in [2, 4, 8]: + t0 = time.time() + m = TTSModel.load_model(language="german_24l", lsd_decode_steps=lsd) + vs = m.get_state_for_audio_prompt(ref) + print(f"== lsd={lsd} (load {time.time()-t0:.1f}s) ==", flush=True) + for name, text in SENT.items(): + t0 = time.time(); audio = m.generate_audio(vs, text); dt = time.time()-t0 + a = audio.numpy() if hasattr(audio, "numpy") else np.asarray(audio) + a = light_trim(a, m.sample_rate) + secs = a.size / m.sample_rate + sf.write(os.path.join(OUT, f"lsd{lsd}_{name}.wav"), a, m.sample_rate) + print(f" [{name:6}] gen={dt:5.2f}s audio={secs:5.2f}s RTF={dt/max(secs,0.01):.2f}", flush=True) +print("TUNE_DONE", flush=True) diff --git a/client/lucy-tts/tune_lsd_v2.py b/client/lucy-tts/tune_lsd_v2.py new file mode 100644 index 0000000..7538954 --- /dev/null +++ b/client/lucy-tts/tune_lsd_v2.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +"""Sweep v2: lsd 4/5/6 + FIX gegen Vorne/Hinten-Abschneiden & Clipping. +- peak-normalize auf 0.95 (killt PCM-16-Clipping/Distortion; roh war peak bis 1.56) +- KEIN aggressiver Front-Trim mehr (Modell startet bei 0ms Stille -> Trim fraß 1. Phonem) +- nur tiefe Stille sanft trimmen (top_db=45), dann feste 90ms-Pause vorne+hinten (Atem) +- frames_after_eos=4 (kurze Sätze bekamen sonst 0ms Schwanz = abgeschnitten) +""" +import os, time, numpy as np, soundfile as sf, librosa +from pocket_tts import TTSModel + +BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" +OUT = r"C:\Users\TobisPC\Desktop\lucy_lsd_v2"; os.makedirs(OUT, exist_ok=True) +y, _ = librosa.load(os.path.join(BASE, "ref.mp3"), sr=24000, mono=True) +yt, _ = librosa.effects.trim(y, top_db=30); ref = os.path.join(BASE, "ref.wav") +sf.write(ref, yt[:int(18*24000)], 24000) + +SENT = { + "kurz": "Hallo Commander, ich höre dich.", + "mittel":"Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", + "lang": "Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft.", +} + +def cleanup_v2(a, sr): + a = np.asarray(a, dtype=np.float32).reshape(-1) + if a.size == 0: return a + # 1) Peak-Normalisierung gegen Clipping/Distortion + peak = float(np.max(np.abs(a))) + if peak > 0: a = a * (0.95 / peak) + # 2) nur TIEFE Stille sanft wegtrimmen (top_db=45 = wenig aggressiv, lässt weiche Onsets) + yt, _ = librosa.effects.trim(a, top_db=45) + a = yt if yt.size else a + # 3) kurze 10ms-Fades an den echten Audiokanten (gegen Klicks) + fi = min(int(0.01 * sr), a.size // 2) + if fi > 0: + a[:fi] *= np.linspace(0.0, 1.0, fi, dtype=np.float32) + a[-fi:] *= np.linspace(1.0, 0.0, fi, dtype=np.float32) + # 4) feste 90ms Atem-Pause vorne+hinten (kein abruptes Einsetzen/Abschneiden) + pad = np.zeros(int(0.09 * sr), dtype=np.float32) + return np.concatenate([pad, a, pad]) + +for lsd in [4, 5, 6]: + t0 = time.time() + m = TTSModel.load_model(language="german_24l", lsd_decode_steps=lsd) + vs = m.get_state_for_audio_prompt(ref) + sr = m.sample_rate + print(f"== lsd={lsd} (load {time.time()-t0:.1f}s) ==", flush=True) + for name, text in SENT.items(): + t0 = time.time() + audio = m.generate_audio(vs, text, frames_after_eos=4) + dt = time.time() - t0 + a = audio.numpy() if hasattr(audio, "numpy") else np.asarray(audio) + a = cleanup_v2(a, sr) + secs = a.size / sr + sf.write(os.path.join(OUT, f"lsd{lsd}_{name}.wav"), a, sr) + print(f" [{name:6}] gen={dt:5.2f}s audio={secs:5.2f}s RTF={dt/max(secs,0.01):.2f} peak={np.abs(a).max():.3f}", flush=True) +print("TUNE_V2_DONE", flush=True) diff --git a/client/lucy-tts/tune_natural.py b/client/lucy-tts/tune_natural.py new file mode 100644 index 0000000..b3b5c39 --- /dev/null +++ b/client/lucy-tts/tune_natural.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +"""Naturalness-Sweep gegen 'Roboter/abgehackt': temperature, lsd hoch, + 2 Referenz-Fenster. +Wörter sind laut Whisper alle da -> Problem ist Prosodie/Timbre, nicht Content.""" +import os, time, numpy as np, soundfile as sf, librosa +from pocket_tts import TTSModel + +BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" +OUT = r"C:\Users\TobisPC\Desktop\lucy_natural"; os.makedirs(OUT, exist_ok=True) + +# Zwei Referenz-Fenster aus der EL-Saber-MP3 +src, _ = librosa.load(os.path.join(BASE, "ref.mp3"), sr=24000, mono=True) +srt, _ = librosa.effects.trim(src, top_db=30) +ref18 = os.path.join(BASE, "ref.wav") # aktuell: erste 18s +sf.write(ref18, srt[:int(18*24000)], 24000) +refC = os.path.join(BASE, "ref_C.wav") # XTTS-Liebling: Sek 18..27 (9s) +segC = src[int(18*24000):int(27*24000)] +segCt, _ = librosa.effects.trim(segC, top_db=30) +sf.write(refC, segCt, 24000) + +SENT = { + "kurz": "Hallo Commander, ich höre dich.", + "mittel":"Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", +} + +def cleanup_v2(a, sr): + a = np.asarray(a, dtype=np.float32).reshape(-1) + if a.size == 0: return a + peak = float(np.max(np.abs(a))) + if peak > 0: a = a * (0.95 / peak) + yt, _ = librosa.effects.trim(a, top_db=45); a = yt if yt.size else a + fi = min(int(0.01*sr), a.size//2) + if fi > 0: + a[:fi] *= np.linspace(0.,1.,fi,dtype=np.float32) + a[-fi:] *= np.linspace(1.,0.,fi,dtype=np.float32) + pad = np.zeros(int(0.09*sr), dtype=np.float32) + return np.concatenate([pad, a, pad]) + +# (tag, lsd, temp, ref) +COMBOS = [ + ("A_lsd6_t070_ref18", 6, 0.70, ref18), + ("B_lsd6_t090_ref18", 6, 0.90, ref18), + ("C_lsd6_t105_ref18", 6, 1.05, ref18), + ("D_lsd8_t090_ref18", 8, 0.90, ref18), + ("E_lsd12_t090_ref18",12, 0.90, ref18), + ("F_lsd6_t090_refC", 6, 0.90, refC), +] + +for tag, lsd, temp, ref in COMBOS: + t0 = time.time() + m = TTSModel.load_model(language="german_24l", lsd_decode_steps=lsd, temp=temp) + vs = m.get_state_for_audio_prompt(ref) + sr = m.sample_rate + print(f"== {tag} (load {time.time()-t0:.1f}s) ==", flush=True) + for name, text in SENT.items(): + t0 = time.time() + audio = m.generate_audio(vs, text, frames_after_eos=4); dt = time.time()-t0 + a = audio.numpy() if hasattr(audio,"numpy") else np.asarray(audio) + a = cleanup_v2(a, sr); secs = a.size/sr + sf.write(os.path.join(OUT, f"{tag}_{name}.wav"), a, sr) + print(f" [{name:6}] gen={dt:5.2f}s audio={secs:5.2f}s RTF={dt/max(secs,0.01):.2f}", flush=True) +print("NATURAL_DONE", flush=True) diff --git a/client/lucy-tts/tune_tailfix.py b/client/lucy-tts/tune_tailfix.py new file mode 100644 index 0000000..62f8a3e --- /dev/null +++ b/client/lucy-tts/tune_tailfix.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +"""Tail-Blip-Killer gegen das End-'taa' (isolierter, leiser Hall nach großer Lücke). +Verifiziert auf kurz/mittel/lang @ lsd6/t0.9: Blip weg, echte Endungen unangetastet.""" +import os, numpy as np, soundfile as sf, librosa +from pocket_tts import TTSModel + +BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" +OUT = r"C:\Users\TobisPC\Desktop\lucy_tailfix"; os.makedirs(OUT, exist_ok=True) +src, _ = librosa.load(os.path.join(BASE, "ref.mp3"), sr=24000, mono=True) +srt, _ = librosa.effects.trim(src, top_db=30); ref = os.path.join(BASE, "ref.wav") +sf.write(ref, srt[:int(18*24000)], 24000) + +SENT = { + "kurz": "Hallo Commander, ich höre dich.", + "mittel":"Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", + "lang": "Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft.", +} + +def drop_tail_blip(a, sr): + """Entferne isolierten, leisen/kurzen Schwanz-Blip (Modell-Halluzination).""" + for _ in range(3): # bis zu 3 Blips hintereinander + iv = librosa.effects.split(a, top_db=35) + if len(iv) < 2: + break + speech_rms = float(np.median([np.sqrt(np.mean(a[s:e]**2)) for s, e in iv[:-1]])) + s, e = iv[-1] + last_dur = (e - s) / sr + last_rms = float(np.sqrt(np.mean(a[s:e]**2))) + gap = (s - iv[-2][1]) / sr + # isoliert (große Lücke) UND (kurz ODER deutlich leiser als Sprache) -> Halluzination + if gap > 0.30 and (last_dur < 0.30 or last_rms < 0.45 * speech_rms): + a = a[: iv[-2][1]] + else: + break + return a + +def cleanup_v3(a, sr): + a = np.asarray(a, dtype=np.float32).reshape(-1) + if a.size == 0: return a + a = drop_tail_blip(a, sr) # NEU: End-'taa' weg + peak = float(np.max(np.abs(a))) + if peak > 0: a = a * (0.95 / peak) + yt, _ = librosa.effects.trim(a, top_db=45); a = yt if yt.size else a + fi = min(int(0.01*sr), a.size//2) + if fi > 0: + a[:fi] *= np.linspace(0.,1.,fi,dtype=np.float32); a[-fi:] *= np.linspace(1.,0.,fi,dtype=np.float32) + pad = np.zeros(int(0.09*sr), dtype=np.float32) + return np.concatenate([pad, a, pad]) + +m = TTSModel.load_model(language="german_24l", lsd_decode_steps=6, temp=0.9) +vs = m.get_state_for_audio_prompt(ref); sr = m.sample_rate +for name, text in SENT.items(): + raw = m.generate_audio(vs, text, frames_after_eos=4) + raw = raw.numpy() if hasattr(raw,"numpy") else np.asarray(raw) + raw = np.asarray(raw, dtype=np.float32).reshape(-1) + fixed = cleanup_v3(raw, sr) + sf.write(os.path.join(OUT, f"t090_{name}.wav"), fixed, sr) + # Verifikations-Log: letzte Segmente vorher/nachher + iv0 = librosa.effects.split(raw, top_db=35) + print(f"[{name:6}] raw_dur={raw.size/sr:.2f}s -> fixed_dur={fixed.size/sr:.2f}s raw_segmente={len(iv0)}", flush=True) + if len(iv0): + s,e = iv0[-1]; print(f" raw letztes Segment: {s/sr:.2f}..{e/sr:.2f}s rms={np.sqrt(np.mean(raw[s:e]**2)):.3f}", flush=True) +print("TAILFIX_DONE", flush=True) diff --git a/client/lucy-tts/tune_temp_final.py b/client/lucy-tts/tune_temp_final.py new file mode 100644 index 0000000..0adf580 --- /dev/null +++ b/client/lucy-tts/tune_temp_final.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +"""Letzter Schliff: lsd6 + ref18, temp 0.70 vs 0.90 auf ALLEN Längen (inkl. lang).""" +import os, time, numpy as np, soundfile as sf, librosa +from pocket_tts import TTSModel + +BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" +OUT = r"C:\Users\TobisPC\Desktop\lucy_temp_final"; os.makedirs(OUT, exist_ok=True) +src, _ = librosa.load(os.path.join(BASE, "ref.mp3"), sr=24000, mono=True) +srt, _ = librosa.effects.trim(src, top_db=30); ref = os.path.join(BASE, "ref.wav") +sf.write(ref, srt[:int(18*24000)], 24000) + +SENT = { + "kurz": "Hallo Commander, ich höre dich.", + "mittel":"Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", + "lang": "Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft.", +} +def cleanup_v2(a, sr): + a = np.asarray(a, dtype=np.float32).reshape(-1) + if a.size == 0: return a + peak = float(np.max(np.abs(a))) + if peak > 0: a = a*(0.95/peak) + yt,_ = librosa.effects.trim(a, top_db=45); a = yt if yt.size else a + fi = min(int(0.01*sr), a.size//2) + if fi>0: + a[:fi]*=np.linspace(0.,1.,fi,dtype=np.float32); a[-fi:]*=np.linspace(1.,0.,fi,dtype=np.float32) + pad = np.zeros(int(0.09*sr),dtype=np.float32) + return np.concatenate([pad,a,pad]) + +for temp in [0.70, 0.90]: + m = TTSModel.load_model(language="german_24l", lsd_decode_steps=6, temp=temp) + vs = m.get_state_for_audio_prompt(ref); sr = m.sample_rate + tag = f"t{int(temp*100):03d}" + print(f"== temp={temp} ==", flush=True) + for name, text in SENT.items(): + a = m.generate_audio(vs, text, frames_after_eos=4) + a = a.numpy() if hasattr(a,"numpy") else np.asarray(a) + a = cleanup_v2(a, sr) + sf.write(os.path.join(OUT, f"{tag}_{name}.wav"), a, sr) + print(f" {name}", flush=True) +print("TEMP_FINAL_DONE", flush=True) diff --git a/client/lucy-tts/umlaut_test.py b/client/lucy-tts/umlaut_test.py new file mode 100644 index 0000000..1a82a61 --- /dev/null +++ b/client/lucy-tts/umlaut_test.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +"""umlaut_test.py — prüft den Umlaut-Normalizer. +A) Logik: bekannte ASCII-Umlaut-Wörter -> Umlaut, normale Wörter (neue/aktuell/Steuer) UNVERÄNDERT. +B) Audio: erzeugt vorher (roh ASCII) vs nachher (mit Fix) auf den Desktop zum Reinhören. +""" +import os, time +import numpy as np, soundfile as sf, librosa +import pocket_server as ps + +DESK = os.path.join(os.path.expanduser("~"), "Desktop", "lucy_samples") +os.makedirs(DESK, exist_ok=True) + +# --- A) Logik --- +POS = {"ueber": "über", "Schoen": "Schön", "fuer": "für", "maerz": "März", + "natuerlich": "natürlich", "Groesse": "Größe", "moeglich": "möglich", "muessen": "müssen"} +NEG = ["neue", "aktuell", "Steuer", "Quelle", "Feuer", "treue", "Museum", "Dauer", "heute", + "Frauen", "genau", "blaue"] +ok = True +for a, exp in POS.items(): + got = ps._fix_umlauts(a); good = got == exp; ok &= good + print(f"[pos] {a!r:14}-> {got!r:14} erwartet {exp!r:12} {'OK' if good else 'FAIL'}") +for w in NEG: + got = ps._fix_umlauts(w); good = got == w; ok &= good + print(f"[neg] {w!r:14}-> {got!r:14} {'OK (unverändert)' if good else 'FAIL: GEÄNDERT!'}") +S = "Ueber fuenf moegliche Gespraeche, natuerlich auch die Groesse." +print("SENT roh :", S) +print("SENT fix :", ps._fix_umlauts(S)) +print("LOGIC_OK" if ok else "LOGIC_FAIL") + +# --- B) Audio vorher/nachher --- +from pocket_tts import TTSModel +m = TTSModel.load_model(language=ps.LANG, lsd_decode_steps=ps.LSD, temp=ps.TEMP, + noise_clamp=ps.NOISE_CLAMP, quantize=ps.QUANTIZE) +ref = ps._prep_ref() +try: + vs = m.get_state_for_audio_prompt(ps.VOICE_ST) +except Exception: + vs = m.get_state_for_audio_prompt(ref) +ra, _ = librosa.load(ref, sr=m.sample_rate, mono=True) +ps.STATE.clear() +ps.STATE.update(m=m, vs=vs, sr=m.sample_rate, ref_fp=ps._fingerprint(ra, m.sample_rate)) + +def gen(text): + return ps.cleanup(ps._gen_gated(text), m.sample_rate) + +sf.write(os.path.join(DESK, "umlaut_vorher.wav"), gen(S), m.sample_rate) # roh ASCII (falsch) +sf.write(os.path.join(DESK, "umlaut_nachher.wav"), gen(ps._fix_umlauts(S)), m.sample_rate) # mit Fix +print("Samples: umlaut_vorher.wav (roh) + umlaut_nachher.wav (fix) ->", DESK) +print("UMLAUT_DONE") diff --git a/client/lucy-tts/verify_clip.py b/client/lucy-tts/verify_clip.py new file mode 100644 index 0000000..b4b78e5 --- /dev/null +++ b/client/lucy-tts/verify_clip.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +"""Verify: fehlen WÖRTER (Content-Cut) oder ist es nur gefühltes abruptes Einsetzen? +Whisper-Rücktranskription der v2-Samples + Energie am 1./letzten Audio-Sample.""" +import os, numpy as np, soundfile as sf +from faster_whisper import WhisperModel + +DIR = r"C:\Users\TobisPC\Desktop\lucy_lsd_v2" +EXPECT = { + "kurz": "Hallo Commander, ich höre dich.", + "mittel":"Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", + "lang": "Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft.", +} +w = WhisperModel("small", device="cpu", compute_type="int8") +for lsd in [5, 6]: + print(f"=== lsd {lsd} ===") + for name in ["kurz", "mittel", "lang"]: + p = os.path.join(DIR, f"lsd{lsd}_{name}.wav") + a, sr = sf.read(p) + a = np.asarray(a, dtype=np.float32).reshape(-1) + # Energie der ersten/letzten 100ms NICHT-Pad (überspringe 90ms Pad) + pad = int(0.09*sr) + core = a[pad:-pad] if a.size > 2*pad else a + seg, _ = w.transcribe(p, language="de", beam_size=5) + txt = " ".join(s.text for s in seg).strip() + print(f"[{name:6}] EXPECT: {EXPECT[name]}") + print(f" GOT : {txt}") + print(f" dur={a.size/sr:.2f}s core_start_amp={np.abs(core[:5]).max():.3f} core_end_amp={np.abs(core[-5:]).max():.3f}") +print("VERIFY_DONE") From 98360ad31fe15ddc77821f06174f8e2f221bd073 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 2 Jul 2026 10:29:59 +0200 Subject: [PATCH 13/38] Frontend: Voice-Umzug in Desktop-App, MC3-Prototyp, UI-Rework-Dateien auf lucy-v2, dist konsistent - VoiceView + components/voice + lib/voice entfernt (lebt jetzt in client/lucy-desktop) - mc3/: Basisstation-Prototyp hinter #mc3-Weiche (non-destruktiv) - roleMeta/useLucyHealth/useExpertMode/ExpertToggle/LucyHealthCard/WarmSetManager (UI-Rework, auf main a341d25 committet, hier nachgezogen) - dist frisch gebaut (Asset-Stand war inkonsistent: alte geloescht, neue untracked) Co-Authored-By: Claude Fable 5 --- ...View-DWD0sYrM.js => GraphView-CfrAKviO.js} | 2 +- frontend/dist/assets/index-BljJ8MOS.css | 1 + frontend/dist/assets/index-DYJjhQkk.js | 5481 ----------------- frontend/dist/assets/index-DoqQd4Zi.css | 1 - frontend/dist/assets/index-KW1c6Ww8.js | 663 ++ frontend/dist/index.html | 4 +- frontend/src/App.tsx | 13 +- frontend/src/components/ExpertToggle.tsx | 37 + .../components/dashboard/LucyHealthCard.tsx | 165 + .../src/components/dashboard/ModelsCard.tsx | 6 +- .../src/components/models/ModelBadges.tsx | 45 +- .../src/components/models/WarmSetManager.tsx | 202 + frontend/src/components/voice/Avatar3D.tsx | 193 - .../src/components/voice/AvatarPicker.tsx | 155 - frontend/src/lib/roleMeta.ts | 126 + frontend/src/lib/useExpertMode.ts | 34 + frontend/src/lib/useLucyHealth.ts | 173 + frontend/src/lib/voice/audio.ts | 103 - frontend/src/lib/voice/sentiment.ts | 17 - frontend/src/lib/voice/usePushToTalk.ts | 50 - frontend/src/lib/voice/useVoiceAgent.ts | 237 - frontend/src/mc3/Mc3App.tsx | 90 + frontend/src/mc3/Mc3Maschinenraum.tsx | 60 + frontend/src/mc3/Mc3Start.tsx | 95 + frontend/src/nav.ts | 4 +- frontend/src/views/DashboardView.tsx | 4 + frontend/src/views/VoiceView.tsx | 155 - frontend/src/views/models/Cockpit.tsx | 234 +- 28 files changed, 1846 insertions(+), 6504 deletions(-) rename frontend/dist/assets/{GraphView-DWD0sYrM.js => GraphView-CfrAKviO.js} (99%) create mode 100644 frontend/dist/assets/index-BljJ8MOS.css delete mode 100644 frontend/dist/assets/index-DYJjhQkk.js delete mode 100644 frontend/dist/assets/index-DoqQd4Zi.css create mode 100644 frontend/dist/assets/index-KW1c6Ww8.js create mode 100644 frontend/src/components/ExpertToggle.tsx create mode 100644 frontend/src/components/dashboard/LucyHealthCard.tsx create mode 100644 frontend/src/components/models/WarmSetManager.tsx delete mode 100644 frontend/src/components/voice/Avatar3D.tsx delete mode 100644 frontend/src/components/voice/AvatarPicker.tsx create mode 100644 frontend/src/lib/roleMeta.ts create mode 100644 frontend/src/lib/useExpertMode.ts create mode 100644 frontend/src/lib/useLucyHealth.ts delete mode 100644 frontend/src/lib/voice/audio.ts delete mode 100644 frontend/src/lib/voice/sentiment.ts delete mode 100644 frontend/src/lib/voice/usePushToTalk.ts delete mode 100644 frontend/src/lib/voice/useVoiceAgent.ts create mode 100644 frontend/src/mc3/Mc3App.tsx create mode 100644 frontend/src/mc3/Mc3Maschinenraum.tsx create mode 100644 frontend/src/mc3/Mc3Start.tsx delete mode 100644 frontend/src/views/VoiceView.tsx diff --git a/frontend/dist/assets/GraphView-DWD0sYrM.js b/frontend/dist/assets/GraphView-CfrAKviO.js similarity index 99% rename from frontend/dist/assets/GraphView-DWD0sYrM.js rename to frontend/dist/assets/GraphView-CfrAKviO.js index 7fd68c3..8f90b21 100644 --- a/frontend/dist/assets/GraphView-DWD0sYrM.js +++ b/frontend/dist/assets/GraphView-CfrAKviO.js @@ -1,4 +1,4 @@ -import{g as bi,r as ce,j as H,R as rr,S as nr,a as Ut,T as ar}from"./index-DYJjhQkk.js";var et={exports:{}},zt;function or(){if(zt)return et.exports;zt=1;var n=typeof Reflect=="object"?Reflect:null,i=n&&typeof n.apply=="function"?n.apply:function(b,R,A){return Function.prototype.apply.call(b,R,A)},t;n&&typeof n.ownKeys=="function"?t=n.ownKeys:Object.getOwnPropertySymbols?t=function(b){return Object.getOwnPropertyNames(b).concat(Object.getOwnPropertySymbols(b))}:t=function(b){return Object.getOwnPropertyNames(b)};function e(p){console&&console.warn&&console.warn(p)}var r=Number.isNaN||function(b){return b!==b};function a(){a.init.call(this)}et.exports=a,et.exports.once=D,a.EventEmitter=a,a.prototype._events=void 0,a.prototype._eventsCount=0,a.prototype._maxListeners=void 0;var o=10;function s(p){if(typeof p!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof p)}Object.defineProperty(a,"defaultMaxListeners",{enumerable:!0,get:function(){return o},set:function(p){if(typeof p!="number"||p<0||r(p))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+p+".");o=p}}),a.init=function(){(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)&&(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},a.prototype.setMaxListeners=function(b){if(typeof b!="number"||b<0||r(b))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+b+".");return this._maxListeners=b,this};function u(p){return p._maxListeners===void 0?a.defaultMaxListeners:p._maxListeners}a.prototype.getMaxListeners=function(){return u(this)},a.prototype.emit=function(b){for(var R=[],A=1;A0&&(P=R[0]),P instanceof Error)throw P;var V=new Error("Unhandled error."+(P?" ("+P.message+")":""));throw V.context=P,V}var z=F[b];if(z===void 0)return!1;if(typeof z=="function")i(z,this,R);else for(var g=z.length,K=y(z,g),A=0;A0&&P.length>G&&!P.warned){P.warned=!0;var V=new Error("Possible EventEmitter memory leak detected. "+P.length+" "+String(b)+" listeners added. Use emitter.setMaxListeners() to increase limit");V.name="MaxListenersExceededWarning",V.emitter=p,V.type=b,V.count=P.length,e(V)}return p}a.prototype.addListener=function(b,R){return h(this,b,R,!1)},a.prototype.on=a.prototype.addListener,a.prototype.prependListener=function(b,R){return h(this,b,R,!0)};function d(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function l(p,b,R){var A={fired:!1,wrapFn:void 0,target:p,type:b,listener:R},G=d.bind(A);return G.listener=R,A.wrapFn=G,G}a.prototype.once=function(b,R){return s(R),this.on(b,l(this,b,R)),this},a.prototype.prependOnceListener=function(b,R){return s(R),this.prependListener(b,l(this,b,R)),this},a.prototype.removeListener=function(b,R){var A,G,F,P,V;if(s(R),G=this._events,G===void 0)return this;if(A=G[b],A===void 0)return this;if(A===R||A.listener===R)--this._eventsCount===0?this._events=Object.create(null):(delete G[b],G.removeListener&&this.emit("removeListener",b,A.listener||R));else if(typeof A!="function"){for(F=-1,P=A.length-1;P>=0;P--)if(A[P]===R||A[P].listener===R){V=A[P].listener,F=P;break}if(F<0)return this;F===0?A.shift():w(A,F),A.length===1&&(G[b]=A[0]),G.removeListener!==void 0&&this.emit("removeListener",b,V||R)}return this},a.prototype.off=a.prototype.removeListener,a.prototype.removeAllListeners=function(b){var R,A,G;if(A=this._events,A===void 0)return this;if(A.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):A[b]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete A[b]),this;if(arguments.length===0){var F=Object.keys(A),P;for(G=0;G=0;G--)this.removeListener(b,R[G]);return this};function f(p,b,R){var A=p._events;if(A===void 0)return[];var G=A[b];return G===void 0?[]:typeof G=="function"?R?[G.listener||G]:[G]:R?T(G):y(G,G.length)}a.prototype.listeners=function(b){return f(this,b,!0)},a.prototype.rawListeners=function(b){return f(this,b,!1)},a.listenerCount=function(p,b){return typeof p.listenerCount=="function"?p.listenerCount(b):c.call(p,b)},a.prototype.listenerCount=c;function c(p){var b=this._events;if(b!==void 0){var R=b[p];if(typeof R=="function")return 1;if(R!==void 0)return R.length}return 0}a.prototype.eventNames=function(){return this._eventsCount>0?t(this._events):[]};function y(p,b){for(var R=new Array(b),A=0;An++}function me(){const n=arguments;let i=null,t=-1;return{[Symbol.iterator](){return this},next(){let e=null;do{if(i===null){if(t++,t>=n.length)return{done:!0};i=n[t][Symbol.iterator]()}if(e=i.next(),e.done){i=null;continue}break}while(!0);return e}}}function Le(){return{[Symbol.iterator](){return this},next(){return{done:!0}}}}class Lt extends Error{constructor(i){super(),this.name="GraphError",this.message=i}}class k extends Lt{constructor(i){super(i),this.name="InvalidArgumentsGraphError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,k.prototype.constructor)}}class C extends Lt{constructor(i){super(i),this.name="NotFoundGraphError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,C.prototype.constructor)}}class I extends Lt{constructor(i){super(i),this.name="UsageGraphError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,I.prototype.constructor)}}function _i(n,i){this.key=n,this.attributes=i,this.clear()}_i.prototype.clear=function(){this.inDegree=0,this.outDegree=0,this.undirectedDegree=0,this.undirectedLoops=0,this.directedLoops=0,this.in={},this.out={},this.undirected={}};function Ti(n,i){this.key=n,this.attributes=i,this.clear()}Ti.prototype.clear=function(){this.inDegree=0,this.outDegree=0,this.directedLoops=0,this.in={},this.out={}};function Si(n,i){this.key=n,this.attributes=i,this.clear()}Si.prototype.clear=function(){this.undirectedDegree=0,this.undirectedLoops=0,this.undirected={}};function Ge(n,i,t,e,r){this.key=i,this.attributes=r,this.undirected=n,this.source=t,this.target=e}Ge.prototype.attach=function(){let n="out",i="in";this.undirected&&(n=i="undirected");const t=this.source.key,e=this.target.key;this.source[n][e]=this,!(this.undirected&&t===e)&&(this.target[i][t]=this)};Ge.prototype.attachMulti=function(){let n="out",i="in";const t=this.source.key,e=this.target.key;this.undirected&&(n=i="undirected");const r=this.source[n],a=r[e];if(typeof a>"u"){r[e]=this,this.undirected&&t===e||(this.target[i][t]=this);return}a.previous=this,this.next=a,r[e]=this,this.target[i][t]=this};Ge.prototype.detach=function(){const n=this.source.key,i=this.target.key;let t="out",e="in";this.undirected&&(t=e="undirected"),delete this.source[t][i],delete this.target[e][n]};Ge.prototype.detachMulti=function(){const n=this.source.key,i=this.target.key;let t="out",e="in";this.undirected&&(t=e="undirected"),this.previous===void 0?this.next===void 0?(delete this.source[t][i],delete this.target[e][n]):(this.next.previous=void 0,this.source[t][i]=this.next,this.target[e][n]=this.next):(this.previous.next=this.next,this.next!==void 0&&(this.next.previous=this.previous))};const Ri=0,Ai=1,hr=2,xi=3;function ye(n,i,t,e,r,a,o){let s,u,h,d;if(e=""+e,t===Ri){if(s=n._nodes.get(e),!s)throw new C(`Graph.${i}: could not find the "${e}" node in the graph.`);h=r,d=a}else if(t===xi){if(r=""+r,u=n._edges.get(r),!u)throw new C(`Graph.${i}: could not find the "${r}" edge in the graph.`);const l=u.source.key,f=u.target.key;if(e===l)s=u.target;else if(e===f)s=u.source;else throw new C(`Graph.${i}: the "${e}" node is not attached to the "${r}" edge (${l}, ${f}).`);h=a,d=o}else{if(u=n._edges.get(e),!u)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`);t===Ai?s=u.source:s=u.target,h=r,d=a}return[s,h,d]}function dr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);return o.attributes[s]}}function lr(n,i,t){n.prototype[i]=function(e,r){const[a]=ye(this,i,t,e,r);return a.attributes}}function cr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);return o.attributes.hasOwnProperty(s)}}function fr(n,i,t){n.prototype[i]=function(e,r,a,o){const[s,u,h]=ye(this,i,t,e,r,a,o);return s.attributes[u]=h,this.emit("nodeAttributesUpdated",{key:s.key,type:"set",attributes:s.attributes,name:u}),this}}function gr(n,i,t){n.prototype[i]=function(e,r,a,o){const[s,u,h]=ye(this,i,t,e,r,a,o);if(typeof h!="function")throw new k(`Graph.${i}: updater should be a function.`);const d=s.attributes,l=h(d[u]);return d[u]=l,this.emit("nodeAttributesUpdated",{key:s.key,type:"set",attributes:s.attributes,name:u}),this}}function pr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);return delete o.attributes[s],this.emit("nodeAttributesUpdated",{key:o.key,type:"remove",attributes:o.attributes,name:s}),this}}function vr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);if(!J(s))throw new k(`Graph.${i}: provided attributes are not a plain object.`);return o.attributes=s,this.emit("nodeAttributesUpdated",{key:o.key,type:"replace",attributes:o.attributes}),this}}function mr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);if(!J(s))throw new k(`Graph.${i}: provided attributes are not a plain object.`);return Z(o.attributes,s),this.emit("nodeAttributesUpdated",{key:o.key,type:"merge",attributes:o.attributes,data:s}),this}}function yr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);if(typeof s!="function")throw new k(`Graph.${i}: provided updater is not a function.`);return o.attributes=s(o.attributes),this.emit("nodeAttributesUpdated",{key:o.key,type:"update",attributes:o.attributes}),this}}const br=[{name:n=>`get${n}Attribute`,attacher:dr},{name:n=>`get${n}Attributes`,attacher:lr},{name:n=>`has${n}Attribute`,attacher:cr},{name:n=>`set${n}Attribute`,attacher:fr},{name:n=>`update${n}Attribute`,attacher:gr},{name:n=>`remove${n}Attribute`,attacher:pr},{name:n=>`replace${n}Attributes`,attacher:vr},{name:n=>`merge${n}Attributes`,attacher:mr},{name:n=>`update${n}Attributes`,attacher:yr}];function wr(n){br.forEach(function({name:i,attacher:t}){t(n,i("Node"),Ri),t(n,i("Source"),Ai),t(n,i("Target"),hr),t(n,i("Opposite"),xi)})}function Er(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return a.attributes[r]}}function _r(n,i,t){n.prototype[i]=function(e){let r;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>1){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const a=""+e,o=""+arguments[1];if(r=oe(this,a,o,t),!r)throw new C(`Graph.${i}: could not find an edge for the given path ("${a}" - "${o}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,r=this._edges.get(e),!r)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return r.attributes}}function Tr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return a.attributes.hasOwnProperty(r)}}function Sr(n,i,t){n.prototype[i]=function(e,r,a){let o;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>3){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const s=""+e,u=""+r;if(r=arguments[2],a=arguments[3],o=oe(this,s,u,t),!o)throw new C(`Graph.${i}: could not find an edge for the given path ("${s}" - "${u}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,o=this._edges.get(e),!o)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return o.attributes[r]=a,this.emit("edgeAttributesUpdated",{key:o.key,type:"set",attributes:o.attributes,name:r}),this}}function Rr(n,i,t){n.prototype[i]=function(e,r,a){let o;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>3){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const s=""+e,u=""+r;if(r=arguments[2],a=arguments[3],o=oe(this,s,u,t),!o)throw new C(`Graph.${i}: could not find an edge for the given path ("${s}" - "${u}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,o=this._edges.get(e),!o)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(typeof a!="function")throw new k(`Graph.${i}: updater should be a function.`);return o.attributes[r]=a(o.attributes[r]),this.emit("edgeAttributesUpdated",{key:o.key,type:"set",attributes:o.attributes,name:r}),this}}function Ar(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return delete a.attributes[r],this.emit("edgeAttributesUpdated",{key:a.key,type:"remove",attributes:a.attributes,name:r}),this}}function xr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(!J(r))throw new k(`Graph.${i}: provided attributes are not a plain object.`);return a.attributes=r,this.emit("edgeAttributesUpdated",{key:a.key,type:"replace",attributes:a.attributes}),this}}function Cr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(!J(r))throw new k(`Graph.${i}: provided attributes are not a plain object.`);return Z(a.attributes,r),this.emit("edgeAttributesUpdated",{key:a.key,type:"merge",attributes:a.attributes,data:r}),this}}function kr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(typeof r!="function")throw new k(`Graph.${i}: provided updater is not a function.`);return a.attributes=r(a.attributes),this.emit("edgeAttributesUpdated",{key:a.key,type:"update",attributes:a.attributes}),this}}const Dr=[{name:n=>`get${n}Attribute`,attacher:Er},{name:n=>`get${n}Attributes`,attacher:_r},{name:n=>`has${n}Attribute`,attacher:Tr},{name:n=>`set${n}Attribute`,attacher:Sr},{name:n=>`update${n}Attribute`,attacher:Rr},{name:n=>`remove${n}Attribute`,attacher:Ar},{name:n=>`replace${n}Attributes`,attacher:xr},{name:n=>`merge${n}Attributes`,attacher:Cr},{name:n=>`update${n}Attributes`,attacher:kr}];function Lr(n){Dr.forEach(function({name:i,attacher:t}){t(n,i("Edge"),"mixed"),t(n,i("DirectedEdge"),"directed"),t(n,i("UndirectedEdge"),"undirected")})}const Gr=[{name:"edges",type:"mixed"},{name:"inEdges",type:"directed",direction:"in"},{name:"outEdges",type:"directed",direction:"out"},{name:"inboundEdges",type:"mixed",direction:"in"},{name:"outboundEdges",type:"mixed",direction:"out"},{name:"directedEdges",type:"directed"},{name:"undirectedEdges",type:"undirected"}];function Fr(n,i,t,e){let r=!1;for(const a in i){if(a===e)continue;const o=i[a];if(r=t(o.key,o.attributes,o.source.key,o.target.key,o.source.attributes,o.target.attributes,o.undirected),n&&r)return o.key}}function Nr(n,i,t,e){let r,a,o,s=!1;for(const u in i)if(u!==e){r=i[u];do{if(a=r.source,o=r.target,s=t(r.key,r.attributes,a.key,o.key,a.attributes,o.attributes,r.undirected),n&&s)return r.key;r=r.next}while(r!==void 0)}}function lt(n,i){const t=Object.keys(n),e=t.length;let r,a=0;return{[Symbol.iterator](){return this},next(){do if(r)r=r.next;else{if(a>=e)return{done:!0};const o=t[a++];if(o===i){r=void 0;continue}r=n[o]}while(!r);return{done:!1,value:{edge:r.key,attributes:r.attributes,source:r.source.key,target:r.target.key,sourceAttributes:r.source.attributes,targetAttributes:r.target.attributes,undirected:r.undirected}}}}}function Pr(n,i,t,e){const r=i[t];if(!r)return;const a=r.source,o=r.target;if(e(r.key,r.attributes,a.key,o.key,a.attributes,o.attributes,r.undirected)&&n)return r.key}function Ir(n,i,t,e){let r=i[t];if(!r)return;let a=!1;do{if(a=e(r.key,r.attributes,r.source.key,r.target.key,r.source.attributes,r.target.attributes,r.undirected),n&&a)return r.key;r=r.next}while(r!==void 0)}function ct(n,i){let t=n[i];if(t.next!==void 0)return{[Symbol.iterator](){return this},next(){if(!t)return{done:!0};const r={edge:t.key,attributes:t.attributes,source:t.source.key,target:t.target.key,sourceAttributes:t.source.attributes,targetAttributes:t.target.attributes,undirected:t.undirected};return t=t.next,{done:!1,value:r}}};let e=!1;return{[Symbol.iterator](){return this},next(){return e===!0?{done:!0}:(e=!0,{done:!1,value:{edge:t.key,attributes:t.attributes,source:t.source.key,target:t.target.key,sourceAttributes:t.source.attributes,targetAttributes:t.target.attributes,undirected:t.undirected}})}}}function Or(n,i){if(n.size===0)return[];if(i==="mixed"||i===n.type)return Array.from(n._edges.keys());const t=i==="undirected"?n.undirectedSize:n.directedSize,e=new Array(t),r=i==="undirected",a=n._edges.values();let o=0,s,u;for(;s=a.next(),s.done!==!0;)u=s.value,u.undirected===r&&(e[o++]=u.key);return e}function Ci(n,i,t,e){if(i.size===0)return;const r=t!=="mixed"&&t!==i.type,a=t==="undirected";let o,s,u=!1;const h=i._edges.values();for(;o=h.next(),o.done!==!0;){if(s=o.value,r&&s.undirected!==a)continue;const{key:d,attributes:l,source:f,target:c}=s;if(u=e(d,l,f.key,c.key,f.attributes,c.attributes,s.undirected),n&&u)return d}}function Ur(n,i){if(n.size===0)return Le();const t=i!=="mixed"&&i!==n.type,e=i==="undirected",r=n._edges.values();return{[Symbol.iterator](){return this},next(){let a,o;for(;;){if(a=r.next(),a.done)return a;if(o=a.value,!(t&&o.undirected!==e))break}return{value:{edge:o.key,attributes:o.attributes,source:o.source.key,target:o.target.key,sourceAttributes:o.source.attributes,targetAttributes:o.target.attributes,undirected:o.undirected},done:!1}}}}function Gt(n,i,t,e,r,a){const o=i?Nr:Fr;let s;if(t!=="undirected"&&(e!=="out"&&(s=o(n,r.in,a),n&&s)||e!=="in"&&(s=o(n,r.out,a,e?void 0:r.key),n&&s))||t!=="directed"&&(s=o(n,r.undirected,a),n&&s))return s}function zr(n,i,t,e){const r=[];return Gt(!1,n,i,t,e,function(a){r.push(a)}),r}function $r(n,i,t){let e=Le();return n!=="undirected"&&(i!=="out"&&typeof t.in<"u"&&(e=me(e,lt(t.in))),i!=="in"&&typeof t.out<"u"&&(e=me(e,lt(t.out,i?void 0:t.key)))),n!=="directed"&&typeof t.undirected<"u"&&(e=me(e,lt(t.undirected))),e}function Ft(n,i,t,e,r,a,o){const s=t?Ir:Pr;let u;if(i!=="undirected"&&(typeof r.in<"u"&&e!=="out"&&(u=s(n,r.in,a,o),n&&u)||typeof r.out<"u"&&e!=="in"&&(e||r.key!==a)&&(u=s(n,r.out,a,o),n&&u))||i!=="directed"&&typeof r.undirected<"u"&&(u=s(n,r.undirected,a,o),n&&u))return u}function Br(n,i,t,e,r){const a=[];return Ft(!1,n,i,t,e,r,function(o){a.push(o)}),a}function Mr(n,i,t,e){let r=Le();return n!=="undirected"&&(typeof t.in<"u"&&i!=="out"&&e in t.in&&(r=me(r,ct(t.in,e))),typeof t.out<"u"&&i!=="in"&&e in t.out&&(i||t.key!==e)&&(r=me(r,ct(t.out,e)))),n!=="directed"&&typeof t.undirected<"u"&&e in t.undirected&&(r=me(r,ct(t.undirected,e))),r}function Hr(n,i){const{name:t,type:e,direction:r}=i;n.prototype[t]=function(a,o){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return[];if(!arguments.length)return Or(this,e);if(arguments.length===1){a=""+a;const s=this._nodes.get(a);if(typeof s>"u")throw new C(`Graph.${t}: could not find the "${a}" node in the graph.`);return zr(this.multi,e==="mixed"?this.type:e,r,s)}if(arguments.length===2){a=""+a,o=""+o;const s=this._nodes.get(a);if(!s)throw new C(`Graph.${t}: could not find the "${a}" source node in the graph.`);if(!this._nodes.has(o))throw new C(`Graph.${t}: could not find the "${o}" target node in the graph.`);return Br(e,this.multi,r,s,o)}throw new k(`Graph.${t}: too many arguments (expecting 0, 1 or 2 and got ${arguments.length}).`)}}function Wr(n,i){const{name:t,type:e,direction:r}=i,a="forEach"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[a]=function(h,d,l){if(!(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)){if(arguments.length===1)return l=h,Ci(!1,this,e,l);if(arguments.length===2){h=""+h,l=d;const f=this._nodes.get(h);if(typeof f>"u")throw new C(`Graph.${a}: could not find the "${h}" node in the graph.`);return Gt(!1,this.multi,e==="mixed"?this.type:e,r,f,l)}if(arguments.length===3){h=""+h,d=""+d;const f=this._nodes.get(h);if(!f)throw new C(`Graph.${a}: could not find the "${h}" source node in the graph.`);if(!this._nodes.has(d))throw new C(`Graph.${a}: could not find the "${d}" target node in the graph.`);return Ft(!1,e,this.multi,r,f,d,l)}throw new k(`Graph.${a}: too many arguments (expecting 1, 2 or 3 and got ${arguments.length}).`)}};const o="map"+t[0].toUpperCase()+t.slice(1);n.prototype[o]=function(){const h=Array.prototype.slice.call(arguments),d=h.pop();let l;if(h.length===0){let f=0;e!=="directed"&&(f+=this.undirectedSize),e!=="undirected"&&(f+=this.directedSize),l=new Array(f);let c=0;h.push((y,w,T,D,m,S,p)=>{l[c++]=d(y,w,T,D,m,S,p)})}else l=[],h.push((f,c,y,w,T,D,m)=>{l.push(d(f,c,y,w,T,D,m))});return this[a].apply(this,h),l};const s="filter"+t[0].toUpperCase()+t.slice(1);n.prototype[s]=function(){const h=Array.prototype.slice.call(arguments),d=h.pop(),l=[];return h.push((f,c,y,w,T,D,m)=>{d(f,c,y,w,T,D,m)&&l.push(f)}),this[a].apply(this,h),l};const u="reduce"+t[0].toUpperCase()+t.slice(1);n.prototype[u]=function(){let h=Array.prototype.slice.call(arguments);if(h.length<2||h.length>4)throw new k(`Graph.${u}: invalid number of arguments (expecting 2, 3 or 4 and got ${h.length}).`);if(typeof h[h.length-1]=="function"&&typeof h[h.length-2]!="function")throw new k(`Graph.${u}: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.`);let d,l;h.length===2?(d=h[0],l=h[1],h=[]):h.length===3?(d=h[1],l=h[2],h=[h[0]]):h.length===4&&(d=h[2],l=h[3],h=[h[0],h[1]]);let f=l;return h.push((c,y,w,T,D,m,S)=>{f=d(f,c,y,w,T,D,m,S)}),this[a].apply(this,h),f}}function jr(n,i){const{name:t,type:e,direction:r}=i,a="find"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[a]=function(u,h,d){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return!1;if(arguments.length===1)return d=u,Ci(!0,this,e,d);if(arguments.length===2){u=""+u,d=h;const l=this._nodes.get(u);if(typeof l>"u")throw new C(`Graph.${a}: could not find the "${u}" node in the graph.`);return Gt(!0,this.multi,e==="mixed"?this.type:e,r,l,d)}if(arguments.length===3){u=""+u,h=""+h;const l=this._nodes.get(u);if(!l)throw new C(`Graph.${a}: could not find the "${u}" source node in the graph.`);if(!this._nodes.has(h))throw new C(`Graph.${a}: could not find the "${h}" target node in the graph.`);return Ft(!0,e,this.multi,r,l,h,d)}throw new k(`Graph.${a}: too many arguments (expecting 1, 2 or 3 and got ${arguments.length}).`)};const o="some"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[o]=function(){const u=Array.prototype.slice.call(arguments),h=u.pop();return u.push((l,f,c,y,w,T,D)=>h(l,f,c,y,w,T,D)),!!this[a].apply(this,u)};const s="every"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[s]=function(){const u=Array.prototype.slice.call(arguments),h=u.pop();return u.push((l,f,c,y,w,T,D)=>!h(l,f,c,y,w,T,D)),!this[a].apply(this,u)}}function Vr(n,i){const{name:t,type:e,direction:r}=i,a=t.slice(0,-1)+"Entries";n.prototype[a]=function(o,s){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return Le();if(!arguments.length)return Ur(this,e);if(arguments.length===1){o=""+o;const u=this._nodes.get(o);if(!u)throw new C(`Graph.${a}: could not find the "${o}" node in the graph.`);return $r(e,r,u)}if(arguments.length===2){o=""+o,s=""+s;const u=this._nodes.get(o);if(!u)throw new C(`Graph.${a}: could not find the "${o}" source node in the graph.`);if(!this._nodes.has(s))throw new C(`Graph.${a}: could not find the "${s}" target node in the graph.`);return Mr(e,r,u,s)}throw new k(`Graph.${a}: too many arguments (expecting 0, 1 or 2 and got ${arguments.length}).`)}}function qr(n){Gr.forEach(i=>{Hr(n,i),Wr(n,i),jr(n,i),Vr(n,i)})}const Kr=[{name:"neighbors",type:"mixed"},{name:"inNeighbors",type:"directed",direction:"in"},{name:"outNeighbors",type:"directed",direction:"out"},{name:"inboundNeighbors",type:"mixed",direction:"in"},{name:"outboundNeighbors",type:"mixed",direction:"out"},{name:"directedNeighbors",type:"directed"},{name:"undirectedNeighbors",type:"undirected"}];function ut(){this.A=null,this.B=null}ut.prototype.wrap=function(n){this.A===null?this.A=n:this.B===null&&(this.B=n)};ut.prototype.has=function(n){return this.A!==null&&n in this.A||this.B!==null&&n in this.B};function Oe(n,i,t,e,r){for(const a in e){const o=e[a],s=o.source,u=o.target,h=s===t?u:s;if(i&&i.has(h.key))continue;const d=r(h.key,h.attributes);if(n&&d)return h.key}}function Nt(n,i,t,e,r){if(i!=="mixed"){if(i==="undirected")return Oe(n,null,e,e.undirected,r);if(typeof t=="string")return Oe(n,null,e,e[t],r)}const a=new ut;let o;if(i!=="undirected"){if(t!=="out"){if(o=Oe(n,null,e,e.in,r),n&&o)return o;a.wrap(e.in)}if(t!=="in"){if(o=Oe(n,a,e,e.out,r),n&&o)return o;a.wrap(e.out)}}if(i!=="directed"&&(o=Oe(n,a,e,e.undirected,r),n&&o))return o}function Yr(n,i,t){if(n!=="mixed"){if(n==="undirected")return Object.keys(t.undirected);if(typeof i=="string")return Object.keys(t[i])}const e=[];return Nt(!1,n,i,t,function(r){e.push(r)}),e}function Ue(n,i,t){const e=Object.keys(t),r=e.length;let a=0;return{[Symbol.iterator](){return this},next(){let o=null;do{if(a>=r)return n&&n.wrap(t),{done:!0};const s=t[e[a++]],u=s.source,h=s.target;if(o=u===i?h:u,n&&n.has(o.key)){o=null;continue}}while(o===null);return{done:!1,value:{neighbor:o.key,attributes:o.attributes}}}}}function Zr(n,i,t){if(n!=="mixed"){if(n==="undirected")return Ue(null,t,t.undirected);if(typeof i=="string")return Ue(null,t,t[i])}let e=Le();const r=new ut;return n!=="undirected"&&(i!=="out"&&(e=me(e,Ue(r,t,t.in))),i!=="in"&&(e=me(e,Ue(r,t,t.out)))),n!=="directed"&&(e=me(e,Ue(r,t,t.undirected))),e}function Xr(n,i){const{name:t,type:e,direction:r}=i;n.prototype[t]=function(a){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return[];a=""+a;const o=this._nodes.get(a);if(typeof o>"u")throw new C(`Graph.${t}: could not find the "${a}" node in the graph.`);return Yr(e==="mixed"?this.type:e,r,o)}}function Jr(n,i){const{name:t,type:e,direction:r}=i,a="forEach"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[a]=function(h,d){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return;h=""+h;const l=this._nodes.get(h);if(typeof l>"u")throw new C(`Graph.${a}: could not find the "${h}" node in the graph.`);Nt(!1,e==="mixed"?this.type:e,r,l,d)};const o="map"+t[0].toUpperCase()+t.slice(1);n.prototype[o]=function(h,d){const l=[];return this[a](h,(f,c)=>{l.push(d(f,c))}),l};const s="filter"+t[0].toUpperCase()+t.slice(1);n.prototype[s]=function(h,d){const l=[];return this[a](h,(f,c)=>{d(f,c)&&l.push(f)}),l};const u="reduce"+t[0].toUpperCase()+t.slice(1);n.prototype[u]=function(h,d,l){if(arguments.length<3)throw new k(`Graph.${u}: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.`);let f=l;return this[a](h,(c,y)=>{f=d(f,c,y)}),f}}function Qr(n,i){const{name:t,type:e,direction:r}=i,a=t[0].toUpperCase()+t.slice(1,-1),o="find"+a;n.prototype[o]=function(h,d){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return;h=""+h;const l=this._nodes.get(h);if(typeof l>"u")throw new C(`Graph.${o}: could not find the "${h}" node in the graph.`);return Nt(!0,e==="mixed"?this.type:e,r,l,d)};const s="some"+a;n.prototype[s]=function(h,d){return!!this[o](h,d)};const u="every"+a;n.prototype[u]=function(h,d){return!this[o](h,(f,c)=>!d(f,c))}}function en(n,i){const{name:t,type:e,direction:r}=i,a=t.slice(0,-1)+"Entries";n.prototype[a]=function(o){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return Le();o=""+o;const s=this._nodes.get(o);if(typeof s>"u")throw new C(`Graph.${a}: could not find the "${o}" node in the graph.`);return Zr(e==="mixed"?this.type:e,r,s)}}function tn(n){Kr.forEach(i=>{Xr(n,i),Jr(n,i),Qr(n,i),en(n,i)})}function tt(n,i,t,e,r){const a=e._nodes.values(),o=e.type;let s,u,h,d,l,f;for(;s=a.next(),s.done!==!0;){let c=!1;if(u=s.value,o!=="undirected"){d=u.out;for(h in d){l=d[h];do f=l.target,c=!0,r(u.key,f.key,u.attributes,f.attributes,l.key,l.attributes,l.undirected),l=l.next;while(l)}}if(o!=="directed"){d=u.undirected;for(h in d)if(!(i&&u.key>h)){l=d[h];do f=l.target,f.key!==h&&(f=l.source),c=!0,r(u.key,f.key,u.attributes,f.attributes,l.key,l.attributes,l.undirected),l=l.next;while(l)}}t&&!c&&r(u.key,null,u.attributes,null,null,null,null)}}function rn(n,i){const t={key:n};return Ei(i.attributes)||(t.attributes=Z({},i.attributes)),t}function nn(n,i,t){const e={key:i,source:t.source.key,target:t.target.key};return Ei(t.attributes)||(e.attributes=Z({},t.attributes)),n==="mixed"&&t.undirected&&(e.undirected=!0),e}function an(n){if(!J(n))throw new k('Graph.import: invalid serialized node. A serialized node should be a plain object with at least a "key" property.');if(!("key"in n))throw new k("Graph.import: serialized node is missing its key.");if("attributes"in n&&(!J(n.attributes)||n.attributes===null))throw new k("Graph.import: invalid attributes. Attributes should be a plain object, null or omitted.")}function on(n){if(!J(n))throw new k('Graph.import: invalid serialized edge. A serialized edge should be a plain object with at least a "source" & "target" property.');if(!("source"in n))throw new k("Graph.import: serialized edge is missing its source.");if(!("target"in n))throw new k("Graph.import: serialized edge is missing its target.");if("attributes"in n&&(!J(n.attributes)||n.attributes===null))throw new k("Graph.import: invalid attributes. Attributes should be a plain object, null or omitted.");if("undirected"in n&&typeof n.undirected!="boolean")throw new k("Graph.import: invalid undirectedness information. Undirected should be boolean or omitted.")}const sn=ur(),un=new Set(["directed","undirected","mixed"]),Bt=new Set(["domain","_events","_eventsCount","_maxListeners"]),hn=[{name:n=>`${n}Edge`,generateKey:!0},{name:n=>`${n}DirectedEdge`,generateKey:!0,type:"directed"},{name:n=>`${n}UndirectedEdge`,generateKey:!0,type:"undirected"},{name:n=>`${n}EdgeWithKey`},{name:n=>`${n}DirectedEdgeWithKey`,type:"directed"},{name:n=>`${n}UndirectedEdgeWithKey`,type:"undirected"}],dn={allowSelfLoops:!0,multi:!1,type:"mixed"};function ln(n,i,t){if(t&&!J(t))throw new k(`Graph.addNode: invalid attributes. Expecting an object but got "${t}"`);if(i=""+i,t=t||{},n._nodes.has(i))throw new I(`Graph.addNode: the "${i}" node already exist in the graph.`);const e=new n.NodeDataClass(i,t);return n._nodes.set(i,e),n.emit("nodeAdded",{key:i,attributes:t}),e}function Mt(n,i,t){const e=new n.NodeDataClass(i,t);return n._nodes.set(i,e),n.emit("nodeAdded",{key:i,attributes:t}),e}function ki(n,i,t,e,r,a,o,s){if(!e&&n.type==="undirected")throw new I(`Graph.${i}: you cannot add a directed edge to an undirected graph. Use the #.addEdge or #.addUndirectedEdge instead.`);if(e&&n.type==="directed")throw new I(`Graph.${i}: you cannot add an undirected edge to a directed graph. Use the #.addEdge or #.addDirectedEdge instead.`);if(s&&!J(s))throw new k(`Graph.${i}: invalid attributes. Expecting an object but got "${s}"`);if(a=""+a,o=""+o,s=s||{},!n.allowSelfLoops&&a===o)throw new I(`Graph.${i}: source & target are the same ("${a}"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.`);const u=n._nodes.get(a),h=n._nodes.get(o);if(!u)throw new C(`Graph.${i}: source node "${a}" not found.`);if(!h)throw new C(`Graph.${i}: target node "${o}" not found.`);const d={key:null,undirected:e,source:a,target:o,attributes:s};if(t)r=n._edgeKeyGenerator();else if(r=""+r,n._edges.has(r))throw new I(`Graph.${i}: the "${r}" edge already exists in the graph.`);if(!n.multi&&(e?typeof u.undirected[o]<"u":typeof u.out[o]<"u"))throw new I(`Graph.${i}: an edge linking "${a}" to "${o}" already exists. If you really want to add multiple edges linking those nodes, you should create a multi graph by using the 'multi' option.`);const l=new Ge(e,r,u,h,s);n._edges.set(r,l);const f=a===o;return e?(u.undirectedDegree++,h.undirectedDegree++,f&&(u.undirectedLoops++,n._undirectedSelfLoopCount++)):(u.outDegree++,h.inDegree++,f&&(u.directedLoops++,n._directedSelfLoopCount++)),n.multi?l.attachMulti():l.attach(),e?n._undirectedSize++:n._directedSize++,d.key=r,n.emit("edgeAdded",d),r}function cn(n,i,t,e,r,a,o,s,u){if(!e&&n.type==="undirected")throw new I(`Graph.${i}: you cannot merge/update a directed edge to an undirected graph. Use the #.mergeEdge/#.updateEdge or #.addUndirectedEdge instead.`);if(e&&n.type==="directed")throw new I(`Graph.${i}: you cannot merge/update an undirected edge to a directed graph. Use the #.mergeEdge/#.updateEdge or #.addDirectedEdge instead.`);if(s){if(u){if(typeof s!="function")throw new k(`Graph.${i}: invalid updater function. Expecting a function but got "${s}"`)}else if(!J(s))throw new k(`Graph.${i}: invalid attributes. Expecting an object but got "${s}"`)}a=""+a,o=""+o;let h;if(u&&(h=s,s=void 0),!n.allowSelfLoops&&a===o)throw new I(`Graph.${i}: source & target are the same ("${a}"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.`);let d=n._nodes.get(a),l=n._nodes.get(o),f,c;if(!t&&(f=n._edges.get(r),f)){if((f.source.key!==a||f.target.key!==o)&&(!e||f.source.key!==o||f.target.key!==a))throw new I(`Graph.${i}: inconsistency detected when attempting to merge the "${r}" edge with "${a}" source & "${o}" target vs. ("${f.source.key}", "${f.target.key}").`);c=f}if(!c&&!n.multi&&d&&(c=e?d.undirected[o]:d.out[o]),c){const m=[c.key,!1,!1,!1];if(u?!h:!s)return m;if(u){const S=c.attributes;c.attributes=h(S),n.emit("edgeAttributesUpdated",{type:"replace",key:c.key,attributes:c.attributes})}else Z(c.attributes,s),n.emit("edgeAttributesUpdated",{type:"merge",key:c.key,attributes:c.attributes,data:s});return m}s=s||{},u&&h&&(s=h(s));const y={key:null,undirected:e,source:a,target:o,attributes:s};if(t)r=n._edgeKeyGenerator();else if(r=""+r,n._edges.has(r))throw new I(`Graph.${i}: the "${r}" edge already exists in the graph.`);let w=!1,T=!1;d||(d=Mt(n,a,{}),w=!0,a===o&&(l=d,T=!0)),l||(l=Mt(n,o,{}),T=!0),f=new Ge(e,r,d,l,s),n._edges.set(r,f);const D=a===o;return e?(d.undirectedDegree++,l.undirectedDegree++,D&&(d.undirectedLoops++,n._undirectedSelfLoopCount++)):(d.outDegree++,l.inDegree++,D&&(d.directedLoops++,n._directedSelfLoopCount++)),n.multi?f.attachMulti():f.attach(),e?n._undirectedSize++:n._directedSize++,y.key=r,n.emit("edgeAdded",y),[r,!0,w,T]}function xe(n,i){n._edges.delete(i.key);const{source:t,target:e,attributes:r}=i,a=i.undirected,o=t===e;a?(t.undirectedDegree--,e.undirectedDegree--,o&&(t.undirectedLoops--,n._undirectedSelfLoopCount--)):(t.outDegree--,e.inDegree--,o&&(t.directedLoops--,n._directedSelfLoopCount--)),n.multi?i.detachMulti():i.detach(),a?n._undirectedSize--:n._directedSize--,n.emit("edgeDropped",{key:i.key,attributes:r,source:t.key,target:e.key,undirected:a})}class j extends wi.EventEmitter{constructor(i){if(super(),i=Z({},dn,i),typeof i.multi!="boolean")throw new k(`Graph.constructor: invalid 'multi' option. Expecting a boolean but got "${i.multi}".`);if(!un.has(i.type))throw new k(`Graph.constructor: invalid 'type' option. Should be one of "mixed", "directed" or "undirected" but got "${i.type}".`);if(typeof i.allowSelfLoops!="boolean")throw new k(`Graph.constructor: invalid 'allowSelfLoops' option. Expecting a boolean but got "${i.allowSelfLoops}".`);const t=i.type==="mixed"?_i:i.type==="directed"?Ti:Si;ae(this,"NodeDataClass",t);const e="geid_"+sn()+"_";let r=0;const a=()=>{let o;do o=e+r++;while(this._edges.has(o));return o};ae(this,"_attributes",{}),ae(this,"_nodes",new Map),ae(this,"_edges",new Map),ae(this,"_directedSize",0),ae(this,"_undirectedSize",0),ae(this,"_directedSelfLoopCount",0),ae(this,"_undirectedSelfLoopCount",0),ae(this,"_edgeKeyGenerator",a),ae(this,"_options",i),Bt.forEach(o=>ae(this,o,this[o])),he(this,"order",()=>this._nodes.size),he(this,"size",()=>this._edges.size),he(this,"directedSize",()=>this._directedSize),he(this,"undirectedSize",()=>this._undirectedSize),he(this,"selfLoopCount",()=>this._directedSelfLoopCount+this._undirectedSelfLoopCount),he(this,"directedSelfLoopCount",()=>this._directedSelfLoopCount),he(this,"undirectedSelfLoopCount",()=>this._undirectedSelfLoopCount),he(this,"multi",this._options.multi),he(this,"type",this._options.type),he(this,"allowSelfLoops",this._options.allowSelfLoops),he(this,"implementation",()=>"graphology")}_resetInstanceCounters(){this._directedSize=0,this._undirectedSize=0,this._directedSelfLoopCount=0,this._undirectedSelfLoopCount=0}hasNode(i){return this._nodes.has(""+i)}hasDirectedEdge(i,t){if(this.type==="undirected")return!1;if(arguments.length===1){const e=""+i,r=this._edges.get(e);return!!r&&!r.undirected}else if(arguments.length===2){i=""+i,t=""+t;const e=this._nodes.get(i);return e?e.out.hasOwnProperty(t):!1}throw new k(`Graph.hasDirectedEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`)}hasUndirectedEdge(i,t){if(this.type==="directed")return!1;if(arguments.length===1){const e=""+i,r=this._edges.get(e);return!!r&&r.undirected}else if(arguments.length===2){i=""+i,t=""+t;const e=this._nodes.get(i);return e?e.undirected.hasOwnProperty(t):!1}throw new k(`Graph.hasDirectedEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`)}hasEdge(i,t){if(arguments.length===1){const e=""+i;return this._edges.has(e)}else if(arguments.length===2){i=""+i,t=""+t;const e=this._nodes.get(i);return e?typeof e.out<"u"&&e.out.hasOwnProperty(t)||typeof e.undirected<"u"&&e.undirected.hasOwnProperty(t):!1}throw new k(`Graph.hasEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`)}directedEdge(i,t){if(this.type==="undirected")return;if(i=""+i,t=""+t,this.multi)throw new I("Graph.directedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.directedEdges instead.");const e=this._nodes.get(i);if(!e)throw new C(`Graph.directedEdge: could not find the "${i}" source node in the graph.`);if(!this._nodes.has(t))throw new C(`Graph.directedEdge: could not find the "${t}" target node in the graph.`);const r=e.out&&e.out[t]||void 0;if(r)return r.key}undirectedEdge(i,t){if(this.type==="directed")return;if(i=""+i,t=""+t,this.multi)throw new I("Graph.undirectedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.undirectedEdges instead.");const e=this._nodes.get(i);if(!e)throw new C(`Graph.undirectedEdge: could not find the "${i}" source node in the graph.`);if(!this._nodes.has(t))throw new C(`Graph.undirectedEdge: could not find the "${t}" target node in the graph.`);const r=e.undirected&&e.undirected[t]||void 0;if(r)return r.key}edge(i,t){if(this.multi)throw new I("Graph.edge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.edges instead.");i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.edge: could not find the "${i}" source node in the graph.`);if(!this._nodes.has(t))throw new C(`Graph.edge: could not find the "${t}" target node in the graph.`);const r=e.out&&e.out[t]||e.undirected&&e.undirected[t]||void 0;if(r)return r.key}areDirectedNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areDirectedNeighbors: could not find the "${i}" node in the graph.`);return this.type==="undirected"?!1:t in e.in||t in e.out}areOutNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areOutNeighbors: could not find the "${i}" node in the graph.`);return this.type==="undirected"?!1:t in e.out}areInNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areInNeighbors: could not find the "${i}" node in the graph.`);return this.type==="undirected"?!1:t in e.in}areUndirectedNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areUndirectedNeighbors: could not find the "${i}" node in the graph.`);return this.type==="directed"?!1:t in e.undirected}areNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areNeighbors: could not find the "${i}" node in the graph.`);return this.type!=="undirected"&&(t in e.in||t in e.out)||this.type!=="directed"&&t in e.undirected}areInboundNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areInboundNeighbors: could not find the "${i}" node in the graph.`);return this.type!=="undirected"&&t in e.in||this.type!=="directed"&&t in e.undirected}areOutboundNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areOutboundNeighbors: could not find the "${i}" node in the graph.`);return this.type!=="undirected"&&t in e.out||this.type!=="directed"&&t in e.undirected}inDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.inDegree: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree}outDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.outDegree: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.outDegree}directedDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.directedDegree: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree+t.outDegree}undirectedDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.undirectedDegree: could not find the "${i}" node in the graph.`);return this.type==="directed"?0:t.undirectedDegree}inboundDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.inboundDegree: could not find the "${i}" node in the graph.`);let e=0;return this.type!=="directed"&&(e+=t.undirectedDegree),this.type!=="undirected"&&(e+=t.inDegree),e}outboundDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.outboundDegree: could not find the "${i}" node in the graph.`);let e=0;return this.type!=="directed"&&(e+=t.undirectedDegree),this.type!=="undirected"&&(e+=t.outDegree),e}degree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.degree: could not find the "${i}" node in the graph.`);let e=0;return this.type!=="directed"&&(e+=t.undirectedDegree),this.type!=="undirected"&&(e+=t.inDegree+t.outDegree),e}inDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.inDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree-t.directedLoops}outDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.outDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.outDegree-t.directedLoops}directedDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.directedDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree+t.outDegree-t.directedLoops*2}undirectedDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.undirectedDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="directed"?0:t.undirectedDegree-t.undirectedLoops*2}inboundDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.inboundDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);let e=0,r=0;return this.type!=="directed"&&(e+=t.undirectedDegree,r+=t.undirectedLoops*2),this.type!=="undirected"&&(e+=t.inDegree,r+=t.directedLoops),e-r}outboundDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.outboundDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);let e=0,r=0;return this.type!=="directed"&&(e+=t.undirectedDegree,r+=t.undirectedLoops*2),this.type!=="undirected"&&(e+=t.outDegree,r+=t.directedLoops),e-r}degreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.degreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);let e=0,r=0;return this.type!=="directed"&&(e+=t.undirectedDegree,r+=t.undirectedLoops*2),this.type!=="undirected"&&(e+=t.inDegree+t.outDegree,r+=t.directedLoops*2),e-r}source(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.source: could not find the "${i}" edge in the graph.`);return t.source.key}target(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.target: could not find the "${i}" edge in the graph.`);return t.target.key}extremities(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.extremities: could not find the "${i}" edge in the graph.`);return[t.source.key,t.target.key]}opposite(i,t){i=""+i,t=""+t;const e=this._edges.get(t);if(!e)throw new C(`Graph.opposite: could not find the "${t}" edge in the graph.`);const r=e.source.key,a=e.target.key;if(i===r)return a;if(i===a)return r;throw new C(`Graph.opposite: the "${i}" node is not attached to the "${t}" edge (${r}, ${a}).`)}hasExtremity(i,t){i=""+i,t=""+t;const e=this._edges.get(i);if(!e)throw new C(`Graph.hasExtremity: could not find the "${i}" edge in the graph.`);return e.source.key===t||e.target.key===t}isUndirected(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.isUndirected: could not find the "${i}" edge in the graph.`);return t.undirected}isDirected(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.isDirected: could not find the "${i}" edge in the graph.`);return!t.undirected}isSelfLoop(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.isSelfLoop: could not find the "${i}" edge in the graph.`);return t.source===t.target}addNode(i,t){return ln(this,i,t).key}mergeNode(i,t){if(t&&!J(t))throw new k(`Graph.mergeNode: invalid attributes. Expecting an object but got "${t}"`);i=""+i,t=t||{};let e=this._nodes.get(i);return e?(t&&(Z(e.attributes,t),this.emit("nodeAttributesUpdated",{type:"merge",key:i,attributes:e.attributes,data:t})),[i,!1]):(e=new this.NodeDataClass(i,t),this._nodes.set(i,e),this.emit("nodeAdded",{key:i,attributes:t}),[i,!0])}updateNode(i,t){if(t&&typeof t!="function")throw new k(`Graph.updateNode: invalid updater function. Expecting a function but got "${t}"`);i=""+i;let e=this._nodes.get(i);if(e){if(t){const a=e.attributes;e.attributes=t(a),this.emit("nodeAttributesUpdated",{type:"replace",key:i,attributes:e.attributes})}return[i,!1]}const r=t?t({}):{};return e=new this.NodeDataClass(i,r),this._nodes.set(i,e),this.emit("nodeAdded",{key:i,attributes:r}),[i,!0]}dropNode(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.dropNode: could not find the "${i}" node in the graph.`);let e;if(this.type!=="undirected"){for(const r in t.out){e=t.out[r];do xe(this,e),e=e.next;while(e)}for(const r in t.in){e=t.in[r];do xe(this,e),e=e.next;while(e)}}if(this.type!=="directed")for(const r in t.undirected){e=t.undirected[r];do xe(this,e),e=e.next;while(e)}this._nodes.delete(i),this.emit("nodeDropped",{key:i,attributes:t.attributes})}dropEdge(i){let t;if(arguments.length>1){const e=""+arguments[0],r=""+arguments[1];if(t=oe(this,e,r,this.type),!t)throw new C(`Graph.dropEdge: could not find the "${e}" -> "${r}" edge in the graph.`)}else if(i=""+i,t=this._edges.get(i),!t)throw new C(`Graph.dropEdge: could not find the "${i}" edge in the graph.`);return xe(this,t),this}dropDirectedEdge(i,t){if(arguments.length<2)throw new I("Graph.dropDirectedEdge: it does not make sense to try and drop a directed edge by key. What if the edge with this key is undirected? Use #.dropEdge for this purpose instead.");if(this.multi)throw new I("Graph.dropDirectedEdge: cannot use a {source,target} combo when dropping an edge in a MultiGraph since we cannot infer the one you want to delete as there could be multiple ones.");i=""+i,t=""+t;const e=oe(this,i,t,"directed");if(!e)throw new C(`Graph.dropDirectedEdge: could not find a "${i}" -> "${t}" edge in the graph.`);return xe(this,e),this}dropUndirectedEdge(i,t){if(arguments.length<2)throw new I("Graph.dropUndirectedEdge: it does not make sense to drop a directed edge by key. What if the edge with this key is undirected? Use #.dropEdge for this purpose instead.");if(this.multi)throw new I("Graph.dropUndirectedEdge: cannot use a {source,target} combo when dropping an edge in a MultiGraph since we cannot infer the one you want to delete as there could be multiple ones.");const e=oe(this,i,t,"undirected");if(!e)throw new C(`Graph.dropUndirectedEdge: could not find a "${i}" -> "${t}" edge in the graph.`);return xe(this,e),this}clear(){this._edges.clear(),this._nodes.clear(),this._resetInstanceCounters(),this.emit("cleared")}clearEdges(){const i=this._nodes.values();let t;for(;t=i.next(),t.done!==!0;)t.value.clear();this._edges.clear(),this._resetInstanceCounters(),this.emit("edgesCleared")}getAttribute(i){return this._attributes[i]}getAttributes(){return this._attributes}hasAttribute(i){return this._attributes.hasOwnProperty(i)}setAttribute(i,t){return this._attributes[i]=t,this.emit("attributesUpdated",{type:"set",attributes:this._attributes,name:i}),this}updateAttribute(i,t){if(typeof t!="function")throw new k("Graph.updateAttribute: updater should be a function.");const e=this._attributes[i];return this._attributes[i]=t(e),this.emit("attributesUpdated",{type:"set",attributes:this._attributes,name:i}),this}removeAttribute(i){return delete this._attributes[i],this.emit("attributesUpdated",{type:"remove",attributes:this._attributes,name:i}),this}replaceAttributes(i){if(!J(i))throw new k("Graph.replaceAttributes: provided attributes are not a plain object.");return this._attributes=i,this.emit("attributesUpdated",{type:"replace",attributes:this._attributes}),this}mergeAttributes(i){if(!J(i))throw new k("Graph.mergeAttributes: provided attributes are not a plain object.");return Z(this._attributes,i),this.emit("attributesUpdated",{type:"merge",attributes:this._attributes,data:i}),this}updateAttributes(i){if(typeof i!="function")throw new k("Graph.updateAttributes: provided updater is not a function.");return this._attributes=i(this._attributes),this.emit("attributesUpdated",{type:"update",attributes:this._attributes}),this}updateEachNodeAttributes(i,t){if(typeof i!="function")throw new k("Graph.updateEachNodeAttributes: expecting an updater function.");if(t&&!$t(t))throw new k("Graph.updateEachNodeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}");const e=this._nodes.values();let r,a;for(;r=e.next(),r.done!==!0;)a=r.value,a.attributes=i(a.key,a.attributes);this.emit("eachNodeAttributesUpdated",{hints:t||null})}updateEachEdgeAttributes(i,t){if(typeof i!="function")throw new k("Graph.updateEachEdgeAttributes: expecting an updater function.");if(t&&!$t(t))throw new k("Graph.updateEachEdgeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}");const e=this._edges.values();let r,a,o,s;for(;r=e.next(),r.done!==!0;)a=r.value,o=a.source,s=a.target,a.attributes=i(a.key,a.attributes,o.key,s.key,o.attributes,s.attributes,a.undirected);this.emit("eachEdgeAttributesUpdated",{hints:t||null})}forEachAdjacencyEntry(i){if(typeof i!="function")throw new k("Graph.forEachAdjacencyEntry: expecting a callback.");tt(!1,!1,!1,this,i)}forEachAdjacencyEntryWithOrphans(i){if(typeof i!="function")throw new k("Graph.forEachAdjacencyEntryWithOrphans: expecting a callback.");tt(!1,!1,!0,this,i)}forEachAssymetricAdjacencyEntry(i){if(typeof i!="function")throw new k("Graph.forEachAssymetricAdjacencyEntry: expecting a callback.");tt(!1,!0,!1,this,i)}forEachAssymetricAdjacencyEntryWithOrphans(i){if(typeof i!="function")throw new k("Graph.forEachAssymetricAdjacencyEntryWithOrphans: expecting a callback.");tt(!1,!0,!0,this,i)}nodes(){return Array.from(this._nodes.keys())}forEachNode(i){if(typeof i!="function")throw new k("Graph.forEachNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)r=e.value,i(r.key,r.attributes)}findNode(i){if(typeof i!="function")throw new k("Graph.findNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)if(r=e.value,i(r.key,r.attributes))return r.key}mapNodes(i){if(typeof i!="function")throw new k("Graph.mapNode: expecting a callback.");const t=this._nodes.values();let e,r;const a=new Array(this.order);let o=0;for(;e=t.next(),e.done!==!0;)r=e.value,a[o++]=i(r.key,r.attributes);return a}someNode(i){if(typeof i!="function")throw new k("Graph.someNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)if(r=e.value,i(r.key,r.attributes))return!0;return!1}everyNode(i){if(typeof i!="function")throw new k("Graph.everyNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)if(r=e.value,!i(r.key,r.attributes))return!1;return!0}filterNodes(i){if(typeof i!="function")throw new k("Graph.filterNodes: expecting a callback.");const t=this._nodes.values();let e,r;const a=[];for(;e=t.next(),e.done!==!0;)r=e.value,i(r.key,r.attributes)&&a.push(r.key);return a}reduceNodes(i,t){if(typeof i!="function")throw new k("Graph.reduceNodes: expecting a callback.");if(arguments.length<2)throw new k("Graph.reduceNodes: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.");let e=t;const r=this._nodes.values();let a,o;for(;a=r.next(),a.done!==!0;)o=a.value,e=i(e,o.key,o.attributes);return e}nodeEntries(){const i=this._nodes.values();return{[Symbol.iterator](){return this},next(){const t=i.next();if(t.done)return t;const e=t.value;return{value:{node:e.key,attributes:e.attributes},done:!1}}}}export(){const i=new Array(this._nodes.size);let t=0;this._nodes.forEach((r,a)=>{i[t++]=rn(a,r)});const e=new Array(this._edges.size);return t=0,this._edges.forEach((r,a)=>{e[t++]=nn(this.type,a,r)}),{options:{type:this.type,multi:this.multi,allowSelfLoops:this.allowSelfLoops},attributes:this.getAttributes(),nodes:i,edges:e}}import(i,t=!1){if(i instanceof j)return i.forEachNode((u,h)=>{t?this.mergeNode(u,h):this.addNode(u,h)}),i.forEachEdge((u,h,d,l,f,c,y)=>{t?y?this.mergeUndirectedEdgeWithKey(u,d,l,h):this.mergeDirectedEdgeWithKey(u,d,l,h):y?this.addUndirectedEdgeWithKey(u,d,l,h):this.addDirectedEdgeWithKey(u,d,l,h)}),this;if(!J(i))throw new k("Graph.import: invalid argument. Expecting a serialized graph or, alternatively, a Graph instance.");if(i.attributes){if(!J(i.attributes))throw new k("Graph.import: invalid attributes. Expecting a plain object.");t?this.mergeAttributes(i.attributes):this.replaceAttributes(i.attributes)}let e,r,a,o,s;if(i.nodes){if(a=i.nodes,!Array.isArray(a))throw new k("Graph.import: invalid nodes. Expecting an array.");for(e=0,r=a.length;e{const a=Z({},e.attributes);e=new t.NodeDataClass(r,a),t._nodes.set(r,e)}),t}copy(i){if(i=i||{},typeof i.type=="string"&&i.type!==this.type&&i.type!=="mixed")throw new I(`Graph.copy: cannot create an incompatible copy from "${this.type}" type to "${i.type}" because this would mean losing information about the current graph.`);if(typeof i.multi=="boolean"&&i.multi!==this.multi&&i.multi!==!0)throw new I("Graph.copy: cannot create an incompatible copy by downgrading a multi graph to a simple one because this would mean losing information about the current graph.");if(typeof i.allowSelfLoops=="boolean"&&i.allowSelfLoops!==this.allowSelfLoops&&i.allowSelfLoops!==!0)throw new I("Graph.copy: cannot create an incompatible copy from a graph allowing self loops to one that does not because this would mean losing information about the current graph.");const t=this.emptyCopy(i),e=this._edges.values();let r,a;for(;r=e.next(),r.done!==!0;)a=r.value,ki(t,"copy",!1,a.undirected,a.key,a.source.key,a.target.key,Z({},a.attributes));return t}toJSON(){return this.export()}toString(){return"[object Graph]"}inspect(){const i={};this._nodes.forEach((a,o)=>{i[o]=a.attributes});const t={},e={};this._edges.forEach((a,o)=>{const s=a.undirected?"--":"->";let u="",h=a.source.key,d=a.target.key,l;a.undirected&&h>d&&(l=h,h=d,d=l);const f=`(${h})${s}(${d})`;o.startsWith("geid_")?this.multi&&(typeof e[f]>"u"?e[f]=0:e[f]++,u+=`${e[f]}. `):u+=`[${o}]: `,u+=f,t[u]=a.attributes});const r={};for(const a in this)this.hasOwnProperty(a)&&!Bt.has(a)&&typeof this[a]!="function"&&typeof a!="symbol"&&(r[a]=this[a]);return r.attributes=this._attributes,r.nodes=i,r.edges=t,ae(r,"constructor",this.constructor),r}}typeof Symbol<"u"&&(j.prototype[Symbol.for("nodejs.util.inspect.custom")]=j.prototype.inspect);hn.forEach(n=>{["add","merge","update"].forEach(i=>{const t=n.name(i),e=i==="add"?ki:cn;n.generateKey?j.prototype[t]=function(r,a,o){return e(this,t,!0,(n.type||this.type)==="undirected",null,r,a,o,i==="update")}:j.prototype[t]=function(r,a,o,s){return e(this,t,!1,(n.type||this.type)==="undirected",r,a,o,s,i==="update")}})});wr(j);Lr(j);qr(j);tn(j);class Di extends j{constructor(i){const t=Z({type:"directed"},i);if("multi"in t&&t.multi!==!1)throw new k("DirectedGraph.from: inconsistent indication that the graph should be multi in given options!");if(t.type!=="directed")throw new k('DirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}class Li extends j{constructor(i){const t=Z({type:"undirected"},i);if("multi"in t&&t.multi!==!1)throw new k("UndirectedGraph.from: inconsistent indication that the graph should be multi in given options!");if(t.type!=="undirected")throw new k('UndirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}class Gi extends j{constructor(i){const t=Z({multi:!0},i);if("multi"in t&&t.multi!==!0)throw new k("MultiGraph.from: inconsistent indication that the graph should be simple in given options!");super(t)}}class Fi extends j{constructor(i){const t=Z({type:"directed",multi:!0},i);if("multi"in t&&t.multi!==!0)throw new k("MultiDirectedGraph.from: inconsistent indication that the graph should be simple in given options!");if(t.type!=="directed")throw new k('MultiDirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}class Ni extends j{constructor(i){const t=Z({type:"undirected",multi:!0},i);if("multi"in t&&t.multi!==!0)throw new k("MultiUndirectedGraph.from: inconsistent indication that the graph should be simple in given options!");if(t.type!=="undirected")throw new k('MultiUndirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}function Fe(n){n.from=function(i,t){const e=Z({},i.options,t),r=new n(e);return r.import(i),r}}Fe(j);Fe(Di);Fe(Li);Fe(Gi);Fe(Fi);Fe(Ni);j.Graph=j;j.DirectedGraph=Di;j.UndirectedGraph=Li;j.MultiGraph=Gi;j.MultiDirectedGraph=Fi;j.MultiUndirectedGraph=Ni;j.InvalidArgumentsGraphError=k;j.NotFoundGraphError=C;j.UsageGraphError=I;var ft,Ht;function Pi(){return Ht||(Ht=1,ft=function(i){return i!==null&&typeof i=="object"&&typeof i.addUndirectedEdgeWithKey=="function"&&typeof i.dropNode=="function"&&typeof i.multi=="boolean"}),ft}var ze={},Wt;function fn(){if(Wt)return ze;Wt=1;function n(e){return typeof e!="number"||isNaN(e)?1:e}function i(e,r){var a={},o=function(h){return typeof h>"u"?r:h};typeof r=="function"&&(o=r);var s=function(h){return o(h[e])},u=function(){return o(void 0)};return typeof e=="string"?(a.fromAttributes=s,a.fromGraph=function(h,d){return s(h.getNodeAttributes(d))},a.fromEntry=function(h,d){return s(d)}):typeof e=="function"?(a.fromAttributes=function(){throw new Error("graphology-utils/getters/createNodeValueGetter: irrelevant usage.")},a.fromGraph=function(h,d){return o(e(d,h.getNodeAttributes(d)))},a.fromEntry=function(h,d){return o(e(h,d))}):(a.fromAttributes=u,a.fromGraph=u,a.fromEntry=u),a}function t(e,r){var a={},o=function(h){return typeof h>"u"?r:h};typeof r=="function"&&(o=r);var s=function(h){return o(h[e])},u=function(){return o(void 0)};return typeof e=="string"?(a.fromAttributes=s,a.fromGraph=function(h,d){return s(h.getEdgeAttributes(d))},a.fromEntry=function(h,d){return s(d)},a.fromPartialEntry=a.fromEntry,a.fromMinimalEntry=a.fromEntry):typeof e=="function"?(a.fromAttributes=function(){throw new Error("graphology-utils/getters/createEdgeValueGetter: irrelevant usage.")},a.fromGraph=function(h,d){var l=h.extremities(d);return o(e(d,h.getEdgeAttributes(d),l[0],l[1],h.getNodeAttributes(l[0]),h.getNodeAttributes(l[1]),h.isUndirected(d)))},a.fromEntry=function(h,d,l,f,c,y,w){return o(e(h,d,l,f,c,y,w))},a.fromPartialEntry=function(h,d,l,f){return o(e(h,d,l,f))},a.fromMinimalEntry=function(h,d){return o(e(h,d))}):(a.fromAttributes=u,a.fromGraph=u,a.fromEntry=u,a.fromMinimalEntry=u),a}return ze.createNodeValueGetter=i,ze.createEdgeValueGetter=t,ze.createEdgeWeightGetter=function(e){return t(e,n)},ze}var gt,jt;function gn(){if(jt)return gt;jt=1;var n=0,i=1,t=2,e=3,r=4,a=5,o=6,s=7,u=8,h=9,d=0,l=1,f=2,c=0,y=1,w=2,T=3,D=4,m=5,S=6,p=7,b=8,R=3,A=10,G=3,F=9,P=10;return gt=function(z,g,K){var te,x,v,$,W,X,ie,Y,N,Ne,re=g.length,tr=K.length,Pe=z.adjustSizes,ir=z.barnesHutTheta*z.barnesHutTheta,qe,q,B,M,fe,U,O,E=[];for(v=0;vYe?(Ee-=(Ke-Ye)/2,Re=Ee+Ke):(we-=(Ye-Ke)/2,Se=we+Ye),E[0+c]=-1,E[0+y]=(we+Se)/2,E[0+w]=(Ee+Re)/2,E[0+T]=Math.max(Se-we,Re-Ee),E[0+D]=-1,E[0+m]=-1,E[0+S]=0,E[0+p]=0,E[0+b]=0,te=1,v=0;v=0){g[v+n]=0)if(U=Math.pow(g[v+n]-E[x+p],2)+Math.pow(g[v+i]-E[x+b],2),Ne=E[x+T],4*Ne*Ne/U0?(O=q*g[v+o]*E[x+S]/U,g[v+t]+=B*O,g[v+e]+=M*O):U<0&&(O=-q*g[v+o]*E[x+S]/Math.sqrt(U),g[v+t]+=B*O,g[v+e]+=M*O):U>0&&(O=q*g[v+o]*E[x+S]/U,g[v+t]+=B*O,g[v+e]+=M*O),x=E[x+D],x<0)break;continue}else{x=E[x+m];continue}else{if(X=E[x+c],X>=0&&X!==v&&(B=g[v+n]-g[X+n],M=g[v+i]-g[X+i],U=B*B+M*M,Pe===!0?U>0?(O=q*g[v+o]*g[X+o]/U,g[v+t]+=B*O,g[v+e]+=M*O):U<0&&(O=-q*g[v+o]*g[X+o]/Math.sqrt(U),g[v+t]+=B*O,g[v+e]+=M*O):U>0&&(O=q*g[v+o]*g[X+o]/U,g[v+t]+=B*O,g[v+e]+=M*O)),x=E[x+D],x<0)break;continue}else for(q=z.scalingRatio,$=0;$0?(O=q*g[$+o]*g[W+o]/U/U,g[$+t]+=B*O,g[$+e]+=M*O,g[W+t]-=B*O,g[W+e]-=M*O):U<0&&(O=100*q*g[$+o]*g[W+o],g[$+t]+=B*O,g[$+e]+=M*O,g[W+t]-=B*O,g[W+e]-=M*O)):(U=Math.sqrt(B*B+M*M),U>0&&(O=q*g[$+o]*g[W+o]/U/U,g[$+t]+=B*O,g[$+e]+=M*O,g[W+t]-=B*O,g[W+e]-=M*O));for(N=z.gravity/z.scalingRatio,q=z.scalingRatio,v=0;v0&&(O=q*g[v+o]*N):U>0&&(O=q*g[v+o]*N/U),g[v+t]-=B*O,g[v+e]-=M*O;for(q=1*(z.outboundAttractionDistribution?qe:1),ie=0;ie0&&(O=-q*fe*Math.log(1+U)/U/g[$+o]):U>0&&(O=-q*fe*Math.log(1+U)/U):z.outboundAttractionDistribution?U>0&&(O=-q*fe/g[$+o]):U>0&&(O=-q*fe)):(U=Math.sqrt(Math.pow(B,2)+Math.pow(M,2)),z.linLogMode?z.outboundAttractionDistribution?U>0&&(O=-q*fe*Math.log(1+U)/U/g[$+o]):U>0&&(O=-q*fe*Math.log(1+U)/U):z.outboundAttractionDistribution?(U=1,O=-q*fe/g[$+o]):(U=1,O=-q*fe)),U>0&&(g[$+t]+=B*O,g[$+e]+=M*O,g[W+t]-=B*O,g[W+e]-=M*O);var Ze,Ie,Xe,_e,Je,Qe;if(Pe===!0)for(v=0;vP&&(g[v+t]=g[v+t]*P/Ze,g[v+e]=g[v+e]*P/Ze),Ie=g[v+o]*Math.sqrt((g[v+r]-g[v+t])*(g[v+r]-g[v+t])+(g[v+a]-g[v+e])*(g[v+a]-g[v+e])),Xe=Math.sqrt((g[v+r]+g[v+t])*(g[v+r]+g[v+t])+(g[v+a]+g[v+e])*(g[v+a]+g[v+e]))/2,_e=.1*Math.log(1+Xe)/(1+Math.sqrt(Ie)),Je=g[v+n]+g[v+t]*(_e/z.slowDown),g[v+n]=Je,Qe=g[v+i]+g[v+e]*(_e/z.slowDown),g[v+i]=Qe);else for(v=0;v=0)?{message:"the `scalingRatio` setting should be a number >= 0."}:"strongGravityMode"in t&&typeof t.strongGravityMode!="boolean"?{message:"the `strongGravityMode` setting should be a boolean."}:"gravity"in t&&!(typeof t.gravity=="number"&&t.gravity>=0)?{message:"the `gravity` setting should be a number >= 0."}:"slowDown"in t&&!(typeof t.slowDown=="number"||t.slowDown>=0)?{message:"the `slowDown` setting should be a number >= 0."}:"barnesHutOptimize"in t&&typeof t.barnesHutOptimize!="boolean"?{message:"the `barnesHutOptimize` setting should be a boolean."}:"barnesHutTheta"in t&&!(typeof t.barnesHutTheta=="number"&&t.barnesHutTheta>=0)?{message:"the `barnesHutTheta` setting should be a number >= 0."}:null},ge.graphToByteArrays=function(t,e){var r=t.order,a=t.size,o={},s,u=new Float32Array(r*n),h=new Float32Array(a*i);return s=0,t.forEachNode(function(d,l){o[d]=s,u[s]=l.x,u[s+1]=l.y,u[s+2]=0,u[s+3]=0,u[s+4]=0,u[s+5]=0,u[s+6]=1,u[s+7]=1,u[s+8]=l.size||1,u[s+9]=l.fixed?1:0,s+=n}),s=0,t.forEachEdge(function(d,l,f,c,y,w,T){var D=o[f],m=o[c],S=e(d,l,f,c,y,w,T);u[D+6]+=S,u[m+6]+=S,h[s]=D,h[s+1]=m,h[s+2]=S,s+=i}),{nodes:u,edges:h}},ge.assignLayoutChanges=function(t,e,r){var a=0;t.updateEachNodeAttributes(function(o,s){return s.x=e[a],s.y=e[a+1],a+=n,r?r(o,s):s})},ge.readGraphPositions=function(t,e){var r=0;t.forEachNode(function(a,o){e[r]=o.x,e[r+1]=o.y,r+=n})},ge.collectLayoutChanges=function(t,e,r){for(var a=t.nodes(),o={},s=0,u=0,h=e.length;s2e3,strongGravityMode:!0,gravity:.05,scalingRatio:10,slowDown:1+Math.log(h)}}var s=a.bind(null,!1);return s.assign=a.bind(null,!0),s.inferSettings=o,vt=s,vt}var yn=mn();const it=bi(yn);function bn(n,i){if(typeof n!="object"||!n)return n;var t=n[Symbol.toPrimitive];if(t!==void 0){var e=t.call(n,i);if(typeof e!="object")return e;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(n)}function je(n){var i=bn(n,"string");return typeof i=="symbol"?i:i+""}function Q(n,i){if(!(n instanceof i))throw new TypeError("Cannot call a class as a function")}function Yt(n,i){for(var t=0;tn.length)&&(i=n.length);for(var t=0,e=Array(i);t0&&(P=R[0]),P instanceof Error)throw P;var V=new Error("Unhandled error."+(P?" ("+P.message+")":""));throw V.context=P,V}var z=F[b];if(z===void 0)return!1;if(typeof z=="function")i(z,this,R);else for(var g=z.length,K=y(z,g),A=0;A0&&P.length>G&&!P.warned){P.warned=!0;var V=new Error("Possible EventEmitter memory leak detected. "+P.length+" "+String(b)+" listeners added. Use emitter.setMaxListeners() to increase limit");V.name="MaxListenersExceededWarning",V.emitter=p,V.type=b,V.count=P.length,e(V)}return p}a.prototype.addListener=function(b,R){return h(this,b,R,!1)},a.prototype.on=a.prototype.addListener,a.prototype.prependListener=function(b,R){return h(this,b,R,!0)};function d(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function l(p,b,R){var A={fired:!1,wrapFn:void 0,target:p,type:b,listener:R},G=d.bind(A);return G.listener=R,A.wrapFn=G,G}a.prototype.once=function(b,R){return s(R),this.on(b,l(this,b,R)),this},a.prototype.prependOnceListener=function(b,R){return s(R),this.prependListener(b,l(this,b,R)),this},a.prototype.removeListener=function(b,R){var A,G,F,P,V;if(s(R),G=this._events,G===void 0)return this;if(A=G[b],A===void 0)return this;if(A===R||A.listener===R)--this._eventsCount===0?this._events=Object.create(null):(delete G[b],G.removeListener&&this.emit("removeListener",b,A.listener||R));else if(typeof A!="function"){for(F=-1,P=A.length-1;P>=0;P--)if(A[P]===R||A[P].listener===R){V=A[P].listener,F=P;break}if(F<0)return this;F===0?A.shift():w(A,F),A.length===1&&(G[b]=A[0]),G.removeListener!==void 0&&this.emit("removeListener",b,V||R)}return this},a.prototype.off=a.prototype.removeListener,a.prototype.removeAllListeners=function(b){var R,A,G;if(A=this._events,A===void 0)return this;if(A.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):A[b]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete A[b]),this;if(arguments.length===0){var F=Object.keys(A),P;for(G=0;G=0;G--)this.removeListener(b,R[G]);return this};function f(p,b,R){var A=p._events;if(A===void 0)return[];var G=A[b];return G===void 0?[]:typeof G=="function"?R?[G.listener||G]:[G]:R?T(G):y(G,G.length)}a.prototype.listeners=function(b){return f(this,b,!0)},a.prototype.rawListeners=function(b){return f(this,b,!1)},a.listenerCount=function(p,b){return typeof p.listenerCount=="function"?p.listenerCount(b):c.call(p,b)},a.prototype.listenerCount=c;function c(p){var b=this._events;if(b!==void 0){var R=b[p];if(typeof R=="function")return 1;if(R!==void 0)return R.length}return 0}a.prototype.eventNames=function(){return this._eventsCount>0?t(this._events):[]};function y(p,b){for(var R=new Array(b),A=0;An++}function me(){const n=arguments;let i=null,t=-1;return{[Symbol.iterator](){return this},next(){let e=null;do{if(i===null){if(t++,t>=n.length)return{done:!0};i=n[t][Symbol.iterator]()}if(e=i.next(),e.done){i=null;continue}break}while(!0);return e}}}function Le(){return{[Symbol.iterator](){return this},next(){return{done:!0}}}}class Lt extends Error{constructor(i){super(),this.name="GraphError",this.message=i}}class k extends Lt{constructor(i){super(i),this.name="InvalidArgumentsGraphError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,k.prototype.constructor)}}class C extends Lt{constructor(i){super(i),this.name="NotFoundGraphError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,C.prototype.constructor)}}class I extends Lt{constructor(i){super(i),this.name="UsageGraphError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,I.prototype.constructor)}}function _i(n,i){this.key=n,this.attributes=i,this.clear()}_i.prototype.clear=function(){this.inDegree=0,this.outDegree=0,this.undirectedDegree=0,this.undirectedLoops=0,this.directedLoops=0,this.in={},this.out={},this.undirected={}};function Ti(n,i){this.key=n,this.attributes=i,this.clear()}Ti.prototype.clear=function(){this.inDegree=0,this.outDegree=0,this.directedLoops=0,this.in={},this.out={}};function Si(n,i){this.key=n,this.attributes=i,this.clear()}Si.prototype.clear=function(){this.undirectedDegree=0,this.undirectedLoops=0,this.undirected={}};function Ge(n,i,t,e,r){this.key=i,this.attributes=r,this.undirected=n,this.source=t,this.target=e}Ge.prototype.attach=function(){let n="out",i="in";this.undirected&&(n=i="undirected");const t=this.source.key,e=this.target.key;this.source[n][e]=this,!(this.undirected&&t===e)&&(this.target[i][t]=this)};Ge.prototype.attachMulti=function(){let n="out",i="in";const t=this.source.key,e=this.target.key;this.undirected&&(n=i="undirected");const r=this.source[n],a=r[e];if(typeof a>"u"){r[e]=this,this.undirected&&t===e||(this.target[i][t]=this);return}a.previous=this,this.next=a,r[e]=this,this.target[i][t]=this};Ge.prototype.detach=function(){const n=this.source.key,i=this.target.key;let t="out",e="in";this.undirected&&(t=e="undirected"),delete this.source[t][i],delete this.target[e][n]};Ge.prototype.detachMulti=function(){const n=this.source.key,i=this.target.key;let t="out",e="in";this.undirected&&(t=e="undirected"),this.previous===void 0?this.next===void 0?(delete this.source[t][i],delete this.target[e][n]):(this.next.previous=void 0,this.source[t][i]=this.next,this.target[e][n]=this.next):(this.previous.next=this.next,this.next!==void 0&&(this.next.previous=this.previous))};const Ri=0,Ai=1,hr=2,xi=3;function ye(n,i,t,e,r,a,o){let s,u,h,d;if(e=""+e,t===Ri){if(s=n._nodes.get(e),!s)throw new C(`Graph.${i}: could not find the "${e}" node in the graph.`);h=r,d=a}else if(t===xi){if(r=""+r,u=n._edges.get(r),!u)throw new C(`Graph.${i}: could not find the "${r}" edge in the graph.`);const l=u.source.key,f=u.target.key;if(e===l)s=u.target;else if(e===f)s=u.source;else throw new C(`Graph.${i}: the "${e}" node is not attached to the "${r}" edge (${l}, ${f}).`);h=a,d=o}else{if(u=n._edges.get(e),!u)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`);t===Ai?s=u.source:s=u.target,h=r,d=a}return[s,h,d]}function dr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);return o.attributes[s]}}function lr(n,i,t){n.prototype[i]=function(e,r){const[a]=ye(this,i,t,e,r);return a.attributes}}function cr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);return o.attributes.hasOwnProperty(s)}}function fr(n,i,t){n.prototype[i]=function(e,r,a,o){const[s,u,h]=ye(this,i,t,e,r,a,o);return s.attributes[u]=h,this.emit("nodeAttributesUpdated",{key:s.key,type:"set",attributes:s.attributes,name:u}),this}}function gr(n,i,t){n.prototype[i]=function(e,r,a,o){const[s,u,h]=ye(this,i,t,e,r,a,o);if(typeof h!="function")throw new k(`Graph.${i}: updater should be a function.`);const d=s.attributes,l=h(d[u]);return d[u]=l,this.emit("nodeAttributesUpdated",{key:s.key,type:"set",attributes:s.attributes,name:u}),this}}function pr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);return delete o.attributes[s],this.emit("nodeAttributesUpdated",{key:o.key,type:"remove",attributes:o.attributes,name:s}),this}}function vr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);if(!J(s))throw new k(`Graph.${i}: provided attributes are not a plain object.`);return o.attributes=s,this.emit("nodeAttributesUpdated",{key:o.key,type:"replace",attributes:o.attributes}),this}}function mr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);if(!J(s))throw new k(`Graph.${i}: provided attributes are not a plain object.`);return Z(o.attributes,s),this.emit("nodeAttributesUpdated",{key:o.key,type:"merge",attributes:o.attributes,data:s}),this}}function yr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);if(typeof s!="function")throw new k(`Graph.${i}: provided updater is not a function.`);return o.attributes=s(o.attributes),this.emit("nodeAttributesUpdated",{key:o.key,type:"update",attributes:o.attributes}),this}}const br=[{name:n=>`get${n}Attribute`,attacher:dr},{name:n=>`get${n}Attributes`,attacher:lr},{name:n=>`has${n}Attribute`,attacher:cr},{name:n=>`set${n}Attribute`,attacher:fr},{name:n=>`update${n}Attribute`,attacher:gr},{name:n=>`remove${n}Attribute`,attacher:pr},{name:n=>`replace${n}Attributes`,attacher:vr},{name:n=>`merge${n}Attributes`,attacher:mr},{name:n=>`update${n}Attributes`,attacher:yr}];function wr(n){br.forEach(function({name:i,attacher:t}){t(n,i("Node"),Ri),t(n,i("Source"),Ai),t(n,i("Target"),hr),t(n,i("Opposite"),xi)})}function Er(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return a.attributes[r]}}function _r(n,i,t){n.prototype[i]=function(e){let r;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>1){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const a=""+e,o=""+arguments[1];if(r=oe(this,a,o,t),!r)throw new C(`Graph.${i}: could not find an edge for the given path ("${a}" - "${o}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,r=this._edges.get(e),!r)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return r.attributes}}function Tr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return a.attributes.hasOwnProperty(r)}}function Sr(n,i,t){n.prototype[i]=function(e,r,a){let o;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>3){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const s=""+e,u=""+r;if(r=arguments[2],a=arguments[3],o=oe(this,s,u,t),!o)throw new C(`Graph.${i}: could not find an edge for the given path ("${s}" - "${u}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,o=this._edges.get(e),!o)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return o.attributes[r]=a,this.emit("edgeAttributesUpdated",{key:o.key,type:"set",attributes:o.attributes,name:r}),this}}function Rr(n,i,t){n.prototype[i]=function(e,r,a){let o;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>3){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const s=""+e,u=""+r;if(r=arguments[2],a=arguments[3],o=oe(this,s,u,t),!o)throw new C(`Graph.${i}: could not find an edge for the given path ("${s}" - "${u}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,o=this._edges.get(e),!o)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(typeof a!="function")throw new k(`Graph.${i}: updater should be a function.`);return o.attributes[r]=a(o.attributes[r]),this.emit("edgeAttributesUpdated",{key:o.key,type:"set",attributes:o.attributes,name:r}),this}}function Ar(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return delete a.attributes[r],this.emit("edgeAttributesUpdated",{key:a.key,type:"remove",attributes:a.attributes,name:r}),this}}function xr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(!J(r))throw new k(`Graph.${i}: provided attributes are not a plain object.`);return a.attributes=r,this.emit("edgeAttributesUpdated",{key:a.key,type:"replace",attributes:a.attributes}),this}}function Cr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(!J(r))throw new k(`Graph.${i}: provided attributes are not a plain object.`);return Z(a.attributes,r),this.emit("edgeAttributesUpdated",{key:a.key,type:"merge",attributes:a.attributes,data:r}),this}}function kr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(typeof r!="function")throw new k(`Graph.${i}: provided updater is not a function.`);return a.attributes=r(a.attributes),this.emit("edgeAttributesUpdated",{key:a.key,type:"update",attributes:a.attributes}),this}}const Dr=[{name:n=>`get${n}Attribute`,attacher:Er},{name:n=>`get${n}Attributes`,attacher:_r},{name:n=>`has${n}Attribute`,attacher:Tr},{name:n=>`set${n}Attribute`,attacher:Sr},{name:n=>`update${n}Attribute`,attacher:Rr},{name:n=>`remove${n}Attribute`,attacher:Ar},{name:n=>`replace${n}Attributes`,attacher:xr},{name:n=>`merge${n}Attributes`,attacher:Cr},{name:n=>`update${n}Attributes`,attacher:kr}];function Lr(n){Dr.forEach(function({name:i,attacher:t}){t(n,i("Edge"),"mixed"),t(n,i("DirectedEdge"),"directed"),t(n,i("UndirectedEdge"),"undirected")})}const Gr=[{name:"edges",type:"mixed"},{name:"inEdges",type:"directed",direction:"in"},{name:"outEdges",type:"directed",direction:"out"},{name:"inboundEdges",type:"mixed",direction:"in"},{name:"outboundEdges",type:"mixed",direction:"out"},{name:"directedEdges",type:"directed"},{name:"undirectedEdges",type:"undirected"}];function Fr(n,i,t,e){let r=!1;for(const a in i){if(a===e)continue;const o=i[a];if(r=t(o.key,o.attributes,o.source.key,o.target.key,o.source.attributes,o.target.attributes,o.undirected),n&&r)return o.key}}function Nr(n,i,t,e){let r,a,o,s=!1;for(const u in i)if(u!==e){r=i[u];do{if(a=r.source,o=r.target,s=t(r.key,r.attributes,a.key,o.key,a.attributes,o.attributes,r.undirected),n&&s)return r.key;r=r.next}while(r!==void 0)}}function lt(n,i){const t=Object.keys(n),e=t.length;let r,a=0;return{[Symbol.iterator](){return this},next(){do if(r)r=r.next;else{if(a>=e)return{done:!0};const o=t[a++];if(o===i){r=void 0;continue}r=n[o]}while(!r);return{done:!1,value:{edge:r.key,attributes:r.attributes,source:r.source.key,target:r.target.key,sourceAttributes:r.source.attributes,targetAttributes:r.target.attributes,undirected:r.undirected}}}}}function Pr(n,i,t,e){const r=i[t];if(!r)return;const a=r.source,o=r.target;if(e(r.key,r.attributes,a.key,o.key,a.attributes,o.attributes,r.undirected)&&n)return r.key}function Ir(n,i,t,e){let r=i[t];if(!r)return;let a=!1;do{if(a=e(r.key,r.attributes,r.source.key,r.target.key,r.source.attributes,r.target.attributes,r.undirected),n&&a)return r.key;r=r.next}while(r!==void 0)}function ct(n,i){let t=n[i];if(t.next!==void 0)return{[Symbol.iterator](){return this},next(){if(!t)return{done:!0};const r={edge:t.key,attributes:t.attributes,source:t.source.key,target:t.target.key,sourceAttributes:t.source.attributes,targetAttributes:t.target.attributes,undirected:t.undirected};return t=t.next,{done:!1,value:r}}};let e=!1;return{[Symbol.iterator](){return this},next(){return e===!0?{done:!0}:(e=!0,{done:!1,value:{edge:t.key,attributes:t.attributes,source:t.source.key,target:t.target.key,sourceAttributes:t.source.attributes,targetAttributes:t.target.attributes,undirected:t.undirected}})}}}function Or(n,i){if(n.size===0)return[];if(i==="mixed"||i===n.type)return Array.from(n._edges.keys());const t=i==="undirected"?n.undirectedSize:n.directedSize,e=new Array(t),r=i==="undirected",a=n._edges.values();let o=0,s,u;for(;s=a.next(),s.done!==!0;)u=s.value,u.undirected===r&&(e[o++]=u.key);return e}function Ci(n,i,t,e){if(i.size===0)return;const r=t!=="mixed"&&t!==i.type,a=t==="undirected";let o,s,u=!1;const h=i._edges.values();for(;o=h.next(),o.done!==!0;){if(s=o.value,r&&s.undirected!==a)continue;const{key:d,attributes:l,source:f,target:c}=s;if(u=e(d,l,f.key,c.key,f.attributes,c.attributes,s.undirected),n&&u)return d}}function Ur(n,i){if(n.size===0)return Le();const t=i!=="mixed"&&i!==n.type,e=i==="undirected",r=n._edges.values();return{[Symbol.iterator](){return this},next(){let a,o;for(;;){if(a=r.next(),a.done)return a;if(o=a.value,!(t&&o.undirected!==e))break}return{value:{edge:o.key,attributes:o.attributes,source:o.source.key,target:o.target.key,sourceAttributes:o.source.attributes,targetAttributes:o.target.attributes,undirected:o.undirected},done:!1}}}}function Gt(n,i,t,e,r,a){const o=i?Nr:Fr;let s;if(t!=="undirected"&&(e!=="out"&&(s=o(n,r.in,a),n&&s)||e!=="in"&&(s=o(n,r.out,a,e?void 0:r.key),n&&s))||t!=="directed"&&(s=o(n,r.undirected,a),n&&s))return s}function zr(n,i,t,e){const r=[];return Gt(!1,n,i,t,e,function(a){r.push(a)}),r}function $r(n,i,t){let e=Le();return n!=="undirected"&&(i!=="out"&&typeof t.in<"u"&&(e=me(e,lt(t.in))),i!=="in"&&typeof t.out<"u"&&(e=me(e,lt(t.out,i?void 0:t.key)))),n!=="directed"&&typeof t.undirected<"u"&&(e=me(e,lt(t.undirected))),e}function Ft(n,i,t,e,r,a,o){const s=t?Ir:Pr;let u;if(i!=="undirected"&&(typeof r.in<"u"&&e!=="out"&&(u=s(n,r.in,a,o),n&&u)||typeof r.out<"u"&&e!=="in"&&(e||r.key!==a)&&(u=s(n,r.out,a,o),n&&u))||i!=="directed"&&typeof r.undirected<"u"&&(u=s(n,r.undirected,a,o),n&&u))return u}function Br(n,i,t,e,r){const a=[];return Ft(!1,n,i,t,e,r,function(o){a.push(o)}),a}function Mr(n,i,t,e){let r=Le();return n!=="undirected"&&(typeof t.in<"u"&&i!=="out"&&e in t.in&&(r=me(r,ct(t.in,e))),typeof t.out<"u"&&i!=="in"&&e in t.out&&(i||t.key!==e)&&(r=me(r,ct(t.out,e)))),n!=="directed"&&typeof t.undirected<"u"&&e in t.undirected&&(r=me(r,ct(t.undirected,e))),r}function Hr(n,i){const{name:t,type:e,direction:r}=i;n.prototype[t]=function(a,o){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return[];if(!arguments.length)return Or(this,e);if(arguments.length===1){a=""+a;const s=this._nodes.get(a);if(typeof s>"u")throw new C(`Graph.${t}: could not find the "${a}" node in the graph.`);return zr(this.multi,e==="mixed"?this.type:e,r,s)}if(arguments.length===2){a=""+a,o=""+o;const s=this._nodes.get(a);if(!s)throw new C(`Graph.${t}: could not find the "${a}" source node in the graph.`);if(!this._nodes.has(o))throw new C(`Graph.${t}: could not find the "${o}" target node in the graph.`);return Br(e,this.multi,r,s,o)}throw new k(`Graph.${t}: too many arguments (expecting 0, 1 or 2 and got ${arguments.length}).`)}}function Wr(n,i){const{name:t,type:e,direction:r}=i,a="forEach"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[a]=function(h,d,l){if(!(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)){if(arguments.length===1)return l=h,Ci(!1,this,e,l);if(arguments.length===2){h=""+h,l=d;const f=this._nodes.get(h);if(typeof f>"u")throw new C(`Graph.${a}: could not find the "${h}" node in the graph.`);return Gt(!1,this.multi,e==="mixed"?this.type:e,r,f,l)}if(arguments.length===3){h=""+h,d=""+d;const f=this._nodes.get(h);if(!f)throw new C(`Graph.${a}: could not find the "${h}" source node in the graph.`);if(!this._nodes.has(d))throw new C(`Graph.${a}: could not find the "${d}" target node in the graph.`);return Ft(!1,e,this.multi,r,f,d,l)}throw new k(`Graph.${a}: too many arguments (expecting 1, 2 or 3 and got ${arguments.length}).`)}};const o="map"+t[0].toUpperCase()+t.slice(1);n.prototype[o]=function(){const h=Array.prototype.slice.call(arguments),d=h.pop();let l;if(h.length===0){let f=0;e!=="directed"&&(f+=this.undirectedSize),e!=="undirected"&&(f+=this.directedSize),l=new Array(f);let c=0;h.push((y,w,T,D,m,S,p)=>{l[c++]=d(y,w,T,D,m,S,p)})}else l=[],h.push((f,c,y,w,T,D,m)=>{l.push(d(f,c,y,w,T,D,m))});return this[a].apply(this,h),l};const s="filter"+t[0].toUpperCase()+t.slice(1);n.prototype[s]=function(){const h=Array.prototype.slice.call(arguments),d=h.pop(),l=[];return h.push((f,c,y,w,T,D,m)=>{d(f,c,y,w,T,D,m)&&l.push(f)}),this[a].apply(this,h),l};const u="reduce"+t[0].toUpperCase()+t.slice(1);n.prototype[u]=function(){let h=Array.prototype.slice.call(arguments);if(h.length<2||h.length>4)throw new k(`Graph.${u}: invalid number of arguments (expecting 2, 3 or 4 and got ${h.length}).`);if(typeof h[h.length-1]=="function"&&typeof h[h.length-2]!="function")throw new k(`Graph.${u}: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.`);let d,l;h.length===2?(d=h[0],l=h[1],h=[]):h.length===3?(d=h[1],l=h[2],h=[h[0]]):h.length===4&&(d=h[2],l=h[3],h=[h[0],h[1]]);let f=l;return h.push((c,y,w,T,D,m,S)=>{f=d(f,c,y,w,T,D,m,S)}),this[a].apply(this,h),f}}function jr(n,i){const{name:t,type:e,direction:r}=i,a="find"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[a]=function(u,h,d){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return!1;if(arguments.length===1)return d=u,Ci(!0,this,e,d);if(arguments.length===2){u=""+u,d=h;const l=this._nodes.get(u);if(typeof l>"u")throw new C(`Graph.${a}: could not find the "${u}" node in the graph.`);return Gt(!0,this.multi,e==="mixed"?this.type:e,r,l,d)}if(arguments.length===3){u=""+u,h=""+h;const l=this._nodes.get(u);if(!l)throw new C(`Graph.${a}: could not find the "${u}" source node in the graph.`);if(!this._nodes.has(h))throw new C(`Graph.${a}: could not find the "${h}" target node in the graph.`);return Ft(!0,e,this.multi,r,l,h,d)}throw new k(`Graph.${a}: too many arguments (expecting 1, 2 or 3 and got ${arguments.length}).`)};const o="some"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[o]=function(){const u=Array.prototype.slice.call(arguments),h=u.pop();return u.push((l,f,c,y,w,T,D)=>h(l,f,c,y,w,T,D)),!!this[a].apply(this,u)};const s="every"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[s]=function(){const u=Array.prototype.slice.call(arguments),h=u.pop();return u.push((l,f,c,y,w,T,D)=>!h(l,f,c,y,w,T,D)),!this[a].apply(this,u)}}function Vr(n,i){const{name:t,type:e,direction:r}=i,a=t.slice(0,-1)+"Entries";n.prototype[a]=function(o,s){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return Le();if(!arguments.length)return Ur(this,e);if(arguments.length===1){o=""+o;const u=this._nodes.get(o);if(!u)throw new C(`Graph.${a}: could not find the "${o}" node in the graph.`);return $r(e,r,u)}if(arguments.length===2){o=""+o,s=""+s;const u=this._nodes.get(o);if(!u)throw new C(`Graph.${a}: could not find the "${o}" source node in the graph.`);if(!this._nodes.has(s))throw new C(`Graph.${a}: could not find the "${s}" target node in the graph.`);return Mr(e,r,u,s)}throw new k(`Graph.${a}: too many arguments (expecting 0, 1 or 2 and got ${arguments.length}).`)}}function qr(n){Gr.forEach(i=>{Hr(n,i),Wr(n,i),jr(n,i),Vr(n,i)})}const Kr=[{name:"neighbors",type:"mixed"},{name:"inNeighbors",type:"directed",direction:"in"},{name:"outNeighbors",type:"directed",direction:"out"},{name:"inboundNeighbors",type:"mixed",direction:"in"},{name:"outboundNeighbors",type:"mixed",direction:"out"},{name:"directedNeighbors",type:"directed"},{name:"undirectedNeighbors",type:"undirected"}];function ut(){this.A=null,this.B=null}ut.prototype.wrap=function(n){this.A===null?this.A=n:this.B===null&&(this.B=n)};ut.prototype.has=function(n){return this.A!==null&&n in this.A||this.B!==null&&n in this.B};function Oe(n,i,t,e,r){for(const a in e){const o=e[a],s=o.source,u=o.target,h=s===t?u:s;if(i&&i.has(h.key))continue;const d=r(h.key,h.attributes);if(n&&d)return h.key}}function Nt(n,i,t,e,r){if(i!=="mixed"){if(i==="undirected")return Oe(n,null,e,e.undirected,r);if(typeof t=="string")return Oe(n,null,e,e[t],r)}const a=new ut;let o;if(i!=="undirected"){if(t!=="out"){if(o=Oe(n,null,e,e.in,r),n&&o)return o;a.wrap(e.in)}if(t!=="in"){if(o=Oe(n,a,e,e.out,r),n&&o)return o;a.wrap(e.out)}}if(i!=="directed"&&(o=Oe(n,a,e,e.undirected,r),n&&o))return o}function Yr(n,i,t){if(n!=="mixed"){if(n==="undirected")return Object.keys(t.undirected);if(typeof i=="string")return Object.keys(t[i])}const e=[];return Nt(!1,n,i,t,function(r){e.push(r)}),e}function Ue(n,i,t){const e=Object.keys(t),r=e.length;let a=0;return{[Symbol.iterator](){return this},next(){let o=null;do{if(a>=r)return n&&n.wrap(t),{done:!0};const s=t[e[a++]],u=s.source,h=s.target;if(o=u===i?h:u,n&&n.has(o.key)){o=null;continue}}while(o===null);return{done:!1,value:{neighbor:o.key,attributes:o.attributes}}}}}function Zr(n,i,t){if(n!=="mixed"){if(n==="undirected")return Ue(null,t,t.undirected);if(typeof i=="string")return Ue(null,t,t[i])}let e=Le();const r=new ut;return n!=="undirected"&&(i!=="out"&&(e=me(e,Ue(r,t,t.in))),i!=="in"&&(e=me(e,Ue(r,t,t.out)))),n!=="directed"&&(e=me(e,Ue(r,t,t.undirected))),e}function Xr(n,i){const{name:t,type:e,direction:r}=i;n.prototype[t]=function(a){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return[];a=""+a;const o=this._nodes.get(a);if(typeof o>"u")throw new C(`Graph.${t}: could not find the "${a}" node in the graph.`);return Yr(e==="mixed"?this.type:e,r,o)}}function Jr(n,i){const{name:t,type:e,direction:r}=i,a="forEach"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[a]=function(h,d){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return;h=""+h;const l=this._nodes.get(h);if(typeof l>"u")throw new C(`Graph.${a}: could not find the "${h}" node in the graph.`);Nt(!1,e==="mixed"?this.type:e,r,l,d)};const o="map"+t[0].toUpperCase()+t.slice(1);n.prototype[o]=function(h,d){const l=[];return this[a](h,(f,c)=>{l.push(d(f,c))}),l};const s="filter"+t[0].toUpperCase()+t.slice(1);n.prototype[s]=function(h,d){const l=[];return this[a](h,(f,c)=>{d(f,c)&&l.push(f)}),l};const u="reduce"+t[0].toUpperCase()+t.slice(1);n.prototype[u]=function(h,d,l){if(arguments.length<3)throw new k(`Graph.${u}: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.`);let f=l;return this[a](h,(c,y)=>{f=d(f,c,y)}),f}}function Qr(n,i){const{name:t,type:e,direction:r}=i,a=t[0].toUpperCase()+t.slice(1,-1),o="find"+a;n.prototype[o]=function(h,d){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return;h=""+h;const l=this._nodes.get(h);if(typeof l>"u")throw new C(`Graph.${o}: could not find the "${h}" node in the graph.`);return Nt(!0,e==="mixed"?this.type:e,r,l,d)};const s="some"+a;n.prototype[s]=function(h,d){return!!this[o](h,d)};const u="every"+a;n.prototype[u]=function(h,d){return!this[o](h,(f,c)=>!d(f,c))}}function en(n,i){const{name:t,type:e,direction:r}=i,a=t.slice(0,-1)+"Entries";n.prototype[a]=function(o){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return Le();o=""+o;const s=this._nodes.get(o);if(typeof s>"u")throw new C(`Graph.${a}: could not find the "${o}" node in the graph.`);return Zr(e==="mixed"?this.type:e,r,s)}}function tn(n){Kr.forEach(i=>{Xr(n,i),Jr(n,i),Qr(n,i),en(n,i)})}function tt(n,i,t,e,r){const a=e._nodes.values(),o=e.type;let s,u,h,d,l,f;for(;s=a.next(),s.done!==!0;){let c=!1;if(u=s.value,o!=="undirected"){d=u.out;for(h in d){l=d[h];do f=l.target,c=!0,r(u.key,f.key,u.attributes,f.attributes,l.key,l.attributes,l.undirected),l=l.next;while(l)}}if(o!=="directed"){d=u.undirected;for(h in d)if(!(i&&u.key>h)){l=d[h];do f=l.target,f.key!==h&&(f=l.source),c=!0,r(u.key,f.key,u.attributes,f.attributes,l.key,l.attributes,l.undirected),l=l.next;while(l)}}t&&!c&&r(u.key,null,u.attributes,null,null,null,null)}}function rn(n,i){const t={key:n};return Ei(i.attributes)||(t.attributes=Z({},i.attributes)),t}function nn(n,i,t){const e={key:i,source:t.source.key,target:t.target.key};return Ei(t.attributes)||(e.attributes=Z({},t.attributes)),n==="mixed"&&t.undirected&&(e.undirected=!0),e}function an(n){if(!J(n))throw new k('Graph.import: invalid serialized node. A serialized node should be a plain object with at least a "key" property.');if(!("key"in n))throw new k("Graph.import: serialized node is missing its key.");if("attributes"in n&&(!J(n.attributes)||n.attributes===null))throw new k("Graph.import: invalid attributes. Attributes should be a plain object, null or omitted.")}function on(n){if(!J(n))throw new k('Graph.import: invalid serialized edge. A serialized edge should be a plain object with at least a "source" & "target" property.');if(!("source"in n))throw new k("Graph.import: serialized edge is missing its source.");if(!("target"in n))throw new k("Graph.import: serialized edge is missing its target.");if("attributes"in n&&(!J(n.attributes)||n.attributes===null))throw new k("Graph.import: invalid attributes. Attributes should be a plain object, null or omitted.");if("undirected"in n&&typeof n.undirected!="boolean")throw new k("Graph.import: invalid undirectedness information. Undirected should be boolean or omitted.")}const sn=ur(),un=new Set(["directed","undirected","mixed"]),Bt=new Set(["domain","_events","_eventsCount","_maxListeners"]),hn=[{name:n=>`${n}Edge`,generateKey:!0},{name:n=>`${n}DirectedEdge`,generateKey:!0,type:"directed"},{name:n=>`${n}UndirectedEdge`,generateKey:!0,type:"undirected"},{name:n=>`${n}EdgeWithKey`},{name:n=>`${n}DirectedEdgeWithKey`,type:"directed"},{name:n=>`${n}UndirectedEdgeWithKey`,type:"undirected"}],dn={allowSelfLoops:!0,multi:!1,type:"mixed"};function ln(n,i,t){if(t&&!J(t))throw new k(`Graph.addNode: invalid attributes. Expecting an object but got "${t}"`);if(i=""+i,t=t||{},n._nodes.has(i))throw new I(`Graph.addNode: the "${i}" node already exist in the graph.`);const e=new n.NodeDataClass(i,t);return n._nodes.set(i,e),n.emit("nodeAdded",{key:i,attributes:t}),e}function Mt(n,i,t){const e=new n.NodeDataClass(i,t);return n._nodes.set(i,e),n.emit("nodeAdded",{key:i,attributes:t}),e}function ki(n,i,t,e,r,a,o,s){if(!e&&n.type==="undirected")throw new I(`Graph.${i}: you cannot add a directed edge to an undirected graph. Use the #.addEdge or #.addUndirectedEdge instead.`);if(e&&n.type==="directed")throw new I(`Graph.${i}: you cannot add an undirected edge to a directed graph. Use the #.addEdge or #.addDirectedEdge instead.`);if(s&&!J(s))throw new k(`Graph.${i}: invalid attributes. Expecting an object but got "${s}"`);if(a=""+a,o=""+o,s=s||{},!n.allowSelfLoops&&a===o)throw new I(`Graph.${i}: source & target are the same ("${a}"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.`);const u=n._nodes.get(a),h=n._nodes.get(o);if(!u)throw new C(`Graph.${i}: source node "${a}" not found.`);if(!h)throw new C(`Graph.${i}: target node "${o}" not found.`);const d={key:null,undirected:e,source:a,target:o,attributes:s};if(t)r=n._edgeKeyGenerator();else if(r=""+r,n._edges.has(r))throw new I(`Graph.${i}: the "${r}" edge already exists in the graph.`);if(!n.multi&&(e?typeof u.undirected[o]<"u":typeof u.out[o]<"u"))throw new I(`Graph.${i}: an edge linking "${a}" to "${o}" already exists. If you really want to add multiple edges linking those nodes, you should create a multi graph by using the 'multi' option.`);const l=new Ge(e,r,u,h,s);n._edges.set(r,l);const f=a===o;return e?(u.undirectedDegree++,h.undirectedDegree++,f&&(u.undirectedLoops++,n._undirectedSelfLoopCount++)):(u.outDegree++,h.inDegree++,f&&(u.directedLoops++,n._directedSelfLoopCount++)),n.multi?l.attachMulti():l.attach(),e?n._undirectedSize++:n._directedSize++,d.key=r,n.emit("edgeAdded",d),r}function cn(n,i,t,e,r,a,o,s,u){if(!e&&n.type==="undirected")throw new I(`Graph.${i}: you cannot merge/update a directed edge to an undirected graph. Use the #.mergeEdge/#.updateEdge or #.addUndirectedEdge instead.`);if(e&&n.type==="directed")throw new I(`Graph.${i}: you cannot merge/update an undirected edge to a directed graph. Use the #.mergeEdge/#.updateEdge or #.addDirectedEdge instead.`);if(s){if(u){if(typeof s!="function")throw new k(`Graph.${i}: invalid updater function. Expecting a function but got "${s}"`)}else if(!J(s))throw new k(`Graph.${i}: invalid attributes. Expecting an object but got "${s}"`)}a=""+a,o=""+o;let h;if(u&&(h=s,s=void 0),!n.allowSelfLoops&&a===o)throw new I(`Graph.${i}: source & target are the same ("${a}"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.`);let d=n._nodes.get(a),l=n._nodes.get(o),f,c;if(!t&&(f=n._edges.get(r),f)){if((f.source.key!==a||f.target.key!==o)&&(!e||f.source.key!==o||f.target.key!==a))throw new I(`Graph.${i}: inconsistency detected when attempting to merge the "${r}" edge with "${a}" source & "${o}" target vs. ("${f.source.key}", "${f.target.key}").`);c=f}if(!c&&!n.multi&&d&&(c=e?d.undirected[o]:d.out[o]),c){const m=[c.key,!1,!1,!1];if(u?!h:!s)return m;if(u){const S=c.attributes;c.attributes=h(S),n.emit("edgeAttributesUpdated",{type:"replace",key:c.key,attributes:c.attributes})}else Z(c.attributes,s),n.emit("edgeAttributesUpdated",{type:"merge",key:c.key,attributes:c.attributes,data:s});return m}s=s||{},u&&h&&(s=h(s));const y={key:null,undirected:e,source:a,target:o,attributes:s};if(t)r=n._edgeKeyGenerator();else if(r=""+r,n._edges.has(r))throw new I(`Graph.${i}: the "${r}" edge already exists in the graph.`);let w=!1,T=!1;d||(d=Mt(n,a,{}),w=!0,a===o&&(l=d,T=!0)),l||(l=Mt(n,o,{}),T=!0),f=new Ge(e,r,d,l,s),n._edges.set(r,f);const D=a===o;return e?(d.undirectedDegree++,l.undirectedDegree++,D&&(d.undirectedLoops++,n._undirectedSelfLoopCount++)):(d.outDegree++,l.inDegree++,D&&(d.directedLoops++,n._directedSelfLoopCount++)),n.multi?f.attachMulti():f.attach(),e?n._undirectedSize++:n._directedSize++,y.key=r,n.emit("edgeAdded",y),[r,!0,w,T]}function xe(n,i){n._edges.delete(i.key);const{source:t,target:e,attributes:r}=i,a=i.undirected,o=t===e;a?(t.undirectedDegree--,e.undirectedDegree--,o&&(t.undirectedLoops--,n._undirectedSelfLoopCount--)):(t.outDegree--,e.inDegree--,o&&(t.directedLoops--,n._directedSelfLoopCount--)),n.multi?i.detachMulti():i.detach(),a?n._undirectedSize--:n._directedSize--,n.emit("edgeDropped",{key:i.key,attributes:r,source:t.key,target:e.key,undirected:a})}class j extends wi.EventEmitter{constructor(i){if(super(),i=Z({},dn,i),typeof i.multi!="boolean")throw new k(`Graph.constructor: invalid 'multi' option. Expecting a boolean but got "${i.multi}".`);if(!un.has(i.type))throw new k(`Graph.constructor: invalid 'type' option. Should be one of "mixed", "directed" or "undirected" but got "${i.type}".`);if(typeof i.allowSelfLoops!="boolean")throw new k(`Graph.constructor: invalid 'allowSelfLoops' option. Expecting a boolean but got "${i.allowSelfLoops}".`);const t=i.type==="mixed"?_i:i.type==="directed"?Ti:Si;ae(this,"NodeDataClass",t);const e="geid_"+sn()+"_";let r=0;const a=()=>{let o;do o=e+r++;while(this._edges.has(o));return o};ae(this,"_attributes",{}),ae(this,"_nodes",new Map),ae(this,"_edges",new Map),ae(this,"_directedSize",0),ae(this,"_undirectedSize",0),ae(this,"_directedSelfLoopCount",0),ae(this,"_undirectedSelfLoopCount",0),ae(this,"_edgeKeyGenerator",a),ae(this,"_options",i),Bt.forEach(o=>ae(this,o,this[o])),he(this,"order",()=>this._nodes.size),he(this,"size",()=>this._edges.size),he(this,"directedSize",()=>this._directedSize),he(this,"undirectedSize",()=>this._undirectedSize),he(this,"selfLoopCount",()=>this._directedSelfLoopCount+this._undirectedSelfLoopCount),he(this,"directedSelfLoopCount",()=>this._directedSelfLoopCount),he(this,"undirectedSelfLoopCount",()=>this._undirectedSelfLoopCount),he(this,"multi",this._options.multi),he(this,"type",this._options.type),he(this,"allowSelfLoops",this._options.allowSelfLoops),he(this,"implementation",()=>"graphology")}_resetInstanceCounters(){this._directedSize=0,this._undirectedSize=0,this._directedSelfLoopCount=0,this._undirectedSelfLoopCount=0}hasNode(i){return this._nodes.has(""+i)}hasDirectedEdge(i,t){if(this.type==="undirected")return!1;if(arguments.length===1){const e=""+i,r=this._edges.get(e);return!!r&&!r.undirected}else if(arguments.length===2){i=""+i,t=""+t;const e=this._nodes.get(i);return e?e.out.hasOwnProperty(t):!1}throw new k(`Graph.hasDirectedEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`)}hasUndirectedEdge(i,t){if(this.type==="directed")return!1;if(arguments.length===1){const e=""+i,r=this._edges.get(e);return!!r&&r.undirected}else if(arguments.length===2){i=""+i,t=""+t;const e=this._nodes.get(i);return e?e.undirected.hasOwnProperty(t):!1}throw new k(`Graph.hasDirectedEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`)}hasEdge(i,t){if(arguments.length===1){const e=""+i;return this._edges.has(e)}else if(arguments.length===2){i=""+i,t=""+t;const e=this._nodes.get(i);return e?typeof e.out<"u"&&e.out.hasOwnProperty(t)||typeof e.undirected<"u"&&e.undirected.hasOwnProperty(t):!1}throw new k(`Graph.hasEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`)}directedEdge(i,t){if(this.type==="undirected")return;if(i=""+i,t=""+t,this.multi)throw new I("Graph.directedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.directedEdges instead.");const e=this._nodes.get(i);if(!e)throw new C(`Graph.directedEdge: could not find the "${i}" source node in the graph.`);if(!this._nodes.has(t))throw new C(`Graph.directedEdge: could not find the "${t}" target node in the graph.`);const r=e.out&&e.out[t]||void 0;if(r)return r.key}undirectedEdge(i,t){if(this.type==="directed")return;if(i=""+i,t=""+t,this.multi)throw new I("Graph.undirectedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.undirectedEdges instead.");const e=this._nodes.get(i);if(!e)throw new C(`Graph.undirectedEdge: could not find the "${i}" source node in the graph.`);if(!this._nodes.has(t))throw new C(`Graph.undirectedEdge: could not find the "${t}" target node in the graph.`);const r=e.undirected&&e.undirected[t]||void 0;if(r)return r.key}edge(i,t){if(this.multi)throw new I("Graph.edge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.edges instead.");i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.edge: could not find the "${i}" source node in the graph.`);if(!this._nodes.has(t))throw new C(`Graph.edge: could not find the "${t}" target node in the graph.`);const r=e.out&&e.out[t]||e.undirected&&e.undirected[t]||void 0;if(r)return r.key}areDirectedNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areDirectedNeighbors: could not find the "${i}" node in the graph.`);return this.type==="undirected"?!1:t in e.in||t in e.out}areOutNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areOutNeighbors: could not find the "${i}" node in the graph.`);return this.type==="undirected"?!1:t in e.out}areInNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areInNeighbors: could not find the "${i}" node in the graph.`);return this.type==="undirected"?!1:t in e.in}areUndirectedNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areUndirectedNeighbors: could not find the "${i}" node in the graph.`);return this.type==="directed"?!1:t in e.undirected}areNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areNeighbors: could not find the "${i}" node in the graph.`);return this.type!=="undirected"&&(t in e.in||t in e.out)||this.type!=="directed"&&t in e.undirected}areInboundNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areInboundNeighbors: could not find the "${i}" node in the graph.`);return this.type!=="undirected"&&t in e.in||this.type!=="directed"&&t in e.undirected}areOutboundNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areOutboundNeighbors: could not find the "${i}" node in the graph.`);return this.type!=="undirected"&&t in e.out||this.type!=="directed"&&t in e.undirected}inDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.inDegree: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree}outDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.outDegree: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.outDegree}directedDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.directedDegree: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree+t.outDegree}undirectedDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.undirectedDegree: could not find the "${i}" node in the graph.`);return this.type==="directed"?0:t.undirectedDegree}inboundDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.inboundDegree: could not find the "${i}" node in the graph.`);let e=0;return this.type!=="directed"&&(e+=t.undirectedDegree),this.type!=="undirected"&&(e+=t.inDegree),e}outboundDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.outboundDegree: could not find the "${i}" node in the graph.`);let e=0;return this.type!=="directed"&&(e+=t.undirectedDegree),this.type!=="undirected"&&(e+=t.outDegree),e}degree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.degree: could not find the "${i}" node in the graph.`);let e=0;return this.type!=="directed"&&(e+=t.undirectedDegree),this.type!=="undirected"&&(e+=t.inDegree+t.outDegree),e}inDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.inDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree-t.directedLoops}outDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.outDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.outDegree-t.directedLoops}directedDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.directedDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree+t.outDegree-t.directedLoops*2}undirectedDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.undirectedDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="directed"?0:t.undirectedDegree-t.undirectedLoops*2}inboundDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.inboundDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);let e=0,r=0;return this.type!=="directed"&&(e+=t.undirectedDegree,r+=t.undirectedLoops*2),this.type!=="undirected"&&(e+=t.inDegree,r+=t.directedLoops),e-r}outboundDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.outboundDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);let e=0,r=0;return this.type!=="directed"&&(e+=t.undirectedDegree,r+=t.undirectedLoops*2),this.type!=="undirected"&&(e+=t.outDegree,r+=t.directedLoops),e-r}degreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.degreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);let e=0,r=0;return this.type!=="directed"&&(e+=t.undirectedDegree,r+=t.undirectedLoops*2),this.type!=="undirected"&&(e+=t.inDegree+t.outDegree,r+=t.directedLoops*2),e-r}source(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.source: could not find the "${i}" edge in the graph.`);return t.source.key}target(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.target: could not find the "${i}" edge in the graph.`);return t.target.key}extremities(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.extremities: could not find the "${i}" edge in the graph.`);return[t.source.key,t.target.key]}opposite(i,t){i=""+i,t=""+t;const e=this._edges.get(t);if(!e)throw new C(`Graph.opposite: could not find the "${t}" edge in the graph.`);const r=e.source.key,a=e.target.key;if(i===r)return a;if(i===a)return r;throw new C(`Graph.opposite: the "${i}" node is not attached to the "${t}" edge (${r}, ${a}).`)}hasExtremity(i,t){i=""+i,t=""+t;const e=this._edges.get(i);if(!e)throw new C(`Graph.hasExtremity: could not find the "${i}" edge in the graph.`);return e.source.key===t||e.target.key===t}isUndirected(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.isUndirected: could not find the "${i}" edge in the graph.`);return t.undirected}isDirected(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.isDirected: could not find the "${i}" edge in the graph.`);return!t.undirected}isSelfLoop(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.isSelfLoop: could not find the "${i}" edge in the graph.`);return t.source===t.target}addNode(i,t){return ln(this,i,t).key}mergeNode(i,t){if(t&&!J(t))throw new k(`Graph.mergeNode: invalid attributes. Expecting an object but got "${t}"`);i=""+i,t=t||{};let e=this._nodes.get(i);return e?(t&&(Z(e.attributes,t),this.emit("nodeAttributesUpdated",{type:"merge",key:i,attributes:e.attributes,data:t})),[i,!1]):(e=new this.NodeDataClass(i,t),this._nodes.set(i,e),this.emit("nodeAdded",{key:i,attributes:t}),[i,!0])}updateNode(i,t){if(t&&typeof t!="function")throw new k(`Graph.updateNode: invalid updater function. Expecting a function but got "${t}"`);i=""+i;let e=this._nodes.get(i);if(e){if(t){const a=e.attributes;e.attributes=t(a),this.emit("nodeAttributesUpdated",{type:"replace",key:i,attributes:e.attributes})}return[i,!1]}const r=t?t({}):{};return e=new this.NodeDataClass(i,r),this._nodes.set(i,e),this.emit("nodeAdded",{key:i,attributes:r}),[i,!0]}dropNode(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.dropNode: could not find the "${i}" node in the graph.`);let e;if(this.type!=="undirected"){for(const r in t.out){e=t.out[r];do xe(this,e),e=e.next;while(e)}for(const r in t.in){e=t.in[r];do xe(this,e),e=e.next;while(e)}}if(this.type!=="directed")for(const r in t.undirected){e=t.undirected[r];do xe(this,e),e=e.next;while(e)}this._nodes.delete(i),this.emit("nodeDropped",{key:i,attributes:t.attributes})}dropEdge(i){let t;if(arguments.length>1){const e=""+arguments[0],r=""+arguments[1];if(t=oe(this,e,r,this.type),!t)throw new C(`Graph.dropEdge: could not find the "${e}" -> "${r}" edge in the graph.`)}else if(i=""+i,t=this._edges.get(i),!t)throw new C(`Graph.dropEdge: could not find the "${i}" edge in the graph.`);return xe(this,t),this}dropDirectedEdge(i,t){if(arguments.length<2)throw new I("Graph.dropDirectedEdge: it does not make sense to try and drop a directed edge by key. What if the edge with this key is undirected? Use #.dropEdge for this purpose instead.");if(this.multi)throw new I("Graph.dropDirectedEdge: cannot use a {source,target} combo when dropping an edge in a MultiGraph since we cannot infer the one you want to delete as there could be multiple ones.");i=""+i,t=""+t;const e=oe(this,i,t,"directed");if(!e)throw new C(`Graph.dropDirectedEdge: could not find a "${i}" -> "${t}" edge in the graph.`);return xe(this,e),this}dropUndirectedEdge(i,t){if(arguments.length<2)throw new I("Graph.dropUndirectedEdge: it does not make sense to drop a directed edge by key. What if the edge with this key is undirected? Use #.dropEdge for this purpose instead.");if(this.multi)throw new I("Graph.dropUndirectedEdge: cannot use a {source,target} combo when dropping an edge in a MultiGraph since we cannot infer the one you want to delete as there could be multiple ones.");const e=oe(this,i,t,"undirected");if(!e)throw new C(`Graph.dropUndirectedEdge: could not find a "${i}" -> "${t}" edge in the graph.`);return xe(this,e),this}clear(){this._edges.clear(),this._nodes.clear(),this._resetInstanceCounters(),this.emit("cleared")}clearEdges(){const i=this._nodes.values();let t;for(;t=i.next(),t.done!==!0;)t.value.clear();this._edges.clear(),this._resetInstanceCounters(),this.emit("edgesCleared")}getAttribute(i){return this._attributes[i]}getAttributes(){return this._attributes}hasAttribute(i){return this._attributes.hasOwnProperty(i)}setAttribute(i,t){return this._attributes[i]=t,this.emit("attributesUpdated",{type:"set",attributes:this._attributes,name:i}),this}updateAttribute(i,t){if(typeof t!="function")throw new k("Graph.updateAttribute: updater should be a function.");const e=this._attributes[i];return this._attributes[i]=t(e),this.emit("attributesUpdated",{type:"set",attributes:this._attributes,name:i}),this}removeAttribute(i){return delete this._attributes[i],this.emit("attributesUpdated",{type:"remove",attributes:this._attributes,name:i}),this}replaceAttributes(i){if(!J(i))throw new k("Graph.replaceAttributes: provided attributes are not a plain object.");return this._attributes=i,this.emit("attributesUpdated",{type:"replace",attributes:this._attributes}),this}mergeAttributes(i){if(!J(i))throw new k("Graph.mergeAttributes: provided attributes are not a plain object.");return Z(this._attributes,i),this.emit("attributesUpdated",{type:"merge",attributes:this._attributes,data:i}),this}updateAttributes(i){if(typeof i!="function")throw new k("Graph.updateAttributes: provided updater is not a function.");return this._attributes=i(this._attributes),this.emit("attributesUpdated",{type:"update",attributes:this._attributes}),this}updateEachNodeAttributes(i,t){if(typeof i!="function")throw new k("Graph.updateEachNodeAttributes: expecting an updater function.");if(t&&!$t(t))throw new k("Graph.updateEachNodeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}");const e=this._nodes.values();let r,a;for(;r=e.next(),r.done!==!0;)a=r.value,a.attributes=i(a.key,a.attributes);this.emit("eachNodeAttributesUpdated",{hints:t||null})}updateEachEdgeAttributes(i,t){if(typeof i!="function")throw new k("Graph.updateEachEdgeAttributes: expecting an updater function.");if(t&&!$t(t))throw new k("Graph.updateEachEdgeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}");const e=this._edges.values();let r,a,o,s;for(;r=e.next(),r.done!==!0;)a=r.value,o=a.source,s=a.target,a.attributes=i(a.key,a.attributes,o.key,s.key,o.attributes,s.attributes,a.undirected);this.emit("eachEdgeAttributesUpdated",{hints:t||null})}forEachAdjacencyEntry(i){if(typeof i!="function")throw new k("Graph.forEachAdjacencyEntry: expecting a callback.");tt(!1,!1,!1,this,i)}forEachAdjacencyEntryWithOrphans(i){if(typeof i!="function")throw new k("Graph.forEachAdjacencyEntryWithOrphans: expecting a callback.");tt(!1,!1,!0,this,i)}forEachAssymetricAdjacencyEntry(i){if(typeof i!="function")throw new k("Graph.forEachAssymetricAdjacencyEntry: expecting a callback.");tt(!1,!0,!1,this,i)}forEachAssymetricAdjacencyEntryWithOrphans(i){if(typeof i!="function")throw new k("Graph.forEachAssymetricAdjacencyEntryWithOrphans: expecting a callback.");tt(!1,!0,!0,this,i)}nodes(){return Array.from(this._nodes.keys())}forEachNode(i){if(typeof i!="function")throw new k("Graph.forEachNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)r=e.value,i(r.key,r.attributes)}findNode(i){if(typeof i!="function")throw new k("Graph.findNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)if(r=e.value,i(r.key,r.attributes))return r.key}mapNodes(i){if(typeof i!="function")throw new k("Graph.mapNode: expecting a callback.");const t=this._nodes.values();let e,r;const a=new Array(this.order);let o=0;for(;e=t.next(),e.done!==!0;)r=e.value,a[o++]=i(r.key,r.attributes);return a}someNode(i){if(typeof i!="function")throw new k("Graph.someNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)if(r=e.value,i(r.key,r.attributes))return!0;return!1}everyNode(i){if(typeof i!="function")throw new k("Graph.everyNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)if(r=e.value,!i(r.key,r.attributes))return!1;return!0}filterNodes(i){if(typeof i!="function")throw new k("Graph.filterNodes: expecting a callback.");const t=this._nodes.values();let e,r;const a=[];for(;e=t.next(),e.done!==!0;)r=e.value,i(r.key,r.attributes)&&a.push(r.key);return a}reduceNodes(i,t){if(typeof i!="function")throw new k("Graph.reduceNodes: expecting a callback.");if(arguments.length<2)throw new k("Graph.reduceNodes: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.");let e=t;const r=this._nodes.values();let a,o;for(;a=r.next(),a.done!==!0;)o=a.value,e=i(e,o.key,o.attributes);return e}nodeEntries(){const i=this._nodes.values();return{[Symbol.iterator](){return this},next(){const t=i.next();if(t.done)return t;const e=t.value;return{value:{node:e.key,attributes:e.attributes},done:!1}}}}export(){const i=new Array(this._nodes.size);let t=0;this._nodes.forEach((r,a)=>{i[t++]=rn(a,r)});const e=new Array(this._edges.size);return t=0,this._edges.forEach((r,a)=>{e[t++]=nn(this.type,a,r)}),{options:{type:this.type,multi:this.multi,allowSelfLoops:this.allowSelfLoops},attributes:this.getAttributes(),nodes:i,edges:e}}import(i,t=!1){if(i instanceof j)return i.forEachNode((u,h)=>{t?this.mergeNode(u,h):this.addNode(u,h)}),i.forEachEdge((u,h,d,l,f,c,y)=>{t?y?this.mergeUndirectedEdgeWithKey(u,d,l,h):this.mergeDirectedEdgeWithKey(u,d,l,h):y?this.addUndirectedEdgeWithKey(u,d,l,h):this.addDirectedEdgeWithKey(u,d,l,h)}),this;if(!J(i))throw new k("Graph.import: invalid argument. Expecting a serialized graph or, alternatively, a Graph instance.");if(i.attributes){if(!J(i.attributes))throw new k("Graph.import: invalid attributes. Expecting a plain object.");t?this.mergeAttributes(i.attributes):this.replaceAttributes(i.attributes)}let e,r,a,o,s;if(i.nodes){if(a=i.nodes,!Array.isArray(a))throw new k("Graph.import: invalid nodes. Expecting an array.");for(e=0,r=a.length;e{const a=Z({},e.attributes);e=new t.NodeDataClass(r,a),t._nodes.set(r,e)}),t}copy(i){if(i=i||{},typeof i.type=="string"&&i.type!==this.type&&i.type!=="mixed")throw new I(`Graph.copy: cannot create an incompatible copy from "${this.type}" type to "${i.type}" because this would mean losing information about the current graph.`);if(typeof i.multi=="boolean"&&i.multi!==this.multi&&i.multi!==!0)throw new I("Graph.copy: cannot create an incompatible copy by downgrading a multi graph to a simple one because this would mean losing information about the current graph.");if(typeof i.allowSelfLoops=="boolean"&&i.allowSelfLoops!==this.allowSelfLoops&&i.allowSelfLoops!==!0)throw new I("Graph.copy: cannot create an incompatible copy from a graph allowing self loops to one that does not because this would mean losing information about the current graph.");const t=this.emptyCopy(i),e=this._edges.values();let r,a;for(;r=e.next(),r.done!==!0;)a=r.value,ki(t,"copy",!1,a.undirected,a.key,a.source.key,a.target.key,Z({},a.attributes));return t}toJSON(){return this.export()}toString(){return"[object Graph]"}inspect(){const i={};this._nodes.forEach((a,o)=>{i[o]=a.attributes});const t={},e={};this._edges.forEach((a,o)=>{const s=a.undirected?"--":"->";let u="",h=a.source.key,d=a.target.key,l;a.undirected&&h>d&&(l=h,h=d,d=l);const f=`(${h})${s}(${d})`;o.startsWith("geid_")?this.multi&&(typeof e[f]>"u"?e[f]=0:e[f]++,u+=`${e[f]}. `):u+=`[${o}]: `,u+=f,t[u]=a.attributes});const r={};for(const a in this)this.hasOwnProperty(a)&&!Bt.has(a)&&typeof this[a]!="function"&&typeof a!="symbol"&&(r[a]=this[a]);return r.attributes=this._attributes,r.nodes=i,r.edges=t,ae(r,"constructor",this.constructor),r}}typeof Symbol<"u"&&(j.prototype[Symbol.for("nodejs.util.inspect.custom")]=j.prototype.inspect);hn.forEach(n=>{["add","merge","update"].forEach(i=>{const t=n.name(i),e=i==="add"?ki:cn;n.generateKey?j.prototype[t]=function(r,a,o){return e(this,t,!0,(n.type||this.type)==="undirected",null,r,a,o,i==="update")}:j.prototype[t]=function(r,a,o,s){return e(this,t,!1,(n.type||this.type)==="undirected",r,a,o,s,i==="update")}})});wr(j);Lr(j);qr(j);tn(j);class Di extends j{constructor(i){const t=Z({type:"directed"},i);if("multi"in t&&t.multi!==!1)throw new k("DirectedGraph.from: inconsistent indication that the graph should be multi in given options!");if(t.type!=="directed")throw new k('DirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}class Li extends j{constructor(i){const t=Z({type:"undirected"},i);if("multi"in t&&t.multi!==!1)throw new k("UndirectedGraph.from: inconsistent indication that the graph should be multi in given options!");if(t.type!=="undirected")throw new k('UndirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}class Gi extends j{constructor(i){const t=Z({multi:!0},i);if("multi"in t&&t.multi!==!0)throw new k("MultiGraph.from: inconsistent indication that the graph should be simple in given options!");super(t)}}class Fi extends j{constructor(i){const t=Z({type:"directed",multi:!0},i);if("multi"in t&&t.multi!==!0)throw new k("MultiDirectedGraph.from: inconsistent indication that the graph should be simple in given options!");if(t.type!=="directed")throw new k('MultiDirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}class Ni extends j{constructor(i){const t=Z({type:"undirected",multi:!0},i);if("multi"in t&&t.multi!==!0)throw new k("MultiUndirectedGraph.from: inconsistent indication that the graph should be simple in given options!");if(t.type!=="undirected")throw new k('MultiUndirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}function Fe(n){n.from=function(i,t){const e=Z({},i.options,t),r=new n(e);return r.import(i),r}}Fe(j);Fe(Di);Fe(Li);Fe(Gi);Fe(Fi);Fe(Ni);j.Graph=j;j.DirectedGraph=Di;j.UndirectedGraph=Li;j.MultiGraph=Gi;j.MultiDirectedGraph=Fi;j.MultiUndirectedGraph=Ni;j.InvalidArgumentsGraphError=k;j.NotFoundGraphError=C;j.UsageGraphError=I;var ft,Ht;function Pi(){return Ht||(Ht=1,ft=function(i){return i!==null&&typeof i=="object"&&typeof i.addUndirectedEdgeWithKey=="function"&&typeof i.dropNode=="function"&&typeof i.multi=="boolean"}),ft}var ze={},Wt;function fn(){if(Wt)return ze;Wt=1;function n(e){return typeof e!="number"||isNaN(e)?1:e}function i(e,r){var a={},o=function(h){return typeof h>"u"?r:h};typeof r=="function"&&(o=r);var s=function(h){return o(h[e])},u=function(){return o(void 0)};return typeof e=="string"?(a.fromAttributes=s,a.fromGraph=function(h,d){return s(h.getNodeAttributes(d))},a.fromEntry=function(h,d){return s(d)}):typeof e=="function"?(a.fromAttributes=function(){throw new Error("graphology-utils/getters/createNodeValueGetter: irrelevant usage.")},a.fromGraph=function(h,d){return o(e(d,h.getNodeAttributes(d)))},a.fromEntry=function(h,d){return o(e(h,d))}):(a.fromAttributes=u,a.fromGraph=u,a.fromEntry=u),a}function t(e,r){var a={},o=function(h){return typeof h>"u"?r:h};typeof r=="function"&&(o=r);var s=function(h){return o(h[e])},u=function(){return o(void 0)};return typeof e=="string"?(a.fromAttributes=s,a.fromGraph=function(h,d){return s(h.getEdgeAttributes(d))},a.fromEntry=function(h,d){return s(d)},a.fromPartialEntry=a.fromEntry,a.fromMinimalEntry=a.fromEntry):typeof e=="function"?(a.fromAttributes=function(){throw new Error("graphology-utils/getters/createEdgeValueGetter: irrelevant usage.")},a.fromGraph=function(h,d){var l=h.extremities(d);return o(e(d,h.getEdgeAttributes(d),l[0],l[1],h.getNodeAttributes(l[0]),h.getNodeAttributes(l[1]),h.isUndirected(d)))},a.fromEntry=function(h,d,l,f,c,y,w){return o(e(h,d,l,f,c,y,w))},a.fromPartialEntry=function(h,d,l,f){return o(e(h,d,l,f))},a.fromMinimalEntry=function(h,d){return o(e(h,d))}):(a.fromAttributes=u,a.fromGraph=u,a.fromEntry=u,a.fromMinimalEntry=u),a}return ze.createNodeValueGetter=i,ze.createEdgeValueGetter=t,ze.createEdgeWeightGetter=function(e){return t(e,n)},ze}var gt,jt;function gn(){if(jt)return gt;jt=1;var n=0,i=1,t=2,e=3,r=4,a=5,o=6,s=7,u=8,h=9,d=0,l=1,f=2,c=0,y=1,w=2,T=3,D=4,m=5,S=6,p=7,b=8,R=3,A=10,G=3,F=9,P=10;return gt=function(z,g,K){var te,x,v,$,W,X,ie,Y,N,Ne,re=g.length,tr=K.length,Pe=z.adjustSizes,ir=z.barnesHutTheta*z.barnesHutTheta,qe,q,B,M,fe,U,O,E=[];for(v=0;vYe?(Ee-=(Ke-Ye)/2,Re=Ee+Ke):(we-=(Ye-Ke)/2,Se=we+Ye),E[0+c]=-1,E[0+y]=(we+Se)/2,E[0+w]=(Ee+Re)/2,E[0+T]=Math.max(Se-we,Re-Ee),E[0+D]=-1,E[0+m]=-1,E[0+S]=0,E[0+p]=0,E[0+b]=0,te=1,v=0;v=0){g[v+n]=0)if(U=Math.pow(g[v+n]-E[x+p],2)+Math.pow(g[v+i]-E[x+b],2),Ne=E[x+T],4*Ne*Ne/U0?(O=q*g[v+o]*E[x+S]/U,g[v+t]+=B*O,g[v+e]+=M*O):U<0&&(O=-q*g[v+o]*E[x+S]/Math.sqrt(U),g[v+t]+=B*O,g[v+e]+=M*O):U>0&&(O=q*g[v+o]*E[x+S]/U,g[v+t]+=B*O,g[v+e]+=M*O),x=E[x+D],x<0)break;continue}else{x=E[x+m];continue}else{if(X=E[x+c],X>=0&&X!==v&&(B=g[v+n]-g[X+n],M=g[v+i]-g[X+i],U=B*B+M*M,Pe===!0?U>0?(O=q*g[v+o]*g[X+o]/U,g[v+t]+=B*O,g[v+e]+=M*O):U<0&&(O=-q*g[v+o]*g[X+o]/Math.sqrt(U),g[v+t]+=B*O,g[v+e]+=M*O):U>0&&(O=q*g[v+o]*g[X+o]/U,g[v+t]+=B*O,g[v+e]+=M*O)),x=E[x+D],x<0)break;continue}else for(q=z.scalingRatio,$=0;$0?(O=q*g[$+o]*g[W+o]/U/U,g[$+t]+=B*O,g[$+e]+=M*O,g[W+t]-=B*O,g[W+e]-=M*O):U<0&&(O=100*q*g[$+o]*g[W+o],g[$+t]+=B*O,g[$+e]+=M*O,g[W+t]-=B*O,g[W+e]-=M*O)):(U=Math.sqrt(B*B+M*M),U>0&&(O=q*g[$+o]*g[W+o]/U/U,g[$+t]+=B*O,g[$+e]+=M*O,g[W+t]-=B*O,g[W+e]-=M*O));for(N=z.gravity/z.scalingRatio,q=z.scalingRatio,v=0;v0&&(O=q*g[v+o]*N):U>0&&(O=q*g[v+o]*N/U),g[v+t]-=B*O,g[v+e]-=M*O;for(q=1*(z.outboundAttractionDistribution?qe:1),ie=0;ie0&&(O=-q*fe*Math.log(1+U)/U/g[$+o]):U>0&&(O=-q*fe*Math.log(1+U)/U):z.outboundAttractionDistribution?U>0&&(O=-q*fe/g[$+o]):U>0&&(O=-q*fe)):(U=Math.sqrt(Math.pow(B,2)+Math.pow(M,2)),z.linLogMode?z.outboundAttractionDistribution?U>0&&(O=-q*fe*Math.log(1+U)/U/g[$+o]):U>0&&(O=-q*fe*Math.log(1+U)/U):z.outboundAttractionDistribution?(U=1,O=-q*fe/g[$+o]):(U=1,O=-q*fe)),U>0&&(g[$+t]+=B*O,g[$+e]+=M*O,g[W+t]-=B*O,g[W+e]-=M*O);var Ze,Ie,Xe,_e,Je,Qe;if(Pe===!0)for(v=0;vP&&(g[v+t]=g[v+t]*P/Ze,g[v+e]=g[v+e]*P/Ze),Ie=g[v+o]*Math.sqrt((g[v+r]-g[v+t])*(g[v+r]-g[v+t])+(g[v+a]-g[v+e])*(g[v+a]-g[v+e])),Xe=Math.sqrt((g[v+r]+g[v+t])*(g[v+r]+g[v+t])+(g[v+a]+g[v+e])*(g[v+a]+g[v+e]))/2,_e=.1*Math.log(1+Xe)/(1+Math.sqrt(Ie)),Je=g[v+n]+g[v+t]*(_e/z.slowDown),g[v+n]=Je,Qe=g[v+i]+g[v+e]*(_e/z.slowDown),g[v+i]=Qe);else for(v=0;v=0)?{message:"the `scalingRatio` setting should be a number >= 0."}:"strongGravityMode"in t&&typeof t.strongGravityMode!="boolean"?{message:"the `strongGravityMode` setting should be a boolean."}:"gravity"in t&&!(typeof t.gravity=="number"&&t.gravity>=0)?{message:"the `gravity` setting should be a number >= 0."}:"slowDown"in t&&!(typeof t.slowDown=="number"||t.slowDown>=0)?{message:"the `slowDown` setting should be a number >= 0."}:"barnesHutOptimize"in t&&typeof t.barnesHutOptimize!="boolean"?{message:"the `barnesHutOptimize` setting should be a boolean."}:"barnesHutTheta"in t&&!(typeof t.barnesHutTheta=="number"&&t.barnesHutTheta>=0)?{message:"the `barnesHutTheta` setting should be a number >= 0."}:null},ge.graphToByteArrays=function(t,e){var r=t.order,a=t.size,o={},s,u=new Float32Array(r*n),h=new Float32Array(a*i);return s=0,t.forEachNode(function(d,l){o[d]=s,u[s]=l.x,u[s+1]=l.y,u[s+2]=0,u[s+3]=0,u[s+4]=0,u[s+5]=0,u[s+6]=1,u[s+7]=1,u[s+8]=l.size||1,u[s+9]=l.fixed?1:0,s+=n}),s=0,t.forEachEdge(function(d,l,f,c,y,w,T){var D=o[f],m=o[c],S=e(d,l,f,c,y,w,T);u[D+6]+=S,u[m+6]+=S,h[s]=D,h[s+1]=m,h[s+2]=S,s+=i}),{nodes:u,edges:h}},ge.assignLayoutChanges=function(t,e,r){var a=0;t.updateEachNodeAttributes(function(o,s){return s.x=e[a],s.y=e[a+1],a+=n,r?r(o,s):s})},ge.readGraphPositions=function(t,e){var r=0;t.forEachNode(function(a,o){e[r]=o.x,e[r+1]=o.y,r+=n})},ge.collectLayoutChanges=function(t,e,r){for(var a=t.nodes(),o={},s=0,u=0,h=e.length;s2e3,strongGravityMode:!0,gravity:.05,scalingRatio:10,slowDown:1+Math.log(h)}}var s=a.bind(null,!1);return s.assign=a.bind(null,!0),s.inferSettings=o,vt=s,vt}var yn=mn();const it=bi(yn);function bn(n,i){if(typeof n!="object"||!n)return n;var t=n[Symbol.toPrimitive];if(t!==void 0){var e=t.call(n,i);if(typeof e!="object")return e;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(n)}function je(n){var i=bn(n,"string");return typeof i=="symbol"?i:i+""}function Q(n,i){if(!(n instanceof i))throw new TypeError("Cannot call a class as a function")}function Yt(n,i){for(var t=0;tn.length)&&(i=n.length);for(var t=0,e=Array(i);t>>16,t=(n&65280)>>>8,e=n&255,r=255,a=zi(i,t,e,r);return bt[n]=a,a}function Zt(n,i,t,e){return t+(i<<8)+(n<<16)}function Xt(n,i,t,e,r,a){var o=Math.floor(t/a*r),s=Math.floor(n.drawingBufferHeight/a-e/a*r),u=new Uint8Array(4);n.bindFramebuffer(n.FRAMEBUFFER,i),n.readPixels(o,s,1,1,n.RGBA,n.UNSIGNED_BYTE,u);var h=De(u,4),d=h[0],l=h[1],f=h[2],c=h[3];return[d,l,f,c]}function _(n,i,t){return(i=je(i))in n?Object.defineProperty(n,i,{value:t,enumerable:!0,configurable:!0,writable:!0}):n[i]=t,n}function Jt(n,i){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var e=Object.getOwnPropertySymbols(n);i&&(e=e.filter(function(r){return Object.getOwnPropertyDescriptor(n,r).enumerable})),t.push.apply(t,e)}return t}function L(n){for(var i=1;i:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * 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-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * 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-3\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3.5) * 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-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * 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-7>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 7) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 7) * 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(.space-y-reverse>:not(:last-child)){--tw-space-y-reverse:1}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}:where(.space-x-reverse>:not(:last-child)){--tw-space-x-reverse:1}.gap-y-1{row-gap:var(--spacing)}.gap-y-1\.5{row-gap:calc(var(--spacing) * 1.5)}:where(.divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-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-y-reverse>:not(:last-child)){--tw-divide-y-reverse:1}.self-end{align-self:flex-end}.self-start{align-self:flex-start}.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}.overscroll-contain{overscroll-behavior:contain}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-s{border-start-start-radius:.25rem;border-end-start-radius:.25rem}.rounded-ss{border-start-start-radius:.25rem}.rounded-e{border-start-end-radius:.25rem;border-end-end-radius:.25rem}.rounded-se{border-start-end-radius:.25rem}.rounded-ee{border-end-end-radius:.25rem}.rounded-es{border-end-start-radius:.25rem}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-tl{border-top-left-radius:.25rem}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-tr{border-top-right-radius:.25rem}.rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-br{border-bottom-right-radius:.25rem}.rounded-br-sm{border-bottom-right-radius:calc(var(--radius) - 4px)}.rounded-bl{border-bottom-left-radius:.25rem}.rounded-bl-sm{border-bottom-left-radius:calc(var(--radius) - 4px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-x{border-inline-style:var(--tw-border-style);border-inline-width:1px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.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{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-500\/20{border-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/20{border-color:color-mix(in oklab,var(--color-amber-500) 20%,transparent)}}.border-amber-500\/25{border-color:#f99c0040}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/25{border-color:color-mix(in oklab,var(--color-amber-500) 25%,transparent)}}.border-amber-500\/30{border-color:#f99c004d}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/30{border-color:color-mix(in oklab,var(--color-amber-500) 30%,transparent)}}.border-amber-500\/40{border-color:#f99c0066}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/40{border-color:color-mix(in oklab,var(--color-amber-500) 40%,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-border,.border-border\/20{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/20{border-color:color-mix(in oklab,hsl(var(--border)) 20%,transparent)}}.border-border\/30{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/30{border-color:color-mix(in oklab,hsl(var(--border)) 30%,transparent)}}.border-border\/40{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/40{border-color:color-mix(in oklab,hsl(var(--border)) 40%,transparent)}}.border-border\/50{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/50{border-color:color-mix(in oklab,hsl(var(--border)) 50%,transparent)}}.border-border\/60{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/60{border-color:color-mix(in oklab,hsl(var(--border)) 60%,transparent)}}.border-border\/70{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/70{border-color:color-mix(in oklab,hsl(var(--border)) 70%,transparent)}}.border-border\/80{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/80{border-color:color-mix(in oklab,hsl(var(--border)) 80%,transparent)}}.border-cyan-500\/20{border-color:#00b7d733}@supports (color:color-mix(in lab,red,red)){.border-cyan-500\/20{border-color:color-mix(in oklab,var(--color-cyan-500) 20%,transparent)}}.border-cyan-500\/30{border-color:#00b7d74d}@supports (color:color-mix(in lab,red,red)){.border-cyan-500\/30{border-color:color-mix(in oklab,var(--color-cyan-500) 30%,transparent)}}.border-emerald-500\/10{border-color:#00bb7f1a}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/10{border-color:color-mix(in oklab,var(--color-emerald-500) 10%,transparent)}}.border-emerald-500\/15{border-color:#00bb7f26}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/15{border-color:color-mix(in oklab,var(--color-emerald-500) 15%,transparent)}}.border-emerald-500\/20{border-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/20{border-color:color-mix(in oklab,var(--color-emerald-500) 20%,transparent)}}.border-emerald-500\/25{border-color:#00bb7f40}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/25{border-color:color-mix(in oklab,var(--color-emerald-500) 25%,transparent)}}.border-emerald-500\/30{border-color:#00bb7f4d}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/30{border-color:color-mix(in oklab,var(--color-emerald-500) 30%,transparent)}}.border-emerald-500\/40{border-color:#00bb7f66}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/40{border-color:color-mix(in oklab,var(--color-emerald-500) 40%,transparent)}}.border-fuchsia-500\/25{border-color:#e12afb40}@supports (color:color-mix(in lab,red,red)){.border-fuchsia-500\/25{border-color:color-mix(in oklab,var(--color-fuchsia-500) 25%,transparent)}}.border-fuchsia-500\/30{border-color:#e12afb4d}@supports (color:color-mix(in lab,red,red)){.border-fuchsia-500\/30{border-color:color-mix(in oklab,var(--color-fuchsia-500) 30%,transparent)}}.border-fuchsia-500\/40{border-color:#e12afb66}@supports (color:color-mix(in lab,red,red)){.border-fuchsia-500\/40{border-color:color-mix(in oklab,var(--color-fuchsia-500) 40%,transparent)}}.border-indigo-500\/25{border-color:#625fff40}@supports (color:color-mix(in lab,red,red)){.border-indigo-500\/25{border-color:color-mix(in oklab,var(--color-indigo-500) 25%,transparent)}}.border-indigo-500\/30{border-color:#625fff4d}@supports (color:color-mix(in lab,red,red)){.border-indigo-500\/30{border-color:color-mix(in oklab,var(--color-indigo-500) 30%,transparent)}}.border-indigo-500\/40{border-color:#625fff66}@supports (color:color-mix(in lab,red,red)){.border-indigo-500\/40{border-color:color-mix(in oklab,var(--color-indigo-500) 40%,transparent)}}.border-orange-500\/30{border-color:#fe6e004d}@supports (color:color-mix(in lab,red,red)){.border-orange-500\/30{border-color:color-mix(in oklab,var(--color-orange-500) 30%,transparent)}}.border-pink-500\/25{border-color:#f6339a40}@supports (color:color-mix(in lab,red,red)){.border-pink-500\/25{border-color:color-mix(in oklab,var(--color-pink-500) 25%,transparent)}}.border-primary,.border-primary\/20{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/20{border-color:color-mix(in oklab,hsl(var(--primary)) 20%,transparent)}}.border-primary\/25{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/25{border-color:color-mix(in oklab,hsl(var(--primary)) 25%,transparent)}}.border-primary\/30{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/30{border-color:color-mix(in oklab,hsl(var(--primary)) 30%,transparent)}}.border-primary\/40{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/40{border-color:color-mix(in oklab,hsl(var(--primary)) 40%,transparent)}}.border-primary\/45{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/45{border-color:color-mix(in oklab,hsl(var(--primary)) 45%,transparent)}}.border-primary\/50{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/50{border-color:color-mix(in oklab,hsl(var(--primary)) 50%,transparent)}}.border-primary\/60{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/60{border-color:color-mix(in oklab,hsl(var(--primary)) 60%,transparent)}}.border-purple-500\/30{border-color:#ac4bff4d}@supports (color:color-mix(in lab,red,red)){.border-purple-500\/30{border-color:color-mix(in oklab,var(--color-purple-500) 30%,transparent)}}.border-red-500{border-color:var(--color-red-500)}.border-red-500\/20{border-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.border-red-500\/20{border-color:color-mix(in oklab,var(--color-red-500) 20%,transparent)}}.border-red-500\/25{border-color:#fb2c3640}@supports (color:color-mix(in lab,red,red)){.border-red-500\/25{border-color:color-mix(in oklab,var(--color-red-500) 25%,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\/40{border-color:#fb2c3666}@supports (color:color-mix(in lab,red,red)){.border-red-500\/40{border-color:color-mix(in oklab,var(--color-red-500) 40%,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-slate-500\/25{border-color:#62748e40}@supports (color:color-mix(in lab,red,red)){.border-slate-500\/25{border-color:color-mix(in oklab,var(--color-slate-500) 25%,transparent)}}.border-slate-500\/30{border-color:#62748e4d}@supports (color:color-mix(in lab,red,red)){.border-slate-500\/30{border-color:color-mix(in oklab,var(--color-slate-500) 30%,transparent)}}.border-teal-500\/25{border-color:#00baa740}@supports (color:color-mix(in lab,red,red)){.border-teal-500\/25{border-color:color-mix(in oklab,var(--color-teal-500) 25%,transparent)}}.border-transparent{border-color:#0000}.border-violet-500\/20{border-color:#8d54ff33}@supports (color:color-mix(in lab,red,red)){.border-violet-500\/20{border-color:color-mix(in oklab,var(--color-violet-500) 20%,transparent)}}.border-violet-500\/25{border-color:#8d54ff40}@supports (color:color-mix(in lab,red,red)){.border-violet-500\/25{border-color:color-mix(in oklab,var(--color-violet-500) 25%,transparent)}}.border-t-primary\/70{border-top-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-t-primary\/70{border-top-color:color-mix(in oklab,hsl(var(--primary)) 70%,transparent)}}.border-t-violet-500\/70{border-top-color:#8d54ffb3}@supports (color:color-mix(in lab,red,red)){.border-t-violet-500\/70{border-top-color:color-mix(in oklab,var(--color-violet-500) 70%,transparent)}}.border-l-amber-500\/80{border-left-color:#f99c00cc}@supports (color:color-mix(in lab,red,red)){.border-l-amber-500\/80{border-left-color:color-mix(in oklab,var(--color-amber-500) 80%,transparent)}}.border-l-cyan-500\/80{border-left-color:#00b7d7cc}@supports (color:color-mix(in lab,red,red)){.border-l-cyan-500\/80{border-left-color:color-mix(in oklab,var(--color-cyan-500) 80%,transparent)}}.border-l-indigo-500\/80{border-left-color:#625fffcc}@supports (color:color-mix(in lab,red,red)){.border-l-indigo-500\/80{border-left-color:color-mix(in oklab,var(--color-indigo-500) 80%,transparent)}}.border-l-muted{border-left-color:hsl(var(--muted))}.border-l-violet-500\/80{border-left-color:#8d54ffcc}@supports (color:color-mix(in lab,red,red)){.border-l-violet-500\/80{border-left-color:color-mix(in oklab,var(--color-violet-500) 80%,transparent)}}.bg-\[\#070a0f\]{background-color:#070a0f}.bg-\[hsl\(224\,30\%\,6\%\)\]{background-color:#0b0d14}.bg-amber-400{background-color:var(--color-amber-400)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-500\/5{background-color:#f99c000d}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/5{background-color:color-mix(in oklab,var(--color-amber-500) 5%,transparent)}}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/10{background-color:color-mix(in oklab,var(--color-amber-500) 10%,transparent)}}.bg-amber-500\/15{background-color:#f99c0026}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/15{background-color:color-mix(in oklab,var(--color-amber-500) 15%,transparent)}}.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-amber-500\/80{background-color:#f99c00cc}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/80{background-color:color-mix(in oklab,var(--color-amber-500) 80%,transparent)}}.bg-amber-500\/\[0\.06\]{background-color:#f99c000f}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-amber-500) 6%,transparent)}}.bg-background\/10{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/10{background-color:color-mix(in oklab,hsl(var(--background)) 10%,transparent)}}.bg-background\/15{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/15{background-color:color-mix(in oklab,hsl(var(--background)) 15%,transparent)}}.bg-background\/20{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/20{background-color:color-mix(in oklab,hsl(var(--background)) 20%,transparent)}}.bg-background\/25{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/25{background-color:color-mix(in oklab,hsl(var(--background)) 25%,transparent)}}.bg-background\/30{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/30{background-color:color-mix(in oklab,hsl(var(--background)) 30%,transparent)}}.bg-background\/35{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/35{background-color:color-mix(in oklab,hsl(var(--background)) 35%,transparent)}}.bg-background\/40{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/40{background-color:color-mix(in oklab,hsl(var(--background)) 40%,transparent)}}.bg-background\/50{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/50{background-color:color-mix(in oklab,hsl(var(--background)) 50%,transparent)}}.bg-black\/10{background-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.bg-black\/10{background-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab,red,red)){.bg-black\/30{background-color:color-mix(in oklab,var(--color-black) 30%,transparent)}}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab,red,red)){.bg-black\/40{background-color:color-mix(in oklab,var(--color-black) 40%,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-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-border\/30{background-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.bg-border\/30{background-color:color-mix(in oklab,hsl(var(--border)) 30%,transparent)}}.bg-card,.bg-card\/20{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/20{background-color:color-mix(in oklab,hsl(var(--card)) 20%,transparent)}}.bg-card\/30{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/30{background-color:color-mix(in oklab,hsl(var(--card)) 30%,transparent)}}.bg-card\/40{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/40{background-color:color-mix(in oklab,hsl(var(--card)) 40%,transparent)}}.bg-card\/45{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/45{background-color:color-mix(in oklab,hsl(var(--card)) 45%,transparent)}}.bg-card\/50{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/50{background-color:color-mix(in oklab,hsl(var(--card)) 50%,transparent)}}.bg-card\/70{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/70{background-color:color-mix(in oklab,hsl(var(--card)) 70%,transparent)}}.bg-card\/85{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/85{background-color:color-mix(in oklab,hsl(var(--card)) 85%,transparent)}}.bg-cyan-500\/10{background-color:#00b7d71a}@supports (color:color-mix(in lab,red,red)){.bg-cyan-500\/10{background-color:color-mix(in oklab,var(--color-cyan-500) 10%,transparent)}}.bg-cyan-500\/20{background-color:#00b7d733}@supports (color:color-mix(in lab,red,red)){.bg-cyan-500\/20{background-color:color-mix(in oklab,var(--color-cyan-500) 20%,transparent)}}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-emerald-500\/5{background-color:#00bb7f0d}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/5{background-color:color-mix(in oklab,var(--color-emerald-500) 5%,transparent)}}.bg-emerald-500\/10{background-color:#00bb7f1a}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/10{background-color:color-mix(in oklab,var(--color-emerald-500) 10%,transparent)}}.bg-emerald-500\/15{background-color:#00bb7f26}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/15{background-color:color-mix(in oklab,var(--color-emerald-500) 15%,transparent)}}.bg-emerald-500\/20{background-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/20{background-color:color-mix(in oklab,var(--color-emerald-500) 20%,transparent)}}.bg-emerald-500\/80{background-color:#00bb7fcc}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/80{background-color:color-mix(in oklab,var(--color-emerald-500) 80%,transparent)}}.bg-emerald-500\/\[0\.07\]{background-color:#00bb7f12}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/\[0\.07\]{background-color:color-mix(in oklab,var(--color-emerald-500) 7%,transparent)}}.bg-fuchsia-500\/10{background-color:#e12afb1a}@supports (color:color-mix(in lab,red,red)){.bg-fuchsia-500\/10{background-color:color-mix(in oklab,var(--color-fuchsia-500) 10%,transparent)}}.bg-fuchsia-500\/15{background-color:#e12afb26}@supports (color:color-mix(in lab,red,red)){.bg-fuchsia-500\/15{background-color:color-mix(in oklab,var(--color-fuchsia-500) 15%,transparent)}}.bg-indigo-500\/5{background-color:#625fff0d}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/5{background-color:color-mix(in oklab,var(--color-indigo-500) 5%,transparent)}}.bg-indigo-500\/10{background-color:#625fff1a}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/10{background-color:color-mix(in oklab,var(--color-indigo-500) 10%,transparent)}}.bg-indigo-500\/15{background-color:#625fff26}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/15{background-color:color-mix(in oklab,var(--color-indigo-500) 15%,transparent)}}.bg-muted{background-color:hsl(var(--muted))}.bg-muted-foreground,.bg-muted-foreground\/40{background-color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.bg-muted-foreground\/40{background-color:color-mix(in oklab,hsl(var(--muted-foreground)) 40%,transparent)}}.bg-muted\/10{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/10{background-color:color-mix(in oklab,hsl(var(--muted)) 10%,transparent)}}.bg-muted\/20{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/20{background-color:color-mix(in oklab,hsl(var(--muted)) 20%,transparent)}}.bg-muted\/40{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/40{background-color:color-mix(in oklab,hsl(var(--muted)) 40%,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-pink-500\/15{background-color:#f6339a26}@supports (color:color-mix(in lab,red,red)){.bg-pink-500\/15{background-color:color-mix(in oklab,var(--color-pink-500) 15%,transparent)}}.bg-popover,.bg-popover\/95{background-color:hsl(var(--popover))}@supports (color:color-mix(in lab,red,red)){.bg-popover\/95{background-color:color-mix(in oklab,hsl(var(--popover)) 95%,transparent)}}.bg-primary,.bg-primary\/5{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/5{background-color:color-mix(in oklab,hsl(var(--primary)) 5%,transparent)}}.bg-primary\/10{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/10{background-color:color-mix(in oklab,hsl(var(--primary)) 10%,transparent)}}.bg-primary\/15{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/15{background-color:color-mix(in oklab,hsl(var(--primary)) 15%,transparent)}}.bg-primary\/\[0\.06\]{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/\[0\.06\]{background-color:color-mix(in oklab,hsl(var(--primary)) 6%,transparent)}}.bg-purple-500\/15{background-color:#ac4bff26}@supports (color:color-mix(in lab,red,red)){.bg-purple-500\/15{background-color:color-mix(in oklab,var(--color-purple-500) 15%,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-red-500{background-color:var(--color-red-500)}.bg-red-500\/5{background-color:#fb2c360d}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/5{background-color:color-mix(in oklab,var(--color-red-500) 5%,transparent)}}.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\/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-slate-500\/15{background-color:#62748e26}@supports (color:color-mix(in lab,red,red)){.bg-slate-500\/15{background-color:color-mix(in oklab,var(--color-slate-500) 15%,transparent)}}.bg-slate-500\/20{background-color:#62748e33}@supports (color:color-mix(in lab,red,red)){.bg-slate-500\/20{background-color:color-mix(in oklab,var(--color-slate-500) 20%,transparent)}}.bg-teal-500{background-color:var(--color-teal-500)}.bg-teal-500\/15{background-color:#00baa726}@supports (color:color-mix(in lab,red,red)){.bg-teal-500\/15{background-color:color-mix(in oklab,var(--color-teal-500) 15%,transparent)}}.bg-transparent{background-color:#0000}.bg-violet-500\/5{background-color:#8d54ff0d}@supports (color:color-mix(in lab,red,red)){.bg-violet-500\/5{background-color:color-mix(in oklab,var(--color-violet-500) 5%,transparent)}}.bg-violet-500\/10{background-color:#8d54ff1a}@supports (color:color-mix(in lab,red,red)){.bg-violet-500\/10{background-color:color-mix(in oklab,var(--color-violet-500) 10%,transparent)}}.bg-violet-500\/15{background-color:#8d54ff26}@supports (color:color-mix(in lab,red,red)){.bg-violet-500\/15{background-color:color-mix(in oklab,var(--color-violet-500) 15%,transparent)}}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-tr{--tw-gradient-position:to top right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-cyan-500{--tw-gradient-from:var(--color-cyan-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-foreground{--tw-gradient-from:hsl(var(--foreground));--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-indigo-500{--tw-gradient-from:var(--color-indigo-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-purple-500{--tw-gradient-from:var(--color-purple-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-teal-500{--tw-gradient-from:var(--color-teal-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-teal-500\/15{--tw-gradient-from:#00baa726}@supports (color:color-mix(in lab,red,red)){.from-teal-500\/15{--tw-gradient-from:color-mix(in oklab, var(--color-teal-500) 15%, transparent)}}.from-teal-500\/15{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-teal-500\/20{--tw-gradient-from:#00baa733}@supports (color:color-mix(in lab,red,red)){.from-teal-500\/20{--tw-gradient-from:color-mix(in oklab, var(--color-teal-500) 20%, transparent)}}.from-teal-500\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.via-foreground{--tw-gradient-via:hsl(var(--foreground));--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-indigo-500\/10{--tw-gradient-via:#625fff1a}@supports (color:color-mix(in lab,red,red)){.via-indigo-500\/10{--tw-gradient-via:color-mix(in oklab, var(--color-indigo-500) 10%, transparent)}}.via-indigo-500\/10{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-indigo-500\/15{--tw-gradient-via:#625fff26}@supports (color:color-mix(in lab,red,red)){.via-indigo-500\/15{--tw-gradient-via:color-mix(in oklab, var(--color-indigo-500) 15%, transparent)}}.via-indigo-500\/15{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.to-blue-500{--tw-gradient-to:var(--color-blue-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-emerald-500{--tw-gradient-to:var(--color-emerald-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-indigo-500{--tw-gradient-to:var(--color-indigo-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-pink-500{--tw-gradient-to:var(--color-pink-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-primary{--tw-gradient-to:hsl(var(--primary));--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-purple-500\/15{--tw-gradient-to:#ac4bff26}@supports (color:color-mix(in lab,red,red)){.to-purple-500\/15{--tw-gradient-to:color-mix(in oklab, var(--color-purple-500) 15%, transparent)}}.to-purple-500\/15{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-purple-500\/20{--tw-gradient-to:#ac4bff33}@supports (color:color-mix(in lab,red,red)){.to-purple-500\/20{--tw-gradient-to:color-mix(in oklab, var(--color-purple-500) 20%, transparent)}}.to-purple-500\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-sky-500{--tw-gradient-to:var(--color-sky-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.bg-repeat{background-repeat:repeat}.fill-primary\/20{fill:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.fill-primary\/20{fill:color-mix(in oklab,hsl(var(--primary)) 20%,transparent)}}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-3\.5{padding:calc(var(--spacing) * 3.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.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:var(--spacing)}.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-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-20{padding-block:calc(var(--spacing) * 20)}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-2\.5{padding-top:calc(var(--spacing) * 2.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-24{padding-top:calc(var(--spacing) * 24)}.pt-\[12vh\]{padding-top:12vh}.pr-1{padding-right:var(--spacing)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-10{padding-right:calc(var(--spacing) * 10)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-8{padding-left:calc(var(--spacing) * 8)}.pl-9{padding-left:calc(var(--spacing) * 9)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,monospace}.font-sans{font-family:Inter,ui-sans-serif,system-ui,-apple-system,sans-serif}.font-space{font-family:Space Grotesk,sans-serif}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--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-\[7px\]{font-size:7px}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-none{--tw-leading:1;line-height:1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.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-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.text-wrap{text-wrap:wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.text-clip{text-overflow:clip}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-300{color:var(--color-amber-300)}.text-amber-400{color:var(--color-amber-400)}.text-amber-400\/80{color:#fcbb00cc}@supports (color:color-mix(in lab,red,red)){.text-amber-400\/80{color:color-mix(in oklab,var(--color-amber-400) 80%,transparent)}}.text-amber-400\/90{color:#fcbb00e6}@supports (color:color-mix(in lab,red,red)){.text-amber-400\/90{color:color-mix(in oklab,var(--color-amber-400) 90%,transparent)}}.text-amber-500{color:var(--color-amber-500)}.text-black{color:var(--color-black)}.text-blue-300{color:var(--color-blue-300)}.text-cyan-200\/90{color:#a2f4fde6}@supports (color:color-mix(in lab,red,red)){.text-cyan-200\/90{color:color-mix(in oklab,var(--color-cyan-200) 90%,transparent)}}.text-cyan-300{color:var(--color-cyan-300)}.text-cyan-300\/90{color:#53eafde6}@supports (color:color-mix(in lab,red,red)){.text-cyan-300\/90{color:color-mix(in oklab,var(--color-cyan-300) 90%,transparent)}}.text-cyan-400{color:var(--color-cyan-400)}.text-emerald-300{color:var(--color-emerald-300)}.text-emerald-400{color:var(--color-emerald-400)}.text-emerald-400\/90{color:#00d294e6}@supports (color:color-mix(in lab,red,red)){.text-emerald-400\/90{color:color-mix(in oklab,var(--color-emerald-400) 90%,transparent)}}.text-foreground,.text-foreground\/80{color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.text-foreground\/80{color:color-mix(in oklab,hsl(var(--foreground)) 80%,transparent)}}.text-foreground\/90{color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.text-foreground\/90{color:color-mix(in oklab,hsl(var(--foreground)) 90%,transparent)}}.text-fuchsia-300{color:var(--color-fuchsia-300)}.text-fuchsia-400{color:var(--color-fuchsia-400)}.text-indigo-300{color:var(--color-indigo-300)}.text-indigo-400{color:var(--color-indigo-400)}.text-muted-foreground,.text-muted-foreground\/40{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/40{color:color-mix(in oklab,hsl(var(--muted-foreground)) 40%,transparent)}}.text-muted-foreground\/45{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/45{color:color-mix(in oklab,hsl(var(--muted-foreground)) 45%,transparent)}}.text-muted-foreground\/50{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/50{color:color-mix(in oklab,hsl(var(--muted-foreground)) 50%,transparent)}}.text-muted-foreground\/55{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/55{color:color-mix(in oklab,hsl(var(--muted-foreground)) 55%,transparent)}}.text-muted-foreground\/60{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/60{color:color-mix(in oklab,hsl(var(--muted-foreground)) 60%,transparent)}}.text-muted-foreground\/65{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/65{color:color-mix(in oklab,hsl(var(--muted-foreground)) 65%,transparent)}}.text-muted-foreground\/70{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/70{color:color-mix(in oklab,hsl(var(--muted-foreground)) 70%,transparent)}}.text-muted-foreground\/75{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/75{color:color-mix(in oklab,hsl(var(--muted-foreground)) 75%,transparent)}}.text-muted-foreground\/80{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/80{color:color-mix(in oklab,hsl(var(--muted-foreground)) 80%,transparent)}}.text-orange-300{color:var(--color-orange-300)}.text-pink-400{color:var(--color-pink-400)}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-primary\/70{color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.text-primary\/70{color:color-mix(in oklab,hsl(var(--primary)) 70%,transparent)}}.text-primary\/80{color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.text-primary\/80{color:color-mix(in oklab,hsl(var(--primary)) 80%,transparent)}}.text-purple-300{color:var(--color-purple-300)}.text-red-300{color:var(--color-red-300)}.text-red-400{color:var(--color-red-400)}.text-red-400\/80{color:#ff6568cc}@supports (color:color-mix(in lab,red,red)){.text-red-400\/80{color:color-mix(in oklab,var(--color-red-400) 80%,transparent)}}.text-rose-400{color:var(--color-rose-400)}.text-sky-400{color:var(--color-sky-400)}.text-slate-300{color:var(--color-slate-300)}.text-teal-400{color:var(--color-teal-400)}.text-transparent{color:#0000}.text-violet-200\/90{color:#ddd6ffe6}@supports (color:color-mix(in lab,red,red)){.text-violet-200\/90{color:color-mix(in oklab,var(--color-violet-200) 90%,transparent)}}.text-violet-300{color:var(--color-violet-300)}.text-violet-300\/80{color:#c4b4ffcc}@supports (color:color-mix(in lab,red,red)){.text-violet-300\/80{color:color-mix(in oklab,var(--color-violet-300) 80%,transparent)}}.text-violet-400{color:var(--color-violet-400)}.text-violet-400\/70{color:#a685ffb3}@supports (color:color-mix(in lab,red,red)){.text-violet-400\/70{color:color-mix(in oklab,var(--color-violet-400) 70%,transparent)}}.text-white{color:var(--color-white)}.text-white\/95{color:#fffffff2}@supports (color:color-mix(in lab,red,red)){.text-white\/95{color:color-mix(in oklab,var(--color-white) 95%,transparent)}}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.diagonal-fractions{--tw-numeric-fraction:diagonal-fractions;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.lining-nums{--tw-numeric-figure:lining-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.oldstyle-nums{--tw-numeric-figure:oldstyle-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.proportional-nums{--tw-numeric-spacing:proportional-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.slashed-zero{--tw-slashed-zero:slashed-zero;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.stacked-fractions{--tw-numeric-fraction:stacked-fractions;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.normal-nums{font-variant-numeric:normal}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.overline{text-decoration-line:overline}.underline{text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.accent-primary{accent-color:hsl(var(--primary))}.opacity-0{opacity:0}.opacity-30{opacity:.3}.opacity-35{opacity:.35}.opacity-60{opacity:.6}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.opacity-100{opacity:1}.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\!{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a)!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.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-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);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-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px 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-sm{--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-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{--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)}.shadow-amber-500\/10{--tw-shadow-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.shadow-amber-500\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-amber-500) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/5{--tw-shadow-color:#0000000d}@supports (color:color-mix(in lab,red,red)){.shadow-black\/5{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 5%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/10{--tw-shadow-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.shadow-black\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/15{--tw-shadow-color:#00000026}@supports (color:color-mix(in lab,red,red)){.shadow-black\/15{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 15%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/20{--tw-shadow-color:#0003}@supports (color:color-mix(in lab,red,red)){.shadow-black\/20{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 20%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/25{--tw-shadow-color:#00000040}@supports (color:color-mix(in lab,red,red)){.shadow-black\/25{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 25%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-emerald-500\/5{--tw-shadow-color:#00bb7f0d}@supports (color:color-mix(in lab,red,red)){.shadow-emerald-500\/5{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-emerald-500) 5%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-primary\/5{--tw-shadow-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.shadow-primary\/5{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, hsl(var(--primary)) 5%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-primary\/10{--tw-shadow-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.shadow-primary\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, hsl(var(--primary)) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-primary\/20{--tw-shadow-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.shadow-primary\/20{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, hsl(var(--primary)) 20%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-red-500\/10{--tw-shadow-color:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.shadow-red-500\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-red-500) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-red-500\/30{--tw-shadow-color:#fb2c364d}@supports (color:color-mix(in lab,red,red)){.shadow-red-500\/30{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-red-500) 30%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-black\/40{--tw-ring-color:#0006}@supports (color:color-mix(in lab,red,red)){.ring-black\/40{--tw-ring-color:color-mix(in oklab, var(--color-black) 40%, transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.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,)}.blur-\[130px\]{--tw-blur:blur(130px);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,)}.blur-\[140px\]{--tw-blur:blur(140px);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,)}.blur-\[160px\]{--tw-blur:blur(160px);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,)}.drop-shadow{--tw-drop-shadow-size:drop-shadow(0 1px 2px var(--tw-drop-shadow-color,#0000001a)) drop-shadow(0 1px 1px var(--tw-drop-shadow-color,#0000000f));--tw-drop-shadow:drop-shadow(0 1px 2px #0000001a) drop-shadow(0 1px 1px #0000000f);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,)}.grayscale{--tw-grayscale:grayscale(100%);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,)}.invert{--tw-invert:invert(100%);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,)}.sepia{--tw-sepia:sepia(100%);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,)!important}.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,)}.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,)!important}.backdrop-blur{--tw-backdrop-blur:blur(8px);-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,)}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-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,)}.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,)}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-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,)}.backdrop-grayscale{--tw-backdrop-grayscale:grayscale(100%);-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,)}.backdrop-invert{--tw-backdrop-invert:invert(100%);-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,)}.backdrop-sepia{--tw-backdrop-sepia:sepia(100%);-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,)}.backdrop-filter{-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{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition\!{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events!important;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--tw-duration,var(--default-transition-duration))!important}.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}.duration-500{--tw-duration:.5s;transition-duration:.5s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.select-text{-webkit-user-select:text;user-select:text}:where(.divide-x-reverse>:not(:last-child)){--tw-divide-x-reverse:1}.ring-inset{--tw-ring-inset:inset}@media(hover:hover){.group-hover\:text-primary:is(:where(.group):hover *){color:hsl(var(--primary))}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.last\:border-0:last-child{border-style:var(--tw-border-style);border-width:0}@media(hover:hover){.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:border-border:hover{border-color:hsl(var(--border))}.hover\:border-primary\/20:hover{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/20:hover{border-color:color-mix(in oklab,hsl(var(--primary)) 20%,transparent)}}.hover\:border-primary\/30:hover{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/30:hover{border-color:color-mix(in oklab,hsl(var(--primary)) 30%,transparent)}}.hover\:border-primary\/40:hover{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/40:hover{border-color:color-mix(in oklab,hsl(var(--primary)) 40%,transparent)}}.hover\:border-primary\/45:hover{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/45:hover{border-color:color-mix(in oklab,hsl(var(--primary)) 45%,transparent)}}.hover\:border-primary\/50:hover{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/50:hover{border-color:color-mix(in oklab,hsl(var(--primary)) 50%,transparent)}}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-amber-400:hover{background-color:var(--color-amber-400)}.hover\:bg-amber-500\/10:hover{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-amber-500\/10:hover{background-color:color-mix(in oklab,var(--color-amber-500) 10%,transparent)}}.hover\:bg-amber-500\/15:hover{background-color:#f99c0026}@supports (color:color-mix(in lab,red,red)){.hover\:bg-amber-500\/15:hover{background-color:color-mix(in oklab,var(--color-amber-500) 15%,transparent)}}.hover\:bg-amber-500\/20:hover{background-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.hover\:bg-amber-500\/20:hover{background-color:color-mix(in oklab,var(--color-amber-500) 20%,transparent)}}.hover\:bg-background\/30:hover{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-background\/30:hover{background-color:color-mix(in oklab,hsl(var(--background)) 30%,transparent)}}.hover\:bg-background\/40:hover{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-background\/40:hover{background-color:color-mix(in oklab,hsl(var(--background)) 40%,transparent)}}.hover\:bg-background\/60:hover{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-background\/60:hover{background-color:color-mix(in oklab,hsl(var(--background)) 60%,transparent)}}.hover\:bg-background\/80:hover{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-background\/80:hover{background-color:color-mix(in oklab,hsl(var(--background)) 80%,transparent)}}.hover\:bg-emerald-500\/10:hover{background-color:#00bb7f1a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-emerald-500\/10:hover{background-color:color-mix(in oklab,var(--color-emerald-500) 10%,transparent)}}.hover\:bg-emerald-500\/15:hover{background-color:#00bb7f26}@supports (color:color-mix(in lab,red,red)){.hover\:bg-emerald-500\/15:hover{background-color:color-mix(in oklab,var(--color-emerald-500) 15%,transparent)}}.hover\:bg-fuchsia-500\/20:hover{background-color:#e12afb33}@supports (color:color-mix(in lab,red,red)){.hover\:bg-fuchsia-500\/20:hover{background-color:color-mix(in oklab,var(--color-fuchsia-500) 20%,transparent)}}.hover\:bg-indigo-500\/15:hover{background-color:#625fff26}@supports (color:color-mix(in lab,red,red)){.hover\:bg-indigo-500\/15:hover{background-color:color-mix(in oklab,var(--color-indigo-500) 15%,transparent)}}.hover\:bg-primary\/5:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/5:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 5%,transparent)}}.hover\:bg-primary\/10:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/10:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 10%,transparent)}}.hover\:bg-primary\/15:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/15:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 15%,transparent)}}.hover\:bg-primary\/20:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/20:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 20%,transparent)}}.hover\:bg-primary\/25:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/25:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 25%,transparent)}}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 90%,transparent)}}.hover\:bg-primary\/95:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/95:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 95%,transparent)}}.hover\:bg-red-400:hover{background-color:var(--color-red-400)}.hover\:bg-red-500\/5:hover{background-color:#fb2c360d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-500\/5:hover{background-color:color-mix(in oklab,var(--color-red-500) 5%,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-500\/20:hover{background-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-500\/20:hover{background-color:color-mix(in oklab,var(--color-red-500) 20%,transparent)}}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:text-primary:hover,.hover\:text-primary\/80:hover{color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:text-primary\/80:hover{color:color-mix(in oklab,hsl(var(--primary)) 80%,transparent)}}.hover\:text-red-300:hover{color:var(--color-red-300)}.hover\:text-red-400:hover{color:var(--color-red-400)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-90:hover{opacity:.9}}.focus\:border-primary:focus,.focus\:border-primary\/50:focus{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.focus\:border-primary\/50:focus{border-color:color-mix(in oklab,hsl(var(--primary)) 50%,transparent)}}.focus\:ring-1:focus{--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)}.focus\:ring-primary:focus,.focus\:ring-primary\/50:focus{--tw-ring-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.focus\:ring-primary\/50:focus{--tw-ring-color:color-mix(in oklab, hsl(var(--primary)) 50%, transparent)}}.focus\:ring-violet-500\/50:focus{--tw-ring-color:#8d54ff80}@supports (color:color-mix(in lab,red,red)){.focus\:ring-violet-500\/50:focus{--tw-ring-color:color-mix(in oklab, var(--color-violet-500) 50%, transparent)}}.focus-visible\:ring-2:focus-visible{--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-visible\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:cursor-default:disabled{cursor:default}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.aria-selected\:bg-accent[aria-selected=true]{background-color:hsl(var(--accent))}.aria-selected\:text-accent-foreground[aria-selected=true]{color:hsl(var(--accent-foreground))}@media(min-width:40rem){.sm\:w-\[640px\]{width:640px}.sm\:max-w-\[400px\]{max-width:400px}.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\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:self-auto{align-self:auto}.sm\:p-10{padding:calc(var(--spacing) * 10)}}@media(min-width:48rem){.md\:col-span-2{grid-column:span 2/span 2}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-\[170px_1fr\]{grid-template-columns:170px 1fr}}@media(min-width:64rem){.lg\:flex{display:flex}.lg\:w-40{width:calc(var(--spacing) * 40)}.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\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:grid-cols-\[1fr_300px\]{grid-template-columns:1fr 300px}.lg\:flex-row{flex-direction:row}.lg\:items-center{align-items:center}.lg\:items-stretch{align-items:stretch}}}:root{--background:224 30% 6%;--foreground:210 20% 92%;--card:224 25% 10%;--card-foreground:210 20% 94%;--popover:224 28% 9%;--popover-foreground:210 20% 94%;--primary:172 72% 50%;--primary-foreground:224 47% 8%;--muted:220 16% 14%;--muted-foreground:215 14% 64%;--accent:220 16% 16%;--accent-foreground:210 20% 94%;--border:222 18% 23%;--input:222 18% 23%;--ring:172 72% 50%;--radius:.75rem;color-scheme:dark}.light{--background:0 0% 100%;--foreground:222 22% 12%;--card:0 0% 100%;--card-foreground:222 22% 12%;--popover:0 0% 100%;--popover-foreground:222 22% 12%;--primary:172 70% 38%;--primary-foreground:0 0% 100%;--muted:220 14% 95%;--muted-foreground:220 9% 42%;--accent:220 14% 94%;--accent-foreground:222 22% 12%;--border:220 13% 88%;--input:220 13% 88%;--ring:172 66% 50%;color-scheme:light}@keyframes aurora{0%{background-position:0%}50%{background-position:100%}to{background-position:0%}}.animate-aurora{background-size:200% 200%;animation:25s infinite aurora}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:hsl(var(--border));border-radius:9999px}*{border-color:hsl(var(--border) / .85);outline-color:hsl(var(--primary) / .5)}:focus-visible{outline:2px solid hsl(var(--primary) / .7);outline-offset:2px}@media(prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}html,body,#root{height:100%;overflow:hidden}body{background-color:hsl(var(--background));color:hsl(var(--foreground));font-family:var(--font-sans);-webkit-font-smoothing:antialiased;margin:0}@keyframes flow-cyan{0%{stroke-dasharray:6 3;stroke-dashoffset:18px}to{stroke-dasharray:6 3;stroke-dashoffset:0}}.animate-flow-cyan{animation:1.2s linear infinite flow-cyan}.rounded-2xl.border.bg-card\/45{position:relative;overflow:hidden;background-color:hsl(var(--card) / .85)!important;border-color:hsl(var(--border) / .95)!important;transition:transform .3s cubic-bezier(.4,0,.2,1),background-color .3s cubic-bezier(.4,0,.2,1),border-color .3s cubic-bezier(.4,0,.2,1),box-shadow .3s cubic-bezier(.4,0,.2,1)!important;box-shadow:0 10px 30px -15px #00000073,inset 0 1px #ffffff0d!important}.rounded-2xl.border.bg-card\/45:before{content:"";background:linear-gradient(90deg,hsl(var(--primary)),#6366f1,#a855f7);opacity:.75;height:3.5px;position:absolute;top:0;left:0;right:0;transition:opacity .3s!important}.rounded-2xl.border.bg-card\/45:hover{transform:translateY(-3px);background-color:hsl(var(--card) / .92)!important;border-color:hsl(var(--primary) / .35)!important;box-shadow:0 20px 40px -20px #000000a6,0 0 18px 2px hsl(var(--primary) / .05)!important}.rounded-2xl.border.bg-card\/45:hover:before{opacity:1}.rounded-xl.border.bg-card\/45{background-color:hsl(var(--card) / .88)!important;border-color:hsl(var(--border) / .9)!important;transition:background-color .2s,border-color .2s!important}.rounded-xl.border.bg-card\/45:hover{background-color:hsl(var(--card) / .95)!important;border-color:hsl(var(--primary) / .3)!important}aside nav a[class*="bg-primary/15"]:not([class*=justify-center]){background:linear-gradient(90deg,hsl(var(--primary) / .18),#6366f11f)!important;color:hsl(var(--primary))!important;border-left:3.5px solid hsl(var(--primary))!important;border-radius:0 var(--radius) var(--radius) 0!important;padding-left:calc(.75rem - 3.5px)!important;box-shadow:inset 0 1px #ffffff05!important}aside nav a[class*="bg-primary/15"][class*=justify-center]{background:hsl(var(--primary) / .18)!important;color:hsl(var(--primary))!important;box-shadow:0 0 12px 1px hsl(var(--primary) / .1)!important;border:1px solid hsl(var(--primary) / .3)!important}::-webkit-scrollbar-thumb{border-radius:9999px;background:hsl(var(--primary) / .25)!important}::-webkit-scrollbar-thumb:hover{background:hsl(var(--primary) / .5)!important}input:focus,textarea:focus,select:focus{outline:none;border-color:hsl(var(--primary))!important;box-shadow:0 0 0 2px hsl(var(--primary) / .15)!important}@media(min-width:1440px){html{font-size:16.5px}}@media(min-width:1920px){html{font-size:17.5px}}@media(min-width:2560px){html{font-size:19px}}@media(min-width:3440px){html{font-size:20px}}@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-pan-x{syntax:"*";inherits:false}@property --tw-pan-y{syntax:"*";inherits:false}@property --tw-pinch-zoom{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{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-outline-style{syntax:"*";inherits:false;initial-value:solid}@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}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}} diff --git a/frontend/dist/assets/index-DYJjhQkk.js b/frontend/dist/assets/index-DYJjhQkk.js deleted file mode 100644 index 997ede3..0000000 --- a/frontend/dist/assets/index-DYJjhQkk.js +++ /dev/null @@ -1,5481 +0,0 @@ -var AW=Object.defineProperty;var zN=t=>{throw TypeError(t)};var TW=(t,e,n)=>e in t?AW(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var Gs=(t,e,n)=>TW(t,typeof e!="symbol"?e+"":e,n),ZM=(t,e,n)=>e.has(t)||zN("Cannot "+n);var ge=(t,e,n)=>(ZM(t,e,"read from private field"),n?n.call(t):e.get(t)),Gt=(t,e,n)=>e.has(t)?zN("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,n),wt=(t,e,n,r)=>(ZM(t,e,"write to private field"),r?r.call(t,n):e.set(t,n),n),_n=(t,e,n)=>(ZM(t,e,"access private method"),n);var fb=(t,e,n,r)=>({set _(i){wt(t,e,i,n)},get _(){return ge(t,e,r)}});function PW(t,e){for(var n=0;nr[i]})}}}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 i of document.querySelectorAll('link[rel="modulepreload"]'))r(i);new MutationObserver(i=>{for(const s of i)if(s.type==="childList")for(const a of s.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&r(a)}).observe(document,{childList:!0,subtree:!0});function n(i){const s={};return i.integrity&&(s.integrity=i.integrity),i.referrerPolicy&&(s.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?s.credentials="include":i.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function r(i){if(i.ep)return;i.ep=!0;const s=n(i);fetch(i.href,s)}})();function V1(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var QM={exports:{}},n0={},JM={exports:{}},gn={};/** - * @license React - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var BN;function CW(){if(BN)return gn;BN=1;var t=Symbol.for("react.element"),e=Symbol.for("react.portal"),n=Symbol.for("react.fragment"),r=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),s=Symbol.for("react.provider"),a=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.iterator;function p(H){return H===null||typeof H!="object"?null:(H=f&&H[f]||H["@@iterator"],typeof H=="function"?H:null)}var y={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},b=Object.assign,S={};function w(H,G,le){this.props=H,this.context=G,this.refs=S,this.updater=le||y}w.prototype.isReactComponent={},w.prototype.setState=function(H,G){if(typeof H!="object"&&typeof H!="function"&&H!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,H,G,"setState")},w.prototype.forceUpdate=function(H){this.updater.enqueueForceUpdate(this,H,"forceUpdate")};function x(){}x.prototype=w.prototype;function M(H,G,le){this.props=H,this.context=G,this.refs=S,this.updater=le||y}var T=M.prototype=new x;T.constructor=M,b(T,w.prototype),T.isPureReactComponent=!0;var P=Array.isArray,O=Object.prototype.hasOwnProperty,N={current:null},D={key:!0,ref:!0,__self:!0,__source:!0};function z(H,G,le){var se,ce={},Se=null,we=null;if(G!=null)for(se in G.ref!==void 0&&(we=G.ref),G.key!==void 0&&(Se=""+G.key),G)O.call(G,se)&&!D.hasOwnProperty(se)&&(ce[se]=G[se]);var We=arguments.length-2;if(We===1)ce.children=le;else if(1>>1,G=B[H];if(0>>1;Hi(ce,Y))Sei(we,ce)?(B[H]=we,B[Se]=Y,H=Se):(B[H]=ce,B[se]=Y,H=se);else if(Sei(we,Y))B[H]=we,B[Se]=Y,H=Se;else break e}}return J}function i(B,J){var Y=B.sortIndex-J.sortIndex;return Y!==0?Y:B.id-J.id}if(typeof performance=="object"&&typeof performance.now=="function"){var s=performance;t.unstable_now=function(){return s.now()}}else{var a=Date,o=a.now();t.unstable_now=function(){return a.now()-o}}var l=[],c=[],d=1,f=null,p=3,y=!1,b=!1,S=!1,w=typeof setTimeout=="function"?setTimeout:null,x=typeof clearTimeout=="function"?clearTimeout:null,M=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function T(B){for(var J=n(c);J!==null;){if(J.callback===null)r(c);else if(J.startTime<=B)r(c),J.sortIndex=J.expirationTime,e(l,J);else break;J=n(c)}}function P(B){if(S=!1,T(B),!b)if(n(l)!==null)b=!0,ae(O);else{var J=n(c);J!==null&&he(P,J.startTime-B)}}function O(B,J){b=!1,S&&(S=!1,x(z),z=-1),y=!0;var Y=p;try{for(T(J),f=n(l);f!==null&&(!(f.expirationTime>J)||B&&!j());){var H=f.callback;if(typeof H=="function"){f.callback=null,p=f.priorityLevel;var G=H(f.expirationTime<=J);J=t.unstable_now(),typeof G=="function"?f.callback=G:f===n(l)&&r(l),T(J)}else r(l);f=n(l)}if(f!==null)var le=!0;else{var se=n(c);se!==null&&he(P,se.startTime-J),le=!1}return le}finally{f=null,p=Y,y=!1}}var N=!1,D=null,z=-1,V=5,k=-1;function j(){return!(t.unstable_now()-kB||125H?(B.sortIndex=Y,e(c,B),n(l)===null&&B===n(c)&&(S?(x(z),z=-1):S=!0,he(P,Y-H))):(B.sortIndex=G,e(l,B),b||y||(b=!0,ae(O))),B},t.unstable_shouldYield=j,t.unstable_wrapCallback=function(B){var J=p;return function(){var Y=p;p=J;try{return B.apply(this,arguments)}finally{p=Y}}}})(nE)),nE}var $N;function kW(){return $N||($N=1,tE.exports=IW()),tE.exports}/** - * @license React - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var XN;function OW(){if(XN)return Ws;XN=1;var t=qh(),e=kW();function n(u){for(var h="https://reactjs.org/docs/error-decoder.html?invariant="+u,_=1;_"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),l=Object.prototype.hasOwnProperty,c=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,d={},f={};function p(u){return l.call(f,u)?!0:l.call(d,u)?!1:c.test(u)?f[u]=!0:(d[u]=!0,!1)}function y(u,h,_,A){if(_!==null&&_.type===0)return!1;switch(typeof h){case"function":case"symbol":return!0;case"boolean":return A?!1:_!==null?!_.acceptsBooleans:(u=u.toLowerCase().slice(0,5),u!=="data-"&&u!=="aria-");default:return!1}}function b(u,h,_,A){if(h===null||typeof h>"u"||y(u,h,_,A))return!0;if(A)return!1;if(_!==null)switch(_.type){case 3:return!h;case 4:return h===!1;case 5:return isNaN(h);case 6:return isNaN(h)||1>h}return!1}function S(u,h,_,A,I,U,$){this.acceptsBooleans=h===2||h===3||h===4,this.attributeName=A,this.attributeNamespace=I,this.mustUseProperty=_,this.propertyName=u,this.type=h,this.sanitizeURL=U,this.removeEmptyString=$}var w={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(u){w[u]=new S(u,0,!1,u,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(u){var h=u[0];w[h]=new S(h,1,!1,u[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(u){w[u]=new S(u,2,!1,u.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(u){w[u]=new S(u,2,!1,u,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(u){w[u]=new S(u,3,!1,u.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(u){w[u]=new S(u,3,!0,u,null,!1,!1)}),["capture","download"].forEach(function(u){w[u]=new S(u,4,!1,u,null,!1,!1)}),["cols","rows","size","span"].forEach(function(u){w[u]=new S(u,6,!1,u,null,!1,!1)}),["rowSpan","start"].forEach(function(u){w[u]=new S(u,5,!1,u.toLowerCase(),null,!1,!1)});var x=/[\-:]([a-z])/g;function M(u){return u[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(u){var h=u.replace(x,M);w[h]=new S(h,1,!1,u,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(u){var h=u.replace(x,M);w[h]=new S(h,1,!1,u,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(u){var h=u.replace(x,M);w[h]=new S(h,1,!1,u,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(u){w[u]=new S(u,1,!1,u.toLowerCase(),null,!1,!1)}),w.xlinkHref=new S("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(u){w[u]=new S(u,1,!1,u.toLowerCase(),null,!0,!0)});function T(u,h,_,A){var I=w.hasOwnProperty(h)?w[h]:null;(I!==null?I.type!==0:A||!(2oe||I[$]!==U[oe]){var me=` -`+I[$].replace(" at new "," at ");return u.displayName&&me.includes("")&&(me=me.replace("",u.displayName)),me}while(1<=$&&0<=oe);break}}}finally{le=!1,Error.prepareStackTrace=_}return(u=u?u.displayName||u.name:"")?G(u):""}function ce(u){switch(u.tag){case 5:return G(u.type);case 16:return G("Lazy");case 13:return G("Suspense");case 19:return G("SuspenseList");case 0:case 2:case 15:return u=se(u.type,!1),u;case 11:return u=se(u.type.render,!1),u;case 1:return u=se(u.type,!0),u;default:return""}}function Se(u){if(u==null)return null;if(typeof u=="function")return u.displayName||u.name||null;if(typeof u=="string")return u;switch(u){case D:return"Fragment";case N:return"Portal";case V:return"Profiler";case z:return"StrictMode";case ee:return"Suspense";case ie:return"SuspenseList"}if(typeof u=="object")switch(u.$$typeof){case j:return(u.displayName||"Context")+".Consumer";case k:return(u._context.displayName||"Context")+".Provider";case X:var h=u.render;return u=u.displayName,u||(u=h.displayName||h.name||"",u=u!==""?"ForwardRef("+u+")":"ForwardRef"),u;case pe:return h=u.displayName||null,h!==null?h:Se(u.type)||"Memo";case ae:h=u._payload,u=u._init;try{return Se(u(h))}catch{}}return null}function we(u){var h=u.type;switch(u.tag){case 24:return"Cache";case 9:return(h.displayName||"Context")+".Consumer";case 10:return(h._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return u=h.render,u=u.displayName||u.name||"",h.displayName||(u!==""?"ForwardRef("+u+")":"ForwardRef");case 7:return"Fragment";case 5:return h;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return Se(h);case 8:return h===z?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof h=="function")return h.displayName||h.name||null;if(typeof h=="string")return h}return null}function We(u){switch(typeof u){case"boolean":case"number":case"string":case"undefined":return u;case"object":return u;default:return""}}function Ee(u){var h=u.type;return(u=u.nodeName)&&u.toLowerCase()==="input"&&(h==="checkbox"||h==="radio")}function Ge(u){var h=Ee(u)?"checked":"value",_=Object.getOwnPropertyDescriptor(u.constructor.prototype,h),A=""+u[h];if(!u.hasOwnProperty(h)&&typeof _<"u"&&typeof _.get=="function"&&typeof _.set=="function"){var I=_.get,U=_.set;return Object.defineProperty(u,h,{configurable:!0,get:function(){return I.call(this)},set:function($){A=""+$,U.call(this,$)}}),Object.defineProperty(u,h,{enumerable:_.enumerable}),{getValue:function(){return A},setValue:function($){A=""+$},stopTracking:function(){u._valueTracker=null,delete u[h]}}}}function $e(u){u._valueTracker||(u._valueTracker=Ge(u))}function de(u){if(!u)return!1;var h=u._valueTracker;if(!h)return!0;var _=h.getValue(),A="";return u&&(A=Ee(u)?u.checked?"true":"false":u.value),u=A,u!==_?(h.setValue(u),!0):!1}function Z(u){if(u=u||(typeof document<"u"?document:void 0),typeof u>"u")return null;try{return u.activeElement||u.body}catch{return u.body}}function Ve(u,h){var _=h.checked;return Y({},h,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:_??u._wrapperState.initialChecked})}function Le(u,h){var _=h.defaultValue==null?"":h.defaultValue,A=h.checked!=null?h.checked:h.defaultChecked;_=We(h.value!=null?h.value:_),u._wrapperState={initialChecked:A,initialValue:_,controlled:h.type==="checkbox"||h.type==="radio"?h.checked!=null:h.value!=null}}function ne(u,h){h=h.checked,h!=null&&T(u,"checked",h,!1)}function Ce(u,h){ne(u,h);var _=We(h.value),A=h.type;if(_!=null)A==="number"?(_===0&&u.value===""||u.value!=_)&&(u.value=""+_):u.value!==""+_&&(u.value=""+_);else if(A==="submit"||A==="reset"){u.removeAttribute("value");return}h.hasOwnProperty("value")?Ze(u,h.type,_):h.hasOwnProperty("defaultValue")&&Ze(u,h.type,We(h.defaultValue)),h.checked==null&&h.defaultChecked!=null&&(u.defaultChecked=!!h.defaultChecked)}function Xe(u,h,_){if(h.hasOwnProperty("value")||h.hasOwnProperty("defaultValue")){var A=h.type;if(!(A!=="submit"&&A!=="reset"||h.value!==void 0&&h.value!==null))return;h=""+u._wrapperState.initialValue,_||h===u.value||(u.value=h),u.defaultValue=h}_=u.name,_!==""&&(u.name=""),u.defaultChecked=!!u._wrapperState.initialChecked,_!==""&&(u.name=_)}function Ze(u,h,_){(h!=="number"||Z(u.ownerDocument)!==u)&&(_==null?u.defaultValue=""+u._wrapperState.initialValue:u.defaultValue!==""+_&&(u.defaultValue=""+_))}var Q=Array.isArray;function W(u,h,_,A){if(u=u.options,h){h={};for(var I=0;I<_.length;I++)h["$"+_[I]]=!0;for(_=0;_"+h.valueOf().toString()+"",h=ht.firstChild;u.firstChild;)u.removeChild(u.firstChild);for(;h.firstChild;)u.appendChild(h.firstChild)}});function Ke(u,h){if(h){var _=u.firstChild;if(_&&_===u.lastChild&&_.nodeType===3){_.nodeValue=h;return}}u.textContent=h}var te={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},tt=["Webkit","ms","Moz","O"];Object.keys(te).forEach(function(u){tt.forEach(function(h){h=h+u.charAt(0).toUpperCase()+u.substring(1),te[h]=te[u]})});function Mt(u,h,_){return h==null||typeof h=="boolean"||h===""?"":_||typeof h!="number"||h===0||te.hasOwnProperty(u)&&te[u]?(""+h).trim():h+"px"}function vt(u,h){u=u.style;for(var _ in h)if(h.hasOwnProperty(_)){var A=_.indexOf("--")===0,I=Mt(_,h[_],A);_==="float"&&(_="cssFloat"),A?u.setProperty(_,I):u[_]=I}}var Zt=Y({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function fe(u,h){if(h){if(Zt[u]&&(h.children!=null||h.dangerouslySetInnerHTML!=null))throw Error(n(137,u));if(h.dangerouslySetInnerHTML!=null){if(h.children!=null)throw Error(n(60));if(typeof h.dangerouslySetInnerHTML!="object"||!("__html"in h.dangerouslySetInnerHTML))throw Error(n(61))}if(h.style!=null&&typeof h.style!="object")throw Error(n(62))}}function qe(u,h){if(u.indexOf("-")===-1)return typeof h.is=="string";switch(u){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var ue=null;function Ye(u){return u=u.target||u.srcElement||window,u.correspondingUseElement&&(u=u.correspondingUseElement),u.nodeType===3?u.parentNode:u}var Re=null,Be=null,at=null;function pt(u){if(u=ho(u)){if(typeof Re!="function")throw Error(n(280));var h=u.stateNode;h&&(h=Up(h),Re(u.stateNode,u.type,h))}}function Jt(u){Be?at?at.push(u):at=[u]:Be=u}function pn(){if(Be){var u=Be,h=at;if(at=Be=null,pt(u),h)for(u=0;u>>=0,u===0?32:31-(xn(u)/tn|0)|0}var li=64,In=4194304;function Is(u){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: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 u&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return u&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return u}}function Vn(u,h){var _=u.pendingLanes;if(_===0)return 0;var A=0,I=u.suspendedLanes,U=u.pingedLanes,$=_&268435455;if($!==0){var oe=$&~I;oe!==0?A=Is(oe):(U&=$,U!==0&&(A=Is(U)))}else $=_&~I,$!==0?A=Is($):U!==0&&(A=Is(U));if(A===0)return 0;if(h!==0&&h!==A&&(h&I)===0&&(I=A&-A,U=h&-h,I>=U||I===16&&(U&4194240)!==0))return h;if((A&4)!==0&&(A|=_&16),h=u.entangledLanes,h!==0)for(u=u.entanglements,h&=A;0_;_++)h.push(u);return h}function Zo(u,h,_){u.pendingLanes|=h,h!==536870912&&(u.suspendedLanes=0,u.pingedLanes=0),u=u.eventTimes,h=31-mt(h),u[h]=_}function _M(u,h){var _=u.pendingLanes&~h;u.pendingLanes=h,u.suspendedLanes=0,u.pingedLanes=0,u.expiredLanes&=h,u.mutableReadLanes&=h,u.entangledLanes&=h,h=u.entanglements;var A=u.eventTimes;for(u=u.expirationTimes;0<_;){var I=31-mt(_),U=1<=qr),js=" ",vv=!1;function yv(u,h){switch(u){case"keyup":return gv.indexOf(h.keyCode)!==-1;case"keydown":return h.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function bp(u){return u=u.detail,typeof u=="object"&&"data"in u?u.data:null}var tl=!1;function Tx(u,h){switch(u){case"compositionend":return bp(h);case"keypress":return h.which!==32?null:(vv=!0,js);case"textInput":return u=h.data,u===js&&vv?null:u;default:return null}}function Gd(u,h){if(tl)return u==="compositionend"||!Ci&&yv(u,h)?(u=Hd(),$i=uv=na=null,tl=!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:_,offset:h-u};u=A}e:{for(;_;){if(_.nextSibling){_=_.nextSibling;break e}_=_.parentNode}_=void 0}_=Wd(_)}}function Jl(u,h){return u&&h?u===h?!0:u&&u.nodeType===3?!1:h&&h.nodeType===3?Jl(u,h.parentNode):"contains"in u?u.contains(h):u.compareDocumentPosition?!!(u.compareDocumentPosition(h)&16):!1:!1}function rr(){for(var u=window,h=Z();h instanceof u.HTMLIFrameElement;){try{var _=typeof h.contentWindow.location.href=="string"}catch{_=!1}if(_)u=h.contentWindow;else break;h=Z(u.document)}return h}function Dr(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")}function Ur(u){var h=rr(),_=u.focusedElem,A=u.selectionRange;if(h!==_&&_&&_.ownerDocument&&Jl(_.ownerDocument.documentElement,_)){if(A!==null&&Dr(_)){if(h=A.start,u=A.end,u===void 0&&(u=h),"selectionStart"in _)_.selectionStart=h,_.selectionEnd=Math.min(u,_.value.length);else if(u=(h=_.ownerDocument||document)&&h.defaultView||window,u.getSelection){u=u.getSelection();var I=_.textContent.length,U=Math.min(A.start,I);A=A.end===void 0?U:Math.min(A.end,I),!u.extend&&U>A&&(I=A,A=U,U=I),I=fs(_,U);var $=fs(_,A);I&&$&&(u.rangeCount!==1||u.anchorNode!==I.node||u.anchorOffset!==I.offset||u.focusNode!==$.node||u.focusOffset!==$.offset)&&(h=h.createRange(),h.setStart(I.node,I.offset),u.removeAllRanges(),U>A?(u.addRange(h),u.extend($.node,$.offset)):(h.setEnd($.node,$.offset),u.addRange(h)))}}for(h=[],u=_;u=u.parentNode;)u.nodeType===1&&h.push({element:u,left:u.scrollLeft,top:u.scrollTop});for(typeof _.focus=="function"&&_.focus(),_=0;_=document.documentMode,Ra=null,ec=null,$d=null,jr=!1;function Ep(u,h,_){var A=_.window===_?_.document:_.nodeType===9?_:_.ownerDocument;jr||Ra==null||Ra!==Z(A)||(A=Ra,"selectionStart"in A&&Dr(A)?A={start:A.selectionStart,end:A.selectionEnd}:(A=(A.ownerDocument&&A.ownerDocument.defaultView||window).getSelection(),A={anchorNode:A.anchorNode,anchorOffset:A.anchorOffset,focusNode:A.focusNode,focusOffset:A.focusOffset}),$d&&Ql($d,A)||($d=A,A=Ip(ec,"onSelect"),0Fr||(u.current=Rv[Fr],Rv[Fr]=null,Fr--)}function Gn(u,h){Fr++,Rv[Fr]=u.current,u.current=h}var po={},Kr=lr(po),Ri=lr(!1),mo=po;function ic(u,h){var _=u.type.contextTypes;if(!_)return po;var A=u.stateNode;if(A&&A.__reactInternalMemoizedUnmaskedChildContext===h)return A.__reactInternalMemoizedMaskedChildContext;var I={},U;for(U in _)I[U]=h[U];return A&&(u=u.stateNode,u.__reactInternalMemoizedUnmaskedChildContext=h,u.__reactInternalMemoizedMaskedChildContext=I),I}function ui(u){return u=u.childContextTypes,u!=null}function ef(){$n(Ri),$n(Kr)}function Nv(u,h,_){if(Kr.current!==po)throw Error(n(168));Gn(Kr,h),Gn(Ri,_)}function tf(u,h,_){var A=u.stateNode;if(h=h.childContextTypes,typeof A.getChildContext!="function")return _;A=A.getChildContext();for(var I in A)if(!(I in h))throw Error(n(108,we(u)||"Unknown",I));return Y({},_,A)}function sc(u){return u=(u=u.stateNode)&&u.__reactInternalMemoizedMergedChildContext||po,mo=Kr.current,Gn(Kr,u),Gn(Ri,Ri.current),!0}function Iv(u,h,_){var A=u.stateNode;if(!A)throw Error(n(169));_?(u=tf(u,h,mo),A.__reactInternalMemoizedMergedChildContext=u,$n(Ri),$n(Kr),Gn(Kr,u)):$n(Ri),Gn(Ri,_)}var aa=null,nf=!1,jp=!1;function rf(u){aa===null?aa=[u]:aa.push(u)}function Lx(u){nf=!0,rf(u)}function Ia(){if(!jp&&aa!==null){jp=!0;var u=0,h=Pn;try{var _=aa;for(Pn=1;u<_.length;u++){var A=_[u];do A=A(!0);while(A!==null)}aa=null,nf=!1}catch(I){throw aa!==null&&(aa=aa.slice(u+1)),Ie(jt,Ia),I}finally{Pn=h,jp=!1}}return null}var ac=[],Ki=0,Fp=null,zp=0,Ni=[],zr=0,oc=null,ut=1,Fs="";function go(u,h){ac[Ki++]=zp,ac[Ki++]=Fp,Fp=u,zp=h}function kv(u,h,_){Ni[zr++]=ut,Ni[zr++]=Fs,Ni[zr++]=oc,oc=u;var A=ut;u=Fs;var I=32-mt(A)-1;A&=~(1<>=$,I-=$,ut=1<<32-mt(h)+I|_<nn?(pi=Vt,Vt=null):pi=Vt.sibling;var Ln=Qe(Ae,Vt,Pe[nn],ot);if(Ln===null){Vt===null&&(Vt=pi);break}u&&Vt&&Ln.alternate===null&&h(Ae,Vt),ve=U(Ln,ve,nn),Ht===null?Dt=Ln:Ht.sibling=Ln,Ht=Ln,Vt=pi}if(nn===Pe.length)return _(Ae,Vt),Kn&&go(Ae,nn),Dt;if(Vt===null){for(;nnnn?(pi=Vt,Vt=null):pi=Vt.sibling;var Bu=Qe(Ae,Vt,Ln.value,ot);if(Bu===null){Vt===null&&(Vt=pi);break}u&&Vt&&Bu.alternate===null&&h(Ae,Vt),ve=U(Bu,ve,nn),Ht===null?Dt=Bu:Ht.sibling=Bu,Ht=Bu,Vt=pi}if(Ln.done)return _(Ae,Vt),Kn&&go(Ae,nn),Dt;if(Vt===null){for(;!Ln.done;nn++,Ln=Pe.next())Ln=nt(Ae,Ln.value,ot),Ln!==null&&(ve=U(Ln,ve,nn),Ht===null?Dt=Ln:Ht.sibling=Ln,Ht=Ln);return Kn&&go(Ae,nn),Dt}for(Vt=A(Ae,Vt);!Ln.done;nn++,Ln=Pe.next())Ln=_t(Vt,Ae,nn,Ln.value,ot),Ln!==null&&(u&&Ln.alternate!==null&&Vt.delete(Ln.key===null?nn:Ln.key),ve=U(Ln,ve,nn),Ht===null?Dt=Ln:Ht.sibling=Ln,Ht=Ln);return u&&Vt.forEach(function(EW){return h(Ae,EW)}),Kn&&go(Ae,nn),Dt}function kr(Ae,ve,Pe,ot){if(typeof Pe=="object"&&Pe!==null&&Pe.type===D&&Pe.key===null&&(Pe=Pe.props.children),typeof Pe=="object"&&Pe!==null){switch(Pe.$$typeof){case O:e:{for(var Dt=Pe.key,Ht=ve;Ht!==null;){if(Ht.key===Dt){if(Dt=Pe.type,Dt===D){if(Ht.tag===7){_(Ae,Ht.sibling),ve=I(Ht,Pe.props.children),ve.return=Ae,Ae=ve;break e}}else if(Ht.elementType===Dt||typeof Dt=="object"&&Dt!==null&&Dt.$$typeof===ae&&jv(Dt)===Ht.type){_(Ae,Ht.sibling),ve=I(Ht,Pe.props),ve.ref=sf(Ae,Ht,Pe),ve.return=Ae,Ae=ve;break e}_(Ae,Ht);break}else h(Ae,Ht);Ht=Ht.sibling}Pe.type===D?(ve=Sf(Pe.props.children,Ae.mode,ot,Pe.key),ve.return=Ae,Ae=ve):(ot=ib(Pe.type,Pe.key,Pe.props,null,Ae.mode,ot),ot.ref=sf(Ae,ve,Pe),ot.return=Ae,Ae=ot)}return $(Ae);case N:e:{for(Ht=Pe.key;ve!==null;){if(ve.key===Ht)if(ve.tag===4&&ve.stateNode.containerInfo===Pe.containerInfo&&ve.stateNode.implementation===Pe.implementation){_(Ae,ve.sibling),ve=I(ve,Pe.children||[]),ve.return=Ae,Ae=ve;break e}else{_(Ae,ve);break}else h(Ae,ve);ve=ve.sibling}ve=$M(Pe,Ae.mode,ot),ve.return=Ae,Ae=ve}return $(Ae);case ae:return Ht=Pe._init,kr(Ae,ve,Ht(Pe._payload),ot)}if(Q(Pe))return Pt(Ae,ve,Pe,ot);if(J(Pe))return Nt(Ae,ve,Pe,ot);af(Ae,Pe)}return typeof Pe=="string"&&Pe!==""||typeof Pe=="number"?(Pe=""+Pe,ve!==null&&ve.tag===6?(_(Ae,ve.sibling),ve=I(ve,Pe),ve.return=Ae,Ae=ve):(_(Ae,ve),ve=WM(Pe,Ae.mode,ot),ve.return=Ae,Ae=ve),$(Ae)):_(Ae,ve)}return kr}var lc=Fv(!0),of=Fv(!1),cc=lr(null),uc=null,yo=null,Ru=null;function dc(){Ru=yo=uc=null}function lf(u){var h=cc.current;$n(cc),u._currentValue=h}function cf(u,h,_){for(;u!==null;){var A=u.alternate;if((u.childLanes&h)!==h?(u.childLanes|=h,A!==null&&(A.childLanes|=h)):A!==null&&(A.childLanes&h)!==h&&(A.childLanes|=h),u===_)break;u=u.return}}function ol(u,h){uc=u,Ru=yo=null,u=u.dependencies,u!==null&&u.firstContext!==null&&((u.lanes&h)!==0&&(ln=!0),u.firstContext=null)}function ps(u){var h=u._currentValue;if(Ru!==u)if(u={context:u,memoizedValue:h,next:null},yo===null){if(uc===null)throw Error(n(308));yo=u,uc.dependencies={lanes:0,firstContext:u}}else yo=yo.next=u;return h}var xo=null;function zv(u){xo===null?xo=[u]:xo.push(u)}function uf(u,h,_,A){var I=h.interleaved;return I===null?(_.next=_,zv(h)):(_.next=I.next,I.next=_),h.interleaved=_,oa(u,A)}function oa(u,h){u.lanes|=h;var _=u.alternate;for(_!==null&&(_.lanes|=h),_=u,u=u.return;u!==null;)u.childLanes|=h,_=u.alternate,_!==null&&(_.childLanes|=h),_=u,u=u.return;return _.tag===3?_.stateNode:null}var Fn=!1;function on(u){u.updateQueue={baseState:u.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function gr(u,h){u=u.updateQueue,h.updateQueue===u&&(h.updateQueue={baseState:u.baseState,firstBaseUpdate:u.firstBaseUpdate,lastBaseUpdate:u.lastBaseUpdate,shared:u.shared,effects:u.effects})}function zn(u,h){return{eventTime:u,lane:h,tag:0,payload:null,callback:null,next:null}}function Jn(u,h,_){var A=u.updateQueue;if(A===null)return null;if(A=A.shared,(kn&2)!==0){var I=A.pending;return I===null?h.next=h:(h.next=I.next,I.next=h),A.pending=h,oa(u,_)}return I=A.interleaved,I===null?(h.next=h,zv(A)):(h.next=I.next,I.next=h),A.interleaved=h,oa(u,_)}function di(u,h,_){if(h=h.updateQueue,h!==null&&(h=h.shared,(_&4194240)!==0)){var A=h.lanes;A&=u.pendingLanes,_|=A,h.lanes=_,uu(u,_)}}function fc(u,h){var _=u.updateQueue,A=u.alternate;if(A!==null&&(A=A.updateQueue,_===A)){var I=null,U=null;if(_=_.firstBaseUpdate,_!==null){do{var $={eventTime:_.eventTime,lane:_.lane,tag:_.tag,payload:_.payload,callback:_.callback,next:null};U===null?I=U=$:U=U.next=$,_=_.next}while(_!==null);U===null?I=U=h:U=U.next=h}else I=U=h;_={baseState:A.baseState,firstBaseUpdate:I,lastBaseUpdate:U,shared:A.shared,effects:A.effects},u.updateQueue=_;return}u=_.lastBaseUpdate,u===null?_.firstBaseUpdate=h:u.next=h,_.lastBaseUpdate=h}function cr(u,h,_,A){var I=u.updateQueue;Fn=!1;var U=I.firstBaseUpdate,$=I.lastBaseUpdate,oe=I.shared.pending;if(oe!==null){I.shared.pending=null;var me=oe,Oe=me.next;me.next=null,$===null?U=Oe:$.next=Oe,$=me;var et=u.alternate;et!==null&&(et=et.updateQueue,oe=et.lastBaseUpdate,oe!==$&&(oe===null?et.firstBaseUpdate=Oe:oe.next=Oe,et.lastBaseUpdate=me))}if(U!==null){var nt=I.baseState;$=0,et=Oe=me=null,oe=U;do{var Qe=oe.lane,_t=oe.eventTime;if((A&Qe)===Qe){et!==null&&(et=et.next={eventTime:_t,lane:0,tag:oe.tag,payload:oe.payload,callback:oe.callback,next:null});e:{var Pt=u,Nt=oe;switch(Qe=h,_t=_,Nt.tag){case 1:if(Pt=Nt.payload,typeof Pt=="function"){nt=Pt.call(_t,nt,Qe);break e}nt=Pt;break e;case 3:Pt.flags=Pt.flags&-65537|128;case 0:if(Pt=Nt.payload,Qe=typeof Pt=="function"?Pt.call(_t,nt,Qe):Pt,Qe==null)break e;nt=Y({},nt,Qe);break e;case 2:Fn=!0}}oe.callback!==null&&oe.lane!==0&&(u.flags|=64,Qe=I.effects,Qe===null?I.effects=[oe]:Qe.push(oe))}else _t={eventTime:_t,lane:Qe,tag:oe.tag,payload:oe.payload,callback:oe.callback,next:null},et===null?(Oe=et=_t,me=nt):et=et.next=_t,$|=Qe;if(oe=oe.next,oe===null){if(oe=I.shared.pending,oe===null)break;Qe=oe,oe=Qe.next,Qe.next=null,I.lastBaseUpdate=Qe,I.shared.pending=null}}while(!0);if(et===null&&(me=nt),I.baseState=me,I.firstBaseUpdate=Oe,I.lastBaseUpdate=et,h=I.shared.interleaved,h!==null){I=h;do $|=I.lane,I=I.next;while(I!==h)}else U===null&&(I.shared.lanes=0);xf|=$,u.lanes=$,u.memoizedState=nt}}function Nu(u,h,_){if(u=h.effects,h.effects=null,u!==null)for(h=0;h_?_:4,u(!0);var A=gc.transition;gc.transition={};try{u(!1),h()}finally{Pn=_,gc.transition=A}}function So(){return gs().memoizedState}function Xp(u,h,_){var A=ju(u);if(_={lane:A,action:_,hasEagerState:!1,eagerState:null,next:null},vf(u))qp(h,_);else if(_=uf(u,h,_,A),_!==null){var I=xs();To(_,u,A,I),Kp(_,h,A)}}function vc(u,h,_){var A=ju(u),I={lane:A,action:_,hasEagerState:!1,eagerState:null,next:null};if(vf(u))qp(h,I);else{var U=u.alternate;if(u.lanes===0&&(U===null||U.lanes===0)&&(U=h.lastRenderedReducer,U!==null))try{var $=h.lastRenderedState,oe=U($,_);if(I.hasEagerState=!0,I.eagerState=oe,ds(oe,$)){var me=h.interleaved;me===null?(I.next=I,zv(h)):(I.next=me.next,me.next=I),h.interleaved=I;return}}catch{}finally{}_=uf(u,h,I,A),_!==null&&(I=xs(),To(_,u,A,I),Kp(_,h,A))}}function vf(u){var h=u.alternate;return u===Xn||h!==null&&h===Xn}function qp(u,h){fi=ca=!0;var _=u.pending;_===null?h.next=h:(h.next=_.next,_.next=h),u.pending=h}function Kp(u,h,_){if((_&4194240)!==0){var A=h.lanes;A&=u.pendingLanes,_|=A,h.lanes=_,uu(u,_)}}var Yp={readContext:ps,useCallback:Zr,useContext:Zr,useEffect:Zr,useImperativeHandle:Zr,useInsertionEffect:Zr,useLayoutEffect:Zr,useMemo:Zr,useReducer:Zr,useRef:Zr,useState:Zr,useDebugValue:Zr,useDeferredValue:Zr,useTransition:Zr,useMutableSource:Zr,useSyncExternalStore:Zr,useId:Zr,unstable_isNewReconciler:!1},Hx={readContext:ps,useCallback:function(u,h){return Qr().memoizedState=[u,h===void 0?null:h],u},useContext:ps,useEffect:ki,useImperativeHandle:function(u,h,_){return _=_!=null?_.concat([u]):null,La(4194308,4,zx.bind(null,h,u),_)},useLayoutEffect:function(u,h){return La(4194308,4,u,h)},useInsertionEffect:function(u,h){return La(4,2,u,h)},useMemo:function(u,h){var _=Qr();return h=h===void 0?null:h,u=u(),_.memoizedState=[u,h],u},useReducer:function(u,h,_){var A=Qr();return h=_!==void 0?_(h):h,A.memoizedState=A.baseState=h,u={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:u,lastRenderedState:h},A.queue=u,u=u.dispatch=Xp.bind(null,Xn,u),[A.memoizedState,u]},useRef:function(u){var h=Qr();return u={current:u},h.memoizedState=u},useState:Wv,useDebugValue:Wp,useDeferredValue:function(u){return Qr().memoizedState=u},useTransition:function(){var u=Wv(!1),h=u[0];return u=TM.bind(null,u[1]),Qr().memoizedState=u,[h,u]},useMutableSource:function(){},useSyncExternalStore:function(u,h,_){var A=Xn,I=Qr();if(Kn){if(_===void 0)throw Error(n(407));_=_()}else{if(_=h(),hi===null)throw Error(n(349));(_o&30)!==0||Gp(A,h,_)}I.memoizedState=_;var U={value:_,getSnapshot:h};return I.queue=U,ki(Dx.bind(null,A,U,u),[u]),A.flags|=2048,ua(9,mf.bind(null,A,U,_,h),void 0,null),_},useId:function(){var u=Qr(),h=hi.identifierPrefix;if(Kn){var _=Fs,A=ut;_=(A&~(1<<32-mt(A)-1)).toString(32)+_,h=":"+h+"R"+_,_=cl++,0<_&&(h+="H"+_.toString(32)),h+=":"}else _=Yi++,h=":"+h+"r"+_.toString(32)+":";return u.memoizedState=h},unstable_isNewReconciler:!1},Vx={readContext:ps,useCallback:Bx,useContext:ps,useEffect:$v,useImperativeHandle:qv,useInsertionEffect:Xv,useLayoutEffect:Fx,useMemo:vs,useReducer:pf,useRef:jx,useState:function(){return pf(Ou)},useDebugValue:Wp,useDeferredValue:function(u){var h=gs();return $p(h,ur.memoizedState,u)},useTransition:function(){var u=pf(Ou)[0],h=gs().memoizedState;return[u,h]},useMutableSource:Hv,useSyncExternalStore:Vv,useId:So,unstable_isNewReconciler:!1},Gx={readContext:ps,useCallback:Bx,useContext:ps,useEffect:$v,useImperativeHandle:qv,useInsertionEffect:Xv,useLayoutEffect:Fx,useMemo:vs,useReducer:wo,useRef:jx,useState:function(){return wo(Ou)},useDebugValue:Wp,useDeferredValue:function(u){var h=gs();return ur===null?h.memoizedState=u:$p(h,ur.memoizedState,u)},useTransition:function(){var u=wo(Ou)[0],h=gs().memoizedState;return[u,h]},useMutableSource:Hv,useSyncExternalStore:Vv,useId:So,unstable_isNewReconciler:!1};function Bs(u,h){if(u&&u.defaultProps){h=Y({},h),u=u.defaultProps;for(var _ in u)h[_]===void 0&&(h[_]=u[_]);return h}return h}function yf(u,h,_,A){h=u.memoizedState,_=_(A,h),_=_==null?h:Y({},h,_),u.memoizedState=_,u.lanes===0&&(u.updateQueue.baseState=_)}var Zp={isMounted:function(u){return(u=u._reactInternals)?Ta(u)===u:!1},enqueueSetState:function(u,h,_){u=u._reactInternals;var A=xs(),I=ju(u),U=zn(A,I);U.payload=h,_!=null&&(U.callback=_),h=Jn(u,U,I),h!==null&&(To(h,u,I,A),di(h,u,I))},enqueueReplaceState:function(u,h,_){u=u._reactInternals;var A=xs(),I=ju(u),U=zn(A,I);U.tag=1,U.payload=h,_!=null&&(U.callback=_),h=Jn(u,U,I),h!==null&&(To(h,u,I,A),di(h,u,I))},enqueueForceUpdate:function(u,h){u=u._reactInternals;var _=xs(),A=ju(u),I=zn(_,A);I.tag=2,h!=null&&(I.callback=h),h=Jn(u,I,A),h!==null&&(To(h,u,A,_),di(h,u,A))}};function Wx(u,h,_,A,I,U,$){return u=u.stateNode,typeof u.shouldComponentUpdate=="function"?u.shouldComponentUpdate(A,U,$):h.prototype&&h.prototype.isPureReactComponent?!Ql(_,A)||!Ql(I,U):!0}function m(u,h,_){var A=!1,I=po,U=h.contextType;return typeof U=="object"&&U!==null?U=ps(U):(I=ui(h)?mo:Kr.current,A=h.contextTypes,U=(A=A!=null)?ic(u,I):po),h=new h(_,U),u.memoizedState=h.state!==null&&h.state!==void 0?h.state:null,h.updater=Zp,u.stateNode=h,h._reactInternals=u,A&&(u=u.stateNode,u.__reactInternalMemoizedUnmaskedChildContext=I,u.__reactInternalMemoizedMaskedChildContext=U),h}function g(u,h,_,A){u=h.state,typeof h.componentWillReceiveProps=="function"&&h.componentWillReceiveProps(_,A),typeof h.UNSAFE_componentWillReceiveProps=="function"&&h.UNSAFE_componentWillReceiveProps(_,A),h.state!==u&&Zp.enqueueReplaceState(h,h.state,null)}function E(u,h,_,A){var I=u.stateNode;I.props=_,I.state=u.memoizedState,I.refs={},on(u);var U=h.contextType;typeof U=="object"&&U!==null?I.context=ps(U):(U=ui(h)?mo:Kr.current,I.context=ic(u,U)),I.state=u.memoizedState,U=h.getDerivedStateFromProps,typeof U=="function"&&(yf(u,h,U,_),I.state=u.memoizedState),typeof h.getDerivedStateFromProps=="function"||typeof I.getSnapshotBeforeUpdate=="function"||typeof I.UNSAFE_componentWillMount!="function"&&typeof I.componentWillMount!="function"||(h=I.state,typeof I.componentWillMount=="function"&&I.componentWillMount(),typeof I.UNSAFE_componentWillMount=="function"&&I.UNSAFE_componentWillMount(),h!==I.state&&Zp.enqueueReplaceState(I,I.state,null),cr(u,_,I,A),I.state=u.memoizedState),typeof I.componentDidMount=="function"&&(u.flags|=4194308)}function C(u,h){try{var _="",A=h;do _+=ce(A),A=A.return;while(A);var I=_}catch(U){I=` -Error generating stack: `+U.message+` -`+U.stack}return{value:u,source:h,stack:I,digest:null}}function L(u,h,_){return{value:u,source:null,stack:_??null,digest:h??null}}function F(u,h){try{console.error(h.value)}catch(_){setTimeout(function(){throw _})}}var re=typeof WeakMap=="function"?WeakMap:Map;function ye(u,h,_){_=zn(-1,_),_.tag=3,_.payload={element:null};var A=h.value;return _.callback=function(){Qx||(Qx=!0,UM=A),F(u,h)},_}function je(u,h,_){_=zn(-1,_),_.tag=3;var A=u.type.getDerivedStateFromError;if(typeof A=="function"){var I=h.value;_.payload=function(){return A(I)},_.callback=function(){F(u,h)}}var U=u.stateNode;return U!==null&&typeof U.componentDidCatch=="function"&&(_.callback=function(){F(u,h),typeof A!="function"&&(Du===null?Du=new Set([this]):Du.add(this));var $=h.stack;this.componentDidCatch(h.value,{componentStack:$!==null?$:""})}),_}function st(u,h,_){var A=u.pingCache;if(A===null){A=u.pingCache=new re;var I=new Set;A.set(h,I)}else I=A.get(h),I===void 0&&(I=new Set,A.set(h,I));I.has(_)||(I.add(_),u=pW.bind(null,u,h,_),h.then(u,u))}function St(u){do{var h;if((h=u.tag===13)&&(h=u.memoizedState,h=h!==null?h.dehydrated!==null:!0),h)return u;u=u.return}while(u!==null);return null}function rn(u,h,_,A,I){return(u.mode&1)===0?(u===h?u.flags|=65536:(u.flags|=128,_.flags|=131072,_.flags&=-52805,_.tag===1&&(_.alternate===null?_.tag=17:(h=zn(-1,1),h.tag=2,Jn(_,h,1))),_.lanes|=1),u):(u.flags|=65536,u.lanes=I,u)}var zt=P.ReactCurrentOwner,ln=!1;function xt(u,h,_,A){h.child=u===null?of(h,null,_,A):lc(h,u.child,_,A)}function Jr(u,h,_,A,I){_=_.render;var U=h.ref;return ol(h,I),A=hf(u,h,_,A,U,I),_=Bv(),u!==null&&!ln?(h.updateQueue=u.updateQueue,h.flags&=-2053,u.lanes&=~I,yc(u,h,I)):(Kn&&_&&Ov(h),h.flags|=1,xt(u,h,A,I),h.child)}function ys(u,h,_,A,I){if(u===null){var U=_.type;return typeof U=="function"&&!GM(U)&&U.defaultProps===void 0&&_.compare===null&&_.defaultProps===void 0?(h.tag=15,h.type=U,Ne(u,h,U,A,I)):(u=ib(_.type,null,A,h,h.mode,I),u.ref=h.ref,u.return=h,h.child=u)}if(U=u.child,(u.lanes&I)===0){var $=U.memoizedProps;if(_=_.compare,_=_!==null?_:Ql,_($,A)&&u.ref===h.ref)return yc(u,h,I)}return h.flags|=1,u=zu(U,A),u.ref=h.ref,u.return=h,h.child=u}function Ne(u,h,_,A,I){if(u!==null){var U=u.memoizedProps;if(Ql(U,A)&&u.ref===h.ref)if(ln=!1,h.pendingProps=A=U,(u.lanes&I)!==0)(u.flags&131072)!==0&&(ln=!0);else return h.lanes=u.lanes,yc(u,h,I)}return gt(u,h,_,A,I)}function _e(u,h,_){var A=h.pendingProps,I=A.children,U=u!==null?u.memoizedState:null;if(A.mode==="hidden")if((h.mode&1)===0)h.memoizedState={baseLanes:0,cachePool:null,transitions:null},Gn(Jp,da),da|=_;else{if((_&1073741824)===0)return u=U!==null?U.baseLanes|_:_,h.lanes=h.childLanes=1073741824,h.memoizedState={baseLanes:u,cachePool:null,transitions:null},h.updateQueue=null,Gn(Jp,da),da|=u,null;h.memoizedState={baseLanes:0,cachePool:null,transitions:null},A=U!==null?U.baseLanes:_,Gn(Jp,da),da|=A}else U!==null?(A=U.baseLanes|_,h.memoizedState=null):A=_,Gn(Jp,da),da|=A;return xt(u,h,I,_),h.child}function De(u,h){var _=h.ref;(u===null&&_!==null||u!==null&&u.ref!==_)&&(h.flags|=512,h.flags|=2097152)}function gt(u,h,_,A,I){var U=ui(_)?mo:Kr.current;return U=ic(h,U),ol(h,I),_=hf(u,h,_,A,U,I),A=Bv(),u!==null&&!ln?(h.updateQueue=u.updateQueue,h.flags&=-2053,u.lanes&=~I,yc(u,h,I)):(Kn&&A&&Ov(h),h.flags|=1,xt(u,h,_,I),h.child)}function Ot(u,h,_,A,I){if(ui(_)){var U=!0;sc(h)}else U=!1;if(ol(h,I),h.stateNode===null)Xx(u,h),m(h,_,A),E(h,_,A,I),A=!0;else if(u===null){var $=h.stateNode,oe=h.memoizedProps;$.props=oe;var me=$.context,Oe=_.contextType;typeof Oe=="object"&&Oe!==null?Oe=ps(Oe):(Oe=ui(_)?mo:Kr.current,Oe=ic(h,Oe));var et=_.getDerivedStateFromProps,nt=typeof et=="function"||typeof $.getSnapshotBeforeUpdate=="function";nt||typeof $.UNSAFE_componentWillReceiveProps!="function"&&typeof $.componentWillReceiveProps!="function"||(oe!==A||me!==Oe)&&g(h,$,A,Oe),Fn=!1;var Qe=h.memoizedState;$.state=Qe,cr(h,A,$,I),me=h.memoizedState,oe!==A||Qe!==me||Ri.current||Fn?(typeof et=="function"&&(yf(h,_,et,A),me=h.memoizedState),(oe=Fn||Wx(h,_,oe,A,Qe,me,Oe))?(nt||typeof $.UNSAFE_componentWillMount!="function"&&typeof $.componentWillMount!="function"||(typeof $.componentWillMount=="function"&&$.componentWillMount(),typeof $.UNSAFE_componentWillMount=="function"&&$.UNSAFE_componentWillMount()),typeof $.componentDidMount=="function"&&(h.flags|=4194308)):(typeof $.componentDidMount=="function"&&(h.flags|=4194308),h.memoizedProps=A,h.memoizedState=me),$.props=A,$.state=me,$.context=Oe,A=oe):(typeof $.componentDidMount=="function"&&(h.flags|=4194308),A=!1)}else{$=h.stateNode,gr(u,h),oe=h.memoizedProps,Oe=h.type===h.elementType?oe:Bs(h.type,oe),$.props=Oe,nt=h.pendingProps,Qe=$.context,me=_.contextType,typeof me=="object"&&me!==null?me=ps(me):(me=ui(_)?mo:Kr.current,me=ic(h,me));var _t=_.getDerivedStateFromProps;(et=typeof _t=="function"||typeof $.getSnapshotBeforeUpdate=="function")||typeof $.UNSAFE_componentWillReceiveProps!="function"&&typeof $.componentWillReceiveProps!="function"||(oe!==nt||Qe!==me)&&g(h,$,A,me),Fn=!1,Qe=h.memoizedState,$.state=Qe,cr(h,A,$,I);var Pt=h.memoizedState;oe!==nt||Qe!==Pt||Ri.current||Fn?(typeof _t=="function"&&(yf(h,_,_t,A),Pt=h.memoizedState),(Oe=Fn||Wx(h,_,Oe,A,Qe,Pt,me)||!1)?(et||typeof $.UNSAFE_componentWillUpdate!="function"&&typeof $.componentWillUpdate!="function"||(typeof $.componentWillUpdate=="function"&&$.componentWillUpdate(A,Pt,me),typeof $.UNSAFE_componentWillUpdate=="function"&&$.UNSAFE_componentWillUpdate(A,Pt,me)),typeof $.componentDidUpdate=="function"&&(h.flags|=4),typeof $.getSnapshotBeforeUpdate=="function"&&(h.flags|=1024)):(typeof $.componentDidUpdate!="function"||oe===u.memoizedProps&&Qe===u.memoizedState||(h.flags|=4),typeof $.getSnapshotBeforeUpdate!="function"||oe===u.memoizedProps&&Qe===u.memoizedState||(h.flags|=1024),h.memoizedProps=A,h.memoizedState=Pt),$.props=A,$.state=Pt,$.context=me,A=Oe):(typeof $.componentDidUpdate!="function"||oe===u.memoizedProps&&Qe===u.memoizedState||(h.flags|=4),typeof $.getSnapshotBeforeUpdate!="function"||oe===u.memoizedProps&&Qe===u.memoizedState||(h.flags|=1024),A=!1)}return an(u,h,_,A,U,I)}function an(u,h,_,A,I,U){De(u,h);var $=(h.flags&128)!==0;if(!A&&!$)return I&&Iv(h,_,!1),yc(u,h,U);A=h.stateNode,zt.current=h;var oe=$&&typeof _.getDerivedStateFromError!="function"?null:A.render();return h.flags|=1,u!==null&&$?(h.child=lc(h,u.child,null,U),h.child=lc(h,null,oe,U)):xt(u,h,oe,U),h.memoizedState=A.state,I&&Iv(h,_,!0),h.child}function sn(u){var h=u.stateNode;h.pendingContext?Nv(u,h.pendingContext,h.pendingContext!==h.context):h.context&&Nv(u,h.context,!1),df(u,h.containerInfo)}function En(u,h,_,A,I){return al(),Cu(I),h.flags|=256,xt(u,h,_,A),h.child}var _r={dehydrated:null,treeContext:null,retryLane:0};function bn(u){return{baseLanes:u,cachePool:null,transitions:null}}function Mo(u,h,_){var A=h.pendingProps,I=Yn.current,U=!1,$=(h.flags&128)!==0,oe;if((oe=$)||(oe=u!==null&&u.memoizedState===null?!1:(I&2)!==0),oe?(U=!0,h.flags&=-129):(u===null||u.memoizedState!==null)&&(I|=1),Gn(Yn,I&1),u===null)return Hp(h),u=h.memoizedState,u!==null&&(u=u.dehydrated,u!==null)?((h.mode&1)===0?h.lanes=1:u.data==="$!"?h.lanes=8:h.lanes=1073741824,null):($=A.children,u=A.fallback,U?(A=h.mode,U=h.child,$={mode:"hidden",children:$},(A&1)===0&&U!==null?(U.childLanes=0,U.pendingProps=$):U=sb($,A,0,null),u=Sf(u,A,_,null),U.return=h,u.return=h,U.sibling=u,h.child=U,h.child.memoizedState=bn(_),h.memoizedState=_r,u):Kv(h,$));if(I=u.memoizedState,I!==null&&(oe=I.dehydrated,oe!==null))return nW(u,h,$,A,oe,I,_);if(U){U=A.fallback,$=h.mode,I=u.child,oe=I.sibling;var me={mode:"hidden",children:A.children};return($&1)===0&&h.child!==I?(A=h.child,A.childLanes=0,A.pendingProps=me,h.deletions=null):(A=zu(I,me),A.subtreeFlags=I.subtreeFlags&14680064),oe!==null?U=zu(oe,U):(U=Sf(U,$,_,null),U.flags|=2),U.return=h,A.return=h,A.sibling=U,h.child=A,A=U,U=h.child,$=u.child.memoizedState,$=$===null?bn(_):{baseLanes:$.baseLanes|_,cachePool:null,transitions:$.transitions},U.memoizedState=$,U.childLanes=u.childLanes&~_,h.memoizedState=_r,A}return U=u.child,u=U.sibling,A=zu(U,{mode:"visible",children:A.children}),(h.mode&1)===0&&(A.lanes=_),A.return=h,A.sibling=null,u!==null&&(_=h.deletions,_===null?(h.deletions=[u],h.flags|=16):_.push(u)),h.child=A,h.memoizedState=null,A}function Kv(u,h){return h=sb({mode:"visible",children:h},u.mode,0,null),h.return=u,u.child=h}function $x(u,h,_,A){return A!==null&&Cu(A),lc(h,u.child,null,_),u=Kv(h,h.pendingProps.children),u.flags|=2,h.memoizedState=null,u}function nW(u,h,_,A,I,U,$){if(_)return h.flags&256?(h.flags&=-257,A=L(Error(n(422))),$x(u,h,$,A)):h.memoizedState!==null?(h.child=u.child,h.flags|=128,null):(U=A.fallback,I=h.mode,A=sb({mode:"visible",children:A.children},I,0,null),U=Sf(U,I,$,null),U.flags|=2,A.return=h,U.return=h,A.sibling=U,h.child=A,(h.mode&1)!==0&&lc(h,u.child,null,$),h.child.memoizedState=bn($),h.memoizedState=_r,U);if((h.mode&1)===0)return $x(u,h,$,null);if(I.data==="$!"){if(A=I.nextSibling&&I.nextSibling.dataset,A)var oe=A.dgst;return A=oe,U=Error(n(419)),A=L(U,A,void 0),$x(u,h,$,A)}if(oe=($&u.childLanes)!==0,ln||oe){if(A=hi,A!==null){switch($&-$){case 4:I=2;break;case 16:I=8;break;case 64: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:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:I=32;break;case 536870912:I=268435456;break;default:I=0}I=(I&(A.suspendedLanes|$))!==0?0:I,I!==0&&I!==U.retryLane&&(U.retryLane=I,oa(u,I),To(A,u,I,-1))}return VM(),A=L(Error(n(421))),$x(u,h,$,A)}return I.data==="$?"?(h.flags|=128,h.child=u.child,h=mW.bind(null,u),I._reactRetry=h,null):(u=U.treeContext,Ii=fo(I.nextSibling),Yr=h,Kn=!0,zs=null,u!==null&&(Ni[zr++]=ut,Ni[zr++]=Fs,Ni[zr++]=oc,ut=u.id,Fs=u.overflow,oc=h),h=Kv(h,A.children),h.flags|=4096,h)}function cN(u,h,_){u.lanes|=h;var A=u.alternate;A!==null&&(A.lanes|=h),cf(u.return,h,_)}function PM(u,h,_,A,I){var U=u.memoizedState;U===null?u.memoizedState={isBackwards:h,rendering:null,renderingStartTime:0,last:A,tail:_,tailMode:I}:(U.isBackwards=h,U.rendering=null,U.renderingStartTime=0,U.last=A,U.tail=_,U.tailMode=I)}function uN(u,h,_){var A=h.pendingProps,I=A.revealOrder,U=A.tail;if(xt(u,h,A.children,_),A=Yn.current,(A&2)!==0)A=A&1|2,h.flags|=128;else{if(u!==null&&(u.flags&128)!==0)e:for(u=h.child;u!==null;){if(u.tag===13)u.memoizedState!==null&&cN(u,_,h);else if(u.tag===19)cN(u,_,h);else if(u.child!==null){u.child.return=u,u=u.child;continue}if(u===h)break e;for(;u.sibling===null;){if(u.return===null||u.return===h)break e;u=u.return}u.sibling.return=u.return,u=u.sibling}A&=1}if(Gn(Yn,A),(h.mode&1)===0)h.memoizedState=null;else switch(I){case"forwards":for(_=h.child,I=null;_!==null;)u=_.alternate,u!==null&&la(u)===null&&(I=_),_=_.sibling;_=I,_===null?(I=h.child,h.child=null):(I=_.sibling,_.sibling=null),PM(h,!1,I,_,U);break;case"backwards":for(_=null,I=h.child,h.child=null;I!==null;){if(u=I.alternate,u!==null&&la(u)===null){h.child=I;break}u=I.sibling,I.sibling=_,_=I,I=u}PM(h,!0,_,null,U);break;case"together":PM(h,!1,null,null,void 0);break;default:h.memoizedState=null}return h.child}function Xx(u,h){(h.mode&1)===0&&u!==null&&(u.alternate=null,h.alternate=null,h.flags|=2)}function yc(u,h,_){if(u!==null&&(h.dependencies=u.dependencies),xf|=h.lanes,(_&h.childLanes)===0)return null;if(u!==null&&h.child!==u.child)throw Error(n(153));if(h.child!==null){for(u=h.child,_=zu(u,u.pendingProps),h.child=_,_.return=h;u.sibling!==null;)u=u.sibling,_=_.sibling=zu(u,u.pendingProps),_.return=h;_.sibling=null}return h.child}function rW(u,h,_){switch(h.tag){case 3:sn(h),al();break;case 5:pc(h);break;case 1:ui(h.type)&&sc(h);break;case 4:df(h,h.stateNode.containerInfo);break;case 10:var A=h.type._context,I=h.memoizedProps.value;Gn(cc,A._currentValue),A._currentValue=I;break;case 13:if(A=h.memoizedState,A!==null)return A.dehydrated!==null?(Gn(Yn,Yn.current&1),h.flags|=128,null):(_&h.child.childLanes)!==0?Mo(u,h,_):(Gn(Yn,Yn.current&1),u=yc(u,h,_),u!==null?u.sibling:null);Gn(Yn,Yn.current&1);break;case 19:if(A=(_&h.childLanes)!==0,(u.flags&128)!==0){if(A)return uN(u,h,_);h.flags|=128}if(I=h.memoizedState,I!==null&&(I.rendering=null,I.tail=null,I.lastEffect=null),Gn(Yn,Yn.current),A)break;return null;case 22:case 23:return h.lanes=0,_e(u,h,_)}return yc(u,h,_)}var dN,CM,fN,hN;dN=function(u,h){for(var _=h.child;_!==null;){if(_.tag===5||_.tag===6)u.appendChild(_.stateNode);else if(_.tag!==4&&_.child!==null){_.child.return=_,_=_.child;continue}if(_===h)break;for(;_.sibling===null;){if(_.return===null||_.return===h)return;_=_.return}_.sibling.return=_.return,_=_.sibling}},CM=function(){},fN=function(u,h,_,A){var I=u.memoizedProps;if(I!==A){u=h.stateNode,br(ms.current);var U=null;switch(_){case"input":I=Ve(u,I),A=Ve(u,A),U=[];break;case"select":I=Y({},I,{value:void 0}),A=Y({},A,{value:void 0}),U=[];break;case"textarea":I=be(u,I),A=be(u,A),U=[];break;default:typeof I.onClick!="function"&&typeof A.onClick=="function"&&(u.onclick=Jd)}fe(_,A);var $;_=null;for(Oe in I)if(!A.hasOwnProperty(Oe)&&I.hasOwnProperty(Oe)&&I[Oe]!=null)if(Oe==="style"){var oe=I[Oe];for($ in oe)oe.hasOwnProperty($)&&(_||(_={}),_[$]="")}else Oe!=="dangerouslySetInnerHTML"&&Oe!=="children"&&Oe!=="suppressContentEditableWarning"&&Oe!=="suppressHydrationWarning"&&Oe!=="autoFocus"&&(i.hasOwnProperty(Oe)?U||(U=[]):(U=U||[]).push(Oe,null));for(Oe in A){var me=A[Oe];if(oe=I!=null?I[Oe]:void 0,A.hasOwnProperty(Oe)&&me!==oe&&(me!=null||oe!=null))if(Oe==="style")if(oe){for($ in oe)!oe.hasOwnProperty($)||me&&me.hasOwnProperty($)||(_||(_={}),_[$]="");for($ in me)me.hasOwnProperty($)&&oe[$]!==me[$]&&(_||(_={}),_[$]=me[$])}else _||(U||(U=[]),U.push(Oe,_)),_=me;else Oe==="dangerouslySetInnerHTML"?(me=me?me.__html:void 0,oe=oe?oe.__html:void 0,me!=null&&oe!==me&&(U=U||[]).push(Oe,me)):Oe==="children"?typeof me!="string"&&typeof me!="number"||(U=U||[]).push(Oe,""+me):Oe!=="suppressContentEditableWarning"&&Oe!=="suppressHydrationWarning"&&(i.hasOwnProperty(Oe)?(me!=null&&Oe==="onScroll"&&Wn("scroll",u),U||oe===me||(U=[])):(U=U||[]).push(Oe,me))}_&&(U=U||[]).push("style",_);var Oe=U;(h.updateQueue=Oe)&&(h.flags|=4)}},hN=function(u,h,_,A){_!==A&&(h.flags|=4)};function Yv(u,h){if(!Kn)switch(u.tailMode){case"hidden":h=u.tail;for(var _=null;h!==null;)h.alternate!==null&&(_=h),h=h.sibling;_===null?u.tail=null:_.sibling=null;break;case"collapsed":_=u.tail;for(var A=null;_!==null;)_.alternate!==null&&(A=_),_=_.sibling;A===null?h||u.tail===null?u.tail=null:u.tail.sibling=null:A.sibling=null}}function Zi(u){var h=u.alternate!==null&&u.alternate.child===u.child,_=0,A=0;if(h)for(var I=u.child;I!==null;)_|=I.lanes|I.childLanes,A|=I.subtreeFlags&14680064,A|=I.flags&14680064,I.return=u,I=I.sibling;else for(I=u.child;I!==null;)_|=I.lanes|I.childLanes,A|=I.subtreeFlags,A|=I.flags,I.return=u,I=I.sibling;return u.subtreeFlags|=A,u.childLanes=_,h}function iW(u,h,_){var A=h.pendingProps;switch(vo(h),h.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Zi(h),null;case 1:return ui(h.type)&&ef(),Zi(h),null;case 3:return A=h.stateNode,ll(),$n(Ri),$n(Kr),Oa(),A.pendingContext&&(A.context=A.pendingContext,A.pendingContext=null),(u===null||u.child===null)&&(Pu(h)?h.flags|=4:u===null||u.memoizedState.isDehydrated&&(h.flags&256)===0||(h.flags|=1024,zs!==null&&(zM(zs),zs=null))),CM(u,h),Zi(h),null;case 5:Iu(h);var I=br(bo.current);if(_=h.type,u!==null&&h.stateNode!=null)fN(u,h,_,A,I),u.ref!==h.ref&&(h.flags|=512,h.flags|=2097152);else{if(!A){if(h.stateNode===null)throw Error(n(166));return Zi(h),null}if(u=br(ms.current),Pu(h)){A=h.stateNode,_=h.type;var U=h.memoizedProps;switch(A[Ir]=h,A[Tu]=U,u=(h.mode&1)!==0,_){case"dialog":Wn("cancel",A),Wn("close",A);break;case"iframe":case"object":case"embed":Wn("load",A);break;case"video":case"audio":for(I=0;I<\/script>",u=u.removeChild(u.firstChild)):typeof A.is=="string"?u=$.createElement(_,{is:A.is}):(u=$.createElement(_),_==="select"&&($=u,A.multiple?$.multiple=!0:A.size&&($.size=A.size))):u=$.createElementNS(u,_),u[Ir]=h,u[Tu]=A,dN(u,h,!1,!1),h.stateNode=u;e:{switch($=qe(_,A),_){case"dialog":Wn("cancel",u),Wn("close",u),I=A;break;case"iframe":case"object":case"embed":Wn("load",u),I=A;break;case"video":case"audio":for(I=0;Iem&&(h.flags|=128,A=!0,Yv(U,!1),h.lanes=4194304)}else{if(!A)if(u=la($),u!==null){if(h.flags|=128,A=!0,_=u.updateQueue,_!==null&&(h.updateQueue=_,h.flags|=4),Yv(U,!0),U.tail===null&&U.tailMode==="hidden"&&!$.alternate&&!Kn)return Zi(h),null}else 2*lt()-U.renderingStartTime>em&&_!==1073741824&&(h.flags|=128,A=!0,Yv(U,!1),h.lanes=4194304);U.isBackwards?($.sibling=h.child,h.child=$):(_=U.last,_!==null?_.sibling=$:h.child=$,U.last=$)}return U.tail!==null?(h=U.tail,U.rendering=h,U.tail=h.sibling,U.renderingStartTime=lt(),h.sibling=null,_=Yn.current,Gn(Yn,A?_&1|2:_&1),h):(Zi(h),null);case 22:case 23:return HM(),A=h.memoizedState!==null,u!==null&&u.memoizedState!==null!==A&&(h.flags|=8192),A&&(h.mode&1)!==0?(da&1073741824)!==0&&(Zi(h),h.subtreeFlags&6&&(h.flags|=8192)):Zi(h),null;case 24:return null;case 25:return null}throw Error(n(156,h.tag))}function sW(u,h){switch(vo(h),h.tag){case 1:return ui(h.type)&&ef(),u=h.flags,u&65536?(h.flags=u&-65537|128,h):null;case 3:return ll(),$n(Ri),$n(Kr),Oa(),u=h.flags,(u&65536)!==0&&(u&128)===0?(h.flags=u&-65537|128,h):null;case 5:return Iu(h),null;case 13:if($n(Yn),u=h.memoizedState,u!==null&&u.dehydrated!==null){if(h.alternate===null)throw Error(n(340));al()}return u=h.flags,u&65536?(h.flags=u&-65537|128,h):null;case 19:return $n(Yn),null;case 4:return ll(),null;case 10:return lf(h.type._context),null;case 22:case 23:return HM(),null;case 24:return null;default:return null}}var qx=!1,Qi=!1,aW=typeof WeakSet=="function"?WeakSet:Set,At=null;function Qp(u,h){var _=u.ref;if(_!==null)if(typeof _=="function")try{_(null)}catch(A){wr(u,h,A)}else _.current=null}function RM(u,h,_){try{_()}catch(A){wr(u,h,A)}}var pN=!1;function oW(u,h){if(Au=ks,u=rr(),Dr(u)){if("selectionStart"in u)var _={start:u.selectionStart,end:u.selectionEnd};else e:{_=(_=u.ownerDocument)&&_.defaultView||window;var A=_.getSelection&&_.getSelection();if(A&&A.rangeCount!==0){_=A.anchorNode;var I=A.anchorOffset,U=A.focusNode;A=A.focusOffset;try{_.nodeType,U.nodeType}catch{_=null;break e}var $=0,oe=-1,me=-1,Oe=0,et=0,nt=u,Qe=null;t:for(;;){for(var _t;nt!==_||I!==0&&nt.nodeType!==3||(oe=$+I),nt!==U||A!==0&&nt.nodeType!==3||(me=$+A),nt.nodeType===3&&($+=nt.nodeValue.length),(_t=nt.firstChild)!==null;)Qe=nt,nt=_t;for(;;){if(nt===u)break t;if(Qe===_&&++Oe===I&&(oe=$),Qe===U&&++et===A&&(me=$),(_t=nt.nextSibling)!==null)break;nt=Qe,Qe=nt.parentNode}nt=_t}_=oe===-1||me===-1?null:{start:oe,end:me}}else _=null}_=_||{start:0,end:0}}else _=null;for(Ev={focusedElem:u,selectionRange:_},ks=!1,At=h;At!==null;)if(h=At,u=h.child,(h.subtreeFlags&1028)!==0&&u!==null)u.return=h,At=u;else for(;At!==null;){h=At;try{var Pt=h.alternate;if((h.flags&1024)!==0)switch(h.tag){case 0:case 11:case 15:break;case 1:if(Pt!==null){var Nt=Pt.memoizedProps,kr=Pt.memoizedState,Ae=h.stateNode,ve=Ae.getSnapshotBeforeUpdate(h.elementType===h.type?Nt:Bs(h.type,Nt),kr);Ae.__reactInternalSnapshotBeforeUpdate=ve}break;case 3:var Pe=h.stateNode.containerInfo;Pe.nodeType===1?Pe.textContent="":Pe.nodeType===9&&Pe.documentElement&&Pe.removeChild(Pe.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(n(163))}}catch(ot){wr(h,h.return,ot)}if(u=h.sibling,u!==null){u.return=h.return,At=u;break}At=h.return}return Pt=pN,pN=!1,Pt}function Zv(u,h,_){var A=h.updateQueue;if(A=A!==null?A.lastEffect:null,A!==null){var I=A=A.next;do{if((I.tag&u)===u){var U=I.destroy;I.destroy=void 0,U!==void 0&&RM(h,_,U)}I=I.next}while(I!==A)}}function Kx(u,h){if(h=h.updateQueue,h=h!==null?h.lastEffect:null,h!==null){var _=h=h.next;do{if((_.tag&u)===u){var A=_.create;_.destroy=A()}_=_.next}while(_!==h)}}function NM(u){var h=u.ref;if(h!==null){var _=u.stateNode;switch(u.tag){case 5:u=_;break;default:u=_}typeof h=="function"?h(u):h.current=u}}function mN(u){var h=u.alternate;h!==null&&(u.alternate=null,mN(h)),u.child=null,u.deletions=null,u.sibling=null,u.tag===5&&(h=u.stateNode,h!==null&&(delete h[Ir],delete h[Tu],delete h[rc],delete h[Lp],delete h[Dp])),u.stateNode=null,u.return=null,u.dependencies=null,u.memoizedProps=null,u.memoizedState=null,u.pendingProps=null,u.stateNode=null,u.updateQueue=null}function gN(u){return u.tag===5||u.tag===3||u.tag===4}function vN(u){e:for(;;){for(;u.sibling===null;){if(u.return===null||gN(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.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 IM(u,h,_){var A=u.tag;if(A===5||A===6)u=u.stateNode,h?_.nodeType===8?_.parentNode.insertBefore(u,h):_.insertBefore(u,h):(_.nodeType===8?(h=_.parentNode,h.insertBefore(u,_)):(h=_,h.appendChild(u)),_=_._reactRootContainer,_!=null||h.onclick!==null||(h.onclick=Jd));else if(A!==4&&(u=u.child,u!==null))for(IM(u,h,_),u=u.sibling;u!==null;)IM(u,h,_),u=u.sibling}function kM(u,h,_){var A=u.tag;if(A===5||A===6)u=u.stateNode,h?_.insertBefore(u,h):_.appendChild(u);else if(A!==4&&(u=u.child,u!==null))for(kM(u,h,_),u=u.sibling;u!==null;)kM(u,h,_),u=u.sibling}var Oi=null,Eo=!1;function Lu(u,h,_){for(_=_.child;_!==null;)yN(u,h,_),_=_.sibling}function yN(u,h,_){if(Kt&&typeof Kt.onCommitFiberUnmount=="function")try{Kt.onCommitFiberUnmount(yn,_)}catch{}switch(_.tag){case 5:Qi||Qp(_,h);case 6:var A=Oi,I=Eo;Oi=null,Lu(u,h,_),Oi=A,Eo=I,Oi!==null&&(Eo?(u=Oi,_=_.stateNode,u.nodeType===8?u.parentNode.removeChild(_):u.removeChild(_)):Oi.removeChild(_.stateNode));break;case 18:Oi!==null&&(Eo?(u=Oi,_=_.stateNode,u.nodeType===8?Op(u.parentNode,_):u.nodeType===1&&Op(u,_),Bd(u)):Op(Oi,_.stateNode));break;case 4:A=Oi,I=Eo,Oi=_.stateNode.containerInfo,Eo=!0,Lu(u,h,_),Oi=A,Eo=I;break;case 0:case 11:case 14:case 15:if(!Qi&&(A=_.updateQueue,A!==null&&(A=A.lastEffect,A!==null))){I=A=A.next;do{var U=I,$=U.destroy;U=U.tag,$!==void 0&&((U&2)!==0||(U&4)!==0)&&RM(_,h,$),I=I.next}while(I!==A)}Lu(u,h,_);break;case 1:if(!Qi&&(Qp(_,h),A=_.stateNode,typeof A.componentWillUnmount=="function"))try{A.props=_.memoizedProps,A.state=_.memoizedState,A.componentWillUnmount()}catch(oe){wr(_,h,oe)}Lu(u,h,_);break;case 21:Lu(u,h,_);break;case 22:_.mode&1?(Qi=(A=Qi)||_.memoizedState!==null,Lu(u,h,_),Qi=A):Lu(u,h,_);break;default:Lu(u,h,_)}}function xN(u){var h=u.updateQueue;if(h!==null){u.updateQueue=null;var _=u.stateNode;_===null&&(_=u.stateNode=new aW),h.forEach(function(A){var I=gW.bind(null,u,A);_.has(A)||(_.add(A),A.then(I,I))})}}function Ao(u,h){var _=h.deletions;if(_!==null)for(var A=0;A<_.length;A++){var I=_[A];try{var U=u,$=h,oe=$;e:for(;oe!==null;){switch(oe.tag){case 5:Oi=oe.stateNode,Eo=!1;break e;case 3:Oi=oe.stateNode.containerInfo,Eo=!0;break e;case 4:Oi=oe.stateNode.containerInfo,Eo=!0;break e}oe=oe.return}if(Oi===null)throw Error(n(160));yN(U,$,I),Oi=null,Eo=!1;var me=I.alternate;me!==null&&(me.return=null),I.return=null}catch(Oe){wr(I,h,Oe)}}if(h.subtreeFlags&12854)for(h=h.child;h!==null;)bN(h,u),h=h.sibling}function bN(u,h){var _=u.alternate,A=u.flags;switch(u.tag){case 0:case 11:case 14:case 15:if(Ao(h,u),ul(u),A&4){try{Zv(3,u,u.return),Kx(3,u)}catch(Nt){wr(u,u.return,Nt)}try{Zv(5,u,u.return)}catch(Nt){wr(u,u.return,Nt)}}break;case 1:Ao(h,u),ul(u),A&512&&_!==null&&Qp(_,_.return);break;case 5:if(Ao(h,u),ul(u),A&512&&_!==null&&Qp(_,_.return),u.flags&32){var I=u.stateNode;try{Ke(I,"")}catch(Nt){wr(u,u.return,Nt)}}if(A&4&&(I=u.stateNode,I!=null)){var U=u.memoizedProps,$=_!==null?_.memoizedProps:U,oe=u.type,me=u.updateQueue;if(u.updateQueue=null,me!==null)try{oe==="input"&&U.type==="radio"&&U.name!=null&&ne(I,U),qe(oe,$);var Oe=qe(oe,U);for($=0;$I&&(I=$),A&=~U}if(A=I,A=lt()-A,A=(120>A?120:480>A?480:1080>A?1080:1920>A?1920:3e3>A?3e3:4320>A?4320:1960*cW(A/1960))-A,10u?16:u,Uu===null)var A=!1;else{if(u=Uu,Uu=null,eb=0,(kn&6)!==0)throw Error(n(331));var I=kn;for(kn|=4,At=u.current;At!==null;){var U=At,$=U.child;if((At.flags&16)!==0){var oe=U.deletions;if(oe!==null){for(var me=0;melt()-DM?_f(u,0):LM|=_),Vs(u,h)}function IN(u,h){h===0&&((u.mode&1)===0?h=1:(h=In,In<<=1,(In&130023424)===0&&(In=4194304)));var _=xs();u=oa(u,h),u!==null&&(Zo(u,h,_),Vs(u,_))}function mW(u){var h=u.memoizedState,_=0;h!==null&&(_=h.retryLane),IN(u,_)}function gW(u,h){var _=0;switch(u.tag){case 13:var A=u.stateNode,I=u.memoizedState;I!==null&&(_=I.retryLane);break;case 19:A=u.stateNode;break;default:throw Error(n(314))}A!==null&&A.delete(h),IN(u,_)}var kN;kN=function(u,h,_){if(u!==null)if(u.memoizedProps!==h.pendingProps||Ri.current)ln=!0;else{if((u.lanes&_)===0&&(h.flags&128)===0)return ln=!1,rW(u,h,_);ln=(u.flags&131072)!==0}else ln=!1,Kn&&(h.flags&1048576)!==0&&kv(h,zp,h.index);switch(h.lanes=0,h.tag){case 2:var A=h.type;Xx(u,h),u=h.pendingProps;var I=ic(h,Kr.current);ol(h,_),I=hf(null,h,A,u,I,_);var U=Bv();return h.flags|=1,typeof I=="object"&&I!==null&&typeof I.render=="function"&&I.$$typeof===void 0?(h.tag=1,h.memoizedState=null,h.updateQueue=null,ui(A)?(U=!0,sc(h)):U=!1,h.memoizedState=I.state!==null&&I.state!==void 0?I.state:null,on(h),I.updater=Zp,h.stateNode=I,I._reactInternals=h,E(h,A,u,_),h=an(null,h,A,!0,U,_)):(h.tag=0,Kn&&U&&Ov(h),xt(null,h,I,_),h=h.child),h;case 16:A=h.elementType;e:{switch(Xx(u,h),u=h.pendingProps,I=A._init,A=I(A._payload),h.type=A,I=h.tag=yW(A),u=Bs(A,u),I){case 0:h=gt(null,h,A,u,_);break e;case 1:h=Ot(null,h,A,u,_);break e;case 11:h=Jr(null,h,A,u,_);break e;case 14:h=ys(null,h,A,Bs(A.type,u),_);break e}throw Error(n(306,A,""))}return h;case 0:return A=h.type,I=h.pendingProps,I=h.elementType===A?I:Bs(A,I),gt(u,h,A,I,_);case 1:return A=h.type,I=h.pendingProps,I=h.elementType===A?I:Bs(A,I),Ot(u,h,A,I,_);case 3:e:{if(sn(h),u===null)throw Error(n(387));A=h.pendingProps,U=h.memoizedState,I=U.element,gr(u,h),cr(h,A,null,_);var $=h.memoizedState;if(A=$.element,U.isDehydrated)if(U={element:A,isDehydrated:!1,cache:$.cache,pendingSuspenseBoundaries:$.pendingSuspenseBoundaries,transitions:$.transitions},h.updateQueue.baseState=U,h.memoizedState=U,h.flags&256){I=C(Error(n(423)),h),h=En(u,h,A,_,I);break e}else if(A!==I){I=C(Error(n(424)),h),h=En(u,h,A,_,I);break e}else for(Ii=fo(h.stateNode.containerInfo.firstChild),Yr=h,Kn=!0,zs=null,_=of(h,null,A,_),h.child=_;_;)_.flags=_.flags&-3|4096,_=_.sibling;else{if(al(),A===I){h=yc(u,h,_);break e}xt(u,h,A,_)}h=h.child}return h;case 5:return pc(h),u===null&&Hp(h),A=h.type,I=h.pendingProps,U=u!==null?u.memoizedProps:null,$=I.children,Av(A,I)?$=null:U!==null&&Av(A,U)&&(h.flags|=32),De(u,h),xt(u,h,$,_),h.child;case 6:return u===null&&Hp(h),null;case 13:return Mo(u,h,_);case 4:return df(h,h.stateNode.containerInfo),A=h.pendingProps,u===null?h.child=lc(h,null,A,_):xt(u,h,A,_),h.child;case 11:return A=h.type,I=h.pendingProps,I=h.elementType===A?I:Bs(A,I),Jr(u,h,A,I,_);case 7:return xt(u,h,h.pendingProps,_),h.child;case 8:return xt(u,h,h.pendingProps.children,_),h.child;case 12:return xt(u,h,h.pendingProps.children,_),h.child;case 10:e:{if(A=h.type._context,I=h.pendingProps,U=h.memoizedProps,$=I.value,Gn(cc,A._currentValue),A._currentValue=$,U!==null)if(ds(U.value,$)){if(U.children===I.children&&!Ri.current){h=yc(u,h,_);break e}}else for(U=h.child,U!==null&&(U.return=h);U!==null;){var oe=U.dependencies;if(oe!==null){$=U.child;for(var me=oe.firstContext;me!==null;){if(me.context===A){if(U.tag===1){me=zn(-1,_&-_),me.tag=2;var Oe=U.updateQueue;if(Oe!==null){Oe=Oe.shared;var et=Oe.pending;et===null?me.next=me:(me.next=et.next,et.next=me),Oe.pending=me}}U.lanes|=_,me=U.alternate,me!==null&&(me.lanes|=_),cf(U.return,_,h),oe.lanes|=_;break}me=me.next}}else if(U.tag===10)$=U.type===h.type?null:U.child;else if(U.tag===18){if($=U.return,$===null)throw Error(n(341));$.lanes|=_,oe=$.alternate,oe!==null&&(oe.lanes|=_),cf($,_,h),$=U.sibling}else $=U.child;if($!==null)$.return=U;else for($=U;$!==null;){if($===h){$=null;break}if(U=$.sibling,U!==null){U.return=$.return,$=U;break}$=$.return}U=$}xt(u,h,I.children,_),h=h.child}return h;case 9:return I=h.type,A=h.pendingProps.children,ol(h,_),I=ps(I),A=A(I),h.flags|=1,xt(u,h,A,_),h.child;case 14:return A=h.type,I=Bs(A,h.pendingProps),I=Bs(A.type,I),ys(u,h,A,I,_);case 15:return Ne(u,h,h.type,h.pendingProps,_);case 17:return A=h.type,I=h.pendingProps,I=h.elementType===A?I:Bs(A,I),Xx(u,h),h.tag=1,ui(A)?(u=!0,sc(h)):u=!1,ol(h,_),m(h,A,I),E(h,A,I,_),an(null,h,A,!0,u,_);case 19:return uN(u,h,_);case 22:return _e(u,h,_)}throw Error(n(156,h.tag))};function ON(u,h){return Ie(u,h)}function vW(u,h,_,A){this.tag=u,this.key=_,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=h,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=A,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Ua(u,h,_,A){return new vW(u,h,_,A)}function GM(u){return u=u.prototype,!(!u||!u.isReactComponent)}function yW(u){if(typeof u=="function")return GM(u)?1:0;if(u!=null){if(u=u.$$typeof,u===X)return 11;if(u===pe)return 14}return 2}function zu(u,h){var _=u.alternate;return _===null?(_=Ua(u.tag,h,u.key,u.mode),_.elementType=u.elementType,_.type=u.type,_.stateNode=u.stateNode,_.alternate=u,u.alternate=_):(_.pendingProps=h,_.type=u.type,_.flags=0,_.subtreeFlags=0,_.deletions=null),_.flags=u.flags&14680064,_.childLanes=u.childLanes,_.lanes=u.lanes,_.child=u.child,_.memoizedProps=u.memoizedProps,_.memoizedState=u.memoizedState,_.updateQueue=u.updateQueue,h=u.dependencies,_.dependencies=h===null?null:{lanes:h.lanes,firstContext:h.firstContext},_.sibling=u.sibling,_.index=u.index,_.ref=u.ref,_}function ib(u,h,_,A,I,U){var $=2;if(A=u,typeof u=="function")GM(u)&&($=1);else if(typeof u=="string")$=5;else e:switch(u){case D:return Sf(_.children,I,U,h);case z:$=8,I|=8;break;case V:return u=Ua(12,_,h,I|2),u.elementType=V,u.lanes=U,u;case ee:return u=Ua(13,_,h,I),u.elementType=ee,u.lanes=U,u;case ie:return u=Ua(19,_,h,I),u.elementType=ie,u.lanes=U,u;case he:return sb(_,I,U,h);default:if(typeof u=="object"&&u!==null)switch(u.$$typeof){case k:$=10;break e;case j:$=9;break e;case X:$=11;break e;case pe:$=14;break e;case ae:$=16,A=null;break e}throw Error(n(130,u==null?u:typeof u,""))}return h=Ua($,_,h,I),h.elementType=u,h.type=A,h.lanes=U,h}function Sf(u,h,_,A){return u=Ua(7,u,A,h),u.lanes=_,u}function sb(u,h,_,A){return u=Ua(22,u,A,h),u.elementType=he,u.lanes=_,u.stateNode={isHidden:!1},u}function WM(u,h,_){return u=Ua(6,u,null,h),u.lanes=_,u}function $M(u,h,_){return h=Ua(4,u.children!==null?u.children:[],u.key,h),h.lanes=_,h.stateNode={containerInfo:u.containerInfo,pendingChildren:null,implementation:u.implementation},h}function xW(u,h,_,A,I){this.tag=h,this.containerInfo=u,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Ud(0),this.expirationTimes=Ud(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Ud(0),this.identifierPrefix=A,this.onRecoverableError=I,this.mutableSourceEagerHydrationData=null}function XM(u,h,_,A,I,U,$,oe,me){return u=new xW(u,h,_,oe,me),h===1?(h=1,U===!0&&(h|=8)):h=0,U=Ua(3,null,null,h),u.current=U,U.stateNode=u,U.memoizedState={element:A,isDehydrated:_,cache:null,transitions:null,pendingSuspenseBoundaries:null},on(U),u}function bW(u,h,_){var A=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(e){console.error(e)}}return t(),eE.exports=OW(),eE.exports}var KN;function LW(){if(KN)return hb;KN=1;var t=Xj();return hb.createRoot=t.createRoot,hb.hydrateRoot=t.hydrateRoot,hb}var DW=LW();const UW=V1(DW);var Gy=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(t){return this.listeners.add(t),this.onSubscribe(),()=>{this.listeners.delete(t),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},hh,ud,sg,Dj,jW=(Dj=class extends Gy{constructor(){super();Gt(this,hh);Gt(this,ud);Gt(this,sg);wt(this,sg,e=>{if(typeof window<"u"&&window.addEventListener){const n=()=>e();return window.addEventListener("visibilitychange",n,!1),()=>{window.removeEventListener("visibilitychange",n)}}})}onSubscribe(){ge(this,ud)||this.setEventListener(ge(this,sg))}onUnsubscribe(){var e;this.hasListeners()||((e=ge(this,ud))==null||e.call(this),wt(this,ud,void 0))}setEventListener(e){var n;wt(this,sg,e),(n=ge(this,ud))==null||n.call(this),wt(this,ud,e(r=>{typeof r=="boolean"?this.setFocused(r):this.onFocus()}))}setFocused(e){ge(this,hh)!==e&&(wt(this,hh,e),this.onFocus())}onFocus(){const e=this.isFocused();this.listeners.forEach(n=>{n(e)})}isFocused(){var e;return typeof ge(this,hh)=="boolean"?ge(this,hh):((e=globalThis.document)==null?void 0:e.visibilityState)!=="hidden"}},hh=new WeakMap,ud=new WeakMap,sg=new WeakMap,Dj),gC=new jW,FW={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t),setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)},dd,mC,Uj,zW=(Uj=class{constructor(){Gt(this,dd,FW);Gt(this,mC,!1)}setTimeoutProvider(t){wt(this,dd,t)}setTimeout(t,e){return ge(this,dd).setTimeout(t,e)}clearTimeout(t){ge(this,dd).clearTimeout(t)}setInterval(t,e){return ge(this,dd).setInterval(t,e)}clearInterval(t){ge(this,dd).clearInterval(t)}},dd=new WeakMap,mC=new WeakMap,Uj),th=new zW;function BW(t){setTimeout(t,0)}var HW=typeof window>"u"||"Deno"in globalThis;function qs(){}function VW(t,e){return typeof t=="function"?t(e):t}function mT(t){return typeof t=="number"&&t>=0&&t!==1/0}function qj(t,e){return Math.max(t+(e||0)-Date.now(),0)}function xd(t,e){return typeof t=="function"?t(e):t}function ga(t,e){return typeof t=="function"?t(e):t}function YN(t,e){const{type:n="all",exact:r,fetchStatus:i,predicate:s,queryKey:a,stale:o}=t;if(a){if(r){if(e.queryHash!==vC(a,e.options))return!1}else if(!ay(e.queryKey,a))return!1}if(n!=="all"){const l=e.isActive();if(n==="active"&&!l||n==="inactive"&&l)return!1}return!(typeof o=="boolean"&&e.isStale()!==o||i&&i!==e.state.fetchStatus||s&&!s(e))}function ZN(t,e){const{exact:n,status:r,predicate:i,mutationKey:s}=t;if(s){if(!e.options.mutationKey)return!1;if(n){if(sy(e.options.mutationKey)!==sy(s))return!1}else if(!ay(e.options.mutationKey,s))return!1}return!(r&&e.state.status!==r||i&&!i(e))}function vC(t,e){return((e==null?void 0:e.queryKeyHashFn)||sy)(t)}function sy(t){return JSON.stringify(t,(e,n)=>vT(n)?Object.keys(n).sort().reduce((r,i)=>(r[i]=n[i],r),{}):n)}function ay(t,e){return t===e?!0:typeof t!=typeof e?!1:t&&e&&typeof t=="object"&&typeof e=="object"?Object.keys(e).every(n=>ay(t[n],e[n])):!1}var GW=Object.prototype.hasOwnProperty;function Kj(t,e,n=0){if(t===e)return t;if(n>500)return e;const r=QN(t)&&QN(e);if(!r&&!(vT(t)&&vT(e)))return e;const s=(r?t:Object.keys(t)).length,a=r?e:Object.keys(e),o=a.length,l=r?new Array(o):{};let c=0;for(let d=0;d{th.setTimeout(e,t)})}function yT(t,e,n){return typeof n.structuralSharing=="function"?n.structuralSharing(t,e):n.structuralSharing!==!1?Kj(t,e):e}function $W(t,e,n=0){const r=[...t,e];return n&&r.length>n?r.slice(1):r}function XW(t,e,n=0){const r=[e,...t];return n&&r.length>n?r.slice(0,-1):r}var yC=Symbol();function Yj(t,e){return!t.queryFn&&(e!=null&&e.initialPromise)?()=>e.initialPromise:!t.queryFn||t.queryFn===yC?()=>Promise.reject(new Error(`Missing queryFn: '${t.queryHash}'`)):t.queryFn}function Zj(t,e){return typeof t=="function"?t(...e):!!t}function qW(t,e,n){let r=!1,i;return Object.defineProperty(t,"signal",{enumerable:!0,get:()=>(i??(i=e()),r||(r=!0,i.aborted?n():i.addEventListener("abort",n,{once:!0})),i)}),t}var oy=(()=>{let t=()=>HW;return{isServer(){return t()},setIsServer(e){t=e}}})();function xT(){let t,e;const n=new Promise((i,s)=>{t=i,e=s});n.status="pending",n.catch(()=>{});function r(i){Object.assign(n,i),delete n.resolve,delete n.reject}return n.resolve=i=>{r({status:"fulfilled",value:i}),t(i)},n.reject=i=>{r({status:"rejected",reason:i}),e(i)},n}var KW=BW;function YW(){let t=[],e=0,n=o=>{o()},r=o=>{o()},i=KW;const s=o=>{e?t.push(o):i(()=>{n(o)})},a=()=>{const o=t;t=[],o.length&&i(()=>{r(()=>{o.forEach(l=>{n(l)})})})};return{batch:o=>{let l;e++;try{l=o()}finally{e--,e||a()}return l},batchCalls:o=>(...l)=>{s(()=>{o(...l)})},schedule:s,setNotifyFunction:o=>{n=o},setBatchNotifyFunction:o=>{r=o},setScheduler:o=>{i=o}}}var zi=YW(),ag,fd,og,jj,ZW=(jj=class extends Gy{constructor(){super();Gt(this,ag,!0);Gt(this,fd);Gt(this,og);wt(this,og,e=>{if(typeof window<"u"&&window.addEventListener){const n=()=>e(!0),r=()=>e(!1);return window.addEventListener("online",n,!1),window.addEventListener("offline",r,!1),()=>{window.removeEventListener("online",n),window.removeEventListener("offline",r)}}})}onSubscribe(){ge(this,fd)||this.setEventListener(ge(this,og))}onUnsubscribe(){var e;this.hasListeners()||((e=ge(this,fd))==null||e.call(this),wt(this,fd,void 0))}setEventListener(e){var n;wt(this,og,e),(n=ge(this,fd))==null||n.call(this),wt(this,fd,e(this.setOnline.bind(this)))}setOnline(e){ge(this,ag)!==e&&(wt(this,ag,e),this.listeners.forEach(r=>{r(e)}))}isOnline(){return ge(this,ag)}},ag=new WeakMap,fd=new WeakMap,og=new WeakMap,jj),ew=new ZW;function QW(t){return Math.min(1e3*2**t,3e4)}function Qj(t){return(t??"online")==="online"?ew.isOnline():!0}var bT=class extends Error{constructor(t){super("CancelledError"),this.revert=t==null?void 0:t.revert,this.silent=t==null?void 0:t.silent}};function Jj(t){let e=!1,n=0,r;const i=xT(),s=()=>i.status!=="pending",a=S=>{var w;if(!s()){const x=new bT(S);p(x),(w=t.onCancel)==null||w.call(t,x)}},o=()=>{e=!0},l=()=>{e=!1},c=()=>gC.isFocused()&&(t.networkMode==="always"||ew.isOnline())&&t.canRun(),d=()=>Qj(t.networkMode)&&t.canRun(),f=S=>{s()||(r==null||r(),i.resolve(S))},p=S=>{s()||(r==null||r(),i.reject(S))},y=()=>new Promise(S=>{var w;r=x=>{(s()||c())&&S(x)},(w=t.onPause)==null||w.call(t)}).then(()=>{var S;r=void 0,s()||(S=t.onContinue)==null||S.call(t)}),b=()=>{if(s())return;let S;const w=n===0?t.initialPromise:void 0;try{S=w??t.fn()}catch(x){S=Promise.reject(x)}Promise.resolve(S).then(f).catch(x=>{var N;if(s())return;const M=t.retry??(oy.isServer()?0:3),T=t.retryDelay??QW,P=typeof T=="function"?T(n,x):T,O=M===!0||typeof M=="number"&&nc()?void 0:y()).then(()=>{e?p(x):b()})})};return{promise:i,status:()=>i.status,cancel:a,continue:()=>(r==null||r(),i),cancelRetry:o,continueRetry:l,canStart:d,start:()=>(d()?b():y().then(b),i)}}var ph,Fj,eF=(Fj=class{constructor(){Gt(this,ph)}destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),mT(this.gcTime)&&wt(this,ph,th.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(t){this.gcTime=Math.max(this.gcTime||0,t??(oy.isServer()?1/0:300*1e3))}clearGcTimeout(){ge(this,ph)!==void 0&&(th.clearTimeout(ge(this,ph)),wt(this,ph,void 0))}},ph=new WeakMap,Fj);function JW(t){return{onFetch:(e,n)=>{var d,f,p,y,b;const r=e.options,i=(p=(f=(d=e.fetchOptions)==null?void 0:d.meta)==null?void 0:f.fetchMore)==null?void 0:p.direction,s=((y=e.state.data)==null?void 0:y.pages)||[],a=((b=e.state.data)==null?void 0:b.pageParams)||[];let o={pages:[],pageParams:[]},l=0;const c=async()=>{let S=!1;const w=T=>{qW(T,()=>e.signal,()=>S=!0)},x=Yj(e.options,e.fetchOptions),M=async(T,P,O)=>{if(S)return Promise.reject(e.signal.reason);if(P==null&&T.pages.length)return Promise.resolve(T);const D=(()=>{const j={client:e.client,queryKey:e.queryKey,pageParam:P,direction:O?"backward":"forward",meta:e.options.meta};return w(j),j})(),z=await x(D),{maxPages:V}=e.options,k=O?XW:$W;return{pages:k(T.pages,z,V),pageParams:k(T.pageParams,P,V)}};if(i&&s.length){const T=i==="backward",P=T?e8:eI,O={pages:s,pageParams:a},N=P(r,O);o=await M(O,N,T)}else{const T=t??s.length;do{const P=l===0?a[0]??r.initialPageParam:eI(r,o);if(l>0&&P==null)break;o=await M(o,P),l++}while(l{var S,w;return(w=(S=e.options).persister)==null?void 0:w.call(S,c,{client:e.client,queryKey:e.queryKey,meta:e.options.meta,signal:e.signal},n)}:e.fetchFn=c}}}function eI(t,{pages:e,pageParams:n}){const r=e.length-1;return e.length>0?t.getNextPageParam(e[r],e,n[r],n):void 0}function e8(t,{pages:e,pageParams:n}){var r;return e.length>0?(r=t.getPreviousPageParam)==null?void 0:r.call(t,e[0],e,n[0],n):void 0}var lg,mh,cg,Ha,gh,gi,Fy,vh,ma,tF,Tc,zj,t8=(zj=class extends eF{constructor(e){super();Gt(this,ma);Gt(this,lg);Gt(this,mh);Gt(this,cg);Gt(this,Ha);Gt(this,gh);Gt(this,gi);Gt(this,Fy);Gt(this,vh);wt(this,vh,!1),wt(this,Fy,e.defaultOptions),this.setOptions(e.options),this.observers=[],wt(this,gh,e.client),wt(this,Ha,ge(this,gh).getQueryCache()),this.queryKey=e.queryKey,this.queryHash=e.queryHash,wt(this,mh,nI(this.options)),this.state=e.state??ge(this,mh),this.scheduleGc()}get meta(){return this.options.meta}get queryType(){return ge(this,lg)}get promise(){var e;return(e=ge(this,gi))==null?void 0:e.promise}setOptions(e){if(this.options={...ge(this,Fy),...e},e!=null&&e._type&&wt(this,lg,e._type),this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){const n=nI(this.options);n.data!==void 0&&(this.setState(tI(n.data,n.dataUpdatedAt)),wt(this,mh,n))}}optionalRemove(){!this.observers.length&&this.state.fetchStatus==="idle"&&ge(this,Ha).remove(this)}setData(e,n){const r=yT(this.state.data,e,this.options);return _n(this,ma,Tc).call(this,{data:r,type:"success",dataUpdatedAt:n==null?void 0:n.updatedAt,manual:n==null?void 0:n.manual}),r}setState(e){_n(this,ma,Tc).call(this,{type:"setState",state:e})}cancel(e){var r,i;const n=(r=ge(this,gi))==null?void 0:r.promise;return(i=ge(this,gi))==null||i.cancel(e),n?n.then(qs).catch(qs):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return ge(this,mh)}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(e=>ga(e.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===yC||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0?this.observers.some(e=>xd(e.options.staleTime,this)==="static"):!1}isStale(){return this.getObserversCount()>0?this.observers.some(e=>e.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(e=0){return this.state.data===void 0?!0:e==="static"?!1:this.state.isInvalidated?!0:!qj(this.state.dataUpdatedAt,e)}onFocus(){var n;const e=this.observers.find(r=>r.shouldFetchOnWindowFocus());e==null||e.refetch({cancelRefetch:!1}),(n=ge(this,gi))==null||n.continue()}onOnline(){var n;const e=this.observers.find(r=>r.shouldFetchOnReconnect());e==null||e.refetch({cancelRefetch:!1}),(n=ge(this,gi))==null||n.continue()}addObserver(e){this.observers.includes(e)||(this.observers.push(e),this.clearGcTimeout(),ge(this,Ha).notify({type:"observerAdded",query:this,observer:e}))}removeObserver(e){this.observers.includes(e)&&(this.observers=this.observers.filter(n=>n!==e),this.observers.length||(ge(this,gi)&&(ge(this,vh)||_n(this,ma,tF).call(this)?ge(this,gi).cancel({revert:!0}):ge(this,gi).cancelRetry()),this.scheduleGc()),ge(this,Ha).notify({type:"observerRemoved",query:this,observer:e}))}getObserversCount(){return this.observers.length}invalidate(){this.state.isInvalidated||_n(this,ma,Tc).call(this,{type:"invalidate"})}async fetch(e,n){var c,d,f,p,y,b,S,w,x,M,T;if(this.state.fetchStatus!=="idle"&&((c=ge(this,gi))==null?void 0:c.status())!=="rejected"){if(this.state.data!==void 0&&(n!=null&&n.cancelRefetch))this.cancel({silent:!0});else if(ge(this,gi))return ge(this,gi).continueRetry(),ge(this,gi).promise}if(e&&this.setOptions(e),!this.options.queryFn){const P=this.observers.find(O=>O.options.queryFn);P&&this.setOptions(P.options)}const r=new AbortController,i=P=>{Object.defineProperty(P,"signal",{enumerable:!0,get:()=>(wt(this,vh,!0),r.signal)})},s=()=>{const P=Yj(this.options,n),N=(()=>{const D={client:ge(this,gh),queryKey:this.queryKey,meta:this.meta};return i(D),D})();return wt(this,vh,!1),this.options.persister?this.options.persister(P,N,this):P(N)},o=(()=>{const P={fetchOptions:n,options:this.options,queryKey:this.queryKey,client:ge(this,gh),state:this.state,fetchFn:s};return i(P),P})(),l=ge(this,lg)==="infinite"?JW(this.options.pages):this.options.behavior;l==null||l.onFetch(o,this),wt(this,cg,this.state),(this.state.fetchStatus==="idle"||this.state.fetchMeta!==((d=o.fetchOptions)==null?void 0:d.meta))&&_n(this,ma,Tc).call(this,{type:"fetch",meta:(f=o.fetchOptions)==null?void 0:f.meta}),wt(this,gi,Jj({initialPromise:n==null?void 0:n.initialPromise,fn:o.fetchFn,onCancel:P=>{P instanceof bT&&P.revert&&this.setState({...ge(this,cg),fetchStatus:"idle"}),r.abort()},onFail:(P,O)=>{_n(this,ma,Tc).call(this,{type:"failed",failureCount:P,error:O})},onPause:()=>{_n(this,ma,Tc).call(this,{type:"pause"})},onContinue:()=>{_n(this,ma,Tc).call(this,{type:"continue"})},retry:o.options.retry,retryDelay:o.options.retryDelay,networkMode:o.options.networkMode,canRun:()=>!0}));try{const P=await ge(this,gi).start();if(P===void 0)throw new Error(`${this.queryHash} data is undefined`);return this.setData(P),(y=(p=ge(this,Ha).config).onSuccess)==null||y.call(p,P,this),(S=(b=ge(this,Ha).config).onSettled)==null||S.call(b,P,this.state.error,this),P}catch(P){if(P instanceof bT){if(P.silent)return ge(this,gi).promise;if(P.revert){if(this.state.data===void 0)throw P;return this.state.data}}throw _n(this,ma,Tc).call(this,{type:"error",error:P}),(x=(w=ge(this,Ha).config).onError)==null||x.call(w,P,this),(T=(M=ge(this,Ha).config).onSettled)==null||T.call(M,this.state.data,P,this),P}finally{this.scheduleGc()}}},lg=new WeakMap,mh=new WeakMap,cg=new WeakMap,Ha=new WeakMap,gh=new WeakMap,gi=new WeakMap,Fy=new WeakMap,vh=new WeakMap,ma=new WeakSet,tF=function(){return this.state.fetchStatus==="paused"&&this.state.status==="pending"},Tc=function(e){const n=r=>{switch(e.type){case"failed":return{...r,fetchFailureCount:e.failureCount,fetchFailureReason:e.error};case"pause":return{...r,fetchStatus:"paused"};case"continue":return{...r,fetchStatus:"fetching"};case"fetch":return{...r,...nF(r.data,this.options),fetchMeta:e.meta??null};case"success":const i={...r,...tI(e.data,e.dataUpdatedAt),dataUpdateCount:r.dataUpdateCount+1,...!e.manual&&{fetchStatus:"idle",fetchFailureCount:0,fetchFailureReason:null}};return wt(this,cg,e.manual?i:void 0),i;case"error":const s=e.error;return{...r,error:s,errorUpdateCount:r.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:r.fetchFailureCount+1,fetchFailureReason:s,fetchStatus:"idle",status:"error",isInvalidated:!0};case"invalidate":return{...r,isInvalidated:!0};case"setState":return{...r,...e.state}}};this.state=n(this.state),zi.batch(()=>{this.observers.forEach(r=>{r.onQueryUpdate()}),ge(this,Ha).notify({query:this,type:"updated",action:e})})},zj);function nF(t,e){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:Qj(e.networkMode)?"fetching":"paused",...t===void 0&&{error:null,status:"pending"}}}function tI(t,e){return{data:t,dataUpdatedAt:e??Date.now(),error:null,isInvalidated:!1,status:"success"}}function nI(t){const e=typeof t.initialData=="function"?t.initialData():t.initialData,n=e!==void 0,r=n?typeof t.initialDataUpdatedAt=="function"?t.initialDataUpdatedAt():t.initialDataUpdatedAt:0;return{data:e,dataUpdateCount:0,dataUpdatedAt:n?r??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:n?"success":"pending",fetchStatus:"idle"}}var Xs,An,zy,ws,yh,ug,Nc,hd,By,dg,fg,xh,bh,pd,hg,Bn,F0,_T,wT,ST,MT,ET,AT,TT,rF,Bj,n8=(Bj=class extends Gy{constructor(e,n){super();Gt(this,Bn);Gt(this,Xs);Gt(this,An);Gt(this,zy);Gt(this,ws);Gt(this,yh);Gt(this,ug);Gt(this,Nc);Gt(this,hd);Gt(this,By);Gt(this,dg);Gt(this,fg);Gt(this,xh);Gt(this,bh);Gt(this,pd);Gt(this,hg,new Set);this.options=n,wt(this,Xs,e),wt(this,hd,null),wt(this,Nc,xT()),this.bindMethods(),this.setOptions(n)}bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(ge(this,An).addObserver(this),rI(ge(this,An),this.options)?_n(this,Bn,F0).call(this):this.updateResult(),_n(this,Bn,MT).call(this))}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return PT(ge(this,An),this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return PT(ge(this,An),this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,_n(this,Bn,ET).call(this),_n(this,Bn,AT).call(this),ge(this,An).removeObserver(this)}setOptions(e){const n=this.options,r=ge(this,An);if(this.options=ge(this,Xs).defaultQueryOptions(e),this.options.enabled!==void 0&&typeof this.options.enabled!="boolean"&&typeof this.options.enabled!="function"&&typeof ga(this.options.enabled,ge(this,An))!="boolean")throw new Error("Expected enabled to be a boolean or a callback that returns a boolean");_n(this,Bn,TT).call(this),ge(this,An).setOptions(this.options),n._defaulted&&!gT(this.options,n)&&ge(this,Xs).getQueryCache().notify({type:"observerOptionsUpdated",query:ge(this,An),observer:this});const i=this.hasListeners();i&&iI(ge(this,An),r,this.options,n)&&_n(this,Bn,F0).call(this),this.updateResult(),i&&(ge(this,An)!==r||ga(this.options.enabled,ge(this,An))!==ga(n.enabled,ge(this,An))||xd(this.options.staleTime,ge(this,An))!==xd(n.staleTime,ge(this,An)))&&_n(this,Bn,_T).call(this);const s=_n(this,Bn,wT).call(this);i&&(ge(this,An)!==r||ga(this.options.enabled,ge(this,An))!==ga(n.enabled,ge(this,An))||s!==ge(this,pd))&&_n(this,Bn,ST).call(this,s)}getOptimisticResult(e){const n=ge(this,Xs).getQueryCache().build(ge(this,Xs),e),r=this.createResult(n,e);return i8(this,r)&&(wt(this,ws,r),wt(this,ug,this.options),wt(this,yh,ge(this,An).state)),r}getCurrentResult(){return ge(this,ws)}trackResult(e,n){return new Proxy(e,{get:(r,i)=>(this.trackProp(i),n==null||n(i),i==="promise"&&(this.trackProp("data"),!this.options.experimental_prefetchInRender&&ge(this,Nc).status==="pending"&&ge(this,Nc).reject(new Error("experimental_prefetchInRender feature flag is not enabled"))),Reflect.get(r,i))})}trackProp(e){ge(this,hg).add(e)}getCurrentQuery(){return ge(this,An)}refetch({...e}={}){return this.fetch({...e})}fetchOptimistic(e){const n=ge(this,Xs).defaultQueryOptions(e),r=ge(this,Xs).getQueryCache().build(ge(this,Xs),n);return r.fetch().then(()=>this.createResult(r,n))}fetch(e){return _n(this,Bn,F0).call(this,{...e,cancelRefetch:e.cancelRefetch??!0}).then(()=>(this.updateResult(),ge(this,ws)))}createResult(e,n){var V;const r=ge(this,An),i=this.options,s=ge(this,ws),a=ge(this,yh),o=ge(this,ug),c=e!==r?e.state:ge(this,zy),{state:d}=e;let f={...d},p=!1,y;if(n._optimisticResults){const k=this.hasListeners(),j=!k&&rI(e,n),X=k&&iI(e,r,n,i);(j||X)&&(f={...f,...nF(d.data,e.options)}),n._optimisticResults==="isRestoring"&&(f.fetchStatus="idle")}let{error:b,errorUpdatedAt:S,status:w}=f;y=f.data;let x=!1;if(n.placeholderData!==void 0&&y===void 0&&w==="pending"){let k;s!=null&&s.isPlaceholderData&&n.placeholderData===(o==null?void 0:o.placeholderData)?(k=s.data,x=!0):k=typeof n.placeholderData=="function"?n.placeholderData((V=ge(this,fg))==null?void 0:V.state.data,ge(this,fg)):n.placeholderData,k!==void 0&&(w="success",y=yT(s==null?void 0:s.data,k,n),p=!0)}if(n.select&&y!==void 0&&!x)if(s&&y===(a==null?void 0:a.data)&&n.select===ge(this,By))y=ge(this,dg);else try{wt(this,By,n.select),y=n.select(y),y=yT(s==null?void 0:s.data,y,n),wt(this,dg,y),wt(this,hd,null)}catch(k){wt(this,hd,k)}ge(this,hd)&&(b=ge(this,hd),y=ge(this,dg),S=Date.now(),w="error");const M=f.fetchStatus==="fetching",T=w==="pending",P=w==="error",O=T&&M,N=y!==void 0,z={status:w,fetchStatus:f.fetchStatus,isPending:T,isSuccess:w==="success",isError:P,isInitialLoading:O,isLoading:O,data:y,dataUpdatedAt:f.dataUpdatedAt,error:b,errorUpdatedAt:S,failureCount:f.fetchFailureCount,failureReason:f.fetchFailureReason,errorUpdateCount:f.errorUpdateCount,isFetched:e.isFetched(),isFetchedAfterMount:f.dataUpdateCount>c.dataUpdateCount||f.errorUpdateCount>c.errorUpdateCount,isFetching:M,isRefetching:M&&!T,isLoadingError:P&&!N,isPaused:f.fetchStatus==="paused",isPlaceholderData:p,isRefetchError:P&&N,isStale:xC(e,n),refetch:this.refetch,promise:ge(this,Nc),isEnabled:ga(n.enabled,e)!==!1};if(this.options.experimental_prefetchInRender){const k=z.data!==void 0,j=z.status==="error"&&!k,X=pe=>{j?pe.reject(z.error):k&&pe.resolve(z.data)},ee=()=>{const pe=wt(this,Nc,z.promise=xT());X(pe)},ie=ge(this,Nc);switch(ie.status){case"pending":e.queryHash===r.queryHash&&X(ie);break;case"fulfilled":(j||z.data!==ie.value)&&ee();break;case"rejected":(!j||z.error!==ie.reason)&&ee();break}}return z}updateResult(){const e=ge(this,ws),n=this.createResult(ge(this,An),this.options);if(wt(this,yh,ge(this,An).state),wt(this,ug,this.options),ge(this,yh).data!==void 0&&wt(this,fg,ge(this,An)),gT(n,e))return;wt(this,ws,n);const r=()=>{if(!e)return!0;const{notifyOnChangeProps:i}=this.options,s=typeof i=="function"?i():i;if(s==="all"||!s&&!ge(this,hg).size)return!0;const a=new Set(s??ge(this,hg));return this.options.throwOnError&&a.add("error"),Object.keys(ge(this,ws)).some(o=>{const l=o;return ge(this,ws)[l]!==e[l]&&a.has(l)})};_n(this,Bn,rF).call(this,{listeners:r()})}onQueryUpdate(){this.updateResult(),this.hasListeners()&&_n(this,Bn,MT).call(this)}},Xs=new WeakMap,An=new WeakMap,zy=new WeakMap,ws=new WeakMap,yh=new WeakMap,ug=new WeakMap,Nc=new WeakMap,hd=new WeakMap,By=new WeakMap,dg=new WeakMap,fg=new WeakMap,xh=new WeakMap,bh=new WeakMap,pd=new WeakMap,hg=new WeakMap,Bn=new WeakSet,F0=function(e){_n(this,Bn,TT).call(this);let n=ge(this,An).fetch(this.options,e);return e!=null&&e.throwOnError||(n=n.catch(qs)),n},_T=function(){_n(this,Bn,ET).call(this);const e=xd(this.options.staleTime,ge(this,An));if(oy.isServer()||ge(this,ws).isStale||!mT(e))return;const r=qj(ge(this,ws).dataUpdatedAt,e)+1;wt(this,xh,th.setTimeout(()=>{ge(this,ws).isStale||this.updateResult()},r))},wT=function(){return(typeof this.options.refetchInterval=="function"?this.options.refetchInterval(ge(this,An)):this.options.refetchInterval)??!1},ST=function(e){_n(this,Bn,AT).call(this),wt(this,pd,e),!(oy.isServer()||ga(this.options.enabled,ge(this,An))===!1||!mT(ge(this,pd))||ge(this,pd)===0)&&wt(this,bh,th.setInterval(()=>{(this.options.refetchIntervalInBackground||gC.isFocused())&&_n(this,Bn,F0).call(this)},ge(this,pd)))},MT=function(){_n(this,Bn,_T).call(this),_n(this,Bn,ST).call(this,_n(this,Bn,wT).call(this))},ET=function(){ge(this,xh)!==void 0&&(th.clearTimeout(ge(this,xh)),wt(this,xh,void 0))},AT=function(){ge(this,bh)!==void 0&&(th.clearInterval(ge(this,bh)),wt(this,bh,void 0))},TT=function(){const e=ge(this,Xs).getQueryCache().build(ge(this,Xs),this.options);if(e===ge(this,An))return;const n=ge(this,An);wt(this,An,e),wt(this,zy,e.state),this.hasListeners()&&(n==null||n.removeObserver(this),e.addObserver(this))},rF=function(e){zi.batch(()=>{e.listeners&&this.listeners.forEach(n=>{n(ge(this,ws))}),ge(this,Xs).getQueryCache().notify({query:ge(this,An),type:"observerResultsUpdated"})})},Bj);function r8(t,e){return ga(e.enabled,t)!==!1&&t.state.data===void 0&&!(t.state.status==="error"&&ga(e.retryOnMount,t)===!1)}function rI(t,e){return r8(t,e)||t.state.data!==void 0&&PT(t,e,e.refetchOnMount)}function PT(t,e,n){if(ga(e.enabled,t)!==!1&&xd(e.staleTime,t)!=="static"){const r=typeof n=="function"?n(t):n;return r==="always"||r!==!1&&xC(t,e)}return!1}function iI(t,e,n,r){return(t!==e||ga(r.enabled,t)===!1)&&(!n.suspense||t.state.status!=="error")&&xC(t,n)}function xC(t,e){return ga(e.enabled,t)!==!1&&t.isStaleByTime(xd(e.staleTime,t))}function i8(t,e){return!gT(t.getCurrentResult(),e)}var Hy,yl,ns,_h,xl,rd,Hj,s8=(Hj=class extends eF{constructor(e){super();Gt(this,xl);Gt(this,Hy);Gt(this,yl);Gt(this,ns);Gt(this,_h);wt(this,Hy,e.client),this.mutationId=e.mutationId,wt(this,ns,e.mutationCache),wt(this,yl,[]),this.state=e.state||a8(),this.setOptions(e.options),this.scheduleGc()}setOptions(e){this.options=e,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(e){ge(this,yl).includes(e)||(ge(this,yl).push(e),this.clearGcTimeout(),ge(this,ns).notify({type:"observerAdded",mutation:this,observer:e}))}removeObserver(e){wt(this,yl,ge(this,yl).filter(n=>n!==e)),this.scheduleGc(),ge(this,ns).notify({type:"observerRemoved",mutation:this,observer:e})}optionalRemove(){ge(this,yl).length||(this.state.status==="pending"?this.scheduleGc():ge(this,ns).remove(this))}continue(){var e;return((e=ge(this,_h))==null?void 0:e.continue())??this.execute(this.state.variables)}async execute(e){var a,o,l,c,d,f,p,y,b,S,w,x,M,T,P,O,N,D;const n=()=>{_n(this,xl,rd).call(this,{type:"continue"})},r={client:ge(this,Hy),meta:this.options.meta,mutationKey:this.options.mutationKey};wt(this,_h,Jj({fn:()=>this.options.mutationFn?this.options.mutationFn(e,r):Promise.reject(new Error("No mutationFn found")),onFail:(z,V)=>{_n(this,xl,rd).call(this,{type:"failed",failureCount:z,error:V})},onPause:()=>{_n(this,xl,rd).call(this,{type:"pause"})},onContinue:n,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>ge(this,ns).canRun(this)}));const i=this.state.status==="pending",s=!ge(this,_h).canStart();try{if(i)n();else{_n(this,xl,rd).call(this,{type:"pending",variables:e,isPaused:s}),ge(this,ns).config.onMutate&&await ge(this,ns).config.onMutate(e,this,r);const V=await((o=(a=this.options).onMutate)==null?void 0:o.call(a,e,r));V!==this.state.context&&_n(this,xl,rd).call(this,{type:"pending",context:V,variables:e,isPaused:s})}const z=await ge(this,_h).start();return await((c=(l=ge(this,ns).config).onSuccess)==null?void 0:c.call(l,z,e,this.state.context,this,r)),await((f=(d=this.options).onSuccess)==null?void 0:f.call(d,z,e,this.state.context,r)),await((y=(p=ge(this,ns).config).onSettled)==null?void 0:y.call(p,z,null,this.state.variables,this.state.context,this,r)),await((S=(b=this.options).onSettled)==null?void 0:S.call(b,z,null,e,this.state.context,r)),_n(this,xl,rd).call(this,{type:"success",data:z}),z}catch(z){try{await((x=(w=ge(this,ns).config).onError)==null?void 0:x.call(w,z,e,this.state.context,this,r))}catch(V){Promise.reject(V)}try{await((T=(M=this.options).onError)==null?void 0:T.call(M,z,e,this.state.context,r))}catch(V){Promise.reject(V)}try{await((O=(P=ge(this,ns).config).onSettled)==null?void 0:O.call(P,void 0,z,this.state.variables,this.state.context,this,r))}catch(V){Promise.reject(V)}try{await((D=(N=this.options).onSettled)==null?void 0:D.call(N,void 0,z,e,this.state.context,r))}catch(V){Promise.reject(V)}throw _n(this,xl,rd).call(this,{type:"error",error:z}),z}finally{ge(this,ns).runNext(this)}}},Hy=new WeakMap,yl=new WeakMap,ns=new WeakMap,_h=new WeakMap,xl=new WeakSet,rd=function(e){const n=r=>{switch(e.type){case"failed":return{...r,failureCount:e.failureCount,failureReason:e.error};case"pause":return{...r,isPaused:!0};case"continue":return{...r,isPaused:!1};case"pending":return{...r,context:e.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:e.isPaused,status:"pending",variables:e.variables,submittedAt:Date.now()};case"success":return{...r,data:e.data,failureCount:0,failureReason:null,error:null,status:"success",isPaused:!1};case"error":return{...r,data:void 0,error:e.error,failureCount:r.failureCount+1,failureReason:e.error,isPaused:!1,status:"error"}}};this.state=n(this.state),zi.batch(()=>{ge(this,yl).forEach(r=>{r.onMutationUpdate(e)}),ge(this,ns).notify({mutation:this,type:"updated",action:e})})},Hj);function a8(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}var Ic,Lo,Vy,Vj,o8=(Vj=class extends Gy{constructor(e={}){super();Gt(this,Ic);Gt(this,Lo);Gt(this,Vy);this.config=e,wt(this,Ic,new Set),wt(this,Lo,new Map),wt(this,Vy,0)}build(e,n,r){const i=new s8({client:e,mutationCache:this,mutationId:++fb(this,Vy)._,options:e.defaultMutationOptions(n),state:r});return this.add(i),i}add(e){ge(this,Ic).add(e);const n=pb(e);if(typeof n=="string"){const r=ge(this,Lo).get(n);r?r.push(e):ge(this,Lo).set(n,[e])}this.notify({type:"added",mutation:e})}remove(e){if(ge(this,Ic).delete(e)){const n=pb(e);if(typeof n=="string"){const r=ge(this,Lo).get(n);if(r)if(r.length>1){const i=r.indexOf(e);i!==-1&&r.splice(i,1)}else r[0]===e&&ge(this,Lo).delete(n)}}this.notify({type:"removed",mutation:e})}canRun(e){const n=pb(e);if(typeof n=="string"){const r=ge(this,Lo).get(n),i=r==null?void 0:r.find(s=>s.state.status==="pending");return!i||i===e}else return!0}runNext(e){var r;const n=pb(e);if(typeof n=="string"){const i=(r=ge(this,Lo).get(n))==null?void 0:r.find(s=>s!==e&&s.state.isPaused);return(i==null?void 0:i.continue())??Promise.resolve()}else return Promise.resolve()}clear(){zi.batch(()=>{ge(this,Ic).forEach(e=>{this.notify({type:"removed",mutation:e})}),ge(this,Ic).clear(),ge(this,Lo).clear()})}getAll(){return Array.from(ge(this,Ic))}find(e){const n={exact:!0,...e};return this.getAll().find(r=>ZN(n,r))}findAll(e={}){return this.getAll().filter(n=>ZN(e,n))}notify(e){zi.batch(()=>{this.listeners.forEach(n=>{n(e)})})}resumePausedMutations(){const e=this.getAll().filter(n=>n.state.isPaused);return zi.batch(()=>Promise.all(e.map(n=>n.continue().catch(qs))))}},Ic=new WeakMap,Lo=new WeakMap,Vy=new WeakMap,Vj);function pb(t){var e;return(e=t.options.scope)==null?void 0:e.id}var bl,Gj,l8=(Gj=class extends Gy{constructor(e={}){super();Gt(this,bl);this.config=e,wt(this,bl,new Map)}build(e,n,r){const i=n.queryKey,s=n.queryHash??vC(i,n);let a=this.get(s);return a||(a=new t8({client:e,queryKey:i,queryHash:s,options:e.defaultQueryOptions(n),state:r,defaultOptions:e.getQueryDefaults(i)}),this.add(a)),a}add(e){ge(this,bl).has(e.queryHash)||(ge(this,bl).set(e.queryHash,e),this.notify({type:"added",query:e}))}remove(e){const n=ge(this,bl).get(e.queryHash);n&&(e.destroy(),n===e&&ge(this,bl).delete(e.queryHash),this.notify({type:"removed",query:e}))}clear(){zi.batch(()=>{this.getAll().forEach(e=>{this.remove(e)})})}get(e){return ge(this,bl).get(e)}getAll(){return[...ge(this,bl).values()]}find(e){const n={exact:!0,...e};return this.getAll().find(r=>YN(n,r))}findAll(e={}){const n=this.getAll();return Object.keys(e).length>0?n.filter(r=>YN(e,r)):n}notify(e){zi.batch(()=>{this.listeners.forEach(n=>{n(e)})})}onFocus(){zi.batch(()=>{this.getAll().forEach(e=>{e.onFocus()})})}onOnline(){zi.batch(()=>{this.getAll().forEach(e=>{e.onOnline()})})}},bl=new WeakMap,Gj),Mr,md,gd,pg,mg,vd,gg,vg,Wj,c8=(Wj=class{constructor(t={}){Gt(this,Mr);Gt(this,md);Gt(this,gd);Gt(this,pg);Gt(this,mg);Gt(this,vd);Gt(this,gg);Gt(this,vg);wt(this,Mr,t.queryCache||new l8),wt(this,md,t.mutationCache||new o8),wt(this,gd,t.defaultOptions||{}),wt(this,pg,new Map),wt(this,mg,new Map),wt(this,vd,0)}mount(){fb(this,vd)._++,ge(this,vd)===1&&(wt(this,gg,gC.subscribe(async t=>{t&&(await this.resumePausedMutations(),ge(this,Mr).onFocus())})),wt(this,vg,ew.subscribe(async t=>{t&&(await this.resumePausedMutations(),ge(this,Mr).onOnline())})))}unmount(){var t,e;fb(this,vd)._--,ge(this,vd)===0&&((t=ge(this,gg))==null||t.call(this),wt(this,gg,void 0),(e=ge(this,vg))==null||e.call(this),wt(this,vg,void 0))}isFetching(t){return ge(this,Mr).findAll({...t,fetchStatus:"fetching"}).length}isMutating(t){return ge(this,md).findAll({...t,status:"pending"}).length}getQueryData(t){var n;const e=this.defaultQueryOptions({queryKey:t});return(n=ge(this,Mr).get(e.queryHash))==null?void 0:n.state.data}ensureQueryData(t){const e=this.defaultQueryOptions(t),n=ge(this,Mr).build(this,e),r=n.state.data;return r===void 0?this.fetchQuery(t):(t.revalidateIfStale&&n.isStaleByTime(xd(e.staleTime,n))&&this.prefetchQuery(e),Promise.resolve(r))}getQueriesData(t){return ge(this,Mr).findAll(t).map(({queryKey:e,state:n})=>{const r=n.data;return[e,r]})}setQueryData(t,e,n){const r=this.defaultQueryOptions({queryKey:t}),i=ge(this,Mr).get(r.queryHash),s=i==null?void 0:i.state.data,a=VW(e,s);if(a!==void 0)return ge(this,Mr).build(this,r).setData(a,{...n,manual:!0})}setQueriesData(t,e,n){return zi.batch(()=>ge(this,Mr).findAll(t).map(({queryKey:r})=>[r,this.setQueryData(r,e,n)]))}getQueryState(t){var n;const e=this.defaultQueryOptions({queryKey:t});return(n=ge(this,Mr).get(e.queryHash))==null?void 0:n.state}removeQueries(t){const e=ge(this,Mr);zi.batch(()=>{e.findAll(t).forEach(n=>{e.remove(n)})})}resetQueries(t,e){const n=ge(this,Mr);return zi.batch(()=>(n.findAll(t).forEach(r=>{r.reset()}),this.refetchQueries({type:"active",...t},e)))}cancelQueries(t,e={}){const n={revert:!0,...e},r=zi.batch(()=>ge(this,Mr).findAll(t).map(i=>i.cancel(n)));return Promise.all(r).then(qs).catch(qs)}invalidateQueries(t,e={}){return zi.batch(()=>(ge(this,Mr).findAll(t).forEach(n=>{n.invalidate()}),(t==null?void 0:t.refetchType)==="none"?Promise.resolve():this.refetchQueries({...t,type:(t==null?void 0:t.refetchType)??(t==null?void 0:t.type)??"active"},e)))}refetchQueries(t,e={}){const n={...e,cancelRefetch:e.cancelRefetch??!0},r=zi.batch(()=>ge(this,Mr).findAll(t).filter(i=>!i.isDisabled()&&!i.isStatic()).map(i=>{let s=i.fetch(void 0,n);return n.throwOnError||(s=s.catch(qs)),i.state.fetchStatus==="paused"?Promise.resolve():s}));return Promise.all(r).then(qs)}fetchQuery(t){const e=this.defaultQueryOptions(t);e.retry===void 0&&(e.retry=!1);const n=ge(this,Mr).build(this,e);return n.isStaleByTime(xd(e.staleTime,n))?n.fetch(e):Promise.resolve(n.state.data)}prefetchQuery(t){return this.fetchQuery(t).then(qs).catch(qs)}fetchInfiniteQuery(t){return t._type="infinite",this.fetchQuery(t)}prefetchInfiniteQuery(t){return this.fetchInfiniteQuery(t).then(qs).catch(qs)}ensureInfiniteQueryData(t){return t._type="infinite",this.ensureQueryData(t)}resumePausedMutations(){return ew.isOnline()?ge(this,md).resumePausedMutations():Promise.resolve()}getQueryCache(){return ge(this,Mr)}getMutationCache(){return ge(this,md)}getDefaultOptions(){return ge(this,gd)}setDefaultOptions(t){wt(this,gd,t)}setQueryDefaults(t,e){ge(this,pg).set(sy(t),{queryKey:t,defaultOptions:e})}getQueryDefaults(t){const e=[...ge(this,pg).values()],n={};return e.forEach(r=>{ay(t,r.queryKey)&&Object.assign(n,r.defaultOptions)}),n}setMutationDefaults(t,e){ge(this,mg).set(sy(t),{mutationKey:t,defaultOptions:e})}getMutationDefaults(t){const e=[...ge(this,mg).values()],n={};return e.forEach(r=>{ay(t,r.mutationKey)&&Object.assign(n,r.defaultOptions)}),n}defaultQueryOptions(t){if(t._defaulted)return t;const e={...ge(this,gd).queries,...this.getQueryDefaults(t.queryKey),...t,_defaulted:!0};return e.queryHash||(e.queryHash=vC(e.queryKey,e)),e.refetchOnReconnect===void 0&&(e.refetchOnReconnect=e.networkMode!=="always"),e.throwOnError===void 0&&(e.throwOnError=!!e.suspense),!e.networkMode&&e.persister&&(e.networkMode="offlineFirst"),e.queryFn===yC&&(e.enabled=!1),e}defaultMutationOptions(t){return t!=null&&t._defaulted?t:{...ge(this,gd).mutations,...(t==null?void 0:t.mutationKey)&&this.getMutationDefaults(t.mutationKey),...t,_defaulted:!0}}clear(){ge(this,Mr).clear(),ge(this,md).clear()}},Mr=new WeakMap,md=new WeakMap,gd=new WeakMap,pg=new WeakMap,mg=new WeakMap,vd=new WeakMap,gg=new WeakMap,vg=new WeakMap,Wj),iF=R.createContext(void 0),Nd=t=>{const e=R.useContext(iF);if(!e)throw new Error("No QueryClient set, use QueryClientProvider to set one");return e},u8=({client:t,children:e})=>(R.useEffect(()=>(t.mount(),()=>{t.unmount()}),[t]),v.jsx(iF.Provider,{value:t,children:e})),sF=R.createContext(!1),d8=()=>R.useContext(sF);sF.Provider;function f8(){let t=!1;return{clearReset:()=>{t=!1},reset:()=>{t=!0},isReset:()=>t}}var h8=R.createContext(f8()),p8=()=>R.useContext(h8),m8=(t,e,n)=>{const r=n!=null&&n.state.error&&typeof t.throwOnError=="function"?Zj(t.throwOnError,[n.state.error,n]):t.throwOnError;(t.suspense||t.experimental_prefetchInRender||r)&&(e.isReset()||(t.retryOnMount=!1))},g8=t=>{R.useEffect(()=>{t.clearReset()},[t])},v8=({result:t,errorResetBoundary:e,throwOnError:n,query:r,suspense:i})=>t.isError&&!e.isReset()&&!t.isFetching&&r&&(i&&t.data===void 0||Zj(n,[t.error,r])),y8=t=>{if(t.suspense){const n=i=>i==="static"?i:Math.max(i??1e3,1e3),r=t.staleTime;t.staleTime=typeof r=="function"?(...i)=>n(r(...i)):n(r),typeof t.gcTime=="number"&&(t.gcTime=Math.max(t.gcTime,1e3))}},x8=(t,e)=>t.isLoading&&t.isFetching&&!e,b8=(t,e)=>(t==null?void 0:t.suspense)&&e.isPending,sI=(t,e,n)=>e.fetchOptimistic(t).catch(()=>{n.clearReset()});function _8(t,e,n){var y,b,S,w;const r=d8(),i=p8(),s=Nd(),a=s.defaultQueryOptions(t);(b=(y=s.getDefaultOptions().queries)==null?void 0:y._experimental_beforeQuery)==null||b.call(y,a);const o=s.getQueryCache().get(a.queryHash),l=t.subscribed!==!1;a._optimisticResults=r?"isRestoring":l?"optimistic":void 0,y8(a),m8(a,i,o),g8(i);const c=!s.getQueryCache().get(a.queryHash),[d]=R.useState(()=>new e(s,a)),f=d.getOptimisticResult(a),p=!r&&l;if(R.useSyncExternalStore(R.useCallback(x=>{const M=p?d.subscribe(zi.batchCalls(x)):qs;return d.updateResult(),M},[d,p]),()=>d.getCurrentResult(),()=>d.getCurrentResult()),R.useEffect(()=>{d.setOptions(a)},[a,d]),b8(a,f))throw sI(a,d,i);if(v8({result:f,errorResetBoundary:i,throwOnError:a.throwOnError,query:o,suspense:a.suspense}))throw f.error;if((w=(S=s.getDefaultOptions().queries)==null?void 0:S._experimental_afterQuery)==null||w.call(S,a,f),a.experimental_prefetchInRender&&!oy.isServer()&&x8(f,r)){const x=c?sI(a,d,i):o==null?void 0:o.promise;x==null||x.catch(qs).finally(()=>{d.updateResult()})}return a.notifyOnChangeProps?f:d.trackResult(f)}function bi(t,e){return _8(t,n8)}/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const w8=t=>t.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),aF=(...t)=>t.filter((e,n,r)=>!!e&&e.trim()!==""&&r.indexOf(e)===n).join(" ").trim();/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */var S8={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const M8=R.forwardRef(({color:t="currentColor",size:e=24,strokeWidth:n=2,absoluteStrokeWidth:r,className:i="",children:s,iconNode:a,...o},l)=>R.createElement("svg",{ref:l,...S8,width:e,height:e,stroke:t,strokeWidth:r?Number(n)*24/Number(e):n,className:aF("lucide",i),...o},[...a.map(([c,d])=>R.createElement(c,d)),...Array.isArray(s)?s:[s]]));/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const dt=(t,e)=>{const n=R.forwardRef(({className:r,...i},s)=>R.createElement(M8,{ref:s,iconNode:e,className:aF(`lucide-${w8(t)}`,r),...i}));return n.displayName=`${t}`,n};/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const bC=dt("Activity",[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const tw=dt("ArrowRight",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const E8=dt("ArrowUpRight",[["path",{d:"M7 7h10v10",key:"1tivn9"}],["path",{d:"M7 17 17 7",key:"1vkiza"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const CT=dt("BookOpen",[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",key:"ruj8y"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const $c=dt("Bot",[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const A8=dt("Box",[["path",{d:"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z",key:"hh9hay"}],["path",{d:"m3.3 7 8.7 5 8.7-5",key:"g66t2b"}],["path",{d:"M12 22V12",key:"d0xqtd"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const nw=dt("Boxes",[["path",{d:"M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z",key:"lc1i9w"}],["path",{d:"m7 16.5-4.74-2.85",key:"1o9zyk"}],["path",{d:"m7 16.5 5-3",key:"va8pkn"}],["path",{d:"M7 16.5v5.17",key:"jnp8gn"}],["path",{d:"M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z",key:"8zsnat"}],["path",{d:"m17 16.5-5-3",key:"8arw3v"}],["path",{d:"m17 16.5 4.74-2.85",key:"8rfmw"}],["path",{d:"M17 16.5v5.17",key:"k6z78m"}],["path",{d:"M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z",key:"1xygjf"}],["path",{d:"M12 8 7.26 5.15",key:"1vbdud"}],["path",{d:"m12 8 4.74-2.85",key:"3rx089"}],["path",{d:"M12 13.5V8",key:"1io7kd"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const T8=dt("BrainCircuit",[["path",{d:"M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z",key:"l5xja"}],["path",{d:"M9 13a4.5 4.5 0 0 0 3-4",key:"10igwf"}],["path",{d:"M6.003 5.125A3 3 0 0 0 6.401 6.5",key:"105sqy"}],["path",{d:"M3.477 10.896a4 4 0 0 1 .585-.396",key:"ql3yin"}],["path",{d:"M6 18a4 4 0 0 1-1.967-.516",key:"2e4loj"}],["path",{d:"M12 13h4",key:"1ku699"}],["path",{d:"M12 18h6a2 2 0 0 1 2 2v1",key:"105ag5"}],["path",{d:"M12 8h8",key:"1lhi5i"}],["path",{d:"M16 8V5a2 2 0 0 1 2-2",key:"u6izg6"}],["circle",{cx:"16",cy:"13",r:".5",key:"ry7gng"}],["circle",{cx:"18",cy:"3",r:".5",key:"1aiba7"}],["circle",{cx:"20",cy:"21",r:".5",key:"yhc1fs"}],["circle",{cx:"20",cy:"8",r:".5",key:"1e43v0"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const W1=dt("Brain",[["path",{d:"M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z",key:"l5xja"}],["path",{d:"M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z",key:"ep3f8r"}],["path",{d:"M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4",key:"1p4c4q"}],["path",{d:"M17.599 6.5a3 3 0 0 0 .399-1.375",key:"tmeiqw"}],["path",{d:"M6.003 5.125A3 3 0 0 0 6.401 6.5",key:"105sqy"}],["path",{d:"M3.477 10.896a4 4 0 0 1 .585-.396",key:"ql3yin"}],["path",{d:"M19.938 10.5a4 4 0 0 1 .585.396",key:"1qfode"}],["path",{d:"M6 18a4 4 0 0 1-1.967-.516",key:"2e4loj"}],["path",{d:"M19.967 17.484A4 4 0 0 1 18 18",key:"159ez6"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const P8=dt("Camera",[["path",{d:"M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z",key:"1tc9qg"}],["circle",{cx:"12",cy:"13",r:"3",key:"1vg3eu"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Sa=dt("Check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const oF=dt("ChevronDown",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const C8=dt("ChevronLeft",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const lF=dt("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const cF=dt("ChevronUp",[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const R8=dt("CircleCheck",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const N8=dt("CircleHelp",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3",key:"1u773s"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const I8=dt("CircleX",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"m9 9 6 6",key:"z0biqf"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const k8=dt("Clock",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polyline",{points:"12 6 12 12 16 14",key:"68esgv"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const O8=dt("CodeXml",[["path",{d:"m18 16 4-4-4-4",key:"1inbqp"}],["path",{d:"m6 8-4 4 4 4",key:"15zrgr"}],["path",{d:"m14.5 4-5 16",key:"e7oirm"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const uF=dt("Code",[["polyline",{points:"16 18 22 12 16 6",key:"z7tu5w"}],["polyline",{points:"8 6 2 12 8 18",key:"1eg1df"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const L8=dt("Command",[["path",{d:"M15 6v12a3 3 0 1 0 3-3H6a3 3 0 1 0 3 3V6a3 3 0 1 0-3 3h12a3 3 0 1 0-3-3",key:"11bfej"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const RT=dt("Compass",[["path",{d:"m16.24 7.76-1.804 5.411a2 2 0 0 1-1.265 1.265L7.76 16.24l1.804-5.411a2 2 0 0 1 1.265-1.265z",key:"9ktpf1"}],["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const D8=dt("Construction",[["rect",{x:"2",y:"6",width:"20",height:"8",rx:"1",key:"1estib"}],["path",{d:"M17 14v7",key:"7m2elx"}],["path",{d:"M7 14v7",key:"1cm7wv"}],["path",{d:"M17 3v3",key:"1v4jwn"}],["path",{d:"M7 3v3",key:"7o6guu"}],["path",{d:"M10 14 2.3 6.3",key:"1023jk"}],["path",{d:"m14 6 7.7 7.7",key:"1s8pl2"}],["path",{d:"m8 6 8 8",key:"hl96qh"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const NT=dt("Copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Md=dt("Cpu",[["rect",{width:"16",height:"16",x:"4",y:"4",rx:"2",key:"14l7u7"}],["rect",{width:"6",height:"6",x:"9",y:"9",rx:"1",key:"5aljv4"}],["path",{d:"M15 2v2",key:"13l42r"}],["path",{d:"M15 20v2",key:"15mkzm"}],["path",{d:"M2 15h2",key:"1gxd5l"}],["path",{d:"M2 9h2",key:"1bbxkp"}],["path",{d:"M20 15h2",key:"19e6y8"}],["path",{d:"M20 9h2",key:"19tzq7"}],["path",{d:"M9 2v2",key:"165o2o"}],["path",{d:"M9 20v2",key:"i2bqo8"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const U8=dt("Database",[["ellipse",{cx:"12",cy:"5",rx:"9",ry:"3",key:"msslwz"}],["path",{d:"M3 5V19A9 3 0 0 0 21 19V5",key:"1wlel7"}],["path",{d:"M3 12A9 3 0 0 0 21 12",key:"mv7ke4"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const yg=dt("Download",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"7 10 12 15 17 10",key:"2ggqvy"}],["line",{x1:"12",x2:"12",y1:"15",y2:"3",key:"1vk2je"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const xg=dt("ExternalLink",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const aI=dt("EyeOff",[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const IT=dt("Eye",[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const j8=dt("FileText",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const F8=dt("Flame",[["path",{d:"M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z",key:"96xj49"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const z8=dt("FolderOpen",[["path",{d:"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2",key:"usdka0"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const dF=dt("Gauge",[["path",{d:"m12 14 4-4",key:"9kzdfg"}],["path",{d:"M3.34 19a10 10 0 1 1 17.32 0",key:"19p75a"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const B8=dt("GitCommitHorizontal",[["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}],["line",{x1:"3",x2:"9",y1:"12",y2:"12",key:"1dyftd"}],["line",{x1:"15",x2:"21",y1:"12",y2:"12",key:"oup4p8"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const H8=dt("Globe",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",key:"13o1zl"}],["path",{d:"M2 12h20",key:"9i4pu4"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const rE=dt("HardDrive",[["line",{x1:"22",x2:"2",y1:"12",y2:"12",key:"1y58io"}],["path",{d:"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z",key:"oot6mr"}],["line",{x1:"6",x2:"6.01",y1:"16",y2:"16",key:"sgf278"}],["line",{x1:"10",x2:"10.01",y1:"16",y2:"16",key:"1l4acy"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const V8=dt("Heart",[["path",{d:"M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z",key:"c3ymky"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const oI=dt("Info",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const G8=dt("Key",[["path",{d:"m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4",key:"g0fldk"}],["path",{d:"m21 2-9.6 9.6",key:"1j0ho8"}],["circle",{cx:"7.5",cy:"15.5",r:"5.5",key:"yqb3hr"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const W8=dt("Laptop",[["path",{d:"M20 16V7a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v9m16 0H4m16 0 1.28 2.55a1 1 0 0 1-.9 1.45H3.62a1 1 0 0 1-.9-1.45L4 16",key:"tarvll"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const _C=dt("Layers",[["path",{d:"m12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83Z",key:"8b97xw"}],["path",{d:"m22 17.65-9.17 4.16a2 2 0 0 1-1.66 0L2 17.65",key:"dd6zsq"}],["path",{d:"m22 12.65-9.17 4.16a2 2 0 0 1-1.66 0L2 12.65",key:"ep9fru"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const $8=dt("LayoutDashboard",[["rect",{width:"7",height:"9",x:"3",y:"3",rx:"1",key:"10lvy0"}],["rect",{width:"7",height:"5",x:"14",y:"3",rx:"1",key:"16une8"}],["rect",{width:"7",height:"9",x:"14",y:"12",rx:"1",key:"1hutg5"}],["rect",{width:"7",height:"5",x:"3",y:"16",rx:"1",key:"ldoo1y"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const X8=dt("LifeBuoy",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m4.93 4.93 4.24 4.24",key:"1ymg45"}],["path",{d:"m14.83 9.17 4.24-4.24",key:"1cb5xl"}],["path",{d:"m14.83 14.83 4.24 4.24",key:"q42g0n"}],["path",{d:"m9.17 14.83-4.24 4.24",key:"bqpfvv"}],["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const q8=dt("Lightbulb",[["path",{d:"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5",key:"1gvzjb"}],["path",{d:"M9 18h6",key:"x1upvd"}],["path",{d:"M10 22h4",key:"ceow96"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const K8=dt("List",[["path",{d:"M3 12h.01",key:"nlz23k"}],["path",{d:"M3 18h.01",key:"1tta3j"}],["path",{d:"M3 6h.01",key:"1rqtza"}],["path",{d:"M8 12h13",key:"1za7za"}],["path",{d:"M8 18h13",key:"1lx6n3"}],["path",{d:"M8 6h13",key:"ik3vkj"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const $1=dt("LoaderCircle",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Y8=dt("Lock",[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Z8=dt("MessageSquare",[["path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z",key:"1lielz"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Q8=dt("MessagesSquare",[["path",{d:"M14 9a2 2 0 0 1-2 2H6l-4 4V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2z",key:"p1xzt8"}],["path",{d:"M18 9h2a2 2 0 0 1 2 2v11l-4-4h-6a2 2 0 0 1-2-2v-1",key:"1cx29u"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const fF=dt("Mic",[["path",{d:"M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z",key:"131961"}],["path",{d:"M19 10v2a7 7 0 0 1-14 0v-2",key:"1vc78b"}],["line",{x1:"12",x2:"12",y1:"19",y2:"22",key:"x3vr5v"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const lI=dt("Monitor",[["rect",{width:"20",height:"14",x:"2",y:"3",rx:"2",key:"48i651"}],["line",{x1:"8",x2:"16",y1:"21",y2:"21",key:"1svkeh"}],["line",{x1:"12",x2:"12",y1:"17",y2:"21",key:"vw1qmm"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const J8=dt("Moon",[["path",{d:"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z",key:"a7tn18"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const e9=dt("Network",[["rect",{x:"16",y:"16",width:"6",height:"6",rx:"1",key:"4q2zg0"}],["rect",{x:"2",y:"16",width:"6",height:"6",rx:"1",key:"8cvhb9"}],["rect",{x:"9",y:"2",width:"6",height:"6",rx:"1",key:"1egb70"}],["path",{d:"M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3",key:"1jsf9p"}],["path",{d:"M12 12V8",key:"2874zd"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const t9=dt("Package",[["path",{d:"M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z",key:"1a0edw"}],["path",{d:"M12 22V12",key:"d0xqtd"}],["path",{d:"m3.3 7 7.703 4.734a2 2 0 0 0 1.994 0L20.7 7",key:"yx3hmr"}],["path",{d:"m7.5 4.27 9 5.15",key:"1c824w"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const n9=dt("PenLine",[["path",{d:"M12 20h9",key:"t2du7b"}],["path",{d:"M16.376 3.622a1 1 0 0 1 3.002 3.002L7.368 18.635a2 2 0 0 1-.855.506l-2.872.838a.5.5 0 0 1-.62-.62l.838-2.872a2 2 0 0 1 .506-.854z",key:"1ykcvy"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const kT=dt("Plug",[["path",{d:"M12 22v-5",key:"1ega77"}],["path",{d:"M9 8V2",key:"14iosj"}],["path",{d:"M15 8V2",key:"18g5xt"}],["path",{d:"M18 8v5a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V8Z",key:"osxo6l"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const OT=dt("Plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const r9=dt("Power",[["path",{d:"M12 2v10",key:"mnfbl"}],["path",{d:"M18.4 6.6a9 9 0 1 1-12.77.04",key:"obofu9"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const i9=dt("Puzzle",[["path",{d:"M15.39 4.39a1 1 0 0 0 1.68-.474 2.5 2.5 0 1 1 3.014 3.015 1 1 0 0 0-.474 1.68l1.683 1.682a2.414 2.414 0 0 1 0 3.414L19.61 15.39a1 1 0 0 1-1.68-.474 2.5 2.5 0 1 0-3.014 3.015 1 1 0 0 1 .474 1.68l-1.683 1.682a2.414 2.414 0 0 1-3.414 0L8.61 19.61a1 1 0 0 0-1.68.474 2.5 2.5 0 1 1-3.014-3.015 1 1 0 0 0 .474-1.68l-1.683-1.682a2.414 2.414 0 0 1 0-3.414L4.39 8.61a1 1 0 0 1 1.68.474 2.5 2.5 0 1 0 3.014-3.015 1 1 0 0 1-.474-1.68l1.683-1.682a2.414 2.414 0 0 1 3.414 0z",key:"w46dr5"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Jf=dt("RefreshCw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const hF=dt("RotateCcw",[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const s9=dt("Scroll",[["path",{d:"M19 17V5a2 2 0 0 0-2-2H4",key:"zz82l3"}],["path",{d:"M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3",key:"1ph1d7"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const pF=dt("Search",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const a9=dt("Send",[["path",{d:"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z",key:"1ffxy3"}],["path",{d:"m21.854 2.147-10.94 10.939",key:"12cjpa"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const rw=dt("Server",[["rect",{width:"20",height:"8",x:"2",y:"2",rx:"2",ry:"2",key:"ngkwjq"}],["rect",{width:"20",height:"8",x:"2",y:"14",rx:"2",ry:"2",key:"iecqi9"}],["line",{x1:"6",x2:"6.01",y1:"6",y2:"6",key:"16zg32"}],["line",{x1:"6",x2:"6.01",y1:"18",y2:"18",key:"nzw8ys"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const o9=dt("Share2",[["circle",{cx:"18",cy:"5",r:"3",key:"gq8acd"}],["circle",{cx:"6",cy:"12",r:"3",key:"w7nqdw"}],["circle",{cx:"18",cy:"19",r:"3",key:"1xt0gg"}],["line",{x1:"8.59",x2:"15.42",y1:"13.51",y2:"17.49",key:"47mynk"}],["line",{x1:"15.41",x2:"8.59",y1:"6.51",y2:"10.49",key:"1n3mei"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const l9=dt("ShieldAlert",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"M12 8v4",key:"1got3b"}],["path",{d:"M12 16h.01",key:"1drbdi"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Ym=dt("Shield",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const cI=dt("Shuffle",[["path",{d:"M2 18h1.4c1.3 0 2.5-.6 3.3-1.7l6.1-8.6c.7-1.1 2-1.7 3.3-1.7H22",key:"1wmou1"}],["path",{d:"m18 2 4 4-4 4",key:"pucp1d"}],["path",{d:"M2 6h1.9c1.5 0 2.9.9 3.6 2.2",key:"10bdb2"}],["path",{d:"M22 18h-5.9c-1.3 0-2.6-.7-3.3-1.8l-.5-.8",key:"vgxac0"}],["path",{d:"m18 14 4 4-4 4",key:"10pe0f"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const c9=dt("SlidersVertical",[["line",{x1:"4",x2:"4",y1:"21",y2:"14",key:"1p332r"}],["line",{x1:"4",x2:"4",y1:"10",y2:"3",key:"gb41h5"}],["line",{x1:"12",x2:"12",y1:"21",y2:"12",key:"hf2csr"}],["line",{x1:"12",x2:"12",y1:"8",y2:"3",key:"1kfi7u"}],["line",{x1:"20",x2:"20",y1:"21",y2:"16",key:"1lhrwl"}],["line",{x1:"20",x2:"20",y1:"12",y2:"3",key:"16vvfq"}],["line",{x1:"2",x2:"6",y1:"14",y2:"14",key:"1uebub"}],["line",{x1:"10",x2:"14",y1:"8",y2:"8",key:"1yglbp"}],["line",{x1:"18",x2:"22",y1:"16",y2:"16",key:"1jxqpz"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Vm=dt("Sparkles",[["path",{d:"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z",key:"4pj2yx"}],["path",{d:"M20 3v4",key:"1olli1"}],["path",{d:"M22 5h-4",key:"1gvqau"}],["path",{d:"M4 17v2",key:"vumght"}],["path",{d:"M5 18H3",key:"zchphs"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const mF=dt("SquareTerminal",[["path",{d:"m7 11 2-2-2-2",key:"1lz0vl"}],["path",{d:"M11 13h4",key:"1p7l4v"}],["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const u9=dt("Star",[["path",{d:"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z",key:"r04s7s"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const gF=dt("Terminal",[["polyline",{points:"4 17 10 11 4 5",key:"akl6gq"}],["line",{x1:"12",x2:"20",y1:"19",y2:"19",key:"q2wloq"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const LT=dt("Trash2",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const bg=dt("TriangleAlert",[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const d9=dt("User",[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",key:"975kel"}],["circle",{cx:"12",cy:"7",r:"4",key:"17ys0d"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const DT=dt("Volume2",[["path",{d:"M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z",key:"uqj9uw"}],["path",{d:"M16 9a5 5 0 0 1 0 6",key:"1q6k2b"}],["path",{d:"M19.364 18.364a9 9 0 0 0 0-12.728",key:"ijwkga"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const wC=dt("Wrench",[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z",key:"cbrjhi"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Ed=dt("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const wh=dt("Zap",[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]]),z0=[{id:"dashboard",label:"Zentrale",hint:"System- & Stack-Status",icon:$8},{id:"models",label:"Modell-Manager",hint:"Verwalten, laden & Gateway-Routing",icon:nw},{id:"memory",label:"Gedächtnis",hint:"Geteiltes Memory verwalten",icon:W1},{id:"connect",label:"Verbinden",hint:"IDE-/Agent-Configs erzeugen",icon:kT},{id:"agent",label:"Hermes",hint:"Agent-Status & Verdrahtung",icon:$c},{id:"terminal",label:"Terminal",hint:"Interaktives Hermes-Agent-Terminal",icon:mF},{id:"voice",label:"Sprechen",hint:"Mit Hermes per Sprache reden (3D-Avatar)",icon:fF},{id:"guide",label:"Anleitung",hint:"Einrichten & Vibe-Coding",icon:N8}];var uI=1,f9=.9,h9=.8,p9=.17,iE=.1,sE=.999,m9=.9999,g9=.99,v9=/[\\\/_+.#"@\[\(\{&]/,y9=/[\\\/_+.#"@\[\(\{&]/g,x9=/[\s-]/,vF=/[\s-]/g;function UT(t,e,n,r,i,s,a){if(s===e.length)return i===t.length?uI:g9;var o=`${i},${s}`;if(a[o]!==void 0)return a[o];for(var l=r.charAt(s),c=n.indexOf(l,i),d=0,f,p,y,b;c>=0;)f=UT(t,e,n,r,c+1,s+1,a),f>d&&(c===i?f*=uI:v9.test(t.charAt(c-1))?(f*=h9,y=t.slice(i,c-1).match(y9),y&&i>0&&(f*=Math.pow(sE,y.length))):x9.test(t.charAt(c-1))?(f*=f9,b=t.slice(i,c-1).match(vF),b&&i>0&&(f*=Math.pow(sE,b.length))):(f*=p9,i>0&&(f*=Math.pow(sE,c-i))),t.charAt(c)!==e.charAt(s)&&(f*=m9)),(ff&&(f=p*iE)),f>d&&(d=f),c=n.indexOf(l,c+1);return a[o]=d,d}function dI(t){return t.toLowerCase().replace(vF," ")}function b9(t,e,n){return t=n&&n.length>0?`${t+" "+n.join(" ")}`:t,UT(t,e,dI(t),dI(e),0,0,{})}function bd(t,e,{checkForDefaultPrevented:n=!0}={}){return function(i){if(t==null||t(i),n===!1||!i.defaultPrevented)return e==null?void 0:e(i)}}function fI(t,e){if(typeof t=="function")return t(e);t!=null&&(t.current=e)}function _g(...t){return e=>{let n=!1;const r=t.map(i=>{const s=fI(i,e);return!n&&typeof s=="function"&&(n=!0),s});if(n)return()=>{for(let i=0;i{var x;const{scope:p,children:y,...b}=f,S=((x=p==null?void 0:p[t])==null?void 0:x[l])||o,w=R.useMemo(()=>b,Object.values(b));return v.jsx(S.Provider,{value:w,children:y})};c.displayName=s+"Provider";function d(f,p){var S;const y=((S=p==null?void 0:p[t])==null?void 0:S[l])||o,b=R.useContext(y);if(b)return b;if(a!==void 0)return a;throw new Error(`\`${f}\` must be used within \`${s}\``)}return[c,d]}const i=()=>{const s=n.map(a=>R.createContext(a));return function(o){const l=(o==null?void 0:o[t])||s;return R.useMemo(()=>({[`__scope${t}`]:{...o,[t]:l}}),[o,l])}};return i.scopeName=t,[r,w9(i,...e)]}function w9(...t){const e=t[0];if(t.length===1)return e;const n=()=>{const r=t.map(i=>({useScope:i(),scopeName:i.scopeName}));return function(s){const a=r.reduce((o,{useScope:l,scopeName:c})=>{const f=l(s)[`__scope${c}`];return{...o,...f}},{});return R.useMemo(()=>({[`__scope${e.scopeName}`]:a}),[a])}};return n.scopeName=e.scopeName,n}var ly=globalThis!=null&&globalThis.document?R.useLayoutEffect:()=>{},S9=G1[" useId ".trim().toString()]||(()=>{}),M9=0;function zc(t){const[e,n]=R.useState(S9());return ly(()=>{n(r=>r??String(M9++))},[t]),e?`radix-${e}`:""}var E9=G1[" useInsertionEffect ".trim().toString()]||ly;function A9({prop:t,defaultProp:e,onChange:n=()=>{},caller:r}){const[i,s,a]=T9({defaultProp:e,onChange:n}),o=t!==void 0,l=o?t:i;{const d=R.useRef(t!==void 0);R.useEffect(()=>{const f=d.current;f!==o&&console.warn(`${r} is changing from ${f?"controlled":"uncontrolled"} to ${o?"controlled":"uncontrolled"}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`),d.current=o},[o,r])}const c=R.useCallback(d=>{var f;if(o){const p=P9(d)?d(t):d;p!==t&&((f=a.current)==null||f.call(a,p))}else s(d)},[o,t,s,a]);return[l,c]}function T9({defaultProp:t,onChange:e}){const[n,r]=R.useState(t),i=R.useRef(n),s=R.useRef(e);return E9(()=>{s.current=e},[e]),R.useEffect(()=>{var a;i.current!==n&&((a=s.current)==null||a.call(s,n),i.current=n)},[n,i]),[n,r,s]}function P9(t){return typeof t=="function"}var X1=Xj();function yF(t){const e=R.forwardRef((n,r)=>{let{children:i,...s}=n,a=null,o=!1;const l=[];hI(i)&&typeof mb=="function"&&(i=mb(i._payload)),R.Children.forEach(i,p=>{var y;if(k9(p)){o=!0;const b=p;let S="child"in b.props?b.props.child:b.props.children;hI(S)&&typeof mb=="function"&&(S=mb(S._payload)),a=R9(b,S),l.push((y=a==null?void 0:a.props)==null?void 0:y.children)}else l.push(p)}),a?a=R.cloneElement(a,void 0,l):!o&&R.Children.count(i)===1&&R.isValidElement(i)&&(a=i);const c=a?I9(a):void 0,d=Kh(r,c);if(!a){if(i||i===0)throw new Error(o?U9(t):D9(t));return i}const f=N9(s,a.props??{});return a.type!==R.Fragment&&(f.ref=r?d:c),R.cloneElement(a,f)});return e.displayName=`${t}.Slot`,e}var C9=Symbol.for("radix.slottable"),R9=(t,e)=>{if("child"in t.props){const n=t.props.child;return R.isValidElement(n)?R.cloneElement(n,void 0,t.props.children(n.props.children)):null}return R.isValidElement(e)?e:null};function N9(t,e){const n={...e};for(const r in e){const i=t[r],s=e[r];/^on[A-Z]/.test(r)?i&&s?n[r]=(...o)=>{const l=s(...o);return i(...o),l}:i&&(n[r]=i):r==="style"?n[r]={...i,...s}:r==="className"&&(n[r]=[i,s].filter(Boolean).join(" "))}return{...t,...n}}function I9(t){var r,i;let e=(r=Object.getOwnPropertyDescriptor(t.props,"ref"))==null?void 0:r.get,n=e&&"isReactWarning"in e&&e.isReactWarning;return n?t.ref:(e=(i=Object.getOwnPropertyDescriptor(t,"ref"))==null?void 0:i.get,n=e&&"isReactWarning"in e&&e.isReactWarning,n?t.props.ref:t.props.ref||t.ref)}function k9(t){return R.isValidElement(t)&&typeof t.type=="function"&&"__radixId"in t.type&&t.type.__radixId===C9}var O9=Symbol.for("react.lazy");function hI(t){return t!=null&&typeof t=="object"&&"$$typeof"in t&&t.$$typeof===O9&&"_payload"in t&&L9(t._payload)}function L9(t){return typeof t=="object"&&t!==null&&"then"in t}var D9=t=>`${t} failed to slot onto its children. Expected a single React element child or \`Slottable\`.`,U9=t=>`${t} failed to slot onto its \`Slottable\`. Expected \`Slottable\` to receive a single React element child.`,mb=G1[" use ".trim().toString()],j9=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],Gi=j9.reduce((t,e)=>{const n=yF(`Primitive.${e}`),r=R.forwardRef((i,s)=>{const{asChild:a,...o}=i,l=a?n:e;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),v.jsx(l,{...o,ref:s})});return r.displayName=`Primitive.${e}`,{...t,[e]:r}},{});function F9(t,e){t&&X1.flushSync(()=>t.dispatchEvent(e))}function cy(t){const e=R.useRef(t);return R.useEffect(()=>{e.current=t}),R.useMemo(()=>((...n)=>{var r;return(r=e.current)==null?void 0:r.call(e,...n)}),[])}function z9(t,e=globalThis==null?void 0:globalThis.document){const n=cy(t);R.useEffect(()=>{const r=i=>{i.key==="Escape"&&n(i)};return e.addEventListener("keydown",r,{capture:!0}),()=>e.removeEventListener("keydown",r,{capture:!0})},[n,e])}var B9="DismissableLayer",jT="dismissableLayer.update",H9="dismissableLayer.pointerDownOutside",V9="dismissableLayer.focusOutside",pI,SC=R.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set,dismissableSurfaces:new Set}),xF=R.forwardRef((t,e)=>{const{disableOutsidePointerEvents:n=!1,deferPointerDownOutside:r=!1,onEscapeKeyDown:i,onPointerDownOutside:s,onFocusOutside:a,onInteractOutside:o,onDismiss:l,...c}=t,d=R.useContext(SC),[f,p]=R.useState(null),y=(f==null?void 0:f.ownerDocument)??(globalThis==null?void 0:globalThis.document),[,b]=R.useState({}),S=Kh(e,V=>p(V)),w=Array.from(d.layers),[x]=[...d.layersWithOutsidePointerEventsDisabled].slice(-1),M=w.indexOf(x),T=f?w.indexOf(f):-1,P=d.layersWithOutsidePointerEventsDisabled.size>0,O=T>=M,N=R.useRef(!1),D=X9(V=>{const k=V.target;if(!(k instanceof Node))return;const j=[...d.branches].some(X=>X.contains(k));!O||j||(s==null||s(V),o==null||o(V),V.defaultPrevented||l==null||l())},{ownerDocument:y,deferPointerDownOutside:r,isDeferredPointerDownOutsideRef:N,dismissableSurfaces:d.dismissableSurfaces}),z=q9(V=>{if(r&&N.current)return;const k=V.target;[...d.branches].some(X=>X.contains(k))||(a==null||a(V),o==null||o(V),V.defaultPrevented||l==null||l())},y);return z9(V=>{T===d.layers.size-1&&(i==null||i(V),!V.defaultPrevented&&l&&(V.preventDefault(),l()))},y),R.useEffect(()=>{if(f)return n&&(d.layersWithOutsidePointerEventsDisabled.size===0&&(pI=y.body.style.pointerEvents,y.body.style.pointerEvents="none"),d.layersWithOutsidePointerEventsDisabled.add(f)),d.layers.add(f),mI(),()=>{n&&(d.layersWithOutsidePointerEventsDisabled.delete(f),d.layersWithOutsidePointerEventsDisabled.size===0&&(y.body.style.pointerEvents=pI))}},[f,y,n,d]),R.useEffect(()=>()=>{f&&(d.layers.delete(f),d.layersWithOutsidePointerEventsDisabled.delete(f),mI())},[f,d]),R.useEffect(()=>{const V=()=>b({});return document.addEventListener(jT,V),()=>document.removeEventListener(jT,V)},[]),v.jsx(Gi.div,{...c,ref:S,style:{pointerEvents:P?O?"auto":"none":void 0,...t.style},onFocusCapture:bd(t.onFocusCapture,z.onFocusCapture),onBlurCapture:bd(t.onBlurCapture,z.onBlurCapture),onPointerDownCapture:bd(t.onPointerDownCapture,D.onPointerDownCapture)})});xF.displayName=B9;var G9="DismissableLayerBranch",W9=R.forwardRef((t,e)=>{const n=R.useContext(SC),r=R.useRef(null),i=Kh(e,r);return R.useEffect(()=>{const s=r.current;if(s)return n.branches.add(s),()=>{n.branches.delete(s)}},[n.branches]),v.jsx(Gi.div,{...t,ref:i})});W9.displayName=G9;function $9(){const t=R.useContext(SC),[e,n]=R.useState(null);return R.useEffect(()=>{if(e)return t.dismissableSurfaces.add(e),()=>{t.dismissableSurfaces.delete(e)}},[e,t.dismissableSurfaces]),n}function X9(t,e){const{ownerDocument:n=globalThis==null?void 0:globalThis.document,deferPointerDownOutside:r=!1,isDeferredPointerDownOutsideRef:i,dismissableSurfaces:s}=e,a=cy(t),o=R.useRef(!1),l=R.useRef(!1),c=R.useRef(new Map),d=R.useRef(()=>{});return R.useEffect(()=>{function f(){l.current=!1,i.current=!1,c.current.clear()}function p(){return Array.from(c.current.values()).some(Boolean)}function y(M){if(!l.current)return;const T=M.target;T instanceof Node&&[...s].some(O=>O.contains(T))||c.current.set(M.type,!0),M.type==="click"&&window.setTimeout(()=>{l.current&&d.current()},0)}function b(M){l.current&&c.current.set(M.type,!1)}const S=M=>{if(M.target&&!o.current){let T=function(){n.removeEventListener("click",d.current);const O=p();f(),O||bF(H9,a,P,{discrete:!0})};const P={originalEvent:M};l.current=!0,i.current=r&&M.button===0,c.current.clear(),!r||M.button!==0?T():(n.removeEventListener("click",d.current),d.current=T,n.addEventListener("click",d.current,{once:!0}))}else n.removeEventListener("click",d.current),f();o.current=!1},w=["pointerup","mousedown","mouseup","touchstart","touchend","click"];for(const M of w)n.addEventListener(M,y,!0),n.addEventListener(M,b);const x=window.setTimeout(()=>{n.addEventListener("pointerdown",S)},0);return()=>{window.clearTimeout(x),n.removeEventListener("pointerdown",S),n.removeEventListener("click",d.current);for(const M of w)n.removeEventListener(M,y,!0),n.removeEventListener(M,b)}},[n,a,r,i,s]),{onPointerDownCapture:()=>o.current=!0}}function q9(t,e=globalThis==null?void 0:globalThis.document){const n=cy(t),r=R.useRef(!1);return R.useEffect(()=>{const i=s=>{s.target&&!r.current&&bF(V9,n,{originalEvent:s},{discrete:!1})};return e.addEventListener("focusin",i),()=>e.removeEventListener("focusin",i)},[e,n]),{onFocusCapture:()=>r.current=!0,onBlurCapture:()=>r.current=!1}}function mI(){const t=new CustomEvent(jT);document.dispatchEvent(t)}function bF(t,e,n,{discrete:r}){const i=n.originalEvent.target,s=new CustomEvent(t,{bubbles:!1,cancelable:!0,detail:n});e&&i.addEventListener(t,e,{once:!0}),r?F9(i,s):i.dispatchEvent(s)}var aE="focusScope.autoFocusOnMount",oE="focusScope.autoFocusOnUnmount",gI={bubbles:!1,cancelable:!0},K9="FocusScope",_F=R.forwardRef((t,e)=>{const{loop:n=!1,trapped:r=!1,onMountAutoFocus:i,onUnmountAutoFocus:s,...a}=t,[o,l]=R.useState(null),c=cy(i),d=cy(s),f=R.useRef(null),p=Kh(e,S=>l(S)),y=R.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;R.useEffect(()=>{if(r){let S=function(T){if(y.paused||!o)return;const P=T.target;o.contains(P)?f.current=P:id(f.current,{select:!0})},w=function(T){if(y.paused||!o)return;const P=T.relatedTarget;P!==null&&(o.contains(P)||id(f.current,{select:!0}))},x=function(T){if(document.activeElement===document.body)for(const O of T)O.removedNodes.length>0&&id(o)};document.addEventListener("focusin",S),document.addEventListener("focusout",w);const M=new MutationObserver(x);return o&&M.observe(o,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",S),document.removeEventListener("focusout",w),M.disconnect()}}},[r,o,y.paused]),R.useEffect(()=>{if(o){yI.add(y);const S=document.activeElement;if(!o.contains(S)){const x=new CustomEvent(aE,gI);o.addEventListener(aE,c),o.dispatchEvent(x),x.defaultPrevented||(Y9(t$(wF(o)),{select:!0}),document.activeElement===S&&id(o))}return()=>{o.removeEventListener(aE,c),setTimeout(()=>{const x=new CustomEvent(oE,gI);o.addEventListener(oE,d),o.dispatchEvent(x),x.defaultPrevented||id(S??document.body,{select:!0}),o.removeEventListener(oE,d),yI.remove(y)},0)}}},[o,c,d,y]);const b=R.useCallback(S=>{if(!n&&!r||y.paused)return;const w=S.key==="Tab"&&!S.altKey&&!S.ctrlKey&&!S.metaKey,x=document.activeElement;if(w&&x){const M=S.currentTarget,[T,P]=Z9(M);T&&P?!S.shiftKey&&x===P?(S.preventDefault(),n&&id(T,{select:!0})):S.shiftKey&&x===T&&(S.preventDefault(),n&&id(P,{select:!0})):x===M&&S.preventDefault()}},[n,r,y.paused]);return v.jsx(Gi.div,{tabIndex:-1,...a,ref:p,onKeyDown:b})});_F.displayName=K9;function Y9(t,{select:e=!1}={}){const n=document.activeElement;for(const r of t)if(id(r,{select:e}),document.activeElement!==n)return}function Z9(t){const e=wF(t),n=vI(e,t),r=vI(e.reverse(),t);return[n,r]}function wF(t){const e=[],n=document.createTreeWalker(t,NodeFilter.SHOW_ELEMENT,{acceptNode:r=>{const i=r.tagName==="INPUT"&&r.type==="hidden";return r.disabled||r.hidden||i?NodeFilter.FILTER_SKIP:r.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)e.push(n.currentNode);return e}function vI(t,e){for(const n of t)if(!Q9(n,{upTo:e}))return n}function Q9(t,{upTo:e}){if(getComputedStyle(t).visibility==="hidden")return!0;for(;t;){if(e!==void 0&&t===e)return!1;if(getComputedStyle(t).display==="none")return!0;t=t.parentElement}return!1}function J9(t){return t instanceof HTMLInputElement&&"select"in t}function id(t,{select:e=!1}={}){if(t&&t.focus){const n=document.activeElement;t.focus({preventScroll:!0}),t!==n&&J9(t)&&e&&t.select()}}var yI=e$();function e$(){let t=[];return{add(e){const n=t[0];e!==n&&(n==null||n.pause()),t=xI(t,e),t.unshift(e)},remove(e){var n;t=xI(t,e),(n=t[0])==null||n.resume()}}}function xI(t,e){const n=[...t],r=n.indexOf(e);return r!==-1&&n.splice(r,1),n}function t$(t){return t.filter(e=>e.tagName!=="A")}var n$="Portal",SF=R.forwardRef((t,e)=>{var o;const{container:n,...r}=t,[i,s]=R.useState(!1);ly(()=>s(!0),[]);const a=n||i&&((o=globalThis==null?void 0:globalThis.document)==null?void 0:o.body);return a?X1.createPortal(v.jsx(Gi.div,{...r,ref:e}),a):null});SF.displayName=n$;function r$(t,e){return R.useReducer((n,r)=>e[n][r]??n,t)}var q1=t=>{const{present:e,children:n}=t,r=i$(e),i=typeof n=="function"?n({present:r.isPresent}):R.Children.only(n),s=s$(r.ref,a$(i));return typeof n=="function"||r.isPresent?R.cloneElement(i,{ref:s}):null};q1.displayName="Presence";function i$(t){const[e,n]=R.useState(),r=R.useRef(null),i=R.useRef(t),s=R.useRef("none"),a=t?"mounted":"unmounted",[o,l]=r$(a,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return R.useEffect(()=>{const c=gb(r.current);s.current=o==="mounted"?c:"none"},[o]),ly(()=>{const c=r.current,d=i.current;if(d!==t){const p=s.current,y=gb(c);t?l("MOUNT"):y==="none"||(c==null?void 0:c.display)==="none"?l("UNMOUNT"):l(d&&p!==y?"ANIMATION_OUT":"UNMOUNT"),i.current=t}},[t,l]),ly(()=>{if(e){let c;const d=e.ownerDocument.defaultView??window,f=y=>{const S=gb(r.current).includes(CSS.escape(y.animationName));if(y.target===e&&S&&(l("ANIMATION_END"),!i.current)){const w=e.style.animationFillMode;e.style.animationFillMode="forwards",c=d.setTimeout(()=>{e.style.animationFillMode==="forwards"&&(e.style.animationFillMode=w)})}},p=y=>{y.target===e&&(s.current=gb(r.current))};return e.addEventListener("animationstart",p),e.addEventListener("animationcancel",f),e.addEventListener("animationend",f),()=>{d.clearTimeout(c),e.removeEventListener("animationstart",p),e.removeEventListener("animationcancel",f),e.removeEventListener("animationend",f)}}else l("ANIMATION_END")},[e,l]),{isPresent:["mounted","unmountSuspended"].includes(o),ref:R.useCallback(c=>{r.current=c?getComputedStyle(c):null,n(c)},[])}}function bI(t,e){if(typeof t=="function")return t(e);t!=null&&(t.current=e)}function s$(...t){const e=R.useRef(t);return e.current=t,R.useCallback(n=>{const r=e.current;let i=!1;const s=r.map(a=>{const o=bI(a,n);return!i&&typeof o=="function"&&(i=!0),o});if(i)return()=>{for(let a=0;a{dl||(dl={start:_I(),end:_I()});const{start:t,end:e}=dl;return document.body.firstElementChild!==t&&document.body.insertAdjacentElement("afterbegin",t),document.body.lastElementChild!==e&&document.body.insertAdjacentElement("beforeend",e),vb++,()=>{vb===1&&(dl==null||dl.start.remove(),dl==null||dl.end.remove(),dl=null),vb=Math.max(0,vb-1)}},[])}function _I(){const t=document.createElement("span");return t.setAttribute("data-radix-focus-guard",""),t.tabIndex=0,t.style.outline="none",t.style.opacity="0",t.style.position="fixed",t.style.pointerEvents="none",t}var _l=function(){return _l=Object.assign||function(e){for(var n,r=1,i=arguments.length;r"u")return M$;var e=E$(t),n=document.documentElement.clientWidth,r=window.innerWidth;return{left:e[0],top:e[1],right:e[2],gap:Math.max(0,r-n+e[2]-e[0])}},T$=TF(),Zm="data-scroll-locked",P$=function(t,e,n,r){var i=t.left,s=t.top,a=t.right,o=t.gap;return n===void 0&&(n="margin"),` - .`.concat(c$,` { - overflow: hidden `).concat(r,`; - padding-right: `).concat(o,"px ").concat(r,`; - } - body[`).concat(Zm,`] { - overflow: hidden `).concat(r,`; - overscroll-behavior: contain; - `).concat([e&&"position: relative ".concat(r,";"),n==="margin"&&` - padding-left: `.concat(i,`px; - padding-top: `).concat(s,`px; - padding-right: `).concat(a,`px; - margin-left:0; - margin-top:0; - margin-right: `).concat(o,"px ").concat(r,`; - `),n==="padding"&&"padding-right: ".concat(o,"px ").concat(r,";")].filter(Boolean).join(""),` - } - - .`).concat(j_,` { - right: `).concat(o,"px ").concat(r,`; - } - - .`).concat(F_,` { - margin-right: `).concat(o,"px ").concat(r,`; - } - - .`).concat(j_," .").concat(j_,` { - right: 0 `).concat(r,`; - } - - .`).concat(F_," .").concat(F_,` { - margin-right: 0 `).concat(r,`; - } - - body[`).concat(Zm,`] { - `).concat(u$,": ").concat(o,`px; - } -`)},SI=function(){var t=parseInt(document.body.getAttribute(Zm)||"0",10);return isFinite(t)?t:0},C$=function(){R.useEffect(function(){return document.body.setAttribute(Zm,(SI()+1).toString()),function(){var t=SI()-1;t<=0?document.body.removeAttribute(Zm):document.body.setAttribute(Zm,t.toString())}},[])},R$=function(t){var e=t.noRelative,n=t.noImportant,r=t.gapMode,i=r===void 0?"margin":r;C$();var s=R.useMemo(function(){return A$(i)},[i]);return R.createElement(T$,{styles:P$(s,!e,i,n?"":"!important")})},FT=!1;if(typeof window<"u")try{var yb=Object.defineProperty({},"passive",{get:function(){return FT=!0,!0}});window.addEventListener("test",yb,yb),window.removeEventListener("test",yb,yb)}catch{FT=!1}var nm=FT?{passive:!1}:!1,N$=function(t){return t.tagName==="TEXTAREA"},PF=function(t,e){if(!(t instanceof Element))return!1;var n=window.getComputedStyle(t);return n[e]!=="hidden"&&!(n.overflowY===n.overflowX&&!N$(t)&&n[e]==="visible")},I$=function(t){return PF(t,"overflowY")},k$=function(t){return PF(t,"overflowX")},MI=function(t,e){var n=e.ownerDocument,r=e;do{typeof ShadowRoot<"u"&&r instanceof ShadowRoot&&(r=r.host);var i=CF(t,r);if(i){var s=RF(t,r),a=s[1],o=s[2];if(a>o)return!0}r=r.parentNode}while(r&&r!==n.body);return!1},O$=function(t){var e=t.scrollTop,n=t.scrollHeight,r=t.clientHeight;return[e,n,r]},L$=function(t){var e=t.scrollLeft,n=t.scrollWidth,r=t.clientWidth;return[e,n,r]},CF=function(t,e){return t==="v"?I$(e):k$(e)},RF=function(t,e){return t==="v"?O$(e):L$(e)},D$=function(t,e){return t==="h"&&e==="rtl"?-1:1},U$=function(t,e,n,r,i){var s=D$(t,window.getComputedStyle(e).direction),a=s*r,o=n.target,l=e.contains(o),c=!1,d=a>0,f=0,p=0;do{if(!o)break;var y=RF(t,o),b=y[0],S=y[1],w=y[2],x=S-w-s*b;(b||x)&&CF(t,o)&&(f+=x,p+=b);var M=o.parentNode;o=M&&M.nodeType===Node.DOCUMENT_FRAGMENT_NODE?M.host:M}while(!l&&o!==document.body||l&&(e.contains(o)||e===o));return(d&&Math.abs(f)<1||!d&&Math.abs(p)<1)&&(c=!0),c},xb=function(t){return"changedTouches"in t?[t.changedTouches[0].clientX,t.changedTouches[0].clientY]:[0,0]},EI=function(t){return[t.deltaX,t.deltaY]},AI=function(t){return t&&"current"in t?t.current:t},j$=function(t,e){return t[0]===e[0]&&t[1]===e[1]},F$=function(t){return` - .block-interactivity-`.concat(t,` {pointer-events: none;} - .allow-interactivity-`).concat(t,` {pointer-events: all;} -`)},z$=0,rm=[];function B$(t){var e=R.useRef([]),n=R.useRef([0,0]),r=R.useRef(),i=R.useState(z$++)[0],s=R.useState(TF)[0],a=R.useRef(t);R.useEffect(function(){a.current=t},[t]),R.useEffect(function(){if(t.inert){document.body.classList.add("block-interactivity-".concat(i));var S=l$([t.lockRef.current],(t.shards||[]).map(AI),!0).filter(Boolean);return S.forEach(function(w){return w.classList.add("allow-interactivity-".concat(i))}),function(){document.body.classList.remove("block-interactivity-".concat(i)),S.forEach(function(w){return w.classList.remove("allow-interactivity-".concat(i))})}}},[t.inert,t.lockRef.current,t.shards]);var o=R.useCallback(function(S,w){if("touches"in S&&S.touches.length===2||S.type==="wheel"&&S.ctrlKey)return!a.current.allowPinchZoom;var x=xb(S),M=n.current,T="deltaX"in S?S.deltaX:M[0]-x[0],P="deltaY"in S?S.deltaY:M[1]-x[1],O,N=S.target,D=Math.abs(T)>Math.abs(P)?"h":"v";if("touches"in S&&D==="h"&&N.type==="range")return!1;var z=window.getSelection(),V=z&&z.anchorNode,k=V?V===N||V.contains(N):!1;if(k)return!1;var j=MI(D,N);if(!j)return!0;if(j?O=D:(O=D==="v"?"h":"v",j=MI(D,N)),!j)return!1;if(!r.current&&"changedTouches"in S&&(T||P)&&(r.current=O),!O)return!0;var X=r.current||O;return U$(X,w,S,X==="h"?T:P)},[]),l=R.useCallback(function(S){var w=S;if(!(!rm.length||rm[rm.length-1]!==s)){var x="deltaY"in w?EI(w):xb(w),M=e.current.filter(function(O){return O.name===w.type&&(O.target===w.target||w.target===O.shadowParent)&&j$(O.delta,x)})[0];if(M&&M.should){w.cancelable&&w.preventDefault();return}if(!M){var T=(a.current.shards||[]).map(AI).filter(Boolean).filter(function(O){return O.contains(w.target)}),P=T.length>0?o(w,T[0]):!a.current.noIsolation;P&&w.cancelable&&w.preventDefault()}}},[]),c=R.useCallback(function(S,w,x,M){var T={name:S,delta:w,target:x,should:M,shadowParent:H$(x)};e.current.push(T),setTimeout(function(){e.current=e.current.filter(function(P){return P!==T})},1)},[]),d=R.useCallback(function(S){n.current=xb(S),r.current=void 0},[]),f=R.useCallback(function(S){c(S.type,EI(S),S.target,o(S,t.lockRef.current))},[]),p=R.useCallback(function(S){c(S.type,xb(S),S.target,o(S,t.lockRef.current))},[]);R.useEffect(function(){return rm.push(s),t.setCallbacks({onScrollCapture:f,onWheelCapture:f,onTouchMoveCapture:p}),document.addEventListener("wheel",l,nm),document.addEventListener("touchmove",l,nm),document.addEventListener("touchstart",d,nm),function(){rm=rm.filter(function(S){return S!==s}),document.removeEventListener("wheel",l,nm),document.removeEventListener("touchmove",l,nm),document.removeEventListener("touchstart",d,nm)}},[]);var y=t.removeScrollBar,b=t.inert;return R.createElement(R.Fragment,null,b?R.createElement(s,{styles:F$(i)}):null,y?R.createElement(R$,{noRelative:t.noRelative,gapMode:t.gapMode}):null)}function H$(t){for(var e=null;t!==null;)t instanceof ShadowRoot&&(e=t.host,t=t.host),t=t.parentNode;return e}const V$=v$(AF,B$);var NF=R.forwardRef(function(t,e){return R.createElement(K1,_l({},t,{ref:e,sideCar:V$}))});NF.classNames=K1.classNames;var G$=function(t){if(typeof document>"u")return null;var e=Array.isArray(t)?t[0]:t;return e.ownerDocument.body},im=new WeakMap,bb=new WeakMap,_b={},dE=0,IF=function(t){return t&&(t.host||IF(t.parentNode))},W$=function(t,e){return e.map(function(n){if(t.contains(n))return n;var r=IF(n);return r&&t.contains(r)?r:(console.error("aria-hidden",n,"in not contained inside",t,". Doing nothing"),null)}).filter(function(n){return!!n})},$$=function(t,e,n,r){var i=W$(e,Array.isArray(t)?t:[t]);_b[n]||(_b[n]=new WeakMap);var s=_b[n],a=[],o=new Set,l=new Set(i),c=function(f){!f||o.has(f)||(o.add(f),c(f.parentNode))};i.forEach(c);var d=function(f){!f||l.has(f)||Array.prototype.forEach.call(f.children,function(p){if(o.has(p))d(p);else try{var y=p.getAttribute(r),b=y!==null&&y!=="false",S=(im.get(p)||0)+1,w=(s.get(p)||0)+1;im.set(p,S),s.set(p,w),a.push(p),S===1&&b&&bb.set(p,!0),w===1&&p.setAttribute(n,"true"),b||p.setAttribute(r,"true")}catch(x){console.error("aria-hidden: cannot operate on ",p,x)}})};return d(e),o.clear(),dE++,function(){a.forEach(function(f){var p=im.get(f)-1,y=s.get(f)-1;im.set(f,p),s.set(f,y),p||(bb.has(f)||f.removeAttribute(r),bb.delete(f)),y||f.removeAttribute(n)}),dE--,dE||(im=new WeakMap,im=new WeakMap,bb=new WeakMap,_b={})}},X$=function(t,e,n){n===void 0&&(n="data-aria-hidden");var r=Array.from(Array.isArray(t)?t:[t]),i=G$(t);return i?(r.push.apply(r,Array.from(i.querySelectorAll("[aria-live], script"))),$$(r,i,n,"aria-hidden")):function(){return null}},Y1="Dialog",[kF]=_9(Y1),[q$,Wo]=kF(Y1),OF=t=>{const{__scopeDialog:e,children:n,open:r,defaultOpen:i,onOpenChange:s,modal:a=!0}=t,o=R.useRef(null),l=R.useRef(null),[c,d]=A9({prop:r,defaultProp:i??!1,onChange:s,caller:Y1});return v.jsx(q$,{scope:e,triggerRef:o,contentRef:l,contentId:zc(),titleId:zc(),descriptionId:zc(),open:c,onOpenChange:d,onOpenToggle:R.useCallback(()=>d(f=>!f),[d]),modal:a,children:n})};OF.displayName=Y1;var LF="DialogTrigger",K$=R.forwardRef((t,e)=>{const{__scopeDialog:n,...r}=t,i=Wo(LF,n),s=Kh(e,i.triggerRef);return v.jsx(Gi.button,{type:"button","aria-haspopup":"dialog","aria-expanded":i.open,"aria-controls":i.open?i.contentId:void 0,"data-state":EC(i.open),...r,ref:s,onClick:bd(t.onClick,i.onOpenToggle)})});K$.displayName=LF;var MC="DialogPortal",[Y$,DF]=kF(MC,{forceMount:void 0}),UF=t=>{const{__scopeDialog:e,forceMount:n,children:r,container:i}=t,s=Wo(MC,e);return v.jsx(Y$,{scope:e,forceMount:n,children:R.Children.map(r,a=>v.jsx(q1,{present:n||s.open,children:v.jsx(SF,{asChild:!0,container:i,children:a})}))})};UF.displayName=MC;var iw="DialogOverlay",jF=R.forwardRef((t,e)=>{const n=DF(iw,t.__scopeDialog),{forceMount:r=n.forceMount,...i}=t,s=Wo(iw,t.__scopeDialog);return s.modal?v.jsx(q1,{present:r||s.open,children:v.jsx(Q$,{...i,ref:e})}):null});jF.displayName=iw;var Z$=yF("DialogOverlay.RemoveScroll"),Q$=R.forwardRef((t,e)=>{const{__scopeDialog:n,...r}=t,i=Wo(iw,n),s=$9(),a=Kh(e,s);return v.jsx(NF,{as:Z$,allowPinchZoom:!0,shards:[i.contentRef],children:v.jsx(Gi.div,{"data-state":EC(i.open),...r,ref:a,style:{pointerEvents:"auto",...r.style}})})}),wg="DialogContent",FF=R.forwardRef((t,e)=>{const n=DF(wg,t.__scopeDialog),{forceMount:r=n.forceMount,...i}=t,s=Wo(wg,t.__scopeDialog);return v.jsx(q1,{present:r||s.open,children:s.modal?v.jsx(J$,{...i,ref:e}):v.jsx(e7,{...i,ref:e})})});FF.displayName=wg;var J$=R.forwardRef((t,e)=>{const n=Wo(wg,t.__scopeDialog),r=R.useRef(null),i=Kh(e,n.contentRef,r);return R.useEffect(()=>{const s=r.current;if(s)return X$(s)},[]),v.jsx(zF,{...t,ref:i,trapFocus:n.open,disableOutsidePointerEvents:n.open,onCloseAutoFocus:bd(t.onCloseAutoFocus,s=>{var a;s.preventDefault(),(a=n.triggerRef.current)==null||a.focus()}),onPointerDownOutside:bd(t.onPointerDownOutside,s=>{const a=s.detail.originalEvent,o=a.button===0&&a.ctrlKey===!0;(a.button===2||o)&&s.preventDefault()}),onFocusOutside:bd(t.onFocusOutside,s=>s.preventDefault())})}),e7=R.forwardRef((t,e)=>{const n=Wo(wg,t.__scopeDialog),r=R.useRef(!1),i=R.useRef(!1);return v.jsx(zF,{...t,ref:e,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:s=>{var a,o;(a=t.onCloseAutoFocus)==null||a.call(t,s),s.defaultPrevented||(r.current||(o=n.triggerRef.current)==null||o.focus(),s.preventDefault()),r.current=!1,i.current=!1},onInteractOutside:s=>{var l,c;(l=t.onInteractOutside)==null||l.call(t,s),s.defaultPrevented||(r.current=!0,s.detail.originalEvent.type==="pointerdown"&&(i.current=!0));const a=s.target;((c=n.triggerRef.current)==null?void 0:c.contains(a))&&s.preventDefault(),s.detail.originalEvent.type==="focusin"&&i.current&&s.preventDefault()}})}),zF=R.forwardRef((t,e)=>{const{__scopeDialog:n,trapFocus:r,onOpenAutoFocus:i,onCloseAutoFocus:s,...a}=t,o=Wo(wg,n);return o$(),v.jsx(v.Fragment,{children:v.jsx(_F,{asChild:!0,loop:!0,trapped:r,onMountAutoFocus:i,onUnmountAutoFocus:s,children:v.jsx(xF,{role:"dialog",id:o.contentId,"aria-describedby":o.descriptionId,"aria-labelledby":o.titleId,"data-state":EC(o.open),...a,ref:e,deferPointerDownOutside:!0,onDismiss:()=>o.onOpenChange(!1)})})})}),BF="DialogTitle",t7=R.forwardRef((t,e)=>{const{__scopeDialog:n,...r}=t,i=Wo(BF,n);return v.jsx(Gi.h2,{id:i.titleId,...r,ref:e})});t7.displayName=BF;var HF="DialogDescription",n7=R.forwardRef((t,e)=>{const{__scopeDialog:n,...r}=t,i=Wo(HF,n);return v.jsx(Gi.p,{id:i.descriptionId,...r,ref:e})});n7.displayName=HF;var VF="DialogClose",r7=R.forwardRef((t,e)=>{const{__scopeDialog:n,...r}=t,i=Wo(VF,n);return v.jsx(Gi.button,{type:"button",...r,ref:e,onClick:bd(t.onClick,()=>i.onOpenChange(!1))})});r7.displayName=VF;function EC(t){return t?"open":"closed"}var r0='[cmdk-group=""]',fE='[cmdk-group-items=""]',i7='[cmdk-group-heading=""]',GF='[cmdk-item=""]',TI=`${GF}:not([aria-disabled="true"])`,zT="cmdk-item-select",Dm="data-value",s7=(t,e,n)=>b9(t,e,n),WF=R.createContext(void 0),Wy=()=>R.useContext(WF),$F=R.createContext(void 0),AC=()=>R.useContext($F),XF=R.createContext(void 0),qF=R.forwardRef((t,e)=>{let n=Um(()=>{var G,le;return{search:"",value:(le=(G=t.value)!=null?G:t.defaultValue)!=null?le:"",selectedItemId:void 0,filtered:{count:0,items:new Map,groups:new Set}}}),r=Um(()=>new Set),i=Um(()=>new Map),s=Um(()=>new Map),a=Um(()=>new Set),o=KF(t),{label:l,children:c,value:d,onValueChange:f,filter:p,shouldFilter:y,loop:b,disablePointerSelection:S=!1,vimBindings:w=!0,...x}=t,M=zc(),T=zc(),P=zc(),O=R.useRef(null),N=g7();Nh(()=>{if(d!==void 0){let G=d.trim();n.current.value=G,D.emit()}},[d]),Nh(()=>{N(6,ee)},[]);let D=R.useMemo(()=>({subscribe:G=>(a.current.add(G),()=>a.current.delete(G)),snapshot:()=>n.current,setState:(G,le,se)=>{var ce,Se,we,We;if(!Object.is(n.current[G],le)){if(n.current[G]=le,G==="search")X(),k(),N(1,j);else if(G==="value"){if(document.activeElement.hasAttribute("cmdk-input")||document.activeElement.hasAttribute("cmdk-root")){let Ee=document.getElementById(P);Ee?Ee.focus():(ce=document.getElementById(M))==null||ce.focus()}if(N(7,()=>{var Ee;n.current.selectedItemId=(Ee=ie())==null?void 0:Ee.id,D.emit()}),se||N(5,ee),((Se=o.current)==null?void 0:Se.value)!==void 0){let Ee=le??"";(We=(we=o.current).onValueChange)==null||We.call(we,Ee);return}}D.emit()}},emit:()=>{a.current.forEach(G=>G())}}),[]),z=R.useMemo(()=>({value:(G,le,se)=>{var ce;le!==((ce=s.current.get(G))==null?void 0:ce.value)&&(s.current.set(G,{value:le,keywords:se}),n.current.filtered.items.set(G,V(le,se)),N(2,()=>{k(),D.emit()}))},item:(G,le)=>(r.current.add(G),le&&(i.current.has(le)?i.current.get(le).add(G):i.current.set(le,new Set([G]))),N(3,()=>{X(),k(),n.current.value||j(),D.emit()}),()=>{s.current.delete(G),r.current.delete(G),n.current.filtered.items.delete(G);let se=ie();N(4,()=>{X(),(se==null?void 0:se.getAttribute("id"))===G&&j(),D.emit()})}),group:G=>(i.current.has(G)||i.current.set(G,new Set),()=>{s.current.delete(G),i.current.delete(G)}),filter:()=>o.current.shouldFilter,label:l||t["aria-label"],getDisablePointerSelection:()=>o.current.disablePointerSelection,listId:M,inputId:P,labelId:T,listInnerRef:O}),[]);function V(G,le){var se,ce;let Se=(ce=(se=o.current)==null?void 0:se.filter)!=null?ce:s7;return G?Se(G,n.current.search,le):0}function k(){if(!n.current.search||o.current.shouldFilter===!1)return;let G=n.current.filtered.items,le=[];n.current.filtered.groups.forEach(ce=>{let Se=i.current.get(ce),we=0;Se.forEach(We=>{let Ee=G.get(We);we=Math.max(Ee,we)}),le.push([ce,we])});let se=O.current;pe().sort((ce,Se)=>{var we,We;let Ee=ce.getAttribute("id"),Ge=Se.getAttribute("id");return((we=G.get(Ge))!=null?we:0)-((We=G.get(Ee))!=null?We:0)}).forEach(ce=>{let Se=ce.closest(fE);Se?Se.appendChild(ce.parentElement===Se?ce:ce.closest(`${fE} > *`)):se.appendChild(ce.parentElement===se?ce:ce.closest(`${fE} > *`))}),le.sort((ce,Se)=>Se[1]-ce[1]).forEach(ce=>{var Se;let we=(Se=O.current)==null?void 0:Se.querySelector(`${r0}[${Dm}="${encodeURIComponent(ce[0])}"]`);we==null||we.parentElement.appendChild(we)})}function j(){let G=pe().find(se=>se.getAttribute("aria-disabled")!=="true"),le=G==null?void 0:G.getAttribute(Dm);D.setState("value",le||void 0)}function X(){var G,le,se,ce;if(!n.current.search||o.current.shouldFilter===!1){n.current.filtered.count=r.current.size;return}n.current.filtered.groups=new Set;let Se=0;for(let we of r.current){let We=(le=(G=s.current.get(we))==null?void 0:G.value)!=null?le:"",Ee=(ce=(se=s.current.get(we))==null?void 0:se.keywords)!=null?ce:[],Ge=V(We,Ee);n.current.filtered.items.set(we,Ge),Ge>0&&Se++}for(let[we,We]of i.current)for(let Ee of We)if(n.current.filtered.items.get(Ee)>0){n.current.filtered.groups.add(we);break}n.current.filtered.count=Se}function ee(){var G,le,se;let ce=ie();ce&&(((G=ce.parentElement)==null?void 0:G.firstChild)===ce&&((se=(le=ce.closest(r0))==null?void 0:le.querySelector(i7))==null||se.scrollIntoView({block:"nearest"})),ce.scrollIntoView({block:"nearest"}))}function ie(){var G;return(G=O.current)==null?void 0:G.querySelector(`${GF}[aria-selected="true"]`)}function pe(){var G;return Array.from(((G=O.current)==null?void 0:G.querySelectorAll(TI))||[])}function ae(G){let le=pe()[G];le&&D.setState("value",le.getAttribute(Dm))}function he(G){var le;let se=ie(),ce=pe(),Se=ce.findIndex(We=>We===se),we=ce[Se+G];(le=o.current)!=null&&le.loop&&(we=Se+G<0?ce[ce.length-1]:Se+G===ce.length?ce[0]:ce[Se+G]),we&&D.setState("value",we.getAttribute(Dm))}function B(G){let le=ie(),se=le==null?void 0:le.closest(r0),ce;for(;se&&!ce;)se=G>0?p7(se,r0):m7(se,r0),ce=se==null?void 0:se.querySelector(TI);ce?D.setState("value",ce.getAttribute(Dm)):he(G)}let J=()=>ae(pe().length-1),Y=G=>{G.preventDefault(),G.metaKey?J():G.altKey?B(1):he(1)},H=G=>{G.preventDefault(),G.metaKey?ae(0):G.altKey?B(-1):he(-1)};return R.createElement(Gi.div,{ref:e,tabIndex:-1,...x,"cmdk-root":"",onKeyDown:G=>{var le;(le=x.onKeyDown)==null||le.call(x,G);let se=G.nativeEvent.isComposing||G.keyCode===229;if(!(G.defaultPrevented||se))switch(G.key){case"n":case"j":{w&&G.ctrlKey&&Y(G);break}case"ArrowDown":{Y(G);break}case"p":case"k":{w&&G.ctrlKey&&H(G);break}case"ArrowUp":{H(G);break}case"Home":{G.preventDefault(),ae(0);break}case"End":{G.preventDefault(),J();break}case"Enter":{G.preventDefault();let ce=ie();if(ce){let Se=new Event(zT);ce.dispatchEvent(Se)}}}}},R.createElement("label",{"cmdk-label":"",htmlFor:z.inputId,id:z.labelId,style:y7},l),Z1(t,G=>R.createElement($F.Provider,{value:D},R.createElement(WF.Provider,{value:z},G))))}),a7=R.forwardRef((t,e)=>{var n,r;let i=zc(),s=R.useRef(null),a=R.useContext(XF),o=Wy(),l=KF(t),c=(r=(n=l.current)==null?void 0:n.forceMount)!=null?r:a==null?void 0:a.forceMount;Nh(()=>{if(!c)return o.item(i,a==null?void 0:a.id)},[c]);let d=YF(i,s,[t.value,t.children,s],t.keywords),f=AC(),p=Ad(N=>N.value&&N.value===d.current),y=Ad(N=>c||o.filter()===!1?!0:N.search?N.filtered.items.get(i)>0:!0);R.useEffect(()=>{let N=s.current;if(!(!N||t.disabled))return N.addEventListener(zT,b),()=>N.removeEventListener(zT,b)},[y,t.onSelect,t.disabled]);function b(){var N,D;S(),(D=(N=l.current).onSelect)==null||D.call(N,d.current)}function S(){f.setState("value",d.current,!0)}if(!y)return null;let{disabled:w,value:x,onSelect:M,forceMount:T,keywords:P,...O}=t;return R.createElement(Gi.div,{ref:_g(s,e),...O,id:i,"cmdk-item":"",role:"option","aria-disabled":!!w,"aria-selected":!!p,"data-disabled":!!w,"data-selected":!!p,onPointerMove:w||o.getDisablePointerSelection()?void 0:S,onClick:w?void 0:b},t.children)}),o7=R.forwardRef((t,e)=>{let{heading:n,children:r,forceMount:i,...s}=t,a=zc(),o=R.useRef(null),l=R.useRef(null),c=zc(),d=Wy(),f=Ad(y=>i||d.filter()===!1?!0:y.search?y.filtered.groups.has(a):!0);Nh(()=>d.group(a),[]),YF(a,o,[t.value,t.heading,l]);let p=R.useMemo(()=>({id:a,forceMount:i}),[i]);return R.createElement(Gi.div,{ref:_g(o,e),...s,"cmdk-group":"",role:"presentation",hidden:f?void 0:!0},n&&R.createElement("div",{ref:l,"cmdk-group-heading":"","aria-hidden":!0,id:c},n),Z1(t,y=>R.createElement("div",{"cmdk-group-items":"",role:"group","aria-labelledby":n?c:void 0},R.createElement(XF.Provider,{value:p},y))))}),l7=R.forwardRef((t,e)=>{let{alwaysRender:n,...r}=t,i=R.useRef(null),s=Ad(a=>!a.search);return!n&&!s?null:R.createElement(Gi.div,{ref:_g(i,e),...r,"cmdk-separator":"",role:"separator"})}),c7=R.forwardRef((t,e)=>{let{onValueChange:n,...r}=t,i=t.value!=null,s=AC(),a=Ad(c=>c.search),o=Ad(c=>c.selectedItemId),l=Wy();return R.useEffect(()=>{t.value!=null&&s.setState("search",t.value)},[t.value]),R.createElement(Gi.input,{ref:e,...r,"cmdk-input":"",autoComplete:"off",autoCorrect:"off",spellCheck:!1,"aria-autocomplete":"list",role:"combobox","aria-expanded":!0,"aria-controls":l.listId,"aria-labelledby":l.labelId,"aria-activedescendant":o,id:l.inputId,type:"text",value:i?t.value:a,onChange:c=>{i||s.setState("search",c.target.value),n==null||n(c.target.value)}})}),u7=R.forwardRef((t,e)=>{let{children:n,label:r="Suggestions",...i}=t,s=R.useRef(null),a=R.useRef(null),o=Ad(c=>c.selectedItemId),l=Wy();return R.useEffect(()=>{if(a.current&&s.current){let c=a.current,d=s.current,f,p=new ResizeObserver(()=>{f=requestAnimationFrame(()=>{let y=c.offsetHeight;d.style.setProperty("--cmdk-list-height",y.toFixed(1)+"px")})});return p.observe(c),()=>{cancelAnimationFrame(f),p.unobserve(c)}}},[]),R.createElement(Gi.div,{ref:_g(s,e),...i,"cmdk-list":"",role:"listbox",tabIndex:-1,"aria-activedescendant":o,"aria-label":r,id:l.listId},Z1(t,c=>R.createElement("div",{ref:_g(a,l.listInnerRef),"cmdk-list-sizer":""},c)))}),d7=R.forwardRef((t,e)=>{let{open:n,onOpenChange:r,overlayClassName:i,contentClassName:s,container:a,...o}=t;return R.createElement(OF,{open:n,onOpenChange:r},R.createElement(UF,{container:a},R.createElement(jF,{"cmdk-overlay":"",className:i}),R.createElement(FF,{"aria-label":t.label,"cmdk-dialog":"",className:s},R.createElement(qF,{ref:e,...o}))))}),f7=R.forwardRef((t,e)=>Ad(n=>n.filtered.count===0)?R.createElement(Gi.div,{ref:e,...t,"cmdk-empty":"",role:"presentation"}):null),h7=R.forwardRef((t,e)=>{let{progress:n,children:r,label:i="Loading...",...s}=t;return R.createElement(Gi.div,{ref:e,...s,"cmdk-loading":"",role:"progressbar","aria-valuenow":n,"aria-valuemin":0,"aria-valuemax":100,"aria-label":i},Z1(t,a=>R.createElement("div",{"aria-hidden":!0},a)))}),sm=Object.assign(qF,{List:u7,Item:a7,Input:c7,Group:o7,Separator:l7,Dialog:d7,Empty:f7,Loading:h7});function p7(t,e){let n=t.nextElementSibling;for(;n;){if(n.matches(e))return n;n=n.nextElementSibling}}function m7(t,e){let n=t.previousElementSibling;for(;n;){if(n.matches(e))return n;n=n.previousElementSibling}}function KF(t){let e=R.useRef(t);return Nh(()=>{e.current=t}),e}var Nh=typeof window>"u"?R.useEffect:R.useLayoutEffect;function Um(t){let e=R.useRef();return e.current===void 0&&(e.current=t()),e}function Ad(t){let e=AC(),n=()=>t(e.snapshot());return R.useSyncExternalStore(e.subscribe,n,n)}function YF(t,e,n,r=[]){let i=R.useRef(),s=Wy();return Nh(()=>{var a;let o=(()=>{var c;for(let d of n){if(typeof d=="string")return d.trim();if(typeof d=="object"&&"current"in d)return d.current?(c=d.current.textContent)==null?void 0:c.trim():i.current}})(),l=r.map(c=>c.trim());s.value(t,o,l),(a=e.current)==null||a.setAttribute(Dm,o),i.current=o}),i}var g7=()=>{let[t,e]=R.useState(),n=Um(()=>new Map);return Nh(()=>{n.current.forEach(r=>r()),n.current=new Map},[t]),(r,i)=>{n.current.set(r,i),e({})}};function v7(t){let e=t.type;return typeof e=="function"?e(t.props):"render"in e?e.render(t.props):t}function Z1({asChild:t,children:e},n){return t&&R.isValidElement(e)?R.cloneElement(v7(e),{ref:e.ref},n(e.props.children)):n(e)}var y7={position:"absolute",width:"1px",height:"1px",padding:"0",margin:"-1px",overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0"};function x7({onNavigate:t}){const[e,n]=R.useState(!1);return R.useEffect(()=>{const r=i=>{(i.metaKey||i.ctrlKey)&&i.key.toLowerCase()==="k"&&(i.preventDefault(),n(s=>!s))};return document.addEventListener("keydown",r),()=>document.removeEventListener("keydown",r)},[]),v.jsx(sm.Dialog,{open:e,onOpenChange:n,label:"Befehlspalette",className:"fixed inset-0 z-50 flex items-start justify-center bg-black/50 p-4 pt-[12vh] overscroll-contain",onClick:()=>n(!1),children:v.jsxs("div",{className:"w-full max-w-lg overflow-hidden rounded-xl border border-border bg-popover text-popover-foreground shadow-2xl",onClick:r=>r.stopPropagation(),children:[v.jsx(sm.Input,{autoFocus:!0,placeholder:"Springe zu… (Modelle, Routing, System …)",className:"w-full border-b border-border bg-transparent px-4 py-3 text-sm outline-none placeholder:text-muted-foreground"}),v.jsxs(sm.List,{className:"max-h-80 overflow-y-auto p-2",children:[v.jsx(sm.Empty,{className:"px-3 py-6 text-center text-sm text-muted-foreground",children:"Nichts gefunden."}),v.jsx(sm.Group,{heading:"Bereiche",className:"px-1 py-1 text-xs text-muted-foreground",children:z0.map(r=>v.jsxs(sm.Item,{value:`${r.label} ${r.hint}`,onSelect:()=>{t(r.id),n(!1)},className:"flex cursor-pointer items-center gap-3 rounded-md px-3 py-2 text-sm text-foreground aria-selected:bg-accent aria-selected:text-accent-foreground",children:[v.jsx(r.icon,{className:"h-4 w-4 text-primary"}),v.jsx("span",{children:r.label}),v.jsx("span",{className:"ml-auto truncate text-xs text-muted-foreground",children:r.hint})]},r.id))})]})]})})}async function It(t,e){var l;const n={"Content-Type":"application/json",...e==null?void 0:e.headers},r=localStorage.getItem("mc_sudo_password"),i=localStorage.getItem("mc_hf_token");r&&(n["X-Sudo-Password"]=r);let s=e==null?void 0:e.body;if((((l=e==null?void 0:e.method)==null?void 0:l.toUpperCase())||"GET")==="POST"){if(typeof s=="string")try{const c=JSON.parse(s);let d=!1;r&&!("sudo_password"in c)&&(c.sudo_password=r,d=!0),i&&!("hf_token"in c)&&(c.hf_token=i,d=!0),d&&(s=JSON.stringify(c))}catch{}else if(!s){const c={};r&&(c.sudo_password=r),i&&(c.hf_token=i),Object.keys(c).length>0&&(s=JSON.stringify(c))}}const o=await fetch(t,{...e,headers:n,body:s});if(!o.ok)throw new Error(`${o.status} ${o.statusText}`);return o.json()}const b7=(t,e,n=!1,r=!0)=>It("/api/groups",{method:"PUT",body:JSON.stringify({group:t,members:e,swap:n,persist:r})}),_7=t=>It("/api/routing/policy",{method:"PUT",body:JSON.stringify(t)}),qn={health:["health"],systemStatus:["system-status"],services:["services"],models:["models"],groups:["groups"],routing:["routing"],routingPolicy:["routing-policy"],voiceMetrics:["voice-metrics"],jobs:["jobs"],tokenStats:["token-stats"],agentStatus:["agent-status"],hermesBrain:["hermes-brain"],updates:["updates"],discover:["discover"],drafts:t=>["drafts",t??""],connect:t=>["connect",t??""],connectHealth:["connect-health"],memory:(t,e)=>["memory",t??"",e??""],memoryGraph:["memory-graph"]},w7=(t=!0)=>bi({queryKey:qn.memoryGraph,queryFn:()=>It("/api/memory/graph"),enabled:t}),S7=()=>bi({queryKey:qn.health,queryFn:()=>It("/api/health"),refetchInterval:1e4}),$y=(t=5e3)=>bi({queryKey:qn.systemStatus,queryFn:()=>It("/api/system/status"),refetchInterval:t}),M7=(t=3e3)=>bi({queryKey:qn.services,queryFn:()=>It("/api/system/services"),refetchInterval:t}),Bg=(t=4e3)=>bi({queryKey:qn.models,queryFn:()=>It("/api/models"),refetchInterval:t}),E7=(t=8e3)=>bi({queryKey:qn.groups,queryFn:()=>It("/api/groups"),refetchInterval:t}),A7=(t=5e3)=>bi({queryKey:qn.voiceMetrics,queryFn:()=>It("/api/voice/metrics"),refetchInterval:t}),T7=()=>bi({queryKey:qn.routingPolicy,queryFn:()=>It("/api/routing/policy")}),P7=(t=2e3)=>bi({queryKey:qn.jobs,queryFn:()=>It("/api/jobs"),refetchInterval:t,select:e=>e.jobs??[]}),TC=(t=3e3)=>bi({queryKey:qn.tokenStats,queryFn:()=>It("/api/system/token-stats"),refetchInterval:t}),PC=(t=5e3)=>bi({queryKey:qn.agentStatus,queryFn:()=>It("/api/agent/status"),refetchInterval:t}),C7=(t=6e4)=>bi({queryKey:qn.hermesBrain,queryFn:()=>It("/api/agent/brain"),refetchInterval:t}),CC=t=>bi({queryKey:qn.updates,queryFn:()=>It("/api/maintenance/updates"),refetchInterval:t}),R7=()=>bi({queryKey:qn.discover,queryFn:()=>It("/api/discover")}),N7=t=>bi({queryKey:qn.drafts(t),queryFn:()=>It(`/api/models/drafts?target=${encodeURIComponent(t??"")}`),enabled:!!t}),I7=t=>bi({queryKey:qn.connect(t),queryFn:()=>It(t?`/api/connect?${t}`:"/api/connect")}),k7=()=>bi({queryKey:qn.connectHealth,queryFn:()=>It("/api/connect/health"),refetchInterval:15e3}),BT=t=>bi({queryKey:qn.memory(t==null?void 0:t.q,t==null?void 0:t.category),queryFn:()=>{const e=new URLSearchParams;return t!=null&&t.q&&e.set("q",t.q),t!=null&&t.category&&e.set("category",t.category),It(`/api/memory?${e}`)},select:e=>t!=null&&t.limit?e.slice(0,t.limit):e});let HT=[],VT=[];const GT=new Set,ZF=()=>GT.forEach(t=>t());function QF(t){return GT.add(t),()=>{GT.delete(t)}}function O7(t){HT=[...HT,t].slice(-40),ZF()}function L7(t){VT=[...VT,t].slice(-40),ZF()}const D7=()=>R.useSyncExternalStore(QF,()=>HT),U7=()=>R.useSyncExternalStore(QF,()=>VT);function j7(){const{data:t,dataUpdatedAt:e}=$y(3e3),{data:n,dataUpdatedAt:r}=TC(3e3),i=R.useRef(null);R.useEffect(()=>{var s,a,o,l;t&&O7({t:Date.now(),cpu:((s=t.cpu)==null?void 0:s.percent)??0,ram:((a=t.ram)==null?void 0:a.percent)??0,gpu:((o=t.gpu)==null?void 0:o.busy_percent)??null,disk:((l=t.disk)==null?void 0:l.percent)??null})},[e]),R.useEffect(()=>{if(!n)return;const s=Date.now(),a=n.prompt_tokens,o=n.completion_tokens;if(i.current){const l=Math.max((s-i.current.t)/1e3,.001);L7({t:s,prompt:Math.max(0,(a-i.current.p)/l),completion:Math.max(0,(o-i.current.c)/l)})}i.current={p:a,c:o,t:s}},[r])}function F7(){const{data:t,error:e}=$y(3e3),n=D7();return{sys:t,hist:n,error:e}}function sd(t){return(t/1024**3).toFixed(1)}function WT(t){return t?t>1024**3?`${(t/1024**3).toFixed(1)} GB`:`${(t/1024**2).toFixed(0)} MB`:""}function Io(t){if(!t)return"—";const e=t/1024**3;return e>=1?`${e.toFixed(1)} GB`:`${(t/1024**2).toFixed(0)} MB`}function z7(t){if(!t)return"";const e=Math.floor(t/60);return e>0?`${e} min`:`${t} s`}function PI(t){return t?`${Math.round(t/1024)}k`:"—"}function JF(t){var e,n,r="";if(typeof t=="string"||typeof t=="number")r+=t;else if(typeof t=="object")if(Array.isArray(t)){var i=t.length;for(e=0;e{var n=t.children,r=t.width,i=t.height,s=t.viewBox,a=t.className,o=t.style,l=t.title,c=t.desc,d=$7(t,W7),f=s||{width:r,height:i,x:0,y:0},p=tr("recharts-surface",a);return R.createElement("svg",$T({},Xa(d),{className:p,width:r,height:i,style:o,viewBox:"".concat(f.x," ").concat(f.y," ").concat(f.width," ").concat(f.height),ref:e}),R.createElement("title",null,l),R.createElement("desc",null,c),n)}),q7=["children","className"];function XT(){return XT=Object.assign?Object.assign.bind():function(t){for(var e=1;e{var n=t.children,r=t.className,i=K7(t,q7),s=tr("recharts-layer",r);return R.createElement("g",XT({className:s},Xa(i),{ref:e}),n)}),Z7=R.createContext(null);function Er(t){return function(){return t}}const qT=Math.PI,KT=2*qT,$f=1e-6,Q7=KT-$f;function r5(t){this._+=t[0];for(let e=1,n=t.length;e=0))throw new Error(`invalid digits: ${t}`);if(e>15)return r5;const n=10**e;return function(r){this._+=r[0];for(let i=1,s=r.length;i$f)if(!(Math.abs(f*l-c*d)>$f)||!s)this._append`L${this._x1=e},${this._y1=n}`;else{let y=r-a,b=i-o,S=l*l+c*c,w=y*y+b*b,x=Math.sqrt(S),M=Math.sqrt(p),T=s*Math.tan((qT-Math.acos((S+p-w)/(2*x*M)))/2),P=T/M,O=T/x;Math.abs(P-1)>$f&&this._append`L${e+P*d},${n+P*f}`,this._append`A${s},${s},0,0,${+(f*y>d*b)},${this._x1=e+O*l},${this._y1=n+O*c}`}}arc(e,n,r,i,s,a){if(e=+e,n=+n,r=+r,a=!!a,r<0)throw new Error(`negative radius: ${r}`);let o=r*Math.cos(i),l=r*Math.sin(i),c=e+o,d=n+l,f=1^a,p=a?i-s:s-i;this._x1===null?this._append`M${c},${d}`:(Math.abs(this._x1-c)>$f||Math.abs(this._y1-d)>$f)&&this._append`L${c},${d}`,r&&(p<0&&(p=p%KT+KT),p>Q7?this._append`A${r},${r},0,1,${f},${e-o},${n-l}A${r},${r},0,1,${f},${this._x1=c},${this._y1=d}`:p>$f&&this._append`A${r},${r},0,${+(p>=qT)},${f},${this._x1=e+r*Math.cos(s)},${this._y1=n+r*Math.sin(s)}`)}rect(e,n,r,i){this._append`M${this._x0=this._x1=+e},${this._y0=this._y1=+n}h${r=+r}v${+i}h${-r}Z`}toString(){return this._}};function i5(t){let e=3;return t.digits=function(n){if(!arguments.length)return e;if(n==null)e=null;else{const r=Math.floor(n);if(!(r>=0))throw new RangeError(`invalid digits: ${n}`);e=r}return t},()=>new eX(e)}function NC(t){return typeof t=="object"&&"length"in t?t:Array.from(t)}function s5(t){this._context=t}s5.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:this._context.lineTo(t,e);break}}};function J1(t){return new s5(t)}function a5(t){return t[0]}function o5(t){return t[1]}function l5(t,e){var n=Er(!0),r=null,i=J1,s=null,a=i5(o);t=typeof t=="function"?t:t===void 0?a5:Er(t),e=typeof e=="function"?e:e===void 0?o5:Er(e);function o(l){var c,d=(l=NC(l)).length,f,p=!1,y;for(r==null&&(s=i(y=a())),c=0;c<=d;++c)!(c=y;--b)o.point(T[b],P[b]);o.lineEnd(),o.areaEnd()}x&&(T[p]=+t(w,p,f),P[p]=+e(w,p,f),o.point(r?+r(w,p,f):T[p],n?+n(w,p,f):P[p]))}if(M)return o=null,M+""||null}function d(){return l5().defined(i).curve(a).context(s)}return c.x=function(f){return arguments.length?(t=typeof f=="function"?f:Er(+f),r=null,c):t},c.x0=function(f){return arguments.length?(t=typeof f=="function"?f:Er(+f),c):t},c.x1=function(f){return arguments.length?(r=f==null?null:typeof f=="function"?f:Er(+f),c):r},c.y=function(f){return arguments.length?(e=typeof f=="function"?f:Er(+f),n=null,c):e},c.y0=function(f){return arguments.length?(e=typeof f=="function"?f:Er(+f),c):e},c.y1=function(f){return arguments.length?(n=f==null?null:typeof f=="function"?f:Er(+f),c):n},c.lineX0=c.lineY0=function(){return d().x(t).y(e)},c.lineY1=function(){return d().x(t).y(n)},c.lineX1=function(){return d().x(r).y(e)},c.defined=function(f){return arguments.length?(i=typeof f=="function"?f:Er(!!f),c):i},c.curve=function(f){return arguments.length?(a=f,s!=null&&(o=a(s)),c):a},c.context=function(f){return arguments.length?(f==null?s=o=null:o=a(s=f),c):s},c}class c5{constructor(e,n){this._context=e,this._x=n}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line}point(e,n){switch(e=+e,n=+n,this._point){case 0:{this._point=1,this._line?this._context.lineTo(e,n):this._context.moveTo(e,n);break}case 1:this._point=2;default:{this._x?this._context.bezierCurveTo(this._x0=(this._x0+e)/2,this._y0,this._x0,n,e,n):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+n)/2,e,this._y0,e,n);break}}this._x0=e,this._y0=n}}function tX(t){return new c5(t,!0)}function nX(t){return new c5(t,!1)}function sw(){}function aw(t,e,n){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+e)/6,(t._y0+4*t._y1+n)/6)}function u5(t){this._context=t}u5.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:aw(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:aw(this,t,e);break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}};function rX(t){return new u5(t)}function d5(t){this._context=t}d5.prototype={areaStart:sw,areaEnd:sw,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:{this._context.moveTo(this._x2,this._y2),this._context.closePath();break}case 2:{this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break}case 3:{this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4);break}}},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x2=t,this._y2=e;break;case 1:this._point=2,this._x3=t,this._y3=e;break;case 2:this._point=3,this._x4=t,this._y4=e,this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+e)/6);break;default:aw(this,t,e);break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}};function iX(t){return new d5(t)}function f5(t){this._context=t}f5.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var n=(this._x0+4*this._x1+t)/6,r=(this._y0+4*this._y1+e)/6;this._line?this._context.lineTo(n,r):this._context.moveTo(n,r);break;case 3:this._point=4;default:aw(this,t,e);break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}};function sX(t){return new f5(t)}function h5(t){this._context=t}h5.prototype={areaStart:sw,areaEnd:sw,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(t,e){t=+t,e=+e,this._point?this._context.lineTo(t,e):(this._point=1,this._context.moveTo(t,e))}};function aX(t){return new h5(t)}function CI(t){return t<0?-1:1}function RI(t,e,n){var r=t._x1-t._x0,i=e-t._x1,s=(t._y1-t._y0)/(r||i<0&&-0),a=(n-t._y1)/(i||r<0&&-0),o=(s*i+a*r)/(r+i);return(CI(s)+CI(a))*Math.min(Math.abs(s),Math.abs(a),.5*Math.abs(o))||0}function NI(t,e){var n=t._x1-t._x0;return n?(3*(t._y1-t._y0)/n-e)/2:e}function hE(t,e,n){var r=t._x0,i=t._y0,s=t._x1,a=t._y1,o=(s-r)/3;t._context.bezierCurveTo(r+o,i+o*e,s-o,a-o*n,s,a)}function ow(t){this._context=t}ow.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:hE(this,this._t0,NI(this,this._t0));break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){var n=NaN;if(t=+t,e=+e,!(t===this._x1&&e===this._y1)){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,hE(this,NI(this,n=RI(this,t,e)),n);break;default:hE(this,this._t0,n=RI(this,t,e));break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e,this._t0=n}}};function p5(t){this._context=new m5(t)}(p5.prototype=Object.create(ow.prototype)).point=function(t,e){ow.prototype.point.call(this,e,t)};function m5(t){this._context=t}m5.prototype={moveTo:function(t,e){this._context.moveTo(e,t)},closePath:function(){this._context.closePath()},lineTo:function(t,e){this._context.lineTo(e,t)},bezierCurveTo:function(t,e,n,r,i,s){this._context.bezierCurveTo(e,t,r,n,s,i)}};function oX(t){return new ow(t)}function lX(t){return new p5(t)}function g5(t){this._context=t}g5.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=[],this._y=[]},lineEnd:function(){var t=this._x,e=this._y,n=t.length;if(n)if(this._line?this._context.lineTo(t[0],e[0]):this._context.moveTo(t[0],e[0]),n===2)this._context.lineTo(t[1],e[1]);else for(var r=II(t),i=II(e),s=0,a=1;a=0;--e)i[e]=(a[e]-i[e+1])/s[e];for(s[n-1]=(t[n]+i[n-1])/2,e=0;e=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:{if(this._t<=0)this._context.lineTo(this._x,e),this._context.lineTo(t,e);else{var n=this._x*(1-this._t)+t*this._t;this._context.lineTo(n,this._y),this._context.lineTo(n,e)}break}}this._x=t,this._y=e}};function uX(t){return new eS(t,.5)}function dX(t){return new eS(t,0)}function fX(t){return new eS(t,1)}function Ih(t,e){if((a=t.length)>1)for(var n=1,r,i,s=t[e[0]],a,o=s.length;n=0;)n[e]=e;return n}function hX(t,e){return t[e]}function pX(t){const e=[];return e.key=t,e}function mX(){var t=Er([]),e=YT,n=Ih,r=hX;function i(s){var a=Array.from(t.apply(this,arguments),pX),o,l=a.length,c=-1,d;for(const f of s)for(o=0,++c;o0){for(var n,r,i=0,s=t[0].length,a;i0){for(var n=0,r=t[e[0]],i,s=r.length;n0)||!((s=(i=t[e[0]]).length)>0))){for(var n=0,r=1,i,s,a;r1&&arguments[1]!==void 0?arguments[1]:bX,n=10**e,r=Math.round(t*n)/n;return Object.is(r,-0)?0:r}function Ui(t){for(var e=arguments.length,n=new Array(e>1?e-1:0),r=1;r{var o=n[a-1];return typeof o=="string"?i+o+s:o!==void 0?i+yd(o)+s:i+s},"")}var Va=t=>t===0?0:t>0?1:-1,Rl=t=>typeof t=="number"&&t!=+t,kh=t=>typeof t=="string"&&t.length>1&&t.indexOf("%")===t.length-1,kt=t=>(typeof t=="number"||t instanceof Number)&&!Rl(t),Nl=t=>kt(t)||typeof t=="string",_X=0,uy=t=>{var e=++_X;return"".concat(t||"").concat(e)},Td=function(e,n){var r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1;if(!kt(e)&&typeof e!="string")return r;var s;if(kh(e)){if(n==null)return r;var a=e.indexOf("%");s=n*parseFloat(e.slice(0,a))/100}else s=+e;return Rl(s)&&(s=r),i&&n!=null&&s>n&&(s=n),s},x5=t=>{if(!Array.isArray(t))return!1;for(var e=t.length,n={},r=0;rr&&(typeof e=="function"?e(r):Yh(r,e))===n)}var Vi=t=>t===null||typeof t>"u",OC=t=>Vi(t)?t:"".concat(t.charAt(0).toUpperCase()).concat(t.slice(1));function Ys(t){return t!=null}function Hg(){}var _5=t=>"radius"in t&&"startAngle"in t&&"endAngle"in t,LC=(t,e)=>{if(!t||typeof t=="function"||typeof t=="boolean")return null;var n=t;if(R.isValidElement(t)&&(n=t.props),typeof n!="object"&&typeof n!="function")return null;var r={};return Object.keys(n).forEach(i=>{RC(i)&&typeof n[i]=="function"&&(r[i]=(s=>n[i](n,s)))}),r},wX=(t,e,n)=>r=>(t(e,n,r),null),SX=(t,e,n)=>{if(t===null||typeof t!="object"&&typeof t!="function")return null;var r=null;return Object.keys(t).forEach(i=>{var s=t[i];RC(i)&&typeof s=="function"&&(r||(r={}),r[i]=wX(s,e,n))}),r};function kI(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(t,i).enumerable})),n.push.apply(n,r)}return n}function MX(t){for(var e=1;e(a[o]===void 0&&r[o]!==void 0&&(a[o]=r[o]),a),n);return s}function PX(t,e){const n=new Map;for(let r=0;rObject.prototype.propertyIsEnumerable.call(t,e))}function DC(t){return t==null?t===void 0?"[object Undefined]":"[object Null]":Object.prototype.toString.call(t)}const kX="[object RegExp]",S5="[object String]",M5="[object Number]",E5="[object Boolean]",A5="[object Arguments]",OX="[object Symbol]",LX="[object Date]",DX="[object Map]",UX="[object Set]",jX="[object Array]",FX="[object ArrayBuffer]",zX="[object Object]",BX="[object DataView]",HX="[object Uint8Array]",VX="[object Uint8ClampedArray]",GX="[object Uint16Array]",WX="[object Uint32Array]",$X="[object Int8Array]",XX="[object Int16Array]",qX="[object Int32Array]",KX="[object Float32Array]",YX="[object Float64Array]",OI=typeof globalThis=="object"&&globalThis||typeof window=="object"&&window||typeof self=="object"&&self||typeof global=="object"&&global||(function(){return this})();function ZX(t){return typeof OI.Buffer<"u"&&OI.Buffer.isBuffer(t)}function QX(t,e){return nh(t,void 0,t,new Map,e)}function nh(t,e,n,r=new Map,i=void 0){const s=i==null?void 0:i(t,e,n,r);if(s!==void 0)return s;if(QT(t))return t;if(r.has(t))return r.get(t);if(Array.isArray(t)){const a=new Array(t.length);r.set(t,a);for(let o=0;o{}):JT(t,e,function r(i,s,a,o,l,c){const d=n(i,s,a,o,l,c);return d!==void 0?!!d:JT(i,s,r,c,!1)},new Map,!0)}function JT(t,e,n,r,i=!1){if(e===t)return!0;switch(typeof e){case"object":return tq(t,e,n,r);case"function":return Object.keys(e).length>0?JT(t,{...e},n,r,i):z_(t,e);default:return T5(t)&&i?typeof e=="string"?e==="":!0:z_(t,e)}}function tq(t,e,n,r){if(e==null)return!0;if(Array.isArray(e))return C5(t,e,n,r);if(e instanceof Map)return nq(t,e,n,r);if(e instanceof Set)return rq(t,e,n,r);const i=Object.keys(e);if(t==null||QT(t))return i.length===0;if(i.length===0)return!0;if(r!=null&&r.has(e))return r.get(e)===t;r==null||r.set(e,t);try{for(let s=0;s{})}function iq(t){return t=eq(t),e=>R5(e,t)}function sq(t,e){return QX(t,(n,r,i,s)=>{if(typeof t=="object"){if(DC(t)==="[object Object]"&&typeof t.constructor!="function"){const a={};return s.set(t,a),ko(a,t,i,s),a}switch(Object.prototype.toString.call(t)){case M5:case S5:case E5:{const a=new t.constructor(t==null?void 0:t.valueOf());return ko(a,t),a}case A5:{const a={};return ko(a,t),a.length=t.length,a[Symbol.iterator]=t[Symbol.iterator],a}default:return}}})}function aq(t){return sq(t)}const oq=/^(?:0|[1-9]\d*)$/;function N5(t,e=Number.MAX_SAFE_INTEGER){switch(typeof t){case"number":return Number.isInteger(t)&&t>=0&&t=0}function I5(t){return t!=null&&typeof t!="function"&&fq(t.length)}function hq(t){return typeof t=="object"&&t!==null}function pq(t){return hq(t)&&I5(t)}function LI(t,e=w5){return pq(t)?PX(Array.from(t),CX(dq(e),1)):[]}function mq(t,e,n){return e===!0?LI(t,n):typeof e=="function"?LI(t,e):t}var pE={exports:{}},mE={},gE={exports:{}},vE={};/** - * @license React - * use-sync-external-store-shim.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var DI;function gq(){if(DI)return vE;DI=1;var t=qh();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,r=t.useState,i=t.useEffect,s=t.useLayoutEffect,a=t.useDebugValue;function o(f,p){var y=p(),b=r({inst:{value:y,getSnapshot:p}}),S=b[0].inst,w=b[1];return s(function(){S.value=y,S.getSnapshot=p,l(S)&&w({inst:S})},[f,y,p]),i(function(){return l(S)&&w({inst:S}),f(function(){l(S)&&w({inst:S})})},[f]),a(y),y}function l(f){var p=f.getSnapshot;f=f.value;try{var y=p();return!n(f,y)}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 vE.useSyncExternalStore=t.useSyncExternalStore!==void 0?t.useSyncExternalStore:d,vE}var UI;function vq(){return UI||(UI=1,gE.exports=gq()),gE.exports}/** - * @license React - * use-sync-external-store-shim/with-selector.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var jI;function yq(){if(jI)return mE;jI=1;var t=qh(),e=vq();function n(c,d){return c===d&&(c!==0||1/c===1/d)||c!==c&&d!==d}var r=typeof Object.is=="function"?Object.is:n,i=e.useSyncExternalStore,s=t.useRef,a=t.useEffect,o=t.useMemo,l=t.useDebugValue;return mE.useSyncExternalStoreWithSelector=function(c,d,f,p,y){var b=s(null);if(b.current===null){var S={hasValue:!1,value:null};b.current=S}else S=b.current;b=o(function(){function x(N){if(!M){if(M=!0,T=N,N=p(N),y!==void 0&&S.hasValue){var D=S.value;if(y(D,N))return P=D}return P=N}if(D=P,r(T,N))return D;var z=p(N);return y!==void 0&&y(D,z)?(T=N,D):(T=N,P=z)}var M=!1,T,P,O=f===void 0?null:f;return[function(){return x(d())},O===null?void 0:function(){return x(O())}]},[d,f,p,y]);var w=i(c,b[0],b[1]);return a(function(){S.hasValue=!0,S.value=w},[w]),l(w),w},mE}var FI;function xq(){return FI||(FI=1,pE.exports=yq()),pE.exports}var bq=xq(),UC=R.createContext(null),_q=t=>t,Wr=()=>{var t=R.useContext(UC);return t?t.store.dispatch:_q},B_=()=>{},wq=()=>B_,Sq=(t,e)=>t===e;function Ft(t){var e=R.useContext(UC),n=R.useMemo(()=>e?r=>{if(r!=null)return t(r)}:B_,[e,t]);return bq.useSyncExternalStoreWithSelector(e?e.subscription.addNestedSub:wq,e?e.store.getState:B_,e?e.store.getState:B_,n,Sq)}function Mq(t,e=`expected a function, instead received ${typeof t}`){if(typeof t!="function")throw new TypeError(e)}function Eq(t,e="expected all items to be functions, instead received the following types: "){if(!t.every(n=>typeof n=="function")){const n=t.map(r=>typeof r=="function"?`function ${r.name||"unnamed"}()`:typeof r).join(", ");throw new TypeError(`${e}[${n}]`)}}var zI=t=>Array.isArray(t)?t:[t];function Aq(t){const e=Array.isArray(t[0])?t[0]:t;return Eq(e,"createSelector expects all input-selectors to be functions, but received the following types: "),e}function Tq(t,e){const n=[],{length:r}=t;for(let i=0;itypeof WeakRef>"u"?Pq:WeakRef,k5=Cq(),Rq=0,BI=1;function Sb(){return{s:Rq,v:void 0,o:null,p:null}}function Nq(t){return t instanceof k5?t.deref():t}function O5(t,e={}){let n=Sb();const{resultEqualityCheck:r}=e;let i,s=0;function a(){let o=n;const{length:l}=arguments;for(let f=0,p=l;f{n=Sb(),a.resetResultsCount()},a.resultsCount=()=>s,a.resetResultsCount=()=>{s=0},a}function Iq(t,...e){const n=typeof t=="function"?{memoize:t,memoizeOptions:e}:t,r=(...i)=>{let s=0,a=0,o,l={},c=i.pop();typeof c=="object"&&(l=c,c=i.pop()),Mq(c,`createSelector expects an output function after the inputs, but received: [${typeof c}]`);const d={...n,...l},{memoize:f,memoizeOptions:p=[],argsMemoize:y=O5,argsMemoizeOptions:b=[]}=d,S=zI(p),w=zI(b),x=Aq(i),M=f(function(){return s++,c.apply(null,arguments)},...S),T=y(function(){a++;const O=Tq(x,arguments);return o=M.apply(null,O),o},...w);return Object.assign(T,{resultFunc:c,memoizedResultFunc:M,dependencies:x,dependencyRecomputations:()=>a,resetDependencyRecomputations:()=>{a=0},lastResult:()=>o,recomputations:()=>s,resetRecomputations:()=>{s=0},memoize:f,argsMemoize:y})};return Object.assign(r,{withTypes:()=>r}),r}var ke=Iq(O5);function kq(t,e=1){const n=[],r=Math.floor(e),i=(s,a)=>{for(let o=0;o{if(t!==e){const r=HI(t),i=HI(e);if(r===i&&r===0){if(te)return n==="desc"?-1:1}return n==="desc"?i-r:r-i}return 0};function L5(t){return typeof t=="symbol"||t instanceof Symbol}const Lq=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Dq=/^\w*$/;function Uq(t,e){return Array.isArray(t)?!1:typeof t=="number"||typeof t=="boolean"||t==null||L5(t)?!0:typeof t=="string"&&(Dq.test(t)||!Lq.test(t))||e!=null}function jq(t,e,n,r){if(t==null)return[];n=n,Array.isArray(t)||(t=Object.values(t)),Array.isArray(e)||(e=e==null?[null]:[e]),e.length===0&&(e=[null]),Array.isArray(n)||(n=n==null?[]:[n]),n=n.map(o=>String(o));const i=(o,l)=>{let c=o;for(let d=0;dl==null||o==null?l:typeof o=="object"&&"key"in o?Object.hasOwn(l,o.key)?l[o.key]:i(l,o.path):typeof o=="function"?o(l):Array.isArray(o)?i(l,o):typeof l=="object"?l[o]:l,a=e.map(o=>(Array.isArray(o)&&o.length===1&&(o=o[0]),o==null||typeof o=="function"||Array.isArray(o)||Uq(o)?o:{key:o,path:kC(o)}));return t.map(o=>({original:o,criteria:a.map(l=>s(l,o))})).slice().sort((o,l)=>{for(let c=0;co.original)}function tS(t,...e){const n=e.length;return n>1&&eP(t,e[0],e[1])?e=[]:n>2&&eP(e[0],e[1],e[2])&&(e=[e[0]]),jq(t,kq(e),["asc"])}var D5=t=>t.legend.settings,Fq=t=>t.legend.size,zq=t=>t.legend.payload;ke([zq,D5],(t,e)=>{var n=e.itemSorter,r=t.flat(1);return n?tS(r,n):r});function Bq(t,e){return Wq(t)||Gq(t,e)||Vq(t,e)||Hq()}function Hq(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function Vq(t,e){if(t){if(typeof t=="string")return VI(t,e);var n={}.toString.call(t).slice(8,-1);return n==="Object"&&t.constructor&&(n=t.constructor.name),n==="Map"||n==="Set"?Array.from(t):n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?VI(t,e):void 0}}function VI(t,e){(e==null||e>t.length)&&(e=t.length);for(var n=0,r=Array(e);nMb||Math.abs(t.left-e.left)>Mb||Math.abs(t.top-e.top)>Mb||Math.abs(t.width-e.width)>Mb}function WI(t){var e=t.getBoundingClientRect();return{height:e.height,left:e.left,top:e.top,width:e.width}}function $q(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],e=R.useState({height:0,left:0,top:0,width:0}),n=Bq(e,2),r=n[0],i=n[1],s=R.useRef(null),a=R.useRef(r);a.current=r;var o=R.useCallback(l=>{if(s.current!=null&&(s.current.disconnect(),s.current=null),l!=null){var c=WI(l);if(GI(c,a.current)&&i(c),typeof ResizeObserver<"u"){var d=new ResizeObserver(()=>{var f=WI(l);GI(f,a.current)&&i(f)});d.observe(l),s.current=d}}},[...t]);return R.useEffect(()=>()=>{var l;(l=s.current)===null||l===void 0||l.disconnect()},[]),[r,o]}function Di(t){return`Minified Redux error #${t}; visit https://redux.js.org/Errors?code=${t} for the full message or use the non-minified dev environment for full errors. `}var Xq=typeof Symbol=="function"&&Symbol.observable||"@@observable",$I=Xq,yE=()=>Math.random().toString(36).substring(7).split("").join("."),qq={INIT:`@@redux/INIT${yE()}`,REPLACE:`@@redux/REPLACE${yE()}`,PROBE_UNKNOWN_ACTION:()=>`@@redux/PROBE_UNKNOWN_ACTION${yE()}`},lw=qq;function jC(t){if(typeof t!="object"||t===null)return!1;let e=t;for(;Object.getPrototypeOf(e)!==null;)e=Object.getPrototypeOf(e);return Object.getPrototypeOf(t)===e||Object.getPrototypeOf(t)===null}function U5(t,e,n){if(typeof t!="function")throw new Error(Di(2));if(typeof e=="function"&&typeof n=="function"||typeof n=="function"&&typeof arguments[3]=="function")throw new Error(Di(0));if(typeof e=="function"&&typeof n>"u"&&(n=e,e=void 0),typeof n<"u"){if(typeof n!="function")throw new Error(Di(1));return n(U5)(t,e)}let r=t,i=e,s=new Map,a=s,o=0,l=!1;function c(){a===s&&(a=new Map,s.forEach((w,x)=>{a.set(x,w)}))}function d(){if(l)throw new Error(Di(3));return i}function f(w){if(typeof w!="function")throw new Error(Di(4));if(l)throw new Error(Di(5));let x=!0;c();const M=o++;return a.set(M,w),function(){if(x){if(l)throw new Error(Di(6));x=!1,c(),a.delete(M),s=null}}}function p(w){if(!jC(w))throw new Error(Di(7));if(typeof w.type>"u")throw new Error(Di(8));if(typeof w.type!="string")throw new Error(Di(17));if(l)throw new Error(Di(9));try{l=!0,i=r(i,w)}finally{l=!1}return(s=a).forEach(M=>{M()}),w}function y(w){if(typeof w!="function")throw new Error(Di(10));r=w,p({type:lw.REPLACE})}function b(){const w=f;return{subscribe(x){if(typeof x!="object"||x===null)throw new Error(Di(11));function M(){const P=x;P.next&&P.next(d())}return M(),{unsubscribe:w(M)}},[$I](){return this}}}return p({type:lw.INIT}),{dispatch:p,subscribe:f,getState:d,replaceReducer:y,[$I]:b}}function Kq(t){Object.keys(t).forEach(e=>{const n=t[e];if(typeof n(void 0,{type:lw.INIT})>"u")throw new Error(Di(12));if(typeof n(void 0,{type:lw.PROBE_UNKNOWN_ACTION()})>"u")throw new Error(Di(13))})}function j5(t){const e=Object.keys(t),n={};for(let s=0;s"u")throw o&&o.type,new Error(Di(14));c[f]=b,l=l||b!==y}return l=l||r.length!==Object.keys(a).length,l?c:a}}function cw(...t){return t.length===0?e=>e:t.length===1?t[0]:t.reduce((e,n)=>(...r)=>e(n(...r)))}function Yq(...t){return e=>(n,r)=>{const i=e(n,r);let s=()=>{throw new Error(Di(15))};const a={getState:i.getState,dispatch:(l,...c)=>s(l,...c)},o=t.map(l=>l(a));return s=cw(...o)(i.dispatch),{...i,dispatch:s}}}function F5(t){return jC(t)&&"type"in t&&typeof t.type=="string"}var z5=Symbol.for("immer-nothing"),XI=Symbol.for("immer-draftable"),Ps=Symbol.for("immer-state");function Uo(t,...e){throw new Error(`[Immer] minified error nr: ${t}. Full error at: https://bit.ly/3cXEKWf`)}var xa=Object,Sg=xa.getPrototypeOf,uw="constructor",nS="prototype",tP="configurable",dw="enumerable",H_="writable",dy="value",Xc=t=>!!t&&!!t[Ps];function Bo(t){var e;return t?B5(t)||iS(t)||!!t[XI]||!!((e=t[uw])!=null&&e[XI])||sS(t)||aS(t):!1}var Zq=xa[nS][uw].toString(),qI=new WeakMap;function B5(t){if(!t||!FC(t))return!1;const e=Sg(t);if(e===null||e===xa[nS])return!0;const n=xa.hasOwnProperty.call(e,uw)&&e[uw];if(n===Object)return!0;if(!jm(n))return!1;let r=qI.get(n);return r===void 0&&(r=Function.toString.call(n),qI.set(n,r)),r===Zq}function rS(t,e,n=!0){Xy(t)===0?(n?Reflect.ownKeys(t):xa.keys(t)).forEach(i=>{e(i,t[i],t)}):t.forEach((r,i)=>e(i,r,t))}function Xy(t){const e=t[Ps];return e?e.type_:iS(t)?1:sS(t)?2:aS(t)?3:0}var KI=(t,e,n=Xy(t))=>n===2?t.has(e):xa[nS].hasOwnProperty.call(t,e),nP=(t,e,n=Xy(t))=>n===2?t.get(e):t[e],fw=(t,e,n,r=Xy(t))=>{r===2?t.set(e,n):r===3?t.add(n):t[e]=n};function Qq(t,e){return t===e?t!==0||1/t===1/e:t!==t&&e!==e}var iS=Array.isArray,sS=t=>t instanceof Map,aS=t=>t instanceof Set,FC=t=>typeof t=="object",jm=t=>typeof t=="function",xE=t=>typeof t=="boolean";function Jq(t){const e=+t;return Number.isInteger(e)&&String(e)===t}var Cc=t=>t.copy_||t.base_,zC=t=>t.modified_?t.copy_:t.base_;function rP(t,e){if(sS(t))return new Map(t);if(aS(t))return new Set(t);if(iS(t))return Array[nS].slice.call(t);const n=B5(t);if(e===!0||e==="class_only"&&!n){const r=xa.getOwnPropertyDescriptors(t);delete r[Ps];let i=Reflect.ownKeys(r);for(let s=0;s1&&xa.defineProperties(t,{set:Eb,add:Eb,clear:Eb,delete:Eb}),xa.freeze(t),e&&rS(t,(n,r)=>{BC(r,!0)},!1)),t}function eK(){Uo(2)}var Eb={[dy]:eK};function oS(t){return t===null||!FC(t)?!0:xa.isFrozen(t)}var hw="MapSet",iP="Patches",YI="ArrayMethods",H5={};function Oh(t){const e=H5[t];return e||Uo(0,t),e}var ZI=t=>!!H5[t],fy,V5=()=>fy,tK=(t,e)=>({drafts_:[],parent_:t,immer_:e,canAutoFreeze_:!0,unfinalizedDrafts_:0,handledSet_:new Set,processedForPatches_:new Set,mapSetPlugin_:ZI(hw)?Oh(hw):void 0,arrayMethodsPlugin_:ZI(YI)?Oh(YI):void 0});function QI(t,e){e&&(t.patchPlugin_=Oh(iP),t.patches_=[],t.inversePatches_=[],t.patchListener_=e)}function sP(t){aP(t),t.drafts_.forEach(nK),t.drafts_=null}function aP(t){t===fy&&(fy=t.parent_)}var JI=t=>fy=tK(fy,t);function nK(t){const e=t[Ps];e.type_===0||e.type_===1?e.revoke_():e.revoked_=!0}function ek(t,e){e.unfinalizedDrafts_=e.drafts_.length;const n=e.drafts_[0];if(t!==void 0&&t!==n){n[Ps].modified_&&(sP(e),Uo(4)),Bo(t)&&(t=tk(e,t));const{patchPlugin_:i}=e;i&&i.generateReplacementPatches_(n[Ps].base_,t,e)}else t=tk(e,n);return rK(e,t,!0),sP(e),e.patches_&&e.patchListener_(e.patches_,e.inversePatches_),t!==z5?t:void 0}function tk(t,e){if(oS(e))return e;const n=e[Ps];if(!n)return pw(e,t.handledSet_,t);if(!lS(n,t))return e;if(!n.modified_)return n.base_;if(!n.finalized_){const{callbacks_:r}=n;if(r)for(;r.length>0;)r.pop()(t);$5(n,t)}return n.copy_}function rK(t,e,n=!1){!t.parent_&&t.immer_.autoFreeze_&&t.canAutoFreeze_&&BC(e,n)}function G5(t){t.finalized_=!0,t.scope_.unfinalizedDrafts_--}var lS=(t,e)=>t.scope_===e,iK=[];function W5(t,e,n,r){const i=Cc(t),s=t.type_;if(r!==void 0&&nP(i,r,s)===e){fw(i,r,n,s);return}if(!t.draftLocations_){const o=t.draftLocations_=new Map;rS(i,(l,c)=>{if(Xc(c)){const d=o.get(c)||[];d.push(l),o.set(c,d)}})}const a=t.draftLocations_.get(e)??iK;for(const o of a)fw(i,o,n,s)}function sK(t,e,n){t.callbacks_.push(function(i){var o;const s=e;if(!s||!lS(s,i))return;(o=i.mapSetPlugin_)==null||o.fixSetContents(s);const a=zC(s);W5(t,s.draft_??s,a,n),$5(s,i)})}function $5(t,e){var r;if(t.modified_&&!t.finalized_&&(t.type_===3||t.type_===1&&t.allIndicesReassigned_||(((r=t.assigned_)==null?void 0:r.size)??0)>0)){const{patchPlugin_:i}=e;if(i){const s=i.getPath(t);s&&i.generatePatches_(t,s,e)}G5(t)}}function aK(t,e,n){const{scope_:r}=t;if(Xc(n)){const i=n[Ps];lS(i,r)&&i.callbacks_.push(function(){V_(t);const a=zC(i);W5(t,n,a,e)})}else Bo(n)&&t.callbacks_.push(function(){const s=Cc(t);t.type_===3?s.has(n)&&pw(n,r.handledSet_,r):nP(s,e,t.type_)===n&&r.drafts_.length>1&&(t.assigned_.get(e)??!1)===!0&&t.copy_&&pw(nP(t.copy_,e,t.type_),r.handledSet_,r)})}function pw(t,e,n){return!n.immer_.autoFreeze_&&n.unfinalizedDrafts_<1||Xc(t)||e.has(t)||!Bo(t)||oS(t)||(e.add(t),rS(t,(r,i)=>{if(Xc(i)){const s=i[Ps];if(lS(s,n)){const a=zC(s);fw(t,r,a,t.type_),G5(s)}}else Bo(i)&&pw(i,e,n)})),t}function oK(t,e){const n=iS(t),r={type_:n?1:0,scope_:e?e.scope_:V5(),modified_:!1,finalized_:!1,assigned_:void 0,parent_:e,base_:t,draft_:null,copy_:null,revoke_:null,isManual_:!1,callbacks_:void 0};let i=r,s=mw;n&&(i=[r],s=hy);const{revoke:a,proxy:o}=Proxy.revocable(i,s);return r.draft_=o,r.revoke_=a,[o,r]}var mw={get(t,e){if(e===Ps)return t;let n=t.scope_.arrayMethodsPlugin_;const r=t.type_===1&&typeof e=="string";if(r&&n!=null&&n.isArrayOperationMethod(e))return n.createMethodInterceptor(t,e);const i=Cc(t);if(!KI(i,e,t.type_))return lK(t,i,e);const s=i[e];if(t.finalized_||!Bo(s)||r&&t.operationMethod&&(n!=null&&n.isMutatingArrayMethod(t.operationMethod))&&Jq(e))return s;if(s===bE(t.base_,e)){V_(t);const a=t.type_===1?+e:e,o=lP(t.scope_,s,t,a);return t.copy_[a]=o}return s},has(t,e){return e in Cc(t)},ownKeys(t){return Reflect.ownKeys(Cc(t))},set(t,e,n){const r=X5(Cc(t),e);if(r!=null&&r.set)return r.set.call(t.draft_,n),!0;if(!t.modified_){const i=bE(Cc(t),e),s=i==null?void 0:i[Ps];if(s&&s.base_===n)return t.copy_[e]=n,t.assigned_.set(e,!1),!0;if(Qq(n,i)&&(n!==void 0||KI(t.base_,e,t.type_)))return!0;V_(t),oP(t)}return t.copy_[e]===n&&(n!==void 0||e in t.copy_)||Number.isNaN(n)&&Number.isNaN(t.copy_[e])||(t.copy_[e]=n,t.assigned_.set(e,!0),aK(t,e,n)),!0},deleteProperty(t,e){return V_(t),bE(t.base_,e)!==void 0||e in t.base_?(t.assigned_.set(e,!1),oP(t)):t.assigned_.delete(e),t.copy_&&delete t.copy_[e],!0},getOwnPropertyDescriptor(t,e){const n=Cc(t),r=Reflect.getOwnPropertyDescriptor(n,e);return r&&{[H_]:!0,[tP]:t.type_!==1||e!=="length",[dw]:r[dw],[dy]:n[e]}},defineProperty(){Uo(11)},getPrototypeOf(t){return Sg(t.base_)},setPrototypeOf(){Uo(12)}},hy={};for(let t in mw){let e=mw[t];hy[t]=function(){const n=arguments;return n[0]=n[0][0],e.apply(this,n)}}hy.deleteProperty=function(t,e){return hy.set.call(this,t,e,void 0)};hy.set=function(t,e,n){return mw.set.call(this,t[0],e,n,t[0])};function bE(t,e){const n=t[Ps];return(n?Cc(n):t)[e]}function lK(t,e,n){var i;const r=X5(e,n);return r?dy in r?r[dy]:(i=r.get)==null?void 0:i.call(t.draft_):void 0}function X5(t,e){if(!(e in t))return;let n=Sg(t);for(;n;){const r=Object.getOwnPropertyDescriptor(n,e);if(r)return r;n=Sg(n)}}function oP(t){t.modified_||(t.modified_=!0,t.parent_&&oP(t.parent_))}function V_(t){t.copy_||(t.assigned_=new Map,t.copy_=rP(t.base_,t.scope_.immer_.useStrictShallowCopy_))}var cK=class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!1,this.produce=(n,r,i)=>{if(jm(n)&&!jm(r)){const a=r;r=n;const o=this;return function(c=a,...d){return o.produce(c,f=>r.call(this,f,...d))}}jm(r)||Uo(6),i!==void 0&&!jm(i)&&Uo(7);let s;if(Bo(n)){const a=JI(this),o=lP(a,n,void 0);let l=!0;try{s=r(o),l=!1}finally{l?sP(a):aP(a)}return QI(a,i),ek(s,a)}else if(!n||!FC(n)){if(s=r(n),s===void 0&&(s=n),s===z5&&(s=void 0),this.autoFreeze_&&BC(s,!0),i){const a=[],o=[];Oh(iP).generateReplacementPatches_(n,s,{patches_:a,inversePatches_:o}),i(a,o)}return s}else Uo(1,n)},this.produceWithPatches=(n,r)=>{if(jm(n))return(o,...l)=>this.produceWithPatches(o,c=>n(c,...l));let i,s;return[this.produce(n,r,(o,l)=>{i=o,s=l}),i,s]},xE(e==null?void 0:e.autoFreeze)&&this.setAutoFreeze(e.autoFreeze),xE(e==null?void 0:e.useStrictShallowCopy)&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),xE(e==null?void 0:e.useStrictIteration)&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){Bo(e)||Uo(8),Xc(e)&&(e=Ga(e));const n=JI(this),r=lP(n,e,void 0);return r[Ps].isManual_=!0,aP(n),r}finishDraft(e,n){const r=e&&e[Ps];(!r||!r.isManual_)&&Uo(9);const{scope_:i}=r;return QI(i,n),ek(void 0,i)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}setUseStrictIteration(e){this.useStrictIteration_=e}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(e,n){let r;for(r=n.length-1;r>=0;r--){const s=n[r];if(s.path.length===0&&s.op==="replace"){e=s.value;break}}r>-1&&(n=n.slice(r+1));const i=Oh(iP).applyPatches_;return Xc(e)?i(e,n):this.produce(e,s=>i(s,n))}};function lP(t,e,n,r){const[i,s]=sS(e)?Oh(hw).proxyMap_(e,n):aS(e)?Oh(hw).proxySet_(e,n):oK(e,n);return((n==null?void 0:n.scope_)??V5()).drafts_.push(i),s.callbacks_=(n==null?void 0:n.callbacks_)??[],s.key_=r,n&&r!==void 0?sK(n,s,r):s.callbacks_.push(function(l){var d;(d=l.mapSetPlugin_)==null||d.fixSetContents(s);const{patchPlugin_:c}=l;s.modified_&&c&&c.generatePatches_(s,[],l)}),i}function Ga(t){return Xc(t)||Uo(10,t),q5(t)}function q5(t){if(!Bo(t)||oS(t))return t;const e=t[Ps];let n,r=!0;if(e){if(!e.modified_)return e.base_;e.finalized_=!0,n=rP(t,e.scope_.immer_.useStrictShallowCopy_),r=e.scope_.immer_.shouldUseStrictIteration()}else n=rP(t,!0);return rS(n,(i,s)=>{fw(n,i,q5(s))},r),e&&(e.finalized_=!1),n}var uK=new cK,K5=uK.produce;function Y5(t){return({dispatch:n,getState:r})=>i=>s=>typeof s=="function"?s(n,r,t):i(s)}var dK=Y5(),fK=Y5,hK=typeof window<"u"&&window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__?window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__:function(){if(arguments.length!==0)return typeof arguments[0]=="object"?cw:cw.apply(null,arguments)};function Ma(t,e){function n(...r){if(e){let i=e(...r);if(!i)throw new Error(_a(0));return{type:t,payload:i.payload,..."meta"in i&&{meta:i.meta},..."error"in i&&{error:i.error}}}return{type:t,payload:r[0]}}return n.toString=()=>`${t}`,n.type=t,n.match=r=>F5(r)&&r.type===t,n}var Z5=class B0 extends Array{constructor(...e){super(...e),Object.setPrototypeOf(this,B0.prototype)}static get[Symbol.species](){return B0}concat(...e){return super.concat.apply(this,e)}prepend(...e){return e.length===1&&Array.isArray(e[0])?new B0(...e[0].concat(this)):new B0(...e.concat(this))}};function nk(t){return Bo(t)?K5(t,()=>{}):t}function Ab(t,e,n){return t.has(e)?t.get(e):t.set(e,n(e)).get(e)}function pK(t){return typeof t=="boolean"}var mK=()=>function(e){const{thunk:n=!0,immutableCheck:r=!0,serializableCheck:i=!0,actionCreatorCheck:s=!0}=e??{};let a=new Z5;return n&&(pK(n)?a.push(dK):a.push(fK(n.extraArgument))),a},Q5="RTK_autoBatch",ar=()=>t=>({payload:t,meta:{[Q5]:!0}}),rk=t=>e=>{setTimeout(e,t)},gK=(t,e)=>n=>{let r=!1;const i=()=>{r||(r=!0,cancelAnimationFrame(s),clearTimeout(a),n())},s=t(i),a=setTimeout(i,e)},J5=(t={type:"raf"})=>e=>(...n)=>{const r=e(...n);let i=!0,s=!1,a=!1;const o=new Set,l=t.type==="tick"?queueMicrotask:t.type==="raf"?typeof window<"u"&&window.requestAnimationFrame?gK(window.requestAnimationFrame,100):rk(10):t.type==="callback"?t.queueNotification:rk(t.timeout),c=()=>{a=!1,s&&(s=!1,o.forEach(d=>d()))};return Object.assign({},r,{subscribe(d){const f=()=>i&&d(),p=r.subscribe(f);return o.add(d),()=>{p(),o.delete(d)}},dispatch(d){var f;try{return i=!((f=d==null?void 0:d.meta)!=null&&f[Q5]),s=!i,s&&(a||(a=!0,l(c))),r.dispatch(d)}finally{i=!0}}})},vK=t=>function(n){const{autoBatch:r=!0}=n??{};let i=new Z5(t);return r&&i.push(J5(typeof r=="object"?r:void 0)),i};function yK(t){const e=mK(),{reducer:n=void 0,middleware:r,devTools:i=!0,preloadedState:s=void 0,enhancers:a=void 0}=t||{};let o;if(typeof n=="function")o=n;else if(jC(n))o=j5(n);else throw new Error(_a(1));let l;typeof r=="function"?l=r(e):l=e();let c=cw;i&&(c=hK({trace:!1,...typeof i=="object"&&i}));const d=Yq(...l),f=vK(d);let p=typeof a=="function"?a(f):f();const y=c(...p);return U5(o,s,y)}function e4(t){const e={},n=[];let r;const i={addCase(s,a){const o=typeof s=="string"?s:s.type;if(!o)throw new Error(_a(28));if(o in e)throw new Error(_a(29));return e[o]=a,i},addAsyncThunk(s,a){return a.pending&&(e[s.pending.type]=a.pending),a.rejected&&(e[s.rejected.type]=a.rejected),a.fulfilled&&(e[s.fulfilled.type]=a.fulfilled),a.settled&&n.push({matcher:s.settled,reducer:a.settled}),i},addMatcher(s,a){return n.push({matcher:s,reducer:a}),i},addDefaultCase(s){return r=s,i}};return t(i),[e,n,r]}function xK(t){return typeof t=="function"}function bK(t,e){let[n,r,i]=e4(e),s;if(xK(t))s=()=>nk(t());else{const o=nk(t);s=()=>o}function a(o=s(),l){let c=[n[l.type],...r.filter(({matcher:d})=>d(l)).map(({reducer:d})=>d)];return c.filter(d=>!!d).length===0&&(c=[i]),c.reduce((d,f)=>{if(f)if(Xc(d)){const y=f(d,l);return y===void 0?d:y}else{if(Bo(d))return K5(d,p=>f(p,l));{const p=f(d,l);if(p===void 0){if(d===null)return d;throw Error("A case reducer on a non-draftable value must not return undefined")}return p}}return d},o)}return a.getInitialState=s,a}var _K="ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW",wK=(t=21)=>{let e="",n=t;for(;n--;)e+=_K[Math.random()*64|0];return e},SK=Symbol.for("rtk-slice-createasyncthunk");function MK(t,e){return`${t}/${e}`}function EK({creators:t}={}){var n;const e=(n=t==null?void 0:t.asyncThunk)==null?void 0:n[SK];return function(i){const{name:s,reducerPath:a=s}=i;if(!s)throw new Error(_a(11));const o=(typeof i.reducers=="function"?i.reducers(TK()):i.reducers)||{},l=Object.keys(o),c={sliceCaseReducersByName:{},sliceCaseReducersByType:{},actionCreators:{},sliceMatchers:[]},d={addCase(P,O){const N=typeof P=="string"?P:P.type;if(!N)throw new Error(_a(12));if(N in c.sliceCaseReducersByType)throw new Error(_a(13));return c.sliceCaseReducersByType[N]=O,d},addMatcher(P,O){return c.sliceMatchers.push({matcher:P,reducer:O}),d},exposeAction(P,O){return c.actionCreators[P]=O,d},exposeCaseReducer(P,O){return c.sliceCaseReducersByName[P]=O,d}};l.forEach(P=>{const O=o[P],N={reducerName:P,type:MK(s,P),createNotation:typeof i.reducers=="function"};CK(O)?NK(N,O,d,e):PK(N,O,d)});function f(){const[P={},O=[],N=void 0]=typeof i.extraReducers=="function"?e4(i.extraReducers):[i.extraReducers],D={...P,...c.sliceCaseReducersByType};return bK(i.initialState,z=>{for(let V in D)z.addCase(V,D[V]);for(let V of c.sliceMatchers)z.addMatcher(V.matcher,V.reducer);for(let V of O)z.addMatcher(V.matcher,V.reducer);N&&z.addDefaultCase(N)})}const p=P=>P,y=new Map,b=new WeakMap;let S;function w(P,O){return S||(S=f()),S(P,O)}function x(){return S||(S=f()),S.getInitialState()}function M(P,O=!1){function N(z){let V=z[P];return typeof V>"u"&&O&&(V=Ab(b,N,x)),V}function D(z=p){const V=Ab(y,O,()=>new WeakMap);return Ab(V,z,()=>{const k={};for(const[j,X]of Object.entries(i.selectors??{}))k[j]=AK(X,z,()=>Ab(b,z,x),O);return k})}return{reducerPath:P,getSelectors:D,get selectors(){return D(N)},selectSlice:N}}const T={name:s,reducer:w,actions:c.actionCreators,caseReducers:c.sliceCaseReducersByName,getInitialState:x,...M(a),injectInto(P,{reducerPath:O,...N}={}){const D=O??a;return P.inject({reducerPath:D,reducer:w},N),{...T,...M(D,!0)}}};return T}}function AK(t,e,n,r){function i(s,...a){let o=e(s);return typeof o>"u"&&r&&(o=n()),t(o,...a)}return i.unwrapped=t,i}var cs=EK();function TK(){function t(e,n){return{_reducerDefinitionType:"asyncThunk",payloadCreator:e,...n}}return t.withTypes=()=>t,{reducer(e){return Object.assign({[e.name](...n){return e(...n)}}[e.name],{_reducerDefinitionType:"reducer"})},preparedReducer(e,n){return{_reducerDefinitionType:"reducerWithPrepare",prepare:e,reducer:n}},asyncThunk:t}}function PK({type:t,reducerName:e,createNotation:n},r,i){let s,a;if("reducer"in r){if(n&&!RK(r))throw new Error(_a(17));s=r.reducer,a=r.prepare}else s=r;i.addCase(t,s).exposeCaseReducer(e,s).exposeAction(e,a?Ma(t,a):Ma(t))}function CK(t){return t._reducerDefinitionType==="asyncThunk"}function RK(t){return t._reducerDefinitionType==="reducerWithPrepare"}function NK({type:t,reducerName:e},n,r,i){if(!i)throw new Error(_a(18));const{payloadCreator:s,fulfilled:a,pending:o,rejected:l,settled:c,options:d}=n,f=i(t,s,d);r.exposeAction(e,f),a&&r.addCase(f.fulfilled,a),o&&r.addCase(f.pending,o),l&&r.addCase(f.rejected,l),c&&r.addMatcher(f.settled,c),r.exposeCaseReducer(e,{fulfilled:a||Tb,pending:o||Tb,rejected:l||Tb,settled:c||Tb})}function Tb(){}var IK="task",t4="listener",n4="completed",HC="cancelled",kK=`task-${HC}`,OK=`task-${n4}`,cP=`${t4}-${HC}`,LK=`${t4}-${n4}`,cS=class{constructor(t){Gs(this,"code");Gs(this,"name","TaskAbortError");Gs(this,"message");this.code=t,this.message=`${IK} ${HC} (reason: ${t})`}},VC=(t,e)=>{if(typeof t!="function")throw new TypeError(_a(32))},gw=()=>{},r4=(t,e=gw)=>(t.catch(e),t),i4=(t,e)=>(t.addEventListener("abort",e,{once:!0}),()=>t.removeEventListener("abort",e)),Sh=t=>{if(t.aborted)throw new cS(t.reason)};function s4(t,e){let n=gw;return new Promise((r,i)=>{const s=()=>i(new cS(t.reason));if(t.aborted){s();return}n=i4(t,s),e.finally(()=>n()).then(r,i)}).finally(()=>{n=gw})}var DK=async(t,e)=>{try{return await Promise.resolve(),{status:"ok",value:await t()}}catch(n){return{status:n instanceof cS?"cancelled":"rejected",error:n}}finally{e==null||e()}},vw=t=>e=>r4(s4(t,e).then(n=>(Sh(t),n))),a4=t=>{const e=vw(t);return n=>e(new Promise(r=>setTimeout(r,n)))},{assign:Qm}=Object,ik={},uS="listenerMiddleware",UK=(t,e)=>{const n=r=>i4(t,()=>r.abort(t.reason));return(r,i)=>{VC(r);const s=new AbortController;n(s);const a=DK(async()=>{Sh(t),Sh(s.signal);const o=await r({pause:vw(s.signal),delay:a4(s.signal),signal:s.signal});return Sh(s.signal),o},()=>s.abort(OK));return i!=null&&i.autoJoin&&e.push(a.catch(gw)),{result:vw(t)(a),cancel(){s.abort(kK)}}}},jK=(t,e)=>{const n=async(r,i)=>{Sh(e);let s=()=>{};const o=[new Promise((l,c)=>{let d=t({predicate:r,effect:(f,p)=>{p.unsubscribe(),l([f,p.getState(),p.getOriginalState()])}});s=()=>{d(),c()}})];i!=null&&o.push(new Promise(l=>setTimeout(l,i,null)));try{const l=await s4(e,Promise.race(o));return Sh(e),l}finally{s()}};return((r,i)=>r4(n(r,i)))},o4=t=>{let{type:e,actionCreator:n,matcher:r,predicate:i,effect:s}=t;if(e)i=Ma(e).match;else if(n)e=n.type,i=n.match;else if(r)i=r;else if(!i)throw new Error(_a(21));return VC(s),{predicate:i,type:e,effect:s}},l4=Qm(t=>{const{type:e,predicate:n,effect:r}=o4(t);return{id:wK(),effect:r,type:e,predicate:n,pending:new Set,unsubscribe:()=>{throw new Error(_a(22))}}},{withTypes:()=>l4}),sk=(t,e)=>{const{type:n,effect:r,predicate:i}=o4(e);return Array.from(t.values()).find(s=>(typeof n=="string"?s.type===n:s.predicate===i)&&s.effect===r)},uP=t=>{t.pending.forEach(e=>{e.abort(cP)})},FK=(t,e)=>()=>{for(const n of e.keys())uP(n);t.clear()},ak=(t,e,n)=>{try{t(e,n)}catch(r){setTimeout(()=>{throw r},0)}},c4=Qm(Ma(`${uS}/add`),{withTypes:()=>c4}),zK=Ma(`${uS}/removeAll`),u4=Qm(Ma(`${uS}/remove`),{withTypes:()=>u4}),BK=(...t)=>{console.error(`${uS}/error`,...t)},qy=(t={})=>{const e=new Map,n=new Map,r=y=>{const b=n.get(y)??0;n.set(y,b+1)},i=y=>{const b=n.get(y)??1;b===1?n.delete(y):n.set(y,b-1)},{extra:s,onError:a=BK}=t;VC(a);const o=y=>(y.unsubscribe=()=>e.delete(y.id),e.set(y.id,y),b=>{y.unsubscribe(),b!=null&&b.cancelActive&&uP(y)}),l=(y=>{const b=sk(e,y)??l4(y);return o(b)});Qm(l,{withTypes:()=>l});const c=y=>{const b=sk(e,y);return b&&(b.unsubscribe(),y.cancelActive&&uP(b)),!!b};Qm(c,{withTypes:()=>c});const d=async(y,b,S,w)=>{const x=new AbortController,M=jK(l,x.signal),T=[];try{y.pending.add(x),r(y),await Promise.resolve(y.effect(b,Qm({},S,{getOriginalState:w,condition:(P,O)=>M(P,O).then(Boolean),take:M,delay:a4(x.signal),pause:vw(x.signal),extra:s,signal:x.signal,fork:UK(x.signal,T),unsubscribe:y.unsubscribe,subscribe:()=>{e.set(y.id,y)},cancelActiveListeners:()=>{y.pending.forEach((P,O,N)=>{P!==x&&(P.abort(cP),N.delete(P))})},cancel:()=>{x.abort(cP),y.pending.delete(x)},throwIfCancelled:()=>{Sh(x.signal)}})))}catch(P){P instanceof cS||ak(a,P,{raisedBy:"effect"})}finally{await Promise.all(T),x.abort(LK),i(y),y.pending.delete(x)}},f=FK(e,n);return{middleware:y=>b=>S=>{if(!F5(S))return b(S);if(c4.match(S))return l(S.payload);if(zK.match(S)){f();return}if(u4.match(S))return c(S.payload);let w=y.getState();const x=()=>{if(w===ik)throw new Error(_a(23));return w};let M;try{if(M=b(S),e.size>0){const T=y.getState(),P=Array.from(e.values());for(const O of P){let N=!1;try{N=O.predicate(S,T,w)}catch(D){N=!1,ak(a,D,{raisedBy:"predicate"})}N&&d(O,S,y,x)}}}finally{w=ik}return M},startListening:l,stopListening:c,clearListeners:f}};function _a(t){return`Minified Redux Toolkit error #${t}; visit https://redux-toolkit.js.org/Errors?code=${t} for the full message or use the non-minified dev environment for full errors. `}var HK={layoutType:"horizontal",width:0,height:0,margin:{top:5,right:5,bottom:5,left:5},scale:1},d4=cs({name:"chartLayout",initialState:HK,reducers:{setLayout(t,e){t.layoutType=e.payload},setChartSize(t,e){t.width=e.payload.width,t.height=e.payload.height},setMargin(t,e){var n,r,i,s;t.margin.top=(n=e.payload.top)!==null&&n!==void 0?n:0,t.margin.right=(r=e.payload.right)!==null&&r!==void 0?r:0,t.margin.bottom=(i=e.payload.bottom)!==null&&i!==void 0?i:0,t.margin.left=(s=e.payload.left)!==null&&s!==void 0?s:0},setScale(t,e){t.scale=e.payload}}}),dS=d4.actions,VK=dS.setMargin,GK=dS.setLayout,WK=dS.setChartSize,$K=dS.setScale,XK=d4.reducer;function f4(t,e,n){return Array.isArray(t)&&t&&e+n!==0?t.slice(e,n+1):t}function wn(t){return Number.isFinite(t)}function Il(t){return typeof t=="number"&&t>0&&Number.isFinite(t)}function ok(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(t,i).enumerable})),n.push.apply(n,r)}return n}function Gm(t){for(var e=1;e{if(e&&n){var r=n.width,i=n.height,s=e.align,a=e.verticalAlign,o=e.layout;if((o==="vertical"||o==="horizontal"&&a==="middle")&&s!=="center"&&kt(t[s]))return Gm(Gm({},t),{},{[s]:t[s]+(r||0)});if((o==="horizontal"||o==="vertical"&&s==="center")&&a!=="middle"&&kt(t[a]))return Gm(Gm({},t),{},{[a]:t[a]+(i||0)})}return t},jl=(t,e)=>t==="horizontal"&&e==="xAxis"||t==="vertical"&&e==="yAxis"||t==="centric"&&e==="angleAxis"||t==="radial"&&e==="radiusAxis",h4=(t,e,n,r)=>{if(r)return t.map(o=>o.coordinate);var i,s,a=t.map(o=>(o.coordinate===e&&(i=!0),o.coordinate===n&&(s=!0),o.coordinate));return i||a.push(e),s||a.push(n),a},p4=(t,e,n)=>{if(!t)return null;var r=t.duplicateDomain,i=t.type,s=t.range,a=t.scale,o=t.realScaleType,l=t.isCategorical,c=t.categoricalDomain,d=t.tickCount,f=t.ticks,p=t.niceTicks,y=t.axisType;if(!a)return null;var b=o==="scaleBand"&&a.bandwidth?a.bandwidth()/2:2,S=i==="category"&&a.bandwidth?a.bandwidth()/b:0;if(S=y==="angleAxis"&&s&&s.length>=2?Va(s[0]-s[1])*2*S:S,f||p){var w=(f||p||[]).map((x,M)=>{var T=r?r.indexOf(x):x,P=a.map(T);return wn(P)?{coordinate:P+S,value:x,offset:S,index:M}:null}).filter(Ys);return w}return l&&c?c.map((x,M)=>{var T=a.map(x);return wn(T)?{coordinate:T+S,value:x,index:M,offset:S}:null}).filter(Ys):a.ticks&&d!=null?a.ticks(d).map((x,M)=>{var T=a.map(x);return wn(T)?{coordinate:T+S,value:x,index:M,offset:S}:null}).filter(Ys):a.domain().map((x,M)=>{var T=a.map(x);return wn(T)?{coordinate:T+S,value:r?r[x]:x,index:M,offset:S}:null}).filter(Ys)},QK=t=>{var e,n=t.length;if(!(n<=0)){var r=(e=t[0])===null||e===void 0?void 0:e.length;if(!(r==null||r<=0))for(var i=0;i=0?(c[0]=s,s+=p,c[1]=s):(c[0]=a,a+=p,c[1]=a)}}}},JK=t=>{var e,n=t.length;if(!(n<=0)){var r=(e=t[0])===null||e===void 0?void 0:e.length;if(!(r==null||r<=0))for(var i=0;i=0?(l[0]=s,s+=c,l[1]=s):(l[0]=0,l[1]=0)}}}},eY={sign:QK,expand:gX,none:Ih,silhouette:vX,wiggle:yX,positive:JK},tY=(t,e,n)=>{var r,i=(r=eY[n])!==null&&r!==void 0?r:Ih,s=mX().keys(e).value((o,l)=>Number(yi(o,l,0))).order(YT).offset(i),a=s(t);return a.forEach((o,l)=>{o.forEach((c,d)=>{var f=yi(t[d],e[l],0);Array.isArray(f)&&f.length===2&&kt(f[0])&&kt(f[1])&&(c[0]=f[0],c[1]=f[1])})}),a};function nY(t){return t==null?void 0:String(t)}function lk(t){var e=t.axis,n=t.ticks,r=t.bandSize,i=t.entry,s=t.index,a=t.dataKey;if(e.type==="category"){if(!e.allowDuplicatedCategory&&e.dataKey&&!Vi(i[e.dataKey])){var o=b5(n,"value",i[e.dataKey]);if(o)return o.coordinate+r/2}return n!=null&&n[s]?n[s].coordinate+r/2:null}var l=yi(i,Vi(a)?e.dataKey:a),c=e.scale.map(l);return kt(c)?c:null}var rY=t=>{var e=t.flat(2).filter(kt);return[Math.min(...e),Math.max(...e)]},iY=t=>[t[0]===1/0?0:t[0],t[1]===-1/0?0:t[1]],sY=(t,e,n)=>{if(!(t==null||Object.keys(t).length===0))return iY(Object.keys(t).reduce((r,i)=>{var s=t[i];if(!s)return r;var a=s.stackedData,o=a.reduce((l,c)=>{var d=f4(c,e,n),f=rY(d);return!wn(f[0])||!wn(f[1])?l:[Math.min(l[0],f[0]),Math.max(l[1],f[1])]},[1/0,-1/0]);return[Math.min(o[0],r[0]),Math.max(o[1],r[1])]},[1/0,-1/0]))},ck=/^dataMin[\s]*-[\s]*([0-9]+([.]{1}[0-9]+){0,1})$/,uk=/^dataMax[\s]*\+[\s]*([0-9]+([.]{1}[0-9]+){0,1})$/,yw=(t,e,n)=>{if(t&&t.scale&&t.scale.bandwidth){var r=t.scale.bandwidth();if(!n||r>0)return r}if(t&&e&&e.length>=2){for(var i=tS(e,d=>d.coordinate),s=1/0,a=1,o=i.length;a{if(e==="horizontal")return t.relativeX;if(e==="vertical")return t.relativeY},oY=(t,e)=>e==="centric"?t.angle:t.radius,Jc=t=>t.layout.width,eu=t=>t.layout.height,lY=t=>t.layout.scale,g4=t=>t.layout.margin,fS=ke(t=>t.cartesianAxis.xAxis,t=>Object.values(t)),hS=ke(t=>t.cartesianAxis.yAxis,t=>Object.values(t)),cY="data-recharts-item-index",uY="data-recharts-item-id",Ky=60;function fk(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(t,i).enumerable})),n.push.apply(n,r)}return n}function Pb(t){for(var e=1;et.brush.height;function mY(t){var e=hS(t);return e.reduce((n,r)=>{if(r.orientation==="left"&&!r.mirror&&!r.hide){var i=typeof r.width=="number"?r.width:Ky;return n+i}return n},0)}function gY(t){var e=hS(t);return e.reduce((n,r)=>{if(r.orientation==="right"&&!r.mirror&&!r.hide){var i=typeof r.width=="number"?r.width:Ky;return n+i}return n},0)}function vY(t){var e=fS(t);return e.reduce((n,r)=>r.orientation==="top"&&!r.mirror&&!r.hide?n+r.height:n,0)}function yY(t){var e=fS(t);return e.reduce((n,r)=>r.orientation==="bottom"&&!r.mirror&&!r.hide?n+r.height:n,0)}var Wi=ke([Jc,eu,g4,pY,mY,gY,vY,yY,D5,Fq],(t,e,n,r,i,s,a,o,l,c)=>{var d={left:(n.left||0)+i,right:(n.right||0)+s},f={top:(n.top||0)+a,bottom:(n.bottom||0)+o},p=Pb(Pb({},f),d),y=p.bottom;p.bottom+=r,p=ZK(p,l,c);var b=t-p.left-p.right,S=e-p.top-p.bottom;return Pb(Pb({brushBottom:y},p),{},{width:Math.max(b,0),height:Math.max(S,0)})}),xY=ke(Wi,t=>({x:t.left,y:t.top,width:t.width,height:t.height})),v4=ke(Jc,eu,(t,e)=>({x:0,y:0,width:t,height:e})),bY=R.createContext(null),Js=()=>R.useContext(bY)!=null,pS=t=>t.brush,mS=ke([pS,Wi,g4],(t,e,n)=>({height:t.height,x:kt(t.x)?t.x:e.left,y:kt(t.y)?t.y:e.top+e.height+e.brushBottom-((n==null?void 0:n.bottom)||0),width:kt(t.width)?t.width:e.width}));function _Y(t,e,{signal:n,edges:r}={}){let i,s=null;const a=r!=null&&r.includes("leading"),o=r==null||r.includes("trailing"),l=()=>{s!==null&&(t.apply(i,s),i=void 0,s=null)},c=()=>{o&&l(),y()};let d=null;const f=()=>{d!=null&&clearTimeout(d),d=setTimeout(()=>{d=null,c()},e)},p=()=>{d!==null&&(clearTimeout(d),d=null)},y=()=>{p(),i=void 0,s=null},b=()=>{l()},S=function(...w){if(n!=null&&n.aborted)return;i=this,s=w;const x=d==null;f(),a&&x&&l()};return S.schedule=f,S.cancel=y,S.flush=b,n==null||n.addEventListener("abort",y,{once:!0}),S}function wY(t,e=0,n={}){typeof n!="object"&&(n={});const{leading:r=!1,trailing:i=!0,maxWait:s}=n,a=Array(2);r&&(a[0]="leading"),i&&(a[1]="trailing");let o,l=null;const c=_Y(function(...p){o=t.apply(this,p),l=null},e,{edges:a}),d=function(...p){return s!=null&&(l===null&&(l=Date.now()),Date.now()-l>=s)?(o=t.apply(this,p),l=Date.now(),c.cancel(),c.schedule(),o):(c.apply(this,p),o)},f=()=>(c.flush(),o);return d.cancel=c.cancel,d.flush=f,d}function SY(t,e=0,n={}){const{leading:r=!0,trailing:i=!0}=n;return wY(t,e,{leading:r,maxWait:e,trailing:i})}var xw=function(e,n){for(var r=arguments.length,i=new Array(r>2?r-2:0),s=2;si[a++]))}},wl={width:"100%",height:"100%",debounce:0,minWidth:0,initialDimension:{width:-1,height:-1}},y4=(t,e,n)=>{var r=n.width,i=r===void 0?wl.width:r,s=n.height,a=s===void 0?wl.height:s,o=n.aspect,l=n.maxHeight,c=kh(i)?t:Number(i),d=kh(a)?e:Number(a);return o&&o>0&&(c?d=c/o:d&&(c=d*o),l&&d!=null&&d>l&&(d=l)),{calculatedWidth:c,calculatedHeight:d}},MY={width:0,height:0,overflow:"visible"},EY={width:0,overflowX:"visible"},AY={height:0,overflowY:"visible"},TY={},PY=t=>{var e=t.width,n=t.height,r=kh(e),i=kh(n);return r&&i?MY:r?EY:i?AY:TY};function CY(t){var e=t.width,n=t.height,r=t.aspect,i=e,s=n;return i===void 0&&s===void 0?(i=wl.width,s=wl.height):i===void 0?i=r&&r>0?void 0:wl.width:s===void 0&&(s=r&&r>0?void 0:wl.height),{width:i,height:s}}var RY=["aspect","initialDimension","width","height","minWidth","minHeight","maxHeight","children","debounce","id","className","onResize","style"];function bw(){return bw=Object.assign?Object.assign.bind():function(t){for(var e=1;et.length)&&(e=t.length);for(var n=0,r=Array(e);n({width:n,height:r}),[n,r]);return BY(i)?R.createElement(x4.Provider,{value:i},e):null}var GC=()=>R.useContext(x4),HY=R.forwardRef((t,e)=>{var n=t.aspect,r=t.initialDimension,i=r===void 0?wl.initialDimension:r,s=t.width,a=t.height,o=t.minWidth,l=o===void 0?wl.minWidth:o,c=t.minHeight,d=t.maxHeight,f=t.children,p=t.debounce,y=p===void 0?wl.debounce:p,b=t.id,S=t.className,w=t.onResize,x=t.style,M=x===void 0?{}:x,T=FY(t,RY),P=R.useRef(null),O=R.useRef();O.current=w,R.useImperativeHandle(e,()=>P.current);var N=R.useState({containerWidth:i.width,containerHeight:i.height}),D=OY(N,2),z=D[0],V=D[1],k=R.useCallback((ae,he)=>{V(B=>{var J=Math.round(ae),Y=Math.round(he);return B.containerWidth===J&&B.containerHeight===Y?B:{containerWidth:J,containerHeight:Y}})},[]);R.useEffect(()=>{if(P.current==null||typeof ResizeObserver>"u")return Hg;var ae=H=>{var G,le=H[0];if(le!=null){var se=le.contentRect,ce=se.width,Se=se.height;k(ce,Se),(G=O.current)===null||G===void 0||G.call(O,ce,Se)}};y>0&&(ae=SY(ae,y,{trailing:!0,leading:!1}));var he=new ResizeObserver(ae),B=P.current.getBoundingClientRect(),J=B.width,Y=B.height;return k(J,Y),he.observe(P.current),()=>{he.disconnect()}},[k,y]);var j=z.containerWidth,X=z.containerHeight;xw(!n||n>0,"The aspect(%s) must be greater than zero.",n);var ee=y4(j,X,{width:s,height:a,aspect:n,maxHeight:d}),ie=ee.calculatedWidth,pe=ee.calculatedHeight;return xw(j<0||X<0||ie!=null&&ie>0||pe!=null&&pe>0,`The width(%s) and height(%s) of chart should be greater than 0, - please check the style of container, or the props width(%s) and height(%s), - or add a minWidth(%s) or minHeight(%s) or use aspect(%s) to control the - height and width.`,ie,pe,s,a,l,c,n),R.createElement("div",bw({id:b?"".concat(b):void 0,className:tr("recharts-responsive-container",S),style:pk(pk({},M),{},{width:s,height:a,minWidth:l,minHeight:c,maxHeight:d}),ref:P},T),R.createElement("div",{style:PY({width:s,height:a})},R.createElement(b4,{width:ie,height:pe},f)))}),VY=R.forwardRef((t,e)=>{var n=GC();if(Il(n.width)&&Il(n.height))return t.children;var r=CY({width:t.width,height:t.height,aspect:t.aspect}),i=r.width,s=r.height,a=y4(void 0,void 0,{width:i,height:s,aspect:t.aspect,maxHeight:t.maxHeight}),o=a.calculatedWidth,l=a.calculatedHeight;return kt(o)&&kt(l)?R.createElement(b4,{width:o,height:l},t.children):R.createElement(HY,bw({},t,{width:i,height:s,ref:e}))});function WC(t){if(t)return{x:t.x,y:t.y,upperWidth:"upperWidth"in t?t.upperWidth:t.width,lowerWidth:"lowerWidth"in t?t.lowerWidth:t.width,width:t.width,height:t.height}}var gS=()=>{var t,e=Js(),n=Ft(xY),r=Ft(mS),i=(t=Ft(pS))===null||t===void 0?void 0:t.padding;return!e||!r||!i?n:{width:r.width-i.left-i.right,height:r.height-i.top-i.bottom,x:i.left,y:i.top}},GY={top:0,bottom:0,left:0,right:0,width:0,height:0,brushBottom:0},_4=()=>{var t;return(t=Ft(Wi))!==null&&t!==void 0?t:GY},w4=()=>Ft(Jc),S4=()=>Ft(eu),hr=t=>t.layout.layoutType,Vg=()=>Ft(hr),$C=()=>{var t=Vg();if(t==="horizontal"||t==="vertical")return t},M4=t=>{var e=t.layout.layoutType;if(e==="centric"||e==="radial")return e},WY=()=>{var t=Vg();return t!==void 0},Yy=t=>{var e=Wr(),n=Js(),r=t.width,i=t.height,s=GC(),a=r,o=i;return s&&(a=s.width>0?s.width:r,o=s.height>0?s.height:i),R.useEffect(()=>{!n&&Il(a)&&Il(o)&&e(WK({width:a,height:o}))},[e,n,a,o]),null},E4=Symbol.for("immer-nothing"),gk=Symbol.for("immer-draftable"),Ea=Symbol.for("immer-state");function jo(t,...e){throw new Error(`[Immer] minified error nr: ${t}. Full error at: https://bit.ly/3cXEKWf`)}var py=Object.getPrototypeOf;function Mg(t){return!!t&&!!t[Ea]}function Lh(t){var e;return t?A4(t)||Array.isArray(t)||!!t[gk]||!!((e=t.constructor)!=null&&e[gk])||Zy(t)||yS(t):!1}var $Y=Object.prototype.constructor.toString(),vk=new WeakMap;function A4(t){if(!t||typeof t!="object")return!1;const e=Object.getPrototypeOf(t);if(e===null||e===Object.prototype)return!0;const n=Object.hasOwnProperty.call(e,"constructor")&&e.constructor;if(n===Object)return!0;if(typeof n!="function")return!1;let r=vk.get(n);return r===void 0&&(r=Function.toString.call(n),vk.set(n,r)),r===$Y}function _w(t,e,n=!0){vS(t)===0?(n?Reflect.ownKeys(t):Object.keys(t)).forEach(i=>{e(i,t[i],t)}):t.forEach((r,i)=>e(i,r,t))}function vS(t){const e=t[Ea];return e?e.type_:Array.isArray(t)?1:Zy(t)?2:yS(t)?3:0}function dP(t,e){return vS(t)===2?t.has(e):Object.prototype.hasOwnProperty.call(t,e)}function T4(t,e,n){const r=vS(t);r===2?t.set(e,n):r===3?t.add(n):t[e]=n}function XY(t,e){return t===e?t!==0||1/t===1/e:t!==t&&e!==e}function Zy(t){return t instanceof Map}function yS(t){return t instanceof Set}function Xf(t){return t.copy_||t.base_}function fP(t,e){if(Zy(t))return new Map(t);if(yS(t))return new Set(t);if(Array.isArray(t))return Array.prototype.slice.call(t);const n=A4(t);if(e===!0||e==="class_only"&&!n){const r=Object.getOwnPropertyDescriptors(t);delete r[Ea];let i=Reflect.ownKeys(r);for(let s=0;s1&&Object.defineProperties(t,{set:Cb,add:Cb,clear:Cb,delete:Cb}),Object.freeze(t),e&&Object.values(t).forEach(n=>XC(n,!0))),t}function qY(){jo(2)}var Cb={value:qY};function xS(t){return t===null||typeof t!="object"?!0:Object.isFrozen(t)}var KY={};function Dh(t){const e=KY[t];return e||jo(0,t),e}var my;function P4(){return my}function YY(t,e){return{drafts_:[],parent_:t,immer_:e,canAutoFreeze_:!0,unfinalizedDrafts_:0}}function yk(t,e){e&&(Dh("Patches"),t.patches_=[],t.inversePatches_=[],t.patchListener_=e)}function hP(t){pP(t),t.drafts_.forEach(ZY),t.drafts_=null}function pP(t){t===my&&(my=t.parent_)}function xk(t){return my=YY(my,t)}function ZY(t){const e=t[Ea];e.type_===0||e.type_===1?e.revoke_():e.revoked_=!0}function bk(t,e){e.unfinalizedDrafts_=e.drafts_.length;const n=e.drafts_[0];return t!==void 0&&t!==n?(n[Ea].modified_&&(hP(e),jo(4)),Lh(t)&&(t=ww(e,t),e.parent_||Sw(e,t)),e.patches_&&Dh("Patches").generateReplacementPatches_(n[Ea].base_,t,e.patches_,e.inversePatches_)):t=ww(e,n,[]),hP(e),e.patches_&&e.patchListener_(e.patches_,e.inversePatches_),t!==E4?t:void 0}function ww(t,e,n){if(xS(e))return e;const r=t.immer_.shouldUseStrictIteration(),i=e[Ea];if(!i)return _w(e,(s,a)=>_k(t,i,e,s,a,n),r),e;if(i.scope_!==t)return e;if(!i.modified_)return Sw(t,i.base_,!0),i.base_;if(!i.finalized_){i.finalized_=!0,i.scope_.unfinalizedDrafts_--;const s=i.copy_;let a=s,o=!1;i.type_===3&&(a=new Set(s),s.clear(),o=!0),_w(a,(l,c)=>_k(t,i,s,l,c,n,o),r),Sw(t,s,!1),n&&t.patches_&&Dh("Patches").generatePatches_(i,n,t.patches_,t.inversePatches_)}return i.copy_}function _k(t,e,n,r,i,s,a){if(i==null||typeof i!="object"&&!a)return;const o=xS(i);if(!(o&&!a)){if(Mg(i)){const l=s&&e&&e.type_!==3&&!dP(e.assigned_,r)?s.concat(r):void 0,c=ww(t,i,l);if(T4(n,r,c),Mg(c))t.canAutoFreeze_=!1;else return}else a&&n.add(i);if(Lh(i)&&!o){if(!t.immer_.autoFreeze_&&t.unfinalizedDrafts_<1||e&&e.base_&&e.base_[r]===i&&o)return;ww(t,i),(!e||!e.scope_.parent_)&&typeof r!="symbol"&&(Zy(n)?n.has(r):Object.prototype.propertyIsEnumerable.call(n,r))&&Sw(t,i)}}}function Sw(t,e,n=!1){!t.parent_&&t.immer_.autoFreeze_&&t.canAutoFreeze_&&XC(e,n)}function QY(t,e){const n=Array.isArray(t),r={type_:n?1:0,scope_:e?e.scope_:P4(),modified_:!1,finalized_:!1,assigned_:{},parent_:e,base_:t,draft_:null,copy_:null,revoke_:null,isManual_:!1};let i=r,s=qC;n&&(i=[r],s=gy);const{revoke:a,proxy:o}=Proxy.revocable(i,s);return r.draft_=o,r.revoke_=a,o}var qC={get(t,e){if(e===Ea)return t;const n=Xf(t);if(!dP(n,e))return JY(t,n,e);const r=n[e];return t.finalized_||!Lh(r)?r:r===_E(t.base_,e)?(wE(t),t.copy_[e]=gP(r,t)):r},has(t,e){return e in Xf(t)},ownKeys(t){return Reflect.ownKeys(Xf(t))},set(t,e,n){const r=C4(Xf(t),e);if(r!=null&&r.set)return r.set.call(t.draft_,n),!0;if(!t.modified_){const i=_E(Xf(t),e),s=i==null?void 0:i[Ea];if(s&&s.base_===n)return t.copy_[e]=n,t.assigned_[e]=!1,!0;if(XY(n,i)&&(n!==void 0||dP(t.base_,e)))return!0;wE(t),mP(t)}return t.copy_[e]===n&&(n!==void 0||e in t.copy_)||Number.isNaN(n)&&Number.isNaN(t.copy_[e])||(t.copy_[e]=n,t.assigned_[e]=!0),!0},deleteProperty(t,e){return _E(t.base_,e)!==void 0||e in t.base_?(t.assigned_[e]=!1,wE(t),mP(t)):delete t.assigned_[e],t.copy_&&delete t.copy_[e],!0},getOwnPropertyDescriptor(t,e){const n=Xf(t),r=Reflect.getOwnPropertyDescriptor(n,e);return r&&{writable:!0,configurable:t.type_!==1||e!=="length",enumerable:r.enumerable,value:n[e]}},defineProperty(){jo(11)},getPrototypeOf(t){return py(t.base_)},setPrototypeOf(){jo(12)}},gy={};_w(qC,(t,e)=>{gy[t]=function(){return arguments[0]=arguments[0][0],e.apply(this,arguments)}});gy.deleteProperty=function(t,e){return gy.set.call(this,t,e,void 0)};gy.set=function(t,e,n){return qC.set.call(this,t[0],e,n,t[0])};function _E(t,e){const n=t[Ea];return(n?Xf(n):t)[e]}function JY(t,e,n){var i;const r=C4(e,n);return r?"value"in r?r.value:(i=r.get)==null?void 0:i.call(t.draft_):void 0}function C4(t,e){if(!(e in t))return;let n=py(t);for(;n;){const r=Object.getOwnPropertyDescriptor(n,e);if(r)return r;n=py(n)}}function mP(t){t.modified_||(t.modified_=!0,t.parent_&&mP(t.parent_))}function wE(t){t.copy_||(t.copy_=fP(t.base_,t.scope_.immer_.useStrictShallowCopy_))}var eZ=class{constructor(t){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!0,this.produce=(e,n,r)=>{if(typeof e=="function"&&typeof n!="function"){const s=n;n=e;const a=this;return function(l=s,...c){return a.produce(l,d=>n.call(this,d,...c))}}typeof n!="function"&&jo(6),r!==void 0&&typeof r!="function"&&jo(7);let i;if(Lh(e)){const s=xk(this),a=gP(e,void 0);let o=!0;try{i=n(a),o=!1}finally{o?hP(s):pP(s)}return yk(s,r),bk(i,s)}else if(!e||typeof e!="object"){if(i=n(e),i===void 0&&(i=e),i===E4&&(i=void 0),this.autoFreeze_&&XC(i,!0),r){const s=[],a=[];Dh("Patches").generateReplacementPatches_(e,i,s,a),r(s,a)}return i}else jo(1,e)},this.produceWithPatches=(e,n)=>{if(typeof e=="function")return(a,...o)=>this.produceWithPatches(a,l=>e(l,...o));let r,i;return[this.produce(e,n,(a,o)=>{r=a,i=o}),r,i]},typeof(t==null?void 0:t.autoFreeze)=="boolean"&&this.setAutoFreeze(t.autoFreeze),typeof(t==null?void 0:t.useStrictShallowCopy)=="boolean"&&this.setUseStrictShallowCopy(t.useStrictShallowCopy),typeof(t==null?void 0:t.useStrictIteration)=="boolean"&&this.setUseStrictIteration(t.useStrictIteration)}createDraft(t){Lh(t)||jo(8),Mg(t)&&(t=tZ(t));const e=xk(this),n=gP(t,void 0);return n[Ea].isManual_=!0,pP(e),n}finishDraft(t,e){const n=t&&t[Ea];(!n||!n.isManual_)&&jo(9);const{scope_:r}=n;return yk(r,e),bk(void 0,r)}setAutoFreeze(t){this.autoFreeze_=t}setUseStrictShallowCopy(t){this.useStrictShallowCopy_=t}setUseStrictIteration(t){this.useStrictIteration_=t}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(t,e){let n;for(n=e.length-1;n>=0;n--){const i=e[n];if(i.path.length===0&&i.op==="replace"){t=i.value;break}}n>-1&&(e=e.slice(n+1));const r=Dh("Patches").applyPatches_;return Mg(t)?r(t,e):this.produce(t,i=>r(i,e))}};function gP(t,e){const n=Zy(t)?Dh("MapSet").proxyMap_(t,e):yS(t)?Dh("MapSet").proxySet_(t,e):QY(t,e);return(e?e.scope_:P4()).drafts_.push(n),n}function tZ(t){return Mg(t)||jo(10,t),R4(t)}function R4(t){if(!Lh(t)||xS(t))return t;const e=t[Ea];let n,r=!0;if(e){if(!e.modified_)return e.base_;e.finalized_=!0,n=fP(t,e.scope_.immer_.useStrictShallowCopy_),r=e.scope_.immer_.shouldUseStrictIteration()}else n=fP(t,!0);return _w(n,(i,s)=>{T4(n,i,R4(s))},r),e&&(e.finalized_=!1),n}var nZ=new eZ;nZ.produce;var rZ={settings:{layout:"horizontal",align:"center",verticalAlign:"bottom",itemSorter:"value"},size:{width:0,height:0},payload:[]},N4=cs({name:"legend",initialState:rZ,reducers:{setLegendSize(t,e){t.size.width=e.payload.width,t.size.height=e.payload.height},setLegendSettings(t,e){t.settings.align=e.payload.align,t.settings.layout=e.payload.layout,t.settings.verticalAlign=e.payload.verticalAlign,t.settings.itemSorter=e.payload.itemSorter},addLegendPayload:{reducer(t,e){t.payload.push(e.payload)},prepare:ar()},replaceLegendPayload:{reducer(t,e){var n=e.payload,r=n.prev,i=n.next,s=Ga(t).payload.indexOf(r);s>-1&&(t.payload[s]=i)},prepare:ar()},removeLegendPayload:{reducer(t,e){var n=Ga(t).payload.indexOf(e.payload);n>-1&&t.payload.splice(n,1)},prepare:ar()}}}),Qy=N4.actions;Qy.setLegendSize;Qy.setLegendSettings;var iZ=Qy.addLegendPayload,sZ=Qy.replaceLegendPayload,aZ=Qy.removeLegendPayload,oZ=N4.reducer,SE={exports:{}},ME={};/** - * @license React - * use-sync-external-store-with-selector.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var wk;function lZ(){if(wk)return ME;wk=1;var t=qh();function e(l,c){return l===c&&(l!==0||1/l===1/c)||l!==l&&c!==c}var n=typeof Object.is=="function"?Object.is:e,r=t.useSyncExternalStore,i=t.useRef,s=t.useEffect,a=t.useMemo,o=t.useDebugValue;return ME.useSyncExternalStoreWithSelector=function(l,c,d,f,p){var y=i(null);if(y.current===null){var b={hasValue:!1,value:null};y.current=b}else b=y.current;y=a(function(){function w(O){if(!x){if(x=!0,M=O,O=f(O),p!==void 0&&b.hasValue){var N=b.value;if(p(N,O))return T=N}return T=O}if(N=T,n(M,O))return N;var D=f(O);return p!==void 0&&p(N,D)?(M=O,N):(M=O,T=D)}var x=!1,M,T,P=d===void 0?null:d;return[function(){return w(c())},P===null?void 0:function(){return w(P())}]},[c,d,f,p]);var S=r(l,y[0],y[1]);return s(function(){b.hasValue=!0,b.value=S},[S]),o(S),S},ME}var Sk;function cZ(){return Sk||(Sk=1,SE.exports=lZ()),SE.exports}cZ();function uZ(t){t()}function dZ(){let t=null,e=null;return{clear(){t=null,e=null},notify(){uZ(()=>{let n=t;for(;n;)n.callback(),n=n.next})},get(){const n=[];let r=t;for(;r;)n.push(r),r=r.next;return n},subscribe(n){let r=!0;const i=e={callback:n,next:null,prev:e};return i.prev?i.prev.next=i:t=i,function(){!r||t===null||(r=!1,i.next?i.next.prev=i.prev:e=i.prev,i.prev?i.prev.next=i.next:t=i.next)}}}}var Mk={notify(){},get:()=>[]};function fZ(t,e){let n,r=Mk,i=0,s=!1;function a(S){d();const w=r.subscribe(S);let x=!1;return()=>{x||(x=!0,w(),f())}}function o(){r.notify()}function l(){b.onStateChange&&b.onStateChange()}function c(){return s}function d(){i++,n||(n=t.subscribe(l),r=dZ())}function f(){i--,n&&i===0&&(n(),n=void 0,r.clear(),r=Mk)}function p(){s||(s=!0,d())}function y(){s&&(s=!1,f())}const b={addNestedSub:a,notifyNestedSubs:o,handleChangeWrapper:l,isSubscribed:c,trySubscribe:p,tryUnsubscribe:y,getListeners:()=>r};return b}var hZ=()=>typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",pZ=hZ(),mZ=()=>typeof navigator<"u"&&navigator.product==="ReactNative",gZ=mZ(),vZ=()=>pZ||gZ?R.useLayoutEffect:R.useEffect,yZ=vZ();function Ek(t,e){return t===e?t!==0||e!==0||1/t===1/e:t!==t&&e!==e}function xZ(t,e){if(Ek(t,e))return!0;if(typeof t!="object"||t===null||typeof e!="object"||e===null)return!1;const n=Object.keys(t),r=Object.keys(e);if(n.length!==r.length)return!1;for(let i=0;i{const l=fZ(i);return{store:i,subscription:l,getServerState:r?()=>r:void 0}},[i,r]),a=R.useMemo(()=>i.getState(),[i]);yZ(()=>{const{subscription:l}=s;return l.onStateChange=l.notifyNestedSubs,l.trySubscribe(),a!==i.getState()&&l.notifyNestedSubs(),()=>{l.tryUnsubscribe(),l.onStateChange=void 0}},[s,a]);const o=n||_Z;return R.createElement(o.Provider,{value:s},e)}var SZ=wZ,MZ=new Set(["axisLine","tickLine","activeBar","activeDot","activeLabel","activeShape","allowEscapeViewBox","background","cursor","dot","label","line","margin","padding","position","shape","style","tick","wrapperStyle","radius","throttledEvents"]);function EZ(t,e){return t==null&&e==null?!0:typeof t=="number"&&typeof e=="number"?t===e||t!==t&&e!==e:t===e}function bS(t,e){var n=new Set([...Object.keys(t),...Object.keys(e)]);for(var r of n)if(MZ.has(r)){if(t[r]==null&&e[r]==null)continue;if(!xZ(t[r],e[r]))return!1}else if(!EZ(t[r],e[r]))return!1;return!0}function vP(){return vP=Object.assign?Object.assign.bind():function(t){for(var e=1;et.length)&&(e=t.length);for(var n=0,r=Array(e);n{var e=t.separator,n=e===void 0?am.separator:e,r=t.contentStyle,i=t.itemStyle,s=t.labelStyle,a=s===void 0?am.labelStyle:s,o=t.payload,l=t.formatter,c=t.itemSorter,d=t.wrapperClassName,f=t.labelClassName,p=t.label,y=t.labelFormatter,b=t.accessibilityLayer,S=b===void 0?am.accessibilityLayer:b,w=()=>{if(o&&o.length){var z={padding:0,margin:0},V=LZ(o,c),k=V.map((j,X)=>{if(!j||j.type==="none")return null;var ee=j.formatter||l||OZ,ie=j.value,pe=j.name,ae=ie,he=pe;if(ee){var B=ee(ie,pe,j,X,o);if(Array.isArray(B)){var J=CZ(B,2);ae=J[0],he=J[1]}else if(B!=null)ae=B;else return null}var Y=i0(i0({},am.itemStyle),{},{color:j.color||am.itemStyle.color},i);return R.createElement("li",{className:"recharts-tooltip-item",key:"tooltip-item-".concat(X),style:Y},Nl(he)?R.createElement("span",{className:"recharts-tooltip-item-name"},he):null,Nl(he)?R.createElement("span",{className:"recharts-tooltip-item-separator"},n):null,R.createElement("span",{className:"recharts-tooltip-item-value"},ae),R.createElement("span",{className:"recharts-tooltip-item-unit"},j.unit||""))});return R.createElement("ul",{className:"recharts-tooltip-item-list",style:z},k)}return null},x=i0(i0({},am.contentStyle),r),M=i0({margin:0},a),T=!Vi(p),P=T?p:"",O=tr("recharts-default-tooltip",d),N=tr("recharts-tooltip-label",f);T&&y&&o!==void 0&&o!==null&&(P=y(p,o));var D=S?{role:"status","aria-live":"assertive"}:{};return R.createElement("div",vP({className:O,style:x},D),R.createElement("p",{className:N,style:M},R.isValidElement(P)?P:"".concat(P)),w())},s0="recharts-tooltip-wrapper",UZ={visibility:"hidden"};function jZ(t){var e=t.coordinate,n=t.translateX,r=t.translateY;return tr(s0,{["".concat(s0,"-right")]:kt(n)&&e&&kt(e.x)&&n>=e.x,["".concat(s0,"-left")]:kt(n)&&e&&kt(e.x)&&n=e.y,["".concat(s0,"-top")]:kt(r)&&e&&kt(e.y)&&r0?i:0),f=n[r]+i;if(e[r])return a[r]?d:f;var p=l[r];if(p==null)return 0;if(a[r]){var y=d,b=p;return yw?Math.max(d,p):Math.max(f,p)}function FZ(t){var e=t.translateX,n=t.translateY,r=t.useTranslate3d;return{transform:r?"translate3d(".concat(e,"px, ").concat(n,"px, 0)"):"translate(".concat(e,"px, ").concat(n,"px)")}}function zZ(t){var e=t.allowEscapeViewBox,n=t.coordinate,r=t.offsetTop,i=t.offsetLeft,s=t.position,a=t.reverseDirection,o=t.tooltipBox,l=t.useTranslate3d,c=t.viewBox,d,f,p;return o.height>0&&o.width>0&&n?(f=Pk({allowEscapeViewBox:e,coordinate:n,key:"x",offset:i,position:s,reverseDirection:a,tooltipDimension:o.width,viewBox:c,viewBoxDimension:c.width}),p=Pk({allowEscapeViewBox:e,coordinate:n,key:"y",offset:r,position:s,reverseDirection:a,tooltipDimension:o.height,viewBox:c,viewBoxDimension:c.height}),d=FZ({translateX:f,translateY:p,useTranslate3d:l})):d=UZ,{cssProperties:d,cssClasses:jZ({translateX:f,translateY:p,coordinate:n})}}var BZ=()=>!(typeof window<"u"&&window.document&&window.document.createElement&&window.setTimeout),Jy={isSsr:BZ()};function HZ(t,e){return $Z(t)||WZ(t,e)||GZ(t,e)||VZ()}function VZ(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function GZ(t,e){if(t){if(typeof t=="string")return Ck(t,e);var n={}.toString.call(t).slice(8,-1);return n==="Object"&&t.constructor&&(n=t.constructor.name),n==="Map"||n==="Set"?Array.from(t):n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Ck(t,e):void 0}}function Ck(t,e){(e==null||e>t.length)&&(e=t.length);for(var n=0,r=Array(e);nJy.isSsr||!window.matchMedia?!1:window.matchMedia("(prefers-reduced-motion: reduce)").matches),e=HZ(t,2),n=e[0],r=e[1];return R.useEffect(()=>{if(window.matchMedia){var i=window.matchMedia("(prefers-reduced-motion: reduce)"),s=()=>{r(i.matches)};return i.addEventListener("change",s),()=>{i.removeEventListener("change",s)}}},[]),n}function Rk(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(t,i).enumerable})),n.push.apply(n,r)}return n}function om(t){for(var e=1;et.length)&&(e=t.length);for(var n=0,r=Array(e);n({dismissed:!1,dismissedAtCoordinate:{x:0,y:0}})),c=YZ(l,2),d=c[0],f=c[1];R.useEffect(()=>{var x=M=>{if(M.key==="Escape"){var T,P,O,N;f({dismissed:!0,dismissedAtCoordinate:{x:(T=(P=t.coordinate)===null||P===void 0?void 0:P.x)!==null&&T!==void 0?T:0,y:(O=(N=t.coordinate)===null||N===void 0?void 0:N.y)!==null&&O!==void 0?O:0}})}};return document.addEventListener("keydown",x),()=>{document.removeEventListener("keydown",x)}},[(e=t.coordinate)===null||e===void 0?void 0:e.x,(n=t.coordinate)===null||n===void 0?void 0:n.y]),d.dismissed&&(((r=(i=t.coordinate)===null||i===void 0?void 0:i.x)!==null&&r!==void 0?r:0)!==d.dismissedAtCoordinate.x||((s=(a=t.coordinate)===null||a===void 0?void 0:a.y)!==null&&s!==void 0?s:0)!==d.dismissedAtCoordinate.y)&&f(om(om({},d),{},{dismissed:!1}));var p=zZ({allowEscapeViewBox:t.allowEscapeViewBox,coordinate:t.coordinate,offsetLeft:typeof t.offset=="number"?t.offset:t.offset.x,offsetTop:typeof t.offset=="number"?t.offset:t.offset.y,position:t.position,reverseDirection:t.reverseDirection,tooltipBox:{height:t.lastBoundingBox.height,width:t.lastBoundingBox.width},useTranslate3d:t.useTranslate3d,viewBox:t.viewBox}),y=p.cssClasses,b=p.cssProperties,S=t.hasPortalFromProps?{}:om(om({transition:tQ({prefersReducedMotion:o,isAnimationActive:t.isAnimationActive,active:t.active,animationDuration:t.animationDuration,animationEasing:t.animationEasing})},b),{},{pointerEvents:"none",position:"absolute",top:0,left:0}),w=om(om({},S),{},{visibility:!d.dismissed&&t.active&&t.hasPayload?"visible":"hidden"},t.wrapperStyle);return R.createElement("div",{xmlns:"http://www.w3.org/1999/xhtml",tabIndex:-1,className:y,style:w,ref:t.innerRef},t.children)}var rQ=R.memo(nQ),k4=()=>{var t;return(t=Ft(e=>e.rootProps.accessibilityLayer))!==null&&t!==void 0?t:!0};function yP(){return yP=Object.assign?Object.assign.bind():function(t){for(var e=1;ewn(t.x)&&wn(t.y),Lk=t=>t.base!=null&&Mw(t.base)&&Mw(t),a0=t=>t.x,o0=t=>t.y,oQ=(t,e)=>{if(typeof t=="function")return t;var n="curve".concat(OC(t));if((n==="curveMonotone"||n==="curveBump")&&e){var r=Ok["".concat(n).concat(e==="vertical"?"Y":"X")];if(r)return r}return Ok[n]||J1},Dk={connectNulls:!1,type:"linear"},lQ=t=>{var e=t.type,n=e===void 0?Dk.type:e,r=t.points,i=r===void 0?[]:r,s=t.baseLine,a=t.layout,o=t.connectNulls,l=o===void 0?Dk.connectNulls:o,c=oQ(n,a),d=l?i.filter(Mw):i;if(Array.isArray(s)){var f,p=i.map((x,M)=>kk(kk({},x),{},{base:s[M]}));a==="vertical"?f=wb().y(o0).x1(a0).x0(x=>x.base.x):f=wb().x(a0).y1(o0).y0(x=>x.base.y);var y=f.defined(Lk).curve(c),b=l?p.filter(Lk):p;return y(b)}var S;a==="vertical"&&kt(s)?S=wb().y(o0).x1(a0).x0(s):kt(s)?S=wb().x(a0).y1(o0).y0(s):S=l5().x(a0).y(o0);var w=S.defined(Mw).curve(c);return w(d)},G_=t=>{var e=t.className,n=t.points,r=t.path,i=t.pathRef,s=Vg();if((!n||!n.length)&&!r)return null;var a={type:t.type,points:t.points,baseLine:t.baseLine,layout:t.layout||s,connectNulls:t.connectNulls},o=n&&n.length?lQ(a):r;return R.createElement("path",yP({},zo(t),LC(t),{className:tr("recharts-curve",e),d:o===null?void 0:o,ref:i}))},cQ=["x","y","top","left","width","height","className"];function xP(){return xP=Object.assign?Object.assign.bind():function(t){for(var e=1;e"M".concat(t,",").concat(i,"v").concat(r,"M").concat(s,",").concat(e,"h").concat(n),vQ=t=>{var e=t.x,n=e===void 0?0:e,r=t.y,i=r===void 0?0:r,s=t.top,a=s===void 0?0:s,o=t.left,l=o===void 0?0:o,c=t.width,d=c===void 0?0:c,f=t.height,p=f===void 0?0:f,y=t.className,b=pQ(t,cQ),S=uQ({x:n,y:i,top:a,left:l,width:d,height:p},b);return!kt(n)||!kt(i)||!kt(d)||!kt(p)||!kt(a)||!kt(l)?null:R.createElement("path",xP({},Xa(S),{className:tr("recharts-cross",y),d:gQ(n,i,d,p,a,l)}))};function yQ(t,e,n,r){var i=r/2;return{stroke:"none",fill:"#ccc",x:t==="horizontal"?e.x-i:n.left+.5,y:t==="horizontal"?n.top+.5:e.y-i,width:t==="horizontal"?r:n.width-1,height:t==="horizontal"?n.height-1:r}}var Ew=1e-4,O4=(t,e)=>[0,3*t,3*e-6*t,3*t-3*e+1],L4=(t,e)=>t.map((n,r)=>n*e**r).reduce((n,r)=>n+r),jk=(t,e)=>n=>{var r=O4(t,e);return L4(r,n)},xQ=(t,e)=>n=>{var r=O4(t,e),i=[...r.map((s,a)=>s*a).slice(1),0];return L4(i,n)},bQ=t=>{var e,n=t.split("(");if(n.length!==2||n[0]!=="cubic-bezier")return null;var r=(e=n[1])===null||e===void 0||(e=e.split(")")[0])===null||e===void 0?void 0:e.split(",");if(r==null||r.length!==4)return null;var i=r.map(s=>parseFloat(s));return[i[0],i[1],i[2],i[3]]},_Q=function(){for(var e=arguments.length,n=new Array(e),r=0;r{var i=jk(t,n),s=jk(e,r),a=xQ(t,n),o=c=>c>1?1:c<0?0:c,l=c=>{for(var d=c>1?1:c,f=d,p=0;p<8;++p){var y=i(f)-d,b=a(f);if(Math.abs(y-d)0&&arguments[0]!==void 0?arguments[0]:{},n=e.stiff,r=n===void 0?100:n,i=e.damping,s=i===void 0?8:i,a=e.dt,o=a===void 0?16.67:a,l=1,c=[0],d=0,f=0,p=1e4,y=0;y{var M,T,P;if(x<=0)return 0;if(x>=1)return l;var O=x*w,N=Math.floor(O),D=O-N;return((M=c[N])!==null&&M!==void 0?M:0)+(((T=c[N+1])!==null&&T!==void 0?T:0)-((P=c[N])!==null&&P!==void 0?P:0))*D}},MQ=t=>{if(typeof t=="string")switch(t){case"ease":case"ease-in-out":case"ease-out":case"ease-in":case"linear":return Fk(t);case"spring":return SQ();default:if(t.split("(")[0]==="cubic-bezier")return Fk(t)}return typeof t=="function"?t:null},EQ=(t,e,n)=>{var r,i=s=>{var a=e.tick(s);if(e.getState()==="active"){if(n(e.getInterpolated()),e.getProgress()===1){e.complete(),r=void 0;return}r=t.setTimeout(i,a);return}r=t.setTimeout(i,a)};return r=t.setTimeout(i,0),()=>{var s;return(s=r)===null||s===void 0?void 0:s()}},D4=R.createContext(EQ);D4.Provider;function AQ(t){var e=R.useContext(D4);return R.useMemo(()=>t??e,[t,e])}function TQ(t,e,n){return(e=PQ(e))in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function PQ(t){var e=CQ(t,"string");return typeof e=="symbol"?e:e+""}function CQ(t,e){if(typeof t!="object"||!t)return t;var n=t[Symbol.toPrimitive];if(n!==void 0){var r=n.call(t,e);if(typeof r!="object")return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return(e==="string"?String:Number)(t)}var zk="init",Bk="pending",Hk="active",RQ="completed";function TE(t){return Math.max(0,t)}class NQ{getAnimationStartedTime(){return this.animationStartedTime}getBeginStartedTime(){return this.beginStartedTime}constructor(e){var n;TQ(this,"state",zk),this.animationId=e.animationId,this.onAnimationEnd=e.onAnimationEnd,this.animationDuration=TE(e.animationDuration),this.animationBegin=TE(e.animationBegin),this.progress=0,this.from=e.from,this.to=e.to,this.easing=e.easing,(n=e.onAnimationStart)===null||n===void 0||n.call(e)}getState(){return this.state}getEasing(){return this.easing}getAnimationDuration(){return this.animationDuration}tick(e){if(this.getState()===zk)return this.state=Bk,this.beginStartedTime=e,this.animationBegin;if(this.getState()===Bk){if(this.beginStartedTime==null)throw new Error;var n=e-this.beginStartedTime;return n>=this.animationBegin?(this.state=Hk,this.animationStartedTime=e,this.nextAnimationUpdate(0)):TE(this.animationBegin-n)}if(this.getState()===Hk){if(this.animationStartedTime==null)throw new Error;var r=e-this.animationStartedTime;return this.setProgress(r/this.animationDuration),this.nextAnimationUpdate(r)}return 0}setProgress(e){this.progress=Math.min(1,Math.max(0,e))}getProgress(){return this.progress}complete(){if(this.progress=1,this.state==="active"){var e;(e=this.onAnimationEnd)===null||e===void 0||e.call(this)}this.state=RQ}getFrom(){return this.from}getTo(){return this.to}getAnimationId(){return this.animationId}getAnimationBegin(){return this.animationBegin}}class IQ extends NQ{nextAnimationUpdate(){return 0}getInterpolated(){return this.easing(Dc(this.getFrom(),this.getTo(),this.getProgress()))}}class kQ{setTimeout(e){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,r=performance.now(),i=null,s=a=>{a-r>=n?e(a):i=requestAnimationFrame(s)};return i=requestAnimationFrame(s),()=>{i!=null&&cancelAnimationFrame(i)}}}function OQ(t,e){return jQ(t)||UQ(t,e)||DQ(t,e)||LQ()}function LQ(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function DQ(t,e){if(t){if(typeof t=="string")return Vk(t,e);var n={}.toString.call(t).slice(8,-1);return n==="Object"&&t.constructor&&(n=t.constructor.name),n==="Map"||n==="Set"?Array.from(t):n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Vk(t,e):void 0}}function Vk(t,e){(e==null||e>t.length)&&(e=t.length);for(var n=0,r=Array(e);n{},onAnimationStart:()=>{}},Gk=0,PE=1;function U4(t){var e=Za(t,FQ),n=e.animationId,r=e.isActive,i=e.canBegin,s=e.duration,a=e.easing,o=e.begin,l=e.onAnimationEnd,c=e.onAnimationStart,d=e.children,f=I4(),p=r==="auto"?!Jy.isSsr&&!f:r,y=AQ(e.animationController),b=R.useState(p?Gk:PE),S=OQ(b,2),w=S[0],x=S[1];return R.useEffect(()=>{p||x(PE)},[p]),R.useEffect(()=>{var M=MQ(a);if(!p||!i||M==null)return Hg;var T=new kQ,P=new IQ({animationId:n,easing:M,animationDuration:s,animationBegin:o,onAnimationStart:c,onAnimationEnd:l,from:Gk,to:PE});return y(T,P,x)},[y,n,p,i,s,a,o,c,l]),d(Number(w))}function j4(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"animation-",n=R.useRef(uy(e)),r=R.useRef(t);return r.current!==t&&(n.current=uy(e),r.current=t),n.current}var zQ=t=>t.replace(/([A-Z])/g,e=>"-".concat(e.toLowerCase())),BQ=(t,e,n)=>t.map(r=>"".concat(zQ(r)," ").concat(e,"ms ").concat(n)).join(","),HQ=["radius"],VQ=["radius"],Wk,$k,Xk,qk,Kk,Yk,Zk,Qk,Jk,eO;function tO(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(t,i).enumerable})),n.push.apply(n,r)}return n}function nO(t){for(var e=1;et.length)&&(e=t.length);for(var n=0,r=Array(e);n{var s=yd(n),a=yd(r),o=Math.min(Math.abs(s)/2,Math.abs(a)/2),l=a>=0?1:-1,c=s>=0?1:-1,d=a>=0&&s>=0||a<0&&s<0?1:0,f;if(o>0&&Array.isArray(i)){for(var p=[0,0,0,0],y=0,b=4;yo?o:w}f=Ui(Wk||(Wk=fl(["M",",",""])),t,e+l*p[0]),p[0]>0&&(f+=Ui($k||($k=fl(["A ",",",",0,0,",",",",",""])),p[0],p[0],d,t+c*p[0],e)),f+=Ui(Xk||(Xk=fl(["L ",",",""])),t+n-c*p[1],e),p[1]>0&&(f+=Ui(qk||(qk=fl(["A ",",",",0,0,",`, - `,",",""])),p[1],p[1],d,t+n,e+l*p[1])),f+=Ui(Kk||(Kk=fl(["L ",",",""])),t+n,e+r-l*p[2]),p[2]>0&&(f+=Ui(Yk||(Yk=fl(["A ",",",",0,0,",`, - `,",",""])),p[2],p[2],d,t+n-c*p[2],e+r)),f+=Ui(Zk||(Zk=fl(["L ",",",""])),t+c*p[3],e+r),p[3]>0&&(f+=Ui(Qk||(Qk=fl(["A ",",",",0,0,",`, - `,",",""])),p[3],p[3],d,t,e+r-l*p[3])),f+="Z"}else if(o>0&&i===+i&&i>0){var x=Math.min(o,i);f=Ui(Jk||(Jk=fl(["M ",",",` - A `,",",",0,0,",",",",",` - L `,",",` - A `,",",",0,0,",",",",",` - L `,",",` - A `,",",",0,0,",",",",",` - L `,",",` - A `,",",",0,0,",",",","," Z"])),t,e+l*x,x,x,d,t+c*x,e,t+n-c*x,e,x,x,d,t+n,e+l*x,t+n,e+r-l*x,x,x,d,t+n-c*x,e+r,t+c*x,e+r,x,x,d,t,e+r-l*x)}else f=Ui(eO||(eO=fl(["M ",","," h "," v "," h "," Z"])),t,e,n,r,-n);return f},aO={x:0,y:0,width:0,height:0,radius:0,isAnimationActive:!1,isUpdateAnimationActive:!1,animationBegin:0,animationDuration:1500,animationEasing:"ease"},JQ=t=>{var e=Za(t,aO),n=R.useRef(null),r=R.useState(-1),i=qQ(r,2),s=i[0],a=i[1];R.useEffect(()=>{if(n.current&&n.current.getTotalLength)try{var B=n.current.getTotalLength();B&&a(B)}catch{}},[]);var o=e.x,l=e.y,c=e.width,d=e.height,f=e.radius,p=e.className,y=e.animationEasing,b=e.animationDuration,S=e.animationBegin,w=e.isAnimationActive,x=e.isUpdateAnimationActive,M=R.useRef(c),T=R.useRef(d),P=R.useRef(o),O=R.useRef(l),N=R.useMemo(()=>({x:o,y:l,width:c,height:d,radius:f}),[o,l,c,d,f]),D=j4(N,"rectangle-");if(o!==+o||l!==+l||c!==+c||d!==+d||c===0||d===0)return null;var z=tr("recharts-rectangle",p);if(!x){var V=Xa(e);V.radius;var k=rO(V,HQ);return R.createElement("path",Aw({},k,{x:yd(o),y:yd(l),width:yd(c),height:yd(d),radius:typeof f=="number"?f:void 0,className:z,d:sO(o,l,c,d,f)}))}var j=M.current,X=T.current,ee=P.current,ie=O.current,pe="0px ".concat(s===-1?1:s,"px"),ae="".concat(s,"px ").concat(s,"px"),he=BQ(["strokeDasharray"],b,typeof y=="string"?y:aO.animationEasing);return R.createElement(U4,{animationId:D,key:D,canBegin:s>0,duration:b,easing:y,isActive:x,begin:S},B=>{var J=Dc(j,c,B),Y=Dc(X,d,B),H=Dc(ee,o,B),G=Dc(ie,l,B);n.current&&(M.current=J,T.current=Y,P.current=H,O.current=G);var le;w?B>0?le={transition:he,strokeDasharray:ae}:le={strokeDasharray:pe}:le={strokeDasharray:ae};var se=Xa(e);se.radius;var ce=rO(se,VQ);return R.createElement("path",Aw({},ce,{radius:typeof f=="number"?f:void 0,className:z,d:sO(H,G,J,Y,f),ref:n,style:nO(nO({},le),e.style)}))})};function oO(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(t,i).enumerable})),n.push.apply(n,r)}return n}function lO(t){for(var e=1;et*180/Math.PI,Bi=(t,e,n,r)=>({x:t+Math.cos(-Tw*r)*n,y:e+Math.sin(-Tw*r)*n}),iJ=function(e,n){var r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{top:0,right:0,bottom:0,left:0};return Math.min(Math.abs(e-(r.left||0)-(r.right||0)),Math.abs(n-(r.top||0)-(r.bottom||0)))/2},sJ=(t,e)=>{var n=t.x,r=t.y,i=e.x,s=e.y;return Math.sqrt((n-i)**2+(r-s)**2)},aJ=(t,e)=>{var n=t.x,r=t.y,i=e.cx,s=e.cy,a=sJ({x:n,y:r},{x:i,y:s});if(a<=0)return{radius:a,angle:0};var o=(n-i)/a,l=Math.acos(o);return r>s&&(l=2*Math.PI-l),{radius:a,angle:rJ(l),angleInRadian:l}},oJ=t=>{var e=t.startAngle,n=t.endAngle,r=Math.floor(e/360),i=Math.floor(n/360),s=Math.min(r,i);return{startAngle:e-s*360,endAngle:n-s*360}},lJ=(t,e)=>{var n=e.startAngle,r=e.endAngle,i=Math.floor(n/360),s=Math.floor(r/360),a=Math.min(i,s);return t+a*360},cJ=(t,e)=>{var n=t.relativeX,r=t.relativeY,i=aJ({x:n,y:r},e),s=i.radius,a=i.angle,o=e.innerRadius,l=e.outerRadius;if(sl||s===0)return null;var c=oJ(e),d=c.startAngle,f=c.endAngle,p=a,y;if(d<=f){for(;p>f;)p-=360;for(;p=d&&p<=f}else{for(;p>d;)p-=360;for(;p=f&&p<=d}return y?lO(lO({},e),{},{radius:s,angle:lJ(p,e)}):null};function F4(t){var e=t.cx,n=t.cy,r=t.radius,i=t.startAngle,s=t.endAngle,a=Bi(e,n,r,i),o=Bi(e,n,r,s);return{points:[a,o],cx:e,cy:n,radius:r,startAngle:i,endAngle:s}}var cO,uO,dO,fO,hO,pO,mO;function bP(){return bP=Object.assign?Object.assign.bind():function(t){for(var e=1;e{var n=Va(e-t),r=Math.min(Math.abs(e-t),359.999);return n*r},Rb=t=>{var e=t.cx,n=t.cy,r=t.radius,i=t.angle,s=t.sign,a=t.isExternal,o=t.cornerRadius,l=t.cornerIsExternal,c=o*(a?1:-1)+r,d=Math.asin(o/c)/Tw,f=l?i:i+s*d,p=Bi(e,n,c,f),y=Bi(e,n,r,f),b=l?i-s*d:i,S=Bi(e,n,c*Math.cos(d*Tw),b);return{center:p,circleTangency:y,lineTangency:S,theta:d}},z4=t=>{var e=t.cx,n=t.cy,r=t.innerRadius,i=t.outerRadius,s=t.startAngle,a=t.endAngle,o=uJ(s,a),l=s+o,c=Bi(e,n,i,s),d=Bi(e,n,i,l),f=Ui(cO||(cO=rh(["M ",",",` - A `,",",`,0, - `,",",`, - `,",",` - `])),c.x,c.y,i,i,+(Math.abs(o)>180),+(s>l),d.x,d.y);if(r>0){var p=Bi(e,n,r,s),y=Bi(e,n,r,l);f+=Ui(uO||(uO=rh(["L ",",",` - A `,",",`,0, - `,",",`, - `,","," Z"])),y.x,y.y,r,r,+(Math.abs(o)>180),+(s<=l),p.x,p.y)}else f+=Ui(dO||(dO=rh(["L ",","," Z"])),e,n);return f},dJ=t=>{var e=t.cx,n=t.cy,r=t.innerRadius,i=t.outerRadius,s=t.cornerRadius,a=t.forceCornerRadius,o=t.cornerIsExternal,l=t.startAngle,c=t.endAngle,d=Va(c-l),f=Rb({cx:e,cy:n,radius:i,angle:l,sign:d,cornerRadius:s,cornerIsExternal:o}),p=f.circleTangency,y=f.lineTangency,b=f.theta,S=Rb({cx:e,cy:n,radius:i,angle:c,sign:-d,cornerRadius:s,cornerIsExternal:o}),w=S.circleTangency,x=S.lineTangency,M=S.theta,T=o?Math.abs(l-c):Math.abs(l-c)-b-M;if(T<0)return a?Ui(fO||(fO=rh(["M ",",",` - a`,",",",0,0,1,",`,0 - a`,",",",0,0,1,",`,0 - `])),y.x,y.y,s,s,s*2,s,s,-s*2):z4({cx:e,cy:n,innerRadius:r,outerRadius:i,startAngle:l,endAngle:c});var P=Ui(hO||(hO=rh(["M ",",",` - A`,",",",0,0,",",",",",` - A`,",",",0,",",",",",",",` - A`,",",",0,0,",",",",",` - `])),y.x,y.y,s,s,+(d<0),p.x,p.y,i,i,+(T>180),+(d<0),w.x,w.y,s,s,+(d<0),x.x,x.y);if(r>0){var O=Rb({cx:e,cy:n,radius:r,angle:l,sign:d,isExternal:!0,cornerRadius:s,cornerIsExternal:o}),N=O.circleTangency,D=O.lineTangency,z=O.theta,V=Rb({cx:e,cy:n,radius:r,angle:c,sign:-d,isExternal:!0,cornerRadius:s,cornerIsExternal:o}),k=V.circleTangency,j=V.lineTangency,X=V.theta,ee=o?Math.abs(l-c):Math.abs(l-c)-z-X;if(ee<0&&s===0)return"".concat(P,"L").concat(e,",").concat(n,"Z");P+=Ui(pO||(pO=rh(["L",",",` - A`,",",",0,0,",",",",",` - A`,",",",0,",",",",",",",` - A`,",",",0,0,",",",",","Z"])),j.x,j.y,s,s,+(d<0),k.x,k.y,r,r,+(ee>180),+(d>0),N.x,N.y,s,s,+(d<0),D.x,D.y)}else P+=Ui(mO||(mO=rh(["L",",","Z"])),e,n);return P},fJ={cx:0,cy:0,innerRadius:0,outerRadius:0,startAngle:0,endAngle:0,cornerRadius:0,forceCornerRadius:!1,cornerIsExternal:!1},hJ=t=>{var e=Za(t,fJ),n=e.cx,r=e.cy,i=e.innerRadius,s=e.outerRadius,a=e.cornerRadius,o=e.forceCornerRadius,l=e.cornerIsExternal,c=e.startAngle,d=e.endAngle,f=e.className;if(s0&&Math.abs(c-d)<360?S=dJ({cx:n,cy:r,innerRadius:i,outerRadius:s,cornerRadius:Math.min(b,y/2),forceCornerRadius:o,cornerIsExternal:l,startAngle:c,endAngle:d}):S=z4({cx:n,cy:r,innerRadius:i,outerRadius:s,startAngle:c,endAngle:d}),R.createElement("path",bP({},Xa(e),{className:p,d:S}))};function pJ(t,e,n){if(t==="horizontal")return[{x:e.x,y:n.top},{x:e.x,y:n.top+n.height}];if(t==="vertical")return[{x:n.left,y:e.y},{x:n.left+n.width,y:e.y}];if(_5(e)){if(t==="centric"){var r=e.cx,i=e.cy,s=e.innerRadius,a=e.outerRadius,o=e.angle,l=Bi(r,i,s,o),c=Bi(r,i,a,o);return[{x:l.x,y:l.y},{x:c.x,y:c.y}]}return F4(e)}}function mJ(t){return L5(t)?NaN:Number(t)}function CE(t){return t?(t=mJ(t),t===1/0||t===-1/0?(t<0?-1:1)*Number.MAX_VALUE:t===t?t:0):t===0?t:0}function B4(t,e,n){n&&typeof n!="number"&&eP(t,e,n)&&(e=n=void 0),t=CE(t),e===void 0?(e=t,t=0):e=CE(e),n=n===void 0?tt.chartData,KC=ke([$o],t=>{var e=t.chartData!=null?t.chartData.length-1:0;return{chartData:t.chartData,computedData:t.computedData,dataEndIndex:e,dataStartIndex:0}}),_S=(t,e,n,r)=>r?KC(t):$o(t),gJ=(t,e,n)=>n?KC(t):$o(t),vJ=ke([_S],t=>{var e=t.chartData,n=t.dataStartIndex,r=t.dataEndIndex;return e!=null?e.slice(n,r+1):[]});ke([KC],t=>{var e=t.chartData,n=t.dataStartIndex,r=t.dataEndIndex;return e!=null?e.slice(n,r+1):[]});var yJ=ke([$o],t=>{var e=t.chartData,n=t.dataStartIndex,r=t.dataEndIndex;return e!=null?e.slice(n,r+1):[]});function YC(t,e){return wJ(t)||_J(t,e)||bJ(t,e)||xJ()}function xJ(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function bJ(t,e){if(t){if(typeof t=="string")return gO(t,e);var n={}.toString.call(t).slice(8,-1);return n==="Object"&&t.constructor&&(n=t.constructor.name),n==="Map"||n==="Set"?Array.from(t):n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?gO(t,e):void 0}}function gO(t,e){(e==null||e>t.length)&&(e=t.length);for(var n=0,r=Array(e);nt.e^s.s<0?1:-1;for(r=s.d.length,i=t.d.length,e=0,n=rt.d[e]^s.s<0?1:-1;return r===i?0:r>i^s.s<0?1:-1};Tt.decimalPlaces=Tt.dp=function(){var t=this,e=t.d.length-1,n=(e-t.e)*or;if(e=t.d[e],e)for(;e%10==0;e/=10)n--;return n<0?0:n};Tt.dividedBy=Tt.div=function(t){return Bc(this,new this.constructor(t))};Tt.dividedToIntegerBy=Tt.idiv=function(t){var e=this,n=e.constructor;return Zn(Bc(e,new n(t),0,1),n.precision)};Tt.equals=Tt.eq=function(t){return!this.cmp(t)};Tt.exponent=function(){return Vr(this)};Tt.greaterThan=Tt.gt=function(t){return this.cmp(t)>0};Tt.greaterThanOrEqualTo=Tt.gte=function(t){return this.cmp(t)>=0};Tt.isInteger=Tt.isint=function(){return this.e>this.d.length-2};Tt.isNegative=Tt.isneg=function(){return this.s<0};Tt.isPositive=Tt.ispos=function(){return this.s>0};Tt.isZero=function(){return this.s===0};Tt.lessThan=Tt.lt=function(t){return this.cmp(t)<0};Tt.lessThanOrEqualTo=Tt.lte=function(t){return this.cmp(t)<1};Tt.logarithm=Tt.log=function(t){var e,n=this,r=n.constructor,i=r.precision,s=i+5;if(t===void 0)t=new r(10);else if(t=new r(t),t.s<1||t.eq(va))throw Error(Ka+"NaN");if(n.s<1)throw Error(Ka+(n.s?"NaN":"-Infinity"));return n.eq(va)?new r(0):(dr=!1,e=Bc(vy(n,s),vy(t,s),s),dr=!0,Zn(e,i))};Tt.minus=Tt.sub=function(t){var e=this;return t=new e.constructor(t),e.s==t.s?$4(e,t):G4(e,(t.s=-t.s,t))};Tt.modulo=Tt.mod=function(t){var e,n=this,r=n.constructor,i=r.precision;if(t=new r(t),!t.s)throw Error(Ka+"NaN");return n.s?(dr=!1,e=Bc(n,t,0,1).times(t),dr=!0,n.minus(e)):Zn(new r(n),i)};Tt.naturalExponential=Tt.exp=function(){return W4(this)};Tt.naturalLogarithm=Tt.ln=function(){return vy(this)};Tt.negated=Tt.neg=function(){var t=new this.constructor(this);return t.s=-t.s||0,t};Tt.plus=Tt.add=function(t){var e=this;return t=new e.constructor(t),e.s==t.s?G4(e,t):$4(e,(t.s=-t.s,t))};Tt.precision=Tt.sd=function(t){var e,n,r,i=this;if(t!==void 0&&t!==!!t&&t!==1&&t!==0)throw Error(Mh+t);if(e=Vr(i)+1,r=i.d.length-1,n=r*or+1,r=i.d[r],r){for(;r%10==0;r/=10)n--;for(r=i.d[0];r>=10;r/=10)n++}return t&&e>n?e:n};Tt.squareRoot=Tt.sqrt=function(){var t,e,n,r,i,s,a,o=this,l=o.constructor;if(o.s<1){if(!o.s)return new l(0);throw Error(Ka+"NaN")}for(t=Vr(o),dr=!1,i=Math.sqrt(+o),i==0||i==1/0?(e=Sl(o.d),(e.length+t)%2==0&&(e+="0"),i=Math.sqrt(e),t=Wg((t+1)/2)-(t<0||t%2),i==1/0?e="5e"+t:(e=i.toExponential(),e=e.slice(0,e.indexOf("e")+1)+t),r=new l(e)):r=new l(i.toString()),n=l.precision,i=a=n+3;;)if(s=r,r=s.plus(Bc(o,s,a+2)).times(.5),Sl(s.d).slice(0,a)===(e=Sl(r.d)).slice(0,a)){if(e=e.slice(a-3,a+1),i==a&&e=="4999"){if(Zn(s,n+1,0),s.times(s).eq(o)){r=s;break}}else if(e!="9999")break;a+=4}return dr=!0,Zn(r,n)};Tt.times=Tt.mul=function(t){var e,n,r,i,s,a,o,l,c,d=this,f=d.constructor,p=d.d,y=(t=new f(t)).d;if(!d.s||!t.s)return new f(0);for(t.s*=d.s,n=d.e+t.e,l=p.length,c=y.length,l=0;){for(e=0,i=l+r;i>r;)o=s[i]+y[r]*p[i-r-1]+e,s[i--]=o%vi|0,e=o/vi|0;s[i]=(s[i]+e)%vi|0}for(;!s[--a];)s.pop();return e?++n:s.shift(),t.d=s,t.e=n,dr?Zn(t,f.precision):t};Tt.toDecimalPlaces=Tt.todp=function(t,e){var n=this,r=n.constructor;return n=new r(n),t===void 0?n:(kl(t,0,Gg),e===void 0?e=r.rounding:kl(e,0,8),Zn(n,t+Vr(n)+1,e))};Tt.toExponential=function(t,e){var n,r=this,i=r.constructor;return t===void 0?n=Uh(r,!0):(kl(t,0,Gg),e===void 0?e=i.rounding:kl(e,0,8),r=Zn(new i(r),t+1,e),n=Uh(r,!0,t+1)),n};Tt.toFixed=function(t,e){var n,r,i=this,s=i.constructor;return t===void 0?Uh(i):(kl(t,0,Gg),e===void 0?e=s.rounding:kl(e,0,8),r=Zn(new s(i),t+Vr(i)+1,e),n=Uh(r.abs(),!1,t+Vr(r)+1),i.isneg()&&!i.isZero()?"-"+n:n)};Tt.toInteger=Tt.toint=function(){var t=this,e=t.constructor;return Zn(new e(t),Vr(t)+1,e.rounding)};Tt.toNumber=function(){return+this};Tt.toPower=Tt.pow=function(t){var e,n,r,i,s,a,o=this,l=o.constructor,c=12,d=+(t=new l(t));if(!t.s)return new l(va);if(o=new l(o),!o.s){if(t.s<1)throw Error(Ka+"Infinity");return o}if(o.eq(va))return o;if(r=l.precision,t.eq(va))return Zn(o,r);if(e=t.e,n=t.d.length-1,a=e>=n,s=o.s,a){if((n=d<0?-d:d)<=V4){for(i=new l(va),e=Math.ceil(r/or+4),dr=!1;n%2&&(i=i.times(o),xO(i.d,e)),n=Wg(n/2),n!==0;)o=o.times(o),xO(o.d,e);return dr=!0,t.s<0?new l(va).div(i):Zn(i,r)}}else if(s<0)throw Error(Ka+"NaN");return s=s<0&&t.d[Math.max(e,n)]&1?-1:1,o.s=1,dr=!1,i=t.times(vy(o,r+c)),dr=!0,i=W4(i),i.s=s,i};Tt.toPrecision=function(t,e){var n,r,i=this,s=i.constructor;return t===void 0?(n=Vr(i),r=Uh(i,n<=s.toExpNeg||n>=s.toExpPos)):(kl(t,1,Gg),e===void 0?e=s.rounding:kl(e,0,8),i=Zn(new s(i),t,e),n=Vr(i),r=Uh(i,t<=n||n<=s.toExpNeg,t)),r};Tt.toSignificantDigits=Tt.tosd=function(t,e){var n=this,r=n.constructor;return t===void 0?(t=r.precision,e=r.rounding):(kl(t,1,Gg),e===void 0?e=r.rounding:kl(e,0,8)),Zn(new r(n),t,e)};Tt.toString=Tt.valueOf=Tt.val=Tt.toJSON=Tt[Symbol.for("nodejs.util.inspect.custom")]=function(){var t=this,e=Vr(t),n=t.constructor;return Uh(t,e<=n.toExpNeg||e>=n.toExpPos)};function G4(t,e){var n,r,i,s,a,o,l,c,d=t.constructor,f=d.precision;if(!t.s||!e.s)return e.s||(e=new d(t)),dr?Zn(e,f):e;if(l=t.d,c=e.d,a=t.e,i=e.e,l=l.slice(),s=a-i,s){for(s<0?(r=l,s=-s,o=c.length):(r=c,i=a,o=l.length),a=Math.ceil(f/or),o=a>o?a+1:o+1,s>o&&(s=o,r.length=1),r.reverse();s--;)r.push(0);r.reverse()}for(o=l.length,s=c.length,o-s<0&&(s=o,r=c,c=l,l=r),n=0;s;)n=(l[--s]=l[s]+c[s]+n)/vi|0,l[s]%=vi;for(n&&(l.unshift(n),++i),o=l.length;l[--o]==0;)l.pop();return e.d=l,e.e=i,dr?Zn(e,f):e}function kl(t,e,n){if(t!==~~t||tn)throw Error(Mh+t)}function Sl(t){var e,n,r,i=t.length-1,s="",a=t[0];if(i>0){for(s+=a,e=1;ea?1:-1;else for(o=l=0;oi[o]?1:-1;break}return l}function n(r,i,s){for(var a=0;s--;)r[s]-=a,a=r[s]1;)r.shift()}return function(r,i,s,a){var o,l,c,d,f,p,y,b,S,w,x,M,T,P,O,N,D,z,V=r.constructor,k=r.s==i.s?1:-1,j=r.d,X=i.d;if(!r.s)return new V(r);if(!i.s)throw Error(Ka+"Division by zero");for(l=r.e-i.e,D=X.length,O=j.length,y=new V(k),b=y.d=[],c=0;X[c]==(j[c]||0);)++c;if(X[c]>(j[c]||0)&&--l,s==null?M=s=V.precision:a?M=s+(Vr(r)-Vr(i))+1:M=s,M<0)return new V(0);if(M=M/or+2|0,c=0,D==1)for(d=0,X=X[0],M++;(c1&&(X=t(X,d),j=t(j,d),D=X.length,O=j.length),P=D,S=j.slice(0,D),w=S.length;w=vi/2&&++N;do d=0,o=e(X,S,D,w),o<0?(x=S[0],D!=w&&(x=x*vi+(S[1]||0)),d=x/N|0,d>1?(d>=vi&&(d=vi-1),f=t(X,d),p=f.length,w=S.length,o=e(f,S,p,w),o==1&&(d--,n(f,D16)throw Error(ZC+Vr(t));if(!t.s)return new d(va);for(dr=!1,o=f,a=new d(.03125);t.abs().gte(.1);)t=t.times(a),c+=5;for(r=Math.log(qf(2,c))/Math.LN10*2+5|0,o+=r,n=i=s=new d(va),d.precision=o;;){if(i=Zn(i.times(t),o),n=n.times(++l),a=s.plus(Bc(i,n,o)),Sl(a.d).slice(0,o)===Sl(s.d).slice(0,o)){for(;c--;)s=Zn(s.times(s),o);return d.precision=f,e==null?(dr=!0,Zn(s,f)):s}s=a}}function Vr(t){for(var e=t.e*or,n=t.d[0];n>=10;n/=10)e++;return e}function RE(t,e,n){if(e>t.LN10.sd())throw dr=!0,n&&(t.precision=n),Error(Ka+"LN10 precision limit exceeded");return Zn(new t(t.LN10),e)}function ad(t){for(var e="";t--;)e+="0";return e}function vy(t,e){var n,r,i,s,a,o,l,c,d,f=1,p=10,y=t,b=y.d,S=y.constructor,w=S.precision;if(y.s<1)throw Error(Ka+(y.s?"NaN":"-Infinity"));if(y.eq(va))return new S(0);if(e==null?(dr=!1,c=w):c=e,y.eq(10))return e==null&&(dr=!0),RE(S,c);if(c+=p,S.precision=c,n=Sl(b),r=n.charAt(0),s=Vr(y),Math.abs(s)<15e14){for(;r<7&&r!=1||r==1&&n.charAt(1)>3;)y=y.times(t),n=Sl(y.d),r=n.charAt(0),f++;s=Vr(y),r>1?(y=new S("0."+n),s++):y=new S(r+"."+n.slice(1))}else return l=RE(S,c+2,w).times(s+""),y=vy(new S(r+"."+n.slice(1)),c-p).plus(l),S.precision=w,e==null?(dr=!0,Zn(y,w)):y;for(o=a=y=Bc(y.minus(va),y.plus(va),c),d=Zn(y.times(y),c),i=3;;){if(a=Zn(a.times(d),c),l=o.plus(Bc(a,new S(i),c)),Sl(l.d).slice(0,c)===Sl(o.d).slice(0,c))return o=o.times(2),s!==0&&(o=o.plus(RE(S,c+2,w).times(s+""))),o=Bc(o,new S(f),c),S.precision=w,e==null?(dr=!0,Zn(o,w)):o;o=l,i+=2}}function yO(t,e){var n,r,i;for((n=e.indexOf("."))>-1&&(e=e.replace(".","")),(r=e.search(/e/i))>0?(n<0&&(n=r),n+=+e.slice(r+1),e=e.substring(0,r)):n<0&&(n=e.length),r=0;e.charCodeAt(r)===48;)++r;for(i=e.length;e.charCodeAt(i-1)===48;)--i;if(e=e.slice(r,i),e){if(i-=r,n=n-r-1,t.e=Wg(n/or),t.d=[],r=(n+1)%or,n<0&&(r+=or),rPw||t.e<-Pw))throw Error(ZC+n)}else t.s=0,t.e=0,t.d=[0];return t}function Zn(t,e,n){var r,i,s,a,o,l,c,d,f=t.d;for(a=1,s=f[0];s>=10;s/=10)a++;if(r=e-a,r<0)r+=or,i=e,c=f[d=0];else{if(d=Math.ceil((r+1)/or),s=f.length,d>=s)return t;for(c=s=f[d],a=1;s>=10;s/=10)a++;r%=or,i=r-or+a}if(n!==void 0&&(s=qf(10,a-i-1),o=c/s%10|0,l=e<0||f[d+1]!==void 0||c%s,l=n<4?(o||l)&&(n==0||n==(t.s<0?3:2)):o>5||o==5&&(n==4||l||n==6&&(r>0?i>0?c/qf(10,a-i):0:f[d-1])%10&1||n==(t.s<0?8:7))),e<1||!f[0])return l?(s=Vr(t),f.length=1,e=e-s-1,f[0]=qf(10,(or-e%or)%or),t.e=Wg(-e/or)||0):(f.length=1,f[0]=t.e=t.s=0),t;if(r==0?(f.length=d,s=1,d--):(f.length=d+1,s=qf(10,or-r),f[d]=i>0?(c/qf(10,a-i)%qf(10,i)|0)*s:0),l)for(;;)if(d==0){(f[0]+=s)==vi&&(f[0]=1,++t.e);break}else{if(f[d]+=s,f[d]!=vi)break;f[d--]=0,s=1}for(r=f.length;f[--r]===0;)f.pop();if(dr&&(t.e>Pw||t.e<-Pw))throw Error(ZC+Vr(t));return t}function $4(t,e){var n,r,i,s,a,o,l,c,d,f,p=t.constructor,y=p.precision;if(!t.s||!e.s)return e.s?e.s=-e.s:e=new p(t),dr?Zn(e,y):e;if(l=t.d,f=e.d,r=e.e,c=t.e,l=l.slice(),a=c-r,a){for(d=a<0,d?(n=l,a=-a,o=f.length):(n=f,r=c,o=l.length),i=Math.max(Math.ceil(y/or),o)+2,a>i&&(a=i,n.length=1),n.reverse(),i=a;i--;)n.push(0);n.reverse()}else{for(i=l.length,o=f.length,d=i0;--i)l[o++]=0;for(i=f.length;i>a;){if(l[--i]0?s=s.charAt(0)+"."+s.slice(1)+ad(r):a>1&&(s=s.charAt(0)+"."+s.slice(1)),s=s+(i<0?"e":"e+")+i):i<0?(s="0."+ad(-i-1)+s,n&&(r=n-a)>0&&(s+=ad(r))):i>=a?(s+=ad(i+1-a),n&&(r=n-i-1)>0&&(s=s+"."+ad(r))):((r=i+1)0&&(i+1===a&&(s+="."),s+=ad(r))),t.s<0?"-"+s:s}function xO(t,e){if(t.length>e)return t.length=e,!0}function X4(t){var e,n,r;function i(s){var a=this;if(!(a instanceof i))return new i(s);if(a.constructor=i,s instanceof i){a.s=s.s,a.e=s.e,a.d=(s=s.d)?s.slice():s;return}if(typeof s=="number"){if(s*0!==0)throw Error(Mh+s);if(s>0)a.s=1;else if(s<0)s=-s,a.s=-1;else{a.s=0,a.e=0,a.d=[0];return}if(s===~~s&&s<1e7){a.e=0,a.d=[s];return}return yO(a,s.toString())}else if(typeof s!="string")throw Error(Mh+s);if(s.charCodeAt(0)===45?(s=s.slice(1),a.s=-1):a.s=1,EJ.test(s))yO(a,s);else throw Error(Mh+s)}if(i.prototype=Tt,i.ROUND_UP=0,i.ROUND_DOWN=1,i.ROUND_CEIL=2,i.ROUND_FLOOR=3,i.ROUND_HALF_UP=4,i.ROUND_HALF_DOWN=5,i.ROUND_HALF_EVEN=6,i.ROUND_HALF_CEIL=7,i.ROUND_HALF_FLOOR=8,i.clone=X4,i.config=i.set=AJ,t===void 0&&(t={}),t)for(r=["precision","rounding","toExpNeg","toExpPos","LN10"],e=0;e=i[e+1]&&r<=i[e+2])this[n]=r;else throw Error(Mh+n+": "+r);if((r=t[n="LN10"])!==void 0)if(r==Math.LN10)this[n]=new this(r);else throw Error(Mh+n+": "+r);return this}var QC=X4(MJ);va=new QC(1);const Tn=QC;function q4(t){var e;return t===0?e=1:e=Math.floor(new Tn(t).abs().log(10).toNumber())+1,e}function K4(t,e,n){for(var r=new Tn(t),i=0,s=[];r.lt(e)&&i<1e5;)s.push(r.toNumber()),r=r.add(n),i++;return s}function yy(t,e){return RJ(t)||CJ(t,e)||PJ(t,e)||TJ()}function TJ(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function PJ(t,e){if(t){if(typeof t=="string")return bO(t,e);var n={}.toString.call(t).slice(8,-1);return n==="Object"&&t.constructor&&(n=t.constructor.name),n==="Map"||n==="Set"?Array.from(t):n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?bO(t,e):void 0}}function bO(t,e){(e==null||e>t.length)&&(e=t.length);for(var n=0,r=Array(e);n{var e=yy(t,2),n=e[0],r=e[1],i=n,s=r;return n>r&&(i=r,s=n),[i,s]},JC=(t,e,n)=>{if(t.lte(0))return new Tn(0);var r=q4(t.toNumber()),i=new Tn(10).pow(r),s=t.div(i),a=r!==1?.05:.1,o=new Tn(Math.ceil(s.div(a).toNumber())).add(n).mul(a),l=o.mul(i);return e?new Tn(l.toNumber()):new Tn(Math.ceil(l.toNumber()))},Z4=(t,e,n)=>{var r;if(t.lte(0))return new Tn(0);var i=[1,2,2.5,5],s=t.toNumber(),a=Math.floor(new Tn(s).abs().log(10).toNumber()),o=new Tn(10).pow(a),l=t.div(o).toNumber(),c=i.findIndex(y=>y>=l-1e-10);if(c===-1&&(o=o.mul(10),c=0),c+=n,c>=i.length){var d=Math.floor(c/i.length);c%=i.length,o=o.mul(new Tn(10).pow(d))}var f=(r=i[c])!==null&&r!==void 0?r:1,p=new Tn(f).mul(o);return e?p:new Tn(Math.ceil(p.toNumber()))},NJ=(t,e,n)=>{var r=new Tn(1),i=new Tn(t);if(!i.isint()&&n){var s=Math.abs(t);s<1?(r=new Tn(10).pow(q4(t)-1),i=new Tn(Math.floor(i.div(r).toNumber())).mul(r)):s>1&&(i=new Tn(Math.floor(t)))}else t===0?i=new Tn(Math.floor((e-1)/2)):n||(i=new Tn(Math.floor(t)));for(var a=Math.floor((e-1)/2),o=[],l=0;l4&&arguments[4]!==void 0?arguments[4]:0,a=arguments.length>5&&arguments[5]!==void 0?arguments[5]:JC;if(!Number.isFinite((n-e)/(r-1)))return{step:new Tn(0),tickMin:new Tn(0),tickMax:new Tn(0)};var o=a(new Tn(n).sub(e).div(r-1),i,s),l;e<=0&&n>=0?l=new Tn(0):(l=new Tn(e).add(n).div(2),l=l.sub(new Tn(l).mod(o)));var c=Math.ceil(l.sub(e).div(o).toNumber()),d=Math.ceil(new Tn(n).sub(l).div(o).toNumber()),f=c+d+1;return f>r?Q4(e,n,r,i,s+1,a):(f0?d+(r-f):d,c=n>0?c:c+(r-f)),{step:o,tickMin:l.sub(new Tn(c).mul(o)),tickMax:l.add(new Tn(d).mul(o))})},_O=function(e){var n=yy(e,2),r=n[0],i=n[1],s=arguments.length>1&&arguments[1]!==void 0?arguments[1]:6,a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,o=arguments.length>3&&arguments[3]!==void 0?arguments[3]:"auto",l=Math.max(s,2),c=Y4([r,i]),d=yy(c,2),f=d[0],p=d[1];if(f===-1/0||p===1/0){var y=p===1/0?[f,...Array(s-1).fill(1/0)]:[...Array(s-1).fill(-1/0),p];return r>i?y.reverse():y}if(f===p)return NJ(f,s,a);var b=o==="snap125"?Z4:JC,S=Q4(f,p,l,a,0,b),w=S.step,x=S.tickMin,M=S.tickMax,T=K4(x,M.add(new Tn(.1).mul(w)),w);return r>i?T.reverse():T},wO=function(e,n){var r=yy(e,2),i=r[0],s=r[1],a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,o=arguments.length>3&&arguments[3]!==void 0?arguments[3]:"auto",l=Y4([i,s]),c=yy(l,2),d=c[0],f=c[1];if(d===-1/0||f===1/0)return[i,s];if(d===f)return[d];var p=o==="snap125"?Z4:JC,y=Math.max(n,2),b=p(new Tn(f).sub(d).div(y-1),a,0),S=[...K4(new Tn(d),new Tn(f),b),f];return a===!1&&(S=S.map(w=>Math.round(w))),i>s?S.reverse():S},IJ=t=>t.rootProps.barCategoryGap,wS=t=>t.rootProps.stackOffset,J4=t=>t.rootProps.reverseStackOrder,e2=t=>t.options.chartName,t2=t=>t.rootProps.syncId,ez=t=>t.rootProps.syncMethod,n2=t=>t.options.eventEmitter,kJ=t=>t.rootProps.baseValue,Ms={grid:-100,barBackground:-50,area:100,cursorRectangle:200,bar:300,line:400,axis:500,scatter:600,activeBar:1e3,cursorLine:1100,activeDot:1200,label:2e3},Mf={allowDecimals:!1,allowDataOverflow:!1,angleAxisId:0,reversed:!1,scale:"auto",tick:!0,type:"auto"},hl={allowDataOverflow:!1,allowDecimals:!1,allowDuplicatedCategory:!0,includeHidden:!1,radiusAxisId:0,reversed:!1,scale:"auto",tick:!0,tickCount:5,type:"auto"},SS=(t,e)=>{if(!(!t||!e))return t!=null&&t.reversed?[e[1],e[0]]:e};function MS(t,e,n){if(n!=="auto")return n;if(t!=null)return jl(t,e)?"category":"number"}function SO(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(t,i).enumerable})),n.push.apply(n,r)}return n}function Cw(t){for(var e=1;e{if(e!=null)return t.polarAxis.angleAxis[e]},r2=ke([UJ,M4],(t,e)=>{var n;if(t!=null)return t;var r=(n=MS(e,"angleAxis",MO.type))!==null&&n!==void 0?n:"category";return Cw(Cw({},MO),{},{type:r})}),jJ=(t,e)=>t.polarAxis.radiusAxis[e],i2=ke([jJ,M4],(t,e)=>{var n;if(t!=null)return t;var r=(n=MS(e,"radiusAxis",EO.type))!==null&&n!==void 0?n:"category";return Cw(Cw({},EO),{},{type:r})}),ES=t=>t.polarOptions,s2=ke([Jc,eu,Wi],iJ),tz=ke([ES,s2],(t,e)=>{if(t!=null)return Td(t.innerRadius,e,0)}),nz=ke([ES,s2],(t,e)=>{if(t!=null)return Td(t.outerRadius,e,e*.8)}),FJ=t=>{if(t==null)return[0,0];var e=t.startAngle,n=t.endAngle;return[e,n]},rz=ke([ES],FJ);ke([r2,rz],SS);var iz=ke([s2,tz,nz],(t,e,n)=>{if(!(t==null||e==null||n==null))return[e,n]});ke([i2,iz],SS);var sz=ke([hr,ES,tz,nz,Jc,eu],(t,e,n,r,i,s)=>{if(!(t!=="centric"&&t!=="radial"||e==null||n==null||r==null)){var a=e.cx,o=e.cy,l=e.startAngle,c=e.endAngle;return{cx:Td(a,i,i/2),cy:Td(o,s,s/2),innerRadius:n,outerRadius:r,startAngle:l,endAngle:c,clockWise:!1}}}),_i=(t,e)=>e,AS=(t,e,n)=>n;function a2(t){return t==null?void 0:t.id}function az(t,e,n){var r=e.chartData,i=r===void 0?[]:r,s=n.allowDuplicatedCategory,a=n.dataKey,o=new Map;return t.forEach(l=>{var c,d=(c=l.data)!==null&&c!==void 0?c:i;if(!(d==null||d.length===0)){var f=a2(l);d.forEach((p,y)=>{var b=a==null||s?y:String(yi(p,a,null)),S=yi(p,l.dataKey,0),w;o.has(b)?w=o.get(b):w={},Object.assign(w,{[f]:S}),o.set(b,w)})}}),Array.from(o.values())}function o2(t){return"stackId"in t&&t.stackId!=null&&t.dataKey!=null}var TS=(t,e)=>t===e?!0:t==null||e==null?!1:t[0]===e[0]&&t[1]===e[1];function PS(t,e){return Array.isArray(t)&&Array.isArray(e)&&t.length===0&&e.length===0?!0:t===e}function zJ(t,e){if(t.length===e.length){for(var n=0;n{var e=hr(t);return e==="horizontal"?"xAxis":e==="vertical"?"yAxis":e==="centric"?"angleAxis":"radiusAxis"},$g=t=>t.tooltip.settings.axisId;function l2(t){if(t!=null){var e=t.ticks,n=t.bandwidth,r=t.range(),i=[Math.min(...r),Math.max(...r)];return{domain:()=>t.domain(),range:(function(s){function a(){return s.apply(this,arguments)}return a.toString=function(){return s.toString()},a})(()=>i),rangeMin:()=>i[0],rangeMax:()=>i[1],isInRange(s){var a=i[0],o=i[1];return a<=o?s>=a&&s<=o:s>=o&&s<=a},bandwidth:n?()=>n.call(t):void 0,ticks:e?s=>e.call(t,s):void 0,map:(s,a)=>{var o=t(s);if(o!=null){if(t.bandwidth&&a!==null&&a!==void 0&&a.position){var l=t.bandwidth();switch(a.position){case"middle":o+=l/2;break;case"end":o+=l;break}}return o}}}}}var BJ=(t,e)=>{if(e!=null)switch(t){case"linear":{if(!El(e)){for(var n,r,i=0;ir)&&(r=s))}return n!==void 0&&r!==void 0?[n,r]:void 0}return e}default:return e}};function _d(t,e){return t==null||e==null?NaN:te?1:t>=e?0:NaN}function HJ(t,e){return t==null||e==null?NaN:et?1:e>=t?0:NaN}function c2(t){let e,n,r;t.length!==2?(e=_d,n=(o,l)=>_d(t(o),l),r=(o,l)=>t(o)-l):(e=t===_d||t===HJ?t:VJ,n=t,r=t);function i(o,l,c=0,d=o.length){if(c>>1;n(o[f],l)<0?c=f+1:d=f}while(c>>1;n(o[f],l)<=0?c=f+1:d=f}while(cc&&r(o[f-1],l)>-r(o[f],l)?f-1:f}return{left:i,center:a,right:s}}function VJ(){return 0}function oz(t){return t===null?NaN:+t}function*GJ(t,e){for(let n of t)n!=null&&(n=+n)>=n&&(yield n)}const WJ=c2(_d),ex=WJ.right;c2(oz).center;class AO extends Map{constructor(e,n=qJ){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:n}}),e!=null)for(const[r,i]of e)this.set(r,i)}get(e){return super.get(TO(this,e))}has(e){return super.has(TO(this,e))}set(e,n){return super.set($J(this,e),n)}delete(e){return super.delete(XJ(this,e))}}function TO({_intern:t,_key:e},n){const r=e(n);return t.has(r)?t.get(r):n}function $J({_intern:t,_key:e},n){const r=e(n);return t.has(r)?t.get(r):(t.set(r,n),n)}function XJ({_intern:t,_key:e},n){const r=e(n);return t.has(r)&&(n=t.get(r),t.delete(r)),n}function qJ(t){return t!==null&&typeof t=="object"?t.valueOf():t}function KJ(t=_d){if(t===_d)return lz;if(typeof t!="function")throw new TypeError("compare is not a function");return(e,n)=>{const r=t(e,n);return r||r===0?r:(t(n,n)===0)-(t(e,e)===0)}}function lz(t,e){return(t==null||!(t>=t))-(e==null||!(e>=e))||(te?1:0)}const YJ=Math.sqrt(50),ZJ=Math.sqrt(10),QJ=Math.sqrt(2);function Rw(t,e,n){const r=(e-t)/Math.max(0,n),i=Math.floor(Math.log10(r)),s=r/Math.pow(10,i),a=s>=YJ?10:s>=ZJ?5:s>=QJ?2:1;let o,l,c;return i<0?(c=Math.pow(10,-i)/a,o=Math.round(t*c),l=Math.round(e*c),o/ce&&--l,c=-c):(c=Math.pow(10,i)*a,o=Math.round(t/c),l=Math.round(e/c),o*ce&&--l),l0))return[];if(t===e)return[t];const r=e=i))return[];const o=s-i+1,l=new Array(o);if(r)if(a<0)for(let c=0;c=r)&&(n=r);return n}function CO(t,e){let n;for(const r of t)r!=null&&(n>r||n===void 0&&r>=r)&&(n=r);return n}function cz(t,e,n=0,r=1/0,i){if(e=Math.floor(e),n=Math.floor(Math.max(0,n)),r=Math.floor(Math.min(t.length-1,r)),!(n<=e&&e<=r))return t;for(i=i===void 0?lz:KJ(i);r>n;){if(r-n>600){const l=r-n+1,c=e-n+1,d=Math.log(l),f=.5*Math.exp(2*d/3),p=.5*Math.sqrt(d*f*(l-f)/l)*(c-l/2<0?-1:1),y=Math.max(n,Math.floor(e-c*f/l+p)),b=Math.min(r,Math.floor(e+(l-c)*f/l+p));cz(t,e,y,b,i)}const s=t[e];let a=n,o=r;for(l0(t,n,e),i(t[r],s)>0&&l0(t,n,r);a0;)--o}i(t[n],s)===0?l0(t,n,o):(++o,l0(t,o,r)),o<=e&&(n=o+1),e<=o&&(r=o-1)}return t}function l0(t,e,n){const r=t[e];t[e]=t[n],t[n]=r}function JJ(t,e,n){if(t=Float64Array.from(GJ(t)),!(!(r=t.length)||isNaN(e=+e))){if(e<=0||r<2)return CO(t);if(e>=1)return PO(t);var r,i=(r-1)*e,s=Math.floor(i),a=PO(cz(t,s).subarray(0,s+1)),o=CO(t.subarray(s+1));return a+(o-a)*(i-s)}}function eee(t,e,n=oz){if(!(!(r=t.length)||isNaN(e=+e))){if(e<=0||r<2)return+n(t[0],0,t);if(e>=1)return+n(t[r-1],r-1,t);var r,i=(r-1)*e,s=Math.floor(i),a=+n(t[s],s,t),o=+n(t[s+1],s+1,t);return a+(o-a)*(i-s)}}function tee(t,e,n){t=+t,e=+e,n=(i=arguments.length)<2?(e=t,t=0,1):i<3?1:+n;for(var r=-1,i=Math.max(0,Math.ceil((e-t)/n))|0,s=new Array(i);++r>8&15|e>>4&240,e>>4&15|e&240,(e&15)<<4|e&15,1):n===8?Nb(e>>24&255,e>>16&255,e>>8&255,(e&255)/255):n===4?Nb(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|e&240,((e&15)<<4|e&15)/255):null):(e=iee.exec(t))?new Zs(e[1],e[2],e[3],1):(e=see.exec(t))?new Zs(e[1]*255/100,e[2]*255/100,e[3]*255/100,1):(e=aee.exec(t))?Nb(e[1],e[2],e[3],e[4]):(e=oee.exec(t))?Nb(e[1]*255/100,e[2]*255/100,e[3]*255/100,e[4]):(e=lee.exec(t))?DO(e[1],e[2]/100,e[3]/100,1):(e=cee.exec(t))?DO(e[1],e[2]/100,e[3]/100,e[4]):RO.hasOwnProperty(t)?kO(RO[t]):t==="transparent"?new Zs(NaN,NaN,NaN,0):null}function kO(t){return new Zs(t>>16&255,t>>8&255,t&255,1)}function Nb(t,e,n,r){return r<=0&&(t=e=n=NaN),new Zs(t,e,n,r)}function fee(t){return t instanceof tx||(t=_y(t)),t?(t=t.rgb(),new Zs(t.r,t.g,t.b,t.opacity)):new Zs}function EP(t,e,n,r){return arguments.length===1?fee(t):new Zs(t,e,n,r??1)}function Zs(t,e,n,r){this.r=+t,this.g=+e,this.b=+n,this.opacity=+r}f2(Zs,EP,dz(tx,{brighter(t){return t=t==null?Nw:Math.pow(Nw,t),new Zs(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=t==null?xy:Math.pow(xy,t),new Zs(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new Zs(Eh(this.r),Eh(this.g),Eh(this.b),Iw(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:OO,formatHex:OO,formatHex8:hee,formatRgb:LO,toString:LO}));function OO(){return`#${ih(this.r)}${ih(this.g)}${ih(this.b)}`}function hee(){return`#${ih(this.r)}${ih(this.g)}${ih(this.b)}${ih((isNaN(this.opacity)?1:this.opacity)*255)}`}function LO(){const t=Iw(this.opacity);return`${t===1?"rgb(":"rgba("}${Eh(this.r)}, ${Eh(this.g)}, ${Eh(this.b)}${t===1?")":`, ${t})`}`}function Iw(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function Eh(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function ih(t){return t=Eh(t),(t<16?"0":"")+t.toString(16)}function DO(t,e,n,r){return r<=0?t=e=n=NaN:n<=0||n>=1?t=e=NaN:e<=0&&(t=NaN),new Fo(t,e,n,r)}function fz(t){if(t instanceof Fo)return new Fo(t.h,t.s,t.l,t.opacity);if(t instanceof tx||(t=_y(t)),!t)return new Fo;if(t instanceof Fo)return t;t=t.rgb();var e=t.r/255,n=t.g/255,r=t.b/255,i=Math.min(e,n,r),s=Math.max(e,n,r),a=NaN,o=s-i,l=(s+i)/2;return o?(e===s?a=(n-r)/o+(n0&&l<1?0:a,new Fo(a,o,l,t.opacity)}function pee(t,e,n,r){return arguments.length===1?fz(t):new Fo(t,e,n,r??1)}function Fo(t,e,n,r){this.h=+t,this.s=+e,this.l=+n,this.opacity=+r}f2(Fo,pee,dz(tx,{brighter(t){return t=t==null?Nw:Math.pow(Nw,t),new Fo(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=t==null?xy:Math.pow(xy,t),new Fo(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+(this.h<0)*360,e=isNaN(t)||isNaN(this.s)?0:this.s,n=this.l,r=n+(n<.5?n:1-n)*e,i=2*n-r;return new Zs(NE(t>=240?t-240:t+120,i,r),NE(t,i,r),NE(t<120?t+240:t-120,i,r),this.opacity)},clamp(){return new Fo(UO(this.h),Ib(this.s),Ib(this.l),Iw(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const t=Iw(this.opacity);return`${t===1?"hsl(":"hsla("}${UO(this.h)}, ${Ib(this.s)*100}%, ${Ib(this.l)*100}%${t===1?")":`, ${t})`}`}}));function UO(t){return t=(t||0)%360,t<0?t+360:t}function Ib(t){return Math.max(0,Math.min(1,t||0))}function NE(t,e,n){return(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)*255}const h2=t=>()=>t;function mee(t,e){return function(n){return t+n*e}}function gee(t,e,n){return t=Math.pow(t,n),e=Math.pow(e,n)-t,n=1/n,function(r){return Math.pow(t+r*e,n)}}function vee(t){return(t=+t)==1?hz:function(e,n){return n-e?gee(e,n,t):h2(isNaN(e)?n:e)}}function hz(t,e){var n=e-t;return n?mee(t,n):h2(isNaN(t)?e:t)}const jO=(function t(e){var n=vee(e);function r(i,s){var a=n((i=EP(i)).r,(s=EP(s)).r),o=n(i.g,s.g),l=n(i.b,s.b),c=hz(i.opacity,s.opacity);return function(d){return i.r=a(d),i.g=o(d),i.b=l(d),i.opacity=c(d),i+""}}return r.gamma=t,r})(1);function yee(t,e){e||(e=[]);var n=t?Math.min(e.length,t.length):0,r=e.slice(),i;return function(s){for(i=0;in&&(s=e.slice(n,s),o[a]?o[a]+=s:o[++a]=s),(r=r[0])===(i=i[0])?o[a]?o[a]+=i:o[++a]=i:(o[++a]=null,l.push({i:a,x:kw(r,i)})),n=IE.lastIndex;return ne&&(n=t,t=e,e=n),function(r){return Math.max(t,Math.min(e,r))}}function Cee(t,e,n){var r=t[0],i=t[1],s=e[0],a=e[1];return i2?Ree:Cee,l=c=null,f}function f(p){return p==null||isNaN(p=+p)?s:(l||(l=o(t.map(r),e,n)))(r(a(p)))}return f.invert=function(p){return a(i((c||(c=o(e,t.map(r),kw)))(p)))},f.domain=function(p){return arguments.length?(t=Array.from(p,Ow),d()):t.slice()},f.range=function(p){return arguments.length?(e=Array.from(p),d()):e.slice()},f.rangeRound=function(p){return e=Array.from(p),n=p2,d()},f.clamp=function(p){return arguments.length?(a=p?!0:Es,d()):a!==Es},f.interpolate=function(p){return arguments.length?(n=p,d()):n},f.unknown=function(p){return arguments.length?(s=p,f):s},function(p,y){return r=p,i=y,d()}}function m2(){return CS()(Es,Es)}function Nee(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)}function Lw(t,e){if(!isFinite(t)||t===0)return null;var n=(t=e?t.toExponential(e-1):t.toExponential()).indexOf("e"),r=t.slice(0,n);return[r.length>1?r[0]+r.slice(2):r,+t.slice(n+1)]}function Eg(t){return t=Lw(Math.abs(t)),t?t[1]:NaN}function Iee(t,e){return function(n,r){for(var i=n.length,s=[],a=0,o=t[0],l=0;i>0&&o>0&&(l+o+1>r&&(o=Math.max(1,r-l)),s.push(n.substring(i-=o,i+o)),!((l+=o+1)>r));)o=t[a=(a+1)%t.length];return s.reverse().join(e)}}function kee(t){return function(e){return e.replace(/[0-9]/g,function(n){return t[+n]})}}var Oee=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function wy(t){if(!(e=Oee.exec(t)))throw new Error("invalid format: "+t);var e;return new g2({fill:e[1],align:e[2],sign:e[3],symbol:e[4],zero:e[5],width:e[6],comma:e[7],precision:e[8]&&e[8].slice(1),trim:e[9],type:e[10]})}wy.prototype=g2.prototype;function g2(t){this.fill=t.fill===void 0?" ":t.fill+"",this.align=t.align===void 0?">":t.align+"",this.sign=t.sign===void 0?"-":t.sign+"",this.symbol=t.symbol===void 0?"":t.symbol+"",this.zero=!!t.zero,this.width=t.width===void 0?void 0:+t.width,this.comma=!!t.comma,this.precision=t.precision===void 0?void 0:+t.precision,this.trim=!!t.trim,this.type=t.type===void 0?"":t.type+""}g2.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(this.width===void 0?"":Math.max(1,this.width|0))+(this.comma?",":"")+(this.precision===void 0?"":"."+Math.max(0,this.precision|0))+(this.trim?"~":"")+this.type};function Lee(t){e:for(var e=t.length,n=1,r=-1,i;n0&&(r=0);break}return r>0?t.slice(0,r)+t.slice(i+1):t}var Dw;function Dee(t,e){var n=Lw(t,e);if(!n)return Dw=void 0,t.toPrecision(e);var r=n[0],i=n[1],s=i-(Dw=Math.max(-8,Math.min(8,Math.floor(i/3)))*3)+1,a=r.length;return s===a?r:s>a?r+new Array(s-a+1).join("0"):s>0?r.slice(0,s)+"."+r.slice(s):"0."+new Array(1-s).join("0")+Lw(t,Math.max(0,e+s-1))[0]}function zO(t,e){var n=Lw(t,e);if(!n)return t+"";var r=n[0],i=n[1];return i<0?"0."+new Array(-i).join("0")+r:r.length>i+1?r.slice(0,i+1)+"."+r.slice(i+1):r+new Array(i-r.length+2).join("0")}const BO={"%":(t,e)=>(t*100).toFixed(e),b:t=>Math.round(t).toString(2),c:t=>t+"",d:Nee,e:(t,e)=>t.toExponential(e),f:(t,e)=>t.toFixed(e),g:(t,e)=>t.toPrecision(e),o:t=>Math.round(t).toString(8),p:(t,e)=>zO(t*100,e),r:zO,s:Dee,X:t=>Math.round(t).toString(16).toUpperCase(),x:t=>Math.round(t).toString(16)};function HO(t){return t}var VO=Array.prototype.map,GO=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function Uee(t){var e=t.grouping===void 0||t.thousands===void 0?HO:Iee(VO.call(t.grouping,Number),t.thousands+""),n=t.currency===void 0?"":t.currency[0]+"",r=t.currency===void 0?"":t.currency[1]+"",i=t.decimal===void 0?".":t.decimal+"",s=t.numerals===void 0?HO:kee(VO.call(t.numerals,String)),a=t.percent===void 0?"%":t.percent+"",o=t.minus===void 0?"−":t.minus+"",l=t.nan===void 0?"NaN":t.nan+"";function c(f,p){f=wy(f);var y=f.fill,b=f.align,S=f.sign,w=f.symbol,x=f.zero,M=f.width,T=f.comma,P=f.precision,O=f.trim,N=f.type;N==="n"?(T=!0,N="g"):BO[N]||(P===void 0&&(P=12),O=!0,N="g"),(x||y==="0"&&b==="=")&&(x=!0,y="0",b="=");var D=(p&&p.prefix!==void 0?p.prefix:"")+(w==="$"?n:w==="#"&&/[boxX]/.test(N)?"0"+N.toLowerCase():""),z=(w==="$"?r:/[%p]/.test(N)?a:"")+(p&&p.suffix!==void 0?p.suffix:""),V=BO[N],k=/[defgprs%]/.test(N);P=P===void 0?6:/[gprs]/.test(N)?Math.max(1,Math.min(21,P)):Math.max(0,Math.min(20,P));function j(X){var ee=D,ie=z,pe,ae,he;if(N==="c")ie=V(X)+ie,X="";else{X=+X;var B=X<0||1/X<0;if(X=isNaN(X)?l:V(Math.abs(X),P),O&&(X=Lee(X)),B&&+X==0&&S!=="+"&&(B=!1),ee=(B?S==="("?S:o:S==="-"||S==="("?"":S)+ee,ie=(N==="s"&&!isNaN(X)&&Dw!==void 0?GO[8+Dw/3]:"")+ie+(B&&S==="("?")":""),k){for(pe=-1,ae=X.length;++pehe||he>57){ie=(he===46?i+X.slice(pe+1):X.slice(pe))+ie,X=X.slice(0,pe);break}}}T&&!x&&(X=e(X,1/0));var J=ee.length+X.length+ie.length,Y=J>1)+ee+X+ie+Y.slice(J);break;default:X=Y+ee+X+ie;break}return s(X)}return j.toString=function(){return f+""},j}function d(f,p){var y=Math.max(-8,Math.min(8,Math.floor(Eg(p)/3)))*3,b=Math.pow(10,-y),S=c((f=wy(f),f.type="f",f),{suffix:GO[8+y/3]});return function(w){return S(b*w)}}return{format:c,formatPrefix:d}}var kb,v2,pz;jee({thousands:",",grouping:[3],currency:["$",""]});function jee(t){return kb=Uee(t),v2=kb.format,pz=kb.formatPrefix,kb}function Fee(t){return Math.max(0,-Eg(Math.abs(t)))}function zee(t,e){return Math.max(0,Math.max(-8,Math.min(8,Math.floor(Eg(e)/3)))*3-Eg(Math.abs(t)))}function Bee(t,e){return t=Math.abs(t),e=Math.abs(e)-t,Math.max(0,Eg(e)-Eg(t))+1}function mz(t,e,n,r){var i=SP(t,e,n),s;switch(r=wy(r??",f"),r.type){case"s":{var a=Math.max(Math.abs(t),Math.abs(e));return r.precision==null&&!isNaN(s=zee(i,a))&&(r.precision=s),pz(r,a)}case"":case"e":case"g":case"p":case"r":{r.precision==null&&!isNaN(s=Bee(i,Math.max(Math.abs(t),Math.abs(e))))&&(r.precision=s-(r.type==="e"));break}case"f":case"%":{r.precision==null&&!isNaN(s=Fee(i))&&(r.precision=s-(r.type==="%")*2);break}}return v2(r)}function Id(t){var e=t.domain;return t.ticks=function(n){var r=e();return _P(r[0],r[r.length-1],n??10)},t.tickFormat=function(n,r){var i=e();return mz(i[0],i[i.length-1],n??10,r)},t.nice=function(n){n==null&&(n=10);var r=e(),i=0,s=r.length-1,a=r[i],o=r[s],l,c,d=10;for(o0;){if(c=wP(a,o,n),c===l)return r[i]=a,r[s]=o,e(r);if(c>0)a=Math.floor(a/c)*c,o=Math.ceil(o/c)*c;else if(c<0)a=Math.ceil(a*c)/c,o=Math.floor(o*c)/c;else break;l=c}return t},t}function gz(){var t=m2();return t.copy=function(){return nx(t,gz())},Qa.apply(t,arguments),Id(t)}function vz(t){var e;function n(r){return r==null||isNaN(r=+r)?e:r}return n.invert=n,n.domain=n.range=function(r){return arguments.length?(t=Array.from(r,Ow),n):t.slice()},n.unknown=function(r){return arguments.length?(e=r,n):e},n.copy=function(){return vz(t).unknown(e)},t=arguments.length?Array.from(t,Ow):[0,1],Id(n)}function yz(t,e){t=t.slice();var n=0,r=t.length-1,i=t[n],s=t[r],a;return sMath.pow(t,e)}function $ee(t){return t===Math.E?Math.log:t===10&&Math.log10||t===2&&Math.log2||(t=Math.log(t),e=>Math.log(e)/t)}function XO(t){return(e,n)=>-t(-e,n)}function y2(t){const e=t(WO,$O),n=e.domain;let r=10,i,s;function a(){return i=$ee(r),s=Wee(r),n()[0]<0?(i=XO(i),s=XO(s),t(Hee,Vee)):t(WO,$O),e}return e.base=function(o){return arguments.length?(r=+o,a()):r},e.domain=function(o){return arguments.length?(n(o),a()):n()},e.ticks=o=>{const l=n();let c=l[0],d=l[l.length-1];const f=d0){for(;p<=y;++p)for(b=1;bd)break;x.push(S)}}else for(;p<=y;++p)for(b=r-1;b>=1;--b)if(S=p>0?b/s(-p):b*s(p),!(Sd)break;x.push(S)}x.length*2{if(o==null&&(o=10),l==null&&(l=r===10?"s":","),typeof l!="function"&&(!(r%1)&&(l=wy(l)).precision==null&&(l.trim=!0),l=v2(l)),o===1/0)return l;const c=Math.max(1,r*o/e.ticks().length);return d=>{let f=d/s(Math.round(i(d)));return f*rn(yz(n(),{floor:o=>s(Math.floor(i(o))),ceil:o=>s(Math.ceil(i(o)))})),e}function xz(){const t=y2(CS()).domain([1,10]);return t.copy=()=>nx(t,xz()).base(t.base()),Qa.apply(t,arguments),t}function qO(t){return function(e){return Math.sign(e)*Math.log1p(Math.abs(e/t))}}function KO(t){return function(e){return Math.sign(e)*Math.expm1(Math.abs(e))*t}}function x2(t){var e=1,n=t(qO(e),KO(e));return n.constant=function(r){return arguments.length?t(qO(e=+r),KO(e)):e},Id(n)}function bz(){var t=x2(CS());return t.copy=function(){return nx(t,bz()).constant(t.constant())},Qa.apply(t,arguments)}function YO(t){return function(e){return e<0?-Math.pow(-e,t):Math.pow(e,t)}}function Xee(t){return t<0?-Math.sqrt(-t):Math.sqrt(t)}function qee(t){return t<0?-t*t:t*t}function b2(t){var e=t(Es,Es),n=1;function r(){return n===1?t(Es,Es):n===.5?t(Xee,qee):t(YO(n),YO(1/n))}return e.exponent=function(i){return arguments.length?(n=+i,r()):n},Id(e)}function _2(){var t=b2(CS());return t.copy=function(){return nx(t,_2()).exponent(t.exponent())},Qa.apply(t,arguments),t}function Kee(){return _2.apply(null,arguments).exponent(.5)}function ZO(t){return Math.sign(t)*t*t}function Yee(t){return Math.sign(t)*Math.sqrt(Math.abs(t))}function _z(){var t=m2(),e=[0,1],n=!1,r;function i(s){var a=Yee(t(s));return isNaN(a)?r:n?Math.round(a):a}return i.invert=function(s){return t.invert(ZO(s))},i.domain=function(s){return arguments.length?(t.domain(s),i):t.domain()},i.range=function(s){return arguments.length?(t.range((e=Array.from(s,Ow)).map(ZO)),i):e.slice()},i.rangeRound=function(s){return i.range(s).round(!0)},i.round=function(s){return arguments.length?(n=!!s,i):n},i.clamp=function(s){return arguments.length?(t.clamp(s),i):t.clamp()},i.unknown=function(s){return arguments.length?(r=s,i):r},i.copy=function(){return _z(t.domain(),e).round(n).clamp(t.clamp()).unknown(r)},Qa.apply(i,arguments),Id(i)}function wz(){var t=[],e=[],n=[],r;function i(){var a=0,o=Math.max(1,e.length);for(n=new Array(o-1);++a0?n[o-1]:t[0],o=n?[r[n-1],e]:[r[c-1],r[c]]},a.unknown=function(l){return arguments.length&&(s=l),a},a.thresholds=function(){return r.slice()},a.copy=function(){return Sz().domain([t,e]).range(i).unknown(s)},Qa.apply(Id(a),arguments)}function Mz(){var t=[.5],e=[0,1],n,r=1;function i(s){return s!=null&&s<=s?e[ex(t,s,0,r)]:n}return i.domain=function(s){return arguments.length?(t=Array.from(s),r=Math.min(t.length,e.length-1),i):t.slice()},i.range=function(s){return arguments.length?(e=Array.from(s),r=Math.min(t.length,e.length-1),i):e.slice()},i.invertExtent=function(s){var a=e.indexOf(s);return[t[a-1],t[a]]},i.unknown=function(s){return arguments.length?(n=s,i):n},i.copy=function(){return Mz().domain(t).range(e).unknown(n)},Qa.apply(i,arguments)}const kE=new Date,OE=new Date;function ai(t,e,n,r){function i(s){return t(s=arguments.length===0?new Date:new Date(+s)),s}return i.floor=s=>(t(s=new Date(+s)),s),i.ceil=s=>(t(s=new Date(s-1)),e(s,1),t(s),s),i.round=s=>{const a=i(s),o=i.ceil(s);return s-a(e(s=new Date(+s),a==null?1:Math.floor(a)),s),i.range=(s,a,o)=>{const l=[];if(s=i.ceil(s),o=o==null?1:Math.floor(o),!(s0))return l;let c;do l.push(c=new Date(+s)),e(s,o),t(s);while(cai(a=>{if(a>=a)for(;t(a),!s(a);)a.setTime(a-1)},(a,o)=>{if(a>=a)if(o<0)for(;++o<=0;)for(;e(a,-1),!s(a););else for(;--o>=0;)for(;e(a,1),!s(a););}),n&&(i.count=(s,a)=>(kE.setTime(+s),OE.setTime(+a),t(kE),t(OE),Math.floor(n(kE,OE))),i.every=s=>(s=Math.floor(s),!isFinite(s)||!(s>0)?null:s>1?i.filter(r?a=>r(a)%s===0:a=>i.count(0,a)%s===0):i)),i}const Uw=ai(()=>{},(t,e)=>{t.setTime(+t+e)},(t,e)=>e-t);Uw.every=t=>(t=Math.floor(t),!isFinite(t)||!(t>0)?null:t>1?ai(e=>{e.setTime(Math.floor(e/t)*t)},(e,n)=>{e.setTime(+e+n*t)},(e,n)=>(n-e)/t):Uw);Uw.range;const Uc=1e3,Wa=Uc*60,jc=Wa*60,qc=jc*24,w2=qc*7,QO=qc*30,LE=qc*365,sh=ai(t=>{t.setTime(t-t.getMilliseconds())},(t,e)=>{t.setTime(+t+e*Uc)},(t,e)=>(e-t)/Uc,t=>t.getUTCSeconds());sh.range;const S2=ai(t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*Uc)},(t,e)=>{t.setTime(+t+e*Wa)},(t,e)=>(e-t)/Wa,t=>t.getMinutes());S2.range;const M2=ai(t=>{t.setUTCSeconds(0,0)},(t,e)=>{t.setTime(+t+e*Wa)},(t,e)=>(e-t)/Wa,t=>t.getUTCMinutes());M2.range;const E2=ai(t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*Uc-t.getMinutes()*Wa)},(t,e)=>{t.setTime(+t+e*jc)},(t,e)=>(e-t)/jc,t=>t.getHours());E2.range;const A2=ai(t=>{t.setUTCMinutes(0,0,0)},(t,e)=>{t.setTime(+t+e*jc)},(t,e)=>(e-t)/jc,t=>t.getUTCHours());A2.range;const rx=ai(t=>t.setHours(0,0,0,0),(t,e)=>t.setDate(t.getDate()+e),(t,e)=>(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*Wa)/qc,t=>t.getDate()-1);rx.range;const RS=ai(t=>{t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCDate(t.getUTCDate()+e)},(t,e)=>(e-t)/qc,t=>t.getUTCDate()-1);RS.range;const Ez=ai(t=>{t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCDate(t.getUTCDate()+e)},(t,e)=>(e-t)/qc,t=>Math.floor(t/qc));Ez.range;function Zh(t){return ai(e=>{e.setDate(e.getDate()-(e.getDay()+7-t)%7),e.setHours(0,0,0,0)},(e,n)=>{e.setDate(e.getDate()+n*7)},(e,n)=>(n-e-(n.getTimezoneOffset()-e.getTimezoneOffset())*Wa)/w2)}const NS=Zh(0),jw=Zh(1),Zee=Zh(2),Qee=Zh(3),Ag=Zh(4),Jee=Zh(5),ete=Zh(6);NS.range;jw.range;Zee.range;Qee.range;Ag.range;Jee.range;ete.range;function Qh(t){return ai(e=>{e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-t)%7),e.setUTCHours(0,0,0,0)},(e,n)=>{e.setUTCDate(e.getUTCDate()+n*7)},(e,n)=>(n-e)/w2)}const IS=Qh(0),Fw=Qh(1),tte=Qh(2),nte=Qh(3),Tg=Qh(4),rte=Qh(5),ite=Qh(6);IS.range;Fw.range;tte.range;nte.range;Tg.range;rte.range;ite.range;const T2=ai(t=>{t.setDate(1),t.setHours(0,0,0,0)},(t,e)=>{t.setMonth(t.getMonth()+e)},(t,e)=>e.getMonth()-t.getMonth()+(e.getFullYear()-t.getFullYear())*12,t=>t.getMonth());T2.range;const P2=ai(t=>{t.setUTCDate(1),t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCMonth(t.getUTCMonth()+e)},(t,e)=>e.getUTCMonth()-t.getUTCMonth()+(e.getUTCFullYear()-t.getUTCFullYear())*12,t=>t.getUTCMonth());P2.range;const Kc=ai(t=>{t.setMonth(0,1),t.setHours(0,0,0,0)},(t,e)=>{t.setFullYear(t.getFullYear()+e)},(t,e)=>e.getFullYear()-t.getFullYear(),t=>t.getFullYear());Kc.every=t=>!isFinite(t=Math.floor(t))||!(t>0)?null:ai(e=>{e.setFullYear(Math.floor(e.getFullYear()/t)*t),e.setMonth(0,1),e.setHours(0,0,0,0)},(e,n)=>{e.setFullYear(e.getFullYear()+n*t)});Kc.range;const Yc=ai(t=>{t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCFullYear(t.getUTCFullYear()+e)},(t,e)=>e.getUTCFullYear()-t.getUTCFullYear(),t=>t.getUTCFullYear());Yc.every=t=>!isFinite(t=Math.floor(t))||!(t>0)?null:ai(e=>{e.setUTCFullYear(Math.floor(e.getUTCFullYear()/t)*t),e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)},(e,n)=>{e.setUTCFullYear(e.getUTCFullYear()+n*t)});Yc.range;function Az(t,e,n,r,i,s){const a=[[sh,1,Uc],[sh,5,5*Uc],[sh,15,15*Uc],[sh,30,30*Uc],[s,1,Wa],[s,5,5*Wa],[s,15,15*Wa],[s,30,30*Wa],[i,1,jc],[i,3,3*jc],[i,6,6*jc],[i,12,12*jc],[r,1,qc],[r,2,2*qc],[n,1,w2],[e,1,QO],[e,3,3*QO],[t,1,LE]];function o(c,d,f){const p=dw).right(a,p);if(y===a.length)return t.every(SP(c/LE,d/LE,f));if(y===0)return Uw.every(Math.max(SP(c,d,f),1));const[b,S]=a[p/a[y-1][2]53)return null;"w"in de||(de.w=1),"Z"in de?(Ve=UE(c0(de.y,0,1)),Le=Ve.getUTCDay(),Ve=Le>4||Le===0?Fw.ceil(Ve):Fw(Ve),Ve=RS.offset(Ve,(de.V-1)*7),de.y=Ve.getUTCFullYear(),de.m=Ve.getUTCMonth(),de.d=Ve.getUTCDate()+(de.w+6)%7):(Ve=DE(c0(de.y,0,1)),Le=Ve.getDay(),Ve=Le>4||Le===0?jw.ceil(Ve):jw(Ve),Ve=rx.offset(Ve,(de.V-1)*7),de.y=Ve.getFullYear(),de.m=Ve.getMonth(),de.d=Ve.getDate()+(de.w+6)%7)}else("W"in de||"U"in de)&&("w"in de||(de.w="u"in de?de.u%7:"W"in de?1:0),Le="Z"in de?UE(c0(de.y,0,1)).getUTCDay():DE(c0(de.y,0,1)).getDay(),de.m=0,de.d="W"in de?(de.w+6)%7+de.W*7-(Le+5)%7:de.w+de.U*7-(Le+6)%7);return"Z"in de?(de.H+=de.Z/100|0,de.M+=de.Z%100,UE(de)):DE(de)}}function z(Ee,Ge,$e,de){for(var Z=0,Ve=Ge.length,Le=$e.length,ne,Ce;Z=Le)return-1;if(ne=Ge.charCodeAt(Z++),ne===37){if(ne=Ge.charAt(Z++),Ce=O[ne in JO?Ge.charAt(Z++):ne],!Ce||(de=Ce(Ee,$e,de))<0)return-1}else if(ne!=$e.charCodeAt(de++))return-1}return de}function V(Ee,Ge,$e){var de=c.exec(Ge.slice($e));return de?(Ee.p=d.get(de[0].toLowerCase()),$e+de[0].length):-1}function k(Ee,Ge,$e){var de=y.exec(Ge.slice($e));return de?(Ee.w=b.get(de[0].toLowerCase()),$e+de[0].length):-1}function j(Ee,Ge,$e){var de=f.exec(Ge.slice($e));return de?(Ee.w=p.get(de[0].toLowerCase()),$e+de[0].length):-1}function X(Ee,Ge,$e){var de=x.exec(Ge.slice($e));return de?(Ee.m=M.get(de[0].toLowerCase()),$e+de[0].length):-1}function ee(Ee,Ge,$e){var de=S.exec(Ge.slice($e));return de?(Ee.m=w.get(de[0].toLowerCase()),$e+de[0].length):-1}function ie(Ee,Ge,$e){return z(Ee,e,Ge,$e)}function pe(Ee,Ge,$e){return z(Ee,n,Ge,$e)}function ae(Ee,Ge,$e){return z(Ee,r,Ge,$e)}function he(Ee){return a[Ee.getDay()]}function B(Ee){return s[Ee.getDay()]}function J(Ee){return l[Ee.getMonth()]}function Y(Ee){return o[Ee.getMonth()]}function H(Ee){return i[+(Ee.getHours()>=12)]}function G(Ee){return 1+~~(Ee.getMonth()/3)}function le(Ee){return a[Ee.getUTCDay()]}function se(Ee){return s[Ee.getUTCDay()]}function ce(Ee){return l[Ee.getUTCMonth()]}function Se(Ee){return o[Ee.getUTCMonth()]}function we(Ee){return i[+(Ee.getUTCHours()>=12)]}function We(Ee){return 1+~~(Ee.getUTCMonth()/3)}return{format:function(Ee){var Ge=N(Ee+="",T);return Ge.toString=function(){return Ee},Ge},parse:function(Ee){var Ge=D(Ee+="",!1);return Ge.toString=function(){return Ee},Ge},utcFormat:function(Ee){var Ge=N(Ee+="",P);return Ge.toString=function(){return Ee},Ge},utcParse:function(Ee){var Ge=D(Ee+="",!0);return Ge.toString=function(){return Ee},Ge}}}var JO={"-":"",_:" ",0:"0"},Si=/^\s*\d+/,ute=/^%/,dte=/[\\^$*+?|[\]().{}]/g;function Un(t,e,n){var r=t<0?"-":"",i=(r?-t:t)+"",s=i.length;return r+(s[e.toLowerCase(),n]))}function hte(t,e,n){var r=Si.exec(e.slice(n,n+1));return r?(t.w=+r[0],n+r[0].length):-1}function pte(t,e,n){var r=Si.exec(e.slice(n,n+1));return r?(t.u=+r[0],n+r[0].length):-1}function mte(t,e,n){var r=Si.exec(e.slice(n,n+2));return r?(t.U=+r[0],n+r[0].length):-1}function gte(t,e,n){var r=Si.exec(e.slice(n,n+2));return r?(t.V=+r[0],n+r[0].length):-1}function vte(t,e,n){var r=Si.exec(e.slice(n,n+2));return r?(t.W=+r[0],n+r[0].length):-1}function eL(t,e,n){var r=Si.exec(e.slice(n,n+4));return r?(t.y=+r[0],n+r[0].length):-1}function tL(t,e,n){var r=Si.exec(e.slice(n,n+2));return r?(t.y=+r[0]+(+r[0]>68?1900:2e3),n+r[0].length):-1}function yte(t,e,n){var r=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(e.slice(n,n+6));return r?(t.Z=r[1]?0:-(r[2]+(r[3]||"00")),n+r[0].length):-1}function xte(t,e,n){var r=Si.exec(e.slice(n,n+1));return r?(t.q=r[0]*3-3,n+r[0].length):-1}function bte(t,e,n){var r=Si.exec(e.slice(n,n+2));return r?(t.m=r[0]-1,n+r[0].length):-1}function nL(t,e,n){var r=Si.exec(e.slice(n,n+2));return r?(t.d=+r[0],n+r[0].length):-1}function _te(t,e,n){var r=Si.exec(e.slice(n,n+3));return r?(t.m=0,t.d=+r[0],n+r[0].length):-1}function rL(t,e,n){var r=Si.exec(e.slice(n,n+2));return r?(t.H=+r[0],n+r[0].length):-1}function wte(t,e,n){var r=Si.exec(e.slice(n,n+2));return r?(t.M=+r[0],n+r[0].length):-1}function Ste(t,e,n){var r=Si.exec(e.slice(n,n+2));return r?(t.S=+r[0],n+r[0].length):-1}function Mte(t,e,n){var r=Si.exec(e.slice(n,n+3));return r?(t.L=+r[0],n+r[0].length):-1}function Ete(t,e,n){var r=Si.exec(e.slice(n,n+6));return r?(t.L=Math.floor(r[0]/1e3),n+r[0].length):-1}function Ate(t,e,n){var r=ute.exec(e.slice(n,n+1));return r?n+r[0].length:-1}function Tte(t,e,n){var r=Si.exec(e.slice(n));return r?(t.Q=+r[0],n+r[0].length):-1}function Pte(t,e,n){var r=Si.exec(e.slice(n));return r?(t.s=+r[0],n+r[0].length):-1}function iL(t,e){return Un(t.getDate(),e,2)}function Cte(t,e){return Un(t.getHours(),e,2)}function Rte(t,e){return Un(t.getHours()%12||12,e,2)}function Nte(t,e){return Un(1+rx.count(Kc(t),t),e,3)}function Tz(t,e){return Un(t.getMilliseconds(),e,3)}function Ite(t,e){return Tz(t,e)+"000"}function kte(t,e){return Un(t.getMonth()+1,e,2)}function Ote(t,e){return Un(t.getMinutes(),e,2)}function Lte(t,e){return Un(t.getSeconds(),e,2)}function Dte(t){var e=t.getDay();return e===0?7:e}function Ute(t,e){return Un(NS.count(Kc(t)-1,t),e,2)}function Pz(t){var e=t.getDay();return e>=4||e===0?Ag(t):Ag.ceil(t)}function jte(t,e){return t=Pz(t),Un(Ag.count(Kc(t),t)+(Kc(t).getDay()===4),e,2)}function Fte(t){return t.getDay()}function zte(t,e){return Un(jw.count(Kc(t)-1,t),e,2)}function Bte(t,e){return Un(t.getFullYear()%100,e,2)}function Hte(t,e){return t=Pz(t),Un(t.getFullYear()%100,e,2)}function Vte(t,e){return Un(t.getFullYear()%1e4,e,4)}function Gte(t,e){var n=t.getDay();return t=n>=4||n===0?Ag(t):Ag.ceil(t),Un(t.getFullYear()%1e4,e,4)}function Wte(t){var e=t.getTimezoneOffset();return(e>0?"-":(e*=-1,"+"))+Un(e/60|0,"0",2)+Un(e%60,"0",2)}function sL(t,e){return Un(t.getUTCDate(),e,2)}function $te(t,e){return Un(t.getUTCHours(),e,2)}function Xte(t,e){return Un(t.getUTCHours()%12||12,e,2)}function qte(t,e){return Un(1+RS.count(Yc(t),t),e,3)}function Cz(t,e){return Un(t.getUTCMilliseconds(),e,3)}function Kte(t,e){return Cz(t,e)+"000"}function Yte(t,e){return Un(t.getUTCMonth()+1,e,2)}function Zte(t,e){return Un(t.getUTCMinutes(),e,2)}function Qte(t,e){return Un(t.getUTCSeconds(),e,2)}function Jte(t){var e=t.getUTCDay();return e===0?7:e}function ene(t,e){return Un(IS.count(Yc(t)-1,t),e,2)}function Rz(t){var e=t.getUTCDay();return e>=4||e===0?Tg(t):Tg.ceil(t)}function tne(t,e){return t=Rz(t),Un(Tg.count(Yc(t),t)+(Yc(t).getUTCDay()===4),e,2)}function nne(t){return t.getUTCDay()}function rne(t,e){return Un(Fw.count(Yc(t)-1,t),e,2)}function ine(t,e){return Un(t.getUTCFullYear()%100,e,2)}function sne(t,e){return t=Rz(t),Un(t.getUTCFullYear()%100,e,2)}function ane(t,e){return Un(t.getUTCFullYear()%1e4,e,4)}function one(t,e){var n=t.getUTCDay();return t=n>=4||n===0?Tg(t):Tg.ceil(t),Un(t.getUTCFullYear()%1e4,e,4)}function lne(){return"+0000"}function aL(){return"%"}function oL(t){return+t}function lL(t){return Math.floor(+t/1e3)}var lm,Nz,Iz;cne({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});function cne(t){return lm=cte(t),Nz=lm.format,lm.parse,Iz=lm.utcFormat,lm.utcParse,lm}function une(t){return new Date(t)}function dne(t){return t instanceof Date?+t:+new Date(+t)}function C2(t,e,n,r,i,s,a,o,l,c){var d=m2(),f=d.invert,p=d.domain,y=c(".%L"),b=c(":%S"),S=c("%I:%M"),w=c("%I %p"),x=c("%a %d"),M=c("%b %d"),T=c("%B"),P=c("%Y");function O(N){return(l(N)e(i/(t.length-1)))},n.quantiles=function(r){return Array.from({length:r+1},(i,s)=>JJ(t,s/r))},n.copy=function(){return Dz(e).domain(t)},tu.apply(n,arguments)}function OS(){var t=0,e=.5,n=1,r=1,i,s,a,o,l,c=Es,d,f=!1,p;function y(S){return isNaN(S=+S)?p:(S=.5+((S=+d(S))-s)*(r*S{if(t!=null){var r=t.scale,i=t.type;if(r==="auto")return i==="category"&&n&&(n.indexOf("LineChart")>=0||n.indexOf("AreaChart")>=0||n.indexOf("ComposedChart")>=0&&!e)?"point":i==="category"?"band":"linear";if(typeof r=="string")return yne(r)?r:"point"}};function xne(t,e){for(var n=0,r=t.length,i=t[0]e)?n=s+1:r=s}return n}function Hz(t,e){if(t){var n=e??t.domain(),r=n.map(s=>{var a;return(a=t(s))!==null&&a!==void 0?a:0}),i=t.range();if(!(n.length===0||i.length<2))return s=>{var a,o,l=xne(r,s);if(l<=0)return n[0];if(l>=n.length)return n[n.length-1];var c=(a=r[l-1])!==null&&a!==void 0?a:0,d=(o=r[l])!==null&&o!==void 0?o:0;return Math.abs(s-c)<=Math.abs(s-d)?n[l-1]:n[l]}}}function bne(t){if(t!=null)return"invert"in t&&typeof t.invert=="function"?t.invert.bind(t):Hz(t,void 0)}function uL(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(t,i).enumerable})),n.push.apply(n,r)}return n}function zw(t){for(var e=1;et.length)&&(e=t.length);for(var n=0,r=Array(e);nt.cartesianAxis.xAxis[e],nu=(t,e)=>{var n=Gz(t,e);return n??ti},ni={allowDataOverflow:!1,allowDecimals:!0,allowDuplicatedCategory:!0,angle:0,dataKey:void 0,domain:PP,hide:!0,id:0,includeHidden:!1,interval:"preserveEnd",minTickGap:5,mirror:!1,name:void 0,orientation:"left",padding:{top:0,bottom:0},reversed:!1,scale:"auto",tick:!0,tickCount:5,tickFormatter:void 0,ticks:void 0,type:"number",unit:void 0,niceTicks:"auto",width:Ky},Wz=(t,e)=>t.cartesianAxis.yAxis[e],ru=(t,e)=>{var n=Wz(t,e);return n??ni},Pne={domain:[0,"auto"],includeHidden:!1,reversed:!1,allowDataOverflow:!1,allowDuplicatedCategory:!1,dataKey:void 0,id:0,name:"",range:[64,64],scale:"auto",type:"number",unit:""},k2=(t,e)=>{var n=t.cartesianAxis.zAxis[e];return n??Pne},Cs=(t,e,n)=>{switch(e){case"xAxis":return nu(t,n);case"yAxis":return ru(t,n);case"zAxis":return k2(t,n);case"angleAxis":return r2(t,n);case"radiusAxis":return i2(t,n);default:throw new Error("Unexpected axis type: ".concat(e))}},Cne=(t,e,n)=>{switch(e){case"xAxis":return nu(t,n);case"yAxis":return ru(t,n);default:throw new Error("Unexpected axis type: ".concat(e))}},ix=(t,e,n)=>{switch(e){case"xAxis":return nu(t,n);case"yAxis":return ru(t,n);case"angleAxis":return r2(t,n);case"radiusAxis":return i2(t,n);default:throw new Error("Unexpected axis type: ".concat(e))}},$z=t=>t.graphicalItems.cartesianItems.some(e=>e.type==="bar")||t.graphicalItems.polarItems.some(e=>e.type==="radialBar");function Xz(t,e){return n=>{switch(t){case"xAxis":return"xAxisId"in n&&n.xAxisId===e;case"yAxis":return"yAxisId"in n&&n.yAxisId===e;case"zAxis":return"zAxisId"in n&&n.zAxisId===e;case"angleAxis":return"angleAxisId"in n&&n.angleAxisId===e;case"radiusAxis":return"radiusAxisId"in n&&n.radiusAxisId===e;default:return!1}}}var qz=t=>t.graphicalItems.cartesianItems,Rne=ke([_i,AS],Xz),Kz=(t,e,n)=>t.filter(n).filter(r=>(e==null?void 0:e.includeHidden)===!0?!0:!r.hide),qg=ke([qz,Cs,Rne],Kz,{memoizeOptions:{resultEqualityCheck:PS}}),Yz=ke([qg],t=>t.filter(e=>e.type==="area"||e.type==="bar").filter(o2)),Zz=t=>t.filter(e=>!("stackId"in e)||e.stackId===void 0),Nne=ke([qg],Zz),Qz=t=>t.map(e=>e.data).filter(Boolean).flat(1),Ine=ke([qg],t=>t.some(e=>!e.data)),Jz=ke([qg],Qz,{memoizeOptions:{resultEqualityCheck:PS}}),eB=(t,e)=>{var n=e.chartData,r=n===void 0?[]:n,i=e.dataStartIndex,s=e.dataEndIndex;return t.length>0?t:r.slice(i,s+1)},O2=ke([Jz,_S],eB),kne=(t,e,n)=>(e==null?void 0:e.dataKey)!=null?t.map(r=>({value:yi(r,e.dataKey)})):n.length>0?n.map(r=>r.dataKey).flatMap(r=>t.map(i=>({value:yi(i,r)}))):t.map(r=>({value:r})),tB=(t,e,n,r,i,s)=>{var a=r.chartData,o=a===void 0?[]:a,l=r.dataStartIndex,c=r.dataEndIndex,d=kne(t,e,n);if(i&&(e==null?void 0:e.dataKey)!=null&&s.length>0){var f=o.slice(l,c+1),p=f.map(y=>({value:yi(y,e.dataKey)})).filter(y=>y.value!=null);return[...p,...d]}return d},sx=ke([O2,Cs,qg,_S,Ine,Jz],tB);function eg(t){if(Nl(t)||t instanceof Date){var e=Number(t);if(wn(e))return e}}function fL(t){if(Array.isArray(t)){var e=[eg(t[0]),eg(t[1])];return El(e)?e:void 0}var n=eg(t);if(n!=null)return[n,n]}function Ol(t){return t.map(eg).filter(Ys)}function One(t,e){var n=eg(t),r=eg(e);return n==null&&r==null?0:n==null?-1:r==null?1:n-r}var Lne=ke([sx],t=>t==null?void 0:t.map(e=>e.value).sort(One));function nB(t,e){switch(t){case"xAxis":return e.direction==="x";case"yAxis":return e.direction==="y";default:return!1}}function Dne(t,e,n){if(!n)return[];if(!n.length)return[];var r;if(typeof e=="number"&&!Rl(e))r=e;else if(Array.isArray(e)){var i=Ol(e);i.length>0&&(r=Math.max(...i))}return r==null?[]:Ol(n.flatMap(s=>{var a=yi(t,s.dataKey),o,l;if(Array.isArray(a)){var c=Vz(a,2);o=c[0],l=c[1]}else o=l=a;if(!(!wn(o)||!wn(l)))return[r-o,r+l]}))}var oi=t=>{var e=wi(t),n=$g(t);return ix(t,e,n)},Pg=ke([oi],t=>t==null?void 0:t.dataKey),Une=ke([Yz,_S,oi],az),rB=(t,e,n,r)=>{var i={},s=e.reduce((a,o)=>{if(o.stackId==null)return a;var l=a[o.stackId];return l==null&&(l=[]),l.push(o),a[o.stackId]=l,a},i);return Object.fromEntries(Object.entries(s).map(a=>{var o=Vz(a,2),l=o[0],c=o[1],d=r?[...c].reverse():c,f=d.map(a2);return[l,{stackedData:tY(t,f,n),graphicalItems:d}]}))},iB=ke([Une,Yz,wS,J4],rB),sB=(t,e,n,r)=>{var i=e.dataStartIndex,s=e.dataEndIndex;if(r==null&&n!=="zAxis")return sY(t,i,s)},jne=ke([Cs],t=>t.allowDataOverflow),L2=t=>{var e;if(t==null||!("domain"in t))return PP;if(t.domain!=null)return t.domain;if("ticks"in t&&t.ticks!=null){if(t.type==="number"){var n=Ol(t.ticks);return[Math.min(...n),Math.max(...n)]}if(t.type==="category")return t.ticks.map(String)}return(e=t==null?void 0:t.domain)!==null&&e!==void 0?e:PP},aB=ke([Cs],L2),oB=ke([aB,jne],H4),Fne=ke([iB,$o,_i,oB],sB,{memoizeOptions:{resultEqualityCheck:TS}}),D2=t=>t.errorBars,zne=(t,e,n)=>t.flatMap(r=>e[r.id]).filter(Boolean).filter(r=>nB(n,r)),Bw=function(){for(var e=arguments.length,n=new Array(e),r=0;r5&&arguments[5]!==void 0?arguments[5]:[],o,l;if(r.length>0&&r.forEach(c=>{var d,f=c.data!=null?[...c.data]:a,p=(d=i[c.id])===null||d===void 0?void 0:d.filter(y=>nB(s,y));f.forEach(y=>{var b,S=yi(y,(b=n.dataKey)!==null&&b!==void 0?b:c.dataKey),w=Dne(y,S,p);if(w.length>=2){var x=Math.min(...w),M=Math.max(...w);(o==null||xl)&&(l=M)}var T=fL(S);T!=null&&(o=o==null?T[0]:Math.min(o,T[0]),l=l==null?T[1]:Math.max(l,T[1]))})}),(n==null?void 0:n.dataKey)!=null&&r.length===0&&e.forEach(c=>{var d=fL(yi(c,n.dataKey));d!=null&&(o=o==null?d[0]:Math.min(o,d[0]),l=l==null?d[1]:Math.max(l,d[1]))}),wn(o)&&wn(l))return[o,l]},Bne=ke([O2,Cs,Nne,D2,_i,vJ],lB,{memoizeOptions:{resultEqualityCheck:TS}});function Hne(t){var e=t.value;if(Nl(e)||e instanceof Date)return e}var Vne=(t,e,n)=>{var r=t.map(Hne).filter(i=>i!=null);return n&&(e.dataKey==null||e.allowDuplicatedCategory&&x5(r))?B4(0,t.length):e.allowDuplicatedCategory?r:Array.from(new Set(r))},cB=t=>t.referenceElements.dots,Kg=(t,e,n)=>t.filter(r=>r.ifOverflow==="extendDomain").filter(r=>e==="xAxis"?r.xAxisId===n:r.yAxisId===n),Gne=ke([cB,_i,AS],Kg),uB=t=>t.referenceElements.areas,Wne=ke([uB,_i,AS],Kg),dB=t=>t.referenceElements.lines,$ne=ke([dB,_i,AS],Kg),fB=(t,e)=>{if(t!=null){var n=Ol(t.map(r=>e==="xAxis"?r.x:r.y));if(n.length!==0)return[Math.min(...n),Math.max(...n)]}},Xne=ke(Gne,_i,fB),hB=(t,e)=>{if(t!=null){var n=Ol(t.flatMap(r=>[e==="xAxis"?r.x1:r.y1,e==="xAxis"?r.x2:r.y2]));if(n.length!==0)return[Math.min(...n),Math.max(...n)]}},qne=ke([Wne,_i],hB);function Kne(t){var e;if(t.x!=null)return Ol([t.x]);var n=(e=t.segment)===null||e===void 0?void 0:e.map(r=>r.x);return n==null||n.length===0?[]:Ol(n)}function Yne(t){var e;if(t.y!=null)return Ol([t.y]);var n=(e=t.segment)===null||e===void 0?void 0:e.map(r=>r.y);return n==null||n.length===0?[]:Ol(n)}var pB=(t,e)=>{if(t!=null){var n=t.flatMap(r=>e==="xAxis"?Kne(r):Yne(r));if(n.length!==0)return[Math.min(...n),Math.max(...n)]}},Zne=ke([$ne,_i],pB),Qne=ke(Xne,Zne,qne,(t,e,n)=>Bw(t,n,e)),mB=(t,e,n,r,i,s,a,o)=>{if(n!=null)return n;var l=a==="vertical"&&o==="xAxis"||a==="horizontal"&&o==="yAxis",c=l?Bw(r,s,i):Bw(s,i);return SJ(e,c,t.allowDataOverflow)},Jne=ke([Cs,aB,oB,Fne,Bne,Qne,hr,_i],mB,{memoizeOptions:{resultEqualityCheck:TS}}),ere=[0,1],gB=(t,e,n,r,i,s,a)=>{if(!((t==null||n==null||n.length===0)&&a===void 0)){var o=t.dataKey,l=t.type,c=jl(e,s);if(c&&o==null){var d;return B4(0,(d=n==null?void 0:n.length)!==null&&d!==void 0?d:0)}return l==="category"?Vne(r,t,c):i==="expand"&&!c?ere:a}},U2=ke([Cs,hr,O2,sx,wS,_i,Jne],gB),Yg=ke([Cs,$z,e2],Bz),vB=(t,e,n)=>{var r=e.niceTicks;if(r!=="none"){var i=L2(e),s=Array.isArray(i)&&(i[0]==="auto"||i[1]==="auto");if((r==="snap125"||r==="adaptive")&&e!=null&&e.tickCount&&El(t)){if(s)return _O(t,e.tickCount,e.allowDecimals,r);if(e.type==="number")return wO(t,e.tickCount,e.allowDecimals,r)}if(r==="auto"&&n==="linear"&&e!=null&&e.tickCount){if(s&&El(t))return _O(t,e.tickCount,e.allowDecimals,"adaptive");if(e.type==="number"&&El(t))return wO(t,e.tickCount,e.allowDecimals,"adaptive")}}},j2=ke([U2,ix,Yg],vB),yB=(t,e,n,r)=>{if(r!=="angleAxis"&&(t==null?void 0:t.type)==="number"&&El(e)&&Array.isArray(n)&&n.length>0){var i,s,a=e[0],o=(i=n[0])!==null&&i!==void 0?i:0,l=e[1],c=(s=n[n.length-1])!==null&&s!==void 0?s:0;return[Math.min(a,o),Math.max(l,c)]}return e},tre=ke([Cs,U2,j2,_i],yB),nre=ke(sx,Cs,(t,e)=>{if(!(!e||e.type!=="number")){var n=1/0,r=Array.from(Ol(t.map(f=>f.value))).sort((f,p)=>f-p),i=r[0],s=r[r.length-1];if(i==null||s==null)return 1/0;var a=s-i;if(a===0)return 1/0;for(var o=0;oi,(t,e,n,r,i)=>{if(!wn(t))return 0;var s=e==="vertical"?r.height:r.width;if(i==="gap")return t*s/2;if(i==="no-gap"){var a=Td(n,t*s),o=t*s/2;return o-a-(o-a)/s*a}return 0}),rre=(t,e,n)=>{var r=nu(t,e);return r==null||typeof r.padding!="string"?0:xB(t,"xAxis",e,n,r.padding)},ire=(t,e,n)=>{var r=ru(t,e);return r==null||typeof r.padding!="string"?0:xB(t,"yAxis",e,n,r.padding)},sre=ke(nu,rre,(t,e)=>{var n,r;if(t==null)return{left:0,right:0};var i=t.padding;return typeof i=="string"?{left:e,right:e}:{left:((n=i.left)!==null&&n!==void 0?n:0)+e,right:((r=i.right)!==null&&r!==void 0?r:0)+e}}),are=ke(ru,ire,(t,e)=>{var n,r;if(t==null)return{top:0,bottom:0};var i=t.padding;return typeof i=="string"?{top:e,bottom:e}:{top:((n=i.top)!==null&&n!==void 0?n:0)+e,bottom:((r=i.bottom)!==null&&r!==void 0?r:0)+e}}),bB=ke([Wi,sre,mS,pS,(t,e,n)=>n],(t,e,n,r,i)=>{var s=r.padding;return i?[s.left,n.width-s.right]:[t.left+e.left,t.left+t.width-e.right]}),_B=ke([Wi,hr,are,mS,pS,(t,e,n)=>n],(t,e,n,r,i,s)=>{var a=i.padding;return s?[r.height-a.bottom,a.top]:e==="horizontal"?[t.top+t.height-n.bottom,t.top+n.top]:[t.top+n.top,t.top+t.height-n.bottom]}),ax=(t,e,n,r)=>{var i;switch(e){case"xAxis":return bB(t,n,r);case"yAxis":return _B(t,n,r);case"zAxis":return(i=k2(t,n))===null||i===void 0?void 0:i.range;case"angleAxis":return rz(t);case"radiusAxis":return iz(t,n);default:return}},wB=ke([Cs,ax],SS),ore=ke([Yg,tre],BJ),F2=ke([Cs,Yg,ore,wB],I2),SB=(t,e,n,r)=>{if(!(n==null||n.dataKey==null)){var i=n.type,s=n.scale,a=jl(t,r);if(a&&(i==="number"||s!=="auto"))return e.map(o=>o.value)}},z2=ke([hr,sx,ix,_i],SB),LS=ke([F2],l2);ke([F2],bne);ke([F2,Lne],Hz);ke([qg,D2,_i],zne);function MB(t,e){return t.ide.id?1:0}var DS=(t,e)=>e,US=(t,e,n)=>n,lre=ke(fS,DS,US,(t,e,n)=>t.filter(r=>r.orientation===e).filter(r=>r.mirror===n).sort(MB)),cre=ke(hS,DS,US,(t,e,n)=>t.filter(r=>r.orientation===e).filter(r=>r.mirror===n).sort(MB)),EB=(t,e)=>({width:t.width,height:e.height}),ure=(t,e)=>{var n=typeof e.width=="number"?e.width:Ky;return{width:n,height:t.height}},dre=ke(Wi,nu,EB),fre=(t,e,n)=>{switch(e){case"top":return t.top;case"bottom":return n-t.bottom;default:return 0}},hre=(t,e,n)=>{switch(e){case"left":return t.left;case"right":return n-t.right;default:return 0}},pre=ke(eu,Wi,lre,DS,US,(t,e,n,r,i)=>{var s={},a;return n.forEach(o=>{var l=EB(e,o);a==null&&(a=fre(e,r,t));var c=r==="top"&&!i||r==="bottom"&&i;s[o.id]=a-Number(c)*l.height,a+=(c?-1:1)*l.height}),s}),mre=ke(Jc,Wi,cre,DS,US,(t,e,n,r,i)=>{var s={},a;return n.forEach(o=>{var l=ure(e,o);a==null&&(a=hre(e,r,t));var c=r==="left"&&!i||r==="right"&&i;s[o.id]=a-Number(c)*l.width,a+=(c?-1:1)*l.width}),s}),gre=(t,e)=>{var n=nu(t,e);if(n!=null)return pre(t,n.orientation,n.mirror)},vre=ke([Wi,nu,gre,(t,e)=>e],(t,e,n,r)=>{if(e!=null){var i=n==null?void 0:n[r];return i==null?{x:t.left,y:0}:{x:t.left,y:i}}}),yre=(t,e)=>{var n=ru(t,e);if(n!=null)return mre(t,n.orientation,n.mirror)},xre=ke([Wi,ru,yre,(t,e)=>e],(t,e,n,r)=>{if(e!=null){var i=n==null?void 0:n[r];return i==null?{x:0,y:t.top}:{x:i,y:t.top}}}),bre=ke(Wi,ru,(t,e)=>{var n=typeof e.width=="number"?e.width:Ky;return{width:n,height:t.height}}),AB=(t,e,n,r)=>{if(n!=null){var i=n.allowDuplicatedCategory,s=n.type,a=n.dataKey,o=jl(t,r),l=e.map(d=>d.value),c=l.filter(d=>d!=null);if(a&&o&&s==="category"&&i&&x5(c))return l}},B2=ke([hr,sx,Cs,_i],AB),hL=ke([hr,Cne,Yg,LS,B2,z2,ax,j2,_i],(t,e,n,r,i,s,a,o,l)=>{if(e!=null){var c=jl(t,l);return{angle:e.angle,interval:e.interval,minTickGap:e.minTickGap,orientation:e.orientation,tick:e.tick,tickCount:e.tickCount,tickFormatter:e.tickFormatter,ticks:e.ticks,type:e.type,unit:e.unit,axisType:l,categoricalDomain:s,duplicateDomain:i,isCategorical:c,niceTicks:o,range:a,realScaleType:n,scale:r}}}),_re=(t,e,n,r,i,s,a,o,l)=>{if(!(e==null||r==null)){var c=jl(t,l),d=e.type,f=e.ticks,p=e.tickCount,y=n==="scaleBand"&&typeof r.bandwidth=="function"?r.bandwidth()/2:2,b=d==="category"&&r.bandwidth?r.bandwidth()/y:0;b=l==="angleAxis"&&s!=null&&s.length>=2?Va(s[0]-s[1])*2*b:b;var S=f||i;return S?S.map((w,x)=>{var M=a?a.indexOf(w):w,T=r.map(M);return wn(T)?{index:x,coordinate:T+b,value:w,offset:b}:null}).filter(Ys):c&&o?o.map((w,x)=>{var M=r.map(w);return wn(M)?{coordinate:M+b,value:w,index:x,offset:b}:null}).filter(Ys):r.ticks?r.ticks(p).map((w,x)=>{var M=r.map(w);return wn(M)?{coordinate:M+b,value:w,index:x,offset:b}:null}).filter(Ys):r.domain().map((w,x)=>{var M=r.map(w);return wn(M)?{coordinate:M+b,value:a?a[w]:w,index:x,offset:b}:null}).filter(Ys)}},TB=ke([hr,ix,Yg,LS,j2,ax,B2,z2,_i],_re),wre=(t,e,n,r,i,s,a)=>{if(!(e==null||n==null||r==null||r[0]===r[1])){var o=jl(t,a),l=e.tickCount,c=0;return c=a==="angleAxis"&&(r==null?void 0:r.length)>=2?Va(r[0]-r[1])*2*c:c,o&&s?s.map((d,f)=>{var p=n.map(d);return wn(p)?{coordinate:p+c,value:d,index:f,offset:c}:null}).filter(Ys):n.ticks?n.ticks(l).map((d,f)=>{var p=n.map(d);return wn(p)?{coordinate:p+c,value:d,index:f,offset:c}:null}).filter(Ys):n.domain().map((d,f)=>{var p=n.map(d);return wn(p)?{coordinate:p+c,value:i?i[d]:d,index:f,offset:c}:null}).filter(Ys)}},PB=ke([hr,ix,LS,ax,B2,z2,_i],wre),CB=ke(Cs,LS,(t,e)=>{if(!(t==null||e==null))return zw(zw({},t),{},{scale:e})}),Sre=ke([Cs,Yg,U2,wB],I2),Mre=ke([Sre],l2);ke((t,e,n)=>k2(t,n),Mre,(t,e)=>{if(!(t==null||e==null))return zw(zw({},t),{},{scale:e})});var Ere=ke([hr,fS,hS],(t,e,n)=>{switch(t){case"horizontal":return e.some(r=>r.reversed)?"right-to-left":"left-to-right";case"vertical":return n.some(r=>r.reversed)?"bottom-to-top":"top-to-bottom";case"centric":case"radial":return"left-to-right";default:return}}),Are=(t,e,n)=>{var r;return(r=t.renderedTicks[e])===null||r===void 0?void 0:r[n]};ke([Are],t=>{if(!(!t||t.length===0))return e=>{var n,r=1/0,i=t[0];for(var s of t){var a=Math.abs(s.coordinate-e);at.options.defaultTooltipEventType,NB=t=>t.options.validateTooltipEventTypes;function IB(t,e,n){if(t==null)return e;var r=t?"axis":"item";return n==null?e:n.includes(r)?r:e}function ox(t,e){var n=RB(t),r=NB(t);return IB(e,n,r)}function Tre(t){return Ft(e=>ox(e,t))}var kB=(t,e)=>{var n,r=Number(e);if(!(Rl(r)||e==null))return r>=0?t==null||(n=t[r])===null||n===void 0?void 0:n.value:void 0},Pre=t=>t.tooltip.settings,ld={active:!1,index:null,dataKey:void 0,graphicalItemId:void 0,coordinate:void 0},Cre={itemInteraction:{click:ld,hover:ld},axisInteraction:{click:ld,hover:ld},keyboardInteraction:ld,syncInteraction:{active:!1,index:null,dataKey:void 0,label:void 0,coordinate:void 0,sourceViewBox:void 0,graphicalItemId:void 0},tooltipItemPayloads:[],settings:{shared:void 0,trigger:"hover",axisId:0,active:!1,defaultIndex:void 0}},OB=cs({name:"tooltip",initialState:Cre,reducers:{addTooltipEntrySettings:{reducer(t,e){t.tooltipItemPayloads.push(e.payload)},prepare:ar()},replaceTooltipEntrySettings:{reducer(t,e){var n=e.payload,r=n.prev,i=n.next,s=Ga(t).tooltipItemPayloads.indexOf(r);s>-1&&(t.tooltipItemPayloads[s]=i)},prepare:ar()},removeTooltipEntrySettings:{reducer(t,e){var n=Ga(t).tooltipItemPayloads.indexOf(e.payload);n>-1&&t.tooltipItemPayloads.splice(n,1)},prepare:ar()},setTooltipSettingsState(t,e){t.settings=e.payload},setActiveMouseOverItemIndex(t,e){t.syncInteraction.active=!1,t.syncInteraction.sourceViewBox=void 0,t.keyboardInteraction.active=!1,t.itemInteraction.hover.active=!0,t.itemInteraction.hover.index=e.payload.activeIndex,t.itemInteraction.hover.dataKey=e.payload.activeDataKey,t.itemInteraction.hover.graphicalItemId=e.payload.activeGraphicalItemId,t.itemInteraction.hover.coordinate=e.payload.activeCoordinate},mouseLeaveChart(t){t.itemInteraction.hover.active=!1,t.axisInteraction.hover.active=!1},mouseLeaveItem(t){t.itemInteraction.hover.active=!1},setActiveClickItemIndex(t,e){t.syncInteraction.active=!1,t.syncInteraction.sourceViewBox=void 0,t.itemInteraction.click.active=!0,t.keyboardInteraction.active=!1,t.itemInteraction.click.index=e.payload.activeIndex,t.itemInteraction.click.dataKey=e.payload.activeDataKey,t.itemInteraction.click.graphicalItemId=e.payload.activeGraphicalItemId,t.itemInteraction.click.coordinate=e.payload.activeCoordinate},setMouseOverAxisIndex(t,e){t.syncInteraction.active=!1,t.syncInteraction.sourceViewBox=void 0,t.axisInteraction.hover.active=!0,t.keyboardInteraction.active=!1,t.axisInteraction.hover.index=e.payload.activeIndex,t.axisInteraction.hover.dataKey=e.payload.activeDataKey,t.axisInteraction.hover.coordinate=e.payload.activeCoordinate},setMouseClickAxisIndex(t,e){t.syncInteraction.active=!1,t.syncInteraction.sourceViewBox=void 0,t.keyboardInteraction.active=!1,t.axisInteraction.click.active=!0,t.axisInteraction.click.index=e.payload.activeIndex,t.axisInteraction.click.dataKey=e.payload.activeDataKey,t.axisInteraction.click.coordinate=e.payload.activeCoordinate},setSyncInteraction(t,e){t.syncInteraction=e.payload},setKeyboardInteraction(t,e){t.keyboardInteraction.active=e.payload.active,t.keyboardInteraction.index=e.payload.activeIndex,t.keyboardInteraction.coordinate=e.payload.activeCoordinate}}}),Ja=OB.actions,Rre=Ja.addTooltipEntrySettings,Nre=Ja.replaceTooltipEntrySettings,Ire=Ja.removeTooltipEntrySettings,kre=Ja.setTooltipSettingsState,Ore=Ja.setActiveMouseOverItemIndex;Ja.mouseLeaveItem;var LB=Ja.mouseLeaveChart;Ja.setActiveClickItemIndex;var DB=Ja.setMouseOverAxisIndex,Lre=Ja.setMouseClickAxisIndex,H0=Ja.setSyncInteraction,Hw=Ja.setKeyboardInteraction,Dre=OB.reducer;function pL(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(t,i).enumerable})),n.push.apply(n,r)}return n}function Ob(t){for(var e=1;e{if(e==null)return ld;var i=zre(t,e,n);if(i==null)return ld;if(i.active)return i;if(t.keyboardInteraction.active)return t.keyboardInteraction;if(t.syncInteraction.active&&t.syncInteraction.index!=null)return t.syncInteraction;var s=t.settings.active===!0;if(Bre(i)){if(s)return Ob(Ob({},i),{},{active:!0})}else if(r!=null)return{active:!0,coordinate:void 0,dataKey:void 0,index:r,graphicalItemId:void 0};return Ob(Ob({},ld),{},{coordinate:i.coordinate})};function Hre(t){if(typeof t=="number")return Number.isFinite(t)?t:void 0;if(t instanceof Date){var e=t.valueOf();return Number.isFinite(e)?e:void 0}var n=Number(t);return Number.isFinite(n)?n:void 0}function Vre(t,e){var n=Hre(t),r=e[0],i=e[1];if(n===void 0)return!1;var s=Math.min(r,i),a=Math.max(r,i);return n>=s&&n<=a}function Gre(t,e,n){if(n==null||e==null)return!0;var r=yi(t,e);return r==null||!El(n)?!0:Vre(r,n)}var X0=(t,e,n,r)=>{var i=t==null?void 0:t.index;if(i==null)return null;var s=Number(i);if(!wn(s))return i;var a=0,o=1/0;e.length>0&&(o=e.length-1);var l=Math.max(a,Math.min(s,o)),c=e[l];return c==null||Gre(c,n,r)?String(l):null},jB=(t,e,n,r,i,s,a)=>{if(s!=null){var o=a[0],l=o==null?void 0:o.getPosition(s);if(l!=null)return l;var c=i==null?void 0:i[Number(s)];if(c)switch(n){case"horizontal":return{x:c.coordinate,y:(r.top+e)/2};default:return{x:(r.left+t)/2,y:c.coordinate}}}},FB=(t,e,n,r)=>{if(e==="axis")return t.tooltipItemPayloads;if(t.tooltipItemPayloads.length===0)return[];var i;if(n==="hover"?i=t.itemInteraction.hover.graphicalItemId:i=t.itemInteraction.click.graphicalItemId,t.syncInteraction.active&&i==null)return t.tooltipItemPayloads;if(i==null&&(r!=null||t.keyboardInteraction.active)){var s=t.tooltipItemPayloads[0];return s!=null?[s]:[]}return t.tooltipItemPayloads.filter(a=>{var o;return((o=a.settings)===null||o===void 0?void 0:o.graphicalItemId)===i})},zB=t=>t.options.tooltipPayloadSearcher,Zg=t=>t.tooltip;function mL(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(t,i).enumerable})),n.push.apply(n,r)}return n}function gL(t){for(var e=1;et(e)}function vL(t){if(typeof t=="string")return t}function Zre(t){if(!(t==null||typeof t!="object")){var e="name"in t?qre(t.name):void 0,n="unit"in t?Kre(t.unit):void 0,r="dataKey"in t?Yre(t.dataKey):void 0,i="payload"in t?t.payload:void 0,s="color"in t?vL(t.color):void 0,a="fill"in t?vL(t.fill):void 0;return{name:e,unit:n,dataKey:r,payload:i,color:s,fill:a}}}function Qre(t,e){return t??e}var BB=(t,e,n,r,i,s,a)=>{if(!(e==null||s==null)){var o=n.chartData,l=n.computedData,c=n.dataStartIndex,d=n.dataEndIndex,f=[];return t.reduce((p,y)=>{var b,S=y.dataDefinedOnItem,w=y.settings,x=Qre(S,o),M=Array.isArray(x)?f4(x,c,d):x,T=(b=w==null?void 0:w.dataKey)!==null&&b!==void 0?b:r,P=w==null?void 0:w.nameKey,O;if(r&&Array.isArray(M)&&!Array.isArray(M[0])&&a==="axis"?O=b5(M,r,i):O=s(M,e,l,P),Array.isArray(O))O.forEach(D=>{var z,V,k=Zre(D),j=k==null?void 0:k.name,X=k==null?void 0:k.dataKey,ee=k==null?void 0:k.payload,ie=gL(gL({},w),{},{name:j,unit:k==null?void 0:k.unit,color:(z=k==null?void 0:k.color)!==null&&z!==void 0?z:w==null?void 0:w.color,fill:(V=k==null?void 0:k.fill)!==null&&V!==void 0?V:w==null?void 0:w.fill});p.push(dk({tooltipEntrySettings:ie,dataKey:X,payload:ee,value:yi(ee,X),name:j==null?void 0:String(j)}))});else{var N;p.push(dk({tooltipEntrySettings:w,dataKey:T,payload:O,value:yi(O,T),name:(N=yi(O,P))!==null&&N!==void 0?N:w==null?void 0:w.name}))}return p},f)}},H2=ke([oi,$z,e2],Bz),Jre=ke([t=>t.graphicalItems.cartesianItems,t=>t.graphicalItems.polarItems],(t,e)=>[...t,...e]),eie=ke([wi,$g],Xz),Jh=ke([Jre,oi,eie],Kz,{memoizeOptions:{resultEqualityCheck:PS}}),tie=ke([Jh],t=>t.filter(o2)),HB=ke([Jh],Qz,{memoizeOptions:{resultEqualityCheck:PS}}),nie=ke([Jh],t=>t.some(e=>!e.data)),jh=ke([HB,$o],eB),rie=ke([tie,$o,oi],az),V2=ke([jh,oi,Jh,$o,nie,HB],tB),VB=ke([oi],L2),iie=ke([oi],t=>t.allowDataOverflow),GB=ke([VB,iie],H4),sie=ke([Jh],t=>t.filter(o2)),aie=ke([rie,sie,wS,J4],rB),oie=ke([aie,$o,wi,GB],sB),lie=ke([Jh],Zz),cie=ke([jh,oi,lie,D2,wi,yJ],lB,{memoizeOptions:{resultEqualityCheck:TS}}),uie=ke([cB,wi,$g],Kg),die=ke([uie,wi],fB),fie=ke([uB,wi,$g],Kg),hie=ke([fie,wi],hB),pie=ke([dB,wi,$g],Kg),mie=ke([pie,wi],pB),gie=ke([die,mie,hie],Bw),vie=ke([oi,VB,GB,oie,cie,gie,hr,wi],mB),Cg=ke([oi,hr,jh,V2,wS,wi,vie],gB),yie=ke([Cg,oi,H2],vB),xie=ke([oi,Cg,yie,wi],yB),WB=t=>{var e=wi(t),n=$g(t),r=!1;return ax(t,e,n,r)},$B=ke([oi,WB],SS),bie=ke([oi,H2,xie,$B],I2),XB=ke([bie],l2),_ie=ke([hr,V2,oi,wi],AB),wie=ke([hr,V2,oi,wi],SB),Sie=(t,e,n,r,i,s,a,o)=>{if(e){var l=e.type,c=jl(t,o);if(r){var d=n==="scaleBand"&&r.bandwidth?r.bandwidth()/2:2,f=l==="category"&&r.bandwidth?r.bandwidth()/d:0;return f=o==="angleAxis"&&i!=null&&(i==null?void 0:i.length)>=2?Va(i[0]-i[1])*2*f:f,c&&a?a.map((p,y)=>{var b=r.map(p);return wn(b)?{coordinate:b+f,value:p,index:y,offset:f}:null}).filter(Ys):r.domain().map((p,y)=>{var b=r.map(p);return wn(b)?{coordinate:b+f,value:s?s[p]:p,index:y,offset:f}:null}).filter(Ys)}}},iu=ke([hr,oi,H2,XB,WB,_ie,wie,wi],Sie),G2=ke([RB,NB,Pre],(t,e,n)=>IB(n.shared,t,e)),qB=t=>t.tooltip.settings.trigger,W2=t=>t.tooltip.settings.defaultIndex,lx=ke([Zg,G2,qB,W2],UB),Sy=ke([lx,jh,Pg,Cg],X0),KB=ke([iu,Sy],kB),Mie=ke([lx],t=>{if(t)return t.dataKey}),Eie=ke([lx],t=>{if(t)return t.graphicalItemId}),YB=ke([Zg,G2,qB,W2],FB),Aie=ke([Jc,eu,hr,Wi,iu,W2,YB],jB),Tie=ke([lx,Aie],(t,e)=>t!=null&&t.coordinate?t.coordinate:e),Pie=ke([lx],t=>{var e;return(e=t==null?void 0:t.active)!==null&&e!==void 0?e:!1}),Cie=ke([YB,Sy,$o,Pg,KB,zB,G2],BB),Rie=ke([Cie],t=>{if(t!=null){var e=t.map(n=>n.payload).filter(n=>n!=null);return Array.from(new Set(e))}});function yL(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(t,i).enumerable})),n.push.apply(n,r)}return n}function xL(t){for(var e=1;eFt(oi),Lie=()=>{var t=Oie(),e=Ft(iu),n=Ft(XB);return yw(!t||!n?void 0:xL(xL({},t),{},{scale:n}),e)};function bL(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(t,i).enumerable})),n.push.apply(n,r)}return n}function cm(t){for(var e=1;e{var i=e.find(s=>s&&s.index===n);if(i){if(t==="horizontal")return{x:i.coordinate,y:r.relativeY};if(t==="vertical")return{x:r.relativeX,y:i.coordinate}}return{x:0,y:0}},zie=(t,e,n,r)=>{var i=e.find(c=>c&&c.index===n);if(i){if(t==="centric"){var s=i.coordinate,a=r.radius;return cm(cm(cm({},r),Bi(r.cx,r.cy,a,s)),{},{angle:s,radius:a})}var o=i.coordinate,l=r.angle;return cm(cm(cm({},r),Bi(r.cx,r.cy,o,l)),{},{angle:l,radius:o})}return{angle:0,clockWise:!1,cx:0,cy:0,endAngle:0,innerRadius:0,outerRadius:0,radius:0,startAngle:0,x:0,y:0}};function Bie(t,e){var n=t.relativeX,r=t.relativeY;return n>=e.left&&n<=e.left+e.width&&r>=e.top&&r<=e.top+e.height}var ZB=(t,e,n,r,i)=>{var s,a=(s=e==null?void 0:e.length)!==null&&s!==void 0?s:0;if(a<=1||t==null)return 0;if(r==="angleAxis"&&i!=null&&Math.abs(Math.abs(i[1]-i[0])-360)<=1e-6)for(var o=0;o0?(l=n[o-1])===null||l===void 0?void 0:l.coordinate:(c=n[a-1])===null||c===void 0?void 0:c.coordinate,b=(d=n[o])===null||d===void 0?void 0:d.coordinate,S=o>=a-1?(f=n[0])===null||f===void 0?void 0:f.coordinate:(p=n[o+1])===null||p===void 0?void 0:p.coordinate,w=void 0;if(!(y==null||b==null||S==null))if(Va(b-y)!==Va(S-b)){var x=[];if(Va(S-b)===Va(i[1]-i[0])){w=S;var M=b+i[1]-i[0];x[0]=Math.min(M,(M+y)/2),x[1]=Math.max(M,(M+y)/2)}else{w=y;var T=S+i[1]-i[0];x[0]=Math.min(b,(T+b)/2),x[1]=Math.max(b,(T+b)/2)}var P=[Math.min(b,(w+b)/2),Math.max(b,(w+b)/2)];if(t>P[0]&&t<=P[1]||t>=x[0]&&t<=x[1]){var O;return(O=n[o])===null||O===void 0?void 0:O.index}}else{var N=Math.min(y,S),D=Math.max(y,S);if(t>(N+b)/2&&t<=(D+b)/2){var z;return(z=n[o])===null||z===void 0?void 0:z.index}}}else if(e)for(var V=0;V(k.coordinate+X.coordinate)/2||V>0&&V(k.coordinate+X.coordinate)/2&&t<=(k.coordinate+j.coordinate)/2)return k.index}}return-1},QB=()=>Ft(e2),$2=(t,e)=>e,JB=(t,e,n)=>n,X2=(t,e,n,r)=>r,Hie=ke(iu,t=>tS(t,e=>e.coordinate)),q2=ke([Zg,$2,JB,X2],UB),K2=ke([q2,jh,Pg,Cg],X0),Vie=(t,e,n)=>{if(e!=null){var r=Zg(t);return e==="axis"?n==="hover"?r.axisInteraction.hover.dataKey:r.axisInteraction.click.dataKey:n==="hover"?r.itemInteraction.hover.dataKey:r.itemInteraction.click.dataKey}},eH=ke([Zg,$2,JB,X2],FB),Vw=ke([Jc,eu,hr,Wi,iu,X2,eH],jB),Gie=ke([q2,Vw],(t,e)=>{var n;return(n=t.coordinate)!==null&&n!==void 0?n:e}),tH=ke([iu,K2],kB),Wie=ke([eH,K2,$o,Pg,tH,zB,$2],BB),$ie=ke([q2,K2],(t,e)=>({isActive:t.active&&e!=null,activeIndex:e})),Xie=(t,e,n,r,i,s,a)=>{if(!(!t||!n||!r||!i)&&Bie(t,a)){var o=aY(t,e),l=ZB(o,s,i,n,r),c=Fie(e,i,l,t);return{activeIndex:String(l),activeCoordinate:c}}},qie=(t,e,n,r,i,s,a)=>{if(!(!t||!r||!i||!s||!n)){var o=cJ(t,n);if(o){var l=oY(o,e),c=ZB(l,a,s,r,i),d=zie(e,s,c,o);return{activeIndex:String(c),activeCoordinate:d}}}},Kie=(t,e,n,r,i,s,a,o)=>{if(!(!t||!e||!r||!i||!s))return e==="horizontal"||e==="vertical"?Xie(t,e,r,i,s,a,o):qie(t,e,n,r,i,s,a)},Yie=ke(t=>t.zIndex.zIndexMap,(t,e)=>e,(t,e,n)=>n,(t,e,n)=>{if(e!=null){var r=t[e];if(r!=null)return n?r.panoramaElement:r.element}}),Zie=ke(t=>t.zIndex.zIndexMap,t=>{var e=Object.keys(t).map(r=>parseInt(r,10)).concat(Object.values(Ms)),n=Array.from(new Set(e));return n.sort((r,i)=>r-i)},{memoizeOptions:{resultEqualityCheck:zJ}});function _L(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(t,i).enumerable})),n.push.apply(n,r)}return n}function wL(t){for(var e=1;ewL(wL({},t),{},{[e]:{element:void 0,panoramaElement:void 0,consumers:0}}),tse)},rse=new Set(Object.values(Ms));function ise(t){return rse.has(t)}var nH=cs({name:"zIndex",initialState:nse,reducers:{registerZIndexPortal:{reducer:(t,e)=>{var n=e.payload.zIndex;t.zIndexMap[n]?t.zIndexMap[n].consumers+=1:t.zIndexMap[n]={consumers:1,element:void 0,panoramaElement:void 0}},prepare:ar()},unregisterZIndexPortal:{reducer:(t,e)=>{var n=e.payload.zIndex;t.zIndexMap[n]&&(t.zIndexMap[n].consumers-=1,t.zIndexMap[n].consumers<=0&&!ise(n)&&delete t.zIndexMap[n])},prepare:ar()},registerZIndexPortalElement:{reducer:(t,e)=>{var n=e.payload,r=n.zIndex,i=n.element,s=n.isPanorama;t.zIndexMap[r]?s?t.zIndexMap[r].panoramaElement=i:t.zIndexMap[r].element=i:t.zIndexMap[r]={consumers:0,element:s?void 0:i,panoramaElement:s?i:void 0}},prepare:ar()},unregisterZIndexPortalElement:{reducer:(t,e)=>{var n=e.payload.zIndex;t.zIndexMap[n]&&(e.payload.isPanorama?t.zIndexMap[n].panoramaElement=void 0:t.zIndexMap[n].element=void 0)},prepare:ar()}}}),jS=nH.actions,sse=jS.registerZIndexPortal,jE=jS.unregisterZIndexPortal,ase=jS.registerZIndexPortalElement,ose=jS.unregisterZIndexPortalElement,lse=nH.reducer;function su(t){var e=t.zIndex,n=t.children,r=WY(),i=r&&e!==void 0&&e!==0,s=Js(),a=R.useRef(void 0),o=R.useRef(new Set),l=Wr(),c=Ft(f=>Yie(f,e,s));if(R.useLayoutEffect(()=>{if(!i){var f=o.current;f.forEach(y=>{l(jE({zIndex:y}))}),f.clear(),a.current=void 0;return}if(o.current.has(e)||(l(sse({zIndex:e})),o.current.add(e)),c){a.current=c;var p=o.current;p.forEach(y=>{y!==e&&(l(jE({zIndex:y})),p.delete(y))})}},[l,e,i,c]),R.useLayoutEffect(()=>{var f=o.current;return()=>{f.forEach(p=>{l(jE({zIndex:p}))}),f.clear()}},[l]),!i)return n;var d=c??a.current;return d?X1.createPortal(n,d):null}function CP(){return CP=Object.assign?Object.assign.bind():function(t){for(var e=1;eR.useContext(rH),FE={exports:{}},ML;function gse(){return ML||(ML=1,(function(t){var e=Object.prototype.hasOwnProperty,n="~";function r(){}Object.create&&(r.prototype=Object.create(null),new r().__proto__||(n=!1));function i(l,c,d){this.fn=l,this.context=c,this.once=d||!1}function s(l,c,d,f,p){if(typeof d!="function")throw new TypeError("The listener must be a function");var y=new i(d,f||l,p),b=n?n+c:c;return l._events[b]?l._events[b].fn?l._events[b]=[l._events[b],y]:l._events[b].push(y):(l._events[b]=y,l._eventsCount++),l}function a(l,c){--l._eventsCount===0?l._events=new r:delete l._events[c]}function o(){this._events=new r,this._eventsCount=0}o.prototype.eventNames=function(){var c=[],d,f;if(this._eventsCount===0)return c;for(f in d=this._events)e.call(d,f)&&c.push(n?f.slice(1):f);return Object.getOwnPropertySymbols?c.concat(Object.getOwnPropertySymbols(d)):c},o.prototype.listeners=function(c){var d=n?n+c:c,f=this._events[d];if(!f)return[];if(f.fn)return[f.fn];for(var p=0,y=f.length,b=new Array(y);p{if(e&&Array.isArray(t)){var n=Number.parseInt(e,10);if(!Rl(n))return t[n]}},bse={chartName:"",tooltipPayloadSearcher:()=>{},eventEmitter:void 0,defaultTooltipEventType:"axis"},iH=cs({name:"options",initialState:bse,reducers:{createEventEmitter:t=>{t.eventEmitter==null&&(t.eventEmitter=Symbol("rechartsEventEmitter"))}}}),_se=iH.reducer,wse=iH.actions.createEventEmitter;function Sse(t){return t.tooltip.syncInteraction}var Mse={chartData:void 0,computedData:void 0,dataStartIndex:0,dataEndIndex:0},sH=cs({name:"chartData",initialState:Mse,reducers:{setChartData(t,e){if(t.chartData=e.payload,e.payload==null){t.dataStartIndex=0,t.dataEndIndex=0;return}e.payload.length>0&&t.dataEndIndex!==e.payload.length-1&&(t.dataEndIndex=e.payload.length-1)},setComputedData(t,e){t.computedData=e.payload},setDataStartEndIndexes(t,e){var n=e.payload,r=n.startIndex,i=n.endIndex;r!=null&&(t.dataStartIndex=r),i!=null&&(t.dataEndIndex=i)}}}),Y2=sH.actions,AL=Y2.setChartData,Ese=Y2.setDataStartEndIndexes;Y2.setComputedData;var Ase=sH.reducer,Tse=["x","y"];function TL(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(t,i).enumerable})),n.push.apply(n,r)}return n}function um(t){for(var e=1;el.rootProps.className);R.useEffect(()=>{if(t==null)return Hg;var l=(c,d,f)=>{if(e!==f&&t===c){if(d.payload.active===!1){n(H0({active:!1,coordinate:void 0,dataKey:void 0,index:null,label:void 0,sourceViewBox:void 0,graphicalItemId:void 0}));return}if(r==="index"){var p;if(a&&d!==null&&d!==void 0&&(p=d.payload)!==null&&p!==void 0&&p.coordinate&&d.payload.sourceViewBox){var y=d.payload.coordinate,b=y.x,S=y.y,w=Nse(y,Tse),x=d.payload.sourceViewBox,M=x.x,T=x.y,P=x.width,O=x.height,N=um(um({},w),{},{x:a.x+(P?(b-M)/P:0)*a.width,y:a.y+(O?(S-T)/O:0)*a.height});n(um(um({},d),{},{payload:um(um({},d.payload),{},{coordinate:N})}))}else n(d);return}if(i!=null){var D;if(typeof r=="function"){var z={activeTooltipIndex:d.payload.index==null?void 0:Number(d.payload.index),isTooltipActive:d.payload.active,activeIndex:d.payload.index==null?void 0:Number(d.payload.index),activeLabel:d.payload.label,activeDataKey:d.payload.dataKey,activeCoordinate:d.payload.coordinate},V=r(i,z);D=i[V]}else r==="value"&&(D=i.find(he=>String(he.value)===d.payload.label));var k=d.payload.coordinate;if(k==null||a==null){n(H0({active:!1,coordinate:void 0,dataKey:void 0,index:null,label:void 0,sourceViewBox:void 0,graphicalItemId:void 0}));return}if(D==null){n(H0({active:!1,coordinate:void 0,dataKey:void 0,index:null,label:void 0,sourceViewBox:d.payload.sourceViewBox,graphicalItemId:void 0}));return}var j=k.x,X=k.y,ee=Math.min(j,a.x+a.width),ie=Math.min(X,a.y+a.height),pe={x:s==="horizontal"?D.coordinate:ee,y:s==="horizontal"?ie:D.coordinate},ae=H0({active:d.payload.active,coordinate:pe,dataKey:d.payload.dataKey,index:String(D.index),label:d.payload.label,sourceViewBox:d.payload.sourceViewBox,graphicalItemId:d.payload.graphicalItemId});n(ae)}}};return My.on(RP,l),()=>{My.off(RP,l)}},[o,n,e,t,r,i,s,a])}function Ose(){var t=Ft(t2),e=Ft(n2),n=Wr();R.useEffect(()=>{if(t==null)return Hg;var r=(i,s,a)=>{e!==a&&t===i&&n(Ese(s))};return My.on(EL,r),()=>{My.off(EL,r)}},[n,e,t])}function Lse(){var t=Wr();R.useEffect(()=>{t(wse())},[t]),kse(),Ose()}function Dse(t,e,n,r,i,s){var a=Ft(b=>Vie(b,t,e)),o=Ft(Eie),l=Ft(n2),c=Ft(t2),d=Ft(ez),f=Ft(Sse),p=(f==null?void 0:f.sourceViewBox)!=null,y=gS();R.useEffect(()=>{if(!p&&c!=null&&l!=null){var b=H0({active:s,coordinate:n,dataKey:a,index:i,label:typeof r=="number"?String(r):r,sourceViewBox:y,graphicalItemId:o});My.emit(RP,c,b,l)}},[p,n,a,o,i,r,l,c,d,s,y])}function PL(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(t,i).enumerable})),n.push.apply(n,r)}return n}function CL(t){for(var e=1;et.length)&&(e=t.length);for(var n=0,r=Array(e);n{D(kre({shared:M,trigger:T,axisId:N,active:i,defaultIndex:z}))},[D,M,T,N,i,z]);var V=gS(),k=k4(),j=Tre(M),X=(e=Ft($e=>$ie($e,j,T,z)))!==null&&e!==void 0?e:{},ee=X.activeIndex,ie=X.isActive,pe=Ft($e=>Wie($e,j,T,z)),ae=Ft($e=>tH($e,j,T,z)),he=Ft($e=>Gie($e,j,T,z)),B=pe,J=mse(),Y=(n=i??ie)!==null&&n!==void 0?n:!1,H=$q([B,Y]),G=zse(H,2),le=G[0],se=G[1],ce=j==="axis"?ae:void 0;Dse(j,T,he,ce,ee,Y);var Se=O??J;if(Se==null||V==null||j==null)return null;var we=B??NL;Y||(we=NL),c&&we.length&&(we=mq(we.filter($e=>$e.value!=null&&($e.hide!==!0||r.includeHidden)),p,Wse));var We=we.length>0,Ee=CL(CL({},r),{},{payload:we,label:ce,active:Y,activeIndex:ee,coordinate:he,accessibilityLayer:k}),Ge=R.createElement(rQ,{allowEscapeViewBox:s,animationDuration:a,animationEasing:o,isAnimationActive:d,active:Y,coordinate:he,hasPayload:We,offset:f,position:y,reverseDirection:b,useTranslate3d:S,viewBox:V,wrapperStyle:w,lastBoundingBox:le,innerRef:se,hasPortalFromProps:!!O},$se(l,Ee));return R.createElement(R.Fragment,null,X1.createPortal(Ge,Se),Y&&R.createElement(pse,{cursor:x,tooltipEventType:j,coordinate:he,payload:we,index:ee}))}function Kse(t,e,n){return(e=Yse(e))in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function Yse(t){var e=Zse(t,"string");return typeof e=="symbol"?e:e+""}function Zse(t,e){if(typeof t!="object"||!t)return t;var n=t[Symbol.toPrimitive];if(n!==void 0){var r=n.call(t,e);if(typeof r!="object")return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return(e==="string"?String:Number)(t)}class Qse{constructor(e){Kse(this,"cache",new Map),this.maxSize=e}get(e){var n=this.cache.get(e);return n!==void 0&&(this.cache.delete(e),this.cache.set(e,n)),n}set(e,n){if(this.cache.has(e))this.cache.delete(e);else if(this.cache.size>=this.maxSize){var r=this.cache.keys().next().value;r!=null&&this.cache.delete(r)}this.cache.set(e,n)}clear(){this.cache.clear()}size(){return this.cache.size}}function IL(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(t,i).enumerable})),n.push.apply(n,r)}return n}function Jse(t){for(var e=1;e{try{var n=document.getElementById(OL);n||(n=document.createElement("span"),n.setAttribute("id",OL),n.setAttribute("aria-hidden","true"),document.body.appendChild(n)),Object.assign(n.style,iae,e),n.textContent="".concat(t);var r=n.getBoundingClientRect();return{width:r.width,height:r.height}}catch{return{width:0,height:0}}},q0=function(e){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(e==null||Jy.isSsr)return{width:0,height:0};if(!aH.enableCache)return LL(e,n);var r=sae(e,n),i=kL.get(r);if(i)return i;var s=LL(e,n);return kL.set(r,s),s},oH;function Gw(t,e){return cae(t)||lae(t,e)||oae(t,e)||aae()}function aae(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function oae(t,e){if(t){if(typeof t=="string")return DL(t,e);var n={}.toString.call(t).slice(8,-1);return n==="Object"&&t.constructor&&(n=t.constructor.name),n==="Map"||n==="Set"?Array.from(t):n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?DL(t,e):void 0}}function DL(t,e){(e==null||e>t.length)&&(e=t.length);for(var n=0,r=Array(e);nt.length)&&(e=t.length);for(var n=0,r=Array(e);n{var e=t.children,n=t.breakAll,r=t.style;try{var i=[];Vi(e)||(n?i=e.toString().split(""):i=e.toString().split(cH));var s=i.map(o=>({word:o,width:q0(o,r).width})),a=n?0:q0(" ",r).width;return{wordsWithComputedWidth:s,spaceWidth:a}}catch{return null}};function dH(t){return t==="start"||t==="middle"||t==="end"||t==="inherit"}function Cae(t){return Vi(t)||typeof t=="string"||typeof t=="number"||typeof t=="boolean"}var fH=(t,e,n,r)=>t.reduce((i,s)=>{var a=s.word,o=s.width,l=i[i.length-1];if(l&&o!=null&&(e==null||r||l.width+o+nt.reduce((e,n)=>e.width>n.width?e:n),Rae="…",VL=(t,e,n,r,i,s,a,o)=>{var l=t.slice(0,e),c=uH({breakAll:n,style:r,children:l+Rae});if(!c)return[!1,[]];var d=fH(c.wordsWithComputedWidth,s,a,o),f=d.length>i||hH(d).width>Number(s);return[f,d]},Nae=(t,e,n,r,i)=>{var s=t.maxLines,a=t.children,o=t.style,l=t.breakAll,c=kt(s),d=String(a),f=fH(e,r,n,i);if(!c||i)return f;var p=f.length>s||hH(f).width>Number(r);if(!p)return f;for(var y=0,b=d.length-1,S=0,w;y<=b&&S<=d.length-1;){var x=Math.floor((y+b)/2),M=x-1,T=VL(d,M,l,o,s,r,n,i),P=BL(T,2),O=P[0],N=P[1],D=VL(d,x,l,o,s,r,n,i),z=BL(D,1),V=z[0];if(!O&&!V&&(y=x+1),O&&V&&(b=x-1),!O&&V){w=N;break}S++}return w||f},GL=t=>{var e=Vi(t)?[]:t.toString().split(cH);return[{words:e,width:void 0}]},Iae=t=>{var e=t.width,n=t.scaleToFit,r=t.children,i=t.style,s=t.breakAll,a=t.maxLines;if((e||n)&&!Jy.isSsr){var o,l,c=uH({breakAll:s,children:r,style:i});if(c){var d=c.wordsWithComputedWidth,f=c.spaceWidth;o=d,l=f}else return GL(r);return Nae({breakAll:s,children:r,maxLines:a,style:i},o,l,e,!!n)}return GL(r)},pH="#808080",kae={angle:0,breakAll:!1,capHeight:"0.71em",fill:pH,lineHeight:"1em",scaleToFit:!1,textAnchor:"start",verticalAnchor:"end",x:0,y:0},Z2=R.forwardRef((t,e)=>{var n=Za(t,kae),r=n.x,i=n.y,s=n.lineHeight,a=n.capHeight,o=n.fill,l=n.scaleToFit,c=n.textAnchor,d=n.verticalAnchor,f=zL(n,wae),p=R.useMemo(()=>Iae({breakAll:f.breakAll,children:f.children,maxLines:f.maxLines,scaleToFit:l,style:f.style,width:f.width}),[f.breakAll,f.children,f.maxLines,l,f.style,f.width]),y=f.dx,b=f.dy,S=f.angle,w=f.className,x=f.breakAll,M=zL(f,Sae);if(!Nl(r)||!Nl(i)||p.length===0)return null;var T=Number(r)+(kt(y)?y:0),P=Number(i)+(kt(b)?b:0);if(!wn(T)||!wn(P))return null;var O;switch(d){case"start":O=zE("calc(".concat(a,")"));break;case"middle":O=zE("calc(".concat((p.length-1)/2," * -").concat(s," + (").concat(a," / 2))"));break;default:O=zE("calc(".concat(p.length-1," * -").concat(s,")"));break}var N=[],D=p[0];if(l&&D!=null){var z=D.width,V=f.width;N.push("scale(".concat(kt(V)&&kt(z)?V/z:1,")"))}return S&&N.push("rotate(".concat(S,", ").concat(T,", ").concat(P,")")),N.length&&(M.transform=N.join(" ")),R.createElement("text",NP({},Xa(M),{ref:e,x:T,y:P,className:tr("recharts-text",w),textAnchor:c,fill:o.includes("url")?pH:o}),p.map((k,j)=>{var X=k.words.join(x?"":" ");return R.createElement("tspan",{x:T,dy:j===0?O:s,key:"".concat(X,"-").concat(j)},X)}))});Z2.displayName="Text";function WL(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(t,i).enumerable})),n.push.apply(n,r)}return n}function pl(t){for(var e=1;e{var e=t.viewBox,n=t.position,r=t.offset,i=r===void 0?0:r,s=t.parentViewBox,a=WC(e),o=a.x,l=a.y,c=a.height,d=a.upperWidth,f=a.lowerWidth,p=o,y=o+(d-f)/2,b=(p+y)/2,S=(d+f)/2,w=p+d/2,x=c>=0?1:-1,M=x*i,T=x>0?"end":"start",P=x>0?"start":"end",O=d>=0?1:-1,N=O*i,D=O>0?"end":"start",z=O>0?"start":"end",V=s;if(n==="top"){var k={x:p+d/2,y:l-M,horizontalAnchor:"middle",verticalAnchor:T};return V&&(k.height=Math.max(l-V.y,0),k.width=d),k}if(n==="bottom"){var j={x:y+f/2,y:l+c+M,horizontalAnchor:"middle",verticalAnchor:P};return V&&(j.height=Math.max(V.y+V.height-(l+c),0),j.width=f),j}if(n==="left"){var X={x:b-N,y:l+c/2,horizontalAnchor:D,verticalAnchor:"middle"};return V&&(X.width=Math.max(X.x-V.x,0),X.height=c),X}if(n==="right"){var ee={x:b+S+N,y:l+c/2,horizontalAnchor:z,verticalAnchor:"middle"};return V&&(ee.width=Math.max(V.x+V.width-ee.x,0),ee.height=c),ee}var ie=V?{width:S,height:c}:{};return n==="insideLeft"?pl({x:b+N,y:l+c/2,horizontalAnchor:z,verticalAnchor:"middle"},ie):n==="insideRight"?pl({x:b+S-N,y:l+c/2,horizontalAnchor:D,verticalAnchor:"middle"},ie):n==="insideTop"?pl({x:p+d/2,y:l+M,horizontalAnchor:"middle",verticalAnchor:P},ie):n==="insideBottom"?pl({x:y+f/2,y:l+c-M,horizontalAnchor:"middle",verticalAnchor:T},ie):n==="insideTopLeft"?pl({x:p+N,y:l+M,horizontalAnchor:z,verticalAnchor:P},ie):n==="insideTopRight"?pl({x:p+d-N,y:l+M,horizontalAnchor:D,verticalAnchor:P},ie):n==="insideBottomLeft"?pl({x:y+N,y:l+c-M,horizontalAnchor:z,verticalAnchor:T},ie):n==="insideBottomRight"?pl({x:y+f-N,y:l+c-M,horizontalAnchor:D,verticalAnchor:T},ie):n&&typeof n=="object"&&(kt(n.x)||kh(n.x))&&(kt(n.y)||kh(n.y))?pl({x:o+Td(n.x,S),y:l+Td(n.y,c),horizontalAnchor:"end",verticalAnchor:"end"},ie):pl({x:w,y:l+c/2,horizontalAnchor:"middle",verticalAnchor:"middle"},ie)},jae=["labelRef"],Fae=["content"];function $L(t,e){if(t==null)return{};var n,r,i=zae(t,e);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(t);for(r=0;r{var e=t.x,n=t.y,r=t.upperWidth,i=t.lowerWidth,s=t.width,a=t.height,o=t.children,l=R.useMemo(()=>({x:e,y:n,upperWidth:r,lowerWidth:i,width:s,height:a}),[e,n,r,i,s,a]);return R.createElement(mH.Provider,{value:l},o)},gH=()=>{var t=R.useContext(mH),e=gS();return t||(e?WC(e):void 0)},Wae=R.createContext(null),$ae=()=>{var t=R.useContext(Wae),e=Ft(sz);return t||e},Xae=t=>{var e=t.value,n=t.formatter,r=Vi(t.children)?e:t.children;return typeof n=="function"?n(r):r},Q2=t=>t!=null&&typeof t=="function",qae=(t,e)=>{var n=Va(e-t),r=Math.min(Math.abs(e-t),360);return n*r},Kae=(t,e,n,r,i)=>{var s=t.offset,a=t.className,o=i.cx,l=i.cy,c=i.innerRadius,d=i.outerRadius,f=i.startAngle,p=i.endAngle,y=i.clockWise,b=(c+d)/2,S=qae(f,p),w=S>=0?1:-1,x,M;switch(e){case"insideStart":x=f+w*s,M=y;break;case"insideEnd":x=p-w*s,M=!y;break;case"end":x=p+w*s,M=y;break;default:throw new Error("Unsupported position ".concat(e))}M=S<=0?M:!M;var T=Bi(o,l,b,x),P=Bi(o,l,b,x+(M?1:-1)*359),O="M".concat(T.x,",").concat(T.y,` - A`).concat(b,",").concat(b,",0,1,").concat(M?0:1,`, - `).concat(P.x,",").concat(P.y),N=Vi(t.id)?uy("recharts-radial-line-"):t.id;return R.createElement("text",kc({},r,{dominantBaseline:"central",className:tr("recharts-radial-bar-label",a)}),R.createElement("defs",null,R.createElement("path",{id:N,d:O})),R.createElement("textPath",{xlinkHref:"#".concat(N)},n))},Yae=(t,e,n)=>{var r=t.cx,i=t.cy,s=t.innerRadius,a=t.outerRadius,o=t.startAngle,l=t.endAngle,c=(o+l)/2;if(n==="outside"){var d=Bi(r,i,a+e,c),f=d.x,p=d.y;return{x:f,y:p,textAnchor:f>=r?"start":"end",verticalAnchor:"middle"}}if(n==="center")return{x:r,y:i,textAnchor:"middle",verticalAnchor:"middle"};if(n==="centerTop")return{x:r,y:i,textAnchor:"middle",verticalAnchor:"start"};if(n==="centerBottom")return{x:r,y:i,textAnchor:"middle",verticalAnchor:"end"};var y=(s+a)/2,b=Bi(r,i,y,c),S=b.x,w=b.y;return{x:S,y:w,textAnchor:"middle",verticalAnchor:"middle"}},W_=t=>t!=null&&"cx"in t&&kt(t.cx),Zae={angle:0,offset:5,zIndex:Ms.label,position:"middle",textBreakAll:!1};function Qae(t){if(!W_(t))return t;var e=t.cx,n=t.cy,r=t.outerRadius,i=r*2;return{x:e-r,y:n-r,width:i,upperWidth:i,lowerWidth:i,height:i}}function od(t){var e=Za(t,Zae),n=e.viewBox,r=e.parentViewBox,i=e.position,s=e.value,a=e.children,o=e.content,l=e.className,c=l===void 0?"":l,d=e.textBreakAll,f=e.labelRef,p=$ae(),y=gH(),b=i==="center"?y:p??y,S,w,x;n==null?S=b:W_(n)?S=n:S=WC(n);var M=Qae(S);if(!S||Vi(s)&&Vi(a)&&!R.isValidElement(o)&&typeof o!="function")return null;var T=V0(V0({},e),{},{viewBox:S});if(R.isValidElement(o)){T.labelRef;var P=$L(T,jae);return R.cloneElement(o,P)}if(typeof o=="function"){T.content;var O=$L(T,Fae);if(w=R.createElement(o,O),R.isValidElement(w))return w}else w=Xae(e);var N=Xa(e);if(W_(S)){if(i==="insideStart"||i==="insideEnd"||i==="end")return Kae(e,i,w,N,S);x=Yae(S,e.offset,e.position)}else{if(!M)return null;var D=Uae({viewBox:M,position:i,offset:e.offset,parentViewBox:W_(r)?void 0:r});x=V0(V0({x:D.x,y:D.y,textAnchor:D.horizontalAnchor,verticalAnchor:D.verticalAnchor},D.width!==void 0?{width:D.width}:{}),D.height!==void 0?{height:D.height}:{})}return R.createElement(su,{zIndex:e.zIndex},R.createElement(Z2,kc({ref:f,className:tr("recharts-label",c)},N,x,{textAnchor:dH(N.textAnchor)?N.textAnchor:x.textAnchor,breakAll:d}),w))}od.displayName="Label";var Jae=(t,e,n)=>{if(!t)return null;var r={viewBox:e,labelRef:n};return t===!0?R.createElement(od,kc({key:"label-implicit"},r)):Nl(t)?R.createElement(od,kc({key:"label-implicit",value:t},r)):R.isValidElement(t)?t.type===od?R.cloneElement(t,V0({key:"label-implicit"},r)):R.createElement(od,kc({key:"label-implicit",content:t},r)):Q2(t)?R.createElement(od,kc({key:"label-implicit",content:t},r)):t&&typeof t=="object"?R.createElement(od,kc({},t,{key:"label-implicit"},r)):null};function eoe(t){var e=t.label,n=t.labelRef,r=gH();return Jae(e,r,n)||null}var toe=["valueAccessor"],noe=["dataKey","clockWise","id","textBreakAll","zIndex"];function Ww(){return Ww=Object.assign?Object.assign.bind():function(t){for(var e=1;e{var e=Array.isArray(t.value)?t.value[t.value.length-1]:t.value;if(Cae(e))return e},vH=R.createContext(void 0),soe=vH.Provider,yH=R.createContext(void 0);yH.Provider;function aoe(){return R.useContext(vH)}function ooe(){return R.useContext(yH)}function $_(t){var e=t.valueAccessor,n=e===void 0?ioe:e,r=qL(t,toe),i=r.dataKey;r.clockWise;var s=r.id,a=r.textBreakAll,o=r.zIndex,l=qL(r,noe),c=aoe(),d=ooe(),f=c||d;return!f||!f.length?null:R.createElement(su,{zIndex:o??Ms.label},R.createElement(qa,{className:"recharts-label-list"},f.map((p,y)=>{var b,S=Vi(i)?n(p,y):yi(p.payload,i),w=Vi(s)?{}:{id:"".concat(s,"-").concat(y)};return R.createElement(od,Ww({key:"label-".concat(y)},Xa(p),l,w,{fill:(b=r.fill)!==null&&b!==void 0?b:p.fill,parentViewBox:p.parentViewBox,value:S,textBreakAll:a,viewBox:p.viewBox,index:y,zIndex:0}))})))}$_.displayName="LabelList";function loe(t){var e=t.label;return e?e===!0?R.createElement($_,{key:"labelList-implicit"}):R.isValidElement(e)||Q2(e)?R.createElement($_,{key:"labelList-implicit",content:e}):typeof e=="object"?R.createElement($_,Ww({key:"labelList-implicit"},e,{type:String(e.type)})):null:null}function IP(){return IP=Object.assign?Object.assign.bind():function(t){for(var e=1;e{var e=t.cx,n=t.cy,r=t.r,i=t.className,s=tr("recharts-dot",i);return kt(e)&&kt(n)&&kt(r)?R.createElement("circle",IP({},zo(t),LC(t),{className:s,cx:e,cy:n,r})):null},coe={radiusAxis:{},angleAxis:{}},bH=cs({name:"polarAxis",initialState:coe,reducers:{addRadiusAxis(t,e){t.radiusAxis[e.payload.id]=e.payload},removeRadiusAxis(t,e){delete t.radiusAxis[e.payload.id]},addAngleAxis(t,e){t.angleAxis[e.payload.id]=e.payload},removeAngleAxis(t,e){delete t.angleAxis[e.payload.id]}}}),FS=bH.actions;FS.addRadiusAxis;FS.removeRadiusAxis;FS.addAngleAxis;FS.removeAngleAxis;var uoe=bH.reducer;function doe(t){return t&&typeof t=="object"&&"className"in t&&typeof t.className=="string"?t.className:""}var _H=t=>t&&typeof t=="object"&&"clipDot"in t?!!t.clipDot:!0;function KL(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(t,i).enumerable})),n.push.apply(n,r)}return n}function YL(t){for(var e=1;e{r||(i.current===null?n(Rre(e)):i.current!==e&&n(Nre({prev:i.current,next:e})),i.current=e)},[e,n,r]),R.useLayoutEffect(()=>()=>{i.current&&(n(Ire(i.current)),i.current=null)},[n]),null}function _oe(t){var e=t.legendPayload,n=Wr(),r=Js(),i=R.useRef(null);return R.useLayoutEffect(()=>{r||(i.current===null?n(iZ(e)):i.current!==e&&n(sZ({prev:i.current,next:e})),i.current=e)},[n,r,e]),R.useLayoutEffect(()=>()=>{i.current&&(n(aZ(i.current)),i.current=null)},[n]),null}function woe(t,e){return Aoe(t)||Eoe(t,e)||Moe(t,e)||Soe()}function Soe(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function Moe(t,e){if(t){if(typeof t=="string")return ZL(t,e);var n={}.toString.call(t).slice(8,-1);return n==="Object"&&t.constructor&&(n=t.constructor.name),n==="Map"||n==="Set"?Array.from(t):n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?ZL(t,e):void 0}}function ZL(t,e){(e==null||e>t.length)&&(e=t.length);for(var n=0,r=Array(e);n2&&arguments[2]!==void 0?arguments[2]:[],r=[];for(var i of n)r.push({status:"removed",prev:i});for(var s=0;st[Math.floor(s*n)]);return eR(r,e)}function Coe(t,e){var n=e.map((r,i)=>t[i]);return eR(n,e)}function Roe(t,e){for(var n=new Map,r=0;r{var y=n(f,p);if(y!=null){var b=r.get(y);if(b!==void 0)return i.add(y),b}}),a=[];for(var o of r){var l=woe(o,2),c=l[0],d=l[1];i.has(c)||a.push(d)}return eR(s,e,a)}function kP(t,e,n){return e==null?null:t==null?e.map(r=>({status:"added",next:r})):n===J2?Poe(t,e):n===Toe?Coe(t,e):Noe(t,e,n)}function SH(t,e){var n=R.useRef(t),r=R.useRef(e.current),i=R.useRef(!0);n.current!==t&&(n.current=t,r.current=e.current,i.current=!1);var s=R.useCallback(function(a,o){var l=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;if(o===0){i.current=!0;return}o===1&&(r.current=a),o>0&&i.current&&l&&(e.current=a)},[e]);return{startValue:r.current,syncStepValue:s}}function Ioe(t,e){return Doe(t)||Loe(t,e)||Ooe(t,e)||koe()}function koe(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function Ooe(t,e){if(t){if(typeof t=="string")return QL(t,e);var n={}.toString.call(t).slice(8,-1);return n==="Object"&&t.constructor&&(n=t.constructor.name),n==="Map"||n==="Set"?Array.from(t):n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?QL(t,e):void 0}}function QL(t,e){(e==null||e>t.length)&&(e=t.length);for(var n=0,r=Array(e);n{typeof t=="function"&&t(),s(!0)},[t]),o=R.useCallback(()=>{typeof e=="function"&&e(),s(!1)},[e]);return{isAnimating:i,handleAnimationStart:a,handleAnimationEnd:o}}function joe(t){var e,n=t.animationInput,r=t.animationIdPrefix,i=t.items,s=t.previousItemsRef,a=t.isAnimationActive,o=t.animationBegin,l=t.animationDuration,c=t.animationEasing,d=t.onAnimationStart,f=t.onAnimationEnd,p=t.animationInterpolateFn,y=t.animationMatchBy,b=t.shouldUpdatePreviousRef,S=t.children,w=t.layout,x=j4(n,r),M=SH(x,s),T=(e=M.startValue)!==null&&e!==void 0?e:null,P=kP(T,i,y??J2);return R.createElement(U4,{animationId:x,begin:o,duration:l,isActive:a,easing:c,onAnimationEnd:f,onAnimationStart:d,key:x},O=>{var N=T==null,D=i==null?i:p(P,O,w),z=b?b(O):O>0;return M.syncStepValue(D,O,z),D==null?null:S(D,O,N)})}var BE;function Foe(t,e){return Voe(t)||Hoe(t,e)||Boe(t,e)||zoe()}function zoe(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function Boe(t,e){if(t){if(typeof t=="string")return JL(t,e);var n={}.toString.call(t).slice(8,-1);return n==="Object"&&t.constructor&&(n=t.constructor.name),n==="Map"||n==="Set"?Array.from(t):n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?JL(t,e):void 0}}function JL(t,e){(e==null||e>t.length)&&(e=t.length);for(var n=0,r=Array(e);n{var t=R.useState(()=>uy("uid-")),e=Foe(t,1),n=e[0];return n},MH=(BE=G1.useId)!==null&&BE!==void 0?BE:Goe;function Woe(t,e){var n=MH();return e||(t?"".concat(t,"-").concat(n):n)}var $oe=R.createContext(void 0),Xoe=t=>{var e=t.id,n=t.type,r=t.children,i=Woe("recharts-".concat(n),e);return R.createElement($oe.Provider,{value:i},r(i))},qoe={cartesianItems:[],polarItems:[]},EH=cs({name:"graphicalItems",initialState:qoe,reducers:{addCartesianGraphicalItem:{reducer(t,e){t.cartesianItems.push(e.payload)},prepare:ar()},replaceCartesianGraphicalItem:{reducer(t,e){var n=e.payload,r=n.prev,i=n.next,s=Ga(t).cartesianItems.indexOf(r);s>-1&&(t.cartesianItems[s]=i)},prepare:ar()},removeCartesianGraphicalItem:{reducer(t,e){var n=Ga(t).cartesianItems.indexOf(e.payload);n>-1&&t.cartesianItems.splice(n,1)},prepare:ar()},addPolarGraphicalItem:{reducer(t,e){t.polarItems.push(e.payload)},prepare:ar()},removePolarGraphicalItem:{reducer(t,e){var n=Ga(t).polarItems.indexOf(e.payload);n>-1&&t.polarItems.splice(n,1)},prepare:ar()},replacePolarGraphicalItem:{reducer(t,e){var n=e.payload,r=n.prev,i=n.next,s=Ga(t).polarItems.indexOf(r);s>-1&&(t.polarItems[s]=i)},prepare:ar()}}}),Qg=EH.actions,Koe=Qg.addCartesianGraphicalItem,Yoe=Qg.replaceCartesianGraphicalItem,Zoe=Qg.removeCartesianGraphicalItem;Qg.addPolarGraphicalItem;Qg.removePolarGraphicalItem;Qg.replacePolarGraphicalItem;var Qoe=EH.reducer,Joe=t=>{var e=Wr(),n=R.useRef(null);return R.useLayoutEffect(()=>{n.current===null?e(Koe(t)):n.current!==t&&e(Yoe({prev:n.current,next:t})),n.current=t},[e,t]),R.useLayoutEffect(()=>()=>{n.current&&(e(Zoe(n.current)),n.current=null)},[e]),null},ele=R.memo(Joe),tle=["points"];function e3(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(t,i).enumerable})),n.push.apply(n,r)}return n}function HE(t){for(var e=1;e{var x,M,T=HE(HE(HE({r:3},a),p),{},{index:w,cx:(x=S.x)!==null&&x!==void 0?x:void 0,cy:(M=S.y)!==null&&M!==void 0?M:void 0,dataKey:s,value:S.value,payload:S.payload,points:e});return R.createElement(ole,{key:"dot-".concat(w),option:n,dotProps:T,className:i})}),b={};return o&&l!=null&&(b.clipPath="url(#clipPath-".concat(f?"":"dots-").concat(l,")")),R.createElement(su,{zIndex:d},R.createElement(qa,$w({className:r},b),y))}function t3(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(t,i).enumerable})),n.push.apply(n,r)}return n}function n3(t){for(var e=1;e({top:t.top,bottom:t.bottom,left:t.left,right:t.right})),Sle=ke([wle,Jc,eu],(t,e,n)=>{if(!(!t||e==null||n==null))return{x:t.left,y:t.top,width:Math.max(0,e-t.left-t.right),height:Math.max(0,n-t.top-t.bottom)}}),tR=()=>Ft(Sle),Mle=()=>Ft(Rie);function r3(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(t,i).enumerable})),n.push.apply(n,r)}return n}function VE(t){for(var e=1;e{var e=t.point,n=t.childIndex,r=t.mainColor,i=t.activeDot,s=t.dataKey,a=t.clipPath;if(i===!1||e.x==null||e.y==null)return null;var o={index:n,dataKey:s,cx:e.x,cy:e.y,r:4,fill:r??"none",strokeWidth:2,stroke:"#fff",payload:e.payload,value:e.value},l=VE(VE(VE({},o),Q1(i)),LC(i)),c;return R.isValidElement(i)?c=R.cloneElement(i,l):typeof i=="function"?c=i(l):c=R.createElement(xH,l),R.createElement(qa,{className:"recharts-active-dot",clipPath:a},c)};function i3(t){var e=t.points,n=t.mainColor,r=t.activeDot,i=t.itemDataKey,s=t.clipPath,a=t.zIndex,o=a===void 0?Ms.activeDot:a,l=Ft(Sy),c=Mle();if(e==null||c==null)return null;var d=e.find(f=>c.includes(f.payload));return Vi(d)?null:R.createElement(su,{zIndex:o},R.createElement(Ple,{point:d,childIndex:Number(l),mainColor:n,dataKey:i,activeDot:r,clipPath:s}))}var Cle=t=>{var e=t.chartData,n=Wr(),r=Js();return R.useEffect(()=>r?()=>{}:(n(AL(e)),()=>{n(AL(void 0))}),[e,n,r]),null},s3={x:0,y:0,width:0,height:0,padding:{top:0,right:0,bottom:0,left:0}},PH=cs({name:"brush",initialState:s3,reducers:{setBrushSettings(t,e){return e.payload==null?s3:e.payload}}});PH.actions.setBrushSettings;var Rle=PH.reducer;function Nle(t){return(t%180+180)%180}var Ile=function(e){var n=e.width,r=e.height,i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,s=Nle(i),a=s*Math.PI/180,o=Math.atan(r/n),l=a>o&&a{t.dots.push(e.payload)},removeDot:(t,e)=>{var n=Ga(t).dots.findIndex(r=>r===e.payload);n!==-1&&t.dots.splice(n,1)},addArea:(t,e)=>{t.areas.push(e.payload)},removeArea:(t,e)=>{var n=Ga(t).areas.findIndex(r=>r===e.payload);n!==-1&&t.areas.splice(n,1)},addLine:(t,e)=>{t.lines.push(e.payload)},removeLine:(t,e)=>{var n=Ga(t).lines.findIndex(r=>r===e.payload);n!==-1&&t.lines.splice(n,1)}}}),Jg=CH.actions;Jg.addDot;Jg.removeDot;Jg.addArea;Jg.removeArea;Jg.addLine;Jg.removeLine;var Ole=CH.reducer;function Lle(t,e){return Fle(t)||jle(t,e)||Ule(t,e)||Dle()}function Dle(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function Ule(t,e){if(t){if(typeof t=="string")return a3(t,e);var n={}.toString.call(t).slice(8,-1);return n==="Object"&&t.constructor&&(n=t.constructor.name),n==="Map"||n==="Set"?Array.from(t):n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?a3(t,e):void 0}}function a3(t,e){(e==null||e>t.length)&&(e=t.length);for(var n=0,r=Array(e);n{var e=t.children,n=R.useState("".concat(uy("recharts"),"-clip")),r=Lle(n,1),i=r[0],s=tR();if(s==null)return null;var a=s.x,o=s.y,l=s.width,c=s.height;return R.createElement(zle.Provider,{value:i},R.createElement("defs",null,R.createElement("clipPath",{id:i},R.createElement("rect",{x:a,y:o,height:c,width:l}))),e)};function RH(t,e){if(e<1)return[];if(e===1)return t;for(var n=[],r=0;rt*i)return!1;var s=n();return t*(e-t*s/2-r)>=0&&t*(e+t*s/2-i)<=0}function Gle(t,e){return RH(t,e+1)}function Wle(t,e,n,r,i){for(var s=(r||[]).slice(),a=e.start,o=e.end,l=0,c=1,d=a,f=function(){var b=r==null?void 0:r[l];if(b===void 0)return{v:RH(r,c)};var S=l,w,x=()=>(w===void 0&&(w=n(b,S)),w),M=b.coordinate,T=l===0||Ey(t,M,x,d,o);T||(l=0,d=a,c+=1),T&&(d=M+t*(x()/2+i),l+=c)},p;c<=s.length;)if(p=f(),p)return p.v;return[]}function $le(t,e,n,r,i){var s=(r||[]).slice(),a=s.length;if(a===0)return[];for(var o=e.start,l=e.end,c=1;c<=a;c++){for(var d=(a-1)%c,f=o,p=!0,y=function(){var P=r[S];if(P==null)return 0;var O=S,N,D=()=>(N===void 0&&(N=n(P,O)),N),z=P.coordinate,V=S===d||Ey(t,z,D,f,l);if(!V)return p=!1,1;V&&(f=z+t*(D()/2+i))},b,S=d;S(S===void 0&&(S=n(y,p)),S);if(p===a-1){var x=t*(b.coordinate+t*w()/2-l);s[p]=b=rs(rs({},b),{},{tickCoord:x>0?b.coordinate-x*t:b.coordinate})}else s[p]=b=rs(rs({},b),{},{tickCoord:b.coordinate});if(b.tickCoord!=null){var M=Ey(t,b.tickCoord,w,o,l);M&&(l=b.tickCoord-t*(w()/2+i),s[p]=rs(rs({},b),{},{isShow:!0}))}},d=a-1;d>=0;d--)c(d);return s}function Zle(t,e,n,r,i,s){var a=(r||[]).slice(),o=a.length,l=e.start,c=e.end;if(s){var d=r[o-1];if(d!=null){var f=n(d,o-1),p=t*(d.coordinate+t*f/2-c);if(a[o-1]=d=rs(rs({},d),{},{tickCoord:p>0?d.coordinate-p*t:d.coordinate}),d.tickCoord!=null){var y=Ey(t,d.tickCoord,()=>f,l,c);y&&(c=d.tickCoord-t*(f/2+i),a[o-1]=rs(rs({},d),{},{isShow:!0}))}}}for(var b=s?o-1:o,S=function(M){var T=a[M];if(T==null)return 1;var P=T,O,N=()=>(O===void 0&&(O=n(T,M)),O);if(M===0){var D=t*(P.coordinate-t*N()/2-l);a[M]=P=rs(rs({},P),{},{tickCoord:D<0?P.coordinate-D*t:P.coordinate})}else a[M]=P=rs(rs({},P),{},{tickCoord:P.coordinate});if(P.tickCoord!=null){var z=Ey(t,P.tickCoord,N,l,c);z&&(l=P.tickCoord+t*(N()/2+i),a[M]=rs(rs({},P),{},{isShow:!0}))}},w=0;w{var D=typeof c=="function"?c(O.value,N):O.value;return b==="width"?Hle(q0(D,{fontSize:e,letterSpacing:n}),S,f):q0(D,{fontSize:e,letterSpacing:n})[b]},x=i[0],M=i[1],T=i.length>=2&&x!=null&&M!=null?Va(M.coordinate-x.coordinate):1,P=Vle(s,T,b);return l==="equidistantPreserveStart"?Wle(T,P,w,i,a):l==="equidistantPreserveEnd"?$le(T,P,w,i,a):(l==="preserveStart"||l==="preserveStartEnd"?y=Zle(T,P,w,i,a,l==="preserveStartEnd"):y=Yle(T,P,w,i,a),y.filter(O=>O.isShow))}var Qle=t=>{var e=t.ticks,n=t.label,r=t.labelGapWithTick,i=r,s=t.tickSize,a=s===void 0?0:s,o=t.tickMargin,l=o===void 0?0:o,c=0;if(e){Array.from(e).forEach(y=>{if(y){var b=y.getBoundingClientRect();b.width>c&&(c=b.width)}});var d=n?n.getBoundingClientRect().width:0,f=a+l,p=c+f+d+(n?i:0);return Math.round(p)}return 0},Jle={xAxis:{},yAxis:{}},NH=cs({name:"renderedTicks",initialState:Jle,reducers:{setRenderedTicks:(t,e)=>{var n=e.payload,r=n.axisType,i=n.axisId,s=n.ticks;t[r][i]=s},removeRenderedTicks:(t,e)=>{var n=e.payload,r=n.axisType,i=n.axisId;delete t[r][i]}}}),IH=NH.actions,ece=IH.setRenderedTicks,tce=IH.removeRenderedTicks,nce=NH.reducer,rce=["axisLine","width","height","className","hide","ticks","axisType","axisId"];function l3(t,e){return oce(t)||ace(t,e)||sce(t,e)||ice()}function ice(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function sce(t,e){if(t){if(typeof t=="string")return c3(t,e);var n={}.toString.call(t).slice(8,-1);return n==="Object"&&t.constructor&&(n=t.constructor.name),n==="Map"||n==="Set"?Array.from(t):n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?c3(t,e):void 0}}function c3(t,e){(e==null||e>t.length)&&(e=t.length);for(var n=0,r=Array(e);n{if(r==null||n==null)return Hg;var s=e.map(a=>({value:a.value,coordinate:a.coordinate,offset:a.offset,index:a.index}));return i(ece({ticks:s,axisId:r,axisType:n})),()=>{i(tce({axisId:r,axisType:n}))}},[i,e,r,n]),null}var xce=R.forwardRef((t,e)=>{var n=t.ticks,r=n===void 0?[]:n,i=t.tick,s=t.tickLine,a=t.stroke,o=t.tickFormatter,l=t.unit,c=t.padding,d=t.tickTextProps,f=t.orientation,p=t.mirror,y=t.x,b=t.y,S=t.width,w=t.height,x=t.tickSize,M=t.tickMargin,T=t.fontSize,P=t.letterSpacing,O=t.getTicksConfig,N=t.events,D=t.axisType,z=t.axisId,V=nR(Ar(Ar({},O),{},{ticks:r}),T,P),k=zo(O),j=Q1(i),X=dH(k.textAnchor)?k.textAnchor:mce(f,p),ee=gce(f,p),ie={};typeof s=="object"&&(ie=s);var pe=Ar(Ar({},k),{},{fill:"none"},ie),ae=V.map(J=>Ar({entry:J},pce(J,y,b,S,w,f,x,p,M))),he=ae.map(J=>{var Y=J.entry,H=J.line;return R.createElement(qa,{className:"recharts-cartesian-axis-tick",key:"tick-".concat(Y.value,"-").concat(Y.coordinate,"-").concat(Y.tickCoord)},s&&R.createElement("line",Fh({},pe,H,{className:tr("recharts-cartesian-axis-tick-line",Yh(s,"className"))})))}),B=ae.map((J,Y)=>{var H,G,le=J.entry,se=J.tick,ce=Ar(Ar(Ar(Ar({verticalAnchor:ee},k),{},{textAnchor:X,stroke:"none",fill:a},se),{},{index:Y,payload:le,visibleTicksCount:V.length,tickFormatter:o,padding:c},d),{},{angle:(H=(G=d==null?void 0:d.angle)!==null&&G!==void 0?G:k.angle)!==null&&H!==void 0?H:0}),Se=Ar(Ar({},ce),j);return R.createElement(qa,Fh({className:"recharts-cartesian-axis-tick-label",key:"tick-label-".concat(le.value,"-").concat(le.coordinate,"-").concat(le.tickCoord)},SX(N,le,Y)),i&&R.createElement(vce,{option:i,tickProps:Se,value:"".concat(typeof o=="function"?o(le.value,Y):le.value).concat(l||"")}))});return R.createElement("g",{className:"recharts-cartesian-axis-ticks recharts-".concat(D,"-ticks")},R.createElement(yce,{ticks:V,axisId:z,axisType:D}),B.length>0&&R.createElement(su,{zIndex:Ms.label},R.createElement("g",{className:"recharts-cartesian-axis-tick-labels recharts-".concat(D,"-tick-labels"),ref:e},B)),he.length>0&&R.createElement("g",{className:"recharts-cartesian-axis-tick-lines recharts-".concat(D,"-tick-lines")},he))}),bce=R.forwardRef((t,e)=>{var n=t.axisLine,r=t.width,i=t.height,s=t.className,a=t.hide,o=t.ticks,l=t.axisType,c=t.axisId,d=lce(t,rce),f=R.useState(""),p=l3(f,2),y=p[0],b=p[1],S=R.useState(""),w=l3(S,2),x=w[0],M=w[1],T=R.useRef(null);R.useImperativeHandle(e,()=>({getCalculatedWidth:()=>{var O;return Qle({ticks:T.current,label:(O=t.labelRef)===null||O===void 0?void 0:O.current,labelGapWithTick:5,tickSize:t.tickSize,tickMargin:t.tickMargin})}}));var P=R.useCallback(O=>{if(O){var N=O.getElementsByClassName("recharts-cartesian-axis-tick-value");T.current=N;var D=N[0];if(D){var z=window.getComputedStyle(D),V=z.fontSize,k=z.letterSpacing;(V!==y||k!==x)&&(b(V),M(k))}}},[y,x]);return a||r!=null&&r<=0||i!=null&&i<=0?null:R.createElement(su,{zIndex:t.zIndex},R.createElement(qa,{className:tr("recharts-cartesian-axis",s)},R.createElement(hce,{x:t.x,y:t.y,width:r,height:i,orientation:t.orientation,mirror:t.mirror,axisLine:n,otherSvgProps:zo(t)}),R.createElement(xce,{ref:P,axisType:l,events:d,fontSize:y,getTicksConfig:t,height:t.height,letterSpacing:x,mirror:t.mirror,orientation:t.orientation,padding:t.padding,stroke:t.stroke,tick:t.tick,tickFormatter:t.tickFormatter,tickLine:t.tickLine,tickMargin:t.tickMargin,tickSize:t.tickSize,tickTextProps:t.tickTextProps,ticks:o,unit:t.unit,width:t.width,x:t.x,y:t.y,axisId:c}),R.createElement(Gae,{x:t.x,y:t.y,width:t.width,height:t.height,lowerWidth:t.width,upperWidth:t.width},R.createElement(eoe,{label:t.label,labelRef:t.labelRef}),t.children)))}),rR=R.forwardRef((t,e)=>{var n=Za(t,Hc);return R.createElement(bce,Fh({},n,{ref:e}))});rR.displayName="CartesianAxis";var _ce=["x1","y1","x2","y2","key"],wce=["offset"],Sce=["xAxisId","yAxisId"],Mce=["xAxisId","yAxisId"];function d3(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(t,i).enumerable})),n.push.apply(n,r)}return n}function is(t){for(var e=1;e{var e=t.fill;if(!e||e==="none")return null;var n=t.fillOpacity,r=t.x,i=t.y,s=t.width,a=t.height,o=t.ry;return R.createElement("rect",{x:r,y:i,ry:o,width:s,height:a,stroke:"none",fill:e,fillOpacity:n,className:"recharts-cartesian-grid-bg"})};function kH(t){var e=t.option,n=t.lineItemProps,r;if(R.isValidElement(e))r=R.cloneElement(e,n);else if(typeof e=="function")r=e(n);else{var i,s=n.x1,a=n.y1,o=n.x2,l=n.y2,c=n.key,d=Xw(n,_ce),f=(i=zo(d))!==null&&i!==void 0?i:{};f.offset;var p=Xw(f,wce);r=R.createElement("line",ah({},p,{x1:s,y1:a,x2:o,y2:l,fill:"none",key:c}))}return r}function Rce(t){var e=t.x,n=t.width,r=t.horizontal,i=r===void 0?!0:r,s=t.horizontalPoints;if(!i||!s||!s.length)return null;t.xAxisId,t.yAxisId;var a=Xw(t,Sce),o=s.map((l,c)=>{var d=is(is({},a),{},{x1:e,y1:l,x2:e+n,y2:l,key:"line-".concat(c),index:c});return R.createElement(kH,{key:"line-".concat(c),option:i,lineItemProps:d})});return R.createElement("g",{className:"recharts-cartesian-grid-horizontal"},o)}function Nce(t){var e=t.y,n=t.height,r=t.vertical,i=r===void 0?!0:r,s=t.verticalPoints;if(!i||!s||!s.length)return null;t.xAxisId,t.yAxisId;var a=Xw(t,Mce),o=s.map((l,c)=>{var d=is(is({},a),{},{x1:l,y1:e,x2:l,y2:e+n,key:"line-".concat(c),index:c});return R.createElement(kH,{option:i,lineItemProps:d,key:"line-".concat(c)})});return R.createElement("g",{className:"recharts-cartesian-grid-vertical"},o)}function Ice(t){var e=t.horizontalFill,n=t.fillOpacity,r=t.x,i=t.y,s=t.width,a=t.height,o=t.horizontalPoints,l=t.horizontal,c=l===void 0?!0:l;if(!c||!e||!e.length||o==null)return null;var d=o.map(p=>Math.round(p+i-i)).sort((p,y)=>p-y);i!==d[0]&&d.unshift(0);var f=d.map((p,y)=>{var b=d[y+1],S=b==null,w=S?i+a-p:b-p;if(w<=0)return null;var x=y%e.length;return R.createElement("rect",{key:"react-".concat(y),y:p,x:r,height:w,width:s,stroke:"none",fill:e[x],fillOpacity:n,className:"recharts-cartesian-grid-bg"})});return R.createElement("g",{className:"recharts-cartesian-gridstripes-horizontal"},f)}function kce(t){var e=t.vertical,n=e===void 0?!0:e,r=t.verticalFill,i=t.fillOpacity,s=t.x,a=t.y,o=t.width,l=t.height,c=t.verticalPoints;if(!n||!r||!r.length)return null;var d=c.map(p=>Math.round(p+s-s)).sort((p,y)=>p-y);s!==d[0]&&d.unshift(0);var f=d.map((p,y)=>{var b=d[y+1],S=b==null,w=S?s+o-p:b-p;if(w<=0)return null;var x=y%r.length;return R.createElement("rect",{key:"react-".concat(y),x:p,y:a,width:w,height:l,stroke:"none",fill:r[x],fillOpacity:i,className:"recharts-cartesian-grid-bg"})});return R.createElement("g",{className:"recharts-cartesian-gridstripes-vertical"},f)}var Oce=(t,e)=>{var n=t.xAxis,r=t.width,i=t.height,s=t.offset;return h4(nR(is(is(is({},Hc),n),{},{ticks:p4(n),viewBox:{x:0,y:0,width:r,height:i}})),s.left,s.left+s.width,e)},Lce=(t,e)=>{var n=t.yAxis,r=t.width,i=t.height,s=t.offset;return h4(nR(is(is(is({},Hc),n),{},{ticks:p4(n),viewBox:{x:0,y:0,width:r,height:i}})),s.top,s.top+s.height,e)},Dce={horizontal:!0,vertical:!0,horizontalPoints:[],verticalPoints:[],stroke:"#ccc",fill:"none",verticalFill:[],horizontalFill:[],xAxisId:0,yAxisId:0,syncWithTicks:!1,zIndex:Ms.grid};function OH(t){var e=w4(),n=S4(),r=_4(),i=is(is({},Za(t,Dce)),{},{x:kt(t.x)?t.x:r.left,y:kt(t.y)?t.y:r.top,width:kt(t.width)?t.width:r.width,height:kt(t.height)?t.height:r.height}),s=i.xAxisId,a=i.yAxisId,o=i.x,l=i.y,c=i.width,d=i.height,f=i.syncWithTicks,p=i.horizontalValues,y=i.verticalValues,b=Js(),S=Ft(V=>hL(V,"xAxis",s,b)),w=Ft(V=>hL(V,"yAxis",a,b));if(!Il(c)||!Il(d)||!kt(o)||!kt(l))return null;var x=i.verticalCoordinatesGenerator||Oce,M=i.horizontalCoordinatesGenerator||Lce,T=i.horizontalPoints,P=i.verticalPoints;if((!T||!T.length)&&typeof M=="function"){var O=p&&p.length,N=M({yAxis:w?is(is({},w),{},{ticks:O?p:w.ticks}):void 0,width:e??c,height:n??d,offset:r},O?!0:f);xw(Array.isArray(N),"horizontalCoordinatesGenerator should return Array but instead it returned [".concat(typeof N,"]")),Array.isArray(N)&&(T=N)}if((!P||!P.length)&&typeof x=="function"){var D=y&&y.length,z=x({xAxis:S?is(is({},S),{},{ticks:D?y:S.ticks}):void 0,width:e??c,height:n??d,offset:r},D?!0:f);xw(Array.isArray(z),"verticalCoordinatesGenerator should return Array but instead it returned [".concat(typeof z,"]")),Array.isArray(z)&&(P=z)}return R.createElement(su,{zIndex:i.zIndex},R.createElement("g",{className:"recharts-cartesian-grid"},R.createElement(Cce,{fill:i.fill,fillOpacity:i.fillOpacity,x:i.x,y:i.y,width:i.width,height:i.height,ry:i.ry}),R.createElement(Ice,ah({},i,{horizontalPoints:T})),R.createElement(kce,ah({},i,{verticalPoints:P})),R.createElement(Rce,ah({},i,{offset:r,horizontalPoints:T,xAxis:S,yAxis:w})),R.createElement(Nce,ah({},i,{offset:r,verticalPoints:P,xAxis:S,yAxis:w}))))}OH.displayName="CartesianGrid";var Uce={},LH=cs({name:"errorBars",initialState:Uce,reducers:{addErrorBar:(t,e)=>{var n=e.payload,r=n.itemId,i=n.errorBar;t[r]||(t[r]=[]),t[r].push(i)},replaceErrorBar:(t,e)=>{var n=e.payload,r=n.itemId,i=n.prev,s=n.next;t[r]&&(t[r]=t[r].map(a=>a.dataKey===i.dataKey&&a.direction===i.direction?s:a))},removeErrorBar:(t,e)=>{var n=e.payload,r=n.itemId,i=n.errorBar;t[r]&&(t[r]=t[r].filter(s=>s.dataKey!==i.dataKey||s.direction!==i.direction))}}}),iR=LH.actions;iR.addErrorBar;iR.replaceErrorBar;iR.removeErrorBar;var jce=LH.reducer;function DH(t,e){var n,r,i=Ft(c=>nu(c,t)),s=Ft(c=>ru(c,e)),a=(n=i==null?void 0:i.allowDataOverflow)!==null&&n!==void 0?n:ti.allowDataOverflow,o=(r=s==null?void 0:s.allowDataOverflow)!==null&&r!==void 0?r:ni.allowDataOverflow,l=a||o;return{needClip:l,needClipX:a,needClipY:o}}function Fce(t){var e=t.xAxisId,n=t.yAxisId,r=t.clipPathId,i=tR(),s=DH(e,n),a=s.needClipX,o=s.needClipY,l=s.needClip,c=Ft(T=>bB(T,e,!1)),d=Ft(T=>_B(T,n,!1));if(!l||!i)return null;var f=i.x,p=i.y,y=i.width,b=i.height,S=a&&c?Math.min(c[0],c[1]):f-y/2,w=o&&d?Math.min(d[0],d[1]):p-b/2,x=a&&c?Math.abs(c[1]-c[0]):y*2,M=o&&d?Math.abs(d[1]-d[0]):b*2;return R.createElement("clipPath",{id:"clipPath-".concat(r)},R.createElement("rect",{x:S,y:w,width:x,height:M}))}function zce(t){var e=Q1(t),n=3,r=2;if(e!=null){var i=e.r,s=e.strokeWidth,a=Number(i),o=Number(s);return(Number.isNaN(a)||a<0)&&(a=n),(Number.isNaN(o)||o<0)&&(o=r),{r:a,strokeWidth:o}}return{r:n,strokeWidth:r}}function sR(t,e){var n,r;return(n=(r=t.graphicalItems.cartesianItems.find(i=>i.id===e))===null||r===void 0?void 0:r.xAxisId)!==null&&n!==void 0?n:AH}function aR(t,e){var n,r;return(n=(r=t.graphicalItems.cartesianItems.find(i=>i.id===e))===null||r===void 0?void 0:r.yAxisId)!==null&&n!==void 0?n:AH}var UH=(t,e,n)=>CB(t,"xAxis",sR(t,e),n),jH=(t,e,n)=>PB(t,"xAxis",sR(t,e),n),FH=(t,e,n)=>CB(t,"yAxis",aR(t,e),n),zH=(t,e,n)=>PB(t,"yAxis",aR(t,e),n),Bce=ke([hr,UH,FH,jH,zH],(t,e,n,r,i)=>jl(t,"xAxis")?yw(e,r,!1):yw(n,i,!1)),Hce=(t,e)=>e,BH=ke([qz,Hce],(t,e)=>t.filter(n=>n.type==="area").find(n=>n.id===e)),HH=t=>{var e=hr(t),n=jl(e,"xAxis");return n?"yAxis":"xAxis"},Vce=(t,e)=>{var n=HH(t);return n==="yAxis"?aR(t,e):sR(t,e)},Gce=(t,e,n)=>iB(t,HH(t),Vce(t,e),n),Wce=ke([BH,Gce],(t,e)=>{var n;if(!(t==null||e==null)){var r=t.stackId,i=a2(t);if(!(r==null||i==null)){var s=(n=e[r])===null||n===void 0?void 0:n.stackedData,a=s==null?void 0:s.find(o=>o.key===i);if(a!=null)return a.map(o=>[o[0],o[1]])}}}),$ce=ke([hr,UH,FH,jH,zH,Wce,gJ,Bce,BH,kJ],(t,e,n,r,i,s,a,o,l,c)=>{var d=a.chartData,f=a.dataStartIndex,p=a.dataEndIndex;if(!(l==null||t!=="horizontal"&&t!=="vertical"||e==null||n==null||r==null||i==null||r.length===0||i.length===0||o==null)){var y=l.data,b;if(y&&y.length>0?b=y:b=d==null?void 0:d.slice(f,p+1),b!=null)return yue({layout:t,xAxis:e,yAxis:n,xAxisTicks:r,yAxisTicks:i,dataStartIndex:f,areaSettings:l,stackedData:s,displayedData:b,chartBaseValue:c,bandSize:o})}}),Xce=["animationElapsedTime","isAnimating","isEntrance","layout","isRange","stroke","connectNulls"],qce=["id","baseLine"];function K0(){return K0=Object.assign?Object.assign.bind():function(t){for(var e=1;ef.y||0));return kt(i)?d=Math.max(i,d):i&&Array.isArray(i)&&i.length&&(d=Math.max(...i.map(f=>f.y||0),d)),kt(d)?R.createElement("rect",{x:of.x||0));return kt(i)?d=Math.max(i,d):i&&Array.isArray(i)&&i.length&&(d=Math.max(...i.map(f=>f.x||0),d)),kt(d)?R.createElement("rect",{x:0,y:ot==null?[]:e===1?t.flatMap(n=>n.status==="removed"?[]:[n.next]):t.flatMap(n=>n.status==="matched"?[Rg(Rg({},n.next),{},{x:Dc(n.prev.x,n.next.x,e),y:Dc(n.prev.y,n.next.y,e)})]:n.status==="added"?[n.next]:[]),GH={activeDot:!0,animationBegin:0,animationDuration:1500,animationEasing:"ease",animationMatchBy:J2,animationInterpolateFn:aue,connectNulls:!1,dot:!1,fill:"#3182bd",fillOpacity:.6,hide:!1,isAnimationActive:"auto",legendType:"line",stroke:"#3182bd",strokeWidth:1,type:"linear",label:!1,shape:Jce,xAxisId:0,yAxisId:0,zIndex:Ms.area};function Kw(t,e){return t&&t!=="none"?t:e}var oue=t=>{var e=t.dataKey,n=t.name,r=t.stroke,i=t.fill,s=t.legendType,a=t.hide;return[{inactive:a,dataKey:e,type:s,color:Kw(r,i),value:m4(n,e),payload:t}]},lue=R.memo(t=>{var e=t.dataKey,n=t.data,r=t.stroke,i=t.strokeWidth,s=t.fill,a=t.name,o=t.hide,l=t.unit,c=t.tooltipType,d=t.id,f={dataDefinedOnItem:n,getPosition:Hg,settings:{stroke:r,strokeWidth:i,fill:s,dataKey:e,nameKey:void 0,name:m4(a,e),hide:o,type:c,color:Kw(r,s),unit:l,graphicalItemId:d}};return R.createElement(boe,{tooltipEntrySettings:f})});function cue(t){var e=t.clipPathId,n=t.points,r=t.props,i=r.needClip,s=r.dot,a=r.dataKey,o=zo(r);return R.createElement(cle,{points:n,dot:s,className:"recharts-area-dots",dotClassName:"recharts-area-dot",dataKey:a,baseProps:o,needClip:i,clipPathId:e})}function uue(t){var e=t.showLabels,n=t.children,r=t.points,i=r.map(s=>{var a,o,l={x:(a=s.x)!==null&&a!==void 0?a:0,y:(o=s.y)!==null&&o!==void 0?o:0,width:0,lowerWidth:0,upperWidth:0,height:0};return Rg(Rg({},l),{},{value:s.value,payload:s.payload,parentViewBox:void 0,viewBox:l,fill:void 0})});return R.createElement(soe,{value:e?i:void 0},n)}function due(t){var e=t.points,n=t.baseLine,r=t.needClip,i=t.clipPathId,s=t.props,a=t.animationElapsedTime,o=t.isAnimating,l=t.isEntrance,c=s.layout,d=s.type,f=s.stroke,p=s.connectNulls,y=s.isRange,b=s.shape,S=s.id,w=VH(s,eue),x=Xa(w),M=Rg(Rg({},x),{},{id:S,points:e,connectNulls:p,type:d,baseLine:n,layout:c,stroke:f,isRange:y,animationElapsedTime:a,isAnimating:o,isEntrance:l});return R.createElement(R.Fragment,null,(e==null?void 0:e.length)>1&&R.createElement(qa,{clipPath:r?"url(#clipPath-".concat(i,")"):void 0},R.createElement(xoe,{option:b,DefaultShape:GH.shape,shapeProps:M})),R.createElement(cue,{points:e,props:w,clipPathId:i}))}function fue(t,e,n){if(kt(t)){var r=kt(e)?e:void 0;return Dc(r,t,n)}if(Vi(t)||Rl(t)){var i=kt(e)?e:void 0;return Dc(i,0,n)}return t}function hue(t){var e=t.needClip,n=t.clipPathId,r=t.props,i=t.previousPointsRef,s=t.previousBaselineRef,a=r.points,o=r.baseLine,l=r.isAnimationActive,c=r.animationBegin,d=r.animationDuration,f=r.animationEasing,p=r.animationMatchBy,y=r.animationInterpolateFn,b=R.useMemo(()=>({points:a,baseLine:o}),[a,o]),S=SH(b,s),w=$C(),x=Uoe(r.onAnimationStart,r.onAnimationEnd),M=x.isAnimating,T=x.handleAnimationStart,P=x.handleAnimationEnd,O=S.startValue;if(w==null)return null;var N;return Array.isArray(o)&&Array.isArray(O)?N=kP(O,o,p):Array.isArray(o)?N=kP(null,o,p):N=null,R.createElement(joe,{animationInput:b,animationIdPrefix:"recharts-area-",items:a,previousItemsRef:i,isAnimationActive:l,animationBegin:c,animationDuration:d,animationEasing:f,onAnimationStart:T,onAnimationEnd:P,animationInterpolateFn:y,animationMatchBy:p,layout:w},(D,z,V)=>{var k;return z===1?k=o:Array.isArray(o)?k=y(N,z,w):k=V?o:fue(o,O,z),S.syncStepValue(k,z),R.createElement(uue,{showLabels:!M,points:a},r.children,R.createElement(due,{points:D,baseLine:k,needClip:e,clipPathId:n,props:r,animationElapsedTime:z,isAnimating:M||z<1,isEntrance:V}),R.createElement(loe,{label:r.label}))})}function pue(t){var e=t.needClip,n=t.clipPathId,r=t.props,i=R.useRef(null),s=R.useRef();return R.createElement(hue,{needClip:e,clipPathId:n,props:r,previousPointsRef:i,previousBaselineRef:s})}class mue extends R.PureComponent{render(){var e=this.props,n=e.hide,r=e.dot,i=e.points,s=e.className,a=e.top,o=e.left,l=e.needClip,c=e.xAxisId,d=e.yAxisId,f=e.width,p=e.height,y=e.id,b=e.baseLine,S=e.zIndex;if(n)return null;var w=tr("recharts-area",s),x=y,M=zce(r),T=M.r,P=M.strokeWidth,O=_H(r),N=T*2+P,D=l?"url(#clipPath-".concat(O?"":"dots-").concat(x,")"):void 0;return R.createElement(su,{zIndex:S},R.createElement(qa,{className:w},l&&R.createElement("defs",null,R.createElement(Fce,{clipPathId:x,xAxisId:c,yAxisId:d}),!O&&R.createElement("clipPath",{id:"clipPath-dots-".concat(x)},R.createElement("rect",{x:o-N/2,y:a-N/2,width:f+N,height:p+N}))),R.createElement(pue,{needClip:l,clipPathId:x,props:this.props})),R.createElement(i3,{points:i,mainColor:Kw(this.props.stroke,this.props.fill),itemDataKey:this.props.dataKey,activeDot:this.props.activeDot,clipPath:D}),this.props.isRange&&Array.isArray(b)&&R.createElement(i3,{points:b,mainColor:Kw(this.props.stroke,this.props.fill),itemDataKey:this.props.dataKey,activeDot:this.props.activeDot,clipPath:D}))}}function gue(t){var e,n=t.activeDot,r=t.animationBegin,i=t.animationDuration,s=t.animationEasing,a=t.connectNulls,o=t.dot,l=t.fill,c=t.fillOpacity,d=t.hide,f=t.isAnimationActive,p=t.legendType,y=t.stroke,b=t.xAxisId,S=t.yAxisId,w=VH(t,tue),x=Vg(),M=QB(),T=DH(b,S),P=T.needClip,O=Js(),N=(e=Ft(pe=>$ce(pe,t.id,O)))!==null&&e!==void 0?e:{},D=N.points,z=N.isRange,V=N.baseLine,k=tR();if(x!=="horizontal"&&x!=="vertical"||k==null||M!=="AreaChart"&&M!=="ComposedChart")return null;var j=k.height,X=k.width,ee=k.x,ie=k.y;return!D||!D.length?null:R.createElement(mue,qw({},w,{activeDot:n,animationBegin:r,animationDuration:i,animationEasing:s,baseLine:V,connectNulls:a,dot:o,fill:l,fillOpacity:c,height:j,hide:d,layout:x,isAnimationActive:f,isRange:z,legendType:p,needClip:P,points:D,stroke:y,width:X,left:ee,top:ie,xAxisId:b,yAxisId:S}))}var vue=(t,e,n,r,i)=>{var s=n??e;if(kt(s))return s;var a=t==="horizontal"?i:r,o=a.scale.domain();if(a.type==="number"){var l=Math.max(o[0],o[1]),c=Math.min(o[0],o[1]);return s==="dataMin"?c:s==="dataMax"||l<0?l:Math.max(Math.min(o[0],o[1]),0)}return s==="dataMin"?o[0]:s==="dataMax"?o[1]:o[0]};function yue(t){var e=t.areaSettings,n=e.connectNulls,r=e.baseValue,i=e.dataKey,s=t.stackedData,a=t.layout,o=t.chartBaseValue,l=t.xAxis,c=t.yAxis,d=t.displayedData,f=t.dataStartIndex,p=t.xAxisTicks,y=t.yAxisTicks,b=t.bandSize,S=s&&s.length,w=vue(a,o,r,l,c),x=a==="horizontal",M=!1,T=d.map((O,N)=>{var D,z,V,k;if(S)k=s[f+N];else{var j=yi(O,i);Array.isArray(j)?(k=j,M=!0):k=[w,j]}var X=(D=(z=k)===null||z===void 0?void 0:z[1])!==null&&D!==void 0?D:null,ee=X==null||S&&!n&&yi(O,i)==null;if(x){var ie;return{x:lk({axis:l,ticks:p,bandSize:b,entry:O,index:N}),y:ee?null:(ie=c.scale.map(X))!==null&&ie!==void 0?ie:null,value:k,payload:O}}return{x:ee?null:(V=l.scale.map(X))!==null&&V!==void 0?V:null,y:lk({axis:c,ticks:y,bandSize:b,entry:O,index:N}),value:k,payload:O}}),P;return S||M?P=T.map(O=>{var N,D=Array.isArray(O.value)?O.value[0]:null;if(x){var z;return{x:O.x,y:D!=null&&O.y!=null&&(z=c.scale.map(D))!==null&&z!==void 0?z:null,payload:O.payload}}return{x:D!=null&&(N=l.scale.map(D))!==null&&N!==void 0?N:null,y:O.y,payload:O.payload}}):P=x?c.scale.map(w):l.scale.map(w),{points:T,baseLine:P??0,isRange:M}}function xue(t){var e=Za(t,GH),n=Js();return R.createElement(Xoe,{id:e.id,type:"area"},r=>R.createElement(R.Fragment,null,R.createElement(_oe,{legendPayload:oue(e)}),R.createElement(lue,{dataKey:e.dataKey,data:e.data,stroke:e.stroke,strokeWidth:e.strokeWidth,fill:e.fill,name:e.name,hide:e.hide,unit:e.unit,tooltipType:e.tooltipType,id:r}),R.createElement(ele,{type:"area",id:r,data:e.data,dataKey:e.dataKey,xAxisId:e.xAxisId,yAxisId:e.yAxisId,zAxisId:0,stackId:nY(e.stackId),hide:e.hide,barSize:void 0,baseValue:e.baseValue,isPanorama:n,connectNulls:e.connectNulls}),R.createElement(gue,qw({},e,{id:r}))))}var WH=R.memo(xue,bS);WH.displayName="Area";var bue=["domain","range"],_ue=["domain","range"];function p3(t,e){if(t==null)return{};var n,r,i=wue(t,e);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(t);for(r=0;r{if(a!=null)return v3(v3({},s),{},{type:a})},[s,a]);return R.useLayoutEffect(()=>{o!=null&&(n.current===null?e(ple(o)):n.current!==o&&e(mle({prev:n.current,next:o})),n.current=o)},[o,e]),R.useLayoutEffect(()=>()=>{n.current&&(e(gle(n.current)),n.current=null)},[e]),null}var Nue=t=>{var e=t.xAxisId,n=t.className,r=Ft(v4),i=Js(),s="xAxis",a=Ft(p=>TB(p,s,e,i)),o=Ft(p=>dre(p,e)),l=Ft(p=>vre(p,e)),c=Ft(p=>Gz(p,e));if(o==null||l==null||c==null)return null;t.dangerouslySetInnerHTML,t.ticks,t.scale;var d=LP(t,Mue);c.id,c.scale;var f=LP(c,Eue);return R.createElement(rR,OP({},d,f,{x:l.x,y:l.y,width:o.width,height:o.height,className:tr("recharts-".concat(s," ").concat(s),n),viewBox:r,ticks:a,axisType:s,axisId:e}))},Iue={allowDataOverflow:ti.allowDataOverflow,allowDecimals:ti.allowDecimals,allowDuplicatedCategory:ti.allowDuplicatedCategory,angle:ti.angle,axisLine:Hc.axisLine,height:ti.height,hide:!1,includeHidden:ti.includeHidden,interval:ti.interval,label:!1,minTickGap:ti.minTickGap,mirror:ti.mirror,orientation:ti.orientation,padding:ti.padding,reversed:ti.reversed,scale:ti.scale,tick:ti.tick,tickCount:ti.tickCount,tickLine:Hc.tickLine,tickSize:Hc.tickSize,type:ti.type,niceTicks:ti.niceTicks,xAxisId:0},kue=t=>{var e=Za(t,Iue);return R.createElement(R.Fragment,null,R.createElement(Rue,{allowDataOverflow:e.allowDataOverflow,allowDecimals:e.allowDecimals,allowDuplicatedCategory:e.allowDuplicatedCategory,angle:e.angle,dataKey:e.dataKey,domain:e.domain,height:e.height,hide:e.hide,id:e.xAxisId,includeHidden:e.includeHidden,interval:e.interval,minTickGap:e.minTickGap,mirror:e.mirror,name:e.name,orientation:e.orientation,padding:e.padding,reversed:e.reversed,scale:e.scale,tick:e.tick,tickCount:e.tickCount,tickFormatter:e.tickFormatter,ticks:e.ticks,type:e.type,unit:e.unit,niceTicks:e.niceTicks}),R.createElement(Nue,e))},XH=R.memo(kue,$H);XH.displayName="XAxis";var Oue=["type"],Lue=["dangerouslySetInnerHTML","ticks","scale"],Due=["id","scale"];function DP(){return DP=Object.assign?Object.assign.bind():function(t){for(var e=1;e{if(a!=null)return x3(x3({},s),{},{type:a})},[a,s]);return R.useLayoutEffect(()=>{o!=null&&(n.current===null?e(vle(o)):n.current!==o&&e(yle({prev:n.current,next:o})),n.current=o)},[o,e]),R.useLayoutEffect(()=>()=>{n.current&&(e(xle(n.current)),n.current=null)},[e]),null}function Hue(t){var e=t.yAxisId,n=t.className,r=t.width,i=t.label,s=R.useRef(null),a=R.useRef(null),o=Ft(v4),l=Js(),c=Wr(),d="yAxis",f=Ft(x=>bre(x,e)),p=Ft(x=>xre(x,e)),y=Ft(x=>TB(x,d,e,l)),b=Ft(x=>Wz(x,e));if(R.useLayoutEffect(()=>{if(!(r!=="auto"||!f||Q2(i)||R.isValidElement(i)||b==null)){var x=s.current;if(x){var M=x.getCalculatedWidth();Math.round(f.width)!==Math.round(M)&&c(ble({id:e,width:M}))}}},[y,f,c,i,e,r,b]),f==null||p==null||b==null)return null;t.dangerouslySetInnerHTML,t.ticks,t.scale;var S=UP(t,Lue);b.id,b.scale;var w=UP(b,Due);return R.createElement(rR,DP({},S,w,{ref:s,labelRef:a,x:p.x,y:p.y,tickTextProps:r==="auto"?{width:void 0}:{width:r},width:f.width,height:f.height,className:tr("recharts-".concat(d," ").concat(d),n),viewBox:o,ticks:y,axisType:d,axisId:e}))}var Vue={allowDataOverflow:ni.allowDataOverflow,allowDecimals:ni.allowDecimals,allowDuplicatedCategory:ni.allowDuplicatedCategory,angle:ni.angle,axisLine:Hc.axisLine,hide:!1,includeHidden:ni.includeHidden,interval:ni.interval,label:!1,minTickGap:ni.minTickGap,mirror:ni.mirror,orientation:ni.orientation,padding:ni.padding,reversed:ni.reversed,scale:ni.scale,tick:ni.tick,tickCount:ni.tickCount,tickLine:Hc.tickLine,tickSize:Hc.tickSize,type:ni.type,niceTicks:ni.niceTicks,width:ni.width,yAxisId:0},Gue=t=>{var e=Za(t,Vue);return R.createElement(R.Fragment,null,R.createElement(Bue,{interval:e.interval,id:e.yAxisId,scale:e.scale,type:e.type,domain:e.domain,allowDataOverflow:e.allowDataOverflow,dataKey:e.dataKey,allowDuplicatedCategory:e.allowDuplicatedCategory,allowDecimals:e.allowDecimals,tickCount:e.tickCount,padding:e.padding,includeHidden:e.includeHidden,reversed:e.reversed,ticks:e.ticks,width:e.width,orientation:e.orientation,mirror:e.mirror,hide:e.hide,unit:e.unit,name:e.name,angle:e.angle,minTickGap:e.minTickGap,tick:e.tick,tickFormatter:e.tickFormatter,niceTicks:e.niceTicks}),R.createElement(Hue,e))},qH=R.memo(Gue,$H);qH.displayName="YAxis";var Wue=(t,e)=>e,oR=ke([Wue,hr,sz,wi,$B,iu,Hie,Wi],Kie);function $ue(t){return"getBBox"in t.currentTarget&&typeof t.currentTarget.getBBox=="function"}function lR(t){var e=t.currentTarget.getBoundingClientRect(),n,r;if($ue(t)){var i=t.currentTarget.getBBox();n=i.width>0?e.width/i.width:1,r=i.height>0?e.height/i.height:1}else{var s=t.currentTarget;n=s.offsetWidth>0?e.width/s.offsetWidth:1,r=s.offsetHeight>0?e.height/s.offsetHeight:1}var a=(o,l)=>({relativeX:Math.round((o-e.left)/n),relativeY:Math.round((l-e.top)/r)});return"touches"in t?Array.from(t.touches).map(o=>a(o.clientX,o.clientY)):a(t.clientX,t.clientY)}var KH=Ma("mouseClick"),YH=qy();YH.startListening({actionCreator:KH,effect:(t,e)=>{var n=t.payload,r=oR(e.getState(),lR(n));(r==null?void 0:r.activeIndex)!=null&&e.dispatch(Lre({activeIndex:r.activeIndex,activeDataKey:void 0,activeCoordinate:r.activeCoordinate}))}});var jP=Ma("mouseMove"),ZH=qy(),dm=null,Ef=null,GE=null;ZH.startListening({actionCreator:jP,effect:(t,e)=>{var n=t.payload,r=e.getState(),i=r.eventSettings,s=i.throttleDelay,a=i.throttledEvents,o=a==="all"||(a==null?void 0:a.includes("mousemove"));dm!==null&&(cancelAnimationFrame(dm),dm=null),Ef!==null&&(typeof s!="number"||!o)&&(clearTimeout(Ef),Ef=null),GE=lR(n);var l=()=>{var c=e.getState(),d=ox(c,c.tooltip.settings.shared);if(!GE){dm=null,Ef=null;return}if(d==="axis"){var f=oR(c,GE);(f==null?void 0:f.activeIndex)!=null?e.dispatch(DB({activeIndex:f.activeIndex,activeDataKey:void 0,activeCoordinate:f.activeCoordinate})):e.dispatch(LB())}dm=null,Ef=null};if(!o){l();return}s==="raf"?dm=requestAnimationFrame(l):typeof s=="number"&&Ef===null&&(Ef=setTimeout(l,s))}});function Xue(t,e){return e instanceof HTMLElement?"HTMLElement <".concat(e.tagName,' class="').concat(e.className,'">'):e===window?"global.window":t==="children"&&typeof e=="object"&&e!==null?"<>":e}var b3={accessibilityLayer:!0,barCategoryGap:"10%",barGap:4,barSize:void 0,className:void 0,maxBarSize:void 0,stackOffset:"none",syncId:void 0,syncMethod:"index",baseValue:void 0,reverseStackOrder:!1},QH=cs({name:"rootProps",initialState:b3,reducers:{updateOptions:(t,e)=>{var n;t.accessibilityLayer=e.payload.accessibilityLayer,t.barCategoryGap=e.payload.barCategoryGap,t.barGap=(n=e.payload.barGap)!==null&&n!==void 0?n:b3.barGap,t.barSize=e.payload.barSize,t.maxBarSize=e.payload.maxBarSize,t.stackOffset=e.payload.stackOffset,t.syncId=e.payload.syncId,t.syncMethod=e.payload.syncMethod,t.className=e.payload.className,t.baseValue=e.payload.baseValue,t.reverseStackOrder=e.payload.reverseStackOrder}}}),que=QH.reducer,Kue=QH.actions.updateOptions,Yue=null,Zue={updatePolarOptions:(t,e)=>t===null?e.payload:(t.startAngle=e.payload.startAngle,t.endAngle=e.payload.endAngle,t.cx=e.payload.cx,t.cy=e.payload.cy,t.innerRadius=e.payload.innerRadius,t.outerRadius=e.payload.outerRadius,t)},JH=cs({name:"polarOptions",initialState:Yue,reducers:Zue});JH.actions.updatePolarOptions;var Que=JH.reducer,eV=Ma("keyDown"),tV=Ma("focus"),nV=Ma("blur"),zS=qy(),fm=null,Af=null,Db=null;zS.startListening({actionCreator:eV,effect:(t,e)=>{Db=t.payload,fm!==null&&(cancelAnimationFrame(fm),fm=null);var n=e.getState(),r=n.eventSettings,i=r.throttleDelay,s=r.throttledEvents,a=s==="all"||s.includes("keydown");Af!==null&&(typeof i!="number"||!a)&&(clearTimeout(Af),Af=null);var o=()=>{try{var l=e.getState(),c=l.rootProps.accessibilityLayer!==!1;if(!c)return;var d=l.tooltip.keyboardInteraction,f=Db;if(f!=="ArrowRight"&&f!=="ArrowLeft"&&f!=="Enter")return;var p=X0(d,jh(l),Pg(l),Cg(l)),y=p==null?-1:Number(p),b=!Number.isFinite(y)||y<0,S=iu(l),w=jh(l),x=ox(l,l.tooltip.settings.shared);if(f==="Enter"){if(b)return;var M=Vw(l,x,"hover",String(d.index));e.dispatch(Hw({active:!d.active,activeIndex:d.index,activeCoordinate:M}));return}var T=Ere(l),P=T==="left-to-right"?1:-1,O=f==="ArrowRight"?1:-1,N;if(b){var D=Pg(l),z=Cg(l),V=O*P,k=pe=>({active:!1,index:String(pe),dataKey:void 0,graphicalItemId:void 0,coordinate:void 0});if(N=-1,V>0){for(var j=0;j=0;X--)if(X0(k(X),w,D,z)!=null){N=X;break}if(N<0)return}else{N=y+O*P;var ee=(S==null?void 0:S.length)||w.length;if(ee===0||N>=ee||N<0)return}var ie=Vw(l,x,"hover",String(N));e.dispatch(Hw({active:!0,activeIndex:N.toString(),activeCoordinate:ie}))}finally{fm=null,Af=null}};if(!a){o();return}i==="raf"?fm=requestAnimationFrame(o):typeof i=="number"&&Af===null&&(o(),Db=null,Af=setTimeout(()=>{Db?o():(Af=null,fm=null)},i))}});zS.startListening({actionCreator:tV,effect:(t,e)=>{var n=e.getState(),r=n.rootProps.accessibilityLayer!==!1;if(r){var i=n.tooltip.keyboardInteraction;if(!i.active&&i.index==null){var s="0",a=ox(n,n.tooltip.settings.shared),o=Vw(n,a,"hover",String(s));e.dispatch(Hw({active:!0,activeIndex:s,activeCoordinate:o}))}}}});zS.startListening({actionCreator:nV,effect:(t,e)=>{var n=e.getState(),r=n.rootProps.accessibilityLayer!==!1;if(r){var i=n.tooltip.keyboardInteraction;i.active&&e.dispatch(Hw({active:!1,activeIndex:i.index,activeCoordinate:i.coordinate}))}}});function rV(t){t.persist();var e=t.currentTarget;return new Proxy(t,{get:(n,r)=>{if(r==="currentTarget")return e;var i=Reflect.get(n,r);return typeof i=="function"?i.bind(n):i}})}var za=Ma("externalEvent"),iV=qy(),Ub=new Map,f0=new Map,WE=new Map;iV.startListening({actionCreator:za,effect:(t,e)=>{var n=t.payload,r=n.handler,i=n.reactEvent;if(r!=null){var s=i.type,a=rV(i);WE.set(s,{handler:r,reactEvent:a});var o=Ub.get(s);o!==void 0&&(cancelAnimationFrame(o),Ub.delete(s));var l=e.getState(),c=l.eventSettings,d=c.throttleDelay,f=c.throttledEvents,p=f,y=p==="all"||(p==null?void 0:p.includes(s)),b=f0.get(s);b!==void 0&&(typeof d!="number"||!y)&&(clearTimeout(b),f0.delete(s));var S=()=>{var M=WE.get(s);try{if(!M)return;var T=M.handler,P=M.reactEvent,O=e.getState(),N={activeCoordinate:Tie(O),activeDataKey:Mie(O),activeIndex:Sy(O),activeLabel:KB(O),activeTooltipIndex:Sy(O),isTooltipActive:Pie(O)};T&&T(N,P)}finally{Ub.delete(s),f0.delete(s),WE.delete(s)}};if(!y){S();return}if(d==="raf"){var w=requestAnimationFrame(S);Ub.set(s,w)}else if(typeof d=="number"){if(!f0.has(s)){S();var x=setTimeout(S,d);f0.set(s,x)}}else S()}}});var Jue=ke([Zg],t=>t.tooltipItemPayloads),ede=ke([Jue,(t,e)=>e,(t,e,n)=>n],(t,e,n)=>{if(e!=null){var r=t.find(s=>s.settings.graphicalItemId===n);if(r!=null){var i=r.getPosition;if(i!=null)return i(e)}}}),sV=Ma("touchMove"),aV=qy(),Tf=null,Hu=null,_3=null,h0=null;aV.startListening({actionCreator:sV,effect:(t,e)=>{var n=t.payload;if(!(n.touches==null||n.touches.length===0)){h0=rV(n);var r=e.getState(),i=r.eventSettings,s=i.throttleDelay,a=i.throttledEvents,o=a==="all"||a.includes("touchmove");Tf!==null&&(cancelAnimationFrame(Tf),Tf=null),Hu!==null&&(typeof s!="number"||!o)&&(clearTimeout(Hu),Hu=null),_3=Array.from(n.touches).map(c=>lR({clientX:c.clientX,clientY:c.clientY,currentTarget:n.currentTarget}));var l=()=>{if(h0!=null){var c=e.getState(),d=ox(c,c.tooltip.settings.shared);if(d==="axis"){var f,p=(f=_3)===null||f===void 0?void 0:f[0];if(p==null){Tf=null,Hu=null;return}var y=oR(c,p);(y==null?void 0:y.activeIndex)!=null&&e.dispatch(DB({activeIndex:y.activeIndex,activeDataKey:void 0,activeCoordinate:y.activeCoordinate}))}else if(d==="item"){var b,S=h0.touches[0];if(document.elementFromPoint==null||S==null)return;var w=document.elementFromPoint(S.clientX,S.clientY);if(!w||!w.getAttribute)return;var x=w.getAttribute(cY),M=(b=w.getAttribute(uY))!==null&&b!==void 0?b:void 0,T=Jh(c).find(N=>N.id===M);if(x==null||T==null||M==null)return;var P=T.dataKey,O=ede(c,x,M);e.dispatch(Ore({activeDataKey:P,activeIndex:x,activeCoordinate:O,activeGraphicalItemId:M}))}Tf=null,Hu=null}};if(!o){l();return}s==="raf"?Tf=requestAnimationFrame(l):typeof s=="number"&&Hu===null&&(l(),h0=null,Hu=setTimeout(()=>{h0?l():(Hu=null,Tf=null)},s))}}});var oV={throttleDelay:"raf",throttledEvents:["mousemove","touchmove","pointermove","scroll","wheel"]},lV=cs({name:"eventSettings",initialState:oV,reducers:{setEventSettings:(t,e)=>{e.payload.throttleDelay!=null&&(t.throttleDelay=e.payload.throttleDelay),e.payload.throttledEvents!=null&&(t.throttledEvents=e.payload.throttledEvents)}}}),tde=lV.actions.setEventSettings,nde=lV.reducer,rde=j5({brush:Rle,cartesianAxis:_le,chartData:Ase,errorBars:jce,eventSettings:nde,graphicalItems:Qoe,layout:XK,legend:oZ,options:_se,polarAxis:uoe,polarOptions:Que,referenceElements:Ole,renderedTicks:nce,rootProps:que,tooltip:Dre,zIndex:lse}),ide=function(e){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"Chart";return yK({reducer:rde,preloadedState:e,middleware:r=>{var i;return r({serializableCheck:!1,immutableCheck:!["commonjs","es6","production"].includes((i="es6")!==null&&i!==void 0?i:"")}).concat([YH.middleware,ZH.middleware,zS.middleware,iV.middleware,aV.middleware])},enhancers:r=>{var i=r;return typeof r=="function"&&(i=r()),i.concat(J5({type:"raf"}))},devTools:{serialize:{replacer:Xue},name:"recharts-".concat(n)}})};function sde(t){var e=t.preloadedState,n=t.children,r=t.reduxStoreName,i=Js(),s=R.useRef(null);if(i)return n;s.current==null&&(s.current=ide(e,r));var a=UC;return R.createElement(SZ,{context:a,store:s.current},n)}function ade(t){var e=t.layout,n=t.margin,r=Wr(),i=Js();return R.useEffect(()=>{i||(r(GK(e)),r(VK(n)))},[r,i,e,n]),null}var ode=R.memo(ade,bS);function lde(t){var e=Wr();return R.useEffect(()=>{e(Kue(t))},[e,t]),null}var cde=t=>{var e=Wr();return R.useEffect(()=>{e(tde(t))},[e,t]),null},ude=R.memo(cde,bS);function w3(t){var e=t.zIndex,n=t.isPanorama,r=R.useRef(null),i=Wr();return R.useLayoutEffect(()=>(r.current&&i(ase({zIndex:e,element:r.current,isPanorama:n})),()=>{i(ose({zIndex:e,isPanorama:n}))}),[i,e,n]),R.createElement("g",{tabIndex:-1,ref:r,className:"recharts-zIndex-layer_".concat(e)})}function S3(t){var e=t.children,n=t.isPanorama,r=Ft(Zie);if(!r||r.length===0)return e;var i=r.filter(a=>a<0),s=r.filter(a=>a>0);return R.createElement(R.Fragment,null,i.map(a=>R.createElement(w3,{key:a,zIndex:a,isPanorama:n})),e,s.map(a=>R.createElement(w3,{key:a,zIndex:a,isPanorama:n})))}var dde=["children"];function fde(t,e){if(t==null)return{};var n,r,i=hde(t,e);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(t);for(r=0;r{var n=w4(),r=S4(),i=k4();if(!Il(n)||!Il(r))return null;var s=t.children,a=t.otherAttributes,o=t.title,l=t.desc,c,d;return a!=null&&(typeof a.tabIndex=="number"?c=a.tabIndex:c=i?0:void 0,typeof a.role=="string"?d=a.role:d=i?"application":void 0),R.createElement(n5,Yw({},a,{title:o,desc:l,role:d,tabIndex:c,width:n,height:r,style:pde,ref:e}),s)}),gde=t=>{var e=t.children,n=Ft(mS);if(!n)return null;var r=n.width,i=n.height,s=n.y,a=n.x;return R.createElement(n5,{width:r,height:i,x:a,y:s},e)},M3=R.forwardRef((t,e)=>{var n=t.children,r=fde(t,dde),i=Js();return i?R.createElement(gde,null,R.createElement(S3,{isPanorama:!0},n)):R.createElement(mde,Yw({ref:e},r),R.createElement(S3,{isPanorama:!1},n))});function vde(t,e){return _de(t)||bde(t,e)||xde(t,e)||yde()}function yde(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function xde(t,e){if(t){if(typeof t=="string")return E3(t,e);var n={}.toString.call(t).slice(8,-1);return n==="Object"&&t.constructor&&(n=t.constructor.name),n==="Map"||n==="Set"?Array.from(t):n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?E3(t,e):void 0}}function E3(t,e){(e==null||e>t.length)&&(e=t.length);for(var n=0,r=Array(e);n{if(r!=null){var a=r.getBoundingClientRect(),o=a.width/r.offsetWidth;wn(o)&&o!==s&&t($K(o))}},[r,t,s]),i}function A3(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(t,i).enumerable})),n.push.apply(n,r)}return n}function Sde(t){for(var e=1;et.length)&&(e=t.length);for(var n=0,r=Array(e);n(Lse(),null);function Qw(t){if(typeof t=="number")return t;if(typeof t=="string"){var e=parseFloat(t);if(!Number.isNaN(e))return e}return 0}var Ide=R.forwardRef((t,e)=>{var n,r,i=R.useRef(null),s=R.useState({containerWidth:Qw((n=t.style)===null||n===void 0?void 0:n.width),containerHeight:Qw((r=t.style)===null||r===void 0?void 0:r.height)}),a=Zw(s,2),o=a[0],l=a[1],c=R.useCallback((f,p)=>{l(y=>{var b=Math.round(f),S=Math.round(p);return y.containerWidth===b&&y.containerHeight===S?y:{containerWidth:b,containerHeight:S}})},[]),d=R.useCallback(f=>{if(typeof e=="function"&&e(f),i.current!=null&&(i.current.disconnect(),i.current=null),f!=null&&typeof ResizeObserver<"u"){var p=f.getBoundingClientRect(),y=p.width,b=p.height;c(y,b);var S=x=>{var M=x[0];if(M!=null){var T=M.contentRect,P=T.width,O=T.height;c(P,O)}},w=new ResizeObserver(S);w.observe(f),i.current=w}},[e,c]);return R.useEffect(()=>()=>{var f=i.current;f!=null&&f.disconnect()},[c]),R.createElement(R.Fragment,null,R.createElement(Yy,{width:o.containerWidth,height:o.containerHeight}),R.createElement("div",wd({ref:d},t)))}),kde=R.forwardRef((t,e)=>{var n=t.width,r=t.height,i=R.useState({containerWidth:Qw(n),containerHeight:Qw(r)}),s=Zw(i,2),a=s[0],o=s[1],l=R.useCallback((d,f)=>{o(p=>{var y=Math.round(d),b=Math.round(f);return p.containerWidth===y&&p.containerHeight===b?p:{containerWidth:y,containerHeight:b}})},[]),c=R.useCallback(d=>{if(typeof e=="function"&&e(d),d!=null){var f=d.getBoundingClientRect(),p=f.width,y=f.height;l(p,y)}},[e,l]);return R.createElement(R.Fragment,null,R.createElement(Yy,{width:a.containerWidth,height:a.containerHeight}),R.createElement("div",wd({ref:c},t)))}),Ode=R.forwardRef((t,e)=>{var n=t.width,r=t.height;return R.createElement(R.Fragment,null,R.createElement(Yy,{width:n,height:r}),R.createElement("div",wd({ref:e},t)))}),Lde=R.forwardRef((t,e)=>{var n=t.width,r=t.height;return typeof n=="string"||typeof r=="string"?R.createElement(kde,wd({},t,{ref:e})):typeof n=="number"&&typeof r=="number"?R.createElement(Ode,wd({},t,{width:n,height:r,ref:e})):R.createElement(R.Fragment,null,R.createElement(Yy,{width:n,height:r}),R.createElement("div",wd({ref:e},t)))});function Dde(t){return t?Ide:Lde}var Ude=R.forwardRef((t,e)=>{var n=t.children,r=t.className,i=t.height,s=t.onClick,a=t.onContextMenu,o=t.onDoubleClick,l=t.onMouseDown,c=t.onMouseEnter,d=t.onMouseLeave,f=t.onMouseMove,p=t.onMouseUp,y=t.onTouchEnd,b=t.onTouchMove,S=t.onTouchStart,w=t.style,x=t.width,M=t.responsive,T=t.dispatchTouchEvents,P=T===void 0?!0:T,O=R.useRef(null),N=Wr(),D=R.useState(null),z=Zw(D,2),V=z[0],k=z[1],j=R.useState(null),X=Zw(j,2),ee=X[0],ie=X[1],pe=wde(),ae=GC(),he=(ae==null?void 0:ae.width)>0?ae.width:x,B=(ae==null?void 0:ae.height)>0?ae.height:i,J=R.useCallback(Le=>{pe(Le),typeof e=="function"&&e(Le),k(Le),ie(Le),Le!=null&&(O.current=Le)},[pe,e,k,ie]),Y=R.useCallback(Le=>{N(KH(Le)),N(za({handler:s,reactEvent:Le}))},[N,s]),H=R.useCallback(Le=>{N(jP(Le)),N(za({handler:c,reactEvent:Le}))},[N,c]),G=R.useCallback(Le=>{N(LB()),N(za({handler:d,reactEvent:Le}))},[N,d]),le=R.useCallback(Le=>{N(jP(Le)),N(za({handler:f,reactEvent:Le}))},[N,f]),se=R.useCallback(()=>{N(tV())},[N]),ce=R.useCallback(()=>{N(nV())},[N]),Se=R.useCallback(Le=>{N(eV(Le.key))},[N]),we=R.useCallback(Le=>{N(za({handler:a,reactEvent:Le}))},[N,a]),We=R.useCallback(Le=>{N(za({handler:o,reactEvent:Le}))},[N,o]),Ee=R.useCallback(Le=>{N(za({handler:l,reactEvent:Le}))},[N,l]),Ge=R.useCallback(Le=>{N(za({handler:p,reactEvent:Le}))},[N,p]),$e=R.useCallback(Le=>{N(za({handler:S,reactEvent:Le}))},[N,S]),de=R.useCallback(Le=>{P&&N(sV(Le)),N(za({handler:b,reactEvent:Le}))},[N,P,b]),Z=R.useCallback(Le=>{N(za({handler:y,reactEvent:Le}))},[N,y]),Ve=Dde(M);return R.createElement(rH.Provider,{value:V},R.createElement(Z7.Provider,{value:ee},R.createElement(Ve,{width:he??(w==null?void 0:w.width),height:B??(w==null?void 0:w.height),className:tr("recharts-wrapper",r),style:Sde({position:"relative",cursor:"default",width:he,height:B},w),onClick:Y,onContextMenu:we,onDoubleClick:We,onFocus:se,onBlur:ce,onKeyDown:Se,onMouseDown:Ee,onMouseEnter:H,onMouseLeave:G,onMouseMove:le,onMouseUp:Ge,onTouchEnd:Z,onTouchMove:de,onTouchStart:$e,ref:J},R.createElement(Nde,null),n)))}),jde=["width","height","responsive","children","className","style","compact","title","desc"];function Fde(t,e){if(t==null)return{};var n,r,i=zde(t,e);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(t);for(r=0;r{var n=t.width,r=t.height,i=t.responsive,s=t.children,a=t.className,o=t.style,l=t.compact,c=t.title,d=t.desc,f=Fde(t,jde),p=zo(f);return l?R.createElement(R.Fragment,null,R.createElement(Yy,{width:n,height:r}),R.createElement(M3,{otherAttributes:p,title:c,desc:d},s)):R.createElement(Ude,{className:a,style:o,width:n,height:r,responsive:i??!1,onClick:t.onClick,onMouseLeave:t.onMouseLeave,onMouseEnter:t.onMouseEnter,onMouseMove:t.onMouseMove,onMouseDown:t.onMouseDown,onMouseUp:t.onMouseUp,onContextMenu:t.onContextMenu,onDoubleClick:t.onDoubleClick,onTouchStart:t.onTouchStart,onTouchMove:t.onTouchMove,onTouchEnd:t.onTouchEnd},R.createElement(M3,{otherAttributes:p,title:c,desc:d,ref:e},R.createElement(Ble,null,s)))});function FP(){return FP=Object.assign?Object.assign.bind():function(t){for(var e=1;eR.createElement(qde,{chartName:"AreaChart",defaultTooltipEventType:"axis",validateTooltipEventTypes:Kde,tooltipPayloadSearcher:xse,categoricalChartProps:t,ref:e}));const Zde="rgba(130,130,150,0.14)",C3="rgba(130,130,150,0.85)";function Qde(t){if(t<=0)return 10;const e=Math.pow(10,Math.floor(Math.log10(t))),n=t/e;return(n<=1?1:n<=2?2:n<=5?5:10)*e}function cV(t,e){return`${e==="%"?Math.round(t):t>=1e3?`${(t/1e3).toFixed(1)}k`:Math.round(t).toString()}${e}`}function Jde({active:t,payload:e,unit:n}){return!t||!(e!=null&&e.length)?null:v.jsx("div",{className:"rounded-lg border border-border/70 bg-popover/95 px-3 py-2 shadow-xl backdrop-blur",children:v.jsx("div",{className:"space-y-1",children:e.map(r=>v.jsxs("div",{className:"flex items-center gap-2 text-[11px] font-mono",children:[v.jsx("span",{className:"h-2 w-2 rounded-full",style:{background:r.color}}),v.jsx("span",{className:"uppercase tracking-wider text-muted-foreground",children:r.name}),v.jsx("span",{className:"ml-auto pl-3 font-bold tabular-nums text-foreground",children:cV(r.value,n)})]},r.dataKey))})})}function uV({data:t,series:e,unit:n="%",yMode:r="percent",height:i=176}){const s=t.reduce((o,l)=>e.reduce((c,d)=>Math.max(c,Number(l[d.key])||0),o),0),a=r==="percent"?Math.min(100,Math.max(25,Math.ceil(s*1.2/25)*25)):Math.max(Qde(s*1.15),10);return v.jsx("div",{style:{height:i},className:"w-full",children:v.jsx(VY,{width:"100%",height:"100%",children:v.jsxs(Yde,{data:t,margin:{top:8,right:6,bottom:0,left:-12},children:[v.jsx("defs",{children:e.map(o=>v.jsxs("linearGradient",{id:`grad-${o.key}`,x1:"0",y1:"0",x2:"0",y2:"1",children:[v.jsx("stop",{offset:"0%",stopColor:o.color,stopOpacity:.22}),v.jsx("stop",{offset:"100%",stopColor:o.color,stopOpacity:0})]},o.key))}),v.jsx(OH,{vertical:!1,stroke:Zde}),v.jsx(XH,{dataKey:"t",hide:!0}),v.jsx(qH,{domain:[0,a],ticks:[0,a/2,a],tickFormatter:o=>cV(o,n),width:42,axisLine:!1,tickLine:!1,tick:{fontSize:10,fill:C3}}),v.jsx(qse,{content:v.jsx(Jde,{unit:n}),cursor:{stroke:C3,strokeOpacity:.4,strokeDasharray:"3 3"}}),e.map(o=>v.jsx(WH,{type:"monotone",dataKey:o.key,name:o.label,stroke:o.color,strokeWidth:2,fill:`url(#grad-${o.key})`,dot:!1,activeDot:{r:3,strokeWidth:0},isAnimationActive:!1,connectNulls:!0},o.key))]})})})}const efe=[{key:"cpu",label:"CPU",color:"#2dd4bf"},{key:"ram",label:"RAM",color:"#38bdf8"},{key:"gpu",label:"GPU",color:"#a78bfa"},{key:"disk",label:"Disk",color:"#fbbf24"}];function tfe(){var a,o,l,c;const{sys:t,hist:e}=F7(),n=!!(t!=null&&t.gpu&&t.gpu.busy_percent!=null&&t.gpu.gtt_used!=null&&t.gpu.gtt_total!=null),r=efe.filter(d=>d.key!=="gpu"||n),i={cpu:(a=t==null?void 0:t.cpu)==null?void 0:a.percent,ram:(o=t==null?void 0:t.ram)==null?void 0:o.percent,gpu:n?t.gpu.busy_percent:null,disk:(l=t==null?void 0:t.disk)==null?void 0:l.percent},s={cpu:(c=t==null?void 0:t.cpu)!=null&&c.cores?`${t.cpu.cores} Cores`:"",ram:t?`${sd(t.ram.used)}/${sd(t.ram.total)} GB`:"",gpu:n?`${sd(t.gpu.gtt_used)}/${sd(t.gpu.gtt_total)} GB`:"",disk:t!=null&&t.disk?`${sd(t.disk.used)}/${sd(t.disk.total)} GB`:""};return v.jsxs("div",{className:"flex flex-col justify-between rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15",children:[v.jsxs("div",{children:[v.jsxs("div",{className:"mb-3 flex items-center gap-2",children:[v.jsx(Md,{className:"h-4.5 w-4.5 text-primary"}),v.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"System-Status"}),v.jsxs("span",{className:"ml-1 inline-flex items-center gap-1 text-[10px] font-medium text-muted-foreground/70",children:[v.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"})," live"]})]}),t?v.jsxs(v.Fragment,{children:[v.jsx("div",{className:"mb-2 grid grid-cols-2 gap-x-4 gap-y-1.5",children:r.map(d=>v.jsxs("div",{className:"flex min-w-0 items-center gap-1.5",children:[v.jsx("span",{className:"h-2 w-2 shrink-0 rounded-full",style:{background:d.color}}),v.jsx("span",{className:"shrink-0 text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:d.label}),v.jsxs("span",{className:"shrink-0 font-mono text-xs font-bold tabular-nums text-foreground",children:[Math.round(i[d.key]??0),"%"]}),s[d.key]&&v.jsx("span",{className:"truncate font-mono text-[10px] text-muted-foreground/60",children:s[d.key]})]},d.key))}),v.jsx(uV,{data:e,series:r,unit:"%",yMode:"percent",height:176})]}):v.jsx("div",{className:"flex h-44 items-center justify-center text-xs text-muted-foreground",children:"Lade Systemdaten…"})]}),(t==null?void 0:t.temp)&&(t.temp.cpu||t.temp.gpu)&&v.jsxs("div",{className:"mt-3 flex gap-4 border-t border-border/30 pt-3 font-mono text-xs text-muted-foreground/80",children:[t.temp.cpu!=null&&v.jsxs("span",{children:["CPU Temp: ",t.temp.cpu," °C"]}),t.temp.gpu!=null&&v.jsxs("span",{children:["GPU Temp: ",t.temp.gpu," °C"]})]})]})}const cR="-",nfe=t=>{const e=ife(t),{conflictingClassGroups:n,conflictingClassGroupModifiers:r}=t;return{getClassGroupId:a=>{const o=a.split(cR);return o[0]===""&&o.length!==1&&o.shift(),dV(o,e)||rfe(a)},getConflictingClassGroupIds:(a,o)=>{const l=n[a]||[];return o&&r[a]?[...l,...r[a]]:l}}},dV=(t,e)=>{var a;if(t.length===0)return e.classGroupId;const n=t[0],r=e.nextPart.get(n),i=r?dV(t.slice(1),r):void 0;if(i)return i;if(e.validators.length===0)return;const s=t.join(cR);return(a=e.validators.find(({validator:o})=>o(s)))==null?void 0:a.classGroupId},R3=/^\[(.+)\]$/,rfe=t=>{if(R3.test(t)){const e=R3.exec(t)[1],n=e==null?void 0:e.substring(0,e.indexOf(":"));if(n)return"arbitrary.."+n}},ife=t=>{const{theme:e,prefix:n}=t,r={nextPart:new Map,validators:[]};return afe(Object.entries(t.classGroups),n).forEach(([s,a])=>{zP(a,r,s,e)}),r},zP=(t,e,n,r)=>{t.forEach(i=>{if(typeof i=="string"){const s=i===""?e:N3(e,i);s.classGroupId=n;return}if(typeof i=="function"){if(sfe(i)){zP(i(r),e,n,r);return}e.validators.push({validator:i,classGroupId:n});return}Object.entries(i).forEach(([s,a])=>{zP(a,N3(e,s),n,r)})})},N3=(t,e)=>{let n=t;return e.split(cR).forEach(r=>{n.nextPart.has(r)||n.nextPart.set(r,{nextPart:new Map,validators:[]}),n=n.nextPart.get(r)}),n},sfe=t=>t.isThemeGetter,afe=(t,e)=>e?t.map(([n,r])=>{const i=r.map(s=>typeof s=="string"?e+s:typeof s=="object"?Object.fromEntries(Object.entries(s).map(([a,o])=>[e+a,o])):s);return[n,i]}):t,ofe=t=>{if(t<1)return{get:()=>{},set:()=>{}};let e=0,n=new Map,r=new Map;const i=(s,a)=>{n.set(s,a),e++,e>t&&(e=0,r=n,n=new Map)};return{get(s){let a=n.get(s);if(a!==void 0)return a;if((a=r.get(s))!==void 0)return i(s,a),a},set(s,a){n.has(s)?n.set(s,a):i(s,a)}}},fV="!",lfe=t=>{const{separator:e,experimentalParseClassName:n}=t,r=e.length===1,i=e[0],s=e.length,a=o=>{const l=[];let c=0,d=0,f;for(let w=0;wd?f-d:void 0;return{modifiers:l,hasImportantModifier:y,baseClassName:b,maybePostfixModifierPosition:S}};return n?o=>n({className:o,parseClassName:a}):a},cfe=t=>{if(t.length<=1)return t;const e=[];let n=[];return t.forEach(r=>{r[0]==="["?(e.push(...n.sort(),r),n=[]):n.push(r)}),e.push(...n.sort()),e},ufe=t=>({cache:ofe(t.cacheSize),parseClassName:lfe(t),...nfe(t)}),dfe=/\s+/,ffe=(t,e)=>{const{parseClassName:n,getClassGroupId:r,getConflictingClassGroupIds:i}=e,s=[],a=t.trim().split(dfe);let o="";for(let l=a.length-1;l>=0;l-=1){const c=a[l],{modifiers:d,hasImportantModifier:f,baseClassName:p,maybePostfixModifierPosition:y}=n(c);let b=!!y,S=r(b?p.substring(0,y):p);if(!S){if(!b){o=c+(o.length>0?" "+o:o);continue}if(S=r(p),!S){o=c+(o.length>0?" "+o:o);continue}b=!1}const w=cfe(d).join(":"),x=f?w+fV:w,M=x+S;if(s.includes(M))continue;s.push(M);const T=i(S,b);for(let P=0;P0?" "+o:o)}return o};function hfe(){let t=0,e,n,r="";for(;t{if(typeof t=="string")return t;let e,n="";for(let r=0;rf(d),t());return n=ufe(c),r=n.cache.get,i=n.cache.set,s=o,o(l)}function o(l){const c=r(l);if(c)return c;const d=ffe(l,n);return i(l,d),d}return function(){return s(hfe.apply(null,arguments))}}const ir=t=>{const e=n=>n[t]||[];return e.isThemeGetter=!0,e},pV=/^\[(?:([a-z-]+):)?(.+)\]$/i,mfe=/^\d+\/\d+$/,gfe=new Set(["px","full","screen"]),vfe=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,yfe=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,xfe=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,bfe=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,_fe=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,bc=t=>tg(t)||gfe.has(t)||mfe.test(t),Vu=t=>ev(t,"length",Cfe),tg=t=>!!t&&!Number.isNaN(Number(t)),$E=t=>ev(t,"number",tg),p0=t=>!!t&&Number.isInteger(Number(t)),wfe=t=>t.endsWith("%")&&tg(t.slice(0,-1)),dn=t=>pV.test(t),Gu=t=>vfe.test(t),Sfe=new Set(["length","size","percentage"]),Mfe=t=>ev(t,Sfe,mV),Efe=t=>ev(t,"position",mV),Afe=new Set(["image","url"]),Tfe=t=>ev(t,Afe,Nfe),Pfe=t=>ev(t,"",Rfe),m0=()=>!0,ev=(t,e,n)=>{const r=pV.exec(t);return r?r[1]?typeof e=="string"?r[1]===e:e.has(r[1]):n(r[2]):!1},Cfe=t=>yfe.test(t)&&!xfe.test(t),mV=()=>!1,Rfe=t=>bfe.test(t),Nfe=t=>_fe.test(t),Ife=()=>{const t=ir("colors"),e=ir("spacing"),n=ir("blur"),r=ir("brightness"),i=ir("borderColor"),s=ir("borderRadius"),a=ir("borderSpacing"),o=ir("borderWidth"),l=ir("contrast"),c=ir("grayscale"),d=ir("hueRotate"),f=ir("invert"),p=ir("gap"),y=ir("gradientColorStops"),b=ir("gradientColorStopPositions"),S=ir("inset"),w=ir("margin"),x=ir("opacity"),M=ir("padding"),T=ir("saturate"),P=ir("scale"),O=ir("sepia"),N=ir("skew"),D=ir("space"),z=ir("translate"),V=()=>["auto","contain","none"],k=()=>["auto","hidden","clip","visible","scroll"],j=()=>["auto",dn,e],X=()=>[dn,e],ee=()=>["",bc,Vu],ie=()=>["auto",tg,dn],pe=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],ae=()=>["solid","dashed","dotted","double","none"],he=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],B=()=>["start","end","center","between","around","evenly","stretch"],J=()=>["","0",dn],Y=()=>["auto","avoid","all","avoid-page","page","left","right","column"],H=()=>[tg,dn];return{cacheSize:500,separator:":",theme:{colors:[m0],spacing:[bc,Vu],blur:["none","",Gu,dn],brightness:H(),borderColor:[t],borderRadius:["none","","full",Gu,dn],borderSpacing:X(),borderWidth:ee(),contrast:H(),grayscale:J(),hueRotate:H(),invert:J(),gap:X(),gradientColorStops:[t],gradientColorStopPositions:[wfe,Vu],inset:j(),margin:j(),opacity:H(),padding:X(),saturate:H(),scale:H(),sepia:J(),skew:H(),space:X(),translate:X()},classGroups:{aspect:[{aspect:["auto","square","video",dn]}],container:["container"],columns:[{columns:[Gu]}],"break-after":[{"break-after":Y()}],"break-before":[{"break-before":Y()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...pe(),dn]}],overflow:[{overflow:k()}],"overflow-x":[{"overflow-x":k()}],"overflow-y":[{"overflow-y":k()}],overscroll:[{overscroll:V()}],"overscroll-x":[{"overscroll-x":V()}],"overscroll-y":[{"overscroll-y":V()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[S]}],"inset-x":[{"inset-x":[S]}],"inset-y":[{"inset-y":[S]}],start:[{start:[S]}],end:[{end:[S]}],top:[{top:[S]}],right:[{right:[S]}],bottom:[{bottom:[S]}],left:[{left:[S]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",p0,dn]}],basis:[{basis:j()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",dn]}],grow:[{grow:J()}],shrink:[{shrink:J()}],order:[{order:["first","last","none",p0,dn]}],"grid-cols":[{"grid-cols":[m0]}],"col-start-end":[{col:["auto",{span:["full",p0,dn]},dn]}],"col-start":[{"col-start":ie()}],"col-end":[{"col-end":ie()}],"grid-rows":[{"grid-rows":[m0]}],"row-start-end":[{row:["auto",{span:[p0,dn]},dn]}],"row-start":[{"row-start":ie()}],"row-end":[{"row-end":ie()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",dn]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",dn]}],gap:[{gap:[p]}],"gap-x":[{"gap-x":[p]}],"gap-y":[{"gap-y":[p]}],"justify-content":[{justify:["normal",...B()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...B(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...B(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[M]}],px:[{px:[M]}],py:[{py:[M]}],ps:[{ps:[M]}],pe:[{pe:[M]}],pt:[{pt:[M]}],pr:[{pr:[M]}],pb:[{pb:[M]}],pl:[{pl:[M]}],m:[{m:[w]}],mx:[{mx:[w]}],my:[{my:[w]}],ms:[{ms:[w]}],me:[{me:[w]}],mt:[{mt:[w]}],mr:[{mr:[w]}],mb:[{mb:[w]}],ml:[{ml:[w]}],"space-x":[{"space-x":[D]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[D]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",dn,e]}],"min-w":[{"min-w":[dn,e,"min","max","fit"]}],"max-w":[{"max-w":[dn,e,"none","full","min","max","fit","prose",{screen:[Gu]},Gu]}],h:[{h:[dn,e,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[dn,e,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[dn,e,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[dn,e,"auto","min","max","fit"]}],"font-size":[{text:["base",Gu,Vu]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",$E]}],"font-family":[{font:[m0]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",dn]}],"line-clamp":[{"line-clamp":["none",tg,$E]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",bc,dn]}],"list-image":[{"list-image":["none",dn]}],"list-style-type":[{list:["none","disc","decimal",dn]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[t]}],"placeholder-opacity":[{"placeholder-opacity":[x]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[t]}],"text-opacity":[{"text-opacity":[x]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...ae(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",bc,Vu]}],"underline-offset":[{"underline-offset":["auto",bc,dn]}],"text-decoration-color":[{decoration:[t]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:X()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",dn]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",dn]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[x]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...pe(),Efe]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",Mfe]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},Tfe]}],"bg-color":[{bg:[t]}],"gradient-from-pos":[{from:[b]}],"gradient-via-pos":[{via:[b]}],"gradient-to-pos":[{to:[b]}],"gradient-from":[{from:[y]}],"gradient-via":[{via:[y]}],"gradient-to":[{to:[y]}],rounded:[{rounded:[s]}],"rounded-s":[{"rounded-s":[s]}],"rounded-e":[{"rounded-e":[s]}],"rounded-t":[{"rounded-t":[s]}],"rounded-r":[{"rounded-r":[s]}],"rounded-b":[{"rounded-b":[s]}],"rounded-l":[{"rounded-l":[s]}],"rounded-ss":[{"rounded-ss":[s]}],"rounded-se":[{"rounded-se":[s]}],"rounded-ee":[{"rounded-ee":[s]}],"rounded-es":[{"rounded-es":[s]}],"rounded-tl":[{"rounded-tl":[s]}],"rounded-tr":[{"rounded-tr":[s]}],"rounded-br":[{"rounded-br":[s]}],"rounded-bl":[{"rounded-bl":[s]}],"border-w":[{border:[o]}],"border-w-x":[{"border-x":[o]}],"border-w-y":[{"border-y":[o]}],"border-w-s":[{"border-s":[o]}],"border-w-e":[{"border-e":[o]}],"border-w-t":[{"border-t":[o]}],"border-w-r":[{"border-r":[o]}],"border-w-b":[{"border-b":[o]}],"border-w-l":[{"border-l":[o]}],"border-opacity":[{"border-opacity":[x]}],"border-style":[{border:[...ae(),"hidden"]}],"divide-x":[{"divide-x":[o]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[o]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[x]}],"divide-style":[{divide:ae()}],"border-color":[{border:[i]}],"border-color-x":[{"border-x":[i]}],"border-color-y":[{"border-y":[i]}],"border-color-s":[{"border-s":[i]}],"border-color-e":[{"border-e":[i]}],"border-color-t":[{"border-t":[i]}],"border-color-r":[{"border-r":[i]}],"border-color-b":[{"border-b":[i]}],"border-color-l":[{"border-l":[i]}],"divide-color":[{divide:[i]}],"outline-style":[{outline:["",...ae()]}],"outline-offset":[{"outline-offset":[bc,dn]}],"outline-w":[{outline:[bc,Vu]}],"outline-color":[{outline:[t]}],"ring-w":[{ring:ee()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[t]}],"ring-opacity":[{"ring-opacity":[x]}],"ring-offset-w":[{"ring-offset":[bc,Vu]}],"ring-offset-color":[{"ring-offset":[t]}],shadow:[{shadow:["","inner","none",Gu,Pfe]}],"shadow-color":[{shadow:[m0]}],opacity:[{opacity:[x]}],"mix-blend":[{"mix-blend":[...he(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":he()}],filter:[{filter:["","none"]}],blur:[{blur:[n]}],brightness:[{brightness:[r]}],contrast:[{contrast:[l]}],"drop-shadow":[{"drop-shadow":["","none",Gu,dn]}],grayscale:[{grayscale:[c]}],"hue-rotate":[{"hue-rotate":[d]}],invert:[{invert:[f]}],saturate:[{saturate:[T]}],sepia:[{sepia:[O]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[n]}],"backdrop-brightness":[{"backdrop-brightness":[r]}],"backdrop-contrast":[{"backdrop-contrast":[l]}],"backdrop-grayscale":[{"backdrop-grayscale":[c]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[d]}],"backdrop-invert":[{"backdrop-invert":[f]}],"backdrop-opacity":[{"backdrop-opacity":[x]}],"backdrop-saturate":[{"backdrop-saturate":[T]}],"backdrop-sepia":[{"backdrop-sepia":[O]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[a]}],"border-spacing-x":[{"border-spacing-x":[a]}],"border-spacing-y":[{"border-spacing-y":[a]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",dn]}],duration:[{duration:H()}],ease:[{ease:["linear","in","out","in-out",dn]}],delay:[{delay:H()}],animate:[{animate:["none","spin","ping","pulse","bounce",dn]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[P]}],"scale-x":[{"scale-x":[P]}],"scale-y":[{"scale-y":[P]}],rotate:[{rotate:[p0,dn]}],"translate-x":[{"translate-x":[z]}],"translate-y":[{"translate-y":[z]}],"skew-x":[{"skew-x":[N]}],"skew-y":[{"skew-y":[N]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",dn]}],accent:[{accent:["auto",t]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",dn]}],"caret-color":[{caret:[t]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":X()}],"scroll-mx":[{"scroll-mx":X()}],"scroll-my":[{"scroll-my":X()}],"scroll-ms":[{"scroll-ms":X()}],"scroll-me":[{"scroll-me":X()}],"scroll-mt":[{"scroll-mt":X()}],"scroll-mr":[{"scroll-mr":X()}],"scroll-mb":[{"scroll-mb":X()}],"scroll-ml":[{"scroll-ml":X()}],"scroll-p":[{"scroll-p":X()}],"scroll-px":[{"scroll-px":X()}],"scroll-py":[{"scroll-py":X()}],"scroll-ps":[{"scroll-ps":X()}],"scroll-pe":[{"scroll-pe":X()}],"scroll-pt":[{"scroll-pt":X()}],"scroll-pr":[{"scroll-pr":X()}],"scroll-pb":[{"scroll-pb":X()}],"scroll-pl":[{"scroll-pl":X()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",dn]}],fill:[{fill:[t,"none"]}],"stroke-w":[{stroke:[bc,Vu,$E]}],stroke:[{stroke:[t,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}},kfe=pfe(Ife);function Je(...t){return kfe(tr(t))}function Ng(t){return t?t.replace(/127\.0\.0\.1|localhost/g,"192.168.178.151"):""}function g0({label:t,value:e,tone:n}){return v.jsxs("div",{className:Je("flex items-center justify-between rounded-lg border px-3 py-1.5 text-xs",n==="alert"?"border-amber-500/30 bg-amber-500/5 font-semibold text-amber-400":n==="accent"?"border-primary/30 bg-primary/5 font-semibold text-primary":"border-border/30 bg-background/25 text-muted-foreground"),children:[v.jsx("span",{className:"flex items-center gap-1.5",children:t}),v.jsx("span",{className:"font-mono text-[10px]",children:e})]})}function Ofe(){var n;const{data:t}=CC(3e3),e=()=>window.dispatchEvent(new CustomEvent("open-system-drawer",{detail:{tab:"maintenance"}}));return v.jsxs("div",{className:"flex flex-col justify-between rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15",children:[v.jsxs("div",{className:"space-y-4",children:[v.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-2 border-b border-border/20 pb-2",children:[v.jsxs("div",{className:"flex items-center gap-2",children:[v.jsx(l9,{className:"h-4.5 w-4.5 text-primary"}),v.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"Updates & Pflege"})]}),(t==null?void 0:t.last_check)&&v.jsxs("span",{className:"font-mono text-[9px] text-muted-foreground/80",children:["Zuletzt gesucht: ",new Date(t.last_check*1e3).toLocaleString("de-DE",{day:"2-digit",month:"2-digit",hour:"2-digit",minute:"2-digit"})]})]}),t?v.jsxs("div",{className:"space-y-1.5",children:[v.jsx(g0,{label:"OS-Pakete",tone:t.os>0?"alert":"muted",value:t.os>0?`${t.os} verfügbar`:"aktuell"}),v.jsx(g0,{label:"Inferenz-Engine (llama.cpp)",tone:t.engine>0?"alert":"muted",value:t.engine>0?"Update verfügbar":"aktuell"}),v.jsx(g0,{label:"Router (llama-swap)",tone:t.swap>0?"alert":"muted",value:t.swap>0?"Update verfügbar":"aktuell"}),v.jsx(g0,{label:"Modell-Upgrades",tone:t.models>0?"accent":"muted",value:t.models>0?`${t.models} verfügbar`:"aktuell"}),(n=t.components)==null?void 0:n.map(r=>v.jsx(g0,{tone:r.update===!0?"alert":"muted",label:v.jsxs(v.Fragment,{children:[r.name,r.reachable===!1&&v.jsx("span",{className:"text-[8px] font-bold uppercase text-red-400/80",children:"offline"})]}),value:r.update===!0?`Update: ${r.latest}`:r.update===!1?"aktuell":r.latest?`neueste: ${r.latest}`:"—"},r.key))]}):v.jsx("div",{className:"flex h-24 items-center justify-center text-xs text-muted-foreground",children:"Lade Updates..."})]}),v.jsxs("button",{onClick:e,className:"mt-4 flex h-9 w-full items-center justify-center gap-1.5 rounded-lg bg-primary text-xs font-semibold text-primary-foreground shadow-md shadow-primary/10 transition-all hover:opacity-90 cursor-pointer",children:["Updates verwalten & Pflege ",v.jsx(lF,{className:"h-3.5 w-3.5"})]})]})}function gV({type:t,title:e,message:n,defaultValue:r,autoValue:i,autoLabel:s,onConfirm:a,onCancel:o}){const l=R.useRef(null);return v.jsx("div",{className:"fixed inset-0 z-[99] bg-black/60 backdrop-blur-sm flex items-center justify-center p-4 overscroll-contain",role:"dialog","aria-modal":"true","aria-label":e,children:v.jsxs("div",{className:"w-full max-w-sm rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[v.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[v.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary",children:e}),v.jsx("button",{onClick:o||(()=>a()),"aria-label":"Schließen",className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:v.jsx(Ed,{className:"h-4 w-4","aria-hidden":"true"})})]}),v.jsx("p",{className:"text-xs text-muted-foreground leading-relaxed",children:n}),t==="prompt"&&v.jsxs("div",{className:"flex gap-2",children:[v.jsx("input",{ref:l,type:"text",defaultValue:r,"aria-label":e,className:"flex-1 h-9 px-3 text-xs bg-background/40 border border-border/60 rounded-lg outline-none focus:border-primary transition-colors text-foreground",autoFocus:!0,onKeyDown:c=>{var d;c.key==="Enter"&&a((d=l.current)==null?void 0:d.value)}}),i!==void 0&&v.jsx("button",{type:"button",onClick:()=>{l.current&&(l.current.value=i)},title:"Setup-bewussten Optimalwert eintragen",className:"h-9 px-3 shrink-0 text-xs font-semibold text-primary border border-primary/50 bg-primary/10 hover:bg-primary/20 rounded-lg transition-colors cursor-pointer",children:s||"Auto"})]}),v.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[(t==="confirm"||t==="prompt")&&v.jsx("button",{onClick:o,className:"h-8 px-4 flex items-center justify-center text-xs font-semibold text-muted-foreground border border-border/60 bg-background/20 hover:bg-accent rounded-lg transition-colors cursor-pointer",children:"Abbrechen"}),v.jsx("button",{onClick:()=>{var d;const c=t==="prompt"?(d=l.current)==null?void 0:d.value:void 0;a(c)},className:"h-8 px-4 flex items-center justify-center text-xs font-semibold text-primary-foreground bg-primary hover:bg-primary/95 rounded-lg transition-colors cursor-pointer",children:t==="confirm"?"Ja, fortfahren":t==="prompt"?"Übernehmen":"OK"})]})]})})}function tv(){const[t,e]=R.useState(null),n=R.useCallback(()=>e(null),[]),r=R.useCallback((o,l,c)=>{e({type:"alert",title:o,message:l,onConfirm:()=>{e(null),c==null||c()}})},[]),i=R.useCallback((o,l,c,d)=>{e({type:"confirm",title:o,message:l,onConfirm:()=>{e(null),c()},onCancel:()=>{e(null),d==null||d()}})},[]),s=R.useCallback((o,l,c,d,f,p)=>{e({type:"prompt",title:o,message:l,defaultValue:c,autoValue:p==null?void 0:p.autoValue,autoLabel:p==null?void 0:p.autoLabel,onConfirm:y=>{e(null),d(y)},onCancel:()=>{e(null),f==null||f()}})},[]),a=t?v.jsx(gV,{...t}):null;return{showAlert:r,showConfirm:i,showPrompt:s,close:n,dialogElement:a}}function Lfe(){const t=Nd(),{data:e}=PC(3e3),{data:n}=Bg(),{showAlert:r,dialogElement:i}=tv(),[s,a]=R.useState(!1),o=(n==null?void 0:n.models)??[];async function l(c){try{await It("/api/agent/brain",{method:"POST",body:JSON.stringify({model:c})}),r("Erfolgreich",`Hermes-Gehirn wurde auf '${c}' geändert. Der Gateway-Dienst wurde neu gestartet.`),t.invalidateQueries({queryKey:qn.agentStatus}),a(!1)}catch(d){r("Fehler",`Fehler beim Wechseln des Gehirns: ${d.message}`)}}return v.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15 flex flex-col justify-between",children:[v.jsxs("div",{children:[v.jsxs("div",{className:"flex items-center justify-between mb-4",children:[v.jsxs("div",{className:"flex items-center gap-2",children:[v.jsx($c,{className:"h-4.5 w-4.5 text-primary"}),v.jsx("h2",{className:"text-sm font-semibold tracking-wide uppercase text-foreground",children:"Hermes Agent"})]}),(e==null?void 0:e.terminal_url)&&v.jsxs("a",{href:Ng(e.terminal_url),target:"_blank",rel:"noopener",className:Je("flex items-center gap-1 px-3 py-1 rounded-lg text-xs font-medium transition-all",e.terminal_reachable?"bg-primary text-primary-foreground hover:opacity-90 shadow-md shadow-primary/20":"border border-border text-muted-foreground"),children:[v.jsx(xg,{className:"h-3 w-3"})," Terminal öffnen"]})]}),e?v.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[v.jsxs("div",{className:"p-3 bg-background/20 rounded-xl border border-border/40",children:[v.jsx("div",{className:"text-[10px] text-muted-foreground uppercase font-semibold",children:"Gateway"}),v.jsxs("div",{className:"flex items-center gap-2 mt-1",children:[v.jsx("span",{className:Je("h-2 w-2 rounded-full",e.gateway_reachable?"bg-emerald-500 animate-pulse":"bg-amber-500")}),v.jsx("span",{className:"text-xs font-medium",children:e.gateway_reachable?"Online":"Offline"})]})]}),v.jsxs("div",{className:"p-3 bg-background/20 rounded-xl border border-border/40",children:[v.jsx("div",{className:"text-[10px] text-muted-foreground uppercase font-semibold",children:"Terminal"}),v.jsxs("div",{className:"flex items-center gap-2 mt-1",children:[v.jsx("span",{className:Je("h-2 w-2 rounded-full",e.terminal_reachable?"bg-emerald-500 animate-pulse":"bg-amber-500")}),v.jsx("span",{className:"text-xs font-medium",children:e.terminal_reachable?"Online":"Offline"})]})]}),v.jsxs("div",{onClick:()=>a(!0),className:"p-3 bg-background/20 rounded-xl border border-border/40 hover:border-primary/45 hover:bg-background/30 transition-all duration-300 cursor-pointer",children:[v.jsxs("div",{className:"flex justify-between items-center",children:[v.jsx("span",{className:"text-[10px] text-muted-foreground uppercase font-semibold",children:"Gehirn"}),v.jsx(Md,{className:"h-3 w-3 text-primary"})]}),v.jsxs("div",{className:"text-xs font-medium mt-1 font-mono text-primary truncate flex items-center gap-1",children:[v.jsx(_C,{className:"h-3 w-3 shrink-0"}),e.brain_model||"auto"]})]}),v.jsxs("div",{className:"p-3 bg-background/20 rounded-xl border border-border/40",children:[v.jsxs("div",{className:"flex justify-between items-center",children:[v.jsx("span",{className:"text-[10px] text-muted-foreground uppercase font-semibold",children:"Verdrahtung"}),v.jsx(wC,{className:"h-3 w-3 text-primary"})]}),v.jsxs("div",{className:"text-[10px] font-mono mt-1 space-y-0.5 text-muted-foreground",children:[v.jsxs("div",{children:["Config: ",e.has_config?v.jsx("span",{className:"text-emerald-400",children:"✓"}):"—"]}),v.jsxs("div",{children:["Skills: ",e.has_skills?v.jsx("span",{className:"text-emerald-400",children:"✓"}):"—"]}),v.jsxs("div",{children:["Memory: ",e.has_memories?v.jsx("span",{className:"text-emerald-400",children:"✓"}):"—"]})]})]})]}):v.jsx("div",{className:"h-28 flex items-center justify-center text-xs text-muted-foreground",children:"Lade Agenten-Status…"})]}),e&&v.jsxs("div",{className:"mt-3 border-t border-border/30 pt-3 space-y-1.5",children:[v.jsxs("div",{className:"flex items-center justify-between text-[10px] text-muted-foreground",children:[v.jsx("span",{children:"Telegram"}),v.jsx("span",{className:Je("font-semibold",e.telegram_enabled?"text-emerald-400":""),children:e.telegram_enabled?"aktiv":"nicht konfiguriert"})]}),v.jsxs("div",{className:"flex items-center justify-between text-[10px] text-muted-foreground",children:[v.jsx("span",{children:"MCP-Server"}),v.jsxs("span",{className:"font-semibold text-foreground",children:[e.mcp_server_count??0," verbunden"]})]}),v.jsxs("div",{className:"flex items-center justify-between text-[10px] text-muted-foreground",children:[v.jsx("span",{children:"PC Executor"}),v.jsx("span",{className:Je("font-semibold",e.pc_executor_reachable?"text-emerald-400":""),children:e.pc_executor_reachable?"erreichbar":"nicht verbunden"})]})]}),e&&s&&v.jsx("div",{className:"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm flex items-center justify-center p-4",children:v.jsxs("div",{className:"w-full max-w-md rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[v.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[v.jsxs("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary flex items-center gap-1.5",children:[v.jsx(Md,{className:"h-4 w-4"}),v.jsx("span",{children:"Hermes-Gehirn konfigurieren"})]}),v.jsx("button",{onClick:()=>a(!1),className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:v.jsx(Ed,{className:"h-4 w-4"})})]}),v.jsxs("p",{className:"text-xs text-muted-foreground leading-relaxed",children:['Das „Gehirn" ist das primäre LLM für Hermes. Wähle ein Modell aus deiner Bibliothek oder nutze ein Gateway-Alias (',v.jsx("code",{className:"text-primary font-semibold",children:"auto"})," / ",v.jsx("code",{className:"text-primary font-semibold",children:"fast"})," / ",v.jsx("code",{className:"text-primary font-semibold",children:"heavy"}),"):"]}),v.jsx("div",{className:"space-y-1.5 max-h-60 overflow-y-auto pr-1",children:["auto","fast","heavy",...o.map(c=>{var d;return((d=c.name.split("/").pop())==null?void 0:d.replace(".gguf",""))||c.name})].map(c=>{const d=["auto","fast","heavy"].includes(c);return v.jsxs("button",{onClick:()=>l(c),className:Je("w-full text-left px-3 py-2.5 rounded-lg text-xs hover:bg-accent flex items-center justify-between font-mono cursor-pointer border border-border/30",e.brain_model===c||!e.brain_model&&c==="auto"?"text-primary font-bold bg-primary/10 border-primary/30":"text-foreground bg-background/20"),children:[v.jsxs("div",{className:"flex flex-col text-left",children:[v.jsx("span",{className:"font-semibold truncate max-w-[280px]",children:c}),v.jsx("span",{className:"text-[9px] text-muted-foreground mt-0.5",children:d?"Gateway Routing Alias":"Installiertes GGUF Modell"})]}),(e.brain_model===c||!e.brain_model&&c==="auto")&&v.jsx(Sa,{className:"h-4 w-4 shrink-0 text-primary"})]},c)})})]})}),i]})}function Dfe(){const t=Nd(),{data:e=[]}=BT({limit:3}),[n,r]=R.useState(""),[i,s]=R.useState("stable"),[a,o]=R.useState(!1);async function l(){if(!(!n.trim()||a)){o(!0);try{await It("/api/memory",{method:"POST",body:JSON.stringify({content:n,category:i,source:"dashboard"})}),r(""),t.invalidateQueries({queryKey:["memory"]})}catch(c){console.error(c)}finally{o(!1)}}}return v.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15 flex flex-col justify-between",children:[v.jsxs("div",{children:[v.jsxs("div",{className:"flex items-center gap-2 mb-4",children:[v.jsx(W1,{className:"h-4.5 w-4.5 text-primary"}),v.jsx("h2",{className:"text-sm font-semibold tracking-wide uppercase text-foreground",children:"Gedächtnis"})]}),v.jsxs("div",{className:"space-y-3",children:[v.jsx("textarea",{value:n,onChange:c=>r(c.target.value),"aria-label":"Fakt oder Regel im Gedächtnis speichern",placeholder:"Fakt / Regel im Pool speichern…",rows:2,className:"w-full resize-none rounded-xl border border-border/50 bg-background/30 p-2 text-[10px] outline-none focus:ring-1 focus:ring-primary transition-all leading-normal"}),v.jsxs("div",{className:"flex items-center gap-2 justify-between",children:[v.jsxs("select",{value:i,onChange:c=>s(c.target.value),"aria-label":"Kategorie",className:"h-7 rounded-lg border border-border/50 bg-background/50 px-2 text-[10px] outline-none cursor-pointer",children:[v.jsx("option",{value:"stable",children:"🔵 Fakt"}),v.jsx("option",{value:"instruction",children:"📋 Regel"}),v.jsx("option",{value:"user",children:"👤 User"}),v.jsx("option",{value:"versioned",children:"🟡 Version"})]}),v.jsxs("button",{onClick:l,disabled:!n.trim()||a,className:"flex h-7 items-center gap-1 rounded-lg bg-primary px-3 text-[10px] font-semibold text-primary-foreground hover:opacity-90 disabled:opacity-50 transition-all cursor-pointer",children:[v.jsx(OT,{className:"h-3.5 w-3.5"})," Speichern"]})]})]}),v.jsxs("div",{className:"mt-3.5 space-y-1.5",children:[v.jsx("div",{className:"text-[9px] text-muted-foreground uppercase font-bold tracking-wider",children:"Zuletzt gespeichert:"}),v.jsx("div",{className:"max-h-20 overflow-y-auto space-y-1 pr-1 scrollbar-thin",children:e.length===0?v.jsx("div",{className:"text-[10px] text-muted-foreground/75 py-1",children:"Keine Einträge vorhanden."}):e.map(c=>v.jsxs("div",{className:"text-[10px] bg-background/10 border border-border/30 rounded p-1.5 flex items-start gap-1.5",children:[v.jsx("span",{className:"shrink-0 text-[8px] font-mono text-muted-foreground/80 px-1 py-0.5 rounded bg-muted/20",children:c.category}),v.jsx("span",{className:"truncate flex-1 text-muted-foreground hover:text-foreground transition-colors",title:c.content,children:c.content})]},c.id))})]})]}),v.jsx("div",{className:"mt-4 text-[10px] text-muted-foreground/80 border-t border-border/30 pt-3",children:"Steht allen Clients per MCP zur Verfügung."})]})}const I3=[{key:"prompt",label:"Prompt",color:"#f59e0b"},{key:"completion",label:"Antwort",color:"#2dd4bf"}];function Ufe(){const{data:t}=TC(3e3),e=U7(),n=e[e.length-1],r=n?Math.round(n.prompt+n.completion):0;return v.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15",children:[v.jsxs("div",{className:"mb-3 flex items-start justify-between gap-3",children:[v.jsxs("div",{children:[v.jsxs("div",{className:"flex items-center gap-2",children:[v.jsx(bC,{className:"h-4.5 w-4.5 text-primary"}),v.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"Token-Durchsatz"}),v.jsxs("span",{className:"ml-1 inline-flex items-center gap-1 text-[10px] font-medium text-muted-foreground/70",children:[v.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"})," live"]})]}),t&&v.jsxs("div",{className:"mt-2 flex items-baseline gap-2",children:[v.jsx("span",{className:"font-space text-3xl font-bold tracking-tight text-foreground tabular-nums",children:r.toLocaleString("de-DE")}),v.jsx("span",{className:"text-xs text-muted-foreground",children:"tok/s aktuell"})]}),t&&v.jsxs("div",{className:"mt-0.5 space-y-0.5 font-mono text-[11px] text-muted-foreground/70",children:[v.jsxs("div",{children:[t.total_tokens.toLocaleString("de-DE")," Tokens gesamt · ",v.jsxs("span",{className:"text-emerald-400/90",children:[t.saved_eur.toLocaleString("de-DE",{minimumFractionDigits:2})," € gespart"]})]}),v.jsxs("div",{className:"text-muted-foreground/55",children:["Input ",t.prompt_tokens.toLocaleString("de-DE")," · Output ",t.completion_tokens.toLocaleString("de-DE")]})]})]}),v.jsx("div",{className:"flex shrink-0 flex-col items-end gap-1.5 pt-1",children:I3.map(i=>v.jsxs("div",{className:"flex items-center gap-1.5",children:[v.jsx("span",{className:"h-2 w-2 rounded-full",style:{background:i.color}}),v.jsx("span",{className:"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:i.label}),v.jsx("span",{className:"font-mono text-xs font-bold tabular-nums text-foreground",children:Math.round((n==null?void 0:n[i.key])??0)})]},i.key))})]}),t?v.jsx(uV,{data:e,series:I3,unit:" tok/s",yMode:"auto",height:150}):v.jsx("div",{className:"flex h-[150px] items-center justify-center text-xs text-muted-foreground",children:"Lade Durchsatz…"}),v.jsx("div",{className:"mt-2 border-t border-border/30 pt-2 text-[10px] text-muted-foreground/70",children:"Durchsatz aus dem Gateway abgeleitet (Prefill vs. Generierung). Flach bei Leerlauf."})]})}function jfe(){const{data:t}=M7(3e3),{showAlert:e,dialogElement:n}=tv(),[r,i]=R.useState({});async function s(a){i(o=>({...o,[a]:!0}));try{const o=await It("/api/maintenance/restart",{method:"POST",body:JSON.stringify({service:a})});o.ok||e("Fehler",`Neustart fehlgeschlagen: ${o.err||"Unbekannt"}`)}catch(o){e("Fehler",`Fehler: ${o.message}`)}finally{i(o=>({...o,[a]:!1}))}}return v.jsxs("div",{className:"flex flex-col rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15",children:[v.jsxs("div",{className:"mb-3 flex items-center justify-between",children:[v.jsxs("div",{className:"flex items-center gap-2",children:[v.jsx(rw,{className:"h-4.5 w-4.5 text-primary"}),v.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"Dienste"})]}),v.jsx("button",{onClick:()=>window.dispatchEvent(new CustomEvent("open-system-drawer",{detail:{tab:"logs"}})),className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground transition-colors hover:text-primary cursor-pointer",children:"Logs / Pflege"})]}),t?v.jsxs("div",{className:"flex flex-1 flex-col",children:[v.jsx("div",{className:"space-y-1.5",children:t.services.map(a=>v.jsxs("div",{className:"group flex items-center justify-between gap-2 rounded-xl border border-border/30 bg-background/20 p-2.5",children:[v.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[v.jsx("span",{className:Je("h-2.5 w-2.5 shrink-0 rounded-full ring-2 ring-black/40",a.ok?"bg-emerald-500":"bg-amber-500")}),v.jsxs("div",{className:"min-w-0",children:[v.jsx("div",{className:"truncate text-xs font-bold text-foreground",children:a.name}),v.jsx("div",{className:"truncate font-mono text-[9px] text-muted-foreground/60",children:a.url})]})]}),v.jsx("button",{onClick:()=>s(a.name),disabled:r[a.name],className:"flex h-7 w-7 shrink-0 items-center justify-center rounded-lg border border-border/40 text-muted-foreground opacity-0 transition-all hover:bg-primary/5 hover:text-primary group-hover:opacity-100",title:"Dienst neu starten",children:v.jsx(Jf,{className:Je("h-3.5 w-3.5",r[a.name]&&"animate-spin")})})]},a.name))}),v.jsxs("div",{className:"mt-auto flex flex-wrap gap-3 border-t border-border/20 pt-2.5 text-[10px] font-semibold text-muted-foreground",children:[v.jsxs("a",{href:Ng(t.links.engine_ui),target:"_blank",rel:"noopener",className:"flex items-center gap-1 rounded px-1.5 py-0.5 text-primary transition-colors hover:bg-primary/10",children:[v.jsx(xg,{className:"h-3 w-3"})," Engine"]}),v.jsxs("a",{href:Ng(t.links.gateway),target:"_blank",rel:"noopener",className:"flex items-center gap-1 rounded px-1.5 py-0.5 text-primary transition-colors hover:bg-primary/10",children:[v.jsx(xg,{className:"h-3 w-3"})," Gateway"]})]})]}):v.jsx("div",{className:"flex h-24 items-center justify-center text-xs text-muted-foreground",children:"Lade Dienste…"}),n]})}const XE=[{key:"stt",label:"STT",hint:"Sprache → Text"},{key:"vision",label:"Bildschirm-Sicht",hint:"Vision-Beschreibung"},{key:"chat_ttfb",label:"Chat-TTFB",hint:"Zeit bis 1. Token"},{key:"tts",label:"TTS",hint:"Text → Sprache"}];function jb(t){return t==null?"—":t>=1e3?`${(t/1e3).toFixed(2)} s`:`${Math.round(t)} ms`}function Ffe({stat:t,label:e,hint:n,maxP95:r}){const i=!!t&&t.count>0,s=i&&t.p95_ms&&r>0?Math.max(4,Math.min(100,t.p95_ms/r*100)):0;return v.jsxs("div",{className:"space-y-1.5",children:[v.jsxs("div",{className:"flex items-baseline justify-between gap-2",children:[v.jsxs("div",{className:"flex items-baseline gap-2 min-w-0",children:[v.jsx("span",{className:"text-xs font-semibold text-foreground",children:e}),v.jsx("span",{className:"truncate text-[10px] text-muted-foreground/60",children:n})]}),i?v.jsx("span",{className:"shrink-0 font-mono text-sm font-bold tabular-nums text-foreground",children:jb(t.p50_ms)}):v.jsx("span",{className:"shrink-0 text-[10px] italic text-muted-foreground/50",children:"noch keine Messungen"})]}),v.jsx("div",{className:"h-1.5 w-full overflow-hidden rounded-full bg-background/50 border border-border/30",children:v.jsx("div",{className:"h-full rounded-full bg-gradient-to-r from-teal-500 to-indigo-500 transition-all duration-500",style:{width:`${s}%`}})}),i&&v.jsxs("div",{className:"flex items-center gap-3 font-mono text-[10px] text-muted-foreground/65",children:[v.jsxs("span",{children:["p50 ",jb(t.p50_ms)]}),v.jsxs("span",{children:["p95 ",jb(t.p95_ms)]}),v.jsxs("span",{children:["zuletzt ",jb(t.last_ms)]}),v.jsxs("span",{className:"text-muted-foreground/45",children:["· n=",t.count]})]})]})}function zfe(){const{data:t}=A7(5e3),e=Math.max(1,...XE.map(r=>{var i;return((i=t==null?void 0:t[r.key])==null?void 0:i.p95_ms)??0})),n=XE.some(r=>{var i;return(((i=t==null?void 0:t[r.key])==null?void 0:i.count)??0)>0});return v.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15",children:[v.jsxs("div",{className:"mb-4 flex items-center gap-2",children:[v.jsx(dF,{className:"h-4.5 w-4.5 text-primary"}),v.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"Sprach-Latenz"}),v.jsxs("span",{className:"ml-1 inline-flex items-center gap-1 text-[10px] font-medium text-muted-foreground/70",children:[v.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"})," live"]})]}),v.jsx("div",{className:"grid gap-4 sm:grid-cols-2",children:XE.map(r=>v.jsx(Ffe,{stat:t==null?void 0:t[r.key],label:r.label,hint:r.hint,maxP95:e},r.key))}),v.jsx("div",{className:"mt-4 border-t border-border/30 pt-2 text-[10px] text-muted-foreground/70",children:n?"Server-seitige Dauer je Pipeline-Stufe (p50 prominent). Rollender Schnitt über die letzten Turns; Reset bei Neustart.":"Noch keine Voice-Turns gemessen — sprich einmal über den „Sprechen“-Tab, dann erscheinen hier STT/Vision/Chat/TTS."})]})}const vV=["fast","heavy","coder","vision","hermes","scout"],Bfe={fast:"bg-cyan-500/15 text-cyan-400 border-cyan-500/25",heavy:"bg-amber-500/15 text-amber-400 border-amber-500/25",coder:"bg-violet-500/15 text-violet-400 border-violet-500/25",vision:"bg-pink-500/15 text-pink-400 border-pink-500/25",scout:"bg-teal-500/15 text-teal-400 border-teal-500/25",hermes:"bg-indigo-500/15 text-indigo-400 border-indigo-500/25"},yV=t=>t&&Bfe[t]||"bg-slate-500/15 text-slate-300 border-slate-500/25";function Hfe({fit:t}){const e={perfect:"bg-emerald-500/15 text-emerald-400 border border-emerald-500/20",marginal:"bg-amber-500/15 text-amber-400 border border-amber-500/20",too_tight:"bg-red-500/15 text-red-400 border border-red-500/20"}[t.level];return v.jsxs("span",{className:Je("rounded px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wider font-mono",e),children:[t.text," • ",t.req_gb," GB RAM"]})}function k3(t){const e=t.toLowerCase();return e.includes("qwen")?{name:"Qwen",color:"bg-purple-500/20 text-purple-300 border-purple-500/30",initial:"Q"}:e.includes("gemma")?{name:"Gemma",color:"bg-blue-500/20 text-blue-300 border-blue-500/30",initial:"G"}:e.includes("llama")?{name:"Llama",color:"bg-red-500/20 text-red-300 border-red-500/30",initial:"🦙"}:e.includes("mistral")||e.includes("mixtral")?{name:"Mistral",color:"bg-orange-500/20 text-orange-300 border-orange-500/30",initial:"M"}:e.includes("deepseek")?{name:"DeepSeek",color:"bg-cyan-500/20 text-cyan-300 border-cyan-500/30",initial:"D"}:e.includes("hermes")||e.includes("nous")?{name:"Hermes",color:"bg-amber-500/20 text-amber-300 border-amber-500/30",initial:"H"}:e.includes("phi")?{name:"Phi",color:"bg-emerald-500/20 text-emerald-300 border-emerald-500/30",initial:"Φ"}:{name:"Other",color:"bg-slate-500/20 text-slate-300 border-slate-500/30",initial:"AI"}}function Vfe(){var y,b,S;const{data:t}=Bg(2e3),{data:e}=TC(2e3),{data:n}=$y(),r=(t==null?void 0:t.models)??[],i=(t==null?void 0:t.running)??[],s=((y=n==null?void 0:n.gpu)==null?void 0:y.gtt_total)||((b=n==null?void 0:n.gpu)==null?void 0:b.vram_total)||0,a=((S=n==null?void 0:n.gpu)==null?void 0:S.gtt_used)||0,o=s>0?Math.min(100,a/s*100):0,l=o>=88?"bg-red-500":o>=70?"bg-amber-500":"bg-teal-500",c=o>=88?"text-red-400":o>=70?"text-amber-400":"text-foreground",d=R.useRef(null),[f,p]=R.useState(!1);return R.useEffect(()=>{if(!e)return;const w=e.total_tokens;if(d.current!==null&&w>d.current){p(!0);const x=setTimeout(()=>p(!1),4e3);return d.current=w,()=>clearTimeout(x)}d.current=w},[e==null?void 0:e.total_tokens]),v.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15 flex flex-col",children:[v.jsxs("div",{className:"flex items-center justify-between mb-4",children:[v.jsxs("div",{className:"flex items-center gap-2",children:[v.jsx(nw,{className:"h-4.5 w-4.5 text-primary"}),v.jsx("h2",{className:"text-sm font-semibold tracking-wide uppercase text-foreground",children:"Modelle"})]}),v.jsxs("span",{className:Je("flex items-center gap-1.5 text-[10px] font-bold uppercase tracking-wider font-mono px-2 py-0.5 rounded-full border transition-colors",f?"bg-emerald-500/10 text-emerald-400 border-emerald-500/30":"bg-background/30 text-muted-foreground/70 border-border/40"),children:[f?v.jsx(wh,{className:"h-3 w-3 animate-pulse"}):v.jsx(J8,{className:"h-3 w-3"}),f?"Inferenz aktiv":"Idle"]})]}),s>0&&v.jsxs("div",{className:"mb-4",children:[v.jsxs("div",{className:"flex items-center justify-between text-[10px] font-mono text-muted-foreground/80 mb-1",children:[v.jsx("span",{className:"uppercase tracking-wider font-semibold",children:"Speicher-Pool"}),v.jsxs("span",{children:[v.jsx("span",{className:Je("font-bold",c),children:sd(a)})," / ",sd(s)," GB belegt"]})]}),v.jsx("div",{className:"h-1.5 w-full rounded-full bg-background/50 border border-border/30 overflow-hidden",children:v.jsx("div",{className:Je("h-full rounded-full transition-all duration-500",l),style:{width:`${o}%`}})})]}),v.jsx("div",{className:"space-y-2 flex-1",children:vV.map(w=>{var T;const x=r.find(P=>P.role===w),M=x?i.includes(x.name):!1;return v.jsxs("div",{className:Je("flex items-center justify-between gap-2 p-2 rounded-xl border transition-all duration-300",M?"border-emerald-500/30 bg-emerald-500/5 shadow-sm shadow-emerald-500/5":x?"border-primary/20 bg-primary/5":"border-border/30 bg-background/10 opacity-60"),children:[v.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[v.jsx("span",{className:Je("text-[9px] font-semibold uppercase px-1.5 py-0.5 rounded font-mono border tracking-wider shrink-0",yV(w)),children:w}),v.jsxs("div",{className:"flex flex-col min-w-0",children:[v.jsx("span",{className:"text-xs font-semibold truncate font-mono text-foreground",children:x?(T=x.name.split("/").pop())==null?void 0:T.replace(/\.gguf$/i,""):"nicht zugewiesen"}),x&&v.jsxs("div",{className:"flex gap-1 items-center mt-0.5 flex-wrap text-muted-foreground/70",children:[v.jsx("span",{className:"text-[9px] font-mono",children:Io(x.size_bytes)}),x.prompt_cache&&v.jsx("span",{className:"text-[7px] leading-none font-mono font-bold bg-cyan-500/10 text-cyan-400 border border-cyan-500/20 px-1 py-0.5 rounded",title:"Prompt Caching aktiv",children:"PC"}),x.spec_active&&v.jsx("span",{className:"text-[7px] leading-none font-mono font-bold bg-emerald-500/10 text-emerald-400 border border-emerald-500/20 px-1 py-0.5 rounded",title:`Speculative Decoding aktiv (Draft: ${x.spec_draft_model})`,children:"SPEC"}),x.parallel_slots>1&&v.jsxs("span",{className:"text-[7px] leading-none font-mono font-bold bg-violet-500/10 text-violet-400 border border-violet-500/20 px-1 py-0.5 rounded",title:`${x.parallel_slots} parallele Slots aktiv`,children:["SLOTS: ",x.parallel_slots]}),x.incomplete&&v.jsx("span",{className:"text-[7px] leading-none font-mono font-bold bg-amber-500/10 text-amber-400 border border-amber-500/20 px-1 py-0.5 rounded",title:"GGUF-Datei fehlt",children:"⚠ fehlt"})]})]})]}),v.jsx("span",{className:"shrink-0",children:x?M?v.jsxs("span",{className:"flex items-center gap-1 text-[8px] font-semibold text-emerald-400 uppercase tracking-wider font-mono",children:[v.jsx("span",{className:Je("h-1.5 w-1.5 rounded-full bg-emerald-500",f&&"animate-pulse")})," warm"]}):v.jsx("span",{className:"text-[8px] font-semibold text-muted-foreground uppercase tracking-wider font-mono",children:"bereit"}):v.jsx("span",{className:"text-[8px] font-semibold text-muted-foreground/60 uppercase tracking-wider font-mono",children:"—"})})]},w)})}),v.jsx("div",{className:"mt-4 text-[10px] text-muted-foreground/80 border-t border-border/30 pt-3",children:"Laden erfolgt automatisch per Auto-Swap. Details & Routing im Modell-Manager."})]})}function O3({children:t}){return v.jsx("p",{className:"mb-2 ml-0.5 text-[11px] font-semibold uppercase tracking-wider text-muted-foreground/60",children:t})}function Gfe(){return v.jsxs("div",{className:"space-y-7",children:[v.jsxs("div",{children:[v.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Zentrale"}),v.jsx("p",{className:"text-sm text-muted-foreground",children:"Aktueller Status von System, Modellen und Agent."})]}),v.jsxs("div",{className:"grid items-stretch gap-6 lg:grid-cols-3",children:[v.jsx(tfe,{}),v.jsx(Ufe,{}),v.jsx(Vfe,{})]}),v.jsxs("section",{children:[v.jsx(O3,{children:"Stack & Telemetrie"}),v.jsxs("div",{className:"grid gap-6 md:grid-cols-2",children:[v.jsx(jfe,{}),v.jsx(zfe,{})]})]}),v.jsxs("section",{children:[v.jsx(O3,{children:"Betrieb & Wissen"}),v.jsxs("div",{className:"grid gap-6 md:grid-cols-3",children:[v.jsx(Ofe,{}),v.jsx(Lfe,{}),v.jsx(Dfe,{})]})]})]})}function Wfe(){const t=Nd(),{data:e=[]}=P7(2e3),{showAlert:n,dialogElement:r}=tv();async function i(o){try{await It(`/api/jobs/${o}/cancel`,{method:"POST"}),t.invalidateQueries({queryKey:qn.jobs})}catch(l){n("Fehler",l.message)}}const s=e.filter(o=>o.state==="running"||o.state==="queued"),a=e.filter(o=>o.state!=="running"&&o.state!=="queued").slice(-3);return s.length===0&&a.length===0?null:v.jsxs("div",{className:"space-y-3 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-4 shadow-lg shadow-black/10",children:[v.jsx("div",{className:"text-[11px] font-semibold text-muted-foreground uppercase tracking-wider",children:"Aktive Downloads"}),s.map(o=>v.jsxs("div",{className:"space-y-1.5 p-3 rounded-xl bg-background/20 border border-border/40",children:[v.jsxs("div",{className:"flex justify-between items-center text-xs",children:[v.jsx("span",{className:"font-semibold truncate max-w-[250px]",children:o.label}),v.jsxs("div",{className:"flex items-center gap-3",children:[v.jsxs("span",{className:"text-muted-foreground font-mono",children:[o.progress??0,"% • ",WT(o.done_bytes),"/",WT(o.total_bytes),o.eta_s?` • ETA ${z7(o.eta_s)}`:""]}),v.jsx("button",{onClick:()=>i(o.id),className:"text-[10px] text-red-400 hover:text-red-300 font-semibold border border-red-500/25 bg-red-500/5 px-2 py-0.5 rounded transition-all cursor-pointer",children:"Abbrechen"})]})]}),v.jsx("div",{className:"h-1.5 overflow-hidden rounded-full bg-muted",children:v.jsx("div",{className:"h-full rounded-full bg-primary transition-all duration-500",style:{width:`${o.progress??0}%`}})})]},o.id)),a.map(o=>v.jsxs("div",{className:"flex justify-between items-center text-xs text-muted-foreground px-1",children:[v.jsx("span",{className:"truncate",children:o.label}),v.jsx("span",{className:Je("font-semibold text-[10px] px-1.5 py-0.5 rounded uppercase font-mono",o.state==="done"?"bg-emerald-500/10 text-emerald-400":"bg-amber-500/10 text-amber-400"),children:o.state})]},o.id)),r]})}function Pf({children:t,tone:e="muted"}){const n={muted:"bg-muted text-muted-foreground",primary:"bg-primary/15 text-primary",warn:"bg-amber-500/15 text-amber-500"};return v.jsx("span",{className:`rounded px-1.5 py-0.5 text-[11px] font-medium ${n[e]}`,children:t})}function L3({caps:t}){return t?v.jsxs("span",{className:"inline-flex flex-wrap gap-1",children:[t.coder&&v.jsx(Pf,{children:"💻 Code"}),t.vision&&v.jsx(Pf,{children:"👁 Bild"}),t.reasoning&&v.jsx(Pf,{children:"🧠 Reason"}),t.moe&&v.jsxs(Pf,{tone:"primary",children:["🧩 MoE",t.active_b?`·${t.active_b}b`:""]}),t.tools==="yes"&&v.jsx(Pf,{tone:"primary",children:"🛠 Tools"}),t.tools==="likely"&&v.jsx(Pf,{tone:"warn",children:"🛠 Tools?"}),t.embedding&&v.jsx(Pf,{children:"🔢 Embed"})]}):null}function $fe({model:t,onClose:e,onChanged:n}){var S,w;const{data:r,isLoading:i}=N7(t.gguf_path),[s,a]=R.useState(null),[o,l]=R.useState(""),c=r==null?void 0:r.target_vocab,d=(r==null?void 0:r.drafts)??[],f=d.filter(x=>x.compatible===!0),p=t.spec_draft_model;async function y(x){a(x??"__clear__"),l("");try{await It(`/api/models/${encodeURIComponent(t.name)}/draft`,{method:"POST",body:JSON.stringify({draft_path:x})}),n(),e()}catch(M){l(String((M==null?void 0:M.message)||M)),a(null)}}const b=x=>{var M;return x?`${x.pre??"?"} · ${((M=x.n_vocab)==null?void 0:M.toLocaleString())??"?"} Tokens`:"—"};return v.jsx("div",{className:"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm flex items-center justify-center p-4",children:v.jsxs("div",{className:"w-full max-w-lg rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[v.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[v.jsxs("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary flex items-center gap-2",children:[v.jsx(wh,{className:"h-4 w-4"})," Speculative Draft"]}),v.jsx("button",{onClick:e,className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:v.jsx(Ed,{className:"h-4 w-4"})})]}),v.jsxs("div",{className:"text-xs text-muted-foreground leading-relaxed",children:['Beschleunigt die Token-Generierung mit einem kleinen "Draft"-Modell. Voraussetzung: der Draft muss den ',v.jsx("strong",{className:"text-foreground",children:"exakt gleichen Tokenizer (Vocab)"})," haben wie das Modell — sonst lehnt llama.cpp es ab."]}),v.jsxs("div",{className:"rounded-lg border border-border/40 bg-background/30 px-3 py-2 text-[11px] font-mono flex items-center justify-between",children:[v.jsx("span",{className:"text-muted-foreground",children:(S=t.name.split("/").pop())==null?void 0:S.replace(/\.gguf$/i,"")}),v.jsxs("span",{className:"text-foreground",children:["Vocab: ",b(c)]})]}),t.spec_active&&p&&v.jsxs("div",{className:"rounded-lg border border-emerald-500/30 bg-emerald-500/5 px-3 py-2 flex items-center justify-between gap-2",children:[v.jsxs("span",{className:"text-[11px] text-emerald-400 font-mono flex items-center gap-1.5 truncate",children:[v.jsx(Sa,{className:"h-3.5 w-3.5 shrink-0"})," Aktiv: ",p]}),v.jsx("button",{onClick:()=>y(null),disabled:s!==null,className:"h-6 px-2.5 rounded border border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/10 text-amber-400 text-[9px] font-bold uppercase shrink-0 cursor-pointer disabled:opacity-50",children:"Deaktivieren"})]}),!(r!=null&&r.target_exists)&&v.jsxs("div",{className:"rounded-lg border border-amber-500/30 bg-amber-500/5 px-3 py-2 text-[11px] text-amber-400 flex items-center gap-2",children:[v.jsx(bg,{className:"h-3.5 w-3.5 shrink-0"}),"Modell-GGUF noch nicht vorhanden — Spec-Draft ist nach dem Download konfigurierbar."]}),v.jsx("div",{className:"space-y-1.5 max-h-64 overflow-y-auto pr-1",children:i?v.jsx("div",{className:"text-xs text-muted-foreground py-6 text-center",children:"Prüfe Vocab-Kompatibilität…"}):d.length===0?v.jsxs("div",{className:"text-[11px] text-muted-foreground border border-dashed border-border/50 rounded-lg p-4 text-center",children:["Keine Draft-Modelle in ",v.jsx("code",{className:"font-mono",children:"/srv/models/drafts"}),". Lade ein kleines same-family-Modell (z.B. Qwen3-0.6B) und lege es dort ab."]}):d.map(x=>{var P,O;const M=x.filename===p,T=x.compatible===!0;return v.jsxs("div",{className:Je("rounded-lg border px-3 py-2 flex items-center justify-between gap-2 text-left",T?"border-border/40 bg-background/20":"border-border/20 bg-background/10 opacity-60",M&&"border-primary/40 bg-primary/10"),children:[v.jsxs("div",{className:"min-w-0",children:[v.jsxs("div",{className:"text-[11px] font-mono font-semibold text-foreground truncate flex items-center gap-1.5",children:[x.filename,x.mtp&&v.jsx("span",{className:"shrink-0 rounded bg-indigo-500/15 px-1.5 py-0.5 text-[8px] font-bold uppercase tracking-wider text-indigo-400 border border-indigo-500/25",title:"MTP-Kopf (Multi-Token-Prediction) — by-construction vocab-identisch, höchste Akzeptanzrate",children:"MTP"})]}),v.jsxs("div",{className:"text-[9px] text-muted-foreground font-mono",children:[Io(x.size_bytes)," · Vocab: ",b(x.vocab)]})]}),T?M?v.jsxs("span",{className:"text-[9px] font-bold uppercase text-primary flex items-center gap-1 shrink-0",children:[v.jsx(Sa,{className:"h-3.5 w-3.5"})," Aktiv"]}):v.jsx("button",{onClick:()=>y(x.path),disabled:s!==null,className:"h-7 px-3 rounded-lg border border-emerald-500/30 bg-emerald-500/5 hover:bg-emerald-500/15 text-emerald-400 text-[9px] font-bold uppercase shrink-0 cursor-pointer disabled:opacity-50",children:"Aktivieren"}):v.jsxs("span",{className:"text-[9px] font-bold uppercase text-amber-400/80 flex items-center gap-1 shrink-0",title:x.compatible===!1?`Inkompatibel: Tokenizer/Vocab weicht ab (Draft ${(P=x.vocab)==null?void 0:P.pre}/${(O=x.vocab)==null?void 0:O.n_vocab} ≠ Modell ${c==null?void 0:c.pre}/${c==null?void 0:c.n_vocab}).`:"Kompatibilität nicht prüfbar (Datei fehlt).",children:[v.jsx(bg,{className:"h-3.5 w-3.5"})," ",x.compatible===!1?"Vocab ≠":"n/a"]})]},x.path)})}),!i&&(r==null?void 0:r.target_exists)&&d.length>0&&f.length===0&&v.jsxs("div",{className:"rounded-lg border border-amber-500/30 bg-amber-500/5 px-3 py-2 text-[11px] text-amber-400 leading-relaxed",children:["Kein vocab-kompatibler Draft verfügbar — Speculative Decoding ist für dieses Modell nicht möglich. Es braucht einen Draft mit identischem Tokenizer (pre=",v.jsx("span",{className:"font-mono",children:c==null?void 0:c.pre}),", n_vocab=",v.jsx("span",{className:"font-mono",children:(w=c==null?void 0:c.n_vocab)==null?void 0:w.toLocaleString()}),")."]}),o&&v.jsx("div",{className:"text-[10px] text-red-400 font-mono",children:o})]})})}const Xfe=["fast","heavy","heavy_chars"],qfe=["coder_lite","coder","coding_escalate_chars"];function Kfe(){const t=Nd(),{data:e,isLoading:n}=T7(),[r,i]=R.useState(null),[s,a]=R.useState(!1),[o,l]=R.useState(""),[c,d]=R.useState(0);if(R.useEffect(()=>{e!=null&&e.policy&&!r&&i({...e.policy})},[e,r]),n||!e||!r)return v.jsx("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 text-xs text-muted-foreground",children:"Lade Routing-Policy…"});const f=x=>e.fields.find(M=>M.key===x),p=Object.keys(r).some(x=>r[x]!==e.policy[x]),y=(x,M)=>{i(T=>T&&{...T,[x]:M}),l("")},b=x=>y(x,e.defaults[x]);async function S(){if(!r)return;const x={};for(const M of Object.keys(r))r[M]!==e.policy[M]&&(x[M]=r[M]);if(Object.keys(x).length!==0){a(!0),l("");try{const{policy:M}=await _7(x);i({...M}),t.invalidateQueries({queryKey:qn.routingPolicy}),t.invalidateQueries({queryKey:qn.routing}),d(Date.now()),setTimeout(()=>d(0),2e3)}catch(M){l(M.message||String(M))}finally{a(!1)}}}function w({k:x}){const M=f(x),T=r[x],P=r[x]===e.defaults[x];return v.jsxs("div",{className:"space-y-1",children:[v.jsxs("div",{className:"flex items-center justify-between gap-2",children:[v.jsx("label",{className:"text-[10px] font-semibold text-muted-foreground",children:M.label}),!P&&v.jsxs("button",{onClick:()=>b(x),className:"flex items-center gap-0.5 text-[9px] text-muted-foreground/60 hover:text-foreground transition-colors cursor-pointer",title:`Auf Default zurücksetzen (${String(e.defaults[x])||"leer"})`,children:[v.jsx(hF,{className:"h-2.5 w-2.5"})," Default"]})]}),M.type==="bool"?v.jsxs("button",{onClick:()=>y(x,!T),className:Je("flex h-8 w-full items-center justify-between rounded-lg border px-3 text-[11px] font-semibold transition-all cursor-pointer",T?"border-emerald-500/40 bg-emerald-500/10 text-emerald-300":"border-border/40 bg-background/40 text-muted-foreground"),children:[v.jsx("span",{children:T?"An":"Aus"}),v.jsx("span",{className:Je("h-3.5 w-3.5 rounded-full transition-colors",T?"bg-emerald-400":"bg-muted-foreground/40")})]}):M.type==="int"?v.jsx("input",{type:"number",value:T,min:M.min,max:M.max,"aria-label":M.label,onChange:O=>y(x,Number(O.target.value)),className:"h-8 w-full rounded-lg border border-border/40 bg-background/40 px-3 font-mono text-[11px] text-foreground outline-none focus:border-primary/50"}):v.jsx("input",{type:"text",value:T,"aria-label":M.label,spellCheck:!1,placeholder:x==="coder_lite"?"(leer = aus)":"",onChange:O=>y(x,O.target.value),className:"h-8 w-full rounded-lg border border-border/40 bg-background/40 px-3 font-mono text-[11px] text-foreground outline-none focus:border-primary/50"})]})}return v.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-4",children:[v.jsxs("div",{className:"flex items-center justify-between gap-3 flex-wrap",children:[v.jsxs("div",{className:"flex items-center gap-2",children:[v.jsx(c9,{className:"h-4.5 w-4.5 text-primary"}),v.jsx("span",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"Lane-Routing & Policy"}),v.jsx("span",{className:"text-[9px] font-mono px-1.5 py-0.5 rounded bg-emerald-500/10 text-emerald-300 border border-emerald-500/20",children:"hot-reload"})]}),v.jsxs("div",{className:"flex items-center gap-2",children:[o&&v.jsx("span",{className:"text-[10px] text-red-400 max-w-[280px] truncate",title:o,children:o}),c>0&&v.jsxs("span",{className:"flex items-center gap-1 text-[10px] text-emerald-400",children:[v.jsx(Sa,{className:"h-3.5 w-3.5"})," gespeichert"]}),v.jsxs("button",{onClick:S,disabled:!p||s,className:Je("h-8 px-4 rounded-lg text-[10px] font-bold uppercase tracking-wide transition-all flex items-center gap-1.5",p&&!s?"bg-primary text-primary-foreground hover:opacity-90 cursor-pointer shadow-md shadow-primary/10":"bg-background/40 text-muted-foreground/50 border border-border/40 cursor-not-allowed"),children:[s?v.jsx($1,{className:"h-3.5 w-3.5 animate-spin"}):null,"Speichern"]})]})]}),v.jsxs("p",{className:"text-[10px] text-muted-foreground/70 leading-relaxed -mt-1",children:["Welches echte Modell hinter den virtuellen Lanes ",v.jsx("code",{className:"text-cyan-300",children:"chat"})," und"," ",v.jsx("code",{className:"text-cyan-300",children:"coding"})," steckt. Änderungen greifen sofort (kein Neustart). Die Keyword-Heuristiken bleiben im Code."]}),v.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[v.jsxs("div",{className:"rounded-xl border border-border/40 bg-background/25 p-4 space-y-3",children:[v.jsxs("div",{className:"flex items-center gap-2 border-b border-border/30 pb-2",children:[v.jsx(Z8,{className:"h-4 w-4 text-teal-400"}),v.jsx("span",{className:"text-[11px] font-bold uppercase tracking-wider text-foreground",children:"chat"}),v.jsx("span",{className:"text-[9px] text-muted-foreground/60 font-mono",children:"(= auto)"})]}),Xfe.map(x=>v.jsx(w,{k:x},x))]}),v.jsxs("div",{className:"rounded-xl border border-border/40 bg-background/25 p-4 space-y-3",children:[v.jsxs("div",{className:"flex items-center gap-2 border-b border-border/30 pb-2",children:[v.jsx(O8,{className:"h-4 w-4 text-indigo-400"}),v.jsx("span",{className:"text-[11px] font-bold uppercase tracking-wider text-foreground",children:"coding"}),v.jsx("span",{className:"text-[9px] text-muted-foreground/60 font-mono",children:"(agentisch → immer Coder)"})]}),qfe.map(x=>v.jsx(w,{k:x},x))]})]}),v.jsx("div",{className:"rounded-xl border border-border/40 bg-background/25 p-4",children:v.jsx("div",{className:"max-w-xs",children:v.jsx(w,{k:"fast_no_think"})})})]})}function Yfe(){var de,Z,Ve,Le;const t=Nd(),{data:e,isLoading:n,error:r}=Bg(4e3),{data:i}=CC(4e3),{data:s}=C7(),{data:a}=$y(),{data:o}=E7(),{showAlert:l,showConfirm:c,showPrompt:d,dialogElement:f}=tv(),p=(e==null?void 0:e.models)??[],y=(e==null?void 0:e.running)??[],b=r?String(r):"",S=()=>{t.invalidateQueries({queryKey:qn.models}),t.invalidateQueries({queryKey:qn.routing})},w=(de=o==null?void 0:o.groups)==null?void 0:de.brains,x=(w==null?void 0:w.members)??[],M=ne=>x.includes(ne),T=x.some(ne=>y.includes(ne));async function P(ne){if(!w){l("Keine brains-Gruppe","Es existiert noch keine Ko-Residenz-Gruppe „brains“ in der Engine-Konfiguration. Lege sie erst über die Gruppen-Verwaltung an.");return}const Xe=x.includes(ne)?x.filter(Ze=>Ze!==ne):[...x,ne];try{await b7("brains",Xe,w.swap??!1,w.persist??!0),t.invalidateQueries({queryKey:qn.groups}),S()}catch(Ze){l("Fehler",`Ko-Residenz konnte nicht geändert werden: ${Ze.message||Ze}`)}}const[O,N]=R.useState(null),[D,z]=R.useState(null),[V,k]=R.useState(null),[j,X]=R.useState("grid"),[ee,ie]=R.useState("all"),pe=p.filter(ne=>ee==="in_use"?!!ne.role||y.includes(ne.name):!0);async function ae(ne){try{await It(`/api/models/${encodeURIComponent(ne)}/load`,{method:"POST"}),S()}catch(Ce){l("Fehler",`Fehler beim Laden des Modells: ${Ce.message}`)}}async function he(ne){if(w&&T&&!M(ne)){const Ce=x.filter(Xe=>y.includes(Xe)).map(Xe=>Xe.split("/").pop()).join(", ");c("Verdrängt das Hirn?",`„${ne.split("/").pop()}“ ist nicht in der Ko-Residenz-Gruppe „brains“. Beim Laden wirft es das aktuell warme Hirn (${Ce}) raus — Lucy verliert Hirn bzw. Augen. - -Trotzdem exklusiv laden? Tipp: Mit dem 🧠-Schalter machst du das Modell dauerhaft ko-resident, dann bleiben beide warm.`,()=>ae(ne));return}ae(ne)}async function B(ne){try{await It(`/api/models/${encodeURIComponent(ne)}/unload`,{method:"POST"}),S()}catch(Ce){l("Fehler",`Fehler beim Entladen des Modells: ${Ce.message}`)}}async function J(){try{await It("/api/models/unload",{method:"POST"}),S()}catch(ne){l("Fehler",`Fehler beim Entladen aller Modelle: ${ne.message}`)}}async function Y(ne,Ce){try{const Xe=await It(`/api/models/${encodeURIComponent(Ce)}/role`,{method:"POST",body:JSON.stringify({role:ne||null})});S(),Xe!=null&&Xe.warning&&l("Hirn gesetzt — Hinweis",Xe.warning)}catch(Xe){l("Fehler",`Fehler beim Zuweisen der Rolle: ${Xe.message||Xe}`)}}function H(ne){N(ne),z(null),It(`/api/roles/${encodeURIComponent(ne)}/recommend`).then(Ce=>z(Ce)).catch(()=>{})}async function G(ne,Ce){let Xe=null;try{Xe=await It(`/api/models/${encodeURIComponent(ne)}/ctx/auto`)}catch{}const Ze=Xe?`Optimal für dein Setup: ${(Xe.ctx/1024).toFixed(0)}k (${Xe.ctx}) — GTT ${Xe.gtt_gb} GB − reserviert ${Xe.reserved_gb} GB (${Xe.mode}) → ${Xe.budget_gb} GB frei. »Auto« trägt diesen Wert ein.`:"Gib die gewünschte Kontextlänge in Tokens an:";d("Kontextlänge anpassen",Ze,String(Ce||32768),async Q=>{if(Q)try{await It(`/api/models/${encodeURIComponent(ne)}/ctx`,{method:"POST",body:JSON.stringify({ctx:parseInt(Q,10)})}),S()}catch(W){l("Fehler",`Fehler beim Setzen des Kontexts: ${W.message||W}`)}},void 0,Xe?{autoValue:String(Xe.ctx),autoLabel:`Auto (${(Xe.ctx/1024).toFixed(0)}k)`}:void 0)}async function le(ne){c("Modell löschen?",`Modell '${ne}' und alle zugehörigen GGUF-Dateien unwiderruflich von der Box löschen?`,async()=>{try{await It(`/api/models/${encodeURIComponent(ne)}`,{method:"DELETE"}),S()}catch(Ce){l("Fehler",`Fehler beim Löschen: ${Ce.message||Ce}`)}})}async function se(ne,Ce,Xe,Ze){try{await It("/api/models/install",{method:"POST",body:JSON.stringify({repo:ne,role:Ce,quant:Xe,jinja:Ze})}),l("Herunterladen gestartet",`Download für '${ne}' gestartet! Der Fortschritt wird oben angezeigt.`)}catch(Q){l("Fehler",`Fehler beim Starten des Upgrades: ${Q.message||Q}`)}}async function ce(ne){const Ce=s==null?void 0:s.budget,Xe=Ce&&!Ce.fits?` - -⚠ Speicher-Warnung: Dieses Brain (~${Ce.brain_gb} GB) muss immer resident sein. Zusammen mit dem größten on-demand-Modell (~${Ce.largest_ondemand_gb} GB) sprengt das das Budget (${Ce.gtt_gb} GB) → heavy/coder würden das Brain verdrängen. Erwäge ein kleineres Brain oder weniger Kontext.`:"";c("Agent-Hirn aktualisieren?",`Neues Hermes-Modell '${ne.split("/").pop()}' herunterladen und als Agent-Hirn (Rolle hermes) setzen? Hermes nutzt danach automatisch das neue Modell.${Xe}`,async()=>{try{await It("/api/models/install",{method:"POST",body:JSON.stringify({repo:ne,role:"hermes",quant:"Q4_K_M",jinja:!0})}),l("Download gestartet","Das neue Agent-Hirn wird geladen. Fortschritt oben."),S()}catch(Ze){l("Fehler",`Update fehlgeschlagen: ${Ze.message||Ze}`)}})}if(n)return v.jsx("div",{className:"text-xs text-muted-foreground py-12 text-center",children:"Initialisiere HUD Cockpit…"});if(b)return v.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400",children:["Gateway oder Engine nicht erreichbar (",b,")."]});const Se=p.filter(ne=>y.includes(ne.name)),we=Se.reduce((ne,Ce)=>ne+(Ce.size_bytes||0),0),We=((Z=a==null?void 0:a.gpu)==null?void 0:Z.gtt_total)||((Ve=a==null?void 0:a.gpu)==null?void 0:Ve.vram_total)||0,Ee=((Le=a==null?void 0:a.gpu)==null?void 0:Le.gtt_used)||0,Ge=16*1024**3,$e=We>2*1024**3?We:we>Ge?we*1.2:Ge;return v.jsxs("div",{className:"space-y-8",children:[v.jsx("style",{children:` - @keyframes flow-dash { - to { - stroke-dashoffset: -20; - } - } - .svg-flow-path { - stroke-dasharray: 4 6; - animation: flow-dash 1s linear infinite; - } - `}),v.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-3.5",children:[v.jsxs("div",{className:"flex justify-between items-center",children:[v.jsxs("div",{className:"flex items-center gap-2",children:[v.jsx(rE,{className:"h-4.5 w-4.5 text-primary"}),v.jsx("span",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"VRAM / Memory Belegung"})]}),v.jsxs("div",{className:"flex items-center gap-3",children:[v.jsxs("span",{className:"text-[10px] font-mono text-muted-foreground",children:["Speicher-Pool: ",Io(we)," Gewichte",Ee>0?` · ${Io(Ee)} real belegt (inkl. KV)`:""," / ",Io($e)]}),y.length>0&&v.jsx("button",{onClick:J,className:"h-6 px-2.5 rounded border border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/10 text-amber-400 text-[9px] font-bold uppercase transition-all cursor-pointer",children:"Alle entladen"})]})]}),v.jsx("div",{className:"h-7 w-full rounded-xl bg-background/50 border border-border/40 overflow-hidden flex p-0.5 relative group",children:Se.length===0?v.jsx("div",{className:"w-full h-full flex items-center justify-center text-[10px] text-muted-foreground/60 italic font-mono select-none",children:"VRAM Leer — Auto-Swap lädt Modelle bei Anfrage"}):Se.map((ne,Ce)=>{var Q;const Xe=(ne.size_bytes||0)/$e*100,Ze=["from-teal-500 to-emerald-500","from-indigo-500 to-blue-500","from-purple-500 to-pink-500","from-cyan-500 to-sky-500"][Ce%4];return v.jsxs("div",{style:{width:`${Xe}%`},className:Je("h-full rounded bg-gradient-to-r flex items-center justify-between px-2.5 transition-all text-white/95 shrink-0 shadow-inner select-none",Ze),title:`${ne.name} (${Io(ne.size_bytes)})`,children:[v.jsxs("span",{className:"text-[9px] font-bold truncate max-w-[120px] font-space tracking-wide",children:[ne.role?`[${ne.role}] `:"",(Q=ne.name.split("/").pop())==null?void 0:Q.replace(".gguf","")]}),v.jsx("span",{className:"text-[8px] font-mono opacity-80",children:Io(ne.size_bytes)})]},ne.name)})})]}),v.jsx(Kfe,{}),v.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-3.5",children:[v.jsx("div",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground px-1",children:"Gateway Steckplatz-Belegung (Slot-Zuweisung)"}),v.jsx("div",{className:"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-6 gap-3",children:vV.map(ne=>{var Ze;const Ce=p.find(Q=>Q.role===ne),Xe=Ce?y.includes(Ce.name):!1;return v.jsxs("div",{onClick:()=>H(ne),className:Je("rounded-xl border p-3 flex flex-col justify-between gap-2.5 transition-all cursor-pointer select-none text-left bg-background/25 hover:border-primary/45 hover:bg-background/40 group min-h-[90px]",Xe?"border-emerald-500/40 shadow-sm shadow-emerald-500/5":Ce?"border-primary/20 bg-primary/5":"border-border/30 border-dashed opacity-75"),children:[v.jsxs("div",{className:"flex items-center justify-between",children:[v.jsx("span",{className:Je("text-[9px] font-bold uppercase tracking-wider font-mono px-1.5 py-0.5 rounded border",yV(ne)),children:ne}),Xe&&v.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-400 animate-pulse"})]}),v.jsx("div",{className:"text-[10px] font-mono font-medium truncate text-foreground/90 pr-1 font-space",title:Ce==null?void 0:Ce.name,children:Ce?(Ze=Ce.name.split("/").pop())==null?void 0:Ze.replace(/\.gguf$/i,""):"nicht zugewiesen"}),v.jsx("div",{className:"text-[8px] text-primary/70 group-hover:text-primary font-bold uppercase tracking-wider transition-colors font-space",children:"Ändern ➔"})]},ne)})})]}),(s==null?void 0:s.current)&&v.jsxs("div",{className:"rounded-2xl border border-indigo-500/30 bg-indigo-500/5 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-3.5",children:[v.jsxs("div",{className:"flex items-center justify-between flex-wrap gap-2",children:[v.jsxs("div",{className:"flex items-center gap-2",children:[v.jsx($c,{className:"h-4.5 w-4.5 text-indigo-400"}),v.jsx("span",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"Agent-Hirn (Hermes)"}),s.current.version!=null&&v.jsxs("span",{className:"text-[9px] font-mono px-1.5 py-0.5 rounded bg-indigo-500/15 text-indigo-300 border border-indigo-500/25",children:["v",s.current.version]})]}),v.jsx("button",{onClick:()=>window.dispatchEvent(new CustomEvent("mc-navigate",{detail:{view:"agent"}})),className:"h-7 px-3 rounded-lg border border-indigo-500/30 bg-indigo-500/5 text-indigo-300 text-[9px] font-bold uppercase hover:bg-indigo-500/15 transition-all cursor-pointer",title:"Hirn-Wechsel passiert jetzt zentral im Hermes-Tab",children:"Im Hermes-Tab wechseln →"})]}),v.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-3 rounded-xl bg-background/30 border border-border/30 p-3.5",children:[v.jsxs("div",{className:"min-w-0",children:[v.jsx("div",{className:"text-xs font-mono font-bold text-foreground truncate",title:s.current.name,children:s.current.name.split("/").pop()}),v.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2 mt-0.5",children:[v.jsx("span",{children:s.current.params_b?`${s.current.params_b}B`:"—"}),v.jsx("span",{children:"•"}),v.jsx("span",{children:s.current.quant||"GGUF"}),v.jsx("span",{children:"•"}),v.jsx("span",{children:Io(s.current.size_bytes||0)})]})]}),s.update_available&&s.recommended?v.jsxs("button",{onClick:()=>ce(s.recommended.repo),className:Je("h-8 px-3 shrink-0 flex items-center justify-center gap-1.5 rounded-lg text-[10px] font-bold uppercase transition-all cursor-pointer shadow-md",s.budget&&!s.budget.fits?"bg-red-500 text-white hover:bg-red-400 shadow-red-500/10":"bg-amber-500 text-black hover:bg-amber-400 shadow-amber-500/10"),children:[v.jsx(yg,{className:"h-3.5 w-3.5"})," Aktualisieren"]}):v.jsxs("span",{className:"h-8 px-3 shrink-0 flex items-center gap-1.5 text-[10px] font-bold text-emerald-400 uppercase tracking-wide bg-emerald-500/5 border border-emerald-500/15 rounded-lg select-none",children:[v.jsx(Sa,{className:"h-4 w-4"})," Neueste Generation"]})]}),s.update_available&&s.recommended&&v.jsxs("div",{className:"text-[10px] text-amber-400/90 flex items-center gap-1.5",children:[v.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-amber-400 animate-ping shrink-0"}),"Neuere Generation verfügbar: ",v.jsx("span",{className:"font-mono font-bold",children:s.recommended.name.replace(/-GGUF$/i,"")}),"(v",s.recommended.version,", ",s.recommended.params_b,"B) — von NousResearch."]}),s.budget&&v.jsxs("div",{className:Je("text-[10px] flex items-start gap-1.5 leading-relaxed",s.budget.fits?"text-muted-foreground/80":"text-red-400 font-semibold"),children:[v.jsx(rE,{className:"h-3 w-3 shrink-0 mt-0.5"}),v.jsxs("span",{children:["Always-On-Brain ~",s.budget.brain_gb," GB + größtes on-demand (~",s.budget.largest_ondemand_gb," GB) = ",(s.budget.brain_gb+s.budget.largest_ondemand_gb).toFixed(1)," / ",s.budget.gtt_gb," GB",s.budget.fits?" · passt gleichzeitig ✓":" · passt NICHT gleichzeitig ⚠ — heavy/coder würden das Brain verdrängen. Kleineres Brain oder weniger Kontext."]})]})]}),v.jsxs("div",{className:"space-y-4",children:[v.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-3 px-1",children:[v.jsxs("div",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:["Installierte Modell-Bibliothek (",pe.length," von ",p.length,")"]}),v.jsxs("div",{className:"flex items-center gap-3",children:[v.jsxs("div",{className:"flex rounded-lg border border-border/40 bg-card/45 p-0.5",children:[v.jsx("button",{onClick:()=>ie("all"),className:Je("px-2.5 py-1 rounded-md text-[9px] font-bold uppercase transition-all cursor-pointer",ee==="all"?"bg-primary text-primary-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:"Vorhanden"}),v.jsx("button",{onClick:()=>ie("in_use"),className:Je("px-2.5 py-1 rounded-md text-[9px] font-bold uppercase transition-all cursor-pointer",ee==="in_use"?"bg-primary text-primary-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:"In Benutzung"})]}),v.jsxs("div",{className:"flex rounded-lg border border-border/40 bg-card/45 p-0.5",children:[v.jsx("button",{onClick:()=>X("grid"),className:Je("px-2.5 py-1 rounded-md text-[9px] font-bold uppercase transition-all cursor-pointer",j==="grid"?"bg-primary text-primary-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:"Grid"}),v.jsx("button",{onClick:()=>X("list"),className:Je("px-2.5 py-1 rounded-md text-[9px] font-bold uppercase transition-all cursor-pointer",j==="list"?"bg-primary text-primary-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:"List"})]})]})]}),j==="grid"?v.jsx("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-3",children:pe.length===0?v.jsx("div",{className:"col-span-full text-xs text-muted-foreground border border-dashed border-border/60 rounded-2xl p-12 text-center select-none",children:ee==="in_use"?"Keine Modelle in Benutzung (keine Zuweisung oder warm geladene Modelle).":'Keine Modelle konfiguriert. Verwende den Tab "Modelle finden" zum Herunterladen.'}):pe.map(ne=>{const Ce=y.includes(ne.name),Xe=i==null?void 0:i.model_list.find(Q=>Q.role===ne.role),Ze=k3(ne.name);return v.jsxs("div",{className:Je("rounded-2xl border bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 flex flex-col justify-between gap-4 transition-all duration-300 hover:border-primary/40 group relative overflow-hidden",Ce?"border-primary/45 shadow-primary/5":ne.role?"border-primary/30 bg-primary/5 shadow-inner":"border-border/60"),children:[v.jsxs("div",{className:"space-y-3",children:[v.jsx("div",{className:"flex items-start justify-between gap-3",children:v.jsxs("div",{className:"flex gap-2.5 min-w-0",children:[v.jsx("div",{className:Je("w-7 h-7 rounded-lg border flex items-center justify-center font-bold text-xs shrink-0 shadow-sm",Ze.color),title:Ze.name,children:Ze.initial}),v.jsxs("div",{className:"min-w-0",children:[v.jsx("h3",{className:"text-xs font-bold tracking-tight text-foreground line-clamp-2 break-all font-mono",title:ne.name,children:ne.name.split("/").pop()}),v.jsxs("div",{className:"flex items-center gap-2 flex-wrap mt-1",children:[v.jsx("span",{className:"text-[9px] font-mono text-muted-foreground bg-background/40 px-1.5 py-0.5 rounded border border-border/30",children:ne.quant||"GGUF"}),Ce&&v.jsxs("span",{className:"flex items-center gap-1 text-[9px] font-semibold text-emerald-400 uppercase tracking-wider",children:[v.jsx(bC,{className:"h-3 w-3 animate-pulse"})," Warm"]}),ne.role&&v.jsx("span",{className:"px-1.5 py-0.5 rounded bg-primary/10 border border-primary/20 text-[9px] font-mono text-primary font-bold uppercase",children:ne.role}),M(ne.name)&&v.jsx("span",{className:"px-1.5 py-0.5 rounded bg-fuchsia-500/10 border border-fuchsia-500/30 text-[9px] font-mono text-fuchsia-300 font-bold uppercase",title:"Ko-resident in der brains-Gruppe — bleibt mit dem Hirn gemeinsam warm, verdrängt es nicht.",children:"🧠 Ko-resident"}),ne.prompt_cache&&v.jsx("span",{className:"px-1.5 py-0.5 rounded bg-cyan-500/10 border border-cyan-500/20 text-[9px] font-mono text-cyan-400 font-bold uppercase",title:"Prompt Caching aktiv",children:"PC"}),ne.spec_active?v.jsx("span",{className:"px-1.5 py-0.5 rounded bg-emerald-500/10 border border-emerald-500/20 text-[9px] font-mono text-emerald-400 font-bold uppercase",title:`Speculative Decoding aktiv (Draft: ${ne.spec_draft_model})`,children:"SPEC"}):ne.spec_draft_model?v.jsx("span",{className:"px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/20 text-[9px] font-mono text-amber-400 font-bold uppercase",title:`Draft gesetzt (${ne.spec_draft_model}), aber INAKTIV — --spec-type fehlt oder Vocab inkompatibel. Über 'Spec' neu konfigurieren.`,children:"SPEC?"}):null,ne.parallel_slots>1&&v.jsxs("span",{className:"px-1.5 py-0.5 rounded bg-violet-500/10 border border-violet-500/20 text-[9px] font-mono text-violet-400 font-bold uppercase",title:`${ne.parallel_slots} parallele Slots aktiv`,children:["SLOTS: ",ne.parallel_slots]}),ne.incomplete&&v.jsx("span",{className:"px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/20 text-[9px] font-mono text-amber-400 font-bold uppercase",title:"GGUF-Datei fehlt — Modell kann nicht geladen werden",children:"⚠ Datei fehlt"})]})]})]})}),v.jsx("div",{className:"border-t border-border/30 pt-3 flex flex-wrap gap-1",children:v.jsx(L3,{caps:ne.capabilities})})]}),v.jsxs("div",{className:"space-y-3 pt-1",children:[v.jsxs("div",{className:"grid grid-cols-2 gap-2 text-[10px] font-mono text-muted-foreground",children:[v.jsxs("div",{className:"flex items-center gap-1.5 p-2 bg-background/20 rounded-lg border border-border/20",children:[v.jsx(rE,{className:"h-3.5 w-3.5 text-primary/80"}),v.jsxs("div",{children:[v.jsx("div",{className:"text-[8px] uppercase tracking-wider font-semibold text-muted-foreground/60",children:"Größe"}),v.jsx("div",{className:"text-foreground font-semibold",children:Io(ne.size_bytes)})]})]}),v.jsxs("div",{className:"flex items-center gap-1.5 p-2 bg-background/20 rounded-lg border border-border/20",children:[v.jsx(n9,{className:"h-3.5 w-3.5 text-primary/80"}),v.jsxs("div",{children:[v.jsx("div",{className:"text-[8px] uppercase tracking-wider font-semibold text-muted-foreground/60",children:"Kontext"}),v.jsx("div",{className:"text-foreground font-semibold",children:PI(ne.ctx)})]})]})]}),Xe&&v.jsxs("div",{className:"p-3 bg-amber-500/5 border border-amber-500/30 rounded-xl space-y-2 flex flex-col justify-between shrink-0",children:[v.jsxs("div",{className:"text-[9px] font-semibold text-amber-400 flex items-center gap-1",children:[v.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-amber-400 animate-ping"}),v.jsxs("span",{children:["Upgrade verfügbar: ",Xe.repo.split("/").pop()]})]}),v.jsxs("button",{onClick:()=>se(Xe.repo,ne.role,ne.quant||"Q4_K_M",ne.capabilities.tools!=="no"),className:"h-7 w-full flex items-center justify-center gap-1 rounded-lg bg-amber-500 text-black text-[10px] font-bold hover:bg-amber-400 transition-colors cursor-pointer",children:[v.jsx(yg,{className:"h-3 w-3"})," Smart-Swap starten"]})]}),v.jsxs("div",{className:"flex items-center gap-1.5 border-t border-border/20 pt-3 mt-auto",children:[v.jsx("button",{onClick:()=>Ce?B(ne.name):he(ne.name),disabled:ne.incomplete&&!Ce,className:Je("flex-1 h-7 rounded-lg text-[9px] font-bold uppercase transition-all border flex items-center justify-center gap-1",ne.incomplete&&!Ce?"border-border/30 bg-background/10 text-muted-foreground/50 cursor-not-allowed":Ce?"border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/15 text-amber-400 cursor-pointer":"border-primary/30 bg-primary/5 hover:bg-primary/15 text-primary cursor-pointer"),children:Ce?"Entladen":"Laden"}),v.jsx("button",{onClick:()=>G(ne.name,ne.ctx),className:"h-7 px-2.5 rounded-lg border border-border/40 text-[9px] font-bold uppercase hover:bg-accent text-muted-foreground transition-colors cursor-pointer",title:"Kontextlänge anpassen",children:"Ctx"}),w&&v.jsx("button",{onClick:()=>P(ne.name),className:Je("h-7 px-2.5 rounded-lg border text-[9px] font-bold uppercase transition-colors cursor-pointer",M(ne.name)?"border-fuchsia-500/40 bg-fuchsia-500/10 text-fuchsia-300 hover:bg-fuchsia-500/20":"border-border/40 text-muted-foreground hover:bg-accent"),title:M(ne.name)?"Ko-resident (brains): bleibt mit dem Hirn gemeinsam warm. Klick = aus der Gruppe nehmen.":"Zur brains-Gruppe hinzufügen — lädt dann ko-resident neben dem Hirn, statt es zu verdrängen.",children:"🧠"}),v.jsxs("button",{onClick:()=>k(ne),className:Je("h-7 px-2.5 rounded-lg border text-[9px] font-bold uppercase transition-colors cursor-pointer flex items-center gap-1",ne.spec_active?"border-emerald-500/30 text-emerald-400 hover:bg-emerald-500/10":ne.spec_draft_model?"border-amber-500/30 text-amber-400 hover:bg-amber-500/10":"border-border/40 text-muted-foreground hover:bg-accent"),title:"Speculative Draft konfigurieren (Vocab-geprüft)",children:[v.jsx(wh,{className:"h-3 w-3"})," Spec"]}),v.jsx("button",{onClick:()=>le(ne.name),className:"h-7 w-7 rounded-lg border border-border/40 text-muted-foreground hover:text-red-400 hover:bg-red-500/5 flex items-center justify-center transition-colors cursor-pointer","aria-label":"Modell löschen",title:"Modell löschen",children:v.jsx(LT,{className:"h-3.5 w-3.5","aria-hidden":"true"})})]})]})]},ne.name)})}):v.jsx("div",{className:"space-y-2",children:pe.length===0?v.jsx("div",{className:"text-xs text-muted-foreground border border-dashed border-border/60 rounded-2xl p-12 text-center select-none",children:ee==="in_use"?"Keine Modelle in Benutzung (keine Zuweisung oder warm geladene Modelle).":'Keine Modelle konfiguriert. Verwende den Tab "Modelle finden" zum Herunterladen.'}):pe.map(ne=>{const Ce=y.includes(ne.name),Xe=k3(ne.name);return v.jsxs("div",{className:Je("rounded-xl border bg-card/45 backdrop-blur-md p-3.5 shadow-lg shadow-black/5 flex flex-col sm:flex-row sm:items-center justify-between gap-3 hover:border-primary/40 transition-all",Ce?"border-primary/45":ne.role?"border-primary/30 bg-primary/5":"border-border/60"),children:[v.jsxs("div",{className:"flex items-center gap-3 min-w-0",children:[v.jsx("div",{className:Je("w-8 h-8 rounded-lg border border-border/40 flex items-center justify-center font-bold text-xs shrink-0 shadow-sm",Xe.color),title:Xe.name,children:Xe.initial}),v.jsxs("div",{className:"min-w-0 text-left",children:[v.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[v.jsx("h4",{className:"text-xs font-bold text-foreground truncate max-w-[250px] sm:max-w-[400px] break-all font-mono",title:ne.name,children:ne.name.split("/").pop()}),ne.role&&v.jsx("span",{className:"px-1.5 py-0.5 rounded bg-primary/10 border border-primary/20 text-[8px] font-mono text-primary font-bold uppercase shrink-0",children:ne.role}),M(ne.name)&&v.jsx("span",{className:"px-1.5 py-0.5 rounded bg-fuchsia-500/10 border border-fuchsia-500/30 text-[8px] font-mono text-fuchsia-300 font-bold uppercase shrink-0",title:"Ko-resident in der brains-Gruppe — bleibt mit dem Hirn gemeinsam warm.",children:"🧠 Ko-resident"}),ne.prompt_cache&&v.jsx("span",{className:"px-1.5 py-0.5 rounded bg-cyan-500/10 border border-cyan-500/20 text-[8px] font-mono text-cyan-400 font-bold uppercase shrink-0",title:"Prompt Caching aktiv",children:"PC"}),ne.spec_active?v.jsx("span",{className:"px-1.5 py-0.5 rounded bg-emerald-500/10 border border-emerald-500/20 text-[8px] font-mono text-emerald-400 font-bold uppercase shrink-0",title:`Speculative Decoding aktiv (Draft: ${ne.spec_draft_model})`,children:"SPEC"}):ne.spec_draft_model?v.jsx("span",{className:"px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/20 text-[8px] font-mono text-amber-400 font-bold uppercase shrink-0",title:`Draft gesetzt (${ne.spec_draft_model}), aber INAKTIV — --spec-type fehlt oder Vocab inkompatibel.`,children:"SPEC?"}):null,ne.parallel_slots>1&&v.jsxs("span",{className:"px-1.5 py-0.5 rounded bg-violet-500/10 border border-violet-500/20 text-[8px] font-mono text-violet-400 font-bold uppercase shrink-0",title:`${ne.parallel_slots} parallele Slots aktiv`,children:["SLOTS: ",ne.parallel_slots]}),ne.incomplete&&v.jsx("span",{className:"px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/20 text-[8px] font-mono text-amber-400 font-bold uppercase shrink-0",title:"GGUF-Datei fehlt",children:"⚠ Datei fehlt"}),Ce&&v.jsxs("span",{className:"flex items-center gap-0.5 text-[8px] font-semibold text-emerald-400 uppercase tracking-wider shrink-0",children:[v.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"})," warm"]})]}),v.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2 mt-0.5",children:[v.jsxs("span",{children:["Größe: ",Io(ne.size_bytes)]}),v.jsx("span",{children:"•"}),v.jsxs("span",{children:["Kontext: ",PI(ne.ctx)]}),v.jsx("span",{children:"•"}),v.jsx("span",{className:"font-mono text-[9px]",children:ne.quant||"GGUF"})]})]})]}),v.jsxs("div",{className:"flex items-center gap-3 shrink-0 self-end sm:self-auto",children:[v.jsx("div",{className:"hidden lg:flex flex-wrap gap-1",children:v.jsx(L3,{caps:ne.capabilities})}),v.jsxs("div",{className:"flex items-center gap-1.5",children:[v.jsx("button",{onClick:()=>Ce?B(ne.name):he(ne.name),disabled:ne.incomplete&&!Ce,className:Je("h-7 px-3 rounded-lg text-[9px] font-bold uppercase transition-all border flex items-center gap-1",ne.incomplete&&!Ce?"border-border/30 bg-background/10 text-muted-foreground/50 cursor-not-allowed":Ce?"border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/15 text-amber-400 cursor-pointer":"border-primary/30 bg-primary/5 hover:bg-primary/15 text-primary cursor-pointer"),children:Ce?"Entladen":"Laden"}),v.jsx("button",{onClick:()=>G(ne.name,ne.ctx),className:"h-7 px-2.5 rounded-lg border border-border/40 text-[9px] font-bold uppercase hover:bg-accent text-muted-foreground transition-all cursor-pointer",title:"Kontextlänge anpassen",children:"Ctx"}),w&&v.jsx("button",{onClick:()=>P(ne.name),className:Je("h-7 px-2.5 rounded-lg border text-[9px] font-bold uppercase transition-colors cursor-pointer",M(ne.name)?"border-fuchsia-500/40 bg-fuchsia-500/10 text-fuchsia-300 hover:bg-fuchsia-500/20":"border-border/40 text-muted-foreground hover:bg-accent"),title:M(ne.name)?"Ko-resident (brains): bleibt mit dem Hirn gemeinsam warm. Klick = aus der Gruppe nehmen.":"Zur brains-Gruppe hinzufügen — lädt dann ko-resident neben dem Hirn, statt es zu verdrängen.",children:"🧠"}),v.jsxs("button",{onClick:()=>k(ne),className:Je("h-7 px-2.5 rounded-lg border text-[9px] font-bold uppercase transition-all cursor-pointer flex items-center gap-1",ne.spec_active?"border-emerald-500/30 text-emerald-400 hover:bg-emerald-500/10":ne.spec_draft_model?"border-amber-500/30 text-amber-400 hover:bg-amber-500/10":"border-border/40 text-muted-foreground hover:bg-accent"),title:"Speculative Draft konfigurieren (Vocab-geprüft)",children:[v.jsx(wh,{className:"h-3 w-3"})," Spec"]}),v.jsx("button",{onClick:()=>le(ne.name),className:"h-7 w-7 rounded-lg flex items-center justify-center border border-border/40 text-muted-foreground hover:text-red-400 hover:bg-red-500/5 transition-all cursor-pointer","aria-label":"Modell löschen",title:"Modell löschen",children:v.jsx(LT,{className:"h-3.5 w-3.5","aria-hidden":"true"})})]})]})]},ne.name)})})]}),O&&(()=>{var Q,W;const ne=D&&D.role===O?D:null,Ce={};ne==null||ne.models.forEach(be=>{Ce[be.name]=be});const Xe=ne?ne.models.map(be=>p.find(Ue=>Ue.name===be.name)).filter(Boolean):p,Ze=be=>{Y(O,be),N(null)};return v.jsx("div",{className:"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm flex items-center justify-center p-4 overscroll-contain",role:"dialog","aria-modal":"true","aria-label":`Rolle ${O} konfigurieren`,children:v.jsxs("div",{className:"w-full max-w-md rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[v.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[v.jsxs("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary",children:["Rolle '",O,"' konfigurieren"]}),v.jsx("button",{onClick:()=>N(null),className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:v.jsx(Ed,{className:"h-4 w-4"})})]}),v.jsxs("div",{className:"flex items-center justify-between gap-2",children:[v.jsxs("p",{className:"text-xs text-muted-foreground",children:["Wähle ein Modell für die Rolle ",v.jsx("strong",{className:"text-foreground",children:O}),":"]}),(ne==null?void 0:ne.recommended)&&v.jsxs("button",{onClick:()=>Ze(ne.recommended),title:(Q=Ce[ne.recommended])==null?void 0:Q.reason,className:"shrink-0 h-7 px-3 text-[11px] font-semibold text-primary border border-primary/50 bg-primary/10 hover:bg-primary/20 rounded-lg cursor-pointer flex items-center gap-1",children:[v.jsx(wh,{className:"h-3 w-3"})," Auto: ",(W=ne.recommended.split("/").pop())==null?void 0:W.replace(/\.gguf$/i,"")]})]}),v.jsxs("div",{className:"space-y-1.5 max-h-60 overflow-y-auto pr-1",children:[v.jsx("button",{onClick:()=>Ze(""),className:"w-full text-left px-3 py-2 rounded-lg text-xs hover:bg-accent text-red-400 font-semibold cursor-pointer border border-red-500/20 bg-red-500/5 flex items-center justify-between",children:v.jsx("span",{children:"Zuweisung entfernen"})}),Xe.map(be=>{var rt;const Ue=Ce[be.name],ze=be.role===O,Fe=!!(Ue!=null&&Ue.recommended),bt=!!Ue&&!Ue.suitable;return v.jsxs("button",{onClick:()=>Ze(be.name),className:Je("w-full text-left px-3 py-2.5 rounded-lg text-xs hover:bg-accent flex items-center justify-between font-mono cursor-pointer border",Fe?"border-primary/50 bg-primary/10":ze?"text-primary font-bold bg-primary/5 border-primary/30":bt?"border-border/20 bg-background/10 opacity-60":"text-foreground bg-background/20 border-border/30"),children:[v.jsxs("div",{className:"flex flex-col text-left min-w-0",children:[v.jsxs("span",{className:"truncate max-w-[260px] font-semibold flex items-center gap-1.5",children:[(rt=be.name.split("/").pop())==null?void 0:rt.replace(/\.gguf$/i,""),Fe&&v.jsx("span",{className:"text-[8px] font-bold uppercase tracking-wide text-primary bg-primary/15 px-1.5 py-0.5 rounded",children:"Empfohlen"})]}),v.jsx("span",{className:"text-[9px] text-muted-foreground mt-0.5",children:Ue?`${Ue.params_b}B · ${be.quant} · ${Ue.reason}`:`${Io(be.size_bytes)} · ${be.quant}`})]}),ze&&v.jsx(Sa,{className:"h-4 w-4 shrink-0 text-primary"})]},be.name)})]})]})})})(),V&&v.jsx($fe,{model:V,onClose:()=>k(null),onChanged:S}),f]})}const Zfe=[{key:"popular",label:"Beliebt",q:""},{key:"coder",label:"Coder",q:"coder"},{key:"vision",label:"Vision",q:"vision"},{key:"reasoning",label:"Reasoning",q:"reasoning"},{key:"small",label:"Klein (≤4B)",q:"3B"}],Qfe=["fast","heavy","coder","vision","hermes","scout"],Jfe=new Intl.NumberFormat(void 0,{notation:"compact",maximumFractionDigits:1});function D3(t){return Jfe.format(t)}function ehe(){const{data:t}=Bg(),e=(t==null?void 0:t.models)??[],[n,r]=R.useState(""),[i,s]=R.useState([]),[a,o]=R.useState(!1),[l,c]=R.useState(""),[d,f]=R.useState("popular"),[p,y]=R.useState(""),[b,S]=R.useState(null),[w,x]=R.useState([]),[M,T]=R.useState("Q4_K_M"),[P,O]=R.useState(""),[N,D]=R.useState(null),[z,V]=R.useState(!1),[k,j]=R.useState({});async function X(G){o(!0),c("");try{const le=await It(`/api/hf/search?q=${encodeURIComponent(G)}`);s(le.results),le.results.length||c("Keine Ergebnisse.")}catch(le){c(`Suche fehlgeschlagen: ${le}`)}finally{o(!1)}}R.useEffect(()=>{X("")},[]);function ee(G){f(G.key),r(""),X(G.q)}function ie(){f(""),X(n)}async function pe(G,le,se){V(!1);try{const ce=await It(`/api/fit?params_b=0&quant=${encodeURIComponent(le)}&ctx=8192&name=${encodeURIComponent(G)}&role=${encodeURIComponent(se)}`);D(ce)}catch{D(null)}}async function ae(G){if(b===G){S(null);return}S(G),x([]),D(null),O(""),V(!1),c("Analysiere Repository…");try{const le=await It(`/api/hf/quants?repo=${encodeURIComponent(G)}`);x(le.quants);const se=le.quants.includes("Q4_K_M")?"Q4_K_M":le.quants[0]||"Q4_K_M";T(se),c(le.quants.length?"":"Keine GGUF-Dateien in diesem Repo gefunden."),le.quants.length&&pe(le.repo,se,"")}catch(le){c(`Fehler: ${le}`)}}function he(){const G=p.trim();G&&(s(le=>le.some(se=>se.repo===G)?le:[{repo:G,downloads:0,likes:0},...le]),y(""),ae(G))}const B=P?e.find(G=>(G.role||"").toLowerCase()===P):void 0;async function J(G){if((N==null?void 0:N.fit.level)==="too_tight"&&!z){V(!0);return}j(le=>({...le,[G]:"Starte…"}));try{await It("/api/models/install",{method:"POST",body:JSON.stringify({repo:G,quant:M,role:P||void 0,jinja:!0})}),j(le=>({...le,[G]:"Download läuft"})),V(!1)}catch{j(se=>({...se,[G]:"Fehler"}))}}const Y=G=>{var se;const le=((se=G.split("/").pop())==null?void 0:se.toLowerCase().replace(/-gguf$/i,""))||"";return le.length>3&&e.some(ce=>ce.name.toLowerCase().includes(le))},H=G=>G==="perfect"?"text-emerald-400 border-emerald-500/40 bg-emerald-500/10":G==="marginal"?"text-amber-400 border-amber-500/40 bg-amber-500/10":"text-red-400 border-red-500/40 bg-red-500/10";return v.jsxs("div",{className:"space-y-5",children:[v.jsxs("div",{className:"flex gap-2",children:[v.jsxs("div",{className:"relative flex-1",children:[v.jsx(pF,{className:"absolute left-3 top-2.5 h-4 w-4 text-muted-foreground"}),v.jsx("input",{value:n,onChange:G=>r(G.target.value),onKeyDown:G=>G.key==="Enter"&&ie(),"aria-label":"HuggingFace durchsuchen",type:"search",spellCheck:!1,placeholder:"HuggingFace durchsuchen (z.B. Qwen Coder, Llama-3.1, gemma)…",className:"w-full h-10 pl-9 pr-3 rounded-xl border border-border/60 bg-background/40 text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground"})]}),v.jsx("button",{onClick:ie,className:"h-10 px-5 rounded-xl bg-primary text-primary-foreground text-xs font-semibold hover:opacity-90 transition-all cursor-pointer",children:"Suchen"})]}),v.jsx("div",{className:"flex items-center gap-2 flex-wrap",children:Zfe.map(G=>v.jsxs("button",{onClick:()=>ee(G),className:Je("flex items-center gap-1.5 rounded-full px-3 py-1.5 text-[11px] font-semibold transition-all cursor-pointer border",d===G.key?"bg-primary/15 text-primary border-primary/30":"border-border/50 text-muted-foreground hover:text-foreground hover:border-border"),children:[G.key==="popular"&&v.jsx(F8,{className:"h-3 w-3"}),G.label]},G.key))}),a?v.jsx("div",{className:"text-xs text-muted-foreground py-10 text-center",children:"Lade GGUF-Modelle von HuggingFace…"}):v.jsxs("div",{className:"space-y-2",children:[i.map(G=>{const le=b===G.repo,se=Y(G.repo),ce=G.repo.includes("/")?G.repo.split("/")[0]:"—",Se=G.repo.split("/").pop();return v.jsxs("div",{className:Je("rounded-xl border bg-card/45 backdrop-blur-md transition-all",le?"border-primary/40 shadow-lg shadow-primary/5":"border-border/50 hover:border-primary/30"),children:[v.jsxs("button",{onClick:()=>ae(G.repo),className:"w-full flex items-center gap-3 p-3.5 text-left cursor-pointer",children:[v.jsxs("div",{className:"min-w-0 flex-1",children:[v.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[v.jsx("span",{className:"text-xs font-bold font-mono text-foreground truncate max-w-[280px]",title:G.repo,children:Se}),se&&v.jsxs("span",{className:"flex items-center gap-1 text-[8px] font-bold text-emerald-400 uppercase tracking-wider bg-emerald-500/10 border border-emerald-500/20 px-1.5 py-0.5 rounded",children:[v.jsx(Sa,{className:"h-2.5 w-2.5"})," installiert"]})]}),v.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-3 mt-0.5 font-mono",children:[v.jsx("span",{children:ce}),v.jsxs("span",{className:"flex items-center gap-1",children:[v.jsx(yg,{className:"h-3 w-3"})," ",D3(G.downloads)]}),G.likes>0&&v.jsxs("span",{className:"flex items-center gap-1",children:[v.jsx(V8,{className:"h-3 w-3"})," ",D3(G.likes)]})]})]}),le?v.jsx(cF,{className:"h-4 w-4 text-muted-foreground shrink-0"}):v.jsx(oF,{className:"h-4 w-4 text-muted-foreground shrink-0"})]}),le&&v.jsx("div",{className:"border-t border-border/30 p-3.5 space-y-3",children:w.length===0?v.jsx("div",{className:"text-[11px] text-muted-foreground font-mono",children:l||"Lade Quants…"}):v.jsxs(v.Fragment,{children:[v.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[v.jsx("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground",children:"Quant"}),v.jsx("select",{value:M,onChange:we=>{T(we.target.value),pe(G.repo,we.target.value,P)},"aria-label":"Quantisierung",className:"h-8 rounded-lg border border-border/60 bg-background/40 px-2 text-xs text-foreground font-semibold outline-none",children:w.map(we=>v.jsx("option",{value:we,className:"bg-popover text-foreground",children:we},we))}),v.jsx("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground ml-1",children:"Rolle"}),v.jsxs("select",{value:P,onChange:we=>{O(we.target.value),pe(G.repo,M,we.target.value)},"aria-label":"Rolle",title:"Optional — bestimmt Auto-Konfiguration + setup-bewussten Kontext",className:"h-8 rounded-lg border border-border/60 bg-background/40 px-2 text-xs text-foreground font-semibold outline-none",children:[v.jsx("option",{value:"",className:"bg-popover text-foreground",children:"keine"}),Qfe.map(we=>v.jsx("option",{value:we,className:"bg-popover text-foreground",children:we},we))]}),v.jsx("button",{onClick:()=>J(G.repo),disabled:!!k[G.repo]&&k[G.repo]==="Download läuft",className:Je("h-8 px-3.5 ml-auto rounded-lg text-xs font-semibold transition-all cursor-pointer flex items-center gap-1.5",z?"bg-red-500 text-white hover:opacity-90":"bg-primary text-primary-foreground hover:opacity-90"),children:k[G.repo]?k[G.repo]:z?v.jsxs(v.Fragment,{children:[v.jsx(bg,{className:"h-3.5 w-3.5"})," OOM — trotzdem laden"]}):v.jsxs(v.Fragment,{children:[v.jsx(yg,{className:"h-3.5 w-3.5"})," Herunterladen"]})})]}),N&&v.jsxs("div",{className:Je("flex flex-wrap items-center gap-x-3 gap-y-1 rounded-lg border px-3 py-2 text-[11px] font-medium",H(N.fit.level)),children:[v.jsx("span",{className:"font-bold uppercase tracking-wide",children:N.fit.text}),v.jsxs("span",{className:"font-mono opacity-90",children:["~",N.params_b,"B · ~",N.fit.req_gb," GB / ",N.sys_ram_gb," GB · ~",N.fit.tps," t/s"]}),N.fit.level!=="too_tight"?v.jsxs("span",{className:"font-mono opacity-80",children:["ctx → ",(N.assigned_ctx/1024).toFixed(0),"k"]}):v.jsx("span",{className:"opacity-90",children:"— passt nicht, würde beim Laden abstürzen (OOM)."})]}),B&&v.jsxs("div",{className:"flex items-start gap-2 rounded-lg border border-amber-500/40 bg-amber-500/10 px-3 py-2 text-[11px] text-amber-400",children:[v.jsx(bg,{className:"h-3.5 w-3.5 mt-0.5 shrink-0"}),v.jsxs("span",{children:["Rolle ",v.jsxs("strong",{children:["„",P,'"']})," hält aktuell ",v.jsx("strong",{children:B.name.split("/").pop()})," — wird beim Download übernommen."]})]})]})})]},G.repo)}),!i.length&&!a&&v.jsx("div",{className:"text-xs text-muted-foreground py-10 text-center",children:l||"Keine Ergebnisse."})]}),v.jsxs("div",{className:"border-t border-border/30 pt-4 flex flex-col sm:flex-row gap-2 items-stretch sm:items-center",children:[v.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground shrink-0",children:"Direkt:"}),v.jsx("input",{value:p,onChange:G=>y(G.target.value),onKeyDown:G=>G.key==="Enter"&&he(),"aria-label":"Repository oder URL direkt eingeben",spellCheck:!1,placeholder:"org/repo oder HF-URL (z.B. unsloth/Qwen2.5-Coder-7B-Instruct-GGUF)",className:"flex-1 h-9 rounded-lg border border-border/60 bg-background/40 px-3 text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground font-mono"}),v.jsx("button",{onClick:he,className:"h-9 px-4 rounded-lg border border-border/60 bg-background/20 text-xs font-semibold hover:border-primary/50 hover:bg-background/40 transition-all cursor-pointer whitespace-nowrap",children:"Laden"})]})]})}const the={fast:{title:"Schnelles Alltags-Hirn",desc:"Schnelle MoE-Antworten für Chat, Zusammenfassungen und alltägliche Aufgaben.",icon:wh},heavy:{title:"Schweres Reasoning",desc:"Große Modelle für komplexe Logik, Mathematik und tiefgründiges Planen.",icon:W1},coder:{title:"Coden & Entwicklung",desc:"Autovervollständigung, Refactoring und Codegenerierung direkt in deiner IDE.",icon:uF},vision:{title:"Bilder & Vision",desc:"Verarbeitet Bilder, Screenshots und visuelle Diagramme in multimodalen Chats.",icon:IT},hermes:{title:"Lucys Hirn (Agent)",desc:"Lucys dauer-warmes Agent-Hirn mit Tool-Calling — bleibt ko-resident, lädt nie kalt nach.",icon:T8},scout:{title:"Multimodal-Allrounder",desc:"Multimodaler Allrounder für schnelle Antworten, Übersetzungen und Alltag.",icon:RT}};function nhe(){const{data:t,isLoading:e,error:n}=R7(),{data:r}=Bg(),{data:i}=CC(),s=(r==null?void 0:r.models)??[],a=n?String(n):"",[o,l]=R.useState({}),[c,d]=R.useState({}),[f,p]=R.useState("recommended");async function y(b,S,w,x){l(M=>({...M,[b]:"Starte..."}));try{await It("/api/models/install",{method:"POST",body:JSON.stringify({repo:b,role:S,quant:w,jinja:x})}),l(M=>({...M,[b]:"Download läuft"}))}catch{l(T=>({...T,[b]:"Fehler"}))}}return v.jsxs("div",{className:"space-y-6",children:[v.jsx("div",{className:"flex rounded-xl border border-border/60 bg-card/45 backdrop-blur-md p-1 w-fit",children:[["recommended","Empfohlen"],["browse","Stöbern & Suchen"]].map(([b,S])=>v.jsx("button",{onClick:()=>p(b),className:Je("rounded-lg px-4 py-1.5 text-xs font-semibold tracking-wide transition-all cursor-pointer",f===b?"bg-primary text-primary-foreground shadow-md shadow-primary/10":"text-muted-foreground hover:text-foreground"),children:S},b))}),f==="browse"?v.jsx(ehe,{}):e?v.jsx("div",{className:"text-xs text-muted-foreground py-12 text-center",children:"Analysiere Hardware und suche passende GGUF-Empfehlungen…"}):a||!t?v.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400",children:["Empfehlungsdienst temporär nicht erreichbar (",a,")."]}):v.jsxs("div",{className:"space-y-8",children:[v.jsxs("div",{className:"text-[10px] font-mono text-muted-foreground bg-background/25 border border-border/40 p-4 rounded-xl flex flex-col sm:flex-row sm:items-center justify-between gap-3 shadow-sm",children:[v.jsxs("div",{children:["Modell-Registry geladen für ",v.jsxs("span",{className:"text-foreground font-bold",children:[t.sys_ram_gb," GB"]})," System-RAM."]}),v.jsxs("div",{className:"flex items-center gap-1.5",children:[v.jsx(u9,{className:"h-3.5 w-3.5 text-primary fill-primary/20"}),v.jsx("span",{children:"Empfehlungen sind automatisch auf deine Box-Hardware optimiert."})]})]}),v.jsx("div",{className:"grid gap-6 md:grid-cols-2",children:t.categories.map(b=>{const S=the[b.role]||{title:b.title||b.role,desc:"Spezifisches Modell für diese Systemrolle.",icon:_C},w=S.icon,x=s.find(D=>D.role===b.role),M=i==null?void 0:i.model_list.find(D=>D.role===b.role),T=b.models.find(D=>D.repo===b.recommended)||b.models[0];if(!T)return null;const P=o[T.repo],O=b.models.filter(D=>D.repo!==b.recommended),N=!!c[b.role];return v.jsxs("div",{className:Je("rounded-2xl border bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 flex flex-col justify-between gap-5 transition-all duration-300 hover:border-primary/40",x?"border-border/60":"border-primary/20 shadow-primary/5"),children:[v.jsxs("div",{className:"space-y-4",children:[v.jsxs("div",{className:"flex items-start justify-between gap-3",children:[v.jsxs("div",{className:"flex items-center gap-3",children:[v.jsx("div",{className:"w-10 h-10 rounded-xl bg-primary/10 border border-primary/20 flex items-center justify-center text-primary shadow-sm shrink-0",children:v.jsx(w,{className:"h-5.5 w-5.5"})}),v.jsxs("div",{children:[v.jsx("h3",{className:"text-sm font-bold tracking-tight text-foreground",children:S.title}),v.jsxs("span",{className:"text-[9px] font-mono text-muted-foreground uppercase bg-background/50 px-1.5 py-0.5 rounded border border-border/30 inline-block mt-0.5",children:["Rolle: ",b.role]})]})]}),x?v.jsxs("span",{className:"flex items-center gap-1.5 text-[9px] font-bold text-emerald-400 uppercase tracking-wider bg-emerald-500/10 border border-emerald-500/20 px-2.5 py-1 rounded-lg",children:[v.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"}),"Aktiviert"]}):v.jsx("span",{className:"text-[9px] font-bold text-primary/70 uppercase tracking-wider bg-primary/10 border border-primary/20 px-2.5 py-1 rounded-lg",children:"Frei"})]}),v.jsx("p",{className:"text-xs text-muted-foreground leading-relaxed",children:S.desc}),v.jsx("div",{className:"p-3.5 rounded-xl bg-background/35 border border-border/30 space-y-2.5",children:x?v.jsxs("div",{className:"space-y-1.5",children:[v.jsx("div",{className:"text-[9px] font-bold uppercase tracking-wider text-muted-foreground/60",children:"Aktive GGUF-Belegung"}),v.jsx("div",{className:"text-xs font-mono font-bold text-foreground truncate",title:x.name,children:x.name.split("/").pop()}),v.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2",children:[v.jsxs("span",{children:["Größe: ",WT(x.size_bytes||0)]}),v.jsx("span",{children:"•"}),v.jsxs("span",{children:["Quant: ",x.quant||"GGUF"]})]})]}):v.jsxs("div",{className:"space-y-1.5",children:[v.jsx("div",{className:"text-[9px] font-bold uppercase tracking-wider text-primary/80",children:"Empfohlenes Modell"}),v.jsx("div",{className:"text-xs font-mono font-bold text-foreground truncate",title:T.name,children:T.name}),v.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2 flex-wrap",children:[v.jsxs("span",{children:["Ersteller: ",T.author]}),v.jsx("span",{children:"•"}),v.jsxs("span",{children:["Quant: ",T.quant]})]}),v.jsx("div",{className:"flex items-center gap-1.5 pt-0.5",children:v.jsx(Hfe,{fit:T.fit})})]})}),v.jsx("div",{className:"pt-1",children:x?M?v.jsxs("div",{className:"space-y-2",children:[v.jsxs("div",{className:"text-[9px] font-semibold text-amber-400 flex items-center gap-1.5",children:[v.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-amber-400 animate-ping shrink-0"}),v.jsxs("span",{children:["Bessere Version in der Registry: ",M.repo.split("/").pop()]})]}),v.jsxs("button",{onClick:()=>y(M.repo,b.role,T.quant||"Q4_K_M",T.caps.tools!=="no"),disabled:!!o[M.repo],className:"h-8 w-full flex items-center justify-center gap-1.5 rounded-lg bg-amber-500 text-black text-xs font-bold hover:bg-amber-400 disabled:opacity-50 transition-all cursor-pointer shadow-md shadow-amber-500/10",children:[v.jsx(yg,{className:"h-3.5 w-3.5"}),o[M.repo]||"Auf neue Version aktualisieren"]})]}):v.jsxs("div",{className:"h-8 flex items-center justify-center gap-1.5 text-[10px] font-bold text-emerald-400 uppercase tracking-wide bg-emerald-500/5 border border-emerald-500/10 rounded-lg select-none",children:[v.jsx(Sa,{className:"h-4 w-4"})," Auf neuestem Stand"]}):v.jsxs("button",{onClick:()=>y(T.repo,b.role,T.quant||"Q4_K_M",T.caps.tools!=="no"),disabled:!!P,className:Je("h-8 w-full flex items-center justify-center gap-1.5 rounded-lg text-xs font-bold transition-all cursor-pointer border",P?"border-primary/40 bg-primary/5 text-primary":"bg-primary text-primary-foreground hover:opacity-90 shadow-md shadow-primary/10"),children:[v.jsx(yg,{className:"h-3.5 w-3.5"}),P||"Optimales Modell einsetzen"]})})]}),O.length>0&&v.jsxs("div",{className:"border-t border-border/20 pt-3",children:[v.jsxs("button",{onClick:()=>d(D=>({...D,[b.role]:!N})),className:"flex items-center gap-1.5 text-[10px] text-muted-foreground/80 hover:text-foreground transition-colors cursor-pointer",children:[N?v.jsx(cF,{className:"h-3 w-3"}):v.jsx(oF,{className:"h-3 w-3"}),v.jsxs("span",{children:["Alternative Empfehlungen anzeigen (",O.length,")"]})]}),N&&v.jsx("div",{className:"mt-2.5 space-y-2 max-h-36 overflow-y-auto pr-1 scrollbar-thin",children:O.map(D=>v.jsxs("div",{className:"p-2 rounded-lg bg-background/25 border border-border/20 flex items-center justify-between gap-3",children:[v.jsxs("div",{className:"min-w-0",children:[v.jsx("div",{className:"text-[10px] font-mono font-bold text-foreground truncate",title:D.name,children:D.name}),v.jsxs("div",{className:"text-[9px] text-muted-foreground flex items-center gap-1.5 mt-0.5",children:[v.jsxs("span",{children:["Quant: ",D.quant]}),v.jsx("span",{children:"•"}),v.jsx("span",{children:D.fit.text})]})]}),v.jsx("button",{onClick:()=>y(D.repo,b.role,D.quant||"Q4_K_M",D.caps.tools!=="no"),disabled:!!o[D.repo],className:"h-6 px-2.5 rounded bg-background/40 hover:bg-background/80 border border-border/40 text-[9px] font-bold text-foreground transition-all cursor-pointer shrink-0 disabled:opacity-50",children:o[D.repo]||"Installieren"})]},D.repo))})]})]},b.role)})})]})]})}function rhe(){const[t,e]=R.useState("cockpit");return v.jsxs("div",{className:"space-y-6",children:[v.jsxs("div",{className:"flex flex-col sm:flex-row justify-between sm:items-center gap-4",children:[v.jsxs("div",{children:[v.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Modell-Manager"}),v.jsx("p",{className:"text-sm text-muted-foreground",children:"Verwalte deine Modelle und passe das Gateway-Routing live über das interaktive Cockpit an."})]}),v.jsx("div",{className:"flex rounded-xl border border-border/60 bg-card/45 backdrop-blur-md p-1 self-start",children:["cockpit","discover"].map(n=>v.jsx("button",{onClick:()=>e(n),className:Je("rounded-lg px-4 py-1.5 text-xs font-semibold tracking-wide uppercase transition-all cursor-pointer",t===n?"bg-primary text-primary-foreground shadow-md shadow-primary/10":"text-muted-foreground hover:text-foreground"),children:n==="cockpit"?"Cockpit":"Modelle finden"},n))})]}),v.jsx(Wfe,{}),v.jsx("div",{className:"transition-all duration-300",children:t==="cockpit"?v.jsx(Yfe,{}):v.jsx(nhe,{})})]})}const ihe={cline:"cline_settings.json",cursor:"Settings → Models",opencode:"opencode.jsonc",zed:"settings.json",continue:"~/.continue/config.json",claude_code:"~/.zshrc / env"};function U3({line:t,loading:e}){return e||!t?v.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] font-semibold text-muted-foreground",children:[v.jsx($1,{className:"h-3 w-3 animate-spin"})," prüfe…"]}):t.ok?v.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] font-semibold text-emerald-400",children:[v.jsx(R8,{className:"h-3 w-3"})," ",t.detail]}):v.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] font-semibold text-red-400",children:[v.jsx(I8,{className:"h-3 w-3"})," ",t.detail]})}function j3({tool:t,fileName:e,accent:n,copied:r,onCopy:i}){return v.jsxs("div",{className:"flex flex-col border border-border/60 bg-black/60 rounded-2xl overflow-hidden shadow-2xl",children:[v.jsxs("div",{className:"flex h-11 items-center justify-between px-4 border-b border-border/40 bg-black/40 shrink-0",children:[v.jsxs("div",{className:"flex items-center gap-1.5",children:[v.jsx("span",{className:"h-3 w-3 rounded-full bg-red-500/80"}),v.jsx("span",{className:"h-3 w-3 rounded-full bg-amber-500/80"}),v.jsx("span",{className:"h-3 w-3 rounded-full bg-emerald-500/80"})]}),v.jsx("div",{className:"flex items-center gap-1.5 text-[10px] font-mono text-muted-foreground/75 bg-background/30 px-3 py-1 rounded-md border border-border/20",children:v.jsx("span",{children:e})}),v.jsxs("button",{onClick:i,className:"flex h-7 px-2.5 items-center gap-1.5 rounded-lg border border-border/40 bg-background/30 text-[10px] font-semibold text-muted-foreground hover:text-foreground hover:bg-background/60 transition-all cursor-pointer",children:[r?v.jsx(Sa,{className:"h-3.5 w-3.5 text-emerald-400"}):v.jsx(NT,{className:"h-3.5 w-3.5"}),v.jsx("span",{children:r?"Kopiert":"Kopieren"})]})]}),v.jsx("pre",{className:Je("p-5 overflow-x-auto text-xs font-mono whitespace-pre leading-relaxed scrollbar-thin select-text bg-black/10",n==="teal"?"text-cyan-200/90":"text-violet-200/90"),children:v.jsx("code",{children:t.snippet})})]})}function she(){const[t,e]=R.useState(localStorage.getItem("mc_host")||"192.168.178.151"),[n,r]=R.useState(localStorage.getItem("mc_mcp_path")||""),[i,s]=R.useState("cline"),[a,o]=R.useState(null),l=new URLSearchParams({host:t});n&&l.set("mcp_path",n);const{data:c,error:d}=I7(l.toString()),{data:f,isLoading:p}=k7(),y=d?String(d):"";function b(M){e(M),M&&localStorage.setItem("mc_host",M)}function S(M){r(M),localStorage.setItem("mc_mcp_path",M)}const w=c==null?void 0:c.tools[i];async function x(M,T){T&&(await navigator.clipboard.writeText(T),o(M),setTimeout(()=>o(null),1500))}return v.jsxs("div",{className:"space-y-6",children:[v.jsxs("div",{children:[v.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Verbindung & Integration"}),v.jsxs("p",{className:"text-sm text-muted-foreground",children:["Binde deinen lokalen Agenten an die Box an — über ",v.jsx("span",{className:"text-foreground",children:"zwei getrennte Leitungen"}),": das Modell (Gateway) und das geteilte Gedächtnis (MCP)."]})]}),v.jsxs("div",{className:"p-5 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md shadow-lg shadow-black/10",children:[v.jsxs("div",{className:"grid gap-4 md:grid-cols-[170px_1fr] items-center",children:[v.jsxs("div",{className:"rounded-2xl border border-border/60 bg-background/40 p-4 text-center",children:[v.jsx(W8,{className:"h-7 w-7 mx-auto text-muted-foreground"}),v.jsx("div",{className:"mt-2 text-sm font-semibold text-foreground",children:"Dein lokaler Agent"}),v.jsx("div",{className:"text-[11px] text-muted-foreground",children:"Cline · Cursor · Zed …"})]}),v.jsxs("div",{className:"flex flex-col gap-2.5",children:[v.jsxs("div",{className:"flex items-center gap-3",children:[v.jsx(tw,{className:"h-4 w-4 text-muted-foreground shrink-0"}),v.jsxs("div",{className:"flex-1 rounded-xl border border-primary/25 bg-primary/5 px-3.5 py-2.5",children:[v.jsxs("div",{className:"flex items-center justify-between gap-2",children:[v.jsxs("div",{className:"flex items-center gap-2 text-xs font-semibold text-primary",children:[v.jsx(Md,{className:"h-3.5 w-3.5"})," Leitung 1 — Modell"]}),v.jsx(U3,{line:f==null?void 0:f.gateway,loading:p})]}),v.jsx("div",{className:"mt-1 text-[11px] font-mono text-primary/80",children:"Gateway · :9001/v1 · Lanes chat / coding"})]})]}),v.jsxs("div",{className:"flex items-center gap-3",children:[v.jsx(tw,{className:"h-4 w-4 text-muted-foreground shrink-0"}),v.jsxs("div",{className:"flex-1 rounded-xl border border-violet-500/25 bg-violet-500/5 px-3.5 py-2.5",children:[v.jsxs("div",{className:"flex items-center justify-between gap-2",children:[v.jsxs("div",{className:"flex items-center gap-2 text-xs font-semibold text-violet-300",children:[v.jsx(W1,{className:"h-3.5 w-3.5"})," Leitung 2 — Gedächtnis"]}),v.jsx(U3,{line:f==null?void 0:f.memory,loading:p})]}),v.jsx("div",{className:"mt-1 text-[11px] font-mono text-violet-300/80",children:"MCP · mcp_memory.py · separat"})]})]})]})]}),v.jsxs("p",{className:"mt-3.5 text-[11px] text-muted-foreground leading-relaxed",children:["Der Gateway liefert ",v.jsx("span",{className:"text-foreground",children:"nur das LLM"}),". Das geteilte Gedächtnis läuft über einen",v.jsx("span",{className:"text-foreground",children:" eigenen MCP-Server"})," — beide werden unabhängig eingerichtet."]})]}),v.jsxs("div",{className:"grid gap-4 md:grid-cols-2 p-5 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md shadow-lg shadow-black/10",children:[v.jsxs("div",{className:"space-y-1.5",children:[v.jsxs("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground flex items-center gap-1.5",children:[v.jsx(H8,{className:"h-3.5 w-3.5 text-primary"})," Box LAN IP-Adresse"]}),v.jsx("input",{value:t,onChange:M=>b(M.target.value),"aria-label":"Box LAN IP-Adresse",spellCheck:!1,placeholder:"z.B. 192.168.178.151",className:"w-full h-9 rounded-lg border border-border/60 bg-background/40 px-3 font-mono text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground"})]}),v.jsxs("div",{className:"space-y-1.5",children:[v.jsxs("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground flex items-center gap-1.5",children:[v.jsx(z8,{className:"h-3.5 w-3.5 text-violet-400"})," Lokaler MCP-Scriptpfad",v.jsx("span",{className:"text-violet-400/70 normal-case font-semibold tracking-normal",children:"(nur Leitung 2)"})]}),v.jsx("input",{value:n,onChange:M=>S(M.target.value),"aria-label":"Lokaler MCP-Scriptpfad",spellCheck:!1,placeholder:"z.B. F:\\Coding Stuff\\mission-control-2\\mcp\\mcp_memory.py",className:"w-full h-9 rounded-lg border border-border/60 bg-background/40 px-3 font-mono text-xs outline-none focus:ring-1 focus:ring-violet-500/50 text-foreground"})]})]}),y&&v.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400",children:["Fehler beim Generieren der Snippets: ",y]}),c&&v.jsxs("div",{className:"grid gap-5 lg:grid-cols-2",children:[v.jsxs("div",{className:"space-y-3 rounded-2xl border border-border/60 border-t-2 border-t-primary/70 bg-card/30 p-4",children:[v.jsxs("div",{children:[v.jsxs("div",{className:"flex items-center gap-2 text-sm font-space font-bold text-foreground",children:[v.jsx("span",{className:"flex h-5 w-5 items-center justify-center rounded-md bg-primary/15 text-primary text-[11px]",children:"1"}),"Modell anbinden"]}),v.jsx("p",{className:"text-[11px] text-muted-foreground mt-0.5",children:"Wähle dein Tool — das Snippet zeigt auf den Gateway."})]}),v.jsx("div",{className:"flex flex-wrap gap-1.5",children:Object.entries(c.tools).map(([M,T])=>v.jsx("button",{onClick:()=>s(M),className:Je("rounded-lg px-3 py-1.5 text-[11px] font-semibold tracking-wide transition-all cursor-pointer",i===M?"bg-primary text-primary-foreground shadow-md shadow-primary/10":"border border-border/50 text-muted-foreground hover:text-foreground"),children:T.label},M))}),w&&v.jsxs(v.Fragment,{children:[w.note&&v.jsxs("div",{className:"flex items-start gap-2.5 p-3 rounded-xl bg-primary/5 border border-primary/20 text-[11px] text-muted-foreground leading-relaxed",children:[v.jsx(oI,{className:"h-4 w-4 text-primary shrink-0 mt-0.5"}),v.jsx("span",{children:w.note})]}),v.jsx(j3,{tool:w,fileName:ihe[i]||"config.json",accent:"teal",copied:a==="model",onCopy:()=>x("model",w.snippet)})]})]}),v.jsxs("div",{className:"space-y-3 rounded-2xl border border-border/60 border-t-2 border-t-violet-500/70 bg-card/30 p-4",children:[v.jsxs("div",{children:[v.jsxs("div",{className:"flex items-center gap-2 text-sm font-space font-bold text-foreground",children:[v.jsx("span",{className:"flex h-5 w-5 items-center justify-center rounded-md bg-violet-500/15 text-violet-300 text-[11px]",children:"2"}),"Gedächtnis anbinden",v.jsx("span",{className:"text-[10px] font-medium text-muted-foreground normal-case",children:"optional"})]}),v.jsxs("p",{className:"text-[11px] text-muted-foreground mt-0.5",children:["Ein MCP-Block — gilt zusätzlich für ",v.jsx("em",{children:"jedes"})," Tool aus Schritt 1."]})]}),v.jsxs("div",{className:"flex items-start gap-2.5 p-3 rounded-xl bg-violet-500/5 border border-violet-500/20 text-[11px] text-muted-foreground leading-relaxed",children:[v.jsx(oI,{className:"h-4 w-4 text-violet-400 shrink-0 mt-0.5"}),v.jsx("span",{children:c.memory.note})]}),v.jsx(j3,{tool:c.memory,fileName:"mcp.json",accent:"violet",copied:a==="memory",onCopy:()=>x("memory",c.memory.snippet)})]})]})]})}const ahe="modulepreload",ohe=function(t){return"/"+t},F3={},lhe=function(e,n,r){let i=Promise.resolve();if(n&&n.length>0){let a=function(c){return Promise.all(c.map(d=>Promise.resolve(d).then(f=>({status:"fulfilled",value:f}),f=>({status:"rejected",reason:f}))))};document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),l=(o==null?void 0:o.nonce)||(o==null?void 0:o.getAttribute("nonce"));i=a(n.map(c=>{if(c=ohe(c),c in F3)return;F3[c]=!0;const d=c.endsWith(".css"),f=d?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${c}"]${f}`))return;const p=document.createElement("link");if(p.rel=d?"stylesheet":ahe,d||(p.as="script"),p.crossOrigin="",p.href=c,l&&p.setAttribute("nonce",l),document.head.appendChild(p),d)return new Promise((y,b)=>{p.addEventListener("load",y),p.addEventListener("error",()=>b(new Error(`Unable to preload CSS for ${c}`)))})}))}function s(a){const o=new Event("vite:preloadError",{cancelable:!0});if(o.payload=a,window.dispatchEvent(o),!o.defaultPrevented)throw a}return i.then(a=>{for(const o of a||[])o.status==="rejected"&&s(o.reason);return e().catch(s)})};class che extends R.Component{constructor(){super(...arguments);Gs(this,"state",{error:null})}static getDerivedStateFromError(n){return{error:n}}render(){return this.state.error?v.jsxs("div",{className:"h-[480px] rounded-2xl border border-red-500/20 bg-red-500/5 p-6 text-xs text-red-400 overflow-auto",children:[v.jsx("div",{className:"font-semibold mb-2",children:"Graph konnte nicht gerendert werden"}),v.jsx("pre",{className:"whitespace-pre-wrap break-words text-[11px] leading-relaxed",children:this.state.error.message})]}):this.props.children}}const uhe=R.lazy(()=>lhe(()=>import("./GraphView-DWD0sYrM.js"),[]).then(t=>({default:t.GraphView}))),Fb=["identity","knowledge","rules","events"],z3=new Set(["auto","agent","hermes"]),qE={identity:{label:"Identität",icon:d9,bg:"bg-cyan-500/10",text:"text-cyan-400"},knowledge:{label:"Wissen",icon:Ym,bg:"bg-indigo-500/10",text:"text-indigo-400"},rules:{label:"Regeln",icon:s9,bg:"bg-violet-500/10",text:"text-violet-400"},events:{label:"Ereignisse",icon:k8,bg:"bg-amber-500/10",text:"text-amber-400"}},B3={label:"Gedächtnis",icon:CT,text:"text-muted-foreground"},dhe={identity:"border-l-cyan-500/80",knowledge:"border-l-indigo-500/80",rules:"border-l-violet-500/80",events:"border-l-amber-500/80"},H3=`Hi Hermes! Lass uns ein kurzes Onboarding machen, damit du dich künftig an mich erinnerst. Stell mir nacheinander ein paar kurze Fragen zu: -1) wer ich bin und woran ich gerade arbeite, -2) wie ich angesprochen werden möchte, -3) meine bevorzugten Tools, Sprachen und Arbeitsweise, -4) wichtige Regeln/Konventionen, die du beachten sollst, -5) meine Infrastruktur (Server, Dienste – ohne Geheimnisse). -Frag immer nur eine Sache auf einmal und fass am Ende zusammen, was du dir gemerkt hast.`;function fhe(){const[t,e]=R.useState(""),[n,r]=R.useState(""),[i,s]=R.useState(""),[a,o]=R.useState("knowledge"),[l,c]=R.useState(!1),[d,f]=R.useState(!1),[p,y]=R.useState("liste"),[b,S]=R.useState(!1),w=Nd(),{showAlert:x,showConfirm:M,dialogElement:T}=tv(),{data:P=[]}=BT({}),{data:O=[],error:N}=BT({q:n,category:t}),{data:D}=w7(p==="graph"),z=N?String(N):"",V=()=>{w.invalidateQueries({queryKey:["memory"]}),w.invalidateQueries({queryKey:["memory-graph"]})},k=R.useMemo(()=>{const H=P.length,G=P.filter(le=>z3.has(le.source)).length;return{total:H,auto:G,manual:H-G,cats:new Set(P.map(le=>le.category)).size}},[P]),j=P.length===0,X=R.useMemo(()=>{const H=D??{nodes:[],edges:[]};if(!n.trim())return H;const G=n.toLowerCase(),le=H.nodes.filter(ce=>ce.content.toLowerCase().includes(G)),se=new Set(le.map(ce=>ce.id));return{nodes:le,edges:H.edges.filter(ce=>se.has(ce.source)&&se.has(ce.target))}},[D,n]),ee=R.useMemo(()=>{const H={};return O.forEach(G=>{var le;(H[le=G.category]??(H[le]=[])).push(G)}),H},[O]),ie=R.useMemo(()=>O.filter(H=>!Fb.includes(H.category)),[O]);async function pe(){i.trim()&&(await It("/api/memory",{method:"POST",body:JSON.stringify({content:i,category:a,source:"ui"})}),s(""),S(!1),V())}function ae(H){M("Eintrag löschen?","Diesen Gedächtnis-Eintrag dauerhaft entfernen?",async()=>{try{await It(`/api/memory/${H}`,{method:"DELETE"}),V()}catch(G){x("Fehler",`Löschen fehlgeschlagen: ${G.message||G}`)}})}async function he(){try{await navigator.clipboard.writeText(H3),f(!0),setTimeout(()=>f(!1),1800)}catch{x("Kopieren fehlgeschlagen","Markiere den Prompt und kopiere ihn manuell (Strg+C).")}}function B(){he(),window.dispatchEvent(new CustomEvent("mc-navigate",{detail:{view:"terminal"}}))}async function J(){c(!0);try{const H=await It("/api/memory/dedupe",{method:"POST",body:JSON.stringify({apply:!1})});if(H.duplicate_count===0){x("Ergebnis","Keine Dubletten gefunden — alles sauber.");return}M("Deduplizierung bestätigen",`${H.duplicate_count} Dublette(n) in ${H.groups.length} Gruppe(n) gefunden. Entfernen?`,async()=>{try{await It("/api/memory/dedupe",{method:"POST",body:JSON.stringify({apply:!0})}),V()}catch(G){x("Fehler",`Fehler beim Löschen: ${G.message}`)}})}catch(H){x("Fehler",`Fehler bei der Deduplizierung: ${H.message}`)}finally{c(!1)}}const Y=({value:H,label:G,accent:le})=>v.jsxs("span",{className:Je("flex items-center gap-1.5 text-[11px] rounded-lg px-2.5 py-1 border",le==="auto"?"text-emerald-400 bg-emerald-500/[0.07] border-emerald-500/20":"text-muted-foreground bg-card/40 border-border/50"),children:[le==="auto"&&v.jsx(Vm,{className:"h-3 w-3"}),v.jsx("b",{className:Je("font-semibold",le==="auto"?"":"text-foreground"),children:H})," ",G]});return v.jsxs("div",{className:"space-y-5",children:[v.jsxs("div",{className:"flex flex-col lg:flex-row lg:items-center justify-between gap-3",children:[v.jsxs("div",{children:[v.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Gedächtnis-Pool"}),v.jsx("p",{className:"text-sm text-muted-foreground",children:"Geteilte Konstitution — Hermes, IDEs & Gateway lesen und lernen hier per MCP."})]}),v.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[v.jsxs("div",{className:"relative",children:[v.jsx("input",{value:n,onChange:H=>r(H.target.value),"aria-label":"Gedächtnis durchsuchen",type:"search",placeholder:"Semantisch suchen…",className:"w-52 h-9 pl-8 pr-3 rounded-lg border border-border/60 bg-card/45 text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground"}),v.jsx(pF,{className:"absolute left-2.5 top-2.5 h-3.5 w-3.5 text-muted-foreground"})]}),v.jsxs("button",{onClick:()=>S(H=>!H),className:"h-9 px-3 rounded-lg bg-primary text-primary-foreground text-xs font-semibold hover:opacity-90 transition-all flex items-center gap-1.5 cursor-pointer shadow-md shadow-primary/10",children:[v.jsx(OT,{className:"h-4 w-4"})," Eintrag"]}),v.jsx("div",{className:"flex items-center gap-1 p-1 bg-card/30 border border-border/40 rounded-lg",children:[["liste",K8,"Liste"],["graph",o9,"Graph"]].map(([H,G,le])=>v.jsxs("button",{onClick:()=>y(H),className:Je("flex h-7 px-2.5 items-center gap-1.5 text-[11px] font-semibold rounded-md transition-all cursor-pointer",p===H?"bg-primary text-primary-foreground":"text-muted-foreground hover:text-foreground"),children:[v.jsx(G,{className:"h-3.5 w-3.5"})," ",le]},H))}),v.jsx("button",{onClick:J,disabled:l,className:"flex h-9 w-9 items-center justify-center rounded-lg border border-border/60 bg-card hover:border-primary/50 transition-all cursor-pointer shadow-md disabled:opacity-50","aria-label":"Duplikate bereinigen",title:"Deduplizieren",children:v.jsx(Vm,{className:"h-4 w-4 text-primary","aria-hidden":"true"})})]})]}),!j&&v.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[v.jsx(Y,{value:k.total,label:"Fakten"}),v.jsx(Y,{value:k.auto,label:"auto gelernt",accent:"auto"}),v.jsx(Y,{value:k.manual,label:"manuell"}),v.jsx(Y,{value:k.cats,label:"Kategorien"}),v.jsxs("span",{className:"ml-auto text-[11px] text-muted-foreground/70 flex items-center gap-1.5",children:[v.jsx(Vm,{className:"h-3 w-3 text-emerald-400"})," lernt automatisch aus Hermes-Gesprächen"]})]}),b&&v.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-4 space-y-3",children:[v.jsxs("div",{className:"flex items-center justify-between",children:[v.jsx("div",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Neuen Eintrag anlegen"}),v.jsx("button",{onClick:()=>S(!1),"aria-label":"Schließen",className:"text-muted-foreground hover:text-foreground",children:v.jsx(Ed,{className:"h-4 w-4","aria-hidden":"true"})})]}),v.jsx("textarea",{value:i,onChange:H=>s(H.target.value),rows:2,"aria-label":"Eintragstext",placeholder:"Eine Regel, Vorliebe oder einen stabilen Fakt über dich oder das Projekt…",className:"w-full resize-none rounded-xl border border-border/60 bg-background/30 p-3 text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground leading-relaxed"}),v.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[v.jsx("select",{value:a,onChange:H=>o(H.target.value),"aria-label":"Kategorie",className:"h-8 rounded-lg border border-border/60 bg-background/50 px-2 text-xs outline-none font-semibold text-foreground cursor-pointer",children:Fb.map(H=>{var G;return v.jsx("option",{value:H,className:"bg-popover text-foreground",children:((G=qE[H])==null?void 0:G.label)||H},H)})}),v.jsxs("button",{onClick:pe,className:"h-9 px-4 rounded-lg bg-primary text-primary-foreground text-xs font-semibold hover:opacity-90 transition-all flex items-center gap-1.5 cursor-pointer",children:[v.jsx(OT,{className:"h-4 w-4"})," Speichern"]})]})]}),z&&v.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400",children:["Fehler: ",z]}),j?v.jsxs("div",{className:"rounded-2xl border border-dashed border-border/60 bg-card/20 p-8 sm:p-10 flex flex-col items-center text-center gap-5",children:[v.jsx("div",{className:"h-14 w-14 rounded-2xl bg-primary/10 flex items-center justify-center",children:v.jsx(Q8,{className:"h-7 w-7 text-primary"})}),v.jsxs("div",{className:"space-y-1.5 max-w-lg",children:[v.jsx("h3",{className:"text-base font-semibold text-foreground",children:"Lass Hermes dich kennenlernen"}),v.jsx("p",{className:"text-xs text-muted-foreground leading-relaxed",children:"Statt Fakten einzutippen: führ ein kurzes Onboarding-Gespräch mit Hermes. Was ihr besprecht, merkt sich das Gedächtnis automatisch — du musst nichts manuell pflegen."})]}),v.jsxs("div",{className:"w-full max-w-lg text-left",children:[v.jsxs("div",{className:"flex items-center justify-between mb-1.5",children:[v.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground/60",children:"Sende das an Hermes"}),v.jsx("button",{onClick:he,className:"flex items-center gap-1 text-[10px] font-semibold text-muted-foreground hover:text-foreground transition-colors",children:d?v.jsxs(v.Fragment,{children:[v.jsx(Sa,{className:"h-3 w-3 text-emerald-400"})," Kopiert"]}):v.jsxs(v.Fragment,{children:[v.jsx(NT,{className:"h-3 w-3"})," Kopieren"]})})]}),v.jsx("pre",{className:"w-full rounded-xl border border-border/60 bg-background/40 p-3.5 text-[11px] leading-relaxed text-foreground/90 whitespace-pre-wrap font-mono",children:H3})]}),v.jsxs("div",{className:"flex flex-wrap items-center justify-center gap-2",children:[v.jsxs("button",{onClick:B,className:"h-9 px-4 rounded-lg bg-primary text-primary-foreground text-xs font-semibold hover:opacity-90 transition-all flex items-center gap-1.5 cursor-pointer",children:[v.jsx(gF,{className:"h-4 w-4"})," Im Terminal starten"]}),v.jsxs("button",{onClick:he,className:"h-9 px-4 rounded-lg border border-border/60 bg-card text-xs font-semibold hover:border-primary/50 transition-all flex items-center gap-1.5 cursor-pointer",children:[d?v.jsx(Sa,{className:"h-4 w-4 text-emerald-400"}):v.jsx(NT,{className:"h-4 w-4"})," Prompt kopieren"]})]}),v.jsxs("p",{className:"text-[11px] text-muted-foreground/70 flex items-center gap-1.5",children:[v.jsx(a9,{className:"h-3 w-3"})," Funktioniert genauso über Telegram —"," ",v.jsx("button",{onClick:()=>S(!0),className:"underline hover:text-foreground",children:"oder lieber manuell anlegen"}),"."]})]}):p==="graph"?v.jsx(che,{children:v.jsx(R.Suspense,{fallback:v.jsx("div",{className:"h-[480px] rounded-2xl border border-border/60 bg-card/30 flex items-center justify-center text-xs text-muted-foreground",children:"Graph wird geladen…"}),children:v.jsx(uhe,{data:X,onDelete:ae})})}):v.jsxs(v.Fragment,{children:[v.jsxs("div",{className:"flex flex-wrap items-center gap-1.5 p-1 bg-card/30 border border-border/40 rounded-xl w-fit",children:[v.jsx("button",{onClick:()=>e(""),className:Je("h-7 px-3 rounded-lg text-[10px] font-semibold uppercase tracking-wider transition-all cursor-pointer",t?"text-muted-foreground hover:text-foreground":"bg-primary text-primary-foreground"),children:"Alle"}),Fb.map(H=>{const G=qE[H]||B3,le=G.icon;return v.jsxs("button",{onClick:()=>e(H),className:Je("h-7 px-2.5 rounded-lg text-[10px] font-semibold uppercase tracking-wider transition-all cursor-pointer flex items-center gap-1",t===H?"bg-primary text-primary-foreground":"text-muted-foreground hover:text-foreground"),children:[v.jsx(le,{className:"h-3 w-3"})," ",G.label]},H)})]}),O.length===0?v.jsx("div",{className:"text-xs text-muted-foreground border border-dashed border-border/60 rounded-2xl p-12 text-center",children:"Keine Einträge für die aktuellen Filterkriterien gefunden."}):v.jsx("div",{className:"space-y-5",children:[...Fb,"__other"].map(H=>{const G=H==="__other"?ie:ee[H]||[];if(!G.length)return null;const le=qE[H]||B3,se=le.icon;return v.jsxs("div",{children:[v.jsxs("div",{className:"flex items-center gap-2 mb-2 px-1",children:[v.jsx(se,{className:Je("h-3.5 w-3.5",le.text)}),v.jsx("span",{className:Je("text-[11px] font-bold uppercase tracking-wider",le.text),children:le.label}),v.jsx("span",{className:"text-[10px] font-mono text-muted-foreground/60 bg-card/50 rounded px-1.5 py-0.5",children:G.length}),v.jsx("div",{className:"ml-1 h-px flex-1 bg-border/30"})]}),v.jsx("div",{className:"space-y-2",children:G.map(ce=>{const Se=z3.has(ce.source);return v.jsxs("div",{className:Je("flex items-start justify-between gap-4 p-3.5 rounded-xl border border-l-4 bg-card/45 backdrop-blur-md border-border/60 hover:border-primary/20 transition-all group",dhe[ce.category]||"border-l-muted"),children:[v.jsx("span",{className:"text-xs text-foreground leading-relaxed break-words whitespace-pre-wrap flex-1 min-w-0",children:ce.content}),v.jsxs("div",{className:"flex items-center gap-2 shrink-0",children:[typeof ce.score=="number"&&v.jsxs("span",{className:"text-[9px] font-mono text-primary bg-primary/10 px-1.5 py-0.5 rounded",title:"Relevanz der semantischen Suche",children:[Math.round(ce.score*100),"%"]}),v.jsxs("span",{className:Je("flex items-center gap-1 text-[9px] font-mono px-1.5 py-0.5 rounded",Se?"text-emerald-400 bg-emerald-500/10":"text-muted-foreground/60 bg-background/20"),title:Se?"Automatisch gelernt":"Manuell angelegt",children:[Se&&v.jsx(Vm,{className:"h-2.5 w-2.5"}),ce.source]}),v.jsx("button",{onClick:()=>ae(ce.id),"aria-label":"Eintrag löschen",title:"Eintrag löschen",className:"h-7 w-7 rounded-lg flex items-center justify-center border border-border/40 text-muted-foreground hover:text-red-400 hover:bg-red-500/5 transition-all opacity-0 group-hover:opacity-100",children:v.jsx(LT,{className:"h-3.5 w-3.5","aria-hidden":"true"})})]})]},ce.id)})})]},H)})})]}),T]})}const hhe=["chat","coding","fast","heavy"];function phe(){const{data:t,error:e}=PC(5e3),{data:n}=Bg(),{showAlert:r,dialogElement:i}=tv(),s=Nd(),a=e?String(e):"",[o,l]=R.useState(!1),c=(n==null?void 0:n.models)??[];async function d(p){try{await It("/api/agent/brain",{method:"POST",body:JSON.stringify({model:p})}),r("Erledigt",`Hermes-Hirn zeigt jetzt auf das Alias '${p}'. Der Gateway-Dienst wurde neu gestartet.`),s.invalidateQueries({queryKey:qn.agentStatus}),l(!1)}catch(y){r("Fehler",`Wechsel fehlgeschlagen: ${y.message||y}`)}}async function f(p){try{await It("/api/agent/brain/set",{method:"POST",body:JSON.stringify({model_id:p})}),r("Erledigt","Agent-Hirn gewechselt (warm gehalten). Gateway wurde neugestartet."),s.invalidateQueries({queryKey:qn.agentStatus}),s.invalidateQueries({queryKey:qn.models}),l(!1)}catch(y){r("Fehler",`Wechsel fehlgeschlagen: ${y.message||y}`)}}return v.jsxs("div",{className:"space-y-6",children:[v.jsxs("div",{className:"flex flex-col sm:flex-row justify-between sm:items-center gap-4",children:[v.jsxs("div",{children:[v.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Hermes Agenten-Cockpit"}),v.jsxs("p",{className:"text-sm text-muted-foreground",children:["Hermes ist ein autonomer Agent, der im Hintergrund der Box läuft (Port ",v.jsx("code",{children:":8642"}),") und seine eigene UI besitzt."]})]}),(t==null?void 0:t.terminal_url)&&v.jsxs("a",{href:Ng(t.terminal_url),target:"_blank",rel:"noopener",className:Je("flex h-9 px-4 items-center gap-1.5 text-xs font-semibold rounded-lg transition-all cursor-pointer shadow-md shrink-0 self-start",t.terminal_reachable?"bg-primary text-primary-foreground hover:opacity-90 shadow-primary/10":"border border-border/60 text-muted-foreground bg-background/20"),children:[v.jsx(xg,{className:"h-4 w-4"}),v.jsx("span",{children:"Terminal öffnen"})]})]}),a&&v.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400 font-mono",children:["Status nicht lesbar (",a,")."]}),t&&v.jsxs("div",{className:"space-y-6",children:[v.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10",children:[v.jsxs("div",{className:"mb-4 flex items-center gap-2",children:[v.jsx($c,{className:"h-4.5 w-4.5 text-primary"}),v.jsx("span",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"Agent-Fluss"})]}),v.jsxs("div",{className:"flex flex-col lg:flex-row lg:items-stretch gap-3",children:[v.jsxs("button",{onClick:()=>t.terminal_reachable&&window.open(Ng(t.terminal_url),"_blank"),title:t.terminal_reachable?"Hermes-Terminal öffnen":"Terminal offline",className:"lg:w-40 shrink-0 rounded-xl border border-border/60 bg-background/30 p-3 text-left hover:border-primary/40 transition-all cursor-pointer flex flex-col justify-center",children:[v.jsxs("div",{className:"flex items-center gap-1.5",children:[v.jsx(bC,{className:Je("h-3.5 w-3.5",t.terminal_reachable?"text-emerald-400":"text-amber-500")}),v.jsx("span",{className:"text-xs font-semibold text-foreground",children:"Terminal"}),v.jsx("span",{className:Je("ml-auto h-1.5 w-1.5 rounded-full animate-pulse",t.terminal_reachable?"bg-emerald-500":"bg-amber-500")})]}),v.jsx("span",{className:"text-[10px] text-muted-foreground font-mono mt-0.5",children:"hermes chat · Clients"})]}),v.jsx("div",{className:"hidden lg:flex items-center text-muted-foreground text-lg select-none",children:"→"}),v.jsxs("div",{className:"flex-1 flex flex-col gap-2.5",children:[v.jsxs("div",{className:"rounded-xl border border-primary/40 bg-primary/5 px-3.5 py-2.5 flex items-center gap-2",children:[v.jsx($c,{className:"h-3.5 w-3.5 text-primary"}),v.jsx("span",{className:"text-xs font-semibold text-primary",children:"Agent Gateway"}),v.jsx("span",{className:"text-[11px] font-mono text-muted-foreground",children:":8642"}),v.jsxs("span",{className:Je("ml-auto inline-flex items-center gap-1.5 text-[10px] font-bold uppercase font-mono px-2 py-0.5 rounded-full border",t.gateway_reachable?"bg-emerald-500/10 text-emerald-400 border-emerald-500/20":"bg-red-500/10 text-red-400 border-red-500/20"),children:[v.jsx("span",{className:Je("h-1.5 w-1.5 rounded-full",t.gateway_reachable?"bg-emerald-500 animate-pulse":"bg-red-500")}),t.gateway_reachable?"online":"offline"]})]}),v.jsxs("div",{className:"grid gap-2.5 sm:grid-cols-3",children:[v.jsxs("button",{onClick:()=>l(!0),className:"rounded-xl border border-border/60 bg-background/30 p-3 text-left hover:border-primary/45 transition-all cursor-pointer",children:[v.jsxs("div",{className:"flex items-center gap-1.5 text-muted-foreground",children:[v.jsx(Md,{className:"h-3.5 w-3.5 text-primary"}),v.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider",children:"Hirn"}),v.jsx("span",{className:"ml-auto text-[9px] text-primary/70 font-bold uppercase",children:"wechseln →"})]}),v.jsx("div",{className:"text-[11px] font-mono font-medium text-foreground truncate mt-1",title:t.brain_model,children:t.brain_model||"chat"})]}),v.jsxs("div",{className:"rounded-xl border border-border/60 bg-background/30 p-3",children:[v.jsxs("div",{className:"flex items-center gap-1.5 text-muted-foreground",children:[v.jsx(wC,{className:"h-3.5 w-3.5 text-primary"}),v.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider",children:"Verdrahtung"})]}),v.jsxs("div",{className:"text-[10px] font-mono mt-1 flex flex-wrap gap-x-2 text-muted-foreground",children:[v.jsxs("span",{children:["Config: ",t.has_config?"✓":"—"]}),v.jsxs("span",{children:["Skills: ",t.has_skills?"✓":"—"]}),v.jsxs("span",{children:["Memory: ",t.has_memories?"✓":"—"]})]})]}),v.jsxs("div",{className:"rounded-xl border border-border/60 bg-background/30 p-3",children:[v.jsxs("div",{className:"flex items-center gap-1.5 text-muted-foreground",children:[v.jsx(lI,{className:"h-3.5 w-3.5 text-primary"}),v.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider",children:"PC"}),v.jsx("span",{className:Je("ml-auto h-1.5 w-1.5 rounded-full",t.pc_executor_reachable?"bg-emerald-500 animate-pulse":"bg-amber-500")})]}),v.jsxs("div",{className:Je("text-[11px] font-mono mt-1",t.pc_executor_reachable?"text-emerald-400":"text-muted-foreground"),children:[":7777 ",t.pc_executor_reachable?"verbunden":"offline"]})]})]})]})]})]}),v.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 space-y-4 shadow-lg shadow-black/10",children:[v.jsxs("div",{className:"flex items-center justify-between",children:[v.jsxs("div",{className:"flex items-center gap-2",children:[v.jsx(lI,{className:"h-5 w-5 text-primary"}),v.jsx("h3",{className:"text-sm font-bold uppercase tracking-wider text-foreground",children:"PC Verbindung"})]}),v.jsxs("div",{className:"flex items-center gap-2",children:[v.jsx("span",{className:Je("h-2 w-2 rounded-full",t.pc_executor_reachable?"bg-emerald-500 animate-pulse":"bg-amber-500")}),v.jsx("span",{className:"text-xs font-semibold text-foreground",children:t.pc_executor_reachable?"Erreichbar":"Nicht verbunden"})]})]}),v.jsxs("div",{className:"grid gap-6 md:grid-cols-2 text-xs text-muted-foreground leading-relaxed text-left",children:[v.jsxs("div",{className:"space-y-3",children:[v.jsxs("p",{children:["Der ",v.jsx("strong",{className:"text-foreground",children:"Hermes PC Executor"})," läuft auf ",v.jsx("code",{className:"text-foreground font-mono px-1 py-0.5 rounded bg-muted/40 border border-border/30",children:"192.168.178.98:7777"})," und ermöglicht Hermes den direkten Zugriff auf deinen Windows-PC — Shell-Befehle, Screenshots, Tastatureingaben."]}),v.jsxs("p",{children:["Hermes erreicht den PC über den MCP-Server ",v.jsx("code",{className:"text-foreground font-mono px-1 py-0.5 rounded bg-muted/40 border border-border/30",children:"hermes-pc-control"}),", der automatisch beim Gateway-Start verbunden wird."]})]}),v.jsx("div",{className:"space-y-3",children:t.pc_executor_reachable?v.jsxs("div",{className:"p-3.5 bg-emerald-500/5 border border-emerald-500/20 rounded-xl space-y-1",children:[v.jsxs("div",{className:"text-emerald-400 font-semibold text-xs flex items-center gap-1.5",children:[v.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"}),"PC Executor verbunden"]}),v.jsxs("p",{className:"text-[10px]",children:["Hermes kann jetzt per Telegram oder Terminal Befehle auf TobisNicerPC ausführen. Nutze ",v.jsx("code",{className:"text-foreground",children:"pc_shell"}),", ",v.jsx("code",{className:"text-foreground",children:"pc_screenshot"})," oder ",v.jsx("code",{className:"text-foreground",children:"pc_open"}),"."]})]}):v.jsxs("div",{className:"space-y-2",children:[v.jsx("h4",{className:"text-xs font-bold text-foreground",children:"PC Executor starten"}),v.jsxs("p",{children:["Starte ",v.jsx("code",{className:"text-foreground font-mono",children:"start.bat"})," im Ordner ",v.jsx("code",{className:"text-foreground font-mono",children:"client\\hermes-pc\\"})," auf dem Windows-PC und lasse das Fenster offen."]}),v.jsx("div",{className:"p-3 bg-background/25 rounded-xl border border-border/30 font-mono text-[9px] text-cyan-300",children:"client\\hermes-pc\\start.bat"})]})})]})]}),!t.gateway_reachable&&v.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 space-y-4 shadow-lg shadow-black/10 text-left",children:[v.jsxs("div",{className:"flex items-center gap-2",children:[v.jsx(Ym,{className:"h-5 w-5 text-amber-500"}),v.jsx("h3",{className:"text-sm font-bold uppercase tracking-wider text-foreground",children:"Hermes-Agent Diagnostics"})]}),v.jsxs("div",{className:"text-xs text-muted-foreground space-y-3 leading-relaxed",children:[v.jsx("p",{children:"Der Hermes-Dienst ist auf der Box derzeit offline oder kann sich nicht mit dem lokalen llama-swap verbinden."}),v.jsxs("p",{children:["Stelle sicher, dass die systemd-Dienste auf der Box laufen. Du kannst den Status im ",v.jsx("strong",{children:"OS & Updates Drawer"})," prüfen und die Dienste bei Bedarf neu starten."]}),v.jsxs("div",{className:"p-3.5 bg-background/25 rounded-xl border border-border/30 font-mono text-[10px] space-y-1",children:[v.jsx("div",{className:"text-muted-foreground/60",children:"# Dienste manuell auf der Box prüfen:"}),v.jsx("div",{className:"text-primary",children:"systemctl --user status hermes-gateway"}),v.jsx("div",{className:"text-primary",children:"systemctl --user status hermes-terminal"})]}),v.jsxs("p",{children:["Weitere Einrichtungsdetails (Brain-Konfiguration, MCP-Kopplungen, SSH-Tunneling und Such-Engines) findest du in der Dokumentationsdatei:",v.jsx("code",{className:"ml-1 px-1.5 py-0.5 rounded bg-muted/40 text-foreground border border-border/30",children:"docs/HERMES_SETUP.md"}),"."]})]})]})]}),t&&o&&v.jsx("div",{className:"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm flex items-center justify-center p-4 overscroll-contain",role:"dialog","aria-modal":"true","aria-label":"Hermes-Hirn konfigurieren",children:v.jsxs("div",{className:"w-full max-w-md rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[v.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[v.jsxs("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary flex items-center gap-1.5",children:[v.jsx(Md,{className:"h-4 w-4"}),v.jsx("span",{children:"Hermes-Hirn konfigurieren"})]}),v.jsx("button",{onClick:()=>l(!1),className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:v.jsx(Ed,{className:"h-4 w-4"})})]}),v.jsxs("div",{className:"space-y-1.5",children:[v.jsx("div",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground",children:"Lane / Gateway-Alias"}),v.jsx("div",{className:"flex flex-wrap gap-1.5",children:hhe.map(p=>{const y=t.brain_model===p;return v.jsxs("button",{onClick:()=>d(p),className:Je("px-3 py-1.5 rounded-lg text-xs font-mono font-semibold border transition-all cursor-pointer flex items-center gap-1.5",y?"border-primary/40 bg-primary/10 text-primary":"border-border/30 bg-background/20 text-foreground hover:bg-accent"),children:[p,y&&v.jsx(Sa,{className:"h-3.5 w-3.5"})]},p)})}),v.jsxs("p",{className:"text-[10px] text-muted-foreground/70",children:["Schlank & flexibel: das Hirn folgt dem Lane-Routing (z.B. ",v.jsx("code",{className:"text-primary",children:"chat"})," = fast↔heavy)."]})]}),v.jsxs("div",{className:"space-y-1.5",children:[v.jsx("div",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground",children:"Installiertes Modell (warm gehalten)"}),v.jsx("div",{className:"space-y-1.5 max-h-56 overflow-y-auto pr-1",children:c.map(p=>{var b;const y=p.role==="hermes";return v.jsxs("button",{onClick:()=>!y&&f(p.name),disabled:y||p.incomplete,className:Je("w-full text-left px-3 py-2.5 rounded-lg text-xs flex items-center justify-between font-mono border transition-all",y?"border-indigo-500/40 bg-indigo-500/10 text-indigo-300":p.incomplete?"border-border/20 bg-background/10 text-muted-foreground/50 cursor-not-allowed":"border-border/30 bg-background/20 text-foreground hover:bg-accent cursor-pointer"),children:[v.jsxs("div",{className:"flex flex-col min-w-0",children:[v.jsx("span",{className:"font-semibold truncate max-w-[280px]",children:(b=p.name.split("/").pop())==null?void 0:b.replace(/\.gguf$/i,"")}),v.jsxs("span",{className:"text-[9px] text-muted-foreground mt-0.5",children:[p.capabilities.params_b?`${p.capabilities.params_b}B`:"?"," · ",p.capabilities.tools!=="no"?"Tools ✓":"ohne Tools",p.role&&` · Rolle: ${p.role}`]})]}),y?v.jsxs("span",{className:"text-[9px] font-bold uppercase text-indigo-300 shrink-0 flex items-center gap-1",children:[v.jsx(Sa,{className:"h-3.5 w-3.5"})," Aktiv"]}):v.jsx("span",{className:"text-[9px] font-bold uppercase text-primary/70 shrink-0",children:"Warm setzen →"})]},p.name)})})]}),v.jsxs("div",{className:"text-[10px] text-amber-400/80 flex items-start gap-1.5 border-t border-border/20 pt-2.5",children:[v.jsx("span",{children:"💡"}),v.jsxs("span",{children:["Für einen ",v.jsx("strong",{children:"Agenten"}),' sind Hermes-Modelle (natives Tool-Calling) meist die robustere Wahl. Neues Modell? Erst über „Modell-Manager → Modelle finden" laden.']})]})]})}),i]})}function mhe(){const{data:t}=PC(5e3),e=t!=null&&t.terminal_url?Ng(t.terminal_url):void 0,n=t==null?void 0:t.terminal_reachable;return v.jsxs("div",{className:"flex h-full flex-col gap-4",children:[v.jsxs("div",{className:"flex flex-wrap items-end justify-between gap-3",children:[v.jsxs("div",{children:[v.jsx("h1",{className:"bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text font-space text-2xl font-bold tracking-tight text-transparent",children:"Hermes Terminal"}),v.jsxs("p",{className:"flex items-center gap-2 text-sm text-muted-foreground",children:["Interaktiver Agent (",v.jsx("code",{className:"rounded bg-background/40 px-1 font-mono text-[11px] text-primary",children:"hermes chat"}),') mit Tools & PC-Steuerung — „mehr als Chatten".']})]}),v.jsxs("div",{className:"flex items-center gap-3",children:[v.jsxs("span",{className:"flex items-center gap-1.5 text-[11px] font-medium text-muted-foreground",children:[v.jsx("span",{className:`h-2 w-2 rounded-full ${n?"bg-emerald-500 animate-pulse":"bg-amber-500"}`}),n?"online":"offline"]}),e&&v.jsxs("a",{href:e,target:"_blank",rel:"noopener",className:"flex h-8 items-center gap-1.5 rounded-lg border border-border/60 bg-background/20 px-3 text-xs font-semibold text-muted-foreground transition-all hover:border-primary/50 hover:text-foreground",children:[v.jsx(xg,{className:"h-3.5 w-3.5"})," In neuem Tab"]})]})]}),e?v.jsxs("div",{className:"relative min-h-[68vh] flex-1 overflow-hidden rounded-2xl border border-border/60 bg-black/50 shadow-lg shadow-black/25",children:[n===!1&&v.jsxs("div",{className:"absolute inset-0 z-10 flex flex-col items-center justify-center gap-3 bg-black/70 text-center",children:[v.jsx(bg,{className:"h-8 w-8 text-amber-400"}),v.jsx("div",{className:"text-sm font-semibold text-amber-300",children:"Terminal nicht erreichbar"}),v.jsxs("p",{className:"max-w-sm text-[11px] leading-normal text-muted-foreground",children:["Der ",v.jsx("code",{className:"font-mono text-primary",children:"hermes-terminal"}),"-Dienst (ttyd) läuft nicht. Auf der Box: ",v.jsx("code",{className:"font-mono",children:"systemctl --user restart hermes-terminal"}),"."]})]}),v.jsx("iframe",{src:e,title:"Hermes Terminal",className:"h-full w-full border-0",style:{minHeight:"68vh"}})]}):v.jsxs("div",{className:"flex min-h-[68vh] flex-1 items-center justify-center rounded-2xl border border-border/60 bg-background/20 text-xs text-muted-foreground",children:[v.jsx(mF,{className:"mr-2 h-4 w-4"})," Lade Terminal…"]})]})}/** - * @license - * Copyright 2010-2024 Three.js Authors - * SPDX-License-Identifier: MIT - */const Pd="169",Kf={LEFT:0,MIDDLE:1,RIGHT:2,ROTATE:0,DOLLY:1,PAN:2},Yf={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3},xV=0,BP=1,bV=2,ghe=3,_V=0,BS=1,Y0=2,Oo=3,Ll=0,as=1,ya=2,Vc=0,Ah=1,HP=2,VP=3,GP=4,wV=5,cd=100,SV=101,MV=102,EV=103,AV=104,TV=200,PV=201,CV=202,RV=203,Jw=204,e1=205,NV=206,IV=207,kV=208,OV=209,LV=210,DV=211,UV=212,jV=213,FV=214,t1=0,n1=1,r1=2,zh=3,i1=4,s1=5,a1=6,o1=7,cx=0,zV=1,BV=2,Tl=0,HV=1,VV=2,GV=3,uR=4,WV=5,$V=6,XV=7,WP="attached",qV="detached",HS=300,Zc=301,Cd=302,Ay=303,Ty=304,nv=306,Rd=1e3,ba=1001,Ig=1002,ri=1003,VS=1004,vhe=1004,oh=1005,yhe=1005,Cr=1006,ng=1007,xhe=1007,$a=1008,bhe=1008,Ho=1009,dR=1010,fR=1011,kg=1012,GS=1013,Qc=1014,Qs=1015,rv=1016,WS=1017,$S=1018,Bh=1020,hR=35902,pR=1021,mR=1022,ss=1023,gR=1024,vR=1025,Th=1026,Hh=1027,XS=1028,ux=1029,yR=1030,qS=1031,_he=1032,KS=1033,Z0=33776,Q0=33777,J0=33778,ey=33779,l1=35840,c1=35841,u1=35842,d1=35843,f1=36196,h1=37492,p1=37496,m1=37808,g1=37809,v1=37810,y1=37811,x1=37812,b1=37813,_1=37814,w1=37815,S1=37816,M1=37817,E1=37818,A1=37819,T1=37820,P1=37821,ty=36492,C1=36494,R1=36495,xR=36283,N1=36284,I1=36285,k1=36286,KV=2200,YV=2201,ZV=2202,Og=2300,Lg=2301,X_=2302,lh=2400,ch=2401,Py=2402,YS=2500,bR=2501,QV=0,_R=1,O1=2,JV=3200,e6=3201,whe=3202,She=3203,au=0,t6=1,Oc="",Fi="srgb",xi="srgb-linear",ZS="display-p3",dx="display-p3-linear",Cy="linear",er="srgb",Ry="rec709",Ny="p3",Mhe=0,Zf=7680,Ehe=7681,Ahe=7682,The=7683,Phe=34055,Che=34056,Rhe=5386,Nhe=512,Ihe=513,khe=514,Ohe=515,Lhe=516,Dhe=517,Uhe=518,$P=519,n6=512,r6=513,i6=514,wR=515,s6=516,a6=517,o6=518,l6=519,Iy=35044,c6=35048,jhe=35040,Fhe=35045,zhe=35049,Bhe=35041,Hhe=35046,Vhe=35050,Ghe=35042,Whe="100",XP="300 es",Ml=2e3,ky=2001;let zl=class{addEventListener(e,n){this._listeners===void 0&&(this._listeners={});const r=this._listeners;r[e]===void 0&&(r[e]=[]),r[e].indexOf(n)===-1&&r[e].push(n)}hasEventListener(e,n){if(this._listeners===void 0)return!1;const r=this._listeners;return r[e]!==void 0&&r[e].indexOf(n)!==-1}removeEventListener(e,n){if(this._listeners===void 0)return;const i=this._listeners[e];if(i!==void 0){const s=i.indexOf(n);s!==-1&&i.splice(s,1)}}dispatchEvent(e){if(this._listeners===void 0)return;const r=this._listeners[e.type];if(r!==void 0){e.target=this;const i=r.slice(0);for(let s=0,a=i.length;s>8&255]+Ji[t>>16&255]+Ji[t>>24&255]+"-"+Ji[e&255]+Ji[e>>8&255]+"-"+Ji[e>>16&15|64]+Ji[e>>24&255]+"-"+Ji[n&63|128]+Ji[n>>8&255]+"-"+Ji[n>>16&255]+Ji[n>>24&255]+Ji[r&255]+Ji[r>>8&255]+Ji[r>>16&255]+Ji[r>>24&255]).toLowerCase()}function Tr(t,e,n){return Math.max(e,Math.min(n,t))}function SR(t,e){return(t%e+e)%e}function $he(t,e,n,r,i){return r+(t-e)*(i-r)/(n-e)}function Xhe(t,e,n){return t!==e?(n-t)/(e-t):0}function ny(t,e,n){return(1-n)*t+n*e}function qhe(t,e,n,r){return ny(t,e,1-Math.exp(-n*r))}function Khe(t,e=1){return e-Math.abs(SR(t,e*2)-e)}function Yhe(t,e,n){return t<=e?0:t>=n?1:(t=(t-e)/(n-e),t*t*(3-2*t))}function Zhe(t,e,n){return t<=e?0:t>=n?1:(t=(t-e)/(n-e),t*t*t*(t*(t*6-15)+10))}function Qhe(t,e){return t+Math.floor(Math.random()*(e-t+1))}function Jhe(t,e){return t+Math.random()*(e-t)}function epe(t){return t*(.5-Math.random())}function tpe(t){t!==void 0&&(V3=t);let e=V3+=1831565813;return e=Math.imul(e^e>>>15,e|1),e^=e+Math.imul(e^e>>>7,e|61),((e^e>>>14)>>>0)/4294967296}function npe(t){return t*Ph}function rpe(t){return t*Dg}function ipe(t){return(t&t-1)===0&&t!==0}function spe(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))}function ape(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))}function ope(t,e,n,r,i){const s=Math.cos,a=Math.sin,o=s(n/2),l=a(n/2),c=s((e+r)/2),d=a((e+r)/2),f=s((e-r)/2),p=a((e-r)/2),y=s((r-e)/2),b=a((r-e)/2);switch(i){case"XYX":t.set(o*d,l*f,l*p,o*c);break;case"YZY":t.set(l*p,o*d,l*f,o*c);break;case"ZXZ":t.set(l*f,l*p,o*d,o*c);break;case"XZX":t.set(o*d,l*b,l*y,o*c);break;case"YXY":t.set(l*y,o*d,l*b,o*c);break;case"ZYZ":t.set(l*b,l*y,o*d,o*c);break;default:console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+i)}}function Ss(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return t/4294967295;case Uint16Array:return t/65535;case Uint8Array:return t/255;case Int32Array:return Math.max(t/2147483647,-1);case Int16Array:return Math.max(t/32767,-1);case Int8Array:return Math.max(t/127,-1);default:throw new Error("Invalid component type.")}}function cn(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return Math.round(t*4294967295);case Uint16Array:return Math.round(t*65535);case Uint8Array:return Math.round(t*255);case Int32Array:return Math.round(t*2147483647);case Int16Array:return Math.round(t*32767);case Int8Array:return Math.round(t*127);default:throw new Error("Invalid component type.")}}const vr={DEG2RAD:Ph,RAD2DEG:Dg,generateUUID:wa,clamp:Tr,euclideanModulo:SR,mapLinear:$he,inverseLerp:Xhe,lerp:ny,damp:qhe,pingpong:Khe,smoothstep:Yhe,smootherstep:Zhe,randInt:Qhe,randFloat:Jhe,randFloatSpread:epe,seededRandom:tpe,degToRad:npe,radToDeg:rpe,isPowerOfTwo:ipe,ceilPowerOfTwo:spe,floorPowerOfTwo:ape,setQuaternionFromProperEuler:ope,normalize:cn,denormalize:Ss};class He{constructor(e=0,n=0){He.prototype.isVector2=!0,this.x=e,this.y=n}get width(){return this.x}set width(e){this.x=e}get height(){return this.y}set height(e){this.y=e}set(e,n){return this.x=e,this.y=n,this}setScalar(e){return this.x=e,this.y=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setComponent(e,n){switch(e){case 0:this.x=n;break;case 1:this.y=n;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y)}copy(e){return this.x=e.x,this.y=e.y,this}add(e){return this.x+=e.x,this.y+=e.y,this}addScalar(e){return this.x+=e,this.y+=e,this}addVectors(e,n){return this.x=e.x+n.x,this.y=e.y+n.y,this}addScaledVector(e,n){return this.x+=e.x*n,this.y+=e.y*n,this}sub(e){return this.x-=e.x,this.y-=e.y,this}subScalar(e){return this.x-=e,this.y-=e,this}subVectors(e,n){return this.x=e.x-n.x,this.y=e.y-n.y,this}multiply(e){return this.x*=e.x,this.y*=e.y,this}multiplyScalar(e){return this.x*=e,this.y*=e,this}divide(e){return this.x/=e.x,this.y/=e.y,this}divideScalar(e){return this.multiplyScalar(1/e)}applyMatrix3(e){const n=this.x,r=this.y,i=e.elements;return this.x=i[0]*n+i[3]*r+i[6],this.y=i[1]*n+i[4]*r+i[7],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this}clamp(e,n){return this.x=Math.max(e.x,Math.min(n.x,this.x)),this.y=Math.max(e.y,Math.min(n.y,this.y)),this}clampScalar(e,n){return this.x=Math.max(e,Math.min(n,this.x)),this.y=Math.max(e,Math.min(n,this.y)),this}clampLength(e,n){const r=this.length();return this.divideScalar(r||1).multiplyScalar(Math.max(e,Math.min(n,r)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(e){const n=Math.sqrt(this.lengthSq()*e.lengthSq());if(n===0)return Math.PI/2;const r=this.dot(e)/n;return Math.acos(Tr(r,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const n=this.x-e.x,r=this.y-e.y;return n*n+r*r}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,n){return this.x+=(e.x-this.x)*n,this.y+=(e.y-this.y)*n,this}lerpVectors(e,n,r){return this.x=e.x+(n.x-e.x)*r,this.y=e.y+(n.y-e.y)*r,this}equals(e){return e.x===this.x&&e.y===this.y}fromArray(e,n=0){return this.x=e[n],this.y=e[n+1],this}toArray(e=[],n=0){return e[n]=this.x,e[n+1]=this.y,e}fromBufferAttribute(e,n){return this.x=e.getX(n),this.y=e.getY(n),this}rotateAround(e,n){const r=Math.cos(n),i=Math.sin(n),s=this.x-e.x,a=this.y-e.y;return this.x=s*r-a*i+e.x,this.y=s*i+a*r+e.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}class $t{constructor(e,n,r,i,s,a,o,l,c){$t.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],e!==void 0&&this.set(e,n,r,i,s,a,o,l,c)}set(e,n,r,i,s,a,o,l,c){const d=this.elements;return d[0]=e,d[1]=i,d[2]=o,d[3]=n,d[4]=s,d[5]=l,d[6]=r,d[7]=a,d[8]=c,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const n=this.elements,r=e.elements;return n[0]=r[0],n[1]=r[1],n[2]=r[2],n[3]=r[3],n[4]=r[4],n[5]=r[5],n[6]=r[6],n[7]=r[7],n[8]=r[8],this}extractBasis(e,n,r){return e.setFromMatrix3Column(this,0),n.setFromMatrix3Column(this,1),r.setFromMatrix3Column(this,2),this}setFromMatrix4(e){const n=e.elements;return this.set(n[0],n[4],n[8],n[1],n[5],n[9],n[2],n[6],n[10]),this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,n){const r=e.elements,i=n.elements,s=this.elements,a=r[0],o=r[3],l=r[6],c=r[1],d=r[4],f=r[7],p=r[2],y=r[5],b=r[8],S=i[0],w=i[3],x=i[6],M=i[1],T=i[4],P=i[7],O=i[2],N=i[5],D=i[8];return s[0]=a*S+o*M+l*O,s[3]=a*w+o*T+l*N,s[6]=a*x+o*P+l*D,s[1]=c*S+d*M+f*O,s[4]=c*w+d*T+f*N,s[7]=c*x+d*P+f*D,s[2]=p*S+y*M+b*O,s[5]=p*w+y*T+b*N,s[8]=p*x+y*P+b*D,this}multiplyScalar(e){const n=this.elements;return n[0]*=e,n[3]*=e,n[6]*=e,n[1]*=e,n[4]*=e,n[7]*=e,n[2]*=e,n[5]*=e,n[8]*=e,this}determinant(){const e=this.elements,n=e[0],r=e[1],i=e[2],s=e[3],a=e[4],o=e[5],l=e[6],c=e[7],d=e[8];return n*a*d-n*o*c-r*s*d+r*o*l+i*s*c-i*a*l}invert(){const e=this.elements,n=e[0],r=e[1],i=e[2],s=e[3],a=e[4],o=e[5],l=e[6],c=e[7],d=e[8],f=d*a-o*c,p=o*l-d*s,y=c*s-a*l,b=n*f+r*p+i*y;if(b===0)return this.set(0,0,0,0,0,0,0,0,0);const S=1/b;return e[0]=f*S,e[1]=(i*c-d*r)*S,e[2]=(o*r-i*a)*S,e[3]=p*S,e[4]=(d*n-i*l)*S,e[5]=(i*s-o*n)*S,e[6]=y*S,e[7]=(r*l-c*n)*S,e[8]=(a*n-r*s)*S,this}transpose(){let e;const n=this.elements;return e=n[1],n[1]=n[3],n[3]=e,e=n[2],n[2]=n[6],n[6]=e,e=n[5],n[5]=n[7],n[7]=e,this}getNormalMatrix(e){return this.setFromMatrix4(e).invert().transpose()}transposeIntoArray(e){const n=this.elements;return e[0]=n[0],e[1]=n[3],e[2]=n[6],e[3]=n[1],e[4]=n[4],e[5]=n[7],e[6]=n[2],e[7]=n[5],e[8]=n[8],this}setUvTransform(e,n,r,i,s,a,o){const l=Math.cos(s),c=Math.sin(s);return this.set(r*l,r*c,-r*(l*a+c*o)+a+e,-i*c,i*l,-i*(-c*a+l*o)+o+n,0,0,1),this}scale(e,n){return this.premultiply(KE.makeScale(e,n)),this}rotate(e){return this.premultiply(KE.makeRotation(-e)),this}translate(e,n){return this.premultiply(KE.makeTranslation(e,n)),this}makeTranslation(e,n){return e.isVector2?this.set(1,0,e.x,0,1,e.y,0,0,1):this.set(1,0,e,0,1,n,0,0,1),this}makeRotation(e){const n=Math.cos(e),r=Math.sin(e);return this.set(n,-r,0,r,n,0,0,0,1),this}makeScale(e,n){return this.set(e,0,0,0,n,0,0,0,1),this}equals(e){const n=this.elements,r=e.elements;for(let i=0;i<9;i++)if(n[i]!==r[i])return!1;return!0}fromArray(e,n=0){for(let r=0;r<9;r++)this.elements[r]=e[r+n];return this}toArray(e=[],n=0){const r=this.elements;return e[n]=r[0],e[n+1]=r[1],e[n+2]=r[2],e[n+3]=r[3],e[n+4]=r[4],e[n+5]=r[5],e[n+6]=r[6],e[n+7]=r[7],e[n+8]=r[8],e}clone(){return new this.constructor().fromArray(this.elements)}}const KE=new $t;function u6(t){for(let e=t.length-1;e>=0;--e)if(t[e]>=65535)return!0;return!1}const lpe={Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array};function $m(t,e){return new lpe[t](e)}function Oy(t){return document.createElementNS("http://www.w3.org/1999/xhtml",t)}function d6(){const t=Oy("canvas");return t.style.display="block",t}const G3={};function q_(t){t in G3||(G3[t]=!0,console.warn(t))}function cpe(t,e,n){return new Promise(function(r,i){function s(){switch(t.clientWaitSync(e,t.SYNC_FLUSH_COMMANDS_BIT,0)){case t.WAIT_FAILED:i();break;case t.TIMEOUT_EXPIRED:setTimeout(s,n);break;default:r()}}setTimeout(s,n)})}function upe(t){const e=t.elements;e[2]=.5*e[2]+.5*e[3],e[6]=.5*e[6]+.5*e[7],e[10]=.5*e[10]+.5*e[11],e[14]=.5*e[14]+.5*e[15]}function dpe(t){const e=t.elements;e[11]===-1?(e[10]=-e[10]-1,e[14]=-e[14]):(e[10]=-e[10],e[14]=-e[14]+1)}const W3=new $t().set(.8224621,.177538,0,.0331941,.9668058,0,.0170827,.0723974,.9105199),$3=new $t().set(1.2249401,-.2249404,0,-.0420569,1.0420571,0,-.0196376,-.0786361,1.0982735),v0={[xi]:{transfer:Cy,primaries:Ry,luminanceCoefficients:[.2126,.7152,.0722],toReference:t=>t,fromReference:t=>t},[Fi]:{transfer:er,primaries:Ry,luminanceCoefficients:[.2126,.7152,.0722],toReference:t=>t.convertSRGBToLinear(),fromReference:t=>t.convertLinearToSRGB()},[dx]:{transfer:Cy,primaries:Ny,luminanceCoefficients:[.2289,.6917,.0793],toReference:t=>t.applyMatrix3($3),fromReference:t=>t.applyMatrix3(W3)},[ZS]:{transfer:er,primaries:Ny,luminanceCoefficients:[.2289,.6917,.0793],toReference:t=>t.convertSRGBToLinear().applyMatrix3($3),fromReference:t=>t.applyMatrix3(W3).convertLinearToSRGB()}},fpe=new Set([xi,dx]),Nn={enabled:!0,_workingColorSpace:xi,get workingColorSpace(){return this._workingColorSpace},set workingColorSpace(t){if(!fpe.has(t))throw new Error(`Unsupported working color space, "${t}".`);this._workingColorSpace=t},convert:function(t,e,n){if(this.enabled===!1||e===n||!e||!n)return t;const r=v0[e].toReference,i=v0[n].fromReference;return i(r(t))},fromWorkingColorSpace:function(t,e){return this.convert(t,this._workingColorSpace,e)},toWorkingColorSpace:function(t,e){return this.convert(t,e,this._workingColorSpace)},getPrimaries:function(t){return v0[t].primaries},getTransfer:function(t){return t===Oc?Cy:v0[t].transfer},getLuminanceCoefficients:function(t,e=this._workingColorSpace){return t.fromArray(v0[e].luminanceCoefficients)}};function rg(t){return t<.04045?t*.0773993808:Math.pow(t*.9478672986+.0521327014,2.4)}function YE(t){return t<.0031308?t*12.92:1.055*Math.pow(t,.41666)-.055}let hm;class f6{static getDataURL(e){if(/^data:/i.test(e.src)||typeof HTMLCanvasElement>"u")return e.src;let n;if(e instanceof HTMLCanvasElement)n=e;else{hm===void 0&&(hm=Oy("canvas")),hm.width=e.width,hm.height=e.height;const r=hm.getContext("2d");e instanceof ImageData?r.putImageData(e,0,0):r.drawImage(e,0,0,e.width,e.height),n=hm}return n.width>2048||n.height>2048?(console.warn("THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons",e),n.toDataURL("image/jpeg",.6)):n.toDataURL("image/png")}static sRGBToLinear(e){if(typeof HTMLImageElement<"u"&&e instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&e instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&e instanceof ImageBitmap){const n=Oy("canvas");n.width=e.width,n.height=e.height;const r=n.getContext("2d");r.drawImage(e,0,0,e.width,e.height);const i=r.getImageData(0,0,e.width,e.height),s=i.data;for(let a=0;a0&&(r.userData=this.userData),n||(e.textures[this.uuid]=r),r}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(e){if(this.mapping!==HS)return e;if(e.applyMatrix3(this.matrix),e.x<0||e.x>1)switch(this.wrapS){case Rd:e.x=e.x-Math.floor(e.x);break;case ba:e.x=e.x<0?0:1;break;case Ig:Math.abs(Math.floor(e.x)%2)===1?e.x=Math.ceil(e.x)-e.x:e.x=e.x-Math.floor(e.x);break}if(e.y<0||e.y>1)switch(this.wrapT){case Rd:e.y=e.y-Math.floor(e.y);break;case ba:e.y=e.y<0?0:1;break;case Ig:Math.abs(Math.floor(e.y)%2)===1?e.y=Math.ceil(e.y)-e.y:e.y=e.y-Math.floor(e.y);break}return this.flipY&&(e.y=1-e.y),e}set needsUpdate(e){e===!0&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(e){e===!0&&this.pmremVersion++}}fr.DEFAULT_IMAGE=null;fr.DEFAULT_MAPPING=HS;fr.DEFAULT_ANISOTROPY=1;class On{constructor(e=0,n=0,r=0,i=1){On.prototype.isVector4=!0,this.x=e,this.y=n,this.z=r,this.w=i}get width(){return this.z}set width(e){this.z=e}get height(){return this.w}set height(e){this.w=e}set(e,n,r,i){return this.x=e,this.y=n,this.z=r,this.w=i,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this.w=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setW(e){return this.w=e,this}setComponent(e,n){switch(e){case 0:this.x=n;break;case 1:this.y=n;break;case 2:this.z=n;break;case 3:this.w=n;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this.w=e.w!==void 0?e.w:1,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this.w+=e.w,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this.w+=e,this}addVectors(e,n){return this.x=e.x+n.x,this.y=e.y+n.y,this.z=e.z+n.z,this.w=e.w+n.w,this}addScaledVector(e,n){return this.x+=e.x*n,this.y+=e.y*n,this.z+=e.z*n,this.w+=e.w*n,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this.w-=e.w,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this.w-=e,this}subVectors(e,n){return this.x=e.x-n.x,this.y=e.y-n.y,this.z=e.z-n.z,this.w=e.w-n.w,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this.w*=e.w,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this.w*=e,this}applyMatrix4(e){const n=this.x,r=this.y,i=this.z,s=this.w,a=e.elements;return this.x=a[0]*n+a[4]*r+a[8]*i+a[12]*s,this.y=a[1]*n+a[5]*r+a[9]*i+a[13]*s,this.z=a[2]*n+a[6]*r+a[10]*i+a[14]*s,this.w=a[3]*n+a[7]*r+a[11]*i+a[15]*s,this}divideScalar(e){return this.multiplyScalar(1/e)}setAxisAngleFromQuaternion(e){this.w=2*Math.acos(e.w);const n=Math.sqrt(1-e.w*e.w);return n<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=e.x/n,this.y=e.y/n,this.z=e.z/n),this}setAxisAngleFromRotationMatrix(e){let n,r,i,s;const l=e.elements,c=l[0],d=l[4],f=l[8],p=l[1],y=l[5],b=l[9],S=l[2],w=l[6],x=l[10];if(Math.abs(d-p)<.01&&Math.abs(f-S)<.01&&Math.abs(b-w)<.01){if(Math.abs(d+p)<.1&&Math.abs(f+S)<.1&&Math.abs(b+w)<.1&&Math.abs(c+y+x-3)<.1)return this.set(1,0,0,0),this;n=Math.PI;const T=(c+1)/2,P=(y+1)/2,O=(x+1)/2,N=(d+p)/4,D=(f+S)/4,z=(b+w)/4;return T>P&&T>O?T<.01?(r=0,i=.707106781,s=.707106781):(r=Math.sqrt(T),i=N/r,s=D/r):P>O?P<.01?(r=.707106781,i=0,s=.707106781):(i=Math.sqrt(P),r=N/i,s=z/i):O<.01?(r=.707106781,i=.707106781,s=0):(s=Math.sqrt(O),r=D/s,i=z/s),this.set(r,i,s,n),this}let M=Math.sqrt((w-b)*(w-b)+(f-S)*(f-S)+(p-d)*(p-d));return Math.abs(M)<.001&&(M=1),this.x=(w-b)/M,this.y=(f-S)/M,this.z=(p-d)/M,this.w=Math.acos((c+y+x-1)/2),this}setFromMatrixPosition(e){const n=e.elements;return this.x=n[12],this.y=n[13],this.z=n[14],this.w=n[15],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this.w=Math.min(this.w,e.w),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this.w=Math.max(this.w,e.w),this}clamp(e,n){return this.x=Math.max(e.x,Math.min(n.x,this.x)),this.y=Math.max(e.y,Math.min(n.y,this.y)),this.z=Math.max(e.z,Math.min(n.z,this.z)),this.w=Math.max(e.w,Math.min(n.w,this.w)),this}clampScalar(e,n){return this.x=Math.max(e,Math.min(n,this.x)),this.y=Math.max(e,Math.min(n,this.y)),this.z=Math.max(e,Math.min(n,this.z)),this.w=Math.max(e,Math.min(n,this.w)),this}clampLength(e,n){const r=this.length();return this.divideScalar(r||1).multiplyScalar(Math.max(e,Math.min(n,r)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this.w=Math.trunc(this.w),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z+this.w*e.w}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,n){return this.x+=(e.x-this.x)*n,this.y+=(e.y-this.y)*n,this.z+=(e.z-this.z)*n,this.w+=(e.w-this.w)*n,this}lerpVectors(e,n,r){return this.x=e.x+(n.x-e.x)*r,this.y=e.y+(n.y-e.y)*r,this.z=e.z+(n.z-e.z)*r,this.w=e.w+(n.w-e.w)*r,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z&&e.w===this.w}fromArray(e,n=0){return this.x=e[n],this.y=e[n+1],this.z=e[n+2],this.w=e[n+3],this}toArray(e=[],n=0){return e[n]=this.x,e[n+1]=this.y,e[n+2]=this.z,e[n+3]=this.w,e}fromBufferAttribute(e,n){return this.x=e.getX(n),this.y=e.getY(n),this.z=e.getZ(n),this.w=e.getW(n),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this.w=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}}class h6 extends zl{constructor(e=1,n=1,r={}){super(),this.isRenderTarget=!0,this.width=e,this.height=n,this.depth=1,this.scissor=new On(0,0,e,n),this.scissorTest=!1,this.viewport=new On(0,0,e,n);const i={width:e,height:n,depth:1};r=Object.assign({generateMipmaps:!1,internalFormat:null,minFilter:Cr,depthBuffer:!0,stencilBuffer:!1,resolveDepthBuffer:!0,resolveStencilBuffer:!0,depthTexture:null,samples:0,count:1},r);const s=new fr(i,r.mapping,r.wrapS,r.wrapT,r.magFilter,r.minFilter,r.format,r.type,r.anisotropy,r.colorSpace);s.flipY=!1,s.generateMipmaps=r.generateMipmaps,s.internalFormat=r.internalFormat,this.textures=[];const a=r.count;for(let o=0;o=0?1:-1,T=1-x*x;if(T>Number.EPSILON){const O=Math.sqrt(T),N=Math.atan2(O,x*M);w=Math.sin(w*N)/O,o=Math.sin(o*N)/O}const P=o*M;if(l=l*w+p*P,c=c*w+y*P,d=d*w+b*P,f=f*w+S*P,w===1-o){const O=1/Math.sqrt(l*l+c*c+d*d+f*f);l*=O,c*=O,d*=O,f*=O}}e[n]=l,e[n+1]=c,e[n+2]=d,e[n+3]=f}static multiplyQuaternionsFlat(e,n,r,i,s,a){const o=r[i],l=r[i+1],c=r[i+2],d=r[i+3],f=s[a],p=s[a+1],y=s[a+2],b=s[a+3];return e[n]=o*b+d*f+l*y-c*p,e[n+1]=l*b+d*p+c*f-o*y,e[n+2]=c*b+d*y+o*p-l*f,e[n+3]=d*b-o*f-l*p-c*y,e}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get w(){return this._w}set w(e){this._w=e,this._onChangeCallback()}set(e,n,r,i){return this._x=e,this._y=n,this._z=r,this._w=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(e){return this._x=e.x,this._y=e.y,this._z=e.z,this._w=e.w,this._onChangeCallback(),this}setFromEuler(e,n=!0){const r=e._x,i=e._y,s=e._z,a=e._order,o=Math.cos,l=Math.sin,c=o(r/2),d=o(i/2),f=o(s/2),p=l(r/2),y=l(i/2),b=l(s/2);switch(a){case"XYZ":this._x=p*d*f+c*y*b,this._y=c*y*f-p*d*b,this._z=c*d*b+p*y*f,this._w=c*d*f-p*y*b;break;case"YXZ":this._x=p*d*f+c*y*b,this._y=c*y*f-p*d*b,this._z=c*d*b-p*y*f,this._w=c*d*f+p*y*b;break;case"ZXY":this._x=p*d*f-c*y*b,this._y=c*y*f+p*d*b,this._z=c*d*b+p*y*f,this._w=c*d*f-p*y*b;break;case"ZYX":this._x=p*d*f-c*y*b,this._y=c*y*f+p*d*b,this._z=c*d*b-p*y*f,this._w=c*d*f+p*y*b;break;case"YZX":this._x=p*d*f+c*y*b,this._y=c*y*f+p*d*b,this._z=c*d*b-p*y*f,this._w=c*d*f-p*y*b;break;case"XZY":this._x=p*d*f-c*y*b,this._y=c*y*f-p*d*b,this._z=c*d*b+p*y*f,this._w=c*d*f+p*y*b;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+a)}return n===!0&&this._onChangeCallback(),this}setFromAxisAngle(e,n){const r=n/2,i=Math.sin(r);return this._x=e.x*i,this._y=e.y*i,this._z=e.z*i,this._w=Math.cos(r),this._onChangeCallback(),this}setFromRotationMatrix(e){const n=e.elements,r=n[0],i=n[4],s=n[8],a=n[1],o=n[5],l=n[9],c=n[2],d=n[6],f=n[10],p=r+o+f;if(p>0){const y=.5/Math.sqrt(p+1);this._w=.25/y,this._x=(d-l)*y,this._y=(s-c)*y,this._z=(a-i)*y}else if(r>o&&r>f){const y=2*Math.sqrt(1+r-o-f);this._w=(d-l)/y,this._x=.25*y,this._y=(i+a)/y,this._z=(s+c)/y}else if(o>f){const y=2*Math.sqrt(1+o-r-f);this._w=(s-c)/y,this._x=(i+a)/y,this._y=.25*y,this._z=(l+d)/y}else{const y=2*Math.sqrt(1+f-r-o);this._w=(a-i)/y,this._x=(s+c)/y,this._y=(l+d)/y,this._z=.25*y}return this._onChangeCallback(),this}setFromUnitVectors(e,n){let r=e.dot(n)+1;return rMath.abs(e.z)?(this._x=-e.y,this._y=e.x,this._z=0,this._w=r):(this._x=0,this._y=-e.z,this._z=e.y,this._w=r)):(this._x=e.y*n.z-e.z*n.y,this._y=e.z*n.x-e.x*n.z,this._z=e.x*n.y-e.y*n.x,this._w=r),this.normalize()}angleTo(e){return 2*Math.acos(Math.abs(Tr(this.dot(e),-1,1)))}rotateTowards(e,n){const r=this.angleTo(e);if(r===0)return this;const i=Math.min(1,n/r);return this.slerp(e,i),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(e){return this._x*e._x+this._y*e._y+this._z*e._z+this._w*e._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let e=this.length();return e===0?(this._x=0,this._y=0,this._z=0,this._w=1):(e=1/e,this._x=this._x*e,this._y=this._y*e,this._z=this._z*e,this._w=this._w*e),this._onChangeCallback(),this}multiply(e){return this.multiplyQuaternions(this,e)}premultiply(e){return this.multiplyQuaternions(e,this)}multiplyQuaternions(e,n){const r=e._x,i=e._y,s=e._z,a=e._w,o=n._x,l=n._y,c=n._z,d=n._w;return this._x=r*d+a*o+i*c-s*l,this._y=i*d+a*l+s*o-r*c,this._z=s*d+a*c+r*l-i*o,this._w=a*d-r*o-i*l-s*c,this._onChangeCallback(),this}slerp(e,n){if(n===0)return this;if(n===1)return this.copy(e);const r=this._x,i=this._y,s=this._z,a=this._w;let o=a*e._w+r*e._x+i*e._y+s*e._z;if(o<0?(this._w=-e._w,this._x=-e._x,this._y=-e._y,this._z=-e._z,o=-o):this.copy(e),o>=1)return this._w=a,this._x=r,this._y=i,this._z=s,this;const l=1-o*o;if(l<=Number.EPSILON){const y=1-n;return this._w=y*a+n*this._w,this._x=y*r+n*this._x,this._y=y*i+n*this._y,this._z=y*s+n*this._z,this.normalize(),this}const c=Math.sqrt(l),d=Math.atan2(c,o),f=Math.sin((1-n)*d)/c,p=Math.sin(n*d)/c;return this._w=a*f+this._w*p,this._x=r*f+this._x*p,this._y=i*f+this._y*p,this._z=s*f+this._z*p,this._onChangeCallback(),this}slerpQuaternions(e,n,r){return this.copy(e).slerp(n,r)}random(){const e=2*Math.PI*Math.random(),n=2*Math.PI*Math.random(),r=Math.random(),i=Math.sqrt(1-r),s=Math.sqrt(r);return this.set(i*Math.sin(e),i*Math.cos(e),s*Math.sin(n),s*Math.cos(n))}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._w===this._w}fromArray(e,n=0){return this._x=e[n],this._y=e[n+1],this._z=e[n+2],this._w=e[n+3],this._onChangeCallback(),this}toArray(e=[],n=0){return e[n]=this._x,e[n+1]=this._y,e[n+2]=this._z,e[n+3]=this._w,e}fromBufferAttribute(e,n){return this._x=e.getX(n),this._y=e.getY(n),this._z=e.getZ(n),this._w=e.getW(n),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class q{constructor(e=0,n=0,r=0){q.prototype.isVector3=!0,this.x=e,this.y=n,this.z=r}set(e,n,r){return r===void 0&&(r=this.z),this.x=e,this.y=n,this.z=r,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setComponent(e,n){switch(e){case 0:this.x=n;break;case 1:this.y=n;break;case 2:this.z=n;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this}addVectors(e,n){return this.x=e.x+n.x,this.y=e.y+n.y,this.z=e.z+n.z,this}addScaledVector(e,n){return this.x+=e.x*n,this.y+=e.y*n,this.z+=e.z*n,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this}subVectors(e,n){return this.x=e.x-n.x,this.y=e.y-n.y,this.z=e.z-n.z,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this}multiplyVectors(e,n){return this.x=e.x*n.x,this.y=e.y*n.y,this.z=e.z*n.z,this}applyEuler(e){return this.applyQuaternion(X3.setFromEuler(e))}applyAxisAngle(e,n){return this.applyQuaternion(X3.setFromAxisAngle(e,n))}applyMatrix3(e){const n=this.x,r=this.y,i=this.z,s=e.elements;return this.x=s[0]*n+s[3]*r+s[6]*i,this.y=s[1]*n+s[4]*r+s[7]*i,this.z=s[2]*n+s[5]*r+s[8]*i,this}applyNormalMatrix(e){return this.applyMatrix3(e).normalize()}applyMatrix4(e){const n=this.x,r=this.y,i=this.z,s=e.elements,a=1/(s[3]*n+s[7]*r+s[11]*i+s[15]);return this.x=(s[0]*n+s[4]*r+s[8]*i+s[12])*a,this.y=(s[1]*n+s[5]*r+s[9]*i+s[13])*a,this.z=(s[2]*n+s[6]*r+s[10]*i+s[14])*a,this}applyQuaternion(e){const n=this.x,r=this.y,i=this.z,s=e.x,a=e.y,o=e.z,l=e.w,c=2*(a*i-o*r),d=2*(o*n-s*i),f=2*(s*r-a*n);return this.x=n+l*c+a*f-o*d,this.y=r+l*d+o*c-s*f,this.z=i+l*f+s*d-a*c,this}project(e){return this.applyMatrix4(e.matrixWorldInverse).applyMatrix4(e.projectionMatrix)}unproject(e){return this.applyMatrix4(e.projectionMatrixInverse).applyMatrix4(e.matrixWorld)}transformDirection(e){const n=this.x,r=this.y,i=this.z,s=e.elements;return this.x=s[0]*n+s[4]*r+s[8]*i,this.y=s[1]*n+s[5]*r+s[9]*i,this.z=s[2]*n+s[6]*r+s[10]*i,this.normalize()}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this}divideScalar(e){return this.multiplyScalar(1/e)}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this}clamp(e,n){return this.x=Math.max(e.x,Math.min(n.x,this.x)),this.y=Math.max(e.y,Math.min(n.y,this.y)),this.z=Math.max(e.z,Math.min(n.z,this.z)),this}clampScalar(e,n){return this.x=Math.max(e,Math.min(n,this.x)),this.y=Math.max(e,Math.min(n,this.y)),this.z=Math.max(e,Math.min(n,this.z)),this}clampLength(e,n){const r=this.length();return this.divideScalar(r||1).multiplyScalar(Math.max(e,Math.min(n,r)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,n){return this.x+=(e.x-this.x)*n,this.y+=(e.y-this.y)*n,this.z+=(e.z-this.z)*n,this}lerpVectors(e,n,r){return this.x=e.x+(n.x-e.x)*r,this.y=e.y+(n.y-e.y)*r,this.z=e.z+(n.z-e.z)*r,this}cross(e){return this.crossVectors(this,e)}crossVectors(e,n){const r=e.x,i=e.y,s=e.z,a=n.x,o=n.y,l=n.z;return this.x=i*l-s*o,this.y=s*a-r*l,this.z=r*o-i*a,this}projectOnVector(e){const n=e.lengthSq();if(n===0)return this.set(0,0,0);const r=e.dot(this)/n;return this.copy(e).multiplyScalar(r)}projectOnPlane(e){return QE.copy(this).projectOnVector(e),this.sub(QE)}reflect(e){return this.sub(QE.copy(e).multiplyScalar(2*this.dot(e)))}angleTo(e){const n=Math.sqrt(this.lengthSq()*e.lengthSq());if(n===0)return Math.PI/2;const r=this.dot(e)/n;return Math.acos(Tr(r,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const n=this.x-e.x,r=this.y-e.y,i=this.z-e.z;return n*n+r*r+i*i}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)+Math.abs(this.z-e.z)}setFromSpherical(e){return this.setFromSphericalCoords(e.radius,e.phi,e.theta)}setFromSphericalCoords(e,n,r){const i=Math.sin(n)*e;return this.x=i*Math.sin(r),this.y=Math.cos(n)*e,this.z=i*Math.cos(r),this}setFromCylindrical(e){return this.setFromCylindricalCoords(e.radius,e.theta,e.y)}setFromCylindricalCoords(e,n,r){return this.x=e*Math.sin(n),this.y=r,this.z=e*Math.cos(n),this}setFromMatrixPosition(e){const n=e.elements;return this.x=n[12],this.y=n[13],this.z=n[14],this}setFromMatrixScale(e){const n=this.setFromMatrixColumn(e,0).length(),r=this.setFromMatrixColumn(e,1).length(),i=this.setFromMatrixColumn(e,2).length();return this.x=n,this.y=r,this.z=i,this}setFromMatrixColumn(e,n){return this.fromArray(e.elements,n*4)}setFromMatrix3Column(e,n){return this.fromArray(e.elements,n*3)}setFromEuler(e){return this.x=e._x,this.y=e._y,this.z=e._z,this}setFromColor(e){return this.x=e.r,this.y=e.g,this.z=e.b,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z}fromArray(e,n=0){return this.x=e[n],this.y=e[n+1],this.z=e[n+2],this}toArray(e=[],n=0){return e[n]=this.x,e[n+1]=this.y,e[n+2]=this.z,e}fromBufferAttribute(e,n){return this.x=e.getX(n),this.y=e.getY(n),this.z=e.getZ(n),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const e=Math.random()*Math.PI*2,n=Math.random()*2-1,r=Math.sqrt(1-n*n);return this.x=r*Math.cos(e),this.y=n,this.z=r*Math.sin(e),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const QE=new q,X3=new qt;class os{constructor(e=new q(1/0,1/0,1/0),n=new q(-1/0,-1/0,-1/0)){this.isBox3=!0,this.min=e,this.max=n}set(e,n){return this.min.copy(e),this.max.copy(n),this}setFromArray(e){this.makeEmpty();for(let n=0,r=e.length;n=this.min.x&&e.x<=this.max.x&&e.y>=this.min.y&&e.y<=this.max.y&&e.z>=this.min.z&&e.z<=this.max.z}containsBox(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y&&this.min.z<=e.min.z&&e.max.z<=this.max.z}getParameter(e,n){return n.set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y),(e.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(e){return e.max.x>=this.min.x&&e.min.x<=this.max.x&&e.max.y>=this.min.y&&e.min.y<=this.max.y&&e.max.z>=this.min.z&&e.min.z<=this.max.z}intersectsSphere(e){return this.clampPoint(e.center,Po),Po.distanceToSquared(e.center)<=e.radius*e.radius}intersectsPlane(e){let n,r;return e.normal.x>0?(n=e.normal.x*this.min.x,r=e.normal.x*this.max.x):(n=e.normal.x*this.max.x,r=e.normal.x*this.min.x),e.normal.y>0?(n+=e.normal.y*this.min.y,r+=e.normal.y*this.max.y):(n+=e.normal.y*this.max.y,r+=e.normal.y*this.min.y),e.normal.z>0?(n+=e.normal.z*this.min.z,r+=e.normal.z*this.max.z):(n+=e.normal.z*this.max.z,r+=e.normal.z*this.min.z),n<=-e.constant&&r>=-e.constant}intersectsTriangle(e){if(this.isEmpty())return!1;this.getCenter(y0),Bb.subVectors(this.max,y0),pm.subVectors(e.a,y0),mm.subVectors(e.b,y0),gm.subVectors(e.c,y0),Wu.subVectors(mm,pm),$u.subVectors(gm,mm),Cf.subVectors(pm,gm);let n=[0,-Wu.z,Wu.y,0,-$u.z,$u.y,0,-Cf.z,Cf.y,Wu.z,0,-Wu.x,$u.z,0,-$u.x,Cf.z,0,-Cf.x,-Wu.y,Wu.x,0,-$u.y,$u.x,0,-Cf.y,Cf.x,0];return!JE(n,pm,mm,gm,Bb)||(n=[1,0,0,0,1,0,0,0,1],!JE(n,pm,mm,gm,Bb))?!1:(Hb.crossVectors(Wu,$u),n=[Hb.x,Hb.y,Hb.z],JE(n,pm,mm,gm,Bb))}clampPoint(e,n){return n.copy(e).clamp(this.min,this.max)}distanceToPoint(e){return this.clampPoint(e,Po).distanceTo(e)}getBoundingSphere(e){return this.isEmpty()?e.makeEmpty():(this.getCenter(e.center),e.radius=this.getSize(Po).length()*.5),e}intersect(e){return this.min.max(e.min),this.max.min(e.max),this.isEmpty()&&this.makeEmpty(),this}union(e){return this.min.min(e.min),this.max.max(e.max),this}applyMatrix4(e){return this.isEmpty()?this:(_c[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(e),_c[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(e),_c[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(e),_c[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(e),_c[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(e),_c[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(e),_c[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(e),_c[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(e),this.setFromPoints(_c),this)}translate(e){return this.min.add(e),this.max.add(e),this}equals(e){return e.min.equals(this.min)&&e.max.equals(this.max)}}const _c=[new q,new q,new q,new q,new q,new q,new q,new q],Po=new q,zb=new os,pm=new q,mm=new q,gm=new q,Wu=new q,$u=new q,Cf=new q,y0=new q,Bb=new q,Hb=new q,Rf=new q;function JE(t,e,n,r,i){for(let s=0,a=t.length-3;s<=a;s+=3){Rf.fromArray(t,s);const o=i.x*Math.abs(Rf.x)+i.y*Math.abs(Rf.y)+i.z*Math.abs(Rf.z),l=e.dot(Rf),c=n.dot(Rf),d=r.dot(Rf);if(Math.max(-Math.max(l,c,d),Math.min(l,c,d))>o)return!1}return!0}const vpe=new os,x0=new q,eA=new q;class Hi{constructor(e=new q,n=-1){this.isSphere=!0,this.center=e,this.radius=n}set(e,n){return this.center.copy(e),this.radius=n,this}setFromPoints(e,n){const r=this.center;n!==void 0?r.copy(n):vpe.setFromPoints(e).getCenter(r);let i=0;for(let s=0,a=e.length;sthis.radius*this.radius&&(n.sub(this.center).normalize(),n.multiplyScalar(this.radius).add(this.center)),n}getBoundingBox(e){return this.isEmpty()?(e.makeEmpty(),e):(e.set(this.center,this.center),e.expandByScalar(this.radius),e)}applyMatrix4(e){return this.center.applyMatrix4(e),this.radius=this.radius*e.getMaxScaleOnAxis(),this}translate(e){return this.center.add(e),this}expandByPoint(e){if(this.isEmpty())return this.center.copy(e),this.radius=0,this;x0.subVectors(e,this.center);const n=x0.lengthSq();if(n>this.radius*this.radius){const r=Math.sqrt(n),i=(r-this.radius)*.5;this.center.addScaledVector(x0,i/r),this.radius+=i}return this}union(e){return e.isEmpty()?this:this.isEmpty()?(this.copy(e),this):(this.center.equals(e.center)===!0?this.radius=Math.max(this.radius,e.radius):(eA.subVectors(e.center,this.center).setLength(e.radius),this.expandByPoint(x0.copy(e.center).add(eA)),this.expandByPoint(x0.copy(e.center).sub(eA))),this)}equals(e){return e.center.equals(this.center)&&e.radius===this.radius}clone(){return new this.constructor().copy(this)}}const wc=new q,tA=new q,Vb=new q,Xu=new q,nA=new q,Gb=new q,rA=new q;class ep{constructor(e=new q,n=new q(0,0,-1)){this.origin=e,this.direction=n}set(e,n){return this.origin.copy(e),this.direction.copy(n),this}copy(e){return this.origin.copy(e.origin),this.direction.copy(e.direction),this}at(e,n){return n.copy(this.origin).addScaledVector(this.direction,e)}lookAt(e){return this.direction.copy(e).sub(this.origin).normalize(),this}recast(e){return this.origin.copy(this.at(e,wc)),this}closestPointToPoint(e,n){n.subVectors(e,this.origin);const r=n.dot(this.direction);return r<0?n.copy(this.origin):n.copy(this.origin).addScaledVector(this.direction,r)}distanceToPoint(e){return Math.sqrt(this.distanceSqToPoint(e))}distanceSqToPoint(e){const n=wc.subVectors(e,this.origin).dot(this.direction);return n<0?this.origin.distanceToSquared(e):(wc.copy(this.origin).addScaledVector(this.direction,n),wc.distanceToSquared(e))}distanceSqToSegment(e,n,r,i){tA.copy(e).add(n).multiplyScalar(.5),Vb.copy(n).sub(e).normalize(),Xu.copy(this.origin).sub(tA);const s=e.distanceTo(n)*.5,a=-this.direction.dot(Vb),o=Xu.dot(this.direction),l=-Xu.dot(Vb),c=Xu.lengthSq(),d=Math.abs(1-a*a);let f,p,y,b;if(d>0)if(f=a*l-o,p=a*o-l,b=s*d,f>=0)if(p>=-b)if(p<=b){const S=1/d;f*=S,p*=S,y=f*(f+a*p+2*o)+p*(a*f+p+2*l)+c}else p=s,f=Math.max(0,-(a*p+o)),y=-f*f+p*(p+2*l)+c;else p=-s,f=Math.max(0,-(a*p+o)),y=-f*f+p*(p+2*l)+c;else p<=-b?(f=Math.max(0,-(-a*s+o)),p=f>0?-s:Math.min(Math.max(-s,-l),s),y=-f*f+p*(p+2*l)+c):p<=b?(f=0,p=Math.min(Math.max(-s,-l),s),y=p*(p+2*l)+c):(f=Math.max(0,-(a*s+o)),p=f>0?s:Math.min(Math.max(-s,-l),s),y=-f*f+p*(p+2*l)+c);else p=a>0?-s:s,f=Math.max(0,-(a*p+o)),y=-f*f+p*(p+2*l)+c;return r&&r.copy(this.origin).addScaledVector(this.direction,f),i&&i.copy(tA).addScaledVector(Vb,p),y}intersectSphere(e,n){wc.subVectors(e.center,this.origin);const r=wc.dot(this.direction),i=wc.dot(wc)-r*r,s=e.radius*e.radius;if(i>s)return null;const a=Math.sqrt(s-i),o=r-a,l=r+a;return l<0?null:o<0?this.at(l,n):this.at(o,n)}intersectsSphere(e){return this.distanceSqToPoint(e.center)<=e.radius*e.radius}distanceToPlane(e){const n=e.normal.dot(this.direction);if(n===0)return e.distanceToPoint(this.origin)===0?0:null;const r=-(this.origin.dot(e.normal)+e.constant)/n;return r>=0?r:null}intersectPlane(e,n){const r=this.distanceToPlane(e);return r===null?null:this.at(r,n)}intersectsPlane(e){const n=e.distanceToPoint(this.origin);return n===0||e.normal.dot(this.direction)*n<0}intersectBox(e,n){let r,i,s,a,o,l;const c=1/this.direction.x,d=1/this.direction.y,f=1/this.direction.z,p=this.origin;return c>=0?(r=(e.min.x-p.x)*c,i=(e.max.x-p.x)*c):(r=(e.max.x-p.x)*c,i=(e.min.x-p.x)*c),d>=0?(s=(e.min.y-p.y)*d,a=(e.max.y-p.y)*d):(s=(e.max.y-p.y)*d,a=(e.min.y-p.y)*d),r>a||s>i||((s>r||isNaN(r))&&(r=s),(a=0?(o=(e.min.z-p.z)*f,l=(e.max.z-p.z)*f):(o=(e.max.z-p.z)*f,l=(e.min.z-p.z)*f),r>l||o>i)||((o>r||r!==r)&&(r=o),(l=0?r:i,n)}intersectsBox(e){return this.intersectBox(e,wc)!==null}intersectTriangle(e,n,r,i,s){nA.subVectors(n,e),Gb.subVectors(r,e),rA.crossVectors(nA,Gb);let a=this.direction.dot(rA),o;if(a>0){if(i)return null;o=1}else if(a<0)o=-1,a=-a;else return null;Xu.subVectors(this.origin,e);const l=o*this.direction.dot(Gb.crossVectors(Xu,Gb));if(l<0)return null;const c=o*this.direction.dot(nA.cross(Xu));if(c<0||l+c>a)return null;const d=-o*Xu.dot(rA);return d<0?null:this.at(d/a,s)}applyMatrix4(e){return this.origin.applyMatrix4(e),this.direction.transformDirection(e),this}equals(e){return e.origin.equals(this.origin)&&e.direction.equals(this.direction)}clone(){return new this.constructor().copy(this)}}class Ct{constructor(e,n,r,i,s,a,o,l,c,d,f,p,y,b,S,w){Ct.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],e!==void 0&&this.set(e,n,r,i,s,a,o,l,c,d,f,p,y,b,S,w)}set(e,n,r,i,s,a,o,l,c,d,f,p,y,b,S,w){const x=this.elements;return x[0]=e,x[4]=n,x[8]=r,x[12]=i,x[1]=s,x[5]=a,x[9]=o,x[13]=l,x[2]=c,x[6]=d,x[10]=f,x[14]=p,x[3]=y,x[7]=b,x[11]=S,x[15]=w,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return new Ct().fromArray(this.elements)}copy(e){const n=this.elements,r=e.elements;return n[0]=r[0],n[1]=r[1],n[2]=r[2],n[3]=r[3],n[4]=r[4],n[5]=r[5],n[6]=r[6],n[7]=r[7],n[8]=r[8],n[9]=r[9],n[10]=r[10],n[11]=r[11],n[12]=r[12],n[13]=r[13],n[14]=r[14],n[15]=r[15],this}copyPosition(e){const n=this.elements,r=e.elements;return n[12]=r[12],n[13]=r[13],n[14]=r[14],this}setFromMatrix3(e){const n=e.elements;return this.set(n[0],n[3],n[6],0,n[1],n[4],n[7],0,n[2],n[5],n[8],0,0,0,0,1),this}extractBasis(e,n,r){return e.setFromMatrixColumn(this,0),n.setFromMatrixColumn(this,1),r.setFromMatrixColumn(this,2),this}makeBasis(e,n,r){return this.set(e.x,n.x,r.x,0,e.y,n.y,r.y,0,e.z,n.z,r.z,0,0,0,0,1),this}extractRotation(e){const n=this.elements,r=e.elements,i=1/vm.setFromMatrixColumn(e,0).length(),s=1/vm.setFromMatrixColumn(e,1).length(),a=1/vm.setFromMatrixColumn(e,2).length();return n[0]=r[0]*i,n[1]=r[1]*i,n[2]=r[2]*i,n[3]=0,n[4]=r[4]*s,n[5]=r[5]*s,n[6]=r[6]*s,n[7]=0,n[8]=r[8]*a,n[9]=r[9]*a,n[10]=r[10]*a,n[11]=0,n[12]=0,n[13]=0,n[14]=0,n[15]=1,this}makeRotationFromEuler(e){const n=this.elements,r=e.x,i=e.y,s=e.z,a=Math.cos(r),o=Math.sin(r),l=Math.cos(i),c=Math.sin(i),d=Math.cos(s),f=Math.sin(s);if(e.order==="XYZ"){const p=a*d,y=a*f,b=o*d,S=o*f;n[0]=l*d,n[4]=-l*f,n[8]=c,n[1]=y+b*c,n[5]=p-S*c,n[9]=-o*l,n[2]=S-p*c,n[6]=b+y*c,n[10]=a*l}else if(e.order==="YXZ"){const p=l*d,y=l*f,b=c*d,S=c*f;n[0]=p+S*o,n[4]=b*o-y,n[8]=a*c,n[1]=a*f,n[5]=a*d,n[9]=-o,n[2]=y*o-b,n[6]=S+p*o,n[10]=a*l}else if(e.order==="ZXY"){const p=l*d,y=l*f,b=c*d,S=c*f;n[0]=p-S*o,n[4]=-a*f,n[8]=b+y*o,n[1]=y+b*o,n[5]=a*d,n[9]=S-p*o,n[2]=-a*c,n[6]=o,n[10]=a*l}else if(e.order==="ZYX"){const p=a*d,y=a*f,b=o*d,S=o*f;n[0]=l*d,n[4]=b*c-y,n[8]=p*c+S,n[1]=l*f,n[5]=S*c+p,n[9]=y*c-b,n[2]=-c,n[6]=o*l,n[10]=a*l}else if(e.order==="YZX"){const p=a*l,y=a*c,b=o*l,S=o*c;n[0]=l*d,n[4]=S-p*f,n[8]=b*f+y,n[1]=f,n[5]=a*d,n[9]=-o*d,n[2]=-c*d,n[6]=y*f+b,n[10]=p-S*f}else if(e.order==="XZY"){const p=a*l,y=a*c,b=o*l,S=o*c;n[0]=l*d,n[4]=-f,n[8]=c*d,n[1]=p*f+S,n[5]=a*d,n[9]=y*f-b,n[2]=b*f-y,n[6]=o*d,n[10]=S*f+p}return n[3]=0,n[7]=0,n[11]=0,n[12]=0,n[13]=0,n[14]=0,n[15]=1,this}makeRotationFromQuaternion(e){return this.compose(ype,e,xpe)}lookAt(e,n,r){const i=this.elements;return fa.subVectors(e,n),fa.lengthSq()===0&&(fa.z=1),fa.normalize(),qu.crossVectors(r,fa),qu.lengthSq()===0&&(Math.abs(r.z)===1?fa.x+=1e-4:fa.z+=1e-4,fa.normalize(),qu.crossVectors(r,fa)),qu.normalize(),Wb.crossVectors(fa,qu),i[0]=qu.x,i[4]=Wb.x,i[8]=fa.x,i[1]=qu.y,i[5]=Wb.y,i[9]=fa.y,i[2]=qu.z,i[6]=Wb.z,i[10]=fa.z,this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,n){const r=e.elements,i=n.elements,s=this.elements,a=r[0],o=r[4],l=r[8],c=r[12],d=r[1],f=r[5],p=r[9],y=r[13],b=r[2],S=r[6],w=r[10],x=r[14],M=r[3],T=r[7],P=r[11],O=r[15],N=i[0],D=i[4],z=i[8],V=i[12],k=i[1],j=i[5],X=i[9],ee=i[13],ie=i[2],pe=i[6],ae=i[10],he=i[14],B=i[3],J=i[7],Y=i[11],H=i[15];return s[0]=a*N+o*k+l*ie+c*B,s[4]=a*D+o*j+l*pe+c*J,s[8]=a*z+o*X+l*ae+c*Y,s[12]=a*V+o*ee+l*he+c*H,s[1]=d*N+f*k+p*ie+y*B,s[5]=d*D+f*j+p*pe+y*J,s[9]=d*z+f*X+p*ae+y*Y,s[13]=d*V+f*ee+p*he+y*H,s[2]=b*N+S*k+w*ie+x*B,s[6]=b*D+S*j+w*pe+x*J,s[10]=b*z+S*X+w*ae+x*Y,s[14]=b*V+S*ee+w*he+x*H,s[3]=M*N+T*k+P*ie+O*B,s[7]=M*D+T*j+P*pe+O*J,s[11]=M*z+T*X+P*ae+O*Y,s[15]=M*V+T*ee+P*he+O*H,this}multiplyScalar(e){const n=this.elements;return n[0]*=e,n[4]*=e,n[8]*=e,n[12]*=e,n[1]*=e,n[5]*=e,n[9]*=e,n[13]*=e,n[2]*=e,n[6]*=e,n[10]*=e,n[14]*=e,n[3]*=e,n[7]*=e,n[11]*=e,n[15]*=e,this}determinant(){const e=this.elements,n=e[0],r=e[4],i=e[8],s=e[12],a=e[1],o=e[5],l=e[9],c=e[13],d=e[2],f=e[6],p=e[10],y=e[14],b=e[3],S=e[7],w=e[11],x=e[15];return b*(+s*l*f-i*c*f-s*o*p+r*c*p+i*o*y-r*l*y)+S*(+n*l*y-n*c*p+s*a*p-i*a*y+i*c*d-s*l*d)+w*(+n*c*f-n*o*y-s*a*f+r*a*y+s*o*d-r*c*d)+x*(-i*o*d-n*l*f+n*o*p+i*a*f-r*a*p+r*l*d)}transpose(){const e=this.elements;let n;return n=e[1],e[1]=e[4],e[4]=n,n=e[2],e[2]=e[8],e[8]=n,n=e[6],e[6]=e[9],e[9]=n,n=e[3],e[3]=e[12],e[12]=n,n=e[7],e[7]=e[13],e[13]=n,n=e[11],e[11]=e[14],e[14]=n,this}setPosition(e,n,r){const i=this.elements;return e.isVector3?(i[12]=e.x,i[13]=e.y,i[14]=e.z):(i[12]=e,i[13]=n,i[14]=r),this}invert(){const e=this.elements,n=e[0],r=e[1],i=e[2],s=e[3],a=e[4],o=e[5],l=e[6],c=e[7],d=e[8],f=e[9],p=e[10],y=e[11],b=e[12],S=e[13],w=e[14],x=e[15],M=f*w*c-S*p*c+S*l*y-o*w*y-f*l*x+o*p*x,T=b*p*c-d*w*c-b*l*y+a*w*y+d*l*x-a*p*x,P=d*S*c-b*f*c+b*o*y-a*S*y-d*o*x+a*f*x,O=b*f*l-d*S*l-b*o*p+a*S*p+d*o*w-a*f*w,N=n*M+r*T+i*P+s*O;if(N===0)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const D=1/N;return e[0]=M*D,e[1]=(S*p*s-f*w*s-S*i*y+r*w*y+f*i*x-r*p*x)*D,e[2]=(o*w*s-S*l*s+S*i*c-r*w*c-o*i*x+r*l*x)*D,e[3]=(f*l*s-o*p*s-f*i*c+r*p*c+o*i*y-r*l*y)*D,e[4]=T*D,e[5]=(d*w*s-b*p*s+b*i*y-n*w*y-d*i*x+n*p*x)*D,e[6]=(b*l*s-a*w*s-b*i*c+n*w*c+a*i*x-n*l*x)*D,e[7]=(a*p*s-d*l*s+d*i*c-n*p*c-a*i*y+n*l*y)*D,e[8]=P*D,e[9]=(b*f*s-d*S*s-b*r*y+n*S*y+d*r*x-n*f*x)*D,e[10]=(a*S*s-b*o*s+b*r*c-n*S*c-a*r*x+n*o*x)*D,e[11]=(d*o*s-a*f*s-d*r*c+n*f*c+a*r*y-n*o*y)*D,e[12]=O*D,e[13]=(d*S*i-b*f*i+b*r*p-n*S*p-d*r*w+n*f*w)*D,e[14]=(b*o*i-a*S*i-b*r*l+n*S*l+a*r*w-n*o*w)*D,e[15]=(a*f*i-d*o*i+d*r*l-n*f*l-a*r*p+n*o*p)*D,this}scale(e){const n=this.elements,r=e.x,i=e.y,s=e.z;return n[0]*=r,n[4]*=i,n[8]*=s,n[1]*=r,n[5]*=i,n[9]*=s,n[2]*=r,n[6]*=i,n[10]*=s,n[3]*=r,n[7]*=i,n[11]*=s,this}getMaxScaleOnAxis(){const e=this.elements,n=e[0]*e[0]+e[1]*e[1]+e[2]*e[2],r=e[4]*e[4]+e[5]*e[5]+e[6]*e[6],i=e[8]*e[8]+e[9]*e[9]+e[10]*e[10];return Math.sqrt(Math.max(n,r,i))}makeTranslation(e,n,r){return e.isVector3?this.set(1,0,0,e.x,0,1,0,e.y,0,0,1,e.z,0,0,0,1):this.set(1,0,0,e,0,1,0,n,0,0,1,r,0,0,0,1),this}makeRotationX(e){const n=Math.cos(e),r=Math.sin(e);return this.set(1,0,0,0,0,n,-r,0,0,r,n,0,0,0,0,1),this}makeRotationY(e){const n=Math.cos(e),r=Math.sin(e);return this.set(n,0,r,0,0,1,0,0,-r,0,n,0,0,0,0,1),this}makeRotationZ(e){const n=Math.cos(e),r=Math.sin(e);return this.set(n,-r,0,0,r,n,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(e,n){const r=Math.cos(n),i=Math.sin(n),s=1-r,a=e.x,o=e.y,l=e.z,c=s*a,d=s*o;return this.set(c*a+r,c*o-i*l,c*l+i*o,0,c*o+i*l,d*o+r,d*l-i*a,0,c*l-i*o,d*l+i*a,s*l*l+r,0,0,0,0,1),this}makeScale(e,n,r){return this.set(e,0,0,0,0,n,0,0,0,0,r,0,0,0,0,1),this}makeShear(e,n,r,i,s,a){return this.set(1,r,s,0,e,1,a,0,n,i,1,0,0,0,0,1),this}compose(e,n,r){const i=this.elements,s=n._x,a=n._y,o=n._z,l=n._w,c=s+s,d=a+a,f=o+o,p=s*c,y=s*d,b=s*f,S=a*d,w=a*f,x=o*f,M=l*c,T=l*d,P=l*f,O=r.x,N=r.y,D=r.z;return i[0]=(1-(S+x))*O,i[1]=(y+P)*O,i[2]=(b-T)*O,i[3]=0,i[4]=(y-P)*N,i[5]=(1-(p+x))*N,i[6]=(w+M)*N,i[7]=0,i[8]=(b+T)*D,i[9]=(w-M)*D,i[10]=(1-(p+S))*D,i[11]=0,i[12]=e.x,i[13]=e.y,i[14]=e.z,i[15]=1,this}decompose(e,n,r){const i=this.elements;let s=vm.set(i[0],i[1],i[2]).length();const a=vm.set(i[4],i[5],i[6]).length(),o=vm.set(i[8],i[9],i[10]).length();this.determinant()<0&&(s=-s),e.x=i[12],e.y=i[13],e.z=i[14],Co.copy(this);const c=1/s,d=1/a,f=1/o;return Co.elements[0]*=c,Co.elements[1]*=c,Co.elements[2]*=c,Co.elements[4]*=d,Co.elements[5]*=d,Co.elements[6]*=d,Co.elements[8]*=f,Co.elements[9]*=f,Co.elements[10]*=f,n.setFromRotationMatrix(Co),r.x=s,r.y=a,r.z=o,this}makePerspective(e,n,r,i,s,a,o=Ml){const l=this.elements,c=2*s/(n-e),d=2*s/(r-i),f=(n+e)/(n-e),p=(r+i)/(r-i);let y,b;if(o===Ml)y=-(a+s)/(a-s),b=-2*a*s/(a-s);else if(o===ky)y=-a/(a-s),b=-a*s/(a-s);else throw new Error("THREE.Matrix4.makePerspective(): Invalid coordinate system: "+o);return l[0]=c,l[4]=0,l[8]=f,l[12]=0,l[1]=0,l[5]=d,l[9]=p,l[13]=0,l[2]=0,l[6]=0,l[10]=y,l[14]=b,l[3]=0,l[7]=0,l[11]=-1,l[15]=0,this}makeOrthographic(e,n,r,i,s,a,o=Ml){const l=this.elements,c=1/(n-e),d=1/(r-i),f=1/(a-s),p=(n+e)*c,y=(r+i)*d;let b,S;if(o===Ml)b=(a+s)*f,S=-2*f;else if(o===ky)b=s*f,S=-1*f;else throw new Error("THREE.Matrix4.makeOrthographic(): Invalid coordinate system: "+o);return l[0]=2*c,l[4]=0,l[8]=0,l[12]=-p,l[1]=0,l[5]=2*d,l[9]=0,l[13]=-y,l[2]=0,l[6]=0,l[10]=S,l[14]=-b,l[3]=0,l[7]=0,l[11]=0,l[15]=1,this}equals(e){const n=this.elements,r=e.elements;for(let i=0;i<16;i++)if(n[i]!==r[i])return!1;return!0}fromArray(e,n=0){for(let r=0;r<16;r++)this.elements[r]=e[r+n];return this}toArray(e=[],n=0){const r=this.elements;return e[n]=r[0],e[n+1]=r[1],e[n+2]=r[2],e[n+3]=r[3],e[n+4]=r[4],e[n+5]=r[5],e[n+6]=r[6],e[n+7]=r[7],e[n+8]=r[8],e[n+9]=r[9],e[n+10]=r[10],e[n+11]=r[11],e[n+12]=r[12],e[n+13]=r[13],e[n+14]=r[14],e[n+15]=r[15],e}}const vm=new q,Co=new Ct,ype=new q(0,0,0),xpe=new q(1,1,1),qu=new q,Wb=new q,fa=new q,q3=new Ct,K3=new qt;class ls{constructor(e=0,n=0,r=0,i=ls.DEFAULT_ORDER){this.isEuler=!0,this._x=e,this._y=n,this._z=r,this._order=i}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get order(){return this._order}set order(e){this._order=e,this._onChangeCallback()}set(e,n,r,i=this._order){return this._x=e,this._y=n,this._z=r,this._order=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(e){return this._x=e._x,this._y=e._y,this._z=e._z,this._order=e._order,this._onChangeCallback(),this}setFromRotationMatrix(e,n=this._order,r=!0){const i=e.elements,s=i[0],a=i[4],o=i[8],l=i[1],c=i[5],d=i[9],f=i[2],p=i[6],y=i[10];switch(n){case"XYZ":this._y=Math.asin(Tr(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-d,y),this._z=Math.atan2(-a,s)):(this._x=Math.atan2(p,c),this._z=0);break;case"YXZ":this._x=Math.asin(-Tr(d,-1,1)),Math.abs(d)<.9999999?(this._y=Math.atan2(o,y),this._z=Math.atan2(l,c)):(this._y=Math.atan2(-f,s),this._z=0);break;case"ZXY":this._x=Math.asin(Tr(p,-1,1)),Math.abs(p)<.9999999?(this._y=Math.atan2(-f,y),this._z=Math.atan2(-a,c)):(this._y=0,this._z=Math.atan2(l,s));break;case"ZYX":this._y=Math.asin(-Tr(f,-1,1)),Math.abs(f)<.9999999?(this._x=Math.atan2(p,y),this._z=Math.atan2(l,s)):(this._x=0,this._z=Math.atan2(-a,c));break;case"YZX":this._z=Math.asin(Tr(l,-1,1)),Math.abs(l)<.9999999?(this._x=Math.atan2(-d,c),this._y=Math.atan2(-f,s)):(this._x=0,this._y=Math.atan2(o,y));break;case"XZY":this._z=Math.asin(-Tr(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(p,c),this._y=Math.atan2(o,s)):(this._x=Math.atan2(-d,y),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+n)}return this._order=n,r===!0&&this._onChangeCallback(),this}setFromQuaternion(e,n,r){return q3.makeRotationFromQuaternion(e),this.setFromRotationMatrix(q3,n,r)}setFromVector3(e,n=this._order){return this.set(e.x,e.y,e.z,n)}reorder(e){return K3.setFromEuler(this),this.setFromQuaternion(K3,e)}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._order===this._order}fromArray(e){return this._x=e[0],this._y=e[1],this._z=e[2],e[3]!==void 0&&(this._order=e[3]),this._onChangeCallback(),this}toArray(e=[],n=0){return e[n]=this._x,e[n+1]=this._y,e[n+2]=this._z,e[n+3]=this._order,e}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}ls.DEFAULT_ORDER="XYZ";class Ch{constructor(){this.mask=1}set(e){this.mask=(1<>>0}enable(e){this.mask|=1<1){for(let n=0;n1){for(let r=0;r0&&(i.userData=this.userData),i.layers=this.layers.mask,i.matrix=this.matrix.toArray(),i.up=this.up.toArray(),this.matrixAutoUpdate===!1&&(i.matrixAutoUpdate=!1),this.isInstancedMesh&&(i.type="InstancedMesh",i.count=this.count,i.instanceMatrix=this.instanceMatrix.toJSON(),this.instanceColor!==null&&(i.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(i.type="BatchedMesh",i.perObjectFrustumCulled=this.perObjectFrustumCulled,i.sortObjects=this.sortObjects,i.drawRanges=this._drawRanges,i.reservedRanges=this._reservedRanges,i.visibility=this._visibility,i.active=this._active,i.bounds=this._bounds.map(o=>({boxInitialized:o.boxInitialized,boxMin:o.box.min.toArray(),boxMax:o.box.max.toArray(),sphereInitialized:o.sphereInitialized,sphereRadius:o.sphere.radius,sphereCenter:o.sphere.center.toArray()})),i.maxInstanceCount=this._maxInstanceCount,i.maxVertexCount=this._maxVertexCount,i.maxIndexCount=this._maxIndexCount,i.geometryInitialized=this._geometryInitialized,i.geometryCount=this._geometryCount,i.matricesTexture=this._matricesTexture.toJSON(e),this._colorsTexture!==null&&(i.colorsTexture=this._colorsTexture.toJSON(e)),this.boundingSphere!==null&&(i.boundingSphere={center:i.boundingSphere.center.toArray(),radius:i.boundingSphere.radius}),this.boundingBox!==null&&(i.boundingBox={min:i.boundingBox.min.toArray(),max:i.boundingBox.max.toArray()}));function s(o,l){return o[l.uuid]===void 0&&(o[l.uuid]=l.toJSON(e)),l.uuid}if(this.isScene)this.background&&(this.background.isColor?i.background=this.background.toJSON():this.background.isTexture&&(i.background=this.background.toJSON(e).uuid)),this.environment&&this.environment.isTexture&&this.environment.isRenderTargetTexture!==!0&&(i.environment=this.environment.toJSON(e).uuid);else if(this.isMesh||this.isLine||this.isPoints){i.geometry=s(e.geometries,this.geometry);const o=this.geometry.parameters;if(o!==void 0&&o.shapes!==void 0){const l=o.shapes;if(Array.isArray(l))for(let c=0,d=l.length;c0){i.children=[];for(let o=0;o0){i.animations=[];for(let o=0;o0&&(r.geometries=o),l.length>0&&(r.materials=l),c.length>0&&(r.textures=c),d.length>0&&(r.images=d),f.length>0&&(r.shapes=f),p.length>0&&(r.skeletons=p),y.length>0&&(r.animations=y),b.length>0&&(r.nodes=b)}return r.object=i,r;function a(o){const l=[];for(const c in o){const d=o[c];delete d.metadata,l.push(d)}return l}}clone(e){return new this.constructor().copy(this,e)}copy(e,n=!0){if(this.name=e.name,this.up.copy(e.up),this.position.copy(e.position),this.rotation.order=e.rotation.order,this.quaternion.copy(e.quaternion),this.scale.copy(e.scale),this.matrix.copy(e.matrix),this.matrixWorld.copy(e.matrixWorld),this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrixWorldAutoUpdate=e.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=e.matrixWorldNeedsUpdate,this.layers.mask=e.layers.mask,this.visible=e.visible,this.castShadow=e.castShadow,this.receiveShadow=e.receiveShadow,this.frustumCulled=e.frustumCulled,this.renderOrder=e.renderOrder,this.animations=e.animations.slice(),this.userData=JSON.parse(JSON.stringify(e.userData)),n===!0)for(let r=0;r0?i.multiplyScalar(1/Math.sqrt(s)):i.set(0,0,0)}static getBarycoord(e,n,r,i,s){Ro.subVectors(i,n),Mc.subVectors(r,n),sA.subVectors(e,n);const a=Ro.dot(Ro),o=Ro.dot(Mc),l=Ro.dot(sA),c=Mc.dot(Mc),d=Mc.dot(sA),f=a*c-o*o;if(f===0)return s.set(0,0,0),null;const p=1/f,y=(c*l-o*d)*p,b=(a*d-o*l)*p;return s.set(1-y-b,b,y)}static containsPoint(e,n,r,i){return this.getBarycoord(e,n,r,i,Ec)===null?!1:Ec.x>=0&&Ec.y>=0&&Ec.x+Ec.y<=1}static getInterpolation(e,n,r,i,s,a,o,l){return this.getBarycoord(e,n,r,i,Ec)===null?(l.x=0,l.y=0,"z"in l&&(l.z=0),"w"in l&&(l.w=0),null):(l.setScalar(0),l.addScaledVector(s,Ec.x),l.addScaledVector(a,Ec.y),l.addScaledVector(o,Ec.z),l)}static getInterpolatedAttribute(e,n,r,i,s,a){return cA.setScalar(0),uA.setScalar(0),dA.setScalar(0),cA.fromBufferAttribute(e,n),uA.fromBufferAttribute(e,r),dA.fromBufferAttribute(e,i),a.setScalar(0),a.addScaledVector(cA,s.x),a.addScaledVector(uA,s.y),a.addScaledVector(dA,s.z),a}static isFrontFacing(e,n,r,i){return Ro.subVectors(r,n),Mc.subVectors(e,n),Ro.cross(Mc).dot(i)<0}set(e,n,r){return this.a.copy(e),this.b.copy(n),this.c.copy(r),this}setFromPointsAndIndices(e,n,r,i){return this.a.copy(e[n]),this.b.copy(e[r]),this.c.copy(e[i]),this}setFromAttributeAndIndices(e,n,r,i){return this.a.fromBufferAttribute(e,n),this.b.fromBufferAttribute(e,r),this.c.fromBufferAttribute(e,i),this}clone(){return new this.constructor().copy(this)}copy(e){return this.a.copy(e.a),this.b.copy(e.b),this.c.copy(e.c),this}getArea(){return Ro.subVectors(this.c,this.b),Mc.subVectors(this.a,this.b),Ro.cross(Mc).length()*.5}getMidpoint(e){return e.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(e){return Ks.getNormal(this.a,this.b,this.c,e)}getPlane(e){return e.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(e,n){return Ks.getBarycoord(e,this.a,this.b,this.c,n)}getInterpolation(e,n,r,i,s){return Ks.getInterpolation(e,this.a,this.b,this.c,n,r,i,s)}containsPoint(e){return Ks.containsPoint(e,this.a,this.b,this.c)}isFrontFacing(e){return Ks.isFrontFacing(this.a,this.b,this.c,e)}intersectsBox(e){return e.intersectsTriangle(this)}closestPointToPoint(e,n){const r=this.a,i=this.b,s=this.c;let a,o;bm.subVectors(i,r),_m.subVectors(s,r),aA.subVectors(e,r);const l=bm.dot(aA),c=_m.dot(aA);if(l<=0&&c<=0)return n.copy(r);oA.subVectors(e,i);const d=bm.dot(oA),f=_m.dot(oA);if(d>=0&&f<=d)return n.copy(i);const p=l*f-d*c;if(p<=0&&l>=0&&d<=0)return a=l/(l-d),n.copy(r).addScaledVector(bm,a);lA.subVectors(e,s);const y=bm.dot(lA),b=_m.dot(lA);if(b>=0&&y<=b)return n.copy(s);const S=y*c-l*b;if(S<=0&&c>=0&&b<=0)return o=c/(c-b),n.copy(r).addScaledVector(_m,o);const w=d*b-y*f;if(w<=0&&f-d>=0&&y-b>=0)return tD.subVectors(s,i),o=(f-d)/(f-d+(y-b)),n.copy(i).addScaledVector(tD,o);const x=1/(w+S+p);return a=S*x,o=p*x,n.copy(r).addScaledVector(bm,a).addScaledVector(_m,o)}equals(e){return e.a.equals(this.a)&&e.b.equals(this.b)&&e.c.equals(this.c)}}const p6={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Ku={h:0,s:0,l:0},Xb={h:0,s:0,l:0};function fA(t,e,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?t+(e-t)*6*n:n<1/2?e:n<2/3?t+(e-t)*6*(2/3-n):t}class ct{constructor(e,n,r){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(e,n,r)}set(e,n,r){if(n===void 0&&r===void 0){const i=e;i&&i.isColor?this.copy(i):typeof i=="number"?this.setHex(i):typeof i=="string"&&this.setStyle(i)}else this.setRGB(e,n,r);return this}setScalar(e){return this.r=e,this.g=e,this.b=e,this}setHex(e,n=Fi){return e=Math.floor(e),this.r=(e>>16&255)/255,this.g=(e>>8&255)/255,this.b=(e&255)/255,Nn.toWorkingColorSpace(this,n),this}setRGB(e,n,r,i=Nn.workingColorSpace){return this.r=e,this.g=n,this.b=r,Nn.toWorkingColorSpace(this,i),this}setHSL(e,n,r,i=Nn.workingColorSpace){if(e=SR(e,1),n=Tr(n,0,1),r=Tr(r,0,1),n===0)this.r=this.g=this.b=r;else{const s=r<=.5?r*(1+n):r+n-r*n,a=2*r-s;this.r=fA(a,s,e+1/3),this.g=fA(a,s,e),this.b=fA(a,s,e-1/3)}return Nn.toWorkingColorSpace(this,i),this}setStyle(e,n=Fi){function r(s){s!==void 0&&parseFloat(s)<1&&console.warn("THREE.Color: Alpha component of "+e+" will be ignored.")}let i;if(i=/^(\w+)\(([^\)]*)\)/.exec(e)){let s;const a=i[1],o=i[2];switch(a){case"rgb":case"rgba":if(s=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return r(s[4]),this.setRGB(Math.min(255,parseInt(s[1],10))/255,Math.min(255,parseInt(s[2],10))/255,Math.min(255,parseInt(s[3],10))/255,n);if(s=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return r(s[4]),this.setRGB(Math.min(100,parseInt(s[1],10))/100,Math.min(100,parseInt(s[2],10))/100,Math.min(100,parseInt(s[3],10))/100,n);break;case"hsl":case"hsla":if(s=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return r(s[4]),this.setHSL(parseFloat(s[1])/360,parseFloat(s[2])/100,parseFloat(s[3])/100,n);break;default:console.warn("THREE.Color: Unknown color model "+e)}}else if(i=/^\#([A-Fa-f\d]+)$/.exec(e)){const s=i[1],a=s.length;if(a===3)return this.setRGB(parseInt(s.charAt(0),16)/15,parseInt(s.charAt(1),16)/15,parseInt(s.charAt(2),16)/15,n);if(a===6)return this.setHex(parseInt(s,16),n);console.warn("THREE.Color: Invalid hex color "+e)}else if(e&&e.length>0)return this.setColorName(e,n);return this}setColorName(e,n=Fi){const r=p6[e.toLowerCase()];return r!==void 0?this.setHex(r,n):console.warn("THREE.Color: Unknown color "+e),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(e){return this.r=e.r,this.g=e.g,this.b=e.b,this}copySRGBToLinear(e){return this.r=rg(e.r),this.g=rg(e.g),this.b=rg(e.b),this}copyLinearToSRGB(e){return this.r=YE(e.r),this.g=YE(e.g),this.b=YE(e.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(e=Fi){return Nn.fromWorkingColorSpace(es.copy(this),e),Math.round(Tr(es.r*255,0,255))*65536+Math.round(Tr(es.g*255,0,255))*256+Math.round(Tr(es.b*255,0,255))}getHexString(e=Fi){return("000000"+this.getHex(e).toString(16)).slice(-6)}getHSL(e,n=Nn.workingColorSpace){Nn.fromWorkingColorSpace(es.copy(this),n);const r=es.r,i=es.g,s=es.b,a=Math.max(r,i,s),o=Math.min(r,i,s);let l,c;const d=(o+a)/2;if(o===a)l=0,c=0;else{const f=a-o;switch(c=d<=.5?f/(a+o):f/(2-a-o),a){case r:l=(i-s)/f+(i0!=e>0&&this.version++,this._alphaTest=e}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(e){if(e!==void 0)for(const n in e){const r=e[n];if(r===void 0){console.warn(`THREE.Material: parameter '${n}' has value of undefined.`);continue}const i=this[n];if(i===void 0){console.warn(`THREE.Material: '${n}' is not a property of THREE.${this.type}.`);continue}i&&i.isColor?i.set(r):i&&i.isVector3&&r&&r.isVector3?i.copy(r):this[n]=r}}toJSON(e){const n=e===void 0||typeof e=="string";n&&(e={textures:{},images:{}});const r={metadata:{version:4.6,type:"Material",generator:"Material.toJSON"}};r.uuid=this.uuid,r.type=this.type,this.name!==""&&(r.name=this.name),this.color&&this.color.isColor&&(r.color=this.color.getHex()),this.roughness!==void 0&&(r.roughness=this.roughness),this.metalness!==void 0&&(r.metalness=this.metalness),this.sheen!==void 0&&(r.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(r.sheenColor=this.sheenColor.getHex()),this.sheenRoughness!==void 0&&(r.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(r.emissive=this.emissive.getHex()),this.emissiveIntensity!==void 0&&this.emissiveIntensity!==1&&(r.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(r.specular=this.specular.getHex()),this.specularIntensity!==void 0&&(r.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(r.specularColor=this.specularColor.getHex()),this.shininess!==void 0&&(r.shininess=this.shininess),this.clearcoat!==void 0&&(r.clearcoat=this.clearcoat),this.clearcoatRoughness!==void 0&&(r.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(r.clearcoatMap=this.clearcoatMap.toJSON(e).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(r.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(e).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(r.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(e).uuid,r.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.dispersion!==void 0&&(r.dispersion=this.dispersion),this.iridescence!==void 0&&(r.iridescence=this.iridescence),this.iridescenceIOR!==void 0&&(r.iridescenceIOR=this.iridescenceIOR),this.iridescenceThicknessRange!==void 0&&(r.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(r.iridescenceMap=this.iridescenceMap.toJSON(e).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(r.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(e).uuid),this.anisotropy!==void 0&&(r.anisotropy=this.anisotropy),this.anisotropyRotation!==void 0&&(r.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(r.anisotropyMap=this.anisotropyMap.toJSON(e).uuid),this.map&&this.map.isTexture&&(r.map=this.map.toJSON(e).uuid),this.matcap&&this.matcap.isTexture&&(r.matcap=this.matcap.toJSON(e).uuid),this.alphaMap&&this.alphaMap.isTexture&&(r.alphaMap=this.alphaMap.toJSON(e).uuid),this.lightMap&&this.lightMap.isTexture&&(r.lightMap=this.lightMap.toJSON(e).uuid,r.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(r.aoMap=this.aoMap.toJSON(e).uuid,r.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(r.bumpMap=this.bumpMap.toJSON(e).uuid,r.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(r.normalMap=this.normalMap.toJSON(e).uuid,r.normalMapType=this.normalMapType,r.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(r.displacementMap=this.displacementMap.toJSON(e).uuid,r.displacementScale=this.displacementScale,r.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(r.roughnessMap=this.roughnessMap.toJSON(e).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(r.metalnessMap=this.metalnessMap.toJSON(e).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(r.emissiveMap=this.emissiveMap.toJSON(e).uuid),this.specularMap&&this.specularMap.isTexture&&(r.specularMap=this.specularMap.toJSON(e).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(r.specularIntensityMap=this.specularIntensityMap.toJSON(e).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(r.specularColorMap=this.specularColorMap.toJSON(e).uuid),this.envMap&&this.envMap.isTexture&&(r.envMap=this.envMap.toJSON(e).uuid,this.combine!==void 0&&(r.combine=this.combine)),this.envMapRotation!==void 0&&(r.envMapRotation=this.envMapRotation.toArray()),this.envMapIntensity!==void 0&&(r.envMapIntensity=this.envMapIntensity),this.reflectivity!==void 0&&(r.reflectivity=this.reflectivity),this.refractionRatio!==void 0&&(r.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(r.gradientMap=this.gradientMap.toJSON(e).uuid),this.transmission!==void 0&&(r.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(r.transmissionMap=this.transmissionMap.toJSON(e).uuid),this.thickness!==void 0&&(r.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(r.thicknessMap=this.thicknessMap.toJSON(e).uuid),this.attenuationDistance!==void 0&&this.attenuationDistance!==1/0&&(r.attenuationDistance=this.attenuationDistance),this.attenuationColor!==void 0&&(r.attenuationColor=this.attenuationColor.getHex()),this.size!==void 0&&(r.size=this.size),this.shadowSide!==null&&(r.shadowSide=this.shadowSide),this.sizeAttenuation!==void 0&&(r.sizeAttenuation=this.sizeAttenuation),this.blending!==Ah&&(r.blending=this.blending),this.side!==Ll&&(r.side=this.side),this.vertexColors===!0&&(r.vertexColors=!0),this.opacity<1&&(r.opacity=this.opacity),this.transparent===!0&&(r.transparent=!0),this.blendSrc!==Jw&&(r.blendSrc=this.blendSrc),this.blendDst!==e1&&(r.blendDst=this.blendDst),this.blendEquation!==cd&&(r.blendEquation=this.blendEquation),this.blendSrcAlpha!==null&&(r.blendSrcAlpha=this.blendSrcAlpha),this.blendDstAlpha!==null&&(r.blendDstAlpha=this.blendDstAlpha),this.blendEquationAlpha!==null&&(r.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(r.blendColor=this.blendColor.getHex()),this.blendAlpha!==0&&(r.blendAlpha=this.blendAlpha),this.depthFunc!==zh&&(r.depthFunc=this.depthFunc),this.depthTest===!1&&(r.depthTest=this.depthTest),this.depthWrite===!1&&(r.depthWrite=this.depthWrite),this.colorWrite===!1&&(r.colorWrite=this.colorWrite),this.stencilWriteMask!==255&&(r.stencilWriteMask=this.stencilWriteMask),this.stencilFunc!==$P&&(r.stencilFunc=this.stencilFunc),this.stencilRef!==0&&(r.stencilRef=this.stencilRef),this.stencilFuncMask!==255&&(r.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==Zf&&(r.stencilFail=this.stencilFail),this.stencilZFail!==Zf&&(r.stencilZFail=this.stencilZFail),this.stencilZPass!==Zf&&(r.stencilZPass=this.stencilZPass),this.stencilWrite===!0&&(r.stencilWrite=this.stencilWrite),this.rotation!==void 0&&this.rotation!==0&&(r.rotation=this.rotation),this.polygonOffset===!0&&(r.polygonOffset=!0),this.polygonOffsetFactor!==0&&(r.polygonOffsetFactor=this.polygonOffsetFactor),this.polygonOffsetUnits!==0&&(r.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth!==void 0&&this.linewidth!==1&&(r.linewidth=this.linewidth),this.dashSize!==void 0&&(r.dashSize=this.dashSize),this.gapSize!==void 0&&(r.gapSize=this.gapSize),this.scale!==void 0&&(r.scale=this.scale),this.dithering===!0&&(r.dithering=!0),this.alphaTest>0&&(r.alphaTest=this.alphaTest),this.alphaHash===!0&&(r.alphaHash=!0),this.alphaToCoverage===!0&&(r.alphaToCoverage=!0),this.premultipliedAlpha===!0&&(r.premultipliedAlpha=!0),this.forceSinglePass===!0&&(r.forceSinglePass=!0),this.wireframe===!0&&(r.wireframe=!0),this.wireframeLinewidth>1&&(r.wireframeLinewidth=this.wireframeLinewidth),this.wireframeLinecap!=="round"&&(r.wireframeLinecap=this.wireframeLinecap),this.wireframeLinejoin!=="round"&&(r.wireframeLinejoin=this.wireframeLinejoin),this.flatShading===!0&&(r.flatShading=!0),this.visible===!1&&(r.visible=!1),this.toneMapped===!1&&(r.toneMapped=!1),this.fog===!1&&(r.fog=!1),Object.keys(this.userData).length>0&&(r.userData=this.userData);function i(s){const a=[];for(const o in s){const l=s[o];delete l.metadata,a.push(l)}return a}if(n){const s=i(e.textures),a=i(e.images);s.length>0&&(r.textures=s),a.length>0&&(r.images=a)}return r}clone(){return new this.constructor().copy(this)}copy(e){this.name=e.name,this.blending=e.blending,this.side=e.side,this.vertexColors=e.vertexColors,this.opacity=e.opacity,this.transparent=e.transparent,this.blendSrc=e.blendSrc,this.blendDst=e.blendDst,this.blendEquation=e.blendEquation,this.blendSrcAlpha=e.blendSrcAlpha,this.blendDstAlpha=e.blendDstAlpha,this.blendEquationAlpha=e.blendEquationAlpha,this.blendColor.copy(e.blendColor),this.blendAlpha=e.blendAlpha,this.depthFunc=e.depthFunc,this.depthTest=e.depthTest,this.depthWrite=e.depthWrite,this.stencilWriteMask=e.stencilWriteMask,this.stencilFunc=e.stencilFunc,this.stencilRef=e.stencilRef,this.stencilFuncMask=e.stencilFuncMask,this.stencilFail=e.stencilFail,this.stencilZFail=e.stencilZFail,this.stencilZPass=e.stencilZPass,this.stencilWrite=e.stencilWrite;const n=e.clippingPlanes;let r=null;if(n!==null){const i=n.length;r=new Array(i);for(let s=0;s!==i;++s)r[s]=n[s].clone()}return this.clippingPlanes=r,this.clipIntersection=e.clipIntersection,this.clipShadows=e.clipShadows,this.shadowSide=e.shadowSide,this.colorWrite=e.colorWrite,this.precision=e.precision,this.polygonOffset=e.polygonOffset,this.polygonOffsetFactor=e.polygonOffsetFactor,this.polygonOffsetUnits=e.polygonOffsetUnits,this.dithering=e.dithering,this.alphaTest=e.alphaTest,this.alphaHash=e.alphaHash,this.alphaToCoverage=e.alphaToCoverage,this.premultipliedAlpha=e.premultipliedAlpha,this.forceSinglePass=e.forceSinglePass,this.visible=e.visible,this.toneMapped=e.toneMapped,this.userData=JSON.parse(JSON.stringify(e.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(e){e===!0&&this.version++}onBuild(){console.warn("Material: onBuild() has been removed.")}}class As extends Gr{constructor(e){super(),this.isMeshBasicMaterial=!0,this.type="MeshBasicMaterial",this.color=new ct(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new ls,this.combine=cx,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapRotation.copy(e.envMapRotation),this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.fog=e.fog,this}}const Lc=Epe();function Epe(){const t=new ArrayBuffer(4),e=new Float32Array(t),n=new Uint32Array(t),r=new Uint32Array(512),i=new Uint32Array(512);for(let l=0;l<256;++l){const c=l-127;c<-27?(r[l]=0,r[l|256]=32768,i[l]=24,i[l|256]=24):c<-14?(r[l]=1024>>-c-14,r[l|256]=1024>>-c-14|32768,i[l]=-c-1,i[l|256]=-c-1):c<=15?(r[l]=c+15<<10,r[l|256]=c+15<<10|32768,i[l]=13,i[l|256]=13):c<128?(r[l]=31744,r[l|256]=64512,i[l]=24,i[l|256]=24):(r[l]=31744,r[l|256]=64512,i[l]=13,i[l|256]=13)}const s=new Uint32Array(2048),a=new Uint32Array(64),o=new Uint32Array(64);for(let l=1;l<1024;++l){let c=l<<13,d=0;for(;(c&8388608)===0;)c<<=1,d-=8388608;c&=-8388609,d+=947912704,s[l]=c|d}for(let l=1024;l<2048;++l)s[l]=939524096+(l-1024<<13);for(let l=1;l<31;++l)a[l]=l<<23;a[31]=1199570944,a[32]=2147483648;for(let l=33;l<63;++l)a[l]=2147483648+(l-32<<23);a[63]=3347054592;for(let l=1;l<64;++l)l!==32&&(o[l]=1024);return{floatView:e,uint32View:n,baseTable:r,shiftTable:i,mantissaTable:s,exponentTable:a,offsetTable:o}}function $s(t){Math.abs(t)>65504&&console.warn("THREE.DataUtils.toHalfFloat(): Value out of range."),t=Tr(t,-65504,65504),Lc.floatView[0]=t;const e=Lc.uint32View[0],n=e>>23&511;return Lc.baseTable[n]+((e&8388607)>>Lc.shiftTable[n])}function G0(t){const e=t>>10;return Lc.uint32View[0]=Lc.mantissaTable[Lc.offsetTable[e]+(t&1023)]+Lc.exponentTable[e],Lc.floatView[0]}const Ape={toHalfFloat:$s,fromHalfFloat:G0},Hr=new q,qb=new He;class Qt{constructor(e,n,r=!1){if(Array.isArray(e))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,this.name="",this.array=e,this.itemSize=n,this.count=e!==void 0?e.length/n:0,this.normalized=r,this.usage=Iy,this.updateRanges=[],this.gpuType=Qs,this.version=0}onUploadCallback(){}set needsUpdate(e){e===!0&&this.version++}setUsage(e){return this.usage=e,this}addUpdateRange(e,n){this.updateRanges.push({start:e,count:n})}clearUpdateRanges(){this.updateRanges.length=0}copy(e){return this.name=e.name,this.array=new e.array.constructor(e.array),this.itemSize=e.itemSize,this.count=e.count,this.normalized=e.normalized,this.usage=e.usage,this.gpuType=e.gpuType,this}copyAt(e,n,r){e*=this.itemSize,r*=n.itemSize;for(let i=0,s=this.itemSize;i0&&(e.userData=this.userData),this.parameters!==void 0){const l=this.parameters;for(const c in l)l[c]!==void 0&&(e[c]=l[c]);return e}e.data={attributes:{}};const n=this.index;n!==null&&(e.data.index={type:n.array.constructor.name,array:Array.prototype.slice.call(n.array)});const r=this.attributes;for(const l in r){const c=r[l];e.data.attributes[l]=c.toJSON(e.data)}const i={};let s=!1;for(const l in this.morphAttributes){const c=this.morphAttributes[l],d=[];for(let f=0,p=c.length;f0&&(i[l]=d,s=!0)}s&&(e.data.morphAttributes=i,e.data.morphTargetsRelative=this.morphTargetsRelative);const a=this.groups;a.length>0&&(e.data.groups=JSON.parse(JSON.stringify(a)));const o=this.boundingSphere;return o!==null&&(e.data.boundingSphere={center:o.center.toArray(),radius:o.radius}),e}clone(){return new this.constructor().copy(this)}copy(e){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const n={};this.name=e.name;const r=e.index;r!==null&&this.setIndex(r.clone(n));const i=e.attributes;for(const c in i){const d=i[c];this.setAttribute(c,d.clone(n))}const s=e.morphAttributes;for(const c in s){const d=[],f=s[c];for(let p=0,y=f.length;p0){const i=n[r[0]];if(i!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let s=0,a=i.length;s(e.far-e.near)**2))&&(nD.copy(s).invert(),Nf.copy(e.ray).applyMatrix4(nD),!(r.boundingBox!==null&&Nf.intersectsBox(r.boundingBox)===!1)&&this._computeIntersections(e,n,Nf)))}_computeIntersections(e,n,r){let i;const s=this.geometry,a=this.material,o=s.index,l=s.attributes.position,c=s.attributes.uv,d=s.attributes.uv1,f=s.attributes.normal,p=s.groups,y=s.drawRange;if(o!==null)if(Array.isArray(a))for(let b=0,S=p.length;bn.far?null:{distance:c,point:e_.clone(),object:t}}function t_(t,e,n,r,i,s,a,o,l,c){t.getVertexPosition(o,Yb),t.getVertexPosition(l,Zb),t.getVertexPosition(c,Qb);const d=Ope(t,e,n,r,Yb,Zb,Qb,iD);if(d){const f=new q;Ks.getBarycoord(iD,Yb,Zb,Qb,f),i&&(d.uv=Ks.getInterpolatedAttribute(i,o,l,c,f,new He)),s&&(d.uv1=Ks.getInterpolatedAttribute(s,o,l,c,f,new He)),a&&(d.normal=Ks.getInterpolatedAttribute(a,o,l,c,f,new q),d.normal.dot(r.direction)>0&&d.normal.multiplyScalar(-1));const p={a:o,b:l,c,normal:new q,materialIndex:0};Ks.getNormal(Yb,Zb,Qb,p.normal),d.face=p,d.barycoord=f}return d}class tp extends Yt{constructor(e=1,n=1,r=1,i=1,s=1,a=1){super(),this.type="BoxGeometry",this.parameters={width:e,height:n,depth:r,widthSegments:i,heightSegments:s,depthSegments:a};const o=this;i=Math.floor(i),s=Math.floor(s),a=Math.floor(a);const l=[],c=[],d=[],f=[];let p=0,y=0;b("z","y","x",-1,-1,r,n,e,a,s,0),b("z","y","x",1,-1,r,n,-e,a,s,1),b("x","z","y",1,1,e,r,n,i,a,2),b("x","z","y",1,-1,e,r,-n,i,a,3),b("x","y","z",1,-1,e,n,r,i,s,4),b("x","y","z",-1,-1,e,n,-r,i,s,5),this.setIndex(l),this.setAttribute("position",new Lt(c,3)),this.setAttribute("normal",new Lt(d,3)),this.setAttribute("uv",new Lt(f,2));function b(S,w,x,M,T,P,O,N,D,z,V){const k=P/D,j=O/z,X=P/2,ee=O/2,ie=N/2,pe=D+1,ae=z+1;let he=0,B=0;const J=new q;for(let Y=0;Y0?1:-1,d.push(J.x,J.y,J.z),f.push(G/D),f.push(1-Y/z),he+=1}}for(let Y=0;Y0&&(n.defines=this.defines),n.vertexShader=this.vertexShader,n.fragmentShader=this.fragmentShader,n.lights=this.lights,n.clipping=this.clipping;const r={};for(const i in this.extensions)this.extensions[i]===!0&&(r[i]=!0);return Object.keys(r).length>0&&(n.extensions=r),n}}class fx extends mn{constructor(){super(),this.isCamera=!0,this.type="Camera",this.matrixWorldInverse=new Ct,this.projectionMatrix=new Ct,this.projectionMatrixInverse=new Ct,this.coordinateSystem=Ml}copy(e,n){return super.copy(e,n),this.matrixWorldInverse.copy(e.matrixWorldInverse),this.projectionMatrix.copy(e.projectionMatrix),this.projectionMatrixInverse.copy(e.projectionMatrixInverse),this.coordinateSystem=e.coordinateSystem,this}getWorldDirection(e){return super.getWorldDirection(e).negate()}updateMatrixWorld(e){super.updateMatrixWorld(e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(e,n){super.updateWorldMatrix(e,n),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return new this.constructor().copy(this)}}const Yu=new q,sD=new He,aD=new He;class Pr extends fx{constructor(e=50,n=1,r=.1,i=2e3){super(),this.isPerspectiveCamera=!0,this.type="PerspectiveCamera",this.fov=e,this.zoom=1,this.near=r,this.far=i,this.focus=10,this.aspect=n,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(e,n){return super.copy(e,n),this.fov=e.fov,this.zoom=e.zoom,this.near=e.near,this.far=e.far,this.focus=e.focus,this.aspect=e.aspect,this.view=e.view===null?null:Object.assign({},e.view),this.filmGauge=e.filmGauge,this.filmOffset=e.filmOffset,this}setFocalLength(e){const n=.5*this.getFilmHeight()/e;this.fov=Dg*2*Math.atan(n),this.updateProjectionMatrix()}getFocalLength(){const e=Math.tan(Ph*.5*this.fov);return .5*this.getFilmHeight()/e}getEffectiveFOV(){return Dg*2*Math.atan(Math.tan(Ph*.5*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}getViewBounds(e,n,r){Yu.set(-1,-1,.5).applyMatrix4(this.projectionMatrixInverse),n.set(Yu.x,Yu.y).multiplyScalar(-e/Yu.z),Yu.set(1,1,.5).applyMatrix4(this.projectionMatrixInverse),r.set(Yu.x,Yu.y).multiplyScalar(-e/Yu.z)}getViewSize(e,n){return this.getViewBounds(e,sD,aD),n.subVectors(aD,sD)}setViewOffset(e,n,r,i,s,a){this.aspect=e/n,this.view===null&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=e,this.view.fullHeight=n,this.view.offsetX=r,this.view.offsetY=i,this.view.width=s,this.view.height=a,this.updateProjectionMatrix()}clearViewOffset(){this.view!==null&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const e=this.near;let n=e*Math.tan(Ph*.5*this.fov)/this.zoom,r=2*n,i=this.aspect*r,s=-.5*i;const a=this.view;if(this.view!==null&&this.view.enabled){const l=a.fullWidth,c=a.fullHeight;s+=a.offsetX*i/l,n-=a.offsetY*r/c,i*=a.width/l,r*=a.height/c}const o=this.filmOffset;o!==0&&(s+=e*o/this.getFilmWidth()),this.projectionMatrix.makePerspective(s,s+i,n,n-r,e,this.far,this.coordinateSystem),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(e){const n=super.toJSON(e);return n.object.fov=this.fov,n.object.zoom=this.zoom,n.object.near=this.near,n.object.far=this.far,n.object.focus=this.focus,n.object.aspect=this.aspect,this.view!==null&&(n.object.view=Object.assign({},this.view)),n.object.filmGauge=this.filmGauge,n.object.filmOffset=this.filmOffset,n}}const Sm=-90,Mm=1;class g6 extends mn{constructor(e,n,r){super(),this.type="CubeCamera",this.renderTarget=r,this.coordinateSystem=null,this.activeMipmapLevel=0;const i=new Pr(Sm,Mm,e,n);i.layers=this.layers,this.add(i);const s=new Pr(Sm,Mm,e,n);s.layers=this.layers,this.add(s);const a=new Pr(Sm,Mm,e,n);a.layers=this.layers,this.add(a);const o=new Pr(Sm,Mm,e,n);o.layers=this.layers,this.add(o);const l=new Pr(Sm,Mm,e,n);l.layers=this.layers,this.add(l);const c=new Pr(Sm,Mm,e,n);c.layers=this.layers,this.add(c)}updateCoordinateSystem(){const e=this.coordinateSystem,n=this.children.concat(),[r,i,s,a,o,l]=n;for(const c of n)this.remove(c);if(e===Ml)r.up.set(0,1,0),r.lookAt(1,0,0),i.up.set(0,1,0),i.lookAt(-1,0,0),s.up.set(0,0,-1),s.lookAt(0,1,0),a.up.set(0,0,1),a.lookAt(0,-1,0),o.up.set(0,1,0),o.lookAt(0,0,1),l.up.set(0,1,0),l.lookAt(0,0,-1);else if(e===ky)r.up.set(0,-1,0),r.lookAt(-1,0,0),i.up.set(0,-1,0),i.lookAt(1,0,0),s.up.set(0,0,1),s.lookAt(0,1,0),a.up.set(0,0,-1),a.lookAt(0,-1,0),o.up.set(0,-1,0),o.lookAt(0,0,1),l.up.set(0,-1,0),l.lookAt(0,0,-1);else throw new Error("THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: "+e);for(const c of n)this.add(c),c.updateMatrixWorld()}update(e,n){this.parent===null&&this.updateMatrixWorld();const{renderTarget:r,activeMipmapLevel:i}=this;this.coordinateSystem!==e.coordinateSystem&&(this.coordinateSystem=e.coordinateSystem,this.updateCoordinateSystem());const[s,a,o,l,c,d]=this.children,f=e.getRenderTarget(),p=e.getActiveCubeFace(),y=e.getActiveMipmapLevel(),b=e.xr.enabled;e.xr.enabled=!1;const S=r.texture.generateMipmaps;r.texture.generateMipmaps=!1,e.setRenderTarget(r,0,i),e.render(n,s),e.setRenderTarget(r,1,i),e.render(n,a),e.setRenderTarget(r,2,i),e.render(n,o),e.setRenderTarget(r,3,i),e.render(n,l),e.setRenderTarget(r,4,i),e.render(n,c),r.texture.generateMipmaps=S,e.setRenderTarget(r,5,i),e.render(n,d),e.setRenderTarget(f,p,y),e.xr.enabled=b,r.texture.needsPMREMUpdate=!0}}class hx extends fr{constructor(e,n,r,i,s,a,o,l,c,d){e=e!==void 0?e:[],n=n!==void 0?n:Zc,super(e,n,r,i,s,a,o,l,c,d),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(e){this.image=e}}class v6 extends Vo{constructor(e=1,n={}){super(e,e,n),this.isWebGLCubeRenderTarget=!0;const r={width:e,height:e,depth:1},i=[r,r,r,r,r,r];this.texture=new hx(i,n.mapping,n.wrapS,n.wrapT,n.magFilter,n.minFilter,n.format,n.type,n.anisotropy,n.colorSpace),this.texture.isRenderTargetTexture=!0,this.texture.generateMipmaps=n.generateMipmaps!==void 0?n.generateMipmaps:!1,this.texture.minFilter=n.minFilter!==void 0?n.minFilter:Cr}fromEquirectangularTexture(e,n){this.texture.type=n.type,this.texture.colorSpace=n.colorSpace,this.texture.generateMipmaps=n.generateMipmaps,this.texture.minFilter=n.minFilter,this.texture.magFilter=n.magFilter;const r={uniforms:{tEquirect:{value:null}},vertexShader:` - - varying vec3 vWorldDirection; - - vec3 transformDirection( in vec3 dir, in mat4 matrix ) { - - return normalize( ( matrix * vec4( dir, 0.0 ) ).xyz ); - - } - - void main() { - - vWorldDirection = transformDirection( position, modelMatrix ); - - #include - #include - - } - `,fragmentShader:` - - uniform sampler2D tEquirect; - - varying vec3 vWorldDirection; - - #include - - void main() { - - vec3 direction = normalize( vWorldDirection ); - - vec2 sampleUV = equirectUv( direction ); - - gl_FragColor = texture2D( tEquirect, sampleUV ); - - } - `},i=new tp(5,5,5),s=new Ya({name:"CubemapFromEquirect",uniforms:Ug(r.uniforms),vertexShader:r.vertexShader,fragmentShader:r.fragmentShader,side:as,blending:Vc});s.uniforms.tEquirect.value=n;const a=new xr(i,s),o=n.minFilter;return n.minFilter===$a&&(n.minFilter=Cr),new g6(1,10,this).update(e,a),n.minFilter=o,a.geometry.dispose(),a.material.dispose(),this}clear(e,n,r,i){const s=e.getRenderTarget();for(let a=0;a<6;a++)e.setRenderTarget(this,a),e.clear(n,r,i);e.setRenderTarget(s)}}const mA=new q,jpe=new q,Fpe=new $t;class Rc{constructor(e=new q(1,0,0),n=0){this.isPlane=!0,this.normal=e,this.constant=n}set(e,n){return this.normal.copy(e),this.constant=n,this}setComponents(e,n,r,i){return this.normal.set(e,n,r),this.constant=i,this}setFromNormalAndCoplanarPoint(e,n){return this.normal.copy(e),this.constant=-n.dot(this.normal),this}setFromCoplanarPoints(e,n,r){const i=mA.subVectors(r,n).cross(jpe.subVectors(e,n)).normalize();return this.setFromNormalAndCoplanarPoint(i,e),this}copy(e){return this.normal.copy(e.normal),this.constant=e.constant,this}normalize(){const e=1/this.normal.length();return this.normal.multiplyScalar(e),this.constant*=e,this}negate(){return this.constant*=-1,this.normal.negate(),this}distanceToPoint(e){return this.normal.dot(e)+this.constant}distanceToSphere(e){return this.distanceToPoint(e.center)-e.radius}projectPoint(e,n){return n.copy(e).addScaledVector(this.normal,-this.distanceToPoint(e))}intersectLine(e,n){const r=e.delta(mA),i=this.normal.dot(r);if(i===0)return this.distanceToPoint(e.start)===0?n.copy(e.start):null;const s=-(e.start.dot(this.normal)+this.constant)/i;return s<0||s>1?null:n.copy(e.start).addScaledVector(r,s)}intersectsLine(e){const n=this.distanceToPoint(e.start),r=this.distanceToPoint(e.end);return n<0&&r>0||r<0&&n>0}intersectsBox(e){return e.intersectsPlane(this)}intersectsSphere(e){return e.intersectsPlane(this)}coplanarPoint(e){return e.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(e,n){const r=n||Fpe.getNormalMatrix(e),i=this.coplanarPoint(mA).applyMatrix4(e),s=this.normal.applyMatrix3(r).normalize();return this.constant=-i.dot(s),this}translate(e){return this.constant-=e.dot(this.normal),this}equals(e){return e.normal.equals(this.normal)&&e.constant===this.constant}clone(){return new this.constructor().copy(this)}}const If=new Hi,n_=new q;class px{constructor(e=new Rc,n=new Rc,r=new Rc,i=new Rc,s=new Rc,a=new Rc){this.planes=[e,n,r,i,s,a]}set(e,n,r,i,s,a){const o=this.planes;return o[0].copy(e),o[1].copy(n),o[2].copy(r),o[3].copy(i),o[4].copy(s),o[5].copy(a),this}copy(e){const n=this.planes;for(let r=0;r<6;r++)n[r].copy(e.planes[r]);return this}setFromProjectionMatrix(e,n=Ml){const r=this.planes,i=e.elements,s=i[0],a=i[1],o=i[2],l=i[3],c=i[4],d=i[5],f=i[6],p=i[7],y=i[8],b=i[9],S=i[10],w=i[11],x=i[12],M=i[13],T=i[14],P=i[15];if(r[0].setComponents(l-s,p-c,w-y,P-x).normalize(),r[1].setComponents(l+s,p+c,w+y,P+x).normalize(),r[2].setComponents(l+a,p+d,w+b,P+M).normalize(),r[3].setComponents(l-a,p-d,w-b,P-M).normalize(),r[4].setComponents(l-o,p-f,w-S,P-T).normalize(),n===Ml)r[5].setComponents(l+o,p+f,w+S,P+T).normalize();else if(n===ky)r[5].setComponents(o,f,S,T).normalize();else throw new Error("THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: "+n);return this}intersectsObject(e){if(e.boundingSphere!==void 0)e.boundingSphere===null&&e.computeBoundingSphere(),If.copy(e.boundingSphere).applyMatrix4(e.matrixWorld);else{const n=e.geometry;n.boundingSphere===null&&n.computeBoundingSphere(),If.copy(n.boundingSphere).applyMatrix4(e.matrixWorld)}return this.intersectsSphere(If)}intersectsSprite(e){return If.center.set(0,0,0),If.radius=.7071067811865476,If.applyMatrix4(e.matrixWorld),this.intersectsSphere(If)}intersectsSphere(e){const n=this.planes,r=e.center,i=-e.radius;for(let s=0;s<6;s++)if(n[s].distanceToPoint(r)0?e.max.x:e.min.x,n_.y=i.normal.y>0?e.max.y:e.min.y,n_.z=i.normal.z>0?e.max.z:e.min.z,i.distanceToPoint(n_)<0)return!1}return!0}containsPoint(e){const n=this.planes;for(let r=0;r<6;r++)if(n[r].distanceToPoint(e)<0)return!1;return!0}clone(){return new this.constructor().copy(this)}}function y6(){let t=null,e=!1,n=null,r=null;function i(s,a){n(s,a),r=t.requestAnimationFrame(i)}return{start:function(){e!==!0&&n!==null&&(r=t.requestAnimationFrame(i),e=!0)},stop:function(){t.cancelAnimationFrame(r),e=!1},setAnimationLoop:function(s){n=s},setContext:function(s){t=s}}}function zpe(t){const e=new WeakMap;function n(o,l){const c=o.array,d=o.usage,f=c.byteLength,p=t.createBuffer();t.bindBuffer(l,p),t.bufferData(l,c,d),o.onUploadCallback();let y;if(c instanceof Float32Array)y=t.FLOAT;else if(c instanceof Uint16Array)o.isFloat16BufferAttribute?y=t.HALF_FLOAT:y=t.UNSIGNED_SHORT;else if(c instanceof Int16Array)y=t.SHORT;else if(c instanceof Uint32Array)y=t.UNSIGNED_INT;else if(c instanceof Int32Array)y=t.INT;else if(c instanceof Int8Array)y=t.BYTE;else if(c instanceof Uint8Array)y=t.UNSIGNED_BYTE;else if(c instanceof Uint8ClampedArray)y=t.UNSIGNED_BYTE;else throw new Error("THREE.WebGLAttributes: Unsupported buffer data format: "+c);return{buffer:p,type:y,bytesPerElement:c.BYTES_PER_ELEMENT,version:o.version,size:f}}function r(o,l,c){const d=l.array,f=l.updateRanges;if(t.bindBuffer(c,o),f.length===0)t.bufferSubData(c,0,d);else{f.sort((y,b)=>y.start-b.start);let p=0;for(let y=1;y 0 - vec4 plane; - #ifdef ALPHA_TO_COVERAGE - float distanceToPlane, distanceGradient; - float clipOpacity = 1.0; - #pragma unroll_loop_start - for ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) { - plane = clippingPlanes[ i ]; - distanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w; - distanceGradient = fwidth( distanceToPlane ) / 2.0; - clipOpacity *= smoothstep( - distanceGradient, distanceGradient, distanceToPlane ); - if ( clipOpacity == 0.0 ) discard; - } - #pragma unroll_loop_end - #if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES - float unionClipOpacity = 1.0; - #pragma unroll_loop_start - for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) { - plane = clippingPlanes[ i ]; - distanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w; - distanceGradient = fwidth( distanceToPlane ) / 2.0; - unionClipOpacity *= 1.0 - smoothstep( - distanceGradient, distanceGradient, distanceToPlane ); - } - #pragma unroll_loop_end - clipOpacity *= 1.0 - unionClipOpacity; - #endif - diffuseColor.a *= clipOpacity; - if ( diffuseColor.a == 0.0 ) discard; - #else - #pragma unroll_loop_start - for ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) { - plane = clippingPlanes[ i ]; - if ( dot( vClipPosition, plane.xyz ) > plane.w ) discard; - } - #pragma unroll_loop_end - #if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES - bool clipped = true; - #pragma unroll_loop_start - for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) { - plane = clippingPlanes[ i ]; - clipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped; - } - #pragma unroll_loop_end - if ( clipped ) discard; - #endif - #endif -#endif`,rme=`#if NUM_CLIPPING_PLANES > 0 - varying vec3 vClipPosition; - uniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ]; -#endif`,ime=`#if NUM_CLIPPING_PLANES > 0 - varying vec3 vClipPosition; -#endif`,sme=`#if NUM_CLIPPING_PLANES > 0 - vClipPosition = - mvPosition.xyz; -#endif`,ame=`#if defined( USE_COLOR_ALPHA ) - diffuseColor *= vColor; -#elif defined( USE_COLOR ) - diffuseColor.rgb *= vColor; -#endif`,ome=`#if defined( USE_COLOR_ALPHA ) - varying vec4 vColor; -#elif defined( USE_COLOR ) - varying vec3 vColor; -#endif`,lme=`#if defined( USE_COLOR_ALPHA ) - varying vec4 vColor; -#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR ) - varying vec3 vColor; -#endif`,cme=`#if defined( USE_COLOR_ALPHA ) - vColor = vec4( 1.0 ); -#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR ) - vColor = vec3( 1.0 ); -#endif -#ifdef USE_COLOR - vColor *= color; -#endif -#ifdef USE_INSTANCING_COLOR - vColor.xyz *= instanceColor.xyz; -#endif -#ifdef USE_BATCHING_COLOR - vec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) ); - vColor.xyz *= batchingColor.xyz; -#endif`,ume=`#define PI 3.141592653589793 -#define PI2 6.283185307179586 -#define PI_HALF 1.5707963267948966 -#define RECIPROCAL_PI 0.3183098861837907 -#define RECIPROCAL_PI2 0.15915494309189535 -#define EPSILON 1e-6 -#ifndef saturate -#define saturate( a ) clamp( a, 0.0, 1.0 ) -#endif -#define whiteComplement( a ) ( 1.0 - saturate( a ) ) -float pow2( const in float x ) { return x*x; } -vec3 pow2( const in vec3 x ) { return x*x; } -float pow3( const in float x ) { return x*x*x; } -float pow4( const in float x ) { float x2 = x*x; return x2*x2; } -float max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); } -float average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); } -highp float rand( const in vec2 uv ) { - const highp float a = 12.9898, b = 78.233, c = 43758.5453; - highp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI ); - return fract( sin( sn ) * c ); -} -#ifdef HIGH_PRECISION - float precisionSafeLength( vec3 v ) { return length( v ); } -#else - float precisionSafeLength( vec3 v ) { - float maxComponent = max3( abs( v ) ); - return length( v / maxComponent ) * maxComponent; - } -#endif -struct IncidentLight { - vec3 color; - vec3 direction; - bool visible; -}; -struct ReflectedLight { - vec3 directDiffuse; - vec3 directSpecular; - vec3 indirectDiffuse; - vec3 indirectSpecular; -}; -#ifdef USE_ALPHAHASH - varying vec3 vPosition; -#endif -vec3 transformDirection( in vec3 dir, in mat4 matrix ) { - return normalize( ( matrix * vec4( dir, 0.0 ) ).xyz ); -} -vec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) { - return normalize( ( vec4( dir, 0.0 ) * matrix ).xyz ); -} -mat3 transposeMat3( const in mat3 m ) { - mat3 tmp; - tmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x ); - tmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y ); - tmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z ); - return tmp; -} -bool isPerspectiveMatrix( mat4 m ) { - return m[ 2 ][ 3 ] == - 1.0; -} -vec2 equirectUv( in vec3 dir ) { - float u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5; - float v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5; - return vec2( u, v ); -} -vec3 BRDF_Lambert( const in vec3 diffuseColor ) { - return RECIPROCAL_PI * diffuseColor; -} -vec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) { - float fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH ); - return f0 * ( 1.0 - fresnel ) + ( f90 * fresnel ); -} -float F_Schlick( const in float f0, const in float f90, const in float dotVH ) { - float fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH ); - return f0 * ( 1.0 - fresnel ) + ( f90 * fresnel ); -} // validated`,dme=`#ifdef ENVMAP_TYPE_CUBE_UV - #define cubeUV_minMipLevel 4.0 - #define cubeUV_minTileSize 16.0 - float getFace( vec3 direction ) { - vec3 absDirection = abs( direction ); - float face = - 1.0; - if ( absDirection.x > absDirection.z ) { - if ( absDirection.x > absDirection.y ) - face = direction.x > 0.0 ? 0.0 : 3.0; - else - face = direction.y > 0.0 ? 1.0 : 4.0; - } else { - if ( absDirection.z > absDirection.y ) - face = direction.z > 0.0 ? 2.0 : 5.0; - else - face = direction.y > 0.0 ? 1.0 : 4.0; - } - return face; - } - vec2 getUV( vec3 direction, float face ) { - vec2 uv; - if ( face == 0.0 ) { - uv = vec2( direction.z, direction.y ) / abs( direction.x ); - } else if ( face == 1.0 ) { - uv = vec2( - direction.x, - direction.z ) / abs( direction.y ); - } else if ( face == 2.0 ) { - uv = vec2( - direction.x, direction.y ) / abs( direction.z ); - } else if ( face == 3.0 ) { - uv = vec2( - direction.z, direction.y ) / abs( direction.x ); - } else if ( face == 4.0 ) { - uv = vec2( - direction.x, direction.z ) / abs( direction.y ); - } else { - uv = vec2( direction.x, direction.y ) / abs( direction.z ); - } - return 0.5 * ( uv + 1.0 ); - } - vec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) { - float face = getFace( direction ); - float filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 ); - mipInt = max( mipInt, cubeUV_minMipLevel ); - float faceSize = exp2( mipInt ); - highp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0; - if ( face > 2.0 ) { - uv.y += faceSize; - face -= 3.0; - } - uv.x += face * faceSize; - uv.x += filterInt * 3.0 * cubeUV_minTileSize; - uv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize ); - uv.x *= CUBEUV_TEXEL_WIDTH; - uv.y *= CUBEUV_TEXEL_HEIGHT; - #ifdef texture2DGradEXT - return texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb; - #else - return texture2D( envMap, uv ).rgb; - #endif - } - #define cubeUV_r0 1.0 - #define cubeUV_m0 - 2.0 - #define cubeUV_r1 0.8 - #define cubeUV_m1 - 1.0 - #define cubeUV_r4 0.4 - #define cubeUV_m4 2.0 - #define cubeUV_r5 0.305 - #define cubeUV_m5 3.0 - #define cubeUV_r6 0.21 - #define cubeUV_m6 4.0 - float roughnessToMip( float roughness ) { - float mip = 0.0; - if ( roughness >= cubeUV_r1 ) { - mip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0; - } else if ( roughness >= cubeUV_r4 ) { - mip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1; - } else if ( roughness >= cubeUV_r5 ) { - mip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4; - } else if ( roughness >= cubeUV_r6 ) { - mip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5; - } else { - mip = - 2.0 * log2( 1.16 * roughness ); } - return mip; - } - vec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) { - float mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP ); - float mipF = fract( mip ); - float mipInt = floor( mip ); - vec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt ); - if ( mipF == 0.0 ) { - return vec4( color0, 1.0 ); - } else { - vec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 ); - return vec4( mix( color0, color1, mipF ), 1.0 ); - } - } -#endif`,fme=`vec3 transformedNormal = objectNormal; -#ifdef USE_TANGENT - vec3 transformedTangent = objectTangent; -#endif -#ifdef USE_BATCHING - mat3 bm = mat3( batchingMatrix ); - transformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) ); - transformedNormal = bm * transformedNormal; - #ifdef USE_TANGENT - transformedTangent = bm * transformedTangent; - #endif -#endif -#ifdef USE_INSTANCING - mat3 im = mat3( instanceMatrix ); - transformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) ); - transformedNormal = im * transformedNormal; - #ifdef USE_TANGENT - transformedTangent = im * transformedTangent; - #endif -#endif -transformedNormal = normalMatrix * transformedNormal; -#ifdef FLIP_SIDED - transformedNormal = - transformedNormal; -#endif -#ifdef USE_TANGENT - transformedTangent = ( modelViewMatrix * vec4( transformedTangent, 0.0 ) ).xyz; - #ifdef FLIP_SIDED - transformedTangent = - transformedTangent; - #endif -#endif`,hme=`#ifdef USE_DISPLACEMENTMAP - uniform sampler2D displacementMap; - uniform float displacementScale; - uniform float displacementBias; -#endif`,pme=`#ifdef USE_DISPLACEMENTMAP - transformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias ); -#endif`,mme=`#ifdef USE_EMISSIVEMAP - vec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv ); - totalEmissiveRadiance *= emissiveColor.rgb; -#endif`,gme=`#ifdef USE_EMISSIVEMAP - uniform sampler2D emissiveMap; -#endif`,vme="gl_FragColor = linearToOutputTexel( gl_FragColor );",yme=` -const mat3 LINEAR_SRGB_TO_LINEAR_DISPLAY_P3 = mat3( - vec3( 0.8224621, 0.177538, 0.0 ), - vec3( 0.0331941, 0.9668058, 0.0 ), - vec3( 0.0170827, 0.0723974, 0.9105199 ) -); -const mat3 LINEAR_DISPLAY_P3_TO_LINEAR_SRGB = mat3( - vec3( 1.2249401, - 0.2249404, 0.0 ), - vec3( - 0.0420569, 1.0420571, 0.0 ), - vec3( - 0.0196376, - 0.0786361, 1.0982735 ) -); -vec4 LinearSRGBToLinearDisplayP3( in vec4 value ) { - return vec4( value.rgb * LINEAR_SRGB_TO_LINEAR_DISPLAY_P3, value.a ); -} -vec4 LinearDisplayP3ToLinearSRGB( in vec4 value ) { - return vec4( value.rgb * LINEAR_DISPLAY_P3_TO_LINEAR_SRGB, value.a ); -} -vec4 LinearTransferOETF( in vec4 value ) { - return value; -} -vec4 sRGBTransferOETF( in vec4 value ) { - return vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a ); -}`,xme=`#ifdef USE_ENVMAP - #ifdef ENV_WORLDPOS - vec3 cameraToFrag; - if ( isOrthographic ) { - cameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) ); - } else { - cameraToFrag = normalize( vWorldPosition - cameraPosition ); - } - vec3 worldNormal = inverseTransformDirection( normal, viewMatrix ); - #ifdef ENVMAP_MODE_REFLECTION - vec3 reflectVec = reflect( cameraToFrag, worldNormal ); - #else - vec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio ); - #endif - #else - vec3 reflectVec = vReflect; - #endif - #ifdef ENVMAP_TYPE_CUBE - vec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) ); - #else - vec4 envColor = vec4( 0.0 ); - #endif - #ifdef ENVMAP_BLENDING_MULTIPLY - outgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity ); - #elif defined( ENVMAP_BLENDING_MIX ) - outgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity ); - #elif defined( ENVMAP_BLENDING_ADD ) - outgoingLight += envColor.xyz * specularStrength * reflectivity; - #endif -#endif`,bme=`#ifdef USE_ENVMAP - uniform float envMapIntensity; - uniform float flipEnvMap; - uniform mat3 envMapRotation; - #ifdef ENVMAP_TYPE_CUBE - uniform samplerCube envMap; - #else - uniform sampler2D envMap; - #endif - -#endif`,_me=`#ifdef USE_ENVMAP - uniform float reflectivity; - #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT ) - #define ENV_WORLDPOS - #endif - #ifdef ENV_WORLDPOS - varying vec3 vWorldPosition; - uniform float refractionRatio; - #else - varying vec3 vReflect; - #endif -#endif`,wme=`#ifdef USE_ENVMAP - #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT ) - #define ENV_WORLDPOS - #endif - #ifdef ENV_WORLDPOS - - varying vec3 vWorldPosition; - #else - varying vec3 vReflect; - uniform float refractionRatio; - #endif -#endif`,Sme=`#ifdef USE_ENVMAP - #ifdef ENV_WORLDPOS - vWorldPosition = worldPosition.xyz; - #else - vec3 cameraToVertex; - if ( isOrthographic ) { - cameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) ); - } else { - cameraToVertex = normalize( worldPosition.xyz - cameraPosition ); - } - vec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix ); - #ifdef ENVMAP_MODE_REFLECTION - vReflect = reflect( cameraToVertex, worldNormal ); - #else - vReflect = refract( cameraToVertex, worldNormal, refractionRatio ); - #endif - #endif -#endif`,Mme=`#ifdef USE_FOG - vFogDepth = - mvPosition.z; -#endif`,Eme=`#ifdef USE_FOG - varying float vFogDepth; -#endif`,Ame=`#ifdef USE_FOG - #ifdef FOG_EXP2 - float fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth ); - #else - float fogFactor = smoothstep( fogNear, fogFar, vFogDepth ); - #endif - gl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor ); -#endif`,Tme=`#ifdef USE_FOG - uniform vec3 fogColor; - varying float vFogDepth; - #ifdef FOG_EXP2 - uniform float fogDensity; - #else - uniform float fogNear; - uniform float fogFar; - #endif -#endif`,Pme=`#ifdef USE_GRADIENTMAP - uniform sampler2D gradientMap; -#endif -vec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) { - float dotNL = dot( normal, lightDirection ); - vec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 ); - #ifdef USE_GRADIENTMAP - return vec3( texture2D( gradientMap, coord ).r ); - #else - vec2 fw = fwidth( coord ) * 0.5; - return mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) ); - #endif -}`,Cme=`#ifdef USE_LIGHTMAP - uniform sampler2D lightMap; - uniform float lightMapIntensity; -#endif`,Rme=`LambertMaterial material; -material.diffuseColor = diffuseColor.rgb; -material.specularStrength = specularStrength;`,Nme=`varying vec3 vViewPosition; -struct LambertMaterial { - vec3 diffuseColor; - float specularStrength; -}; -void RE_Direct_Lambert( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) { - float dotNL = saturate( dot( geometryNormal, directLight.direction ) ); - vec3 irradiance = dotNL * directLight.color; - reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); -} -void RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) { - reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); -} -#define RE_Direct RE_Direct_Lambert -#define RE_IndirectDiffuse RE_IndirectDiffuse_Lambert`,Ime=`uniform bool receiveShadow; -uniform vec3 ambientLightColor; -#if defined( USE_LIGHT_PROBES ) - uniform vec3 lightProbe[ 9 ]; -#endif -vec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) { - float x = normal.x, y = normal.y, z = normal.z; - vec3 result = shCoefficients[ 0 ] * 0.886227; - result += shCoefficients[ 1 ] * 2.0 * 0.511664 * y; - result += shCoefficients[ 2 ] * 2.0 * 0.511664 * z; - result += shCoefficients[ 3 ] * 2.0 * 0.511664 * x; - result += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y; - result += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z; - result += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 ); - result += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z; - result += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y ); - return result; -} -vec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) { - vec3 worldNormal = inverseTransformDirection( normal, viewMatrix ); - vec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe ); - return irradiance; -} -vec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) { - vec3 irradiance = ambientLightColor; - return irradiance; -} -float getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) { - float distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 ); - if ( cutoffDistance > 0.0 ) { - distanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) ); - } - return distanceFalloff; -} -float getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) { - return smoothstep( coneCosine, penumbraCosine, angleCosine ); -} -#if NUM_DIR_LIGHTS > 0 - struct DirectionalLight { - vec3 direction; - vec3 color; - }; - uniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ]; - void getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) { - light.color = directionalLight.color; - light.direction = directionalLight.direction; - light.visible = true; - } -#endif -#if NUM_POINT_LIGHTS > 0 - struct PointLight { - vec3 position; - vec3 color; - float distance; - float decay; - }; - uniform PointLight pointLights[ NUM_POINT_LIGHTS ]; - void getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) { - vec3 lVector = pointLight.position - geometryPosition; - light.direction = normalize( lVector ); - float lightDistance = length( lVector ); - light.color = pointLight.color; - light.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay ); - light.visible = ( light.color != vec3( 0.0 ) ); - } -#endif -#if NUM_SPOT_LIGHTS > 0 - struct SpotLight { - vec3 position; - vec3 direction; - vec3 color; - float distance; - float decay; - float coneCos; - float penumbraCos; - }; - uniform SpotLight spotLights[ NUM_SPOT_LIGHTS ]; - void getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) { - vec3 lVector = spotLight.position - geometryPosition; - light.direction = normalize( lVector ); - float angleCos = dot( light.direction, spotLight.direction ); - float spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos ); - if ( spotAttenuation > 0.0 ) { - float lightDistance = length( lVector ); - light.color = spotLight.color * spotAttenuation; - light.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay ); - light.visible = ( light.color != vec3( 0.0 ) ); - } else { - light.color = vec3( 0.0 ); - light.visible = false; - } - } -#endif -#if NUM_RECT_AREA_LIGHTS > 0 - struct RectAreaLight { - vec3 color; - vec3 position; - vec3 halfWidth; - vec3 halfHeight; - }; - uniform sampler2D ltc_1; uniform sampler2D ltc_2; - uniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ]; -#endif -#if NUM_HEMI_LIGHTS > 0 - struct HemisphereLight { - vec3 direction; - vec3 skyColor; - vec3 groundColor; - }; - uniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ]; - vec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) { - float dotNL = dot( normal, hemiLight.direction ); - float hemiDiffuseWeight = 0.5 * dotNL + 0.5; - vec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight ); - return irradiance; - } -#endif`,kme=`#ifdef USE_ENVMAP - vec3 getIBLIrradiance( const in vec3 normal ) { - #ifdef ENVMAP_TYPE_CUBE_UV - vec3 worldNormal = inverseTransformDirection( normal, viewMatrix ); - vec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 ); - return PI * envMapColor.rgb * envMapIntensity; - #else - return vec3( 0.0 ); - #endif - } - vec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) { - #ifdef ENVMAP_TYPE_CUBE_UV - vec3 reflectVec = reflect( - viewDir, normal ); - reflectVec = normalize( mix( reflectVec, normal, roughness * roughness) ); - reflectVec = inverseTransformDirection( reflectVec, viewMatrix ); - vec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness ); - return envMapColor.rgb * envMapIntensity; - #else - return vec3( 0.0 ); - #endif - } - #ifdef USE_ANISOTROPY - vec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) { - #ifdef ENVMAP_TYPE_CUBE_UV - vec3 bentNormal = cross( bitangent, viewDir ); - bentNormal = normalize( cross( bentNormal, bitangent ) ); - bentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) ); - return getIBLRadiance( viewDir, bentNormal, roughness ); - #else - return vec3( 0.0 ); - #endif - } - #endif -#endif`,Ome=`ToonMaterial material; -material.diffuseColor = diffuseColor.rgb;`,Lme=`varying vec3 vViewPosition; -struct ToonMaterial { - vec3 diffuseColor; -}; -void RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) { - vec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color; - reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); -} -void RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) { - reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); -} -#define RE_Direct RE_Direct_Toon -#define RE_IndirectDiffuse RE_IndirectDiffuse_Toon`,Dme=`BlinnPhongMaterial material; -material.diffuseColor = diffuseColor.rgb; -material.specularColor = specular; -material.specularShininess = shininess; -material.specularStrength = specularStrength;`,Ume=`varying vec3 vViewPosition; -struct BlinnPhongMaterial { - vec3 diffuseColor; - vec3 specularColor; - float specularShininess; - float specularStrength; -}; -void RE_Direct_BlinnPhong( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) { - float dotNL = saturate( dot( geometryNormal, directLight.direction ) ); - vec3 irradiance = dotNL * directLight.color; - reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); - reflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength; -} -void RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) { - reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); -} -#define RE_Direct RE_Direct_BlinnPhong -#define RE_IndirectDiffuse RE_IndirectDiffuse_BlinnPhong`,jme=`PhysicalMaterial material; -material.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor ); -vec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) ); -float geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z ); -material.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness; -material.roughness = min( material.roughness, 1.0 ); -#ifdef IOR - material.ior = ior; - #ifdef USE_SPECULAR - float specularIntensityFactor = specularIntensity; - vec3 specularColorFactor = specularColor; - #ifdef USE_SPECULAR_COLORMAP - specularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb; - #endif - #ifdef USE_SPECULAR_INTENSITYMAP - specularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a; - #endif - material.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor ); - #else - float specularIntensityFactor = 1.0; - vec3 specularColorFactor = vec3( 1.0 ); - material.specularF90 = 1.0; - #endif - material.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor ); -#else - material.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor ); - material.specularF90 = 1.0; -#endif -#ifdef USE_CLEARCOAT - material.clearcoat = clearcoat; - material.clearcoatRoughness = clearcoatRoughness; - material.clearcoatF0 = vec3( 0.04 ); - material.clearcoatF90 = 1.0; - #ifdef USE_CLEARCOATMAP - material.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x; - #endif - #ifdef USE_CLEARCOAT_ROUGHNESSMAP - material.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y; - #endif - material.clearcoat = saturate( material.clearcoat ); material.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 ); - material.clearcoatRoughness += geometryRoughness; - material.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 ); -#endif -#ifdef USE_DISPERSION - material.dispersion = dispersion; -#endif -#ifdef USE_IRIDESCENCE - material.iridescence = iridescence; - material.iridescenceIOR = iridescenceIOR; - #ifdef USE_IRIDESCENCEMAP - material.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r; - #endif - #ifdef USE_IRIDESCENCE_THICKNESSMAP - material.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum; - #else - material.iridescenceThickness = iridescenceThicknessMaximum; - #endif -#endif -#ifdef USE_SHEEN - material.sheenColor = sheenColor; - #ifdef USE_SHEEN_COLORMAP - material.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb; - #endif - material.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 ); - #ifdef USE_SHEEN_ROUGHNESSMAP - material.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a; - #endif -#endif -#ifdef USE_ANISOTROPY - #ifdef USE_ANISOTROPYMAP - mat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x ); - vec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb; - vec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b; - #else - vec2 anisotropyV = anisotropyVector; - #endif - material.anisotropy = length( anisotropyV ); - if( material.anisotropy == 0.0 ) { - anisotropyV = vec2( 1.0, 0.0 ); - } else { - anisotropyV /= material.anisotropy; - material.anisotropy = saturate( material.anisotropy ); - } - material.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) ); - material.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y; - material.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y; -#endif`,Fme=`struct PhysicalMaterial { - vec3 diffuseColor; - float roughness; - vec3 specularColor; - float specularF90; - float dispersion; - #ifdef USE_CLEARCOAT - float clearcoat; - float clearcoatRoughness; - vec3 clearcoatF0; - float clearcoatF90; - #endif - #ifdef USE_IRIDESCENCE - float iridescence; - float iridescenceIOR; - float iridescenceThickness; - vec3 iridescenceFresnel; - vec3 iridescenceF0; - #endif - #ifdef USE_SHEEN - vec3 sheenColor; - float sheenRoughness; - #endif - #ifdef IOR - float ior; - #endif - #ifdef USE_TRANSMISSION - float transmission; - float transmissionAlpha; - float thickness; - float attenuationDistance; - vec3 attenuationColor; - #endif - #ifdef USE_ANISOTROPY - float anisotropy; - float alphaT; - vec3 anisotropyT; - vec3 anisotropyB; - #endif -}; -vec3 clearcoatSpecularDirect = vec3( 0.0 ); -vec3 clearcoatSpecularIndirect = vec3( 0.0 ); -vec3 sheenSpecularDirect = vec3( 0.0 ); -vec3 sheenSpecularIndirect = vec3(0.0 ); -vec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) { - float x = clamp( 1.0 - dotVH, 0.0, 1.0 ); - float x2 = x * x; - float x5 = clamp( x * x2 * x2, 0.0, 0.9999 ); - return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 ); -} -float V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) { - float a2 = pow2( alpha ); - float gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) ); - float gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) ); - return 0.5 / max( gv + gl, EPSILON ); -} -float D_GGX( const in float alpha, const in float dotNH ) { - float a2 = pow2( alpha ); - float denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0; - return RECIPROCAL_PI * a2 / pow2( denom ); -} -#ifdef USE_ANISOTROPY - float V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) { - float gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) ); - float gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) ); - float v = 0.5 / ( gv + gl ); - return saturate(v); - } - float D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) { - float a2 = alphaT * alphaB; - highp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH ); - highp float v2 = dot( v, v ); - float w2 = a2 / v2; - return RECIPROCAL_PI * a2 * pow2 ( w2 ); - } -#endif -#ifdef USE_CLEARCOAT - vec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) { - vec3 f0 = material.clearcoatF0; - float f90 = material.clearcoatF90; - float roughness = material.clearcoatRoughness; - float alpha = pow2( roughness ); - vec3 halfDir = normalize( lightDir + viewDir ); - float dotNL = saturate( dot( normal, lightDir ) ); - float dotNV = saturate( dot( normal, viewDir ) ); - float dotNH = saturate( dot( normal, halfDir ) ); - float dotVH = saturate( dot( viewDir, halfDir ) ); - vec3 F = F_Schlick( f0, f90, dotVH ); - float V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV ); - float D = D_GGX( alpha, dotNH ); - return F * ( V * D ); - } -#endif -vec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) { - vec3 f0 = material.specularColor; - float f90 = material.specularF90; - float roughness = material.roughness; - float alpha = pow2( roughness ); - vec3 halfDir = normalize( lightDir + viewDir ); - float dotNL = saturate( dot( normal, lightDir ) ); - float dotNV = saturate( dot( normal, viewDir ) ); - float dotNH = saturate( dot( normal, halfDir ) ); - float dotVH = saturate( dot( viewDir, halfDir ) ); - vec3 F = F_Schlick( f0, f90, dotVH ); - #ifdef USE_IRIDESCENCE - F = mix( F, material.iridescenceFresnel, material.iridescence ); - #endif - #ifdef USE_ANISOTROPY - float dotTL = dot( material.anisotropyT, lightDir ); - float dotTV = dot( material.anisotropyT, viewDir ); - float dotTH = dot( material.anisotropyT, halfDir ); - float dotBL = dot( material.anisotropyB, lightDir ); - float dotBV = dot( material.anisotropyB, viewDir ); - float dotBH = dot( material.anisotropyB, halfDir ); - float V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL ); - float D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH ); - #else - float V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV ); - float D = D_GGX( alpha, dotNH ); - #endif - return F * ( V * D ); -} -vec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) { - const float LUT_SIZE = 64.0; - const float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE; - const float LUT_BIAS = 0.5 / LUT_SIZE; - float dotNV = saturate( dot( N, V ) ); - vec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) ); - uv = uv * LUT_SCALE + LUT_BIAS; - return uv; -} -float LTC_ClippedSphereFormFactor( const in vec3 f ) { - float l = length( f ); - return max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 ); -} -vec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) { - float x = dot( v1, v2 ); - float y = abs( x ); - float a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y; - float b = 3.4175940 + ( 4.1616724 + y ) * y; - float v = a / b; - float theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v; - return cross( v1, v2 ) * theta_sintheta; -} -vec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) { - vec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ]; - vec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ]; - vec3 lightNormal = cross( v1, v2 ); - if( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 ); - vec3 T1, T2; - T1 = normalize( V - N * dot( V, N ) ); - T2 = - cross( N, T1 ); - mat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) ); - vec3 coords[ 4 ]; - coords[ 0 ] = mat * ( rectCoords[ 0 ] - P ); - coords[ 1 ] = mat * ( rectCoords[ 1 ] - P ); - coords[ 2 ] = mat * ( rectCoords[ 2 ] - P ); - coords[ 3 ] = mat * ( rectCoords[ 3 ] - P ); - coords[ 0 ] = normalize( coords[ 0 ] ); - coords[ 1 ] = normalize( coords[ 1 ] ); - coords[ 2 ] = normalize( coords[ 2 ] ); - coords[ 3 ] = normalize( coords[ 3 ] ); - vec3 vectorFormFactor = vec3( 0.0 ); - vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] ); - vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] ); - vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] ); - vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] ); - float result = LTC_ClippedSphereFormFactor( vectorFormFactor ); - return vec3( result ); -} -#if defined( USE_SHEEN ) -float D_Charlie( float roughness, float dotNH ) { - float alpha = pow2( roughness ); - float invAlpha = 1.0 / alpha; - float cos2h = dotNH * dotNH; - float sin2h = max( 1.0 - cos2h, 0.0078125 ); - return ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI ); -} -float V_Neubelt( float dotNV, float dotNL ) { - return saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) ); -} -vec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) { - vec3 halfDir = normalize( lightDir + viewDir ); - float dotNL = saturate( dot( normal, lightDir ) ); - float dotNV = saturate( dot( normal, viewDir ) ); - float dotNH = saturate( dot( normal, halfDir ) ); - float D = D_Charlie( sheenRoughness, dotNH ); - float V = V_Neubelt( dotNV, dotNL ); - return sheenColor * ( D * V ); -} -#endif -float IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) { - float dotNV = saturate( dot( normal, viewDir ) ); - float r2 = roughness * roughness; - float a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95; - float b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72; - float DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) ); - return saturate( DG * RECIPROCAL_PI ); -} -vec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) { - float dotNV = saturate( dot( normal, viewDir ) ); - const vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 ); - const vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 ); - vec4 r = roughness * c0 + c1; - float a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y; - vec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw; - return fab; -} -vec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) { - vec2 fab = DFGApprox( normal, viewDir, roughness ); - return specularColor * fab.x + specularF90 * fab.y; -} -#ifdef USE_IRIDESCENCE -void computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) { -#else -void computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) { -#endif - vec2 fab = DFGApprox( normal, viewDir, roughness ); - #ifdef USE_IRIDESCENCE - vec3 Fr = mix( specularColor, iridescenceF0, iridescence ); - #else - vec3 Fr = specularColor; - #endif - vec3 FssEss = Fr * fab.x + specularF90 * fab.y; - float Ess = fab.x + fab.y; - float Ems = 1.0 - Ess; - vec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619; vec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg ); - singleScatter += FssEss; - multiScatter += Fms * Ems; -} -#if NUM_RECT_AREA_LIGHTS > 0 - void RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) { - vec3 normal = geometryNormal; - vec3 viewDir = geometryViewDir; - vec3 position = geometryPosition; - vec3 lightPos = rectAreaLight.position; - vec3 halfWidth = rectAreaLight.halfWidth; - vec3 halfHeight = rectAreaLight.halfHeight; - vec3 lightColor = rectAreaLight.color; - float roughness = material.roughness; - vec3 rectCoords[ 4 ]; - rectCoords[ 0 ] = lightPos + halfWidth - halfHeight; rectCoords[ 1 ] = lightPos - halfWidth - halfHeight; - rectCoords[ 2 ] = lightPos - halfWidth + halfHeight; - rectCoords[ 3 ] = lightPos + halfWidth + halfHeight; - vec2 uv = LTC_Uv( normal, viewDir, roughness ); - vec4 t1 = texture2D( ltc_1, uv ); - vec4 t2 = texture2D( ltc_2, uv ); - mat3 mInv = mat3( - vec3( t1.x, 0, t1.y ), - vec3( 0, 1, 0 ), - vec3( t1.z, 0, t1.w ) - ); - vec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y ); - reflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords ); - reflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords ); - } -#endif -void RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) { - float dotNL = saturate( dot( geometryNormal, directLight.direction ) ); - vec3 irradiance = dotNL * directLight.color; - #ifdef USE_CLEARCOAT - float dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) ); - vec3 ccIrradiance = dotNLcc * directLight.color; - clearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material ); - #endif - #ifdef USE_SHEEN - sheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness ); - #endif - reflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometryViewDir, geometryNormal, material ); - reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); -} -void RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) { - reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); -} -void RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) { - #ifdef USE_CLEARCOAT - clearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness ); - #endif - #ifdef USE_SHEEN - sheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness ); - #endif - vec3 singleScattering = vec3( 0.0 ); - vec3 multiScattering = vec3( 0.0 ); - vec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI; - #ifdef USE_IRIDESCENCE - computeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering ); - #else - computeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering ); - #endif - vec3 totalScattering = singleScattering + multiScattering; - vec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) ); - reflectedLight.indirectSpecular += radiance * singleScattering; - reflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance; - reflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance; -} -#define RE_Direct RE_Direct_Physical -#define RE_Direct_RectArea RE_Direct_RectArea_Physical -#define RE_IndirectDiffuse RE_IndirectDiffuse_Physical -#define RE_IndirectSpecular RE_IndirectSpecular_Physical -float computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) { - return saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion ); -}`,zme=` -vec3 geometryPosition = - vViewPosition; -vec3 geometryNormal = normal; -vec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition ); -vec3 geometryClearcoatNormal = vec3( 0.0 ); -#ifdef USE_CLEARCOAT - geometryClearcoatNormal = clearcoatNormal; -#endif -#ifdef USE_IRIDESCENCE - float dotNVi = saturate( dot( normal, geometryViewDir ) ); - if ( material.iridescenceThickness == 0.0 ) { - material.iridescence = 0.0; - } else { - material.iridescence = saturate( material.iridescence ); - } - if ( material.iridescence > 0.0 ) { - material.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor ); - material.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi ); - } -#endif -IncidentLight directLight; -#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct ) - PointLight pointLight; - #if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0 - PointLightShadow pointLightShadow; - #endif - #pragma unroll_loop_start - for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) { - pointLight = pointLights[ i ]; - getPointLightInfo( pointLight, geometryPosition, directLight ); - #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS ) - pointLightShadow = pointLightShadows[ i ]; - directLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0; - #endif - RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight ); - } - #pragma unroll_loop_end -#endif -#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct ) - SpotLight spotLight; - vec4 spotColor; - vec3 spotLightCoord; - bool inSpotLightMap; - #if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0 - SpotLightShadow spotLightShadow; - #endif - #pragma unroll_loop_start - for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) { - spotLight = spotLights[ i ]; - getSpotLightInfo( spotLight, geometryPosition, directLight ); - #if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS ) - #define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX - #elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS ) - #define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS - #else - #define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS ) - #endif - #if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS ) - spotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w; - inSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) ); - spotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy ); - directLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color; - #endif - #undef SPOT_LIGHT_MAP_INDEX - #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS ) - spotLightShadow = spotLightShadows[ i ]; - directLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0; - #endif - RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight ); - } - #pragma unroll_loop_end -#endif -#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct ) - DirectionalLight directionalLight; - #if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0 - DirectionalLightShadow directionalLightShadow; - #endif - #pragma unroll_loop_start - for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) { - directionalLight = directionalLights[ i ]; - getDirectionalLightInfo( directionalLight, directLight ); - #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS ) - directionalLightShadow = directionalLightShadows[ i ]; - directLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0; - #endif - RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight ); - } - #pragma unroll_loop_end -#endif -#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea ) - RectAreaLight rectAreaLight; - #pragma unroll_loop_start - for ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) { - rectAreaLight = rectAreaLights[ i ]; - RE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight ); - } - #pragma unroll_loop_end -#endif -#if defined( RE_IndirectDiffuse ) - vec3 iblIrradiance = vec3( 0.0 ); - vec3 irradiance = getAmbientLightIrradiance( ambientLightColor ); - #if defined( USE_LIGHT_PROBES ) - irradiance += getLightProbeIrradiance( lightProbe, geometryNormal ); - #endif - #if ( NUM_HEMI_LIGHTS > 0 ) - #pragma unroll_loop_start - for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) { - irradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal ); - } - #pragma unroll_loop_end - #endif -#endif -#if defined( RE_IndirectSpecular ) - vec3 radiance = vec3( 0.0 ); - vec3 clearcoatRadiance = vec3( 0.0 ); -#endif`,Bme=`#if defined( RE_IndirectDiffuse ) - #ifdef USE_LIGHTMAP - vec4 lightMapTexel = texture2D( lightMap, vLightMapUv ); - vec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity; - irradiance += lightMapIrradiance; - #endif - #if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV ) - iblIrradiance += getIBLIrradiance( geometryNormal ); - #endif -#endif -#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular ) - #ifdef USE_ANISOTROPY - radiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy ); - #else - radiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness ); - #endif - #ifdef USE_CLEARCOAT - clearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness ); - #endif -#endif`,Hme=`#if defined( RE_IndirectDiffuse ) - RE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight ); -#endif -#if defined( RE_IndirectSpecular ) - RE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight ); -#endif`,Vme=`#if defined( USE_LOGDEPTHBUF ) - gl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5; -#endif`,Gme=`#if defined( USE_LOGDEPTHBUF ) - uniform float logDepthBufFC; - varying float vFragDepth; - varying float vIsPerspective; -#endif`,Wme=`#ifdef USE_LOGDEPTHBUF - varying float vFragDepth; - varying float vIsPerspective; -#endif`,$me=`#ifdef USE_LOGDEPTHBUF - vFragDepth = 1.0 + gl_Position.w; - vIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) ); -#endif`,Xme=`#ifdef USE_MAP - vec4 sampledDiffuseColor = texture2D( map, vMapUv ); - #ifdef DECODE_VIDEO_TEXTURE - sampledDiffuseColor = vec4( mix( pow( sampledDiffuseColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), sampledDiffuseColor.rgb * 0.0773993808, vec3( lessThanEqual( sampledDiffuseColor.rgb, vec3( 0.04045 ) ) ) ), sampledDiffuseColor.w ); - - #endif - diffuseColor *= sampledDiffuseColor; -#endif`,qme=`#ifdef USE_MAP - uniform sampler2D map; -#endif`,Kme=`#if defined( USE_MAP ) || defined( USE_ALPHAMAP ) - #if defined( USE_POINTS_UV ) - vec2 uv = vUv; - #else - vec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy; - #endif -#endif -#ifdef USE_MAP - diffuseColor *= texture2D( map, uv ); -#endif -#ifdef USE_ALPHAMAP - diffuseColor.a *= texture2D( alphaMap, uv ).g; -#endif`,Yme=`#if defined( USE_POINTS_UV ) - varying vec2 vUv; -#else - #if defined( USE_MAP ) || defined( USE_ALPHAMAP ) - uniform mat3 uvTransform; - #endif -#endif -#ifdef USE_MAP - uniform sampler2D map; -#endif -#ifdef USE_ALPHAMAP - uniform sampler2D alphaMap; -#endif`,Zme=`float metalnessFactor = metalness; -#ifdef USE_METALNESSMAP - vec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv ); - metalnessFactor *= texelMetalness.b; -#endif`,Qme=`#ifdef USE_METALNESSMAP - uniform sampler2D metalnessMap; -#endif`,Jme=`#ifdef USE_INSTANCING_MORPH - float morphTargetInfluences[ MORPHTARGETS_COUNT ]; - float morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r; - for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { - morphTargetInfluences[i] = texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r; - } -#endif`,ege=`#if defined( USE_MORPHCOLORS ) - vColor *= morphTargetBaseInfluence; - for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { - #if defined( USE_COLOR_ALPHA ) - if ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ]; - #elif defined( USE_COLOR ) - if ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ]; - #endif - } -#endif`,tge=`#ifdef USE_MORPHNORMALS - objectNormal *= morphTargetBaseInfluence; - for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { - if ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ]; - } -#endif`,nge=`#ifdef USE_MORPHTARGETS - #ifndef USE_INSTANCING_MORPH - uniform float morphTargetBaseInfluence; - uniform float morphTargetInfluences[ MORPHTARGETS_COUNT ]; - #endif - uniform sampler2DArray morphTargetsTexture; - uniform ivec2 morphTargetsTextureSize; - vec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) { - int texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset; - int y = texelIndex / morphTargetsTextureSize.x; - int x = texelIndex - y * morphTargetsTextureSize.x; - ivec3 morphUV = ivec3( x, y, morphTargetIndex ); - return texelFetch( morphTargetsTexture, morphUV, 0 ); - } -#endif`,rge=`#ifdef USE_MORPHTARGETS - transformed *= morphTargetBaseInfluence; - for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { - if ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ]; - } -#endif`,ige=`float faceDirection = gl_FrontFacing ? 1.0 : - 1.0; -#ifdef FLAT_SHADED - vec3 fdx = dFdx( vViewPosition ); - vec3 fdy = dFdy( vViewPosition ); - vec3 normal = normalize( cross( fdx, fdy ) ); -#else - vec3 normal = normalize( vNormal ); - #ifdef DOUBLE_SIDED - normal *= faceDirection; - #endif -#endif -#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) - #ifdef USE_TANGENT - mat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal ); - #else - mat3 tbn = getTangentFrame( - vViewPosition, normal, - #if defined( USE_NORMALMAP ) - vNormalMapUv - #elif defined( USE_CLEARCOAT_NORMALMAP ) - vClearcoatNormalMapUv - #else - vUv - #endif - ); - #endif - #if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED ) - tbn[0] *= faceDirection; - tbn[1] *= faceDirection; - #endif -#endif -#ifdef USE_CLEARCOAT_NORMALMAP - #ifdef USE_TANGENT - mat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal ); - #else - mat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv ); - #endif - #if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED ) - tbn2[0] *= faceDirection; - tbn2[1] *= faceDirection; - #endif -#endif -vec3 nonPerturbedNormal = normal;`,sge=`#ifdef USE_NORMALMAP_OBJECTSPACE - normal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0; - #ifdef FLIP_SIDED - normal = - normal; - #endif - #ifdef DOUBLE_SIDED - normal = normal * faceDirection; - #endif - normal = normalize( normalMatrix * normal ); -#elif defined( USE_NORMALMAP_TANGENTSPACE ) - vec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0; - mapN.xy *= normalScale; - normal = normalize( tbn * mapN ); -#elif defined( USE_BUMPMAP ) - normal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection ); -#endif`,age=`#ifndef FLAT_SHADED - varying vec3 vNormal; - #ifdef USE_TANGENT - varying vec3 vTangent; - varying vec3 vBitangent; - #endif -#endif`,oge=`#ifndef FLAT_SHADED - varying vec3 vNormal; - #ifdef USE_TANGENT - varying vec3 vTangent; - varying vec3 vBitangent; - #endif -#endif`,lge=`#ifndef FLAT_SHADED - vNormal = normalize( transformedNormal ); - #ifdef USE_TANGENT - vTangent = normalize( transformedTangent ); - vBitangent = normalize( cross( vNormal, vTangent ) * tangent.w ); - #endif -#endif`,cge=`#ifdef USE_NORMALMAP - uniform sampler2D normalMap; - uniform vec2 normalScale; -#endif -#ifdef USE_NORMALMAP_OBJECTSPACE - uniform mat3 normalMatrix; -#endif -#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) ) - mat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) { - vec3 q0 = dFdx( eye_pos.xyz ); - vec3 q1 = dFdy( eye_pos.xyz ); - vec2 st0 = dFdx( uv.st ); - vec2 st1 = dFdy( uv.st ); - vec3 N = surf_norm; - vec3 q1perp = cross( q1, N ); - vec3 q0perp = cross( N, q0 ); - vec3 T = q1perp * st0.x + q0perp * st1.x; - vec3 B = q1perp * st0.y + q0perp * st1.y; - float det = max( dot( T, T ), dot( B, B ) ); - float scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det ); - return mat3( T * scale, B * scale, N ); - } -#endif`,uge=`#ifdef USE_CLEARCOAT - vec3 clearcoatNormal = nonPerturbedNormal; -#endif`,dge=`#ifdef USE_CLEARCOAT_NORMALMAP - vec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0; - clearcoatMapN.xy *= clearcoatNormalScale; - clearcoatNormal = normalize( tbn2 * clearcoatMapN ); -#endif`,fge=`#ifdef USE_CLEARCOATMAP - uniform sampler2D clearcoatMap; -#endif -#ifdef USE_CLEARCOAT_NORMALMAP - uniform sampler2D clearcoatNormalMap; - uniform vec2 clearcoatNormalScale; -#endif -#ifdef USE_CLEARCOAT_ROUGHNESSMAP - uniform sampler2D clearcoatRoughnessMap; -#endif`,hge=`#ifdef USE_IRIDESCENCEMAP - uniform sampler2D iridescenceMap; -#endif -#ifdef USE_IRIDESCENCE_THICKNESSMAP - uniform sampler2D iridescenceThicknessMap; -#endif`,pge=`#ifdef OPAQUE -diffuseColor.a = 1.0; -#endif -#ifdef USE_TRANSMISSION -diffuseColor.a *= material.transmissionAlpha; -#endif -gl_FragColor = vec4( outgoingLight, diffuseColor.a );`,mge=`vec3 packNormalToRGB( const in vec3 normal ) { - return normalize( normal ) * 0.5 + 0.5; -} -vec3 unpackRGBToNormal( const in vec3 rgb ) { - return 2.0 * rgb.xyz - 1.0; -} -const float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;const float ShiftRight8 = 1. / 256.; -const float Inv255 = 1. / 255.; -const vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 ); -const vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g ); -const vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b ); -const vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a ); -vec4 packDepthToRGBA( const in float v ) { - if( v <= 0.0 ) - return vec4( 0., 0., 0., 0. ); - if( v >= 1.0 ) - return vec4( 1., 1., 1., 1. ); - float vuf; - float af = modf( v * PackFactors.a, vuf ); - float bf = modf( vuf * ShiftRight8, vuf ); - float gf = modf( vuf * ShiftRight8, vuf ); - return vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af ); -} -vec3 packDepthToRGB( const in float v ) { - if( v <= 0.0 ) - return vec3( 0., 0., 0. ); - if( v >= 1.0 ) - return vec3( 1., 1., 1. ); - float vuf; - float bf = modf( v * PackFactors.b, vuf ); - float gf = modf( vuf * ShiftRight8, vuf ); - return vec3( vuf * Inv255, gf * PackUpscale, bf ); -} -vec2 packDepthToRG( const in float v ) { - if( v <= 0.0 ) - return vec2( 0., 0. ); - if( v >= 1.0 ) - return vec2( 1., 1. ); - float vuf; - float gf = modf( v * 256., vuf ); - return vec2( vuf * Inv255, gf ); -} -float unpackRGBAToDepth( const in vec4 v ) { - return dot( v, UnpackFactors4 ); -} -float unpackRGBToDepth( const in vec3 v ) { - return dot( v, UnpackFactors3 ); -} -float unpackRGToDepth( const in vec2 v ) { - return v.r * UnpackFactors2.r + v.g * UnpackFactors2.g; -} -vec4 pack2HalfToRGBA( const in vec2 v ) { - vec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) ); - return vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w ); -} -vec2 unpackRGBATo2Half( const in vec4 v ) { - return vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) ); -} -float viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) { - return ( viewZ + near ) / ( near - far ); -} -float orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) { - return depth * ( near - far ) - near; -} -float viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) { - return ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ ); -} -float perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) { - return ( near * far ) / ( ( far - near ) * depth - far ); -}`,gge=`#ifdef PREMULTIPLIED_ALPHA - gl_FragColor.rgb *= gl_FragColor.a; -#endif`,vge=`vec4 mvPosition = vec4( transformed, 1.0 ); -#ifdef USE_BATCHING - mvPosition = batchingMatrix * mvPosition; -#endif -#ifdef USE_INSTANCING - mvPosition = instanceMatrix * mvPosition; -#endif -mvPosition = modelViewMatrix * mvPosition; -gl_Position = projectionMatrix * mvPosition;`,yge=`#ifdef DITHERING - gl_FragColor.rgb = dithering( gl_FragColor.rgb ); -#endif`,xge=`#ifdef DITHERING - vec3 dithering( vec3 color ) { - float grid_position = rand( gl_FragCoord.xy ); - vec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 ); - dither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position ); - return color + dither_shift_RGB; - } -#endif`,bge=`float roughnessFactor = roughness; -#ifdef USE_ROUGHNESSMAP - vec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv ); - roughnessFactor *= texelRoughness.g; -#endif`,_ge=`#ifdef USE_ROUGHNESSMAP - uniform sampler2D roughnessMap; -#endif`,wge=`#if NUM_SPOT_LIGHT_COORDS > 0 - varying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ]; -#endif -#if NUM_SPOT_LIGHT_MAPS > 0 - uniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ]; -#endif -#ifdef USE_SHADOWMAP - #if NUM_DIR_LIGHT_SHADOWS > 0 - uniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ]; - varying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ]; - struct DirectionalLightShadow { - float shadowIntensity; - float shadowBias; - float shadowNormalBias; - float shadowRadius; - vec2 shadowMapSize; - }; - uniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ]; - #endif - #if NUM_SPOT_LIGHT_SHADOWS > 0 - uniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ]; - struct SpotLightShadow { - float shadowIntensity; - float shadowBias; - float shadowNormalBias; - float shadowRadius; - vec2 shadowMapSize; - }; - uniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ]; - #endif - #if NUM_POINT_LIGHT_SHADOWS > 0 - uniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ]; - varying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ]; - struct PointLightShadow { - float shadowIntensity; - float shadowBias; - float shadowNormalBias; - float shadowRadius; - vec2 shadowMapSize; - float shadowCameraNear; - float shadowCameraFar; - }; - uniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ]; - #endif - float texture2DCompare( sampler2D depths, vec2 uv, float compare ) { - return step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) ); - } - vec2 texture2DDistribution( sampler2D shadow, vec2 uv ) { - return unpackRGBATo2Half( texture2D( shadow, uv ) ); - } - float VSMShadow (sampler2D shadow, vec2 uv, float compare ){ - float occlusion = 1.0; - vec2 distribution = texture2DDistribution( shadow, uv ); - float hard_shadow = step( compare , distribution.x ); - if (hard_shadow != 1.0 ) { - float distance = compare - distribution.x ; - float variance = max( 0.00000, distribution.y * distribution.y ); - float softness_probability = variance / (variance + distance * distance ); softness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 ); occlusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 ); - } - return occlusion; - } - float getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) { - float shadow = 1.0; - shadowCoord.xyz /= shadowCoord.w; - shadowCoord.z += shadowBias; - bool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0; - bool frustumTest = inFrustum && shadowCoord.z <= 1.0; - if ( frustumTest ) { - #if defined( SHADOWMAP_TYPE_PCF ) - vec2 texelSize = vec2( 1.0 ) / shadowMapSize; - float dx0 = - texelSize.x * shadowRadius; - float dy0 = - texelSize.y * shadowRadius; - float dx1 = + texelSize.x * shadowRadius; - float dy1 = + texelSize.y * shadowRadius; - float dx2 = dx0 / 2.0; - float dy2 = dy0 / 2.0; - float dx3 = dx1 / 2.0; - float dy3 = dy1 / 2.0; - shadow = ( - texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) + - texture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) + - texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) + - texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) + - texture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) + - texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) + - texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) + - texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) + - texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) + - texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) + - texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) + - texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) + - texture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) + - texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) + - texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) + - texture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) + - texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z ) - ) * ( 1.0 / 17.0 ); - #elif defined( SHADOWMAP_TYPE_PCF_SOFT ) - vec2 texelSize = vec2( 1.0 ) / shadowMapSize; - float dx = texelSize.x; - float dy = texelSize.y; - vec2 uv = shadowCoord.xy; - vec2 f = fract( uv * shadowMapSize + 0.5 ); - uv -= f * texelSize; - shadow = ( - texture2DCompare( shadowMap, uv, shadowCoord.z ) + - texture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) + - texture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) + - texture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) + - mix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), - texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ), - f.x ) + - mix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), - texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ), - f.x ) + - mix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), - texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ), - f.y ) + - mix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), - texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ), - f.y ) + - mix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), - texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ), - f.x ), - mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), - texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ), - f.x ), - f.y ) - ) * ( 1.0 / 9.0 ); - #elif defined( SHADOWMAP_TYPE_VSM ) - shadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z ); - #else - shadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ); - #endif - } - return mix( 1.0, shadow, shadowIntensity ); - } - vec2 cubeToUV( vec3 v, float texelSizeY ) { - vec3 absV = abs( v ); - float scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) ); - absV *= scaleToCube; - v *= scaleToCube * ( 1.0 - 2.0 * texelSizeY ); - vec2 planar = v.xy; - float almostATexel = 1.5 * texelSizeY; - float almostOne = 1.0 - almostATexel; - if ( absV.z >= almostOne ) { - if ( v.z > 0.0 ) - planar.x = 4.0 - v.x; - } else if ( absV.x >= almostOne ) { - float signX = sign( v.x ); - planar.x = v.z * signX + 2.0 * signX; - } else if ( absV.y >= almostOne ) { - float signY = sign( v.y ); - planar.x = v.x + 2.0 * signY + 2.0; - planar.y = v.z * signY - 2.0; - } - return vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 ); - } - float getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) { - float shadow = 1.0; - vec3 lightToPosition = shadowCoord.xyz; - - float lightToPositionLength = length( lightToPosition ); - if ( lightToPositionLength - shadowCameraFar <= 0.0 && lightToPositionLength - shadowCameraNear >= 0.0 ) { - float dp = ( lightToPositionLength - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear ); dp += shadowBias; - vec3 bd3D = normalize( lightToPosition ); - vec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) ); - #if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM ) - vec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y; - shadow = ( - texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) + - texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) + - texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) + - texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) + - texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) + - texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) + - texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) + - texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) + - texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp ) - ) * ( 1.0 / 9.0 ); - #else - shadow = texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ); - #endif - } - return mix( 1.0, shadow, shadowIntensity ); - } -#endif`,Sge=`#if NUM_SPOT_LIGHT_COORDS > 0 - uniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ]; - varying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ]; -#endif -#ifdef USE_SHADOWMAP - #if NUM_DIR_LIGHT_SHADOWS > 0 - uniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ]; - varying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ]; - struct DirectionalLightShadow { - float shadowIntensity; - float shadowBias; - float shadowNormalBias; - float shadowRadius; - vec2 shadowMapSize; - }; - uniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ]; - #endif - #if NUM_SPOT_LIGHT_SHADOWS > 0 - struct SpotLightShadow { - float shadowIntensity; - float shadowBias; - float shadowNormalBias; - float shadowRadius; - vec2 shadowMapSize; - }; - uniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ]; - #endif - #if NUM_POINT_LIGHT_SHADOWS > 0 - uniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ]; - varying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ]; - struct PointLightShadow { - float shadowIntensity; - float shadowBias; - float shadowNormalBias; - float shadowRadius; - vec2 shadowMapSize; - float shadowCameraNear; - float shadowCameraFar; - }; - uniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ]; - #endif -#endif`,Mge=`#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 ) - vec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix ); - vec4 shadowWorldPosition; -#endif -#if defined( USE_SHADOWMAP ) - #if NUM_DIR_LIGHT_SHADOWS > 0 - #pragma unroll_loop_start - for ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) { - shadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 ); - vDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition; - } - #pragma unroll_loop_end - #endif - #if NUM_POINT_LIGHT_SHADOWS > 0 - #pragma unroll_loop_start - for ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) { - shadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 ); - vPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition; - } - #pragma unroll_loop_end - #endif -#endif -#if NUM_SPOT_LIGHT_COORDS > 0 - #pragma unroll_loop_start - for ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) { - shadowWorldPosition = worldPosition; - #if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS ) - shadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias; - #endif - vSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition; - } - #pragma unroll_loop_end -#endif`,Ege=`float getShadowMask() { - float shadow = 1.0; - #ifdef USE_SHADOWMAP - #if NUM_DIR_LIGHT_SHADOWS > 0 - DirectionalLightShadow directionalLight; - #pragma unroll_loop_start - for ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) { - directionalLight = directionalLightShadows[ i ]; - shadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowIntensity, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0; - } - #pragma unroll_loop_end - #endif - #if NUM_SPOT_LIGHT_SHADOWS > 0 - SpotLightShadow spotLight; - #pragma unroll_loop_start - for ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) { - spotLight = spotLightShadows[ i ]; - shadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowIntensity, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0; - } - #pragma unroll_loop_end - #endif - #if NUM_POINT_LIGHT_SHADOWS > 0 - PointLightShadow pointLight; - #pragma unroll_loop_start - for ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) { - pointLight = pointLightShadows[ i ]; - shadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowIntensity, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0; - } - #pragma unroll_loop_end - #endif - #endif - return shadow; -}`,Age=`#ifdef USE_SKINNING - mat4 boneMatX = getBoneMatrix( skinIndex.x ); - mat4 boneMatY = getBoneMatrix( skinIndex.y ); - mat4 boneMatZ = getBoneMatrix( skinIndex.z ); - mat4 boneMatW = getBoneMatrix( skinIndex.w ); -#endif`,Tge=`#ifdef USE_SKINNING - uniform mat4 bindMatrix; - uniform mat4 bindMatrixInverse; - uniform highp sampler2D boneTexture; - mat4 getBoneMatrix( const in float i ) { - int size = textureSize( boneTexture, 0 ).x; - int j = int( i ) * 4; - int x = j % size; - int y = j / size; - vec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 ); - vec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 ); - vec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 ); - vec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 ); - return mat4( v1, v2, v3, v4 ); - } -#endif`,Pge=`#ifdef USE_SKINNING - vec4 skinVertex = bindMatrix * vec4( transformed, 1.0 ); - vec4 skinned = vec4( 0.0 ); - skinned += boneMatX * skinVertex * skinWeight.x; - skinned += boneMatY * skinVertex * skinWeight.y; - skinned += boneMatZ * skinVertex * skinWeight.z; - skinned += boneMatW * skinVertex * skinWeight.w; - transformed = ( bindMatrixInverse * skinned ).xyz; -#endif`,Cge=`#ifdef USE_SKINNING - mat4 skinMatrix = mat4( 0.0 ); - skinMatrix += skinWeight.x * boneMatX; - skinMatrix += skinWeight.y * boneMatY; - skinMatrix += skinWeight.z * boneMatZ; - skinMatrix += skinWeight.w * boneMatW; - skinMatrix = bindMatrixInverse * skinMatrix * bindMatrix; - objectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz; - #ifdef USE_TANGENT - objectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz; - #endif -#endif`,Rge=`float specularStrength; -#ifdef USE_SPECULARMAP - vec4 texelSpecular = texture2D( specularMap, vSpecularMapUv ); - specularStrength = texelSpecular.r; -#else - specularStrength = 1.0; -#endif`,Nge=`#ifdef USE_SPECULARMAP - uniform sampler2D specularMap; -#endif`,Ige=`#if defined( TONE_MAPPING ) - gl_FragColor.rgb = toneMapping( gl_FragColor.rgb ); -#endif`,kge=`#ifndef saturate -#define saturate( a ) clamp( a, 0.0, 1.0 ) -#endif -uniform float toneMappingExposure; -vec3 LinearToneMapping( vec3 color ) { - return saturate( toneMappingExposure * color ); -} -vec3 ReinhardToneMapping( vec3 color ) { - color *= toneMappingExposure; - return saturate( color / ( vec3( 1.0 ) + color ) ); -} -vec3 CineonToneMapping( vec3 color ) { - color *= toneMappingExposure; - color = max( vec3( 0.0 ), color - 0.004 ); - return pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) ); -} -vec3 RRTAndODTFit( vec3 v ) { - vec3 a = v * ( v + 0.0245786 ) - 0.000090537; - vec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081; - return a / b; -} -vec3 ACESFilmicToneMapping( vec3 color ) { - const mat3 ACESInputMat = mat3( - vec3( 0.59719, 0.07600, 0.02840 ), vec3( 0.35458, 0.90834, 0.13383 ), - vec3( 0.04823, 0.01566, 0.83777 ) - ); - const mat3 ACESOutputMat = mat3( - vec3( 1.60475, -0.10208, -0.00327 ), vec3( -0.53108, 1.10813, -0.07276 ), - vec3( -0.07367, -0.00605, 1.07602 ) - ); - color *= toneMappingExposure / 0.6; - color = ACESInputMat * color; - color = RRTAndODTFit( color ); - color = ACESOutputMat * color; - return saturate( color ); -} -const mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3( - vec3( 1.6605, - 0.1246, - 0.0182 ), - vec3( - 0.5876, 1.1329, - 0.1006 ), - vec3( - 0.0728, - 0.0083, 1.1187 ) -); -const mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3( - vec3( 0.6274, 0.0691, 0.0164 ), - vec3( 0.3293, 0.9195, 0.0880 ), - vec3( 0.0433, 0.0113, 0.8956 ) -); -vec3 agxDefaultContrastApprox( vec3 x ) { - vec3 x2 = x * x; - vec3 x4 = x2 * x2; - return + 15.5 * x4 * x2 - - 40.14 * x4 * x - + 31.96 * x4 - - 6.868 * x2 * x - + 0.4298 * x2 - + 0.1191 * x - - 0.00232; -} -vec3 AgXToneMapping( vec3 color ) { - const mat3 AgXInsetMatrix = mat3( - vec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ), - vec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ), - vec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 ) - ); - const mat3 AgXOutsetMatrix = mat3( - vec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ), - vec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ), - vec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 ) - ); - const float AgxMinEv = - 12.47393; const float AgxMaxEv = 4.026069; - color *= toneMappingExposure; - color = LINEAR_SRGB_TO_LINEAR_REC2020 * color; - color = AgXInsetMatrix * color; - color = max( color, 1e-10 ); color = log2( color ); - color = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv ); - color = clamp( color, 0.0, 1.0 ); - color = agxDefaultContrastApprox( color ); - color = AgXOutsetMatrix * color; - color = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) ); - color = LINEAR_REC2020_TO_LINEAR_SRGB * color; - color = clamp( color, 0.0, 1.0 ); - return color; -} -vec3 NeutralToneMapping( vec3 color ) { - const float StartCompression = 0.8 - 0.04; - const float Desaturation = 0.15; - color *= toneMappingExposure; - float x = min( color.r, min( color.g, color.b ) ); - float offset = x < 0.08 ? x - 6.25 * x * x : 0.04; - color -= offset; - float peak = max( color.r, max( color.g, color.b ) ); - if ( peak < StartCompression ) return color; - float d = 1. - StartCompression; - float newPeak = 1. - d * d / ( peak + d - StartCompression ); - color *= newPeak / peak; - float g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. ); - return mix( color, vec3( newPeak ), g ); -} -vec3 CustomToneMapping( vec3 color ) { return color; }`,Oge=`#ifdef USE_TRANSMISSION - material.transmission = transmission; - material.transmissionAlpha = 1.0; - material.thickness = thickness; - material.attenuationDistance = attenuationDistance; - material.attenuationColor = attenuationColor; - #ifdef USE_TRANSMISSIONMAP - material.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r; - #endif - #ifdef USE_THICKNESSMAP - material.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g; - #endif - vec3 pos = vWorldPosition; - vec3 v = normalize( cameraPosition - pos ); - vec3 n = inverseTransformDirection( normal, viewMatrix ); - vec4 transmitted = getIBLVolumeRefraction( - n, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90, - pos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness, - material.attenuationColor, material.attenuationDistance ); - material.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission ); - totalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission ); -#endif`,Lge=`#ifdef USE_TRANSMISSION - uniform float transmission; - uniform float thickness; - uniform float attenuationDistance; - uniform vec3 attenuationColor; - #ifdef USE_TRANSMISSIONMAP - uniform sampler2D transmissionMap; - #endif - #ifdef USE_THICKNESSMAP - uniform sampler2D thicknessMap; - #endif - uniform vec2 transmissionSamplerSize; - uniform sampler2D transmissionSamplerMap; - uniform mat4 modelMatrix; - uniform mat4 projectionMatrix; - varying vec3 vWorldPosition; - float w0( float a ) { - return ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 ); - } - float w1( float a ) { - return ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 ); - } - float w2( float a ){ - return ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 ); - } - float w3( float a ) { - return ( 1.0 / 6.0 ) * ( a * a * a ); - } - float g0( float a ) { - return w0( a ) + w1( a ); - } - float g1( float a ) { - return w2( a ) + w3( a ); - } - float h0( float a ) { - return - 1.0 + w1( a ) / ( w0( a ) + w1( a ) ); - } - float h1( float a ) { - return 1.0 + w3( a ) / ( w2( a ) + w3( a ) ); - } - vec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) { - uv = uv * texelSize.zw + 0.5; - vec2 iuv = floor( uv ); - vec2 fuv = fract( uv ); - float g0x = g0( fuv.x ); - float g1x = g1( fuv.x ); - float h0x = h0( fuv.x ); - float h1x = h1( fuv.x ); - float h0y = h0( fuv.y ); - float h1y = h1( fuv.y ); - vec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy; - vec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy; - vec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy; - vec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy; - return g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) + - g1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) ); - } - vec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) { - vec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) ); - vec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) ); - vec2 fLodSizeInv = 1.0 / fLodSize; - vec2 cLodSizeInv = 1.0 / cLodSize; - vec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) ); - vec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) ); - return mix( fSample, cSample, fract( lod ) ); - } - vec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) { - vec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior ); - vec3 modelScale; - modelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) ); - modelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) ); - modelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) ); - return normalize( refractionVector ) * thickness * modelScale; - } - float applyIorToRoughness( const in float roughness, const in float ior ) { - return roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 ); - } - vec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) { - float lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior ); - return textureBicubic( transmissionSamplerMap, fragCoord.xy, lod ); - } - vec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) { - if ( isinf( attenuationDistance ) ) { - return vec3( 1.0 ); - } else { - vec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance; - vec3 transmittance = exp( - attenuationCoefficient * transmissionDistance ); return transmittance; - } - } - vec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor, - const in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix, - const in mat4 viewMatrix, const in mat4 projMatrix, const in float dispersion, const in float ior, const in float thickness, - const in vec3 attenuationColor, const in float attenuationDistance ) { - vec4 transmittedLight; - vec3 transmittance; - #ifdef USE_DISPERSION - float halfSpread = ( ior - 1.0 ) * 0.025 * dispersion; - vec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread ); - for ( int i = 0; i < 3; i ++ ) { - vec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix ); - vec3 refractedRayExit = position + transmissionRay; - - vec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 ); - vec2 refractionCoords = ndcPos.xy / ndcPos.w; - refractionCoords += 1.0; - refractionCoords /= 2.0; - - vec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] ); - transmittedLight[ i ] = transmissionSample[ i ]; - transmittedLight.a += transmissionSample.a; - transmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ]; - } - transmittedLight.a /= 3.0; - - #else - - vec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix ); - vec3 refractedRayExit = position + transmissionRay; - vec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 ); - vec2 refractionCoords = ndcPos.xy / ndcPos.w; - refractionCoords += 1.0; - refractionCoords /= 2.0; - transmittedLight = getTransmissionSample( refractionCoords, roughness, ior ); - transmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance ); - - #endif - vec3 attenuatedColor = transmittance * transmittedLight.rgb; - vec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness ); - float transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0; - return vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor ); - } -#endif`,Dge=`#if defined( USE_UV ) || defined( USE_ANISOTROPY ) - varying vec2 vUv; -#endif -#ifdef USE_MAP - varying vec2 vMapUv; -#endif -#ifdef USE_ALPHAMAP - varying vec2 vAlphaMapUv; -#endif -#ifdef USE_LIGHTMAP - varying vec2 vLightMapUv; -#endif -#ifdef USE_AOMAP - varying vec2 vAoMapUv; -#endif -#ifdef USE_BUMPMAP - varying vec2 vBumpMapUv; -#endif -#ifdef USE_NORMALMAP - varying vec2 vNormalMapUv; -#endif -#ifdef USE_EMISSIVEMAP - varying vec2 vEmissiveMapUv; -#endif -#ifdef USE_METALNESSMAP - varying vec2 vMetalnessMapUv; -#endif -#ifdef USE_ROUGHNESSMAP - varying vec2 vRoughnessMapUv; -#endif -#ifdef USE_ANISOTROPYMAP - varying vec2 vAnisotropyMapUv; -#endif -#ifdef USE_CLEARCOATMAP - varying vec2 vClearcoatMapUv; -#endif -#ifdef USE_CLEARCOAT_NORMALMAP - varying vec2 vClearcoatNormalMapUv; -#endif -#ifdef USE_CLEARCOAT_ROUGHNESSMAP - varying vec2 vClearcoatRoughnessMapUv; -#endif -#ifdef USE_IRIDESCENCEMAP - varying vec2 vIridescenceMapUv; -#endif -#ifdef USE_IRIDESCENCE_THICKNESSMAP - varying vec2 vIridescenceThicknessMapUv; -#endif -#ifdef USE_SHEEN_COLORMAP - varying vec2 vSheenColorMapUv; -#endif -#ifdef USE_SHEEN_ROUGHNESSMAP - varying vec2 vSheenRoughnessMapUv; -#endif -#ifdef USE_SPECULARMAP - varying vec2 vSpecularMapUv; -#endif -#ifdef USE_SPECULAR_COLORMAP - varying vec2 vSpecularColorMapUv; -#endif -#ifdef USE_SPECULAR_INTENSITYMAP - varying vec2 vSpecularIntensityMapUv; -#endif -#ifdef USE_TRANSMISSIONMAP - uniform mat3 transmissionMapTransform; - varying vec2 vTransmissionMapUv; -#endif -#ifdef USE_THICKNESSMAP - uniform mat3 thicknessMapTransform; - varying vec2 vThicknessMapUv; -#endif`,Uge=`#if defined( USE_UV ) || defined( USE_ANISOTROPY ) - varying vec2 vUv; -#endif -#ifdef USE_MAP - uniform mat3 mapTransform; - varying vec2 vMapUv; -#endif -#ifdef USE_ALPHAMAP - uniform mat3 alphaMapTransform; - varying vec2 vAlphaMapUv; -#endif -#ifdef USE_LIGHTMAP - uniform mat3 lightMapTransform; - varying vec2 vLightMapUv; -#endif -#ifdef USE_AOMAP - uniform mat3 aoMapTransform; - varying vec2 vAoMapUv; -#endif -#ifdef USE_BUMPMAP - uniform mat3 bumpMapTransform; - varying vec2 vBumpMapUv; -#endif -#ifdef USE_NORMALMAP - uniform mat3 normalMapTransform; - varying vec2 vNormalMapUv; -#endif -#ifdef USE_DISPLACEMENTMAP - uniform mat3 displacementMapTransform; - varying vec2 vDisplacementMapUv; -#endif -#ifdef USE_EMISSIVEMAP - uniform mat3 emissiveMapTransform; - varying vec2 vEmissiveMapUv; -#endif -#ifdef USE_METALNESSMAP - uniform mat3 metalnessMapTransform; - varying vec2 vMetalnessMapUv; -#endif -#ifdef USE_ROUGHNESSMAP - uniform mat3 roughnessMapTransform; - varying vec2 vRoughnessMapUv; -#endif -#ifdef USE_ANISOTROPYMAP - uniform mat3 anisotropyMapTransform; - varying vec2 vAnisotropyMapUv; -#endif -#ifdef USE_CLEARCOATMAP - uniform mat3 clearcoatMapTransform; - varying vec2 vClearcoatMapUv; -#endif -#ifdef USE_CLEARCOAT_NORMALMAP - uniform mat3 clearcoatNormalMapTransform; - varying vec2 vClearcoatNormalMapUv; -#endif -#ifdef USE_CLEARCOAT_ROUGHNESSMAP - uniform mat3 clearcoatRoughnessMapTransform; - varying vec2 vClearcoatRoughnessMapUv; -#endif -#ifdef USE_SHEEN_COLORMAP - uniform mat3 sheenColorMapTransform; - varying vec2 vSheenColorMapUv; -#endif -#ifdef USE_SHEEN_ROUGHNESSMAP - uniform mat3 sheenRoughnessMapTransform; - varying vec2 vSheenRoughnessMapUv; -#endif -#ifdef USE_IRIDESCENCEMAP - uniform mat3 iridescenceMapTransform; - varying vec2 vIridescenceMapUv; -#endif -#ifdef USE_IRIDESCENCE_THICKNESSMAP - uniform mat3 iridescenceThicknessMapTransform; - varying vec2 vIridescenceThicknessMapUv; -#endif -#ifdef USE_SPECULARMAP - uniform mat3 specularMapTransform; - varying vec2 vSpecularMapUv; -#endif -#ifdef USE_SPECULAR_COLORMAP - uniform mat3 specularColorMapTransform; - varying vec2 vSpecularColorMapUv; -#endif -#ifdef USE_SPECULAR_INTENSITYMAP - uniform mat3 specularIntensityMapTransform; - varying vec2 vSpecularIntensityMapUv; -#endif -#ifdef USE_TRANSMISSIONMAP - uniform mat3 transmissionMapTransform; - varying vec2 vTransmissionMapUv; -#endif -#ifdef USE_THICKNESSMAP - uniform mat3 thicknessMapTransform; - varying vec2 vThicknessMapUv; -#endif`,jge=`#if defined( USE_UV ) || defined( USE_ANISOTROPY ) - vUv = vec3( uv, 1 ).xy; -#endif -#ifdef USE_MAP - vMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy; -#endif -#ifdef USE_ALPHAMAP - vAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_LIGHTMAP - vLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_AOMAP - vAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_BUMPMAP - vBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_NORMALMAP - vNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_DISPLACEMENTMAP - vDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_EMISSIVEMAP - vEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_METALNESSMAP - vMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_ROUGHNESSMAP - vRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_ANISOTROPYMAP - vAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_CLEARCOATMAP - vClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_CLEARCOAT_NORMALMAP - vClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_CLEARCOAT_ROUGHNESSMAP - vClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_IRIDESCENCEMAP - vIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_IRIDESCENCE_THICKNESSMAP - vIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_SHEEN_COLORMAP - vSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_SHEEN_ROUGHNESSMAP - vSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_SPECULARMAP - vSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_SPECULAR_COLORMAP - vSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_SPECULAR_INTENSITYMAP - vSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_TRANSMISSIONMAP - vTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy; -#endif -#ifdef USE_THICKNESSMAP - vThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy; -#endif`,Fge=`#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0 - vec4 worldPosition = vec4( transformed, 1.0 ); - #ifdef USE_BATCHING - worldPosition = batchingMatrix * worldPosition; - #endif - #ifdef USE_INSTANCING - worldPosition = instanceMatrix * worldPosition; - #endif - worldPosition = modelMatrix * worldPosition; -#endif`;const zge=`varying vec2 vUv; -uniform mat3 uvTransform; -void main() { - vUv = ( uvTransform * vec3( uv, 1 ) ).xy; - gl_Position = vec4( position.xy, 1.0, 1.0 ); -}`,Bge=`uniform sampler2D t2D; -uniform float backgroundIntensity; -varying vec2 vUv; -void main() { - vec4 texColor = texture2D( t2D, vUv ); - #ifdef DECODE_VIDEO_TEXTURE - texColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w ); - #endif - texColor.rgb *= backgroundIntensity; - gl_FragColor = texColor; - #include - #include -}`,Hge=`varying vec3 vWorldDirection; -#include -void main() { - vWorldDirection = transformDirection( position, modelMatrix ); - #include - #include - gl_Position.z = gl_Position.w; -}`,Vge=`#ifdef ENVMAP_TYPE_CUBE - uniform samplerCube envMap; -#elif defined( ENVMAP_TYPE_CUBE_UV ) - uniform sampler2D envMap; -#endif -uniform float flipEnvMap; -uniform float backgroundBlurriness; -uniform float backgroundIntensity; -uniform mat3 backgroundRotation; -varying vec3 vWorldDirection; -#include -void main() { - #ifdef ENVMAP_TYPE_CUBE - vec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) ); - #elif defined( ENVMAP_TYPE_CUBE_UV ) - vec4 texColor = textureCubeUV( envMap, backgroundRotation * vWorldDirection, backgroundBlurriness ); - #else - vec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 ); - #endif - texColor.rgb *= backgroundIntensity; - gl_FragColor = texColor; - #include - #include -}`,Gge=`varying vec3 vWorldDirection; -#include -void main() { - vWorldDirection = transformDirection( position, modelMatrix ); - #include - #include - gl_Position.z = gl_Position.w; -}`,Wge=`uniform samplerCube tCube; -uniform float tFlip; -uniform float opacity; -varying vec3 vWorldDirection; -void main() { - vec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) ); - gl_FragColor = texColor; - gl_FragColor.a *= opacity; - #include - #include -}`,$ge=`#include -#include -#include -#include -#include -#include -#include -#include -varying vec2 vHighPrecisionZW; -void main() { - #include - #include - #include - #include - #ifdef USE_DISPLACEMENTMAP - #include - #include - #include - #endif - #include - #include - #include - #include - #include - #include - #include - vHighPrecisionZW = gl_Position.zw; -}`,Xge=`#if DEPTH_PACKING == 3200 - uniform float opacity; -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -varying vec2 vHighPrecisionZW; -void main() { - vec4 diffuseColor = vec4( 1.0 ); - #include - #if DEPTH_PACKING == 3200 - diffuseColor.a = opacity; - #endif - #include - #include - #include - #include - #include - float fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5; - #if DEPTH_PACKING == 3200 - gl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity ); - #elif DEPTH_PACKING == 3201 - gl_FragColor = packDepthToRGBA( fragCoordZ ); - #elif DEPTH_PACKING == 3202 - gl_FragColor = vec4( packDepthToRGB( fragCoordZ ), 1.0 ); - #elif DEPTH_PACKING == 3203 - gl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 ); - #endif -}`,qge=`#define DISTANCE -varying vec3 vWorldPosition; -#include -#include -#include -#include -#include -#include -#include -void main() { - #include - #include - #include - #include - #ifdef USE_DISPLACEMENTMAP - #include - #include - #include - #endif - #include - #include - #include - #include - #include - #include - #include - vWorldPosition = worldPosition.xyz; -}`,Kge=`#define DISTANCE -uniform vec3 referencePosition; -uniform float nearDistance; -uniform float farDistance; -varying vec3 vWorldPosition; -#include -#include -#include -#include -#include -#include -#include -#include -void main () { - vec4 diffuseColor = vec4( 1.0 ); - #include - #include - #include - #include - #include - float dist = length( vWorldPosition - referencePosition ); - dist = ( dist - nearDistance ) / ( farDistance - nearDistance ); - dist = saturate( dist ); - gl_FragColor = packDepthToRGBA( dist ); -}`,Yge=`varying vec3 vWorldDirection; -#include -void main() { - vWorldDirection = transformDirection( position, modelMatrix ); - #include - #include -}`,Zge=`uniform sampler2D tEquirect; -varying vec3 vWorldDirection; -#include -void main() { - vec3 direction = normalize( vWorldDirection ); - vec2 sampleUV = equirectUv( direction ); - gl_FragColor = texture2D( tEquirect, sampleUV ); - #include - #include -}`,Qge=`uniform float scale; -attribute float lineDistance; -varying float vLineDistance; -#include -#include -#include -#include -#include -#include -#include -void main() { - vLineDistance = scale * lineDistance; - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include -}`,Jge=`uniform vec3 diffuse; -uniform float opacity; -uniform float dashSize; -uniform float totalSize; -varying float vLineDistance; -#include -#include -#include -#include -#include -#include -#include -void main() { - vec4 diffuseColor = vec4( diffuse, opacity ); - #include - if ( mod( vLineDistance, totalSize ) > dashSize ) { - discard; - } - vec3 outgoingLight = vec3( 0.0 ); - #include - #include - #include - outgoingLight = diffuseColor.rgb; - #include - #include - #include - #include - #include -}`,eve=`#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -void main() { - #include - #include - #include - #include - #include - #if defined ( USE_ENVMAP ) || defined ( USE_SKINNING ) - #include - #include - #include - #include - #include - #endif - #include - #include - #include - #include - #include - #include - #include - #include - #include -}`,tve=`uniform vec3 diffuse; -uniform float opacity; -#ifndef FLAT_SHADED - varying vec3 vNormal; -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -void main() { - vec4 diffuseColor = vec4( diffuse, opacity ); - #include - #include - #include - #include - #include - #include - #include - #include - ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) ); - #ifdef USE_LIGHTMAP - vec4 lightMapTexel = texture2D( lightMap, vLightMapUv ); - reflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI; - #else - reflectedLight.indirectDiffuse += vec3( 1.0 ); - #endif - #include - reflectedLight.indirectDiffuse *= diffuseColor.rgb; - vec3 outgoingLight = reflectedLight.indirectDiffuse; - #include - #include - #include - #include - #include - #include - #include -}`,nve=`#define LAMBERT -varying vec3 vViewPosition; -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -void main() { - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - vViewPosition = - mvPosition.xyz; - #include - #include - #include - #include -}`,rve=`#define LAMBERT -uniform vec3 diffuse; -uniform vec3 emissive; -uniform float opacity; -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -void main() { - vec4 diffuseColor = vec4( diffuse, opacity ); - #include - ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) ); - vec3 totalEmissiveRadiance = emissive; - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance; - #include - #include - #include - #include - #include - #include - #include -}`,ive=`#define MATCAP -varying vec3 vViewPosition; -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -void main() { - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - vViewPosition = - mvPosition.xyz; -}`,sve=`#define MATCAP -uniform vec3 diffuse; -uniform float opacity; -uniform sampler2D matcap; -varying vec3 vViewPosition; -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -void main() { - vec4 diffuseColor = vec4( diffuse, opacity ); - #include - #include - #include - #include - #include - #include - #include - #include - #include - vec3 viewDir = normalize( vViewPosition ); - vec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) ); - vec3 y = cross( viewDir, x ); - vec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5; - #ifdef USE_MATCAP - vec4 matcapColor = texture2D( matcap, uv ); - #else - vec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 ); - #endif - vec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb; - #include - #include - #include - #include - #include - #include -}`,ave=`#define NORMAL -#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE ) - varying vec3 vViewPosition; -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -void main() { - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include -#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE ) - vViewPosition = - mvPosition.xyz; -#endif -}`,ove=`#define NORMAL -uniform float opacity; -#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE ) - varying vec3 vViewPosition; -#endif -#include -#include -#include -#include -#include -#include -#include -void main() { - vec4 diffuseColor = vec4( 0.0, 0.0, 0.0, opacity ); - #include - #include - #include - #include - gl_FragColor = vec4( packNormalToRGB( normal ), diffuseColor.a ); - #ifdef OPAQUE - gl_FragColor.a = 1.0; - #endif -}`,lve=`#define PHONG -varying vec3 vViewPosition; -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -void main() { - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - vViewPosition = - mvPosition.xyz; - #include - #include - #include - #include -}`,cve=`#define PHONG -uniform vec3 diffuse; -uniform vec3 emissive; -uniform vec3 specular; -uniform float shininess; -uniform float opacity; -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -void main() { - vec4 diffuseColor = vec4( diffuse, opacity ); - #include - ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) ); - vec3 totalEmissiveRadiance = emissive; - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance; - #include - #include - #include - #include - #include - #include - #include -}`,uve=`#define STANDARD -varying vec3 vViewPosition; -#ifdef USE_TRANSMISSION - varying vec3 vWorldPosition; -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -void main() { - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - vViewPosition = - mvPosition.xyz; - #include - #include - #include -#ifdef USE_TRANSMISSION - vWorldPosition = worldPosition.xyz; -#endif -}`,dve=`#define STANDARD -#ifdef PHYSICAL - #define IOR - #define USE_SPECULAR -#endif -uniform vec3 diffuse; -uniform vec3 emissive; -uniform float roughness; -uniform float metalness; -uniform float opacity; -#ifdef IOR - uniform float ior; -#endif -#ifdef USE_SPECULAR - uniform float specularIntensity; - uniform vec3 specularColor; - #ifdef USE_SPECULAR_COLORMAP - uniform sampler2D specularColorMap; - #endif - #ifdef USE_SPECULAR_INTENSITYMAP - uniform sampler2D specularIntensityMap; - #endif -#endif -#ifdef USE_CLEARCOAT - uniform float clearcoat; - uniform float clearcoatRoughness; -#endif -#ifdef USE_DISPERSION - uniform float dispersion; -#endif -#ifdef USE_IRIDESCENCE - uniform float iridescence; - uniform float iridescenceIOR; - uniform float iridescenceThicknessMinimum; - uniform float iridescenceThicknessMaximum; -#endif -#ifdef USE_SHEEN - uniform vec3 sheenColor; - uniform float sheenRoughness; - #ifdef USE_SHEEN_COLORMAP - uniform sampler2D sheenColorMap; - #endif - #ifdef USE_SHEEN_ROUGHNESSMAP - uniform sampler2D sheenRoughnessMap; - #endif -#endif -#ifdef USE_ANISOTROPY - uniform vec2 anisotropyVector; - #ifdef USE_ANISOTROPYMAP - uniform sampler2D anisotropyMap; - #endif -#endif -varying vec3 vViewPosition; -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -void main() { - vec4 diffuseColor = vec4( diffuse, opacity ); - #include - ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) ); - vec3 totalEmissiveRadiance = emissive; - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - vec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse; - vec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular; - #include - vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance; - #ifdef USE_SHEEN - float sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor ); - outgoingLight = outgoingLight * sheenEnergyComp + sheenSpecularDirect + sheenSpecularIndirect; - #endif - #ifdef USE_CLEARCOAT - float dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) ); - vec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc ); - outgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat; - #endif - #include - #include - #include - #include - #include - #include -}`,fve=`#define TOON -varying vec3 vViewPosition; -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -void main() { - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - vViewPosition = - mvPosition.xyz; - #include - #include - #include -}`,hve=`#define TOON -uniform vec3 diffuse; -uniform vec3 emissive; -uniform float opacity; -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -void main() { - vec4 diffuseColor = vec4( diffuse, opacity ); - #include - ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) ); - vec3 totalEmissiveRadiance = emissive; - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance; - #include - #include - #include - #include - #include - #include -}`,pve=`uniform float size; -uniform float scale; -#include -#include -#include -#include -#include -#include -#ifdef USE_POINTS_UV - varying vec2 vUv; - uniform mat3 uvTransform; -#endif -void main() { - #ifdef USE_POINTS_UV - vUv = ( uvTransform * vec3( uv, 1 ) ).xy; - #endif - #include - #include - #include - #include - #include - #include - gl_PointSize = size; - #ifdef USE_SIZEATTENUATION - bool isPerspective = isPerspectiveMatrix( projectionMatrix ); - if ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z ); - #endif - #include - #include - #include - #include -}`,mve=`uniform vec3 diffuse; -uniform float opacity; -#include -#include -#include -#include -#include -#include -#include -#include -void main() { - vec4 diffuseColor = vec4( diffuse, opacity ); - #include - vec3 outgoingLight = vec3( 0.0 ); - #include - #include - #include - #include - #include - outgoingLight = diffuseColor.rgb; - #include - #include - #include - #include - #include -}`,gve=`#include -#include -#include -#include -#include -#include -#include -void main() { - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include -}`,vve=`uniform vec3 color; -uniform float opacity; -#include -#include -#include -#include -#include -#include -#include -#include -void main() { - #include - gl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) ); - #include - #include - #include -}`,yve=`uniform float rotation; -uniform vec2 center; -#include -#include -#include -#include -#include -void main() { - #include - vec4 mvPosition = modelViewMatrix[ 3 ]; - vec2 scale = vec2( length( modelMatrix[ 0 ].xyz ), length( modelMatrix[ 1 ].xyz ) ); - #ifndef USE_SIZEATTENUATION - bool isPerspective = isPerspectiveMatrix( projectionMatrix ); - if ( isPerspective ) scale *= - mvPosition.z; - #endif - vec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale; - vec2 rotatedPosition; - rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y; - rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y; - mvPosition.xy += rotatedPosition; - gl_Position = projectionMatrix * mvPosition; - #include - #include - #include -}`,xve=`uniform vec3 diffuse; -uniform float opacity; -#include -#include -#include -#include -#include -#include -#include -#include -#include -void main() { - vec4 diffuseColor = vec4( diffuse, opacity ); - #include - vec3 outgoingLight = vec3( 0.0 ); - #include - #include - #include - #include - #include - outgoingLight = diffuseColor.rgb; - #include - #include - #include - #include -}`,fn={alphahash_fragment:Bpe,alphahash_pars_fragment:Hpe,alphamap_fragment:Vpe,alphamap_pars_fragment:Gpe,alphatest_fragment:Wpe,alphatest_pars_fragment:$pe,aomap_fragment:Xpe,aomap_pars_fragment:qpe,batching_pars_vertex:Kpe,batching_vertex:Ype,begin_vertex:Zpe,beginnormal_vertex:Qpe,bsdfs:Jpe,iridescence_fragment:eme,bumpmap_pars_fragment:tme,clipping_planes_fragment:nme,clipping_planes_pars_fragment:rme,clipping_planes_pars_vertex:ime,clipping_planes_vertex:sme,color_fragment:ame,color_pars_fragment:ome,color_pars_vertex:lme,color_vertex:cme,common:ume,cube_uv_reflection_fragment:dme,defaultnormal_vertex:fme,displacementmap_pars_vertex:hme,displacementmap_vertex:pme,emissivemap_fragment:mme,emissivemap_pars_fragment:gme,colorspace_fragment:vme,colorspace_pars_fragment:yme,envmap_fragment:xme,envmap_common_pars_fragment:bme,envmap_pars_fragment:_me,envmap_pars_vertex:wme,envmap_physical_pars_fragment:kme,envmap_vertex:Sme,fog_vertex:Mme,fog_pars_vertex:Eme,fog_fragment:Ame,fog_pars_fragment:Tme,gradientmap_pars_fragment:Pme,lightmap_pars_fragment:Cme,lights_lambert_fragment:Rme,lights_lambert_pars_fragment:Nme,lights_pars_begin:Ime,lights_toon_fragment:Ome,lights_toon_pars_fragment:Lme,lights_phong_fragment:Dme,lights_phong_pars_fragment:Ume,lights_physical_fragment:jme,lights_physical_pars_fragment:Fme,lights_fragment_begin:zme,lights_fragment_maps:Bme,lights_fragment_end:Hme,logdepthbuf_fragment:Vme,logdepthbuf_pars_fragment:Gme,logdepthbuf_pars_vertex:Wme,logdepthbuf_vertex:$me,map_fragment:Xme,map_pars_fragment:qme,map_particle_fragment:Kme,map_particle_pars_fragment:Yme,metalnessmap_fragment:Zme,metalnessmap_pars_fragment:Qme,morphinstance_vertex:Jme,morphcolor_vertex:ege,morphnormal_vertex:tge,morphtarget_pars_vertex:nge,morphtarget_vertex:rge,normal_fragment_begin:ige,normal_fragment_maps:sge,normal_pars_fragment:age,normal_pars_vertex:oge,normal_vertex:lge,normalmap_pars_fragment:cge,clearcoat_normal_fragment_begin:uge,clearcoat_normal_fragment_maps:dge,clearcoat_pars_fragment:fge,iridescence_pars_fragment:hge,opaque_fragment:pge,packing:mge,premultiplied_alpha_fragment:gge,project_vertex:vge,dithering_fragment:yge,dithering_pars_fragment:xge,roughnessmap_fragment:bge,roughnessmap_pars_fragment:_ge,shadowmap_pars_fragment:wge,shadowmap_pars_vertex:Sge,shadowmap_vertex:Mge,shadowmask_pars_fragment:Ege,skinbase_vertex:Age,skinning_pars_vertex:Tge,skinning_vertex:Pge,skinnormal_vertex:Cge,specularmap_fragment:Rge,specularmap_pars_fragment:Nge,tonemapping_fragment:Ige,tonemapping_pars_fragment:kge,transmission_fragment:Oge,transmission_pars_fragment:Lge,uv_pars_fragment:Dge,uv_pars_vertex:Uge,uv_vertex:jge,worldpos_vertex:Fge,background_vert:zge,background_frag:Bge,backgroundCube_vert:Hge,backgroundCube_frag:Vge,cube_vert:Gge,cube_frag:Wge,depth_vert:$ge,depth_frag:Xge,distanceRGBA_vert:qge,distanceRGBA_frag:Kge,equirect_vert:Yge,equirect_frag:Zge,linedashed_vert:Qge,linedashed_frag:Jge,meshbasic_vert:eve,meshbasic_frag:tve,meshlambert_vert:nve,meshlambert_frag:rve,meshmatcap_vert:ive,meshmatcap_frag:sve,meshnormal_vert:ave,meshnormal_frag:ove,meshphong_vert:lve,meshphong_frag:cve,meshphysical_vert:uve,meshphysical_frag:dve,meshtoon_vert:fve,meshtoon_frag:hve,points_vert:pve,points_frag:mve,shadow_vert:gve,shadow_frag:vve,sprite_vert:yve,sprite_frag:xve},ft={common:{diffuse:{value:new ct(16777215)},opacity:{value:1},map:{value:null},mapTransform:{value:new $t},alphaMap:{value:null},alphaMapTransform:{value:new $t},alphaTest:{value:0}},specularmap:{specularMap:{value:null},specularMapTransform:{value:new $t}},envmap:{envMap:{value:null},envMapRotation:{value:new $t},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1},aoMapTransform:{value:new $t}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1},lightMapTransform:{value:new $t}},bumpmap:{bumpMap:{value:null},bumpMapTransform:{value:new $t},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalMapTransform:{value:new $t},normalScale:{value:new He(1,1)}},displacementmap:{displacementMap:{value:null},displacementMapTransform:{value:new $t},displacementScale:{value:1},displacementBias:{value:0}},emissivemap:{emissiveMap:{value:null},emissiveMapTransform:{value:new $t}},metalnessmap:{metalnessMap:{value:null},metalnessMapTransform:{value:new $t}},roughnessmap:{roughnessMap:{value:null},roughnessMapTransform:{value:new $t}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new ct(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotShadowMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new ct(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaMapTransform:{value:new $t},alphaTest:{value:0},uvTransform:{value:new $t}},sprite:{diffuse:{value:new ct(16777215)},opacity:{value:1},center:{value:new He(.5,.5)},rotation:{value:0},map:{value:null},mapTransform:{value:new $t},alphaMap:{value:null},alphaMapTransform:{value:new $t},alphaTest:{value:0}}},Do={basic:{uniforms:_s([ft.common,ft.specularmap,ft.envmap,ft.aomap,ft.lightmap,ft.fog]),vertexShader:fn.meshbasic_vert,fragmentShader:fn.meshbasic_frag},lambert:{uniforms:_s([ft.common,ft.specularmap,ft.envmap,ft.aomap,ft.lightmap,ft.emissivemap,ft.bumpmap,ft.normalmap,ft.displacementmap,ft.fog,ft.lights,{emissive:{value:new ct(0)}}]),vertexShader:fn.meshlambert_vert,fragmentShader:fn.meshlambert_frag},phong:{uniforms:_s([ft.common,ft.specularmap,ft.envmap,ft.aomap,ft.lightmap,ft.emissivemap,ft.bumpmap,ft.normalmap,ft.displacementmap,ft.fog,ft.lights,{emissive:{value:new ct(0)},specular:{value:new ct(1118481)},shininess:{value:30}}]),vertexShader:fn.meshphong_vert,fragmentShader:fn.meshphong_frag},standard:{uniforms:_s([ft.common,ft.envmap,ft.aomap,ft.lightmap,ft.emissivemap,ft.bumpmap,ft.normalmap,ft.displacementmap,ft.roughnessmap,ft.metalnessmap,ft.fog,ft.lights,{emissive:{value:new ct(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:fn.meshphysical_vert,fragmentShader:fn.meshphysical_frag},toon:{uniforms:_s([ft.common,ft.aomap,ft.lightmap,ft.emissivemap,ft.bumpmap,ft.normalmap,ft.displacementmap,ft.gradientmap,ft.fog,ft.lights,{emissive:{value:new ct(0)}}]),vertexShader:fn.meshtoon_vert,fragmentShader:fn.meshtoon_frag},matcap:{uniforms:_s([ft.common,ft.bumpmap,ft.normalmap,ft.displacementmap,ft.fog,{matcap:{value:null}}]),vertexShader:fn.meshmatcap_vert,fragmentShader:fn.meshmatcap_frag},points:{uniforms:_s([ft.points,ft.fog]),vertexShader:fn.points_vert,fragmentShader:fn.points_frag},dashed:{uniforms:_s([ft.common,ft.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:fn.linedashed_vert,fragmentShader:fn.linedashed_frag},depth:{uniforms:_s([ft.common,ft.displacementmap]),vertexShader:fn.depth_vert,fragmentShader:fn.depth_frag},normal:{uniforms:_s([ft.common,ft.bumpmap,ft.normalmap,ft.displacementmap,{opacity:{value:1}}]),vertexShader:fn.meshnormal_vert,fragmentShader:fn.meshnormal_frag},sprite:{uniforms:_s([ft.sprite,ft.fog]),vertexShader:fn.sprite_vert,fragmentShader:fn.sprite_frag},background:{uniforms:{uvTransform:{value:new $t},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:fn.background_vert,fragmentShader:fn.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1},backgroundRotation:{value:new $t}},vertexShader:fn.backgroundCube_vert,fragmentShader:fn.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:fn.cube_vert,fragmentShader:fn.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:fn.equirect_vert,fragmentShader:fn.equirect_frag},distanceRGBA:{uniforms:_s([ft.common,ft.displacementmap,{referencePosition:{value:new q},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:fn.distanceRGBA_vert,fragmentShader:fn.distanceRGBA_frag},shadow:{uniforms:_s([ft.lights,ft.fog,{color:{value:new ct(0)},opacity:{value:1}}]),vertexShader:fn.shadow_vert,fragmentShader:fn.shadow_frag}};Do.physical={uniforms:_s([Do.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatMapTransform:{value:new $t},clearcoatNormalMap:{value:null},clearcoatNormalMapTransform:{value:new $t},clearcoatNormalScale:{value:new He(1,1)},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatRoughnessMapTransform:{value:new $t},dispersion:{value:0},iridescence:{value:0},iridescenceMap:{value:null},iridescenceMapTransform:{value:new $t},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},iridescenceThicknessMapTransform:{value:new $t},sheen:{value:0},sheenColor:{value:new ct(0)},sheenColorMap:{value:null},sheenColorMapTransform:{value:new $t},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},sheenRoughnessMapTransform:{value:new $t},transmission:{value:0},transmissionMap:{value:null},transmissionMapTransform:{value:new $t},transmissionSamplerSize:{value:new He},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},thicknessMapTransform:{value:new $t},attenuationDistance:{value:0},attenuationColor:{value:new ct(0)},specularColor:{value:new ct(1,1,1)},specularColorMap:{value:null},specularColorMapTransform:{value:new $t},specularIntensity:{value:1},specularIntensityMap:{value:null},specularIntensityMapTransform:{value:new $t},anisotropyVector:{value:new He},anisotropyMap:{value:null},anisotropyMapTransform:{value:new $t}}]),vertexShader:fn.meshphysical_vert,fragmentShader:fn.meshphysical_frag};const r_={r:0,b:0,g:0},kf=new ls,bve=new Ct;function _ve(t,e,n,r,i,s,a){const o=new ct(0);let l=s===!0?0:1,c,d,f=null,p=0,y=null;function b(M){let T=M.isScene===!0?M.background:null;return T&&T.isTexture&&(T=(M.backgroundBlurriness>0?n:e).get(T)),T}function S(M){let T=!1;const P=b(M);P===null?x(o,l):P&&P.isColor&&(x(P,1),T=!0);const O=t.xr.getEnvironmentBlendMode();O==="additive"?r.buffers.color.setClear(0,0,0,1,a):O==="alpha-blend"&&r.buffers.color.setClear(0,0,0,0,a),(t.autoClear||T)&&(r.buffers.depth.setTest(!0),r.buffers.depth.setMask(!0),r.buffers.color.setMask(!0),t.clear(t.autoClearColor,t.autoClearDepth,t.autoClearStencil))}function w(M,T){const P=b(T);P&&(P.isCubeTexture||P.mapping===nv)?(d===void 0&&(d=new xr(new tp(1,1,1),new Ya({name:"BackgroundCubeMaterial",uniforms:Ug(Do.backgroundCube.uniforms),vertexShader:Do.backgroundCube.vertexShader,fragmentShader:Do.backgroundCube.fragmentShader,side:as,depthTest:!1,depthWrite:!1,fog:!1})),d.geometry.deleteAttribute("normal"),d.geometry.deleteAttribute("uv"),d.onBeforeRender=function(O,N,D){this.matrixWorld.copyPosition(D.matrixWorld)},Object.defineProperty(d.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),i.update(d)),kf.copy(T.backgroundRotation),kf.x*=-1,kf.y*=-1,kf.z*=-1,P.isCubeTexture&&P.isRenderTargetTexture===!1&&(kf.y*=-1,kf.z*=-1),d.material.uniforms.envMap.value=P,d.material.uniforms.flipEnvMap.value=P.isCubeTexture&&P.isRenderTargetTexture===!1?-1:1,d.material.uniforms.backgroundBlurriness.value=T.backgroundBlurriness,d.material.uniforms.backgroundIntensity.value=T.backgroundIntensity,d.material.uniforms.backgroundRotation.value.setFromMatrix4(bve.makeRotationFromEuler(kf)),d.material.toneMapped=Nn.getTransfer(P.colorSpace)!==er,(f!==P||p!==P.version||y!==t.toneMapping)&&(d.material.needsUpdate=!0,f=P,p=P.version,y=t.toneMapping),d.layers.enableAll(),M.unshift(d,d.geometry,d.material,0,0,null)):P&&P.isTexture&&(c===void 0&&(c=new xr(new iv(2,2),new Ya({name:"BackgroundMaterial",uniforms:Ug(Do.background.uniforms),vertexShader:Do.background.vertexShader,fragmentShader:Do.background.fragmentShader,side:Ll,depthTest:!1,depthWrite:!1,fog:!1})),c.geometry.deleteAttribute("normal"),Object.defineProperty(c.material,"map",{get:function(){return this.uniforms.t2D.value}}),i.update(c)),c.material.uniforms.t2D.value=P,c.material.uniforms.backgroundIntensity.value=T.backgroundIntensity,c.material.toneMapped=Nn.getTransfer(P.colorSpace)!==er,P.matrixAutoUpdate===!0&&P.updateMatrix(),c.material.uniforms.uvTransform.value.copy(P.matrix),(f!==P||p!==P.version||y!==t.toneMapping)&&(c.material.needsUpdate=!0,f=P,p=P.version,y=t.toneMapping),c.layers.enableAll(),M.unshift(c,c.geometry,c.material,0,0,null))}function x(M,T){M.getRGB(r_,m6(t)),r.buffers.color.setClear(r_.r,r_.g,r_.b,T,a)}return{getClearColor:function(){return o},setClearColor:function(M,T=1){o.set(M),l=T,x(o,l)},getClearAlpha:function(){return l},setClearAlpha:function(M){l=M,x(o,l)},render:S,addToRenderList:w}}function wve(t,e){const n=t.getParameter(t.MAX_VERTEX_ATTRIBS),r={},i=p(null);let s=i,a=!1;function o(k,j,X,ee,ie){let pe=!1;const ae=f(ee,X,j);s!==ae&&(s=ae,c(s.object)),pe=y(k,ee,X,ie),pe&&b(k,ee,X,ie),ie!==null&&e.update(ie,t.ELEMENT_ARRAY_BUFFER),(pe||a)&&(a=!1,P(k,j,X,ee),ie!==null&&t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,e.get(ie).buffer))}function l(){return t.createVertexArray()}function c(k){return t.bindVertexArray(k)}function d(k){return t.deleteVertexArray(k)}function f(k,j,X){const ee=X.wireframe===!0;let ie=r[k.id];ie===void 0&&(ie={},r[k.id]=ie);let pe=ie[j.id];pe===void 0&&(pe={},ie[j.id]=pe);let ae=pe[ee];return ae===void 0&&(ae=p(l()),pe[ee]=ae),ae}function p(k){const j=[],X=[],ee=[];for(let ie=0;ie=0){const Y=ie[B];let H=pe[B];if(H===void 0&&(B==="instanceMatrix"&&k.instanceMatrix&&(H=k.instanceMatrix),B==="instanceColor"&&k.instanceColor&&(H=k.instanceColor)),Y===void 0||Y.attribute!==H||H&&Y.data!==H.data)return!0;ae++}return s.attributesNum!==ae||s.index!==ee}function b(k,j,X,ee){const ie={},pe=j.attributes;let ae=0;const he=X.getAttributes();for(const B in he)if(he[B].location>=0){let Y=pe[B];Y===void 0&&(B==="instanceMatrix"&&k.instanceMatrix&&(Y=k.instanceMatrix),B==="instanceColor"&&k.instanceColor&&(Y=k.instanceColor));const H={};H.attribute=Y,Y&&Y.data&&(H.data=Y.data),ie[B]=H,ae++}s.attributes=ie,s.attributesNum=ae,s.index=ee}function S(){const k=s.newAttributes;for(let j=0,X=k.length;j=0){let J=ie[he];if(J===void 0&&(he==="instanceMatrix"&&k.instanceMatrix&&(J=k.instanceMatrix),he==="instanceColor"&&k.instanceColor&&(J=k.instanceColor)),J!==void 0){const Y=J.normalized,H=J.itemSize,G=e.get(J);if(G===void 0)continue;const le=G.buffer,se=G.type,ce=G.bytesPerElement,Se=se===t.INT||se===t.UNSIGNED_INT||J.gpuType===GS;if(J.isInterleavedBufferAttribute){const we=J.data,We=we.stride,Ee=J.offset;if(we.isInstancedInterleavedBuffer){for(let Ge=0;Ge0&&t.getShaderPrecisionFormat(t.FRAGMENT_SHADER,t.HIGH_FLOAT).precision>0)return"highp";D="mediump"}return D==="mediump"&&t.getShaderPrecisionFormat(t.VERTEX_SHADER,t.MEDIUM_FLOAT).precision>0&&t.getShaderPrecisionFormat(t.FRAGMENT_SHADER,t.MEDIUM_FLOAT).precision>0?"mediump":"lowp"}let c=n.precision!==void 0?n.precision:"highp";const d=l(c);d!==c&&(console.warn("THREE.WebGLRenderer:",c,"not supported, using",d,"instead."),c=d);const f=n.logarithmicDepthBuffer===!0,p=n.reverseDepthBuffer===!0&&e.has("EXT_clip_control");if(p===!0){const D=e.get("EXT_clip_control");D.clipControlEXT(D.LOWER_LEFT_EXT,D.ZERO_TO_ONE_EXT)}const y=t.getParameter(t.MAX_TEXTURE_IMAGE_UNITS),b=t.getParameter(t.MAX_VERTEX_TEXTURE_IMAGE_UNITS),S=t.getParameter(t.MAX_TEXTURE_SIZE),w=t.getParameter(t.MAX_CUBE_MAP_TEXTURE_SIZE),x=t.getParameter(t.MAX_VERTEX_ATTRIBS),M=t.getParameter(t.MAX_VERTEX_UNIFORM_VECTORS),T=t.getParameter(t.MAX_VARYING_VECTORS),P=t.getParameter(t.MAX_FRAGMENT_UNIFORM_VECTORS),O=b>0,N=t.getParameter(t.MAX_SAMPLES);return{isWebGL2:!0,getMaxAnisotropy:s,getMaxPrecision:l,textureFormatReadable:a,textureTypeReadable:o,precision:c,logarithmicDepthBuffer:f,reverseDepthBuffer:p,maxTextures:y,maxVertexTextures:b,maxTextureSize:S,maxCubemapSize:w,maxAttributes:x,maxVertexUniforms:M,maxVaryings:T,maxFragmentUniforms:P,vertexTextures:O,maxSamples:N}}function Eve(t){const e=this;let n=null,r=0,i=!1,s=!1;const a=new Rc,o=new $t,l={value:null,needsUpdate:!1};this.uniform=l,this.numPlanes=0,this.numIntersection=0,this.init=function(f,p){const y=f.length!==0||p||r!==0||i;return i=p,r=f.length,y},this.beginShadows=function(){s=!0,d(null)},this.endShadows=function(){s=!1},this.setGlobalState=function(f,p){n=d(f,p,0)},this.setState=function(f,p,y){const b=f.clippingPlanes,S=f.clipIntersection,w=f.clipShadows,x=t.get(f);if(!i||b===null||b.length===0||s&&!w)s?d(null):c();else{const M=s?0:r,T=M*4;let P=x.clippingState||null;l.value=P,P=d(b,p,T,y);for(let O=0;O!==T;++O)P[O]=n[O];x.clippingState=P,this.numIntersection=S?this.numPlanes:0,this.numPlanes+=M}};function c(){l.value!==n&&(l.value=n,l.needsUpdate=r>0),e.numPlanes=r,e.numIntersection=0}function d(f,p,y,b){const S=f!==null?f.length:0;let w=null;if(S!==0){if(w=l.value,b!==!0||w===null){const x=y+S*4,M=p.matrixWorldInverse;o.getNormalMatrix(M),(w===null||w.length0){const c=new v6(l.height);return c.fromEquirectangularTexture(t,a),e.set(a,c),a.addEventListener("dispose",i),n(c.texture,a.mapping)}else return null}}return a}function i(a){const o=a.target;o.removeEventListener("dispose",i);const l=e.get(o);l!==void 0&&(e.delete(o),l.dispose())}function s(){e=new WeakMap}return{get:r,dispose:s}}class Gc extends fx{constructor(e=-1,n=1,r=1,i=-1,s=.1,a=2e3){super(),this.isOrthographicCamera=!0,this.type="OrthographicCamera",this.zoom=1,this.view=null,this.left=e,this.right=n,this.top=r,this.bottom=i,this.near=s,this.far=a,this.updateProjectionMatrix()}copy(e,n){return super.copy(e,n),this.left=e.left,this.right=e.right,this.top=e.top,this.bottom=e.bottom,this.near=e.near,this.far=e.far,this.zoom=e.zoom,this.view=e.view===null?null:Object.assign({},e.view),this}setViewOffset(e,n,r,i,s,a){this.view===null&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=e,this.view.fullHeight=n,this.view.offsetX=r,this.view.offsetY=i,this.view.width=s,this.view.height=a,this.updateProjectionMatrix()}clearViewOffset(){this.view!==null&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const e=(this.right-this.left)/(2*this.zoom),n=(this.top-this.bottom)/(2*this.zoom),r=(this.right+this.left)/2,i=(this.top+this.bottom)/2;let s=r-e,a=r+e,o=i+n,l=i-n;if(this.view!==null&&this.view.enabled){const c=(this.right-this.left)/this.view.fullWidth/this.zoom,d=(this.top-this.bottom)/this.view.fullHeight/this.zoom;s+=c*this.view.offsetX,a=s+c*this.view.width,o-=d*this.view.offsetY,l=o-d*this.view.height}this.projectionMatrix.makeOrthographic(s,a,o,l,this.near,this.far,this.coordinateSystem),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(e){const n=super.toJSON(e);return n.object.zoom=this.zoom,n.object.left=this.left,n.object.right=this.right,n.object.top=this.top,n.object.bottom=this.bottom,n.object.near=this.near,n.object.far=this.far,this.view!==null&&(n.object.view=Object.assign({},this.view)),n}}const Xm=4,oD=[.125,.215,.35,.446,.526,.582],eh=20,gA=new Gc,lD=new ct;let vA=null,yA=0,xA=0,bA=!1;const Qf=(1+Math.sqrt(5))/2,Em=1/Qf,cD=[new q(-Qf,Em,0),new q(Qf,Em,0),new q(-Em,0,Qf),new q(Em,0,Qf),new q(0,Qf,-Em),new q(0,Qf,Em),new q(-1,1,-1),new q(1,1,-1),new q(-1,1,1),new q(1,1,1)];class qP{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._compileMaterial(this._blurMaterial)}fromScene(e,n=0,r=.1,i=100){vA=this._renderer.getRenderTarget(),yA=this._renderer.getActiveCubeFace(),xA=this._renderer.getActiveMipmapLevel(),bA=this._renderer.xr.enabled,this._renderer.xr.enabled=!1,this._setSize(256);const s=this._allocateTargets();return s.depthBuffer=!0,this._sceneToCubeUV(e,r,i,s),n>0&&this._blur(s,0,0,n),this._applyPMREM(s),this._cleanup(s),s}fromEquirectangular(e,n=null){return this._fromTexture(e,n)}fromCubemap(e,n=null){return this._fromTexture(e,n)}compileCubemapShader(){this._cubemapMaterial===null&&(this._cubemapMaterial=fD(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){this._equirectMaterial===null&&(this._equirectMaterial=dD(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),this._cubemapMaterial!==null&&this._cubemapMaterial.dispose(),this._equirectMaterial!==null&&this._equirectMaterial.dispose()}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){this._blurMaterial!==null&&this._blurMaterial.dispose(),this._pingPongRenderTarget!==null&&this._pingPongRenderTarget.dispose();for(let e=0;e2?T:0,T,T),d.setRenderTarget(i),S&&d.render(b,o),d.render(e,o)}b.geometry.dispose(),b.material.dispose(),d.toneMapping=p,d.autoClear=f,e.background=w}_textureToCubeUV(e,n){const r=this._renderer,i=e.mapping===Zc||e.mapping===Cd;i?(this._cubemapMaterial===null&&(this._cubemapMaterial=fD()),this._cubemapMaterial.uniforms.flipEnvMap.value=e.isRenderTargetTexture===!1?-1:1):this._equirectMaterial===null&&(this._equirectMaterial=dD());const s=i?this._cubemapMaterial:this._equirectMaterial,a=new xr(this._lodPlanes[0],s),o=s.uniforms;o.envMap.value=e;const l=this._cubeSize;i_(n,0,0,3*l,2*l),r.setRenderTarget(n),r.render(a,gA)}_applyPMREM(e){const n=this._renderer,r=n.autoClear;n.autoClear=!1;const i=this._lodPlanes.length;for(let s=1;seh&&console.warn(`sigmaRadians, ${s}, is too large and will clip, as it requested ${w} samples when the maximum is set to ${eh}`);const x=[];let M=0;for(let D=0;DT-Xm?i-T+Xm:0),N=4*(this._cubeSize-P);i_(n,O,N,3*P,2*P),l.setRenderTarget(n),l.render(f,gA)}}function Tve(t){const e=[],n=[],r=[];let i=t;const s=t-Xm+1+oD.length;for(let a=0;at-Xm?l=oD[a-t+Xm-1]:a===0&&(l=0),r.push(l);const c=1/(o-2),d=-c,f=1+c,p=[d,d,f,d,f,f,d,d,f,f,d,f],y=6,b=6,S=3,w=2,x=1,M=new Float32Array(S*b*y),T=new Float32Array(w*b*y),P=new Float32Array(x*b*y);for(let N=0;N2?0:-1,V=[D,z,0,D+2/3,z,0,D+2/3,z+1,0,D,z,0,D+2/3,z+1,0,D,z+1,0];M.set(V,S*b*N),T.set(p,w*b*N);const k=[N,N,N,N,N,N];P.set(k,x*b*N)}const O=new Yt;O.setAttribute("position",new Qt(M,S)),O.setAttribute("uv",new Qt(T,w)),O.setAttribute("faceIndex",new Qt(P,x)),e.push(O),i>Xm&&i--}return{lodPlanes:e,sizeLods:n,sigmas:r}}function uD(t,e,n){const r=new Vo(t,e,n);return r.texture.mapping=nv,r.texture.name="PMREM.cubeUv",r.scissorTest=!0,r}function i_(t,e,n,r,i){t.viewport.set(e,n,r,i),t.scissor.set(e,n,r,i)}function Pve(t,e,n){const r=new Float32Array(eh),i=new q(0,1,0);return new Ya({name:"SphericalGaussianBlur",defines:{n:eh,CUBEUV_TEXEL_WIDTH:1/e,CUBEUV_TEXEL_HEIGHT:1/n,CUBEUV_MAX_MIP:`${t}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:r},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:i}},vertexShader:PR(),fragmentShader:` - - precision mediump float; - precision mediump int; - - varying vec3 vOutputDirection; - - uniform sampler2D envMap; - uniform int samples; - uniform float weights[ n ]; - uniform bool latitudinal; - uniform float dTheta; - uniform float mipInt; - uniform vec3 poleAxis; - - #define ENVMAP_TYPE_CUBE_UV - #include - - vec3 getSample( float theta, vec3 axis ) { - - float cosTheta = cos( theta ); - // Rodrigues' axis-angle rotation - vec3 sampleDirection = vOutputDirection * cosTheta - + cross( axis, vOutputDirection ) * sin( theta ) - + axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta ); - - return bilinearCubeUV( envMap, sampleDirection, mipInt ); - - } - - void main() { - - vec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection ); - - if ( all( equal( axis, vec3( 0.0 ) ) ) ) { - - axis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x ); - - } - - axis = normalize( axis ); - - gl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 ); - gl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis ); - - for ( int i = 1; i < n; i++ ) { - - if ( i >= samples ) { - - break; - - } - - float theta = dTheta * float( i ); - gl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis ); - gl_FragColor.rgb += weights[ i ] * getSample( theta, axis ); - - } - - } - `,blending:Vc,depthTest:!1,depthWrite:!1})}function dD(){return new Ya({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:PR(),fragmentShader:` - - precision mediump float; - precision mediump int; - - varying vec3 vOutputDirection; - - uniform sampler2D envMap; - - #include - - void main() { - - vec3 outputDirection = normalize( vOutputDirection ); - vec2 uv = equirectUv( outputDirection ); - - gl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 ); - - } - `,blending:Vc,depthTest:!1,depthWrite:!1})}function fD(){return new Ya({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:PR(),fragmentShader:` - - precision mediump float; - precision mediump int; - - uniform float flipEnvMap; - - varying vec3 vOutputDirection; - - uniform samplerCube envMap; - - void main() { - - gl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) ); - - } - `,blending:Vc,depthTest:!1,depthWrite:!1})}function PR(){return` - - precision mediump float; - precision mediump int; - - attribute float faceIndex; - - varying vec3 vOutputDirection; - - // RH coordinate system; PMREM face-indexing convention - vec3 getDirection( vec2 uv, float face ) { - - uv = 2.0 * uv - 1.0; - - vec3 direction = vec3( uv, 1.0 ); - - if ( face == 0.0 ) { - - direction = direction.zyx; // ( 1, v, u ) pos x - - } else if ( face == 1.0 ) { - - direction = direction.xzy; - direction.xz *= -1.0; // ( -u, 1, -v ) pos y - - } else if ( face == 2.0 ) { - - direction.x *= -1.0; // ( -u, v, 1 ) pos z - - } else if ( face == 3.0 ) { - - direction = direction.zyx; - direction.xz *= -1.0; // ( -1, v, -u ) neg x - - } else if ( face == 4.0 ) { - - direction = direction.xzy; - direction.xy *= -1.0; // ( -u, -1, v ) neg y - - } else if ( face == 5.0 ) { - - direction.z *= -1.0; // ( u, v, -1 ) neg z - - } - - return direction; - - } - - void main() { - - vOutputDirection = getDirection( uv, faceIndex ); - gl_Position = vec4( position, 1.0 ); - - } - `}function Cve(t){let e=new WeakMap,n=null;function r(o){if(o&&o.isTexture){const l=o.mapping,c=l===Ay||l===Ty,d=l===Zc||l===Cd;if(c||d){let f=e.get(o);const p=f!==void 0?f.texture.pmremVersion:0;if(o.isRenderTargetTexture&&o.pmremVersion!==p)return n===null&&(n=new qP(t)),f=c?n.fromEquirectangular(o,f):n.fromCubemap(o,f),f.texture.pmremVersion=o.pmremVersion,e.set(o,f),f.texture;if(f!==void 0)return f.texture;{const y=o.image;return c&&y&&y.height>0||d&&y&&i(y)?(n===null&&(n=new qP(t)),f=c?n.fromEquirectangular(o):n.fromCubemap(o),f.texture.pmremVersion=o.pmremVersion,e.set(o,f),o.addEventListener("dispose",s),f.texture):null}}}return o}function i(o){let l=0;const c=6;for(let d=0;de.maxTextureSize&&(O=Math.ceil(P/e.maxTextureSize),P=e.maxTextureSize);const N=new Float32Array(P*O*4*f),D=new QS(N,P,O,f);D.type=Qs,D.needsUpdate=!0;const z=T*4;for(let k=0;k0)return t;const i=e*n;let s=pD[i];if(s===void 0&&(s=new Float32Array(i),pD[i]=s),e!==0){r.toArray(s,0);for(let a=1,o=0;a!==e;++a)o+=n,t[a].toArray(s,o)}return s}function ii(t,e){if(t.length!==e.length)return!1;for(let n=0,r=t.length;n":" "} ${o}: ${n[a]}`)}return r.join(` -`)}function C0e(t){const e=Nn.getPrimaries(Nn.workingColorSpace),n=Nn.getPrimaries(t);let r;switch(e===n?r="":e===Ny&&n===Ry?r="LinearDisplayP3ToLinearSRGB":e===Ry&&n===Ny&&(r="LinearSRGBToLinearDisplayP3"),t){case xi:case dx:return[r,"LinearTransferOETF"];case Fi:case ZS:return[r,"sRGBTransferOETF"];default:return console.warn("THREE.WebGLProgram: Unsupported color space:",t),[r,"LinearTransferOETF"]}}function _D(t,e,n){const r=t.getShaderParameter(e,t.COMPILE_STATUS),i=t.getShaderInfoLog(e).trim();if(r&&i==="")return"";const s=/ERROR: 0:(\d+)/.exec(i);if(s){const a=parseInt(s[1]);return n.toUpperCase()+` - -`+i+` - -`+P0e(t.getShaderSource(e),a)}else return i}function R0e(t,e){const n=C0e(e);return`vec4 ${t}( vec4 value ) { return ${n[0]}( ${n[1]}( value ) ); }`}function N0e(t,e){let n;switch(e){case HV:n="Linear";break;case VV:n="Reinhard";break;case GV:n="Cineon";break;case uR:n="ACESFilmic";break;case $V:n="AgX";break;case XV:n="Neutral";break;case WV:n="Custom";break;default:console.warn("THREE.WebGLProgram: Unsupported toneMapping:",e),n="Linear"}return"vec3 "+t+"( vec3 color ) { return "+n+"ToneMapping( color ); }"}const s_=new q;function I0e(){Nn.getLuminanceCoefficients(s_);const t=s_.x.toFixed(4),e=s_.y.toFixed(4),n=s_.z.toFixed(4);return["float luminance( const in vec3 rgb ) {",` const vec3 weights = vec3( ${t}, ${e}, ${n} );`," return dot( weights, rgb );","}"].join(` -`)}function k0e(t){return[t.extensionClipCullDistance?"#extension GL_ANGLE_clip_cull_distance : require":"",t.extensionMultiDraw?"#extension GL_ANGLE_multi_draw : require":""].filter(W0).join(` -`)}function O0e(t){const e=[];for(const n in t){const r=t[n];r!==!1&&e.push("#define "+n+" "+r)}return e.join(` -`)}function L0e(t,e){const n={},r=t.getProgramParameter(e,t.ACTIVE_ATTRIBUTES);for(let i=0;i/gm;function KP(t){return t.replace(D0e,j0e)}const U0e=new Map;function j0e(t,e){let n=fn[e];if(n===void 0){const r=U0e.get(e);if(r!==void 0)n=fn[r],console.warn('THREE.WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.',e,r);else throw new Error("Can not resolve #include <"+e+">")}return KP(n)}const F0e=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function MD(t){return t.replace(F0e,z0e)}function z0e(t,e,n,r){let i="";for(let s=parseInt(e);s0&&(w+=` -`),x=["#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,b].filter(W0).join(` -`),x.length>0&&(x+=` -`)):(w=[ED(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,b,n.extensionClipCullDistance?"#define USE_CLIP_DISTANCE":"",n.batching?"#define USE_BATCHING":"",n.batchingColor?"#define USE_BATCHING_COLOR":"",n.instancing?"#define USE_INSTANCING":"",n.instancingColor?"#define USE_INSTANCING_COLOR":"",n.instancingMorph?"#define USE_INSTANCING_MORPH":"",n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+d:"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",n.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",n.displacementMap?"#define USE_DISPLACEMENTMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.anisotropy?"#define USE_ANISOTROPY":"",n.anisotropyMap?"#define USE_ANISOTROPYMAP":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",n.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",n.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.alphaHash?"#define USE_ALPHAHASH":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",n.mapUv?"#define MAP_UV "+n.mapUv:"",n.alphaMapUv?"#define ALPHAMAP_UV "+n.alphaMapUv:"",n.lightMapUv?"#define LIGHTMAP_UV "+n.lightMapUv:"",n.aoMapUv?"#define AOMAP_UV "+n.aoMapUv:"",n.emissiveMapUv?"#define EMISSIVEMAP_UV "+n.emissiveMapUv:"",n.bumpMapUv?"#define BUMPMAP_UV "+n.bumpMapUv:"",n.normalMapUv?"#define NORMALMAP_UV "+n.normalMapUv:"",n.displacementMapUv?"#define DISPLACEMENTMAP_UV "+n.displacementMapUv:"",n.metalnessMapUv?"#define METALNESSMAP_UV "+n.metalnessMapUv:"",n.roughnessMapUv?"#define ROUGHNESSMAP_UV "+n.roughnessMapUv:"",n.anisotropyMapUv?"#define ANISOTROPYMAP_UV "+n.anisotropyMapUv:"",n.clearcoatMapUv?"#define CLEARCOATMAP_UV "+n.clearcoatMapUv:"",n.clearcoatNormalMapUv?"#define CLEARCOAT_NORMALMAP_UV "+n.clearcoatNormalMapUv:"",n.clearcoatRoughnessMapUv?"#define CLEARCOAT_ROUGHNESSMAP_UV "+n.clearcoatRoughnessMapUv:"",n.iridescenceMapUv?"#define IRIDESCENCEMAP_UV "+n.iridescenceMapUv:"",n.iridescenceThicknessMapUv?"#define IRIDESCENCE_THICKNESSMAP_UV "+n.iridescenceThicknessMapUv:"",n.sheenColorMapUv?"#define SHEEN_COLORMAP_UV "+n.sheenColorMapUv:"",n.sheenRoughnessMapUv?"#define SHEEN_ROUGHNESSMAP_UV "+n.sheenRoughnessMapUv:"",n.specularMapUv?"#define SPECULARMAP_UV "+n.specularMapUv:"",n.specularColorMapUv?"#define SPECULAR_COLORMAP_UV "+n.specularColorMapUv:"",n.specularIntensityMapUv?"#define SPECULAR_INTENSITYMAP_UV "+n.specularIntensityMapUv:"",n.transmissionMapUv?"#define TRANSMISSIONMAP_UV "+n.transmissionMapUv:"",n.thicknessMapUv?"#define THICKNESSMAP_UV "+n.thicknessMapUv:"",n.vertexTangents&&n.flatShading===!1?"#define USE_TANGENT":"",n.vertexColors?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUv1s?"#define USE_UV1":"",n.vertexUv2s?"#define USE_UV2":"",n.vertexUv3s?"#define USE_UV3":"",n.pointsUvs?"#define USE_POINTS_UV":"",n.flatShading?"#define FLAT_SHADED":"",n.skinning?"#define USE_SKINNING":"",n.morphTargets?"#define USE_MORPHTARGETS":"",n.morphNormals&&n.flatShading===!1?"#define USE_MORPHNORMALS":"",n.morphColors?"#define USE_MORPHCOLORS":"",n.morphTargetsCount>0?"#define MORPHTARGETS_TEXTURE_STRIDE "+n.morphTextureStride:"",n.morphTargetsCount>0?"#define MORPHTARGETS_COUNT "+n.morphTargetsCount:"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+l:"",n.sizeAttenuation?"#define USE_SIZEATTENUATION":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.reverseDepthBuffer?"#define USE_REVERSEDEPTHBUF":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING"," attribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR"," attribute vec3 instanceColor;","#endif","#ifdef USE_INSTANCING_MORPH"," uniform sampler2D morphTexture;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_UV1"," attribute vec2 uv1;","#endif","#ifdef USE_UV2"," attribute vec2 uv2;","#endif","#ifdef USE_UV3"," attribute vec2 uv3;","#endif","#ifdef USE_TANGENT"," attribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )"," attribute vec4 color;","#elif defined( USE_COLOR )"," attribute vec3 color;","#endif","#ifdef USE_SKINNING"," attribute vec4 skinIndex;"," attribute vec4 skinWeight;","#endif",` -`].filter(W0).join(` -`),x=[ED(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,b,n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.alphaToCoverage?"#define ALPHA_TO_COVERAGE":"",n.map?"#define USE_MAP":"",n.matcap?"#define USE_MATCAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+c:"",n.envMap?"#define "+d:"",n.envMap?"#define "+f:"",p?"#define CUBEUV_TEXEL_WIDTH "+p.texelWidth:"",p?"#define CUBEUV_TEXEL_HEIGHT "+p.texelHeight:"",p?"#define CUBEUV_MAX_MIP "+p.maxMip+".0":"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",n.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.anisotropy?"#define USE_ANISOTROPY":"",n.anisotropyMap?"#define USE_ANISOTROPYMAP":"",n.clearcoat?"#define USE_CLEARCOAT":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.dispersion?"#define USE_DISPERSION":"",n.iridescence?"#define USE_IRIDESCENCE":"",n.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",n.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",n.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.alphaTest?"#define USE_ALPHATEST":"",n.alphaHash?"#define USE_ALPHAHASH":"",n.sheen?"#define USE_SHEEN":"",n.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.vertexTangents&&n.flatShading===!1?"#define USE_TANGENT":"",n.vertexColors||n.instancingColor||n.batchingColor?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUv1s?"#define USE_UV1":"",n.vertexUv2s?"#define USE_UV2":"",n.vertexUv3s?"#define USE_UV3":"",n.pointsUvs?"#define USE_POINTS_UV":"",n.gradientMap?"#define USE_GRADIENTMAP":"",n.flatShading?"#define FLAT_SHADED":"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+l:"",n.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.reverseDepthBuffer?"#define USE_REVERSEDEPTHBUF":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",n.toneMapping!==Tl?"#define TONE_MAPPING":"",n.toneMapping!==Tl?fn.tonemapping_pars_fragment:"",n.toneMapping!==Tl?N0e("toneMapping",n.toneMapping):"",n.dithering?"#define DITHERING":"",n.opaque?"#define OPAQUE":"",fn.colorspace_pars_fragment,R0e("linearToOutputTexel",n.outputColorSpace),I0e(),n.useDepthPacking?"#define DEPTH_PACKING "+n.depthPacking:"",` -`].filter(W0).join(` -`)),a=KP(a),a=wD(a,n),a=SD(a,n),o=KP(o),o=wD(o,n),o=SD(o,n),a=MD(a),o=MD(o),n.isRawShaderMaterial!==!0&&(M=`#version 300 es -`,w=[y,"#define attribute in","#define varying out","#define texture2D texture"].join(` -`)+` -`+w,x=["#define varying in",n.glslVersion===XP?"":"layout(location = 0) out highp vec4 pc_fragColor;",n.glslVersion===XP?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join(` -`)+` -`+x);const T=M+w+a,P=M+x+o,O=bD(i,i.VERTEX_SHADER,T),N=bD(i,i.FRAGMENT_SHADER,P);i.attachShader(S,O),i.attachShader(S,N),n.index0AttributeName!==void 0?i.bindAttribLocation(S,0,n.index0AttributeName):n.morphTargets===!0&&i.bindAttribLocation(S,0,"position"),i.linkProgram(S);function D(j){if(t.debug.checkShaderErrors){const X=i.getProgramInfoLog(S).trim(),ee=i.getShaderInfoLog(O).trim(),ie=i.getShaderInfoLog(N).trim();let pe=!0,ae=!0;if(i.getProgramParameter(S,i.LINK_STATUS)===!1)if(pe=!1,typeof t.debug.onShaderError=="function")t.debug.onShaderError(i,S,O,N);else{const he=_D(i,O,"vertex"),B=_D(i,N,"fragment");console.error("THREE.WebGLProgram: Shader Error "+i.getError()+" - VALIDATE_STATUS "+i.getProgramParameter(S,i.VALIDATE_STATUS)+` - -Material Name: `+j.name+` -Material Type: `+j.type+` - -Program Info Log: `+X+` -`+he+` -`+B)}else X!==""?console.warn("THREE.WebGLProgram: Program Info Log:",X):(ee===""||ie==="")&&(ae=!1);ae&&(j.diagnostics={runnable:pe,programLog:X,vertexShader:{log:ee,prefix:w},fragmentShader:{log:ie,prefix:x}})}i.deleteShader(O),i.deleteShader(N),z=new K_(i,S),V=L0e(i,S)}let z;this.getUniforms=function(){return z===void 0&&D(this),z};let V;this.getAttributes=function(){return V===void 0&&D(this),V};let k=n.rendererExtensionParallelShaderCompile===!1;return this.isReady=function(){return k===!1&&(k=i.getProgramParameter(S,A0e)),k},this.destroy=function(){r.releaseStatesOfProgram(this),i.deleteProgram(S),this.program=void 0},this.type=n.shaderType,this.name=n.shaderName,this.id=T0e++,this.cacheKey=e,this.usedTimes=1,this.program=S,this.vertexShader=O,this.fragmentShader=N,this}let X0e=0;class q0e{constructor(){this.shaderCache=new Map,this.materialCache=new Map}update(e){const n=e.vertexShader,r=e.fragmentShader,i=this._getShaderStage(n),s=this._getShaderStage(r),a=this._getShaderCacheForMaterial(e);return a.has(i)===!1&&(a.add(i),i.usedTimes++),a.has(s)===!1&&(a.add(s),s.usedTimes++),this}remove(e){const n=this.materialCache.get(e);for(const r of n)r.usedTimes--,r.usedTimes===0&&this.shaderCache.delete(r.code);return this.materialCache.delete(e),this}getVertexShaderID(e){return this._getShaderStage(e.vertexShader).id}getFragmentShaderID(e){return this._getShaderStage(e.fragmentShader).id}dispose(){this.shaderCache.clear(),this.materialCache.clear()}_getShaderCacheForMaterial(e){const n=this.materialCache;let r=n.get(e);return r===void 0&&(r=new Set,n.set(e,r)),r}_getShaderStage(e){const n=this.shaderCache;let r=n.get(e);return r===void 0&&(r=new K0e(e),n.set(e,r)),r}}class K0e{constructor(e){this.id=X0e++,this.code=e,this.usedTimes=0}}function Y0e(t,e,n,r,i,s,a){const o=new Ch,l=new q0e,c=new Set,d=[],f=i.logarithmicDepthBuffer,p=i.reverseDepthBuffer,y=i.vertexTextures;let b=i.precision;const S={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"toon",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",MeshMatcapMaterial:"matcap",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"};function w(k){return c.add(k),k===0?"uv":`uv${k}`}function x(k,j,X,ee,ie){const pe=ee.fog,ae=ie.geometry,he=k.isMeshStandardMaterial?ee.environment:null,B=(k.isMeshStandardMaterial?n:e).get(k.envMap||he),J=B&&B.mapping===nv?B.image.height:null,Y=S[k.type];k.precision!==null&&(b=i.getMaxPrecision(k.precision),b!==k.precision&&console.warn("THREE.WebGLProgram.getParameters:",k.precision,"not supported, using",b,"instead."));const H=ae.morphAttributes.position||ae.morphAttributes.normal||ae.morphAttributes.color,G=H!==void 0?H.length:0;let le=0;ae.morphAttributes.position!==void 0&&(le=1),ae.morphAttributes.normal!==void 0&&(le=2),ae.morphAttributes.color!==void 0&&(le=3);let se,ce,Se,we;if(Y){const Hn=Do[Y];se=Hn.vertexShader,ce=Hn.fragmentShader}else se=k.vertexShader,ce=k.fragmentShader,l.update(k),Se=l.getVertexShaderID(k),we=l.getFragmentShaderID(k);const We=t.getRenderTarget(),Ee=ie.isInstancedMesh===!0,Ge=ie.isBatchedMesh===!0,$e=!!k.map,de=!!k.matcap,Z=!!B,Ve=!!k.aoMap,Le=!!k.lightMap,ne=!!k.bumpMap,Ce=!!k.normalMap,Xe=!!k.displacementMap,Ze=!!k.emissiveMap,Q=!!k.metalnessMap,W=!!k.roughnessMap,be=k.anisotropy>0,Ue=k.clearcoat>0,ze=k.dispersion>0,Fe=k.iridescence>0,bt=k.sheen>0,rt=k.transmission>0,ht=be&&!!k.anisotropyMap,Xt=Ue&&!!k.clearcoatMap,Ke=Ue&&!!k.clearcoatNormalMap,te=Ue&&!!k.clearcoatRoughnessMap,tt=Fe&&!!k.iridescenceMap,Mt=Fe&&!!k.iridescenceThicknessMap,vt=bt&&!!k.sheenColorMap,Zt=bt&&!!k.sheenRoughnessMap,fe=!!k.specularMap,qe=!!k.specularColorMap,ue=!!k.specularIntensityMap,Ye=rt&&!!k.transmissionMap,Re=rt&&!!k.thicknessMap,Be=!!k.gradientMap,at=!!k.alphaMap,pt=k.alphaTest>0,Jt=!!k.alphaHash,pn=!!k.extensions;let jn=Tl;k.toneMapped&&(We===null||We.isXRRenderTarget===!0)&&(jn=t.toneMapping);const en={shaderID:Y,shaderType:k.type,shaderName:k.name,vertexShader:se,fragmentShader:ce,defines:k.defines,customVertexShaderID:Se,customFragmentShaderID:we,isRawShaderMaterial:k.isRawShaderMaterial===!0,glslVersion:k.glslVersion,precision:b,batching:Ge,batchingColor:Ge&&ie._colorsTexture!==null,instancing:Ee,instancingColor:Ee&&ie.instanceColor!==null,instancingMorph:Ee&&ie.morphTexture!==null,supportsVertexTextures:y,outputColorSpace:We===null?t.outputColorSpace:We.isXRRenderTarget===!0?We.texture.colorSpace:xi,alphaToCoverage:!!k.alphaToCoverage,map:$e,matcap:de,envMap:Z,envMapMode:Z&&B.mapping,envMapCubeUVHeight:J,aoMap:Ve,lightMap:Le,bumpMap:ne,normalMap:Ce,displacementMap:y&&Xe,emissiveMap:Ze,normalMapObjectSpace:Ce&&k.normalMapType===t6,normalMapTangentSpace:Ce&&k.normalMapType===au,metalnessMap:Q,roughnessMap:W,anisotropy:be,anisotropyMap:ht,clearcoat:Ue,clearcoatMap:Xt,clearcoatNormalMap:Ke,clearcoatRoughnessMap:te,dispersion:ze,iridescence:Fe,iridescenceMap:tt,iridescenceThicknessMap:Mt,sheen:bt,sheenColorMap:vt,sheenRoughnessMap:Zt,specularMap:fe,specularColorMap:qe,specularIntensityMap:ue,transmission:rt,transmissionMap:Ye,thicknessMap:Re,gradientMap:Be,opaque:k.transparent===!1&&k.blending===Ah&&k.alphaToCoverage===!1,alphaMap:at,alphaTest:pt,alphaHash:Jt,combine:k.combine,mapUv:$e&&w(k.map.channel),aoMapUv:Ve&&w(k.aoMap.channel),lightMapUv:Le&&w(k.lightMap.channel),bumpMapUv:ne&&w(k.bumpMap.channel),normalMapUv:Ce&&w(k.normalMap.channel),displacementMapUv:Xe&&w(k.displacementMap.channel),emissiveMapUv:Ze&&w(k.emissiveMap.channel),metalnessMapUv:Q&&w(k.metalnessMap.channel),roughnessMapUv:W&&w(k.roughnessMap.channel),anisotropyMapUv:ht&&w(k.anisotropyMap.channel),clearcoatMapUv:Xt&&w(k.clearcoatMap.channel),clearcoatNormalMapUv:Ke&&w(k.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:te&&w(k.clearcoatRoughnessMap.channel),iridescenceMapUv:tt&&w(k.iridescenceMap.channel),iridescenceThicknessMapUv:Mt&&w(k.iridescenceThicknessMap.channel),sheenColorMapUv:vt&&w(k.sheenColorMap.channel),sheenRoughnessMapUv:Zt&&w(k.sheenRoughnessMap.channel),specularMapUv:fe&&w(k.specularMap.channel),specularColorMapUv:qe&&w(k.specularColorMap.channel),specularIntensityMapUv:ue&&w(k.specularIntensityMap.channel),transmissionMapUv:Ye&&w(k.transmissionMap.channel),thicknessMapUv:Re&&w(k.thicknessMap.channel),alphaMapUv:at&&w(k.alphaMap.channel),vertexTangents:!!ae.attributes.tangent&&(Ce||be),vertexColors:k.vertexColors,vertexAlphas:k.vertexColors===!0&&!!ae.attributes.color&&ae.attributes.color.itemSize===4,pointsUvs:ie.isPoints===!0&&!!ae.attributes.uv&&($e||at),fog:!!pe,useFog:k.fog===!0,fogExp2:!!pe&&pe.isFogExp2,flatShading:k.flatShading===!0,sizeAttenuation:k.sizeAttenuation===!0,logarithmicDepthBuffer:f,reverseDepthBuffer:p,skinning:ie.isSkinnedMesh===!0,morphTargets:ae.morphAttributes.position!==void 0,morphNormals:ae.morphAttributes.normal!==void 0,morphColors:ae.morphAttributes.color!==void 0,morphTargetsCount:G,morphTextureStride:le,numDirLights:j.directional.length,numPointLights:j.point.length,numSpotLights:j.spot.length,numSpotLightMaps:j.spotLightMap.length,numRectAreaLights:j.rectArea.length,numHemiLights:j.hemi.length,numDirLightShadows:j.directionalShadowMap.length,numPointLightShadows:j.pointShadowMap.length,numSpotLightShadows:j.spotShadowMap.length,numSpotLightShadowsWithMaps:j.numSpotLightShadowsWithMaps,numLightProbes:j.numLightProbes,numClippingPlanes:a.numPlanes,numClipIntersection:a.numIntersection,dithering:k.dithering,shadowMapEnabled:t.shadowMap.enabled&&X.length>0,shadowMapType:t.shadowMap.type,toneMapping:jn,decodeVideoTexture:$e&&k.map.isVideoTexture===!0&&Nn.getTransfer(k.map.colorSpace)===er,premultipliedAlpha:k.premultipliedAlpha,doubleSided:k.side===ya,flipSided:k.side===as,useDepthPacking:k.depthPacking>=0,depthPacking:k.depthPacking||0,index0AttributeName:k.index0AttributeName,extensionClipCullDistance:pn&&k.extensions.clipCullDistance===!0&&r.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(pn&&k.extensions.multiDraw===!0||Ge)&&r.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:r.has("KHR_parallel_shader_compile"),customProgramCacheKey:k.customProgramCacheKey()};return en.vertexUv1s=c.has(1),en.vertexUv2s=c.has(2),en.vertexUv3s=c.has(3),c.clear(),en}function M(k){const j=[];if(k.shaderID?j.push(k.shaderID):(j.push(k.customVertexShaderID),j.push(k.customFragmentShaderID)),k.defines!==void 0)for(const X in k.defines)j.push(X),j.push(k.defines[X]);return k.isRawShaderMaterial===!1&&(T(j,k),P(j,k),j.push(t.outputColorSpace)),j.push(k.customProgramCacheKey),j.join()}function T(k,j){k.push(j.precision),k.push(j.outputColorSpace),k.push(j.envMapMode),k.push(j.envMapCubeUVHeight),k.push(j.mapUv),k.push(j.alphaMapUv),k.push(j.lightMapUv),k.push(j.aoMapUv),k.push(j.bumpMapUv),k.push(j.normalMapUv),k.push(j.displacementMapUv),k.push(j.emissiveMapUv),k.push(j.metalnessMapUv),k.push(j.roughnessMapUv),k.push(j.anisotropyMapUv),k.push(j.clearcoatMapUv),k.push(j.clearcoatNormalMapUv),k.push(j.clearcoatRoughnessMapUv),k.push(j.iridescenceMapUv),k.push(j.iridescenceThicknessMapUv),k.push(j.sheenColorMapUv),k.push(j.sheenRoughnessMapUv),k.push(j.specularMapUv),k.push(j.specularColorMapUv),k.push(j.specularIntensityMapUv),k.push(j.transmissionMapUv),k.push(j.thicknessMapUv),k.push(j.combine),k.push(j.fogExp2),k.push(j.sizeAttenuation),k.push(j.morphTargetsCount),k.push(j.morphAttributeCount),k.push(j.numDirLights),k.push(j.numPointLights),k.push(j.numSpotLights),k.push(j.numSpotLightMaps),k.push(j.numHemiLights),k.push(j.numRectAreaLights),k.push(j.numDirLightShadows),k.push(j.numPointLightShadows),k.push(j.numSpotLightShadows),k.push(j.numSpotLightShadowsWithMaps),k.push(j.numLightProbes),k.push(j.shadowMapType),k.push(j.toneMapping),k.push(j.numClippingPlanes),k.push(j.numClipIntersection),k.push(j.depthPacking)}function P(k,j){o.disableAll(),j.supportsVertexTextures&&o.enable(0),j.instancing&&o.enable(1),j.instancingColor&&o.enable(2),j.instancingMorph&&o.enable(3),j.matcap&&o.enable(4),j.envMap&&o.enable(5),j.normalMapObjectSpace&&o.enable(6),j.normalMapTangentSpace&&o.enable(7),j.clearcoat&&o.enable(8),j.iridescence&&o.enable(9),j.alphaTest&&o.enable(10),j.vertexColors&&o.enable(11),j.vertexAlphas&&o.enable(12),j.vertexUv1s&&o.enable(13),j.vertexUv2s&&o.enable(14),j.vertexUv3s&&o.enable(15),j.vertexTangents&&o.enable(16),j.anisotropy&&o.enable(17),j.alphaHash&&o.enable(18),j.batching&&o.enable(19),j.dispersion&&o.enable(20),j.batchingColor&&o.enable(21),k.push(o.mask),o.disableAll(),j.fog&&o.enable(0),j.useFog&&o.enable(1),j.flatShading&&o.enable(2),j.logarithmicDepthBuffer&&o.enable(3),j.reverseDepthBuffer&&o.enable(4),j.skinning&&o.enable(5),j.morphTargets&&o.enable(6),j.morphNormals&&o.enable(7),j.morphColors&&o.enable(8),j.premultipliedAlpha&&o.enable(9),j.shadowMapEnabled&&o.enable(10),j.doubleSided&&o.enable(11),j.flipSided&&o.enable(12),j.useDepthPacking&&o.enable(13),j.dithering&&o.enable(14),j.transmission&&o.enable(15),j.sheen&&o.enable(16),j.opaque&&o.enable(17),j.pointsUvs&&o.enable(18),j.decodeVideoTexture&&o.enable(19),j.alphaToCoverage&&o.enable(20),k.push(o.mask)}function O(k){const j=S[k.type];let X;if(j){const ee=Do[j];X=TR.clone(ee.uniforms)}else X=k.uniforms;return X}function N(k,j){let X;for(let ee=0,ie=d.length;ee0?r.push(x):y.transparent===!0?i.push(x):n.push(x)}function l(f,p,y,b,S,w){const x=a(f,p,y,b,S,w);y.transmission>0?r.unshift(x):y.transparent===!0?i.unshift(x):n.unshift(x)}function c(f,p){n.length>1&&n.sort(f||Q0e),r.length>1&&r.sort(p||AD),i.length>1&&i.sort(p||AD)}function d(){for(let f=e,p=t.length;f=s.length?(a=new TD,s.push(a)):a=s[i],a}function n(){t=new WeakMap}return{get:e,dispose:n}}function eye(){const t={};return{get:function(e){if(t[e.id]!==void 0)return t[e.id];let n;switch(e.type){case"DirectionalLight":n={direction:new q,color:new ct};break;case"SpotLight":n={position:new q,direction:new q,color:new ct,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":n={position:new q,color:new ct,distance:0,decay:0};break;case"HemisphereLight":n={direction:new q,skyColor:new ct,groundColor:new ct};break;case"RectAreaLight":n={color:new ct,position:new q,halfWidth:new q,halfHeight:new q};break}return t[e.id]=n,n}}}function tye(){const t={};return{get:function(e){if(t[e.id]!==void 0)return t[e.id];let n;switch(e.type){case"DirectionalLight":n={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new He};break;case"SpotLight":n={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new He};break;case"PointLight":n={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new He,shadowCameraNear:1,shadowCameraFar:1e3};break}return t[e.id]=n,n}}}let nye=0;function rye(t,e){return(e.castShadow?2:0)-(t.castShadow?2:0)+(e.map?1:0)-(t.map?1:0)}function iye(t){const e=new eye,n=tye(),r={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1,numSpotMaps:-1,numLightProbes:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotLightMap:[],spotShadow:[],spotShadowMap:[],spotLightMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numSpotLightShadowsWithMaps:0,numLightProbes:0};for(let c=0;c<9;c++)r.probe.push(new q);const i=new q,s=new Ct,a=new Ct;function o(c){let d=0,f=0,p=0;for(let V=0;V<9;V++)r.probe[V].set(0,0,0);let y=0,b=0,S=0,w=0,x=0,M=0,T=0,P=0,O=0,N=0,D=0;c.sort(rye);for(let V=0,k=c.length;V0&&(t.has("OES_texture_float_linear")===!0?(r.rectAreaLTC1=ft.LTC_FLOAT_1,r.rectAreaLTC2=ft.LTC_FLOAT_2):(r.rectAreaLTC1=ft.LTC_HALF_1,r.rectAreaLTC2=ft.LTC_HALF_2)),r.ambient[0]=d,r.ambient[1]=f,r.ambient[2]=p;const z=r.hash;(z.directionalLength!==y||z.pointLength!==b||z.spotLength!==S||z.rectAreaLength!==w||z.hemiLength!==x||z.numDirectionalShadows!==M||z.numPointShadows!==T||z.numSpotShadows!==P||z.numSpotMaps!==O||z.numLightProbes!==D)&&(r.directional.length=y,r.spot.length=S,r.rectArea.length=w,r.point.length=b,r.hemi.length=x,r.directionalShadow.length=M,r.directionalShadowMap.length=M,r.pointShadow.length=T,r.pointShadowMap.length=T,r.spotShadow.length=P,r.spotShadowMap.length=P,r.directionalShadowMatrix.length=M,r.pointShadowMatrix.length=T,r.spotLightMatrix.length=P+O-N,r.spotLightMap.length=O,r.numSpotLightShadowsWithMaps=N,r.numLightProbes=D,z.directionalLength=y,z.pointLength=b,z.spotLength=S,z.rectAreaLength=w,z.hemiLength=x,z.numDirectionalShadows=M,z.numPointShadows=T,z.numSpotShadows=P,z.numSpotMaps=O,z.numLightProbes=D,r.version=nye++)}function l(c,d){let f=0,p=0,y=0,b=0,S=0;const w=d.matrixWorldInverse;for(let x=0,M=c.length;x=a.length?(o=new PD(t),a.push(o)):o=a[s],o}function r(){e=new WeakMap}return{get:n,dispose:r}}class RR extends Gr{constructor(e){super(),this.isMeshDepthMaterial=!0,this.type="MeshDepthMaterial",this.depthPacking=JV,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(e)}copy(e){return super.copy(e),this.depthPacking=e.depthPacking,this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this}}class NR extends Gr{constructor(e){super(),this.isMeshDistanceMaterial=!0,this.type="MeshDistanceMaterial",this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.setValues(e)}copy(e){return super.copy(e),this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this}}const aye=`void main() { - gl_Position = vec4( position, 1.0 ); -}`,oye=`uniform sampler2D shadow_pass; -uniform vec2 resolution; -uniform float radius; -#include -void main() { - const float samples = float( VSM_SAMPLES ); - float mean = 0.0; - float squared_mean = 0.0; - float uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 ); - float uvStart = samples <= 1.0 ? 0.0 : - 1.0; - for ( float i = 0.0; i < samples; i ++ ) { - float uvOffset = uvStart + i * uvStride; - #ifdef HORIZONTAL_PASS - vec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) ); - mean += distribution.x; - squared_mean += distribution.y * distribution.y + distribution.x * distribution.x; - #else - float depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) ); - mean += depth; - squared_mean += depth * depth; - #endif - } - mean = mean / samples; - squared_mean = squared_mean / samples; - float std_dev = sqrt( squared_mean - mean * mean ); - gl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) ); -}`;function lye(t,e,n){let r=new px;const i=new He,s=new He,a=new On,o=new RR({depthPacking:e6}),l=new NR,c={},d=n.maxTextureSize,f={[Ll]:as,[as]:Ll,[ya]:ya},p=new Ya({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new He},radius:{value:4}},vertexShader:aye,fragmentShader:oye}),y=p.clone();y.defines.HORIZONTAL_PASS=1;const b=new Yt;b.setAttribute("position",new Qt(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const S=new xr(b,p),w=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=BS;let x=this.type;this.render=function(N,D,z){if(w.enabled===!1||w.autoUpdate===!1&&w.needsUpdate===!1||N.length===0)return;const V=t.getRenderTarget(),k=t.getActiveCubeFace(),j=t.getActiveMipmapLevel(),X=t.state;X.setBlending(Vc),X.buffers.color.setClear(1,1,1,1),X.buffers.depth.setTest(!0),X.setScissorTest(!1);const ee=x!==Oo&&this.type===Oo,ie=x===Oo&&this.type!==Oo;for(let pe=0,ae=N.length;ped||i.y>d)&&(i.x>d&&(s.x=Math.floor(d/J.x),i.x=s.x*J.x,B.mapSize.x=s.x),i.y>d&&(s.y=Math.floor(d/J.y),i.y=s.y*J.y,B.mapSize.y=s.y)),B.map===null||ee===!0||ie===!0){const H=this.type!==Oo?{minFilter:ri,magFilter:ri}:{};B.map!==null&&B.map.dispose(),B.map=new Vo(i.x,i.y,H),B.map.texture.name=he.name+".shadowMap",B.camera.updateProjectionMatrix()}t.setRenderTarget(B.map),t.clear();const Y=B.getViewportCount();for(let H=0;H0||D.map&&D.alphaTest>0){const X=k.uuid,ee=D.uuid;let ie=c[X];ie===void 0&&(ie={},c[X]=ie);let pe=ie[ee];pe===void 0&&(pe=k.clone(),ie[ee]=pe,D.addEventListener("dispose",O)),k=pe}if(k.visible=D.visible,k.wireframe=D.wireframe,V===Oo?k.side=D.shadowSide!==null?D.shadowSide:D.side:k.side=D.shadowSide!==null?D.shadowSide:f[D.side],k.alphaMap=D.alphaMap,k.alphaTest=D.alphaTest,k.map=D.map,k.clipShadows=D.clipShadows,k.clippingPlanes=D.clippingPlanes,k.clipIntersection=D.clipIntersection,k.displacementMap=D.displacementMap,k.displacementScale=D.displacementScale,k.displacementBias=D.displacementBias,k.wireframeLinewidth=D.wireframeLinewidth,k.linewidth=D.linewidth,z.isPointLight===!0&&k.isMeshDistanceMaterial===!0){const X=t.properties.get(k);X.light=z}return k}function P(N,D,z,V,k){if(N.visible===!1)return;if(N.layers.test(D.layers)&&(N.isMesh||N.isLine||N.isPoints)&&(N.castShadow||N.receiveShadow&&k===Oo)&&(!N.frustumCulled||r.intersectsObject(N))){N.modelViewMatrix.multiplyMatrices(z.matrixWorldInverse,N.matrixWorld);const ee=e.update(N),ie=N.material;if(Array.isArray(ie)){const pe=ee.groups;for(let ae=0,he=pe.length;ae=1):he.indexOf("OpenGL ES")!==-1&&(ae=parseFloat(/^OpenGL ES (\d)/.exec(he)[1]),pe=ae>=2);let B=null,J={};const Y=t.getParameter(t.SCISSOR_BOX),H=t.getParameter(t.VIEWPORT),G=new On().fromArray(Y),le=new On().fromArray(H);function se(ue,Ye,Re,Be){const at=new Uint8Array(4),pt=t.createTexture();t.bindTexture(ue,pt),t.texParameteri(ue,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(ue,t.TEXTURE_MAG_FILTER,t.NEAREST);for(let Jt=0;Jte?(t.repeat.x=1,t.repeat.y=n/e,t.offset.x=0,t.offset.y=(1-t.repeat.y)/2):(t.repeat.x=e/n,t.repeat.y=1,t.offset.x=(1-t.repeat.x)/2,t.offset.y=0),t}function fye(t,e){const n=t.image&&t.image.width?t.image.width/t.image.height:1;return n>e?(t.repeat.x=e/n,t.repeat.y=1,t.offset.x=(1-t.repeat.x)/2,t.offset.y=0):(t.repeat.x=1,t.repeat.y=n/e,t.offset.x=0,t.offset.y=(1-t.repeat.y)/2),t}function hye(t){return t.repeat.x=1,t.repeat.y=1,t.offset.x=0,t.offset.y=0,t}function YP(t,e,n,r){const i=pye(r);switch(n){case pR:return t*e;case gR:return t*e;case vR:return t*e*2;case XS:return t*e/i.components*i.byteLength;case ux:return t*e/i.components*i.byteLength;case yR:return t*e*2/i.components*i.byteLength;case qS:return t*e*2/i.components*i.byteLength;case mR:return t*e*3/i.components*i.byteLength;case ss:return t*e*4/i.components*i.byteLength;case KS:return t*e*4/i.components*i.byteLength;case Z0:case Q0:return Math.floor((t+3)/4)*Math.floor((e+3)/4)*8;case J0:case ey:return Math.floor((t+3)/4)*Math.floor((e+3)/4)*16;case c1:case d1:return Math.max(t,16)*Math.max(e,8)/4;case l1:case u1:return Math.max(t,8)*Math.max(e,8)/2;case f1:case h1:return Math.floor((t+3)/4)*Math.floor((e+3)/4)*8;case p1:return Math.floor((t+3)/4)*Math.floor((e+3)/4)*16;case m1:return Math.floor((t+3)/4)*Math.floor((e+3)/4)*16;case g1:return Math.floor((t+4)/5)*Math.floor((e+3)/4)*16;case v1:return Math.floor((t+4)/5)*Math.floor((e+4)/5)*16;case y1:return Math.floor((t+5)/6)*Math.floor((e+4)/5)*16;case x1:return Math.floor((t+5)/6)*Math.floor((e+5)/6)*16;case b1:return Math.floor((t+7)/8)*Math.floor((e+4)/5)*16;case _1:return Math.floor((t+7)/8)*Math.floor((e+5)/6)*16;case w1:return Math.floor((t+7)/8)*Math.floor((e+7)/8)*16;case S1:return Math.floor((t+9)/10)*Math.floor((e+4)/5)*16;case M1:return Math.floor((t+9)/10)*Math.floor((e+5)/6)*16;case E1:return Math.floor((t+9)/10)*Math.floor((e+7)/8)*16;case A1:return Math.floor((t+9)/10)*Math.floor((e+9)/10)*16;case T1:return Math.floor((t+11)/12)*Math.floor((e+9)/10)*16;case P1:return Math.floor((t+11)/12)*Math.floor((e+11)/12)*16;case ty:case C1:case R1:return Math.ceil(t/4)*Math.ceil(e/4)*16;case xR:case N1:return Math.ceil(t/4)*Math.ceil(e/4)*8;case I1:case k1:return Math.ceil(t/4)*Math.ceil(e/4)*16}throw new Error(`Unable to determine texture byte length for ${n} format.`)}function pye(t){switch(t){case Ho:case dR:return{byteLength:1,components:1};case kg:case fR:case rv:return{byteLength:2,components:1};case WS:case $S:return{byteLength:2,components:4};case Qc:case GS:case Qs:return{byteLength:4,components:1};case hR:return{byteLength:4,components:3}}throw new Error(`Unknown texture type ${t}.`)}const mye={contain:dye,cover:fye,fill:hye,getByteLength:YP};function gye(t,e,n,r,i,s,a){const o=e.has("WEBGL_multisampled_render_to_texture")?e.get("WEBGL_multisampled_render_to_texture"):null,l=typeof navigator>"u"?!1:/OculusBrowser/g.test(navigator.userAgent),c=new He,d=new WeakMap;let f;const p=new WeakMap;let y=!1;try{y=typeof OffscreenCanvas<"u"&&new OffscreenCanvas(1,1).getContext("2d")!==null}catch{}function b(Q,W){return y?new OffscreenCanvas(Q,W):Oy("canvas")}function S(Q,W,be){let Ue=1;const ze=Ze(Q);if((ze.width>be||ze.height>be)&&(Ue=be/Math.max(ze.width,ze.height)),Ue<1)if(typeof HTMLImageElement<"u"&&Q instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&Q instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&Q instanceof ImageBitmap||typeof VideoFrame<"u"&&Q instanceof VideoFrame){const Fe=Math.floor(Ue*ze.width),bt=Math.floor(Ue*ze.height);f===void 0&&(f=b(Fe,bt));const rt=W?b(Fe,bt):f;return rt.width=Fe,rt.height=bt,rt.getContext("2d").drawImage(Q,0,0,Fe,bt),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+ze.width+"x"+ze.height+") to ("+Fe+"x"+bt+")."),rt}else return"data"in Q&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+ze.width+"x"+ze.height+")."),Q;return Q}function w(Q){return Q.generateMipmaps&&Q.minFilter!==ri&&Q.minFilter!==Cr}function x(Q){t.generateMipmap(Q)}function M(Q,W,be,Ue,ze=!1){if(Q!==null){if(t[Q]!==void 0)return t[Q];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+Q+"'")}let Fe=W;if(W===t.RED&&(be===t.FLOAT&&(Fe=t.R32F),be===t.HALF_FLOAT&&(Fe=t.R16F),be===t.UNSIGNED_BYTE&&(Fe=t.R8)),W===t.RED_INTEGER&&(be===t.UNSIGNED_BYTE&&(Fe=t.R8UI),be===t.UNSIGNED_SHORT&&(Fe=t.R16UI),be===t.UNSIGNED_INT&&(Fe=t.R32UI),be===t.BYTE&&(Fe=t.R8I),be===t.SHORT&&(Fe=t.R16I),be===t.INT&&(Fe=t.R32I)),W===t.RG&&(be===t.FLOAT&&(Fe=t.RG32F),be===t.HALF_FLOAT&&(Fe=t.RG16F),be===t.UNSIGNED_BYTE&&(Fe=t.RG8)),W===t.RG_INTEGER&&(be===t.UNSIGNED_BYTE&&(Fe=t.RG8UI),be===t.UNSIGNED_SHORT&&(Fe=t.RG16UI),be===t.UNSIGNED_INT&&(Fe=t.RG32UI),be===t.BYTE&&(Fe=t.RG8I),be===t.SHORT&&(Fe=t.RG16I),be===t.INT&&(Fe=t.RG32I)),W===t.RGB_INTEGER&&(be===t.UNSIGNED_BYTE&&(Fe=t.RGB8UI),be===t.UNSIGNED_SHORT&&(Fe=t.RGB16UI),be===t.UNSIGNED_INT&&(Fe=t.RGB32UI),be===t.BYTE&&(Fe=t.RGB8I),be===t.SHORT&&(Fe=t.RGB16I),be===t.INT&&(Fe=t.RGB32I)),W===t.RGBA_INTEGER&&(be===t.UNSIGNED_BYTE&&(Fe=t.RGBA8UI),be===t.UNSIGNED_SHORT&&(Fe=t.RGBA16UI),be===t.UNSIGNED_INT&&(Fe=t.RGBA32UI),be===t.BYTE&&(Fe=t.RGBA8I),be===t.SHORT&&(Fe=t.RGBA16I),be===t.INT&&(Fe=t.RGBA32I)),W===t.RGB&&be===t.UNSIGNED_INT_5_9_9_9_REV&&(Fe=t.RGB9_E5),W===t.RGBA){const bt=ze?Cy:Nn.getTransfer(Ue);be===t.FLOAT&&(Fe=t.RGBA32F),be===t.HALF_FLOAT&&(Fe=t.RGBA16F),be===t.UNSIGNED_BYTE&&(Fe=bt===er?t.SRGB8_ALPHA8:t.RGBA8),be===t.UNSIGNED_SHORT_4_4_4_4&&(Fe=t.RGBA4),be===t.UNSIGNED_SHORT_5_5_5_1&&(Fe=t.RGB5_A1)}return(Fe===t.R16F||Fe===t.R32F||Fe===t.RG16F||Fe===t.RG32F||Fe===t.RGBA16F||Fe===t.RGBA32F)&&e.get("EXT_color_buffer_float"),Fe}function T(Q,W){let be;return Q?W===null||W===Qc||W===Bh?be=t.DEPTH24_STENCIL8:W===Qs?be=t.DEPTH32F_STENCIL8:W===kg&&(be=t.DEPTH24_STENCIL8,console.warn("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")):W===null||W===Qc||W===Bh?be=t.DEPTH_COMPONENT24:W===Qs?be=t.DEPTH_COMPONENT32F:W===kg&&(be=t.DEPTH_COMPONENT16),be}function P(Q,W){return w(Q)===!0||Q.isFramebufferTexture&&Q.minFilter!==ri&&Q.minFilter!==Cr?Math.log2(Math.max(W.width,W.height))+1:Q.mipmaps!==void 0&&Q.mipmaps.length>0?Q.mipmaps.length:Q.isCompressedTexture&&Array.isArray(Q.image)?W.mipmaps.length:1}function O(Q){const W=Q.target;W.removeEventListener("dispose",O),D(W),W.isVideoTexture&&d.delete(W)}function N(Q){const W=Q.target;W.removeEventListener("dispose",N),V(W)}function D(Q){const W=r.get(Q);if(W.__webglInit===void 0)return;const be=Q.source,Ue=p.get(be);if(Ue){const ze=Ue[W.__cacheKey];ze.usedTimes--,ze.usedTimes===0&&z(Q),Object.keys(Ue).length===0&&p.delete(be)}r.remove(Q)}function z(Q){const W=r.get(Q);t.deleteTexture(W.__webglTexture);const be=Q.source,Ue=p.get(be);delete Ue[W.__cacheKey],a.memory.textures--}function V(Q){const W=r.get(Q);if(Q.depthTexture&&Q.depthTexture.dispose(),Q.isWebGLCubeRenderTarget)for(let Ue=0;Ue<6;Ue++){if(Array.isArray(W.__webglFramebuffer[Ue]))for(let ze=0;ze=i.maxTextures&&console.warn("THREE.WebGLTextures: Trying to use "+Q+" texture units while this GPU supports only "+i.maxTextures),k+=1,Q}function ee(Q){const W=[];return W.push(Q.wrapS),W.push(Q.wrapT),W.push(Q.wrapR||0),W.push(Q.magFilter),W.push(Q.minFilter),W.push(Q.anisotropy),W.push(Q.internalFormat),W.push(Q.format),W.push(Q.type),W.push(Q.generateMipmaps),W.push(Q.premultiplyAlpha),W.push(Q.flipY),W.push(Q.unpackAlignment),W.push(Q.colorSpace),W.join()}function ie(Q,W){const be=r.get(Q);if(Q.isVideoTexture&&Ce(Q),Q.isRenderTargetTexture===!1&&Q.version>0&&be.__version!==Q.version){const Ue=Q.image;if(Ue===null)console.warn("THREE.WebGLRenderer: Texture marked for update but no image data found.");else if(Ue.complete===!1)console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete");else{le(be,Q,W);return}}n.bindTexture(t.TEXTURE_2D,be.__webglTexture,t.TEXTURE0+W)}function pe(Q,W){const be=r.get(Q);if(Q.version>0&&be.__version!==Q.version){le(be,Q,W);return}n.bindTexture(t.TEXTURE_2D_ARRAY,be.__webglTexture,t.TEXTURE0+W)}function ae(Q,W){const be=r.get(Q);if(Q.version>0&&be.__version!==Q.version){le(be,Q,W);return}n.bindTexture(t.TEXTURE_3D,be.__webglTexture,t.TEXTURE0+W)}function he(Q,W){const be=r.get(Q);if(Q.version>0&&be.__version!==Q.version){se(be,Q,W);return}n.bindTexture(t.TEXTURE_CUBE_MAP,be.__webglTexture,t.TEXTURE0+W)}const B={[Rd]:t.REPEAT,[ba]:t.CLAMP_TO_EDGE,[Ig]:t.MIRRORED_REPEAT},J={[ri]:t.NEAREST,[VS]:t.NEAREST_MIPMAP_NEAREST,[oh]:t.NEAREST_MIPMAP_LINEAR,[Cr]:t.LINEAR,[ng]:t.LINEAR_MIPMAP_NEAREST,[$a]:t.LINEAR_MIPMAP_LINEAR},Y={[n6]:t.NEVER,[l6]:t.ALWAYS,[r6]:t.LESS,[wR]:t.LEQUAL,[i6]:t.EQUAL,[o6]:t.GEQUAL,[s6]:t.GREATER,[a6]:t.NOTEQUAL};function H(Q,W){if(W.type===Qs&&e.has("OES_texture_float_linear")===!1&&(W.magFilter===Cr||W.magFilter===ng||W.magFilter===oh||W.magFilter===$a||W.minFilter===Cr||W.minFilter===ng||W.minFilter===oh||W.minFilter===$a)&&console.warn("THREE.WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device."),t.texParameteri(Q,t.TEXTURE_WRAP_S,B[W.wrapS]),t.texParameteri(Q,t.TEXTURE_WRAP_T,B[W.wrapT]),(Q===t.TEXTURE_3D||Q===t.TEXTURE_2D_ARRAY)&&t.texParameteri(Q,t.TEXTURE_WRAP_R,B[W.wrapR]),t.texParameteri(Q,t.TEXTURE_MAG_FILTER,J[W.magFilter]),t.texParameteri(Q,t.TEXTURE_MIN_FILTER,J[W.minFilter]),W.compareFunction&&(t.texParameteri(Q,t.TEXTURE_COMPARE_MODE,t.COMPARE_REF_TO_TEXTURE),t.texParameteri(Q,t.TEXTURE_COMPARE_FUNC,Y[W.compareFunction])),e.has("EXT_texture_filter_anisotropic")===!0){if(W.magFilter===ri||W.minFilter!==oh&&W.minFilter!==$a||W.type===Qs&&e.has("OES_texture_float_linear")===!1)return;if(W.anisotropy>1||r.get(W).__currentAnisotropy){const be=e.get("EXT_texture_filter_anisotropic");t.texParameterf(Q,be.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(W.anisotropy,i.getMaxAnisotropy())),r.get(W).__currentAnisotropy=W.anisotropy}}}function G(Q,W){let be=!1;Q.__webglInit===void 0&&(Q.__webglInit=!0,W.addEventListener("dispose",O));const Ue=W.source;let ze=p.get(Ue);ze===void 0&&(ze={},p.set(Ue,ze));const Fe=ee(W);if(Fe!==Q.__cacheKey){ze[Fe]===void 0&&(ze[Fe]={texture:t.createTexture(),usedTimes:0},a.memory.textures++,be=!0),ze[Fe].usedTimes++;const bt=ze[Q.__cacheKey];bt!==void 0&&(ze[Q.__cacheKey].usedTimes--,bt.usedTimes===0&&z(W)),Q.__cacheKey=Fe,Q.__webglTexture=ze[Fe].texture}return be}function le(Q,W,be){let Ue=t.TEXTURE_2D;(W.isDataArrayTexture||W.isCompressedArrayTexture)&&(Ue=t.TEXTURE_2D_ARRAY),W.isData3DTexture&&(Ue=t.TEXTURE_3D);const ze=G(Q,W),Fe=W.source;n.bindTexture(Ue,Q.__webglTexture,t.TEXTURE0+be);const bt=r.get(Fe);if(Fe.version!==bt.__version||ze===!0){n.activeTexture(t.TEXTURE0+be);const rt=Nn.getPrimaries(Nn.workingColorSpace),ht=W.colorSpace===Oc?null:Nn.getPrimaries(W.colorSpace),Xt=W.colorSpace===Oc||rt===ht?t.NONE:t.BROWSER_DEFAULT_WEBGL;t.pixelStorei(t.UNPACK_FLIP_Y_WEBGL,W.flipY),t.pixelStorei(t.UNPACK_PREMULTIPLY_ALPHA_WEBGL,W.premultiplyAlpha),t.pixelStorei(t.UNPACK_ALIGNMENT,W.unpackAlignment),t.pixelStorei(t.UNPACK_COLORSPACE_CONVERSION_WEBGL,Xt);let Ke=S(W.image,!1,i.maxTextureSize);Ke=Xe(W,Ke);const te=s.convert(W.format,W.colorSpace),tt=s.convert(W.type);let Mt=M(W.internalFormat,te,tt,W.colorSpace,W.isVideoTexture);H(Ue,W);let vt;const Zt=W.mipmaps,fe=W.isVideoTexture!==!0,qe=bt.__version===void 0||ze===!0,ue=Fe.dataReady,Ye=P(W,Ke);if(W.isDepthTexture)Mt=T(W.format===Hh,W.type),qe&&(fe?n.texStorage2D(t.TEXTURE_2D,1,Mt,Ke.width,Ke.height):n.texImage2D(t.TEXTURE_2D,0,Mt,Ke.width,Ke.height,0,te,tt,null));else if(W.isDataTexture)if(Zt.length>0){fe&&qe&&n.texStorage2D(t.TEXTURE_2D,Ye,Mt,Zt[0].width,Zt[0].height);for(let Re=0,Be=Zt.length;Re0){const at=YP(vt.width,vt.height,W.format,W.type);for(const pt of W.layerUpdates){const Jt=vt.data.subarray(pt*at/vt.data.BYTES_PER_ELEMENT,(pt+1)*at/vt.data.BYTES_PER_ELEMENT);n.compressedTexSubImage3D(t.TEXTURE_2D_ARRAY,Re,0,0,pt,vt.width,vt.height,1,te,Jt,0,0)}W.clearLayerUpdates()}else n.compressedTexSubImage3D(t.TEXTURE_2D_ARRAY,Re,0,0,0,vt.width,vt.height,Ke.depth,te,vt.data,0,0)}else n.compressedTexImage3D(t.TEXTURE_2D_ARRAY,Re,Mt,vt.width,vt.height,Ke.depth,0,vt.data,0,0);else console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()");else fe?ue&&n.texSubImage3D(t.TEXTURE_2D_ARRAY,Re,0,0,0,vt.width,vt.height,Ke.depth,te,tt,vt.data):n.texImage3D(t.TEXTURE_2D_ARRAY,Re,Mt,vt.width,vt.height,Ke.depth,0,te,tt,vt.data)}else{fe&&qe&&n.texStorage2D(t.TEXTURE_2D,Ye,Mt,Zt[0].width,Zt[0].height);for(let Re=0,Be=Zt.length;Re0){const Re=YP(Ke.width,Ke.height,W.format,W.type);for(const Be of W.layerUpdates){const at=Ke.data.subarray(Be*Re/Ke.data.BYTES_PER_ELEMENT,(Be+1)*Re/Ke.data.BYTES_PER_ELEMENT);n.texSubImage3D(t.TEXTURE_2D_ARRAY,0,0,0,Be,Ke.width,Ke.height,1,te,tt,at)}W.clearLayerUpdates()}else n.texSubImage3D(t.TEXTURE_2D_ARRAY,0,0,0,0,Ke.width,Ke.height,Ke.depth,te,tt,Ke.data)}else n.texImage3D(t.TEXTURE_2D_ARRAY,0,Mt,Ke.width,Ke.height,Ke.depth,0,te,tt,Ke.data);else if(W.isData3DTexture)fe?(qe&&n.texStorage3D(t.TEXTURE_3D,Ye,Mt,Ke.width,Ke.height,Ke.depth),ue&&n.texSubImage3D(t.TEXTURE_3D,0,0,0,0,Ke.width,Ke.height,Ke.depth,te,tt,Ke.data)):n.texImage3D(t.TEXTURE_3D,0,Mt,Ke.width,Ke.height,Ke.depth,0,te,tt,Ke.data);else if(W.isFramebufferTexture){if(qe)if(fe)n.texStorage2D(t.TEXTURE_2D,Ye,Mt,Ke.width,Ke.height);else{let Re=Ke.width,Be=Ke.height;for(let at=0;at>=1,Be>>=1}}else if(Zt.length>0){if(fe&&qe){const Re=Ze(Zt[0]);n.texStorage2D(t.TEXTURE_2D,Ye,Mt,Re.width,Re.height)}for(let Re=0,Be=Zt.length;Re0&&Ye++;const Be=Ze(te[0]);n.texStorage2D(t.TEXTURE_CUBE_MAP,Ye,Zt,Be.width,Be.height)}for(let Be=0;Be<6;Be++)if(Ke){fe?ue&&n.texSubImage2D(t.TEXTURE_CUBE_MAP_POSITIVE_X+Be,0,0,0,te[Be].width,te[Be].height,Mt,vt,te[Be].data):n.texImage2D(t.TEXTURE_CUBE_MAP_POSITIVE_X+Be,0,Zt,te[Be].width,te[Be].height,0,Mt,vt,te[Be].data);for(let at=0;at>Fe),te=Math.max(1,W.height>>Fe);ze===t.TEXTURE_3D||ze===t.TEXTURE_2D_ARRAY?n.texImage3D(ze,Fe,ht,Ke,te,W.depth,0,bt,rt,null):n.texImage2D(ze,Fe,ht,Ke,te,0,bt,rt,null)}n.bindFramebuffer(t.FRAMEBUFFER,Q),ne(W)?o.framebufferTexture2DMultisampleEXT(t.FRAMEBUFFER,Ue,ze,r.get(be).__webglTexture,0,Le(W)):(ze===t.TEXTURE_2D||ze>=t.TEXTURE_CUBE_MAP_POSITIVE_X&&ze<=t.TEXTURE_CUBE_MAP_NEGATIVE_Z)&&t.framebufferTexture2D(t.FRAMEBUFFER,Ue,ze,r.get(be).__webglTexture,Fe),n.bindFramebuffer(t.FRAMEBUFFER,null)}function Se(Q,W,be){if(t.bindRenderbuffer(t.RENDERBUFFER,Q),W.depthBuffer){const Ue=W.depthTexture,ze=Ue&&Ue.isDepthTexture?Ue.type:null,Fe=T(W.stencilBuffer,ze),bt=W.stencilBuffer?t.DEPTH_STENCIL_ATTACHMENT:t.DEPTH_ATTACHMENT,rt=Le(W);ne(W)?o.renderbufferStorageMultisampleEXT(t.RENDERBUFFER,rt,Fe,W.width,W.height):be?t.renderbufferStorageMultisample(t.RENDERBUFFER,rt,Fe,W.width,W.height):t.renderbufferStorage(t.RENDERBUFFER,Fe,W.width,W.height),t.framebufferRenderbuffer(t.FRAMEBUFFER,bt,t.RENDERBUFFER,Q)}else{const Ue=W.textures;for(let ze=0;ze{delete W.__boundDepthTexture,delete W.__depthDisposeCallback,Ue.removeEventListener("dispose",ze)};Ue.addEventListener("dispose",ze),W.__depthDisposeCallback=ze}W.__boundDepthTexture=Ue}if(Q.depthTexture&&!W.__autoAllocateDepthBuffer){if(be)throw new Error("target.depthTexture not supported in Cube render targets");we(W.__webglFramebuffer,Q)}else if(be){W.__webglDepthbuffer=[];for(let Ue=0;Ue<6;Ue++)if(n.bindFramebuffer(t.FRAMEBUFFER,W.__webglFramebuffer[Ue]),W.__webglDepthbuffer[Ue]===void 0)W.__webglDepthbuffer[Ue]=t.createRenderbuffer(),Se(W.__webglDepthbuffer[Ue],Q,!1);else{const ze=Q.stencilBuffer?t.DEPTH_STENCIL_ATTACHMENT:t.DEPTH_ATTACHMENT,Fe=W.__webglDepthbuffer[Ue];t.bindRenderbuffer(t.RENDERBUFFER,Fe),t.framebufferRenderbuffer(t.FRAMEBUFFER,ze,t.RENDERBUFFER,Fe)}}else if(n.bindFramebuffer(t.FRAMEBUFFER,W.__webglFramebuffer),W.__webglDepthbuffer===void 0)W.__webglDepthbuffer=t.createRenderbuffer(),Se(W.__webglDepthbuffer,Q,!1);else{const Ue=Q.stencilBuffer?t.DEPTH_STENCIL_ATTACHMENT:t.DEPTH_ATTACHMENT,ze=W.__webglDepthbuffer;t.bindRenderbuffer(t.RENDERBUFFER,ze),t.framebufferRenderbuffer(t.FRAMEBUFFER,Ue,t.RENDERBUFFER,ze)}n.bindFramebuffer(t.FRAMEBUFFER,null)}function Ee(Q,W,be){const Ue=r.get(Q);W!==void 0&&ce(Ue.__webglFramebuffer,Q,Q.texture,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,0),be!==void 0&&We(Q)}function Ge(Q){const W=Q.texture,be=r.get(Q),Ue=r.get(W);Q.addEventListener("dispose",N);const ze=Q.textures,Fe=Q.isWebGLCubeRenderTarget===!0,bt=ze.length>1;if(bt||(Ue.__webglTexture===void 0&&(Ue.__webglTexture=t.createTexture()),Ue.__version=W.version,a.memory.textures++),Fe){be.__webglFramebuffer=[];for(let rt=0;rt<6;rt++)if(W.mipmaps&&W.mipmaps.length>0){be.__webglFramebuffer[rt]=[];for(let ht=0;ht0){be.__webglFramebuffer=[];for(let rt=0;rt0&&ne(Q)===!1){be.__webglMultisampledFramebuffer=t.createFramebuffer(),be.__webglColorRenderbuffer=[],n.bindFramebuffer(t.FRAMEBUFFER,be.__webglMultisampledFramebuffer);for(let rt=0;rt0)for(let ht=0;ht0)for(let ht=0;ht0){if(ne(Q)===!1){const W=Q.textures,be=Q.width,Ue=Q.height;let ze=t.COLOR_BUFFER_BIT;const Fe=Q.stencilBuffer?t.DEPTH_STENCIL_ATTACHMENT:t.DEPTH_ATTACHMENT,bt=r.get(Q),rt=W.length>1;if(rt)for(let ht=0;ht0&&e.has("WEBGL_multisampled_render_to_texture")===!0&&W.__useRenderToTexture!==!1}function Ce(Q){const W=a.render.frame;d.get(Q)!==W&&(d.set(Q,W),Q.update())}function Xe(Q,W){const be=Q.colorSpace,Ue=Q.format,ze=Q.type;return Q.isCompressedTexture===!0||Q.isVideoTexture===!0||be!==xi&&be!==Oc&&(Nn.getTransfer(be)===er?(Ue!==ss||ze!==Ho)&&console.warn("THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):console.error("THREE.WebGLTextures: Unsupported texture color space:",be)),W}function Ze(Q){return typeof HTMLImageElement<"u"&&Q instanceof HTMLImageElement?(c.width=Q.naturalWidth||Q.width,c.height=Q.naturalHeight||Q.height):typeof VideoFrame<"u"&&Q instanceof VideoFrame?(c.width=Q.displayWidth,c.height=Q.displayHeight):(c.width=Q.width,c.height=Q.height),c}this.allocateTextureUnit=X,this.resetTextureUnits=j,this.setTexture2D=ie,this.setTexture2DArray=pe,this.setTexture3D=ae,this.setTextureCube=he,this.rebindTextures=Ee,this.setupRenderTarget=Ge,this.updateRenderTargetMipmap=$e,this.updateMultisampleRenderTarget=Ve,this.setupDepthRenderbuffer=We,this.setupFrameBufferTexture=ce,this.useMultisampledRTT=ne}function S6(t,e){function n(r,i=Oc){let s;const a=Nn.getTransfer(i);if(r===Ho)return t.UNSIGNED_BYTE;if(r===WS)return t.UNSIGNED_SHORT_4_4_4_4;if(r===$S)return t.UNSIGNED_SHORT_5_5_5_1;if(r===hR)return t.UNSIGNED_INT_5_9_9_9_REV;if(r===dR)return t.BYTE;if(r===fR)return t.SHORT;if(r===kg)return t.UNSIGNED_SHORT;if(r===GS)return t.INT;if(r===Qc)return t.UNSIGNED_INT;if(r===Qs)return t.FLOAT;if(r===rv)return t.HALF_FLOAT;if(r===pR)return t.ALPHA;if(r===mR)return t.RGB;if(r===ss)return t.RGBA;if(r===gR)return t.LUMINANCE;if(r===vR)return t.LUMINANCE_ALPHA;if(r===Th)return t.DEPTH_COMPONENT;if(r===Hh)return t.DEPTH_STENCIL;if(r===XS)return t.RED;if(r===ux)return t.RED_INTEGER;if(r===yR)return t.RG;if(r===qS)return t.RG_INTEGER;if(r===KS)return t.RGBA_INTEGER;if(r===Z0||r===Q0||r===J0||r===ey)if(a===er)if(s=e.get("WEBGL_compressed_texture_s3tc_srgb"),s!==null){if(r===Z0)return s.COMPRESSED_SRGB_S3TC_DXT1_EXT;if(r===Q0)return s.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;if(r===J0)return s.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;if(r===ey)return s.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}else return null;else if(s=e.get("WEBGL_compressed_texture_s3tc"),s!==null){if(r===Z0)return s.COMPRESSED_RGB_S3TC_DXT1_EXT;if(r===Q0)return s.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(r===J0)return s.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(r===ey)return s.COMPRESSED_RGBA_S3TC_DXT5_EXT}else return null;if(r===l1||r===c1||r===u1||r===d1)if(s=e.get("WEBGL_compressed_texture_pvrtc"),s!==null){if(r===l1)return s.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(r===c1)return s.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(r===u1)return s.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(r===d1)return s.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}else return null;if(r===f1||r===h1||r===p1)if(s=e.get("WEBGL_compressed_texture_etc"),s!==null){if(r===f1||r===h1)return a===er?s.COMPRESSED_SRGB8_ETC2:s.COMPRESSED_RGB8_ETC2;if(r===p1)return a===er?s.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:s.COMPRESSED_RGBA8_ETC2_EAC}else return null;if(r===m1||r===g1||r===v1||r===y1||r===x1||r===b1||r===_1||r===w1||r===S1||r===M1||r===E1||r===A1||r===T1||r===P1)if(s=e.get("WEBGL_compressed_texture_astc"),s!==null){if(r===m1)return a===er?s.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:s.COMPRESSED_RGBA_ASTC_4x4_KHR;if(r===g1)return a===er?s.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:s.COMPRESSED_RGBA_ASTC_5x4_KHR;if(r===v1)return a===er?s.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:s.COMPRESSED_RGBA_ASTC_5x5_KHR;if(r===y1)return a===er?s.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:s.COMPRESSED_RGBA_ASTC_6x5_KHR;if(r===x1)return a===er?s.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:s.COMPRESSED_RGBA_ASTC_6x6_KHR;if(r===b1)return a===er?s.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:s.COMPRESSED_RGBA_ASTC_8x5_KHR;if(r===_1)return a===er?s.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:s.COMPRESSED_RGBA_ASTC_8x6_KHR;if(r===w1)return a===er?s.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:s.COMPRESSED_RGBA_ASTC_8x8_KHR;if(r===S1)return a===er?s.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:s.COMPRESSED_RGBA_ASTC_10x5_KHR;if(r===M1)return a===er?s.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:s.COMPRESSED_RGBA_ASTC_10x6_KHR;if(r===E1)return a===er?s.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:s.COMPRESSED_RGBA_ASTC_10x8_KHR;if(r===A1)return a===er?s.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:s.COMPRESSED_RGBA_ASTC_10x10_KHR;if(r===T1)return a===er?s.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:s.COMPRESSED_RGBA_ASTC_12x10_KHR;if(r===P1)return a===er?s.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:s.COMPRESSED_RGBA_ASTC_12x12_KHR}else return null;if(r===ty||r===C1||r===R1)if(s=e.get("EXT_texture_compression_bptc"),s!==null){if(r===ty)return a===er?s.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT:s.COMPRESSED_RGBA_BPTC_UNORM_EXT;if(r===C1)return s.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;if(r===R1)return s.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT}else return null;if(r===xR||r===N1||r===I1||r===k1)if(s=e.get("EXT_texture_compression_rgtc"),s!==null){if(r===ty)return s.COMPRESSED_RED_RGTC1_EXT;if(r===N1)return s.COMPRESSED_SIGNED_RED_RGTC1_EXT;if(r===I1)return s.COMPRESSED_RED_GREEN_RGTC2_EXT;if(r===k1)return s.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT}else return null;return r===Bh?t.UNSIGNED_INT_24_8:t[r]!==void 0?t[r]:null}return{convert:n}}class M6 extends Pr{constructor(e=[]){super(),this.isArrayCamera=!0,this.cameras=e}}class Ts extends mn{constructor(){super(),this.isGroup=!0,this.type="Group"}}const vye={type:"move"};class wA{constructor(){this._targetRay=null,this._grip=null,this._hand=null}getHandSpace(){return this._hand===null&&(this._hand=new Ts,this._hand.matrixAutoUpdate=!1,this._hand.visible=!1,this._hand.joints={},this._hand.inputState={pinching:!1}),this._hand}getTargetRaySpace(){return this._targetRay===null&&(this._targetRay=new Ts,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1,this._targetRay.hasLinearVelocity=!1,this._targetRay.linearVelocity=new q,this._targetRay.hasAngularVelocity=!1,this._targetRay.angularVelocity=new q),this._targetRay}getGripSpace(){return this._grip===null&&(this._grip=new Ts,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1,this._grip.hasLinearVelocity=!1,this._grip.linearVelocity=new q,this._grip.hasAngularVelocity=!1,this._grip.angularVelocity=new q),this._grip}dispatchEvent(e){return this._targetRay!==null&&this._targetRay.dispatchEvent(e),this._grip!==null&&this._grip.dispatchEvent(e),this._hand!==null&&this._hand.dispatchEvent(e),this}connect(e){if(e&&e.hand){const n=this._hand;if(n)for(const r of e.hand.values())this._getHandJoint(n,r)}return this.dispatchEvent({type:"connected",data:e}),this}disconnect(e){return this.dispatchEvent({type:"disconnected",data:e}),this._targetRay!==null&&(this._targetRay.visible=!1),this._grip!==null&&(this._grip.visible=!1),this._hand!==null&&(this._hand.visible=!1),this}update(e,n,r){let i=null,s=null,a=null;const o=this._targetRay,l=this._grip,c=this._hand;if(e&&n.session.visibilityState!=="visible-blurred"){if(c&&e.hand){a=!0;for(const S of e.hand.values()){const w=n.getJointPose(S,r),x=this._getHandJoint(c,S);w!==null&&(x.matrix.fromArray(w.transform.matrix),x.matrix.decompose(x.position,x.rotation,x.scale),x.matrixWorldNeedsUpdate=!0,x.jointRadius=w.radius),x.visible=w!==null}const d=c.joints["index-finger-tip"],f=c.joints["thumb-tip"],p=d.position.distanceTo(f.position),y=.02,b=.005;c.inputState.pinching&&p>y+b?(c.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:e.handedness,target:this})):!c.inputState.pinching&&p<=y-b&&(c.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:e.handedness,target:this}))}else l!==null&&e.gripSpace&&(s=n.getPose(e.gripSpace,r),s!==null&&(l.matrix.fromArray(s.transform.matrix),l.matrix.decompose(l.position,l.rotation,l.scale),l.matrixWorldNeedsUpdate=!0,s.linearVelocity?(l.hasLinearVelocity=!0,l.linearVelocity.copy(s.linearVelocity)):l.hasLinearVelocity=!1,s.angularVelocity?(l.hasAngularVelocity=!0,l.angularVelocity.copy(s.angularVelocity)):l.hasAngularVelocity=!1));o!==null&&(i=n.getPose(e.targetRaySpace,r),i===null&&s!==null&&(i=s),i!==null&&(o.matrix.fromArray(i.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),o.matrixWorldNeedsUpdate=!0,i.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(i.linearVelocity)):o.hasLinearVelocity=!1,i.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(i.angularVelocity)):o.hasAngularVelocity=!1,this.dispatchEvent(vye)))}return o!==null&&(o.visible=i!==null),l!==null&&(l.visible=s!==null),c!==null&&(c.visible=a!==null),this}_getHandJoint(e,n){if(e.joints[n.jointName]===void 0){const r=new Ts;r.matrixAutoUpdate=!1,r.visible=!1,e.joints[n.jointName]=r,e.add(r)}return e.joints[n.jointName]}}const yye=` -void main() { - - gl_Position = vec4( position, 1.0 ); - -}`,xye=` -uniform sampler2DArray depthColor; -uniform float depthWidth; -uniform float depthHeight; - -void main() { - - vec2 coord = vec2( gl_FragCoord.x / depthWidth, gl_FragCoord.y / depthHeight ); - - if ( coord.x >= 1.0 ) { - - gl_FragDepth = texture( depthColor, vec3( coord.x - 1.0, coord.y, 1 ) ).r; - - } else { - - gl_FragDepth = texture( depthColor, vec3( coord.x, coord.y, 0 ) ).r; - - } - -}`;class bye{constructor(){this.texture=null,this.mesh=null,this.depthNear=0,this.depthFar=0}init(e,n,r){if(this.texture===null){const i=new fr,s=e.properties.get(i);s.__webglTexture=n.texture,(n.depthNear!=r.depthNear||n.depthFar!=r.depthFar)&&(this.depthNear=n.depthNear,this.depthFar=n.depthFar),this.texture=i}}getMesh(e){if(this.texture!==null&&this.mesh===null){const n=e.cameras[0].viewport,r=new Ya({vertexShader:yye,fragmentShader:xye,uniforms:{depthColor:{value:this.texture},depthWidth:{value:n.z},depthHeight:{value:n.w}}});this.mesh=new xr(new iv(20,20),r)}return this.mesh}reset(){this.texture=null,this.mesh=null}getDepthTexture(){return this.texture}}class _ye extends zl{constructor(e,n){super();const r=this;let i=null,s=1,a=null,o="local-floor",l=1,c=null,d=null,f=null,p=null,y=null,b=null;const S=new bye,w=n.getContextAttributes();let x=null,M=null;const T=[],P=[],O=new He;let N=null;const D=new Pr;D.layers.enable(1),D.viewport=new On;const z=new Pr;z.layers.enable(2),z.viewport=new On;const V=[D,z],k=new M6;k.layers.enable(1),k.layers.enable(2);let j=null,X=null;this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(se){let ce=T[se];return ce===void 0&&(ce=new wA,T[se]=ce),ce.getTargetRaySpace()},this.getControllerGrip=function(se){let ce=T[se];return ce===void 0&&(ce=new wA,T[se]=ce),ce.getGripSpace()},this.getHand=function(se){let ce=T[se];return ce===void 0&&(ce=new wA,T[se]=ce),ce.getHandSpace()};function ee(se){const ce=P.indexOf(se.inputSource);if(ce===-1)return;const Se=T[ce];Se!==void 0&&(Se.update(se.inputSource,se.frame,c||a),Se.dispatchEvent({type:se.type,data:se.inputSource}))}function ie(){i.removeEventListener("select",ee),i.removeEventListener("selectstart",ee),i.removeEventListener("selectend",ee),i.removeEventListener("squeeze",ee),i.removeEventListener("squeezestart",ee),i.removeEventListener("squeezeend",ee),i.removeEventListener("end",ie),i.removeEventListener("inputsourceschange",pe);for(let se=0;se=0&&(P[we]=null,T[we].disconnect(Se))}for(let ce=0;ce=P.length){P.push(Se),we=Ee;break}else if(P[Ee]===null){P[Ee]=Se,we=Ee;break}if(we===-1)break}const We=T[we];We&&We.connect(Se)}}const ae=new q,he=new q;function B(se,ce,Se){ae.setFromMatrixPosition(ce.matrixWorld),he.setFromMatrixPosition(Se.matrixWorld);const we=ae.distanceTo(he),We=ce.projectionMatrix.elements,Ee=Se.projectionMatrix.elements,Ge=We[14]/(We[10]-1),$e=We[14]/(We[10]+1),de=(We[9]+1)/We[5],Z=(We[9]-1)/We[5],Ve=(We[8]-1)/We[0],Le=(Ee[8]+1)/Ee[0],ne=Ge*Ve,Ce=Ge*Le,Xe=we/(-Ve+Le),Ze=Xe*-Ve;if(ce.matrixWorld.decompose(se.position,se.quaternion,se.scale),se.translateX(Ze),se.translateZ(Xe),se.matrixWorld.compose(se.position,se.quaternion,se.scale),se.matrixWorldInverse.copy(se.matrixWorld).invert(),We[10]===-1)se.projectionMatrix.copy(ce.projectionMatrix),se.projectionMatrixInverse.copy(ce.projectionMatrixInverse);else{const Q=Ge+Xe,W=$e+Xe,be=ne-Ze,Ue=Ce+(we-Ze),ze=de*$e/W*Q,Fe=Z*$e/W*Q;se.projectionMatrix.makePerspective(be,Ue,ze,Fe,Q,W),se.projectionMatrixInverse.copy(se.projectionMatrix).invert()}}function J(se,ce){ce===null?se.matrixWorld.copy(se.matrix):se.matrixWorld.multiplyMatrices(ce.matrixWorld,se.matrix),se.matrixWorldInverse.copy(se.matrixWorld).invert()}this.updateCamera=function(se){if(i===null)return;let ce=se.near,Se=se.far;S.texture!==null&&(S.depthNear>0&&(ce=S.depthNear),S.depthFar>0&&(Se=S.depthFar)),k.near=z.near=D.near=ce,k.far=z.far=D.far=Se,(j!==k.near||X!==k.far)&&(i.updateRenderState({depthNear:k.near,depthFar:k.far}),j=k.near,X=k.far);const we=se.parent,We=k.cameras;J(k,we);for(let Ee=0;Ee0&&(w.alphaTest.value=x.alphaTest);const M=e.get(x),T=M.envMap,P=M.envMapRotation;T&&(w.envMap.value=T,Of.copy(P),Of.x*=-1,Of.y*=-1,Of.z*=-1,T.isCubeTexture&&T.isRenderTargetTexture===!1&&(Of.y*=-1,Of.z*=-1),w.envMapRotation.value.setFromMatrix4(wye.makeRotationFromEuler(Of)),w.flipEnvMap.value=T.isCubeTexture&&T.isRenderTargetTexture===!1?-1:1,w.reflectivity.value=x.reflectivity,w.ior.value=x.ior,w.refractionRatio.value=x.refractionRatio),x.lightMap&&(w.lightMap.value=x.lightMap,w.lightMapIntensity.value=x.lightMapIntensity,n(x.lightMap,w.lightMapTransform)),x.aoMap&&(w.aoMap.value=x.aoMap,w.aoMapIntensity.value=x.aoMapIntensity,n(x.aoMap,w.aoMapTransform))}function a(w,x){w.diffuse.value.copy(x.color),w.opacity.value=x.opacity,x.map&&(w.map.value=x.map,n(x.map,w.mapTransform))}function o(w,x){w.dashSize.value=x.dashSize,w.totalSize.value=x.dashSize+x.gapSize,w.scale.value=x.scale}function l(w,x,M,T){w.diffuse.value.copy(x.color),w.opacity.value=x.opacity,w.size.value=x.size*M,w.scale.value=T*.5,x.map&&(w.map.value=x.map,n(x.map,w.uvTransform)),x.alphaMap&&(w.alphaMap.value=x.alphaMap,n(x.alphaMap,w.alphaMapTransform)),x.alphaTest>0&&(w.alphaTest.value=x.alphaTest)}function c(w,x){w.diffuse.value.copy(x.color),w.opacity.value=x.opacity,w.rotation.value=x.rotation,x.map&&(w.map.value=x.map,n(x.map,w.mapTransform)),x.alphaMap&&(w.alphaMap.value=x.alphaMap,n(x.alphaMap,w.alphaMapTransform)),x.alphaTest>0&&(w.alphaTest.value=x.alphaTest)}function d(w,x){w.specular.value.copy(x.specular),w.shininess.value=Math.max(x.shininess,1e-4)}function f(w,x){x.gradientMap&&(w.gradientMap.value=x.gradientMap)}function p(w,x){w.metalness.value=x.metalness,x.metalnessMap&&(w.metalnessMap.value=x.metalnessMap,n(x.metalnessMap,w.metalnessMapTransform)),w.roughness.value=x.roughness,x.roughnessMap&&(w.roughnessMap.value=x.roughnessMap,n(x.roughnessMap,w.roughnessMapTransform)),x.envMap&&(w.envMapIntensity.value=x.envMapIntensity)}function y(w,x,M){w.ior.value=x.ior,x.sheen>0&&(w.sheenColor.value.copy(x.sheenColor).multiplyScalar(x.sheen),w.sheenRoughness.value=x.sheenRoughness,x.sheenColorMap&&(w.sheenColorMap.value=x.sheenColorMap,n(x.sheenColorMap,w.sheenColorMapTransform)),x.sheenRoughnessMap&&(w.sheenRoughnessMap.value=x.sheenRoughnessMap,n(x.sheenRoughnessMap,w.sheenRoughnessMapTransform))),x.clearcoat>0&&(w.clearcoat.value=x.clearcoat,w.clearcoatRoughness.value=x.clearcoatRoughness,x.clearcoatMap&&(w.clearcoatMap.value=x.clearcoatMap,n(x.clearcoatMap,w.clearcoatMapTransform)),x.clearcoatRoughnessMap&&(w.clearcoatRoughnessMap.value=x.clearcoatRoughnessMap,n(x.clearcoatRoughnessMap,w.clearcoatRoughnessMapTransform)),x.clearcoatNormalMap&&(w.clearcoatNormalMap.value=x.clearcoatNormalMap,n(x.clearcoatNormalMap,w.clearcoatNormalMapTransform),w.clearcoatNormalScale.value.copy(x.clearcoatNormalScale),x.side===as&&w.clearcoatNormalScale.value.negate())),x.dispersion>0&&(w.dispersion.value=x.dispersion),x.iridescence>0&&(w.iridescence.value=x.iridescence,w.iridescenceIOR.value=x.iridescenceIOR,w.iridescenceThicknessMinimum.value=x.iridescenceThicknessRange[0],w.iridescenceThicknessMaximum.value=x.iridescenceThicknessRange[1],x.iridescenceMap&&(w.iridescenceMap.value=x.iridescenceMap,n(x.iridescenceMap,w.iridescenceMapTransform)),x.iridescenceThicknessMap&&(w.iridescenceThicknessMap.value=x.iridescenceThicknessMap,n(x.iridescenceThicknessMap,w.iridescenceThicknessMapTransform))),x.transmission>0&&(w.transmission.value=x.transmission,w.transmissionSamplerMap.value=M.texture,w.transmissionSamplerSize.value.set(M.width,M.height),x.transmissionMap&&(w.transmissionMap.value=x.transmissionMap,n(x.transmissionMap,w.transmissionMapTransform)),w.thickness.value=x.thickness,x.thicknessMap&&(w.thicknessMap.value=x.thicknessMap,n(x.thicknessMap,w.thicknessMapTransform)),w.attenuationDistance.value=x.attenuationDistance,w.attenuationColor.value.copy(x.attenuationColor)),x.anisotropy>0&&(w.anisotropyVector.value.set(x.anisotropy*Math.cos(x.anisotropyRotation),x.anisotropy*Math.sin(x.anisotropyRotation)),x.anisotropyMap&&(w.anisotropyMap.value=x.anisotropyMap,n(x.anisotropyMap,w.anisotropyMapTransform))),w.specularIntensity.value=x.specularIntensity,w.specularColor.value.copy(x.specularColor),x.specularColorMap&&(w.specularColorMap.value=x.specularColorMap,n(x.specularColorMap,w.specularColorMapTransform)),x.specularIntensityMap&&(w.specularIntensityMap.value=x.specularIntensityMap,n(x.specularIntensityMap,w.specularIntensityMapTransform))}function b(w,x){x.matcap&&(w.matcap.value=x.matcap)}function S(w,x){const M=e.get(x).light;w.referencePosition.value.setFromMatrixPosition(M.matrixWorld),w.nearDistance.value=M.shadow.camera.near,w.farDistance.value=M.shadow.camera.far}return{refreshFogUniforms:r,refreshMaterialUniforms:i}}function Mye(t,e,n,r){let i={},s={},a=[];const o=t.getParameter(t.MAX_UNIFORM_BUFFER_BINDINGS);function l(M,T){const P=T.program;r.uniformBlockBinding(M,P)}function c(M,T){let P=i[M.id];P===void 0&&(b(M),P=d(M),i[M.id]=P,M.addEventListener("dispose",w));const O=T.program;r.updateUBOMapping(M,O);const N=e.render.frame;s[M.id]!==N&&(p(M),s[M.id]=N)}function d(M){const T=f();M.__bindingPointIndex=T;const P=t.createBuffer(),O=M.__size,N=M.usage;return t.bindBuffer(t.UNIFORM_BUFFER,P),t.bufferData(t.UNIFORM_BUFFER,O,N),t.bindBuffer(t.UNIFORM_BUFFER,null),t.bindBufferBase(t.UNIFORM_BUFFER,T,P),P}function f(){for(let M=0;M0&&(P+=O-N),M.__size=P,M.__cache={},this}function S(M){const T={boundary:0,storage:0};return typeof M=="number"||typeof M=="boolean"?(T.boundary=4,T.storage=4):M.isVector2?(T.boundary=8,T.storage=8):M.isVector3||M.isColor?(T.boundary=16,T.storage=12):M.isVector4?(T.boundary=16,T.storage=16):M.isMatrix3?(T.boundary=48,T.storage=48):M.isMatrix4?(T.boundary=64,T.storage=64):M.isTexture?console.warn("THREE.WebGLRenderer: Texture samplers can not be part of an uniforms group."):console.warn("THREE.WebGLRenderer: Unsupported uniform value type.",M),T}function w(M){const T=M.target;T.removeEventListener("dispose",w);const P=a.indexOf(T.__bindingPointIndex);a.splice(P,1),t.deleteBuffer(i[T.id]),delete i[T.id],delete s[T.id]}function x(){for(const M in i)t.deleteBuffer(i[M]);a=[],i={},s={}}return{bind:l,update:c,dispose:x}}class E6{constructor(e={}){const{canvas:n=d6(),context:r=null,depth:i=!0,stencil:s=!1,alpha:a=!1,antialias:o=!1,premultipliedAlpha:l=!0,preserveDrawingBuffer:c=!1,powerPreference:d="default",failIfMajorPerformanceCaveat:f=!1}=e;this.isWebGLRenderer=!0;let p;if(r!==null){if(typeof WebGLRenderingContext<"u"&&r instanceof WebGLRenderingContext)throw new Error("THREE.WebGLRenderer: WebGL 1 is not supported since r163.");p=r.getContextAttributes().alpha}else p=a;const y=new Uint32Array(4),b=new Int32Array(4);let S=null,w=null;const x=[],M=[];this.domElement=n,this.debug={checkShaderErrors:!0,onShaderError:null},this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this._outputColorSpace=Fi,this.toneMapping=Tl,this.toneMappingExposure=1;const T=this;let P=!1,O=0,N=0,D=null,z=-1,V=null;const k=new On,j=new On;let X=null;const ee=new ct(0);let ie=0,pe=n.width,ae=n.height,he=1,B=null,J=null;const Y=new On(0,0,pe,ae),H=new On(0,0,pe,ae);let G=!1;const le=new px;let se=!1,ce=!1;const Se=new Ct,we=new Ct,We=new q,Ee=new On,Ge={background:null,fog:null,environment:null,overrideMaterial:null,isScene:!0};let $e=!1;function de(){return D===null?he:1}let Z=r;function Ve(K,xe){return n.getContext(K,xe)}try{const K={alpha:!0,depth:i,stencil:s,antialias:o,premultipliedAlpha:l,preserveDrawingBuffer:c,powerPreference:d,failIfMajorPerformanceCaveat:f};if("setAttribute"in n&&n.setAttribute("data-engine",`three.js r${Pd}`),n.addEventListener("webglcontextlost",Be,!1),n.addEventListener("webglcontextrestored",at,!1),n.addEventListener("webglcontextcreationerror",pt,!1),Z===null){const xe="webgl2";if(Z=Ve(xe,K),Z===null)throw Ve(xe)?new Error("Error creating WebGL context with your selected attributes."):new Error("Error creating WebGL context.")}}catch(K){throw console.error("THREE.WebGLRenderer: "+K.message),K}let Le,ne,Ce,Xe,Ze,Q,W,be,Ue,ze,Fe,bt,rt,ht,Xt,Ke,te,tt,Mt,vt,Zt,fe,qe,ue;function Ye(){Le=new Rve(Z),Le.init(),fe=new S6(Z,Le),ne=new Mve(Z,Le,e,fe),Ce=new uye(Z),ne.reverseDepthBuffer&&Ce.buffers.depth.setReversed(!0),Xe=new kve(Z),Ze=new Z0e,Q=new gye(Z,Le,Ce,Ze,ne,fe,Xe),W=new Ave(T),be=new Cve(T),Ue=new zpe(Z),qe=new wve(Z,Ue),ze=new Nve(Z,Ue,Xe,qe),Fe=new Lve(Z,ze,Ue,Xe),Mt=new Ove(Z,ne,Q),Ke=new Eve(Ze),bt=new Y0e(T,W,be,Le,ne,qe,Ke),rt=new Sye(T,Ze),ht=new J0e,Xt=new sye(Le),tt=new _ve(T,W,be,Ce,Fe,p,l),te=new lye(T,Fe,ne),ue=new Mye(Z,Xe,ne,Ce),vt=new Sve(Z,Le,Xe),Zt=new Ive(Z,Le,Xe),Xe.programs=bt.programs,T.capabilities=ne,T.extensions=Le,T.properties=Ze,T.renderLists=ht,T.shadowMap=te,T.state=Ce,T.info=Xe}Ye();const Re=new _ye(T,Z);this.xr=Re,this.getContext=function(){return Z},this.getContextAttributes=function(){return Z.getContextAttributes()},this.forceContextLoss=function(){const K=Le.get("WEBGL_lose_context");K&&K.loseContext()},this.forceContextRestore=function(){const K=Le.get("WEBGL_lose_context");K&&K.restoreContext()},this.getPixelRatio=function(){return he},this.setPixelRatio=function(K){K!==void 0&&(he=K,this.setSize(pe,ae,!1))},this.getSize=function(K){return K.set(pe,ae)},this.setSize=function(K,xe,Te=!0){if(Re.isPresenting){console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting.");return}pe=K,ae=xe,n.width=Math.floor(K*he),n.height=Math.floor(xe*he),Te===!0&&(n.style.width=K+"px",n.style.height=xe+"px"),this.setViewport(0,0,K,xe)},this.getDrawingBufferSize=function(K){return K.set(pe*he,ae*he).floor()},this.setDrawingBufferSize=function(K,xe,Te){pe=K,ae=xe,he=Te,n.width=Math.floor(K*Te),n.height=Math.floor(xe*Te),this.setViewport(0,0,K,xe)},this.getCurrentViewport=function(K){return K.copy(k)},this.getViewport=function(K){return K.copy(Y)},this.setViewport=function(K,xe,Te,Ie){K.isVector4?Y.set(K.x,K.y,K.z,K.w):Y.set(K,xe,Te,Ie),Ce.viewport(k.copy(Y).multiplyScalar(he).round())},this.getScissor=function(K){return K.copy(H)},this.setScissor=function(K,xe,Te,Ie){K.isVector4?H.set(K.x,K.y,K.z,K.w):H.set(K,xe,Te,Ie),Ce.scissor(j.copy(H).multiplyScalar(he).round())},this.getScissorTest=function(){return G},this.setScissorTest=function(K){Ce.setScissorTest(G=K)},this.setOpaqueSort=function(K){B=K},this.setTransparentSort=function(K){J=K},this.getClearColor=function(K){return K.copy(tt.getClearColor())},this.setClearColor=function(){tt.setClearColor.apply(tt,arguments)},this.getClearAlpha=function(){return tt.getClearAlpha()},this.setClearAlpha=function(){tt.setClearAlpha.apply(tt,arguments)},this.clear=function(K=!0,xe=!0,Te=!0){let Ie=0;if(K){let Me=!1;if(D!==null){const it=D.texture.format;Me=it===KS||it===qS||it===ux}if(Me){const it=D.texture.type,yt=it===Ho||it===Qc||it===kg||it===Bh||it===WS||it===$S,lt=tt.getClearColor(),Et=tt.getClearAlpha(),jt=lt.r,Bt=lt.g,Rt=lt.b;yt?(y[0]=jt,y[1]=Bt,y[2]=Rt,y[3]=Et,Z.clearBufferuiv(Z.COLOR,0,y)):(b[0]=jt,b[1]=Bt,b[2]=Rt,b[3]=Et,Z.clearBufferiv(Z.COLOR,0,b))}else Ie|=Z.COLOR_BUFFER_BIT}xe&&(Ie|=Z.DEPTH_BUFFER_BIT,Z.clearDepth(this.capabilities.reverseDepthBuffer?0:1)),Te&&(Ie|=Z.STENCIL_BUFFER_BIT,this.state.buffers.stencil.setMask(4294967295)),Z.clear(Ie)},this.clearColor=function(){this.clear(!0,!1,!1)},this.clearDepth=function(){this.clear(!1,!0,!1)},this.clearStencil=function(){this.clear(!1,!1,!0)},this.dispose=function(){n.removeEventListener("webglcontextlost",Be,!1),n.removeEventListener("webglcontextrestored",at,!1),n.removeEventListener("webglcontextcreationerror",pt,!1),ht.dispose(),Xt.dispose(),Ze.dispose(),W.dispose(),be.dispose(),Fe.dispose(),qe.dispose(),ue.dispose(),bt.dispose(),Re.dispose(),Re.removeEventListener("sessionstart",Mi),Re.removeEventListener("sessionend",to),Ei.stop()};function Be(K){K.preventDefault(),console.log("THREE.WebGLRenderer: Context Lost."),P=!0}function at(){console.log("THREE.WebGLRenderer: Context Restored."),P=!1;const K=Xe.autoReset,xe=te.enabled,Te=te.autoUpdate,Ie=te.needsUpdate,Me=te.type;Ye(),Xe.autoReset=K,te.enabled=xe,te.autoUpdate=Te,te.needsUpdate=Ie,te.type=Me}function pt(K){console.error("THREE.WebGLRenderer: A WebGL context could not be created. Reason: ",K.statusMessage)}function Jt(K){const xe=K.target;xe.removeEventListener("dispose",Jt),pn(xe)}function pn(K){jn(K),Ze.remove(K)}function jn(K){const xe=Ze.get(K).programs;xe!==void 0&&(xe.forEach(function(Te){bt.releaseProgram(Te)}),K.isShaderMaterial&&bt.releaseShaderCache(K))}this.renderBufferDirect=function(K,xe,Te,Ie,Me,it){xe===null&&(xe=Ge);const yt=Me.isMesh&&Me.matrixWorld.determinant()<0,lt=Ta(K,xe,Te,Ie,Me);Ce.setMaterial(Ie,yt);let Et=Te.index,jt=1;if(Ie.wireframe===!0){if(Et=ze.getWireframeAttribute(Te),Et===void 0)return;jt=2}const Bt=Te.drawRange,Rt=Te.attributes.position;let Sn=Bt.start*jt,Mn=(Bt.start+Bt.count)*jt;it!==null&&(Sn=Math.max(Sn,it.start*jt),Mn=Math.min(Mn,(it.start+it.count)*jt)),Et!==null?(Sn=Math.max(Sn,0),Mn=Math.min(Mn,Et.count)):Rt!=null&&(Sn=Math.max(Sn,0),Mn=Math.min(Mn,Rt.count));const yn=Mn-Sn;if(yn<0||yn===1/0)return;qe.setup(Me,Ie,lt,Te,Et);let Kt,Ut=vt;if(Et!==null&&(Kt=Ue.get(Et),Ut=Zt,Ut.setIndex(Kt)),Me.isMesh)Ie.wireframe===!0?(Ce.setLineWidth(Ie.wireframeLinewidth*de()),Ut.setMode(Z.LINES)):Ut.setMode(Z.TRIANGLES);else if(Me.isLine){let mt=Ie.linewidth;mt===void 0&&(mt=1),Ce.setLineWidth(mt*de()),Me.isLineSegments?Ut.setMode(Z.LINES):Me.isLineLoop?Ut.setMode(Z.LINE_LOOP):Ut.setMode(Z.LINE_STRIP)}else Me.isPoints?Ut.setMode(Z.POINTS):Me.isSprite&&Ut.setMode(Z.TRIANGLES);if(Me.isBatchedMesh)if(Me._multiDrawInstances!==null)Ut.renderMultiDrawInstances(Me._multiDrawStarts,Me._multiDrawCounts,Me._multiDrawCount,Me._multiDrawInstances);else if(Le.get("WEBGL_multi_draw"))Ut.renderMultiDraw(Me._multiDrawStarts,Me._multiDrawCounts,Me._multiDrawCount);else{const mt=Me._multiDrawStarts,xn=Me._multiDrawCounts,tn=Me._multiDrawCount,Rr=Et?Ue.get(Et).bytesPerElement:1,li=Ze.get(Ie).currentProgram.getUniforms();for(let In=0;In{function it(){if(Ie.forEach(function(yt){Ze.get(yt).currentProgram.isReady()&&Ie.delete(yt)}),Ie.size===0){Me(K);return}setTimeout(it,10)}Le.get("KHR_parallel_shader_compile")!==null?it():setTimeout(it,10)})};let Hn=null;function pr(K){Hn&&Hn(K)}function Mi(){Ei.stop()}function to(){Ei.start()}const Ei=new y6;Ei.setAnimationLoop(pr),typeof self<"u"&&Ei.setContext(self),this.setAnimationLoop=function(K){Hn=K,Re.setAnimationLoop(K),K===null?Ei.stop():Ei.start()},Re.addEventListener("sessionstart",Mi),Re.addEventListener("sessionend",to),this.render=function(K,xe){if(xe!==void 0&&xe.isCamera!==!0){console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.");return}if(P===!0)return;if(K.matrixWorldAutoUpdate===!0&&K.updateMatrixWorld(),xe.parent===null&&xe.matrixWorldAutoUpdate===!0&&xe.updateMatrixWorld(),Re.enabled===!0&&Re.isPresenting===!0&&(Re.cameraAutoUpdate===!0&&Re.updateCamera(xe),xe=Re.getCamera()),K.isScene===!0&&K.onBeforeRender(T,K,xe,D),w=Xt.get(K,M.length),w.init(xe),M.push(w),we.multiplyMatrices(xe.projectionMatrix,xe.matrixWorldInverse),le.setFromProjectionMatrix(we),ce=this.localClippingEnabled,se=Ke.init(this.clippingPlanes,ce),S=ht.get(K,x.length),S.init(),x.push(S),Re.enabled===!0&&Re.isPresenting===!0){const it=T.xr.getDepthSensingMesh();it!==null&&Ko(it,xe,-1/0,T.sortObjects)}Ko(K,xe,0,T.sortObjects),S.finish(),T.sortObjects===!0&&S.sort(B,J),$e=Re.enabled===!1||Re.isPresenting===!1||Re.hasDepthSensing()===!1,$e&&tt.addToRenderList(S,K),this.info.render.frame++,se===!0&&Ke.beginShadows();const Te=w.state.shadowsArray;te.render(Te,K,xe),se===!0&&Ke.endShadows(),this.info.autoReset===!0&&this.info.reset();const Ie=S.opaque,Me=S.transmissive;if(w.setupLights(),xe.isArrayCamera){const it=xe.cameras;if(Me.length>0)for(let yt=0,lt=it.length;yt0&&no(Ie,Me,K,xe),$e&&tt.render(K),Ns(S,K,xe);D!==null&&(Q.updateMultisampleRenderTarget(D),Q.updateRenderTargetMipmap(D)),K.isScene===!0&&K.onAfterRender(T,K,xe),qe.resetDefaultState(),z=-1,V=null,M.pop(),M.length>0?(w=M[M.length-1],se===!0&&Ke.setGlobalState(T.clippingPlanes,w.state.camera)):w=null,x.pop(),x.length>0?S=x[x.length-1]:S=null};function Ko(K,xe,Te,Ie){if(K.visible===!1)return;if(K.layers.test(xe.layers)){if(K.isGroup)Te=K.renderOrder;else if(K.isLOD)K.autoUpdate===!0&&K.update(xe);else if(K.isLight)w.pushLight(K),K.castShadow&&w.pushShadow(K);else if(K.isSprite){if(!K.frustumCulled||le.intersectsSprite(K)){Ie&&Ee.setFromMatrixPosition(K.matrixWorld).applyMatrix4(we);const yt=Fe.update(K),lt=K.material;lt.visible&&S.push(K,yt,lt,Te,Ee.z,null)}}else if((K.isMesh||K.isLine||K.isPoints)&&(!K.frustumCulled||le.intersectsObject(K))){const yt=Fe.update(K),lt=K.material;if(Ie&&(K.boundingSphere!==void 0?(K.boundingSphere===null&&K.computeBoundingSphere(),Ee.copy(K.boundingSphere.center)):(yt.boundingSphere===null&&yt.computeBoundingSphere(),Ee.copy(yt.boundingSphere.center)),Ee.applyMatrix4(K.matrixWorld).applyMatrix4(we)),Array.isArray(lt)){const Et=yt.groups;for(let jt=0,Bt=Et.length;jt0&&Ai(Me,xe,Te),it.length>0&&Ai(it,xe,Te),yt.length>0&&Ai(yt,xe,Te),Ce.buffers.depth.setTest(!0),Ce.buffers.depth.setMask(!0),Ce.buffers.color.setMask(!0),Ce.setPolygonOffset(!1)}function no(K,xe,Te,Ie){if((Te.isScene===!0?Te.overrideMaterial:null)!==null)return;w.state.transmissionRenderTarget[Ie.id]===void 0&&(w.state.transmissionRenderTarget[Ie.id]=new Vo(1,1,{generateMipmaps:!0,type:Le.has("EXT_color_buffer_half_float")||Le.has("EXT_color_buffer_float")?rv:Ho,minFilter:$a,samples:4,stencilBuffer:s,resolveDepthBuffer:!1,resolveStencilBuffer:!1,colorSpace:Nn.workingColorSpace}));const it=w.state.transmissionRenderTarget[Ie.id],yt=Ie.viewport||k;it.setSize(yt.z,yt.w);const lt=T.getRenderTarget();T.setRenderTarget(it),T.getClearColor(ee),ie=T.getClearAlpha(),ie<1&&T.setClearColor(16777215,.5),T.clear(),$e&&tt.render(Te);const Et=T.toneMapping;T.toneMapping=Tl;const jt=Ie.viewport;if(Ie.viewport!==void 0&&(Ie.viewport=void 0),w.setupLightsView(Ie),se===!0&&Ke.setGlobalState(T.clippingPlanes,Ie),Ai(K,Te,Ie),Q.updateMultisampleRenderTarget(it),Q.updateRenderTargetMipmap(it),Le.has("WEBGL_multisampled_render_to_texture")===!1){let Bt=!1;for(let Rt=0,Sn=xe.length;Rt0),Rt=!!Te.morphAttributes.position,Sn=!!Te.morphAttributes.normal,Mn=!!Te.morphAttributes.color;let yn=Tl;Ie.toneMapped&&(D===null||D.isXRRenderTarget===!0)&&(yn=T.toneMapping);const Kt=Te.morphAttributes.position||Te.morphAttributes.normal||Te.morphAttributes.color,Ut=Kt!==void 0?Kt.length:0,mt=Ze.get(Ie),xn=w.state.lights;if(se===!0&&(ce===!0||K!==V)){const Xr=K===V&&Ie.id===z;Ke.setState(Ie,K,Xr)}let tn=!1;Ie.version===mt.__version?(mt.needsLights&&mt.lightsStateVersion!==xn.state.version||mt.outputColorSpace!==lt||Me.isBatchedMesh&&mt.batching===!1||!Me.isBatchedMesh&&mt.batching===!0||Me.isBatchedMesh&&mt.batchingColor===!0&&Me.colorTexture===null||Me.isBatchedMesh&&mt.batchingColor===!1&&Me.colorTexture!==null||Me.isInstancedMesh&&mt.instancing===!1||!Me.isInstancedMesh&&mt.instancing===!0||Me.isSkinnedMesh&&mt.skinning===!1||!Me.isSkinnedMesh&&mt.skinning===!0||Me.isInstancedMesh&&mt.instancingColor===!0&&Me.instanceColor===null||Me.isInstancedMesh&&mt.instancingColor===!1&&Me.instanceColor!==null||Me.isInstancedMesh&&mt.instancingMorph===!0&&Me.morphTexture===null||Me.isInstancedMesh&&mt.instancingMorph===!1&&Me.morphTexture!==null||mt.envMap!==Et||Ie.fog===!0&&mt.fog!==it||mt.numClippingPlanes!==void 0&&(mt.numClippingPlanes!==Ke.numPlanes||mt.numIntersection!==Ke.numIntersection)||mt.vertexAlphas!==jt||mt.vertexTangents!==Bt||mt.morphTargets!==Rt||mt.morphNormals!==Sn||mt.morphColors!==Mn||mt.toneMapping!==yn||mt.morphTargetsCount!==Ut)&&(tn=!0):(tn=!0,mt.__version=Ie.version);let Rr=mt.currentProgram;tn===!0&&(Rr=ro(Ie,xe,Me));let li=!1,In=!1,Is=!1;const Vn=Rr.getUniforms(),ta=mt.uniforms;if(Ce.useProgram(Rr.program)&&(li=!0,In=!0,Is=!0),Ie.id!==z&&(z=Ie.id,In=!0),li||V!==K){ne.reverseDepthBuffer?(Se.copy(K.projectionMatrix),upe(Se),dpe(Se),Vn.setValue(Z,"projectionMatrix",Se)):Vn.setValue(Z,"projectionMatrix",K.projectionMatrix),Vn.setValue(Z,"viewMatrix",K.matrixWorldInverse);const Xr=Vn.map.cameraPosition;Xr!==void 0&&Xr.setValue(Z,We.setFromMatrixPosition(K.matrixWorld)),ne.logarithmicDepthBuffer&&Vn.setValue(Z,"logDepthBufFC",2/(Math.log(K.far+1)/Math.LN2)),(Ie.isMeshPhongMaterial||Ie.isMeshToonMaterial||Ie.isMeshLambertMaterial||Ie.isMeshBasicMaterial||Ie.isMeshStandardMaterial||Ie.isShaderMaterial)&&Vn.setValue(Z,"isOrthographic",K.isOrthographicCamera===!0),V!==K&&(V=K,In=!0,Is=!0)}if(Me.isSkinnedMesh){Vn.setOptional(Z,Me,"bindMatrix"),Vn.setOptional(Z,Me,"bindMatrixInverse");const Xr=Me.skeleton;Xr&&(Xr.boneTexture===null&&Xr.computeBoneTexture(),Vn.setValue(Z,"boneTexture",Xr.boneTexture,Q))}Me.isBatchedMesh&&(Vn.setOptional(Z,Me,"batchingTexture"),Vn.setValue(Z,"batchingTexture",Me._matricesTexture,Q),Vn.setOptional(Z,Me,"batchingIdTexture"),Vn.setValue(Z,"batchingIdTexture",Me._indirectTexture,Q),Vn.setOptional(Z,Me,"batchingColorTexture"),Me._colorsTexture!==null&&Vn.setValue(Z,"batchingColorTexture",Me._colorsTexture,Q));const Yo=Te.morphAttributes;if((Yo.position!==void 0||Yo.normal!==void 0||Yo.color!==void 0)&&Mt.update(Me,Te,Rr),(In||mt.receiveShadow!==Me.receiveShadow)&&(mt.receiveShadow=Me.receiveShadow,Vn.setValue(Z,"receiveShadow",Me.receiveShadow)),Ie.isMeshGouraudMaterial&&Ie.envMap!==null&&(ta.envMap.value=Et,ta.flipEnvMap.value=Et.isCubeTexture&&Et.isRenderTargetTexture===!1?-1:1),Ie.isMeshStandardMaterial&&Ie.envMap===null&&xe.environment!==null&&(ta.envMapIntensity.value=xe.environmentIntensity),In&&(Vn.setValue(Z,"toneMappingExposure",T.toneMappingExposure),mt.needsLights&&cu(ta,Is),it&&Ie.fog===!0&&rt.refreshFogUniforms(ta,it),rt.refreshMaterialUniforms(ta,Ie,he,ae,w.state.transmissionRenderTarget[K.id]),K_.upload(Z,ou(mt),ta,Q)),Ie.isShaderMaterial&&Ie.uniformsNeedUpdate===!0&&(K_.upload(Z,ou(mt),ta,Q),Ie.uniformsNeedUpdate=!1),Ie.isSpriteMaterial&&Vn.setValue(Z,"center",Me.center),Vn.setValue(Z,"modelViewMatrix",Me.modelViewMatrix),Vn.setValue(Z,"normalMatrix",Me.normalMatrix),Vn.setValue(Z,"modelMatrix",Me.matrixWorld),Ie.isShaderMaterial||Ie.isRawShaderMaterial){const Xr=Ie.uniformsGroups;for(let ci=0,Ud=Xr.length;ci0&&Q.useMultisampledRTT(K)===!1?Me=Ze.get(K).__webglMultisampledFramebuffer:Array.isArray(Bt)?Me=Bt[Te]:Me=Bt,k.copy(K.viewport),j.copy(K.scissor),X=K.scissorTest}else k.copy(Y).multiplyScalar(he).floor(),j.copy(H).multiplyScalar(he).floor(),X=G;if(Ce.bindFramebuffer(Z.FRAMEBUFFER,Me)&&Ie&&Ce.drawBuffers(K,Me),Ce.viewport(k),Ce.scissor(j),Ce.setScissorTest(X),it){const Et=Ze.get(K.texture);Z.framebufferTexture2D(Z.FRAMEBUFFER,Z.COLOR_ATTACHMENT0,Z.TEXTURE_CUBE_MAP_POSITIVE_X+xe,Et.__webglTexture,Te)}else if(yt){const Et=Ze.get(K.texture),jt=xe||0;Z.framebufferTextureLayer(Z.FRAMEBUFFER,Z.COLOR_ATTACHMENT0,Et.__webglTexture,Te||0,jt)}z=-1},this.readRenderTargetPixels=function(K,xe,Te,Ie,Me,it,yt){if(!(K&&K.isWebGLRenderTarget)){console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");return}let lt=Ze.get(K).__webglFramebuffer;if(K.isWebGLCubeRenderTarget&&yt!==void 0&&(lt=lt[yt]),lt){Ce.bindFramebuffer(Z.FRAMEBUFFER,lt);try{const Et=K.texture,jt=Et.format,Bt=Et.type;if(!ne.textureFormatReadable(jt)){console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");return}if(!ne.textureTypeReadable(Bt)){console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");return}xe>=0&&xe<=K.width-Ie&&Te>=0&&Te<=K.height-Me&&Z.readPixels(xe,Te,Ie,Me,fe.convert(jt),fe.convert(Bt),it)}finally{const Et=D!==null?Ze.get(D).__webglFramebuffer:null;Ce.bindFramebuffer(Z.FRAMEBUFFER,Et)}}},this.readRenderTargetPixelsAsync=async function(K,xe,Te,Ie,Me,it,yt){if(!(K&&K.isWebGLRenderTarget))throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let lt=Ze.get(K).__webglFramebuffer;if(K.isWebGLCubeRenderTarget&&yt!==void 0&&(lt=lt[yt]),lt){const Et=K.texture,jt=Et.format,Bt=Et.type;if(!ne.textureFormatReadable(jt))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!ne.textureTypeReadable(Bt))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");if(xe>=0&&xe<=K.width-Ie&&Te>=0&&Te<=K.height-Me){Ce.bindFramebuffer(Z.FRAMEBUFFER,lt);const Rt=Z.createBuffer();Z.bindBuffer(Z.PIXEL_PACK_BUFFER,Rt),Z.bufferData(Z.PIXEL_PACK_BUFFER,it.byteLength,Z.STREAM_READ),Z.readPixels(xe,Te,Ie,Me,fe.convert(jt),fe.convert(Bt),0);const Sn=D!==null?Ze.get(D).__webglFramebuffer:null;Ce.bindFramebuffer(Z.FRAMEBUFFER,Sn);const Mn=Z.fenceSync(Z.SYNC_GPU_COMMANDS_COMPLETE,0);return Z.flush(),await cpe(Z,Mn,4),Z.bindBuffer(Z.PIXEL_PACK_BUFFER,Rt),Z.getBufferSubData(Z.PIXEL_PACK_BUFFER,0,it),Z.deleteBuffer(Rt),Z.deleteSync(Mn),it}else throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.")}},this.copyFramebufferToTexture=function(K,xe=null,Te=0){K.isTexture!==!0&&(q_("WebGLRenderer: copyFramebufferToTexture function signature has changed."),xe=arguments[0]||null,K=arguments[1]);const Ie=Math.pow(2,-Te),Me=Math.floor(K.image.width*Ie),it=Math.floor(K.image.height*Ie),yt=xe!==null?xe.x:0,lt=xe!==null?xe.y:0;Q.setTexture2D(K,0),Z.copyTexSubImage2D(Z.TEXTURE_2D,Te,0,0,yt,lt,Me,it),Ce.unbindTexture()},this.copyTextureToTexture=function(K,xe,Te=null,Ie=null,Me=0){K.isTexture!==!0&&(q_("WebGLRenderer: copyTextureToTexture function signature has changed."),Ie=arguments[0]||null,K=arguments[1],xe=arguments[2],Me=arguments[3]||0,Te=null);let it,yt,lt,Et,jt,Bt;Te!==null?(it=Te.max.x-Te.min.x,yt=Te.max.y-Te.min.y,lt=Te.min.x,Et=Te.min.y):(it=K.image.width,yt=K.image.height,lt=0,Et=0),Ie!==null?(jt=Ie.x,Bt=Ie.y):(jt=0,Bt=0);const Rt=fe.convert(xe.format),Sn=fe.convert(xe.type);Q.setTexture2D(xe,0),Z.pixelStorei(Z.UNPACK_FLIP_Y_WEBGL,xe.flipY),Z.pixelStorei(Z.UNPACK_PREMULTIPLY_ALPHA_WEBGL,xe.premultiplyAlpha),Z.pixelStorei(Z.UNPACK_ALIGNMENT,xe.unpackAlignment);const Mn=Z.getParameter(Z.UNPACK_ROW_LENGTH),yn=Z.getParameter(Z.UNPACK_IMAGE_HEIGHT),Kt=Z.getParameter(Z.UNPACK_SKIP_PIXELS),Ut=Z.getParameter(Z.UNPACK_SKIP_ROWS),mt=Z.getParameter(Z.UNPACK_SKIP_IMAGES),xn=K.isCompressedTexture?K.mipmaps[Me]:K.image;Z.pixelStorei(Z.UNPACK_ROW_LENGTH,xn.width),Z.pixelStorei(Z.UNPACK_IMAGE_HEIGHT,xn.height),Z.pixelStorei(Z.UNPACK_SKIP_PIXELS,lt),Z.pixelStorei(Z.UNPACK_SKIP_ROWS,Et),K.isDataTexture?Z.texSubImage2D(Z.TEXTURE_2D,Me,jt,Bt,it,yt,Rt,Sn,xn.data):K.isCompressedTexture?Z.compressedTexSubImage2D(Z.TEXTURE_2D,Me,jt,Bt,xn.width,xn.height,Rt,xn.data):Z.texSubImage2D(Z.TEXTURE_2D,Me,jt,Bt,it,yt,Rt,Sn,xn),Z.pixelStorei(Z.UNPACK_ROW_LENGTH,Mn),Z.pixelStorei(Z.UNPACK_IMAGE_HEIGHT,yn),Z.pixelStorei(Z.UNPACK_SKIP_PIXELS,Kt),Z.pixelStorei(Z.UNPACK_SKIP_ROWS,Ut),Z.pixelStorei(Z.UNPACK_SKIP_IMAGES,mt),Me===0&&xe.generateMipmaps&&Z.generateMipmap(Z.TEXTURE_2D),Ce.unbindTexture()},this.copyTextureToTexture3D=function(K,xe,Te=null,Ie=null,Me=0){K.isTexture!==!0&&(q_("WebGLRenderer: copyTextureToTexture3D function signature has changed."),Te=arguments[0]||null,Ie=arguments[1]||null,K=arguments[2],xe=arguments[3],Me=arguments[4]||0);let it,yt,lt,Et,jt,Bt,Rt,Sn,Mn;const yn=K.isCompressedTexture?K.mipmaps[Me]:K.image;Te!==null?(it=Te.max.x-Te.min.x,yt=Te.max.y-Te.min.y,lt=Te.max.z-Te.min.z,Et=Te.min.x,jt=Te.min.y,Bt=Te.min.z):(it=yn.width,yt=yn.height,lt=yn.depth,Et=0,jt=0,Bt=0),Ie!==null?(Rt=Ie.x,Sn=Ie.y,Mn=Ie.z):(Rt=0,Sn=0,Mn=0);const Kt=fe.convert(xe.format),Ut=fe.convert(xe.type);let mt;if(xe.isData3DTexture)Q.setTexture3D(xe,0),mt=Z.TEXTURE_3D;else if(xe.isDataArrayTexture||xe.isCompressedArrayTexture)Q.setTexture2DArray(xe,0),mt=Z.TEXTURE_2D_ARRAY;else{console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.");return}Z.pixelStorei(Z.UNPACK_FLIP_Y_WEBGL,xe.flipY),Z.pixelStorei(Z.UNPACK_PREMULTIPLY_ALPHA_WEBGL,xe.premultiplyAlpha),Z.pixelStorei(Z.UNPACK_ALIGNMENT,xe.unpackAlignment);const xn=Z.getParameter(Z.UNPACK_ROW_LENGTH),tn=Z.getParameter(Z.UNPACK_IMAGE_HEIGHT),Rr=Z.getParameter(Z.UNPACK_SKIP_PIXELS),li=Z.getParameter(Z.UNPACK_SKIP_ROWS),In=Z.getParameter(Z.UNPACK_SKIP_IMAGES);Z.pixelStorei(Z.UNPACK_ROW_LENGTH,yn.width),Z.pixelStorei(Z.UNPACK_IMAGE_HEIGHT,yn.height),Z.pixelStorei(Z.UNPACK_SKIP_PIXELS,Et),Z.pixelStorei(Z.UNPACK_SKIP_ROWS,jt),Z.pixelStorei(Z.UNPACK_SKIP_IMAGES,Bt),K.isDataTexture||K.isData3DTexture?Z.texSubImage3D(mt,Me,Rt,Sn,Mn,it,yt,lt,Kt,Ut,yn.data):xe.isCompressedArrayTexture?Z.compressedTexSubImage3D(mt,Me,Rt,Sn,Mn,it,yt,lt,Kt,yn.data):Z.texSubImage3D(mt,Me,Rt,Sn,Mn,it,yt,lt,Kt,Ut,yn),Z.pixelStorei(Z.UNPACK_ROW_LENGTH,xn),Z.pixelStorei(Z.UNPACK_IMAGE_HEIGHT,tn),Z.pixelStorei(Z.UNPACK_SKIP_PIXELS,Rr),Z.pixelStorei(Z.UNPACK_SKIP_ROWS,li),Z.pixelStorei(Z.UNPACK_SKIP_IMAGES,In),Me===0&&xe.generateMipmaps&&Z.generateMipmap(mt),Ce.unbindTexture()},this.initRenderTarget=function(K){Ze.get(K).__webglFramebuffer===void 0&&Q.setupRenderTarget(K)},this.initTexture=function(K){K.isCubeTexture?Q.setTextureCube(K,0):K.isData3DTexture?Q.setTexture3D(K,0):K.isDataArrayTexture||K.isCompressedArrayTexture?Q.setTexture2DArray(K,0):Q.setTexture2D(K,0),Ce.unbindTexture()},this.resetState=function(){O=0,N=0,D=null,Ce.reset(),qe.reset()},typeof __THREE_DEVTOOLS__<"u"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}get coordinateSystem(){return Ml}get outputColorSpace(){return this._outputColorSpace}set outputColorSpace(e){this._outputColorSpace=e;const n=this.getContext();n.drawingBufferColorSpace=e===ZS?"display-p3":"srgb",n.unpackColorSpace=Nn.workingColorSpace===dx?"display-p3":"srgb"}}class eM{constructor(e,n=25e-5){this.isFogExp2=!0,this.name="",this.color=new ct(e),this.density=n}clone(){return new eM(this.color,this.density)}toJSON(){return{type:"FogExp2",name:this.name,color:this.color.getHex(),density:this.density}}}class tM{constructor(e,n=1,r=1e3){this.isFog=!0,this.name="",this.color=new ct(e),this.near=n,this.far=r}clone(){return new tM(this.color,this.near,this.far)}toJSON(){return{type:"Fog",name:this.name,color:this.color.getHex(),near:this.near,far:this.far}}}class IR extends mn{constructor(){super(),this.isScene=!0,this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.backgroundBlurriness=0,this.backgroundIntensity=1,this.backgroundRotation=new ls,this.environmentIntensity=1,this.environmentRotation=new ls,this.overrideMaterial=null,typeof __THREE_DEVTOOLS__<"u"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(e,n){return super.copy(e,n),e.background!==null&&(this.background=e.background.clone()),e.environment!==null&&(this.environment=e.environment.clone()),e.fog!==null&&(this.fog=e.fog.clone()),this.backgroundBlurriness=e.backgroundBlurriness,this.backgroundIntensity=e.backgroundIntensity,this.backgroundRotation.copy(e.backgroundRotation),this.environmentIntensity=e.environmentIntensity,this.environmentRotation.copy(e.environmentRotation),e.overrideMaterial!==null&&(this.overrideMaterial=e.overrideMaterial.clone()),this.matrixAutoUpdate=e.matrixAutoUpdate,this}toJSON(e){const n=super.toJSON(e);return this.fog!==null&&(n.object.fog=this.fog.toJSON()),this.backgroundBlurriness>0&&(n.object.backgroundBlurriness=this.backgroundBlurriness),this.backgroundIntensity!==1&&(n.object.backgroundIntensity=this.backgroundIntensity),n.object.backgroundRotation=this.backgroundRotation.toArray(),this.environmentIntensity!==1&&(n.object.environmentIntensity=this.environmentIntensity),n.object.environmentRotation=this.environmentRotation.toArray(),n}}class np{constructor(e,n){this.isInterleavedBuffer=!0,this.array=e,this.stride=n,this.count=e!==void 0?e.length/n:0,this.usage=Iy,this.updateRanges=[],this.version=0,this.uuid=wa()}onUploadCallback(){}set needsUpdate(e){e===!0&&this.version++}setUsage(e){return this.usage=e,this}addUpdateRange(e,n){this.updateRanges.push({start:e,count:n})}clearUpdateRanges(){this.updateRanges.length=0}copy(e){return this.array=new e.array.constructor(e.array),this.count=e.count,this.stride=e.stride,this.usage=e.usage,this}copyAt(e,n,r){e*=this.stride,r*=n.stride;for(let i=0,s=this.stride;ie.far||n.push({distance:l,point:w0.clone(),uv:Ks.getInterpolation(w0,a_,M0,o_,CD,SA,RD,new He),face:null,object:this})}copy(e,n){return super.copy(e,n),e.center!==void 0&&this.center.copy(e.center),this.material=e.material,this}}function l_(t,e,n,r,i,s){Cm.subVectors(t,n).addScalar(.5).multiply(r),i!==void 0?(S0.x=s*Cm.x-i*Cm.y,S0.y=i*Cm.x+s*Cm.y):S0.copy(Cm),t.copy(e),t.x+=S0.x,t.y+=S0.y,t.applyMatrix4(A6)}const c_=new q,ND=new q;class P6 extends mn{constructor(){super(),this._currentLevel=0,this.type="LOD",Object.defineProperties(this,{levels:{enumerable:!0,value:[]},isLOD:{value:!0}}),this.autoUpdate=!0}copy(e){super.copy(e,!1);const n=e.levels;for(let r=0,i=n.length;r0){let r,i;for(r=1,i=n.length;r0){c_.setFromMatrixPosition(this.matrixWorld);const i=e.ray.origin.distanceTo(c_);this.getObjectForDistance(i).raycast(e,n)}}update(e){const n=this.levels;if(n.length>1){c_.setFromMatrixPosition(e.matrixWorld),ND.setFromMatrixPosition(this.matrixWorld);const r=c_.distanceTo(ND)/e.zoom;n[0].object.visible=!0;let i,s;for(i=1,s=n.length;i=a)n[i-1].object.visible=!1,n[i].object.visible=!0;else break}for(this._currentLevel=i-1;i=i.length&&i.push({start:-1,count:-1,z:-1,index:-1});const a=i[this.index];s.push(a),this.index++,a.start=e.start,a.count=e.count,a.z=n,a.index=r}reset(){this.list.length=0,this.index=0}}const Zu=new Ct,AA=new Ct,Nye=new Ct,Iye=new ct(1,1,1),zD=new Ct,TA=new px,f_=new os,Lf=new Hi,T0=new q,BD=new q,kye=new q,PA=new Rye,ts=new xr,h_=[];function Oye(t,e,n=0){const r=e.itemSize;if(t.isInterleavedBufferAttribute||t.array.constructor!==e.array.constructor){const i=t.count;for(let s=0;s65535?new Uint32Array(i):new Uint16Array(i);n.setIndex(new Qt(s,1))}this._geometryInitialized=!0}}_validateGeometry(e){const n=this.geometry;if(!!e.getIndex()!=!!n.getIndex())throw new Error('BatchedMesh: All geometries must consistently have "index".');for(const r in n.attributes){if(!e.hasAttribute(r))throw new Error(`BatchedMesh: Added geometry missing "${r}". All geometries must have consistent attributes.`);const i=e.getAttribute(r),s=n.getAttribute(r);if(i.itemSize!==s.itemSize||i.normalized!==s.normalized)throw new Error("BatchedMesh: All attributes must have a consistent itemSize and normalized value.")}}setCustomSort(e){return this.customSort=e,this}computeBoundingBox(){this.boundingBox===null&&(this.boundingBox=new os);const e=this.boundingBox,n=this._drawInfo;e.makeEmpty();for(let r=0,i=n.length;r=this.maxInstanceCount&&this._availableInstanceIds.length===0)throw new Error("BatchedMesh: Maximum item count reached.");const r={visible:!0,active:!0,geometryIndex:e};let i=null;this._availableInstanceIds.length>0?(i=this._availableInstanceIds.pop(),this._drawInfo[i]=r):(i=this._drawInfo.length,this._drawInfo.push(r));const s=this._matricesTexture,a=s.image.data;Nye.toArray(a,i*16),s.needsUpdate=!0;const o=this._colorsTexture;return o&&(Iye.toArray(o.image.data,i*4),o.needsUpdate=!0),i}addGeometry(e,n=-1,r=-1){if(this._initializeGeometry(e),this._validateGeometry(e),this._drawInfo.length>=this._maxInstanceCount)throw new Error("BatchedMesh: Maximum item count reached.");const i={vertexStart:-1,vertexCount:-1,indexStart:-1,indexCount:-1};let s=null;const a=this._reservedRanges,o=this._drawRanges,l=this._bounds;this._geometryCount!==0&&(s=a[a.length-1]),n===-1?i.vertexCount=e.getAttribute("position").count:i.vertexCount=n,s===null?i.vertexStart=0:i.vertexStart=s.vertexStart+s.vertexCount;const c=e.getIndex(),d=c!==null;if(d&&(r===-1?i.indexCount=c.count:i.indexCount=r,s===null?i.indexStart=0:i.indexStart=s.indexStart+s.indexCount),i.indexStart!==-1&&i.indexStart+i.indexCount>this._maxIndexCount||i.vertexStart+i.vertexCount>this._maxVertexCount)throw new Error("BatchedMesh: Reserved space request exceeds the maximum buffer size.");const f=this._geometryCount;return this._geometryCount++,a.push(i),o.push({start:d?i.indexStart:i.vertexStart,count:-1}),l.push({boxInitialized:!1,box:new os,sphereInitialized:!1,sphere:new Hi}),this.setGeometryAt(f,e),f}setGeometryAt(e,n){if(e>=this._geometryCount)throw new Error("BatchedMesh: Maximum geometry count reached.");this._validateGeometry(n);const r=this.geometry,i=r.getIndex()!==null,s=r.getIndex(),a=n.getIndex(),o=this._reservedRanges[e];if(i&&a.count>o.indexCount||n.attributes.position.count>o.vertexCount)throw new Error("BatchedMesh: Reserved space not large enough for provided geometry.");const l=o.vertexStart,c=o.vertexCount;for(const y in r.attributes){const b=n.getAttribute(y),S=r.getAttribute(y);Oye(b,S,l);const w=b.itemSize;for(let x=b.count,M=c;x=n.length||n[e].active===!1?this:(n[e].active=!1,this._availableInstanceIds.push(e),this._visibilityChanged=!0,this)}getBoundingBoxAt(e,n){if(e>=this._geometryCount)return null;const r=this._bounds[e],i=r.box,s=this.geometry;if(r.boxInitialized===!1){i.makeEmpty();const a=s.index,o=s.attributes.position,l=this._drawRanges[e];for(let c=l.start,d=l.start+l.count;c=this._geometryCount)return null;const r=this._bounds[e],i=r.sphere,s=this.geometry;if(r.sphereInitialized===!1){i.makeEmpty(),this.getBoundingBoxAt(e,f_),f_.getCenter(i.center);const a=s.index,o=s.attributes.position,l=this._drawRanges[e];let c=0;for(let d=l.start,f=l.start+l.count;d=r.length||r[e].active===!1?this:(n.toArray(s,e*16),i.needsUpdate=!0,this)}getMatrixAt(e,n){const r=this._drawInfo,i=this._matricesTexture.image.data;return e>=r.length||r[e].active===!1?null:n.fromArray(i,e*16)}setColorAt(e,n){this._colorsTexture===null&&this._initColorsTexture();const r=this._colorsTexture,i=this._colorsTexture.image.data,s=this._drawInfo;return e>=s.length||s[e].active===!1?this:(n.toArray(i,e*4),r.needsUpdate=!0,this)}getColorAt(e,n){const r=this._colorsTexture.image.data,i=this._drawInfo;return e>=i.length||i[e].active===!1?null:n.fromArray(r,e*4)}setVisibleAt(e,n){const r=this._drawInfo;return e>=r.length||r[e].active===!1||r[e].visible===n?this:(r[e].visible=n,this._visibilityChanged=!0,this)}getVisibleAt(e){const n=this._drawInfo;return e>=n.length||n[e].active===!1?!1:n[e].visible}setGeometryIdAt(e,n){const r=this._drawInfo;return e>=r.length||r[e].active===!1||n<0||n>=this._geometryCount?null:(r[e].geometryIndex=n,this)}getGeometryIdAt(e){const n=this._drawInfo;return e>=n.length||n[e].active===!1?-1:n[e].geometryIndex}getGeometryRangeAt(e,n={}){if(e<0||e>=this._geometryCount)return null;const r=this._drawRanges[e];return n.start=r.start,n.count=r.count,n}raycast(e,n){const r=this._drawInfo,i=this._drawRanges,s=this.matrixWorld,a=this.geometry;ts.material=this.material,ts.geometry.index=a.index,ts.geometry.attributes=a.attributes,ts.geometry.boundingBox===null&&(ts.geometry.boundingBox=new os),ts.geometry.boundingSphere===null&&(ts.geometry.boundingSphere=new Hi);for(let o=0,l=r.length;o({...n})),this._reservedRanges=e._reservedRanges.map(n=>({...n})),this._drawInfo=e._drawInfo.map(n=>({...n})),this._bounds=e._bounds.map(n=>({boxInitialized:n.boxInitialized,box:n.box.clone(),sphereInitialized:n.sphereInitialized,sphere:n.sphere.clone()})),this._maxInstanceCount=e._maxInstanceCount,this._maxVertexCount=e._maxVertexCount,this._maxIndexCount=e._maxIndexCount,this._geometryInitialized=e._geometryInitialized,this._geometryCount=e._geometryCount,this._multiDrawCounts=e._multiDrawCounts.slice(),this._multiDrawStarts=e._multiDrawStarts.slice(),this._matricesTexture=e._matricesTexture.clone(),this._matricesTexture.image.data=this._matricesTexture.image.data.slice(),this._colorsTexture!==null&&(this._colorsTexture=e._colorsTexture.clone(),this._colorsTexture.image.data=this._colorsTexture.image.data.slice()),this}dispose(){return this.geometry.dispose(),this._matricesTexture.dispose(),this._matricesTexture=null,this._indirectTexture.dispose(),this._indirectTexture=null,this._colorsTexture!==null&&(this._colorsTexture.dispose(),this._colorsTexture=null),this}onBeforeRender(e,n,r,i,s){if(!this._visibilityChanged&&!this.perObjectFrustumCulled&&!this.sortObjects)return;const a=i.getIndex(),o=a===null?1:a.array.BYTES_PER_ELEMENT,l=this._drawInfo,c=this._multiDrawStarts,d=this._multiDrawCounts,f=this._drawRanges,p=this.perObjectFrustumCulled,y=this._indirectTexture,b=y.image.data;p&&(zD.multiplyMatrices(r.projectionMatrix,r.matrixWorldInverse).multiply(this.matrixWorld),TA.setFromProjectionMatrix(zD,e.coordinateSystem));let S=0;if(this.sortObjects){AA.copy(this.matrixWorld).invert(),T0.setFromMatrixPosition(r.matrixWorld).applyMatrix4(AA),BD.set(0,0,-1).transformDirection(r.matrixWorld).transformDirection(AA);for(let M=0,T=l.length;M0){const i=n[r[0]];if(i!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let s=0,a=i.length;sr)return;CA.applyMatrix4(t.matrixWorld);const l=e.ray.origin.distanceTo(CA);if(!(le.far))return{distance:l,point:VD.clone().applyMatrix4(t.matrixWorld),index:i,face:null,faceIndex:null,barycoord:null,object:t}}const GD=new q,WD=new q;class ea extends Ul{constructor(e,n){super(e,n),this.isLineSegments=!0,this.type="LineSegments"}computeLineDistances(){const e=this.geometry;if(e.index===null){const n=e.attributes.position,r=[];for(let i=0,s=n.count;i0){const i=n[r[0]];if(i!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let s=0,a=i.length;si.far)return;s.push({distance:c,distanceToRay:Math.sqrt(o),point:l,index:e,face:null,faceIndex:null,barycoord:null,object:a})}}class Lye extends fr{constructor(e,n,r,i,s,a,o,l,c){super(e,n,r,i,s,a,o,l,c),this.isVideoTexture=!0,this.minFilter=a!==void 0?a:Cr,this.magFilter=s!==void 0?s:Cr,this.generateMipmaps=!1;const d=this;function f(){d.needsUpdate=!0,e.requestVideoFrameCallback(f)}"requestVideoFrameCallback"in e&&e.requestVideoFrameCallback(f)}clone(){return new this.constructor(this.image).copy(this)}update(){const e=this.image;"requestVideoFrameCallback"in e===!1&&e.readyState>=e.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}}class Dye extends fr{constructor(e,n){super({width:e,height:n}),this.isFramebufferTexture=!0,this.magFilter=ri,this.minFilter=ri,this.generateMipmaps=!1,this.needsUpdate=!0}}class sM extends fr{constructor(e,n,r,i,s,a,o,l,c,d,f,p){super(null,a,o,l,c,d,i,s,f,p),this.isCompressedTexture=!0,this.image={width:n,height:r},this.mipmaps=e,this.flipY=!1,this.generateMipmaps=!1}}class Uye extends sM{constructor(e,n,r,i,s,a){super(e,n,r,s,a),this.isCompressedArrayTexture=!0,this.image.depth=i,this.wrapR=ba,this.layerUpdates=new Set}addLayerUpdate(e){this.layerUpdates.add(e)}clearLayerUpdates(){this.layerUpdates.clear()}}class jye extends sM{constructor(e,n,r){super(void 0,e[0].width,e[0].height,n,r,Zc),this.isCompressedCubeTexture=!0,this.isCubeTexture=!0,this.image=e}}class Fye extends fr{constructor(e,n,r,i,s,a,o,l,c){super(e,n,r,i,s,a,o,l,c),this.isCanvasTexture=!0,this.needsUpdate=!0}}class Xo{constructor(){this.type="Curve",this.arcLengthDivisions=200}getPoint(){return console.warn("THREE.Curve: .getPoint() not implemented."),null}getPointAt(e,n){const r=this.getUtoTmapping(e);return this.getPoint(r,n)}getPoints(e=5){const n=[];for(let r=0;r<=e;r++)n.push(this.getPoint(r/e));return n}getSpacedPoints(e=5){const n=[];for(let r=0;r<=e;r++)n.push(this.getPointAt(r/e));return n}getLength(){const e=this.getLengths();return e[e.length-1]}getLengths(e=this.arcLengthDivisions){if(this.cacheArcLengths&&this.cacheArcLengths.length===e+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;const n=[];let r,i=this.getPoint(0),s=0;n.push(0);for(let a=1;a<=e;a++)r=this.getPoint(a/e),s+=r.distanceTo(i),n.push(s),i=r;return this.cacheArcLengths=n,n}updateArcLengths(){this.needsUpdate=!0,this.getLengths()}getUtoTmapping(e,n){const r=this.getLengths();let i=0;const s=r.length;let a;n?a=n:a=e*r[s-1];let o=0,l=s-1,c;for(;o<=l;)if(i=Math.floor(o+(l-o)/2),c=r[i]-a,c<0)o=i+1;else if(c>0)l=i-1;else{l=i;break}if(i=l,r[i]===a)return i/(s-1);const d=r[i],p=r[i+1]-d,y=(a-d)/p;return(i+y)/(s-1)}getTangent(e,n){let i=e-1e-4,s=e+1e-4;i<0&&(i=0),s>1&&(s=1);const a=this.getPoint(i),o=this.getPoint(s),l=n||(a.isVector2?new He:new q);return l.copy(o).sub(a).normalize(),l}getTangentAt(e,n){const r=this.getUtoTmapping(e);return this.getTangent(r,n)}computeFrenetFrames(e,n){const r=new q,i=[],s=[],a=[],o=new q,l=new Ct;for(let y=0;y<=e;y++){const b=y/e;i[y]=this.getTangentAt(b,new q)}s[0]=new q,a[0]=new q;let c=Number.MAX_VALUE;const d=Math.abs(i[0].x),f=Math.abs(i[0].y),p=Math.abs(i[0].z);d<=c&&(c=d,r.set(1,0,0)),f<=c&&(c=f,r.set(0,1,0)),p<=c&&r.set(0,0,1),o.crossVectors(i[0],r).normalize(),s[0].crossVectors(i[0],o),a[0].crossVectors(i[0],s[0]);for(let y=1;y<=e;y++){if(s[y]=s[y-1].clone(),a[y]=a[y-1].clone(),o.crossVectors(i[y-1],i[y]),o.length()>Number.EPSILON){o.normalize();const b=Math.acos(Tr(i[y-1].dot(i[y]),-1,1));s[y].applyMatrix4(l.makeRotationAxis(o,b))}a[y].crossVectors(i[y],s[y])}if(n===!0){let y=Math.acos(Tr(s[0].dot(s[e]),-1,1));y/=e,i[0].dot(o.crossVectors(s[0],s[e]))>0&&(y=-y);for(let b=1;b<=e;b++)s[b].applyMatrix4(l.makeRotationAxis(i[b],y*b)),a[b].crossVectors(i[b],s[b])}return{tangents:i,normals:s,binormals:a}}clone(){return new this.constructor().copy(this)}copy(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}toJSON(){const e={metadata:{version:4.6,type:"Curve",generator:"Curve.toJSON"}};return e.arcLengthDivisions=this.arcLengthDivisions,e.type=this.type,e}fromJSON(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}}class aM extends Xo{constructor(e=0,n=0,r=1,i=1,s=0,a=Math.PI*2,o=!1,l=0){super(),this.isEllipseCurve=!0,this.type="EllipseCurve",this.aX=e,this.aY=n,this.xRadius=r,this.yRadius=i,this.aStartAngle=s,this.aEndAngle=a,this.aClockwise=o,this.aRotation=l}getPoint(e,n=new He){const r=n,i=Math.PI*2;let s=this.aEndAngle-this.aStartAngle;const a=Math.abs(s)i;)s-=i;s0?0:(Math.floor(Math.abs(o)/s)+1)*s:l===0&&o===s-1&&(o=s-2,l=1);let c,d;this.closed||o>0?c=i[(o-1)%s]:(y_.subVectors(i[0],i[1]).add(i[0]),c=y_);const f=i[o%s],p=i[(o+1)%s];if(this.closed||o+2i.length-2?i.length-1:a+1],f=i[a>i.length-3?i.length-1:a+2];return r.set(qD(o,l.x,c.x,d.x,f.x),qD(o,l.y,c.y,d.y,f.y)),r}copy(e){super.copy(e),this.points=[];for(let n=0,r=e.points.length;n=r){const a=i[s]-r,o=this.curves[s],l=o.getLength(),c=l===0?0:1-a/l;return o.getPointAt(c,n)}s++}return null}getLength(){const e=this.getCurveLengths();return e[e.length-1]}updateArcLengths(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()}getCurveLengths(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;const e=[];let n=0;for(let r=0,i=this.curves.length;r1&&!n[n.length-1].equals(n[0])&&n.push(n[0]),n}copy(e){super.copy(e),this.curves=[];for(let n=0,r=e.curves.length;n0){const f=c.getPoint(0);f.equals(this.currentPoint)||this.lineTo(f.x,f.y)}this.curves.push(c);const d=c.getPoint(1);return this.currentPoint.copy(d),this}copy(e){return super.copy(e),this.currentPoint.copy(e.currentPoint),this}toJSON(){const e=super.toJSON();return e.currentPoint=this.currentPoint.toArray(),e}fromJSON(e){return super.fromJSON(e),this.currentPoint.fromArray(e.currentPoint),this}}class mx extends Yt{constructor(e=[new He(0,-.5),new He(.5,0),new He(0,.5)],n=12,r=0,i=Math.PI*2){super(),this.type="LatheGeometry",this.parameters={points:e,segments:n,phiStart:r,phiLength:i},n=Math.floor(n),i=Tr(i,0,Math.PI*2);const s=[],a=[],o=[],l=[],c=[],d=1/n,f=new q,p=new He,y=new q,b=new q,S=new q;let w=0,x=0;for(let M=0;M<=e.length-1;M++)switch(M){case 0:w=e[M+1].x-e[M].x,x=e[M+1].y-e[M].y,y.x=x*1,y.y=-w,y.z=x*0,S.copy(y),y.normalize(),l.push(y.x,y.y,y.z);break;case e.length-1:l.push(S.x,S.y,S.z);break;default:w=e[M+1].x-e[M].x,x=e[M+1].y-e[M].y,y.x=x*1,y.y=-w,y.z=x*0,b.copy(y),y.x+=S.x,y.y+=S.y,y.z+=S.z,y.normalize(),l.push(y.x,y.y,y.z),S.copy(b)}for(let M=0;M<=n;M++){const T=r+M*d*i,P=Math.sin(T),O=Math.cos(T);for(let N=0;N<=e.length-1;N++){f.x=e[N].x*P,f.y=e[N].y,f.z=e[N].x*O,a.push(f.x,f.y,f.z),p.x=M/n,p.y=N/(e.length-1),o.push(p.x,p.y);const D=l[3*N+0]*P,z=l[3*N+1],V=l[3*N+0]*O;c.push(D,z,V)}}for(let M=0;M0&&T(!0),n>0&&T(!1)),this.setIndex(d),this.setAttribute("position",new Lt(f,3)),this.setAttribute("normal",new Lt(p,3)),this.setAttribute("uv",new Lt(y,2));function M(){const P=new q,O=new q;let N=0;const D=(n-e)/r;for(let z=0;z<=s;z++){const V=[],k=z/s,j=k*(n-e)+e;for(let X=0;X<=i;X++){const ee=X/i,ie=ee*l+o,pe=Math.sin(ie),ae=Math.cos(ie);O.x=j*pe,O.y=-k*r+w,O.z=j*ae,f.push(O.x,O.y,O.z),P.set(pe,D,ae).normalize(),p.push(P.x,P.y,P.z),y.push(ee,1-k),V.push(b++)}S.push(V)}for(let z=0;z0&&(d.push(k,j,ee),N+=3),n>0&&(d.push(j,X,ee),N+=3)}c.addGroup(x,N,0),x+=N}function T(P){const O=b,N=new He,D=new q;let z=0;const V=P===!0?e:n,k=P===!0?1:-1;for(let X=1;X<=i;X++)f.push(0,w*k,0),p.push(0,k,0),y.push(.5,.5),b++;const j=b;for(let X=0;X<=i;X++){const ie=X/i*l+o,pe=Math.cos(ie),ae=Math.sin(ie);D.x=V*ae,D.y=w*k,D.z=V*pe,f.push(D.x,D.y,D.z),p.push(0,k,0),N.x=pe*.5+.5,N.y=ae*.5*k+.5,y.push(N.x,N.y),b++}for(let X=0;X.9&&D<.1&&(T<.2&&(a[M+0]+=1),P<.2&&(a[M+2]+=1),O<.2&&(a[M+4]+=1))}}function p(M){s.push(M.x,M.y,M.z)}function y(M,T){const P=M*3;T.x=e[P+0],T.y=e[P+1],T.z=e[P+2]}function b(){const M=new q,T=new q,P=new q,O=new q,N=new He,D=new He,z=new He;for(let V=0,k=0;V80*n){o=c=t[0],l=d=t[1];for(let b=n;bc&&(c=f),p>d&&(d=p);y=Math.max(c-o,d-l),y=y!==0?32767/y:0}return Dy(s,a,n,o,l,y,0),a}};function D6(t,e,n,r,i){let s,a;if(i===cxe(t,e,n,r)>0)for(s=e;s=e;s-=r)a=KD(s,t[s],t[s+1],a);return a&&dM(a,a.next)&&(jy(a),a=a.next),a}function Gh(t,e){if(!t)return t;e||(e=t);let n=t,r;do if(r=!1,!n.steiner&&(dM(n,n.next)||yr(n.prev,n,n.next)===0)){if(jy(n),n=e=n.prev,n===n.next)break;r=!0}else n=n.next;while(r||n!==e);return e}function Dy(t,e,n,r,i,s,a){if(!t)return;!a&&s&&rxe(t,r,i,s);let o=t,l,c;for(;t.prev!==t.next;){if(l=t.prev,c=t.next,s?Kye(t,r,i,s):qye(t)){e.push(l.i/n|0),e.push(t.i/n|0),e.push(c.i/n|0),jy(t),t=c.next,o=c.next;continue}if(t=c,t===o){a?a===1?(t=Yye(Gh(t),e,n),Dy(t,e,n,r,i,s,2)):a===2&&Zye(t,e,n,r,i,s):Dy(Gh(t),e,n,r,i,s,1);break}}}function qye(t){const e=t.prev,n=t,r=t.next;if(yr(e,n,r)>=0)return!1;const i=e.x,s=n.x,a=r.x,o=e.y,l=n.y,c=r.y,d=is?i>a?i:a:s>a?s:a,y=o>l?o>c?o:c:l>c?l:c;let b=r.next;for(;b!==e;){if(b.x>=d&&b.x<=p&&b.y>=f&&b.y<=y&&qm(i,o,s,l,a,c,b.x,b.y)&&yr(b.prev,b,b.next)>=0)return!1;b=b.next}return!0}function Kye(t,e,n,r){const i=t.prev,s=t,a=t.next;if(yr(i,s,a)>=0)return!1;const o=i.x,l=s.x,c=a.x,d=i.y,f=s.y,p=a.y,y=ol?o>c?o:c:l>c?l:c,w=d>f?d>p?d:p:f>p?f:p,x=QP(y,b,e,n,r),M=QP(S,w,e,n,r);let T=t.prevZ,P=t.nextZ;for(;T&&T.z>=x&&P&&P.z<=M;){if(T.x>=y&&T.x<=S&&T.y>=b&&T.y<=w&&T!==i&&T!==a&&qm(o,d,l,f,c,p,T.x,T.y)&&yr(T.prev,T,T.next)>=0||(T=T.prevZ,P.x>=y&&P.x<=S&&P.y>=b&&P.y<=w&&P!==i&&P!==a&&qm(o,d,l,f,c,p,P.x,P.y)&&yr(P.prev,P,P.next)>=0))return!1;P=P.nextZ}for(;T&&T.z>=x;){if(T.x>=y&&T.x<=S&&T.y>=b&&T.y<=w&&T!==i&&T!==a&&qm(o,d,l,f,c,p,T.x,T.y)&&yr(T.prev,T,T.next)>=0)return!1;T=T.prevZ}for(;P&&P.z<=M;){if(P.x>=y&&P.x<=S&&P.y>=b&&P.y<=w&&P!==i&&P!==a&&qm(o,d,l,f,c,p,P.x,P.y)&&yr(P.prev,P,P.next)>=0)return!1;P=P.nextZ}return!0}function Yye(t,e,n){let r=t;do{const i=r.prev,s=r.next.next;!dM(i,s)&&U6(i,r,r.next,s)&&Uy(i,s)&&Uy(s,i)&&(e.push(i.i/n|0),e.push(r.i/n|0),e.push(s.i/n|0),jy(r),jy(r.next),r=t=s),r=r.next}while(r!==t);return Gh(r)}function Zye(t,e,n,r,i,s){let a=t;do{let o=a.next.next;for(;o!==a.prev;){if(a.i!==o.i&&axe(a,o)){let l=j6(a,o);a=Gh(a,a.next),l=Gh(l,l.next),Dy(a,e,n,r,i,s,0),Dy(l,e,n,r,i,s,0);return}o=o.next}a=a.next}while(a!==t)}function Qye(t,e,n,r){const i=[];let s,a,o,l,c;for(s=0,a=e.length;s=n.next.y&&n.next.y!==n.y){const p=n.x+(a-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(p<=s&&p>r&&(r=p,i=n.x=n.x&&n.x>=l&&s!==n.x&&qm(ai.x||n.x===i.x&&nxe(i,n)))&&(i=n,d=f)),n=n.next;while(n!==o);return i}function nxe(t,e){return yr(t.prev,t,e.prev)<0&&yr(e.next,t,t.next)<0}function rxe(t,e,n,r){let i=t;do i.z===0&&(i.z=QP(i.x,i.y,e,n,r)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next;while(i!==t);i.prevZ.nextZ=null,i.prevZ=null,ixe(i)}function ixe(t){let e,n,r,i,s,a,o,l,c=1;do{for(n=t,t=null,s=null,a=0;n;){for(a++,r=n,o=0,e=0;e0||l>0&&r;)o!==0&&(l===0||!r||n.z<=r.z)?(i=n,n=n.nextZ,o--):(i=r,r=r.nextZ,l--),s?s.nextZ=i:t=i,i.prevZ=s,s=i;n=r}s.nextZ=null,c*=2}while(a>1);return t}function QP(t,e,n,r,i){return t=(t-n)*i|0,e=(e-r)*i|0,t=(t|t<<8)&16711935,t=(t|t<<4)&252645135,t=(t|t<<2)&858993459,t=(t|t<<1)&1431655765,e=(e|e<<8)&16711935,e=(e|e<<4)&252645135,e=(e|e<<2)&858993459,e=(e|e<<1)&1431655765,t|e<<1}function sxe(t){let e=t,n=t;do(e.x=(t-a)*(s-o)&&(t-a)*(r-o)>=(n-a)*(e-o)&&(n-a)*(s-o)>=(i-a)*(r-o)}function axe(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!oxe(t,e)&&(Uy(t,e)&&Uy(e,t)&&lxe(t,e)&&(yr(t.prev,t,e.prev)||yr(t,e.prev,e))||dM(t,e)&&yr(t.prev,t,t.next)>0&&yr(e.prev,e,e.next)>0)}function yr(t,e,n){return(e.y-t.y)*(n.x-e.x)-(e.x-t.x)*(n.y-e.y)}function dM(t,e){return t.x===e.x&&t.y===e.y}function U6(t,e,n,r){const i=S_(yr(t,e,n)),s=S_(yr(t,e,r)),a=S_(yr(n,r,t)),o=S_(yr(n,r,e));return!!(i!==s&&a!==o||i===0&&w_(t,n,e)||s===0&&w_(t,r,e)||a===0&&w_(n,t,r)||o===0&&w_(n,e,r))}function w_(t,e,n){return e.x<=Math.max(t.x,n.x)&&e.x>=Math.min(t.x,n.x)&&e.y<=Math.max(t.y,n.y)&&e.y>=Math.min(t.y,n.y)}function S_(t){return t>0?1:t<0?-1:0}function oxe(t,e){let n=t;do{if(n.i!==t.i&&n.next.i!==t.i&&n.i!==e.i&&n.next.i!==e.i&&U6(n,n.next,t,e))return!0;n=n.next}while(n!==t);return!1}function Uy(t,e){return yr(t.prev,t,t.next)<0?yr(t,e,t.next)>=0&&yr(t,t.prev,e)>=0:yr(t,e,t.prev)<0||yr(t,t.next,e)<0}function lxe(t,e){let n=t,r=!1;const i=(t.x+e.x)/2,s=(t.y+e.y)/2;do n.y>s!=n.next.y>s&&n.next.y!==n.y&&i<(n.next.x-n.x)*(s-n.y)/(n.next.y-n.y)+n.x&&(r=!r),n=n.next;while(n!==t);return r}function j6(t,e){const n=new JP(t.i,t.x,t.y),r=new JP(e.i,e.x,e.y),i=t.next,s=e.prev;return t.next=e,e.prev=t,n.next=i,i.prev=n,r.next=n,n.prev=r,s.next=r,r.prev=s,r}function KD(t,e,n,r){const i=new JP(t,e,n);return r?(i.next=r.next,i.prev=r,r.next.prev=i,r.next=i):(i.prev=i,i.next=i),i}function jy(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function JP(t,e,n){this.i=t,this.x=e,this.y=n,this.prev=null,this.next=null,this.z=0,this.prevZ=null,this.nextZ=null,this.steiner=!1}function cxe(t,e,n,r){let i=0;for(let s=e,a=n-r;s2&&t[e-1].equals(t[0])&&t.pop()}function ZD(t,e){for(let n=0;nNumber.EPSILON){const ze=Math.sqrt(be),Fe=Math.sqrt(Q*Q+W*W),bt=Z.x-Ze/ze,rt=Z.y+Xe/ze,ht=Ve.x-W/Fe,Xt=Ve.y+Q/Fe,Ke=((ht-bt)*W-(Xt-rt)*Q)/(Xe*W-Ze*Q);Le=bt+Xe*Ke-de.x,ne=rt+Ze*Ke-de.y;const te=Le*Le+ne*ne;if(te<=2)return new He(Le,ne);Ce=Math.sqrt(te/2)}else{let ze=!1;Xe>Number.EPSILON?Q>Number.EPSILON&&(ze=!0):Xe<-Number.EPSILON?Q<-Number.EPSILON&&(ze=!0):Math.sign(Ze)===Math.sign(W)&&(ze=!0),ze?(Le=-Ze,ne=Xe,Ce=Math.sqrt(be)):(Le=Xe,ne=Ze,Ce=Math.sqrt(be/2))}return new He(Le/Ce,ne/Ce)}const J=[];for(let de=0,Z=ie.length,Ve=Z-1,Le=de+1;de=0;de--){const Z=de/w,Ve=y*Math.cos(Z*Math.PI/2),Le=b*Math.sin(Z*Math.PI/2)+S;for(let ne=0,Ce=ie.length;ne=0;){const Le=Ve;let ne=Ve-1;ne<0&&(ne=de.length-1);for(let Ce=0,Xe=d+w*2;Ce0)&&y.push(T,P,N),(x!==r-1||l0!=e>0&&this.version++,this._anisotropy=e}get clearcoat(){return this._clearcoat}set clearcoat(e){this._clearcoat>0!=e>0&&this.version++,this._clearcoat=e}get iridescence(){return this._iridescence}set iridescence(e){this._iridescence>0!=e>0&&this.version++,this._iridescence=e}get dispersion(){return this._dispersion}set dispersion(e){this._dispersion>0!=e>0&&this.version++,this._dispersion=e}get sheen(){return this._sheen}set sheen(e){this._sheen>0!=e>0&&this.version++,this._sheen=e}get transmission(){return this._transmission}set transmission(e){this._transmission>0!=e>0&&this.version++,this._transmission=e}copy(e){return super.copy(e),this.defines={STANDARD:"",PHYSICAL:""},this.anisotropy=e.anisotropy,this.anisotropyRotation=e.anisotropyRotation,this.anisotropyMap=e.anisotropyMap,this.clearcoat=e.clearcoat,this.clearcoatMap=e.clearcoatMap,this.clearcoatRoughness=e.clearcoatRoughness,this.clearcoatRoughnessMap=e.clearcoatRoughnessMap,this.clearcoatNormalMap=e.clearcoatNormalMap,this.clearcoatNormalScale.copy(e.clearcoatNormalScale),this.dispersion=e.dispersion,this.ior=e.ior,this.iridescence=e.iridescence,this.iridescenceMap=e.iridescenceMap,this.iridescenceIOR=e.iridescenceIOR,this.iridescenceThicknessRange=[...e.iridescenceThicknessRange],this.iridescenceThicknessMap=e.iridescenceThicknessMap,this.sheen=e.sheen,this.sheenColor.copy(e.sheenColor),this.sheenColorMap=e.sheenColorMap,this.sheenRoughness=e.sheenRoughness,this.sheenRoughnessMap=e.sheenRoughnessMap,this.transmission=e.transmission,this.transmissionMap=e.transmissionMap,this.thickness=e.thickness,this.thicknessMap=e.thicknessMap,this.attenuationDistance=e.attenuationDistance,this.attenuationColor.copy(e.attenuationColor),this.specularIntensity=e.specularIntensity,this.specularIntensityMap=e.specularIntensityMap,this.specularColor.copy(e.specularColor),this.specularColorMap=e.specularColorMap,this}}class H6 extends Gr{constructor(e){super(),this.isMeshPhongMaterial=!0,this.type="MeshPhongMaterial",this.color=new ct(16777215),this.specular=new ct(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new ct(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=au,this.normalScale=new He(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new ls,this.combine=cx,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.specular.copy(e.specular),this.shininess=e.shininess,this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapRotation.copy(e.envMapRotation),this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.flatShading=e.flatShading,this.fog=e.fog,this}}class V6 extends Gr{constructor(e){super(),this.isMeshToonMaterial=!0,this.defines={TOON:""},this.type="MeshToonMaterial",this.color=new ct(16777215),this.map=null,this.gradientMap=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new ct(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=au,this.normalScale=new He(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.gradientMap=e.gradientMap,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.alphaMap=e.alphaMap,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.fog=e.fog,this}}class G6 extends Gr{constructor(e){super(),this.isMeshNormalMaterial=!0,this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=au,this.normalScale=new He(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.flatShading=!1,this.setValues(e)}copy(e){return super.copy(e),this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.flatShading=e.flatShading,this}}class W6 extends Gr{constructor(e){super(),this.isMeshLambertMaterial=!0,this.type="MeshLambertMaterial",this.color=new ct(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new ct(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=au,this.normalScale=new He(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new ls,this.combine=cx,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapRotation.copy(e.envMapRotation),this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.flatShading=e.flatShading,this.fog=e.fog,this}}class $6 extends Gr{constructor(e){super(),this.isMeshMatcapMaterial=!0,this.defines={MATCAP:""},this.type="MeshMatcapMaterial",this.color=new ct(16777215),this.matcap=null,this.map=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=au,this.normalScale=new He(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.flatShading=!1,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.defines={MATCAP:""},this.color.copy(e.color),this.matcap=e.matcap,this.map=e.map,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.alphaMap=e.alphaMap,this.flatShading=e.flatShading,this.fog=e.fog,this}}class X6 extends $r{constructor(e){super(),this.isLineDashedMaterial=!0,this.type="LineDashedMaterial",this.scale=1,this.dashSize=3,this.gapSize=1,this.setValues(e)}copy(e){return super.copy(e),this.scale=e.scale,this.dashSize=e.dashSize,this.gapSize=e.gapSize,this}}function dh(t,e,n){return!t||!n&&t.constructor===e?t:typeof e.BYTES_PER_ELEMENT=="number"?new e(t):Array.prototype.slice.call(t)}function q6(t){return ArrayBuffer.isView(t)&&!(t instanceof DataView)}function K6(t){function e(i,s){return t[i]-t[s]}const n=t.length,r=new Array(n);for(let i=0;i!==n;++i)r[i]=i;return r.sort(e),r}function eC(t,e,n){const r=t.length,i=new t.constructor(r);for(let s=0,a=0;a!==r;++s){const o=n[s]*e;for(let l=0;l!==e;++l)i[a++]=t[o+l]}return i}function VR(t,e,n,r){let i=1,s=t[0];for(;s!==void 0&&s[r]===void 0;)s=t[i++];if(s===void 0)return;let a=s[r];if(a!==void 0)if(Array.isArray(a))do a=s[r],a!==void 0&&(e.push(s.time),n.push.apply(n,a)),s=t[i++];while(s!==void 0);else if(a.toArray!==void 0)do a=s[r],a!==void 0&&(e.push(s.time),a.toArray(n,n.length)),s=t[i++];while(s!==void 0);else do a=s[r],a!==void 0&&(e.push(s.time),n.push(a)),s=t[i++];while(s!==void 0)}function hxe(t,e,n,r,i=30){const s=t.clone();s.name=e;const a=[];for(let l=0;l=r)){f.push(c.times[y]);for(let S=0;Ss.tracks[l].times[0]&&(o=s.tracks[l].times[0]);for(let l=0;l=o.times[b]){const x=b*f+d,M=x+f-d;S=o.values.slice(x,M)}else{const x=o.createInterpolant(),M=d,T=f-d;x.evaluate(s),S=x.resultBuffer.slice(M,T)}l==="quaternion"&&new qt().fromArray(S).normalize().conjugate().toArray(S);const w=c.times.length;for(let x=0;x=s)){const o=n[1];e=s)break t}a=r,r=0;break n}break e}for(;r>>1;en;)--a;if(++a,s!==0||a!==i){s>=a&&(a=Math.max(a,1),s=a-1);const o=this.getValueSize();this.times=r.slice(s,a),this.values=this.values.slice(s*o,a*o)}return this}validate(){let e=!0;const n=this.getValueSize();n-Math.floor(n)!==0&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),e=!1);const r=this.times,i=this.values,s=r.length;s===0&&(console.error("THREE.KeyframeTrack: Track is empty.",this),e=!1);let a=null;for(let o=0;o!==s;o++){const l=r[o];if(typeof l=="number"&&isNaN(l)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,o,l),e=!1;break}if(a!==null&&a>l){console.error("THREE.KeyframeTrack: Out of order keys.",this,o,l,a),e=!1;break}a=l}if(i!==void 0&&q6(i))for(let o=0,l=i.length;o!==l;++o){const c=i[o];if(isNaN(c)){console.error("THREE.KeyframeTrack: Value is not a valid number.",this,o,c),e=!1;break}}return e}optimize(){const e=this.times.slice(),n=this.values.slice(),r=this.getValueSize(),i=this.getInterpolation()===X_,s=e.length-1;let a=1;for(let o=1;o0){e[a]=e[s];for(let o=s*r,l=a*r,c=0;c!==r;++c)n[l+c]=n[o+c];++a}return a!==e.length?(this.times=e.slice(0,a),this.values=n.slice(0,a*r)):(this.times=e,this.values=n),this}clone(){const e=this.times.slice(),n=this.values.slice(),r=this.constructor,i=new r(this.name,e,n);return i.createInterpolant=this.createInterpolant,i}}qo.prototype.TimeBufferType=Float32Array;qo.prototype.ValueBufferType=Float32Array;qo.prototype.DefaultInterpolation=Lg;class rp extends qo{constructor(e,n,r){super(e,n,r)}}rp.prototype.ValueTypeName="bool";rp.prototype.ValueBufferType=Array;rp.prototype.DefaultInterpolation=Og;rp.prototype.InterpolantFactoryMethodLinear=void 0;rp.prototype.InterpolantFactoryMethodSmooth=void 0;class WR extends qo{}WR.prototype.ValueTypeName="color";class Wh extends qo{}Wh.prototype.ValueTypeName="number";class Q6 extends ov{constructor(e,n,r,i){super(e,n,r,i)}interpolate_(e,n,r,i){const s=this.resultBuffer,a=this.sampleValues,o=this.valueSize,l=(r-n)/(i-n);let c=e*o;for(let d=c+o;c!==d;c+=4)qt.slerpFlat(s,0,a,c-o,a,c,l);return s}}class $h extends qo{InterpolantFactoryMethodLinear(e){return new Q6(this.times,this.values,this.getValueSize(),e)}}$h.prototype.ValueTypeName="quaternion";$h.prototype.InterpolantFactoryMethodSmooth=void 0;class ip extends qo{constructor(e,n,r){super(e,n,r)}}ip.prototype.ValueTypeName="string";ip.prototype.ValueBufferType=Array;ip.prototype.DefaultInterpolation=Og;ip.prototype.InterpolantFactoryMethodLinear=void 0;ip.prototype.InterpolantFactoryMethodSmooth=void 0;class Xh extends qo{}Xh.prototype.ValueTypeName="vector";class jg{constructor(e="",n=-1,r=[],i=YS){this.name=e,this.tracks=r,this.duration=n,this.blendMode=i,this.uuid=wa(),this.duration<0&&this.resetDuration()}static parse(e){const n=[],r=e.tracks,i=1/(e.fps||1);for(let a=0,o=r.length;a!==o;++a)n.push(vxe(r[a]).scale(i));const s=new this(e.name,e.duration,n,e.blendMode);return s.uuid=e.uuid,s}static toJSON(e){const n=[],r=e.tracks,i={name:e.name,duration:e.duration,tracks:n,uuid:e.uuid,blendMode:e.blendMode};for(let s=0,a=r.length;s!==a;++s)n.push(qo.toJSON(r[s]));return i}static CreateFromMorphTargetSequence(e,n,r,i){const s=n.length,a=[];for(let o=0;o1){const f=d[1];let p=i[f];p||(i[f]=p=[]),p.push(c)}}const a=[];for(const o in i)a.push(this.CreateFromMorphTargetSequence(o,i[o],n,r));return a}static parseAnimation(e,n){if(!e)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;const r=function(f,p,y,b,S){if(y.length!==0){const w=[],x=[];VR(y,w,x,b),w.length!==0&&S.push(new f(p,w,x))}},i=[],s=e.name||"default",a=e.fps||30,o=e.blendMode;let l=e.length||-1;const c=e.hierarchy||[];for(let f=0;f{n&&n(s),this.manager.itemEnd(e)},0),s;if(Ac[e]!==void 0){Ac[e].push({onLoad:n,onProgress:r,onError:i});return}Ac[e]=[],Ac[e].push({onLoad:n,onProgress:r,onError:i});const a=new Request(e,{headers:new Headers(this.requestHeader),credentials:this.withCredentials?"include":"same-origin"}),o=this.mimeType,l=this.responseType;fetch(a).then(c=>{if(c.status===200||c.status===0){if(c.status===0&&console.warn("THREE.FileLoader: HTTP Status 0 received."),typeof ReadableStream>"u"||c.body===void 0||c.body.getReader===void 0)return c;const d=Ac[e],f=c.body.getReader(),p=c.headers.get("X-File-Size")||c.headers.get("Content-Length"),y=p?parseInt(p):0,b=y!==0;let S=0;const w=new ReadableStream({start(x){M();function M(){f.read().then(({done:T,value:P})=>{if(T)x.close();else{S+=P.byteLength;const O=new ProgressEvent("progress",{lengthComputable:b,loaded:S,total:y});for(let N=0,D=d.length;N{x.error(T)})}}});return new Response(w)}else throw new yxe(`fetch for "${c.url}" responded with ${c.status}: ${c.statusText}`,c)}).then(c=>{switch(l){case"arraybuffer":return c.arrayBuffer();case"blob":return c.blob();case"document":return c.text().then(d=>new DOMParser().parseFromString(d,o));case"json":return c.json();default:if(o===void 0)return c.text();{const f=/charset="?([^;"\s]*)"?/i.exec(o),p=f&&f[1]?f[1].toLowerCase():void 0,y=new TextDecoder(p);return c.arrayBuffer().then(b=>y.decode(b))}}}).then(c=>{Fc.add(e,c);const d=Ac[e];delete Ac[e];for(let f=0,p=d.length;f{const d=Ac[e];if(d===void 0)throw this.manager.itemError(e),c;delete Ac[e];for(let f=0,p=d.length;f{this.manager.itemEnd(e)}),this.manager.itemStart(e)}setResponseType(e){return this.responseType=e,this}setMimeType(e){return this.mimeType=e,this}}class xxe extends Rs{constructor(e){super(e)}load(e,n,r,i){const s=this,a=new Go(this.manager);a.setPath(this.path),a.setRequestHeader(this.requestHeader),a.setWithCredentials(this.withCredentials),a.load(e,function(o){try{n(s.parse(JSON.parse(o)))}catch(l){i?i(l):console.error(l),s.manager.itemError(e)}},r,i)}parse(e){const n=[];for(let r=0;r0:i.vertexColors=e.vertexColors),e.uniforms!==void 0)for(const s in e.uniforms){const a=e.uniforms[s];switch(i.uniforms[s]={},a.type){case"t":i.uniforms[s].value=r(a.value);break;case"c":i.uniforms[s].value=new ct().setHex(a.value);break;case"v2":i.uniforms[s].value=new He().fromArray(a.value);break;case"v3":i.uniforms[s].value=new q().fromArray(a.value);break;case"v4":i.uniforms[s].value=new On().fromArray(a.value);break;case"m3":i.uniforms[s].value=new $t().fromArray(a.value);break;case"m4":i.uniforms[s].value=new Ct().fromArray(a.value);break;default:i.uniforms[s].value=a.value}}if(e.defines!==void 0&&(i.defines=e.defines),e.vertexShader!==void 0&&(i.vertexShader=e.vertexShader),e.fragmentShader!==void 0&&(i.fragmentShader=e.fragmentShader),e.glslVersion!==void 0&&(i.glslVersion=e.glslVersion),e.extensions!==void 0)for(const s in e.extensions)i.extensions[s]=e.extensions[s];if(e.lights!==void 0&&(i.lights=e.lights),e.clipping!==void 0&&(i.clipping=e.clipping),e.size!==void 0&&(i.size=e.size),e.sizeAttenuation!==void 0&&(i.sizeAttenuation=e.sizeAttenuation),e.map!==void 0&&(i.map=r(e.map)),e.matcap!==void 0&&(i.matcap=r(e.matcap)),e.alphaMap!==void 0&&(i.alphaMap=r(e.alphaMap)),e.bumpMap!==void 0&&(i.bumpMap=r(e.bumpMap)),e.bumpScale!==void 0&&(i.bumpScale=e.bumpScale),e.normalMap!==void 0&&(i.normalMap=r(e.normalMap)),e.normalMapType!==void 0&&(i.normalMapType=e.normalMapType),e.normalScale!==void 0){let s=e.normalScale;Array.isArray(s)===!1&&(s=[s,s]),i.normalScale=new He().fromArray(s)}return e.displacementMap!==void 0&&(i.displacementMap=r(e.displacementMap)),e.displacementScale!==void 0&&(i.displacementScale=e.displacementScale),e.displacementBias!==void 0&&(i.displacementBias=e.displacementBias),e.roughnessMap!==void 0&&(i.roughnessMap=r(e.roughnessMap)),e.metalnessMap!==void 0&&(i.metalnessMap=r(e.metalnessMap)),e.emissiveMap!==void 0&&(i.emissiveMap=r(e.emissiveMap)),e.emissiveIntensity!==void 0&&(i.emissiveIntensity=e.emissiveIntensity),e.specularMap!==void 0&&(i.specularMap=r(e.specularMap)),e.specularIntensityMap!==void 0&&(i.specularIntensityMap=r(e.specularIntensityMap)),e.specularColorMap!==void 0&&(i.specularColorMap=r(e.specularColorMap)),e.envMap!==void 0&&(i.envMap=r(e.envMap)),e.envMapRotation!==void 0&&i.envMapRotation.fromArray(e.envMapRotation),e.envMapIntensity!==void 0&&(i.envMapIntensity=e.envMapIntensity),e.reflectivity!==void 0&&(i.reflectivity=e.reflectivity),e.refractionRatio!==void 0&&(i.refractionRatio=e.refractionRatio),e.lightMap!==void 0&&(i.lightMap=r(e.lightMap)),e.lightMapIntensity!==void 0&&(i.lightMapIntensity=e.lightMapIntensity),e.aoMap!==void 0&&(i.aoMap=r(e.aoMap)),e.aoMapIntensity!==void 0&&(i.aoMapIntensity=e.aoMapIntensity),e.gradientMap!==void 0&&(i.gradientMap=r(e.gradientMap)),e.clearcoatMap!==void 0&&(i.clearcoatMap=r(e.clearcoatMap)),e.clearcoatRoughnessMap!==void 0&&(i.clearcoatRoughnessMap=r(e.clearcoatRoughnessMap)),e.clearcoatNormalMap!==void 0&&(i.clearcoatNormalMap=r(e.clearcoatNormalMap)),e.clearcoatNormalScale!==void 0&&(i.clearcoatNormalScale=new He().fromArray(e.clearcoatNormalScale)),e.iridescenceMap!==void 0&&(i.iridescenceMap=r(e.iridescenceMap)),e.iridescenceThicknessMap!==void 0&&(i.iridescenceThicknessMap=r(e.iridescenceThicknessMap)),e.transmissionMap!==void 0&&(i.transmissionMap=r(e.transmissionMap)),e.thicknessMap!==void 0&&(i.thicknessMap=r(e.thicknessMap)),e.anisotropyMap!==void 0&&(i.anisotropyMap=r(e.anisotropyMap)),e.sheenColorMap!==void 0&&(i.sheenColorMap=r(e.sheenColorMap)),e.sheenRoughnessMap!==void 0&&(i.sheenRoughnessMap=r(e.sheenRoughnessMap)),i}setTextures(e){return this.textures=e,this}createMaterialFromType(e){return bM.createMaterialFromType(e)}static createMaterialFromType(e){const n={ShadowMaterial:z6,SpriteMaterial:kR,RawShaderMaterial:B6,ShaderMaterial:Ya,PointsMaterial:iM,MeshPhysicalMaterial:eo,MeshStandardMaterial:yx,MeshPhongMaterial:H6,MeshToonMaterial:V6,MeshNormalMaterial:G6,MeshLambertMaterial:W6,MeshDepthMaterial:RR,MeshDistanceMaterial:NR,MeshBasicMaterial:As,MeshMatcapMaterial:$6,LineDashedMaterial:X6,LineBasicMaterial:$r,Material:Gr};return new n[e]}}class Sd{static decodeText(e){if(console.warn("THREE.LoaderUtils: decodeText() has been deprecated with r165 and will be removed with r175. Use TextDecoder instead."),typeof TextDecoder<"u")return new TextDecoder().decode(e);let n="";for(let r=0,i=e.length;r0){const l=new $R(n);s=new Fg(l),s.setCrossOrigin(this.crossOrigin);for(let c=0,d=e.length;c0){i=new Fg(this.manager),i.setCrossOrigin(this.crossOrigin);for(let a=0,o=e.length;a{const w=new os;w.min.fromArray(S.boxMin),w.max.fromArray(S.boxMax);const x=new Hi;return x.radius=S.sphereRadius,x.center.fromArray(S.sphereCenter),{boxInitialized:S.boxInitialized,box:w,sphereInitialized:S.sphereInitialized,sphere:x}}),a._maxInstanceCount=e.maxInstanceCount,a._maxVertexCount=e.maxVertexCount,a._maxIndexCount=e.maxIndexCount,a._geometryInitialized=e.geometryInitialized,a._geometryCount=e.geometryCount,a._matricesTexture=c(e.matricesTexture.uuid),e.colorsTexture!==void 0&&(a._colorsTexture=c(e.colorsTexture.uuid));break;case"LOD":a=new P6;break;case"Line":a=new Ul(o(e.geometry),l(e.material));break;case"LineLoop":a=new LR(o(e.geometry),l(e.material));break;case"LineSegments":a=new ea(o(e.geometry),l(e.material));break;case"PointCloud":case"Points":a=new DR(o(e.geometry),l(e.material));break;case"Sprite":a=new T6(l(e.material));break;case"Group":a=new Ts;break;case"Bone":a=new rM;break;default:a=new mn}if(a.uuid=e.uuid,e.name!==void 0&&(a.name=e.name),e.matrix!==void 0?(a.matrix.fromArray(e.matrix),e.matrixAutoUpdate!==void 0&&(a.matrixAutoUpdate=e.matrixAutoUpdate),a.matrixAutoUpdate&&a.matrix.decompose(a.position,a.quaternion,a.scale)):(e.position!==void 0&&a.position.fromArray(e.position),e.rotation!==void 0&&a.rotation.fromArray(e.rotation),e.quaternion!==void 0&&a.quaternion.fromArray(e.quaternion),e.scale!==void 0&&a.scale.fromArray(e.scale)),e.up!==void 0&&a.up.fromArray(e.up),e.castShadow!==void 0&&(a.castShadow=e.castShadow),e.receiveShadow!==void 0&&(a.receiveShadow=e.receiveShadow),e.shadow&&(e.shadow.intensity!==void 0&&(a.shadow.intensity=e.shadow.intensity),e.shadow.bias!==void 0&&(a.shadow.bias=e.shadow.bias),e.shadow.normalBias!==void 0&&(a.shadow.normalBias=e.shadow.normalBias),e.shadow.radius!==void 0&&(a.shadow.radius=e.shadow.radius),e.shadow.mapSize!==void 0&&a.shadow.mapSize.fromArray(e.shadow.mapSize),e.shadow.camera!==void 0&&(a.shadow.camera=this.parseObject(e.shadow.camera))),e.visible!==void 0&&(a.visible=e.visible),e.frustumCulled!==void 0&&(a.frustumCulled=e.frustumCulled),e.renderOrder!==void 0&&(a.renderOrder=e.renderOrder),e.userData!==void 0&&(a.userData=e.userData),e.layers!==void 0&&(a.layers.mask=e.layers),e.children!==void 0){const p=e.children;for(let y=0;y"u"&&console.warn("THREE.ImageBitmapLoader: createImageBitmap() not supported."),typeof fetch>"u"&&console.warn("THREE.ImageBitmapLoader: fetch() not supported."),this.options={premultiplyAlpha:"none"}}setOptions(e){return this.options=e,this}load(e,n,r,i){e===void 0&&(e=""),this.path!==void 0&&(e=this.path+e),e=this.manager.resolveURL(e);const s=this,a=Fc.get(e);if(a!==void 0){if(s.manager.itemStart(e),a.then){a.then(c=>{n&&n(c),s.manager.itemEnd(e)}).catch(c=>{i&&i(c)});return}return setTimeout(function(){n&&n(a),s.manager.itemEnd(e)},0),a}const o={};o.credentials=this.crossOrigin==="anonymous"?"same-origin":"include",o.headers=this.requestHeader;const l=fetch(e,o).then(function(c){return c.blob()}).then(function(c){return createImageBitmap(c,Object.assign(s.options,{colorSpaceConversion:"none"}))}).then(function(c){return Fc.add(e,c),n&&n(c),s.manager.itemEnd(e),c}).catch(function(c){i&&i(c),Fc.remove(e),s.manager.itemError(e),s.manager.itemEnd(e)});Fc.add(e,l),s.manager.itemStart(e)}}let M_;class ZR{static getContext(){return M_===void 0&&(M_=new(window.AudioContext||window.webkitAudioContext)),M_}static setContext(e){M_=e}}class Pxe extends Rs{constructor(e){super(e)}load(e,n,r,i){const s=this,a=new Go(this.manager);a.setResponseType("arraybuffer"),a.setPath(this.path),a.setRequestHeader(this.requestHeader),a.setWithCredentials(this.withCredentials),a.load(e,function(l){try{const c=l.slice(0);ZR.getContext().decodeAudioData(c,function(f){n(f)}).catch(o)}catch(c){o(c)}},r,i);function o(l){i?i(l):console.error(l),s.manager.itemError(e)}}}const sU=new Ct,aU=new Ct,Df=new Ct;class Cxe{constructor(){this.type="StereoCamera",this.aspect=1,this.eyeSep=.064,this.cameraL=new Pr,this.cameraL.layers.enable(1),this.cameraL.matrixAutoUpdate=!1,this.cameraR=new Pr,this.cameraR.layers.enable(2),this.cameraR.matrixAutoUpdate=!1,this._cache={focus:null,fov:null,aspect:null,near:null,far:null,zoom:null,eyeSep:null}}update(e){const n=this._cache;if(n.focus!==e.focus||n.fov!==e.fov||n.aspect!==e.aspect*this.aspect||n.near!==e.near||n.far!==e.far||n.zoom!==e.zoom||n.eyeSep!==this.eyeSep){n.focus=e.focus,n.fov=e.fov,n.aspect=e.aspect*this.aspect,n.near=e.near,n.far=e.far,n.zoom=e.zoom,n.eyeSep=this.eyeSep,Df.copy(e.projectionMatrix);const i=n.eyeSep/2,s=i*n.near/n.focus,a=n.near*Math.tan(Ph*n.fov*.5)/n.zoom;let o,l;aU.elements[12]=-i,sU.elements[12]=i,o=-a*n.aspect+s,l=a*n.aspect+s,Df.elements[0]=2*n.near/(l-o),Df.elements[8]=(l+o)/(l-o),this.cameraL.projectionMatrix.copy(Df),o=-a*n.aspect-s,l=a*n.aspect-s,Df.elements[0]=2*n.near/(l-o),Df.elements[8]=(l+o)/(l-o),this.cameraR.projectionMatrix.copy(Df)}this.cameraL.matrixWorld.copy(e.matrixWorld).multiply(aU),this.cameraR.matrixWorld.copy(e.matrixWorld).multiply(sU)}}class QR{constructor(e=!0){this.autoStart=e,this.startTime=0,this.oldTime=0,this.elapsedTime=0,this.running=!1}start(){this.startTime=oU(),this.oldTime=this.startTime,this.elapsedTime=0,this.running=!0}stop(){this.getElapsedTime(),this.running=!1,this.autoStart=!1}getElapsedTime(){return this.getDelta(),this.elapsedTime}getDelta(){let e=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){const n=oU();e=(n-this.oldTime)/1e3,this.oldTime=n,this.elapsedTime+=e}return e}}function oU(){return performance.now()}const Uf=new q,lU=new qt,Rxe=new q,jf=new q;class Nxe extends mn{constructor(){super(),this.type="AudioListener",this.context=ZR.getContext(),this.gain=this.context.createGain(),this.gain.connect(this.context.destination),this.filter=null,this.timeDelta=0,this._clock=new QR}getInput(){return this.gain}removeFilter(){return this.filter!==null&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null),this}getFilter(){return this.filter}setFilter(e){return this.filter!==null?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination),this.filter=e,this.gain.connect(this.filter),this.filter.connect(this.context.destination),this}getMasterVolume(){return this.gain.gain.value}setMasterVolume(e){return this.gain.gain.setTargetAtTime(e,this.context.currentTime,.01),this}updateMatrixWorld(e){super.updateMatrixWorld(e);const n=this.context.listener,r=this.up;if(this.timeDelta=this._clock.getDelta(),this.matrixWorld.decompose(Uf,lU,Rxe),jf.set(0,0,-1).applyQuaternion(lU),n.positionX){const i=this.context.currentTime+this.timeDelta;n.positionX.linearRampToValueAtTime(Uf.x,i),n.positionY.linearRampToValueAtTime(Uf.y,i),n.positionZ.linearRampToValueAtTime(Uf.z,i),n.forwardX.linearRampToValueAtTime(jf.x,i),n.forwardY.linearRampToValueAtTime(jf.y,i),n.forwardZ.linearRampToValueAtTime(jf.z,i),n.upX.linearRampToValueAtTime(r.x,i),n.upY.linearRampToValueAtTime(r.y,i),n.upZ.linearRampToValueAtTime(r.z,i)}else n.setPosition(Uf.x,Uf.y,Uf.z),n.setOrientation(jf.x,jf.y,jf.z,r.x,r.y,r.z)}}let cG=class extends mn{constructor(e){super(),this.type="Audio",this.listener=e,this.context=e.context,this.gain=this.context.createGain(),this.gain.connect(e.getInput()),this.autoplay=!1,this.buffer=null,this.detune=0,this.loop=!1,this.loopStart=0,this.loopEnd=0,this.offset=0,this.duration=void 0,this.playbackRate=1,this.isPlaying=!1,this.hasPlaybackControl=!0,this.source=null,this.sourceType="empty",this._startedAt=0,this._progress=0,this._connected=!1,this.filters=[]}getOutput(){return this.gain}setNodeSource(e){return this.hasPlaybackControl=!1,this.sourceType="audioNode",this.source=e,this.connect(),this}setMediaElementSource(e){return this.hasPlaybackControl=!1,this.sourceType="mediaNode",this.source=this.context.createMediaElementSource(e),this.connect(),this}setMediaStreamSource(e){return this.hasPlaybackControl=!1,this.sourceType="mediaStreamNode",this.source=this.context.createMediaStreamSource(e),this.connect(),this}setBuffer(e){return this.buffer=e,this.sourceType="buffer",this.autoplay&&this.play(),this}play(e=0){if(this.isPlaying===!0){console.warn("THREE.Audio: Audio is already playing.");return}if(this.hasPlaybackControl===!1){console.warn("THREE.Audio: this Audio has no playback control.");return}this._startedAt=this.context.currentTime+e;const n=this.context.createBufferSource();return n.buffer=this.buffer,n.loop=this.loop,n.loopStart=this.loopStart,n.loopEnd=this.loopEnd,n.onended=this.onEnded.bind(this),n.start(this._startedAt,this._progress+this.offset,this.duration),this.isPlaying=!0,this.source=n,this.setDetune(this.detune),this.setPlaybackRate(this.playbackRate),this.connect()}pause(){if(this.hasPlaybackControl===!1){console.warn("THREE.Audio: this Audio has no playback control.");return}return this.isPlaying===!0&&(this._progress+=Math.max(this.context.currentTime-this._startedAt,0)*this.playbackRate,this.loop===!0&&(this._progress=this._progress%(this.duration||this.buffer.duration)),this.source.stop(),this.source.onended=null,this.isPlaying=!1),this}stop(e=0){if(this.hasPlaybackControl===!1){console.warn("THREE.Audio: this Audio has no playback control.");return}return this._progress=0,this.source!==null&&(this.source.stop(this.context.currentTime+e),this.source.onended=null),this.isPlaying=!1,this}connect(){if(this.filters.length>0){this.source.connect(this.filters[0]);for(let e=1,n=this.filters.length;e0){this.source.disconnect(this.filters[0]);for(let e=1,n=this.filters.length;e0&&this._mixBufferRegionAdditive(r,i,this._addIndex*n,1,n);for(let l=n,c=n+n;l!==c;++l)if(r[l]!==r[l+n]){o.setValue(r,i);break}}saveOriginalState(){const e=this.binding,n=this.buffer,r=this.valueSize,i=r*this._origIndex;e.getValue(n,i);for(let s=r,a=i;s!==a;++s)n[s]=n[i+s%r];this._setIdentity(),this.cumulativeWeight=0,this.cumulativeWeightAdditive=0}restoreOriginalState(){const e=this.valueSize*3;this.binding.setValue(this.buffer,e)}_setAdditiveIdentityNumeric(){const e=this._addIndex*this.valueSize,n=e+this.valueSize;for(let r=e;r=.5)for(let a=0;a!==s;++a)e[n+a]=e[r+a]}_slerp(e,n,r,i){qt.slerpFlat(e,n,e,n,e,r,i)}_slerpAdditive(e,n,r,i,s){const a=this._workIndex*s;qt.multiplyQuaternionsFlat(e,a,e,n,e,r),qt.slerpFlat(e,n,e,n,e,a,i)}_lerp(e,n,r,i,s){const a=1-i;for(let o=0;o!==s;++o){const l=n+o;e[l]=e[l]*a+e[r+o]*i}}_lerpAdditive(e,n,r,i,s){for(let a=0;a!==s;++a){const o=n+a;e[o]=e[o]+e[r+a]*i}}}const JR="\\[\\]\\.:\\/",Lxe=new RegExp("["+JR+"]","g"),eN="[^"+JR+"]",Dxe="[^"+JR.replace("\\.","")+"]",Uxe=/((?:WC+[\/:])*)/.source.replace("WC",eN),jxe=/(WCOD+)?/.source.replace("WCOD",Dxe),Fxe=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",eN),zxe=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",eN),Bxe=new RegExp("^"+Uxe+jxe+Fxe+zxe+"$"),Hxe=["material","materials","bones","map"];class Vxe{constructor(e,n,r){const i=r||Rn.parseTrackName(n);this._targetGroup=e,this._bindings=e.subscribe_(n,i)}getValue(e,n){this.bind();const r=this._targetGroup.nCachedObjects_,i=this._bindings[r];i!==void 0&&i.getValue(e,n)}setValue(e,n){const r=this._bindings;for(let i=this._targetGroup.nCachedObjects_,s=r.length;i!==s;++i)r[i].setValue(e,n)}bind(){const e=this._bindings;for(let n=this._targetGroup.nCachedObjects_,r=e.length;n!==r;++n)e[n].bind()}unbind(){const e=this._bindings;for(let n=this._targetGroup.nCachedObjects_,r=e.length;n!==r;++n)e[n].unbind()}}class Rn{constructor(e,n,r){this.path=n,this.parsedPath=r||Rn.parseTrackName(n),this.node=Rn.findNode(e,this.parsedPath.nodeName),this.rootNode=e,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(e,n,r){return e&&e.isAnimationObjectGroup?new Rn.Composite(e,n,r):new Rn(e,n,r)}static sanitizeNodeName(e){return e.replace(/\s/g,"_").replace(Lxe,"")}static parseTrackName(e){const n=Bxe.exec(e);if(n===null)throw new Error("PropertyBinding: Cannot parse trackName: "+e);const r={nodeName:n[2],objectName:n[3],objectIndex:n[4],propertyName:n[5],propertyIndex:n[6]},i=r.nodeName&&r.nodeName.lastIndexOf(".");if(i!==void 0&&i!==-1){const s=r.nodeName.substring(i+1);Hxe.indexOf(s)!==-1&&(r.nodeName=r.nodeName.substring(0,i),r.objectName=s)}if(r.propertyName===null||r.propertyName.length===0)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+e);return r}static findNode(e,n){if(n===void 0||n===""||n==="."||n===-1||n===e.name||n===e.uuid)return e;if(e.skeleton){const r=e.skeleton.getBoneByName(n);if(r!==void 0)return r}if(e.children){const r=function(s){for(let a=0;a=s){const f=s++,p=e[f];n[p.uuid]=d,e[d]=p,n[c]=f,e[f]=l;for(let y=0,b=i;y!==b;++y){const S=r[y],w=S[f],x=S[d];S[d]=w,S[f]=x}}}this.nCachedObjects_=s}uncache(){const e=this._objects,n=this._indicesByUUID,r=this._bindings,i=r.length;let s=this.nCachedObjects_,a=e.length;for(let o=0,l=arguments.length;o!==l;++o){const c=arguments[o],d=c.uuid,f=n[d];if(f!==void 0)if(delete n[d],f0&&(n[y.uuid]=f),e[f]=y,e.pop();for(let b=0,S=i;b!==S;++b){const w=r[b];w[f]=w[p],w.pop()}}}this.nCachedObjects_=s}subscribe_(e,n){const r=this._bindingsIndicesByPath;let i=r[e];const s=this._bindings;if(i!==void 0)return s[i];const a=this._paths,o=this._parsedPaths,l=this._objects,c=l.length,d=this.nCachedObjects_,f=new Array(c);i=s.length,r[e]=i,a.push(e),o.push(n),s.push(f);for(let p=d,y=l.length;p!==y;++p){const b=l[p];f[p]=new Rn(b,e,n)}return f}unsubscribe_(e){const n=this._bindingsIndicesByPath,r=n[e];if(r!==void 0){const i=this._paths,s=this._parsedPaths,a=this._bindings,o=a.length-1,l=a[o],c=e[o];n[c]=r,a[r]=l,a.pop(),s[r]=s[o],s.pop(),i[r]=i[o],i.pop()}}}class dG{constructor(e,n,r=null,i=n.blendMode){this._mixer=e,this._clip=n,this._localRoot=r,this.blendMode=i;const s=n.tracks,a=s.length,o=new Array(a),l={endingStart:lh,endingEnd:lh};for(let c=0;c!==a;++c){const d=s[c].createInterpolant(null);o[c]=d,d.settings=l}this._interpolantSettings=l,this._interpolants=o,this._propertyBindings=new Array(a),this._cacheIndex=null,this._byClipCacheIndex=null,this._timeScaleInterpolant=null,this._weightInterpolant=null,this.loop=YV,this._loopCount=-1,this._startTime=null,this.time=0,this.timeScale=1,this._effectiveTimeScale=1,this.weight=1,this._effectiveWeight=1,this.repetitions=1/0,this.paused=!1,this.enabled=!0,this.clampWhenFinished=!1,this.zeroSlopeAtStart=!0,this.zeroSlopeAtEnd=!0}play(){return this._mixer._activateAction(this),this}stop(){return this._mixer._deactivateAction(this),this.reset()}reset(){return this.paused=!1,this.enabled=!0,this.time=0,this._loopCount=-1,this._startTime=null,this.stopFading().stopWarping()}isRunning(){return this.enabled&&!this.paused&&this.timeScale!==0&&this._startTime===null&&this._mixer._isActiveAction(this)}isScheduled(){return this._mixer._isActiveAction(this)}startAt(e){return this._startTime=e,this}setLoop(e,n){return this.loop=e,this.repetitions=n,this}setEffectiveWeight(e){return this.weight=e,this._effectiveWeight=this.enabled?e:0,this.stopFading()}getEffectiveWeight(){return this._effectiveWeight}fadeIn(e){return this._scheduleFading(e,0,1)}fadeOut(e){return this._scheduleFading(e,1,0)}crossFadeFrom(e,n,r){if(e.fadeOut(n),this.fadeIn(n),r){const i=this._clip.duration,s=e._clip.duration,a=s/i,o=i/s;e.warp(1,a,n),this.warp(o,1,n)}return this}crossFadeTo(e,n,r){return e.crossFadeFrom(this,n,r)}stopFading(){const e=this._weightInterpolant;return e!==null&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(e)),this}setEffectiveTimeScale(e){return this.timeScale=e,this._effectiveTimeScale=this.paused?0:e,this.stopWarping()}getEffectiveTimeScale(){return this._effectiveTimeScale}setDuration(e){return this.timeScale=this._clip.duration/e,this.stopWarping()}syncWith(e){return this.time=e.time,this.timeScale=e.timeScale,this.stopWarping()}halt(e){return this.warp(this._effectiveTimeScale,0,e)}warp(e,n,r){const i=this._mixer,s=i.time,a=this.timeScale;let o=this._timeScaleInterpolant;o===null&&(o=i._lendControlInterpolant(),this._timeScaleInterpolant=o);const l=o.parameterPositions,c=o.sampleValues;return l[0]=s,l[1]=s+r,c[0]=e/a,c[1]=n/a,this}stopWarping(){const e=this._timeScaleInterpolant;return e!==null&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(e)),this}getMixer(){return this._mixer}getClip(){return this._clip}getRoot(){return this._localRoot||this._mixer._root}_update(e,n,r,i){if(!this.enabled){this._updateWeight(e);return}const s=this._startTime;if(s!==null){const l=(e-s)*r;l<0||r===0?n=0:(this._startTime=null,n=r*l)}n*=this._updateTimeScale(e);const a=this._updateTime(n),o=this._updateWeight(e);if(o>0){const l=this._interpolants,c=this._propertyBindings;switch(this.blendMode){case bR:for(let d=0,f=l.length;d!==f;++d)l[d].evaluate(a),c[d].accumulateAdditive(o);break;case YS:default:for(let d=0,f=l.length;d!==f;++d)l[d].evaluate(a),c[d].accumulate(i,o)}}}_updateWeight(e){let n=0;if(this.enabled){n=this.weight;const r=this._weightInterpolant;if(r!==null){const i=r.evaluate(e)[0];n*=i,e>r.parameterPositions[1]&&(this.stopFading(),i===0&&(this.enabled=!1))}}return this._effectiveWeight=n,n}_updateTimeScale(e){let n=0;if(!this.paused){n=this.timeScale;const r=this._timeScaleInterpolant;if(r!==null){const i=r.evaluate(e)[0];n*=i,e>r.parameterPositions[1]&&(this.stopWarping(),n===0?this.paused=!0:this.timeScale=n)}}return this._effectiveTimeScale=n,n}_updateTime(e){const n=this._clip.duration,r=this.loop;let i=this.time+e,s=this._loopCount;const a=r===ZV;if(e===0)return s===-1?i:a&&(s&1)===1?n-i:i;if(r===KV){s===-1&&(this._loopCount=0,this._setEndings(!0,!0,!1));e:{if(i>=n)i=n;else if(i<0)i=0;else{this.time=i;break e}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this.time=i,this._mixer.dispatchEvent({type:"finished",action:this,direction:e<0?-1:1})}}else{if(s===-1&&(e>=0?(s=0,this._setEndings(!0,this.repetitions===0,a)):this._setEndings(this.repetitions===0,!0,a)),i>=n||i<0){const o=Math.floor(i/n);i-=n*o,s+=Math.abs(o);const l=this.repetitions-s;if(l<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,i=e>0?n:0,this.time=i,this._mixer.dispatchEvent({type:"finished",action:this,direction:e>0?1:-1});else{if(l===1){const c=e<0;this._setEndings(c,!c,a)}else this._setEndings(!1,!1,a);this._loopCount=s,this.time=i,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:o})}}else this.time=i;if(a&&(s&1)===1)return n-i}return i}_setEndings(e,n,r){const i=this._interpolantSettings;r?(i.endingStart=ch,i.endingEnd=ch):(e?i.endingStart=this.zeroSlopeAtStart?ch:lh:i.endingStart=Py,n?i.endingEnd=this.zeroSlopeAtEnd?ch:lh:i.endingEnd=Py)}_scheduleFading(e,n,r){const i=this._mixer,s=i.time;let a=this._weightInterpolant;a===null&&(a=i._lendControlInterpolant(),this._weightInterpolant=a);const o=a.parameterPositions,l=a.sampleValues;return o[0]=s,l[0]=n,o[1]=s+e,l[1]=r,this}}const Wxe=new Float32Array(1);class $xe extends zl{constructor(e){super(),this._root=e,this._initMemoryManager(),this._accuIndex=0,this.time=0,this.timeScale=1}_bindAction(e,n){const r=e._localRoot||this._root,i=e._clip.tracks,s=i.length,a=e._propertyBindings,o=e._interpolants,l=r.uuid,c=this._bindingsByRootAndName;let d=c[l];d===void 0&&(d={},c[l]=d);for(let f=0;f!==s;++f){const p=i[f],y=p.name;let b=d[y];if(b!==void 0)++b.referenceCount,a[f]=b;else{if(b=a[f],b!==void 0){b._cacheIndex===null&&(++b.referenceCount,this._addInactiveBinding(b,l,y));continue}const S=n&&n._propertyBindings[f].binding.parsedPath;b=new uG(Rn.create(r,y,S),p.ValueTypeName,p.getValueSize()),++b.referenceCount,this._addInactiveBinding(b,l,y),a[f]=b}o[f].resultBuffer=b.buffer}}_activateAction(e){if(!this._isActiveAction(e)){if(e._cacheIndex===null){const r=(e._localRoot||this._root).uuid,i=e._clip.uuid,s=this._actionsByClip[i];this._bindAction(e,s&&s.knownActions[0]),this._addInactiveAction(e,i,r)}const n=e._propertyBindings;for(let r=0,i=n.length;r!==i;++r){const s=n[r];s.useCount++===0&&(this._lendBinding(s),s.saveOriginalState())}this._lendAction(e)}}_deactivateAction(e){if(this._isActiveAction(e)){const n=e._propertyBindings;for(let r=0,i=n.length;r!==i;++r){const s=n[r];--s.useCount===0&&(s.restoreOriginalState(),this._takeBackBinding(s))}this._takeBackAction(e)}}_initMemoryManager(){this._actions=[],this._nActiveActions=0,this._actionsByClip={},this._bindings=[],this._nActiveBindings=0,this._bindingsByRootAndName={},this._controlInterpolants=[],this._nActiveControlInterpolants=0;const e=this;this.stats={actions:{get total(){return e._actions.length},get inUse(){return e._nActiveActions}},bindings:{get total(){return e._bindings.length},get inUse(){return e._nActiveBindings}},controlInterpolants:{get total(){return e._controlInterpolants.length},get inUse(){return e._nActiveControlInterpolants}}}}_isActiveAction(e){const n=e._cacheIndex;return n!==null&&n=0;--r)e[r].stop();return this}update(e){e*=this.timeScale;const n=this._actions,r=this._nActiveActions,i=this.time+=e,s=Math.sign(e),a=this._accuIndex^=1;for(let c=0;c!==r;++c)n[c]._update(i,e,s,a);const o=this._bindings,l=this._nActiveBindings;for(let c=0;c!==l;++c)o[c].apply(a);return this}setTime(e){this.time=0;for(let n=0;n=this.min.x&&e.x<=this.max.x&&e.y>=this.min.y&&e.y<=this.max.y}containsBox(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y}getParameter(e,n){return n.set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y))}intersectsBox(e){return e.max.x>=this.min.x&&e.min.x<=this.max.x&&e.max.y>=this.min.y&&e.min.y<=this.max.y}clampPoint(e,n){return n.copy(e).clamp(this.min,this.max)}distanceToPoint(e){return this.clampPoint(e,fU).distanceTo(e)}intersect(e){return this.min.max(e.min),this.max.min(e.max),this.isEmpty()&&this.makeEmpty(),this}union(e){return this.min.min(e.min),this.max.max(e.max),this}translate(e){return this.min.add(e),this.max.add(e),this}equals(e){return e.min.equals(this.min)&&e.max.equals(this.max)}}const hU=new q,E_=new q;class Qxe{constructor(e=new q,n=new q){this.start=e,this.end=n}set(e,n){return this.start.copy(e),this.end.copy(n),this}copy(e){return this.start.copy(e.start),this.end.copy(e.end),this}getCenter(e){return e.addVectors(this.start,this.end).multiplyScalar(.5)}delta(e){return e.subVectors(this.end,this.start)}distanceSq(){return this.start.distanceToSquared(this.end)}distance(){return this.start.distanceTo(this.end)}at(e,n){return this.delta(n).multiplyScalar(e).add(this.start)}closestPointToPointParameter(e,n){hU.subVectors(e,this.start),E_.subVectors(this.end,this.start);const r=E_.dot(E_);let s=E_.dot(hU)/r;return n&&(s=Tr(s,0,1)),s}closestPointToPoint(e,n,r){const i=this.closestPointToPointParameter(e,n);return this.delta(r).multiplyScalar(i).add(this.start)}applyMatrix4(e){return this.start.applyMatrix4(e),this.end.applyMatrix4(e),this}equals(e){return e.start.equals(this.start)&&e.end.equals(this.end)}clone(){return new this.constructor().copy(this)}}const pU=new q;class Jxe extends mn{constructor(e,n){super(),this.light=e,this.matrixAutoUpdate=!1,this.color=n,this.type="SpotLightHelper";const r=new Yt,i=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1];for(let a=0,o=1,l=32;a1)for(let f=0;f.99999)this.quaternion.set(0,0,0,1);else if(e.y<-.99999)this.quaternion.set(1,0,0,0);else{xU.set(e.z,0,-e.x).normalize();const n=Math.acos(e.y);this.quaternion.setFromAxisAngle(xU,n)}}setLength(e,n=e*.2,r=n*.2){this.line.scale.set(1,Math.max(1e-4,e-n),1),this.line.updateMatrix(),this.cone.scale.set(r,n,r),this.cone.position.y=e,this.cone.updateMatrix()}setColor(e){this.line.material.color.set(e),this.cone.material.color.set(e)}copy(e){return super.copy(e,!1),this.line.copy(e.line),this.cone.copy(e.cone),this}dispose(){this.line.geometry.dispose(),this.line.material.dispose(),this.cone.geometry.dispose(),this.cone.material.dispose()}}class pG extends ea{constructor(e=1){const n=[0,0,0,e,0,0,0,0,0,0,e,0,0,0,0,0,0,e],r=[1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],i=new Yt;i.setAttribute("position",new Lt(n,3)),i.setAttribute("color",new Lt(r,3));const s=new $r({vertexColors:!0,toneMapped:!1});super(i,s),this.type="AxesHelper"}setColors(e,n,r){const i=new ct,s=this.geometry.attributes.color.array;return i.set(e),i.toArray(s,0),i.toArray(s,3),i.set(n),i.toArray(s,6),i.toArray(s,9),i.set(r),i.toArray(s,12),i.toArray(s,15),this.geometry.attributes.color.needsUpdate=!0,this}dispose(){this.geometry.dispose(),this.material.dispose()}}class fbe{constructor(){this.type="ShapePath",this.color=new ct,this.subPaths=[],this.currentPath=null}moveTo(e,n){return this.currentPath=new Ly,this.subPaths.push(this.currentPath),this.currentPath.moveTo(e,n),this}lineTo(e,n){return this.currentPath.lineTo(e,n),this}quadraticCurveTo(e,n,r,i){return this.currentPath.quadraticCurveTo(e,n,r,i),this}bezierCurveTo(e,n,r,i,s,a){return this.currentPath.bezierCurveTo(e,n,r,i,s,a),this}splineThru(e){return this.currentPath.splineThru(e),this}toShapes(e){function n(x){const M=[];for(let T=0,P=x.length;TNumber.EPSILON){if(k<0&&(D=M[N],V=-V,z=M[O],k=-k),x.yz.y)continue;if(x.y===D.y){if(x.x===D.x)return!0}else{const j=k*(x.x-D.x)-V*(x.y-D.y);if(j===0)return!0;if(j<0)continue;P=!P}}else{if(x.y!==D.y)continue;if(z.x<=x.x&&x.x<=D.x||D.x<=x.x&&x.x<=z.x)return!0}}return P}const i=Cl.isClockWise,s=this.subPaths;if(s.length===0)return[];let a,o,l;const c=[];if(s.length===1)return o=s[0],l=new Rh,l.curves=o.curves,c.push(l),c;let d=!i(s[0].getPoints());d=e?!d:d;const f=[],p=[];let y=[],b=0,S;p[b]=void 0,y[b]=[];for(let x=0,M=s.length;x1){let x=!1,M=0;for(let T=0,P=p.length;T0&&x===!1&&(y=f)}let w;for(let x=0,M=p.length;x{const f=typeof c=="function"?c(e):c;if(f!==e){const p=e;e=d?f:Object.assign({},e,f),n.forEach(y=>y(e,p))}},i=()=>e,s=(c,d=i,f=Object.is)=>{console.warn("[DEPRECATED] Please use `subscribeWithSelector` middleware");let p=d(e);function y(){const b=d(e);if(!f(p,b)){const S=p;c(p=b,S)}}return n.add(y),()=>n.delete(y)},l={setState:r,getState:i,subscribe:(c,d,f)=>d||f?s(c,d,f):(n.add(c),()=>n.delete(c)),destroy:()=>n.clear()};return e=t(r,i,l),l}const xbe=typeof window>"u"||!window.navigator||/ServerSideRendering|^Deno\//.test(window.navigator.userAgent),wU=xbe?R.useEffect:R.useLayoutEffect;function bbe(t){const e=typeof t=="function"?ybe(t):t,n=(r=e.getState,i=Object.is)=>{const[,s]=R.useReducer(w=>w+1,0),a=e.getState(),o=R.useRef(a),l=R.useRef(r),c=R.useRef(i),d=R.useRef(!1),f=R.useRef();f.current===void 0&&(f.current=r(a));let p,y=!1;(o.current!==a||l.current!==r||c.current!==i||d.current)&&(p=r(a),y=!i(f.current,p)),wU(()=>{y&&(f.current=p),o.current=a,l.current=r,c.current=i,d.current=!1});const b=R.useRef(a);wU(()=>{const w=()=>{try{const M=e.getState(),T=l.current(M);c.current(f.current,T)||(o.current=M,f.current=T,s())}catch{d.current=!0,s()}},x=e.subscribe(w);return e.getState()!==b.current&&w(),x},[]);const S=y?p:f.current;return R.useDebugValue(S),S};return Object.assign(n,e),n[Symbol.iterator]=function(){console.warn("[useStore, api] = create() is deprecated and will be removed in v4");const r=[n,e];return{next(){const i=r.length<=0;return{value:r.shift(),done:i}}}},n}var FA={exports:{}},zA={exports:{}},BA={};/** - * @license React - * scheduler.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var SU;function _be(){return SU||(SU=1,(function(t){function e(B,J){var Y=B.length;B.push(J);e:for(;0>>1,G=B[H];if(0>>1;Hi(ce,Y))Sei(we,ce)?(B[H]=we,B[Se]=Y,H=Se):(B[H]=ce,B[se]=Y,H=se);else if(Sei(we,Y))B[H]=we,B[Se]=Y,H=Se;else break e}}return J}function i(B,J){var Y=B.sortIndex-J.sortIndex;return Y!==0?Y:B.id-J.id}if(typeof performance=="object"&&typeof performance.now=="function"){var s=performance;t.unstable_now=function(){return s.now()}}else{var a=Date,o=a.now();t.unstable_now=function(){return a.now()-o}}var l=[],c=[],d=1,f=null,p=3,y=!1,b=!1,S=!1,w=typeof setTimeout=="function"?setTimeout:null,x=typeof clearTimeout=="function"?clearTimeout:null,M=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function T(B){for(var J=n(c);J!==null;){if(J.callback===null)r(c);else if(J.startTime<=B)r(c),J.sortIndex=J.expirationTime,e(l,J);else break;J=n(c)}}function P(B){if(S=!1,T(B),!b)if(n(l)!==null)b=!0,ae(O);else{var J=n(c);J!==null&&he(P,J.startTime-B)}}function O(B,J){b=!1,S&&(S=!1,x(z),z=-1),y=!0;var Y=p;try{for(T(J),f=n(l);f!==null&&(!(f.expirationTime>J)||B&&!j());){var H=f.callback;if(typeof H=="function"){f.callback=null,p=f.priorityLevel;var G=H(f.expirationTime<=J);J=t.unstable_now(),typeof G=="function"?f.callback=G:f===n(l)&&r(l),T(J)}else r(l);f=n(l)}if(f!==null)var le=!0;else{var se=n(c);se!==null&&he(P,se.startTime-J),le=!1}return le}finally{f=null,p=Y,y=!1}}var N=!1,D=null,z=-1,V=5,k=-1;function j(){return!(t.unstable_now()-kB||125H?(B.sortIndex=Y,e(c,B),n(l)===null&&B===n(c)&&(S?(x(z),z=-1):S=!0,he(P,Y-H))):(B.sortIndex=G,e(l,B),b||y||(b=!0,ae(O))),B},t.unstable_shouldYield=j,t.unstable_wrapCallback=function(B){var J=p;return function(){var Y=p;p=J;try{return B.apply(this,arguments)}finally{p=Y}}}})(BA)),BA}var MU;function wbe(){return MU||(MU=1,zA.exports=_be()),zA.exports}/** - * @license React - * react-reconciler.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var HA,EU;function Sbe(){return EU||(EU=1,HA=function(e){var n={},r=qh(),i=wbe(),s=Object.assign;function a(m){for(var g="https://reactjs.org/docs/error-decoder.html?invariant="+m,E=1;Eye||L[re]!==F[ye]){var je=` -`+L[re].replace(" at new "," at ");return m.displayName&&je.includes("")&&(je=je.replace("",m.displayName)),je}while(1<=re&&0<=ye);break}}}finally{jt=!1,Error.prepareStackTrace=E}return(m=m?m.displayName||m.name:"")?Et(m):""}var Rt=Object.prototype.hasOwnProperty,Sn=[],Mn=-1;function yn(m){return{current:m}}function Kt(m){0>Mn||(m.current=Sn[Mn],Sn[Mn]=null,Mn--)}function Ut(m,g){Mn++,Sn[Mn]=m.current,m.current=g}var mt={},xn=yn(mt),tn=yn(!1),Rr=mt;function li(m,g){var E=m.type.contextTypes;if(!E)return mt;var C=m.stateNode;if(C&&C.__reactInternalMemoizedUnmaskedChildContext===g)return C.__reactInternalMemoizedMaskedChildContext;var L={},F;for(F in E)L[F]=g[F];return C&&(m=m.stateNode,m.__reactInternalMemoizedUnmaskedChildContext=g,m.__reactInternalMemoizedMaskedChildContext=L),L}function In(m){return m=m.childContextTypes,m!=null}function Is(){Kt(tn),Kt(xn)}function Vn(m,g,E){if(xn.current!==mt)throw Error(a(168));Ut(xn,g),Ut(tn,E)}function ta(m,g,E){var C=m.stateNode;if(g=g.childContextTypes,typeof C.getChildContext!="function")return E;C=C.getChildContext();for(var L in C)if(!(L in g))throw Error(a(108,z(m)||"Unknown",L));return s({},E,C)}function Yo(m){return m=(m=m.stateNode)&&m.__reactInternalMemoizedMergedChildContext||mt,Rr=xn.current,Ut(xn,m),Ut(tn,tn.current),!0}function Xr(m,g,E){var C=m.stateNode;if(!C)throw Error(a(169));E?(m=ta(m,g,Rr),C.__reactInternalMemoizedMergedChildContext=m,Kt(tn),Kt(xn),Ut(xn,m)):Kt(tn),Ut(tn,E)}var ci=Math.clz32?Math.clz32:_M,Ud=Math.log,Zo=Math.LN2;function _M(m){return m>>>=0,m===0?32:31-(Ud(m)/Zo|0)|0}var uu=64,Pn=4194304;function du(m){switch(m&-m){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: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 m&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return m&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return m}}function jd(m,g){var E=m.pendingLanes;if(E===0)return 0;var C=0,L=m.suspendedLanes,F=m.pingedLanes,re=E&268435455;if(re!==0){var ye=re&~L;ye!==0?C=du(ye):(F&=re,F!==0&&(C=du(F)))}else re=E&~L,re!==0?C=du(re):F!==0&&(C=du(F));if(C===0)return 0;if(g!==0&&g!==C&&(g&L)===0&&(L=C&-C,F=g&-g,L>=F||L===16&&(F&4194240)!==0))return g;if((C&4)!==0&&(C|=E&16),g=m.entangledLanes,g!==0)for(m=m.entanglements,g&=C;0E;E++)g.push(m);return g}function Hl(m,g,E){m.pendingLanes|=g,g!==536870912&&(m.suspendedLanes=0,m.pingedLanes=0),m=m.eventTimes,g=31-ci(g),m[g]=E}function op(m,g){var E=m.pendingLanes&~g;m.pendingLanes=g,m.suspendedLanes=0,m.pingedLanes=0,m.expiredLanes&=g,m.mutableReadLanes&=g,m.entangledLanes&=g,g=m.entanglements;var C=m.eventTimes;for(m=m.expirationTimes;0>=re,L-=re,oo=1<<32-ci(g)+L|E<En?(_r=sn,sn=null):_r=sn.sibling;var bn=zt(Ne,sn,De[En],gt);if(bn===null){sn===null&&(sn=_r);break}m&&sn&&bn.alternate===null&&g(Ne,sn),_e=F(bn,_e,En),an===null?Ot=bn:an.sibling=bn,an=bn,sn=_r}if(En===De.length)return E(Ne,sn),Qn&&Kl(Ne,En),Ot;if(sn===null){for(;EnEn?(_r=sn,sn=null):_r=sn.sibling;var Mo=zt(Ne,sn,bn.value,gt);if(Mo===null){sn===null&&(sn=_r);break}m&&sn&&Mo.alternate===null&&g(Ne,sn),_e=F(Mo,_e,En),an===null?Ot=Mo:an.sibling=Mo,an=Mo,sn=_r}if(bn.done)return E(Ne,sn),Qn&&Kl(Ne,En),Ot;if(sn===null){for(;!bn.done;En++,bn=De.next())bn=rn(Ne,bn.value,gt),bn!==null&&(_e=F(bn,_e,En),an===null?Ot=bn:an.sibling=bn,an=bn);return Qn&&Kl(Ne,En),Ot}for(sn=C(Ne,sn);!bn.done;En++,bn=De.next())bn=ln(sn,Ne,En,bn.value,gt),bn!==null&&(m&&bn.alternate!==null&&sn.delete(bn.key===null?En:bn.key),_e=F(bn,_e,En),an===null?Ot=bn:an.sibling=bn,an=bn);return m&&sn.forEach(function(Kv){return g(Ne,Kv)}),Qn&&Kl(Ne,En),Ot}function ys(Ne,_e,De,gt){if(typeof De=="object"&&De!==null&&De.type===d&&De.key===null&&(De=De.props.children),typeof De=="object"&&De!==null){switch(De.$$typeof){case l:e:{for(var Ot=De.key,an=_e;an!==null;){if(an.key===Ot){if(Ot=De.type,Ot===d){if(an.tag===7){E(Ne,an.sibling),_e=L(an,De.props.children),_e.return=Ne,Ne=_e;break e}}else if(an.elementType===Ot||typeof Ot=="object"&&Ot!==null&&Ot.$$typeof===T&&xu(Ot)===an.type){E(Ne,an.sibling),_e=L(an,De.props),_e.ref=yu(Ne,an,De),_e.return=Ne,Ne=_e;break e}E(Ne,an);break}else g(Ne,an);an=an.sibling}De.type===d?(_e=vc(De.props.children,Ne.mode,gt,De.key),_e.return=Ne,Ne=_e):(gt=Xp(De.type,De.key,De.props,null,Ne.mode,gt),gt.ref=yu(Ne,_e,De),gt.return=Ne,Ne=gt)}return re(Ne);case c:e:{for(an=De.key;_e!==null;){if(_e.key===an)if(_e.tag===4&&_e.stateNode.containerInfo===De.containerInfo&&_e.stateNode.implementation===De.implementation){E(Ne,_e.sibling),_e=L(_e,De.children||[]),_e.return=Ne,Ne=_e;break e}else{E(Ne,_e);break}else g(Ne,_e);_e=_e.sibling}_e=Kp(De,Ne.mode,gt),_e.return=Ne,Ne=_e}return re(Ne);case T:return an=De._init,ys(Ne,_e,an(De._payload),gt)}if(pe(De))return xt(Ne,_e,De,gt);if(N(De))return Jr(Ne,_e,De,gt);nl(Ne,De)}return typeof De=="string"&&De!==""||typeof De=="number"?(De=""+De,_e!==null&&_e.tag===6?(E(Ne,_e.sibling),_e=L(_e,De),_e.return=Ne,Ne=_e):(E(Ne,_e),_e=qp(De,Ne.mode,gt),_e.return=Ne,Ne=_e),re(Ne)):E(Ne,_e)}return ys}var co=Px(!0),Cx=Px(!1),bu={},qi=yn(bu),Yl=yn(bu),Zl=yn(bu);function ra(m){if(m===bu)throw Error(a(174));return m}function wp(m,g){Ut(Zl,g),Ut(Yl,m),Ut(qi,bu),m=he(g),Kt(qi),Ut(qi,m)}function _u(){Kt(qi),Kt(Yl),Kt(Zl)}function Rx(m){var g=ra(Zl.current),E=ra(qi.current);g=B(E,m.type,g),E!==g&&(Ut(Yl,m),Ut(qi,g))}function xv(m){Yl.current===m&&(Kt(qi),Kt(Yl))}var nr=yn(0);function Sp(m){for(var g=m;g!==null;){if(g.tag===13){var E=g.memoizedState;if(E!==null&&(E=E.dehydrated,E===null||Ko(E)||Ns(E)))return g}else if(g.tag===19&&g.memoizedProps.revealOrder!==void 0){if((g.flags&128)!==0)return g}else if(g.child!==null){g.child.return=g,g=g.child;continue}if(g===m)break;for(;g.sibling===null;){if(g.return===null||g.return===m)return null;g=g.return}g.sibling.return=g.return,g=g.sibling}return null}var ds=[];function Ql(){for(var m=0;mE?E:4,m(!0);var C=fs.transition;fs.transition={};try{m(!1),g()}finally{un=E,fs.transition=C}}function tc(){return sa().memoizedState}function Ix(m,g,E){var C=ca(m);E={lane:C,action:E,hasEagerState:!1,eagerState:null,next:null},kx(m)?Mv(g,E):(Qd(m,g,E),E=Cn(),m=fi(m,C,E),m!==null&&Jd(m,g,C))}function MM(m,g,E){var C=ca(m),L={lane:C,action:E,hasEagerState:!1,eagerState:null,next:null};if(kx(m))Mv(g,L);else{Qd(m,g,L);var F=m.alternate;if(m.lanes===0&&(F===null||F.lanes===0)&&(F=g.lastRenderedReducer,F!==null))try{var re=g.lastRenderedState,ye=F(re,E);if(L.hasEagerState=!0,L.eagerState=ye,Ti(ye,re))return}catch{}finally{}E=Cn(),m=fi(m,C,E),m!==null&&Jd(m,g,C)}}function kx(m){var g=m.alternate;return m===rr||g!==null&&g===rr}function Mv(m,g){Ra=Mp=!0;var E=m.pending;E===null?g.next=g:(g.next=E.next,E.next=g),m.pending=g}function Qd(m,g,E){gr!==null&&(m.mode&1)!==0&&(on&2)===0?(m=g.interleaved,m===null?(E.next=E,Ls===null?Ls=[g]:Ls.push(g)):(E.next=m.next,m.next=E),g.interleaved=E):(m=g.pending,m===null?E.next=E:(E.next=m.next,m.next=E),g.pending=E)}function Jd(m,g,E){if((E&4194240)!==0){var C=g.lanes;C&=m.pendingLanes,E|=C,g.lanes=E,Pa(m,E)}}var Au={readContext:Xi,useCallback:jr,useContext:jr,useEffect:jr,useImperativeHandle:jr,useInsertionEffect:jr,useLayoutEffect:jr,useMemo:jr,useReducer:jr,useRef:jr,useState:jr,useDebugValue:jr,useDeferredValue:jr,useTransition:jr,useMutableSource:jr,useSyncExternalStore:jr,useId:jr,unstable_isNewReconciler:!1},Ev={readContext:Xi,useCallback:function(m,g){return ia().memoizedState=[m,g===void 0?null:g],m},useContext:Xi,useEffect:Pp,useImperativeHandle:function(m,g,E){return E=E!=null?E.concat([m]):null,il(4194308,4,Zd.bind(null,g,m),E)},useLayoutEffect:function(m,g){return il(4194308,4,m,g)},useInsertionEffect:function(m,g){return il(4,2,m,g)},useMemo:function(m,g){var E=ia();return g=g===void 0?null:g,m=m(),E.memoizedState=[m,g],m},useReducer:function(m,g,E){var C=ia();return g=E!==void 0?E(g):g,C.memoizedState=C.baseState=g,m={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:m,lastRenderedState:g},C.queue=m,m=m.dispatch=Ix.bind(null,rr,m),[C.memoizedState,m]},useRef:function(m){var g=ia();return m={current:m},g.memoizedState=m},useState:Kd,useDebugValue:Rp,useDeferredValue:function(m){var g=Kd(m),E=g[0],C=g[1];return Pp(function(){var L=fs.transition;fs.transition={};try{C(m)}finally{fs.transition=L}},[m]),E},useTransition:function(){var m=Kd(!1),g=m[0];return m=Ip.bind(null,m[1]),ia().memoizedState=m,[g,m]},useMutableSource:function(){},useSyncExternalStore:function(m,g,E){var C=rr,L=ia();if(Qn){if(E===void 0)throw Error(a(407));E=E()}else{if(E=g(),gr===null)throw Error(a(349));(Jl&30)!==0||wv(C,g,E)}L.memoizedState=E;var F={value:E,getSnapshot:g};return L.queue=F,Pp(uo.bind(null,C,F,m),[m]),C.flags|=2048,Yd(9,Sv.bind(null,C,F,E,g),void 0,null),E},useId:function(){var m=ia(),g=gr.identifierPrefix;if(Qn){var E=lo,C=oo;E=(C&~(1<<32-ci(C)-1)).toString(32)+E,g=":"+g+"R"+E,E=ec++,0ll&&(g.flags|=128,C=!0,ho(L,!1),g.lanes=4194304)}else{if(!C)if(m=Sp(F),m!==null){if(g.flags|=128,C=!0,m=m.updateQueue,m!==null&&(g.updateQueue=m,g.flags|=4),ho(L,!0),L.tail===null&&L.tailMode==="hidden"&&!F.alternate&&!Qn)return mr(g),null}else 2*Nr()-L.renderingStartTime>ll&&E!==1073741824&&(g.flags|=128,C=!0,ho(L,!1),g.lanes=4194304);L.isBackwards?(F.sibling=g.child,g.child=F):(m=L.last,m!==null?m.sibling=F:g.child=F,L.last=F)}return L.tail!==null?(g=L.tail,L.rendering=g,L.tail=g.sibling,L.renderingStartTime=Nr(),g.sibling=null,m=nr.current,Ut(nr,C?m&1|2:m&1),g):(mr(g),null);case 22:case 23:return pf(),C=g.memoizedState!==null,m!==null&&m.memoizedState!==null!==C&&(g.flags|=8192),C&&(g.mode&1)!==0?(di&1073741824)!==0&&(mr(g),$e&&g.subtreeFlags&6&&(g.flags|=8192)):mr(g),null;case 24:return null;case 25:return null}throw Error(a(156,g.tag))}var Rv=o.ReactCurrentOwner,Fr=!1;function lr(m,g,E,C){g.child=m===null?Cx(g,null,E,C):co(g,m.child,E,C)}function $n(m,g,E,C,L){E=E.render;var F=g.ref;return hu(g,L),C=wu(m,g,E,C,F,L),E=rl(),m!==null&&!Fr?(g.updateQueue=m.updateQueue,g.flags&=-2053,m.lanes&=~L,Ki(m,g,L)):(Qn&&E&&mv(g),g.flags|=1,lr(m,g,C,L),g.child)}function Gn(m,g,E,C,L){if(m===null){var F=E.type;return typeof F=="function"&&!$p(F)&&F.defaultProps===void 0&&E.compare===null&&E.defaultProps===void 0?(g.tag=15,g.type=F,po(m,g,F,C,L)):(m=Xp(E.type,null,C,g,g.mode,L),m.ref=g.ref,m.return=g,g.child=m)}if(F=m.child,(m.lanes&L)===0){var re=F.memoizedProps;if(E=E.compare,E=E!==null?E:na,E(re,C)&&m.ref===g.ref)return Ki(m,g,L)}return g.flags|=1,m=So(F,C),m.ref=g.ref,m.return=g,g.child=m}function po(m,g,E,C,L){if(m!==null&&na(m.memoizedProps,C)&&m.ref===g.ref)if(Fr=!1,(m.lanes&L)!==0)(m.flags&131072)!==0&&(Fr=!0);else return g.lanes=m.lanes,Ki(m,g,L);return mo(m,g,E,C,L)}function Kr(m,g,E){var C=g.pendingProps,L=C.children,F=m!==null?m.memoizedState:null;if(C.mode==="hidden")if((g.mode&1)===0)g.memoizedState={baseLanes:0,cachePool:null},Ut(fc,di),di|=E;else if((E&1073741824)!==0)g.memoizedState={baseLanes:0,cachePool:null},C=F!==null?F.baseLanes:E,Ut(fc,di),di|=C;else return m=F!==null?F.baseLanes|E:E,g.lanes=g.childLanes=1073741824,g.memoizedState={baseLanes:m,cachePool:null},g.updateQueue=null,Ut(fc,di),di|=m,null;else F!==null?(C=F.baseLanes|E,g.memoizedState=null):C=E,Ut(fc,di),di|=C;return lr(m,g,L,E),g.child}function Ri(m,g){var E=g.ref;(m===null&&E!==null||m!==null&&m.ref!==E)&&(g.flags|=512,g.flags|=2097152)}function mo(m,g,E,C,L){var F=In(E)?Rr:xn.current;return F=li(g,F),hu(g,L),E=wu(m,g,E,C,F,L),C=rl(),m!==null&&!Fr?(g.updateQueue=m.updateQueue,g.flags&=-2053,m.lanes&=~L,Ki(m,g,L)):(Qn&&C&&mv(g),g.flags|=1,lr(m,g,E,L),g.child)}function ic(m,g,E,C,L){if(In(E)){var F=!0;Yo(g)}else F=!1;if(hu(g,L),g.stateNode===null)m!==null&&(m.alternate=null,g.alternate=null,g.flags|=2),Mx(g,E,C),pv(g,E,C,L),C=!0;else if(m===null){var re=g.stateNode,ye=g.memoizedProps;re.props=ye;var je=re.context,st=E.contextType;typeof st=="object"&&st!==null?st=Xi(st):(st=In(E)?Rr:xn.current,st=li(g,st));var St=E.getDerivedStateFromProps,rn=typeof St=="function"||typeof re.getSnapshotBeforeUpdate=="function";rn||typeof re.UNSAFE_componentWillReceiveProps!="function"&&typeof re.componentWillReceiveProps!="function"||(ye!==C||je!==st)&&Ex(g,re,C,st),Ds=!1;var zt=g.memoizedState;re.state=zt,gp(g,C,re,L),je=g.memoizedState,ye!==C||zt!==je||tn.current||Ds?(typeof St=="function"&&(fv(g,E,St,C),je=g.memoizedState),(ye=Ds||hv(g,E,ye,C,zt,je,st))?(rn||typeof re.UNSAFE_componentWillMount!="function"&&typeof re.componentWillMount!="function"||(typeof re.componentWillMount=="function"&&re.componentWillMount(),typeof re.UNSAFE_componentWillMount=="function"&&re.UNSAFE_componentWillMount()),typeof re.componentDidMount=="function"&&(g.flags|=4194308)):(typeof re.componentDidMount=="function"&&(g.flags|=4194308),g.memoizedProps=C,g.memoizedState=je),re.props=C,re.state=je,re.context=st,C=ye):(typeof re.componentDidMount=="function"&&(g.flags|=4194308),C=!1)}else{re=g.stateNode,dv(m,g),ye=g.memoizedProps,st=g.type===g.elementType?ye:$i(g.type,ye),re.props=st,rn=g.pendingProps,zt=re.context,je=E.contextType,typeof je=="object"&&je!==null?je=Xi(je):(je=In(E)?Rr:xn.current,je=li(g,je));var ln=E.getDerivedStateFromProps;(St=typeof ln=="function"||typeof re.getSnapshotBeforeUpdate=="function")||typeof re.UNSAFE_componentWillReceiveProps!="function"&&typeof re.componentWillReceiveProps!="function"||(ye!==rn||zt!==je)&&Ex(g,re,C,je),Ds=!1,zt=g.memoizedState,re.state=zt,gp(g,C,re,L);var xt=g.memoizedState;ye!==rn||zt!==xt||tn.current||Ds?(typeof ln=="function"&&(fv(g,E,ln,C),xt=g.memoizedState),(st=Ds||hv(g,E,st,C,zt,xt,je)||!1)?(St||typeof re.UNSAFE_componentWillUpdate!="function"&&typeof re.componentWillUpdate!="function"||(typeof re.componentWillUpdate=="function"&&re.componentWillUpdate(C,xt,je),typeof re.UNSAFE_componentWillUpdate=="function"&&re.UNSAFE_componentWillUpdate(C,xt,je)),typeof re.componentDidUpdate=="function"&&(g.flags|=4),typeof re.getSnapshotBeforeUpdate=="function"&&(g.flags|=1024)):(typeof re.componentDidUpdate!="function"||ye===m.memoizedProps&&zt===m.memoizedState||(g.flags|=4),typeof re.getSnapshotBeforeUpdate!="function"||ye===m.memoizedProps&&zt===m.memoizedState||(g.flags|=1024),g.memoizedProps=C,g.memoizedState=xt),re.props=C,re.state=xt,re.context=je,C=st):(typeof re.componentDidUpdate!="function"||ye===m.memoizedProps&&zt===m.memoizedState||(g.flags|=4),typeof re.getSnapshotBeforeUpdate!="function"||ye===m.memoizedProps&&zt===m.memoizedState||(g.flags|=1024),C=!1)}return ui(m,g,E,C,F,L)}function ui(m,g,E,C,L,F){Ri(m,g);var re=(g.flags&128)!==0;if(!C&&!re)return L&&Xr(g,E,!1),Ki(m,g,F);C=g.stateNode,Rv.current=g;var ye=re&&typeof E.getDerivedStateFromError!="function"?null:C.render();return g.flags|=1,m!==null&&re?(g.child=co(g,m.child,null,F),g.child=co(g,null,ye,F)):lr(m,g,ye,F),g.memoizedState=C.state,L&&Xr(g,E,!0),g.child}function ef(m){var g=m.stateNode;g.pendingContext?Vn(m,g.pendingContext,g.pendingContext!==g.context):g.context&&Vn(m,g.context,!1),wp(m,g.containerInfo)}function Nv(m,g,E,C,L){return vu(),_p(L),g.flags|=256,lr(m,g,E,C),g.child}var tf={dehydrated:null,treeContext:null,retryLane:0};function sc(m){return{baseLanes:m,cachePool:null}}function Iv(m,g,E){var C=g.pendingProps,L=nr.current,F=!1,re=(g.flags&128)!==0,ye;if((ye=re)||(ye=m!==null&&m.memoizedState===null?!1:(L&2)!==0),ye?(F=!0,g.flags&=-129):(m===null||m.memoizedState!==null)&&(L|=1),Ut(nr,L&1),m===null)return tl(g),m=g.memoizedState,m!==null&&(m=m.dehydrated,m!==null)?((g.mode&1)===0?g.lanes=1:Ns(m)?g.lanes=8:g.lanes=1073741824,null):(L=C.children,m=C.fallback,F?(C=g.mode,F=g.child,L={mode:"hidden",children:L},(C&1)===0&&F!==null?(F.childLanes=0,F.pendingProps=L):F=vf(L,C,0,null),m=vc(m,C,E,null),F.return=g,m.return=g,F.sibling=m,g.child=F,g.child.memoizedState=sc(E),g.memoizedState=tf,m):aa(g,L));if(L=m.memoizedState,L!==null){if(ye=L.dehydrated,ye!==null){if(re)return g.flags&256?(g.flags&=-257,rf(m,g,E,Error(a(422)))):g.memoizedState!==null?(g.child=m.child,g.flags|=128,null):(F=C.fallback,L=g.mode,C=vf({mode:"visible",children:C.children},L,0,null),F=vc(F,L,E,null),F.flags|=2,C.return=g,F.return=g,C.sibling=F,g.child=C,(g.mode&1)!==0&&co(g,m.child,null,E),g.child.memoizedState=sc(E),g.memoizedState=tf,F);if((g.mode&1)===0)g=rf(m,g,E,null);else if(Ns(ye))g=rf(m,g,E,Error(a(419)));else if(C=(E&m.childLanes)!==0,Fr||C){if(C=gr,C!==null){switch(E&-E){case 4:F=2;break;case 16:F=8;break;case 64: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:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:F=32;break;case 536870912:F=268435456;break;default:F=0}C=(F&(C.suspendedLanes|E))!==0?0:F,C!==0&&C!==L.retryLane&&(L.retryLane=C,fi(m,C,-1))}Gp(),g=rf(m,g,E,Error(a(421)))}else Ko(ye)?(g.flags|=128,g.child=m.child,g=Fx.bind(null,m),no(ye,g),g=null):(E=L.treeContext,Z&&(qr=ou(ye),Ci=g,Qn=!0,js=null,gu=!1,E!==null&&(Us[us++]=oo,Us[us++]=lo,Us[us++]=ql,oo=E.id,lo=E.overflow,ql=g)),g=aa(g,g.pendingProps.children),g.flags|=4096);return g}return F?(C=jp(m,g,C.children,C.fallback,E),F=g.child,L=m.child.memoizedState,F.memoizedState=L===null?sc(E):{baseLanes:L.baseLanes|E,cachePool:null},F.childLanes=m.childLanes&~E,g.memoizedState=tf,C):(E=nf(m,g,C.children,E),g.memoizedState=null,E)}return F?(C=jp(m,g,C.children,C.fallback,E),F=g.child,L=m.child.memoizedState,F.memoizedState=L===null?sc(E):{baseLanes:L.baseLanes|E,cachePool:null},F.childLanes=m.childLanes&~E,g.memoizedState=tf,C):(E=nf(m,g,C.children,E),g.memoizedState=null,E)}function aa(m,g){return g=vf({mode:"visible",children:g},m.mode,0,null),g.return=m,m.child=g}function nf(m,g,E,C){var L=m.child;return m=L.sibling,E=So(L,{mode:"visible",children:E}),(g.mode&1)===0&&(E.lanes=C),E.return=g,E.sibling=null,m!==null&&(C=g.deletions,C===null?(g.deletions=[m],g.flags|=16):C.push(m)),g.child=E}function jp(m,g,E,C,L){var F=g.mode;m=m.child;var re=m.sibling,ye={mode:"hidden",children:E};return(F&1)===0&&g.child!==m?(E=g.child,E.childLanes=0,E.pendingProps=ye,g.deletions=null):(E=So(m,ye),E.subtreeFlags=m.subtreeFlags&14680064),re!==null?C=So(re,C):(C=vc(C,F,L,null),C.flags|=2),C.return=g,E.return=g,E.sibling=C,g.child=E,C}function rf(m,g,E,C){return C!==null&&_p(C),co(g,m.child,null,E),m=aa(g,g.pendingProps.children),m.flags|=2,g.memoizedState=null,m}function Lx(m,g,E){m.lanes|=g;var C=m.alternate;C!==null&&(C.lanes|=g),Xl(m.return,g,E)}function Ia(m,g,E,C,L){var F=m.memoizedState;F===null?m.memoizedState={isBackwards:g,rendering:null,renderingStartTime:0,last:C,tail:E,tailMode:L}:(F.isBackwards=g,F.rendering=null,F.renderingStartTime=0,F.last=C,F.tail=E,F.tailMode=L)}function ac(m,g,E){var C=g.pendingProps,L=C.revealOrder,F=C.tail;if(lr(m,g,C.children,E),C=nr.current,(C&2)!==0)C=C&1|2,g.flags|=128;else{if(m!==null&&(m.flags&128)!==0)e:for(m=g.child;m!==null;){if(m.tag===13)m.memoizedState!==null&&Lx(m,E,g);else if(m.tag===19)Lx(m,E,g);else if(m.child!==null){m.child.return=m,m=m.child;continue}if(m===g)break e;for(;m.sibling===null;){if(m.return===null||m.return===g)break e;m=m.return}m.sibling.return=m.return,m=m.sibling}C&=1}if(Ut(nr,C),(g.mode&1)===0)g.memoizedState=null;else switch(L){case"forwards":for(E=g.child,L=null;E!==null;)m=E.alternate,m!==null&&Sp(m)===null&&(L=E),E=E.sibling;E=L,E===null?(L=g.child,g.child=null):(L=E.sibling,E.sibling=null),Ia(g,!1,L,E,F);break;case"backwards":for(E=null,L=g.child,g.child=null;L!==null;){if(m=L.alternate,m!==null&&Sp(m)===null){g.child=L;break}m=L.sibling,L.sibling=E,E=L,L=m}Ia(g,!0,E,null,F);break;case"together":Ia(g,!1,null,null,void 0);break;default:g.memoizedState=null}return g.child}function Ki(m,g,E){if(m!==null&&(g.dependencies=m.dependencies),ka|=g.lanes,(E&g.childLanes)===0)return null;if(m!==null&&g.child!==m.child)throw Error(a(153));if(g.child!==null){for(m=g.child,E=So(m,m.pendingProps),g.child=E,E.return=g;m.sibling!==null;)m=m.sibling,E=E.sibling=So(m,m.pendingProps),E.return=g;E.sibling=null}return g.child}function Fp(m,g,E){switch(g.tag){case 3:ef(g),vu();break;case 5:Rx(g);break;case 1:In(g.type)&&Yo(g);break;case 4:wp(g,g.stateNode.containerInfo);break;case 10:$l(g,g.type._context,g.memoizedProps.value);break;case 13:var C=g.memoizedState;if(C!==null)return C.dehydrated!==null?(Ut(nr,nr.current&1),g.flags|=128,null):(E&g.child.childLanes)!==0?Iv(m,g,E):(Ut(nr,nr.current&1),m=Ki(m,g,E),m!==null?m.sibling:null);Ut(nr,nr.current&1);break;case 19:if(C=(E&g.childLanes)!==0,(m.flags&128)!==0){if(C)return ac(m,g,E);g.flags|=128}var L=g.memoizedState;if(L!==null&&(L.rendering=null,L.tail=null,L.lastEffect=null),Ut(nr,nr.current),C)break;return null;case 22:case 23:return g.lanes=0,Kr(m,g,E)}return Ki(m,g,E)}function zp(m,g){switch(gv(g),g.tag){case 1:return In(g.type)&&Is(),m=g.flags,m&65536?(g.flags=m&-65537|128,g):null;case 3:return _u(),Kt(tn),Kt(xn),Ql(),m=g.flags,(m&65536)!==0&&(m&128)===0?(g.flags=m&-65537|128,g):null;case 5:return xv(g),null;case 13:if(Kt(nr),m=g.memoizedState,m!==null&&m.dehydrated!==null){if(g.alternate===null)throw Error(a(340));vu()}return m=g.flags,m&65536?(g.flags=m&-65537|128,g):null;case 19:return Kt(nr),null;case 4:return _u(),null;case 10:return Vd(g.type._context),null;case 22:case 23:return pf(),null;case 24:return null;default:return null}}var Ni=!1,zr=!1,oc=typeof WeakSet=="function"?WeakSet:Set,ut=null;function Fs(m,g){var E=m.ref;if(E!==null)if(typeof E=="function")try{E(null)}catch(C){ki(m,g,C)}else E.current=null}function go(m,g,E){try{E()}catch(C){ki(m,g,C)}}var kv=!1;function Ov(m,g){for(J(m.containerInfo),ut=g;ut!==null;)if(m=ut,g=m.child,(m.subtreeFlags&1028)!==0&&g!==null)g.return=m,ut=g;else for(;ut!==null;){m=ut;try{var E=m.alternate;if((m.flags&1024)!==0)switch(m.tag){case 0:case 11:case 15:break;case 1:if(E!==null){var C=E.memoizedProps,L=E.memoizedState,F=m.stateNode,re=F.getSnapshotBeforeUpdate(m.elementType===m.type?C:$i(m.type,C),L);F.__reactInternalSnapshotBeforeUpdate=re}break;case 3:$e&&at(m.stateNode.containerInfo);break;case 5:case 6:case 4:case 17:break;default:throw Error(a(163))}}catch(ye){ki(m,m.return,ye)}if(g=m.sibling,g!==null){g.return=m.return,ut=g;break}ut=m.return}return E=kv,kv=!1,E}function vo(m,g,E){var C=g.updateQueue;if(C=C!==null?C.lastEffect:null,C!==null){var L=C=C.next;do{if((L.tag&m)===m){var F=L.destroy;L.destroy=void 0,F!==void 0&&go(g,E,F)}L=L.next}while(L!==C)}}function Yr(m,g){if(g=g.updateQueue,g=g!==null?g.lastEffect:null,g!==null){var E=g=g.next;do{if((E.tag&m)===m){var C=E.create;E.destroy=C()}E=E.next}while(E!==g)}}function Ii(m){var g=m.ref;if(g!==null){var E=m.stateNode;switch(m.tag){case 5:m=ae(E);break;default:m=E}typeof g=="function"?g(m):g.current=m}}function Kn(m,g,E){if(Ca&&typeof Ca.onCommitFiberUnmount=="function")try{Ca.onCommitFiberUnmount(Fd,g)}catch{}switch(g.tag){case 0:case 11:case 14:case 15:if(m=g.updateQueue,m!==null&&(m=m.lastEffect,m!==null)){var C=m=m.next;do{var L=C,F=L.destroy;L=L.tag,F!==void 0&&((L&2)!==0||(L&4)!==0)&&go(g,E,F),C=C.next}while(C!==m)}break;case 1:if(Fs(g,E),m=g.stateNode,typeof m.componentWillUnmount=="function")try{m.props=g.memoizedProps,m.state=g.memoizedState,m.componentWillUnmount()}catch(re){ki(g,E,re)}break;case 5:Fs(g,E);break;case 4:$e?Uv(m,g,E):de&&de&&(g=g.stateNode.containerInfo,E=Jt(g),en(g,E))}}function zs(m,g,E){for(var C=g;;)if(Kn(m,C,E),C.child===null||$e&&C.tag===4){if(C===g)break;for(;C.sibling===null;){if(C.return===null||C.return===g)return;C=C.return}C.sibling.return=C.return,C=C.sibling}else C.child.return=C,C=C.child}function Lv(m){var g=m.alternate;g!==null&&(m.alternate=null,Lv(g)),m.child=null,m.deletions=null,m.sibling=null,m.tag===5&&(g=m.stateNode,g!==null&&Ce(g)),m.stateNode=null,m.return=null,m.dependencies=null,m.memoizedProps=null,m.memoizedState=null,m.pendingProps=null,m.stateNode=null,m.updateQueue=null}function Dv(m){return m.tag===5||m.tag===3||m.tag===4}function Bp(m){e:for(;;){for(;m.sibling===null;){if(m.return===null||Dv(m.return))return null;m=m.return}for(m.sibling.return=m.return,m=m.sibling;m.tag!==5&&m.tag!==6&&m.tag!==18;){if(m.flags&2||m.child===null||m.tag===4)continue e;m.child.return=m,m=m.child}if(!(m.flags&2))return m.stateNode}}function Hp(m){if($e){e:{for(var g=m.return;g!==null;){if(Dv(g))break e;g=g.return}throw Error(a(160))}var E=g;switch(E.tag){case 5:g=E.stateNode,E.flags&32&&(qe(g),E.flags&=-33),E=Bp(m),Pu(m,E,g);break;case 3:case 4:g=E.stateNode.containerInfo,E=Bp(m),Vp(m,E,g);break;default:throw Error(a(161))}}}function Vp(m,g,E){var C=m.tag;if(C===5||C===6)m=m.stateNode,g?vt(E,m,g):Xt(E,m);else if(C!==4&&(m=m.child,m!==null))for(Vp(m,g,E),m=m.sibling;m!==null;)Vp(m,g,E),m=m.sibling}function Pu(m,g,E){var C=m.tag;if(C===5||C===6)m=m.stateNode,g?Mt(E,m,g):ht(E,m);else if(C!==4&&(m=m.child,m!==null))for(Pu(m,g,E),m=m.sibling;m!==null;)Pu(m,g,E),m=m.sibling}function Uv(m,g,E){for(var C=g,L=!1,F,re;;){if(!L){L=C.return;e:for(;;){if(L===null)throw Error(a(160));switch(F=L.stateNode,L.tag){case 5:re=!1;break e;case 3:F=F.containerInfo,re=!0;break e;case 4:F=F.containerInfo,re=!0;break e}L=L.return}L=!0}if(C.tag===5||C.tag===6)zs(m,C,E),re?fe(F,C.stateNode):Zt(F,C.stateNode);else if(C.tag===18)re?Ie(F,C.stateNode):Te(F,C.stateNode);else if(C.tag===4){if(C.child!==null){F=C.stateNode.containerInfo,re=!0,C.child.return=C,C=C.child;continue}}else if(Kn(m,C,E),C.child!==null){C.child.return=C,C=C.child;continue}if(C===g)break;for(;C.sibling===null;){if(C.return===null||C.return===g)return;C=C.return,C.tag===4&&(L=!1)}C.sibling.return=C.return,C=C.sibling}}function al(m,g){if($e){switch(g.tag){case 0:case 11:case 14:case 15:vo(3,g,g.return),Yr(3,g),vo(5,g,g.return);return;case 1:return;case 5:var E=g.stateNode;if(E!=null){var C=g.memoizedProps;m=m!==null?m.memoizedProps:C;var L=g.type,F=g.updateQueue;g.updateQueue=null,F!==null&&tt(E,F,L,m,C,g)}return;case 6:if(g.stateNode===null)throw Error(a(162));E=g.memoizedProps,Ke(g.stateNode,m!==null?m.memoizedProps:E,E);return;case 3:Z&&m!==null&&m.memoizedState.isDehydrated&&K(g.stateNode.containerInfo);return;case 12:return;case 13:Cu(g);return;case 19:Cu(g);return;case 17:return}throw Error(a(163))}switch(g.tag){case 0:case 11:case 14:case 15:vo(3,g,g.return),Yr(3,g),vo(5,g,g.return);return;case 12:return;case 13:Cu(g);return;case 19:Cu(g);return;case 3:Z&&m!==null&&m.memoizedState.isDehydrated&&K(g.stateNode.containerInfo);break;case 22:case 23:return}e:if(de){switch(g.tag){case 1:case 5:case 6:break e;case 3:case 4:g=g.stateNode,en(g.containerInfo,g.pendingChildren);break e}throw Error(a(163))}}function Cu(m){var g=m.updateQueue;if(g!==null){m.updateQueue=null;var E=m.stateNode;E===null&&(E=m.stateNode=new oc),g.forEach(function(C){var L=zx.bind(null,m,C);E.has(C)||(E.add(C),C.then(L,L))})}}function AM(m,g){for(ut=g;ut!==null;){g=ut;var E=g.deletions;if(E!==null)for(var C=0;C";case cc:return":has("+(ol(m)||"")+")";case uc:return'[role="'+m.value+'"]';case Ru:return'"'+m.value+'"';case yo:return'[data-testname="'+m.value+'"]';default:throw Error(a(365))}}function ps(m,g){var E=[];m=[m,0];for(var C=0;CL&&(L=re),C&=~F}if(C=L,C=Nr()-C,C=(120>C?120:480>C?480:1080>C?1080:1920>C?1920:3e3>C?3e3:4320>C?4320:1960*zv(C/1960))-C,10m?16:m,Oa===null)var C=!1;else{if(m=Oa,Oa=null,mc=0,(on&6)!==0)throw Error(a(331));var L=on;for(on|=4,ut=m.current;ut!==null;){var F=ut,re=F.child;if((ut.flags&16)!==0){var ye=F.deletions;if(ye!==null){for(var je=0;jeNr()-df?wo(m,0):hc|=E),Yi(m,g)}function Xv(m,g){g===0&&((m.mode&1)===0?g=1:(g=Pn,Pn<<=1,(Pn&130023424)===0&&(Pn=4194304)));var E=Cn();m=cl(m,g),m!==null&&(Hl(m,g,E),Yi(m,E))}function Fx(m){var g=m.memoizedState,E=0;g!==null&&(E=g.retryLane),Xv(m,E)}function zx(m,g){var E=0;switch(m.tag){case 13:var C=m.stateNode,L=m.memoizedState;L!==null&&(E=L.retryLane);break;case 19:C=m.stateNode;break;default:throw Error(a(314))}C!==null&&C.delete(g),Xv(m,E)}var qv;qv=function(m,g,E){if(m!==null)if(m.memoizedProps!==g.pendingProps||tn.current)Fr=!0;else{if((m.lanes&E)===0&&(g.flags&128)===0)return Fr=!1,Fp(m,g,E);Fr=(m.flags&131072)!==0}else Fr=!1,Qn&&(g.flags&1048576)!==0&&Ax(g,xp,g.index);switch(g.lanes=0,g.tag){case 2:var C=g.type;m!==null&&(m.alternate=null,g.alternate=null,g.flags|=2),m=g.pendingProps;var L=li(g,xn.current);hu(g,E),L=wu(null,g,C,m,L,E);var F=rl();return g.flags|=1,typeof L=="object"&&L!==null&&typeof L.render=="function"&&L.$$typeof===void 0?(g.tag=1,g.memoizedState=null,g.updateQueue=null,In(C)?(F=!0,Yo(g)):F=!1,g.memoizedState=L.state!==null&&L.state!==void 0?L.state:null,pu(g),L.updater=vp,g.stateNode=L,L._reactInternals=g,pv(g,C,m,E),g=ui(null,g,C,!0,F,E)):(g.tag=0,Qn&&F&&mv(g),lr(null,g,L,E),g=g.child),g;case 16:C=g.elementType;e:{switch(m!==null&&(m.alternate=null,g.alternate=null,g.flags|=2),m=g.pendingProps,L=C._init,C=L(C._payload),g.type=C,L=g.tag=TM(C),m=$i(C,m),L){case 0:g=mo(null,g,C,m,E);break e;case 1:g=ic(null,g,C,m,E);break e;case 11:g=$n(null,g,C,m,E);break e;case 14:g=Gn(null,g,C,$i(C.type,m),E);break e}throw Error(a(306,C,""))}return g;case 0:return C=g.type,L=g.pendingProps,L=g.elementType===C?L:$i(C,L),mo(m,g,C,L,E);case 1:return C=g.type,L=g.pendingProps,L=g.elementType===C?L:$i(C,L),ic(m,g,C,L,E);case 3:e:{if(ef(g),m===null)throw Error(a(387));C=g.pendingProps,F=g.memoizedState,L=F.element,dv(m,g),gp(g,C,null,E);var re=g.memoizedState;if(C=re.element,Z&&F.isDehydrated)if(F={element:C,isDehydrated:!1,cache:re.cache,transitions:re.transitions},g.updateQueue.baseState=F,g.memoizedState=F,g.flags&256){L=Error(a(423)),g=Nv(m,g,C,E,L);break e}else if(C!==L){L=Error(a(424)),g=Nv(m,g,C,E,L);break e}else for(Z&&(qr=ro(g.stateNode.containerInfo),Ci=g,Qn=!0,js=null,gu=!1),E=Cx(g,null,C,E),g.child=E;E;)E.flags=E.flags&-3|4096,E=E.sibling;else{if(vu(),C===L){g=Ki(m,g,E);break e}lr(m,g,C,E)}g=g.child}return g;case 5:return Rx(g),m===null&&tl(g),C=g.type,L=g.pendingProps,F=m!==null?m.memoizedProps:null,re=L.children,ce(C,L)?re=null:F!==null&&ce(C,F)&&(g.flags|=32),Ri(m,g),lr(m,g,re,E),g.child;case 6:return m===null&&tl(g),null;case 13:return Iv(m,g,E);case 4:return wp(g,g.stateNode.containerInfo),C=g.pendingProps,m===null?g.child=co(g,null,C,E):lr(m,g,C,E),g.child;case 11:return C=g.type,L=g.pendingProps,L=g.elementType===C?L:$i(C,L),$n(m,g,C,L,E);case 7:return lr(m,g,g.pendingProps,E),g.child;case 8:return lr(m,g,g.pendingProps.children,E),g.child;case 12:return lr(m,g,g.pendingProps.children,E),g.child;case 10:e:{if(C=g.type._context,L=g.pendingProps,F=g.memoizedProps,re=L.value,$l(g,C,re),F!==null)if(Ti(F.value,re)){if(F.children===L.children&&!tn.current){g=Ki(m,g,E);break e}}else for(F=g.child,F!==null&&(F.return=g);F!==null;){var ye=F.dependencies;if(ye!==null){re=F.child;for(var je=ye.firstContext;je!==null;){if(je.context===C){if(F.tag===1){je=ao(-1,E&-E),je.tag=2;var st=F.updateQueue;if(st!==null){st=st.shared;var St=st.pending;St===null?je.next=je:(je.next=St.next,St.next=je),st.pending=je}}F.lanes|=E,je=F.alternate,je!==null&&(je.lanes|=E),Xl(F.return,E,g),ye.lanes|=E;break}je=je.next}}else if(F.tag===10)re=F.type===g.type?null:F.child;else if(F.tag===18){if(re=F.return,re===null)throw Error(a(341));re.lanes|=E,ye=re.alternate,ye!==null&&(ye.lanes|=E),Xl(re,E,g),re=F.sibling}else re=F.child;if(re!==null)re.return=F;else for(re=F;re!==null;){if(re===g){re=null;break}if(F=re.sibling,F!==null){F.return=re.return,re=F;break}re=re.return}F=re}lr(m,g,L.children,E),g=g.child}return g;case 9:return L=g.type,C=g.pendingProps.children,hu(g,E),L=Xi(L),C=C(L),g.flags|=1,lr(m,g,C,E),g.child;case 14:return C=g.type,L=$i(C,g.pendingProps),L=$i(C.type,L),Gn(m,g,C,L,E);case 15:return po(m,g,g.type,g.pendingProps,E);case 17:return C=g.type,L=g.pendingProps,L=g.elementType===C?L:$i(C,L),m!==null&&(m.alternate=null,g.alternate=null,g.flags|=2),g.tag=1,In(C)?(m=!0,Yo(g)):m=!1,hu(g,E),Mx(g,C,L),pv(g,C,L,E),ui(null,g,C,!0,m,E);case 19:return ac(m,g,E);case 22:return Kr(m,g,E)}throw Error(a(156,g.tag))};function Wp(m,g){return Vl(m,g)}function Bx(m,g,E,C){this.tag=m,this.key=E,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=g,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=C,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function vs(m,g,E,C){return new Bx(m,g,E,C)}function $p(m){return m=m.prototype,!(!m||!m.isReactComponent)}function TM(m){if(typeof m=="function")return $p(m)?1:0;if(m!=null){if(m=m.$$typeof,m===S)return 11;if(m===M)return 14}return 2}function So(m,g){var E=m.alternate;return E===null?(E=vs(m.tag,g,m.key,m.mode),E.elementType=m.elementType,E.type=m.type,E.stateNode=m.stateNode,E.alternate=m,m.alternate=E):(E.pendingProps=g,E.type=m.type,E.flags=0,E.subtreeFlags=0,E.deletions=null),E.flags=m.flags&14680064,E.childLanes=m.childLanes,E.lanes=m.lanes,E.child=m.child,E.memoizedProps=m.memoizedProps,E.memoizedState=m.memoizedState,E.updateQueue=m.updateQueue,g=m.dependencies,E.dependencies=g===null?null:{lanes:g.lanes,firstContext:g.firstContext},E.sibling=m.sibling,E.index=m.index,E.ref=m.ref,E}function Xp(m,g,E,C,L,F){var re=2;if(C=m,typeof m=="function")$p(m)&&(re=1);else if(typeof m=="string")re=5;else e:switch(m){case d:return vc(E.children,L,F,g);case f:re=8,L|=8;break;case p:return m=vs(12,E,g,L|2),m.elementType=p,m.lanes=F,m;case w:return m=vs(13,E,g,L),m.elementType=w,m.lanes=F,m;case x:return m=vs(19,E,g,L),m.elementType=x,m.lanes=F,m;case P:return vf(E,L,F,g);default:if(typeof m=="object"&&m!==null)switch(m.$$typeof){case y:re=10;break e;case b:re=9;break e;case S:re=11;break e;case M:re=14;break e;case T:re=16,C=null;break e}throw Error(a(130,m==null?m:typeof m,""))}return g=vs(re,E,g,L),g.elementType=m,g.type=C,g.lanes=F,g}function vc(m,g,E,C){return m=vs(7,m,C,g),m.lanes=E,m}function vf(m,g,E,C){return m=vs(22,m,C,g),m.elementType=P,m.lanes=E,m.stateNode={},m}function qp(m,g,E){return m=vs(6,m,null,g),m.lanes=E,m}function Kp(m,g,E){return g=vs(4,m.children!==null?m.children:[],m.key,g),g.lanes=E,g.stateNode={containerInfo:m.containerInfo,pendingChildren:null,implementation:m.implementation},g}function Yp(m,g,E,C,L){this.tag=g,this.containerInfo=m,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=Ee,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=ap(0),this.expirationTimes=ap(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=ap(0),this.identifierPrefix=C,this.onRecoverableError=L,Z&&(this.mutableSourceEagerHydrationData=null)}function Hx(m,g,E,C,L,F,re,ye,je){return m=new Yp(m,g,E,ye,je),g===1?(g=1,F===!0&&(g|=8)):g=0,F=vs(3,null,null,g),m.current=F,F.stateNode=m,F.memoizedState={element:C,isDehydrated:E,cache:null,transitions:null},pu(F),m}function Vx(m){if(!m)return mt;m=m._reactInternals;e:{if(V(m)!==m||m.tag!==1)throw Error(a(170));var g=m;do{switch(g.tag){case 3:g=g.stateNode.context;break e;case 1:if(In(g.type)){g=g.stateNode.__reactInternalMemoizedMergedChildContext;break e}}g=g.return}while(g!==null);throw Error(a(171))}if(m.tag===1){var E=m.type;if(In(E))return ta(m,E,g)}return g}function Gx(m){var g=m._reactInternals;if(g===void 0)throw typeof m.render=="function"?Error(a(188)):(m=Object.keys(m).join(","),Error(a(268,m)));return m=X(g),m===null?null:m.stateNode}function Bs(m,g){if(m=m.memoizedState,m!==null&&m.dehydrated!==null){var E=m.retryLane;m.retryLane=E!==0&&E=st&&F>=rn&&L<=St&&re<=zt){m.splice(g,1);break}else if(C!==st||E.width!==je.width||ztre){if(!(F!==rn||E.height!==je.height||StL)){st>C&&(je.width+=st-C,je.x=C),StF&&(je.height+=rn-F,je.y=F),ztE&&(E=re)),re ")+` - -No matching component was found for: - `)+m.join(" > ")}return null},n.getPublicRootInstance=function(m){if(m=m.current,!m.child)return null;switch(m.child.tag){case 5:return ae(m.child.stateNode);default:return m.child.stateNode}},n.injectIntoDevTools=function(m){if(m={bundleType:m.bundleType,version:m.version,rendererPackageName:m.rendererPackageName,rendererConfig:m.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:o.ReactCurrentDispatcher,findHostInstanceByFiber:Zp,findFiberByHostInstance:m.findFiberByHostInstance||Wx,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.0.0-fc46dba67-20220329"},typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u")m=!1;else{var g=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(g.isDisabled||!g.supportsFiber)m=!0;else{try{Fd=g.inject(m),Ca=g}catch{}m=!!g.checkDCE}}return m},n.isAlreadyRendering=function(){return!1},n.observeVisibleRects=function(m,g,E,C){if(!Q)throw Error(a(363));m=xo(m,g);var L=rt(m,E,C).disconnect;return{disconnect:function(){L()}}},n.registerMutableSourceForHydration=function(m,g){var E=g._getVersion;E=E(g._source),m.mutableSourceEagerHydrationData==null?m.mutableSourceEagerHydrationData=[g,E]:m.mutableSourceEagerHydrationData.push(g,E)},n.runWithPriority=function(m,g){var E=un;try{return un=m,g()}finally{un=E}},n.shouldError=function(){return null},n.shouldSuspend=function(){return!1},n.updateContainer=function(m,g,E,C){var L=g.current,F=Cn(),re=ca(L);return E=Vx(E),g.context===null?g.context=E:g.pendingContext=E,g=ao(F,re),g.payload={element:m},C=C===void 0?null:C,C!==null&&(g.callback=C),Jo(L,g),m=fi(L,re,F),m!==null&&pp(m,L,re),re},n}),HA}var AU;function Mbe(){return AU||(AU=1,FA.exports=Sbe()),FA.exports}var Ebe=Mbe();const Abe=V1(Ebe);var VA={exports:{}},GA={};/** - * @license React - * scheduler.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var TU;function Tbe(){return TU||(TU=1,(function(t){function e(B,J){var Y=B.length;B.push(J);e:for(;0>>1,G=B[H];if(0>>1;Hi(ce,Y))Sei(we,ce)?(B[H]=we,B[Se]=Y,H=Se):(B[H]=ce,B[se]=Y,H=se);else if(Sei(we,Y))B[H]=we,B[Se]=Y,H=Se;else break e}}return J}function i(B,J){var Y=B.sortIndex-J.sortIndex;return Y!==0?Y:B.id-J.id}if(typeof performance=="object"&&typeof performance.now=="function"){var s=performance;t.unstable_now=function(){return s.now()}}else{var a=Date,o=a.now();t.unstable_now=function(){return a.now()-o}}var l=[],c=[],d=1,f=null,p=3,y=!1,b=!1,S=!1,w=typeof setTimeout=="function"?setTimeout:null,x=typeof clearTimeout=="function"?clearTimeout:null,M=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function T(B){for(var J=n(c);J!==null;){if(J.callback===null)r(c);else if(J.startTime<=B)r(c),J.sortIndex=J.expirationTime,e(l,J);else break;J=n(c)}}function P(B){if(S=!1,T(B),!b)if(n(l)!==null)b=!0,ae(O);else{var J=n(c);J!==null&&he(P,J.startTime-B)}}function O(B,J){b=!1,S&&(S=!1,x(z),z=-1),y=!0;var Y=p;try{for(T(J),f=n(l);f!==null&&(!(f.expirationTime>J)||B&&!j());){var H=f.callback;if(typeof H=="function"){f.callback=null,p=f.priorityLevel;var G=H(f.expirationTime<=J);J=t.unstable_now(),typeof G=="function"?f.callback=G:f===n(l)&&r(l),T(J)}else r(l);f=n(l)}if(f!==null)var le=!0;else{var se=n(c);se!==null&&he(P,se.startTime-J),le=!1}return le}finally{f=null,p=Y,y=!1}}var N=!1,D=null,z=-1,V=5,k=-1;function j(){return!(t.unstable_now()-kB||125H?(B.sortIndex=Y,e(c,B),n(l)===null&&B===n(c)&&(S?(x(z),z=-1):S=!0,he(P,Y-H))):(B.sortIndex=G,e(l,B),b||y||(b=!0,ae(O))),B},t.unstable_shouldYield=j,t.unstable_wrapCallback=function(B){var J=p;return function(){var Y=p;p=J;try{return B.apply(this,arguments)}finally{p=Y}}}})(GA)),GA}var PU;function Pbe(){return PU||(PU=1,VA.exports=Tbe()),VA.exports}var CU=Pbe();const rN={},Cbe=t=>void Object.assign(rN,t);function Rbe(t,e){function n(d,{args:f=[],attach:p,...y},b){let S=`${d[0].toUpperCase()}${d.slice(1)}`,w;if(d==="primitive"){if(y.object===void 0)throw new Error("R3F: Primitives without 'object' are invalid!");const x=y.object;w=Fm(x,{type:d,root:b,attach:p,primitive:!0})}else{const x=rN[S];if(!x)throw new Error(`R3F: ${S} is not part of the THREE namespace! Did you forget to extend? See: https://docs.pmnd.rs/react-three-fiber/api/objects#using-3rd-party-objects-declaratively`);if(!Array.isArray(f))throw new Error("R3F: The args prop must be an array!");w=Fm(new x(...f),{type:d,root:b,attach:p,memoizedProps:{args:f}})}return w.__r3f.attach===void 0&&(w.isBufferGeometry?w.__r3f.attach="geometry":w.isMaterial&&(w.__r3f.attach="material")),S!=="inject"&&XA(w,y),w}function r(d,f){let p=!1;if(f){var y,b;(y=f.__r3f)!=null&&y.attach?$A(d,f,f.__r3f.attach):f.isObject3D&&d.isObject3D&&(d.add(f),p=!0),p||(b=d.__r3f)==null||b.objects.push(f),f.__r3f||Fm(f,{}),f.__r3f.parent=d,sC(f),zm(f)}}function i(d,f,p){let y=!1;if(f){var b,S;if((b=f.__r3f)!=null&&b.attach)$A(d,f,f.__r3f.attach);else if(f.isObject3D&&d.isObject3D){f.parent=d,f.dispatchEvent({type:"added"}),d.dispatchEvent({type:"childadded",child:f});const w=d.children.filter(M=>M!==f),x=w.indexOf(p);d.children=[...w.slice(0,x),f,...w.slice(x)],y=!0}y||(S=d.__r3f)==null||S.objects.push(f),f.__r3f||Fm(f,{}),f.__r3f.parent=d,sC(f),zm(f)}}function s(d,f,p=!1){d&&[...d].forEach(y=>a(f,y,p))}function a(d,f,p){if(f){var y,b,S;if(f.__r3f&&(f.__r3f.parent=null),(y=d.__r3f)!=null&&y.objects&&(d.__r3f.objects=d.__r3f.objects.filter(P=>P!==f)),(b=f.__r3f)!=null&&b.attach)OU(d,f,f.__r3f.attach);else if(f.isObject3D&&d.isObject3D){var w;d.remove(f),(w=f.__r3f)!=null&&w.root&&Ube(Y_(f),f)}const M=(S=f.__r3f)==null?void 0:S.primitive,T=!M&&(p===void 0?f.dispose!==null:p);if(!M){var x;s((x=f.__r3f)==null?void 0:x.objects,f,T),s(f.children,f,T)}if(delete f.__r3f,T&&f.dispose&&f.type!=="Scene"){const P=()=>{try{f.dispose()}catch{}};typeof IS_REACT_ACT_ENVIRONMENT>"u"?CU.unstable_scheduleCallback(CU.unstable_IdlePriority,P):P()}zm(d)}}function o(d,f,p,y){var b;const S=(b=d.__r3f)==null?void 0:b.parent;if(!S)return;const w=n(f,p,d.__r3f.root);if(d.children){for(const x of d.children)x.__r3f&&r(w,x);d.children=d.children.filter(x=>!x.__r3f)}d.__r3f.objects.forEach(x=>r(w,x)),d.__r3f.objects=[],d.__r3f.autoRemovedBeforeAppend||a(S,d),w.parent&&(w.__r3f.autoRemovedBeforeAppend=!0),r(S,w),w.raycast&&w.__r3f.eventCount&&Y_(w).getState().internal.interaction.push(w),[y,y.alternate].forEach(x=>{x!==null&&(x.stateNode=w,x.ref&&(typeof x.ref=="function"?x.ref(w):x.ref.current=w))})}const l=()=>{};return{reconciler:Abe({createInstance:n,removeChild:a,appendChild:r,appendInitialChild:r,insertBefore:i,supportsMutation:!0,isPrimaryRenderer:!1,supportsPersistence:!1,supportsHydration:!1,noTimeout:-1,appendChildToContainer:(d,f)=>{if(!f)return;const p=d.getState().scene;p.__r3f&&(p.__r3f.root=d,r(p,f))},removeChildFromContainer:(d,f)=>{f&&a(d.getState().scene,f)},insertInContainerBefore:(d,f,p)=>{if(!f||!p)return;const y=d.getState().scene;y.__r3f&&i(y,f,p)},getRootHostContext:()=>null,getChildHostContext:d=>d,finalizeInitialChildren(d){var f;return!!((f=d==null?void 0:d.__r3f)!=null?f:{}).handlers},prepareUpdate(d,f,p,y){var b;if(((b=d==null?void 0:d.__r3f)!=null?b:{}).primitive&&y.object&&y.object!==d)return[!0];{const{args:w=[],children:x,...M}=y,{args:T=[],children:P,...O}=p;if(!Array.isArray(w))throw new Error("R3F: the args prop must be an array!");if(w.some((D,z)=>D!==T[z]))return[!0];const N=_G(d,M,O,!0);return N.changes.length?[!1,N]:null}},commitUpdate(d,[f,p],y,b,S,w){f?o(d,y,S,w):XA(d,p)},commitMount(d,f,p,y){var b;const S=(b=d.__r3f)!=null?b:{};d.raycast&&S.handlers&&S.eventCount&&Y_(d).getState().internal.interaction.push(d)},getPublicInstance:d=>d,prepareForCommit:()=>null,preparePortalMount:d=>Fm(d.getState().scene),resetAfterCommit:()=>{},shouldSetTextContent:()=>!1,clearContainer:()=>!1,hideInstance(d){var f;const{attach:p,parent:y}=(f=d.__r3f)!=null?f:{};p&&y&&OU(y,d,p),d.isObject3D&&(d.visible=!1),zm(d)},unhideInstance(d,f){var p;const{attach:y,parent:b}=(p=d.__r3f)!=null?p:{};y&&b&&$A(b,d,y),(d.isObject3D&&f.visible==null||f.visible)&&(d.visible=!0),zm(d)},createTextInstance:l,hideTextInstance:l,unhideTextInstance:l,getCurrentEventPriority:()=>e?e():Km.DefaultEventPriority,beforeActiveInstanceBlur:()=>{},afterActiveInstanceBlur:()=>{},detachDeletedInstance:()=>{},now:typeof performance<"u"&&sr.fun(performance.now)?performance.now:sr.fun(Date.now)?Date.now:()=>0,scheduleTimeout:sr.fun(setTimeout)?setTimeout:void 0,cancelTimeout:sr.fun(clearTimeout)?clearTimeout:void 0}),applyProps:XA}}var RU,NU;const WA=t=>"colorSpace"in t||"outputColorSpace"in t,mG=()=>{var t;return(t=rN.ColorManagement)!=null?t:null},gG=t=>t&&t.isOrthographicCamera,Nbe=t=>t&&t.hasOwnProperty("current"),xx=typeof window<"u"&&((RU=window.document)!=null&&RU.createElement||((NU=window.navigator)==null?void 0:NU.product)==="ReactNative")?R.useLayoutEffect:R.useEffect;function vG(t){const e=R.useRef(t);return xx(()=>void(e.current=t),[t]),e}function Ibe({set:t}){return xx(()=>(t(new Promise(()=>null)),()=>t(!1)),[t]),null}class yG extends R.Component{constructor(...e){super(...e),this.state={error:!1}}componentDidCatch(e){this.props.set(e)}render(){return this.state.error?null:this.props.children}}yG.getDerivedStateFromError=()=>({error:!0});const xG="__default",IU=new Map,kbe=t=>t&&!!t.memoized&&!!t.changes;function bG(t){var e;const n=typeof window<"u"?(e=window.devicePixelRatio)!=null?e:2:1;return Array.isArray(t)?Math.min(Math.max(t[0],n),t[1]):t}const R0=t=>{var e;return(e=t.__r3f)==null?void 0:e.root.getState()};function Y_(t){let e=t.__r3f.root;for(;e.getState().previousRoot;)e=e.getState().previousRoot;return e}const sr={obj:t=>t===Object(t)&&!sr.arr(t)&&typeof t!="function",fun:t=>typeof t=="function",str:t=>typeof t=="string",num:t=>typeof t=="number",boo:t=>typeof t=="boolean",und:t=>t===void 0,arr:t=>Array.isArray(t),equ(t,e,{arrays:n="shallow",objects:r="reference",strict:i=!0}={}){if(typeof t!=typeof e||!!t!=!!e)return!1;if(sr.str(t)||sr.num(t)||sr.boo(t))return t===e;const s=sr.obj(t);if(s&&r==="reference")return t===e;const a=sr.arr(t);if(a&&n==="reference")return t===e;if((a||s)&&t===e)return!0;let o;for(o in t)if(!(o in e))return!1;if(s&&n==="shallow"&&r==="shallow"){for(o in i?e:t)if(!sr.equ(t[o],e[o],{strict:i,objects:"reference"}))return!1}else for(o in i?e:t)if(t[o]!==e[o])return!1;if(sr.und(o)){if(a&&t.length===0&&e.length===0||s&&Object.keys(t).length===0&&Object.keys(e).length===0)return!0;if(t!==e)return!1}return!0}};function Obe(t){t.dispose&&t.type!=="Scene"&&t.dispose();for(const e in t)e.dispose==null||e.dispose(),delete t[e]}function Fm(t,e){const n=t;return n.__r3f={type:"",root:null,previousAttach:null,memoizedProps:{},eventCount:0,handlers:{},objects:[],parent:null,...e},t}function iC(t,e){let n=t;if(e.includes("-")){const r=e.split("-"),i=r.pop();return n=r.reduce((s,a)=>s[a],t),{target:n,key:i}}else return{target:n,key:e}}const kU=/-\d+$/;function $A(t,e,n){if(sr.str(n)){if(kU.test(n)){const s=n.replace(kU,""),{target:a,key:o}=iC(t,s);Array.isArray(a[o])||(a[o]=[])}const{target:r,key:i}=iC(t,n);e.__r3f.previousAttach=r[i],r[i]=e}else e.__r3f.previousAttach=n(t,e)}function OU(t,e,n){var r,i;if(sr.str(n)){const{target:s,key:a}=iC(t,n),o=e.__r3f.previousAttach;o===void 0?delete s[a]:s[a]=o}else(r=e.__r3f)==null||r.previousAttach==null||r.previousAttach(t,e);(i=e.__r3f)==null||delete i.previousAttach}function _G(t,{children:e,key:n,ref:r,...i},{children:s,key:a,ref:o,...l}={},c=!1){const d=t.__r3f,f=Object.entries(i),p=[];if(c){const b=Object.keys(l);for(let S=0;S{var w;if((w=t.__r3f)!=null&&w.primitive&&b==="object"||sr.equ(S,l[b]))return;if(/^on(Pointer|Click|DoubleClick|ContextMenu|Wheel)/.test(b))return p.push([b,S,!0,[]]);let x=[];b.includes("-")&&(x=b.split("-")),p.push([b,S,!1,x]);for(const M in i){const T=i[M];M.startsWith(`${b}-`)&&p.push([M,T,!1,M.split("-")])}});const y={...i};return d!=null&&d.memoizedProps&&d!=null&&d.memoizedProps.args&&(y.args=d.memoizedProps.args),d!=null&&d.memoizedProps&&d!=null&&d.memoizedProps.attach&&(y.attach=d.memoizedProps.attach),{memoized:y,changes:p}}function XA(t,e){var n;const r=t.__r3f,i=r==null?void 0:r.root,s=i==null||i.getState==null?void 0:i.getState(),{memoized:a,changes:o}=kbe(e)?e:_G(t,e),l=r==null?void 0:r.eventCount;t.__r3f&&(t.__r3f.memoizedProps=a);for(let p=0;pT[P],t),!(M&&M.set))){const[T,...P]=w.reverse();x=P.reverse().reduce((O,N)=>O[N],t),y=T}if(b===xG+"remove")if(x.constructor){let T=IU.get(x.constructor);T||(T=new x.constructor,IU.set(x.constructor,T)),b=T[y]}else b=0;if(S&&r)b?r.handlers[y]=b:delete r.handlers[y],r.eventCount=Object.keys(r.handlers).length;else if(M&&M.set&&(M.copy||M instanceof Ch)){if(Array.isArray(b))M.fromArray?M.fromArray(b):M.set(...b);else if(M.copy&&b&&b.constructor&&M.constructor===b.constructor)M.copy(b);else if(b!==void 0){var c;const T=(c=M)==null?void 0:c.isColor;!T&&M.setScalar?M.setScalar(b):M instanceof Ch&&b instanceof Ch?M.mask=b.mask:M.set(b),!mG()&&s&&!s.linear&&T&&M.convertSRGBToLinear()}}else{var d;if(x[y]=b,(d=x[y])!=null&&d.isTexture&&x[y].format===ss&&x[y].type===Ho&&s){const T=x[y];WA(T)&&WA(s.gl)?T.colorSpace=s.gl.outputColorSpace:T.encoding=s.gl.outputEncoding}}zm(t)}if(r&&r.parent&&t.raycast&&l!==r.eventCount){const p=Y_(t).getState().internal,y=p.interaction.indexOf(t);y>-1&&p.interaction.splice(y,1),r.eventCount&&p.interaction.push(t)}return!(o.length===1&&o[0][0]==="onUpdate")&&o.length&&(n=t.__r3f)!=null&&n.parent&&sC(t),t}function zm(t){var e,n;const r=(e=t.__r3f)==null||(n=e.root)==null||n.getState==null?void 0:n.getState();r&&r.internal.frames===0&&r.invalidate()}function sC(t){t.onUpdate==null||t.onUpdate(t)}function Lbe(t,e){t.manual||(gG(t)?(t.left=e.width/-2,t.right=e.width/2,t.top=e.height/2,t.bottom=e.height/-2):t.aspect=e.width/e.height,t.updateProjectionMatrix(),t.updateMatrixWorld())}function N_(t){return(t.eventObject||t.object).uuid+"/"+t.index+t.instanceId}function Dbe(){var t;const e=typeof self<"u"&&self||typeof window<"u"&&window;if(!e)return Km.DefaultEventPriority;switch((t=e.event)==null?void 0:t.type){case"click":case"contextmenu":case"dblclick":case"pointercancel":case"pointerdown":case"pointerup":return Km.DiscreteEventPriority;case"pointermove":case"pointerout":case"pointerover":case"pointerenter":case"pointerleave":case"wheel":return Km.ContinuousEventPriority;default:return Km.DefaultEventPriority}}function wG(t,e,n,r){const i=n.get(e);i&&(n.delete(e),n.size===0&&(t.delete(r),i.target.releasePointerCapture(r)))}function Ube(t,e){const{internal:n}=t.getState();n.interaction=n.interaction.filter(r=>r!==e),n.initialHits=n.initialHits.filter(r=>r!==e),n.hovered.forEach((r,i)=>{(r.eventObject===e||r.object===e)&&n.hovered.delete(i)}),n.capturedMap.forEach((r,i)=>{wG(n.capturedMap,e,r,i)})}function jbe(t){function e(l){const{internal:c}=t.getState(),d=l.offsetX-c.initialClick[0],f=l.offsetY-c.initialClick[1];return Math.round(Math.sqrt(d*d+f*f))}function n(l){return l.filter(c=>["Move","Over","Enter","Out","Leave"].some(d=>{var f;return(f=c.__r3f)==null?void 0:f.handlers["onPointer"+d]}))}function r(l,c){const d=t.getState(),f=new Set,p=[],y=c?c(d.internal.interaction):d.internal.interaction;for(let x=0;x{const T=R0(x.object),P=R0(M.object);return!T||!P?x.distance-M.distance:P.events.priority-T.events.priority||x.distance-M.distance}).filter(x=>{const M=N_(x);return f.has(M)?!1:(f.add(M),!0)});d.events.filter&&(S=d.events.filter(S,d));for(const x of S){let M=x.object;for(;M;){var w;(w=M.__r3f)!=null&&w.eventCount&&p.push({...x,eventObject:M}),M=M.parent}}if("pointerId"in l&&d.internal.capturedMap.has(l.pointerId))for(let x of d.internal.capturedMap.get(l.pointerId).values())f.has(N_(x.intersection))||p.push(x.intersection);return p}function i(l,c,d,f){const p=t.getState();if(l.length){const y={stopped:!1};for(const b of l){const S=R0(b.object)||p,{raycaster:w,pointer:x,camera:M,internal:T}=S,P=new q(x.x,x.y,0).unproject(M),O=k=>{var j,X;return(j=(X=T.capturedMap.get(k))==null?void 0:X.has(b.eventObject))!=null?j:!1},N=k=>{const j={intersection:b,target:c.target};T.capturedMap.has(k)?T.capturedMap.get(k).set(b.eventObject,j):T.capturedMap.set(k,new Map([[b.eventObject,j]])),c.target.setPointerCapture(k)},D=k=>{const j=T.capturedMap.get(k);j&&wG(T.capturedMap,b.eventObject,j,k)};let z={};for(let k in c){let j=c[k];typeof j!="function"&&(z[k]=j)}let V={...b,...z,pointer:x,intersections:l,stopped:y.stopped,delta:d,unprojectedPoint:P,ray:w.ray,camera:M,stopPropagation(){const k="pointerId"in c&&T.capturedMap.get(c.pointerId);if((!k||k.has(b.eventObject))&&(V.stopped=y.stopped=!0,T.hovered.size&&Array.from(T.hovered.values()).find(j=>j.eventObject===b.eventObject))){const j=l.slice(0,l.indexOf(b));s([...j,b])}},target:{hasPointerCapture:O,setPointerCapture:N,releasePointerCapture:D},currentTarget:{hasPointerCapture:O,setPointerCapture:N,releasePointerCapture:D},nativeEvent:c};if(f(V),y.stopped===!0)break}}return l}function s(l){const{internal:c}=t.getState();for(const d of c.hovered.values())if(!l.length||!l.find(f=>f.object===d.object&&f.index===d.index&&f.instanceId===d.instanceId)){const p=d.eventObject.__r3f,y=p==null?void 0:p.handlers;if(c.hovered.delete(N_(d)),p!=null&&p.eventCount){const b={...d,intersections:l};y.onPointerOut==null||y.onPointerOut(b),y.onPointerLeave==null||y.onPointerLeave(b)}}}function a(l,c){for(let d=0;ds([]);case"onLostPointerCapture":return c=>{const{internal:d}=t.getState();"pointerId"in c&&d.capturedMap.has(c.pointerId)&&requestAnimationFrame(()=>{d.capturedMap.has(c.pointerId)&&(d.capturedMap.delete(c.pointerId),s([]))})}}return function(d){const{onPointerMissed:f,internal:p}=t.getState();p.lastEvent.current=d;const y=l==="onPointerMove",b=l==="onClick"||l==="onContextMenu"||l==="onDoubleClick",w=r(d,y?n:void 0),x=b?e(d):0;l==="onPointerDown"&&(p.initialClick=[d.offsetX,d.offsetY],p.initialHits=w.map(T=>T.eventObject)),b&&!w.length&&x<=2&&(a(d,p.interaction),f&&f(d)),y&&s(w);function M(T){const P=T.eventObject,O=P.__r3f,N=O==null?void 0:O.handlers;if(O!=null&&O.eventCount)if(y){if(N.onPointerOver||N.onPointerEnter||N.onPointerOut||N.onPointerLeave){const D=N_(T),z=p.hovered.get(D);z?z.stopped&&T.stopPropagation():(p.hovered.set(D,T),N.onPointerOver==null||N.onPointerOver(T),N.onPointerEnter==null||N.onPointerEnter(T))}N.onPointerMove==null||N.onPointerMove(T)}else{const D=N[l];D?(!b||p.initialHits.includes(P))&&(a(d,p.interaction.filter(z=>!p.initialHits.includes(z))),D(T)):b&&p.initialHits.includes(P)&&a(d,p.interaction.filter(z=>!p.initialHits.includes(z)))}}i(w,d,x,M)}}return{handlePointer:o}}const SG=t=>!!(t!=null&&t.render),MG=R.createContext(null),Fbe=(t,e)=>{const n=bbe((o,l)=>{const c=new q,d=new q,f=new q;function p(x=l().camera,M=d,T=l().size){const{width:P,height:O,top:N,left:D}=T,z=P/O;M.isVector3?f.copy(M):f.set(...M);const V=x.getWorldPosition(c).distanceTo(f);if(gG(x))return{width:P/x.zoom,height:O/x.zoom,top:N,left:D,factor:1,distance:V,aspect:z};{const k=x.fov*Math.PI/180,j=2*Math.tan(k/2)*V,X=j*(P/O);return{width:X,height:j,top:N,left:D,factor:P/X,distance:V,aspect:z}}}let y;const b=x=>o(M=>({performance:{...M.performance,current:x}})),S=new He;return{set:o,get:l,gl:null,camera:null,raycaster:null,events:{priority:1,enabled:!0,connected:!1},xr:null,scene:null,invalidate:(x=1)=>t(l(),x),advance:(x,M)=>e(x,M,l()),legacy:!1,linear:!1,flat:!1,controls:null,clock:new QR,pointer:S,mouse:S,frameloop:"always",onPointerMissed:void 0,performance:{current:1,min:.5,max:1,debounce:200,regress:()=>{const x=l();y&&clearTimeout(y),x.performance.current!==x.performance.min&&b(x.performance.min),y=setTimeout(()=>b(l().performance.max),x.performance.debounce)}},size:{width:0,height:0,top:0,left:0,updateStyle:!1},viewport:{initialDpr:0,dpr:0,width:0,height:0,top:0,left:0,aspect:0,distance:0,factor:0,getCurrentViewport:p},setEvents:x=>o(M=>({...M,events:{...M.events,...x}})),setSize:(x,M,T,P,O)=>{const N=l().camera,D={width:x,height:M,top:P||0,left:O||0,updateStyle:T};o(z=>({size:D,viewport:{...z.viewport,...p(N,d,D)}}))},setDpr:x=>o(M=>{const T=bG(x);return{viewport:{...M.viewport,dpr:T,initialDpr:M.viewport.initialDpr||T}}}),setFrameloop:(x="always")=>{const M=l().clock;M.stop(),M.elapsedTime=0,x!=="never"&&(M.start(),M.elapsedTime=0),o(()=>({frameloop:x}))},previousRoot:void 0,internal:{active:!1,priority:0,frames:0,lastEvent:R.createRef(),interaction:[],hovered:new Map,subscribers:[],initialClick:[0,0],initialHits:[],capturedMap:new Map,subscribe:(x,M,T)=>{const P=l().internal;return P.priority=P.priority+(M>0?1:0),P.subscribers.push({ref:x,priority:M,store:T}),P.subscribers=P.subscribers.sort((O,N)=>O.priority-N.priority),()=>{const O=l().internal;O!=null&&O.subscribers&&(O.priority=O.priority-(M>0?1:0),O.subscribers=O.subscribers.filter(N=>N.ref!==x))}}}}}),r=n.getState();let i=r.size,s=r.viewport.dpr,a=r.camera;return n.subscribe(()=>{const{camera:o,size:l,viewport:c,gl:d,set:f}=n.getState();if(l.width!==i.width||l.height!==i.height||c.dpr!==s){var p;i=l,s=c.dpr,Lbe(o,l),d.setPixelRatio(c.dpr);const y=(p=l.updateStyle)!=null?p:typeof HTMLCanvasElement<"u"&&d.domElement instanceof HTMLCanvasElement;d.setSize(l.width,l.height,y)}o!==a&&(a=o,f(y=>({viewport:{...y.viewport,...y.viewport.getCurrentViewport(o)}})))}),n.subscribe(o=>t(o)),n};let I_,zbe=new Set,Bbe=new Set,Hbe=new Set;function qA(t,e){if(t.size)for(const{callback:n}of t.values())n(e)}function N0(t,e){switch(t){case"before":return qA(zbe,e);case"after":return qA(Bbe,e);case"tail":return qA(Hbe,e)}}let KA,YA;function ZA(t,e,n){let r=e.clock.getDelta();for(e.frameloop==="never"&&typeof t=="number"&&(r=t-e.clock.elapsedTime,e.clock.oldTime=e.clock.elapsedTime,e.clock.elapsedTime=t),KA=e.internal.subscribers,I_=0;I_0)&&!((d=s.gl.xr)!=null&&d.isPresenting)&&(r+=ZA(c,s))}if(n=!1,N0("after",c),r===0)return N0("tail",c),e=!1,cancelAnimationFrame(i)}function o(c,d=1){var f;if(!c)return t.forEach(p=>o(p.store.getState(),d));(f=c.gl.xr)!=null&&f.isPresenting||!c.internal.active||c.frameloop==="never"||(d>1?c.internal.frames=Math.min(60,c.internal.frames+d):n?c.internal.frames=2:c.internal.frames=1,e||(e=!0,requestAnimationFrame(a)))}function l(c,d=!0,f,p){if(d&&N0("before",c),f)ZA(c,f,p);else for(const y of t.values())ZA(c,y.store.getState());d&&N0("after",c)}return{loop:a,invalidate:o,advance:l}}function EG(){const t=R.useContext(MG);if(!t)throw new Error("R3F: Hooks can only be used within the Canvas component!");return t}function ed(t=n=>n,e){return EG()(t,e)}function AG(t,e=0){const n=EG(),r=n.getState().internal.subscribe,i=vG(t);return xx(()=>r(i,e,n),[e,r,n]),null}const zg=new Map,{invalidate:LU,advance:DU}=Vbe(zg),{reconciler:j1,applyProps:Nm}=Rbe(zg,Dbe),Im={objects:"shallow",strict:!1},Gbe=(t,e)=>{const n=typeof t=="function"?t(e):t;return SG(n)?n:new E6({powerPreference:"high-performance",canvas:e,antialias:!0,alpha:!0,...t})};function Wbe(t,e){const n=typeof HTMLCanvasElement<"u"&&t instanceof HTMLCanvasElement;if(e){const{width:r,height:i,top:s,left:a,updateStyle:o=n}=e;return{width:r,height:i,top:s,left:a,updateStyle:o}}else if(typeof HTMLCanvasElement<"u"&&t instanceof HTMLCanvasElement&&t.parentElement){const{width:r,height:i,top:s,left:a}=t.parentElement.getBoundingClientRect();return{width:r,height:i,top:s,left:a,updateStyle:n}}else if(typeof OffscreenCanvas<"u"&&t instanceof OffscreenCanvas)return{width:t.width,height:t.height,top:0,left:0,updateStyle:n};return{width:0,height:0,top:0,left:0}}function $be(t){const e=zg.get(t),n=e==null?void 0:e.fiber,r=e==null?void 0:e.store;e&&console.warn("R3F.createRoot should only be called once!");const i=typeof reportError=="function"?reportError:console.error,s=r||Fbe(LU,DU),a=n||j1.createContainer(s,Km.ConcurrentRoot,null,!1,null,"",i,null);e||zg.set(t,{fiber:a,store:s});let o,l=!1,c;return{configure(d={}){let{gl:f,size:p,scene:y,events:b,onCreated:S,shadows:w=!1,linear:x=!1,flat:M=!1,legacy:T=!1,orthographic:P=!1,frameloop:O="always",dpr:N=[1,2],performance:D,raycaster:z,camera:V,onPointerMissed:k}=d,j=s.getState(),X=j.gl;j.gl||j.set({gl:X=Gbe(f,t)});let ee=j.raycaster;ee||j.set({raycaster:ee=new fG});const{params:ie,...pe}=z||{};if(sr.equ(pe,ee,Im)||Nm(ee,{...pe}),sr.equ(ie,ee.params,Im)||Nm(ee,{params:{...ee.params,...ie}}),!j.camera||j.camera===c&&!sr.equ(c,V,Im)){c=V;const Y=V instanceof fx,H=Y?V:P?new Gc(0,0,0,0,.1,1e3):new Pr(75,0,.1,1e3);Y||(H.position.z=5,V&&(Nm(H,V),("aspect"in V||"left"in V||"right"in V||"bottom"in V||"top"in V)&&(H.manual=!0,H.updateProjectionMatrix())),!j.camera&&!(V!=null&&V.rotation)&&H.lookAt(0,0,0)),j.set({camera:H}),ee.camera=H}if(!j.scene){let Y;y!=null&&y.isScene?Y=y:(Y=new IR,y&&Nm(Y,y)),j.set({scene:Fm(Y)})}if(!j.xr){var ae;const Y=(le,se)=>{const ce=s.getState();ce.frameloop!=="never"&&DU(le,!0,ce,se)},H=()=>{const le=s.getState();le.gl.xr.enabled=le.gl.xr.isPresenting,le.gl.xr.setAnimationLoop(le.gl.xr.isPresenting?Y:null),le.gl.xr.isPresenting||LU(le)},G={connect(){const le=s.getState().gl;le.xr.addEventListener("sessionstart",H),le.xr.addEventListener("sessionend",H)},disconnect(){const le=s.getState().gl;le.xr.removeEventListener("sessionstart",H),le.xr.removeEventListener("sessionend",H)}};typeof((ae=X.xr)==null?void 0:ae.addEventListener)=="function"&&G.connect(),j.set({xr:G})}if(X.shadowMap){const Y=X.shadowMap.enabled,H=X.shadowMap.type;if(X.shadowMap.enabled=!!w,sr.boo(w))X.shadowMap.type=Y0;else if(sr.str(w)){var he;const G={basic:_V,percentage:BS,soft:Y0,variance:Oo};X.shadowMap.type=(he=G[w])!=null?he:Y0}else sr.obj(w)&&Object.assign(X.shadowMap,w);(Y!==X.shadowMap.enabled||H!==X.shadowMap.type)&&(X.shadowMap.needsUpdate=!0)}const B=mG();B&&("enabled"in B?B.enabled=!T:"legacyMode"in B&&(B.legacyMode=T)),l||Nm(X,{outputEncoding:x?3e3:3001,toneMapping:M?Tl:uR}),j.legacy!==T&&j.set(()=>({legacy:T})),j.linear!==x&&j.set(()=>({linear:x})),j.flat!==M&&j.set(()=>({flat:M})),f&&!sr.fun(f)&&!SG(f)&&!sr.equ(f,X,Im)&&Nm(X,f),b&&!j.events.handlers&&j.set({events:b(s)});const J=Wbe(t,p);return sr.equ(J,j.size,Im)||j.setSize(J.width,J.height,J.updateStyle,J.top,J.left),N&&j.viewport.dpr!==bG(N)&&j.setDpr(N),j.frameloop!==O&&j.setFrameloop(O),j.onPointerMissed||j.set({onPointerMissed:k}),D&&!sr.equ(D,j.performance,Im)&&j.set(Y=>({performance:{...Y.performance,...D}})),o=S,l=!0,this},render(d){return l||this.configure(),j1.updateContainer(v.jsx(Xbe,{store:s,children:d,onCreated:o,rootElement:t}),a,null,()=>{}),s},unmount(){TG(t)}}}function Xbe({store:t,children:e,onCreated:n,rootElement:r}){return xx(()=>{const i=t.getState();i.set(s=>({internal:{...s.internal,active:!0}})),n&&n(i),t.getState().events.connected||i.events.connect==null||i.events.connect(r)},[]),v.jsx(MG.Provider,{value:t,children:e})}function TG(t,e){const n=zg.get(t),r=n==null?void 0:n.fiber;if(r){const i=n==null?void 0:n.store.getState();i&&(i.internal.active=!1),j1.updateContainer(null,r,null,()=>{i&&setTimeout(()=>{try{var s,a,o,l;i.events.disconnect==null||i.events.disconnect(),(s=i.gl)==null||(a=s.renderLists)==null||a.dispose==null||a.dispose(),(o=i.gl)==null||o.forceContextLoss==null||o.forceContextLoss(),(l=i.gl)!=null&&l.xr&&i.xr.disconnect(),Obe(i),zg.delete(t)}catch{}},500)})}}j1.injectIntoDevTools({bundleType:0,rendererPackageName:"@react-three/fiber",version:R.version});const QA={onClick:["click",!1],onContextMenu:["contextmenu",!1],onDoubleClick:["dblclick",!1],onWheel:["wheel",!0],onPointerDown:["pointerdown",!0],onPointerUp:["pointerup",!0],onPointerLeave:["pointerleave",!0],onPointerMove:["pointermove",!0],onPointerCancel:["pointercancel",!0],onLostPointerCapture:["lostpointercapture",!0]};function qbe(t){const{handlePointer:e}=jbe(t);return{priority:1,enabled:!0,compute(n,r,i){r.pointer.set(n.offsetX/r.size.width*2-1,-(n.offsetY/r.size.height)*2+1),r.raycaster.setFromCamera(r.pointer,r.camera)},connected:void 0,handlers:Object.keys(QA).reduce((n,r)=>({...n,[r]:e(r)}),{}),update:()=>{var n;const{events:r,internal:i}=t.getState();(n=i.lastEvent)!=null&&n.current&&r.handlers&&r.handlers.onPointerMove(i.lastEvent.current)},connect:n=>{var r;const{set:i,events:s}=t.getState();s.disconnect==null||s.disconnect(),i(a=>({events:{...a.events,connected:n}})),Object.entries((r=s.handlers)!=null?r:[]).forEach(([a,o])=>{const[l,c]=QA[a];n.addEventListener(l,o,{passive:c})})},disconnect:()=>{const{set:n,events:r}=t.getState();if(r.connected){var i;Object.entries((i=r.handlers)!=null?i:[]).forEach(([s,a])=>{if(r&&r.connected instanceof HTMLElement){const[o]=QA[s];r.connected.removeEventListener(o,a)}}),n(s=>({events:{...s.events,connected:void 0}}))}}}}function UU(t,e){let n;return(...r)=>{window.clearTimeout(n),n=window.setTimeout(()=>t(...r),e)}}function Kbe({debounce:t,scroll:e,polyfill:n,offsetSize:r}={debounce:0,scroll:!1,offsetSize:!1}){const i=n||(typeof window>"u"?class{}:window.ResizeObserver);if(!i)throw new Error("This browser does not support ResizeObserver out of the box. See: https://github.com/react-spring/react-use-measure/#resize-observer-polyfills");const[s,a]=R.useState({left:0,top:0,width:0,height:0,bottom:0,right:0,x:0,y:0}),o=R.useRef({element:null,scrollContainers:null,resizeObserver:null,lastBounds:s,orientationHandler:null}),l=t?typeof t=="number"?t:t.scroll:null,c=t?typeof t=="number"?t:t.resize:null,d=R.useRef(!1);R.useEffect(()=>(d.current=!0,()=>void(d.current=!1)));const[f,p,y]=R.useMemo(()=>{const x=()=>{if(!o.current.element)return;const{left:M,top:T,width:P,height:O,bottom:N,right:D,x:z,y:V}=o.current.element.getBoundingClientRect(),k={left:M,top:T,width:P,height:O,bottom:N,right:D,x:z,y:V};o.current.element instanceof HTMLElement&&r&&(k.height=o.current.element.offsetHeight,k.width=o.current.element.offsetWidth),Object.freeze(k),d.current&&!Jbe(o.current.lastBounds,k)&&a(o.current.lastBounds=k)};return[x,c?UU(x,c):x,l?UU(x,l):x]},[a,r,l,c]);function b(){o.current.scrollContainers&&(o.current.scrollContainers.forEach(x=>x.removeEventListener("scroll",y,!0)),o.current.scrollContainers=null),o.current.resizeObserver&&(o.current.resizeObserver.disconnect(),o.current.resizeObserver=null),o.current.orientationHandler&&("orientation"in screen&&"removeEventListener"in screen.orientation?screen.orientation.removeEventListener("change",o.current.orientationHandler):"onorientationchange"in window&&window.removeEventListener("orientationchange",o.current.orientationHandler))}function S(){o.current.element&&(o.current.resizeObserver=new i(y),o.current.resizeObserver.observe(o.current.element),e&&o.current.scrollContainers&&o.current.scrollContainers.forEach(x=>x.addEventListener("scroll",y,{capture:!0,passive:!0})),o.current.orientationHandler=()=>{y()},"orientation"in screen&&"addEventListener"in screen.orientation?screen.orientation.addEventListener("change",o.current.orientationHandler):"onorientationchange"in window&&window.addEventListener("orientationchange",o.current.orientationHandler))}const w=x=>{!x||x===o.current.element||(b(),o.current.element=x,o.current.scrollContainers=PG(x),S())};return Zbe(y,!!e),Ybe(p),R.useEffect(()=>{b(),S()},[e,y,p]),R.useEffect(()=>b,[]),[w,s,f]}function Ybe(t){R.useEffect(()=>{const e=t;return window.addEventListener("resize",e),()=>void window.removeEventListener("resize",e)},[t])}function Zbe(t,e){R.useEffect(()=>{if(e){const n=t;return window.addEventListener("scroll",n,{capture:!0,passive:!0}),()=>void window.removeEventListener("scroll",n,!0)}},[t,e])}function PG(t){const e=[];if(!t||t===document.body)return e;const{overflow:n,overflowX:r,overflowY:i}=window.getComputedStyle(t);return[n,r,i].some(s=>s==="auto"||s==="scroll")&&e.push(t),[...e,...PG(t.parentElement)]}const Qbe=["x","y","top","bottom","left","right","width","height"],Jbe=(t,e)=>Qbe.every(n=>t[n]===e[n]);var e_e=Object.defineProperty,t_e=Object.defineProperties,n_e=Object.getOwnPropertyDescriptors,jU=Object.getOwnPropertySymbols,r_e=Object.prototype.hasOwnProperty,i_e=Object.prototype.propertyIsEnumerable,FU=(t,e,n)=>e in t?e_e(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,zU=(t,e)=>{for(var n in e||(e={}))r_e.call(e,n)&&FU(t,n,e[n]);if(jU)for(var n of jU(e))i_e.call(e,n)&&FU(t,n,e[n]);return t},s_e=(t,e)=>t_e(t,n_e(e)),BU,HU;typeof window<"u"&&((BU=window.document)!=null&&BU.createElement||((HU=window.navigator)==null?void 0:HU.product)==="ReactNative")?R.useLayoutEffect:R.useEffect;function CG(t,e,n){if(!t)return;if(n(t)===!0)return t;let r=t.child;for(;r;){const i=CG(r,e,n);if(i)return i;r=r.sibling}}function RG(t){try{return Object.defineProperties(t,{_currentRenderer:{get(){return null},set(){}},_currentRenderer2:{get(){return null},set(){}}})}catch{return t}}const VU=console.error;console.error=function(){const t=[...arguments].join("");if(t!=null&&t.startsWith("Warning:")&&t.includes("useContext")){console.error=VU;return}return VU.apply(this,arguments)};const iN=RG(R.createContext(null));class NG extends R.Component{render(){return R.createElement(iN.Provider,{value:this._reactInternals},this.props.children)}}function a_e(){const t=R.useContext(iN);if(t===null)throw new Error("its-fine: useFiber must be called within a !");const e=R.useId();return R.useMemo(()=>{for(const r of[t,t==null?void 0:t.alternate]){if(!r)continue;const i=CG(r,!1,s=>{let a=s.memoizedState;for(;a;){if(a.memoizedState===e)return!0;a=a.next}});if(i)return i}},[t,e])}function o_e(){const t=a_e(),[e]=R.useState(()=>new Map);e.clear();let n=t;for(;n;){if(n.type&&typeof n.type=="object"){const i=n.type._context===void 0&&n.type.Provider===n.type?n.type:n.type._context;i&&i!==iN&&!e.has(i)&&e.set(i,R.useContext(RG(i)))}n=n.return}return e}function l_e(){const t=o_e();return R.useMemo(()=>Array.from(t.keys()).reduce((e,n)=>r=>R.createElement(e,null,R.createElement(n.Provider,s_e(zU({},r),{value:t.get(n)}))),e=>R.createElement(NG,zU({},e))),[t])}const c_e=R.forwardRef(function({children:e,fallback:n,resize:r,style:i,gl:s,events:a=qbe,eventSource:o,eventPrefix:l,shadows:c,linear:d,flat:f,legacy:p,orthographic:y,frameloop:b,dpr:S,performance:w,raycaster:x,camera:M,scene:T,onPointerMissed:P,onCreated:O,...N},D){R.useMemo(()=>Cbe(mbe),[]);const z=l_e(),[V,k]=Kbe({scroll:!0,debounce:{scroll:50,resize:0},...r}),j=R.useRef(null),X=R.useRef(null);R.useImperativeHandle(D,()=>j.current);const ee=vG(P),[ie,pe]=R.useState(!1),[ae,he]=R.useState(!1);if(ie)throw ie;if(ae)throw ae;const B=R.useRef(null);xx(()=>{const Y=j.current;k.width>0&&k.height>0&&Y&&(B.current||(B.current=$be(Y)),B.current.configure({gl:s,events:a,shadows:c,linear:d,flat:f,legacy:p,orthographic:y,frameloop:b,dpr:S,performance:w,raycaster:x,camera:M,scene:T,size:k,onPointerMissed:(...H)=>ee.current==null?void 0:ee.current(...H),onCreated:H=>{H.events.connect==null||H.events.connect(o?Nbe(o)?o.current:o:X.current),l&&H.setEvents({compute:(G,le)=>{const se=G[l+"X"],ce=G[l+"Y"];le.pointer.set(se/le.size.width*2-1,-(ce/le.size.height)*2+1),le.raycaster.setFromCamera(le.pointer,le.camera)}}),O==null||O(H)}}),B.current.render(v.jsx(z,{children:v.jsx(yG,{set:he,children:v.jsx(R.Suspense,{fallback:v.jsx(Ibe,{set:pe}),children:e??null})})})))}),R.useEffect(()=>{const Y=j.current;if(Y)return()=>TG(Y)},[]);const J=o?"none":"auto";return v.jsx("div",{ref:X,style:{position:"relative",width:"100%",height:"100%",overflow:"hidden",pointerEvents:J,...i},...N,children:v.jsx("div",{ref:V,style:{width:"100%",height:"100%"},children:v.jsx("canvas",{ref:j,style:{display:"block"},children:n})})})}),u_e=R.forwardRef(function(e,n){return v.jsx(NG,{children:v.jsx(c_e,{...e,ref:n})})});function aC(){return aC=Object.assign?Object.assign.bind():function(t){for(var e=1;ee in t?d_e(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,h_e=(t,e,n)=>(f_e(t,e+"",n),n);class p_e{constructor(){h_e(this,"_listeners")}addEventListener(e,n){this._listeners===void 0&&(this._listeners={});const r=this._listeners;r[e]===void 0&&(r[e]=[]),r[e].indexOf(n)===-1&&r[e].push(n)}hasEventListener(e,n){if(this._listeners===void 0)return!1;const r=this._listeners;return r[e]!==void 0&&r[e].indexOf(n)!==-1}removeEventListener(e,n){if(this._listeners===void 0)return;const i=this._listeners[e];if(i!==void 0){const s=i.indexOf(n);s!==-1&&i.splice(s,1)}}dispatchEvent(e){if(this._listeners===void 0)return;const r=this._listeners[e.type];if(r!==void 0){e.target=this;const i=r.slice(0);for(let s=0,a=i.length;se in t?m_e(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,Wt=(t,e,n)=>(g_e(t,typeof e!="symbol"?e+"":e,n),n);const k_=new ep,GU=new Rc,v_e=Math.cos(70*(Math.PI/180)),WU=(t,e)=>(t%e+e)%e;let y_e=class extends p_e{constructor(e,n){super(),Wt(this,"object"),Wt(this,"domElement"),Wt(this,"enabled",!0),Wt(this,"target",new q),Wt(this,"minDistance",0),Wt(this,"maxDistance",1/0),Wt(this,"minZoom",0),Wt(this,"maxZoom",1/0),Wt(this,"minPolarAngle",0),Wt(this,"maxPolarAngle",Math.PI),Wt(this,"minAzimuthAngle",-1/0),Wt(this,"maxAzimuthAngle",1/0),Wt(this,"enableDamping",!1),Wt(this,"dampingFactor",.05),Wt(this,"enableZoom",!0),Wt(this,"zoomSpeed",1),Wt(this,"enableRotate",!0),Wt(this,"rotateSpeed",1),Wt(this,"enablePan",!0),Wt(this,"panSpeed",1),Wt(this,"screenSpacePanning",!0),Wt(this,"keyPanSpeed",7),Wt(this,"zoomToCursor",!1),Wt(this,"autoRotate",!1),Wt(this,"autoRotateSpeed",2),Wt(this,"reverseOrbit",!1),Wt(this,"reverseHorizontalOrbit",!1),Wt(this,"reverseVerticalOrbit",!1),Wt(this,"keys",{LEFT:"ArrowLeft",UP:"ArrowUp",RIGHT:"ArrowRight",BOTTOM:"ArrowDown"}),Wt(this,"mouseButtons",{LEFT:Kf.ROTATE,MIDDLE:Kf.DOLLY,RIGHT:Kf.PAN}),Wt(this,"touches",{ONE:Yf.ROTATE,TWO:Yf.DOLLY_PAN}),Wt(this,"target0"),Wt(this,"position0"),Wt(this,"zoom0"),Wt(this,"_domElementKeyEvents",null),Wt(this,"getPolarAngle"),Wt(this,"getAzimuthalAngle"),Wt(this,"setPolarAngle"),Wt(this,"setAzimuthalAngle"),Wt(this,"getDistance"),Wt(this,"getZoomScale"),Wt(this,"listenToKeyEvents"),Wt(this,"stopListenToKeyEvents"),Wt(this,"saveState"),Wt(this,"reset"),Wt(this,"update"),Wt(this,"connect"),Wt(this,"dispose"),Wt(this,"dollyIn"),Wt(this,"dollyOut"),Wt(this,"getScale"),Wt(this,"setScale"),this.object=e,this.domElement=n,this.target0=this.target.clone(),this.position0=this.object.position.clone(),this.zoom0=this.object.zoom,this.getPolarAngle=()=>d.phi,this.getAzimuthalAngle=()=>d.theta,this.setPolarAngle=fe=>{let qe=WU(fe,2*Math.PI),ue=d.phi;ue<0&&(ue+=2*Math.PI),qe<0&&(qe+=2*Math.PI);let Ye=Math.abs(qe-ue);2*Math.PI-Ye{let qe=WU(fe,2*Math.PI),ue=d.theta;ue<0&&(ue+=2*Math.PI),qe<0&&(qe+=2*Math.PI);let Ye=Math.abs(qe-ue);2*Math.PI-Yer.object.position.distanceTo(r.target),this.listenToKeyEvents=fe=>{fe.addEventListener("keydown",ht),this._domElementKeyEvents=fe},this.stopListenToKeyEvents=()=>{this._domElementKeyEvents.removeEventListener("keydown",ht),this._domElementKeyEvents=null},this.saveState=()=>{r.target0.copy(r.target),r.position0.copy(r.object.position),r.zoom0=r.object.zoom},this.reset=()=>{r.target.copy(r.target0),r.object.position.copy(r.position0),r.object.zoom=r.zoom0,r.object.updateProjectionMatrix(),r.dispatchEvent(i),r.update(),l=o.NONE},this.update=(()=>{const fe=new q,qe=new q(0,1,0),ue=new qt().setFromUnitVectors(e.up,qe),Ye=ue.clone().invert(),Re=new q,Be=new qt,at=2*Math.PI;return function(){const Jt=r.object.position;ue.setFromUnitVectors(e.up,qe),Ye.copy(ue).invert(),fe.copy(Jt).sub(r.target),fe.applyQuaternion(ue),d.setFromVector3(fe),r.autoRotate&&l===o.NONE&&ie(X()),r.enableDamping?(d.theta+=f.theta*r.dampingFactor,d.phi+=f.phi*r.dampingFactor):(d.theta+=f.theta,d.phi+=f.phi);let pn=r.minAzimuthAngle,jn=r.maxAzimuthAngle;isFinite(pn)&&isFinite(jn)&&(pn<-Math.PI?pn+=at:pn>Math.PI&&(pn-=at),jn<-Math.PI?jn+=at:jn>Math.PI&&(jn-=at),pn<=jn?d.theta=Math.max(pn,Math.min(jn,d.theta)):d.theta=d.theta>(pn+jn)/2?Math.max(pn,d.theta):Math.min(jn,d.theta)),d.phi=Math.max(r.minPolarAngle,Math.min(r.maxPolarAngle,d.phi)),d.makeSafe(),r.enableDamping===!0?r.target.addScaledVector(y,r.dampingFactor):r.target.add(y),r.zoomToCursor&&V||r.object.isOrthographicCamera?d.radius=le(d.radius):d.radius=le(d.radius*p),fe.setFromSpherical(d),fe.applyQuaternion(Ye),Jt.copy(r.target).add(fe),r.object.matrixAutoUpdate||r.object.updateMatrix(),r.object.lookAt(r.target),r.enableDamping===!0?(f.theta*=1-r.dampingFactor,f.phi*=1-r.dampingFactor,y.multiplyScalar(1-r.dampingFactor)):(f.set(0,0,0),y.set(0,0,0));let en=!1;if(r.zoomToCursor&&V){let Hn=null;if(r.object instanceof Pr&&r.object.isPerspectiveCamera){const pr=fe.length();Hn=le(pr*p);const Mi=pr-Hn;r.object.position.addScaledVector(D,Mi),r.object.updateMatrixWorld()}else if(r.object.isOrthographicCamera){const pr=new q(z.x,z.y,0);pr.unproject(r.object),r.object.zoom=Math.max(r.minZoom,Math.min(r.maxZoom,r.object.zoom/p)),r.object.updateProjectionMatrix(),en=!0;const Mi=new q(z.x,z.y,0);Mi.unproject(r.object),r.object.position.sub(Mi).add(pr),r.object.updateMatrixWorld(),Hn=fe.length()}else console.warn("WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled."),r.zoomToCursor=!1;Hn!==null&&(r.screenSpacePanning?r.target.set(0,0,-1).transformDirection(r.object.matrix).multiplyScalar(Hn).add(r.object.position):(k_.origin.copy(r.object.position),k_.direction.set(0,0,-1).transformDirection(r.object.matrix),Math.abs(r.object.up.dot(k_.direction))c||8*(1-Be.dot(r.object.quaternion))>c?(r.dispatchEvent(i),Re.copy(r.object.position),Be.copy(r.object.quaternion),en=!1,!0):!1}})(),this.connect=fe=>{r.domElement=fe,r.domElement.style.touchAction="none",r.domElement.addEventListener("contextmenu",te),r.domElement.addEventListener("pointerdown",be),r.domElement.addEventListener("pointercancel",ze),r.domElement.addEventListener("wheel",rt)},this.dispose=()=>{var fe,qe,ue,Ye,Re,Be;r.domElement&&(r.domElement.style.touchAction="auto"),(fe=r.domElement)==null||fe.removeEventListener("contextmenu",te),(qe=r.domElement)==null||qe.removeEventListener("pointerdown",be),(ue=r.domElement)==null||ue.removeEventListener("pointercancel",ze),(Ye=r.domElement)==null||Ye.removeEventListener("wheel",rt),(Re=r.domElement)==null||Re.ownerDocument.removeEventListener("pointermove",Ue),(Be=r.domElement)==null||Be.ownerDocument.removeEventListener("pointerup",ze),r._domElementKeyEvents!==null&&r._domElementKeyEvents.removeEventListener("keydown",ht)};const r=this,i={type:"change"},s={type:"start"},a={type:"end"},o={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_PAN:4,TOUCH_DOLLY_PAN:5,TOUCH_DOLLY_ROTATE:6};let l=o.NONE;const c=1e-6,d=new rC,f=new rC;let p=1;const y=new q,b=new He,S=new He,w=new He,x=new He,M=new He,T=new He,P=new He,O=new He,N=new He,D=new q,z=new He;let V=!1;const k=[],j={};function X(){return 2*Math.PI/60/60*r.autoRotateSpeed}function ee(){return Math.pow(.95,r.zoomSpeed)}function ie(fe){r.reverseOrbit||r.reverseHorizontalOrbit?f.theta+=fe:f.theta-=fe}function pe(fe){r.reverseOrbit||r.reverseVerticalOrbit?f.phi+=fe:f.phi-=fe}const ae=(()=>{const fe=new q;return function(ue,Ye){fe.setFromMatrixColumn(Ye,0),fe.multiplyScalar(-ue),y.add(fe)}})(),he=(()=>{const fe=new q;return function(ue,Ye){r.screenSpacePanning===!0?fe.setFromMatrixColumn(Ye,1):(fe.setFromMatrixColumn(Ye,0),fe.crossVectors(r.object.up,fe)),fe.multiplyScalar(ue),y.add(fe)}})(),B=(()=>{const fe=new q;return function(ue,Ye){const Re=r.domElement;if(Re&&r.object instanceof Pr&&r.object.isPerspectiveCamera){const Be=r.object.position;fe.copy(Be).sub(r.target);let at=fe.length();at*=Math.tan(r.object.fov/2*Math.PI/180),ae(2*ue*at/Re.clientHeight,r.object.matrix),he(2*Ye*at/Re.clientHeight,r.object.matrix)}else Re&&r.object instanceof Gc&&r.object.isOrthographicCamera?(ae(ue*(r.object.right-r.object.left)/r.object.zoom/Re.clientWidth,r.object.matrix),he(Ye*(r.object.top-r.object.bottom)/r.object.zoom/Re.clientHeight,r.object.matrix)):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."),r.enablePan=!1)}})();function J(fe){r.object instanceof Pr&&r.object.isPerspectiveCamera||r.object instanceof Gc&&r.object.isOrthographicCamera?p=fe:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),r.enableZoom=!1)}function Y(fe){J(p/fe)}function H(fe){J(p*fe)}function G(fe){if(!r.zoomToCursor||!r.domElement)return;V=!0;const qe=r.domElement.getBoundingClientRect(),ue=fe.clientX-qe.left,Ye=fe.clientY-qe.top,Re=qe.width,Be=qe.height;z.x=ue/Re*2-1,z.y=-(Ye/Be)*2+1,D.set(z.x,z.y,1).unproject(r.object).sub(r.object.position).normalize()}function le(fe){return Math.max(r.minDistance,Math.min(r.maxDistance,fe))}function se(fe){b.set(fe.clientX,fe.clientY)}function ce(fe){G(fe),P.set(fe.clientX,fe.clientY)}function Se(fe){x.set(fe.clientX,fe.clientY)}function we(fe){S.set(fe.clientX,fe.clientY),w.subVectors(S,b).multiplyScalar(r.rotateSpeed);const qe=r.domElement;qe&&(ie(2*Math.PI*w.x/qe.clientHeight),pe(2*Math.PI*w.y/qe.clientHeight)),b.copy(S),r.update()}function We(fe){O.set(fe.clientX,fe.clientY),N.subVectors(O,P),N.y>0?Y(ee()):N.y<0&&H(ee()),P.copy(O),r.update()}function Ee(fe){M.set(fe.clientX,fe.clientY),T.subVectors(M,x).multiplyScalar(r.panSpeed),B(T.x,T.y),x.copy(M),r.update()}function Ge(fe){G(fe),fe.deltaY<0?H(ee()):fe.deltaY>0&&Y(ee()),r.update()}function $e(fe){let qe=!1;switch(fe.code){case r.keys.UP:B(0,r.keyPanSpeed),qe=!0;break;case r.keys.BOTTOM:B(0,-r.keyPanSpeed),qe=!0;break;case r.keys.LEFT:B(r.keyPanSpeed,0),qe=!0;break;case r.keys.RIGHT:B(-r.keyPanSpeed,0),qe=!0;break}qe&&(fe.preventDefault(),r.update())}function de(){if(k.length==1)b.set(k[0].pageX,k[0].pageY);else{const fe=.5*(k[0].pageX+k[1].pageX),qe=.5*(k[0].pageY+k[1].pageY);b.set(fe,qe)}}function Z(){if(k.length==1)x.set(k[0].pageX,k[0].pageY);else{const fe=.5*(k[0].pageX+k[1].pageX),qe=.5*(k[0].pageY+k[1].pageY);x.set(fe,qe)}}function Ve(){const fe=k[0].pageX-k[1].pageX,qe=k[0].pageY-k[1].pageY,ue=Math.sqrt(fe*fe+qe*qe);P.set(0,ue)}function Le(){r.enableZoom&&Ve(),r.enablePan&&Z()}function ne(){r.enableZoom&&Ve(),r.enableRotate&&de()}function Ce(fe){if(k.length==1)S.set(fe.pageX,fe.pageY);else{const ue=Zt(fe),Ye=.5*(fe.pageX+ue.x),Re=.5*(fe.pageY+ue.y);S.set(Ye,Re)}w.subVectors(S,b).multiplyScalar(r.rotateSpeed);const qe=r.domElement;qe&&(ie(2*Math.PI*w.x/qe.clientHeight),pe(2*Math.PI*w.y/qe.clientHeight)),b.copy(S)}function Xe(fe){if(k.length==1)M.set(fe.pageX,fe.pageY);else{const qe=Zt(fe),ue=.5*(fe.pageX+qe.x),Ye=.5*(fe.pageY+qe.y);M.set(ue,Ye)}T.subVectors(M,x).multiplyScalar(r.panSpeed),B(T.x,T.y),x.copy(M)}function Ze(fe){const qe=Zt(fe),ue=fe.pageX-qe.x,Ye=fe.pageY-qe.y,Re=Math.sqrt(ue*ue+Ye*Ye);O.set(0,Re),N.set(0,Math.pow(O.y/P.y,r.zoomSpeed)),Y(N.y),P.copy(O)}function Q(fe){r.enableZoom&&Ze(fe),r.enablePan&&Xe(fe)}function W(fe){r.enableZoom&&Ze(fe),r.enableRotate&&Ce(fe)}function be(fe){var qe,ue;r.enabled!==!1&&(k.length===0&&((qe=r.domElement)==null||qe.ownerDocument.addEventListener("pointermove",Ue),(ue=r.domElement)==null||ue.ownerDocument.addEventListener("pointerup",ze)),tt(fe),fe.pointerType==="touch"?Xt(fe):Fe(fe))}function Ue(fe){r.enabled!==!1&&(fe.pointerType==="touch"?Ke(fe):bt(fe))}function ze(fe){var qe,ue,Ye;Mt(fe),k.length===0&&((qe=r.domElement)==null||qe.releasePointerCapture(fe.pointerId),(ue=r.domElement)==null||ue.ownerDocument.removeEventListener("pointermove",Ue),(Ye=r.domElement)==null||Ye.ownerDocument.removeEventListener("pointerup",ze)),r.dispatchEvent(a),l=o.NONE}function Fe(fe){let qe;switch(fe.button){case 0:qe=r.mouseButtons.LEFT;break;case 1:qe=r.mouseButtons.MIDDLE;break;case 2:qe=r.mouseButtons.RIGHT;break;default:qe=-1}switch(qe){case Kf.DOLLY:if(r.enableZoom===!1)return;ce(fe),l=o.DOLLY;break;case Kf.ROTATE:if(fe.ctrlKey||fe.metaKey||fe.shiftKey){if(r.enablePan===!1)return;Se(fe),l=o.PAN}else{if(r.enableRotate===!1)return;se(fe),l=o.ROTATE}break;case Kf.PAN:if(fe.ctrlKey||fe.metaKey||fe.shiftKey){if(r.enableRotate===!1)return;se(fe),l=o.ROTATE}else{if(r.enablePan===!1)return;Se(fe),l=o.PAN}break;default:l=o.NONE}l!==o.NONE&&r.dispatchEvent(s)}function bt(fe){if(r.enabled!==!1)switch(l){case o.ROTATE:if(r.enableRotate===!1)return;we(fe);break;case o.DOLLY:if(r.enableZoom===!1)return;We(fe);break;case o.PAN:if(r.enablePan===!1)return;Ee(fe);break}}function rt(fe){r.enabled===!1||r.enableZoom===!1||l!==o.NONE&&l!==o.ROTATE||(fe.preventDefault(),r.dispatchEvent(s),Ge(fe),r.dispatchEvent(a))}function ht(fe){r.enabled===!1||r.enablePan===!1||$e(fe)}function Xt(fe){switch(vt(fe),k.length){case 1:switch(r.touches.ONE){case Yf.ROTATE:if(r.enableRotate===!1)return;de(),l=o.TOUCH_ROTATE;break;case Yf.PAN:if(r.enablePan===!1)return;Z(),l=o.TOUCH_PAN;break;default:l=o.NONE}break;case 2:switch(r.touches.TWO){case Yf.DOLLY_PAN:if(r.enableZoom===!1&&r.enablePan===!1)return;Le(),l=o.TOUCH_DOLLY_PAN;break;case Yf.DOLLY_ROTATE:if(r.enableZoom===!1&&r.enableRotate===!1)return;ne(),l=o.TOUCH_DOLLY_ROTATE;break;default:l=o.NONE}break;default:l=o.NONE}l!==o.NONE&&r.dispatchEvent(s)}function Ke(fe){switch(vt(fe),l){case o.TOUCH_ROTATE:if(r.enableRotate===!1)return;Ce(fe),r.update();break;case o.TOUCH_PAN:if(r.enablePan===!1)return;Xe(fe),r.update();break;case o.TOUCH_DOLLY_PAN:if(r.enableZoom===!1&&r.enablePan===!1)return;Q(fe),r.update();break;case o.TOUCH_DOLLY_ROTATE:if(r.enableZoom===!1&&r.enableRotate===!1)return;W(fe),r.update();break;default:l=o.NONE}}function te(fe){r.enabled!==!1&&fe.preventDefault()}function tt(fe){k.push(fe)}function Mt(fe){delete j[fe.pointerId];for(let qe=0;qe{H(fe),r.update()},this.dollyOut=(fe=ee())=>{Y(fe),r.update()},this.getScale=()=>p,this.setScale=fe=>{J(fe),r.update()},this.getZoomScale=()=>ee(),n!==void 0&&this.connect(n),this.update()}};const x_e=R.forwardRef(({makeDefault:t,camera:e,regress:n,domElement:r,enableDamping:i=!0,keyEvents:s=!1,onChange:a,onStart:o,onEnd:l,...c},d)=>{const f=ed(N=>N.invalidate),p=ed(N=>N.camera),y=ed(N=>N.gl),b=ed(N=>N.events),S=ed(N=>N.setEvents),w=ed(N=>N.set),x=ed(N=>N.get),M=ed(N=>N.performance),T=e||p,P=r||b.connected||y.domElement,O=R.useMemo(()=>new y_e(T),[T]);return AG(()=>{O.enabled&&O.update()},-1),R.useEffect(()=>(s&&O.connect(s===!0?P:s),O.connect(P),()=>void O.dispose()),[s,P,n,O,f]),R.useEffect(()=>{const N=V=>{f(),n&&M.regress(),a&&a(V)},D=V=>{o&&o(V)},z=V=>{l&&l(V)};return O.addEventListener("change",N),O.addEventListener("start",D),O.addEventListener("end",z),()=>{O.removeEventListener("start",D),O.removeEventListener("end",z),O.removeEventListener("change",N)}},[a,o,l,O,f,S]),R.useEffect(()=>{if(t){const N=x().controls;return w({controls:O}),()=>w({controls:N})}},[t,O]),R.createElement("primitive",aC({ref:d,object:O,enableDamping:i},c))});function $U(t,e){if(e===QV)return console.warn("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles."),t;if(e===O1||e===_R){let n=t.getIndex();if(n===null){const a=[],o=t.getAttribute("position");if(o!==void 0){for(let l=0;l=2.0 are supported."));return}const c=new J_e(s,{path:n||this.resourcePath||"",crossOrigin:this.crossOrigin,requestHeader:this.requestHeader,manager:this.manager,ktx2Loader:this.ktx2Loader,meshoptDecoder:this.meshoptDecoder});c.fileLoader.setRequestHeader(this.requestHeader);for(let d=0;d=0&&o[f]===void 0&&console.warn('THREE.GLTFLoader: Unknown extension "'+f+'".')}}c.setExtensions(a),c.setPlugins(o),c.parse(r,i)}parseAsync(e,n){const r=this;return new Promise(function(i,s){r.parse(e,n,i,s)})}}function __e(){let t={};return{get:function(e){return t[e]},add:function(e,n){t[e]=n},remove:function(e){delete t[e]},removeAll:function(){t={}}}}const vn={KHR_BINARY_GLTF:"KHR_binary_glTF",KHR_DRACO_MESH_COMPRESSION:"KHR_draco_mesh_compression",KHR_LIGHTS_PUNCTUAL:"KHR_lights_punctual",KHR_MATERIALS_CLEARCOAT:"KHR_materials_clearcoat",KHR_MATERIALS_DISPERSION:"KHR_materials_dispersion",KHR_MATERIALS_IOR:"KHR_materials_ior",KHR_MATERIALS_SHEEN:"KHR_materials_sheen",KHR_MATERIALS_SPECULAR:"KHR_materials_specular",KHR_MATERIALS_TRANSMISSION:"KHR_materials_transmission",KHR_MATERIALS_IRIDESCENCE:"KHR_materials_iridescence",KHR_MATERIALS_ANISOTROPY:"KHR_materials_anisotropy",KHR_MATERIALS_UNLIT:"KHR_materials_unlit",KHR_MATERIALS_VOLUME:"KHR_materials_volume",KHR_TEXTURE_BASISU:"KHR_texture_basisu",KHR_TEXTURE_TRANSFORM:"KHR_texture_transform",KHR_MESH_QUANTIZATION:"KHR_mesh_quantization",KHR_MATERIALS_EMISSIVE_STRENGTH:"KHR_materials_emissive_strength",EXT_MATERIALS_BUMP:"EXT_materials_bump",EXT_TEXTURE_WEBP:"EXT_texture_webp",EXT_TEXTURE_AVIF:"EXT_texture_avif",EXT_MESHOPT_COMPRESSION:"EXT_meshopt_compression",EXT_MESH_GPU_INSTANCING:"EXT_mesh_gpu_instancing"};class w_e{constructor(e){this.parser=e,this.name=vn.KHR_LIGHTS_PUNCTUAL,this.cache={refs:{},uses:{}}}_markDefs(){const e=this.parser,n=this.parser.json.nodes||[];for(let r=0,i=n.length;r=0)throw new Error("THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures");return null}return n.loadTextureImage(e,s.source,a)}}class D_e{constructor(e){this.parser=e,this.name=vn.EXT_TEXTURE_WEBP,this.isSupported=null}loadTexture(e){const n=this.name,r=this.parser,i=r.json,s=i.textures[e];if(!s.extensions||!s.extensions[n])return null;const a=s.extensions[n],o=i.images[a.source];let l=r.textureLoader;if(o.uri){const c=r.options.manager.getHandler(o.uri);c!==null&&(l=c)}return this.detectSupport().then(function(c){if(c)return r.loadTextureImage(e,a.source,l);if(i.extensionsRequired&&i.extensionsRequired.indexOf(n)>=0)throw new Error("THREE.GLTFLoader: WebP required by asset but unsupported.");return r.loadTexture(e)})}detectSupport(){return this.isSupported||(this.isSupported=new Promise(function(e){const n=new Image;n.src="data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA",n.onload=n.onerror=function(){e(n.height===1)}})),this.isSupported}}class U_e{constructor(e){this.parser=e,this.name=vn.EXT_TEXTURE_AVIF,this.isSupported=null}loadTexture(e){const n=this.name,r=this.parser,i=r.json,s=i.textures[e];if(!s.extensions||!s.extensions[n])return null;const a=s.extensions[n],o=i.images[a.source];let l=r.textureLoader;if(o.uri){const c=r.options.manager.getHandler(o.uri);c!==null&&(l=c)}return this.detectSupport().then(function(c){if(c)return r.loadTextureImage(e,a.source,l);if(i.extensionsRequired&&i.extensionsRequired.indexOf(n)>=0)throw new Error("THREE.GLTFLoader: AVIF required by asset but unsupported.");return r.loadTexture(e)})}detectSupport(){return this.isSupported||(this.isSupported=new Promise(function(e){const n=new Image;n.src="data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAABcAAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAEAAAABAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQAMAAAAABNjb2xybmNseAACAAIABoAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAAB9tZGF0EgAKCBgABogQEDQgMgkQAAAAB8dSLfI=",n.onload=n.onerror=function(){e(n.height===1)}})),this.isSupported}}class j_e{constructor(e){this.name=vn.EXT_MESHOPT_COMPRESSION,this.parser=e}loadBufferView(e){const n=this.parser.json,r=n.bufferViews[e];if(r.extensions&&r.extensions[this.name]){const i=r.extensions[this.name],s=this.parser.getDependency("buffer",i.buffer),a=this.parser.options.meshoptDecoder;if(!a||!a.supported){if(n.extensionsRequired&&n.extensionsRequired.indexOf(this.name)>=0)throw new Error("THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files");return null}return s.then(function(o){const l=i.byteOffset||0,c=i.byteLength||0,d=i.count,f=i.byteStride,p=new Uint8Array(o,l,c);return a.decodeGltfBufferAsync?a.decodeGltfBufferAsync(d,f,p,i.mode,i.filter).then(function(y){return y.buffer}):a.ready.then(function(){const y=new ArrayBuffer(d*f);return a.decodeGltfBuffer(new Uint8Array(y),d,f,p,i.mode,i.filter),y})})}else return null}}class F_e{constructor(e){this.name=vn.EXT_MESH_GPU_INSTANCING,this.parser=e}createNodeMesh(e){const n=this.parser.json,r=n.nodes[e];if(!r.extensions||!r.extensions[this.name]||r.mesh===void 0)return null;const i=n.meshes[r.mesh];for(const c of i.primitives)if(c.mode!==Ba.TRIANGLES&&c.mode!==Ba.TRIANGLE_STRIP&&c.mode!==Ba.TRIANGLE_FAN&&c.mode!==void 0)return null;const a=r.extensions[this.name].attributes,o=[],l={};for(const c in a)o.push(this.parser.getDependency("accessor",a[c]).then(d=>(l[c]=d,l[c])));return o.length<1?null:(o.push(this.parser.createNodeMesh(e)),Promise.all(o).then(c=>{const d=c.pop(),f=d.isGroup?d.children:[d],p=c[0].count,y=[];for(const b of f){const S=new Ct,w=new q,x=new qt,M=new q(1,1,1),T=new OR(b.geometry,b.material,p);for(let P=0;P0||t.search(/^data\:image\/jpeg/)===0?"image/jpeg":t.search(/\.webp($|\?)/i)>0||t.search(/^data\:image\/webp/)===0?"image/webp":"image/png"}const Q_e=new Ct;class J_e{constructor(e={},n={}){this.json=e,this.extensions={},this.plugins={},this.options=n,this.cache=new __e,this.associations=new Map,this.primitiveCache={},this.nodeCache={},this.meshCache={refs:{},uses:{}},this.cameraCache={refs:{},uses:{}},this.lightCache={refs:{},uses:{}},this.sourceCache={},this.textureCache={},this.nodeNamesUsed={};let r=!1,i=-1,s=!1,a=-1;if(typeof navigator<"u"){const o=navigator.userAgent;r=/^((?!chrome|android).)*safari/i.test(o)===!0;const l=o.match(/Version\/(\d+)/);i=r&&l?parseInt(l[1],10):-1,s=o.indexOf("Firefox")>-1,a=s?o.match(/Firefox\/([0-9]+)\./)[1]:-1}typeof createImageBitmap>"u"||r&&i<17||s&&a<98?this.textureLoader=new eG(this.options.manager):this.textureLoader=new lG(this.options.manager),this.textureLoader.setCrossOrigin(this.options.crossOrigin),this.textureLoader.setRequestHeader(this.options.requestHeader),this.fileLoader=new Go(this.options.manager),this.fileLoader.setResponseType("arraybuffer"),this.options.crossOrigin==="use-credentials"&&this.fileLoader.setWithCredentials(!0)}setExtensions(e){this.extensions=e}setPlugins(e){this.plugins=e}parse(e,n){const r=this,i=this.json,s=this.extensions;this.cache.removeAll(),this.nodeCache={},this._invokeAll(function(a){return a._markDefs&&a._markDefs()}),Promise.all(this._invokeAll(function(a){return a.beforeRoot&&a.beforeRoot()})).then(function(){return Promise.all([r.getDependencies("scene"),r.getDependencies("animation"),r.getDependencies("camera")])}).then(function(a){const o={scene:a[0][i.scene||0],scenes:a[0],animations:a[1],cameras:a[2],asset:i.asset,parser:r,userData:{}};return Bf(s,o,i),Pc(o,i),Promise.all(r._invokeAll(function(l){return l.afterRoot&&l.afterRoot(o)})).then(function(){for(const l of o.scenes)l.updateMatrixWorld();e(o)})}).catch(n)}_markDefs(){const e=this.json.nodes||[],n=this.json.skins||[],r=this.json.meshes||[];for(let i=0,s=n.length;i{const l=this.associations.get(a);l!=null&&this.associations.set(o,l);for(const[c,d]of a.children.entries())s(d,o.children[c])};return s(r,i),i.name+="_instance_"+e.uses[n]++,i}_invokeOne(e){const n=Object.values(this.plugins);n.push(this);for(let r=0;r=2&&w.setY(V,N[D*l+1]),l>=3&&w.setZ(V,N[D*l+2]),l>=4&&w.setW(V,N[D*l+3]),l>=5)throw new Error("THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.")}w.normalized=b}return w})}loadTexture(e){const n=this.json,r=this.options,s=n.textures[e].source,a=n.images[s];let o=this.textureLoader;if(a.uri){const l=r.manager.getHandler(a.uri);l!==null&&(o=l)}return this.loadTextureImage(e,s,o)}loadTextureImage(e,n,r){const i=this,s=this.json,a=s.textures[e],o=s.images[n],l=(o.uri||o.bufferView)+":"+a.sampler;if(this.textureCache[l])return this.textureCache[l];const c=this.loadImageSource(n,r).then(function(d){d.flipY=!1,d.name=a.name||o.name||"",d.name===""&&typeof o.uri=="string"&&o.uri.startsWith("data:image/")===!1&&(d.name=o.uri);const p=(s.samplers||{})[a.sampler]||{};return d.magFilter=qU[p.magFilter]||Cr,d.minFilter=qU[p.minFilter]||$a,d.wrapS=KU[p.wrapS]||Rd,d.wrapT=KU[p.wrapT]||Rd,i.associations.set(d,{textures:e}),d}).catch(function(){return null});return this.textureCache[l]=c,c}loadImageSource(e,n){const r=this,i=this.json,s=this.options;if(this.sourceCache[e]!==void 0)return this.sourceCache[e].then(f=>f.clone());const a=i.images[e],o=self.URL||self.webkitURL;let l=a.uri||"",c=!1;if(a.bufferView!==void 0)l=r.getDependency("bufferView",a.bufferView).then(function(f){c=!0;const p=new Blob([f],{type:a.mimeType});return l=o.createObjectURL(p),l});else if(a.uri===void 0)throw new Error("THREE.GLTFLoader: Image "+e+" is missing URI and bufferView");const d=Promise.resolve(l).then(function(f){return new Promise(function(p,y){let b=p;n.isImageBitmapLoader===!0&&(b=function(S){const w=new fr(S);w.needsUpdate=!0,p(w)}),n.load(Sd.resolveURL(f,s.path),b,void 0,y)})}).then(function(f){return c===!0&&o.revokeObjectURL(l),Pc(f,a),f.userData.mimeType=a.mimeType||Z_e(a.uri),f}).catch(function(f){throw console.error("THREE.GLTFLoader: Couldn't load texture",l),f});return this.sourceCache[e]=d,d}assignTexture(e,n,r,i){const s=this;return this.getDependency("texture",r.index).then(function(a){if(!a)return null;if(r.texCoord!==void 0&&r.texCoord>0&&(a=a.clone(),a.channel=r.texCoord),s.extensions[vn.KHR_TEXTURE_TRANSFORM]){const o=r.extensions!==void 0?r.extensions[vn.KHR_TEXTURE_TRANSFORM]:void 0;if(o){const l=s.associations.get(a);a=s.extensions[vn.KHR_TEXTURE_TRANSFORM].extendTexture(a,o),s.associations.set(a,l)}}return i!==void 0&&(a.colorSpace=i),e[n]=a,a})}assignFinalMaterial(e){const n=e.geometry;let r=e.material;const i=n.attributes.tangent===void 0,s=n.attributes.color!==void 0,a=n.attributes.normal===void 0;if(e.isPoints){const o="PointsMaterial:"+r.uuid;let l=this.cache.get(o);l||(l=new iM,Gr.prototype.copy.call(l,r),l.color.copy(r.color),l.map=r.map,l.sizeAttenuation=!1,this.cache.add(o,l)),r=l}else if(e.isLine){const o="LineBasicMaterial:"+r.uuid;let l=this.cache.get(o);l||(l=new $r,Gr.prototype.copy.call(l,r),l.color.copy(r.color),l.map=r.map,this.cache.add(o,l)),r=l}if(i||s||a){let o="ClonedMaterial:"+r.uuid+":";i&&(o+="derivative-tangents:"),s&&(o+="vertex-colors:"),a&&(o+="flat-shading:");let l=this.cache.get(o);l||(l=r.clone(),s&&(l.vertexColors=!0),a&&(l.flatShading=!0),i&&(l.normalScale&&(l.normalScale.y*=-1),l.clearcoatNormalScale&&(l.clearcoatNormalScale.y*=-1)),this.cache.add(o,l),this.associations.set(l,this.associations.get(r))),r=l}e.material=r}getMaterialType(){return yx}loadMaterial(e){const n=this,r=this.json,i=this.extensions,s=r.materials[e];let a;const o={},l=s.extensions||{},c=[];if(l[vn.KHR_MATERIALS_UNLIT]){const f=i[vn.KHR_MATERIALS_UNLIT];a=f.getMaterialType(),c.push(f.extendParams(o,s,n))}else{const f=s.pbrMetallicRoughness||{};if(o.color=new ct(1,1,1),o.opacity=1,Array.isArray(f.baseColorFactor)){const p=f.baseColorFactor;o.color.setRGB(p[0],p[1],p[2],xi),o.opacity=p[3]}f.baseColorTexture!==void 0&&c.push(n.assignTexture(o,"map",f.baseColorTexture,Fi)),o.metalness=f.metallicFactor!==void 0?f.metallicFactor:1,o.roughness=f.roughnessFactor!==void 0?f.roughnessFactor:1,f.metallicRoughnessTexture!==void 0&&(c.push(n.assignTexture(o,"metalnessMap",f.metallicRoughnessTexture)),c.push(n.assignTexture(o,"roughnessMap",f.metallicRoughnessTexture))),a=this._invokeOne(function(p){return p.getMaterialType&&p.getMaterialType(e)}),c.push(Promise.all(this._invokeAll(function(p){return p.extendMaterialParams&&p.extendMaterialParams(e,o)})))}s.doubleSided===!0&&(o.side=ya);const d=s.alphaMode||eT.OPAQUE;if(d===eT.BLEND?(o.transparent=!0,o.depthWrite=!1):(o.transparent=!1,d===eT.MASK&&(o.alphaTest=s.alphaCutoff!==void 0?s.alphaCutoff:.5)),s.normalTexture!==void 0&&a!==As&&(c.push(n.assignTexture(o,"normalMap",s.normalTexture)),o.normalScale=new He(1,1),s.normalTexture.scale!==void 0)){const f=s.normalTexture.scale;o.normalScale.set(f,f)}if(s.occlusionTexture!==void 0&&a!==As&&(c.push(n.assignTexture(o,"aoMap",s.occlusionTexture)),s.occlusionTexture.strength!==void 0&&(o.aoMapIntensity=s.occlusionTexture.strength)),s.emissiveFactor!==void 0&&a!==As){const f=s.emissiveFactor;o.emissive=new ct().setRGB(f[0],f[1],f[2],xi)}return s.emissiveTexture!==void 0&&a!==As&&c.push(n.assignTexture(o,"emissiveMap",s.emissiveTexture,Fi)),Promise.all(c).then(function(){const f=new a(o);return s.name&&(f.name=s.name),Pc(f,s),n.associations.set(f,{materials:e}),s.extensions&&Bf(i,f,s),f})}createUniqueName(e){const n=Rn.sanitizeNodeName(e||"");return n in this.nodeNamesUsed?n+"_"+ ++this.nodeNamesUsed[n]:(this.nodeNamesUsed[n]=0,n)}loadGeometries(e){const n=this,r=this.extensions,i=this.primitiveCache;function s(o){return r[vn.KHR_DRACO_MESH_COMPRESSION].decodePrimitive(o,n).then(function(l){return YU(l,o,n)})}const a=[];for(let o=0,l=e.length;o0&&K_e(x,s),x.name=n.createUniqueName(s.name||"mesh_"+e),Pc(x,s),w.extensions&&Bf(i,x,w),n.assignFinalMaterial(x),f.push(x)}for(let y=0,b=f.length;y1?d=new Ts:c.length===1?d=c[0]:d=new mn,d!==c[0])for(let f=0,p=c.length;f{const f=new Map;for(const[p,y]of i.associations)(p instanceof Gr||p instanceof fr)&&f.set(p,y);return d.traverse(p=>{const y=i.associations.get(p);y!=null&&f.set(p,y)}),f};return i.associations=c(s),s})}_createAnimationTracks(e,n,r,i,s){const a=[],o=e.name?e.name:e.uuid,l=[];td[s.path]===td.weights?e.traverse(function(p){p.morphTargetInfluences&&l.push(p.name?p.name:p.uuid)}):l.push(o);let c;switch(td[s.path]){case td.weights:c=Wh;break;case td.rotation:c=$h;break;case td.position:case td.scale:c=Xh;break;default:switch(r.itemSize){case 1:c=Wh;break;case 2:case 3:default:c=Xh;break}break}const d=i.interpolation!==void 0?$_e[i.interpolation]:Lg,f=this._getArrayFromAccessor(r);for(let p=0,y=l.length;pnew Promise((r,i)=>{var s=l=>{try{o(n.next(l))}catch(c){i(c)}},a=l=>{try{o(n.throw(l))}catch(c){i(c)}},o=l=>l.done?r(l.value):Promise.resolve(l.value).then(s,a);o((n=n.apply(t,e)).next())}),Dn=(t,e,n)=>new Promise((r,i)=>{var s=l=>{try{o(n.next(l))}catch(c){i(c)}},a=l=>{try{o(n.throw(l))}catch(c){i(c)}},o=l=>l.done?r(l.value):Promise.resolve(l.value).then(s,a);o((n=n.apply(t,e)).next())}),ZU=class extends mn{constructor(t){super(),this.weight=0,this.isBinary=!1,this.overrideBlink="none",this.overrideLookAt="none",this.overrideMouth="none",this._binds=[],this.name=`VRMExpression_${t}`,this.expressionName=t,this.type="VRMExpression",this.visible=!1}get binds(){return this._binds}get overrideBlinkAmount(){return this.overrideBlink==="block"?0.5?1:0:this.weight}addBind(t){this._binds.push(t)}deleteBind(t){const e=this._binds.indexOf(t);e>=0&&this._binds.splice(e,1)}applyWeight(t){var e;let n=this.outputWeight;n*=(e=t==null?void 0:t.multiplier)!=null?e:1,this.isBinary&&n<1&&(n=0),this._binds.forEach(r=>r.applyWeight(n))}clearAppliedWeight(){this._binds.forEach(t=>t.clearAppliedWeight())}};function OG(t,e,n){var r,i;const s=t.parser.json,a=(r=s.nodes)==null?void 0:r[e];if(a==null)return console.warn(`extractPrimitivesInternal: Attempt to use nodes[${e}] of glTF but the node doesn't exist`),null;const o=a.mesh;if(o==null)return null;const l=(i=s.meshes)==null?void 0:i[o];if(l==null)return console.warn(`extractPrimitivesInternal: Attempt to use meshes[${o}] of glTF but the mesh doesn't exist`),null;const c=l.primitives.length,d=[];return n.traverse(f=>{d.length{const s=OG(t,i,r);s!=null&&n.set(i,s)}),n})}var cC={Aa:"aa",Ih:"ih",Ou:"ou",Ee:"ee",Oh:"oh",Blink:"blink",Happy:"happy",Angry:"angry",Sad:"sad",Relaxed:"relaxed",LookUp:"lookUp",Surprised:"surprised",LookDown:"lookDown",LookLeft:"lookLeft",LookRight:"lookRight",BlinkLeft:"blinkLeft",BlinkRight:"blinkRight",Neutral:"neutral"};function LG(t){return Math.max(Math.min(t,1),0)}var ej=class DG{constructor(){this.blinkExpressionNames=["blink","blinkLeft","blinkRight"],this.lookAtExpressionNames=["lookLeft","lookRight","lookUp","lookDown"],this.mouthExpressionNames=["aa","ee","ih","oh","ou"],this._expressions=[],this._expressionMap={}}get expressions(){return this._expressions.concat()}get expressionMap(){return Object.assign({},this._expressionMap)}get presetExpressionMap(){const e={},n=new Set(Object.values(cC));return Object.entries(this._expressionMap).forEach(([r,i])=>{n.has(r)&&(e[r]=i)}),e}get customExpressionMap(){const e={},n=new Set(Object.values(cC));return Object.entries(this._expressionMap).forEach(([r,i])=>{n.has(r)||(e[r]=i)}),e}copy(e){return this._expressions.concat().forEach(r=>{this.unregisterExpression(r)}),e._expressions.forEach(r=>{this.registerExpression(r)}),this.blinkExpressionNames=e.blinkExpressionNames.concat(),this.lookAtExpressionNames=e.lookAtExpressionNames.concat(),this.mouthExpressionNames=e.mouthExpressionNames.concat(),this}clone(){return new DG().copy(this)}getExpression(e){var n;return(n=this._expressionMap[e])!=null?n:null}registerExpression(e){this._expressions.push(e),this._expressionMap[e.expressionName]=e}unregisterExpression(e){const n=this._expressions.indexOf(e);n===-1&&console.warn("VRMExpressionManager: The specified expressions is not registered"),this._expressions.splice(n,1),delete this._expressionMap[e.expressionName]}getValue(e){var n;const r=this.getExpression(e);return(n=r==null?void 0:r.weight)!=null?n:null}setValue(e,n){const r=this.getExpression(e);r&&(r.weight=LG(n))}resetValues(){this._expressions.forEach(e=>{e.weight=0})}getExpressionTrackName(e){const n=this.getExpression(e);return n?`${n.name}.weight`:null}update(){const e=this._calculateWeightMultipliers();this._expressions.forEach(n=>{n.clearAppliedWeight()}),this._expressions.forEach(n=>{let r=1;const i=n.expressionName;this.blinkExpressionNames.indexOf(i)!==-1&&(r*=e.blink),this.lookAtExpressionNames.indexOf(i)!==-1&&(r*=e.lookAt),this.mouthExpressionNames.indexOf(i)!==-1&&(r*=e.mouth),n.applyWeight({multiplier:r})})}_calculateWeightMultipliers(){let e=1,n=1,r=1;return this._expressions.forEach(i=>{e-=i.overrideBlinkAmount,n-=i.overrideLookAtAmount,r-=i.overrideMouthAmount}),e=Math.max(0,e),n=Math.max(0,n),r=Math.max(0,r),{blink:e,lookAt:n,mouth:r}}},k0={Color:"color",EmissionColor:"emissionColor",ShadeColor:"shadeColor",RimColor:"rimColor",OutlineColor:"outlineColor"},twe={_Color:k0.Color,_EmissionColor:k0.EmissionColor,_ShadeColor:k0.ShadeColor,_RimColor:k0.RimColor,_OutlineColor:k0.OutlineColor},nwe=new ct,UG=class jG{constructor({material:e,type:n,targetValue:r,targetAlpha:i}){this.material=e,this.type=n,this.targetValue=r,this.targetAlpha=i??1;const s=this._initColorBindState(),a=this._initAlphaBindState();this._state={color:s,alpha:a}}applyWeight(e){const{color:n,alpha:r}=this._state;if(n!=null){const{propertyName:i,deltaValue:s}=n,a=this.material[i];a!=null&&a.add(nwe.copy(s).multiplyScalar(e))}if(r!=null){const{propertyName:i,deltaValue:s}=r;this.material[i]!=null&&(this.material[i]+=s*e)}}clearAppliedWeight(){const{color:e,alpha:n}=this._state;if(e!=null){const{propertyName:r,initialValue:i}=e,s=this.material[r];s!=null&&s.copy(i)}if(n!=null){const{propertyName:r,initialValue:i}=n;this.material[r]!=null&&(this.material[r]=i)}}_initColorBindState(){var e,n,r;const{material:i,type:s,targetValue:a}=this,o=this._getPropertyNameMap(),l=(n=(e=o==null?void 0:o[s])==null?void 0:e[0])!=null?n:null;if(l==null)return console.warn(`Tried to add a material color bind to the material ${(r=i.name)!=null?r:"(no name)"}, the type ${s} but the material or the type is not supported.`),null;const d=i[l].clone(),f=new ct(a.r-d.r,a.g-d.g,a.b-d.b);return{propertyName:l,initialValue:d,deltaValue:f}}_initAlphaBindState(){var e,n,r;const{material:i,type:s,targetAlpha:a}=this,o=this._getPropertyNameMap(),l=(n=(e=o==null?void 0:o[s])==null?void 0:e[1])!=null?n:null;if(l==null&&a!==1)return console.warn(`Tried to add a material alpha bind to the material ${(r=i.name)!=null?r:"(no name)"}, the type ${s} but the material or the type does not support alpha.`),null;if(l==null)return null;const c=i[l],d=a-c;return{propertyName:l,initialValue:c,deltaValue:d}}_getPropertyNameMap(){var e,n;return(n=(e=Object.entries(jG._propertyNameMapMap).find(([r])=>this.material[r]===!0))==null?void 0:e[1])!=null?n:null}};UG._propertyNameMapMap={isMeshStandardMaterial:{color:["color","opacity"],emissionColor:["emissive",null]},isMeshBasicMaterial:{color:["color","opacity"]},isMToonMaterial:{color:["color","opacity"],emissionColor:["emissive",null],outlineColor:["outlineColorFactor",null],matcapColor:["matcapFactor",null],rimColor:["parametricRimColorFactor",null],shadeColor:["shadeColorFactor",null]}};var tj=UG,F1=class{constructor({primitives:t,index:e,weight:n}){this.primitives=t,this.index=e,this.weight=n}applyWeight(t){this.primitives.forEach(e=>{var n;((n=e.morphTargetInfluences)==null?void 0:n[this.index])!=null&&(e.morphTargetInfluences[this.index]+=this.weight*t)})}clearAppliedWeight(){this.primitives.forEach(t=>{var e;((e=t.morphTargetInfluences)==null?void 0:e[this.index])!=null&&(t.morphTargetInfluences[this.index]=0)})}},nj=new He,FG=class zG{constructor({material:e,scale:n,offset:r}){var i,s;this.material=e,this.scale=n,this.offset=r;const a=(i=Object.entries(zG._propertyNamesMap).find(([o])=>e[o]===!0))==null?void 0:i[1];a==null?(console.warn(`Tried to add a texture transform bind to the material ${(s=e.name)!=null?s:"(no name)"} but the material is not supported.`),this._properties=[]):(this._properties=[],a.forEach(o=>{var l;const c=(l=e[o])==null?void 0:l.clone();if(!c)return null;e[o]=c;const d=c.offset.clone(),f=c.repeat.clone(),p=r.clone().sub(d),y=n.clone().sub(f);this._properties.push({name:o,initialOffset:d,deltaOffset:p,initialScale:f,deltaScale:y})}))}applyWeight(e){this._properties.forEach(n=>{const r=this.material[n.name];r!==void 0&&(r.offset.add(nj.copy(n.deltaOffset).multiplyScalar(e)),r.repeat.add(nj.copy(n.deltaScale).multiplyScalar(e)))})}clearAppliedWeight(){this._properties.forEach(e=>{const n=this.material[e.name];n!==void 0&&(n.offset.copy(e.initialOffset),n.repeat.copy(e.initialScale))})}};FG._propertyNamesMap={isMeshStandardMaterial:["map","emissiveMap","bumpMap","normalMap","displacementMap","roughnessMap","metalnessMap","alphaMap"],isMeshBasicMaterial:["map","specularMap","alphaMap"],isMToonMaterial:["map","normalMap","emissiveMap","shadeMultiplyTexture","rimMultiplyTexture","outlineWidthMultiplyTexture","uvAnimationMaskTexture"]};var rj=FG,rwe=new Set(["1.0","1.0-beta"]),BG=class HG{get name(){return"VRMExpressionLoaderPlugin"}constructor(e){this.parser=e}afterRoot(e){return Dn(this,null,function*(){e.userData.vrmExpressionManager=yield this._import(e)})}_import(e){return Dn(this,null,function*(){const n=yield this._v1Import(e);if(n)return n;const r=yield this._v0Import(e);return r||null})}_v1Import(e){return Dn(this,null,function*(){var n,r;const i=this.parser.json;if(!(((n=i.extensionsUsed)==null?void 0:n.indexOf("VRMC_vrm"))!==-1))return null;const a=(r=i.extensions)==null?void 0:r.VRMC_vrm;if(!a)return null;const o=a.specVersion;if(!rwe.has(o))return console.warn(`VRMExpressionLoaderPlugin: Unknown VRMC_vrm specVersion "${o}"`),null;const l=a.expressions;if(!l)return null;const c=new Set(Object.values(cC)),d=new Map;l.preset!=null&&Object.entries(l.preset).forEach(([p,y])=>{if(y!=null){if(!c.has(p)){console.warn(`VRMExpressionLoaderPlugin: Unknown preset name "${p}" detected. Ignoring the expression`);return}d.set(p,y)}}),l.custom!=null&&Object.entries(l.custom).forEach(([p,y])=>{if(c.has(p)){console.warn(`VRMExpressionLoaderPlugin: Custom expression cannot have preset name "${p}". Ignoring the expression`);return}d.set(p,y)});const f=new ej;return yield Promise.all(Array.from(d.entries()).map(p=>Dn(this,[p],function*([y,b]){var S,w,x,M,T,P,O;const N=new ZU(y);if(e.scene.add(N),N.isBinary=(S=b.isBinary)!=null?S:!1,N.overrideBlink=(w=b.overrideBlink)!=null?w:"none",N.overrideLookAt=(x=b.overrideLookAt)!=null?x:"none",N.overrideMouth=(M=b.overrideMouth)!=null?M:"none",(T=b.morphTargetBinds)==null||T.forEach(D=>Dn(this,null,function*(){var z;if(D.node===void 0||D.index===void 0)return;const V=yield QU(e,D.node),k=D.index;if(!V.every(j=>Array.isArray(j.morphTargetInfluences)&&k{const V=z.material;V&&(Array.isArray(V)?D.push(...V):D.push(V))}),(P=b.materialColorBinds)==null||P.forEach(z=>Dn(this,null,function*(){D.filter(k=>{var j;const X=(j=this.parser.associations.get(k))==null?void 0:j.materials;return z.material===X}).forEach(k=>{N.addBind(new tj({material:k,type:z.type,targetValue:new ct().fromArray(z.targetValue),targetAlpha:z.targetValue[3]}))})})),(O=b.textureTransformBinds)==null||O.forEach(z=>Dn(this,null,function*(){D.filter(k=>{var j;const X=(j=this.parser.associations.get(k))==null?void 0:j.materials;return z.material===X}).forEach(k=>{var j,X;N.addBind(new rj({material:k,offset:new He().fromArray((j=z.offset)!=null?j:[0,0]),scale:new He().fromArray((X=z.scale)!=null?X:[1,1])}))})}))}f.registerExpression(N)}))),f})}_v0Import(e){return Dn(this,null,function*(){var n;const r=this.parser.json,i=(n=r.extensions)==null?void 0:n.VRM;if(!i)return null;const s=i.blendShapeMaster;if(!s)return null;const a=new ej,o=s.blendShapeGroups;if(!o)return a;const l=new Set;return yield Promise.all(o.map(c=>Dn(this,null,function*(){var d;const f=c.presetName,p=f!=null&&HG.v0v1PresetNameMap[f]||null,y=p??c.name;if(y==null){console.warn("VRMExpressionLoaderPlugin: One of custom expressions has no name. Ignoring the expression");return}if(l.has(y)){console.warn(`VRMExpressionLoaderPlugin: An expression preset ${f} has duplicated entries. Ignoring the expression`);return}l.add(y);const b=new ZU(y);e.scene.add(b),b.isBinary=(d=c.isBinary)!=null?d:!1,c.binds&&c.binds.forEach(w=>Dn(this,null,function*(){var x;if(w.mesh===void 0||w.index===void 0)return;const M=[];if((x=r.nodes)==null||x.forEach((P,O)=>{P.mesh===w.mesh&&M.push(O)}),M.length===0){console.warn(`VRMExpressionLoaderPlugin: ${c.name} attempts to bind a morph target to the mesh #${w.mesh} but the mesh is not found or not used in the scene. Ignoring the bind.`);return}const T=w.index;yield Promise.all(M.map(P=>Dn(this,null,function*(){var O;const N=yield QU(e,P);if(!N.every(D=>Array.isArray(D.morphTargetInfluences)&&T{if(w.materialName===void 0||w.propertyName===void 0||w.targetValue===void 0)return;const x=[];e.scene.traverse(T=>{if(T.material){const P=T.material;Array.isArray(P)?x.push(...P.filter(O=>(O.name===w.materialName||O.name===w.materialName+" (Outline)")&&x.indexOf(O)===-1)):P.name===w.materialName&&x.indexOf(P)===-1&&x.push(P)}});const M=w.propertyName;x.forEach(T=>{if(M==="_MainTex_ST"){const O=new He(w.targetValue[0],w.targetValue[1]),N=new He(w.targetValue[2],w.targetValue[3]);N.y=1-N.y-O.y,b.addBind(new rj({material:T,scale:O,offset:N}));return}const P=twe[M];if(P){b.addBind(new tj({material:T,type:P,targetValue:new ct().fromArray(w.targetValue),targetAlpha:w.targetValue[3]}));return}console.warn(M+" is not supported")})}),a.registerExpression(b)}))),a})}};BG.v0v1PresetNameMap={a:"aa",e:"ee",i:"ih",o:"oh",u:"ou",blink:"blink",joy:"happy",angry:"angry",sorrow:"sad",fun:"relaxed",lookup:"lookUp",lookdown:"lookDown",lookleft:"lookLeft",lookright:"lookRight",blink_l:"blinkLeft",blink_r:"blinkRight",neutral:"neutral"};var iwe=BG,sN=class Bm{constructor(e,n){this._firstPersonOnlyLayer=Bm.DEFAULT_FIRSTPERSON_ONLY_LAYER,this._thirdPersonOnlyLayer=Bm.DEFAULT_THIRDPERSON_ONLY_LAYER,this._initializedLayers=!1,this.humanoid=e,this.meshAnnotations=n}copy(e){if(this.humanoid!==e.humanoid)throw new Error("VRMFirstPerson: humanoid must be same in order to copy");return this.meshAnnotations=e.meshAnnotations.map(n=>({meshes:n.meshes.concat(),type:n.type})),this}clone(){return new Bm(this.humanoid,this.meshAnnotations).copy(this)}get firstPersonOnlyLayer(){return this._firstPersonOnlyLayer}get thirdPersonOnlyLayer(){return this._thirdPersonOnlyLayer}setup({firstPersonOnlyLayer:e=Bm.DEFAULT_FIRSTPERSON_ONLY_LAYER,thirdPersonOnlyLayer:n=Bm.DEFAULT_THIRDPERSON_ONLY_LAYER}={}){this._initializedLayers||(this._firstPersonOnlyLayer=e,this._thirdPersonOnlyLayer=n,this.meshAnnotations.forEach(r=>{r.meshes.forEach(i=>{r.type==="firstPersonOnly"?(i.layers.set(this._firstPersonOnlyLayer),i.traverse(s=>s.layers.set(this._firstPersonOnlyLayer))):r.type==="thirdPersonOnly"?(i.layers.set(this._thirdPersonOnlyLayer),i.traverse(s=>s.layers.set(this._thirdPersonOnlyLayer))):r.type==="auto"&&this._createHeadlessModel(i)})}),this._initializedLayers=!0)}_excludeTriangles(e,n,r,i){let s=0;if(n!=null&&n.length>0)for(let a=0;a0&&i.includes(f[0])||d[1]>0&&i.includes(f[1])||d[2]>0&&i.includes(f[2])||d[3]>0&&i.includes(f[3]))continue;const p=n[l],y=r[l];if(p[0]>0&&i.includes(y[0])||p[1]>0&&i.includes(y[1])||p[2]>0&&i.includes(y[2])||p[3]>0&&i.includes(y[3]))continue;const b=n[c],S=r[c];b[0]>0&&i.includes(S[0])||b[1]>0&&i.includes(S[1])||b[2]>0&&i.includes(S[2])||b[3]>0&&i.includes(S[3])||(e[s++]=o,e[s++]=l,e[s++]=c)}return s}_createErasedMesh(e,n){const r=new nM(e.geometry.clone(),e.material);r.name=`${e.name}(erase)`,r.frustumCulled=e.frustumCulled,r.layers.set(this._firstPersonOnlyLayer);const i=r.geometry,s=i.getAttribute("skinIndex"),a=s instanceof tC?[]:s.array,o=[];for(let S=0;S{this._isEraseTarget(s)&&r.push(a)}),!r.length){n.layers.enable(this._thirdPersonOnlyLayer),n.layers.enable(this._firstPersonOnlyLayer);return}n.layers.set(this._thirdPersonOnlyLayer);const i=this._createErasedMesh(n,r);e.add(i)}_createHeadlessModel(e){if(e.type==="Group")if(e.layers.set(this._thirdPersonOnlyLayer),this._isEraseTarget(e))e.traverse(n=>n.layers.set(this._thirdPersonOnlyLayer));else{const n=new Ts;n.name=`_headless_${e.name}`,n.layers.set(this._firstPersonOnlyLayer),e.parent.add(n),e.children.filter(r=>r.type==="SkinnedMesh").forEach(r=>{const i=r;this._createHeadlessModelForSkinnedMesh(n,i)})}else if(e.type==="SkinnedMesh"){const n=e;this._createHeadlessModelForSkinnedMesh(e.parent,n)}else this._isEraseTarget(e)&&(e.layers.set(this._thirdPersonOnlyLayer),e.traverse(n=>n.layers.set(this._thirdPersonOnlyLayer)))}_isEraseTarget(e){return e===this.humanoid.getRawBoneNode("head")?!0:e.parent?this._isEraseTarget(e.parent):!1}};sN.DEFAULT_FIRSTPERSON_ONLY_LAYER=9;sN.DEFAULT_THIRDPERSON_ONLY_LAYER=10;var ij=sN,swe=new Set(["1.0","1.0-beta"]),awe=class{get name(){return"VRMFirstPersonLoaderPlugin"}constructor(t){this.parser=t}afterRoot(t){return Dn(this,null,function*(){const e=t.userData.vrmHumanoid;if(e!==null){if(e===void 0)throw new Error("VRMFirstPersonLoaderPlugin: vrmHumanoid is undefined. VRMHumanoidLoaderPlugin have to be used first");t.userData.vrmFirstPerson=yield this._import(t,e)}})}_import(t,e){return Dn(this,null,function*(){if(e==null)return null;const n=yield this._v1Import(t,e);if(n)return n;const r=yield this._v0Import(t,e);return r||null})}_v1Import(t,e){return Dn(this,null,function*(){var n,r;const i=this.parser.json;if(!(((n=i.extensionsUsed)==null?void 0:n.indexOf("VRMC_vrm"))!==-1))return null;const a=(r=i.extensions)==null?void 0:r.VRMC_vrm;if(!a)return null;const o=a.specVersion;if(!swe.has(o))return console.warn(`VRMFirstPersonLoaderPlugin: Unknown VRMC_vrm specVersion "${o}"`),null;const l=a.firstPerson,c=[],d=yield JU(t);return Array.from(d.entries()).forEach(([f,p])=>{var y,b;const S=(y=l==null?void 0:l.meshAnnotations)==null?void 0:y.find(w=>w.node===f);c.push({meshes:p,type:(b=S==null?void 0:S.type)!=null?b:"auto"})}),new ij(e,c)})}_v0Import(t,e){return Dn(this,null,function*(){var n;const r=this.parser.json,i=(n=r.extensions)==null?void 0:n.VRM;if(!i)return null;const s=i.firstPerson;if(!s)return null;const a=[],o=yield JU(t);return Array.from(o.entries()).forEach(([l,c])=>{const d=r.nodes[l],f=s.meshAnnotations?s.meshAnnotations.find(p=>p.mesh===d.mesh):void 0;a.push({meshes:c,type:this._convertV0FlagToV1Type(f==null?void 0:f.firstPersonFlag)})}),new ij(e,a)})}_convertV0FlagToV1Type(t){return t==="FirstPersonOnly"?"firstPersonOnly":t==="ThirdPersonOnly"?"thirdPersonOnly":t==="Both"?"both":"auto"}},sj=new q,aj=new q,owe=new qt,oj=class extends Ts{constructor(t){super(),this.vrmHumanoid=t,this._boneAxesMap=new Map,Object.values(t.humanBones).forEach(e=>{const n=new pG(1);n.matrixAutoUpdate=!1,n.material.depthTest=!1,n.material.depthWrite=!1,this.add(n),this._boneAxesMap.set(e,n)})}dispose(){Array.from(this._boneAxesMap.values()).forEach(t=>{t.geometry.dispose(),t.material.dispose()})}updateMatrixWorld(t){Array.from(this._boneAxesMap.entries()).forEach(([e,n])=>{e.node.updateWorldMatrix(!0,!1),e.node.matrixWorld.decompose(sj,owe,aj);const r=sj.set(.1,.1,.1).divide(aj);n.matrix.copy(e.node.matrixWorld).scale(r)}),super.updateMatrixWorld(t)}},nT=["hips","spine","chest","upperChest","neck","head","leftEye","rightEye","jaw","leftUpperLeg","leftLowerLeg","leftFoot","leftToes","rightUpperLeg","rightLowerLeg","rightFoot","rightToes","leftShoulder","leftUpperArm","leftLowerArm","leftHand","rightShoulder","rightUpperArm","rightLowerArm","rightHand","leftThumbMetacarpal","leftThumbProximal","leftThumbDistal","leftIndexProximal","leftIndexIntermediate","leftIndexDistal","leftMiddleProximal","leftMiddleIntermediate","leftMiddleDistal","leftRingProximal","leftRingIntermediate","leftRingDistal","leftLittleProximal","leftLittleIntermediate","leftLittleDistal","rightThumbMetacarpal","rightThumbProximal","rightThumbDistal","rightIndexProximal","rightIndexIntermediate","rightIndexDistal","rightMiddleProximal","rightMiddleIntermediate","rightMiddleDistal","rightRingProximal","rightRingIntermediate","rightRingDistal","rightLittleProximal","rightLittleIntermediate","rightLittleDistal"],lwe={hips:null,spine:"hips",chest:"spine",upperChest:"chest",neck:"upperChest",head:"neck",leftEye:"head",rightEye:"head",jaw:"head",leftUpperLeg:"hips",leftLowerLeg:"leftUpperLeg",leftFoot:"leftLowerLeg",leftToes:"leftFoot",rightUpperLeg:"hips",rightLowerLeg:"rightUpperLeg",rightFoot:"rightLowerLeg",rightToes:"rightFoot",leftShoulder:"upperChest",leftUpperArm:"leftShoulder",leftLowerArm:"leftUpperArm",leftHand:"leftLowerArm",rightShoulder:"upperChest",rightUpperArm:"rightShoulder",rightLowerArm:"rightUpperArm",rightHand:"rightLowerArm",leftThumbMetacarpal:"leftHand",leftThumbProximal:"leftThumbMetacarpal",leftThumbDistal:"leftThumbProximal",leftIndexProximal:"leftHand",leftIndexIntermediate:"leftIndexProximal",leftIndexDistal:"leftIndexIntermediate",leftMiddleProximal:"leftHand",leftMiddleIntermediate:"leftMiddleProximal",leftMiddleDistal:"leftMiddleIntermediate",leftRingProximal:"leftHand",leftRingIntermediate:"leftRingProximal",leftRingDistal:"leftRingIntermediate",leftLittleProximal:"leftHand",leftLittleIntermediate:"leftLittleProximal",leftLittleDistal:"leftLittleIntermediate",rightThumbMetacarpal:"rightHand",rightThumbProximal:"rightThumbMetacarpal",rightThumbDistal:"rightThumbProximal",rightIndexProximal:"rightHand",rightIndexIntermediate:"rightIndexProximal",rightIndexDistal:"rightIndexIntermediate",rightMiddleProximal:"rightHand",rightMiddleIntermediate:"rightMiddleProximal",rightMiddleDistal:"rightMiddleIntermediate",rightRingProximal:"rightHand",rightRingIntermediate:"rightRingProximal",rightRingDistal:"rightRingIntermediate",rightLittleProximal:"rightHand",rightLittleIntermediate:"rightLittleProximal",rightLittleDistal:"rightLittleIntermediate"};function VG(t){return t.invert?t.invert():t.inverse(),t}var Hf=new q,Vf=new qt,uC=class{constructor(t){this.humanBones=t,this.restPose=this.getAbsolutePose()}getAbsolutePose(){const t={};return Object.keys(this.humanBones).forEach(e=>{const n=e,r=this.getBoneNode(n);r&&(Hf.copy(r.position),Vf.copy(r.quaternion),t[n]={position:Hf.toArray(),rotation:Vf.toArray()})}),t}getPose(){const t={};return Object.keys(this.humanBones).forEach(e=>{const n=e,r=this.getBoneNode(n);if(!r)return;Hf.set(0,0,0),Vf.identity();const i=this.restPose[n];i!=null&&i.position&&Hf.fromArray(i.position).negate(),i!=null&&i.rotation&&VG(Vf.fromArray(i.rotation)),Hf.add(r.position),Vf.premultiply(r.quaternion),t[n]={position:Hf.toArray(),rotation:Vf.toArray()}}),t}setPose(t){Object.entries(t).forEach(([e,n])=>{const r=e,i=this.getBoneNode(r);if(!i)return;const s=this.restPose[r];s&&(n!=null&&n.position&&(i.position.fromArray(n.position),s.position&&i.position.add(Hf.fromArray(s.position))),n!=null&&n.rotation&&(i.quaternion.fromArray(n.rotation),s.rotation&&i.quaternion.multiply(Vf.fromArray(s.rotation))))})}resetPose(){Object.entries(this.restPose).forEach(([t,e])=>{const n=this.getBoneNode(t);n&&(e!=null&&e.position&&n.position.fromArray(e.position),e!=null&&e.rotation&&n.quaternion.fromArray(e.rotation))})}getBone(t){var e;return(e=this.humanBones[t])!=null?e:void 0}getBoneNode(t){var e,n;return(n=(e=this.humanBones[t])==null?void 0:e.node)!=null?n:null}},rT=new q,cwe=new qt,uwe=new q,lj=class GG extends uC{static _setupTransforms(e){const n=new mn;n.name="VRMHumanoidRig";const r={},i={},s={};nT.forEach(o=>{var l;const c=e.getBoneNode(o);if(c){const d=new q,f=new qt;c.updateWorldMatrix(!0,!1),c.matrixWorld.decompose(d,f,rT),r[o]=d,i[o]=c.quaternion.clone();const p=new qt;(l=c.parent)==null||l.matrixWorld.decompose(rT,p,rT),s[o]=p}});const a={};return nT.forEach(o=>{var l;const c=e.getBoneNode(o);if(c){const d=r[o];let f=o,p;for(;p==null&&(f=lwe[f],f!=null);)p=r[f];const y=new mn;y.name="Normalized_"+c.name,(f?(l=a[f])==null?void 0:l.node:n).add(y),y.position.copy(d),p&&y.position.sub(p),a[o]={node:y}}}),{rigBones:a,root:n,parentWorldRotations:s,boneRotations:i}}constructor(e){const{rigBones:n,root:r,parentWorldRotations:i,boneRotations:s}=GG._setupTransforms(e);super(n),this.original=e,this.root=r,this._parentWorldRotations=i,this._boneRotations=s}update(){nT.forEach(e=>{const n=this.original.getBoneNode(e);if(n!=null){const r=this.getBoneNode(e),i=this._parentWorldRotations[e],s=cwe.copy(i).invert(),a=this._boneRotations[e];if(n.quaternion.copy(r.quaternion).multiply(i).premultiply(s).multiply(a),e==="hips"){const o=r.getWorldPosition(uwe);n.parent.updateWorldMatrix(!0,!1);const l=n.parent.matrixWorld,c=o.applyMatrix4(l.invert());n.position.copy(c)}}})}},cj=class WG{get restPose(){return console.warn("VRMHumanoid: restPose is deprecated. Use either rawRestPose or normalizedRestPose instead."),this.rawRestPose}get rawRestPose(){return this._rawHumanBones.restPose}get normalizedRestPose(){return this._normalizedHumanBones.restPose}get humanBones(){return this._rawHumanBones.humanBones}get rawHumanBones(){return this._rawHumanBones.humanBones}get normalizedHumanBones(){return this._normalizedHumanBones.humanBones}get normalizedHumanBonesRoot(){return this._normalizedHumanBones.root}constructor(e,n){var r;this.autoUpdateHumanBones=(r=n==null?void 0:n.autoUpdateHumanBones)!=null?r:!0,this._rawHumanBones=new uC(e),this._normalizedHumanBones=new lj(this._rawHumanBones)}copy(e){return this.autoUpdateHumanBones=e.autoUpdateHumanBones,this._rawHumanBones=new uC(e.humanBones),this._normalizedHumanBones=new lj(this._rawHumanBones),this}clone(){return new WG(this.humanBones,{autoUpdateHumanBones:this.autoUpdateHumanBones}).copy(this)}getAbsolutePose(){return console.warn("VRMHumanoid: getAbsolutePose() is deprecated. Use either getRawAbsolutePose() or getNormalizedAbsolutePose() instead."),this.getRawAbsolutePose()}getRawAbsolutePose(){return this._rawHumanBones.getAbsolutePose()}getNormalizedAbsolutePose(){return this._normalizedHumanBones.getAbsolutePose()}getPose(){return console.warn("VRMHumanoid: getPose() is deprecated. Use either getRawPose() or getNormalizedPose() instead."),this.getRawPose()}getRawPose(){return this._rawHumanBones.getPose()}getNormalizedPose(){return this._normalizedHumanBones.getPose()}setPose(e){return console.warn("VRMHumanoid: setPose() is deprecated. Use either setRawPose() or setNormalizedPose() instead."),this.setRawPose(e)}setRawPose(e){return this._rawHumanBones.setPose(e)}setNormalizedPose(e){return this._normalizedHumanBones.setPose(e)}resetPose(){return console.warn("VRMHumanoid: resetPose() is deprecated. Use either resetRawPose() or resetNormalizedPose() instead."),this.resetRawPose()}resetRawPose(){return this._rawHumanBones.resetPose()}resetNormalizedPose(){return this._normalizedHumanBones.resetPose()}getBone(e){return console.warn("VRMHumanoid: getBone() is deprecated. Use either getRawBone() or getNormalizedBone() instead."),this.getRawBone(e)}getRawBone(e){return this._rawHumanBones.getBone(e)}getNormalizedBone(e){return this._normalizedHumanBones.getBone(e)}getBoneNode(e){return console.warn("VRMHumanoid: getBoneNode() is deprecated. Use either getRawBoneNode() or getNormalizedBoneNode() instead."),this.getRawBoneNode(e)}getRawBoneNode(e){return this._rawHumanBones.getBoneNode(e)}getNormalizedBoneNode(e){return this._normalizedHumanBones.getBoneNode(e)}update(){this.autoUpdateHumanBones&&this._normalizedHumanBones.update()}},dwe={Hips:"hips",Spine:"spine",Head:"head",LeftUpperLeg:"leftUpperLeg",LeftLowerLeg:"leftLowerLeg",LeftFoot:"leftFoot",RightUpperLeg:"rightUpperLeg",RightLowerLeg:"rightLowerLeg",RightFoot:"rightFoot",LeftUpperArm:"leftUpperArm",LeftLowerArm:"leftLowerArm",LeftHand:"leftHand",RightUpperArm:"rightUpperArm",RightLowerArm:"rightLowerArm",RightHand:"rightHand"},fwe=new Set(["1.0","1.0-beta"]),uj={leftThumbProximal:"leftThumbMetacarpal",leftThumbIntermediate:"leftThumbProximal",rightThumbProximal:"rightThumbMetacarpal",rightThumbIntermediate:"rightThumbProximal"},hwe=class{get name(){return"VRMHumanoidLoaderPlugin"}constructor(t,e){this.parser=t,this.helperRoot=e==null?void 0:e.helperRoot,this.autoUpdateHumanBones=e==null?void 0:e.autoUpdateHumanBones}afterRoot(t){return Dn(this,null,function*(){t.userData.vrmHumanoid=yield this._import(t)})}_import(t){return Dn(this,null,function*(){const e=yield this._v1Import(t);if(e)return e;const n=yield this._v0Import(t);return n||null})}_v1Import(t){return Dn(this,null,function*(){var e,n;const r=this.parser.json;if(!(((e=r.extensionsUsed)==null?void 0:e.indexOf("VRMC_vrm"))!==-1))return null;const s=(n=r.extensions)==null?void 0:n.VRMC_vrm;if(!s)return null;const a=s.specVersion;if(!fwe.has(a))return console.warn(`VRMHumanoidLoaderPlugin: Unknown VRMC_vrm specVersion "${a}"`),null;const o=s.humanoid;if(!o)return null;const l=o.humanBones.leftThumbIntermediate!=null||o.humanBones.rightThumbIntermediate!=null,c={};o.humanBones!=null&&(yield Promise.all(Object.entries(o.humanBones).map(f=>Dn(this,[f],function*([p,y]){let b=p;const S=y.node;if(l){const x=uj[b];x!=null&&(b=x)}const w=yield this.parser.getDependency("node",S);if(w==null){console.warn(`A glTF node bound to the humanoid bone ${b} (index = ${S}) does not exist`);return}c[b]={node:w}}))));const d=new cj(this._ensureRequiredBonesExist(c),{autoUpdateHumanBones:this.autoUpdateHumanBones});if(t.scene.add(d.normalizedHumanBonesRoot),this.helperRoot){const f=new oj(d);this.helperRoot.add(f),f.renderOrder=this.helperRoot.renderOrder}return d})}_v0Import(t){return Dn(this,null,function*(){var e;const r=(e=this.parser.json.extensions)==null?void 0:e.VRM;if(!r)return null;const i=r.humanoid;if(!i)return null;const s={};i.humanBones!=null&&(yield Promise.all(i.humanBones.map(o=>Dn(this,null,function*(){const l=o.bone,c=o.node;if(l==null||c==null)return;if(c<0){console.warn(`A glTF node index for the humanoid bone ${l} is negative (${c}), ignoring this bone.`);return}const d=yield this.parser.getDependency("node",c);if(d==null){console.warn(`A glTF node bound to the humanoid bone ${l} (index = ${c}) does not exist`);return}const f=uj[l],p=f??l;if(s[p]!=null){console.warn(`Multiple bone entries for ${p} detected (index = ${c}), ignoring duplicated entries.`);return}s[p]={node:d}}))));const a=new cj(this._ensureRequiredBonesExist(s),{autoUpdateHumanBones:this.autoUpdateHumanBones});if(t.scene.add(a.normalizedHumanBonesRoot),this.helperRoot){const o=new oj(a);this.helperRoot.add(o),o.renderOrder=this.helperRoot.renderOrder}return a})}_ensureRequiredBonesExist(t){const e=Object.values(dwe).filter(n=>t[n]==null);if(e.length>0)throw new Error(`VRMHumanoidLoaderPlugin: These humanoid bones are required but not exist: ${e.join(", ")}`);return t}},dj=class extends Yt{constructor(){super(),this._currentTheta=0,this._currentRadius=0,this.theta=0,this.radius=0,this._currentTheta=0,this._currentRadius=0,this._attrPos=new Qt(new Float32Array(195),3),this.setAttribute("position",this._attrPos),this._attrIndex=new Qt(new Uint16Array(189),1),this.setIndex(this._attrIndex),this._buildIndex(),this.update()}update(){let t=!1;this._currentTheta!==this.theta&&(this._currentTheta=this.theta,t=!0),this._currentRadius!==this.radius&&(this._currentRadius=this.radius,t=!0),t&&this._buildPosition()}_buildPosition(){this._attrPos.setXYZ(0,0,0,0);for(let t=0;t<64;t++){const e=t/63*this._currentTheta;this._attrPos.setXYZ(t+1,this._currentRadius*Math.sin(e),0,this._currentRadius*Math.cos(e))}this._attrPos.needsUpdate=!0}_buildIndex(){for(let t=0;t<63;t++)this._attrIndex.setXYZ(t*3,0,t+1,t+2);this._attrIndex.needsUpdate=!0}},pwe=class extends Yt{constructor(){super(),this.radius=0,this._currentRadius=0,this.tail=new q,this._currentTail=new q,this._attrPos=new Qt(new Float32Array(294),3),this.setAttribute("position",this._attrPos),this._attrIndex=new Qt(new Uint16Array(194),1),this.setIndex(this._attrIndex),this._buildIndex(),this.update()}update(){let t=!1;this._currentRadius!==this.radius&&(this._currentRadius=this.radius,t=!0),this._currentTail.equals(this.tail)||(this._currentTail.copy(this.tail),t=!0),t&&this._buildPosition()}_buildPosition(){for(let t=0;t<32;t++){const e=t/16*Math.PI;this._attrPos.setXYZ(t,Math.cos(e),Math.sin(e),0),this._attrPos.setXYZ(32+t,0,Math.cos(e),Math.sin(e)),this._attrPos.setXYZ(64+t,Math.sin(e),0,Math.cos(e))}this.scale(this._currentRadius,this._currentRadius,this._currentRadius),this.translate(this._currentTail.x,this._currentTail.y,this._currentTail.z),this._attrPos.setXYZ(96,0,0,0),this._attrPos.setXYZ(97,this._currentTail.x,this._currentTail.y,this._currentTail.z),this._attrPos.needsUpdate=!0}_buildIndex(){for(let t=0;t<32;t++){const e=(t+1)%32;this._attrIndex.setXY(t*2,t,e),this._attrIndex.setXY(64+t*2,32+t,32+e),this._attrIndex.setXY(128+t*2,64+t,64+e)}this._attrIndex.setXY(192,96,97),this._attrIndex.needsUpdate=!0}},L_=new qt,fj=new qt,O0=new q,hj=new q,pj=Math.sqrt(2)/2,mwe=new qt(0,0,-pj,pj),gwe=new q(0,1,0),vwe=class extends Ts{constructor(t){super(),this.matrixAutoUpdate=!1,this.vrmLookAt=t;{const e=new dj;e.radius=.5;const n=new As({color:65280,transparent:!0,opacity:.5,side:ya,depthTest:!1,depthWrite:!1});this._meshPitch=new xr(e,n),this.add(this._meshPitch)}{const e=new dj;e.radius=.5;const n=new As({color:16711680,transparent:!0,opacity:.5,side:ya,depthTest:!1,depthWrite:!1});this._meshYaw=new xr(e,n),this.add(this._meshYaw)}{const e=new pwe;e.radius=.1;const n=new $r({color:16777215,depthTest:!1,depthWrite:!1});this._lineTarget=new ea(e,n),this._lineTarget.frustumCulled=!1,this.add(this._lineTarget)}}dispose(){this._meshYaw.geometry.dispose(),this._meshYaw.material.dispose(),this._meshPitch.geometry.dispose(),this._meshPitch.material.dispose(),this._lineTarget.geometry.dispose(),this._lineTarget.material.dispose()}updateMatrixWorld(t){const e=vr.DEG2RAD*this.vrmLookAt.yaw;this._meshYaw.geometry.theta=e,this._meshYaw.geometry.update();const n=vr.DEG2RAD*this.vrmLookAt.pitch;this._meshPitch.geometry.theta=n,this._meshPitch.geometry.update(),this.vrmLookAt.getLookAtWorldPosition(O0),this.vrmLookAt.getLookAtWorldQuaternion(L_),L_.multiply(this.vrmLookAt.getFaceFrontQuaternion(fj)),this._meshYaw.position.copy(O0),this._meshYaw.quaternion.copy(L_),this._meshPitch.position.copy(O0),this._meshPitch.quaternion.copy(L_),this._meshPitch.quaternion.multiply(fj.setFromAxisAngle(gwe,e)),this._meshPitch.quaternion.multiply(mwe);const{target:r,autoUpdate:i}=this.vrmLookAt;r!=null&&i&&(r.getWorldPosition(hj).sub(O0),this._lineTarget.geometry.tail.copy(hj),this._lineTarget.geometry.update(),this._lineTarget.position.copy(O0)),super.updateMatrixWorld(t)}},ywe=new q,xwe=new q;function dC(t,e){return t.matrixWorld.decompose(ywe,e,xwe),e}function Z_(t){return[Math.atan2(-t.z,t.x),Math.atan2(t.y,Math.sqrt(t.x*t.x+t.z*t.z))]}function mj(t){const e=Math.round(t/2/Math.PI);return t-2*Math.PI*e}var gj=new q(0,0,1),bwe=new q,_we=new q,wwe=new q,Swe=new qt,iT=new qt,vj=new qt,Mwe=new qt,sT=new ls,$G=class XG{constructor(e,n){this.offsetFromHeadBone=new q,this.autoUpdate=!0,this.faceFront=new q(0,0,1),this.humanoid=e,this.applier=n,this._yaw=0,this._pitch=0,this._needsUpdate=!0,this._restHeadWorldQuaternion=this.getLookAtWorldQuaternion(new qt)}get yaw(){return this._yaw}set yaw(e){this._yaw=e,this._needsUpdate=!0}get pitch(){return this._pitch}set pitch(e){this._pitch=e,this._needsUpdate=!0}get euler(){return console.warn("VRMLookAt: euler is deprecated. use getEuler() instead."),this.getEuler(new ls)}getEuler(e){return e.set(vr.DEG2RAD*this._pitch,vr.DEG2RAD*this._yaw,0,"YXZ")}copy(e){if(this.humanoid!==e.humanoid)throw new Error("VRMLookAt: humanoid must be same in order to copy");return this.offsetFromHeadBone.copy(e.offsetFromHeadBone),this.applier=e.applier,this.autoUpdate=e.autoUpdate,this.target=e.target,this.faceFront.copy(e.faceFront),this}clone(){return new XG(this.humanoid,this.applier).copy(this)}reset(){this._yaw=0,this._pitch=0,this._needsUpdate=!0}getLookAtWorldPosition(e){const n=this.humanoid.getRawBoneNode("head");return e.copy(this.offsetFromHeadBone).applyMatrix4(n.matrixWorld)}getLookAtWorldQuaternion(e){const n=this.humanoid.getRawBoneNode("head");return dC(n,e)}getFaceFrontQuaternion(e){if(this.faceFront.distanceToSquared(gj)<.01)return e.copy(this._restHeadWorldQuaternion).invert();const[n,r]=Z_(this.faceFront);return sT.set(0,.5*Math.PI+n,r,"YZX"),e.setFromEuler(sT).premultiply(Mwe.copy(this._restHeadWorldQuaternion).invert())}getLookAtWorldDirection(e){return this.getLookAtWorldQuaternion(iT),this.getFaceFrontQuaternion(vj),e.copy(gj).applyQuaternion(iT).applyQuaternion(vj).applyEuler(this.getEuler(sT))}lookAt(e){const n=Swe.copy(this._restHeadWorldQuaternion).multiply(VG(this.getLookAtWorldQuaternion(iT))),r=this.getLookAtWorldPosition(_we),i=wwe.copy(e).sub(r).applyQuaternion(n).normalize(),[s,a]=Z_(this.faceFront),[o,l]=Z_(i),c=mj(o-s),d=mj(a-l);this._yaw=vr.RAD2DEG*c,this._pitch=vr.RAD2DEG*d,this._needsUpdate=!0}update(e){this.target!=null&&this.autoUpdate&&this.lookAt(this.target.getWorldPosition(bwe)),this._needsUpdate&&(this._needsUpdate=!1,this.applier.applyYawPitch(this._yaw,this._pitch))}};$G.EULER_ORDER="YXZ";var Ewe=$G,Awe=new q(0,0,1),ml=new qt,km=new qt,Fa=new ls(0,0,0,"YXZ"),Q_=class{constructor(t,e,n,r,i){this.humanoid=t,this.rangeMapHorizontalInner=e,this.rangeMapHorizontalOuter=n,this.rangeMapVerticalDown=r,this.rangeMapVerticalUp=i,this.faceFront=new q(0,0,1),this._restQuatLeftEye=new qt,this._restQuatRightEye=new qt,this._restLeftEyeParentWorldQuat=new qt,this._restRightEyeParentWorldQuat=new qt;const s=this.humanoid.getRawBoneNode("leftEye"),a=this.humanoid.getRawBoneNode("rightEye");s&&(this._restQuatLeftEye.copy(s.quaternion),dC(s.parent,this._restLeftEyeParentWorldQuat)),a&&(this._restQuatRightEye.copy(a.quaternion),dC(a.parent,this._restRightEyeParentWorldQuat))}applyYawPitch(t,e){const n=this.humanoid.getRawBoneNode("leftEye"),r=this.humanoid.getRawBoneNode("rightEye"),i=this.humanoid.getNormalizedBoneNode("leftEye"),s=this.humanoid.getNormalizedBoneNode("rightEye");n&&(e<0?Fa.x=-vr.DEG2RAD*this.rangeMapVerticalDown.map(-e):Fa.x=vr.DEG2RAD*this.rangeMapVerticalUp.map(e),t<0?Fa.y=-vr.DEG2RAD*this.rangeMapHorizontalInner.map(-t):Fa.y=vr.DEG2RAD*this.rangeMapHorizontalOuter.map(t),ml.setFromEuler(Fa),this._getWorldFaceFrontQuat(km),i.quaternion.copy(km).multiply(ml).multiply(km.invert()),ml.copy(this._restLeftEyeParentWorldQuat),n.quaternion.copy(i.quaternion).multiply(ml).premultiply(ml.invert()).multiply(this._restQuatLeftEye)),r&&(e<0?Fa.x=-vr.DEG2RAD*this.rangeMapVerticalDown.map(-e):Fa.x=vr.DEG2RAD*this.rangeMapVerticalUp.map(e),t<0?Fa.y=-vr.DEG2RAD*this.rangeMapHorizontalOuter.map(-t):Fa.y=vr.DEG2RAD*this.rangeMapHorizontalInner.map(t),ml.setFromEuler(Fa),this._getWorldFaceFrontQuat(km),s.quaternion.copy(km).multiply(ml).multiply(km.invert()),ml.copy(this._restRightEyeParentWorldQuat),r.quaternion.copy(s.quaternion).multiply(ml).premultiply(ml.invert()).multiply(this._restQuatRightEye))}lookAt(t){console.warn("VRMLookAtBoneApplier: lookAt() is deprecated. use apply() instead.");const e=vr.RAD2DEG*t.y,n=vr.RAD2DEG*t.x;this.applyYawPitch(e,n)}_getWorldFaceFrontQuat(t){if(this.faceFront.distanceToSquared(Awe)<.01)return t.identity();const[e,n]=Z_(this.faceFront);return Fa.set(0,.5*Math.PI+e,n,"YZX"),t.setFromEuler(Fa)}};Q_.type="bone";var fC=class{constructor(t,e,n,r,i){this.expressions=t,this.rangeMapHorizontalInner=e,this.rangeMapHorizontalOuter=n,this.rangeMapVerticalDown=r,this.rangeMapVerticalUp=i}applyYawPitch(t,e){e<0?(this.expressions.setValue("lookDown",0),this.expressions.setValue("lookUp",this.rangeMapVerticalUp.map(-e))):(this.expressions.setValue("lookUp",0),this.expressions.setValue("lookDown",this.rangeMapVerticalDown.map(e))),t<0?(this.expressions.setValue("lookLeft",0),this.expressions.setValue("lookRight",this.rangeMapHorizontalOuter.map(-t))):(this.expressions.setValue("lookRight",0),this.expressions.setValue("lookLeft",this.rangeMapHorizontalOuter.map(t)))}lookAt(t){console.warn("VRMLookAtBoneApplier: lookAt() is deprecated. use apply() instead.");const e=vr.RAD2DEG*t.y,n=vr.RAD2DEG*t.x;this.applyYawPitch(e,n)}};fC.type="expression";var yj=class{constructor(t,e){this.inputMaxValue=t,this.outputScale=e}map(t){return this.outputScale*LG(t/this.inputMaxValue)}},Twe=new Set(["1.0","1.0-beta"]),D_=.01,Pwe=class{get name(){return"VRMLookAtLoaderPlugin"}constructor(t,e){this.parser=t,this.helperRoot=e==null?void 0:e.helperRoot}afterRoot(t){return Dn(this,null,function*(){const e=t.userData.vrmHumanoid;if(e===null)return;if(e===void 0)throw new Error("VRMLookAtLoaderPlugin: vrmHumanoid is undefined. VRMHumanoidLoaderPlugin have to be used first");const n=t.userData.vrmExpressionManager;if(n!==null){if(n===void 0)throw new Error("VRMLookAtLoaderPlugin: vrmExpressionManager is undefined. VRMExpressionLoaderPlugin have to be used first");t.userData.vrmLookAt=yield this._import(t,e,n)}})}_import(t,e,n){return Dn(this,null,function*(){if(e==null||n==null)return null;const r=yield this._v1Import(t,e,n);if(r)return r;const i=yield this._v0Import(t,e,n);return i||null})}_v1Import(t,e,n){return Dn(this,null,function*(){var r,i,s;const a=this.parser.json;if(!(((r=a.extensionsUsed)==null?void 0:r.indexOf("VRMC_vrm"))!==-1))return null;const l=(i=a.extensions)==null?void 0:i.VRMC_vrm;if(!l)return null;const c=l.specVersion;if(!Twe.has(c))return console.warn(`VRMLookAtLoaderPlugin: Unknown VRMC_vrm specVersion "${c}"`),null;const d=l.lookAt;if(!d)return null;const f=d.type==="expression"?1:10,p=this._v1ImportRangeMap(d.rangeMapHorizontalInner,f),y=this._v1ImportRangeMap(d.rangeMapHorizontalOuter,f),b=this._v1ImportRangeMap(d.rangeMapVerticalDown,f),S=this._v1ImportRangeMap(d.rangeMapVerticalUp,f);let w;d.type==="expression"?w=new fC(n,p,y,b,S):w=new Q_(e,p,y,b,S);const x=this._importLookAt(e,w);return x.offsetFromHeadBone.fromArray((s=d.offsetFromHeadBone)!=null?s:[0,.06,0]),x})}_v1ImportRangeMap(t,e){var n,r;let i=(n=t==null?void 0:t.inputMaxValue)!=null?n:90;const s=(r=t==null?void 0:t.outputScale)!=null?r:e;return i(console.error(a),console.warn("VRMMetaLoaderPlugin: Failed to load a thumbnail image"),null))})}},Iwe=class{constructor(t){this.scene=t.scene,this.meta=t.meta,this.humanoid=t.humanoid,this.expressionManager=t.expressionManager,this.firstPerson=t.firstPerson,this.lookAt=t.lookAt}update(t){this.humanoid.update(),this.lookAt&&this.lookAt.update(t),this.expressionManager&&this.expressionManager.update()}},kwe=class extends Iwe{constructor(t){super(t),this.materials=t.materials,this.springBoneManager=t.springBoneManager,this.nodeConstraintManager=t.nodeConstraintManager}update(t){super.update(t),this.nodeConstraintManager&&this.nodeConstraintManager.update(),this.springBoneManager&&this.springBoneManager.update(t),this.materials&&this.materials.forEach(e=>{e.update&&e.update(t)})}},Owe=Object.defineProperty,xj=Object.getOwnPropertySymbols,Lwe=Object.prototype.hasOwnProperty,Dwe=Object.prototype.propertyIsEnumerable,bj=(t,e,n)=>e in t?Owe(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,_j=(t,e)=>{for(var n in e||(e={}))Lwe.call(e,n)&&bj(t,n,e[n]);if(xj)for(var n of xj(e))Dwe.call(e,n)&&bj(t,n,e[n]);return t},fh=(t,e,n)=>new Promise((r,i)=>{var s=l=>{try{o(n.next(l))}catch(c){i(c)}},a=l=>{try{o(n.throw(l))}catch(c){i(c)}},o=l=>l.done?r(l.value):Promise.resolve(l.value).then(s,a);o((n=n.apply(t,e)).next())}),Uwe={"":3e3,srgb:3001};function jwe(t,e){parseInt(Pd,10)>=152?t.colorSpace=e:t.encoding=Uwe[e]}var Fwe=class{get pending(){return Promise.all(this._pendings)}constructor(t,e){this._parser=t,this._materialParams=e,this._pendings=[]}assignPrimitive(t,e){e!=null&&(this._materialParams[t]=e)}assignColor(t,e,n){if(e!=null){const r=new ct().fromArray(e);n&&r.convertSRGBToLinear(),this._materialParams[t]=r}}assignTexture(t,e,n){return fh(this,null,function*(){const r=fh(this,null,function*(){if(e!=null){const i=yield this._parser.assignTexture(this._materialParams,t,e);if(i==null){console.warn("GLTFMToonMaterialParamsAssignHelper: Failed to load texture. The rendering result may be wrong");return}n&&jwe(i,"srgb")}});return this._pendings.push(r),r})}assignTextureByIndex(t,e,n){return fh(this,null,function*(){return this.assignTexture(t,e!=null?{index:e}:void 0,n)})}},zwe=`// #define PHONG - -varying vec3 vViewPosition; - -#ifndef FLAT_SHADED - varying vec3 vNormal; -#endif - -#include - -// #include -#ifdef MTOON_USE_UV - varying vec2 vUv; - - // COMPAT: pre-r151 uses a common uvTransform - #if THREE_VRM_THREE_REVISION < 151 - uniform mat3 uvTransform; - #endif -#endif - -// #include -// COMAPT: pre-r151 uses uv2 for lightMap and aoMap -#if THREE_VRM_THREE_REVISION < 151 - #if defined( USE_LIGHTMAP ) || defined( USE_AOMAP ) - attribute vec2 uv2; - varying vec2 vUv2; - uniform mat3 uv2Transform; - #endif -#endif - -// #include -// #include -#include -#include -#include -#include -#include -#include -#include - -#ifdef USE_OUTLINEWIDTHMULTIPLYTEXTURE - uniform sampler2D outlineWidthMultiplyTexture; - uniform mat3 outlineWidthMultiplyTextureUvTransform; -#endif - -uniform float outlineWidthFactor; - -void main() { - - // #include - #ifdef MTOON_USE_UV - // COMPAT: pre-r151 uses a common uvTransform - #if THREE_VRM_THREE_REVISION >= 151 - vUv = uv; - #else - vUv = ( uvTransform * vec3( uv, 1 ) ).xy; - #endif - #endif - - // #include - // COMAPT: pre-r151 uses uv2 for lightMap and aoMap - #if THREE_VRM_THREE_REVISION < 151 - #if defined( USE_LIGHTMAP ) || defined( USE_AOMAP ) - vUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy; - #endif - #endif - - #include - - #include - #include - #include - #include - - // we need this to compute the outline properly - objectNormal = normalize( objectNormal ); - - #include - - #ifndef FLAT_SHADED // Normal computed with derivatives when FLAT_SHADED - vNormal = normalize( transformedNormal ); - #endif - - #include - - #include - #include - // #include - #include - #include - #include - - vViewPosition = - mvPosition.xyz; - - #ifdef OUTLINE - float worldNormalLength = length( transformedNormal ); - vec3 outlineOffset = outlineWidthFactor * worldNormalLength * objectNormal; - - #ifdef USE_OUTLINEWIDTHMULTIPLYTEXTURE - vec2 outlineWidthMultiplyTextureUv = ( outlineWidthMultiplyTextureUvTransform * vec3( vUv, 1 ) ).xy; - float outlineTex = texture2D( outlineWidthMultiplyTexture, outlineWidthMultiplyTextureUv ).g; - outlineOffset *= outlineTex; - #endif - - #ifdef OUTLINE_WIDTH_SCREEN - outlineOffset *= vViewPosition.z / projectionMatrix[ 1 ].y; - #endif - - gl_Position = projectionMatrix * modelViewMatrix * vec4( outlineOffset + transformed, 1.0 ); - - gl_Position.z += 1E-6 * gl_Position.w; // anti-artifact magic - #endif - - #include - // #include - #include - #include - -}`,Bwe=`// #define PHONG - -uniform vec3 litFactor; - -uniform float opacity; - -uniform vec3 shadeColorFactor; -#ifdef USE_SHADEMULTIPLYTEXTURE - uniform sampler2D shadeMultiplyTexture; - uniform mat3 shadeMultiplyTextureUvTransform; -#endif - -uniform float shadingShiftFactor; -uniform float shadingToonyFactor; - -#ifdef USE_SHADINGSHIFTTEXTURE - uniform sampler2D shadingShiftTexture; - uniform mat3 shadingShiftTextureUvTransform; - uniform float shadingShiftTextureScale; -#endif - -uniform float giEqualizationFactor; - -uniform vec3 parametricRimColorFactor; -#ifdef USE_RIMMULTIPLYTEXTURE - uniform sampler2D rimMultiplyTexture; - uniform mat3 rimMultiplyTextureUvTransform; -#endif -uniform float rimLightingMixFactor; -uniform float parametricRimFresnelPowerFactor; -uniform float parametricRimLiftFactor; - -#ifdef USE_MATCAPTEXTURE - uniform vec3 matcapFactor; - uniform sampler2D matcapTexture; - uniform mat3 matcapTextureUvTransform; -#endif - -uniform vec3 emissive; -uniform float emissiveIntensity; - -uniform vec3 outlineColorFactor; -uniform float outlineLightingMixFactor; - -#ifdef USE_UVANIMATIONMASKTEXTURE - uniform sampler2D uvAnimationMaskTexture; - uniform mat3 uvAnimationMaskTextureUvTransform; -#endif - -uniform float uvAnimationScrollXOffset; -uniform float uvAnimationScrollYOffset; -uniform float uvAnimationRotationPhase; - -#include -#include -#include -#include - -// #include -#if ( defined( MTOON_USE_UV ) && !defined( MTOON_UVS_VERTEX_ONLY ) ) - varying vec2 vUv; -#endif - -// #include -// COMAPT: pre-r151 uses uv2 for lightMap and aoMap -#if THREE_VRM_THREE_REVISION < 151 - #if defined( USE_LIGHTMAP ) || defined( USE_AOMAP ) - varying vec2 vUv2; - #endif -#endif - -#include - -#ifdef USE_MAP - uniform mat3 mapUvTransform; -#endif - -// #include - -#include - -#include -// #include -#include - -#ifdef USE_EMISSIVEMAP - uniform mat3 emissiveMapUvTransform; -#endif - -// #include -// #include -// #include -#include - -// #include -// COMPAT: pre-r151 doesn't have BRDF_Lambert in -#if THREE_VRM_THREE_REVISION < 151 - vec3 BRDF_Lambert( const in vec3 diffuseColor ) { - return RECIPROCAL_PI * diffuseColor; - } -#endif - -#include - -#include - -// #include -varying vec3 vViewPosition; - -struct MToonMaterial { - vec3 diffuseColor; - vec3 shadeColor; - float shadingShift; -}; - -float linearstep( float a, float b, float t ) { - return clamp( ( t - a ) / ( b - a ), 0.0, 1.0 ); -} - -/** - * Convert NdotL into toon shading factor using shadingShift and shadingToony - */ -float getShading( - const in float dotNL, - const in float shadow, - const in float shadingShift -) { - float shading = dotNL; - shading = shading + shadingShift; - shading = linearstep( -1.0 + shadingToonyFactor, 1.0 - shadingToonyFactor, shading ); - shading *= shadow; - return shading; -} - -/** - * Mix diffuseColor and shadeColor using shading factor and light color - */ -vec3 getDiffuse( - const in MToonMaterial material, - const in float shading, - in vec3 lightColor -) { - #ifdef DEBUG_LITSHADERATE - return vec3( BRDF_Lambert( shading * lightColor ) ); - #endif - - vec3 col = lightColor * BRDF_Lambert( mix( material.shadeColor, material.diffuseColor, shading ) ); - - // The "comment out if you want to PBR absolutely" line - #ifdef V0_COMPAT_SHADE - col = min( col, material.diffuseColor ); - #endif - - return col; -} - -// COMPAT: pre-r156 uses a struct GeometricContext -#if THREE_VRM_THREE_REVISION >= 157 - void RE_Direct_MToon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in MToonMaterial material, const in float shadow, inout ReflectedLight reflectedLight ) { - float dotNL = clamp( dot( geometryNormal, directLight.direction ), -1.0, 1.0 ); - vec3 irradiance = directLight.color; - - // directSpecular will be used for rim lighting, not an actual specular - reflectedLight.directSpecular += irradiance; - - irradiance *= dotNL; - - float shading = getShading( dotNL, shadow, material.shadingShift ); - - // toon shaded diffuse - reflectedLight.directDiffuse += getDiffuse( material, shading, directLight.color ); - } - - void RE_IndirectDiffuse_MToon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in MToonMaterial material, inout ReflectedLight reflectedLight ) { - // indirect diffuse will use diffuseColor, no shadeColor involved - reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); - - // directSpecular will be used for rim lighting, not an actual specular - reflectedLight.directSpecular += irradiance; - } -#else - void RE_Direct_MToon( const in IncidentLight directLight, const in GeometricContext geometry, const in MToonMaterial material, const in float shadow, inout ReflectedLight reflectedLight ) { - float dotNL = clamp( dot( geometry.normal, directLight.direction ), -1.0, 1.0 ); - vec3 irradiance = directLight.color; - - // directSpecular will be used for rim lighting, not an actual specular - reflectedLight.directSpecular += irradiance; - - irradiance *= dotNL; - - float shading = getShading( dotNL, shadow, material.shadingShift ); - - // toon shaded diffuse - reflectedLight.directDiffuse += getDiffuse( material, shading, directLight.color ); - } - - void RE_IndirectDiffuse_MToon( const in vec3 irradiance, const in GeometricContext geometry, const in MToonMaterial material, inout ReflectedLight reflectedLight ) { - // indirect diffuse will use diffuseColor, no shadeColor involved - reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); - - // directSpecular will be used for rim lighting, not an actual specular - reflectedLight.directSpecular += irradiance; - } -#endif - -#define RE_Direct RE_Direct_MToon -#define RE_IndirectDiffuse RE_IndirectDiffuse_MToon -#define Material_LightProbeLOD( material ) (0) - -#include -// #include - -// #include -#ifdef USE_NORMALMAP - - uniform sampler2D normalMap; - uniform mat3 normalMapUvTransform; - uniform vec2 normalScale; - -#endif - -// COMPAT: pre-r151 -// USE_NORMALMAP_OBJECTSPACE used to be OBJECTSPACE_NORMALMAP in pre-r151 -#if defined( USE_NORMALMAP_OBJECTSPACE ) || defined( OBJECTSPACE_NORMALMAP ) - - uniform mat3 normalMatrix; - -#endif - -// COMPAT: pre-r151 -// USE_NORMALMAP_TANGENTSPACE used to be TANGENTSPACE_NORMALMAP in pre-r151 -#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( TANGENTSPACE_NORMALMAP ) ) - - // Per-Pixel Tangent Space Normal Mapping - // http://hacksoflife.blogspot.ch/2009/11/per-pixel-tangent-space-normal-mapping.html - - // three-vrm specific change: it requires \`uv\` as an input in order to support uv scrolls - - // Temporary compat against shader change @ Three.js r126, r151 - #if THREE_VRM_THREE_REVISION >= 151 - - mat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) { - - vec3 q0 = dFdx( eye_pos.xyz ); - vec3 q1 = dFdy( eye_pos.xyz ); - vec2 st0 = dFdx( uv.st ); - vec2 st1 = dFdy( uv.st ); - - vec3 N = surf_norm; - - vec3 q1perp = cross( q1, N ); - vec3 q0perp = cross( N, q0 ); - - vec3 T = q1perp * st0.x + q0perp * st1.x; - vec3 B = q1perp * st0.y + q0perp * st1.y; - - float det = max( dot( T, T ), dot( B, B ) ); - float scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det ); - - return mat3( T * scale, B * scale, N ); - - } - - #else - - vec3 perturbNormal2Arb( vec2 uv, vec3 eye_pos, vec3 surf_norm, vec3 mapN, float faceDirection ) { - - vec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) ); - vec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) ); - vec2 st0 = dFdx( uv.st ); - vec2 st1 = dFdy( uv.st ); - - vec3 N = normalize( surf_norm ); - - vec3 q1perp = cross( q1, N ); - vec3 q0perp = cross( N, q0 ); - - vec3 T = q1perp * st0.x + q0perp * st1.x; - vec3 B = q1perp * st0.y + q0perp * st1.y; - - // three-vrm specific change: Workaround for the issue that happens when delta of uv = 0.0 - // TODO: Is this still required? Or shall I make a PR about it? - if ( length( T ) == 0.0 || length( B ) == 0.0 ) { - return surf_norm; - } - - float det = max( dot( T, T ), dot( B, B ) ); - float scale = ( det == 0.0 ) ? 0.0 : faceDirection * inversesqrt( det ); - - return normalize( T * ( mapN.x * scale ) + B * ( mapN.y * scale ) + N * mapN.z ); - - } - - #endif - -#endif - -// #include -#include -#include - -// == post correction ========================================================== -void postCorrection() { - #include - #include - #include - #include - #include -} - -// == main procedure =========================================================== -void main() { - #include - - vec2 uv = vec2(0.5, 0.5); - - #if ( defined( MTOON_USE_UV ) && !defined( MTOON_UVS_VERTEX_ONLY ) ) - uv = vUv; - - float uvAnimMask = 1.0; - #ifdef USE_UVANIMATIONMASKTEXTURE - vec2 uvAnimationMaskTextureUv = ( uvAnimationMaskTextureUvTransform * vec3( uv, 1 ) ).xy; - uvAnimMask = texture2D( uvAnimationMaskTexture, uvAnimationMaskTextureUv ).b; - #endif - - float uvRotCos = cos( uvAnimationRotationPhase * uvAnimMask ); - float uvRotSin = sin( uvAnimationRotationPhase * uvAnimMask ); - uv = mat2( uvRotCos, -uvRotSin, uvRotSin, uvRotCos ) * ( uv - 0.5 ) + 0.5; - uv = uv + vec2( uvAnimationScrollXOffset, uvAnimationScrollYOffset ) * uvAnimMask; - #endif - - #ifdef DEBUG_UV - gl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 ); - #if ( defined( MTOON_USE_UV ) && !defined( MTOON_UVS_VERTEX_ONLY ) ) - gl_FragColor = vec4( uv, 0.0, 1.0 ); - #endif - return; - #endif - - vec4 diffuseColor = vec4( litFactor, opacity ); - ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) ); - vec3 totalEmissiveRadiance = emissive * emissiveIntensity; - - #include - - // #include - #ifdef USE_MAP - vec2 mapUv = ( mapUvTransform * vec3( uv, 1 ) ).xy; - vec4 sampledDiffuseColor = texture2D( map, mapUv ); - #ifdef DECODE_VIDEO_TEXTURE - sampledDiffuseColor = vec4( mix( pow( sampledDiffuseColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), sampledDiffuseColor.rgb * 0.0773993808, vec3( lessThanEqual( sampledDiffuseColor.rgb, vec3( 0.04045 ) ) ) ), sampledDiffuseColor.w ); - #endif - diffuseColor *= sampledDiffuseColor; - #endif - - // #include - #if ( defined( USE_COLOR ) && !defined( IGNORE_VERTEX_COLOR ) ) - diffuseColor.rgb *= vColor; - #endif - - // #include - - #include - - // #include - - // #include - float faceDirection = gl_FrontFacing ? 1.0 : -1.0; - - #ifdef FLAT_SHADED - - vec3 fdx = dFdx( vViewPosition ); - vec3 fdy = dFdy( vViewPosition ); - vec3 normal = normalize( cross( fdx, fdy ) ); - - #else - - vec3 normal = normalize( vNormal ); - - #ifdef DOUBLE_SIDED - - normal *= faceDirection; - - #endif - - #endif - - #ifdef USE_NORMALMAP - - vec2 normalMapUv = ( normalMapUvTransform * vec3( uv, 1 ) ).xy; - - #endif - - #ifdef USE_NORMALMAP_TANGENTSPACE - - #ifdef USE_TANGENT - - mat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal ); - - #else - - mat3 tbn = getTangentFrame( - vViewPosition, normal, normalMapUv ); - - #endif - - #if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED ) - - tbn[0] *= faceDirection; - tbn[1] *= faceDirection; - - #endif - - #endif - - #ifdef USE_CLEARCOAT_NORMALMAP - - #ifdef USE_TANGENT - - mat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal ); - - #else - - mat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv ); - - #endif - - #if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED ) - - tbn2[0] *= faceDirection; - tbn2[1] *= faceDirection; - - #endif - - #endif - - // non perturbed normal for clearcoat among others - - vec3 nonPerturbedNormal = normal; - - #ifdef OUTLINE - normal *= -1.0; - #endif - - // #include - - // COMPAT: pre-r151 - // USE_NORMALMAP_OBJECTSPACE used to be OBJECTSPACE_NORMALMAP in pre-r151 - #if defined( USE_NORMALMAP_OBJECTSPACE ) || defined( OBJECTSPACE_NORMALMAP ) - - normal = texture2D( normalMap, normalMapUv ).xyz * 2.0 - 1.0; // overrides both flatShading and attribute normals - - #ifdef FLIP_SIDED - - normal = - normal; - - #endif - - #ifdef DOUBLE_SIDED - - normal = normal * faceDirection; - - #endif - - normal = normalize( normalMatrix * normal ); - - // COMPAT: pre-r151 - // USE_NORMALMAP_TANGENTSPACE used to be TANGENTSPACE_NORMALMAP in pre-r151 - #elif defined( USE_NORMALMAP_TANGENTSPACE ) || defined( TANGENTSPACE_NORMALMAP ) - - vec3 mapN = texture2D( normalMap, normalMapUv ).xyz * 2.0 - 1.0; - mapN.xy *= normalScale; - - // COMPAT: pre-r151 - #if THREE_VRM_THREE_REVISION >= 151 || defined( USE_TANGENT ) - - normal = normalize( tbn * mapN ); - - #else - - normal = perturbNormal2Arb( uv, -vViewPosition, normal, mapN, faceDirection ); - - #endif - - #endif - - // #include - #ifdef USE_EMISSIVEMAP - vec2 emissiveMapUv = ( emissiveMapUvTransform * vec3( uv, 1 ) ).xy; - totalEmissiveRadiance *= texture2D( emissiveMap, emissiveMapUv ).rgb; - #endif - - #ifdef DEBUG_NORMAL - gl_FragColor = vec4( 0.5 + 0.5 * normal, 1.0 ); - return; - #endif - - // -- MToon: lighting -------------------------------------------------------- - // accumulation - // #include - MToonMaterial material; - - material.diffuseColor = diffuseColor.rgb; - - material.shadeColor = shadeColorFactor; - #ifdef USE_SHADEMULTIPLYTEXTURE - vec2 shadeMultiplyTextureUv = ( shadeMultiplyTextureUvTransform * vec3( uv, 1 ) ).xy; - material.shadeColor *= texture2D( shadeMultiplyTexture, shadeMultiplyTextureUv ).rgb; - #endif - - #if ( defined( USE_COLOR ) && !defined( IGNORE_VERTEX_COLOR ) ) - material.shadeColor.rgb *= vColor; - #endif - - material.shadingShift = shadingShiftFactor; - #ifdef USE_SHADINGSHIFTTEXTURE - vec2 shadingShiftTextureUv = ( shadingShiftTextureUvTransform * vec3( uv, 1 ) ).xy; - material.shadingShift += texture2D( shadingShiftTexture, shadingShiftTextureUv ).r * shadingShiftTextureScale; - #endif - - // #include - - // MToon Specific changes: - // Since we want to take shadows into account of shading instead of irradiance, - // we had to modify the codes that multiplies the results of shadowmap into color of direct lights. - - // COMPAT: pre-r156 uses a struct GeometricContext - #if THREE_VRM_THREE_REVISION >= 157 - vec3 geometryPosition = - vViewPosition; - vec3 geometryNormal = normal; - vec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition ); - - vec3 geometryClearcoatNormal; - - #ifdef USE_CLEARCOAT - - geometryClearcoatNormal = clearcoatNormal; - - #endif - #else - GeometricContext geometry; - - geometry.position = - vViewPosition; - geometry.normal = normal; - geometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition ); - - #ifdef USE_CLEARCOAT - - geometry.clearcoatNormal = clearcoatNormal; - - #endif - #endif - - IncidentLight directLight; - - // since these variables will be used in unrolled loop, we have to define in prior - float shadow; - - #if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct ) - - PointLight pointLight; - #if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0 - PointLightShadow pointLightShadow; - #endif - - #pragma unroll_loop_start - for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) { - - pointLight = pointLights[ i ]; - - // COMPAT: pre-r156 uses a struct GeometricContext - #if THREE_VRM_THREE_REVISION >= 157 - getPointLightInfo( pointLight, geometryPosition, directLight ); - #else - getPointLightInfo( pointLight, geometry, directLight ); - #endif - - shadow = 1.0; - #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS ) - pointLightShadow = pointLightShadows[ i ]; - // COMPAT: pre-r166 - // r166 introduced shadowIntensity - #if THREE_VRM_THREE_REVISION >= 166 - shadow = all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0; - #else - shadow = all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0; - #endif - #endif - - // COMPAT: pre-r156 uses a struct GeometricContext - #if THREE_VRM_THREE_REVISION >= 157 - RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, shadow, reflectedLight ); - #else - RE_Direct( directLight, geometry, material, shadow, reflectedLight ); - #endif - - } - #pragma unroll_loop_end - - #endif - - #if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct ) - - SpotLight spotLight; - // COMPAT: pre-r144 uses NUM_SPOT_LIGHT_SHADOWS, r144+ uses NUM_SPOT_LIGHT_COORDS - #if THREE_VRM_THREE_REVISION >= 144 - #if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_COORDS > 0 - SpotLightShadow spotLightShadow; - #endif - #elif defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0 - SpotLightShadow spotLightShadow; - #endif - - #pragma unroll_loop_start - for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) { - - spotLight = spotLights[ i ]; - - // COMPAT: pre-r156 uses a struct GeometricContext - #if THREE_VRM_THREE_REVISION >= 157 - getSpotLightInfo( spotLight, geometryPosition, directLight ); - #else - getSpotLightInfo( spotLight, geometry, directLight ); - #endif - - shadow = 1.0; - // COMPAT: pre-r144 uses NUM_SPOT_LIGHT_SHADOWS and vSpotShadowCoord, r144+ uses NUM_SPOT_LIGHT_COORDS and vSpotLightCoord - // COMPAT: pre-r166 does not have shadowIntensity, r166+ has shadowIntensity - #if THREE_VRM_THREE_REVISION >= 166 - #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_COORDS ) - spotLightShadow = spotLightShadows[ i ]; - shadow = all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0; - #endif - #elif THREE_VRM_THREE_REVISION >= 144 - #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_COORDS ) - spotLightShadow = spotLightShadows[ i ]; - shadow = all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0; - #endif - #elif defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS ) - spotLightShadow = spotLightShadows[ i ]; - shadow = all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0; - #endif - - // COMPAT: pre-r156 uses a struct GeometricContext - #if THREE_VRM_THREE_REVISION >= 157 - RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, shadow, reflectedLight ); - #else - RE_Direct( directLight, geometry, material, shadow, reflectedLight ); - #endif - - } - #pragma unroll_loop_end - - #endif - - #if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct ) - - DirectionalLight directionalLight; - #if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0 - DirectionalLightShadow directionalLightShadow; - #endif - - #pragma unroll_loop_start - for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) { - - directionalLight = directionalLights[ i ]; - - // COMPAT: pre-r156 uses a struct GeometricContext - #if THREE_VRM_THREE_REVISION >= 157 - getDirectionalLightInfo( directionalLight, directLight ); - #else - getDirectionalLightInfo( directionalLight, geometry, directLight ); - #endif - - shadow = 1.0; - #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS ) - directionalLightShadow = directionalLightShadows[ i ]; - // COMPAT: pre-r166 - // r166 introduced shadowIntensity - #if THREE_VRM_THREE_REVISION >= 166 - shadow = all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0; - #else - shadow = all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0; - #endif - #endif - - // COMPAT: pre-r156 uses a struct GeometricContext - #if THREE_VRM_THREE_REVISION >= 157 - RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, shadow, reflectedLight ); - #else - RE_Direct( directLight, geometry, material, shadow, reflectedLight ); - #endif - - } - #pragma unroll_loop_end - - #endif - - // #if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea ) - - // RectAreaLight rectAreaLight; - - // #pragma unroll_loop_start - // for ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) { - - // rectAreaLight = rectAreaLights[ i ]; - // RE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight ); - - // } - // #pragma unroll_loop_end - - // #endif - - #if defined( RE_IndirectDiffuse ) - - vec3 iblIrradiance = vec3( 0.0 ); - - vec3 irradiance = getAmbientLightIrradiance( ambientLightColor ); - - // COMPAT: pre-r156 uses a struct GeometricContext - // COMPAT: pre-r156 doesn't have a define USE_LIGHT_PROBES - #if THREE_VRM_THREE_REVISION >= 157 - #if defined( USE_LIGHT_PROBES ) - irradiance += getLightProbeIrradiance( lightProbe, geometryNormal ); - #endif - #else - irradiance += getLightProbeIrradiance( lightProbe, geometry.normal ); - #endif - - #if ( NUM_HEMI_LIGHTS > 0 ) - - #pragma unroll_loop_start - for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) { - - // COMPAT: pre-r156 uses a struct GeometricContext - #if THREE_VRM_THREE_REVISION >= 157 - irradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal ); - #else - irradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal ); - #endif - - } - #pragma unroll_loop_end - - #endif - - #endif - - // #if defined( RE_IndirectSpecular ) - - // vec3 radiance = vec3( 0.0 ); - // vec3 clearcoatRadiance = vec3( 0.0 ); - - // #endif - - #include - #include - - // modulation - #include - - vec3 col = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse; - - #ifdef DEBUG_LITSHADERATE - gl_FragColor = vec4( col, diffuseColor.a ); - postCorrection(); - return; - #endif - - // -- MToon: rim lighting ----------------------------------------- - vec3 viewDir = normalize( vViewPosition ); - - #ifndef PHYSICALLY_CORRECT_LIGHTS - reflectedLight.directSpecular /= PI; - #endif - vec3 rimMix = mix( vec3( 1.0 ), reflectedLight.directSpecular, rimLightingMixFactor ); - - vec3 rim = parametricRimColorFactor * pow( saturate( 1.0 - dot( viewDir, normal ) + parametricRimLiftFactor ), parametricRimFresnelPowerFactor ); - - #ifdef USE_MATCAPTEXTURE - { - vec3 x = normalize( vec3( viewDir.z, 0.0, -viewDir.x ) ); - vec3 y = cross( viewDir, x ); // guaranteed to be normalized - vec2 sphereUv = 0.5 + 0.5 * vec2( dot( x, normal ), -dot( y, normal ) ); - sphereUv = ( matcapTextureUvTransform * vec3( sphereUv, 1 ) ).xy; - vec3 matcap = texture2D( matcapTexture, sphereUv ).rgb; - rim += matcapFactor * matcap; - } - #endif - - #ifdef USE_RIMMULTIPLYTEXTURE - vec2 rimMultiplyTextureUv = ( rimMultiplyTextureUvTransform * vec3( uv, 1 ) ).xy; - rim *= texture2D( rimMultiplyTexture, rimMultiplyTextureUv ).rgb; - #endif - - col += rimMix * rim; - - // -- MToon: Emission -------------------------------------------------------- - col += totalEmissiveRadiance; - - // #include - - // -- Almost done! ----------------------------------------------------------- - #if defined( OUTLINE ) - col = outlineColorFactor.rgb * mix( vec3( 1.0 ), col, outlineLightingMixFactor ); - #endif - - #ifdef OPAQUE - diffuseColor.a = 1.0; - #endif - - gl_FragColor = vec4( col, diffuseColor.a ); - postCorrection(); -} -`,Hwe={None:"none"},wj={None:"none",ScreenCoordinates:"screenCoordinates"},Vwe={3e3:"",3001:"srgb"};function aT(t){return parseInt(Pd,10)>=152?t.colorSpace:Vwe[t.encoding]}var Gwe=class extends Ya{constructor(t={}){var e;super({vertexShader:zwe,fragmentShader:Bwe}),this.uvAnimationScrollXSpeedFactor=0,this.uvAnimationScrollYSpeedFactor=0,this.uvAnimationRotationSpeedFactor=0,this.fog=!0,this.normalMapType=au,this._ignoreVertexColor=!0,this._v0CompatShade=!1,this._debugMode=Hwe.None,this._outlineWidthMode=wj.None,this._isOutline=!1,t.transparentWithZWrite&&(t.depthWrite=!0),delete t.transparentWithZWrite,t.fog=!0,t.lights=!0,t.clipping=!0,this.uniforms=TR.merge([ft.common,ft.normalmap,ft.emissivemap,ft.fog,ft.lights,{litFactor:{value:new ct(1,1,1)},mapUvTransform:{value:new $t},colorAlpha:{value:1},normalMapUvTransform:{value:new $t},shadeColorFactor:{value:new ct(0,0,0)},shadeMultiplyTexture:{value:null},shadeMultiplyTextureUvTransform:{value:new $t},shadingShiftFactor:{value:0},shadingShiftTexture:{value:null},shadingShiftTextureUvTransform:{value:new $t},shadingShiftTextureScale:{value:1},shadingToonyFactor:{value:.9},giEqualizationFactor:{value:.9},matcapFactor:{value:new ct(1,1,1)},matcapTexture:{value:null},matcapTextureUvTransform:{value:new $t},parametricRimColorFactor:{value:new ct(0,0,0)},rimMultiplyTexture:{value:null},rimMultiplyTextureUvTransform:{value:new $t},rimLightingMixFactor:{value:1},parametricRimFresnelPowerFactor:{value:5},parametricRimLiftFactor:{value:0},emissive:{value:new ct(0,0,0)},emissiveIntensity:{value:1},emissiveMapUvTransform:{value:new $t},outlineWidthMultiplyTexture:{value:null},outlineWidthMultiplyTextureUvTransform:{value:new $t},outlineWidthFactor:{value:0},outlineColorFactor:{value:new ct(0,0,0)},outlineLightingMixFactor:{value:1},uvAnimationMaskTexture:{value:null},uvAnimationMaskTextureUvTransform:{value:new $t},uvAnimationScrollXOffset:{value:0},uvAnimationScrollYOffset:{value:0},uvAnimationRotationPhase:{value:0}},(e=t.uniforms)!=null?e:{}]),this.setValues(t),this._uploadUniformsWorkaround(),this.customProgramCacheKey=()=>[...Object.entries(this._generateDefines()).map(([n,r])=>`${n}:${r}`),this.matcapTexture?`matcapTextureColorSpace:${aT(this.matcapTexture)}`:"",this.shadeMultiplyTexture?`shadeMultiplyTextureColorSpace:${aT(this.shadeMultiplyTexture)}`:"",this.rimMultiplyTexture?`rimMultiplyTextureColorSpace:${aT(this.rimMultiplyTexture)}`:""].join(","),this.onBeforeCompile=n=>{const r=parseInt(Pd,10),i=Object.entries(_j(_j({},this._generateDefines()),this.defines)).filter(([s,a])=>!!a).map(([s,a])=>`#define ${s} ${a}`).join(` -`)+` -`;n.vertexShader=i+n.vertexShader,n.fragmentShader=i+n.fragmentShader,r<154&&(n.fragmentShader=n.fragmentShader.replace("#include ","#include "))}}get color(){return this.uniforms.litFactor.value}set color(t){this.uniforms.litFactor.value=t}get map(){return this.uniforms.map.value}set map(t){this.uniforms.map.value=t}get normalMap(){return this.uniforms.normalMap.value}set normalMap(t){this.uniforms.normalMap.value=t}get normalScale(){return this.uniforms.normalScale.value}set normalScale(t){this.uniforms.normalScale.value=t}get emissive(){return this.uniforms.emissive.value}set emissive(t){this.uniforms.emissive.value=t}get emissiveIntensity(){return this.uniforms.emissiveIntensity.value}set emissiveIntensity(t){this.uniforms.emissiveIntensity.value=t}get emissiveMap(){return this.uniforms.emissiveMap.value}set emissiveMap(t){this.uniforms.emissiveMap.value=t}get shadeColorFactor(){return this.uniforms.shadeColorFactor.value}set shadeColorFactor(t){this.uniforms.shadeColorFactor.value=t}get shadeMultiplyTexture(){return this.uniforms.shadeMultiplyTexture.value}set shadeMultiplyTexture(t){this.uniforms.shadeMultiplyTexture.value=t}get shadingShiftFactor(){return this.uniforms.shadingShiftFactor.value}set shadingShiftFactor(t){this.uniforms.shadingShiftFactor.value=t}get shadingShiftTexture(){return this.uniforms.shadingShiftTexture.value}set shadingShiftTexture(t){this.uniforms.shadingShiftTexture.value=t}get shadingShiftTextureScale(){return this.uniforms.shadingShiftTextureScale.value}set shadingShiftTextureScale(t){this.uniforms.shadingShiftTextureScale.value=t}get shadingToonyFactor(){return this.uniforms.shadingToonyFactor.value}set shadingToonyFactor(t){this.uniforms.shadingToonyFactor.value=t}get giEqualizationFactor(){return this.uniforms.giEqualizationFactor.value}set giEqualizationFactor(t){this.uniforms.giEqualizationFactor.value=t}get matcapFactor(){return this.uniforms.matcapFactor.value}set matcapFactor(t){this.uniforms.matcapFactor.value=t}get matcapTexture(){return this.uniforms.matcapTexture.value}set matcapTexture(t){this.uniforms.matcapTexture.value=t}get parametricRimColorFactor(){return this.uniforms.parametricRimColorFactor.value}set parametricRimColorFactor(t){this.uniforms.parametricRimColorFactor.value=t}get rimMultiplyTexture(){return this.uniforms.rimMultiplyTexture.value}set rimMultiplyTexture(t){this.uniforms.rimMultiplyTexture.value=t}get rimLightingMixFactor(){return this.uniforms.rimLightingMixFactor.value}set rimLightingMixFactor(t){this.uniforms.rimLightingMixFactor.value=t}get parametricRimFresnelPowerFactor(){return this.uniforms.parametricRimFresnelPowerFactor.value}set parametricRimFresnelPowerFactor(t){this.uniforms.parametricRimFresnelPowerFactor.value=t}get parametricRimLiftFactor(){return this.uniforms.parametricRimLiftFactor.value}set parametricRimLiftFactor(t){this.uniforms.parametricRimLiftFactor.value=t}get outlineWidthMultiplyTexture(){return this.uniforms.outlineWidthMultiplyTexture.value}set outlineWidthMultiplyTexture(t){this.uniforms.outlineWidthMultiplyTexture.value=t}get outlineWidthFactor(){return this.uniforms.outlineWidthFactor.value}set outlineWidthFactor(t){this.uniforms.outlineWidthFactor.value=t}get outlineColorFactor(){return this.uniforms.outlineColorFactor.value}set outlineColorFactor(t){this.uniforms.outlineColorFactor.value=t}get outlineLightingMixFactor(){return this.uniforms.outlineLightingMixFactor.value}set outlineLightingMixFactor(t){this.uniforms.outlineLightingMixFactor.value=t}get uvAnimationMaskTexture(){return this.uniforms.uvAnimationMaskTexture.value}set uvAnimationMaskTexture(t){this.uniforms.uvAnimationMaskTexture.value=t}get uvAnimationScrollXOffset(){return this.uniforms.uvAnimationScrollXOffset.value}set uvAnimationScrollXOffset(t){this.uniforms.uvAnimationScrollXOffset.value=t}get uvAnimationScrollYOffset(){return this.uniforms.uvAnimationScrollYOffset.value}set uvAnimationScrollYOffset(t){this.uniforms.uvAnimationScrollYOffset.value=t}get uvAnimationRotationPhase(){return this.uniforms.uvAnimationRotationPhase.value}set uvAnimationRotationPhase(t){this.uniforms.uvAnimationRotationPhase.value=t}get ignoreVertexColor(){return this._ignoreVertexColor}set ignoreVertexColor(t){this._ignoreVertexColor=t,this.needsUpdate=!0}get v0CompatShade(){return this._v0CompatShade}set v0CompatShade(t){this._v0CompatShade=t,this.needsUpdate=!0}get debugMode(){return this._debugMode}set debugMode(t){this._debugMode=t,this.needsUpdate=!0}get outlineWidthMode(){return this._outlineWidthMode}set outlineWidthMode(t){this._outlineWidthMode=t,this.needsUpdate=!0}get isOutline(){return this._isOutline}set isOutline(t){this._isOutline=t,this.needsUpdate=!0}get isMToonMaterial(){return!0}update(t){this._uploadUniformsWorkaround(),this._updateUVAnimation(t)}copy(t){return super.copy(t),this.map=t.map,this.normalMap=t.normalMap,this.emissiveMap=t.emissiveMap,this.shadeMultiplyTexture=t.shadeMultiplyTexture,this.shadingShiftTexture=t.shadingShiftTexture,this.matcapTexture=t.matcapTexture,this.rimMultiplyTexture=t.rimMultiplyTexture,this.outlineWidthMultiplyTexture=t.outlineWidthMultiplyTexture,this.uvAnimationMaskTexture=t.uvAnimationMaskTexture,this.normalMapType=t.normalMapType,this.uvAnimationScrollXSpeedFactor=t.uvAnimationScrollXSpeedFactor,this.uvAnimationScrollYSpeedFactor=t.uvAnimationScrollYSpeedFactor,this.uvAnimationRotationSpeedFactor=t.uvAnimationRotationSpeedFactor,this.ignoreVertexColor=t.ignoreVertexColor,this.v0CompatShade=t.v0CompatShade,this.debugMode=t.debugMode,this.outlineWidthMode=t.outlineWidthMode,this.isOutline=t.isOutline,this.needsUpdate=!0,this}_updateUVAnimation(t){this.uniforms.uvAnimationScrollXOffset.value+=t*this.uvAnimationScrollXSpeedFactor,this.uniforms.uvAnimationScrollYOffset.value+=t*this.uvAnimationScrollYSpeedFactor,this.uniforms.uvAnimationRotationPhase.value+=t*this.uvAnimationRotationSpeedFactor,this.uniforms.alphaTest.value=this.alphaTest,this.uniformsNeedUpdate=!0}_uploadUniformsWorkaround(){this.uniforms.opacity.value=this.opacity,this._updateTextureMatrix(this.uniforms.map,this.uniforms.mapUvTransform),this._updateTextureMatrix(this.uniforms.normalMap,this.uniforms.normalMapUvTransform),this._updateTextureMatrix(this.uniforms.emissiveMap,this.uniforms.emissiveMapUvTransform),this._updateTextureMatrix(this.uniforms.shadeMultiplyTexture,this.uniforms.shadeMultiplyTextureUvTransform),this._updateTextureMatrix(this.uniforms.shadingShiftTexture,this.uniforms.shadingShiftTextureUvTransform),this._updateTextureMatrix(this.uniforms.matcapTexture,this.uniforms.matcapTextureUvTransform),this._updateTextureMatrix(this.uniforms.rimMultiplyTexture,this.uniforms.rimMultiplyTextureUvTransform),this._updateTextureMatrix(this.uniforms.outlineWidthMultiplyTexture,this.uniforms.outlineWidthMultiplyTextureUvTransform),this._updateTextureMatrix(this.uniforms.uvAnimationMaskTexture,this.uniforms.uvAnimationMaskTextureUvTransform),this.uniformsNeedUpdate=!0}_generateDefines(){const t=parseInt(Pd,10),e=this.outlineWidthMultiplyTexture!==null,n=this.map!==null||this.normalMap!==null||this.emissiveMap!==null||this.shadeMultiplyTexture!==null||this.shadingShiftTexture!==null||this.rimMultiplyTexture!==null||this.uvAnimationMaskTexture!==null;return{THREE_VRM_THREE_REVISION:t,OUTLINE:this._isOutline,MTOON_USE_UV:e||n,MTOON_UVS_VERTEX_ONLY:e&&!n,V0_COMPAT_SHADE:this._v0CompatShade,USE_SHADEMULTIPLYTEXTURE:this.shadeMultiplyTexture!==null,USE_SHADINGSHIFTTEXTURE:this.shadingShiftTexture!==null,USE_MATCAPTEXTURE:this.matcapTexture!==null,USE_RIMMULTIPLYTEXTURE:this.rimMultiplyTexture!==null,USE_OUTLINEWIDTHMULTIPLYTEXTURE:this._isOutline&&this.outlineWidthMultiplyTexture!==null,USE_UVANIMATIONMASKTEXTURE:this.uvAnimationMaskTexture!==null,IGNORE_VERTEX_COLOR:this._ignoreVertexColor===!0,DEBUG_NORMAL:this._debugMode==="normal",DEBUG_LITSHADERATE:this._debugMode==="litShadeRate",DEBUG_UV:this._debugMode==="uv",OUTLINE_WIDTH_SCREEN:this._isOutline&&this._outlineWidthMode===wj.ScreenCoordinates}}_updateTextureMatrix(t,e){t.value&&(t.value.matrixAutoUpdate&&t.value.updateMatrix(),e.value.copy(t.value.matrix))}},Wwe=new Set(["1.0","1.0-beta"]),qG=class J_{get name(){return J_.EXTENSION_NAME}constructor(e,n={}){var r,i,s,a;this.parser=e,this.materialType=(r=n.materialType)!=null?r:Gwe,this.renderOrderOffset=(i=n.renderOrderOffset)!=null?i:0,this.v0CompatShade=(s=n.v0CompatShade)!=null?s:!1,this.debugMode=(a=n.debugMode)!=null?a:"none",this._mToonMaterialSet=new Set}beforeRoot(){return fh(this,null,function*(){this._removeUnlitExtensionIfMToonExists()})}afterRoot(e){return fh(this,null,function*(){e.userData.vrmMToonMaterials=Array.from(this._mToonMaterialSet)})}getMaterialType(e){return this._getMToonExtension(e)?this.materialType:null}extendMaterialParams(e,n){const r=this._getMToonExtension(e);return r?this._extendMaterialParams(r,n):null}loadMesh(e){return fh(this,null,function*(){var n;const r=this.parser,s=(n=r.json.meshes)==null?void 0:n[e];if(s==null)throw new Error(`MToonMaterialLoaderPlugin: Attempt to use meshes[${e}] of glTF but the mesh doesn't exist`);const a=s.primitives,o=yield r.loadMesh(e);if(a.length===1){const l=o,c=a[0].material;c!=null&&this._setupPrimitive(l,c)}else{const l=o;for(let c=0;c{var a;this._getMToonExtension(s)&&((a=i.extensions)!=null&&a.KHR_materials_unlit)&&delete i.extensions.KHR_materials_unlit})}_getMToonExtension(e){var n,r;const a=(n=this.parser.json.materials)==null?void 0:n[e];if(a==null){console.warn(`MToonMaterialLoaderPlugin: Attempt to use materials[${e}] of glTF but the material doesn't exist`);return}const o=(r=a.extensions)==null?void 0:r[J_.EXTENSION_NAME];if(o==null)return;const l=o.specVersion;if(!Wwe.has(l)){console.warn(`MToonMaterialLoaderPlugin: Unknown ${J_.EXTENSION_NAME} specVersion "${l}"`);return}return o}_extendMaterialParams(e,n){return fh(this,null,function*(){var r;delete n.metalness,delete n.roughness;const i=new Fwe(this.parser,n);i.assignPrimitive("transparentWithZWrite",e.transparentWithZWrite),i.assignColor("shadeColorFactor",e.shadeColorFactor),i.assignTexture("shadeMultiplyTexture",e.shadeMultiplyTexture,!0),i.assignPrimitive("shadingShiftFactor",e.shadingShiftFactor),i.assignTexture("shadingShiftTexture",e.shadingShiftTexture,!0),i.assignPrimitive("shadingShiftTextureScale",(r=e.shadingShiftTexture)==null?void 0:r.scale),i.assignPrimitive("shadingToonyFactor",e.shadingToonyFactor),i.assignPrimitive("giEqualizationFactor",e.giEqualizationFactor),i.assignColor("matcapFactor",e.matcapFactor),i.assignTexture("matcapTexture",e.matcapTexture,!0),i.assignColor("parametricRimColorFactor",e.parametricRimColorFactor),i.assignTexture("rimMultiplyTexture",e.rimMultiplyTexture,!0),i.assignPrimitive("rimLightingMixFactor",e.rimLightingMixFactor),i.assignPrimitive("parametricRimFresnelPowerFactor",e.parametricRimFresnelPowerFactor),i.assignPrimitive("parametricRimLiftFactor",e.parametricRimLiftFactor),i.assignPrimitive("outlineWidthMode",e.outlineWidthMode),i.assignPrimitive("outlineWidthFactor",e.outlineWidthFactor),i.assignTexture("outlineWidthMultiplyTexture",e.outlineWidthMultiplyTexture,!1),i.assignColor("outlineColorFactor",e.outlineColorFactor),i.assignPrimitive("outlineLightingMixFactor",e.outlineLightingMixFactor),i.assignTexture("uvAnimationMaskTexture",e.uvAnimationMaskTexture,!1),i.assignPrimitive("uvAnimationScrollXSpeedFactor",e.uvAnimationScrollXSpeedFactor),i.assignPrimitive("uvAnimationScrollYSpeedFactor",e.uvAnimationScrollYSpeedFactor),i.assignPrimitive("uvAnimationRotationSpeedFactor",e.uvAnimationRotationSpeedFactor),i.assignPrimitive("v0CompatShade",this.v0CompatShade),i.assignPrimitive("debugMode",this.debugMode),yield i.pending})}_setupPrimitive(e,n){const r=this._getMToonExtension(n);if(r){const i=this._parseRenderOrder(r);e.renderOrder=i+this.renderOrderOffset,this._generateOutline(e),this._addToMaterialSet(e);return}}_shouldGenerateOutline(e){return typeof e.outlineWidthMode=="string"&&e.outlineWidthMode!=="none"&&typeof e.outlineWidthFactor=="number"&&e.outlineWidthFactor>0}_generateOutline(e){const n=e.material;if(!(n instanceof Gr)||!this._shouldGenerateOutline(n))return;e.material=[n];const r=n.clone();r.name+=" (Outline)",r.isOutline=!0,r.side=as,e.material.push(r);const i=e.geometry,s=i.index?i.index.count:i.attributes.position.count/3;i.addGroup(0,s,0),i.addGroup(0,s,1)}_addToMaterialSet(e){const n=e.material,r=new Set;Array.isArray(n)?n.forEach(i=>r.add(i)):r.add(n);for(const i of r)this._mToonMaterialSet.add(i)}_parseRenderOrder(e){var n;return(e.transparentWithZWrite?0:19)+((n=e.renderQueueOffsetNumber)!=null?n:0)}};qG.EXTENSION_NAME="VRMC_materials_mtoon";var $we=qG,Xwe=(t,e,n)=>new Promise((r,i)=>{var s=l=>{try{o(n.next(l))}catch(c){i(c)}},a=l=>{try{o(n.throw(l))}catch(c){i(c)}},o=l=>l.done?r(l.value):Promise.resolve(l.value).then(s,a);o((n=n.apply(t,e)).next())}),KG=class hC{get name(){return hC.EXTENSION_NAME}constructor(e){this.parser=e}extendMaterialParams(e,n){return Xwe(this,null,function*(){const r=this._getHDREmissiveMultiplierExtension(e);if(r==null)return;console.warn("VRMMaterialsHDREmissiveMultiplierLoaderPlugin: `VRMC_materials_hdr_emissiveMultiplier` is archived. Use `KHR_materials_emissive_strength` instead.");const i=r.emissiveMultiplier;n.emissiveIntensity=i})}_getHDREmissiveMultiplierExtension(e){var n,r;const a=(n=this.parser.json.materials)==null?void 0:n[e];if(a==null){console.warn(`VRMMaterialsHDREmissiveMultiplierLoaderPlugin: Attempt to use materials[${e}] of glTF but the material doesn't exist`);return}const o=(r=a.extensions)==null?void 0:r[hC.EXTENSION_NAME];if(o!=null)return o}};KG.EXTENSION_NAME="VRMC_materials_hdr_emissiveMultiplier";var qwe=KG,Kwe=Object.defineProperty,Ywe=Object.defineProperties,Zwe=Object.getOwnPropertyDescriptors,Sj=Object.getOwnPropertySymbols,Qwe=Object.prototype.hasOwnProperty,Jwe=Object.prototype.propertyIsEnumerable,Mj=(t,e,n)=>e in t?Kwe(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,gl=(t,e)=>{for(var n in e||(e={}))Qwe.call(e,n)&&Mj(t,n,e[n]);if(Sj)for(var n of Sj(e))Jwe.call(e,n)&&Mj(t,n,e[n]);return t},Ej=(t,e)=>Ywe(t,Zwe(e)),e1e=(t,e,n)=>new Promise((r,i)=>{var s=l=>{try{o(n.next(l))}catch(c){i(c)}},a=l=>{try{o(n.throw(l))}catch(c){i(c)}},o=l=>l.done?r(l.value):Promise.resolve(l.value).then(s,a);o((n=n.apply(t,e)).next())});function Om(t){return Math.pow(t,2.2)}var t1e=class{get name(){return"VRMMaterialsV0CompatPlugin"}constructor(t){var e;this.parser=t,this._renderQueueMapTransparent=new Map,this._renderQueueMapTransparentZWrite=new Map;const n=this.parser.json;n.extensionsUsed=(e=n.extensionsUsed)!=null?e:[],n.extensionsUsed.indexOf("KHR_texture_transform")===-1&&n.extensionsUsed.push("KHR_texture_transform")}beforeRoot(){return e1e(this,null,function*(){var t;const e=this.parser.json,n=(t=e.extensions)==null?void 0:t.VRM,r=n==null?void 0:n.materialProperties;r&&(this._populateRenderQueueMap(r),r.forEach((i,s)=>{var a,o;const l=(a=e.materials)==null?void 0:a[s];if(l==null){console.warn(`VRMMaterialsV0CompatPlugin: Attempt to use materials[${s}] of glTF but the material doesn't exist`);return}if(i.shader==="VRM/MToon"){const c=this._parseV0MToonProperties(i,l);e.materials[s]=c}else if((o=i.shader)!=null&&o.startsWith("VRM/Unlit")){const c=this._parseV0UnlitProperties(i,l);e.materials[s]=c}else i.shader==="VRM_USE_GLTFSHADER"||console.warn(`VRMMaterialsV0CompatPlugin: Unknown shader: ${i.shader}`)}))})}_parseV0MToonProperties(t,e){var n,r,i,s,a,o,l,c,d,f,p,y,b,S,w,x,M,T,P,O,N,D,z,V,k,j,X,ee,ie,pe,ae,he,B,J,Y,H,G,le,se,ce,Se,we,We,Ee,Ge,$e,de,Z,Ve,Le,ne,Ce,Xe,Ze,Q;const W=(r=(n=t.keywordMap)==null?void 0:n._ALPHABLEND_ON)!=null?r:!1,Ue=((i=t.floatProperties)==null?void 0:i._ZWrite)===1&&W,ze=this._v0ParseRenderQueue(t),Fe=(a=(s=t.keywordMap)==null?void 0:s._ALPHATEST_ON)!=null?a:!1,bt=W?"BLEND":Fe?"MASK":"OPAQUE",rt=Fe?(l=(o=t.floatProperties)==null?void 0:o._Cutoff)!=null?l:.5:void 0,Xt=((d=(c=t.floatProperties)==null?void 0:c._CullMode)!=null?d:2)===0,Ke=this._portTextureTransform(t),te=((p=(f=t.vectorProperties)==null?void 0:f._Color)!=null?p:[1,1,1,1]).map((it,yt)=>yt===3?it:Om(it)),tt=(y=t.textureProperties)==null?void 0:y._MainTex,Mt=tt!=null?{index:tt,extensions:gl({},Ke)}:void 0,vt=(S=(b=t.floatProperties)==null?void 0:b._BumpScale)!=null?S:1,Zt=(w=t.textureProperties)==null?void 0:w._BumpMap,fe=Zt!=null?{index:Zt,scale:vt,extensions:gl({},Ke)}:void 0,qe=((M=(x=t.vectorProperties)==null?void 0:x._EmissionColor)!=null?M:[0,0,0,1]).map(Om),ue=(T=t.textureProperties)==null?void 0:T._EmissionMap,Ye=ue!=null?{index:ue,extensions:gl({},Ke)}:void 0,Re=((O=(P=t.vectorProperties)==null?void 0:P._ShadeColor)!=null?O:[.97,.81,.86,1]).map(Om),Be=(N=t.textureProperties)==null?void 0:N._ShadeTexture,at=Be!=null?{index:Be,extensions:gl({},Ke)}:void 0;let pt=(z=(D=t.floatProperties)==null?void 0:D._ShadeShift)!=null?z:0,Jt=(k=(V=t.floatProperties)==null?void 0:V._ShadeToony)!=null?k:.9;Jt=vr.lerp(Jt,1,.5+.5*pt),pt=-pt-(1-Jt);const pn=(X=(j=t.floatProperties)==null?void 0:j._IndirectLightIntensity)!=null?X:.1,jn=pn?1-pn:void 0,en=(ee=t.textureProperties)==null?void 0:ee._SphereAdd,Hn=en!=null?[1,1,1]:void 0,pr=en!=null?{index:en}:void 0,Mi=(pe=(ie=t.floatProperties)==null?void 0:ie._RimLightingMix)!=null?pe:0,to=(ae=t.textureProperties)==null?void 0:ae._RimTexture,Ei=to!=null?{index:to,extensions:gl({},Ke)}:void 0,Ko=((B=(he=t.vectorProperties)==null?void 0:he._RimColor)!=null?B:[0,0,0,1]).map(Om),Ns=(Y=(J=t.floatProperties)==null?void 0:J._RimFresnelPower)!=null?Y:1,no=(G=(H=t.floatProperties)==null?void 0:H._RimLift)!=null?G:0,Ai=["none","worldCoordinates","screenCoordinates"][(se=(le=t.floatProperties)==null?void 0:le._OutlineWidthMode)!=null?se:0];let Aa=(Se=(ce=t.floatProperties)==null?void 0:ce._OutlineWidth)!=null?Se:0;Aa=.01*Aa;const ro=(we=t.textureProperties)==null?void 0:we._OutlineWidthTexture,ou=ro!=null?{index:ro,extensions:gl({},Ke)}:void 0,lu=((Ee=(We=t.vectorProperties)==null?void 0:We._OutlineColor)!=null?Ee:[0,0,0]).map(Om),cu=(($e=(Ge=t.floatProperties)==null?void 0:Ge._OutlineColorMode)!=null?$e:0)===1?(Z=(de=t.floatProperties)==null?void 0:de._OutlineLightingMix)!=null?Z:1:0,Bl=(Ve=t.textureProperties)==null?void 0:Ve._UvAnimMaskTexture,K=Bl!=null?{index:Bl,extensions:gl({},Ke)}:void 0,xe=(ne=(Le=t.floatProperties)==null?void 0:Le._UvAnimScrollX)!=null?ne:0;let Te=(Xe=(Ce=t.floatProperties)==null?void 0:Ce._UvAnimScrollY)!=null?Xe:0;Te!=null&&(Te=-Te);const Ie=(Q=(Ze=t.floatProperties)==null?void 0:Ze._UvAnimRotation)!=null?Q:0,Me={specVersion:"1.0",transparentWithZWrite:Ue,renderQueueOffsetNumber:ze,shadeColorFactor:Re,shadeMultiplyTexture:at,shadingShiftFactor:pt,shadingToonyFactor:Jt,giEqualizationFactor:jn,matcapFactor:Hn,matcapTexture:pr,rimLightingMixFactor:Mi,rimMultiplyTexture:Ei,parametricRimColorFactor:Ko,parametricRimFresnelPowerFactor:Ns,parametricRimLiftFactor:no,outlineWidthMode:Ai,outlineWidthFactor:Aa,outlineWidthMultiplyTexture:ou,outlineColorFactor:lu,outlineLightingMixFactor:cu,uvAnimationMaskTexture:K,uvAnimationScrollXSpeedFactor:xe,uvAnimationScrollYSpeedFactor:Te,uvAnimationRotationSpeedFactor:Ie};return Ej(gl({},e),{pbrMetallicRoughness:{baseColorFactor:te,baseColorTexture:Mt},normalTexture:fe,emissiveTexture:Ye,emissiveFactor:qe,alphaMode:bt,alphaCutoff:rt,doubleSided:Xt,extensions:{VRMC_materials_mtoon:Me}})}_parseV0UnlitProperties(t,e){var n,r,i,s,a;const o=t.shader==="VRM/UnlitTransparentZWrite",l=t.shader==="VRM/UnlitTransparent"||o,c=this._v0ParseRenderQueue(t),d=t.shader==="VRM/UnlitCutout",f=l?"BLEND":d?"MASK":"OPAQUE",p=d?(r=(n=t.floatProperties)==null?void 0:n._Cutoff)!=null?r:.5:void 0,y=this._portTextureTransform(t),b=((s=(i=t.vectorProperties)==null?void 0:i._Color)!=null?s:[1,1,1,1]).map(Om),S=(a=t.textureProperties)==null?void 0:a._MainTex,w=S!=null?{index:S,extensions:gl({},y)}:void 0,x={specVersion:"1.0",transparentWithZWrite:o,renderQueueOffsetNumber:c,shadeColorFactor:b,shadeMultiplyTexture:w};return Ej(gl({},e),{pbrMetallicRoughness:{baseColorFactor:b,baseColorTexture:w},alphaMode:f,alphaCutoff:p,extensions:{VRMC_materials_mtoon:x}})}_portTextureTransform(t){var e,n,r,i,s;const a=(e=t.vectorProperties)==null?void 0:e._MainTex;if(a==null)return{};const o=[(n=a==null?void 0:a[0])!=null?n:0,(r=a==null?void 0:a[1])!=null?r:0],l=[(i=a==null?void 0:a[2])!=null?i:1,(s=a==null?void 0:a[3])!=null?s:1];return o[1]=1-l[1]-o[1],{KHR_texture_transform:{offset:o,scale:l}}}_v0ParseRenderQueue(t){var e,n;const r=t.shader==="VRM/UnlitTransparentZWrite",i=((e=t.keywordMap)==null?void 0:e._ALPHABLEND_ON)!=null||t.shader==="VRM/UnlitTransparent"||r,s=((n=t.floatProperties)==null?void 0:n._ZWrite)===1||r;let a=0;if(i){const o=t.renderQueue;o!=null&&(s?a=this._renderQueueMapTransparentZWrite.get(o):a=this._renderQueueMapTransparent.get(o))}return a}_populateRenderQueueMap(t){const e=new Set,n=new Set;t.forEach(r=>{var i,s;const a=r.shader==="VRM/UnlitTransparentZWrite",o=((i=r.keywordMap)==null?void 0:i._ALPHABLEND_ON)!=null||r.shader==="VRM/UnlitTransparent"||a,l=((s=r.floatProperties)==null?void 0:s._ZWrite)===1||a;if(o){const c=r.renderQueue;c!=null&&(l?n.add(c):e.add(c))}}),e.size>10&&console.warn(`VRMMaterialsV0CompatPlugin: This VRM uses ${e.size} render queues for Transparent materials while VRM 1.0 only supports up to 10 render queues. The model might not be rendered correctly.`),n.size>10&&console.warn(`VRMMaterialsV0CompatPlugin: This VRM uses ${n.size} render queues for TransparentZWrite materials while VRM 1.0 only supports up to 10 render queues. The model might not be rendered correctly.`),Array.from(e).sort().forEach((r,i)=>{const s=Math.min(Math.max(i-e.size+1,-9),0);this._renderQueueMapTransparent.set(r,s)}),Array.from(n).sort().forEach((r,i)=>{const s=Math.min(Math.max(i,0),9);this._renderQueueMapTransparentZWrite.set(r,s)})}},Aj=(t,e,n)=>new Promise((r,i)=>{var s=l=>{try{o(n.next(l))}catch(c){i(c)}},a=l=>{try{o(n.throw(l))}catch(c){i(c)}},o=l=>l.done?r(l.value):Promise.resolve(l.value).then(s,a);o((n=n.apply(t,e)).next())}),nd=new q,oT=class extends Ts{constructor(t){super(),this._attrPosition=new Qt(new Float32Array([0,0,0,0,0,0]),3),this._attrPosition.setUsage(c6);const e=new Yt;e.setAttribute("position",this._attrPosition);const n=new $r({color:16711935,depthTest:!1,depthWrite:!1});this._line=new Ul(e,n),this.add(this._line),this.constraint=t}updateMatrixWorld(t){nd.setFromMatrixPosition(this.constraint.destination.matrixWorld),this._attrPosition.setXYZ(0,nd.x,nd.y,nd.z),this.constraint.source&&nd.setFromMatrixPosition(this.constraint.source.matrixWorld),this._attrPosition.setXYZ(1,nd.x,nd.y,nd.z),this._attrPosition.needsUpdate=!0,super.updateMatrixWorld(t)}};function Tj(t,e){return e.set(t.elements[12],t.elements[13],t.elements[14])}var n1e=new q,r1e=new q;function i1e(t,e){return t.decompose(n1e,e,r1e),e}function z1(t){return t.invert?t.invert():t.inverse(),t}var aN=class{constructor(t,e){this.destination=t,this.source=e,this.weight=1}},s1e=new q,a1e=new q,o1e=new q,l1e=new qt,c1e=new qt,u1e=new qt,d1e=class extends aN{get aimAxis(){return this._aimAxis}set aimAxis(t){this._aimAxis=t,this._v3AimAxis.set(t==="PositiveX"?1:t==="NegativeX"?-1:0,t==="PositiveY"?1:t==="NegativeY"?-1:0,t==="PositiveZ"?1:t==="NegativeZ"?-1:0)}get dependencies(){const t=new Set([this.source]);return this.destination.parent&&t.add(this.destination.parent),t}constructor(t,e){super(t,e),this._aimAxis="PositiveX",this._v3AimAxis=new q(1,0,0),this._dstRestQuat=new qt}setInitState(){this._dstRestQuat.copy(this.destination.quaternion)}update(){this.destination.updateWorldMatrix(!0,!1),this.source.updateWorldMatrix(!0,!1);const t=l1e.identity(),e=c1e.identity();this.destination.parent&&(i1e(this.destination.parent.matrixWorld,t),z1(e.copy(t)));const n=s1e.copy(this._v3AimAxis).applyQuaternion(this._dstRestQuat).applyQuaternion(t),r=Tj(this.source.matrixWorld,a1e).sub(Tj(this.destination.matrixWorld,o1e)).normalize(),i=u1e.setFromUnitVectors(n,r).premultiply(e).multiply(t).multiply(this._dstRestQuat);this.destination.quaternion.copy(this._dstRestQuat).slerp(i,this.weight)}};function f1e(t,e){const n=[t];let r=t.parent;for(;r!==null;)n.unshift(r),r=r.parent;n.forEach(i=>{e(i)})}var h1e=class{constructor(){this._constraints=new Set,this._objectConstraintsMap=new Map}get constraints(){return this._constraints}addConstraint(t){this._constraints.add(t);let e=this._objectConstraintsMap.get(t.destination);e==null&&(e=new Set,this._objectConstraintsMap.set(t.destination,e)),e.add(t)}deleteConstraint(t){this._constraints.delete(t),this._objectConstraintsMap.get(t.destination).delete(t)}setInitState(){const t=new Set,e=new Set;for(const n of this._constraints)this._processConstraint(n,t,e,r=>r.setInitState())}update(){const t=new Set,e=new Set;for(const n of this._constraints)this._processConstraint(n,t,e,r=>r.update())}_processConstraint(t,e,n,r){if(n.has(t))return;if(e.has(t))throw new Error("VRMNodeConstraintManager: Circular dependency detected while updating constraints");e.add(t);const i=t.dependencies;for(const s of i)f1e(s,a=>{const o=this._objectConstraintsMap.get(a);if(o)for(const l of o)this._processConstraint(l,e,n,r)});r(t),n.add(t)}},p1e=new qt,m1e=new qt,g1e=class extends aN{get dependencies(){return new Set([this.source])}constructor(t,e){super(t,e),this._dstRestQuat=new qt,this._invSrcRestQuat=new qt}setInitState(){this._dstRestQuat.copy(this.destination.quaternion),z1(this._invSrcRestQuat.copy(this.source.quaternion))}update(){const t=p1e.copy(this._invSrcRestQuat).multiply(this.source.quaternion),e=m1e.copy(this._dstRestQuat).multiply(t);this.destination.quaternion.copy(this._dstRestQuat).slerp(e,this.weight)}},v1e=new q,y1e=new qt,x1e=new qt,b1e=class extends aN{get rollAxis(){return this._rollAxis}set rollAxis(t){this._rollAxis=t,this._v3RollAxis.set(t==="X"?1:0,t==="Y"?1:0,t==="Z"?1:0)}get dependencies(){return new Set([this.source])}constructor(t,e){super(t,e),this._rollAxis="X",this._v3RollAxis=new q(1,0,0),this._dstRestQuat=new qt,this._invDstRestQuat=new qt,this._invSrcRestQuatMulDstRestQuat=new qt}setInitState(){this._dstRestQuat.copy(this.destination.quaternion),z1(this._invDstRestQuat.copy(this._dstRestQuat)),z1(this._invSrcRestQuatMulDstRestQuat.copy(this.source.quaternion)).multiply(this._dstRestQuat)}update(){const t=y1e.copy(this._invDstRestQuat).multiply(this.source.quaternion).multiply(this._invSrcRestQuatMulDstRestQuat),e=v1e.copy(this._v3RollAxis).applyQuaternion(t),r=x1e.setFromUnitVectors(e,this._v3RollAxis).premultiply(this._dstRestQuat).multiply(t);this.destination.quaternion.copy(this._dstRestQuat).slerp(r,this.weight)}},_1e=new Set(["1.0","1.0-beta"]),YG=class $0{get name(){return $0.EXTENSION_NAME}constructor(e,n){this.parser=e,this.helperRoot=n==null?void 0:n.helperRoot}afterRoot(e){return Aj(this,null,function*(){e.userData.vrmNodeConstraintManager=yield this._import(e)})}_import(e){return Aj(this,null,function*(){var n;const r=this.parser.json;if(!(((n=r.extensionsUsed)==null?void 0:n.indexOf($0.EXTENSION_NAME))!==-1))return null;const s=new h1e,a=yield this.parser.getDependencies("node");return a.forEach((o,l)=>{var c;const d=r.nodes[l],f=(c=d==null?void 0:d.extensions)==null?void 0:c[$0.EXTENSION_NAME];if(f==null)return;const p=f.specVersion;if(!_1e.has(p)){console.warn(`VRMNodeConstraintLoaderPlugin: Unknown ${$0.EXTENSION_NAME} specVersion "${p}"`);return}const y=f.constraint;if(y.roll!=null){const b=this._importRollConstraint(o,a,y.roll);s.addConstraint(b)}else if(y.aim!=null){const b=this._importAimConstraint(o,a,y.aim);s.addConstraint(b)}else if(y.rotation!=null){const b=this._importRotationConstraint(o,a,y.rotation);s.addConstraint(b)}}),e.scene.updateMatrixWorld(),s.setInitState(),s})}_importRollConstraint(e,n,r){const{source:i,rollAxis:s,weight:a}=r,o=n[i],l=new b1e(e,o);if(s!=null&&(l.rollAxis=s),a!=null&&(l.weight=a),this.helperRoot){const c=new oT(l);this.helperRoot.add(c)}return l}_importAimConstraint(e,n,r){const{source:i,aimAxis:s,weight:a}=r,o=n[i],l=new d1e(e,o);if(s!=null&&(l.aimAxis=s),a!=null&&(l.weight=a),this.helperRoot){const c=new oT(l);this.helperRoot.add(c)}return l}_importRotationConstraint(e,n,r){const{source:i,weight:s}=r,a=n[i],o=new g1e(e,a);if(s!=null&&(o.weight=s),this.helperRoot){const l=new oT(o);this.helperRoot.add(l)}return o}};YG.EXTENSION_NAME="VRMC_node_constraint";var w1e=YG,U_=(t,e,n)=>new Promise((r,i)=>{var s=l=>{try{o(n.next(l))}catch(c){i(c)}},a=l=>{try{o(n.throw(l))}catch(c){i(c)}},o=l=>l.done?r(l.value):Promise.resolve(l.value).then(s,a);o((n=n.apply(t,e)).next())}),oN=class{},lT=new q,Gf=new q,ZG=class extends oN{get type(){return"capsule"}constructor(t){var e,n,r,i;super(),this.offset=(e=t==null?void 0:t.offset)!=null?e:new q(0,0,0),this.tail=(n=t==null?void 0:t.tail)!=null?n:new q(0,0,0),this.radius=(r=t==null?void 0:t.radius)!=null?r:0,this.inside=(i=t==null?void 0:t.inside)!=null?i:!1}calculateCollision(t,e,n,r){lT.setFromMatrixPosition(t),Gf.subVectors(this.tail,this.offset).applyMatrix4(t),Gf.sub(lT);const i=Gf.lengthSq();r.copy(e).sub(lT);const s=Gf.dot(r);s<=0||(i<=s||Gf.multiplyScalar(s/i),r.sub(Gf));const a=r.length(),o=this.inside?this.radius-n-a:a-n-this.radius;return o<0&&(r.multiplyScalar(1/a),this.inside&&r.negate()),o}},cT=new q,Pj=new $t,QG=class extends oN{get type(){return"plane"}constructor(t){var e,n;super(),this.offset=(e=t==null?void 0:t.offset)!=null?e:new q(0,0,0),this.normal=(n=t==null?void 0:t.normal)!=null?n:new q(0,0,1)}calculateCollision(t,e,n,r){r.setFromMatrixPosition(t),r.negate().add(e),Pj.getNormalMatrix(t),cT.copy(this.normal).applyNormalMatrix(Pj).normalize();const i=r.dot(cT)-n;return r.copy(cT),i}},S1e=new q,JG=class extends oN{get type(){return"sphere"}constructor(t){var e,n,r;super(),this.offset=(e=t==null?void 0:t.offset)!=null?e:new q(0,0,0),this.radius=(n=t==null?void 0:t.radius)!=null?n:0,this.inside=(r=t==null?void 0:t.inside)!=null?r:!1}calculateCollision(t,e,n,r){r.subVectors(e,S1e.setFromMatrixPosition(t));const i=r.length(),s=this.inside?this.radius-n-i:i-n-this.radius;return s<0&&(r.multiplyScalar(1/i),this.inside&&r.negate()),s}},vl=new q,M1e=class extends Yt{constructor(t){super(),this.worldScale=1,this._currentRadius=0,this._currentOffset=new q,this._currentTail=new q,this._shape=t,this._attrPos=new Qt(new Float32Array(396),3),this.setAttribute("position",this._attrPos),this._attrIndex=new Qt(new Uint16Array(264),1),this.setIndex(this._attrIndex),this._buildIndex(),this.update()}update(){let t=!1;const e=this._shape.radius/this.worldScale;this._currentRadius!==e&&(this._currentRadius=e,t=!0),this._currentOffset.equals(this._shape.offset)||(this._currentOffset.copy(this._shape.offset),t=!0);const n=vl.copy(this._shape.tail).divideScalar(this.worldScale);this._currentTail.distanceToSquared(n)>1e-10&&(this._currentTail.copy(n),t=!0),t&&this._buildPosition()}_buildPosition(){vl.copy(this._currentTail).sub(this._currentOffset);const t=vl.length()/this._currentRadius;for(let r=0;r<=16;r++){const i=r/16*Math.PI;this._attrPos.setXYZ(r,-Math.sin(i),-Math.cos(i),0),this._attrPos.setXYZ(17+r,t+Math.sin(i),Math.cos(i),0),this._attrPos.setXYZ(34+r,-Math.sin(i),0,-Math.cos(i)),this._attrPos.setXYZ(51+r,t+Math.sin(i),0,Math.cos(i))}for(let r=0;r<32;r++){const i=r/16*Math.PI;this._attrPos.setXYZ(68+r,0,Math.sin(i),Math.cos(i)),this._attrPos.setXYZ(100+r,t,Math.sin(i),Math.cos(i))}const e=Math.atan2(vl.y,Math.sqrt(vl.x*vl.x+vl.z*vl.z)),n=-Math.atan2(vl.z,vl.x);this.rotateZ(e),this.rotateY(n),this.scale(this._currentRadius,this._currentRadius,this._currentRadius),this.translate(this._currentOffset.x,this._currentOffset.y,this._currentOffset.z),this._attrPos.needsUpdate=!0}_buildIndex(){for(let t=0;t<34;t++){const e=(t+1)%34;this._attrIndex.setXY(t*2,t,e),this._attrIndex.setXY(68+t*2,34+t,34+e)}for(let t=0;t<32;t++){const e=(t+1)%32;this._attrIndex.setXY(136+t*2,68+t,68+e),this._attrIndex.setXY(200+t*2,100+t,100+e)}this._attrIndex.needsUpdate=!0}},E1e=class extends Yt{constructor(t){super(),this.worldScale=1,this._currentOffset=new q,this._currentNormal=new q,this._shape=t,this._attrPos=new Qt(new Float32Array(18),3),this.setAttribute("position",this._attrPos),this._attrIndex=new Qt(new Uint16Array(10),1),this.setIndex(this._attrIndex),this._buildIndex(),this.update()}update(){let t=!1;this._currentOffset.equals(this._shape.offset)||(this._currentOffset.copy(this._shape.offset),t=!0),this._currentNormal.equals(this._shape.normal)||(this._currentNormal.copy(this._shape.normal),t=!0),t&&this._buildPosition()}_buildPosition(){this._attrPos.setXYZ(0,-.5,-.5,0),this._attrPos.setXYZ(1,.5,-.5,0),this._attrPos.setXYZ(2,.5,.5,0),this._attrPos.setXYZ(3,-.5,.5,0),this._attrPos.setXYZ(4,0,0,0),this._attrPos.setXYZ(5,0,0,.25),this.translate(this._currentOffset.x,this._currentOffset.y,this._currentOffset.z),this.lookAt(this._currentNormal),this._attrPos.needsUpdate=!0}_buildIndex(){this._attrIndex.setXY(0,0,1),this._attrIndex.setXY(2,1,2),this._attrIndex.setXY(4,2,3),this._attrIndex.setXY(6,3,0),this._attrIndex.setXY(8,4,5),this._attrIndex.needsUpdate=!0}},A1e=class extends Yt{constructor(t){super(),this.worldScale=1,this._currentRadius=0,this._currentOffset=new q,this._shape=t,this._attrPos=new Qt(new Float32Array(288),3),this.setAttribute("position",this._attrPos),this._attrIndex=new Qt(new Uint16Array(192),1),this.setIndex(this._attrIndex),this._buildIndex(),this.update()}update(){let t=!1;const e=this._shape.radius/this.worldScale;this._currentRadius!==e&&(this._currentRadius=e,t=!0),this._currentOffset.equals(this._shape.offset)||(this._currentOffset.copy(this._shape.offset),t=!0),t&&this._buildPosition()}_buildPosition(){for(let t=0;t<32;t++){const e=t/16*Math.PI;this._attrPos.setXYZ(t,Math.cos(e),Math.sin(e),0),this._attrPos.setXYZ(32+t,0,Math.cos(e),Math.sin(e)),this._attrPos.setXYZ(64+t,Math.sin(e),0,Math.cos(e))}this.scale(this._currentRadius,this._currentRadius,this._currentRadius),this.translate(this._currentOffset.x,this._currentOffset.y,this._currentOffset.z),this._attrPos.needsUpdate=!0}_buildIndex(){for(let t=0;t<32;t++){const e=(t+1)%32;this._attrIndex.setXY(t*2,t,e),this._attrIndex.setXY(64+t*2,32+t,32+e),this._attrIndex.setXY(128+t*2,64+t,64+e)}this._attrIndex.needsUpdate=!0}},T1e=new q,uT=class extends Ts{constructor(t){if(super(),this.matrixAutoUpdate=!1,this.collider=t,this.collider.shape instanceof JG)this._geometry=new A1e(this.collider.shape);else if(this.collider.shape instanceof ZG)this._geometry=new M1e(this.collider.shape);else if(this.collider.shape instanceof QG)this._geometry=new E1e(this.collider.shape);else throw new Error("VRMSpringBoneColliderHelper: Unknown collider shape type detected");const e=new $r({color:16711935,depthTest:!1,depthWrite:!1});this._line=new ea(this._geometry,e),this.add(this._line)}dispose(){this._geometry.dispose()}updateMatrixWorld(t){this.collider.updateWorldMatrix(!0,!1),this.matrix.copy(this.collider.matrixWorld);const e=this.matrix.elements;this._geometry.worldScale=T1e.set(e[0],e[1],e[2]).length(),this._geometry.update(),super.updateMatrixWorld(t)}},P1e=class extends Yt{constructor(t){super(),this.worldScale=1,this._currentRadius=0,this._currentTail=new q,this._springBone=t,this._attrPos=new Qt(new Float32Array(294),3),this.setAttribute("position",this._attrPos),this._attrIndex=new Qt(new Uint16Array(194),1),this.setIndex(this._attrIndex),this._buildIndex(),this.update()}update(){let t=!1;const e=this._springBone.settings.hitRadius/this.worldScale;this._currentRadius!==e&&(this._currentRadius=e,t=!0),this._currentTail.equals(this._springBone.initialLocalChildPosition)||(this._currentTail.copy(this._springBone.initialLocalChildPosition),t=!0),t&&this._buildPosition()}_buildPosition(){for(let t=0;t<32;t++){const e=t/16*Math.PI;this._attrPos.setXYZ(t,Math.cos(e),Math.sin(e),0),this._attrPos.setXYZ(32+t,0,Math.cos(e),Math.sin(e)),this._attrPos.setXYZ(64+t,Math.sin(e),0,Math.cos(e))}this.scale(this._currentRadius,this._currentRadius,this._currentRadius),this.translate(this._currentTail.x,this._currentTail.y,this._currentTail.z),this._attrPos.setXYZ(96,0,0,0),this._attrPos.setXYZ(97,this._currentTail.x,this._currentTail.y,this._currentTail.z),this._attrPos.needsUpdate=!0}_buildIndex(){for(let t=0;t<32;t++){const e=(t+1)%32;this._attrIndex.setXY(t*2,t,e),this._attrIndex.setXY(64+t*2,32+t,32+e),this._attrIndex.setXY(128+t*2,64+t,64+e)}this._attrIndex.setXY(192,96,97),this._attrIndex.needsUpdate=!0}},C1e=new q,R1e=class extends Ts{constructor(t){super(),this.matrixAutoUpdate=!1,this.springBone=t,this._geometry=new P1e(this.springBone);const e=new $r({color:16776960,depthTest:!1,depthWrite:!1});this._line=new ea(this._geometry,e),this.add(this._line)}dispose(){this._geometry.dispose()}updateMatrixWorld(t){this.springBone.bone.updateWorldMatrix(!0,!1),this.matrix.copy(this.springBone.bone.matrixWorld);const e=this.matrix.elements;this._geometry.worldScale=C1e.set(e[0],e[1],e[2]).length(),this._geometry.update(),super.updateMatrixWorld(t)}},dT=class extends mn{constructor(t){super(),this.colliderMatrix=new Ct,this.shape=t}updateWorldMatrix(t,e){super.updateWorldMatrix(t,e),N1e(this.colliderMatrix,this.matrixWorld,this.shape.offset)}};function N1e(t,e,n){const r=e.elements;t.copy(e),n&&(t.elements[12]=r[0]*n.x+r[4]*n.y+r[8]*n.z+r[12],t.elements[13]=r[1]*n.x+r[5]*n.y+r[9]*n.z+r[13],t.elements[14]=r[2]*n.x+r[6]*n.y+r[10]*n.z+r[14])}var I1e=new Ct;function k1e(t){return t.invert?t.invert():t.getInverse(I1e.copy(t)),t}var O1e=class{constructor(t){this._inverseCache=new Ct,this._shouldUpdateInverse=!0,this.matrix=t;const e={set:(n,r,i)=>(this._shouldUpdateInverse=!0,n[r]=i,!0)};this._originalElements=t.elements,t.elements=new Proxy(t.elements,e)}get inverse(){return this._shouldUpdateInverse&&(k1e(this._inverseCache.copy(this.matrix)),this._shouldUpdateInverse=!1),this._inverseCache}revert(){this.matrix.elements=this._originalElements}},fT=new Ct,Lm=new q,L0=new q,D0=new q,U0=new q,L1e=new Ct,D1e=class{constructor(t,e,n={},r=[]){this._currentTail=new q,this._prevTail=new q,this._boneAxis=new q,this._worldSpaceBoneLength=0,this._center=null,this._initialLocalMatrix=new Ct,this._initialLocalRotation=new qt,this._initialLocalChildPosition=new q;var i,s,a,o,l,c;this.bone=t,this.bone.matrixAutoUpdate=!1,this.child=e,this.settings={hitRadius:(i=n.hitRadius)!=null?i:0,stiffness:(s=n.stiffness)!=null?s:1,gravityPower:(a=n.gravityPower)!=null?a:0,gravityDir:(l=(o=n.gravityDir)==null?void 0:o.clone())!=null?l:new q(0,-1,0),dragForce:(c=n.dragForce)!=null?c:.4},this.colliderGroups=r}get dependencies(){const t=new Set,e=this.bone.parent;e&&t.add(e);for(let n=0;n{e(i)})}function pC(t,e){t.children.forEach(n=>{e(n)||pC(n,e)})}function j1e(t){var e;const n=new Map;for(const r of t){let i=r;do{const s=((e=n.get(i))!=null?e:0)+1;if(s===t.size)return i;n.set(i,s),i=i.parent}while(i!==null)}return null}var Cj=class{constructor(){this._joints=new Set,this._sortedJoints=[],this._hasWarnedCircularDependency=!1,this._ancestors=[],this._objectSpringBonesMap=new Map,this._isSortedJointsDirty=!1,this._relevantChildrenUpdated=this._relevantChildrenUpdated.bind(this)}get joints(){return this._joints}get springBones(){return console.warn("VRMSpringBoneManager: springBones is deprecated. use joints instead."),this._joints}get colliderGroups(){const t=new Set;return this._joints.forEach(e=>{e.colliderGroups.forEach(n=>{t.add(n)})}),Array.from(t)}get colliders(){const t=new Set;return this.colliderGroups.forEach(e=>{e.colliders.forEach(n=>{t.add(n)})}),Array.from(t)}addJoint(t){this._joints.add(t);let e=this._objectSpringBonesMap.get(t.bone);e==null&&(e=new Set,this._objectSpringBonesMap.set(t.bone,e)),e.add(t),this._isSortedJointsDirty=!0}addSpringBone(t){console.warn("VRMSpringBoneManager: addSpringBone() is deprecated. use addJoint() instead."),this.addJoint(t)}deleteJoint(t){this._joints.delete(t),this._objectSpringBonesMap.get(t.bone).delete(t),this._isSortedJointsDirty=!0}deleteSpringBone(t){console.warn("VRMSpringBoneManager: deleteSpringBone() is deprecated. use deleteJoint() instead."),this.deleteJoint(t)}setInitState(){this._sortJoints();for(let t=0;t{var a,o;return((o=(a=this._objectSpringBonesMap.get(s))==null?void 0:a.size)!=null?o:0)>0?!0:(this._ancestors.push(s),!1)})),this._isSortedJointsDirty=!1}_insertJointSort(t,e,n,r,i){if(n.has(t))return;if(e.has(t)){this._hasWarnedCircularDependency||(console.warn("VRMSpringBoneManager: Circular dependency detected"),this._hasWarnedCircularDependency=!0);return}e.add(t);const s=t.dependencies;for(const a of s){let o=!1,l=null;U1e(a,c=>{const d=this._objectSpringBonesMap.get(c);if(d)for(const f of d)o=!0,this._insertJointSort(f,e,n,r,i);else o||(l=c)}),l&&i.add(l)}r.push(t),n.add(t)}_relevantChildrenUpdated(t){var e,n;return((n=(e=this._objectSpringBonesMap.get(t))==null?void 0:e.size)!=null?n:0)>0?!0:(t.updateWorldMatrix(!1,!1),!1)}},Rj="VRMC_springBone_extended_collider",F1e=new Set(["1.0","1.0-beta"]),z1e=new Set(["1.0"]),eW=class Hm{get name(){return Hm.EXTENSION_NAME}constructor(e,n){var r;this.parser=e,this.jointHelperRoot=n==null?void 0:n.jointHelperRoot,this.colliderHelperRoot=n==null?void 0:n.colliderHelperRoot,this.useExtendedColliders=(r=n==null?void 0:n.useExtendedColliders)!=null?r:!0}afterRoot(e){return U_(this,null,function*(){e.userData.vrmSpringBoneManager=yield this._import(e)})}_import(e){return U_(this,null,function*(){const n=yield this._v1Import(e);if(n!=null)return n;const r=yield this._v0Import(e);return r??null})}_v1Import(e){return U_(this,null,function*(){var n,r,i,s,a;const o=e.parser.json;if(!(((n=o.extensionsUsed)==null?void 0:n.indexOf(Hm.EXTENSION_NAME))!==-1))return null;const c=new Cj,d=yield e.parser.getDependencies("node"),f=(r=o.extensions)==null?void 0:r[Hm.EXTENSION_NAME];if(!f)return null;const p=f.specVersion;if(!F1e.has(p))return console.warn(`VRMSpringBoneLoaderPlugin: Unknown ${Hm.EXTENSION_NAME} specVersion "${p}"`),null;const y=(i=f.colliders)==null?void 0:i.map((S,w)=>{var x,M,T,P,O,N,D,z,V,k,j,X,ee,ie,pe;const ae=d[S.node];if(ae==null)return console.warn(`VRMSpringBoneLoaderPlugin: The collider #${w} attempted to reference a node #${S.node} but not found. Skipping the collider`),null;const he=S.shape,B=(x=S.extensions)==null?void 0:x[Rj];if(this.useExtendedColliders&&B!=null){const J=B.specVersion;if(!z1e.has(J))console.warn(`VRMSpringBoneLoaderPlugin: Unknown ${Rj} specVersion "${J}". Fallbacking to the ${Hm.EXTENSION_NAME} definition`);else{const Y=B.shape;if(Y.sphere)return this._importSphereCollider(ae,{offset:new q().fromArray((M=Y.sphere.offset)!=null?M:[0,0,0]),radius:(T=Y.sphere.radius)!=null?T:0,inside:(P=Y.sphere.inside)!=null?P:!1});if(Y.capsule)return this._importCapsuleCollider(ae,{offset:new q().fromArray((O=Y.capsule.offset)!=null?O:[0,0,0]),radius:(N=Y.capsule.radius)!=null?N:0,tail:new q().fromArray((D=Y.capsule.tail)!=null?D:[0,0,0]),inside:(z=Y.capsule.inside)!=null?z:!1});if(Y.plane)return this._importPlaneCollider(ae,{offset:new q().fromArray((V=Y.plane.offset)!=null?V:[0,0,0]),normal:new q().fromArray((k=Y.plane.normal)!=null?k:[0,0,1])})}}if(he.sphere)return this._importSphereCollider(ae,{offset:new q().fromArray((j=he.sphere.offset)!=null?j:[0,0,0]),radius:(X=he.sphere.radius)!=null?X:0,inside:!1});if(he.capsule)return this._importCapsuleCollider(ae,{offset:new q().fromArray((ee=he.capsule.offset)!=null?ee:[0,0,0]),radius:(ie=he.capsule.radius)!=null?ie:0,tail:new q().fromArray((pe=he.capsule.tail)!=null?pe:[0,0,0]),inside:!1});console.warn(`VRMSpringBoneLoaderPlugin: The collider #${w} has no valid shape. Skipping the collider`)}),b=(s=f.colliderGroups)==null?void 0:s.map((S,w)=>{var x;return{colliders:((x=S.colliders)!=null?x:[]).map(T=>{const P=y==null?void 0:y[T];return P??(console.warn(`VRMSpringBoneLoaderPlugin: The collider group #${w} attempted to reference a collider #${T} but not found. Skipping the collider`),null)}).filter(T=>T!=null),name:S.name}});return(a=f.springs)==null||a.forEach((S,w)=>{var x;const M=S.joints,T=(x=S.colliderGroups)==null?void 0:x.map(N=>{const D=b==null?void 0:b[N];return D??(console.warn(`VRMSpringBoneLoaderPlugin: The spring #${w} attempted to reference a collider group #${N} but not found. Skipping the collider group`),null)}).filter(N=>N!=null),P=S.center!=null?d[S.center]:void 0;let O;M.forEach(N=>{if(O){const D=O.node,z=d[D],V=N.node,k=d[V],j={hitRadius:O.hitRadius,dragForce:O.dragForce,gravityPower:O.gravityPower,stiffness:O.stiffness,gravityDir:O.gravityDir!=null?new q().fromArray(O.gravityDir):void 0},X=this._importJoint(z,k,j,T);P&&(X.center=P),c.addJoint(X)}O=N})}),c.setInitState(),c})}_v0Import(e){return U_(this,null,function*(){var n,r,i;const s=e.parser.json;if(!(((n=s.extensionsUsed)==null?void 0:n.indexOf("VRM"))!==-1))return null;const o=(r=s.extensions)==null?void 0:r.VRM,l=o==null?void 0:o.secondaryAnimation;if(!l)return null;const c=l==null?void 0:l.boneGroups;if(!c)return null;const d=new Cj,f=yield e.parser.getDependencies("node"),p=(i=l.colliderGroups)==null?void 0:i.map((y,b)=>{var S;const w=f[y.node];return w==null?(console.warn(`VRMSpringBoneLoaderPlugin: The collider group #${b} attempted to reference a node #${y.node} but not found. Skipping the collider group`),null):{colliders:((S=y.colliders)!=null?S:[]).map((M,T)=>{var P,O,N;const D=new q(0,0,0);return M.offset&&D.set((P=M.offset.x)!=null?P:0,(O=M.offset.y)!=null?O:0,M.offset.z?-M.offset.z:0),this._importSphereCollider(w,{offset:D,radius:(N=M.radius)!=null?N:0,inside:!1})})}});return c==null||c.forEach((y,b)=>{const S=y.bones;S&&S.forEach(w=>{var x,M,T,P;const O=f[w];if(O==null){console.warn(`VRMSpringBoneLoaderPlugin: The spring bone group #${b} attempted to reference a node #${w} but not found. Skipping the node`);return}const N=new q;y.gravityDir?N.set((x=y.gravityDir.x)!=null?x:0,(M=y.gravityDir.y)!=null?M:0,(T=y.gravityDir.z)!=null?T:0):N.set(0,-1,0);const D=y.center!=null?f[y.center]:void 0,z={hitRadius:y.hitRadius,dragForce:y.dragForce,gravityPower:y.gravityPower,stiffness:y.stiffiness,gravityDir:N},V=(P=y.colliderGroups)==null?void 0:P.map(k=>{const j=p==null?void 0:p[k];return j??(console.warn(`VRMSpringBoneLoaderPlugin: The spring #${b} attempted to reference a collider group #${k} but not found. Skipping the collider group`),null)}).filter(k=>k!=null);O.traverse(k=>{var j;const X=(j=k.children[0])!=null?j:null,ee=this._importJoint(k,X,z,V);D&&(ee.center=D),d.addJoint(ee)})})}),e.scene.updateMatrixWorld(),d.setInitState(),d})}_importJoint(e,n,r,i){const s=new D1e(e,n,r,i);if(this.jointHelperRoot){const a=new R1e(s);this.jointHelperRoot.add(a),a.renderOrder=this.jointHelperRoot.renderOrder}return s}_importSphereCollider(e,n){const r=new JG(n),i=new dT(r);if(e.add(i),this.colliderHelperRoot){const s=new uT(i);this.colliderHelperRoot.add(s),s.renderOrder=this.colliderHelperRoot.renderOrder}return i}_importCapsuleCollider(e,n){const r=new ZG(n),i=new dT(r);if(e.add(i),this.colliderHelperRoot){const s=new uT(i);this.colliderHelperRoot.add(s),s.renderOrder=this.colliderHelperRoot.renderOrder}return i}_importPlaneCollider(e,n){const r=new QG(n),i=new dT(r);if(e.add(i),this.colliderHelperRoot){const s=new uT(i);this.colliderHelperRoot.add(s),s.renderOrder=this.colliderHelperRoot.renderOrder}return i}};eW.EXTENSION_NAME="VRMC_springBone";var B1e=eW,H1e=class{get name(){return"VRMLoaderPlugin"}constructor(t,e){var n,r,i,s,a,o,l,c,d,f;this.parser=t;const p=e==null?void 0:e.helperRoot,y=e==null?void 0:e.autoUpdateHumanBones;this.expressionPlugin=(n=e==null?void 0:e.expressionPlugin)!=null?n:new iwe(t),this.firstPersonPlugin=(r=e==null?void 0:e.firstPersonPlugin)!=null?r:new awe(t),this.humanoidPlugin=(i=e==null?void 0:e.humanoidPlugin)!=null?i:new hwe(t,{helperRoot:p,autoUpdateHumanBones:y}),this.lookAtPlugin=(s=e==null?void 0:e.lookAtPlugin)!=null?s:new Pwe(t,{helperRoot:p}),this.metaPlugin=(a=e==null?void 0:e.metaPlugin)!=null?a:new Nwe(t),this.mtoonMaterialPlugin=(o=e==null?void 0:e.mtoonMaterialPlugin)!=null?o:new $we(t),this.materialsHDREmissiveMultiplierPlugin=(l=e==null?void 0:e.materialsHDREmissiveMultiplierPlugin)!=null?l:new qwe(t),this.materialsV0CompatPlugin=(c=e==null?void 0:e.materialsV0CompatPlugin)!=null?c:new t1e(t),this.springBonePlugin=(d=e==null?void 0:e.springBonePlugin)!=null?d:new B1e(t,{colliderHelperRoot:p,jointHelperRoot:p}),this.nodeConstraintPlugin=(f=e==null?void 0:e.nodeConstraintPlugin)!=null?f:new w1e(t,{helperRoot:p})}beforeRoot(){return O_(this,null,function*(){yield this.materialsV0CompatPlugin.beforeRoot(),yield this.mtoonMaterialPlugin.beforeRoot()})}loadMesh(t){return O_(this,null,function*(){return yield this.mtoonMaterialPlugin.loadMesh(t)})}getMaterialType(t){const e=this.mtoonMaterialPlugin.getMaterialType(t);return e??null}extendMaterialParams(t,e){return O_(this,null,function*(){yield this.materialsHDREmissiveMultiplierPlugin.extendMaterialParams(t,e),yield this.mtoonMaterialPlugin.extendMaterialParams(t,e)})}afterRoot(t){return O_(this,null,function*(){yield this.metaPlugin.afterRoot(t),yield this.humanoidPlugin.afterRoot(t),yield this.expressionPlugin.afterRoot(t),yield this.lookAtPlugin.afterRoot(t),yield this.firstPersonPlugin.afterRoot(t),yield this.springBonePlugin.afterRoot(t),yield this.nodeConstraintPlugin.afterRoot(t),yield this.mtoonMaterialPlugin.afterRoot(t);const e=t.userData.vrmMeta,n=t.userData.vrmHumanoid;if(e&&n){const r=new kwe({scene:t.scene,expressionManager:t.userData.vrmExpressionManager,firstPerson:t.userData.vrmFirstPerson,humanoid:n,lookAt:t.userData.vrmLookAt,meta:e,materials:t.userData.vrmMToonMaterials,springBoneManager:t.userData.vrmSpringBoneManager,nodeConstraintManager:t.userData.vrmNodeConstraintManager});t.userData.vrm=r}})}};function V1e(t){const e=new Set;return t.traverse(n=>{if(!n.isMesh)return;const r=n;e.add(r)}),e}function Nj(t,e,n){if(e.size===1){const a=e.values().next().value;if(a.weight===1)return t[a.index]}const r=new Float32Array(t[0].count*3);let i=0;if(n)i=1;else for(const a of e)i+=a.weight;for(const a of e){const o=t[a.index],l=a.weight/i;for(let c=0;cd.getOrCreate(V)).join(","),D=`${P};${x};${N}`;let z=o.get(D);z==null&&(z=T.clone(),Y1e(z,O,b),o.set(D,z)),M.geometry.setAttribute("skinIndex",z)}for(const M of y)M.bind(w,new Ct)}}function $1e(t){const e=new Set;return t.traverse(n=>{if(!n.isSkinnedMesh)return;const r=n;e.add(r)}),e}function X1e(t,e){const n=new Set;for(let r=0;rn)return!1;return!0}var hT=class{constructor(){this._objectIndexMap=new Map,this._index=0}get(t){return this._objectIndexMap.get(t)}getOrCreate(t){let e=this._objectIndexMap.get(t);return e==null&&(e=this._index,this._objectIndexMap.set(t,e),this._index++),e}};function Q1e(t){var e,n,r,i;const s=new Yt;s.name=t.name,s.setIndex(t.index);for(const[a,o]of Object.entries(t.attributes))s.setAttribute(a,o);for(const[a,o]of Object.entries(t.morphAttributes)){const l=a;s.morphAttributes[l]=o.concat()}s.morphTargetsRelative=t.morphTargetsRelative,s.groups=[];for(const a of t.groups)s.addGroup(a.start,a.count,a.materialIndex);return s.boundingSphere=(n=(e=t.boundingSphere)==null?void 0:e.clone())!=null?n:null,s.boundingBox=(i=(r=t.boundingBox)==null?void 0:r.clone())!=null?i:null,s.drawRange.start=t.drawRange.start,s.drawRange.count=t.drawRange.count,s.userData=t.userData,s}function Ij(t){if(Object.values(t).forEach(e=>{e!=null&&e.isTexture&&e.dispose()}),t.isShaderMaterial){const e=t.uniforms;e&&Object.values(e).forEach(n=>{const r=n.value;r!=null&&r.isTexture&&r.dispose()})}t.dispose()}function J1e(t){const e=t.geometry;e&&e.dispose();const n=t.skeleton;n&&n.dispose();const r=t.material;r&&(Array.isArray(r)?r.forEach(i=>Ij(i)):r&&Ij(r))}function eSe(t){t.traverse(J1e)}function tSe(t,e){var n,r;console.warn("VRMUtils.removeUnnecessaryJoints: removeUnnecessaryJoints is deprecated. Use combineSkeletons instead. combineSkeletons contributes more to the performance improvement. This function will be removed in the next major version.");const i=(n=e==null?void 0:e.experimentalSameBoneCounts)!=null?n:!1,s=[];t.traverse(l=>{l.type==="SkinnedMesh"&&s.push(l)});const a=new Map;let o=0;for(const l of s){const d=l.geometry.getAttribute("skinIndex");if(a.has(d))continue;const f=new Map,p=new Map;for(let y=0;y{e.addGroup(a.start,a.count,a.materialIndex)}),e.boundingBox=(r=(n=t.boundingBox)==null?void 0:n.clone())!=null?r:null,e.boundingSphere=(s=(i=t.boundingSphere)==null?void 0:i.clone())!=null?s:null,e.setDrawRange(t.drawRange.start,t.drawRange.count),e.userData=t.userData}function sSe(t,e,n){const r=e.array,i=new r.constructor(r.length);for(let s=0;s{if(!n.isMesh)return;const r=n,i=r.geometry,s=i.index;if(s==null)return;const a=e.get(i);if(a!=null){r.geometry=a;return}const{isVertexUsed:o,vertexCount:l,verticesUsed:c}=nSe(i.attributes,s);if(c===l)return;const{originalIndexNewIndexMap:d,newIndexOriginalIndexMap:f}=rSe(o),p=new Yt;iSe(i,p),e.set(i,p),sSe(p,s,d),oSe(p,i.attributes,f),cSe(p,i.morphAttributes,f),r.geometry=p}),Array.from(e.keys()).forEach(n=>{n.dispose()})}function dSe(t){var e;((e=t.meta)==null?void 0:e.metaVersion)==="0"&&(t.scene.rotation.y=Math.PI)}var Wc=class{constructor(){}};Wc.combineMorphs=G1e;Wc.combineSkeletons=W1e;Wc.deepDispose=eSe;Wc.removeUnnecessaryJoints=tSe;Wc.removeUnnecessaryVertices=uSe;Wc.rotateVRM0=dSe;/*! - * @pixiv/three-vrm-core v3.5.4 - * The implementation of core features of VRM, for @pixiv/three-vrm - * - * Copyright (c) 2019-2026 pixiv Inc. - * @pixiv/three-vrm-core is distributed under MIT License - * https://github.com/pixiv/three-vrm/blob/release/LICENSE - *//*! - * @pixiv/three-vrm-materials-mtoon v3.5.4 - * MToon (toon material) module for @pixiv/three-vrm - * - * Copyright (c) 2019-2026 pixiv Inc. - * @pixiv/three-vrm-materials-mtoon is distributed under MIT License - * https://github.com/pixiv/three-vrm/blob/release/LICENSE - *//*! - * @pixiv/three-vrm-materials-hdr-emissive-multiplier v3.5.4 - * Support VRMC_hdr_emissiveMultiplier for @pixiv/three-vrm - * - * Copyright (c) 2019-2026 pixiv Inc. - * @pixiv/three-vrm-materials-hdr-emissive-multiplier is distributed under MIT License - * https://github.com/pixiv/three-vrm/blob/release/LICENSE - *//*! - * @pixiv/three-vrm-materials-v0compat v3.5.4 - * VRM0.0 materials compatibility layer plugin for @pixiv/three-vrm - * - * Copyright (c) 2019-2026 pixiv Inc. - * @pixiv/three-vrm-materials-v0compat is distributed under MIT License - * https://github.com/pixiv/three-vrm/blob/release/LICENSE - *//*! - * @pixiv/three-vrm-node-constraint v3.5.4 - * Node constraint module for @pixiv/three-vrm - * - * Copyright (c) 2019-2026 pixiv Inc. - * @pixiv/three-vrm-node-constraint is distributed under MIT License - * https://github.com/pixiv/three-vrm/blob/release/LICENSE - *//*! - * @pixiv/three-vrm-springbone v3.5.4 - * Spring bone module for @pixiv/three-vrm - * - * Copyright (c) 2019-2026 pixiv Inc. - * @pixiv/three-vrm-springbone is distributed under MIT License - * https://github.com/pixiv/three-vrm/blob/release/LICENSE - */const fSe={leftUpperArm:[0,0,1.2],rightUpperArm:[0,0,-1.2],leftLowerArm:[0,-.2,0],rightLowerArm:[0,.2,0]};function No(t,e,n,r,i){var a;const s=(a=t.humanoid)==null?void 0:a.getNormalizedBoneNode(e);s&&s.rotation.set(n,r,i)}function hSe(t){var e;for(const[n,r]of Object.entries(fSe))No(t,n,r[0],r[1],r[2]);(e=t.humanoid)==null||e.update()}function pSe(t,e,n,r,i,s){const a=Math.sin(e*1.7),o=Math.sin(e*.45),l=Math.sin(e*.32),c=Math.min(1,n*1.4),d=Math.sin(e*1.3)*c*.06;No(t,"hips",0,l*.045,l*.03),No(t,"spine",a*.025+s*.07,o*.022,-l*.03),No(t,"chest",a*.02+s*.02,o*.018,0),No(t,"upperChest",a*.015,0,0),No(t,"neck",i*.4+d*.5,r*.4,0),No(t,"head",i*.6+d*.5+Math.sin(e*.6)*.015,r*.6+Math.sin(e*.27)*.025,Math.sin(e*.5)*.02);const f=Math.sin(e*.8)*.035;No(t,"leftUpperArm",0,0,1.18+f+l*.04),No(t,"rightUpperArm",0,0,-1.18-f+l*.04),No(t,"leftLowerArm",0,-.18-Math.sin(e*.8)*.03,0),No(t,"rightLowerArm",0,.18+Math.sin(e*.8)*.03,0)}const mSe=["happy","angry","sad","surprised","relaxed"],gSe={neutral:null,happy:"happy",angry:"angry",sad:"sad",surprised:"surprised",relaxed:"relaxed"};function vSe({url:t,audioLevel:e,emotion:n,onError:r}){const[i,s]=R.useState(null),a=R.useRef({}),o=R.useRef({t:0,next:3,active:0}),l=R.useRef({yaw:0,pitch:0,tYaw:0,tPitch:0,t:0,next:2.5,lean:0});return R.useEffect(()=>{let c=!1,d=null;const f=new b_e;return f.register(p=>new H1e(p)),f.load(t,p=>{var b;if(c)return;const y=p.userData.vrm;if(!y){r("Datei enthält kein gültiges VRM-Modell.");return}Wc.removeUnnecessaryVertices(p.scene),((b=y.meta)==null?void 0:b.metaVersion)==="0"&&Wc.rotateVRM0(y),y.scene.rotation.y=Math.PI,hSe(y),d=y,s(y)},void 0,p=>{console.error("VRM-Load-Fehler:",p),r("Avatar konnte nicht geladen werden (CORS/URL?).")}),()=>{c=!0,d&&Wc.deepDispose(d.scene),s(null)}},[t,r]),AG((c,d)=>{var b;if(!i)return;const f=((b=e.current)==null?void 0:b.current)??0;i.lookAt&&(i.lookAt.target=c.camera);const p=l.current;p.t+=d,p.t>p.next&&(p.tYaw=(Math.random()-.5)*.5,p.tPitch=(Math.random()-.5)*.24,p.t=0,p.next=2.5+Math.random()*3.5),p.yaw+=(p.tYaw-p.yaw)*Math.min(1,d*1.5),p.pitch+=(p.tPitch-p.pitch)*Math.min(1,d*1.5),p.lean+=(Math.min(1,f*1.6)-p.lean)*Math.min(1,d*3),pSe(i,c.clock.elapsedTime,f,p.yaw,p.pitch,p.lean);const y=i.expressionManager;if(y){const S=(a.current.aa??0)*.4+f*.6;a.current.aa=S,y.setValue("aa",S);const w=gSe[n.current];for(const T of mSe){const P=w===T?.75:0,O=a.current[T]??0,N=O+(P-O)*Math.min(1,d*4);a.current[T]=N,y.setValue(T,N)}const x=o.current;x.t+=d,x.active<=0&&x.t>x.next&&(x.active=.16,x.t=0,x.next=3+Math.random()*4);let M=0;if(x.active>0){x.active-=d;const T=1-x.active/.16;M=1-Math.abs(T-.5)*2}y.setValue("blink",Math.max(0,M))}i.update(d)}),i?v.jsx("primitive",{object:i.scene}):null}function ySe({url:t,audioLevel:e,emotion:n}){const[r,i]=R.useState(null);return v.jsxs("div",{className:"relative h-full w-full",children:[v.jsxs(u_e,{camera:{position:[0,1.35,1.25],fov:30},gl:{alpha:!0,antialias:!0},style:{background:"transparent"},children:[v.jsx("ambientLight",{intensity:.85}),v.jsx("directionalLight",{position:[1,2,2],intensity:1.1}),v.jsx("directionalLight",{position:[-1,1,-1],intensity:.4}),v.jsx(vSe,{url:t,audioLevel:e,emotion:n,onError:i},t),v.jsx(x_e,{target:[0,1.3,0],enablePan:!1,minDistance:.7,maxDistance:3,minPolarAngle:Math.PI/3,maxPolarAngle:Math.PI/1.8})]}),r&&v.jsx("div",{className:"absolute inset-x-0 bottom-3 mx-auto w-fit rounded-md bg-red-500/15 border border-red-500/30 px-3 py-1.5 text-xs text-red-300",children:r})]})}const xSe=["elevenlabs","edge"],bSe={elevenlabs:"ElevenLabs (premium)",edge:"Edge (natürlich · gratis)"};function _Se(){const[t,e]=R.useState([]),[n,r]=R.useState(localStorage.getItem("mc_voice_engine")||"elevenlabs"),[i,s]=R.useState(localStorage.getItem("mc_voice_voice")||""),[a,o]=R.useState(!1),[l,c]=R.useState(()=>{const x=localStorage.getItem("mc_voice_volume");if(x===null||x==="")return .6;const M=Number(x);return Number.isNaN(M)?.6:M}),d=R.useRef(null),f=x=>{c(x),localStorage.setItem("mc_voice_volume",String(x)),window.dispatchEvent(new CustomEvent("mc-voice-volume",{detail:x}))},p=(x,M)=>{r(x),s(M),localStorage.setItem("mc_voice_engine",x),localStorage.setItem("mc_voice_voice",M)};R.useEffect(()=>{fetch("/api/voice/voices").then(x=>x.ok?x.json():Promise.reject()).then(x=>{const M=x.voices||[];if(e(M),!i){const T=M.find(P=>P.engine===n);T&&p(n,T.id)}}).catch(()=>e([]))},[]);const y=async()=>{var x;if(!a){o(!0);try{const M=await fetch("/api/voice/tts",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({text:"Hallo! So klingt diese Stimme auf Deutsch.",engine:n,voice:i})});if(!M.ok)throw new Error(`TTS ${M.status}`);const T=URL.createObjectURL(await M.blob());(x=d.current)==null||x.pause();const P=new Audio(T);P.volume=Math.min(1,l),d.current=P,P.onended=()=>URL.revokeObjectURL(T),await P.play()}catch(M){console.error("Probe fehlgeschlagen:",M)}finally{o(!1)}}},b=x=>{const M=t.find(T=>T.engine===x);p(x,(M==null?void 0:M.id)||"")},S=t.filter(x=>x.engine===n),w=n==="elevenlabs"&&S.length===0;return v.jsxs("div",{className:"text-sm",children:[v.jsxs("div",{className:"mb-2 flex items-center gap-1.5 text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:[v.jsx(Vm,{className:"h-3.5 w-3.5"})," Stimme"]}),t.length===0?v.jsx("div",{className:"rounded-md border border-amber-500/30 bg-amber-500/10 px-3 py-2 text-xs text-amber-300",children:"Voice-Dienst nicht erreichbar — Stimmen werden geladen, sobald der Sidecar läuft."}):v.jsxs("div",{className:"space-y-2",children:[v.jsx("div",{className:"grid grid-cols-2 gap-1.5",children:xSe.map(x=>v.jsx("button",{onClick:()=>b(x),className:`rounded-md border px-2.5 py-1.5 text-xs transition-colors ${n===x?"border-primary/50 bg-primary/10 text-primary":"border-border/40 hover:bg-accent"}`,children:bSe[x]},x))}),v.jsx("select",{value:i,onChange:x=>p(n,x.target.value),className:"w-full rounded-md border border-border/40 bg-background/40 px-2.5 py-2 text-xs outline-none focus:border-primary/50",children:S.map(x=>v.jsx("option",{value:x.id,children:x.label},x.id))}),v.jsxs("button",{onClick:y,disabled:a||w,className:"flex w-full items-center justify-center gap-2 rounded-md border border-primary/40 bg-primary/10 px-2.5 py-2 text-xs text-primary hover:bg-primary/20 transition-colors disabled:opacity-60",children:[a?v.jsx($1,{className:"h-3.5 w-3.5 animate-spin"}):v.jsx(DT,{className:"h-3.5 w-3.5"}),a?"Spielt …":"Probe hören"]}),v.jsxs("div",{className:"flex items-center gap-2 pt-0.5",children:[v.jsx(DT,{className:"h-3.5 w-3.5 shrink-0 text-muted-foreground"}),v.jsx("input",{type:"range",min:0,max:1.2,step:.05,value:l,onChange:x=>f(Number(x.target.value)),className:"h-1 flex-1 cursor-pointer accent-primary",title:"Lautstärke"}),v.jsxs("span",{className:"w-9 text-right text-[11px] tabular-nums text-muted-foreground",children:[Math.round(l*100),"%"]})]}),w&&v.jsxs("p",{className:"text-[11px] text-amber-300",children:["Keine ElevenLabs-Stimmen — Key in ",v.jsx("code",{children:"~/.hermes/.env"})," fehlt, oder keine eigene Stimme angelegt."]}),n==="edge"&&v.jsx("p",{className:"text-[11px] text-muted-foreground",children:"Edge: native deutsche Stimmen, gratis & ohne Key. Cloud (Text → Microsoft)."})]})]})}function wSe(t){const[e,n]=R.useState(!1),r=R.useRef(null),i=R.useRef([]),s=R.useRef(null),a=R.useCallback(async()=>{if(r.current)return;let l;try{l=await navigator.mediaDevices.getUserMedia({audio:!0})}catch(f){console.error("Mikrofon-Zugriff verweigert:",f);return}s.current=l;const c=MediaRecorder.isTypeSupported("audio/webm;codecs=opus")?"audio/webm;codecs=opus":"audio/webm",d=new MediaRecorder(l,{mimeType:c});i.current=[],d.ondataavailable=f=>{f.data.size&&i.current.push(f.data)},d.onstop=()=>{var p;const f=new Blob(i.current,{type:c});(p=s.current)==null||p.getTracks().forEach(y=>y.stop()),s.current=null,r.current=null,n(!1),f.size>1200&&t(f)},d.start(),r.current=d,n(!0)},[t]),o=R.useCallback(()=>{var l;(l=r.current)==null||l.stop()},[]);return R.useEffect(()=>()=>{var l,c;(l=r.current)==null||l.stop(),(c=s.current)==null||c.getTracks().forEach(d=>d.stop())},[]),{recording:e,start:a,stop:o}}class lN{constructor(){Gs(this,"ctx");Gs(this,"analyser");Gs(this,"gain");Gs(this,"queue",[]);Gs(this,"playing",!1);Gs(this,"raf",0);Gs(this,"freq");Gs(this,"level",{current:0});Gs(this,"onSpeaking");const e=window.AudioContext||window.webkitAudioContext;this.ctx=new e,this.analyser=this.ctx.createAnalyser(),this.analyser.fftSize=256,this.analyser.smoothingTimeConstant=.6,this.gain=this.ctx.createGain(),this.gain.gain.value=lN.readVolume(),this.analyser.connect(this.gain),this.gain.connect(this.ctx.destination),this.freq=new Uint8Array(new ArrayBuffer(this.analyser.frequencyBinCount)),window.addEventListener("mc-voice-volume",n=>{const r=Number(n.detail);Number.isNaN(r)||(this.gain.gain.value=Math.max(0,Math.min(1.5,r)))})}static readVolume(){const e=localStorage.getItem("mc_voice_volume");if(e===null||e==="")return .6;const n=Number(e);return Number.isNaN(n)?.6:Math.max(0,Math.min(1.5,n))}async enqueue(e){this.queue.push(e),this.playing||await this.playNext()}clear(){this.queue=[]}async playNext(){var i,s;const e=this.queue.shift();if(!e){this.playing=!1,this.stopMeter(),(i=this.onSpeaking)==null||i.call(this,!1);return}if(this.playing=!0,(s=this.onSpeaking)==null||s.call(this,!0),this.ctx.state==="suspended")try{await this.ctx.resume()}catch{}let n;try{n=await this.ctx.decodeAudioData(e.slice(0))}catch{return this.playNext()}const r=this.ctx.createBufferSource();r.buffer=n,r.connect(this.analyser),r.onended=()=>{this.playNext()},r.start(),this.startMeter()}startMeter(){cancelAnimationFrame(this.raf);const e=()=>{this.analyser.getByteFrequencyData(this.freq);const n=Math.min(this.freq.length,48);let r=0;for(let s=2;s~|`]+/g," ").replace(/^\s*[-•·]\s+/gm," ").replace(/\s*&\s*/g," und ").replace(/(\d)\s*%/g,"$1 Prozent").replace(/%/g," Prozent ").replace(/(\d)\s*°\s*C?/g,"$1 Grad").replace(/°/g," Grad ").replace(/\s*=\s*/g," gleich ").replace(/\s*\/\s*/g," ").replace(/[\u{1F300}-\u{1FAFF}\u{2600}-\u{27BF}\u{2190}-\u{21FF}\u{2B00}-\u{2BFF}]/gu,"").replace(/\s+/g," ").trim()}function kj(){let t=localStorage.getItem("mc_voice_session");return t||(t="voice-"+Math.random().toString(36).slice(2)+Date.now().toString(36),localStorage.setItem("mc_voice_session",t)),t}function TSe(){return{engine:localStorage.getItem("mc_voice_engine")||"elevenlabs",voice:localStorage.getItem("mc_voice_voice")||""}}function PSe(t){const e=[],n=/[^.!?…]+[.!?…]+(\s|$)/g;let r=0,i;for(;i=n.exec(t);)e.push(i[0].trim()),r=n.lastIndex;return{sentences:e,rest:t.slice(r)}}function CSe(){const[t,e]=R.useState("idle"),[n,r]=R.useState([]),[i,s]=R.useState(null),a=R.useRef({current:0}),o=R.useRef("neutral"),l=R.useRef(null),c=R.useRef(kj()),d=R.useCallback(()=>{if(!l.current){const M=new lN;M.onSpeaking=T=>e(P=>T?"speaking":P==="speaking"?"idle":P),l.current=M,a.current=M.level}return l.current},[]),f=R.useCallback(async M=>{var ee,ie,pe,ae;s(null);const T=d();T.clear(),e("transcribing");let P="";try{const he=new FormData;he.append("audio",M,"rec.webm");const B=await fetch("/api/voice/stt",{method:"POST",body:he});if(!B.ok)throw new Error(`STT ${B.status}`);P=((ee=(await B.json()).text)==null?void 0:ee.trim())||""}catch(he){e("error"),s(`Spracherkennung fehlgeschlagen: ${he.message}`);return}if(!P){e("idle");return}r(he=>[...he,{role:"user",text:P}]),e("thinking");const{engine:O,voice:N}=TSe();let D="",z="";r(he=>[...he,{role:"assistant",text:""}]);let V=Promise.resolve(),k=!1,j=!1;const X=he=>{const B=ASe(he);B&&(V=V.then(async()=>{try{const J=await fetch("/api/voice/tts",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({text:B,engine:O,voice:N})});if(!J.ok)throw new Error(`TTS ${J.status}`);await T.enqueue(await J.arrayBuffer()),k=!0}catch(J){j=!0,console.error("TTS-Fehler:",J)}}))};try{const he=await fetch("/api/voice/chat",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({text:P,session_id:c.current,system:ESe})});if(!he.ok||!he.body)throw new Error(`Agent ${he.status}`);const B=he.body.getReader(),J=new TextDecoder;let Y="";for(;;){const{done:H,value:G}=await B.read();if(H)break;Y+=J.decode(G,{stream:!0});const le=Y.split(` - -`);Y=le.pop()||"";for(const se of le){const ce=se.split(` -`).find($e=>$e.startsWith("data:"));if(!ce)continue;const Se=ce.slice(5).trim();if(Se==="[DONE]")continue;let we;try{we=JSON.parse(Se)}catch{continue}if(we.error)throw new Error(we.error);const We=((ae=(pe=(ie=we.choices)==null?void 0:ie[0])==null?void 0:pe.delta)==null?void 0:ae.content)||"";if(!We)continue;D+=We,z+=We,o.current=MSe(D),r($e=>{const de=$e.slice();return de[de.length-1]={role:"assistant",text:D},de});const{sentences:Ee,rest:Ge}=PSe(z);z=Ge,Ee.forEach(X)}}if(z.trim()&&X(z),await V,!D.trim()){e("idle");return}k||(e("error"),s(j?"Sprachausgabe fehlgeschlagen — Engine/Stimme prüfen.":"Keine Sprachausgabe erzeugt."))}catch(he){e("error"),s(`Agent-Antwort fehlgeschlagen: ${he.message}`)}},[d]),{recording:p,start:y,stop:b}=wSe(f),S=R.useCallback(()=>{d(),e("listening"),y()},[d,y]),w=R.useCallback(()=>{b()},[b]),x=R.useCallback(()=>{var M;(M=l.current)==null||M.clear(),r([]),s(null),e("idle"),localStorage.removeItem("mc_voice_session"),c.current=kj()},[]);return R.useEffect(()=>{!p&&t==="listening"&&e("transcribing")},[p,t]),{status:t,messages:n,error:i,recording:p,audioLevel:a,emotion:o,pressStart:S,pressEnd:w,reset:x}}const RSe="/avatar.vrm";function NSe(t){return t.split(/(\*\*[^*\n]+\*\*)/g).map((e,n)=>{const r=e.match(/^\*\*([^*]+)\*\*$/);return r?v.jsx("strong",{className:"font-semibold text-foreground",children:r[1]},n):v.jsx("span",{children:e},n)})}function ISe(){return v.jsx("span",{className:"inline-flex items-center gap-1 align-middle",children:[0,1,2].map(t=>v.jsx("span",{className:"h-1.5 w-1.5 animate-pulse rounded-full bg-muted-foreground",style:{animationDelay:`${t*.15}s`}},t))})}const kSe={idle:"Bereit — halte zum Sprechen",listening:"Höre zu …",transcribing:"Verstehe …",thinking:"Hermes denkt …",speaking:"Hermes spricht …",error:"Fehler"};function OSe(){const{status:t,messages:e,error:n,recording:r,audioLevel:i,emotion:s,pressStart:a,pressEnd:o,reset:l}=CSe(),c=R.useRef(!1),d=R.useRef(null);R.useEffect(()=>{var y;(y=d.current)==null||y.scrollIntoView({behavior:"smooth",block:"end"})},[e]),R.useEffect(()=>{const y=w=>w instanceof HTMLElement&&/^(INPUT|TEXTAREA|SELECT)$/.test(w.tagName),b=w=>{w.code!=="Space"||w.repeat||c.current||y(w.target)||(w.preventDefault(),c.current=!0,a())},S=w=>{w.code!=="Space"||!c.current||(w.preventDefault(),c.current=!1,o())};return window.addEventListener("keydown",b),window.addEventListener("keyup",S),()=>{window.removeEventListener("keydown",b),window.removeEventListener("keyup",S)}},[a,o]);const f=t==="speaking",p=t==="transcribing"||t==="thinking";return v.jsxs("div",{className:"flex h-full gap-5",children:[v.jsxs("div",{className:"relative flex min-w-0 flex-1 flex-col rounded-xl border border-border/40 bg-card/30 overflow-hidden",children:[v.jsx("div",{className:"flex-1 min-h-0",children:v.jsx(ySe,{url:RSe,audioLevel:i,emotion:s})}),v.jsxs("div",{className:"shrink-0 flex flex-col items-center gap-3 border-t border-border/40 bg-background/30 py-5 backdrop-blur-sm",children:[v.jsxs("div",{className:Je("flex items-center gap-2 text-sm",t==="error"?"text-red-400":f?"text-primary":"text-muted-foreground"),children:[p&&v.jsx($1,{className:"h-4 w-4 animate-spin"}),f&&v.jsx(DT,{className:"h-4 w-4 animate-pulse"}),v.jsx("span",{children:n||kSe[t]})]}),v.jsx("button",{onPointerDown:y=>{y.preventDefault(),c.current=!0,a()},onPointerUp:()=>{c.current&&(c.current=!1,o())},onPointerLeave:()=>{c.current&&(c.current=!1,o())},className:Je("flex h-20 w-20 items-center justify-center rounded-full border-2 transition-all select-none touch-none",r?"border-red-500 bg-red-500/20 scale-110 shadow-lg shadow-red-500/30":"border-primary/60 bg-primary/15 hover:bg-primary/25 hover:scale-105"),title:"Gedrückt halten zum Sprechen (oder Leertaste halten)",children:v.jsx(fF,{className:Je("h-8 w-8",r?"text-red-400":"text-primary")})}),v.jsxs("div",{className:"text-[11px] text-muted-foreground",children:["Halten zum Sprechen · ",v.jsx("kbd",{className:"rounded bg-muted px-1 py-0.5 font-mono",children:"Leertaste"})," geht auch"]})]})]}),v.jsxs("div",{className:"flex w-80 shrink-0 flex-col gap-4",children:[v.jsx("div",{className:"rounded-xl border border-border/40 bg-card/40 p-4",children:v.jsx(_Se,{})}),v.jsxs("div",{className:"flex min-h-0 flex-1 flex-col rounded-xl border border-border/40 bg-card/40",children:[v.jsxs("div",{className:"flex items-center justify-between border-b border-border/40 px-4 py-2.5",children:[v.jsx("span",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:"Gespräch"}),v.jsx("button",{onClick:l,className:"text-muted-foreground hover:text-foreground",title:"Neues Gespräch",children:v.jsx(hF,{className:"h-3.5 w-3.5"})})]}),v.jsxs("div",{className:"flex-1 space-y-3 overflow-y-auto p-4 scrollbar-thin",children:[e.length===0&&v.jsx("p",{className:"text-xs text-muted-foreground",children:"Halte den Knopf (oder die Leertaste) und sprich. Hermes hört zu, denkt mit seinem vollen Gedächtnis und seinen Werkzeugen — und antwortet hörbar."}),e.map((y,b)=>v.jsxs("div",{className:Je("flex flex-col gap-1",y.role==="user"?"items-end":"items-start"),children:[v.jsx("span",{className:"px-1 text-[10px] font-semibold uppercase tracking-wide text-muted-foreground",children:y.role==="user"?"Du":"Hermes"}),v.jsx("div",{className:Je("max-w-[88%] whitespace-pre-wrap break-words rounded-2xl px-3 py-2 text-sm leading-relaxed",y.role==="user"?"rounded-br-sm bg-primary/15 text-foreground":"rounded-bl-sm border border-border/40 bg-background/40 text-foreground/90"),children:y.text?NSe(y.text):v.jsx(ISe,{})})]},b)),v.jsx("div",{ref:d})]})]})]})]})}const Oj=[{id:"grundlagen",label:"Grundlagen"},{id:"moe",label:"MoE & Quant"},{id:"lokal",label:"Lokal betreiben"},{id:"modelle",label:"Modell-Landschaft"},{id:"gateway",label:"Gateway-Trick"},{id:"mcp",label:"MCP"},{id:"skills",label:"Skills"},{id:"memory",label:"Gedächtnis & RAG"},{id:"agents",label:"Agenten"},{id:"ide",label:"IDE anbinden"},{id:"tricks",label:"Tricks & Kniffe"},{id:"wartung",label:"Sicherheit & Wartung"},{id:"ressourcen",label:"Ressourcen"},{id:"troubleshooting",label:"Troubleshooting"}];function LSe(t){var e;(e=document.getElementById(t))==null||e.scrollIntoView({behavior:"smooth",block:"start"})}function pa({id:t,icon:e,color:n,title:r,kicker:i,children:s,wide:a}){return v.jsxs("section",{id:t,className:Je("scroll-mt-20 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 shadow-lg shadow-black/10 space-y-3",a&&"md:col-span-2"),children:[v.jsxs("div",{className:"flex items-center gap-2.5 border-b border-border/20 pb-3",children:[v.jsx(e,{className:Je("h-5 w-5 shrink-0",n)}),v.jsxs("div",{children:[v.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:r}),i&&v.jsx("span",{className:Je("text-[9px] font-mono",n),children:i})]})]}),v.jsx("div",{className:"text-xs text-muted-foreground space-y-2.5 leading-relaxed",children:s})]})}function Wf({children:t}){return v.jsxs("div",{className:"mt-1 rounded-xl border border-primary/25 bg-primary/[0.06] p-3 text-[11px] leading-relaxed",children:[v.jsxs("div",{className:"flex items-center gap-1.5 font-bold text-primary mb-1",children:[v.jsx(Vm,{className:"h-3 w-3"})," Bei dir konkret"]}),v.jsx("div",{className:"text-muted-foreground space-y-1",children:t})]})}function hn({children:t}){return v.jsx("code",{className:"rounded bg-background/40 border border-border/30 px-1.5 py-0.5 font-mono text-[10px] text-foreground",children:t})}function Lr({href:t,name:e,note:n}){return v.jsxs("li",{className:"leading-relaxed",children:[v.jsxs("a",{href:t,target:"_blank",rel:"noopener",className:"text-primary hover:underline font-semibold inline-flex items-center gap-0.5",children:[e,v.jsx(E8,{className:"h-3 w-3 opacity-60"})]}),v.jsxs("span",{className:"text-muted-foreground",children:[" — ",n]})]})}function DSe(){const[t,e]=R.useState(!1);return v.jsxs("div",{className:"space-y-7",children:[v.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 shadow-lg shadow-black/10 flex items-start gap-4",children:[v.jsx("div",{className:"h-11 w-11 rounded-xl bg-primary/15 flex items-center justify-center shrink-0",children:v.jsx(CT,{className:"h-6 w-6 text-primary"})}),v.jsxs("div",{className:"space-y-1",children:[v.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Die AI-Bibel"}),v.jsxs("p",{className:"text-sm text-muted-foreground leading-relaxed max-w-2xl",children:["Allgemeines Nachschlagewerk für lokale & agentische AI — Konzepte, Tricks, Kniffe und kuratierte Quellen. ",v.jsx("span",{className:"font-semibold text-foreground",children:"Stand Juni 2026."})," ","Das meiste gilt überall; ",v.jsx("span",{className:"text-primary font-semibold",children:'„Bei dir konkret"'}),"-Kästen zeigen, was dein Stack daraus macht."]})]})]}),v.jsx("div",{className:"sticky top-0 z-10 -mx-1 px-1",children:v.jsx("div",{className:"rounded-xl border border-border/50 bg-card/70 backdrop-blur-xl p-2 shadow-lg shadow-black/20",children:v.jsxs("div",{className:"flex items-center gap-1.5 flex-wrap",children:[v.jsx(RT,{className:"h-3.5 w-3.5 text-primary ml-1 mr-0.5 shrink-0"}),(t?Oj:Oj.slice(0,9)).map(n=>v.jsx("button",{onClick:()=>LSe(n.id),className:"rounded-lg px-2.5 py-1 text-[11px] font-semibold text-muted-foreground hover:text-primary hover:bg-primary/10 transition-colors cursor-pointer",children:n.label},n.id)),v.jsx("button",{onClick:()=>e(n=>!n),className:"rounded-lg px-2 py-1 text-[11px] font-semibold text-primary hover:bg-primary/10 transition-colors cursor-pointer",children:t?"weniger":"+ mehr"})]})})}),v.jsxs("div",{className:"grid gap-5 md:grid-cols-2",children:[v.jsxs(pa,{id:"grundlagen",icon:Md,color:"text-cyan-400",title:"1. Wie LLMs ticken",kicker:"Grundlagen",children:[v.jsxs("p",{children:["Ein LLM ist im Kern ein ",v.jsx("strong",{children:"Wahrscheinlichkeits-Rechner für das nächste Token"}),' (Wortteil). Es „weiß" nichts — es setzt fort, was statistisch am plausibelsten ist. Daraus folgt fast alles andere.']}),v.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[v.jsxs("li",{children:[v.jsx("strong",{children:"Tokens"})," sind die Einheit — ~¾ Wort. Ein- und Ausgabe werden in Tokens gezählt."]}),v.jsxs("li",{children:[v.jsx("strong",{children:"Kontextfenster"}),' = wie viele Tokens das Modell gleichzeitig „sehen" kann (Prompt + Antwort). Voll = Anfang fällt raus.']}),v.jsxs("li",{children:[v.jsx("strong",{children:"Parameter"})," = die trainierten Gewichte. Training ist einmalig, ",v.jsx("strong",{children:"Inferenz"})," ist jede Antwort."]}),v.jsxs("li",{children:[v.jsx("strong",{children:"Temperatur / Sampling"})," steuert Zufall: niedrig = deterministisch/präzise (Code), hoch = kreativ."]}),v.jsxs("li",{children:[v.jsx("strong",{children:"Halluzination"})," ist kein Bug, sondern die Kehrseite des Ratens. Gegenmittel: Grounding via Tools/RAG, Verifikation."]}),v.jsxs("li",{children:[v.jsx("strong",{children:"Reasoning-/Thinking-Modelle"}),' „denken" in unsichtbaren Tokens vor der Antwort — besser bei Logik, langsamer/teurer.']})]})]}),v.jsxs(pa,{id:"moe",icon:_C,color:"text-violet-400",title:"2. MoE & Quantisierung",kicker:"Mehr Modell, weniger Last",children:[v.jsxs("p",{children:[v.jsx("strong",{children:"Mixture of Experts (MoE):"})," Statt für jedes Token das ganze Netz zu aktivieren, wählt ein",v.jsx("em",{children:" Router"})," nur ein paar spezialisierte ",v.jsx("em",{children:"Experts"}),' aus. So läuft ein 100B-Modell mit der aktiven Rechenlast eines viel kleineren (z.B. „122B total / 10B aktiv").']}),v.jsxs("p",{children:[v.jsx("strong",{children:"Quantisierung:"})," Gewichte von FP16 auf weniger Bits eindampfen — kleiner & schneller bei minimalem Qualitätsverlust. Faustregel:"]}),v.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[v.jsxs("li",{children:[v.jsx(hn,{children:"Q8"})," nahezu verlustfrei, größter Footprint"]}),v.jsxs("li",{children:[v.jsx(hn,{children:"Q6_K"})," sehr gut, guter Mittelweg"]}),v.jsxs("li",{children:[v.jsx(hn,{children:"Q4_K_M"})," der Sweet-Spot für lokal — viel Modell pro GB"]})]}),v.jsxs(Wf,{children:["VRAM/RAM ist die harte Grenze — ",v.jsx("strong",{children:"darum"})," ist beides hier zentral: MoE lässt 100B+ überhaupt laufen, Quant entscheidet, was reinpasst. Dein Line-up fährt durchweg ",v.jsx(hn,{children:"Q4_K_M"}),"/",v.jsx(hn,{children:"Q6_K"}),"."]})]}),v.jsxs(pa,{id:"lokal",icon:rw,color:"text-emerald-400",title:"3. Lokal betreiben: Engines & Backends",kicker:"llama.cpp, vLLM & Co.",wide:!0,children:[v.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[v.jsxs("div",{className:"space-y-2",children:[v.jsxs("p",{children:[v.jsx("strong",{children:"Inference-Engines"})," — was die Modelle ausführt:"]}),v.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[v.jsxs("li",{children:[v.jsx("strong",{children:"llama.cpp / GGUF"})," — der De-facto-Standard für lokal, CPU+GPU, läuft überall."]}),v.jsxs("li",{children:[v.jsx("strong",{children:"Ollama / LM Studio"})," — bequeme Wrapper mit One-Click-Downloads (LM Studio mit GUI)."]}),v.jsxs("li",{children:[v.jsx("strong",{children:"vLLM / TGI"})," — Server-Engines für maximalen Durchsatz auf dicken GPUs."]}),v.jsxs("li",{children:[v.jsx("strong",{children:"llama-swap"})," — Proxy, der ",v.jsx("em",{children:"mehrere"})," Modelle hinter ",v.jsx("em",{children:"einem"})," Port hält und je nach Anfrage automatisch ein-/aussattelt."]})]})]}),v.jsxs("div",{className:"space-y-2",children:[v.jsxs("p",{children:[v.jsx("strong",{children:"GPU-Backends"})," — wie gerechnet wird:"]}),v.jsx("ul",{className:"list-disc pl-4 space-y-1",children:v.jsxs("li",{children:[v.jsx(hn,{children:"CUDA"})," NVIDIA · ",v.jsx(hn,{children:"ROCm"})," AMD · ",v.jsx(hn,{children:"Vulkan"})," herstellerübergreifend · ",v.jsx(hn,{children:"Metal"})," Apple"]})}),v.jsxs("p",{className:"pt-1",children:[v.jsx("strong",{children:"Begriffe, die immer wiederkommen:"})," Kontext (",v.jsx(hn,{children:"-c"}),"), Slots/Parallel, KV-Cache, Modell-TTL/Swap, ",v.jsx("strong",{children:"Speculative Decoding"})," (kleines Draft-Modell rät voraus → schneller)."]})]})]}),v.jsxs(Wf,{children:["Deine Box hat eine AMD-APU (gfx1151). ",v.jsx("strong",{children:"Einschränkung & Trick:"})," dort schlägt ",v.jsx(hn,{children:"Vulkan/RADV"})," das offizielle ",v.jsx(hn,{children:"ROCm"})," bei Token-Generierung um ~12–22 % — darum läuft die Engine auf Vulkan.",v.jsx(hn,{children:"llama-swap"})," hält die Alltags-Hirne dauerwarm; ",v.jsx(hn,{children:"coder"})," nutzt Spec-Decoding."]})]}),v.jsxs(pa,{id:"modelle",icon:nw,color:"text-sky-400",title:"4. Modell-Landschaft",kicker:"Stand Juni 2026",wide:!0,children:[v.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[v.jsxs("div",{className:"space-y-2",children:[v.jsx("p",{children:v.jsx("strong",{children:"Open-Weight (lokal nutzbar):"})}),v.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[v.jsxs("li",{children:[v.jsx("strong",{children:"Qwen"})," (Alibaba) — starke Allrounder + Coder + Vision, viele Größen/MoE."]}),v.jsxs("li",{children:[v.jsx("strong",{children:"Llama"})," (Meta), ",v.jsx("strong",{children:"Gemma"})," (Google), ",v.jsx("strong",{children:"Phi"})," (Microsoft) — solide Open-Familien."]}),v.jsxs("li",{children:[v.jsx("strong",{children:"DeepSeek"}),", ",v.jsx("strong",{children:"Mistral/Mixtral"})," — kräftige MoE-/Reasoning-Modelle."]})]})]}),v.jsxs("div",{className:"space-y-2",children:[v.jsx("p",{children:v.jsx("strong",{children:"Frontier (Cloud-API):"})}),v.jsx("ul",{className:"list-disc pl-4 space-y-1",children:v.jsxs("li",{children:[v.jsx("strong",{children:"Claude"})," (Anthropic), ",v.jsx("strong",{children:"GPT"})," (OpenAI), ",v.jsx("strong",{children:"Gemini"})," (Google) — die stärksten Allrounder, aber nicht lokal."]})}),v.jsxs("p",{className:"pt-1",children:[v.jsx("strong",{children:"Modellwahl nach Aufgabe:"})," schnelles Alltags-Hirn · großes Logik-Hirn für harte Tasks · dediziertes Code-Modell · multimodal für Bilder · Embedding-Modell fürs Gedächtnis."]})]})]}),v.jsx("p",{className:"text-[11px] italic",children:'Leaderboards (HF, LMArena) sind grobe Orientierung — der einzige Benchmark, der zählt, ist deine eigene Aufgabe. Vorsicht vor „Benchmaxxing".'}),v.jsxs(Wf,{children:["Dein Line-up via llama-swap: ",v.jsx(hn,{children:"fast"})," (Alltag/Vision/MoE) · ",v.jsx(hn,{children:"heavy"})," (schwere Logik) ·",v.jsx(hn,{children:"coder"})," · ",v.jsx(hn,{children:"scout"})," · ",v.jsx(hn,{children:"vision"})," · ",v.jsx(hn,{children:"embed"})," (fürs Gedächtnis) ·",v.jsx(hn,{children:"hermes"})," (Agent-Hirn). Verwalten/tauschen im ",v.jsx("strong",{children:"Modell-Manager"}),"-Tab."]})]}),v.jsxs(pa,{id:"gateway",icon:e9,color:"text-amber-400",title:"5. Der Gateway-Trick",kicker:"OpenAI-kompatibel = überall andocken",children:[v.jsxs("p",{children:["Fast jedes AI-Tool spricht heute das ",v.jsx("strong",{children:"OpenAI-Format"})," (",v.jsx(hn,{children:"/v1/chat/completions"}),"). Ein",v.jsx("strong",{children:" Gateway"})," davor gibt dir ",v.jsx("em",{children:"einen"})," Endpunkt für alles: zentrales Key-Management, Logging und transparentes ",v.jsx("strong",{children:"Routing"})," — der Client merkt nicht, welches Modell tatsächlich antwortet."]}),v.jsxs("p",{children:["Die ",v.jsx(hn,{children:"model:auto"}),'-Idee: du sagst „auto", das Gateway wählt das passende Modell je nach Anfrage und lädt es bei Bedarf.']}),v.jsxs(Wf,{children:["Dein Gateway: ",v.jsx(hn,{children:"http://192.168.178.151:9001/v1"}),", Model ",v.jsx(hn,{children:"auto"}),", API-Key beliebig. Fertige Configs erzeugt dir der ",v.jsx("strong",{children:"Verbinden"}),"-Tab live — eine Wahrheit, kein Abtippen."]})]}),v.jsxs(pa,{id:"mcp",icon:kT,color:"text-violet-400",title:"6. MCP — Werkzeuge für Agenten",kicker:"USB-C für AI-Tools",children:[v.jsxs("p",{children:["Das ",v.jsx("strong",{children:"Model Context Protocol"})," (offen, von Anthropic initiiert) standardisiert, wie ein AI-Client mit externen Tools & Datenquellen spricht. Ein ",v.jsx("strong",{children:"MCP-Server"})," bringt Fähigkeiten: Dateien, Web-Fetch, Git, Datenbanken, eigene APIs."]}),v.jsx("p",{children:"Statt für jeden Editor eigene Tools zu schreiben, bindet jeder MCP-fähige Agent denselben Server an."}),v.jsxs("div",{className:"flex items-start gap-1.5 rounded-xl border border-amber-500/25 bg-amber-500/[0.06] p-2.5 text-[11px]",children:[v.jsx(Y8,{className:"h-3.5 w-3.5 text-amber-400 shrink-0 mt-0.5"}),v.jsxs("span",{children:[v.jsx("strong",{children:"Sicherheit:"})," ein MCP-Server hat echten Zugriff (Dateien, Shell). Nur vertrauenswürdige Server laufen lassen, Rechte minimal halten, Quelle prüfen."]})]})]}),v.jsxs(pa,{id:"skills",icon:i9,color:"text-emerald-400",title:"7. Agent Skills",kicker:"Wiederverwendbare Fähigkeiten",children:[v.jsxs("p",{children:["Ein ",v.jsx("strong",{children:"Skill"})," ist ein Ordner mit einer ",v.jsx(hn,{children:"SKILL.md"})," (YAML-Kopf + Anleitung, optional Skripte/Beispiele), den der Agent für eine bestimmte Aufgabe lädt — z.B. TDD, Code-Vereinfachung, API-Design."]}),v.jsx("pre",{className:"p-2.5 bg-background/25 rounded-lg border border-border/30 font-mono text-[9px] text-foreground overflow-x-auto whitespace-pre",children:`--- -name: tdd-pro -description: Treibt Entwicklung mit strikter TDD-Praxis ---- -# Instructions -...`}),v.jsxs("p",{children:["Suchen & installieren über die ",v.jsx("strong",{children:"skills.sh"}),"-Registry: ",v.jsx(hn,{children:"npx skills find"})," /",v.jsx(hn,{children:"npx skills add owner/repo"}),". Skills liegen projektweit (vom Agent beim Start gelesen) oder global."]})]}),v.jsxs(pa,{id:"memory",icon:U8,color:"text-indigo-400",title:"8. Gedächtnis & RAG",kicker:"Modelle vergessen — du nicht",wide:!0,children:[v.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[v.jsxs("div",{className:"space-y-2",children:[v.jsxs("p",{children:["LLMs sind ",v.jsx("strong",{children:"zustandslos"}),": ohne Hilfe weiß das Modell beim nächsten Turn nichts mehr. Gedächtnis lebt extern."]}),v.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[v.jsxs("li",{children:[v.jsx("strong",{children:"Embeddings"})," wandeln Text in Vektoren; ein ",v.jsx("strong",{children:"Vektor-Store"})," (Chroma, …) findet semantisch Ähnliches."]}),v.jsxs("li",{children:[v.jsx("strong",{children:"RAG"})," = relevante Fakten vor dem Turn heraussuchen und einblenden statt alles im Prompt zu halten."]}),v.jsxs("li",{children:[v.jsx("strong",{children:"Long-Context vs. RAG:"}),' riesige Fenster sind bequem, aber teuer & „lost in the middle" — gezieltes Abrufen skaliert besser.']})]})]}),v.jsxs("div",{className:"space-y-2",children:[v.jsxs("p",{children:[v.jsx("strong",{children:"Auto-lernendes Gedächtnis"})," ist die nächste Stufe:"]}),v.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[v.jsxs("li",{children:["extrahiert Fakten ",v.jsx("em",{children:"selbst"})," aus Gesprächen, statt nur abzuspeichern"]}),v.jsx("li",{children:"dedupliziert semantisch (kein 10× derselbe Fakt)"}),v.jsxs("li",{children:[v.jsx("strong",{children:"Graph-Sicht"})," = Fakten ",v.jsx("em",{children:"plus"})," ihre Beziehungen, nicht nur eine flache Liste"]})]})]})]}),v.jsxs(Wf,{children:["Dein Gedächtnis (Tab ",v.jsx("strong",{children:"Gedächtnis"}),") ist ",v.jsx("strong",{children:"Mem0"}),"-basiert: auto-lernend & semantisch, ",v.jsx("strong",{children:"graph-first"})," dargestellt, mit 4-Typen-Taxonomie (",v.jsx(hn,{children:"Identität"})," · ",v.jsx(hn,{children:"Wissen"})," · ",v.jsx(hn,{children:"Regeln"})," · ",v.jsx(hn,{children:"Ereignisse"}),"). Einstieg über ein kurzes ",v.jsx("strong",{children:"Hermes-Onboarding-Gespräch"})," im Terminal — der Agent lernt im Hintergrund nach jedem Turn.",v.jsx("br",{}),v.jsx("strong",{children:"Gotcha:"})," ein gelöschter Fakt kann wieder auftauchen, solange die Original-Nachricht noch im Verlauf steht (additive Extraktion)."]})]}),v.jsxs(pa,{id:"agents",icon:$c,color:"text-rose-400",title:"9. Autonome Agenten betreiben",kicker:"LLM in der Schleife",wide:!0,children:[v.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[v.jsxs("div",{className:"space-y-2",children:[v.jsxs("p",{children:["Ein ",v.jsx("strong",{children:"Agent"})," ist ein LLM in einer Schleife mit Tools:",v.jsx("em",{children:" denken → Tool aufrufen → Ergebnis beobachten → weiter"}),", bis das Ziel erreicht ist."]}),v.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[v.jsxs("li",{children:[v.jsx("strong",{children:"Guardrails"})," (Hard-Stop, Tool-Limits) verhindern Endlos-Loops, wenn ein Tool fehlt oder hängt."]}),v.jsxs("li",{children:[v.jsx("strong",{children:"Kontext-Hygiene"})," ist die wichtigste Disziplin: frische Sessions starten — vollgemüllte Historien werden langsam, driften und halluzinieren."]}),v.jsxs("li",{children:[v.jsx("strong",{children:"Kanäle:"})," CLI/Terminal, Chat-UI, Messaging (z.B. Telegram), reine API."]})]})]}),v.jsxs("div",{className:"space-y-2",children:[v.jsxs("p",{children:[v.jsx("strong",{children:"Least Privilege:"})," gib einem Agenten nur die Tools, die er wirklich braucht. Kritische Aktionen (Shell auf dem Host, Löschen, Geld/Deploys) hinter menschliche Freigabe."]}),v.jsxs("p",{children:[v.jsx("strong",{children:"Was sich vollautomatisch lohnt:"})," Modell-Routing, Hintergrund-Gedächtnis, Recherche. ",v.jsx("strong",{children:"Was Freigabe braucht:"})," Systembefehle, Updates/Reboots, permanentes Löschen."]})]})]}),v.jsxs(Wf,{children:[v.jsx("strong",{children:"Hermes"})," ist dein Box-Agent (Hirn = ",v.jsx(hn,{children:"fast"}),"). Reden tust du mit ihm im",v.jsx("strong",{children:" Terminal"}),"-Tab (Web-Terminal via ttyd) oder per ",v.jsx("strong",{children:"Telegram"}),". Er hat MCP-Server für Gedächtnis, Stack-Steuerung, Web-Fetch und ",v.jsx("strong",{children:"PC-Steuerung"})," (Executor auf deinem Windows-PC). Status & Verdrahtung im ",v.jsx("strong",{children:"Hermes"}),"-Tab."]})]}),v.jsxs(pa,{id:"ide",icon:uF,color:"text-cyan-400",title:"10. IDE / Editor anbinden",kicker:"Vibe-Coding lokal",children:[v.jsxs("p",{children:["Jede ",v.jsx("strong",{children:"OpenAI-kompatible"})," IDE oder Extension lässt sich auf einen lokalen Server umbiegen — Base-URL + Model eintragen, fertig:"]}),v.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[v.jsxs("li",{children:[v.jsx("strong",{children:"Cline"})," & ",v.jsx("strong",{children:"Roo Code"})," (VS-Code-Extensions, voller Agent + MCP)"]}),v.jsxs("li",{children:[v.jsx("strong",{children:"Cursor"})," (VS-Code-Fork mit Top-Autocomplete)"]}),v.jsxs("li",{children:[v.jsx("strong",{children:"Continue"}),", ",v.jsx("strong",{children:"aider"})," (CLI), ",v.jsx("strong",{children:"OpenCode"})," (Desktop)"]})]}),v.jsxs(Wf,{children:["Tipp den Kram nicht ab: der ",v.jsx("strong",{children:"Verbinden"}),"-Tab generiert die fertige Config (inkl. MCP-Gedächtnis) pro Tool zum Kopieren. Essenz: Base ",v.jsx(hn,{children:"…:9001/v1"}),", Model ",v.jsx(hn,{children:"auto"}),", Key beliebig."]})]}),v.jsx(pa,{id:"tricks",icon:q8,color:"text-amber-400",title:"11. Tricks & Kniffe",kicker:"Was im Alltag wirklich spart",wide:!0,children:v.jsx("div",{className:"grid md:grid-cols-3 gap-3",children:[["Kontext sauber halten","Neue Session statt Mega-Historie. Drift, Tempo und Halluzination hängen direkt am Kontext-Müll."],["Plan-then-Act","Erst Plan/Vorgehen bestätigen lassen, dann ausführen. Spart teure Holzwege."],["Gezielte Edits","Nie ganze Dateien überschreiben für eine Zeile — Such-/Ersetz-Tools nutzen. Weniger Tokens, weniger Fehler."],["Non-interaktive Befehle","Keine interaktiven Prompts im Agent-Terminal; lange Tasks als Background-Job. Sonst hängt der Loop."],["DevTools koppeln","Browser-/Konsolen-Zugriff geben — der Agent liest echte Fehler statt blind zu raten."],["Richtige Modellwahl","Schnelles Hirn für Alltag, großes für harte Logik, Coder fürs Coden. Nicht alles mit der Kanone."],["Akzeptanzkriterien","Sag konkret, woran „fertig“ erkennbar ist. Vage Prompts → vage Ergebnisse."],["Verifizieren statt vertrauen","Tests/Live-Check fordern. „Sollte funktionieren“ ist kein Beweis."],["Regeln ins Gedächtnis","Wiederkehrende Vorlieben/Konventionen einmal ablegen — der Agent zieht sie selbst."]].map(([n,r])=>v.jsxs("div",{className:"space-y-1 p-3 bg-background/10 rounded-xl border border-border/30",children:[v.jsxs("div",{className:"flex items-center gap-1.5 font-bold text-foreground text-[11px]",children:[v.jsx(wh,{className:"h-3 w-3 text-amber-400"})," ",n]}),v.jsx("p",{className:"text-[11px]",children:r})]},n))})}),v.jsx(pa,{id:"wartung",icon:Ym,color:"text-emerald-400",title:"12. Sicherheit & Wartung",kicker:"Damit's auch morgen noch läuft",wide:!0,children:v.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[v.jsxs("div",{className:"space-y-2",children:[v.jsxs("p",{className:"flex items-center gap-1.5 font-bold text-foreground",children:[v.jsx(dF,{className:"h-3.5 w-3.5 text-emerald-400"})," Goldene Regeln"]}),v.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[v.jsxs("li",{children:[v.jsx("strong",{children:"Ein ungetesteter Restore ist kein Backup."})," Wiederherstellung mindestens einmal echt durchspielen."]}),v.jsxs("li",{children:[v.jsx("strong",{children:"Updates können Dinge still zerschießen"})," — gerade bei AI-Stacks (Embeddings, Provider-Interna). Versionen pinnen, Smoke-Test, Post-Check."]}),v.jsxs("li",{children:[v.jsx("strong",{children:"Least Privilege"})," für Agenten, MCP-Server und PC-Zugriff. Kritisches hinter Freigabe."]})]})]}),v.jsxs("div",{className:"space-y-2",children:[v.jsxs("p",{className:"flex items-center gap-1.5 font-bold text-foreground",children:[v.jsx(wC,{className:"h-3.5 w-3.5 text-emerald-400"})," Bei dir im SystemDrawer"]}),v.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[v.jsxs("li",{children:[v.jsx("strong",{children:"Backup:"})," tägliches Voll-Zustands-Backup, getesteter ",v.jsx(hn,{children:"restore.sh"})," (Doku in ",v.jsx(hn,{children:"docs/BACKUP.md"}),")."]}),v.jsxs("li",{children:[v.jsx("strong",{children:"Updates:"})," git-basierter Update-Check; ",v.jsx("strong",{children:"Hermes-Update-Button"})," mit anschließendem ",v.jsx("strong",{children:"Gehirn-Check"})," (rot, falls das Update das Gedächtnis zerschießt) + Engine-Update."]}),v.jsxs("li",{children:[v.jsx("strong",{children:"Dienste & Gefahrenzone:"})," Restart/Logs pro Dienst, kritische Eingriffe getrennt."]})]}),v.jsx("p",{className:"text-[10px] italic",children:'Erreichbar über das System-Icon → Tab „Wartung".'})]})]})}),v.jsxs("section",{id:"ressourcen",className:"scroll-mt-20 md:col-span-2 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 shadow-lg shadow-black/10 space-y-4",children:[v.jsxs("div",{className:"flex items-center gap-2.5 border-b border-border/20 pb-3",children:[v.jsx(RT,{className:"h-5 w-5 text-primary"}),v.jsxs("div",{children:[v.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"13. Kuratierte Ressourcen & Links"}),v.jsx("span",{className:"text-[9px] font-mono text-primary",children:"Sauber geordnet — die guten Quellen"})]})]}),v.jsxs("div",{className:"grid md:grid-cols-2 gap-5 text-xs",children:[v.jsxs("div",{className:"space-y-2",children:[v.jsxs("div",{className:"font-bold text-foreground flex items-center gap-1.5",children:[v.jsx(nw,{className:"h-3.5 w-3.5 text-sky-400"})," Modelle & Engines"]}),v.jsxs("ul",{className:"list-disc pl-4 space-y-1.5",children:[v.jsx(Lr,{href:"https://huggingface.co/models",name:"Hugging Face",note:"das Repository für offene Modelle (GGUF, Embeddings, Datasets)."}),v.jsx(Lr,{href:"https://github.com/ggml-org/llama.cpp",name:"llama.cpp",note:"die Referenz-Engine für lokale Inferenz."}),v.jsx(Lr,{href:"https://github.com/mostlygeek/llama-swap",name:"llama-swap",note:"mehrere Modelle hinter einem Port, Auto-Swap."}),v.jsx(Lr,{href:"https://ollama.com",name:"Ollama",note:"einfachster Einstieg, One-Command-Modelle."}),v.jsx(Lr,{href:"https://lmstudio.ai",name:"LM Studio",note:"lokale GUI zum Stöbern, Laden & Chatten."}),v.jsx(Lr,{href:"https://github.com/vllm-project/vllm",name:"vLLM",note:"Hochdurchsatz-Serving auf dicken GPUs."})]})]}),v.jsxs("div",{className:"space-y-2",children:[v.jsxs("div",{className:"font-bold text-foreground flex items-center gap-1.5",children:[v.jsx(kT,{className:"h-3.5 w-3.5 text-violet-400"})," MCP & Skills"]}),v.jsxs("ul",{className:"list-disc pl-4 space-y-1.5",children:[v.jsx(Lr,{href:"https://modelcontextprotocol.io",name:"MCP — offizielle Doku",note:"Spezifikation & Einstieg."}),v.jsx(Lr,{href:"https://github.com/modelcontextprotocol/servers",name:"Offizielle MCP-Server",note:"filesystem, git, postgres, fetch & mehr."}),v.jsx(Lr,{href:"https://smithery.ai",name:"Smithery",note:"Registry zum Suchen & Auto-Installieren von MCP-Servern."}),v.jsx(Lr,{href:"https://glama.ai/mcp/servers",name:"Glama MCP Registry",note:"kuratierte Community-Datenbank."}),v.jsx(Lr,{href:"https://skills.sh",name:"skills.sh",note:"Registry & CLI für Agent-Skills."})]})]}),v.jsxs("div",{className:"space-y-2",children:[v.jsxs("div",{className:"font-bold text-foreground flex items-center gap-1.5",children:[v.jsx($c,{className:"h-3.5 w-3.5 text-rose-400"})," Agenten & Frameworks"]}),v.jsxs("ul",{className:"list-disc pl-4 space-y-1.5",children:[v.jsx(Lr,{href:"https://github.com/NousResearch/hermes-agent",name:"Hermes Agent (Nous)",note:"der Agent, der auf deiner Box läuft."}),v.jsx(Lr,{href:"https://docs.claude.com",name:"Anthropic / Claude Docs",note:"API, Tool-Use, Agent SDK, MCP."}),v.jsx(Lr,{href:"https://github.com/cline/cline",name:"Cline",note:"autonomer Coding-Agent für VS Code."}),v.jsx(Lr,{href:"https://aider.chat",name:"aider",note:"AI-Pair-Programming im Terminal, git-nativ."}),v.jsx(Lr,{href:"https://continue.dev",name:"Continue",note:"Open-Source-Autopilot für IDEs."})]})]}),v.jsxs("div",{className:"space-y-2",children:[v.jsxs("div",{className:"font-bold text-foreground flex items-center gap-1.5",children:[v.jsx(CT,{className:"h-3.5 w-3.5 text-amber-400"})," Lernen & Community"]}),v.jsxs("ul",{className:"list-disc pl-4 space-y-1.5",children:[v.jsx(Lr,{href:"https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/overview",name:"Prompt-Engineering (Anthropic)",note:"die beste praktische Anleitung."}),v.jsx(Lr,{href:"https://github.com/anthropics/anthropic-cookbook",name:"Anthropic Cookbook",note:"lauffähige Rezepte für Tools, RAG, Agenten."}),v.jsx(Lr,{href:"https://www.promptingguide.ai",name:"Prompt Engineering Guide",note:"herstellerneutrales Nachschlagewerk."}),v.jsx(Lr,{href:"https://github.com/mem0ai/mem0",name:"Mem0",note:"die auto-lernende Memory-Schicht hinter deinem Gedächtnis."}),v.jsx(Lr,{href:"https://www.reddit.com/r/LocalLLaMA/",name:"r/LocalLLaMA",note:"der Puls der lokalen-LLM-Szene."})]})]})]})]}),v.jsx(pa,{id:"troubleshooting",icon:X8,color:"text-rose-400",title:"14. Troubleshooting",kicker:"Wenn's hakt",wide:!0,children:v.jsxs("ul",{className:"space-y-2 list-disc pl-4",children:[v.jsxs("li",{children:[v.jsx("strong",{children:"Keine Verbindung?"})," Selbes LAN wie die Box? IP/Port stimmen (",v.jsx(hn,{children:":9001"}),")? Backend-Status in der ",v.jsx("strong",{children:"Zentrale"})," prüfen."]}),v.jsxs("li",{children:[v.jsx("strong",{children:"Modell antwortet nicht / langsam?"})," In der ",v.jsx("strong",{children:"Zentrale → Dienste"})," schauen, ob ",v.jsx(hn,{children:"llama-swap"})," grün ist; sonst Restart. Erstes Token nach Swap dauert (Modell lädt)."]}),v.jsxs("li",{children:[v.jsx("strong",{children:"Agent dreht durch / halluziniert?"})," Frische Session im ",v.jsx("strong",{children:"Terminal"})," starten — meist ist es vollgemüllter Kontext."]}),v.jsxs("li",{children:[v.jsx("strong",{children:"Gedächtnis findet nichts?"})," Embedding-Dienst online? Semantisch suchen (Sinn statt exaktem Wort). Leeres Gedächtnis → Hermes-Onboarding starten."]}),v.jsxs("li",{children:[v.jsx("strong",{children:"Update hat etwas zerschossen?"})," Genau dafür gibt es Backup & ",v.jsx(hn,{children:"restore.sh"})," — den getesteten Restore fahren, dann Ursache suchen."]})]})})]}),v.jsx("p",{className:"text-center text-[10px] text-muted-foreground/50 pt-2",children:"Mission Control 2 · AI-Bibel · Stand Juni 2026 — lebendes Dokument, wächst mit dem Stack."})]})}function USe({title:t,hint:e}){return v.jsxs("div",{className:"space-y-4",children:[v.jsxs("div",{children:[v.jsx("h1",{className:"text-xl font-semibold",children:t}),v.jsx("p",{className:"text-sm text-muted-foreground",children:e})]}),v.jsxs("div",{className:"flex flex-col items-center justify-center gap-3 rounded-xl border border-dashed border-border bg-card/50 py-20 text-center",children:[v.jsx(D8,{className:"h-8 w-8 text-muted-foreground"}),v.jsx("div",{className:"text-sm text-muted-foreground",children:"Kommt in einer späteren Phase."})]})]})}const Lj=[{id:"mission-control-2",label:"Mission Control",type:"user",reach:"gateway (integr"},{id:"hermes-gateway",label:"Hermes Gateway",type:"user",reach:"hermes-gateway"},{id:"mem0-service",label:"Mem0 (Gedächtnis)",type:"user",reach:"mem0"},{id:"hermes-terminal",label:"Hermes Terminal",type:"user",reach:"hermes-terminal"},{id:"llama-swap",label:"Llama Swap",type:"system",reach:"llama-swap"}];function j0({icon:t,iconClass:e,name:n,status:r,available:i,busy:s,actionLabel:a,onAction:o}){return v.jsxs("div",{className:Je("flex items-center gap-3 rounded-lg border px-3 py-2",i?"border-amber-500/30 bg-amber-500/5":"border-border/50 bg-background/20"),children:[v.jsx(t,{className:Je("h-4 w-4 shrink-0",e)}),v.jsxs("div",{className:"flex-1 min-w-0",children:[v.jsx("div",{className:"text-xs text-foreground truncate",children:n}),v.jsx("div",{className:Je("text-[10px] truncate",i?"text-amber-400/90":"text-muted-foreground"),children:r})]}),v.jsx("button",{onClick:o,disabled:!i||s,className:Je("text-[11px] font-semibold rounded-lg px-2.5 py-1 transition-colors shrink-0",i?"bg-primary text-primary-foreground hover:opacity-90 cursor-pointer":"border border-border/50 text-muted-foreground/40 cursor-default"),children:s?"…":a})]})}function jSe({label:t,ok:e,system:n,busy:r,onRestart:i,onLogs:s}){return v.jsxs("div",{className:"flex items-center gap-2.5 rounded-lg border border-border/50 bg-background/20 px-3 py-2",children:[v.jsx("span",{className:Je("w-1.5 h-1.5 rounded-full shrink-0",e===!0?"bg-emerald-500":e===!1?"bg-red-500":"bg-muted-foreground/40")}),v.jsxs("span",{className:"flex-1 text-xs text-foreground truncate",children:[t,n&&v.jsx("span",{className:"text-[9px] text-muted-foreground",children:" (root)"})]}),v.jsx("button",{onClick:i,disabled:r,title:"Neu starten",className:"text-muted-foreground hover:text-primary transition-colors disabled:opacity-50",children:v.jsx(Jf,{className:Je("h-3.5 w-3.5",r&&"animate-spin")})}),v.jsx("button",{onClick:s,title:"Logs ansehen",className:"text-muted-foreground hover:text-primary transition-colors",children:v.jsx(j8,{className:"h-3.5 w-3.5"})})]})}function pT(t){return t==null?"":t>1024**3?`${(t/1024**3).toFixed(2)} GB`:`${(t/1024**2).toFixed(1)} MB`}function FSe({open:t,onClose:e,defaultTab:n="maintenance"}){var Ke;const[r,i]=R.useState(null),[s,a]=R.useState([]),[o,l]=R.useState("llama-swap"),[c,d]=R.useState(""),[f,p]=R.useState(!1),[y,b]=R.useState(null),[S,w]=R.useState({}),[x,M]=R.useState("maintenance"),[T,P]=R.useState(!1),[O,N]=R.useState(""),[D,z]=R.useState(!1),[V,k]=R.useState(null),[j,X]=R.useState([]),[ee,ie]=R.useState(!1),[pe,ae]=R.useState(null),[he,B]=R.useState(null);function J(te,tt,Mt){B({type:"alert",title:te,message:tt,onConfirm:()=>{B(null),Mt&&Mt()}})}function Y(te,tt,Mt){B({type:"confirm",title:te,message:tt,onConfirm:()=>{B(null),Mt()},onCancel:()=>B(null)})}function H(te){return te?new Date(te*1e3).toLocaleString("de-DE",{day:"2-digit",month:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}):"Nie"}const[G,le]=R.useState(""),[se,ce]=R.useState(""),[Se,we]=R.useState(!1),[We,Ee]=R.useState(!1);R.useEffect(()=>{t&&(le(localStorage.getItem("mc_sudo_password")||""),ce(localStorage.getItem("mc_hf_token")||""))},[t]),R.useEffect(()=>{t&&n&&M(n)},[t,n]);const Ge=R.useRef(null);function $e(){It("/api/maintenance/updates").then(i).catch(te=>console.error("Error loading updates",te))}function de(){It("/api/jobs").then(te=>a(te.jobs||[])).catch(te=>console.error("Error loading jobs",te))}function Z(){It("/api/system/services").then(k).catch(()=>{})}function Ve(){It("/api/system/backups").then(te=>X(te.backups||[])).catch(()=>{})}function Le(te){p(!0),b(null),It(`/api/maintenance/logs?service=${te}&lines=150`).then(tt=>{tt.ok?d(tt.text):(d(`Fehler beim Laden der Logs: ${tt.err||"Unbekannter Fehler"}`),(tt.status==="incorrect_password"||tt.status==="password_required")&&b(tt.status))}).catch(tt=>d(`Fehler: ${tt.message}`)).finally(()=>{p(!1),setTimeout(()=>{Ge.current&&(Ge.current.scrollTop=Ge.current.scrollHeight)},50)})}R.useEffect(()=>{if(!t)return;$e(),de(),Z(),Ve();const te=setInterval(()=>{de(),$e(),Z()},3e3);return()=>clearInterval(te)},[t]),R.useEffect(()=>{!t||x!=="logs"||Le(o)},[t,x,o]);function ne(te){return(te==null?void 0:te.status)==="busy"?(J("Update läuft bereits",`Es läuft gerade „${te.running}". Bitte warte, bis es fertig ist.`),de(),!0):!1}async function Ce(){try{const te=await It("/api/maintenance/os-update",{method:"POST"});if(ne(te))return;de(),M("maintenance")}catch(te){J("Fehler",`Fehler beim Starten des OS-Updates: ${te.message}`)}}async function Xe(){try{const te=await It("/api/maintenance/engine-update",{method:"POST"});if(ne(te))return;de(),M("maintenance")}catch(te){J("Fehler",`Fehler beim Engine-Update: ${te.message}`)}}async function Ze(){try{const te=await It("/api/maintenance/swap-update",{method:"POST"});if(ne(te))return;de(),M("maintenance")}catch(te){J("Fehler",`Fehler beim Router-Update: ${te.message}`)}}async function Q(){ie(!0);try{const te=await It("/api/maintenance/hermes-update",{method:"POST"});if(ne(te))return;de()}catch(te){J("Fehler",`Hermes-Update fehlgeschlagen: ${te.message}`)}finally{ie(!1)}}async function W(te){ae({kind:te,loading:!0,data:null});try{const tt=await It(`/api/maintenance/update-details?kind=${te}`);ae({kind:te,loading:!1,data:tt})}catch(tt){ae({kind:te,loading:!1,data:{kind:te,error:tt.message}})}}function be(){const te=pe==null?void 0:pe.kind;ae(null),te==="os"?Ce():te==="engine"?Xe():te==="swap"?Ze():te==="hermes"&&Q()}async function Ue(){P(!0);try{await It("/api/maintenance/check-updates",{method:"POST"}),de(),M("maintenance")}catch(te){J("Fehler",`Fehler bei der Update-Suche: ${te.message}`)}finally{P(!1)}}async function ze(te,tt){try{await It("/api/models/install",{method:"POST",body:JSON.stringify({repo:te,role:tt})}),J("Gestartet",`Modell-Upgrade für '${tt}' (${te}) gestartet.`),de(),M("maintenance")}catch(Mt){J("Fehler",`Fehler beim Starten des Modell-Upgrades: ${Mt.message}`)}}async function Fe(){Y("Reboot bestätigen","Bist du sicher, dass du das gesamte Host-System neu starten willst?",async()=>{try{await It("/api/maintenance/reboot",{method:"POST"}),J("Reboot","Reboot ausgelöst. System startet neu...",()=>{e()})}catch(te){J("Fehler",`Fehler beim Reboot: ${te.message}`)}})}async function bt(){z(!0),N("Snapshot wird erzeugt...");try{const te=await It("/api/system/backup",{method:"POST"});N(te.ok?`Snapshot erzeugt: ${te.snapshot} (${te.files.length} Komponenten)`:"Backup fehlgeschlagen."),Ve()}catch(te){N(`Fehler: ${te.message}`)}finally{z(!1)}}async function rt(te){w(tt=>({...tt,[te]:!0}));try{const tt=await It("/api/maintenance/restart",{method:"POST",body:JSON.stringify({service:te})});tt.ok?J("Dienst neu gestartet",`Dienst ${te} wurde erfolgreich neu gestartet.`,()=>{x==="logs"&&o===te&&Le(te)}):J("Fehler",`Fehler beim Neustart: ${tt.err||"Unbekannter Fehler"}`)}catch(tt){J("Fehler",`Fehler beim Neustart: ${tt.message}`)}finally{w(tt=>({...tt,[te]:!1}))}}async function ht(te){try{await It(`/api/jobs/${te}/cancel`,{method:"POST"}),de()}catch(tt){J("Fehler",`Fehler beim Abbrechen: ${tt.message}`)}}const Xt=s.find(te=>(te.state==="running"||te.state==="queued")&&te.group==="maintenance");return v.jsxs(v.Fragment,{children:[v.jsx("div",{className:Je("fixed inset-0 bg-black/60 backdrop-blur-sm z-50 transition-opacity duration-300",t?"opacity-100 pointer-events-auto":"opacity-0 pointer-events-none"),onClick:e}),v.jsxs("div",{className:Je("fixed inset-y-0 right-0 w-full sm:w-[640px] bg-card/85 backdrop-blur-xl border-l border-border/60 shadow-2xl z-50 flex flex-col transform transition-transform duration-300 ease-in-out font-sans text-foreground",t?"translate-x-0":"translate-x-full"),children:[v.jsxs("div",{className:"flex h-16 shrink-0 items-center justify-between border-b border-border/40 px-6",children:[v.jsxs("div",{className:"flex items-center gap-2",children:[v.jsx(Md,{className:"h-4.5 w-4.5 text-primary"}),v.jsx("h2",{className:"text-sm font-semibold tracking-wide uppercase font-space",children:"OS-Zentrale & Pflege"})]}),v.jsx("button",{onClick:e,className:"flex h-8 w-8 items-center justify-center rounded-lg border border-border/40 text-muted-foreground hover:bg-accent transition-colors",children:v.jsx(Ed,{className:"h-4 w-4"})})]}),v.jsxs("div",{className:"flex border-b border-border/40 px-6",children:[v.jsx("button",{onClick:()=>M("maintenance"),className:Je("flex-1 py-3 text-xs font-semibold uppercase tracking-wider border-b-2 text-center transition-all",x==="maintenance"?"border-primary text-primary":"border-transparent text-muted-foreground hover:text-foreground"),children:"System-Wartung"}),v.jsx("button",{onClick:()=>M("logs"),className:Je("flex-1 py-3 text-xs font-semibold uppercase tracking-wider border-b-2 text-center transition-all",x==="logs"?"border-primary text-primary":"border-transparent text-muted-foreground hover:text-foreground"),children:"System-Logs"}),v.jsx("button",{onClick:()=>M("settings"),className:Je("flex-1 py-3 text-xs font-semibold uppercase tracking-wider border-b-2 text-center transition-all",x==="settings"?"border-primary text-primary":"border-transparent text-muted-foreground hover:text-foreground"),children:"Einstellungen"})]}),v.jsxs("div",{className:"flex-1 overflow-y-auto p-6 space-y-6",children:[x==="maintenance"&&v.jsxs(v.Fragment,{children:[v.jsxs("div",{className:"space-y-2.5",children:[v.jsxs("div",{className:"flex items-center justify-between",children:[v.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Updates"}),v.jsxs("button",{onClick:Ue,disabled:T||!!Xt,className:"flex items-center gap-1 text-[10px] font-semibold text-primary hover:text-primary/80 transition-colors disabled:opacity-50",children:[v.jsx(Jf,{className:Je("h-3 w-3",T&&"animate-spin")})," Nach Updates suchen"]})]}),(r==null?void 0:r.last_check)&&v.jsxs("div",{className:"text-[9px] text-muted-foreground -mt-1",children:["Zuletzt gesucht: ",H(r.last_check)]}),Xt&&v.jsxs("div",{className:"flex items-center gap-2 rounded-lg border border-amber-500/30 bg-amber-500/10 px-3 py-2 text-[11px] text-amber-300",children:[v.jsx(Jf,{className:"h-3.5 w-3.5 shrink-0 animate-spin"}),v.jsxs("span",{children:["Update läuft: ",v.jsx("span",{className:"font-semibold",children:Xt.label})," — bitte warten. Weitere Updates sind solange gesperrt."]})]}),v.jsxs("div",{className:"space-y-1.5",children:[v.jsx(j0,{icon:Ym,iconClass:"text-cyan-400",name:"OS-Pakete (apt)",available:!!(r!=null&&r.os),status:r!=null&&r.os?`${r.os} verfügbar`:"aktuell",actionLabel:"Anzeigen",onAction:()=>W("os")}),v.jsx(j0,{icon:rw,iconClass:"text-violet-400",name:"Inferenz-Engine (llama.cpp)",available:!!(r!=null&&r.engine),status:r!=null&&r.engine?"Update verfügbar":"aktuell",actionLabel:"Anzeigen",onAction:()=>W("engine")}),v.jsx(j0,{icon:cI,iconClass:"text-fuchsia-400",name:"Router (llama-swap)",available:!!(r!=null&&r.swap),status:r!=null&&r.swap?"Update verfügbar":"aktuell",actionLabel:"Anzeigen",onAction:()=>W("swap")}),(()=>{var tt;const te=(tt=r==null?void 0:r.components)==null?void 0:tt.find(Mt=>Mt.key==="hermes_agent");return v.jsx(j0,{icon:$c,iconClass:"text-amber-400",name:"Hermes-Agent",available:(te==null?void 0:te.update)===!0,busy:ee,status:(te==null?void 0:te.update)===!0?`Update: ${te.latest}`:(te==null?void 0:te.reachable)===!1?"offline":"aktuell",actionLabel:"Anzeigen",onAction:()=>W("hermes")})})(),(Ke=r==null?void 0:r.model_list)==null?void 0:Ke.map(te=>v.jsx(j0,{icon:A8,iconClass:"text-emerald-400",name:`Modell · ${te.role}`,available:!0,status:te.title,actionLabel:"Upgrade",onAction:()=>ze(te.repo,te.role)},te.role))]})]}),v.jsxs("div",{className:"space-y-2.5",children:[v.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Dienste"}),v.jsx("div",{className:"space-y-1.5",children:Lj.map(te=>{var tt;return v.jsx(jSe,{label:te.label,system:te.type==="system",ok:(tt=V==null?void 0:V.services.find(Mt=>Mt.name.toLowerCase().includes(te.reach)))==null?void 0:tt.ok,busy:S[te.id],onRestart:()=>rt(te.id),onLogs:()=>{l(te.id),M("logs")}},te.id)})})]}),v.jsxs("div",{className:"space-y-2.5",children:[v.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Backup"}),v.jsxs("div",{className:"rounded-lg border border-border/50 bg-background/20 px-3 py-2.5 flex items-center gap-3",children:[v.jsxs("div",{className:"flex-1 min-w-0",children:[v.jsx("div",{className:"text-xs text-foreground truncate",children:j[0]?`Letztes: ${j[0].snapshot}`:"Noch kein Backup"}),v.jsxs("div",{className:"text-[10px] text-muted-foreground",children:[j.length," Snapshots · Restore per CLI (restore.sh)"]})]}),v.jsxs("button",{onClick:bt,disabled:D,className:"flex items-center gap-1.5 text-[11px] font-semibold rounded-lg px-2.5 py-1 bg-primary text-primary-foreground hover:opacity-90 transition-all cursor-pointer disabled:opacity-50 shrink-0",children:[v.jsx(P8,{className:Je("h-3.5 w-3.5",D&&"animate-pulse")})," Snapshot"]})]}),O&&v.jsx("div",{className:"text-[10px] font-mono text-primary bg-primary/5 p-2 rounded-lg border border-primary/20 break-all leading-normal",children:O})]}),v.jsxs("div",{className:"space-y-2.5",children:[v.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-red-400/80",children:"Gefahrenzone"}),v.jsxs("button",{onClick:Fe,className:"flex w-full items-center gap-3 p-3 rounded-lg border border-red-500/20 bg-red-500/5 hover:bg-red-500/10 text-red-400 transition-all text-left text-xs font-semibold",children:[v.jsx(r9,{className:"h-4.5 w-4.5"}),v.jsxs("div",{children:[v.jsx("div",{children:"Host-System neu starten"}),v.jsx("div",{className:"text-[10px] text-red-400/80 font-normal",children:"Startet die ganze Box neu"})]})]})]}),v.jsxs("div",{className:"space-y-3",children:[v.jsxs("div",{className:"flex items-center justify-between",children:[v.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Hintergrund-Aufgaben"}),v.jsxs("span",{className:"text-[10px] font-mono bg-primary/10 text-primary px-1.5 py-0.5 rounded-full",children:[s.filter(te=>te.state==="running"||te.state==="queued").length," Aktiv"]})]}),v.jsx("div",{className:"space-y-3",children:s.length===0?v.jsx("div",{className:"text-xs text-muted-foreground border border-dashed border-border/60 rounded-xl p-6 text-center",children:"Aktuell keine aktiven Hintergrund-Jobs."}):s.map(te=>{const tt=te.state==="running"||te.state==="queued";return v.jsxs("div",{className:Je("p-3 rounded-xl border transition-all duration-300",tt?"border-primary/40 bg-primary/5 shadow-md shadow-primary/5":"border-border/40 bg-background/20 opacity-80"),children:[v.jsxs("div",{className:"flex items-start justify-between gap-3",children:[v.jsxs("div",{className:"space-y-1",children:[v.jsxs("div",{className:"text-xs font-semibold flex items-center gap-1.5",children:[tt&&v.jsxs("span",{className:"flex h-2 w-2 relative",children:[v.jsx("span",{className:"animate-ping absolute inline-flex h-full w-full rounded-full bg-primary opacity-75"}),v.jsx("span",{className:"relative inline-flex rounded-full h-2 w-2 bg-primary"})]}),te.label]}),v.jsxs("div",{className:"text-[10px] font-mono text-muted-foreground uppercase flex items-center gap-2",children:[v.jsxs("span",{children:["ID: ",te.id]}),v.jsx("span",{children:"•"}),v.jsx("span",{className:Je(te.state==="done"&&"text-emerald-400",te.state==="failed"&&"text-red-400",te.state==="running"&&"text-primary",te.state==="queued"&&"text-amber-400",te.state==="canceled"&&"text-muted-foreground"),children:te.state})]})]}),tt&&v.jsx("button",{onClick:()=>ht(te.id),className:"text-[10px] font-semibold text-red-400 hover:text-red-300 border border-red-500/20 bg-red-500/5 hover:bg-red-500/10 px-2 py-0.5 rounded transition-colors",children:"Abbrechen"})]}),te.state==="running"&&v.jsxs("div",{className:"mt-3 space-y-1",children:[v.jsx("div",{className:"w-full h-1.5 bg-muted rounded-full overflow-hidden",children:v.jsx("div",{className:"h-full bg-primary transition-all duration-500",style:{width:`${te.progress??0}%`}})}),v.jsxs("div",{className:"flex justify-between items-center text-[9px] font-mono text-muted-foreground",children:[v.jsxs("span",{children:[te.progress??0,"%"]}),te.done_bytes!=null&&te.total_bytes!=null&&v.jsxs("span",{children:[pT(te.done_bytes)," / ",pT(te.total_bytes),te.rate_bps!=null&&` (${pT(te.rate_bps)}/s)`]}),te.eta_s!=null&&v.jsxs("span",{children:["ETA: ",te.eta_s,"s"]})]})]})]},te.id)})})]})]}),x==="logs"&&v.jsxs("div",{className:"flex flex-col h-full space-y-4",children:[v.jsxs("div",{className:"flex items-center gap-2",children:[v.jsx("select",{value:o,onChange:te=>l(te.target.value),className:"flex-1 h-9 px-3 text-xs bg-background/40 border border-border/60 rounded-lg outline-none text-foreground font-semibold",children:Lj.map(te=>v.jsxs("option",{value:te.id,children:[te.label," (",te.type==="system"?"systemd-root":"user",")"]},te.id))}),v.jsxs("button",{onClick:()=>rt(o),disabled:S[o],className:"flex h-9 px-3 items-center gap-1.5 text-xs font-semibold rounded-lg border border-border/60 bg-background/20 hover:border-primary/50 transition-colors disabled:opacity-50",title:"Dienst neu starten",children:[v.jsx(Jf,{className:Je("h-3.5 w-3.5",S[o]&&"animate-spin")}),"Restart"]})]}),v.jsxs("div",{className:"flex-1 flex flex-col min-h-[300px] border border-border/60 bg-black/50 rounded-xl overflow-hidden shadow-inner",children:[v.jsxs("div",{className:"flex h-9 items-center justify-between px-4 border-b border-border/40 bg-black/30 shrink-0",children:[v.jsxs("div",{className:"flex items-center gap-1.5 text-[10px] font-mono text-muted-foreground",children:[v.jsx(gF,{className:"h-3 w-3 text-primary"}),v.jsxs("span",{children:["stdout/stderr - ",o]})]}),v.jsx("button",{onClick:()=>Le(o),disabled:f,className:"text-muted-foreground hover:text-foreground transition-colors",children:v.jsx(Jf,{className:Je("h-3 w-3",f&&"animate-spin")})})]}),v.jsx("pre",{ref:Ge,className:"flex-1 p-4 overflow-y-auto text-[10px] font-mono text-cyan-300/90 whitespace-pre-wrap select-text leading-relaxed scrollbar-thin",children:y==="password_required"||y==="incorrect_password"?v.jsxs("div",{className:"flex flex-col items-center justify-center p-6 text-center h-full space-y-3",children:[v.jsx(bg,{className:"h-8 w-8 text-amber-400 animate-pulse animate-duration-1000"}),v.jsx("div",{className:"text-xs font-semibold text-amber-300",children:y==="incorrect_password"?"Falsches Sudo-Passwort hinterlegt.":"Sudo-Passwort für systemd-Dienste erforderlich."}),v.jsxs("p",{className:"text-[10px] text-muted-foreground max-w-xs leading-normal",children:["Für das Auslesen der systemd-Logs von ",o," werden Root-Rechte benötigt. Hinterlege dein Passwort in den Einstellungen."]}),v.jsx("button",{onClick:()=>M("settings"),className:"px-3 py-1.5 text-[10px] font-semibold text-primary-foreground bg-primary hover:bg-primary/95 rounded-md transition-colors mt-2",children:"Sudo-Passwort eintragen"})]}):f&&!c?v.jsx("span",{className:"text-muted-foreground",children:"Lade Logs..."}):c||v.jsx("span",{className:"text-muted-foreground",children:"Keine Logeinträge vorhanden."})})]})]}),x==="settings"&&v.jsxs("div",{className:"space-y-6",children:[v.jsxs("div",{className:"space-y-2",children:[v.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Zugangsdaten & Schlüssel"}),v.jsx("p",{className:"text-[10px] text-muted-foreground leading-normal",children:"Diese Daten werden ausschließlich lokal in deinem Browser (localStorage) gespeichert und bei Bedarf an das Backend übertragen."})]}),v.jsxs("div",{className:"space-y-2",children:[v.jsxs("label",{className:"text-xs font-semibold flex items-center gap-1.5",children:[v.jsx(Ym,{className:"h-4 w-4 text-amber-400"}),"Host Sudo-Passwort"]}),v.jsxs("div",{className:"relative",children:[v.jsx("input",{type:Se?"text":"password",value:G,onChange:te=>le(te.target.value),"aria-label":"Host Sudo-Passwort",name:"sudo-password",autoComplete:"off",spellCheck:!1,placeholder:"Sudo-Passwort für System-Operationen",className:"w-full h-10 pl-3 pr-10 text-xs bg-background/40 border border-border/60 rounded-lg outline-none focus:border-primary transition-colors text-foreground"}),v.jsx("button",{type:"button",onClick:()=>we(!Se),"aria-label":Se?"Passwort verbergen":"Passwort anzeigen",className:"absolute inset-y-0 right-0 flex items-center pr-3 text-muted-foreground hover:text-foreground transition-colors",children:Se?v.jsx(aI,{className:"h-4 w-4","aria-hidden":"true"}):v.jsx(IT,{className:"h-4 w-4","aria-hidden":"true"})})]}),v.jsx("p",{className:"text-[9px] text-muted-foreground leading-normal",children:"Wird benötigt für systemd-Dienste (Llama Swap logs/restart), OS-Update (apt) und Reboot."})]}),v.jsxs("div",{className:"space-y-2",children:[v.jsxs("label",{className:"text-xs font-semibold flex items-center gap-1.5",children:[v.jsx(G8,{className:"h-4 w-4 text-violet-400"}),"HuggingFace API Token"]}),v.jsxs("div",{className:"relative",children:[v.jsx("input",{type:We?"text":"password",value:se,onChange:te=>ce(te.target.value),"aria-label":"HuggingFace API Token",name:"hf-token",autoComplete:"off",spellCheck:!1,placeholder:"hf_…",className:"w-full h-10 pl-3 pr-10 text-xs bg-background/40 border border-border/60 rounded-lg outline-none focus:border-primary transition-colors text-foreground"}),v.jsx("button",{type:"button",onClick:()=>Ee(!We),"aria-label":We?"Token verbergen":"Token anzeigen",className:"absolute inset-y-0 right-0 flex items-center pr-3 text-muted-foreground hover:text-foreground transition-colors",children:We?v.jsx(aI,{className:"h-4 w-4","aria-hidden":"true"}):v.jsx(IT,{className:"h-4 w-4","aria-hidden":"true"})})]}),v.jsx("p",{className:"text-[9px] text-muted-foreground leading-normal",children:"Erlaubt das Herunterladen von geschützten oder Gate-restricted Modellen direkt über Mission Control."})]}),v.jsxs("div",{className:"flex gap-3 pt-2",children:[v.jsx("button",{onClick:()=>{localStorage.setItem("mc_sudo_password",G),localStorage.setItem("mc_hf_token",se),J("Erfolgreich","Einstellungen erfolgreich lokal gespeichert.")},className:"flex-1 h-9 flex items-center justify-center text-xs font-semibold text-primary-foreground bg-primary hover:bg-primary/90 rounded-lg transition-colors shadow shadow-primary/10 cursor-pointer",children:"Speichern"}),v.jsx("button",{onClick:()=>{le(""),ce(""),localStorage.removeItem("mc_sudo_password"),localStorage.removeItem("mc_hf_token"),J("Gelöscht","Zugangsdaten gelöscht.")},className:"h-9 px-4 flex items-center justify-center text-xs font-semibold text-muted-foreground border border-border/60 bg-background/20 hover:bg-accent rounded-lg transition-colors cursor-pointer",children:"Zurücksetzen"})]})]})]})]}),pe&&(()=>{var Zt;const te=pe.data,tt={os:{icon:Ym,cls:"text-cyan-400",title:"OS-Pakete (apt)"},engine:{icon:rw,cls:"text-violet-400",title:"Inferenz-Engine (llama.cpp)"},swap:{icon:cI,cls:"text-fuchsia-400",title:"Router (llama-swap)"},hermes:{icon:$c,cls:"text-amber-400",title:"Hermes-Agent"}}[pe.kind],Mt=tt.icon,vt=te?pe.kind==="os"?(te.count??0)===0:pe.kind==="hermes"?(te.behind??0)===0:te.installed_build!=null&&te.latest_build!=null&&te.latest_build<=te.installed_build:!0;return v.jsxs("div",{className:"fixed inset-0 z-[60] flex items-center justify-center p-4",children:[v.jsx("div",{className:"absolute inset-0 bg-black/70 backdrop-blur-sm",onClick:()=>ae(null)}),v.jsxs("div",{className:"relative w-full max-w-lg max-h-[80vh] flex flex-col rounded-2xl border border-border/60 bg-card shadow-2xl font-sans text-foreground",children:[v.jsxs("div",{className:"flex h-14 shrink-0 items-center justify-between border-b border-border/40 px-5",children:[v.jsxs("div",{className:"flex items-center gap-2",children:[v.jsx(Mt,{className:Je("h-4.5 w-4.5",tt.cls)}),v.jsx("h3",{className:"text-sm font-semibold",children:tt.title})]}),v.jsx("button",{onClick:()=>ae(null),className:"flex h-7 w-7 items-center justify-center rounded-lg border border-border/40 text-muted-foreground hover:bg-accent transition-colors",children:v.jsx(Ed,{className:"h-4 w-4"})})]}),v.jsx("div",{className:"flex-1 overflow-y-auto p-5 text-xs space-y-3 scrollbar-thin",children:pe.loading?v.jsxs("div",{className:"flex h-24 items-center justify-center gap-2 text-muted-foreground",children:[v.jsx(Jf,{className:"h-4 w-4 animate-spin"})," Details werden geladen…"]}):te!=null&&te.error?v.jsx("div",{className:"rounded-lg border border-red-500/30 bg-red-500/5 p-3 text-red-400",children:te.error}):pe.kind==="os"?((te==null?void 0:te.count)??0)===0?v.jsx("div",{className:"text-muted-foreground",children:"Keine Pakete zu aktualisieren — System ist aktuell."}):v.jsxs(v.Fragment,{children:[v.jsxs("div",{className:"text-muted-foreground",children:[te.count," Paket(e) werden aktualisiert:"]}),v.jsx("div",{className:"space-y-1",children:te.packages.map(fe=>v.jsxs("div",{className:"flex items-center justify-between gap-2 rounded-md border border-border/40 bg-background/30 px-2.5 py-1.5",children:[v.jsxs("span",{className:"flex items-center gap-1.5 font-mono text-[11px] truncate",children:[v.jsx(t9,{className:"h-3 w-3 text-cyan-400 shrink-0"}),fe.name]}),v.jsxs("span",{className:"flex items-center gap-1 font-mono text-[10px] text-muted-foreground shrink-0",children:[v.jsx("span",{children:fe.current}),v.jsx(tw,{className:"h-3 w-3"}),v.jsx("span",{className:"text-emerald-400",children:fe.candidate})]})]},fe.name))})]}):pe.kind==="engine"||pe.kind==="swap"?v.jsxs(v.Fragment,{children:[v.jsxs("div",{className:"flex items-center gap-2 font-mono text-[11px]",children:[v.jsxs("span",{className:"rounded-md border border-border/40 bg-background/30 px-2 py-1",children:["Build ",(te==null?void 0:te.installed_build)??"?"]}),v.jsx(tw,{className:"h-3.5 w-3.5 text-muted-foreground"}),v.jsxs("span",{className:"rounded-md border border-emerald-500/30 bg-emerald-500/5 px-2 py-1 text-emerald-400",children:["Build ",(te==null?void 0:te.latest_build)??"?"]})]}),((te==null?void 0:te.name)||(te==null?void 0:te.latest_tag))&&v.jsxs("div",{className:"text-muted-foreground",children:["Release: ",v.jsx("span",{className:"text-foreground",children:te==null?void 0:te.name}),te!=null&&te.latest_tag?` (${te.latest_tag})`:""]}),(te==null?void 0:te.url)&&v.jsxs("a",{href:te.url,target:"_blank",rel:"noreferrer",className:"inline-flex items-center gap-1 text-primary hover:underline",children:["Release-Notes auf GitHub ",v.jsx(xg,{className:"h-3 w-3"})]}),(te==null?void 0:te.body)&&v.jsx("pre",{className:"whitespace-pre-wrap rounded-lg border border-border/40 bg-background/30 p-3 text-[10px] leading-relaxed text-muted-foreground max-h-60 overflow-y-auto scrollbar-thin",children:te.body})]}):(((Zt=te==null?void 0:te.commits)==null?void 0:Zt.length)??0)===0?v.jsx("div",{className:"text-muted-foreground",children:"Keine neuen Commits — Hermes-Agent ist bereits aktuell."}):v.jsxs(v.Fragment,{children:[v.jsxs("div",{className:"text-muted-foreground",children:[te.behind," neue Commit(s) auf ",v.jsxs("span",{className:"font-mono text-foreground",children:["origin/",te.branch]}),":"]}),v.jsx("div",{className:"space-y-1",children:te.commits.map(fe=>v.jsxs("div",{className:"flex items-start gap-2 rounded-md border border-border/40 bg-background/30 px-2.5 py-1.5",children:[v.jsx(B8,{className:"h-3.5 w-3.5 text-primary shrink-0 mt-0.5"}),v.jsxs("div",{className:"min-w-0",children:[v.jsx("div",{className:"text-[11px] truncate",children:fe.subject}),v.jsxs("div",{className:"font-mono text-[9px] text-muted-foreground",children:[fe.hash," · ",fe.when]})]})]},fe.hash))}),v.jsx("p",{className:"text-[10px] text-muted-foreground leading-normal",children:"Vor dem Update wird automatisch ein Backup erstellt; danach startet der Hermes-Gateway neu."})]})}),v.jsxs("div",{className:"flex gap-3 border-t border-border/40 p-4 shrink-0",children:[v.jsx("button",{onClick:()=>ae(null),className:"h-9 flex-1 rounded-lg border border-border/60 bg-background/20 text-xs font-semibold text-muted-foreground hover:bg-accent transition-colors cursor-pointer",children:"Schließen"}),v.jsx("button",{onClick:be,disabled:pe.loading||vt||!!Xt,title:Xt?`Update läuft bereits: ${Xt.label}`:void 0,className:"h-9 flex-1 rounded-lg bg-primary text-xs font-semibold text-primary-foreground hover:opacity-90 transition-all cursor-pointer disabled:opacity-40 disabled:cursor-default",children:Xt?"Update läuft…":"Jetzt aktualisieren"})]})]})]})})(),he&&v.jsx(gV,{type:he.type,title:he.title,message:he.message,onConfirm:he.onConfirm,onCancel:he.onCancel})]})}function zSe(){var p,y,b,S,w;j7();const[t,e]=R.useState(()=>{const x=window.location.hash.slice(1);return z0.some(M=>M.id===x)?x:"dashboard"}),n=R.useCallback(x=>{window.location.hash.slice(1)===x?e(x):window.location.hash=x},[]),[r,i]=R.useState(()=>localStorage.getItem("mc_sidebar_collapsed")==="true"),[s,a]=R.useState(!1),[o,l]=R.useState("maintenance"),{data:c}=S7(),{data:d}=$y(2e4);R.useEffect(()=>{document.documentElement.classList.add("dark")},[]),R.useEffect(()=>{const x=M=>{var P;l(((P=M.detail)==null?void 0:P.tab)||"maintenance"),a(!0)};return window.addEventListener("open-system-drawer",x),()=>window.removeEventListener("open-system-drawer",x)},[]),R.useEffect(()=>{const x=M=>{var P;const T=(P=M.detail)==null?void 0:P.view;T&&n(T)};return window.addEventListener("mc-navigate",x),()=>window.removeEventListener("mc-navigate",x)},[n]),R.useEffect(()=>{const x=()=>{const M=window.location.hash.slice(1);z0.some(T=>T.id===M)&&e(M)};return window.addEventListener("hashchange",x),()=>window.removeEventListener("hashchange",x)},[]);const f=z0.find(x=>x.id===t);return v.jsxs("div",{className:"flex h-full relative",children:[v.jsxs("div",{className:"fixed inset-0 -z-50 pointer-events-none overflow-hidden bg-[hsl(224,30%,6%)]",children:[v.jsx("div",{className:"absolute inset-0 opacity-35 animate-aurora bg-gradient-to-tr from-teal-500/20 via-indigo-500/15 to-purple-500/20 blur-[130px]"}),v.jsx("div",{className:"absolute top-[-10%] left-[-10%] h-[50%] w-[50%] rounded-full bg-teal-500/15 blur-[160px]"}),v.jsx("div",{className:"absolute bottom-[-10%] right-[-10%] h-[50%] w-[50%] rounded-full bg-purple-500/15 blur-[160px]"}),v.jsx("div",{className:"absolute top-[30%] right-[20%] h-[40%] w-[40%] rounded-full bg-indigo-500/10 blur-[140px]"})]}),v.jsx(x7,{onNavigate:n}),v.jsx(FSe,{open:s,onClose:()=>a(!1),defaultTab:o}),v.jsxs("aside",{className:Je("flex shrink-0 flex-col border-r border-border/40 bg-card/45 backdrop-blur-md transition-all duration-300 ease-in-out",r?"w-16":"w-60"),children:[v.jsxs("div",{className:Je("flex items-center py-4 border-b border-border/40 shrink-0",r?"flex-col gap-3 px-2":"justify-between px-5"),children:[v.jsxs("div",{className:"flex items-center gap-2 overflow-hidden",children:[v.jsx("div",{className:"h-7 w-7 rounded-lg bg-primary shadow-md shadow-primary/20 shrink-0"}),!r&&v.jsxs("div",{className:"leading-tight",children:[v.jsx("div",{className:"text-sm font-semibold tracking-wide font-space",children:"Mission Control"}),v.jsx("div",{className:"text-xs text-muted-foreground",children:"2.0"})]})]}),v.jsx("button",{onClick:()=>{i(x=>{const M=!x;return localStorage.setItem("mc_sidebar_collapsed",M.toString()),M})},className:"p-1 rounded-md hover:bg-accent text-muted-foreground transition-colors cursor-pointer","aria-label":r?"Seitenleiste ausklappen":"Seitenleiste einklappen",title:r?"Maximieren":"Minimieren",children:r?v.jsx(lF,{className:"h-4 w-4","aria-hidden":"true"}):v.jsx(C8,{className:"h-4 w-4","aria-hidden":"true"})})]}),v.jsx("nav",{className:"flex-1 space-y-1 px-3 py-4 overflow-y-auto",children:z0.map(x=>v.jsxs("a",{href:`#${x.id}`,"aria-current":t===x.id?"page":void 0,className:Je("flex w-full items-center rounded-md text-sm transition-all cursor-pointer",r?"justify-center p-2.5":"gap-3 px-3 py-2",t===x.id?"bg-primary/15 text-primary shadow-sm shadow-primary/5":"text-muted-foreground hover:bg-accent hover:text-accent-foreground"),title:r?x.label:void 0,"aria-label":r?x.label:void 0,children:[v.jsx(x.icon,{className:"h-4.5 w-4.5 shrink-0","aria-hidden":"true"}),!r&&v.jsx("span",{className:"truncate",children:x.label})]},x.id))}),v.jsx("div",{className:Je("py-3 text-xs text-muted-foreground border-t border-border/40 shrink-0",r?"px-2 text-center":"px-5"),children:r?v.jsx("div",{className:"flex justify-center",children:v.jsx("span",{className:Je("h-2.5 w-2.5 rounded-full ring-2 ring-black/40",c?c.engine_reachable?c.brain&&!c.brain.ready?"bg-amber-500 animate-pulse":"bg-emerald-500 animate-pulse":"bg-amber-500":"bg-red-500"),title:c?c.engine_reachable?c.brain&&!c.brain.ready?`Hirn offline (${c.brain.model??"fast"})`:"Engine + Hirn online":"Engine offline":"Backend offline"})}):v.jsxs("div",{className:"space-y-2 text-left",children:[c?v.jsxs(v.Fragment,{children:[v.jsxs("span",{className:"flex items-center gap-2",children:[v.jsx("span",{className:Je("h-2 w-2 rounded-full animate-pulse",c.engine_reachable?"bg-emerald-500":"bg-amber-500")}),v.jsxs("span",{className:"truncate",children:["Engine ",c.engine_reachable?"online":"offline"]})]}),c.brain&&!c.brain.ready&&v.jsxs("span",{className:"flex items-center gap-2 text-amber-400",title:`Agent-Hirn '${c.brain.model??"fast"}' lädt nicht/abgestürzt`,children:[v.jsx("span",{className:"h-2 w-2 rounded-full bg-amber-500 animate-pulse"}),v.jsxs("span",{className:"truncate",children:["Hirn offline",c.brain.model?` (${c.brain.model})`:""]})]})]}):v.jsxs("span",{className:"flex items-center gap-2",children:[v.jsx("span",{className:"h-2 w-2 rounded-full bg-red-500"})," ",v.jsx("span",{className:"truncate",children:"Backend offline"})]}),(d==null?void 0:d.versions)&&v.jsxs("div",{className:"space-y-1 text-[9px] text-muted-foreground/60 mt-2 pt-2 border-t border-border/30",children:[v.jsxs("div",{className:"truncate",title:d.versions.mc2?`${d.versions.mc2.branch}-${d.versions.mc2.hash}${d.versions.mc2.dirty?"*":""} (${d.versions.mc2.date})`:"nicht gefunden",children:[v.jsx("strong",{children:"MC2:"})," ",d.versions.mc2?`${d.versions.mc2.hash}${d.versions.mc2.dirty?"*":""}`:"—"]}),v.jsxs("div",{className:"truncate",title:((p=d.versions.engine)==null?void 0:p.type)==="git"?`${d.versions.engine.branch}-${d.versions.engine.hash}${d.versions.engine.dirty?"*":""} (${d.versions.engine.date})`:((y=d.versions.engine)==null?void 0:y.version_text)||"unbekannt",children:[v.jsx("strong",{children:"Engine:"})," ",((b=d.versions.engine)==null?void 0:b.type)==="git"?`${d.versions.engine.hash}${d.versions.engine.dirty?"*":""}`:((w=(S=d.versions.engine)==null?void 0:S.version_text)==null?void 0:w.split(" ").pop())||"—"]}),v.jsxs("div",{className:"truncate",title:d.versions.hermes_ui?`${d.versions.hermes_ui.branch}-${d.versions.hermes_ui.hash}${d.versions.hermes_ui.dirty?"*":""} (${d.versions.hermes_ui.date})`:"nicht gefunden",children:[v.jsx("strong",{children:"Hermes UI:"})," ",d.versions.hermes_ui?`${d.versions.hermes_ui.hash}${d.versions.hermes_ui.dirty?"*":""}`:"—"]}),v.jsxs("div",{className:"truncate",title:d.versions.hermes_agent?`${d.versions.hermes_agent.branch}-${d.versions.hermes_agent.hash}${d.versions.hermes_agent.dirty?"*":""} (${d.versions.hermes_agent.date})`:"nicht gefunden",children:[v.jsx("strong",{children:"Hermes Agent:"})," ",d.versions.hermes_agent?`${d.versions.hermes_agent.hash}${d.versions.hermes_agent.dirty?"*":""}`:"—"]})]})]})})]}),v.jsxs("div",{className:"flex min-w-0 flex-1 flex-col",children:[v.jsxs("header",{className:"flex h-14 shrink-0 items-center justify-between border-b border-border/40 px-6 bg-card/20 backdrop-blur-sm",children:[v.jsx("div",{className:"text-xs font-medium text-muted-foreground tracking-wide uppercase font-sans",children:f.hint}),v.jsxs("div",{className:"flex items-center gap-2",children:[v.jsx("a",{href:"https://git.tobisniceshomelab.ddnsfree.com/Hitonabi/mission-control-v2/src/branch/main/docs/BEDIENUNG.md",target:"_blank",rel:"noopener",className:"flex h-8 items-center rounded-md border border-border/40 bg-background/40 px-2.5 text-xs text-muted-foreground hover:bg-accent hover:text-accent-foreground transition-all cursor-pointer font-semibold",title:"Bedien-Anleitung",children:"Hilfe"}),v.jsxs("button",{onClick:()=>{const x=new KeyboardEvent("keydown",{key:"k",metaKey:!0});document.dispatchEvent(x)},className:"flex items-center gap-2 rounded-md border border-border/40 bg-background/40 px-2.5 py-1.5 text-xs text-muted-foreground hover:bg-accent hover:text-accent-foreground transition-all cursor-pointer",children:[v.jsx(L8,{className:"h-3.5 w-3.5"}),v.jsx("span",{children:"Suchen"}),v.jsx("kbd",{className:"rounded bg-muted px-1.5 py-0.5 font-mono text-[9px]",children:"⌘K"})]})]})]}),v.jsxs("main",{className:"flex-1 overflow-y-auto p-6 scrollbar-thin",children:[t==="dashboard"&&v.jsx(Gfe,{}),t==="models"&&v.jsx(rhe,{}),t==="connect"&&v.jsx(she,{}),t==="memory"&&v.jsx(fhe,{}),t==="agent"&&v.jsx(phe,{}),t==="terminal"&&v.jsx(mhe,{}),t==="voice"&&v.jsx(OSe,{}),t==="guide"&&v.jsx(DSe,{}),!["dashboard","models","connect","memory","agent","terminal","voice","guide"].includes(t)&&v.jsx(USe,{title:f.label,hint:f.hint})]})]})]})}const BSe=new c8({defaultOptions:{queries:{retry:1,refetchOnWindowFocus:!1,staleTime:5e3}}});UW.createRoot(document.getElementById("root")).render(v.jsx($j.StrictMode,{children:v.jsx(u8,{client:BSe,children:v.jsx(zSe,{})})}));export{Jf as R,Vm as S,LT as T,o9 as a,V1 as g,v as j,R as r}; diff --git a/frontend/dist/assets/index-DoqQd4Zi.css b/frontend/dist/assets/index-DoqQd4Zi.css deleted file mode 100644 index c357b91..0000000 --- a/frontend/dist/assets/index-DoqQd4Zi.css +++ /dev/null @@ -1 +0,0 @@ -@import"https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Space+Grotesk:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap";/*! tailwindcss v4.3.1 | MIT License | https://tailwindcss.com */@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-pan-x:initial;--tw-pan-y:initial;--tw-pinch-zoom:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-divide-y-reverse:0;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction: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-outline-style:solid;--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}}}@layer theme{:root,:host{--font-sans:"Inter", ui-sans-serif, system-ui, -apple-system, sans-serif;--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-orange-300:oklch(83.7% .128 66.29);--color-orange-500:oklch(70.5% .213 47.604);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-teal-400:oklch(77.7% .152 181.912);--color-teal-500:oklch(70.4% .14 182.503);--color-cyan-200:oklch(91.7% .08 205.041);--color-cyan-300:oklch(86.5% .127 207.078);--color-cyan-400:oklch(78.9% .154 211.53);--color-cyan-500:oklch(71.5% .143 215.221);--color-sky-400:oklch(74.6% .16 232.661);--color-sky-500:oklch(68.5% .169 237.323);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-500:oklch(62.3% .214 259.815);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-violet-200:oklch(89.4% .057 293.283);--color-violet-300:oklch(81.1% .111 293.571);--color-violet-400:oklch(70.2% .183 293.541);--color-violet-500:oklch(60.6% .25 292.717);--color-purple-300:oklch(82.7% .119 306.383);--color-purple-500:oklch(62.7% .265 303.9);--color-fuchsia-300:oklch(83.3% .145 321.434);--color-fuchsia-400:oklch(74% .238 322.16);--color-fuchsia-500:oklch(66.7% .295 322.15);--color-pink-400:oklch(71.8% .202 349.761);--color-pink-500:oklch(65.6% .241 354.308);--color-rose-400:oklch(71.2% .194 13.428);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-500:oklch(55.4% .046 257.417);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-2xl:42rem;--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);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wide:.025em;--tracking-wider:.05em;--leading-tight:1.25;--leading-normal:1.5;--leading-relaxed:1.625;--radius-xl:.75rem;--radius-2xl:1rem;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0, 0, .2, 1) infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--blur-md:12px;--blur-xl:24px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:"Inter", ui-sans-serif, system-ui, -apple-system, sans-serif;--default-mono-font-family:"JetBrains Mono", ui-monospace, SFMono-Regular, monospace}}@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%;-moz-tab-size:4;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]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance: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 components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.visible\!{visibility:visible!important}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.not-sr-only{clip-path:none;white-space:normal;width:auto;height:auto;margin:0;padding:0;position:static;overflow:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{inset-inline:0}.inset-y-0{inset-block:0}.top-0{top:0}.top-2\.5{top:calc(var(--spacing) * 2.5)}.top-3{top:calc(var(--spacing) * 3)}.top-\[-10\%\]{top:-10%}.top-\[30\%\]{top:30%}.right-0{right:0}.right-3{right:calc(var(--spacing) * 3)}.right-\[-10\%\]{right:-10%}.right-\[20\%\]{right:20%}.bottom-3{bottom:calc(var(--spacing) * 3)}.bottom-\[-10\%\]{bottom:-10%}.left-2\.5{left:calc(var(--spacing) * 2.5)}.left-3{left:calc(var(--spacing) * 3)}.left-\[-10\%\]{left:-10%}.isolate{isolation:isolate}.isolation-auto{isolation:auto}.-z-50{z-index:-50}.z-10{z-index:10}.z-50{z-index:50}.z-\[60\]{z-index:60}.z-\[99\]{z-index:99}.col-span-full{grid-column:1/-1}.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-auto{margin-inline:auto}.-mt-1{margin-top:calc(var(--spacing) * -1)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-2\.5{margin-top:calc(var(--spacing) * 2.5)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-3\.5{margin-top:calc(var(--spacing) * 3.5)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-auto{margin-top:auto}.mr-0\.5{margin-right:calc(var(--spacing) * .5)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-1{margin-left:var(--spacing)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.flow-root{display:flow-root}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.inline-grid{display:inline-grid}.inline-table{display:inline-table}.list-item{display:list-item}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-column{display:table-column}.table-column-group{display:table-column-group}.table-footer-group{display:table-footer-group}.table-header-group{display:table-header-group}.table-row{display:table-row}.table-row-group{display:table-row-group}.h-1{height:var(--spacing)}.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-4\.5{height:calc(var(--spacing) * 4.5)}.h-5{height:calc(var(--spacing) * 5)}.h-5\.5{height:calc(var(--spacing) * 5.5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-14{height:calc(var(--spacing) * 14)}.h-16{height:calc(var(--spacing) * 16)}.h-20{height:calc(var(--spacing) * 20)}.h-24{height:calc(var(--spacing) * 24)}.h-28{height:calc(var(--spacing) * 28)}.h-44{height:calc(var(--spacing) * 44)}.h-\[40\%\]{height:40%}.h-\[50\%\]{height:50%}.h-\[150px\]{height:150px}.h-\[480px\]{height:480px}.h-\[calc\(100vh-13rem\)\]{height:calc(100vh - 13rem)}.h-full{height:100%}.h-px{height:1px}.max-h-20{max-height:calc(var(--spacing) * 20)}.max-h-36{max-height:calc(var(--spacing) * 36)}.max-h-56{max-height:calc(var(--spacing) * 56)}.max-h-60{max-height:calc(var(--spacing) * 60)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-80{max-height:calc(var(--spacing) * 80)}.max-h-\[80vh\]{max-height:80vh}.min-h-0{min-height:0}.min-h-\[68vh\]{min-height:68vh}.min-h-\[90px\]{min-height:90px}.min-h-\[300px\]{min-height:300px}.min-h-\[560px\]{min-height:560px}.w-1\.5{width:calc(var(--spacing) * 1.5)}.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-4\.5{width:calc(var(--spacing) * 4.5)}.w-5{width:calc(var(--spacing) * 5)}.w-5\.5{width:calc(var(--spacing) * 5.5)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.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-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-52{width:calc(var(--spacing) * 52)}.w-60{width:calc(var(--spacing) * 60)}.w-80{width:calc(var(--spacing) * 80)}.w-\[40\%\]{width:40%}.w-\[50\%\]{width:50%}.w-fit{width:fit-content}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-\[88\%\]{max-width:88%}.max-w-\[120px\]{max-width:120px}.max-w-\[180px\]{max-width:180px}.max-w-\[250px\]{max-width:250px}.max-w-\[260px\]{max-width:260px}.max-w-\[280px\]{max-width:280px}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:0}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.translate-x-0{--tw-translate-x:0;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-full{--tw-translate-x:100%;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)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-ping{animation:var(--animate-ping)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-pinch-zoom{--tw-pinch-zoom:pinch-zoom;touch-action:var(--tw-pan-x,) var(--tw-pan-y,) var(--tw-pinch-zoom,)}.touch-none{touch-action:none}.resize{resize:both}.resize-none{resize:none}.scroll-mt-20{scroll-margin-top:calc(var(--spacing) * 20)}.scrollbar-thin{scrollbar-width:thin}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.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:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * 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-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * 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-3\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3.5) * 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-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * 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-7>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 7) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 7) * 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(.space-y-reverse>:not(:last-child)){--tw-space-y-reverse:1}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}:where(.space-x-reverse>:not(:last-child)){--tw-space-x-reverse:1}.gap-y-1{row-gap:var(--spacing)}.gap-y-1\.5{row-gap:calc(var(--spacing) * 1.5)}:where(.divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-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-y-reverse>:not(:last-child)){--tw-divide-y-reverse:1}.self-end{align-self:flex-end}.self-start{align-self:flex-start}.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}.overscroll-contain{overscroll-behavior:contain}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-s{border-start-start-radius:.25rem;border-end-start-radius:.25rem}.rounded-ss{border-start-start-radius:.25rem}.rounded-e{border-start-end-radius:.25rem;border-end-end-radius:.25rem}.rounded-se{border-start-end-radius:.25rem}.rounded-ee{border-end-end-radius:.25rem}.rounded-es{border-end-start-radius:.25rem}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-tl{border-top-left-radius:.25rem}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-tr{border-top-right-radius:.25rem}.rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-br{border-bottom-right-radius:.25rem}.rounded-br-sm{border-bottom-right-radius:calc(var(--radius) - 4px)}.rounded-bl{border-bottom-left-radius:.25rem}.rounded-bl-sm{border-bottom-left-radius:calc(var(--radius) - 4px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-x{border-inline-style:var(--tw-border-style);border-inline-width:1px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.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{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-500\/20{border-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/20{border-color:color-mix(in oklab,var(--color-amber-500) 20%,transparent)}}.border-amber-500\/25{border-color:#f99c0040}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/25{border-color:color-mix(in oklab,var(--color-amber-500) 25%,transparent)}}.border-amber-500\/30{border-color:#f99c004d}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/30{border-color:color-mix(in oklab,var(--color-amber-500) 30%,transparent)}}.border-amber-500\/40{border-color:#f99c0066}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/40{border-color:color-mix(in oklab,var(--color-amber-500) 40%,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-border,.border-border\/20{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/20{border-color:color-mix(in oklab,hsl(var(--border)) 20%,transparent)}}.border-border\/30{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/30{border-color:color-mix(in oklab,hsl(var(--border)) 30%,transparent)}}.border-border\/40{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/40{border-color:color-mix(in oklab,hsl(var(--border)) 40%,transparent)}}.border-border\/50{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/50{border-color:color-mix(in oklab,hsl(var(--border)) 50%,transparent)}}.border-border\/60{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/60{border-color:color-mix(in oklab,hsl(var(--border)) 60%,transparent)}}.border-border\/70{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/70{border-color:color-mix(in oklab,hsl(var(--border)) 70%,transparent)}}.border-border\/80{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/80{border-color:color-mix(in oklab,hsl(var(--border)) 80%,transparent)}}.border-cyan-500\/20{border-color:#00b7d733}@supports (color:color-mix(in lab,red,red)){.border-cyan-500\/20{border-color:color-mix(in oklab,var(--color-cyan-500) 20%,transparent)}}.border-cyan-500\/25{border-color:#00b7d740}@supports (color:color-mix(in lab,red,red)){.border-cyan-500\/25{border-color:color-mix(in oklab,var(--color-cyan-500) 25%,transparent)}}.border-cyan-500\/30{border-color:#00b7d74d}@supports (color:color-mix(in lab,red,red)){.border-cyan-500\/30{border-color:color-mix(in oklab,var(--color-cyan-500) 30%,transparent)}}.border-emerald-500\/10{border-color:#00bb7f1a}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/10{border-color:color-mix(in oklab,var(--color-emerald-500) 10%,transparent)}}.border-emerald-500\/15{border-color:#00bb7f26}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/15{border-color:color-mix(in oklab,var(--color-emerald-500) 15%,transparent)}}.border-emerald-500\/20{border-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/20{border-color:color-mix(in oklab,var(--color-emerald-500) 20%,transparent)}}.border-emerald-500\/30{border-color:#00bb7f4d}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/30{border-color:color-mix(in oklab,var(--color-emerald-500) 30%,transparent)}}.border-emerald-500\/40{border-color:#00bb7f66}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/40{border-color:color-mix(in oklab,var(--color-emerald-500) 40%,transparent)}}.border-fuchsia-500\/30{border-color:#e12afb4d}@supports (color:color-mix(in lab,red,red)){.border-fuchsia-500\/30{border-color:color-mix(in oklab,var(--color-fuchsia-500) 30%,transparent)}}.border-fuchsia-500\/40{border-color:#e12afb66}@supports (color:color-mix(in lab,red,red)){.border-fuchsia-500\/40{border-color:color-mix(in oklab,var(--color-fuchsia-500) 40%,transparent)}}.border-indigo-500\/25{border-color:#625fff40}@supports (color:color-mix(in lab,red,red)){.border-indigo-500\/25{border-color:color-mix(in oklab,var(--color-indigo-500) 25%,transparent)}}.border-indigo-500\/30{border-color:#625fff4d}@supports (color:color-mix(in lab,red,red)){.border-indigo-500\/30{border-color:color-mix(in oklab,var(--color-indigo-500) 30%,transparent)}}.border-indigo-500\/40{border-color:#625fff66}@supports (color:color-mix(in lab,red,red)){.border-indigo-500\/40{border-color:color-mix(in oklab,var(--color-indigo-500) 40%,transparent)}}.border-orange-500\/30{border-color:#fe6e004d}@supports (color:color-mix(in lab,red,red)){.border-orange-500\/30{border-color:color-mix(in oklab,var(--color-orange-500) 30%,transparent)}}.border-pink-500\/25{border-color:#f6339a40}@supports (color:color-mix(in lab,red,red)){.border-pink-500\/25{border-color:color-mix(in oklab,var(--color-pink-500) 25%,transparent)}}.border-primary,.border-primary\/20{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/20{border-color:color-mix(in oklab,hsl(var(--primary)) 20%,transparent)}}.border-primary\/25{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/25{border-color:color-mix(in oklab,hsl(var(--primary)) 25%,transparent)}}.border-primary\/30{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/30{border-color:color-mix(in oklab,hsl(var(--primary)) 30%,transparent)}}.border-primary\/40{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/40{border-color:color-mix(in oklab,hsl(var(--primary)) 40%,transparent)}}.border-primary\/45{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/45{border-color:color-mix(in oklab,hsl(var(--primary)) 45%,transparent)}}.border-primary\/50{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/50{border-color:color-mix(in oklab,hsl(var(--primary)) 50%,transparent)}}.border-primary\/60{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/60{border-color:color-mix(in oklab,hsl(var(--primary)) 60%,transparent)}}.border-purple-500\/30{border-color:#ac4bff4d}@supports (color:color-mix(in lab,red,red)){.border-purple-500\/30{border-color:color-mix(in oklab,var(--color-purple-500) 30%,transparent)}}.border-red-500{border-color:var(--color-red-500)}.border-red-500\/20{border-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.border-red-500\/20{border-color:color-mix(in oklab,var(--color-red-500) 20%,transparent)}}.border-red-500\/25{border-color:#fb2c3640}@supports (color:color-mix(in lab,red,red)){.border-red-500\/25{border-color:color-mix(in oklab,var(--color-red-500) 25%,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\/40{border-color:#fb2c3666}@supports (color:color-mix(in lab,red,red)){.border-red-500\/40{border-color:color-mix(in oklab,var(--color-red-500) 40%,transparent)}}.border-slate-500\/25{border-color:#62748e40}@supports (color:color-mix(in lab,red,red)){.border-slate-500\/25{border-color:color-mix(in oklab,var(--color-slate-500) 25%,transparent)}}.border-slate-500\/30{border-color:#62748e4d}@supports (color:color-mix(in lab,red,red)){.border-slate-500\/30{border-color:color-mix(in oklab,var(--color-slate-500) 30%,transparent)}}.border-teal-500\/25{border-color:#00baa740}@supports (color:color-mix(in lab,red,red)){.border-teal-500\/25{border-color:color-mix(in oklab,var(--color-teal-500) 25%,transparent)}}.border-transparent{border-color:#0000}.border-violet-500\/20{border-color:#8d54ff33}@supports (color:color-mix(in lab,red,red)){.border-violet-500\/20{border-color:color-mix(in oklab,var(--color-violet-500) 20%,transparent)}}.border-violet-500\/25{border-color:#8d54ff40}@supports (color:color-mix(in lab,red,red)){.border-violet-500\/25{border-color:color-mix(in oklab,var(--color-violet-500) 25%,transparent)}}.border-t-primary\/70{border-top-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-t-primary\/70{border-top-color:color-mix(in oklab,hsl(var(--primary)) 70%,transparent)}}.border-t-violet-500\/70{border-top-color:#8d54ffb3}@supports (color:color-mix(in lab,red,red)){.border-t-violet-500\/70{border-top-color:color-mix(in oklab,var(--color-violet-500) 70%,transparent)}}.border-l-amber-500\/80{border-left-color:#f99c00cc}@supports (color:color-mix(in lab,red,red)){.border-l-amber-500\/80{border-left-color:color-mix(in oklab,var(--color-amber-500) 80%,transparent)}}.border-l-cyan-500\/80{border-left-color:#00b7d7cc}@supports (color:color-mix(in lab,red,red)){.border-l-cyan-500\/80{border-left-color:color-mix(in oklab,var(--color-cyan-500) 80%,transparent)}}.border-l-indigo-500\/80{border-left-color:#625fffcc}@supports (color:color-mix(in lab,red,red)){.border-l-indigo-500\/80{border-left-color:color-mix(in oklab,var(--color-indigo-500) 80%,transparent)}}.border-l-muted{border-left-color:hsl(var(--muted))}.border-l-violet-500\/80{border-left-color:#8d54ffcc}@supports (color:color-mix(in lab,red,red)){.border-l-violet-500\/80{border-left-color:color-mix(in oklab,var(--color-violet-500) 80%,transparent)}}.bg-\[\#070a0f\]{background-color:#070a0f}.bg-\[hsl\(224\,30\%\,6\%\)\]{background-color:#0b0d14}.bg-amber-400{background-color:var(--color-amber-400)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-500\/5{background-color:#f99c000d}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/5{background-color:color-mix(in oklab,var(--color-amber-500) 5%,transparent)}}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/10{background-color:color-mix(in oklab,var(--color-amber-500) 10%,transparent)}}.bg-amber-500\/15{background-color:#f99c0026}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/15{background-color:color-mix(in oklab,var(--color-amber-500) 15%,transparent)}}.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-amber-500\/80{background-color:#f99c00cc}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/80{background-color:color-mix(in oklab,var(--color-amber-500) 80%,transparent)}}.bg-amber-500\/\[0\.06\]{background-color:#f99c000f}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-amber-500) 6%,transparent)}}.bg-background\/10{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/10{background-color:color-mix(in oklab,hsl(var(--background)) 10%,transparent)}}.bg-background\/20{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/20{background-color:color-mix(in oklab,hsl(var(--background)) 20%,transparent)}}.bg-background\/25{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/25{background-color:color-mix(in oklab,hsl(var(--background)) 25%,transparent)}}.bg-background\/30{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/30{background-color:color-mix(in oklab,hsl(var(--background)) 30%,transparent)}}.bg-background\/35{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/35{background-color:color-mix(in oklab,hsl(var(--background)) 35%,transparent)}}.bg-background\/40{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/40{background-color:color-mix(in oklab,hsl(var(--background)) 40%,transparent)}}.bg-background\/50{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/50{background-color:color-mix(in oklab,hsl(var(--background)) 50%,transparent)}}.bg-black\/10{background-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.bg-black\/10{background-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab,red,red)){.bg-black\/30{background-color:color-mix(in oklab,var(--color-black) 30%,transparent)}}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab,red,red)){.bg-black\/40{background-color:color-mix(in oklab,var(--color-black) 40%,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-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-border\/30{background-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.bg-border\/30{background-color:color-mix(in oklab,hsl(var(--border)) 30%,transparent)}}.bg-card,.bg-card\/20{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/20{background-color:color-mix(in oklab,hsl(var(--card)) 20%,transparent)}}.bg-card\/30{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/30{background-color:color-mix(in oklab,hsl(var(--card)) 30%,transparent)}}.bg-card\/40{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/40{background-color:color-mix(in oklab,hsl(var(--card)) 40%,transparent)}}.bg-card\/45{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/45{background-color:color-mix(in oklab,hsl(var(--card)) 45%,transparent)}}.bg-card\/50{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/50{background-color:color-mix(in oklab,hsl(var(--card)) 50%,transparent)}}.bg-card\/70{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/70{background-color:color-mix(in oklab,hsl(var(--card)) 70%,transparent)}}.bg-card\/85{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/85{background-color:color-mix(in oklab,hsl(var(--card)) 85%,transparent)}}.bg-cyan-500\/10{background-color:#00b7d71a}@supports (color:color-mix(in lab,red,red)){.bg-cyan-500\/10{background-color:color-mix(in oklab,var(--color-cyan-500) 10%,transparent)}}.bg-cyan-500\/15{background-color:#00b7d726}@supports (color:color-mix(in lab,red,red)){.bg-cyan-500\/15{background-color:color-mix(in oklab,var(--color-cyan-500) 15%,transparent)}}.bg-cyan-500\/20{background-color:#00b7d733}@supports (color:color-mix(in lab,red,red)){.bg-cyan-500\/20{background-color:color-mix(in oklab,var(--color-cyan-500) 20%,transparent)}}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-emerald-500\/5{background-color:#00bb7f0d}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/5{background-color:color-mix(in oklab,var(--color-emerald-500) 5%,transparent)}}.bg-emerald-500\/10{background-color:#00bb7f1a}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/10{background-color:color-mix(in oklab,var(--color-emerald-500) 10%,transparent)}}.bg-emerald-500\/15{background-color:#00bb7f26}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/15{background-color:color-mix(in oklab,var(--color-emerald-500) 15%,transparent)}}.bg-emerald-500\/20{background-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/20{background-color:color-mix(in oklab,var(--color-emerald-500) 20%,transparent)}}.bg-emerald-500\/80{background-color:#00bb7fcc}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/80{background-color:color-mix(in oklab,var(--color-emerald-500) 80%,transparent)}}.bg-emerald-500\/\[0\.07\]{background-color:#00bb7f12}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/\[0\.07\]{background-color:color-mix(in oklab,var(--color-emerald-500) 7%,transparent)}}.bg-fuchsia-500\/10{background-color:#e12afb1a}@supports (color:color-mix(in lab,red,red)){.bg-fuchsia-500\/10{background-color:color-mix(in oklab,var(--color-fuchsia-500) 10%,transparent)}}.bg-indigo-500\/5{background-color:#625fff0d}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/5{background-color:color-mix(in oklab,var(--color-indigo-500) 5%,transparent)}}.bg-indigo-500\/10{background-color:#625fff1a}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/10{background-color:color-mix(in oklab,var(--color-indigo-500) 10%,transparent)}}.bg-indigo-500\/15{background-color:#625fff26}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/15{background-color:color-mix(in oklab,var(--color-indigo-500) 15%,transparent)}}.bg-muted{background-color:hsl(var(--muted))}.bg-muted-foreground,.bg-muted-foreground\/40{background-color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.bg-muted-foreground\/40{background-color:color-mix(in oklab,hsl(var(--muted-foreground)) 40%,transparent)}}.bg-muted\/10{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/10{background-color:color-mix(in oklab,hsl(var(--muted)) 10%,transparent)}}.bg-muted\/20{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/20{background-color:color-mix(in oklab,hsl(var(--muted)) 20%,transparent)}}.bg-muted\/40{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/40{background-color:color-mix(in oklab,hsl(var(--muted)) 40%,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-pink-500\/15{background-color:#f6339a26}@supports (color:color-mix(in lab,red,red)){.bg-pink-500\/15{background-color:color-mix(in oklab,var(--color-pink-500) 15%,transparent)}}.bg-popover,.bg-popover\/95{background-color:hsl(var(--popover))}@supports (color:color-mix(in lab,red,red)){.bg-popover\/95{background-color:color-mix(in oklab,hsl(var(--popover)) 95%,transparent)}}.bg-primary,.bg-primary\/5{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/5{background-color:color-mix(in oklab,hsl(var(--primary)) 5%,transparent)}}.bg-primary\/10{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/10{background-color:color-mix(in oklab,hsl(var(--primary)) 10%,transparent)}}.bg-primary\/15{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/15{background-color:color-mix(in oklab,hsl(var(--primary)) 15%,transparent)}}.bg-primary\/\[0\.06\]{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/\[0\.06\]{background-color:color-mix(in oklab,hsl(var(--primary)) 6%,transparent)}}.bg-purple-500\/15{background-color:#ac4bff26}@supports (color:color-mix(in lab,red,red)){.bg-purple-500\/15{background-color:color-mix(in oklab,var(--color-purple-500) 15%,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-red-500{background-color:var(--color-red-500)}.bg-red-500\/5{background-color:#fb2c360d}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/5{background-color:color-mix(in oklab,var(--color-red-500) 5%,transparent)}}.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\/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-slate-500\/15{background-color:#62748e26}@supports (color:color-mix(in lab,red,red)){.bg-slate-500\/15{background-color:color-mix(in oklab,var(--color-slate-500) 15%,transparent)}}.bg-slate-500\/20{background-color:#62748e33}@supports (color:color-mix(in lab,red,red)){.bg-slate-500\/20{background-color:color-mix(in oklab,var(--color-slate-500) 20%,transparent)}}.bg-teal-500{background-color:var(--color-teal-500)}.bg-teal-500\/15{background-color:#00baa726}@supports (color:color-mix(in lab,red,red)){.bg-teal-500\/15{background-color:color-mix(in oklab,var(--color-teal-500) 15%,transparent)}}.bg-transparent{background-color:#0000}.bg-violet-500\/5{background-color:#8d54ff0d}@supports (color:color-mix(in lab,red,red)){.bg-violet-500\/5{background-color:color-mix(in oklab,var(--color-violet-500) 5%,transparent)}}.bg-violet-500\/10{background-color:#8d54ff1a}@supports (color:color-mix(in lab,red,red)){.bg-violet-500\/10{background-color:color-mix(in oklab,var(--color-violet-500) 10%,transparent)}}.bg-violet-500\/15{background-color:#8d54ff26}@supports (color:color-mix(in lab,red,red)){.bg-violet-500\/15{background-color:color-mix(in oklab,var(--color-violet-500) 15%,transparent)}}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-tr{--tw-gradient-position:to top right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-cyan-500{--tw-gradient-from:var(--color-cyan-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-foreground{--tw-gradient-from:hsl(var(--foreground));--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-indigo-500{--tw-gradient-from:var(--color-indigo-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-purple-500{--tw-gradient-from:var(--color-purple-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-teal-500{--tw-gradient-from:var(--color-teal-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-teal-500\/20{--tw-gradient-from:#00baa733}@supports (color:color-mix(in lab,red,red)){.from-teal-500\/20{--tw-gradient-from:color-mix(in oklab, var(--color-teal-500) 20%, transparent)}}.from-teal-500\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.via-foreground{--tw-gradient-via:hsl(var(--foreground));--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-indigo-500\/15{--tw-gradient-via:#625fff26}@supports (color:color-mix(in lab,red,red)){.via-indigo-500\/15{--tw-gradient-via:color-mix(in oklab, var(--color-indigo-500) 15%, transparent)}}.via-indigo-500\/15{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.to-blue-500{--tw-gradient-to:var(--color-blue-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-emerald-500{--tw-gradient-to:var(--color-emerald-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-indigo-500{--tw-gradient-to:var(--color-indigo-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-pink-500{--tw-gradient-to:var(--color-pink-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-primary{--tw-gradient-to:hsl(var(--primary));--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-purple-500\/20{--tw-gradient-to:#ac4bff33}@supports (color:color-mix(in lab,red,red)){.to-purple-500\/20{--tw-gradient-to:color-mix(in oklab, var(--color-purple-500) 20%, transparent)}}.to-purple-500\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-sky-500{--tw-gradient-to:var(--color-sky-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.bg-repeat{background-repeat:repeat}.fill-primary\/20{fill:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.fill-primary\/20{fill:color-mix(in oklab,hsl(var(--primary)) 20%,transparent)}}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-3\.5{padding:calc(var(--spacing) * 3.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.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:var(--spacing)}.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-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-20{padding-block:calc(var(--spacing) * 20)}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-2\.5{padding-top:calc(var(--spacing) * 2.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-24{padding-top:calc(var(--spacing) * 24)}.pt-\[12vh\]{padding-top:12vh}.pr-1{padding-right:var(--spacing)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-10{padding-right:calc(var(--spacing) * 10)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-8{padding-left:calc(var(--spacing) * 8)}.pl-9{padding-left:calc(var(--spacing) * 9)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,monospace}.font-sans{font-family:Inter,ui-sans-serif,system-ui,-apple-system,sans-serif}.font-space{font-family:Space Grotesk,sans-serif}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--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-\[7px\]{font-size:7px}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-none{--tw-leading:1;line-height:1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.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-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.text-wrap{text-wrap:wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.text-clip{text-overflow:clip}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-300{color:var(--color-amber-300)}.text-amber-400{color:var(--color-amber-400)}.text-amber-400\/80{color:#fcbb00cc}@supports (color:color-mix(in lab,red,red)){.text-amber-400\/80{color:color-mix(in oklab,var(--color-amber-400) 80%,transparent)}}.text-amber-400\/90{color:#fcbb00e6}@supports (color:color-mix(in lab,red,red)){.text-amber-400\/90{color:color-mix(in oklab,var(--color-amber-400) 90%,transparent)}}.text-amber-500{color:var(--color-amber-500)}.text-black{color:var(--color-black)}.text-blue-300{color:var(--color-blue-300)}.text-cyan-200\/90{color:#a2f4fde6}@supports (color:color-mix(in lab,red,red)){.text-cyan-200\/90{color:color-mix(in oklab,var(--color-cyan-200) 90%,transparent)}}.text-cyan-300{color:var(--color-cyan-300)}.text-cyan-300\/90{color:#53eafde6}@supports (color:color-mix(in lab,red,red)){.text-cyan-300\/90{color:color-mix(in oklab,var(--color-cyan-300) 90%,transparent)}}.text-cyan-400{color:var(--color-cyan-400)}.text-emerald-300{color:var(--color-emerald-300)}.text-emerald-400{color:var(--color-emerald-400)}.text-emerald-400\/90{color:#00d294e6}@supports (color:color-mix(in lab,red,red)){.text-emerald-400\/90{color:color-mix(in oklab,var(--color-emerald-400) 90%,transparent)}}.text-foreground,.text-foreground\/90{color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.text-foreground\/90{color:color-mix(in oklab,hsl(var(--foreground)) 90%,transparent)}}.text-fuchsia-300{color:var(--color-fuchsia-300)}.text-fuchsia-400{color:var(--color-fuchsia-400)}.text-indigo-300{color:var(--color-indigo-300)}.text-indigo-400{color:var(--color-indigo-400)}.text-muted-foreground,.text-muted-foreground\/40{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/40{color:color-mix(in oklab,hsl(var(--muted-foreground)) 40%,transparent)}}.text-muted-foreground\/45{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/45{color:color-mix(in oklab,hsl(var(--muted-foreground)) 45%,transparent)}}.text-muted-foreground\/50{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/50{color:color-mix(in oklab,hsl(var(--muted-foreground)) 50%,transparent)}}.text-muted-foreground\/55{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/55{color:color-mix(in oklab,hsl(var(--muted-foreground)) 55%,transparent)}}.text-muted-foreground\/60{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/60{color:color-mix(in oklab,hsl(var(--muted-foreground)) 60%,transparent)}}.text-muted-foreground\/65{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/65{color:color-mix(in oklab,hsl(var(--muted-foreground)) 65%,transparent)}}.text-muted-foreground\/70{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/70{color:color-mix(in oklab,hsl(var(--muted-foreground)) 70%,transparent)}}.text-muted-foreground\/75{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/75{color:color-mix(in oklab,hsl(var(--muted-foreground)) 75%,transparent)}}.text-muted-foreground\/80{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/80{color:color-mix(in oklab,hsl(var(--muted-foreground)) 80%,transparent)}}.text-orange-300{color:var(--color-orange-300)}.text-pink-400{color:var(--color-pink-400)}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-primary\/70{color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.text-primary\/70{color:color-mix(in oklab,hsl(var(--primary)) 70%,transparent)}}.text-primary\/80{color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.text-primary\/80{color:color-mix(in oklab,hsl(var(--primary)) 80%,transparent)}}.text-purple-300{color:var(--color-purple-300)}.text-red-300{color:var(--color-red-300)}.text-red-400{color:var(--color-red-400)}.text-red-400\/80{color:#ff6568cc}@supports (color:color-mix(in lab,red,red)){.text-red-400\/80{color:color-mix(in oklab,var(--color-red-400) 80%,transparent)}}.text-rose-400{color:var(--color-rose-400)}.text-sky-400{color:var(--color-sky-400)}.text-slate-300{color:var(--color-slate-300)}.text-teal-400{color:var(--color-teal-400)}.text-transparent{color:#0000}.text-violet-200\/90{color:#ddd6ffe6}@supports (color:color-mix(in lab,red,red)){.text-violet-200\/90{color:color-mix(in oklab,var(--color-violet-200) 90%,transparent)}}.text-violet-300{color:var(--color-violet-300)}.text-violet-300\/80{color:#c4b4ffcc}@supports (color:color-mix(in lab,red,red)){.text-violet-300\/80{color:color-mix(in oklab,var(--color-violet-300) 80%,transparent)}}.text-violet-400{color:var(--color-violet-400)}.text-violet-400\/70{color:#a685ffb3}@supports (color:color-mix(in lab,red,red)){.text-violet-400\/70{color:color-mix(in oklab,var(--color-violet-400) 70%,transparent)}}.text-white{color:var(--color-white)}.text-white\/95{color:#fffffff2}@supports (color:color-mix(in lab,red,red)){.text-white\/95{color:color-mix(in oklab,var(--color-white) 95%,transparent)}}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.diagonal-fractions{--tw-numeric-fraction:diagonal-fractions;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.lining-nums{--tw-numeric-figure:lining-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.oldstyle-nums{--tw-numeric-figure:oldstyle-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.proportional-nums{--tw-numeric-spacing:proportional-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.slashed-zero{--tw-slashed-zero:slashed-zero;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.stacked-fractions{--tw-numeric-fraction:stacked-fractions;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.normal-nums{font-variant-numeric:normal}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.overline{text-decoration-line:overline}.underline{text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.accent-primary{accent-color:hsl(var(--primary))}.opacity-0{opacity:0}.opacity-35{opacity:.35}.opacity-60{opacity:.6}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.opacity-100{opacity:1}.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\!{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a)!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.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-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);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-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px 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-sm{--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-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-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)}.shadow-amber-500\/10{--tw-shadow-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.shadow-amber-500\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-amber-500) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/5{--tw-shadow-color:#0000000d}@supports (color:color-mix(in lab,red,red)){.shadow-black\/5{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 5%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/10{--tw-shadow-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.shadow-black\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/15{--tw-shadow-color:#00000026}@supports (color:color-mix(in lab,red,red)){.shadow-black\/15{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 15%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/20{--tw-shadow-color:#0003}@supports (color:color-mix(in lab,red,red)){.shadow-black\/20{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 20%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/25{--tw-shadow-color:#00000040}@supports (color:color-mix(in lab,red,red)){.shadow-black\/25{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 25%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-emerald-500\/5{--tw-shadow-color:#00bb7f0d}@supports (color:color-mix(in lab,red,red)){.shadow-emerald-500\/5{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-emerald-500) 5%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-primary\/5{--tw-shadow-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.shadow-primary\/5{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, hsl(var(--primary)) 5%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-primary\/10{--tw-shadow-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.shadow-primary\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, hsl(var(--primary)) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-primary\/20{--tw-shadow-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.shadow-primary\/20{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, hsl(var(--primary)) 20%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-red-500\/10{--tw-shadow-color:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.shadow-red-500\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-red-500) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-red-500\/30{--tw-shadow-color:#fb2c364d}@supports (color:color-mix(in lab,red,red)){.shadow-red-500\/30{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-red-500) 30%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-black\/40{--tw-ring-color:#0006}@supports (color:color-mix(in lab,red,red)){.ring-black\/40{--tw-ring-color:color-mix(in oklab, var(--color-black) 40%, transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.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,)}.blur-\[130px\]{--tw-blur:blur(130px);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,)}.blur-\[140px\]{--tw-blur:blur(140px);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,)}.blur-\[160px\]{--tw-blur:blur(160px);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,)}.drop-shadow{--tw-drop-shadow-size:drop-shadow(0 1px 2px var(--tw-drop-shadow-color,#0000001a)) drop-shadow(0 1px 1px var(--tw-drop-shadow-color,#0000000f));--tw-drop-shadow:drop-shadow(0 1px 2px #0000001a) drop-shadow(0 1px 1px #0000000f);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,)}.grayscale{--tw-grayscale:grayscale(100%);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,)}.invert{--tw-invert:invert(100%);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,)}.sepia{--tw-sepia:sepia(100%);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,)!important}.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,)}.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,)!important}.backdrop-blur{--tw-backdrop-blur:blur(8px);-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,)}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-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,)}.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,)}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-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,)}.backdrop-grayscale{--tw-backdrop-grayscale:grayscale(100%);-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,)}.backdrop-invert{--tw-backdrop-invert:invert(100%);-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,)}.backdrop-sepia{--tw-backdrop-sepia:sepia(100%);-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,)}.backdrop-filter{-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{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition\!{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events!important;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--tw-duration,var(--default-transition-duration))!important}.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}.duration-500{--tw-duration:.5s;transition-duration:.5s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.select-text{-webkit-user-select:text;user-select:text}:where(.divide-x-reverse>:not(:last-child)){--tw-divide-x-reverse:1}.ring-inset{--tw-ring-inset:inset}@media(hover:hover){.group-hover\:text-primary:is(:where(.group):hover *){color:hsl(var(--primary))}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}@media(hover:hover){.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:border-border:hover{border-color:hsl(var(--border))}.hover\:border-primary\/20:hover{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/20:hover{border-color:color-mix(in oklab,hsl(var(--primary)) 20%,transparent)}}.hover\:border-primary\/30:hover{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/30:hover{border-color:color-mix(in oklab,hsl(var(--primary)) 30%,transparent)}}.hover\:border-primary\/40:hover{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/40:hover{border-color:color-mix(in oklab,hsl(var(--primary)) 40%,transparent)}}.hover\:border-primary\/45:hover{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/45:hover{border-color:color-mix(in oklab,hsl(var(--primary)) 45%,transparent)}}.hover\:border-primary\/50:hover{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/50:hover{border-color:color-mix(in oklab,hsl(var(--primary)) 50%,transparent)}}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-amber-400:hover{background-color:var(--color-amber-400)}.hover\:bg-amber-500\/10:hover{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-amber-500\/10:hover{background-color:color-mix(in oklab,var(--color-amber-500) 10%,transparent)}}.hover\:bg-amber-500\/15:hover{background-color:#f99c0026}@supports (color:color-mix(in lab,red,red)){.hover\:bg-amber-500\/15:hover{background-color:color-mix(in oklab,var(--color-amber-500) 15%,transparent)}}.hover\:bg-background\/30:hover{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-background\/30:hover{background-color:color-mix(in oklab,hsl(var(--background)) 30%,transparent)}}.hover\:bg-background\/40:hover{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-background\/40:hover{background-color:color-mix(in oklab,hsl(var(--background)) 40%,transparent)}}.hover\:bg-background\/60:hover{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-background\/60:hover{background-color:color-mix(in oklab,hsl(var(--background)) 60%,transparent)}}.hover\:bg-background\/80:hover{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-background\/80:hover{background-color:color-mix(in oklab,hsl(var(--background)) 80%,transparent)}}.hover\:bg-emerald-500\/10:hover{background-color:#00bb7f1a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-emerald-500\/10:hover{background-color:color-mix(in oklab,var(--color-emerald-500) 10%,transparent)}}.hover\:bg-emerald-500\/15:hover{background-color:#00bb7f26}@supports (color:color-mix(in lab,red,red)){.hover\:bg-emerald-500\/15:hover{background-color:color-mix(in oklab,var(--color-emerald-500) 15%,transparent)}}.hover\:bg-fuchsia-500\/20:hover{background-color:#e12afb33}@supports (color:color-mix(in lab,red,red)){.hover\:bg-fuchsia-500\/20:hover{background-color:color-mix(in oklab,var(--color-fuchsia-500) 20%,transparent)}}.hover\:bg-indigo-500\/15:hover{background-color:#625fff26}@supports (color:color-mix(in lab,red,red)){.hover\:bg-indigo-500\/15:hover{background-color:color-mix(in oklab,var(--color-indigo-500) 15%,transparent)}}.hover\:bg-primary\/5:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/5:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 5%,transparent)}}.hover\:bg-primary\/10:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/10:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 10%,transparent)}}.hover\:bg-primary\/15:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/15:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 15%,transparent)}}.hover\:bg-primary\/20:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/20:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 20%,transparent)}}.hover\:bg-primary\/25:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/25:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 25%,transparent)}}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 90%,transparent)}}.hover\:bg-primary\/95:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/95:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 95%,transparent)}}.hover\:bg-red-400:hover{background-color:var(--color-red-400)}.hover\:bg-red-500\/5:hover{background-color:#fb2c360d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-500\/5:hover{background-color:color-mix(in oklab,var(--color-red-500) 5%,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\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:text-primary:hover,.hover\:text-primary\/80:hover{color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:text-primary\/80:hover{color:color-mix(in oklab,hsl(var(--primary)) 80%,transparent)}}.hover\:text-red-300:hover{color:var(--color-red-300)}.hover\:text-red-400:hover{color:var(--color-red-400)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-90:hover{opacity:.9}}.focus\:border-primary:focus,.focus\:border-primary\/50:focus{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.focus\:border-primary\/50:focus{border-color:color-mix(in oklab,hsl(var(--primary)) 50%,transparent)}}.focus\:ring-1:focus{--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)}.focus\:ring-primary:focus,.focus\:ring-primary\/50:focus{--tw-ring-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.focus\:ring-primary\/50:focus{--tw-ring-color:color-mix(in oklab, hsl(var(--primary)) 50%, transparent)}}.focus\:ring-violet-500\/50:focus{--tw-ring-color:#8d54ff80}@supports (color:color-mix(in lab,red,red)){.focus\:ring-violet-500\/50:focus{--tw-ring-color:color-mix(in oklab, var(--color-violet-500) 50%, transparent)}}.focus-visible\:ring-2:focus-visible{--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-visible\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:cursor-default:disabled{cursor:default}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.aria-selected\:bg-accent[aria-selected=true]{background-color:hsl(var(--accent))}.aria-selected\:text-accent-foreground[aria-selected=true]{color:hsl(var(--accent-foreground))}@media(min-width:40rem){.sm\:w-\[640px\]{width:640px}.sm\:max-w-\[400px\]{max-width:400px}.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\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:self-auto{align-self:auto}.sm\:p-10{padding:calc(var(--spacing) * 10)}}@media(min-width:48rem){.md\:col-span-2{grid-column:span 2/span 2}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-\[170px_1fr\]{grid-template-columns:170px 1fr}}@media(min-width:64rem){.lg\:flex{display:flex}.lg\:w-40{width:calc(var(--spacing) * 40)}.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\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:grid-cols-\[1fr_300px\]{grid-template-columns:1fr 300px}.lg\:flex-row{flex-direction:row}.lg\:items-center{align-items:center}.lg\:items-stretch{align-items:stretch}}}:root{--background:224 30% 6%;--foreground:210 20% 92%;--card:224 25% 10%;--card-foreground:210 20% 94%;--popover:224 28% 9%;--popover-foreground:210 20% 94%;--primary:172 72% 50%;--primary-foreground:224 47% 8%;--muted:220 16% 14%;--muted-foreground:215 14% 64%;--accent:220 16% 16%;--accent-foreground:210 20% 94%;--border:222 18% 23%;--input:222 18% 23%;--ring:172 72% 50%;--radius:.75rem;color-scheme:dark}.light{--background:0 0% 100%;--foreground:222 22% 12%;--card:0 0% 100%;--card-foreground:222 22% 12%;--popover:0 0% 100%;--popover-foreground:222 22% 12%;--primary:172 70% 38%;--primary-foreground:0 0% 100%;--muted:220 14% 95%;--muted-foreground:220 9% 42%;--accent:220 14% 94%;--accent-foreground:222 22% 12%;--border:220 13% 88%;--input:220 13% 88%;--ring:172 66% 50%;color-scheme:light}@keyframes aurora{0%{background-position:0%}50%{background-position:100%}to{background-position:0%}}.animate-aurora{background-size:200% 200%;animation:25s infinite aurora}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:hsl(var(--border));border-radius:9999px}*{border-color:hsl(var(--border) / .85);outline-color:hsl(var(--primary) / .5)}:focus-visible{outline:2px solid hsl(var(--primary) / .7);outline-offset:2px}@media(prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}html,body,#root{height:100%;overflow:hidden}body{background-color:hsl(var(--background));color:hsl(var(--foreground));font-family:var(--font-sans);-webkit-font-smoothing:antialiased;margin:0}@keyframes flow-cyan{0%{stroke-dasharray:6 3;stroke-dashoffset:18px}to{stroke-dasharray:6 3;stroke-dashoffset:0}}.animate-flow-cyan{animation:1.2s linear infinite flow-cyan}.rounded-2xl.border.bg-card\/45{position:relative;overflow:hidden;background-color:hsl(var(--card) / .85)!important;border-color:hsl(var(--border) / .95)!important;transition:transform .3s cubic-bezier(.4,0,.2,1),background-color .3s cubic-bezier(.4,0,.2,1),border-color .3s cubic-bezier(.4,0,.2,1),box-shadow .3s cubic-bezier(.4,0,.2,1)!important;box-shadow:0 10px 30px -15px #00000073,inset 0 1px #ffffff0d!important}.rounded-2xl.border.bg-card\/45:before{content:"";background:linear-gradient(90deg,hsl(var(--primary)),#6366f1,#a855f7);opacity:.75;height:3.5px;position:absolute;top:0;left:0;right:0;transition:opacity .3s!important}.rounded-2xl.border.bg-card\/45:hover{transform:translateY(-3px);background-color:hsl(var(--card) / .92)!important;border-color:hsl(var(--primary) / .35)!important;box-shadow:0 20px 40px -20px #000000a6,0 0 18px 2px hsl(var(--primary) / .05)!important}.rounded-2xl.border.bg-card\/45:hover:before{opacity:1}.rounded-xl.border.bg-card\/45{background-color:hsl(var(--card) / .88)!important;border-color:hsl(var(--border) / .9)!important;transition:background-color .2s,border-color .2s!important}.rounded-xl.border.bg-card\/45:hover{background-color:hsl(var(--card) / .95)!important;border-color:hsl(var(--primary) / .3)!important}aside nav a[class*="bg-primary/15"]:not([class*=justify-center]){background:linear-gradient(90deg,hsl(var(--primary) / .18),#6366f11f)!important;color:hsl(var(--primary))!important;border-left:3.5px solid hsl(var(--primary))!important;border-radius:0 var(--radius) var(--radius) 0!important;padding-left:calc(.75rem - 3.5px)!important;box-shadow:inset 0 1px #ffffff05!important}aside nav a[class*="bg-primary/15"][class*=justify-center]{background:hsl(var(--primary) / .18)!important;color:hsl(var(--primary))!important;box-shadow:0 0 12px 1px hsl(var(--primary) / .1)!important;border:1px solid hsl(var(--primary) / .3)!important}::-webkit-scrollbar-thumb{border-radius:9999px;background:hsl(var(--primary) / .25)!important}::-webkit-scrollbar-thumb:hover{background:hsl(var(--primary) / .5)!important}input:focus,textarea:focus,select:focus{outline:none;border-color:hsl(var(--primary))!important;box-shadow:0 0 0 2px hsl(var(--primary) / .15)!important}@media(min-width:1440px){html{font-size:16.5px}}@media(min-width:1920px){html{font-size:17.5px}}@media(min-width:2560px){html{font-size:19px}}@media(min-width:3440px){html{font-size:20px}}@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-pan-x{syntax:"*";inherits:false}@property --tw-pan-y{syntax:"*";inherits:false}@property --tw-pinch-zoom{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{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-outline-style{syntax:"*";inherits:false;initial-value:solid}@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}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}} diff --git a/frontend/dist/assets/index-KW1c6Ww8.js b/frontend/dist/assets/index-KW1c6Ww8.js new file mode 100644 index 0000000..90631d7 --- /dev/null +++ b/frontend/dist/assets/index-KW1c6Ww8.js @@ -0,0 +1,663 @@ +var VM=Object.defineProperty;var V1=e=>{throw TypeError(e)};var qM=(e,t,r)=>t in e?VM(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var Yl=(e,t,r)=>qM(e,typeof t!="symbol"?t+"":t,r),qp=(e,t,r)=>t.has(e)||V1("Cannot "+r);var L=(e,t,r)=>(qp(e,t,"read from private field"),r?r.call(e):t.get(e)),De=(e,t,r)=>t.has(e)?V1("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,r),ye=(e,t,r,n)=>(qp(e,t,"write to private field"),n?n.call(e,r):t.set(e,r),r),He=(e,t,r)=>(qp(e,t,"access private method"),r);var kd=(e,t,r,n)=>({set _(a){ye(e,t,a,r)},get _(){return L(e,t,n)}});function QM(e,t){for(var r=0;rn[a]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const a of document.querySelectorAll('link[rel="modulepreload"]'))n(a);new MutationObserver(a=>{for(const o of a)if(o.type==="childList")for(const c of o.addedNodes)c.tagName==="LINK"&&c.rel==="modulepreload"&&n(c)}).observe(document,{childList:!0,subtree:!0});function r(a){const o={};return a.integrity&&(o.integrity=a.integrity),a.referrerPolicy&&(o.referrerPolicy=a.referrerPolicy),a.crossOrigin==="use-credentials"?o.credentials="include":a.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(a){if(a.ep)return;a.ep=!0;const o=r(a);fetch(a.href,o)}})();function vy(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Qp={exports:{}},Xl={},Yp={exports:{}},Ue={};/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var q1;function YM(){if(q1)return Ue;q1=1;var e=Symbol.for("react.element"),t=Symbol.for("react.portal"),r=Symbol.for("react.fragment"),n=Symbol.for("react.strict_mode"),a=Symbol.for("react.profiler"),o=Symbol.for("react.provider"),c=Symbol.for("react.context"),u=Symbol.for("react.forward_ref"),f=Symbol.for("react.suspense"),h=Symbol.for("react.memo"),m=Symbol.for("react.lazy"),g=Symbol.iterator;function v(I){return I===null||typeof I!="object"?null:(I=g&&I[g]||I["@@iterator"],typeof I=="function"?I:null)}var b={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},j=Object.assign,k={};function S(I,M,K){this.props=I,this.context=M,this.refs=k,this.updater=K||b}S.prototype.isReactComponent={},S.prototype.setState=function(I,M){if(typeof I!="object"&&typeof I!="function"&&I!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,I,M,"setState")},S.prototype.forceUpdate=function(I){this.updater.enqueueForceUpdate(this,I,"forceUpdate")};function N(){}N.prototype=S.prototype;function E(I,M,K){this.props=I,this.context=M,this.refs=k,this.updater=K||b}var A=E.prototype=new N;A.constructor=E,j(A,S.prototype),A.isPureReactComponent=!0;var P=Array.isArray,_=Object.prototype.hasOwnProperty,O={current:null},D={key:!0,ref:!0,__self:!0,__source:!0};function U(I,M,K){var ne,Z={},me=null,ge=null;if(M!=null)for(ne in M.ref!==void 0&&(ge=M.ref),M.key!==void 0&&(me=""+M.key),M)_.call(M,ne)&&!D.hasOwnProperty(ne)&&(Z[ne]=M[ne]);var Pe=arguments.length-2;if(Pe===1)Z.children=K;else if(1>>1,M=X[I];if(0>>1;Ia(Z,J))mea(ge,Z)?(X[I]=ge,X[me]=J,I=me):(X[I]=Z,X[ne]=J,I=ne);else if(mea(ge,J))X[I]=ge,X[me]=J,I=me;else break e}}return te}function a(X,te){var J=X.sortIndex-te.sortIndex;return J!==0?J:X.id-te.id}if(typeof performance=="object"&&typeof performance.now=="function"){var o=performance;e.unstable_now=function(){return o.now()}}else{var c=Date,u=c.now();e.unstable_now=function(){return c.now()-u}}var f=[],h=[],m=1,g=null,v=3,b=!1,j=!1,k=!1,S=typeof setTimeout=="function"?setTimeout:null,N=typeof clearTimeout=="function"?clearTimeout:null,E=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function A(X){for(var te=r(h);te!==null;){if(te.callback===null)n(h);else if(te.startTime<=X)n(h),te.sortIndex=te.expirationTime,t(f,te);else break;te=r(h)}}function P(X){if(k=!1,A(X),!j)if(r(f)!==null)j=!0,ae(_);else{var te=r(h);te!==null&&se(P,te.startTime-X)}}function _(X,te){j=!1,k&&(k=!1,N(U),U=-1),b=!0;var J=v;try{for(A(te),g=r(f);g!==null&&(!(g.expirationTime>te)||X&&!Y());){var I=g.callback;if(typeof I=="function"){g.callback=null,v=g.priorityLevel;var M=I(g.expirationTime<=te);te=e.unstable_now(),typeof M=="function"?g.callback=M:g===r(f)&&n(f),A(te)}else n(f);g=r(f)}if(g!==null)var K=!0;else{var ne=r(h);ne!==null&&se(P,ne.startTime-te),K=!1}return K}finally{g=null,v=J,b=!1}}var O=!1,D=null,U=-1,B=5,F=-1;function Y(){return!(e.unstable_now()-FX||125I?(X.sortIndex=J,t(h,X),r(f)===null&&X===r(h)&&(k?(N(U),U=-1):k=!0,se(P,J-I))):(X.sortIndex=M,t(f,X),j||b||(j=!0,ae(_))),X},e.unstable_shouldYield=Y,e.unstable_wrapCallback=function(X){var te=v;return function(){var J=v;v=te;try{return X.apply(this,arguments)}finally{v=J}}}})(Jp)),Jp}var J1;function e3(){return J1||(J1=1,Zp.exports=JM()),Zp.exports}/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var ew;function t3(){if(ew)return Sr;ew=1;var e=el(),t=e3();function r(i){for(var s="https://reactjs.org/docs/error-decoder.html?invariant="+i,d=1;d"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),f=Object.prototype.hasOwnProperty,h=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,m={},g={};function v(i){return f.call(g,i)?!0:f.call(m,i)?!1:h.test(i)?g[i]=!0:(m[i]=!0,!1)}function b(i,s,d,p){if(d!==null&&d.type===0)return!1;switch(typeof s){case"function":case"symbol":return!0;case"boolean":return p?!1:d!==null?!d.acceptsBooleans:(i=i.toLowerCase().slice(0,5),i!=="data-"&&i!=="aria-");default:return!1}}function j(i,s,d,p){if(s===null||typeof s>"u"||b(i,s,d,p))return!0;if(p)return!1;if(d!==null)switch(d.type){case 3:return!s;case 4:return s===!1;case 5:return isNaN(s);case 6:return isNaN(s)||1>s}return!1}function k(i,s,d,p,x,w,C){this.acceptsBooleans=s===2||s===3||s===4,this.attributeName=p,this.attributeNamespace=x,this.mustUseProperty=d,this.propertyName=i,this.type=s,this.sanitizeURL=w,this.removeEmptyString=C}var S={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(i){S[i]=new k(i,0,!1,i,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(i){var s=i[0];S[s]=new k(s,1,!1,i[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(i){S[i]=new k(i,2,!1,i.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(i){S[i]=new k(i,2,!1,i,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(i){S[i]=new k(i,3,!1,i.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(i){S[i]=new k(i,3,!0,i,null,!1,!1)}),["capture","download"].forEach(function(i){S[i]=new k(i,4,!1,i,null,!1,!1)}),["cols","rows","size","span"].forEach(function(i){S[i]=new k(i,6,!1,i,null,!1,!1)}),["rowSpan","start"].forEach(function(i){S[i]=new k(i,5,!1,i.toLowerCase(),null,!1,!1)});var N=/[\-:]([a-z])/g;function E(i){return i[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(i){var s=i.replace(N,E);S[s]=new k(s,1,!1,i,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(i){var s=i.replace(N,E);S[s]=new k(s,1,!1,i,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(i){var s=i.replace(N,E);S[s]=new k(s,1,!1,i,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(i){S[i]=new k(i,1,!1,i.toLowerCase(),null,!1,!1)}),S.xlinkHref=new k("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(i){S[i]=new k(i,1,!1,i.toLowerCase(),null,!0,!0)});function A(i,s,d,p){var x=S.hasOwnProperty(s)?S[s]:null;(x!==null?x.type!==0:p||!(2T||x[C]!==w[T]){var R=` +`+x[C].replace(" at new "," at ");return i.displayName&&R.includes("")&&(R=R.replace("",i.displayName)),R}while(1<=C&&0<=T);break}}}finally{K=!1,Error.prepareStackTrace=d}return(i=i?i.displayName||i.name:"")?M(i):""}function Z(i){switch(i.tag){case 5:return M(i.type);case 16:return M("Lazy");case 13:return M("Suspense");case 19:return M("SuspenseList");case 0:case 2:case 15:return i=ne(i.type,!1),i;case 11:return i=ne(i.type.render,!1),i;case 1:return i=ne(i.type,!0),i;default:return""}}function me(i){if(i==null)return null;if(typeof i=="function")return i.displayName||i.name||null;if(typeof i=="string")return i;switch(i){case D:return"Fragment";case O:return"Portal";case B:return"Profiler";case U:return"StrictMode";case pe:return"Suspense";case ue:return"SuspenseList"}if(typeof i=="object")switch(i.$$typeof){case Y:return(i.displayName||"Context")+".Consumer";case F:return(i._context.displayName||"Context")+".Provider";case H:var s=i.render;return i=i.displayName,i||(i=s.displayName||s.name||"",i=i!==""?"ForwardRef("+i+")":"ForwardRef"),i;case he:return s=i.displayName||null,s!==null?s:me(i.type)||"Memo";case ae:s=i._payload,i=i._init;try{return me(i(s))}catch{}}return null}function ge(i){var s=i.type;switch(i.tag){case 24:return"Cache";case 9:return(s.displayName||"Context")+".Consumer";case 10:return(s._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return i=s.render,i=i.displayName||i.name||"",s.displayName||(i!==""?"ForwardRef("+i+")":"ForwardRef");case 7:return"Fragment";case 5:return s;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return me(s);case 8:return s===U?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof s=="function")return s.displayName||s.name||null;if(typeof s=="string")return s}return null}function Pe(i){switch(typeof i){case"boolean":case"number":case"string":case"undefined":return i;case"object":return i;default:return""}}function re(i){var s=i.type;return(i=i.nodeName)&&i.toLowerCase()==="input"&&(s==="checkbox"||s==="radio")}function xe(i){var s=re(i)?"checked":"value",d=Object.getOwnPropertyDescriptor(i.constructor.prototype,s),p=""+i[s];if(!i.hasOwnProperty(s)&&typeof d<"u"&&typeof d.get=="function"&&typeof d.set=="function"){var x=d.get,w=d.set;return Object.defineProperty(i,s,{configurable:!0,get:function(){return x.call(this)},set:function(C){p=""+C,w.call(this,C)}}),Object.defineProperty(i,s,{enumerable:d.enumerable}),{getValue:function(){return p},setValue:function(C){p=""+C},stopTracking:function(){i._valueTracker=null,delete i[s]}}}}function _e(i){i._valueTracker||(i._valueTracker=xe(i))}function ie(i){if(!i)return!1;var s=i._valueTracker;if(!s)return!0;var d=s.getValue(),p="";return i&&(p=re(i)?i.checked?"true":"false":i.value),i=p,i!==d?(s.setValue(i),!0):!1}function Je(i){if(i=i||(typeof document<"u"?document:void 0),typeof i>"u")return null;try{return i.activeElement||i.body}catch{return i.body}}function Fe(i,s){var d=s.checked;return J({},s,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:d??i._wrapperState.initialChecked})}function Oe(i,s){var d=s.defaultValue==null?"":s.defaultValue,p=s.checked!=null?s.checked:s.defaultChecked;d=Pe(s.value!=null?s.value:d),i._wrapperState={initialChecked:p,initialValue:d,controlled:s.type==="checkbox"||s.type==="radio"?s.checked!=null:s.value!=null}}function ut(i,s){s=s.checked,s!=null&&A(i,"checked",s,!1)}function Jt(i,s){ut(i,s);var d=Pe(s.value),p=s.type;if(d!=null)p==="number"?(d===0&&i.value===""||i.value!=d)&&(i.value=""+d):i.value!==""+d&&(i.value=""+d);else if(p==="submit"||p==="reset"){i.removeAttribute("value");return}s.hasOwnProperty("value")?ke(i,s.type,d):s.hasOwnProperty("defaultValue")&&ke(i,s.type,Pe(s.defaultValue)),s.checked==null&&s.defaultChecked!=null&&(i.defaultChecked=!!s.defaultChecked)}function W(i,s,d){if(s.hasOwnProperty("value")||s.hasOwnProperty("defaultValue")){var p=s.type;if(!(p!=="submit"&&p!=="reset"||s.value!==void 0&&s.value!==null))return;s=""+i._wrapperState.initialValue,d||s===i.value||(i.value=s),i.defaultValue=s}d=i.name,d!==""&&(i.name=""),i.defaultChecked=!!i._wrapperState.initialChecked,d!==""&&(i.name=d)}function ke(i,s,d){(s!=="number"||Je(i.ownerDocument)!==i)&&(d==null?i.defaultValue=""+i._wrapperState.initialValue:i.defaultValue!==""+d&&(i.defaultValue=""+d))}var Ae=Array.isArray;function Be(i,s,d,p){if(i=i.options,s){s={};for(var x=0;x"+s.valueOf().toString()+"",s=Ii.firstChild;i.firstChild;)i.removeChild(i.firstChild);for(;s.firstChild;)i.appendChild(s.firstChild)}});function Ti(i,s){if(s){var d=i.firstChild;if(d&&d===i.lastChild&&d.nodeType===3){d.nodeValue=s;return}}i.textContent=s}var $={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Le=["Webkit","ms","Moz","O"];Object.keys($).forEach(function(i){Le.forEach(function(s){s=s+i.charAt(0).toUpperCase()+i.substring(1),$[s]=$[i]})});function cr(i,s,d){return s==null||typeof s=="boolean"||s===""?"":d||typeof s!="number"||s===0||$.hasOwnProperty(i)&&$[i]?(""+s).trim():s+"px"}function hc(i,s){i=i.style;for(var d in s)if(s.hasOwnProperty(d)){var p=d.indexOf("--")===0,x=cr(d,s[d],p);d==="float"&&(d="cssFloat"),p?i.setProperty(d,x):i[d]=x}}var mc=J({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function _r(i,s){if(s){if(mc[i]&&(s.children!=null||s.dangerouslySetInnerHTML!=null))throw Error(r(137,i));if(s.dangerouslySetInnerHTML!=null){if(s.children!=null)throw Error(r(60));if(typeof s.dangerouslySetInnerHTML!="object"||!("__html"in s.dangerouslySetInnerHTML))throw Error(r(61))}if(s.style!=null&&typeof s.style!="object")throw Error(r(62))}}function sm(i,s){if(i.indexOf("-")===-1)return typeof s.is=="string";switch(i){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var lm=null;function um(i){return i=i.target||i.srcElement||window,i.correspondingUseElement&&(i=i.correspondingUseElement),i.nodeType===3?i.parentNode:i}var cm=null,To=null,Do=null;function cx(i){if(i=Dl(i)){if(typeof cm!="function")throw Error(r(280));var s=i.stateNode;s&&(s=Lc(s),cm(i.stateNode,i.type,s))}}function dx(i){To?Do?Do.push(i):Do=[i]:To=i}function fx(){if(To){var i=To,s=Do;if(Do=To=null,cx(i),s)for(i=0;i>>=0,i===0?32:31-(u_(i)/c_|0)|0}var xc=64,bc=4194304;function vl(i){switch(i&-i){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: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 i&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return i&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return i}}function wc(i,s){var d=i.pendingLanes;if(d===0)return 0;var p=0,x=i.suspendedLanes,w=i.pingedLanes,C=d&268435455;if(C!==0){var T=C&~x;T!==0?p=vl(T):(w&=C,w!==0&&(p=vl(w)))}else C=d&~x,C!==0?p=vl(C):w!==0&&(p=vl(w));if(p===0)return 0;if(s!==0&&s!==p&&(s&x)===0&&(x=p&-p,w=s&-s,x>=w||x===16&&(w&4194240)!==0))return s;if((p&4)!==0&&(p|=d&16),s=i.entangledLanes,s!==0)for(i=i.entanglements,s&=p;0d;d++)s.push(i);return s}function yl(i,s,d){i.pendingLanes|=s,s!==536870912&&(i.suspendedLanes=0,i.pingedLanes=0),i=i.eventTimes,s=31-un(s),i[s]=d}function m_(i,s){var d=i.pendingLanes&~s;i.pendingLanes=s,i.suspendedLanes=0,i.pingedLanes=0,i.expiredLanes&=s,i.mutableReadLanes&=s,i.entangledLanes&=s,s=i.entanglements;var p=i.eventTimes;for(i=i.expirationTimes;0=El),Fx=" ",Bx=!1;function Ux(i,s){switch(i){case"keyup":return U_.indexOf(s.keyCode)!==-1;case"keydown":return s.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Hx(i){return i=i.detail,typeof i=="object"&&"data"in i?i.data:null}var $o=!1;function W_(i,s){switch(i){case"compositionend":return Hx(s);case"keypress":return s.which!==32?null:(Bx=!0,Fx);case"textInput":return i=s.data,i===Fx&&Bx?null:i;default:return null}}function K_(i,s){if($o)return i==="compositionend"||!Cm&&Ux(i,s)?(i=Tx(),Ec=km=zi=null,$o=!1,i):null;switch(i){case"paste":return null;case"keypress":if(!(s.ctrlKey||s.altKey||s.metaKey)||s.ctrlKey&&s.altKey){if(s.char&&1=s)return{node:d,offset:s-i};i=p}e:{for(;d;){if(d.nextSibling){d=d.nextSibling;break e}d=d.parentNode}d=void 0}d=Yx(d)}}function Zx(i,s){return i&&s?i===s?!0:i&&i.nodeType===3?!1:s&&s.nodeType===3?Zx(i,s.parentNode):"contains"in i?i.contains(s):i.compareDocumentPosition?!!(i.compareDocumentPosition(s)&16):!1:!1}function Jx(){for(var i=window,s=Je();s instanceof i.HTMLIFrameElement;){try{var d=typeof s.contentWindow.location.href=="string"}catch{d=!1}if(d)i=s.contentWindow;else break;s=Je(i.document)}return s}function _m(i){var s=i&&i.nodeName&&i.nodeName.toLowerCase();return s&&(s==="input"&&(i.type==="text"||i.type==="search"||i.type==="tel"||i.type==="url"||i.type==="password")||s==="textarea"||i.contentEditable==="true")}function eM(i){var s=Jx(),d=i.focusedElem,p=i.selectionRange;if(s!==d&&d&&d.ownerDocument&&Zx(d.ownerDocument.documentElement,d)){if(p!==null&&_m(d)){if(s=p.start,i=p.end,i===void 0&&(i=s),"selectionStart"in d)d.selectionStart=s,d.selectionEnd=Math.min(i,d.value.length);else if(i=(s=d.ownerDocument||document)&&s.defaultView||window,i.getSelection){i=i.getSelection();var x=d.textContent.length,w=Math.min(p.start,x);p=p.end===void 0?w:Math.min(p.end,x),!i.extend&&w>p&&(x=p,p=w,w=x),x=Xx(d,w);var C=Xx(d,p);x&&C&&(i.rangeCount!==1||i.anchorNode!==x.node||i.anchorOffset!==x.offset||i.focusNode!==C.node||i.focusOffset!==C.offset)&&(s=s.createRange(),s.setStart(x.node,x.offset),i.removeAllRanges(),w>p?(i.addRange(s),i.extend(C.node,C.offset)):(s.setEnd(C.node,C.offset),i.addRange(s)))}}for(s=[],i=d;i=i.parentNode;)i.nodeType===1&&s.push({element:i,left:i.scrollLeft,top:i.scrollTop});for(typeof d.focus=="function"&&d.focus(),d=0;d=document.documentMode,zo=null,Mm=null,Ol=null,Im=!1;function eb(i,s,d){var p=d.window===d?d.document:d.nodeType===9?d:d.ownerDocument;Im||zo==null||zo!==Je(p)||(p=zo,"selectionStart"in p&&_m(p)?p={start:p.selectionStart,end:p.selectionEnd}:(p=(p.ownerDocument&&p.ownerDocument.defaultView||window).getSelection(),p={anchorNode:p.anchorNode,anchorOffset:p.anchorOffset,focusNode:p.focusNode,focusOffset:p.focusOffset}),Ol&&Pl(Ol,p)||(Ol=p,p=Tc(Mm,"onSelect"),0Wo||(i.current=Km[Wo],Km[Wo]=null,Wo--)}function rt(i,s){Wo++,Km[Wo]=i.current,i.current=s}var Hi={},er=Ui(Hi),xr=Ui(!1),_a=Hi;function Ko(i,s){var d=i.type.contextTypes;if(!d)return Hi;var p=i.stateNode;if(p&&p.__reactInternalMemoizedUnmaskedChildContext===s)return p.__reactInternalMemoizedMaskedChildContext;var x={},w;for(w in d)x[w]=s[w];return p&&(i=i.stateNode,i.__reactInternalMemoizedUnmaskedChildContext=s,i.__reactInternalMemoizedMaskedChildContext=x),x}function br(i){return i=i.childContextTypes,i!=null}function $c(){at(xr),at(er)}function pb(i,s,d){if(er.current!==Hi)throw Error(r(168));rt(er,s),rt(xr,d)}function gb(i,s,d){var p=i.stateNode;if(s=s.childContextTypes,typeof p.getChildContext!="function")return d;p=p.getChildContext();for(var x in p)if(!(x in s))throw Error(r(108,ge(i)||"Unknown",x));return J({},d,p)}function zc(i){return i=(i=i.stateNode)&&i.__reactInternalMemoizedMergedChildContext||Hi,_a=er.current,rt(er,i),rt(xr,xr.current),!0}function vb(i,s,d){var p=i.stateNode;if(!p)throw Error(r(169));d?(i=gb(i,s,_a),p.__reactInternalMemoizedMergedChildContext=i,at(xr),at(er),rt(er,i)):at(xr),rt(xr,d)}var ti=null,Fc=!1,Gm=!1;function yb(i){ti===null?ti=[i]:ti.push(i)}function fM(i){Fc=!0,yb(i)}function Wi(){if(!Gm&&ti!==null){Gm=!0;var i=0,s=Ze;try{var d=ti;for(Ze=1;i>=C,x-=C,ri=1<<32-un(s)+x|d<Re?(Tt=Te,Te=null):Tt=Te.sibling;var Qe=oe(G,Te,V[Re],fe);if(Qe===null){Te===null&&(Te=Tt);break}i&&Te&&Qe.alternate===null&&s(G,Te),z=w(Qe,z,Re),Ie===null?Ce=Qe:Ie.sibling=Qe,Ie=Qe,Te=Tt}if(Re===V.length)return d(G,Te),ct&&Ia(G,Re),Ce;if(Te===null){for(;ReRe?(Tt=Te,Te=null):Tt=Te.sibling;var Ji=oe(G,Te,Qe.value,fe);if(Ji===null){Te===null&&(Te=Tt);break}i&&Te&&Ji.alternate===null&&s(G,Te),z=w(Ji,z,Re),Ie===null?Ce=Ji:Ie.sibling=Ji,Ie=Ji,Te=Tt}if(Qe.done)return d(G,Te),ct&&Ia(G,Re),Ce;if(Te===null){for(;!Qe.done;Re++,Qe=V.next())Qe=ce(G,Qe.value,fe),Qe!==null&&(z=w(Qe,z,Re),Ie===null?Ce=Qe:Ie.sibling=Qe,Ie=Qe);return ct&&Ia(G,Re),Ce}for(Te=p(G,Te);!Qe.done;Re++,Qe=V.next())Qe=ve(Te,G,Re,Qe.value,fe),Qe!==null&&(i&&Qe.alternate!==null&&Te.delete(Qe.key===null?Re:Qe.key),z=w(Qe,z,Re),Ie===null?Ce=Qe:Ie.sibling=Qe,Ie=Qe);return i&&Te.forEach(function(GM){return s(G,GM)}),ct&&Ia(G,Re),Ce}function wt(G,z,V,fe){if(typeof V=="object"&&V!==null&&V.type===D&&V.key===null&&(V=V.props.children),typeof V=="object"&&V!==null){switch(V.$$typeof){case _:e:{for(var Ce=V.key,Ie=z;Ie!==null;){if(Ie.key===Ce){if(Ce=V.type,Ce===D){if(Ie.tag===7){d(G,Ie.sibling),z=x(Ie,V.props.children),z.return=G,G=z;break e}}else if(Ie.elementType===Ce||typeof Ce=="object"&&Ce!==null&&Ce.$$typeof===ae&&Sb(Ce)===Ie.type){d(G,Ie.sibling),z=x(Ie,V.props),z.ref=Rl(G,Ie,V),z.return=G,G=z;break e}d(G,Ie);break}else s(G,Ie);Ie=Ie.sibling}V.type===D?(z=Ba(V.props.children,G.mode,fe,V.key),z.return=G,G=z):(fe=md(V.type,V.key,V.props,null,G.mode,fe),fe.ref=Rl(G,z,V),fe.return=G,G=fe)}return C(G);case O:e:{for(Ie=V.key;z!==null;){if(z.key===Ie)if(z.tag===4&&z.stateNode.containerInfo===V.containerInfo&&z.stateNode.implementation===V.implementation){d(G,z.sibling),z=x(z,V.children||[]),z.return=G,G=z;break e}else{d(G,z);break}else s(G,z);z=z.sibling}z=Hp(V,G.mode,fe),z.return=G,G=z}return C(G);case ae:return Ie=V._init,wt(G,z,Ie(V._payload),fe)}if(Ae(V))return je(G,z,V,fe);if(te(V))return Ne(G,z,V,fe);Wc(G,V)}return typeof V=="string"&&V!==""||typeof V=="number"?(V=""+V,z!==null&&z.tag===6?(d(G,z.sibling),z=x(z,V),z.return=G,G=z):(d(G,z),z=Up(V,G.mode,fe),z.return=G,G=z),C(G)):d(G,z)}return wt}var Qo=Nb(!0),Eb=Nb(!1),Kc=Ui(null),Gc=null,Yo=null,Zm=null;function Jm(){Zm=Yo=Gc=null}function ep(i){var s=Kc.current;at(Kc),i._currentValue=s}function tp(i,s,d){for(;i!==null;){var p=i.alternate;if((i.childLanes&s)!==s?(i.childLanes|=s,p!==null&&(p.childLanes|=s)):p!==null&&(p.childLanes&s)!==s&&(p.childLanes|=s),i===d)break;i=i.return}}function Xo(i,s){Gc=i,Zm=Yo=null,i=i.dependencies,i!==null&&i.firstContext!==null&&((i.lanes&s)!==0&&(wr=!0),i.firstContext=null)}function Vr(i){var s=i._currentValue;if(Zm!==i)if(i={context:i,memoizedValue:s,next:null},Yo===null){if(Gc===null)throw Error(r(308));Yo=i,Gc.dependencies={lanes:0,firstContext:i}}else Yo=Yo.next=i;return s}var Ta=null;function rp(i){Ta===null?Ta=[i]:Ta.push(i)}function Ab(i,s,d,p){var x=s.interleaved;return x===null?(d.next=d,rp(s)):(d.next=x.next,x.next=d),s.interleaved=d,ii(i,p)}function ii(i,s){i.lanes|=s;var d=i.alternate;for(d!==null&&(d.lanes|=s),d=i,i=i.return;i!==null;)i.childLanes|=s,d=i.alternate,d!==null&&(d.childLanes|=s),d=i,i=i.return;return d.tag===3?d.stateNode:null}var Ki=!1;function np(i){i.updateQueue={baseState:i.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Cb(i,s){i=i.updateQueue,s.updateQueue===i&&(s.updateQueue={baseState:i.baseState,firstBaseUpdate:i.firstBaseUpdate,lastBaseUpdate:i.lastBaseUpdate,shared:i.shared,effects:i.effects})}function ai(i,s){return{eventTime:i,lane:s,tag:0,payload:null,callback:null,next:null}}function Gi(i,s,d){var p=i.updateQueue;if(p===null)return null;if(p=p.shared,(qe&2)!==0){var x=p.pending;return x===null?s.next=s:(s.next=x.next,x.next=s),p.pending=s,ii(i,d)}return x=p.interleaved,x===null?(s.next=s,rp(p)):(s.next=x.next,x.next=s),p.interleaved=s,ii(i,d)}function Vc(i,s,d){if(s=s.updateQueue,s!==null&&(s=s.shared,(d&4194240)!==0)){var p=s.lanes;p&=i.pendingLanes,d|=p,s.lanes=d,vm(i,d)}}function Pb(i,s){var d=i.updateQueue,p=i.alternate;if(p!==null&&(p=p.updateQueue,d===p)){var x=null,w=null;if(d=d.firstBaseUpdate,d!==null){do{var C={eventTime:d.eventTime,lane:d.lane,tag:d.tag,payload:d.payload,callback:d.callback,next:null};w===null?x=w=C:w=w.next=C,d=d.next}while(d!==null);w===null?x=w=s:w=w.next=s}else x=w=s;d={baseState:p.baseState,firstBaseUpdate:x,lastBaseUpdate:w,shared:p.shared,effects:p.effects},i.updateQueue=d;return}i=d.lastBaseUpdate,i===null?d.firstBaseUpdate=s:i.next=s,d.lastBaseUpdate=s}function qc(i,s,d,p){var x=i.updateQueue;Ki=!1;var w=x.firstBaseUpdate,C=x.lastBaseUpdate,T=x.shared.pending;if(T!==null){x.shared.pending=null;var R=T,Q=R.next;R.next=null,C===null?w=Q:C.next=Q,C=R;var le=i.alternate;le!==null&&(le=le.updateQueue,T=le.lastBaseUpdate,T!==C&&(T===null?le.firstBaseUpdate=Q:T.next=Q,le.lastBaseUpdate=R))}if(w!==null){var ce=x.baseState;C=0,le=Q=R=null,T=w;do{var oe=T.lane,ve=T.eventTime;if((p&oe)===oe){le!==null&&(le=le.next={eventTime:ve,lane:0,tag:T.tag,payload:T.payload,callback:T.callback,next:null});e:{var je=i,Ne=T;switch(oe=s,ve=d,Ne.tag){case 1:if(je=Ne.payload,typeof je=="function"){ce=je.call(ve,ce,oe);break e}ce=je;break e;case 3:je.flags=je.flags&-65537|128;case 0:if(je=Ne.payload,oe=typeof je=="function"?je.call(ve,ce,oe):je,oe==null)break e;ce=J({},ce,oe);break e;case 2:Ki=!0}}T.callback!==null&&T.lane!==0&&(i.flags|=64,oe=x.effects,oe===null?x.effects=[T]:oe.push(T))}else ve={eventTime:ve,lane:oe,tag:T.tag,payload:T.payload,callback:T.callback,next:null},le===null?(Q=le=ve,R=ce):le=le.next=ve,C|=oe;if(T=T.next,T===null){if(T=x.shared.pending,T===null)break;oe=T,T=oe.next,oe.next=null,x.lastBaseUpdate=oe,x.shared.pending=null}}while(!0);if(le===null&&(R=ce),x.baseState=R,x.firstBaseUpdate=Q,x.lastBaseUpdate=le,s=x.shared.interleaved,s!==null){x=s;do C|=x.lane,x=x.next;while(x!==s)}else w===null&&(x.shared.lanes=0);La|=C,i.lanes=C,i.memoizedState=ce}}function Ob(i,s,d){if(i=s.effects,s.effects=null,i!==null)for(s=0;sd?d:4,i(!0);var p=lp.transition;lp.transition={};try{i(!1),s()}finally{Ze=d,lp.transition=p}}function Qb(){return qr().memoizedState}function gM(i,s,d){var p=Yi(i);if(d={lane:p,action:d,hasEagerState:!1,eagerState:null,next:null},Yb(i))Xb(s,d);else if(d=Ab(i,s,d,p),d!==null){var x=fr();pn(d,i,p,x),Zb(d,s,p)}}function vM(i,s,d){var p=Yi(i),x={lane:p,action:d,hasEagerState:!1,eagerState:null,next:null};if(Yb(i))Xb(s,x);else{var w=i.alternate;if(i.lanes===0&&(w===null||w.lanes===0)&&(w=s.lastRenderedReducer,w!==null))try{var C=s.lastRenderedState,T=w(C,d);if(x.hasEagerState=!0,x.eagerState=T,cn(T,C)){var R=s.interleaved;R===null?(x.next=x,rp(s)):(x.next=R.next,R.next=x),s.interleaved=x;return}}catch{}finally{}d=Ab(i,s,x,p),d!==null&&(x=fr(),pn(d,i,p,x),Zb(d,s,p))}}function Yb(i){var s=i.alternate;return i===pt||s!==null&&s===pt}function Xb(i,s){Fl=Xc=!0;var d=i.pending;d===null?s.next=s:(s.next=d.next,d.next=s),i.pending=s}function Zb(i,s,d){if((d&4194240)!==0){var p=s.lanes;p&=i.pendingLanes,d|=p,s.lanes=d,vm(i,d)}}var ed={readContext:Vr,useCallback:tr,useContext:tr,useEffect:tr,useImperativeHandle:tr,useInsertionEffect:tr,useLayoutEffect:tr,useMemo:tr,useReducer:tr,useRef:tr,useState:tr,useDebugValue:tr,useDeferredValue:tr,useTransition:tr,useMutableSource:tr,useSyncExternalStore:tr,useId:tr,unstable_isNewReconciler:!1},yM={readContext:Vr,useCallback:function(i,s){return Pn().memoizedState=[i,s===void 0?null:s],i},useContext:Vr,useEffect:Bb,useImperativeHandle:function(i,s,d){return d=d!=null?d.concat([i]):null,Zc(4194308,4,Wb.bind(null,s,i),d)},useLayoutEffect:function(i,s){return Zc(4194308,4,i,s)},useInsertionEffect:function(i,s){return Zc(4,2,i,s)},useMemo:function(i,s){var d=Pn();return s=s===void 0?null:s,i=i(),d.memoizedState=[i,s],i},useReducer:function(i,s,d){var p=Pn();return s=d!==void 0?d(s):s,p.memoizedState=p.baseState=s,i={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:i,lastRenderedState:s},p.queue=i,i=i.dispatch=gM.bind(null,pt,i),[p.memoizedState,i]},useRef:function(i){var s=Pn();return i={current:i},s.memoizedState=i},useState:zb,useDebugValue:pp,useDeferredValue:function(i){return Pn().memoizedState=i},useTransition:function(){var i=zb(!1),s=i[0];return i=pM.bind(null,i[1]),Pn().memoizedState=i,[s,i]},useMutableSource:function(){},useSyncExternalStore:function(i,s,d){var p=pt,x=Pn();if(ct){if(d===void 0)throw Error(r(407));d=d()}else{if(d=s(),It===null)throw Error(r(349));(Ra&30)!==0||Tb(p,s,d)}x.memoizedState=d;var w={value:d,getSnapshot:s};return x.queue=w,Bb(Rb.bind(null,p,w,i),[i]),p.flags|=2048,Hl(9,Db.bind(null,p,w,d,s),void 0,null),d},useId:function(){var i=Pn(),s=It.identifierPrefix;if(ct){var d=ni,p=ri;d=(p&~(1<<32-un(p)-1)).toString(32)+d,s=":"+s+"R"+d,d=Bl++,0<\/script>",i=i.removeChild(i.firstChild)):typeof p.is=="string"?i=C.createElement(d,{is:p.is}):(i=C.createElement(d),d==="select"&&(C=i,p.multiple?C.multiple=!0:p.size&&(C.size=p.size))):i=C.createElementNS(i,d),i[An]=s,i[Tl]=p,y1(i,s,!1,!1),s.stateNode=i;e:{switch(C=sm(d,p),d){case"dialog":it("cancel",i),it("close",i),x=p;break;case"iframe":case"object":case"embed":it("load",i),x=p;break;case"video":case"audio":for(x=0;x<_l.length;x++)it(_l[x],i);x=p;break;case"source":it("error",i),x=p;break;case"img":case"image":case"link":it("error",i),it("load",i),x=p;break;case"details":it("toggle",i),x=p;break;case"input":Oe(i,p),x=Fe(i,p),it("invalid",i);break;case"option":x=p;break;case"select":i._wrapperState={wasMultiple:!!p.multiple},x=J({},p,{value:void 0}),it("invalid",i);break;case"textarea":Ut(i,p),x=et(i,p),it("invalid",i);break;default:x=p}_r(d,x),T=x;for(w in T)if(T.hasOwnProperty(w)){var R=T[w];w==="style"?hc(i,R):w==="dangerouslySetInnerHTML"?(R=R?R.__html:void 0,R!=null&&Or(i,R)):w==="children"?typeof R=="string"?(d!=="textarea"||R!=="")&&Ti(i,R):typeof R=="number"&&Ti(i,""+R):w!=="suppressContentEditableWarning"&&w!=="suppressHydrationWarning"&&w!=="autoFocus"&&(a.hasOwnProperty(w)?R!=null&&w==="onScroll"&&it("scroll",i):R!=null&&A(i,w,R,C))}switch(d){case"input":_e(i),W(i,p,!1);break;case"textarea":_e(i),ur(i);break;case"option":p.value!=null&&i.setAttribute("value",""+Pe(p.value));break;case"select":i.multiple=!!p.multiple,w=p.value,w!=null?Be(i,!!p.multiple,w,!1):p.defaultValue!=null&&Be(i,!!p.multiple,p.defaultValue,!0);break;default:typeof x.onClick=="function"&&(i.onclick=Rc)}switch(d){case"button":case"input":case"select":case"textarea":p=!!p.autoFocus;break e;case"img":p=!0;break e;default:p=!1}}p&&(s.flags|=4)}s.ref!==null&&(s.flags|=512,s.flags|=2097152)}return rr(s),null;case 6:if(i&&s.stateNode!=null)b1(i,s,i.memoizedProps,p);else{if(typeof p!="string"&&s.stateNode===null)throw Error(r(166));if(d=Da(zl.current),Da(Cn.current),Hc(s)){if(p=s.stateNode,d=s.memoizedProps,p[An]=s,(w=p.nodeValue!==d)&&(i=Ir,i!==null))switch(i.tag){case 3:Dc(p.nodeValue,d,(i.mode&1)!==0);break;case 5:i.memoizedProps.suppressHydrationWarning!==!0&&Dc(p.nodeValue,d,(i.mode&1)!==0)}w&&(s.flags|=4)}else p=(d.nodeType===9?d:d.ownerDocument).createTextNode(p),p[An]=s,s.stateNode=p}return rr(s),null;case 13:if(at(mt),p=s.memoizedState,i===null||i.memoizedState!==null&&i.memoizedState.dehydrated!==null){if(ct&&Tr!==null&&(s.mode&1)!==0&&(s.flags&128)===0)jb(),qo(),s.flags|=98560,w=!1;else if(w=Hc(s),p!==null&&p.dehydrated!==null){if(i===null){if(!w)throw Error(r(318));if(w=s.memoizedState,w=w!==null?w.dehydrated:null,!w)throw Error(r(317));w[An]=s}else qo(),(s.flags&128)===0&&(s.memoizedState=null),s.flags|=4;rr(s),w=!1}else dn!==null&&(Lp(dn),dn=null),w=!0;if(!w)return s.flags&65536?s:null}return(s.flags&128)!==0?(s.lanes=d,s):(p=p!==null,p!==(i!==null&&i.memoizedState!==null)&&p&&(s.child.flags|=8192,(s.mode&1)!==0&&(i===null||(mt.current&1)!==0?At===0&&(At=3):Fp())),s.updateQueue!==null&&(s.flags|=4),rr(s),null);case 4:return Zo(),Ep(i,s),i===null&&Ml(s.stateNode.containerInfo),rr(s),null;case 10:return ep(s.type._context),rr(s),null;case 17:return br(s.type)&&$c(),rr(s),null;case 19:if(at(mt),w=s.memoizedState,w===null)return rr(s),null;if(p=(s.flags&128)!==0,C=w.rendering,C===null)if(p)Wl(w,!1);else{if(At!==0||i!==null&&(i.flags&128)!==0)for(i=s.child;i!==null;){if(C=Qc(i),C!==null){for(s.flags|=128,Wl(w,!1),p=C.updateQueue,p!==null&&(s.updateQueue=p,s.flags|=4),s.subtreeFlags=0,p=d,d=s.child;d!==null;)w=d,i=p,w.flags&=14680066,C=w.alternate,C===null?(w.childLanes=0,w.lanes=i,w.child=null,w.subtreeFlags=0,w.memoizedProps=null,w.memoizedState=null,w.updateQueue=null,w.dependencies=null,w.stateNode=null):(w.childLanes=C.childLanes,w.lanes=C.lanes,w.child=C.child,w.subtreeFlags=0,w.deletions=null,w.memoizedProps=C.memoizedProps,w.memoizedState=C.memoizedState,w.updateQueue=C.updateQueue,w.type=C.type,i=C.dependencies,w.dependencies=i===null?null:{lanes:i.lanes,firstContext:i.firstContext}),d=d.sibling;return rt(mt,mt.current&1|2),s.child}i=i.sibling}w.tail!==null&&bt()>rs&&(s.flags|=128,p=!0,Wl(w,!1),s.lanes=4194304)}else{if(!p)if(i=Qc(C),i!==null){if(s.flags|=128,p=!0,d=i.updateQueue,d!==null&&(s.updateQueue=d,s.flags|=4),Wl(w,!0),w.tail===null&&w.tailMode==="hidden"&&!C.alternate&&!ct)return rr(s),null}else 2*bt()-w.renderingStartTime>rs&&d!==1073741824&&(s.flags|=128,p=!0,Wl(w,!1),s.lanes=4194304);w.isBackwards?(C.sibling=s.child,s.child=C):(d=w.last,d!==null?d.sibling=C:s.child=C,w.last=C)}return w.tail!==null?(s=w.tail,w.rendering=s,w.tail=s.sibling,w.renderingStartTime=bt(),s.sibling=null,d=mt.current,rt(mt,p?d&1|2:d&1),s):(rr(s),null);case 22:case 23:return zp(),p=s.memoizedState!==null,i!==null&&i.memoizedState!==null!==p&&(s.flags|=8192),p&&(s.mode&1)!==0?(Dr&1073741824)!==0&&(rr(s),s.subtreeFlags&6&&(s.flags|=8192)):rr(s),null;case 24:return null;case 25:return null}throw Error(r(156,s.tag))}function EM(i,s){switch(qm(s),s.tag){case 1:return br(s.type)&&$c(),i=s.flags,i&65536?(s.flags=i&-65537|128,s):null;case 3:return Zo(),at(xr),at(er),sp(),i=s.flags,(i&65536)!==0&&(i&128)===0?(s.flags=i&-65537|128,s):null;case 5:return ap(s),null;case 13:if(at(mt),i=s.memoizedState,i!==null&&i.dehydrated!==null){if(s.alternate===null)throw Error(r(340));qo()}return i=s.flags,i&65536?(s.flags=i&-65537|128,s):null;case 19:return at(mt),null;case 4:return Zo(),null;case 10:return ep(s.type._context),null;case 22:case 23:return zp(),null;case 24:return null;default:return null}}var id=!1,nr=!1,AM=typeof WeakSet=="function"?WeakSet:Set,be=null;function es(i,s){var d=i.ref;if(d!==null)if(typeof d=="function")try{d(null)}catch(p){gt(i,s,p)}else d.current=null}function Ap(i,s,d){try{d()}catch(p){gt(i,s,p)}}var w1=!1;function CM(i,s){if(zm=Sc,i=Jx(),_m(i)){if("selectionStart"in i)var d={start:i.selectionStart,end:i.selectionEnd};else e:{d=(d=i.ownerDocument)&&d.defaultView||window;var p=d.getSelection&&d.getSelection();if(p&&p.rangeCount!==0){d=p.anchorNode;var x=p.anchorOffset,w=p.focusNode;p=p.focusOffset;try{d.nodeType,w.nodeType}catch{d=null;break e}var C=0,T=-1,R=-1,Q=0,le=0,ce=i,oe=null;t:for(;;){for(var ve;ce!==d||x!==0&&ce.nodeType!==3||(T=C+x),ce!==w||p!==0&&ce.nodeType!==3||(R=C+p),ce.nodeType===3&&(C+=ce.nodeValue.length),(ve=ce.firstChild)!==null;)oe=ce,ce=ve;for(;;){if(ce===i)break t;if(oe===d&&++Q===x&&(T=C),oe===w&&++le===p&&(R=C),(ve=ce.nextSibling)!==null)break;ce=oe,oe=ce.parentNode}ce=ve}d=T===-1||R===-1?null:{start:T,end:R}}else d=null}d=d||{start:0,end:0}}else d=null;for(Fm={focusedElem:i,selectionRange:d},Sc=!1,be=s;be!==null;)if(s=be,i=s.child,(s.subtreeFlags&1028)!==0&&i!==null)i.return=s,be=i;else for(;be!==null;){s=be;try{var je=s.alternate;if((s.flags&1024)!==0)switch(s.tag){case 0:case 11:case 15:break;case 1:if(je!==null){var Ne=je.memoizedProps,wt=je.memoizedState,G=s.stateNode,z=G.getSnapshotBeforeUpdate(s.elementType===s.type?Ne:fn(s.type,Ne),wt);G.__reactInternalSnapshotBeforeUpdate=z}break;case 3:var V=s.stateNode.containerInfo;V.nodeType===1?V.textContent="":V.nodeType===9&&V.documentElement&&V.removeChild(V.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(r(163))}}catch(fe){gt(s,s.return,fe)}if(i=s.sibling,i!==null){i.return=s.return,be=i;break}be=s.return}return je=w1,w1=!1,je}function Kl(i,s,d){var p=s.updateQueue;if(p=p!==null?p.lastEffect:null,p!==null){var x=p=p.next;do{if((x.tag&i)===i){var w=x.destroy;x.destroy=void 0,w!==void 0&&Ap(s,d,w)}x=x.next}while(x!==p)}}function ad(i,s){if(s=s.updateQueue,s=s!==null?s.lastEffect:null,s!==null){var d=s=s.next;do{if((d.tag&i)===i){var p=d.create;d.destroy=p()}d=d.next}while(d!==s)}}function Cp(i){var s=i.ref;if(s!==null){var d=i.stateNode;switch(i.tag){case 5:i=d;break;default:i=d}typeof s=="function"?s(i):s.current=i}}function k1(i){var s=i.alternate;s!==null&&(i.alternate=null,k1(s)),i.child=null,i.deletions=null,i.sibling=null,i.tag===5&&(s=i.stateNode,s!==null&&(delete s[An],delete s[Tl],delete s[Wm],delete s[cM],delete s[dM])),i.stateNode=null,i.return=null,i.dependencies=null,i.memoizedProps=null,i.memoizedState=null,i.pendingProps=null,i.stateNode=null,i.updateQueue=null}function j1(i){return i.tag===5||i.tag===3||i.tag===4}function S1(i){e:for(;;){for(;i.sibling===null;){if(i.return===null||j1(i.return))return null;i=i.return}for(i.sibling.return=i.return,i=i.sibling;i.tag!==5&&i.tag!==6&&i.tag!==18;){if(i.flags&2||i.child===null||i.tag===4)continue e;i.child.return=i,i=i.child}if(!(i.flags&2))return i.stateNode}}function Pp(i,s,d){var p=i.tag;if(p===5||p===6)i=i.stateNode,s?d.nodeType===8?d.parentNode.insertBefore(i,s):d.insertBefore(i,s):(d.nodeType===8?(s=d.parentNode,s.insertBefore(i,d)):(s=d,s.appendChild(i)),d=d._reactRootContainer,d!=null||s.onclick!==null||(s.onclick=Rc));else if(p!==4&&(i=i.child,i!==null))for(Pp(i,s,d),i=i.sibling;i!==null;)Pp(i,s,d),i=i.sibling}function Op(i,s,d){var p=i.tag;if(p===5||p===6)i=i.stateNode,s?d.insertBefore(i,s):d.appendChild(i);else if(p!==4&&(i=i.child,i!==null))for(Op(i,s,d),i=i.sibling;i!==null;)Op(i,s,d),i=i.sibling}var Ht=null,hn=!1;function Vi(i,s,d){for(d=d.child;d!==null;)N1(i,s,d),d=d.sibling}function N1(i,s,d){if(En&&typeof En.onCommitFiberUnmount=="function")try{En.onCommitFiberUnmount(yc,d)}catch{}switch(d.tag){case 5:nr||es(d,s);case 6:var p=Ht,x=hn;Ht=null,Vi(i,s,d),Ht=p,hn=x,Ht!==null&&(hn?(i=Ht,d=d.stateNode,i.nodeType===8?i.parentNode.removeChild(d):i.removeChild(d)):Ht.removeChild(d.stateNode));break;case 18:Ht!==null&&(hn?(i=Ht,d=d.stateNode,i.nodeType===8?Hm(i.parentNode,d):i.nodeType===1&&Hm(i,d),jl(i)):Hm(Ht,d.stateNode));break;case 4:p=Ht,x=hn,Ht=d.stateNode.containerInfo,hn=!0,Vi(i,s,d),Ht=p,hn=x;break;case 0:case 11:case 14:case 15:if(!nr&&(p=d.updateQueue,p!==null&&(p=p.lastEffect,p!==null))){x=p=p.next;do{var w=x,C=w.destroy;w=w.tag,C!==void 0&&((w&2)!==0||(w&4)!==0)&&Ap(d,s,C),x=x.next}while(x!==p)}Vi(i,s,d);break;case 1:if(!nr&&(es(d,s),p=d.stateNode,typeof p.componentWillUnmount=="function"))try{p.props=d.memoizedProps,p.state=d.memoizedState,p.componentWillUnmount()}catch(T){gt(d,s,T)}Vi(i,s,d);break;case 21:Vi(i,s,d);break;case 22:d.mode&1?(nr=(p=nr)||d.memoizedState!==null,Vi(i,s,d),nr=p):Vi(i,s,d);break;default:Vi(i,s,d)}}function E1(i){var s=i.updateQueue;if(s!==null){i.updateQueue=null;var d=i.stateNode;d===null&&(d=i.stateNode=new AM),s.forEach(function(p){var x=LM.bind(null,i,p);d.has(p)||(d.add(p),p.then(x,x))})}}function mn(i,s){var d=s.deletions;if(d!==null)for(var p=0;px&&(x=C),p&=~w}if(p=x,p=bt()-p,p=(120>p?120:480>p?480:1080>p?1080:1920>p?1920:3e3>p?3e3:4320>p?4320:1960*OM(p/1960))-p,10i?16:i,Qi===null)var p=!1;else{if(i=Qi,Qi=null,cd=0,(qe&6)!==0)throw Error(r(331));var x=qe;for(qe|=4,be=i.current;be!==null;){var w=be,C=w.child;if((be.flags&16)!==0){var T=w.deletions;if(T!==null){for(var R=0;Rbt()-Ip?za(i,0):Mp|=d),jr(i,s)}function z1(i,s){s===0&&((i.mode&1)===0?s=1:(s=bc,bc<<=1,(bc&130023424)===0&&(bc=4194304)));var d=fr();i=ii(i,s),i!==null&&(yl(i,s,d),jr(i,d))}function RM(i){var s=i.memoizedState,d=0;s!==null&&(d=s.retryLane),z1(i,d)}function LM(i,s){var d=0;switch(i.tag){case 13:var p=i.stateNode,x=i.memoizedState;x!==null&&(d=x.retryLane);break;case 19:p=i.stateNode;break;default:throw Error(r(314))}p!==null&&p.delete(s),z1(i,d)}var F1;F1=function(i,s,d){if(i!==null)if(i.memoizedProps!==s.pendingProps||xr.current)wr=!0;else{if((i.lanes&d)===0&&(s.flags&128)===0)return wr=!1,SM(i,s,d);wr=(i.flags&131072)!==0}else wr=!1,ct&&(s.flags&1048576)!==0&&xb(s,Uc,s.index);switch(s.lanes=0,s.tag){case 2:var p=s.type;nd(i,s),i=s.pendingProps;var x=Ko(s,er.current);Xo(s,d),x=cp(null,s,p,i,x,d);var w=dp();return s.flags|=1,typeof x=="object"&&x!==null&&typeof x.render=="function"&&x.$$typeof===void 0?(s.tag=1,s.memoizedState=null,s.updateQueue=null,br(p)?(w=!0,zc(s)):w=!1,s.memoizedState=x.state!==null&&x.state!==void 0?x.state:null,np(s),x.updater=td,s.stateNode=x,x._reactInternals=s,vp(s,p,i,d),s=wp(null,s,p,!0,w,d)):(s.tag=0,ct&&w&&Vm(s),dr(null,s,x,d),s=s.child),s;case 16:p=s.elementType;e:{switch(nd(i,s),i=s.pendingProps,x=p._init,p=x(p._payload),s.type=p,x=s.tag=zM(p),i=fn(p,i),x){case 0:s=bp(null,s,p,i,d);break e;case 1:s=f1(null,s,p,i,d);break e;case 11:s=s1(null,s,p,i,d);break e;case 14:s=l1(null,s,p,fn(p.type,i),d);break e}throw Error(r(306,p,""))}return s;case 0:return p=s.type,x=s.pendingProps,x=s.elementType===p?x:fn(p,x),bp(i,s,p,x,d);case 1:return p=s.type,x=s.pendingProps,x=s.elementType===p?x:fn(p,x),f1(i,s,p,x,d);case 3:e:{if(h1(s),i===null)throw Error(r(387));p=s.pendingProps,w=s.memoizedState,x=w.element,Cb(i,s),qc(s,p,null,d);var C=s.memoizedState;if(p=C.element,w.isDehydrated)if(w={element:p,isDehydrated:!1,cache:C.cache,pendingSuspenseBoundaries:C.pendingSuspenseBoundaries,transitions:C.transitions},s.updateQueue.baseState=w,s.memoizedState=w,s.flags&256){x=Jo(Error(r(423)),s),s=m1(i,s,p,d,x);break e}else if(p!==x){x=Jo(Error(r(424)),s),s=m1(i,s,p,d,x);break e}else for(Tr=Bi(s.stateNode.containerInfo.firstChild),Ir=s,ct=!0,dn=null,d=Eb(s,null,p,d),s.child=d;d;)d.flags=d.flags&-3|4096,d=d.sibling;else{if(qo(),p===x){s=oi(i,s,d);break e}dr(i,s,p,d)}s=s.child}return s;case 5:return _b(s),i===null&&Ym(s),p=s.type,x=s.pendingProps,w=i!==null?i.memoizedProps:null,C=x.children,Bm(p,x)?C=null:w!==null&&Bm(p,w)&&(s.flags|=32),d1(i,s),dr(i,s,C,d),s.child;case 6:return i===null&&Ym(s),null;case 13:return p1(i,s,d);case 4:return ip(s,s.stateNode.containerInfo),p=s.pendingProps,i===null?s.child=Qo(s,null,p,d):dr(i,s,p,d),s.child;case 11:return p=s.type,x=s.pendingProps,x=s.elementType===p?x:fn(p,x),s1(i,s,p,x,d);case 7:return dr(i,s,s.pendingProps,d),s.child;case 8:return dr(i,s,s.pendingProps.children,d),s.child;case 12:return dr(i,s,s.pendingProps.children,d),s.child;case 10:e:{if(p=s.type._context,x=s.pendingProps,w=s.memoizedProps,C=x.value,rt(Kc,p._currentValue),p._currentValue=C,w!==null)if(cn(w.value,C)){if(w.children===x.children&&!xr.current){s=oi(i,s,d);break e}}else for(w=s.child,w!==null&&(w.return=s);w!==null;){var T=w.dependencies;if(T!==null){C=w.child;for(var R=T.firstContext;R!==null;){if(R.context===p){if(w.tag===1){R=ai(-1,d&-d),R.tag=2;var Q=w.updateQueue;if(Q!==null){Q=Q.shared;var le=Q.pending;le===null?R.next=R:(R.next=le.next,le.next=R),Q.pending=R}}w.lanes|=d,R=w.alternate,R!==null&&(R.lanes|=d),tp(w.return,d,s),T.lanes|=d;break}R=R.next}}else if(w.tag===10)C=w.type===s.type?null:w.child;else if(w.tag===18){if(C=w.return,C===null)throw Error(r(341));C.lanes|=d,T=C.alternate,T!==null&&(T.lanes|=d),tp(C,d,s),C=w.sibling}else C=w.child;if(C!==null)C.return=w;else for(C=w;C!==null;){if(C===s){C=null;break}if(w=C.sibling,w!==null){w.return=C.return,C=w;break}C=C.return}w=C}dr(i,s,x.children,d),s=s.child}return s;case 9:return x=s.type,p=s.pendingProps.children,Xo(s,d),x=Vr(x),p=p(x),s.flags|=1,dr(i,s,p,d),s.child;case 14:return p=s.type,x=fn(p,s.pendingProps),x=fn(p.type,x),l1(i,s,p,x,d);case 15:return u1(i,s,s.type,s.pendingProps,d);case 17:return p=s.type,x=s.pendingProps,x=s.elementType===p?x:fn(p,x),nd(i,s),s.tag=1,br(p)?(i=!0,zc(s)):i=!1,Xo(s,d),e1(s,p,x),vp(s,p,x,d),wp(null,s,p,!0,i,d);case 19:return v1(i,s,d);case 22:return c1(i,s,d)}throw Error(r(156,s.tag))};function B1(i,s){return bx(i,s)}function $M(i,s,d,p){this.tag=i,this.key=d,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=s,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=p,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Yr(i,s,d,p){return new $M(i,s,d,p)}function Bp(i){return i=i.prototype,!(!i||!i.isReactComponent)}function zM(i){if(typeof i=="function")return Bp(i)?1:0;if(i!=null){if(i=i.$$typeof,i===H)return 11;if(i===he)return 14}return 2}function Zi(i,s){var d=i.alternate;return d===null?(d=Yr(i.tag,s,i.key,i.mode),d.elementType=i.elementType,d.type=i.type,d.stateNode=i.stateNode,d.alternate=i,i.alternate=d):(d.pendingProps=s,d.type=i.type,d.flags=0,d.subtreeFlags=0,d.deletions=null),d.flags=i.flags&14680064,d.childLanes=i.childLanes,d.lanes=i.lanes,d.child=i.child,d.memoizedProps=i.memoizedProps,d.memoizedState=i.memoizedState,d.updateQueue=i.updateQueue,s=i.dependencies,d.dependencies=s===null?null:{lanes:s.lanes,firstContext:s.firstContext},d.sibling=i.sibling,d.index=i.index,d.ref=i.ref,d}function md(i,s,d,p,x,w){var C=2;if(p=i,typeof i=="function")Bp(i)&&(C=1);else if(typeof i=="string")C=5;else e:switch(i){case D:return Ba(d.children,x,w,s);case U:C=8,x|=8;break;case B:return i=Yr(12,d,s,x|2),i.elementType=B,i.lanes=w,i;case pe:return i=Yr(13,d,s,x),i.elementType=pe,i.lanes=w,i;case ue:return i=Yr(19,d,s,x),i.elementType=ue,i.lanes=w,i;case se:return pd(d,x,w,s);default:if(typeof i=="object"&&i!==null)switch(i.$$typeof){case F:C=10;break e;case Y:C=9;break e;case H:C=11;break e;case he:C=14;break e;case ae:C=16,p=null;break e}throw Error(r(130,i==null?i:typeof i,""))}return s=Yr(C,d,s,x),s.elementType=i,s.type=p,s.lanes=w,s}function Ba(i,s,d,p){return i=Yr(7,i,p,s),i.lanes=d,i}function pd(i,s,d,p){return i=Yr(22,i,p,s),i.elementType=se,i.lanes=d,i.stateNode={isHidden:!1},i}function Up(i,s,d){return i=Yr(6,i,null,s),i.lanes=d,i}function Hp(i,s,d){return s=Yr(4,i.children!==null?i.children:[],i.key,s),s.lanes=d,s.stateNode={containerInfo:i.containerInfo,pendingChildren:null,implementation:i.implementation},s}function FM(i,s,d,p,x){this.tag=s,this.containerInfo=i,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=gm(0),this.expirationTimes=gm(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=gm(0),this.identifierPrefix=p,this.onRecoverableError=x,this.mutableSourceEagerHydrationData=null}function Wp(i,s,d,p,x,w,C,T,R){return i=new FM(i,s,d,T,R),s===1?(s=1,w===!0&&(s|=8)):s=0,w=Yr(3,null,null,s),i.current=w,w.stateNode=i,w.memoizedState={element:p,isDehydrated:d,cache:null,transitions:null,pendingSuspenseBoundaries:null},np(w),i}function BM(i,s,d){var p=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}return e(),Xp.exports=t3(),Xp.exports}var rw;function r3(){if(rw)return jd;rw=1;var e=hN();return jd.createRoot=e.createRoot,jd.hydrateRoot=e.hydrateRoot,jd}var n3=r3();const i3=vy(n3);var qu=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},ao,ua,As,rN,a3=(rN=class extends qu{constructor(){super();De(this,ao);De(this,ua);De(this,As);ye(this,As,t=>{if(typeof window<"u"&&window.addEventListener){const r=()=>t();return window.addEventListener("visibilitychange",r,!1),()=>{window.removeEventListener("visibilitychange",r)}}})}onSubscribe(){L(this,ua)||this.setEventListener(L(this,As))}onUnsubscribe(){var t;this.hasListeners()||((t=L(this,ua))==null||t.call(this),ye(this,ua,void 0))}setEventListener(t){var r;ye(this,As,t),(r=L(this,ua))==null||r.call(this),ye(this,ua,t(n=>{typeof n=="boolean"?this.setFocused(n):this.onFocus()}))}setFocused(t){L(this,ao)!==t&&(ye(this,ao,t),this.onFocus())}onFocus(){const t=this.isFocused();this.listeners.forEach(r=>{r(t)})}isFocused(){var t;return typeof L(this,ao)=="boolean"?L(this,ao):((t=globalThis.document)==null?void 0:t.visibilityState)!=="hidden"}},ao=new WeakMap,ua=new WeakMap,As=new WeakMap,rN),yy=new a3,o3={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e),setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)},ca,gy,nN,s3=(nN=class{constructor(){De(this,ca,o3);De(this,gy,!1)}setTimeoutProvider(e){ye(this,ca,e)}setTimeout(e,t){return L(this,ca).setTimeout(e,t)}clearTimeout(e){L(this,ca).clearTimeout(e)}setInterval(e,t){return L(this,ca).setInterval(e,t)}clearInterval(e){L(this,ca).clearInterval(e)}},ca=new WeakMap,gy=new WeakMap,nN),Za=new s3;function l3(e){setTimeout(e,0)}var u3=typeof window>"u"||"Deno"in globalThis;function Er(){}function c3(e,t){return typeof e=="function"?e(t):e}function Vg(e){return typeof e=="number"&&e>=0&&e!==1/0}function mN(e,t){return Math.max(e+(t||0)-Date.now(),0)}function ya(e,t){return typeof e=="function"?e(t):e}function zr(e,t){return typeof e=="function"?e(t):e}function nw(e,t){const{type:r="all",exact:n,fetchStatus:a,predicate:o,queryKey:c,stale:u}=e;if(c){if(n){if(t.queryHash!==xy(c,t.options))return!1}else if(!ju(t.queryKey,c))return!1}if(r!=="all"){const f=t.isActive();if(r==="active"&&!f||r==="inactive"&&f)return!1}return!(typeof u=="boolean"&&t.isStale()!==u||a&&a!==t.state.fetchStatus||o&&!o(t))}function iw(e,t){const{exact:r,status:n,predicate:a,mutationKey:o}=e;if(o){if(!t.options.mutationKey)return!1;if(r){if(ku(t.options.mutationKey)!==ku(o))return!1}else if(!ju(t.options.mutationKey,o))return!1}return!(n&&t.state.status!==n||a&&!a(t))}function xy(e,t){return((t==null?void 0:t.queryKeyHashFn)||ku)(e)}function ku(e){return JSON.stringify(e,(t,r)=>Qg(r)?Object.keys(r).sort().reduce((n,a)=>(n[a]=r[a],n),{}):r)}function ju(e,t){return e===t?!0:typeof e!=typeof t?!1:e&&t&&typeof e=="object"&&typeof t=="object"?Object.keys(t).every(r=>ju(e[r],t[r])):!1}var d3=Object.prototype.hasOwnProperty;function pN(e,t,r=0){if(e===t)return e;if(r>500)return t;const n=aw(e)&&aw(t);if(!n&&!(Qg(e)&&Qg(t)))return t;const o=(n?e:Object.keys(e)).length,c=n?t:Object.keys(t),u=c.length,f=n?new Array(u):{};let h=0;for(let m=0;m{Za.setTimeout(t,e)})}function Yg(e,t,r){return typeof r.structuralSharing=="function"?r.structuralSharing(e,t):r.structuralSharing!==!1?pN(e,t):t}function h3(e,t,r=0){const n=[...e,t];return r&&n.length>r?n.slice(1):n}function m3(e,t,r=0){const n=[t,...e];return r&&n.length>r?n.slice(0,-1):n}var by=Symbol();function gN(e,t){return!e.queryFn&&(t!=null&&t.initialPromise)?()=>t.initialPromise:!e.queryFn||e.queryFn===by?()=>Promise.reject(new Error(`Missing queryFn: '${e.queryHash}'`)):e.queryFn}function vN(e,t){return typeof e=="function"?e(...t):!!e}function p3(e,t,r){let n=!1,a;return Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(a??(a=t()),n||(n=!0,a.aborted?r():a.addEventListener("abort",r,{once:!0})),a)}),e}var Su=(()=>{let e=()=>u3;return{isServer(){return e()},setIsServer(t){e=t}}})();function Xg(){let e,t;const r=new Promise((a,o)=>{e=a,t=o});r.status="pending",r.catch(()=>{});function n(a){Object.assign(r,a),delete r.resolve,delete r.reject}return r.resolve=a=>{n({status:"fulfilled",value:a}),e(a)},r.reject=a=>{n({status:"rejected",reason:a}),t(a)},r}var g3=l3;function v3(){let e=[],t=0,r=u=>{u()},n=u=>{u()},a=g3;const o=u=>{t?e.push(u):a(()=>{r(u)})},c=()=>{const u=e;e=[],u.length&&a(()=>{n(()=>{u.forEach(f=>{r(f)})})})};return{batch:u=>{let f;t++;try{f=u()}finally{t--,t||c()}return f},batchCalls:u=>(...f)=>{o(()=>{u(...f)})},schedule:o,setNotifyFunction:u=>{r=u},setBatchNotifyFunction:u=>{n=u},setScheduler:u=>{a=u}}}var qt=v3(),Cs,da,Ps,iN,y3=(iN=class extends qu{constructor(){super();De(this,Cs,!0);De(this,da);De(this,Ps);ye(this,Ps,t=>{if(typeof window<"u"&&window.addEventListener){const r=()=>t(!0),n=()=>t(!1);return window.addEventListener("online",r,!1),window.addEventListener("offline",n,!1),()=>{window.removeEventListener("online",r),window.removeEventListener("offline",n)}}})}onSubscribe(){L(this,da)||this.setEventListener(L(this,Ps))}onUnsubscribe(){var t;this.hasListeners()||((t=L(this,da))==null||t.call(this),ye(this,da,void 0))}setEventListener(t){var r;ye(this,Ps,t),(r=L(this,da))==null||r.call(this),ye(this,da,t(this.setOnline.bind(this)))}setOnline(t){L(this,Cs)!==t&&(ye(this,Cs,t),this.listeners.forEach(n=>{n(t)}))}isOnline(){return L(this,Cs)}},Cs=new WeakMap,da=new WeakMap,Ps=new WeakMap,iN),of=new y3;function x3(e){return Math.min(1e3*2**e,3e4)}function yN(e){return(e??"online")==="online"?of.isOnline():!0}var Zg=class extends Error{constructor(e){super("CancelledError"),this.revert=e==null?void 0:e.revert,this.silent=e==null?void 0:e.silent}};function xN(e){let t=!1,r=0,n;const a=Xg(),o=()=>a.status!=="pending",c=k=>{var S;if(!o()){const N=new Zg(k);v(N),(S=e.onCancel)==null||S.call(e,N)}},u=()=>{t=!0},f=()=>{t=!1},h=()=>yy.isFocused()&&(e.networkMode==="always"||of.isOnline())&&e.canRun(),m=()=>yN(e.networkMode)&&e.canRun(),g=k=>{o()||(n==null||n(),a.resolve(k))},v=k=>{o()||(n==null||n(),a.reject(k))},b=()=>new Promise(k=>{var S;n=N=>{(o()||h())&&k(N)},(S=e.onPause)==null||S.call(e)}).then(()=>{var k;n=void 0,o()||(k=e.onContinue)==null||k.call(e)}),j=()=>{if(o())return;let k;const S=r===0?e.initialPromise:void 0;try{k=S??e.fn()}catch(N){k=Promise.reject(N)}Promise.resolve(k).then(g).catch(N=>{var O;if(o())return;const E=e.retry??(Su.isServer()?0:3),A=e.retryDelay??x3,P=typeof A=="function"?A(r,N):A,_=E===!0||typeof E=="number"&&rh()?void 0:b()).then(()=>{t?v(N):j()})})};return{promise:a,status:()=>a.status,cancel:c,continue:()=>(n==null||n(),a),cancelRetry:u,continueRetry:f,canStart:m,start:()=>(m()?j():b().then(j),a)}}var oo,aN,bN=(aN=class{constructor(){De(this,oo)}destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),Vg(this.gcTime)&&ye(this,oo,Za.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(Su.isServer()?1/0:300*1e3))}clearGcTimeout(){L(this,oo)!==void 0&&(Za.clearTimeout(L(this,oo)),ye(this,oo,void 0))}},oo=new WeakMap,aN);function b3(e){return{onFetch:(t,r)=>{var m,g,v,b,j;const n=t.options,a=(v=(g=(m=t.fetchOptions)==null?void 0:m.meta)==null?void 0:g.fetchMore)==null?void 0:v.direction,o=((b=t.state.data)==null?void 0:b.pages)||[],c=((j=t.state.data)==null?void 0:j.pageParams)||[];let u={pages:[],pageParams:[]},f=0;const h=async()=>{let k=!1;const S=A=>{p3(A,()=>t.signal,()=>k=!0)},N=gN(t.options,t.fetchOptions),E=async(A,P,_)=>{if(k)return Promise.reject(t.signal.reason);if(P==null&&A.pages.length)return Promise.resolve(A);const D=(()=>{const Y={client:t.client,queryKey:t.queryKey,pageParam:P,direction:_?"backward":"forward",meta:t.options.meta};return S(Y),Y})(),U=await N(D),{maxPages:B}=t.options,F=_?m3:h3;return{pages:F(A.pages,U,B),pageParams:F(A.pageParams,P,B)}};if(a&&o.length){const A=a==="backward",P=A?w3:sw,_={pages:o,pageParams:c},O=P(n,_);u=await E(_,O,A)}else{const A=e??o.length;do{const P=f===0?c[0]??n.initialPageParam:sw(n,u);if(f>0&&P==null)break;u=await E(u,P),f++}while(f{var k,S;return(S=(k=t.options).persister)==null?void 0:S.call(k,h,{client:t.client,queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},r)}:t.fetchFn=h}}}function sw(e,{pages:t,pageParams:r}){const n=t.length-1;return t.length>0?e.getNextPageParam(t[n],t,r[n],r):void 0}function w3(e,{pages:t,pageParams:r}){var n;return t.length>0?(n=e.getPreviousPageParam)==null?void 0:n.call(e,t[0],t,r[0],r):void 0}var Os,so,_s,Zr,lo,Dt,Hu,uo,$r,wN,ui,oN,k3=(oN=class extends bN{constructor(t){super();De(this,$r);De(this,Os);De(this,so);De(this,_s);De(this,Zr);De(this,lo);De(this,Dt);De(this,Hu);De(this,uo);ye(this,uo,!1),ye(this,Hu,t.defaultOptions),this.setOptions(t.options),this.observers=[],ye(this,lo,t.client),ye(this,Zr,L(this,lo).getQueryCache()),this.queryKey=t.queryKey,this.queryHash=t.queryHash,ye(this,so,uw(this.options)),this.state=t.state??L(this,so),this.scheduleGc()}get meta(){return this.options.meta}get queryType(){return L(this,Os)}get promise(){var t;return(t=L(this,Dt))==null?void 0:t.promise}setOptions(t){if(this.options={...L(this,Hu),...t},t!=null&&t._type&&ye(this,Os,t._type),this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){const r=uw(this.options);r.data!==void 0&&(this.setState(lw(r.data,r.dataUpdatedAt)),ye(this,so,r))}}optionalRemove(){!this.observers.length&&this.state.fetchStatus==="idle"&&L(this,Zr).remove(this)}setData(t,r){const n=Yg(this.state.data,t,this.options);return He(this,$r,ui).call(this,{data:n,type:"success",dataUpdatedAt:r==null?void 0:r.updatedAt,manual:r==null?void 0:r.manual}),n}setState(t){He(this,$r,ui).call(this,{type:"setState",state:t})}cancel(t){var n,a;const r=(n=L(this,Dt))==null?void 0:n.promise;return(a=L(this,Dt))==null||a.cancel(t),r?r.then(Er).catch(Er):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return L(this,so)}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(t=>zr(t.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===by||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0?this.observers.some(t=>ya(t.options.staleTime,this)==="static"):!1}isStale(){return this.getObserversCount()>0?this.observers.some(t=>t.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(t=0){return this.state.data===void 0?!0:t==="static"?!1:this.state.isInvalidated?!0:!mN(this.state.dataUpdatedAt,t)}onFocus(){var r;const t=this.observers.find(n=>n.shouldFetchOnWindowFocus());t==null||t.refetch({cancelRefetch:!1}),(r=L(this,Dt))==null||r.continue()}onOnline(){var r;const t=this.observers.find(n=>n.shouldFetchOnReconnect());t==null||t.refetch({cancelRefetch:!1}),(r=L(this,Dt))==null||r.continue()}addObserver(t){this.observers.includes(t)||(this.observers.push(t),this.clearGcTimeout(),L(this,Zr).notify({type:"observerAdded",query:this,observer:t}))}removeObserver(t){this.observers.includes(t)&&(this.observers=this.observers.filter(r=>r!==t),this.observers.length||(L(this,Dt)&&(L(this,uo)||He(this,$r,wN).call(this)?L(this,Dt).cancel({revert:!0}):L(this,Dt).cancelRetry()),this.scheduleGc()),L(this,Zr).notify({type:"observerRemoved",query:this,observer:t}))}getObserversCount(){return this.observers.length}invalidate(){this.state.isInvalidated||He(this,$r,ui).call(this,{type:"invalidate"})}async fetch(t,r){var h,m,g,v,b,j,k,S,N,E,A;if(this.state.fetchStatus!=="idle"&&((h=L(this,Dt))==null?void 0:h.status())!=="rejected"){if(this.state.data!==void 0&&(r!=null&&r.cancelRefetch))this.cancel({silent:!0});else if(L(this,Dt))return L(this,Dt).continueRetry(),L(this,Dt).promise}if(t&&this.setOptions(t),!this.options.queryFn){const P=this.observers.find(_=>_.options.queryFn);P&&this.setOptions(P.options)}const n=new AbortController,a=P=>{Object.defineProperty(P,"signal",{enumerable:!0,get:()=>(ye(this,uo,!0),n.signal)})},o=()=>{const P=gN(this.options,r),O=(()=>{const D={client:L(this,lo),queryKey:this.queryKey,meta:this.meta};return a(D),D})();return ye(this,uo,!1),this.options.persister?this.options.persister(P,O,this):P(O)},u=(()=>{const P={fetchOptions:r,options:this.options,queryKey:this.queryKey,client:L(this,lo),state:this.state,fetchFn:o};return a(P),P})(),f=L(this,Os)==="infinite"?b3(this.options.pages):this.options.behavior;f==null||f.onFetch(u,this),ye(this,_s,this.state),(this.state.fetchStatus==="idle"||this.state.fetchMeta!==((m=u.fetchOptions)==null?void 0:m.meta))&&He(this,$r,ui).call(this,{type:"fetch",meta:(g=u.fetchOptions)==null?void 0:g.meta}),ye(this,Dt,xN({initialPromise:r==null?void 0:r.initialPromise,fn:u.fetchFn,onCancel:P=>{P instanceof Zg&&P.revert&&this.setState({...L(this,_s),fetchStatus:"idle"}),n.abort()},onFail:(P,_)=>{He(this,$r,ui).call(this,{type:"failed",failureCount:P,error:_})},onPause:()=>{He(this,$r,ui).call(this,{type:"pause"})},onContinue:()=>{He(this,$r,ui).call(this,{type:"continue"})},retry:u.options.retry,retryDelay:u.options.retryDelay,networkMode:u.options.networkMode,canRun:()=>!0}));try{const P=await L(this,Dt).start();if(P===void 0)throw new Error(`${this.queryHash} data is undefined`);return this.setData(P),(b=(v=L(this,Zr).config).onSuccess)==null||b.call(v,P,this),(k=(j=L(this,Zr).config).onSettled)==null||k.call(j,P,this.state.error,this),P}catch(P){if(P instanceof Zg){if(P.silent)return L(this,Dt).promise;if(P.revert){if(this.state.data===void 0)throw P;return this.state.data}}throw He(this,$r,ui).call(this,{type:"error",error:P}),(N=(S=L(this,Zr).config).onError)==null||N.call(S,P,this),(A=(E=L(this,Zr).config).onSettled)==null||A.call(E,this.state.data,P,this),P}finally{this.scheduleGc()}}},Os=new WeakMap,so=new WeakMap,_s=new WeakMap,Zr=new WeakMap,lo=new WeakMap,Dt=new WeakMap,Hu=new WeakMap,uo=new WeakMap,$r=new WeakSet,wN=function(){return this.state.fetchStatus==="paused"&&this.state.status==="pending"},ui=function(t){const r=n=>{switch(t.type){case"failed":return{...n,fetchFailureCount:t.failureCount,fetchFailureReason:t.error};case"pause":return{...n,fetchStatus:"paused"};case"continue":return{...n,fetchStatus:"fetching"};case"fetch":return{...n,...kN(n.data,this.options),fetchMeta:t.meta??null};case"success":const a={...n,...lw(t.data,t.dataUpdatedAt),dataUpdateCount:n.dataUpdateCount+1,...!t.manual&&{fetchStatus:"idle",fetchFailureCount:0,fetchFailureReason:null}};return ye(this,_s,t.manual?a:void 0),a;case"error":const o=t.error;return{...n,error:o,errorUpdateCount:n.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:n.fetchFailureCount+1,fetchFailureReason:o,fetchStatus:"idle",status:"error",isInvalidated:!0};case"invalidate":return{...n,isInvalidated:!0};case"setState":return{...n,...t.state}}};this.state=r(this.state),qt.batch(()=>{this.observers.forEach(n=>{n.onQueryUpdate()}),L(this,Zr).notify({query:this,type:"updated",action:t})})},oN);function kN(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:yN(t.networkMode)?"fetching":"paused",...e===void 0&&{error:null,status:"pending"}}}function lw(e,t){return{data:e,dataUpdatedAt:t??Date.now(),error:null,isInvalidated:!1,status:"success"}}function uw(e){const t=typeof e.initialData=="function"?e.initialData():e.initialData,r=t!==void 0,n=r?typeof e.initialDataUpdatedAt=="function"?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:r?n??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:r?"success":"pending",fetchStatus:"idle"}}var Nr,Ke,Wu,hr,co,Ms,di,fa,Ku,Is,Ts,fo,ho,ha,Ds,Xe,hu,Jg,ev,tv,rv,nv,iv,av,jN,sN,j3=(sN=class extends qu{constructor(t,r){super();De(this,Xe);De(this,Nr);De(this,Ke);De(this,Wu);De(this,hr);De(this,co);De(this,Ms);De(this,di);De(this,fa);De(this,Ku);De(this,Is);De(this,Ts);De(this,fo);De(this,ho);De(this,ha);De(this,Ds,new Set);this.options=r,ye(this,Nr,t),ye(this,fa,null),ye(this,di,Xg()),this.bindMethods(),this.setOptions(r)}bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(L(this,Ke).addObserver(this),cw(L(this,Ke),this.options)?He(this,Xe,hu).call(this):this.updateResult(),He(this,Xe,rv).call(this))}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return ov(L(this,Ke),this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return ov(L(this,Ke),this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,He(this,Xe,nv).call(this),He(this,Xe,iv).call(this),L(this,Ke).removeObserver(this)}setOptions(t){const r=this.options,n=L(this,Ke);if(this.options=L(this,Nr).defaultQueryOptions(t),this.options.enabled!==void 0&&typeof this.options.enabled!="boolean"&&typeof this.options.enabled!="function"&&typeof zr(this.options.enabled,L(this,Ke))!="boolean")throw new Error("Expected enabled to be a boolean or a callback that returns a boolean");He(this,Xe,av).call(this),L(this,Ke).setOptions(this.options),r._defaulted&&!qg(this.options,r)&&L(this,Nr).getQueryCache().notify({type:"observerOptionsUpdated",query:L(this,Ke),observer:this});const a=this.hasListeners();a&&dw(L(this,Ke),n,this.options,r)&&He(this,Xe,hu).call(this),this.updateResult(),a&&(L(this,Ke)!==n||zr(this.options.enabled,L(this,Ke))!==zr(r.enabled,L(this,Ke))||ya(this.options.staleTime,L(this,Ke))!==ya(r.staleTime,L(this,Ke)))&&He(this,Xe,Jg).call(this);const o=He(this,Xe,ev).call(this);a&&(L(this,Ke)!==n||zr(this.options.enabled,L(this,Ke))!==zr(r.enabled,L(this,Ke))||o!==L(this,ha))&&He(this,Xe,tv).call(this,o)}getOptimisticResult(t){const r=L(this,Nr).getQueryCache().build(L(this,Nr),t),n=this.createResult(r,t);return N3(this,n)&&(ye(this,hr,n),ye(this,Ms,this.options),ye(this,co,L(this,Ke).state)),n}getCurrentResult(){return L(this,hr)}trackResult(t,r){return new Proxy(t,{get:(n,a)=>(this.trackProp(a),r==null||r(a),a==="promise"&&(this.trackProp("data"),!this.options.experimental_prefetchInRender&&L(this,di).status==="pending"&&L(this,di).reject(new Error("experimental_prefetchInRender feature flag is not enabled"))),Reflect.get(n,a))})}trackProp(t){L(this,Ds).add(t)}getCurrentQuery(){return L(this,Ke)}refetch({...t}={}){return this.fetch({...t})}fetchOptimistic(t){const r=L(this,Nr).defaultQueryOptions(t),n=L(this,Nr).getQueryCache().build(L(this,Nr),r);return n.fetch().then(()=>this.createResult(n,r))}fetch(t){return He(this,Xe,hu).call(this,{...t,cancelRefetch:t.cancelRefetch??!0}).then(()=>(this.updateResult(),L(this,hr)))}createResult(t,r){var B;const n=L(this,Ke),a=this.options,o=L(this,hr),c=L(this,co),u=L(this,Ms),h=t!==n?t.state:L(this,Wu),{state:m}=t;let g={...m},v=!1,b;if(r._optimisticResults){const F=this.hasListeners(),Y=!F&&cw(t,r),H=F&&dw(t,n,r,a);(Y||H)&&(g={...g,...kN(m.data,t.options)}),r._optimisticResults==="isRestoring"&&(g.fetchStatus="idle")}let{error:j,errorUpdatedAt:k,status:S}=g;b=g.data;let N=!1;if(r.placeholderData!==void 0&&b===void 0&&S==="pending"){let F;o!=null&&o.isPlaceholderData&&r.placeholderData===(u==null?void 0:u.placeholderData)?(F=o.data,N=!0):F=typeof r.placeholderData=="function"?r.placeholderData((B=L(this,Ts))==null?void 0:B.state.data,L(this,Ts)):r.placeholderData,F!==void 0&&(S="success",b=Yg(o==null?void 0:o.data,F,r),v=!0)}if(r.select&&b!==void 0&&!N)if(o&&b===(c==null?void 0:c.data)&&r.select===L(this,Ku))b=L(this,Is);else try{ye(this,Ku,r.select),b=r.select(b),b=Yg(o==null?void 0:o.data,b,r),ye(this,Is,b),ye(this,fa,null)}catch(F){ye(this,fa,F)}L(this,fa)&&(j=L(this,fa),b=L(this,Is),k=Date.now(),S="error");const E=g.fetchStatus==="fetching",A=S==="pending",P=S==="error",_=A&&E,O=b!==void 0,U={status:S,fetchStatus:g.fetchStatus,isPending:A,isSuccess:S==="success",isError:P,isInitialLoading:_,isLoading:_,data:b,dataUpdatedAt:g.dataUpdatedAt,error:j,errorUpdatedAt:k,failureCount:g.fetchFailureCount,failureReason:g.fetchFailureReason,errorUpdateCount:g.errorUpdateCount,isFetched:t.isFetched(),isFetchedAfterMount:g.dataUpdateCount>h.dataUpdateCount||g.errorUpdateCount>h.errorUpdateCount,isFetching:E,isRefetching:E&&!A,isLoadingError:P&&!O,isPaused:g.fetchStatus==="paused",isPlaceholderData:v,isRefetchError:P&&O,isStale:wy(t,r),refetch:this.refetch,promise:L(this,di),isEnabled:zr(r.enabled,t)!==!1};if(this.options.experimental_prefetchInRender){const F=U.data!==void 0,Y=U.status==="error"&&!F,H=he=>{Y?he.reject(U.error):F&&he.resolve(U.data)},pe=()=>{const he=ye(this,di,U.promise=Xg());H(he)},ue=L(this,di);switch(ue.status){case"pending":t.queryHash===n.queryHash&&H(ue);break;case"fulfilled":(Y||U.data!==ue.value)&&pe();break;case"rejected":(!Y||U.error!==ue.reason)&&pe();break}}return U}updateResult(){const t=L(this,hr),r=this.createResult(L(this,Ke),this.options);if(ye(this,co,L(this,Ke).state),ye(this,Ms,this.options),L(this,co).data!==void 0&&ye(this,Ts,L(this,Ke)),qg(r,t))return;ye(this,hr,r);const n=()=>{if(!t)return!0;const{notifyOnChangeProps:a}=this.options,o=typeof a=="function"?a():a;if(o==="all"||!o&&!L(this,Ds).size)return!0;const c=new Set(o??L(this,Ds));return this.options.throwOnError&&c.add("error"),Object.keys(L(this,hr)).some(u=>{const f=u;return L(this,hr)[f]!==t[f]&&c.has(f)})};He(this,Xe,jN).call(this,{listeners:n()})}onQueryUpdate(){this.updateResult(),this.hasListeners()&&He(this,Xe,rv).call(this)}},Nr=new WeakMap,Ke=new WeakMap,Wu=new WeakMap,hr=new WeakMap,co=new WeakMap,Ms=new WeakMap,di=new WeakMap,fa=new WeakMap,Ku=new WeakMap,Is=new WeakMap,Ts=new WeakMap,fo=new WeakMap,ho=new WeakMap,ha=new WeakMap,Ds=new WeakMap,Xe=new WeakSet,hu=function(t){He(this,Xe,av).call(this);let r=L(this,Ke).fetch(this.options,t);return t!=null&&t.throwOnError||(r=r.catch(Er)),r},Jg=function(){He(this,Xe,nv).call(this);const t=ya(this.options.staleTime,L(this,Ke));if(Su.isServer()||L(this,hr).isStale||!Vg(t))return;const n=mN(L(this,hr).dataUpdatedAt,t)+1;ye(this,fo,Za.setTimeout(()=>{L(this,hr).isStale||this.updateResult()},n))},ev=function(){return(typeof this.options.refetchInterval=="function"?this.options.refetchInterval(L(this,Ke)):this.options.refetchInterval)??!1},tv=function(t){He(this,Xe,iv).call(this),ye(this,ha,t),!(Su.isServer()||zr(this.options.enabled,L(this,Ke))===!1||!Vg(L(this,ha))||L(this,ha)===0)&&ye(this,ho,Za.setInterval(()=>{(this.options.refetchIntervalInBackground||yy.isFocused())&&He(this,Xe,hu).call(this)},L(this,ha)))},rv=function(){He(this,Xe,Jg).call(this),He(this,Xe,tv).call(this,He(this,Xe,ev).call(this))},nv=function(){L(this,fo)!==void 0&&(Za.clearTimeout(L(this,fo)),ye(this,fo,void 0))},iv=function(){L(this,ho)!==void 0&&(Za.clearInterval(L(this,ho)),ye(this,ho,void 0))},av=function(){const t=L(this,Nr).getQueryCache().build(L(this,Nr),this.options);if(t===L(this,Ke))return;const r=L(this,Ke);ye(this,Ke,t),ye(this,Wu,t.state),this.hasListeners()&&(r==null||r.removeObserver(this),t.addObserver(this))},jN=function(t){qt.batch(()=>{t.listeners&&this.listeners.forEach(r=>{r(L(this,hr))}),L(this,Nr).getQueryCache().notify({query:L(this,Ke),type:"observerResultsUpdated"})})},sN);function S3(e,t){return zr(t.enabled,e)!==!1&&e.state.data===void 0&&!(e.state.status==="error"&&zr(t.retryOnMount,e)===!1)}function cw(e,t){return S3(e,t)||e.state.data!==void 0&&ov(e,t,t.refetchOnMount)}function ov(e,t,r){if(zr(t.enabled,e)!==!1&&ya(t.staleTime,e)!=="static"){const n=typeof r=="function"?r(e):r;return n==="always"||n!==!1&&wy(e,t)}return!1}function dw(e,t,r,n){return(e!==t||zr(n.enabled,e)===!1)&&(!r.suspense||e.state.status!=="error")&&wy(e,r)}function wy(e,t){return zr(t.enabled,e)!==!1&&e.isStaleByTime(ya(t.staleTime,e))}function N3(e,t){return!qg(e.getCurrentResult(),t)}var Gu,Dn,ir,mo,Rn,na,lN,E3=(lN=class extends bN{constructor(t){super();De(this,Rn);De(this,Gu);De(this,Dn);De(this,ir);De(this,mo);ye(this,Gu,t.client),this.mutationId=t.mutationId,ye(this,ir,t.mutationCache),ye(this,Dn,[]),this.state=t.state||A3(),this.setOptions(t.options),this.scheduleGc()}setOptions(t){this.options=t,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(t){L(this,Dn).includes(t)||(L(this,Dn).push(t),this.clearGcTimeout(),L(this,ir).notify({type:"observerAdded",mutation:this,observer:t}))}removeObserver(t){ye(this,Dn,L(this,Dn).filter(r=>r!==t)),this.scheduleGc(),L(this,ir).notify({type:"observerRemoved",mutation:this,observer:t})}optionalRemove(){L(this,Dn).length||(this.state.status==="pending"?this.scheduleGc():L(this,ir).remove(this))}continue(){var t;return((t=L(this,mo))==null?void 0:t.continue())??this.execute(this.state.variables)}async execute(t){var c,u,f,h,m,g,v,b,j,k,S,N,E,A,P,_,O,D;const r=()=>{He(this,Rn,na).call(this,{type:"continue"})},n={client:L(this,Gu),meta:this.options.meta,mutationKey:this.options.mutationKey};ye(this,mo,xN({fn:()=>this.options.mutationFn?this.options.mutationFn(t,n):Promise.reject(new Error("No mutationFn found")),onFail:(U,B)=>{He(this,Rn,na).call(this,{type:"failed",failureCount:U,error:B})},onPause:()=>{He(this,Rn,na).call(this,{type:"pause"})},onContinue:r,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>L(this,ir).canRun(this)}));const a=this.state.status==="pending",o=!L(this,mo).canStart();try{if(a)r();else{He(this,Rn,na).call(this,{type:"pending",variables:t,isPaused:o}),L(this,ir).config.onMutate&&await L(this,ir).config.onMutate(t,this,n);const B=await((u=(c=this.options).onMutate)==null?void 0:u.call(c,t,n));B!==this.state.context&&He(this,Rn,na).call(this,{type:"pending",context:B,variables:t,isPaused:o})}const U=await L(this,mo).start();return await((h=(f=L(this,ir).config).onSuccess)==null?void 0:h.call(f,U,t,this.state.context,this,n)),await((g=(m=this.options).onSuccess)==null?void 0:g.call(m,U,t,this.state.context,n)),await((b=(v=L(this,ir).config).onSettled)==null?void 0:b.call(v,U,null,this.state.variables,this.state.context,this,n)),await((k=(j=this.options).onSettled)==null?void 0:k.call(j,U,null,t,this.state.context,n)),He(this,Rn,na).call(this,{type:"success",data:U}),U}catch(U){try{await((N=(S=L(this,ir).config).onError)==null?void 0:N.call(S,U,t,this.state.context,this,n))}catch(B){Promise.reject(B)}try{await((A=(E=this.options).onError)==null?void 0:A.call(E,U,t,this.state.context,n))}catch(B){Promise.reject(B)}try{await((_=(P=L(this,ir).config).onSettled)==null?void 0:_.call(P,void 0,U,this.state.variables,this.state.context,this,n))}catch(B){Promise.reject(B)}try{await((D=(O=this.options).onSettled)==null?void 0:D.call(O,void 0,U,t,this.state.context,n))}catch(B){Promise.reject(B)}throw He(this,Rn,na).call(this,{type:"error",error:U}),U}finally{L(this,ir).runNext(this)}}},Gu=new WeakMap,Dn=new WeakMap,ir=new WeakMap,mo=new WeakMap,Rn=new WeakSet,na=function(t){const r=n=>{switch(t.type){case"failed":return{...n,failureCount:t.failureCount,failureReason:t.error};case"pause":return{...n,isPaused:!0};case"continue":return{...n,isPaused:!1};case"pending":return{...n,context:t.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:t.isPaused,status:"pending",variables:t.variables,submittedAt:Date.now()};case"success":return{...n,data:t.data,failureCount:0,failureReason:null,error:null,status:"success",isPaused:!1};case"error":return{...n,data:void 0,error:t.error,failureCount:n.failureCount+1,failureReason:t.error,isPaused:!1,status:"error"}}};this.state=r(this.state),qt.batch(()=>{L(this,Dn).forEach(n=>{n.onMutationUpdate(t)}),L(this,ir).notify({mutation:this,type:"updated",action:t})})},lN);function A3(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}var fi,vn,Vu,uN,C3=(uN=class extends qu{constructor(t={}){super();De(this,fi);De(this,vn);De(this,Vu);this.config=t,ye(this,fi,new Set),ye(this,vn,new Map),ye(this,Vu,0)}build(t,r,n){const a=new E3({client:t,mutationCache:this,mutationId:++kd(this,Vu)._,options:t.defaultMutationOptions(r),state:n});return this.add(a),a}add(t){L(this,fi).add(t);const r=Sd(t);if(typeof r=="string"){const n=L(this,vn).get(r);n?n.push(t):L(this,vn).set(r,[t])}this.notify({type:"added",mutation:t})}remove(t){if(L(this,fi).delete(t)){const r=Sd(t);if(typeof r=="string"){const n=L(this,vn).get(r);if(n)if(n.length>1){const a=n.indexOf(t);a!==-1&&n.splice(a,1)}else n[0]===t&&L(this,vn).delete(r)}}this.notify({type:"removed",mutation:t})}canRun(t){const r=Sd(t);if(typeof r=="string"){const n=L(this,vn).get(r),a=n==null?void 0:n.find(o=>o.state.status==="pending");return!a||a===t}else return!0}runNext(t){var n;const r=Sd(t);if(typeof r=="string"){const a=(n=L(this,vn).get(r))==null?void 0:n.find(o=>o!==t&&o.state.isPaused);return(a==null?void 0:a.continue())??Promise.resolve()}else return Promise.resolve()}clear(){qt.batch(()=>{L(this,fi).forEach(t=>{this.notify({type:"removed",mutation:t})}),L(this,fi).clear(),L(this,vn).clear()})}getAll(){return Array.from(L(this,fi))}find(t){const r={exact:!0,...t};return this.getAll().find(n=>iw(r,n))}findAll(t={}){return this.getAll().filter(r=>iw(t,r))}notify(t){qt.batch(()=>{this.listeners.forEach(r=>{r(t)})})}resumePausedMutations(){const t=this.getAll().filter(r=>r.state.isPaused);return qt.batch(()=>Promise.all(t.map(r=>r.continue().catch(Er))))}},fi=new WeakMap,vn=new WeakMap,Vu=new WeakMap,uN);function Sd(e){var t;return(t=e.options.scope)==null?void 0:t.id}var Ln,cN,P3=(cN=class extends qu{constructor(t={}){super();De(this,Ln);this.config=t,ye(this,Ln,new Map)}build(t,r,n){const a=r.queryKey,o=r.queryHash??xy(a,r);let c=this.get(o);return c||(c=new k3({client:t,queryKey:a,queryHash:o,options:t.defaultQueryOptions(r),state:n,defaultOptions:t.getQueryDefaults(a)}),this.add(c)),c}add(t){L(this,Ln).has(t.queryHash)||(L(this,Ln).set(t.queryHash,t),this.notify({type:"added",query:t}))}remove(t){const r=L(this,Ln).get(t.queryHash);r&&(t.destroy(),r===t&&L(this,Ln).delete(t.queryHash),this.notify({type:"removed",query:t}))}clear(){qt.batch(()=>{this.getAll().forEach(t=>{this.remove(t)})})}get(t){return L(this,Ln).get(t)}getAll(){return[...L(this,Ln).values()]}find(t){const r={exact:!0,...t};return this.getAll().find(n=>nw(r,n))}findAll(t={}){const r=this.getAll();return Object.keys(t).length>0?r.filter(n=>nw(t,n)):r}notify(t){qt.batch(()=>{this.listeners.forEach(r=>{r(t)})})}onFocus(){qt.batch(()=>{this.getAll().forEach(t=>{t.onFocus()})})}onOnline(){qt.batch(()=>{this.getAll().forEach(t=>{t.onOnline()})})}},Ln=new WeakMap,cN),vt,ma,pa,Rs,Ls,ga,$s,zs,dN,O3=(dN=class{constructor(e={}){De(this,vt);De(this,ma);De(this,pa);De(this,Rs);De(this,Ls);De(this,ga);De(this,$s);De(this,zs);ye(this,vt,e.queryCache||new P3),ye(this,ma,e.mutationCache||new C3),ye(this,pa,e.defaultOptions||{}),ye(this,Rs,new Map),ye(this,Ls,new Map),ye(this,ga,0)}mount(){kd(this,ga)._++,L(this,ga)===1&&(ye(this,$s,yy.subscribe(async e=>{e&&(await this.resumePausedMutations(),L(this,vt).onFocus())})),ye(this,zs,of.subscribe(async e=>{e&&(await this.resumePausedMutations(),L(this,vt).onOnline())})))}unmount(){var e,t;kd(this,ga)._--,L(this,ga)===0&&((e=L(this,$s))==null||e.call(this),ye(this,$s,void 0),(t=L(this,zs))==null||t.call(this),ye(this,zs,void 0))}isFetching(e){return L(this,vt).findAll({...e,fetchStatus:"fetching"}).length}isMutating(e){return L(this,ma).findAll({...e,status:"pending"}).length}getQueryData(e){var r;const t=this.defaultQueryOptions({queryKey:e});return(r=L(this,vt).get(t.queryHash))==null?void 0:r.state.data}ensureQueryData(e){const t=this.defaultQueryOptions(e),r=L(this,vt).build(this,t),n=r.state.data;return n===void 0?this.fetchQuery(e):(e.revalidateIfStale&&r.isStaleByTime(ya(t.staleTime,r))&&this.prefetchQuery(t),Promise.resolve(n))}getQueriesData(e){return L(this,vt).findAll(e).map(({queryKey:t,state:r})=>{const n=r.data;return[t,n]})}setQueryData(e,t,r){const n=this.defaultQueryOptions({queryKey:e}),a=L(this,vt).get(n.queryHash),o=a==null?void 0:a.state.data,c=c3(t,o);if(c!==void 0)return L(this,vt).build(this,n).setData(c,{...r,manual:!0})}setQueriesData(e,t,r){return qt.batch(()=>L(this,vt).findAll(e).map(({queryKey:n})=>[n,this.setQueryData(n,t,r)]))}getQueryState(e){var r;const t=this.defaultQueryOptions({queryKey:e});return(r=L(this,vt).get(t.queryHash))==null?void 0:r.state}removeQueries(e){const t=L(this,vt);qt.batch(()=>{t.findAll(e).forEach(r=>{t.remove(r)})})}resetQueries(e,t){const r=L(this,vt);return qt.batch(()=>(r.findAll(e).forEach(n=>{n.reset()}),this.refetchQueries({type:"active",...e},t)))}cancelQueries(e,t={}){const r={revert:!0,...t},n=qt.batch(()=>L(this,vt).findAll(e).map(a=>a.cancel(r)));return Promise.all(n).then(Er).catch(Er)}invalidateQueries(e,t={}){return qt.batch(()=>(L(this,vt).findAll(e).forEach(r=>{r.invalidate()}),(e==null?void 0:e.refetchType)==="none"?Promise.resolve():this.refetchQueries({...e,type:(e==null?void 0:e.refetchType)??(e==null?void 0:e.type)??"active"},t)))}refetchQueries(e,t={}){const r={...t,cancelRefetch:t.cancelRefetch??!0},n=qt.batch(()=>L(this,vt).findAll(e).filter(a=>!a.isDisabled()&&!a.isStatic()).map(a=>{let o=a.fetch(void 0,r);return r.throwOnError||(o=o.catch(Er)),a.state.fetchStatus==="paused"?Promise.resolve():o}));return Promise.all(n).then(Er)}fetchQuery(e){const t=this.defaultQueryOptions(e);t.retry===void 0&&(t.retry=!1);const r=L(this,vt).build(this,t);return r.isStaleByTime(ya(t.staleTime,r))?r.fetch(t):Promise.resolve(r.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(Er).catch(Er)}fetchInfiniteQuery(e){return e._type="infinite",this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(Er).catch(Er)}ensureInfiniteQueryData(e){return e._type="infinite",this.ensureQueryData(e)}resumePausedMutations(){return of.isOnline()?L(this,ma).resumePausedMutations():Promise.resolve()}getQueryCache(){return L(this,vt)}getMutationCache(){return L(this,ma)}getDefaultOptions(){return L(this,pa)}setDefaultOptions(e){ye(this,pa,e)}setQueryDefaults(e,t){L(this,Rs).set(ku(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){const t=[...L(this,Rs).values()],r={};return t.forEach(n=>{ju(e,n.queryKey)&&Object.assign(r,n.defaultOptions)}),r}setMutationDefaults(e,t){L(this,Ls).set(ku(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){const t=[...L(this,Ls).values()],r={};return t.forEach(n=>{ju(e,n.mutationKey)&&Object.assign(r,n.defaultOptions)}),r}defaultQueryOptions(e){if(e._defaulted)return e;const t={...L(this,pa).queries,...this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||(t.queryHash=xy(t.queryKey,t)),t.refetchOnReconnect===void 0&&(t.refetchOnReconnect=t.networkMode!=="always"),t.throwOnError===void 0&&(t.throwOnError=!!t.suspense),!t.networkMode&&t.persister&&(t.networkMode="offlineFirst"),t.queryFn===by&&(t.enabled=!1),t}defaultMutationOptions(e){return e!=null&&e._defaulted?e:{...L(this,pa).mutations,...(e==null?void 0:e.mutationKey)&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){L(this,vt).clear(),L(this,ma).clear()}},vt=new WeakMap,ma=new WeakMap,pa=new WeakMap,Rs=new WeakMap,Ls=new WeakMap,ga=new WeakMap,$s=new WeakMap,zs=new WeakMap,dN),SN=y.createContext(void 0),Yn=e=>{const t=y.useContext(SN);if(!t)throw new Error("No QueryClient set, use QueryClientProvider to set one");return t},_3=({client:e,children:t})=>(y.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),l.jsx(SN.Provider,{value:e,children:t})),NN=y.createContext(!1),M3=()=>y.useContext(NN);NN.Provider;function I3(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}var T3=y.createContext(I3()),D3=()=>y.useContext(T3),R3=(e,t,r)=>{const n=r!=null&&r.state.error&&typeof e.throwOnError=="function"?vN(e.throwOnError,[r.state.error,r]):e.throwOnError;(e.suspense||e.experimental_prefetchInRender||n)&&(t.isReset()||(e.retryOnMount=!1))},L3=e=>{y.useEffect(()=>{e.clearReset()},[e])},$3=({result:e,errorResetBoundary:t,throwOnError:r,query:n,suspense:a})=>e.isError&&!t.isReset()&&!e.isFetching&&n&&(a&&e.data===void 0||vN(r,[e.error,n])),z3=e=>{if(e.suspense){const r=a=>a==="static"?a:Math.max(a??1e3,1e3),n=e.staleTime;e.staleTime=typeof n=="function"?(...a)=>r(n(...a)):r(n),typeof e.gcTime=="number"&&(e.gcTime=Math.max(e.gcTime,1e3))}},F3=(e,t)=>e.isLoading&&e.isFetching&&!t,B3=(e,t)=>(e==null?void 0:e.suspense)&&t.isPending,fw=(e,t,r)=>t.fetchOptimistic(e).catch(()=>{r.clearReset()});function U3(e,t,r){var b,j,k,S;const n=M3(),a=D3(),o=Yn(),c=o.defaultQueryOptions(e);(j=(b=o.getDefaultOptions().queries)==null?void 0:b._experimental_beforeQuery)==null||j.call(b,c);const u=o.getQueryCache().get(c.queryHash),f=e.subscribed!==!1;c._optimisticResults=n?"isRestoring":f?"optimistic":void 0,z3(c),R3(c,a,u),L3(a);const h=!o.getQueryCache().get(c.queryHash),[m]=y.useState(()=>new t(o,c)),g=m.getOptimisticResult(c),v=!n&&f;if(y.useSyncExternalStore(y.useCallback(N=>{const E=v?m.subscribe(qt.batchCalls(N)):Er;return m.updateResult(),E},[m,v]),()=>m.getCurrentResult(),()=>m.getCurrentResult()),y.useEffect(()=>{m.setOptions(c)},[c,m]),B3(c,g))throw fw(c,m,a);if($3({result:g,errorResetBoundary:a,throwOnError:c.throwOnError,query:u,suspense:c.suspense}))throw g.error;if((S=(k=o.getDefaultOptions().queries)==null?void 0:k._experimental_afterQuery)==null||S.call(k,c,g),c.experimental_prefetchInRender&&!Su.isServer()&&F3(g,n)){const N=h?fw(c,m,a):u==null?void 0:u.promise;N==null||N.catch(Er).finally(()=>{m.updateResult()})}return c.notifyOnChangeProps?g:m.trackResult(g)}function $t(e,t){return U3(e,j3)}/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const H3=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),EN=(...e)=>e.filter((t,r,n)=>!!t&&t.trim()!==""&&n.indexOf(t)===r).join(" ").trim();/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */var W3={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const K3=y.forwardRef(({color:e="currentColor",size:t=24,strokeWidth:r=2,absoluteStrokeWidth:n,className:a="",children:o,iconNode:c,...u},f)=>y.createElement("svg",{ref:f,...W3,width:t,height:t,stroke:e,strokeWidth:n?Number(r)*24/Number(t):r,className:EN("lucide",a),...u},[...c.map(([h,m])=>y.createElement(h,m)),...Array.isArray(o)?o:[o]]));/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const de=(e,t)=>{const r=y.forwardRef(({className:n,...a},o)=>y.createElement(K3,{ref:o,iconNode:t,className:EN(`lucide-${H3(e)}`,n),...a}));return r.displayName=`${e}`,r};/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const uh=de("Activity",[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const AN=de("ArrowLeft",[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const sf=de("ArrowRight",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const G3=de("ArrowUpRight",[["path",{d:"M7 7h10v10",key:"1tivn9"}],["path",{d:"M7 17 17 7",key:"1vkiza"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const CN=de("BookMarked",[["path",{d:"M10 2v8l3-3 3 3V2",key:"sqw3rj"}],["path",{d:"M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H19a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H6.5a1 1 0 0 1 0-5H20",key:"k3hazp"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const sv=de("BookOpen",[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",key:"ruj8y"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const V3=de("Bookmark",[["path",{d:"m19 21-7-4-7 4V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2v16z",key:"1fy3hk"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const wn=de("Bot",[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const q3=de("Box",[["path",{d:"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z",key:"hh9hay"}],["path",{d:"m3.3 7 8.7 5 8.7-5",key:"g66t2b"}],["path",{d:"M12 22V12",key:"d0xqtd"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const lf=de("Boxes",[["path",{d:"M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z",key:"lc1i9w"}],["path",{d:"m7 16.5-4.74-2.85",key:"1o9zyk"}],["path",{d:"m7 16.5 5-3",key:"va8pkn"}],["path",{d:"M7 16.5v5.17",key:"jnp8gn"}],["path",{d:"M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z",key:"8zsnat"}],["path",{d:"m17 16.5-5-3",key:"8arw3v"}],["path",{d:"m17 16.5 4.74-2.85",key:"8rfmw"}],["path",{d:"M17 16.5v5.17",key:"k6z78m"}],["path",{d:"M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z",key:"1xygjf"}],["path",{d:"M12 8 7.26 5.15",key:"1vbdud"}],["path",{d:"m12 8 4.74-2.85",key:"3rx089"}],["path",{d:"M12 13.5V8",key:"1io7kd"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Q3=de("BrainCircuit",[["path",{d:"M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z",key:"l5xja"}],["path",{d:"M9 13a4.5 4.5 0 0 0 3-4",key:"10igwf"}],["path",{d:"M6.003 5.125A3 3 0 0 0 6.401 6.5",key:"105sqy"}],["path",{d:"M3.477 10.896a4 4 0 0 1 .585-.396",key:"ql3yin"}],["path",{d:"M6 18a4 4 0 0 1-1.967-.516",key:"2e4loj"}],["path",{d:"M12 13h4",key:"1ku699"}],["path",{d:"M12 18h6a2 2 0 0 1 2 2v1",key:"105ag5"}],["path",{d:"M12 8h8",key:"1lhi5i"}],["path",{d:"M16 8V5a2 2 0 0 1 2-2",key:"u6izg6"}],["circle",{cx:"16",cy:"13",r:".5",key:"ry7gng"}],["circle",{cx:"18",cy:"3",r:".5",key:"1aiba7"}],["circle",{cx:"20",cy:"21",r:".5",key:"yhc1fs"}],["circle",{cx:"20",cy:"8",r:".5",key:"1e43v0"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Y3=de("BrainCog",[["path",{d:"M12 5a3 3 0 1 0-5.997.142 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588 4 4 0 0 0 7.636 2.106 3.2 3.2 0 0 0 .164-.546c.028-.13.306-.13.335 0a3.2 3.2 0 0 0 .163.546 4 4 0 0 0 7.636-2.106 4 4 0 0 0 .556-6.588 4 4 0 0 0-2.526-5.77A3 3 0 1 0 12 5",key:"1kgmhc"}],["path",{d:"M17.599 6.5a3 3 0 0 0 .399-1.375",key:"tmeiqw"}],["path",{d:"M6.003 5.125A3 3 0 0 0 6.401 6.5",key:"105sqy"}],["path",{d:"M3.477 10.896a4 4 0 0 1 .585-.396",key:"ql3yin"}],["path",{d:"M19.938 10.5a4 4 0 0 1 .585.396",key:"1qfode"}],["path",{d:"M6 18a4 4 0 0 1-1.967-.516",key:"2e4loj"}],["path",{d:"M19.967 17.484A4 4 0 0 1 18 18",key:"159ez6"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}],["path",{d:"m15.7 10.4-.9.4",key:"ayzo6p"}],["path",{d:"m9.2 13.2-.9.4",key:"1uzb3g"}],["path",{d:"m13.6 15.7-.4-.9",key:"11ifqf"}],["path",{d:"m10.8 9.2-.4-.9",key:"1pmk2v"}],["path",{d:"m15.7 13.5-.9-.4",key:"7ng02m"}],["path",{d:"m9.2 10.9-.9-.4",key:"1x66zd"}],["path",{d:"m10.5 15.7.4-.9",key:"3js94g"}],["path",{d:"m13.1 9.2.4-.9",key:"18n7mc"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ao=de("Brain",[["path",{d:"M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z",key:"l5xja"}],["path",{d:"M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z",key:"ep3f8r"}],["path",{d:"M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4",key:"1p4c4q"}],["path",{d:"M17.599 6.5a3 3 0 0 0 .399-1.375",key:"tmeiqw"}],["path",{d:"M6.003 5.125A3 3 0 0 0 6.401 6.5",key:"105sqy"}],["path",{d:"M3.477 10.896a4 4 0 0 1 .585-.396",key:"ql3yin"}],["path",{d:"M19.938 10.5a4 4 0 0 1 .585.396",key:"1qfode"}],["path",{d:"M6 18a4 4 0 0 1-1.967-.516",key:"2e4loj"}],["path",{d:"M19.967 17.484A4 4 0 0 1 18 18",key:"159ez6"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const X3=de("Camera",[["path",{d:"M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z",key:"1tc9qg"}],["circle",{cx:"12",cy:"13",r:"3",key:"1vg3eu"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const sr=de("Check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const PN=de("ChevronDown",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Z3=de("ChevronLeft",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ch=de("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ON=de("ChevronUp",[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const J3=de("CircleArrowUp",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m16 12-4-4-4 4",key:"177agl"}],["path",{d:"M12 16V8",key:"1sbj14"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const e4=de("CircleCheck",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const t4=de("CircleHelp",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3",key:"1u773s"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const r4=de("CircleX",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"m9 9 6 6",key:"z0biqf"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const n4=de("Clock",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polyline",{points:"12 6 12 12 16 14",key:"68esgv"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const i4=de("CodeXml",[["path",{d:"m18 16 4-4-4-4",key:"1inbqp"}],["path",{d:"m6 8-4 4 4 4",key:"15zrgr"}],["path",{d:"m14.5 4-5 16",key:"e7oirm"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Fs=de("Code",[["polyline",{points:"16 18 22 12 16 6",key:"z7tu5w"}],["polyline",{points:"8 6 2 12 8 18",key:"1eg1df"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const a4=de("Command",[["path",{d:"M15 6v12a3 3 0 1 0 3-3H6a3 3 0 1 0 3 3V6a3 3 0 1 0-3 3h12a3 3 0 1 0-3-3",key:"11bfej"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const lv=de("Compass",[["path",{d:"m16.24 7.76-1.804 5.411a2 2 0 0 1-1.265 1.265L7.76 16.24l1.804-5.411a2 2 0 0 1 1.265-1.265z",key:"9ktpf1"}],["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const o4=de("Construction",[["rect",{x:"2",y:"6",width:"20",height:"8",rx:"1",key:"1estib"}],["path",{d:"M17 14v7",key:"7m2elx"}],["path",{d:"M7 14v7",key:"1cm7wv"}],["path",{d:"M17 3v3",key:"1v4jwn"}],["path",{d:"M7 3v3",key:"7o6guu"}],["path",{d:"M10 14 2.3 6.3",key:"1023jk"}],["path",{d:"m14 6 7.7 7.7",key:"1s8pl2"}],["path",{d:"m8 6 8 8",key:"hl96qh"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const uv=de("Copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Hn=de("Cpu",[["rect",{width:"16",height:"16",x:"4",y:"4",rx:"2",key:"14l7u7"}],["rect",{width:"6",height:"6",x:"9",y:"9",rx:"1",key:"5aljv4"}],["path",{d:"M15 2v2",key:"13l42r"}],["path",{d:"M15 20v2",key:"15mkzm"}],["path",{d:"M2 15h2",key:"1gxd5l"}],["path",{d:"M2 9h2",key:"1bbxkp"}],["path",{d:"M20 15h2",key:"19e6y8"}],["path",{d:"M20 9h2",key:"19tzq7"}],["path",{d:"M9 2v2",key:"165o2o"}],["path",{d:"M9 20v2",key:"i2bqo8"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const s4=de("Database",[["ellipse",{cx:"12",cy:"5",rx:"9",ry:"3",key:"msslwz"}],["path",{d:"M3 5V19A9 3 0 0 0 21 19V5",key:"1wlel7"}],["path",{d:"M3 12A9 3 0 0 0 21 12",key:"mv7ke4"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Bs=de("Download",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"7 10 12 15 17 10",key:"2ggqvy"}],["line",{x1:"12",x2:"12",y1:"15",y2:"3",key:"1vk2je"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Us=de("ExternalLink",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const hw=de("EyeOff",[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const uf=de("Eye",[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const l4=de("FileText",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const u4=de("Flame",[["path",{d:"M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z",key:"96xj49"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const c4=de("FolderOpen",[["path",{d:"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2",key:"usdka0"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const _N=de("Gauge",[["path",{d:"m12 14 4-4",key:"9kzdfg"}],["path",{d:"M3.34 19a10 10 0 1 1 17.32 0",key:"19p75a"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const d4=de("GitCommitHorizontal",[["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}],["line",{x1:"3",x2:"9",y1:"12",y2:"12",key:"1dyftd"}],["line",{x1:"15",x2:"21",y1:"12",y2:"12",key:"oup4p8"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const f4=de("Globe",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",key:"13o1zl"}],["path",{d:"M2 12h20",key:"9i4pu4"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const yu=de("HardDrive",[["line",{x1:"22",x2:"2",y1:"12",y2:"12",key:"1y58io"}],["path",{d:"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z",key:"oot6mr"}],["line",{x1:"6",x2:"6.01",y1:"16",y2:"16",key:"sgf278"}],["line",{x1:"10",x2:"10.01",y1:"16",y2:"16",key:"1l4acy"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const h4=de("HeartPulse",[["path",{d:"M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z",key:"c3ymky"}],["path",{d:"M3.22 12H9.5l.5-1 2 4.5 2-7 1.5 3.5h5.27",key:"1uw2ng"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const m4=de("Heart",[["path",{d:"M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z",key:"c3ymky"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const mw=de("Info",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const p4=de("Key",[["path",{d:"m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4",key:"g0fldk"}],["path",{d:"m21 2-9.6 9.6",key:"1j0ho8"}],["circle",{cx:"7.5",cy:"15.5",r:"5.5",key:"yqb3hr"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const g4=de("Laptop",[["path",{d:"M20 16V7a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v9m16 0H4m16 0 1.28 2.55a1 1 0 0 1-.9 1.45H3.62a1 1 0 0 1-.9-1.45L4 16",key:"tarvll"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ky=de("Layers",[["path",{d:"m12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83Z",key:"8b97xw"}],["path",{d:"m22 17.65-9.17 4.16a2 2 0 0 1-1.66 0L2 17.65",key:"dd6zsq"}],["path",{d:"m22 12.65-9.17 4.16a2 2 0 0 1-1.66 0L2 12.65",key:"ep9fru"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const v4=de("LayoutDashboard",[["rect",{width:"7",height:"9",x:"3",y:"3",rx:"1",key:"10lvy0"}],["rect",{width:"7",height:"5",x:"14",y:"3",rx:"1",key:"16une8"}],["rect",{width:"7",height:"9",x:"14",y:"12",rx:"1",key:"1hutg5"}],["rect",{width:"7",height:"5",x:"3",y:"16",rx:"1",key:"ldoo1y"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const y4=de("LifeBuoy",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m4.93 4.93 4.24 4.24",key:"1ymg45"}],["path",{d:"m14.83 9.17 4.24-4.24",key:"1cb5xl"}],["path",{d:"m14.83 14.83 4.24 4.24",key:"q42g0n"}],["path",{d:"m9.17 14.83-4.24 4.24",key:"bqpfvv"}],["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const x4=de("Lightbulb",[["path",{d:"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5",key:"1gvzjb"}],["path",{d:"M9 18h6",key:"x1upvd"}],["path",{d:"M10 22h4",key:"ceow96"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const b4=de("List",[["path",{d:"M3 12h.01",key:"nlz23k"}],["path",{d:"M3 18h.01",key:"1tta3j"}],["path",{d:"M3 6h.01",key:"1rqtza"}],["path",{d:"M8 12h13",key:"1za7za"}],["path",{d:"M8 18h13",key:"1lx6n3"}],["path",{d:"M8 6h13",key:"ik3vkj"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const dh=de("LoaderCircle",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const w4=de("Lock",[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const k4=de("MessageSquare",[["path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z",key:"1lielz"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const j4=de("MessagesSquare",[["path",{d:"M14 9a2 2 0 0 1-2 2H6l-4 4V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2z",key:"p1xzt8"}],["path",{d:"M18 9h2a2 2 0 0 1 2 2v11l-4-4h-6a2 2 0 0 1-2-2v-1",key:"1cx29u"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const S4=de("Mic",[["path",{d:"M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z",key:"131961"}],["path",{d:"M19 10v2a7 7 0 0 1-14 0v-2",key:"1vc78b"}],["line",{x1:"12",x2:"12",y1:"19",y2:"22",key:"x3vr5v"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const pw=de("Monitor",[["rect",{width:"20",height:"14",x:"2",y:"3",rx:"2",key:"48i651"}],["line",{x1:"8",x2:"16",y1:"21",y2:"21",key:"1svkeh"}],["line",{x1:"12",x2:"12",y1:"17",y2:"21",key:"vw1qmm"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const N4=de("Moon",[["path",{d:"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z",key:"a7tn18"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const E4=de("Network",[["rect",{x:"16",y:"16",width:"6",height:"6",rx:"1",key:"4q2zg0"}],["rect",{x:"2",y:"16",width:"6",height:"6",rx:"1",key:"8cvhb9"}],["rect",{x:"9",y:"2",width:"6",height:"6",rx:"1",key:"1egb70"}],["path",{d:"M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3",key:"1jsf9p"}],["path",{d:"M12 12V8",key:"2874zd"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const A4=de("Package",[["path",{d:"M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z",key:"1a0edw"}],["path",{d:"M12 22V12",key:"d0xqtd"}],["path",{d:"m3.3 7 7.703 4.734a2 2 0 0 0 1.994 0L20.7 7",key:"yx3hmr"}],["path",{d:"m7.5 4.27 9 5.15",key:"1c824w"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const C4=de("PenLine",[["path",{d:"M12 20h9",key:"t2du7b"}],["path",{d:"M16.376 3.622a1 1 0 0 1 3.002 3.002L7.368 18.635a2 2 0 0 1-.855.506l-2.872.838a.5.5 0 0 1-.62-.62l.838-2.872a2 2 0 0 1 .506-.854z",key:"1ykcvy"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const cf=de("Plug",[["path",{d:"M12 22v-5",key:"1ega77"}],["path",{d:"M9 8V2",key:"14iosj"}],["path",{d:"M15 8V2",key:"18g5xt"}],["path",{d:"M18 8v5a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V8Z",key:"osxo6l"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const df=de("Plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const P4=de("Power",[["path",{d:"M12 2v10",key:"mnfbl"}],["path",{d:"M18.4 6.6a9 9 0 1 1-12.77.04",key:"obofu9"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const O4=de("Puzzle",[["path",{d:"M15.39 4.39a1 1 0 0 0 1.68-.474 2.5 2.5 0 1 1 3.014 3.015 1 1 0 0 0-.474 1.68l1.683 1.682a2.414 2.414 0 0 1 0 3.414L19.61 15.39a1 1 0 0 1-1.68-.474 2.5 2.5 0 1 0-3.014 3.015 1 1 0 0 1 .474 1.68l-1.683 1.682a2.414 2.414 0 0 1-3.414 0L8.61 19.61a1 1 0 0 0-1.68.474 2.5 2.5 0 1 1-3.014-3.015 1 1 0 0 0 .474-1.68l-1.683-1.682a2.414 2.414 0 0 1 0-3.414L4.39 8.61a1 1 0 0 1 1.68.474 2.5 2.5 0 1 0 3.014-3.015 1 1 0 0 1-.474-1.68l1.683-1.682a2.414 2.414 0 0 1 3.414 0z",key:"w46dr5"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Xa=de("RefreshCw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const _4=de("RotateCcw",[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const M4=de("Scroll",[["path",{d:"M19 17V5a2 2 0 0 0-2-2H4",key:"zz82l3"}],["path",{d:"M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3",key:"1ph1d7"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const MN=de("Search",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const I4=de("Send",[["path",{d:"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z",key:"1ffxy3"}],["path",{d:"m21.854 2.147-10.94 10.939",key:"12cjpa"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ff=de("Server",[["rect",{width:"20",height:"8",x:"2",y:"2",rx:"2",ry:"2",key:"ngkwjq"}],["rect",{width:"20",height:"8",x:"2",y:"14",rx:"2",ry:"2",key:"iecqi9"}],["line",{x1:"6",x2:"6.01",y1:"6",y2:"6",key:"16zg32"}],["line",{x1:"6",x2:"6.01",y1:"18",y2:"18",key:"nzw8ys"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const T4=de("Share2",[["circle",{cx:"18",cy:"5",r:"3",key:"gq8acd"}],["circle",{cx:"6",cy:"12",r:"3",key:"w7nqdw"}],["circle",{cx:"18",cy:"19",r:"3",key:"1xt0gg"}],["line",{x1:"8.59",x2:"15.42",y1:"13.51",y2:"17.49",key:"47mynk"}],["line",{x1:"15.41",x2:"8.59",y1:"6.51",y2:"10.49",key:"1n3mei"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const D4=de("ShieldAlert",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"M12 8v4",key:"1got3b"}],["path",{d:"M12 16h.01",key:"1drbdi"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const R4=de("ShieldCheck",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const L4=de("ShieldQuestion",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"M9.1 9a3 3 0 0 1 5.82 1c0 2-3 3-3 3",key:"mhlwft"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ws=de("Shield",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const gw=de("Shuffle",[["path",{d:"M2 18h1.4c1.3 0 2.5-.6 3.3-1.7l6.1-8.6c.7-1.1 2-1.7 3.3-1.7H22",key:"1wmou1"}],["path",{d:"m18 2 4 4-4 4",key:"pucp1d"}],["path",{d:"M2 6h1.9c1.5 0 2.9.9 3.6 2.2",key:"10bdb2"}],["path",{d:"M22 18h-5.9c-1.3 0-2.6-.7-3.3-1.8l-.5-.8",key:"vgxac0"}],["path",{d:"m18 14 4 4-4 4",key:"10pe0f"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const $4=de("SlidersHorizontal",[["line",{x1:"21",x2:"14",y1:"4",y2:"4",key:"obuewd"}],["line",{x1:"10",x2:"3",y1:"4",y2:"4",key:"1q6298"}],["line",{x1:"21",x2:"12",y1:"12",y2:"12",key:"1iu8h1"}],["line",{x1:"8",x2:"3",y1:"12",y2:"12",key:"ntss68"}],["line",{x1:"21",x2:"16",y1:"20",y2:"20",key:"14d8ph"}],["line",{x1:"12",x2:"3",y1:"20",y2:"20",key:"m0wm8r"}],["line",{x1:"14",x2:"14",y1:"2",y2:"6",key:"14e1ph"}],["line",{x1:"8",x2:"8",y1:"10",y2:"14",key:"1i6ji0"}],["line",{x1:"16",x2:"16",y1:"18",y2:"22",key:"1lctlv"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const z4=de("SlidersVertical",[["line",{x1:"4",x2:"4",y1:"21",y2:"14",key:"1p332r"}],["line",{x1:"4",x2:"4",y1:"10",y2:"3",key:"gb41h5"}],["line",{x1:"12",x2:"12",y1:"21",y2:"12",key:"hf2csr"}],["line",{x1:"12",x2:"12",y1:"8",y2:"3",key:"1kfi7u"}],["line",{x1:"20",x2:"20",y1:"21",y2:"16",key:"1lhrwl"}],["line",{x1:"20",x2:"20",y1:"12",y2:"3",key:"16vvfq"}],["line",{x1:"2",x2:"6",y1:"14",y2:"14",key:"1uebub"}],["line",{x1:"10",x2:"14",y1:"8",y2:"8",key:"1yglbp"}],["line",{x1:"18",x2:"22",y1:"16",y2:"16",key:"1jxqpz"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ys=de("Sparkles",[["path",{d:"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z",key:"4pj2yx"}],["path",{d:"M20 3v4",key:"1olli1"}],["path",{d:"M22 5h-4",key:"1gvqau"}],["path",{d:"M4 17v2",key:"vumght"}],["path",{d:"M5 18H3",key:"zchphs"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const IN=de("SquareTerminal",[["path",{d:"m7 11 2-2-2-2",key:"1lz0vl"}],["path",{d:"M11 13h4",key:"1p7l4v"}],["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const F4=de("Star",[["path",{d:"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z",key:"r04s7s"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const B4=de("Telescope",[["path",{d:"m10.065 12.493-6.18 1.318a.934.934 0 0 1-1.108-.702l-.537-2.15a1.07 1.07 0 0 1 .691-1.265l13.504-4.44",key:"k4qptu"}],["path",{d:"m13.56 11.747 4.332-.924",key:"19l80z"}],["path",{d:"m16 21-3.105-6.21",key:"7oh9d"}],["path",{d:"M16.485 5.94a2 2 0 0 1 1.455-2.425l1.09-.272a1 1 0 0 1 1.212.727l1.515 6.06a1 1 0 0 1-.727 1.213l-1.09.272a2 2 0 0 1-2.425-1.455z",key:"m7xp4m"}],["path",{d:"m6.158 8.633 1.114 4.456",key:"74o979"}],["path",{d:"m8 21 3.105-6.21",key:"1fvxut"}],["circle",{cx:"12",cy:"13",r:"2",key:"1c1ljs"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const TN=de("Terminal",[["polyline",{points:"4 17 10 11 4 5",key:"akl6gq"}],["line",{x1:"12",x2:"20",y1:"19",y2:"19",key:"q2wloq"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const cv=de("Trash2",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const bi=de("TriangleAlert",[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const U4=de("User",[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",key:"975kel"}],["circle",{cx:"12",cy:"7",r:"4",key:"17ys0d"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Qu=de("Wrench",[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z",key:"cbrjhi"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Wn=de("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const xa=de("Zap",[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]]),mu=[{id:"dashboard",label:"Zentrale",hint:"System- & Stack-Status",icon:v4},{id:"models",label:"Modell-Manager",hint:"Verwalten, laden & Gateway-Routing",icon:lf},{id:"memory",label:"Gedächtnis",hint:"Geteiltes Memory verwalten",icon:Ao},{id:"connect",label:"Verbinden",hint:"IDE-/Agent-Configs erzeugen",icon:cf},{id:"agent",label:"Hermes",hint:"Agent-Status & Verdrahtung",icon:wn},{id:"terminal",label:"Terminal",hint:"Interaktives Hermes-Agent-Terminal",icon:IN},{id:"guide",label:"Anleitung",hint:"Einrichten & Vibe-Coding",icon:t4}];var vw=1,H4=.9,W4=.8,K4=.17,eg=.1,tg=.999,G4=.9999,V4=.99,q4=/[\\\/_+.#"@\[\(\{&]/,Q4=/[\\\/_+.#"@\[\(\{&]/g,Y4=/[\s-]/,DN=/[\s-]/g;function dv(e,t,r,n,a,o,c){if(o===t.length)return a===e.length?vw:V4;var u=`${a},${o}`;if(c[u]!==void 0)return c[u];for(var f=n.charAt(o),h=r.indexOf(f,a),m=0,g,v,b,j;h>=0;)g=dv(e,t,r,n,h+1,o+1,c),g>m&&(h===a?g*=vw:q4.test(e.charAt(h-1))?(g*=W4,b=e.slice(a,h-1).match(Q4),b&&a>0&&(g*=Math.pow(tg,b.length))):Y4.test(e.charAt(h-1))?(g*=H4,j=e.slice(a,h-1).match(DN),j&&a>0&&(g*=Math.pow(tg,j.length))):(g*=K4,a>0&&(g*=Math.pow(tg,h-a))),e.charAt(h)!==t.charAt(o)&&(g*=G4)),(gg&&(g=v*eg)),g>m&&(m=g),h=r.indexOf(f,h+1);return c[u]=m,m}function yw(e){return e.toLowerCase().replace(DN," ")}function X4(e,t,r){return e=r&&r.length>0?`${e+" "+r.join(" ")}`:e,dv(e,t,yw(e),yw(t),0,0,{})}function ba(e,t,{checkForDefaultPrevented:r=!0}={}){return function(a){if(e==null||e(a),r===!1||!a.defaultPrevented)return t==null?void 0:t(a)}}function xw(e,t){if(typeof e=="function")return e(t);e!=null&&(e.current=t)}function Hs(...e){return t=>{let r=!1;const n=e.map(a=>{const o=xw(a,t);return!r&&typeof o=="function"&&(r=!0),o});if(r)return()=>{for(let a=0;a{var N;const{scope:v,children:b,...j}=g,k=((N=v==null?void 0:v[e])==null?void 0:N[f])||u,S=y.useMemo(()=>j,Object.values(j));return l.jsx(k.Provider,{value:S,children:b})};h.displayName=o+"Provider";function m(g,v){var k;const b=((k=v==null?void 0:v[e])==null?void 0:k[f])||u,j=y.useContext(b);if(j)return j;if(c!==void 0)return c;throw new Error(`\`${g}\` must be used within \`${o}\``)}return[h,m]}const a=()=>{const o=r.map(c=>y.createContext(c));return function(u){const f=(u==null?void 0:u[e])||o;return y.useMemo(()=>({[`__scope${e}`]:{...u,[e]:f}}),[u,f])}};return a.scopeName=e,[n,J4(a,...t)]}function J4(...e){const t=e[0];if(e.length===1)return t;const r=()=>{const n=e.map(a=>({useScope:a(),scopeName:a.scopeName}));return function(o){const c=n.reduce((u,{useScope:f,scopeName:h})=>{const g=f(o)[`__scope${h}`];return{...u,...g}},{});return y.useMemo(()=>({[`__scope${t.scopeName}`]:c}),[c])}};return r.scopeName=t.scopeName,r}var Nu=globalThis!=null&&globalThis.document?y.useLayoutEffect:()=>{},eI=lh[" useId ".trim().toString()]||(()=>{}),tI=0;function vi(e){const[t,r]=y.useState(eI());return Nu(()=>{r(n=>n??String(tI++))},[e]),t?`radix-${t}`:""}var rI=lh[" useInsertionEffect ".trim().toString()]||Nu;function nI({prop:e,defaultProp:t,onChange:r=()=>{},caller:n}){const[a,o,c]=iI({defaultProp:t,onChange:r}),u=e!==void 0,f=u?e:a;{const m=y.useRef(e!==void 0);y.useEffect(()=>{const g=m.current;g!==u&&console.warn(`${n} is changing from ${g?"controlled":"uncontrolled"} to ${u?"controlled":"uncontrolled"}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`),m.current=u},[u,n])}const h=y.useCallback(m=>{var g;if(u){const v=aI(m)?m(e):m;v!==e&&((g=c.current)==null||g.call(c,v))}else o(m)},[u,e,o,c]);return[f,h]}function iI({defaultProp:e,onChange:t}){const[r,n]=y.useState(e),a=y.useRef(r),o=y.useRef(t);return rI(()=>{o.current=t},[t]),y.useEffect(()=>{var c;a.current!==r&&((c=o.current)==null||c.call(o,r),a.current=r)},[r,a]),[r,n,o]}function aI(e){return typeof e=="function"}var fh=hN();function RN(e){const t=y.forwardRef((r,n)=>{let{children:a,...o}=r,c=null,u=!1;const f=[];bw(a)&&typeof Nd=="function"&&(a=Nd(a._payload)),y.Children.forEach(a,v=>{var b;if(cI(v)){u=!0;const j=v;let k="child"in j.props?j.props.child:j.props.children;bw(k)&&typeof Nd=="function"&&(k=Nd(k._payload)),c=sI(j,k),f.push((b=c==null?void 0:c.props)==null?void 0:b.children)}else f.push(v)}),c?c=y.cloneElement(c,void 0,f):!u&&y.Children.count(a)===1&&y.isValidElement(a)&&(c=a);const h=c?uI(c):void 0,m=Co(n,h);if(!c){if(a||a===0)throw new Error(u?mI(e):hI(e));return a}const g=lI(o,c.props??{});return c.type!==y.Fragment&&(g.ref=n?m:h),y.cloneElement(c,g)});return t.displayName=`${e}.Slot`,t}var oI=Symbol.for("radix.slottable"),sI=(e,t)=>{if("child"in e.props){const r=e.props.child;return y.isValidElement(r)?y.cloneElement(r,void 0,e.props.children(r.props.children)):null}return y.isValidElement(t)?t:null};function lI(e,t){const r={...t};for(const n in t){const a=e[n],o=t[n];/^on[A-Z]/.test(n)?a&&o?r[n]=(...u)=>{const f=o(...u);return a(...u),f}:a&&(r[n]=a):n==="style"?r[n]={...a,...o}:n==="className"&&(r[n]=[a,o].filter(Boolean).join(" "))}return{...e,...r}}function uI(e){var n,a;let t=(n=Object.getOwnPropertyDescriptor(e.props,"ref"))==null?void 0:n.get,r=t&&"isReactWarning"in t&&t.isReactWarning;return r?e.ref:(t=(a=Object.getOwnPropertyDescriptor(e,"ref"))==null?void 0:a.get,r=t&&"isReactWarning"in t&&t.isReactWarning,r?e.props.ref:e.props.ref||e.ref)}function cI(e){return y.isValidElement(e)&&typeof e.type=="function"&&"__radixId"in e.type&&e.type.__radixId===oI}var dI=Symbol.for("react.lazy");function bw(e){return e!=null&&typeof e=="object"&&"$$typeof"in e&&e.$$typeof===dI&&"_payload"in e&&fI(e._payload)}function fI(e){return typeof e=="object"&&e!==null&&"then"in e}var hI=e=>`${e} failed to slot onto its children. Expected a single React element child or \`Slottable\`.`,mI=e=>`${e} failed to slot onto its \`Slottable\`. Expected \`Slottable\` to receive a single React element child.`,Nd=lh[" use ".trim().toString()],pI=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],Xt=pI.reduce((e,t)=>{const r=RN(`Primitive.${t}`),n=y.forwardRef((a,o)=>{const{asChild:c,...u}=a,f=c?r:t;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),l.jsx(f,{...u,ref:o})});return n.displayName=`Primitive.${t}`,{...e,[t]:n}},{});function gI(e,t){e&&fh.flushSync(()=>e.dispatchEvent(t))}function Eu(e){const t=y.useRef(e);return y.useEffect(()=>{t.current=e}),y.useMemo(()=>((...r)=>{var n;return(n=t.current)==null?void 0:n.call(t,...r)}),[])}function vI(e,t=globalThis==null?void 0:globalThis.document){const r=Eu(e);y.useEffect(()=>{const n=a=>{a.key==="Escape"&&r(a)};return t.addEventListener("keydown",n,{capture:!0}),()=>t.removeEventListener("keydown",n,{capture:!0})},[r,t])}var yI="DismissableLayer",fv="dismissableLayer.update",xI="dismissableLayer.pointerDownOutside",bI="dismissableLayer.focusOutside",ww,jy=y.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set,dismissableSurfaces:new Set}),LN=y.forwardRef((e,t)=>{const{disableOutsidePointerEvents:r=!1,deferPointerDownOutside:n=!1,onEscapeKeyDown:a,onPointerDownOutside:o,onFocusOutside:c,onInteractOutside:u,onDismiss:f,...h}=e,m=y.useContext(jy),[g,v]=y.useState(null),b=(g==null?void 0:g.ownerDocument)??(globalThis==null?void 0:globalThis.document),[,j]=y.useState({}),k=Co(t,B=>v(B)),S=Array.from(m.layers),[N]=[...m.layersWithOutsidePointerEventsDisabled].slice(-1),E=S.indexOf(N),A=g?S.indexOf(g):-1,P=m.layersWithOutsidePointerEventsDisabled.size>0,_=A>=E,O=y.useRef(!1),D=SI(B=>{const F=B.target;if(!(F instanceof Node))return;const Y=[...m.branches].some(H=>H.contains(F));!_||Y||(o==null||o(B),u==null||u(B),B.defaultPrevented||f==null||f())},{ownerDocument:b,deferPointerDownOutside:n,isDeferredPointerDownOutsideRef:O,dismissableSurfaces:m.dismissableSurfaces}),U=NI(B=>{if(n&&O.current)return;const F=B.target;[...m.branches].some(H=>H.contains(F))||(c==null||c(B),u==null||u(B),B.defaultPrevented||f==null||f())},b);return vI(B=>{A===m.layers.size-1&&(a==null||a(B),!B.defaultPrevented&&f&&(B.preventDefault(),f()))},b),y.useEffect(()=>{if(g)return r&&(m.layersWithOutsidePointerEventsDisabled.size===0&&(ww=b.body.style.pointerEvents,b.body.style.pointerEvents="none"),m.layersWithOutsidePointerEventsDisabled.add(g)),m.layers.add(g),kw(),()=>{r&&(m.layersWithOutsidePointerEventsDisabled.delete(g),m.layersWithOutsidePointerEventsDisabled.size===0&&(b.body.style.pointerEvents=ww))}},[g,b,r,m]),y.useEffect(()=>()=>{g&&(m.layers.delete(g),m.layersWithOutsidePointerEventsDisabled.delete(g),kw())},[g,m]),y.useEffect(()=>{const B=()=>j({});return document.addEventListener(fv,B),()=>document.removeEventListener(fv,B)},[]),l.jsx(Xt.div,{...h,ref:k,style:{pointerEvents:P?_?"auto":"none":void 0,...e.style},onFocusCapture:ba(e.onFocusCapture,U.onFocusCapture),onBlurCapture:ba(e.onBlurCapture,U.onBlurCapture),onPointerDownCapture:ba(e.onPointerDownCapture,D.onPointerDownCapture)})});LN.displayName=yI;var wI="DismissableLayerBranch",kI=y.forwardRef((e,t)=>{const r=y.useContext(jy),n=y.useRef(null),a=Co(t,n);return y.useEffect(()=>{const o=n.current;if(o)return r.branches.add(o),()=>{r.branches.delete(o)}},[r.branches]),l.jsx(Xt.div,{...e,ref:a})});kI.displayName=wI;function jI(){const e=y.useContext(jy),[t,r]=y.useState(null);return y.useEffect(()=>{if(t)return e.dismissableSurfaces.add(t),()=>{e.dismissableSurfaces.delete(t)}},[t,e.dismissableSurfaces]),r}function SI(e,t){const{ownerDocument:r=globalThis==null?void 0:globalThis.document,deferPointerDownOutside:n=!1,isDeferredPointerDownOutsideRef:a,dismissableSurfaces:o}=t,c=Eu(e),u=y.useRef(!1),f=y.useRef(!1),h=y.useRef(new Map),m=y.useRef(()=>{});return y.useEffect(()=>{function g(){f.current=!1,a.current=!1,h.current.clear()}function v(){return Array.from(h.current.values()).some(Boolean)}function b(E){if(!f.current)return;const A=E.target;A instanceof Node&&[...o].some(_=>_.contains(A))||h.current.set(E.type,!0),E.type==="click"&&window.setTimeout(()=>{f.current&&m.current()},0)}function j(E){f.current&&h.current.set(E.type,!1)}const k=E=>{if(E.target&&!u.current){let A=function(){r.removeEventListener("click",m.current);const _=v();g(),_||$N(xI,c,P,{discrete:!0})};const P={originalEvent:E};f.current=!0,a.current=n&&E.button===0,h.current.clear(),!n||E.button!==0?A():(r.removeEventListener("click",m.current),m.current=A,r.addEventListener("click",m.current,{once:!0}))}else r.removeEventListener("click",m.current),g();u.current=!1},S=["pointerup","mousedown","mouseup","touchstart","touchend","click"];for(const E of S)r.addEventListener(E,b,!0),r.addEventListener(E,j);const N=window.setTimeout(()=>{r.addEventListener("pointerdown",k)},0);return()=>{window.clearTimeout(N),r.removeEventListener("pointerdown",k),r.removeEventListener("click",m.current);for(const E of S)r.removeEventListener(E,b,!0),r.removeEventListener(E,j)}},[r,c,n,a,o]),{onPointerDownCapture:()=>u.current=!0}}function NI(e,t=globalThis==null?void 0:globalThis.document){const r=Eu(e),n=y.useRef(!1);return y.useEffect(()=>{const a=o=>{o.target&&!n.current&&$N(bI,r,{originalEvent:o},{discrete:!1})};return t.addEventListener("focusin",a),()=>t.removeEventListener("focusin",a)},[t,r]),{onFocusCapture:()=>n.current=!0,onBlurCapture:()=>n.current=!1}}function kw(){const e=new CustomEvent(fv);document.dispatchEvent(e)}function $N(e,t,r,{discrete:n}){const a=r.originalEvent.target,o=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:r});t&&a.addEventListener(e,t,{once:!0}),n?gI(a,o):a.dispatchEvent(o)}var rg="focusScope.autoFocusOnMount",ng="focusScope.autoFocusOnUnmount",jw={bubbles:!1,cancelable:!0},EI="FocusScope",zN=y.forwardRef((e,t)=>{const{loop:r=!1,trapped:n=!1,onMountAutoFocus:a,onUnmountAutoFocus:o,...c}=e,[u,f]=y.useState(null),h=Eu(a),m=Eu(o),g=y.useRef(null),v=Co(t,k=>f(k)),b=y.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;y.useEffect(()=>{if(n){let k=function(A){if(b.paused||!u)return;const P=A.target;u.contains(P)?g.current=P:ia(g.current,{select:!0})},S=function(A){if(b.paused||!u)return;const P=A.relatedTarget;P!==null&&(u.contains(P)||ia(g.current,{select:!0}))},N=function(A){if(document.activeElement===document.body)for(const _ of A)_.removedNodes.length>0&&ia(u)};document.addEventListener("focusin",k),document.addEventListener("focusout",S);const E=new MutationObserver(N);return u&&E.observe(u,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",k),document.removeEventListener("focusout",S),E.disconnect()}}},[n,u,b.paused]),y.useEffect(()=>{if(u){Nw.add(b);const k=document.activeElement;if(!u.contains(k)){const N=new CustomEvent(rg,jw);u.addEventListener(rg,h),u.dispatchEvent(N),N.defaultPrevented||(AI(MI(FN(u)),{select:!0}),document.activeElement===k&&ia(u))}return()=>{u.removeEventListener(rg,h),setTimeout(()=>{const N=new CustomEvent(ng,jw);u.addEventListener(ng,m),u.dispatchEvent(N),N.defaultPrevented||ia(k??document.body,{select:!0}),u.removeEventListener(ng,m),Nw.remove(b)},0)}}},[u,h,m,b]);const j=y.useCallback(k=>{if(!r&&!n||b.paused)return;const S=k.key==="Tab"&&!k.altKey&&!k.ctrlKey&&!k.metaKey,N=document.activeElement;if(S&&N){const E=k.currentTarget,[A,P]=CI(E);A&&P?!k.shiftKey&&N===P?(k.preventDefault(),r&&ia(A,{select:!0})):k.shiftKey&&N===A&&(k.preventDefault(),r&&ia(P,{select:!0})):N===E&&k.preventDefault()}},[r,n,b.paused]);return l.jsx(Xt.div,{tabIndex:-1,...c,ref:v,onKeyDown:j})});zN.displayName=EI;function AI(e,{select:t=!1}={}){const r=document.activeElement;for(const n of e)if(ia(n,{select:t}),document.activeElement!==r)return}function CI(e){const t=FN(e),r=Sw(t,e),n=Sw(t.reverse(),e);return[r,n]}function FN(e){const t=[],r=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:n=>{const a=n.tagName==="INPUT"&&n.type==="hidden";return n.disabled||n.hidden||a?NodeFilter.FILTER_SKIP:n.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;r.nextNode();)t.push(r.currentNode);return t}function Sw(e,t){for(const r of e)if(!PI(r,{upTo:t}))return r}function PI(e,{upTo:t}){if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(t!==void 0&&e===t)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1}function OI(e){return e instanceof HTMLInputElement&&"select"in e}function ia(e,{select:t=!1}={}){if(e&&e.focus){const r=document.activeElement;e.focus({preventScroll:!0}),e!==r&&OI(e)&&t&&e.select()}}var Nw=_I();function _I(){let e=[];return{add(t){const r=e[0];t!==r&&(r==null||r.pause()),e=Ew(e,t),e.unshift(t)},remove(t){var r;e=Ew(e,t),(r=e[0])==null||r.resume()}}}function Ew(e,t){const r=[...e],n=r.indexOf(t);return n!==-1&&r.splice(n,1),r}function MI(e){return e.filter(t=>t.tagName!=="A")}var II="Portal",BN=y.forwardRef((e,t)=>{var u;const{container:r,...n}=e,[a,o]=y.useState(!1);Nu(()=>o(!0),[]);const c=r||a&&((u=globalThis==null?void 0:globalThis.document)==null?void 0:u.body);return c?fh.createPortal(l.jsx(Xt.div,{...n,ref:t}),c):null});BN.displayName=II;function TI(e,t){return y.useReducer((r,n)=>t[r][n]??r,e)}var hh=e=>{const{present:t,children:r}=e,n=DI(t),a=typeof r=="function"?r({present:n.isPresent}):y.Children.only(r),o=RI(n.ref,LI(a));return typeof r=="function"||n.isPresent?y.cloneElement(a,{ref:o}):null};hh.displayName="Presence";function DI(e){const[t,r]=y.useState(),n=y.useRef(null),a=y.useRef(e),o=y.useRef("none"),c=e?"mounted":"unmounted",[u,f]=TI(c,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return y.useEffect(()=>{const h=Ed(n.current);o.current=u==="mounted"?h:"none"},[u]),Nu(()=>{const h=n.current,m=a.current;if(m!==e){const v=o.current,b=Ed(h);e?f("MOUNT"):b==="none"||(h==null?void 0:h.display)==="none"?f("UNMOUNT"):f(m&&v!==b?"ANIMATION_OUT":"UNMOUNT"),a.current=e}},[e,f]),Nu(()=>{if(t){let h;const m=t.ownerDocument.defaultView??window,g=b=>{const k=Ed(n.current).includes(CSS.escape(b.animationName));if(b.target===t&&k&&(f("ANIMATION_END"),!a.current)){const S=t.style.animationFillMode;t.style.animationFillMode="forwards",h=m.setTimeout(()=>{t.style.animationFillMode==="forwards"&&(t.style.animationFillMode=S)})}},v=b=>{b.target===t&&(o.current=Ed(n.current))};return t.addEventListener("animationstart",v),t.addEventListener("animationcancel",g),t.addEventListener("animationend",g),()=>{m.clearTimeout(h),t.removeEventListener("animationstart",v),t.removeEventListener("animationcancel",g),t.removeEventListener("animationend",g)}}else f("ANIMATION_END")},[t,f]),{isPresent:["mounted","unmountSuspended"].includes(u),ref:y.useCallback(h=>{n.current=h?getComputedStyle(h):null,r(h)},[])}}function Aw(e,t){if(typeof e=="function")return e(t);e!=null&&(e.current=t)}function RI(...e){const t=y.useRef(e);return t.current=e,y.useCallback(r=>{const n=t.current;let a=!1;const o=n.map(c=>{const u=Aw(c,r);return!a&&typeof u=="function"&&(a=!0),u});if(a)return()=>{for(let c=0;c{_n||(_n={start:Cw(),end:Cw()});const{start:e,end:t}=_n;return document.body.firstElementChild!==e&&document.body.insertAdjacentElement("afterbegin",e),document.body.lastElementChild!==t&&document.body.insertAdjacentElement("beforeend",t),Ad++,()=>{Ad===1&&(_n==null||_n.start.remove(),_n==null||_n.end.remove(),_n=null),Ad=Math.max(0,Ad-1)}},[])}function Cw(){const e=document.createElement("span");return e.setAttribute("data-radix-focus-guard",""),e.tabIndex=0,e.style.outline="none",e.style.opacity="0",e.style.position="fixed",e.style.pointerEvents="none",e}var $n=function(){return $n=Object.assign||function(t){for(var r,n=1,a=arguments.length;n"u")return tT;var t=rT(e),r=document.documentElement.clientWidth,n=window.innerWidth;return{left:t[0],top:t[1],right:t[2],gap:Math.max(0,n-r+t[2]-t[0])}},iT=KN(),ks="data-scroll-locked",aT=function(e,t,r,n){var a=e.left,o=e.top,c=e.right,u=e.gap;return r===void 0&&(r="margin"),` + .`.concat(FI,` { + overflow: hidden `).concat(n,`; + padding-right: `).concat(u,"px ").concat(n,`; + } + body[`).concat(ks,`] { + overflow: hidden `).concat(n,`; + overscroll-behavior: contain; + `).concat([t&&"position: relative ".concat(n,";"),r==="margin"&&` + padding-left: `.concat(a,`px; + padding-top: `).concat(o,`px; + padding-right: `).concat(c,`px; + margin-left:0; + margin-top:0; + margin-right: `).concat(u,"px ").concat(n,`; + `),r==="padding"&&"padding-right: ".concat(u,"px ").concat(n,";")].filter(Boolean).join(""),` + } + + .`).concat(Yd,` { + right: `).concat(u,"px ").concat(n,`; + } + + .`).concat(Xd,` { + margin-right: `).concat(u,"px ").concat(n,`; + } + + .`).concat(Yd," .").concat(Yd,` { + right: 0 `).concat(n,`; + } + + .`).concat(Xd," .").concat(Xd,` { + margin-right: 0 `).concat(n,`; + } + + body[`).concat(ks,`] { + `).concat(BI,": ").concat(u,`px; + } +`)},Ow=function(){var e=parseInt(document.body.getAttribute(ks)||"0",10);return isFinite(e)?e:0},oT=function(){y.useEffect(function(){return document.body.setAttribute(ks,(Ow()+1).toString()),function(){var e=Ow()-1;e<=0?document.body.removeAttribute(ks):document.body.setAttribute(ks,e.toString())}},[])},sT=function(e){var t=e.noRelative,r=e.noImportant,n=e.gapMode,a=n===void 0?"margin":n;oT();var o=y.useMemo(function(){return nT(a)},[a]);return y.createElement(iT,{styles:aT(o,!t,a,r?"":"!important")})},hv=!1;if(typeof window<"u")try{var Cd=Object.defineProperty({},"passive",{get:function(){return hv=!0,!0}});window.addEventListener("test",Cd,Cd),window.removeEventListener("test",Cd,Cd)}catch{hv=!1}var is=hv?{passive:!1}:!1,lT=function(e){return e.tagName==="TEXTAREA"},GN=function(e,t){if(!(e instanceof Element))return!1;var r=window.getComputedStyle(e);return r[t]!=="hidden"&&!(r.overflowY===r.overflowX&&!lT(e)&&r[t]==="visible")},uT=function(e){return GN(e,"overflowY")},cT=function(e){return GN(e,"overflowX")},_w=function(e,t){var r=t.ownerDocument,n=t;do{typeof ShadowRoot<"u"&&n instanceof ShadowRoot&&(n=n.host);var a=VN(e,n);if(a){var o=qN(e,n),c=o[1],u=o[2];if(c>u)return!0}n=n.parentNode}while(n&&n!==r.body);return!1},dT=function(e){var t=e.scrollTop,r=e.scrollHeight,n=e.clientHeight;return[t,r,n]},fT=function(e){var t=e.scrollLeft,r=e.scrollWidth,n=e.clientWidth;return[t,r,n]},VN=function(e,t){return e==="v"?uT(t):cT(t)},qN=function(e,t){return e==="v"?dT(t):fT(t)},hT=function(e,t){return e==="h"&&t==="rtl"?-1:1},mT=function(e,t,r,n,a){var o=hT(e,window.getComputedStyle(t).direction),c=o*n,u=r.target,f=t.contains(u),h=!1,m=c>0,g=0,v=0;do{if(!u)break;var b=qN(e,u),j=b[0],k=b[1],S=b[2],N=k-S-o*j;(j||N)&&VN(e,u)&&(g+=N,v+=j);var E=u.parentNode;u=E&&E.nodeType===Node.DOCUMENT_FRAGMENT_NODE?E.host:E}while(!f&&u!==document.body||f&&(t.contains(u)||t===u));return(m&&Math.abs(g)<1||!m&&Math.abs(v)<1)&&(h=!0),h},Pd=function(e){return"changedTouches"in e?[e.changedTouches[0].clientX,e.changedTouches[0].clientY]:[0,0]},Mw=function(e){return[e.deltaX,e.deltaY]},Iw=function(e){return e&&"current"in e?e.current:e},pT=function(e,t){return e[0]===t[0]&&e[1]===t[1]},gT=function(e){return` + .block-interactivity-`.concat(e,` {pointer-events: none;} + .allow-interactivity-`).concat(e,` {pointer-events: all;} +`)},vT=0,as=[];function yT(e){var t=y.useRef([]),r=y.useRef([0,0]),n=y.useRef(),a=y.useState(vT++)[0],o=y.useState(KN)[0],c=y.useRef(e);y.useEffect(function(){c.current=e},[e]),y.useEffect(function(){if(e.inert){document.body.classList.add("block-interactivity-".concat(a));var k=zI([e.lockRef.current],(e.shards||[]).map(Iw),!0).filter(Boolean);return k.forEach(function(S){return S.classList.add("allow-interactivity-".concat(a))}),function(){document.body.classList.remove("block-interactivity-".concat(a)),k.forEach(function(S){return S.classList.remove("allow-interactivity-".concat(a))})}}},[e.inert,e.lockRef.current,e.shards]);var u=y.useCallback(function(k,S){if("touches"in k&&k.touches.length===2||k.type==="wheel"&&k.ctrlKey)return!c.current.allowPinchZoom;var N=Pd(k),E=r.current,A="deltaX"in k?k.deltaX:E[0]-N[0],P="deltaY"in k?k.deltaY:E[1]-N[1],_,O=k.target,D=Math.abs(A)>Math.abs(P)?"h":"v";if("touches"in k&&D==="h"&&O.type==="range")return!1;var U=window.getSelection(),B=U&&U.anchorNode,F=B?B===O||B.contains(O):!1;if(F)return!1;var Y=_w(D,O);if(!Y)return!0;if(Y?_=D:(_=D==="v"?"h":"v",Y=_w(D,O)),!Y)return!1;if(!n.current&&"changedTouches"in k&&(A||P)&&(n.current=_),!_)return!0;var H=n.current||_;return mT(H,S,k,H==="h"?A:P)},[]),f=y.useCallback(function(k){var S=k;if(!(!as.length||as[as.length-1]!==o)){var N="deltaY"in S?Mw(S):Pd(S),E=t.current.filter(function(_){return _.name===S.type&&(_.target===S.target||S.target===_.shadowParent)&&pT(_.delta,N)})[0];if(E&&E.should){S.cancelable&&S.preventDefault();return}if(!E){var A=(c.current.shards||[]).map(Iw).filter(Boolean).filter(function(_){return _.contains(S.target)}),P=A.length>0?u(S,A[0]):!c.current.noIsolation;P&&S.cancelable&&S.preventDefault()}}},[]),h=y.useCallback(function(k,S,N,E){var A={name:k,delta:S,target:N,should:E,shadowParent:xT(N)};t.current.push(A),setTimeout(function(){t.current=t.current.filter(function(P){return P!==A})},1)},[]),m=y.useCallback(function(k){r.current=Pd(k),n.current=void 0},[]),g=y.useCallback(function(k){h(k.type,Mw(k),k.target,u(k,e.lockRef.current))},[]),v=y.useCallback(function(k){h(k.type,Pd(k),k.target,u(k,e.lockRef.current))},[]);y.useEffect(function(){return as.push(o),e.setCallbacks({onScrollCapture:g,onWheelCapture:g,onTouchMoveCapture:v}),document.addEventListener("wheel",f,is),document.addEventListener("touchmove",f,is),document.addEventListener("touchstart",m,is),function(){as=as.filter(function(k){return k!==o}),document.removeEventListener("wheel",f,is),document.removeEventListener("touchmove",f,is),document.removeEventListener("touchstart",m,is)}},[]);var b=e.removeScrollBar,j=e.inert;return y.createElement(y.Fragment,null,j?y.createElement(o,{styles:gT(a)}):null,b?y.createElement(sT,{noRelative:e.noRelative,gapMode:e.gapMode}):null)}function xT(e){for(var t=null;e!==null;)e instanceof ShadowRoot&&(t=e.host,e=e.host),e=e.parentNode;return t}const bT=qI(WN,yT);var QN=y.forwardRef(function(e,t){return y.createElement(mh,$n({},e,{ref:t,sideCar:bT}))});QN.classNames=mh.classNames;var wT=function(e){if(typeof document>"u")return null;var t=Array.isArray(e)?e[0]:e;return t.ownerDocument.body},os=new WeakMap,Od=new WeakMap,_d={},sg=0,YN=function(e){return e&&(e.host||YN(e.parentNode))},kT=function(e,t){return t.map(function(r){if(e.contains(r))return r;var n=YN(r);return n&&e.contains(n)?n:(console.error("aria-hidden",r,"in not contained inside",e,". Doing nothing"),null)}).filter(function(r){return!!r})},jT=function(e,t,r,n){var a=kT(t,Array.isArray(e)?e:[e]);_d[r]||(_d[r]=new WeakMap);var o=_d[r],c=[],u=new Set,f=new Set(a),h=function(g){!g||u.has(g)||(u.add(g),h(g.parentNode))};a.forEach(h);var m=function(g){!g||f.has(g)||Array.prototype.forEach.call(g.children,function(v){if(u.has(v))m(v);else try{var b=v.getAttribute(n),j=b!==null&&b!=="false",k=(os.get(v)||0)+1,S=(o.get(v)||0)+1;os.set(v,k),o.set(v,S),c.push(v),k===1&&j&&Od.set(v,!0),S===1&&v.setAttribute(r,"true"),j||v.setAttribute(n,"true")}catch(N){console.error("aria-hidden: cannot operate on ",v,N)}})};return m(t),u.clear(),sg++,function(){c.forEach(function(g){var v=os.get(g)-1,b=o.get(g)-1;os.set(g,v),o.set(g,b),v||(Od.has(g)||g.removeAttribute(n),Od.delete(g)),b||g.removeAttribute(r)}),sg--,sg||(os=new WeakMap,os=new WeakMap,Od=new WeakMap,_d={})}},ST=function(e,t,r){r===void 0&&(r="data-aria-hidden");var n=Array.from(Array.isArray(e)?e:[e]),a=wT(e);return a?(n.push.apply(n,Array.from(a.querySelectorAll("[aria-live], script"))),jT(n,a,r,"aria-hidden")):function(){return null}},ph="Dialog",[XN]=Z4(ph),[NT,Sn]=XN(ph),ZN=e=>{const{__scopeDialog:t,children:r,open:n,defaultOpen:a,onOpenChange:o,modal:c=!0}=e,u=y.useRef(null),f=y.useRef(null),[h,m]=nI({prop:n,defaultProp:a??!1,onChange:o,caller:ph});return l.jsx(NT,{scope:t,triggerRef:u,contentRef:f,contentId:vi(),titleId:vi(),descriptionId:vi(),open:h,onOpenChange:m,onOpenToggle:y.useCallback(()=>m(g=>!g),[m]),modal:c,children:r})};ZN.displayName=ph;var JN="DialogTrigger",ET=y.forwardRef((e,t)=>{const{__scopeDialog:r,...n}=e,a=Sn(JN,r),o=Co(t,a.triggerRef);return l.jsx(Xt.button,{type:"button","aria-haspopup":"dialog","aria-expanded":a.open,"aria-controls":a.open?a.contentId:void 0,"data-state":Ny(a.open),...n,ref:o,onClick:ba(e.onClick,a.onOpenToggle)})});ET.displayName=JN;var Sy="DialogPortal",[AT,eE]=XN(Sy,{forceMount:void 0}),tE=e=>{const{__scopeDialog:t,forceMount:r,children:n,container:a}=e,o=Sn(Sy,t);return l.jsx(AT,{scope:t,forceMount:r,children:y.Children.map(n,c=>l.jsx(hh,{present:r||o.open,children:l.jsx(BN,{asChild:!0,container:a,children:c})}))})};tE.displayName=Sy;var hf="DialogOverlay",rE=y.forwardRef((e,t)=>{const r=eE(hf,e.__scopeDialog),{forceMount:n=r.forceMount,...a}=e,o=Sn(hf,e.__scopeDialog);return o.modal?l.jsx(hh,{present:n||o.open,children:l.jsx(PT,{...a,ref:t})}):null});rE.displayName=hf;var CT=RN("DialogOverlay.RemoveScroll"),PT=y.forwardRef((e,t)=>{const{__scopeDialog:r,...n}=e,a=Sn(hf,r),o=jI(),c=Co(t,o);return l.jsx(QN,{as:CT,allowPinchZoom:!0,shards:[a.contentRef],children:l.jsx(Xt.div,{"data-state":Ny(a.open),...n,ref:c,style:{pointerEvents:"auto",...n.style}})})}),Ws="DialogContent",nE=y.forwardRef((e,t)=>{const r=eE(Ws,e.__scopeDialog),{forceMount:n=r.forceMount,...a}=e,o=Sn(Ws,e.__scopeDialog);return l.jsx(hh,{present:n||o.open,children:o.modal?l.jsx(OT,{...a,ref:t}):l.jsx(_T,{...a,ref:t})})});nE.displayName=Ws;var OT=y.forwardRef((e,t)=>{const r=Sn(Ws,e.__scopeDialog),n=y.useRef(null),a=Co(t,r.contentRef,n);return y.useEffect(()=>{const o=n.current;if(o)return ST(o)},[]),l.jsx(iE,{...e,ref:a,trapFocus:r.open,disableOutsidePointerEvents:r.open,onCloseAutoFocus:ba(e.onCloseAutoFocus,o=>{var c;o.preventDefault(),(c=r.triggerRef.current)==null||c.focus()}),onPointerDownOutside:ba(e.onPointerDownOutside,o=>{const c=o.detail.originalEvent,u=c.button===0&&c.ctrlKey===!0;(c.button===2||u)&&o.preventDefault()}),onFocusOutside:ba(e.onFocusOutside,o=>o.preventDefault())})}),_T=y.forwardRef((e,t)=>{const r=Sn(Ws,e.__scopeDialog),n=y.useRef(!1),a=y.useRef(!1);return l.jsx(iE,{...e,ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:o=>{var c,u;(c=e.onCloseAutoFocus)==null||c.call(e,o),o.defaultPrevented||(n.current||(u=r.triggerRef.current)==null||u.focus(),o.preventDefault()),n.current=!1,a.current=!1},onInteractOutside:o=>{var f,h;(f=e.onInteractOutside)==null||f.call(e,o),o.defaultPrevented||(n.current=!0,o.detail.originalEvent.type==="pointerdown"&&(a.current=!0));const c=o.target;((h=r.triggerRef.current)==null?void 0:h.contains(c))&&o.preventDefault(),o.detail.originalEvent.type==="focusin"&&a.current&&o.preventDefault()}})}),iE=y.forwardRef((e,t)=>{const{__scopeDialog:r,trapFocus:n,onOpenAutoFocus:a,onCloseAutoFocus:o,...c}=e,u=Sn(Ws,r);return $I(),l.jsx(l.Fragment,{children:l.jsx(zN,{asChild:!0,loop:!0,trapped:n,onMountAutoFocus:a,onUnmountAutoFocus:o,children:l.jsx(LN,{role:"dialog",id:u.contentId,"aria-describedby":u.descriptionId,"aria-labelledby":u.titleId,"data-state":Ny(u.open),...c,ref:t,deferPointerDownOutside:!0,onDismiss:()=>u.onOpenChange(!1)})})})}),aE="DialogTitle",MT=y.forwardRef((e,t)=>{const{__scopeDialog:r,...n}=e,a=Sn(aE,r);return l.jsx(Xt.h2,{id:a.titleId,...n,ref:t})});MT.displayName=aE;var oE="DialogDescription",IT=y.forwardRef((e,t)=>{const{__scopeDialog:r,...n}=e,a=Sn(oE,r);return l.jsx(Xt.p,{id:a.descriptionId,...n,ref:t})});IT.displayName=oE;var sE="DialogClose",TT=y.forwardRef((e,t)=>{const{__scopeDialog:r,...n}=e,a=Sn(sE,r);return l.jsx(Xt.button,{type:"button",...n,ref:t,onClick:ba(e.onClick,()=>a.onOpenChange(!1))})});TT.displayName=sE;function Ny(e){return e?"open":"closed"}var Zl='[cmdk-group=""]',lg='[cmdk-group-items=""]',DT='[cmdk-group-heading=""]',lE='[cmdk-item=""]',Tw=`${lE}:not([aria-disabled="true"])`,mv="cmdk-item-select",ps="data-value",RT=(e,t,r)=>X4(e,t,r),uE=y.createContext(void 0),Yu=()=>y.useContext(uE),cE=y.createContext(void 0),Ey=()=>y.useContext(cE),dE=y.createContext(void 0),fE=y.forwardRef((e,t)=>{let r=gs(()=>{var M,K;return{search:"",value:(K=(M=e.value)!=null?M:e.defaultValue)!=null?K:"",selectedItemId:void 0,filtered:{count:0,items:new Map,groups:new Set}}}),n=gs(()=>new Set),a=gs(()=>new Map),o=gs(()=>new Map),c=gs(()=>new Set),u=hE(e),{label:f,children:h,value:m,onValueChange:g,filter:v,shouldFilter:b,loop:j,disablePointerSelection:k=!1,vimBindings:S=!0,...N}=e,E=vi(),A=vi(),P=vi(),_=y.useRef(null),O=VT();yo(()=>{if(m!==void 0){let M=m.trim();r.current.value=M,D.emit()}},[m]),yo(()=>{O(6,pe)},[]);let D=y.useMemo(()=>({subscribe:M=>(c.current.add(M),()=>c.current.delete(M)),snapshot:()=>r.current,setState:(M,K,ne)=>{var Z,me,ge,Pe;if(!Object.is(r.current[M],K)){if(r.current[M]=K,M==="search")H(),F(),O(1,Y);else if(M==="value"){if(document.activeElement.hasAttribute("cmdk-input")||document.activeElement.hasAttribute("cmdk-root")){let re=document.getElementById(P);re?re.focus():(Z=document.getElementById(E))==null||Z.focus()}if(O(7,()=>{var re;r.current.selectedItemId=(re=ue())==null?void 0:re.id,D.emit()}),ne||O(5,pe),((me=u.current)==null?void 0:me.value)!==void 0){let re=K??"";(Pe=(ge=u.current).onValueChange)==null||Pe.call(ge,re);return}}D.emit()}},emit:()=>{c.current.forEach(M=>M())}}),[]),U=y.useMemo(()=>({value:(M,K,ne)=>{var Z;K!==((Z=o.current.get(M))==null?void 0:Z.value)&&(o.current.set(M,{value:K,keywords:ne}),r.current.filtered.items.set(M,B(K,ne)),O(2,()=>{F(),D.emit()}))},item:(M,K)=>(n.current.add(M),K&&(a.current.has(K)?a.current.get(K).add(M):a.current.set(K,new Set([M]))),O(3,()=>{H(),F(),r.current.value||Y(),D.emit()}),()=>{o.current.delete(M),n.current.delete(M),r.current.filtered.items.delete(M);let ne=ue();O(4,()=>{H(),(ne==null?void 0:ne.getAttribute("id"))===M&&Y(),D.emit()})}),group:M=>(a.current.has(M)||a.current.set(M,new Set),()=>{o.current.delete(M),a.current.delete(M)}),filter:()=>u.current.shouldFilter,label:f||e["aria-label"],getDisablePointerSelection:()=>u.current.disablePointerSelection,listId:E,inputId:P,labelId:A,listInnerRef:_}),[]);function B(M,K){var ne,Z;let me=(Z=(ne=u.current)==null?void 0:ne.filter)!=null?Z:RT;return M?me(M,r.current.search,K):0}function F(){if(!r.current.search||u.current.shouldFilter===!1)return;let M=r.current.filtered.items,K=[];r.current.filtered.groups.forEach(Z=>{let me=a.current.get(Z),ge=0;me.forEach(Pe=>{let re=M.get(Pe);ge=Math.max(re,ge)}),K.push([Z,ge])});let ne=_.current;he().sort((Z,me)=>{var ge,Pe;let re=Z.getAttribute("id"),xe=me.getAttribute("id");return((ge=M.get(xe))!=null?ge:0)-((Pe=M.get(re))!=null?Pe:0)}).forEach(Z=>{let me=Z.closest(lg);me?me.appendChild(Z.parentElement===me?Z:Z.closest(`${lg} > *`)):ne.appendChild(Z.parentElement===ne?Z:Z.closest(`${lg} > *`))}),K.sort((Z,me)=>me[1]-Z[1]).forEach(Z=>{var me;let ge=(me=_.current)==null?void 0:me.querySelector(`${Zl}[${ps}="${encodeURIComponent(Z[0])}"]`);ge==null||ge.parentElement.appendChild(ge)})}function Y(){let M=he().find(ne=>ne.getAttribute("aria-disabled")!=="true"),K=M==null?void 0:M.getAttribute(ps);D.setState("value",K||void 0)}function H(){var M,K,ne,Z;if(!r.current.search||u.current.shouldFilter===!1){r.current.filtered.count=n.current.size;return}r.current.filtered.groups=new Set;let me=0;for(let ge of n.current){let Pe=(K=(M=o.current.get(ge))==null?void 0:M.value)!=null?K:"",re=(Z=(ne=o.current.get(ge))==null?void 0:ne.keywords)!=null?Z:[],xe=B(Pe,re);r.current.filtered.items.set(ge,xe),xe>0&&me++}for(let[ge,Pe]of a.current)for(let re of Pe)if(r.current.filtered.items.get(re)>0){r.current.filtered.groups.add(ge);break}r.current.filtered.count=me}function pe(){var M,K,ne;let Z=ue();Z&&(((M=Z.parentElement)==null?void 0:M.firstChild)===Z&&((ne=(K=Z.closest(Zl))==null?void 0:K.querySelector(DT))==null||ne.scrollIntoView({block:"nearest"})),Z.scrollIntoView({block:"nearest"}))}function ue(){var M;return(M=_.current)==null?void 0:M.querySelector(`${lE}[aria-selected="true"]`)}function he(){var M;return Array.from(((M=_.current)==null?void 0:M.querySelectorAll(Tw))||[])}function ae(M){let K=he()[M];K&&D.setState("value",K.getAttribute(ps))}function se(M){var K;let ne=ue(),Z=he(),me=Z.findIndex(Pe=>Pe===ne),ge=Z[me+M];(K=u.current)!=null&&K.loop&&(ge=me+M<0?Z[Z.length-1]:me+M===Z.length?Z[0]:Z[me+M]),ge&&D.setState("value",ge.getAttribute(ps))}function X(M){let K=ue(),ne=K==null?void 0:K.closest(Zl),Z;for(;ne&&!Z;)ne=M>0?KT(ne,Zl):GT(ne,Zl),Z=ne==null?void 0:ne.querySelector(Tw);Z?D.setState("value",Z.getAttribute(ps)):se(M)}let te=()=>ae(he().length-1),J=M=>{M.preventDefault(),M.metaKey?te():M.altKey?X(1):se(1)},I=M=>{M.preventDefault(),M.metaKey?ae(0):M.altKey?X(-1):se(-1)};return y.createElement(Xt.div,{ref:t,tabIndex:-1,...N,"cmdk-root":"",onKeyDown:M=>{var K;(K=N.onKeyDown)==null||K.call(N,M);let ne=M.nativeEvent.isComposing||M.keyCode===229;if(!(M.defaultPrevented||ne))switch(M.key){case"n":case"j":{S&&M.ctrlKey&&J(M);break}case"ArrowDown":{J(M);break}case"p":case"k":{S&&M.ctrlKey&&I(M);break}case"ArrowUp":{I(M);break}case"Home":{M.preventDefault(),ae(0);break}case"End":{M.preventDefault(),te();break}case"Enter":{M.preventDefault();let Z=ue();if(Z){let me=new Event(mv);Z.dispatchEvent(me)}}}}},y.createElement("label",{"cmdk-label":"",htmlFor:U.inputId,id:U.labelId,style:QT},f),gh(e,M=>y.createElement(cE.Provider,{value:D},y.createElement(uE.Provider,{value:U},M))))}),LT=y.forwardRef((e,t)=>{var r,n;let a=vi(),o=y.useRef(null),c=y.useContext(dE),u=Yu(),f=hE(e),h=(n=(r=f.current)==null?void 0:r.forceMount)!=null?n:c==null?void 0:c.forceMount;yo(()=>{if(!h)return u.item(a,c==null?void 0:c.id)},[h]);let m=mE(a,o,[e.value,e.children,o],e.keywords),g=Ey(),v=ja(O=>O.value&&O.value===m.current),b=ja(O=>h||u.filter()===!1?!0:O.search?O.filtered.items.get(a)>0:!0);y.useEffect(()=>{let O=o.current;if(!(!O||e.disabled))return O.addEventListener(mv,j),()=>O.removeEventListener(mv,j)},[b,e.onSelect,e.disabled]);function j(){var O,D;k(),(D=(O=f.current).onSelect)==null||D.call(O,m.current)}function k(){g.setState("value",m.current,!0)}if(!b)return null;let{disabled:S,value:N,onSelect:E,forceMount:A,keywords:P,..._}=e;return y.createElement(Xt.div,{ref:Hs(o,t),..._,id:a,"cmdk-item":"",role:"option","aria-disabled":!!S,"aria-selected":!!v,"data-disabled":!!S,"data-selected":!!v,onPointerMove:S||u.getDisablePointerSelection()?void 0:k,onClick:S?void 0:j},e.children)}),$T=y.forwardRef((e,t)=>{let{heading:r,children:n,forceMount:a,...o}=e,c=vi(),u=y.useRef(null),f=y.useRef(null),h=vi(),m=Yu(),g=ja(b=>a||m.filter()===!1?!0:b.search?b.filtered.groups.has(c):!0);yo(()=>m.group(c),[]),mE(c,u,[e.value,e.heading,f]);let v=y.useMemo(()=>({id:c,forceMount:a}),[a]);return y.createElement(Xt.div,{ref:Hs(u,t),...o,"cmdk-group":"",role:"presentation",hidden:g?void 0:!0},r&&y.createElement("div",{ref:f,"cmdk-group-heading":"","aria-hidden":!0,id:h},r),gh(e,b=>y.createElement("div",{"cmdk-group-items":"",role:"group","aria-labelledby":r?h:void 0},y.createElement(dE.Provider,{value:v},b))))}),zT=y.forwardRef((e,t)=>{let{alwaysRender:r,...n}=e,a=y.useRef(null),o=ja(c=>!c.search);return!r&&!o?null:y.createElement(Xt.div,{ref:Hs(a,t),...n,"cmdk-separator":"",role:"separator"})}),FT=y.forwardRef((e,t)=>{let{onValueChange:r,...n}=e,a=e.value!=null,o=Ey(),c=ja(h=>h.search),u=ja(h=>h.selectedItemId),f=Yu();return y.useEffect(()=>{e.value!=null&&o.setState("search",e.value)},[e.value]),y.createElement(Xt.input,{ref:t,...n,"cmdk-input":"",autoComplete:"off",autoCorrect:"off",spellCheck:!1,"aria-autocomplete":"list",role:"combobox","aria-expanded":!0,"aria-controls":f.listId,"aria-labelledby":f.labelId,"aria-activedescendant":u,id:f.inputId,type:"text",value:a?e.value:c,onChange:h=>{a||o.setState("search",h.target.value),r==null||r(h.target.value)}})}),BT=y.forwardRef((e,t)=>{let{children:r,label:n="Suggestions",...a}=e,o=y.useRef(null),c=y.useRef(null),u=ja(h=>h.selectedItemId),f=Yu();return y.useEffect(()=>{if(c.current&&o.current){let h=c.current,m=o.current,g,v=new ResizeObserver(()=>{g=requestAnimationFrame(()=>{let b=h.offsetHeight;m.style.setProperty("--cmdk-list-height",b.toFixed(1)+"px")})});return v.observe(h),()=>{cancelAnimationFrame(g),v.unobserve(h)}}},[]),y.createElement(Xt.div,{ref:Hs(o,t),...a,"cmdk-list":"",role:"listbox",tabIndex:-1,"aria-activedescendant":u,"aria-label":n,id:f.listId},gh(e,h=>y.createElement("div",{ref:Hs(c,f.listInnerRef),"cmdk-list-sizer":""},h)))}),UT=y.forwardRef((e,t)=>{let{open:r,onOpenChange:n,overlayClassName:a,contentClassName:o,container:c,...u}=e;return y.createElement(ZN,{open:r,onOpenChange:n},y.createElement(tE,{container:c},y.createElement(rE,{"cmdk-overlay":"",className:a}),y.createElement(nE,{"aria-label":e.label,"cmdk-dialog":"",className:o},y.createElement(fE,{ref:t,...u}))))}),HT=y.forwardRef((e,t)=>ja(r=>r.filtered.count===0)?y.createElement(Xt.div,{ref:t,...e,"cmdk-empty":"",role:"presentation"}):null),WT=y.forwardRef((e,t)=>{let{progress:r,children:n,label:a="Loading...",...o}=e;return y.createElement(Xt.div,{ref:t,...o,"cmdk-loading":"",role:"progressbar","aria-valuenow":r,"aria-valuemin":0,"aria-valuemax":100,"aria-label":a},gh(e,c=>y.createElement("div",{"aria-hidden":!0},c)))}),ss=Object.assign(fE,{List:BT,Item:LT,Input:FT,Group:$T,Separator:zT,Dialog:UT,Empty:HT,Loading:WT});function KT(e,t){let r=e.nextElementSibling;for(;r;){if(r.matches(t))return r;r=r.nextElementSibling}}function GT(e,t){let r=e.previousElementSibling;for(;r;){if(r.matches(t))return r;r=r.previousElementSibling}}function hE(e){let t=y.useRef(e);return yo(()=>{t.current=e}),t}var yo=typeof window>"u"?y.useEffect:y.useLayoutEffect;function gs(e){let t=y.useRef();return t.current===void 0&&(t.current=e()),t}function ja(e){let t=Ey(),r=()=>e(t.snapshot());return y.useSyncExternalStore(t.subscribe,r,r)}function mE(e,t,r,n=[]){let a=y.useRef(),o=Yu();return yo(()=>{var c;let u=(()=>{var h;for(let m of r){if(typeof m=="string")return m.trim();if(typeof m=="object"&&"current"in m)return m.current?(h=m.current.textContent)==null?void 0:h.trim():a.current}})(),f=n.map(h=>h.trim());o.value(e,u,f),(c=t.current)==null||c.setAttribute(ps,u),a.current=u}),a}var VT=()=>{let[e,t]=y.useState(),r=gs(()=>new Map);return yo(()=>{r.current.forEach(n=>n()),r.current=new Map},[e]),(n,a)=>{r.current.set(n,a),t({})}};function qT(e){let t=e.type;return typeof t=="function"?t(e.props):"render"in t?t.render(e.props):e}function gh({asChild:e,children:t},r){return e&&y.isValidElement(t)?y.cloneElement(qT(t),{ref:t.ref},r(t.props.children)):r(t)}var QT={position:"absolute",width:"1px",height:"1px",padding:"0",margin:"-1px",overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0"};function YT({onNavigate:e}){const[t,r]=y.useState(!1);return y.useEffect(()=>{const n=a=>{(a.metaKey||a.ctrlKey)&&a.key.toLowerCase()==="k"&&(a.preventDefault(),r(o=>!o))};return document.addEventListener("keydown",n),()=>document.removeEventListener("keydown",n)},[]),l.jsx(ss.Dialog,{open:t,onOpenChange:r,label:"Befehlspalette",className:"fixed inset-0 z-50 flex items-start justify-center bg-black/50 p-4 pt-[12vh] overscroll-contain",onClick:()=>r(!1),children:l.jsxs("div",{className:"w-full max-w-lg overflow-hidden rounded-xl border border-border bg-popover text-popover-foreground shadow-2xl",onClick:n=>n.stopPropagation(),children:[l.jsx(ss.Input,{autoFocus:!0,placeholder:"Springe zu… (Modelle, Routing, System …)",className:"w-full border-b border-border bg-transparent px-4 py-3 text-sm outline-none placeholder:text-muted-foreground"}),l.jsxs(ss.List,{className:"max-h-80 overflow-y-auto p-2",children:[l.jsx(ss.Empty,{className:"px-3 py-6 text-center text-sm text-muted-foreground",children:"Nichts gefunden."}),l.jsx(ss.Group,{heading:"Bereiche",className:"px-1 py-1 text-xs text-muted-foreground",children:mu.map(n=>l.jsxs(ss.Item,{value:`${n.label} ${n.hint}`,onSelect:()=>{e(n.id),r(!1)},className:"flex cursor-pointer items-center gap-3 rounded-md px-3 py-2 text-sm text-foreground aria-selected:bg-accent aria-selected:text-accent-foreground",children:[l.jsx(n.icon,{className:"h-4 w-4 text-primary"}),l.jsx("span",{children:n.label}),l.jsx("span",{className:"ml-auto truncate text-xs text-muted-foreground",children:n.hint})]},n.id))})]})]})})}const pE="mc_expert_mode",pv="mc-expert-mode-change",XT=()=>{try{return localStorage.getItem(pE)==="true"}catch{return!1}};function ZT(e){return window.addEventListener(pv,e),window.addEventListener("storage",e),()=>{window.removeEventListener(pv,e),window.removeEventListener("storage",e)}}function Dw(e){localStorage.setItem(pE,String(e)),window.dispatchEvent(new Event(pv))}function gE(){return y.useSyncExternalStore(ZT,XT,()=>!1)}function vE(e){var t,r,n="";if(typeof e=="string"||typeof e=="number")n+=e;else if(typeof e=="object")if(Array.isArray(e)){var a=e.length;for(t=0;t{const t=tD(e),{conflictingClassGroups:r,conflictingClassGroupModifiers:n}=e;return{getClassGroupId:c=>{const u=c.split(Ay);return u[0]===""&&u.length!==1&&u.shift(),yE(u,t)||eD(c)},getConflictingClassGroupIds:(c,u)=>{const f=r[c]||[];return u&&n[c]?[...f,...n[c]]:f}}},yE=(e,t)=>{var c;if(e.length===0)return t.classGroupId;const r=e[0],n=t.nextPart.get(r),a=n?yE(e.slice(1),n):void 0;if(a)return a;if(t.validators.length===0)return;const o=e.join(Ay);return(c=t.validators.find(({validator:u})=>u(o)))==null?void 0:c.classGroupId},Rw=/^\[(.+)\]$/,eD=e=>{if(Rw.test(e)){const t=Rw.exec(e)[1],r=t==null?void 0:t.substring(0,t.indexOf(":"));if(r)return"arbitrary.."+r}},tD=e=>{const{theme:t,prefix:r}=e,n={nextPart:new Map,validators:[]};return nD(Object.entries(e.classGroups),r).forEach(([o,c])=>{gv(c,n,o,t)}),n},gv=(e,t,r,n)=>{e.forEach(a=>{if(typeof a=="string"){const o=a===""?t:Lw(t,a);o.classGroupId=r;return}if(typeof a=="function"){if(rD(a)){gv(a(n),t,r,n);return}t.validators.push({validator:a,classGroupId:r});return}Object.entries(a).forEach(([o,c])=>{gv(c,Lw(t,o),r,n)})})},Lw=(e,t)=>{let r=e;return t.split(Ay).forEach(n=>{r.nextPart.has(n)||r.nextPart.set(n,{nextPart:new Map,validators:[]}),r=r.nextPart.get(n)}),r},rD=e=>e.isThemeGetter,nD=(e,t)=>t?e.map(([r,n])=>{const a=n.map(o=>typeof o=="string"?t+o:typeof o=="object"?Object.fromEntries(Object.entries(o).map(([c,u])=>[t+c,u])):o);return[r,a]}):e,iD=e=>{if(e<1)return{get:()=>{},set:()=>{}};let t=0,r=new Map,n=new Map;const a=(o,c)=>{r.set(o,c),t++,t>e&&(t=0,n=r,r=new Map)};return{get(o){let c=r.get(o);if(c!==void 0)return c;if((c=n.get(o))!==void 0)return a(o,c),c},set(o,c){r.has(o)?r.set(o,c):a(o,c)}}},xE="!",aD=e=>{const{separator:t,experimentalParseClassName:r}=e,n=t.length===1,a=t[0],o=t.length,c=u=>{const f=[];let h=0,m=0,g;for(let S=0;Sm?g-m:void 0;return{modifiers:f,hasImportantModifier:b,baseClassName:j,maybePostfixModifierPosition:k}};return r?u=>r({className:u,parseClassName:c}):c},oD=e=>{if(e.length<=1)return e;const t=[];let r=[];return e.forEach(n=>{n[0]==="["?(t.push(...r.sort(),n),r=[]):r.push(n)}),t.push(...r.sort()),t},sD=e=>({cache:iD(e.cacheSize),parseClassName:aD(e),...JT(e)}),lD=/\s+/,uD=(e,t)=>{const{parseClassName:r,getClassGroupId:n,getConflictingClassGroupIds:a}=t,o=[],c=e.trim().split(lD);let u="";for(let f=c.length-1;f>=0;f-=1){const h=c[f],{modifiers:m,hasImportantModifier:g,baseClassName:v,maybePostfixModifierPosition:b}=r(h);let j=!!b,k=n(j?v.substring(0,b):v);if(!k){if(!j){u=h+(u.length>0?" "+u:u);continue}if(k=n(v),!k){u=h+(u.length>0?" "+u:u);continue}j=!1}const S=oD(m).join(":"),N=g?S+xE:S,E=N+k;if(o.includes(E))continue;o.push(E);const A=a(k,j);for(let P=0;P0?" "+u:u)}return u};function cD(){let e=0,t,r,n="";for(;e{if(typeof e=="string")return e;let t,r="";for(let n=0;ng(m),e());return r=sD(h),n=r.cache.get,a=r.cache.set,o=u,u(f)}function u(f){const h=n(f);if(h)return h;const m=uD(f,r);return a(f,m),m}return function(){return o(cD.apply(null,arguments))}}const ot=e=>{const t=r=>r[e]||[];return t.isThemeGetter=!0,t},wE=/^\[(?:([a-z-]+):)?(.+)\]$/i,fD=/^\d+\/\d+$/,hD=new Set(["px","full","screen"]),mD=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,pD=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,gD=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,vD=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,yD=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,li=e=>js(e)||hD.has(e)||fD.test(e),ea=e=>tl(e,"length",ED),js=e=>!!e&&!Number.isNaN(Number(e)),ug=e=>tl(e,"number",js),Jl=e=>!!e&&Number.isInteger(Number(e)),xD=e=>e.endsWith("%")&&js(e.slice(0,-1)),$e=e=>wE.test(e),ta=e=>mD.test(e),bD=new Set(["length","size","percentage"]),wD=e=>tl(e,bD,kE),kD=e=>tl(e,"position",kE),jD=new Set(["image","url"]),SD=e=>tl(e,jD,CD),ND=e=>tl(e,"",AD),eu=()=>!0,tl=(e,t,r)=>{const n=wE.exec(e);return n?n[1]?typeof t=="string"?n[1]===t:t.has(n[1]):r(n[2]):!1},ED=e=>pD.test(e)&&!gD.test(e),kE=()=>!1,AD=e=>vD.test(e),CD=e=>yD.test(e),PD=()=>{const e=ot("colors"),t=ot("spacing"),r=ot("blur"),n=ot("brightness"),a=ot("borderColor"),o=ot("borderRadius"),c=ot("borderSpacing"),u=ot("borderWidth"),f=ot("contrast"),h=ot("grayscale"),m=ot("hueRotate"),g=ot("invert"),v=ot("gap"),b=ot("gradientColorStops"),j=ot("gradientColorStopPositions"),k=ot("inset"),S=ot("margin"),N=ot("opacity"),E=ot("padding"),A=ot("saturate"),P=ot("scale"),_=ot("sepia"),O=ot("skew"),D=ot("space"),U=ot("translate"),B=()=>["auto","contain","none"],F=()=>["auto","hidden","clip","visible","scroll"],Y=()=>["auto",$e,t],H=()=>[$e,t],pe=()=>["",li,ea],ue=()=>["auto",js,$e],he=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],ae=()=>["solid","dashed","dotted","double","none"],se=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],X=()=>["start","end","center","between","around","evenly","stretch"],te=()=>["","0",$e],J=()=>["auto","avoid","all","avoid-page","page","left","right","column"],I=()=>[js,$e];return{cacheSize:500,separator:":",theme:{colors:[eu],spacing:[li,ea],blur:["none","",ta,$e],brightness:I(),borderColor:[e],borderRadius:["none","","full",ta,$e],borderSpacing:H(),borderWidth:pe(),contrast:I(),grayscale:te(),hueRotate:I(),invert:te(),gap:H(),gradientColorStops:[e],gradientColorStopPositions:[xD,ea],inset:Y(),margin:Y(),opacity:I(),padding:H(),saturate:I(),scale:I(),sepia:te(),skew:I(),space:H(),translate:H()},classGroups:{aspect:[{aspect:["auto","square","video",$e]}],container:["container"],columns:[{columns:[ta]}],"break-after":[{"break-after":J()}],"break-before":[{"break-before":J()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...he(),$e]}],overflow:[{overflow:F()}],"overflow-x":[{"overflow-x":F()}],"overflow-y":[{"overflow-y":F()}],overscroll:[{overscroll:B()}],"overscroll-x":[{"overscroll-x":B()}],"overscroll-y":[{"overscroll-y":B()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[k]}],"inset-x":[{"inset-x":[k]}],"inset-y":[{"inset-y":[k]}],start:[{start:[k]}],end:[{end:[k]}],top:[{top:[k]}],right:[{right:[k]}],bottom:[{bottom:[k]}],left:[{left:[k]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",Jl,$e]}],basis:[{basis:Y()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",$e]}],grow:[{grow:te()}],shrink:[{shrink:te()}],order:[{order:["first","last","none",Jl,$e]}],"grid-cols":[{"grid-cols":[eu]}],"col-start-end":[{col:["auto",{span:["full",Jl,$e]},$e]}],"col-start":[{"col-start":ue()}],"col-end":[{"col-end":ue()}],"grid-rows":[{"grid-rows":[eu]}],"row-start-end":[{row:["auto",{span:[Jl,$e]},$e]}],"row-start":[{"row-start":ue()}],"row-end":[{"row-end":ue()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",$e]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",$e]}],gap:[{gap:[v]}],"gap-x":[{"gap-x":[v]}],"gap-y":[{"gap-y":[v]}],"justify-content":[{justify:["normal",...X()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...X(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...X(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[E]}],px:[{px:[E]}],py:[{py:[E]}],ps:[{ps:[E]}],pe:[{pe:[E]}],pt:[{pt:[E]}],pr:[{pr:[E]}],pb:[{pb:[E]}],pl:[{pl:[E]}],m:[{m:[S]}],mx:[{mx:[S]}],my:[{my:[S]}],ms:[{ms:[S]}],me:[{me:[S]}],mt:[{mt:[S]}],mr:[{mr:[S]}],mb:[{mb:[S]}],ml:[{ml:[S]}],"space-x":[{"space-x":[D]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[D]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",$e,t]}],"min-w":[{"min-w":[$e,t,"min","max","fit"]}],"max-w":[{"max-w":[$e,t,"none","full","min","max","fit","prose",{screen:[ta]},ta]}],h:[{h:[$e,t,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[$e,t,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[$e,t,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[$e,t,"auto","min","max","fit"]}],"font-size":[{text:["base",ta,ea]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",ug]}],"font-family":[{font:[eu]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",$e]}],"line-clamp":[{"line-clamp":["none",js,ug]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",li,$e]}],"list-image":[{"list-image":["none",$e]}],"list-style-type":[{list:["none","disc","decimal",$e]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[e]}],"placeholder-opacity":[{"placeholder-opacity":[N]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[e]}],"text-opacity":[{"text-opacity":[N]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...ae(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",li,ea]}],"underline-offset":[{"underline-offset":["auto",li,$e]}],"text-decoration-color":[{decoration:[e]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:H()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",$e]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",$e]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[N]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...he(),kD]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",wD]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},SD]}],"bg-color":[{bg:[e]}],"gradient-from-pos":[{from:[j]}],"gradient-via-pos":[{via:[j]}],"gradient-to-pos":[{to:[j]}],"gradient-from":[{from:[b]}],"gradient-via":[{via:[b]}],"gradient-to":[{to:[b]}],rounded:[{rounded:[o]}],"rounded-s":[{"rounded-s":[o]}],"rounded-e":[{"rounded-e":[o]}],"rounded-t":[{"rounded-t":[o]}],"rounded-r":[{"rounded-r":[o]}],"rounded-b":[{"rounded-b":[o]}],"rounded-l":[{"rounded-l":[o]}],"rounded-ss":[{"rounded-ss":[o]}],"rounded-se":[{"rounded-se":[o]}],"rounded-ee":[{"rounded-ee":[o]}],"rounded-es":[{"rounded-es":[o]}],"rounded-tl":[{"rounded-tl":[o]}],"rounded-tr":[{"rounded-tr":[o]}],"rounded-br":[{"rounded-br":[o]}],"rounded-bl":[{"rounded-bl":[o]}],"border-w":[{border:[u]}],"border-w-x":[{"border-x":[u]}],"border-w-y":[{"border-y":[u]}],"border-w-s":[{"border-s":[u]}],"border-w-e":[{"border-e":[u]}],"border-w-t":[{"border-t":[u]}],"border-w-r":[{"border-r":[u]}],"border-w-b":[{"border-b":[u]}],"border-w-l":[{"border-l":[u]}],"border-opacity":[{"border-opacity":[N]}],"border-style":[{border:[...ae(),"hidden"]}],"divide-x":[{"divide-x":[u]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[u]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[N]}],"divide-style":[{divide:ae()}],"border-color":[{border:[a]}],"border-color-x":[{"border-x":[a]}],"border-color-y":[{"border-y":[a]}],"border-color-s":[{"border-s":[a]}],"border-color-e":[{"border-e":[a]}],"border-color-t":[{"border-t":[a]}],"border-color-r":[{"border-r":[a]}],"border-color-b":[{"border-b":[a]}],"border-color-l":[{"border-l":[a]}],"divide-color":[{divide:[a]}],"outline-style":[{outline:["",...ae()]}],"outline-offset":[{"outline-offset":[li,$e]}],"outline-w":[{outline:[li,ea]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:pe()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[e]}],"ring-opacity":[{"ring-opacity":[N]}],"ring-offset-w":[{"ring-offset":[li,ea]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",ta,ND]}],"shadow-color":[{shadow:[eu]}],opacity:[{opacity:[N]}],"mix-blend":[{"mix-blend":[...se(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":se()}],filter:[{filter:["","none"]}],blur:[{blur:[r]}],brightness:[{brightness:[n]}],contrast:[{contrast:[f]}],"drop-shadow":[{"drop-shadow":["","none",ta,$e]}],grayscale:[{grayscale:[h]}],"hue-rotate":[{"hue-rotate":[m]}],invert:[{invert:[g]}],saturate:[{saturate:[A]}],sepia:[{sepia:[_]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[r]}],"backdrop-brightness":[{"backdrop-brightness":[n]}],"backdrop-contrast":[{"backdrop-contrast":[f]}],"backdrop-grayscale":[{"backdrop-grayscale":[h]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[m]}],"backdrop-invert":[{"backdrop-invert":[g]}],"backdrop-opacity":[{"backdrop-opacity":[N]}],"backdrop-saturate":[{"backdrop-saturate":[A]}],"backdrop-sepia":[{"backdrop-sepia":[_]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[c]}],"border-spacing-x":[{"border-spacing-x":[c]}],"border-spacing-y":[{"border-spacing-y":[c]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",$e]}],duration:[{duration:I()}],ease:[{ease:["linear","in","out","in-out",$e]}],delay:[{delay:I()}],animate:[{animate:["none","spin","ping","pulse","bounce",$e]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[P]}],"scale-x":[{"scale-x":[P]}],"scale-y":[{"scale-y":[P]}],rotate:[{rotate:[Jl,$e]}],"translate-x":[{"translate-x":[U]}],"translate-y":[{"translate-y":[U]}],"skew-x":[{"skew-x":[O]}],"skew-y":[{"skew-y":[O]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",$e]}],accent:[{accent:["auto",e]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",$e]}],"caret-color":[{caret:[e]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":H()}],"scroll-mx":[{"scroll-mx":H()}],"scroll-my":[{"scroll-my":H()}],"scroll-ms":[{"scroll-ms":H()}],"scroll-me":[{"scroll-me":H()}],"scroll-mt":[{"scroll-mt":H()}],"scroll-mr":[{"scroll-mr":H()}],"scroll-mb":[{"scroll-mb":H()}],"scroll-ml":[{"scroll-ml":H()}],"scroll-p":[{"scroll-p":H()}],"scroll-px":[{"scroll-px":H()}],"scroll-py":[{"scroll-py":H()}],"scroll-ps":[{"scroll-ps":H()}],"scroll-pe":[{"scroll-pe":H()}],"scroll-pt":[{"scroll-pt":H()}],"scroll-pr":[{"scroll-pr":H()}],"scroll-pb":[{"scroll-pb":H()}],"scroll-pl":[{"scroll-pl":H()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",$e]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[li,ea,ug]}],stroke:[{stroke:[e,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}},OD=dD(PD);function ee(...e){return OD(nt(e))}function Ks(e){return e?e.replace(/127\.0\.0\.1|localhost/g,"192.168.178.151"):""}function jE(){const e=gE();return l.jsxs("div",{className:"flex items-center rounded-md border border-border/40 bg-background/40 p-0.5",role:"group","aria-label":"Ansichtsmodus",title:"Einfach zeigt nur das Wichtigste. Experte zeigt alle technischen Details.",children:[l.jsxs("button",{onClick:()=>Dw(!1),"aria-pressed":!e,className:ee("flex items-center gap-1 rounded px-2 py-1 text-xs font-semibold transition-all cursor-pointer",e?"text-muted-foreground hover:text-foreground":"bg-primary/15 text-primary shadow-sm"),children:[l.jsx(ys,{className:"h-3.5 w-3.5"})," Einfach"]}),l.jsxs("button",{onClick:()=>Dw(!0),"aria-pressed":e,className:ee("flex items-center gap-1 rounded px-2 py-1 text-xs font-semibold transition-all cursor-pointer",e?"bg-primary/15 text-primary shadow-sm":"text-muted-foreground hover:text-foreground"),children:[l.jsx($4,{className:"h-3.5 w-3.5"})," Experte"]})]})}async function Se(e,t){var f;const r={"Content-Type":"application/json",...t==null?void 0:t.headers},n=localStorage.getItem("mc_sudo_password"),a=localStorage.getItem("mc_hf_token");n&&(r["X-Sudo-Password"]=n);let o=t==null?void 0:t.body;if((((f=t==null?void 0:t.method)==null?void 0:f.toUpperCase())||"GET")==="POST"){if(typeof o=="string")try{const h=JSON.parse(o);let m=!1;n&&!("sudo_password"in h)&&(h.sudo_password=n,m=!0),a&&!("hf_token"in h)&&(h.hf_token=a,m=!0),m&&(o=JSON.stringify(h))}catch{}else if(!o){const h={};n&&(h.sudo_password=n),a&&(h.hf_token=a),Object.keys(h).length>0&&(o=JSON.stringify(h))}}const u=await fetch(e,{...t,headers:r,body:o});if(!u.ok)throw new Error(`${u.status} ${u.statusText}`);return u.json()}const SE=(e,t,r=!1,n=!0)=>Se("/api/groups",{method:"PUT",body:JSON.stringify({group:e,members:t,swap:r,persist:n})}),_D=e=>Se("/api/routing/policy",{method:"PUT",body:JSON.stringify(e)}),Ve={health:["health"],systemStatus:["system-status"],services:["services"],models:["models"],groups:["groups"],routing:["routing"],routingPolicy:["routing-policy"],voiceMetrics:["voice-metrics"],jobs:["jobs"],tokenStats:["token-stats"],agentStatus:["agent-status"],hermesBrain:["hermes-brain"],updates:["updates"],discover:["discover"],drafts:e=>["drafts",e??""],connect:e=>["connect",e??""],connectHealth:["connect-health"],memory:(e,t)=>["memory",e??"",t??""],memoryGraph:["memory-graph"]},MD=(e=!0)=>$t({queryKey:Ve.memoryGraph,queryFn:()=>Se("/api/memory/graph"),enabled:e}),Cy=()=>$t({queryKey:Ve.health,queryFn:()=>Se("/api/health"),refetchInterval:1e4}),Po=(e=5e3)=>$t({queryKey:Ve.systemStatus,queryFn:()=>Se("/api/system/status"),refetchInterval:e}),NE=(e=3e3)=>$t({queryKey:Ve.services,queryFn:()=>Se("/api/system/services"),refetchInterval:e}),Ni=(e=4e3)=>$t({queryKey:Ve.models,queryFn:()=>Se("/api/models"),refetchInterval:e}),EE=(e=8e3)=>$t({queryKey:Ve.groups,queryFn:()=>Se("/api/groups"),refetchInterval:e}),ID=(e=5e3)=>$t({queryKey:Ve.voiceMetrics,queryFn:()=>Se("/api/voice/metrics"),refetchInterval:e}),TD=()=>$t({queryKey:Ve.routingPolicy,queryFn:()=>Se("/api/routing/policy")}),DD=(e=2e3)=>$t({queryKey:Ve.jobs,queryFn:()=>Se("/api/jobs"),refetchInterval:e,select:t=>t.jobs??[]}),Py=(e=3e3)=>$t({queryKey:Ve.tokenStats,queryFn:()=>Se("/api/system/token-stats"),refetchInterval:e}),Oy=(e=5e3)=>$t({queryKey:Ve.agentStatus,queryFn:()=>Se("/api/agent/status"),refetchInterval:e}),AE=(e=6e4)=>$t({queryKey:Ve.hermesBrain,queryFn:()=>Se("/api/agent/brain"),refetchInterval:e}),vh=e=>$t({queryKey:Ve.updates,queryFn:()=>Se("/api/maintenance/updates"),refetchInterval:e}),RD=()=>$t({queryKey:Ve.discover,queryFn:()=>Se("/api/discover")}),LD=e=>$t({queryKey:Ve.drafts(e),queryFn:()=>Se(`/api/models/drafts?target=${encodeURIComponent(e??"")}`),enabled:!!e}),$D=e=>$t({queryKey:Ve.connect(e),queryFn:()=>Se(e?`/api/connect?${e}`:"/api/connect")}),zD=()=>$t({queryKey:Ve.connectHealth,queryFn:()=>Se("/api/connect/health"),refetchInterval:15e3}),vv=e=>$t({queryKey:Ve.memory(e==null?void 0:e.q,e==null?void 0:e.category),queryFn:()=>{const t=new URLSearchParams;return e!=null&&e.q&&t.set("q",e.q),e!=null&&e.category&&t.set("category",e.category),Se(`/api/memory?${t}`)},select:t=>e!=null&&e.limit?t.slice(0,e.limit):t});let yv=[],xv=[];const bv=new Set,CE=()=>bv.forEach(e=>e());function PE(e){return bv.add(e),()=>{bv.delete(e)}}function FD(e){yv=[...yv,e].slice(-40),CE()}function BD(e){xv=[...xv,e].slice(-40),CE()}const UD=()=>y.useSyncExternalStore(PE,()=>yv),HD=()=>y.useSyncExternalStore(PE,()=>xv);function WD(){const{data:e,dataUpdatedAt:t}=Po(3e3),{data:r,dataUpdatedAt:n}=Py(3e3),a=y.useRef(null);y.useEffect(()=>{var o,c,u,f;e&&FD({t:Date.now(),cpu:((o=e.cpu)==null?void 0:o.percent)??0,ram:((c=e.ram)==null?void 0:c.percent)??0,gpu:((u=e.gpu)==null?void 0:u.busy_percent)??null,disk:((f=e.disk)==null?void 0:f.percent)??null})},[t]),y.useEffect(()=>{if(!r)return;const o=Date.now(),c=r.prompt_tokens,u=r.completion_tokens;if(a.current){const f=Math.max((o-a.current.t)/1e3,.001);BD({t:o,prompt:Math.max(0,(c-a.current.p)/f),completion:Math.max(0,(u-a.current.c)/f)})}a.current={p:c,c:u,t:o}},[n])}function KD(){const{data:e,error:t}=Po(3e3),r=UD();return{sys:e,hist:r,error:t}}function aa(e){return(e/1024**3).toFixed(1)}function wv(e){return e?e>1024**3?`${(e/1024**3).toFixed(1)} GB`:`${(e/1024**2).toFixed(0)} MB`:""}function Lr(e){if(!e)return"—";const t=e/1024**3;return t>=1?`${t.toFixed(1)} GB`:`${(e/1024**2).toFixed(0)} MB`}function GD(e){if(!e)return"";const t=Math.floor(e/60);return t>0?`${t} min`:`${e} s`}function $w(e){return e?`${Math.round(e/1024)}k`:"—"}var VD=["dangerouslySetInnerHTML","onCopy","onCopyCapture","onCut","onCutCapture","onPaste","onPasteCapture","onCompositionEnd","onCompositionEndCapture","onCompositionStart","onCompositionStartCapture","onCompositionUpdate","onCompositionUpdateCapture","onFocus","onFocusCapture","onBlur","onBlurCapture","onChange","onChangeCapture","onBeforeInput","onBeforeInputCapture","onInput","onInputCapture","onReset","onResetCapture","onSubmit","onSubmitCapture","onInvalid","onInvalidCapture","onLoad","onLoadCapture","onError","onErrorCapture","onKeyDown","onKeyDownCapture","onKeyPress","onKeyPressCapture","onKeyUp","onKeyUpCapture","onAbort","onAbortCapture","onCanPlay","onCanPlayCapture","onCanPlayThrough","onCanPlayThroughCapture","onDurationChange","onDurationChangeCapture","onEmptied","onEmptiedCapture","onEncrypted","onEncryptedCapture","onEnded","onEndedCapture","onLoadedData","onLoadedDataCapture","onLoadedMetadata","onLoadedMetadataCapture","onLoadStart","onLoadStartCapture","onPause","onPauseCapture","onPlay","onPlayCapture","onPlaying","onPlayingCapture","onProgress","onProgressCapture","onRateChange","onRateChangeCapture","onSeeked","onSeekedCapture","onSeeking","onSeekingCapture","onStalled","onStalledCapture","onSuspend","onSuspendCapture","onTimeUpdate","onTimeUpdateCapture","onVolumeChange","onVolumeChangeCapture","onWaiting","onWaitingCapture","onAuxClick","onAuxClickCapture","onClick","onClickCapture","onContextMenu","onContextMenuCapture","onDoubleClick","onDoubleClickCapture","onDrag","onDragCapture","onDragEnd","onDragEndCapture","onDragEnter","onDragEnterCapture","onDragExit","onDragExitCapture","onDragLeave","onDragLeaveCapture","onDragOver","onDragOverCapture","onDragStart","onDragStartCapture","onDrop","onDropCapture","onMouseDown","onMouseDownCapture","onMouseEnter","onMouseLeave","onMouseMove","onMouseMoveCapture","onMouseOut","onMouseOutCapture","onMouseOver","onMouseOverCapture","onMouseUp","onMouseUpCapture","onSelect","onSelectCapture","onTouchCancel","onTouchCancelCapture","onTouchEnd","onTouchEndCapture","onTouchMove","onTouchMoveCapture","onTouchStart","onTouchStartCapture","onPointerDown","onPointerDownCapture","onPointerMove","onPointerMoveCapture","onPointerUp","onPointerUpCapture","onPointerCancel","onPointerCancelCapture","onPointerEnter","onPointerEnterCapture","onPointerLeave","onPointerLeaveCapture","onPointerOver","onPointerOverCapture","onPointerOut","onPointerOutCapture","onGotPointerCapture","onGotPointerCaptureCapture","onLostPointerCapture","onLostPointerCaptureCapture","onScroll","onScrollCapture","onWheel","onWheelCapture","onAnimationStart","onAnimationStartCapture","onAnimationEnd","onAnimationEndCapture","onAnimationIteration","onAnimationIterationCapture","onTransitionEnd","onTransitionEndCapture"];function _y(e){if(typeof e!="string")return!1;var t=VD;return t.includes(e)}var qD=["aria-activedescendant","aria-atomic","aria-autocomplete","aria-busy","aria-checked","aria-colcount","aria-colindex","aria-colspan","aria-controls","aria-current","aria-describedby","aria-details","aria-disabled","aria-errormessage","aria-expanded","aria-flowto","aria-haspopup","aria-hidden","aria-invalid","aria-keyshortcuts","aria-label","aria-labelledby","aria-level","aria-live","aria-modal","aria-multiline","aria-multiselectable","aria-orientation","aria-owns","aria-placeholder","aria-posinset","aria-pressed","aria-readonly","aria-relevant","aria-required","aria-roledescription","aria-rowcount","aria-rowindex","aria-rowspan","aria-selected","aria-setsize","aria-sort","aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext","className","color","height","id","lang","max","media","method","min","name","style","target","width","role","tabIndex","accentHeight","accumulate","additive","alignmentBaseline","allowReorder","alphabetic","amplitude","arabicForm","ascent","attributeName","attributeType","autoReverse","azimuth","baseFrequency","baselineShift","baseProfile","bbox","begin","bias","by","calcMode","capHeight","clip","clipPath","clipPathUnits","clipRule","colorInterpolation","colorInterpolationFilters","colorProfile","colorRendering","contentScriptType","contentStyleType","cursor","cx","cy","d","decelerate","descent","diffuseConstant","direction","display","divisor","dominantBaseline","dur","dx","dy","edgeMode","elevation","enableBackground","end","exponent","externalResourcesRequired","fill","fillOpacity","fillRule","filter","filterRes","filterUnits","floodColor","floodOpacity","focusable","fontFamily","fontSize","fontSizeAdjust","fontStretch","fontStyle","fontVariant","fontWeight","format","from","fx","fy","g1","g2","glyphName","glyphOrientationHorizontal","glyphOrientationVertical","glyphRef","gradientTransform","gradientUnits","hanging","horizAdvX","horizOriginX","href","ideographic","imageRendering","in2","in","intercept","k1","k2","k3","k4","k","kernelMatrix","kernelUnitLength","kerning","keyPoints","keySplines","keyTimes","lengthAdjust","letterSpacing","lightingColor","limitingConeAngle","local","markerEnd","markerHeight","markerMid","markerStart","markerUnits","markerWidth","mask","maskContentUnits","maskUnits","mathematical","mode","numOctaves","offset","opacity","operator","order","orient","orientation","origin","overflow","overlinePosition","overlineThickness","paintOrder","panose1","pathLength","patternContentUnits","patternTransform","patternUnits","pointerEvents","pointsAtX","pointsAtY","pointsAtZ","preserveAlpha","preserveAspectRatio","primitiveUnits","r","radius","refX","refY","renderingIntent","repeatCount","repeatDur","requiredExtensions","requiredFeatures","restart","result","rotate","rx","ry","seed","shapeRendering","slope","spacing","specularConstant","specularExponent","speed","spreadMethod","startOffset","stdDeviation","stemh","stemv","stitchTiles","stopColor","stopOpacity","strikethroughPosition","strikethroughThickness","string","stroke","strokeDasharray","strokeDashoffset","strokeLinecap","strokeLinejoin","strokeMiterlimit","strokeOpacity","strokeWidth","surfaceScale","systemLanguage","tableValues","targetX","targetY","textAnchor","textDecoration","textLength","textRendering","to","transform","u1","u2","underlinePosition","underlineThickness","unicode","unicodeBidi","unicodeRange","unitsPerEm","vAlphabetic","values","vectorEffect","version","vertAdvY","vertOriginX","vertOriginY","vHanging","vIdeographic","viewTarget","visibility","vMathematical","widths","wordSpacing","writingMode","x1","x2","x","xChannelSelector","xHeight","xlinkActuate","xlinkArcrole","xlinkHref","xlinkRole","xlinkShow","xlinkTitle","xlinkType","xmlBase","xmlLang","xmlns","xmlnsXlink","xmlSpace","y1","y2","y","yChannelSelector","z","zoomAndPan","ref","key","angle"],QD=new Set(qD);function OE(e){return typeof e!="string"?!1:QD.has(e)}function _E(e){return typeof e=="string"&&e.startsWith("data-")}function kn(e){if(typeof e!="object"||e===null)return{};var t={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(OE(r)||_E(r))&&(t[r]=e[r]);return t}function yh(e){if(e==null)return null;if(y.isValidElement(e)&&typeof e.props=="object"&&e.props!==null){var t=e.props;return kn(t)}return typeof e=="object"&&!Array.isArray(e)?kn(e):null}function rn(e){var t={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(OE(r)||_E(r)||_y(r))&&(t[r]=e[r]);return t}function YD(e){return e==null?null:y.isValidElement(e)?rn(e.props):typeof e=="object"&&!Array.isArray(e)?rn(e):null}var XD=["children","width","height","viewBox","className","style","title","desc"];function kv(){return kv=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var r=e.children,n=e.width,a=e.height,o=e.viewBox,c=e.className,u=e.style,f=e.title,h=e.desc,m=ZD(e,XD),g=o||{width:n,height:a,x:0,y:0},v=nt("recharts-surface",c);return y.createElement("svg",kv({},rn(m),{className:v,width:n,height:a,style:u,viewBox:"".concat(g.x," ").concat(g.y," ").concat(g.width," ").concat(g.height),ref:t}),y.createElement("title",null,f),y.createElement("desc",null,h),r)}),eR=["children","className"];function jv(){return jv=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var r=e.children,n=e.className,a=tR(e,eR),o=nt("recharts-layer",n);return y.createElement("g",jv({className:o},rn(a),{ref:t}),r)}),nR=y.createContext(null);function yt(e){return function(){return e}}const Sv=Math.PI,Nv=2*Sv,qa=1e-6,iR=Nv-qa;function IE(e){this._+=e[0];for(let t=1,r=e.length;t=0))throw new Error(`invalid digits: ${e}`);if(t>15)return IE;const r=10**t;return function(n){this._+=n[0];for(let a=1,o=n.length;aqa)if(!(Math.abs(g*f-h*m)>qa)||!o)this._append`L${this._x1=t},${this._y1=r}`;else{let b=n-c,j=a-u,k=f*f+h*h,S=b*b+j*j,N=Math.sqrt(k),E=Math.sqrt(v),A=o*Math.tan((Sv-Math.acos((k+v-S)/(2*N*E)))/2),P=A/E,_=A/N;Math.abs(P-1)>qa&&this._append`L${t+P*m},${r+P*g}`,this._append`A${o},${o},0,0,${+(g*b>m*j)},${this._x1=t+_*f},${this._y1=r+_*h}`}}arc(t,r,n,a,o,c){if(t=+t,r=+r,n=+n,c=!!c,n<0)throw new Error(`negative radius: ${n}`);let u=n*Math.cos(a),f=n*Math.sin(a),h=t+u,m=r+f,g=1^c,v=c?a-o:o-a;this._x1===null?this._append`M${h},${m}`:(Math.abs(this._x1-h)>qa||Math.abs(this._y1-m)>qa)&&this._append`L${h},${m}`,n&&(v<0&&(v=v%Nv+Nv),v>iR?this._append`A${n},${n},0,1,${g},${t-u},${r-f}A${n},${n},0,1,${g},${this._x1=h},${this._y1=m}`:v>qa&&this._append`A${n},${n},0,${+(v>=Sv)},${g},${this._x1=t+n*Math.cos(o)},${this._y1=r+n*Math.sin(o)}`)}rect(t,r,n,a){this._append`M${this._x0=this._x1=+t},${this._y0=this._y1=+r}h${n=+n}v${+a}h${-n}Z`}toString(){return this._}}function TE(e){let t=3;return e.digits=function(r){if(!arguments.length)return t;if(r==null)t=null;else{const n=Math.floor(r);if(!(n>=0))throw new RangeError(`invalid digits: ${r}`);t=n}return e},()=>new oR(t)}function My(e){return typeof e=="object"&&"length"in e?e:Array.from(e)}function DE(e){this._context=e}DE.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:this._context.lineTo(e,t);break}}};function xh(e){return new DE(e)}function RE(e){return e[0]}function LE(e){return e[1]}function $E(e,t){var r=yt(!0),n=null,a=xh,o=null,c=TE(u);e=typeof e=="function"?e:e===void 0?RE:yt(e),t=typeof t=="function"?t:t===void 0?LE:yt(t);function u(f){var h,m=(f=My(f)).length,g,v=!1,b;for(n==null&&(o=a(b=c())),h=0;h<=m;++h)!(h=b;--j)u.point(A[j],P[j]);u.lineEnd(),u.areaEnd()}N&&(A[v]=+e(S,v,g),P[v]=+t(S,v,g),u.point(n?+n(S,v,g):A[v],r?+r(S,v,g):P[v]))}if(E)return u=null,E+""||null}function m(){return $E().defined(a).curve(c).context(o)}return h.x=function(g){return arguments.length?(e=typeof g=="function"?g:yt(+g),n=null,h):e},h.x0=function(g){return arguments.length?(e=typeof g=="function"?g:yt(+g),h):e},h.x1=function(g){return arguments.length?(n=g==null?null:typeof g=="function"?g:yt(+g),h):n},h.y=function(g){return arguments.length?(t=typeof g=="function"?g:yt(+g),r=null,h):t},h.y0=function(g){return arguments.length?(t=typeof g=="function"?g:yt(+g),h):t},h.y1=function(g){return arguments.length?(r=g==null?null:typeof g=="function"?g:yt(+g),h):r},h.lineX0=h.lineY0=function(){return m().x(e).y(t)},h.lineY1=function(){return m().x(e).y(r)},h.lineX1=function(){return m().x(n).y(t)},h.defined=function(g){return arguments.length?(a=typeof g=="function"?g:yt(!!g),h):a},h.curve=function(g){return arguments.length?(c=g,o!=null&&(u=c(o)),h):c},h.context=function(g){return arguments.length?(g==null?o=u=null:u=c(o=g),h):o},h}class zE{constructor(t,r){this._context=t,this._x=r}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line}point(t,r){switch(t=+t,r=+r,this._point){case 0:{this._point=1,this._line?this._context.lineTo(t,r):this._context.moveTo(t,r);break}case 1:this._point=2;default:{this._x?this._context.bezierCurveTo(this._x0=(this._x0+t)/2,this._y0,this._x0,r,t,r):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+r)/2,t,this._y0,t,r);break}}this._x0=t,this._y0=r}}function sR(e){return new zE(e,!0)}function lR(e){return new zE(e,!1)}function mf(){}function pf(e,t,r){e._context.bezierCurveTo((2*e._x0+e._x1)/3,(2*e._y0+e._y1)/3,(e._x0+2*e._x1)/3,(e._y0+2*e._y1)/3,(e._x0+4*e._x1+t)/6,(e._y0+4*e._y1+r)/6)}function FE(e){this._context=e}FE.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:pf(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:pf(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function uR(e){return new FE(e)}function BE(e){this._context=e}BE.prototype={areaStart:mf,areaEnd:mf,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:{this._context.moveTo(this._x2,this._y2),this._context.closePath();break}case 2:{this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break}case 3:{this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4);break}}},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._x2=e,this._y2=t;break;case 1:this._point=2,this._x3=e,this._y3=t;break;case 2:this._point=3,this._x4=e,this._y4=t,this._context.moveTo((this._x0+4*this._x1+e)/6,(this._y0+4*this._y1+t)/6);break;default:pf(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function cR(e){return new BE(e)}function UE(e){this._context=e}UE.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var r=(this._x0+4*this._x1+e)/6,n=(this._y0+4*this._y1+t)/6;this._line?this._context.lineTo(r,n):this._context.moveTo(r,n);break;case 3:this._point=4;default:pf(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function dR(e){return new UE(e)}function HE(e){this._context=e}HE.prototype={areaStart:mf,areaEnd:mf,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(e,t){e=+e,t=+t,this._point?this._context.lineTo(e,t):(this._point=1,this._context.moveTo(e,t))}};function fR(e){return new HE(e)}function zw(e){return e<0?-1:1}function Fw(e,t,r){var n=e._x1-e._x0,a=t-e._x1,o=(e._y1-e._y0)/(n||a<0&&-0),c=(r-e._y1)/(a||n<0&&-0),u=(o*a+c*n)/(n+a);return(zw(o)+zw(c))*Math.min(Math.abs(o),Math.abs(c),.5*Math.abs(u))||0}function Bw(e,t){var r=e._x1-e._x0;return r?(3*(e._y1-e._y0)/r-t)/2:t}function cg(e,t,r){var n=e._x0,a=e._y0,o=e._x1,c=e._y1,u=(o-n)/3;e._context.bezierCurveTo(n+u,a+u*t,o-u,c-u*r,o,c)}function gf(e){this._context=e}gf.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:cg(this,this._t0,Bw(this,this._t0));break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){var r=NaN;if(e=+e,t=+t,!(e===this._x1&&t===this._y1)){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,cg(this,Bw(this,r=Fw(this,e,t)),r);break;default:cg(this,this._t0,r=Fw(this,e,t));break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t,this._t0=r}}};function WE(e){this._context=new KE(e)}(WE.prototype=Object.create(gf.prototype)).point=function(e,t){gf.prototype.point.call(this,t,e)};function KE(e){this._context=e}KE.prototype={moveTo:function(e,t){this._context.moveTo(t,e)},closePath:function(){this._context.closePath()},lineTo:function(e,t){this._context.lineTo(t,e)},bezierCurveTo:function(e,t,r,n,a,o){this._context.bezierCurveTo(t,e,n,r,o,a)}};function hR(e){return new gf(e)}function mR(e){return new WE(e)}function GE(e){this._context=e}GE.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=[],this._y=[]},lineEnd:function(){var e=this._x,t=this._y,r=e.length;if(r)if(this._line?this._context.lineTo(e[0],t[0]):this._context.moveTo(e[0],t[0]),r===2)this._context.lineTo(e[1],t[1]);else for(var n=Uw(e),a=Uw(t),o=0,c=1;c=0;--t)a[t]=(c[t]-a[t+1])/o[t];for(o[r-1]=(e[r]+a[r-1])/2,t=0;t=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:{if(this._t<=0)this._context.lineTo(this._x,t),this._context.lineTo(e,t);else{var r=this._x*(1-this._t)+e*this._t;this._context.lineTo(r,this._y),this._context.lineTo(r,t)}break}}this._x=e,this._y=t}};function gR(e){return new bh(e,.5)}function vR(e){return new bh(e,0)}function yR(e){return new bh(e,1)}function xo(e,t){if((c=e.length)>1)for(var r=1,n,a,o=e[t[0]],c,u=o.length;r=0;)r[t]=t;return r}function xR(e,t){return e[t]}function bR(e){const t=[];return t.key=e,t}function wR(){var e=yt([]),t=Ev,r=xo,n=xR;function a(o){var c=Array.from(e.apply(this,arguments),bR),u,f=c.length,h=-1,m;for(const g of o)for(u=0,++h;u0){for(var r,n,a=0,o=e[0].length,c;a0){for(var r=0,n=e[t[0]],a,o=n.length;r0)||!((o=(a=e[t[0]]).length)>0))){for(var r=0,n=1,a,o,c;n1&&arguments[1]!==void 0?arguments[1]:ER,r=10**t,n=Math.round(e*r)/r;return Object.is(n,-0)?0:n}function Gt(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n{var u=r[c-1];return typeof u=="string"?a+u+o:u!==void 0?a+va(u)+o:a+o},"")}var Jr=e=>e===0?0:e>0?1:-1,Kn=e=>typeof e=="number"&&e!=+e,bo=e=>typeof e=="string"&&e.length>1&&e.indexOf("%")===e.length-1,Ee=e=>(typeof e=="number"||e instanceof Number)&&!Kn(e),Gn=e=>Ee(e)||typeof e=="string",AR=0,Au=e=>{var t=++AR;return"".concat(e||"").concat(t)},Sa=function(t,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,a=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1;if(!Ee(t)&&typeof t!="string")return n;var o;if(bo(t)){if(r==null)return n;var c=t.indexOf("%");o=r*parseFloat(t.slice(0,c))/100}else o=+t;return Kn(o)&&(o=n),a&&r!=null&&o>r&&(o=r),o},QE=e=>{if(!Array.isArray(e))return!1;for(var t=e.length,r={},n=0;nn&&(typeof t=="function"?t(n):Oo(n,t))===r)}var Yt=e=>e===null||typeof e>"u",Dy=e=>Yt(e)?e:"".concat(e.charAt(0).toUpperCase()).concat(e.slice(1));function Ar(e){return e!=null}function rl(){}var XE=e=>"radius"in e&&"startAngle"in e&&"endAngle"in e,Ry=(e,t)=>{if(!e||typeof e=="function"||typeof e=="boolean")return null;var r=e;if(y.isValidElement(e)&&(r=e.props),typeof r!="object"&&typeof r!="function")return null;var n={};return Object.keys(r).forEach(a=>{_y(a)&&typeof r[a]=="function"&&(n[a]=(o=>r[a](r,o)))}),n},CR=(e,t,r)=>n=>(e(t,r,n),null),PR=(e,t,r)=>{if(e===null||typeof e!="object"&&typeof e!="function")return null;var n=null;return Object.keys(e).forEach(a=>{var o=e[a];_y(a)&&typeof o=="function"&&(n||(n={}),n[a]=CR(o,t,r))}),n};function Hw(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function OR(e){for(var t=1;t(c[u]===void 0&&n[u]!==void 0&&(c[u]=n[u]),c),r);return o}function TR(e,t){const r=new Map;for(let n=0;nObject.prototype.propertyIsEnumerable.call(e,t))}function Ly(e){return e==null?e===void 0?"[object Undefined]":"[object Null]":Object.prototype.toString.call(e)}const zR="[object RegExp]",JE="[object String]",e5="[object Number]",t5="[object Boolean]",r5="[object Arguments]",FR="[object Symbol]",BR="[object Date]",UR="[object Map]",HR="[object Set]",WR="[object Array]",KR="[object ArrayBuffer]",GR="[object Object]",VR="[object DataView]",qR="[object Uint8Array]",QR="[object Uint8ClampedArray]",YR="[object Uint16Array]",XR="[object Uint32Array]",ZR="[object Int8Array]",JR="[object Int16Array]",eL="[object Int32Array]",tL="[object Float32Array]",rL="[object Float64Array]",Ww=typeof globalThis=="object"&&globalThis||typeof window=="object"&&window||typeof self=="object"&&self||typeof global=="object"&&global||(function(){return this})();function nL(e){return typeof Ww.Buffer<"u"&&Ww.Buffer.isBuffer(e)}function iL(e,t){return Ja(e,void 0,e,new Map,t)}function Ja(e,t,r,n=new Map,a=void 0){const o=a==null?void 0:a(e,t,r,n);if(o!==void 0)return o;if(Cv(e))return e;if(n.has(e))return n.get(e);if(Array.isArray(e)){const c=new Array(e.length);n.set(e,c);for(let u=0;u{}):Pv(e,t,function n(a,o,c,u,f,h){const m=r(a,o,c,u,f,h);return m!==void 0?!!m:Pv(a,o,n,h,!1)},new Map,!0)}function Pv(e,t,r,n,a=!1){if(t===e)return!0;switch(typeof t){case"object":return sL(e,t,r,n);case"function":return Object.keys(t).length>0?Pv(e,{...t},r,n,a):Zd(e,t);default:return n5(e)&&a?typeof t=="string"?t==="":!0:Zd(e,t)}}function sL(e,t,r,n){if(t==null)return!0;if(Array.isArray(t))return a5(e,t,r,n);if(t instanceof Map)return lL(e,t,r,n);if(t instanceof Set)return uL(e,t,r,n);const a=Object.keys(t);if(e==null||Cv(e))return a.length===0;if(a.length===0)return!0;if(n!=null&&n.has(t))return n.get(t)===e;n==null||n.set(t,e);try{for(let o=0;o{})}function cL(e){return e=oL(e),t=>o5(t,e)}function dL(e,t){return iL(e,(r,n,a,o)=>{if(typeof e=="object"){if(Ly(e)==="[object Object]"&&typeof e.constructor!="function"){const c={};return o.set(e,c),gn(c,e,a,o),c}switch(Object.prototype.toString.call(e)){case e5:case JE:case t5:{const c=new e.constructor(e==null?void 0:e.valueOf());return gn(c,e),c}case r5:{const c={};return gn(c,e),c.length=e.length,c[Symbol.iterator]=e[Symbol.iterator],c}default:return}}})}function fL(e){return dL(e)}const hL=/^(?:0|[1-9]\d*)$/;function s5(e,t=Number.MAX_SAFE_INTEGER){switch(typeof e){case"number":return Number.isInteger(e)&&e>=0&&e=0}function l5(e){return e!=null&&typeof e!="function"&&yL(e.length)}function xL(e){return typeof e=="object"&&e!==null}function bL(e){return xL(e)&&l5(e)}function Kw(e,t=ZE){return bL(e)?TR(Array.from(e),DR(vL(t),1)):[]}function wL(e,t,r){return t===!0?Kw(e,r):typeof t=="function"?Kw(e,t):e}var dg={exports:{}},fg={},hg={exports:{}},mg={};/** + * @license React + * use-sync-external-store-shim.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Gw;function kL(){if(Gw)return mg;Gw=1;var e=el();function t(g,v){return g===v&&(g!==0||1/g===1/v)||g!==g&&v!==v}var r=typeof Object.is=="function"?Object.is:t,n=e.useState,a=e.useEffect,o=e.useLayoutEffect,c=e.useDebugValue;function u(g,v){var b=v(),j=n({inst:{value:b,getSnapshot:v}}),k=j[0].inst,S=j[1];return o(function(){k.value=b,k.getSnapshot=v,f(k)&&S({inst:k})},[g,b,v]),a(function(){return f(k)&&S({inst:k}),g(function(){f(k)&&S({inst:k})})},[g]),c(b),b}function f(g){var v=g.getSnapshot;g=g.value;try{var b=v();return!r(g,b)}catch{return!0}}function h(g,v){return v()}var m=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?h:u;return mg.useSyncExternalStore=e.useSyncExternalStore!==void 0?e.useSyncExternalStore:m,mg}var Vw;function jL(){return Vw||(Vw=1,hg.exports=kL()),hg.exports}/** + * @license React + * use-sync-external-store-shim/with-selector.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var qw;function SL(){if(qw)return fg;qw=1;var e=el(),t=jL();function r(h,m){return h===m&&(h!==0||1/h===1/m)||h!==h&&m!==m}var n=typeof Object.is=="function"?Object.is:r,a=t.useSyncExternalStore,o=e.useRef,c=e.useEffect,u=e.useMemo,f=e.useDebugValue;return fg.useSyncExternalStoreWithSelector=function(h,m,g,v,b){var j=o(null);if(j.current===null){var k={hasValue:!1,value:null};j.current=k}else k=j.current;j=u(function(){function N(O){if(!E){if(E=!0,A=O,O=v(O),b!==void 0&&k.hasValue){var D=k.value;if(b(D,O))return P=D}return P=O}if(D=P,n(A,O))return D;var U=v(O);return b!==void 0&&b(D,U)?(A=O,D):(A=O,P=U)}var E=!1,A,P,_=g===void 0?null:g;return[function(){return N(m())},_===null?void 0:function(){return N(_())}]},[m,g,v,b]);var S=a(h,j[0],j[1]);return c(function(){k.hasValue=!0,k.value=S},[S]),f(S),S},fg}var Qw;function NL(){return Qw||(Qw=1,dg.exports=SL()),dg.exports}var EL=NL(),$y=y.createContext(null),AL=e=>e,Nt=()=>{var e=y.useContext($y);return e?e.store.dispatch:AL},Jd=()=>{},CL=()=>Jd,PL=(e,t)=>e===t;function Me(e){var t=y.useContext($y),r=y.useMemo(()=>t?n=>{if(n!=null)return e(n)}:Jd,[t,e]);return EL.useSyncExternalStoreWithSelector(t?t.subscription.addNestedSub:CL,t?t.store.getState:Jd,t?t.store.getState:Jd,r,PL)}function OL(e,t=`expected a function, instead received ${typeof e}`){if(typeof e!="function")throw new TypeError(t)}function _L(e,t="expected all items to be functions, instead received the following types: "){if(!e.every(r=>typeof r=="function")){const r=e.map(n=>typeof n=="function"?`function ${n.name||"unnamed"}()`:typeof n).join(", ");throw new TypeError(`${t}[${r}]`)}}var Yw=e=>Array.isArray(e)?e:[e];function ML(e){const t=Array.isArray(e[0])?e[0]:e;return _L(t,"createSelector expects all input-selectors to be functions, but received the following types: "),t}function IL(e,t){const r=[],{length:n}=e;for(let a=0;atypeof WeakRef>"u"?TL:WeakRef,u5=DL(),RL=0,Xw=1;function Id(){return{s:RL,v:void 0,o:null,p:null}}function LL(e){return e instanceof u5?e.deref():e}function c5(e,t={}){let r=Id();const{resultEqualityCheck:n}=t;let a,o=0;function c(){let u=r;const{length:f}=arguments;for(let g=0,v=f;g{r=Id(),c.resetResultsCount()},c.resultsCount=()=>o,c.resetResultsCount=()=>{o=0},c}function $L(e,...t){const r=typeof e=="function"?{memoize:e,memoizeOptions:t}:e,n=(...a)=>{let o=0,c=0,u,f={},h=a.pop();typeof h=="object"&&(f=h,h=a.pop()),OL(h,`createSelector expects an output function after the inputs, but received: [${typeof h}]`);const m={...r,...f},{memoize:g,memoizeOptions:v=[],argsMemoize:b=c5,argsMemoizeOptions:j=[]}=m,k=Yw(v),S=Yw(j),N=ML(a),E=g(function(){return o++,h.apply(null,arguments)},...k),A=b(function(){c++;const _=IL(N,arguments);return u=E.apply(null,_),u},...S);return Object.assign(A,{resultFunc:h,memoizedResultFunc:E,dependencies:N,dependencyRecomputations:()=>c,resetDependencyRecomputations:()=>{c=0},lastResult:()=>u,recomputations:()=>o,resetRecomputations:()=>{o=0},memoize:g,argsMemoize:b})};return Object.assign(n,{withTypes:()=>n}),n}var q=$L(c5);function zL(e,t=1){const r=[],n=Math.floor(t),a=(o,c)=>{for(let u=0;u{if(e!==t){const n=Zw(e),a=Zw(t);if(n===a&&n===0){if(et)return r==="desc"?-1:1}return r==="desc"?a-n:n-a}return 0};function d5(e){return typeof e=="symbol"||e instanceof Symbol}const BL=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,UL=/^\w*$/;function HL(e,t){return Array.isArray(e)?!1:typeof e=="number"||typeof e=="boolean"||e==null||d5(e)?!0:typeof e=="string"&&(UL.test(e)||!BL.test(e))||t!=null}function WL(e,t,r,n){if(e==null)return[];r=r,Array.isArray(e)||(e=Object.values(e)),Array.isArray(t)||(t=t==null?[null]:[t]),t.length===0&&(t=[null]),Array.isArray(r)||(r=r==null?[]:[r]),r=r.map(u=>String(u));const a=(u,f)=>{let h=u;for(let m=0;mf==null||u==null?f:typeof u=="object"&&"key"in u?Object.hasOwn(f,u.key)?f[u.key]:a(f,u.path):typeof u=="function"?u(f):Array.isArray(u)?a(f,u):typeof f=="object"?f[u]:f,c=t.map(u=>(Array.isArray(u)&&u.length===1&&(u=u[0]),u==null||typeof u=="function"||Array.isArray(u)||HL(u)?u:{key:u,path:Ty(u)}));return e.map(u=>({original:u,criteria:c.map(f=>o(f,u))})).slice().sort((u,f)=>{for(let h=0;hu.original)}function wh(e,...t){const r=t.length;return r>1&&Ov(e,t[0],t[1])?t=[]:r>2&&Ov(t[0],t[1],t[2])&&(t=[t[0]]),WL(e,zL(t),["asc"])}var f5=e=>e.legend.settings,KL=e=>e.legend.size,GL=e=>e.legend.payload;q([GL,f5],(e,t)=>{var r=t.itemSorter,n=e.flat(1);return r?wh(n,r):n});function VL(e,t){return XL(e)||YL(e,t)||QL(e,t)||qL()}function qL(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function QL(e,t){if(e){if(typeof e=="string")return Jw(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Jw(e,t):void 0}}function Jw(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);rTd||Math.abs(e.left-t.left)>Td||Math.abs(e.top-t.top)>Td||Math.abs(e.width-t.width)>Td}function tk(e){var t=e.getBoundingClientRect();return{height:t.height,left:t.left,top:t.top,width:t.width}}function ZL(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],t=y.useState({height:0,left:0,top:0,width:0}),r=VL(t,2),n=r[0],a=r[1],o=y.useRef(null),c=y.useRef(n);c.current=n;var u=y.useCallback(f=>{if(o.current!=null&&(o.current.disconnect(),o.current=null),f!=null){var h=tk(f);if(ek(h,c.current)&&a(h),typeof ResizeObserver<"u"){var m=new ResizeObserver(()=>{var g=tk(f);ek(g,c.current)&&a(g)});m.observe(f),o.current=m}}},[...e]);return y.useEffect(()=>()=>{var f;(f=o.current)===null||f===void 0||f.disconnect()},[]),[n,u]}function Kt(e){return`Minified Redux error #${e}; visit https://redux.js.org/Errors?code=${e} for the full message or use the non-minified dev environment for full errors. `}var JL=typeof Symbol=="function"&&Symbol.observable||"@@observable",rk=JL,pg=()=>Math.random().toString(36).substring(7).split("").join("."),e$={INIT:`@@redux/INIT${pg()}`,REPLACE:`@@redux/REPLACE${pg()}`,PROBE_UNKNOWN_ACTION:()=>`@@redux/PROBE_UNKNOWN_ACTION${pg()}`},vf=e$;function zy(e){if(typeof e!="object"||e===null)return!1;let t=e;for(;Object.getPrototypeOf(t)!==null;)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t||Object.getPrototypeOf(e)===null}function h5(e,t,r){if(typeof e!="function")throw new Error(Kt(2));if(typeof t=="function"&&typeof r=="function"||typeof r=="function"&&typeof arguments[3]=="function")throw new Error(Kt(0));if(typeof t=="function"&&typeof r>"u"&&(r=t,t=void 0),typeof r<"u"){if(typeof r!="function")throw new Error(Kt(1));return r(h5)(e,t)}let n=e,a=t,o=new Map,c=o,u=0,f=!1;function h(){c===o&&(c=new Map,o.forEach((S,N)=>{c.set(N,S)}))}function m(){if(f)throw new Error(Kt(3));return a}function g(S){if(typeof S!="function")throw new Error(Kt(4));if(f)throw new Error(Kt(5));let N=!0;h();const E=u++;return c.set(E,S),function(){if(N){if(f)throw new Error(Kt(6));N=!1,h(),c.delete(E),o=null}}}function v(S){if(!zy(S))throw new Error(Kt(7));if(typeof S.type>"u")throw new Error(Kt(8));if(typeof S.type!="string")throw new Error(Kt(17));if(f)throw new Error(Kt(9));try{f=!0,a=n(a,S)}finally{f=!1}return(o=c).forEach(E=>{E()}),S}function b(S){if(typeof S!="function")throw new Error(Kt(10));n=S,v({type:vf.REPLACE})}function j(){const S=g;return{subscribe(N){if(typeof N!="object"||N===null)throw new Error(Kt(11));function E(){const P=N;P.next&&P.next(m())}return E(),{unsubscribe:S(E)}},[rk](){return this}}}return v({type:vf.INIT}),{dispatch:v,subscribe:g,getState:m,replaceReducer:b,[rk]:j}}function t$(e){Object.keys(e).forEach(t=>{const r=e[t];if(typeof r(void 0,{type:vf.INIT})>"u")throw new Error(Kt(12));if(typeof r(void 0,{type:vf.PROBE_UNKNOWN_ACTION()})>"u")throw new Error(Kt(13))})}function m5(e){const t=Object.keys(e),r={};for(let o=0;o"u")throw u&&u.type,new Error(Kt(14));h[g]=j,f=f||j!==b}return f=f||n.length!==Object.keys(c).length,f?h:c}}function yf(...e){return e.length===0?t=>t:e.length===1?e[0]:e.reduce((t,r)=>(...n)=>t(r(...n)))}function r$(...e){return t=>(r,n)=>{const a=t(r,n);let o=()=>{throw new Error(Kt(15))};const c={getState:a.getState,dispatch:(f,...h)=>o(f,...h)},u=e.map(f=>f(c));return o=yf(...u)(a.dispatch),{...a,dispatch:o}}}function p5(e){return zy(e)&&"type"in e&&typeof e.type=="string"}var g5=Symbol.for("immer-nothing"),nk=Symbol.for("immer-draftable"),vr=Symbol.for("immer-state");function yn(e,...t){throw new Error(`[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`)}var Br=Object,Gs=Br.getPrototypeOf,xf="constructor",kh="prototype",_v="configurable",bf="enumerable",ef="writable",Cu="value",wi=e=>!!e&&!!e[vr];function jn(e){var t;return e?v5(e)||Sh(e)||!!e[nk]||!!((t=e[xf])!=null&&t[nk])||Nh(e)||Eh(e):!1}var n$=Br[kh][xf].toString(),ik=new WeakMap;function v5(e){if(!e||!Fy(e))return!1;const t=Gs(e);if(t===null||t===Br[kh])return!0;const r=Br.hasOwnProperty.call(t,xf)&&t[xf];if(r===Object)return!0;if(!vs(r))return!1;let n=ik.get(r);return n===void 0&&(n=Function.toString.call(r),ik.set(r,n)),n===n$}function jh(e,t,r=!0){Xu(e)===0?(r?Reflect.ownKeys(e):Br.keys(e)).forEach(a=>{t(a,e[a],e)}):e.forEach((n,a)=>t(a,n,e))}function Xu(e){const t=e[vr];return t?t.type_:Sh(e)?1:Nh(e)?2:Eh(e)?3:0}var ak=(e,t,r=Xu(e))=>r===2?e.has(t):Br[kh].hasOwnProperty.call(e,t),Mv=(e,t,r=Xu(e))=>r===2?e.get(t):e[t],wf=(e,t,r,n=Xu(e))=>{n===2?e.set(t,r):n===3?e.add(r):e[t]=r};function i$(e,t){return e===t?e!==0||1/e===1/t:e!==e&&t!==t}var Sh=Array.isArray,Nh=e=>e instanceof Map,Eh=e=>e instanceof Set,Fy=e=>typeof e=="object",vs=e=>typeof e=="function",gg=e=>typeof e=="boolean";function a$(e){const t=+e;return Number.isInteger(t)&&String(t)===e}var ci=e=>e.copy_||e.base_,By=e=>e.modified_?e.copy_:e.base_;function Iv(e,t){if(Nh(e))return new Map(e);if(Eh(e))return new Set(e);if(Sh(e))return Array[kh].slice.call(e);const r=v5(e);if(t===!0||t==="class_only"&&!r){const n=Br.getOwnPropertyDescriptors(e);delete n[vr];let a=Reflect.ownKeys(n);for(let o=0;o1&&Br.defineProperties(e,{set:Dd,add:Dd,clear:Dd,delete:Dd}),Br.freeze(e),t&&jh(e,(r,n)=>{Uy(n,!0)},!1)),e}function o$(){yn(2)}var Dd={[Cu]:o$};function Ah(e){return e===null||!Fy(e)?!0:Br.isFrozen(e)}var kf="MapSet",Tv="Patches",ok="ArrayMethods",y5={};function wo(e){const t=y5[e];return t||yn(0,e),t}var sk=e=>!!y5[e],Pu,x5=()=>Pu,s$=(e,t)=>({drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0,handledSet_:new Set,processedForPatches_:new Set,mapSetPlugin_:sk(kf)?wo(kf):void 0,arrayMethodsPlugin_:sk(ok)?wo(ok):void 0});function lk(e,t){t&&(e.patchPlugin_=wo(Tv),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function Dv(e){Rv(e),e.drafts_.forEach(l$),e.drafts_=null}function Rv(e){e===Pu&&(Pu=e.parent_)}var uk=e=>Pu=s$(Pu,e);function l$(e){const t=e[vr];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0}function ck(e,t){t.unfinalizedDrafts_=t.drafts_.length;const r=t.drafts_[0];if(e!==void 0&&e!==r){r[vr].modified_&&(Dv(t),yn(4)),jn(e)&&(e=dk(t,e));const{patchPlugin_:a}=t;a&&a.generateReplacementPatches_(r[vr].base_,e,t)}else e=dk(t,r);return u$(t,e,!0),Dv(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e!==g5?e:void 0}function dk(e,t){if(Ah(t))return t;const r=t[vr];if(!r)return jf(t,e.handledSet_,e);if(!Ch(r,e))return t;if(!r.modified_)return r.base_;if(!r.finalized_){const{callbacks_:n}=r;if(n)for(;n.length>0;)n.pop()(e);k5(r,e)}return r.copy_}function u$(e,t,r=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&Uy(t,r)}function b5(e){e.finalized_=!0,e.scope_.unfinalizedDrafts_--}var Ch=(e,t)=>e.scope_===t,c$=[];function w5(e,t,r,n){const a=ci(e),o=e.type_;if(n!==void 0&&Mv(a,n,o)===t){wf(a,n,r,o);return}if(!e.draftLocations_){const u=e.draftLocations_=new Map;jh(a,(f,h)=>{if(wi(h)){const m=u.get(h)||[];m.push(f),u.set(h,m)}})}const c=e.draftLocations_.get(t)??c$;for(const u of c)wf(a,u,r,o)}function d$(e,t,r){e.callbacks_.push(function(a){var u;const o=t;if(!o||!Ch(o,a))return;(u=a.mapSetPlugin_)==null||u.fixSetContents(o);const c=By(o);w5(e,o.draft_??o,c,r),k5(o,a)})}function k5(e,t){var n;if(e.modified_&&!e.finalized_&&(e.type_===3||e.type_===1&&e.allIndicesReassigned_||(((n=e.assigned_)==null?void 0:n.size)??0)>0)){const{patchPlugin_:a}=t;if(a){const o=a.getPath(e);o&&a.generatePatches_(e,o,t)}b5(e)}}function f$(e,t,r){const{scope_:n}=e;if(wi(r)){const a=r[vr];Ch(a,n)&&a.callbacks_.push(function(){tf(e);const c=By(a);w5(e,r,c,t)})}else jn(r)&&e.callbacks_.push(function(){const o=ci(e);e.type_===3?o.has(r)&&jf(r,n.handledSet_,n):Mv(o,t,e.type_)===r&&n.drafts_.length>1&&(e.assigned_.get(t)??!1)===!0&&e.copy_&&jf(Mv(e.copy_,t,e.type_),n.handledSet_,n)})}function jf(e,t,r){return!r.immer_.autoFreeze_&&r.unfinalizedDrafts_<1||wi(e)||t.has(e)||!jn(e)||Ah(e)||(t.add(e),jh(e,(n,a)=>{if(wi(a)){const o=a[vr];if(Ch(o,r)){const c=By(o);wf(e,n,c,e.type_),b5(o)}}else jn(a)&&jf(a,t,r)})),e}function h$(e,t){const r=Sh(e),n={type_:r?1:0,scope_:t?t.scope_:x5(),modified_:!1,finalized_:!1,assigned_:void 0,parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1,callbacks_:void 0};let a=n,o=Sf;r&&(a=[n],o=Ou);const{revoke:c,proxy:u}=Proxy.revocable(a,o);return n.draft_=u,n.revoke_=c,[u,n]}var Sf={get(e,t){if(t===vr)return e;let r=e.scope_.arrayMethodsPlugin_;const n=e.type_===1&&typeof t=="string";if(n&&r!=null&&r.isArrayOperationMethod(t))return r.createMethodInterceptor(e,t);const a=ci(e);if(!ak(a,t,e.type_))return m$(e,a,t);const o=a[t];if(e.finalized_||!jn(o)||n&&e.operationMethod&&(r!=null&&r.isMutatingArrayMethod(e.operationMethod))&&a$(t))return o;if(o===vg(e.base_,t)){tf(e);const c=e.type_===1?+t:t,u=$v(e.scope_,o,e,c);return e.copy_[c]=u}return o},has(e,t){return t in ci(e)},ownKeys(e){return Reflect.ownKeys(ci(e))},set(e,t,r){const n=j5(ci(e),t);if(n!=null&&n.set)return n.set.call(e.draft_,r),!0;if(!e.modified_){const a=vg(ci(e),t),o=a==null?void 0:a[vr];if(o&&o.base_===r)return e.copy_[t]=r,e.assigned_.set(t,!1),!0;if(i$(r,a)&&(r!==void 0||ak(e.base_,t,e.type_)))return!0;tf(e),Lv(e)}return e.copy_[t]===r&&(r!==void 0||t in e.copy_)||Number.isNaN(r)&&Number.isNaN(e.copy_[t])||(e.copy_[t]=r,e.assigned_.set(t,!0),f$(e,t,r)),!0},deleteProperty(e,t){return tf(e),vg(e.base_,t)!==void 0||t in e.base_?(e.assigned_.set(t,!1),Lv(e)):e.assigned_.delete(t),e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){const r=ci(e),n=Reflect.getOwnPropertyDescriptor(r,t);return n&&{[ef]:!0,[_v]:e.type_!==1||t!=="length",[bf]:n[bf],[Cu]:r[t]}},defineProperty(){yn(11)},getPrototypeOf(e){return Gs(e.base_)},setPrototypeOf(){yn(12)}},Ou={};for(let e in Sf){let t=Sf[e];Ou[e]=function(){const r=arguments;return r[0]=r[0][0],t.apply(this,r)}}Ou.deleteProperty=function(e,t){return Ou.set.call(this,e,t,void 0)};Ou.set=function(e,t,r){return Sf.set.call(this,e[0],t,r,e[0])};function vg(e,t){const r=e[vr];return(r?ci(r):e)[t]}function m$(e,t,r){var a;const n=j5(t,r);return n?Cu in n?n[Cu]:(a=n.get)==null?void 0:a.call(e.draft_):void 0}function j5(e,t){if(!(t in e))return;let r=Gs(e);for(;r;){const n=Object.getOwnPropertyDescriptor(r,t);if(n)return n;r=Gs(r)}}function Lv(e){e.modified_||(e.modified_=!0,e.parent_&&Lv(e.parent_))}function tf(e){e.copy_||(e.assigned_=new Map,e.copy_=Iv(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var p$=class{constructor(t){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!1,this.produce=(r,n,a)=>{if(vs(r)&&!vs(n)){const c=n;n=r;const u=this;return function(h=c,...m){return u.produce(h,g=>n.call(this,g,...m))}}vs(n)||yn(6),a!==void 0&&!vs(a)&&yn(7);let o;if(jn(r)){const c=uk(this),u=$v(c,r,void 0);let f=!0;try{o=n(u),f=!1}finally{f?Dv(c):Rv(c)}return lk(c,a),ck(o,c)}else if(!r||!Fy(r)){if(o=n(r),o===void 0&&(o=r),o===g5&&(o=void 0),this.autoFreeze_&&Uy(o,!0),a){const c=[],u=[];wo(Tv).generateReplacementPatches_(r,o,{patches_:c,inversePatches_:u}),a(c,u)}return o}else yn(1,r)},this.produceWithPatches=(r,n)=>{if(vs(r))return(u,...f)=>this.produceWithPatches(u,h=>r(h,...f));let a,o;return[this.produce(r,n,(u,f)=>{a=u,o=f}),a,o]},gg(t==null?void 0:t.autoFreeze)&&this.setAutoFreeze(t.autoFreeze),gg(t==null?void 0:t.useStrictShallowCopy)&&this.setUseStrictShallowCopy(t.useStrictShallowCopy),gg(t==null?void 0:t.useStrictIteration)&&this.setUseStrictIteration(t.useStrictIteration)}createDraft(t){jn(t)||yn(8),wi(t)&&(t=en(t));const r=uk(this),n=$v(r,t,void 0);return n[vr].isManual_=!0,Rv(r),n}finishDraft(t,r){const n=t&&t[vr];(!n||!n.isManual_)&&yn(9);const{scope_:a}=n;return lk(a,r),ck(void 0,a)}setAutoFreeze(t){this.autoFreeze_=t}setUseStrictShallowCopy(t){this.useStrictShallowCopy_=t}setUseStrictIteration(t){this.useStrictIteration_=t}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(t,r){let n;for(n=r.length-1;n>=0;n--){const o=r[n];if(o.path.length===0&&o.op==="replace"){t=o.value;break}}n>-1&&(r=r.slice(n+1));const a=wo(Tv).applyPatches_;return wi(t)?a(t,r):this.produce(t,o=>a(o,r))}};function $v(e,t,r,n){const[a,o]=Nh(t)?wo(kf).proxyMap_(t,r):Eh(t)?wo(kf).proxySet_(t,r):h$(t,r);return((r==null?void 0:r.scope_)??x5()).drafts_.push(a),o.callbacks_=(r==null?void 0:r.callbacks_)??[],o.key_=n,r&&n!==void 0?d$(r,o,n):o.callbacks_.push(function(f){var m;(m=f.mapSetPlugin_)==null||m.fixSetContents(o);const{patchPlugin_:h}=f;o.modified_&&h&&h.generatePatches_(o,[],f)}),a}function en(e){return wi(e)||yn(10,e),S5(e)}function S5(e){if(!jn(e)||Ah(e))return e;const t=e[vr];let r,n=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,r=Iv(e,t.scope_.immer_.useStrictShallowCopy_),n=t.scope_.immer_.shouldUseStrictIteration()}else r=Iv(e,!0);return jh(r,(a,o)=>{wf(r,a,S5(o))},n),t&&(t.finalized_=!1),r}var g$=new p$,N5=g$.produce;function E5(e){return({dispatch:r,getState:n})=>a=>o=>typeof o=="function"?o(r,n,e):a(o)}var v$=E5(),y$=E5,x$=typeof window<"u"&&window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__?window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__:function(){if(arguments.length!==0)return typeof arguments[0]=="object"?yf:yf.apply(null,arguments)};function Hr(e,t){function r(...n){if(t){let a=t(...n);if(!a)throw new Error(Ur(0));return{type:e,payload:a.payload,..."meta"in a&&{meta:a.meta},..."error"in a&&{error:a.error}}}return{type:e,payload:n[0]}}return r.toString=()=>`${e}`,r.type=e,r.match=n=>p5(n)&&n.type===e,r}var A5=class pu extends Array{constructor(...t){super(...t),Object.setPrototypeOf(this,pu.prototype)}static get[Symbol.species](){return pu}concat(...t){return super.concat.apply(this,t)}prepend(...t){return t.length===1&&Array.isArray(t[0])?new pu(...t[0].concat(this)):new pu(...t.concat(this))}};function fk(e){return jn(e)?N5(e,()=>{}):e}function Rd(e,t,r){return e.has(t)?e.get(t):e.set(t,r(t)).get(t)}function b$(e){return typeof e=="boolean"}var w$=()=>function(t){const{thunk:r=!0,immutableCheck:n=!0,serializableCheck:a=!0,actionCreatorCheck:o=!0}=t??{};let c=new A5;return r&&(b$(r)?c.push(v$):c.push(y$(r.extraArgument))),c},C5="RTK_autoBatch",st=()=>e=>({payload:e,meta:{[C5]:!0}}),hk=e=>t=>{setTimeout(t,e)},k$=(e,t)=>r=>{let n=!1;const a=()=>{n||(n=!0,cancelAnimationFrame(o),clearTimeout(c),r())},o=e(a),c=setTimeout(a,t)},P5=(e={type:"raf"})=>t=>(...r)=>{const n=t(...r);let a=!0,o=!1,c=!1;const u=new Set,f=e.type==="tick"?queueMicrotask:e.type==="raf"?typeof window<"u"&&window.requestAnimationFrame?k$(window.requestAnimationFrame,100):hk(10):e.type==="callback"?e.queueNotification:hk(e.timeout),h=()=>{c=!1,o&&(o=!1,u.forEach(m=>m()))};return Object.assign({},n,{subscribe(m){const g=()=>a&&m(),v=n.subscribe(g);return u.add(m),()=>{v(),u.delete(m)}},dispatch(m){var g;try{return a=!((g=m==null?void 0:m.meta)!=null&&g[C5]),o=!a,o&&(c||(c=!0,f(h))),n.dispatch(m)}finally{a=!0}}})},j$=e=>function(r){const{autoBatch:n=!0}=r??{};let a=new A5(e);return n&&a.push(P5(typeof n=="object"?n:void 0)),a};function S$(e){const t=w$(),{reducer:r=void 0,middleware:n,devTools:a=!0,preloadedState:o=void 0,enhancers:c=void 0}=e||{};let u;if(typeof r=="function")u=r;else if(zy(r))u=m5(r);else throw new Error(Ur(1));let f;typeof n=="function"?f=n(t):f=t();let h=yf;a&&(h=x$({trace:!1,...typeof a=="object"&&a}));const m=r$(...f),g=j$(m);let v=typeof c=="function"?c(g):g();const b=h(...v);return h5(u,o,b)}function O5(e){const t={},r=[];let n;const a={addCase(o,c){const u=typeof o=="string"?o:o.type;if(!u)throw new Error(Ur(28));if(u in t)throw new Error(Ur(29));return t[u]=c,a},addAsyncThunk(o,c){return c.pending&&(t[o.pending.type]=c.pending),c.rejected&&(t[o.rejected.type]=c.rejected),c.fulfilled&&(t[o.fulfilled.type]=c.fulfilled),c.settled&&r.push({matcher:o.settled,reducer:c.settled}),a},addMatcher(o,c){return r.push({matcher:o,reducer:c}),a},addDefaultCase(o){return n=o,a}};return e(a),[t,r,n]}function N$(e){return typeof e=="function"}function E$(e,t){let[r,n,a]=O5(t),o;if(N$(e))o=()=>fk(e());else{const u=fk(e);o=()=>u}function c(u=o(),f){let h=[r[f.type],...n.filter(({matcher:m})=>m(f)).map(({reducer:m})=>m)];return h.filter(m=>!!m).length===0&&(h=[a]),h.reduce((m,g)=>{if(g)if(wi(m)){const b=g(m,f);return b===void 0?m:b}else{if(jn(m))return N5(m,v=>g(v,f));{const v=g(m,f);if(v===void 0){if(m===null)return m;throw Error("A case reducer on a non-draftable value must not return undefined")}return v}}return m},u)}return c.getInitialState=o,c}var A$="ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW",C$=(e=21)=>{let t="",r=e;for(;r--;)t+=A$[Math.random()*64|0];return t},P$=Symbol.for("rtk-slice-createasyncthunk");function O$(e,t){return`${e}/${t}`}function _$({creators:e}={}){var r;const t=(r=e==null?void 0:e.asyncThunk)==null?void 0:r[P$];return function(a){const{name:o,reducerPath:c=o}=a;if(!o)throw new Error(Ur(11));const u=(typeof a.reducers=="function"?a.reducers(I$()):a.reducers)||{},f=Object.keys(u),h={sliceCaseReducersByName:{},sliceCaseReducersByType:{},actionCreators:{},sliceMatchers:[]},m={addCase(P,_){const O=typeof P=="string"?P:P.type;if(!O)throw new Error(Ur(12));if(O in h.sliceCaseReducersByType)throw new Error(Ur(13));return h.sliceCaseReducersByType[O]=_,m},addMatcher(P,_){return h.sliceMatchers.push({matcher:P,reducer:_}),m},exposeAction(P,_){return h.actionCreators[P]=_,m},exposeCaseReducer(P,_){return h.sliceCaseReducersByName[P]=_,m}};f.forEach(P=>{const _=u[P],O={reducerName:P,type:O$(o,P),createNotation:typeof a.reducers=="function"};D$(_)?L$(O,_,m,t):T$(O,_,m)});function g(){const[P={},_=[],O=void 0]=typeof a.extraReducers=="function"?O5(a.extraReducers):[a.extraReducers],D={...P,...h.sliceCaseReducersByType};return E$(a.initialState,U=>{for(let B in D)U.addCase(B,D[B]);for(let B of h.sliceMatchers)U.addMatcher(B.matcher,B.reducer);for(let B of _)U.addMatcher(B.matcher,B.reducer);O&&U.addDefaultCase(O)})}const v=P=>P,b=new Map,j=new WeakMap;let k;function S(P,_){return k||(k=g()),k(P,_)}function N(){return k||(k=g()),k.getInitialState()}function E(P,_=!1){function O(U){let B=U[P];return typeof B>"u"&&_&&(B=Rd(j,O,N)),B}function D(U=v){const B=Rd(b,_,()=>new WeakMap);return Rd(B,U,()=>{const F={};for(const[Y,H]of Object.entries(a.selectors??{}))F[Y]=M$(H,U,()=>Rd(j,U,N),_);return F})}return{reducerPath:P,getSelectors:D,get selectors(){return D(O)},selectSlice:O}}const A={name:o,reducer:S,actions:h.actionCreators,caseReducers:h.sliceCaseReducersByName,getInitialState:N,...E(c),injectInto(P,{reducerPath:_,...O}={}){const D=_??c;return P.inject({reducerPath:D,reducer:S},O),{...A,...E(D,!0)}}};return A}}function M$(e,t,r,n){function a(o,...c){let u=t(o);return typeof u>"u"&&n&&(u=r()),e(u,...c)}return a.unwrapped=e,a}var lr=_$();function I$(){function e(t,r){return{_reducerDefinitionType:"asyncThunk",payloadCreator:t,...r}}return e.withTypes=()=>e,{reducer(t){return Object.assign({[t.name](...r){return t(...r)}}[t.name],{_reducerDefinitionType:"reducer"})},preparedReducer(t,r){return{_reducerDefinitionType:"reducerWithPrepare",prepare:t,reducer:r}},asyncThunk:e}}function T$({type:e,reducerName:t,createNotation:r},n,a){let o,c;if("reducer"in n){if(r&&!R$(n))throw new Error(Ur(17));o=n.reducer,c=n.prepare}else o=n;a.addCase(e,o).exposeCaseReducer(t,o).exposeAction(t,c?Hr(e,c):Hr(e))}function D$(e){return e._reducerDefinitionType==="asyncThunk"}function R$(e){return e._reducerDefinitionType==="reducerWithPrepare"}function L$({type:e,reducerName:t},r,n,a){if(!a)throw new Error(Ur(18));const{payloadCreator:o,fulfilled:c,pending:u,rejected:f,settled:h,options:m}=r,g=a(e,o,m);n.exposeAction(t,g),c&&n.addCase(g.fulfilled,c),u&&n.addCase(g.pending,u),f&&n.addCase(g.rejected,f),h&&n.addMatcher(g.settled,h),n.exposeCaseReducer(t,{fulfilled:c||Ld,pending:u||Ld,rejected:f||Ld,settled:h||Ld})}function Ld(){}var $$="task",_5="listener",M5="completed",Hy="cancelled",z$=`task-${Hy}`,F$=`task-${M5}`,zv=`${_5}-${Hy}`,B$=`${_5}-${M5}`,Ph=class{constructor(e){Yl(this,"code");Yl(this,"name","TaskAbortError");Yl(this,"message");this.code=e,this.message=`${$$} ${Hy} (reason: ${e})`}},Wy=(e,t)=>{if(typeof e!="function")throw new TypeError(Ur(32))},Nf=()=>{},I5=(e,t=Nf)=>(e.catch(t),e),T5=(e,t)=>(e.addEventListener("abort",t,{once:!0}),()=>e.removeEventListener("abort",t)),po=e=>{if(e.aborted)throw new Ph(e.reason)};function D5(e,t){let r=Nf;return new Promise((n,a)=>{const o=()=>a(new Ph(e.reason));if(e.aborted){o();return}r=T5(e,o),t.finally(()=>r()).then(n,a)}).finally(()=>{r=Nf})}var U$=async(e,t)=>{try{return await Promise.resolve(),{status:"ok",value:await e()}}catch(r){return{status:r instanceof Ph?"cancelled":"rejected",error:r}}finally{t==null||t()}},Ef=e=>t=>I5(D5(e,t).then(r=>(po(e),r))),R5=e=>{const t=Ef(e);return r=>t(new Promise(n=>setTimeout(n,r)))},{assign:Ss}=Object,mk={},Oh="listenerMiddleware",H$=(e,t)=>{const r=n=>T5(e,()=>n.abort(e.reason));return(n,a)=>{Wy(n);const o=new AbortController;r(o);const c=U$(async()=>{po(e),po(o.signal);const u=await n({pause:Ef(o.signal),delay:R5(o.signal),signal:o.signal});return po(o.signal),u},()=>o.abort(F$));return a!=null&&a.autoJoin&&t.push(c.catch(Nf)),{result:Ef(e)(c),cancel(){o.abort(z$)}}}},W$=(e,t)=>{const r=async(n,a)=>{po(t);let o=()=>{};const u=[new Promise((f,h)=>{let m=e({predicate:n,effect:(g,v)=>{v.unsubscribe(),f([g,v.getState(),v.getOriginalState()])}});o=()=>{m(),h()}})];a!=null&&u.push(new Promise(f=>setTimeout(f,a,null)));try{const f=await D5(t,Promise.race(u));return po(t),f}finally{o()}};return((n,a)=>I5(r(n,a)))},L5=e=>{let{type:t,actionCreator:r,matcher:n,predicate:a,effect:o}=e;if(t)a=Hr(t).match;else if(r)t=r.type,a=r.match;else if(n)a=n;else if(!a)throw new Error(Ur(21));return Wy(o),{predicate:a,type:t,effect:o}},$5=Ss(e=>{const{type:t,predicate:r,effect:n}=L5(e);return{id:C$(),effect:n,type:t,predicate:r,pending:new Set,unsubscribe:()=>{throw new Error(Ur(22))}}},{withTypes:()=>$5}),pk=(e,t)=>{const{type:r,effect:n,predicate:a}=L5(t);return Array.from(e.values()).find(o=>(typeof r=="string"?o.type===r:o.predicate===a)&&o.effect===n)},Fv=e=>{e.pending.forEach(t=>{t.abort(zv)})},K$=(e,t)=>()=>{for(const r of t.keys())Fv(r);e.clear()},gk=(e,t,r)=>{try{e(t,r)}catch(n){setTimeout(()=>{throw n},0)}},z5=Ss(Hr(`${Oh}/add`),{withTypes:()=>z5}),G$=Hr(`${Oh}/removeAll`),F5=Ss(Hr(`${Oh}/remove`),{withTypes:()=>F5}),V$=(...e)=>{console.error(`${Oh}/error`,...e)},Zu=(e={})=>{const t=new Map,r=new Map,n=b=>{const j=r.get(b)??0;r.set(b,j+1)},a=b=>{const j=r.get(b)??1;j===1?r.delete(b):r.set(b,j-1)},{extra:o,onError:c=V$}=e;Wy(c);const u=b=>(b.unsubscribe=()=>t.delete(b.id),t.set(b.id,b),j=>{b.unsubscribe(),j!=null&&j.cancelActive&&Fv(b)}),f=(b=>{const j=pk(t,b)??$5(b);return u(j)});Ss(f,{withTypes:()=>f});const h=b=>{const j=pk(t,b);return j&&(j.unsubscribe(),b.cancelActive&&Fv(j)),!!j};Ss(h,{withTypes:()=>h});const m=async(b,j,k,S)=>{const N=new AbortController,E=W$(f,N.signal),A=[];try{b.pending.add(N),n(b),await Promise.resolve(b.effect(j,Ss({},k,{getOriginalState:S,condition:(P,_)=>E(P,_).then(Boolean),take:E,delay:R5(N.signal),pause:Ef(N.signal),extra:o,signal:N.signal,fork:H$(N.signal,A),unsubscribe:b.unsubscribe,subscribe:()=>{t.set(b.id,b)},cancelActiveListeners:()=>{b.pending.forEach((P,_,O)=>{P!==N&&(P.abort(zv),O.delete(P))})},cancel:()=>{N.abort(zv),b.pending.delete(N)},throwIfCancelled:()=>{po(N.signal)}})))}catch(P){P instanceof Ph||gk(c,P,{raisedBy:"effect"})}finally{await Promise.all(A),N.abort(B$),a(b),b.pending.delete(N)}},g=K$(t,r);return{middleware:b=>j=>k=>{if(!p5(k))return j(k);if(z5.match(k))return f(k.payload);if(G$.match(k)){g();return}if(F5.match(k))return h(k.payload);let S=b.getState();const N=()=>{if(S===mk)throw new Error(Ur(23));return S};let E;try{if(E=j(k),t.size>0){const A=b.getState(),P=Array.from(t.values());for(const _ of P){let O=!1;try{O=_.predicate(k,A,S)}catch(D){O=!1,gk(c,D,{raisedBy:"predicate"})}O&&m(_,k,b,N)}}}finally{S=mk}return E},startListening:f,stopListening:h,clearListeners:g}};function Ur(e){return`Minified Redux Toolkit error #${e}; visit https://redux-toolkit.js.org/Errors?code=${e} for the full message or use the non-minified dev environment for full errors. `}var q$={layoutType:"horizontal",width:0,height:0,margin:{top:5,right:5,bottom:5,left:5},scale:1},B5=lr({name:"chartLayout",initialState:q$,reducers:{setLayout(e,t){e.layoutType=t.payload},setChartSize(e,t){e.width=t.payload.width,e.height=t.payload.height},setMargin(e,t){var r,n,a,o;e.margin.top=(r=t.payload.top)!==null&&r!==void 0?r:0,e.margin.right=(n=t.payload.right)!==null&&n!==void 0?n:0,e.margin.bottom=(a=t.payload.bottom)!==null&&a!==void 0?a:0,e.margin.left=(o=t.payload.left)!==null&&o!==void 0?o:0},setScale(e,t){e.scale=t.payload}}}),_h=B5.actions,Q$=_h.setMargin,Y$=_h.setLayout,X$=_h.setChartSize,Z$=_h.setScale,J$=B5.reducer;function U5(e,t,r){return Array.isArray(e)&&e&&t+r!==0?e.slice(t,r+1):e}function We(e){return Number.isFinite(e)}function Vn(e){return typeof e=="number"&&e>0&&Number.isFinite(e)}function vk(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function xs(e){for(var t=1;t{if(t&&r){var n=r.width,a=r.height,o=t.align,c=t.verticalAlign,u=t.layout;if((u==="vertical"||u==="horizontal"&&c==="middle")&&o!=="center"&&Ee(e[o]))return xs(xs({},e),{},{[o]:e[o]+(n||0)});if((u==="horizontal"||u==="vertical"&&o==="center")&&c!=="middle"&&Ee(e[c]))return xs(xs({},e),{},{[c]:e[c]+(a||0)})}return e},Xn=(e,t)=>e==="horizontal"&&t==="xAxis"||e==="vertical"&&t==="yAxis"||e==="centric"&&t==="angleAxis"||e==="radial"&&t==="radiusAxis",H5=(e,t,r,n)=>{if(n)return e.map(u=>u.coordinate);var a,o,c=e.map(u=>(u.coordinate===t&&(a=!0),u.coordinate===r&&(o=!0),u.coordinate));return a||c.push(t),o||c.push(r),c},W5=(e,t,r)=>{if(!e)return null;var n=e.duplicateDomain,a=e.type,o=e.range,c=e.scale,u=e.realScaleType,f=e.isCategorical,h=e.categoricalDomain,m=e.tickCount,g=e.ticks,v=e.niceTicks,b=e.axisType;if(!c)return null;var j=u==="scaleBand"&&c.bandwidth?c.bandwidth()/2:2,k=a==="category"&&c.bandwidth?c.bandwidth()/j:0;if(k=b==="angleAxis"&&o&&o.length>=2?Jr(o[0]-o[1])*2*k:k,g||v){var S=(g||v||[]).map((N,E)=>{var A=n?n.indexOf(N):N,P=c.map(A);return We(P)?{coordinate:P+k,value:N,offset:k,index:E}:null}).filter(Ar);return S}return f&&h?h.map((N,E)=>{var A=c.map(N);return We(A)?{coordinate:A+k,value:N,index:E,offset:k}:null}).filter(Ar):c.ticks&&m!=null?c.ticks(m).map((N,E)=>{var A=c.map(N);return We(A)?{coordinate:A+k,value:N,index:E,offset:k}:null}).filter(Ar):c.domain().map((N,E)=>{var A=c.map(N);return We(A)?{coordinate:A+k,value:n?n[N]:N,index:E,offset:k}:null}).filter(Ar)},iz=e=>{var t,r=e.length;if(!(r<=0)){var n=(t=e[0])===null||t===void 0?void 0:t.length;if(!(n==null||n<=0))for(var a=0;a=0?(h[0]=o,o+=v,h[1]=o):(h[0]=c,c+=v,h[1]=c)}}}},az=e=>{var t,r=e.length;if(!(r<=0)){var n=(t=e[0])===null||t===void 0?void 0:t.length;if(!(n==null||n<=0))for(var a=0;a=0?(f[0]=o,o+=h,f[1]=o):(f[0]=0,f[1]=0)}}}},oz={sign:iz,expand:kR,none:xo,silhouette:jR,wiggle:SR,positive:az},sz=(e,t,r)=>{var n,a=(n=oz[r])!==null&&n!==void 0?n:xo,o=wR().keys(t).value((u,f)=>Number(Lt(u,f,0))).order(Ev).offset(a),c=o(e);return c.forEach((u,f)=>{u.forEach((h,m)=>{var g=Lt(e[m],t[f],0);Array.isArray(g)&&g.length===2&&Ee(g[0])&&Ee(g[1])&&(h[0]=g[0],h[1]=g[1])})}),c};function lz(e){return e==null?void 0:String(e)}function yk(e){var t=e.axis,r=e.ticks,n=e.bandSize,a=e.entry,o=e.index,c=e.dataKey;if(t.type==="category"){if(!t.allowDuplicatedCategory&&t.dataKey&&!Yt(a[t.dataKey])){var u=YE(r,"value",a[t.dataKey]);if(u)return u.coordinate+n/2}return r!=null&&r[o]?r[o].coordinate+n/2:null}var f=Lt(a,Yt(c)?t.dataKey:c),h=t.scale.map(f);return Ee(h)?h:null}var uz=e=>{var t=e.flat(2).filter(Ee);return[Math.min(...t),Math.max(...t)]},cz=e=>[e[0]===1/0?0:e[0],e[1]===-1/0?0:e[1]],dz=(e,t,r)=>{if(!(e==null||Object.keys(e).length===0))return cz(Object.keys(e).reduce((n,a)=>{var o=e[a];if(!o)return n;var c=o.stackedData,u=c.reduce((f,h)=>{var m=U5(h,t,r),g=uz(m);return!We(g[0])||!We(g[1])?f:[Math.min(f[0],g[0]),Math.max(f[1],g[1])]},[1/0,-1/0]);return[Math.min(u[0],n[0]),Math.max(u[1],n[1])]},[1/0,-1/0]))},xk=/^dataMin[\s]*-[\s]*([0-9]+([.]{1}[0-9]+){0,1})$/,bk=/^dataMax[\s]*\+[\s]*([0-9]+([.]{1}[0-9]+){0,1})$/,Af=(e,t,r)=>{if(e&&e.scale&&e.scale.bandwidth){var n=e.scale.bandwidth();if(!r||n>0)return n}if(e&&t&&t.length>=2){for(var a=wh(t,m=>m.coordinate),o=1/0,c=1,u=a.length;c{if(t==="horizontal")return e.relativeX;if(t==="vertical")return e.relativeY},hz=(e,t)=>t==="centric"?e.angle:e.radius,Ei=e=>e.layout.width,Ai=e=>e.layout.height,mz=e=>e.layout.scale,G5=e=>e.layout.margin,Mh=q(e=>e.cartesianAxis.xAxis,e=>Object.values(e)),Ih=q(e=>e.cartesianAxis.yAxis,e=>Object.values(e)),pz="data-recharts-item-index",gz="data-recharts-item-id",Ju=60;function kk(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function $d(e){for(var t=1;te.brush.height;function wz(e){var t=Ih(e);return t.reduce((r,n)=>{if(n.orientation==="left"&&!n.mirror&&!n.hide){var a=typeof n.width=="number"?n.width:Ju;return r+a}return r},0)}function kz(e){var t=Ih(e);return t.reduce((r,n)=>{if(n.orientation==="right"&&!n.mirror&&!n.hide){var a=typeof n.width=="number"?n.width:Ju;return r+a}return r},0)}function jz(e){var t=Mh(e);return t.reduce((r,n)=>n.orientation==="top"&&!n.mirror&&!n.hide?r+n.height:r,0)}function Sz(e){var t=Mh(e);return t.reduce((r,n)=>n.orientation==="bottom"&&!n.mirror&&!n.hide?r+n.height:r,0)}var Zt=q([Ei,Ai,G5,bz,wz,kz,jz,Sz,f5,KL],(e,t,r,n,a,o,c,u,f,h)=>{var m={left:(r.left||0)+a,right:(r.right||0)+o},g={top:(r.top||0)+c,bottom:(r.bottom||0)+u},v=$d($d({},g),m),b=v.bottom;v.bottom+=n,v=nz(v,f,h);var j=e-v.left-v.right,k=t-v.top-v.bottom;return $d($d({brushBottom:b},v),{},{width:Math.max(j,0),height:Math.max(k,0)})}),Nz=q(Zt,e=>({x:e.left,y:e.top,width:e.width,height:e.height})),V5=q(Ei,Ai,(e,t)=>({x:0,y:0,width:e,height:t})),Ez=y.createContext(null),Pr=()=>y.useContext(Ez)!=null,Th=e=>e.brush,Dh=q([Th,Zt,G5],(e,t,r)=>({height:e.height,x:Ee(e.x)?e.x:t.left,y:Ee(e.y)?e.y:t.top+t.height+t.brushBottom-((r==null?void 0:r.bottom)||0),width:Ee(e.width)?e.width:t.width}));function Az(e,t,{signal:r,edges:n}={}){let a,o=null;const c=n!=null&&n.includes("leading"),u=n==null||n.includes("trailing"),f=()=>{o!==null&&(e.apply(a,o),a=void 0,o=null)},h=()=>{u&&f(),b()};let m=null;const g=()=>{m!=null&&clearTimeout(m),m=setTimeout(()=>{m=null,h()},t)},v=()=>{m!==null&&(clearTimeout(m),m=null)},b=()=>{v(),a=void 0,o=null},j=()=>{f()},k=function(...S){if(r!=null&&r.aborted)return;a=this,o=S;const N=m==null;g(),c&&N&&f()};return k.schedule=g,k.cancel=b,k.flush=j,r==null||r.addEventListener("abort",b,{once:!0}),k}function Cz(e,t=0,r={}){typeof r!="object"&&(r={});const{leading:n=!1,trailing:a=!0,maxWait:o}=r,c=Array(2);n&&(c[0]="leading"),a&&(c[1]="trailing");let u,f=null;const h=Az(function(...v){u=e.apply(this,v),f=null},t,{edges:c}),m=function(...v){return o!=null&&(f===null&&(f=Date.now()),Date.now()-f>=o)?(u=e.apply(this,v),f=Date.now(),h.cancel(),h.schedule(),u):(h.apply(this,v),u)},g=()=>(h.flush(),u);return m.cancel=h.cancel,m.flush=g,m}function Pz(e,t=0,r={}){const{leading:n=!0,trailing:a=!0}=r;return Cz(e,t,{leading:n,maxWait:t,trailing:a})}var Cf=function(t,r){for(var n=arguments.length,a=new Array(n>2?n-2:0),o=2;oa[c++]))}},zn={width:"100%",height:"100%",debounce:0,minWidth:0,initialDimension:{width:-1,height:-1}},q5=(e,t,r)=>{var n=r.width,a=n===void 0?zn.width:n,o=r.height,c=o===void 0?zn.height:o,u=r.aspect,f=r.maxHeight,h=bo(a)?e:Number(a),m=bo(c)?t:Number(c);return u&&u>0&&(h?m=h/u:m&&(h=m*u),f&&m!=null&&m>f&&(m=f)),{calculatedWidth:h,calculatedHeight:m}},Oz={width:0,height:0,overflow:"visible"},_z={width:0,overflowX:"visible"},Mz={height:0,overflowY:"visible"},Iz={},Tz=e=>{var t=e.width,r=e.height,n=bo(t),a=bo(r);return n&&a?Oz:n?_z:a?Mz:Iz};function Dz(e){var t=e.width,r=e.height,n=e.aspect,a=t,o=r;return a===void 0&&o===void 0?(a=zn.width,o=zn.height):a===void 0?a=n&&n>0?void 0:zn.width:o===void 0&&(o=n&&n>0?void 0:zn.height),{width:a,height:o}}var Rz=["aspect","initialDimension","width","height","minWidth","minHeight","maxHeight","children","debounce","id","className","onResize","style"];function Pf(){return Pf=Object.assign?Object.assign.bind():function(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);r({width:r,height:n}),[r,n]);return Vz(a)?y.createElement(Q5.Provider,{value:a},t):null}var Ky=()=>y.useContext(Q5),qz=y.forwardRef((e,t)=>{var r=e.aspect,n=e.initialDimension,a=n===void 0?zn.initialDimension:n,o=e.width,c=e.height,u=e.minWidth,f=u===void 0?zn.minWidth:u,h=e.minHeight,m=e.maxHeight,g=e.children,v=e.debounce,b=v===void 0?zn.debounce:v,j=e.id,k=e.className,S=e.onResize,N=e.style,E=N===void 0?{}:N,A=Kz(e,Rz),P=y.useRef(null),_=y.useRef();_.current=S,y.useImperativeHandle(t,()=>P.current);var O=y.useState({containerWidth:a.width,containerHeight:a.height}),D=Fz(O,2),U=D[0],B=D[1],F=y.useCallback((ae,se)=>{B(X=>{var te=Math.round(ae),J=Math.round(se);return X.containerWidth===te&&X.containerHeight===J?X:{containerWidth:te,containerHeight:J}})},[]);y.useEffect(()=>{if(P.current==null||typeof ResizeObserver>"u")return rl;var ae=I=>{var M,K=I[0];if(K!=null){var ne=K.contentRect,Z=ne.width,me=ne.height;F(Z,me),(M=_.current)===null||M===void 0||M.call(_,Z,me)}};b>0&&(ae=Pz(ae,b,{trailing:!0,leading:!1}));var se=new ResizeObserver(ae),X=P.current.getBoundingClientRect(),te=X.width,J=X.height;return F(te,J),se.observe(P.current),()=>{se.disconnect()}},[F,b]);var Y=U.containerWidth,H=U.containerHeight;Cf(!r||r>0,"The aspect(%s) must be greater than zero.",r);var pe=q5(Y,H,{width:o,height:c,aspect:r,maxHeight:m}),ue=pe.calculatedWidth,he=pe.calculatedHeight;return Cf(Y<0||H<0||ue!=null&&ue>0||he!=null&&he>0,`The width(%s) and height(%s) of chart should be greater than 0, + please check the style of container, or the props width(%s) and height(%s), + or add a minWidth(%s) or minHeight(%s) or use aspect(%s) to control the + height and width.`,ue,he,o,c,f,h,r),y.createElement("div",Pf({id:j?"".concat(j):void 0,className:nt("recharts-responsive-container",k),style:Sk(Sk({},E),{},{width:o,height:c,minWidth:f,minHeight:h,maxHeight:m}),ref:P},A),y.createElement("div",{style:Tz({width:o,height:c})},y.createElement(Y5,{width:ue,height:he},g)))}),Qz=y.forwardRef((e,t)=>{var r=Ky();if(Vn(r.width)&&Vn(r.height))return e.children;var n=Dz({width:e.width,height:e.height,aspect:e.aspect}),a=n.width,o=n.height,c=q5(void 0,void 0,{width:a,height:o,aspect:e.aspect,maxHeight:e.maxHeight}),u=c.calculatedWidth,f=c.calculatedHeight;return Ee(u)&&Ee(f)?y.createElement(Y5,{width:u,height:f},e.children):y.createElement(qz,Pf({},e,{width:a,height:o,ref:t}))});function Gy(e){if(e)return{x:e.x,y:e.y,upperWidth:"upperWidth"in e?e.upperWidth:e.width,lowerWidth:"lowerWidth"in e?e.lowerWidth:e.width,width:e.width,height:e.height}}var Rh=()=>{var e,t=Pr(),r=Me(Nz),n=Me(Dh),a=(e=Me(Th))===null||e===void 0?void 0:e.padding;return!t||!n||!a?r:{width:n.width-a.left-a.right,height:n.height-a.top-a.bottom,x:a.left,y:a.top}},Yz={top:0,bottom:0,left:0,right:0,width:0,height:0,brushBottom:0},X5=()=>{var e;return(e=Me(Zt))!==null&&e!==void 0?e:Yz},Z5=()=>Me(Ei),J5=()=>Me(Ai),ft=e=>e.layout.layoutType,nl=()=>Me(ft),Vy=()=>{var e=nl();if(e==="horizontal"||e==="vertical")return e},eA=e=>{var t=e.layout.layoutType;if(t==="centric"||t==="radial")return t},Xz=()=>{var e=nl();return e!==void 0},ec=e=>{var t=Nt(),r=Pr(),n=e.width,a=e.height,o=Ky(),c=n,u=a;return o&&(c=o.width>0?o.width:n,u=o.height>0?o.height:a),y.useEffect(()=>{!r&&Vn(c)&&Vn(u)&&t(X$({width:c,height:u}))},[t,r,c,u]),null},tA=Symbol.for("immer-nothing"),Ek=Symbol.for("immer-draftable"),Wr=Symbol.for("immer-state");function xn(e,...t){throw new Error(`[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`)}var _u=Object.getPrototypeOf;function Vs(e){return!!e&&!!e[Wr]}function ko(e){var t;return e?rA(e)||Array.isArray(e)||!!e[Ek]||!!((t=e.constructor)!=null&&t[Ek])||tc(e)||$h(e):!1}var Zz=Object.prototype.constructor.toString(),Ak=new WeakMap;function rA(e){if(!e||typeof e!="object")return!1;const t=Object.getPrototypeOf(e);if(t===null||t===Object.prototype)return!0;const r=Object.hasOwnProperty.call(t,"constructor")&&t.constructor;if(r===Object)return!0;if(typeof r!="function")return!1;let n=Ak.get(r);return n===void 0&&(n=Function.toString.call(r),Ak.set(r,n)),n===Zz}function Of(e,t,r=!0){Lh(e)===0?(r?Reflect.ownKeys(e):Object.keys(e)).forEach(a=>{t(a,e[a],e)}):e.forEach((n,a)=>t(a,n,e))}function Lh(e){const t=e[Wr];return t?t.type_:Array.isArray(e)?1:tc(e)?2:$h(e)?3:0}function Bv(e,t){return Lh(e)===2?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function nA(e,t,r){const n=Lh(e);n===2?e.set(t,r):n===3?e.add(r):e[t]=r}function Jz(e,t){return e===t?e!==0||1/e===1/t:e!==e&&t!==t}function tc(e){return e instanceof Map}function $h(e){return e instanceof Set}function Qa(e){return e.copy_||e.base_}function Uv(e,t){if(tc(e))return new Map(e);if($h(e))return new Set(e);if(Array.isArray(e))return Array.prototype.slice.call(e);const r=rA(e);if(t===!0||t==="class_only"&&!r){const n=Object.getOwnPropertyDescriptors(e);delete n[Wr];let a=Reflect.ownKeys(n);for(let o=0;o1&&Object.defineProperties(e,{set:zd,add:zd,clear:zd,delete:zd}),Object.freeze(e),t&&Object.values(e).forEach(r=>qy(r,!0))),e}function e6(){xn(2)}var zd={value:e6};function zh(e){return e===null||typeof e!="object"?!0:Object.isFrozen(e)}var t6={};function jo(e){const t=t6[e];return t||xn(0,e),t}var Mu;function iA(){return Mu}function r6(e,t){return{drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0}}function Ck(e,t){t&&(jo("Patches"),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function Hv(e){Wv(e),e.drafts_.forEach(n6),e.drafts_=null}function Wv(e){e===Mu&&(Mu=e.parent_)}function Pk(e){return Mu=r6(Mu,e)}function n6(e){const t=e[Wr];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0}function Ok(e,t){t.unfinalizedDrafts_=t.drafts_.length;const r=t.drafts_[0];return e!==void 0&&e!==r?(r[Wr].modified_&&(Hv(t),xn(4)),ko(e)&&(e=_f(t,e),t.parent_||Mf(t,e)),t.patches_&&jo("Patches").generateReplacementPatches_(r[Wr].base_,e,t.patches_,t.inversePatches_)):e=_f(t,r,[]),Hv(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e!==tA?e:void 0}function _f(e,t,r){if(zh(t))return t;const n=e.immer_.shouldUseStrictIteration(),a=t[Wr];if(!a)return Of(t,(o,c)=>_k(e,a,t,o,c,r),n),t;if(a.scope_!==e)return t;if(!a.modified_)return Mf(e,a.base_,!0),a.base_;if(!a.finalized_){a.finalized_=!0,a.scope_.unfinalizedDrafts_--;const o=a.copy_;let c=o,u=!1;a.type_===3&&(c=new Set(o),o.clear(),u=!0),Of(c,(f,h)=>_k(e,a,o,f,h,r,u),n),Mf(e,o,!1),r&&e.patches_&&jo("Patches").generatePatches_(a,r,e.patches_,e.inversePatches_)}return a.copy_}function _k(e,t,r,n,a,o,c){if(a==null||typeof a!="object"&&!c)return;const u=zh(a);if(!(u&&!c)){if(Vs(a)){const f=o&&t&&t.type_!==3&&!Bv(t.assigned_,n)?o.concat(n):void 0,h=_f(e,a,f);if(nA(r,n,h),Vs(h))e.canAutoFreeze_=!1;else return}else c&&r.add(a);if(ko(a)&&!u){if(!e.immer_.autoFreeze_&&e.unfinalizedDrafts_<1||t&&t.base_&&t.base_[n]===a&&u)return;_f(e,a),(!t||!t.scope_.parent_)&&typeof n!="symbol"&&(tc(r)?r.has(n):Object.prototype.propertyIsEnumerable.call(r,n))&&Mf(e,a)}}}function Mf(e,t,r=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&qy(t,r)}function i6(e,t){const r=Array.isArray(e),n={type_:r?1:0,scope_:t?t.scope_:iA(),modified_:!1,finalized_:!1,assigned_:{},parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1};let a=n,o=Qy;r&&(a=[n],o=Iu);const{revoke:c,proxy:u}=Proxy.revocable(a,o);return n.draft_=u,n.revoke_=c,u}var Qy={get(e,t){if(t===Wr)return e;const r=Qa(e);if(!Bv(r,t))return a6(e,r,t);const n=r[t];return e.finalized_||!ko(n)?n:n===yg(e.base_,t)?(xg(e),e.copy_[t]=Gv(n,e)):n},has(e,t){return t in Qa(e)},ownKeys(e){return Reflect.ownKeys(Qa(e))},set(e,t,r){const n=aA(Qa(e),t);if(n!=null&&n.set)return n.set.call(e.draft_,r),!0;if(!e.modified_){const a=yg(Qa(e),t),o=a==null?void 0:a[Wr];if(o&&o.base_===r)return e.copy_[t]=r,e.assigned_[t]=!1,!0;if(Jz(r,a)&&(r!==void 0||Bv(e.base_,t)))return!0;xg(e),Kv(e)}return e.copy_[t]===r&&(r!==void 0||t in e.copy_)||Number.isNaN(r)&&Number.isNaN(e.copy_[t])||(e.copy_[t]=r,e.assigned_[t]=!0),!0},deleteProperty(e,t){return yg(e.base_,t)!==void 0||t in e.base_?(e.assigned_[t]=!1,xg(e),Kv(e)):delete e.assigned_[t],e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){const r=Qa(e),n=Reflect.getOwnPropertyDescriptor(r,t);return n&&{writable:!0,configurable:e.type_!==1||t!=="length",enumerable:n.enumerable,value:r[t]}},defineProperty(){xn(11)},getPrototypeOf(e){return _u(e.base_)},setPrototypeOf(){xn(12)}},Iu={};Of(Qy,(e,t)=>{Iu[e]=function(){return arguments[0]=arguments[0][0],t.apply(this,arguments)}});Iu.deleteProperty=function(e,t){return Iu.set.call(this,e,t,void 0)};Iu.set=function(e,t,r){return Qy.set.call(this,e[0],t,r,e[0])};function yg(e,t){const r=e[Wr];return(r?Qa(r):e)[t]}function a6(e,t,r){var a;const n=aA(t,r);return n?"value"in n?n.value:(a=n.get)==null?void 0:a.call(e.draft_):void 0}function aA(e,t){if(!(t in e))return;let r=_u(e);for(;r;){const n=Object.getOwnPropertyDescriptor(r,t);if(n)return n;r=_u(r)}}function Kv(e){e.modified_||(e.modified_=!0,e.parent_&&Kv(e.parent_))}function xg(e){e.copy_||(e.copy_=Uv(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var o6=class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!0,this.produce=(t,r,n)=>{if(typeof t=="function"&&typeof r!="function"){const o=r;r=t;const c=this;return function(f=o,...h){return c.produce(f,m=>r.call(this,m,...h))}}typeof r!="function"&&xn(6),n!==void 0&&typeof n!="function"&&xn(7);let a;if(ko(t)){const o=Pk(this),c=Gv(t,void 0);let u=!0;try{a=r(c),u=!1}finally{u?Hv(o):Wv(o)}return Ck(o,n),Ok(a,o)}else if(!t||typeof t!="object"){if(a=r(t),a===void 0&&(a=t),a===tA&&(a=void 0),this.autoFreeze_&&qy(a,!0),n){const o=[],c=[];jo("Patches").generateReplacementPatches_(t,a,o,c),n(o,c)}return a}else xn(1,t)},this.produceWithPatches=(t,r)=>{if(typeof t=="function")return(c,...u)=>this.produceWithPatches(c,f=>t(f,...u));let n,a;return[this.produce(t,r,(c,u)=>{n=c,a=u}),n,a]},typeof(e==null?void 0:e.autoFreeze)=="boolean"&&this.setAutoFreeze(e.autoFreeze),typeof(e==null?void 0:e.useStrictShallowCopy)=="boolean"&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),typeof(e==null?void 0:e.useStrictIteration)=="boolean"&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){ko(e)||xn(8),Vs(e)&&(e=s6(e));const t=Pk(this),r=Gv(e,void 0);return r[Wr].isManual_=!0,Wv(t),r}finishDraft(e,t){const r=e&&e[Wr];(!r||!r.isManual_)&&xn(9);const{scope_:n}=r;return Ck(n,t),Ok(void 0,n)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}setUseStrictIteration(e){this.useStrictIteration_=e}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(e,t){let r;for(r=t.length-1;r>=0;r--){const a=t[r];if(a.path.length===0&&a.op==="replace"){e=a.value;break}}r>-1&&(t=t.slice(r+1));const n=jo("Patches").applyPatches_;return Vs(e)?n(e,t):this.produce(e,a=>n(a,t))}};function Gv(e,t){const r=tc(e)?jo("MapSet").proxyMap_(e,t):$h(e)?jo("MapSet").proxySet_(e,t):i6(e,t);return(t?t.scope_:iA()).drafts_.push(r),r}function s6(e){return Vs(e)||xn(10,e),oA(e)}function oA(e){if(!ko(e)||zh(e))return e;const t=e[Wr];let r,n=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,r=Uv(e,t.scope_.immer_.useStrictShallowCopy_),n=t.scope_.immer_.shouldUseStrictIteration()}else r=Uv(e,!0);return Of(r,(a,o)=>{nA(r,a,oA(o))},n),t&&(t.finalized_=!1),r}var l6=new o6;l6.produce;var u6={settings:{layout:"horizontal",align:"center",verticalAlign:"bottom",itemSorter:"value"},size:{width:0,height:0},payload:[]},sA=lr({name:"legend",initialState:u6,reducers:{setLegendSize(e,t){e.size.width=t.payload.width,e.size.height=t.payload.height},setLegendSettings(e,t){e.settings.align=t.payload.align,e.settings.layout=t.payload.layout,e.settings.verticalAlign=t.payload.verticalAlign,e.settings.itemSorter=t.payload.itemSorter},addLegendPayload:{reducer(e,t){e.payload.push(t.payload)},prepare:st()},replaceLegendPayload:{reducer(e,t){var r=t.payload,n=r.prev,a=r.next,o=en(e).payload.indexOf(n);o>-1&&(e.payload[o]=a)},prepare:st()},removeLegendPayload:{reducer(e,t){var r=en(e).payload.indexOf(t.payload);r>-1&&e.payload.splice(r,1)},prepare:st()}}}),rc=sA.actions;rc.setLegendSize;rc.setLegendSettings;var c6=rc.addLegendPayload,d6=rc.replaceLegendPayload,f6=rc.removeLegendPayload,h6=sA.reducer,bg={exports:{}},wg={};/** + * @license React + * use-sync-external-store-with-selector.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Mk;function m6(){if(Mk)return wg;Mk=1;var e=el();function t(f,h){return f===h&&(f!==0||1/f===1/h)||f!==f&&h!==h}var r=typeof Object.is=="function"?Object.is:t,n=e.useSyncExternalStore,a=e.useRef,o=e.useEffect,c=e.useMemo,u=e.useDebugValue;return wg.useSyncExternalStoreWithSelector=function(f,h,m,g,v){var b=a(null);if(b.current===null){var j={hasValue:!1,value:null};b.current=j}else j=b.current;b=c(function(){function S(_){if(!N){if(N=!0,E=_,_=g(_),v!==void 0&&j.hasValue){var O=j.value;if(v(O,_))return A=O}return A=_}if(O=A,r(E,_))return O;var D=g(_);return v!==void 0&&v(O,D)?(E=_,O):(E=_,A=D)}var N=!1,E,A,P=m===void 0?null:m;return[function(){return S(h())},P===null?void 0:function(){return S(P())}]},[h,m,g,v]);var k=n(f,b[0],b[1]);return o(function(){j.hasValue=!0,j.value=k},[k]),u(k),k},wg}var Ik;function p6(){return Ik||(Ik=1,bg.exports=m6()),bg.exports}p6();function g6(e){e()}function v6(){let e=null,t=null;return{clear(){e=null,t=null},notify(){g6(()=>{let r=e;for(;r;)r.callback(),r=r.next})},get(){const r=[];let n=e;for(;n;)r.push(n),n=n.next;return r},subscribe(r){let n=!0;const a=t={callback:r,next:null,prev:t};return a.prev?a.prev.next=a:e=a,function(){!n||e===null||(n=!1,a.next?a.next.prev=a.prev:t=a.prev,a.prev?a.prev.next=a.next:e=a.next)}}}}var Tk={notify(){},get:()=>[]};function y6(e,t){let r,n=Tk,a=0,o=!1;function c(k){m();const S=n.subscribe(k);let N=!1;return()=>{N||(N=!0,S(),g())}}function u(){n.notify()}function f(){j.onStateChange&&j.onStateChange()}function h(){return o}function m(){a++,r||(r=e.subscribe(f),n=v6())}function g(){a--,r&&a===0&&(r(),r=void 0,n.clear(),n=Tk)}function v(){o||(o=!0,m())}function b(){o&&(o=!1,g())}const j={addNestedSub:c,notifyNestedSubs:u,handleChangeWrapper:f,isSubscribed:h,trySubscribe:v,tryUnsubscribe:b,getListeners:()=>n};return j}var x6=()=>typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",b6=x6(),w6=()=>typeof navigator<"u"&&navigator.product==="ReactNative",k6=w6(),j6=()=>b6||k6?y.useLayoutEffect:y.useEffect,S6=j6();function Dk(e,t){return e===t?e!==0||t!==0||1/e===1/t:e!==e&&t!==t}function N6(e,t){if(Dk(e,t))return!0;if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;const r=Object.keys(e),n=Object.keys(t);if(r.length!==n.length)return!1;for(let a=0;a{const f=y6(a);return{store:a,subscription:f,getServerState:n?()=>n:void 0}},[a,n]),c=y.useMemo(()=>a.getState(),[a]);S6(()=>{const{subscription:f}=o;return f.onStateChange=f.notifyNestedSubs,f.trySubscribe(),c!==a.getState()&&f.notifyNestedSubs(),()=>{f.tryUnsubscribe(),f.onStateChange=void 0}},[o,c]);const u=r||A6;return y.createElement(u.Provider,{value:o},t)}var P6=C6,O6=new Set(["axisLine","tickLine","activeBar","activeDot","activeLabel","activeShape","allowEscapeViewBox","background","cursor","dot","label","line","margin","padding","position","shape","style","tick","wrapperStyle","radius","throttledEvents"]);function _6(e,t){return e==null&&t==null?!0:typeof e=="number"&&typeof t=="number"?e===t||e!==e&&t!==t:e===t}function Fh(e,t){var r=new Set([...Object.keys(e),...Object.keys(t)]);for(var n of r)if(O6.has(n)){if(e[n]==null&&t[n]==null)continue;if(!N6(e[n],t[n]))return!1}else if(!_6(e[n],t[n]))return!1;return!0}function Vv(){return Vv=Object.assign?Object.assign.bind():function(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);r{var t=e.separator,r=t===void 0?ls.separator:t,n=e.contentStyle,a=e.itemStyle,o=e.labelStyle,c=o===void 0?ls.labelStyle:o,u=e.payload,f=e.formatter,h=e.itemSorter,m=e.wrapperClassName,g=e.labelClassName,v=e.label,b=e.labelFormatter,j=e.accessibilityLayer,k=j===void 0?ls.accessibilityLayer:j,S=()=>{if(u&&u.length){var U={padding:0,margin:0},B=B6(u,h),F=B.map((Y,H)=>{if(!Y||Y.type==="none")return null;var pe=Y.formatter||f||F6,ue=Y.value,he=Y.name,ae=ue,se=he;if(pe){var X=pe(ue,he,Y,H,u);if(Array.isArray(X)){var te=D6(X,2);ae=te[0],se=te[1]}else if(X!=null)ae=X;else return null}var J=tu(tu({},ls.itemStyle),{},{color:Y.color||ls.itemStyle.color},a);return y.createElement("li",{className:"recharts-tooltip-item",key:"tooltip-item-".concat(H),style:J},Gn(se)?y.createElement("span",{className:"recharts-tooltip-item-name"},se):null,Gn(se)?y.createElement("span",{className:"recharts-tooltip-item-separator"},r):null,y.createElement("span",{className:"recharts-tooltip-item-value"},ae),y.createElement("span",{className:"recharts-tooltip-item-unit"},Y.unit||""))});return y.createElement("ul",{className:"recharts-tooltip-item-list",style:U},F)}return null},N=tu(tu({},ls.contentStyle),n),E=tu({margin:0},c),A=!Yt(v),P=A?v:"",_=nt("recharts-default-tooltip",m),O=nt("recharts-tooltip-label",g);A&&b&&u!==void 0&&u!==null&&(P=b(v,u));var D=k?{role:"status","aria-live":"assertive"}:{};return y.createElement("div",Vv({className:_,style:N},D),y.createElement("p",{className:O,style:E},y.isValidElement(P)?P:"".concat(P)),S())},ru="recharts-tooltip-wrapper",H6={visibility:"hidden"};function W6(e){var t=e.coordinate,r=e.translateX,n=e.translateY;return nt(ru,{["".concat(ru,"-right")]:Ee(r)&&t&&Ee(t.x)&&r>=t.x,["".concat(ru,"-left")]:Ee(r)&&t&&Ee(t.x)&&r=t.y,["".concat(ru,"-top")]:Ee(n)&&t&&Ee(t.y)&&n0?a:0),g=r[n]+a;if(t[n])return c[n]?m:g;var v=f[n];if(v==null)return 0;if(c[n]){var b=m,j=v;return bS?Math.max(m,v):Math.max(g,v)}function K6(e){var t=e.translateX,r=e.translateY,n=e.useTranslate3d;return{transform:n?"translate3d(".concat(t,"px, ").concat(r,"px, 0)"):"translate(".concat(t,"px, ").concat(r,"px)")}}function G6(e){var t=e.allowEscapeViewBox,r=e.coordinate,n=e.offsetTop,a=e.offsetLeft,o=e.position,c=e.reverseDirection,u=e.tooltipBox,f=e.useTranslate3d,h=e.viewBox,m,g,v;return u.height>0&&u.width>0&&r?(g=$k({allowEscapeViewBox:t,coordinate:r,key:"x",offset:a,position:o,reverseDirection:c,tooltipDimension:u.width,viewBox:h,viewBoxDimension:h.width}),v=$k({allowEscapeViewBox:t,coordinate:r,key:"y",offset:n,position:o,reverseDirection:c,tooltipDimension:u.height,viewBox:h,viewBoxDimension:h.height}),m=K6({translateX:g,translateY:v,useTranslate3d:f})):m=H6,{cssProperties:m,cssClasses:W6({translateX:g,translateY:v,coordinate:r})}}var V6=()=>!(typeof window<"u"&&window.document&&window.document.createElement&&window.setTimeout),nc={isSsr:V6()};function q6(e,t){return Z6(e)||X6(e,t)||Y6(e,t)||Q6()}function Q6(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function Y6(e,t){if(e){if(typeof e=="string")return zk(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?zk(e,t):void 0}}function zk(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);rnc.isSsr||!window.matchMedia?!1:window.matchMedia("(prefers-reduced-motion: reduce)").matches),t=q6(e,2),r=t[0],n=t[1];return y.useEffect(()=>{if(window.matchMedia){var a=window.matchMedia("(prefers-reduced-motion: reduce)"),o=()=>{n(a.matches)};return a.addEventListener("change",o),()=>{a.removeEventListener("change",o)}}},[]),r}function Fk(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function us(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);r({dismissed:!1,dismissedAtCoordinate:{x:0,y:0}})),h=r8(f,2),m=h[0],g=h[1];y.useEffect(()=>{var N=E=>{if(E.key==="Escape"){var A,P,_,O;g({dismissed:!0,dismissedAtCoordinate:{x:(A=(P=e.coordinate)===null||P===void 0?void 0:P.x)!==null&&A!==void 0?A:0,y:(_=(O=e.coordinate)===null||O===void 0?void 0:O.y)!==null&&_!==void 0?_:0}})}};return document.addEventListener("keydown",N),()=>{document.removeEventListener("keydown",N)}},[(t=e.coordinate)===null||t===void 0?void 0:t.x,(r=e.coordinate)===null||r===void 0?void 0:r.y]),m.dismissed&&(((n=(a=e.coordinate)===null||a===void 0?void 0:a.x)!==null&&n!==void 0?n:0)!==m.dismissedAtCoordinate.x||((o=(c=e.coordinate)===null||c===void 0?void 0:c.y)!==null&&o!==void 0?o:0)!==m.dismissedAtCoordinate.y)&&g(us(us({},m),{},{dismissed:!1}));var v=G6({allowEscapeViewBox:e.allowEscapeViewBox,coordinate:e.coordinate,offsetLeft:typeof e.offset=="number"?e.offset:e.offset.x,offsetTop:typeof e.offset=="number"?e.offset:e.offset.y,position:e.position,reverseDirection:e.reverseDirection,tooltipBox:{height:e.lastBoundingBox.height,width:e.lastBoundingBox.width},useTranslate3d:e.useTranslate3d,viewBox:e.viewBox}),b=v.cssClasses,j=v.cssProperties,k=e.hasPortalFromProps?{}:us(us({transition:s8({prefersReducedMotion:u,isAnimationActive:e.isAnimationActive,active:e.active,animationDuration:e.animationDuration,animationEasing:e.animationEasing})},j),{},{pointerEvents:"none",position:"absolute",top:0,left:0}),S=us(us({},k),{},{visibility:!m.dismissed&&e.active&&e.hasPayload?"visible":"hidden"},e.wrapperStyle);return y.createElement("div",{xmlns:"http://www.w3.org/1999/xhtml",tabIndex:-1,className:b,style:S,ref:e.innerRef},e.children)}var u8=y.memo(l8),uA=()=>{var e;return(e=Me(t=>t.rootProps.accessibilityLayer))!==null&&e!==void 0?e:!0};function qv(){return qv=Object.assign?Object.assign.bind():function(e){for(var t=1;tWe(e.x)&&We(e.y),Kk=e=>e.base!=null&&If(e.base)&&If(e),nu=e=>e.x,iu=e=>e.y,h8=(e,t)=>{if(typeof e=="function")return e;var r="curve".concat(Dy(e));if((r==="curveMonotone"||r==="curveBump")&&t){var n=Wk["".concat(r).concat(t==="vertical"?"Y":"X")];if(n)return n}return Wk[r]||xh},Gk={connectNulls:!1,type:"linear"},m8=e=>{var t=e.type,r=t===void 0?Gk.type:t,n=e.points,a=n===void 0?[]:n,o=e.baseLine,c=e.layout,u=e.connectNulls,f=u===void 0?Gk.connectNulls:u,h=h8(r,c),m=f?a.filter(If):a;if(Array.isArray(o)){var g,v=a.map((N,E)=>Hk(Hk({},N),{},{base:o[E]}));c==="vertical"?g=Md().y(iu).x1(nu).x0(N=>N.base.x):g=Md().x(nu).y1(iu).y0(N=>N.base.y);var b=g.defined(Kk).curve(h),j=f?v.filter(Kk):v;return b(j)}var k;c==="vertical"&&Ee(o)?k=Md().y(iu).x1(nu).x0(o):Ee(o)?k=Md().x(nu).y1(iu).y0(o):k=$E().x(nu).y(iu);var S=k.defined(If).curve(h);return S(m)},rf=e=>{var t=e.className,r=e.points,n=e.path,a=e.pathRef,o=nl();if((!r||!r.length)&&!n)return null;var c={type:e.type,points:e.points,baseLine:e.baseLine,layout:e.layout||o,connectNulls:e.connectNulls},u=r&&r.length?m8(c):n;return y.createElement("path",qv({},kn(e),Ry(e),{className:nt("recharts-curve",t),d:u===null?void 0:u,ref:a}))},p8=["x","y","top","left","width","height","className"];function Qv(){return Qv=Object.assign?Object.assign.bind():function(e){for(var t=1;t"M".concat(e,",").concat(a,"v").concat(n,"M").concat(o,",").concat(t,"h").concat(r),j8=e=>{var t=e.x,r=t===void 0?0:t,n=e.y,a=n===void 0?0:n,o=e.top,c=o===void 0?0:o,u=e.left,f=u===void 0?0:u,h=e.width,m=h===void 0?0:h,g=e.height,v=g===void 0?0:g,b=e.className,j=b8(e,p8),k=g8({x:r,y:a,top:c,left:f,width:m,height:v},j);return!Ee(r)||!Ee(a)||!Ee(m)||!Ee(v)||!Ee(c)||!Ee(f)?null:y.createElement("path",Qv({},rn(k),{className:nt("recharts-cross",b),d:k8(r,a,m,v,c,f)}))};function S8(e,t,r,n){var a=n/2;return{stroke:"none",fill:"#ccc",x:e==="horizontal"?t.x-a:r.left+.5,y:e==="horizontal"?r.top+.5:t.y-a,width:e==="horizontal"?n:r.width-1,height:e==="horizontal"?r.height-1:n}}var Tf=1e-4,cA=(e,t)=>[0,3*e,3*t-6*e,3*e-3*t+1],dA=(e,t)=>e.map((r,n)=>r*t**n).reduce((r,n)=>r+n),qk=(e,t)=>r=>{var n=cA(e,t);return dA(n,r)},N8=(e,t)=>r=>{var n=cA(e,t),a=[...n.map((o,c)=>o*c).slice(1),0];return dA(a,r)},E8=e=>{var t,r=e.split("(");if(r.length!==2||r[0]!=="cubic-bezier")return null;var n=(t=r[1])===null||t===void 0||(t=t.split(")")[0])===null||t===void 0?void 0:t.split(",");if(n==null||n.length!==4)return null;var a=n.map(o=>parseFloat(o));return[a[0],a[1],a[2],a[3]]},A8=function(){for(var t=arguments.length,r=new Array(t),n=0;n{var a=qk(e,r),o=qk(t,n),c=N8(e,r),u=h=>h>1?1:h<0?0:h,f=h=>{for(var m=h>1?1:h,g=m,v=0;v<8;++v){var b=a(g)-m,j=c(g);if(Math.abs(b-m)0&&arguments[0]!==void 0?arguments[0]:{},r=t.stiff,n=r===void 0?100:r,a=t.damping,o=a===void 0?8:a,c=t.dt,u=c===void 0?16.67:c,f=1,h=[0],m=0,g=0,v=1e4,b=0;b{var E,A,P;if(N<=0)return 0;if(N>=1)return f;var _=N*S,O=Math.floor(_),D=_-O;return((E=h[O])!==null&&E!==void 0?E:0)+(((A=h[O+1])!==null&&A!==void 0?A:0)-((P=h[O])!==null&&P!==void 0?P:0))*D}},O8=e=>{if(typeof e=="string")switch(e){case"ease":case"ease-in-out":case"ease-out":case"ease-in":case"linear":return Qk(e);case"spring":return P8();default:if(e.split("(")[0]==="cubic-bezier")return Qk(e)}return typeof e=="function"?e:null},_8=(e,t,r)=>{var n,a=o=>{var c=t.tick(o);if(t.getState()==="active"){if(r(t.getInterpolated()),t.getProgress()===1){t.complete(),n=void 0;return}n=e.setTimeout(a,c);return}n=e.setTimeout(a,c)};return n=e.setTimeout(a,0),()=>{var o;return(o=n)===null||o===void 0?void 0:o()}},fA=y.createContext(_8);fA.Provider;function M8(e){var t=y.useContext(fA);return y.useMemo(()=>e??t,[e,t])}function I8(e,t,r){return(t=T8(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function T8(e){var t=D8(e,"string");return typeof t=="symbol"?t:t+""}function D8(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}var Yk="init",Xk="pending",Zk="active",R8="completed";function Sg(e){return Math.max(0,e)}class L8{getAnimationStartedTime(){return this.animationStartedTime}getBeginStartedTime(){return this.beginStartedTime}constructor(t){var r;I8(this,"state",Yk),this.animationId=t.animationId,this.onAnimationEnd=t.onAnimationEnd,this.animationDuration=Sg(t.animationDuration),this.animationBegin=Sg(t.animationBegin),this.progress=0,this.from=t.from,this.to=t.to,this.easing=t.easing,(r=t.onAnimationStart)===null||r===void 0||r.call(t)}getState(){return this.state}getEasing(){return this.easing}getAnimationDuration(){return this.animationDuration}tick(t){if(this.getState()===Yk)return this.state=Xk,this.beginStartedTime=t,this.animationBegin;if(this.getState()===Xk){if(this.beginStartedTime==null)throw new Error;var r=t-this.beginStartedTime;return r>=this.animationBegin?(this.state=Zk,this.animationStartedTime=t,this.nextAnimationUpdate(0)):Sg(this.animationBegin-r)}if(this.getState()===Zk){if(this.animationStartedTime==null)throw new Error;var n=t-this.animationStartedTime;return this.setProgress(n/this.animationDuration),this.nextAnimationUpdate(n)}return 0}setProgress(t){this.progress=Math.min(1,Math.max(0,t))}getProgress(){return this.progress}complete(){if(this.progress=1,this.state==="active"){var t;(t=this.onAnimationEnd)===null||t===void 0||t.call(this)}this.state=R8}getFrom(){return this.from}getTo(){return this.to}getAnimationId(){return this.animationId}getAnimationBegin(){return this.animationBegin}}class $8 extends L8{nextAnimationUpdate(){return 0}getInterpolated(){return this.easing(mi(this.getFrom(),this.getTo(),this.getProgress()))}}class z8{setTimeout(t){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,n=performance.now(),a=null,o=c=>{c-n>=r?t(c):a=requestAnimationFrame(o)};return a=requestAnimationFrame(o),()=>{a!=null&&cancelAnimationFrame(a)}}}function F8(e,t){return W8(e)||H8(e,t)||U8(e,t)||B8()}function B8(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function U8(e,t){if(e){if(typeof e=="string")return Jk(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Jk(e,t):void 0}}function Jk(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{},onAnimationStart:()=>{}},ej=0,Ng=1;function hA(e){var t=on(e,K8),r=t.animationId,n=t.isActive,a=t.canBegin,o=t.duration,c=t.easing,u=t.begin,f=t.onAnimationEnd,h=t.onAnimationStart,m=t.children,g=lA(),v=n==="auto"?!nc.isSsr&&!g:n,b=M8(t.animationController),j=y.useState(v?ej:Ng),k=F8(j,2),S=k[0],N=k[1];return y.useEffect(()=>{v||N(Ng)},[v]),y.useEffect(()=>{var E=O8(c);if(!v||!a||E==null)return rl;var A=new z8,P=new $8({animationId:r,easing:E,animationDuration:o,animationBegin:u,onAnimationStart:h,onAnimationEnd:f,from:ej,to:Ng});return b(A,P,N)},[b,r,v,a,o,c,u,h,f]),m(Number(S))}function mA(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"animation-",r=y.useRef(Au(t)),n=y.useRef(e);return n.current!==e&&(r.current=Au(t),n.current=e),r.current}var G8=e=>e.replace(/([A-Z])/g,t=>"-".concat(t.toLowerCase())),V8=(e,t,r)=>e.map(n=>"".concat(G8(n)," ").concat(t,"ms ").concat(r)).join(","),q8=["radius"],Q8=["radius"],tj,rj,nj,ij,aj,oj,sj,lj,uj,cj;function dj(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function fj(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);r{var o=va(r),c=va(n),u=Math.min(Math.abs(o)/2,Math.abs(c)/2),f=c>=0?1:-1,h=o>=0?1:-1,m=c>=0&&o>=0||c<0&&o<0?1:0,g;if(u>0&&Array.isArray(a)){for(var v=[0,0,0,0],b=0,j=4;bu?u:S}g=Gt(tj||(tj=Mn(["M",",",""])),e,t+f*v[0]),v[0]>0&&(g+=Gt(rj||(rj=Mn(["A ",",",",0,0,",",",",",""])),v[0],v[0],m,e+h*v[0],t)),g+=Gt(nj||(nj=Mn(["L ",",",""])),e+r-h*v[1],t),v[1]>0&&(g+=Gt(ij||(ij=Mn(["A ",",",",0,0,",`, + `,",",""])),v[1],v[1],m,e+r,t+f*v[1])),g+=Gt(aj||(aj=Mn(["L ",",",""])),e+r,t+n-f*v[2]),v[2]>0&&(g+=Gt(oj||(oj=Mn(["A ",",",",0,0,",`, + `,",",""])),v[2],v[2],m,e+r-h*v[2],t+n)),g+=Gt(sj||(sj=Mn(["L ",",",""])),e+h*v[3],t+n),v[3]>0&&(g+=Gt(lj||(lj=Mn(["A ",",",",0,0,",`, + `,",",""])),v[3],v[3],m,e,t+n-f*v[3])),g+="Z"}else if(u>0&&a===+a&&a>0){var N=Math.min(u,a);g=Gt(uj||(uj=Mn(["M ",",",` + A `,",",",0,0,",",",",",` + L `,",",` + A `,",",",0,0,",",",",",` + L `,",",` + A `,",",",0,0,",",",",",` + L `,",",` + A `,",",",0,0,",",",","," Z"])),e,t+f*N,N,N,m,e+h*N,t,e+r-h*N,t,N,N,m,e+r,t+f*N,e+r,t+n-f*N,N,N,m,e+r-h*N,t+n,e+h*N,t+n,N,N,m,e,t+n-f*N)}else g=Gt(cj||(cj=Mn(["M ",","," h "," v "," h "," Z"])),e,t,r,n,-r);return g},gj={x:0,y:0,width:0,height:0,radius:0,isAnimationActive:!1,isUpdateAnimationActive:!1,animationBegin:0,animationDuration:1500,animationEasing:"ease"},aF=e=>{var t=on(e,gj),r=y.useRef(null),n=y.useState(-1),a=eF(n,2),o=a[0],c=a[1];y.useEffect(()=>{if(r.current&&r.current.getTotalLength)try{var X=r.current.getTotalLength();X&&c(X)}catch{}},[]);var u=t.x,f=t.y,h=t.width,m=t.height,g=t.radius,v=t.className,b=t.animationEasing,j=t.animationDuration,k=t.animationBegin,S=t.isAnimationActive,N=t.isUpdateAnimationActive,E=y.useRef(h),A=y.useRef(m),P=y.useRef(u),_=y.useRef(f),O=y.useMemo(()=>({x:u,y:f,width:h,height:m,radius:g}),[u,f,h,m,g]),D=mA(O,"rectangle-");if(u!==+u||f!==+f||h!==+h||m!==+m||h===0||m===0)return null;var U=nt("recharts-rectangle",v);if(!N){var B=rn(t);B.radius;var F=hj(B,q8);return y.createElement("path",Df({},F,{x:va(u),y:va(f),width:va(h),height:va(m),radius:typeof g=="number"?g:void 0,className:U,d:pj(u,f,h,m,g)}))}var Y=E.current,H=A.current,pe=P.current,ue=_.current,he="0px ".concat(o===-1?1:o,"px"),ae="".concat(o,"px ").concat(o,"px"),se=V8(["strokeDasharray"],j,typeof b=="string"?b:gj.animationEasing);return y.createElement(hA,{animationId:D,key:D,canBegin:o>0,duration:j,easing:b,isActive:N,begin:k},X=>{var te=mi(Y,h,X),J=mi(H,m,X),I=mi(pe,u,X),M=mi(ue,f,X);r.current&&(E.current=te,A.current=J,P.current=I,_.current=M);var K;S?X>0?K={transition:se,strokeDasharray:ae}:K={strokeDasharray:he}:K={strokeDasharray:ae};var ne=rn(t);ne.radius;var Z=hj(ne,Q8);return y.createElement("path",Df({},Z,{radius:typeof g=="number"?g:void 0,className:U,d:pj(I,M,te,J,g),ref:r,style:fj(fj({},K),t.style)}))})};function vj(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function yj(e){for(var t=1;te*180/Math.PI,Qt=(e,t,r,n)=>({x:e+Math.cos(-Rf*n)*r,y:t+Math.sin(-Rf*n)*r}),cF=function(t,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{top:0,right:0,bottom:0,left:0};return Math.min(Math.abs(t-(n.left||0)-(n.right||0)),Math.abs(r-(n.top||0)-(n.bottom||0)))/2},dF=(e,t)=>{var r=e.x,n=e.y,a=t.x,o=t.y;return Math.sqrt((r-a)**2+(n-o)**2)},fF=(e,t)=>{var r=e.x,n=e.y,a=t.cx,o=t.cy,c=dF({x:r,y:n},{x:a,y:o});if(c<=0)return{radius:c,angle:0};var u=(r-a)/c,f=Math.acos(u);return n>o&&(f=2*Math.PI-f),{radius:c,angle:uF(f),angleInRadian:f}},hF=e=>{var t=e.startAngle,r=e.endAngle,n=Math.floor(t/360),a=Math.floor(r/360),o=Math.min(n,a);return{startAngle:t-o*360,endAngle:r-o*360}},mF=(e,t)=>{var r=t.startAngle,n=t.endAngle,a=Math.floor(r/360),o=Math.floor(n/360),c=Math.min(a,o);return e+c*360},pF=(e,t)=>{var r=e.relativeX,n=e.relativeY,a=fF({x:r,y:n},t),o=a.radius,c=a.angle,u=t.innerRadius,f=t.outerRadius;if(of||o===0)return null;var h=hF(t),m=h.startAngle,g=h.endAngle,v=c,b;if(m<=g){for(;v>g;)v-=360;for(;v=m&&v<=g}else{for(;v>m;)v-=360;for(;v=g&&v<=m}return b?yj(yj({},t),{},{radius:o,angle:mF(v,t)}):null};function pA(e){var t=e.cx,r=e.cy,n=e.radius,a=e.startAngle,o=e.endAngle,c=Qt(t,r,n,a),u=Qt(t,r,n,o);return{points:[c,u],cx:t,cy:r,radius:n,startAngle:a,endAngle:o}}var xj,bj,wj,kj,jj,Sj,Nj;function Yv(){return Yv=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var r=Jr(t-e),n=Math.min(Math.abs(t-e),359.999);return r*n},Fd=e=>{var t=e.cx,r=e.cy,n=e.radius,a=e.angle,o=e.sign,c=e.isExternal,u=e.cornerRadius,f=e.cornerIsExternal,h=u*(c?1:-1)+n,m=Math.asin(u/h)/Rf,g=f?a:a+o*m,v=Qt(t,r,h,g),b=Qt(t,r,n,g),j=f?a-o*m:a,k=Qt(t,r,h*Math.cos(m*Rf),j);return{center:v,circleTangency:b,lineTangency:k,theta:m}},gA=e=>{var t=e.cx,r=e.cy,n=e.innerRadius,a=e.outerRadius,o=e.startAngle,c=e.endAngle,u=gF(o,c),f=o+u,h=Qt(t,r,a,o),m=Qt(t,r,a,f),g=Gt(xj||(xj=eo(["M ",",",` + A `,",",`,0, + `,",",`, + `,",",` + `])),h.x,h.y,a,a,+(Math.abs(u)>180),+(o>f),m.x,m.y);if(n>0){var v=Qt(t,r,n,o),b=Qt(t,r,n,f);g+=Gt(bj||(bj=eo(["L ",",",` + A `,",",`,0, + `,",",`, + `,","," Z"])),b.x,b.y,n,n,+(Math.abs(u)>180),+(o<=f),v.x,v.y)}else g+=Gt(wj||(wj=eo(["L ",","," Z"])),t,r);return g},vF=e=>{var t=e.cx,r=e.cy,n=e.innerRadius,a=e.outerRadius,o=e.cornerRadius,c=e.forceCornerRadius,u=e.cornerIsExternal,f=e.startAngle,h=e.endAngle,m=Jr(h-f),g=Fd({cx:t,cy:r,radius:a,angle:f,sign:m,cornerRadius:o,cornerIsExternal:u}),v=g.circleTangency,b=g.lineTangency,j=g.theta,k=Fd({cx:t,cy:r,radius:a,angle:h,sign:-m,cornerRadius:o,cornerIsExternal:u}),S=k.circleTangency,N=k.lineTangency,E=k.theta,A=u?Math.abs(f-h):Math.abs(f-h)-j-E;if(A<0)return c?Gt(kj||(kj=eo(["M ",",",` + a`,",",",0,0,1,",`,0 + a`,",",",0,0,1,",`,0 + `])),b.x,b.y,o,o,o*2,o,o,-o*2):gA({cx:t,cy:r,innerRadius:n,outerRadius:a,startAngle:f,endAngle:h});var P=Gt(jj||(jj=eo(["M ",",",` + A`,",",",0,0,",",",",",` + A`,",",",0,",",",",",",",` + A`,",",",0,0,",",",",",` + `])),b.x,b.y,o,o,+(m<0),v.x,v.y,a,a,+(A>180),+(m<0),S.x,S.y,o,o,+(m<0),N.x,N.y);if(n>0){var _=Fd({cx:t,cy:r,radius:n,angle:f,sign:m,isExternal:!0,cornerRadius:o,cornerIsExternal:u}),O=_.circleTangency,D=_.lineTangency,U=_.theta,B=Fd({cx:t,cy:r,radius:n,angle:h,sign:-m,isExternal:!0,cornerRadius:o,cornerIsExternal:u}),F=B.circleTangency,Y=B.lineTangency,H=B.theta,pe=u?Math.abs(f-h):Math.abs(f-h)-U-H;if(pe<0&&o===0)return"".concat(P,"L").concat(t,",").concat(r,"Z");P+=Gt(Sj||(Sj=eo(["L",",",` + A`,",",",0,0,",",",",",` + A`,",",",0,",",",",",",",` + A`,",",",0,0,",",",",","Z"])),Y.x,Y.y,o,o,+(m<0),F.x,F.y,n,n,+(pe>180),+(m>0),O.x,O.y,o,o,+(m<0),D.x,D.y)}else P+=Gt(Nj||(Nj=eo(["L",",","Z"])),t,r);return P},yF={cx:0,cy:0,innerRadius:0,outerRadius:0,startAngle:0,endAngle:0,cornerRadius:0,forceCornerRadius:!1,cornerIsExternal:!1},xF=e=>{var t=on(e,yF),r=t.cx,n=t.cy,a=t.innerRadius,o=t.outerRadius,c=t.cornerRadius,u=t.forceCornerRadius,f=t.cornerIsExternal,h=t.startAngle,m=t.endAngle,g=t.className;if(o0&&Math.abs(h-m)<360?k=vF({cx:r,cy:n,innerRadius:a,outerRadius:o,cornerRadius:Math.min(j,b/2),forceCornerRadius:u,cornerIsExternal:f,startAngle:h,endAngle:m}):k=gA({cx:r,cy:n,innerRadius:a,outerRadius:o,startAngle:h,endAngle:m}),y.createElement("path",Yv({},rn(t),{className:v,d:k}))};function bF(e,t,r){if(e==="horizontal")return[{x:t.x,y:r.top},{x:t.x,y:r.top+r.height}];if(e==="vertical")return[{x:r.left,y:t.y},{x:r.left+r.width,y:t.y}];if(XE(t)){if(e==="centric"){var n=t.cx,a=t.cy,o=t.innerRadius,c=t.outerRadius,u=t.angle,f=Qt(n,a,o,u),h=Qt(n,a,c,u);return[{x:f.x,y:f.y},{x:h.x,y:h.y}]}return pA(t)}}function wF(e){return d5(e)?NaN:Number(e)}function Eg(e){return e?(e=wF(e),e===1/0||e===-1/0?(e<0?-1:1)*Number.MAX_VALUE:e===e?e:0):e===0?e:0}function vA(e,t,r){r&&typeof r!="number"&&Ov(e,t,r)&&(t=r=void 0),e=Eg(e),t===void 0?(t=e,e=0):t=Eg(t),r=r===void 0?ee.chartData,Yy=q([Nn],e=>{var t=e.chartData!=null?e.chartData.length-1:0;return{chartData:e.chartData,computedData:e.computedData,dataEndIndex:t,dataStartIndex:0}}),Bh=(e,t,r,n)=>n?Yy(e):Nn(e),kF=(e,t,r)=>r?Yy(e):Nn(e),jF=q([Bh],e=>{var t=e.chartData,r=e.dataStartIndex,n=e.dataEndIndex;return t!=null?t.slice(r,n+1):[]});q([Yy],e=>{var t=e.chartData,r=e.dataStartIndex,n=e.dataEndIndex;return t!=null?t.slice(r,n+1):[]});var SF=q([Nn],e=>{var t=e.chartData,r=e.dataStartIndex,n=e.dataEndIndex;return t!=null?t.slice(r,n+1):[]});function Xy(e,t){return CF(e)||AF(e,t)||EF(e,t)||NF()}function NF(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function EF(e,t){if(e){if(typeof e=="string")return Ej(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Ej(e,t):void 0}}function Ej(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);re.e^o.s<0?1:-1;for(n=o.d.length,a=e.d.length,t=0,r=ne.d[t]^o.s<0?1:-1;return n===a?0:n>a^o.s<0?1:-1};we.decimalPlaces=we.dp=function(){var e=this,t=e.d.length-1,r=(t-e.e)*lt;if(t=e.d[t],t)for(;t%10==0;t/=10)r--;return r<0?0:r};we.dividedBy=we.div=function(e){return yi(this,new this.constructor(e))};we.dividedToIntegerBy=we.idiv=function(e){var t=this,r=t.constructor;return tt(yi(t,new r(e),0,1),r.precision)};we.equals=we.eq=function(e){return!this.cmp(e)};we.exponent=function(){return St(this)};we.greaterThan=we.gt=function(e){return this.cmp(e)>0};we.greaterThanOrEqualTo=we.gte=function(e){return this.cmp(e)>=0};we.isInteger=we.isint=function(){return this.e>this.d.length-2};we.isNegative=we.isneg=function(){return this.s<0};we.isPositive=we.ispos=function(){return this.s>0};we.isZero=function(){return this.s===0};we.lessThan=we.lt=function(e){return this.cmp(e)<0};we.lessThanOrEqualTo=we.lte=function(e){return this.cmp(e)<1};we.logarithm=we.log=function(e){var t,r=this,n=r.constructor,a=n.precision,o=a+5;if(e===void 0)e=new n(10);else if(e=new n(e),e.s<1||e.eq(Fr))throw Error(an+"NaN");if(r.s<1)throw Error(an+(r.s?"NaN":"-Infinity"));return r.eq(Fr)?new n(0):(dt=!1,t=yi(Tu(r,o),Tu(e,o),o),dt=!0,tt(t,a))};we.minus=we.sub=function(e){var t=this;return e=new t.constructor(e),t.s==e.s?kA(t,e):bA(t,(e.s=-e.s,e))};we.modulo=we.mod=function(e){var t,r=this,n=r.constructor,a=n.precision;if(e=new n(e),!e.s)throw Error(an+"NaN");return r.s?(dt=!1,t=yi(r,e,0,1).times(e),dt=!0,r.minus(t)):tt(new n(r),a)};we.naturalExponential=we.exp=function(){return wA(this)};we.naturalLogarithm=we.ln=function(){return Tu(this)};we.negated=we.neg=function(){var e=new this.constructor(this);return e.s=-e.s||0,e};we.plus=we.add=function(e){var t=this;return e=new t.constructor(e),t.s==e.s?bA(t,e):kA(t,(e.s=-e.s,e))};we.precision=we.sd=function(e){var t,r,n,a=this;if(e!==void 0&&e!==!!e&&e!==1&&e!==0)throw Error(go+e);if(t=St(a)+1,n=a.d.length-1,r=n*lt+1,n=a.d[n],n){for(;n%10==0;n/=10)r--;for(n=a.d[0];n>=10;n/=10)r++}return e&&t>r?t:r};we.squareRoot=we.sqrt=function(){var e,t,r,n,a,o,c,u=this,f=u.constructor;if(u.s<1){if(!u.s)return new f(0);throw Error(an+"NaN")}for(e=St(u),dt=!1,a=Math.sqrt(+u),a==0||a==1/0?(t=Fn(u.d),(t.length+e)%2==0&&(t+="0"),a=Math.sqrt(t),e=al((e+1)/2)-(e<0||e%2),a==1/0?t="5e"+e:(t=a.toExponential(),t=t.slice(0,t.indexOf("e")+1)+e),n=new f(t)):n=new f(a.toString()),r=f.precision,a=c=r+3;;)if(o=n,n=o.plus(yi(u,o,c+2)).times(.5),Fn(o.d).slice(0,c)===(t=Fn(n.d)).slice(0,c)){if(t=t.slice(c-3,c+1),a==c&&t=="4999"){if(tt(o,r+1,0),o.times(o).eq(u)){n=o;break}}else if(t!="9999")break;c+=4}return dt=!0,tt(n,r)};we.times=we.mul=function(e){var t,r,n,a,o,c,u,f,h,m=this,g=m.constructor,v=m.d,b=(e=new g(e)).d;if(!m.s||!e.s)return new g(0);for(e.s*=m.s,r=m.e+e.e,f=v.length,h=b.length,f=0;){for(t=0,a=f+n;a>n;)u=o[a]+b[n]*v[a-n-1]+t,o[a--]=u%Rt|0,t=u/Rt|0;o[a]=(o[a]+t)%Rt|0}for(;!o[--c];)o.pop();return t?++r:o.shift(),e.d=o,e.e=r,dt?tt(e,g.precision):e};we.toDecimalPlaces=we.todp=function(e,t){var r=this,n=r.constructor;return r=new n(r),e===void 0?r:(qn(e,0,il),t===void 0?t=n.rounding:qn(t,0,8),tt(r,e+St(r)+1,t))};we.toExponential=function(e,t){var r,n=this,a=n.constructor;return e===void 0?r=So(n,!0):(qn(e,0,il),t===void 0?t=a.rounding:qn(t,0,8),n=tt(new a(n),e+1,t),r=So(n,!0,e+1)),r};we.toFixed=function(e,t){var r,n,a=this,o=a.constructor;return e===void 0?So(a):(qn(e,0,il),t===void 0?t=o.rounding:qn(t,0,8),n=tt(new o(a),e+St(a)+1,t),r=So(n.abs(),!1,e+St(n)+1),a.isneg()&&!a.isZero()?"-"+r:r)};we.toInteger=we.toint=function(){var e=this,t=e.constructor;return tt(new t(e),St(e)+1,t.rounding)};we.toNumber=function(){return+this};we.toPower=we.pow=function(e){var t,r,n,a,o,c,u=this,f=u.constructor,h=12,m=+(e=new f(e));if(!e.s)return new f(Fr);if(u=new f(u),!u.s){if(e.s<1)throw Error(an+"Infinity");return u}if(u.eq(Fr))return u;if(n=f.precision,e.eq(Fr))return tt(u,n);if(t=e.e,r=e.d.length-1,c=t>=r,o=u.s,c){if((r=m<0?-m:m)<=xA){for(a=new f(Fr),t=Math.ceil(n/lt+4),dt=!1;r%2&&(a=a.times(u),Pj(a.d,t)),r=al(r/2),r!==0;)u=u.times(u),Pj(u.d,t);return dt=!0,e.s<0?new f(Fr).div(a):tt(a,n)}}else if(o<0)throw Error(an+"NaN");return o=o<0&&e.d[Math.max(t,r)]&1?-1:1,u.s=1,dt=!1,a=e.times(Tu(u,n+h)),dt=!0,a=wA(a),a.s=o,a};we.toPrecision=function(e,t){var r,n,a=this,o=a.constructor;return e===void 0?(r=St(a),n=So(a,r<=o.toExpNeg||r>=o.toExpPos)):(qn(e,1,il),t===void 0?t=o.rounding:qn(t,0,8),a=tt(new o(a),e,t),r=St(a),n=So(a,e<=r||r<=o.toExpNeg,e)),n};we.toSignificantDigits=we.tosd=function(e,t){var r=this,n=r.constructor;return e===void 0?(e=n.precision,t=n.rounding):(qn(e,1,il),t===void 0?t=n.rounding:qn(t,0,8)),tt(new n(r),e,t)};we.toString=we.valueOf=we.val=we.toJSON=we[Symbol.for("nodejs.util.inspect.custom")]=function(){var e=this,t=St(e),r=e.constructor;return So(e,t<=r.toExpNeg||t>=r.toExpPos)};function bA(e,t){var r,n,a,o,c,u,f,h,m=e.constructor,g=m.precision;if(!e.s||!t.s)return t.s||(t=new m(e)),dt?tt(t,g):t;if(f=e.d,h=t.d,c=e.e,a=t.e,f=f.slice(),o=c-a,o){for(o<0?(n=f,o=-o,u=h.length):(n=h,a=c,u=f.length),c=Math.ceil(g/lt),u=c>u?c+1:u+1,o>u&&(o=u,n.length=1),n.reverse();o--;)n.push(0);n.reverse()}for(u=f.length,o=h.length,u-o<0&&(o=u,n=h,h=f,f=n),r=0;o;)r=(f[--o]=f[o]+h[o]+r)/Rt|0,f[o]%=Rt;for(r&&(f.unshift(r),++a),u=f.length;f[--u]==0;)f.pop();return t.d=f,t.e=a,dt?tt(t,g):t}function qn(e,t,r){if(e!==~~e||er)throw Error(go+e)}function Fn(e){var t,r,n,a=e.length-1,o="",c=e[0];if(a>0){for(o+=c,t=1;tc?1:-1;else for(u=f=0;ua[u]?1:-1;break}return f}function r(n,a,o){for(var c=0;o--;)n[o]-=c,c=n[o]1;)n.shift()}return function(n,a,o,c){var u,f,h,m,g,v,b,j,k,S,N,E,A,P,_,O,D,U,B=n.constructor,F=n.s==a.s?1:-1,Y=n.d,H=a.d;if(!n.s)return new B(n);if(!a.s)throw Error(an+"Division by zero");for(f=n.e-a.e,D=H.length,_=Y.length,b=new B(F),j=b.d=[],h=0;H[h]==(Y[h]||0);)++h;if(H[h]>(Y[h]||0)&&--f,o==null?E=o=B.precision:c?E=o+(St(n)-St(a))+1:E=o,E<0)return new B(0);if(E=E/lt+2|0,h=0,D==1)for(m=0,H=H[0],E++;(h<_||m)&&E--;h++)A=m*Rt+(Y[h]||0),j[h]=A/H|0,m=A%H|0;else{for(m=Rt/(H[0]+1)|0,m>1&&(H=e(H,m),Y=e(Y,m),D=H.length,_=Y.length),P=D,k=Y.slice(0,D),S=k.length;S=Rt/2&&++O;do m=0,u=t(H,k,D,S),u<0?(N=k[0],D!=S&&(N=N*Rt+(k[1]||0)),m=N/O|0,m>1?(m>=Rt&&(m=Rt-1),g=e(H,m),v=g.length,S=k.length,u=t(g,k,v,S),u==1&&(m--,r(g,D16)throw Error(Zy+St(e));if(!e.s)return new m(Fr);for(dt=!1,u=g,c=new m(.03125);e.abs().gte(.1);)e=e.times(c),h+=5;for(n=Math.log(Ya(2,h))/Math.LN10*2+5|0,u+=n,r=a=o=new m(Fr),m.precision=u;;){if(a=tt(a.times(e),u),r=r.times(++f),c=o.plus(yi(a,r,u)),Fn(c.d).slice(0,u)===Fn(o.d).slice(0,u)){for(;h--;)o=tt(o.times(o),u);return m.precision=g,t==null?(dt=!0,tt(o,g)):o}o=c}}function St(e){for(var t=e.e*lt,r=e.d[0];r>=10;r/=10)t++;return t}function Ag(e,t,r){if(t>e.LN10.sd())throw dt=!0,r&&(e.precision=r),Error(an+"LN10 precision limit exceeded");return tt(new e(e.LN10),t)}function oa(e){for(var t="";e--;)t+="0";return t}function Tu(e,t){var r,n,a,o,c,u,f,h,m,g=1,v=10,b=e,j=b.d,k=b.constructor,S=k.precision;if(b.s<1)throw Error(an+(b.s?"NaN":"-Infinity"));if(b.eq(Fr))return new k(0);if(t==null?(dt=!1,h=S):h=t,b.eq(10))return t==null&&(dt=!0),Ag(k,h);if(h+=v,k.precision=h,r=Fn(j),n=r.charAt(0),o=St(b),Math.abs(o)<15e14){for(;n<7&&n!=1||n==1&&r.charAt(1)>3;)b=b.times(e),r=Fn(b.d),n=r.charAt(0),g++;o=St(b),n>1?(b=new k("0."+r),o++):b=new k(n+"."+r.slice(1))}else return f=Ag(k,h+2,S).times(o+""),b=Tu(new k(n+"."+r.slice(1)),h-v).plus(f),k.precision=S,t==null?(dt=!0,tt(b,S)):b;for(u=c=b=yi(b.minus(Fr),b.plus(Fr),h),m=tt(b.times(b),h),a=3;;){if(c=tt(c.times(m),h),f=u.plus(yi(c,new k(a),h)),Fn(f.d).slice(0,h)===Fn(u.d).slice(0,h))return u=u.times(2),o!==0&&(u=u.plus(Ag(k,h+2,S).times(o+""))),u=yi(u,new k(g),h),k.precision=S,t==null?(dt=!0,tt(u,S)):u;u=f,a+=2}}function Cj(e,t){var r,n,a;for((r=t.indexOf("."))>-1&&(t=t.replace(".","")),(n=t.search(/e/i))>0?(r<0&&(r=n),r+=+t.slice(n+1),t=t.substring(0,n)):r<0&&(r=t.length),n=0;t.charCodeAt(n)===48;)++n;for(a=t.length;t.charCodeAt(a-1)===48;)--a;if(t=t.slice(n,a),t){if(a-=n,r=r-n-1,e.e=al(r/lt),e.d=[],n=(r+1)%lt,r<0&&(n+=lt),nLf||e.e<-Lf))throw Error(Zy+r)}else e.s=0,e.e=0,e.d=[0];return e}function tt(e,t,r){var n,a,o,c,u,f,h,m,g=e.d;for(c=1,o=g[0];o>=10;o/=10)c++;if(n=t-c,n<0)n+=lt,a=t,h=g[m=0];else{if(m=Math.ceil((n+1)/lt),o=g.length,m>=o)return e;for(h=o=g[m],c=1;o>=10;o/=10)c++;n%=lt,a=n-lt+c}if(r!==void 0&&(o=Ya(10,c-a-1),u=h/o%10|0,f=t<0||g[m+1]!==void 0||h%o,f=r<4?(u||f)&&(r==0||r==(e.s<0?3:2)):u>5||u==5&&(r==4||f||r==6&&(n>0?a>0?h/Ya(10,c-a):0:g[m-1])%10&1||r==(e.s<0?8:7))),t<1||!g[0])return f?(o=St(e),g.length=1,t=t-o-1,g[0]=Ya(10,(lt-t%lt)%lt),e.e=al(-t/lt)||0):(g.length=1,g[0]=e.e=e.s=0),e;if(n==0?(g.length=m,o=1,m--):(g.length=m+1,o=Ya(10,lt-n),g[m]=a>0?(h/Ya(10,c-a)%Ya(10,a)|0)*o:0),f)for(;;)if(m==0){(g[0]+=o)==Rt&&(g[0]=1,++e.e);break}else{if(g[m]+=o,g[m]!=Rt)break;g[m--]=0,o=1}for(n=g.length;g[--n]===0;)g.pop();if(dt&&(e.e>Lf||e.e<-Lf))throw Error(Zy+St(e));return e}function kA(e,t){var r,n,a,o,c,u,f,h,m,g,v=e.constructor,b=v.precision;if(!e.s||!t.s)return t.s?t.s=-t.s:t=new v(e),dt?tt(t,b):t;if(f=e.d,g=t.d,n=t.e,h=e.e,f=f.slice(),c=h-n,c){for(m=c<0,m?(r=f,c=-c,u=g.length):(r=g,n=h,u=f.length),a=Math.max(Math.ceil(b/lt),u)+2,c>a&&(c=a,r.length=1),r.reverse(),a=c;a--;)r.push(0);r.reverse()}else{for(a=f.length,u=g.length,m=a0;--a)f[u++]=0;for(a=g.length;a>c;){if(f[--a]0?o=o.charAt(0)+"."+o.slice(1)+oa(n):c>1&&(o=o.charAt(0)+"."+o.slice(1)),o=o+(a<0?"e":"e+")+a):a<0?(o="0."+oa(-a-1)+o,r&&(n=r-c)>0&&(o+=oa(n))):a>=c?(o+=oa(a+1-c),r&&(n=r-a-1)>0&&(o=o+"."+oa(n))):((n=a+1)0&&(a+1===c&&(o+="."),o+=oa(n))),e.s<0?"-"+o:o}function Pj(e,t){if(e.length>t)return e.length=t,!0}function jA(e){var t,r,n;function a(o){var c=this;if(!(c instanceof a))return new a(o);if(c.constructor=a,o instanceof a){c.s=o.s,c.e=o.e,c.d=(o=o.d)?o.slice():o;return}if(typeof o=="number"){if(o*0!==0)throw Error(go+o);if(o>0)c.s=1;else if(o<0)o=-o,c.s=-1;else{c.s=0,c.e=0,c.d=[0];return}if(o===~~o&&o<1e7){c.e=0,c.d=[o];return}return Cj(c,o.toString())}else if(typeof o!="string")throw Error(go+o);if(o.charCodeAt(0)===45?(o=o.slice(1),c.s=-1):c.s=1,_F.test(o))Cj(c,o);else throw Error(go+o)}if(a.prototype=we,a.ROUND_UP=0,a.ROUND_DOWN=1,a.ROUND_CEIL=2,a.ROUND_FLOOR=3,a.ROUND_HALF_UP=4,a.ROUND_HALF_DOWN=5,a.ROUND_HALF_EVEN=6,a.ROUND_HALF_CEIL=7,a.ROUND_HALF_FLOOR=8,a.clone=jA,a.config=a.set=MF,e===void 0&&(e={}),e)for(n=["precision","rounding","toExpNeg","toExpPos","LN10"],t=0;t=a[t+1]&&n<=a[t+2])this[r]=n;else throw Error(go+r+": "+n);if((n=e[r="LN10"])!==void 0)if(n==Math.LN10)this[r]=new this(n);else throw Error(go+r+": "+n);return this}var Jy=jA(OF);Fr=new Jy(1);const Ge=Jy;function SA(e){var t;return e===0?t=1:t=Math.floor(new Ge(e).abs().log(10).toNumber())+1,t}function NA(e,t,r){for(var n=new Ge(e),a=0,o=[];n.lt(t)&&a<1e5;)o.push(n.toNumber()),n=n.add(r),a++;return o}function Du(e,t){return RF(e)||DF(e,t)||TF(e,t)||IF()}function IF(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function TF(e,t){if(e){if(typeof e=="string")return Oj(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Oj(e,t):void 0}}function Oj(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{var t=Du(e,2),r=t[0],n=t[1],a=r,o=n;return r>n&&(a=n,o=r),[a,o]},e0=(e,t,r)=>{if(e.lte(0))return new Ge(0);var n=SA(e.toNumber()),a=new Ge(10).pow(n),o=e.div(a),c=n!==1?.05:.1,u=new Ge(Math.ceil(o.div(c).toNumber())).add(r).mul(c),f=u.mul(a);return t?new Ge(f.toNumber()):new Ge(Math.ceil(f.toNumber()))},AA=(e,t,r)=>{var n;if(e.lte(0))return new Ge(0);var a=[1,2,2.5,5],o=e.toNumber(),c=Math.floor(new Ge(o).abs().log(10).toNumber()),u=new Ge(10).pow(c),f=e.div(u).toNumber(),h=a.findIndex(b=>b>=f-1e-10);if(h===-1&&(u=u.mul(10),h=0),h+=r,h>=a.length){var m=Math.floor(h/a.length);h%=a.length,u=u.mul(new Ge(10).pow(m))}var g=(n=a[h])!==null&&n!==void 0?n:1,v=new Ge(g).mul(u);return t?v:new Ge(Math.ceil(v.toNumber()))},LF=(e,t,r)=>{var n=new Ge(1),a=new Ge(e);if(!a.isint()&&r){var o=Math.abs(e);o<1?(n=new Ge(10).pow(SA(e)-1),a=new Ge(Math.floor(a.div(n).toNumber())).mul(n)):o>1&&(a=new Ge(Math.floor(e)))}else e===0?a=new Ge(Math.floor((t-1)/2)):r||(a=new Ge(Math.floor(e)));for(var c=Math.floor((t-1)/2),u=[],f=0;f4&&arguments[4]!==void 0?arguments[4]:0,c=arguments.length>5&&arguments[5]!==void 0?arguments[5]:e0;if(!Number.isFinite((r-t)/(n-1)))return{step:new Ge(0),tickMin:new Ge(0),tickMax:new Ge(0)};var u=c(new Ge(r).sub(t).div(n-1),a,o),f;t<=0&&r>=0?f=new Ge(0):(f=new Ge(t).add(r).div(2),f=f.sub(new Ge(f).mod(u)));var h=Math.ceil(f.sub(t).div(u).toNumber()),m=Math.ceil(new Ge(r).sub(f).div(u).toNumber()),g=h+m+1;return g>n?CA(t,r,n,a,o+1,c):(g0?m+(n-g):m,h=r>0?h:h+(n-g)),{step:u,tickMin:f.sub(new Ge(h).mul(u)),tickMax:f.add(new Ge(m).mul(u))})},_j=function(t){var r=Du(t,2),n=r[0],a=r[1],o=arguments.length>1&&arguments[1]!==void 0?arguments[1]:6,c=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,u=arguments.length>3&&arguments[3]!==void 0?arguments[3]:"auto",f=Math.max(o,2),h=EA([n,a]),m=Du(h,2),g=m[0],v=m[1];if(g===-1/0||v===1/0){var b=v===1/0?[g,...Array(o-1).fill(1/0)]:[...Array(o-1).fill(-1/0),v];return n>a?b.reverse():b}if(g===v)return LF(g,o,c);var j=u==="snap125"?AA:e0,k=CA(g,v,f,c,0,j),S=k.step,N=k.tickMin,E=k.tickMax,A=NA(N,E.add(new Ge(.1).mul(S)),S);return n>a?A.reverse():A},Mj=function(t,r){var n=Du(t,2),a=n[0],o=n[1],c=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,u=arguments.length>3&&arguments[3]!==void 0?arguments[3]:"auto",f=EA([a,o]),h=Du(f,2),m=h[0],g=h[1];if(m===-1/0||g===1/0)return[a,o];if(m===g)return[m];var v=u==="snap125"?AA:e0,b=Math.max(r,2),j=v(new Ge(g).sub(m).div(b-1),c,0),k=[...NA(new Ge(m),new Ge(g),j),g];return c===!1&&(k=k.map(S=>Math.round(S))),a>o?k.reverse():k},$F=e=>e.rootProps.barCategoryGap,Uh=e=>e.rootProps.stackOffset,PA=e=>e.rootProps.reverseStackOrder,t0=e=>e.options.chartName,r0=e=>e.rootProps.syncId,OA=e=>e.rootProps.syncMethod,n0=e=>e.options.eventEmitter,zF=e=>e.rootProps.baseValue,pr={grid:-100,barBackground:-50,area:100,cursorRectangle:200,bar:300,line:400,axis:500,scatter:600,activeBar:1e3,cursorLine:1100,activeDot:1200,label:2e3},Ua={allowDecimals:!1,allowDataOverflow:!1,angleAxisId:0,reversed:!1,scale:"auto",tick:!0,type:"auto"},In={allowDataOverflow:!1,allowDecimals:!1,allowDuplicatedCategory:!0,includeHidden:!1,radiusAxisId:0,reversed:!1,scale:"auto",tick:!0,tickCount:5,type:"auto"},Hh=(e,t)=>{if(!(!e||!t))return e!=null&&e.reversed?[t[1],t[0]]:t};function Wh(e,t,r){if(r!=="auto")return r;if(e!=null)return Xn(e,t)?"category":"number"}function Ij(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function $f(e){for(var t=1;t{if(t!=null)return e.polarAxis.angleAxis[t]},i0=q([HF,eA],(e,t)=>{var r;if(e!=null)return e;var n=(r=Wh(t,"angleAxis",Tj.type))!==null&&r!==void 0?r:"category";return $f($f({},Tj),{},{type:n})}),WF=(e,t)=>e.polarAxis.radiusAxis[t],a0=q([WF,eA],(e,t)=>{var r;if(e!=null)return e;var n=(r=Wh(t,"radiusAxis",Dj.type))!==null&&r!==void 0?r:"category";return $f($f({},Dj),{},{type:n})}),Kh=e=>e.polarOptions,o0=q([Ei,Ai,Zt],cF),_A=q([Kh,o0],(e,t)=>{if(e!=null)return Sa(e.innerRadius,t,0)}),MA=q([Kh,o0],(e,t)=>{if(e!=null)return Sa(e.outerRadius,t,t*.8)}),KF=e=>{if(e==null)return[0,0];var t=e.startAngle,r=e.endAngle;return[t,r]},IA=q([Kh],KF);q([i0,IA],Hh);var TA=q([o0,_A,MA],(e,t,r)=>{if(!(e==null||t==null||r==null))return[t,r]});q([a0,TA],Hh);var DA=q([ft,Kh,_A,MA,Ei,Ai],(e,t,r,n,a,o)=>{if(!(e!=="centric"&&e!=="radial"||t==null||r==null||n==null)){var c=t.cx,u=t.cy,f=t.startAngle,h=t.endAngle;return{cx:Sa(c,a,a/2),cy:Sa(u,o,o/2),innerRadius:r,outerRadius:n,startAngle:f,endAngle:h,clockWise:!1}}}),zt=(e,t)=>t,Gh=(e,t,r)=>r;function s0(e){return e==null?void 0:e.id}function RA(e,t,r){var n=t.chartData,a=n===void 0?[]:n,o=r.allowDuplicatedCategory,c=r.dataKey,u=new Map;return e.forEach(f=>{var h,m=(h=f.data)!==null&&h!==void 0?h:a;if(!(m==null||m.length===0)){var g=s0(f);m.forEach((v,b)=>{var j=c==null||o?b:String(Lt(v,c,null)),k=Lt(v,f.dataKey,0),S;u.has(j)?S=u.get(j):S={},Object.assign(S,{[g]:k}),u.set(j,S)})}}),Array.from(u.values())}function l0(e){return"stackId"in e&&e.stackId!=null&&e.dataKey!=null}var Vh=(e,t)=>e===t?!0:e==null||t==null?!1:e[0]===t[0]&&e[1]===t[1];function qh(e,t){return Array.isArray(e)&&Array.isArray(t)&&e.length===0&&t.length===0?!0:e===t}function GF(e,t){if(e.length===t.length){for(var r=0;r{var t=ft(e);return t==="horizontal"?"xAxis":t==="vertical"?"yAxis":t==="centric"?"angleAxis":"radiusAxis"},ol=e=>e.tooltip.settings.axisId;function u0(e){if(e!=null){var t=e.ticks,r=e.bandwidth,n=e.range(),a=[Math.min(...n),Math.max(...n)];return{domain:()=>e.domain(),range:(function(o){function c(){return o.apply(this,arguments)}return c.toString=function(){return o.toString()},c})(()=>a),rangeMin:()=>a[0],rangeMax:()=>a[1],isInRange(o){var c=a[0],u=a[1];return c<=u?o>=c&&o<=u:o>=u&&o<=c},bandwidth:r?()=>r.call(e):void 0,ticks:t?o=>t.call(e,o):void 0,map:(o,c)=>{var u=e(o);if(u!=null){if(e.bandwidth&&c!==null&&c!==void 0&&c.position){var f=e.bandwidth();switch(c.position){case"middle":u+=f/2;break;case"end":u+=f;break}}return u}}}}}var VF=(e,t)=>{if(t!=null)switch(e){case"linear":{if(!Bn(t)){for(var r,n,a=0;an)&&(n=o))}return r!==void 0&&n!==void 0?[r,n]:void 0}return t}default:return t}};function wa(e,t){return e==null||t==null?NaN:et?1:e>=t?0:NaN}function qF(e,t){return e==null||t==null?NaN:te?1:t>=e?0:NaN}function c0(e){let t,r,n;e.length!==2?(t=wa,r=(u,f)=>wa(e(u),f),n=(u,f)=>e(u)-f):(t=e===wa||e===qF?e:QF,r=e,n=e);function a(u,f,h=0,m=u.length){if(h>>1;r(u[g],f)<0?h=g+1:m=g}while(h>>1;r(u[g],f)<=0?h=g+1:m=g}while(hh&&n(u[g-1],f)>-n(u[g],f)?g-1:g}return{left:a,center:c,right:o}}function QF(){return 0}function LA(e){return e===null?NaN:+e}function*YF(e,t){for(let r of e)r!=null&&(r=+r)>=r&&(yield r)}const XF=c0(wa),ic=XF.right;c0(LA).center;class Rj extends Map{constructor(t,r=e9){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:r}}),t!=null)for(const[n,a]of t)this.set(n,a)}get(t){return super.get(Lj(this,t))}has(t){return super.has(Lj(this,t))}set(t,r){return super.set(ZF(this,t),r)}delete(t){return super.delete(JF(this,t))}}function Lj({_intern:e,_key:t},r){const n=t(r);return e.has(n)?e.get(n):r}function ZF({_intern:e,_key:t},r){const n=t(r);return e.has(n)?e.get(n):(e.set(n,r),r)}function JF({_intern:e,_key:t},r){const n=t(r);return e.has(n)&&(r=e.get(n),e.delete(n)),r}function e9(e){return e!==null&&typeof e=="object"?e.valueOf():e}function t9(e=wa){if(e===wa)return $A;if(typeof e!="function")throw new TypeError("compare is not a function");return(t,r)=>{const n=e(t,r);return n||n===0?n:(e(r,r)===0)-(e(t,t)===0)}}function $A(e,t){return(e==null||!(e>=e))-(t==null||!(t>=t))||(et?1:0)}const r9=Math.sqrt(50),n9=Math.sqrt(10),i9=Math.sqrt(2);function zf(e,t,r){const n=(t-e)/Math.max(0,r),a=Math.floor(Math.log10(n)),o=n/Math.pow(10,a),c=o>=r9?10:o>=n9?5:o>=i9?2:1;let u,f,h;return a<0?(h=Math.pow(10,-a)/c,u=Math.round(e*h),f=Math.round(t*h),u/ht&&--f,h=-h):(h=Math.pow(10,a)*c,u=Math.round(e/h),f=Math.round(t/h),u*ht&&--f),f0))return[];if(e===t)return[e];const n=t=a))return[];const u=o-a+1,f=new Array(u);if(n)if(c<0)for(let h=0;h=n)&&(r=n);return r}function zj(e,t){let r;for(const n of e)n!=null&&(r>n||r===void 0&&n>=n)&&(r=n);return r}function zA(e,t,r=0,n=1/0,a){if(t=Math.floor(t),r=Math.floor(Math.max(0,r)),n=Math.floor(Math.min(e.length-1,n)),!(r<=t&&t<=n))return e;for(a=a===void 0?$A:t9(a);n>r;){if(n-r>600){const f=n-r+1,h=t-r+1,m=Math.log(f),g=.5*Math.exp(2*m/3),v=.5*Math.sqrt(m*g*(f-g)/f)*(h-f/2<0?-1:1),b=Math.max(r,Math.floor(t-h*g/f+v)),j=Math.min(n,Math.floor(t+(f-h)*g/f+v));zA(e,t,b,j,a)}const o=e[t];let c=r,u=n;for(au(e,r,t),a(e[n],o)>0&&au(e,r,n);c0;)--u}a(e[r],o)===0?au(e,r,u):(++u,au(e,u,n)),u<=t&&(r=u+1),t<=u&&(n=u-1)}return e}function au(e,t,r){const n=e[t];e[t]=e[r],e[r]=n}function a9(e,t,r){if(e=Float64Array.from(YF(e)),!(!(n=e.length)||isNaN(t=+t))){if(t<=0||n<2)return zj(e);if(t>=1)return $j(e);var n,a=(n-1)*t,o=Math.floor(a),c=$j(zA(e,o).subarray(0,o+1)),u=zj(e.subarray(o+1));return c+(u-c)*(a-o)}}function o9(e,t,r=LA){if(!(!(n=e.length)||isNaN(t=+t))){if(t<=0||n<2)return+r(e[0],0,e);if(t>=1)return+r(e[n-1],n-1,e);var n,a=(n-1)*t,o=Math.floor(a),c=+r(e[o],o,e),u=+r(e[o+1],o+1,e);return c+(u-c)*(a-o)}}function s9(e,t,r){e=+e,t=+t,r=(a=arguments.length)<2?(t=e,e=0,1):a<3?1:+r;for(var n=-1,a=Math.max(0,Math.ceil((t-e)/r))|0,o=new Array(a);++n>8&15|t>>4&240,t>>4&15|t&240,(t&15)<<4|t&15,1):r===8?Bd(t>>24&255,t>>16&255,t>>8&255,(t&255)/255):r===4?Bd(t>>12&15|t>>8&240,t>>8&15|t>>4&240,t>>4&15|t&240,((t&15)<<4|t&15)/255):null):(t=c9.exec(e))?new Cr(t[1],t[2],t[3],1):(t=d9.exec(e))?new Cr(t[1]*255/100,t[2]*255/100,t[3]*255/100,1):(t=f9.exec(e))?Bd(t[1],t[2],t[3],t[4]):(t=h9.exec(e))?Bd(t[1]*255/100,t[2]*255/100,t[3]*255/100,t[4]):(t=m9.exec(e))?Gj(t[1],t[2]/100,t[3]/100,1):(t=p9.exec(e))?Gj(t[1],t[2]/100,t[3]/100,t[4]):Fj.hasOwnProperty(e)?Hj(Fj[e]):e==="transparent"?new Cr(NaN,NaN,NaN,0):null}function Hj(e){return new Cr(e>>16&255,e>>8&255,e&255,1)}function Bd(e,t,r,n){return n<=0&&(e=t=r=NaN),new Cr(e,t,r,n)}function y9(e){return e instanceof ac||(e=$u(e)),e?(e=e.rgb(),new Cr(e.r,e.g,e.b,e.opacity)):new Cr}function ty(e,t,r,n){return arguments.length===1?y9(e):new Cr(e,t,r,n??1)}function Cr(e,t,r,n){this.r=+e,this.g=+t,this.b=+r,this.opacity=+n}h0(Cr,ty,BA(ac,{brighter(e){return e=e==null?Ff:Math.pow(Ff,e),new Cr(this.r*e,this.g*e,this.b*e,this.opacity)},darker(e){return e=e==null?Ru:Math.pow(Ru,e),new Cr(this.r*e,this.g*e,this.b*e,this.opacity)},rgb(){return this},clamp(){return new Cr(vo(this.r),vo(this.g),vo(this.b),Bf(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:Wj,formatHex:Wj,formatHex8:x9,formatRgb:Kj,toString:Kj}));function Wj(){return`#${to(this.r)}${to(this.g)}${to(this.b)}`}function x9(){return`#${to(this.r)}${to(this.g)}${to(this.b)}${to((isNaN(this.opacity)?1:this.opacity)*255)}`}function Kj(){const e=Bf(this.opacity);return`${e===1?"rgb(":"rgba("}${vo(this.r)}, ${vo(this.g)}, ${vo(this.b)}${e===1?")":`, ${e})`}`}function Bf(e){return isNaN(e)?1:Math.max(0,Math.min(1,e))}function vo(e){return Math.max(0,Math.min(255,Math.round(e)||0))}function to(e){return e=vo(e),(e<16?"0":"")+e.toString(16)}function Gj(e,t,r,n){return n<=0?e=t=r=NaN:r<=0||r>=1?e=t=NaN:t<=0&&(e=NaN),new bn(e,t,r,n)}function UA(e){if(e instanceof bn)return new bn(e.h,e.s,e.l,e.opacity);if(e instanceof ac||(e=$u(e)),!e)return new bn;if(e instanceof bn)return e;e=e.rgb();var t=e.r/255,r=e.g/255,n=e.b/255,a=Math.min(t,r,n),o=Math.max(t,r,n),c=NaN,u=o-a,f=(o+a)/2;return u?(t===o?c=(r-n)/u+(r0&&f<1?0:c,new bn(c,u,f,e.opacity)}function b9(e,t,r,n){return arguments.length===1?UA(e):new bn(e,t,r,n??1)}function bn(e,t,r,n){this.h=+e,this.s=+t,this.l=+r,this.opacity=+n}h0(bn,b9,BA(ac,{brighter(e){return e=e==null?Ff:Math.pow(Ff,e),new bn(this.h,this.s,this.l*e,this.opacity)},darker(e){return e=e==null?Ru:Math.pow(Ru,e),new bn(this.h,this.s,this.l*e,this.opacity)},rgb(){var e=this.h%360+(this.h<0)*360,t=isNaN(e)||isNaN(this.s)?0:this.s,r=this.l,n=r+(r<.5?r:1-r)*t,a=2*r-n;return new Cr(Cg(e>=240?e-240:e+120,a,n),Cg(e,a,n),Cg(e<120?e+240:e-120,a,n),this.opacity)},clamp(){return new bn(Vj(this.h),Ud(this.s),Ud(this.l),Bf(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const e=Bf(this.opacity);return`${e===1?"hsl(":"hsla("}${Vj(this.h)}, ${Ud(this.s)*100}%, ${Ud(this.l)*100}%${e===1?")":`, ${e})`}`}}));function Vj(e){return e=(e||0)%360,e<0?e+360:e}function Ud(e){return Math.max(0,Math.min(1,e||0))}function Cg(e,t,r){return(e<60?t+(r-t)*e/60:e<180?r:e<240?t+(r-t)*(240-e)/60:t)*255}const m0=e=>()=>e;function w9(e,t){return function(r){return e+r*t}}function k9(e,t,r){return e=Math.pow(e,r),t=Math.pow(t,r)-e,r=1/r,function(n){return Math.pow(e+n*t,r)}}function j9(e){return(e=+e)==1?HA:function(t,r){return r-t?k9(t,r,e):m0(isNaN(t)?r:t)}}function HA(e,t){var r=t-e;return r?w9(e,r):m0(isNaN(e)?t:e)}const qj=(function e(t){var r=j9(t);function n(a,o){var c=r((a=ty(a)).r,(o=ty(o)).r),u=r(a.g,o.g),f=r(a.b,o.b),h=HA(a.opacity,o.opacity);return function(m){return a.r=c(m),a.g=u(m),a.b=f(m),a.opacity=h(m),a+""}}return n.gamma=e,n})(1);function S9(e,t){t||(t=[]);var r=e?Math.min(t.length,e.length):0,n=t.slice(),a;return function(o){for(a=0;ar&&(o=t.slice(r,o),u[c]?u[c]+=o:u[++c]=o),(n=n[0])===(a=a[0])?u[c]?u[c]+=a:u[++c]=a:(u[++c]=null,f.push({i:c,x:Uf(n,a)})),r=Pg.lastIndex;return rt&&(r=e,e=t,t=r),function(n){return Math.max(e,Math.min(t,n))}}function D9(e,t,r){var n=e[0],a=e[1],o=t[0],c=t[1];return a2?R9:D9,f=h=null,g}function g(v){return v==null||isNaN(v=+v)?o:(f||(f=u(e.map(n),t,r)))(n(c(v)))}return g.invert=function(v){return c(a((h||(h=u(t,e.map(n),Uf)))(v)))},g.domain=function(v){return arguments.length?(e=Array.from(v,Hf),m()):e.slice()},g.range=function(v){return arguments.length?(t=Array.from(v),m()):t.slice()},g.rangeRound=function(v){return t=Array.from(v),r=p0,m()},g.clamp=function(v){return arguments.length?(c=v?!0:gr,m()):c!==gr},g.interpolate=function(v){return arguments.length?(r=v,m()):r},g.unknown=function(v){return arguments.length?(o=v,g):o},function(v,b){return n=v,a=b,m()}}function g0(){return Qh()(gr,gr)}function L9(e){return Math.abs(e=Math.round(e))>=1e21?e.toLocaleString("en").replace(/,/g,""):e.toString(10)}function Wf(e,t){if(!isFinite(e)||e===0)return null;var r=(e=t?e.toExponential(t-1):e.toExponential()).indexOf("e"),n=e.slice(0,r);return[n.length>1?n[0]+n.slice(2):n,+e.slice(r+1)]}function qs(e){return e=Wf(Math.abs(e)),e?e[1]:NaN}function $9(e,t){return function(r,n){for(var a=r.length,o=[],c=0,u=e[0],f=0;a>0&&u>0&&(f+u+1>n&&(u=Math.max(1,n-f)),o.push(r.substring(a-=u,a+u)),!((f+=u+1)>n));)u=e[c=(c+1)%e.length];return o.reverse().join(t)}}function z9(e){return function(t){return t.replace(/[0-9]/g,function(r){return e[+r]})}}var F9=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function zu(e){if(!(t=F9.exec(e)))throw new Error("invalid format: "+e);var t;return new v0({fill:t[1],align:t[2],sign:t[3],symbol:t[4],zero:t[5],width:t[6],comma:t[7],precision:t[8]&&t[8].slice(1),trim:t[9],type:t[10]})}zu.prototype=v0.prototype;function v0(e){this.fill=e.fill===void 0?" ":e.fill+"",this.align=e.align===void 0?">":e.align+"",this.sign=e.sign===void 0?"-":e.sign+"",this.symbol=e.symbol===void 0?"":e.symbol+"",this.zero=!!e.zero,this.width=e.width===void 0?void 0:+e.width,this.comma=!!e.comma,this.precision=e.precision===void 0?void 0:+e.precision,this.trim=!!e.trim,this.type=e.type===void 0?"":e.type+""}v0.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(this.width===void 0?"":Math.max(1,this.width|0))+(this.comma?",":"")+(this.precision===void 0?"":"."+Math.max(0,this.precision|0))+(this.trim?"~":"")+this.type};function B9(e){e:for(var t=e.length,r=1,n=-1,a;r0&&(n=0);break}return n>0?e.slice(0,n)+e.slice(a+1):e}var Kf;function U9(e,t){var r=Wf(e,t);if(!r)return Kf=void 0,e.toPrecision(t);var n=r[0],a=r[1],o=a-(Kf=Math.max(-8,Math.min(8,Math.floor(a/3)))*3)+1,c=n.length;return o===c?n:o>c?n+new Array(o-c+1).join("0"):o>0?n.slice(0,o)+"."+n.slice(o):"0."+new Array(1-o).join("0")+Wf(e,Math.max(0,t+o-1))[0]}function Yj(e,t){var r=Wf(e,t);if(!r)return e+"";var n=r[0],a=r[1];return a<0?"0."+new Array(-a).join("0")+n:n.length>a+1?n.slice(0,a+1)+"."+n.slice(a+1):n+new Array(a-n.length+2).join("0")}const Xj={"%":(e,t)=>(e*100).toFixed(t),b:e=>Math.round(e).toString(2),c:e=>e+"",d:L9,e:(e,t)=>e.toExponential(t),f:(e,t)=>e.toFixed(t),g:(e,t)=>e.toPrecision(t),o:e=>Math.round(e).toString(8),p:(e,t)=>Yj(e*100,t),r:Yj,s:U9,X:e=>Math.round(e).toString(16).toUpperCase(),x:e=>Math.round(e).toString(16)};function Zj(e){return e}var Jj=Array.prototype.map,eS=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function H9(e){var t=e.grouping===void 0||e.thousands===void 0?Zj:$9(Jj.call(e.grouping,Number),e.thousands+""),r=e.currency===void 0?"":e.currency[0]+"",n=e.currency===void 0?"":e.currency[1]+"",a=e.decimal===void 0?".":e.decimal+"",o=e.numerals===void 0?Zj:z9(Jj.call(e.numerals,String)),c=e.percent===void 0?"%":e.percent+"",u=e.minus===void 0?"−":e.minus+"",f=e.nan===void 0?"NaN":e.nan+"";function h(g,v){g=zu(g);var b=g.fill,j=g.align,k=g.sign,S=g.symbol,N=g.zero,E=g.width,A=g.comma,P=g.precision,_=g.trim,O=g.type;O==="n"?(A=!0,O="g"):Xj[O]||(P===void 0&&(P=12),_=!0,O="g"),(N||b==="0"&&j==="=")&&(N=!0,b="0",j="=");var D=(v&&v.prefix!==void 0?v.prefix:"")+(S==="$"?r:S==="#"&&/[boxX]/.test(O)?"0"+O.toLowerCase():""),U=(S==="$"?n:/[%p]/.test(O)?c:"")+(v&&v.suffix!==void 0?v.suffix:""),B=Xj[O],F=/[defgprs%]/.test(O);P=P===void 0?6:/[gprs]/.test(O)?Math.max(1,Math.min(21,P)):Math.max(0,Math.min(20,P));function Y(H){var pe=D,ue=U,he,ae,se;if(O==="c")ue=B(H)+ue,H="";else{H=+H;var X=H<0||1/H<0;if(H=isNaN(H)?f:B(Math.abs(H),P),_&&(H=B9(H)),X&&+H==0&&k!=="+"&&(X=!1),pe=(X?k==="("?k:u:k==="-"||k==="("?"":k)+pe,ue=(O==="s"&&!isNaN(H)&&Kf!==void 0?eS[8+Kf/3]:"")+ue+(X&&k==="("?")":""),F){for(he=-1,ae=H.length;++hese||se>57){ue=(se===46?a+H.slice(he+1):H.slice(he))+ue,H=H.slice(0,he);break}}}A&&!N&&(H=t(H,1/0));var te=pe.length+H.length+ue.length,J=te>1)+pe+H+ue+J.slice(te);break;default:H=J+pe+H+ue;break}return o(H)}return Y.toString=function(){return g+""},Y}function m(g,v){var b=Math.max(-8,Math.min(8,Math.floor(qs(v)/3)))*3,j=Math.pow(10,-b),k=h((g=zu(g),g.type="f",g),{suffix:eS[8+b/3]});return function(S){return k(j*S)}}return{format:h,formatPrefix:m}}var Hd,y0,WA;W9({thousands:",",grouping:[3],currency:["$",""]});function W9(e){return Hd=H9(e),y0=Hd.format,WA=Hd.formatPrefix,Hd}function K9(e){return Math.max(0,-qs(Math.abs(e)))}function G9(e,t){return Math.max(0,Math.max(-8,Math.min(8,Math.floor(qs(t)/3)))*3-qs(Math.abs(e)))}function V9(e,t){return e=Math.abs(e),t=Math.abs(t)-e,Math.max(0,qs(t)-qs(e))+1}function KA(e,t,r,n){var a=Jv(e,t,r),o;switch(n=zu(n??",f"),n.type){case"s":{var c=Math.max(Math.abs(e),Math.abs(t));return n.precision==null&&!isNaN(o=G9(a,c))&&(n.precision=o),WA(n,c)}case"":case"e":case"g":case"p":case"r":{n.precision==null&&!isNaN(o=V9(a,Math.max(Math.abs(e),Math.abs(t))))&&(n.precision=o-(n.type==="e"));break}case"f":case"%":{n.precision==null&&!isNaN(o=K9(a))&&(n.precision=o-(n.type==="%")*2);break}}return y0(n)}function Na(e){var t=e.domain;return e.ticks=function(r){var n=t();return Xv(n[0],n[n.length-1],r??10)},e.tickFormat=function(r,n){var a=t();return KA(a[0],a[a.length-1],r??10,n)},e.nice=function(r){r==null&&(r=10);var n=t(),a=0,o=n.length-1,c=n[a],u=n[o],f,h,m=10;for(u0;){if(h=Zv(c,u,r),h===f)return n[a]=c,n[o]=u,t(n);if(h>0)c=Math.floor(c/h)*h,u=Math.ceil(u/h)*h;else if(h<0)c=Math.ceil(c*h)/h,u=Math.floor(u*h)/h;else break;f=h}return e},e}function GA(){var e=g0();return e.copy=function(){return oc(e,GA())},sn.apply(e,arguments),Na(e)}function VA(e){var t;function r(n){return n==null||isNaN(n=+n)?t:n}return r.invert=r,r.domain=r.range=function(n){return arguments.length?(e=Array.from(n,Hf),r):e.slice()},r.unknown=function(n){return arguments.length?(t=n,r):t},r.copy=function(){return VA(e).unknown(t)},e=arguments.length?Array.from(e,Hf):[0,1],Na(r)}function qA(e,t){e=e.slice();var r=0,n=e.length-1,a=e[r],o=e[n],c;return oMath.pow(e,t)}function Z9(e){return e===Math.E?Math.log:e===10&&Math.log10||e===2&&Math.log2||(e=Math.log(e),t=>Math.log(t)/e)}function nS(e){return(t,r)=>-e(-t,r)}function x0(e){const t=e(tS,rS),r=t.domain;let n=10,a,o;function c(){return a=Z9(n),o=X9(n),r()[0]<0?(a=nS(a),o=nS(o),e(q9,Q9)):e(tS,rS),t}return t.base=function(u){return arguments.length?(n=+u,c()):n},t.domain=function(u){return arguments.length?(r(u),c()):r()},t.ticks=u=>{const f=r();let h=f[0],m=f[f.length-1];const g=m0){for(;v<=b;++v)for(j=1;jm)break;N.push(k)}}else for(;v<=b;++v)for(j=n-1;j>=1;--j)if(k=v>0?j/o(-v):j*o(v),!(km)break;N.push(k)}N.length*2{if(u==null&&(u=10),f==null&&(f=n===10?"s":","),typeof f!="function"&&(!(n%1)&&(f=zu(f)).precision==null&&(f.trim=!0),f=y0(f)),u===1/0)return f;const h=Math.max(1,n*u/t.ticks().length);return m=>{let g=m/o(Math.round(a(m)));return g*nr(qA(r(),{floor:u=>o(Math.floor(a(u))),ceil:u=>o(Math.ceil(a(u)))})),t}function QA(){const e=x0(Qh()).domain([1,10]);return e.copy=()=>oc(e,QA()).base(e.base()),sn.apply(e,arguments),e}function iS(e){return function(t){return Math.sign(t)*Math.log1p(Math.abs(t/e))}}function aS(e){return function(t){return Math.sign(t)*Math.expm1(Math.abs(t))*e}}function b0(e){var t=1,r=e(iS(t),aS(t));return r.constant=function(n){return arguments.length?e(iS(t=+n),aS(t)):t},Na(r)}function YA(){var e=b0(Qh());return e.copy=function(){return oc(e,YA()).constant(e.constant())},sn.apply(e,arguments)}function oS(e){return function(t){return t<0?-Math.pow(-t,e):Math.pow(t,e)}}function J9(e){return e<0?-Math.sqrt(-e):Math.sqrt(e)}function e7(e){return e<0?-e*e:e*e}function w0(e){var t=e(gr,gr),r=1;function n(){return r===1?e(gr,gr):r===.5?e(J9,e7):e(oS(r),oS(1/r))}return t.exponent=function(a){return arguments.length?(r=+a,n()):r},Na(t)}function k0(){var e=w0(Qh());return e.copy=function(){return oc(e,k0()).exponent(e.exponent())},sn.apply(e,arguments),e}function t7(){return k0.apply(null,arguments).exponent(.5)}function sS(e){return Math.sign(e)*e*e}function r7(e){return Math.sign(e)*Math.sqrt(Math.abs(e))}function XA(){var e=g0(),t=[0,1],r=!1,n;function a(o){var c=r7(e(o));return isNaN(c)?n:r?Math.round(c):c}return a.invert=function(o){return e.invert(sS(o))},a.domain=function(o){return arguments.length?(e.domain(o),a):e.domain()},a.range=function(o){return arguments.length?(e.range((t=Array.from(o,Hf)).map(sS)),a):t.slice()},a.rangeRound=function(o){return a.range(o).round(!0)},a.round=function(o){return arguments.length?(r=!!o,a):r},a.clamp=function(o){return arguments.length?(e.clamp(o),a):e.clamp()},a.unknown=function(o){return arguments.length?(n=o,a):n},a.copy=function(){return XA(e.domain(),t).round(r).clamp(e.clamp()).unknown(n)},sn.apply(a,arguments),Na(a)}function ZA(){var e=[],t=[],r=[],n;function a(){var c=0,u=Math.max(1,t.length);for(r=new Array(u-1);++c0?r[u-1]:e[0],u=r?[n[r-1],t]:[n[h-1],n[h]]},c.unknown=function(f){return arguments.length&&(o=f),c},c.thresholds=function(){return n.slice()},c.copy=function(){return JA().domain([e,t]).range(a).unknown(o)},sn.apply(Na(c),arguments)}function eC(){var e=[.5],t=[0,1],r,n=1;function a(o){return o!=null&&o<=o?t[ic(e,o,0,n)]:r}return a.domain=function(o){return arguments.length?(e=Array.from(o),n=Math.min(e.length,t.length-1),a):e.slice()},a.range=function(o){return arguments.length?(t=Array.from(o),n=Math.min(e.length,t.length-1),a):t.slice()},a.invertExtent=function(o){var c=t.indexOf(o);return[e[c-1],e[c]]},a.unknown=function(o){return arguments.length?(r=o,a):r},a.copy=function(){return eC().domain(e).range(t).unknown(r)},sn.apply(a,arguments)}const Og=new Date,_g=new Date;function Ot(e,t,r,n){function a(o){return e(o=arguments.length===0?new Date:new Date(+o)),o}return a.floor=o=>(e(o=new Date(+o)),o),a.ceil=o=>(e(o=new Date(o-1)),t(o,1),e(o),o),a.round=o=>{const c=a(o),u=a.ceil(o);return o-c(t(o=new Date(+o),c==null?1:Math.floor(c)),o),a.range=(o,c,u)=>{const f=[];if(o=a.ceil(o),u=u==null?1:Math.floor(u),!(o0))return f;let h;do f.push(h=new Date(+o)),t(o,u),e(o);while(hOt(c=>{if(c>=c)for(;e(c),!o(c);)c.setTime(c-1)},(c,u)=>{if(c>=c)if(u<0)for(;++u<=0;)for(;t(c,-1),!o(c););else for(;--u>=0;)for(;t(c,1),!o(c););}),r&&(a.count=(o,c)=>(Og.setTime(+o),_g.setTime(+c),e(Og),e(_g),Math.floor(r(Og,_g))),a.every=o=>(o=Math.floor(o),!isFinite(o)||!(o>0)?null:o>1?a.filter(n?c=>n(c)%o===0:c=>a.count(0,c)%o===0):a)),a}const Gf=Ot(()=>{},(e,t)=>{e.setTime(+e+t)},(e,t)=>t-e);Gf.every=e=>(e=Math.floor(e),!isFinite(e)||!(e>0)?null:e>1?Ot(t=>{t.setTime(Math.floor(t/e)*e)},(t,r)=>{t.setTime(+t+r*e)},(t,r)=>(r-t)/e):Gf);Gf.range;const pi=1e3,tn=pi*60,gi=tn*60,ki=gi*24,j0=ki*7,lS=ki*30,Mg=ki*365,ro=Ot(e=>{e.setTime(e-e.getMilliseconds())},(e,t)=>{e.setTime(+e+t*pi)},(e,t)=>(t-e)/pi,e=>e.getUTCSeconds());ro.range;const S0=Ot(e=>{e.setTime(e-e.getMilliseconds()-e.getSeconds()*pi)},(e,t)=>{e.setTime(+e+t*tn)},(e,t)=>(t-e)/tn,e=>e.getMinutes());S0.range;const N0=Ot(e=>{e.setUTCSeconds(0,0)},(e,t)=>{e.setTime(+e+t*tn)},(e,t)=>(t-e)/tn,e=>e.getUTCMinutes());N0.range;const E0=Ot(e=>{e.setTime(e-e.getMilliseconds()-e.getSeconds()*pi-e.getMinutes()*tn)},(e,t)=>{e.setTime(+e+t*gi)},(e,t)=>(t-e)/gi,e=>e.getHours());E0.range;const A0=Ot(e=>{e.setUTCMinutes(0,0,0)},(e,t)=>{e.setTime(+e+t*gi)},(e,t)=>(t-e)/gi,e=>e.getUTCHours());A0.range;const sc=Ot(e=>e.setHours(0,0,0,0),(e,t)=>e.setDate(e.getDate()+t),(e,t)=>(t-e-(t.getTimezoneOffset()-e.getTimezoneOffset())*tn)/ki,e=>e.getDate()-1);sc.range;const Yh=Ot(e=>{e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCDate(e.getUTCDate()+t)},(e,t)=>(t-e)/ki,e=>e.getUTCDate()-1);Yh.range;const tC=Ot(e=>{e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCDate(e.getUTCDate()+t)},(e,t)=>(t-e)/ki,e=>Math.floor(e/ki));tC.range;function _o(e){return Ot(t=>{t.setDate(t.getDate()-(t.getDay()+7-e)%7),t.setHours(0,0,0,0)},(t,r)=>{t.setDate(t.getDate()+r*7)},(t,r)=>(r-t-(r.getTimezoneOffset()-t.getTimezoneOffset())*tn)/j0)}const Xh=_o(0),Vf=_o(1),n7=_o(2),i7=_o(3),Qs=_o(4),a7=_o(5),o7=_o(6);Xh.range;Vf.range;n7.range;i7.range;Qs.range;a7.range;o7.range;function Mo(e){return Ot(t=>{t.setUTCDate(t.getUTCDate()-(t.getUTCDay()+7-e)%7),t.setUTCHours(0,0,0,0)},(t,r)=>{t.setUTCDate(t.getUTCDate()+r*7)},(t,r)=>(r-t)/j0)}const Zh=Mo(0),qf=Mo(1),s7=Mo(2),l7=Mo(3),Ys=Mo(4),u7=Mo(5),c7=Mo(6);Zh.range;qf.range;s7.range;l7.range;Ys.range;u7.range;c7.range;const C0=Ot(e=>{e.setDate(1),e.setHours(0,0,0,0)},(e,t)=>{e.setMonth(e.getMonth()+t)},(e,t)=>t.getMonth()-e.getMonth()+(t.getFullYear()-e.getFullYear())*12,e=>e.getMonth());C0.range;const P0=Ot(e=>{e.setUTCDate(1),e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCMonth(e.getUTCMonth()+t)},(e,t)=>t.getUTCMonth()-e.getUTCMonth()+(t.getUTCFullYear()-e.getUTCFullYear())*12,e=>e.getUTCMonth());P0.range;const ji=Ot(e=>{e.setMonth(0,1),e.setHours(0,0,0,0)},(e,t)=>{e.setFullYear(e.getFullYear()+t)},(e,t)=>t.getFullYear()-e.getFullYear(),e=>e.getFullYear());ji.every=e=>!isFinite(e=Math.floor(e))||!(e>0)?null:Ot(t=>{t.setFullYear(Math.floor(t.getFullYear()/e)*e),t.setMonth(0,1),t.setHours(0,0,0,0)},(t,r)=>{t.setFullYear(t.getFullYear()+r*e)});ji.range;const Si=Ot(e=>{e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCFullYear(e.getUTCFullYear()+t)},(e,t)=>t.getUTCFullYear()-e.getUTCFullYear(),e=>e.getUTCFullYear());Si.every=e=>!isFinite(e=Math.floor(e))||!(e>0)?null:Ot(t=>{t.setUTCFullYear(Math.floor(t.getUTCFullYear()/e)*e),t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)},(t,r)=>{t.setUTCFullYear(t.getUTCFullYear()+r*e)});Si.range;function rC(e,t,r,n,a,o){const c=[[ro,1,pi],[ro,5,5*pi],[ro,15,15*pi],[ro,30,30*pi],[o,1,tn],[o,5,5*tn],[o,15,15*tn],[o,30,30*tn],[a,1,gi],[a,3,3*gi],[a,6,6*gi],[a,12,12*gi],[n,1,ki],[n,2,2*ki],[r,1,j0],[t,1,lS],[t,3,3*lS],[e,1,Mg]];function u(h,m,g){const v=mS).right(c,v);if(b===c.length)return e.every(Jv(h/Mg,m/Mg,g));if(b===0)return Gf.every(Math.max(Jv(h,m,g),1));const[j,k]=c[v/c[b-1][2]53)return null;"w"in ie||(ie.w=1),"Z"in ie?(Fe=Tg(ou(ie.y,0,1)),Oe=Fe.getUTCDay(),Fe=Oe>4||Oe===0?qf.ceil(Fe):qf(Fe),Fe=Yh.offset(Fe,(ie.V-1)*7),ie.y=Fe.getUTCFullYear(),ie.m=Fe.getUTCMonth(),ie.d=Fe.getUTCDate()+(ie.w+6)%7):(Fe=Ig(ou(ie.y,0,1)),Oe=Fe.getDay(),Fe=Oe>4||Oe===0?Vf.ceil(Fe):Vf(Fe),Fe=sc.offset(Fe,(ie.V-1)*7),ie.y=Fe.getFullYear(),ie.m=Fe.getMonth(),ie.d=Fe.getDate()+(ie.w+6)%7)}else("W"in ie||"U"in ie)&&("w"in ie||(ie.w="u"in ie?ie.u%7:"W"in ie?1:0),Oe="Z"in ie?Tg(ou(ie.y,0,1)).getUTCDay():Ig(ou(ie.y,0,1)).getDay(),ie.m=0,ie.d="W"in ie?(ie.w+6)%7+ie.W*7-(Oe+5)%7:ie.w+ie.U*7-(Oe+6)%7);return"Z"in ie?(ie.H+=ie.Z/100|0,ie.M+=ie.Z%100,Tg(ie)):Ig(ie)}}function U(re,xe,_e,ie){for(var Je=0,Fe=xe.length,Oe=_e.length,ut,Jt;Je=Oe)return-1;if(ut=xe.charCodeAt(Je++),ut===37){if(ut=xe.charAt(Je++),Jt=_[ut in uS?xe.charAt(Je++):ut],!Jt||(ie=Jt(re,_e,ie))<0)return-1}else if(ut!=_e.charCodeAt(ie++))return-1}return ie}function B(re,xe,_e){var ie=h.exec(xe.slice(_e));return ie?(re.p=m.get(ie[0].toLowerCase()),_e+ie[0].length):-1}function F(re,xe,_e){var ie=b.exec(xe.slice(_e));return ie?(re.w=j.get(ie[0].toLowerCase()),_e+ie[0].length):-1}function Y(re,xe,_e){var ie=g.exec(xe.slice(_e));return ie?(re.w=v.get(ie[0].toLowerCase()),_e+ie[0].length):-1}function H(re,xe,_e){var ie=N.exec(xe.slice(_e));return ie?(re.m=E.get(ie[0].toLowerCase()),_e+ie[0].length):-1}function pe(re,xe,_e){var ie=k.exec(xe.slice(_e));return ie?(re.m=S.get(ie[0].toLowerCase()),_e+ie[0].length):-1}function ue(re,xe,_e){return U(re,t,xe,_e)}function he(re,xe,_e){return U(re,r,xe,_e)}function ae(re,xe,_e){return U(re,n,xe,_e)}function se(re){return c[re.getDay()]}function X(re){return o[re.getDay()]}function te(re){return f[re.getMonth()]}function J(re){return u[re.getMonth()]}function I(re){return a[+(re.getHours()>=12)]}function M(re){return 1+~~(re.getMonth()/3)}function K(re){return c[re.getUTCDay()]}function ne(re){return o[re.getUTCDay()]}function Z(re){return f[re.getUTCMonth()]}function me(re){return u[re.getUTCMonth()]}function ge(re){return a[+(re.getUTCHours()>=12)]}function Pe(re){return 1+~~(re.getUTCMonth()/3)}return{format:function(re){var xe=O(re+="",A);return xe.toString=function(){return re},xe},parse:function(re){var xe=D(re+="",!1);return xe.toString=function(){return re},xe},utcFormat:function(re){var xe=O(re+="",P);return xe.toString=function(){return re},xe},utcParse:function(re){var xe=D(re+="",!0);return xe.toString=function(){return re},xe}}}var uS={"-":"",_:" ",0:"0"},Bt=/^\s*\d+/,g7=/^%/,v7=/[\\^$*+?|[\]().{}]/g;function Ye(e,t,r){var n=e<0?"-":"",a=(n?-e:e)+"",o=a.length;return n+(o[t.toLowerCase(),r]))}function x7(e,t,r){var n=Bt.exec(t.slice(r,r+1));return n?(e.w=+n[0],r+n[0].length):-1}function b7(e,t,r){var n=Bt.exec(t.slice(r,r+1));return n?(e.u=+n[0],r+n[0].length):-1}function w7(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.U=+n[0],r+n[0].length):-1}function k7(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.V=+n[0],r+n[0].length):-1}function j7(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.W=+n[0],r+n[0].length):-1}function cS(e,t,r){var n=Bt.exec(t.slice(r,r+4));return n?(e.y=+n[0],r+n[0].length):-1}function dS(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.y=+n[0]+(+n[0]>68?1900:2e3),r+n[0].length):-1}function S7(e,t,r){var n=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(t.slice(r,r+6));return n?(e.Z=n[1]?0:-(n[2]+(n[3]||"00")),r+n[0].length):-1}function N7(e,t,r){var n=Bt.exec(t.slice(r,r+1));return n?(e.q=n[0]*3-3,r+n[0].length):-1}function E7(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.m=n[0]-1,r+n[0].length):-1}function fS(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.d=+n[0],r+n[0].length):-1}function A7(e,t,r){var n=Bt.exec(t.slice(r,r+3));return n?(e.m=0,e.d=+n[0],r+n[0].length):-1}function hS(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.H=+n[0],r+n[0].length):-1}function C7(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.M=+n[0],r+n[0].length):-1}function P7(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.S=+n[0],r+n[0].length):-1}function O7(e,t,r){var n=Bt.exec(t.slice(r,r+3));return n?(e.L=+n[0],r+n[0].length):-1}function _7(e,t,r){var n=Bt.exec(t.slice(r,r+6));return n?(e.L=Math.floor(n[0]/1e3),r+n[0].length):-1}function M7(e,t,r){var n=g7.exec(t.slice(r,r+1));return n?r+n[0].length:-1}function I7(e,t,r){var n=Bt.exec(t.slice(r));return n?(e.Q=+n[0],r+n[0].length):-1}function T7(e,t,r){var n=Bt.exec(t.slice(r));return n?(e.s=+n[0],r+n[0].length):-1}function mS(e,t){return Ye(e.getDate(),t,2)}function D7(e,t){return Ye(e.getHours(),t,2)}function R7(e,t){return Ye(e.getHours()%12||12,t,2)}function L7(e,t){return Ye(1+sc.count(ji(e),e),t,3)}function nC(e,t){return Ye(e.getMilliseconds(),t,3)}function $7(e,t){return nC(e,t)+"000"}function z7(e,t){return Ye(e.getMonth()+1,t,2)}function F7(e,t){return Ye(e.getMinutes(),t,2)}function B7(e,t){return Ye(e.getSeconds(),t,2)}function U7(e){var t=e.getDay();return t===0?7:t}function H7(e,t){return Ye(Xh.count(ji(e)-1,e),t,2)}function iC(e){var t=e.getDay();return t>=4||t===0?Qs(e):Qs.ceil(e)}function W7(e,t){return e=iC(e),Ye(Qs.count(ji(e),e)+(ji(e).getDay()===4),t,2)}function K7(e){return e.getDay()}function G7(e,t){return Ye(Vf.count(ji(e)-1,e),t,2)}function V7(e,t){return Ye(e.getFullYear()%100,t,2)}function q7(e,t){return e=iC(e),Ye(e.getFullYear()%100,t,2)}function Q7(e,t){return Ye(e.getFullYear()%1e4,t,4)}function Y7(e,t){var r=e.getDay();return e=r>=4||r===0?Qs(e):Qs.ceil(e),Ye(e.getFullYear()%1e4,t,4)}function X7(e){var t=e.getTimezoneOffset();return(t>0?"-":(t*=-1,"+"))+Ye(t/60|0,"0",2)+Ye(t%60,"0",2)}function pS(e,t){return Ye(e.getUTCDate(),t,2)}function Z7(e,t){return Ye(e.getUTCHours(),t,2)}function J7(e,t){return Ye(e.getUTCHours()%12||12,t,2)}function eB(e,t){return Ye(1+Yh.count(Si(e),e),t,3)}function aC(e,t){return Ye(e.getUTCMilliseconds(),t,3)}function tB(e,t){return aC(e,t)+"000"}function rB(e,t){return Ye(e.getUTCMonth()+1,t,2)}function nB(e,t){return Ye(e.getUTCMinutes(),t,2)}function iB(e,t){return Ye(e.getUTCSeconds(),t,2)}function aB(e){var t=e.getUTCDay();return t===0?7:t}function oB(e,t){return Ye(Zh.count(Si(e)-1,e),t,2)}function oC(e){var t=e.getUTCDay();return t>=4||t===0?Ys(e):Ys.ceil(e)}function sB(e,t){return e=oC(e),Ye(Ys.count(Si(e),e)+(Si(e).getUTCDay()===4),t,2)}function lB(e){return e.getUTCDay()}function uB(e,t){return Ye(qf.count(Si(e)-1,e),t,2)}function cB(e,t){return Ye(e.getUTCFullYear()%100,t,2)}function dB(e,t){return e=oC(e),Ye(e.getUTCFullYear()%100,t,2)}function fB(e,t){return Ye(e.getUTCFullYear()%1e4,t,4)}function hB(e,t){var r=e.getUTCDay();return e=r>=4||r===0?Ys(e):Ys.ceil(e),Ye(e.getUTCFullYear()%1e4,t,4)}function mB(){return"+0000"}function gS(){return"%"}function vS(e){return+e}function yS(e){return Math.floor(+e/1e3)}var cs,sC,lC;pB({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});function pB(e){return cs=p7(e),sC=cs.format,cs.parse,lC=cs.utcFormat,cs.utcParse,cs}function gB(e){return new Date(e)}function vB(e){return e instanceof Date?+e:+new Date(+e)}function O0(e,t,r,n,a,o,c,u,f,h){var m=g0(),g=m.invert,v=m.domain,b=h(".%L"),j=h(":%S"),k=h("%I:%M"),S=h("%I %p"),N=h("%a %d"),E=h("%b %d"),A=h("%B"),P=h("%Y");function _(O){return(f(O)t(a/(e.length-1)))},r.quantiles=function(n){return Array.from({length:n+1},(a,o)=>a9(e,o/n))},r.copy=function(){return fC(t).domain(e)},Ci.apply(r,arguments)}function em(){var e=0,t=.5,r=1,n=1,a,o,c,u,f,h=gr,m,g=!1,v;function b(k){return isNaN(k=+k)?v:(k=.5+((k=+m(k))-o)*(n*k{if(e!=null){var n=e.scale,a=e.type;if(n==="auto")return a==="category"&&r&&(r.indexOf("LineChart")>=0||r.indexOf("AreaChart")>=0||r.indexOf("ComposedChart")>=0&&!t)?"point":a==="category"?"band":"linear";if(typeof n=="string")return SB(n)?n:"point"}};function NB(e,t){for(var r=0,n=e.length,a=e[0]t)?r=o+1:n=o}return r}function yC(e,t){if(e){var r=t??e.domain(),n=r.map(o=>{var c;return(c=e(o))!==null&&c!==void 0?c:0}),a=e.range();if(!(r.length===0||a.length<2))return o=>{var c,u,f=NB(n,o);if(f<=0)return r[0];if(f>=r.length)return r[r.length-1];var h=(c=n[f-1])!==null&&c!==void 0?c:0,m=(u=n[f])!==null&&u!==void 0?u:0;return Math.abs(o-h)<=Math.abs(o-m)?r[f-1]:r[f]}}}function EB(e){if(e!=null)return"invert"in e&&typeof e.invert=="function"?e.invert.bind(e):yC(e,void 0)}function bS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function Qf(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);re.cartesianAxis.xAxis[t],Pi=(e,t)=>{var r=bC(e,t);return r??Ct},Pt={allowDataOverflow:!1,allowDecimals:!0,allowDuplicatedCategory:!0,angle:0,dataKey:void 0,domain:iy,hide:!0,id:0,includeHidden:!1,interval:"preserveEnd",minTickGap:5,mirror:!1,name:void 0,orientation:"left",padding:{top:0,bottom:0},reversed:!1,scale:"auto",tick:!0,tickCount:5,tickFormatter:void 0,ticks:void 0,type:"number",unit:void 0,niceTicks:"auto",width:Ju},wC=(e,t)=>e.cartesianAxis.yAxis[t],Oi=(e,t)=>{var r=wC(e,t);return r??Pt},TB={domain:[0,"auto"],includeHidden:!1,reversed:!1,allowDataOverflow:!1,allowDuplicatedCategory:!1,dataKey:void 0,id:0,name:"",range:[64,64],scale:"auto",type:"number",unit:""},T0=(e,t)=>{var r=e.cartesianAxis.zAxis[t];return r??TB},yr=(e,t,r)=>{switch(t){case"xAxis":return Pi(e,r);case"yAxis":return Oi(e,r);case"zAxis":return T0(e,r);case"angleAxis":return i0(e,r);case"radiusAxis":return a0(e,r);default:throw new Error("Unexpected axis type: ".concat(t))}},DB=(e,t,r)=>{switch(t){case"xAxis":return Pi(e,r);case"yAxis":return Oi(e,r);default:throw new Error("Unexpected axis type: ".concat(t))}},lc=(e,t,r)=>{switch(t){case"xAxis":return Pi(e,r);case"yAxis":return Oi(e,r);case"angleAxis":return i0(e,r);case"radiusAxis":return a0(e,r);default:throw new Error("Unexpected axis type: ".concat(t))}},kC=e=>e.graphicalItems.cartesianItems.some(t=>t.type==="bar")||e.graphicalItems.polarItems.some(t=>t.type==="radialBar");function jC(e,t){return r=>{switch(e){case"xAxis":return"xAxisId"in r&&r.xAxisId===t;case"yAxis":return"yAxisId"in r&&r.yAxisId===t;case"zAxis":return"zAxisId"in r&&r.zAxisId===t;case"angleAxis":return"angleAxisId"in r&&r.angleAxisId===t;case"radiusAxis":return"radiusAxisId"in r&&r.radiusAxisId===t;default:return!1}}}var SC=e=>e.graphicalItems.cartesianItems,RB=q([zt,Gh],jC),NC=(e,t,r)=>e.filter(r).filter(n=>(t==null?void 0:t.includeHidden)===!0?!0:!n.hide),ll=q([SC,yr,RB],NC,{memoizeOptions:{resultEqualityCheck:qh}}),EC=q([ll],e=>e.filter(t=>t.type==="area"||t.type==="bar").filter(l0)),AC=e=>e.filter(t=>!("stackId"in t)||t.stackId===void 0),LB=q([ll],AC),CC=e=>e.map(t=>t.data).filter(Boolean).flat(1),$B=q([ll],e=>e.some(t=>!t.data)),PC=q([ll],CC,{memoizeOptions:{resultEqualityCheck:qh}}),OC=(e,t)=>{var r=t.chartData,n=r===void 0?[]:r,a=t.dataStartIndex,o=t.dataEndIndex;return e.length>0?e:n.slice(a,o+1)},D0=q([PC,Bh],OC),zB=(e,t,r)=>(t==null?void 0:t.dataKey)!=null?e.map(n=>({value:Lt(n,t.dataKey)})):r.length>0?r.map(n=>n.dataKey).flatMap(n=>e.map(a=>({value:Lt(a,n)}))):e.map(n=>({value:n})),_C=(e,t,r,n,a,o)=>{var c=n.chartData,u=c===void 0?[]:c,f=n.dataStartIndex,h=n.dataEndIndex,m=zB(e,t,r);if(a&&(t==null?void 0:t.dataKey)!=null&&o.length>0){var g=u.slice(f,h+1),v=g.map(b=>({value:Lt(b,t.dataKey)})).filter(b=>b.value!=null);return[...v,...m]}return m},uc=q([D0,yr,ll,Bh,$B,PC],_C);function Es(e){if(Gn(e)||e instanceof Date){var t=Number(e);if(We(t))return t}}function kS(e){if(Array.isArray(e)){var t=[Es(e[0]),Es(e[1])];return Bn(t)?t:void 0}var r=Es(e);if(r!=null)return[r,r]}function Qn(e){return e.map(Es).filter(Ar)}function FB(e,t){var r=Es(e),n=Es(t);return r==null&&n==null?0:r==null?-1:n==null?1:r-n}var BB=q([uc],e=>e==null?void 0:e.map(t=>t.value).sort(FB));function MC(e,t){switch(e){case"xAxis":return t.direction==="x";case"yAxis":return t.direction==="y";default:return!1}}function UB(e,t,r){if(!r)return[];if(!r.length)return[];var n;if(typeof t=="number"&&!Kn(t))n=t;else if(Array.isArray(t)){var a=Qn(t);a.length>0&&(n=Math.max(...a))}return n==null?[]:Qn(r.flatMap(o=>{var c=Lt(e,o.dataKey),u,f;if(Array.isArray(c)){var h=xC(c,2);u=h[0],f=h[1]}else u=f=c;if(!(!We(u)||!We(f)))return[n-u,n+f]}))}var _t=e=>{var t=Ft(e),r=ol(e);return lc(e,t,r)},Xs=q([_t],e=>e==null?void 0:e.dataKey),HB=q([EC,Bh,_t],RA),IC=(e,t,r,n)=>{var a={},o=t.reduce((c,u)=>{if(u.stackId==null)return c;var f=c[u.stackId];return f==null&&(f=[]),f.push(u),c[u.stackId]=f,c},a);return Object.fromEntries(Object.entries(o).map(c=>{var u=xC(c,2),f=u[0],h=u[1],m=n?[...h].reverse():h,g=m.map(s0);return[f,{stackedData:sz(e,g,r),graphicalItems:m}]}))},TC=q([HB,EC,Uh,PA],IC),DC=(e,t,r,n)=>{var a=t.dataStartIndex,o=t.dataEndIndex;if(n==null&&r!=="zAxis")return dz(e,a,o)},WB=q([yr],e=>e.allowDataOverflow),R0=e=>{var t;if(e==null||!("domain"in e))return iy;if(e.domain!=null)return e.domain;if("ticks"in e&&e.ticks!=null){if(e.type==="number"){var r=Qn(e.ticks);return[Math.min(...r),Math.max(...r)]}if(e.type==="category")return e.ticks.map(String)}return(t=e==null?void 0:e.domain)!==null&&t!==void 0?t:iy},RC=q([yr],R0),LC=q([RC,WB],yA),KB=q([TC,Nn,zt,LC],DC,{memoizeOptions:{resultEqualityCheck:Vh}}),L0=e=>e.errorBars,GB=(e,t,r)=>e.flatMap(n=>t[n.id]).filter(Boolean).filter(n=>MC(r,n)),Yf=function(){for(var t=arguments.length,r=new Array(t),n=0;n5&&arguments[5]!==void 0?arguments[5]:[],u,f;if(n.length>0&&n.forEach(h=>{var m,g=h.data!=null?[...h.data]:c,v=(m=a[h.id])===null||m===void 0?void 0:m.filter(b=>MC(o,b));g.forEach(b=>{var j,k=Lt(b,(j=r.dataKey)!==null&&j!==void 0?j:h.dataKey),S=UB(b,k,v);if(S.length>=2){var N=Math.min(...S),E=Math.max(...S);(u==null||Nf)&&(f=E)}var A=kS(k);A!=null&&(u=u==null?A[0]:Math.min(u,A[0]),f=f==null?A[1]:Math.max(f,A[1]))})}),(r==null?void 0:r.dataKey)!=null&&n.length===0&&t.forEach(h=>{var m=kS(Lt(h,r.dataKey));m!=null&&(u=u==null?m[0]:Math.min(u,m[0]),f=f==null?m[1]:Math.max(f,m[1]))}),We(u)&&We(f))return[u,f]},VB=q([D0,yr,LB,L0,zt,jF],$C,{memoizeOptions:{resultEqualityCheck:Vh}});function qB(e){var t=e.value;if(Gn(t)||t instanceof Date)return t}var QB=(e,t,r)=>{var n=e.map(qB).filter(a=>a!=null);return r&&(t.dataKey==null||t.allowDuplicatedCategory&&QE(n))?vA(0,e.length):t.allowDuplicatedCategory?n:Array.from(new Set(n))},zC=e=>e.referenceElements.dots,ul=(e,t,r)=>e.filter(n=>n.ifOverflow==="extendDomain").filter(n=>t==="xAxis"?n.xAxisId===r:n.yAxisId===r),YB=q([zC,zt,Gh],ul),FC=e=>e.referenceElements.areas,XB=q([FC,zt,Gh],ul),BC=e=>e.referenceElements.lines,ZB=q([BC,zt,Gh],ul),UC=(e,t)=>{if(e!=null){var r=Qn(e.map(n=>t==="xAxis"?n.x:n.y));if(r.length!==0)return[Math.min(...r),Math.max(...r)]}},JB=q(YB,zt,UC),HC=(e,t)=>{if(e!=null){var r=Qn(e.flatMap(n=>[t==="xAxis"?n.x1:n.y1,t==="xAxis"?n.x2:n.y2]));if(r.length!==0)return[Math.min(...r),Math.max(...r)]}},eU=q([XB,zt],HC);function tU(e){var t;if(e.x!=null)return Qn([e.x]);var r=(t=e.segment)===null||t===void 0?void 0:t.map(n=>n.x);return r==null||r.length===0?[]:Qn(r)}function rU(e){var t;if(e.y!=null)return Qn([e.y]);var r=(t=e.segment)===null||t===void 0?void 0:t.map(n=>n.y);return r==null||r.length===0?[]:Qn(r)}var WC=(e,t)=>{if(e!=null){var r=e.flatMap(n=>t==="xAxis"?tU(n):rU(n));if(r.length!==0)return[Math.min(...r),Math.max(...r)]}},nU=q([ZB,zt],WC),iU=q(JB,nU,eU,(e,t,r)=>Yf(e,r,t)),KC=(e,t,r,n,a,o,c,u)=>{if(r!=null)return r;var f=c==="vertical"&&u==="xAxis"||c==="horizontal"&&u==="yAxis",h=f?Yf(n,o,a):Yf(o,a);return PF(t,h,e.allowDataOverflow)},aU=q([yr,RC,LC,KB,VB,iU,ft,zt],KC,{memoizeOptions:{resultEqualityCheck:Vh}}),oU=[0,1],GC=(e,t,r,n,a,o,c)=>{if(!((e==null||r==null||r.length===0)&&c===void 0)){var u=e.dataKey,f=e.type,h=Xn(t,o);if(h&&u==null){var m;return vA(0,(m=r==null?void 0:r.length)!==null&&m!==void 0?m:0)}return f==="category"?QB(n,e,h):a==="expand"&&!h?oU:c}},$0=q([yr,ft,D0,uc,Uh,zt,aU],GC),cl=q([yr,kC,t0],vC),VC=(e,t,r)=>{var n=t.niceTicks;if(n!=="none"){var a=R0(t),o=Array.isArray(a)&&(a[0]==="auto"||a[1]==="auto");if((n==="snap125"||n==="adaptive")&&t!=null&&t.tickCount&&Bn(e)){if(o)return _j(e,t.tickCount,t.allowDecimals,n);if(t.type==="number")return Mj(e,t.tickCount,t.allowDecimals,n)}if(n==="auto"&&r==="linear"&&t!=null&&t.tickCount){if(o&&Bn(e))return _j(e,t.tickCount,t.allowDecimals,"adaptive");if(t.type==="number"&&Bn(e))return Mj(e,t.tickCount,t.allowDecimals,"adaptive")}}},z0=q([$0,lc,cl],VC),qC=(e,t,r,n)=>{if(n!=="angleAxis"&&(e==null?void 0:e.type)==="number"&&Bn(t)&&Array.isArray(r)&&r.length>0){var a,o,c=t[0],u=(a=r[0])!==null&&a!==void 0?a:0,f=t[1],h=(o=r[r.length-1])!==null&&o!==void 0?o:0;return[Math.min(c,u),Math.max(f,h)]}return t},sU=q([yr,$0,z0,zt],qC),lU=q(uc,yr,(e,t)=>{if(!(!t||t.type!=="number")){var r=1/0,n=Array.from(Qn(e.map(g=>g.value))).sort((g,v)=>g-v),a=n[0],o=n[n.length-1];if(a==null||o==null)return 1/0;var c=o-a;if(c===0)return 1/0;for(var u=0;ua,(e,t,r,n,a)=>{if(!We(e))return 0;var o=t==="vertical"?n.height:n.width;if(a==="gap")return e*o/2;if(a==="no-gap"){var c=Sa(r,e*o),u=e*o/2;return u-c-(u-c)/o*c}return 0}),uU=(e,t,r)=>{var n=Pi(e,t);return n==null||typeof n.padding!="string"?0:QC(e,"xAxis",t,r,n.padding)},cU=(e,t,r)=>{var n=Oi(e,t);return n==null||typeof n.padding!="string"?0:QC(e,"yAxis",t,r,n.padding)},dU=q(Pi,uU,(e,t)=>{var r,n;if(e==null)return{left:0,right:0};var a=e.padding;return typeof a=="string"?{left:t,right:t}:{left:((r=a.left)!==null&&r!==void 0?r:0)+t,right:((n=a.right)!==null&&n!==void 0?n:0)+t}}),fU=q(Oi,cU,(e,t)=>{var r,n;if(e==null)return{top:0,bottom:0};var a=e.padding;return typeof a=="string"?{top:t,bottom:t}:{top:((r=a.top)!==null&&r!==void 0?r:0)+t,bottom:((n=a.bottom)!==null&&n!==void 0?n:0)+t}}),YC=q([Zt,dU,Dh,Th,(e,t,r)=>r],(e,t,r,n,a)=>{var o=n.padding;return a?[o.left,r.width-o.right]:[e.left+t.left,e.left+e.width-t.right]}),XC=q([Zt,ft,fU,Dh,Th,(e,t,r)=>r],(e,t,r,n,a,o)=>{var c=a.padding;return o?[n.height-c.bottom,c.top]:t==="horizontal"?[e.top+e.height-r.bottom,e.top+r.top]:[e.top+r.top,e.top+e.height-r.bottom]}),cc=(e,t,r,n)=>{var a;switch(t){case"xAxis":return YC(e,r,n);case"yAxis":return XC(e,r,n);case"zAxis":return(a=T0(e,r))===null||a===void 0?void 0:a.range;case"angleAxis":return IA(e);case"radiusAxis":return TA(e,r);default:return}},ZC=q([yr,cc],Hh),hU=q([cl,sU],VF),F0=q([yr,cl,hU,ZC],I0),JC=(e,t,r,n)=>{if(!(r==null||r.dataKey==null)){var a=r.type,o=r.scale,c=Xn(e,n);if(c&&(a==="number"||o!=="auto"))return t.map(u=>u.value)}},B0=q([ft,uc,lc,zt],JC),tm=q([F0],u0);q([F0],EB);q([F0,BB],yC);q([ll,L0,zt],GB);function eP(e,t){return e.idt.id?1:0}var rm=(e,t)=>t,nm=(e,t,r)=>r,mU=q(Mh,rm,nm,(e,t,r)=>e.filter(n=>n.orientation===t).filter(n=>n.mirror===r).sort(eP)),pU=q(Ih,rm,nm,(e,t,r)=>e.filter(n=>n.orientation===t).filter(n=>n.mirror===r).sort(eP)),tP=(e,t)=>({width:e.width,height:t.height}),gU=(e,t)=>{var r=typeof t.width=="number"?t.width:Ju;return{width:r,height:e.height}},vU=q(Zt,Pi,tP),yU=(e,t,r)=>{switch(t){case"top":return e.top;case"bottom":return r-e.bottom;default:return 0}},xU=(e,t,r)=>{switch(t){case"left":return e.left;case"right":return r-e.right;default:return 0}},bU=q(Ai,Zt,mU,rm,nm,(e,t,r,n,a)=>{var o={},c;return r.forEach(u=>{var f=tP(t,u);c==null&&(c=yU(t,n,e));var h=n==="top"&&!a||n==="bottom"&&a;o[u.id]=c-Number(h)*f.height,c+=(h?-1:1)*f.height}),o}),wU=q(Ei,Zt,pU,rm,nm,(e,t,r,n,a)=>{var o={},c;return r.forEach(u=>{var f=gU(t,u);c==null&&(c=xU(t,n,e));var h=n==="left"&&!a||n==="right"&&a;o[u.id]=c-Number(h)*f.width,c+=(h?-1:1)*f.width}),o}),kU=(e,t)=>{var r=Pi(e,t);if(r!=null)return bU(e,r.orientation,r.mirror)},jU=q([Zt,Pi,kU,(e,t)=>t],(e,t,r,n)=>{if(t!=null){var a=r==null?void 0:r[n];return a==null?{x:e.left,y:0}:{x:e.left,y:a}}}),SU=(e,t)=>{var r=Oi(e,t);if(r!=null)return wU(e,r.orientation,r.mirror)},NU=q([Zt,Oi,SU,(e,t)=>t],(e,t,r,n)=>{if(t!=null){var a=r==null?void 0:r[n];return a==null?{x:0,y:e.top}:{x:a,y:e.top}}}),EU=q(Zt,Oi,(e,t)=>{var r=typeof t.width=="number"?t.width:Ju;return{width:r,height:e.height}}),rP=(e,t,r,n)=>{if(r!=null){var a=r.allowDuplicatedCategory,o=r.type,c=r.dataKey,u=Xn(e,n),f=t.map(m=>m.value),h=f.filter(m=>m!=null);if(c&&u&&o==="category"&&a&&QE(h))return f}},U0=q([ft,uc,yr,zt],rP),jS=q([ft,DB,cl,tm,U0,B0,cc,z0,zt],(e,t,r,n,a,o,c,u,f)=>{if(t!=null){var h=Xn(e,f);return{angle:t.angle,interval:t.interval,minTickGap:t.minTickGap,orientation:t.orientation,tick:t.tick,tickCount:t.tickCount,tickFormatter:t.tickFormatter,ticks:t.ticks,type:t.type,unit:t.unit,axisType:f,categoricalDomain:o,duplicateDomain:a,isCategorical:h,niceTicks:u,range:c,realScaleType:r,scale:n}}}),AU=(e,t,r,n,a,o,c,u,f)=>{if(!(t==null||n==null)){var h=Xn(e,f),m=t.type,g=t.ticks,v=t.tickCount,b=r==="scaleBand"&&typeof n.bandwidth=="function"?n.bandwidth()/2:2,j=m==="category"&&n.bandwidth?n.bandwidth()/b:0;j=f==="angleAxis"&&o!=null&&o.length>=2?Jr(o[0]-o[1])*2*j:j;var k=g||a;return k?k.map((S,N)=>{var E=c?c.indexOf(S):S,A=n.map(E);return We(A)?{index:N,coordinate:A+j,value:S,offset:j}:null}).filter(Ar):h&&u?u.map((S,N)=>{var E=n.map(S);return We(E)?{coordinate:E+j,value:S,index:N,offset:j}:null}).filter(Ar):n.ticks?n.ticks(v).map((S,N)=>{var E=n.map(S);return We(E)?{coordinate:E+j,value:S,index:N,offset:j}:null}).filter(Ar):n.domain().map((S,N)=>{var E=n.map(S);return We(E)?{coordinate:E+j,value:c?c[S]:S,index:N,offset:j}:null}).filter(Ar)}},nP=q([ft,lc,cl,tm,z0,cc,U0,B0,zt],AU),CU=(e,t,r,n,a,o,c)=>{if(!(t==null||r==null||n==null||n[0]===n[1])){var u=Xn(e,c),f=t.tickCount,h=0;return h=c==="angleAxis"&&(n==null?void 0:n.length)>=2?Jr(n[0]-n[1])*2*h:h,u&&o?o.map((m,g)=>{var v=r.map(m);return We(v)?{coordinate:v+h,value:m,index:g,offset:h}:null}).filter(Ar):r.ticks?r.ticks(f).map((m,g)=>{var v=r.map(m);return We(v)?{coordinate:v+h,value:m,index:g,offset:h}:null}).filter(Ar):r.domain().map((m,g)=>{var v=r.map(m);return We(v)?{coordinate:v+h,value:a?a[m]:m,index:g,offset:h}:null}).filter(Ar)}},iP=q([ft,lc,tm,cc,U0,B0,zt],CU),aP=q(yr,tm,(e,t)=>{if(!(e==null||t==null))return Qf(Qf({},e),{},{scale:t})}),PU=q([yr,cl,$0,ZC],I0),OU=q([PU],u0);q((e,t,r)=>T0(e,r),OU,(e,t)=>{if(!(e==null||t==null))return Qf(Qf({},e),{},{scale:t})});var _U=q([ft,Mh,Ih],(e,t,r)=>{switch(e){case"horizontal":return t.some(n=>n.reversed)?"right-to-left":"left-to-right";case"vertical":return r.some(n=>n.reversed)?"bottom-to-top":"top-to-bottom";case"centric":case"radial":return"left-to-right";default:return}}),MU=(e,t,r)=>{var n;return(n=e.renderedTicks[t])===null||n===void 0?void 0:n[r]};q([MU],e=>{if(!(!e||e.length===0))return t=>{var r,n=1/0,a=e[0];for(var o of e){var c=Math.abs(o.coordinate-t);ce.options.defaultTooltipEventType,sP=e=>e.options.validateTooltipEventTypes;function lP(e,t,r){if(e==null)return t;var n=e?"axis":"item";return r==null?t:r.includes(n)?n:t}function dc(e,t){var r=oP(e),n=sP(e);return lP(t,r,n)}function IU(e){return Me(t=>dc(t,e))}var uP=(e,t)=>{var r,n=Number(t);if(!(Kn(n)||t==null))return n>=0?e==null||(r=e[n])===null||r===void 0?void 0:r.value:void 0},TU=e=>e.tooltip.settings,la={active:!1,index:null,dataKey:void 0,graphicalItemId:void 0,coordinate:void 0},DU={itemInteraction:{click:la,hover:la},axisInteraction:{click:la,hover:la},keyboardInteraction:la,syncInteraction:{active:!1,index:null,dataKey:void 0,label:void 0,coordinate:void 0,sourceViewBox:void 0,graphicalItemId:void 0},tooltipItemPayloads:[],settings:{shared:void 0,trigger:"hover",axisId:0,active:!1,defaultIndex:void 0}},cP=lr({name:"tooltip",initialState:DU,reducers:{addTooltipEntrySettings:{reducer(e,t){e.tooltipItemPayloads.push(t.payload)},prepare:st()},replaceTooltipEntrySettings:{reducer(e,t){var r=t.payload,n=r.prev,a=r.next,o=en(e).tooltipItemPayloads.indexOf(n);o>-1&&(e.tooltipItemPayloads[o]=a)},prepare:st()},removeTooltipEntrySettings:{reducer(e,t){var r=en(e).tooltipItemPayloads.indexOf(t.payload);r>-1&&e.tooltipItemPayloads.splice(r,1)},prepare:st()},setTooltipSettingsState(e,t){e.settings=t.payload},setActiveMouseOverItemIndex(e,t){e.syncInteraction.active=!1,e.syncInteraction.sourceViewBox=void 0,e.keyboardInteraction.active=!1,e.itemInteraction.hover.active=!0,e.itemInteraction.hover.index=t.payload.activeIndex,e.itemInteraction.hover.dataKey=t.payload.activeDataKey,e.itemInteraction.hover.graphicalItemId=t.payload.activeGraphicalItemId,e.itemInteraction.hover.coordinate=t.payload.activeCoordinate},mouseLeaveChart(e){e.itemInteraction.hover.active=!1,e.axisInteraction.hover.active=!1},mouseLeaveItem(e){e.itemInteraction.hover.active=!1},setActiveClickItemIndex(e,t){e.syncInteraction.active=!1,e.syncInteraction.sourceViewBox=void 0,e.itemInteraction.click.active=!0,e.keyboardInteraction.active=!1,e.itemInteraction.click.index=t.payload.activeIndex,e.itemInteraction.click.dataKey=t.payload.activeDataKey,e.itemInteraction.click.graphicalItemId=t.payload.activeGraphicalItemId,e.itemInteraction.click.coordinate=t.payload.activeCoordinate},setMouseOverAxisIndex(e,t){e.syncInteraction.active=!1,e.syncInteraction.sourceViewBox=void 0,e.axisInteraction.hover.active=!0,e.keyboardInteraction.active=!1,e.axisInteraction.hover.index=t.payload.activeIndex,e.axisInteraction.hover.dataKey=t.payload.activeDataKey,e.axisInteraction.hover.coordinate=t.payload.activeCoordinate},setMouseClickAxisIndex(e,t){e.syncInteraction.active=!1,e.syncInteraction.sourceViewBox=void 0,e.keyboardInteraction.active=!1,e.axisInteraction.click.active=!0,e.axisInteraction.click.index=t.payload.activeIndex,e.axisInteraction.click.dataKey=t.payload.activeDataKey,e.axisInteraction.click.coordinate=t.payload.activeCoordinate},setSyncInteraction(e,t){e.syncInteraction=t.payload},setKeyboardInteraction(e,t){e.keyboardInteraction.active=t.payload.active,e.keyboardInteraction.index=t.payload.activeIndex,e.keyboardInteraction.coordinate=t.payload.activeCoordinate}}}),ln=cP.actions,RU=ln.addTooltipEntrySettings,LU=ln.replaceTooltipEntrySettings,$U=ln.removeTooltipEntrySettings,zU=ln.setTooltipSettingsState,FU=ln.setActiveMouseOverItemIndex;ln.mouseLeaveItem;var dP=ln.mouseLeaveChart;ln.setActiveClickItemIndex;var fP=ln.setMouseOverAxisIndex,BU=ln.setMouseClickAxisIndex,gu=ln.setSyncInteraction,Xf=ln.setKeyboardInteraction,UU=cP.reducer;function SS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function Wd(e){for(var t=1;t{if(t==null)return la;var a=GU(e,t,r);if(a==null)return la;if(a.active)return a;if(e.keyboardInteraction.active)return e.keyboardInteraction;if(e.syncInteraction.active&&e.syncInteraction.index!=null)return e.syncInteraction;var o=e.settings.active===!0;if(VU(a)){if(o)return Wd(Wd({},a),{},{active:!0})}else if(n!=null)return{active:!0,coordinate:void 0,dataKey:void 0,index:n,graphicalItemId:void 0};return Wd(Wd({},la),{},{coordinate:a.coordinate})};function qU(e){if(typeof e=="number")return Number.isFinite(e)?e:void 0;if(e instanceof Date){var t=e.valueOf();return Number.isFinite(t)?t:void 0}var r=Number(e);return Number.isFinite(r)?r:void 0}function QU(e,t){var r=qU(e),n=t[0],a=t[1];if(r===void 0)return!1;var o=Math.min(n,a),c=Math.max(n,a);return r>=o&&r<=c}function YU(e,t,r){if(r==null||t==null)return!0;var n=Lt(e,t);return n==null||!Bn(r)?!0:QU(n,r)}var xu=(e,t,r,n)=>{var a=e==null?void 0:e.index;if(a==null)return null;var o=Number(a);if(!We(o))return a;var c=0,u=1/0;t.length>0&&(u=t.length-1);var f=Math.max(c,Math.min(o,u)),h=t[f];return h==null||YU(h,r,n)?String(f):null},mP=(e,t,r,n,a,o,c)=>{if(o!=null){var u=c[0],f=u==null?void 0:u.getPosition(o);if(f!=null)return f;var h=a==null?void 0:a[Number(o)];if(h)switch(r){case"horizontal":return{x:h.coordinate,y:(n.top+t)/2};default:return{x:(n.left+e)/2,y:h.coordinate}}}},pP=(e,t,r,n)=>{if(t==="axis")return e.tooltipItemPayloads;if(e.tooltipItemPayloads.length===0)return[];var a;if(r==="hover"?a=e.itemInteraction.hover.graphicalItemId:a=e.itemInteraction.click.graphicalItemId,e.syncInteraction.active&&a==null)return e.tooltipItemPayloads;if(a==null&&(n!=null||e.keyboardInteraction.active)){var o=e.tooltipItemPayloads[0];return o!=null?[o]:[]}return e.tooltipItemPayloads.filter(c=>{var u;return((u=c.settings)===null||u===void 0?void 0:u.graphicalItemId)===a})},gP=e=>e.options.tooltipPayloadSearcher,dl=e=>e.tooltip;function NS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function ES(e){for(var t=1;te(t)}function AS(e){if(typeof e=="string")return e}function nH(e){if(!(e==null||typeof e!="object")){var t="name"in e?eH(e.name):void 0,r="unit"in e?tH(e.unit):void 0,n="dataKey"in e?rH(e.dataKey):void 0,a="payload"in e?e.payload:void 0,o="color"in e?AS(e.color):void 0,c="fill"in e?AS(e.fill):void 0;return{name:t,unit:r,dataKey:n,payload:a,color:o,fill:c}}}function iH(e,t){return e??t}var vP=(e,t,r,n,a,o,c)=>{if(!(t==null||o==null)){var u=r.chartData,f=r.computedData,h=r.dataStartIndex,m=r.dataEndIndex,g=[];return e.reduce((v,b)=>{var j,k=b.dataDefinedOnItem,S=b.settings,N=iH(k,u),E=Array.isArray(N)?U5(N,h,m):N,A=(j=S==null?void 0:S.dataKey)!==null&&j!==void 0?j:n,P=S==null?void 0:S.nameKey,_;if(n&&Array.isArray(E)&&!Array.isArray(E[0])&&c==="axis"?_=YE(E,n,a):_=o(E,t,f,P),Array.isArray(_))_.forEach(D=>{var U,B,F=nH(D),Y=F==null?void 0:F.name,H=F==null?void 0:F.dataKey,pe=F==null?void 0:F.payload,ue=ES(ES({},S),{},{name:Y,unit:F==null?void 0:F.unit,color:(U=F==null?void 0:F.color)!==null&&U!==void 0?U:S==null?void 0:S.color,fill:(B=F==null?void 0:F.fill)!==null&&B!==void 0?B:S==null?void 0:S.fill});v.push(wk({tooltipEntrySettings:ue,dataKey:H,payload:pe,value:Lt(pe,H),name:Y==null?void 0:String(Y)}))});else{var O;v.push(wk({tooltipEntrySettings:S,dataKey:A,payload:_,value:Lt(_,A),name:(O=Lt(_,P))!==null&&O!==void 0?O:S==null?void 0:S.name}))}return v},g)}},H0=q([_t,kC,t0],vC),aH=q([e=>e.graphicalItems.cartesianItems,e=>e.graphicalItems.polarItems],(e,t)=>[...e,...t]),oH=q([Ft,ol],jC),Io=q([aH,_t,oH],NC,{memoizeOptions:{resultEqualityCheck:qh}}),sH=q([Io],e=>e.filter(l0)),yP=q([Io],CC,{memoizeOptions:{resultEqualityCheck:qh}}),lH=q([Io],e=>e.some(t=>!t.data)),No=q([yP,Nn],OC),uH=q([sH,Nn,_t],RA),W0=q([No,_t,Io,Nn,lH,yP],_C),xP=q([_t],R0),cH=q([_t],e=>e.allowDataOverflow),bP=q([xP,cH],yA),dH=q([Io],e=>e.filter(l0)),fH=q([uH,dH,Uh,PA],IC),hH=q([fH,Nn,Ft,bP],DC),mH=q([Io],AC),pH=q([No,_t,mH,L0,Ft,SF],$C,{memoizeOptions:{resultEqualityCheck:Vh}}),gH=q([zC,Ft,ol],ul),vH=q([gH,Ft],UC),yH=q([FC,Ft,ol],ul),xH=q([yH,Ft],HC),bH=q([BC,Ft,ol],ul),wH=q([bH,Ft],WC),kH=q([vH,wH,xH],Yf),jH=q([_t,xP,bP,hH,pH,kH,ft,Ft],KC),Zs=q([_t,ft,No,W0,Uh,Ft,jH],GC),SH=q([Zs,_t,H0],VC),NH=q([_t,Zs,SH,Ft],qC),wP=e=>{var t=Ft(e),r=ol(e),n=!1;return cc(e,t,r,n)},kP=q([_t,wP],Hh),EH=q([_t,H0,NH,kP],I0),jP=q([EH],u0),AH=q([ft,W0,_t,Ft],rP),CH=q([ft,W0,_t,Ft],JC),PH=(e,t,r,n,a,o,c,u)=>{if(t){var f=t.type,h=Xn(e,u);if(n){var m=r==="scaleBand"&&n.bandwidth?n.bandwidth()/2:2,g=f==="category"&&n.bandwidth?n.bandwidth()/m:0;return g=u==="angleAxis"&&a!=null&&(a==null?void 0:a.length)>=2?Jr(a[0]-a[1])*2*g:g,h&&c?c.map((v,b)=>{var j=n.map(v);return We(j)?{coordinate:j+g,value:v,index:b,offset:g}:null}).filter(Ar):n.domain().map((v,b)=>{var j=n.map(v);return We(j)?{coordinate:j+g,value:o?o[v]:v,index:b,offset:g}:null}).filter(Ar)}}},_i=q([ft,_t,H0,jP,wP,AH,CH,Ft],PH),K0=q([oP,sP,TU],(e,t,r)=>lP(r.shared,e,t)),SP=e=>e.tooltip.settings.trigger,G0=e=>e.tooltip.settings.defaultIndex,fc=q([dl,K0,SP,G0],hP),Fu=q([fc,No,Xs,Zs],xu),NP=q([_i,Fu],uP),OH=q([fc],e=>{if(e)return e.dataKey}),_H=q([fc],e=>{if(e)return e.graphicalItemId}),EP=q([dl,K0,SP,G0],pP),MH=q([Ei,Ai,ft,Zt,_i,G0,EP],mP),IH=q([fc,MH],(e,t)=>e!=null&&e.coordinate?e.coordinate:t),TH=q([fc],e=>{var t;return(t=e==null?void 0:e.active)!==null&&t!==void 0?t:!1}),DH=q([EP,Fu,Nn,Xs,NP,gP,K0],vP),RH=q([DH],e=>{if(e!=null){var t=e.map(r=>r.payload).filter(r=>r!=null);return Array.from(new Set(t))}});function CS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function PS(e){for(var t=1;tMe(_t),BH=()=>{var e=FH(),t=Me(_i),r=Me(jP);return Af(!e||!r?void 0:PS(PS({},e),{},{scale:r}),t)};function OS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function ds(e){for(var t=1;t{var a=t.find(o=>o&&o.index===r);if(a){if(e==="horizontal")return{x:a.coordinate,y:n.relativeY};if(e==="vertical")return{x:n.relativeX,y:a.coordinate}}return{x:0,y:0}},GH=(e,t,r,n)=>{var a=t.find(h=>h&&h.index===r);if(a){if(e==="centric"){var o=a.coordinate,c=n.radius;return ds(ds(ds({},n),Qt(n.cx,n.cy,c,o)),{},{angle:o,radius:c})}var u=a.coordinate,f=n.angle;return ds(ds(ds({},n),Qt(n.cx,n.cy,u,f)),{},{angle:f,radius:u})}return{angle:0,clockWise:!1,cx:0,cy:0,endAngle:0,innerRadius:0,outerRadius:0,radius:0,startAngle:0,x:0,y:0}};function VH(e,t){var r=e.relativeX,n=e.relativeY;return r>=t.left&&r<=t.left+t.width&&n>=t.top&&n<=t.top+t.height}var AP=(e,t,r,n,a)=>{var o,c=(o=t==null?void 0:t.length)!==null&&o!==void 0?o:0;if(c<=1||e==null)return 0;if(n==="angleAxis"&&a!=null&&Math.abs(Math.abs(a[1]-a[0])-360)<=1e-6)for(var u=0;u0?(f=r[u-1])===null||f===void 0?void 0:f.coordinate:(h=r[c-1])===null||h===void 0?void 0:h.coordinate,j=(m=r[u])===null||m===void 0?void 0:m.coordinate,k=u>=c-1?(g=r[0])===null||g===void 0?void 0:g.coordinate:(v=r[u+1])===null||v===void 0?void 0:v.coordinate,S=void 0;if(!(b==null||j==null||k==null))if(Jr(j-b)!==Jr(k-j)){var N=[];if(Jr(k-j)===Jr(a[1]-a[0])){S=k;var E=j+a[1]-a[0];N[0]=Math.min(E,(E+b)/2),N[1]=Math.max(E,(E+b)/2)}else{S=b;var A=k+a[1]-a[0];N[0]=Math.min(j,(A+j)/2),N[1]=Math.max(j,(A+j)/2)}var P=[Math.min(j,(S+j)/2),Math.max(j,(S+j)/2)];if(e>P[0]&&e<=P[1]||e>=N[0]&&e<=N[1]){var _;return(_=r[u])===null||_===void 0?void 0:_.index}}else{var O=Math.min(b,k),D=Math.max(b,k);if(e>(O+j)/2&&e<=(D+j)/2){var U;return(U=r[u])===null||U===void 0?void 0:U.index}}}else if(t)for(var B=0;B(F.coordinate+H.coordinate)/2||B>0&&B(F.coordinate+H.coordinate)/2&&e<=(F.coordinate+Y.coordinate)/2)return F.index}}return-1},CP=()=>Me(t0),V0=(e,t)=>t,PP=(e,t,r)=>r,q0=(e,t,r,n)=>n,qH=q(_i,e=>wh(e,t=>t.coordinate)),Q0=q([dl,V0,PP,q0],hP),Y0=q([Q0,No,Xs,Zs],xu),QH=(e,t,r)=>{if(t!=null){var n=dl(e);return t==="axis"?r==="hover"?n.axisInteraction.hover.dataKey:n.axisInteraction.click.dataKey:r==="hover"?n.itemInteraction.hover.dataKey:n.itemInteraction.click.dataKey}},OP=q([dl,V0,PP,q0],pP),Zf=q([Ei,Ai,ft,Zt,_i,q0,OP],mP),YH=q([Q0,Zf],(e,t)=>{var r;return(r=e.coordinate)!==null&&r!==void 0?r:t}),_P=q([_i,Y0],uP),XH=q([OP,Y0,Nn,Xs,_P,gP,V0],vP),ZH=q([Q0,Y0],(e,t)=>({isActive:e.active&&t!=null,activeIndex:t})),JH=(e,t,r,n,a,o,c)=>{if(!(!e||!r||!n||!a)&&VH(e,c)){var u=fz(e,t),f=AP(u,o,a,r,n),h=KH(t,a,f,e);return{activeIndex:String(f),activeCoordinate:h}}},eW=(e,t,r,n,a,o,c)=>{if(!(!e||!n||!a||!o||!r)){var u=pF(e,r);if(u){var f=hz(u,t),h=AP(f,c,o,n,a),m=GH(t,o,h,u);return{activeIndex:String(h),activeCoordinate:m}}}},tW=(e,t,r,n,a,o,c,u)=>{if(!(!e||!t||!n||!a||!o))return t==="horizontal"||t==="vertical"?JH(e,t,n,a,o,c,u):eW(e,t,r,n,a,o,c)},rW=q(e=>e.zIndex.zIndexMap,(e,t)=>t,(e,t,r)=>r,(e,t,r)=>{if(t!=null){var n=e[t];if(n!=null)return r?n.panoramaElement:n.element}}),nW=q(e=>e.zIndex.zIndexMap,e=>{var t=Object.keys(e).map(n=>parseInt(n,10)).concat(Object.values(pr)),r=Array.from(new Set(t));return r.sort((n,a)=>n-a)},{memoizeOptions:{resultEqualityCheck:GF}});function _S(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function MS(e){for(var t=1;tMS(MS({},e),{},{[t]:{element:void 0,panoramaElement:void 0,consumers:0}}),sW)},uW=new Set(Object.values(pr));function cW(e){return uW.has(e)}var MP=lr({name:"zIndex",initialState:lW,reducers:{registerZIndexPortal:{reducer:(e,t)=>{var r=t.payload.zIndex;e.zIndexMap[r]?e.zIndexMap[r].consumers+=1:e.zIndexMap[r]={consumers:1,element:void 0,panoramaElement:void 0}},prepare:st()},unregisterZIndexPortal:{reducer:(e,t)=>{var r=t.payload.zIndex;e.zIndexMap[r]&&(e.zIndexMap[r].consumers-=1,e.zIndexMap[r].consumers<=0&&!cW(r)&&delete e.zIndexMap[r])},prepare:st()},registerZIndexPortalElement:{reducer:(e,t)=>{var r=t.payload,n=r.zIndex,a=r.element,o=r.isPanorama;e.zIndexMap[n]?o?e.zIndexMap[n].panoramaElement=a:e.zIndexMap[n].element=a:e.zIndexMap[n]={consumers:0,element:o?void 0:a,panoramaElement:o?a:void 0}},prepare:st()},unregisterZIndexPortalElement:{reducer:(e,t)=>{var r=t.payload.zIndex;e.zIndexMap[r]&&(t.payload.isPanorama?e.zIndexMap[r].panoramaElement=void 0:e.zIndexMap[r].element=void 0)},prepare:st()}}}),im=MP.actions,dW=im.registerZIndexPortal,Dg=im.unregisterZIndexPortal,fW=im.registerZIndexPortalElement,hW=im.unregisterZIndexPortalElement,mW=MP.reducer;function Mi(e){var t=e.zIndex,r=e.children,n=Xz(),a=n&&t!==void 0&&t!==0,o=Pr(),c=y.useRef(void 0),u=y.useRef(new Set),f=Nt(),h=Me(g=>rW(g,t,o));if(y.useLayoutEffect(()=>{if(!a){var g=u.current;g.forEach(b=>{f(Dg({zIndex:b}))}),g.clear(),c.current=void 0;return}if(u.current.has(t)||(f(dW({zIndex:t})),u.current.add(t)),h){c.current=h;var v=u.current;v.forEach(b=>{b!==t&&(f(Dg({zIndex:b})),v.delete(b))})}},[f,t,a,h]),y.useLayoutEffect(()=>{var g=u.current;return()=>{g.forEach(v=>{f(Dg({zIndex:v}))}),g.clear()}},[f]),!a)return r;var m=h??c.current;return m?fh.createPortal(r,m):null}function ay(){return ay=Object.assign?Object.assign.bind():function(e){for(var t=1;ty.useContext(IP),Rg={exports:{}},TS;function kW(){return TS||(TS=1,(function(e){var t=Object.prototype.hasOwnProperty,r="~";function n(){}Object.create&&(n.prototype=Object.create(null),new n().__proto__||(r=!1));function a(f,h,m){this.fn=f,this.context=h,this.once=m||!1}function o(f,h,m,g,v){if(typeof m!="function")throw new TypeError("The listener must be a function");var b=new a(m,g||f,v),j=r?r+h:h;return f._events[j]?f._events[j].fn?f._events[j]=[f._events[j],b]:f._events[j].push(b):(f._events[j]=b,f._eventsCount++),f}function c(f,h){--f._eventsCount===0?f._events=new n:delete f._events[h]}function u(){this._events=new n,this._eventsCount=0}u.prototype.eventNames=function(){var h=[],m,g;if(this._eventsCount===0)return h;for(g in m=this._events)t.call(m,g)&&h.push(r?g.slice(1):g);return Object.getOwnPropertySymbols?h.concat(Object.getOwnPropertySymbols(m)):h},u.prototype.listeners=function(h){var m=r?r+h:h,g=this._events[m];if(!g)return[];if(g.fn)return[g.fn];for(var v=0,b=g.length,j=new Array(b);v{if(t&&Array.isArray(e)){var r=Number.parseInt(t,10);if(!Kn(r))return e[r]}},EW={chartName:"",tooltipPayloadSearcher:()=>{},eventEmitter:void 0,defaultTooltipEventType:"axis"},TP=lr({name:"options",initialState:EW,reducers:{createEventEmitter:e=>{e.eventEmitter==null&&(e.eventEmitter=Symbol("rechartsEventEmitter"))}}}),AW=TP.reducer,CW=TP.actions.createEventEmitter;function PW(e){return e.tooltip.syncInteraction}var OW={chartData:void 0,computedData:void 0,dataStartIndex:0,dataEndIndex:0},DP=lr({name:"chartData",initialState:OW,reducers:{setChartData(e,t){if(e.chartData=t.payload,t.payload==null){e.dataStartIndex=0,e.dataEndIndex=0;return}t.payload.length>0&&e.dataEndIndex!==t.payload.length-1&&(e.dataEndIndex=t.payload.length-1)},setComputedData(e,t){e.computedData=t.payload},setDataStartEndIndexes(e,t){var r=t.payload,n=r.startIndex,a=r.endIndex;n!=null&&(e.dataStartIndex=n),a!=null&&(e.dataEndIndex=a)}}}),X0=DP.actions,RS=X0.setChartData,_W=X0.setDataStartEndIndexes;X0.setComputedData;var MW=DP.reducer,IW=["x","y"];function LS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function fs(e){for(var t=1;tf.rootProps.className);y.useEffect(()=>{if(e==null)return rl;var f=(h,m,g)=>{if(t!==g&&e===h){if(m.payload.active===!1){r(gu({active:!1,coordinate:void 0,dataKey:void 0,index:null,label:void 0,sourceViewBox:void 0,graphicalItemId:void 0}));return}if(n==="index"){var v;if(c&&m!==null&&m!==void 0&&(v=m.payload)!==null&&v!==void 0&&v.coordinate&&m.payload.sourceViewBox){var b=m.payload.coordinate,j=b.x,k=b.y,S=LW(b,IW),N=m.payload.sourceViewBox,E=N.x,A=N.y,P=N.width,_=N.height,O=fs(fs({},S),{},{x:c.x+(P?(j-E)/P:0)*c.width,y:c.y+(_?(k-A)/_:0)*c.height});r(fs(fs({},m),{},{payload:fs(fs({},m.payload),{},{coordinate:O})}))}else r(m);return}if(a!=null){var D;if(typeof n=="function"){var U={activeTooltipIndex:m.payload.index==null?void 0:Number(m.payload.index),isTooltipActive:m.payload.active,activeIndex:m.payload.index==null?void 0:Number(m.payload.index),activeLabel:m.payload.label,activeDataKey:m.payload.dataKey,activeCoordinate:m.payload.coordinate},B=n(a,U);D=a[B]}else n==="value"&&(D=a.find(se=>String(se.value)===m.payload.label));var F=m.payload.coordinate;if(F==null||c==null){r(gu({active:!1,coordinate:void 0,dataKey:void 0,index:null,label:void 0,sourceViewBox:void 0,graphicalItemId:void 0}));return}if(D==null){r(gu({active:!1,coordinate:void 0,dataKey:void 0,index:null,label:void 0,sourceViewBox:m.payload.sourceViewBox,graphicalItemId:void 0}));return}var Y=F.x,H=F.y,pe=Math.min(Y,c.x+c.width),ue=Math.min(H,c.y+c.height),he={x:o==="horizontal"?D.coordinate:pe,y:o==="horizontal"?ue:D.coordinate},ae=gu({active:m.payload.active,coordinate:he,dataKey:m.payload.dataKey,index:String(D.index),label:m.payload.label,sourceViewBox:m.payload.sourceViewBox,graphicalItemId:m.payload.graphicalItemId});r(ae)}}};return Bu.on(oy,f),()=>{Bu.off(oy,f)}},[u,r,t,e,n,a,o,c])}function FW(){var e=Me(r0),t=Me(n0),r=Nt();y.useEffect(()=>{if(e==null)return rl;var n=(a,o,c)=>{t!==c&&e===a&&r(_W(o))};return Bu.on(DS,n),()=>{Bu.off(DS,n)}},[r,t,e])}function BW(){var e=Nt();y.useEffect(()=>{e(CW())},[e]),zW(),FW()}function UW(e,t,r,n,a,o){var c=Me(j=>QH(j,e,t)),u=Me(_H),f=Me(n0),h=Me(r0),m=Me(OA),g=Me(PW),v=(g==null?void 0:g.sourceViewBox)!=null,b=Rh();y.useEffect(()=>{if(!v&&h!=null&&f!=null){var j=gu({active:o,coordinate:r,dataKey:c,index:a,label:typeof n=="number"?String(n):n,sourceViewBox:b,graphicalItemId:u});Bu.emit(oy,h,j,f)}},[v,r,c,u,a,n,f,h,m,o,b])}function $S(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function zS(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);r{D(zU({shared:E,trigger:A,axisId:O,active:a,defaultIndex:U}))},[D,E,A,O,a,U]);var B=Rh(),F=uA(),Y=IU(E),H=(t=Me(_e=>ZH(_e,Y,A,U)))!==null&&t!==void 0?t:{},pe=H.activeIndex,ue=H.isActive,he=Me(_e=>XH(_e,Y,A,U)),ae=Me(_e=>_P(_e,Y,A,U)),se=Me(_e=>YH(_e,Y,A,U)),X=he,te=wW(),J=(r=a??ue)!==null&&r!==void 0?r:!1,I=ZL([X,J]),M=GW(I,2),K=M[0],ne=M[1],Z=Y==="axis"?ae:void 0;UW(Y,A,se,Z,pe,J);var me=_??te;if(me==null||B==null||Y==null)return null;var ge=X??BS;J||(ge=BS),h&&ge.length&&(ge=wL(ge.filter(_e=>_e.value!=null&&(_e.hide!==!0||n.includeHidden)),v,XW));var Pe=ge.length>0,re=zS(zS({},n),{},{payload:ge,label:Z,active:J,activeIndex:pe,coordinate:se,accessibilityLayer:F}),xe=y.createElement(u8,{allowEscapeViewBox:o,animationDuration:c,animationEasing:u,isAnimationActive:m,active:J,coordinate:se,hasPayload:Pe,offset:g,position:b,reverseDirection:j,useTranslate3d:k,viewBox:B,wrapperStyle:S,lastBoundingBox:K,innerRef:ne,hasPortalFromProps:!!_},ZW(f,re));return y.createElement(y.Fragment,null,fh.createPortal(xe,me),J&&y.createElement(bW,{cursor:N,tooltipEventType:Y,coordinate:se,payload:ge,index:pe}))}function tK(e,t,r){return(t=rK(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function rK(e){var t=nK(e,"string");return typeof t=="symbol"?t:t+""}function nK(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}class iK{constructor(t){tK(this,"cache",new Map),this.maxSize=t}get(t){var r=this.cache.get(t);return r!==void 0&&(this.cache.delete(t),this.cache.set(t,r)),r}set(t,r){if(this.cache.has(t))this.cache.delete(t);else if(this.cache.size>=this.maxSize){var n=this.cache.keys().next().value;n!=null&&this.cache.delete(n)}this.cache.set(t,r)}clear(){this.cache.clear()}size(){return this.cache.size}}function US(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function aK(e){for(var t=1;t{try{var r=document.getElementById(WS);r||(r=document.createElement("span"),r.setAttribute("id",WS),r.setAttribute("aria-hidden","true"),document.body.appendChild(r)),Object.assign(r.style,cK,t),r.textContent="".concat(e);var n=r.getBoundingClientRect();return{width:n.width,height:n.height}}catch{return{width:0,height:0}}},bu=function(t){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(t==null||nc.isSsr)return{width:0,height:0};if(!RP.enableCache)return KS(t,r);var n=dK(t,r),a=HS.get(n);if(a)return a;var o=KS(t,r);return HS.set(n,o),o},LP;function Jf(e,t){return pK(e)||mK(e,t)||hK(e,t)||fK()}function fK(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function hK(e,t){if(e){if(typeof e=="string")return GS(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?GS(e,t):void 0}}function GS(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);re.length)&&(t=e.length);for(var r=0,n=Array(t);r{var t=e.children,r=e.breakAll,n=e.style;try{var a=[];Yt(t)||(r?a=t.toString().split(""):a=t.toString().split(zP));var o=a.map(u=>({word:u,width:bu(u,n).width})),c=r?0:bu(" ",n).width;return{wordsWithComputedWidth:o,spaceWidth:c}}catch{return null}};function BP(e){return e==="start"||e==="middle"||e==="end"||e==="inherit"}function DK(e){return Yt(e)||typeof e=="string"||typeof e=="number"||typeof e=="boolean"}var UP=(e,t,r,n)=>e.reduce((a,o)=>{var c=o.word,u=o.width,f=a[a.length-1];if(f&&u!=null&&(t==null||n||f.width+u+re.reduce((t,r)=>t.width>r.width?t:r),RK="…",JS=(e,t,r,n,a,o,c,u)=>{var f=e.slice(0,t),h=FP({breakAll:r,style:n,children:f+RK});if(!h)return[!1,[]];var m=UP(h.wordsWithComputedWidth,o,c,u),g=m.length>a||HP(m).width>Number(o);return[g,m]},LK=(e,t,r,n,a)=>{var o=e.maxLines,c=e.children,u=e.style,f=e.breakAll,h=Ee(o),m=String(c),g=UP(t,n,r,a);if(!h||a)return g;var v=g.length>o||HP(g).width>Number(n);if(!v)return g;for(var b=0,j=m.length-1,k=0,S;b<=j&&k<=m.length-1;){var N=Math.floor((b+j)/2),E=N-1,A=JS(m,E,f,u,o,n,r,a),P=XS(A,2),_=P[0],O=P[1],D=JS(m,N,f,u,o,n,r,a),U=XS(D,1),B=U[0];if(!_&&!B&&(b=N+1),_&&B&&(j=N-1),!_&&B){S=O;break}k++}return S||g},e2=e=>{var t=Yt(e)?[]:e.toString().split(zP);return[{words:t,width:void 0}]},$K=e=>{var t=e.width,r=e.scaleToFit,n=e.children,a=e.style,o=e.breakAll,c=e.maxLines;if((t||r)&&!nc.isSsr){var u,f,h=FP({breakAll:o,children:n,style:a});if(h){var m=h.wordsWithComputedWidth,g=h.spaceWidth;u=m,f=g}else return e2(n);return LK({breakAll:o,children:n,maxLines:c,style:a},u,f,t,!!r)}return e2(n)},WP="#808080",zK={angle:0,breakAll:!1,capHeight:"0.71em",fill:WP,lineHeight:"1em",scaleToFit:!1,textAnchor:"start",verticalAnchor:"end",x:0,y:0},Z0=y.forwardRef((e,t)=>{var r=on(e,zK),n=r.x,a=r.y,o=r.lineHeight,c=r.capHeight,u=r.fill,f=r.scaleToFit,h=r.textAnchor,m=r.verticalAnchor,g=YS(r,CK),v=y.useMemo(()=>$K({breakAll:g.breakAll,children:g.children,maxLines:g.maxLines,scaleToFit:f,style:g.style,width:g.width}),[g.breakAll,g.children,g.maxLines,f,g.style,g.width]),b=g.dx,j=g.dy,k=g.angle,S=g.className,N=g.breakAll,E=YS(g,PK);if(!Gn(n)||!Gn(a)||v.length===0)return null;var A=Number(n)+(Ee(b)?b:0),P=Number(a)+(Ee(j)?j:0);if(!We(A)||!We(P))return null;var _;switch(m){case"start":_=Lg("calc(".concat(c,")"));break;case"middle":_=Lg("calc(".concat((v.length-1)/2," * -").concat(o," + (").concat(c," / 2))"));break;default:_=Lg("calc(".concat(v.length-1," * -").concat(o,")"));break}var O=[],D=v[0];if(f&&D!=null){var U=D.width,B=g.width;O.push("scale(".concat(Ee(B)&&Ee(U)?B/U:1,")"))}return k&&O.push("rotate(".concat(k,", ").concat(A,", ").concat(P,")")),O.length&&(E.transform=O.join(" ")),y.createElement("text",sy({},rn(E),{ref:t,x:A,y:P,className:nt("recharts-text",S),textAnchor:h,fill:u.includes("url")?WP:u}),v.map((F,Y)=>{var H=F.words.join(N?"":" ");return y.createElement("tspan",{x:A,dy:Y===0?_:o,key:"".concat(H,"-").concat(Y)},H)}))});Z0.displayName="Text";function t2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function Tn(e){for(var t=1;t{var t=e.viewBox,r=e.position,n=e.offset,a=n===void 0?0:n,o=e.parentViewBox,c=Gy(t),u=c.x,f=c.y,h=c.height,m=c.upperWidth,g=c.lowerWidth,v=u,b=u+(m-g)/2,j=(v+b)/2,k=(m+g)/2,S=v+m/2,N=h>=0?1:-1,E=N*a,A=N>0?"end":"start",P=N>0?"start":"end",_=m>=0?1:-1,O=_*a,D=_>0?"end":"start",U=_>0?"start":"end",B=o;if(r==="top"){var F={x:v+m/2,y:f-E,horizontalAnchor:"middle",verticalAnchor:A};return B&&(F.height=Math.max(f-B.y,0),F.width=m),F}if(r==="bottom"){var Y={x:b+g/2,y:f+h+E,horizontalAnchor:"middle",verticalAnchor:P};return B&&(Y.height=Math.max(B.y+B.height-(f+h),0),Y.width=g),Y}if(r==="left"){var H={x:j-O,y:f+h/2,horizontalAnchor:D,verticalAnchor:"middle"};return B&&(H.width=Math.max(H.x-B.x,0),H.height=h),H}if(r==="right"){var pe={x:j+k+O,y:f+h/2,horizontalAnchor:U,verticalAnchor:"middle"};return B&&(pe.width=Math.max(B.x+B.width-pe.x,0),pe.height=h),pe}var ue=B?{width:k,height:h}:{};return r==="insideLeft"?Tn({x:j+O,y:f+h/2,horizontalAnchor:U,verticalAnchor:"middle"},ue):r==="insideRight"?Tn({x:j+k-O,y:f+h/2,horizontalAnchor:D,verticalAnchor:"middle"},ue):r==="insideTop"?Tn({x:v+m/2,y:f+E,horizontalAnchor:"middle",verticalAnchor:P},ue):r==="insideBottom"?Tn({x:b+g/2,y:f+h-E,horizontalAnchor:"middle",verticalAnchor:A},ue):r==="insideTopLeft"?Tn({x:v+O,y:f+E,horizontalAnchor:U,verticalAnchor:P},ue):r==="insideTopRight"?Tn({x:v+m-O,y:f+E,horizontalAnchor:D,verticalAnchor:P},ue):r==="insideBottomLeft"?Tn({x:b+O,y:f+h-E,horizontalAnchor:U,verticalAnchor:A},ue):r==="insideBottomRight"?Tn({x:b+g-O,y:f+h-E,horizontalAnchor:D,verticalAnchor:A},ue):r&&typeof r=="object"&&(Ee(r.x)||bo(r.x))&&(Ee(r.y)||bo(r.y))?Tn({x:u+Sa(r.x,k),y:f+Sa(r.y,h),horizontalAnchor:"end",verticalAnchor:"end"},ue):Tn({x:S,y:f+h/2,horizontalAnchor:"middle",verticalAnchor:"middle"},ue)},WK=["labelRef"],KK=["content"];function r2(e,t){if(e==null)return{};var r,n,a=GK(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n{var t=e.x,r=e.y,n=e.upperWidth,a=e.lowerWidth,o=e.width,c=e.height,u=e.children,f=y.useMemo(()=>({x:t,y:r,upperWidth:n,lowerWidth:a,width:o,height:c}),[t,r,n,a,o,c]);return y.createElement(KP.Provider,{value:f},u)},GP=()=>{var e=y.useContext(KP),t=Rh();return e||(t?Gy(t):void 0)},XK=y.createContext(null),ZK=()=>{var e=y.useContext(XK),t=Me(DA);return e||t},JK=e=>{var t=e.value,r=e.formatter,n=Yt(e.children)?t:e.children;return typeof r=="function"?r(n):n},J0=e=>e!=null&&typeof e=="function",eG=(e,t)=>{var r=Jr(t-e),n=Math.min(Math.abs(t-e),360);return r*n},tG=(e,t,r,n,a)=>{var o=e.offset,c=e.className,u=a.cx,f=a.cy,h=a.innerRadius,m=a.outerRadius,g=a.startAngle,v=a.endAngle,b=a.clockWise,j=(h+m)/2,k=eG(g,v),S=k>=0?1:-1,N,E;switch(t){case"insideStart":N=g+S*o,E=b;break;case"insideEnd":N=v-S*o,E=!b;break;case"end":N=v+S*o,E=b;break;default:throw new Error("Unsupported position ".concat(t))}E=k<=0?E:!E;var A=Qt(u,f,j,N),P=Qt(u,f,j,N+(E?1:-1)*359),_="M".concat(A.x,",").concat(A.y,` + A`).concat(j,",").concat(j,",0,1,").concat(E?0:1,`, + `).concat(P.x,",").concat(P.y),O=Yt(e.id)?Au("recharts-radial-line-"):e.id;return y.createElement("text",hi({},n,{dominantBaseline:"central",className:nt("recharts-radial-bar-label",c)}),y.createElement("defs",null,y.createElement("path",{id:O,d:_})),y.createElement("textPath",{xlinkHref:"#".concat(O)},r))},rG=(e,t,r)=>{var n=e.cx,a=e.cy,o=e.innerRadius,c=e.outerRadius,u=e.startAngle,f=e.endAngle,h=(u+f)/2;if(r==="outside"){var m=Qt(n,a,c+t,h),g=m.x,v=m.y;return{x:g,y:v,textAnchor:g>=n?"start":"end",verticalAnchor:"middle"}}if(r==="center")return{x:n,y:a,textAnchor:"middle",verticalAnchor:"middle"};if(r==="centerTop")return{x:n,y:a,textAnchor:"middle",verticalAnchor:"start"};if(r==="centerBottom")return{x:n,y:a,textAnchor:"middle",verticalAnchor:"end"};var b=(o+c)/2,j=Qt(n,a,b,h),k=j.x,S=j.y;return{x:k,y:S,textAnchor:"middle",verticalAnchor:"middle"}},nf=e=>e!=null&&"cx"in e&&Ee(e.cx),nG={angle:0,offset:5,zIndex:pr.label,position:"middle",textBreakAll:!1};function iG(e){if(!nf(e))return e;var t=e.cx,r=e.cy,n=e.outerRadius,a=n*2;return{x:t-n,y:r-n,width:a,upperWidth:a,lowerWidth:a,height:a}}function sa(e){var t=on(e,nG),r=t.viewBox,n=t.parentViewBox,a=t.position,o=t.value,c=t.children,u=t.content,f=t.className,h=f===void 0?"":f,m=t.textBreakAll,g=t.labelRef,v=ZK(),b=GP(),j=a==="center"?b:v??b,k,S,N;r==null?k=j:nf(r)?k=r:k=Gy(r);var E=iG(k);if(!k||Yt(o)&&Yt(c)&&!y.isValidElement(u)&&typeof u!="function")return null;var A=vu(vu({},t),{},{viewBox:k});if(y.isValidElement(u)){A.labelRef;var P=r2(A,WK);return y.cloneElement(u,P)}if(typeof u=="function"){A.content;var _=r2(A,KK);if(S=y.createElement(u,_),y.isValidElement(S))return S}else S=JK(t);var O=rn(t);if(nf(k)){if(a==="insideStart"||a==="insideEnd"||a==="end")return tG(t,a,S,O,k);N=rG(k,t.offset,t.position)}else{if(!E)return null;var D=HK({viewBox:E,position:a,offset:t.offset,parentViewBox:nf(n)?void 0:n});N=vu(vu({x:D.x,y:D.y,textAnchor:D.horizontalAnchor,verticalAnchor:D.verticalAnchor},D.width!==void 0?{width:D.width}:{}),D.height!==void 0?{height:D.height}:{})}return y.createElement(Mi,{zIndex:t.zIndex},y.createElement(Z0,hi({ref:g,className:nt("recharts-label",h)},O,N,{textAnchor:BP(O.textAnchor)?O.textAnchor:N.textAnchor,breakAll:m}),S))}sa.displayName="Label";var aG=(e,t,r)=>{if(!e)return null;var n={viewBox:t,labelRef:r};return e===!0?y.createElement(sa,hi({key:"label-implicit"},n)):Gn(e)?y.createElement(sa,hi({key:"label-implicit",value:e},n)):y.isValidElement(e)?e.type===sa?y.cloneElement(e,vu({key:"label-implicit"},n)):y.createElement(sa,hi({key:"label-implicit",content:e},n)):J0(e)?y.createElement(sa,hi({key:"label-implicit",content:e},n)):e&&typeof e=="object"?y.createElement(sa,hi({},e,{key:"label-implicit"},n)):null};function oG(e){var t=e.label,r=e.labelRef,n=GP();return aG(t,n,r)||null}var sG=["valueAccessor"],lG=["dataKey","clockWise","id","textBreakAll","zIndex"];function eh(){return eh=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var t=Array.isArray(e.value)?e.value[e.value.length-1]:e.value;if(DK(t))return t},VP=y.createContext(void 0),dG=VP.Provider,qP=y.createContext(void 0);qP.Provider;function fG(){return y.useContext(VP)}function hG(){return y.useContext(qP)}function af(e){var t=e.valueAccessor,r=t===void 0?cG:t,n=i2(e,sG),a=n.dataKey;n.clockWise;var o=n.id,c=n.textBreakAll,u=n.zIndex,f=i2(n,lG),h=fG(),m=hG(),g=h||m;return!g||!g.length?null:y.createElement(Mi,{zIndex:u??pr.label},y.createElement(nn,{className:"recharts-label-list"},g.map((v,b)=>{var j,k=Yt(a)?r(v,b):Lt(v.payload,a),S=Yt(o)?{}:{id:"".concat(o,"-").concat(b)};return y.createElement(sa,eh({key:"label-".concat(b)},rn(v),f,S,{fill:(j=n.fill)!==null&&j!==void 0?j:v.fill,parentViewBox:v.parentViewBox,value:k,textBreakAll:c,viewBox:v.viewBox,index:b,zIndex:0}))})))}af.displayName="LabelList";function mG(e){var t=e.label;return t?t===!0?y.createElement(af,{key:"labelList-implicit"}):y.isValidElement(t)||J0(t)?y.createElement(af,{key:"labelList-implicit",content:t}):typeof t=="object"?y.createElement(af,eh({key:"labelList-implicit"},t,{type:String(t.type)})):null:null}function ly(){return ly=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var t=e.cx,r=e.cy,n=e.r,a=e.className,o=nt("recharts-dot",a);return Ee(t)&&Ee(r)&&Ee(n)?y.createElement("circle",ly({},kn(e),Ry(e),{className:o,cx:t,cy:r,r:n})):null},pG={radiusAxis:{},angleAxis:{}},YP=lr({name:"polarAxis",initialState:pG,reducers:{addRadiusAxis(e,t){e.radiusAxis[t.payload.id]=t.payload},removeRadiusAxis(e,t){delete e.radiusAxis[t.payload.id]},addAngleAxis(e,t){e.angleAxis[t.payload.id]=t.payload},removeAngleAxis(e,t){delete e.angleAxis[t.payload.id]}}}),am=YP.actions;am.addRadiusAxis;am.removeRadiusAxis;am.addAngleAxis;am.removeAngleAxis;var gG=YP.reducer;function vG(e){return e&&typeof e=="object"&&"className"in e&&typeof e.className=="string"?e.className:""}var XP=e=>e&&typeof e=="object"&&"clipDot"in e?!!e.clipDot:!0;function a2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function o2(e){for(var t=1;t{n||(a.current===null?r(RU(t)):a.current!==t&&r(LU({prev:a.current,next:t})),a.current=t)},[t,r,n]),y.useLayoutEffect(()=>()=>{a.current&&(r($U(a.current)),a.current=null)},[r]),null}function AG(e){var t=e.legendPayload,r=Nt(),n=Pr(),a=y.useRef(null);return y.useLayoutEffect(()=>{n||(a.current===null?r(c6(t)):a.current!==t&&r(d6({prev:a.current,next:t})),a.current=t)},[r,n,t]),y.useLayoutEffect(()=>()=>{a.current&&(r(f6(a.current)),a.current=null)},[r]),null}function CG(e,t){return MG(e)||_G(e,t)||OG(e,t)||PG()}function PG(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function OG(e,t){if(e){if(typeof e=="string")return s2(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?s2(e,t):void 0}}function s2(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r2&&arguments[2]!==void 0?arguments[2]:[],n=[];for(var a of r)n.push({status:"removed",prev:a});for(var o=0;oe[Math.floor(o*r)]);return tx(n,t)}function DG(e,t){var r=t.map((n,a)=>e[a]);return tx(r,t)}function RG(e,t){for(var r=new Map,n=0;n{var b=r(g,v);if(b!=null){var j=n.get(b);if(j!==void 0)return a.add(b),j}}),c=[];for(var u of n){var f=CG(u,2),h=f[0],m=f[1];a.has(h)||c.push(m)}return tx(o,t,c)}function uy(e,t,r){return t==null?null:e==null?t.map(n=>({status:"added",next:n})):r===ex?TG(e,t):r===IG?DG(e,t):LG(e,t,r)}function JP(e,t){var r=y.useRef(e),n=y.useRef(t.current),a=y.useRef(!0);r.current!==e&&(r.current=e,n.current=t.current,a.current=!1);var o=y.useCallback(function(c,u){var f=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;if(u===0){a.current=!0;return}u===1&&(n.current=c),u>0&&a.current&&f&&(t.current=c)},[t]);return{startValue:n.current,syncStepValue:o}}function $G(e,t){return UG(e)||BG(e,t)||FG(e,t)||zG()}function zG(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function FG(e,t){if(e){if(typeof e=="string")return l2(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?l2(e,t):void 0}}function l2(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{typeof e=="function"&&e(),o(!0)},[e]),u=y.useCallback(()=>{typeof t=="function"&&t(),o(!1)},[t]);return{isAnimating:a,handleAnimationStart:c,handleAnimationEnd:u}}function WG(e){var t,r=e.animationInput,n=e.animationIdPrefix,a=e.items,o=e.previousItemsRef,c=e.isAnimationActive,u=e.animationBegin,f=e.animationDuration,h=e.animationEasing,m=e.onAnimationStart,g=e.onAnimationEnd,v=e.animationInterpolateFn,b=e.animationMatchBy,j=e.shouldUpdatePreviousRef,k=e.children,S=e.layout,N=mA(r,n),E=JP(N,o),A=(t=E.startValue)!==null&&t!==void 0?t:null,P=uy(A,a,b??ex);return y.createElement(hA,{animationId:N,begin:u,duration:f,isActive:c,easing:h,onAnimationEnd:g,onAnimationStart:m,key:N},_=>{var O=A==null,D=a==null?a:v(P,_,S),U=j?j(_):_>0;return E.syncStepValue(D,_,U),D==null?null:k(D,_,O)})}var $g;function KG(e,t){return QG(e)||qG(e,t)||VG(e,t)||GG()}function GG(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function VG(e,t){if(e){if(typeof e=="string")return u2(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?u2(e,t):void 0}}function u2(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{var e=y.useState(()=>Au("uid-")),t=KG(e,1),r=t[0];return r},eO=($g=lh.useId)!==null&&$g!==void 0?$g:YG;function XG(e,t){var r=eO();return t||(e?"".concat(e,"-").concat(r):r)}var ZG=y.createContext(void 0),JG=e=>{var t=e.id,r=e.type,n=e.children,a=XG("recharts-".concat(r),t);return y.createElement(ZG.Provider,{value:a},n(a))},eV={cartesianItems:[],polarItems:[]},tO=lr({name:"graphicalItems",initialState:eV,reducers:{addCartesianGraphicalItem:{reducer(e,t){e.cartesianItems.push(t.payload)},prepare:st()},replaceCartesianGraphicalItem:{reducer(e,t){var r=t.payload,n=r.prev,a=r.next,o=en(e).cartesianItems.indexOf(n);o>-1&&(e.cartesianItems[o]=a)},prepare:st()},removeCartesianGraphicalItem:{reducer(e,t){var r=en(e).cartesianItems.indexOf(t.payload);r>-1&&e.cartesianItems.splice(r,1)},prepare:st()},addPolarGraphicalItem:{reducer(e,t){e.polarItems.push(t.payload)},prepare:st()},removePolarGraphicalItem:{reducer(e,t){var r=en(e).polarItems.indexOf(t.payload);r>-1&&e.polarItems.splice(r,1)},prepare:st()},replacePolarGraphicalItem:{reducer(e,t){var r=t.payload,n=r.prev,a=r.next,o=en(e).polarItems.indexOf(n);o>-1&&(e.polarItems[o]=a)},prepare:st()}}}),fl=tO.actions,tV=fl.addCartesianGraphicalItem,rV=fl.replaceCartesianGraphicalItem,nV=fl.removeCartesianGraphicalItem;fl.addPolarGraphicalItem;fl.removePolarGraphicalItem;fl.replacePolarGraphicalItem;var iV=tO.reducer,aV=e=>{var t=Nt(),r=y.useRef(null);return y.useLayoutEffect(()=>{r.current===null?t(tV(e)):r.current!==e&&t(rV({prev:r.current,next:e})),r.current=e},[t,e]),y.useLayoutEffect(()=>()=>{r.current&&(t(nV(r.current)),r.current=null)},[t]),null},oV=y.memo(aV),sV=["points"];function c2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function zg(e){for(var t=1;t{var N,E,A=zg(zg(zg({r:3},c),v),{},{index:S,cx:(N=k.x)!==null&&N!==void 0?N:void 0,cy:(E=k.y)!==null&&E!==void 0?E:void 0,dataKey:o,value:k.value,payload:k.payload,points:t});return y.createElement(hV,{key:"dot-".concat(S),option:r,dotProps:A,className:a})}),j={};return u&&f!=null&&(j.clipPath="url(#clipPath-".concat(g?"":"dots-").concat(f,")")),y.createElement(Mi,{zIndex:m},y.createElement(nn,th({className:n},j),b))}function d2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function f2(e){for(var t=1;t({top:e.top,bottom:e.bottom,left:e.left,right:e.right})),PV=q([CV,Ei,Ai],(e,t,r)=>{if(!(!e||t==null||r==null))return{x:e.left,y:e.top,width:Math.max(0,t-e.left-e.right),height:Math.max(0,r-e.top-e.bottom)}}),rx=()=>Me(PV),OV=()=>Me(RH);function h2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function Fg(e){for(var t=1;t{var t=e.point,r=e.childIndex,n=e.mainColor,a=e.activeDot,o=e.dataKey,c=e.clipPath;if(a===!1||t.x==null||t.y==null)return null;var u={index:r,dataKey:o,cx:t.x,cy:t.y,r:4,fill:n??"none",strokeWidth:2,stroke:"#fff",payload:t.payload,value:t.value},f=Fg(Fg(Fg({},u),yh(a)),Ry(a)),h;return y.isValidElement(a)?h=y.cloneElement(a,f):typeof a=="function"?h=a(f):h=y.createElement(QP,f),y.createElement(nn,{className:"recharts-active-dot",clipPath:c},h)};function m2(e){var t=e.points,r=e.mainColor,n=e.activeDot,a=e.itemDataKey,o=e.clipPath,c=e.zIndex,u=c===void 0?pr.activeDot:c,f=Me(Fu),h=OV();if(t==null||h==null)return null;var m=t.find(g=>h.includes(g.payload));return Yt(m)?null:y.createElement(Mi,{zIndex:u},y.createElement(TV,{point:m,childIndex:Number(f),mainColor:r,dataKey:a,activeDot:n,clipPath:o}))}var DV=e=>{var t=e.chartData,r=Nt(),n=Pr();return y.useEffect(()=>n?()=>{}:(r(RS(t)),()=>{r(RS(void 0))}),[t,r,n]),null},p2={x:0,y:0,width:0,height:0,padding:{top:0,right:0,bottom:0,left:0}},iO=lr({name:"brush",initialState:p2,reducers:{setBrushSettings(e,t){return t.payload==null?p2:t.payload}}});iO.actions.setBrushSettings;var RV=iO.reducer;function LV(e){return(e%180+180)%180}var $V=function(t){var r=t.width,n=t.height,a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,o=LV(a),c=o*Math.PI/180,u=Math.atan(n/r),f=c>u&&c{e.dots.push(t.payload)},removeDot:(e,t)=>{var r=en(e).dots.findIndex(n=>n===t.payload);r!==-1&&e.dots.splice(r,1)},addArea:(e,t)=>{e.areas.push(t.payload)},removeArea:(e,t)=>{var r=en(e).areas.findIndex(n=>n===t.payload);r!==-1&&e.areas.splice(r,1)},addLine:(e,t)=>{e.lines.push(t.payload)},removeLine:(e,t)=>{var r=en(e).lines.findIndex(n=>n===t.payload);r!==-1&&e.lines.splice(r,1)}}}),hl=aO.actions;hl.addDot;hl.removeDot;hl.addArea;hl.removeArea;hl.addLine;hl.removeLine;var FV=aO.reducer;function BV(e,t){return KV(e)||WV(e,t)||HV(e,t)||UV()}function UV(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function HV(e,t){if(e){if(typeof e=="string")return g2(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?g2(e,t):void 0}}function g2(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{var t=e.children,r=y.useState("".concat(Au("recharts"),"-clip")),n=BV(r,1),a=n[0],o=rx();if(o==null)return null;var c=o.x,u=o.y,f=o.width,h=o.height;return y.createElement(GV.Provider,{value:a},y.createElement("defs",null,y.createElement("clipPath",{id:a},y.createElement("rect",{x:c,y:u,height:h,width:f}))),t)};function oO(e,t){if(t<1)return[];if(t===1)return e;for(var r=[],n=0;ne*a)return!1;var o=r();return e*(t-e*o/2-n)>=0&&e*(t+e*o/2-a)<=0}function YV(e,t){return oO(e,t+1)}function XV(e,t,r,n,a){for(var o=(n||[]).slice(),c=t.start,u=t.end,f=0,h=1,m=c,g=function(){var j=n==null?void 0:n[f];if(j===void 0)return{v:oO(n,h)};var k=f,S,N=()=>(S===void 0&&(S=r(j,k)),S),E=j.coordinate,A=f===0||Uu(e,E,N,m,u);A||(f=0,m=c,h+=1),A&&(m=E+e*(N()/2+a),f+=h)},v;h<=o.length;)if(v=g(),v)return v.v;return[]}function ZV(e,t,r,n,a){var o=(n||[]).slice(),c=o.length;if(c===0)return[];for(var u=t.start,f=t.end,h=1;h<=c;h++){for(var m=(c-1)%h,g=u,v=!0,b=function(){var P=n[k];if(P==null)return 0;var _=k,O,D=()=>(O===void 0&&(O=r(P,_)),O),U=P.coordinate,B=k===m||Uu(e,U,D,g,f);if(!B)return v=!1,1;B&&(g=U+e*(D()/2+a))},j,k=m;k(k===void 0&&(k=r(b,v)),k);if(v===c-1){var N=e*(j.coordinate+e*S()/2-f);o[v]=j=ar(ar({},j),{},{tickCoord:N>0?j.coordinate-N*e:j.coordinate})}else o[v]=j=ar(ar({},j),{},{tickCoord:j.coordinate});if(j.tickCoord!=null){var E=Uu(e,j.tickCoord,S,u,f);E&&(f=j.tickCoord-e*(S()/2+a),o[v]=ar(ar({},j),{},{isShow:!0}))}},m=c-1;m>=0;m--)h(m);return o}function nq(e,t,r,n,a,o){var c=(n||[]).slice(),u=c.length,f=t.start,h=t.end;if(o){var m=n[u-1];if(m!=null){var g=r(m,u-1),v=e*(m.coordinate+e*g/2-h);if(c[u-1]=m=ar(ar({},m),{},{tickCoord:v>0?m.coordinate-v*e:m.coordinate}),m.tickCoord!=null){var b=Uu(e,m.tickCoord,()=>g,f,h);b&&(h=m.tickCoord-e*(g/2+a),c[u-1]=ar(ar({},m),{},{isShow:!0}))}}}for(var j=o?u-1:u,k=function(E){var A=c[E];if(A==null)return 1;var P=A,_,O=()=>(_===void 0&&(_=r(A,E)),_);if(E===0){var D=e*(P.coordinate-e*O()/2-f);c[E]=P=ar(ar({},P),{},{tickCoord:D<0?P.coordinate-D*e:P.coordinate})}else c[E]=P=ar(ar({},P),{},{tickCoord:P.coordinate});if(P.tickCoord!=null){var U=Uu(e,P.tickCoord,O,f,h);U&&(f=P.tickCoord+e*(O()/2+a),c[E]=ar(ar({},P),{},{isShow:!0}))}},S=0;S{var D=typeof h=="function"?h(_.value,O):_.value;return j==="width"?qV(bu(D,{fontSize:t,letterSpacing:r}),k,g):bu(D,{fontSize:t,letterSpacing:r})[j]},N=a[0],E=a[1],A=a.length>=2&&N!=null&&E!=null?Jr(E.coordinate-N.coordinate):1,P=QV(o,A,j);return f==="equidistantPreserveStart"?XV(A,P,S,a,c):f==="equidistantPreserveEnd"?ZV(A,P,S,a,c):(f==="preserveStart"||f==="preserveStartEnd"?b=nq(A,P,S,a,c,f==="preserveStartEnd"):b=rq(A,P,S,a,c),b.filter(_=>_.isShow))}var iq=e=>{var t=e.ticks,r=e.label,n=e.labelGapWithTick,a=n,o=e.tickSize,c=o===void 0?0:o,u=e.tickMargin,f=u===void 0?0:u,h=0;if(t){Array.from(t).forEach(b=>{if(b){var j=b.getBoundingClientRect();j.width>h&&(h=j.width)}});var m=r?r.getBoundingClientRect().width:0,g=c+f,v=h+g+m+(r?a:0);return Math.round(v)}return 0},aq={xAxis:{},yAxis:{}},sO=lr({name:"renderedTicks",initialState:aq,reducers:{setRenderedTicks:(e,t)=>{var r=t.payload,n=r.axisType,a=r.axisId,o=r.ticks;e[n][a]=o},removeRenderedTicks:(e,t)=>{var r=t.payload,n=r.axisType,a=r.axisId;delete e[n][a]}}}),lO=sO.actions,oq=lO.setRenderedTicks,sq=lO.removeRenderedTicks,lq=sO.reducer,uq=["axisLine","width","height","className","hide","ticks","axisType","axisId"];function y2(e,t){return hq(e)||fq(e,t)||dq(e,t)||cq()}function cq(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function dq(e,t){if(e){if(typeof e=="string")return x2(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?x2(e,t):void 0}}function x2(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{if(n==null||r==null)return rl;var o=t.map(c=>({value:c.value,coordinate:c.coordinate,offset:c.offset,index:c.index}));return a(oq({ticks:o,axisId:n,axisType:r})),()=>{a(sq({axisId:n,axisType:r}))}},[a,t,n,r]),null}var Nq=y.forwardRef((e,t)=>{var r=e.ticks,n=r===void 0?[]:r,a=e.tick,o=e.tickLine,c=e.stroke,u=e.tickFormatter,f=e.unit,h=e.padding,m=e.tickTextProps,g=e.orientation,v=e.mirror,b=e.x,j=e.y,k=e.width,S=e.height,N=e.tickSize,E=e.tickMargin,A=e.fontSize,P=e.letterSpacing,_=e.getTicksConfig,O=e.events,D=e.axisType,U=e.axisId,B=nx(xt(xt({},_),{},{ticks:n}),A,P),F=kn(_),Y=yh(a),H=BP(F.textAnchor)?F.textAnchor:wq(g,v),pe=kq(g,v),ue={};typeof o=="object"&&(ue=o);var he=xt(xt({},F),{},{fill:"none"},ue),ae=B.map(te=>xt({entry:te},bq(te,b,j,k,S,g,N,v,E))),se=ae.map(te=>{var J=te.entry,I=te.line;return y.createElement(nn,{className:"recharts-cartesian-axis-tick",key:"tick-".concat(J.value,"-").concat(J.coordinate,"-").concat(J.tickCoord)},o&&y.createElement("line",Eo({},he,I,{className:nt("recharts-cartesian-axis-tick-line",Oo(o,"className"))})))}),X=ae.map((te,J)=>{var I,M,K=te.entry,ne=te.tick,Z=xt(xt(xt(xt({verticalAnchor:pe},F),{},{textAnchor:H,stroke:"none",fill:c},ne),{},{index:J,payload:K,visibleTicksCount:B.length,tickFormatter:u,padding:h},m),{},{angle:(I=(M=m==null?void 0:m.angle)!==null&&M!==void 0?M:F.angle)!==null&&I!==void 0?I:0}),me=xt(xt({},Z),Y);return y.createElement(nn,Eo({className:"recharts-cartesian-axis-tick-label",key:"tick-label-".concat(K.value,"-").concat(K.coordinate,"-").concat(K.tickCoord)},PR(O,K,J)),a&&y.createElement(jq,{option:a,tickProps:me,value:"".concat(typeof u=="function"?u(K.value,J):K.value).concat(f||"")}))});return y.createElement("g",{className:"recharts-cartesian-axis-ticks recharts-".concat(D,"-ticks")},y.createElement(Sq,{ticks:B,axisId:U,axisType:D}),X.length>0&&y.createElement(Mi,{zIndex:pr.label},y.createElement("g",{className:"recharts-cartesian-axis-tick-labels recharts-".concat(D,"-tick-labels"),ref:t},X)),se.length>0&&y.createElement("g",{className:"recharts-cartesian-axis-tick-lines recharts-".concat(D,"-tick-lines")},se))}),Eq=y.forwardRef((e,t)=>{var r=e.axisLine,n=e.width,a=e.height,o=e.className,c=e.hide,u=e.ticks,f=e.axisType,h=e.axisId,m=mq(e,uq),g=y.useState(""),v=y2(g,2),b=v[0],j=v[1],k=y.useState(""),S=y2(k,2),N=S[0],E=S[1],A=y.useRef(null);y.useImperativeHandle(t,()=>({getCalculatedWidth:()=>{var _;return iq({ticks:A.current,label:(_=e.labelRef)===null||_===void 0?void 0:_.current,labelGapWithTick:5,tickSize:e.tickSize,tickMargin:e.tickMargin})}}));var P=y.useCallback(_=>{if(_){var O=_.getElementsByClassName("recharts-cartesian-axis-tick-value");A.current=O;var D=O[0];if(D){var U=window.getComputedStyle(D),B=U.fontSize,F=U.letterSpacing;(B!==b||F!==N)&&(j(B),E(F))}}},[b,N]);return c||n!=null&&n<=0||a!=null&&a<=0?null:y.createElement(Mi,{zIndex:e.zIndex},y.createElement(nn,{className:nt("recharts-cartesian-axis",o)},y.createElement(xq,{x:e.x,y:e.y,width:n,height:a,orientation:e.orientation,mirror:e.mirror,axisLine:r,otherSvgProps:kn(e)}),y.createElement(Nq,{ref:P,axisType:f,events:m,fontSize:b,getTicksConfig:e,height:e.height,letterSpacing:N,mirror:e.mirror,orientation:e.orientation,padding:e.padding,stroke:e.stroke,tick:e.tick,tickFormatter:e.tickFormatter,tickLine:e.tickLine,tickMargin:e.tickMargin,tickSize:e.tickSize,tickTextProps:e.tickTextProps,ticks:u,unit:e.unit,width:e.width,x:e.x,y:e.y,axisId:h}),y.createElement(YK,{x:e.x,y:e.y,width:e.width,height:e.height,lowerWidth:e.width,upperWidth:e.width},y.createElement(oG,{label:e.label,labelRef:e.labelRef}),e.children)))}),ix=y.forwardRef((e,t)=>{var r=on(e,xi);return y.createElement(Eq,Eo({},r,{ref:t}))});ix.displayName="CartesianAxis";var Aq=["x1","y1","x2","y2","key"],Cq=["offset"],Pq=["xAxisId","yAxisId"],Oq=["xAxisId","yAxisId"];function w2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function or(e){for(var t=1;t{var t=e.fill;if(!t||t==="none")return null;var r=e.fillOpacity,n=e.x,a=e.y,o=e.width,c=e.height,u=e.ry;return y.createElement("rect",{x:n,y:a,ry:u,width:o,height:c,stroke:"none",fill:t,fillOpacity:r,className:"recharts-cartesian-grid-bg"})};function uO(e){var t=e.option,r=e.lineItemProps,n;if(y.isValidElement(t))n=y.cloneElement(t,r);else if(typeof t=="function")n=t(r);else{var a,o=r.x1,c=r.y1,u=r.x2,f=r.y2,h=r.key,m=rh(r,Aq),g=(a=kn(m))!==null&&a!==void 0?a:{};g.offset;var v=rh(g,Cq);n=y.createElement("line",no({},v,{x1:o,y1:c,x2:u,y2:f,fill:"none",key:h}))}return n}function Rq(e){var t=e.x,r=e.width,n=e.horizontal,a=n===void 0?!0:n,o=e.horizontalPoints;if(!a||!o||!o.length)return null;e.xAxisId,e.yAxisId;var c=rh(e,Pq),u=o.map((f,h)=>{var m=or(or({},c),{},{x1:t,y1:f,x2:t+r,y2:f,key:"line-".concat(h),index:h});return y.createElement(uO,{key:"line-".concat(h),option:a,lineItemProps:m})});return y.createElement("g",{className:"recharts-cartesian-grid-horizontal"},u)}function Lq(e){var t=e.y,r=e.height,n=e.vertical,a=n===void 0?!0:n,o=e.verticalPoints;if(!a||!o||!o.length)return null;e.xAxisId,e.yAxisId;var c=rh(e,Oq),u=o.map((f,h)=>{var m=or(or({},c),{},{x1:f,y1:t,x2:f,y2:t+r,key:"line-".concat(h),index:h});return y.createElement(uO,{option:a,lineItemProps:m,key:"line-".concat(h)})});return y.createElement("g",{className:"recharts-cartesian-grid-vertical"},u)}function $q(e){var t=e.horizontalFill,r=e.fillOpacity,n=e.x,a=e.y,o=e.width,c=e.height,u=e.horizontalPoints,f=e.horizontal,h=f===void 0?!0:f;if(!h||!t||!t.length||u==null)return null;var m=u.map(v=>Math.round(v+a-a)).sort((v,b)=>v-b);a!==m[0]&&m.unshift(0);var g=m.map((v,b)=>{var j=m[b+1],k=j==null,S=k?a+c-v:j-v;if(S<=0)return null;var N=b%t.length;return y.createElement("rect",{key:"react-".concat(b),y:v,x:n,height:S,width:o,stroke:"none",fill:t[N],fillOpacity:r,className:"recharts-cartesian-grid-bg"})});return y.createElement("g",{className:"recharts-cartesian-gridstripes-horizontal"},g)}function zq(e){var t=e.vertical,r=t===void 0?!0:t,n=e.verticalFill,a=e.fillOpacity,o=e.x,c=e.y,u=e.width,f=e.height,h=e.verticalPoints;if(!r||!n||!n.length)return null;var m=h.map(v=>Math.round(v+o-o)).sort((v,b)=>v-b);o!==m[0]&&m.unshift(0);var g=m.map((v,b)=>{var j=m[b+1],k=j==null,S=k?o+u-v:j-v;if(S<=0)return null;var N=b%n.length;return y.createElement("rect",{key:"react-".concat(b),x:v,y:c,width:S,height:f,stroke:"none",fill:n[N],fillOpacity:a,className:"recharts-cartesian-grid-bg"})});return y.createElement("g",{className:"recharts-cartesian-gridstripes-vertical"},g)}var Fq=(e,t)=>{var r=e.xAxis,n=e.width,a=e.height,o=e.offset;return H5(nx(or(or(or({},xi),r),{},{ticks:W5(r),viewBox:{x:0,y:0,width:n,height:a}})),o.left,o.left+o.width,t)},Bq=(e,t)=>{var r=e.yAxis,n=e.width,a=e.height,o=e.offset;return H5(nx(or(or(or({},xi),r),{},{ticks:W5(r),viewBox:{x:0,y:0,width:n,height:a}})),o.top,o.top+o.height,t)},Uq={horizontal:!0,vertical:!0,horizontalPoints:[],verticalPoints:[],stroke:"#ccc",fill:"none",verticalFill:[],horizontalFill:[],xAxisId:0,yAxisId:0,syncWithTicks:!1,zIndex:pr.grid};function cO(e){var t=Z5(),r=J5(),n=X5(),a=or(or({},on(e,Uq)),{},{x:Ee(e.x)?e.x:n.left,y:Ee(e.y)?e.y:n.top,width:Ee(e.width)?e.width:n.width,height:Ee(e.height)?e.height:n.height}),o=a.xAxisId,c=a.yAxisId,u=a.x,f=a.y,h=a.width,m=a.height,g=a.syncWithTicks,v=a.horizontalValues,b=a.verticalValues,j=Pr(),k=Me(B=>jS(B,"xAxis",o,j)),S=Me(B=>jS(B,"yAxis",c,j));if(!Vn(h)||!Vn(m)||!Ee(u)||!Ee(f))return null;var N=a.verticalCoordinatesGenerator||Fq,E=a.horizontalCoordinatesGenerator||Bq,A=a.horizontalPoints,P=a.verticalPoints;if((!A||!A.length)&&typeof E=="function"){var _=v&&v.length,O=E({yAxis:S?or(or({},S),{},{ticks:_?v:S.ticks}):void 0,width:t??h,height:r??m,offset:n},_?!0:g);Cf(Array.isArray(O),"horizontalCoordinatesGenerator should return Array but instead it returned [".concat(typeof O,"]")),Array.isArray(O)&&(A=O)}if((!P||!P.length)&&typeof N=="function"){var D=b&&b.length,U=N({xAxis:k?or(or({},k),{},{ticks:D?b:k.ticks}):void 0,width:t??h,height:r??m,offset:n},D?!0:g);Cf(Array.isArray(U),"verticalCoordinatesGenerator should return Array but instead it returned [".concat(typeof U,"]")),Array.isArray(U)&&(P=U)}return y.createElement(Mi,{zIndex:a.zIndex},y.createElement("g",{className:"recharts-cartesian-grid"},y.createElement(Dq,{fill:a.fill,fillOpacity:a.fillOpacity,x:a.x,y:a.y,width:a.width,height:a.height,ry:a.ry}),y.createElement($q,no({},a,{horizontalPoints:A})),y.createElement(zq,no({},a,{verticalPoints:P})),y.createElement(Rq,no({},a,{offset:n,horizontalPoints:A,xAxis:k,yAxis:S})),y.createElement(Lq,no({},a,{offset:n,verticalPoints:P,xAxis:k,yAxis:S}))))}cO.displayName="CartesianGrid";var Hq={},dO=lr({name:"errorBars",initialState:Hq,reducers:{addErrorBar:(e,t)=>{var r=t.payload,n=r.itemId,a=r.errorBar;e[n]||(e[n]=[]),e[n].push(a)},replaceErrorBar:(e,t)=>{var r=t.payload,n=r.itemId,a=r.prev,o=r.next;e[n]&&(e[n]=e[n].map(c=>c.dataKey===a.dataKey&&c.direction===a.direction?o:c))},removeErrorBar:(e,t)=>{var r=t.payload,n=r.itemId,a=r.errorBar;e[n]&&(e[n]=e[n].filter(o=>o.dataKey!==a.dataKey||o.direction!==a.direction))}}}),ax=dO.actions;ax.addErrorBar;ax.replaceErrorBar;ax.removeErrorBar;var Wq=dO.reducer;function fO(e,t){var r,n,a=Me(h=>Pi(h,e)),o=Me(h=>Oi(h,t)),c=(r=a==null?void 0:a.allowDataOverflow)!==null&&r!==void 0?r:Ct.allowDataOverflow,u=(n=o==null?void 0:o.allowDataOverflow)!==null&&n!==void 0?n:Pt.allowDataOverflow,f=c||u;return{needClip:f,needClipX:c,needClipY:u}}function Kq(e){var t=e.xAxisId,r=e.yAxisId,n=e.clipPathId,a=rx(),o=fO(t,r),c=o.needClipX,u=o.needClipY,f=o.needClip,h=Me(A=>YC(A,t,!1)),m=Me(A=>XC(A,r,!1));if(!f||!a)return null;var g=a.x,v=a.y,b=a.width,j=a.height,k=c&&h?Math.min(h[0],h[1]):g-b/2,S=u&&m?Math.min(m[0],m[1]):v-j/2,N=c&&h?Math.abs(h[1]-h[0]):b*2,E=u&&m?Math.abs(m[1]-m[0]):j*2;return y.createElement("clipPath",{id:"clipPath-".concat(n)},y.createElement("rect",{x:k,y:S,width:N,height:E}))}function Gq(e){var t=yh(e),r=3,n=2;if(t!=null){var a=t.r,o=t.strokeWidth,c=Number(a),u=Number(o);return(Number.isNaN(c)||c<0)&&(c=r),(Number.isNaN(u)||u<0)&&(u=n),{r:c,strokeWidth:u}}return{r,strokeWidth:n}}function ox(e,t){var r,n;return(r=(n=e.graphicalItems.cartesianItems.find(a=>a.id===t))===null||n===void 0?void 0:n.xAxisId)!==null&&r!==void 0?r:rO}function sx(e,t){var r,n;return(r=(n=e.graphicalItems.cartesianItems.find(a=>a.id===t))===null||n===void 0?void 0:n.yAxisId)!==null&&r!==void 0?r:rO}var hO=(e,t,r)=>aP(e,"xAxis",ox(e,t),r),mO=(e,t,r)=>iP(e,"xAxis",ox(e,t),r),pO=(e,t,r)=>aP(e,"yAxis",sx(e,t),r),gO=(e,t,r)=>iP(e,"yAxis",sx(e,t),r),Vq=q([ft,hO,pO,mO,gO],(e,t,r,n,a)=>Xn(e,"xAxis")?Af(t,n,!1):Af(r,a,!1)),qq=(e,t)=>t,vO=q([SC,qq],(e,t)=>e.filter(r=>r.type==="area").find(r=>r.id===t)),yO=e=>{var t=ft(e),r=Xn(t,"xAxis");return r?"yAxis":"xAxis"},Qq=(e,t)=>{var r=yO(e);return r==="yAxis"?sx(e,t):ox(e,t)},Yq=(e,t,r)=>TC(e,yO(e),Qq(e,t),r),Xq=q([vO,Yq],(e,t)=>{var r;if(!(e==null||t==null)){var n=e.stackId,a=s0(e);if(!(n==null||a==null)){var o=(r=t[n])===null||r===void 0?void 0:r.stackedData,c=o==null?void 0:o.find(u=>u.key===a);if(c!=null)return c.map(u=>[u[0],u[1]])}}}),Zq=q([ft,hO,pO,mO,gO,Xq,kF,Vq,vO,zF],(e,t,r,n,a,o,c,u,f,h)=>{var m=c.chartData,g=c.dataStartIndex,v=c.dataEndIndex;if(!(f==null||e!=="horizontal"&&e!=="vertical"||t==null||r==null||n==null||a==null||n.length===0||a.length===0||u==null)){var b=f.data,j;if(b&&b.length>0?j=b:j=m==null?void 0:m.slice(g,v+1),j!=null)return SQ({layout:e,xAxis:t,yAxis:r,xAxisTicks:n,yAxisTicks:a,dataStartIndex:g,areaSettings:f,stackedData:o,displayedData:j,chartBaseValue:h,bandSize:u})}}),Jq=["animationElapsedTime","isAnimating","isEntrance","layout","isRange","stroke","connectNulls"],eQ=["id","baseLine"];function wu(){return wu=Object.assign?Object.assign.bind():function(e){for(var t=1;tg.y||0));return Ee(a)?m=Math.max(a,m):a&&Array.isArray(a)&&a.length&&(m=Math.max(...a.map(g=>g.y||0),m)),Ee(m)?y.createElement("rect",{x:ug.x||0));return Ee(a)?m=Math.max(a,m):a&&Array.isArray(a)&&a.length&&(m=Math.max(...a.map(g=>g.x||0),m)),Ee(m)?y.createElement("rect",{x:0,y:ue==null?[]:t===1?e.flatMap(r=>r.status==="removed"?[]:[r.next]):e.flatMap(r=>r.status==="matched"?[Js(Js({},r.next),{},{x:mi(r.prev.x,r.next.x,t),y:mi(r.prev.y,r.next.y,t)})]:r.status==="added"?[r.next]:[]),bO={activeDot:!0,animationBegin:0,animationDuration:1500,animationEasing:"ease",animationMatchBy:ex,animationInterpolateFn:fQ,connectNulls:!1,dot:!1,fill:"#3182bd",fillOpacity:.6,hide:!1,isAnimationActive:"auto",legendType:"line",stroke:"#3182bd",strokeWidth:1,type:"linear",label:!1,shape:aQ,xAxisId:0,yAxisId:0,zIndex:pr.area};function ih(e,t){return e&&e!=="none"?e:t}var hQ=e=>{var t=e.dataKey,r=e.name,n=e.stroke,a=e.fill,o=e.legendType,c=e.hide;return[{inactive:c,dataKey:t,type:o,color:ih(n,a),value:K5(r,t),payload:e}]},mQ=y.memo(e=>{var t=e.dataKey,r=e.data,n=e.stroke,a=e.strokeWidth,o=e.fill,c=e.name,u=e.hide,f=e.unit,h=e.tooltipType,m=e.id,g={dataDefinedOnItem:r,getPosition:rl,settings:{stroke:n,strokeWidth:a,fill:o,dataKey:t,nameKey:void 0,name:K5(c,t),hide:u,type:h,color:ih(n,o),unit:f,graphicalItemId:m}};return y.createElement(EG,{tooltipEntrySettings:g})});function pQ(e){var t=e.clipPathId,r=e.points,n=e.props,a=n.needClip,o=n.dot,c=n.dataKey,u=kn(n);return y.createElement(pV,{points:r,dot:o,className:"recharts-area-dots",dotClassName:"recharts-area-dot",dataKey:c,baseProps:u,needClip:a,clipPathId:t})}function gQ(e){var t=e.showLabels,r=e.children,n=e.points,a=n.map(o=>{var c,u,f={x:(c=o.x)!==null&&c!==void 0?c:0,y:(u=o.y)!==null&&u!==void 0?u:0,width:0,lowerWidth:0,upperWidth:0,height:0};return Js(Js({},f),{},{value:o.value,payload:o.payload,parentViewBox:void 0,viewBox:f,fill:void 0})});return y.createElement(dG,{value:t?a:void 0},r)}function vQ(e){var t=e.points,r=e.baseLine,n=e.needClip,a=e.clipPathId,o=e.props,c=e.animationElapsedTime,u=e.isAnimating,f=e.isEntrance,h=o.layout,m=o.type,g=o.stroke,v=o.connectNulls,b=o.isRange,j=o.shape,k=o.id,S=xO(o,oQ),N=rn(S),E=Js(Js({},N),{},{id:k,points:t,connectNulls:v,type:m,baseLine:r,layout:h,stroke:g,isRange:b,animationElapsedTime:c,isAnimating:u,isEntrance:f});return y.createElement(y.Fragment,null,(t==null?void 0:t.length)>1&&y.createElement(nn,{clipPath:n?"url(#clipPath-".concat(a,")"):void 0},y.createElement(NG,{option:j,DefaultShape:bO.shape,shapeProps:E})),y.createElement(pQ,{points:t,props:S,clipPathId:a}))}function yQ(e,t,r){if(Ee(e)){var n=Ee(t)?t:void 0;return mi(n,e,r)}if(Yt(e)||Kn(e)){var a=Ee(t)?t:void 0;return mi(a,0,r)}return e}function xQ(e){var t=e.needClip,r=e.clipPathId,n=e.props,a=e.previousPointsRef,o=e.previousBaselineRef,c=n.points,u=n.baseLine,f=n.isAnimationActive,h=n.animationBegin,m=n.animationDuration,g=n.animationEasing,v=n.animationMatchBy,b=n.animationInterpolateFn,j=y.useMemo(()=>({points:c,baseLine:u}),[c,u]),k=JP(j,o),S=Vy(),N=HG(n.onAnimationStart,n.onAnimationEnd),E=N.isAnimating,A=N.handleAnimationStart,P=N.handleAnimationEnd,_=k.startValue;if(S==null)return null;var O;return Array.isArray(u)&&Array.isArray(_)?O=uy(_,u,v):Array.isArray(u)?O=uy(null,u,v):O=null,y.createElement(WG,{animationInput:j,animationIdPrefix:"recharts-area-",items:c,previousItemsRef:a,isAnimationActive:f,animationBegin:h,animationDuration:m,animationEasing:g,onAnimationStart:A,onAnimationEnd:P,animationInterpolateFn:b,animationMatchBy:v,layout:S},(D,U,B)=>{var F;return U===1?F=u:Array.isArray(u)?F=b(O,U,S):F=B?u:yQ(u,_,U),k.syncStepValue(F,U),y.createElement(gQ,{showLabels:!E,points:c},n.children,y.createElement(vQ,{points:D,baseLine:F,needClip:t,clipPathId:r,props:n,animationElapsedTime:U,isAnimating:E||U<1,isEntrance:B}),y.createElement(mG,{label:n.label}))})}function bQ(e){var t=e.needClip,r=e.clipPathId,n=e.props,a=y.useRef(null),o=y.useRef();return y.createElement(xQ,{needClip:t,clipPathId:r,props:n,previousPointsRef:a,previousBaselineRef:o})}class wQ extends y.PureComponent{render(){var t=this.props,r=t.hide,n=t.dot,a=t.points,o=t.className,c=t.top,u=t.left,f=t.needClip,h=t.xAxisId,m=t.yAxisId,g=t.width,v=t.height,b=t.id,j=t.baseLine,k=t.zIndex;if(r)return null;var S=nt("recharts-area",o),N=b,E=Gq(n),A=E.r,P=E.strokeWidth,_=XP(n),O=A*2+P,D=f?"url(#clipPath-".concat(_?"":"dots-").concat(N,")"):void 0;return y.createElement(Mi,{zIndex:k},y.createElement(nn,{className:S},f&&y.createElement("defs",null,y.createElement(Kq,{clipPathId:N,xAxisId:h,yAxisId:m}),!_&&y.createElement("clipPath",{id:"clipPath-dots-".concat(N)},y.createElement("rect",{x:u-O/2,y:c-O/2,width:g+O,height:v+O}))),y.createElement(bQ,{needClip:f,clipPathId:N,props:this.props})),y.createElement(m2,{points:a,mainColor:ih(this.props.stroke,this.props.fill),itemDataKey:this.props.dataKey,activeDot:this.props.activeDot,clipPath:D}),this.props.isRange&&Array.isArray(j)&&y.createElement(m2,{points:j,mainColor:ih(this.props.stroke,this.props.fill),itemDataKey:this.props.dataKey,activeDot:this.props.activeDot,clipPath:D}))}}function kQ(e){var t,r=e.activeDot,n=e.animationBegin,a=e.animationDuration,o=e.animationEasing,c=e.connectNulls,u=e.dot,f=e.fill,h=e.fillOpacity,m=e.hide,g=e.isAnimationActive,v=e.legendType,b=e.stroke,j=e.xAxisId,k=e.yAxisId,S=xO(e,sQ),N=nl(),E=CP(),A=fO(j,k),P=A.needClip,_=Pr(),O=(t=Me(he=>Zq(he,e.id,_)))!==null&&t!==void 0?t:{},D=O.points,U=O.isRange,B=O.baseLine,F=rx();if(N!=="horizontal"&&N!=="vertical"||F==null||E!=="AreaChart"&&E!=="ComposedChart")return null;var Y=F.height,H=F.width,pe=F.x,ue=F.y;return!D||!D.length?null:y.createElement(wQ,nh({},S,{activeDot:r,animationBegin:n,animationDuration:a,animationEasing:o,baseLine:B,connectNulls:c,dot:u,fill:f,fillOpacity:h,height:Y,hide:m,layout:N,isAnimationActive:g,isRange:U,legendType:v,needClip:P,points:D,stroke:b,width:H,left:pe,top:ue,xAxisId:j,yAxisId:k}))}var jQ=(e,t,r,n,a)=>{var o=r??t;if(Ee(o))return o;var c=e==="horizontal"?a:n,u=c.scale.domain();if(c.type==="number"){var f=Math.max(u[0],u[1]),h=Math.min(u[0],u[1]);return o==="dataMin"?h:o==="dataMax"||f<0?f:Math.max(Math.min(u[0],u[1]),0)}return o==="dataMin"?u[0]:o==="dataMax"?u[1]:u[0]};function SQ(e){var t=e.areaSettings,r=t.connectNulls,n=t.baseValue,a=t.dataKey,o=e.stackedData,c=e.layout,u=e.chartBaseValue,f=e.xAxis,h=e.yAxis,m=e.displayedData,g=e.dataStartIndex,v=e.xAxisTicks,b=e.yAxisTicks,j=e.bandSize,k=o&&o.length,S=jQ(c,u,n,f,h),N=c==="horizontal",E=!1,A=m.map((_,O)=>{var D,U,B,F;if(k)F=o[g+O];else{var Y=Lt(_,a);Array.isArray(Y)?(F=Y,E=!0):F=[S,Y]}var H=(D=(U=F)===null||U===void 0?void 0:U[1])!==null&&D!==void 0?D:null,pe=H==null||k&&!r&&Lt(_,a)==null;if(N){var ue;return{x:yk({axis:f,ticks:v,bandSize:j,entry:_,index:O}),y:pe?null:(ue=h.scale.map(H))!==null&&ue!==void 0?ue:null,value:F,payload:_}}return{x:pe?null:(B=f.scale.map(H))!==null&&B!==void 0?B:null,y:yk({axis:h,ticks:b,bandSize:j,entry:_,index:O}),value:F,payload:_}}),P;return k||E?P=A.map(_=>{var O,D=Array.isArray(_.value)?_.value[0]:null;if(N){var U;return{x:_.x,y:D!=null&&_.y!=null&&(U=h.scale.map(D))!==null&&U!==void 0?U:null,payload:_.payload}}return{x:D!=null&&(O=f.scale.map(D))!==null&&O!==void 0?O:null,y:_.y,payload:_.payload}}):P=N?h.scale.map(S):f.scale.map(S),{points:A,baseLine:P??0,isRange:E}}function NQ(e){var t=on(e,bO),r=Pr();return y.createElement(JG,{id:t.id,type:"area"},n=>y.createElement(y.Fragment,null,y.createElement(AG,{legendPayload:hQ(t)}),y.createElement(mQ,{dataKey:t.dataKey,data:t.data,stroke:t.stroke,strokeWidth:t.strokeWidth,fill:t.fill,name:t.name,hide:t.hide,unit:t.unit,tooltipType:t.tooltipType,id:n}),y.createElement(oV,{type:"area",id:n,data:t.data,dataKey:t.dataKey,xAxisId:t.xAxisId,yAxisId:t.yAxisId,zAxisId:0,stackId:lz(t.stackId),hide:t.hide,barSize:void 0,baseValue:t.baseValue,isPanorama:r,connectNulls:t.connectNulls}),y.createElement(kQ,nh({},t,{id:n}))))}var wO=y.memo(NQ,Fh);wO.displayName="Area";var EQ=["domain","range"],AQ=["domain","range"];function S2(e,t){if(e==null)return{};var r,n,a=CQ(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n{if(c!=null)return A2(A2({},o),{},{type:c})},[o,c]);return y.useLayoutEffect(()=>{u!=null&&(r.current===null?t(bV(u)):r.current!==u&&t(wV({prev:r.current,next:u})),r.current=u)},[u,t]),y.useLayoutEffect(()=>()=>{r.current&&(t(kV(r.current)),r.current=null)},[t]),null}var LQ=e=>{var t=e.xAxisId,r=e.className,n=Me(V5),a=Pr(),o="xAxis",c=Me(v=>nP(v,o,t,a)),u=Me(v=>vU(v,t)),f=Me(v=>jU(v,t)),h=Me(v=>bC(v,t));if(u==null||f==null||h==null)return null;e.dangerouslySetInnerHTML,e.ticks,e.scale;var m=dy(e,OQ);h.id,h.scale;var g=dy(h,_Q);return y.createElement(ix,cy({},m,g,{x:f.x,y:f.y,width:u.width,height:u.height,className:nt("recharts-".concat(o," ").concat(o),r),viewBox:n,ticks:c,axisType:o,axisId:t}))},$Q={allowDataOverflow:Ct.allowDataOverflow,allowDecimals:Ct.allowDecimals,allowDuplicatedCategory:Ct.allowDuplicatedCategory,angle:Ct.angle,axisLine:xi.axisLine,height:Ct.height,hide:!1,includeHidden:Ct.includeHidden,interval:Ct.interval,label:!1,minTickGap:Ct.minTickGap,mirror:Ct.mirror,orientation:Ct.orientation,padding:Ct.padding,reversed:Ct.reversed,scale:Ct.scale,tick:Ct.tick,tickCount:Ct.tickCount,tickLine:xi.tickLine,tickSize:xi.tickSize,type:Ct.type,niceTicks:Ct.niceTicks,xAxisId:0},zQ=e=>{var t=on(e,$Q);return y.createElement(y.Fragment,null,y.createElement(RQ,{allowDataOverflow:t.allowDataOverflow,allowDecimals:t.allowDecimals,allowDuplicatedCategory:t.allowDuplicatedCategory,angle:t.angle,dataKey:t.dataKey,domain:t.domain,height:t.height,hide:t.hide,id:t.xAxisId,includeHidden:t.includeHidden,interval:t.interval,minTickGap:t.minTickGap,mirror:t.mirror,name:t.name,orientation:t.orientation,padding:t.padding,reversed:t.reversed,scale:t.scale,tick:t.tick,tickCount:t.tickCount,tickFormatter:t.tickFormatter,ticks:t.ticks,type:t.type,unit:t.unit,niceTicks:t.niceTicks}),y.createElement(LQ,t))},jO=y.memo(zQ,kO);jO.displayName="XAxis";var FQ=["type"],BQ=["dangerouslySetInnerHTML","ticks","scale"],UQ=["id","scale"];function fy(){return fy=Object.assign?Object.assign.bind():function(e){for(var t=1;t{if(c!=null)return P2(P2({},o),{},{type:c})},[c,o]);return y.useLayoutEffect(()=>{u!=null&&(r.current===null?t(jV(u)):r.current!==u&&t(SV({prev:r.current,next:u})),r.current=u)},[u,t]),y.useLayoutEffect(()=>()=>{r.current&&(t(NV(r.current)),r.current=null)},[t]),null}function qQ(e){var t=e.yAxisId,r=e.className,n=e.width,a=e.label,o=y.useRef(null),c=y.useRef(null),u=Me(V5),f=Pr(),h=Nt(),m="yAxis",g=Me(N=>EU(N,t)),v=Me(N=>NU(N,t)),b=Me(N=>nP(N,m,t,f)),j=Me(N=>wC(N,t));if(y.useLayoutEffect(()=>{if(!(n!=="auto"||!g||J0(a)||y.isValidElement(a)||j==null)){var N=o.current;if(N){var E=N.getCalculatedWidth();Math.round(g.width)!==Math.round(E)&&h(EV({id:t,width:E}))}}},[b,g,h,a,t,n,j]),g==null||v==null||j==null)return null;e.dangerouslySetInnerHTML,e.ticks,e.scale;var k=hy(e,BQ);j.id,j.scale;var S=hy(j,UQ);return y.createElement(ix,fy({},k,S,{ref:o,labelRef:c,x:v.x,y:v.y,tickTextProps:n==="auto"?{width:void 0}:{width:n},width:g.width,height:g.height,className:nt("recharts-".concat(m," ").concat(m),r),viewBox:u,ticks:b,axisType:m,axisId:t}))}var QQ={allowDataOverflow:Pt.allowDataOverflow,allowDecimals:Pt.allowDecimals,allowDuplicatedCategory:Pt.allowDuplicatedCategory,angle:Pt.angle,axisLine:xi.axisLine,hide:!1,includeHidden:Pt.includeHidden,interval:Pt.interval,label:!1,minTickGap:Pt.minTickGap,mirror:Pt.mirror,orientation:Pt.orientation,padding:Pt.padding,reversed:Pt.reversed,scale:Pt.scale,tick:Pt.tick,tickCount:Pt.tickCount,tickLine:xi.tickLine,tickSize:xi.tickSize,type:Pt.type,niceTicks:Pt.niceTicks,width:Pt.width,yAxisId:0},YQ=e=>{var t=on(e,QQ);return y.createElement(y.Fragment,null,y.createElement(VQ,{interval:t.interval,id:t.yAxisId,scale:t.scale,type:t.type,domain:t.domain,allowDataOverflow:t.allowDataOverflow,dataKey:t.dataKey,allowDuplicatedCategory:t.allowDuplicatedCategory,allowDecimals:t.allowDecimals,tickCount:t.tickCount,padding:t.padding,includeHidden:t.includeHidden,reversed:t.reversed,ticks:t.ticks,width:t.width,orientation:t.orientation,mirror:t.mirror,hide:t.hide,unit:t.unit,name:t.name,angle:t.angle,minTickGap:t.minTickGap,tick:t.tick,tickFormatter:t.tickFormatter,niceTicks:t.niceTicks}),y.createElement(qQ,t))},SO=y.memo(YQ,kO);SO.displayName="YAxis";var XQ=(e,t)=>t,lx=q([XQ,ft,DA,Ft,kP,_i,qH,Zt],tW);function ZQ(e){return"getBBox"in e.currentTarget&&typeof e.currentTarget.getBBox=="function"}function ux(e){var t=e.currentTarget.getBoundingClientRect(),r,n;if(ZQ(e)){var a=e.currentTarget.getBBox();r=a.width>0?t.width/a.width:1,n=a.height>0?t.height/a.height:1}else{var o=e.currentTarget;r=o.offsetWidth>0?t.width/o.offsetWidth:1,n=o.offsetHeight>0?t.height/o.offsetHeight:1}var c=(u,f)=>({relativeX:Math.round((u-t.left)/r),relativeY:Math.round((f-t.top)/n)});return"touches"in e?Array.from(e.touches).map(u=>c(u.clientX,u.clientY)):c(e.clientX,e.clientY)}var NO=Hr("mouseClick"),EO=Zu();EO.startListening({actionCreator:NO,effect:(e,t)=>{var r=e.payload,n=lx(t.getState(),ux(r));(n==null?void 0:n.activeIndex)!=null&&t.dispatch(BU({activeIndex:n.activeIndex,activeDataKey:void 0,activeCoordinate:n.activeCoordinate}))}});var my=Hr("mouseMove"),AO=Zu(),hs=null,Ha=null,Bg=null;AO.startListening({actionCreator:my,effect:(e,t)=>{var r=e.payload,n=t.getState(),a=n.eventSettings,o=a.throttleDelay,c=a.throttledEvents,u=c==="all"||(c==null?void 0:c.includes("mousemove"));hs!==null&&(cancelAnimationFrame(hs),hs=null),Ha!==null&&(typeof o!="number"||!u)&&(clearTimeout(Ha),Ha=null),Bg=ux(r);var f=()=>{var h=t.getState(),m=dc(h,h.tooltip.settings.shared);if(!Bg){hs=null,Ha=null;return}if(m==="axis"){var g=lx(h,Bg);(g==null?void 0:g.activeIndex)!=null?t.dispatch(fP({activeIndex:g.activeIndex,activeDataKey:void 0,activeCoordinate:g.activeCoordinate})):t.dispatch(dP())}hs=null,Ha=null};if(!u){f();return}o==="raf"?hs=requestAnimationFrame(f):typeof o=="number"&&Ha===null&&(Ha=setTimeout(f,o))}});function JQ(e,t){return t instanceof HTMLElement?"HTMLElement <".concat(t.tagName,' class="').concat(t.className,'">'):t===window?"global.window":e==="children"&&typeof t=="object"&&t!==null?"<>":t}var O2={accessibilityLayer:!0,barCategoryGap:"10%",barGap:4,barSize:void 0,className:void 0,maxBarSize:void 0,stackOffset:"none",syncId:void 0,syncMethod:"index",baseValue:void 0,reverseStackOrder:!1},CO=lr({name:"rootProps",initialState:O2,reducers:{updateOptions:(e,t)=>{var r;e.accessibilityLayer=t.payload.accessibilityLayer,e.barCategoryGap=t.payload.barCategoryGap,e.barGap=(r=t.payload.barGap)!==null&&r!==void 0?r:O2.barGap,e.barSize=t.payload.barSize,e.maxBarSize=t.payload.maxBarSize,e.stackOffset=t.payload.stackOffset,e.syncId=t.payload.syncId,e.syncMethod=t.payload.syncMethod,e.className=t.payload.className,e.baseValue=t.payload.baseValue,e.reverseStackOrder=t.payload.reverseStackOrder}}}),eY=CO.reducer,tY=CO.actions.updateOptions,rY=null,nY={updatePolarOptions:(e,t)=>e===null?t.payload:(e.startAngle=t.payload.startAngle,e.endAngle=t.payload.endAngle,e.cx=t.payload.cx,e.cy=t.payload.cy,e.innerRadius=t.payload.innerRadius,e.outerRadius=t.payload.outerRadius,e)},PO=lr({name:"polarOptions",initialState:rY,reducers:nY});PO.actions.updatePolarOptions;var iY=PO.reducer,OO=Hr("keyDown"),_O=Hr("focus"),MO=Hr("blur"),om=Zu(),ms=null,Wa=null,Gd=null;om.startListening({actionCreator:OO,effect:(e,t)=>{Gd=e.payload,ms!==null&&(cancelAnimationFrame(ms),ms=null);var r=t.getState(),n=r.eventSettings,a=n.throttleDelay,o=n.throttledEvents,c=o==="all"||o.includes("keydown");Wa!==null&&(typeof a!="number"||!c)&&(clearTimeout(Wa),Wa=null);var u=()=>{try{var f=t.getState(),h=f.rootProps.accessibilityLayer!==!1;if(!h)return;var m=f.tooltip.keyboardInteraction,g=Gd;if(g!=="ArrowRight"&&g!=="ArrowLeft"&&g!=="Enter")return;var v=xu(m,No(f),Xs(f),Zs(f)),b=v==null?-1:Number(v),j=!Number.isFinite(b)||b<0,k=_i(f),S=No(f),N=dc(f,f.tooltip.settings.shared);if(g==="Enter"){if(j)return;var E=Zf(f,N,"hover",String(m.index));t.dispatch(Xf({active:!m.active,activeIndex:m.index,activeCoordinate:E}));return}var A=_U(f),P=A==="left-to-right"?1:-1,_=g==="ArrowRight"?1:-1,O;if(j){var D=Xs(f),U=Zs(f),B=_*P,F=he=>({active:!1,index:String(he),dataKey:void 0,graphicalItemId:void 0,coordinate:void 0});if(O=-1,B>0){for(var Y=0;Y=0;H--)if(xu(F(H),S,D,U)!=null){O=H;break}if(O<0)return}else{O=b+_*P;var pe=(k==null?void 0:k.length)||S.length;if(pe===0||O>=pe||O<0)return}var ue=Zf(f,N,"hover",String(O));t.dispatch(Xf({active:!0,activeIndex:O.toString(),activeCoordinate:ue}))}finally{ms=null,Wa=null}};if(!c){u();return}a==="raf"?ms=requestAnimationFrame(u):typeof a=="number"&&Wa===null&&(u(),Gd=null,Wa=setTimeout(()=>{Gd?u():(Wa=null,ms=null)},a))}});om.startListening({actionCreator:_O,effect:(e,t)=>{var r=t.getState(),n=r.rootProps.accessibilityLayer!==!1;if(n){var a=r.tooltip.keyboardInteraction;if(!a.active&&a.index==null){var o="0",c=dc(r,r.tooltip.settings.shared),u=Zf(r,c,"hover",String(o));t.dispatch(Xf({active:!0,activeIndex:o,activeCoordinate:u}))}}}});om.startListening({actionCreator:MO,effect:(e,t)=>{var r=t.getState(),n=r.rootProps.accessibilityLayer!==!1;if(n){var a=r.tooltip.keyboardInteraction;a.active&&t.dispatch(Xf({active:!1,activeIndex:a.index,activeCoordinate:a.coordinate}))}}});function IO(e){e.persist();var t=e.currentTarget;return new Proxy(e,{get:(r,n)=>{if(n==="currentTarget")return t;var a=Reflect.get(r,n);return typeof a=="function"?a.bind(r):a}})}var Xr=Hr("externalEvent"),TO=Zu(),Vd=new Map,uu=new Map,Ug=new Map;TO.startListening({actionCreator:Xr,effect:(e,t)=>{var r=e.payload,n=r.handler,a=r.reactEvent;if(n!=null){var o=a.type,c=IO(a);Ug.set(o,{handler:n,reactEvent:c});var u=Vd.get(o);u!==void 0&&(cancelAnimationFrame(u),Vd.delete(o));var f=t.getState(),h=f.eventSettings,m=h.throttleDelay,g=h.throttledEvents,v=g,b=v==="all"||(v==null?void 0:v.includes(o)),j=uu.get(o);j!==void 0&&(typeof m!="number"||!b)&&(clearTimeout(j),uu.delete(o));var k=()=>{var E=Ug.get(o);try{if(!E)return;var A=E.handler,P=E.reactEvent,_=t.getState(),O={activeCoordinate:IH(_),activeDataKey:OH(_),activeIndex:Fu(_),activeLabel:NP(_),activeTooltipIndex:Fu(_),isTooltipActive:TH(_)};A&&A(O,P)}finally{Vd.delete(o),uu.delete(o),Ug.delete(o)}};if(!b){k();return}if(m==="raf"){var S=requestAnimationFrame(k);Vd.set(o,S)}else if(typeof m=="number"){if(!uu.has(o)){k();var N=setTimeout(k,m);uu.set(o,N)}}else k()}}});var aY=q([dl],e=>e.tooltipItemPayloads),oY=q([aY,(e,t)=>t,(e,t,r)=>r],(e,t,r)=>{if(t!=null){var n=e.find(o=>o.settings.graphicalItemId===r);if(n!=null){var a=n.getPosition;if(a!=null)return a(t)}}}),DO=Hr("touchMove"),RO=Zu(),Ka=null,ra=null,_2=null,cu=null;RO.startListening({actionCreator:DO,effect:(e,t)=>{var r=e.payload;if(!(r.touches==null||r.touches.length===0)){cu=IO(r);var n=t.getState(),a=n.eventSettings,o=a.throttleDelay,c=a.throttledEvents,u=c==="all"||c.includes("touchmove");Ka!==null&&(cancelAnimationFrame(Ka),Ka=null),ra!==null&&(typeof o!="number"||!u)&&(clearTimeout(ra),ra=null),_2=Array.from(r.touches).map(h=>ux({clientX:h.clientX,clientY:h.clientY,currentTarget:r.currentTarget}));var f=()=>{if(cu!=null){var h=t.getState(),m=dc(h,h.tooltip.settings.shared);if(m==="axis"){var g,v=(g=_2)===null||g===void 0?void 0:g[0];if(v==null){Ka=null,ra=null;return}var b=lx(h,v);(b==null?void 0:b.activeIndex)!=null&&t.dispatch(fP({activeIndex:b.activeIndex,activeDataKey:void 0,activeCoordinate:b.activeCoordinate}))}else if(m==="item"){var j,k=cu.touches[0];if(document.elementFromPoint==null||k==null)return;var S=document.elementFromPoint(k.clientX,k.clientY);if(!S||!S.getAttribute)return;var N=S.getAttribute(pz),E=(j=S.getAttribute(gz))!==null&&j!==void 0?j:void 0,A=Io(h).find(O=>O.id===E);if(N==null||A==null||E==null)return;var P=A.dataKey,_=oY(h,N,E);t.dispatch(FU({activeDataKey:P,activeIndex:N,activeCoordinate:_,activeGraphicalItemId:E}))}Ka=null,ra=null}};if(!u){f();return}o==="raf"?Ka=requestAnimationFrame(f):typeof o=="number"&&ra===null&&(f(),cu=null,ra=setTimeout(()=>{cu?f():(ra=null,Ka=null)},o))}}});var LO={throttleDelay:"raf",throttledEvents:["mousemove","touchmove","pointermove","scroll","wheel"]},$O=lr({name:"eventSettings",initialState:LO,reducers:{setEventSettings:(e,t)=>{t.payload.throttleDelay!=null&&(e.throttleDelay=t.payload.throttleDelay),t.payload.throttledEvents!=null&&(e.throttledEvents=t.payload.throttledEvents)}}}),sY=$O.actions.setEventSettings,lY=$O.reducer,uY=m5({brush:RV,cartesianAxis:AV,chartData:MW,errorBars:Wq,eventSettings:lY,graphicalItems:iV,layout:J$,legend:h6,options:AW,polarAxis:gG,polarOptions:iY,referenceElements:FV,renderedTicks:lq,rootProps:eY,tooltip:UU,zIndex:mW}),cY=function(t){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"Chart";return S$({reducer:uY,preloadedState:t,middleware:n=>{var a;return n({serializableCheck:!1,immutableCheck:!["commonjs","es6","production"].includes((a="es6")!==null&&a!==void 0?a:"")}).concat([EO.middleware,AO.middleware,om.middleware,TO.middleware,RO.middleware])},enhancers:n=>{var a=n;return typeof n=="function"&&(a=n()),a.concat(P5({type:"raf"}))},devTools:{serialize:{replacer:JQ},name:"recharts-".concat(r)}})};function dY(e){var t=e.preloadedState,r=e.children,n=e.reduxStoreName,a=Pr(),o=y.useRef(null);if(a)return r;o.current==null&&(o.current=cY(t,n));var c=$y;return y.createElement(P6,{context:c,store:o.current},r)}function fY(e){var t=e.layout,r=e.margin,n=Nt(),a=Pr();return y.useEffect(()=>{a||(n(Y$(t)),n(Q$(r)))},[n,a,t,r]),null}var hY=y.memo(fY,Fh);function mY(e){var t=Nt();return y.useEffect(()=>{t(tY(e))},[t,e]),null}var pY=e=>{var t=Nt();return y.useEffect(()=>{t(sY(e))},[t,e]),null},gY=y.memo(pY,Fh);function M2(e){var t=e.zIndex,r=e.isPanorama,n=y.useRef(null),a=Nt();return y.useLayoutEffect(()=>(n.current&&a(fW({zIndex:t,element:n.current,isPanorama:r})),()=>{a(hW({zIndex:t,isPanorama:r}))}),[a,t,r]),y.createElement("g",{tabIndex:-1,ref:n,className:"recharts-zIndex-layer_".concat(t)})}function I2(e){var t=e.children,r=e.isPanorama,n=Me(nW);if(!n||n.length===0)return t;var a=n.filter(c=>c<0),o=n.filter(c=>c>0);return y.createElement(y.Fragment,null,a.map(c=>y.createElement(M2,{key:c,zIndex:c,isPanorama:r})),t,o.map(c=>y.createElement(M2,{key:c,zIndex:c,isPanorama:r})))}var vY=["children"];function yY(e,t){if(e==null)return{};var r,n,a=xY(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n{var r=Z5(),n=J5(),a=uA();if(!Vn(r)||!Vn(n))return null;var o=e.children,c=e.otherAttributes,u=e.title,f=e.desc,h,m;return c!=null&&(typeof c.tabIndex=="number"?h=c.tabIndex:h=a?0:void 0,typeof c.role=="string"?m=c.role:m=a?"application":void 0),y.createElement(ME,ah({},c,{title:u,desc:f,role:m,tabIndex:h,width:r,height:n,style:bY,ref:t}),o)}),kY=e=>{var t=e.children,r=Me(Dh);if(!r)return null;var n=r.width,a=r.height,o=r.y,c=r.x;return y.createElement(ME,{width:n,height:a,x:c,y:o},t)},T2=y.forwardRef((e,t)=>{var r=e.children,n=yY(e,vY),a=Pr();return a?y.createElement(kY,null,y.createElement(I2,{isPanorama:!0},r)):y.createElement(wY,ah({ref:t},n),y.createElement(I2,{isPanorama:!1},r))});function jY(e,t){return AY(e)||EY(e,t)||NY(e,t)||SY()}function SY(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function NY(e,t){if(e){if(typeof e=="string")return D2(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?D2(e,t):void 0}}function D2(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{if(n!=null){var c=n.getBoundingClientRect(),u=c.width/n.offsetWidth;We(u)&&u!==o&&e(Z$(u))}},[n,e,o]),a}function R2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function PY(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);r(BW(),null);function sh(e){if(typeof e=="number")return e;if(typeof e=="string"){var t=parseFloat(e);if(!Number.isNaN(t))return t}return 0}var $Y=y.forwardRef((e,t)=>{var r,n,a=y.useRef(null),o=y.useState({containerWidth:sh((r=e.style)===null||r===void 0?void 0:r.width),containerHeight:sh((n=e.style)===null||n===void 0?void 0:n.height)}),c=oh(o,2),u=c[0],f=c[1],h=y.useCallback((g,v)=>{f(b=>{var j=Math.round(g),k=Math.round(v);return b.containerWidth===j&&b.containerHeight===k?b:{containerWidth:j,containerHeight:k}})},[]),m=y.useCallback(g=>{if(typeof t=="function"&&t(g),a.current!=null&&(a.current.disconnect(),a.current=null),g!=null&&typeof ResizeObserver<"u"){var v=g.getBoundingClientRect(),b=v.width,j=v.height;h(b,j);var k=N=>{var E=N[0];if(E!=null){var A=E.contentRect,P=A.width,_=A.height;h(P,_)}},S=new ResizeObserver(k);S.observe(g),a.current=S}},[t,h]);return y.useEffect(()=>()=>{var g=a.current;g!=null&&g.disconnect()},[h]),y.createElement(y.Fragment,null,y.createElement(ec,{width:u.containerWidth,height:u.containerHeight}),y.createElement("div",ka({ref:m},e)))}),zY=y.forwardRef((e,t)=>{var r=e.width,n=e.height,a=y.useState({containerWidth:sh(r),containerHeight:sh(n)}),o=oh(a,2),c=o[0],u=o[1],f=y.useCallback((m,g)=>{u(v=>{var b=Math.round(m),j=Math.round(g);return v.containerWidth===b&&v.containerHeight===j?v:{containerWidth:b,containerHeight:j}})},[]),h=y.useCallback(m=>{if(typeof t=="function"&&t(m),m!=null){var g=m.getBoundingClientRect(),v=g.width,b=g.height;f(v,b)}},[t,f]);return y.createElement(y.Fragment,null,y.createElement(ec,{width:c.containerWidth,height:c.containerHeight}),y.createElement("div",ka({ref:h},e)))}),FY=y.forwardRef((e,t)=>{var r=e.width,n=e.height;return y.createElement(y.Fragment,null,y.createElement(ec,{width:r,height:n}),y.createElement("div",ka({ref:t},e)))}),BY=y.forwardRef((e,t)=>{var r=e.width,n=e.height;return typeof r=="string"||typeof n=="string"?y.createElement(zY,ka({},e,{ref:t})):typeof r=="number"&&typeof n=="number"?y.createElement(FY,ka({},e,{width:r,height:n,ref:t})):y.createElement(y.Fragment,null,y.createElement(ec,{width:r,height:n}),y.createElement("div",ka({ref:t},e)))});function UY(e){return e?$Y:BY}var HY=y.forwardRef((e,t)=>{var r=e.children,n=e.className,a=e.height,o=e.onClick,c=e.onContextMenu,u=e.onDoubleClick,f=e.onMouseDown,h=e.onMouseEnter,m=e.onMouseLeave,g=e.onMouseMove,v=e.onMouseUp,b=e.onTouchEnd,j=e.onTouchMove,k=e.onTouchStart,S=e.style,N=e.width,E=e.responsive,A=e.dispatchTouchEvents,P=A===void 0?!0:A,_=y.useRef(null),O=Nt(),D=y.useState(null),U=oh(D,2),B=U[0],F=U[1],Y=y.useState(null),H=oh(Y,2),pe=H[0],ue=H[1],he=CY(),ae=Ky(),se=(ae==null?void 0:ae.width)>0?ae.width:N,X=(ae==null?void 0:ae.height)>0?ae.height:a,te=y.useCallback(Oe=>{he(Oe),typeof t=="function"&&t(Oe),F(Oe),ue(Oe),Oe!=null&&(_.current=Oe)},[he,t,F,ue]),J=y.useCallback(Oe=>{O(NO(Oe)),O(Xr({handler:o,reactEvent:Oe}))},[O,o]),I=y.useCallback(Oe=>{O(my(Oe)),O(Xr({handler:h,reactEvent:Oe}))},[O,h]),M=y.useCallback(Oe=>{O(dP()),O(Xr({handler:m,reactEvent:Oe}))},[O,m]),K=y.useCallback(Oe=>{O(my(Oe)),O(Xr({handler:g,reactEvent:Oe}))},[O,g]),ne=y.useCallback(()=>{O(_O())},[O]),Z=y.useCallback(()=>{O(MO())},[O]),me=y.useCallback(Oe=>{O(OO(Oe.key))},[O]),ge=y.useCallback(Oe=>{O(Xr({handler:c,reactEvent:Oe}))},[O,c]),Pe=y.useCallback(Oe=>{O(Xr({handler:u,reactEvent:Oe}))},[O,u]),re=y.useCallback(Oe=>{O(Xr({handler:f,reactEvent:Oe}))},[O,f]),xe=y.useCallback(Oe=>{O(Xr({handler:v,reactEvent:Oe}))},[O,v]),_e=y.useCallback(Oe=>{O(Xr({handler:k,reactEvent:Oe}))},[O,k]),ie=y.useCallback(Oe=>{P&&O(DO(Oe)),O(Xr({handler:j,reactEvent:Oe}))},[O,P,j]),Je=y.useCallback(Oe=>{O(Xr({handler:b,reactEvent:Oe}))},[O,b]),Fe=UY(E);return y.createElement(IP.Provider,{value:B},y.createElement(nR.Provider,{value:pe},y.createElement(Fe,{width:se??(S==null?void 0:S.width),height:X??(S==null?void 0:S.height),className:nt("recharts-wrapper",n),style:PY({position:"relative",cursor:"default",width:se,height:X},S),onClick:J,onContextMenu:ge,onDoubleClick:Pe,onFocus:ne,onBlur:Z,onKeyDown:me,onMouseDown:re,onMouseEnter:I,onMouseLeave:M,onMouseMove:K,onMouseUp:xe,onTouchEnd:Je,onTouchMove:ie,onTouchStart:_e,ref:te},y.createElement(LY,null),r)))}),WY=["width","height","responsive","children","className","style","compact","title","desc"];function KY(e,t){if(e==null)return{};var r,n,a=GY(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n{var r=e.width,n=e.height,a=e.responsive,o=e.children,c=e.className,u=e.style,f=e.compact,h=e.title,m=e.desc,g=KY(e,WY),v=kn(g);return f?y.createElement(y.Fragment,null,y.createElement(ec,{width:r,height:n}),y.createElement(T2,{otherAttributes:v,title:h,desc:m},o)):y.createElement(HY,{className:c,style:u,width:r,height:n,responsive:a??!1,onClick:e.onClick,onMouseLeave:e.onMouseLeave,onMouseEnter:e.onMouseEnter,onMouseMove:e.onMouseMove,onMouseDown:e.onMouseDown,onMouseUp:e.onMouseUp,onContextMenu:e.onContextMenu,onDoubleClick:e.onDoubleClick,onTouchStart:e.onTouchStart,onTouchMove:e.onTouchMove,onTouchEnd:e.onTouchEnd},y.createElement(T2,{otherAttributes:v,title:h,desc:m,ref:t},y.createElement(VV,null,o)))});function py(){return py=Object.assign?Object.assign.bind():function(e){for(var t=1;ty.createElement(eX,{chartName:"AreaChart",defaultTooltipEventType:"axis",validateTooltipEventTypes:tX,tooltipPayloadSearcher:NW,categoricalChartProps:e,ref:t}));const nX="rgba(130,130,150,0.14)",z2="rgba(130,130,150,0.85)";function iX(e){if(e<=0)return 10;const t=Math.pow(10,Math.floor(Math.log10(e))),r=e/t;return(r<=1?1:r<=2?2:r<=5?5:10)*t}function zO(e,t){return`${t==="%"?Math.round(e):e>=1e3?`${(e/1e3).toFixed(1)}k`:Math.round(e).toString()}${t}`}function aX({active:e,payload:t,unit:r}){return!e||!(t!=null&&t.length)?null:l.jsx("div",{className:"rounded-lg border border-border/70 bg-popover/95 px-3 py-2 shadow-xl backdrop-blur",children:l.jsx("div",{className:"space-y-1",children:t.map(n=>l.jsxs("div",{className:"flex items-center gap-2 text-[11px] font-mono",children:[l.jsx("span",{className:"h-2 w-2 rounded-full",style:{background:n.color}}),l.jsx("span",{className:"uppercase tracking-wider text-muted-foreground",children:n.name}),l.jsx("span",{className:"ml-auto pl-3 font-bold tabular-nums text-foreground",children:zO(n.value,r)})]},n.dataKey))})})}function FO({data:e,series:t,unit:r="%",yMode:n="percent",height:a=176}){const o=e.reduce((u,f)=>t.reduce((h,m)=>Math.max(h,Number(f[m.key])||0),u),0),c=n==="percent"?Math.min(100,Math.max(25,Math.ceil(o*1.2/25)*25)):Math.max(iX(o*1.15),10);return l.jsx("div",{style:{height:a},className:"w-full",children:l.jsx(Qz,{width:"100%",height:"100%",children:l.jsxs(rX,{data:e,margin:{top:8,right:6,bottom:0,left:-12},children:[l.jsx("defs",{children:t.map(u=>l.jsxs("linearGradient",{id:`grad-${u.key}`,x1:"0",y1:"0",x2:"0",y2:"1",children:[l.jsx("stop",{offset:"0%",stopColor:u.color,stopOpacity:.22}),l.jsx("stop",{offset:"100%",stopColor:u.color,stopOpacity:0})]},u.key))}),l.jsx(cO,{vertical:!1,stroke:nX}),l.jsx(jO,{dataKey:"t",hide:!0}),l.jsx(SO,{domain:[0,c],ticks:[0,c/2,c],tickFormatter:u=>zO(u,r),width:42,axisLine:!1,tickLine:!1,tick:{fontSize:10,fill:z2}}),l.jsx(eK,{content:l.jsx(aX,{unit:r}),cursor:{stroke:z2,strokeOpacity:.4,strokeDasharray:"3 3"}}),t.map(u=>l.jsx(wO,{type:"monotone",dataKey:u.key,name:u.label,stroke:u.color,strokeWidth:2,fill:`url(#grad-${u.key})`,dot:!1,activeDot:{r:3,strokeWidth:0},isAnimationActive:!1,connectNulls:!0},u.key))]})})})}const oX=[{key:"cpu",label:"CPU",color:"#2dd4bf"},{key:"ram",label:"RAM",color:"#38bdf8"},{key:"gpu",label:"GPU",color:"#a78bfa"},{key:"disk",label:"Disk",color:"#fbbf24"}];function BO(){var c,u,f,h;const{sys:e,hist:t}=KD(),r=!!(e!=null&&e.gpu&&e.gpu.busy_percent!=null&&e.gpu.gtt_used!=null&&e.gpu.gtt_total!=null),n=oX.filter(m=>m.key!=="gpu"||r),a={cpu:(c=e==null?void 0:e.cpu)==null?void 0:c.percent,ram:(u=e==null?void 0:e.ram)==null?void 0:u.percent,gpu:r?e.gpu.busy_percent:null,disk:(f=e==null?void 0:e.disk)==null?void 0:f.percent},o={cpu:(h=e==null?void 0:e.cpu)!=null&&h.cores?`${e.cpu.cores} Cores`:"",ram:e?`${aa(e.ram.used)}/${aa(e.ram.total)} GB`:"",gpu:r?`${aa(e.gpu.gtt_used)}/${aa(e.gpu.gtt_total)} GB`:"",disk:e!=null&&e.disk?`${aa(e.disk.used)}/${aa(e.disk.total)} GB`:""};return l.jsxs("div",{className:"flex flex-col justify-between rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"mb-3 flex items-center gap-2",children:[l.jsx(Hn,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"System-Status"}),l.jsxs("span",{className:"ml-1 inline-flex items-center gap-1 text-[10px] font-medium text-muted-foreground/70",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"})," live"]})]}),e?l.jsxs(l.Fragment,{children:[l.jsx("div",{className:"mb-2 grid grid-cols-2 gap-x-4 gap-y-1.5",children:n.map(m=>l.jsxs("div",{className:"flex min-w-0 items-center gap-1.5",children:[l.jsx("span",{className:"h-2 w-2 shrink-0 rounded-full",style:{background:m.color}}),l.jsx("span",{className:"shrink-0 text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:m.label}),l.jsxs("span",{className:"shrink-0 font-mono text-xs font-bold tabular-nums text-foreground",children:[Math.round(a[m.key]??0),"%"]}),o[m.key]&&l.jsx("span",{className:"truncate font-mono text-[10px] text-muted-foreground/60",children:o[m.key]})]},m.key))}),l.jsx(FO,{data:t,series:n,unit:"%",yMode:"percent",height:176})]}):l.jsx("div",{className:"flex h-44 items-center justify-center text-xs text-muted-foreground",children:"Lade Systemdaten…"})]}),(e==null?void 0:e.temp)&&(e.temp.cpu||e.temp.gpu)&&l.jsxs("div",{className:"mt-3 flex gap-4 border-t border-border/30 pt-3 font-mono text-xs text-muted-foreground/80",children:[e.temp.cpu!=null&&l.jsxs("span",{children:["CPU Temp: ",e.temp.cpu," °C"]}),e.temp.gpu!=null&&l.jsxs("span",{children:["GPU Temp: ",e.temp.gpu," °C"]})]})]})}function du({label:e,value:t,tone:r}){return l.jsxs("div",{className:ee("flex items-center justify-between rounded-lg border px-3 py-1.5 text-xs",r==="alert"?"border-amber-500/30 bg-amber-500/5 font-semibold text-amber-400":r==="accent"?"border-primary/30 bg-primary/5 font-semibold text-primary":"border-border/30 bg-background/25 text-muted-foreground"),children:[l.jsx("span",{className:"flex items-center gap-1.5",children:e}),l.jsx("span",{className:"font-mono text-[10px]",children:t})]})}function sX(){var r;const{data:e}=vh(3e3),t=()=>window.dispatchEvent(new CustomEvent("open-system-drawer",{detail:{tab:"maintenance"}}));return l.jsxs("div",{className:"flex flex-col justify-between rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15",children:[l.jsxs("div",{className:"space-y-4",children:[l.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-2 border-b border-border/20 pb-2",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(D4,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"Updates & Pflege"})]}),(e==null?void 0:e.last_check)&&l.jsxs("span",{className:"font-mono text-[9px] text-muted-foreground/80",children:["Zuletzt gesucht: ",new Date(e.last_check*1e3).toLocaleString("de-DE",{day:"2-digit",month:"2-digit",hour:"2-digit",minute:"2-digit"})]})]}),e?l.jsxs("div",{className:"space-y-1.5",children:[l.jsx(du,{label:"OS-Pakete",tone:e.os>0?"alert":"muted",value:e.os>0?`${e.os} verfügbar`:"aktuell"}),l.jsx(du,{label:"Inferenz-Engine (llama.cpp)",tone:e.engine>0?"alert":"muted",value:e.engine>0?"Update verfügbar":"aktuell"}),l.jsx(du,{label:"Router (llama-swap)",tone:e.swap>0?"alert":"muted",value:e.swap>0?"Update verfügbar":"aktuell"}),l.jsx(du,{label:"Modell-Upgrades",tone:e.models>0?"accent":"muted",value:e.models>0?`${e.models} verfügbar`:"aktuell"}),(r=e.components)==null?void 0:r.map(n=>l.jsx(du,{tone:n.update===!0?"alert":"muted",label:l.jsxs(l.Fragment,{children:[n.name,n.reachable===!1&&l.jsx("span",{className:"text-[8px] font-bold uppercase text-red-400/80",children:"offline"})]}),value:n.update===!0?`Update: ${n.latest}`:n.update===!1?"aktuell":n.latest?`neueste: ${n.latest}`:"—"},n.key))]}):l.jsx("div",{className:"flex h-24 items-center justify-center text-xs text-muted-foreground",children:"Lade Updates..."})]}),l.jsxs("button",{onClick:t,className:"mt-4 flex h-9 w-full items-center justify-center gap-1.5 rounded-lg bg-primary text-xs font-semibold text-primary-foreground shadow-md shadow-primary/10 transition-all hover:opacity-90 cursor-pointer",children:["Updates verwalten & Pflege ",l.jsx(ch,{className:"h-3.5 w-3.5"})]})]})}function UO({type:e,title:t,message:r,defaultValue:n,autoValue:a,autoLabel:o,onConfirm:c,onCancel:u}){const f=y.useRef(null);return l.jsx("div",{className:"fixed inset-0 z-[99] bg-black/60 backdrop-blur-sm flex items-center justify-center p-4 overscroll-contain",role:"dialog","aria-modal":"true","aria-label":t,children:l.jsxs("div",{className:"w-full max-w-sm rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[l.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary",children:t}),l.jsx("button",{onClick:u||(()=>c()),"aria-label":"Schließen",className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:l.jsx(Wn,{className:"h-4 w-4","aria-hidden":"true"})})]}),l.jsx("p",{className:"text-xs text-muted-foreground leading-relaxed",children:r}),e==="prompt"&&l.jsxs("div",{className:"flex gap-2",children:[l.jsx("input",{ref:f,type:"text",defaultValue:n,"aria-label":t,className:"flex-1 h-9 px-3 text-xs bg-background/40 border border-border/60 rounded-lg outline-none focus:border-primary transition-colors text-foreground",autoFocus:!0,onKeyDown:h=>{var m;h.key==="Enter"&&c((m=f.current)==null?void 0:m.value)}}),a!==void 0&&l.jsx("button",{type:"button",onClick:()=>{f.current&&(f.current.value=a)},title:"Setup-bewussten Optimalwert eintragen",className:"h-9 px-3 shrink-0 text-xs font-semibold text-primary border border-primary/50 bg-primary/10 hover:bg-primary/20 rounded-lg transition-colors cursor-pointer",children:o||"Auto"})]}),l.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[(e==="confirm"||e==="prompt")&&l.jsx("button",{onClick:u,className:"h-8 px-4 flex items-center justify-center text-xs font-semibold text-muted-foreground border border-border/60 bg-background/20 hover:bg-accent rounded-lg transition-colors cursor-pointer",children:"Abbrechen"}),l.jsx("button",{onClick:()=>{var m;const h=e==="prompt"?(m=f.current)==null?void 0:m.value:void 0;c(h)},className:"h-8 px-4 flex items-center justify-center text-xs font-semibold text-primary-foreground bg-primary hover:bg-primary/95 rounded-lg transition-colors cursor-pointer",children:e==="confirm"?"Ja, fortfahren":e==="prompt"?"Übernehmen":"OK"})]})]})})}function Aa(){const[e,t]=y.useState(null),r=y.useCallback(()=>t(null),[]),n=y.useCallback((u,f,h)=>{t({type:"alert",title:u,message:f,onConfirm:()=>{t(null),h==null||h()}})},[]),a=y.useCallback((u,f,h,m)=>{t({type:"confirm",title:u,message:f,onConfirm:()=>{t(null),h()},onCancel:()=>{t(null),m==null||m()}})},[]),o=y.useCallback((u,f,h,m,g,v)=>{t({type:"prompt",title:u,message:f,defaultValue:h,autoValue:v==null?void 0:v.autoValue,autoLabel:v==null?void 0:v.autoLabel,onConfirm:b=>{t(null),m(b)},onCancel:()=>{t(null),g==null||g()}})},[]),c=e?l.jsx(UO,{...e}):null;return{showAlert:n,showConfirm:a,showPrompt:o,close:r,dialogElement:c}}function lX(){const e=Yn(),{data:t}=Oy(3e3),{data:r}=Ni(),{showAlert:n,dialogElement:a}=Aa(),[o,c]=y.useState(!1),u=(r==null?void 0:r.models)??[];async function f(h){try{await Se("/api/agent/brain",{method:"POST",body:JSON.stringify({model:h})}),n("Erfolgreich",`Hermes-Gehirn wurde auf '${h}' geändert. Der Gateway-Dienst wurde neu gestartet.`),e.invalidateQueries({queryKey:Ve.agentStatus}),c(!1)}catch(m){n("Fehler",`Fehler beim Wechseln des Gehirns: ${m.message}`)}}return l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15 flex flex-col justify-between",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center justify-between mb-4",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(wn,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold tracking-wide uppercase text-foreground",children:"Hermes Agent"})]}),(t==null?void 0:t.terminal_url)&&l.jsxs("a",{href:Ks(t.terminal_url),target:"_blank",rel:"noopener",className:ee("flex items-center gap-1 px-3 py-1 rounded-lg text-xs font-medium transition-all",t.terminal_reachable?"bg-primary text-primary-foreground hover:opacity-90 shadow-md shadow-primary/20":"border border-border text-muted-foreground"),children:[l.jsx(Us,{className:"h-3 w-3"})," Terminal öffnen"]})]}),t?l.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[l.jsxs("div",{className:"p-3 bg-background/20 rounded-xl border border-border/40",children:[l.jsx("div",{className:"text-[10px] text-muted-foreground uppercase font-semibold",children:"Gateway"}),l.jsxs("div",{className:"flex items-center gap-2 mt-1",children:[l.jsx("span",{className:ee("h-2 w-2 rounded-full",t.gateway_reachable?"bg-emerald-500 animate-pulse":"bg-amber-500")}),l.jsx("span",{className:"text-xs font-medium",children:t.gateway_reachable?"Online":"Offline"})]})]}),l.jsxs("div",{className:"p-3 bg-background/20 rounded-xl border border-border/40",children:[l.jsx("div",{className:"text-[10px] text-muted-foreground uppercase font-semibold",children:"Terminal"}),l.jsxs("div",{className:"flex items-center gap-2 mt-1",children:[l.jsx("span",{className:ee("h-2 w-2 rounded-full",t.terminal_reachable?"bg-emerald-500 animate-pulse":"bg-amber-500")}),l.jsx("span",{className:"text-xs font-medium",children:t.terminal_reachable?"Online":"Offline"})]})]}),l.jsxs("div",{onClick:()=>c(!0),className:"p-3 bg-background/20 rounded-xl border border-border/40 hover:border-primary/45 hover:bg-background/30 transition-all duration-300 cursor-pointer",children:[l.jsxs("div",{className:"flex justify-between items-center",children:[l.jsx("span",{className:"text-[10px] text-muted-foreground uppercase font-semibold",children:"Gehirn"}),l.jsx(Hn,{className:"h-3 w-3 text-primary"})]}),l.jsxs("div",{className:"text-xs font-medium mt-1 font-mono text-primary truncate flex items-center gap-1",children:[l.jsx(ky,{className:"h-3 w-3 shrink-0"}),t.brain_model||"auto"]})]}),l.jsxs("div",{className:"p-3 bg-background/20 rounded-xl border border-border/40",children:[l.jsxs("div",{className:"flex justify-between items-center",children:[l.jsx("span",{className:"text-[10px] text-muted-foreground uppercase font-semibold",children:"Verdrahtung"}),l.jsx(Qu,{className:"h-3 w-3 text-primary"})]}),l.jsxs("div",{className:"text-[10px] font-mono mt-1 space-y-0.5 text-muted-foreground",children:[l.jsxs("div",{children:["Config: ",t.has_config?l.jsx("span",{className:"text-emerald-400",children:"✓"}):"—"]}),l.jsxs("div",{children:["Skills: ",t.has_skills?l.jsx("span",{className:"text-emerald-400",children:"✓"}):"—"]}),l.jsxs("div",{children:["Memory: ",t.has_memories?l.jsx("span",{className:"text-emerald-400",children:"✓"}):"—"]})]})]})]}):l.jsx("div",{className:"h-28 flex items-center justify-center text-xs text-muted-foreground",children:"Lade Agenten-Status…"})]}),t&&l.jsxs("div",{className:"mt-3 border-t border-border/30 pt-3 space-y-1.5",children:[l.jsxs("div",{className:"flex items-center justify-between text-[10px] text-muted-foreground",children:[l.jsx("span",{children:"Telegram"}),l.jsx("span",{className:ee("font-semibold",t.telegram_enabled?"text-emerald-400":""),children:t.telegram_enabled?"aktiv":"nicht konfiguriert"})]}),l.jsxs("div",{className:"flex items-center justify-between text-[10px] text-muted-foreground",children:[l.jsx("span",{children:"MCP-Server"}),l.jsxs("span",{className:"font-semibold text-foreground",children:[t.mcp_server_count??0," verbunden"]})]}),l.jsxs("div",{className:"flex items-center justify-between text-[10px] text-muted-foreground",children:[l.jsx("span",{children:"PC Executor"}),l.jsx("span",{className:ee("font-semibold",t.pc_executor_reachable?"text-emerald-400":""),children:t.pc_executor_reachable?"erreichbar":"nicht verbunden"})]})]}),t&&o&&l.jsx("div",{className:"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm flex items-center justify-center p-4",children:l.jsxs("div",{className:"w-full max-w-md rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[l.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[l.jsxs("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary flex items-center gap-1.5",children:[l.jsx(Hn,{className:"h-4 w-4"}),l.jsx("span",{children:"Hermes-Gehirn konfigurieren"})]}),l.jsx("button",{onClick:()=>c(!1),className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:l.jsx(Wn,{className:"h-4 w-4"})})]}),l.jsxs("p",{className:"text-xs text-muted-foreground leading-relaxed",children:['Das „Gehirn" ist das primäre LLM für Hermes. Wähle ein Modell aus deiner Bibliothek oder nutze ein Gateway-Alias (',l.jsx("code",{className:"text-primary font-semibold",children:"auto"})," / ",l.jsx("code",{className:"text-primary font-semibold",children:"fast"})," / ",l.jsx("code",{className:"text-primary font-semibold",children:"heavy"}),"):"]}),l.jsx("div",{className:"space-y-1.5 max-h-60 overflow-y-auto pr-1",children:["auto","fast","heavy",...u.map(h=>{var m;return((m=h.name.split("/").pop())==null?void 0:m.replace(".gguf",""))||h.name})].map(h=>{const m=["auto","fast","heavy"].includes(h);return l.jsxs("button",{onClick:()=>f(h),className:ee("w-full text-left px-3 py-2.5 rounded-lg text-xs hover:bg-accent flex items-center justify-between font-mono cursor-pointer border border-border/30",t.brain_model===h||!t.brain_model&&h==="auto"?"text-primary font-bold bg-primary/10 border-primary/30":"text-foreground bg-background/20"),children:[l.jsxs("div",{className:"flex flex-col text-left",children:[l.jsx("span",{className:"font-semibold truncate max-w-[280px]",children:h}),l.jsx("span",{className:"text-[9px] text-muted-foreground mt-0.5",children:m?"Gateway Routing Alias":"Installiertes GGUF Modell"})]}),(t.brain_model===h||!t.brain_model&&h==="auto")&&l.jsx(sr,{className:"h-4 w-4 shrink-0 text-primary"})]},h)})})]})}),a]})}function uX(){const e=Yn(),{data:t=[]}=vv({limit:3}),[r,n]=y.useState(""),[a,o]=y.useState("stable"),[c,u]=y.useState(!1);async function f(){if(!(!r.trim()||c)){u(!0);try{await Se("/api/memory",{method:"POST",body:JSON.stringify({content:r,category:a,source:"dashboard"})}),n(""),e.invalidateQueries({queryKey:["memory"]})}catch(h){console.error(h)}finally{u(!1)}}}return l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15 flex flex-col justify-between",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center gap-2 mb-4",children:[l.jsx(Ao,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold tracking-wide uppercase text-foreground",children:"Gedächtnis"})]}),l.jsxs("div",{className:"space-y-3",children:[l.jsx("textarea",{value:r,onChange:h=>n(h.target.value),"aria-label":"Fakt oder Regel im Gedächtnis speichern",placeholder:"Fakt / Regel im Pool speichern…",rows:2,className:"w-full resize-none rounded-xl border border-border/50 bg-background/30 p-2 text-[10px] outline-none focus:ring-1 focus:ring-primary transition-all leading-normal"}),l.jsxs("div",{className:"flex items-center gap-2 justify-between",children:[l.jsxs("select",{value:a,onChange:h=>o(h.target.value),"aria-label":"Kategorie",className:"h-7 rounded-lg border border-border/50 bg-background/50 px-2 text-[10px] outline-none cursor-pointer",children:[l.jsx("option",{value:"stable",children:"🔵 Fakt"}),l.jsx("option",{value:"instruction",children:"📋 Regel"}),l.jsx("option",{value:"user",children:"👤 User"}),l.jsx("option",{value:"versioned",children:"🟡 Version"})]}),l.jsxs("button",{onClick:f,disabled:!r.trim()||c,className:"flex h-7 items-center gap-1 rounded-lg bg-primary px-3 text-[10px] font-semibold text-primary-foreground hover:opacity-90 disabled:opacity-50 transition-all cursor-pointer",children:[l.jsx(df,{className:"h-3.5 w-3.5"})," Speichern"]})]})]}),l.jsxs("div",{className:"mt-3.5 space-y-1.5",children:[l.jsx("div",{className:"text-[9px] text-muted-foreground uppercase font-bold tracking-wider",children:"Zuletzt gespeichert:"}),l.jsx("div",{className:"max-h-20 overflow-y-auto space-y-1 pr-1 scrollbar-thin",children:t.length===0?l.jsx("div",{className:"text-[10px] text-muted-foreground/75 py-1",children:"Keine Einträge vorhanden."}):t.map(h=>l.jsxs("div",{className:"text-[10px] bg-background/10 border border-border/30 rounded p-1.5 flex items-start gap-1.5",children:[l.jsx("span",{className:"shrink-0 text-[8px] font-mono text-muted-foreground/80 px-1 py-0.5 rounded bg-muted/20",children:h.category}),l.jsx("span",{className:"truncate flex-1 text-muted-foreground hover:text-foreground transition-colors",title:h.content,children:h.content})]},h.id))})]})]}),l.jsx("div",{className:"mt-4 text-[10px] text-muted-foreground/80 border-t border-border/30 pt-3",children:"Steht allen Clients per MCP zur Verfügung."})]})}const F2=[{key:"prompt",label:"Prompt",color:"#f59e0b"},{key:"completion",label:"Antwort",color:"#2dd4bf"}];function HO(){const{data:e}=Py(3e3),t=HD(),r=t[t.length-1],n=r?Math.round(r.prompt+r.completion):0;return l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15",children:[l.jsxs("div",{className:"mb-3 flex items-start justify-between gap-3",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(uh,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"Token-Durchsatz"}),l.jsxs("span",{className:"ml-1 inline-flex items-center gap-1 text-[10px] font-medium text-muted-foreground/70",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"})," live"]})]}),e&&l.jsxs("div",{className:"mt-2 flex items-baseline gap-2",children:[l.jsx("span",{className:"font-space text-3xl font-bold tracking-tight text-foreground tabular-nums",children:n.toLocaleString("de-DE")}),l.jsx("span",{className:"text-xs text-muted-foreground",children:"tok/s aktuell"})]}),e&&l.jsxs("div",{className:"mt-0.5 space-y-0.5 font-mono text-[11px] text-muted-foreground/70",children:[l.jsxs("div",{children:[e.total_tokens.toLocaleString("de-DE")," Tokens gesamt · ",l.jsxs("span",{className:"text-emerald-400/90",children:[e.saved_eur.toLocaleString("de-DE",{minimumFractionDigits:2})," € gespart"]})]}),l.jsxs("div",{className:"text-muted-foreground/55",children:["Input ",e.prompt_tokens.toLocaleString("de-DE")," · Output ",e.completion_tokens.toLocaleString("de-DE")]})]})]}),l.jsx("div",{className:"flex shrink-0 flex-col items-end gap-1.5 pt-1",children:F2.map(a=>l.jsxs("div",{className:"flex items-center gap-1.5",children:[l.jsx("span",{className:"h-2 w-2 rounded-full",style:{background:a.color}}),l.jsx("span",{className:"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:a.label}),l.jsx("span",{className:"font-mono text-xs font-bold tabular-nums text-foreground",children:Math.round((r==null?void 0:r[a.key])??0)})]},a.key))})]}),e?l.jsx(FO,{data:t,series:F2,unit:" tok/s",yMode:"auto",height:150}):l.jsx("div",{className:"flex h-[150px] items-center justify-center text-xs text-muted-foreground",children:"Lade Durchsatz…"}),l.jsx("div",{className:"mt-2 border-t border-border/30 pt-2 text-[10px] text-muted-foreground/70",children:"Durchsatz aus dem Gateway abgeleitet (Prefill vs. Generierung). Flach bei Leerlauf."})]})}function cX(){const{data:e}=NE(3e3),{showAlert:t,dialogElement:r}=Aa(),[n,a]=y.useState({});async function o(c){a(u=>({...u,[c]:!0}));try{const u=await Se("/api/maintenance/restart",{method:"POST",body:JSON.stringify({service:c})});u.ok||t("Fehler",`Neustart fehlgeschlagen: ${u.err||"Unbekannt"}`)}catch(u){t("Fehler",`Fehler: ${u.message}`)}finally{a(u=>({...u,[c]:!1}))}}return l.jsxs("div",{className:"flex flex-col rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15",children:[l.jsxs("div",{className:"mb-3 flex items-center justify-between",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(ff,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"Dienste"})]}),l.jsx("button",{onClick:()=>window.dispatchEvent(new CustomEvent("open-system-drawer",{detail:{tab:"logs"}})),className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground transition-colors hover:text-primary cursor-pointer",children:"Logs / Pflege"})]}),e?l.jsxs("div",{className:"flex flex-1 flex-col",children:[l.jsx("div",{className:"space-y-1.5",children:e.services.map(c=>l.jsxs("div",{className:"group flex items-center justify-between gap-2 rounded-xl border border-border/30 bg-background/20 p-2.5",children:[l.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[l.jsx("span",{className:ee("h-2.5 w-2.5 shrink-0 rounded-full ring-2 ring-black/40",c.ok?"bg-emerald-500":"bg-amber-500")}),l.jsxs("div",{className:"min-w-0",children:[l.jsx("div",{className:"truncate text-xs font-bold text-foreground",children:c.name}),l.jsx("div",{className:"truncate font-mono text-[9px] text-muted-foreground/60",children:c.url})]})]}),l.jsx("button",{onClick:()=>o(c.name),disabled:n[c.name],className:"flex h-7 w-7 shrink-0 items-center justify-center rounded-lg border border-border/40 text-muted-foreground opacity-0 transition-all hover:bg-primary/5 hover:text-primary group-hover:opacity-100",title:"Dienst neu starten",children:l.jsx(Xa,{className:ee("h-3.5 w-3.5",n[c.name]&&"animate-spin")})})]},c.name))}),l.jsxs("div",{className:"mt-auto flex flex-wrap gap-3 border-t border-border/20 pt-2.5 text-[10px] font-semibold text-muted-foreground",children:[l.jsxs("a",{href:Ks(e.links.engine_ui),target:"_blank",rel:"noopener",className:"flex items-center gap-1 rounded px-1.5 py-0.5 text-primary transition-colors hover:bg-primary/10",children:[l.jsx(Us,{className:"h-3 w-3"})," Engine"]}),l.jsxs("a",{href:Ks(e.links.gateway),target:"_blank",rel:"noopener",className:"flex items-center gap-1 rounded px-1.5 py-0.5 text-primary transition-colors hover:bg-primary/10",children:[l.jsx(Us,{className:"h-3 w-3"})," Gateway"]})]})]}):l.jsx("div",{className:"flex h-24 items-center justify-center text-xs text-muted-foreground",children:"Lade Dienste…"}),r]})}const Hg=[{key:"stt",label:"STT",hint:"Sprache → Text"},{key:"vision",label:"Bildschirm-Sicht",hint:"Vision-Beschreibung"},{key:"chat_ttfb",label:"Chat-TTFB",hint:"Zeit bis 1. Token"},{key:"tts",label:"TTS",hint:"Text → Sprache"}];function qd(e){return e==null?"—":e>=1e3?`${(e/1e3).toFixed(2)} s`:`${Math.round(e)} ms`}function dX({stat:e,label:t,hint:r,maxP95:n}){const a=!!e&&e.count>0,o=a&&e.p95_ms&&n>0?Math.max(4,Math.min(100,e.p95_ms/n*100)):0;return l.jsxs("div",{className:"space-y-1.5",children:[l.jsxs("div",{className:"flex items-baseline justify-between gap-2",children:[l.jsxs("div",{className:"flex items-baseline gap-2 min-w-0",children:[l.jsx("span",{className:"text-xs font-semibold text-foreground",children:t}),l.jsx("span",{className:"truncate text-[10px] text-muted-foreground/60",children:r})]}),a?l.jsx("span",{className:"shrink-0 font-mono text-sm font-bold tabular-nums text-foreground",children:qd(e.p50_ms)}):l.jsx("span",{className:"shrink-0 text-[10px] italic text-muted-foreground/50",children:"noch keine Messungen"})]}),l.jsx("div",{className:"h-1.5 w-full overflow-hidden rounded-full bg-background/50 border border-border/30",children:l.jsx("div",{className:"h-full rounded-full bg-gradient-to-r from-teal-500 to-indigo-500 transition-all duration-500",style:{width:`${o}%`}})}),a&&l.jsxs("div",{className:"flex items-center gap-3 font-mono text-[10px] text-muted-foreground/65",children:[l.jsxs("span",{children:["p50 ",qd(e.p50_ms)]}),l.jsxs("span",{children:["p95 ",qd(e.p95_ms)]}),l.jsxs("span",{children:["zuletzt ",qd(e.last_ms)]}),l.jsxs("span",{className:"text-muted-foreground/45",children:["· n=",e.count]})]})]})}function WO(){const{data:e}=ID(5e3),t=Math.max(1,...Hg.map(n=>{var a;return((a=e==null?void 0:e[n.key])==null?void 0:a.p95_ms)??0})),r=Hg.some(n=>{var a;return(((a=e==null?void 0:e[n.key])==null?void 0:a.count)??0)>0});return l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15",children:[l.jsxs("div",{className:"mb-4 flex items-center gap-2",children:[l.jsx(_N,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"Sprach-Latenz"}),l.jsxs("span",{className:"ml-1 inline-flex items-center gap-1 text-[10px] font-medium text-muted-foreground/70",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"})," live"]})]}),l.jsx("div",{className:"grid gap-4 sm:grid-cols-2",children:Hg.map(n=>l.jsx(dX,{stat:e==null?void 0:e[n.key],label:n.label,hint:n.hint,maxP95:t},n.key))}),l.jsx("div",{className:"mt-4 border-t border-border/30 pt-2 text-[10px] text-muted-foreground/70",children:r?"Server-seitige Dauer je Pipeline-Stufe (p50 prominent). Rollender Schnitt über die letzten Turns; Reset bei Neustart.":"Noch keine Voice-Turns gemessen — sprich einmal über den „Sprechen“-Tab, dann erscheinen hier STT/Vision/Chat/TTS."})]})}const KO=[{role:"hermes",label:"Lucys Hirn",short:"Hirn",icon:Ao,desc:"Lucys Alltags-Verstand — denkt und redet mit dir. Immer bereit.",tone:"bg-indigo-500/15 text-indigo-400 border-indigo-500/25",protected:!0},{role:"embed",label:"Lucys Gedächtnis",short:"Gedächtnis",icon:CN,desc:"Merkt sich Wichtiges und findet es später wieder.",tone:"bg-emerald-500/15 text-emerald-400 border-emerald-500/25",protected:!0},{role:"vision",label:"Lucys Augen",short:"Augen",icon:uf,desc:"Sieht Bilder und Screenshots und beschreibt, was drauf ist.",tone:"bg-pink-500/15 text-pink-400 border-pink-500/25"},{role:"heavy",label:"Großes Hirn",short:"Groß",icon:Y3,desc:"Das schwere Geschütz — wird für besonders knifflige Fragen dazugeholt.",tone:"bg-amber-500/15 text-amber-400 border-amber-500/25"},{role:"coder-lite",label:"Programmierer (schnell)",short:"Code schnell",icon:Fs,desc:"Schnelles Programmieren im Alltag.",tone:"bg-violet-500/15 text-violet-400 border-violet-500/25"},{role:"coder",label:"Programmierer (gründlich)",short:"Code gründlich",icon:Fs,desc:"Schreibt und prüft Code besonders sorgfältig — für schwere Coding-Aufgaben.",tone:"bg-fuchsia-500/15 text-fuchsia-400 border-fuchsia-500/25"},{role:"scout",label:"Späher",short:"Späher",icon:B4,desc:"Schneller erster Blick und grobe Einschätzung.",tone:"bg-teal-500/15 text-teal-400 border-teal-500/25"}],GO=KO.map(e=>e.role),B2=Object.fromEntries(KO.map(e=>[e.role,e])),U2=e=>({role:e||"?",label:e||"unbekannt",short:e||"?",icon:Ao,desc:"Rolle ohne hinterlegten Klartext-Namen.",tone:"bg-slate-500/15 text-slate-300 border-slate-500/25"}),fX={fast:"hermes",coder_lite:"coder-lite"};function mr(e){return e&&(B2[e]||B2[fX[e]])||U2(e)}function io({role:e,dense:t=!1,className:r}){const n=mr(e),a=n.icon;return l.jsxs("span",{className:ee("inline-flex items-center gap-1 rounded px-1.5 py-0.5 text-[10px] font-semibold border tracking-wide",n.tone,r),title:`${n.desc} (${n.role})`,children:[l.jsx(a,{className:"h-3 w-3 shrink-0","aria-hidden":"true"}),t?n.short:n.label]})}function hX({fit:e}){const t={perfect:"bg-emerald-500/15 text-emerald-400 border border-emerald-500/20",marginal:"bg-amber-500/15 text-amber-400 border border-amber-500/20",too_tight:"bg-red-500/15 text-red-400 border border-red-500/20"}[e.level];return l.jsxs("span",{className:ee("rounded px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wider font-mono",t),children:[e.text," • ",e.req_gb," GB RAM"]})}function H2(e){const t=e.toLowerCase();return t.includes("qwen")?{name:"Qwen",color:"bg-purple-500/20 text-purple-300 border-purple-500/30",initial:"Q"}:t.includes("gemma")?{name:"Gemma",color:"bg-blue-500/20 text-blue-300 border-blue-500/30",initial:"G"}:t.includes("llama")?{name:"Llama",color:"bg-red-500/20 text-red-300 border-red-500/30",initial:"🦙"}:t.includes("mistral")||t.includes("mixtral")?{name:"Mistral",color:"bg-orange-500/20 text-orange-300 border-orange-500/30",initial:"M"}:t.includes("deepseek")?{name:"DeepSeek",color:"bg-cyan-500/20 text-cyan-300 border-cyan-500/30",initial:"D"}:t.includes("hermes")||t.includes("nous")?{name:"Hermes",color:"bg-amber-500/20 text-amber-300 border-amber-500/30",initial:"H"}:t.includes("phi")?{name:"Phi",color:"bg-emerald-500/20 text-emerald-300 border-emerald-500/30",initial:"Φ"}:{name:"Other",color:"bg-slate-500/20 text-slate-300 border-slate-500/30",initial:"AI"}}function mX(){var b,j,k;const{data:e}=Ni(2e3),{data:t}=Py(2e3),{data:r}=Po(),n=(e==null?void 0:e.models)??[],a=(e==null?void 0:e.running)??[],o=((b=r==null?void 0:r.gpu)==null?void 0:b.gtt_total)||((j=r==null?void 0:r.gpu)==null?void 0:j.vram_total)||0,c=((k=r==null?void 0:r.gpu)==null?void 0:k.gtt_used)||0,u=o>0?Math.min(100,c/o*100):0,f=u>=88?"bg-red-500":u>=70?"bg-amber-500":"bg-teal-500",h=u>=88?"text-red-400":u>=70?"text-amber-400":"text-foreground",m=y.useRef(null),[g,v]=y.useState(!1);return y.useEffect(()=>{if(!t)return;const S=t.total_tokens;if(m.current!==null&&S>m.current){v(!0);const N=setTimeout(()=>v(!1),4e3);return m.current=S,()=>clearTimeout(N)}m.current=S},[t==null?void 0:t.total_tokens]),l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15 flex flex-col",children:[l.jsxs("div",{className:"flex items-center justify-between mb-4",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(lf,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold tracking-wide uppercase text-foreground",children:"Modelle"})]}),l.jsxs("span",{className:ee("flex items-center gap-1.5 text-[10px] font-bold uppercase tracking-wider font-mono px-2 py-0.5 rounded-full border transition-colors",g?"bg-emerald-500/10 text-emerald-400 border-emerald-500/30":"bg-background/30 text-muted-foreground/70 border-border/40"),children:[g?l.jsx(xa,{className:"h-3 w-3 animate-pulse"}):l.jsx(N4,{className:"h-3 w-3"}),g?"Inferenz aktiv":"Idle"]})]}),o>0&&l.jsxs("div",{className:"mb-4",children:[l.jsxs("div",{className:"flex items-center justify-between text-[10px] font-mono text-muted-foreground/80 mb-1",children:[l.jsx("span",{className:"uppercase tracking-wider font-semibold",children:"Speicher-Pool"}),l.jsxs("span",{children:[l.jsx("span",{className:ee("font-bold",h),children:aa(c)})," / ",aa(o)," GB belegt"]})]}),l.jsx("div",{className:"h-1.5 w-full rounded-full bg-background/50 border border-border/30 overflow-hidden",children:l.jsx("div",{className:ee("h-full rounded-full transition-all duration-500",f),style:{width:`${u}%`}})})]}),l.jsx("div",{className:"space-y-2 flex-1",children:GO.map(S=>{var A;const N=n.find(P=>P.role===S),E=N?a.includes(N.name):!1;return l.jsxs("div",{className:ee("flex items-center justify-between gap-2 p-2 rounded-xl border transition-all duration-300",E?"border-emerald-500/30 bg-emerald-500/5 shadow-sm shadow-emerald-500/5":N?"border-primary/20 bg-primary/5":"border-border/30 bg-background/10 opacity-60"),children:[l.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[l.jsx(io,{role:S,className:"shrink-0"}),l.jsxs("div",{className:"flex flex-col min-w-0",children:[l.jsx("span",{className:"text-xs font-semibold truncate font-mono text-foreground",children:N?(A=N.name.split("/").pop())==null?void 0:A.replace(/\.gguf$/i,""):"nicht zugewiesen"}),N&&l.jsxs("div",{className:"flex gap-1 items-center mt-0.5 flex-wrap text-muted-foreground/70",children:[l.jsx("span",{className:"text-[9px] font-mono",children:Lr(N.size_bytes)}),N.prompt_cache&&l.jsx("span",{className:"text-[7px] leading-none font-mono font-bold bg-cyan-500/10 text-cyan-400 border border-cyan-500/20 px-1 py-0.5 rounded",title:"Prompt Caching aktiv",children:"PC"}),N.spec_active&&l.jsx("span",{className:"text-[7px] leading-none font-mono font-bold bg-emerald-500/10 text-emerald-400 border border-emerald-500/20 px-1 py-0.5 rounded",title:`Speculative Decoding aktiv (Draft: ${N.spec_draft_model})`,children:"SPEC"}),N.parallel_slots>1&&l.jsxs("span",{className:"text-[7px] leading-none font-mono font-bold bg-violet-500/10 text-violet-400 border border-violet-500/20 px-1 py-0.5 rounded",title:`${N.parallel_slots} parallele Slots aktiv`,children:["SLOTS: ",N.parallel_slots]}),N.incomplete&&l.jsx("span",{className:"text-[7px] leading-none font-mono font-bold bg-amber-500/10 text-amber-400 border border-amber-500/20 px-1 py-0.5 rounded",title:"GGUF-Datei fehlt",children:"⚠ fehlt"})]})]})]}),l.jsx("span",{className:"shrink-0",children:N?E?l.jsxs("span",{className:"flex items-center gap-1 text-[8px] font-semibold text-emerald-400 uppercase tracking-wider font-mono",children:[l.jsx("span",{className:ee("h-1.5 w-1.5 rounded-full bg-emerald-500",g&&"animate-pulse")})," warm"]}):l.jsx("span",{className:"text-[8px] font-semibold text-muted-foreground uppercase tracking-wider font-mono",children:"bereit"}):l.jsx("span",{className:"text-[8px] font-semibold text-muted-foreground/60 uppercase tracking-wider font-mono",children:"—"})})]},S)})}),l.jsx("div",{className:"mt-4 text-[10px] text-muted-foreground/80 border-t border-border/30 pt-3",children:"Laden erfolgt automatisch per Auto-Swap. Details & Routing im Modell-Manager."})]})}function pX(){var P,_,O,D,U,B;const{data:e}=Cy(),{data:t}=NE(),{data:r}=Ni(),{data:n}=Po(),a=!!e&&!!t,o=F=>{var Y;return(Y=t==null?void 0:t.services.find(H=>H.name.toLowerCase().includes(F)))==null?void 0:Y.ok},c=e==null?void 0:e.engine_reachable,u=(P=e==null?void 0:e.brain)==null?void 0:P.ready,f=((_=e==null?void 0:e.brain)==null?void 0:_.model)||((O=r==null?void 0:r.models.find(F=>F.role==="hermes"))==null?void 0:O.name)||"",h=[];h.push((()=>{const F={id:"brain",label:"Lucys Hirn",icon:Ao,critical:!0};return a?c===!1?{...F,status:"down",detail:"Die Motor-Maschine (Engine) läuft nicht — Lucy kann gerade gar nicht denken.",repair:{kind:"restart",service:"llama-swap",label:"Motor neu starten",needsSudo:!0}}:u===!1?{...F,status:"down",detail:"Lucys Hirn ist gerade eingeschlafen — einmal aufwecken.",repair:f?{kind:"loadModel",model:f,label:"Hirn aufwecken"}:void 0}:{...F,status:"ok",detail:"Wach und ansprechbar."}:{...F,status:"loading",detail:"Wird geprüft …"}})()),h.push((()=>{const F={id:"memory",label:"Lucys Gedächtnis",icon:CN,critical:!0},Y=o("mem0");return!a||Y===void 0?{...F,status:"loading",detail:"Wird geprüft …"}:Y?{...F,status:"ok",detail:"Merkt sich Neues und findet Altes wieder."}:{...F,status:"down",detail:"Lucy kann sich gerade nichts merken — das Gedächtnis antwortet nicht.",repair:{kind:"restart",service:"mem0-service",label:"Gedächtnis neu starten"}}})()),h.push((()=>{const F={id:"gateway",label:"Verbindung (Gateway)",icon:cf,critical:!0},Y=e?e.gateway_reachable:o("integriert");return!a||Y===void 0?{...F,status:"loading",detail:"Wird geprüft …"}:Y?{...F,status:"ok",detail:"Apps und IDEs können Lucy erreichen."}:{...F,status:"down",detail:"Die Verbindungs-Zentrale antwortet nicht — Apps erreichen Lucy nicht.",repair:{kind:"restart",service:"mission-control-2",label:"Zentrale neu starten"}}})()),h.push((()=>{const F={id:"agent",label:"Lucys Agent (Hermes)",icon:wn,critical:!0},Y=o("hermes-gateway");return!a||Y===void 0?{...F,status:"loading",detail:"Wird geprüft …"}:Y?{...F,status:"ok",detail:"Lucy ist bereit zu reden und zu handeln."}:{...F,status:"down",detail:"Lucys Agent ist offline — sie reagiert gerade nicht.",repair:{kind:"restart",service:"hermes-gateway",label:"Agent neu starten"}}})()),h.push((()=>{const F={id:"voice",label:"Lucys Stimme",icon:S4,critical:!1},Y=o("voice");return!a||Y===void 0?{...F,status:"loading",detail:"Wird geprüft …"}:Y?{...F,status:"ok",detail:"Lucy kann hören und sprechen."}:{...F,status:"warn",detail:"Sprechen ist gerade aus — Tippen geht weiter normal.",repair:{kind:"restart",service:"voice-service",label:"Stimme neu starten"}}})());const m=((D=n==null?void 0:n.gpu)==null?void 0:D.gtt_total)||((U=n==null?void 0:n.gpu)==null?void 0:U.vram_total)||0,g=((B=n==null?void 0:n.gpu)==null?void 0:B.gtt_used)||0,v=m>0?Math.min(100,g/m*100):0,b=1024**3,j=m?v>=90?{status:"full",usedGb:g/b,totalGb:m/b,pct:v,text:"Speicher fast voll — Lucy könnte langsamer werden."}:v>=72?{status:"warn",usedGb:g/b,totalGb:m/b,pct:v,text:"Speicher gut gefüllt — noch okay."}:{status:"ok",usedGb:g/b,totalGb:m/b,pct:v,text:"Genug Speicher frei."}:{status:"unknown",usedGb:0,totalGb:0,pct:0,text:"Speicher-Auslastung unbekannt."},k=h.some(F=>F.status==="loading"),S=h.filter(F=>F.critical&&F.status==="down"),N=h.filter(F=>F.status==="warn"||!F.critical&&F.status==="down"),E=j.status==="full";return{verdict:k&&!S.length?"loading":S.length?"problem":N.length||E?"warn":"gut",checks:h,memory:j,problems:S}}const gX={ok:"bg-emerald-500",warn:"bg-amber-500",down:"bg-red-500",loading:"bg-muted-foreground/40"};function VO({frame:e="lucy"}={}){const{verdict:t,checks:r,memory:n,problems:a}=pX(),{showAlert:o,dialogElement:c}=Aa(),u=Yn(),[f,h]=y.useState({});async function m(S,N){h(E=>({...E,[S]:!0}));try{if(N.kind==="loadModel")await Se(`/api/models/${encodeURIComponent(N.model)}/load`,{method:"POST"});else{const E=await Se("/api/maintenance/restart",{method:"POST",body:JSON.stringify({service:N.service})});E.ok||o("Reparatur nicht ganz geklappt",(E.err||"Unbekannter Fehler")+(N.needsSudo?` + +Tipp: Dafür wird evtl. das Box-Passwort gebraucht (oben rechts hinterlegen).`:""))}u.invalidateQueries({queryKey:Ve.health}),u.invalidateQueries({queryKey:Ve.services}),u.invalidateQueries({queryKey:Ve.models})}catch(E){o("Reparatur fehlgeschlagen",String((E==null?void 0:E.message)||E))}finally{h(E=>({...E,[S]:!1}))}}const g=e==="box"?{loading:"Box wird geprüft …",gut:"Alles okay",warn:"Kleinigkeit an der Box",problem:"Box braucht Hilfe"}:{loading:"Lucy wird geprüft …",gut:"Lucy geht's gut 💚",warn:"Kleinigkeit bei Lucy",problem:"Lucy braucht Hilfe"},v={loading:{ring:"border-border/60 bg-card/45",icon:dh,iconCls:"text-muted-foreground animate-spin",title:g.loading,sub:"Einen Moment, ich schaue nach dem Rechten."},gut:{ring:"border-emerald-500/40 bg-emerald-500/5",icon:h4,iconCls:"text-emerald-400",title:g.gut,sub:"Alle wichtigen Fähigkeiten laufen."},warn:{ring:"border-amber-500/40 bg-amber-500/5",icon:bi,iconCls:"text-amber-400",title:g.warn,sub:"Nichts Schlimmes — nur ein Hinweis."},problem:{ring:"border-red-500/50 bg-red-500/5",icon:bi,iconCls:"text-red-400",title:g.problem,sub:`${a.length} wichtige${a.length===1?"s":""} Problem${a.length===1?"":"e"} gefunden.`}}[t],b=v.icon,j={ok:"bg-emerald-500",warn:"bg-amber-500",full:"bg-red-500",unknown:"bg-muted-foreground/40"}[n.status],k={ok:"text-emerald-400",warn:"text-amber-400",full:"text-red-400",unknown:"text-muted-foreground"}[n.status];return l.jsxs("div",{className:ee("rounded-2xl border p-5 shadow-lg shadow-black/15 backdrop-blur-md transition-colors",v.ring),children:[l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsx("div",{className:"flex h-11 w-11 shrink-0 items-center justify-center rounded-xl border border-border/40 bg-background/30",children:l.jsx(b,{className:ee("h-6 w-6",v.iconCls)})}),l.jsxs("div",{className:"min-w-0",children:[l.jsx("h2",{className:"text-base font-bold tracking-tight text-foreground",children:v.title}),l.jsx("p",{className:"text-xs text-muted-foreground",children:v.sub})]})]}),l.jsxs("div",{className:"mt-4 rounded-xl border border-border/30 bg-background/20 p-3",children:[l.jsxs("div",{className:"mb-1.5 flex items-center justify-between text-[11px]",children:[l.jsxs("span",{className:"flex items-center gap-1.5 font-semibold uppercase tracking-wider text-muted-foreground",children:[l.jsx(yu,{className:"h-3.5 w-3.5"})," Speicher"]}),l.jsx("span",{className:ee("font-mono font-bold",k),children:n.status==="unknown"?"—":`${n.usedGb.toFixed(0)} / ${n.totalGb.toFixed(0)} GB`})]}),l.jsx("div",{className:"h-2 w-full overflow-hidden rounded-full border border-border/30 bg-background/50",children:l.jsx("div",{className:ee("h-full rounded-full transition-all duration-500",j),style:{width:`${n.pct}%`}})}),l.jsx("p",{className:ee("mt-1.5 text-[11px]",k),children:n.text})]}),l.jsx("div",{className:"mt-4 space-y-1.5",children:r.map(S=>l.jsx(vX,{c:S,busy:!!f[S.id],onRepair:()=>S.repair&&m(S.id,S.repair)},S.id))}),c]})}function vX({c:e,busy:t,onRepair:r}){const n=e.icon,a=e.status==="down"||e.status==="warn";return l.jsxs("div",{className:ee("flex items-center justify-between gap-3 rounded-xl border p-2.5 transition-colors",e.status==="down"?"border-red-500/25 bg-red-500/5":e.status==="warn"?"border-amber-500/20 bg-amber-500/5":"border-border/30 bg-background/15"),children:[l.jsxs("div",{className:"flex min-w-0 items-center gap-2.5",children:[l.jsxs("span",{className:"relative flex h-8 w-8 shrink-0 items-center justify-center rounded-lg border border-border/40 bg-background/30 text-foreground/80",children:[l.jsx(n,{className:"h-4 w-4"}),l.jsx("span",{className:ee("absolute -right-0.5 -top-0.5 h-2.5 w-2.5 rounded-full ring-2 ring-black/40",gX[e.status],e.status==="down"&&"animate-pulse")})]}),l.jsxs("div",{className:"min-w-0",children:[l.jsxs("div",{className:"flex items-center gap-1.5 text-xs font-bold text-foreground",children:[e.label,e.status==="ok"&&l.jsx(sr,{className:"h-3 w-3 text-emerald-400"}),!e.critical&&l.jsx("span",{className:"rounded bg-background/40 px-1 py-0.5 text-[8px] font-semibold uppercase tracking-wider text-muted-foreground/60",children:"optional"})]}),l.jsx("div",{className:"truncate text-[11px] text-muted-foreground",children:e.detail})]})]}),a&&e.repair&&l.jsxs("button",{onClick:r,disabled:t,className:ee("flex h-8 shrink-0 items-center gap-1.5 rounded-lg border px-2.5 text-[10px] font-bold uppercase tracking-wide transition-all cursor-pointer disabled:opacity-60",e.status==="down"?"border-red-500/40 bg-red-500/10 text-red-300 hover:bg-red-500/20":"border-amber-500/40 bg-amber-500/10 text-amber-300 hover:bg-amber-500/20"),title:e.repair.label,children:[t?l.jsx(dh,{className:"h-3.5 w-3.5 animate-spin"}):l.jsx(Qu,{className:"h-3.5 w-3.5"}),e.repair.label]}),a&&!e.repair&&l.jsxs("span",{className:"flex shrink-0 items-center gap-1 text-[10px] font-semibold text-muted-foreground",title:"Keine Auto-Reparatur bekannt",children:[l.jsx(L4,{className:"h-3.5 w-3.5"})," manuell"]})]})}function W2({children:e}){return l.jsx("p",{className:"mb-2 ml-0.5 text-[11px] font-semibold uppercase tracking-wider text-muted-foreground/60",children:e})}function yX(){return l.jsxs("div",{className:"space-y-7",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Zentrale"}),l.jsx("p",{className:"text-sm text-muted-foreground",children:"Aktueller Status von System, Modellen und Agent."})]}),l.jsx(VO,{}),l.jsxs("div",{className:"grid items-stretch gap-6 lg:grid-cols-3",children:[l.jsx(BO,{}),l.jsx(HO,{}),l.jsx(mX,{})]}),l.jsxs("section",{children:[l.jsx(W2,{children:"Stack & Telemetrie"}),l.jsxs("div",{className:"grid gap-6 md:grid-cols-2",children:[l.jsx(cX,{}),l.jsx(WO,{})]})]}),l.jsxs("section",{children:[l.jsx(W2,{children:"Betrieb & Wissen"}),l.jsxs("div",{className:"grid gap-6 md:grid-cols-3",children:[l.jsx(sX,{}),l.jsx(lX,{}),l.jsx(uX,{})]})]})]})}function xX(){const e=Yn(),{data:t=[]}=DD(2e3),{showAlert:r,dialogElement:n}=Aa();async function a(u){try{await Se(`/api/jobs/${u}/cancel`,{method:"POST"}),e.invalidateQueries({queryKey:Ve.jobs})}catch(f){r("Fehler",f.message)}}const o=t.filter(u=>u.state==="running"||u.state==="queued"),c=t.filter(u=>u.state!=="running"&&u.state!=="queued").slice(-3);return o.length===0&&c.length===0?null:l.jsxs("div",{className:"space-y-3 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-4 shadow-lg shadow-black/10",children:[l.jsx("div",{className:"text-[11px] font-semibold text-muted-foreground uppercase tracking-wider",children:"Aktive Downloads"}),o.map(u=>l.jsxs("div",{className:"space-y-1.5 p-3 rounded-xl bg-background/20 border border-border/40",children:[l.jsxs("div",{className:"flex justify-between items-center text-xs",children:[l.jsx("span",{className:"font-semibold truncate max-w-[250px]",children:u.label}),l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsxs("span",{className:"text-muted-foreground font-mono",children:[u.progress??0,"% • ",wv(u.done_bytes),"/",wv(u.total_bytes),u.eta_s?` • ETA ${GD(u.eta_s)}`:""]}),l.jsx("button",{onClick:()=>a(u.id),className:"text-[10px] text-red-400 hover:text-red-300 font-semibold border border-red-500/25 bg-red-500/5 px-2 py-0.5 rounded transition-all cursor-pointer",children:"Abbrechen"})]})]}),l.jsx("div",{className:"h-1.5 overflow-hidden rounded-full bg-muted",children:l.jsx("div",{className:"h-full rounded-full bg-primary transition-all duration-500",style:{width:`${u.progress??0}%`}})})]},u.id)),c.map(u=>l.jsxs("div",{className:"flex justify-between items-center text-xs text-muted-foreground px-1",children:[l.jsx("span",{className:"truncate",children:u.label}),l.jsx("span",{className:ee("font-semibold text-[10px] px-1.5 py-0.5 rounded uppercase font-mono",u.state==="done"?"bg-emerald-500/10 text-emerald-400":"bg-amber-500/10 text-amber-400"),children:u.state})]},u.id)),n]})}function Ga({children:e,tone:t="muted"}){const r={muted:"bg-muted text-muted-foreground",primary:"bg-primary/15 text-primary",warn:"bg-amber-500/15 text-amber-500"};return l.jsx("span",{className:`rounded px-1.5 py-0.5 text-[11px] font-medium ${r[t]}`,children:e})}function K2({caps:e}){return e?l.jsxs("span",{className:"inline-flex flex-wrap gap-1",children:[e.coder&&l.jsx(Ga,{children:"💻 Code"}),e.vision&&l.jsx(Ga,{children:"👁 Bild"}),e.reasoning&&l.jsx(Ga,{children:"🧠 Reason"}),e.moe&&l.jsxs(Ga,{tone:"primary",children:["🧩 MoE",e.active_b?`·${e.active_b}b`:""]}),e.tools==="yes"&&l.jsx(Ga,{tone:"primary",children:"🛠 Tools"}),e.tools==="likely"&&l.jsx(Ga,{tone:"warn",children:"🛠 Tools?"}),e.embedding&&l.jsx(Ga,{children:"🔢 Embed"})]}):null}function bX({model:e,onClose:t,onChanged:r}){var k,S;const{data:n,isLoading:a}=LD(e.gguf_path),[o,c]=y.useState(null),[u,f]=y.useState(""),h=n==null?void 0:n.target_vocab,m=(n==null?void 0:n.drafts)??[],g=m.filter(N=>N.compatible===!0),v=e.spec_draft_model;async function b(N){c(N??"__clear__"),f("");try{await Se(`/api/models/${encodeURIComponent(e.name)}/draft`,{method:"POST",body:JSON.stringify({draft_path:N})}),r(),t()}catch(E){f(String((E==null?void 0:E.message)||E)),c(null)}}const j=N=>{var E;return N?`${N.pre??"?"} · ${((E=N.n_vocab)==null?void 0:E.toLocaleString())??"?"} Tokens`:"—"};return l.jsx("div",{className:"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm flex items-center justify-center p-4",children:l.jsxs("div",{className:"w-full max-w-lg rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[l.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[l.jsxs("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary flex items-center gap-2",children:[l.jsx(xa,{className:"h-4 w-4"})," Speculative Draft"]}),l.jsx("button",{onClick:t,className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:l.jsx(Wn,{className:"h-4 w-4"})})]}),l.jsxs("div",{className:"text-xs text-muted-foreground leading-relaxed",children:['Beschleunigt die Token-Generierung mit einem kleinen "Draft"-Modell. Voraussetzung: der Draft muss den ',l.jsx("strong",{className:"text-foreground",children:"exakt gleichen Tokenizer (Vocab)"})," haben wie das Modell — sonst lehnt llama.cpp es ab."]}),l.jsxs("div",{className:"rounded-lg border border-border/40 bg-background/30 px-3 py-2 text-[11px] font-mono flex items-center justify-between",children:[l.jsx("span",{className:"text-muted-foreground",children:(k=e.name.split("/").pop())==null?void 0:k.replace(/\.gguf$/i,"")}),l.jsxs("span",{className:"text-foreground",children:["Vocab: ",j(h)]})]}),e.spec_active&&v&&l.jsxs("div",{className:"rounded-lg border border-emerald-500/30 bg-emerald-500/5 px-3 py-2 flex items-center justify-between gap-2",children:[l.jsxs("span",{className:"text-[11px] text-emerald-400 font-mono flex items-center gap-1.5 truncate",children:[l.jsx(sr,{className:"h-3.5 w-3.5 shrink-0"})," Aktiv: ",v]}),l.jsx("button",{onClick:()=>b(null),disabled:o!==null,className:"h-6 px-2.5 rounded border border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/10 text-amber-400 text-[9px] font-bold uppercase shrink-0 cursor-pointer disabled:opacity-50",children:"Deaktivieren"})]}),!(n!=null&&n.target_exists)&&l.jsxs("div",{className:"rounded-lg border border-amber-500/30 bg-amber-500/5 px-3 py-2 text-[11px] text-amber-400 flex items-center gap-2",children:[l.jsx(bi,{className:"h-3.5 w-3.5 shrink-0"}),"Modell-GGUF noch nicht vorhanden — Spec-Draft ist nach dem Download konfigurierbar."]}),l.jsx("div",{className:"space-y-1.5 max-h-64 overflow-y-auto pr-1",children:a?l.jsx("div",{className:"text-xs text-muted-foreground py-6 text-center",children:"Prüfe Vocab-Kompatibilität…"}):m.length===0?l.jsxs("div",{className:"text-[11px] text-muted-foreground border border-dashed border-border/50 rounded-lg p-4 text-center",children:["Keine Draft-Modelle in ",l.jsx("code",{className:"font-mono",children:"/srv/models/drafts"}),". Lade ein kleines same-family-Modell (z.B. Qwen3-0.6B) und lege es dort ab."]}):m.map(N=>{var P,_;const E=N.filename===v,A=N.compatible===!0;return l.jsxs("div",{className:ee("rounded-lg border px-3 py-2 flex items-center justify-between gap-2 text-left",A?"border-border/40 bg-background/20":"border-border/20 bg-background/10 opacity-60",E&&"border-primary/40 bg-primary/10"),children:[l.jsxs("div",{className:"min-w-0",children:[l.jsxs("div",{className:"text-[11px] font-mono font-semibold text-foreground truncate flex items-center gap-1.5",children:[N.filename,N.mtp&&l.jsx("span",{className:"shrink-0 rounded bg-indigo-500/15 px-1.5 py-0.5 text-[8px] font-bold uppercase tracking-wider text-indigo-400 border border-indigo-500/25",title:"MTP-Kopf (Multi-Token-Prediction) — by-construction vocab-identisch, höchste Akzeptanzrate",children:"MTP"})]}),l.jsxs("div",{className:"text-[9px] text-muted-foreground font-mono",children:[Lr(N.size_bytes)," · Vocab: ",j(N.vocab)]})]}),A?E?l.jsxs("span",{className:"text-[9px] font-bold uppercase text-primary flex items-center gap-1 shrink-0",children:[l.jsx(sr,{className:"h-3.5 w-3.5"})," Aktiv"]}):l.jsx("button",{onClick:()=>b(N.path),disabled:o!==null,className:"h-7 px-3 rounded-lg border border-emerald-500/30 bg-emerald-500/5 hover:bg-emerald-500/15 text-emerald-400 text-[9px] font-bold uppercase shrink-0 cursor-pointer disabled:opacity-50",children:"Aktivieren"}):l.jsxs("span",{className:"text-[9px] font-bold uppercase text-amber-400/80 flex items-center gap-1 shrink-0",title:N.compatible===!1?`Inkompatibel: Tokenizer/Vocab weicht ab (Draft ${(P=N.vocab)==null?void 0:P.pre}/${(_=N.vocab)==null?void 0:_.n_vocab} ≠ Modell ${h==null?void 0:h.pre}/${h==null?void 0:h.n_vocab}).`:"Kompatibilität nicht prüfbar (Datei fehlt).",children:[l.jsx(bi,{className:"h-3.5 w-3.5"})," ",N.compatible===!1?"Vocab ≠":"n/a"]})]},N.path)})}),!a&&(n==null?void 0:n.target_exists)&&m.length>0&&g.length===0&&l.jsxs("div",{className:"rounded-lg border border-amber-500/30 bg-amber-500/5 px-3 py-2 text-[11px] text-amber-400 leading-relaxed",children:["Kein vocab-kompatibler Draft verfügbar — Speculative Decoding ist für dieses Modell nicht möglich. Es braucht einen Draft mit identischem Tokenizer (pre=",l.jsx("span",{className:"font-mono",children:h==null?void 0:h.pre}),", n_vocab=",l.jsx("span",{className:"font-mono",children:(S=h==null?void 0:h.n_vocab)==null?void 0:S.toLocaleString()}),")."]}),u&&l.jsx("div",{className:"text-[10px] text-red-400 font-mono",children:u})]})})}const wX=["fast","heavy","heavy_chars"],kX=["coder_lite","coder","coding_escalate_chars"];function jX(){const e=Yn(),{data:t,isLoading:r}=TD(),[n,a]=y.useState(null),[o,c]=y.useState(!1),[u,f]=y.useState(""),[h,m]=y.useState(0);if(y.useEffect(()=>{t!=null&&t.policy&&!n&&a({...t.policy})},[t,n]),r||!t||!n)return l.jsx("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 text-xs text-muted-foreground",children:"Lade Routing-Policy…"});const g=N=>t.fields.find(E=>E.key===N),v=Object.keys(n).some(N=>n[N]!==t.policy[N]),b=(N,E)=>{a(A=>A&&{...A,[N]:E}),f("")},j=N=>b(N,t.defaults[N]);async function k(){if(!n)return;const N={};for(const E of Object.keys(n))n[E]!==t.policy[E]&&(N[E]=n[E]);if(Object.keys(N).length!==0){c(!0),f("");try{const{policy:E}=await _D(N);a({...E}),e.invalidateQueries({queryKey:Ve.routingPolicy}),e.invalidateQueries({queryKey:Ve.routing}),m(Date.now()),setTimeout(()=>m(0),2e3)}catch(E){f(E.message||String(E))}finally{c(!1)}}}function S({k:N}){const E=g(N),A=n[N],P=n[N]===t.defaults[N];return l.jsxs("div",{className:"space-y-1",children:[l.jsxs("div",{className:"flex items-center justify-between gap-2",children:[l.jsx("label",{className:"text-[10px] font-semibold text-muted-foreground",children:E.label}),!P&&l.jsxs("button",{onClick:()=>j(N),className:"flex items-center gap-0.5 text-[9px] text-muted-foreground/60 hover:text-foreground transition-colors cursor-pointer",title:`Auf Default zurücksetzen (${String(t.defaults[N])||"leer"})`,children:[l.jsx(_4,{className:"h-2.5 w-2.5"})," Default"]})]}),E.type==="bool"?l.jsxs("button",{onClick:()=>b(N,!A),className:ee("flex h-8 w-full items-center justify-between rounded-lg border px-3 text-[11px] font-semibold transition-all cursor-pointer",A?"border-emerald-500/40 bg-emerald-500/10 text-emerald-300":"border-border/40 bg-background/40 text-muted-foreground"),children:[l.jsx("span",{children:A?"An":"Aus"}),l.jsx("span",{className:ee("h-3.5 w-3.5 rounded-full transition-colors",A?"bg-emerald-400":"bg-muted-foreground/40")})]}):E.type==="int"?l.jsx("input",{type:"number",value:A,min:E.min,max:E.max,"aria-label":E.label,onChange:_=>b(N,Number(_.target.value)),className:"h-8 w-full rounded-lg border border-border/40 bg-background/40 px-3 font-mono text-[11px] text-foreground outline-none focus:border-primary/50"}):l.jsx("input",{type:"text",value:A,"aria-label":E.label,spellCheck:!1,placeholder:N==="coder_lite"?"(leer = aus)":"",onChange:_=>b(N,_.target.value),className:"h-8 w-full rounded-lg border border-border/40 bg-background/40 px-3 font-mono text-[11px] text-foreground outline-none focus:border-primary/50"})]})}return l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-4",children:[l.jsxs("div",{className:"flex items-center justify-between gap-3 flex-wrap",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(z4,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("span",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"Lane-Routing & Policy"}),l.jsx("span",{className:"text-[9px] font-mono px-1.5 py-0.5 rounded bg-emerald-500/10 text-emerald-300 border border-emerald-500/20",children:"hot-reload"})]}),l.jsxs("div",{className:"flex items-center gap-2",children:[u&&l.jsx("span",{className:"text-[10px] text-red-400 max-w-[280px] truncate",title:u,children:u}),h>0&&l.jsxs("span",{className:"flex items-center gap-1 text-[10px] text-emerald-400",children:[l.jsx(sr,{className:"h-3.5 w-3.5"})," gespeichert"]}),l.jsxs("button",{onClick:k,disabled:!v||o,className:ee("h-8 px-4 rounded-lg text-[10px] font-bold uppercase tracking-wide transition-all flex items-center gap-1.5",v&&!o?"bg-primary text-primary-foreground hover:opacity-90 cursor-pointer shadow-md shadow-primary/10":"bg-background/40 text-muted-foreground/50 border border-border/40 cursor-not-allowed"),children:[o?l.jsx(dh,{className:"h-3.5 w-3.5 animate-spin"}):null,"Speichern"]})]})]}),l.jsxs("p",{className:"text-[10px] text-muted-foreground/70 leading-relaxed -mt-1",children:["Welches echte Modell hinter den virtuellen Lanes ",l.jsx("code",{className:"text-cyan-300",children:"chat"})," und"," ",l.jsx("code",{className:"text-cyan-300",children:"coding"})," steckt. Änderungen greifen sofort (kein Neustart). Die Keyword-Heuristiken bleiben im Code."]}),l.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[l.jsxs("div",{className:"rounded-xl border border-border/40 bg-background/25 p-4 space-y-3",children:[l.jsxs("div",{className:"flex items-center gap-2 border-b border-border/30 pb-2",children:[l.jsx(k4,{className:"h-4 w-4 text-teal-400"}),l.jsx("span",{className:"text-[11px] font-bold uppercase tracking-wider text-foreground",children:"chat"}),l.jsx("span",{className:"text-[9px] text-muted-foreground/60 font-mono",children:"(= auto)"})]}),wX.map(N=>l.jsx(S,{k:N},N))]}),l.jsxs("div",{className:"rounded-xl border border-border/40 bg-background/25 p-4 space-y-3",children:[l.jsxs("div",{className:"flex items-center gap-2 border-b border-border/30 pb-2",children:[l.jsx(i4,{className:"h-4 w-4 text-indigo-400"}),l.jsx("span",{className:"text-[11px] font-bold uppercase tracking-wider text-foreground",children:"coding"}),l.jsx("span",{className:"text-[9px] text-muted-foreground/60 font-mono",children:"(agentisch → immer Coder)"})]}),kX.map(N=>l.jsx(S,{k:N},N))]})]}),l.jsx("div",{className:"rounded-xl border border-border/40 bg-background/25 p-4",children:l.jsx("div",{className:"max-w-xs",children:l.jsx(S,{k:"fast_no_think"})})})]})}function SX(){var pe,ue,he;const e=Yn(),{data:t}=Ni(4e3),{data:r}=EE(),{data:n}=Po(),{data:a}=AE(),{showAlert:o,dialogElement:c}=Aa(),[u,f]=y.useState(!1),[h,m]=y.useState(!1),g=(t==null?void 0:t.models)??[],v=(t==null?void 0:t.running)??[],b=(pe=r==null?void 0:r.groups)==null?void 0:pe.brains,j=(b==null?void 0:b.members)??[],k=ae=>g.find(se=>se.name===ae),S=ae=>{var se;return((se=ae.split("/").pop())==null?void 0:se.replace(/\.gguf$/i,""))||ae},N=j.map(k).filter(Boolean),E=1024**3,A=a==null?void 0:a.budget,P=N.reduce((ae,se)=>ae+(se.size_bytes||0),0)/E,_=((ue=n==null?void 0:n.gpu)==null?void 0:ue.gtt_total)||((he=n==null?void 0:n.gpu)==null?void 0:he.vram_total)||0,O=(A==null?void 0:A.gtt_gb)||(_?_/E:0),D=(A==null?void 0:A.warm_projected_gb)??P,U=O>0?Math.min(100,D/O*100):0,B=g.filter(ae=>!j.includes(ae.name)&&!ae.incomplete);async function F(ae){m(!0);try{await SE("brains",ae,(b==null?void 0:b.swap)??!1,(b==null?void 0:b.persist)??!0),e.invalidateQueries({queryKey:Ve.groups}),e.invalidateQueries({queryKey:Ve.models}),e.invalidateQueries({queryKey:Ve.hermesBrain})}catch(se){o("Fehler",`Immer-bereit-Set konnte nicht geändert werden: ${(se==null?void 0:se.message)||se}`)}finally{m(!1)}}function Y(ae){const se=k(ae);if(se&&mr(se.role).protected){o("Geschützt",`„${mr(se.role).label}" ist lebenswichtig und bleibt immer bereit.`);return}F(j.filter(X=>X!==ae))}function H(ae){f(!1),F([...j,ae])}return b?l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-4",children:[l.jsx(G2,{}),l.jsxs("div",{className:"space-y-1.5",children:[N.length===0&&l.jsx("div",{className:"text-xs text-muted-foreground",children:"Noch keine Modelle im Set."}),N.map(ae=>{const se=v.includes(ae.name),X=mr(ae.role).protected;return l.jsxs("div",{className:"flex items-center justify-between gap-2 rounded-xl border border-border/30 bg-background/20 p-2.5",children:[l.jsxs("div",{className:"flex min-w-0 items-center gap-2.5",children:[l.jsx("span",{className:ee("h-2 w-2 shrink-0 rounded-full ring-2 ring-black/40",se?"bg-emerald-500 animate-pulse":"bg-muted-foreground/40"),title:se?"Gerade warm (bereit)":"Reserviert — lädt bei Bedarf sofort"}),ae.role&&l.jsx(io,{role:ae.role,dense:!0,className:"shrink-0"}),l.jsx("span",{className:"truncate font-mono text-xs font-semibold text-foreground",title:ae.name,children:S(ae.name)}),l.jsx("span",{className:"shrink-0 font-mono text-[10px] text-muted-foreground/70",children:Lr(ae.size_bytes)})]}),X?l.jsx("span",{className:"shrink-0 text-[10px] font-semibold text-muted-foreground",title:"Lebenswichtig — bleibt immer im Set.",children:"🔒"}):l.jsx("button",{onClick:()=>Y(ae.name),disabled:h,className:"flex h-7 w-7 shrink-0 items-center justify-center rounded-lg border border-border/40 text-muted-foreground transition-colors hover:bg-red-500/5 hover:text-red-400 cursor-pointer disabled:opacity-50",title:"Aus dem Immer-bereit-Set nehmen (lädt dann nur noch bei Bedarf)",children:l.jsx(Wn,{className:"h-3.5 w-3.5"})})]},ae.name)})]}),l.jsxs("button",{onClick:()=>f(!0),disabled:h||B.length===0,className:"flex h-8 w-full items-center justify-center gap-1.5 rounded-lg border border-dashed border-border/50 text-[11px] font-semibold uppercase tracking-wide text-muted-foreground transition-colors hover:border-primary/40 hover:text-primary cursor-pointer disabled:opacity-50",children:[l.jsx(df,{className:"h-3.5 w-3.5"})," Modell dauerhaft bereithalten"]}),l.jsxs("div",{className:"rounded-xl border border-border/30 bg-background/20 p-3",children:[l.jsxs("div",{className:"mb-1.5 flex items-center justify-between text-[11px]",children:[l.jsxs("span",{className:"flex items-center gap-1.5 font-semibold uppercase tracking-wider text-muted-foreground",title:"Modellgewichte + Arbeitsspeicher (KV-Cache)",children:[l.jsx(yu,{className:"h-3.5 w-3.5"})," Reserviert fürs Set"]}),l.jsxs("span",{className:"font-mono font-bold text-foreground",children:[D.toFixed(1),O>0?` / ${O.toFixed(0)}`:""," GB"]})]}),l.jsx("div",{className:"h-2 w-full overflow-hidden rounded-full border border-border/30 bg-background/50",children:l.jsx("div",{className:ee("h-full rounded-full transition-all duration-500",U>=85?"bg-red-500":U>=65?"bg-amber-500":"bg-teal-500"),style:{width:`${U}%`}})}),A&&!A.fits&&l.jsxs("p",{className:"mt-2 flex items-start gap-1.5 text-[11px] text-amber-400",children:[l.jsx(bi,{className:"mt-0.5 h-3.5 w-3.5 shrink-0"}),l.jsxs("span",{children:["Zusammen mit dem größten Gelegenheits-Modell (~",A.largest_ondemand_gb," GB, z. B. das große Hirn) passt das Set nicht gleichzeitig in den Speicher. Beim Laden wird das Set kurz verdrängt und danach automatisch nachgeladen — kostet ein paar Sekunden."]})]}),A&&A.fits&&l.jsxs("p",{className:"mt-2 flex items-center gap-1.5 text-[11px] text-emerald-400",children:[l.jsx(sr,{className:"h-3.5 w-3.5 shrink-0"})," Passt auch neben dem größten Gelegenheits-Modell — nichts wird verdrängt."]})]}),u&&l.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/60 p-4 backdrop-blur-sm",role:"dialog","aria-modal":"true","aria-label":"Modell zum Immer-bereit-Set hinzufügen",children:l.jsxs("div",{className:"w-full max-w-md space-y-3 rounded-2xl border border-border/80 bg-card p-6 shadow-2xl animate-in fade-in zoom-in-95 duration-200",children:[l.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary",children:"Dauerhaft bereithalten"}),l.jsx("button",{onClick:()=>f(!1),className:"rounded p-1 text-muted-foreground hover:bg-accent hover:text-foreground cursor-pointer",children:l.jsx(Wn,{className:"h-4 w-4"})})]}),l.jsx("p",{className:"text-xs text-muted-foreground",children:"Wähle ein Modell, das ohne Ladezeit bereitstehen soll:"}),l.jsx("div",{className:"max-h-60 space-y-1.5 overflow-y-auto pr-1",children:B.map(ae=>l.jsxs("button",{onClick:()=>H(ae.name),className:"flex w-full items-center justify-between gap-2 rounded-lg border border-border/30 bg-background/20 px-3 py-2.5 text-left transition-colors hover:bg-accent cursor-pointer",children:[l.jsxs("span",{className:"flex min-w-0 items-center gap-2",children:[ae.role&&l.jsx(io,{role:ae.role,dense:!0,className:"shrink-0"}),l.jsx("span",{className:"truncate font-mono text-xs font-semibold text-foreground",children:S(ae.name)})]}),l.jsx("span",{className:"shrink-0 font-mono text-[10px] text-muted-foreground/70",children:Lr(ae.size_bytes)})]},ae.name))})]})}),c]}):l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10",children:[l.jsx(G2,{}),l.jsx("p",{className:"mt-3 text-xs text-muted-foreground",children:"Es gibt noch kein Immer-bereit-Set. Es entsteht automatisch, sobald Lucys Hirn zugewiesen ist."}),c]})}function G2(){return l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(xa,{className:"h-4.5 w-4.5 text-primary"}),l.jsxs("div",{children:[l.jsx("h2",{className:"text-sm font-bold uppercase tracking-wide text-foreground",children:"Immer-bereit-Set"}),l.jsx("p",{className:"text-[11px] text-muted-foreground",children:"Diese Modelle hält Lucy immer bereit — sie antworten ohne Ladezeit."})]})]})}function qO(){var Fe,Oe,ut,Jt;const e=Yn(),{data:t,isLoading:r,error:n}=Ni(4e3),{data:a}=vh(4e3),{data:o}=AE(),{data:c}=Po(),{data:u}=EE(),{showAlert:f,showConfirm:h,showPrompt:m,dialogElement:g}=Aa(),v=gE(),b=W=>!!mr(W).protected,j=(t==null?void 0:t.models)??[],k=(t==null?void 0:t.running)??[],S=n?String(n):"",N=()=>{e.invalidateQueries({queryKey:Ve.models}),e.invalidateQueries({queryKey:Ve.routing})},E=(Fe=u==null?void 0:u.groups)==null?void 0:Fe.brains,A=(E==null?void 0:E.members)??[],P=W=>A.includes(W),_=A.some(W=>k.includes(W));async function O(W){if(!E){f("Keine brains-Gruppe","Es existiert noch keine Ko-Residenz-Gruppe „brains“ in der Engine-Konfiguration. Lege sie erst über die Gruppen-Verwaltung an.");return}const Ae=A.includes(W)?A.filter(Be=>Be!==W):[...A,W];try{await SE("brains",Ae,E.swap??!1,E.persist??!0),e.invalidateQueries({queryKey:Ve.groups}),N()}catch(Be){f("Fehler",`Ko-Residenz konnte nicht geändert werden: ${Be.message||Be}`)}}const[D,U]=y.useState(null),[B,F]=y.useState(null),[Y,H]=y.useState(null),[pe,ue]=y.useState("grid"),[he,ae]=y.useState("all"),se=j.filter(W=>he==="in_use"?!!W.role||k.includes(W.name):!0);async function X(W){try{await Se(`/api/models/${encodeURIComponent(W)}/load`,{method:"POST"}),N()}catch(ke){f("Fehler",`Fehler beim Laden des Modells: ${ke.message}`)}}async function te(W){if(E&&_&&!P(W)){const ke=A.filter(Ae=>k.includes(Ae)).map(Ae=>Ae.split("/").pop()).join(", ");h("Verdrängt das Hirn?",`„${W.split("/").pop()}“ ist nicht in der Ko-Residenz-Gruppe „brains“. Beim Laden wirft es das aktuell warme Hirn (${ke}) raus — Lucy verliert Hirn bzw. Augen. + +Trotzdem exklusiv laden? Tipp: Mit dem 🧠-Schalter machst du das Modell dauerhaft ko-resident, dann bleiben beide warm.`,()=>X(W));return}X(W)}async function J(W){const ke=j.find(Ae=>Ae.name===W);if(ke&&b(ke.role)){f("Geschützt",`„${mr(ke.role).label}" ist lebenswichtig für Lucy und bleibt geladen. Zum Entladen erst im Experten-Modus die Rolle einem anderen Modell geben.`);return}try{await Se(`/api/models/${encodeURIComponent(W)}/unload`,{method:"POST"}),N()}catch(Ae){f("Fehler",`Fehler beim Entladen des Modells: ${Ae.message}`)}}async function I(){try{await Se("/api/models/unload",{method:"POST"}),N()}catch(W){f("Fehler",`Fehler beim Entladen aller Modelle: ${W.message}`)}}async function M(W,ke){try{const Ae=await Se(`/api/models/${encodeURIComponent(ke)}/role`,{method:"POST",body:JSON.stringify({role:W||null})});N(),Ae!=null&&Ae.warning&&f("Hirn gesetzt — Hinweis",Ae.warning)}catch(Ae){f("Fehler",`Fehler beim Zuweisen der Rolle: ${Ae.message||Ae}`)}}function K(W){U(W),F(null),Se(`/api/roles/${encodeURIComponent(W)}/recommend`).then(ke=>F(ke)).catch(()=>{})}async function ne(W,ke){let Ae=null;try{Ae=await Se(`/api/models/${encodeURIComponent(W)}/ctx/auto`)}catch{}const Be=Ae?`Optimal für dein Setup: ${(Ae.ctx/1024).toFixed(0)}k (${Ae.ctx}) — GTT ${Ae.gtt_gb} GB − reserviert ${Ae.reserved_gb} GB (${Ae.mode}) → ${Ae.budget_gb} GB frei. »Auto« trägt diesen Wert ein.`:"Gib die gewünschte Kontextlänge in Tokens an:";m("Kontextlänge anpassen",Be,String(ke||32768),async et=>{if(et)try{await Se(`/api/models/${encodeURIComponent(W)}/ctx`,{method:"POST",body:JSON.stringify({ctx:parseInt(et,10)})}),N()}catch(Ut){f("Fehler",`Fehler beim Setzen des Kontexts: ${Ut.message||Ut}`)}},void 0,Ae?{autoValue:String(Ae.ctx),autoLabel:`Auto (${(Ae.ctx/1024).toFixed(0)}k)`}:void 0)}async function Z(W){const ke=j.find(Ae=>Ae.name===W);if(ke&&b(ke.role)){f("Geschützt",`„${mr(ke.role).label}" ist lebenswichtig für Lucy und kann nicht gelöscht werden. Weise die Rolle zuerst einem anderen Modell zu.`);return}h("Modell löschen?",`Modell '${W}' und alle zugehörigen GGUF-Dateien unwiderruflich von der Box löschen?`,async()=>{try{await Se(`/api/models/${encodeURIComponent(W)}`,{method:"DELETE"}),N()}catch(Ae){f("Fehler",`Fehler beim Löschen: ${Ae.message||Ae}`)}})}async function me(W,ke,Ae,Be){try{await Se("/api/models/install",{method:"POST",body:JSON.stringify({repo:W,role:ke,quant:Ae,jinja:Be})}),f("Herunterladen gestartet",`Download für '${W}' gestartet! Der Fortschritt wird oben angezeigt.`)}catch(et){f("Fehler",`Fehler beim Starten des Upgrades: ${et.message||et}`)}}async function ge(W){const ke=o==null?void 0:o.budget,Ae=ke&&!ke.fits?` + +⚠ Speicher-Warnung: Dieses Brain (~${ke.brain_gb} GB) muss immer resident sein. Zusammen mit dem größten on-demand-Modell (~${ke.largest_ondemand_gb} GB) sprengt das das Budget (${ke.gtt_gb} GB) → heavy/coder würden das Brain verdrängen. Erwäge ein kleineres Brain oder weniger Kontext.`:"";h("Agent-Hirn aktualisieren?",`Neues Hermes-Modell '${W.split("/").pop()}' herunterladen und als Agent-Hirn (Rolle hermes) setzen? Hermes nutzt danach automatisch das neue Modell.${Ae}`,async()=>{try{await Se("/api/models/install",{method:"POST",body:JSON.stringify({repo:W,role:"hermes",quant:"Q4_K_M",jinja:!0})}),f("Download gestartet","Das neue Agent-Hirn wird geladen. Fortschritt oben."),N()}catch(Be){f("Fehler",`Update fehlgeschlagen: ${Be.message||Be}`)}})}if(r)return l.jsx("div",{className:"text-xs text-muted-foreground py-12 text-center",children:"Initialisiere HUD Cockpit…"});if(S)return l.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400",children:["Gateway oder Engine nicht erreichbar (",S,")."]});const Pe=j.filter(W=>k.includes(W.name)),re=Pe.reduce((W,ke)=>W+(ke.size_bytes||0),0),xe=((Oe=c==null?void 0:c.gpu)==null?void 0:Oe.gtt_total)||((ut=c==null?void 0:c.gpu)==null?void 0:ut.vram_total)||0,_e=((Jt=c==null?void 0:c.gpu)==null?void 0:Jt.gtt_used)||0,ie=16*1024**3,Je=xe>2*1024**3?xe:re>ie?re*1.2:ie;return l.jsxs("div",{className:"space-y-8",children:[l.jsx("style",{children:` + @keyframes flow-dash { + to { + stroke-dashoffset: -20; + } + } + .svg-flow-path { + stroke-dasharray: 4 6; + animation: flow-dash 1s linear infinite; + } + `}),l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-3.5",children:[l.jsxs("div",{className:"flex justify-between items-center",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(yu,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("span",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"VRAM / Memory Belegung"})]}),l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsxs("span",{className:"text-[10px] font-mono text-muted-foreground",children:["Speicher-Pool: ",Lr(re)," Gewichte",_e>0?` · ${Lr(_e)} real belegt (inkl. KV)`:""," / ",Lr(Je)]}),v&&k.length>0&&l.jsx("button",{onClick:I,className:"h-6 px-2.5 rounded border border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/10 text-amber-400 text-[9px] font-bold uppercase transition-all cursor-pointer",children:"Alle entladen"})]})]}),l.jsx("div",{className:"h-7 w-full rounded-xl bg-background/50 border border-border/40 overflow-hidden flex p-0.5 relative group",children:Pe.length===0?l.jsx("div",{className:"w-full h-full flex items-center justify-center text-[10px] text-muted-foreground/60 italic font-mono select-none",children:"VRAM Leer — Auto-Swap lädt Modelle bei Anfrage"}):Pe.map((W,ke)=>{var et;const Ae=(W.size_bytes||0)/Je*100,Be=["from-teal-500 to-emerald-500","from-indigo-500 to-blue-500","from-purple-500 to-pink-500","from-cyan-500 to-sky-500"][ke%4];return l.jsxs("div",{style:{width:`${Ae}%`},className:ee("h-full rounded bg-gradient-to-r flex items-center justify-between px-2.5 transition-all text-white/95 shrink-0 shadow-inner select-none",Be),title:`${W.name} (${Lr(W.size_bytes)})`,children:[l.jsxs("span",{className:"text-[9px] font-bold truncate max-w-[120px] font-space tracking-wide",children:[W.role?`[${mr(W.role).short}] `:"",(et=W.name.split("/").pop())==null?void 0:et.replace(".gguf","")]}),l.jsx("span",{className:"text-[8px] font-mono opacity-80",children:Lr(W.size_bytes)})]},W.name)})})]}),l.jsx(SX,{}),v&&l.jsx(jX,{}),l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-3.5",children:[l.jsx("div",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground px-1",children:v?"Gateway Steckplatz-Belegung (Slot-Zuweisung)":"Wer macht was bei Lucy — zum Ändern antippen"}),l.jsx("div",{className:"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-6 gap-3",children:GO.map(W=>{var Be;const ke=j.find(et=>et.role===W),Ae=ke?k.includes(ke.name):!1;return l.jsxs("div",{onClick:()=>K(W),className:ee("rounded-xl border p-3 flex flex-col justify-between gap-2.5 transition-all cursor-pointer select-none text-left bg-background/25 hover:border-primary/45 hover:bg-background/40 group min-h-[90px]",Ae?"border-emerald-500/40 shadow-sm shadow-emerald-500/5":ke?"border-primary/20 bg-primary/5":"border-border/30 border-dashed opacity-75"),children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx(io,{role:W}),Ae&&l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-400 animate-pulse"})]}),l.jsx("div",{className:"text-[10px] font-mono font-medium truncate text-foreground/90 pr-1 font-space",title:ke==null?void 0:ke.name,children:ke?(Be=ke.name.split("/").pop())==null?void 0:Be.replace(/\.gguf$/i,""):"nicht zugewiesen"}),l.jsx("div",{className:"text-[8px] text-primary/70 group-hover:text-primary font-bold uppercase tracking-wider transition-colors font-space",children:"Ändern ➔"})]},W)})})]}),(o==null?void 0:o.current)&&l.jsxs("div",{className:"rounded-2xl border border-indigo-500/30 bg-indigo-500/5 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-3.5",children:[l.jsxs("div",{className:"flex items-center justify-between flex-wrap gap-2",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(wn,{className:"h-4.5 w-4.5 text-indigo-400"}),l.jsx("span",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"Agent-Hirn (Hermes)"}),o.current.version!=null&&l.jsxs("span",{className:"text-[9px] font-mono px-1.5 py-0.5 rounded bg-indigo-500/15 text-indigo-300 border border-indigo-500/25",children:["v",o.current.version]})]}),l.jsx("button",{onClick:()=>window.dispatchEvent(new CustomEvent("mc-navigate",{detail:{view:"agent"}})),className:"h-7 px-3 rounded-lg border border-indigo-500/30 bg-indigo-500/5 text-indigo-300 text-[9px] font-bold uppercase hover:bg-indigo-500/15 transition-all cursor-pointer",title:"Hirn-Wechsel passiert jetzt zentral im Hermes-Tab",children:"Im Hermes-Tab wechseln →"})]}),l.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-3 rounded-xl bg-background/30 border border-border/30 p-3.5",children:[l.jsxs("div",{className:"min-w-0",children:[l.jsx("div",{className:"text-xs font-mono font-bold text-foreground truncate",title:o.current.name,children:o.current.name.split("/").pop()}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2 mt-0.5",children:[l.jsx("span",{children:o.current.params_b?`${o.current.params_b}B`:"—"}),l.jsx("span",{children:"•"}),l.jsx("span",{children:o.current.quant||"GGUF"}),l.jsx("span",{children:"•"}),l.jsx("span",{children:Lr(o.current.size_bytes||0)})]})]}),o.update_available&&o.recommended?l.jsxs("button",{onClick:()=>ge(o.recommended.repo),className:ee("h-8 px-3 shrink-0 flex items-center justify-center gap-1.5 rounded-lg text-[10px] font-bold uppercase transition-all cursor-pointer shadow-md",o.budget&&!o.budget.fits?"bg-red-500 text-white hover:bg-red-400 shadow-red-500/10":"bg-amber-500 text-black hover:bg-amber-400 shadow-amber-500/10"),children:[l.jsx(Bs,{className:"h-3.5 w-3.5"})," Aktualisieren"]}):l.jsxs("span",{className:"h-8 px-3 shrink-0 flex items-center gap-1.5 text-[10px] font-bold text-emerald-400 uppercase tracking-wide bg-emerald-500/5 border border-emerald-500/15 rounded-lg select-none",children:[l.jsx(sr,{className:"h-4 w-4"})," Neueste Generation"]})]}),o.update_available&&o.recommended&&l.jsxs("div",{className:"text-[10px] text-amber-400/90 flex items-center gap-1.5",children:[l.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-amber-400 animate-ping shrink-0"}),"Neuere Generation verfügbar: ",l.jsx("span",{className:"font-mono font-bold",children:o.recommended.name.replace(/-GGUF$/i,"")}),"(v",o.recommended.version,", ",o.recommended.params_b,"B) — von NousResearch."]}),o.budget&&l.jsxs("div",{className:ee("text-[10px] flex items-start gap-1.5 leading-relaxed",o.budget.fits?"text-muted-foreground/80":"text-red-400 font-semibold"),children:[l.jsx(yu,{className:"h-3 w-3 shrink-0 mt-0.5"}),l.jsxs("span",{children:["Always-On-Brain ~",o.budget.brain_gb," GB + größtes on-demand (~",o.budget.largest_ondemand_gb," GB) = ",(o.budget.brain_gb+o.budget.largest_ondemand_gb).toFixed(1)," / ",o.budget.gtt_gb," GB",o.budget.fits?" · passt gleichzeitig ✓":" · passt NICHT gleichzeitig ⚠ — heavy/coder würden das Brain verdrängen. Kleineres Brain oder weniger Kontext."]})]})]}),l.jsxs("div",{className:"space-y-4",children:[l.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-3 px-1",children:[l.jsxs("div",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:["Installierte Modell-Bibliothek (",se.length," von ",j.length,")"]}),l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsxs("div",{className:"flex rounded-lg border border-border/40 bg-card/45 p-0.5",children:[l.jsx("button",{onClick:()=>ae("all"),className:ee("px-2.5 py-1 rounded-md text-[9px] font-bold uppercase transition-all cursor-pointer",he==="all"?"bg-primary text-primary-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:"Vorhanden"}),l.jsx("button",{onClick:()=>ae("in_use"),className:ee("px-2.5 py-1 rounded-md text-[9px] font-bold uppercase transition-all cursor-pointer",he==="in_use"?"bg-primary text-primary-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:"In Benutzung"})]}),l.jsxs("div",{className:"flex rounded-lg border border-border/40 bg-card/45 p-0.5",children:[l.jsx("button",{onClick:()=>ue("grid"),className:ee("px-2.5 py-1 rounded-md text-[9px] font-bold uppercase transition-all cursor-pointer",pe==="grid"?"bg-primary text-primary-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:"Grid"}),l.jsx("button",{onClick:()=>ue("list"),className:ee("px-2.5 py-1 rounded-md text-[9px] font-bold uppercase transition-all cursor-pointer",pe==="list"?"bg-primary text-primary-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:"List"})]})]})]}),pe==="grid"?l.jsx("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-3",children:se.length===0?l.jsx("div",{className:"col-span-full text-xs text-muted-foreground border border-dashed border-border/60 rounded-2xl p-12 text-center select-none",children:he==="in_use"?"Keine Modelle in Benutzung (keine Zuweisung oder warm geladene Modelle).":'Keine Modelle konfiguriert. Verwende den Tab "Modelle finden" zum Herunterladen.'}):se.map(W=>{const ke=k.includes(W.name),Ae=a==null?void 0:a.model_list.find(et=>et.role===W.role),Be=H2(W.name);return l.jsxs("div",{className:ee("rounded-2xl border bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 flex flex-col justify-between gap-4 transition-all duration-300 hover:border-primary/40 group relative overflow-hidden",ke?"border-primary/45 shadow-primary/5":W.role?"border-primary/30 bg-primary/5 shadow-inner":"border-border/60"),children:[l.jsxs("div",{className:"space-y-3",children:[l.jsx("div",{className:"flex items-start justify-between gap-3",children:l.jsxs("div",{className:"flex gap-2.5 min-w-0",children:[l.jsx("div",{className:ee("w-7 h-7 rounded-lg border flex items-center justify-center font-bold text-xs shrink-0 shadow-sm",Be.color),title:Be.name,children:Be.initial}),l.jsxs("div",{className:"min-w-0",children:[l.jsx("h3",{className:"text-xs font-bold tracking-tight text-foreground line-clamp-2 break-all font-mono",title:W.name,children:W.name.split("/").pop()}),l.jsxs("div",{className:"flex items-center gap-2 flex-wrap mt-1",children:[l.jsx("span",{className:"text-[9px] font-mono text-muted-foreground bg-background/40 px-1.5 py-0.5 rounded border border-border/30",children:W.quant||"GGUF"}),ke&&l.jsxs("span",{className:"flex items-center gap-1 text-[9px] font-semibold text-emerald-400 uppercase tracking-wider",children:[l.jsx(uh,{className:"h-3 w-3 animate-pulse"})," Warm"]}),W.role&&l.jsx(io,{role:W.role,dense:!0}),b(W.role)&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-background/40 border border-border/40 text-[9px] font-semibold text-muted-foreground",title:"Lebenswichtig für Lucy — geschützt vor Löschen/Entladen.",children:"🔒 geschützt"}),v&&P(W.name)&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-fuchsia-500/10 border border-fuchsia-500/30 text-[9px] font-mono text-fuchsia-300 font-bold uppercase",title:"Ko-resident in der brains-Gruppe — bleibt mit dem Hirn gemeinsam warm, verdrängt es nicht.",children:"🧠 Ko-resident"}),v&&W.prompt_cache&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-cyan-500/10 border border-cyan-500/20 text-[9px] font-mono text-cyan-400 font-bold uppercase",title:"Prompt Caching aktiv",children:"PC"}),v&&(W.spec_active?l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-emerald-500/10 border border-emerald-500/20 text-[9px] font-mono text-emerald-400 font-bold uppercase",title:`Speculative Decoding aktiv (Draft: ${W.spec_draft_model})`,children:"SPEC"}):W.spec_draft_model?l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/20 text-[9px] font-mono text-amber-400 font-bold uppercase",title:`Draft gesetzt (${W.spec_draft_model}), aber INAKTIV — --spec-type fehlt oder Vocab inkompatibel. Über 'Spec' neu konfigurieren.`,children:"SPEC?"}):null),v&&W.parallel_slots>1&&l.jsxs("span",{className:"px-1.5 py-0.5 rounded bg-violet-500/10 border border-violet-500/20 text-[9px] font-mono text-violet-400 font-bold uppercase",title:`${W.parallel_slots} parallele Slots aktiv`,children:["SLOTS: ",W.parallel_slots]}),W.incomplete&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/20 text-[9px] font-mono text-amber-400 font-bold uppercase",title:"GGUF-Datei fehlt — Modell kann nicht geladen werden",children:"⚠ Datei fehlt"})]})]})]})}),l.jsx("div",{className:"border-t border-border/30 pt-3 flex flex-wrap gap-1",children:l.jsx(K2,{caps:W.capabilities})})]}),l.jsxs("div",{className:"space-y-3 pt-1",children:[l.jsxs("div",{className:"grid grid-cols-2 gap-2 text-[10px] font-mono text-muted-foreground",children:[l.jsxs("div",{className:"flex items-center gap-1.5 p-2 bg-background/20 rounded-lg border border-border/20",children:[l.jsx(yu,{className:"h-3.5 w-3.5 text-primary/80"}),l.jsxs("div",{children:[l.jsx("div",{className:"text-[8px] uppercase tracking-wider font-semibold text-muted-foreground/60",children:"Größe"}),l.jsx("div",{className:"text-foreground font-semibold",children:Lr(W.size_bytes)})]})]}),l.jsxs("div",{className:"flex items-center gap-1.5 p-2 bg-background/20 rounded-lg border border-border/20",children:[l.jsx(C4,{className:"h-3.5 w-3.5 text-primary/80"}),l.jsxs("div",{children:[l.jsx("div",{className:"text-[8px] uppercase tracking-wider font-semibold text-muted-foreground/60",children:"Kontext"}),l.jsx("div",{className:"text-foreground font-semibold",children:$w(W.ctx)})]})]})]}),Ae&&l.jsxs("div",{className:"p-3 bg-amber-500/5 border border-amber-500/30 rounded-xl space-y-2 flex flex-col justify-between shrink-0",children:[l.jsxs("div",{className:"text-[9px] font-semibold text-amber-400 flex items-center gap-1",children:[l.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-amber-400 animate-ping"}),l.jsxs("span",{children:["Upgrade verfügbar: ",Ae.repo.split("/").pop()]})]}),l.jsxs("button",{onClick:()=>me(Ae.repo,W.role,W.quant||"Q4_K_M",W.capabilities.tools!=="no"),className:"h-7 w-full flex items-center justify-center gap-1 rounded-lg bg-amber-500 text-black text-[10px] font-bold hover:bg-amber-400 transition-colors cursor-pointer",children:[l.jsx(Bs,{className:"h-3 w-3"})," Smart-Swap starten"]})]}),l.jsxs("div",{className:"flex items-center gap-1.5 border-t border-border/20 pt-3 mt-auto",children:[(()=>{const et=b(W.role),Ut=ke&&et,ht=W.incomplete&&!ke||Ut;return l.jsx("button",{onClick:()=>ke?J(W.name):te(W.name),disabled:ht,title:Ut?`„${mr(W.role).label}" bleibt geladen (geschützt).`:void 0,className:ee("flex-1 h-7 rounded-lg text-[9px] font-bold uppercase transition-all border flex items-center justify-center gap-1",ht?"border-border/30 bg-background/10 text-muted-foreground/50 cursor-not-allowed":ke?"border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/15 text-amber-400 cursor-pointer":"border-primary/30 bg-primary/5 hover:bg-primary/15 text-primary cursor-pointer"),children:Ut?"🔒 geladen":ke?"Entladen":"Laden"})})(),v&&l.jsx("button",{onClick:()=>ne(W.name,W.ctx),className:"h-7 px-2.5 rounded-lg border border-border/40 text-[9px] font-bold uppercase hover:bg-accent text-muted-foreground transition-colors cursor-pointer",title:"Kontextlänge anpassen",children:"Ctx"}),v&&E&&l.jsx("button",{onClick:()=>O(W.name),className:ee("h-7 px-2.5 rounded-lg border text-[9px] font-bold uppercase transition-colors cursor-pointer",P(W.name)?"border-fuchsia-500/40 bg-fuchsia-500/10 text-fuchsia-300 hover:bg-fuchsia-500/20":"border-border/40 text-muted-foreground hover:bg-accent"),title:P(W.name)?"Ko-resident (brains): bleibt mit dem Hirn gemeinsam warm. Klick = aus der Gruppe nehmen.":"Zur brains-Gruppe hinzufügen — lädt dann ko-resident neben dem Hirn, statt es zu verdrängen.",children:"🧠"}),v&&l.jsxs("button",{onClick:()=>H(W),className:ee("h-7 px-2.5 rounded-lg border text-[9px] font-bold uppercase transition-colors cursor-pointer flex items-center gap-1",W.spec_active?"border-emerald-500/30 text-emerald-400 hover:bg-emerald-500/10":W.spec_draft_model?"border-amber-500/30 text-amber-400 hover:bg-amber-500/10":"border-border/40 text-muted-foreground hover:bg-accent"),title:"Speculative Draft konfigurieren (Vocab-geprüft)",children:[l.jsx(xa,{className:"h-3 w-3"})," Spec"]}),l.jsx("button",{onClick:()=>Z(W.name),disabled:b(W.role),className:ee("h-7 w-7 rounded-lg border border-border/40 flex items-center justify-center transition-colors",b(W.role)?"text-muted-foreground/40 cursor-not-allowed":"text-muted-foreground hover:text-red-400 hover:bg-red-500/5 cursor-pointer"),"aria-label":"Modell löschen",title:b(W.role)?`„${mr(W.role).label}" ist geschützt und kann nicht gelöscht werden.`:"Modell löschen",children:l.jsx(cv,{className:"h-3.5 w-3.5","aria-hidden":"true"})})]})]})]},W.name)})}):l.jsx("div",{className:"space-y-2",children:se.length===0?l.jsx("div",{className:"text-xs text-muted-foreground border border-dashed border-border/60 rounded-2xl p-12 text-center select-none",children:he==="in_use"?"Keine Modelle in Benutzung (keine Zuweisung oder warm geladene Modelle).":'Keine Modelle konfiguriert. Verwende den Tab "Modelle finden" zum Herunterladen.'}):se.map(W=>{const ke=k.includes(W.name),Ae=H2(W.name);return l.jsxs("div",{className:ee("rounded-xl border bg-card/45 backdrop-blur-md p-3.5 shadow-lg shadow-black/5 flex flex-col sm:flex-row sm:items-center justify-between gap-3 hover:border-primary/40 transition-all",ke?"border-primary/45":W.role?"border-primary/30 bg-primary/5":"border-border/60"),children:[l.jsxs("div",{className:"flex items-center gap-3 min-w-0",children:[l.jsx("div",{className:ee("w-8 h-8 rounded-lg border border-border/40 flex items-center justify-center font-bold text-xs shrink-0 shadow-sm",Ae.color),title:Ae.name,children:Ae.initial}),l.jsxs("div",{className:"min-w-0 text-left",children:[l.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[l.jsx("h4",{className:"text-xs font-bold text-foreground truncate max-w-[250px] sm:max-w-[400px] break-all font-mono",title:W.name,children:W.name.split("/").pop()}),W.role&&l.jsx(io,{role:W.role,dense:!0,className:"shrink-0"}),b(W.role)&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-background/40 border border-border/40 text-[8px] font-semibold text-muted-foreground shrink-0",title:"Lebenswichtig für Lucy — geschützt vor Löschen/Entladen.",children:"🔒 geschützt"}),v&&P(W.name)&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-fuchsia-500/10 border border-fuchsia-500/30 text-[8px] font-mono text-fuchsia-300 font-bold uppercase shrink-0",title:"Ko-resident in der brains-Gruppe — bleibt mit dem Hirn gemeinsam warm.",children:"🧠 Ko-resident"}),v&&W.prompt_cache&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-cyan-500/10 border border-cyan-500/20 text-[8px] font-mono text-cyan-400 font-bold uppercase shrink-0",title:"Prompt Caching aktiv",children:"PC"}),v&&(W.spec_active?l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-emerald-500/10 border border-emerald-500/20 text-[8px] font-mono text-emerald-400 font-bold uppercase shrink-0",title:`Speculative Decoding aktiv (Draft: ${W.spec_draft_model})`,children:"SPEC"}):W.spec_draft_model?l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/20 text-[8px] font-mono text-amber-400 font-bold uppercase shrink-0",title:`Draft gesetzt (${W.spec_draft_model}), aber INAKTIV — --spec-type fehlt oder Vocab inkompatibel.`,children:"SPEC?"}):null),v&&W.parallel_slots>1&&l.jsxs("span",{className:"px-1.5 py-0.5 rounded bg-violet-500/10 border border-violet-500/20 text-[8px] font-mono text-violet-400 font-bold uppercase shrink-0",title:`${W.parallel_slots} parallele Slots aktiv`,children:["SLOTS: ",W.parallel_slots]}),W.incomplete&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/20 text-[8px] font-mono text-amber-400 font-bold uppercase shrink-0",title:"GGUF-Datei fehlt",children:"⚠ Datei fehlt"}),ke&&l.jsxs("span",{className:"flex items-center gap-0.5 text-[8px] font-semibold text-emerald-400 uppercase tracking-wider shrink-0",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"})," warm"]})]}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2 mt-0.5",children:[l.jsxs("span",{children:["Größe: ",Lr(W.size_bytes)]}),l.jsx("span",{children:"•"}),l.jsxs("span",{children:["Kontext: ",$w(W.ctx)]}),l.jsx("span",{children:"•"}),l.jsx("span",{className:"font-mono text-[9px]",children:W.quant||"GGUF"})]})]})]}),l.jsxs("div",{className:"flex items-center gap-3 shrink-0 self-end sm:self-auto",children:[l.jsx("div",{className:"hidden lg:flex flex-wrap gap-1",children:l.jsx(K2,{caps:W.capabilities})}),l.jsxs("div",{className:"flex items-center gap-1.5",children:[(()=>{const Be=b(W.role),et=ke&&Be,Ut=W.incomplete&&!ke||et;return l.jsx("button",{onClick:()=>ke?J(W.name):te(W.name),disabled:Ut,title:et?`„${mr(W.role).label}" bleibt geladen (geschützt).`:void 0,className:ee("h-7 px-3 rounded-lg text-[9px] font-bold uppercase transition-all border flex items-center gap-1",Ut?"border-border/30 bg-background/10 text-muted-foreground/50 cursor-not-allowed":ke?"border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/15 text-amber-400 cursor-pointer":"border-primary/30 bg-primary/5 hover:bg-primary/15 text-primary cursor-pointer"),children:et?"🔒 geladen":ke?"Entladen":"Laden"})})(),v&&l.jsx("button",{onClick:()=>ne(W.name,W.ctx),className:"h-7 px-2.5 rounded-lg border border-border/40 text-[9px] font-bold uppercase hover:bg-accent text-muted-foreground transition-all cursor-pointer",title:"Kontextlänge anpassen",children:"Ctx"}),v&&E&&l.jsx("button",{onClick:()=>O(W.name),className:ee("h-7 px-2.5 rounded-lg border text-[9px] font-bold uppercase transition-colors cursor-pointer",P(W.name)?"border-fuchsia-500/40 bg-fuchsia-500/10 text-fuchsia-300 hover:bg-fuchsia-500/20":"border-border/40 text-muted-foreground hover:bg-accent"),title:P(W.name)?"Ko-resident (brains): bleibt mit dem Hirn gemeinsam warm. Klick = aus der Gruppe nehmen.":"Zur brains-Gruppe hinzufügen — lädt dann ko-resident neben dem Hirn, statt es zu verdrängen.",children:"🧠"}),v&&l.jsxs("button",{onClick:()=>H(W),className:ee("h-7 px-2.5 rounded-lg border text-[9px] font-bold uppercase transition-all cursor-pointer flex items-center gap-1",W.spec_active?"border-emerald-500/30 text-emerald-400 hover:bg-emerald-500/10":W.spec_draft_model?"border-amber-500/30 text-amber-400 hover:bg-amber-500/10":"border-border/40 text-muted-foreground hover:bg-accent"),title:"Speculative Draft konfigurieren (Vocab-geprüft)",children:[l.jsx(xa,{className:"h-3 w-3"})," Spec"]}),l.jsx("button",{onClick:()=>Z(W.name),disabled:b(W.role),className:ee("h-7 w-7 rounded-lg flex items-center justify-center border border-border/40 transition-all",b(W.role)?"text-muted-foreground/40 cursor-not-allowed":"text-muted-foreground hover:text-red-400 hover:bg-red-500/5 cursor-pointer"),"aria-label":"Modell löschen",title:b(W.role)?`„${mr(W.role).label}" ist geschützt und kann nicht gelöscht werden.`:"Modell löschen",children:l.jsx(cv,{className:"h-3.5 w-3.5","aria-hidden":"true"})})]})]})]},W.name)})})]}),D&&(()=>{var et,Ut;const W=B&&B.role===D?B:null,ke={};W==null||W.models.forEach(ht=>{ke[ht.name]=ht});const Ae=W?W.models.map(ht=>j.find(ur=>ur.name===ht.name)).filter(Boolean):j,Be=ht=>{M(D,ht),U(null)};return l.jsx("div",{className:"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm flex items-center justify-center p-4 overscroll-contain",role:"dialog","aria-modal":"true","aria-label":`${mr(D).label} konfigurieren`,children:l.jsxs("div",{className:"w-full max-w-md rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[l.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[l.jsxs("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary flex items-center gap-1.5",children:[l.jsx(io,{role:D})," festlegen"]}),l.jsx("button",{onClick:()=>U(null),className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:l.jsx(Wn,{className:"h-4 w-4"})})]}),l.jsxs("div",{className:"flex items-center justify-between gap-2",children:[l.jsxs("p",{className:"text-xs text-muted-foreground",children:["Wähle ein Modell für ",l.jsx("strong",{className:"text-foreground",children:mr(D).label}),l.jsx("span",{className:"block text-[10px] text-muted-foreground/70 mt-0.5",children:mr(D).desc})]}),(W==null?void 0:W.recommended)&&l.jsxs("button",{onClick:()=>Be(W.recommended),title:(et=ke[W.recommended])==null?void 0:et.reason,className:"shrink-0 h-7 px-3 text-[11px] font-semibold text-primary border border-primary/50 bg-primary/10 hover:bg-primary/20 rounded-lg cursor-pointer flex items-center gap-1",children:[l.jsx(xa,{className:"h-3 w-3"})," Auto: ",(Ut=W.recommended.split("/").pop())==null?void 0:Ut.replace(/\.gguf$/i,"")]})]}),l.jsxs("div",{className:"space-y-1.5 max-h-60 overflow-y-auto pr-1",children:[b(D)?l.jsx("div",{className:"w-full px-3 py-2 rounded-lg text-[11px] text-muted-foreground border border-border/30 bg-background/20 flex items-center gap-1.5",children:"🔒 Diese Rolle ist lebenswichtig und kann nicht leer bleiben — wähle stattdessen ein anderes Modell."}):l.jsx("button",{onClick:()=>Be(""),className:"w-full text-left px-3 py-2 rounded-lg text-xs hover:bg-accent text-red-400 font-semibold cursor-pointer border border-red-500/20 bg-red-500/5 flex items-center justify-between",children:l.jsx("span",{children:"Zuweisung entfernen"})}),Ae.map(ht=>{var Or;const ur=ke[ht.name],Ca=ht.role===D,Jn=!!(ur!=null&&ur.recommended),Ii=!!ur&&!ur.suitable;return l.jsxs("button",{onClick:()=>Be(ht.name),className:ee("w-full text-left px-3 py-2.5 rounded-lg text-xs hover:bg-accent flex items-center justify-between font-mono cursor-pointer border",Jn?"border-primary/50 bg-primary/10":Ca?"text-primary font-bold bg-primary/5 border-primary/30":Ii?"border-border/20 bg-background/10 opacity-60":"text-foreground bg-background/20 border-border/30"),children:[l.jsxs("div",{className:"flex flex-col text-left min-w-0",children:[l.jsxs("span",{className:"truncate max-w-[260px] font-semibold flex items-center gap-1.5",children:[(Or=ht.name.split("/").pop())==null?void 0:Or.replace(/\.gguf$/i,""),Jn&&l.jsx("span",{className:"text-[8px] font-bold uppercase tracking-wide text-primary bg-primary/15 px-1.5 py-0.5 rounded",children:"Empfohlen"})]}),l.jsx("span",{className:"text-[9px] text-muted-foreground mt-0.5",children:ur?`${ur.params_b}B · ${ht.quant} · ${ur.reason}`:`${Lr(ht.size_bytes)} · ${ht.quant}`})]}),Ca&&l.jsx(sr,{className:"h-4 w-4 shrink-0 text-primary"})]},ht.name)})]})]})})})(),Y&&l.jsx(bX,{model:Y,onClose:()=>H(null),onChanged:N}),g]})}const NX=[{key:"popular",label:"Beliebt",q:""},{key:"coder",label:"Coder",q:"coder"},{key:"vision",label:"Vision",q:"vision"},{key:"reasoning",label:"Reasoning",q:"reasoning"},{key:"small",label:"Klein (≤4B)",q:"3B"}],EX=["fast","heavy","coder","vision","hermes","scout"],AX=new Intl.NumberFormat(void 0,{notation:"compact",maximumFractionDigits:1});function V2(e){return AX.format(e)}function CX(){const{data:e}=Ni(),t=(e==null?void 0:e.models)??[],[r,n]=y.useState(""),[a,o]=y.useState([]),[c,u]=y.useState(!1),[f,h]=y.useState(""),[m,g]=y.useState("popular"),[v,b]=y.useState(""),[j,k]=y.useState(null),[S,N]=y.useState([]),[E,A]=y.useState("Q4_K_M"),[P,_]=y.useState(""),[O,D]=y.useState(null),[U,B]=y.useState(!1),[F,Y]=y.useState({});async function H(M){u(!0),h("");try{const K=await Se(`/api/hf/search?q=${encodeURIComponent(M)}`);o(K.results),K.results.length||h("Keine Ergebnisse.")}catch(K){h(`Suche fehlgeschlagen: ${K}`)}finally{u(!1)}}y.useEffect(()=>{H("")},[]);function pe(M){g(M.key),n(""),H(M.q)}function ue(){g(""),H(r)}async function he(M,K,ne){B(!1);try{const Z=await Se(`/api/fit?params_b=0&quant=${encodeURIComponent(K)}&ctx=8192&name=${encodeURIComponent(M)}&role=${encodeURIComponent(ne)}`);D(Z)}catch{D(null)}}async function ae(M){if(j===M){k(null);return}k(M),N([]),D(null),_(""),B(!1),h("Analysiere Repository…");try{const K=await Se(`/api/hf/quants?repo=${encodeURIComponent(M)}`);N(K.quants);const ne=K.quants.includes("Q4_K_M")?"Q4_K_M":K.quants[0]||"Q4_K_M";A(ne),h(K.quants.length?"":"Keine GGUF-Dateien in diesem Repo gefunden."),K.quants.length&&he(K.repo,ne,"")}catch(K){h(`Fehler: ${K}`)}}function se(){const M=v.trim();M&&(o(K=>K.some(ne=>ne.repo===M)?K:[{repo:M,downloads:0,likes:0},...K]),b(""),ae(M))}const X=P?t.find(M=>(M.role||"").toLowerCase()===P):void 0;async function te(M){if((O==null?void 0:O.fit.level)==="too_tight"&&!U){B(!0);return}Y(K=>({...K,[M]:"Starte…"}));try{await Se("/api/models/install",{method:"POST",body:JSON.stringify({repo:M,quant:E,role:P||void 0,jinja:!0})}),Y(K=>({...K,[M]:"Download läuft"})),B(!1)}catch{Y(ne=>({...ne,[M]:"Fehler"}))}}const J=M=>{var ne;const K=((ne=M.split("/").pop())==null?void 0:ne.toLowerCase().replace(/-gguf$/i,""))||"";return K.length>3&&t.some(Z=>Z.name.toLowerCase().includes(K))},I=M=>M==="perfect"?"text-emerald-400 border-emerald-500/40 bg-emerald-500/10":M==="marginal"?"text-amber-400 border-amber-500/40 bg-amber-500/10":"text-red-400 border-red-500/40 bg-red-500/10";return l.jsxs("div",{className:"space-y-5",children:[l.jsxs("div",{className:"flex gap-2",children:[l.jsxs("div",{className:"relative flex-1",children:[l.jsx(MN,{className:"absolute left-3 top-2.5 h-4 w-4 text-muted-foreground"}),l.jsx("input",{value:r,onChange:M=>n(M.target.value),onKeyDown:M=>M.key==="Enter"&&ue(),"aria-label":"HuggingFace durchsuchen",type:"search",spellCheck:!1,placeholder:"HuggingFace durchsuchen (z.B. Qwen Coder, Llama-3.1, gemma)…",className:"w-full h-10 pl-9 pr-3 rounded-xl border border-border/60 bg-background/40 text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground"})]}),l.jsx("button",{onClick:ue,className:"h-10 px-5 rounded-xl bg-primary text-primary-foreground text-xs font-semibold hover:opacity-90 transition-all cursor-pointer",children:"Suchen"})]}),l.jsx("div",{className:"flex items-center gap-2 flex-wrap",children:NX.map(M=>l.jsxs("button",{onClick:()=>pe(M),className:ee("flex items-center gap-1.5 rounded-full px-3 py-1.5 text-[11px] font-semibold transition-all cursor-pointer border",m===M.key?"bg-primary/15 text-primary border-primary/30":"border-border/50 text-muted-foreground hover:text-foreground hover:border-border"),children:[M.key==="popular"&&l.jsx(u4,{className:"h-3 w-3"}),M.label]},M.key))}),c?l.jsx("div",{className:"text-xs text-muted-foreground py-10 text-center",children:"Lade GGUF-Modelle von HuggingFace…"}):l.jsxs("div",{className:"space-y-2",children:[a.map(M=>{const K=j===M.repo,ne=J(M.repo),Z=M.repo.includes("/")?M.repo.split("/")[0]:"—",me=M.repo.split("/").pop();return l.jsxs("div",{className:ee("rounded-xl border bg-card/45 backdrop-blur-md transition-all",K?"border-primary/40 shadow-lg shadow-primary/5":"border-border/50 hover:border-primary/30"),children:[l.jsxs("button",{onClick:()=>ae(M.repo),className:"w-full flex items-center gap-3 p-3.5 text-left cursor-pointer",children:[l.jsxs("div",{className:"min-w-0 flex-1",children:[l.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[l.jsx("span",{className:"text-xs font-bold font-mono text-foreground truncate max-w-[280px]",title:M.repo,children:me}),ne&&l.jsxs("span",{className:"flex items-center gap-1 text-[8px] font-bold text-emerald-400 uppercase tracking-wider bg-emerald-500/10 border border-emerald-500/20 px-1.5 py-0.5 rounded",children:[l.jsx(sr,{className:"h-2.5 w-2.5"})," installiert"]})]}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-3 mt-0.5 font-mono",children:[l.jsx("span",{children:Z}),l.jsxs("span",{className:"flex items-center gap-1",children:[l.jsx(Bs,{className:"h-3 w-3"})," ",V2(M.downloads)]}),M.likes>0&&l.jsxs("span",{className:"flex items-center gap-1",children:[l.jsx(m4,{className:"h-3 w-3"})," ",V2(M.likes)]})]})]}),K?l.jsx(ON,{className:"h-4 w-4 text-muted-foreground shrink-0"}):l.jsx(PN,{className:"h-4 w-4 text-muted-foreground shrink-0"})]}),K&&l.jsx("div",{className:"border-t border-border/30 p-3.5 space-y-3",children:S.length===0?l.jsx("div",{className:"text-[11px] text-muted-foreground font-mono",children:f||"Lade Quants…"}):l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[l.jsx("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground",children:"Quant"}),l.jsx("select",{value:E,onChange:ge=>{A(ge.target.value),he(M.repo,ge.target.value,P)},"aria-label":"Quantisierung",className:"h-8 rounded-lg border border-border/60 bg-background/40 px-2 text-xs text-foreground font-semibold outline-none",children:S.map(ge=>l.jsx("option",{value:ge,className:"bg-popover text-foreground",children:ge},ge))}),l.jsx("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground ml-1",children:"Rolle"}),l.jsxs("select",{value:P,onChange:ge=>{_(ge.target.value),he(M.repo,E,ge.target.value)},"aria-label":"Rolle",title:"Optional — bestimmt Auto-Konfiguration + setup-bewussten Kontext",className:"h-8 rounded-lg border border-border/60 bg-background/40 px-2 text-xs text-foreground font-semibold outline-none",children:[l.jsx("option",{value:"",className:"bg-popover text-foreground",children:"keine"}),EX.map(ge=>l.jsx("option",{value:ge,className:"bg-popover text-foreground",children:ge},ge))]}),l.jsx("button",{onClick:()=>te(M.repo),disabled:!!F[M.repo]&&F[M.repo]==="Download läuft",className:ee("h-8 px-3.5 ml-auto rounded-lg text-xs font-semibold transition-all cursor-pointer flex items-center gap-1.5",U?"bg-red-500 text-white hover:opacity-90":"bg-primary text-primary-foreground hover:opacity-90"),children:F[M.repo]?F[M.repo]:U?l.jsxs(l.Fragment,{children:[l.jsx(bi,{className:"h-3.5 w-3.5"})," OOM — trotzdem laden"]}):l.jsxs(l.Fragment,{children:[l.jsx(Bs,{className:"h-3.5 w-3.5"})," Herunterladen"]})})]}),O&&l.jsxs("div",{className:ee("flex flex-wrap items-center gap-x-3 gap-y-1 rounded-lg border px-3 py-2 text-[11px] font-medium",I(O.fit.level)),children:[l.jsx("span",{className:"font-bold uppercase tracking-wide",children:O.fit.text}),l.jsxs("span",{className:"font-mono opacity-90",children:["~",O.params_b,"B · ~",O.fit.req_gb," GB / ",O.sys_ram_gb," GB · ~",O.fit.tps," t/s"]}),O.fit.level!=="too_tight"?l.jsxs("span",{className:"font-mono opacity-80",children:["ctx → ",(O.assigned_ctx/1024).toFixed(0),"k"]}):l.jsx("span",{className:"opacity-90",children:"— passt nicht, würde beim Laden abstürzen (OOM)."})]}),X&&l.jsxs("div",{className:"flex items-start gap-2 rounded-lg border border-amber-500/40 bg-amber-500/10 px-3 py-2 text-[11px] text-amber-400",children:[l.jsx(bi,{className:"h-3.5 w-3.5 mt-0.5 shrink-0"}),l.jsxs("span",{children:["Rolle ",l.jsxs("strong",{children:["„",P,'"']})," hält aktuell ",l.jsx("strong",{children:X.name.split("/").pop()})," — wird beim Download übernommen."]})]})]})})]},M.repo)}),!a.length&&!c&&l.jsx("div",{className:"text-xs text-muted-foreground py-10 text-center",children:f||"Keine Ergebnisse."})]}),l.jsxs("div",{className:"border-t border-border/30 pt-4 flex flex-col sm:flex-row gap-2 items-stretch sm:items-center",children:[l.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground shrink-0",children:"Direkt:"}),l.jsx("input",{value:v,onChange:M=>b(M.target.value),onKeyDown:M=>M.key==="Enter"&&se(),"aria-label":"Repository oder URL direkt eingeben",spellCheck:!1,placeholder:"org/repo oder HF-URL (z.B. unsloth/Qwen2.5-Coder-7B-Instruct-GGUF)",className:"flex-1 h-9 rounded-lg border border-border/60 bg-background/40 px-3 text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground font-mono"}),l.jsx("button",{onClick:se,className:"h-9 px-4 rounded-lg border border-border/60 bg-background/20 text-xs font-semibold hover:border-primary/50 hover:bg-background/40 transition-all cursor-pointer whitespace-nowrap",children:"Laden"})]})]})}const PX={fast:{title:"Schnelles Alltags-Hirn",desc:"Schnelle MoE-Antworten für Chat, Zusammenfassungen und alltägliche Aufgaben.",icon:xa},heavy:{title:"Schweres Reasoning",desc:"Große Modelle für komplexe Logik, Mathematik und tiefgründiges Planen.",icon:Ao},coder:{title:"Coden & Entwicklung",desc:"Autovervollständigung, Refactoring und Codegenerierung direkt in deiner IDE.",icon:Fs},vision:{title:"Bilder & Vision",desc:"Verarbeitet Bilder, Screenshots und visuelle Diagramme in multimodalen Chats.",icon:uf},hermes:{title:"Lucys Hirn (Agent)",desc:"Lucys dauer-warmes Agent-Hirn mit Tool-Calling — bleibt ko-resident, lädt nie kalt nach.",icon:Q3},scout:{title:"Multimodal-Allrounder",desc:"Multimodaler Allrounder für schnelle Antworten, Übersetzungen und Alltag.",icon:lv}};function OX(){const{data:e,isLoading:t,error:r}=RD(),{data:n}=Ni(),{data:a}=vh(),o=(n==null?void 0:n.models)??[],c=r?String(r):"",[u,f]=y.useState({}),[h,m]=y.useState({}),[g,v]=y.useState("recommended");async function b(j,k,S,N){f(E=>({...E,[j]:"Starte..."}));try{await Se("/api/models/install",{method:"POST",body:JSON.stringify({repo:j,role:k,quant:S,jinja:N})}),f(E=>({...E,[j]:"Download läuft"}))}catch{f(A=>({...A,[j]:"Fehler"}))}}return l.jsxs("div",{className:"space-y-6",children:[l.jsx("div",{className:"flex rounded-xl border border-border/60 bg-card/45 backdrop-blur-md p-1 w-fit",children:[["recommended","Empfohlen"],["browse","Stöbern & Suchen"]].map(([j,k])=>l.jsx("button",{onClick:()=>v(j),className:ee("rounded-lg px-4 py-1.5 text-xs font-semibold tracking-wide transition-all cursor-pointer",g===j?"bg-primary text-primary-foreground shadow-md shadow-primary/10":"text-muted-foreground hover:text-foreground"),children:k},j))}),g==="browse"?l.jsx(CX,{}):t?l.jsx("div",{className:"text-xs text-muted-foreground py-12 text-center",children:"Analysiere Hardware und suche passende GGUF-Empfehlungen…"}):c||!e?l.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400",children:["Empfehlungsdienst temporär nicht erreichbar (",c,")."]}):l.jsxs("div",{className:"space-y-8",children:[l.jsxs("div",{className:"text-[10px] font-mono text-muted-foreground bg-background/25 border border-border/40 p-4 rounded-xl flex flex-col sm:flex-row sm:items-center justify-between gap-3 shadow-sm",children:[l.jsxs("div",{children:["Modell-Registry geladen für ",l.jsxs("span",{className:"text-foreground font-bold",children:[e.sys_ram_gb," GB"]})," System-RAM."]}),l.jsxs("div",{className:"flex items-center gap-1.5",children:[l.jsx(F4,{className:"h-3.5 w-3.5 text-primary fill-primary/20"}),l.jsx("span",{children:"Empfehlungen sind automatisch auf deine Box-Hardware optimiert."})]})]}),l.jsx("div",{className:"grid gap-6 md:grid-cols-2",children:e.categories.map(j=>{const k=PX[j.role]||{title:j.title||j.role,desc:"Spezifisches Modell für diese Systemrolle.",icon:ky},S=k.icon,N=o.find(D=>D.role===j.role),E=a==null?void 0:a.model_list.find(D=>D.role===j.role),A=j.models.find(D=>D.repo===j.recommended)||j.models[0];if(!A)return null;const P=u[A.repo],_=j.models.filter(D=>D.repo!==j.recommended),O=!!h[j.role];return l.jsxs("div",{className:ee("rounded-2xl border bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 flex flex-col justify-between gap-5 transition-all duration-300 hover:border-primary/40",N?"border-border/60":"border-primary/20 shadow-primary/5"),children:[l.jsxs("div",{className:"space-y-4",children:[l.jsxs("div",{className:"flex items-start justify-between gap-3",children:[l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsx("div",{className:"w-10 h-10 rounded-xl bg-primary/10 border border-primary/20 flex items-center justify-center text-primary shadow-sm shrink-0",children:l.jsx(S,{className:"h-5.5 w-5.5"})}),l.jsxs("div",{children:[l.jsx("h3",{className:"text-sm font-bold tracking-tight text-foreground",children:k.title}),l.jsxs("span",{className:"text-[9px] font-mono text-muted-foreground uppercase bg-background/50 px-1.5 py-0.5 rounded border border-border/30 inline-block mt-0.5",children:["Rolle: ",j.role]})]})]}),N?l.jsxs("span",{className:"flex items-center gap-1.5 text-[9px] font-bold text-emerald-400 uppercase tracking-wider bg-emerald-500/10 border border-emerald-500/20 px-2.5 py-1 rounded-lg",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"}),"Aktiviert"]}):l.jsx("span",{className:"text-[9px] font-bold text-primary/70 uppercase tracking-wider bg-primary/10 border border-primary/20 px-2.5 py-1 rounded-lg",children:"Frei"})]}),l.jsx("p",{className:"text-xs text-muted-foreground leading-relaxed",children:k.desc}),l.jsx("div",{className:"p-3.5 rounded-xl bg-background/35 border border-border/30 space-y-2.5",children:N?l.jsxs("div",{className:"space-y-1.5",children:[l.jsx("div",{className:"text-[9px] font-bold uppercase tracking-wider text-muted-foreground/60",children:"Aktive GGUF-Belegung"}),l.jsx("div",{className:"text-xs font-mono font-bold text-foreground truncate",title:N.name,children:N.name.split("/").pop()}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2",children:[l.jsxs("span",{children:["Größe: ",wv(N.size_bytes||0)]}),l.jsx("span",{children:"•"}),l.jsxs("span",{children:["Quant: ",N.quant||"GGUF"]})]})]}):l.jsxs("div",{className:"space-y-1.5",children:[l.jsx("div",{className:"text-[9px] font-bold uppercase tracking-wider text-primary/80",children:"Empfohlenes Modell"}),l.jsx("div",{className:"text-xs font-mono font-bold text-foreground truncate",title:A.name,children:A.name}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2 flex-wrap",children:[l.jsxs("span",{children:["Ersteller: ",A.author]}),l.jsx("span",{children:"•"}),l.jsxs("span",{children:["Quant: ",A.quant]})]}),l.jsx("div",{className:"flex items-center gap-1.5 pt-0.5",children:l.jsx(hX,{fit:A.fit})})]})}),l.jsx("div",{className:"pt-1",children:N?E?l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"text-[9px] font-semibold text-amber-400 flex items-center gap-1.5",children:[l.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-amber-400 animate-ping shrink-0"}),l.jsxs("span",{children:["Bessere Version in der Registry: ",E.repo.split("/").pop()]})]}),l.jsxs("button",{onClick:()=>b(E.repo,j.role,A.quant||"Q4_K_M",A.caps.tools!=="no"),disabled:!!u[E.repo],className:"h-8 w-full flex items-center justify-center gap-1.5 rounded-lg bg-amber-500 text-black text-xs font-bold hover:bg-amber-400 disabled:opacity-50 transition-all cursor-pointer shadow-md shadow-amber-500/10",children:[l.jsx(Bs,{className:"h-3.5 w-3.5"}),u[E.repo]||"Auf neue Version aktualisieren"]})]}):l.jsxs("div",{className:"h-8 flex items-center justify-center gap-1.5 text-[10px] font-bold text-emerald-400 uppercase tracking-wide bg-emerald-500/5 border border-emerald-500/10 rounded-lg select-none",children:[l.jsx(sr,{className:"h-4 w-4"})," Auf neuestem Stand"]}):l.jsxs("button",{onClick:()=>b(A.repo,j.role,A.quant||"Q4_K_M",A.caps.tools!=="no"),disabled:!!P,className:ee("h-8 w-full flex items-center justify-center gap-1.5 rounded-lg text-xs font-bold transition-all cursor-pointer border",P?"border-primary/40 bg-primary/5 text-primary":"bg-primary text-primary-foreground hover:opacity-90 shadow-md shadow-primary/10"),children:[l.jsx(Bs,{className:"h-3.5 w-3.5"}),P||"Optimales Modell einsetzen"]})})]}),_.length>0&&l.jsxs("div",{className:"border-t border-border/20 pt-3",children:[l.jsxs("button",{onClick:()=>m(D=>({...D,[j.role]:!O})),className:"flex items-center gap-1.5 text-[10px] text-muted-foreground/80 hover:text-foreground transition-colors cursor-pointer",children:[O?l.jsx(ON,{className:"h-3 w-3"}):l.jsx(PN,{className:"h-3 w-3"}),l.jsxs("span",{children:["Alternative Empfehlungen anzeigen (",_.length,")"]})]}),O&&l.jsx("div",{className:"mt-2.5 space-y-2 max-h-36 overflow-y-auto pr-1 scrollbar-thin",children:_.map(D=>l.jsxs("div",{className:"p-2 rounded-lg bg-background/25 border border-border/20 flex items-center justify-between gap-3",children:[l.jsxs("div",{className:"min-w-0",children:[l.jsx("div",{className:"text-[10px] font-mono font-bold text-foreground truncate",title:D.name,children:D.name}),l.jsxs("div",{className:"text-[9px] text-muted-foreground flex items-center gap-1.5 mt-0.5",children:[l.jsxs("span",{children:["Quant: ",D.quant]}),l.jsx("span",{children:"•"}),l.jsx("span",{children:D.fit.text})]})]}),l.jsx("button",{onClick:()=>b(D.repo,j.role,D.quant||"Q4_K_M",D.caps.tools!=="no"),disabled:!!u[D.repo],className:"h-6 px-2.5 rounded bg-background/40 hover:bg-background/80 border border-border/40 text-[9px] font-bold text-foreground transition-all cursor-pointer shrink-0 disabled:opacity-50",children:u[D.repo]||"Installieren"})]},D.repo))})]})]},j.role)})})]})]})}function _X(){const[e,t]=y.useState("cockpit");return l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{className:"flex flex-col sm:flex-row justify-between sm:items-center gap-4",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Modell-Manager"}),l.jsx("p",{className:"text-sm text-muted-foreground",children:"Verwalte deine Modelle und passe das Gateway-Routing live über das interaktive Cockpit an."})]}),l.jsx("div",{className:"flex rounded-xl border border-border/60 bg-card/45 backdrop-blur-md p-1 self-start",children:["cockpit","discover"].map(r=>l.jsx("button",{onClick:()=>t(r),className:ee("rounded-lg px-4 py-1.5 text-xs font-semibold tracking-wide uppercase transition-all cursor-pointer",e===r?"bg-primary text-primary-foreground shadow-md shadow-primary/10":"text-muted-foreground hover:text-foreground"),children:r==="cockpit"?"Cockpit":"Modelle finden"},r))})]}),l.jsx(xX,{}),l.jsx("div",{className:"transition-all duration-300",children:e==="cockpit"?l.jsx(qO,{}):l.jsx(OX,{})})]})}const MX={cline:"cline_settings.json",cursor:"Settings → Models",opencode:"opencode.jsonc",zed:"settings.json",continue:"~/.continue/config.json",claude_code:"~/.zshrc / env"};function q2({line:e,loading:t}){return t||!e?l.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] font-semibold text-muted-foreground",children:[l.jsx(dh,{className:"h-3 w-3 animate-spin"})," prüfe…"]}):e.ok?l.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] font-semibold text-emerald-400",children:[l.jsx(e4,{className:"h-3 w-3"})," ",e.detail]}):l.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] font-semibold text-red-400",children:[l.jsx(r4,{className:"h-3 w-3"})," ",e.detail]})}function Q2({tool:e,fileName:t,accent:r,copied:n,onCopy:a}){return l.jsxs("div",{className:"flex flex-col border border-border/60 bg-black/60 rounded-2xl overflow-hidden shadow-2xl",children:[l.jsxs("div",{className:"flex h-11 items-center justify-between px-4 border-b border-border/40 bg-black/40 shrink-0",children:[l.jsxs("div",{className:"flex items-center gap-1.5",children:[l.jsx("span",{className:"h-3 w-3 rounded-full bg-red-500/80"}),l.jsx("span",{className:"h-3 w-3 rounded-full bg-amber-500/80"}),l.jsx("span",{className:"h-3 w-3 rounded-full bg-emerald-500/80"})]}),l.jsx("div",{className:"flex items-center gap-1.5 text-[10px] font-mono text-muted-foreground/75 bg-background/30 px-3 py-1 rounded-md border border-border/20",children:l.jsx("span",{children:t})}),l.jsxs("button",{onClick:a,className:"flex h-7 px-2.5 items-center gap-1.5 rounded-lg border border-border/40 bg-background/30 text-[10px] font-semibold text-muted-foreground hover:text-foreground hover:bg-background/60 transition-all cursor-pointer",children:[n?l.jsx(sr,{className:"h-3.5 w-3.5 text-emerald-400"}):l.jsx(uv,{className:"h-3.5 w-3.5"}),l.jsx("span",{children:n?"Kopiert":"Kopieren"})]})]}),l.jsx("pre",{className:ee("p-5 overflow-x-auto text-xs font-mono whitespace-pre leading-relaxed scrollbar-thin select-text bg-black/10",r==="teal"?"text-cyan-200/90":"text-violet-200/90"),children:l.jsx("code",{children:e.snippet})})]})}function QO(){const[e,t]=y.useState(localStorage.getItem("mc_host")||"192.168.178.151"),[r,n]=y.useState(localStorage.getItem("mc_mcp_path")||""),[a,o]=y.useState("cline"),[c,u]=y.useState(null),f=new URLSearchParams({host:e});r&&f.set("mcp_path",r);const{data:h,error:m}=$D(f.toString()),{data:g,isLoading:v}=zD(),b=m?String(m):"";function j(E){t(E),E&&localStorage.setItem("mc_host",E)}function k(E){n(E),localStorage.setItem("mc_mcp_path",E)}const S=h==null?void 0:h.tools[a];async function N(E,A){A&&(await navigator.clipboard.writeText(A),u(E),setTimeout(()=>u(null),1500))}return l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Verbindung & Integration"}),l.jsxs("p",{className:"text-sm text-muted-foreground",children:["Binde deinen lokalen Agenten an die Box an — über ",l.jsx("span",{className:"text-foreground",children:"zwei getrennte Leitungen"}),": das Modell (Gateway) und das geteilte Gedächtnis (MCP)."]})]}),l.jsxs("div",{className:"p-5 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md shadow-lg shadow-black/10",children:[l.jsxs("div",{className:"grid gap-4 md:grid-cols-[170px_1fr] items-center",children:[l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-background/40 p-4 text-center",children:[l.jsx(g4,{className:"h-7 w-7 mx-auto text-muted-foreground"}),l.jsx("div",{className:"mt-2 text-sm font-semibold text-foreground",children:"Dein lokaler Agent"}),l.jsx("div",{className:"text-[11px] text-muted-foreground",children:"Cline · Cursor · Zed …"})]}),l.jsxs("div",{className:"flex flex-col gap-2.5",children:[l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsx(sf,{className:"h-4 w-4 text-muted-foreground shrink-0"}),l.jsxs("div",{className:"flex-1 rounded-xl border border-primary/25 bg-primary/5 px-3.5 py-2.5",children:[l.jsxs("div",{className:"flex items-center justify-between gap-2",children:[l.jsxs("div",{className:"flex items-center gap-2 text-xs font-semibold text-primary",children:[l.jsx(Hn,{className:"h-3.5 w-3.5"})," Leitung 1 — Modell"]}),l.jsx(q2,{line:g==null?void 0:g.gateway,loading:v})]}),l.jsx("div",{className:"mt-1 text-[11px] font-mono text-primary/80",children:"Gateway · :9001/v1 · Lanes chat / coding"})]})]}),l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsx(sf,{className:"h-4 w-4 text-muted-foreground shrink-0"}),l.jsxs("div",{className:"flex-1 rounded-xl border border-violet-500/25 bg-violet-500/5 px-3.5 py-2.5",children:[l.jsxs("div",{className:"flex items-center justify-between gap-2",children:[l.jsxs("div",{className:"flex items-center gap-2 text-xs font-semibold text-violet-300",children:[l.jsx(Ao,{className:"h-3.5 w-3.5"})," Leitung 2 — Gedächtnis"]}),l.jsx(q2,{line:g==null?void 0:g.memory,loading:v})]}),l.jsx("div",{className:"mt-1 text-[11px] font-mono text-violet-300/80",children:"MCP · mcp_memory.py · separat"})]})]})]})]}),l.jsxs("p",{className:"mt-3.5 text-[11px] text-muted-foreground leading-relaxed",children:["Der Gateway liefert ",l.jsx("span",{className:"text-foreground",children:"nur das LLM"}),". Das geteilte Gedächtnis läuft über einen",l.jsx("span",{className:"text-foreground",children:" eigenen MCP-Server"})," — beide werden unabhängig eingerichtet."]})]}),l.jsxs("div",{className:"grid gap-4 md:grid-cols-2 p-5 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md shadow-lg shadow-black/10",children:[l.jsxs("div",{className:"space-y-1.5",children:[l.jsxs("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground flex items-center gap-1.5",children:[l.jsx(f4,{className:"h-3.5 w-3.5 text-primary"})," Box LAN IP-Adresse"]}),l.jsx("input",{value:e,onChange:E=>j(E.target.value),"aria-label":"Box LAN IP-Adresse",spellCheck:!1,placeholder:"z.B. 192.168.178.151",className:"w-full h-9 rounded-lg border border-border/60 bg-background/40 px-3 font-mono text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground"})]}),l.jsxs("div",{className:"space-y-1.5",children:[l.jsxs("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground flex items-center gap-1.5",children:[l.jsx(c4,{className:"h-3.5 w-3.5 text-violet-400"})," Lokaler MCP-Scriptpfad",l.jsx("span",{className:"text-violet-400/70 normal-case font-semibold tracking-normal",children:"(nur Leitung 2)"})]}),l.jsx("input",{value:r,onChange:E=>k(E.target.value),"aria-label":"Lokaler MCP-Scriptpfad",spellCheck:!1,placeholder:"z.B. F:\\Coding Stuff\\mission-control-2\\mcp\\mcp_memory.py",className:"w-full h-9 rounded-lg border border-border/60 bg-background/40 px-3 font-mono text-xs outline-none focus:ring-1 focus:ring-violet-500/50 text-foreground"})]})]}),b&&l.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400",children:["Fehler beim Generieren der Snippets: ",b]}),h&&l.jsxs("div",{className:"grid gap-5 lg:grid-cols-2",children:[l.jsxs("div",{className:"space-y-3 rounded-2xl border border-border/60 border-t-2 border-t-primary/70 bg-card/30 p-4",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center gap-2 text-sm font-space font-bold text-foreground",children:[l.jsx("span",{className:"flex h-5 w-5 items-center justify-center rounded-md bg-primary/15 text-primary text-[11px]",children:"1"}),"Modell anbinden"]}),l.jsx("p",{className:"text-[11px] text-muted-foreground mt-0.5",children:"Wähle dein Tool — das Snippet zeigt auf den Gateway."})]}),l.jsx("div",{className:"flex flex-wrap gap-1.5",children:Object.entries(h.tools).map(([E,A])=>l.jsx("button",{onClick:()=>o(E),className:ee("rounded-lg px-3 py-1.5 text-[11px] font-semibold tracking-wide transition-all cursor-pointer",a===E?"bg-primary text-primary-foreground shadow-md shadow-primary/10":"border border-border/50 text-muted-foreground hover:text-foreground"),children:A.label},E))}),S&&l.jsxs(l.Fragment,{children:[S.note&&l.jsxs("div",{className:"flex items-start gap-2.5 p-3 rounded-xl bg-primary/5 border border-primary/20 text-[11px] text-muted-foreground leading-relaxed",children:[l.jsx(mw,{className:"h-4 w-4 text-primary shrink-0 mt-0.5"}),l.jsx("span",{children:S.note})]}),l.jsx(Q2,{tool:S,fileName:MX[a]||"config.json",accent:"teal",copied:c==="model",onCopy:()=>N("model",S.snippet)})]})]}),l.jsxs("div",{className:"space-y-3 rounded-2xl border border-border/60 border-t-2 border-t-violet-500/70 bg-card/30 p-4",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center gap-2 text-sm font-space font-bold text-foreground",children:[l.jsx("span",{className:"flex h-5 w-5 items-center justify-center rounded-md bg-violet-500/15 text-violet-300 text-[11px]",children:"2"}),"Gedächtnis anbinden",l.jsx("span",{className:"text-[10px] font-medium text-muted-foreground normal-case",children:"optional"})]}),l.jsxs("p",{className:"text-[11px] text-muted-foreground mt-0.5",children:["Ein MCP-Block — gilt zusätzlich für ",l.jsx("em",{children:"jedes"})," Tool aus Schritt 1."]})]}),l.jsxs("div",{className:"flex items-start gap-2.5 p-3 rounded-xl bg-violet-500/5 border border-violet-500/20 text-[11px] text-muted-foreground leading-relaxed",children:[l.jsx(mw,{className:"h-4 w-4 text-violet-400 shrink-0 mt-0.5"}),l.jsx("span",{children:h.memory.note})]}),l.jsx(Q2,{tool:h.memory,fileName:"mcp.json",accent:"violet",copied:c==="memory",onCopy:()=>N("memory",h.memory.snippet)})]})]})]})}const IX="modulepreload",TX=function(e){return"/"+e},Y2={},DX=function(t,r,n){let a=Promise.resolve();if(r&&r.length>0){let c=function(h){return Promise.all(h.map(m=>Promise.resolve(m).then(g=>({status:"fulfilled",value:g}),g=>({status:"rejected",reason:g}))))};document.getElementsByTagName("link");const u=document.querySelector("meta[property=csp-nonce]"),f=(u==null?void 0:u.nonce)||(u==null?void 0:u.getAttribute("nonce"));a=c(r.map(h=>{if(h=TX(h),h in Y2)return;Y2[h]=!0;const m=h.endsWith(".css"),g=m?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${h}"]${g}`))return;const v=document.createElement("link");if(v.rel=m?"stylesheet":IX,m||(v.as="script"),v.crossOrigin="",v.href=h,f&&v.setAttribute("nonce",f),document.head.appendChild(v),m)return new Promise((b,j)=>{v.addEventListener("load",b),v.addEventListener("error",()=>j(new Error(`Unable to preload CSS for ${h}`)))})}))}function o(c){const u=new Event("vite:preloadError",{cancelable:!0});if(u.payload=c,window.dispatchEvent(u),!u.defaultPrevented)throw c}return a.then(c=>{for(const u of c||[])u.status==="rejected"&&o(u.reason);return t().catch(o)})};class RX extends y.Component{constructor(){super(...arguments);Yl(this,"state",{error:null})}static getDerivedStateFromError(r){return{error:r}}render(){return this.state.error?l.jsxs("div",{className:"h-[480px] rounded-2xl border border-red-500/20 bg-red-500/5 p-6 text-xs text-red-400 overflow-auto",children:[l.jsx("div",{className:"font-semibold mb-2",children:"Graph konnte nicht gerendert werden"}),l.jsx("pre",{className:"whitespace-pre-wrap break-words text-[11px] leading-relaxed",children:this.state.error.message})]}):this.props.children}}const LX=y.lazy(()=>DX(()=>import("./GraphView-CfrAKviO.js"),[]).then(e=>({default:e.GraphView}))),Qd=["identity","knowledge","rules","events"],X2=new Set(["auto","agent","hermes"]),Wg={identity:{label:"Identität",icon:U4,bg:"bg-cyan-500/10",text:"text-cyan-400"},knowledge:{label:"Wissen",icon:ws,bg:"bg-indigo-500/10",text:"text-indigo-400"},rules:{label:"Regeln",icon:M4,bg:"bg-violet-500/10",text:"text-violet-400"},events:{label:"Ereignisse",icon:n4,bg:"bg-amber-500/10",text:"text-amber-400"}},Z2={label:"Gedächtnis",icon:sv,text:"text-muted-foreground"},$X={identity:"border-l-cyan-500/80",knowledge:"border-l-indigo-500/80",rules:"border-l-violet-500/80",events:"border-l-amber-500/80"},J2=`Hi Hermes! Lass uns ein kurzes Onboarding machen, damit du dich künftig an mich erinnerst. Stell mir nacheinander ein paar kurze Fragen zu: +1) wer ich bin und woran ich gerade arbeite, +2) wie ich angesprochen werden möchte, +3) meine bevorzugten Tools, Sprachen und Arbeitsweise, +4) wichtige Regeln/Konventionen, die du beachten sollst, +5) meine Infrastruktur (Server, Dienste – ohne Geheimnisse). +Frag immer nur eine Sache auf einmal und fass am Ende zusammen, was du dir gemerkt hast.`;function YO(){const[e,t]=y.useState(""),[r,n]=y.useState(""),[a,o]=y.useState(""),[c,u]=y.useState("knowledge"),[f,h]=y.useState(!1),[m,g]=y.useState(!1),[v,b]=y.useState("liste"),[j,k]=y.useState(!1),S=Yn(),{showAlert:N,showConfirm:E,dialogElement:A}=Aa(),{data:P=[]}=vv({}),{data:_=[],error:O}=vv({q:r,category:e}),{data:D}=MD(v==="graph"),U=O?String(O):"",B=()=>{S.invalidateQueries({queryKey:["memory"]}),S.invalidateQueries({queryKey:["memory-graph"]})},F=y.useMemo(()=>{const I=P.length,M=P.filter(K=>X2.has(K.source)).length;return{total:I,auto:M,manual:I-M,cats:new Set(P.map(K=>K.category)).size}},[P]),Y=P.length===0,H=y.useMemo(()=>{const I=D??{nodes:[],edges:[]};if(!r.trim())return I;const M=r.toLowerCase(),K=I.nodes.filter(Z=>Z.content.toLowerCase().includes(M)),ne=new Set(K.map(Z=>Z.id));return{nodes:K,edges:I.edges.filter(Z=>ne.has(Z.source)&&ne.has(Z.target))}},[D,r]),pe=y.useMemo(()=>{const I={};return _.forEach(M=>{var K;(I[K=M.category]??(I[K]=[])).push(M)}),I},[_]),ue=y.useMemo(()=>_.filter(I=>!Qd.includes(I.category)),[_]);async function he(){a.trim()&&(await Se("/api/memory",{method:"POST",body:JSON.stringify({content:a,category:c,source:"ui"})}),o(""),k(!1),B())}function ae(I){E("Eintrag löschen?","Diesen Gedächtnis-Eintrag dauerhaft entfernen?",async()=>{try{await Se(`/api/memory/${I}`,{method:"DELETE"}),B()}catch(M){N("Fehler",`Löschen fehlgeschlagen: ${M.message||M}`)}})}async function se(){try{await navigator.clipboard.writeText(J2),g(!0),setTimeout(()=>g(!1),1800)}catch{N("Kopieren fehlgeschlagen","Markiere den Prompt und kopiere ihn manuell (Strg+C).")}}function X(){se(),window.dispatchEvent(new CustomEvent("mc-navigate",{detail:{view:"terminal"}}))}async function te(){h(!0);try{const I=await Se("/api/memory/dedupe",{method:"POST",body:JSON.stringify({apply:!1})});if(I.duplicate_count===0){N("Ergebnis","Keine Dubletten gefunden — alles sauber.");return}E("Deduplizierung bestätigen",`${I.duplicate_count} Dublette(n) in ${I.groups.length} Gruppe(n) gefunden. Entfernen?`,async()=>{try{await Se("/api/memory/dedupe",{method:"POST",body:JSON.stringify({apply:!0})}),B()}catch(M){N("Fehler",`Fehler beim Löschen: ${M.message}`)}})}catch(I){N("Fehler",`Fehler bei der Deduplizierung: ${I.message}`)}finally{h(!1)}}const J=({value:I,label:M,accent:K})=>l.jsxs("span",{className:ee("flex items-center gap-1.5 text-[11px] rounded-lg px-2.5 py-1 border",K==="auto"?"text-emerald-400 bg-emerald-500/[0.07] border-emerald-500/20":"text-muted-foreground bg-card/40 border-border/50"),children:[K==="auto"&&l.jsx(ys,{className:"h-3 w-3"}),l.jsx("b",{className:ee("font-semibold",K==="auto"?"":"text-foreground"),children:I})," ",M]});return l.jsxs("div",{className:"space-y-5",children:[l.jsxs("div",{className:"flex flex-col lg:flex-row lg:items-center justify-between gap-3",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Gedächtnis-Pool"}),l.jsx("p",{className:"text-sm text-muted-foreground",children:"Geteilte Konstitution — Hermes, IDEs & Gateway lesen und lernen hier per MCP."})]}),l.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[l.jsxs("div",{className:"relative",children:[l.jsx("input",{value:r,onChange:I=>n(I.target.value),"aria-label":"Gedächtnis durchsuchen",type:"search",placeholder:"Semantisch suchen…",className:"w-52 h-9 pl-8 pr-3 rounded-lg border border-border/60 bg-card/45 text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground"}),l.jsx(MN,{className:"absolute left-2.5 top-2.5 h-3.5 w-3.5 text-muted-foreground"})]}),l.jsxs("button",{onClick:()=>k(I=>!I),className:"h-9 px-3 rounded-lg bg-primary text-primary-foreground text-xs font-semibold hover:opacity-90 transition-all flex items-center gap-1.5 cursor-pointer shadow-md shadow-primary/10",children:[l.jsx(df,{className:"h-4 w-4"})," Eintrag"]}),l.jsx("div",{className:"flex items-center gap-1 p-1 bg-card/30 border border-border/40 rounded-lg",children:[["liste",b4,"Liste"],["graph",T4,"Graph"]].map(([I,M,K])=>l.jsxs("button",{onClick:()=>b(I),className:ee("flex h-7 px-2.5 items-center gap-1.5 text-[11px] font-semibold rounded-md transition-all cursor-pointer",v===I?"bg-primary text-primary-foreground":"text-muted-foreground hover:text-foreground"),children:[l.jsx(M,{className:"h-3.5 w-3.5"})," ",K]},I))}),l.jsx("button",{onClick:te,disabled:f,className:"flex h-9 w-9 items-center justify-center rounded-lg border border-border/60 bg-card hover:border-primary/50 transition-all cursor-pointer shadow-md disabled:opacity-50","aria-label":"Duplikate bereinigen",title:"Deduplizieren",children:l.jsx(ys,{className:"h-4 w-4 text-primary","aria-hidden":"true"})})]})]}),!Y&&l.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[l.jsx(J,{value:F.total,label:"Fakten"}),l.jsx(J,{value:F.auto,label:"auto gelernt",accent:"auto"}),l.jsx(J,{value:F.manual,label:"manuell"}),l.jsx(J,{value:F.cats,label:"Kategorien"}),l.jsxs("span",{className:"ml-auto text-[11px] text-muted-foreground/70 flex items-center gap-1.5",children:[l.jsx(ys,{className:"h-3 w-3 text-emerald-400"})," lernt automatisch aus Hermes-Gesprächen"]})]}),j&&l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-4 space-y-3",children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx("div",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Neuen Eintrag anlegen"}),l.jsx("button",{onClick:()=>k(!1),"aria-label":"Schließen",className:"text-muted-foreground hover:text-foreground",children:l.jsx(Wn,{className:"h-4 w-4","aria-hidden":"true"})})]}),l.jsx("textarea",{value:a,onChange:I=>o(I.target.value),rows:2,"aria-label":"Eintragstext",placeholder:"Eine Regel, Vorliebe oder einen stabilen Fakt über dich oder das Projekt…",className:"w-full resize-none rounded-xl border border-border/60 bg-background/30 p-3 text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground leading-relaxed"}),l.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[l.jsx("select",{value:c,onChange:I=>u(I.target.value),"aria-label":"Kategorie",className:"h-8 rounded-lg border border-border/60 bg-background/50 px-2 text-xs outline-none font-semibold text-foreground cursor-pointer",children:Qd.map(I=>{var M;return l.jsx("option",{value:I,className:"bg-popover text-foreground",children:((M=Wg[I])==null?void 0:M.label)||I},I)})}),l.jsxs("button",{onClick:he,className:"h-9 px-4 rounded-lg bg-primary text-primary-foreground text-xs font-semibold hover:opacity-90 transition-all flex items-center gap-1.5 cursor-pointer",children:[l.jsx(df,{className:"h-4 w-4"})," Speichern"]})]})]}),U&&l.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400",children:["Fehler: ",U]}),Y?l.jsxs("div",{className:"rounded-2xl border border-dashed border-border/60 bg-card/20 p-8 sm:p-10 flex flex-col items-center text-center gap-5",children:[l.jsx("div",{className:"h-14 w-14 rounded-2xl bg-primary/10 flex items-center justify-center",children:l.jsx(j4,{className:"h-7 w-7 text-primary"})}),l.jsxs("div",{className:"space-y-1.5 max-w-lg",children:[l.jsx("h3",{className:"text-base font-semibold text-foreground",children:"Lass Hermes dich kennenlernen"}),l.jsx("p",{className:"text-xs text-muted-foreground leading-relaxed",children:"Statt Fakten einzutippen: führ ein kurzes Onboarding-Gespräch mit Hermes. Was ihr besprecht, merkt sich das Gedächtnis automatisch — du musst nichts manuell pflegen."})]}),l.jsxs("div",{className:"w-full max-w-lg text-left",children:[l.jsxs("div",{className:"flex items-center justify-between mb-1.5",children:[l.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground/60",children:"Sende das an Hermes"}),l.jsx("button",{onClick:se,className:"flex items-center gap-1 text-[10px] font-semibold text-muted-foreground hover:text-foreground transition-colors",children:m?l.jsxs(l.Fragment,{children:[l.jsx(sr,{className:"h-3 w-3 text-emerald-400"})," Kopiert"]}):l.jsxs(l.Fragment,{children:[l.jsx(uv,{className:"h-3 w-3"})," Kopieren"]})})]}),l.jsx("pre",{className:"w-full rounded-xl border border-border/60 bg-background/40 p-3.5 text-[11px] leading-relaxed text-foreground/90 whitespace-pre-wrap font-mono",children:J2})]}),l.jsxs("div",{className:"flex flex-wrap items-center justify-center gap-2",children:[l.jsxs("button",{onClick:X,className:"h-9 px-4 rounded-lg bg-primary text-primary-foreground text-xs font-semibold hover:opacity-90 transition-all flex items-center gap-1.5 cursor-pointer",children:[l.jsx(TN,{className:"h-4 w-4"})," Im Terminal starten"]}),l.jsxs("button",{onClick:se,className:"h-9 px-4 rounded-lg border border-border/60 bg-card text-xs font-semibold hover:border-primary/50 transition-all flex items-center gap-1.5 cursor-pointer",children:[m?l.jsx(sr,{className:"h-4 w-4 text-emerald-400"}):l.jsx(uv,{className:"h-4 w-4"})," Prompt kopieren"]})]}),l.jsxs("p",{className:"text-[11px] text-muted-foreground/70 flex items-center gap-1.5",children:[l.jsx(I4,{className:"h-3 w-3"})," Funktioniert genauso über Telegram —"," ",l.jsx("button",{onClick:()=>k(!0),className:"underline hover:text-foreground",children:"oder lieber manuell anlegen"}),"."]})]}):v==="graph"?l.jsx(RX,{children:l.jsx(y.Suspense,{fallback:l.jsx("div",{className:"h-[480px] rounded-2xl border border-border/60 bg-card/30 flex items-center justify-center text-xs text-muted-foreground",children:"Graph wird geladen…"}),children:l.jsx(LX,{data:H,onDelete:ae})})}):l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"flex flex-wrap items-center gap-1.5 p-1 bg-card/30 border border-border/40 rounded-xl w-fit",children:[l.jsx("button",{onClick:()=>t(""),className:ee("h-7 px-3 rounded-lg text-[10px] font-semibold uppercase tracking-wider transition-all cursor-pointer",e?"text-muted-foreground hover:text-foreground":"bg-primary text-primary-foreground"),children:"Alle"}),Qd.map(I=>{const M=Wg[I]||Z2,K=M.icon;return l.jsxs("button",{onClick:()=>t(I),className:ee("h-7 px-2.5 rounded-lg text-[10px] font-semibold uppercase tracking-wider transition-all cursor-pointer flex items-center gap-1",e===I?"bg-primary text-primary-foreground":"text-muted-foreground hover:text-foreground"),children:[l.jsx(K,{className:"h-3 w-3"})," ",M.label]},I)})]}),_.length===0?l.jsx("div",{className:"text-xs text-muted-foreground border border-dashed border-border/60 rounded-2xl p-12 text-center",children:"Keine Einträge für die aktuellen Filterkriterien gefunden."}):l.jsx("div",{className:"space-y-5",children:[...Qd,"__other"].map(I=>{const M=I==="__other"?ue:pe[I]||[];if(!M.length)return null;const K=Wg[I]||Z2,ne=K.icon;return l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center gap-2 mb-2 px-1",children:[l.jsx(ne,{className:ee("h-3.5 w-3.5",K.text)}),l.jsx("span",{className:ee("text-[11px] font-bold uppercase tracking-wider",K.text),children:K.label}),l.jsx("span",{className:"text-[10px] font-mono text-muted-foreground/60 bg-card/50 rounded px-1.5 py-0.5",children:M.length}),l.jsx("div",{className:"ml-1 h-px flex-1 bg-border/30"})]}),l.jsx("div",{className:"space-y-2",children:M.map(Z=>{const me=X2.has(Z.source);return l.jsxs("div",{className:ee("flex items-start justify-between gap-4 p-3.5 rounded-xl border border-l-4 bg-card/45 backdrop-blur-md border-border/60 hover:border-primary/20 transition-all group",$X[Z.category]||"border-l-muted"),children:[l.jsx("span",{className:"text-xs text-foreground leading-relaxed break-words whitespace-pre-wrap flex-1 min-w-0",children:Z.content}),l.jsxs("div",{className:"flex items-center gap-2 shrink-0",children:[typeof Z.score=="number"&&l.jsxs("span",{className:"text-[9px] font-mono text-primary bg-primary/10 px-1.5 py-0.5 rounded",title:"Relevanz der semantischen Suche",children:[Math.round(Z.score*100),"%"]}),l.jsxs("span",{className:ee("flex items-center gap-1 text-[9px] font-mono px-1.5 py-0.5 rounded",me?"text-emerald-400 bg-emerald-500/10":"text-muted-foreground/60 bg-background/20"),title:me?"Automatisch gelernt":"Manuell angelegt",children:[me&&l.jsx(ys,{className:"h-2.5 w-2.5"}),Z.source]}),l.jsx("button",{onClick:()=>ae(Z.id),"aria-label":"Eintrag löschen",title:"Eintrag löschen",className:"h-7 w-7 rounded-lg flex items-center justify-center border border-border/40 text-muted-foreground hover:text-red-400 hover:bg-red-500/5 transition-all opacity-0 group-hover:opacity-100",children:l.jsx(cv,{className:"h-3.5 w-3.5","aria-hidden":"true"})})]})]},Z.id)})})]},I)})})]}),A]})}const zX=["chat","coding","fast","heavy"];function XO(){const{data:e,error:t}=Oy(5e3),{data:r}=Ni(),{showAlert:n,dialogElement:a}=Aa(),o=Yn(),c=t?String(t):"",[u,f]=y.useState(!1),h=(r==null?void 0:r.models)??[];async function m(v){try{await Se("/api/agent/brain",{method:"POST",body:JSON.stringify({model:v})}),n("Erledigt",`Hermes-Hirn zeigt jetzt auf das Alias '${v}'. Der Gateway-Dienst wurde neu gestartet.`),o.invalidateQueries({queryKey:Ve.agentStatus}),f(!1)}catch(b){n("Fehler",`Wechsel fehlgeschlagen: ${b.message||b}`)}}async function g(v){try{await Se("/api/agent/brain/set",{method:"POST",body:JSON.stringify({model_id:v})}),n("Erledigt","Agent-Hirn gewechselt (warm gehalten). Gateway wurde neugestartet."),o.invalidateQueries({queryKey:Ve.agentStatus}),o.invalidateQueries({queryKey:Ve.models}),f(!1)}catch(b){n("Fehler",`Wechsel fehlgeschlagen: ${b.message||b}`)}}return l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{className:"flex flex-col sm:flex-row justify-between sm:items-center gap-4",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Hermes Agenten-Cockpit"}),l.jsxs("p",{className:"text-sm text-muted-foreground",children:["Hermes ist ein autonomer Agent, der im Hintergrund der Box läuft (Port ",l.jsx("code",{children:":8642"}),") und seine eigene UI besitzt."]})]}),(e==null?void 0:e.terminal_url)&&l.jsxs("a",{href:Ks(e.terminal_url),target:"_blank",rel:"noopener",className:ee("flex h-9 px-4 items-center gap-1.5 text-xs font-semibold rounded-lg transition-all cursor-pointer shadow-md shrink-0 self-start",e.terminal_reachable?"bg-primary text-primary-foreground hover:opacity-90 shadow-primary/10":"border border-border/60 text-muted-foreground bg-background/20"),children:[l.jsx(Us,{className:"h-4 w-4"}),l.jsx("span",{children:"Terminal öffnen"})]})]}),c&&l.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400 font-mono",children:["Status nicht lesbar (",c,")."]}),e&&l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10",children:[l.jsxs("div",{className:"mb-4 flex items-center gap-2",children:[l.jsx(wn,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("span",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"Agent-Fluss"})]}),l.jsxs("div",{className:"flex flex-col lg:flex-row lg:items-stretch gap-3",children:[l.jsxs("button",{onClick:()=>e.terminal_reachable&&window.open(Ks(e.terminal_url),"_blank"),title:e.terminal_reachable?"Hermes-Terminal öffnen":"Terminal offline",className:"lg:w-40 shrink-0 rounded-xl border border-border/60 bg-background/30 p-3 text-left hover:border-primary/40 transition-all cursor-pointer flex flex-col justify-center",children:[l.jsxs("div",{className:"flex items-center gap-1.5",children:[l.jsx(uh,{className:ee("h-3.5 w-3.5",e.terminal_reachable?"text-emerald-400":"text-amber-500")}),l.jsx("span",{className:"text-xs font-semibold text-foreground",children:"Terminal"}),l.jsx("span",{className:ee("ml-auto h-1.5 w-1.5 rounded-full animate-pulse",e.terminal_reachable?"bg-emerald-500":"bg-amber-500")})]}),l.jsx("span",{className:"text-[10px] text-muted-foreground font-mono mt-0.5",children:"hermes chat · Clients"})]}),l.jsx("div",{className:"hidden lg:flex items-center text-muted-foreground text-lg select-none",children:"→"}),l.jsxs("div",{className:"flex-1 flex flex-col gap-2.5",children:[l.jsxs("div",{className:"rounded-xl border border-primary/40 bg-primary/5 px-3.5 py-2.5 flex items-center gap-2",children:[l.jsx(wn,{className:"h-3.5 w-3.5 text-primary"}),l.jsx("span",{className:"text-xs font-semibold text-primary",children:"Agent Gateway"}),l.jsx("span",{className:"text-[11px] font-mono text-muted-foreground",children:":8642"}),l.jsxs("span",{className:ee("ml-auto inline-flex items-center gap-1.5 text-[10px] font-bold uppercase font-mono px-2 py-0.5 rounded-full border",e.gateway_reachable?"bg-emerald-500/10 text-emerald-400 border-emerald-500/20":"bg-red-500/10 text-red-400 border-red-500/20"),children:[l.jsx("span",{className:ee("h-1.5 w-1.5 rounded-full",e.gateway_reachable?"bg-emerald-500 animate-pulse":"bg-red-500")}),e.gateway_reachable?"online":"offline"]})]}),l.jsxs("div",{className:"grid gap-2.5 sm:grid-cols-3",children:[l.jsxs("button",{onClick:()=>f(!0),className:"rounded-xl border border-border/60 bg-background/30 p-3 text-left hover:border-primary/45 transition-all cursor-pointer",children:[l.jsxs("div",{className:"flex items-center gap-1.5 text-muted-foreground",children:[l.jsx(Hn,{className:"h-3.5 w-3.5 text-primary"}),l.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider",children:"Hirn"}),l.jsx("span",{className:"ml-auto text-[9px] text-primary/70 font-bold uppercase",children:"wechseln →"})]}),l.jsx("div",{className:"text-[11px] font-mono font-medium text-foreground truncate mt-1",title:e.brain_model,children:e.brain_model||"chat"})]}),l.jsxs("div",{className:"rounded-xl border border-border/60 bg-background/30 p-3",children:[l.jsxs("div",{className:"flex items-center gap-1.5 text-muted-foreground",children:[l.jsx(Qu,{className:"h-3.5 w-3.5 text-primary"}),l.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider",children:"Verdrahtung"})]}),l.jsxs("div",{className:"text-[10px] font-mono mt-1 flex flex-wrap gap-x-2 text-muted-foreground",children:[l.jsxs("span",{children:["Config: ",e.has_config?"✓":"—"]}),l.jsxs("span",{children:["Skills: ",e.has_skills?"✓":"—"]}),l.jsxs("span",{children:["Memory: ",e.has_memories?"✓":"—"]})]})]}),l.jsxs("div",{className:"rounded-xl border border-border/60 bg-background/30 p-3",children:[l.jsxs("div",{className:"flex items-center gap-1.5 text-muted-foreground",children:[l.jsx(pw,{className:"h-3.5 w-3.5 text-primary"}),l.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider",children:"PC"}),l.jsx("span",{className:ee("ml-auto h-1.5 w-1.5 rounded-full",e.pc_executor_reachable?"bg-emerald-500 animate-pulse":"bg-amber-500")})]}),l.jsxs("div",{className:ee("text-[11px] font-mono mt-1",e.pc_executor_reachable?"text-emerald-400":"text-muted-foreground"),children:[":7777 ",e.pc_executor_reachable?"verbunden":"offline"]})]})]})]})]})]}),l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 space-y-4 shadow-lg shadow-black/10",children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(pw,{className:"h-5 w-5 text-primary"}),l.jsx("h3",{className:"text-sm font-bold uppercase tracking-wider text-foreground",children:"PC Verbindung"})]}),l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx("span",{className:ee("h-2 w-2 rounded-full",e.pc_executor_reachable?"bg-emerald-500 animate-pulse":"bg-amber-500")}),l.jsx("span",{className:"text-xs font-semibold text-foreground",children:e.pc_executor_reachable?"Erreichbar":"Nicht verbunden"})]})]}),l.jsxs("div",{className:"grid gap-6 md:grid-cols-2 text-xs text-muted-foreground leading-relaxed text-left",children:[l.jsxs("div",{className:"space-y-3",children:[l.jsxs("p",{children:["Der ",l.jsx("strong",{className:"text-foreground",children:"Hermes PC Executor"})," läuft auf ",l.jsx("code",{className:"text-foreground font-mono px-1 py-0.5 rounded bg-muted/40 border border-border/30",children:"192.168.178.98:7777"})," und ermöglicht Hermes den direkten Zugriff auf deinen Windows-PC — Shell-Befehle, Screenshots, Tastatureingaben."]}),l.jsxs("p",{children:["Hermes erreicht den PC über den MCP-Server ",l.jsx("code",{className:"text-foreground font-mono px-1 py-0.5 rounded bg-muted/40 border border-border/30",children:"hermes-pc-control"}),", der automatisch beim Gateway-Start verbunden wird."]})]}),l.jsx("div",{className:"space-y-3",children:e.pc_executor_reachable?l.jsxs("div",{className:"p-3.5 bg-emerald-500/5 border border-emerald-500/20 rounded-xl space-y-1",children:[l.jsxs("div",{className:"text-emerald-400 font-semibold text-xs flex items-center gap-1.5",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"}),"PC Executor verbunden"]}),l.jsxs("p",{className:"text-[10px]",children:["Hermes kann jetzt per Telegram oder Terminal Befehle auf TobisNicerPC ausführen. Nutze ",l.jsx("code",{className:"text-foreground",children:"pc_shell"}),", ",l.jsx("code",{className:"text-foreground",children:"pc_screenshot"})," oder ",l.jsx("code",{className:"text-foreground",children:"pc_open"}),"."]})]}):l.jsxs("div",{className:"space-y-2",children:[l.jsx("h4",{className:"text-xs font-bold text-foreground",children:"PC Executor starten"}),l.jsxs("p",{children:["Starte ",l.jsx("code",{className:"text-foreground font-mono",children:"start.bat"})," im Ordner ",l.jsx("code",{className:"text-foreground font-mono",children:"client\\hermes-pc\\"})," auf dem Windows-PC und lasse das Fenster offen."]}),l.jsx("div",{className:"p-3 bg-background/25 rounded-xl border border-border/30 font-mono text-[9px] text-cyan-300",children:"client\\hermes-pc\\start.bat"})]})})]})]}),!e.gateway_reachable&&l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 space-y-4 shadow-lg shadow-black/10 text-left",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(ws,{className:"h-5 w-5 text-amber-500"}),l.jsx("h3",{className:"text-sm font-bold uppercase tracking-wider text-foreground",children:"Hermes-Agent Diagnostics"})]}),l.jsxs("div",{className:"text-xs text-muted-foreground space-y-3 leading-relaxed",children:[l.jsx("p",{children:"Der Hermes-Dienst ist auf der Box derzeit offline oder kann sich nicht mit dem lokalen llama-swap verbinden."}),l.jsxs("p",{children:["Stelle sicher, dass die systemd-Dienste auf der Box laufen. Du kannst den Status im ",l.jsx("strong",{children:"OS & Updates Drawer"})," prüfen und die Dienste bei Bedarf neu starten."]}),l.jsxs("div",{className:"p-3.5 bg-background/25 rounded-xl border border-border/30 font-mono text-[10px] space-y-1",children:[l.jsx("div",{className:"text-muted-foreground/60",children:"# Dienste manuell auf der Box prüfen:"}),l.jsx("div",{className:"text-primary",children:"systemctl --user status hermes-gateway"}),l.jsx("div",{className:"text-primary",children:"systemctl --user status hermes-terminal"})]}),l.jsxs("p",{children:["Weitere Einrichtungsdetails (Brain-Konfiguration, MCP-Kopplungen, SSH-Tunneling und Such-Engines) findest du in der Dokumentationsdatei:",l.jsx("code",{className:"ml-1 px-1.5 py-0.5 rounded bg-muted/40 text-foreground border border-border/30",children:"docs/HERMES_SETUP.md"}),"."]})]})]})]}),e&&u&&l.jsx("div",{className:"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm flex items-center justify-center p-4 overscroll-contain",role:"dialog","aria-modal":"true","aria-label":"Hermes-Hirn konfigurieren",children:l.jsxs("div",{className:"w-full max-w-md rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[l.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[l.jsxs("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary flex items-center gap-1.5",children:[l.jsx(Hn,{className:"h-4 w-4"}),l.jsx("span",{children:"Hermes-Hirn konfigurieren"})]}),l.jsx("button",{onClick:()=>f(!1),className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:l.jsx(Wn,{className:"h-4 w-4"})})]}),l.jsxs("div",{className:"space-y-1.5",children:[l.jsx("div",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground",children:"Lane / Gateway-Alias"}),l.jsx("div",{className:"flex flex-wrap gap-1.5",children:zX.map(v=>{const b=e.brain_model===v;return l.jsxs("button",{onClick:()=>m(v),className:ee("px-3 py-1.5 rounded-lg text-xs font-mono font-semibold border transition-all cursor-pointer flex items-center gap-1.5",b?"border-primary/40 bg-primary/10 text-primary":"border-border/30 bg-background/20 text-foreground hover:bg-accent"),children:[v,b&&l.jsx(sr,{className:"h-3.5 w-3.5"})]},v)})}),l.jsxs("p",{className:"text-[10px] text-muted-foreground/70",children:["Schlank & flexibel: das Hirn folgt dem Lane-Routing (z.B. ",l.jsx("code",{className:"text-primary",children:"chat"})," = fast↔heavy)."]})]}),l.jsxs("div",{className:"space-y-1.5",children:[l.jsx("div",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground",children:"Installiertes Modell (warm gehalten)"}),l.jsx("div",{className:"space-y-1.5 max-h-56 overflow-y-auto pr-1",children:h.map(v=>{var j;const b=v.role==="hermes";return l.jsxs("button",{onClick:()=>!b&&g(v.name),disabled:b||v.incomplete,className:ee("w-full text-left px-3 py-2.5 rounded-lg text-xs flex items-center justify-between font-mono border transition-all",b?"border-indigo-500/40 bg-indigo-500/10 text-indigo-300":v.incomplete?"border-border/20 bg-background/10 text-muted-foreground/50 cursor-not-allowed":"border-border/30 bg-background/20 text-foreground hover:bg-accent cursor-pointer"),children:[l.jsxs("div",{className:"flex flex-col min-w-0",children:[l.jsx("span",{className:"font-semibold truncate max-w-[280px]",children:(j=v.name.split("/").pop())==null?void 0:j.replace(/\.gguf$/i,"")}),l.jsxs("span",{className:"text-[9px] text-muted-foreground mt-0.5",children:[v.capabilities.params_b?`${v.capabilities.params_b}B`:"?"," · ",v.capabilities.tools!=="no"?"Tools ✓":"ohne Tools",v.role&&` · Rolle: ${v.role}`]})]}),b?l.jsxs("span",{className:"text-[9px] font-bold uppercase text-indigo-300 shrink-0 flex items-center gap-1",children:[l.jsx(sr,{className:"h-3.5 w-3.5"})," Aktiv"]}):l.jsx("span",{className:"text-[9px] font-bold uppercase text-primary/70 shrink-0",children:"Warm setzen →"})]},v.name)})})]}),l.jsxs("div",{className:"text-[10px] text-amber-400/80 flex items-start gap-1.5 border-t border-border/20 pt-2.5",children:[l.jsx("span",{children:"💡"}),l.jsxs("span",{children:["Für einen ",l.jsx("strong",{children:"Agenten"}),' sind Hermes-Modelle (natives Tool-Calling) meist die robustere Wahl. Neues Modell? Erst über „Modell-Manager → Modelle finden" laden.']})]})]})}),a]})}function FX(){const{data:e}=Oy(5e3),t=e!=null&&e.terminal_url?Ks(e.terminal_url):void 0,r=e==null?void 0:e.terminal_reachable;return l.jsxs("div",{className:"flex h-full flex-col gap-4",children:[l.jsxs("div",{className:"flex flex-wrap items-end justify-between gap-3",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text font-space text-2xl font-bold tracking-tight text-transparent",children:"Hermes Terminal"}),l.jsxs("p",{className:"flex items-center gap-2 text-sm text-muted-foreground",children:["Interaktiver Agent (",l.jsx("code",{className:"rounded bg-background/40 px-1 font-mono text-[11px] text-primary",children:"hermes chat"}),') mit Tools & PC-Steuerung — „mehr als Chatten".']})]}),l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsxs("span",{className:"flex items-center gap-1.5 text-[11px] font-medium text-muted-foreground",children:[l.jsx("span",{className:`h-2 w-2 rounded-full ${r?"bg-emerald-500 animate-pulse":"bg-amber-500"}`}),r?"online":"offline"]}),t&&l.jsxs("a",{href:t,target:"_blank",rel:"noopener",className:"flex h-8 items-center gap-1.5 rounded-lg border border-border/60 bg-background/20 px-3 text-xs font-semibold text-muted-foreground transition-all hover:border-primary/50 hover:text-foreground",children:[l.jsx(Us,{className:"h-3.5 w-3.5"})," In neuem Tab"]})]})]}),t?l.jsxs("div",{className:"relative min-h-[68vh] flex-1 overflow-hidden rounded-2xl border border-border/60 bg-black/50 shadow-lg shadow-black/25",children:[r===!1&&l.jsxs("div",{className:"absolute inset-0 z-10 flex flex-col items-center justify-center gap-3 bg-black/70 text-center",children:[l.jsx(bi,{className:"h-8 w-8 text-amber-400"}),l.jsx("div",{className:"text-sm font-semibold text-amber-300",children:"Terminal nicht erreichbar"}),l.jsxs("p",{className:"max-w-sm text-[11px] leading-normal text-muted-foreground",children:["Der ",l.jsx("code",{className:"font-mono text-primary",children:"hermes-terminal"}),"-Dienst (ttyd) läuft nicht. Auf der Box: ",l.jsx("code",{className:"font-mono",children:"systemctl --user restart hermes-terminal"}),"."]})]}),l.jsx("iframe",{src:t,title:"Hermes Terminal",className:"h-full w-full border-0",style:{minHeight:"68vh"}})]}):l.jsxs("div",{className:"flex min-h-[68vh] flex-1 items-center justify-center rounded-2xl border border-border/60 bg-background/20 text-xs text-muted-foreground",children:[l.jsx(IN,{className:"mr-2 h-4 w-4"})," Lade Terminal…"]})]})}const eN=[{id:"grundlagen",label:"Grundlagen"},{id:"moe",label:"MoE & Quant"},{id:"lokal",label:"Lokal betreiben"},{id:"modelle",label:"Modell-Landschaft"},{id:"gateway",label:"Gateway-Trick"},{id:"mcp",label:"MCP"},{id:"skills",label:"Skills"},{id:"memory",label:"Gedächtnis & RAG"},{id:"agents",label:"Agenten"},{id:"ide",label:"IDE anbinden"},{id:"tricks",label:"Tricks & Kniffe"},{id:"wartung",label:"Sicherheit & Wartung"},{id:"ressourcen",label:"Ressourcen"},{id:"troubleshooting",label:"Troubleshooting"}];function BX(e){var t;(t=document.getElementById(e))==null||t.scrollIntoView({behavior:"smooth",block:"start"})}function Rr({id:e,icon:t,color:r,title:n,kicker:a,children:o,wide:c}){return l.jsxs("section",{id:e,className:ee("scroll-mt-20 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 shadow-lg shadow-black/10 space-y-3",c&&"md:col-span-2"),children:[l.jsxs("div",{className:"flex items-center gap-2.5 border-b border-border/20 pb-3",children:[l.jsx(t,{className:ee("h-5 w-5 shrink-0",r)}),l.jsxs("div",{children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:n}),a&&l.jsx("span",{className:ee("text-[9px] font-mono",r),children:a})]})]}),l.jsx("div",{className:"text-xs text-muted-foreground space-y-2.5 leading-relaxed",children:o})]})}function Va({children:e}){return l.jsxs("div",{className:"mt-1 rounded-xl border border-primary/25 bg-primary/[0.06] p-3 text-[11px] leading-relaxed",children:[l.jsxs("div",{className:"flex items-center gap-1.5 font-bold text-primary mb-1",children:[l.jsx(ys,{className:"h-3 w-3"})," Bei dir konkret"]}),l.jsx("div",{className:"text-muted-foreground space-y-1",children:e})]})}function ze({children:e}){return l.jsx("code",{className:"rounded bg-background/40 border border-border/30 px-1.5 py-0.5 font-mono text-[10px] text-foreground",children:e})}function kt({href:e,name:t,note:r}){return l.jsxs("li",{className:"leading-relaxed",children:[l.jsxs("a",{href:e,target:"_blank",rel:"noopener",className:"text-primary hover:underline font-semibold inline-flex items-center gap-0.5",children:[t,l.jsx(G3,{className:"h-3 w-3 opacity-60"})]}),l.jsxs("span",{className:"text-muted-foreground",children:[" — ",r]})]})}function UX(){const[e,t]=y.useState(!1);return l.jsxs("div",{className:"space-y-7",children:[l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 shadow-lg shadow-black/10 flex items-start gap-4",children:[l.jsx("div",{className:"h-11 w-11 rounded-xl bg-primary/15 flex items-center justify-center shrink-0",children:l.jsx(sv,{className:"h-6 w-6 text-primary"})}),l.jsxs("div",{className:"space-y-1",children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Die AI-Bibel"}),l.jsxs("p",{className:"text-sm text-muted-foreground leading-relaxed max-w-2xl",children:["Allgemeines Nachschlagewerk für lokale & agentische AI — Konzepte, Tricks, Kniffe und kuratierte Quellen. ",l.jsx("span",{className:"font-semibold text-foreground",children:"Stand Juni 2026."})," ","Das meiste gilt überall; ",l.jsx("span",{className:"text-primary font-semibold",children:'„Bei dir konkret"'}),"-Kästen zeigen, was dein Stack daraus macht."]})]})]}),l.jsx("div",{className:"sticky top-0 z-10 -mx-1 px-1",children:l.jsx("div",{className:"rounded-xl border border-border/50 bg-card/70 backdrop-blur-xl p-2 shadow-lg shadow-black/20",children:l.jsxs("div",{className:"flex items-center gap-1.5 flex-wrap",children:[l.jsx(lv,{className:"h-3.5 w-3.5 text-primary ml-1 mr-0.5 shrink-0"}),(e?eN:eN.slice(0,9)).map(r=>l.jsx("button",{onClick:()=>BX(r.id),className:"rounded-lg px-2.5 py-1 text-[11px] font-semibold text-muted-foreground hover:text-primary hover:bg-primary/10 transition-colors cursor-pointer",children:r.label},r.id)),l.jsx("button",{onClick:()=>t(r=>!r),className:"rounded-lg px-2 py-1 text-[11px] font-semibold text-primary hover:bg-primary/10 transition-colors cursor-pointer",children:e?"weniger":"+ mehr"})]})})}),l.jsxs("div",{className:"grid gap-5 md:grid-cols-2",children:[l.jsxs(Rr,{id:"grundlagen",icon:Hn,color:"text-cyan-400",title:"1. Wie LLMs ticken",kicker:"Grundlagen",children:[l.jsxs("p",{children:["Ein LLM ist im Kern ein ",l.jsx("strong",{children:"Wahrscheinlichkeits-Rechner für das nächste Token"}),' (Wortteil). Es „weiß" nichts — es setzt fort, was statistisch am plausibelsten ist. Daraus folgt fast alles andere.']}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Tokens"})," sind die Einheit — ~¾ Wort. Ein- und Ausgabe werden in Tokens gezählt."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Kontextfenster"}),' = wie viele Tokens das Modell gleichzeitig „sehen" kann (Prompt + Antwort). Voll = Anfang fällt raus.']}),l.jsxs("li",{children:[l.jsx("strong",{children:"Parameter"})," = die trainierten Gewichte. Training ist einmalig, ",l.jsx("strong",{children:"Inferenz"})," ist jede Antwort."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Temperatur / Sampling"})," steuert Zufall: niedrig = deterministisch/präzise (Code), hoch = kreativ."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Halluzination"})," ist kein Bug, sondern die Kehrseite des Ratens. Gegenmittel: Grounding via Tools/RAG, Verifikation."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Reasoning-/Thinking-Modelle"}),' „denken" in unsichtbaren Tokens vor der Antwort — besser bei Logik, langsamer/teurer.']})]})]}),l.jsxs(Rr,{id:"moe",icon:ky,color:"text-violet-400",title:"2. MoE & Quantisierung",kicker:"Mehr Modell, weniger Last",children:[l.jsxs("p",{children:[l.jsx("strong",{children:"Mixture of Experts (MoE):"})," Statt für jedes Token das ganze Netz zu aktivieren, wählt ein",l.jsx("em",{children:" Router"})," nur ein paar spezialisierte ",l.jsx("em",{children:"Experts"}),' aus. So läuft ein 100B-Modell mit der aktiven Rechenlast eines viel kleineren (z.B. „122B total / 10B aktiv").']}),l.jsxs("p",{children:[l.jsx("strong",{children:"Quantisierung:"})," Gewichte von FP16 auf weniger Bits eindampfen — kleiner & schneller bei minimalem Qualitätsverlust. Faustregel:"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx(ze,{children:"Q8"})," nahezu verlustfrei, größter Footprint"]}),l.jsxs("li",{children:[l.jsx(ze,{children:"Q6_K"})," sehr gut, guter Mittelweg"]}),l.jsxs("li",{children:[l.jsx(ze,{children:"Q4_K_M"})," der Sweet-Spot für lokal — viel Modell pro GB"]})]}),l.jsxs(Va,{children:["VRAM/RAM ist die harte Grenze — ",l.jsx("strong",{children:"darum"})," ist beides hier zentral: MoE lässt 100B+ überhaupt laufen, Quant entscheidet, was reinpasst. Dein Line-up fährt durchweg ",l.jsx(ze,{children:"Q4_K_M"}),"/",l.jsx(ze,{children:"Q6_K"}),"."]})]}),l.jsxs(Rr,{id:"lokal",icon:ff,color:"text-emerald-400",title:"3. Lokal betreiben: Engines & Backends",kicker:"llama.cpp, vLLM & Co.",wide:!0,children:[l.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:[l.jsx("strong",{children:"Inference-Engines"})," — was die Modelle ausführt:"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"llama.cpp / GGUF"})," — der De-facto-Standard für lokal, CPU+GPU, läuft überall."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Ollama / LM Studio"})," — bequeme Wrapper mit One-Click-Downloads (LM Studio mit GUI)."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"vLLM / TGI"})," — Server-Engines für maximalen Durchsatz auf dicken GPUs."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"llama-swap"})," — Proxy, der ",l.jsx("em",{children:"mehrere"})," Modelle hinter ",l.jsx("em",{children:"einem"})," Port hält und je nach Anfrage automatisch ein-/aussattelt."]})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:[l.jsx("strong",{children:"GPU-Backends"})," — wie gerechnet wird:"]}),l.jsx("ul",{className:"list-disc pl-4 space-y-1",children:l.jsxs("li",{children:[l.jsx(ze,{children:"CUDA"})," NVIDIA · ",l.jsx(ze,{children:"ROCm"})," AMD · ",l.jsx(ze,{children:"Vulkan"})," herstellerübergreifend · ",l.jsx(ze,{children:"Metal"})," Apple"]})}),l.jsxs("p",{className:"pt-1",children:[l.jsx("strong",{children:"Begriffe, die immer wiederkommen:"})," Kontext (",l.jsx(ze,{children:"-c"}),"), Slots/Parallel, KV-Cache, Modell-TTL/Swap, ",l.jsx("strong",{children:"Speculative Decoding"})," (kleines Draft-Modell rät voraus → schneller)."]})]})]}),l.jsxs(Va,{children:["Deine Box hat eine AMD-APU (gfx1151). ",l.jsx("strong",{children:"Einschränkung & Trick:"})," dort schlägt ",l.jsx(ze,{children:"Vulkan/RADV"})," das offizielle ",l.jsx(ze,{children:"ROCm"})," bei Token-Generierung um ~12–22 % — darum läuft die Engine auf Vulkan.",l.jsx(ze,{children:"llama-swap"})," hält die Alltags-Hirne dauerwarm; ",l.jsx(ze,{children:"coder"})," nutzt Spec-Decoding."]})]}),l.jsxs(Rr,{id:"modelle",icon:lf,color:"text-sky-400",title:"4. Modell-Landschaft",kicker:"Stand Juni 2026",wide:!0,children:[l.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsx("p",{children:l.jsx("strong",{children:"Open-Weight (lokal nutzbar):"})}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Qwen"})," (Alibaba) — starke Allrounder + Coder + Vision, viele Größen/MoE."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Llama"})," (Meta), ",l.jsx("strong",{children:"Gemma"})," (Google), ",l.jsx("strong",{children:"Phi"})," (Microsoft) — solide Open-Familien."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"DeepSeek"}),", ",l.jsx("strong",{children:"Mistral/Mixtral"})," — kräftige MoE-/Reasoning-Modelle."]})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsx("p",{children:l.jsx("strong",{children:"Frontier (Cloud-API):"})}),l.jsx("ul",{className:"list-disc pl-4 space-y-1",children:l.jsxs("li",{children:[l.jsx("strong",{children:"Claude"})," (Anthropic), ",l.jsx("strong",{children:"GPT"})," (OpenAI), ",l.jsx("strong",{children:"Gemini"})," (Google) — die stärksten Allrounder, aber nicht lokal."]})}),l.jsxs("p",{className:"pt-1",children:[l.jsx("strong",{children:"Modellwahl nach Aufgabe:"})," schnelles Alltags-Hirn · großes Logik-Hirn für harte Tasks · dediziertes Code-Modell · multimodal für Bilder · Embedding-Modell fürs Gedächtnis."]})]})]}),l.jsx("p",{className:"text-[11px] italic",children:'Leaderboards (HF, LMArena) sind grobe Orientierung — der einzige Benchmark, der zählt, ist deine eigene Aufgabe. Vorsicht vor „Benchmaxxing".'}),l.jsxs(Va,{children:["Dein Line-up via llama-swap: ",l.jsx(ze,{children:"fast"})," (Alltag/Vision/MoE) · ",l.jsx(ze,{children:"heavy"})," (schwere Logik) ·",l.jsx(ze,{children:"coder"})," · ",l.jsx(ze,{children:"scout"})," · ",l.jsx(ze,{children:"vision"})," · ",l.jsx(ze,{children:"embed"})," (fürs Gedächtnis) ·",l.jsx(ze,{children:"hermes"})," (Agent-Hirn). Verwalten/tauschen im ",l.jsx("strong",{children:"Modell-Manager"}),"-Tab."]})]}),l.jsxs(Rr,{id:"gateway",icon:E4,color:"text-amber-400",title:"5. Der Gateway-Trick",kicker:"OpenAI-kompatibel = überall andocken",children:[l.jsxs("p",{children:["Fast jedes AI-Tool spricht heute das ",l.jsx("strong",{children:"OpenAI-Format"})," (",l.jsx(ze,{children:"/v1/chat/completions"}),"). Ein",l.jsx("strong",{children:" Gateway"})," davor gibt dir ",l.jsx("em",{children:"einen"})," Endpunkt für alles: zentrales Key-Management, Logging und transparentes ",l.jsx("strong",{children:"Routing"})," — der Client merkt nicht, welches Modell tatsächlich antwortet."]}),l.jsxs("p",{children:["Die ",l.jsx(ze,{children:"model:auto"}),'-Idee: du sagst „auto", das Gateway wählt das passende Modell je nach Anfrage und lädt es bei Bedarf.']}),l.jsxs(Va,{children:["Dein Gateway: ",l.jsx(ze,{children:"http://192.168.178.151:9001/v1"}),", Model ",l.jsx(ze,{children:"auto"}),", API-Key beliebig. Fertige Configs erzeugt dir der ",l.jsx("strong",{children:"Verbinden"}),"-Tab live — eine Wahrheit, kein Abtippen."]})]}),l.jsxs(Rr,{id:"mcp",icon:cf,color:"text-violet-400",title:"6. MCP — Werkzeuge für Agenten",kicker:"USB-C für AI-Tools",children:[l.jsxs("p",{children:["Das ",l.jsx("strong",{children:"Model Context Protocol"})," (offen, von Anthropic initiiert) standardisiert, wie ein AI-Client mit externen Tools & Datenquellen spricht. Ein ",l.jsx("strong",{children:"MCP-Server"})," bringt Fähigkeiten: Dateien, Web-Fetch, Git, Datenbanken, eigene APIs."]}),l.jsx("p",{children:"Statt für jeden Editor eigene Tools zu schreiben, bindet jeder MCP-fähige Agent denselben Server an."}),l.jsxs("div",{className:"flex items-start gap-1.5 rounded-xl border border-amber-500/25 bg-amber-500/[0.06] p-2.5 text-[11px]",children:[l.jsx(w4,{className:"h-3.5 w-3.5 text-amber-400 shrink-0 mt-0.5"}),l.jsxs("span",{children:[l.jsx("strong",{children:"Sicherheit:"})," ein MCP-Server hat echten Zugriff (Dateien, Shell). Nur vertrauenswürdige Server laufen lassen, Rechte minimal halten, Quelle prüfen."]})]})]}),l.jsxs(Rr,{id:"skills",icon:O4,color:"text-emerald-400",title:"7. Agent Skills",kicker:"Wiederverwendbare Fähigkeiten",children:[l.jsxs("p",{children:["Ein ",l.jsx("strong",{children:"Skill"})," ist ein Ordner mit einer ",l.jsx(ze,{children:"SKILL.md"})," (YAML-Kopf + Anleitung, optional Skripte/Beispiele), den der Agent für eine bestimmte Aufgabe lädt — z.B. TDD, Code-Vereinfachung, API-Design."]}),l.jsx("pre",{className:"p-2.5 bg-background/25 rounded-lg border border-border/30 font-mono text-[9px] text-foreground overflow-x-auto whitespace-pre",children:`--- +name: tdd-pro +description: Treibt Entwicklung mit strikter TDD-Praxis +--- +# Instructions +...`}),l.jsxs("p",{children:["Suchen & installieren über die ",l.jsx("strong",{children:"skills.sh"}),"-Registry: ",l.jsx(ze,{children:"npx skills find"})," /",l.jsx(ze,{children:"npx skills add owner/repo"}),". Skills liegen projektweit (vom Agent beim Start gelesen) oder global."]})]}),l.jsxs(Rr,{id:"memory",icon:s4,color:"text-indigo-400",title:"8. Gedächtnis & RAG",kicker:"Modelle vergessen — du nicht",wide:!0,children:[l.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:["LLMs sind ",l.jsx("strong",{children:"zustandslos"}),": ohne Hilfe weiß das Modell beim nächsten Turn nichts mehr. Gedächtnis lebt extern."]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Embeddings"})," wandeln Text in Vektoren; ein ",l.jsx("strong",{children:"Vektor-Store"})," (Chroma, …) findet semantisch Ähnliches."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"RAG"})," = relevante Fakten vor dem Turn heraussuchen und einblenden statt alles im Prompt zu halten."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Long-Context vs. RAG:"}),' riesige Fenster sind bequem, aber teuer & „lost in the middle" — gezieltes Abrufen skaliert besser.']})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:[l.jsx("strong",{children:"Auto-lernendes Gedächtnis"})," ist die nächste Stufe:"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:["extrahiert Fakten ",l.jsx("em",{children:"selbst"})," aus Gesprächen, statt nur abzuspeichern"]}),l.jsx("li",{children:"dedupliziert semantisch (kein 10× derselbe Fakt)"}),l.jsxs("li",{children:[l.jsx("strong",{children:"Graph-Sicht"})," = Fakten ",l.jsx("em",{children:"plus"})," ihre Beziehungen, nicht nur eine flache Liste"]})]})]})]}),l.jsxs(Va,{children:["Dein Gedächtnis (Tab ",l.jsx("strong",{children:"Gedächtnis"}),") ist ",l.jsx("strong",{children:"Mem0"}),"-basiert: auto-lernend & semantisch, ",l.jsx("strong",{children:"graph-first"})," dargestellt, mit 4-Typen-Taxonomie (",l.jsx(ze,{children:"Identität"})," · ",l.jsx(ze,{children:"Wissen"})," · ",l.jsx(ze,{children:"Regeln"})," · ",l.jsx(ze,{children:"Ereignisse"}),"). Einstieg über ein kurzes ",l.jsx("strong",{children:"Hermes-Onboarding-Gespräch"})," im Terminal — der Agent lernt im Hintergrund nach jedem Turn.",l.jsx("br",{}),l.jsx("strong",{children:"Gotcha:"})," ein gelöschter Fakt kann wieder auftauchen, solange die Original-Nachricht noch im Verlauf steht (additive Extraktion)."]})]}),l.jsxs(Rr,{id:"agents",icon:wn,color:"text-rose-400",title:"9. Autonome Agenten betreiben",kicker:"LLM in der Schleife",wide:!0,children:[l.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:["Ein ",l.jsx("strong",{children:"Agent"})," ist ein LLM in einer Schleife mit Tools:",l.jsx("em",{children:" denken → Tool aufrufen → Ergebnis beobachten → weiter"}),", bis das Ziel erreicht ist."]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Guardrails"})," (Hard-Stop, Tool-Limits) verhindern Endlos-Loops, wenn ein Tool fehlt oder hängt."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Kontext-Hygiene"})," ist die wichtigste Disziplin: frische Sessions starten — vollgemüllte Historien werden langsam, driften und halluzinieren."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Kanäle:"})," CLI/Terminal, Chat-UI, Messaging (z.B. Telegram), reine API."]})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:[l.jsx("strong",{children:"Least Privilege:"})," gib einem Agenten nur die Tools, die er wirklich braucht. Kritische Aktionen (Shell auf dem Host, Löschen, Geld/Deploys) hinter menschliche Freigabe."]}),l.jsxs("p",{children:[l.jsx("strong",{children:"Was sich vollautomatisch lohnt:"})," Modell-Routing, Hintergrund-Gedächtnis, Recherche. ",l.jsx("strong",{children:"Was Freigabe braucht:"})," Systembefehle, Updates/Reboots, permanentes Löschen."]})]})]}),l.jsxs(Va,{children:[l.jsx("strong",{children:"Hermes"})," ist dein Box-Agent (Hirn = ",l.jsx(ze,{children:"fast"}),"). Reden tust du mit ihm im",l.jsx("strong",{children:" Terminal"}),"-Tab (Web-Terminal via ttyd) oder per ",l.jsx("strong",{children:"Telegram"}),". Er hat MCP-Server für Gedächtnis, Stack-Steuerung, Web-Fetch und ",l.jsx("strong",{children:"PC-Steuerung"})," (Executor auf deinem Windows-PC). Status & Verdrahtung im ",l.jsx("strong",{children:"Hermes"}),"-Tab."]})]}),l.jsxs(Rr,{id:"ide",icon:Fs,color:"text-cyan-400",title:"10. IDE / Editor anbinden",kicker:"Vibe-Coding lokal",children:[l.jsxs("p",{children:["Jede ",l.jsx("strong",{children:"OpenAI-kompatible"})," IDE oder Extension lässt sich auf einen lokalen Server umbiegen — Base-URL + Model eintragen, fertig:"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Cline"})," & ",l.jsx("strong",{children:"Roo Code"})," (VS-Code-Extensions, voller Agent + MCP)"]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Cursor"})," (VS-Code-Fork mit Top-Autocomplete)"]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Continue"}),", ",l.jsx("strong",{children:"aider"})," (CLI), ",l.jsx("strong",{children:"OpenCode"})," (Desktop)"]})]}),l.jsxs(Va,{children:["Tipp den Kram nicht ab: der ",l.jsx("strong",{children:"Verbinden"}),"-Tab generiert die fertige Config (inkl. MCP-Gedächtnis) pro Tool zum Kopieren. Essenz: Base ",l.jsx(ze,{children:"…:9001/v1"}),", Model ",l.jsx(ze,{children:"auto"}),", Key beliebig."]})]}),l.jsx(Rr,{id:"tricks",icon:x4,color:"text-amber-400",title:"11. Tricks & Kniffe",kicker:"Was im Alltag wirklich spart",wide:!0,children:l.jsx("div",{className:"grid md:grid-cols-3 gap-3",children:[["Kontext sauber halten","Neue Session statt Mega-Historie. Drift, Tempo und Halluzination hängen direkt am Kontext-Müll."],["Plan-then-Act","Erst Plan/Vorgehen bestätigen lassen, dann ausführen. Spart teure Holzwege."],["Gezielte Edits","Nie ganze Dateien überschreiben für eine Zeile — Such-/Ersetz-Tools nutzen. Weniger Tokens, weniger Fehler."],["Non-interaktive Befehle","Keine interaktiven Prompts im Agent-Terminal; lange Tasks als Background-Job. Sonst hängt der Loop."],["DevTools koppeln","Browser-/Konsolen-Zugriff geben — der Agent liest echte Fehler statt blind zu raten."],["Richtige Modellwahl","Schnelles Hirn für Alltag, großes für harte Logik, Coder fürs Coden. Nicht alles mit der Kanone."],["Akzeptanzkriterien","Sag konkret, woran „fertig“ erkennbar ist. Vage Prompts → vage Ergebnisse."],["Verifizieren statt vertrauen","Tests/Live-Check fordern. „Sollte funktionieren“ ist kein Beweis."],["Regeln ins Gedächtnis","Wiederkehrende Vorlieben/Konventionen einmal ablegen — der Agent zieht sie selbst."]].map(([r,n])=>l.jsxs("div",{className:"space-y-1 p-3 bg-background/10 rounded-xl border border-border/30",children:[l.jsxs("div",{className:"flex items-center gap-1.5 font-bold text-foreground text-[11px]",children:[l.jsx(xa,{className:"h-3 w-3 text-amber-400"})," ",r]}),l.jsx("p",{className:"text-[11px]",children:n})]},r))})}),l.jsx(Rr,{id:"wartung",icon:ws,color:"text-emerald-400",title:"12. Sicherheit & Wartung",kicker:"Damit's auch morgen noch läuft",wide:!0,children:l.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{className:"flex items-center gap-1.5 font-bold text-foreground",children:[l.jsx(_N,{className:"h-3.5 w-3.5 text-emerald-400"})," Goldene Regeln"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Ein ungetesteter Restore ist kein Backup."})," Wiederherstellung mindestens einmal echt durchspielen."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Updates können Dinge still zerschießen"})," — gerade bei AI-Stacks (Embeddings, Provider-Interna). Versionen pinnen, Smoke-Test, Post-Check."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Least Privilege"})," für Agenten, MCP-Server und PC-Zugriff. Kritisches hinter Freigabe."]})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{className:"flex items-center gap-1.5 font-bold text-foreground",children:[l.jsx(Qu,{className:"h-3.5 w-3.5 text-emerald-400"})," Bei dir im SystemDrawer"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Backup:"})," tägliches Voll-Zustands-Backup, getesteter ",l.jsx(ze,{children:"restore.sh"})," (Doku in ",l.jsx(ze,{children:"docs/BACKUP.md"}),")."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Updates:"})," git-basierter Update-Check; ",l.jsx("strong",{children:"Hermes-Update-Button"})," mit anschließendem ",l.jsx("strong",{children:"Gehirn-Check"})," (rot, falls das Update das Gedächtnis zerschießt) + Engine-Update."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Dienste & Gefahrenzone:"})," Restart/Logs pro Dienst, kritische Eingriffe getrennt."]})]}),l.jsx("p",{className:"text-[10px] italic",children:'Erreichbar über das System-Icon → Tab „Wartung".'})]})]})}),l.jsxs("section",{id:"ressourcen",className:"scroll-mt-20 md:col-span-2 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 shadow-lg shadow-black/10 space-y-4",children:[l.jsxs("div",{className:"flex items-center gap-2.5 border-b border-border/20 pb-3",children:[l.jsx(lv,{className:"h-5 w-5 text-primary"}),l.jsxs("div",{children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"13. Kuratierte Ressourcen & Links"}),l.jsx("span",{className:"text-[9px] font-mono text-primary",children:"Sauber geordnet — die guten Quellen"})]})]}),l.jsxs("div",{className:"grid md:grid-cols-2 gap-5 text-xs",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"font-bold text-foreground flex items-center gap-1.5",children:[l.jsx(lf,{className:"h-3.5 w-3.5 text-sky-400"})," Modelle & Engines"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1.5",children:[l.jsx(kt,{href:"https://huggingface.co/models",name:"Hugging Face",note:"das Repository für offene Modelle (GGUF, Embeddings, Datasets)."}),l.jsx(kt,{href:"https://github.com/ggml-org/llama.cpp",name:"llama.cpp",note:"die Referenz-Engine für lokale Inferenz."}),l.jsx(kt,{href:"https://github.com/mostlygeek/llama-swap",name:"llama-swap",note:"mehrere Modelle hinter einem Port, Auto-Swap."}),l.jsx(kt,{href:"https://ollama.com",name:"Ollama",note:"einfachster Einstieg, One-Command-Modelle."}),l.jsx(kt,{href:"https://lmstudio.ai",name:"LM Studio",note:"lokale GUI zum Stöbern, Laden & Chatten."}),l.jsx(kt,{href:"https://github.com/vllm-project/vllm",name:"vLLM",note:"Hochdurchsatz-Serving auf dicken GPUs."})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"font-bold text-foreground flex items-center gap-1.5",children:[l.jsx(cf,{className:"h-3.5 w-3.5 text-violet-400"})," MCP & Skills"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1.5",children:[l.jsx(kt,{href:"https://modelcontextprotocol.io",name:"MCP — offizielle Doku",note:"Spezifikation & Einstieg."}),l.jsx(kt,{href:"https://github.com/modelcontextprotocol/servers",name:"Offizielle MCP-Server",note:"filesystem, git, postgres, fetch & mehr."}),l.jsx(kt,{href:"https://smithery.ai",name:"Smithery",note:"Registry zum Suchen & Auto-Installieren von MCP-Servern."}),l.jsx(kt,{href:"https://glama.ai/mcp/servers",name:"Glama MCP Registry",note:"kuratierte Community-Datenbank."}),l.jsx(kt,{href:"https://skills.sh",name:"skills.sh",note:"Registry & CLI für Agent-Skills."})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"font-bold text-foreground flex items-center gap-1.5",children:[l.jsx(wn,{className:"h-3.5 w-3.5 text-rose-400"})," Agenten & Frameworks"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1.5",children:[l.jsx(kt,{href:"https://github.com/NousResearch/hermes-agent",name:"Hermes Agent (Nous)",note:"der Agent, der auf deiner Box läuft."}),l.jsx(kt,{href:"https://docs.claude.com",name:"Anthropic / Claude Docs",note:"API, Tool-Use, Agent SDK, MCP."}),l.jsx(kt,{href:"https://github.com/cline/cline",name:"Cline",note:"autonomer Coding-Agent für VS Code."}),l.jsx(kt,{href:"https://aider.chat",name:"aider",note:"AI-Pair-Programming im Terminal, git-nativ."}),l.jsx(kt,{href:"https://continue.dev",name:"Continue",note:"Open-Source-Autopilot für IDEs."})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"font-bold text-foreground flex items-center gap-1.5",children:[l.jsx(sv,{className:"h-3.5 w-3.5 text-amber-400"})," Lernen & Community"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1.5",children:[l.jsx(kt,{href:"https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/overview",name:"Prompt-Engineering (Anthropic)",note:"die beste praktische Anleitung."}),l.jsx(kt,{href:"https://github.com/anthropics/anthropic-cookbook",name:"Anthropic Cookbook",note:"lauffähige Rezepte für Tools, RAG, Agenten."}),l.jsx(kt,{href:"https://www.promptingguide.ai",name:"Prompt Engineering Guide",note:"herstellerneutrales Nachschlagewerk."}),l.jsx(kt,{href:"https://github.com/mem0ai/mem0",name:"Mem0",note:"die auto-lernende Memory-Schicht hinter deinem Gedächtnis."}),l.jsx(kt,{href:"https://www.reddit.com/r/LocalLLaMA/",name:"r/LocalLLaMA",note:"der Puls der lokalen-LLM-Szene."})]})]})]})]}),l.jsx(Rr,{id:"troubleshooting",icon:y4,color:"text-rose-400",title:"14. Troubleshooting",kicker:"Wenn's hakt",wide:!0,children:l.jsxs("ul",{className:"space-y-2 list-disc pl-4",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Keine Verbindung?"})," Selbes LAN wie die Box? IP/Port stimmen (",l.jsx(ze,{children:":9001"}),")? Backend-Status in der ",l.jsx("strong",{children:"Zentrale"})," prüfen."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Modell antwortet nicht / langsam?"})," In der ",l.jsx("strong",{children:"Zentrale → Dienste"})," schauen, ob ",l.jsx(ze,{children:"llama-swap"})," grün ist; sonst Restart. Erstes Token nach Swap dauert (Modell lädt)."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Agent dreht durch / halluziniert?"})," Frische Session im ",l.jsx("strong",{children:"Terminal"})," starten — meist ist es vollgemüllter Kontext."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Gedächtnis findet nichts?"})," Embedding-Dienst online? Semantisch suchen (Sinn statt exaktem Wort). Leeres Gedächtnis → Hermes-Onboarding starten."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Update hat etwas zerschossen?"})," Genau dafür gibt es Backup & ",l.jsx(ze,{children:"restore.sh"})," — den getesteten Restore fahren, dann Ursache suchen."]})]})})]}),l.jsx("p",{className:"text-center text-[10px] text-muted-foreground/50 pt-2",children:"Mission Control 2 · AI-Bibel · Stand Juni 2026 — lebendes Dokument, wächst mit dem Stack."})]})}function HX({title:e,hint:t}){return l.jsxs("div",{className:"space-y-4",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-xl font-semibold",children:e}),l.jsx("p",{className:"text-sm text-muted-foreground",children:t})]}),l.jsxs("div",{className:"flex flex-col items-center justify-center gap-3 rounded-xl border border-dashed border-border bg-card/50 py-20 text-center",children:[l.jsx(o4,{className:"h-8 w-8 text-muted-foreground"}),l.jsx("div",{className:"text-sm text-muted-foreground",children:"Kommt in einer späteren Phase."})]})]})}const tN=[{id:"mission-control-2",label:"Mission Control",type:"user",reach:"gateway (integr"},{id:"hermes-gateway",label:"Hermes Gateway",type:"user",reach:"hermes-gateway"},{id:"mem0-service",label:"Mem0 (Gedächtnis)",type:"user",reach:"mem0"},{id:"hermes-terminal",label:"Hermes Terminal",type:"user",reach:"hermes-terminal"},{id:"llama-swap",label:"Llama Swap",type:"system",reach:"llama-swap"}];function fu({icon:e,iconClass:t,name:r,status:n,available:a,busy:o,actionLabel:c,onAction:u}){return l.jsxs("div",{className:ee("flex items-center gap-3 rounded-lg border px-3 py-2",a?"border-amber-500/30 bg-amber-500/5":"border-border/50 bg-background/20"),children:[l.jsx(e,{className:ee("h-4 w-4 shrink-0",t)}),l.jsxs("div",{className:"flex-1 min-w-0",children:[l.jsx("div",{className:"text-xs text-foreground truncate",children:r}),l.jsx("div",{className:ee("text-[10px] truncate",a?"text-amber-400/90":"text-muted-foreground"),children:n})]}),l.jsx("button",{onClick:u,disabled:!a||o,className:ee("text-[11px] font-semibold rounded-lg px-2.5 py-1 transition-colors shrink-0",a?"bg-primary text-primary-foreground hover:opacity-90 cursor-pointer":"border border-border/50 text-muted-foreground/40 cursor-default"),children:o?"…":c})]})}function WX({label:e,ok:t,system:r,busy:n,onRestart:a,onLogs:o}){return l.jsxs("div",{className:"flex items-center gap-2.5 rounded-lg border border-border/50 bg-background/20 px-3 py-2",children:[l.jsx("span",{className:ee("w-1.5 h-1.5 rounded-full shrink-0",t===!0?"bg-emerald-500":t===!1?"bg-red-500":"bg-muted-foreground/40")}),l.jsxs("span",{className:"flex-1 text-xs text-foreground truncate",children:[e,r&&l.jsx("span",{className:"text-[9px] text-muted-foreground",children:" (root)"})]}),l.jsx("button",{onClick:a,disabled:n,title:"Neu starten",className:"text-muted-foreground hover:text-primary transition-colors disabled:opacity-50",children:l.jsx(Xa,{className:ee("h-3.5 w-3.5",n&&"animate-spin")})}),l.jsx("button",{onClick:o,title:"Logs ansehen",className:"text-muted-foreground hover:text-primary transition-colors",children:l.jsx(l4,{className:"h-3.5 w-3.5"})})]})}function Kg(e){return e==null?"":e>1024**3?`${(e/1024**3).toFixed(2)} GB`:`${(e/1024**2).toFixed(1)} MB`}function ZO({open:e,onClose:t,defaultTab:r="maintenance"}){var Ti;const[n,a]=y.useState(null),[o,c]=y.useState([]),[u,f]=y.useState("llama-swap"),[h,m]=y.useState(""),[g,v]=y.useState(!1),[b,j]=y.useState(null),[k,S]=y.useState({}),[N,E]=y.useState("maintenance"),[A,P]=y.useState(!1),[_,O]=y.useState(""),[D,U]=y.useState(!1),[B,F]=y.useState(null),[Y,H]=y.useState([]),[pe,ue]=y.useState(!1),[he,ae]=y.useState(null),[se,X]=y.useState(null);function te($,Le,cr){X({type:"alert",title:$,message:Le,onConfirm:()=>{X(null),cr&&cr()}})}function J($,Le,cr){X({type:"confirm",title:$,message:Le,onConfirm:()=>{X(null),cr()},onCancel:()=>X(null)})}function I($){return $?new Date($*1e3).toLocaleString("de-DE",{day:"2-digit",month:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}):"Nie"}const[M,K]=y.useState(""),[ne,Z]=y.useState(""),[me,ge]=y.useState(!1),[Pe,re]=y.useState(!1);y.useEffect(()=>{e&&(K(localStorage.getItem("mc_sudo_password")||""),Z(localStorage.getItem("mc_hf_token")||""))},[e]),y.useEffect(()=>{e&&r&&E(r)},[e,r]);const xe=y.useRef(null);function _e(){Se("/api/maintenance/updates").then(a).catch($=>console.error("Error loading updates",$))}function ie(){Se("/api/jobs").then($=>c($.jobs||[])).catch($=>console.error("Error loading jobs",$))}function Je(){Se("/api/system/services").then(F).catch(()=>{})}function Fe(){Se("/api/system/backups").then($=>H($.backups||[])).catch(()=>{})}function Oe($){v(!0),j(null),Se(`/api/maintenance/logs?service=${$}&lines=150`).then(Le=>{Le.ok?m(Le.text):(m(`Fehler beim Laden der Logs: ${Le.err||"Unbekannter Fehler"}`),(Le.status==="incorrect_password"||Le.status==="password_required")&&j(Le.status))}).catch(Le=>m(`Fehler: ${Le.message}`)).finally(()=>{v(!1),setTimeout(()=>{xe.current&&(xe.current.scrollTop=xe.current.scrollHeight)},50)})}y.useEffect(()=>{if(!e)return;_e(),ie(),Je(),Fe();const $=setInterval(()=>{ie(),_e(),Je()},3e3);return()=>clearInterval($)},[e]),y.useEffect(()=>{!e||N!=="logs"||Oe(u)},[e,N,u]);function ut($){return($==null?void 0:$.status)==="busy"?(te("Update läuft bereits",`Es läuft gerade „${$.running}". Bitte warte, bis es fertig ist.`),ie(),!0):!1}async function Jt(){try{const $=await Se("/api/maintenance/os-update",{method:"POST"});if(ut($))return;ie(),E("maintenance")}catch($){te("Fehler",`Fehler beim Starten des OS-Updates: ${$.message}`)}}async function W(){try{const $=await Se("/api/maintenance/engine-update",{method:"POST"});if(ut($))return;ie(),E("maintenance")}catch($){te("Fehler",`Fehler beim Engine-Update: ${$.message}`)}}async function ke(){try{const $=await Se("/api/maintenance/swap-update",{method:"POST"});if(ut($))return;ie(),E("maintenance")}catch($){te("Fehler",`Fehler beim Router-Update: ${$.message}`)}}async function Ae(){ue(!0);try{const $=await Se("/api/maintenance/hermes-update",{method:"POST"});if(ut($))return;ie()}catch($){te("Fehler",`Hermes-Update fehlgeschlagen: ${$.message}`)}finally{ue(!1)}}async function Be($){ae({kind:$,loading:!0,data:null});try{const Le=await Se(`/api/maintenance/update-details?kind=${$}`);ae({kind:$,loading:!1,data:Le})}catch(Le){ae({kind:$,loading:!1,data:{kind:$,error:Le.message}})}}function et(){const $=he==null?void 0:he.kind;ae(null),$==="os"?Jt():$==="engine"?W():$==="swap"?ke():$==="hermes"&&Ae()}async function Ut(){P(!0);try{await Se("/api/maintenance/check-updates",{method:"POST"}),ie(),E("maintenance")}catch($){te("Fehler",`Fehler bei der Update-Suche: ${$.message}`)}finally{P(!1)}}async function ht($,Le){try{await Se("/api/models/install",{method:"POST",body:JSON.stringify({repo:$,role:Le})}),te("Gestartet",`Modell-Upgrade für '${Le}' (${$}) gestartet.`),ie(),E("maintenance")}catch(cr){te("Fehler",`Fehler beim Starten des Modell-Upgrades: ${cr.message}`)}}async function ur(){J("Reboot bestätigen","Bist du sicher, dass du das gesamte Host-System neu starten willst?",async()=>{try{await Se("/api/maintenance/reboot",{method:"POST"}),te("Reboot","Reboot ausgelöst. System startet neu...",()=>{t()})}catch($){te("Fehler",`Fehler beim Reboot: ${$.message}`)}})}async function Ca(){U(!0),O("Snapshot wird erzeugt...");try{const $=await Se("/api/system/backup",{method:"POST"});O($.ok?`Snapshot erzeugt: ${$.snapshot} (${$.files.length} Komponenten)`:"Backup fehlgeschlagen."),Fe()}catch($){O(`Fehler: ${$.message}`)}finally{U(!1)}}async function Jn($){S(Le=>({...Le,[$]:!0}));try{const Le=await Se("/api/maintenance/restart",{method:"POST",body:JSON.stringify({service:$})});Le.ok?te("Dienst neu gestartet",`Dienst ${$} wurde erfolgreich neu gestartet.`,()=>{N==="logs"&&u===$&&Oe($)}):te("Fehler",`Fehler beim Neustart: ${Le.err||"Unbekannter Fehler"}`)}catch(Le){te("Fehler",`Fehler beim Neustart: ${Le.message}`)}finally{S(Le=>({...Le,[$]:!1}))}}async function Ii($){try{await Se(`/api/jobs/${$}/cancel`,{method:"POST"}),ie()}catch(Le){te("Fehler",`Fehler beim Abbrechen: ${Le.message}`)}}const Or=o.find($=>($.state==="running"||$.state==="queued")&&$.group==="maintenance");return l.jsxs(l.Fragment,{children:[l.jsx("div",{className:ee("fixed inset-0 bg-black/60 backdrop-blur-sm z-50 transition-opacity duration-300",e?"opacity-100 pointer-events-auto":"opacity-0 pointer-events-none"),onClick:t}),l.jsxs("div",{className:ee("fixed inset-y-0 right-0 w-full sm:w-[640px] bg-card/85 backdrop-blur-xl border-l border-border/60 shadow-2xl z-50 flex flex-col transform transition-transform duration-300 ease-in-out font-sans text-foreground",e?"translate-x-0":"translate-x-full"),children:[l.jsxs("div",{className:"flex h-16 shrink-0 items-center justify-between border-b border-border/40 px-6",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(Hn,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold tracking-wide uppercase font-space",children:"OS-Zentrale & Pflege"})]}),l.jsx("button",{onClick:t,className:"flex h-8 w-8 items-center justify-center rounded-lg border border-border/40 text-muted-foreground hover:bg-accent transition-colors",children:l.jsx(Wn,{className:"h-4 w-4"})})]}),l.jsxs("div",{className:"flex border-b border-border/40 px-6",children:[l.jsx("button",{onClick:()=>E("maintenance"),className:ee("flex-1 py-3 text-xs font-semibold uppercase tracking-wider border-b-2 text-center transition-all",N==="maintenance"?"border-primary text-primary":"border-transparent text-muted-foreground hover:text-foreground"),children:"System-Wartung"}),l.jsx("button",{onClick:()=>E("logs"),className:ee("flex-1 py-3 text-xs font-semibold uppercase tracking-wider border-b-2 text-center transition-all",N==="logs"?"border-primary text-primary":"border-transparent text-muted-foreground hover:text-foreground"),children:"System-Logs"}),l.jsx("button",{onClick:()=>E("settings"),className:ee("flex-1 py-3 text-xs font-semibold uppercase tracking-wider border-b-2 text-center transition-all",N==="settings"?"border-primary text-primary":"border-transparent text-muted-foreground hover:text-foreground"),children:"Einstellungen"})]}),l.jsxs("div",{className:"flex-1 overflow-y-auto p-6 space-y-6",children:[N==="maintenance"&&l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"space-y-2.5",children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Updates"}),l.jsxs("button",{onClick:Ut,disabled:A||!!Or,className:"flex items-center gap-1 text-[10px] font-semibold text-primary hover:text-primary/80 transition-colors disabled:opacity-50",children:[l.jsx(Xa,{className:ee("h-3 w-3",A&&"animate-spin")})," Nach Updates suchen"]})]}),(n==null?void 0:n.last_check)&&l.jsxs("div",{className:"text-[9px] text-muted-foreground -mt-1",children:["Zuletzt gesucht: ",I(n.last_check)]}),Or&&l.jsxs("div",{className:"flex items-center gap-2 rounded-lg border border-amber-500/30 bg-amber-500/10 px-3 py-2 text-[11px] text-amber-300",children:[l.jsx(Xa,{className:"h-3.5 w-3.5 shrink-0 animate-spin"}),l.jsxs("span",{children:["Update läuft: ",l.jsx("span",{className:"font-semibold",children:Or.label})," — bitte warten. Weitere Updates sind solange gesperrt."]})]}),l.jsxs("div",{className:"space-y-1.5",children:[l.jsx(fu,{icon:ws,iconClass:"text-cyan-400",name:"OS-Pakete (apt)",available:!!(n!=null&&n.os),status:n!=null&&n.os?`${n.os} verfügbar`:"aktuell",actionLabel:"Anzeigen",onAction:()=>Be("os")}),l.jsx(fu,{icon:ff,iconClass:"text-violet-400",name:"Inferenz-Engine (llama.cpp)",available:!!(n!=null&&n.engine),status:n!=null&&n.engine?"Update verfügbar":"aktuell",actionLabel:"Anzeigen",onAction:()=>Be("engine")}),l.jsx(fu,{icon:gw,iconClass:"text-fuchsia-400",name:"Router (llama-swap)",available:!!(n!=null&&n.swap),status:n!=null&&n.swap?"Update verfügbar":"aktuell",actionLabel:"Anzeigen",onAction:()=>Be("swap")}),(()=>{var Le;const $=(Le=n==null?void 0:n.components)==null?void 0:Le.find(cr=>cr.key==="hermes_agent");return l.jsx(fu,{icon:wn,iconClass:"text-amber-400",name:"Hermes-Agent",available:($==null?void 0:$.update)===!0,busy:pe,status:($==null?void 0:$.update)===!0?`Update: ${$.latest}`:($==null?void 0:$.reachable)===!1?"offline":"aktuell",actionLabel:"Anzeigen",onAction:()=>Be("hermes")})})(),(Ti=n==null?void 0:n.model_list)==null?void 0:Ti.map($=>l.jsx(fu,{icon:q3,iconClass:"text-emerald-400",name:`Modell · ${$.role}`,available:!0,status:$.title,actionLabel:"Upgrade",onAction:()=>ht($.repo,$.role)},$.role))]})]}),l.jsxs("div",{className:"space-y-2.5",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Dienste"}),l.jsx("div",{className:"space-y-1.5",children:tN.map($=>{var Le;return l.jsx(WX,{label:$.label,system:$.type==="system",ok:(Le=B==null?void 0:B.services.find(cr=>cr.name.toLowerCase().includes($.reach)))==null?void 0:Le.ok,busy:k[$.id],onRestart:()=>Jn($.id),onLogs:()=>{f($.id),E("logs")}},$.id)})})]}),l.jsxs("div",{className:"space-y-2.5",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Backup"}),l.jsxs("div",{className:"rounded-lg border border-border/50 bg-background/20 px-3 py-2.5 flex items-center gap-3",children:[l.jsxs("div",{className:"flex-1 min-w-0",children:[l.jsx("div",{className:"text-xs text-foreground truncate",children:Y[0]?`Letztes: ${Y[0].snapshot}`:"Noch kein Backup"}),l.jsxs("div",{className:"text-[10px] text-muted-foreground",children:[Y.length," Snapshots · Restore per CLI (restore.sh)"]})]}),l.jsxs("button",{onClick:Ca,disabled:D,className:"flex items-center gap-1.5 text-[11px] font-semibold rounded-lg px-2.5 py-1 bg-primary text-primary-foreground hover:opacity-90 transition-all cursor-pointer disabled:opacity-50 shrink-0",children:[l.jsx(X3,{className:ee("h-3.5 w-3.5",D&&"animate-pulse")})," Snapshot"]})]}),_&&l.jsx("div",{className:"text-[10px] font-mono text-primary bg-primary/5 p-2 rounded-lg border border-primary/20 break-all leading-normal",children:_})]}),l.jsxs("div",{className:"space-y-2.5",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-red-400/80",children:"Gefahrenzone"}),l.jsxs("button",{onClick:ur,className:"flex w-full items-center gap-3 p-3 rounded-lg border border-red-500/20 bg-red-500/5 hover:bg-red-500/10 text-red-400 transition-all text-left text-xs font-semibold",children:[l.jsx(P4,{className:"h-4.5 w-4.5"}),l.jsxs("div",{children:[l.jsx("div",{children:"Host-System neu starten"}),l.jsx("div",{className:"text-[10px] text-red-400/80 font-normal",children:"Startet die ganze Box neu"})]})]})]}),l.jsxs("div",{className:"space-y-3",children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Hintergrund-Aufgaben"}),l.jsxs("span",{className:"text-[10px] font-mono bg-primary/10 text-primary px-1.5 py-0.5 rounded-full",children:[o.filter($=>$.state==="running"||$.state==="queued").length," Aktiv"]})]}),l.jsx("div",{className:"space-y-3",children:o.length===0?l.jsx("div",{className:"text-xs text-muted-foreground border border-dashed border-border/60 rounded-xl p-6 text-center",children:"Aktuell keine aktiven Hintergrund-Jobs."}):o.map($=>{const Le=$.state==="running"||$.state==="queued";return l.jsxs("div",{className:ee("p-3 rounded-xl border transition-all duration-300",Le?"border-primary/40 bg-primary/5 shadow-md shadow-primary/5":"border-border/40 bg-background/20 opacity-80"),children:[l.jsxs("div",{className:"flex items-start justify-between gap-3",children:[l.jsxs("div",{className:"space-y-1",children:[l.jsxs("div",{className:"text-xs font-semibold flex items-center gap-1.5",children:[Le&&l.jsxs("span",{className:"flex h-2 w-2 relative",children:[l.jsx("span",{className:"animate-ping absolute inline-flex h-full w-full rounded-full bg-primary opacity-75"}),l.jsx("span",{className:"relative inline-flex rounded-full h-2 w-2 bg-primary"})]}),$.label]}),l.jsxs("div",{className:"text-[10px] font-mono text-muted-foreground uppercase flex items-center gap-2",children:[l.jsxs("span",{children:["ID: ",$.id]}),l.jsx("span",{children:"•"}),l.jsx("span",{className:ee($.state==="done"&&"text-emerald-400",$.state==="failed"&&"text-red-400",$.state==="running"&&"text-primary",$.state==="queued"&&"text-amber-400",$.state==="canceled"&&"text-muted-foreground"),children:$.state})]})]}),Le&&l.jsx("button",{onClick:()=>Ii($.id),className:"text-[10px] font-semibold text-red-400 hover:text-red-300 border border-red-500/20 bg-red-500/5 hover:bg-red-500/10 px-2 py-0.5 rounded transition-colors",children:"Abbrechen"})]}),$.state==="running"&&l.jsxs("div",{className:"mt-3 space-y-1",children:[l.jsx("div",{className:"w-full h-1.5 bg-muted rounded-full overflow-hidden",children:l.jsx("div",{className:"h-full bg-primary transition-all duration-500",style:{width:`${$.progress??0}%`}})}),l.jsxs("div",{className:"flex justify-between items-center text-[9px] font-mono text-muted-foreground",children:[l.jsxs("span",{children:[$.progress??0,"%"]}),$.done_bytes!=null&&$.total_bytes!=null&&l.jsxs("span",{children:[Kg($.done_bytes)," / ",Kg($.total_bytes),$.rate_bps!=null&&` (${Kg($.rate_bps)}/s)`]}),$.eta_s!=null&&l.jsxs("span",{children:["ETA: ",$.eta_s,"s"]})]})]})]},$.id)})})]})]}),N==="logs"&&l.jsxs("div",{className:"flex flex-col h-full space-y-4",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx("select",{value:u,onChange:$=>f($.target.value),className:"flex-1 h-9 px-3 text-xs bg-background/40 border border-border/60 rounded-lg outline-none text-foreground font-semibold",children:tN.map($=>l.jsxs("option",{value:$.id,children:[$.label," (",$.type==="system"?"systemd-root":"user",")"]},$.id))}),l.jsxs("button",{onClick:()=>Jn(u),disabled:k[u],className:"flex h-9 px-3 items-center gap-1.5 text-xs font-semibold rounded-lg border border-border/60 bg-background/20 hover:border-primary/50 transition-colors disabled:opacity-50",title:"Dienst neu starten",children:[l.jsx(Xa,{className:ee("h-3.5 w-3.5",k[u]&&"animate-spin")}),"Restart"]})]}),l.jsxs("div",{className:"flex-1 flex flex-col min-h-[300px] border border-border/60 bg-black/50 rounded-xl overflow-hidden shadow-inner",children:[l.jsxs("div",{className:"flex h-9 items-center justify-between px-4 border-b border-border/40 bg-black/30 shrink-0",children:[l.jsxs("div",{className:"flex items-center gap-1.5 text-[10px] font-mono text-muted-foreground",children:[l.jsx(TN,{className:"h-3 w-3 text-primary"}),l.jsxs("span",{children:["stdout/stderr - ",u]})]}),l.jsx("button",{onClick:()=>Oe(u),disabled:g,className:"text-muted-foreground hover:text-foreground transition-colors",children:l.jsx(Xa,{className:ee("h-3 w-3",g&&"animate-spin")})})]}),l.jsx("pre",{ref:xe,className:"flex-1 p-4 overflow-y-auto text-[10px] font-mono text-cyan-300/90 whitespace-pre-wrap select-text leading-relaxed scrollbar-thin",children:b==="password_required"||b==="incorrect_password"?l.jsxs("div",{className:"flex flex-col items-center justify-center p-6 text-center h-full space-y-3",children:[l.jsx(bi,{className:"h-8 w-8 text-amber-400 animate-pulse animate-duration-1000"}),l.jsx("div",{className:"text-xs font-semibold text-amber-300",children:b==="incorrect_password"?"Falsches Sudo-Passwort hinterlegt.":"Sudo-Passwort für systemd-Dienste erforderlich."}),l.jsxs("p",{className:"text-[10px] text-muted-foreground max-w-xs leading-normal",children:["Für das Auslesen der systemd-Logs von ",u," werden Root-Rechte benötigt. Hinterlege dein Passwort in den Einstellungen."]}),l.jsx("button",{onClick:()=>E("settings"),className:"px-3 py-1.5 text-[10px] font-semibold text-primary-foreground bg-primary hover:bg-primary/95 rounded-md transition-colors mt-2",children:"Sudo-Passwort eintragen"})]}):g&&!h?l.jsx("span",{className:"text-muted-foreground",children:"Lade Logs..."}):h||l.jsx("span",{className:"text-muted-foreground",children:"Keine Logeinträge vorhanden."})})]})]}),N==="settings"&&l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Zugangsdaten & Schlüssel"}),l.jsx("p",{className:"text-[10px] text-muted-foreground leading-normal",children:"Diese Daten werden ausschließlich lokal in deinem Browser (localStorage) gespeichert und bei Bedarf an das Backend übertragen."})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("label",{className:"text-xs font-semibold flex items-center gap-1.5",children:[l.jsx(ws,{className:"h-4 w-4 text-amber-400"}),"Host Sudo-Passwort"]}),l.jsxs("div",{className:"relative",children:[l.jsx("input",{type:me?"text":"password",value:M,onChange:$=>K($.target.value),"aria-label":"Host Sudo-Passwort",name:"sudo-password",autoComplete:"off",spellCheck:!1,placeholder:"Sudo-Passwort für System-Operationen",className:"w-full h-10 pl-3 pr-10 text-xs bg-background/40 border border-border/60 rounded-lg outline-none focus:border-primary transition-colors text-foreground"}),l.jsx("button",{type:"button",onClick:()=>ge(!me),"aria-label":me?"Passwort verbergen":"Passwort anzeigen",className:"absolute inset-y-0 right-0 flex items-center pr-3 text-muted-foreground hover:text-foreground transition-colors",children:me?l.jsx(hw,{className:"h-4 w-4","aria-hidden":"true"}):l.jsx(uf,{className:"h-4 w-4","aria-hidden":"true"})})]}),l.jsx("p",{className:"text-[9px] text-muted-foreground leading-normal",children:"Wird benötigt für systemd-Dienste (Llama Swap logs/restart), OS-Update (apt) und Reboot."})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("label",{className:"text-xs font-semibold flex items-center gap-1.5",children:[l.jsx(p4,{className:"h-4 w-4 text-violet-400"}),"HuggingFace API Token"]}),l.jsxs("div",{className:"relative",children:[l.jsx("input",{type:Pe?"text":"password",value:ne,onChange:$=>Z($.target.value),"aria-label":"HuggingFace API Token",name:"hf-token",autoComplete:"off",spellCheck:!1,placeholder:"hf_…",className:"w-full h-10 pl-3 pr-10 text-xs bg-background/40 border border-border/60 rounded-lg outline-none focus:border-primary transition-colors text-foreground"}),l.jsx("button",{type:"button",onClick:()=>re(!Pe),"aria-label":Pe?"Token verbergen":"Token anzeigen",className:"absolute inset-y-0 right-0 flex items-center pr-3 text-muted-foreground hover:text-foreground transition-colors",children:Pe?l.jsx(hw,{className:"h-4 w-4","aria-hidden":"true"}):l.jsx(uf,{className:"h-4 w-4","aria-hidden":"true"})})]}),l.jsx("p",{className:"text-[9px] text-muted-foreground leading-normal",children:"Erlaubt das Herunterladen von geschützten oder Gate-restricted Modellen direkt über Mission Control."})]}),l.jsxs("div",{className:"flex gap-3 pt-2",children:[l.jsx("button",{onClick:()=>{localStorage.setItem("mc_sudo_password",M),localStorage.setItem("mc_hf_token",ne),te("Erfolgreich","Einstellungen erfolgreich lokal gespeichert.")},className:"flex-1 h-9 flex items-center justify-center text-xs font-semibold text-primary-foreground bg-primary hover:bg-primary/90 rounded-lg transition-colors shadow shadow-primary/10 cursor-pointer",children:"Speichern"}),l.jsx("button",{onClick:()=>{K(""),Z(""),localStorage.removeItem("mc_sudo_password"),localStorage.removeItem("mc_hf_token"),te("Gelöscht","Zugangsdaten gelöscht.")},className:"h-9 px-4 flex items-center justify-center text-xs font-semibold text-muted-foreground border border-border/60 bg-background/20 hover:bg-accent rounded-lg transition-colors cursor-pointer",children:"Zurücksetzen"})]})]})]})]}),he&&(()=>{var mc;const $=he.data,Le={os:{icon:ws,cls:"text-cyan-400",title:"OS-Pakete (apt)"},engine:{icon:ff,cls:"text-violet-400",title:"Inferenz-Engine (llama.cpp)"},swap:{icon:gw,cls:"text-fuchsia-400",title:"Router (llama-swap)"},hermes:{icon:wn,cls:"text-amber-400",title:"Hermes-Agent"}}[he.kind],cr=Le.icon,hc=$?he.kind==="os"?($.count??0)===0:he.kind==="hermes"?($.behind??0)===0:$.installed_build!=null&&$.latest_build!=null&&$.latest_build<=$.installed_build:!0;return l.jsxs("div",{className:"fixed inset-0 z-[60] flex items-center justify-center p-4",children:[l.jsx("div",{className:"absolute inset-0 bg-black/70 backdrop-blur-sm",onClick:()=>ae(null)}),l.jsxs("div",{className:"relative w-full max-w-lg max-h-[80vh] flex flex-col rounded-2xl border border-border/60 bg-card shadow-2xl font-sans text-foreground",children:[l.jsxs("div",{className:"flex h-14 shrink-0 items-center justify-between border-b border-border/40 px-5",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(cr,{className:ee("h-4.5 w-4.5",Le.cls)}),l.jsx("h3",{className:"text-sm font-semibold",children:Le.title})]}),l.jsx("button",{onClick:()=>ae(null),className:"flex h-7 w-7 items-center justify-center rounded-lg border border-border/40 text-muted-foreground hover:bg-accent transition-colors",children:l.jsx(Wn,{className:"h-4 w-4"})})]}),l.jsx("div",{className:"flex-1 overflow-y-auto p-5 text-xs space-y-3 scrollbar-thin",children:he.loading?l.jsxs("div",{className:"flex h-24 items-center justify-center gap-2 text-muted-foreground",children:[l.jsx(Xa,{className:"h-4 w-4 animate-spin"})," Details werden geladen…"]}):$!=null&&$.error?l.jsx("div",{className:"rounded-lg border border-red-500/30 bg-red-500/5 p-3 text-red-400",children:$.error}):he.kind==="os"?(($==null?void 0:$.count)??0)===0?l.jsx("div",{className:"text-muted-foreground",children:"Keine Pakete zu aktualisieren — System ist aktuell."}):l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"text-muted-foreground",children:[$.count," Paket(e) werden aktualisiert:"]}),l.jsx("div",{className:"space-y-1",children:$.packages.map(_r=>l.jsxs("div",{className:"flex items-center justify-between gap-2 rounded-md border border-border/40 bg-background/30 px-2.5 py-1.5",children:[l.jsxs("span",{className:"flex items-center gap-1.5 font-mono text-[11px] truncate",children:[l.jsx(A4,{className:"h-3 w-3 text-cyan-400 shrink-0"}),_r.name]}),l.jsxs("span",{className:"flex items-center gap-1 font-mono text-[10px] text-muted-foreground shrink-0",children:[l.jsx("span",{children:_r.current}),l.jsx(sf,{className:"h-3 w-3"}),l.jsx("span",{className:"text-emerald-400",children:_r.candidate})]})]},_r.name))})]}):he.kind==="engine"||he.kind==="swap"?l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"flex items-center gap-2 font-mono text-[11px]",children:[l.jsxs("span",{className:"rounded-md border border-border/40 bg-background/30 px-2 py-1",children:["Build ",($==null?void 0:$.installed_build)??"?"]}),l.jsx(sf,{className:"h-3.5 w-3.5 text-muted-foreground"}),l.jsxs("span",{className:"rounded-md border border-emerald-500/30 bg-emerald-500/5 px-2 py-1 text-emerald-400",children:["Build ",($==null?void 0:$.latest_build)??"?"]})]}),(($==null?void 0:$.name)||($==null?void 0:$.latest_tag))&&l.jsxs("div",{className:"text-muted-foreground",children:["Release: ",l.jsx("span",{className:"text-foreground",children:$==null?void 0:$.name}),$!=null&&$.latest_tag?` (${$.latest_tag})`:""]}),($==null?void 0:$.url)&&l.jsxs("a",{href:$.url,target:"_blank",rel:"noreferrer",className:"inline-flex items-center gap-1 text-primary hover:underline",children:["Release-Notes auf GitHub ",l.jsx(Us,{className:"h-3 w-3"})]}),($==null?void 0:$.body)&&l.jsx("pre",{className:"whitespace-pre-wrap rounded-lg border border-border/40 bg-background/30 p-3 text-[10px] leading-relaxed text-muted-foreground max-h-60 overflow-y-auto scrollbar-thin",children:$.body})]}):(((mc=$==null?void 0:$.commits)==null?void 0:mc.length)??0)===0?l.jsx("div",{className:"text-muted-foreground",children:"Keine neuen Commits — Hermes-Agent ist bereits aktuell."}):l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"text-muted-foreground",children:[$.behind," neue Commit(s) auf ",l.jsxs("span",{className:"font-mono text-foreground",children:["origin/",$.branch]}),":"]}),l.jsx("div",{className:"space-y-1",children:$.commits.map(_r=>l.jsxs("div",{className:"flex items-start gap-2 rounded-md border border-border/40 bg-background/30 px-2.5 py-1.5",children:[l.jsx(d4,{className:"h-3.5 w-3.5 text-primary shrink-0 mt-0.5"}),l.jsxs("div",{className:"min-w-0",children:[l.jsx("div",{className:"text-[11px] truncate",children:_r.subject}),l.jsxs("div",{className:"font-mono text-[9px] text-muted-foreground",children:[_r.hash," · ",_r.when]})]})]},_r.hash))}),l.jsx("p",{className:"text-[10px] text-muted-foreground leading-normal",children:"Vor dem Update wird automatisch ein Backup erstellt; danach startet der Hermes-Gateway neu."})]})}),l.jsxs("div",{className:"flex gap-3 border-t border-border/40 p-4 shrink-0",children:[l.jsx("button",{onClick:()=>ae(null),className:"h-9 flex-1 rounded-lg border border-border/60 bg-background/20 text-xs font-semibold text-muted-foreground hover:bg-accent transition-colors cursor-pointer",children:"Schließen"}),l.jsx("button",{onClick:et,disabled:he.loading||hc||!!Or,title:Or?`Update läuft bereits: ${Or.label}`:void 0,className:"h-9 flex-1 rounded-lg bg-primary text-xs font-semibold text-primary-foreground hover:opacity-90 transition-all cursor-pointer disabled:opacity-40 disabled:cursor-default",children:Or?"Update läuft…":"Jetzt aktualisieren"})]})]})]})})(),se&&l.jsx(UO,{type:se.type,title:se.title,message:se.message,onConfirm:se.onConfirm,onCancel:se.onCancel})]})}function KX(){const{data:e}=vh(3e4),{data:t}=Ni(),r=((e==null?void 0:e.os)||0)+((e==null?void 0:e.engine)||0)+((e==null?void 0:e.swap)||0)+((e==null?void 0:e.models)||0),n=()=>window.dispatchEvent(new CustomEvent("open-system-drawer",{detail:{tab:"maintenance"}})),a=(t==null?void 0:t.models)??[],o=(t==null?void 0:t.running)??[],c=a.find(m=>m.role==="hermes"),u=a.find(m=>m.role==="coder-lite")||a.find(m=>m.role==="coder"),f=m=>m?o.includes(m):!1,h=m=>{var g;return((g=m==null?void 0:m.split("/").pop())==null?void 0:g.replace(/\.gguf$/i,""))||"—"};return l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Basisstation"}),l.jsx("p",{className:"text-sm text-muted-foreground",children:"Geht's der Box gut, gibt's Updates, was läuft gerade."})]}),l.jsx(VO,{frame:"box"}),l.jsxs("button",{onClick:n,className:ee("w-full flex items-center gap-3 rounded-2xl border p-4 text-left transition-all cursor-pointer",r>0?"border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/10":"border-border/60 bg-card/45 hover:border-primary/40"),children:[r>0?l.jsx(J3,{className:"h-6 w-6 shrink-0 text-amber-400"}):l.jsx(sr,{className:"h-6 w-6 shrink-0 text-emerald-400"}),l.jsxs("div",{className:"flex-1 min-w-0",children:[l.jsx("div",{className:ee("text-sm font-semibold",r>0?"text-amber-400":"text-foreground"),children:r>0?`${r} Update${r===1?"":"s"} verfügbar`:"Alles aktuell"}),l.jsx("div",{className:"text-xs text-muted-foreground",children:r>0?"Antippen, um zu sehen, was genau aktualisiert wird.":"Keine ausstehenden Updates."})]}),r>0&&l.jsxs("span",{className:"shrink-0 flex items-center gap-1 text-xs font-semibold text-amber-400",children:["Ansehen ",l.jsx(ch,{className:"h-4 w-4"})]})]}),l.jsxs("div",{children:[l.jsx("div",{className:"text-xs text-muted-foreground mb-2",children:"Was gerade läuft"}),l.jsx("div",{className:"rounded-2xl border border-border/60 overflow-hidden",children:[{icon:Hn,label:"Lucys Hirn",model:c==null?void 0:c.name,warm:f(c==null?void 0:c.name)},{icon:Fs,label:"Coder (Vibe-Coding)",model:u==null?void 0:u.name,warm:f(u==null?void 0:u.name)}].map(m=>l.jsxs("div",{className:"flex items-center gap-3 px-4 py-3 border-b border-border/40 last:border-0",children:[l.jsx("span",{className:ee("h-2 w-2 shrink-0 rounded-full",m.warm?"bg-emerald-500 animate-pulse":"bg-muted-foreground/40")}),l.jsx(m.icon,{className:"h-4 w-4 text-muted-foreground shrink-0"}),l.jsx("span",{className:"text-sm text-foreground w-40 shrink-0",children:m.label}),l.jsx("span",{className:"text-xs text-muted-foreground flex-1 truncate font-mono",children:h(m.model)}),l.jsx("span",{className:ee("text-xs shrink-0",m.warm?"text-emerald-400":"text-muted-foreground"),children:m.model?m.warm?"warm":"bereit":"nicht gesetzt"})]},m.label))})]}),l.jsxs("div",{className:"grid gap-6 lg:grid-cols-2",children:[l.jsx(BO,{}),l.jsx(HO,{})]}),l.jsx(WO,{})]})}function Gg({icon:e,title:t,sub:r,onClick:n}){return l.jsxs("button",{onClick:n,className:"w-full flex items-center gap-4 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 text-left transition-all hover:border-primary/40 cursor-pointer",children:[l.jsx(e,{className:"h-6 w-6 text-muted-foreground shrink-0"}),l.jsxs("div",{className:"flex-1 min-w-0",children:[l.jsx("div",{className:"text-sm text-foreground",children:t}),l.jsx("div",{className:"text-xs text-muted-foreground",children:r})]}),l.jsx(ch,{className:"h-5 w-5 text-muted-foreground shrink-0"})]})}function GX(){const[e,t]=y.useState(null);return e?l.jsxs("div",{className:"space-y-4",children:[l.jsxs("button",{onClick:()=>t(null),className:"flex items-center gap-1.5 text-xs font-semibold text-muted-foreground hover:text-foreground transition-colors cursor-pointer",children:[l.jsx(AN,{className:"h-4 w-4"})," Maschinenraum"]}),e==="modelle"?l.jsx(qO,{}):l.jsx(XO,{})]}):l.jsxs("div",{className:"space-y-4",children:[l.jsxs("div",{className:"flex items-start justify-between gap-3",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Maschinenraum"}),l.jsx("p",{className:"text-sm text-muted-foreground",children:"Nur nötig, wenn du wirklich was ändern willst."})]}),l.jsx(jE,{})]}),l.jsx(Gg,{icon:Hn,title:"Modelle",sub:"Hirne, Coder, Immer-bereit-Set, Bibliothek",onClick:()=>t("modelle")}),l.jsx(Gg,{icon:R4,title:"Wartung und Logs",sub:"Updates, Backup, Dienste, Logs, Zugangsdaten",onClick:()=>window.dispatchEvent(new CustomEvent("open-system-drawer",{detail:{tab:"maintenance"}}))}),l.jsx(Gg,{icon:wn,title:"Hermes und Verdrahtung",sub:"Agent, Gehirn-Modell, PC-Verbindung",onClick:()=>t("hermes")})]})}const VX=[{id:"start",label:"Start",icon:uh},{id:"vibe",label:"Vibe-Coding",icon:Fs},{id:"konstitution",label:"Konstitution",icon:V3},{id:"maschinenraum",label:"Maschinenraum",icon:Qu}];function qX(){const[e,t]=y.useState("start"),[r,n]=y.useState(!1),[a,o]=y.useState("maintenance"),{data:c}=Cy();y.useEffect(()=>{const f=h=>{var m;o(((m=h.detail)==null?void 0:m.tab)||"maintenance"),n(!0)};return window.addEventListener("open-system-drawer",f),()=>window.removeEventListener("open-system-drawer",f)},[]);const u=c&&c.engine_reachable&&(c.brain?c.brain.ready:!0);return l.jsxs("div",{className:"flex h-full relative",children:[l.jsx("div",{className:"fixed inset-0 -z-50 pointer-events-none overflow-hidden bg-[hsl(224,30%,6%)]",children:l.jsx("div",{className:"absolute inset-0 opacity-30 animate-aurora bg-gradient-to-tr from-teal-500/15 via-indigo-500/10 to-purple-500/15 blur-[130px]"})}),l.jsx(ZO,{open:r,onClose:()=>n(!1),defaultTab:a}),l.jsxs("aside",{className:"flex w-56 shrink-0 flex-col border-r border-border/40 bg-card/45 backdrop-blur-md",children:[l.jsxs("div",{className:"flex items-center gap-2 px-5 py-4 border-b border-border/40",children:[l.jsx("div",{className:"h-7 w-7 rounded-lg bg-primary shadow-md shadow-primary/20"}),l.jsxs("div",{className:"leading-tight",children:[l.jsx("div",{className:"text-sm font-semibold tracking-wide font-space",children:"Mission Control"}),l.jsx("div",{className:"text-[10px] text-muted-foreground",children:"3 · Prototyp"})]})]}),l.jsx("nav",{className:"flex-1 space-y-1 px-3 py-4",children:VX.map(f=>l.jsxs("button",{onClick:()=>t(f.id),className:ee("flex w-full items-center gap-3 rounded-md px-3 py-2 text-sm transition-all cursor-pointer",e===f.id?"bg-primary/15 text-primary":"text-muted-foreground hover:bg-accent hover:text-accent-foreground"),children:[l.jsx(f.icon,{className:"h-4.5 w-4.5 shrink-0"})," ",f.label]},f.id))}),l.jsxs("div",{className:"px-3 py-3 border-t border-border/40 space-y-2",children:[l.jsxs("div",{className:"flex items-center gap-2 px-2 text-xs text-muted-foreground",children:[l.jsx("span",{className:ee("h-2 w-2 rounded-full",u?"bg-emerald-500 animate-pulse":"bg-amber-500")}),u?"Box läuft":"prüfen"]}),l.jsxs("a",{href:"#dashboard",className:"flex items-center gap-1.5 rounded-md px-2 py-1.5 text-[11px] text-muted-foreground hover:text-foreground transition-colors",children:[l.jsx(AN,{className:"h-3.5 w-3.5"})," zurück zu MC2"]})]})]}),l.jsxs("main",{className:"flex-1 min-w-0 overflow-y-auto p-6 scrollbar-thin",children:[e==="start"&&l.jsx(KX,{}),e==="vibe"&&l.jsx(QO,{}),e==="konstitution"&&l.jsx(YO,{}),e==="maschinenraum"&&l.jsx(GX,{})]})]})}function QX(){var j,k,S,N,E;WD();const[e,t]=y.useState(()=>{const A=window.location.hash.slice(1);return mu.some(P=>P.id===A)?A:"dashboard"}),r=y.useCallback(A=>{window.location.hash.slice(1)===A?t(A):window.location.hash=A},[]),[n,a]=y.useState(()=>localStorage.getItem("mc_sidebar_collapsed")==="true"),[o,c]=y.useState(!1),[u,f]=y.useState("maintenance"),[h,m]=y.useState(()=>window.location.hash==="#mc3"),{data:g}=Cy(),{data:v}=Po(2e4);y.useEffect(()=>{document.documentElement.classList.add("dark")},[]),y.useEffect(()=>{const A=P=>{var O;f(((O=P.detail)==null?void 0:O.tab)||"maintenance"),c(!0)};return window.addEventListener("open-system-drawer",A),()=>window.removeEventListener("open-system-drawer",A)},[]),y.useEffect(()=>{const A=P=>{var O;const _=(O=P.detail)==null?void 0:O.view;_&&r(_)};return window.addEventListener("mc-navigate",A),()=>window.removeEventListener("mc-navigate",A)},[r]),y.useEffect(()=>{const A=()=>{m(window.location.hash==="#mc3");const P=window.location.hash.slice(1);mu.some(_=>_.id===P)&&t(P)};return window.addEventListener("hashchange",A),()=>window.removeEventListener("hashchange",A)},[]);const b=mu.find(A=>A.id===e);return h?l.jsx(qX,{}):l.jsxs("div",{className:"flex h-full relative",children:[l.jsxs("div",{className:"fixed inset-0 -z-50 pointer-events-none overflow-hidden bg-[hsl(224,30%,6%)]",children:[l.jsx("div",{className:"absolute inset-0 opacity-35 animate-aurora bg-gradient-to-tr from-teal-500/20 via-indigo-500/15 to-purple-500/20 blur-[130px]"}),l.jsx("div",{className:"absolute top-[-10%] left-[-10%] h-[50%] w-[50%] rounded-full bg-teal-500/15 blur-[160px]"}),l.jsx("div",{className:"absolute bottom-[-10%] right-[-10%] h-[50%] w-[50%] rounded-full bg-purple-500/15 blur-[160px]"}),l.jsx("div",{className:"absolute top-[30%] right-[20%] h-[40%] w-[40%] rounded-full bg-indigo-500/10 blur-[140px]"})]}),l.jsx(YT,{onNavigate:r}),l.jsx(ZO,{open:o,onClose:()=>c(!1),defaultTab:u}),l.jsxs("aside",{className:ee("flex shrink-0 flex-col border-r border-border/40 bg-card/45 backdrop-blur-md transition-all duration-300 ease-in-out",n?"w-16":"w-60"),children:[l.jsxs("div",{className:ee("flex items-center py-4 border-b border-border/40 shrink-0",n?"flex-col gap-3 px-2":"justify-between px-5"),children:[l.jsxs("div",{className:"flex items-center gap-2 overflow-hidden",children:[l.jsx("div",{className:"h-7 w-7 rounded-lg bg-primary shadow-md shadow-primary/20 shrink-0"}),!n&&l.jsxs("div",{className:"leading-tight",children:[l.jsx("div",{className:"text-sm font-semibold tracking-wide font-space",children:"Mission Control"}),l.jsx("div",{className:"text-xs text-muted-foreground",children:"2.0"})]})]}),l.jsx("button",{onClick:()=>{a(A=>{const P=!A;return localStorage.setItem("mc_sidebar_collapsed",P.toString()),P})},className:"p-1 rounded-md hover:bg-accent text-muted-foreground transition-colors cursor-pointer","aria-label":n?"Seitenleiste ausklappen":"Seitenleiste einklappen",title:n?"Maximieren":"Minimieren",children:n?l.jsx(ch,{className:"h-4 w-4","aria-hidden":"true"}):l.jsx(Z3,{className:"h-4 w-4","aria-hidden":"true"})})]}),l.jsx("nav",{className:"flex-1 space-y-1 px-3 py-4 overflow-y-auto",children:mu.map(A=>l.jsxs("a",{href:`#${A.id}`,"aria-current":e===A.id?"page":void 0,className:ee("flex w-full items-center rounded-md text-sm transition-all cursor-pointer",n?"justify-center p-2.5":"gap-3 px-3 py-2",e===A.id?"bg-primary/15 text-primary shadow-sm shadow-primary/5":"text-muted-foreground hover:bg-accent hover:text-accent-foreground"),title:n?A.label:void 0,"aria-label":n?A.label:void 0,children:[l.jsx(A.icon,{className:"h-4.5 w-4.5 shrink-0","aria-hidden":"true"}),!n&&l.jsx("span",{className:"truncate",children:A.label})]},A.id))}),l.jsx("div",{className:ee("py-3 text-xs text-muted-foreground border-t border-border/40 shrink-0",n?"px-2 text-center":"px-5"),children:n?l.jsx("div",{className:"flex justify-center",children:l.jsx("span",{className:ee("h-2.5 w-2.5 rounded-full ring-2 ring-black/40",g?g.engine_reachable?g.brain&&!g.brain.ready?"bg-amber-500 animate-pulse":"bg-emerald-500 animate-pulse":"bg-amber-500":"bg-red-500"),title:g?g.engine_reachable?g.brain&&!g.brain.ready?`Hirn offline (${g.brain.model??"fast"})`:"Engine + Hirn online":"Engine offline":"Backend offline"})}):l.jsxs("div",{className:"space-y-2 text-left",children:[g?l.jsxs(l.Fragment,{children:[l.jsxs("span",{className:"flex items-center gap-2",children:[l.jsx("span",{className:ee("h-2 w-2 rounded-full animate-pulse",g.engine_reachable?"bg-emerald-500":"bg-amber-500")}),l.jsxs("span",{className:"truncate",children:["Engine ",g.engine_reachable?"online":"offline"]})]}),g.brain&&!g.brain.ready&&l.jsxs("span",{className:"flex items-center gap-2 text-amber-400",title:`Agent-Hirn '${g.brain.model??"fast"}' lädt nicht/abgestürzt`,children:[l.jsx("span",{className:"h-2 w-2 rounded-full bg-amber-500 animate-pulse"}),l.jsxs("span",{className:"truncate",children:["Hirn offline",g.brain.model?` (${g.brain.model})`:""]})]})]}):l.jsxs("span",{className:"flex items-center gap-2",children:[l.jsx("span",{className:"h-2 w-2 rounded-full bg-red-500"})," ",l.jsx("span",{className:"truncate",children:"Backend offline"})]}),(v==null?void 0:v.versions)&&l.jsxs("div",{className:"space-y-1 text-[9px] text-muted-foreground/60 mt-2 pt-2 border-t border-border/30",children:[l.jsxs("div",{className:"truncate",title:v.versions.mc2?`${v.versions.mc2.branch}-${v.versions.mc2.hash}${v.versions.mc2.dirty?"*":""} (${v.versions.mc2.date})`:"nicht gefunden",children:[l.jsx("strong",{children:"MC2:"})," ",v.versions.mc2?`${v.versions.mc2.hash}${v.versions.mc2.dirty?"*":""}`:"—"]}),l.jsxs("div",{className:"truncate",title:((j=v.versions.engine)==null?void 0:j.type)==="git"?`${v.versions.engine.branch}-${v.versions.engine.hash}${v.versions.engine.dirty?"*":""} (${v.versions.engine.date})`:((k=v.versions.engine)==null?void 0:k.version_text)||"unbekannt",children:[l.jsx("strong",{children:"Engine:"})," ",((S=v.versions.engine)==null?void 0:S.type)==="git"?`${v.versions.engine.hash}${v.versions.engine.dirty?"*":""}`:((E=(N=v.versions.engine)==null?void 0:N.version_text)==null?void 0:E.split(" ").pop())||"—"]}),l.jsxs("div",{className:"truncate",title:v.versions.hermes_ui?`${v.versions.hermes_ui.branch}-${v.versions.hermes_ui.hash}${v.versions.hermes_ui.dirty?"*":""} (${v.versions.hermes_ui.date})`:"nicht gefunden",children:[l.jsx("strong",{children:"Hermes UI:"})," ",v.versions.hermes_ui?`${v.versions.hermes_ui.hash}${v.versions.hermes_ui.dirty?"*":""}`:"—"]}),l.jsxs("div",{className:"truncate",title:v.versions.hermes_agent?`${v.versions.hermes_agent.branch}-${v.versions.hermes_agent.hash}${v.versions.hermes_agent.dirty?"*":""} (${v.versions.hermes_agent.date})`:"nicht gefunden",children:[l.jsx("strong",{children:"Hermes Agent:"})," ",v.versions.hermes_agent?`${v.versions.hermes_agent.hash}${v.versions.hermes_agent.dirty?"*":""}`:"—"]})]})]})})]}),l.jsxs("div",{className:"flex min-w-0 flex-1 flex-col",children:[l.jsxs("header",{className:"flex h-14 shrink-0 items-center justify-between border-b border-border/40 px-6 bg-card/20 backdrop-blur-sm",children:[l.jsx("div",{className:"text-xs font-medium text-muted-foreground tracking-wide uppercase font-sans",children:b.hint}),l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(jE,{}),l.jsx("a",{href:"https://git.tobisniceshomelab.ddnsfree.com/Hitonabi/mission-control-v2/src/branch/main/docs/BEDIENUNG.md",target:"_blank",rel:"noopener",className:"flex h-8 items-center rounded-md border border-border/40 bg-background/40 px-2.5 text-xs text-muted-foreground hover:bg-accent hover:text-accent-foreground transition-all cursor-pointer font-semibold",title:"Bedien-Anleitung",children:"Hilfe"}),l.jsxs("button",{onClick:()=>{const A=new KeyboardEvent("keydown",{key:"k",metaKey:!0});document.dispatchEvent(A)},className:"flex items-center gap-2 rounded-md border border-border/40 bg-background/40 px-2.5 py-1.5 text-xs text-muted-foreground hover:bg-accent hover:text-accent-foreground transition-all cursor-pointer",children:[l.jsx(a4,{className:"h-3.5 w-3.5"}),l.jsx("span",{children:"Suchen"}),l.jsx("kbd",{className:"rounded bg-muted px-1.5 py-0.5 font-mono text-[9px]",children:"⌘K"})]})]})]}),l.jsxs("main",{className:"flex-1 overflow-y-auto p-6 scrollbar-thin",children:[e==="dashboard"&&l.jsx(yX,{}),e==="models"&&l.jsx(_X,{}),e==="connect"&&l.jsx(QO,{}),e==="memory"&&l.jsx(YO,{}),e==="agent"&&l.jsx(XO,{}),e==="terminal"&&l.jsx(FX,{}),e==="guide"&&l.jsx(UX,{}),!["dashboard","models","connect","memory","agent","terminal","guide"].includes(e)&&l.jsx(HX,{title:b.label,hint:b.hint})]})]})]})}const YX=new O3({defaultOptions:{queries:{retry:1,refetchOnWindowFocus:!1,staleTime:5e3}}});i3.createRoot(document.getElementById("root")).render(l.jsx(fN.StrictMode,{children:l.jsx(_3,{client:YX,children:l.jsx(QX,{})})}));export{Xa as R,ys as S,cv as T,T4 as a,vy as g,l as j,y as r}; diff --git a/frontend/dist/index.html b/frontend/dist/index.html index e647977..54bcb11 100644 --- a/frontend/dist/index.html +++ b/frontend/dist/index.html @@ -7,8 +7,8 @@ Mission Control 2.0 - - + +
diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 74a3d64..2bc604a 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -2,19 +2,20 @@ import { useEffect, useState, useCallback } from "react" import { Command as CommandIcon, ChevronLeft, ChevronRight } from "lucide-react" import { NAV, type ViewId } from "@/nav" import { CommandPalette } from "@/components/CommandPalette" +import { ExpertToggle } from "@/components/ExpertToggle" import { DashboardView } from "@/views/DashboardView" import { ModelsView } from "@/views/ModelsView" import { ConnectView } from "@/views/ConnectView" import { MemoryView } from "@/views/MemoryView" import { AgentView } from "@/views/AgentView" import { TerminalView } from "@/views/TerminalView" -import { VoiceView } from "@/views/VoiceView" import { GuideView } from "@/views/GuideView" import { Placeholder } from "@/views/Placeholder" import { SystemDrawer } from "@/components/SystemDrawer" import { useHealth, useSystemStatus } from "@/lib/queries" import { useMetricsFeeder } from "@/lib/metricsStore" import { cn } from "@/lib/utils" +import { Mc3App } from "@/mc3/Mc3App" export default function App() { useMetricsFeeder() // sammelt Live-Verlauf global, unabhängig vom aktiven Tab @@ -30,6 +31,8 @@ export default function App() { const [sidebarCollapsed, setSidebarCollapsed] = useState(() => localStorage.getItem("mc_sidebar_collapsed") === "true") const [drawerOpen, setDrawerOpen] = useState(false) const [drawerTab, setDrawerTab] = useState<"maintenance" | "logs">("maintenance") + // MC3-Prototyp läuft nicht-destruktiv unter #mc3 (produktives MC2 bleibt Default). + const [isMc3, setIsMc3] = useState(() => window.location.hash === "#mc3") const { data: health } = useHealth() const { data: sysStatus } = useSystemStatus(20_000) @@ -59,6 +62,7 @@ export default function App() { useEffect(() => { const onHash = () => { + setIsMc3(window.location.hash === "#mc3") const h = window.location.hash.slice(1) as ViewId if (NAV.some((n) => n.id === h)) setView(h) } @@ -68,6 +72,9 @@ export default function App() { const active = NAV.find((n) => n.id === view)! + // Nicht-destruktiver MC3-Prototyp: alle Hooks liefen oben, hier nur die Weiche. + if (isMc3) return + return (
{/* Background Aurora Ambient Effects */} @@ -195,6 +202,7 @@ export default function App() {
{active.hint}
+ } {view === "agent" && } {view === "terminal" && } - {view === "voice" && } {view === "guide" && } - {!["dashboard", "models", "connect", "memory", "agent", "terminal", "voice", "guide"].includes(view) && ( + {!["dashboard", "models", "connect", "memory", "agent", "terminal", "guide"].includes(view) && ( )} diff --git a/frontend/src/components/ExpertToggle.tsx b/frontend/src/components/ExpertToggle.tsx new file mode 100644 index 0000000..6338a62 --- /dev/null +++ b/frontend/src/components/ExpertToggle.tsx @@ -0,0 +1,37 @@ +import { Sparkles, SlidersHorizontal } from "lucide-react" +import { useExpertMode, setExpertMode } from "@/lib/useExpertMode" +import { cn } from "@/lib/utils" + +// Zwei-Zustand-Pille im Header: „Einfach" (aufgeräumt) ↔ „Experte" (alle Details). +export function ExpertToggle() { + const expert = useExpertMode() + return ( +
+ + +
+ ) +} diff --git a/frontend/src/components/dashboard/LucyHealthCard.tsx b/frontend/src/components/dashboard/LucyHealthCard.tsx new file mode 100644 index 0000000..2c88c32 --- /dev/null +++ b/frontend/src/components/dashboard/LucyHealthCard.tsx @@ -0,0 +1,165 @@ +import { useState } from "react" +import { HeartPulse, HardDrive, Wrench, Check, AlertTriangle, Loader2, ShieldQuestion } from "lucide-react" +import { api } from "@/lib/api" +import { useDialog } from "@/lib/useDialog" +import { useQueryClient, qk } from "@/lib/queries" +import { useLucyHealth, type LucyCheck, type Repair } from "@/lib/useLucyHealth" +import { cn } from "@/lib/utils" + +// Farb-/Text-Ton pro Check-Status. +const DOT: Record = { + ok: "bg-emerald-500", + warn: "bg-amber-500", + down: "bg-red-500", + loading: "bg-muted-foreground/40", +} + +// `frame` = Erzählrahmen: "lucy" (MC2-Dashboard) oder "box" (MC3-Basisstation). +export function LucyHealthCard({ frame = "lucy" }: { frame?: "lucy" | "box" } = {}) { + const { verdict, checks, memory, problems } = useLucyHealth() + const { showAlert, dialogElement } = useDialog() + const qc = useQueryClient() + const [busy, setBusy] = useState>({}) + + async function runRepair(id: string, repair: Repair) { + setBusy((b) => ({ ...b, [id]: true })) + try { + if (repair.kind === "loadModel") { + await api(`/api/models/${encodeURIComponent(repair.model)}/load`, { method: "POST" }) + } else { + const r = await api<{ ok: boolean; err?: string }>("/api/maintenance/restart", { + method: "POST", + body: JSON.stringify({ service: repair.service }), + }) + if (!r.ok) { + showAlert( + "Reparatur nicht ganz geklappt", + (r.err || "Unbekannter Fehler") + + (repair.needsSudo ? "\n\nTipp: Dafür wird evtl. das Box-Passwort gebraucht (oben rechts hinterlegen)." : ""), + ) + } + } + // Status-Queries neu ziehen, damit die Ampel sich sofort aktualisiert. + qc.invalidateQueries({ queryKey: qk.health }) + qc.invalidateQueries({ queryKey: qk.services }) + qc.invalidateQueries({ queryKey: qk.models }) + } catch (e: any) { + showAlert("Reparatur fehlgeschlagen", String(e?.message || e)) + } finally { + setBusy((b) => ({ ...b, [id]: false })) + } + } + + // Titel je Erzählrahmen (Box-Kontrollpanel vs. Lucy-Dashboard). + const T = frame === "box" + ? { loading: "Box wird geprüft …", gut: "Alles okay", warn: "Kleinigkeit an der Box", problem: "Box braucht Hilfe" } + : { loading: "Lucy wird geprüft …", gut: "Lucy geht's gut 💚", warn: "Kleinigkeit bei Lucy", problem: "Lucy braucht Hilfe" } + + // Banner-Optik je Gesamt-Verdikt. + const banner = { + loading: { ring: "border-border/60 bg-card/45", icon: Loader2, iconCls: "text-muted-foreground animate-spin", title: T.loading, sub: "Einen Moment, ich schaue nach dem Rechten." }, + gut: { ring: "border-emerald-500/40 bg-emerald-500/5", icon: HeartPulse, iconCls: "text-emerald-400", title: T.gut, sub: "Alle wichtigen Fähigkeiten laufen." }, + warn: { ring: "border-amber-500/40 bg-amber-500/5", icon: AlertTriangle, iconCls: "text-amber-400", title: T.warn, sub: "Nichts Schlimmes — nur ein Hinweis." }, + problem: { ring: "border-red-500/50 bg-red-500/5", icon: AlertTriangle, iconCls: "text-red-400", title: T.problem, sub: `${problems.length} wichtige${problems.length === 1 ? "s" : ""} Problem${problems.length === 1 ? "" : "e"} gefunden.` }, + }[verdict] + const BannerIcon = banner.icon + + const memTone = { + ok: "bg-emerald-500", warn: "bg-amber-500", full: "bg-red-500", unknown: "bg-muted-foreground/40", + }[memory.status] + const memText = { + ok: "text-emerald-400", warn: "text-amber-400", full: "text-red-400", unknown: "text-muted-foreground", + }[memory.status] + + return ( +
+ {/* Gesamt-Verdikt */} +
+
+ +
+
+

{banner.title}

+

{banner.sub}

+
+
+ + {/* Speicher-Ampel */} +
+
+ + Speicher + + + {memory.status === "unknown" ? "—" : `${memory.usedGb.toFixed(0)} / ${memory.totalGb.toFixed(0)} GB`} + +
+
+
+
+

{memory.text}

+
+ + {/* Fähigkeiten-Checkliste */} +
+ {checks.map((c) => ( + c.repair && runRepair(c.id, c.repair)} /> + ))} +
+ + {dialogElement} +
+ ) +} + +function CheckRow({ c, busy, onRepair }: { c: LucyCheck; busy: boolean; onRepair: () => void }) { + const Icon = c.icon + const bad = c.status === "down" || c.status === "warn" + return ( +
+
+ + + + +
+
+ {c.label} + {c.status === "ok" && } + {!c.critical && optional} +
+
{c.detail}
+
+
+ + {bad && c.repair && ( + + )} + {bad && !c.repair && ( + + manuell + + )} +
+ ) +} diff --git a/frontend/src/components/dashboard/ModelsCard.tsx b/frontend/src/components/dashboard/ModelsCard.tsx index dd0bb87..907a695 100644 --- a/frontend/src/components/dashboard/ModelsCard.tsx +++ b/frontend/src/components/dashboard/ModelsCard.tsx @@ -3,7 +3,7 @@ import { Boxes, Zap, Moon } from "lucide-react" import { useModels, useTokenStats, useSystemStatus } from "@/lib/queries" import { fmtSize, gb } from "@/lib/format" import { cn } from "@/lib/utils" -import { ROLES, roleTone } from "@/components/models/ModelBadges" +import { ROLES, RoleLabel } from "@/components/models/ModelBadges" // Vereint die frühere RolesCard (Rolle→Modell) + ActiveModelsCard (warm/Inferenz/Größe) // zu EINER Karte — dieselbe Info stand vorher doppelt auf der Zentrale. @@ -85,9 +85,7 @@ export function ModelsCard() { )} >
- - {role} - +
{m ? m.name.split("/").pop()?.replace(/\.gguf$/i, "") : "nicht zugewiesen"} diff --git a/frontend/src/components/models/ModelBadges.tsx b/frontend/src/components/models/ModelBadges.tsx index 9f7bfe8..7f357e7 100644 --- a/frontend/src/components/models/ModelBadges.tsx +++ b/frontend/src/components/models/ModelBadges.tsx @@ -1,24 +1,39 @@ import { type Fit } from "@/lib/api" import { cn } from "@/lib/utils" +import { ROLES, roleTone, roleMeta } from "@/lib/roleMeta" -// Die kanonischen Serving-Rollen (identisch zu Backend sources.py/llamaswap.ROLE_IDS). -// `hermes` = Lucys Agent-Hirn (warm + ko-resident); UI-Label „Hirn". -export const ROLES = ["fast", "heavy", "coder", "vision", "hermes", "scout"] +// Klartext-Schicht: Rollen-Namen/Icons/Farben leben jetzt zentral in lib/roleMeta.ts. +// Re-Export hält bestehende Importe (Cockpit, ModelsCard, …) stabil. +export { ROLES, roleTone, roleMeta } -// Rolle → Farbton. EINE Quelle der Wahrheit für alle Rollen-Badges (Cockpit, ModelsCard, -// …). `hermes` = Agent-Hirn (taucht als geladenes Modell auf). -export const ROLE_TONE: Record = { - fast: "bg-cyan-500/15 text-cyan-400 border-cyan-500/25", - heavy: "bg-amber-500/15 text-amber-400 border-amber-500/25", - coder: "bg-violet-500/15 text-violet-400 border-violet-500/25", - vision: "bg-pink-500/15 text-pink-400 border-pink-500/25", - scout: "bg-teal-500/15 text-teal-400 border-teal-500/25", - hermes: "bg-indigo-500/15 text-indigo-400 border-indigo-500/25", +// Rollen-Badge in Klartext: Icon + Zweck-Name, technisches Kürzel als Tooltip. +// `dense` = nur Kurzform (für enge Badges). +export function RoleLabel({ + role, + dense = false, + className, +}: { + role?: string | null + dense?: boolean + className?: string +}) { + const meta = roleMeta(role) + const Icon = meta.icon + return ( + + + ) } -export const roleTone = (role?: string | null) => - (role && ROLE_TONE[role]) || "bg-slate-500/15 text-slate-300 border-slate-500/25" - export function FitBadge({ fit }: { fit: Fit }) { const tone = { perfect: "bg-emerald-500/15 text-emerald-400 border border-emerald-500/20", diff --git a/frontend/src/components/models/WarmSetManager.tsx b/frontend/src/components/models/WarmSetManager.tsx new file mode 100644 index 0000000..b72ca52 --- /dev/null +++ b/frontend/src/components/models/WarmSetManager.tsx @@ -0,0 +1,202 @@ +import { useState } from "react" +import { Zap, Plus, X, Check, HardDrive, AlertTriangle } from "lucide-react" +import { setGroup, type ModelInfo } from "@/lib/api" +import { useModels, useGroups, useSystemStatus, useHermesBrain, useQueryClient, qk } from "@/lib/queries" +import { useDialog } from "@/lib/useDialog" +import { RoleLabel, roleMeta } from "@/components/models/ModelBadges" +import { fmtSize } from "@/lib/format" +import { cn } from "@/lib/utils" + +// „Immer-bereit-Set" = die ko-residente llama-swap-Gruppe `brains`. Ihre Mitglieder +// bleiben gemeinsam warm (verdrängen sich nicht). Hier in Klartext verwaltbar, +// mit Speicher-Budget und Geländer (Hirn/Gedächtnis nicht entfernbar). +export function WarmSetManager() { + const qc = useQueryClient() + const { data: modelsResp } = useModels(4_000) + const { data: groupsResp } = useGroups() + const { data: sysStatus } = useSystemStatus() + const { data: brain } = useHermesBrain() + const { showAlert, dialogElement } = useDialog() + const [picking, setPicking] = useState(false) + const [busy, setBusy] = useState(false) + + const models = modelsResp?.models ?? [] + const running = modelsResp?.running ?? [] + const group = groupsResp?.groups?.brains + const members = group?.members ?? [] + const byName = (name: string) => models.find((m) => m.name === name) + const shortName = (name: string) => name.split("/").pop()?.replace(/\.gguf$/i, "") || name + + const memberModels = members.map(byName).filter(Boolean) as ModelInfo[] + const B = 1024 ** 3 + const bud = brain?.budget + const weightsGb = memberModels.reduce((a, m) => a + (m.size_bytes || 0), 0) / B + const gttTotal = sysStatus?.gpu?.gtt_total || sysStatus?.gpu?.vram_total || 0 + const totalGb = bud?.gtt_gb || (gttTotal ? gttTotal / B : 0) + // Ehrlicher Fußabdruck inkl. Arbeitsspeicher (KV-Cache) aus dem Budget; sonst nur Gewichte. + const reservedGb = bud?.warm_projected_gb ?? weightsGb + const pct = totalGb > 0 ? Math.min(100, (reservedGb / totalGb) * 100) : 0 + + const eligible = models.filter((m) => !members.includes(m.name) && !m.incomplete) + + async function save(next: string[]) { + setBusy(true) + try { + await setGroup("brains", next, group?.swap ?? false, group?.persist ?? true) + qc.invalidateQueries({ queryKey: qk.groups }) + qc.invalidateQueries({ queryKey: qk.models }) + qc.invalidateQueries({ queryKey: qk.hermesBrain }) + } catch (e: any) { + showAlert("Fehler", `Immer-bereit-Set konnte nicht geändert werden: ${e?.message || e}`) + } finally { + setBusy(false) + } + } + + function remove(name: string) { + const m = byName(name) + if (m && roleMeta(m.role).protected) { + showAlert("Geschützt", `„${roleMeta(m.role).label}" ist lebenswichtig und bleibt immer bereit.`) + return + } + void save(members.filter((x) => x !== name)) + } + + function add(name: string) { + setPicking(false) + void save([...members, name]) + } + + if (!group) { + return ( +
+
+

+ Es gibt noch kein Immer-bereit-Set. Es entsteht automatisch, sobald Lucys Hirn zugewiesen ist. +

+ {dialogElement} +
+ ) + } + + return ( +
+
+ + {/* Mitglieder */} +
+ {memberModels.length === 0 && ( +
Noch keine Modelle im Set.
+ )} + {memberModels.map((m) => { + const isWarm = running.includes(m.name) + const prot = roleMeta(m.role).protected + return ( +
+
+ + {m.role && } + {shortName(m.name)} + {fmtSize(m.size_bytes)} +
+ {prot ? ( + 🔒 + ) : ( + + )} +
+ ) + })} +
+ + {/* Hinzufügen */} + + + {/* Speicher-Budget */} +
+
+ + Reserviert fürs Set + + + {reservedGb.toFixed(1)}{totalGb > 0 ? ` / ${totalGb.toFixed(0)}` : ""} GB + +
+
+
= 85 ? "bg-red-500" : pct >= 65 ? "bg-amber-500" : "bg-teal-500")} style={{ width: `${pct}%` }} /> +
+ + {bud && !bud.fits && ( +

+ + + Zusammen mit dem größten Gelegenheits-Modell (~{bud.largest_ondemand_gb} GB, z. B. das große Hirn) passt das Set + nicht gleichzeitig in den Speicher. Beim Laden wird das Set kurz verdrängt und danach automatisch nachgeladen — kostet ein paar Sekunden. + +

+ )} + {bud && bud.fits && ( +

+ Passt auch neben dem größten Gelegenheits-Modell — nichts wird verdrängt. +

+ )} +
+ + {/* Auswahl-Modal */} + {picking && ( +
+
+
+

Dauerhaft bereithalten

+ +
+

Wähle ein Modell, das ohne Ladezeit bereitstehen soll:

+
+ {eligible.map((m) => ( + + ))} +
+
+
+ )} + + {dialogElement} +
+ ) +} + +function Header() { + return ( +
+ +
+

Immer-bereit-Set

+

Diese Modelle hält Lucy immer bereit — sie antworten ohne Ladezeit.

+
+
+ ) +} diff --git a/frontend/src/components/voice/Avatar3D.tsx b/frontend/src/components/voice/Avatar3D.tsx deleted file mode 100644 index 9dcd608..0000000 --- a/frontend/src/components/voice/Avatar3D.tsx +++ /dev/null @@ -1,193 +0,0 @@ -import { Canvas, useFrame } from "@react-three/fiber" -import { OrbitControls } from "@react-three/drei" -import { useEffect, useRef, useState, type MutableRefObject } from "react" -import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js" -import { VRM, VRMLoaderPlugin, VRMUtils } from "@pixiv/three-vrm" -import type { Emotion } from "@/lib/voice/sentiment" - -// 3D-Avatar (VRM) mit Lippensync (Mund folgt dem TTS-Audiopegel), automatischem Blinzeln und -// stimmungsabhängiger Mimik. Liest die Live-Werte aus Mutable-Refs (kein Re-Render pro Frame). - -type LevelRef = MutableRefObject<{ current: number }> // audioLevel.current.current = Pegel 0..1 -type EmotionRef = MutableRefObject - -// Ruhepose (A-Pose) als Basis — VRMs laden sonst in T-Pose (Arme waagerecht). -const REST: Record = { - leftUpperArm: [0, 0, 1.2], - rightUpperArm: [0, 0, -1.2], - leftLowerArm: [0, -0.2, 0], - rightLowerArm: [0, 0.2, 0], -} - -function setBone(vrm: VRM, name: string, x: number, y: number, z: number) { - const b = vrm.humanoid?.getNormalizedBoneNode(name as any) - if (b) b.rotation.set(x, y, z) -} - -function applyRestPose(vrm: VRM) { - for (const [name, r] of Object.entries(REST)) setBone(vrm, name, r[0], r[1], r[2]) - vrm.humanoid?.update() -} - -// Lebendige Idle-Animation: prozedural (kein Animations-File). Über die Ruhepose gelegt: -// Atmung, langsames Wiegen + Gewichtsverlagerung, Umschauen (lookYaw/Pitch), Vorlehnen beim -// Sprechen (lean) und Arm-Mitbewegung. Die Augen (lookAt) hält die useFrame separat auf die Kamera. -function applyIdle(vrm: VRM, t: number, level: number, lookYaw: number, lookPitch: number, lean: number) { - const breathe = Math.sin(t * 1.7) // ~0.27 Hz Atmung - const sway = Math.sin(t * 0.45) // sanftes Wiegen - const weight = Math.sin(t * 0.32) // langsame Gewichtsverlagerung - const emphasis = Math.min(1, level * 1.4) - const nod = Math.sin(t * 1.3) * emphasis * 0.06 // Sprech-Nicken - - // Rumpf — Atmung, Wiegen, Gewichtsverlagerung, Vorlehnen beim Sprechen - setBone(vrm, "hips", 0, weight * 0.045, weight * 0.03) - setBone(vrm, "spine", breathe * 0.025 + lean * 0.07, sway * 0.022, -weight * 0.03) - setBone(vrm, "chest", breathe * 0.02 + lean * 0.02, sway * 0.018, 0) - setBone(vrm, "upperChest", breathe * 0.015, 0, 0) - - // Kopf/Hals — Umschauen (gedriftete Zielwinkel) + Atmung + Sprech-Nicken - setBone(vrm, "neck", lookPitch * 0.4 + nod * 0.5, lookYaw * 0.4, 0) - setBone(vrm, "head", lookPitch * 0.6 + nod * 0.5 + Math.sin(t * 0.6) * 0.015, - lookYaw * 0.6 + Math.sin(t * 0.27) * 0.025, Math.sin(t * 0.5) * 0.02) - - // Arme — Ruhepose + leichtes Pendeln + Gewichtsverlagerung - const arm = Math.sin(t * 0.8) * 0.035 - setBone(vrm, "leftUpperArm", 0, 0, 1.18 + arm + weight * 0.04) - setBone(vrm, "rightUpperArm", 0, 0, -1.18 - arm + weight * 0.04) - setBone(vrm, "leftLowerArm", 0, -0.18 - Math.sin(t * 0.8) * 0.03, 0) - setBone(vrm, "rightLowerArm", 0, 0.18 + Math.sin(t * 0.8) * 0.03, 0) -} - -const EXPRESSIONS = ["happy", "angry", "sad", "surprised", "relaxed"] as const -const EMO_TO_EXPR: Record = { - neutral: null, happy: "happy", angry: "angry", sad: "sad", surprised: "surprised", relaxed: "relaxed", -} - -function VrmModel({ url, audioLevel, emotion, onError }: { - url: string; audioLevel: LevelRef; emotion: EmotionRef; onError: (m: string) => void -}) { - const [vrm, setVrm] = useState(null) - const smooth = useRef>({}) - const blink = useRef({ t: 0, next: 3, active: 0 }) - // Umschauen (gedriftete Kopf-Zielwinkel) + geglättetes Lehnen beim Sprechen. - const motion = useRef({ yaw: 0, pitch: 0, tYaw: 0, tPitch: 0, t: 0, next: 2.5, lean: 0 }) - - useEffect(() => { - let disposed = false - let loaded: VRM | null = null - const loader = new GLTFLoader() - loader.register((parser) => new VRMLoaderPlugin(parser)) - loader.load( - url, - (gltf) => { - if (disposed) return - const v = gltf.userData.vrm as VRM | undefined - if (!v) { onError("Datei enthält kein gültiges VRM-Modell."); return } - VRMUtils.removeUnnecessaryVertices(gltf.scene) - if (v.meta?.metaVersion === "0") VRMUtils.rotateVRM0(v) - v.scene.rotation.y = Math.PI // dem Betrachter zuwenden - applyRestPose(v) // T-Pose → entspannte A-Pose (Arme unten) - loaded = v - setVrm(v) - }, - undefined, - (err) => { console.error("VRM-Load-Fehler:", err); onError("Avatar konnte nicht geladen werden (CORS/URL?).") }, - ) - return () => { - disposed = true - if (loaded) VRMUtils.deepDispose(loaded.scene) - setVrm(null) - } - }, [url, onError]) - - useFrame((state, delta) => { - if (!vrm) return - const target = audioLevel.current?.current ?? 0 - - // Blickkontakt: Augen folgen der Kamera (schaut dich an). - if (vrm.lookAt) vrm.lookAt.target = state.camera - - // Umschauen: alle paar Sekunden neues Kopf-Ziel, sanft hineinlerpen. - const m = motion.current - m.t += delta - if (m.t > m.next) { - m.tYaw = (Math.random() - 0.5) * 0.5 // ±0.25 rad Gieren - m.tPitch = (Math.random() - 0.5) * 0.24 - m.t = 0 - m.next = 2.5 + Math.random() * 3.5 - } - m.yaw += (m.tYaw - m.yaw) * Math.min(1, delta * 1.5) - m.pitch += (m.tPitch - m.pitch) * Math.min(1, delta * 1.5) - m.lean += (Math.min(1, target * 1.6) - m.lean) * Math.min(1, delta * 3) - - // Lebendige Idle-/Sprech-Bewegung (über die Ruhepose gelegt). - applyIdle(vrm, state.clock.elapsedTime, target, m.yaw, m.pitch, m.lean) - - const em = vrm.expressionManager - if (em) { - // Lippensync: 'aa' folgt geglättet dem Audiopegel. - const aa = (smooth.current.aa ?? 0) * 0.4 + target * 0.6 - smooth.current.aa = aa - em.setValue("aa", aa) - - // Mimik: weich zur Ziel-Expression lerpen. - const want = EMO_TO_EXPR[emotion.current] - for (const name of EXPRESSIONS) { - const tv = want === name ? 0.75 : 0 - const cv = smooth.current[name] ?? 0 - const nv = cv + (tv - cv) * Math.min(1, delta * 4) - smooth.current[name] = nv - em.setValue(name, nv) - } - - // Blinzeln: kurzer Dreieckspuls alle 3–7 s. - const b = blink.current - b.t += delta - if (b.active <= 0 && b.t > b.next) { b.active = 0.16; b.t = 0; b.next = 3 + Math.random() * 4 } - let blinkVal = 0 - if (b.active > 0) { - b.active -= delta - const p = 1 - b.active / 0.16 // 0..1 Fortschritt - blinkVal = 1 - Math.abs(p - 0.5) * 2 // 0 → 1 → 0 - } - em.setValue("blink", Math.max(0, blinkVal)) - } - vrm.update(delta) - }) - - return vrm ? : null -} - -export function Avatar3D({ url, audioLevel, emotion }: { - url: string; audioLevel: LevelRef; emotion: EmotionRef -}) { - const [err, setErr] = useState(null) - return ( -
- - - - - {/* key=url → bei Avatarwechsel sauber neu mounten */} - - - - {err && ( -
- {err} -
- )} -
- ) -} diff --git a/frontend/src/components/voice/AvatarPicker.tsx b/frontend/src/components/voice/AvatarPicker.tsx deleted file mode 100644 index d28ad0f..0000000 --- a/frontend/src/components/voice/AvatarPicker.tsx +++ /dev/null @@ -1,155 +0,0 @@ -import { useEffect, useRef, useState } from "react" -import { Sparkles, Volume2, Loader2 } from "lucide-react" - -// Stimm-Steuerung (Engine + Stimme + Probe). Der Avatar ist fest (kein Picker mehr). -// Engines: ElevenLabs (eigene Stimme) + Edge (gratis, nativ-deutsch). Auswahl in localStorage. - -interface Voice { engine: string; id: string; label: string } - -const ENGINES = ["elevenlabs", "edge"] as const -const ENGINE_LABEL: Record = { - elevenlabs: "ElevenLabs (premium)", - edge: "Edge (natürlich · gratis)", -} - -export function VoiceControls() { - const [voices, setVoices] = useState([]) - const [engine, setEngine] = useState(localStorage.getItem("mc_voice_engine") || "elevenlabs") - const [voice, setVoice] = useState(localStorage.getItem("mc_voice_voice") || "") - const [previewing, setPreviewing] = useState(false) - const [volume, setVolume] = useState(() => { - const raw = localStorage.getItem("mc_voice_volume") - if (raw === null || raw === "") return 0.6 // Number(null)===0 → sonst aus Versehen stumm - const v = Number(raw) - return Number.isNaN(v) ? 0.6 : v - }) - const previewAudio = useRef(null) - - const onVolume = (v: number) => { - setVolume(v) - localStorage.setItem("mc_voice_volume", String(v)) - window.dispatchEvent(new CustomEvent("mc-voice-volume", { detail: v })) - } - - const saveVoice = (eng: string, v: string) => { - setEngine(eng); setVoice(v) - localStorage.setItem("mc_voice_engine", eng) - localStorage.setItem("mc_voice_voice", v) - } - - // Stimmen holen. NIE auf leerer Stimme bleiben (ElevenLabs „Standardstimme" = Library-Voice, die das - // Free-Tier per API sperrt) → erste echte Stimme der aktiven Engine automatisch wählen. - useEffect(() => { - fetch("/api/voice/voices") - .then((r) => (r.ok ? r.json() : Promise.reject())) - .then((d) => { - const list: Voice[] = d.voices || [] - setVoices(list) - if (!voice) { - const first = list.find((v) => v.engine === engine) - if (first) saveVoice(engine, first.id) - } - }) - .catch(() => setVoices([])) - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []) - - const playPreview = async () => { - if (previewing) return - setPreviewing(true) - try { - const r = await fetch("/api/voice/tts", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ text: "Hallo! So klingt diese Stimme auf Deutsch.", engine, voice }), - }) - if (!r.ok) throw new Error(`TTS ${r.status}`) - const url = URL.createObjectURL(await r.blob()) - previewAudio.current?.pause() - const a = new Audio(url) - a.volume = Math.min(1, volume) // Regler auch für die Probe respektieren - previewAudio.current = a - a.onended = () => URL.revokeObjectURL(url) - await a.play() - } catch (e) { - console.error("Probe fehlgeschlagen:", e) - } finally { - setPreviewing(false) - } - } - - const pickEngine = (eng: string) => { - const first = voices.find((v) => v.engine === eng) - saveVoice(eng, first?.id || "") - } - - const voicesForEngine = voices.filter((v) => v.engine === engine) - const elKeyMissing = engine === "elevenlabs" && voicesForEngine.length === 0 - - return ( -
-
- Stimme -
- {voices.length === 0 ? ( -
- Voice-Dienst nicht erreichbar — Stimmen werden geladen, sobald der Sidecar läuft. -
- ) : ( -
-
- {ENGINES.map((eng) => ( - - ))} -
- - - {/* Lautstärke */} -
- - onVolume(Number(e.target.value))} - className="h-1 flex-1 cursor-pointer accent-primary" - title="Lautstärke" - /> - {Math.round(volume * 100)}% -
- {elKeyMissing && ( -

- Keine ElevenLabs-Stimmen — Key in ~/.hermes/.env fehlt, oder keine eigene Stimme angelegt. -

- )} - {engine === "edge" && ( -

- Edge: native deutsche Stimmen, gratis & ohne Key. Cloud (Text → Microsoft). -

- )} -
- )} -
- ) -} diff --git a/frontend/src/lib/roleMeta.ts b/frontend/src/lib/roleMeta.ts new file mode 100644 index 0000000..416cb4b --- /dev/null +++ b/frontend/src/lib/roleMeta.ts @@ -0,0 +1,126 @@ +import { + Brain, + BrainCog, + Code, + Eye, + BookMarked, + Telescope, + type LucideIcon, +} from "lucide-react" + +// ── EINE Quelle der Wahrheit für ALLE Serving-Rollen ──────────────────────── +// Klartext statt Kürzel: jede Rolle bekommt einen Zweck-Namen, ein Icon und +// eine Ein-Satz-Erklärung, damit die UI ohne Fachjargon verständlich ist. +// Das technische Kürzel (`role`) bleibt für den späteren Experten-Modus erhalten. +// +// Die Rollen hier spiegeln den ECHTEN Stand der Box (/api/models → role): +// hermes · heavy · coder · coder-lite · vision · embed · scout +// (Kein Phantom-`fast`: das ist nur ein Lane-Alias, keine Modell-Rolle. Lucys +// Alltags-Hirn ist die Rolle `hermes` = Qwen3.6.) + +export interface RoleMeta { + role: string // technisches Kürzel (Experten-Modus) + label: string // Klartext-Zweckname + short: string // Kurzform für enge Badges + icon: LucideIcon + desc: string // Tooltip / Erklärung in einfacher Sprache + tone: string // Farbklassen fürs Badge + protected?: boolean // Hirn & Gedächtnis: lebenswichtig → nicht löschbar/entladbar (Etappe 3) +} + +// Reihenfolge = Anzeige-Reihenfolge in den Slot-Übersichten (Wichtigstes zuerst). +export const ROLE_META: RoleMeta[] = [ + { + role: "hermes", + label: "Lucys Hirn", + short: "Hirn", + icon: Brain, + desc: "Lucys Alltags-Verstand — denkt und redet mit dir. Immer bereit.", + tone: "bg-indigo-500/15 text-indigo-400 border-indigo-500/25", + protected: true, + }, + { + role: "embed", + label: "Lucys Gedächtnis", + short: "Gedächtnis", + icon: BookMarked, + desc: "Merkt sich Wichtiges und findet es später wieder.", + tone: "bg-emerald-500/15 text-emerald-400 border-emerald-500/25", + protected: true, + }, + { + role: "vision", + label: "Lucys Augen", + short: "Augen", + icon: Eye, + desc: "Sieht Bilder und Screenshots und beschreibt, was drauf ist.", + tone: "bg-pink-500/15 text-pink-400 border-pink-500/25", + }, + { + role: "heavy", + label: "Großes Hirn", + short: "Groß", + icon: BrainCog, + desc: "Das schwere Geschütz — wird für besonders knifflige Fragen dazugeholt.", + tone: "bg-amber-500/15 text-amber-400 border-amber-500/25", + }, + { + role: "coder-lite", + label: "Programmierer (schnell)", + short: "Code schnell", + icon: Code, + desc: "Schnelles Programmieren im Alltag.", + tone: "bg-violet-500/15 text-violet-400 border-violet-500/25", + }, + { + role: "coder", + label: "Programmierer (gründlich)", + short: "Code gründlich", + icon: Code, + desc: "Schreibt und prüft Code besonders sorgfältig — für schwere Coding-Aufgaben.", + tone: "bg-fuchsia-500/15 text-fuchsia-400 border-fuchsia-500/25", + }, + { + role: "scout", + label: "Späher", + short: "Späher", + icon: Telescope, + desc: "Schneller erster Blick und grobe Einschätzung.", + tone: "bg-teal-500/15 text-teal-400 border-teal-500/25", + }, +] + +// Kanonische Rollen-Reihenfolge (ersetzt die alte, veraltete ROLES-Liste). +export const ROLES: string[] = ROLE_META.map((m) => m.role) + +const BY_ROLE: Record = Object.fromEntries( + ROLE_META.map((m) => [m.role, m]), +) + +// Fallback für unbekannte/neue Rollen — nie „undefined", damit die UID nicht bricht. +const UNKNOWN = (role?: string | null): RoleMeta => ({ + role: role || "?", + label: role || "unbekannt", + short: role || "?", + icon: Brain, + desc: "Rolle ohne hinterlegten Klartext-Namen.", + tone: "bg-slate-500/15 text-slate-300 border-slate-500/25", +}) + +// Aliase, die auf eine echte Rolle zeigen (z.B. Lane-Alias `fast` = Hirn). +const ALIAS: Record = { + fast: "hermes", + coder_lite: "coder-lite", +} + +export function roleMeta(role?: string | null): RoleMeta { + if (!role) return UNKNOWN(role) + return BY_ROLE[role] || BY_ROLE[ALIAS[role]] || UNKNOWN(role) +} + +// Klartext-Name einer Rolle (mit optionaler Kurzform). +export const roleLabel = (role?: string | null, short = false) => + short ? roleMeta(role).short : roleMeta(role).label + +// Farbton — bleibt kompatibel zur bisherigen roleTone()-Signatur. +export const roleTone = (role?: string | null) => roleMeta(role).tone diff --git a/frontend/src/lib/useExpertMode.ts b/frontend/src/lib/useExpertMode.ts new file mode 100644 index 0000000..967303c --- /dev/null +++ b/frontend/src/lib/useExpertMode.ts @@ -0,0 +1,34 @@ +import { useSyncExternalStore } from "react" + +// Globaler „Einfach/Experte"-Schalter. Einfach (Default) blendet technische +// Details (Kontext, Spec, Slots, Ko-Residenz, Lane-Routing …) aus, damit die UI +// nicht überfordert. In localStorage gemerkt; alle Consumer aktualisieren via Event. + +const KEY = "mc_expert_mode" +const EVT = "mc-expert-mode-change" + +const read = (): boolean => { + try { + return localStorage.getItem(KEY) === "true" + } catch { + return false + } +} + +function subscribe(cb: () => void) { + window.addEventListener(EVT, cb) + window.addEventListener("storage", cb) + return () => { + window.removeEventListener(EVT, cb) + window.removeEventListener("storage", cb) + } +} + +export function setExpertMode(v: boolean) { + localStorage.setItem(KEY, String(v)) + window.dispatchEvent(new Event(EVT)) +} + +export function useExpertMode(): boolean { + return useSyncExternalStore(subscribe, read, () => false) +} diff --git a/frontend/src/lib/useLucyHealth.ts b/frontend/src/lib/useLucyHealth.ts new file mode 100644 index 0000000..5947d8a --- /dev/null +++ b/frontend/src/lib/useLucyHealth.ts @@ -0,0 +1,173 @@ +// „Geht's Lucy gut?" — bündelt die vielen technischen Status-Signale zu wenigen +// Lucy-Fähigkeiten in Klartext, inkl. Gesamt-Verdikt, Speicher-Ampel und einer +// konkreten 1-Klick-Reparatur pro Problem. EINE Quelle für das Status-Panel. + +import { Brain, BookMarked, Plug, Bot, Mic, type LucideIcon } from "lucide-react" +import { useHealth, useServices, useModels, useSystemStatus } from "./queries" + +export type CheckStatus = "ok" | "warn" | "down" | "loading" + +// Reparatur-Rezept: entweder einen systemd-Dienst neu starten oder ein Modell laden. +// WICHTIG: `service` sind die ECHTEN Unit-Namen (nicht die Anzeige-Namen der +// Dienste-Karte), damit /api/maintenance/restart sie akzeptiert. +export type Repair = + | { kind: "restart"; service: string; label: string; needsSudo?: boolean } + | { kind: "loadModel"; model: string; label: string } + +export interface LucyCheck { + id: string + label: string // Klartext-Name der Fähigkeit + icon: LucideIcon + status: CheckStatus + detail: string // Ein Satz: was ist gerade los + critical: boolean // zählt fürs Gesamt-Verdikt „Problem" + repair?: Repair +} + +export type Verdict = "loading" | "gut" | "warn" | "problem" + +export interface MemoryAmpel { + status: "ok" | "warn" | "full" | "unknown" + usedGb: number + totalGb: number + pct: number + text: string +} + +export interface LucyHealth { + verdict: Verdict + checks: LucyCheck[] + memory: MemoryAmpel + problems: LucyCheck[] // kritische Down-Checks (für den Schnellzugriff im Banner) +} + +export function useLucyHealth(): LucyHealth { + const { data: health } = useHealth() + const { data: svc } = useServices() + const { data: modelsResp } = useModels() + const { data: sys } = useSystemStatus() + + const loaded = !!health && !!svc + const svcOk = (frag: string): boolean | undefined => + svc?.services.find((s) => s.name.toLowerCase().includes(frag))?.ok + + const engineOk = health?.engine_reachable + const brainReady = health?.brain?.ready + const brainName = + health?.brain?.model || + modelsResp?.models.find((m) => m.role === "hermes")?.name || + "" + + const checks: LucyCheck[] = [] + + // 1) Lucys Hirn — die wichtigste Fähigkeit. Engine läuft UND das Hirn-Modell ist geladen? + checks.push(((): LucyCheck => { + const base = { id: "brain", label: "Lucys Hirn", icon: Brain, critical: true } + if (!loaded) return { ...base, status: "loading", detail: "Wird geprüft …" } + if (engineOk === false) + return { + ...base, + status: "down", + detail: "Die Motor-Maschine (Engine) läuft nicht — Lucy kann gerade gar nicht denken.", + repair: { kind: "restart", service: "llama-swap", label: "Motor neu starten", needsSudo: true }, + } + if (brainReady === false) + return { + ...base, + status: "down", + detail: "Lucys Hirn ist gerade eingeschlafen — einmal aufwecken.", + repair: brainName + ? { kind: "loadModel", model: brainName, label: "Hirn aufwecken" } + : undefined, + } + return { ...base, status: "ok", detail: "Wach und ansprechbar." } + })()) + + // 2) Lucys Gedächtnis — Mem0-Dienst. + checks.push(((): LucyCheck => { + const base = { id: "memory", label: "Lucys Gedächtnis", icon: BookMarked, critical: true } + const ok = svcOk("mem0") + if (!loaded || ok === undefined) return { ...base, status: "loading", detail: "Wird geprüft …" } + return ok + ? { ...base, status: "ok", detail: "Merkt sich Neues und findet Altes wieder." } + : { + ...base, + status: "down", + detail: "Lucy kann sich gerade nichts merken — das Gedächtnis antwortet nicht.", + repair: { kind: "restart", service: "mem0-service", label: "Gedächtnis neu starten" }, + } + })()) + + // 3) Verbindung (Gateway) — der integrierte OpenAI-Gateway, über den Apps/IDEs Lucy erreichen. + checks.push(((): LucyCheck => { + const base = { id: "gateway", label: "Verbindung (Gateway)", icon: Plug, critical: true } + const ok = health ? health.gateway_reachable : svcOk("integriert") + if (!loaded || ok === undefined) return { ...base, status: "loading", detail: "Wird geprüft …" } + return ok + ? { ...base, status: "ok", detail: "Apps und IDEs können Lucy erreichen." } + : { + ...base, + status: "down", + detail: "Die Verbindungs-Zentrale antwortet nicht — Apps erreichen Lucy nicht.", + repair: { kind: "restart", service: "mission-control-2", label: "Zentrale neu starten" }, + } + })()) + + // 4) Lucys Agent (Hermes) — der Dienst, der als Lucy antwortet (Terminal/Telegram/Sprechen). + checks.push(((): LucyCheck => { + const base = { id: "agent", label: "Lucys Agent (Hermes)", icon: Bot, critical: true } + const ok = svcOk("hermes-gateway") + if (!loaded || ok === undefined) return { ...base, status: "loading", detail: "Wird geprüft …" } + return ok + ? { ...base, status: "ok", detail: "Lucy ist bereit zu reden und zu handeln." } + : { + ...base, + status: "down", + detail: "Lucys Agent ist offline — sie reagiert gerade nicht.", + repair: { kind: "restart", service: "hermes-gateway", label: "Agent neu starten" }, + } + })()) + + // 5) Lucys Stimme — Voice-Dienst (STT/TTS). Nicht kritisch: Chat geht auch ohne. + checks.push(((): LucyCheck => { + const base = { id: "voice", label: "Lucys Stimme", icon: Mic, critical: false } + const ok = svcOk("voice") + if (!loaded || ok === undefined) return { ...base, status: "loading", detail: "Wird geprüft …" } + return ok + ? { ...base, status: "ok", detail: "Lucy kann hören und sprechen." } + : { + ...base, + status: "warn", + detail: "Sprechen ist gerade aus — Tippen geht weiter normal.", + repair: { kind: "restart", service: "voice-service", label: "Stimme neu starten" }, + } + })()) + + // Speicher-Ampel aus dem echten GTT-Pool (unified RAM inkl. KV-Cache). + const total = sys?.gpu?.gtt_total || sys?.gpu?.vram_total || 0 + const used = sys?.gpu?.gtt_used || 0 + const pct = total > 0 ? Math.min(100, (used / total) * 100) : 0 + const B = 1024 ** 3 + const memory: MemoryAmpel = !total + ? { status: "unknown", usedGb: 0, totalGb: 0, pct: 0, text: "Speicher-Auslastung unbekannt." } + : pct >= 90 + ? { status: "full", usedGb: used / B, totalGb: total / B, pct, text: "Speicher fast voll — Lucy könnte langsamer werden." } + : pct >= 72 + ? { status: "warn", usedGb: used / B, totalGb: total / B, pct, text: "Speicher gut gefüllt — noch okay." } + : { status: "ok", usedGb: used / B, totalGb: total / B, pct, text: "Genug Speicher frei." } + + const anyLoading = checks.some((c) => c.status === "loading") + const problems = checks.filter((c) => c.critical && c.status === "down") + const warns = checks.filter((c) => c.status === "warn" || (!c.critical && c.status === "down")) + const memBad = memory.status === "full" + + const verdict: Verdict = anyLoading && !problems.length + ? "loading" + : problems.length + ? "problem" + : warns.length || memBad + ? "warn" + : "gut" + + return { verdict, checks, memory, problems } +} diff --git a/frontend/src/lib/voice/audio.ts b/frontend/src/lib/voice/audio.ts deleted file mode 100644 index 31a8123..0000000 --- a/frontend/src/lib/voice/audio.ts +++ /dev/null @@ -1,103 +0,0 @@ -// Sequentielle Audio-Wiedergabe für die TTS-Antworten + Pegel-Messung fürs Lippensync. -// -// Die einzelnen Satz-WAVs kommen nacheinander rein (satzweise Synthese → niedrige Latenz). -// Wir spielen sie über EINEN AudioContext geordnet ab und hängen einen AnalyserNode dazwischen, -// dessen Energie pro Frame in `level.current` (0..1) landet — der 3D-Avatar liest das im -// useFrame und öffnet den Mund entsprechend. Kein Re-Render pro Frame (Mutable-Ref-Muster). - -export class AudioQueue { - private ctx: AudioContext - private analyser: AnalyserNode - private gain: GainNode - private queue: ArrayBuffer[] = [] - private playing = false - private raf = 0 - private freq: Uint8Array - /** Mutable, vom Avatar pro Frame gelesen. 0 = Mund zu, 1 = weit offen. */ - readonly level = { current: 0 } - onSpeaking?: (speaking: boolean) => void - - /** Lautstärke 0..1.5 aus localStorage (Default 0.6 — die Stimmen waren zu laut). */ - static readVolume(): number { - const raw = localStorage.getItem("mc_voice_volume") - if (raw === null || raw === "") return 0.6 // Number(null)===0 → sonst aus Versehen stumm - const v = Number(raw) - return Number.isNaN(v) ? 0.6 : Math.max(0, Math.min(1.5, v)) - } - - constructor() { - const Ctor = window.AudioContext || (window as any).webkitAudioContext - this.ctx = new Ctor() - this.analyser = this.ctx.createAnalyser() - this.analyser.fftSize = 256 - this.analyser.smoothingTimeConstant = 0.6 - // Kette: Quelle → Analyser (Lippensync liest vollen Pegel) → Gain (Lautstärke) → Ausgang. - this.gain = this.ctx.createGain() - this.gain.gain.value = AudioQueue.readVolume() - this.analyser.connect(this.gain) - this.gain.connect(this.ctx.destination) - this.freq = new Uint8Array(new ArrayBuffer(this.analyser.frequencyBinCount)) - // Live-Lautstärke vom Slider. - window.addEventListener("mc-voice-volume", (e: Event) => { - const v = Number((e as CustomEvent).detail) - if (!Number.isNaN(v)) this.gain.gain.value = Math.max(0, Math.min(1.5, v)) - }) - } - - async enqueue(buf: ArrayBuffer) { - this.queue.push(buf) - if (!this.playing) await this.playNext() - } - - /** Laufende + wartende Wiedergabe verwerfen (z.B. wenn der Nutzer dazwischenredet). */ - clear() { - this.queue = [] - } - - private async playNext(): Promise { - const buf = this.queue.shift() - if (!buf) { - this.playing = false - this.stopMeter() - this.onSpeaking?.(false) - return - } - this.playing = true - this.onSpeaking?.(true) - if (this.ctx.state === "suspended") { - try { await this.ctx.resume() } catch { /* vom User-Gesture freigeschaltet */ } - } - let audioBuf: AudioBuffer - try { - audioBuf = await this.ctx.decodeAudioData(buf.slice(0)) - } catch { - return this.playNext() // kaputtes Segment überspringen - } - const src = this.ctx.createBufferSource() - src.buffer = audioBuf - src.connect(this.analyser) - src.onended = () => { void this.playNext() } - src.start() - this.startMeter() - } - - private startMeter() { - cancelAnimationFrame(this.raf) - const tick = () => { - this.analyser.getByteFrequencyData(this.freq) - // Sprachenergie liegt v.a. in den unteren/mittleren Bändern. - const n = Math.min(this.freq.length, 48) - let sum = 0 - for (let i = 2; i < n; i++) sum += this.freq[i] - const avg = sum / (n - 2) / 255 - this.level.current = Math.min(1, avg * 1.9) - this.raf = requestAnimationFrame(tick) - } - tick() - } - - private stopMeter() { - cancelAnimationFrame(this.raf) - this.level.current = 0 - } -} diff --git a/frontend/src/lib/voice/sentiment.ts b/frontend/src/lib/voice/sentiment.ts deleted file mode 100644 index 993fbed..0000000 --- a/frontend/src/lib/voice/sentiment.ts +++ /dev/null @@ -1,17 +0,0 @@ -// Leichtgewichtige Stimmungs-Heuristik (v1) → treibt die Avatar-Mimik. -// Bewusst simpel/regelbasiert (kein Modell): mappt deutschen Antworttext auf eine VRM-Expression. -// Spätere Stufe: echte Hermes-Emotion/Audio-Tags. Siehe Plan. - -export type Emotion = "neutral" | "happy" | "angry" | "sad" | "surprised" | "relaxed" - -const RULES: [Emotion, RegExp][] = [ - ["happy", /(super|toll|klasse|freu|cool|prima|perfekt|danke|großartig|wunderbar|gerne|haha|:\)|😊|😄|🎉)/i], - ["surprised", /(wow|wirklich\?|krass|unglaublich|echt\?|tatsächlich|\?!|!\?|oha)/i], - ["angry", /(fehler|kaputt|mist|verdammt|nervt|schlecht|problem|ärgerlich|leider nicht|geht nicht)/i], - ["sad", /(leider|schade|traurig|tut mir leid|entschuldigung|sorry|bedauere)/i], -] - -export function sentimentToEmotion(text: string): Emotion { - for (const [emo, rx] of RULES) if (rx.test(text)) return emo - return "neutral" -} diff --git a/frontend/src/lib/voice/usePushToTalk.ts b/frontend/src/lib/voice/usePushToTalk.ts deleted file mode 100644 index e68a792..0000000 --- a/frontend/src/lib/voice/usePushToTalk.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { useCallback, useEffect, useRef, useState } from "react" - -// Push-to-talk-Aufnahme über MediaRecorder. `start` beim Drücken (Taste/Button), `stop` beim -// Loslassen → fertiges Audio-Blob (webm/opus) geht an `onAudio`. Bewusst minimal & generisch. -export function usePushToTalk(onAudio: (blob: Blob) => void) { - const [recording, setRecording] = useState(false) - const recRef = useRef(null) - const chunksRef = useRef([]) - const streamRef = useRef(null) - - const start = useCallback(async () => { - if (recRef.current) return - let stream: MediaStream - try { - stream = await navigator.mediaDevices.getUserMedia({ audio: true }) - } catch (e) { - console.error("Mikrofon-Zugriff verweigert:", e) - return - } - streamRef.current = stream - const mime = MediaRecorder.isTypeSupported("audio/webm;codecs=opus") - ? "audio/webm;codecs=opus" - : "audio/webm" - const rec = new MediaRecorder(stream, { mimeType: mime }) - chunksRef.current = [] - rec.ondataavailable = (e) => { if (e.data.size) chunksRef.current.push(e.data) } - rec.onstop = () => { - const blob = new Blob(chunksRef.current, { type: mime }) - streamRef.current?.getTracks().forEach((t) => t.stop()) - streamRef.current = null - recRef.current = null - setRecording(false) - if (blob.size > 1200) onAudio(blob) // Mini-Blobs (Versehen) ignorieren - } - rec.start() - recRef.current = rec - setRecording(true) - }, [onAudio]) - - const stop = useCallback(() => { - recRef.current?.stop() - }, []) - - useEffect(() => () => { - recRef.current?.stop() - streamRef.current?.getTracks().forEach((t) => t.stop()) - }, []) - - return { recording, start, stop } -} diff --git a/frontend/src/lib/voice/useVoiceAgent.ts b/frontend/src/lib/voice/useVoiceAgent.ts deleted file mode 100644 index a4f3ae9..0000000 --- a/frontend/src/lib/voice/useVoiceAgent.ts +++ /dev/null @@ -1,237 +0,0 @@ -import { useCallback, useEffect, useRef, useState } from "react" -import { usePushToTalk } from "./usePushToTalk" -import { AudioQueue } from "./audio" -import { sentimentToEmotion, type Emotion } from "./sentiment" - -// Orchestriert die ganze Voll-Duplex-Schleife im Browser: -// PTT-Audio → /api/voice/stt → User-Text -// → /api/voice/chat (SSE vom Hermes-Agenten, server-seitiger Verlauf via Session-Id) -// → Antwort satzweise schneiden → /api/voice/tts je Satz → AudioQueue (Abspielen + Lippensync) -// → Stimmung aus dem Antworttext → Avatar-Mimik -// -// Avatar-Anbindung ohne Re-Render: `audioLevel` (Mundöffnung) und `emotion` sind Mutable-Refs, -// die der 3D-Avatar pro Frame liest. - -export type VoiceStatus = "idle" | "listening" | "transcribing" | "thinking" | "speaking" | "error" -export interface ChatMsg { role: "user" | "assistant"; text: string } - -const SYSTEM_PROMPT = - "Du sprichst per Sprache mit dem Nutzer. Antworte natürlich, freundlich und KNAPP in ganzen, " + - "gut vorlesbaren Sätzen. Kein Markdown, keine Codeblöcke, keine Aufzählungszeichen, keine Emojis — " + - "reiner Fließtext, den man laut vorlesen kann. Verwende IMMER echte deutsche Umlaute (ä, ö, ü, ß) " + - "und NIEMALS Umschreibungen wie ae, oe, ue oder ss. Nenne möglichst keine langen URLs oder Codebefehle." - -// Entfernt, was nicht vorgelesen werden soll (Links, Markdown, Code, Emojis), bevor der Satz ans TTS geht. -// Die Anzeige im Chat bleibt unangetastet — nur die gesprochene Fassung wird gesäubert. -function cleanForTTS(s: string): string { - return s - .replace(/```[\s\S]*?```/g, " ") // Codeblöcke - .replace(/`([^`]*)`/g, "$1") // Inline-Code - .replace(/\[([^\]]+)\]\([^)]+\)/g, "$1") // [Text](url) → Text - .replace(/https?:\/\/\S+/gi, " ") // URLs - .replace(/www\.\S+/gi, " ") - .replace(/\b\S+@\S+\.\S+\b/g, " ") // E-Mails - .replace(/[*_#>~|`]+/g, " ") // Markdown-Zeichen - .replace(/^\s*[-•·]\s+/gm, " ") // Listen-Bullets - // Sonderzeichen aussprechbar machen (sonst liest die Stimme sie wörtlich/komisch): - .replace(/\s*&\s*/g, " und ") - .replace(/(\d)\s*%/g, "$1 Prozent").replace(/%/g, " Prozent ") - .replace(/(\d)\s*°\s*C?/g, "$1 Grad").replace(/°/g, " Grad ") - .replace(/\s*=\s*/g, " gleich ") - .replace(/\s*\/\s*/g, " ") // Schrägstriche → Pause statt „Schrägstrich" - .replace(/[\u{1F300}-\u{1FAFF}\u{2600}-\u{27BF}\u{2190}-\u{21FF}\u{2B00}-\u{2BFF}]/gu, "") // Emojis/Symbole - .replace(/\s+/g, " ") - .trim() -} - -function getSessionId(): string { - let id = localStorage.getItem("mc_voice_session") - if (!id) { - id = "voice-" + Math.random().toString(36).slice(2) + Date.now().toString(36) - localStorage.setItem("mc_voice_session", id) - } - return id -} - -function readSettings() { - return { - engine: localStorage.getItem("mc_voice_engine") || "elevenlabs", - voice: localStorage.getItem("mc_voice_voice") || "", - } -} - -// Zerlegt einen wachsenden Text-Stream in fertige Sätze. Gibt komplette Sätze zurück und behält -// den unvollständigen Rest. So kann das erste TTS schon starten, bevor die Antwort fertig ist. -function splitSentences(buffer: string): { sentences: string[]; rest: string } { - const sentences: string[] = [] - const rx = /[^.!?…]+[.!?…]+(\s|$)/g - let last = 0 - let m: RegExpExecArray | null - while ((m = rx.exec(buffer))) { - sentences.push(m[0].trim()) - last = rx.lastIndex - } - return { sentences, rest: buffer.slice(last) } -} - -export function useVoiceAgent() { - const [status, setStatus] = useState("idle") - const [messages, setMessages] = useState([]) - const [error, setError] = useState(null) - - const audioLevel = useRef({ current: 0 }) // wird gleich auf die Queue-Pegel gezeigt - const emotion = useRef("neutral") - const queueRef = useRef(null) - const sessionId = useRef(getSessionId()) - - // AudioQueue erst bei Bedarf (nach User-Geste) erzeugen — Autoplay-Policy. - const ensureQueue = useCallback(() => { - if (!queueRef.current) { - const q = new AudioQueue() - q.onSpeaking = (sp) => setStatus((s) => (sp ? "speaking" : s === "speaking" ? "idle" : s)) - queueRef.current = q - audioLevel.current = q.level // Avatar liest ab jetzt echte Pegel - } - return queueRef.current - }, []) - - const handleAudio = useCallback(async (blob: Blob) => { - setError(null) - const queue = ensureQueue() - queue.clear() // evtl. laufende Antwort abbrechen (Barge-in) - - // 1) STT - setStatus("transcribing") - let userText = "" - try { - const fd = new FormData() - fd.append("audio", blob, "rec.webm") - const r = await fetch("/api/voice/stt", { method: "POST", body: fd }) - if (!r.ok) throw new Error(`STT ${r.status}`) - userText = (await r.json()).text?.trim() || "" - } catch (e: any) { - setStatus("error"); setError(`Spracherkennung fehlgeschlagen: ${e.message}`); return - } - if (!userText) { setStatus("idle"); return } - setMessages((m) => [...m, { role: "user", text: userText }]) - - // 2) Chat (SSE) → 3) satzweises TTS - setStatus("thinking") - const { engine, voice } = readSettings() - let assistant = "" - let pending = "" - setMessages((m) => [...m, { role: "assistant", text: "" }]) - - // TTS SERIELL abarbeiten (Satz für Satz), nicht parallel: Chatterbox ist nicht thread-safe - // (parallele Generierungen → 502) und Cloud-Engines mögen keine gleichzeitigen Calls. Hält - // außerdem die Reihenfolge. Die Audio-Wiedergabe selbst puffert die AudioQueue. - let ttsChain: Promise = Promise.resolve() - let spokeAny = false - let ttsFailed = false - const speak = (sentence: string) => { - const spoken = cleanForTTS(sentence) - if (!spoken) return // z.B. ein Satz, der nur aus einer URL bestand - ttsChain = ttsChain.then(async () => { - try { - const r = await fetch("/api/voice/tts", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ text: spoken, engine, voice }), - }) - if (!r.ok) throw new Error(`TTS ${r.status}`) - await queue.enqueue(await r.arrayBuffer()) - spokeAny = true - } catch (e) { - ttsFailed = true - console.error("TTS-Fehler:", e) - } - }) - } - - try { - const r = await fetch("/api/voice/chat", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ - text: userText, - session_id: sessionId.current, - system: SYSTEM_PROMPT, - }), - }) - if (!r.ok || !r.body) throw new Error(`Agent ${r.status}`) - - const reader = r.body.getReader() - const dec = new TextDecoder() - let sse = "" - for (;;) { - const { done, value } = await reader.read() - if (done) break - sse += dec.decode(value, { stream: true }) - const events = sse.split("\n\n") - sse = events.pop() || "" - for (const ev of events) { - const line = ev.split("\n").find((l) => l.startsWith("data:")) - if (!line) continue - const data = line.slice(5).trim() - if (data === "[DONE]") continue - let json: any - try { json = JSON.parse(data) } catch { continue } - if (json.error) throw new Error(json.error) - const delta = json.choices?.[0]?.delta?.content || "" - if (!delta) continue - assistant += delta - pending += delta - emotion.current = sentimentToEmotion(assistant) - setMessages((m) => { - const copy = m.slice() - copy[copy.length - 1] = { role: "assistant", text: assistant } - return copy - }) - const { sentences, rest } = splitSentences(pending) - pending = rest - sentences.forEach(speak) - } - } - if (pending.trim()) speak(pending) // Rest (letzter Satz ohne Satzzeichen) - await ttsChain // auf alle (seriellen) TTS-Calls warten - if (!assistant.trim()) { setStatus("idle"); return } - // Nichts abgespielt → nicht ewig bei „denkt" hängen, Fehler zeigen. - if (!spokeAny) { - setStatus("error") - setError(ttsFailed ? "Sprachausgabe fehlgeschlagen — Engine/Stimme prüfen." : "Keine Sprachausgabe erzeugt.") - } - } catch (e: any) { - setStatus("error"); setError(`Agent-Antwort fehlgeschlagen: ${e.message}`) - } - }, [ensureQueue]) - - const { recording, start, stop } = usePushToTalk(handleAudio) - - const pressStart = useCallback(() => { - ensureQueue() - setStatus("listening") - void start() - }, [ensureQueue, start]) - - const pressEnd = useCallback(() => { stop() }, [stop]) - - const reset = useCallback(() => { - queueRef.current?.clear() - setMessages([]) - setError(null) - setStatus("idle") - localStorage.removeItem("mc_voice_session") - sessionId.current = getSessionId() - }, []) - - // Leerlauf-Status zurücksetzen, wenn nichts mehr spricht/aufnimmt. - useEffect(() => { - if (!recording && (status === "listening")) setStatus("transcribing") - }, [recording, status]) - - return { - status, messages, error, recording, - audioLevel, emotion, - pressStart, pressEnd, reset, - } -} diff --git a/frontend/src/mc3/Mc3App.tsx b/frontend/src/mc3/Mc3App.tsx new file mode 100644 index 0000000..ccfcd52 --- /dev/null +++ b/frontend/src/mc3/Mc3App.tsx @@ -0,0 +1,90 @@ +import { useEffect, useState } from "react" +import { Activity, Code, Bookmark, Wrench, ArrowLeft, type LucideIcon } from "lucide-react" +import { ConnectView } from "@/views/ConnectView" +import { MemoryView } from "@/views/MemoryView" +import { SystemDrawer } from "@/components/SystemDrawer" +import { useHealth } from "@/lib/queries" +import { cn } from "@/lib/utils" +import { Mc3Start } from "./Mc3Start" +import { Mc3Maschinenraum } from "./Mc3Maschinenraum" + +// MC3-Prototyp-Schale. Läuft nicht-destruktiv unter #mc3, das produktive MC2 bleibt +// unangetastet. Vier Türen; Innereien sind bewusst die bestehenden, bewährten Views. +type Door = "start" | "vibe" | "konstitution" | "maschinenraum" + +const DOORS: { id: Door; label: string; icon: LucideIcon }[] = [ + { id: "start", label: "Start", icon: Activity }, + { id: "vibe", label: "Vibe-Coding", icon: Code }, + { id: "konstitution", label: "Konstitution", icon: Bookmark }, + { id: "maschinenraum", label: "Maschinenraum", icon: Wrench }, +] + +export function Mc3App() { + const [door, setDoor] = useState("start") + const [drawerOpen, setDrawerOpen] = useState(false) + const [drawerTab, setDrawerTab] = useState<"maintenance" | "logs">("maintenance") + const { data: health } = useHealth() + + useEffect(() => { + const onOpen = (e: Event) => { + setDrawerTab(((e as CustomEvent).detail?.tab as "maintenance" | "logs") || "maintenance") + setDrawerOpen(true) + } + window.addEventListener("open-system-drawer", onOpen) + return () => window.removeEventListener("open-system-drawer", onOpen) + }, []) + + const boxOk = health && health.engine_reachable && (health.brain ? health.brain.ready : true) + + return ( +
+ + ) +} diff --git a/frontend/src/mc3/Mc3Maschinenraum.tsx b/frontend/src/mc3/Mc3Maschinenraum.tsx new file mode 100644 index 0000000..747a4c8 --- /dev/null +++ b/frontend/src/mc3/Mc3Maschinenraum.tsx @@ -0,0 +1,60 @@ +import { useState } from "react" +import { Cpu, ShieldCheck, Bot, ChevronRight, ArrowLeft } from "lucide-react" +import { Cockpit } from "@/views/models/Cockpit" +import { AgentView } from "@/views/AgentView" +import { ExpertToggle } from "@/components/ExpertToggle" + +// Maschinenraum = die eine Tür für alles Technische. Faltet Modelle/Wartung/Hermes +// zusammen; jede Sektion rendert die BESTEHENDE, bewährte View wieder. +function SectionCard({ icon: Icon, title, sub, onClick }: { + icon: any; title: string; sub: string; onClick: () => void +}) { + return ( + + ) +} + +export function Mc3Maschinenraum() { + const [section, setSection] = useState(null) + + if (section) { + return ( +
+ + {section === "modelle" ? : } +
+ ) + } + + return ( +
+
+
+

+ Maschinenraum +

+

Nur nötig, wenn du wirklich was ändern willst.

+
+ +
+ + setSection("modelle")} /> + window.dispatchEvent(new CustomEvent("open-system-drawer", { detail: { tab: "maintenance" } }))} /> + setSection("hermes")} /> +
+ ) +} diff --git a/frontend/src/mc3/Mc3Start.tsx b/frontend/src/mc3/Mc3Start.tsx new file mode 100644 index 0000000..9f964f8 --- /dev/null +++ b/frontend/src/mc3/Mc3Start.tsx @@ -0,0 +1,95 @@ +import { ArrowUpCircle, ChevronRight, Check, Cpu, Code } from "lucide-react" +import { LucyHealthCard } from "@/components/dashboard/LucyHealthCard" +import { SystemStatusCard } from "@/components/dashboard/SystemStatusCard" +import { TokenPerformanceCard } from "@/components/dashboard/TokenPerformanceCard" +import { VoiceLatencyCard } from "@/components/dashboard/VoiceLatencyCard" +import { useUpdates, useModels } from "@/lib/queries" +import { cn } from "@/lib/utils" + +// MC3-Startseite = der eine „Basisstation"-Blick: Ampel (wiederverwendet) + Updates +// (klickbar) + was gerade läuft + die geschätzte Telemetrie (System/Token/Sprach-Latenz). +// Bewusst KEINE Wärme/Platte/Speicher-Kacheln — die stehen schon im System-Status. +export function Mc3Start() { + const { data: updates } = useUpdates(30_000) + const { data: modelsResp } = useModels() + + const upCount = (updates?.os || 0) + (updates?.engine || 0) + (updates?.swap || 0) + (updates?.models || 0) + const openUpdates = () => window.dispatchEvent(new CustomEvent("open-system-drawer", { detail: { tab: "maintenance" } })) + + const models = modelsResp?.models ?? [] + const running = modelsResp?.running ?? [] + const brain = models.find((m) => m.role === "hermes") + const coder = models.find((m) => m.role === "coder-lite") || models.find((m) => m.role === "coder") + const isWarm = (name?: string) => (name ? running.includes(name) : false) + const shortName = (n?: string) => n?.split("/").pop()?.replace(/\.gguf$/i, "") || "—" + + return ( +
+
+

+ Basisstation +

+

Geht's der Box gut, gibt's Updates, was läuft gerade.

+
+ + {/* Gesamt-Ampel + Fähigkeiten + Speicher (voll wiederverwendet, Box-Rahmen) */} + + + {/* Updates — klickbar, führt direkt zur Liste, was aktualisiert wird */} + + + {/* Was gerade läuft — beide Lanes */} +
+
Was gerade läuft
+
+ {[ + { icon: Cpu, label: "Lucys Hirn", model: brain?.name, warm: isWarm(brain?.name) }, + { icon: Code, label: "Coder (Vibe-Coding)", model: coder?.name, warm: isWarm(coder?.name) }, + ].map((r) => ( +
+ + + {r.label} + {shortName(r.model)} + + {r.model ? (r.warm ? "warm" : "bereit") : "nicht gesetzt"} + +
+ ))} +
+
+ + {/* Geschätzte Telemetrie — 1:1 aus MC2 übernommen */} +
+ + +
+ +
+ ) +} diff --git a/frontend/src/nav.ts b/frontend/src/nav.ts index 62e551b..6dd132b 100644 --- a/frontend/src/nav.ts +++ b/frontend/src/nav.ts @@ -6,11 +6,10 @@ import { Bot, TerminalSquare, HelpCircle, - Mic, type LucideIcon, } from "lucide-react" -export type ViewId = "dashboard" | "models" | "memory" | "connect" | "agent" | "terminal" | "voice" | "guide" +export type ViewId = "dashboard" | "models" | "memory" | "connect" | "agent" | "terminal" | "guide" export interface NavItem { id: ViewId @@ -27,7 +26,6 @@ export const NAV: NavItem[] = [ { id: "connect", label: "Verbinden", hint: "IDE-/Agent-Configs erzeugen", icon: Plug }, { id: "agent", label: "Hermes", hint: "Agent-Status & Verdrahtung", icon: Bot }, { id: "terminal", label: "Terminal", hint: "Interaktives Hermes-Agent-Terminal", icon: TerminalSquare }, - { id: "voice", label: "Sprechen", hint: "Mit Hermes per Sprache reden (3D-Avatar)", icon: Mic }, { id: "guide", label: "Anleitung", hint: "Einrichten & Vibe-Coding", icon: HelpCircle }, ] diff --git a/frontend/src/views/DashboardView.tsx b/frontend/src/views/DashboardView.tsx index ca86dd3..ff3c9db 100644 --- a/frontend/src/views/DashboardView.tsx +++ b/frontend/src/views/DashboardView.tsx @@ -6,6 +6,7 @@ import { TokenPerformanceCard } from "@/components/dashboard/TokenPerformanceCar import { ServicesCard } from "@/components/dashboard/ServicesCard" import { VoiceLatencyCard } from "@/components/dashboard/VoiceLatencyCard" import { ModelsCard } from "@/components/dashboard/ModelsCard" +import { LucyHealthCard } from "@/components/dashboard/LucyHealthCard" function ZoneLabel({ children }: { children: React.ReactNode }) { return

{children}

@@ -21,6 +22,9 @@ export function DashboardView() {

Aktueller Status von System, Modellen und Agent.

+ {/* „Geht's Lucy gut?" — Klartext-Ampel + 1-Klick-Reparatur, ganz oben. */} + + {/* Hero-Banner — System, Durchsatz, Modelle (Rollen + warm + Inferenz in einer Karte) */}
diff --git a/frontend/src/views/VoiceView.tsx b/frontend/src/views/VoiceView.tsx deleted file mode 100644 index 7d4e5e2..0000000 --- a/frontend/src/views/VoiceView.tsx +++ /dev/null @@ -1,155 +0,0 @@ -import { useEffect, useRef } from "react" -import { Mic, RotateCcw, Loader2, Volume2 } from "lucide-react" -import { Avatar3D } from "@/components/voice/Avatar3D" -import { VoiceControls } from "@/components/voice/AvatarPicker" -import { useVoiceAgent } from "@/lib/voice/useVoiceAgent" -import { cn } from "@/lib/utils" - -// Fester Avatar (das eine, gewählte VRM). Liegt unter frontend/public/avatar.vrm → /avatar.vrm. -const FIXED_AVATAR = "/avatar.vrm" - -// **fett** als echte Fettschrift rendern (Rest als Text; Zeilenumbrüche via whitespace-pre-wrap). -function renderRich(text: string) { - return text.split(/(\*\*[^*\n]+\*\*)/g).map((p, i) => { - const m = p.match(/^\*\*([^*]+)\*\*$/) - return m ? {m[1]} : {p} - }) -} - -// Kleiner Tipp-Indikator („Hermes schreibt …"). -function Dots() { - return ( - - {[0, 1, 2].map((i) => ( - - ))} - - ) -} - -const STATUS_LABEL: Record = { - idle: "Bereit — halte zum Sprechen", - listening: "Höre zu …", - transcribing: "Verstehe …", - thinking: "Hermes denkt …", - speaking: "Hermes spricht …", - error: "Fehler", -} - -export function VoiceView() { - const { status, messages, error, recording, audioLevel, emotion, pressStart, pressEnd, reset } = - useVoiceAgent() - - const holding = useRef(false) - const convEndRef = useRef(null) - - // Gespräch automatisch nach unten scrollen, wenn neue Tokens/Nachrichten kommen. - useEffect(() => { - convEndRef.current?.scrollIntoView({ behavior: "smooth", block: "end" }) - }, [messages]) - - // Push-to-talk per Leertaste (solange der Sprechen-Tab fokussiert ist und kein Eingabefeld aktiv). - useEffect(() => { - const isField = (el: EventTarget | null) => - el instanceof HTMLElement && /^(INPUT|TEXTAREA|SELECT)$/.test(el.tagName) - const down = (e: KeyboardEvent) => { - if (e.code !== "Space" || e.repeat || holding.current || isField(e.target)) return - e.preventDefault(); holding.current = true; pressStart() - } - const up = (e: KeyboardEvent) => { - if (e.code !== "Space" || !holding.current) return - e.preventDefault(); holding.current = false; pressEnd() - } - window.addEventListener("keydown", down) - window.addEventListener("keyup", up) - return () => { window.removeEventListener("keydown", down); window.removeEventListener("keyup", up) } - }, [pressStart, pressEnd]) - - const speaking = status === "speaking" - const busy = status === "transcribing" || status === "thinking" - - return ( -
- {/* Avatar-Bühne */} -
-
- -
- - {/* Status + Push-to-talk */} -
-
- {busy && } - {speaking && } - {error || STATUS_LABEL[status]} -
- - -
- Halten zum Sprechen · Leertaste geht auch -
-
-
- - {/* Seitenspalte: Einstellungen + Transcript */} -
-
- -
- -
-
- Gespräch - -
-
- {messages.length === 0 && ( -

- Halte den Knopf (oder die Leertaste) und sprich. Hermes hört zu, denkt mit seinem - vollen Gedächtnis und seinen Werkzeugen — und antwortet hörbar. -

- )} - {messages.map((m, i) => ( -
- - {m.role === "user" ? "Du" : "Hermes"} - -
- {m.text ? renderRich(m.text) : } -
-
- ))} -
-
-
-
-
- ) -} diff --git a/frontend/src/views/models/Cockpit.tsx b/frontend/src/views/models/Cockpit.tsx index fc24a4c..1acda08 100644 --- a/frontend/src/views/models/Cockpit.tsx +++ b/frontend/src/views/models/Cockpit.tsx @@ -6,9 +6,11 @@ import { useDialog } from "@/lib/useDialog" import { CapsChips } from "@/components/CapsChips" import { cn } from "@/lib/utils" import { fmtSize, fmtCtx } from "@/lib/format" -import { getBrandInfo, roleTone, ROLES } from "@/components/models/ModelBadges" +import { getBrandInfo, ROLES, RoleLabel, roleMeta } from "@/components/models/ModelBadges" import { SpecDraftModal } from "@/components/models/SpecDraftModal" import { LaneEditor } from "@/components/models/LaneEditor" +import { WarmSetManager } from "@/components/models/WarmSetManager" +import { useExpertMode } from "@/lib/useExpertMode" export function Cockpit() { const qc = useQueryClient() @@ -18,6 +20,10 @@ export function Cockpit() { const { data: sysStatus } = useSystemStatus() const { data: groupsResp } = useGroups() const { showAlert, showConfirm, showPrompt, dialogElement } = useDialog() + const expert = useExpertMode() + // Schutzgeländer: Modelle in einer lebenswichtigen Rolle (Hirn/Gedächtnis) dürfen + // nicht gelöscht/entladen werden. Das `protected`-Flag kommt zentral aus roleMeta. + const isProtected = (role?: string | null) => !!roleMeta(role).protected const models = modelsResp?.models ?? [] const running = modelsResp?.running ?? [] const error = loadErr ? String(loadErr) : "" @@ -88,6 +94,11 @@ export function Cockpit() { } async function handleUnloadModel(name: string) { + const m = models.find((x) => x.name === name) + if (m && isProtected(m.role)) { + showAlert("Geschützt", `„${roleMeta(m.role).label}" ist lebenswichtig für Lucy und bleibt geladen. Zum Entladen erst im Experten-Modus die Rolle einem anderen Modell geben.`) + return + } try { await api(`/api/models/${encodeURIComponent(name)}/unload`, { method: "POST" }) reload() @@ -164,6 +175,11 @@ export function Cockpit() { } async function handleDelete(name: string) { + const m = models.find((x) => x.name === name) + if (m && isProtected(m.role)) { + showAlert("Geschützt", `„${roleMeta(m.role).label}" ist lebenswichtig für Lucy und kann nicht gelöscht werden. Weise die Rolle zuerst einem anderen Modell zu.`) + return + } showConfirm( "Modell löschen?", `Modell '${name}' und alle zugehörigen GGUF-Dateien unwiderruflich von der Box löschen?`, @@ -258,7 +274,7 @@ export function Cockpit() { Speicher-Pool: {fmtSize(totalRunningSize)} Gewichte{gttUsed > 0 ? ` · ${fmtSize(gttUsed)} real belegt (inkl. KV)` : ""} / {fmtSize(capacity)} - {running.length > 0 && ( + {expert && running.length > 0 && (
@@ -305,13 +321,16 @@ export function Cockpit() {
- {/* ZONE B.4: Lane-Routing & Policy (UI-editierbar, hot-reload) */} - + {/* ZONE B.3: Immer-bereit-Set (Warm-Set / brains-Gruppe) — in Klartext, mit Budget */} + + + {/* ZONE B.4: Lane-Routing & Policy (UI-editierbar, hot-reload) — Experten-Detail */} + {expert && } {/* ZONE B.5: Slot-Belegung */}
- Gateway Steckplatz-Belegung (Slot-Zuweisung) + {expert ? "Gateway Steckplatz-Belegung (Slot-Zuweisung)" : "Wer macht was bei Lucy — zum Ändern antippen"}
{ROLES.map((role) => { @@ -332,8 +351,7 @@ export function Cockpit() { )} >
- {role} + {isWarm && }
@@ -525,22 +543,23 @@ export function Cockpit() { Warm )} - {m.role && ( - - {m.role} + {m.role && } + {isProtected(m.role) && ( + + 🔒 geschützt )} - {isCoresident(m.name) && ( + {expert && isCoresident(m.name) && ( 🧠 Ko-resident )} - {m.prompt_cache && ( + {expert && m.prompt_cache && ( PC )} - {m.spec_active ? ( + {expert && (m.spec_active ? ( SPEC @@ -548,8 +567,8 @@ export function Cockpit() { SPEC? - ) : null} - {m.parallel_slots > 1 && ( + ) : null)} + {expert && m.parallel_slots > 1 && ( SLOTS: {m.parallel_slots} @@ -606,28 +625,38 @@ export function Cockpit() { {/* Actions row at the bottom of Grid Card */}
+ {(() => { + const prot = isProtected(m.role) + const lockUnload = isRunning && prot + const disabled = (m.incomplete && !isRunning) || lockUnload + return ( - - {brainsGroup && ( + ) + })()} + {expert && ( + + )} + {expert && brainsGroup && ( )} - + {expert && ( + + )} @@ -705,22 +743,23 @@ export function Cockpit() {

{m.name.split("/").pop()}

- {m.role && ( - - {m.role} + {m.role && } + {isProtected(m.role) && ( + + 🔒 geschützt )} - {isCoresident(m.name) && ( + {expert && isCoresident(m.name) && ( 🧠 Ko-resident )} - {m.prompt_cache && ( + {expert && m.prompt_cache && ( PC )} - {m.spec_active ? ( + {expert && (m.spec_active ? ( SPEC @@ -728,8 +767,8 @@ export function Cockpit() { SPEC? - ) : null} - {m.parallel_slots > 1 && ( + ) : null)} + {expert && m.parallel_slots > 1 && ( SLOTS: {m.parallel_slots} @@ -762,28 +801,38 @@ export function Cockpit() {
+ {(() => { + const prot = isProtected(m.role) + const lockUnload = isRunning && prot + const disabled = (m.incomplete && !isRunning) || lockUnload + return ( - - {brainsGroup && ( + ) + })()} + {expert && ( + + )} + {expert && brainsGroup && ( )} - + {expert && ( + + )} @@ -839,11 +897,11 @@ export function Cockpit() { : models const assign = (name: string) => { handleRoleChange(activeRoleForAssign, name); setActiveRoleForAssign(null) } return ( -
+
-

- Rolle '{activeRoleForAssign}' konfigurieren +

+ festlegen

- Wähle ein Modell für die Rolle {activeRoleForAssign}: + Wähle ein Modell für {roleMeta(activeRoleForAssign).label} + {roleMeta(activeRoleForAssign).desc}

{rec?.recommended && ( + {/* Schutzgeländer: eine lebenswichtige Rolle (Hirn/Gedächtnis) lässt sich nicht leeren. */} + {isProtected(activeRoleForAssign) ? ( +
+ 🔒 Diese Rolle ist lebenswichtig und kann nicht leer bleiben — wähle stattdessen ein anderes Modell. +
+ ) : ( + + )} {ordered.map((m) => { const r = recByName[m.name] const isCur = m.role === activeRoleForAssign From 64efe1850063fa9058dd44e78a8e501402d949d6 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 2 Jul 2026 10:30:12 +0200 Subject: [PATCH 14/38] Docs: Komplett-Review 2026-07-02 (IST live verifiziert + Roadmap P0-P3) + Session-Docs - REVIEW_2026-07-02.md: Latenz-Baseline (STT 2s dominant, LLM-TTFT 65ms), chat-Lane-Bug, SOLL-Recherche (Parakeet v3, Silero VAD v6, KV-Quant, MoE-Spec-Trap), Verdikte bestaetigt - Audit-/TTS-/ZeroClaw-/DR-Docs von main nachgezogen; launch.json Co-Authored-By: Claude Fable 5 --- .claude/launch.json | 9 + docs/AUDIT_KICKOFF.md | 75 +++++ docs/CLAUDE_CODE_BRIEF_lucy-brain-role.md | 106 +++++++ docs/DISASTER_RECOVERY.md | 326 ++++++++++++++++++++++ docs/LUCY_TTS_PLAN.md | 149 ++++++++++ docs/REVIEW_2026-07-02.md | 221 +++++++++++++++ docs/ZEROCLAW_POC_BRIEF.md | 83 ++++++ docs/ZEROCLAW_POC_RESULTS.md | 118 ++++++++ 8 files changed, 1087 insertions(+) create mode 100644 docs/AUDIT_KICKOFF.md create mode 100644 docs/CLAUDE_CODE_BRIEF_lucy-brain-role.md create mode 100644 docs/DISASTER_RECOVERY.md create mode 100644 docs/LUCY_TTS_PLAN.md create mode 100644 docs/REVIEW_2026-07-02.md create mode 100644 docs/ZEROCLAW_POC_BRIEF.md create mode 100644 docs/ZEROCLAW_POC_RESULTS.md diff --git a/.claude/launch.json b/.claude/launch.json index 292479f..46b3732 100644 --- a/.claude/launch.json +++ b/.claude/launch.json @@ -14,6 +14,15 @@ "9000" ], "port": 9000 + }, + { + "name": "frontend", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "dev", "--", "--port", "5180", "--strictPort"], + "cwd": "F:\\Coding Stuff\\mission-control-2\\frontend", + "env": { "MC_API_TARGET": "http://192.168.178.151:9001" }, + "autoPort": false, + "port": 5180 } ] } diff --git a/docs/AUDIT_KICKOFF.md b/docs/AUDIT_KICKOFF.md new file mode 100644 index 0000000..4ec890f --- /dev/null +++ b/docs/AUDIT_KICKOFF.md @@ -0,0 +1,75 @@ +# Kickoff: Voll-Audit MC2 (Front+Backend) + Box-SSH + Optimierungsplan + +> Für eine **frische Claude-Code-Session mit echtem Terminal** (direkter SSH-Zugang zur Box). +> Aufgabe vom Nutzer: front/backend komplett scannen (IST-Zustand), via SSH auf die Box gehen +> (ausdrücklich erlaubt), und am Ende einen **sauberen, strukturierten Plan** liefern, wie es +> weitergeht — inkl. Optimierungen für ALLE LLM-Rollen und einem **neuen `scout`-Modell**. +> Erst auditieren/planen — keine destruktiven Änderungen ohne Plan-Freigabe. + +## Zugänge +- **Repo (Dev-PC):** `F:\Coding Stuff\mission-control-2` (Windows). Auf der Box: `~/mission-control-v2`. +- **Box:** `ssh hitonabi@192.168.178.151` (key-based, funktioniert non-interaktiv). Hostname + `tobisniceaiarbeitstier`, AMD Ryzen AI MAX+ 395 (Strix Halo), 122 GB RAM, GTT ~124 GB, Vulkan/RADV. +- **Wichtige Box-Pfade:** `/etc/llama-swap/config.yaml` (Engine, `-watch-config`), + `~/.hermes/config.yaml` (Hermes-Agent = Lucys Hirn), `/srv/models/` (GGUFs), + `/opt/llamacpp-vulkan/llama-server` (Engine v9843). +- **Dienste (systemd --user):** `hermes-gateway` (:8642), `hermes-webui` (:8787), llama-swap (:8080), + MC2-Gateway (:9001). Live-Logs: `journalctl --user -u hermes-gateway -f`. + +## Architektur (verifiziert 30.06.2026) +- **llama-swap** (:8080) lädt GGUFs; Rollen = llama-swap **`aliases`**; Warm-Bleiben über + `groups: { brains: { swap:false } }` + `ttl`. +- **MC2-Gateway** (:9001/v1, FastAPI) mit virtuellen Lanes `chat`(→fast/heavy) & `coding`(→coder_lite/coder). + Code: `backend/services/router_logic.py`, `routing_policy.py`, `roles.py`, `llamaswap.py`, `budget.py`, + `fit.py`; Router `backend/routers/{models,routing,voice}.py`. Frontend: `frontend/src/views/ModelsView.tsx`, + `components/models/*`, `SystemDrawer.tsx`. +- **Hermes-Agent** (:8642) = Lucys Hirn (`~/.hermes/config.yaml: model.default`), Delegation `heavy`. +- **Lucy-Client** (`client/lucy-desktop`, Electron) spawnt lokal pocket-tts (:8130); Persona+Umlaut-Logik + im Client (`renderer/src/config.ts`, `lib/voice/useVoiceAgent.ts`). +- **Features sind eigene Rollen** (hirn-unabhängig): Sehen=`Qwen3-VL-8B`, Hören=Whisper(`stt`), + Sprechen=pocket-tts, Embedding=`Qwen3-Embedding-0.6B`(ttl 0, immer warm), Gedächtnis=Mem0/MCP. + +## Modelle / Rollen (Stand jetzt) +| Rolle (alias) | Modell | aktiv | ctt/ttl | Notiz | +|---|---|---|---|---| +| fast | Qwen3.6-35B-A3B | 3B | ttl 0, --parallel 2, mmproj | chat-Lane Default | +| heavy | Qwen3.5-122B-A10B | 10B | ttl 600 | Delegation-Ziel | +| coder | Qwen3-Coder-Next | — | ttl 600, spec draft-simple (Qwen3-0.6B) | | +| coder_lite | Qwen3-Coder-30B-A3B | 3B | ttl 300 | coding-Lane Default | +| vision | Qwen3-VL-8B-Instruct | — | ttl 300 | Screen-Beschreibung | +| (embedding) | Qwen3-Embedding-0.6B | — | ttl 0 | immer warm | +| **brain (NEU, Lucy)** | **gemma-4-26B-A4B-it** | 4B | ttl 0, **noch Alias `scout`** | Hermes default seit 30.06. | + +## Bereits gemacht (30.06.) +- Lucys Hirn `fast` → **`gemma-4-26B-A4B-it`** (`~/.hermes/config.yaml model.default`, Backup + `~/.hermes/config.yaml.gemma-swap.bak`, hermes-gateway neu gestartet, verifiziert). +- Umlaut-Fix: Client-Stammliste erweitert (`useVoiceAgent.ts`) **und** Server-Netz `_fix_umlauts` + (`client/lucy-tts/pocket_server.py`). Hermes-System-Prompt fordert echte Umlaute (Client-Persona). +- pocket-tts getunt: A1 safetensors-Voice-Cache, A2 Referenz-Cleaning, B3 FP-Gate skip kurze Audios, + FAST_FIRST (kurzer 1. Chunk, TTFB ~1,3s), seriell (WORKERS=0) als Default. Details: `docs/LUCY_TTS_PLAN.md`. + +## Offene Probleme / Aufgaben +1. **Brain-Rolle fehlt als Konzept.** gemma läuft als Alias `scout`, ist NICHT in `brains: swap:false` + → unter Speicherdruck evakuierbar trotz ttl 0. Detail-Brief: **`docs/CLAUDE_CODE_BRIEF_lucy-brain-role.md`** + (Backend+Frontend-Umbau: erstklassige `brain`-Rolle, auto-warm/ko-resident, Hermes-Sync). +2. **`scout`-Rolle jetzt vakant** (gemma war scout, ist jetzt Hirn). **Neues scout-Modell suchen:** + multimodaler Allrounder, klein/MoE (schnell, KO-Residenz-freundlich), Tools wünschenswert. Tagesaktuell + recherchieren + Empfehlung. +3. **MTP-Speculative-Decoding für gemma** (1,5–2× Durchsatz, 0 Qualitätsverlust): Engine kann `draft-mtp` + ✓; MTP-Drafter `gemma-4-26B-A4B-it-assistant` (~0,4B) muss nach `/srv/models/`, gemma-cmd ergänzen + (`-md --spec-type draft-mtp --spec-draft-n-max/-n-min`; **alte** `--draft-max/-min` + sind entfernt!). MC2-UI/Backend kennt MTP-Drafter nicht (zeigte „Vocab ?") → erweitern. (Im Brain-Brief.) +4. **Optimierung ALLER Rollen prüfen:** je Modell ctx/quant/ttl/Warm-Gruppe/Parallelität/Spec-Decoding + (MTP für Gemma; Draft-Eignung für Qwen-Modelle) gegen das GTT-/RAM-Budget (~124 GB) und reale t/s + auf Strix Halo (bandbreitenlimitiert → MoE bevorzugt; dichte Modelle langsam). KO-Residenz-Set + sinnvoll definieren (was muss gleichzeitig warm sein für Lucy + IDE-Coding?). + +## Deliverable +Ein **strukturierter Plan** (z.B. `docs/OPTIMIZATION_PLAN.md`): IST-Zustand → konkrete Maßnahmen je Rolle +(mit Begründung/Zahlen) → Reihenfolge/Risiko/Revert → offene Entscheidungen. Erst Plan, dann Umsetzung +nach Freigabe. Alles reversibel (Config-Backups vor jeder Änderung). + +## Leitplanken +- Features (Sehen/Hören/Sprechen/Embedding/Gedächtnis) + IDE-Lanes dürfen NICHT brechen. +- Vor jeder Box-Config-Änderung Backup; llama-swap reloadt per `-watch-config`. +- Keine destruktiven Aktionen ohne Plan-Freigabe des Nutzers. diff --git a/docs/CLAUDE_CODE_BRIEF_lucy-brain-role.md b/docs/CLAUDE_CODE_BRIEF_lucy-brain-role.md new file mode 100644 index 0000000..8d1aee3 --- /dev/null +++ b/docs/CLAUDE_CODE_BRIEF_lucy-brain-role.md @@ -0,0 +1,106 @@ +# Claude-Code-Auftrag: „Brain"-Rolle für Lucy (Front- + Backend-Umbau) + +> Ziel: Lucys Hirn (aktuell `gemma-4-26B-A4B-it`) als **erstklassige, dauer-warme Rolle** im MC2-Stack +> verankern — statt es als `scout` zu führen, das nach `ttl` entladen wird. Features (Sehen/Hören/ +> Sprechen/Embedding) dürfen NICHT verloren gehen, KO-Residenz + Budget müssen sauber bleiben. + +## Kontext / Architektur (Ist-Zustand, verifiziert 30.06.) +- **Engine:** llama-swap (config: `/etc/llama-swap/config.yaml` auf der Box, läuft mit `-watch-config`). + Rollen werden als llama-swap **`aliases`** gesetzt; Warm-Bleiben über `groups:` (eine Gruppe + `brains: { swap: false }`) + `ttl`. Installierte Modelle: `Qwen3.6-35B-A3B` (fast, ttl 0), + `Qwen3.5-122B-A10B` (heavy, ttl 600), `Qwen3-Coder-Next` (coder, ttl 600), + `Qwen3-Coder-30B-A3B-Instruct` (coder_lite, ttl 300), `Qwen3-VL-8B-Instruct` (vision, ttl 300), + `Qwen3-Embedding-0.6B` (ttl 0 = immer warm), `gemma-4-26B-A4B-it` (ttl 180). +- **Gateway:** MC2 builtin auf `:9001/v1` mit virtuellen Lanes `chat` (→ fast/heavy) und + `coding` (→ coder_lite/coder). Code: `backend/services/router_logic.py`, `routing_policy.py`. + **Lucy nutzt die Lanes NICHT** — sie ist der Hermes-Agent. +- **Lucy-Hirn:** Hermes-Agent (`:8642`), Brain = `~/.hermes/config.yaml` → `model.default` + (jetzt `gemma-4-26B-A4B-it`), Delegation = `heavy`. Persona/Prompt kommt aus dem **Client** + (`client/lucy-desktop/src/renderer/src/config.ts`), nicht aus der Box-Config. +- **Hardware:** Strix Halo (Ryzen AI Max+ 395), 122 GB, GTT ~124 GB, bandbreitenlimitiert → + MoE mit wenig aktiven Params ist schnell, dichte Modelle langsam. + +## Root-Cause des Bugs +1. Kanonische Rollen `ROLE_IDS = {fast, heavy, coder, vision, scout}` — **keine `brain`/Agent-Rolle**. + (Kommentar im Code: „kein agent/reasoning mehr".) +2. Es gibt keine Verknüpfung „Hirn-Modell ⇒ muss warm bleiben". gemma trägt den Alias `scout`, + ist NICHT in der `brains`-Gruppe, `ttl 180` → entlädt im Leerlauf → Lucy lädt kalt nach (~5–10 s). +3. `roles.py` referenziert noch eine `hermes`-Rolle, die in `ROLE_IDS` nicht existiert → Inkonsistenz. + +## Aufgabe + +### Backend (`backend/`) +1. **Neue erstklassige Rolle `brain` einführen** (oder `hermes` reaktivieren) und in ALLEN + Quellen synchronisieren (heute dupliziert!): + - `services/llamaswap.py` → `ROLE_IDS` + - `services/sources.py` → `ROLE_IDS` + Titel/Icon (analog `scout: {title, icon}`) + - `services/maintenance.py` (Modell-Upgrade-Rollenliste) + - `services/roles.py` → `_capability_suit`/`_pref`/`_reason` für `brain` (Tools Pflicht, + mittlere Größe + MoE bevorzugt, niedrige Latenz). `hermes`-Altlast bereinigen. +2. **Rolle `brain` ⇒ automatisch warm + ko-resident.** Beim Zuweisen der `brain`-Rolle + (`POST /api/models/{model_id}/role`, `routers/models.py`): + - Modell via `set_group("brains", members=[...], swap=False, persist=True)` in die Warm-Gruppe + aufnehmen (bestehender Helper in `llamaswap.py`). + - `ttl: 0` setzen (oder hoch), vorheriges Brain-Modell aus `brains` entfernen + ttl entspannen. + - Embedding (`Qwen3-Embedding-0.6B`, ttl 0) MUSS warm bleiben — nicht verdrängen. +3. **Single Source of Truth für „Lucys Hirn":** beim Setzen der `brain`-Rolle auch Hermes' + `~/.hermes/config.yaml` → `model.default` auf das Modell setzen + `systemctl --user restart + hermes-gateway` (mit Backup der config). So bleibt MC2-UI-Auswahl ↔ Hermes-Brain konsistent. +4. **Budget/KO-Residenz-Safety:** Brain(warm) + Embedding(warm) + on-demand Vision + Coder müssen + in GTT (~124 GB) passen. `services/budget.py`/`fit.py` nutzen, bei OOM warnen (nicht hart laden). +5. **Lanes/IDEs unangetastet lassen:** chat/coding-Routing (`router_logic.py`) bleibt wie es ist; + `fast` bleibt für die chat-Lane warm. + +### Frontend (`frontend/src/`) +1. **Rollen-Taxonomie** um `brain` erweitern (Badges/Titel/Icon) — Duplikat zur Backend-Liste + finden & angleichen (`components/models/*`, `views/ModelsView.tsx`, evtl. `ModelBadges.ROLES`). + gemma darf NICHT mehr als `scout` erscheinen. +2. **Rollen-Zuweisungs-Modal:** `brain` auswählbar; Warm-/KO-Residenz-Status anzeigen + (ist das Brain in `brains`? warm? ttl?). Empfehlung via bestehendem `/api/roles/{role}/recommend`. +3. **Warm-Set / GTT-Budget sichtbar machen** (Dashboard/Models): was ist gerade ko-resident, + passt es ins Budget? (nutzt `/api/models` `running` + budget-Infos). +4. Optional: „Lucy-Hirn"-Selector, der die `brain`-Rolle setzt (treibt Backend #2 + #3). + +### Zusatz: MTP-Speculative-Decoding für Gemma (Durchsatz für agentische Arbeit) +Lucy ist ein **voller Agent** (Tools/MCP/PC-Control/Vision/Delegation) — Durchsatz zählt, nicht nur +TTFB. Gemma 4 bringt **MTP** (Multi-Token-Prediction) mit → 1,5–2× schneller bei null Qualitätsverlust. +- **Engine kann es bereits:** `llama-server` v9843 listet `--spec-type … draft-mtp …`. ✓ +- **Vocab-kompatibler „Draft" = Gemmas eigener MTP-Kopf** `gemma-4-26B-A4B-it-assistant` (~0,4B, + identischer Tokenizer per Konstruktion). Quelle z.B. `unsloth/gemma-4-26B-A4B-it-GGUF` (enthält den + MTP-Drafter, PR ggml-org/llama.cpp#23398). Muss nach `/srv/models/...` geladen werden (noch nicht da). +- **Flag-Änderung beachten:** `--draft-max/--draft-min` sind ENTFERNT → `--spec-draft-n-max` / + `--spec-draft-n-min`. Drafter laden via `-md --spec-type draft-mtp`. Exakte Flags + des Builds mit `llama-server --help` gegenprüfen. +- **MC2-Bug:** die Spec-Draft-Auswahl (UI + Backend) kennt **nur klassische Drafts** (vergleicht stur + `n_vocab`/`pre`) und bot fälschlich nur den Qwen-Draft an („Vocab ?"). **Erweitern:** MTP-Drafter + (`gemma4_assistant`-Arch) als gültigen, vocab-kompatiblen Draft erkennen, den passenden `-assistant`- + GGUF anbieten, und beim Aktivieren `-md … --spec-type draft-mtp --spec-draft-n-max/-n-min` in die + llama-swap-cmd schreiben. Co-Residenz: Drafter ~0,4B → vernachlässigbar. + +## Akzeptanzkriterien +- [ ] `gemma-4-26B-A4B-it` wird in der UI als **`brain`** geführt (nicht `scout`). +- [ ] Es bleibt **warm**: in `brains: swap:false`, `ttl 0`; überlebt > alter ttl Leerlauf + (Verifikation: `curl :8080/running` nach >5 Min Idle zeigt das Modell weiterhin `ready`). +- [ ] Lucy antwortet ohne Kalt-Nachladen nach Leerlauf. +- [ ] Vision (`Qwen3-VL-8B`), Embedding (`Qwen3-Embedding-0.6B`), Coder bleiben funktionsfähig & + ko-resident; **kein OOM**; IDE-Lanes (chat/coding) unverändert. +- [ ] Brain-Wechsel in der UI aktualisiert llama-swap (Warm-Gruppe) UND Hermes `model.default` + (+ Restart), reversibel (Backup). + +## Sofort-Hotfix (unabhängig vom Umbau — macht Lucy JETZT warm) +Auf der Box, bis der saubere Umbau steht: +```bash +# gemma als immer-warm + in die brains-Gruppe (Backup zuerst!) +cp /etc/llama-swap/config.yaml /etc/llama-swap/config.yaml.bak +# gemma ttl 180 -> 0 und groups.brains.members um gemma-4-26B-A4B-it ergänzen +# (manuell editieren oder via MC2 set_group), dann: +# llama-swap reloadt per -watch-config automatisch. +``` + +## Wichtige Dateien (Einstieg) +- Backend: `services/llamaswap.py` (Rollen=aliases, `set_role_alias`, `set_group`, `register_model`), + `services/roles.py`, `services/sources.py`, `services/routing_policy.py`, + `services/router_logic.py`, `services/budget.py`, `services/fit.py`, `routers/models.py`, + `routers/routing.py`. +- Frontend: `views/ModelsView.tsx`, `components/models/*`, `components/SystemDrawer.tsx`. +- Box (nicht im Repo): `/etc/llama-swap/config.yaml`, `~/.hermes/config.yaml`. diff --git a/docs/DISASTER_RECOVERY.md b/docs/DISASTER_RECOVERY.md new file mode 100644 index 0000000..135b901 --- /dev/null +++ b/docs/DISASTER_RECOVERY.md @@ -0,0 +1,326 @@ +# Konzept: Bare-Metal-Wiederaufbau + First-Run-Wizard (VOLLSTÄNDIG) + +> **Zweck:** Plan für den „hard crash"-Fall — die Box (`tobisniceaiarbeitstier`, Ubuntu 26.04, +> AMD Ryzen AI MAX+ 395 / gfx1151, 122 GB RAM) muss von **null** wiederherstellbar sein. +> **Anspruch:** *ALLES* ist erfasst — Engine, Hermes-Konfig 1:1, 3D-Avatare, Voice/Klonstimme, +> Memory, Browser, MCP, Skills, Secrets. Pro Komponente entscheidet der Nutzer im Wizard: +> **1:1 zurück** · **neu/Default** · **weglassen**. +> +> Dieses Dokument ist die **Spezifikation für eine künftige Implementierungs-Session** — es baut +> noch nichts. Stand: 2026-06-28. + +--- + +## 1. Leitprinzip: 1:1 ODER modular — der Nutzer wählt + +Der Wizard behandelt jede Komponente als **eigene Kachel mit drei Modi**: + +| Modus | Bedeutung | +|---|---| +| 📦 **1:1 aus Backup** | Exakter alter Zustand wird zurückgespielt (Configs, Daten, Klonstimme, Avatare). | +| 🆕 **Neu / Default** | Frische Installation mit sinnvollen Defaults (z.B. entfesseltes Hermes-Profil, Default-Avatar). | +| ⏭️ **Weglassen** | Komponente wird (vorerst) nicht installiert. | + +Ein „Alles 1:1"-Knopf wählt überall 📦 (wo ein Backup existiert), sonst 🆕. So bekommt der Nutzer +entweder den exakten alten Stand oder kann gezielt entrümpeln. + +--- + +## 2. Was es schon gibt (wiederverwenden) + +| Asset | Datei | Deckt ab | +|---|---|---| +| Code-Deploy | `deploy/deploy.sh` | git pull + venvs + Units + Restart. **Setzt Engine/llama-swap/Dirs/venvs voraus.** | +| Zustands-Backup | `deploy/backup.sh` + `mc2-backup.{service,timer}` | **Aktuell** (live): mem0, `~/.hermes/{config.yaml,.env,plugins}`, llama-swap-config. Retention 14. **Für echtes 1:1 zu erweitern** — fertiges Snippet in **Anhang B** (§5). | +| Restore | `deploy/restore.sh` | Spielt Tarball zurück (mit Pre-Restore-Sicherung). | +| Engine | `deploy/provision-engine.sh` | llama.cpp Vulkan/RADV-Build (root). | +| Voice-Setup | `voice_service/install.sh` | venv + Piper-Binary + dt. Piper-Stimmen + Chatterbox (best-effort). | +| Updates | `deploy/update-engine.sh`, `update-swap.sh` | Laufende Engine/Router-Updates. | +| Postchecks | `deploy/stack-postcheck.sh`, `hermes-postcheck.sh` | Funktionsprüfung → Wizard-Verifikationsschritt. | + +--- + +## 3. VOLLSTÄNDIGER Komponenten-Katalog + +> **Scan-verifiziert (2026-06-28)** gegen `backend/config.py`, alle `backend/services/*` & `routers/*`, +> `frontend/src/{nav.ts,views,components/voice}`, `voice_service/app.py`, `mem0_service/`, `deploy/*`. +> Alle persistenten Schreibpfade, Dienste, Secrets und Env-Vars sind unten erfasst. + +Legende Restore-Quelle: 📦 = aus Backup-Tarball · ⬇️ = Re-Download/Install (Skript) · 🌐 = Git · +🔑 = Secret (Nutzer/Generieren) · 🆕 = im Wizard neu gewählt. +„Im Backup?" = deckt der **aktuelle** `backup.sh` es ab. + +### A · OS & System (L0, root/sudo, einmalig) +| Komponente | Ort | Quelle | Im Backup? | +|---|---|---|---| +| Ubuntu 26.04, User `hitonabi`, `enable-linger` | — | ⬇️ manuell | n/a | +| System-Pakete: python3.14+venv, git, curl, jq, ttyd, uv | — | ⬇️ apt/curl | nein | +| Vulkan-Stack: mesa-vulkan-drivers, libvulkan1, vulkan-tools | — | ⬇️ apt | nein | +| Chrome-Libs (Browser): `agent-browser install --with-deps` | — | ⬇️ apt | nein | +| Verzeichnis-Layout: `/srv/models/{,mem0,mc2-backups,drafts}`, `/etc/llama-swap/` | — | ⬇️ mkdir+chown | nein | + +### B · Inferenz-Engine + Router (L1, root) +| Komponente | Ort | Quelle | Im Backup? | +|---|---|---|---| +| llama.cpp (Vulkan) → `llama-server` | `/opt/llamacpp-vulkan`, `/usr/local/bin/llama-server` | ⬇️ provision-engine.sh / update-engine.sh (ggml-org Release) | nein (re-build) | +| **llama-swap** Binary (Router `:8080`) | `/usr/local/bin/llama-swap` | ⬇️ **bekannt:** `mostlygeek/llama-swap`-Release (Rezept in `update-swap.sh`) | nein (re-download) | +| **llama-swap systemd-System-Unit** | `/etc/systemd/system/llama-swap.service` (+ `.d/` Drop-ins) | ⬇️ Bootstrap legt sie an — **kompletter Unit-Inhalt in Anhang A** (von der Box abgegriffen; Drop-ins via provision-engine.sh) | nein | +| llama-swap-Config (Modelle/Rollen) | `/etc/llama-swap/config.yaml` | 📦 | **ja** | +| Draft-Modelle (Spec-Decoding) | `/srv/models/drafts/` | ⬇️ Re-Download | nein | + +### C · MC2-App (L2, userspace) +| Komponente | Ort | Quelle | Im Backup? | +|---|---|---|---| +| MC2-Code | `~/mission-control-v2` | 🌐 Git (Gitea) | n/a | +| Backend-venv (Python 3.14) | `backend/.venv` | ⬇️ deploy.sh | nein (rebuild) | +| Frontend (gebaut, inkl. **3D-Avatar `avatar.vrm`**) | `frontend/dist`, `frontend/public/avatar.vrm` | 🌐 Git | n/a | +| systemd-User-Dienst `mission-control-2` (`:9001`) | `~/.config/systemd/user/` | ⬇️ deploy.sh | nein | + +### D · 3D-Avatar (Sprechen-Tab) +| Komponente | Ort | Quelle | Im Backup? | +|---|---|---|---| +| Default-Avatar (VRM) | `frontend/public/avatar.vrm` (→ dist) | 🌐 Git | n/a | +| Renderer | `frontend/src/components/voice/Avatar3D.tsx` | 🌐 Git | n/a | +| **Eigene/zusätzliche Avatare** (falls Nutzer welche ablegt) | **TODO: Ablageort definieren** (z.B. `/srv/models/avatars/` + DB-Verweis) | 📦/🆕 | **nein (Lücke)** | + +> Heute ist der Avatar **fest** (`avatar.vrm`, kommt mit dem Git-Frontend zurück). Wenn künftig +> Nutzer-Avatare hochgeladen werden, brauchen sie einen persistenten Ablageort, der ins Backup geht. + +### E · Voice-Sidecar (STT + TTS + Klonstimme) +| Komponente | Ort | Quelle | Im Backup? | +|---|---|---|---| +| Voice-venv (Python 3.12) | `~/.voice/venv` | ⬇️ install.sh | nein (rebuild) | +| STT (faster-whisper Modell) | `~/.voice/` (Cache) | ⬇️ install.sh / 1. Start | nein | +| Piper-Binary + dt. Stimmen (thorsten/kerstin) | `~/.voice/piper`, `~/.voice/voices` | ⬇️ install.sh | nein | +| Chatterbox (Premium-TTS, CPU-torch) | venv | ⬇️ install.sh (best-effort) | nein | +| **Klonstimme / Voice-Referenz-Audio** (Nutzer) | `~/.voice/refs/ref.wav` (`VOICE_REFS_DIR`, `/api/voice/reference`) | 📦 | **nein → Anhang B** | +| ElevenLabs-Key | `~/.hermes/.env` | 🔑 | ja | +| Stimm-/Lautstärke-Wahl | Browser-`localStorage` (pro Gerät) | 🆕 client | n/a | +| Dienst `voice-service` (`:8650`) | systemd-User | ⬇️ deploy.sh | nein | + +### F · Mem0 (Langzeitgedächtnis) +| Komponente | Ort | Quelle | Im Backup? | +|---|---|---|---| +| Mem0-venv (Python 3.12, uv) | `~/.mem0/venv` | ⬇️ deploy.sh | nein (rebuild) | +| **Gedächtnis-Daten (Chroma + history.db)** | `/srv/models/mem0/` | 📦 | **ja** | +| Hermes-Memory-Plugin | `~/.hermes/plugins/mc2-memory/` | 📦/🌐 | ja | +| Dienst `mem0-service` (`:8765`) | systemd-User | ⬇️ deploy.sh | nein | + +### G · Hermes-Agent (das Herz) +| Komponente | Ort | Quelle | Im Backup? | +|---|---|---|---| +| Hermes-Code | `~/.hermes/hermes-agent` | 🌐 Git (NousResearch) | nein (re-clone) | +| Bundled Node v22 | `~/.hermes/node/bin` | ⬇️ (kommt mit Hermes) | nein | +| Hermes-venv | `~/.hermes/hermes-agent/venv` | ⬇️ rebuild | nein | +| **`config.yaml` 1:1** (Toolsets, MCP, Engine, Browser, Personalities, alles) | `~/.hermes/config.yaml` | 📦 | **ja** | +| **`.env` (Secrets: TELEGRAM_BOT_TOKEN, API_SERVER_KEY, ElevenLabs …)** | `~/.hermes/.env` | 📦/🔑 | **ja** | +| Plugins | `~/.hermes/plugins/` | 📦 | ja | +| **Skills (eigene)** | `~/.hermes/skills/` (45M; `.hub`-Cache re-downloadbar) | 📦 | **nein → Anhang B (ohne .hub)** | +| Sessions/History (optional) | `~/.hermes/sessions/` (856K) | 📦 | **nein → Anhang B** | +| Checkpoints (optional) | `~/.hermes/checkpoints/` (existiert nicht) | ⏭️ skip | nein | +| **Token-/Ersparnis-Statistik** | `~/.hermes/token_stats.json` | 📦 | **nein → Anhang B** | +| Dienst `hermes-gateway` (`:8642`) | systemd-User | ⬇️ | nein | +| Hermes-Terminal (ttyd → `hermes chat`, `:7681`) | systemd-User `hermes-terminal` | ⬇️ deploy.sh (+ttyd apt) | nein | + +### H · MCP-Server (4) +| Komponente | Ort | Quelle | Im Backup? | +|---|---|---|---| +| `mission-control-memory`, `-stack` (MC2-venv) | `~/mission-control-v2/mcp/*.py` | 🌐 Git | über config.yaml | +| `hermes-pc-control`, `hermes-web-fetch` (Hermes-venv) | dito | 🌐 Git | über config.yaml | +| MCP-Verdrahtung | `~/.hermes/config.yaml → mcp_servers` | 📦 | ja | + +### I · Browser-Stack +| Komponente | Ort | Quelle | Im Backup? | +|---|---|---|---| +| agent-browser (npm global) | `~/.local/...`, symlink `~/.hermes/node/bin` | ⬇️ npm i -g | nein | +| Chrome (engine) + System-Libs | `~/.agent-browser/browsers/` + apt-Libs | ⬇️ install --with-deps | nein | +| lightpanda (optional, leicht) | `~/.local/bin/lightpanda` | ⬇️ Download | nein | +| Browser-Verdrahtung (engine=chrome, toolset) | `~/.hermes/config.yaml` | 📦 | ja | + +### J · Modelle (GGUF — der große Brocken) +| Komponente | Ort | Quelle | Im Backup? | +|---|---|---|---| +| GGUF-Modelle (Brain, fast, heavy, coder, vision, embedding …) | `/srv/models/` | ⬇️ Re-Download aus llama-swap-Manifest | **nein (zu groß, bewusst)** | + +### K · Extern (anderer Rechner) +| Komponente | Ort | Quelle | Im Backup? | +|---|---|---|---| +| PC-Executor (Windows) | `client/hermes-pc/` → Scheduled Task | 🌐 Git + Task | n/a (anderer Host) | +| Hermes-WebUI (nesquena, optional, `:8787`) | `~/hermes-webui` | ⬇️ git clone | nein | + +--- + +## 4. Ziel-Architektur + +### 4.1 `deploy/bootstrap.sh` — orchestrierter From-Zero-Lauf +- **Idempotent & resumierbar** (Schritt-Marker in `~/.mc2-bootstrap.state`). +- **Getrennt nach sudo-Bedarf**: `bootstrap-root.sh` (L0+L1, bewusst mit sudo) + `bootstrap.sh` + (L2+, sudo-frei = Kern ist `deploy.sh`). Passt zum Nordstern „Runtime ohne sudo". +- **Mündet in den Wizard**: startet MC2 im First-Run-Modus, gibt Wizard-URL aus. + +Phasen: `0 Vorflug → 1[sudo] System+Dirs → 2[sudo] Engine+llama-swap → 3 Code(MC2+Hermes+Node) +→ 4 venvs(backend/mem0/voice/hermes) → 5 Browser → 6 deploy.sh(Units/enable/restart) +→ 7 Restore(optional) → 8 Wizard hoch + postcheck`. + +### 4.2 First-Run-Wizard (browserbasiert, von MC2 serviert) +MC2 erkennt unkonfigurierten Zustand → Frontend-Route `/setup` statt Dashboard. Schritte: + +1. **Systemcheck** — Live-Ampel je Komponente aus §3 (`GET /api/setup/status` + `…/system/services`). +2. **Restore-Quelle wählen** — Backup-Tarball erkennen → globaler Modus „Alles 1:1" / „selektiv" / „frisch". +3. **Komponenten-Auswahl (Kernstück)** — pro Katalog-Eintrag aus §3 eine Kachel mit + 📦/🆕/⏭️ (siehe §1). Zeigt Größe + ob Backup-Daten vorhanden. +4. **Netzwerk & Identität** — Box-IP (→ `HERMES_TERMINAL_URL`, `PC_EXECUTOR_URL`), Hostname. +5. **Secrets** 🔑 — `TELEGRAM_BOT_TOKEN`, erlaubte User-ID, `API_SERVER_KEY` (oder generieren), + ElevenLabs-Key → `~/.hermes/.env` (chmod 600). Bei 📦 vorbefüllt aus Backup. +6. **Hermes-Profil** — Brain-Alias + Toolset-Profil (Default = entfesselt: vision/tts/memory/browser + an, image_gen/video aus — siehe [[project-hermes-setup]]). Bei 📦 = exakte alte `config.yaml`. +7. **Avatar & Voice** — Avatar wählen (Default-VRM oder eigener), Stimme/Klonstimme + (📦 Referenz-Audio zurück, oder neu aufnehmen/hochladen). +8. **Modelle** — aus llama-swap-Manifest automatisch nachladen (`POST /api/models/install`, + Fortschritt `GET /api/jobs`) ODER geführte Discover-Neuauswahl. Reihenfolge: Brain → heavy → Rest. +9. **Externe Checkliste** — PC-Executor (Windows-Task), Hermes-WebUI als Haken. +10. **Verifikation & Abschluss** — `stack-postcheck.sh` + `hermes-postcheck.sh` → grün/rot-Liste → Dashboard. + +**Technik:** neuer Router `backend/routers/setup.py` +(`GET /api/setup/status`, `POST /api/setup/{secrets,network,hermes,components,finish}`). +First-Run-Gate: MC2 prüft beim Boot Marker `~/.mc2-setup-done` bzw. Pflicht-Secrets → leitet auf `/setup`. + +--- + +## 5. Backup-Scope für echtes 1:1 ERWEITERN (umzusetzen — Snippet in Anhang B) + +Der **aktuelle** `backup.sh` (live auf der Box, unverändert) reicht für „1:1" nicht. Für die Bau-Session +liegt das **fertige Erweiterungs-Snippet in Anhang B** — es ergänzt den Tarball um: + +- **Voice-Klonstimme** → `~/.voice/refs/` (`ref.wav`) +- **Token-/Ersparnis-Statistik** → `~/.hermes/token_stats.json` +- **Hermes-Skills** → `~/.hermes/skills/` (re-downloadbarer `.hub`-Cache per `tar --exclude` ausgelassen) +- **Hermes-Sessions/History** → `~/.hermes/sessions/` + +Restore soll skills/sessions **mergen** (frisch geladenen `.hub` nicht überschreiben) und `voice-service` +mit neu starten. + +**Offen bleibt:** eigene Avatare (sobald Upload existiert — Ablageort heute undefiniert, siehe §3·D). + +**Bewusst NICHT im Backup (re-downloadbar/rebuildbar):** Piper-Stimmen (install.sh), `.hub`-Skill-Cache, +`/srv/models/mc2-discover.json` (Cache), `/srv/models/mc2-memory.db` (Legacy-Migration), alle venvs, GGUF-Modelle. + +→ Aufgabe der Bau-Session: `backup.sh` + `restore.sh` um diese Pfade erweitern (mit klarer +„opt-in für große/optionale Teile"-Logik), und den MANIFEST-Inhalt entsprechend. + +--- + +## 6. Secrets-Strategie +- Single Source: `~/.hermes/.env` (chmod 600), im Tarball (selbst 600). +- Rebuild ohne Backup → Wizard-Schritt 5 erzeugt sie. `API_SERVER_KEY` generierbar; Telegram/ElevenLabs liefert Nutzer. +- Nie ins Git, nie in Logs, nie in die MC2-DB. **Off-Box-Spiegelung des Tarballs noch offen** ([[mc2-backup-restore]]). + +## 7. Modell-Strategie +- **A (empfohlen):** `/etc/llama-swap/config.yaml` (im Backup) listet alle Modelle → Wizard leitet Repos/Quants ab und lädt automatisch (`/api/models/install`). „Ein Klick, lädt über Nacht." +- **B:** geführte Discover-Neuauswahl je Rolle. Reihenfolge Brain → heavy → Rest, danach `warmup.sh`. + +--- + +## 8. Implementierungs-Reihenfolge (neue Session) +1. ✅ **Box-Verifikation erledigt (2026-06-28, nur gelesen — nichts verändert):** llama-swap.service-Inhalt + in **Anhang A**; skills/sessions/refs/token_stats existieren (Pfade in §3 verifiziert); Backup-Erweiterung + als fertiges Snippet in **Anhang B**. **Keine offenen Box-Fragen mehr** außer §10·3–6. → mit Schritt 2 starten. +2. `backup.sh`/`restore.sh` um die 1:1-Lücken erweitern (§5). +3. `deploy/bootstrap.sh` + `bootstrap-root.sh` (Phasen, State-Marker); llama-swap-Install skripten. +4. `backend/routers/setup.py` + First-Run-Gate. +5. Frontend `/setup`-Wizard (Schritte 1–10), Komponenten-Auswahl als Kernstück; bestehende Views + (Cockpit/AgentView/Sprechen) wiederverwenden. +6. Modell-Restore-aus-Manifest. +7. **Abnahme in frischer VM** (§9). + +Vorschlag: 2–4 zuerst (Skelett lauffähig), Wizard danach. Branch + PR. + +## 9. Abnahmekriterien +- Frisches Ubuntu 26.04 → `bootstrap-root.sh` + `bootstrap.sh` → laufender Stack, kein Spezialwissen. +- Postchecks grün; Telegram, Voice (inkl. Klonstimme bei 📦), 3D-Avatar, Browser funktionieren. +- „Alles 1:1" stellt mem0, Hermes-config.yaml, Secrets, Klonstimme, Skills exakt wieder her. +- Selektiver Modus: einzelne Komponenten ⏭️ überspringbar, Stack läuft trotzdem. +- Idempotenz: zweiter Lauf = No-op. + +## 10. Offene Entscheidungen (vor dem Bau) +1. ~~llama-swap systemd-Unit-Inhalt~~ → **geklärt: kompletter Unit in Anhang A** (in der Bau-Session anlegen). +2. ~~Voice-Referenz-Audio-Ort~~ → **geklärt: `~/.voice/refs/`** (Backup-Snippet in Anhang B, in der Bau-Session umsetzen). +3. **Eigene Avatare**: künftiger Upload-/Ablage-Mechanismus + Backup-Pfad (einziger offener 1:1-Daten-Punkt). +4. **Off-Box-Backup-Ziel** (NAS/2. Platte/Cloud) — [[mc2-backup-restore]]. +5. **Python 3.14** auf frischem Ubuntu beschaffen (deadsnakes?). +6. **Bootstrap-sudo-Modell**: getrenntes `bootstrap-root.sh` (empfohlen) vs. interaktives sudo. + +## 11. Referenzen +- `backend/config.py`, [[project-mc2-architecture]], [[project-stack-state]] +- [[project-hermes-setup]], `docs/HERMES_SETUP.md` (entfesseltes Profil, Browser, PC-Executor) +- [[voice-sprechen-feature]] (Voice + 3D-Avatar), [[mem0-memory-architecture]], [[mc2-backup-restore]] +- `deploy/{deploy,backup,restore,provision-engine,stack-postcheck,warmup}.sh`, `voice_service/install.sh` + +--- + +## Anhang A — `llama-swap.service` (1:1 von der Box abgegriffen, 2026-06-28) + +Base-Unit nach `/etc/systemd/system/llama-swap.service` (root). User/GFX sind boxspezifisch +(hitonabi, gfx1151 → HSA 11.5.1) — auf anderer Hardware anpassen. Die `.d/`-Drop-ins +(`vulkan.conf`, `warmup.conf`) legt `provision-engine.sh` an. + +```ini +[Unit] +Description=llama-swap (lokaler LLM Router) +After=network-online.target +Wants=network-online.target + +[Service] +Type=simple +User=hitonabi +Environment=HSA_OVERRIDE_GFX_VERSION=11.5.1 +Environment=PATH=/usr/local/bin:/usr/bin:/bin +ExecStart=/usr/local/bin/llama-swap --config /etc/llama-swap/config.yaml --listen 0.0.0.0:8080 --watch-config +Restart=on-failure +RestartSec=3 + +[Install] +WantedBy=multi-user.target +``` +```ini +# /etc/systemd/system/llama-swap.service.d/vulkan.conf +[Service] +Environment=LD_LIBRARY_PATH=/opt/llamacpp-vulkan +``` +```ini +# /etc/systemd/system/llama-swap.service.d/warmup.conf +[Service] +ExecStartPost=-/usr/local/bin/llama-swap-warmup.sh +``` + +**Erstinstall-Reihenfolge:** `bash deploy/update-swap.sh` (Binary) → Unit kopieren → +`sudo bash deploy/provision-engine.sh` (Engine+Drop-ins) → `sudo systemctl enable --now llama-swap`. + +--- + +## Anhang B — Backup-Scope-Erweiterung für echtes 1:1 (fertiges Snippet) + +In `deploy/backup.sh` ergänzen (Variablen oben: `VOICE="${VOICE_HOME:-$HOME/.voice}"`, +Stage zusätzlich `"$STAGE/voice"`): + +```bash +# 1:1-Erweiterung (scan-verifiziert 2026-06-28): +[ -f "$HERMES/token_stats.json" ] && cp -a "$HERMES/token_stats.json" "$STAGE/hermes/" || true +[ -d "$HERMES/skills" ] && cp -a "$HERMES/skills" "$STAGE/hermes/skills" || true +[ -d "$HERMES/sessions" ] && cp -a "$HERMES/sessions" "$STAGE/hermes/sessions" || true +[ -d "$VOICE/refs" ] && cp -a "$VOICE/refs" "$STAGE/voice/refs" || true +``` +tar-Aufruf um den re-downloadbaren Skill-Cache erleichtern: +```bash +tar --exclude='./hermes/skills/.hub' -czf "$OUT" -C "$STAGE" . +``` +In `deploy/restore.sh` spiegelbildlich (skills/sessions **mergen**, nicht ersetzen) und +`voice-service` mit neustarten: +```bash +VOICE="${VOICE_HOME:-$HOME/.voice}" +SERVICES="mem0-service voice-service mission-control-2 hermes-gateway" +[ -f "$STAGE/hermes/token_stats.json" ] && cp -a "$STAGE/hermes/token_stats.json" "$HERMES/" +[ -d "$STAGE/hermes/skills" ] && { mkdir -p "$HERMES/skills"; cp -a "$STAGE/hermes/skills/." "$HERMES/skills/"; } +[ -d "$STAGE/hermes/sessions" ] && { mkdir -p "$HERMES/sessions"; cp -a "$STAGE/hermes/sessions/." "$HERMES/sessions/"; } +[ -d "$STAGE/voice/refs" ] && { mkdir -p "$VOICE/refs"; cp -a "$STAGE/voice/refs/." "$VOICE/refs/"; } +``` diff --git a/docs/LUCY_TTS_PLAN.md b/docs/LUCY_TTS_PLAN.md new file mode 100644 index 0000000..3cce642 --- /dev/null +++ b/docs/LUCY_TTS_PLAN.md @@ -0,0 +1,149 @@ +# Lucy TTS — Optimierungs- & Strategieplan + +> Ziel: **Lucys Stimme läuft 100 % lokal & on-device** (kein Box-Zwang, keine Cloud). +> Primärengine: **Kyutai pocket-tts 2.1.0** (CPU). Strategische Alternative: **F5-TTS** (GPU/ONNX). +> Stand: 2026-06-30. Resume-fähig im Stil von `docs/STATUS.md`. + +## Leitentscheidung: Hardware +- **pocket-tts ist CPU-gebunden** — Kyutai bestätigt: *kein* GPU-Speedup (Batch 1, 100M Params). + → **RDNA2 vs. RDNA4 ist für pocket irrelevant.** Lucy läuft dort, wo der beste CPU steht. +- **GPU zählt nur für F5-TTS** (non-autoregressiv, große Matmuls). Dort gewinnt **RDNA4 (9070 XT) + DirectML** + deutlich gegen RDNA2 → falls F5 die Lucy-Stimme wird, läuft sie auf der RDNA4-Maschine. +- **Konsequenz:** `oute n_gpu_layers=999` und „pocket auf ROCm/Vulkan" werden **eingestellt**. + +--- + +## Phase A — Sofort-Wins (risikoarm, pocket_server.py) + +**A1 — Voice → safetensors exportieren (einmalig)** +- Statt `get_state_for_audio_prompt(ref)` bei jedem Boot: einmal `export_model_state(...)` → `lucy_voice.safetensors`. +- Server lädt beim Start nur noch die safetensors (liest kvcache, keine Klon-Rechnung) → schnellerer Start. +- Fallback behalten: wenn safetensors fehlt → aus `ref.mp3` klonen + direkt exportieren. + +**A2 — Referenz säubern** +- Kyutai: Sample-Qualität wird *mitreproduziert*. Sauber entrauschte/normalisierte `ref` → weniger Artefakte. +- Schritt in `_prep_ref()` ergänzen (Denoise/Highpass/Lautheit), Ergebnis cachen. + +**A3 — temp-Sweep gegen Kollaps** +- Hypothese: `temp=0.9` treibt die best-of-N-Regenerationen. Niedriger testen (0.7–0.85). +- Akzeptanz: gleiche/bessere Natürlichkeit bei **messbar weniger Regenerationen** (= weniger Latenz). + +*Gate A:* A1–A3 live, Kollaps-Rate & TTFB protokolliert. + +--- + +## Phase B — Benchmark-Harness (datenbasiert tunen) + +**B1 — `bench_lucy.py`** (lokal, CPU) +- Misst je Konfig: **RTF**, **TTFB**, **Kollaps-/Regenerations-Rate**, Whisper-Rücktranskription (Verständlichkeit). +- Sweep-Achsen: `lsd_decode_steps` (6/8/10/12), `temp`, `noise_clamp`, `quantize` on/off, `frames_after_eos`. +- Feste Testsätze (kurz/mittel/lang, wie in `ptts_test.py`). + +**B2 — CPU-Parallelität** +- pocket nutzt nur **2 Kerne** → mehrere **Satz-Worker parallel** statt globalem `LOCK`. +- Messen: Wall-Clock langer Antworten bei N Workern (1/2/3/4) vs. Qualität/Last. + +*Gate B:* dokumentierte Best-Config (RTF + Kollaps-Rate) als neue Defaults in `pocket_server.py`. + +--- + +## Phase C — Runtime-Eval (lokal schneller + Python-3.14-frei) + +**C1 — ONNX-Pfade testen** +- Kandidaten: **PocketTTS.cpp** (Single-File C++/ONNX, CLI+HTTP+FFI) und **sherpa-onnx** (Windows, viele Bindings). +- Ziel: torch-CPU schlagen **und** das Python-3.14-Packaging-Problem umgehen. +- Vergleich gegen Phase-B-Baseline (gleicher Benchmark). + +**C2 — Server-Vertrag prüfen** +- Fertige **OpenAI-kompatible Streaming-Server** (teddybear082 / ai-joe-git) gegen den aktuellen Custom-Proxy halten. +- Nur übernehmen, wenn Stimm-Wächter (F0 + Fingerabdruck) erhalten/abbildbar bleiben. + +*Gate C:* Entscheidung „torch-CPU behalten" vs. „auf ONNX-Runtime wechseln" (mit Zahlen). + +--- + +## Phase D — Strategische Weiche: pocket vs. F5 + +**D1 — F5 fair gegen pocket messen** +- `lucy-f5/` (F5-TTS DE, ONNX + DirectML, **RDNA4/9070 XT**) ist **non-autoregressiv → strukturell kein + Kollaps/Männerstimme/Wiederholung** (genau pockets Schmerz). +- Gleicher Benchmark wie Phase B: RTF, TTFB, Natürlichkeit, Stabilität. + +**D2 — Entscheidung** +- **pocket gewinnt** (gut genug stabil, CPU, „nur lokal"-Ideal): pocket = Lucy-Stimme, F5 verworfen/geparkt. +- **F5 gewinnt** (Stabilität schlägt den Latenz-Overhead der Wächter): F5 = Lucy-Stimme auf RDNA4, + **pocket bleibt schneller CPU-Fallback** (z. B. wenn keine GPU verfügbar). + +**Beobachtungsposten (extern):** distilliertes **`german`** (statt `german_24l`) ist noch nicht released +(Kyutai fixt Distillations-Datenqualität). Sobald da → größter Einzel-Win (Tempo + Stabilität), +dann `german_24l → german` swappen. Release-Feed im Blick behalten. + +--- + +## Reihenfolge & Quick-Start +1. **A1 + A2 + A3** (heute) — sofort spürbar, kein Risiko. +2. **B1 + B2** — Zahlen sammeln, Defaults härten. +3. **C1/C2** — Runtime-Wechsel nur wenn Benchmark es trägt. +4. **D1/D2** — finale Stimm-Architektur entscheiden. + +## Mess-Ergebnisse & finale Defaults (30.06., 9700X, german_24l) + +Alles auf der lokalen Maschine gemessen (Logs: `sweep_b2.log`, `ttfb_test.log`, `sweep_b2_result.json`). + +**B2-Sweep (6-Satz-Antwort, ~21s Audio):** + +| Konfig | Wall | TTFB | RTF | +|---|---|---|---| +| seriell (1×alle Kerne) | 15,8s | **3,6s** | 0,74 | +| 2w×3t | 12,9s | 6,2s | 0,62 | +| 3w×2t | 10,3s | 6,8s | 0,50 | +| 4w×2t | 9,7s | 8,2s | **0,44** | + +Erkenntnis: pocket ist **speicherbandbreiten-gebunden**. Der Pool verbessert nur die Gesamt-Wall-Clock +(Batch), verschlechtert aber die **TTFB** deutlich. Seriell liefert RTF 0,74 < 1 → generiert schneller +als Echtzeit → Streaming spielt **lückenlos** und startet am schnellsten. **Für Lucys Live-Stimme +gewinnt seriell.** Pool bleibt Opt-in für Batch (`/tts` ganze Datei): Sweet Spot **4w×2t** / **3w×2t**. + +**B3 (FP-Drift-Gate überspringt kurze Audios) + kurzer erster Chunk:** +Der MFCC-Fingerabdruck ist auf <2s Audio unzuverlässig (sim ~0,84 < 0,94) → löste 3× Fehlalarm- +Regenerierung aus. B3 prüft den Drift erst ab `LUCY_FP_MIN_S=2.0`s stimmhafter Dauer; der F0- +Männerstimmen-Wächter bleibt immer aktiv. Effekt (Drift-Warnungen pro Lauf: ~6 → 1): + +| | TTFB | Wall | +|---|---|---| +| kurzer 1. Chunk, ohne B3 | 4,71s | 19,9s | +| gebündelt (alt) | 3,74s | 15,8s | +| **kurzer 1. Chunk, mit B3** | **1,31s** | 16,6s | + +→ Lucy spricht nach **1,3s** statt 3,7s, Wall ~gleich, weiter lückenlos. + +**Finale Defaults in `pocket_server.py`:** +`LUCY_WORKERS=0` (seriell) · `LUCY_FAST_FIRST=1` (kurzer 1. Chunk) · `LUCY_FP_MIN_S=2.0` (B3) · +`LUCY_REF_CLEAN=1` (A2) · Voice aus `lucy_voice.safetensors` (A1). Pool-Opt-in für Batch: +`LUCY_WORKERS=4 LUCY_WORKER_THREADS=2`. + +**Offen / nächster Hebel:** distilliertes `german`-Modell (statt `german_24l`) abwarten — größter +Qualität/Tempo-Sprung. Optional: TTFB weiter drücken über kürzeres erstes Wort / `lsd`-Tuning nur +für den ersten Chunk. + +## Umlaute (ae/oe/ue) — Fix (30.06.) + +Symptom: Lucy spricht manchmal „u-e" statt „ü". Ursache: das LLM (Hermes/Qwen) gibt gelegentlich +ASCII-Ersatzschreibweisen (ueber/schoen/maerz) aus; pocket liest sie wörtlich. (ß vs ss ist +akustisch identisch -> ignoriert.) + +**Wurzel-Fix (empfohlen, auf der Box im Hermes-System-Prompt/Persona ergänzen):** +> „Schreibe ausschließlich korrektes Deutsch mit echten Umlauten (ä, ö, ü) und ß. Verwende niemals +> die Ersatzschreibweisen ae, oe, ue oder ss anstelle von Umlauten." + +**Schutznetz (in `pocket_server.py`, Default an `LUCY_UMLAUT_FIX=1`):** `_fix_umlauts()` wandelt NUR +bekannte deutsche Umlaut-Ganzwörter zurück (Ganzwort + gängige Flexionsendungen, case-erhaltend). +Verifiziert (`umlaut_test.py`): konvertiert über/für/größe/natürlich/mögliche/Gespräche; lässt +neue/aktuell/Steuer/Quelle/Feuer/Frauen/genau/blaue unverändert. Grenzen: reine Wortliste, deckt +nicht jedes seltene Wort — erweiterbar via `LUCY_UMLAUT_EXTRA="wort1,wort2"`. Der Wurzel-Fix bleibt +die zuverlässige Lösung. + +## Referenzen +- pocket-tts README (GPU-kein-Speedup, export-voice, Sprachen): github.com/kyutai-labs/pocket-tts +- Multilingual-Ankündigung (DE = `german_24l`, undistilliert): kyutai.org/blog/2026-05-04-pocket-tts-multilingual +- Tech-Report / Performance: kyutai.org/blog/2026-01-13-pocket-tts · deepwiki.com/kyutai-labs/pocket-tts diff --git a/docs/REVIEW_2026-07-02.md b/docs/REVIEW_2026-07-02.md new file mode 100644 index 0000000..9dd84ba --- /dev/null +++ b/docs/REVIEW_2026-07-02.md @@ -0,0 +1,221 @@ +# Komplett-Review Mission Control 2 + Lucy — 02.07.2026 + +**Methodik:** IST-Zustand live erhoben (Box per SSH, lokaler Lucy-PC, Working Tree `lucy-v2` inkl. uncommitted) — nicht aus Docs/Memory übernommen. SOLL-Zustand in 3 Recherche-Runden tagesaktuell (Stand 02.07.2026) ermittelt. Alle früheren Verdikte wurden neu auf den Prüfstand gestellt. Scope: alles außer Security. + +--- + +## 1. Management-Summary + +| Bereich | Zustand | Kernaussage | +|---|---|---| +| LLM-Stack (Box) | ✅ stark, 1 Bug | Vulkan-Pfad richtig, Qwen3.6+MTP läuft; aber chat-Lane kaputt (Autostart-Fund war Fehlalarm) | +| Lucy Voice-Latenz | 🔴 3,5–5 s | 2026-Ziel ist 0,5–0,8 s. Schuld sind STT (2,0 s) und VAD-Timer (0,9 s), **nicht** das LLM (TTFT 65 ms) | +| Lucy Avatar/App | ✅ sehr ausgereift | VRMA-Mocap, Lippensync v2, MateEngine-Features komplett; Electron 10 Major-Versionen alt | +| Backend/Frontend-Code | 🟡 solide | 3 Monolithen, etwas DRY-Schuld, dist/ im Git; keine Rot-Flaggen | +| Ökosystem-Aktualität | 🟡 | Hermes 1 Release hinter (v0.18.0 vom 01.07.); pocket-tts, mem0, llama-swap, three-vrm aktuell | +| Verdikte | ✅ alle bestätigt | Pocket TTS, Electron, Qwen3.6-Hirn, kein ZeroClaw, Mem0 — alle bestehen die Re-Prüfung | + +**Die zwei größten Hebel:** +1. **STT-Tausch** (faster-whisper medium → Parakeet-TDT 0.6B v3): ~2,0 s → ~0,2 s pro Äußerung +2. **VAD-Tausch** (RMS-Eigenbau → Silero VAD v6.2): Turn-Ende 900 → ~450 ms bei besserer Genauigkeit + +Zusammen: Voice-to-Voice von ~3,5–5 s auf realistisch **≤1,2 s**, ohne neue Hardware. + +--- + +## 2. IST-Zustand (live verifiziert) + +### 2.1 Box (192.168.178.151 — Strix Halo, gfx1151, 122 GB, Vulkan) + +| Komponente | Installiert | Aktuell (02.07.2026) | Bewertung | +|---|---|---|---| +| llama.cpp | b9843 (86b94708f) | b9859 (01.07.) | ✅ nur ~16 Builds dahinter | +| llama-swap | v233 (29.06.) | v233 | ✅ aktuell | +| Hermes Agent | **v0.17.0** (19.06.) | **v0.18.0** (01.07.) | 🟡 Update lohnt (3 P0 + 493 P1 gefixt) | +| mem0ai / chromadb | 2.0.8 / 1.5.9 | 2.0.8 | ✅ aktuell | +| Kernel | 7.0.0-27-generic | — | ✅ | + +**Live-Modell-Lineup** (`/etc/llama-swap/config.yaml`, live gelesen — der Repo-Snapshot `deploy/llama-swap.config.yaml` ist **veraltet** und zeigt noch gemma-4): + +| Alias | Modell | ctx | Besonderheiten | +|---|---|---|---| +| hermes (Brain) | Qwen3.6-35B-A3B (UD-Q4_K_M, MTP-GGUF) | 65536 | `--spec-type draft-mtp --spec-draft-n-max 3 --parallel 1 -cram 16384`, **kein** cache-reuse | +| heavy | Qwen3.5-122B-A10B | 32768 | cache-reuse 256, ttl 600 | +| coder | Qwen3-Coder-Next | 131072 | cache-reuse 256, ttl 600 | +| coder-lite | Qwen3-Coder-30B-A3B | 131072 | cache-reuse 256, ttl 300 | +| vision | Qwen3-VL-8B | 32768 | mmproj, in brains | +| embed | Qwen3-Embedding-0.6B | 8192 | ttl 0, in brains | +| scout | GLM-4.6V-Flash | 131072 | mmproj, ttl 300 | + +Gruppe `brains` (swap:false, persist:true) = embed + vision + Qwen3.6. Alle Modelle: `-ngl 999 -fa on --no-mmap --jinja`. **Kein Modell nutzt KV-Cache-Quantisierung** (alles F16). + +**Dienste live:** llama-swap, hermes-gateway, hermes-terminal, hermes-webui, mem0-service, voice-service — alle running. Ports 7681/8080/8642/8650/8765/8787/9001 belegt. + +### 2.2 🔴 Live-Bugs (selbst reproduziert) + +**B1 — ~~MC2-Backend ohne Autostart~~ FEHLALARM (korrigiert 02.07., nachverifiziert).** +:9001 läuft als **User-Unit** `mission-control-2.service` (`~/.config/systemd/user/`, enabled, `Linger=yes` → reboot-fest). Die erste SSH-Prüfung sah User-Units nicht (fehlendes XDG_RUNTIME_DIR). Einziger echter Fund: Die **stale v1-System-Unit** `mission-control.service` (disabled, /opt/mission-control:9000) liegt noch in /etc/systemd/system und stiftet Verwirrung → bei Gelegenheit mit sudo entfernen (kosmetisch, kein Risiko). + +**B2 — chat-Lane kaputt (live reproduziert).** +``` +POST /v1/chat/completions {"model":"chat",...} +→ {"error":"no router for requested model","src":"llama-swap"} +``` +Die Routing-Policy routet `chat → fast ↔ heavy`, aber llama-swap kennt den Alias `fast` nicht mehr (Qwen3.6 hat nur noch den Alias `hermes`). Lucy ist nicht betroffen (sie geht über den Hermes-Agenten :8642), aber jeder Client der chat-Lane bekommt Fehler. Fix: `fast` als zweiten Alias eintragen **oder** Policy auf `hermes` umstellen. + +**B3 — Config-Drift.** +`deploy/llama-swap.config.yaml` ist untracked UND veraltet (gemma-4-Ära). Zusätzlich fehlen im Install-Template [`backend/config.py:33`](../backend/config.py) die Produktions-Tunings (cache-reuse, parallel, MTP) → neu installierte Modelle driften von der Box-Realität weg. + +### 2.3 Gemessene Latenzkette Lucy + +Quelle: `/api/voice/metrics` (live) + eigener TTFT-Test gegen llama-swap. + +| Stufe | Messwert | Anteil am Problem | +|---|---|---| +| VAD-Turn-Ende | **900 ms** Fix-Timer (RMS-Eigenbau, [useVAD.ts](../client/lucy-desktop/src/renderer/src/lib/voice/useVAD.ts)) | groß | +| STT (faster-whisper medium int8, Box-CPU) | **avg 2.046 ms · p50 2.092 ms · p95 2.529 ms** (n=13) | **dominant** | +| LLM TTFT (Qwen3.6 warm, direkt :8080) | **65 ms** (24 Tokens in 334 ms) | ✅ kein Problem | +| TTS erster Ton (pocket, RTF 0,44 + LEAD_IN 0,35 s) | ~0,5–1 s für den ersten Satz | mittel | +| **Voice-to-Voice gesamt** | **~3,5–5 s** | Ziel 2026: **0,5–0,8 s** | + +**Fazit: Das teuerste Glied ist NICHT das LLM.** STT + VAD-Timer fressen zusammen ~3 s. Genau dort setzt die Roadmap an. + +### 2.4 Lokaler PC (RX 9070 XT / RDNA4) + +- Lucy-App zum Prüfzeitpunkt nicht gestartet (kein Electron-Prozess, :8130 frei) +- `ptts-venv`: pocket-tts **2.1.0** (= neueste Version), torch 2.12.1+cpu (bewusst CPU), onnxruntime 1.27.0, fastapi 0.138.1 +- GPU-Treiber 32.0.31021.5001 +- [client/lucy-tts/](../client/lucy-tts/) (3 GB): Produktions-TTS mit Stimmen-Wächter (F0-Floor 160 Hz, MFCC-Fingerprint ≥0,94, Best-of-N), Phase A+B des TTS-Plans abgeschlossen (beste Config: 4 Worker × 2 Threads, RTF 0,44) +- [client/lucy-f5/](../client/lucy-f5/) (5,3 GB): F5-TTS-ONNX/DirectML-Experiment — **Phase C/D (Finalentscheid pocket vs. F5) offen** +- Lucy-Desktop: Electron **33** (aktuell: **43** vom 30.06. — 2 Jahre Chromium-Rückstand), three-vrm 3.4/animation 3.5.4 (≈ aktuell), TS strict + +### 2.5 Code-Qualität (3 Explore-Agents über das ganze Repo) + +**Backend (4.889 LOC, 11 Router / 28 Services):** insgesamt sauber, Multi-Sidecar-Architektur durchdacht. Findings: +- C1: Install-Template ohne Produktions-Tunings ([backend/config.py:33](../backend/config.py)) → Drift +- C2: `_describe_images()` blockiert den Voice-Chat bis 120 s synchron ([backend/routers/voice.py](../backend/routers/voice.py)) +- C3: Thinking-Deaktivierung 3× dupliziert (voice.py, gateway.py, mem0_service/app.py) — DRY +- C4: Junk-Fact-Regex im Mem0-Sidecar hartcodiert (Wartungspunkt) +- Dead Code: `backend/services/pricing.py`, vermutlich `token_stats.py` +- Uncommitted Änderungen (voice.py No-Think, connect.py IDE-only-`coding`, mc2-memory-Guards, Mem0-Junk-Guard, voice_service install.sh) sind **alle konsistent und sinnvoll** — nur eben nicht committet + +**Frontend (React 18/Vite 6/Tailwind 4/TanStack 5):** +- Voice-Umzug in die Desktop-App sauber (keine toten Imports/Nav-Reste) ✅ +- UI-Rework (roleMeta/Health/Expert/WarmSet) vollständig; coder_lite↔coder-lite via ALIAS gelöst +- F1: [Cockpit.tsx](../frontend/src/views/models/Cockpit.tsx) (990 Z) + [SystemDrawer.tsx](../frontend/src/components/SystemDrawer.tsx) (934 Z) Monolithen +- F2: 🟡 `frontend/dist/`-Asset-Stand auf lucy-v2 inkonsistent (alte gelöscht, neue untracked) — dist-im-Git selbst ist Absicht (Box hat kein Node), avatar.vrm ist via .gitignore korrekt draußen +- F4: keine globale Error Boundary +- MC3-Prototyp ([frontend/src/mc3/](../frontend/src/mc3/)) non-destruktiv hinter `#mc3`, untracked + +**Lucy-Desktop:** +- L1: [useVoiceAgent.ts](../client/lucy-desktop/src/renderer/src/lib/voice/useVoiceAgent.ts) (377 Z) monolithisch (SSE, Chunking, Tools, Perf, Vision in einem Hook) +- L2: kein Retry/Backoff beim TTS-Warmup (Crash → 2-min-Spinner) +- L3: VAD = reines RMS mit 900-ms-Stille-Regel +- L4: Echo-Schutz = 450-ms-Cooldown-Workaround (kein echtes Barge-in) +- Neues [voice-core/](../client/lucy-desktop/src/renderer/src/voice-core/)-Adapter-Layer (STT/TTS austauschbar) ist die richtige Architektur ✅ +- H1: ~23 Dateien uncommitted, darunter die neue voice-core-Architektur → Verlustrisiko + +--- + +## 3. SOLL-Zustand (Recherche, Stand 02.07.2026) + +### 3.1 Voice-Latenz — der Stand der Technik + +- 2026-Zielmarke: **500–800 ms voice-to-voice**; Grundprinzip: **Streaming auf jeder Stufe** (STT-Partials sparen 200–400 ms, TTS startet auf Teiltext, VAD+Turn-Taking-Budget 150–300 ms) — [Latenz-Guide](https://futureagi.com/blog/how-to-optimize-voice-agent-latency-2026/), [Latenz-Budget-Design](https://smallest.ai/blog/designing-voice-assistants-stt-llm-tts-tools-and-latency-budget) +- **STT:** [Parakeet-TDT 0.6B v3](https://huggingface.co/nvidia/parakeet-tdt-0.6b-v3) — 25 EU-Sprachen inkl. Deutsch, 6,32 % WER (besser als Whisper large-v3 mit 7,44 %), extrem schnell auch auf CPU, keine Silence-Halluzination. Deploy-Wege: [onnx-asr](https://pypi.org/project/onnx-asr/) (unterstützt CPU **und** DirectML → 9070 XT), fertige [OpenAI-kompatible FastAPI-Wrapper](https://github.com/groxaxo/parakeet-tdt-0.6b-v3-fastapi-openai). Kyutais Streaming-STT mit eingebautem semantic VAD ([delayed-streams-modeling](https://github.com/kyutai-labs/delayed-streams-modeling)) wäre architektonisch ideal, ist aber **nur EN/FR** → für Deutsch raus. +- **VAD:** [Silero VAD v6](https://github.com/snakers4/silero-vad/releases/tag/v6.0) (v6.2, ONNX): −16 % Fehler auf Noisy-Data vs. v5 — klar besser als der RMS-Eigenbau; erlaubt kürzeres Endpointing (~450 ms) bei weniger Fehlstarts. +- **Semantische Turn-Detection:** Smart Turn V2 (leichtgewichtig), [Easy Turn](https://arxiv.org/pdf/2509.23938) (akustisch+linguistisch, 4 Turn-States, open source). +- **TTS:** pocket-tts 2.1.0 ist Stand der Technik für CPU-Realtime ([kyutai](https://kyutai.org/blog/2026-01-13-pocket-tts/)). Challenger (CosyVoice2-0.5B, Chatterbox-Turbo) bieten keinen klaren Vorteil. → Einziger offener Entscheid bleibt das hauseigene F5-Experiment (Phase C/D). + +### 3.2 Box maximieren + +- **Vulkan/RADV bleibt der schnellste Pfad auf Strix Halo** (schlägt ROCm/HIP bei pp und tg) — die Box ist richtig aufgestellt ([llm-tracker Strix-Halo](https://llm-tracker.info/_TOORG/Strix-Halo), [Strix-Halo-Guide](https://github.com/hogeheer499-commits/strix-halo-guide)). ROCm 7.2/RDNA4 betrifft nur den lokalen PC. +- **Host-Memory-Prompt-Cache:** `--cache-ram` + Prefix-Restore bringt bis **93 % TTFT-Reduktion** bei Agent-Workloads mit wachsender Session ([llama.cpp #20574](https://github.com/ggml-org/llama.cpp/discussions/20574)). `-cram 16384` ist gesetzt; das Zusammenspiel mit dem (am hermes-Alias entfernten) `--cache-reuse` gehört gebencht. +- **KV-Cache-Quantisierung ungenutzt:** `-ctk/-ctv q8_0` halbiert den KV-Bedarf (relevant bei coder@131k, hermes@65k) bei praktisch verlustfreier Qualität; [TurboQuant](https://github.com/ggml-org/llama.cpp/discussions/20969) (3-bit, near-lossless ab 13B) steht vor der Integration — beobachten. +- **„MoE Speculative Trap":** Ein aktueller [Strix-Halo-Deep-Dive](https://dev.to/agustinsacco/breaking-the-moe-speculative-trap-460-ts-on-amd-strix-halo-446d) zu exakt Qwen3.6-35B-A3B zeigt: Spec-Verify kann bei sparsem MoE pro Verify-Pass fast alle 35B Gewichte anfassen — in seinem Setup war **ohne** Draft (parallel=1, KV Q8_0) 43,1 t/s vs. 17,7 t/s. Das widerspricht der eigenen Box-Messung (+35 % MIT MTP). Konsequenz: **beide Betriebsarten benchen**, auch bei vollem Kontext ([Decode-Drop bis 64 % dokumentiert](https://kmarble.dev/posts/strix-halo-full-context-decode-drops/)). +- **llama-swap-Features ungenutzt:** `capabilities` (v225), `-config-dir`-Fragmente (v230), Swap-Matrix/Groups V2 ([Releases](https://github.com/mostlygeek/llama-swap/releases)). +- Modell-Landschaft 128 GB für heavy-Kandidaten: gpt-oss-120B, Mistral Small 4 (119B-A6B), Llama 4 Scout — nur mit Bench-Gate. + +### 3.3 Ökosystem + +- **Hermes v0.18.0 „Judgment"** (01.07.): 3 P0 + 493 P1 gefixt, Background-Fan-out für Subagents, `/learn`-Skills, Memory-Graph in der Desktop-App ([Releases](https://github.com/NousResearch/hermes-agent/releases)). **Plugin-API:** `sync_turn()` bekommt optional `messages` (voller Turn-Kontext inkl. Tool-Calls); Legacy-Signatur bleibt → **mc2-memory ist update-kompatibel** und kann später Tool-Ergebnisse mitlernen ([Memory-Provider-Doku](https://hermes-agent.nousresearch.com/docs/developer-guide/memory-provider-plugin)). +- **Mem0 v3-Algorithmus** ([Migration](https://docs.mem0.ai/migration/oss-v2-to-v3)): Single-Pass-Extraktion (~2× schneller), Hybrid-Retrieval (semantisch + BM25 + Entity-Graph, ohne externe Graph-DB), +20 LoCoMo / +26 LongMemEval. 2.0.8 installiert, `custom_instructions` schon migriert → Status final verifizieren. +- **Electron 43** (30.06.), Chromium 150 / Node 24 — Lucy ist auf 33. +- **Vision:** Qwen3-VL ist aktuelle Generation ✅; [Qwen3-VL-30B-A3B](https://github.com/qwenlm/qwen3-vl) (MoE, 3B aktiv, top auf GUI-Benchmarks) wäre der Upgrade-Kandidat für die Bildschirm-Sicht. +- **Lokaler GPU-Klon:** [AMD Lemonade](https://runaihome.com/blog/amd-lemonade-local-llm-server-npu-gpu-guide-2026/) (llama.cpp-Vulkan + whisper.cpp + Kokoro, OpenAI-kompatibel, RDNA4-Support) als fertiger Unterbau; llama.cpp-Vulkan ist der [verlässlichste 9070-XT-Pfad](https://digtvbg.com/blog/llama-server-vulkan-rdna4-vllm-rocm-benchmark/). + +### 3.4 Verdikte — Ergebnis der Re-Prüfung + +| Verdikt | Ergebnis | Begründung | +|---|---|---| +| Pocket TTS bleibt | ✅ **bestätigt** | 2.1.0 aktuell, RTF 0,44 optimiert, Wächter-System; Challenger ohne klaren Vorteil. F5-Entscheid (Phase C/D) bleibt als einziger offener Punkt | +| Electron bleibt (nicht Tauri) | ✅ **bestätigt** | Alle nativen Features implementiert; aber Major-Update 33→43 einplanen | +| Qwen3.6 als Lucy-Hirn | ✅ **live bestätigt** | Läuft mit MTP, TTFT 65 ms; gemma-4 ist komplett raus | +| ZeroClaw bleibt tot | ✅ **bestätigt** | Kein neuer Anlass | +| Mem0 als Memory-Layer | ✅ **bestätigt** (neu geprüft) | Zep/Hindsight benchen höher, sind aber schwerer/teils closed; Mem0: beste Integration, v3-Algo, deployt | + +--- + +## 4. Roadmap (Aufwand/Nutzen, Voice-Speed-first) + +### P0 — Live-Bugs & Betriebssicherheit (Stunden) +| # | Maßnahme | Nutzen | +|---|---|---| +| 1 | ~~Autostart fixen~~ **erledigt als Fehlalarm** — User-Unit `mission-control-2` mit Linger ist reboot-fest; nur stale v1-Unit bei Gelegenheit löschen (sudo) | Klarheit | +| 2 | chat-Lane fixen (`fast`-Alias ergänzen oder Policy auf `hermes`) | Live-Bug, alle chat-Clients betroffen | +| 3 | Box-Config → Repo syncen + `deploy/` versionieren; Template-Drift C1 fixen | Quelle der Wahrheit | +| 4 | Hermes v0.17.0 → v0.18.0 + Health-Brain-Check | 496 Upstream-Fixes | +| 5 | Commit-Hygiene (voice-core, MC3, Lucy-Fixes); `frontend/dist/` in .gitignore | Verlustrisiko weg | + +### P1 — Voice-Latenz: 3,5–5 s → Ziel ≤1,2 s (Tage) +| # | Maßnahme | Erwartung | +|---|---|---| +| 6 | **STT-Tausch**: Parakeet-TDT 0.6B v3 statt faster-whisper medium. Variante A: Box-CPU (onnx-asr im voice_service); Variante B: lokal 9070 XT (DirectML). A/B: Deutsch-WER + Latenz | **~2,0 s → ~0,2 s** | +| 7 | **VAD-Tausch**: Silero VAD v6.2 (ONNX) statt RMS in useVAD.ts; Endpointing 900 → ~450 ms | **−450 ms** | +| 8 | TTS-TTFA: LEAD_IN 0,35 s prüfen, Erster-Satz-kurz-Regel messen (lucy_perf) | −100–300 ms | +| 9 | **Brain-Bench-Matrix** am hermes-Alias: MTP n-max 3↔4↔ohne (Speculative-Trap-These) × ±KV Q8_0 × cache-reuse/cram × -b/-ub — bei Kurz- UND Voll-Kontext | Bestes Setup evidenzbasiert | +| 10 | voice_metrics ausbauen: VAD→STT→Agent→First-Audio je Turn | Messbarkeit | +| 10b | KV Q8_0 für coder@131k/heavy erwägen | Warm-Set-Reserve | + +### P2 — Lucy v2 Kern & Code-Gesundheit (1–2 Wochen) +| # | Maßnahme | +|---|---| +| 11 | Semantische Turn-Detection (Smart Turn V2 / Easy Turn) auf Parakeet aufsetzen; Barge-in-Vorstufe statt 450-ms-Cooldown | +| 12 | F5-TTS Phase C/D abschließen → Finalentscheid pocket vs. F5 (Benchmark-Gate) | +| 13 | useVoiceAgent-Refactor in Hooks + TTS-Retry/Backoff; Electron 33→43 | +| 14 | Backend C2 (Vision async) + C3 (DRY) + Dead Code; Frontend Cockpit/SystemDrawer-Split + globale Error Boundary | + +### P3 — Strategisch (nach Signal) +| # | Maßnahme | +|---|---| +| 15 | Mem0-v3-Status final verifizieren; Junk-Regex durch v3-Retrieval entschärfen; mc2-memory auf `sync_turn(messages)` heben | +| 16 | MC3-Vollbau; llama-swap-Features (capabilities, config-dir, Swap-Matrix) | +| 17 | heavy-Bench: Qwen3.5-122B vs. gpt-oss-120B / Mistral Small 4; Vision-Upgrade Qwen3-VL-30B-A3B für Bildschirm-Sicht | +| 18 | Lokaler GPU-Klon: AMD Lemonade auf der 9070 XT evaluieren | + +--- + +## 5. Findings-Katalog (Referenz) + +| ID | Schwere | Fund | Ort | +|---|---|---|---| +| B1 | ⚪ (Fehlalarm) | :9001 läuft als User-Unit mit Linger — reboot-fest; nur stale v1-Unit als Kosmetik-Rest | Box, /etc/systemd/system/mission-control.service (v1) | +| B2 | 🔴 | chat-Lane → fast-Alias existiert nicht mehr | Box, Routing-Policy ↔ /etc/llama-swap/config.yaml | +| B3 | 🟡 | deploy/llama-swap.config.yaml untracked + veraltet | Repo | +| C1 | 🟡 | Install-Template ohne Produktions-Tunings | backend/config.py:33 | +| C2 | 🟡 | Vision-Beschreibung blockiert Chat bis 120 s | backend/routers/voice.py | +| C3 | 🟢 | Thinking-Disable 3× dupliziert | voice.py / gateway.py / mem0_service/app.py | +| C4 | 🟢 | Junk-Fact-Regex hartcodiert | mem0_service/app.py | +| C5 | 🟢 | Dead Code | backend/services/pricing.py, token_stats.py | +| F1 | 🟡 | Monolithen 990/934 Z | frontend/src/views/models/Cockpit.tsx, components/SystemDrawer.tsx | +| F2 | 🟡 (korrigiert) | dist/ im Git ist ABSICHT (Box hat kein Node, deploy = git reset --hard; s. deploy/build.sh) — echter Fund war nur der inkonsistente Asset-Stand auf lucy-v2 (behoben durch Rebuild+Commit). Build-on-Box/CI wäre P3-Option | frontend/dist/ | +| F4 | 🟢 | Keine globale Error Boundary | frontend/src/App.tsx | +| L1 | 🟡 | useVoiceAgent monolithisch (377 Z) | client/lucy-desktop/.../lib/voice/useVoiceAgent.ts | +| L2 | 🟡 | Kein TTS-Warmup-Retry | ebd. + main/index.ts | +| L3 | 🔴 | RMS-VAD mit 900-ms-Timer | client/lucy-desktop/.../lib/voice/useVAD.ts | +| L4 | 🟡 | Echo-Cooldown statt Barge-in | ebd. | +| H1 | 🟡 | ~23 Dateien uncommitted (inkl. voice-core, MC3) | lucy-v2 Working Tree | + +--- + +*Erhoben am 02.07.2026 durch Claude Code (Live-SSH auf Box, lokale PC-Prüfung, 3 Codebase-Agents, 3 Web-Recherche-Runden). Messwerte: /api/voice/metrics (n=13 STT, n=18 chat_ttfb), TTFT-Direktmessung llama-swap :8080.* diff --git a/docs/ZEROCLAW_POC_BRIEF.md b/docs/ZEROCLAW_POC_BRIEF.md new file mode 100644 index 0000000..c6c9870 --- /dev/null +++ b/docs/ZEROCLAW_POC_BRIEF.md @@ -0,0 +1,83 @@ +# Brief: ZeroClaw-PoC als Lucys schlanker Agent-Runtime (Latenz-Fix an der Wurzel) + +> Für eine **frische Claude-Code-Session**. Aufgabe: ZeroClaw (ultraleichter Rust-Agent) als +> risikoarmen Proof-of-Concept neben Hermes aufsetzen und gegen Hermes benchmarken (Prompt-Größe + +> Latenz). Hermes bleibt **unangetastet** parallel laufen — null Risiko für die laufende Lucy. + +## Warum (die ganze Vorgeschichte in Kürze) + +Lucy (Hermes-Agent, Hirn = gemma-4-26B-A4B) braucht **ewig** zum Antworten (Output top, aber 20–80 s/Turn). +Eine sehr lange Latenz-Jagd (2026-06-30) hat die Ursachen **definitiv** geklärt: + +1. **mem0 nutzte `fast` (Qwen) als LLM** (`MEM0_LLM_MODEL=fast`) — das war noch von früher, als `fast` Lucys + Hirn WAR. Nach dem Umzug auf gemma blieb mem0 auf fast → jede Erinnerungs-Op lud fast → **verdrängte + gemmas Warm-Gruppe** → gemma-KV-Cache tot → 40 s Re-Prefill. (Halb-fertige Hirn-Migration.) +2. **gemma ist architektonisch langsam auf Vulkan/Strix-Halo.** Verifiziert am Box-GGUF: + `attention.key/value_length = 512` (head_dim 512!) vs. Qwen3.6 **256**, plus mixed sliding/full + attention → Flash-Attention auf RADV ineffizient → langsamer **Prefill** + **CPU-Spike** (teils + CPU-Fallback). gemma-GENERIERUNG ist ok (~93 t/s), gecachter Prompt **0,3 s** — nur **Cache-Misses** + (Prefill, ~11–27 s) sind tödlich. +3. **gemmas Thinking ist per Default AN** (~90 Extra-Tokens/Antwort). Abschaltbar NUR via + `chat_template_kwargs:{enable_thinking:false}` (verifiziert; `/no_think` & `reasoning_effort` wirken nicht). +4. **Hermes selbst ist Schwergewicht** — DER eigentliche Overhead: 20k-Token-Prompt = **79 Tool-Schemas** + (~17,5k) + **Skills-Manifest** (27 Skills, ~8,7k) + **3-Schichten-Memory mit Auto-Injektion**. Die + Auto-Injektion **variiert den Prompt jeden Turn** → bricht gemmas Cache → Re-Prefill. + +**Verdikt:** Auch nach JEDEM Fix (Eviction behoben: mem0/aux→fast + fast ko-resident; Slot geschützt; +Thinking aus; Auto-Injektion aus; RADV ✓; FA ✓; single-slot cache-reuse) blieb gemma **6–80 s, +unzuverlässig** — der Prozess lief stabil (kein Crash/Eviction), aber gemmas Prefill kommt mit Hermes' +pro-Turn-wechselndem 20k-Prompt nicht klar. **gemma ist auf dieser HW+Agent fundamental ungeeignet für +verlässlich niedrige Latenz.** Einziger gemma-Vorteil: **deutlich besseres Deutsch** (Qwen leakt englische +Wörter, z.B. „biggest"; gemma = natürlich + echte Umlaute). + +## Die These des PoC + +**Hermes' Schwergewicht (Skills + ChromaDB + Auto-Injektion) baut den fetten, instabilen Prompt.** +Ein schlanker Agent (**ZeroClaw**: 3,4 MB Rust, SQLite-Memory statt ChromaDB, minimaler Overhead, „ruthless +about cutting") würde einen **kleinen, STABILEN** Prompt bauen → gemmas langsamer Prefill hat kaum was zu +kauen → **Lucy schnell mit gemma UND Qwen** → gemmas Deutsch gerettet + Lucy entschlackt. Wurzel-Fix statt +Modell-Pflaster. + +## PoC-Aufgabe (risikoarm, Hermes bleibt parallel) +1. **ZeroClaw** auf die Box holen (Rust-Binary; Repos: github.com/zeroclaw-labs/zeroclaw bzw. + github.com/elev8tion/zeroclaw — beides prüfen, das gepflegtere/passende nehmen). Eigener Port, **NICHT** + :8642 (Hermes) anfassen. +2. **An euer MC2-Gateway** hängen (OpenAI-kompatibel, `http://127.0.0.1:9001/v1`). Erst mit Modell `fast` + (Qwen, schnell) testen, dann `hermes` (gemma) für den Deutsch-Vergleich. +3. **Nur Kern-Tools** zuerst: Memory (ZeroClaw-eigenes SQLite ODER per MCP an mc2-memory) + 1–2 Stack-Tools. + Eure bestehenden MCP-Server (`hermes-pc-control`, `mission-control-stack`, `mission-control-memory`, + `hermes-web-fetch`) kann ZeroClaw als MCP-Client mitnutzen. +4. **Benchmark gegen Hermes (Zahlen, nicht Gefühl):** + - **Prompt-Größe** (prompt_tokens) eines simplen Turns: ZeroClaw vs. Hermes (Hermes ≈ 20.000). + - **Latenz** mehrerer Folge-Turns (Cache-Verhalten): wird der Prompt klein+stabil → cached gemma → schnell? + - Messmethode wie in der Saga: `curl` an den Agent + `/v1/chat/completions`-`usage.prompt_tokens` + + llama-swap-POST-Dauer (`journalctl -u llama-swap`). +5. **Entscheidung:** Wird Lucy mit ZeroClaw schnell (idealerweise mit gemma) → voller Umzug planen + (Persona, Memory-Migration mem0/Chroma→SQLite, MCP-Tools, Telegram/Voice). Wenn nicht → **Fallback: + Lucys Hirn auf Qwen3.6-35B-A3B** (schnell+verlässlich) + harte Deutsch-Direktive im System-Prompt. + +## Box-Fakten (für den PoC) +- **Box:** `ssh hitonabi@192.168.178.151` (key-based). Strix Halo, 122 GB, GTT ~124 GB, Vulkan/RADV. +- **MC2-Gateway:** `:9001/v1` (OpenAI-kompat). Aliase: `hermes`→gemma-4-26B (Lucys Hirn), `fast`→Qwen3.6-35B, + `heavy`→Qwen3.5-122B, `coder`/`coder-lite`, `vision`→Qwen3-VL-8B, `embed`→Qwen3-Embedding. +- **llama-swap:** `:8080` (Engine v9843, Vulkan/RADV, `--list-devices` zeigt nur die RADV-GPU — kein + llvmpipe-Fallback). gemma-cmd: `-c 65536 -fa on --cache-reuse 256 -cram 16384` + MTP-Draft. +- **Hermes:** `:8642` (NousResearch), Config `~/.hermes/config.yaml`, API-Key in `~/.hermes/.env` + (`API_SERVER_KEY`). 4 MCP-Server aktiv. **NICHT anfassen — bleibt Lucys Live-Agent bis ZeroClaw steht.** +- **mem0-Sidecar:** `:8765` (`~/.mem0/`, Chroma unter `/srv/models/mem0/chroma`), `MEM0_LLM_MODEL=fast`, + `MEM0_EMBED_MODEL=embed`. Systemd-User-Unit `~/.config/systemd/user/mem0-service.service`. +- **brains-Gruppe** (immer warm, ko-resident): gemma + fast + embed + vision. + +## Modell-Kandidaten (falls Fallback/Vergleich) +| Modell | Profil | Speed (Strix Halo) | Deutsch | +|---|---|---|---| +| gemma-4-26B-A4B | head_dim 512, Thinking, multimodal | langsam (Prefill) | **exzellent** | +| **Qwen3.6-35B-A3B** (auf Box) | head_dim 256, GQA kv=2 | **~85–100 t/s** | gut, aber English-Leaks | +| Qwen3-30B-A3B-Instruct | gleiche Familie | 755 pp / 85 tg (RADV) | wie Qwen3.6 | +| LFM2-8B-A1B (Liquid) | 8B/1B aktiv, Hybrid Conv+MoE | **~170 t/s** | klein → unsicher Deutsch | + +## Leitplanken +- **Hermes/Lucy bleibt live** — PoC läuft isoliert (eigener Port, eigene Memory-Datei). Null Risiko. +- Vor Box-Config-Änderungen Backup; llama-swap reloadt per `-watch-config`. +- Erst messen (Prompt-Größe + Latenz), dann über vollen Umzug entscheiden. + diff --git a/docs/ZEROCLAW_POC_RESULTS.md b/docs/ZEROCLAW_POC_RESULTS.md new file mode 100644 index 0000000..ea16ad0 --- /dev/null +++ b/docs/ZEROCLAW_POC_RESULTS.md @@ -0,0 +1,118 @@ +# ZeroClaw-PoC — Ergebnis & Verdikt (2026-06-30) + +> Durchführung des Plans aus `docs/ZEROCLAW_POC_BRIEF.md`. Hermes blieb die ganze Zeit +> **unangetastet** live (eigener Config-Dir, eigene SQLite-Memory, kein eigener Daemon-Port nötig – +> PoC lief als kurzlebiger CLI-Prozess). Null Risiko für die laufende Lucy. + +## Setup (reproduzierbar, alles auf der Box unter `~/zeroclaw-poc/`) +- **Binary:** ZeroClaw **v0.8.2** (`zeroclaw-labs/zeroclaw`, 32k ⭐, gepflegt – die andere Repo + `elev8tion/zeroclaw` ist ein 23-Commit-Mini-Fork). Prebuilt `x86_64-unknown-linux-gnu`, SHA256 + gegen `SHA256SUMS` verifiziert (`6b9f7e9d…`). Kein Rust-Toolchain auf der Box nötig. +- **Config:** isoliert via `--config-dir ~/zeroclaw-poc/config`. Provider = nativer `openai` + gegen das **MC2-Gateway** (`uri = http://127.0.0.1:9001/v1`, ZeroClaw hängt `/chat/completions` + selbst an; **base-URL, nicht der volle Pfad!**). Gateway braucht **keine Auth** (HTTP 200 offen). +- **Agent:** `[agents.lucy]`, `model_provider = openai.default`, `risk_profile = default` + (supervised), Memory-Backend = **sqlite**. Modellwahl pro Turn via `--model fast|hermes`. +- Stolpersteine gelöst: quickstart braucht TTY → headless via `config set --no-interactive`; + Secrets (`api_key`) brauchen `--no-interactive` + Wert; `risk_profiles.` ist Map → + per `config set` nicht adressierbar, Block direkt in `config.toml` angehängt. + +## Messungen (4 Folge-Turns, je frischer CLI-Prozess, identischer 13k-Prefix) + +| Turn | FAST (Qwen3.6-35B) | HERMES (gemma-4-26B) | input_tokens | +|---|---|---|---| +| 1 | 429 ms | **937 ms** | ~13.059 | +| 2 | 534 ms | **493 ms** | ~13.056 | +| 3 | 337 ms | **340 ms** | ~13.060 | +| 4 | 465 ms | **465 ms** | ~13.061 | + +`hermes`-Alias → verifiziert echtes `gemma-4-26B-A4B-it-…Q4_K_M.gguf` (kein Fallback auf fast); +gemma ist warm in der brains-Gruppe (llama-swap `/running`: gemma + Qwen3.6 + embed alle `ready`). + +## Kernbefunde +1. **Prompt-Größe:** ZeroClaw baut **~13.055–13.061 Tokens** pro simplem Turn — vs. Hermes **≈ 20.000**. + ~35 % kleiner. (Noch weiter reduzierbar: Default-Toolset; PoC lief mit voller Tool-Palette.) +2. **Prompt-Stabilität:** Der Prefix ist **konstant** (13.055–13.061, nur die User-Message variiert + um wenige Tokens). Genau das Gegenteil von Hermes' pro-Turn-wechselnder Auto-Injektion, die + gemmas Cache jeden Turn brach. +3. **Latenz (das Verdikt):** gemma antwortet unter ZeroClaw in **0,3–0,9 s/Turn** — gegenüber + **20–80 s** unter Hermes. Der Latenz-Abfall 937 ms → ~340 ms ab Turn 2 zeigt den **warmen Cache** + (stabiler Prefix → cache-reuse greift). gemma ist hier sogar **gleichauf mit Qwen**. + +## Verdikt +**Die PoC-These ist bestätigt.** Lucys Latenz-Problem war **nicht gemma**, sondern Hermes' +fetter, pro-Turn-instabiler 20k-Prompt, der gemmas Prefill-Cache zerschoss. Ein schlanker Agent +mit **kleinem, stabilem** Prompt macht **gemma sub-sekündlich** — und rettet damit gemmas +**exzellentes Deutsch** (kein Umstieg auf Qwen mit English-Leaks nötig). + +→ **Empfehlung: voller Umzug auf ZeroClaw planen** (mit gemma als Hirn). Kein Fallback auf Qwen nötig. + +## Umzug umgesetzt (2026-06-30, Etappe 2) +Lucy läuft als ZeroClaw-Agent auf der Box (`~/zeroclaw-poc/`), Daemon auf `127.0.0.1:8088`: +- **Persona:** openclaw-Workspace-Dateien in `config/agents/lucy/workspace/` (`IDENTITY.md`, `SOUL.md`, + `USER.md`, `AGENTS.md`) — Lucy spricht „Commander", echte Umlaute, ``-Tags. (Workspace-Pfad = + `/agents//workspace/`, NICHT `config/data`!) +- **MCP-Tools:** 4 Server / 37 Tools (`[[mcp.servers]]` als **Array** mit `name`, nicht Tabelle!) + + Bundle `lucy_tools` an `agents.lucy.mcp_bundles`. Alle verbunden, autonom nutzbar. +- **Hirn:** gemma (`hermes`), Autonomie `level="full"`, Thinking aus via + `providers.models.openai.default.chat_template_kwargs.enable_thinking=false`. +- **Aux:** `classifier_provider`/`summary_provider` → `openai.fastaux` (Qwen); Auto-Hydrate/Save aus. + +## 🔴 KV-Cache-Killer gefunden & gefixt (der eigentliche Latenz-Showstopper) +Daemon-Latenz war erst 5–22 s/Turn (wild schwankend), obwohl Direkt-ans-Gateway gemma einen stabilen +20k-Prompt in **180 ms** cached (call 1 kalt 19 s, call 2–4 = 180 ms, cached=19820). Per Mitschnitt-Proxy +(ZeroClaw→Proxy→Gateway) zwei Folge-Turns **byte-genau gedifft**: +1. **HAUPTSCHULDIGER — Tool-Reihenfolge:** ZeroClaw hängt die 37 MCP-Tools (im `tools`-Array UND im + `deferred_loading`-Textblock) in **zufälliger HashMap-Reihenfolge pro Turn** an → ~5k Token im Prompt + ändern sich jeden Turn → llama.cpp-KV-Cache ab da tot → Full-Re-Prefill. +2. **Neben-Killer — User-Timestamp:** ZeroClaw prefixt die User-Message mit `[YYYY-MM-DD HH:MM:SS ±ZZ:ZZ]` + (variiert jeden Turn; steht am Ende → kleiner). +3. **Ausgeschlossen:** Classifier (feuert gar nicht, 1 Call/Turn), mem0/Memory (feuert bei Chat nicht). + +**Fix (Binary nicht kompilierbar → Wire-Ebene):** schlanker Python-**Normalisierungs-Proxy** +(`~/zeroclaw-poc/normalizing-proxy.py`, Port 9009) zwischen ZeroClaw und Gateway: **sortiert `tools` +deterministisch** + **strippt den Timestamp**. Beide Provider-URIs zeigen auf `:9009`. Ergebnis byte-stabil +verifiziert (System + Tools identisch, nur echte User-Message variiert). **Latenz 5–22 s → ~400 ms typisch** +(Cache-Hit), vereinzelt 2–5 s (gemma cache-reuse/MTP-Rest, evtl. via `-cram 16384`); Tool-Turn ~3,6 s. +gemma-cmd: `-c 65536 -fa on --cache-reuse 256 -cram 16384 + MTP-draft`, single-slot (`--parallel 1` implizit). + +## gemma-4 Cache-Recherche (llama.cpp) + FINALER Hirn-Entscheid: Qwen3.6 +Nach dem Proxy blieben Rest-Spitzen (2–6 s). Tagesaktuelle llama.cpp-Recherche bestätigt: **bekannter, +Gemma-4-spezifischer Bug.** +- **Gemma 4 nutzt „Shared KV Cache"** (letzte Layer teilen K/V mit früheren) → llama.cpp loggt wörtlich + *„cache reuse is not supported - ignoring n_cache_reuse"* → **euer `--cache-reuse 256` ist für gemma-4 + wirkungslos.** ([Issue #21468](https://github.com/ggml-org/llama.cpp/issues/21468)) +- **Fix [PR #22288](https://github.com/ggml-org/llama.cpp/pull/22288)** (merged 24.04.2026): braucht + **`--swa-full`** (hält ganze KV-History, kein Sliding-Window-Pruning). Caveat: cache-reuse ↔ mmproj + inkompatibel. +- **Getestet an der live gemma:** `--swa-full` testweise gesetzt → mehr saubere 400-ms-Hits, ABER weiter + ~50 % Misses (2–6 s). Auch nach Toolset-Eindampfung (Prompt 18k→**4908 Tok** via + `risk_profiles.default.excluded_tools`, 18 Kern-Tools) blieb gemma 1,5–6 s **spitzig**. +- **Befund:** gemma-4 cached auf Strix Halo **fundamental unzuverlässig** (SWA + Shared-KV + MTP), egal wie + klein/stabil der Prompt. → live gemma wieder auf **Original zurückgesetzt** (Hermes unberührt; + `--swa-full` als getestete Option dokumentiert, falls Hermes es nutzen will). + +**Qwen3.6-35B-A3B als Lucys Hirn (Standard-GQA, cache-reuse funktioniert):** mit Proxy + Lean-Tools +**konstant ~1,2–1,8 s/Turn, NULL Spitzen** (vs gemma 1,5–6 s spitzig). Deutsch gut (echte Umlaute, kein +EN-Leak in Tests; seltener Kohärenz-Wackler). **Das ist der Brief-Fallback — jetzt empirisch als richtige +Wahl bestätigt.** Lucy-Daemon läuft auf `model=fast`. + +## Finaler Lucy-Stack (läuft, manuell/nohup) +``` +Desktop/Webhook → ZeroClaw-Daemon :8088 (Persona, 18 Lean-Tools, Autonomie full) + → Normalisierungs-Proxy :9009 (sort tools + strip timestamp) ← der Cache-Fix + → MC2-Gateway :9001 → llama-swap :8080 → Qwen3.6 (fast) ← rock-solid Cache +``` + +## Nächste Schritte (offen) +- **Persistenz:** Proxy + Daemon als systemd-User-Services (vom User freizugeben). +- **Voice/Telegram** an den Daemon hängen (Desktop-Client postet aktuell an MC2 `/api/voice/chat`). +- **ZeroClaw-Tool-Order-Bug** upstream melden (nicht-deterministische Tool-Sortierung killt KV-Cache). +- Optional: Deutsch-Direktive in IDENTITY.md härten gegen Qwens seltene Wackler. +- Persona/System-Prompt (Lucys Charakter) in ZeroClaw übertragen. +- Memory-Migration: mem0/Chroma → ZeroClaws SQLite (oder MCP-Bridge an `mission-control-memory`). +- MCP-Tools anbinden: `hermes-pc-control`, `mission-control-stack`, `mission-control-memory`, + `hermes-web-fetch` (ZeroClaw als MCP-Client). +- Toolset auf Kern reduzieren → Prompt < 13k drücken (noch schnellerer Prefill). +- Kanäle: Telegram + Voice an ZeroClaw hängen; Gateway-/Daemon-Betrieb (eigener Port, nicht :8642). +- Erst nach grünem Umzug Hermes ablösen. From 403961da5135094b0a2521a48363d7616e86c9a4 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 2 Jul 2026 10:41:27 +0200 Subject: [PATCH 15/38] =?UTF-8?q?STT:=20Parakeet-TDT=200.6B=20v3=20als=20D?= =?UTF-8?q?efault-Engine=20(Review=20P1-6)=20=E2=80=94=202,0s=20->=200,45s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - onnx-asr (int8, CPU) als neue STT-Engine im Voice-Sidecar; whisper bleibt lazy Fallback - Engine per VOICE_STT_ENGINE + pro Request (Form-Feld engine) waehlbar - A/B auf der Box (10,8s DE-Audio): parakeet 0,45s vs whisper-medium 2,44s, Transkript identisch gut - Live deployt + verifiziert (auch ueber :9001-Proxy: 0,46s) Co-Authored-By: Claude Fable 5 --- voice_service/app.py | 87 +++++++++++++++++++++++++++++++--- voice_service/requirements.txt | 3 ++ 2 files changed, 83 insertions(+), 7 deletions(-) diff --git a/voice_service/app.py b/voice_service/app.py index 6138e8e..f54937b 100644 --- a/voice_service/app.py +++ b/voice_service/app.py @@ -39,10 +39,16 @@ log = logging.getLogger("voice_service") # --- Konfiguration (alles über Env überschreibbar; Defaults = Box-Stand) ---------- PORT = int(os.environ.get("VOICE_PORT", "8650")) # STT -STT_MODEL = os.environ.get("VOICE_STT_MODEL", "medium") # base|small|medium|large-v3 +# Engine: parakeet (Default, ~10× schneller + bessere Deutsch-WER als whisper-medium, +# Review 2026-07-02) | whisper (Fallback). Pro Request via Form-Feld `engine` überschreibbar. +STT_ENGINE = os.environ.get("VOICE_STT_ENGINE", "parakeet") +STT_MODEL = os.environ.get("VOICE_STT_MODEL", "medium") # whisper: base|small|medium|large-v3 STT_DEVICE = os.environ.get("VOICE_STT_DEVICE", "cpu") STT_COMPUTE = os.environ.get("VOICE_STT_COMPUTE", "int8") # int8=CPU-schonend STT_LANG = os.environ.get("VOICE_STT_LANG", "de") +# Parakeet-TDT 0.6B v3 (25 EU-Sprachen inkl. DE, Auto-Language) via onnx-asr. +PARAKEET_MODEL = os.environ.get("VOICE_PARAKEET_MODEL", "nemo-parakeet-tdt-0.6b-v3") +PARAKEET_QUANT = os.environ.get("VOICE_PARAKEET_QUANT", "int8") # ""=fp32 # Piper (Default-TTS): Verzeichnis mit *.onnx (+ *.onnx.json) Stimmen + das Piper-Binary. # Wir nutzen das offizielle Binary (statt des piper-tts-PyPI-Pakets), weil dessen Abhängigkeit # piper-phonemize auf neueren Linux-Systemen keine Wheels hat. Das Binary bringt espeak-ng mit. @@ -113,7 +119,7 @@ def stt_model(): return _stt -def transcribe(audio_bytes: bytes, suffix: str, language: str) -> str: +def transcribe_whisper(audio_bytes: bytes, suffix: str, language: str) -> str: # PyAV (in faster-whisper) dekodiert webm/opus/ogg/wav am robustesten aus einer Datei. with tempfile.NamedTemporaryFile(suffix=suffix, delete=False) as tf: tf.write(audio_bytes) @@ -130,6 +136,65 @@ def transcribe(audio_bytes: bytes, suffix: str, language: str) -> str: pass +# --- Parakeet-TDT (onnx-asr, lazy Singleton) -------------------------------------- +_parakeet = None +_parakeet_failed = False + + +def parakeet_model(): + global _parakeet, _parakeet_failed + if _parakeet is None and not _parakeet_failed: + try: + import onnx_asr + kwargs = {"quantization": PARAKEET_QUANT} if PARAKEET_QUANT else {} + log.info("Lade Parakeet '%s' (quant=%s) …", PARAKEET_MODEL, PARAKEET_QUANT or "fp32") + _parakeet = onnx_asr.load_model(PARAKEET_MODEL, **kwargs) + except Exception: + # int8-Variante kann je nach Release fehlen → einmal fp32 probieren, dann aufgeben. + try: + import onnx_asr + log.warning("Parakeet quant=%s nicht ladbar, versuche fp32", PARAKEET_QUANT, exc_info=True) + _parakeet = onnx_asr.load_model(PARAKEET_MODEL) + except Exception: + _parakeet_failed = True + log.exception("Parakeet nicht verfügbar — STT fällt auf whisper zurück.") + return _parakeet + + +def transcribe_parakeet(audio_bytes: bytes, suffix: str) -> str | None: + """None = Engine nicht verfügbar (Aufrufer fällt auf whisper zurück). + Parakeet v3 erkennt die Sprache selbst; onnx-asr liest nur WAV → Browser-webm/opus + erst via PyAV (steckt in faster-whisper) auf 16 kHz mono dekodieren.""" + model = parakeet_model() + if model is None: + return None + import soundfile as sf + from faster_whisper.audio import decode_audio + with tempfile.NamedTemporaryFile(suffix=suffix, delete=False) as tf: + tf.write(audio_bytes) + src = tf.name + wav = src + ".wav" + try: + arr = decode_audio(src, sampling_rate=16000) + sf.write(wav, arr, 16000, subtype="PCM_16") + return (model.recognize(wav) or "").strip() + finally: + for p in (src, wav): + try: + os.unlink(p) + except OSError: + pass + + +def transcribe(audio_bytes: bytes, suffix: str, language: str, engine: str = "") -> str: + eng = (engine or STT_ENGINE).strip().lower() + if eng == "parakeet": + text = transcribe_parakeet(audio_bytes, suffix) + if text is not None: + return text + return transcribe_whisper(audio_bytes, suffix, language) + + # ================================================================================= # TTS — Piper (offizielles Binary; Stimme = ONNX-Datei + .json daneben) # ================================================================================= @@ -352,8 +417,13 @@ def edge_list() -> list[dict]: async def lifespan(_app: FastAPI): logging.basicConfig(level=logging.INFO) try: - stt_model() # STT beim Start vorwärmen (Modell aus HF-Cache laden) - log.info("Voice-Sidecar bereit (STT '%s', Piper-Dir %s).", STT_MODEL, VOICES_DIR) + # Nur die konfigurierte Engine vorwärmen — whisper bleibt als Fallback lazy + # (spart ~1,5 GB RAM, solange Parakeet läuft). + if STT_ENGINE == "parakeet" and parakeet_model() is not None: + log.info("Voice-Sidecar bereit (STT parakeet '%s', Piper-Dir %s).", PARAKEET_MODEL, VOICES_DIR) + else: + stt_model() + log.info("Voice-Sidecar bereit (STT whisper '%s', Piper-Dir %s).", STT_MODEL, VOICES_DIR) except Exception: log.exception("STT-Vorwärmen fehlgeschlagen (Dienst läuft, /health meldet Detail).") yield @@ -372,7 +442,9 @@ class TTSIn(BaseModel): @app.get("/health") def health() -> dict: - return {"ok": True, "stt_model": STT_MODEL, + stt_active = "parakeet" if (STT_ENGINE == "parakeet" and not _parakeet_failed) else "whisper" + return {"ok": True, "stt_engine": stt_active, + "stt_model": PARAKEET_MODEL if stt_active == "parakeet" else STT_MODEL, "engines": ["elevenlabs", "edge"], "elevenlabs_key": bool(_eleven_key())} @@ -385,12 +457,13 @@ def voices() -> dict: @app.post("/stt") -async def stt(audio: UploadFile = File(...), language: str = Form(default="")) -> dict: +async def stt(audio: UploadFile = File(...), language: str = Form(default=""), + engine: str = Form(default="")) -> dict: data = await audio.read() if not data: raise HTTPException(400, "Leeres Audio.") suffix = Path(audio.filename or "rec.webm").suffix or ".webm" - text = transcribe(data, suffix, language or STT_LANG) + text = transcribe(data, suffix, language or STT_LANG, engine) return {"text": text} diff --git a/voice_service/requirements.txt b/voice_service/requirements.txt index 61ac483..e9946c9 100644 --- a/voice_service/requirements.txt +++ b/voice_service/requirements.txt @@ -8,3 +8,6 @@ soundfile numpy faster-whisper edge-tts +# STT-Default seit Review 2026-07-02: Parakeet-TDT 0.6B v3 (DE-WER besser + ~10x schneller +# als whisper-medium auf CPU, via onnx-asr). whisper bleibt als Fallback installiert. +onnx-asr[cpu,hub] From 45fb61000a62b33f642ee4dac830bf1724f0ed37 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 2 Jul 2026 10:49:36 +0200 Subject: [PATCH 16/38] =?UTF-8?q?VAD:=20Silero=20v5=20(vad-web)=20statt=20?= =?UTF-8?q?RMS-Eigenbau=20=E2=80=94=20Turn-Ende=20900=20->=20450=20ms=20(R?= =?UTF-8?q?eview=20P1-7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - useVAD.ts: MicVAD (neuronale Sprach- statt Pegel-Erkennung), redemptionMs 450, preSpeechPad 320 ms, WAV direkt aus Float32 (kein webm/Opus-Umweg mehr zur Box) - boxStt.ts: Dateiname passend zum Blob-Typ (rec.wav | rec.webm) - Assets self-hosted unter /vad/ via scripts/copy-vad-assets.mjs (npm postinstall), offlinefaehig - Verifiziert: tsc + Build sauber, App startet, Assets werden ausgeliefert (Mikro-Test: User) Co-Authored-By: Claude Fable 5 --- client/lucy-desktop/.gitignore | 1 + client/lucy-desktop/electron.vite.config.ts | 3 + client/lucy-desktop/package-lock.json | 137 ++++++++++++++++- client/lucy-desktop/package.json | 4 +- .../lucy-desktop/scripts/copy-vad-assets.mjs | 23 +++ .../src/renderer/src/lib/voice/useVAD.ts | 144 ++++++++---------- .../renderer/src/voice-core/engines/boxStt.ts | 8 +- 7 files changed, 230 insertions(+), 90 deletions(-) create mode 100644 client/lucy-desktop/scripts/copy-vad-assets.mjs diff --git a/client/lucy-desktop/.gitignore b/client/lucy-desktop/.gitignore index d6530a4..f26aa03 100644 --- a/client/lucy-desktop/.gitignore +++ b/client/lucy-desktop/.gitignore @@ -4,3 +4,4 @@ dist/ *.log # Avatar-VRM ist gross + Lizenz/Redistribution -> nicht committen (lokal/Box vorhalten) src/renderer/public/avatar.vrm +src/renderer/public/vad/ diff --git a/client/lucy-desktop/electron.vite.config.ts b/client/lucy-desktop/electron.vite.config.ts index a620993..0e79038 100644 --- a/client/lucy-desktop/electron.vite.config.ts +++ b/client/lucy-desktop/electron.vite.config.ts @@ -12,6 +12,9 @@ export default defineConfig({ renderer: { root: resolve(__dirname, "src/renderer"), build: { rollupOptions: { input: { index: resolve(__dirname, "src/renderer/index.html") } } }, + // Silero-VAD-Assets (Worklet + ONNX + onnxruntime-WASM) liegen self-hosted in + // src/renderer/public/vad/ (scripts/copy-vad-assets.mjs, läuft via npm postinstall) — + // Pfade = baseAssetPath/onnxWASMBasePath in useVAD.ts. plugins: [react()], }, }) diff --git a/client/lucy-desktop/package-lock.json b/client/lucy-desktop/package-lock.json index a6835d5..d3d1cab 100644 --- a/client/lucy-desktop/package-lock.json +++ b/client/lucy-desktop/package-lock.json @@ -7,11 +7,13 @@ "": { "name": "lucy-desktop", "version": "0.1.0", + "hasInstallScript": true, "dependencies": { "@pixiv/three-vrm": "^3.4.0", "@pixiv/three-vrm-animation": "^3.5.4", "@react-three/drei": "^9.114.0", "@react-three/fiber": "^8.17.10", + "@ricky0123/vad-web": "^0.0.30", "react": "^18.3.1", "react-dom": "^18.3.1", "react-markdown": "^9.1.0", @@ -1027,6 +1029,63 @@ "@pixiv/types-vrmc-vrm-1.0": "3.5.4" } }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", + "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", + "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", + "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz", + "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==", + "license": "BSD-3-Clause" + }, "node_modules/@react-spring/animated": { "version": "9.7.5", "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.5.tgz", @@ -1207,6 +1266,15 @@ } } }, + "node_modules/@ricky0123/vad-web": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@ricky0123/vad-web/-/vad-web-0.0.30.tgz", + "integrity": "sha512-cJyYrh4YeeUBJcbR9Bic/bFDyB9qBkAepvpuWM3vLxnAi7bC3VHzf51UeNdT+OtY4D7MLAgV8iJMc4z41ZnaWg==", + "license": "ISC", + "dependencies": { + "onnxruntime-web": "^1.17.0" + } + }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-beta.27", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", @@ -1768,7 +1836,6 @@ "version": "20.19.43", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz", "integrity": "sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==", - "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -2630,6 +2697,12 @@ "integrity": "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==", "license": "MIT" }, + "node_modules/flatbuffers": { + "version": "25.9.23", + "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-25.9.23.tgz", + "integrity": "sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ==", + "license": "Apache-2.0" + }, "node_modules/fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -2790,6 +2863,12 @@ "dev": true, "license": "ISC" }, + "node_modules/guid-typescript": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz", + "integrity": "sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==", + "license": "ISC" + }, "node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", @@ -3078,6 +3157,12 @@ "immediate": "~3.0.5" } }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", @@ -4112,6 +4197,26 @@ "wrappy": "1" } }, + "node_modules/onnxruntime-common": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.27.0.tgz", + "integrity": "sha512-3KxL5wIVqa8Ex08jxSzncm9CMgw8CjOFyOQ7SxvG9o0cVLlhTNKXyIQuTbtX4tGPJEf73OER2xrjt4HJSBL4ow==", + "license": "MIT" + }, + "node_modules/onnxruntime-web": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.27.0.tgz", + "integrity": "sha512-ogDLsqIozHZwifPuN37OproAo0byX6t43/bP8GzeZWBWD6MOGExswFAx3up4NS/vvWBOg2u2PXomDt3rMmdQSg==", + "license": "MIT", + "dependencies": { + "flatbuffers": "^25.1.24", + "guid-typescript": "^1.0.9", + "long": "^5.2.3", + "onnxruntime-common": "1.27.0", + "platform": "^1.3.6", + "protobufjs": "^7.2.4" + } + }, "node_modules/p-cancelable": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", @@ -4183,6 +4288,12 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/platform": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", + "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", + "license": "MIT" + }, "node_modules/postcss": { "version": "8.5.15", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", @@ -4259,6 +4370,29 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/protobufjs": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.4.tgz", + "integrity": "sha512-RJJPTTpvFfHcWLkIa2JFWK4XvtSzS0yEWDmunqHXli1h3JlkbcQZXDZdcWxv+JK3Xsl5/UFDPZ0iGm7DAengYw==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.5", + "@protobufjs/eventemitter": "^1.1.1", + "@protobufjs/fetch": "^1.1.1", + "@protobufjs/float": "^1.0.2", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.1", + "@types/node": ">=13.7.0", + "long": "^5.3.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/pump": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", @@ -4910,7 +5044,6 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, "license": "MIT" }, "node_modules/unified": { diff --git a/client/lucy-desktop/package.json b/client/lucy-desktop/package.json index 5e1f32e..25fa1b4 100644 --- a/client/lucy-desktop/package.json +++ b/client/lucy-desktop/package.json @@ -7,13 +7,15 @@ "scripts": { "dev": "electron-vite dev", "build": "electron-vite build", - "preview": "electron-vite preview" + "preview": "electron-vite preview", + "postinstall": "node scripts/copy-vad-assets.mjs" }, "dependencies": { "@pixiv/three-vrm": "^3.4.0", "@pixiv/three-vrm-animation": "^3.5.4", "@react-three/drei": "^9.114.0", "@react-three/fiber": "^8.17.10", + "@ricky0123/vad-web": "^0.0.30", "react": "^18.3.1", "react-dom": "^18.3.1", "react-markdown": "^9.1.0", diff --git a/client/lucy-desktop/scripts/copy-vad-assets.mjs b/client/lucy-desktop/scripts/copy-vad-assets.mjs new file mode 100644 index 0000000..3b4df3d --- /dev/null +++ b/client/lucy-desktop/scripts/copy-vad-assets.mjs @@ -0,0 +1,23 @@ +// Kopiert die Silero-VAD-Assets (Worklet + ONNX-Modell + onnxruntime-WASM) nach public/vad/, +// damit die App sie self-hosted lädt (offlinefähig, kein CDN). Läuft via npm postinstall. +// public/ wird von Vite in Dev UND Build verbatim ausgeliefert -> ein Pfad für beide Welten. +import { copyFileSync, mkdirSync, readdirSync } from "node:fs" +import { dirname, join } from "node:path" +import { fileURLToPath } from "node:url" + +const root = join(dirname(fileURLToPath(import.meta.url)), "..") +const dest = join(root, "src", "renderer", "public", "vad") +mkdirSync(dest, { recursive: true }) + +const jobs = [ + [join(root, "node_modules", "@ricky0123", "vad-web", "dist"), (f) => f === "vad.worklet.bundle.min.js" || f.endsWith(".onnx")], + [join(root, "node_modules", "onnxruntime-web", "dist"), (f) => f.endsWith(".wasm") || f.endsWith(".mjs")], +] + +let n = 0 +for (const [src, match] of jobs) { + for (const f of readdirSync(src)) { + if (match(f)) { copyFileSync(join(src, f), join(dest, f)); n++ } + } +} +console.log(`[vad-assets] ${n} Dateien nach ${dest} kopiert.`) diff --git a/client/lucy-desktop/src/renderer/src/lib/voice/useVAD.ts b/client/lucy-desktop/src/renderer/src/lib/voice/useVAD.ts index 27fca5d..f77653d 100644 --- a/client/lucy-desktop/src/renderer/src/lib/voice/useVAD.ts +++ b/client/lucy-desktop/src/renderer/src/lib/voice/useVAD.ts @@ -1,8 +1,12 @@ import { useEffect, useRef } from "react" +import { MicVAD } from "@ricky0123/vad-web" -// Freisprech-VAD (Voice Activity Detection): lauscht dauerhaft am Mikro, erkennt Sprech-Beginn/-Ende -// per Energie und liefert komplette Äußerungen als Blob. RÜCKKOPPLUNGS-SCHUTZ: `paused` (Lucy denkt/spricht) -// stoppt die Erkennung -> Lucys eigene Stimme triggert das Mikro nicht; + echoCancellation + Abkling-Sperre. +// Freisprech-VAD: lauscht dauerhaft am Mikro und liefert komplette Äußerungen als Blob. +// Seit Review P1-7 (2026-07-02) Silero VAD v5 (neuronal, via vad-web/onnxruntime-wasm) statt +// des RMS-Eigenbaus: erkennt Sprache statt Lautstärke (robust gegen Tastatur/Lüfter) und +// erlaubt dadurch ein kürzeres Turn-Ende (450 ms statt 900 ms Stille) ohne Abschneiden. +// RÜCKKOPPLUNGS-SCHUTZ bleibt: `paused` (Lucy denkt/spricht) verwirft laufende Erkennung, +// + echoCancellation + Abkling-Sperre nach Lucys Antwort. interface VADOptions { enabled: boolean // VAD-Modus an? @@ -11,11 +15,28 @@ interface VADOptions { onListening?: (active: boolean) => void // UI: gerade Sprache am Aufnehmen? } -// Erkennung per ZEIT-DOMÄNEN-RMS mit ADAPTIVEM Rausch-Pegel (kalibriert sich aufs Mikro) — robuster -// als feste Frequenz-Schwellen. Schwellen werden relativ zum gemessenen Rauschen berechnet. -const START_FRAMES = 3 // so viele laute Frames in Folge -> Start (gegen Klick-Fehlstarts) -const SILENCE_MS = 900 // so lange Stille -> Äußerung zu Ende -const COOLDOWN_MS = 450 // nach Pause-Ende kurz taub (Echo/Lautsprecher abklingen lassen) +const REDEMPTION_MS = 450 // so lange Stille -> Äußerung zu Ende (war 900 ms beim RMS-VAD) +const PRE_SPEECH_PAD_MS = 320 // Vorlauf mitschneiden (erster Wortanfang nicht abschneiden) +const MIN_SPEECH_MS = 160 // kürzer = Klick/Räuspern -> verwerfen +const COOLDOWN_MS = 450 // nach Lucys Antwort kurz taub (Echo/Lautsprecher abklingen lassen) + +// Float32-Samples (16 kHz mono) -> WAV-Blob (PCM16). Ersetzt den MediaRecorder-webm-Umweg: +// die Box muss kein Opus mehr dekodieren, Parakeet/Whisper bekommen direkt sauberes WAV. +function toWavBlob(samples: Float32Array, sampleRate = 16000): Blob { + const buf = new ArrayBuffer(44 + samples.length * 2) + const v = new DataView(buf) + const writeStr = (off: number, s: string) => { for (let i = 0; i < s.length; i++) v.setUint8(off + i, s.charCodeAt(i)) } + writeStr(0, "RIFF"); v.setUint32(4, 36 + samples.length * 2, true); writeStr(8, "WAVE") + writeStr(12, "fmt "); v.setUint32(16, 16, true); v.setUint16(20, 1, true); v.setUint16(22, 1, true) + v.setUint32(24, sampleRate, true); v.setUint32(28, sampleRate * 2, true); v.setUint16(32, 2, true); v.setUint16(34, 16, true) + writeStr(36, "data"); v.setUint32(40, samples.length * 2, true) + let off = 44 + for (let i = 0; i < samples.length; i++, off += 2) { + const s = Math.max(-1, Math.min(1, samples[i])) + v.setInt16(off, s < 0 ? s * 0x8000 : s * 0x7fff, true) + } + return new Blob([buf], { type: "audio/wav" }) +} export function useVAD({ enabled, paused, onUtterance, onListening }: VADOptions) { const pausedRef = useRef(paused); pausedRef.current = paused @@ -29,92 +50,47 @@ export function useVAD({ enabled, paused, onUtterance, onListening }: VADOptions useEffect(() => { if (!enabled) return let cancelled = false - let stream: MediaStream | null = null - let ctx: AudioContext | null = null - let raf = 0 - let rec: MediaRecorder | null = null - let chunks: Blob[] = [] - let speaking = false - let silenceStart = 0 - let voiceFrames = 0 - - const setListening = (v: boolean) => onLst.current?.(v) + let vad: Awaited> | null = null ;(async () => { try { - stream = await navigator.mediaDevices.getUserMedia({ - audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true }, + vad = await MicVAD.new({ + model: "v5", + // Assets self-hosted (electron.vite.config.ts kopiert sie nach /vad/) — offlinefähig. + baseAssetPath: "/vad/", + onnxWASMBasePath: "/vad/", + positiveSpeechThreshold: 0.5, + negativeSpeechThreshold: 0.35, + redemptionMs: REDEMPTION_MS, + preSpeechPadMs: PRE_SPEECH_PAD_MS, + minSpeechMs: MIN_SPEECH_MS, + getStream: () => navigator.mediaDevices.getUserMedia({ + audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true }, + }), + onSpeechStart: () => { + if (pausedRef.current || performance.now() < resumeAt.current) return + onLst.current?.(true) + }, + onSpeechEnd: (audio: Float32Array) => { + onLst.current?.(false) + // Während Lucy denkt/spricht (oder direkt danach) erkannte Sprache = ihr eigenes + // Echo bzw. Nachhall -> verwerfen statt transkribieren. + if (cancelled || pausedRef.current || performance.now() < resumeAt.current) return + if (audio.length < MIN_SPEECH_MS * 16) return // 16 Samples/ms @16 kHz + onUtt.current(toWavBlob(audio)) + }, + onVADMisfire: () => onLst.current?.(false), }) + if (cancelled) { vad.destroy(); return } + vad.start() } catch (e) { - console.error("VAD: Mikrofon-Zugriff verweigert", e); return + console.error("VAD: Silero-Init fehlgeschlagen", e) } - if (cancelled) { stream.getTracks().forEach((t) => t.stop()); return } - - const Ctor = window.AudioContext || (window as any).webkitAudioContext - ctx = new Ctor() - try { await ctx.resume() } catch { /* */ } // WICHTIG: sonst bleibt der Context 'suspended' -> nur Nullen - const srcNode = ctx.createMediaStreamSource(stream) - const analyser = ctx.createAnalyser() - analyser.fftSize = 1024 - srcNode.connect(analyser) - const wave = new Uint8Array(analyser.fftSize) - let noiseFloor = 0.015 // adaptiver Rausch-Pegel (kalibriert sich auf das Mikro) - const mime = MediaRecorder.isTypeSupported("audio/webm;codecs=opus") ? "audio/webm;codecs=opus" : "audio/webm" - - const startRec = () => { - chunks = [] - rec = new MediaRecorder(stream!, { mimeType: mime }) - rec.ondataavailable = (e) => { if (e.data.size) chunks.push(e.data) } - rec.onstop = () => { - const blob = new Blob(chunks, { type: mime }) - if (!cancelled && blob.size > 2400) onUtt.current(blob) // Mini-Blobs (Klicks) verwerfen - } - rec.start() - setListening(true) - } - const stopRec = (emit: boolean) => { - if (rec && rec.state !== "inactive") { - if (!emit) rec.onstop = null - rec.stop() - } - rec = null - setListening(false) - } - - const tick = () => { - if (cancelled) return - analyser.getByteTimeDomainData(wave) - let sq = 0 - for (let i = 0; i < wave.length; i++) { const v = (wave[i] - 128) / 128; sq += v * v } - const level = Math.sqrt(sq / wave.length) // RMS-Pegel 0..1 - const now = performance.now() - // Rausch-Pegel langsam an leise Phasen angleichen (nur wenn nicht geredet wird) - if (!speaking) noiseFloor += (Math.min(level, noiseFloor * 1.6 + 0.004) - noiseFloor) * 0.05 - const startTh = Math.max(0.02, noiseFloor * 2.8) // Sprache: deutlich über dem Rauschen - const stopTh = Math.max(0.012, noiseFloor * 1.7) // Stille: nahe am Rauschen - - if (pausedRef.current || now < resumeAt.current) { - if (speaking) { speaking = false; voiceFrames = 0; silenceStart = 0; stopRec(false) } // verwerfen - } else if (!speaking) { - if (level > startTh) { voiceFrames++; if (voiceFrames >= START_FRAMES) { speaking = true; silenceStart = 0; startRec() } } - else voiceFrames = 0 - } else { - if (level < stopTh) { - if (!silenceStart) silenceStart = now - else if (now - silenceStart > SILENCE_MS) { speaking = false; silenceStart = 0; stopRec(true) } - } else silenceStart = 0 - } - raf = requestAnimationFrame(tick) - } - tick() })() return () => { cancelled = true - cancelAnimationFrame(raf) - try { if (rec && rec.state !== "inactive") { rec.onstop = null; rec.stop() } } catch { /* */ } - stream?.getTracks().forEach((t) => t.stop()) - try { ctx?.close() } catch { /* */ } + try { vad?.destroy() } catch { /* */ } onLst.current?.(false) } }, [enabled]) diff --git a/client/lucy-desktop/src/renderer/src/voice-core/engines/boxStt.ts b/client/lucy-desktop/src/renderer/src/voice-core/engines/boxStt.ts index e117fea..700f659 100644 --- a/client/lucy-desktop/src/renderer/src/voice-core/engines/boxStt.ts +++ b/client/lucy-desktop/src/renderer/src/voice-core/engines/boxStt.ts @@ -1,14 +1,16 @@ -// Box-STT-Adapter — Spracherkennung läuft auf der Box (MC2 /api/voice/stt -> faster-whisper). +// Box-STT-Adapter — Spracherkennung läuft auf der Box (MC2 /api/voice/stt -> Parakeet, +// whisper als Fallback). Der Dateiname muss zum Blob-Typ passen: der Sidecar wählt die +// Dekodierung nach Suffix (Silero-VAD liefert WAV, Push-to-Talk weiterhin webm/opus). import { BOX_URL } from "../../config" import type { SttEngine } from "../types" export class BoxSttEngine implements SttEngine { - readonly id = "box-whisper" + readonly id = "box-stt" constructor(private readonly baseUrl: string = BOX_URL) {} async transcribe(audio: Blob): Promise { const fd = new FormData() - fd.append("audio", audio, "rec.webm") + fd.append("audio", audio, audio.type.includes("wav") ? "rec.wav" : "rec.webm") const r = await fetch(`${this.baseUrl}/api/voice/stt`, { method: "POST", body: fd }) if (!r.ok) throw new Error(`STT ${r.status}`) return (await r.json()).text?.trim() || "" From e08d8125982457657eec2ef32bc2cf857d3165ed Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 2 Jul 2026 10:56:23 +0200 Subject: [PATCH 17/38] Brain-Bench + Latenz-Metrik (Review P1-9/P1-10) - Bench-Matrix Qwen3.6 (5 Configs, separater Port): MTP n-max 3 bestaetigt (+26% tg), n-max 4 lohnt nicht, KV Q8_0 gratis (78,6=78,6 t/s) bei halbem KV-Speicher - deploy-Config: -ctk/-ctv q8_0 am hermes-Eintrag (Live-Schaltung: User-Freigabe noetig) - voice.py: chat_first_content-Metrik (echte Hirn-Latenz bis erster Inhalts-Token) - Report um Umsetzungs-Nachtrag ergaenzt Co-Authored-By: Claude Fable 5 --- backend/routers/voice.py | 8 +++++++- deploy/llama-swap.config.yaml | 2 +- docs/REVIEW_2026-07-02.md | 26 ++++++++++++++++++++++++++ 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/backend/routers/voice.py b/backend/routers/voice.py index 2ce0980..211de16 100644 --- a/backend/routers/voice.py +++ b/backend/routers/voice.py @@ -223,6 +223,7 @@ async def voice_chat(body: ChatIn) -> StreamingResponse: async def gen(): t0 = time.perf_counter() first = True + first_content = True try: async with httpx.AsyncClient(timeout=httpx.Timeout(None, connect=5.0)) as client: async with client.stream( @@ -233,9 +234,14 @@ async def voice_chat(body: ChatIn) -> StreamingResponse: yield f"data: {{\"error\": \"Hermes {r.status_code}: {detail}\"}}\n\n".encode() return async for chunk in r.aiter_raw(): - if first: # Time-To-First-Byte des Hermes-Streams (gefühlte Lucy-Latenz) + if first: # Time-To-First-Byte des Hermes-Streams (Verbindungs-Overhead) record_stage("chat_ttfb", (time.perf_counter() - t0) * 1000.0) first = False + # Erster CONTENT-Delta = echte Hirn-Latenz (Agent-Overhead + LLM-TTFT) — + # chat_ttfb misst nur den SSE-Start (~5 ms) und ist dafür blind. + if first_content and b'"content"' in chunk: + record_stage("chat_first_content", (time.perf_counter() - t0) * 1000.0) + first_content = False yield chunk except httpx.HTTPError as exc: yield f"data: {{\"error\": \"Verbindung zu Hermes fehlgeschlagen: {exc}\"}}\n\n".encode() diff --git a/deploy/llama-swap.config.yaml b/deploy/llama-swap.config.yaml index 67f3c93..d7ca508 100644 --- a/deploy/llama-swap.config.yaml +++ b/deploy/llama-swap.config.yaml @@ -5,7 +5,7 @@ globalTTL: 0 models: Qwen3.6-35B-A3B: cmd: | - llama-server -m /srv/models/Qwen3.6-35B-A3B-MTP-GGUF/Qwen3.6-35B-A3B-UD-Q4_K_M.gguf --host 127.0.0.1 --port ${PORT} -c 65536 -ngl 999 -fa on --no-mmap --jinja --parallel 1 -cram 16384 --spec-type draft-mtp --spec-draft-n-max 3 + llama-server -m /srv/models/Qwen3.6-35B-A3B-MTP-GGUF/Qwen3.6-35B-A3B-UD-Q4_K_M.gguf --host 127.0.0.1 --port ${PORT} -c 65536 -ngl 999 -fa on --no-mmap --jinja --parallel 1 -cram 16384 -ctk q8_0 -ctv q8_0 --spec-type draft-mtp --spec-draft-n-max 3 ttl: 0 aliases: - hermes diff --git a/docs/REVIEW_2026-07-02.md b/docs/REVIEW_2026-07-02.md index 9dd84ba..d3f61fe 100644 --- a/docs/REVIEW_2026-07-02.md +++ b/docs/REVIEW_2026-07-02.md @@ -218,4 +218,30 @@ Quelle: `/api/voice/metrics` (live) + eigener TTFT-Test gegen llama-swap. --- +## 6. Nachtrag: P0/P1-Umsetzung (02.07.2026) + +**P0 komplett:** chat-Lane gefixt (fast-Alias), Hermes v0.18.0 (Postcheck grün), Config versioniert, Template-Drift behoben, Git aufgeräumt. B1 war Fehlalarm (s.o.). + +**P1-6 STT:** Parakeet-TDT 0.6B v3 (onnx-asr, int8, Box-CPU) als Default — **A/B gemessen: 0,45 s vs. 2,44 s** (whisper-medium) bei identischem Transkript. Live deployt, auch via :9001 verifiziert. + +**P1-7 VAD:** Silero v5 (vad-web 0.0.30) statt RMS — Endpointing 900→450 ms, WAV direkt (kein Opus-Umweg mehr). Build + Asset-Auslieferung verifiziert; Mikro-Test beim User. + +**P1-9 Brain-Bench-Matrix** (Qwen3.6-35B-A3B, separater Port, Vulkan, je ~100 Gen-Token): + +| Config | tg kurz | tg tief (15k) | Draft-Akzeptanz kurz | +|---|---|---|---| +| MTP n-max 3, KV f16 (live) | **78,6 t/s** | — (Probe-EOS) | 55 % | +| MTP n-max 4 | 63,7 | 100,9* | 39 % | +| ohne Spec | 62,4 | — (Probe-EOS) | — | +| **MTP n-max 3 + KV Q8_0** | **78,6** | 83,7 | 56 % | +| ohne Spec + KV Q8_0 | 62,1 | 57,0 | — | + +*\*repetitiver Test-Text → unrealistisch hohe Draft-Akzeptanz (95 %); die Kurz-Spalte ist maßgeblich.* + +**Bench-Verdikte:** (1) MTP n-max 3 bestätigt (+26 % vs. ohne Spec — die „MoE Speculative Trap" gilt auf diesem Vulkan/parallel-1-Setup NICHT; der Artikel testete ROCm + parallel 4). (2) n-max 4 lohnt nicht (Akzeptanz fällt auf 39 %). (3) **KV Q8_0 ist gratis** (identische t/s) und halbiert den KV-Speicher → für hermes in deploy/llama-swap.config.yaml übernommen; Live-Schaltung braucht User-Freigabe. Für coder/heavy vorher cache-reuse×KV-Quant-Verträglichkeit testen (Context-Shift mit quantisiertem KV ist in llama.cpp historisch heikel). + +**P1-10:** `chat_first_content`-Metrik in voice.py — misst die echte Hirn-Latenz (Agent-Overhead + LLM-TTFT bis zum ersten Inhalts-Token) statt nur des SSE-Starts. + +--- + *Erhoben am 02.07.2026 durch Claude Code (Live-SSH auf Box, lokale PC-Prüfung, 3 Codebase-Agents, 3 Web-Recherche-Runden). Messwerte: /api/voice/metrics (n=13 STT, n=18 chat_ttfb), TTFT-Direktmessung llama-swap :8080.* From 68ad291a8febe08b9a4aa673810c0998dce99a4a Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 2 Jul 2026 11:07:00 +0200 Subject: [PATCH 18/38] P2: Vision im Stream (C2), TTS-Warmup-Retry (L2), parallel-2-Config vorbereitet MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - voice.py: Bildschirm-Sicht laeuft IM SSE-Stream (+hermes.vision.progress-Event fuer Warte-Ansage), Vision-Timeout 120->45s (MC_VISION_TIMEOUT); deployt + Smoke-Test ok - useVoiceAgent: Warm-Gate mit Retry/Backoff + sichtbarer Meldung statt stummem Fake-ready - deploy-Config: hermes -c 131072 --parallel 2 (+KV Q8_0) — Mem0-Extraktion blockiert Voice-Turns nicht mehr; speicherneutral. Live-Schaltung: User - Report: P2-Nachtrag; C5 (pricing/token_stats) war Fehlalarm — in Benutzung Co-Authored-By: Claude Fable 5 --- backend/routers/voice.py | 46 ++++++++++--------- .../renderer/src/lib/voice/useVoiceAgent.ts | 14 +++++- deploy/llama-swap.config.yaml | 5 +- docs/REVIEW_2026-07-02.md | 9 +++- 4 files changed, 50 insertions(+), 24 deletions(-) diff --git a/backend/routers/voice.py b/backend/routers/voice.py index 211de16..fe99a78 100644 --- a/backend/routers/voice.py +++ b/backend/routers/voice.py @@ -57,7 +57,9 @@ async def _describe_images(image_urls: list[str], hint: str) -> str: for u in image_urls: content.append({"type": "image_url", "image_url": {"url": u}}) try: - async with httpx.AsyncClient(timeout=httpx.Timeout(120.0, connect=5.0)) as client: + # 45 s statt 120 s: Qwen3-VL braucht warm ~5 s; wenn es 45 s nicht schafft, ist etwas + # kaputt und Lucy soll lieber ohne Bildschirm-Kontext antworten als ewig hängen. + async with httpx.AsyncClient(timeout=httpx.Timeout(float(os.environ.get("MC_VISION_TIMEOUT", "45")), connect=5.0)) as client: r = await client.post(f"{LLAMA_SWAP_URL}/v1/chat/completions", json={ "model": VISION_MODEL, "max_tokens": VISION_MAX_TOKENS, "stream": False, "messages": [{"role": "user", "content": content}], @@ -193,26 +195,6 @@ async def voice_chat(body: ChatIn) -> StreamingResponse: if not HERMES_API_KEY: raise HTTPException(503, "HERMES_API_KEY/API_SERVER_KEY nicht gesetzt — Agent-Auth fehlt.") - messages = [] - if body.system: - messages.append({"role": "system", "content": body.system}) - user_text = body.text - imgs = [u for u in (body.images or []) if u] - if imgs: - # Bildschirm-Sicht: erst das Vision-Modell die Monitore beschreiben lassen, dann die Beschreibung - # als TEXT-Kontext an Hermes (Lucy antwortet mit vollem Hirn/Gedächtnis, sieht via besserem VL-Modell). - with Timer("vision"): - desc = await _describe_images(imgs, body.text) - if desc: - safe_desc = wrap_untrusted(desc, "BILDSCHIRM") - user_text = f"[Bildschirm-Sicht — das ist gerade auf dem/den Schirm(en) zu sehen:\n{safe_desc}\n]\n\n{body.text}" - messages.append({"role": "user", "content": user_text}) - payload = {"model": body.model or HERMES_API_MODEL, "messages": messages, "stream": True} - # Lucys Hirn (Qwen3.6) ist ein Thinking-Modell -> für die gesprochene Assistentin Thinking AUS, - # sonst generiert es tausende Reasoning-Token VOR der kurzen Antwort (gemessen: 11k Token, ~30s TTFB). - # Gleiches Muster wie die fast-Spur im Gateway (gateway_proxy.py) und die Mem0-Extraktion. - if os.environ.get("MC_VOICE_NO_THINK", "1") not in ("0", "false", "False"): - payload["chat_template_kwargs"] = {"enable_thinking": False} headers = { "Authorization": f"Bearer {HERMES_API_KEY}", "X-Hermes-Session-Id": body.session_id, @@ -224,6 +206,28 @@ async def voice_chat(body: ChatIn) -> StreamingResponse: t0 = time.perf_counter() first = True first_content = True + # Bildschirm-Sicht INNERHALB des Streams (C2-Fix): so startet die SSE-Antwort sofort und + # der Client bekommt ein Progress-Event (-> Lucy kann eine Warte-Ansage sprechen), statt + # dass der Request bis zu 120 s "tot" hängt, während das Vision-Modell beschreibt. + user_text = body.text + imgs = [u for u in (body.images or []) if u] + if imgs: + yield b'event: hermes.vision.progress\ndata: {"note": "Bildschirm wird angeschaut"}\n\n' + with Timer("vision"): + desc = await _describe_images(imgs, body.text) + if desc: + safe_desc = wrap_untrusted(desc, "BILDSCHIRM") + user_text = f"[Bildschirm-Sicht — das ist gerade auf dem/den Schirm(en) zu sehen:\n{safe_desc}\n]\n\n{body.text}" + messages = [] + if body.system: + messages.append({"role": "system", "content": body.system}) + messages.append({"role": "user", "content": user_text}) + payload = {"model": body.model or HERMES_API_MODEL, "messages": messages, "stream": True} + # Lucys Hirn (Qwen3.6) ist ein Thinking-Modell -> für die gesprochene Assistentin Thinking AUS, + # sonst generiert es tausende Reasoning-Token VOR der kurzen Antwort (gemessen: 11k Token, ~30s TTFB). + # Gleiches Muster wie die fast-Spur im Gateway (gateway_proxy.py) und die Mem0-Extraktion. + if os.environ.get("MC_VOICE_NO_THINK", "1") not in ("0", "false", "False"): + payload["chat_template_kwargs"] = {"enable_thinking": False} try: async with httpx.AsyncClient(timeout=httpx.Timeout(None, connect=5.0)) as client: async with client.stream( diff --git a/client/lucy-desktop/src/renderer/src/lib/voice/useVoiceAgent.ts b/client/lucy-desktop/src/renderer/src/lib/voice/useVoiceAgent.ts index 66b2e96..f9347db 100644 --- a/client/lucy-desktop/src/renderer/src/lib/voice/useVoiceAgent.ts +++ b/client/lucy-desktop/src/renderer/src/lib/voice/useVoiceAgent.ts @@ -148,8 +148,20 @@ export function useVoiceAgent() { useEffect(() => { let cancelled = false ;(async () => { - await tts.waitReady(120_000) + // Geduldiger Retry mit Backoff statt einmaligem 120s-Warten: crasht der pocket_server + // (oder braucht er länger), bleibt die App in 'warming' MIT sichtbarer Meldung — vorher + // schaltete sie nach dem Timeout stumm auf 'ready' und die Stimme fehlte einfach. + let attempt = 0 + while (!cancelled) { + const ok = await tts.waitReady(attempt === 0 ? 45_000 : 20_000) + if (cancelled) return + if (ok) break + attempt++ + setError(`Stimme startet nicht (Versuch ${attempt}) — pocket_server prüfen, ich versuche es weiter …`) + await new Promise((r) => setTimeout(r, Math.min(5_000 * attempt, 30_000))) + } if (cancelled) return + setError(null) // ein Aufwaerm-Satz (primt alle lazy Pfade); Audio verwerfen try { await tts.synthesize("Alles bereit, Commander.") } catch { /* */ } if (cancelled) return diff --git a/deploy/llama-swap.config.yaml b/deploy/llama-swap.config.yaml index d7ca508..a49e753 100644 --- a/deploy/llama-swap.config.yaml +++ b/deploy/llama-swap.config.yaml @@ -5,7 +5,10 @@ globalTTL: 0 models: Qwen3.6-35B-A3B: cmd: | - llama-server -m /srv/models/Qwen3.6-35B-A3B-MTP-GGUF/Qwen3.6-35B-A3B-UD-Q4_K_M.gguf --host 127.0.0.1 --port ${PORT} -c 65536 -ngl 999 -fa on --no-mmap --jinja --parallel 1 -cram 16384 -ctk q8_0 -ctv q8_0 --spec-type draft-mtp --spec-draft-n-max 3 + # parallel 2 + c 131072: 2 Slots à 65k (Slot 2 = Mem0-Lern-Extraktion, blockiert Voice-Turns + # nicht mehr); KV Q8_0 macht das speicherneutral zu vorher (65k f16). Bench 2026-07-02: + # Q8_0 kostet 0 t/s, MTP n-max 3 = +26% vs. ohne Spec. + llama-server -m /srv/models/Qwen3.6-35B-A3B-MTP-GGUF/Qwen3.6-35B-A3B-UD-Q4_K_M.gguf --host 127.0.0.1 --port ${PORT} -c 131072 -ngl 999 -fa on --no-mmap --jinja --parallel 2 -cram 16384 -ctk q8_0 -ctv q8_0 --spec-type draft-mtp --spec-draft-n-max 3 ttl: 0 aliases: - hermes diff --git a/docs/REVIEW_2026-07-02.md b/docs/REVIEW_2026-07-02.md index d3f61fe..e0e56a4 100644 --- a/docs/REVIEW_2026-07-02.md +++ b/docs/REVIEW_2026-07-02.md @@ -206,7 +206,7 @@ Quelle: `/api/voice/metrics` (live) + eigener TTFT-Test gegen llama-swap. | C2 | 🟡 | Vision-Beschreibung blockiert Chat bis 120 s | backend/routers/voice.py | | C3 | 🟢 | Thinking-Disable 3× dupliziert | voice.py / gateway.py / mem0_service/app.py | | C4 | 🟢 | Junk-Fact-Regex hartcodiert | mem0_service/app.py | -| C5 | 🟢 | Dead Code | backend/services/pricing.py, token_stats.py | +| C5 | ⚪ (Fehlalarm) | pricing.py + token_stats.py sind IN BENUTZUNG (system.py /token_stats-Endpoint, gateway_stream) — kein Dead Code | backend/services/ | | F1 | 🟡 | Monolithen 990/934 Z | frontend/src/views/models/Cockpit.tsx, components/SystemDrawer.tsx | | F2 | 🟡 (korrigiert) | dist/ im Git ist ABSICHT (Box hat kein Node, deploy = git reset --hard; s. deploy/build.sh) — echter Fund war nur der inkonsistente Asset-Stand auf lucy-v2 (behoben durch Rebuild+Commit). Build-on-Box/CI wäre P3-Option | frontend/dist/ | | F4 | 🟢 | Keine globale Error Boundary | frontend/src/App.tsx | @@ -242,6 +242,13 @@ Quelle: `/api/voice/metrics` (live) + eigener TTFT-Test gegen llama-swap. **P1-10:** `chat_first_content`-Metrik in voice.py — misst die echte Hirn-Latenz (Agent-Overhead + LLM-TTFT bis zum ersten Inhalts-Token) statt nur des SSE-Starts. +**P2-Nachtrag (02.07.):** +- **Profiling:** Folge-Turns 1,3 s, NEUE Sessions 5,6–12 s (Session-Prefill System-Prompt+Tools ~4–5k Tok). Mem0-Search unschuldig (18 ms). **Aber:** Die Mem0-Lern-Extraktion (~2,4 s je Turn, gleiche Qwen3.6-Instanz) blockiert bei `--parallel 1` den nächsten Voice-Turn in der Queue → Fix vorbereitet: `--parallel 2 -c 131072 + KV Q8_0` (2×65k-Slots, speicherneutral zu 1×65k f16). Live-Schaltung = User (deploy/llama-swap.config.yaml ist fertig). +- **C2 gefixt:** Bildschirm-Sicht läuft jetzt IM Stream (SSE startet sofort, `hermes.vision.progress`-Event → Lucy kann Warte-Ansage sprechen); Vision-Timeout 120→45 s (MC_VISION_TIMEOUT). +- **C3 bewertet:** nur 2 Backend-Stellen mit unterschiedlicher Gating-Logik (dritte im separaten Mem0-venv) → kein Shared-Helper erzwungen, Pattern dokumentiert. +- **C5 war Fehlalarm** (s. Findings-Tabelle). +- **L2 gefixt:** TTS-Warm-Gate mit Retry/Backoff + sichtbarer Fehlermeldung (vorher: nach 120 s stumm „ready" ohne Stimme). + --- *Erhoben am 02.07.2026 durch Claude Code (Live-SSH auf Box, lokale PC-Prüfung, 3 Codebase-Agents, 3 Web-Recherche-Runden). Messwerte: /api/voice/metrics (n=13 STT, n=18 chat_ttfb), TTFT-Direktmessung llama-swap :8080.* From 60765469aa06ce1d60761cfaec5b518766f40cd6 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 2 Jul 2026 11:08:25 +0200 Subject: [PATCH 19/38] Frontend: globale Error Boundary (Review F4) + dist-Rebuild JS-Fehler in einer View fuehrten zum weissen Screen ohne Meldung; jetzt Fehleranzeige mit Neu-laden-Knopf am App-Root (GraphView behaelt seine eigene Boundary). Co-Authored-By: Claude Fable 5 --- ...View-CfrAKviO.js => GraphView-E0VQUPTe.js} | 2 +- frontend/dist/assets/index-BljJ8MOS.css | 1 - .../{index-KW1c6Ww8.js => index-CrYzXlx6.js} | 122 +++++++++--------- frontend/dist/assets/index-_Rap01H_.css | 1 + frontend/dist/index.html | 4 +- frontend/src/components/AppErrorBoundary.tsx | 38 ++++++ frontend/src/main.tsx | 9 +- 7 files changed, 109 insertions(+), 68 deletions(-) rename frontend/dist/assets/{GraphView-CfrAKviO.js => GraphView-E0VQUPTe.js} (99%) delete mode 100644 frontend/dist/assets/index-BljJ8MOS.css rename frontend/dist/assets/{index-KW1c6Ww8.js => index-CrYzXlx6.js} (87%) create mode 100644 frontend/dist/assets/index-_Rap01H_.css create mode 100644 frontend/src/components/AppErrorBoundary.tsx diff --git a/frontend/dist/assets/GraphView-CfrAKviO.js b/frontend/dist/assets/GraphView-E0VQUPTe.js similarity index 99% rename from frontend/dist/assets/GraphView-CfrAKviO.js rename to frontend/dist/assets/GraphView-E0VQUPTe.js index 8f90b21..198c864 100644 --- a/frontend/dist/assets/GraphView-CfrAKviO.js +++ b/frontend/dist/assets/GraphView-E0VQUPTe.js @@ -1,4 +1,4 @@ -import{g as bi,r as ce,j as H,R as rr,S as nr,a as Ut,T as ar}from"./index-KW1c6Ww8.js";var et={exports:{}},zt;function or(){if(zt)return et.exports;zt=1;var n=typeof Reflect=="object"?Reflect:null,i=n&&typeof n.apply=="function"?n.apply:function(b,R,A){return Function.prototype.apply.call(b,R,A)},t;n&&typeof n.ownKeys=="function"?t=n.ownKeys:Object.getOwnPropertySymbols?t=function(b){return Object.getOwnPropertyNames(b).concat(Object.getOwnPropertySymbols(b))}:t=function(b){return Object.getOwnPropertyNames(b)};function e(p){console&&console.warn&&console.warn(p)}var r=Number.isNaN||function(b){return b!==b};function a(){a.init.call(this)}et.exports=a,et.exports.once=D,a.EventEmitter=a,a.prototype._events=void 0,a.prototype._eventsCount=0,a.prototype._maxListeners=void 0;var o=10;function s(p){if(typeof p!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof p)}Object.defineProperty(a,"defaultMaxListeners",{enumerable:!0,get:function(){return o},set:function(p){if(typeof p!="number"||p<0||r(p))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+p+".");o=p}}),a.init=function(){(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)&&(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},a.prototype.setMaxListeners=function(b){if(typeof b!="number"||b<0||r(b))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+b+".");return this._maxListeners=b,this};function u(p){return p._maxListeners===void 0?a.defaultMaxListeners:p._maxListeners}a.prototype.getMaxListeners=function(){return u(this)},a.prototype.emit=function(b){for(var R=[],A=1;A0&&(P=R[0]),P instanceof Error)throw P;var V=new Error("Unhandled error."+(P?" ("+P.message+")":""));throw V.context=P,V}var z=F[b];if(z===void 0)return!1;if(typeof z=="function")i(z,this,R);else for(var g=z.length,K=y(z,g),A=0;A0&&P.length>G&&!P.warned){P.warned=!0;var V=new Error("Possible EventEmitter memory leak detected. "+P.length+" "+String(b)+" listeners added. Use emitter.setMaxListeners() to increase limit");V.name="MaxListenersExceededWarning",V.emitter=p,V.type=b,V.count=P.length,e(V)}return p}a.prototype.addListener=function(b,R){return h(this,b,R,!1)},a.prototype.on=a.prototype.addListener,a.prototype.prependListener=function(b,R){return h(this,b,R,!0)};function d(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function l(p,b,R){var A={fired:!1,wrapFn:void 0,target:p,type:b,listener:R},G=d.bind(A);return G.listener=R,A.wrapFn=G,G}a.prototype.once=function(b,R){return s(R),this.on(b,l(this,b,R)),this},a.prototype.prependOnceListener=function(b,R){return s(R),this.prependListener(b,l(this,b,R)),this},a.prototype.removeListener=function(b,R){var A,G,F,P,V;if(s(R),G=this._events,G===void 0)return this;if(A=G[b],A===void 0)return this;if(A===R||A.listener===R)--this._eventsCount===0?this._events=Object.create(null):(delete G[b],G.removeListener&&this.emit("removeListener",b,A.listener||R));else if(typeof A!="function"){for(F=-1,P=A.length-1;P>=0;P--)if(A[P]===R||A[P].listener===R){V=A[P].listener,F=P;break}if(F<0)return this;F===0?A.shift():w(A,F),A.length===1&&(G[b]=A[0]),G.removeListener!==void 0&&this.emit("removeListener",b,V||R)}return this},a.prototype.off=a.prototype.removeListener,a.prototype.removeAllListeners=function(b){var R,A,G;if(A=this._events,A===void 0)return this;if(A.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):A[b]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete A[b]),this;if(arguments.length===0){var F=Object.keys(A),P;for(G=0;G=0;G--)this.removeListener(b,R[G]);return this};function f(p,b,R){var A=p._events;if(A===void 0)return[];var G=A[b];return G===void 0?[]:typeof G=="function"?R?[G.listener||G]:[G]:R?T(G):y(G,G.length)}a.prototype.listeners=function(b){return f(this,b,!0)},a.prototype.rawListeners=function(b){return f(this,b,!1)},a.listenerCount=function(p,b){return typeof p.listenerCount=="function"?p.listenerCount(b):c.call(p,b)},a.prototype.listenerCount=c;function c(p){var b=this._events;if(b!==void 0){var R=b[p];if(typeof R=="function")return 1;if(R!==void 0)return R.length}return 0}a.prototype.eventNames=function(){return this._eventsCount>0?t(this._events):[]};function y(p,b){for(var R=new Array(b),A=0;An++}function me(){const n=arguments;let i=null,t=-1;return{[Symbol.iterator](){return this},next(){let e=null;do{if(i===null){if(t++,t>=n.length)return{done:!0};i=n[t][Symbol.iterator]()}if(e=i.next(),e.done){i=null;continue}break}while(!0);return e}}}function Le(){return{[Symbol.iterator](){return this},next(){return{done:!0}}}}class Lt extends Error{constructor(i){super(),this.name="GraphError",this.message=i}}class k extends Lt{constructor(i){super(i),this.name="InvalidArgumentsGraphError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,k.prototype.constructor)}}class C extends Lt{constructor(i){super(i),this.name="NotFoundGraphError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,C.prototype.constructor)}}class I extends Lt{constructor(i){super(i),this.name="UsageGraphError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,I.prototype.constructor)}}function _i(n,i){this.key=n,this.attributes=i,this.clear()}_i.prototype.clear=function(){this.inDegree=0,this.outDegree=0,this.undirectedDegree=0,this.undirectedLoops=0,this.directedLoops=0,this.in={},this.out={},this.undirected={}};function Ti(n,i){this.key=n,this.attributes=i,this.clear()}Ti.prototype.clear=function(){this.inDegree=0,this.outDegree=0,this.directedLoops=0,this.in={},this.out={}};function Si(n,i){this.key=n,this.attributes=i,this.clear()}Si.prototype.clear=function(){this.undirectedDegree=0,this.undirectedLoops=0,this.undirected={}};function Ge(n,i,t,e,r){this.key=i,this.attributes=r,this.undirected=n,this.source=t,this.target=e}Ge.prototype.attach=function(){let n="out",i="in";this.undirected&&(n=i="undirected");const t=this.source.key,e=this.target.key;this.source[n][e]=this,!(this.undirected&&t===e)&&(this.target[i][t]=this)};Ge.prototype.attachMulti=function(){let n="out",i="in";const t=this.source.key,e=this.target.key;this.undirected&&(n=i="undirected");const r=this.source[n],a=r[e];if(typeof a>"u"){r[e]=this,this.undirected&&t===e||(this.target[i][t]=this);return}a.previous=this,this.next=a,r[e]=this,this.target[i][t]=this};Ge.prototype.detach=function(){const n=this.source.key,i=this.target.key;let t="out",e="in";this.undirected&&(t=e="undirected"),delete this.source[t][i],delete this.target[e][n]};Ge.prototype.detachMulti=function(){const n=this.source.key,i=this.target.key;let t="out",e="in";this.undirected&&(t=e="undirected"),this.previous===void 0?this.next===void 0?(delete this.source[t][i],delete this.target[e][n]):(this.next.previous=void 0,this.source[t][i]=this.next,this.target[e][n]=this.next):(this.previous.next=this.next,this.next!==void 0&&(this.next.previous=this.previous))};const Ri=0,Ai=1,hr=2,xi=3;function ye(n,i,t,e,r,a,o){let s,u,h,d;if(e=""+e,t===Ri){if(s=n._nodes.get(e),!s)throw new C(`Graph.${i}: could not find the "${e}" node in the graph.`);h=r,d=a}else if(t===xi){if(r=""+r,u=n._edges.get(r),!u)throw new C(`Graph.${i}: could not find the "${r}" edge in the graph.`);const l=u.source.key,f=u.target.key;if(e===l)s=u.target;else if(e===f)s=u.source;else throw new C(`Graph.${i}: the "${e}" node is not attached to the "${r}" edge (${l}, ${f}).`);h=a,d=o}else{if(u=n._edges.get(e),!u)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`);t===Ai?s=u.source:s=u.target,h=r,d=a}return[s,h,d]}function dr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);return o.attributes[s]}}function lr(n,i,t){n.prototype[i]=function(e,r){const[a]=ye(this,i,t,e,r);return a.attributes}}function cr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);return o.attributes.hasOwnProperty(s)}}function fr(n,i,t){n.prototype[i]=function(e,r,a,o){const[s,u,h]=ye(this,i,t,e,r,a,o);return s.attributes[u]=h,this.emit("nodeAttributesUpdated",{key:s.key,type:"set",attributes:s.attributes,name:u}),this}}function gr(n,i,t){n.prototype[i]=function(e,r,a,o){const[s,u,h]=ye(this,i,t,e,r,a,o);if(typeof h!="function")throw new k(`Graph.${i}: updater should be a function.`);const d=s.attributes,l=h(d[u]);return d[u]=l,this.emit("nodeAttributesUpdated",{key:s.key,type:"set",attributes:s.attributes,name:u}),this}}function pr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);return delete o.attributes[s],this.emit("nodeAttributesUpdated",{key:o.key,type:"remove",attributes:o.attributes,name:s}),this}}function vr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);if(!J(s))throw new k(`Graph.${i}: provided attributes are not a plain object.`);return o.attributes=s,this.emit("nodeAttributesUpdated",{key:o.key,type:"replace",attributes:o.attributes}),this}}function mr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);if(!J(s))throw new k(`Graph.${i}: provided attributes are not a plain object.`);return Z(o.attributes,s),this.emit("nodeAttributesUpdated",{key:o.key,type:"merge",attributes:o.attributes,data:s}),this}}function yr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);if(typeof s!="function")throw new k(`Graph.${i}: provided updater is not a function.`);return o.attributes=s(o.attributes),this.emit("nodeAttributesUpdated",{key:o.key,type:"update",attributes:o.attributes}),this}}const br=[{name:n=>`get${n}Attribute`,attacher:dr},{name:n=>`get${n}Attributes`,attacher:lr},{name:n=>`has${n}Attribute`,attacher:cr},{name:n=>`set${n}Attribute`,attacher:fr},{name:n=>`update${n}Attribute`,attacher:gr},{name:n=>`remove${n}Attribute`,attacher:pr},{name:n=>`replace${n}Attributes`,attacher:vr},{name:n=>`merge${n}Attributes`,attacher:mr},{name:n=>`update${n}Attributes`,attacher:yr}];function wr(n){br.forEach(function({name:i,attacher:t}){t(n,i("Node"),Ri),t(n,i("Source"),Ai),t(n,i("Target"),hr),t(n,i("Opposite"),xi)})}function Er(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return a.attributes[r]}}function _r(n,i,t){n.prototype[i]=function(e){let r;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>1){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const a=""+e,o=""+arguments[1];if(r=oe(this,a,o,t),!r)throw new C(`Graph.${i}: could not find an edge for the given path ("${a}" - "${o}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,r=this._edges.get(e),!r)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return r.attributes}}function Tr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return a.attributes.hasOwnProperty(r)}}function Sr(n,i,t){n.prototype[i]=function(e,r,a){let o;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>3){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const s=""+e,u=""+r;if(r=arguments[2],a=arguments[3],o=oe(this,s,u,t),!o)throw new C(`Graph.${i}: could not find an edge for the given path ("${s}" - "${u}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,o=this._edges.get(e),!o)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return o.attributes[r]=a,this.emit("edgeAttributesUpdated",{key:o.key,type:"set",attributes:o.attributes,name:r}),this}}function Rr(n,i,t){n.prototype[i]=function(e,r,a){let o;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>3){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const s=""+e,u=""+r;if(r=arguments[2],a=arguments[3],o=oe(this,s,u,t),!o)throw new C(`Graph.${i}: could not find an edge for the given path ("${s}" - "${u}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,o=this._edges.get(e),!o)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(typeof a!="function")throw new k(`Graph.${i}: updater should be a function.`);return o.attributes[r]=a(o.attributes[r]),this.emit("edgeAttributesUpdated",{key:o.key,type:"set",attributes:o.attributes,name:r}),this}}function Ar(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return delete a.attributes[r],this.emit("edgeAttributesUpdated",{key:a.key,type:"remove",attributes:a.attributes,name:r}),this}}function xr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(!J(r))throw new k(`Graph.${i}: provided attributes are not a plain object.`);return a.attributes=r,this.emit("edgeAttributesUpdated",{key:a.key,type:"replace",attributes:a.attributes}),this}}function Cr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(!J(r))throw new k(`Graph.${i}: provided attributes are not a plain object.`);return Z(a.attributes,r),this.emit("edgeAttributesUpdated",{key:a.key,type:"merge",attributes:a.attributes,data:r}),this}}function kr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(typeof r!="function")throw new k(`Graph.${i}: provided updater is not a function.`);return a.attributes=r(a.attributes),this.emit("edgeAttributesUpdated",{key:a.key,type:"update",attributes:a.attributes}),this}}const Dr=[{name:n=>`get${n}Attribute`,attacher:Er},{name:n=>`get${n}Attributes`,attacher:_r},{name:n=>`has${n}Attribute`,attacher:Tr},{name:n=>`set${n}Attribute`,attacher:Sr},{name:n=>`update${n}Attribute`,attacher:Rr},{name:n=>`remove${n}Attribute`,attacher:Ar},{name:n=>`replace${n}Attributes`,attacher:xr},{name:n=>`merge${n}Attributes`,attacher:Cr},{name:n=>`update${n}Attributes`,attacher:kr}];function Lr(n){Dr.forEach(function({name:i,attacher:t}){t(n,i("Edge"),"mixed"),t(n,i("DirectedEdge"),"directed"),t(n,i("UndirectedEdge"),"undirected")})}const Gr=[{name:"edges",type:"mixed"},{name:"inEdges",type:"directed",direction:"in"},{name:"outEdges",type:"directed",direction:"out"},{name:"inboundEdges",type:"mixed",direction:"in"},{name:"outboundEdges",type:"mixed",direction:"out"},{name:"directedEdges",type:"directed"},{name:"undirectedEdges",type:"undirected"}];function Fr(n,i,t,e){let r=!1;for(const a in i){if(a===e)continue;const o=i[a];if(r=t(o.key,o.attributes,o.source.key,o.target.key,o.source.attributes,o.target.attributes,o.undirected),n&&r)return o.key}}function Nr(n,i,t,e){let r,a,o,s=!1;for(const u in i)if(u!==e){r=i[u];do{if(a=r.source,o=r.target,s=t(r.key,r.attributes,a.key,o.key,a.attributes,o.attributes,r.undirected),n&&s)return r.key;r=r.next}while(r!==void 0)}}function lt(n,i){const t=Object.keys(n),e=t.length;let r,a=0;return{[Symbol.iterator](){return this},next(){do if(r)r=r.next;else{if(a>=e)return{done:!0};const o=t[a++];if(o===i){r=void 0;continue}r=n[o]}while(!r);return{done:!1,value:{edge:r.key,attributes:r.attributes,source:r.source.key,target:r.target.key,sourceAttributes:r.source.attributes,targetAttributes:r.target.attributes,undirected:r.undirected}}}}}function Pr(n,i,t,e){const r=i[t];if(!r)return;const a=r.source,o=r.target;if(e(r.key,r.attributes,a.key,o.key,a.attributes,o.attributes,r.undirected)&&n)return r.key}function Ir(n,i,t,e){let r=i[t];if(!r)return;let a=!1;do{if(a=e(r.key,r.attributes,r.source.key,r.target.key,r.source.attributes,r.target.attributes,r.undirected),n&&a)return r.key;r=r.next}while(r!==void 0)}function ct(n,i){let t=n[i];if(t.next!==void 0)return{[Symbol.iterator](){return this},next(){if(!t)return{done:!0};const r={edge:t.key,attributes:t.attributes,source:t.source.key,target:t.target.key,sourceAttributes:t.source.attributes,targetAttributes:t.target.attributes,undirected:t.undirected};return t=t.next,{done:!1,value:r}}};let e=!1;return{[Symbol.iterator](){return this},next(){return e===!0?{done:!0}:(e=!0,{done:!1,value:{edge:t.key,attributes:t.attributes,source:t.source.key,target:t.target.key,sourceAttributes:t.source.attributes,targetAttributes:t.target.attributes,undirected:t.undirected}})}}}function Or(n,i){if(n.size===0)return[];if(i==="mixed"||i===n.type)return Array.from(n._edges.keys());const t=i==="undirected"?n.undirectedSize:n.directedSize,e=new Array(t),r=i==="undirected",a=n._edges.values();let o=0,s,u;for(;s=a.next(),s.done!==!0;)u=s.value,u.undirected===r&&(e[o++]=u.key);return e}function Ci(n,i,t,e){if(i.size===0)return;const r=t!=="mixed"&&t!==i.type,a=t==="undirected";let o,s,u=!1;const h=i._edges.values();for(;o=h.next(),o.done!==!0;){if(s=o.value,r&&s.undirected!==a)continue;const{key:d,attributes:l,source:f,target:c}=s;if(u=e(d,l,f.key,c.key,f.attributes,c.attributes,s.undirected),n&&u)return d}}function Ur(n,i){if(n.size===0)return Le();const t=i!=="mixed"&&i!==n.type,e=i==="undirected",r=n._edges.values();return{[Symbol.iterator](){return this},next(){let a,o;for(;;){if(a=r.next(),a.done)return a;if(o=a.value,!(t&&o.undirected!==e))break}return{value:{edge:o.key,attributes:o.attributes,source:o.source.key,target:o.target.key,sourceAttributes:o.source.attributes,targetAttributes:o.target.attributes,undirected:o.undirected},done:!1}}}}function Gt(n,i,t,e,r,a){const o=i?Nr:Fr;let s;if(t!=="undirected"&&(e!=="out"&&(s=o(n,r.in,a),n&&s)||e!=="in"&&(s=o(n,r.out,a,e?void 0:r.key),n&&s))||t!=="directed"&&(s=o(n,r.undirected,a),n&&s))return s}function zr(n,i,t,e){const r=[];return Gt(!1,n,i,t,e,function(a){r.push(a)}),r}function $r(n,i,t){let e=Le();return n!=="undirected"&&(i!=="out"&&typeof t.in<"u"&&(e=me(e,lt(t.in))),i!=="in"&&typeof t.out<"u"&&(e=me(e,lt(t.out,i?void 0:t.key)))),n!=="directed"&&typeof t.undirected<"u"&&(e=me(e,lt(t.undirected))),e}function Ft(n,i,t,e,r,a,o){const s=t?Ir:Pr;let u;if(i!=="undirected"&&(typeof r.in<"u"&&e!=="out"&&(u=s(n,r.in,a,o),n&&u)||typeof r.out<"u"&&e!=="in"&&(e||r.key!==a)&&(u=s(n,r.out,a,o),n&&u))||i!=="directed"&&typeof r.undirected<"u"&&(u=s(n,r.undirected,a,o),n&&u))return u}function Br(n,i,t,e,r){const a=[];return Ft(!1,n,i,t,e,r,function(o){a.push(o)}),a}function Mr(n,i,t,e){let r=Le();return n!=="undirected"&&(typeof t.in<"u"&&i!=="out"&&e in t.in&&(r=me(r,ct(t.in,e))),typeof t.out<"u"&&i!=="in"&&e in t.out&&(i||t.key!==e)&&(r=me(r,ct(t.out,e)))),n!=="directed"&&typeof t.undirected<"u"&&e in t.undirected&&(r=me(r,ct(t.undirected,e))),r}function Hr(n,i){const{name:t,type:e,direction:r}=i;n.prototype[t]=function(a,o){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return[];if(!arguments.length)return Or(this,e);if(arguments.length===1){a=""+a;const s=this._nodes.get(a);if(typeof s>"u")throw new C(`Graph.${t}: could not find the "${a}" node in the graph.`);return zr(this.multi,e==="mixed"?this.type:e,r,s)}if(arguments.length===2){a=""+a,o=""+o;const s=this._nodes.get(a);if(!s)throw new C(`Graph.${t}: could not find the "${a}" source node in the graph.`);if(!this._nodes.has(o))throw new C(`Graph.${t}: could not find the "${o}" target node in the graph.`);return Br(e,this.multi,r,s,o)}throw new k(`Graph.${t}: too many arguments (expecting 0, 1 or 2 and got ${arguments.length}).`)}}function Wr(n,i){const{name:t,type:e,direction:r}=i,a="forEach"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[a]=function(h,d,l){if(!(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)){if(arguments.length===1)return l=h,Ci(!1,this,e,l);if(arguments.length===2){h=""+h,l=d;const f=this._nodes.get(h);if(typeof f>"u")throw new C(`Graph.${a}: could not find the "${h}" node in the graph.`);return Gt(!1,this.multi,e==="mixed"?this.type:e,r,f,l)}if(arguments.length===3){h=""+h,d=""+d;const f=this._nodes.get(h);if(!f)throw new C(`Graph.${a}: could not find the "${h}" source node in the graph.`);if(!this._nodes.has(d))throw new C(`Graph.${a}: could not find the "${d}" target node in the graph.`);return Ft(!1,e,this.multi,r,f,d,l)}throw new k(`Graph.${a}: too many arguments (expecting 1, 2 or 3 and got ${arguments.length}).`)}};const o="map"+t[0].toUpperCase()+t.slice(1);n.prototype[o]=function(){const h=Array.prototype.slice.call(arguments),d=h.pop();let l;if(h.length===0){let f=0;e!=="directed"&&(f+=this.undirectedSize),e!=="undirected"&&(f+=this.directedSize),l=new Array(f);let c=0;h.push((y,w,T,D,m,S,p)=>{l[c++]=d(y,w,T,D,m,S,p)})}else l=[],h.push((f,c,y,w,T,D,m)=>{l.push(d(f,c,y,w,T,D,m))});return this[a].apply(this,h),l};const s="filter"+t[0].toUpperCase()+t.slice(1);n.prototype[s]=function(){const h=Array.prototype.slice.call(arguments),d=h.pop(),l=[];return h.push((f,c,y,w,T,D,m)=>{d(f,c,y,w,T,D,m)&&l.push(f)}),this[a].apply(this,h),l};const u="reduce"+t[0].toUpperCase()+t.slice(1);n.prototype[u]=function(){let h=Array.prototype.slice.call(arguments);if(h.length<2||h.length>4)throw new k(`Graph.${u}: invalid number of arguments (expecting 2, 3 or 4 and got ${h.length}).`);if(typeof h[h.length-1]=="function"&&typeof h[h.length-2]!="function")throw new k(`Graph.${u}: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.`);let d,l;h.length===2?(d=h[0],l=h[1],h=[]):h.length===3?(d=h[1],l=h[2],h=[h[0]]):h.length===4&&(d=h[2],l=h[3],h=[h[0],h[1]]);let f=l;return h.push((c,y,w,T,D,m,S)=>{f=d(f,c,y,w,T,D,m,S)}),this[a].apply(this,h),f}}function jr(n,i){const{name:t,type:e,direction:r}=i,a="find"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[a]=function(u,h,d){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return!1;if(arguments.length===1)return d=u,Ci(!0,this,e,d);if(arguments.length===2){u=""+u,d=h;const l=this._nodes.get(u);if(typeof l>"u")throw new C(`Graph.${a}: could not find the "${u}" node in the graph.`);return Gt(!0,this.multi,e==="mixed"?this.type:e,r,l,d)}if(arguments.length===3){u=""+u,h=""+h;const l=this._nodes.get(u);if(!l)throw new C(`Graph.${a}: could not find the "${u}" source node in the graph.`);if(!this._nodes.has(h))throw new C(`Graph.${a}: could not find the "${h}" target node in the graph.`);return Ft(!0,e,this.multi,r,l,h,d)}throw new k(`Graph.${a}: too many arguments (expecting 1, 2 or 3 and got ${arguments.length}).`)};const o="some"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[o]=function(){const u=Array.prototype.slice.call(arguments),h=u.pop();return u.push((l,f,c,y,w,T,D)=>h(l,f,c,y,w,T,D)),!!this[a].apply(this,u)};const s="every"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[s]=function(){const u=Array.prototype.slice.call(arguments),h=u.pop();return u.push((l,f,c,y,w,T,D)=>!h(l,f,c,y,w,T,D)),!this[a].apply(this,u)}}function Vr(n,i){const{name:t,type:e,direction:r}=i,a=t.slice(0,-1)+"Entries";n.prototype[a]=function(o,s){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return Le();if(!arguments.length)return Ur(this,e);if(arguments.length===1){o=""+o;const u=this._nodes.get(o);if(!u)throw new C(`Graph.${a}: could not find the "${o}" node in the graph.`);return $r(e,r,u)}if(arguments.length===2){o=""+o,s=""+s;const u=this._nodes.get(o);if(!u)throw new C(`Graph.${a}: could not find the "${o}" source node in the graph.`);if(!this._nodes.has(s))throw new C(`Graph.${a}: could not find the "${s}" target node in the graph.`);return Mr(e,r,u,s)}throw new k(`Graph.${a}: too many arguments (expecting 0, 1 or 2 and got ${arguments.length}).`)}}function qr(n){Gr.forEach(i=>{Hr(n,i),Wr(n,i),jr(n,i),Vr(n,i)})}const Kr=[{name:"neighbors",type:"mixed"},{name:"inNeighbors",type:"directed",direction:"in"},{name:"outNeighbors",type:"directed",direction:"out"},{name:"inboundNeighbors",type:"mixed",direction:"in"},{name:"outboundNeighbors",type:"mixed",direction:"out"},{name:"directedNeighbors",type:"directed"},{name:"undirectedNeighbors",type:"undirected"}];function ut(){this.A=null,this.B=null}ut.prototype.wrap=function(n){this.A===null?this.A=n:this.B===null&&(this.B=n)};ut.prototype.has=function(n){return this.A!==null&&n in this.A||this.B!==null&&n in this.B};function Oe(n,i,t,e,r){for(const a in e){const o=e[a],s=o.source,u=o.target,h=s===t?u:s;if(i&&i.has(h.key))continue;const d=r(h.key,h.attributes);if(n&&d)return h.key}}function Nt(n,i,t,e,r){if(i!=="mixed"){if(i==="undirected")return Oe(n,null,e,e.undirected,r);if(typeof t=="string")return Oe(n,null,e,e[t],r)}const a=new ut;let o;if(i!=="undirected"){if(t!=="out"){if(o=Oe(n,null,e,e.in,r),n&&o)return o;a.wrap(e.in)}if(t!=="in"){if(o=Oe(n,a,e,e.out,r),n&&o)return o;a.wrap(e.out)}}if(i!=="directed"&&(o=Oe(n,a,e,e.undirected,r),n&&o))return o}function Yr(n,i,t){if(n!=="mixed"){if(n==="undirected")return Object.keys(t.undirected);if(typeof i=="string")return Object.keys(t[i])}const e=[];return Nt(!1,n,i,t,function(r){e.push(r)}),e}function Ue(n,i,t){const e=Object.keys(t),r=e.length;let a=0;return{[Symbol.iterator](){return this},next(){let o=null;do{if(a>=r)return n&&n.wrap(t),{done:!0};const s=t[e[a++]],u=s.source,h=s.target;if(o=u===i?h:u,n&&n.has(o.key)){o=null;continue}}while(o===null);return{done:!1,value:{neighbor:o.key,attributes:o.attributes}}}}}function Zr(n,i,t){if(n!=="mixed"){if(n==="undirected")return Ue(null,t,t.undirected);if(typeof i=="string")return Ue(null,t,t[i])}let e=Le();const r=new ut;return n!=="undirected"&&(i!=="out"&&(e=me(e,Ue(r,t,t.in))),i!=="in"&&(e=me(e,Ue(r,t,t.out)))),n!=="directed"&&(e=me(e,Ue(r,t,t.undirected))),e}function Xr(n,i){const{name:t,type:e,direction:r}=i;n.prototype[t]=function(a){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return[];a=""+a;const o=this._nodes.get(a);if(typeof o>"u")throw new C(`Graph.${t}: could not find the "${a}" node in the graph.`);return Yr(e==="mixed"?this.type:e,r,o)}}function Jr(n,i){const{name:t,type:e,direction:r}=i,a="forEach"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[a]=function(h,d){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return;h=""+h;const l=this._nodes.get(h);if(typeof l>"u")throw new C(`Graph.${a}: could not find the "${h}" node in the graph.`);Nt(!1,e==="mixed"?this.type:e,r,l,d)};const o="map"+t[0].toUpperCase()+t.slice(1);n.prototype[o]=function(h,d){const l=[];return this[a](h,(f,c)=>{l.push(d(f,c))}),l};const s="filter"+t[0].toUpperCase()+t.slice(1);n.prototype[s]=function(h,d){const l=[];return this[a](h,(f,c)=>{d(f,c)&&l.push(f)}),l};const u="reduce"+t[0].toUpperCase()+t.slice(1);n.prototype[u]=function(h,d,l){if(arguments.length<3)throw new k(`Graph.${u}: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.`);let f=l;return this[a](h,(c,y)=>{f=d(f,c,y)}),f}}function Qr(n,i){const{name:t,type:e,direction:r}=i,a=t[0].toUpperCase()+t.slice(1,-1),o="find"+a;n.prototype[o]=function(h,d){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return;h=""+h;const l=this._nodes.get(h);if(typeof l>"u")throw new C(`Graph.${o}: could not find the "${h}" node in the graph.`);return Nt(!0,e==="mixed"?this.type:e,r,l,d)};const s="some"+a;n.prototype[s]=function(h,d){return!!this[o](h,d)};const u="every"+a;n.prototype[u]=function(h,d){return!this[o](h,(f,c)=>!d(f,c))}}function en(n,i){const{name:t,type:e,direction:r}=i,a=t.slice(0,-1)+"Entries";n.prototype[a]=function(o){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return Le();o=""+o;const s=this._nodes.get(o);if(typeof s>"u")throw new C(`Graph.${a}: could not find the "${o}" node in the graph.`);return Zr(e==="mixed"?this.type:e,r,s)}}function tn(n){Kr.forEach(i=>{Xr(n,i),Jr(n,i),Qr(n,i),en(n,i)})}function tt(n,i,t,e,r){const a=e._nodes.values(),o=e.type;let s,u,h,d,l,f;for(;s=a.next(),s.done!==!0;){let c=!1;if(u=s.value,o!=="undirected"){d=u.out;for(h in d){l=d[h];do f=l.target,c=!0,r(u.key,f.key,u.attributes,f.attributes,l.key,l.attributes,l.undirected),l=l.next;while(l)}}if(o!=="directed"){d=u.undirected;for(h in d)if(!(i&&u.key>h)){l=d[h];do f=l.target,f.key!==h&&(f=l.source),c=!0,r(u.key,f.key,u.attributes,f.attributes,l.key,l.attributes,l.undirected),l=l.next;while(l)}}t&&!c&&r(u.key,null,u.attributes,null,null,null,null)}}function rn(n,i){const t={key:n};return Ei(i.attributes)||(t.attributes=Z({},i.attributes)),t}function nn(n,i,t){const e={key:i,source:t.source.key,target:t.target.key};return Ei(t.attributes)||(e.attributes=Z({},t.attributes)),n==="mixed"&&t.undirected&&(e.undirected=!0),e}function an(n){if(!J(n))throw new k('Graph.import: invalid serialized node. A serialized node should be a plain object with at least a "key" property.');if(!("key"in n))throw new k("Graph.import: serialized node is missing its key.");if("attributes"in n&&(!J(n.attributes)||n.attributes===null))throw new k("Graph.import: invalid attributes. Attributes should be a plain object, null or omitted.")}function on(n){if(!J(n))throw new k('Graph.import: invalid serialized edge. A serialized edge should be a plain object with at least a "source" & "target" property.');if(!("source"in n))throw new k("Graph.import: serialized edge is missing its source.");if(!("target"in n))throw new k("Graph.import: serialized edge is missing its target.");if("attributes"in n&&(!J(n.attributes)||n.attributes===null))throw new k("Graph.import: invalid attributes. Attributes should be a plain object, null or omitted.");if("undirected"in n&&typeof n.undirected!="boolean")throw new k("Graph.import: invalid undirectedness information. Undirected should be boolean or omitted.")}const sn=ur(),un=new Set(["directed","undirected","mixed"]),Bt=new Set(["domain","_events","_eventsCount","_maxListeners"]),hn=[{name:n=>`${n}Edge`,generateKey:!0},{name:n=>`${n}DirectedEdge`,generateKey:!0,type:"directed"},{name:n=>`${n}UndirectedEdge`,generateKey:!0,type:"undirected"},{name:n=>`${n}EdgeWithKey`},{name:n=>`${n}DirectedEdgeWithKey`,type:"directed"},{name:n=>`${n}UndirectedEdgeWithKey`,type:"undirected"}],dn={allowSelfLoops:!0,multi:!1,type:"mixed"};function ln(n,i,t){if(t&&!J(t))throw new k(`Graph.addNode: invalid attributes. Expecting an object but got "${t}"`);if(i=""+i,t=t||{},n._nodes.has(i))throw new I(`Graph.addNode: the "${i}" node already exist in the graph.`);const e=new n.NodeDataClass(i,t);return n._nodes.set(i,e),n.emit("nodeAdded",{key:i,attributes:t}),e}function Mt(n,i,t){const e=new n.NodeDataClass(i,t);return n._nodes.set(i,e),n.emit("nodeAdded",{key:i,attributes:t}),e}function ki(n,i,t,e,r,a,o,s){if(!e&&n.type==="undirected")throw new I(`Graph.${i}: you cannot add a directed edge to an undirected graph. Use the #.addEdge or #.addUndirectedEdge instead.`);if(e&&n.type==="directed")throw new I(`Graph.${i}: you cannot add an undirected edge to a directed graph. Use the #.addEdge or #.addDirectedEdge instead.`);if(s&&!J(s))throw new k(`Graph.${i}: invalid attributes. Expecting an object but got "${s}"`);if(a=""+a,o=""+o,s=s||{},!n.allowSelfLoops&&a===o)throw new I(`Graph.${i}: source & target are the same ("${a}"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.`);const u=n._nodes.get(a),h=n._nodes.get(o);if(!u)throw new C(`Graph.${i}: source node "${a}" not found.`);if(!h)throw new C(`Graph.${i}: target node "${o}" not found.`);const d={key:null,undirected:e,source:a,target:o,attributes:s};if(t)r=n._edgeKeyGenerator();else if(r=""+r,n._edges.has(r))throw new I(`Graph.${i}: the "${r}" edge already exists in the graph.`);if(!n.multi&&(e?typeof u.undirected[o]<"u":typeof u.out[o]<"u"))throw new I(`Graph.${i}: an edge linking "${a}" to "${o}" already exists. If you really want to add multiple edges linking those nodes, you should create a multi graph by using the 'multi' option.`);const l=new Ge(e,r,u,h,s);n._edges.set(r,l);const f=a===o;return e?(u.undirectedDegree++,h.undirectedDegree++,f&&(u.undirectedLoops++,n._undirectedSelfLoopCount++)):(u.outDegree++,h.inDegree++,f&&(u.directedLoops++,n._directedSelfLoopCount++)),n.multi?l.attachMulti():l.attach(),e?n._undirectedSize++:n._directedSize++,d.key=r,n.emit("edgeAdded",d),r}function cn(n,i,t,e,r,a,o,s,u){if(!e&&n.type==="undirected")throw new I(`Graph.${i}: you cannot merge/update a directed edge to an undirected graph. Use the #.mergeEdge/#.updateEdge or #.addUndirectedEdge instead.`);if(e&&n.type==="directed")throw new I(`Graph.${i}: you cannot merge/update an undirected edge to a directed graph. Use the #.mergeEdge/#.updateEdge or #.addDirectedEdge instead.`);if(s){if(u){if(typeof s!="function")throw new k(`Graph.${i}: invalid updater function. Expecting a function but got "${s}"`)}else if(!J(s))throw new k(`Graph.${i}: invalid attributes. Expecting an object but got "${s}"`)}a=""+a,o=""+o;let h;if(u&&(h=s,s=void 0),!n.allowSelfLoops&&a===o)throw new I(`Graph.${i}: source & target are the same ("${a}"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.`);let d=n._nodes.get(a),l=n._nodes.get(o),f,c;if(!t&&(f=n._edges.get(r),f)){if((f.source.key!==a||f.target.key!==o)&&(!e||f.source.key!==o||f.target.key!==a))throw new I(`Graph.${i}: inconsistency detected when attempting to merge the "${r}" edge with "${a}" source & "${o}" target vs. ("${f.source.key}", "${f.target.key}").`);c=f}if(!c&&!n.multi&&d&&(c=e?d.undirected[o]:d.out[o]),c){const m=[c.key,!1,!1,!1];if(u?!h:!s)return m;if(u){const S=c.attributes;c.attributes=h(S),n.emit("edgeAttributesUpdated",{type:"replace",key:c.key,attributes:c.attributes})}else Z(c.attributes,s),n.emit("edgeAttributesUpdated",{type:"merge",key:c.key,attributes:c.attributes,data:s});return m}s=s||{},u&&h&&(s=h(s));const y={key:null,undirected:e,source:a,target:o,attributes:s};if(t)r=n._edgeKeyGenerator();else if(r=""+r,n._edges.has(r))throw new I(`Graph.${i}: the "${r}" edge already exists in the graph.`);let w=!1,T=!1;d||(d=Mt(n,a,{}),w=!0,a===o&&(l=d,T=!0)),l||(l=Mt(n,o,{}),T=!0),f=new Ge(e,r,d,l,s),n._edges.set(r,f);const D=a===o;return e?(d.undirectedDegree++,l.undirectedDegree++,D&&(d.undirectedLoops++,n._undirectedSelfLoopCount++)):(d.outDegree++,l.inDegree++,D&&(d.directedLoops++,n._directedSelfLoopCount++)),n.multi?f.attachMulti():f.attach(),e?n._undirectedSize++:n._directedSize++,y.key=r,n.emit("edgeAdded",y),[r,!0,w,T]}function xe(n,i){n._edges.delete(i.key);const{source:t,target:e,attributes:r}=i,a=i.undirected,o=t===e;a?(t.undirectedDegree--,e.undirectedDegree--,o&&(t.undirectedLoops--,n._undirectedSelfLoopCount--)):(t.outDegree--,e.inDegree--,o&&(t.directedLoops--,n._directedSelfLoopCount--)),n.multi?i.detachMulti():i.detach(),a?n._undirectedSize--:n._directedSize--,n.emit("edgeDropped",{key:i.key,attributes:r,source:t.key,target:e.key,undirected:a})}class j extends wi.EventEmitter{constructor(i){if(super(),i=Z({},dn,i),typeof i.multi!="boolean")throw new k(`Graph.constructor: invalid 'multi' option. Expecting a boolean but got "${i.multi}".`);if(!un.has(i.type))throw new k(`Graph.constructor: invalid 'type' option. Should be one of "mixed", "directed" or "undirected" but got "${i.type}".`);if(typeof i.allowSelfLoops!="boolean")throw new k(`Graph.constructor: invalid 'allowSelfLoops' option. Expecting a boolean but got "${i.allowSelfLoops}".`);const t=i.type==="mixed"?_i:i.type==="directed"?Ti:Si;ae(this,"NodeDataClass",t);const e="geid_"+sn()+"_";let r=0;const a=()=>{let o;do o=e+r++;while(this._edges.has(o));return o};ae(this,"_attributes",{}),ae(this,"_nodes",new Map),ae(this,"_edges",new Map),ae(this,"_directedSize",0),ae(this,"_undirectedSize",0),ae(this,"_directedSelfLoopCount",0),ae(this,"_undirectedSelfLoopCount",0),ae(this,"_edgeKeyGenerator",a),ae(this,"_options",i),Bt.forEach(o=>ae(this,o,this[o])),he(this,"order",()=>this._nodes.size),he(this,"size",()=>this._edges.size),he(this,"directedSize",()=>this._directedSize),he(this,"undirectedSize",()=>this._undirectedSize),he(this,"selfLoopCount",()=>this._directedSelfLoopCount+this._undirectedSelfLoopCount),he(this,"directedSelfLoopCount",()=>this._directedSelfLoopCount),he(this,"undirectedSelfLoopCount",()=>this._undirectedSelfLoopCount),he(this,"multi",this._options.multi),he(this,"type",this._options.type),he(this,"allowSelfLoops",this._options.allowSelfLoops),he(this,"implementation",()=>"graphology")}_resetInstanceCounters(){this._directedSize=0,this._undirectedSize=0,this._directedSelfLoopCount=0,this._undirectedSelfLoopCount=0}hasNode(i){return this._nodes.has(""+i)}hasDirectedEdge(i,t){if(this.type==="undirected")return!1;if(arguments.length===1){const e=""+i,r=this._edges.get(e);return!!r&&!r.undirected}else if(arguments.length===2){i=""+i,t=""+t;const e=this._nodes.get(i);return e?e.out.hasOwnProperty(t):!1}throw new k(`Graph.hasDirectedEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`)}hasUndirectedEdge(i,t){if(this.type==="directed")return!1;if(arguments.length===1){const e=""+i,r=this._edges.get(e);return!!r&&r.undirected}else if(arguments.length===2){i=""+i,t=""+t;const e=this._nodes.get(i);return e?e.undirected.hasOwnProperty(t):!1}throw new k(`Graph.hasDirectedEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`)}hasEdge(i,t){if(arguments.length===1){const e=""+i;return this._edges.has(e)}else if(arguments.length===2){i=""+i,t=""+t;const e=this._nodes.get(i);return e?typeof e.out<"u"&&e.out.hasOwnProperty(t)||typeof e.undirected<"u"&&e.undirected.hasOwnProperty(t):!1}throw new k(`Graph.hasEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`)}directedEdge(i,t){if(this.type==="undirected")return;if(i=""+i,t=""+t,this.multi)throw new I("Graph.directedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.directedEdges instead.");const e=this._nodes.get(i);if(!e)throw new C(`Graph.directedEdge: could not find the "${i}" source node in the graph.`);if(!this._nodes.has(t))throw new C(`Graph.directedEdge: could not find the "${t}" target node in the graph.`);const r=e.out&&e.out[t]||void 0;if(r)return r.key}undirectedEdge(i,t){if(this.type==="directed")return;if(i=""+i,t=""+t,this.multi)throw new I("Graph.undirectedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.undirectedEdges instead.");const e=this._nodes.get(i);if(!e)throw new C(`Graph.undirectedEdge: could not find the "${i}" source node in the graph.`);if(!this._nodes.has(t))throw new C(`Graph.undirectedEdge: could not find the "${t}" target node in the graph.`);const r=e.undirected&&e.undirected[t]||void 0;if(r)return r.key}edge(i,t){if(this.multi)throw new I("Graph.edge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.edges instead.");i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.edge: could not find the "${i}" source node in the graph.`);if(!this._nodes.has(t))throw new C(`Graph.edge: could not find the "${t}" target node in the graph.`);const r=e.out&&e.out[t]||e.undirected&&e.undirected[t]||void 0;if(r)return r.key}areDirectedNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areDirectedNeighbors: could not find the "${i}" node in the graph.`);return this.type==="undirected"?!1:t in e.in||t in e.out}areOutNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areOutNeighbors: could not find the "${i}" node in the graph.`);return this.type==="undirected"?!1:t in e.out}areInNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areInNeighbors: could not find the "${i}" node in the graph.`);return this.type==="undirected"?!1:t in e.in}areUndirectedNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areUndirectedNeighbors: could not find the "${i}" node in the graph.`);return this.type==="directed"?!1:t in e.undirected}areNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areNeighbors: could not find the "${i}" node in the graph.`);return this.type!=="undirected"&&(t in e.in||t in e.out)||this.type!=="directed"&&t in e.undirected}areInboundNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areInboundNeighbors: could not find the "${i}" node in the graph.`);return this.type!=="undirected"&&t in e.in||this.type!=="directed"&&t in e.undirected}areOutboundNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areOutboundNeighbors: could not find the "${i}" node in the graph.`);return this.type!=="undirected"&&t in e.out||this.type!=="directed"&&t in e.undirected}inDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.inDegree: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree}outDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.outDegree: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.outDegree}directedDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.directedDegree: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree+t.outDegree}undirectedDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.undirectedDegree: could not find the "${i}" node in the graph.`);return this.type==="directed"?0:t.undirectedDegree}inboundDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.inboundDegree: could not find the "${i}" node in the graph.`);let e=0;return this.type!=="directed"&&(e+=t.undirectedDegree),this.type!=="undirected"&&(e+=t.inDegree),e}outboundDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.outboundDegree: could not find the "${i}" node in the graph.`);let e=0;return this.type!=="directed"&&(e+=t.undirectedDegree),this.type!=="undirected"&&(e+=t.outDegree),e}degree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.degree: could not find the "${i}" node in the graph.`);let e=0;return this.type!=="directed"&&(e+=t.undirectedDegree),this.type!=="undirected"&&(e+=t.inDegree+t.outDegree),e}inDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.inDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree-t.directedLoops}outDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.outDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.outDegree-t.directedLoops}directedDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.directedDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree+t.outDegree-t.directedLoops*2}undirectedDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.undirectedDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="directed"?0:t.undirectedDegree-t.undirectedLoops*2}inboundDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.inboundDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);let e=0,r=0;return this.type!=="directed"&&(e+=t.undirectedDegree,r+=t.undirectedLoops*2),this.type!=="undirected"&&(e+=t.inDegree,r+=t.directedLoops),e-r}outboundDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.outboundDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);let e=0,r=0;return this.type!=="directed"&&(e+=t.undirectedDegree,r+=t.undirectedLoops*2),this.type!=="undirected"&&(e+=t.outDegree,r+=t.directedLoops),e-r}degreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.degreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);let e=0,r=0;return this.type!=="directed"&&(e+=t.undirectedDegree,r+=t.undirectedLoops*2),this.type!=="undirected"&&(e+=t.inDegree+t.outDegree,r+=t.directedLoops*2),e-r}source(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.source: could not find the "${i}" edge in the graph.`);return t.source.key}target(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.target: could not find the "${i}" edge in the graph.`);return t.target.key}extremities(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.extremities: could not find the "${i}" edge in the graph.`);return[t.source.key,t.target.key]}opposite(i,t){i=""+i,t=""+t;const e=this._edges.get(t);if(!e)throw new C(`Graph.opposite: could not find the "${t}" edge in the graph.`);const r=e.source.key,a=e.target.key;if(i===r)return a;if(i===a)return r;throw new C(`Graph.opposite: the "${i}" node is not attached to the "${t}" edge (${r}, ${a}).`)}hasExtremity(i,t){i=""+i,t=""+t;const e=this._edges.get(i);if(!e)throw new C(`Graph.hasExtremity: could not find the "${i}" edge in the graph.`);return e.source.key===t||e.target.key===t}isUndirected(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.isUndirected: could not find the "${i}" edge in the graph.`);return t.undirected}isDirected(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.isDirected: could not find the "${i}" edge in the graph.`);return!t.undirected}isSelfLoop(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.isSelfLoop: could not find the "${i}" edge in the graph.`);return t.source===t.target}addNode(i,t){return ln(this,i,t).key}mergeNode(i,t){if(t&&!J(t))throw new k(`Graph.mergeNode: invalid attributes. Expecting an object but got "${t}"`);i=""+i,t=t||{};let e=this._nodes.get(i);return e?(t&&(Z(e.attributes,t),this.emit("nodeAttributesUpdated",{type:"merge",key:i,attributes:e.attributes,data:t})),[i,!1]):(e=new this.NodeDataClass(i,t),this._nodes.set(i,e),this.emit("nodeAdded",{key:i,attributes:t}),[i,!0])}updateNode(i,t){if(t&&typeof t!="function")throw new k(`Graph.updateNode: invalid updater function. Expecting a function but got "${t}"`);i=""+i;let e=this._nodes.get(i);if(e){if(t){const a=e.attributes;e.attributes=t(a),this.emit("nodeAttributesUpdated",{type:"replace",key:i,attributes:e.attributes})}return[i,!1]}const r=t?t({}):{};return e=new this.NodeDataClass(i,r),this._nodes.set(i,e),this.emit("nodeAdded",{key:i,attributes:r}),[i,!0]}dropNode(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.dropNode: could not find the "${i}" node in the graph.`);let e;if(this.type!=="undirected"){for(const r in t.out){e=t.out[r];do xe(this,e),e=e.next;while(e)}for(const r in t.in){e=t.in[r];do xe(this,e),e=e.next;while(e)}}if(this.type!=="directed")for(const r in t.undirected){e=t.undirected[r];do xe(this,e),e=e.next;while(e)}this._nodes.delete(i),this.emit("nodeDropped",{key:i,attributes:t.attributes})}dropEdge(i){let t;if(arguments.length>1){const e=""+arguments[0],r=""+arguments[1];if(t=oe(this,e,r,this.type),!t)throw new C(`Graph.dropEdge: could not find the "${e}" -> "${r}" edge in the graph.`)}else if(i=""+i,t=this._edges.get(i),!t)throw new C(`Graph.dropEdge: could not find the "${i}" edge in the graph.`);return xe(this,t),this}dropDirectedEdge(i,t){if(arguments.length<2)throw new I("Graph.dropDirectedEdge: it does not make sense to try and drop a directed edge by key. What if the edge with this key is undirected? Use #.dropEdge for this purpose instead.");if(this.multi)throw new I("Graph.dropDirectedEdge: cannot use a {source,target} combo when dropping an edge in a MultiGraph since we cannot infer the one you want to delete as there could be multiple ones.");i=""+i,t=""+t;const e=oe(this,i,t,"directed");if(!e)throw new C(`Graph.dropDirectedEdge: could not find a "${i}" -> "${t}" edge in the graph.`);return xe(this,e),this}dropUndirectedEdge(i,t){if(arguments.length<2)throw new I("Graph.dropUndirectedEdge: it does not make sense to drop a directed edge by key. What if the edge with this key is undirected? Use #.dropEdge for this purpose instead.");if(this.multi)throw new I("Graph.dropUndirectedEdge: cannot use a {source,target} combo when dropping an edge in a MultiGraph since we cannot infer the one you want to delete as there could be multiple ones.");const e=oe(this,i,t,"undirected");if(!e)throw new C(`Graph.dropUndirectedEdge: could not find a "${i}" -> "${t}" edge in the graph.`);return xe(this,e),this}clear(){this._edges.clear(),this._nodes.clear(),this._resetInstanceCounters(),this.emit("cleared")}clearEdges(){const i=this._nodes.values();let t;for(;t=i.next(),t.done!==!0;)t.value.clear();this._edges.clear(),this._resetInstanceCounters(),this.emit("edgesCleared")}getAttribute(i){return this._attributes[i]}getAttributes(){return this._attributes}hasAttribute(i){return this._attributes.hasOwnProperty(i)}setAttribute(i,t){return this._attributes[i]=t,this.emit("attributesUpdated",{type:"set",attributes:this._attributes,name:i}),this}updateAttribute(i,t){if(typeof t!="function")throw new k("Graph.updateAttribute: updater should be a function.");const e=this._attributes[i];return this._attributes[i]=t(e),this.emit("attributesUpdated",{type:"set",attributes:this._attributes,name:i}),this}removeAttribute(i){return delete this._attributes[i],this.emit("attributesUpdated",{type:"remove",attributes:this._attributes,name:i}),this}replaceAttributes(i){if(!J(i))throw new k("Graph.replaceAttributes: provided attributes are not a plain object.");return this._attributes=i,this.emit("attributesUpdated",{type:"replace",attributes:this._attributes}),this}mergeAttributes(i){if(!J(i))throw new k("Graph.mergeAttributes: provided attributes are not a plain object.");return Z(this._attributes,i),this.emit("attributesUpdated",{type:"merge",attributes:this._attributes,data:i}),this}updateAttributes(i){if(typeof i!="function")throw new k("Graph.updateAttributes: provided updater is not a function.");return this._attributes=i(this._attributes),this.emit("attributesUpdated",{type:"update",attributes:this._attributes}),this}updateEachNodeAttributes(i,t){if(typeof i!="function")throw new k("Graph.updateEachNodeAttributes: expecting an updater function.");if(t&&!$t(t))throw new k("Graph.updateEachNodeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}");const e=this._nodes.values();let r,a;for(;r=e.next(),r.done!==!0;)a=r.value,a.attributes=i(a.key,a.attributes);this.emit("eachNodeAttributesUpdated",{hints:t||null})}updateEachEdgeAttributes(i,t){if(typeof i!="function")throw new k("Graph.updateEachEdgeAttributes: expecting an updater function.");if(t&&!$t(t))throw new k("Graph.updateEachEdgeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}");const e=this._edges.values();let r,a,o,s;for(;r=e.next(),r.done!==!0;)a=r.value,o=a.source,s=a.target,a.attributes=i(a.key,a.attributes,o.key,s.key,o.attributes,s.attributes,a.undirected);this.emit("eachEdgeAttributesUpdated",{hints:t||null})}forEachAdjacencyEntry(i){if(typeof i!="function")throw new k("Graph.forEachAdjacencyEntry: expecting a callback.");tt(!1,!1,!1,this,i)}forEachAdjacencyEntryWithOrphans(i){if(typeof i!="function")throw new k("Graph.forEachAdjacencyEntryWithOrphans: expecting a callback.");tt(!1,!1,!0,this,i)}forEachAssymetricAdjacencyEntry(i){if(typeof i!="function")throw new k("Graph.forEachAssymetricAdjacencyEntry: expecting a callback.");tt(!1,!0,!1,this,i)}forEachAssymetricAdjacencyEntryWithOrphans(i){if(typeof i!="function")throw new k("Graph.forEachAssymetricAdjacencyEntryWithOrphans: expecting a callback.");tt(!1,!0,!0,this,i)}nodes(){return Array.from(this._nodes.keys())}forEachNode(i){if(typeof i!="function")throw new k("Graph.forEachNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)r=e.value,i(r.key,r.attributes)}findNode(i){if(typeof i!="function")throw new k("Graph.findNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)if(r=e.value,i(r.key,r.attributes))return r.key}mapNodes(i){if(typeof i!="function")throw new k("Graph.mapNode: expecting a callback.");const t=this._nodes.values();let e,r;const a=new Array(this.order);let o=0;for(;e=t.next(),e.done!==!0;)r=e.value,a[o++]=i(r.key,r.attributes);return a}someNode(i){if(typeof i!="function")throw new k("Graph.someNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)if(r=e.value,i(r.key,r.attributes))return!0;return!1}everyNode(i){if(typeof i!="function")throw new k("Graph.everyNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)if(r=e.value,!i(r.key,r.attributes))return!1;return!0}filterNodes(i){if(typeof i!="function")throw new k("Graph.filterNodes: expecting a callback.");const t=this._nodes.values();let e,r;const a=[];for(;e=t.next(),e.done!==!0;)r=e.value,i(r.key,r.attributes)&&a.push(r.key);return a}reduceNodes(i,t){if(typeof i!="function")throw new k("Graph.reduceNodes: expecting a callback.");if(arguments.length<2)throw new k("Graph.reduceNodes: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.");let e=t;const r=this._nodes.values();let a,o;for(;a=r.next(),a.done!==!0;)o=a.value,e=i(e,o.key,o.attributes);return e}nodeEntries(){const i=this._nodes.values();return{[Symbol.iterator](){return this},next(){const t=i.next();if(t.done)return t;const e=t.value;return{value:{node:e.key,attributes:e.attributes},done:!1}}}}export(){const i=new Array(this._nodes.size);let t=0;this._nodes.forEach((r,a)=>{i[t++]=rn(a,r)});const e=new Array(this._edges.size);return t=0,this._edges.forEach((r,a)=>{e[t++]=nn(this.type,a,r)}),{options:{type:this.type,multi:this.multi,allowSelfLoops:this.allowSelfLoops},attributes:this.getAttributes(),nodes:i,edges:e}}import(i,t=!1){if(i instanceof j)return i.forEachNode((u,h)=>{t?this.mergeNode(u,h):this.addNode(u,h)}),i.forEachEdge((u,h,d,l,f,c,y)=>{t?y?this.mergeUndirectedEdgeWithKey(u,d,l,h):this.mergeDirectedEdgeWithKey(u,d,l,h):y?this.addUndirectedEdgeWithKey(u,d,l,h):this.addDirectedEdgeWithKey(u,d,l,h)}),this;if(!J(i))throw new k("Graph.import: invalid argument. Expecting a serialized graph or, alternatively, a Graph instance.");if(i.attributes){if(!J(i.attributes))throw new k("Graph.import: invalid attributes. Expecting a plain object.");t?this.mergeAttributes(i.attributes):this.replaceAttributes(i.attributes)}let e,r,a,o,s;if(i.nodes){if(a=i.nodes,!Array.isArray(a))throw new k("Graph.import: invalid nodes. Expecting an array.");for(e=0,r=a.length;e{const a=Z({},e.attributes);e=new t.NodeDataClass(r,a),t._nodes.set(r,e)}),t}copy(i){if(i=i||{},typeof i.type=="string"&&i.type!==this.type&&i.type!=="mixed")throw new I(`Graph.copy: cannot create an incompatible copy from "${this.type}" type to "${i.type}" because this would mean losing information about the current graph.`);if(typeof i.multi=="boolean"&&i.multi!==this.multi&&i.multi!==!0)throw new I("Graph.copy: cannot create an incompatible copy by downgrading a multi graph to a simple one because this would mean losing information about the current graph.");if(typeof i.allowSelfLoops=="boolean"&&i.allowSelfLoops!==this.allowSelfLoops&&i.allowSelfLoops!==!0)throw new I("Graph.copy: cannot create an incompatible copy from a graph allowing self loops to one that does not because this would mean losing information about the current graph.");const t=this.emptyCopy(i),e=this._edges.values();let r,a;for(;r=e.next(),r.done!==!0;)a=r.value,ki(t,"copy",!1,a.undirected,a.key,a.source.key,a.target.key,Z({},a.attributes));return t}toJSON(){return this.export()}toString(){return"[object Graph]"}inspect(){const i={};this._nodes.forEach((a,o)=>{i[o]=a.attributes});const t={},e={};this._edges.forEach((a,o)=>{const s=a.undirected?"--":"->";let u="",h=a.source.key,d=a.target.key,l;a.undirected&&h>d&&(l=h,h=d,d=l);const f=`(${h})${s}(${d})`;o.startsWith("geid_")?this.multi&&(typeof e[f]>"u"?e[f]=0:e[f]++,u+=`${e[f]}. `):u+=`[${o}]: `,u+=f,t[u]=a.attributes});const r={};for(const a in this)this.hasOwnProperty(a)&&!Bt.has(a)&&typeof this[a]!="function"&&typeof a!="symbol"&&(r[a]=this[a]);return r.attributes=this._attributes,r.nodes=i,r.edges=t,ae(r,"constructor",this.constructor),r}}typeof Symbol<"u"&&(j.prototype[Symbol.for("nodejs.util.inspect.custom")]=j.prototype.inspect);hn.forEach(n=>{["add","merge","update"].forEach(i=>{const t=n.name(i),e=i==="add"?ki:cn;n.generateKey?j.prototype[t]=function(r,a,o){return e(this,t,!0,(n.type||this.type)==="undirected",null,r,a,o,i==="update")}:j.prototype[t]=function(r,a,o,s){return e(this,t,!1,(n.type||this.type)==="undirected",r,a,o,s,i==="update")}})});wr(j);Lr(j);qr(j);tn(j);class Di extends j{constructor(i){const t=Z({type:"directed"},i);if("multi"in t&&t.multi!==!1)throw new k("DirectedGraph.from: inconsistent indication that the graph should be multi in given options!");if(t.type!=="directed")throw new k('DirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}class Li extends j{constructor(i){const t=Z({type:"undirected"},i);if("multi"in t&&t.multi!==!1)throw new k("UndirectedGraph.from: inconsistent indication that the graph should be multi in given options!");if(t.type!=="undirected")throw new k('UndirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}class Gi extends j{constructor(i){const t=Z({multi:!0},i);if("multi"in t&&t.multi!==!0)throw new k("MultiGraph.from: inconsistent indication that the graph should be simple in given options!");super(t)}}class Fi extends j{constructor(i){const t=Z({type:"directed",multi:!0},i);if("multi"in t&&t.multi!==!0)throw new k("MultiDirectedGraph.from: inconsistent indication that the graph should be simple in given options!");if(t.type!=="directed")throw new k('MultiDirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}class Ni extends j{constructor(i){const t=Z({type:"undirected",multi:!0},i);if("multi"in t&&t.multi!==!0)throw new k("MultiUndirectedGraph.from: inconsistent indication that the graph should be simple in given options!");if(t.type!=="undirected")throw new k('MultiUndirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}function Fe(n){n.from=function(i,t){const e=Z({},i.options,t),r=new n(e);return r.import(i),r}}Fe(j);Fe(Di);Fe(Li);Fe(Gi);Fe(Fi);Fe(Ni);j.Graph=j;j.DirectedGraph=Di;j.UndirectedGraph=Li;j.MultiGraph=Gi;j.MultiDirectedGraph=Fi;j.MultiUndirectedGraph=Ni;j.InvalidArgumentsGraphError=k;j.NotFoundGraphError=C;j.UsageGraphError=I;var ft,Ht;function Pi(){return Ht||(Ht=1,ft=function(i){return i!==null&&typeof i=="object"&&typeof i.addUndirectedEdgeWithKey=="function"&&typeof i.dropNode=="function"&&typeof i.multi=="boolean"}),ft}var ze={},Wt;function fn(){if(Wt)return ze;Wt=1;function n(e){return typeof e!="number"||isNaN(e)?1:e}function i(e,r){var a={},o=function(h){return typeof h>"u"?r:h};typeof r=="function"&&(o=r);var s=function(h){return o(h[e])},u=function(){return o(void 0)};return typeof e=="string"?(a.fromAttributes=s,a.fromGraph=function(h,d){return s(h.getNodeAttributes(d))},a.fromEntry=function(h,d){return s(d)}):typeof e=="function"?(a.fromAttributes=function(){throw new Error("graphology-utils/getters/createNodeValueGetter: irrelevant usage.")},a.fromGraph=function(h,d){return o(e(d,h.getNodeAttributes(d)))},a.fromEntry=function(h,d){return o(e(h,d))}):(a.fromAttributes=u,a.fromGraph=u,a.fromEntry=u),a}function t(e,r){var a={},o=function(h){return typeof h>"u"?r:h};typeof r=="function"&&(o=r);var s=function(h){return o(h[e])},u=function(){return o(void 0)};return typeof e=="string"?(a.fromAttributes=s,a.fromGraph=function(h,d){return s(h.getEdgeAttributes(d))},a.fromEntry=function(h,d){return s(d)},a.fromPartialEntry=a.fromEntry,a.fromMinimalEntry=a.fromEntry):typeof e=="function"?(a.fromAttributes=function(){throw new Error("graphology-utils/getters/createEdgeValueGetter: irrelevant usage.")},a.fromGraph=function(h,d){var l=h.extremities(d);return o(e(d,h.getEdgeAttributes(d),l[0],l[1],h.getNodeAttributes(l[0]),h.getNodeAttributes(l[1]),h.isUndirected(d)))},a.fromEntry=function(h,d,l,f,c,y,w){return o(e(h,d,l,f,c,y,w))},a.fromPartialEntry=function(h,d,l,f){return o(e(h,d,l,f))},a.fromMinimalEntry=function(h,d){return o(e(h,d))}):(a.fromAttributes=u,a.fromGraph=u,a.fromEntry=u,a.fromMinimalEntry=u),a}return ze.createNodeValueGetter=i,ze.createEdgeValueGetter=t,ze.createEdgeWeightGetter=function(e){return t(e,n)},ze}var gt,jt;function gn(){if(jt)return gt;jt=1;var n=0,i=1,t=2,e=3,r=4,a=5,o=6,s=7,u=8,h=9,d=0,l=1,f=2,c=0,y=1,w=2,T=3,D=4,m=5,S=6,p=7,b=8,R=3,A=10,G=3,F=9,P=10;return gt=function(z,g,K){var te,x,v,$,W,X,ie,Y,N,Ne,re=g.length,tr=K.length,Pe=z.adjustSizes,ir=z.barnesHutTheta*z.barnesHutTheta,qe,q,B,M,fe,U,O,E=[];for(v=0;vYe?(Ee-=(Ke-Ye)/2,Re=Ee+Ke):(we-=(Ye-Ke)/2,Se=we+Ye),E[0+c]=-1,E[0+y]=(we+Se)/2,E[0+w]=(Ee+Re)/2,E[0+T]=Math.max(Se-we,Re-Ee),E[0+D]=-1,E[0+m]=-1,E[0+S]=0,E[0+p]=0,E[0+b]=0,te=1,v=0;v=0){g[v+n]=0)if(U=Math.pow(g[v+n]-E[x+p],2)+Math.pow(g[v+i]-E[x+b],2),Ne=E[x+T],4*Ne*Ne/U0?(O=q*g[v+o]*E[x+S]/U,g[v+t]+=B*O,g[v+e]+=M*O):U<0&&(O=-q*g[v+o]*E[x+S]/Math.sqrt(U),g[v+t]+=B*O,g[v+e]+=M*O):U>0&&(O=q*g[v+o]*E[x+S]/U,g[v+t]+=B*O,g[v+e]+=M*O),x=E[x+D],x<0)break;continue}else{x=E[x+m];continue}else{if(X=E[x+c],X>=0&&X!==v&&(B=g[v+n]-g[X+n],M=g[v+i]-g[X+i],U=B*B+M*M,Pe===!0?U>0?(O=q*g[v+o]*g[X+o]/U,g[v+t]+=B*O,g[v+e]+=M*O):U<0&&(O=-q*g[v+o]*g[X+o]/Math.sqrt(U),g[v+t]+=B*O,g[v+e]+=M*O):U>0&&(O=q*g[v+o]*g[X+o]/U,g[v+t]+=B*O,g[v+e]+=M*O)),x=E[x+D],x<0)break;continue}else for(q=z.scalingRatio,$=0;$0?(O=q*g[$+o]*g[W+o]/U/U,g[$+t]+=B*O,g[$+e]+=M*O,g[W+t]-=B*O,g[W+e]-=M*O):U<0&&(O=100*q*g[$+o]*g[W+o],g[$+t]+=B*O,g[$+e]+=M*O,g[W+t]-=B*O,g[W+e]-=M*O)):(U=Math.sqrt(B*B+M*M),U>0&&(O=q*g[$+o]*g[W+o]/U/U,g[$+t]+=B*O,g[$+e]+=M*O,g[W+t]-=B*O,g[W+e]-=M*O));for(N=z.gravity/z.scalingRatio,q=z.scalingRatio,v=0;v0&&(O=q*g[v+o]*N):U>0&&(O=q*g[v+o]*N/U),g[v+t]-=B*O,g[v+e]-=M*O;for(q=1*(z.outboundAttractionDistribution?qe:1),ie=0;ie0&&(O=-q*fe*Math.log(1+U)/U/g[$+o]):U>0&&(O=-q*fe*Math.log(1+U)/U):z.outboundAttractionDistribution?U>0&&(O=-q*fe/g[$+o]):U>0&&(O=-q*fe)):(U=Math.sqrt(Math.pow(B,2)+Math.pow(M,2)),z.linLogMode?z.outboundAttractionDistribution?U>0&&(O=-q*fe*Math.log(1+U)/U/g[$+o]):U>0&&(O=-q*fe*Math.log(1+U)/U):z.outboundAttractionDistribution?(U=1,O=-q*fe/g[$+o]):(U=1,O=-q*fe)),U>0&&(g[$+t]+=B*O,g[$+e]+=M*O,g[W+t]-=B*O,g[W+e]-=M*O);var Ze,Ie,Xe,_e,Je,Qe;if(Pe===!0)for(v=0;vP&&(g[v+t]=g[v+t]*P/Ze,g[v+e]=g[v+e]*P/Ze),Ie=g[v+o]*Math.sqrt((g[v+r]-g[v+t])*(g[v+r]-g[v+t])+(g[v+a]-g[v+e])*(g[v+a]-g[v+e])),Xe=Math.sqrt((g[v+r]+g[v+t])*(g[v+r]+g[v+t])+(g[v+a]+g[v+e])*(g[v+a]+g[v+e]))/2,_e=.1*Math.log(1+Xe)/(1+Math.sqrt(Ie)),Je=g[v+n]+g[v+t]*(_e/z.slowDown),g[v+n]=Je,Qe=g[v+i]+g[v+e]*(_e/z.slowDown),g[v+i]=Qe);else for(v=0;v=0)?{message:"the `scalingRatio` setting should be a number >= 0."}:"strongGravityMode"in t&&typeof t.strongGravityMode!="boolean"?{message:"the `strongGravityMode` setting should be a boolean."}:"gravity"in t&&!(typeof t.gravity=="number"&&t.gravity>=0)?{message:"the `gravity` setting should be a number >= 0."}:"slowDown"in t&&!(typeof t.slowDown=="number"||t.slowDown>=0)?{message:"the `slowDown` setting should be a number >= 0."}:"barnesHutOptimize"in t&&typeof t.barnesHutOptimize!="boolean"?{message:"the `barnesHutOptimize` setting should be a boolean."}:"barnesHutTheta"in t&&!(typeof t.barnesHutTheta=="number"&&t.barnesHutTheta>=0)?{message:"the `barnesHutTheta` setting should be a number >= 0."}:null},ge.graphToByteArrays=function(t,e){var r=t.order,a=t.size,o={},s,u=new Float32Array(r*n),h=new Float32Array(a*i);return s=0,t.forEachNode(function(d,l){o[d]=s,u[s]=l.x,u[s+1]=l.y,u[s+2]=0,u[s+3]=0,u[s+4]=0,u[s+5]=0,u[s+6]=1,u[s+7]=1,u[s+8]=l.size||1,u[s+9]=l.fixed?1:0,s+=n}),s=0,t.forEachEdge(function(d,l,f,c,y,w,T){var D=o[f],m=o[c],S=e(d,l,f,c,y,w,T);u[D+6]+=S,u[m+6]+=S,h[s]=D,h[s+1]=m,h[s+2]=S,s+=i}),{nodes:u,edges:h}},ge.assignLayoutChanges=function(t,e,r){var a=0;t.updateEachNodeAttributes(function(o,s){return s.x=e[a],s.y=e[a+1],a+=n,r?r(o,s):s})},ge.readGraphPositions=function(t,e){var r=0;t.forEachNode(function(a,o){e[r]=o.x,e[r+1]=o.y,r+=n})},ge.collectLayoutChanges=function(t,e,r){for(var a=t.nodes(),o={},s=0,u=0,h=e.length;s2e3,strongGravityMode:!0,gravity:.05,scalingRatio:10,slowDown:1+Math.log(h)}}var s=a.bind(null,!1);return s.assign=a.bind(null,!0),s.inferSettings=o,vt=s,vt}var yn=mn();const it=bi(yn);function bn(n,i){if(typeof n!="object"||!n)return n;var t=n[Symbol.toPrimitive];if(t!==void 0){var e=t.call(n,i);if(typeof e!="object")return e;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(n)}function je(n){var i=bn(n,"string");return typeof i=="symbol"?i:i+""}function Q(n,i){if(!(n instanceof i))throw new TypeError("Cannot call a class as a function")}function Yt(n,i){for(var t=0;tn.length)&&(i=n.length);for(var t=0,e=Array(i);t0&&(P=R[0]),P instanceof Error)throw P;var V=new Error("Unhandled error."+(P?" ("+P.message+")":""));throw V.context=P,V}var z=F[b];if(z===void 0)return!1;if(typeof z=="function")i(z,this,R);else for(var g=z.length,K=y(z,g),A=0;A0&&P.length>G&&!P.warned){P.warned=!0;var V=new Error("Possible EventEmitter memory leak detected. "+P.length+" "+String(b)+" listeners added. Use emitter.setMaxListeners() to increase limit");V.name="MaxListenersExceededWarning",V.emitter=p,V.type=b,V.count=P.length,e(V)}return p}a.prototype.addListener=function(b,R){return h(this,b,R,!1)},a.prototype.on=a.prototype.addListener,a.prototype.prependListener=function(b,R){return h(this,b,R,!0)};function d(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function l(p,b,R){var A={fired:!1,wrapFn:void 0,target:p,type:b,listener:R},G=d.bind(A);return G.listener=R,A.wrapFn=G,G}a.prototype.once=function(b,R){return s(R),this.on(b,l(this,b,R)),this},a.prototype.prependOnceListener=function(b,R){return s(R),this.prependListener(b,l(this,b,R)),this},a.prototype.removeListener=function(b,R){var A,G,F,P,V;if(s(R),G=this._events,G===void 0)return this;if(A=G[b],A===void 0)return this;if(A===R||A.listener===R)--this._eventsCount===0?this._events=Object.create(null):(delete G[b],G.removeListener&&this.emit("removeListener",b,A.listener||R));else if(typeof A!="function"){for(F=-1,P=A.length-1;P>=0;P--)if(A[P]===R||A[P].listener===R){V=A[P].listener,F=P;break}if(F<0)return this;F===0?A.shift():w(A,F),A.length===1&&(G[b]=A[0]),G.removeListener!==void 0&&this.emit("removeListener",b,V||R)}return this},a.prototype.off=a.prototype.removeListener,a.prototype.removeAllListeners=function(b){var R,A,G;if(A=this._events,A===void 0)return this;if(A.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):A[b]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete A[b]),this;if(arguments.length===0){var F=Object.keys(A),P;for(G=0;G=0;G--)this.removeListener(b,R[G]);return this};function f(p,b,R){var A=p._events;if(A===void 0)return[];var G=A[b];return G===void 0?[]:typeof G=="function"?R?[G.listener||G]:[G]:R?T(G):y(G,G.length)}a.prototype.listeners=function(b){return f(this,b,!0)},a.prototype.rawListeners=function(b){return f(this,b,!1)},a.listenerCount=function(p,b){return typeof p.listenerCount=="function"?p.listenerCount(b):c.call(p,b)},a.prototype.listenerCount=c;function c(p){var b=this._events;if(b!==void 0){var R=b[p];if(typeof R=="function")return 1;if(R!==void 0)return R.length}return 0}a.prototype.eventNames=function(){return this._eventsCount>0?t(this._events):[]};function y(p,b){for(var R=new Array(b),A=0;An++}function me(){const n=arguments;let i=null,t=-1;return{[Symbol.iterator](){return this},next(){let e=null;do{if(i===null){if(t++,t>=n.length)return{done:!0};i=n[t][Symbol.iterator]()}if(e=i.next(),e.done){i=null;continue}break}while(!0);return e}}}function Le(){return{[Symbol.iterator](){return this},next(){return{done:!0}}}}class Lt extends Error{constructor(i){super(),this.name="GraphError",this.message=i}}class k extends Lt{constructor(i){super(i),this.name="InvalidArgumentsGraphError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,k.prototype.constructor)}}class C extends Lt{constructor(i){super(i),this.name="NotFoundGraphError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,C.prototype.constructor)}}class I extends Lt{constructor(i){super(i),this.name="UsageGraphError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,I.prototype.constructor)}}function _i(n,i){this.key=n,this.attributes=i,this.clear()}_i.prototype.clear=function(){this.inDegree=0,this.outDegree=0,this.undirectedDegree=0,this.undirectedLoops=0,this.directedLoops=0,this.in={},this.out={},this.undirected={}};function Ti(n,i){this.key=n,this.attributes=i,this.clear()}Ti.prototype.clear=function(){this.inDegree=0,this.outDegree=0,this.directedLoops=0,this.in={},this.out={}};function Si(n,i){this.key=n,this.attributes=i,this.clear()}Si.prototype.clear=function(){this.undirectedDegree=0,this.undirectedLoops=0,this.undirected={}};function Ge(n,i,t,e,r){this.key=i,this.attributes=r,this.undirected=n,this.source=t,this.target=e}Ge.prototype.attach=function(){let n="out",i="in";this.undirected&&(n=i="undirected");const t=this.source.key,e=this.target.key;this.source[n][e]=this,!(this.undirected&&t===e)&&(this.target[i][t]=this)};Ge.prototype.attachMulti=function(){let n="out",i="in";const t=this.source.key,e=this.target.key;this.undirected&&(n=i="undirected");const r=this.source[n],a=r[e];if(typeof a>"u"){r[e]=this,this.undirected&&t===e||(this.target[i][t]=this);return}a.previous=this,this.next=a,r[e]=this,this.target[i][t]=this};Ge.prototype.detach=function(){const n=this.source.key,i=this.target.key;let t="out",e="in";this.undirected&&(t=e="undirected"),delete this.source[t][i],delete this.target[e][n]};Ge.prototype.detachMulti=function(){const n=this.source.key,i=this.target.key;let t="out",e="in";this.undirected&&(t=e="undirected"),this.previous===void 0?this.next===void 0?(delete this.source[t][i],delete this.target[e][n]):(this.next.previous=void 0,this.source[t][i]=this.next,this.target[e][n]=this.next):(this.previous.next=this.next,this.next!==void 0&&(this.next.previous=this.previous))};const Ri=0,Ai=1,hr=2,xi=3;function ye(n,i,t,e,r,a,o){let s,u,h,d;if(e=""+e,t===Ri){if(s=n._nodes.get(e),!s)throw new C(`Graph.${i}: could not find the "${e}" node in the graph.`);h=r,d=a}else if(t===xi){if(r=""+r,u=n._edges.get(r),!u)throw new C(`Graph.${i}: could not find the "${r}" edge in the graph.`);const l=u.source.key,f=u.target.key;if(e===l)s=u.target;else if(e===f)s=u.source;else throw new C(`Graph.${i}: the "${e}" node is not attached to the "${r}" edge (${l}, ${f}).`);h=a,d=o}else{if(u=n._edges.get(e),!u)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`);t===Ai?s=u.source:s=u.target,h=r,d=a}return[s,h,d]}function dr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);return o.attributes[s]}}function lr(n,i,t){n.prototype[i]=function(e,r){const[a]=ye(this,i,t,e,r);return a.attributes}}function cr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);return o.attributes.hasOwnProperty(s)}}function fr(n,i,t){n.prototype[i]=function(e,r,a,o){const[s,u,h]=ye(this,i,t,e,r,a,o);return s.attributes[u]=h,this.emit("nodeAttributesUpdated",{key:s.key,type:"set",attributes:s.attributes,name:u}),this}}function gr(n,i,t){n.prototype[i]=function(e,r,a,o){const[s,u,h]=ye(this,i,t,e,r,a,o);if(typeof h!="function")throw new k(`Graph.${i}: updater should be a function.`);const d=s.attributes,l=h(d[u]);return d[u]=l,this.emit("nodeAttributesUpdated",{key:s.key,type:"set",attributes:s.attributes,name:u}),this}}function pr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);return delete o.attributes[s],this.emit("nodeAttributesUpdated",{key:o.key,type:"remove",attributes:o.attributes,name:s}),this}}function vr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);if(!J(s))throw new k(`Graph.${i}: provided attributes are not a plain object.`);return o.attributes=s,this.emit("nodeAttributesUpdated",{key:o.key,type:"replace",attributes:o.attributes}),this}}function mr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);if(!J(s))throw new k(`Graph.${i}: provided attributes are not a plain object.`);return Z(o.attributes,s),this.emit("nodeAttributesUpdated",{key:o.key,type:"merge",attributes:o.attributes,data:s}),this}}function yr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);if(typeof s!="function")throw new k(`Graph.${i}: provided updater is not a function.`);return o.attributes=s(o.attributes),this.emit("nodeAttributesUpdated",{key:o.key,type:"update",attributes:o.attributes}),this}}const br=[{name:n=>`get${n}Attribute`,attacher:dr},{name:n=>`get${n}Attributes`,attacher:lr},{name:n=>`has${n}Attribute`,attacher:cr},{name:n=>`set${n}Attribute`,attacher:fr},{name:n=>`update${n}Attribute`,attacher:gr},{name:n=>`remove${n}Attribute`,attacher:pr},{name:n=>`replace${n}Attributes`,attacher:vr},{name:n=>`merge${n}Attributes`,attacher:mr},{name:n=>`update${n}Attributes`,attacher:yr}];function wr(n){br.forEach(function({name:i,attacher:t}){t(n,i("Node"),Ri),t(n,i("Source"),Ai),t(n,i("Target"),hr),t(n,i("Opposite"),xi)})}function Er(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return a.attributes[r]}}function _r(n,i,t){n.prototype[i]=function(e){let r;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>1){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const a=""+e,o=""+arguments[1];if(r=oe(this,a,o,t),!r)throw new C(`Graph.${i}: could not find an edge for the given path ("${a}" - "${o}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,r=this._edges.get(e),!r)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return r.attributes}}function Tr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return a.attributes.hasOwnProperty(r)}}function Sr(n,i,t){n.prototype[i]=function(e,r,a){let o;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>3){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const s=""+e,u=""+r;if(r=arguments[2],a=arguments[3],o=oe(this,s,u,t),!o)throw new C(`Graph.${i}: could not find an edge for the given path ("${s}" - "${u}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,o=this._edges.get(e),!o)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return o.attributes[r]=a,this.emit("edgeAttributesUpdated",{key:o.key,type:"set",attributes:o.attributes,name:r}),this}}function Rr(n,i,t){n.prototype[i]=function(e,r,a){let o;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>3){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const s=""+e,u=""+r;if(r=arguments[2],a=arguments[3],o=oe(this,s,u,t),!o)throw new C(`Graph.${i}: could not find an edge for the given path ("${s}" - "${u}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,o=this._edges.get(e),!o)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(typeof a!="function")throw new k(`Graph.${i}: updater should be a function.`);return o.attributes[r]=a(o.attributes[r]),this.emit("edgeAttributesUpdated",{key:o.key,type:"set",attributes:o.attributes,name:r}),this}}function Ar(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return delete a.attributes[r],this.emit("edgeAttributesUpdated",{key:a.key,type:"remove",attributes:a.attributes,name:r}),this}}function xr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(!J(r))throw new k(`Graph.${i}: provided attributes are not a plain object.`);return a.attributes=r,this.emit("edgeAttributesUpdated",{key:a.key,type:"replace",attributes:a.attributes}),this}}function Cr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(!J(r))throw new k(`Graph.${i}: provided attributes are not a plain object.`);return Z(a.attributes,r),this.emit("edgeAttributesUpdated",{key:a.key,type:"merge",attributes:a.attributes,data:r}),this}}function kr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(typeof r!="function")throw new k(`Graph.${i}: provided updater is not a function.`);return a.attributes=r(a.attributes),this.emit("edgeAttributesUpdated",{key:a.key,type:"update",attributes:a.attributes}),this}}const Dr=[{name:n=>`get${n}Attribute`,attacher:Er},{name:n=>`get${n}Attributes`,attacher:_r},{name:n=>`has${n}Attribute`,attacher:Tr},{name:n=>`set${n}Attribute`,attacher:Sr},{name:n=>`update${n}Attribute`,attacher:Rr},{name:n=>`remove${n}Attribute`,attacher:Ar},{name:n=>`replace${n}Attributes`,attacher:xr},{name:n=>`merge${n}Attributes`,attacher:Cr},{name:n=>`update${n}Attributes`,attacher:kr}];function Lr(n){Dr.forEach(function({name:i,attacher:t}){t(n,i("Edge"),"mixed"),t(n,i("DirectedEdge"),"directed"),t(n,i("UndirectedEdge"),"undirected")})}const Gr=[{name:"edges",type:"mixed"},{name:"inEdges",type:"directed",direction:"in"},{name:"outEdges",type:"directed",direction:"out"},{name:"inboundEdges",type:"mixed",direction:"in"},{name:"outboundEdges",type:"mixed",direction:"out"},{name:"directedEdges",type:"directed"},{name:"undirectedEdges",type:"undirected"}];function Fr(n,i,t,e){let r=!1;for(const a in i){if(a===e)continue;const o=i[a];if(r=t(o.key,o.attributes,o.source.key,o.target.key,o.source.attributes,o.target.attributes,o.undirected),n&&r)return o.key}}function Nr(n,i,t,e){let r,a,o,s=!1;for(const u in i)if(u!==e){r=i[u];do{if(a=r.source,o=r.target,s=t(r.key,r.attributes,a.key,o.key,a.attributes,o.attributes,r.undirected),n&&s)return r.key;r=r.next}while(r!==void 0)}}function lt(n,i){const t=Object.keys(n),e=t.length;let r,a=0;return{[Symbol.iterator](){return this},next(){do if(r)r=r.next;else{if(a>=e)return{done:!0};const o=t[a++];if(o===i){r=void 0;continue}r=n[o]}while(!r);return{done:!1,value:{edge:r.key,attributes:r.attributes,source:r.source.key,target:r.target.key,sourceAttributes:r.source.attributes,targetAttributes:r.target.attributes,undirected:r.undirected}}}}}function Pr(n,i,t,e){const r=i[t];if(!r)return;const a=r.source,o=r.target;if(e(r.key,r.attributes,a.key,o.key,a.attributes,o.attributes,r.undirected)&&n)return r.key}function Ir(n,i,t,e){let r=i[t];if(!r)return;let a=!1;do{if(a=e(r.key,r.attributes,r.source.key,r.target.key,r.source.attributes,r.target.attributes,r.undirected),n&&a)return r.key;r=r.next}while(r!==void 0)}function ct(n,i){let t=n[i];if(t.next!==void 0)return{[Symbol.iterator](){return this},next(){if(!t)return{done:!0};const r={edge:t.key,attributes:t.attributes,source:t.source.key,target:t.target.key,sourceAttributes:t.source.attributes,targetAttributes:t.target.attributes,undirected:t.undirected};return t=t.next,{done:!1,value:r}}};let e=!1;return{[Symbol.iterator](){return this},next(){return e===!0?{done:!0}:(e=!0,{done:!1,value:{edge:t.key,attributes:t.attributes,source:t.source.key,target:t.target.key,sourceAttributes:t.source.attributes,targetAttributes:t.target.attributes,undirected:t.undirected}})}}}function Or(n,i){if(n.size===0)return[];if(i==="mixed"||i===n.type)return Array.from(n._edges.keys());const t=i==="undirected"?n.undirectedSize:n.directedSize,e=new Array(t),r=i==="undirected",a=n._edges.values();let o=0,s,u;for(;s=a.next(),s.done!==!0;)u=s.value,u.undirected===r&&(e[o++]=u.key);return e}function Ci(n,i,t,e){if(i.size===0)return;const r=t!=="mixed"&&t!==i.type,a=t==="undirected";let o,s,u=!1;const h=i._edges.values();for(;o=h.next(),o.done!==!0;){if(s=o.value,r&&s.undirected!==a)continue;const{key:d,attributes:l,source:f,target:c}=s;if(u=e(d,l,f.key,c.key,f.attributes,c.attributes,s.undirected),n&&u)return d}}function Ur(n,i){if(n.size===0)return Le();const t=i!=="mixed"&&i!==n.type,e=i==="undirected",r=n._edges.values();return{[Symbol.iterator](){return this},next(){let a,o;for(;;){if(a=r.next(),a.done)return a;if(o=a.value,!(t&&o.undirected!==e))break}return{value:{edge:o.key,attributes:o.attributes,source:o.source.key,target:o.target.key,sourceAttributes:o.source.attributes,targetAttributes:o.target.attributes,undirected:o.undirected},done:!1}}}}function Gt(n,i,t,e,r,a){const o=i?Nr:Fr;let s;if(t!=="undirected"&&(e!=="out"&&(s=o(n,r.in,a),n&&s)||e!=="in"&&(s=o(n,r.out,a,e?void 0:r.key),n&&s))||t!=="directed"&&(s=o(n,r.undirected,a),n&&s))return s}function zr(n,i,t,e){const r=[];return Gt(!1,n,i,t,e,function(a){r.push(a)}),r}function $r(n,i,t){let e=Le();return n!=="undirected"&&(i!=="out"&&typeof t.in<"u"&&(e=me(e,lt(t.in))),i!=="in"&&typeof t.out<"u"&&(e=me(e,lt(t.out,i?void 0:t.key)))),n!=="directed"&&typeof t.undirected<"u"&&(e=me(e,lt(t.undirected))),e}function Ft(n,i,t,e,r,a,o){const s=t?Ir:Pr;let u;if(i!=="undirected"&&(typeof r.in<"u"&&e!=="out"&&(u=s(n,r.in,a,o),n&&u)||typeof r.out<"u"&&e!=="in"&&(e||r.key!==a)&&(u=s(n,r.out,a,o),n&&u))||i!=="directed"&&typeof r.undirected<"u"&&(u=s(n,r.undirected,a,o),n&&u))return u}function Br(n,i,t,e,r){const a=[];return Ft(!1,n,i,t,e,r,function(o){a.push(o)}),a}function Mr(n,i,t,e){let r=Le();return n!=="undirected"&&(typeof t.in<"u"&&i!=="out"&&e in t.in&&(r=me(r,ct(t.in,e))),typeof t.out<"u"&&i!=="in"&&e in t.out&&(i||t.key!==e)&&(r=me(r,ct(t.out,e)))),n!=="directed"&&typeof t.undirected<"u"&&e in t.undirected&&(r=me(r,ct(t.undirected,e))),r}function Hr(n,i){const{name:t,type:e,direction:r}=i;n.prototype[t]=function(a,o){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return[];if(!arguments.length)return Or(this,e);if(arguments.length===1){a=""+a;const s=this._nodes.get(a);if(typeof s>"u")throw new C(`Graph.${t}: could not find the "${a}" node in the graph.`);return zr(this.multi,e==="mixed"?this.type:e,r,s)}if(arguments.length===2){a=""+a,o=""+o;const s=this._nodes.get(a);if(!s)throw new C(`Graph.${t}: could not find the "${a}" source node in the graph.`);if(!this._nodes.has(o))throw new C(`Graph.${t}: could not find the "${o}" target node in the graph.`);return Br(e,this.multi,r,s,o)}throw new k(`Graph.${t}: too many arguments (expecting 0, 1 or 2 and got ${arguments.length}).`)}}function Wr(n,i){const{name:t,type:e,direction:r}=i,a="forEach"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[a]=function(h,d,l){if(!(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)){if(arguments.length===1)return l=h,Ci(!1,this,e,l);if(arguments.length===2){h=""+h,l=d;const f=this._nodes.get(h);if(typeof f>"u")throw new C(`Graph.${a}: could not find the "${h}" node in the graph.`);return Gt(!1,this.multi,e==="mixed"?this.type:e,r,f,l)}if(arguments.length===3){h=""+h,d=""+d;const f=this._nodes.get(h);if(!f)throw new C(`Graph.${a}: could not find the "${h}" source node in the graph.`);if(!this._nodes.has(d))throw new C(`Graph.${a}: could not find the "${d}" target node in the graph.`);return Ft(!1,e,this.multi,r,f,d,l)}throw new k(`Graph.${a}: too many arguments (expecting 1, 2 or 3 and got ${arguments.length}).`)}};const o="map"+t[0].toUpperCase()+t.slice(1);n.prototype[o]=function(){const h=Array.prototype.slice.call(arguments),d=h.pop();let l;if(h.length===0){let f=0;e!=="directed"&&(f+=this.undirectedSize),e!=="undirected"&&(f+=this.directedSize),l=new Array(f);let c=0;h.push((y,w,T,D,m,S,p)=>{l[c++]=d(y,w,T,D,m,S,p)})}else l=[],h.push((f,c,y,w,T,D,m)=>{l.push(d(f,c,y,w,T,D,m))});return this[a].apply(this,h),l};const s="filter"+t[0].toUpperCase()+t.slice(1);n.prototype[s]=function(){const h=Array.prototype.slice.call(arguments),d=h.pop(),l=[];return h.push((f,c,y,w,T,D,m)=>{d(f,c,y,w,T,D,m)&&l.push(f)}),this[a].apply(this,h),l};const u="reduce"+t[0].toUpperCase()+t.slice(1);n.prototype[u]=function(){let h=Array.prototype.slice.call(arguments);if(h.length<2||h.length>4)throw new k(`Graph.${u}: invalid number of arguments (expecting 2, 3 or 4 and got ${h.length}).`);if(typeof h[h.length-1]=="function"&&typeof h[h.length-2]!="function")throw new k(`Graph.${u}: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.`);let d,l;h.length===2?(d=h[0],l=h[1],h=[]):h.length===3?(d=h[1],l=h[2],h=[h[0]]):h.length===4&&(d=h[2],l=h[3],h=[h[0],h[1]]);let f=l;return h.push((c,y,w,T,D,m,S)=>{f=d(f,c,y,w,T,D,m,S)}),this[a].apply(this,h),f}}function jr(n,i){const{name:t,type:e,direction:r}=i,a="find"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[a]=function(u,h,d){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return!1;if(arguments.length===1)return d=u,Ci(!0,this,e,d);if(arguments.length===2){u=""+u,d=h;const l=this._nodes.get(u);if(typeof l>"u")throw new C(`Graph.${a}: could not find the "${u}" node in the graph.`);return Gt(!0,this.multi,e==="mixed"?this.type:e,r,l,d)}if(arguments.length===3){u=""+u,h=""+h;const l=this._nodes.get(u);if(!l)throw new C(`Graph.${a}: could not find the "${u}" source node in the graph.`);if(!this._nodes.has(h))throw new C(`Graph.${a}: could not find the "${h}" target node in the graph.`);return Ft(!0,e,this.multi,r,l,h,d)}throw new k(`Graph.${a}: too many arguments (expecting 1, 2 or 3 and got ${arguments.length}).`)};const o="some"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[o]=function(){const u=Array.prototype.slice.call(arguments),h=u.pop();return u.push((l,f,c,y,w,T,D)=>h(l,f,c,y,w,T,D)),!!this[a].apply(this,u)};const s="every"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[s]=function(){const u=Array.prototype.slice.call(arguments),h=u.pop();return u.push((l,f,c,y,w,T,D)=>!h(l,f,c,y,w,T,D)),!this[a].apply(this,u)}}function Vr(n,i){const{name:t,type:e,direction:r}=i,a=t.slice(0,-1)+"Entries";n.prototype[a]=function(o,s){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return Le();if(!arguments.length)return Ur(this,e);if(arguments.length===1){o=""+o;const u=this._nodes.get(o);if(!u)throw new C(`Graph.${a}: could not find the "${o}" node in the graph.`);return $r(e,r,u)}if(arguments.length===2){o=""+o,s=""+s;const u=this._nodes.get(o);if(!u)throw new C(`Graph.${a}: could not find the "${o}" source node in the graph.`);if(!this._nodes.has(s))throw new C(`Graph.${a}: could not find the "${s}" target node in the graph.`);return Mr(e,r,u,s)}throw new k(`Graph.${a}: too many arguments (expecting 0, 1 or 2 and got ${arguments.length}).`)}}function qr(n){Gr.forEach(i=>{Hr(n,i),Wr(n,i),jr(n,i),Vr(n,i)})}const Kr=[{name:"neighbors",type:"mixed"},{name:"inNeighbors",type:"directed",direction:"in"},{name:"outNeighbors",type:"directed",direction:"out"},{name:"inboundNeighbors",type:"mixed",direction:"in"},{name:"outboundNeighbors",type:"mixed",direction:"out"},{name:"directedNeighbors",type:"directed"},{name:"undirectedNeighbors",type:"undirected"}];function ut(){this.A=null,this.B=null}ut.prototype.wrap=function(n){this.A===null?this.A=n:this.B===null&&(this.B=n)};ut.prototype.has=function(n){return this.A!==null&&n in this.A||this.B!==null&&n in this.B};function Oe(n,i,t,e,r){for(const a in e){const o=e[a],s=o.source,u=o.target,h=s===t?u:s;if(i&&i.has(h.key))continue;const d=r(h.key,h.attributes);if(n&&d)return h.key}}function Nt(n,i,t,e,r){if(i!=="mixed"){if(i==="undirected")return Oe(n,null,e,e.undirected,r);if(typeof t=="string")return Oe(n,null,e,e[t],r)}const a=new ut;let o;if(i!=="undirected"){if(t!=="out"){if(o=Oe(n,null,e,e.in,r),n&&o)return o;a.wrap(e.in)}if(t!=="in"){if(o=Oe(n,a,e,e.out,r),n&&o)return o;a.wrap(e.out)}}if(i!=="directed"&&(o=Oe(n,a,e,e.undirected,r),n&&o))return o}function Yr(n,i,t){if(n!=="mixed"){if(n==="undirected")return Object.keys(t.undirected);if(typeof i=="string")return Object.keys(t[i])}const e=[];return Nt(!1,n,i,t,function(r){e.push(r)}),e}function Ue(n,i,t){const e=Object.keys(t),r=e.length;let a=0;return{[Symbol.iterator](){return this},next(){let o=null;do{if(a>=r)return n&&n.wrap(t),{done:!0};const s=t[e[a++]],u=s.source,h=s.target;if(o=u===i?h:u,n&&n.has(o.key)){o=null;continue}}while(o===null);return{done:!1,value:{neighbor:o.key,attributes:o.attributes}}}}}function Zr(n,i,t){if(n!=="mixed"){if(n==="undirected")return Ue(null,t,t.undirected);if(typeof i=="string")return Ue(null,t,t[i])}let e=Le();const r=new ut;return n!=="undirected"&&(i!=="out"&&(e=me(e,Ue(r,t,t.in))),i!=="in"&&(e=me(e,Ue(r,t,t.out)))),n!=="directed"&&(e=me(e,Ue(r,t,t.undirected))),e}function Xr(n,i){const{name:t,type:e,direction:r}=i;n.prototype[t]=function(a){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return[];a=""+a;const o=this._nodes.get(a);if(typeof o>"u")throw new C(`Graph.${t}: could not find the "${a}" node in the graph.`);return Yr(e==="mixed"?this.type:e,r,o)}}function Jr(n,i){const{name:t,type:e,direction:r}=i,a="forEach"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[a]=function(h,d){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return;h=""+h;const l=this._nodes.get(h);if(typeof l>"u")throw new C(`Graph.${a}: could not find the "${h}" node in the graph.`);Nt(!1,e==="mixed"?this.type:e,r,l,d)};const o="map"+t[0].toUpperCase()+t.slice(1);n.prototype[o]=function(h,d){const l=[];return this[a](h,(f,c)=>{l.push(d(f,c))}),l};const s="filter"+t[0].toUpperCase()+t.slice(1);n.prototype[s]=function(h,d){const l=[];return this[a](h,(f,c)=>{d(f,c)&&l.push(f)}),l};const u="reduce"+t[0].toUpperCase()+t.slice(1);n.prototype[u]=function(h,d,l){if(arguments.length<3)throw new k(`Graph.${u}: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.`);let f=l;return this[a](h,(c,y)=>{f=d(f,c,y)}),f}}function Qr(n,i){const{name:t,type:e,direction:r}=i,a=t[0].toUpperCase()+t.slice(1,-1),o="find"+a;n.prototype[o]=function(h,d){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return;h=""+h;const l=this._nodes.get(h);if(typeof l>"u")throw new C(`Graph.${o}: could not find the "${h}" node in the graph.`);return Nt(!0,e==="mixed"?this.type:e,r,l,d)};const s="some"+a;n.prototype[s]=function(h,d){return!!this[o](h,d)};const u="every"+a;n.prototype[u]=function(h,d){return!this[o](h,(f,c)=>!d(f,c))}}function en(n,i){const{name:t,type:e,direction:r}=i,a=t.slice(0,-1)+"Entries";n.prototype[a]=function(o){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return Le();o=""+o;const s=this._nodes.get(o);if(typeof s>"u")throw new C(`Graph.${a}: could not find the "${o}" node in the graph.`);return Zr(e==="mixed"?this.type:e,r,s)}}function tn(n){Kr.forEach(i=>{Xr(n,i),Jr(n,i),Qr(n,i),en(n,i)})}function tt(n,i,t,e,r){const a=e._nodes.values(),o=e.type;let s,u,h,d,l,f;for(;s=a.next(),s.done!==!0;){let c=!1;if(u=s.value,o!=="undirected"){d=u.out;for(h in d){l=d[h];do f=l.target,c=!0,r(u.key,f.key,u.attributes,f.attributes,l.key,l.attributes,l.undirected),l=l.next;while(l)}}if(o!=="directed"){d=u.undirected;for(h in d)if(!(i&&u.key>h)){l=d[h];do f=l.target,f.key!==h&&(f=l.source),c=!0,r(u.key,f.key,u.attributes,f.attributes,l.key,l.attributes,l.undirected),l=l.next;while(l)}}t&&!c&&r(u.key,null,u.attributes,null,null,null,null)}}function rn(n,i){const t={key:n};return Ei(i.attributes)||(t.attributes=Z({},i.attributes)),t}function nn(n,i,t){const e={key:i,source:t.source.key,target:t.target.key};return Ei(t.attributes)||(e.attributes=Z({},t.attributes)),n==="mixed"&&t.undirected&&(e.undirected=!0),e}function an(n){if(!J(n))throw new k('Graph.import: invalid serialized node. A serialized node should be a plain object with at least a "key" property.');if(!("key"in n))throw new k("Graph.import: serialized node is missing its key.");if("attributes"in n&&(!J(n.attributes)||n.attributes===null))throw new k("Graph.import: invalid attributes. Attributes should be a plain object, null or omitted.")}function on(n){if(!J(n))throw new k('Graph.import: invalid serialized edge. A serialized edge should be a plain object with at least a "source" & "target" property.');if(!("source"in n))throw new k("Graph.import: serialized edge is missing its source.");if(!("target"in n))throw new k("Graph.import: serialized edge is missing its target.");if("attributes"in n&&(!J(n.attributes)||n.attributes===null))throw new k("Graph.import: invalid attributes. Attributes should be a plain object, null or omitted.");if("undirected"in n&&typeof n.undirected!="boolean")throw new k("Graph.import: invalid undirectedness information. Undirected should be boolean or omitted.")}const sn=ur(),un=new Set(["directed","undirected","mixed"]),Bt=new Set(["domain","_events","_eventsCount","_maxListeners"]),hn=[{name:n=>`${n}Edge`,generateKey:!0},{name:n=>`${n}DirectedEdge`,generateKey:!0,type:"directed"},{name:n=>`${n}UndirectedEdge`,generateKey:!0,type:"undirected"},{name:n=>`${n}EdgeWithKey`},{name:n=>`${n}DirectedEdgeWithKey`,type:"directed"},{name:n=>`${n}UndirectedEdgeWithKey`,type:"undirected"}],dn={allowSelfLoops:!0,multi:!1,type:"mixed"};function ln(n,i,t){if(t&&!J(t))throw new k(`Graph.addNode: invalid attributes. Expecting an object but got "${t}"`);if(i=""+i,t=t||{},n._nodes.has(i))throw new I(`Graph.addNode: the "${i}" node already exist in the graph.`);const e=new n.NodeDataClass(i,t);return n._nodes.set(i,e),n.emit("nodeAdded",{key:i,attributes:t}),e}function Mt(n,i,t){const e=new n.NodeDataClass(i,t);return n._nodes.set(i,e),n.emit("nodeAdded",{key:i,attributes:t}),e}function ki(n,i,t,e,r,a,o,s){if(!e&&n.type==="undirected")throw new I(`Graph.${i}: you cannot add a directed edge to an undirected graph. Use the #.addEdge or #.addUndirectedEdge instead.`);if(e&&n.type==="directed")throw new I(`Graph.${i}: you cannot add an undirected edge to a directed graph. Use the #.addEdge or #.addDirectedEdge instead.`);if(s&&!J(s))throw new k(`Graph.${i}: invalid attributes. Expecting an object but got "${s}"`);if(a=""+a,o=""+o,s=s||{},!n.allowSelfLoops&&a===o)throw new I(`Graph.${i}: source & target are the same ("${a}"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.`);const u=n._nodes.get(a),h=n._nodes.get(o);if(!u)throw new C(`Graph.${i}: source node "${a}" not found.`);if(!h)throw new C(`Graph.${i}: target node "${o}" not found.`);const d={key:null,undirected:e,source:a,target:o,attributes:s};if(t)r=n._edgeKeyGenerator();else if(r=""+r,n._edges.has(r))throw new I(`Graph.${i}: the "${r}" edge already exists in the graph.`);if(!n.multi&&(e?typeof u.undirected[o]<"u":typeof u.out[o]<"u"))throw new I(`Graph.${i}: an edge linking "${a}" to "${o}" already exists. If you really want to add multiple edges linking those nodes, you should create a multi graph by using the 'multi' option.`);const l=new Ge(e,r,u,h,s);n._edges.set(r,l);const f=a===o;return e?(u.undirectedDegree++,h.undirectedDegree++,f&&(u.undirectedLoops++,n._undirectedSelfLoopCount++)):(u.outDegree++,h.inDegree++,f&&(u.directedLoops++,n._directedSelfLoopCount++)),n.multi?l.attachMulti():l.attach(),e?n._undirectedSize++:n._directedSize++,d.key=r,n.emit("edgeAdded",d),r}function cn(n,i,t,e,r,a,o,s,u){if(!e&&n.type==="undirected")throw new I(`Graph.${i}: you cannot merge/update a directed edge to an undirected graph. Use the #.mergeEdge/#.updateEdge or #.addUndirectedEdge instead.`);if(e&&n.type==="directed")throw new I(`Graph.${i}: you cannot merge/update an undirected edge to a directed graph. Use the #.mergeEdge/#.updateEdge or #.addDirectedEdge instead.`);if(s){if(u){if(typeof s!="function")throw new k(`Graph.${i}: invalid updater function. Expecting a function but got "${s}"`)}else if(!J(s))throw new k(`Graph.${i}: invalid attributes. Expecting an object but got "${s}"`)}a=""+a,o=""+o;let h;if(u&&(h=s,s=void 0),!n.allowSelfLoops&&a===o)throw new I(`Graph.${i}: source & target are the same ("${a}"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.`);let d=n._nodes.get(a),l=n._nodes.get(o),f,c;if(!t&&(f=n._edges.get(r),f)){if((f.source.key!==a||f.target.key!==o)&&(!e||f.source.key!==o||f.target.key!==a))throw new I(`Graph.${i}: inconsistency detected when attempting to merge the "${r}" edge with "${a}" source & "${o}" target vs. ("${f.source.key}", "${f.target.key}").`);c=f}if(!c&&!n.multi&&d&&(c=e?d.undirected[o]:d.out[o]),c){const m=[c.key,!1,!1,!1];if(u?!h:!s)return m;if(u){const S=c.attributes;c.attributes=h(S),n.emit("edgeAttributesUpdated",{type:"replace",key:c.key,attributes:c.attributes})}else Z(c.attributes,s),n.emit("edgeAttributesUpdated",{type:"merge",key:c.key,attributes:c.attributes,data:s});return m}s=s||{},u&&h&&(s=h(s));const y={key:null,undirected:e,source:a,target:o,attributes:s};if(t)r=n._edgeKeyGenerator();else if(r=""+r,n._edges.has(r))throw new I(`Graph.${i}: the "${r}" edge already exists in the graph.`);let w=!1,T=!1;d||(d=Mt(n,a,{}),w=!0,a===o&&(l=d,T=!0)),l||(l=Mt(n,o,{}),T=!0),f=new Ge(e,r,d,l,s),n._edges.set(r,f);const D=a===o;return e?(d.undirectedDegree++,l.undirectedDegree++,D&&(d.undirectedLoops++,n._undirectedSelfLoopCount++)):(d.outDegree++,l.inDegree++,D&&(d.directedLoops++,n._directedSelfLoopCount++)),n.multi?f.attachMulti():f.attach(),e?n._undirectedSize++:n._directedSize++,y.key=r,n.emit("edgeAdded",y),[r,!0,w,T]}function xe(n,i){n._edges.delete(i.key);const{source:t,target:e,attributes:r}=i,a=i.undirected,o=t===e;a?(t.undirectedDegree--,e.undirectedDegree--,o&&(t.undirectedLoops--,n._undirectedSelfLoopCount--)):(t.outDegree--,e.inDegree--,o&&(t.directedLoops--,n._directedSelfLoopCount--)),n.multi?i.detachMulti():i.detach(),a?n._undirectedSize--:n._directedSize--,n.emit("edgeDropped",{key:i.key,attributes:r,source:t.key,target:e.key,undirected:a})}class j extends wi.EventEmitter{constructor(i){if(super(),i=Z({},dn,i),typeof i.multi!="boolean")throw new k(`Graph.constructor: invalid 'multi' option. Expecting a boolean but got "${i.multi}".`);if(!un.has(i.type))throw new k(`Graph.constructor: invalid 'type' option. Should be one of "mixed", "directed" or "undirected" but got "${i.type}".`);if(typeof i.allowSelfLoops!="boolean")throw new k(`Graph.constructor: invalid 'allowSelfLoops' option. Expecting a boolean but got "${i.allowSelfLoops}".`);const t=i.type==="mixed"?_i:i.type==="directed"?Ti:Si;ae(this,"NodeDataClass",t);const e="geid_"+sn()+"_";let r=0;const a=()=>{let o;do o=e+r++;while(this._edges.has(o));return o};ae(this,"_attributes",{}),ae(this,"_nodes",new Map),ae(this,"_edges",new Map),ae(this,"_directedSize",0),ae(this,"_undirectedSize",0),ae(this,"_directedSelfLoopCount",0),ae(this,"_undirectedSelfLoopCount",0),ae(this,"_edgeKeyGenerator",a),ae(this,"_options",i),Bt.forEach(o=>ae(this,o,this[o])),he(this,"order",()=>this._nodes.size),he(this,"size",()=>this._edges.size),he(this,"directedSize",()=>this._directedSize),he(this,"undirectedSize",()=>this._undirectedSize),he(this,"selfLoopCount",()=>this._directedSelfLoopCount+this._undirectedSelfLoopCount),he(this,"directedSelfLoopCount",()=>this._directedSelfLoopCount),he(this,"undirectedSelfLoopCount",()=>this._undirectedSelfLoopCount),he(this,"multi",this._options.multi),he(this,"type",this._options.type),he(this,"allowSelfLoops",this._options.allowSelfLoops),he(this,"implementation",()=>"graphology")}_resetInstanceCounters(){this._directedSize=0,this._undirectedSize=0,this._directedSelfLoopCount=0,this._undirectedSelfLoopCount=0}hasNode(i){return this._nodes.has(""+i)}hasDirectedEdge(i,t){if(this.type==="undirected")return!1;if(arguments.length===1){const e=""+i,r=this._edges.get(e);return!!r&&!r.undirected}else if(arguments.length===2){i=""+i,t=""+t;const e=this._nodes.get(i);return e?e.out.hasOwnProperty(t):!1}throw new k(`Graph.hasDirectedEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`)}hasUndirectedEdge(i,t){if(this.type==="directed")return!1;if(arguments.length===1){const e=""+i,r=this._edges.get(e);return!!r&&r.undirected}else if(arguments.length===2){i=""+i,t=""+t;const e=this._nodes.get(i);return e?e.undirected.hasOwnProperty(t):!1}throw new k(`Graph.hasDirectedEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`)}hasEdge(i,t){if(arguments.length===1){const e=""+i;return this._edges.has(e)}else if(arguments.length===2){i=""+i,t=""+t;const e=this._nodes.get(i);return e?typeof e.out<"u"&&e.out.hasOwnProperty(t)||typeof e.undirected<"u"&&e.undirected.hasOwnProperty(t):!1}throw new k(`Graph.hasEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`)}directedEdge(i,t){if(this.type==="undirected")return;if(i=""+i,t=""+t,this.multi)throw new I("Graph.directedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.directedEdges instead.");const e=this._nodes.get(i);if(!e)throw new C(`Graph.directedEdge: could not find the "${i}" source node in the graph.`);if(!this._nodes.has(t))throw new C(`Graph.directedEdge: could not find the "${t}" target node in the graph.`);const r=e.out&&e.out[t]||void 0;if(r)return r.key}undirectedEdge(i,t){if(this.type==="directed")return;if(i=""+i,t=""+t,this.multi)throw new I("Graph.undirectedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.undirectedEdges instead.");const e=this._nodes.get(i);if(!e)throw new C(`Graph.undirectedEdge: could not find the "${i}" source node in the graph.`);if(!this._nodes.has(t))throw new C(`Graph.undirectedEdge: could not find the "${t}" target node in the graph.`);const r=e.undirected&&e.undirected[t]||void 0;if(r)return r.key}edge(i,t){if(this.multi)throw new I("Graph.edge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.edges instead.");i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.edge: could not find the "${i}" source node in the graph.`);if(!this._nodes.has(t))throw new C(`Graph.edge: could not find the "${t}" target node in the graph.`);const r=e.out&&e.out[t]||e.undirected&&e.undirected[t]||void 0;if(r)return r.key}areDirectedNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areDirectedNeighbors: could not find the "${i}" node in the graph.`);return this.type==="undirected"?!1:t in e.in||t in e.out}areOutNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areOutNeighbors: could not find the "${i}" node in the graph.`);return this.type==="undirected"?!1:t in e.out}areInNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areInNeighbors: could not find the "${i}" node in the graph.`);return this.type==="undirected"?!1:t in e.in}areUndirectedNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areUndirectedNeighbors: could not find the "${i}" node in the graph.`);return this.type==="directed"?!1:t in e.undirected}areNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areNeighbors: could not find the "${i}" node in the graph.`);return this.type!=="undirected"&&(t in e.in||t in e.out)||this.type!=="directed"&&t in e.undirected}areInboundNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areInboundNeighbors: could not find the "${i}" node in the graph.`);return this.type!=="undirected"&&t in e.in||this.type!=="directed"&&t in e.undirected}areOutboundNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areOutboundNeighbors: could not find the "${i}" node in the graph.`);return this.type!=="undirected"&&t in e.out||this.type!=="directed"&&t in e.undirected}inDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.inDegree: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree}outDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.outDegree: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.outDegree}directedDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.directedDegree: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree+t.outDegree}undirectedDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.undirectedDegree: could not find the "${i}" node in the graph.`);return this.type==="directed"?0:t.undirectedDegree}inboundDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.inboundDegree: could not find the "${i}" node in the graph.`);let e=0;return this.type!=="directed"&&(e+=t.undirectedDegree),this.type!=="undirected"&&(e+=t.inDegree),e}outboundDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.outboundDegree: could not find the "${i}" node in the graph.`);let e=0;return this.type!=="directed"&&(e+=t.undirectedDegree),this.type!=="undirected"&&(e+=t.outDegree),e}degree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.degree: could not find the "${i}" node in the graph.`);let e=0;return this.type!=="directed"&&(e+=t.undirectedDegree),this.type!=="undirected"&&(e+=t.inDegree+t.outDegree),e}inDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.inDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree-t.directedLoops}outDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.outDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.outDegree-t.directedLoops}directedDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.directedDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree+t.outDegree-t.directedLoops*2}undirectedDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.undirectedDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="directed"?0:t.undirectedDegree-t.undirectedLoops*2}inboundDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.inboundDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);let e=0,r=0;return this.type!=="directed"&&(e+=t.undirectedDegree,r+=t.undirectedLoops*2),this.type!=="undirected"&&(e+=t.inDegree,r+=t.directedLoops),e-r}outboundDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.outboundDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);let e=0,r=0;return this.type!=="directed"&&(e+=t.undirectedDegree,r+=t.undirectedLoops*2),this.type!=="undirected"&&(e+=t.outDegree,r+=t.directedLoops),e-r}degreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.degreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);let e=0,r=0;return this.type!=="directed"&&(e+=t.undirectedDegree,r+=t.undirectedLoops*2),this.type!=="undirected"&&(e+=t.inDegree+t.outDegree,r+=t.directedLoops*2),e-r}source(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.source: could not find the "${i}" edge in the graph.`);return t.source.key}target(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.target: could not find the "${i}" edge in the graph.`);return t.target.key}extremities(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.extremities: could not find the "${i}" edge in the graph.`);return[t.source.key,t.target.key]}opposite(i,t){i=""+i,t=""+t;const e=this._edges.get(t);if(!e)throw new C(`Graph.opposite: could not find the "${t}" edge in the graph.`);const r=e.source.key,a=e.target.key;if(i===r)return a;if(i===a)return r;throw new C(`Graph.opposite: the "${i}" node is not attached to the "${t}" edge (${r}, ${a}).`)}hasExtremity(i,t){i=""+i,t=""+t;const e=this._edges.get(i);if(!e)throw new C(`Graph.hasExtremity: could not find the "${i}" edge in the graph.`);return e.source.key===t||e.target.key===t}isUndirected(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.isUndirected: could not find the "${i}" edge in the graph.`);return t.undirected}isDirected(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.isDirected: could not find the "${i}" edge in the graph.`);return!t.undirected}isSelfLoop(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.isSelfLoop: could not find the "${i}" edge in the graph.`);return t.source===t.target}addNode(i,t){return ln(this,i,t).key}mergeNode(i,t){if(t&&!J(t))throw new k(`Graph.mergeNode: invalid attributes. Expecting an object but got "${t}"`);i=""+i,t=t||{};let e=this._nodes.get(i);return e?(t&&(Z(e.attributes,t),this.emit("nodeAttributesUpdated",{type:"merge",key:i,attributes:e.attributes,data:t})),[i,!1]):(e=new this.NodeDataClass(i,t),this._nodes.set(i,e),this.emit("nodeAdded",{key:i,attributes:t}),[i,!0])}updateNode(i,t){if(t&&typeof t!="function")throw new k(`Graph.updateNode: invalid updater function. Expecting a function but got "${t}"`);i=""+i;let e=this._nodes.get(i);if(e){if(t){const a=e.attributes;e.attributes=t(a),this.emit("nodeAttributesUpdated",{type:"replace",key:i,attributes:e.attributes})}return[i,!1]}const r=t?t({}):{};return e=new this.NodeDataClass(i,r),this._nodes.set(i,e),this.emit("nodeAdded",{key:i,attributes:r}),[i,!0]}dropNode(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.dropNode: could not find the "${i}" node in the graph.`);let e;if(this.type!=="undirected"){for(const r in t.out){e=t.out[r];do xe(this,e),e=e.next;while(e)}for(const r in t.in){e=t.in[r];do xe(this,e),e=e.next;while(e)}}if(this.type!=="directed")for(const r in t.undirected){e=t.undirected[r];do xe(this,e),e=e.next;while(e)}this._nodes.delete(i),this.emit("nodeDropped",{key:i,attributes:t.attributes})}dropEdge(i){let t;if(arguments.length>1){const e=""+arguments[0],r=""+arguments[1];if(t=oe(this,e,r,this.type),!t)throw new C(`Graph.dropEdge: could not find the "${e}" -> "${r}" edge in the graph.`)}else if(i=""+i,t=this._edges.get(i),!t)throw new C(`Graph.dropEdge: could not find the "${i}" edge in the graph.`);return xe(this,t),this}dropDirectedEdge(i,t){if(arguments.length<2)throw new I("Graph.dropDirectedEdge: it does not make sense to try and drop a directed edge by key. What if the edge with this key is undirected? Use #.dropEdge for this purpose instead.");if(this.multi)throw new I("Graph.dropDirectedEdge: cannot use a {source,target} combo when dropping an edge in a MultiGraph since we cannot infer the one you want to delete as there could be multiple ones.");i=""+i,t=""+t;const e=oe(this,i,t,"directed");if(!e)throw new C(`Graph.dropDirectedEdge: could not find a "${i}" -> "${t}" edge in the graph.`);return xe(this,e),this}dropUndirectedEdge(i,t){if(arguments.length<2)throw new I("Graph.dropUndirectedEdge: it does not make sense to drop a directed edge by key. What if the edge with this key is undirected? Use #.dropEdge for this purpose instead.");if(this.multi)throw new I("Graph.dropUndirectedEdge: cannot use a {source,target} combo when dropping an edge in a MultiGraph since we cannot infer the one you want to delete as there could be multiple ones.");const e=oe(this,i,t,"undirected");if(!e)throw new C(`Graph.dropUndirectedEdge: could not find a "${i}" -> "${t}" edge in the graph.`);return xe(this,e),this}clear(){this._edges.clear(),this._nodes.clear(),this._resetInstanceCounters(),this.emit("cleared")}clearEdges(){const i=this._nodes.values();let t;for(;t=i.next(),t.done!==!0;)t.value.clear();this._edges.clear(),this._resetInstanceCounters(),this.emit("edgesCleared")}getAttribute(i){return this._attributes[i]}getAttributes(){return this._attributes}hasAttribute(i){return this._attributes.hasOwnProperty(i)}setAttribute(i,t){return this._attributes[i]=t,this.emit("attributesUpdated",{type:"set",attributes:this._attributes,name:i}),this}updateAttribute(i,t){if(typeof t!="function")throw new k("Graph.updateAttribute: updater should be a function.");const e=this._attributes[i];return this._attributes[i]=t(e),this.emit("attributesUpdated",{type:"set",attributes:this._attributes,name:i}),this}removeAttribute(i){return delete this._attributes[i],this.emit("attributesUpdated",{type:"remove",attributes:this._attributes,name:i}),this}replaceAttributes(i){if(!J(i))throw new k("Graph.replaceAttributes: provided attributes are not a plain object.");return this._attributes=i,this.emit("attributesUpdated",{type:"replace",attributes:this._attributes}),this}mergeAttributes(i){if(!J(i))throw new k("Graph.mergeAttributes: provided attributes are not a plain object.");return Z(this._attributes,i),this.emit("attributesUpdated",{type:"merge",attributes:this._attributes,data:i}),this}updateAttributes(i){if(typeof i!="function")throw new k("Graph.updateAttributes: provided updater is not a function.");return this._attributes=i(this._attributes),this.emit("attributesUpdated",{type:"update",attributes:this._attributes}),this}updateEachNodeAttributes(i,t){if(typeof i!="function")throw new k("Graph.updateEachNodeAttributes: expecting an updater function.");if(t&&!$t(t))throw new k("Graph.updateEachNodeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}");const e=this._nodes.values();let r,a;for(;r=e.next(),r.done!==!0;)a=r.value,a.attributes=i(a.key,a.attributes);this.emit("eachNodeAttributesUpdated",{hints:t||null})}updateEachEdgeAttributes(i,t){if(typeof i!="function")throw new k("Graph.updateEachEdgeAttributes: expecting an updater function.");if(t&&!$t(t))throw new k("Graph.updateEachEdgeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}");const e=this._edges.values();let r,a,o,s;for(;r=e.next(),r.done!==!0;)a=r.value,o=a.source,s=a.target,a.attributes=i(a.key,a.attributes,o.key,s.key,o.attributes,s.attributes,a.undirected);this.emit("eachEdgeAttributesUpdated",{hints:t||null})}forEachAdjacencyEntry(i){if(typeof i!="function")throw new k("Graph.forEachAdjacencyEntry: expecting a callback.");tt(!1,!1,!1,this,i)}forEachAdjacencyEntryWithOrphans(i){if(typeof i!="function")throw new k("Graph.forEachAdjacencyEntryWithOrphans: expecting a callback.");tt(!1,!1,!0,this,i)}forEachAssymetricAdjacencyEntry(i){if(typeof i!="function")throw new k("Graph.forEachAssymetricAdjacencyEntry: expecting a callback.");tt(!1,!0,!1,this,i)}forEachAssymetricAdjacencyEntryWithOrphans(i){if(typeof i!="function")throw new k("Graph.forEachAssymetricAdjacencyEntryWithOrphans: expecting a callback.");tt(!1,!0,!0,this,i)}nodes(){return Array.from(this._nodes.keys())}forEachNode(i){if(typeof i!="function")throw new k("Graph.forEachNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)r=e.value,i(r.key,r.attributes)}findNode(i){if(typeof i!="function")throw new k("Graph.findNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)if(r=e.value,i(r.key,r.attributes))return r.key}mapNodes(i){if(typeof i!="function")throw new k("Graph.mapNode: expecting a callback.");const t=this._nodes.values();let e,r;const a=new Array(this.order);let o=0;for(;e=t.next(),e.done!==!0;)r=e.value,a[o++]=i(r.key,r.attributes);return a}someNode(i){if(typeof i!="function")throw new k("Graph.someNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)if(r=e.value,i(r.key,r.attributes))return!0;return!1}everyNode(i){if(typeof i!="function")throw new k("Graph.everyNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)if(r=e.value,!i(r.key,r.attributes))return!1;return!0}filterNodes(i){if(typeof i!="function")throw new k("Graph.filterNodes: expecting a callback.");const t=this._nodes.values();let e,r;const a=[];for(;e=t.next(),e.done!==!0;)r=e.value,i(r.key,r.attributes)&&a.push(r.key);return a}reduceNodes(i,t){if(typeof i!="function")throw new k("Graph.reduceNodes: expecting a callback.");if(arguments.length<2)throw new k("Graph.reduceNodes: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.");let e=t;const r=this._nodes.values();let a,o;for(;a=r.next(),a.done!==!0;)o=a.value,e=i(e,o.key,o.attributes);return e}nodeEntries(){const i=this._nodes.values();return{[Symbol.iterator](){return this},next(){const t=i.next();if(t.done)return t;const e=t.value;return{value:{node:e.key,attributes:e.attributes},done:!1}}}}export(){const i=new Array(this._nodes.size);let t=0;this._nodes.forEach((r,a)=>{i[t++]=rn(a,r)});const e=new Array(this._edges.size);return t=0,this._edges.forEach((r,a)=>{e[t++]=nn(this.type,a,r)}),{options:{type:this.type,multi:this.multi,allowSelfLoops:this.allowSelfLoops},attributes:this.getAttributes(),nodes:i,edges:e}}import(i,t=!1){if(i instanceof j)return i.forEachNode((u,h)=>{t?this.mergeNode(u,h):this.addNode(u,h)}),i.forEachEdge((u,h,d,l,f,c,y)=>{t?y?this.mergeUndirectedEdgeWithKey(u,d,l,h):this.mergeDirectedEdgeWithKey(u,d,l,h):y?this.addUndirectedEdgeWithKey(u,d,l,h):this.addDirectedEdgeWithKey(u,d,l,h)}),this;if(!J(i))throw new k("Graph.import: invalid argument. Expecting a serialized graph or, alternatively, a Graph instance.");if(i.attributes){if(!J(i.attributes))throw new k("Graph.import: invalid attributes. Expecting a plain object.");t?this.mergeAttributes(i.attributes):this.replaceAttributes(i.attributes)}let e,r,a,o,s;if(i.nodes){if(a=i.nodes,!Array.isArray(a))throw new k("Graph.import: invalid nodes. Expecting an array.");for(e=0,r=a.length;e{const a=Z({},e.attributes);e=new t.NodeDataClass(r,a),t._nodes.set(r,e)}),t}copy(i){if(i=i||{},typeof i.type=="string"&&i.type!==this.type&&i.type!=="mixed")throw new I(`Graph.copy: cannot create an incompatible copy from "${this.type}" type to "${i.type}" because this would mean losing information about the current graph.`);if(typeof i.multi=="boolean"&&i.multi!==this.multi&&i.multi!==!0)throw new I("Graph.copy: cannot create an incompatible copy by downgrading a multi graph to a simple one because this would mean losing information about the current graph.");if(typeof i.allowSelfLoops=="boolean"&&i.allowSelfLoops!==this.allowSelfLoops&&i.allowSelfLoops!==!0)throw new I("Graph.copy: cannot create an incompatible copy from a graph allowing self loops to one that does not because this would mean losing information about the current graph.");const t=this.emptyCopy(i),e=this._edges.values();let r,a;for(;r=e.next(),r.done!==!0;)a=r.value,ki(t,"copy",!1,a.undirected,a.key,a.source.key,a.target.key,Z({},a.attributes));return t}toJSON(){return this.export()}toString(){return"[object Graph]"}inspect(){const i={};this._nodes.forEach((a,o)=>{i[o]=a.attributes});const t={},e={};this._edges.forEach((a,o)=>{const s=a.undirected?"--":"->";let u="",h=a.source.key,d=a.target.key,l;a.undirected&&h>d&&(l=h,h=d,d=l);const f=`(${h})${s}(${d})`;o.startsWith("geid_")?this.multi&&(typeof e[f]>"u"?e[f]=0:e[f]++,u+=`${e[f]}. `):u+=`[${o}]: `,u+=f,t[u]=a.attributes});const r={};for(const a in this)this.hasOwnProperty(a)&&!Bt.has(a)&&typeof this[a]!="function"&&typeof a!="symbol"&&(r[a]=this[a]);return r.attributes=this._attributes,r.nodes=i,r.edges=t,ae(r,"constructor",this.constructor),r}}typeof Symbol<"u"&&(j.prototype[Symbol.for("nodejs.util.inspect.custom")]=j.prototype.inspect);hn.forEach(n=>{["add","merge","update"].forEach(i=>{const t=n.name(i),e=i==="add"?ki:cn;n.generateKey?j.prototype[t]=function(r,a,o){return e(this,t,!0,(n.type||this.type)==="undirected",null,r,a,o,i==="update")}:j.prototype[t]=function(r,a,o,s){return e(this,t,!1,(n.type||this.type)==="undirected",r,a,o,s,i==="update")}})});wr(j);Lr(j);qr(j);tn(j);class Di extends j{constructor(i){const t=Z({type:"directed"},i);if("multi"in t&&t.multi!==!1)throw new k("DirectedGraph.from: inconsistent indication that the graph should be multi in given options!");if(t.type!=="directed")throw new k('DirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}class Li extends j{constructor(i){const t=Z({type:"undirected"},i);if("multi"in t&&t.multi!==!1)throw new k("UndirectedGraph.from: inconsistent indication that the graph should be multi in given options!");if(t.type!=="undirected")throw new k('UndirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}class Gi extends j{constructor(i){const t=Z({multi:!0},i);if("multi"in t&&t.multi!==!0)throw new k("MultiGraph.from: inconsistent indication that the graph should be simple in given options!");super(t)}}class Fi extends j{constructor(i){const t=Z({type:"directed",multi:!0},i);if("multi"in t&&t.multi!==!0)throw new k("MultiDirectedGraph.from: inconsistent indication that the graph should be simple in given options!");if(t.type!=="directed")throw new k('MultiDirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}class Ni extends j{constructor(i){const t=Z({type:"undirected",multi:!0},i);if("multi"in t&&t.multi!==!0)throw new k("MultiUndirectedGraph.from: inconsistent indication that the graph should be simple in given options!");if(t.type!=="undirected")throw new k('MultiUndirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}function Fe(n){n.from=function(i,t){const e=Z({},i.options,t),r=new n(e);return r.import(i),r}}Fe(j);Fe(Di);Fe(Li);Fe(Gi);Fe(Fi);Fe(Ni);j.Graph=j;j.DirectedGraph=Di;j.UndirectedGraph=Li;j.MultiGraph=Gi;j.MultiDirectedGraph=Fi;j.MultiUndirectedGraph=Ni;j.InvalidArgumentsGraphError=k;j.NotFoundGraphError=C;j.UsageGraphError=I;var ft,Ht;function Pi(){return Ht||(Ht=1,ft=function(i){return i!==null&&typeof i=="object"&&typeof i.addUndirectedEdgeWithKey=="function"&&typeof i.dropNode=="function"&&typeof i.multi=="boolean"}),ft}var ze={},Wt;function fn(){if(Wt)return ze;Wt=1;function n(e){return typeof e!="number"||isNaN(e)?1:e}function i(e,r){var a={},o=function(h){return typeof h>"u"?r:h};typeof r=="function"&&(o=r);var s=function(h){return o(h[e])},u=function(){return o(void 0)};return typeof e=="string"?(a.fromAttributes=s,a.fromGraph=function(h,d){return s(h.getNodeAttributes(d))},a.fromEntry=function(h,d){return s(d)}):typeof e=="function"?(a.fromAttributes=function(){throw new Error("graphology-utils/getters/createNodeValueGetter: irrelevant usage.")},a.fromGraph=function(h,d){return o(e(d,h.getNodeAttributes(d)))},a.fromEntry=function(h,d){return o(e(h,d))}):(a.fromAttributes=u,a.fromGraph=u,a.fromEntry=u),a}function t(e,r){var a={},o=function(h){return typeof h>"u"?r:h};typeof r=="function"&&(o=r);var s=function(h){return o(h[e])},u=function(){return o(void 0)};return typeof e=="string"?(a.fromAttributes=s,a.fromGraph=function(h,d){return s(h.getEdgeAttributes(d))},a.fromEntry=function(h,d){return s(d)},a.fromPartialEntry=a.fromEntry,a.fromMinimalEntry=a.fromEntry):typeof e=="function"?(a.fromAttributes=function(){throw new Error("graphology-utils/getters/createEdgeValueGetter: irrelevant usage.")},a.fromGraph=function(h,d){var l=h.extremities(d);return o(e(d,h.getEdgeAttributes(d),l[0],l[1],h.getNodeAttributes(l[0]),h.getNodeAttributes(l[1]),h.isUndirected(d)))},a.fromEntry=function(h,d,l,f,c,y,w){return o(e(h,d,l,f,c,y,w))},a.fromPartialEntry=function(h,d,l,f){return o(e(h,d,l,f))},a.fromMinimalEntry=function(h,d){return o(e(h,d))}):(a.fromAttributes=u,a.fromGraph=u,a.fromEntry=u,a.fromMinimalEntry=u),a}return ze.createNodeValueGetter=i,ze.createEdgeValueGetter=t,ze.createEdgeWeightGetter=function(e){return t(e,n)},ze}var gt,jt;function gn(){if(jt)return gt;jt=1;var n=0,i=1,t=2,e=3,r=4,a=5,o=6,s=7,u=8,h=9,d=0,l=1,f=2,c=0,y=1,w=2,T=3,D=4,m=5,S=6,p=7,b=8,R=3,A=10,G=3,F=9,P=10;return gt=function(z,g,K){var te,x,v,$,W,X,ie,Y,N,Ne,re=g.length,tr=K.length,Pe=z.adjustSizes,ir=z.barnesHutTheta*z.barnesHutTheta,qe,q,B,M,fe,U,O,E=[];for(v=0;vYe?(Ee-=(Ke-Ye)/2,Re=Ee+Ke):(we-=(Ye-Ke)/2,Se=we+Ye),E[0+c]=-1,E[0+y]=(we+Se)/2,E[0+w]=(Ee+Re)/2,E[0+T]=Math.max(Se-we,Re-Ee),E[0+D]=-1,E[0+m]=-1,E[0+S]=0,E[0+p]=0,E[0+b]=0,te=1,v=0;v=0){g[v+n]=0)if(U=Math.pow(g[v+n]-E[x+p],2)+Math.pow(g[v+i]-E[x+b],2),Ne=E[x+T],4*Ne*Ne/U0?(O=q*g[v+o]*E[x+S]/U,g[v+t]+=B*O,g[v+e]+=M*O):U<0&&(O=-q*g[v+o]*E[x+S]/Math.sqrt(U),g[v+t]+=B*O,g[v+e]+=M*O):U>0&&(O=q*g[v+o]*E[x+S]/U,g[v+t]+=B*O,g[v+e]+=M*O),x=E[x+D],x<0)break;continue}else{x=E[x+m];continue}else{if(X=E[x+c],X>=0&&X!==v&&(B=g[v+n]-g[X+n],M=g[v+i]-g[X+i],U=B*B+M*M,Pe===!0?U>0?(O=q*g[v+o]*g[X+o]/U,g[v+t]+=B*O,g[v+e]+=M*O):U<0&&(O=-q*g[v+o]*g[X+o]/Math.sqrt(U),g[v+t]+=B*O,g[v+e]+=M*O):U>0&&(O=q*g[v+o]*g[X+o]/U,g[v+t]+=B*O,g[v+e]+=M*O)),x=E[x+D],x<0)break;continue}else for(q=z.scalingRatio,$=0;$0?(O=q*g[$+o]*g[W+o]/U/U,g[$+t]+=B*O,g[$+e]+=M*O,g[W+t]-=B*O,g[W+e]-=M*O):U<0&&(O=100*q*g[$+o]*g[W+o],g[$+t]+=B*O,g[$+e]+=M*O,g[W+t]-=B*O,g[W+e]-=M*O)):(U=Math.sqrt(B*B+M*M),U>0&&(O=q*g[$+o]*g[W+o]/U/U,g[$+t]+=B*O,g[$+e]+=M*O,g[W+t]-=B*O,g[W+e]-=M*O));for(N=z.gravity/z.scalingRatio,q=z.scalingRatio,v=0;v0&&(O=q*g[v+o]*N):U>0&&(O=q*g[v+o]*N/U),g[v+t]-=B*O,g[v+e]-=M*O;for(q=1*(z.outboundAttractionDistribution?qe:1),ie=0;ie0&&(O=-q*fe*Math.log(1+U)/U/g[$+o]):U>0&&(O=-q*fe*Math.log(1+U)/U):z.outboundAttractionDistribution?U>0&&(O=-q*fe/g[$+o]):U>0&&(O=-q*fe)):(U=Math.sqrt(Math.pow(B,2)+Math.pow(M,2)),z.linLogMode?z.outboundAttractionDistribution?U>0&&(O=-q*fe*Math.log(1+U)/U/g[$+o]):U>0&&(O=-q*fe*Math.log(1+U)/U):z.outboundAttractionDistribution?(U=1,O=-q*fe/g[$+o]):(U=1,O=-q*fe)),U>0&&(g[$+t]+=B*O,g[$+e]+=M*O,g[W+t]-=B*O,g[W+e]-=M*O);var Ze,Ie,Xe,_e,Je,Qe;if(Pe===!0)for(v=0;vP&&(g[v+t]=g[v+t]*P/Ze,g[v+e]=g[v+e]*P/Ze),Ie=g[v+o]*Math.sqrt((g[v+r]-g[v+t])*(g[v+r]-g[v+t])+(g[v+a]-g[v+e])*(g[v+a]-g[v+e])),Xe=Math.sqrt((g[v+r]+g[v+t])*(g[v+r]+g[v+t])+(g[v+a]+g[v+e])*(g[v+a]+g[v+e]))/2,_e=.1*Math.log(1+Xe)/(1+Math.sqrt(Ie)),Je=g[v+n]+g[v+t]*(_e/z.slowDown),g[v+n]=Je,Qe=g[v+i]+g[v+e]*(_e/z.slowDown),g[v+i]=Qe);else for(v=0;v=0)?{message:"the `scalingRatio` setting should be a number >= 0."}:"strongGravityMode"in t&&typeof t.strongGravityMode!="boolean"?{message:"the `strongGravityMode` setting should be a boolean."}:"gravity"in t&&!(typeof t.gravity=="number"&&t.gravity>=0)?{message:"the `gravity` setting should be a number >= 0."}:"slowDown"in t&&!(typeof t.slowDown=="number"||t.slowDown>=0)?{message:"the `slowDown` setting should be a number >= 0."}:"barnesHutOptimize"in t&&typeof t.barnesHutOptimize!="boolean"?{message:"the `barnesHutOptimize` setting should be a boolean."}:"barnesHutTheta"in t&&!(typeof t.barnesHutTheta=="number"&&t.barnesHutTheta>=0)?{message:"the `barnesHutTheta` setting should be a number >= 0."}:null},ge.graphToByteArrays=function(t,e){var r=t.order,a=t.size,o={},s,u=new Float32Array(r*n),h=new Float32Array(a*i);return s=0,t.forEachNode(function(d,l){o[d]=s,u[s]=l.x,u[s+1]=l.y,u[s+2]=0,u[s+3]=0,u[s+4]=0,u[s+5]=0,u[s+6]=1,u[s+7]=1,u[s+8]=l.size||1,u[s+9]=l.fixed?1:0,s+=n}),s=0,t.forEachEdge(function(d,l,f,c,y,w,T){var D=o[f],m=o[c],S=e(d,l,f,c,y,w,T);u[D+6]+=S,u[m+6]+=S,h[s]=D,h[s+1]=m,h[s+2]=S,s+=i}),{nodes:u,edges:h}},ge.assignLayoutChanges=function(t,e,r){var a=0;t.updateEachNodeAttributes(function(o,s){return s.x=e[a],s.y=e[a+1],a+=n,r?r(o,s):s})},ge.readGraphPositions=function(t,e){var r=0;t.forEachNode(function(a,o){e[r]=o.x,e[r+1]=o.y,r+=n})},ge.collectLayoutChanges=function(t,e,r){for(var a=t.nodes(),o={},s=0,u=0,h=e.length;s2e3,strongGravityMode:!0,gravity:.05,scalingRatio:10,slowDown:1+Math.log(h)}}var s=a.bind(null,!1);return s.assign=a.bind(null,!0),s.inferSettings=o,vt=s,vt}var yn=mn();const it=bi(yn);function bn(n,i){if(typeof n!="object"||!n)return n;var t=n[Symbol.toPrimitive];if(t!==void 0){var e=t.call(n,i);if(typeof e!="object")return e;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(n)}function je(n){var i=bn(n,"string");return typeof i=="symbol"?i:i+""}function Q(n,i){if(!(n instanceof i))throw new TypeError("Cannot call a class as a function")}function Yt(n,i){for(var t=0;tn.length)&&(i=n.length);for(var t=0,e=Array(i);t>>16,t=(n&65280)>>>8,e=n&255,r=255,a=zi(i,t,e,r);return bt[n]=a,a}function Zt(n,i,t,e){return t+(i<<8)+(n<<16)}function Xt(n,i,t,e,r,a){var o=Math.floor(t/a*r),s=Math.floor(n.drawingBufferHeight/a-e/a*r),u=new Uint8Array(4);n.bindFramebuffer(n.FRAMEBUFFER,i),n.readPixels(o,s,1,1,n.RGBA,n.UNSIGNED_BYTE,u);var h=De(u,4),d=h[0],l=h[1],f=h[2],c=h[3];return[d,l,f,c]}function _(n,i,t){return(i=je(i))in n?Object.defineProperty(n,i,{value:t,enumerable:!0,configurable:!0,writable:!0}):n[i]=t,n}function Jt(n,i){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var e=Object.getOwnPropertySymbols(n);i&&(e=e.filter(function(r){return Object.getOwnPropertyDescriptor(n,r).enumerable})),t.push.apply(t,e)}return t}function L(n){for(var i=1;i:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * 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-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * 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-3\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3.5) * 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-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * 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-7>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 7) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 7) * 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(.space-y-reverse>:not(:last-child)){--tw-space-y-reverse:1}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}:where(.space-x-reverse>:not(:last-child)){--tw-space-x-reverse:1}.gap-y-1{row-gap:var(--spacing)}.gap-y-1\.5{row-gap:calc(var(--spacing) * 1.5)}:where(.divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-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-y-reverse>:not(:last-child)){--tw-divide-y-reverse:1}.self-end{align-self:flex-end}.self-start{align-self:flex-start}.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}.overscroll-contain{overscroll-behavior:contain}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-s{border-start-start-radius:.25rem;border-end-start-radius:.25rem}.rounded-ss{border-start-start-radius:.25rem}.rounded-e{border-start-end-radius:.25rem;border-end-end-radius:.25rem}.rounded-se{border-start-end-radius:.25rem}.rounded-ee{border-end-end-radius:.25rem}.rounded-es{border-end-start-radius:.25rem}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-tl{border-top-left-radius:.25rem}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-tr{border-top-right-radius:.25rem}.rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-br{border-bottom-right-radius:.25rem}.rounded-br-sm{border-bottom-right-radius:calc(var(--radius) - 4px)}.rounded-bl{border-bottom-left-radius:.25rem}.rounded-bl-sm{border-bottom-left-radius:calc(var(--radius) - 4px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-x{border-inline-style:var(--tw-border-style);border-inline-width:1px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.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{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-500\/20{border-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/20{border-color:color-mix(in oklab,var(--color-amber-500) 20%,transparent)}}.border-amber-500\/25{border-color:#f99c0040}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/25{border-color:color-mix(in oklab,var(--color-amber-500) 25%,transparent)}}.border-amber-500\/30{border-color:#f99c004d}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/30{border-color:color-mix(in oklab,var(--color-amber-500) 30%,transparent)}}.border-amber-500\/40{border-color:#f99c0066}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/40{border-color:color-mix(in oklab,var(--color-amber-500) 40%,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-border,.border-border\/20{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/20{border-color:color-mix(in oklab,hsl(var(--border)) 20%,transparent)}}.border-border\/30{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/30{border-color:color-mix(in oklab,hsl(var(--border)) 30%,transparent)}}.border-border\/40{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/40{border-color:color-mix(in oklab,hsl(var(--border)) 40%,transparent)}}.border-border\/50{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/50{border-color:color-mix(in oklab,hsl(var(--border)) 50%,transparent)}}.border-border\/60{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/60{border-color:color-mix(in oklab,hsl(var(--border)) 60%,transparent)}}.border-border\/70{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/70{border-color:color-mix(in oklab,hsl(var(--border)) 70%,transparent)}}.border-border\/80{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/80{border-color:color-mix(in oklab,hsl(var(--border)) 80%,transparent)}}.border-cyan-500\/20{border-color:#00b7d733}@supports (color:color-mix(in lab,red,red)){.border-cyan-500\/20{border-color:color-mix(in oklab,var(--color-cyan-500) 20%,transparent)}}.border-cyan-500\/30{border-color:#00b7d74d}@supports (color:color-mix(in lab,red,red)){.border-cyan-500\/30{border-color:color-mix(in oklab,var(--color-cyan-500) 30%,transparent)}}.border-emerald-500\/10{border-color:#00bb7f1a}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/10{border-color:color-mix(in oklab,var(--color-emerald-500) 10%,transparent)}}.border-emerald-500\/15{border-color:#00bb7f26}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/15{border-color:color-mix(in oklab,var(--color-emerald-500) 15%,transparent)}}.border-emerald-500\/20{border-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/20{border-color:color-mix(in oklab,var(--color-emerald-500) 20%,transparent)}}.border-emerald-500\/25{border-color:#00bb7f40}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/25{border-color:color-mix(in oklab,var(--color-emerald-500) 25%,transparent)}}.border-emerald-500\/30{border-color:#00bb7f4d}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/30{border-color:color-mix(in oklab,var(--color-emerald-500) 30%,transparent)}}.border-emerald-500\/40{border-color:#00bb7f66}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/40{border-color:color-mix(in oklab,var(--color-emerald-500) 40%,transparent)}}.border-fuchsia-500\/25{border-color:#e12afb40}@supports (color:color-mix(in lab,red,red)){.border-fuchsia-500\/25{border-color:color-mix(in oklab,var(--color-fuchsia-500) 25%,transparent)}}.border-fuchsia-500\/30{border-color:#e12afb4d}@supports (color:color-mix(in lab,red,red)){.border-fuchsia-500\/30{border-color:color-mix(in oklab,var(--color-fuchsia-500) 30%,transparent)}}.border-fuchsia-500\/40{border-color:#e12afb66}@supports (color:color-mix(in lab,red,red)){.border-fuchsia-500\/40{border-color:color-mix(in oklab,var(--color-fuchsia-500) 40%,transparent)}}.border-indigo-500\/25{border-color:#625fff40}@supports (color:color-mix(in lab,red,red)){.border-indigo-500\/25{border-color:color-mix(in oklab,var(--color-indigo-500) 25%,transparent)}}.border-indigo-500\/30{border-color:#625fff4d}@supports (color:color-mix(in lab,red,red)){.border-indigo-500\/30{border-color:color-mix(in oklab,var(--color-indigo-500) 30%,transparent)}}.border-indigo-500\/40{border-color:#625fff66}@supports (color:color-mix(in lab,red,red)){.border-indigo-500\/40{border-color:color-mix(in oklab,var(--color-indigo-500) 40%,transparent)}}.border-orange-500\/30{border-color:#fe6e004d}@supports (color:color-mix(in lab,red,red)){.border-orange-500\/30{border-color:color-mix(in oklab,var(--color-orange-500) 30%,transparent)}}.border-pink-500\/25{border-color:#f6339a40}@supports (color:color-mix(in lab,red,red)){.border-pink-500\/25{border-color:color-mix(in oklab,var(--color-pink-500) 25%,transparent)}}.border-primary,.border-primary\/20{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/20{border-color:color-mix(in oklab,hsl(var(--primary)) 20%,transparent)}}.border-primary\/25{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/25{border-color:color-mix(in oklab,hsl(var(--primary)) 25%,transparent)}}.border-primary\/30{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/30{border-color:color-mix(in oklab,hsl(var(--primary)) 30%,transparent)}}.border-primary\/40{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/40{border-color:color-mix(in oklab,hsl(var(--primary)) 40%,transparent)}}.border-primary\/45{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/45{border-color:color-mix(in oklab,hsl(var(--primary)) 45%,transparent)}}.border-primary\/50{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/50{border-color:color-mix(in oklab,hsl(var(--primary)) 50%,transparent)}}.border-primary\/60{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/60{border-color:color-mix(in oklab,hsl(var(--primary)) 60%,transparent)}}.border-purple-500\/30{border-color:#ac4bff4d}@supports (color:color-mix(in lab,red,red)){.border-purple-500\/30{border-color:color-mix(in oklab,var(--color-purple-500) 30%,transparent)}}.border-red-500{border-color:var(--color-red-500)}.border-red-500\/20{border-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.border-red-500\/20{border-color:color-mix(in oklab,var(--color-red-500) 20%,transparent)}}.border-red-500\/25{border-color:#fb2c3640}@supports (color:color-mix(in lab,red,red)){.border-red-500\/25{border-color:color-mix(in oklab,var(--color-red-500) 25%,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\/40{border-color:#fb2c3666}@supports (color:color-mix(in lab,red,red)){.border-red-500\/40{border-color:color-mix(in oklab,var(--color-red-500) 40%,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-slate-500\/25{border-color:#62748e40}@supports (color:color-mix(in lab,red,red)){.border-slate-500\/25{border-color:color-mix(in oklab,var(--color-slate-500) 25%,transparent)}}.border-slate-500\/30{border-color:#62748e4d}@supports (color:color-mix(in lab,red,red)){.border-slate-500\/30{border-color:color-mix(in oklab,var(--color-slate-500) 30%,transparent)}}.border-teal-500\/25{border-color:#00baa740}@supports (color:color-mix(in lab,red,red)){.border-teal-500\/25{border-color:color-mix(in oklab,var(--color-teal-500) 25%,transparent)}}.border-transparent{border-color:#0000}.border-violet-500\/20{border-color:#8d54ff33}@supports (color:color-mix(in lab,red,red)){.border-violet-500\/20{border-color:color-mix(in oklab,var(--color-violet-500) 20%,transparent)}}.border-violet-500\/25{border-color:#8d54ff40}@supports (color:color-mix(in lab,red,red)){.border-violet-500\/25{border-color:color-mix(in oklab,var(--color-violet-500) 25%,transparent)}}.border-t-primary\/70{border-top-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-t-primary\/70{border-top-color:color-mix(in oklab,hsl(var(--primary)) 70%,transparent)}}.border-t-violet-500\/70{border-top-color:#8d54ffb3}@supports (color:color-mix(in lab,red,red)){.border-t-violet-500\/70{border-top-color:color-mix(in oklab,var(--color-violet-500) 70%,transparent)}}.border-l-amber-500\/80{border-left-color:#f99c00cc}@supports (color:color-mix(in lab,red,red)){.border-l-amber-500\/80{border-left-color:color-mix(in oklab,var(--color-amber-500) 80%,transparent)}}.border-l-cyan-500\/80{border-left-color:#00b7d7cc}@supports (color:color-mix(in lab,red,red)){.border-l-cyan-500\/80{border-left-color:color-mix(in oklab,var(--color-cyan-500) 80%,transparent)}}.border-l-indigo-500\/80{border-left-color:#625fffcc}@supports (color:color-mix(in lab,red,red)){.border-l-indigo-500\/80{border-left-color:color-mix(in oklab,var(--color-indigo-500) 80%,transparent)}}.border-l-muted{border-left-color:hsl(var(--muted))}.border-l-violet-500\/80{border-left-color:#8d54ffcc}@supports (color:color-mix(in lab,red,red)){.border-l-violet-500\/80{border-left-color:color-mix(in oklab,var(--color-violet-500) 80%,transparent)}}.bg-\[\#070a0f\]{background-color:#070a0f}.bg-\[hsl\(224\,30\%\,6\%\)\]{background-color:#0b0d14}.bg-amber-400{background-color:var(--color-amber-400)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-500\/5{background-color:#f99c000d}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/5{background-color:color-mix(in oklab,var(--color-amber-500) 5%,transparent)}}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/10{background-color:color-mix(in oklab,var(--color-amber-500) 10%,transparent)}}.bg-amber-500\/15{background-color:#f99c0026}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/15{background-color:color-mix(in oklab,var(--color-amber-500) 15%,transparent)}}.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-amber-500\/80{background-color:#f99c00cc}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/80{background-color:color-mix(in oklab,var(--color-amber-500) 80%,transparent)}}.bg-amber-500\/\[0\.06\]{background-color:#f99c000f}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-amber-500) 6%,transparent)}}.bg-background\/10{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/10{background-color:color-mix(in oklab,hsl(var(--background)) 10%,transparent)}}.bg-background\/15{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/15{background-color:color-mix(in oklab,hsl(var(--background)) 15%,transparent)}}.bg-background\/20{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/20{background-color:color-mix(in oklab,hsl(var(--background)) 20%,transparent)}}.bg-background\/25{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/25{background-color:color-mix(in oklab,hsl(var(--background)) 25%,transparent)}}.bg-background\/30{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/30{background-color:color-mix(in oklab,hsl(var(--background)) 30%,transparent)}}.bg-background\/35{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/35{background-color:color-mix(in oklab,hsl(var(--background)) 35%,transparent)}}.bg-background\/40{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/40{background-color:color-mix(in oklab,hsl(var(--background)) 40%,transparent)}}.bg-background\/50{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/50{background-color:color-mix(in oklab,hsl(var(--background)) 50%,transparent)}}.bg-black\/10{background-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.bg-black\/10{background-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab,red,red)){.bg-black\/30{background-color:color-mix(in oklab,var(--color-black) 30%,transparent)}}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab,red,red)){.bg-black\/40{background-color:color-mix(in oklab,var(--color-black) 40%,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-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-border\/30{background-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.bg-border\/30{background-color:color-mix(in oklab,hsl(var(--border)) 30%,transparent)}}.bg-card,.bg-card\/20{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/20{background-color:color-mix(in oklab,hsl(var(--card)) 20%,transparent)}}.bg-card\/30{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/30{background-color:color-mix(in oklab,hsl(var(--card)) 30%,transparent)}}.bg-card\/40{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/40{background-color:color-mix(in oklab,hsl(var(--card)) 40%,transparent)}}.bg-card\/45{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/45{background-color:color-mix(in oklab,hsl(var(--card)) 45%,transparent)}}.bg-card\/50{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/50{background-color:color-mix(in oklab,hsl(var(--card)) 50%,transparent)}}.bg-card\/70{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/70{background-color:color-mix(in oklab,hsl(var(--card)) 70%,transparent)}}.bg-card\/85{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/85{background-color:color-mix(in oklab,hsl(var(--card)) 85%,transparent)}}.bg-cyan-500\/10{background-color:#00b7d71a}@supports (color:color-mix(in lab,red,red)){.bg-cyan-500\/10{background-color:color-mix(in oklab,var(--color-cyan-500) 10%,transparent)}}.bg-cyan-500\/20{background-color:#00b7d733}@supports (color:color-mix(in lab,red,red)){.bg-cyan-500\/20{background-color:color-mix(in oklab,var(--color-cyan-500) 20%,transparent)}}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-emerald-500\/5{background-color:#00bb7f0d}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/5{background-color:color-mix(in oklab,var(--color-emerald-500) 5%,transparent)}}.bg-emerald-500\/10{background-color:#00bb7f1a}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/10{background-color:color-mix(in oklab,var(--color-emerald-500) 10%,transparent)}}.bg-emerald-500\/15{background-color:#00bb7f26}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/15{background-color:color-mix(in oklab,var(--color-emerald-500) 15%,transparent)}}.bg-emerald-500\/20{background-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/20{background-color:color-mix(in oklab,var(--color-emerald-500) 20%,transparent)}}.bg-emerald-500\/80{background-color:#00bb7fcc}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/80{background-color:color-mix(in oklab,var(--color-emerald-500) 80%,transparent)}}.bg-emerald-500\/\[0\.07\]{background-color:#00bb7f12}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/\[0\.07\]{background-color:color-mix(in oklab,var(--color-emerald-500) 7%,transparent)}}.bg-fuchsia-500\/10{background-color:#e12afb1a}@supports (color:color-mix(in lab,red,red)){.bg-fuchsia-500\/10{background-color:color-mix(in oklab,var(--color-fuchsia-500) 10%,transparent)}}.bg-fuchsia-500\/15{background-color:#e12afb26}@supports (color:color-mix(in lab,red,red)){.bg-fuchsia-500\/15{background-color:color-mix(in oklab,var(--color-fuchsia-500) 15%,transparent)}}.bg-indigo-500\/5{background-color:#625fff0d}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/5{background-color:color-mix(in oklab,var(--color-indigo-500) 5%,transparent)}}.bg-indigo-500\/10{background-color:#625fff1a}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/10{background-color:color-mix(in oklab,var(--color-indigo-500) 10%,transparent)}}.bg-indigo-500\/15{background-color:#625fff26}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/15{background-color:color-mix(in oklab,var(--color-indigo-500) 15%,transparent)}}.bg-muted{background-color:hsl(var(--muted))}.bg-muted-foreground,.bg-muted-foreground\/40{background-color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.bg-muted-foreground\/40{background-color:color-mix(in oklab,hsl(var(--muted-foreground)) 40%,transparent)}}.bg-muted\/10{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/10{background-color:color-mix(in oklab,hsl(var(--muted)) 10%,transparent)}}.bg-muted\/20{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/20{background-color:color-mix(in oklab,hsl(var(--muted)) 20%,transparent)}}.bg-muted\/40{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/40{background-color:color-mix(in oklab,hsl(var(--muted)) 40%,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-pink-500\/15{background-color:#f6339a26}@supports (color:color-mix(in lab,red,red)){.bg-pink-500\/15{background-color:color-mix(in oklab,var(--color-pink-500) 15%,transparent)}}.bg-popover,.bg-popover\/95{background-color:hsl(var(--popover))}@supports (color:color-mix(in lab,red,red)){.bg-popover\/95{background-color:color-mix(in oklab,hsl(var(--popover)) 95%,transparent)}}.bg-primary,.bg-primary\/5{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/5{background-color:color-mix(in oklab,hsl(var(--primary)) 5%,transparent)}}.bg-primary\/10{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/10{background-color:color-mix(in oklab,hsl(var(--primary)) 10%,transparent)}}.bg-primary\/15{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/15{background-color:color-mix(in oklab,hsl(var(--primary)) 15%,transparent)}}.bg-primary\/\[0\.06\]{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/\[0\.06\]{background-color:color-mix(in oklab,hsl(var(--primary)) 6%,transparent)}}.bg-purple-500\/15{background-color:#ac4bff26}@supports (color:color-mix(in lab,red,red)){.bg-purple-500\/15{background-color:color-mix(in oklab,var(--color-purple-500) 15%,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-red-500{background-color:var(--color-red-500)}.bg-red-500\/5{background-color:#fb2c360d}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/5{background-color:color-mix(in oklab,var(--color-red-500) 5%,transparent)}}.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\/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-slate-500\/15{background-color:#62748e26}@supports (color:color-mix(in lab,red,red)){.bg-slate-500\/15{background-color:color-mix(in oklab,var(--color-slate-500) 15%,transparent)}}.bg-slate-500\/20{background-color:#62748e33}@supports (color:color-mix(in lab,red,red)){.bg-slate-500\/20{background-color:color-mix(in oklab,var(--color-slate-500) 20%,transparent)}}.bg-teal-500{background-color:var(--color-teal-500)}.bg-teal-500\/15{background-color:#00baa726}@supports (color:color-mix(in lab,red,red)){.bg-teal-500\/15{background-color:color-mix(in oklab,var(--color-teal-500) 15%,transparent)}}.bg-transparent{background-color:#0000}.bg-violet-500\/5{background-color:#8d54ff0d}@supports (color:color-mix(in lab,red,red)){.bg-violet-500\/5{background-color:color-mix(in oklab,var(--color-violet-500) 5%,transparent)}}.bg-violet-500\/10{background-color:#8d54ff1a}@supports (color:color-mix(in lab,red,red)){.bg-violet-500\/10{background-color:color-mix(in oklab,var(--color-violet-500) 10%,transparent)}}.bg-violet-500\/15{background-color:#8d54ff26}@supports (color:color-mix(in lab,red,red)){.bg-violet-500\/15{background-color:color-mix(in oklab,var(--color-violet-500) 15%,transparent)}}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-tr{--tw-gradient-position:to top right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-cyan-500{--tw-gradient-from:var(--color-cyan-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-foreground{--tw-gradient-from:hsl(var(--foreground));--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-indigo-500{--tw-gradient-from:var(--color-indigo-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-purple-500{--tw-gradient-from:var(--color-purple-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-teal-500{--tw-gradient-from:var(--color-teal-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-teal-500\/15{--tw-gradient-from:#00baa726}@supports (color:color-mix(in lab,red,red)){.from-teal-500\/15{--tw-gradient-from:color-mix(in oklab, var(--color-teal-500) 15%, transparent)}}.from-teal-500\/15{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-teal-500\/20{--tw-gradient-from:#00baa733}@supports (color:color-mix(in lab,red,red)){.from-teal-500\/20{--tw-gradient-from:color-mix(in oklab, var(--color-teal-500) 20%, transparent)}}.from-teal-500\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.via-foreground{--tw-gradient-via:hsl(var(--foreground));--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-indigo-500\/10{--tw-gradient-via:#625fff1a}@supports (color:color-mix(in lab,red,red)){.via-indigo-500\/10{--tw-gradient-via:color-mix(in oklab, var(--color-indigo-500) 10%, transparent)}}.via-indigo-500\/10{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-indigo-500\/15{--tw-gradient-via:#625fff26}@supports (color:color-mix(in lab,red,red)){.via-indigo-500\/15{--tw-gradient-via:color-mix(in oklab, var(--color-indigo-500) 15%, transparent)}}.via-indigo-500\/15{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.to-blue-500{--tw-gradient-to:var(--color-blue-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-emerald-500{--tw-gradient-to:var(--color-emerald-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-indigo-500{--tw-gradient-to:var(--color-indigo-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-pink-500{--tw-gradient-to:var(--color-pink-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-primary{--tw-gradient-to:hsl(var(--primary));--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-purple-500\/15{--tw-gradient-to:#ac4bff26}@supports (color:color-mix(in lab,red,red)){.to-purple-500\/15{--tw-gradient-to:color-mix(in oklab, var(--color-purple-500) 15%, transparent)}}.to-purple-500\/15{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-purple-500\/20{--tw-gradient-to:#ac4bff33}@supports (color:color-mix(in lab,red,red)){.to-purple-500\/20{--tw-gradient-to:color-mix(in oklab, var(--color-purple-500) 20%, transparent)}}.to-purple-500\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-sky-500{--tw-gradient-to:var(--color-sky-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.bg-repeat{background-repeat:repeat}.fill-primary\/20{fill:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.fill-primary\/20{fill:color-mix(in oklab,hsl(var(--primary)) 20%,transparent)}}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-3\.5{padding:calc(var(--spacing) * 3.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.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:var(--spacing)}.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-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-20{padding-block:calc(var(--spacing) * 20)}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-2\.5{padding-top:calc(var(--spacing) * 2.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-24{padding-top:calc(var(--spacing) * 24)}.pt-\[12vh\]{padding-top:12vh}.pr-1{padding-right:var(--spacing)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-10{padding-right:calc(var(--spacing) * 10)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-8{padding-left:calc(var(--spacing) * 8)}.pl-9{padding-left:calc(var(--spacing) * 9)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,monospace}.font-sans{font-family:Inter,ui-sans-serif,system-ui,-apple-system,sans-serif}.font-space{font-family:Space Grotesk,sans-serif}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--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-\[7px\]{font-size:7px}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-none{--tw-leading:1;line-height:1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.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-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.text-wrap{text-wrap:wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.text-clip{text-overflow:clip}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-300{color:var(--color-amber-300)}.text-amber-400{color:var(--color-amber-400)}.text-amber-400\/80{color:#fcbb00cc}@supports (color:color-mix(in lab,red,red)){.text-amber-400\/80{color:color-mix(in oklab,var(--color-amber-400) 80%,transparent)}}.text-amber-400\/90{color:#fcbb00e6}@supports (color:color-mix(in lab,red,red)){.text-amber-400\/90{color:color-mix(in oklab,var(--color-amber-400) 90%,transparent)}}.text-amber-500{color:var(--color-amber-500)}.text-black{color:var(--color-black)}.text-blue-300{color:var(--color-blue-300)}.text-cyan-200\/90{color:#a2f4fde6}@supports (color:color-mix(in lab,red,red)){.text-cyan-200\/90{color:color-mix(in oklab,var(--color-cyan-200) 90%,transparent)}}.text-cyan-300{color:var(--color-cyan-300)}.text-cyan-300\/90{color:#53eafde6}@supports (color:color-mix(in lab,red,red)){.text-cyan-300\/90{color:color-mix(in oklab,var(--color-cyan-300) 90%,transparent)}}.text-cyan-400{color:var(--color-cyan-400)}.text-emerald-300{color:var(--color-emerald-300)}.text-emerald-400{color:var(--color-emerald-400)}.text-emerald-400\/90{color:#00d294e6}@supports (color:color-mix(in lab,red,red)){.text-emerald-400\/90{color:color-mix(in oklab,var(--color-emerald-400) 90%,transparent)}}.text-foreground,.text-foreground\/80{color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.text-foreground\/80{color:color-mix(in oklab,hsl(var(--foreground)) 80%,transparent)}}.text-foreground\/90{color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.text-foreground\/90{color:color-mix(in oklab,hsl(var(--foreground)) 90%,transparent)}}.text-fuchsia-300{color:var(--color-fuchsia-300)}.text-fuchsia-400{color:var(--color-fuchsia-400)}.text-indigo-300{color:var(--color-indigo-300)}.text-indigo-400{color:var(--color-indigo-400)}.text-muted-foreground,.text-muted-foreground\/40{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/40{color:color-mix(in oklab,hsl(var(--muted-foreground)) 40%,transparent)}}.text-muted-foreground\/45{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/45{color:color-mix(in oklab,hsl(var(--muted-foreground)) 45%,transparent)}}.text-muted-foreground\/50{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/50{color:color-mix(in oklab,hsl(var(--muted-foreground)) 50%,transparent)}}.text-muted-foreground\/55{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/55{color:color-mix(in oklab,hsl(var(--muted-foreground)) 55%,transparent)}}.text-muted-foreground\/60{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/60{color:color-mix(in oklab,hsl(var(--muted-foreground)) 60%,transparent)}}.text-muted-foreground\/65{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/65{color:color-mix(in oklab,hsl(var(--muted-foreground)) 65%,transparent)}}.text-muted-foreground\/70{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/70{color:color-mix(in oklab,hsl(var(--muted-foreground)) 70%,transparent)}}.text-muted-foreground\/75{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/75{color:color-mix(in oklab,hsl(var(--muted-foreground)) 75%,transparent)}}.text-muted-foreground\/80{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/80{color:color-mix(in oklab,hsl(var(--muted-foreground)) 80%,transparent)}}.text-orange-300{color:var(--color-orange-300)}.text-pink-400{color:var(--color-pink-400)}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-primary\/70{color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.text-primary\/70{color:color-mix(in oklab,hsl(var(--primary)) 70%,transparent)}}.text-primary\/80{color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.text-primary\/80{color:color-mix(in oklab,hsl(var(--primary)) 80%,transparent)}}.text-purple-300{color:var(--color-purple-300)}.text-red-300{color:var(--color-red-300)}.text-red-400{color:var(--color-red-400)}.text-red-400\/80{color:#ff6568cc}@supports (color:color-mix(in lab,red,red)){.text-red-400\/80{color:color-mix(in oklab,var(--color-red-400) 80%,transparent)}}.text-rose-400{color:var(--color-rose-400)}.text-sky-400{color:var(--color-sky-400)}.text-slate-300{color:var(--color-slate-300)}.text-teal-400{color:var(--color-teal-400)}.text-transparent{color:#0000}.text-violet-200\/90{color:#ddd6ffe6}@supports (color:color-mix(in lab,red,red)){.text-violet-200\/90{color:color-mix(in oklab,var(--color-violet-200) 90%,transparent)}}.text-violet-300{color:var(--color-violet-300)}.text-violet-300\/80{color:#c4b4ffcc}@supports (color:color-mix(in lab,red,red)){.text-violet-300\/80{color:color-mix(in oklab,var(--color-violet-300) 80%,transparent)}}.text-violet-400{color:var(--color-violet-400)}.text-violet-400\/70{color:#a685ffb3}@supports (color:color-mix(in lab,red,red)){.text-violet-400\/70{color:color-mix(in oklab,var(--color-violet-400) 70%,transparent)}}.text-white{color:var(--color-white)}.text-white\/95{color:#fffffff2}@supports (color:color-mix(in lab,red,red)){.text-white\/95{color:color-mix(in oklab,var(--color-white) 95%,transparent)}}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.diagonal-fractions{--tw-numeric-fraction:diagonal-fractions;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.lining-nums{--tw-numeric-figure:lining-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.oldstyle-nums{--tw-numeric-figure:oldstyle-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.proportional-nums{--tw-numeric-spacing:proportional-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.slashed-zero{--tw-slashed-zero:slashed-zero;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.stacked-fractions{--tw-numeric-fraction:stacked-fractions;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.normal-nums{font-variant-numeric:normal}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.overline{text-decoration-line:overline}.underline{text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.accent-primary{accent-color:hsl(var(--primary))}.opacity-0{opacity:0}.opacity-30{opacity:.3}.opacity-35{opacity:.35}.opacity-60{opacity:.6}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.opacity-100{opacity:1}.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\!{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a)!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.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-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);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-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px 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-sm{--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-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{--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)}.shadow-amber-500\/10{--tw-shadow-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.shadow-amber-500\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-amber-500) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/5{--tw-shadow-color:#0000000d}@supports (color:color-mix(in lab,red,red)){.shadow-black\/5{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 5%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/10{--tw-shadow-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.shadow-black\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/15{--tw-shadow-color:#00000026}@supports (color:color-mix(in lab,red,red)){.shadow-black\/15{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 15%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/20{--tw-shadow-color:#0003}@supports (color:color-mix(in lab,red,red)){.shadow-black\/20{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 20%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/25{--tw-shadow-color:#00000040}@supports (color:color-mix(in lab,red,red)){.shadow-black\/25{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 25%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-emerald-500\/5{--tw-shadow-color:#00bb7f0d}@supports (color:color-mix(in lab,red,red)){.shadow-emerald-500\/5{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-emerald-500) 5%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-primary\/5{--tw-shadow-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.shadow-primary\/5{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, hsl(var(--primary)) 5%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-primary\/10{--tw-shadow-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.shadow-primary\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, hsl(var(--primary)) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-primary\/20{--tw-shadow-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.shadow-primary\/20{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, hsl(var(--primary)) 20%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-red-500\/10{--tw-shadow-color:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.shadow-red-500\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-red-500) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-red-500\/30{--tw-shadow-color:#fb2c364d}@supports (color:color-mix(in lab,red,red)){.shadow-red-500\/30{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-red-500) 30%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-black\/40{--tw-ring-color:#0006}@supports (color:color-mix(in lab,red,red)){.ring-black\/40{--tw-ring-color:color-mix(in oklab, var(--color-black) 40%, transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.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,)}.blur-\[130px\]{--tw-blur:blur(130px);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,)}.blur-\[140px\]{--tw-blur:blur(140px);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,)}.blur-\[160px\]{--tw-blur:blur(160px);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,)}.drop-shadow{--tw-drop-shadow-size:drop-shadow(0 1px 2px var(--tw-drop-shadow-color,#0000001a)) drop-shadow(0 1px 1px var(--tw-drop-shadow-color,#0000000f));--tw-drop-shadow:drop-shadow(0 1px 2px #0000001a) drop-shadow(0 1px 1px #0000000f);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,)}.grayscale{--tw-grayscale:grayscale(100%);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,)}.invert{--tw-invert:invert(100%);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,)}.sepia{--tw-sepia:sepia(100%);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,)!important}.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,)}.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,)!important}.backdrop-blur{--tw-backdrop-blur:blur(8px);-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,)}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-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,)}.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,)}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-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,)}.backdrop-grayscale{--tw-backdrop-grayscale:grayscale(100%);-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,)}.backdrop-invert{--tw-backdrop-invert:invert(100%);-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,)}.backdrop-sepia{--tw-backdrop-sepia:sepia(100%);-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,)}.backdrop-filter{-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{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition\!{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events!important;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--tw-duration,var(--default-transition-duration))!important}.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}.duration-500{--tw-duration:.5s;transition-duration:.5s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.select-text{-webkit-user-select:text;user-select:text}:where(.divide-x-reverse>:not(:last-child)){--tw-divide-x-reverse:1}.ring-inset{--tw-ring-inset:inset}@media(hover:hover){.group-hover\:text-primary:is(:where(.group):hover *){color:hsl(var(--primary))}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.last\:border-0:last-child{border-style:var(--tw-border-style);border-width:0}@media(hover:hover){.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:border-border:hover{border-color:hsl(var(--border))}.hover\:border-primary\/20:hover{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/20:hover{border-color:color-mix(in oklab,hsl(var(--primary)) 20%,transparent)}}.hover\:border-primary\/30:hover{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/30:hover{border-color:color-mix(in oklab,hsl(var(--primary)) 30%,transparent)}}.hover\:border-primary\/40:hover{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/40:hover{border-color:color-mix(in oklab,hsl(var(--primary)) 40%,transparent)}}.hover\:border-primary\/45:hover{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/45:hover{border-color:color-mix(in oklab,hsl(var(--primary)) 45%,transparent)}}.hover\:border-primary\/50:hover{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/50:hover{border-color:color-mix(in oklab,hsl(var(--primary)) 50%,transparent)}}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-amber-400:hover{background-color:var(--color-amber-400)}.hover\:bg-amber-500\/10:hover{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-amber-500\/10:hover{background-color:color-mix(in oklab,var(--color-amber-500) 10%,transparent)}}.hover\:bg-amber-500\/15:hover{background-color:#f99c0026}@supports (color:color-mix(in lab,red,red)){.hover\:bg-amber-500\/15:hover{background-color:color-mix(in oklab,var(--color-amber-500) 15%,transparent)}}.hover\:bg-amber-500\/20:hover{background-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.hover\:bg-amber-500\/20:hover{background-color:color-mix(in oklab,var(--color-amber-500) 20%,transparent)}}.hover\:bg-background\/30:hover{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-background\/30:hover{background-color:color-mix(in oklab,hsl(var(--background)) 30%,transparent)}}.hover\:bg-background\/40:hover{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-background\/40:hover{background-color:color-mix(in oklab,hsl(var(--background)) 40%,transparent)}}.hover\:bg-background\/60:hover{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-background\/60:hover{background-color:color-mix(in oklab,hsl(var(--background)) 60%,transparent)}}.hover\:bg-background\/80:hover{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-background\/80:hover{background-color:color-mix(in oklab,hsl(var(--background)) 80%,transparent)}}.hover\:bg-emerald-500\/10:hover{background-color:#00bb7f1a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-emerald-500\/10:hover{background-color:color-mix(in oklab,var(--color-emerald-500) 10%,transparent)}}.hover\:bg-emerald-500\/15:hover{background-color:#00bb7f26}@supports (color:color-mix(in lab,red,red)){.hover\:bg-emerald-500\/15:hover{background-color:color-mix(in oklab,var(--color-emerald-500) 15%,transparent)}}.hover\:bg-fuchsia-500\/20:hover{background-color:#e12afb33}@supports (color:color-mix(in lab,red,red)){.hover\:bg-fuchsia-500\/20:hover{background-color:color-mix(in oklab,var(--color-fuchsia-500) 20%,transparent)}}.hover\:bg-indigo-500\/15:hover{background-color:#625fff26}@supports (color:color-mix(in lab,red,red)){.hover\:bg-indigo-500\/15:hover{background-color:color-mix(in oklab,var(--color-indigo-500) 15%,transparent)}}.hover\:bg-primary\/5:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/5:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 5%,transparent)}}.hover\:bg-primary\/10:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/10:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 10%,transparent)}}.hover\:bg-primary\/15:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/15:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 15%,transparent)}}.hover\:bg-primary\/20:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/20:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 20%,transparent)}}.hover\:bg-primary\/25:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/25:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 25%,transparent)}}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 90%,transparent)}}.hover\:bg-primary\/95:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/95:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 95%,transparent)}}.hover\:bg-red-400:hover{background-color:var(--color-red-400)}.hover\:bg-red-500\/5:hover{background-color:#fb2c360d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-500\/5:hover{background-color:color-mix(in oklab,var(--color-red-500) 5%,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-500\/20:hover{background-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-500\/20:hover{background-color:color-mix(in oklab,var(--color-red-500) 20%,transparent)}}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:text-primary:hover,.hover\:text-primary\/80:hover{color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:text-primary\/80:hover{color:color-mix(in oklab,hsl(var(--primary)) 80%,transparent)}}.hover\:text-red-300:hover{color:var(--color-red-300)}.hover\:text-red-400:hover{color:var(--color-red-400)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-90:hover{opacity:.9}}.focus\:border-primary:focus,.focus\:border-primary\/50:focus{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.focus\:border-primary\/50:focus{border-color:color-mix(in oklab,hsl(var(--primary)) 50%,transparent)}}.focus\:ring-1:focus{--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)}.focus\:ring-primary:focus,.focus\:ring-primary\/50:focus{--tw-ring-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.focus\:ring-primary\/50:focus{--tw-ring-color:color-mix(in oklab, hsl(var(--primary)) 50%, transparent)}}.focus\:ring-violet-500\/50:focus{--tw-ring-color:#8d54ff80}@supports (color:color-mix(in lab,red,red)){.focus\:ring-violet-500\/50:focus{--tw-ring-color:color-mix(in oklab, var(--color-violet-500) 50%, transparent)}}.focus-visible\:ring-2:focus-visible{--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-visible\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:cursor-default:disabled{cursor:default}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.aria-selected\:bg-accent[aria-selected=true]{background-color:hsl(var(--accent))}.aria-selected\:text-accent-foreground[aria-selected=true]{color:hsl(var(--accent-foreground))}@media(min-width:40rem){.sm\:w-\[640px\]{width:640px}.sm\:max-w-\[400px\]{max-width:400px}.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\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:self-auto{align-self:auto}.sm\:p-10{padding:calc(var(--spacing) * 10)}}@media(min-width:48rem){.md\:col-span-2{grid-column:span 2/span 2}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-\[170px_1fr\]{grid-template-columns:170px 1fr}}@media(min-width:64rem){.lg\:flex{display:flex}.lg\:w-40{width:calc(var(--spacing) * 40)}.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\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:grid-cols-\[1fr_300px\]{grid-template-columns:1fr 300px}.lg\:flex-row{flex-direction:row}.lg\:items-center{align-items:center}.lg\:items-stretch{align-items:stretch}}}:root{--background:224 30% 6%;--foreground:210 20% 92%;--card:224 25% 10%;--card-foreground:210 20% 94%;--popover:224 28% 9%;--popover-foreground:210 20% 94%;--primary:172 72% 50%;--primary-foreground:224 47% 8%;--muted:220 16% 14%;--muted-foreground:215 14% 64%;--accent:220 16% 16%;--accent-foreground:210 20% 94%;--border:222 18% 23%;--input:222 18% 23%;--ring:172 72% 50%;--radius:.75rem;color-scheme:dark}.light{--background:0 0% 100%;--foreground:222 22% 12%;--card:0 0% 100%;--card-foreground:222 22% 12%;--popover:0 0% 100%;--popover-foreground:222 22% 12%;--primary:172 70% 38%;--primary-foreground:0 0% 100%;--muted:220 14% 95%;--muted-foreground:220 9% 42%;--accent:220 14% 94%;--accent-foreground:222 22% 12%;--border:220 13% 88%;--input:220 13% 88%;--ring:172 66% 50%;color-scheme:light}@keyframes aurora{0%{background-position:0%}50%{background-position:100%}to{background-position:0%}}.animate-aurora{background-size:200% 200%;animation:25s infinite aurora}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:hsl(var(--border));border-radius:9999px}*{border-color:hsl(var(--border) / .85);outline-color:hsl(var(--primary) / .5)}:focus-visible{outline:2px solid hsl(var(--primary) / .7);outline-offset:2px}@media(prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}html,body,#root{height:100%;overflow:hidden}body{background-color:hsl(var(--background));color:hsl(var(--foreground));font-family:var(--font-sans);-webkit-font-smoothing:antialiased;margin:0}@keyframes flow-cyan{0%{stroke-dasharray:6 3;stroke-dashoffset:18px}to{stroke-dasharray:6 3;stroke-dashoffset:0}}.animate-flow-cyan{animation:1.2s linear infinite flow-cyan}.rounded-2xl.border.bg-card\/45{position:relative;overflow:hidden;background-color:hsl(var(--card) / .85)!important;border-color:hsl(var(--border) / .95)!important;transition:transform .3s cubic-bezier(.4,0,.2,1),background-color .3s cubic-bezier(.4,0,.2,1),border-color .3s cubic-bezier(.4,0,.2,1),box-shadow .3s cubic-bezier(.4,0,.2,1)!important;box-shadow:0 10px 30px -15px #00000073,inset 0 1px #ffffff0d!important}.rounded-2xl.border.bg-card\/45:before{content:"";background:linear-gradient(90deg,hsl(var(--primary)),#6366f1,#a855f7);opacity:.75;height:3.5px;position:absolute;top:0;left:0;right:0;transition:opacity .3s!important}.rounded-2xl.border.bg-card\/45:hover{transform:translateY(-3px);background-color:hsl(var(--card) / .92)!important;border-color:hsl(var(--primary) / .35)!important;box-shadow:0 20px 40px -20px #000000a6,0 0 18px 2px hsl(var(--primary) / .05)!important}.rounded-2xl.border.bg-card\/45:hover:before{opacity:1}.rounded-xl.border.bg-card\/45{background-color:hsl(var(--card) / .88)!important;border-color:hsl(var(--border) / .9)!important;transition:background-color .2s,border-color .2s!important}.rounded-xl.border.bg-card\/45:hover{background-color:hsl(var(--card) / .95)!important;border-color:hsl(var(--primary) / .3)!important}aside nav a[class*="bg-primary/15"]:not([class*=justify-center]){background:linear-gradient(90deg,hsl(var(--primary) / .18),#6366f11f)!important;color:hsl(var(--primary))!important;border-left:3.5px solid hsl(var(--primary))!important;border-radius:0 var(--radius) var(--radius) 0!important;padding-left:calc(.75rem - 3.5px)!important;box-shadow:inset 0 1px #ffffff05!important}aside nav a[class*="bg-primary/15"][class*=justify-center]{background:hsl(var(--primary) / .18)!important;color:hsl(var(--primary))!important;box-shadow:0 0 12px 1px hsl(var(--primary) / .1)!important;border:1px solid hsl(var(--primary) / .3)!important}::-webkit-scrollbar-thumb{border-radius:9999px;background:hsl(var(--primary) / .25)!important}::-webkit-scrollbar-thumb:hover{background:hsl(var(--primary) / .5)!important}input:focus,textarea:focus,select:focus{outline:none;border-color:hsl(var(--primary))!important;box-shadow:0 0 0 2px hsl(var(--primary) / .15)!important}@media(min-width:1440px){html{font-size:16.5px}}@media(min-width:1920px){html{font-size:17.5px}}@media(min-width:2560px){html{font-size:19px}}@media(min-width:3440px){html{font-size:20px}}@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-pan-x{syntax:"*";inherits:false}@property --tw-pan-y{syntax:"*";inherits:false}@property --tw-pinch-zoom{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{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-outline-style{syntax:"*";inherits:false;initial-value:solid}@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}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}} diff --git a/frontend/dist/assets/index-KW1c6Ww8.js b/frontend/dist/assets/index-CrYzXlx6.js similarity index 87% rename from frontend/dist/assets/index-KW1c6Ww8.js rename to frontend/dist/assets/index-CrYzXlx6.js index 90631d7..64012d6 100644 --- a/frontend/dist/assets/index-KW1c6Ww8.js +++ b/frontend/dist/assets/index-CrYzXlx6.js @@ -1,4 +1,4 @@ -var VM=Object.defineProperty;var V1=e=>{throw TypeError(e)};var qM=(e,t,r)=>t in e?VM(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var Yl=(e,t,r)=>qM(e,typeof t!="symbol"?t+"":t,r),qp=(e,t,r)=>t.has(e)||V1("Cannot "+r);var L=(e,t,r)=>(qp(e,t,"read from private field"),r?r.call(e):t.get(e)),De=(e,t,r)=>t.has(e)?V1("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,r),ye=(e,t,r,n)=>(qp(e,t,"write to private field"),n?n.call(e,r):t.set(e,r),r),He=(e,t,r)=>(qp(e,t,"access private method"),r);var kd=(e,t,r,n)=>({set _(a){ye(e,t,a,r)},get _(){return L(e,t,n)}});function QM(e,t){for(var r=0;rn[a]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const a of document.querySelectorAll('link[rel="modulepreload"]'))n(a);new MutationObserver(a=>{for(const o of a)if(o.type==="childList")for(const c of o.addedNodes)c.tagName==="LINK"&&c.rel==="modulepreload"&&n(c)}).observe(document,{childList:!0,subtree:!0});function r(a){const o={};return a.integrity&&(o.integrity=a.integrity),a.referrerPolicy&&(o.referrerPolicy=a.referrerPolicy),a.crossOrigin==="use-credentials"?o.credentials="include":a.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(a){if(a.ep)return;a.ep=!0;const o=r(a);fetch(a.href,o)}})();function vy(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Qp={exports:{}},Xl={},Yp={exports:{}},Ue={};/** +var VM=Object.defineProperty;var q1=e=>{throw TypeError(e)};var qM=(e,t,r)=>t in e?VM(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var is=(e,t,r)=>qM(e,typeof t!="symbol"?t+"":t,r),qp=(e,t,r)=>t.has(e)||q1("Cannot "+r);var L=(e,t,r)=>(qp(e,t,"read from private field"),r?r.call(e):t.get(e)),De=(e,t,r)=>t.has(e)?q1("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,r),ye=(e,t,r,n)=>(qp(e,t,"write to private field"),n?n.call(e,r):t.set(e,r),r),He=(e,t,r)=>(qp(e,t,"access private method"),r);var kd=(e,t,r,n)=>({set _(a){ye(e,t,a,r)},get _(){return L(e,t,n)}});function QM(e,t){for(var r=0;rn[a]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const a of document.querySelectorAll('link[rel="modulepreload"]'))n(a);new MutationObserver(a=>{for(const o of a)if(o.type==="childList")for(const c of o.addedNodes)c.tagName==="LINK"&&c.rel==="modulepreload"&&n(c)}).observe(document,{childList:!0,subtree:!0});function r(a){const o={};return a.integrity&&(o.integrity=a.integrity),a.referrerPolicy&&(o.referrerPolicy=a.referrerPolicy),a.crossOrigin==="use-credentials"?o.credentials="include":a.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(a){if(a.ep)return;a.ep=!0;const o=r(a);fetch(a.href,o)}})();function vy(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Qp={exports:{}},Xl={},Yp={exports:{}},Ue={};/** * @license React * react.production.min.js * @@ -6,7 +6,7 @@ var VM=Object.defineProperty;var V1=e=>{throw TypeError(e)};var qM=(e,t,r)=>t in * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var q1;function YM(){if(q1)return Ue;q1=1;var e=Symbol.for("react.element"),t=Symbol.for("react.portal"),r=Symbol.for("react.fragment"),n=Symbol.for("react.strict_mode"),a=Symbol.for("react.profiler"),o=Symbol.for("react.provider"),c=Symbol.for("react.context"),u=Symbol.for("react.forward_ref"),f=Symbol.for("react.suspense"),h=Symbol.for("react.memo"),m=Symbol.for("react.lazy"),g=Symbol.iterator;function v(I){return I===null||typeof I!="object"?null:(I=g&&I[g]||I["@@iterator"],typeof I=="function"?I:null)}var b={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},j=Object.assign,k={};function S(I,M,K){this.props=I,this.context=M,this.refs=k,this.updater=K||b}S.prototype.isReactComponent={},S.prototype.setState=function(I,M){if(typeof I!="object"&&typeof I!="function"&&I!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,I,M,"setState")},S.prototype.forceUpdate=function(I){this.updater.enqueueForceUpdate(this,I,"forceUpdate")};function N(){}N.prototype=S.prototype;function E(I,M,K){this.props=I,this.context=M,this.refs=k,this.updater=K||b}var A=E.prototype=new N;A.constructor=E,j(A,S.prototype),A.isPureReactComponent=!0;var P=Array.isArray,_=Object.prototype.hasOwnProperty,O={current:null},D={key:!0,ref:!0,__self:!0,__source:!0};function U(I,M,K){var ne,Z={},me=null,ge=null;if(M!=null)for(ne in M.ref!==void 0&&(ge=M.ref),M.key!==void 0&&(me=""+M.key),M)_.call(M,ne)&&!D.hasOwnProperty(ne)&&(Z[ne]=M[ne]);var Pe=arguments.length-2;if(Pe===1)Z.children=K;else if(1{throw TypeError(e)};var qM=(e,t,r)=>t in * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var Y1;function XM(){if(Y1)return Xl;Y1=1;var e=el(),t=Symbol.for("react.element"),r=Symbol.for("react.fragment"),n=Object.prototype.hasOwnProperty,a=e.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,o={key:!0,ref:!0,__self:!0,__source:!0};function c(u,f,h){var m,g={},v=null,b=null;h!==void 0&&(v=""+h),f.key!==void 0&&(v=""+f.key),f.ref!==void 0&&(b=f.ref);for(m in f)n.call(f,m)&&!o.hasOwnProperty(m)&&(g[m]=f[m]);if(u&&u.defaultProps)for(m in f=u.defaultProps,f)g[m]===void 0&&(g[m]=f[m]);return{$$typeof:t,type:u,key:v,ref:b,props:g,_owner:a.current}}return Xl.Fragment=r,Xl.jsx=c,Xl.jsxs=c,Xl}var X1;function ZM(){return X1||(X1=1,Qp.exports=XM()),Qp.exports}var l=ZM(),y=el();const fN=vy(y),lh=QM({__proto__:null,default:fN},[y]);var jd={},Xp={exports:{}},Sr={},Zp={exports:{}},Jp={};/** + */var X1;function XM(){if(X1)return Xl;X1=1;var e=tl(),t=Symbol.for("react.element"),r=Symbol.for("react.fragment"),n=Object.prototype.hasOwnProperty,a=e.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,o={key:!0,ref:!0,__self:!0,__source:!0};function c(u,f,h){var m,g={},v=null,b=null;h!==void 0&&(v=""+h),f.key!==void 0&&(v=""+f.key),f.ref!==void 0&&(b=f.ref);for(m in f)n.call(f,m)&&!o.hasOwnProperty(m)&&(g[m]=f[m]);if(u&&u.defaultProps)for(m in f=u.defaultProps,f)g[m]===void 0&&(g[m]=f[m]);return{$$typeof:t,type:u,key:v,ref:b,props:g,_owner:a.current}}return Xl.Fragment=r,Xl.jsx=c,Xl.jsxs=c,Xl}var Z1;function ZM(){return Z1||(Z1=1,Qp.exports=XM()),Qp.exports}var l=ZM(),y=tl();const yy=vy(y),lh=QM({__proto__:null,default:yy},[y]);var jd={},Xp={exports:{}},Sr={},Zp={exports:{}},Jp={};/** * @license React * scheduler.production.min.js * @@ -22,7 +22,7 @@ var VM=Object.defineProperty;var V1=e=>{throw TypeError(e)};var qM=(e,t,r)=>t in * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var Z1;function JM(){return Z1||(Z1=1,(function(e){function t(X,te){var J=X.length;X.push(te);e:for(;0>>1,M=X[I];if(0>>1;Ia(Z,J))mea(ge,Z)?(X[I]=ge,X[me]=J,I=me):(X[I]=Z,X[ne]=J,I=ne);else if(mea(ge,J))X[I]=ge,X[me]=J,I=me;else break e}}return te}function a(X,te){var J=X.sortIndex-te.sortIndex;return J!==0?J:X.id-te.id}if(typeof performance=="object"&&typeof performance.now=="function"){var o=performance;e.unstable_now=function(){return o.now()}}else{var c=Date,u=c.now();e.unstable_now=function(){return c.now()-u}}var f=[],h=[],m=1,g=null,v=3,b=!1,j=!1,k=!1,S=typeof setTimeout=="function"?setTimeout:null,N=typeof clearTimeout=="function"?clearTimeout:null,E=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function A(X){for(var te=r(h);te!==null;){if(te.callback===null)n(h);else if(te.startTime<=X)n(h),te.sortIndex=te.expirationTime,t(f,te);else break;te=r(h)}}function P(X){if(k=!1,A(X),!j)if(r(f)!==null)j=!0,ae(_);else{var te=r(h);te!==null&&se(P,te.startTime-X)}}function _(X,te){j=!1,k&&(k=!1,N(U),U=-1),b=!0;var J=v;try{for(A(te),g=r(f);g!==null&&(!(g.expirationTime>te)||X&&!Y());){var I=g.callback;if(typeof I=="function"){g.callback=null,v=g.priorityLevel;var M=I(g.expirationTime<=te);te=e.unstable_now(),typeof M=="function"?g.callback=M:g===r(f)&&n(f),A(te)}else n(f);g=r(f)}if(g!==null)var K=!0;else{var ne=r(h);ne!==null&&se(P,ne.startTime-te),K=!1}return K}finally{g=null,v=J,b=!1}}var O=!1,D=null,U=-1,B=5,F=-1;function Y(){return!(e.unstable_now()-FX||125I?(X.sortIndex=J,t(h,X),r(f)===null&&X===r(h)&&(k?(N(U),U=-1):k=!0,se(P,J-I))):(X.sortIndex=M,t(f,X),j||b||(j=!0,ae(_))),X},e.unstable_shouldYield=Y,e.unstable_wrapCallback=function(X){var te=v;return function(){var J=v;v=te;try{return X.apply(this,arguments)}finally{v=J}}}})(Jp)),Jp}var J1;function e3(){return J1||(J1=1,Zp.exports=JM()),Zp.exports}/** + */var J1;function JM(){return J1||(J1=1,(function(e){function t(X,te){var J=X.length;X.push(te);e:for(;0>>1,M=X[I];if(0>>1;Ia(Z,J))mea(ge,Z)?(X[I]=ge,X[me]=J,I=me):(X[I]=Z,X[ne]=J,I=ne);else if(mea(ge,J))X[I]=ge,X[me]=J,I=me;else break e}}return te}function a(X,te){var J=X.sortIndex-te.sortIndex;return J!==0?J:X.id-te.id}if(typeof performance=="object"&&typeof performance.now=="function"){var o=performance;e.unstable_now=function(){return o.now()}}else{var c=Date,u=c.now();e.unstable_now=function(){return c.now()-u}}var f=[],h=[],m=1,g=null,v=3,b=!1,j=!1,k=!1,S=typeof setTimeout=="function"?setTimeout:null,N=typeof clearTimeout=="function"?clearTimeout:null,E=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function A(X){for(var te=r(h);te!==null;){if(te.callback===null)n(h);else if(te.startTime<=X)n(h),te.sortIndex=te.expirationTime,t(f,te);else break;te=r(h)}}function P(X){if(k=!1,A(X),!j)if(r(f)!==null)j=!0,ae(_);else{var te=r(h);te!==null&&se(P,te.startTime-X)}}function _(X,te){j=!1,k&&(k=!1,N(U),U=-1),b=!0;var J=v;try{for(A(te),g=r(f);g!==null&&(!(g.expirationTime>te)||X&&!Y());){var I=g.callback;if(typeof I=="function"){g.callback=null,v=g.priorityLevel;var M=I(g.expirationTime<=te);te=e.unstable_now(),typeof M=="function"?g.callback=M:g===r(f)&&n(f),A(te)}else n(f);g=r(f)}if(g!==null)var K=!0;else{var ne=r(h);ne!==null&&se(P,ne.startTime-te),K=!1}return K}finally{g=null,v=J,b=!1}}var O=!1,D=null,U=-1,B=5,F=-1;function Y(){return!(e.unstable_now()-FX||125I?(X.sortIndex=J,t(h,X),r(f)===null&&X===r(h)&&(k?(N(U),U=-1):k=!0,se(P,J-I))):(X.sortIndex=M,t(f,X),j||b||(j=!0,ae(_))),X},e.unstable_shouldYield=Y,e.unstable_wrapCallback=function(X){var te=v;return function(){var J=v;v=te;try{return X.apply(this,arguments)}finally{v=J}}}})(Jp)),Jp}var ew;function e3(){return ew||(ew=1,Zp.exports=JM()),Zp.exports}/** * @license React * react-dom.production.min.js * @@ -30,14 +30,14 @@ var VM=Object.defineProperty;var V1=e=>{throw TypeError(e)};var qM=(e,t,r)=>t in * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var ew;function t3(){if(ew)return Sr;ew=1;var e=el(),t=e3();function r(i){for(var s="https://reactjs.org/docs/error-decoder.html?invariant="+i,d=1;d"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),f=Object.prototype.hasOwnProperty,h=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,m={},g={};function v(i){return f.call(g,i)?!0:f.call(m,i)?!1:h.test(i)?g[i]=!0:(m[i]=!0,!1)}function b(i,s,d,p){if(d!==null&&d.type===0)return!1;switch(typeof s){case"function":case"symbol":return!0;case"boolean":return p?!1:d!==null?!d.acceptsBooleans:(i=i.toLowerCase().slice(0,5),i!=="data-"&&i!=="aria-");default:return!1}}function j(i,s,d,p){if(s===null||typeof s>"u"||b(i,s,d,p))return!0;if(p)return!1;if(d!==null)switch(d.type){case 3:return!s;case 4:return s===!1;case 5:return isNaN(s);case 6:return isNaN(s)||1>s}return!1}function k(i,s,d,p,x,w,C){this.acceptsBooleans=s===2||s===3||s===4,this.attributeName=p,this.attributeNamespace=x,this.mustUseProperty=d,this.propertyName=i,this.type=s,this.sanitizeURL=w,this.removeEmptyString=C}var S={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(i){S[i]=new k(i,0,!1,i,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(i){var s=i[0];S[s]=new k(s,1,!1,i[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(i){S[i]=new k(i,2,!1,i.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(i){S[i]=new k(i,2,!1,i,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(i){S[i]=new k(i,3,!1,i.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(i){S[i]=new k(i,3,!0,i,null,!1,!1)}),["capture","download"].forEach(function(i){S[i]=new k(i,4,!1,i,null,!1,!1)}),["cols","rows","size","span"].forEach(function(i){S[i]=new k(i,6,!1,i,null,!1,!1)}),["rowSpan","start"].forEach(function(i){S[i]=new k(i,5,!1,i.toLowerCase(),null,!1,!1)});var N=/[\-:]([a-z])/g;function E(i){return i[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(i){var s=i.replace(N,E);S[s]=new k(s,1,!1,i,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(i){var s=i.replace(N,E);S[s]=new k(s,1,!1,i,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(i){var s=i.replace(N,E);S[s]=new k(s,1,!1,i,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(i){S[i]=new k(i,1,!1,i.toLowerCase(),null,!1,!1)}),S.xlinkHref=new k("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(i){S[i]=new k(i,1,!1,i.toLowerCase(),null,!0,!0)});function A(i,s,d,p){var x=S.hasOwnProperty(s)?S[s]:null;(x!==null?x.type!==0:p||!(2"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),f=Object.prototype.hasOwnProperty,h=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,m={},g={};function v(i){return f.call(g,i)?!0:f.call(m,i)?!1:h.test(i)?g[i]=!0:(m[i]=!0,!1)}function b(i,s,d,p){if(d!==null&&d.type===0)return!1;switch(typeof s){case"function":case"symbol":return!0;case"boolean":return p?!1:d!==null?!d.acceptsBooleans:(i=i.toLowerCase().slice(0,5),i!=="data-"&&i!=="aria-");default:return!1}}function j(i,s,d,p){if(s===null||typeof s>"u"||b(i,s,d,p))return!0;if(p)return!1;if(d!==null)switch(d.type){case 3:return!s;case 4:return s===!1;case 5:return isNaN(s);case 6:return isNaN(s)||1>s}return!1}function k(i,s,d,p,x,w,C){this.acceptsBooleans=s===2||s===3||s===4,this.attributeName=p,this.attributeNamespace=x,this.mustUseProperty=d,this.propertyName=i,this.type=s,this.sanitizeURL=w,this.removeEmptyString=C}var S={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(i){S[i]=new k(i,0,!1,i,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(i){var s=i[0];S[s]=new k(s,1,!1,i[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(i){S[i]=new k(i,2,!1,i.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(i){S[i]=new k(i,2,!1,i,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(i){S[i]=new k(i,3,!1,i.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(i){S[i]=new k(i,3,!0,i,null,!1,!1)}),["capture","download"].forEach(function(i){S[i]=new k(i,4,!1,i,null,!1,!1)}),["cols","rows","size","span"].forEach(function(i){S[i]=new k(i,6,!1,i,null,!1,!1)}),["rowSpan","start"].forEach(function(i){S[i]=new k(i,5,!1,i.toLowerCase(),null,!1,!1)});var N=/[\-:]([a-z])/g;function E(i){return i[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(i){var s=i.replace(N,E);S[s]=new k(s,1,!1,i,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(i){var s=i.replace(N,E);S[s]=new k(s,1,!1,i,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(i){var s=i.replace(N,E);S[s]=new k(s,1,!1,i,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(i){S[i]=new k(i,1,!1,i.toLowerCase(),null,!1,!1)}),S.xlinkHref=new k("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(i){S[i]=new k(i,1,!1,i.toLowerCase(),null,!0,!0)});function A(i,s,d,p){var x=S.hasOwnProperty(s)?S[s]:null;(x!==null?x.type!==0:p||!(2T||x[C]!==w[T]){var R=` -`+x[C].replace(" at new "," at ");return i.displayName&&R.includes("")&&(R=R.replace("",i.displayName)),R}while(1<=C&&0<=T);break}}}finally{K=!1,Error.prepareStackTrace=d}return(i=i?i.displayName||i.name:"")?M(i):""}function Z(i){switch(i.tag){case 5:return M(i.type);case 16:return M("Lazy");case 13:return M("Suspense");case 19:return M("SuspenseList");case 0:case 2:case 15:return i=ne(i.type,!1),i;case 11:return i=ne(i.type.render,!1),i;case 1:return i=ne(i.type,!0),i;default:return""}}function me(i){if(i==null)return null;if(typeof i=="function")return i.displayName||i.name||null;if(typeof i=="string")return i;switch(i){case D:return"Fragment";case O:return"Portal";case B:return"Profiler";case U:return"StrictMode";case pe:return"Suspense";case ue:return"SuspenseList"}if(typeof i=="object")switch(i.$$typeof){case Y:return(i.displayName||"Context")+".Consumer";case F:return(i._context.displayName||"Context")+".Provider";case H:var s=i.render;return i=i.displayName,i||(i=s.displayName||s.name||"",i=i!==""?"ForwardRef("+i+")":"ForwardRef"),i;case he:return s=i.displayName||null,s!==null?s:me(i.type)||"Memo";case ae:s=i._payload,i=i._init;try{return me(i(s))}catch{}}return null}function ge(i){var s=i.type;switch(i.tag){case 24:return"Cache";case 9:return(s.displayName||"Context")+".Consumer";case 10:return(s._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return i=s.render,i=i.displayName||i.name||"",s.displayName||(i!==""?"ForwardRef("+i+")":"ForwardRef");case 7:return"Fragment";case 5:return s;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return me(s);case 8:return s===U?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof s=="function")return s.displayName||s.name||null;if(typeof s=="string")return s}return null}function Pe(i){switch(typeof i){case"boolean":case"number":case"string":case"undefined":return i;case"object":return i;default:return""}}function re(i){var s=i.type;return(i=i.nodeName)&&i.toLowerCase()==="input"&&(s==="checkbox"||s==="radio")}function xe(i){var s=re(i)?"checked":"value",d=Object.getOwnPropertyDescriptor(i.constructor.prototype,s),p=""+i[s];if(!i.hasOwnProperty(s)&&typeof d<"u"&&typeof d.get=="function"&&typeof d.set=="function"){var x=d.get,w=d.set;return Object.defineProperty(i,s,{configurable:!0,get:function(){return x.call(this)},set:function(C){p=""+C,w.call(this,C)}}),Object.defineProperty(i,s,{enumerable:d.enumerable}),{getValue:function(){return p},setValue:function(C){p=""+C},stopTracking:function(){i._valueTracker=null,delete i[s]}}}}function _e(i){i._valueTracker||(i._valueTracker=xe(i))}function ie(i){if(!i)return!1;var s=i._valueTracker;if(!s)return!0;var d=s.getValue(),p="";return i&&(p=re(i)?i.checked?"true":"false":i.value),i=p,i!==d?(s.setValue(i),!0):!1}function Je(i){if(i=i||(typeof document<"u"?document:void 0),typeof i>"u")return null;try{return i.activeElement||i.body}catch{return i.body}}function Fe(i,s){var d=s.checked;return J({},s,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:d??i._wrapperState.initialChecked})}function Oe(i,s){var d=s.defaultValue==null?"":s.defaultValue,p=s.checked!=null?s.checked:s.defaultChecked;d=Pe(s.value!=null?s.value:d),i._wrapperState={initialChecked:p,initialValue:d,controlled:s.type==="checkbox"||s.type==="radio"?s.checked!=null:s.value!=null}}function ut(i,s){s=s.checked,s!=null&&A(i,"checked",s,!1)}function Jt(i,s){ut(i,s);var d=Pe(s.value),p=s.type;if(d!=null)p==="number"?(d===0&&i.value===""||i.value!=d)&&(i.value=""+d):i.value!==""+d&&(i.value=""+d);else if(p==="submit"||p==="reset"){i.removeAttribute("value");return}s.hasOwnProperty("value")?ke(i,s.type,d):s.hasOwnProperty("defaultValue")&&ke(i,s.type,Pe(s.defaultValue)),s.checked==null&&s.defaultChecked!=null&&(i.defaultChecked=!!s.defaultChecked)}function W(i,s,d){if(s.hasOwnProperty("value")||s.hasOwnProperty("defaultValue")){var p=s.type;if(!(p!=="submit"&&p!=="reset"||s.value!==void 0&&s.value!==null))return;s=""+i._wrapperState.initialValue,d||s===i.value||(i.value=s),i.defaultValue=s}d=i.name,d!==""&&(i.name=""),i.defaultChecked=!!i._wrapperState.initialChecked,d!==""&&(i.name=d)}function ke(i,s,d){(s!=="number"||Je(i.ownerDocument)!==i)&&(d==null?i.defaultValue=""+i._wrapperState.initialValue:i.defaultValue!==""+d&&(i.defaultValue=""+d))}var Ae=Array.isArray;function Be(i,s,d,p){if(i=i.options,s){s={};for(var x=0;x"+s.valueOf().toString()+"",s=Ii.firstChild;i.firstChild;)i.removeChild(i.firstChild);for(;s.firstChild;)i.appendChild(s.firstChild)}});function Ti(i,s){if(s){var d=i.firstChild;if(d&&d===i.lastChild&&d.nodeType===3){d.nodeValue=s;return}}i.textContent=s}var $={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Le=["Webkit","ms","Moz","O"];Object.keys($).forEach(function(i){Le.forEach(function(s){s=s+i.charAt(0).toUpperCase()+i.substring(1),$[s]=$[i]})});function cr(i,s,d){return s==null||typeof s=="boolean"||s===""?"":d||typeof s!="number"||s===0||$.hasOwnProperty(i)&&$[i]?(""+s).trim():s+"px"}function hc(i,s){i=i.style;for(var d in s)if(s.hasOwnProperty(d)){var p=d.indexOf("--")===0,x=cr(d,s[d],p);d==="float"&&(d="cssFloat"),p?i.setProperty(d,x):i[d]=x}}var mc=J({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function _r(i,s){if(s){if(mc[i]&&(s.children!=null||s.dangerouslySetInnerHTML!=null))throw Error(r(137,i));if(s.dangerouslySetInnerHTML!=null){if(s.children!=null)throw Error(r(60));if(typeof s.dangerouslySetInnerHTML!="object"||!("__html"in s.dangerouslySetInnerHTML))throw Error(r(61))}if(s.style!=null&&typeof s.style!="object")throw Error(r(62))}}function sm(i,s){if(i.indexOf("-")===-1)return typeof s.is=="string";switch(i){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var lm=null;function um(i){return i=i.target||i.srcElement||window,i.correspondingUseElement&&(i=i.correspondingUseElement),i.nodeType===3?i.parentNode:i}var cm=null,To=null,Do=null;function cx(i){if(i=Dl(i)){if(typeof cm!="function")throw Error(r(280));var s=i.stateNode;s&&(s=Lc(s),cm(i.stateNode,i.type,s))}}function dx(i){To?Do?Do.push(i):Do=[i]:To=i}function fx(){if(To){var i=To,s=Do;if(Do=To=null,cx(i),s)for(i=0;i>>=0,i===0?32:31-(u_(i)/c_|0)|0}var xc=64,bc=4194304;function vl(i){switch(i&-i){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: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 i&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return i&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return i}}function wc(i,s){var d=i.pendingLanes;if(d===0)return 0;var p=0,x=i.suspendedLanes,w=i.pingedLanes,C=d&268435455;if(C!==0){var T=C&~x;T!==0?p=vl(T):(w&=C,w!==0&&(p=vl(w)))}else C=d&~x,C!==0?p=vl(C):w!==0&&(p=vl(w));if(p===0)return 0;if(s!==0&&s!==p&&(s&x)===0&&(x=p&-p,w=s&-s,x>=w||x===16&&(w&4194240)!==0))return s;if((p&4)!==0&&(p|=d&16),s=i.entangledLanes,s!==0)for(i=i.entanglements,s&=p;0d;d++)s.push(i);return s}function yl(i,s,d){i.pendingLanes|=s,s!==536870912&&(i.suspendedLanes=0,i.pingedLanes=0),i=i.eventTimes,s=31-un(s),i[s]=d}function m_(i,s){var d=i.pendingLanes&~s;i.pendingLanes=s,i.suspendedLanes=0,i.pingedLanes=0,i.expiredLanes&=s,i.mutableReadLanes&=s,i.entangledLanes&=s,s=i.entanglements;var p=i.eventTimes;for(i=i.expirationTimes;0=El),Fx=" ",Bx=!1;function Ux(i,s){switch(i){case"keyup":return U_.indexOf(s.keyCode)!==-1;case"keydown":return s.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Hx(i){return i=i.detail,typeof i=="object"&&"data"in i?i.data:null}var $o=!1;function W_(i,s){switch(i){case"compositionend":return Hx(s);case"keypress":return s.which!==32?null:(Bx=!0,Fx);case"textInput":return i=s.data,i===Fx&&Bx?null:i;default:return null}}function K_(i,s){if($o)return i==="compositionend"||!Cm&&Ux(i,s)?(i=Tx(),Ec=km=zi=null,$o=!1,i):null;switch(i){case"paste":return null;case"keypress":if(!(s.ctrlKey||s.altKey||s.metaKey)||s.ctrlKey&&s.altKey){if(s.char&&1=s)return{node:d,offset:s-i};i=p}e:{for(;d;){if(d.nextSibling){d=d.nextSibling;break e}d=d.parentNode}d=void 0}d=Yx(d)}}function Zx(i,s){return i&&s?i===s?!0:i&&i.nodeType===3?!1:s&&s.nodeType===3?Zx(i,s.parentNode):"contains"in i?i.contains(s):i.compareDocumentPosition?!!(i.compareDocumentPosition(s)&16):!1:!1}function Jx(){for(var i=window,s=Je();s instanceof i.HTMLIFrameElement;){try{var d=typeof s.contentWindow.location.href=="string"}catch{d=!1}if(d)i=s.contentWindow;else break;s=Je(i.document)}return s}function _m(i){var s=i&&i.nodeName&&i.nodeName.toLowerCase();return s&&(s==="input"&&(i.type==="text"||i.type==="search"||i.type==="tel"||i.type==="url"||i.type==="password")||s==="textarea"||i.contentEditable==="true")}function eM(i){var s=Jx(),d=i.focusedElem,p=i.selectionRange;if(s!==d&&d&&d.ownerDocument&&Zx(d.ownerDocument.documentElement,d)){if(p!==null&&_m(d)){if(s=p.start,i=p.end,i===void 0&&(i=s),"selectionStart"in d)d.selectionStart=s,d.selectionEnd=Math.min(i,d.value.length);else if(i=(s=d.ownerDocument||document)&&s.defaultView||window,i.getSelection){i=i.getSelection();var x=d.textContent.length,w=Math.min(p.start,x);p=p.end===void 0?w:Math.min(p.end,x),!i.extend&&w>p&&(x=p,p=w,w=x),x=Xx(d,w);var C=Xx(d,p);x&&C&&(i.rangeCount!==1||i.anchorNode!==x.node||i.anchorOffset!==x.offset||i.focusNode!==C.node||i.focusOffset!==C.offset)&&(s=s.createRange(),s.setStart(x.node,x.offset),i.removeAllRanges(),w>p?(i.addRange(s),i.extend(C.node,C.offset)):(s.setEnd(C.node,C.offset),i.addRange(s)))}}for(s=[],i=d;i=i.parentNode;)i.nodeType===1&&s.push({element:i,left:i.scrollLeft,top:i.scrollTop});for(typeof d.focus=="function"&&d.focus(),d=0;d=document.documentMode,zo=null,Mm=null,Ol=null,Im=!1;function eb(i,s,d){var p=d.window===d?d.document:d.nodeType===9?d:d.ownerDocument;Im||zo==null||zo!==Je(p)||(p=zo,"selectionStart"in p&&_m(p)?p={start:p.selectionStart,end:p.selectionEnd}:(p=(p.ownerDocument&&p.ownerDocument.defaultView||window).getSelection(),p={anchorNode:p.anchorNode,anchorOffset:p.anchorOffset,focusNode:p.focusNode,focusOffset:p.focusOffset}),Ol&&Pl(Ol,p)||(Ol=p,p=Tc(Mm,"onSelect"),0Wo||(i.current=Km[Wo],Km[Wo]=null,Wo--)}function rt(i,s){Wo++,Km[Wo]=i.current,i.current=s}var Hi={},er=Ui(Hi),xr=Ui(!1),_a=Hi;function Ko(i,s){var d=i.type.contextTypes;if(!d)return Hi;var p=i.stateNode;if(p&&p.__reactInternalMemoizedUnmaskedChildContext===s)return p.__reactInternalMemoizedMaskedChildContext;var x={},w;for(w in d)x[w]=s[w];return p&&(i=i.stateNode,i.__reactInternalMemoizedUnmaskedChildContext=s,i.__reactInternalMemoizedMaskedChildContext=x),x}function br(i){return i=i.childContextTypes,i!=null}function $c(){at(xr),at(er)}function pb(i,s,d){if(er.current!==Hi)throw Error(r(168));rt(er,s),rt(xr,d)}function gb(i,s,d){var p=i.stateNode;if(s=s.childContextTypes,typeof p.getChildContext!="function")return d;p=p.getChildContext();for(var x in p)if(!(x in s))throw Error(r(108,ge(i)||"Unknown",x));return J({},d,p)}function zc(i){return i=(i=i.stateNode)&&i.__reactInternalMemoizedMergedChildContext||Hi,_a=er.current,rt(er,i),rt(xr,xr.current),!0}function vb(i,s,d){var p=i.stateNode;if(!p)throw Error(r(169));d?(i=gb(i,s,_a),p.__reactInternalMemoizedMergedChildContext=i,at(xr),at(er),rt(er,i)):at(xr),rt(xr,d)}var ti=null,Fc=!1,Gm=!1;function yb(i){ti===null?ti=[i]:ti.push(i)}function fM(i){Fc=!0,yb(i)}function Wi(){if(!Gm&&ti!==null){Gm=!0;var i=0,s=Ze;try{var d=ti;for(Ze=1;i>=C,x-=C,ri=1<<32-un(s)+x|d<Re?(Tt=Te,Te=null):Tt=Te.sibling;var Qe=oe(G,Te,V[Re],fe);if(Qe===null){Te===null&&(Te=Tt);break}i&&Te&&Qe.alternate===null&&s(G,Te),z=w(Qe,z,Re),Ie===null?Ce=Qe:Ie.sibling=Qe,Ie=Qe,Te=Tt}if(Re===V.length)return d(G,Te),ct&&Ia(G,Re),Ce;if(Te===null){for(;ReRe?(Tt=Te,Te=null):Tt=Te.sibling;var Ji=oe(G,Te,Qe.value,fe);if(Ji===null){Te===null&&(Te=Tt);break}i&&Te&&Ji.alternate===null&&s(G,Te),z=w(Ji,z,Re),Ie===null?Ce=Ji:Ie.sibling=Ji,Ie=Ji,Te=Tt}if(Qe.done)return d(G,Te),ct&&Ia(G,Re),Ce;if(Te===null){for(;!Qe.done;Re++,Qe=V.next())Qe=ce(G,Qe.value,fe),Qe!==null&&(z=w(Qe,z,Re),Ie===null?Ce=Qe:Ie.sibling=Qe,Ie=Qe);return ct&&Ia(G,Re),Ce}for(Te=p(G,Te);!Qe.done;Re++,Qe=V.next())Qe=ve(Te,G,Re,Qe.value,fe),Qe!==null&&(i&&Qe.alternate!==null&&Te.delete(Qe.key===null?Re:Qe.key),z=w(Qe,z,Re),Ie===null?Ce=Qe:Ie.sibling=Qe,Ie=Qe);return i&&Te.forEach(function(GM){return s(G,GM)}),ct&&Ia(G,Re),Ce}function wt(G,z,V,fe){if(typeof V=="object"&&V!==null&&V.type===D&&V.key===null&&(V=V.props.children),typeof V=="object"&&V!==null){switch(V.$$typeof){case _:e:{for(var Ce=V.key,Ie=z;Ie!==null;){if(Ie.key===Ce){if(Ce=V.type,Ce===D){if(Ie.tag===7){d(G,Ie.sibling),z=x(Ie,V.props.children),z.return=G,G=z;break e}}else if(Ie.elementType===Ce||typeof Ce=="object"&&Ce!==null&&Ce.$$typeof===ae&&Sb(Ce)===Ie.type){d(G,Ie.sibling),z=x(Ie,V.props),z.ref=Rl(G,Ie,V),z.return=G,G=z;break e}d(G,Ie);break}else s(G,Ie);Ie=Ie.sibling}V.type===D?(z=Ba(V.props.children,G.mode,fe,V.key),z.return=G,G=z):(fe=md(V.type,V.key,V.props,null,G.mode,fe),fe.ref=Rl(G,z,V),fe.return=G,G=fe)}return C(G);case O:e:{for(Ie=V.key;z!==null;){if(z.key===Ie)if(z.tag===4&&z.stateNode.containerInfo===V.containerInfo&&z.stateNode.implementation===V.implementation){d(G,z.sibling),z=x(z,V.children||[]),z.return=G,G=z;break e}else{d(G,z);break}else s(G,z);z=z.sibling}z=Hp(V,G.mode,fe),z.return=G,G=z}return C(G);case ae:return Ie=V._init,wt(G,z,Ie(V._payload),fe)}if(Ae(V))return je(G,z,V,fe);if(te(V))return Ne(G,z,V,fe);Wc(G,V)}return typeof V=="string"&&V!==""||typeof V=="number"?(V=""+V,z!==null&&z.tag===6?(d(G,z.sibling),z=x(z,V),z.return=G,G=z):(d(G,z),z=Up(V,G.mode,fe),z.return=G,G=z),C(G)):d(G,z)}return wt}var Qo=Nb(!0),Eb=Nb(!1),Kc=Ui(null),Gc=null,Yo=null,Zm=null;function Jm(){Zm=Yo=Gc=null}function ep(i){var s=Kc.current;at(Kc),i._currentValue=s}function tp(i,s,d){for(;i!==null;){var p=i.alternate;if((i.childLanes&s)!==s?(i.childLanes|=s,p!==null&&(p.childLanes|=s)):p!==null&&(p.childLanes&s)!==s&&(p.childLanes|=s),i===d)break;i=i.return}}function Xo(i,s){Gc=i,Zm=Yo=null,i=i.dependencies,i!==null&&i.firstContext!==null&&((i.lanes&s)!==0&&(wr=!0),i.firstContext=null)}function Vr(i){var s=i._currentValue;if(Zm!==i)if(i={context:i,memoizedValue:s,next:null},Yo===null){if(Gc===null)throw Error(r(308));Yo=i,Gc.dependencies={lanes:0,firstContext:i}}else Yo=Yo.next=i;return s}var Ta=null;function rp(i){Ta===null?Ta=[i]:Ta.push(i)}function Ab(i,s,d,p){var x=s.interleaved;return x===null?(d.next=d,rp(s)):(d.next=x.next,x.next=d),s.interleaved=d,ii(i,p)}function ii(i,s){i.lanes|=s;var d=i.alternate;for(d!==null&&(d.lanes|=s),d=i,i=i.return;i!==null;)i.childLanes|=s,d=i.alternate,d!==null&&(d.childLanes|=s),d=i,i=i.return;return d.tag===3?d.stateNode:null}var Ki=!1;function np(i){i.updateQueue={baseState:i.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Cb(i,s){i=i.updateQueue,s.updateQueue===i&&(s.updateQueue={baseState:i.baseState,firstBaseUpdate:i.firstBaseUpdate,lastBaseUpdate:i.lastBaseUpdate,shared:i.shared,effects:i.effects})}function ai(i,s){return{eventTime:i,lane:s,tag:0,payload:null,callback:null,next:null}}function Gi(i,s,d){var p=i.updateQueue;if(p===null)return null;if(p=p.shared,(qe&2)!==0){var x=p.pending;return x===null?s.next=s:(s.next=x.next,x.next=s),p.pending=s,ii(i,d)}return x=p.interleaved,x===null?(s.next=s,rp(p)):(s.next=x.next,x.next=s),p.interleaved=s,ii(i,d)}function Vc(i,s,d){if(s=s.updateQueue,s!==null&&(s=s.shared,(d&4194240)!==0)){var p=s.lanes;p&=i.pendingLanes,d|=p,s.lanes=d,vm(i,d)}}function Pb(i,s){var d=i.updateQueue,p=i.alternate;if(p!==null&&(p=p.updateQueue,d===p)){var x=null,w=null;if(d=d.firstBaseUpdate,d!==null){do{var C={eventTime:d.eventTime,lane:d.lane,tag:d.tag,payload:d.payload,callback:d.callback,next:null};w===null?x=w=C:w=w.next=C,d=d.next}while(d!==null);w===null?x=w=s:w=w.next=s}else x=w=s;d={baseState:p.baseState,firstBaseUpdate:x,lastBaseUpdate:w,shared:p.shared,effects:p.effects},i.updateQueue=d;return}i=d.lastBaseUpdate,i===null?d.firstBaseUpdate=s:i.next=s,d.lastBaseUpdate=s}function qc(i,s,d,p){var x=i.updateQueue;Ki=!1;var w=x.firstBaseUpdate,C=x.lastBaseUpdate,T=x.shared.pending;if(T!==null){x.shared.pending=null;var R=T,Q=R.next;R.next=null,C===null?w=Q:C.next=Q,C=R;var le=i.alternate;le!==null&&(le=le.updateQueue,T=le.lastBaseUpdate,T!==C&&(T===null?le.firstBaseUpdate=Q:T.next=Q,le.lastBaseUpdate=R))}if(w!==null){var ce=x.baseState;C=0,le=Q=R=null,T=w;do{var oe=T.lane,ve=T.eventTime;if((p&oe)===oe){le!==null&&(le=le.next={eventTime:ve,lane:0,tag:T.tag,payload:T.payload,callback:T.callback,next:null});e:{var je=i,Ne=T;switch(oe=s,ve=d,Ne.tag){case 1:if(je=Ne.payload,typeof je=="function"){ce=je.call(ve,ce,oe);break e}ce=je;break e;case 3:je.flags=je.flags&-65537|128;case 0:if(je=Ne.payload,oe=typeof je=="function"?je.call(ve,ce,oe):je,oe==null)break e;ce=J({},ce,oe);break e;case 2:Ki=!0}}T.callback!==null&&T.lane!==0&&(i.flags|=64,oe=x.effects,oe===null?x.effects=[T]:oe.push(T))}else ve={eventTime:ve,lane:oe,tag:T.tag,payload:T.payload,callback:T.callback,next:null},le===null?(Q=le=ve,R=ce):le=le.next=ve,C|=oe;if(T=T.next,T===null){if(T=x.shared.pending,T===null)break;oe=T,T=oe.next,oe.next=null,x.lastBaseUpdate=oe,x.shared.pending=null}}while(!0);if(le===null&&(R=ce),x.baseState=R,x.firstBaseUpdate=Q,x.lastBaseUpdate=le,s=x.shared.interleaved,s!==null){x=s;do C|=x.lane,x=x.next;while(x!==s)}else w===null&&(x.shared.lanes=0);La|=C,i.lanes=C,i.memoizedState=ce}}function Ob(i,s,d){if(i=s.effects,s.effects=null,i!==null)for(s=0;sd?d:4,i(!0);var p=lp.transition;lp.transition={};try{i(!1),s()}finally{Ze=d,lp.transition=p}}function Qb(){return qr().memoizedState}function gM(i,s,d){var p=Yi(i);if(d={lane:p,action:d,hasEagerState:!1,eagerState:null,next:null},Yb(i))Xb(s,d);else if(d=Ab(i,s,d,p),d!==null){var x=fr();pn(d,i,p,x),Zb(d,s,p)}}function vM(i,s,d){var p=Yi(i),x={lane:p,action:d,hasEagerState:!1,eagerState:null,next:null};if(Yb(i))Xb(s,x);else{var w=i.alternate;if(i.lanes===0&&(w===null||w.lanes===0)&&(w=s.lastRenderedReducer,w!==null))try{var C=s.lastRenderedState,T=w(C,d);if(x.hasEagerState=!0,x.eagerState=T,cn(T,C)){var R=s.interleaved;R===null?(x.next=x,rp(s)):(x.next=R.next,R.next=x),s.interleaved=x;return}}catch{}finally{}d=Ab(i,s,x,p),d!==null&&(x=fr(),pn(d,i,p,x),Zb(d,s,p))}}function Yb(i){var s=i.alternate;return i===pt||s!==null&&s===pt}function Xb(i,s){Fl=Xc=!0;var d=i.pending;d===null?s.next=s:(s.next=d.next,d.next=s),i.pending=s}function Zb(i,s,d){if((d&4194240)!==0){var p=s.lanes;p&=i.pendingLanes,d|=p,s.lanes=d,vm(i,d)}}var ed={readContext:Vr,useCallback:tr,useContext:tr,useEffect:tr,useImperativeHandle:tr,useInsertionEffect:tr,useLayoutEffect:tr,useMemo:tr,useReducer:tr,useRef:tr,useState:tr,useDebugValue:tr,useDeferredValue:tr,useTransition:tr,useMutableSource:tr,useSyncExternalStore:tr,useId:tr,unstable_isNewReconciler:!1},yM={readContext:Vr,useCallback:function(i,s){return Pn().memoizedState=[i,s===void 0?null:s],i},useContext:Vr,useEffect:Bb,useImperativeHandle:function(i,s,d){return d=d!=null?d.concat([i]):null,Zc(4194308,4,Wb.bind(null,s,i),d)},useLayoutEffect:function(i,s){return Zc(4194308,4,i,s)},useInsertionEffect:function(i,s){return Zc(4,2,i,s)},useMemo:function(i,s){var d=Pn();return s=s===void 0?null:s,i=i(),d.memoizedState=[i,s],i},useReducer:function(i,s,d){var p=Pn();return s=d!==void 0?d(s):s,p.memoizedState=p.baseState=s,i={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:i,lastRenderedState:s},p.queue=i,i=i.dispatch=gM.bind(null,pt,i),[p.memoizedState,i]},useRef:function(i){var s=Pn();return i={current:i},s.memoizedState=i},useState:zb,useDebugValue:pp,useDeferredValue:function(i){return Pn().memoizedState=i},useTransition:function(){var i=zb(!1),s=i[0];return i=pM.bind(null,i[1]),Pn().memoizedState=i,[s,i]},useMutableSource:function(){},useSyncExternalStore:function(i,s,d){var p=pt,x=Pn();if(ct){if(d===void 0)throw Error(r(407));d=d()}else{if(d=s(),It===null)throw Error(r(349));(Ra&30)!==0||Tb(p,s,d)}x.memoizedState=d;var w={value:d,getSnapshot:s};return x.queue=w,Bb(Rb.bind(null,p,w,i),[i]),p.flags|=2048,Hl(9,Db.bind(null,p,w,d,s),void 0,null),d},useId:function(){var i=Pn(),s=It.identifierPrefix;if(ct){var d=ni,p=ri;d=(p&~(1<<32-un(p)-1)).toString(32)+d,s=":"+s+"R"+d,d=Bl++,0")&&(R=R.replace("",i.displayName)),R}while(1<=C&&0<=T);break}}}finally{K=!1,Error.prepareStackTrace=d}return(i=i?i.displayName||i.name:"")?M(i):""}function Z(i){switch(i.tag){case 5:return M(i.type);case 16:return M("Lazy");case 13:return M("Suspense");case 19:return M("SuspenseList");case 0:case 2:case 15:return i=ne(i.type,!1),i;case 11:return i=ne(i.type.render,!1),i;case 1:return i=ne(i.type,!0),i;default:return""}}function me(i){if(i==null)return null;if(typeof i=="function")return i.displayName||i.name||null;if(typeof i=="string")return i;switch(i){case D:return"Fragment";case O:return"Portal";case B:return"Profiler";case U:return"StrictMode";case pe:return"Suspense";case ue:return"SuspenseList"}if(typeof i=="object")switch(i.$$typeof){case Y:return(i.displayName||"Context")+".Consumer";case F:return(i._context.displayName||"Context")+".Provider";case H:var s=i.render;return i=i.displayName,i||(i=s.displayName||s.name||"",i=i!==""?"ForwardRef("+i+")":"ForwardRef"),i;case he:return s=i.displayName||null,s!==null?s:me(i.type)||"Memo";case ae:s=i._payload,i=i._init;try{return me(i(s))}catch{}}return null}function ge(i){var s=i.type;switch(i.tag){case 24:return"Cache";case 9:return(s.displayName||"Context")+".Consumer";case 10:return(s._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return i=s.render,i=i.displayName||i.name||"",s.displayName||(i!==""?"ForwardRef("+i+")":"ForwardRef");case 7:return"Fragment";case 5:return s;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return me(s);case 8:return s===U?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof s=="function")return s.displayName||s.name||null;if(typeof s=="string")return s}return null}function Pe(i){switch(typeof i){case"boolean":case"number":case"string":case"undefined":return i;case"object":return i;default:return""}}function re(i){var s=i.type;return(i=i.nodeName)&&i.toLowerCase()==="input"&&(s==="checkbox"||s==="radio")}function xe(i){var s=re(i)?"checked":"value",d=Object.getOwnPropertyDescriptor(i.constructor.prototype,s),p=""+i[s];if(!i.hasOwnProperty(s)&&typeof d<"u"&&typeof d.get=="function"&&typeof d.set=="function"){var x=d.get,w=d.set;return Object.defineProperty(i,s,{configurable:!0,get:function(){return x.call(this)},set:function(C){p=""+C,w.call(this,C)}}),Object.defineProperty(i,s,{enumerable:d.enumerable}),{getValue:function(){return p},setValue:function(C){p=""+C},stopTracking:function(){i._valueTracker=null,delete i[s]}}}}function _e(i){i._valueTracker||(i._valueTracker=xe(i))}function ie(i){if(!i)return!1;var s=i._valueTracker;if(!s)return!0;var d=s.getValue(),p="";return i&&(p=re(i)?i.checked?"true":"false":i.value),i=p,i!==d?(s.setValue(i),!0):!1}function Je(i){if(i=i||(typeof document<"u"?document:void 0),typeof i>"u")return null;try{return i.activeElement||i.body}catch{return i.body}}function Fe(i,s){var d=s.checked;return J({},s,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:d??i._wrapperState.initialChecked})}function Oe(i,s){var d=s.defaultValue==null?"":s.defaultValue,p=s.checked!=null?s.checked:s.defaultChecked;d=Pe(s.value!=null?s.value:d),i._wrapperState={initialChecked:p,initialValue:d,controlled:s.type==="checkbox"||s.type==="radio"?s.checked!=null:s.value!=null}}function ut(i,s){s=s.checked,s!=null&&A(i,"checked",s,!1)}function Jt(i,s){ut(i,s);var d=Pe(s.value),p=s.type;if(d!=null)p==="number"?(d===0&&i.value===""||i.value!=d)&&(i.value=""+d):i.value!==""+d&&(i.value=""+d);else if(p==="submit"||p==="reset"){i.removeAttribute("value");return}s.hasOwnProperty("value")?ke(i,s.type,d):s.hasOwnProperty("defaultValue")&&ke(i,s.type,Pe(s.defaultValue)),s.checked==null&&s.defaultChecked!=null&&(i.defaultChecked=!!s.defaultChecked)}function W(i,s,d){if(s.hasOwnProperty("value")||s.hasOwnProperty("defaultValue")){var p=s.type;if(!(p!=="submit"&&p!=="reset"||s.value!==void 0&&s.value!==null))return;s=""+i._wrapperState.initialValue,d||s===i.value||(i.value=s),i.defaultValue=s}d=i.name,d!==""&&(i.name=""),i.defaultChecked=!!i._wrapperState.initialChecked,d!==""&&(i.name=d)}function ke(i,s,d){(s!=="number"||Je(i.ownerDocument)!==i)&&(d==null?i.defaultValue=""+i._wrapperState.initialValue:i.defaultValue!==""+d&&(i.defaultValue=""+d))}var Ae=Array.isArray;function Be(i,s,d,p){if(i=i.options,s){s={};for(var x=0;x"+s.valueOf().toString()+"",s=Ii.firstChild;i.firstChild;)i.removeChild(i.firstChild);for(;s.firstChild;)i.appendChild(s.firstChild)}});function Ti(i,s){if(s){var d=i.firstChild;if(d&&d===i.lastChild&&d.nodeType===3){d.nodeValue=s;return}}i.textContent=s}var $={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Le=["Webkit","ms","Moz","O"];Object.keys($).forEach(function(i){Le.forEach(function(s){s=s+i.charAt(0).toUpperCase()+i.substring(1),$[s]=$[i]})});function cr(i,s,d){return s==null||typeof s=="boolean"||s===""?"":d||typeof s!="number"||s===0||$.hasOwnProperty(i)&&$[i]?(""+s).trim():s+"px"}function hc(i,s){i=i.style;for(var d in s)if(s.hasOwnProperty(d)){var p=d.indexOf("--")===0,x=cr(d,s[d],p);d==="float"&&(d="cssFloat"),p?i.setProperty(d,x):i[d]=x}}var mc=J({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function _r(i,s){if(s){if(mc[i]&&(s.children!=null||s.dangerouslySetInnerHTML!=null))throw Error(r(137,i));if(s.dangerouslySetInnerHTML!=null){if(s.children!=null)throw Error(r(60));if(typeof s.dangerouslySetInnerHTML!="object"||!("__html"in s.dangerouslySetInnerHTML))throw Error(r(61))}if(s.style!=null&&typeof s.style!="object")throw Error(r(62))}}function sm(i,s){if(i.indexOf("-")===-1)return typeof s.is=="string";switch(i){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var lm=null;function um(i){return i=i.target||i.srcElement||window,i.correspondingUseElement&&(i=i.correspondingUseElement),i.nodeType===3?i.parentNode:i}var cm=null,To=null,Do=null;function dx(i){if(i=Rl(i)){if(typeof cm!="function")throw Error(r(280));var s=i.stateNode;s&&(s=Lc(s),cm(i.stateNode,i.type,s))}}function fx(i){To?Do?Do.push(i):Do=[i]:To=i}function hx(){if(To){var i=To,s=Do;if(Do=To=null,dx(i),s)for(i=0;i>>=0,i===0?32:31-(u_(i)/c_|0)|0}var xc=64,bc=4194304;function yl(i){switch(i&-i){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: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 i&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return i&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return i}}function wc(i,s){var d=i.pendingLanes;if(d===0)return 0;var p=0,x=i.suspendedLanes,w=i.pingedLanes,C=d&268435455;if(C!==0){var T=C&~x;T!==0?p=yl(T):(w&=C,w!==0&&(p=yl(w)))}else C=d&~x,C!==0?p=yl(C):w!==0&&(p=yl(w));if(p===0)return 0;if(s!==0&&s!==p&&(s&x)===0&&(x=p&-p,w=s&-s,x>=w||x===16&&(w&4194240)!==0))return s;if((p&4)!==0&&(p|=d&16),s=i.entangledLanes,s!==0)for(i=i.entanglements,s&=p;0d;d++)s.push(i);return s}function xl(i,s,d){i.pendingLanes|=s,s!==536870912&&(i.suspendedLanes=0,i.pingedLanes=0),i=i.eventTimes,s=31-un(s),i[s]=d}function m_(i,s){var d=i.pendingLanes&~s;i.pendingLanes=s,i.suspendedLanes=0,i.pingedLanes=0,i.expiredLanes&=s,i.mutableReadLanes&=s,i.entangledLanes&=s,s=i.entanglements;var p=i.eventTimes;for(i=i.expirationTimes;0=Al),Bx=" ",Ux=!1;function Hx(i,s){switch(i){case"keyup":return U_.indexOf(s.keyCode)!==-1;case"keydown":return s.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Wx(i){return i=i.detail,typeof i=="object"&&"data"in i?i.data:null}var $o=!1;function W_(i,s){switch(i){case"compositionend":return Wx(s);case"keypress":return s.which!==32?null:(Ux=!0,Bx);case"textInput":return i=s.data,i===Bx&&Ux?null:i;default:return null}}function K_(i,s){if($o)return i==="compositionend"||!Cm&&Hx(i,s)?(i=Dx(),Ec=km=zi=null,$o=!1,i):null;switch(i){case"paste":return null;case"keypress":if(!(s.ctrlKey||s.altKey||s.metaKey)||s.ctrlKey&&s.altKey){if(s.char&&1=s)return{node:d,offset:s-i};i=p}e:{for(;d;){if(d.nextSibling){d=d.nextSibling;break e}d=d.parentNode}d=void 0}d=Xx(d)}}function Jx(i,s){return i&&s?i===s?!0:i&&i.nodeType===3?!1:s&&s.nodeType===3?Jx(i,s.parentNode):"contains"in i?i.contains(s):i.compareDocumentPosition?!!(i.compareDocumentPosition(s)&16):!1:!1}function eb(){for(var i=window,s=Je();s instanceof i.HTMLIFrameElement;){try{var d=typeof s.contentWindow.location.href=="string"}catch{d=!1}if(d)i=s.contentWindow;else break;s=Je(i.document)}return s}function _m(i){var s=i&&i.nodeName&&i.nodeName.toLowerCase();return s&&(s==="input"&&(i.type==="text"||i.type==="search"||i.type==="tel"||i.type==="url"||i.type==="password")||s==="textarea"||i.contentEditable==="true")}function eM(i){var s=eb(),d=i.focusedElem,p=i.selectionRange;if(s!==d&&d&&d.ownerDocument&&Jx(d.ownerDocument.documentElement,d)){if(p!==null&&_m(d)){if(s=p.start,i=p.end,i===void 0&&(i=s),"selectionStart"in d)d.selectionStart=s,d.selectionEnd=Math.min(i,d.value.length);else if(i=(s=d.ownerDocument||document)&&s.defaultView||window,i.getSelection){i=i.getSelection();var x=d.textContent.length,w=Math.min(p.start,x);p=p.end===void 0?w:Math.min(p.end,x),!i.extend&&w>p&&(x=p,p=w,w=x),x=Zx(d,w);var C=Zx(d,p);x&&C&&(i.rangeCount!==1||i.anchorNode!==x.node||i.anchorOffset!==x.offset||i.focusNode!==C.node||i.focusOffset!==C.offset)&&(s=s.createRange(),s.setStart(x.node,x.offset),i.removeAllRanges(),w>p?(i.addRange(s),i.extend(C.node,C.offset)):(s.setEnd(C.node,C.offset),i.addRange(s)))}}for(s=[],i=d;i=i.parentNode;)i.nodeType===1&&s.push({element:i,left:i.scrollLeft,top:i.scrollTop});for(typeof d.focus=="function"&&d.focus(),d=0;d=document.documentMode,zo=null,Mm=null,_l=null,Im=!1;function tb(i,s,d){var p=d.window===d?d.document:d.nodeType===9?d:d.ownerDocument;Im||zo==null||zo!==Je(p)||(p=zo,"selectionStart"in p&&_m(p)?p={start:p.selectionStart,end:p.selectionEnd}:(p=(p.ownerDocument&&p.ownerDocument.defaultView||window).getSelection(),p={anchorNode:p.anchorNode,anchorOffset:p.anchorOffset,focusNode:p.focusNode,focusOffset:p.focusOffset}),_l&&Ol(_l,p)||(_l=p,p=Tc(Mm,"onSelect"),0Wo||(i.current=Km[Wo],Km[Wo]=null,Wo--)}function rt(i,s){Wo++,Km[Wo]=i.current,i.current=s}var Hi={},er=Ui(Hi),xr=Ui(!1),_a=Hi;function Ko(i,s){var d=i.type.contextTypes;if(!d)return Hi;var p=i.stateNode;if(p&&p.__reactInternalMemoizedUnmaskedChildContext===s)return p.__reactInternalMemoizedMaskedChildContext;var x={},w;for(w in d)x[w]=s[w];return p&&(i=i.stateNode,i.__reactInternalMemoizedUnmaskedChildContext=s,i.__reactInternalMemoizedMaskedChildContext=x),x}function br(i){return i=i.childContextTypes,i!=null}function $c(){at(xr),at(er)}function gb(i,s,d){if(er.current!==Hi)throw Error(r(168));rt(er,s),rt(xr,d)}function vb(i,s,d){var p=i.stateNode;if(s=s.childContextTypes,typeof p.getChildContext!="function")return d;p=p.getChildContext();for(var x in p)if(!(x in s))throw Error(r(108,ge(i)||"Unknown",x));return J({},d,p)}function zc(i){return i=(i=i.stateNode)&&i.__reactInternalMemoizedMergedChildContext||Hi,_a=er.current,rt(er,i),rt(xr,xr.current),!0}function yb(i,s,d){var p=i.stateNode;if(!p)throw Error(r(169));d?(i=vb(i,s,_a),p.__reactInternalMemoizedMergedChildContext=i,at(xr),at(er),rt(er,i)):at(xr),rt(xr,d)}var ti=null,Fc=!1,Gm=!1;function xb(i){ti===null?ti=[i]:ti.push(i)}function fM(i){Fc=!0,xb(i)}function Wi(){if(!Gm&&ti!==null){Gm=!0;var i=0,s=Ze;try{var d=ti;for(Ze=1;i>=C,x-=C,ri=1<<32-un(s)+x|d<Re?(Tt=Te,Te=null):Tt=Te.sibling;var Qe=oe(G,Te,V[Re],fe);if(Qe===null){Te===null&&(Te=Tt);break}i&&Te&&Qe.alternate===null&&s(G,Te),z=w(Qe,z,Re),Ie===null?Ce=Qe:Ie.sibling=Qe,Ie=Qe,Te=Tt}if(Re===V.length)return d(G,Te),ct&&Ia(G,Re),Ce;if(Te===null){for(;ReRe?(Tt=Te,Te=null):Tt=Te.sibling;var Ji=oe(G,Te,Qe.value,fe);if(Ji===null){Te===null&&(Te=Tt);break}i&&Te&&Ji.alternate===null&&s(G,Te),z=w(Ji,z,Re),Ie===null?Ce=Ji:Ie.sibling=Ji,Ie=Ji,Te=Tt}if(Qe.done)return d(G,Te),ct&&Ia(G,Re),Ce;if(Te===null){for(;!Qe.done;Re++,Qe=V.next())Qe=ce(G,Qe.value,fe),Qe!==null&&(z=w(Qe,z,Re),Ie===null?Ce=Qe:Ie.sibling=Qe,Ie=Qe);return ct&&Ia(G,Re),Ce}for(Te=p(G,Te);!Qe.done;Re++,Qe=V.next())Qe=ve(Te,G,Re,Qe.value,fe),Qe!==null&&(i&&Qe.alternate!==null&&Te.delete(Qe.key===null?Re:Qe.key),z=w(Qe,z,Re),Ie===null?Ce=Qe:Ie.sibling=Qe,Ie=Qe);return i&&Te.forEach(function(GM){return s(G,GM)}),ct&&Ia(G,Re),Ce}function wt(G,z,V,fe){if(typeof V=="object"&&V!==null&&V.type===D&&V.key===null&&(V=V.props.children),typeof V=="object"&&V!==null){switch(V.$$typeof){case _:e:{for(var Ce=V.key,Ie=z;Ie!==null;){if(Ie.key===Ce){if(Ce=V.type,Ce===D){if(Ie.tag===7){d(G,Ie.sibling),z=x(Ie,V.props.children),z.return=G,G=z;break e}}else if(Ie.elementType===Ce||typeof Ce=="object"&&Ce!==null&&Ce.$$typeof===ae&&Nb(Ce)===Ie.type){d(G,Ie.sibling),z=x(Ie,V.props),z.ref=Ll(G,Ie,V),z.return=G,G=z;break e}d(G,Ie);break}else s(G,Ie);Ie=Ie.sibling}V.type===D?(z=Ba(V.props.children,G.mode,fe,V.key),z.return=G,G=z):(fe=md(V.type,V.key,V.props,null,G.mode,fe),fe.ref=Ll(G,z,V),fe.return=G,G=fe)}return C(G);case O:e:{for(Ie=V.key;z!==null;){if(z.key===Ie)if(z.tag===4&&z.stateNode.containerInfo===V.containerInfo&&z.stateNode.implementation===V.implementation){d(G,z.sibling),z=x(z,V.children||[]),z.return=G,G=z;break e}else{d(G,z);break}else s(G,z);z=z.sibling}z=Hp(V,G.mode,fe),z.return=G,G=z}return C(G);case ae:return Ie=V._init,wt(G,z,Ie(V._payload),fe)}if(Ae(V))return je(G,z,V,fe);if(te(V))return Ne(G,z,V,fe);Wc(G,V)}return typeof V=="string"&&V!==""||typeof V=="number"?(V=""+V,z!==null&&z.tag===6?(d(G,z.sibling),z=x(z,V),z.return=G,G=z):(d(G,z),z=Up(V,G.mode,fe),z.return=G,G=z),C(G)):d(G,z)}return wt}var Qo=Eb(!0),Ab=Eb(!1),Kc=Ui(null),Gc=null,Yo=null,Zm=null;function Jm(){Zm=Yo=Gc=null}function ep(i){var s=Kc.current;at(Kc),i._currentValue=s}function tp(i,s,d){for(;i!==null;){var p=i.alternate;if((i.childLanes&s)!==s?(i.childLanes|=s,p!==null&&(p.childLanes|=s)):p!==null&&(p.childLanes&s)!==s&&(p.childLanes|=s),i===d)break;i=i.return}}function Xo(i,s){Gc=i,Zm=Yo=null,i=i.dependencies,i!==null&&i.firstContext!==null&&((i.lanes&s)!==0&&(wr=!0),i.firstContext=null)}function Vr(i){var s=i._currentValue;if(Zm!==i)if(i={context:i,memoizedValue:s,next:null},Yo===null){if(Gc===null)throw Error(r(308));Yo=i,Gc.dependencies={lanes:0,firstContext:i}}else Yo=Yo.next=i;return s}var Ta=null;function rp(i){Ta===null?Ta=[i]:Ta.push(i)}function Cb(i,s,d,p){var x=s.interleaved;return x===null?(d.next=d,rp(s)):(d.next=x.next,x.next=d),s.interleaved=d,ii(i,p)}function ii(i,s){i.lanes|=s;var d=i.alternate;for(d!==null&&(d.lanes|=s),d=i,i=i.return;i!==null;)i.childLanes|=s,d=i.alternate,d!==null&&(d.childLanes|=s),d=i,i=i.return;return d.tag===3?d.stateNode:null}var Ki=!1;function np(i){i.updateQueue={baseState:i.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Pb(i,s){i=i.updateQueue,s.updateQueue===i&&(s.updateQueue={baseState:i.baseState,firstBaseUpdate:i.firstBaseUpdate,lastBaseUpdate:i.lastBaseUpdate,shared:i.shared,effects:i.effects})}function ai(i,s){return{eventTime:i,lane:s,tag:0,payload:null,callback:null,next:null}}function Gi(i,s,d){var p=i.updateQueue;if(p===null)return null;if(p=p.shared,(qe&2)!==0){var x=p.pending;return x===null?s.next=s:(s.next=x.next,x.next=s),p.pending=s,ii(i,d)}return x=p.interleaved,x===null?(s.next=s,rp(p)):(s.next=x.next,x.next=s),p.interleaved=s,ii(i,d)}function Vc(i,s,d){if(s=s.updateQueue,s!==null&&(s=s.shared,(d&4194240)!==0)){var p=s.lanes;p&=i.pendingLanes,d|=p,s.lanes=d,vm(i,d)}}function Ob(i,s){var d=i.updateQueue,p=i.alternate;if(p!==null&&(p=p.updateQueue,d===p)){var x=null,w=null;if(d=d.firstBaseUpdate,d!==null){do{var C={eventTime:d.eventTime,lane:d.lane,tag:d.tag,payload:d.payload,callback:d.callback,next:null};w===null?x=w=C:w=w.next=C,d=d.next}while(d!==null);w===null?x=w=s:w=w.next=s}else x=w=s;d={baseState:p.baseState,firstBaseUpdate:x,lastBaseUpdate:w,shared:p.shared,effects:p.effects},i.updateQueue=d;return}i=d.lastBaseUpdate,i===null?d.firstBaseUpdate=s:i.next=s,d.lastBaseUpdate=s}function qc(i,s,d,p){var x=i.updateQueue;Ki=!1;var w=x.firstBaseUpdate,C=x.lastBaseUpdate,T=x.shared.pending;if(T!==null){x.shared.pending=null;var R=T,Q=R.next;R.next=null,C===null?w=Q:C.next=Q,C=R;var le=i.alternate;le!==null&&(le=le.updateQueue,T=le.lastBaseUpdate,T!==C&&(T===null?le.firstBaseUpdate=Q:T.next=Q,le.lastBaseUpdate=R))}if(w!==null){var ce=x.baseState;C=0,le=Q=R=null,T=w;do{var oe=T.lane,ve=T.eventTime;if((p&oe)===oe){le!==null&&(le=le.next={eventTime:ve,lane:0,tag:T.tag,payload:T.payload,callback:T.callback,next:null});e:{var je=i,Ne=T;switch(oe=s,ve=d,Ne.tag){case 1:if(je=Ne.payload,typeof je=="function"){ce=je.call(ve,ce,oe);break e}ce=je;break e;case 3:je.flags=je.flags&-65537|128;case 0:if(je=Ne.payload,oe=typeof je=="function"?je.call(ve,ce,oe):je,oe==null)break e;ce=J({},ce,oe);break e;case 2:Ki=!0}}T.callback!==null&&T.lane!==0&&(i.flags|=64,oe=x.effects,oe===null?x.effects=[T]:oe.push(T))}else ve={eventTime:ve,lane:oe,tag:T.tag,payload:T.payload,callback:T.callback,next:null},le===null?(Q=le=ve,R=ce):le=le.next=ve,C|=oe;if(T=T.next,T===null){if(T=x.shared.pending,T===null)break;oe=T,T=oe.next,oe.next=null,x.lastBaseUpdate=oe,x.shared.pending=null}}while(!0);if(le===null&&(R=ce),x.baseState=R,x.firstBaseUpdate=Q,x.lastBaseUpdate=le,s=x.shared.interleaved,s!==null){x=s;do C|=x.lane,x=x.next;while(x!==s)}else w===null&&(x.shared.lanes=0);La|=C,i.lanes=C,i.memoizedState=ce}}function _b(i,s,d){if(i=s.effects,s.effects=null,i!==null)for(s=0;sd?d:4,i(!0);var p=lp.transition;lp.transition={};try{i(!1),s()}finally{Ze=d,lp.transition=p}}function Yb(){return qr().memoizedState}function gM(i,s,d){var p=Yi(i);if(d={lane:p,action:d,hasEagerState:!1,eagerState:null,next:null},Xb(i))Zb(s,d);else if(d=Cb(i,s,d,p),d!==null){var x=fr();pn(d,i,p,x),Jb(d,s,p)}}function vM(i,s,d){var p=Yi(i),x={lane:p,action:d,hasEagerState:!1,eagerState:null,next:null};if(Xb(i))Zb(s,x);else{var w=i.alternate;if(i.lanes===0&&(w===null||w.lanes===0)&&(w=s.lastRenderedReducer,w!==null))try{var C=s.lastRenderedState,T=w(C,d);if(x.hasEagerState=!0,x.eagerState=T,cn(T,C)){var R=s.interleaved;R===null?(x.next=x,rp(s)):(x.next=R.next,R.next=x),s.interleaved=x;return}}catch{}finally{}d=Cb(i,s,x,p),d!==null&&(x=fr(),pn(d,i,p,x),Jb(d,s,p))}}function Xb(i){var s=i.alternate;return i===pt||s!==null&&s===pt}function Zb(i,s){Bl=Xc=!0;var d=i.pending;d===null?s.next=s:(s.next=d.next,d.next=s),i.pending=s}function Jb(i,s,d){if((d&4194240)!==0){var p=s.lanes;p&=i.pendingLanes,d|=p,s.lanes=d,vm(i,d)}}var ed={readContext:Vr,useCallback:tr,useContext:tr,useEffect:tr,useImperativeHandle:tr,useInsertionEffect:tr,useLayoutEffect:tr,useMemo:tr,useReducer:tr,useRef:tr,useState:tr,useDebugValue:tr,useDeferredValue:tr,useTransition:tr,useMutableSource:tr,useSyncExternalStore:tr,useId:tr,unstable_isNewReconciler:!1},yM={readContext:Vr,useCallback:function(i,s){return Pn().memoizedState=[i,s===void 0?null:s],i},useContext:Vr,useEffect:Ub,useImperativeHandle:function(i,s,d){return d=d!=null?d.concat([i]):null,Zc(4194308,4,Kb.bind(null,s,i),d)},useLayoutEffect:function(i,s){return Zc(4194308,4,i,s)},useInsertionEffect:function(i,s){return Zc(4,2,i,s)},useMemo:function(i,s){var d=Pn();return s=s===void 0?null:s,i=i(),d.memoizedState=[i,s],i},useReducer:function(i,s,d){var p=Pn();return s=d!==void 0?d(s):s,p.memoizedState=p.baseState=s,i={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:i,lastRenderedState:s},p.queue=i,i=i.dispatch=gM.bind(null,pt,i),[p.memoizedState,i]},useRef:function(i){var s=Pn();return i={current:i},s.memoizedState=i},useState:Fb,useDebugValue:pp,useDeferredValue:function(i){return Pn().memoizedState=i},useTransition:function(){var i=Fb(!1),s=i[0];return i=pM.bind(null,i[1]),Pn().memoizedState=i,[s,i]},useMutableSource:function(){},useSyncExternalStore:function(i,s,d){var p=pt,x=Pn();if(ct){if(d===void 0)throw Error(r(407));d=d()}else{if(d=s(),It===null)throw Error(r(349));(Ra&30)!==0||Db(p,s,d)}x.memoizedState=d;var w={value:d,getSnapshot:s};return x.queue=w,Ub(Lb.bind(null,p,w,i),[i]),p.flags|=2048,Wl(9,Rb.bind(null,p,w,d,s),void 0,null),d},useId:function(){var i=Pn(),s=It.identifierPrefix;if(ct){var d=ni,p=ri;d=(p&~(1<<32-un(p)-1)).toString(32)+d,s=":"+s+"R"+d,d=Ul++,0<\/script>",i=i.removeChild(i.firstChild)):typeof p.is=="string"?i=C.createElement(d,{is:p.is}):(i=C.createElement(d),d==="select"&&(C=i,p.multiple?C.multiple=!0:p.size&&(C.size=p.size))):i=C.createElementNS(i,d),i[An]=s,i[Tl]=p,y1(i,s,!1,!1),s.stateNode=i;e:{switch(C=sm(d,p),d){case"dialog":it("cancel",i),it("close",i),x=p;break;case"iframe":case"object":case"embed":it("load",i),x=p;break;case"video":case"audio":for(x=0;x<_l.length;x++)it(_l[x],i);x=p;break;case"source":it("error",i),x=p;break;case"img":case"image":case"link":it("error",i),it("load",i),x=p;break;case"details":it("toggle",i),x=p;break;case"input":Oe(i,p),x=Fe(i,p),it("invalid",i);break;case"option":x=p;break;case"select":i._wrapperState={wasMultiple:!!p.multiple},x=J({},p,{value:void 0}),it("invalid",i);break;case"textarea":Ut(i,p),x=et(i,p),it("invalid",i);break;default:x=p}_r(d,x),T=x;for(w in T)if(T.hasOwnProperty(w)){var R=T[w];w==="style"?hc(i,R):w==="dangerouslySetInnerHTML"?(R=R?R.__html:void 0,R!=null&&Or(i,R)):w==="children"?typeof R=="string"?(d!=="textarea"||R!=="")&&Ti(i,R):typeof R=="number"&&Ti(i,""+R):w!=="suppressContentEditableWarning"&&w!=="suppressHydrationWarning"&&w!=="autoFocus"&&(a.hasOwnProperty(w)?R!=null&&w==="onScroll"&&it("scroll",i):R!=null&&A(i,w,R,C))}switch(d){case"input":_e(i),W(i,p,!1);break;case"textarea":_e(i),ur(i);break;case"option":p.value!=null&&i.setAttribute("value",""+Pe(p.value));break;case"select":i.multiple=!!p.multiple,w=p.value,w!=null?Be(i,!!p.multiple,w,!1):p.defaultValue!=null&&Be(i,!!p.multiple,p.defaultValue,!0);break;default:typeof x.onClick=="function"&&(i.onclick=Rc)}switch(d){case"button":case"input":case"select":case"textarea":p=!!p.autoFocus;break e;case"img":p=!0;break e;default:p=!1}}p&&(s.flags|=4)}s.ref!==null&&(s.flags|=512,s.flags|=2097152)}return rr(s),null;case 6:if(i&&s.stateNode!=null)b1(i,s,i.memoizedProps,p);else{if(typeof p!="string"&&s.stateNode===null)throw Error(r(166));if(d=Da(zl.current),Da(Cn.current),Hc(s)){if(p=s.stateNode,d=s.memoizedProps,p[An]=s,(w=p.nodeValue!==d)&&(i=Ir,i!==null))switch(i.tag){case 3:Dc(p.nodeValue,d,(i.mode&1)!==0);break;case 5:i.memoizedProps.suppressHydrationWarning!==!0&&Dc(p.nodeValue,d,(i.mode&1)!==0)}w&&(s.flags|=4)}else p=(d.nodeType===9?d:d.ownerDocument).createTextNode(p),p[An]=s,s.stateNode=p}return rr(s),null;case 13:if(at(mt),p=s.memoizedState,i===null||i.memoizedState!==null&&i.memoizedState.dehydrated!==null){if(ct&&Tr!==null&&(s.mode&1)!==0&&(s.flags&128)===0)jb(),qo(),s.flags|=98560,w=!1;else if(w=Hc(s),p!==null&&p.dehydrated!==null){if(i===null){if(!w)throw Error(r(318));if(w=s.memoizedState,w=w!==null?w.dehydrated:null,!w)throw Error(r(317));w[An]=s}else qo(),(s.flags&128)===0&&(s.memoizedState=null),s.flags|=4;rr(s),w=!1}else dn!==null&&(Lp(dn),dn=null),w=!0;if(!w)return s.flags&65536?s:null}return(s.flags&128)!==0?(s.lanes=d,s):(p=p!==null,p!==(i!==null&&i.memoizedState!==null)&&p&&(s.child.flags|=8192,(s.mode&1)!==0&&(i===null||(mt.current&1)!==0?At===0&&(At=3):Fp())),s.updateQueue!==null&&(s.flags|=4),rr(s),null);case 4:return Zo(),Ep(i,s),i===null&&Ml(s.stateNode.containerInfo),rr(s),null;case 10:return ep(s.type._context),rr(s),null;case 17:return br(s.type)&&$c(),rr(s),null;case 19:if(at(mt),w=s.memoizedState,w===null)return rr(s),null;if(p=(s.flags&128)!==0,C=w.rendering,C===null)if(p)Wl(w,!1);else{if(At!==0||i!==null&&(i.flags&128)!==0)for(i=s.child;i!==null;){if(C=Qc(i),C!==null){for(s.flags|=128,Wl(w,!1),p=C.updateQueue,p!==null&&(s.updateQueue=p,s.flags|=4),s.subtreeFlags=0,p=d,d=s.child;d!==null;)w=d,i=p,w.flags&=14680066,C=w.alternate,C===null?(w.childLanes=0,w.lanes=i,w.child=null,w.subtreeFlags=0,w.memoizedProps=null,w.memoizedState=null,w.updateQueue=null,w.dependencies=null,w.stateNode=null):(w.childLanes=C.childLanes,w.lanes=C.lanes,w.child=C.child,w.subtreeFlags=0,w.deletions=null,w.memoizedProps=C.memoizedProps,w.memoizedState=C.memoizedState,w.updateQueue=C.updateQueue,w.type=C.type,i=C.dependencies,w.dependencies=i===null?null:{lanes:i.lanes,firstContext:i.firstContext}),d=d.sibling;return rt(mt,mt.current&1|2),s.child}i=i.sibling}w.tail!==null&&bt()>rs&&(s.flags|=128,p=!0,Wl(w,!1),s.lanes=4194304)}else{if(!p)if(i=Qc(C),i!==null){if(s.flags|=128,p=!0,d=i.updateQueue,d!==null&&(s.updateQueue=d,s.flags|=4),Wl(w,!0),w.tail===null&&w.tailMode==="hidden"&&!C.alternate&&!ct)return rr(s),null}else 2*bt()-w.renderingStartTime>rs&&d!==1073741824&&(s.flags|=128,p=!0,Wl(w,!1),s.lanes=4194304);w.isBackwards?(C.sibling=s.child,s.child=C):(d=w.last,d!==null?d.sibling=C:s.child=C,w.last=C)}return w.tail!==null?(s=w.tail,w.rendering=s,w.tail=s.sibling,w.renderingStartTime=bt(),s.sibling=null,d=mt.current,rt(mt,p?d&1|2:d&1),s):(rr(s),null);case 22:case 23:return zp(),p=s.memoizedState!==null,i!==null&&i.memoizedState!==null!==p&&(s.flags|=8192),p&&(s.mode&1)!==0?(Dr&1073741824)!==0&&(rr(s),s.subtreeFlags&6&&(s.flags|=8192)):rr(s),null;case 24:return null;case 25:return null}throw Error(r(156,s.tag))}function EM(i,s){switch(qm(s),s.tag){case 1:return br(s.type)&&$c(),i=s.flags,i&65536?(s.flags=i&-65537|128,s):null;case 3:return Zo(),at(xr),at(er),sp(),i=s.flags,(i&65536)!==0&&(i&128)===0?(s.flags=i&-65537|128,s):null;case 5:return ap(s),null;case 13:if(at(mt),i=s.memoizedState,i!==null&&i.dehydrated!==null){if(s.alternate===null)throw Error(r(340));qo()}return i=s.flags,i&65536?(s.flags=i&-65537|128,s):null;case 19:return at(mt),null;case 4:return Zo(),null;case 10:return ep(s.type._context),null;case 22:case 23:return zp(),null;case 24:return null;default:return null}}var id=!1,nr=!1,AM=typeof WeakSet=="function"?WeakSet:Set,be=null;function es(i,s){var d=i.ref;if(d!==null)if(typeof d=="function")try{d(null)}catch(p){gt(i,s,p)}else d.current=null}function Ap(i,s,d){try{d()}catch(p){gt(i,s,p)}}var w1=!1;function CM(i,s){if(zm=Sc,i=Jx(),_m(i)){if("selectionStart"in i)var d={start:i.selectionStart,end:i.selectionEnd};else e:{d=(d=i.ownerDocument)&&d.defaultView||window;var p=d.getSelection&&d.getSelection();if(p&&p.rangeCount!==0){d=p.anchorNode;var x=p.anchorOffset,w=p.focusNode;p=p.focusOffset;try{d.nodeType,w.nodeType}catch{d=null;break e}var C=0,T=-1,R=-1,Q=0,le=0,ce=i,oe=null;t:for(;;){for(var ve;ce!==d||x!==0&&ce.nodeType!==3||(T=C+x),ce!==w||p!==0&&ce.nodeType!==3||(R=C+p),ce.nodeType===3&&(C+=ce.nodeValue.length),(ve=ce.firstChild)!==null;)oe=ce,ce=ve;for(;;){if(ce===i)break t;if(oe===d&&++Q===x&&(T=C),oe===w&&++le===p&&(R=C),(ve=ce.nextSibling)!==null)break;ce=oe,oe=ce.parentNode}ce=ve}d=T===-1||R===-1?null:{start:T,end:R}}else d=null}d=d||{start:0,end:0}}else d=null;for(Fm={focusedElem:i,selectionRange:d},Sc=!1,be=s;be!==null;)if(s=be,i=s.child,(s.subtreeFlags&1028)!==0&&i!==null)i.return=s,be=i;else for(;be!==null;){s=be;try{var je=s.alternate;if((s.flags&1024)!==0)switch(s.tag){case 0:case 11:case 15:break;case 1:if(je!==null){var Ne=je.memoizedProps,wt=je.memoizedState,G=s.stateNode,z=G.getSnapshotBeforeUpdate(s.elementType===s.type?Ne:fn(s.type,Ne),wt);G.__reactInternalSnapshotBeforeUpdate=z}break;case 3:var V=s.stateNode.containerInfo;V.nodeType===1?V.textContent="":V.nodeType===9&&V.documentElement&&V.removeChild(V.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(r(163))}}catch(fe){gt(s,s.return,fe)}if(i=s.sibling,i!==null){i.return=s.return,be=i;break}be=s.return}return je=w1,w1=!1,je}function Kl(i,s,d){var p=s.updateQueue;if(p=p!==null?p.lastEffect:null,p!==null){var x=p=p.next;do{if((x.tag&i)===i){var w=x.destroy;x.destroy=void 0,w!==void 0&&Ap(s,d,w)}x=x.next}while(x!==p)}}function ad(i,s){if(s=s.updateQueue,s=s!==null?s.lastEffect:null,s!==null){var d=s=s.next;do{if((d.tag&i)===i){var p=d.create;d.destroy=p()}d=d.next}while(d!==s)}}function Cp(i){var s=i.ref;if(s!==null){var d=i.stateNode;switch(i.tag){case 5:i=d;break;default:i=d}typeof s=="function"?s(i):s.current=i}}function k1(i){var s=i.alternate;s!==null&&(i.alternate=null,k1(s)),i.child=null,i.deletions=null,i.sibling=null,i.tag===5&&(s=i.stateNode,s!==null&&(delete s[An],delete s[Tl],delete s[Wm],delete s[cM],delete s[dM])),i.stateNode=null,i.return=null,i.dependencies=null,i.memoizedProps=null,i.memoizedState=null,i.pendingProps=null,i.stateNode=null,i.updateQueue=null}function j1(i){return i.tag===5||i.tag===3||i.tag===4}function S1(i){e:for(;;){for(;i.sibling===null;){if(i.return===null||j1(i.return))return null;i=i.return}for(i.sibling.return=i.return,i=i.sibling;i.tag!==5&&i.tag!==6&&i.tag!==18;){if(i.flags&2||i.child===null||i.tag===4)continue e;i.child.return=i,i=i.child}if(!(i.flags&2))return i.stateNode}}function Pp(i,s,d){var p=i.tag;if(p===5||p===6)i=i.stateNode,s?d.nodeType===8?d.parentNode.insertBefore(i,s):d.insertBefore(i,s):(d.nodeType===8?(s=d.parentNode,s.insertBefore(i,d)):(s=d,s.appendChild(i)),d=d._reactRootContainer,d!=null||s.onclick!==null||(s.onclick=Rc));else if(p!==4&&(i=i.child,i!==null))for(Pp(i,s,d),i=i.sibling;i!==null;)Pp(i,s,d),i=i.sibling}function Op(i,s,d){var p=i.tag;if(p===5||p===6)i=i.stateNode,s?d.insertBefore(i,s):d.appendChild(i);else if(p!==4&&(i=i.child,i!==null))for(Op(i,s,d),i=i.sibling;i!==null;)Op(i,s,d),i=i.sibling}var Ht=null,hn=!1;function Vi(i,s,d){for(d=d.child;d!==null;)N1(i,s,d),d=d.sibling}function N1(i,s,d){if(En&&typeof En.onCommitFiberUnmount=="function")try{En.onCommitFiberUnmount(yc,d)}catch{}switch(d.tag){case 5:nr||es(d,s);case 6:var p=Ht,x=hn;Ht=null,Vi(i,s,d),Ht=p,hn=x,Ht!==null&&(hn?(i=Ht,d=d.stateNode,i.nodeType===8?i.parentNode.removeChild(d):i.removeChild(d)):Ht.removeChild(d.stateNode));break;case 18:Ht!==null&&(hn?(i=Ht,d=d.stateNode,i.nodeType===8?Hm(i.parentNode,d):i.nodeType===1&&Hm(i,d),jl(i)):Hm(Ht,d.stateNode));break;case 4:p=Ht,x=hn,Ht=d.stateNode.containerInfo,hn=!0,Vi(i,s,d),Ht=p,hn=x;break;case 0:case 11:case 14:case 15:if(!nr&&(p=d.updateQueue,p!==null&&(p=p.lastEffect,p!==null))){x=p=p.next;do{var w=x,C=w.destroy;w=w.tag,C!==void 0&&((w&2)!==0||(w&4)!==0)&&Ap(d,s,C),x=x.next}while(x!==p)}Vi(i,s,d);break;case 1:if(!nr&&(es(d,s),p=d.stateNode,typeof p.componentWillUnmount=="function"))try{p.props=d.memoizedProps,p.state=d.memoizedState,p.componentWillUnmount()}catch(T){gt(d,s,T)}Vi(i,s,d);break;case 21:Vi(i,s,d);break;case 22:d.mode&1?(nr=(p=nr)||d.memoizedState!==null,Vi(i,s,d),nr=p):Vi(i,s,d);break;default:Vi(i,s,d)}}function E1(i){var s=i.updateQueue;if(s!==null){i.updateQueue=null;var d=i.stateNode;d===null&&(d=i.stateNode=new AM),s.forEach(function(p){var x=LM.bind(null,i,p);d.has(p)||(d.add(p),p.then(x,x))})}}function mn(i,s){var d=s.deletions;if(d!==null)for(var p=0;px&&(x=C),p&=~w}if(p=x,p=bt()-p,p=(120>p?120:480>p?480:1080>p?1080:1920>p?1920:3e3>p?3e3:4320>p?4320:1960*OM(p/1960))-p,10i?16:i,Qi===null)var p=!1;else{if(i=Qi,Qi=null,cd=0,(qe&6)!==0)throw Error(r(331));var x=qe;for(qe|=4,be=i.current;be!==null;){var w=be,C=w.child;if((be.flags&16)!==0){var T=w.deletions;if(T!==null){for(var R=0;Rbt()-Ip?za(i,0):Mp|=d),jr(i,s)}function z1(i,s){s===0&&((i.mode&1)===0?s=1:(s=bc,bc<<=1,(bc&130023424)===0&&(bc=4194304)));var d=fr();i=ii(i,s),i!==null&&(yl(i,s,d),jr(i,d))}function RM(i){var s=i.memoizedState,d=0;s!==null&&(d=s.retryLane),z1(i,d)}function LM(i,s){var d=0;switch(i.tag){case 13:var p=i.stateNode,x=i.memoizedState;x!==null&&(d=x.retryLane);break;case 19:p=i.stateNode;break;default:throw Error(r(314))}p!==null&&p.delete(s),z1(i,d)}var F1;F1=function(i,s,d){if(i!==null)if(i.memoizedProps!==s.pendingProps||xr.current)wr=!0;else{if((i.lanes&d)===0&&(s.flags&128)===0)return wr=!1,SM(i,s,d);wr=(i.flags&131072)!==0}else wr=!1,ct&&(s.flags&1048576)!==0&&xb(s,Uc,s.index);switch(s.lanes=0,s.tag){case 2:var p=s.type;nd(i,s),i=s.pendingProps;var x=Ko(s,er.current);Xo(s,d),x=cp(null,s,p,i,x,d);var w=dp();return s.flags|=1,typeof x=="object"&&x!==null&&typeof x.render=="function"&&x.$$typeof===void 0?(s.tag=1,s.memoizedState=null,s.updateQueue=null,br(p)?(w=!0,zc(s)):w=!1,s.memoizedState=x.state!==null&&x.state!==void 0?x.state:null,np(s),x.updater=td,s.stateNode=x,x._reactInternals=s,vp(s,p,i,d),s=wp(null,s,p,!0,w,d)):(s.tag=0,ct&&w&&Vm(s),dr(null,s,x,d),s=s.child),s;case 16:p=s.elementType;e:{switch(nd(i,s),i=s.pendingProps,x=p._init,p=x(p._payload),s.type=p,x=s.tag=zM(p),i=fn(p,i),x){case 0:s=bp(null,s,p,i,d);break e;case 1:s=f1(null,s,p,i,d);break e;case 11:s=s1(null,s,p,i,d);break e;case 14:s=l1(null,s,p,fn(p.type,i),d);break e}throw Error(r(306,p,""))}return s;case 0:return p=s.type,x=s.pendingProps,x=s.elementType===p?x:fn(p,x),bp(i,s,p,x,d);case 1:return p=s.type,x=s.pendingProps,x=s.elementType===p?x:fn(p,x),f1(i,s,p,x,d);case 3:e:{if(h1(s),i===null)throw Error(r(387));p=s.pendingProps,w=s.memoizedState,x=w.element,Cb(i,s),qc(s,p,null,d);var C=s.memoizedState;if(p=C.element,w.isDehydrated)if(w={element:p,isDehydrated:!1,cache:C.cache,pendingSuspenseBoundaries:C.pendingSuspenseBoundaries,transitions:C.transitions},s.updateQueue.baseState=w,s.memoizedState=w,s.flags&256){x=Jo(Error(r(423)),s),s=m1(i,s,p,d,x);break e}else if(p!==x){x=Jo(Error(r(424)),s),s=m1(i,s,p,d,x);break e}else for(Tr=Bi(s.stateNode.containerInfo.firstChild),Ir=s,ct=!0,dn=null,d=Eb(s,null,p,d),s.child=d;d;)d.flags=d.flags&-3|4096,d=d.sibling;else{if(qo(),p===x){s=oi(i,s,d);break e}dr(i,s,p,d)}s=s.child}return s;case 5:return _b(s),i===null&&Ym(s),p=s.type,x=s.pendingProps,w=i!==null?i.memoizedProps:null,C=x.children,Bm(p,x)?C=null:w!==null&&Bm(p,w)&&(s.flags|=32),d1(i,s),dr(i,s,C,d),s.child;case 6:return i===null&&Ym(s),null;case 13:return p1(i,s,d);case 4:return ip(s,s.stateNode.containerInfo),p=s.pendingProps,i===null?s.child=Qo(s,null,p,d):dr(i,s,p,d),s.child;case 11:return p=s.type,x=s.pendingProps,x=s.elementType===p?x:fn(p,x),s1(i,s,p,x,d);case 7:return dr(i,s,s.pendingProps,d),s.child;case 8:return dr(i,s,s.pendingProps.children,d),s.child;case 12:return dr(i,s,s.pendingProps.children,d),s.child;case 10:e:{if(p=s.type._context,x=s.pendingProps,w=s.memoizedProps,C=x.value,rt(Kc,p._currentValue),p._currentValue=C,w!==null)if(cn(w.value,C)){if(w.children===x.children&&!xr.current){s=oi(i,s,d);break e}}else for(w=s.child,w!==null&&(w.return=s);w!==null;){var T=w.dependencies;if(T!==null){C=w.child;for(var R=T.firstContext;R!==null;){if(R.context===p){if(w.tag===1){R=ai(-1,d&-d),R.tag=2;var Q=w.updateQueue;if(Q!==null){Q=Q.shared;var le=Q.pending;le===null?R.next=R:(R.next=le.next,le.next=R),Q.pending=R}}w.lanes|=d,R=w.alternate,R!==null&&(R.lanes|=d),tp(w.return,d,s),T.lanes|=d;break}R=R.next}}else if(w.tag===10)C=w.type===s.type?null:w.child;else if(w.tag===18){if(C=w.return,C===null)throw Error(r(341));C.lanes|=d,T=C.alternate,T!==null&&(T.lanes|=d),tp(C,d,s),C=w.sibling}else C=w.child;if(C!==null)C.return=w;else for(C=w;C!==null;){if(C===s){C=null;break}if(w=C.sibling,w!==null){w.return=C.return,C=w;break}C=C.return}w=C}dr(i,s,x.children,d),s=s.child}return s;case 9:return x=s.type,p=s.pendingProps.children,Xo(s,d),x=Vr(x),p=p(x),s.flags|=1,dr(i,s,p,d),s.child;case 14:return p=s.type,x=fn(p,s.pendingProps),x=fn(p.type,x),l1(i,s,p,x,d);case 15:return u1(i,s,s.type,s.pendingProps,d);case 17:return p=s.type,x=s.pendingProps,x=s.elementType===p?x:fn(p,x),nd(i,s),s.tag=1,br(p)?(i=!0,zc(s)):i=!1,Xo(s,d),e1(s,p,x),vp(s,p,x,d),wp(null,s,p,!0,i,d);case 19:return v1(i,s,d);case 22:return c1(i,s,d)}throw Error(r(156,s.tag))};function B1(i,s){return bx(i,s)}function $M(i,s,d,p){this.tag=i,this.key=d,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=s,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=p,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Yr(i,s,d,p){return new $M(i,s,d,p)}function Bp(i){return i=i.prototype,!(!i||!i.isReactComponent)}function zM(i){if(typeof i=="function")return Bp(i)?1:0;if(i!=null){if(i=i.$$typeof,i===H)return 11;if(i===he)return 14}return 2}function Zi(i,s){var d=i.alternate;return d===null?(d=Yr(i.tag,s,i.key,i.mode),d.elementType=i.elementType,d.type=i.type,d.stateNode=i.stateNode,d.alternate=i,i.alternate=d):(d.pendingProps=s,d.type=i.type,d.flags=0,d.subtreeFlags=0,d.deletions=null),d.flags=i.flags&14680064,d.childLanes=i.childLanes,d.lanes=i.lanes,d.child=i.child,d.memoizedProps=i.memoizedProps,d.memoizedState=i.memoizedState,d.updateQueue=i.updateQueue,s=i.dependencies,d.dependencies=s===null?null:{lanes:s.lanes,firstContext:s.firstContext},d.sibling=i.sibling,d.index=i.index,d.ref=i.ref,d}function md(i,s,d,p,x,w){var C=2;if(p=i,typeof i=="function")Bp(i)&&(C=1);else if(typeof i=="string")C=5;else e:switch(i){case D:return Ba(d.children,x,w,s);case U:C=8,x|=8;break;case B:return i=Yr(12,d,s,x|2),i.elementType=B,i.lanes=w,i;case pe:return i=Yr(13,d,s,x),i.elementType=pe,i.lanes=w,i;case ue:return i=Yr(19,d,s,x),i.elementType=ue,i.lanes=w,i;case se:return pd(d,x,w,s);default:if(typeof i=="object"&&i!==null)switch(i.$$typeof){case F:C=10;break e;case Y:C=9;break e;case H:C=11;break e;case he:C=14;break e;case ae:C=16,p=null;break e}throw Error(r(130,i==null?i:typeof i,""))}return s=Yr(C,d,s,x),s.elementType=i,s.type=p,s.lanes=w,s}function Ba(i,s,d,p){return i=Yr(7,i,p,s),i.lanes=d,i}function pd(i,s,d,p){return i=Yr(22,i,p,s),i.elementType=se,i.lanes=d,i.stateNode={isHidden:!1},i}function Up(i,s,d){return i=Yr(6,i,null,s),i.lanes=d,i}function Hp(i,s,d){return s=Yr(4,i.children!==null?i.children:[],i.key,s),s.lanes=d,s.stateNode={containerInfo:i.containerInfo,pendingChildren:null,implementation:i.implementation},s}function FM(i,s,d,p,x){this.tag=s,this.containerInfo=i,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=gm(0),this.expirationTimes=gm(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=gm(0),this.identifierPrefix=p,this.onRecoverableError=x,this.mutableSourceEagerHydrationData=null}function Wp(i,s,d,p,x,w,C,T,R){return i=new FM(i,s,d,T,R),s===1?(s=1,w===!0&&(s|=8)):s=0,w=Yr(3,null,null,s),i.current=w,w.stateNode=i,w.memoizedState={element:p,isDehydrated:d,cache:null,transitions:null,pendingSuspenseBoundaries:null},np(w),i}function BM(i,s,d){var p=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}return e(),Xp.exports=t3(),Xp.exports}var rw;function r3(){if(rw)return jd;rw=1;var e=hN();return jd.createRoot=e.createRoot,jd.hydrateRoot=e.hydrateRoot,jd}var n3=r3();const i3=vy(n3);var qu=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},ao,ua,As,rN,a3=(rN=class extends qu{constructor(){super();De(this,ao);De(this,ua);De(this,As);ye(this,As,t=>{if(typeof window<"u"&&window.addEventListener){const r=()=>t();return window.addEventListener("visibilitychange",r,!1),()=>{window.removeEventListener("visibilitychange",r)}}})}onSubscribe(){L(this,ua)||this.setEventListener(L(this,As))}onUnsubscribe(){var t;this.hasListeners()||((t=L(this,ua))==null||t.call(this),ye(this,ua,void 0))}setEventListener(t){var r;ye(this,As,t),(r=L(this,ua))==null||r.call(this),ye(this,ua,t(n=>{typeof n=="boolean"?this.setFocused(n):this.onFocus()}))}setFocused(t){L(this,ao)!==t&&(ye(this,ao,t),this.onFocus())}onFocus(){const t=this.isFocused();this.listeners.forEach(r=>{r(t)})}isFocused(){var t;return typeof L(this,ao)=="boolean"?L(this,ao):((t=globalThis.document)==null?void 0:t.visibilityState)!=="hidden"}},ao=new WeakMap,ua=new WeakMap,As=new WeakMap,rN),yy=new a3,o3={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e),setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)},ca,gy,nN,s3=(nN=class{constructor(){De(this,ca,o3);De(this,gy,!1)}setTimeoutProvider(e){ye(this,ca,e)}setTimeout(e,t){return L(this,ca).setTimeout(e,t)}clearTimeout(e){L(this,ca).clearTimeout(e)}setInterval(e,t){return L(this,ca).setInterval(e,t)}clearInterval(e){L(this,ca).clearInterval(e)}},ca=new WeakMap,gy=new WeakMap,nN),Za=new s3;function l3(e){setTimeout(e,0)}var u3=typeof window>"u"||"Deno"in globalThis;function Er(){}function c3(e,t){return typeof e=="function"?e(t):e}function Vg(e){return typeof e=="number"&&e>=0&&e!==1/0}function mN(e,t){return Math.max(e+(t||0)-Date.now(),0)}function ya(e,t){return typeof e=="function"?e(t):e}function zr(e,t){return typeof e=="function"?e(t):e}function nw(e,t){const{type:r="all",exact:n,fetchStatus:a,predicate:o,queryKey:c,stale:u}=e;if(c){if(n){if(t.queryHash!==xy(c,t.options))return!1}else if(!ju(t.queryKey,c))return!1}if(r!=="all"){const f=t.isActive();if(r==="active"&&!f||r==="inactive"&&f)return!1}return!(typeof u=="boolean"&&t.isStale()!==u||a&&a!==t.state.fetchStatus||o&&!o(t))}function iw(e,t){const{exact:r,status:n,predicate:a,mutationKey:o}=e;if(o){if(!t.options.mutationKey)return!1;if(r){if(ku(t.options.mutationKey)!==ku(o))return!1}else if(!ju(t.options.mutationKey,o))return!1}return!(n&&t.state.status!==n||a&&!a(t))}function xy(e,t){return((t==null?void 0:t.queryKeyHashFn)||ku)(e)}function ku(e){return JSON.stringify(e,(t,r)=>Qg(r)?Object.keys(r).sort().reduce((n,a)=>(n[a]=r[a],n),{}):r)}function ju(e,t){return e===t?!0:typeof e!=typeof t?!1:e&&t&&typeof e=="object"&&typeof t=="object"?Object.keys(t).every(r=>ju(e[r],t[r])):!1}var d3=Object.prototype.hasOwnProperty;function pN(e,t,r=0){if(e===t)return e;if(r>500)return t;const n=aw(e)&&aw(t);if(!n&&!(Qg(e)&&Qg(t)))return t;const o=(n?e:Object.keys(e)).length,c=n?t:Object.keys(t),u=c.length,f=n?new Array(u):{};let h=0;for(let m=0;m{Za.setTimeout(t,e)})}function Yg(e,t,r){return typeof r.structuralSharing=="function"?r.structuralSharing(e,t):r.structuralSharing!==!1?pN(e,t):t}function h3(e,t,r=0){const n=[...e,t];return r&&n.length>r?n.slice(1):n}function m3(e,t,r=0){const n=[t,...e];return r&&n.length>r?n.slice(0,-1):n}var by=Symbol();function gN(e,t){return!e.queryFn&&(t!=null&&t.initialPromise)?()=>t.initialPromise:!e.queryFn||e.queryFn===by?()=>Promise.reject(new Error(`Missing queryFn: '${e.queryHash}'`)):e.queryFn}function vN(e,t){return typeof e=="function"?e(...t):!!e}function p3(e,t,r){let n=!1,a;return Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(a??(a=t()),n||(n=!0,a.aborted?r():a.addEventListener("abort",r,{once:!0})),a)}),e}var Su=(()=>{let e=()=>u3;return{isServer(){return e()},setIsServer(t){e=t}}})();function Xg(){let e,t;const r=new Promise((a,o)=>{e=a,t=o});r.status="pending",r.catch(()=>{});function n(a){Object.assign(r,a),delete r.resolve,delete r.reject}return r.resolve=a=>{n({status:"fulfilled",value:a}),e(a)},r.reject=a=>{n({status:"rejected",reason:a}),t(a)},r}var g3=l3;function v3(){let e=[],t=0,r=u=>{u()},n=u=>{u()},a=g3;const o=u=>{t?e.push(u):a(()=>{r(u)})},c=()=>{const u=e;e=[],u.length&&a(()=>{n(()=>{u.forEach(f=>{r(f)})})})};return{batch:u=>{let f;t++;try{f=u()}finally{t--,t||c()}return f},batchCalls:u=>(...f)=>{o(()=>{u(...f)})},schedule:o,setNotifyFunction:u=>{r=u},setBatchNotifyFunction:u=>{n=u},setScheduler:u=>{a=u}}}var qt=v3(),Cs,da,Ps,iN,y3=(iN=class extends qu{constructor(){super();De(this,Cs,!0);De(this,da);De(this,Ps);ye(this,Ps,t=>{if(typeof window<"u"&&window.addEventListener){const r=()=>t(!0),n=()=>t(!1);return window.addEventListener("online",r,!1),window.addEventListener("offline",n,!1),()=>{window.removeEventListener("online",r),window.removeEventListener("offline",n)}}})}onSubscribe(){L(this,da)||this.setEventListener(L(this,Ps))}onUnsubscribe(){var t;this.hasListeners()||((t=L(this,da))==null||t.call(this),ye(this,da,void 0))}setEventListener(t){var r;ye(this,Ps,t),(r=L(this,da))==null||r.call(this),ye(this,da,t(this.setOnline.bind(this)))}setOnline(t){L(this,Cs)!==t&&(ye(this,Cs,t),this.listeners.forEach(n=>{n(t)}))}isOnline(){return L(this,Cs)}},Cs=new WeakMap,da=new WeakMap,Ps=new WeakMap,iN),of=new y3;function x3(e){return Math.min(1e3*2**e,3e4)}function yN(e){return(e??"online")==="online"?of.isOnline():!0}var Zg=class extends Error{constructor(e){super("CancelledError"),this.revert=e==null?void 0:e.revert,this.silent=e==null?void 0:e.silent}};function xN(e){let t=!1,r=0,n;const a=Xg(),o=()=>a.status!=="pending",c=k=>{var S;if(!o()){const N=new Zg(k);v(N),(S=e.onCancel)==null||S.call(e,N)}},u=()=>{t=!0},f=()=>{t=!1},h=()=>yy.isFocused()&&(e.networkMode==="always"||of.isOnline())&&e.canRun(),m=()=>yN(e.networkMode)&&e.canRun(),g=k=>{o()||(n==null||n(),a.resolve(k))},v=k=>{o()||(n==null||n(),a.reject(k))},b=()=>new Promise(k=>{var S;n=N=>{(o()||h())&&k(N)},(S=e.onPause)==null||S.call(e)}).then(()=>{var k;n=void 0,o()||(k=e.onContinue)==null||k.call(e)}),j=()=>{if(o())return;let k;const S=r===0?e.initialPromise:void 0;try{k=S??e.fn()}catch(N){k=Promise.reject(N)}Promise.resolve(k).then(g).catch(N=>{var O;if(o())return;const E=e.retry??(Su.isServer()?0:3),A=e.retryDelay??x3,P=typeof A=="function"?A(r,N):A,_=E===!0||typeof E=="number"&&rh()?void 0:b()).then(()=>{t?v(N):j()})})};return{promise:a,status:()=>a.status,cancel:c,continue:()=>(n==null||n(),a),cancelRetry:u,continueRetry:f,canStart:m,start:()=>(m()?j():b().then(j),a)}}var oo,aN,bN=(aN=class{constructor(){De(this,oo)}destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),Vg(this.gcTime)&&ye(this,oo,Za.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(Su.isServer()?1/0:300*1e3))}clearGcTimeout(){L(this,oo)!==void 0&&(Za.clearTimeout(L(this,oo)),ye(this,oo,void 0))}},oo=new WeakMap,aN);function b3(e){return{onFetch:(t,r)=>{var m,g,v,b,j;const n=t.options,a=(v=(g=(m=t.fetchOptions)==null?void 0:m.meta)==null?void 0:g.fetchMore)==null?void 0:v.direction,o=((b=t.state.data)==null?void 0:b.pages)||[],c=((j=t.state.data)==null?void 0:j.pageParams)||[];let u={pages:[],pageParams:[]},f=0;const h=async()=>{let k=!1;const S=A=>{p3(A,()=>t.signal,()=>k=!0)},N=gN(t.options,t.fetchOptions),E=async(A,P,_)=>{if(k)return Promise.reject(t.signal.reason);if(P==null&&A.pages.length)return Promise.resolve(A);const D=(()=>{const Y={client:t.client,queryKey:t.queryKey,pageParam:P,direction:_?"backward":"forward",meta:t.options.meta};return S(Y),Y})(),U=await N(D),{maxPages:B}=t.options,F=_?m3:h3;return{pages:F(A.pages,U,B),pageParams:F(A.pageParams,P,B)}};if(a&&o.length){const A=a==="backward",P=A?w3:sw,_={pages:o,pageParams:c},O=P(n,_);u=await E(_,O,A)}else{const A=e??o.length;do{const P=f===0?c[0]??n.initialPageParam:sw(n,u);if(f>0&&P==null)break;u=await E(u,P),f++}while(f{var k,S;return(S=(k=t.options).persister)==null?void 0:S.call(k,h,{client:t.client,queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},r)}:t.fetchFn=h}}}function sw(e,{pages:t,pageParams:r}){const n=t.length-1;return t.length>0?e.getNextPageParam(t[n],t,r[n],r):void 0}function w3(e,{pages:t,pageParams:r}){var n;return t.length>0?(n=e.getPreviousPageParam)==null?void 0:n.call(e,t[0],t,r[0],r):void 0}var Os,so,_s,Zr,lo,Dt,Hu,uo,$r,wN,ui,oN,k3=(oN=class extends bN{constructor(t){super();De(this,$r);De(this,Os);De(this,so);De(this,_s);De(this,Zr);De(this,lo);De(this,Dt);De(this,Hu);De(this,uo);ye(this,uo,!1),ye(this,Hu,t.defaultOptions),this.setOptions(t.options),this.observers=[],ye(this,lo,t.client),ye(this,Zr,L(this,lo).getQueryCache()),this.queryKey=t.queryKey,this.queryHash=t.queryHash,ye(this,so,uw(this.options)),this.state=t.state??L(this,so),this.scheduleGc()}get meta(){return this.options.meta}get queryType(){return L(this,Os)}get promise(){var t;return(t=L(this,Dt))==null?void 0:t.promise}setOptions(t){if(this.options={...L(this,Hu),...t},t!=null&&t._type&&ye(this,Os,t._type),this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){const r=uw(this.options);r.data!==void 0&&(this.setState(lw(r.data,r.dataUpdatedAt)),ye(this,so,r))}}optionalRemove(){!this.observers.length&&this.state.fetchStatus==="idle"&&L(this,Zr).remove(this)}setData(t,r){const n=Yg(this.state.data,t,this.options);return He(this,$r,ui).call(this,{data:n,type:"success",dataUpdatedAt:r==null?void 0:r.updatedAt,manual:r==null?void 0:r.manual}),n}setState(t){He(this,$r,ui).call(this,{type:"setState",state:t})}cancel(t){var n,a;const r=(n=L(this,Dt))==null?void 0:n.promise;return(a=L(this,Dt))==null||a.cancel(t),r?r.then(Er).catch(Er):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return L(this,so)}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(t=>zr(t.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===by||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0?this.observers.some(t=>ya(t.options.staleTime,this)==="static"):!1}isStale(){return this.getObserversCount()>0?this.observers.some(t=>t.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(t=0){return this.state.data===void 0?!0:t==="static"?!1:this.state.isInvalidated?!0:!mN(this.state.dataUpdatedAt,t)}onFocus(){var r;const t=this.observers.find(n=>n.shouldFetchOnWindowFocus());t==null||t.refetch({cancelRefetch:!1}),(r=L(this,Dt))==null||r.continue()}onOnline(){var r;const t=this.observers.find(n=>n.shouldFetchOnReconnect());t==null||t.refetch({cancelRefetch:!1}),(r=L(this,Dt))==null||r.continue()}addObserver(t){this.observers.includes(t)||(this.observers.push(t),this.clearGcTimeout(),L(this,Zr).notify({type:"observerAdded",query:this,observer:t}))}removeObserver(t){this.observers.includes(t)&&(this.observers=this.observers.filter(r=>r!==t),this.observers.length||(L(this,Dt)&&(L(this,uo)||He(this,$r,wN).call(this)?L(this,Dt).cancel({revert:!0}):L(this,Dt).cancelRetry()),this.scheduleGc()),L(this,Zr).notify({type:"observerRemoved",query:this,observer:t}))}getObserversCount(){return this.observers.length}invalidate(){this.state.isInvalidated||He(this,$r,ui).call(this,{type:"invalidate"})}async fetch(t,r){var h,m,g,v,b,j,k,S,N,E,A;if(this.state.fetchStatus!=="idle"&&((h=L(this,Dt))==null?void 0:h.status())!=="rejected"){if(this.state.data!==void 0&&(r!=null&&r.cancelRefetch))this.cancel({silent:!0});else if(L(this,Dt))return L(this,Dt).continueRetry(),L(this,Dt).promise}if(t&&this.setOptions(t),!this.options.queryFn){const P=this.observers.find(_=>_.options.queryFn);P&&this.setOptions(P.options)}const n=new AbortController,a=P=>{Object.defineProperty(P,"signal",{enumerable:!0,get:()=>(ye(this,uo,!0),n.signal)})},o=()=>{const P=gN(this.options,r),O=(()=>{const D={client:L(this,lo),queryKey:this.queryKey,meta:this.meta};return a(D),D})();return ye(this,uo,!1),this.options.persister?this.options.persister(P,O,this):P(O)},u=(()=>{const P={fetchOptions:r,options:this.options,queryKey:this.queryKey,client:L(this,lo),state:this.state,fetchFn:o};return a(P),P})(),f=L(this,Os)==="infinite"?b3(this.options.pages):this.options.behavior;f==null||f.onFetch(u,this),ye(this,_s,this.state),(this.state.fetchStatus==="idle"||this.state.fetchMeta!==((m=u.fetchOptions)==null?void 0:m.meta))&&He(this,$r,ui).call(this,{type:"fetch",meta:(g=u.fetchOptions)==null?void 0:g.meta}),ye(this,Dt,xN({initialPromise:r==null?void 0:r.initialPromise,fn:u.fetchFn,onCancel:P=>{P instanceof Zg&&P.revert&&this.setState({...L(this,_s),fetchStatus:"idle"}),n.abort()},onFail:(P,_)=>{He(this,$r,ui).call(this,{type:"failed",failureCount:P,error:_})},onPause:()=>{He(this,$r,ui).call(this,{type:"pause"})},onContinue:()=>{He(this,$r,ui).call(this,{type:"continue"})},retry:u.options.retry,retryDelay:u.options.retryDelay,networkMode:u.options.networkMode,canRun:()=>!0}));try{const P=await L(this,Dt).start();if(P===void 0)throw new Error(`${this.queryHash} data is undefined`);return this.setData(P),(b=(v=L(this,Zr).config).onSuccess)==null||b.call(v,P,this),(k=(j=L(this,Zr).config).onSettled)==null||k.call(j,P,this.state.error,this),P}catch(P){if(P instanceof Zg){if(P.silent)return L(this,Dt).promise;if(P.revert){if(this.state.data===void 0)throw P;return this.state.data}}throw He(this,$r,ui).call(this,{type:"error",error:P}),(N=(S=L(this,Zr).config).onError)==null||N.call(S,P,this),(A=(E=L(this,Zr).config).onSettled)==null||A.call(E,this.state.data,P,this),P}finally{this.scheduleGc()}}},Os=new WeakMap,so=new WeakMap,_s=new WeakMap,Zr=new WeakMap,lo=new WeakMap,Dt=new WeakMap,Hu=new WeakMap,uo=new WeakMap,$r=new WeakSet,wN=function(){return this.state.fetchStatus==="paused"&&this.state.status==="pending"},ui=function(t){const r=n=>{switch(t.type){case"failed":return{...n,fetchFailureCount:t.failureCount,fetchFailureReason:t.error};case"pause":return{...n,fetchStatus:"paused"};case"continue":return{...n,fetchStatus:"fetching"};case"fetch":return{...n,...kN(n.data,this.options),fetchMeta:t.meta??null};case"success":const a={...n,...lw(t.data,t.dataUpdatedAt),dataUpdateCount:n.dataUpdateCount+1,...!t.manual&&{fetchStatus:"idle",fetchFailureCount:0,fetchFailureReason:null}};return ye(this,_s,t.manual?a:void 0),a;case"error":const o=t.error;return{...n,error:o,errorUpdateCount:n.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:n.fetchFailureCount+1,fetchFailureReason:o,fetchStatus:"idle",status:"error",isInvalidated:!0};case"invalidate":return{...n,isInvalidated:!0};case"setState":return{...n,...t.state}}};this.state=r(this.state),qt.batch(()=>{this.observers.forEach(n=>{n.onQueryUpdate()}),L(this,Zr).notify({query:this,type:"updated",action:t})})},oN);function kN(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:yN(t.networkMode)?"fetching":"paused",...e===void 0&&{error:null,status:"pending"}}}function lw(e,t){return{data:e,dataUpdatedAt:t??Date.now(),error:null,isInvalidated:!1,status:"success"}}function uw(e){const t=typeof e.initialData=="function"?e.initialData():e.initialData,r=t!==void 0,n=r?typeof e.initialDataUpdatedAt=="function"?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:r?n??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:r?"success":"pending",fetchStatus:"idle"}}var Nr,Ke,Wu,hr,co,Ms,di,fa,Ku,Is,Ts,fo,ho,ha,Ds,Xe,hu,Jg,ev,tv,rv,nv,iv,av,jN,sN,j3=(sN=class extends qu{constructor(t,r){super();De(this,Xe);De(this,Nr);De(this,Ke);De(this,Wu);De(this,hr);De(this,co);De(this,Ms);De(this,di);De(this,fa);De(this,Ku);De(this,Is);De(this,Ts);De(this,fo);De(this,ho);De(this,ha);De(this,Ds,new Set);this.options=r,ye(this,Nr,t),ye(this,fa,null),ye(this,di,Xg()),this.bindMethods(),this.setOptions(r)}bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(L(this,Ke).addObserver(this),cw(L(this,Ke),this.options)?He(this,Xe,hu).call(this):this.updateResult(),He(this,Xe,rv).call(this))}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return ov(L(this,Ke),this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return ov(L(this,Ke),this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,He(this,Xe,nv).call(this),He(this,Xe,iv).call(this),L(this,Ke).removeObserver(this)}setOptions(t){const r=this.options,n=L(this,Ke);if(this.options=L(this,Nr).defaultQueryOptions(t),this.options.enabled!==void 0&&typeof this.options.enabled!="boolean"&&typeof this.options.enabled!="function"&&typeof zr(this.options.enabled,L(this,Ke))!="boolean")throw new Error("Expected enabled to be a boolean or a callback that returns a boolean");He(this,Xe,av).call(this),L(this,Ke).setOptions(this.options),r._defaulted&&!qg(this.options,r)&&L(this,Nr).getQueryCache().notify({type:"observerOptionsUpdated",query:L(this,Ke),observer:this});const a=this.hasListeners();a&&dw(L(this,Ke),n,this.options,r)&&He(this,Xe,hu).call(this),this.updateResult(),a&&(L(this,Ke)!==n||zr(this.options.enabled,L(this,Ke))!==zr(r.enabled,L(this,Ke))||ya(this.options.staleTime,L(this,Ke))!==ya(r.staleTime,L(this,Ke)))&&He(this,Xe,Jg).call(this);const o=He(this,Xe,ev).call(this);a&&(L(this,Ke)!==n||zr(this.options.enabled,L(this,Ke))!==zr(r.enabled,L(this,Ke))||o!==L(this,ha))&&He(this,Xe,tv).call(this,o)}getOptimisticResult(t){const r=L(this,Nr).getQueryCache().build(L(this,Nr),t),n=this.createResult(r,t);return N3(this,n)&&(ye(this,hr,n),ye(this,Ms,this.options),ye(this,co,L(this,Ke).state)),n}getCurrentResult(){return L(this,hr)}trackResult(t,r){return new Proxy(t,{get:(n,a)=>(this.trackProp(a),r==null||r(a),a==="promise"&&(this.trackProp("data"),!this.options.experimental_prefetchInRender&&L(this,di).status==="pending"&&L(this,di).reject(new Error("experimental_prefetchInRender feature flag is not enabled"))),Reflect.get(n,a))})}trackProp(t){L(this,Ds).add(t)}getCurrentQuery(){return L(this,Ke)}refetch({...t}={}){return this.fetch({...t})}fetchOptimistic(t){const r=L(this,Nr).defaultQueryOptions(t),n=L(this,Nr).getQueryCache().build(L(this,Nr),r);return n.fetch().then(()=>this.createResult(n,r))}fetch(t){return He(this,Xe,hu).call(this,{...t,cancelRefetch:t.cancelRefetch??!0}).then(()=>(this.updateResult(),L(this,hr)))}createResult(t,r){var B;const n=L(this,Ke),a=this.options,o=L(this,hr),c=L(this,co),u=L(this,Ms),h=t!==n?t.state:L(this,Wu),{state:m}=t;let g={...m},v=!1,b;if(r._optimisticResults){const F=this.hasListeners(),Y=!F&&cw(t,r),H=F&&dw(t,n,r,a);(Y||H)&&(g={...g,...kN(m.data,t.options)}),r._optimisticResults==="isRestoring"&&(g.fetchStatus="idle")}let{error:j,errorUpdatedAt:k,status:S}=g;b=g.data;let N=!1;if(r.placeholderData!==void 0&&b===void 0&&S==="pending"){let F;o!=null&&o.isPlaceholderData&&r.placeholderData===(u==null?void 0:u.placeholderData)?(F=o.data,N=!0):F=typeof r.placeholderData=="function"?r.placeholderData((B=L(this,Ts))==null?void 0:B.state.data,L(this,Ts)):r.placeholderData,F!==void 0&&(S="success",b=Yg(o==null?void 0:o.data,F,r),v=!0)}if(r.select&&b!==void 0&&!N)if(o&&b===(c==null?void 0:c.data)&&r.select===L(this,Ku))b=L(this,Is);else try{ye(this,Ku,r.select),b=r.select(b),b=Yg(o==null?void 0:o.data,b,r),ye(this,Is,b),ye(this,fa,null)}catch(F){ye(this,fa,F)}L(this,fa)&&(j=L(this,fa),b=L(this,Is),k=Date.now(),S="error");const E=g.fetchStatus==="fetching",A=S==="pending",P=S==="error",_=A&&E,O=b!==void 0,U={status:S,fetchStatus:g.fetchStatus,isPending:A,isSuccess:S==="success",isError:P,isInitialLoading:_,isLoading:_,data:b,dataUpdatedAt:g.dataUpdatedAt,error:j,errorUpdatedAt:k,failureCount:g.fetchFailureCount,failureReason:g.fetchFailureReason,errorUpdateCount:g.errorUpdateCount,isFetched:t.isFetched(),isFetchedAfterMount:g.dataUpdateCount>h.dataUpdateCount||g.errorUpdateCount>h.errorUpdateCount,isFetching:E,isRefetching:E&&!A,isLoadingError:P&&!O,isPaused:g.fetchStatus==="paused",isPlaceholderData:v,isRefetchError:P&&O,isStale:wy(t,r),refetch:this.refetch,promise:L(this,di),isEnabled:zr(r.enabled,t)!==!1};if(this.options.experimental_prefetchInRender){const F=U.data!==void 0,Y=U.status==="error"&&!F,H=he=>{Y?he.reject(U.error):F&&he.resolve(U.data)},pe=()=>{const he=ye(this,di,U.promise=Xg());H(he)},ue=L(this,di);switch(ue.status){case"pending":t.queryHash===n.queryHash&&H(ue);break;case"fulfilled":(Y||U.data!==ue.value)&&pe();break;case"rejected":(!Y||U.error!==ue.reason)&&pe();break}}return U}updateResult(){const t=L(this,hr),r=this.createResult(L(this,Ke),this.options);if(ye(this,co,L(this,Ke).state),ye(this,Ms,this.options),L(this,co).data!==void 0&&ye(this,Ts,L(this,Ke)),qg(r,t))return;ye(this,hr,r);const n=()=>{if(!t)return!0;const{notifyOnChangeProps:a}=this.options,o=typeof a=="function"?a():a;if(o==="all"||!o&&!L(this,Ds).size)return!0;const c=new Set(o??L(this,Ds));return this.options.throwOnError&&c.add("error"),Object.keys(L(this,hr)).some(u=>{const f=u;return L(this,hr)[f]!==t[f]&&c.has(f)})};He(this,Xe,jN).call(this,{listeners:n()})}onQueryUpdate(){this.updateResult(),this.hasListeners()&&He(this,Xe,rv).call(this)}},Nr=new WeakMap,Ke=new WeakMap,Wu=new WeakMap,hr=new WeakMap,co=new WeakMap,Ms=new WeakMap,di=new WeakMap,fa=new WeakMap,Ku=new WeakMap,Is=new WeakMap,Ts=new WeakMap,fo=new WeakMap,ho=new WeakMap,ha=new WeakMap,Ds=new WeakMap,Xe=new WeakSet,hu=function(t){He(this,Xe,av).call(this);let r=L(this,Ke).fetch(this.options,t);return t!=null&&t.throwOnError||(r=r.catch(Er)),r},Jg=function(){He(this,Xe,nv).call(this);const t=ya(this.options.staleTime,L(this,Ke));if(Su.isServer()||L(this,hr).isStale||!Vg(t))return;const n=mN(L(this,hr).dataUpdatedAt,t)+1;ye(this,fo,Za.setTimeout(()=>{L(this,hr).isStale||this.updateResult()},n))},ev=function(){return(typeof this.options.refetchInterval=="function"?this.options.refetchInterval(L(this,Ke)):this.options.refetchInterval)??!1},tv=function(t){He(this,Xe,iv).call(this),ye(this,ha,t),!(Su.isServer()||zr(this.options.enabled,L(this,Ke))===!1||!Vg(L(this,ha))||L(this,ha)===0)&&ye(this,ho,Za.setInterval(()=>{(this.options.refetchIntervalInBackground||yy.isFocused())&&He(this,Xe,hu).call(this)},L(this,ha)))},rv=function(){He(this,Xe,Jg).call(this),He(this,Xe,tv).call(this,He(this,Xe,ev).call(this))},nv=function(){L(this,fo)!==void 0&&(Za.clearTimeout(L(this,fo)),ye(this,fo,void 0))},iv=function(){L(this,ho)!==void 0&&(Za.clearInterval(L(this,ho)),ye(this,ho,void 0))},av=function(){const t=L(this,Nr).getQueryCache().build(L(this,Nr),this.options);if(t===L(this,Ke))return;const r=L(this,Ke);ye(this,Ke,t),ye(this,Wu,t.state),this.hasListeners()&&(r==null||r.removeObserver(this),t.addObserver(this))},jN=function(t){qt.batch(()=>{t.listeners&&this.listeners.forEach(r=>{r(L(this,hr))}),L(this,Nr).getQueryCache().notify({query:L(this,Ke),type:"observerResultsUpdated"})})},sN);function S3(e,t){return zr(t.enabled,e)!==!1&&e.state.data===void 0&&!(e.state.status==="error"&&zr(t.retryOnMount,e)===!1)}function cw(e,t){return S3(e,t)||e.state.data!==void 0&&ov(e,t,t.refetchOnMount)}function ov(e,t,r){if(zr(t.enabled,e)!==!1&&ya(t.staleTime,e)!=="static"){const n=typeof r=="function"?r(e):r;return n==="always"||n!==!1&&wy(e,t)}return!1}function dw(e,t,r,n){return(e!==t||zr(n.enabled,e)===!1)&&(!r.suspense||e.state.status!=="error")&&wy(e,r)}function wy(e,t){return zr(t.enabled,e)!==!1&&e.isStaleByTime(ya(t.staleTime,e))}function N3(e,t){return!qg(e.getCurrentResult(),t)}var Gu,Dn,ir,mo,Rn,na,lN,E3=(lN=class extends bN{constructor(t){super();De(this,Rn);De(this,Gu);De(this,Dn);De(this,ir);De(this,mo);ye(this,Gu,t.client),this.mutationId=t.mutationId,ye(this,ir,t.mutationCache),ye(this,Dn,[]),this.state=t.state||A3(),this.setOptions(t.options),this.scheduleGc()}setOptions(t){this.options=t,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(t){L(this,Dn).includes(t)||(L(this,Dn).push(t),this.clearGcTimeout(),L(this,ir).notify({type:"observerAdded",mutation:this,observer:t}))}removeObserver(t){ye(this,Dn,L(this,Dn).filter(r=>r!==t)),this.scheduleGc(),L(this,ir).notify({type:"observerRemoved",mutation:this,observer:t})}optionalRemove(){L(this,Dn).length||(this.state.status==="pending"?this.scheduleGc():L(this,ir).remove(this))}continue(){var t;return((t=L(this,mo))==null?void 0:t.continue())??this.execute(this.state.variables)}async execute(t){var c,u,f,h,m,g,v,b,j,k,S,N,E,A,P,_,O,D;const r=()=>{He(this,Rn,na).call(this,{type:"continue"})},n={client:L(this,Gu),meta:this.options.meta,mutationKey:this.options.mutationKey};ye(this,mo,xN({fn:()=>this.options.mutationFn?this.options.mutationFn(t,n):Promise.reject(new Error("No mutationFn found")),onFail:(U,B)=>{He(this,Rn,na).call(this,{type:"failed",failureCount:U,error:B})},onPause:()=>{He(this,Rn,na).call(this,{type:"pause"})},onContinue:r,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>L(this,ir).canRun(this)}));const a=this.state.status==="pending",o=!L(this,mo).canStart();try{if(a)r();else{He(this,Rn,na).call(this,{type:"pending",variables:t,isPaused:o}),L(this,ir).config.onMutate&&await L(this,ir).config.onMutate(t,this,n);const B=await((u=(c=this.options).onMutate)==null?void 0:u.call(c,t,n));B!==this.state.context&&He(this,Rn,na).call(this,{type:"pending",context:B,variables:t,isPaused:o})}const U=await L(this,mo).start();return await((h=(f=L(this,ir).config).onSuccess)==null?void 0:h.call(f,U,t,this.state.context,this,n)),await((g=(m=this.options).onSuccess)==null?void 0:g.call(m,U,t,this.state.context,n)),await((b=(v=L(this,ir).config).onSettled)==null?void 0:b.call(v,U,null,this.state.variables,this.state.context,this,n)),await((k=(j=this.options).onSettled)==null?void 0:k.call(j,U,null,t,this.state.context,n)),He(this,Rn,na).call(this,{type:"success",data:U}),U}catch(U){try{await((N=(S=L(this,ir).config).onError)==null?void 0:N.call(S,U,t,this.state.context,this,n))}catch(B){Promise.reject(B)}try{await((A=(E=this.options).onError)==null?void 0:A.call(E,U,t,this.state.context,n))}catch(B){Promise.reject(B)}try{await((_=(P=L(this,ir).config).onSettled)==null?void 0:_.call(P,void 0,U,this.state.variables,this.state.context,this,n))}catch(B){Promise.reject(B)}try{await((D=(O=this.options).onSettled)==null?void 0:D.call(O,void 0,U,t,this.state.context,n))}catch(B){Promise.reject(B)}throw He(this,Rn,na).call(this,{type:"error",error:U}),U}finally{L(this,ir).runNext(this)}}},Gu=new WeakMap,Dn=new WeakMap,ir=new WeakMap,mo=new WeakMap,Rn=new WeakSet,na=function(t){const r=n=>{switch(t.type){case"failed":return{...n,failureCount:t.failureCount,failureReason:t.error};case"pause":return{...n,isPaused:!0};case"continue":return{...n,isPaused:!1};case"pending":return{...n,context:t.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:t.isPaused,status:"pending",variables:t.variables,submittedAt:Date.now()};case"success":return{...n,data:t.data,failureCount:0,failureReason:null,error:null,status:"success",isPaused:!1};case"error":return{...n,data:void 0,error:t.error,failureCount:n.failureCount+1,failureReason:t.error,isPaused:!1,status:"error"}}};this.state=r(this.state),qt.batch(()=>{L(this,Dn).forEach(n=>{n.onMutationUpdate(t)}),L(this,ir).notify({mutation:this,type:"updated",action:t})})},lN);function A3(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}var fi,vn,Vu,uN,C3=(uN=class extends qu{constructor(t={}){super();De(this,fi);De(this,vn);De(this,Vu);this.config=t,ye(this,fi,new Set),ye(this,vn,new Map),ye(this,Vu,0)}build(t,r,n){const a=new E3({client:t,mutationCache:this,mutationId:++kd(this,Vu)._,options:t.defaultMutationOptions(r),state:n});return this.add(a),a}add(t){L(this,fi).add(t);const r=Sd(t);if(typeof r=="string"){const n=L(this,vn).get(r);n?n.push(t):L(this,vn).set(r,[t])}this.notify({type:"added",mutation:t})}remove(t){if(L(this,fi).delete(t)){const r=Sd(t);if(typeof r=="string"){const n=L(this,vn).get(r);if(n)if(n.length>1){const a=n.indexOf(t);a!==-1&&n.splice(a,1)}else n[0]===t&&L(this,vn).delete(r)}}this.notify({type:"removed",mutation:t})}canRun(t){const r=Sd(t);if(typeof r=="string"){const n=L(this,vn).get(r),a=n==null?void 0:n.find(o=>o.state.status==="pending");return!a||a===t}else return!0}runNext(t){var n;const r=Sd(t);if(typeof r=="string"){const a=(n=L(this,vn).get(r))==null?void 0:n.find(o=>o!==t&&o.state.isPaused);return(a==null?void 0:a.continue())??Promise.resolve()}else return Promise.resolve()}clear(){qt.batch(()=>{L(this,fi).forEach(t=>{this.notify({type:"removed",mutation:t})}),L(this,fi).clear(),L(this,vn).clear()})}getAll(){return Array.from(L(this,fi))}find(t){const r={exact:!0,...t};return this.getAll().find(n=>iw(r,n))}findAll(t={}){return this.getAll().filter(r=>iw(t,r))}notify(t){qt.batch(()=>{this.listeners.forEach(r=>{r(t)})})}resumePausedMutations(){const t=this.getAll().filter(r=>r.state.isPaused);return qt.batch(()=>Promise.all(t.map(r=>r.continue().catch(Er))))}},fi=new WeakMap,vn=new WeakMap,Vu=new WeakMap,uN);function Sd(e){var t;return(t=e.options.scope)==null?void 0:t.id}var Ln,cN,P3=(cN=class extends qu{constructor(t={}){super();De(this,Ln);this.config=t,ye(this,Ln,new Map)}build(t,r,n){const a=r.queryKey,o=r.queryHash??xy(a,r);let c=this.get(o);return c||(c=new k3({client:t,queryKey:a,queryHash:o,options:t.defaultQueryOptions(r),state:n,defaultOptions:t.getQueryDefaults(a)}),this.add(c)),c}add(t){L(this,Ln).has(t.queryHash)||(L(this,Ln).set(t.queryHash,t),this.notify({type:"added",query:t}))}remove(t){const r=L(this,Ln).get(t.queryHash);r&&(t.destroy(),r===t&&L(this,Ln).delete(t.queryHash),this.notify({type:"removed",query:t}))}clear(){qt.batch(()=>{this.getAll().forEach(t=>{this.remove(t)})})}get(t){return L(this,Ln).get(t)}getAll(){return[...L(this,Ln).values()]}find(t){const r={exact:!0,...t};return this.getAll().find(n=>nw(r,n))}findAll(t={}){const r=this.getAll();return Object.keys(t).length>0?r.filter(n=>nw(t,n)):r}notify(t){qt.batch(()=>{this.listeners.forEach(r=>{r(t)})})}onFocus(){qt.batch(()=>{this.getAll().forEach(t=>{t.onFocus()})})}onOnline(){qt.batch(()=>{this.getAll().forEach(t=>{t.onOnline()})})}},Ln=new WeakMap,cN),vt,ma,pa,Rs,Ls,ga,$s,zs,dN,O3=(dN=class{constructor(e={}){De(this,vt);De(this,ma);De(this,pa);De(this,Rs);De(this,Ls);De(this,ga);De(this,$s);De(this,zs);ye(this,vt,e.queryCache||new P3),ye(this,ma,e.mutationCache||new C3),ye(this,pa,e.defaultOptions||{}),ye(this,Rs,new Map),ye(this,Ls,new Map),ye(this,ga,0)}mount(){kd(this,ga)._++,L(this,ga)===1&&(ye(this,$s,yy.subscribe(async e=>{e&&(await this.resumePausedMutations(),L(this,vt).onFocus())})),ye(this,zs,of.subscribe(async e=>{e&&(await this.resumePausedMutations(),L(this,vt).onOnline())})))}unmount(){var e,t;kd(this,ga)._--,L(this,ga)===0&&((e=L(this,$s))==null||e.call(this),ye(this,$s,void 0),(t=L(this,zs))==null||t.call(this),ye(this,zs,void 0))}isFetching(e){return L(this,vt).findAll({...e,fetchStatus:"fetching"}).length}isMutating(e){return L(this,ma).findAll({...e,status:"pending"}).length}getQueryData(e){var r;const t=this.defaultQueryOptions({queryKey:e});return(r=L(this,vt).get(t.queryHash))==null?void 0:r.state.data}ensureQueryData(e){const t=this.defaultQueryOptions(e),r=L(this,vt).build(this,t),n=r.state.data;return n===void 0?this.fetchQuery(e):(e.revalidateIfStale&&r.isStaleByTime(ya(t.staleTime,r))&&this.prefetchQuery(t),Promise.resolve(n))}getQueriesData(e){return L(this,vt).findAll(e).map(({queryKey:t,state:r})=>{const n=r.data;return[t,n]})}setQueryData(e,t,r){const n=this.defaultQueryOptions({queryKey:e}),a=L(this,vt).get(n.queryHash),o=a==null?void 0:a.state.data,c=c3(t,o);if(c!==void 0)return L(this,vt).build(this,n).setData(c,{...r,manual:!0})}setQueriesData(e,t,r){return qt.batch(()=>L(this,vt).findAll(e).map(({queryKey:n})=>[n,this.setQueryData(n,t,r)]))}getQueryState(e){var r;const t=this.defaultQueryOptions({queryKey:e});return(r=L(this,vt).get(t.queryHash))==null?void 0:r.state}removeQueries(e){const t=L(this,vt);qt.batch(()=>{t.findAll(e).forEach(r=>{t.remove(r)})})}resetQueries(e,t){const r=L(this,vt);return qt.batch(()=>(r.findAll(e).forEach(n=>{n.reset()}),this.refetchQueries({type:"active",...e},t)))}cancelQueries(e,t={}){const r={revert:!0,...t},n=qt.batch(()=>L(this,vt).findAll(e).map(a=>a.cancel(r)));return Promise.all(n).then(Er).catch(Er)}invalidateQueries(e,t={}){return qt.batch(()=>(L(this,vt).findAll(e).forEach(r=>{r.invalidate()}),(e==null?void 0:e.refetchType)==="none"?Promise.resolve():this.refetchQueries({...e,type:(e==null?void 0:e.refetchType)??(e==null?void 0:e.type)??"active"},t)))}refetchQueries(e,t={}){const r={...t,cancelRefetch:t.cancelRefetch??!0},n=qt.batch(()=>L(this,vt).findAll(e).filter(a=>!a.isDisabled()&&!a.isStatic()).map(a=>{let o=a.fetch(void 0,r);return r.throwOnError||(o=o.catch(Er)),a.state.fetchStatus==="paused"?Promise.resolve():o}));return Promise.all(n).then(Er)}fetchQuery(e){const t=this.defaultQueryOptions(e);t.retry===void 0&&(t.retry=!1);const r=L(this,vt).build(this,t);return r.isStaleByTime(ya(t.staleTime,r))?r.fetch(t):Promise.resolve(r.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(Er).catch(Er)}fetchInfiniteQuery(e){return e._type="infinite",this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(Er).catch(Er)}ensureInfiniteQueryData(e){return e._type="infinite",this.ensureQueryData(e)}resumePausedMutations(){return of.isOnline()?L(this,ma).resumePausedMutations():Promise.resolve()}getQueryCache(){return L(this,vt)}getMutationCache(){return L(this,ma)}getDefaultOptions(){return L(this,pa)}setDefaultOptions(e){ye(this,pa,e)}setQueryDefaults(e,t){L(this,Rs).set(ku(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){const t=[...L(this,Rs).values()],r={};return t.forEach(n=>{ju(e,n.queryKey)&&Object.assign(r,n.defaultOptions)}),r}setMutationDefaults(e,t){L(this,Ls).set(ku(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){const t=[...L(this,Ls).values()],r={};return t.forEach(n=>{ju(e,n.mutationKey)&&Object.assign(r,n.defaultOptions)}),r}defaultQueryOptions(e){if(e._defaulted)return e;const t={...L(this,pa).queries,...this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||(t.queryHash=xy(t.queryKey,t)),t.refetchOnReconnect===void 0&&(t.refetchOnReconnect=t.networkMode!=="always"),t.throwOnError===void 0&&(t.throwOnError=!!t.suspense),!t.networkMode&&t.persister&&(t.networkMode="offlineFirst"),t.queryFn===by&&(t.enabled=!1),t}defaultMutationOptions(e){return e!=null&&e._defaulted?e:{...L(this,pa).mutations,...(e==null?void 0:e.mutationKey)&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){L(this,vt).clear(),L(this,ma).clear()}},vt=new WeakMap,ma=new WeakMap,pa=new WeakMap,Rs=new WeakMap,Ls=new WeakMap,ga=new WeakMap,$s=new WeakMap,zs=new WeakMap,dN),SN=y.createContext(void 0),Yn=e=>{const t=y.useContext(SN);if(!t)throw new Error("No QueryClient set, use QueryClientProvider to set one");return t},_3=({client:e,children:t})=>(y.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),l.jsx(SN.Provider,{value:e,children:t})),NN=y.createContext(!1),M3=()=>y.useContext(NN);NN.Provider;function I3(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}var T3=y.createContext(I3()),D3=()=>y.useContext(T3),R3=(e,t,r)=>{const n=r!=null&&r.state.error&&typeof e.throwOnError=="function"?vN(e.throwOnError,[r.state.error,r]):e.throwOnError;(e.suspense||e.experimental_prefetchInRender||n)&&(t.isReset()||(e.retryOnMount=!1))},L3=e=>{y.useEffect(()=>{e.clearReset()},[e])},$3=({result:e,errorResetBoundary:t,throwOnError:r,query:n,suspense:a})=>e.isError&&!t.isReset()&&!e.isFetching&&n&&(a&&e.data===void 0||vN(r,[e.error,n])),z3=e=>{if(e.suspense){const r=a=>a==="static"?a:Math.max(a??1e3,1e3),n=e.staleTime;e.staleTime=typeof n=="function"?(...a)=>r(n(...a)):r(n),typeof e.gcTime=="number"&&(e.gcTime=Math.max(e.gcTime,1e3))}},F3=(e,t)=>e.isLoading&&e.isFetching&&!t,B3=(e,t)=>(e==null?void 0:e.suspense)&&t.isPending,fw=(e,t,r)=>t.fetchOptimistic(e).catch(()=>{r.clearReset()});function U3(e,t,r){var b,j,k,S;const n=M3(),a=D3(),o=Yn(),c=o.defaultQueryOptions(e);(j=(b=o.getDefaultOptions().queries)==null?void 0:b._experimental_beforeQuery)==null||j.call(b,c);const u=o.getQueryCache().get(c.queryHash),f=e.subscribed!==!1;c._optimisticResults=n?"isRestoring":f?"optimistic":void 0,z3(c),R3(c,a,u),L3(a);const h=!o.getQueryCache().get(c.queryHash),[m]=y.useState(()=>new t(o,c)),g=m.getOptimisticResult(c),v=!n&&f;if(y.useSyncExternalStore(y.useCallback(N=>{const E=v?m.subscribe(qt.batchCalls(N)):Er;return m.updateResult(),E},[m,v]),()=>m.getCurrentResult(),()=>m.getCurrentResult()),y.useEffect(()=>{m.setOptions(c)},[c,m]),B3(c,g))throw fw(c,m,a);if($3({result:g,errorResetBoundary:a,throwOnError:c.throwOnError,query:u,suspense:c.suspense}))throw g.error;if((S=(k=o.getDefaultOptions().queries)==null?void 0:k._experimental_afterQuery)==null||S.call(k,c,g),c.experimental_prefetchInRender&&!Su.isServer()&&F3(g,n)){const N=h?fw(c,m,a):u==null?void 0:u.promise;N==null||N.catch(Er).finally(()=>{m.updateResult()})}return c.notifyOnChangeProps?g:m.trackResult(g)}function $t(e,t){return U3(e,j3)}/** +`+w.stack}return{value:i,source:s,stack:x,digest:null}}function yp(i,s,d){return{value:i,source:null,stack:d??null,digest:s??null}}function xp(i,s){try{console.error(s.value)}catch(d){setTimeout(function(){throw d})}}var wM=typeof WeakMap=="function"?WeakMap:Map;function n1(i,s,d){d=ai(-1,d),d.tag=3,d.payload={element:null};var p=s.value;return d.callback=function(){ld||(ld=!0,Tp=p),xp(i,s)},d}function i1(i,s,d){d=ai(-1,d),d.tag=3;var p=i.type.getDerivedStateFromError;if(typeof p=="function"){var x=s.value;d.payload=function(){return p(x)},d.callback=function(){xp(i,s)}}var w=i.stateNode;return w!==null&&typeof w.componentDidCatch=="function"&&(d.callback=function(){xp(i,s),typeof p!="function"&&(qi===null?qi=new Set([this]):qi.add(this));var C=s.stack;this.componentDidCatch(s.value,{componentStack:C!==null?C:""})}),d}function a1(i,s,d){var p=i.pingCache;if(p===null){p=i.pingCache=new wM;var x=new Set;p.set(s,x)}else x=p.get(s),x===void 0&&(x=new Set,p.set(s,x));x.has(d)||(x.add(d),i=DM.bind(null,i,s,d),s.then(i,i))}function o1(i){do{var s;if((s=i.tag===13)&&(s=i.memoizedState,s=s!==null?s.dehydrated!==null:!0),s)return i;i=i.return}while(i!==null);return null}function s1(i,s,d,p,x){return(i.mode&1)===0?(i===s?i.flags|=65536:(i.flags|=128,d.flags|=131072,d.flags&=-52805,d.tag===1&&(d.alternate===null?d.tag=17:(s=ai(-1,1),s.tag=2,Gi(d,s,1))),d.lanes|=1),i):(i.flags|=65536,i.lanes=x,i)}var kM=P.ReactCurrentOwner,wr=!1;function dr(i,s,d,p){s.child=i===null?Ab(s,null,d,p):Qo(s,i.child,d,p)}function l1(i,s,d,p,x){d=d.render;var w=s.ref;return Xo(s,x),p=cp(i,s,d,p,w,x),d=dp(),i!==null&&!wr?(s.updateQueue=i.updateQueue,s.flags&=-2053,i.lanes&=~x,oi(i,s,x)):(ct&&d&&Vm(s),s.flags|=1,dr(i,s,p,x),s.child)}function u1(i,s,d,p,x){if(i===null){var w=d.type;return typeof w=="function"&&!Bp(w)&&w.defaultProps===void 0&&d.compare===null&&d.defaultProps===void 0?(s.tag=15,s.type=w,c1(i,s,w,p,x)):(i=md(d.type,null,p,s,s.mode,x),i.ref=s.ref,i.return=s,s.child=i)}if(w=i.child,(i.lanes&x)===0){var C=w.memoizedProps;if(d=d.compare,d=d!==null?d:Ol,d(C,p)&&i.ref===s.ref)return oi(i,s,x)}return s.flags|=1,i=Zi(w,p),i.ref=s.ref,i.return=s,s.child=i}function c1(i,s,d,p,x){if(i!==null){var w=i.memoizedProps;if(Ol(w,p)&&i.ref===s.ref)if(wr=!1,s.pendingProps=p=w,(i.lanes&x)!==0)(i.flags&131072)!==0&&(wr=!0);else return s.lanes=i.lanes,oi(i,s,x)}return bp(i,s,d,p,x)}function d1(i,s,d){var p=s.pendingProps,x=p.children,w=i!==null?i.memoizedState:null;if(p.mode==="hidden")if((s.mode&1)===0)s.memoizedState={baseLanes:0,cachePool:null,transitions:null},rt(ts,Dr),Dr|=d;else{if((d&1073741824)===0)return i=w!==null?w.baseLanes|d:d,s.lanes=s.childLanes=1073741824,s.memoizedState={baseLanes:i,cachePool:null,transitions:null},s.updateQueue=null,rt(ts,Dr),Dr|=i,null;s.memoizedState={baseLanes:0,cachePool:null,transitions:null},p=w!==null?w.baseLanes:d,rt(ts,Dr),Dr|=p}else w!==null?(p=w.baseLanes|d,s.memoizedState=null):p=d,rt(ts,Dr),Dr|=p;return dr(i,s,x,d),s.child}function f1(i,s){var d=s.ref;(i===null&&d!==null||i!==null&&i.ref!==d)&&(s.flags|=512,s.flags|=2097152)}function bp(i,s,d,p,x){var w=br(d)?_a:er.current;return w=Ko(s,w),Xo(s,x),d=cp(i,s,d,p,w,x),p=dp(),i!==null&&!wr?(s.updateQueue=i.updateQueue,s.flags&=-2053,i.lanes&=~x,oi(i,s,x)):(ct&&p&&Vm(s),s.flags|=1,dr(i,s,d,x),s.child)}function h1(i,s,d,p,x){if(br(d)){var w=!0;zc(s)}else w=!1;if(Xo(s,x),s.stateNode===null)nd(i,s),t1(s,d,p),vp(s,d,p,x),p=!0;else if(i===null){var C=s.stateNode,T=s.memoizedProps;C.props=T;var R=C.context,Q=d.contextType;typeof Q=="object"&&Q!==null?Q=Vr(Q):(Q=br(d)?_a:er.current,Q=Ko(s,Q));var le=d.getDerivedStateFromProps,ce=typeof le=="function"||typeof C.getSnapshotBeforeUpdate=="function";ce||typeof C.UNSAFE_componentWillReceiveProps!="function"&&typeof C.componentWillReceiveProps!="function"||(T!==p||R!==Q)&&r1(s,C,p,Q),Ki=!1;var oe=s.memoizedState;C.state=oe,qc(s,p,C,x),R=s.memoizedState,T!==p||oe!==R||xr.current||Ki?(typeof le=="function"&&(gp(s,d,le,p),R=s.memoizedState),(T=Ki||e1(s,d,T,p,oe,R,Q))?(ce||typeof C.UNSAFE_componentWillMount!="function"&&typeof C.componentWillMount!="function"||(typeof C.componentWillMount=="function"&&C.componentWillMount(),typeof C.UNSAFE_componentWillMount=="function"&&C.UNSAFE_componentWillMount()),typeof C.componentDidMount=="function"&&(s.flags|=4194308)):(typeof C.componentDidMount=="function"&&(s.flags|=4194308),s.memoizedProps=p,s.memoizedState=R),C.props=p,C.state=R,C.context=Q,p=T):(typeof C.componentDidMount=="function"&&(s.flags|=4194308),p=!1)}else{C=s.stateNode,Pb(i,s),T=s.memoizedProps,Q=s.type===s.elementType?T:fn(s.type,T),C.props=Q,ce=s.pendingProps,oe=C.context,R=d.contextType,typeof R=="object"&&R!==null?R=Vr(R):(R=br(d)?_a:er.current,R=Ko(s,R));var ve=d.getDerivedStateFromProps;(le=typeof ve=="function"||typeof C.getSnapshotBeforeUpdate=="function")||typeof C.UNSAFE_componentWillReceiveProps!="function"&&typeof C.componentWillReceiveProps!="function"||(T!==ce||oe!==R)&&r1(s,C,p,R),Ki=!1,oe=s.memoizedState,C.state=oe,qc(s,p,C,x);var je=s.memoizedState;T!==ce||oe!==je||xr.current||Ki?(typeof ve=="function"&&(gp(s,d,ve,p),je=s.memoizedState),(Q=Ki||e1(s,d,Q,p,oe,je,R)||!1)?(le||typeof C.UNSAFE_componentWillUpdate!="function"&&typeof C.componentWillUpdate!="function"||(typeof C.componentWillUpdate=="function"&&C.componentWillUpdate(p,je,R),typeof C.UNSAFE_componentWillUpdate=="function"&&C.UNSAFE_componentWillUpdate(p,je,R)),typeof C.componentDidUpdate=="function"&&(s.flags|=4),typeof C.getSnapshotBeforeUpdate=="function"&&(s.flags|=1024)):(typeof C.componentDidUpdate!="function"||T===i.memoizedProps&&oe===i.memoizedState||(s.flags|=4),typeof C.getSnapshotBeforeUpdate!="function"||T===i.memoizedProps&&oe===i.memoizedState||(s.flags|=1024),s.memoizedProps=p,s.memoizedState=je),C.props=p,C.state=je,C.context=R,p=Q):(typeof C.componentDidUpdate!="function"||T===i.memoizedProps&&oe===i.memoizedState||(s.flags|=4),typeof C.getSnapshotBeforeUpdate!="function"||T===i.memoizedProps&&oe===i.memoizedState||(s.flags|=1024),p=!1)}return wp(i,s,d,p,w,x)}function wp(i,s,d,p,x,w){f1(i,s);var C=(s.flags&128)!==0;if(!p&&!C)return x&&yb(s,d,!1),oi(i,s,w);p=s.stateNode,kM.current=s;var T=C&&typeof d.getDerivedStateFromError!="function"?null:p.render();return s.flags|=1,i!==null&&C?(s.child=Qo(s,i.child,null,w),s.child=Qo(s,null,T,w)):dr(i,s,T,w),s.memoizedState=p.state,x&&yb(s,d,!0),s.child}function m1(i){var s=i.stateNode;s.pendingContext?gb(i,s.pendingContext,s.pendingContext!==s.context):s.context&&gb(i,s.context,!1),ip(i,s.containerInfo)}function p1(i,s,d,p,x){return qo(),Xm(x),s.flags|=256,dr(i,s,d,p),s.child}var kp={dehydrated:null,treeContext:null,retryLane:0};function jp(i){return{baseLanes:i,cachePool:null,transitions:null}}function g1(i,s,d){var p=s.pendingProps,x=mt.current,w=!1,C=(s.flags&128)!==0,T;if((T=C)||(T=i!==null&&i.memoizedState===null?!1:(x&2)!==0),T?(w=!0,s.flags&=-129):(i===null||i.memoizedState!==null)&&(x|=1),rt(mt,x&1),i===null)return Ym(s),i=s.memoizedState,i!==null&&(i=i.dehydrated,i!==null)?((s.mode&1)===0?s.lanes=1:i.data==="$!"?s.lanes=8:s.lanes=1073741824,null):(C=p.children,i=p.fallback,w?(p=s.mode,w=s.child,C={mode:"hidden",children:C},(p&1)===0&&w!==null?(w.childLanes=0,w.pendingProps=C):w=pd(C,p,0,null),i=Ba(i,p,d,null),w.return=s,i.return=s,w.sibling=i,s.child=w,s.child.memoizedState=jp(d),s.memoizedState=kp,i):Sp(s,C));if(x=i.memoizedState,x!==null&&(T=x.dehydrated,T!==null))return jM(i,s,C,p,T,x,d);if(w){w=p.fallback,C=s.mode,x=i.child,T=x.sibling;var R={mode:"hidden",children:p.children};return(C&1)===0&&s.child!==x?(p=s.child,p.childLanes=0,p.pendingProps=R,s.deletions=null):(p=Zi(x,R),p.subtreeFlags=x.subtreeFlags&14680064),T!==null?w=Zi(T,w):(w=Ba(w,C,d,null),w.flags|=2),w.return=s,p.return=s,p.sibling=w,s.child=p,p=w,w=s.child,C=i.child.memoizedState,C=C===null?jp(d):{baseLanes:C.baseLanes|d,cachePool:null,transitions:C.transitions},w.memoizedState=C,w.childLanes=i.childLanes&~d,s.memoizedState=kp,p}return w=i.child,i=w.sibling,p=Zi(w,{mode:"visible",children:p.children}),(s.mode&1)===0&&(p.lanes=d),p.return=s,p.sibling=null,i!==null&&(d=s.deletions,d===null?(s.deletions=[i],s.flags|=16):d.push(i)),s.child=p,s.memoizedState=null,p}function Sp(i,s){return s=pd({mode:"visible",children:s},i.mode,0,null),s.return=i,i.child=s}function rd(i,s,d,p){return p!==null&&Xm(p),Qo(s,i.child,null,d),i=Sp(s,s.pendingProps.children),i.flags|=2,s.memoizedState=null,i}function jM(i,s,d,p,x,w,C){if(d)return s.flags&256?(s.flags&=-257,p=yp(Error(r(422))),rd(i,s,C,p)):s.memoizedState!==null?(s.child=i.child,s.flags|=128,null):(w=p.fallback,x=s.mode,p=pd({mode:"visible",children:p.children},x,0,null),w=Ba(w,x,C,null),w.flags|=2,p.return=s,w.return=s,p.sibling=w,s.child=p,(s.mode&1)!==0&&Qo(s,i.child,null,C),s.child.memoizedState=jp(C),s.memoizedState=kp,w);if((s.mode&1)===0)return rd(i,s,C,null);if(x.data==="$!"){if(p=x.nextSibling&&x.nextSibling.dataset,p)var T=p.dgst;return p=T,w=Error(r(419)),p=yp(w,p,void 0),rd(i,s,C,p)}if(T=(C&i.childLanes)!==0,wr||T){if(p=It,p!==null){switch(C&-C){case 4:x=2;break;case 16:x=8;break;case 64: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:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:x=32;break;case 536870912:x=268435456;break;default:x=0}x=(x&(p.suspendedLanes|C))!==0?0:x,x!==0&&x!==w.retryLane&&(w.retryLane=x,ii(i,x),pn(p,i,x,-1))}return Fp(),p=yp(Error(r(421))),rd(i,s,C,p)}return x.data==="$?"?(s.flags|=128,s.child=i.child,s=RM.bind(null,i),x._reactRetry=s,null):(i=w.treeContext,Tr=Bi(x.nextSibling),Ir=s,ct=!0,dn=null,i!==null&&(Kr[Gr++]=ri,Kr[Gr++]=ni,Kr[Gr++]=Ma,ri=i.id,ni=i.overflow,Ma=s),s=Sp(s,p.children),s.flags|=4096,s)}function v1(i,s,d){i.lanes|=s;var p=i.alternate;p!==null&&(p.lanes|=s),tp(i.return,s,d)}function Np(i,s,d,p,x){var w=i.memoizedState;w===null?i.memoizedState={isBackwards:s,rendering:null,renderingStartTime:0,last:p,tail:d,tailMode:x}:(w.isBackwards=s,w.rendering=null,w.renderingStartTime=0,w.last=p,w.tail=d,w.tailMode=x)}function y1(i,s,d){var p=s.pendingProps,x=p.revealOrder,w=p.tail;if(dr(i,s,p.children,d),p=mt.current,(p&2)!==0)p=p&1|2,s.flags|=128;else{if(i!==null&&(i.flags&128)!==0)e:for(i=s.child;i!==null;){if(i.tag===13)i.memoizedState!==null&&v1(i,d,s);else if(i.tag===19)v1(i,d,s);else if(i.child!==null){i.child.return=i,i=i.child;continue}if(i===s)break e;for(;i.sibling===null;){if(i.return===null||i.return===s)break e;i=i.return}i.sibling.return=i.return,i=i.sibling}p&=1}if(rt(mt,p),(s.mode&1)===0)s.memoizedState=null;else switch(x){case"forwards":for(d=s.child,x=null;d!==null;)i=d.alternate,i!==null&&Qc(i)===null&&(x=d),d=d.sibling;d=x,d===null?(x=s.child,s.child=null):(x=d.sibling,d.sibling=null),Np(s,!1,x,d,w);break;case"backwards":for(d=null,x=s.child,s.child=null;x!==null;){if(i=x.alternate,i!==null&&Qc(i)===null){s.child=x;break}i=x.sibling,x.sibling=d,d=x,x=i}Np(s,!0,d,null,w);break;case"together":Np(s,!1,null,null,void 0);break;default:s.memoizedState=null}return s.child}function nd(i,s){(s.mode&1)===0&&i!==null&&(i.alternate=null,s.alternate=null,s.flags|=2)}function oi(i,s,d){if(i!==null&&(s.dependencies=i.dependencies),La|=s.lanes,(d&s.childLanes)===0)return null;if(i!==null&&s.child!==i.child)throw Error(r(153));if(s.child!==null){for(i=s.child,d=Zi(i,i.pendingProps),s.child=d,d.return=s;i.sibling!==null;)i=i.sibling,d=d.sibling=Zi(i,i.pendingProps),d.return=s;d.sibling=null}return s.child}function SM(i,s,d){switch(s.tag){case 3:m1(s),qo();break;case 5:Mb(s);break;case 1:br(s.type)&&zc(s);break;case 4:ip(s,s.stateNode.containerInfo);break;case 10:var p=s.type._context,x=s.memoizedProps.value;rt(Kc,p._currentValue),p._currentValue=x;break;case 13:if(p=s.memoizedState,p!==null)return p.dehydrated!==null?(rt(mt,mt.current&1),s.flags|=128,null):(d&s.child.childLanes)!==0?g1(i,s,d):(rt(mt,mt.current&1),i=oi(i,s,d),i!==null?i.sibling:null);rt(mt,mt.current&1);break;case 19:if(p=(d&s.childLanes)!==0,(i.flags&128)!==0){if(p)return y1(i,s,d);s.flags|=128}if(x=s.memoizedState,x!==null&&(x.rendering=null,x.tail=null,x.lastEffect=null),rt(mt,mt.current),p)break;return null;case 22:case 23:return s.lanes=0,d1(i,s,d)}return oi(i,s,d)}var x1,Ep,b1,w1;x1=function(i,s){for(var d=s.child;d!==null;){if(d.tag===5||d.tag===6)i.appendChild(d.stateNode);else if(d.tag!==4&&d.child!==null){d.child.return=d,d=d.child;continue}if(d===s)break;for(;d.sibling===null;){if(d.return===null||d.return===s)return;d=d.return}d.sibling.return=d.return,d=d.sibling}},Ep=function(){},b1=function(i,s,d,p){var x=i.memoizedProps;if(x!==p){i=s.stateNode,Da(Cn.current);var w=null;switch(d){case"input":x=Fe(i,x),p=Fe(i,p),w=[];break;case"select":x=J({},x,{value:void 0}),p=J({},p,{value:void 0}),w=[];break;case"textarea":x=et(i,x),p=et(i,p),w=[];break;default:typeof x.onClick!="function"&&typeof p.onClick=="function"&&(i.onclick=Rc)}_r(d,p);var C;d=null;for(Q in x)if(!p.hasOwnProperty(Q)&&x.hasOwnProperty(Q)&&x[Q]!=null)if(Q==="style"){var T=x[Q];for(C in T)T.hasOwnProperty(C)&&(d||(d={}),d[C]="")}else Q!=="dangerouslySetInnerHTML"&&Q!=="children"&&Q!=="suppressContentEditableWarning"&&Q!=="suppressHydrationWarning"&&Q!=="autoFocus"&&(a.hasOwnProperty(Q)?w||(w=[]):(w=w||[]).push(Q,null));for(Q in p){var R=p[Q];if(T=x!=null?x[Q]:void 0,p.hasOwnProperty(Q)&&R!==T&&(R!=null||T!=null))if(Q==="style")if(T){for(C in T)!T.hasOwnProperty(C)||R&&R.hasOwnProperty(C)||(d||(d={}),d[C]="");for(C in R)R.hasOwnProperty(C)&&T[C]!==R[C]&&(d||(d={}),d[C]=R[C])}else d||(w||(w=[]),w.push(Q,d)),d=R;else Q==="dangerouslySetInnerHTML"?(R=R?R.__html:void 0,T=T?T.__html:void 0,R!=null&&T!==R&&(w=w||[]).push(Q,R)):Q==="children"?typeof R!="string"&&typeof R!="number"||(w=w||[]).push(Q,""+R):Q!=="suppressContentEditableWarning"&&Q!=="suppressHydrationWarning"&&(a.hasOwnProperty(Q)?(R!=null&&Q==="onScroll"&&it("scroll",i),w||T===R||(w=[])):(w=w||[]).push(Q,R))}d&&(w=w||[]).push("style",d);var Q=w;(s.updateQueue=Q)&&(s.flags|=4)}},w1=function(i,s,d,p){d!==p&&(s.flags|=4)};function Kl(i,s){if(!ct)switch(i.tailMode){case"hidden":s=i.tail;for(var d=null;s!==null;)s.alternate!==null&&(d=s),s=s.sibling;d===null?i.tail=null:d.sibling=null;break;case"collapsed":d=i.tail;for(var p=null;d!==null;)d.alternate!==null&&(p=d),d=d.sibling;p===null?s||i.tail===null?i.tail=null:i.tail.sibling=null:p.sibling=null}}function rr(i){var s=i.alternate!==null&&i.alternate.child===i.child,d=0,p=0;if(s)for(var x=i.child;x!==null;)d|=x.lanes|x.childLanes,p|=x.subtreeFlags&14680064,p|=x.flags&14680064,x.return=i,x=x.sibling;else for(x=i.child;x!==null;)d|=x.lanes|x.childLanes,p|=x.subtreeFlags,p|=x.flags,x.return=i,x=x.sibling;return i.subtreeFlags|=p,i.childLanes=d,s}function NM(i,s,d){var p=s.pendingProps;switch(qm(s),s.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return rr(s),null;case 1:return br(s.type)&&$c(),rr(s),null;case 3:return p=s.stateNode,Zo(),at(xr),at(er),sp(),p.pendingContext&&(p.context=p.pendingContext,p.pendingContext=null),(i===null||i.child===null)&&(Hc(s)?s.flags|=4:i===null||i.memoizedState.isDehydrated&&(s.flags&256)===0||(s.flags|=1024,dn!==null&&(Lp(dn),dn=null))),Ep(i,s),rr(s),null;case 5:ap(s);var x=Da(Fl.current);if(d=s.type,i!==null&&s.stateNode!=null)b1(i,s,d,p,x),i.ref!==s.ref&&(s.flags|=512,s.flags|=2097152);else{if(!p){if(s.stateNode===null)throw Error(r(166));return rr(s),null}if(i=Da(Cn.current),Hc(s)){p=s.stateNode,d=s.type;var w=s.memoizedProps;switch(p[An]=s,p[Dl]=w,i=(s.mode&1)!==0,d){case"dialog":it("cancel",p),it("close",p);break;case"iframe":case"object":case"embed":it("load",p);break;case"video":case"audio":for(x=0;x<\/script>",i=i.removeChild(i.firstChild)):typeof p.is=="string"?i=C.createElement(d,{is:p.is}):(i=C.createElement(d),d==="select"&&(C=i,p.multiple?C.multiple=!0:p.size&&(C.size=p.size))):i=C.createElementNS(i,d),i[An]=s,i[Dl]=p,x1(i,s,!1,!1),s.stateNode=i;e:{switch(C=sm(d,p),d){case"dialog":it("cancel",i),it("close",i),x=p;break;case"iframe":case"object":case"embed":it("load",i),x=p;break;case"video":case"audio":for(x=0;xrs&&(s.flags|=128,p=!0,Kl(w,!1),s.lanes=4194304)}else{if(!p)if(i=Qc(C),i!==null){if(s.flags|=128,p=!0,d=i.updateQueue,d!==null&&(s.updateQueue=d,s.flags|=4),Kl(w,!0),w.tail===null&&w.tailMode==="hidden"&&!C.alternate&&!ct)return rr(s),null}else 2*bt()-w.renderingStartTime>rs&&d!==1073741824&&(s.flags|=128,p=!0,Kl(w,!1),s.lanes=4194304);w.isBackwards?(C.sibling=s.child,s.child=C):(d=w.last,d!==null?d.sibling=C:s.child=C,w.last=C)}return w.tail!==null?(s=w.tail,w.rendering=s,w.tail=s.sibling,w.renderingStartTime=bt(),s.sibling=null,d=mt.current,rt(mt,p?d&1|2:d&1),s):(rr(s),null);case 22:case 23:return zp(),p=s.memoizedState!==null,i!==null&&i.memoizedState!==null!==p&&(s.flags|=8192),p&&(s.mode&1)!==0?(Dr&1073741824)!==0&&(rr(s),s.subtreeFlags&6&&(s.flags|=8192)):rr(s),null;case 24:return null;case 25:return null}throw Error(r(156,s.tag))}function EM(i,s){switch(qm(s),s.tag){case 1:return br(s.type)&&$c(),i=s.flags,i&65536?(s.flags=i&-65537|128,s):null;case 3:return Zo(),at(xr),at(er),sp(),i=s.flags,(i&65536)!==0&&(i&128)===0?(s.flags=i&-65537|128,s):null;case 5:return ap(s),null;case 13:if(at(mt),i=s.memoizedState,i!==null&&i.dehydrated!==null){if(s.alternate===null)throw Error(r(340));qo()}return i=s.flags,i&65536?(s.flags=i&-65537|128,s):null;case 19:return at(mt),null;case 4:return Zo(),null;case 10:return ep(s.type._context),null;case 22:case 23:return zp(),null;case 24:return null;default:return null}}var id=!1,nr=!1,AM=typeof WeakSet=="function"?WeakSet:Set,be=null;function es(i,s){var d=i.ref;if(d!==null)if(typeof d=="function")try{d(null)}catch(p){gt(i,s,p)}else d.current=null}function Ap(i,s,d){try{d()}catch(p){gt(i,s,p)}}var k1=!1;function CM(i,s){if(zm=Sc,i=eb(),_m(i)){if("selectionStart"in i)var d={start:i.selectionStart,end:i.selectionEnd};else e:{d=(d=i.ownerDocument)&&d.defaultView||window;var p=d.getSelection&&d.getSelection();if(p&&p.rangeCount!==0){d=p.anchorNode;var x=p.anchorOffset,w=p.focusNode;p=p.focusOffset;try{d.nodeType,w.nodeType}catch{d=null;break e}var C=0,T=-1,R=-1,Q=0,le=0,ce=i,oe=null;t:for(;;){for(var ve;ce!==d||x!==0&&ce.nodeType!==3||(T=C+x),ce!==w||p!==0&&ce.nodeType!==3||(R=C+p),ce.nodeType===3&&(C+=ce.nodeValue.length),(ve=ce.firstChild)!==null;)oe=ce,ce=ve;for(;;){if(ce===i)break t;if(oe===d&&++Q===x&&(T=C),oe===w&&++le===p&&(R=C),(ve=ce.nextSibling)!==null)break;ce=oe,oe=ce.parentNode}ce=ve}d=T===-1||R===-1?null:{start:T,end:R}}else d=null}d=d||{start:0,end:0}}else d=null;for(Fm={focusedElem:i,selectionRange:d},Sc=!1,be=s;be!==null;)if(s=be,i=s.child,(s.subtreeFlags&1028)!==0&&i!==null)i.return=s,be=i;else for(;be!==null;){s=be;try{var je=s.alternate;if((s.flags&1024)!==0)switch(s.tag){case 0:case 11:case 15:break;case 1:if(je!==null){var Ne=je.memoizedProps,wt=je.memoizedState,G=s.stateNode,z=G.getSnapshotBeforeUpdate(s.elementType===s.type?Ne:fn(s.type,Ne),wt);G.__reactInternalSnapshotBeforeUpdate=z}break;case 3:var V=s.stateNode.containerInfo;V.nodeType===1?V.textContent="":V.nodeType===9&&V.documentElement&&V.removeChild(V.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(r(163))}}catch(fe){gt(s,s.return,fe)}if(i=s.sibling,i!==null){i.return=s.return,be=i;break}be=s.return}return je=k1,k1=!1,je}function Gl(i,s,d){var p=s.updateQueue;if(p=p!==null?p.lastEffect:null,p!==null){var x=p=p.next;do{if((x.tag&i)===i){var w=x.destroy;x.destroy=void 0,w!==void 0&&Ap(s,d,w)}x=x.next}while(x!==p)}}function ad(i,s){if(s=s.updateQueue,s=s!==null?s.lastEffect:null,s!==null){var d=s=s.next;do{if((d.tag&i)===i){var p=d.create;d.destroy=p()}d=d.next}while(d!==s)}}function Cp(i){var s=i.ref;if(s!==null){var d=i.stateNode;switch(i.tag){case 5:i=d;break;default:i=d}typeof s=="function"?s(i):s.current=i}}function j1(i){var s=i.alternate;s!==null&&(i.alternate=null,j1(s)),i.child=null,i.deletions=null,i.sibling=null,i.tag===5&&(s=i.stateNode,s!==null&&(delete s[An],delete s[Dl],delete s[Wm],delete s[cM],delete s[dM])),i.stateNode=null,i.return=null,i.dependencies=null,i.memoizedProps=null,i.memoizedState=null,i.pendingProps=null,i.stateNode=null,i.updateQueue=null}function S1(i){return i.tag===5||i.tag===3||i.tag===4}function N1(i){e:for(;;){for(;i.sibling===null;){if(i.return===null||S1(i.return))return null;i=i.return}for(i.sibling.return=i.return,i=i.sibling;i.tag!==5&&i.tag!==6&&i.tag!==18;){if(i.flags&2||i.child===null||i.tag===4)continue e;i.child.return=i,i=i.child}if(!(i.flags&2))return i.stateNode}}function Pp(i,s,d){var p=i.tag;if(p===5||p===6)i=i.stateNode,s?d.nodeType===8?d.parentNode.insertBefore(i,s):d.insertBefore(i,s):(d.nodeType===8?(s=d.parentNode,s.insertBefore(i,d)):(s=d,s.appendChild(i)),d=d._reactRootContainer,d!=null||s.onclick!==null||(s.onclick=Rc));else if(p!==4&&(i=i.child,i!==null))for(Pp(i,s,d),i=i.sibling;i!==null;)Pp(i,s,d),i=i.sibling}function Op(i,s,d){var p=i.tag;if(p===5||p===6)i=i.stateNode,s?d.insertBefore(i,s):d.appendChild(i);else if(p!==4&&(i=i.child,i!==null))for(Op(i,s,d),i=i.sibling;i!==null;)Op(i,s,d),i=i.sibling}var Ht=null,hn=!1;function Vi(i,s,d){for(d=d.child;d!==null;)E1(i,s,d),d=d.sibling}function E1(i,s,d){if(En&&typeof En.onCommitFiberUnmount=="function")try{En.onCommitFiberUnmount(yc,d)}catch{}switch(d.tag){case 5:nr||es(d,s);case 6:var p=Ht,x=hn;Ht=null,Vi(i,s,d),Ht=p,hn=x,Ht!==null&&(hn?(i=Ht,d=d.stateNode,i.nodeType===8?i.parentNode.removeChild(d):i.removeChild(d)):Ht.removeChild(d.stateNode));break;case 18:Ht!==null&&(hn?(i=Ht,d=d.stateNode,i.nodeType===8?Hm(i.parentNode,d):i.nodeType===1&&Hm(i,d),Sl(i)):Hm(Ht,d.stateNode));break;case 4:p=Ht,x=hn,Ht=d.stateNode.containerInfo,hn=!0,Vi(i,s,d),Ht=p,hn=x;break;case 0:case 11:case 14:case 15:if(!nr&&(p=d.updateQueue,p!==null&&(p=p.lastEffect,p!==null))){x=p=p.next;do{var w=x,C=w.destroy;w=w.tag,C!==void 0&&((w&2)!==0||(w&4)!==0)&&Ap(d,s,C),x=x.next}while(x!==p)}Vi(i,s,d);break;case 1:if(!nr&&(es(d,s),p=d.stateNode,typeof p.componentWillUnmount=="function"))try{p.props=d.memoizedProps,p.state=d.memoizedState,p.componentWillUnmount()}catch(T){gt(d,s,T)}Vi(i,s,d);break;case 21:Vi(i,s,d);break;case 22:d.mode&1?(nr=(p=nr)||d.memoizedState!==null,Vi(i,s,d),nr=p):Vi(i,s,d);break;default:Vi(i,s,d)}}function A1(i){var s=i.updateQueue;if(s!==null){i.updateQueue=null;var d=i.stateNode;d===null&&(d=i.stateNode=new AM),s.forEach(function(p){var x=LM.bind(null,i,p);d.has(p)||(d.add(p),p.then(x,x))})}}function mn(i,s){var d=s.deletions;if(d!==null)for(var p=0;px&&(x=C),p&=~w}if(p=x,p=bt()-p,p=(120>p?120:480>p?480:1080>p?1080:1920>p?1920:3e3>p?3e3:4320>p?4320:1960*OM(p/1960))-p,10i?16:i,Qi===null)var p=!1;else{if(i=Qi,Qi=null,cd=0,(qe&6)!==0)throw Error(r(331));var x=qe;for(qe|=4,be=i.current;be!==null;){var w=be,C=w.child;if((be.flags&16)!==0){var T=w.deletions;if(T!==null){for(var R=0;Rbt()-Ip?za(i,0):Mp|=d),jr(i,s)}function F1(i,s){s===0&&((i.mode&1)===0?s=1:(s=bc,bc<<=1,(bc&130023424)===0&&(bc=4194304)));var d=fr();i=ii(i,s),i!==null&&(xl(i,s,d),jr(i,d))}function RM(i){var s=i.memoizedState,d=0;s!==null&&(d=s.retryLane),F1(i,d)}function LM(i,s){var d=0;switch(i.tag){case 13:var p=i.stateNode,x=i.memoizedState;x!==null&&(d=x.retryLane);break;case 19:p=i.stateNode;break;default:throw Error(r(314))}p!==null&&p.delete(s),F1(i,d)}var B1;B1=function(i,s,d){if(i!==null)if(i.memoizedProps!==s.pendingProps||xr.current)wr=!0;else{if((i.lanes&d)===0&&(s.flags&128)===0)return wr=!1,SM(i,s,d);wr=(i.flags&131072)!==0}else wr=!1,ct&&(s.flags&1048576)!==0&&bb(s,Uc,s.index);switch(s.lanes=0,s.tag){case 2:var p=s.type;nd(i,s),i=s.pendingProps;var x=Ko(s,er.current);Xo(s,d),x=cp(null,s,p,i,x,d);var w=dp();return s.flags|=1,typeof x=="object"&&x!==null&&typeof x.render=="function"&&x.$$typeof===void 0?(s.tag=1,s.memoizedState=null,s.updateQueue=null,br(p)?(w=!0,zc(s)):w=!1,s.memoizedState=x.state!==null&&x.state!==void 0?x.state:null,np(s),x.updater=td,s.stateNode=x,x._reactInternals=s,vp(s,p,i,d),s=wp(null,s,p,!0,w,d)):(s.tag=0,ct&&w&&Vm(s),dr(null,s,x,d),s=s.child),s;case 16:p=s.elementType;e:{switch(nd(i,s),i=s.pendingProps,x=p._init,p=x(p._payload),s.type=p,x=s.tag=zM(p),i=fn(p,i),x){case 0:s=bp(null,s,p,i,d);break e;case 1:s=h1(null,s,p,i,d);break e;case 11:s=l1(null,s,p,i,d);break e;case 14:s=u1(null,s,p,fn(p.type,i),d);break e}throw Error(r(306,p,""))}return s;case 0:return p=s.type,x=s.pendingProps,x=s.elementType===p?x:fn(p,x),bp(i,s,p,x,d);case 1:return p=s.type,x=s.pendingProps,x=s.elementType===p?x:fn(p,x),h1(i,s,p,x,d);case 3:e:{if(m1(s),i===null)throw Error(r(387));p=s.pendingProps,w=s.memoizedState,x=w.element,Pb(i,s),qc(s,p,null,d);var C=s.memoizedState;if(p=C.element,w.isDehydrated)if(w={element:p,isDehydrated:!1,cache:C.cache,pendingSuspenseBoundaries:C.pendingSuspenseBoundaries,transitions:C.transitions},s.updateQueue.baseState=w,s.memoizedState=w,s.flags&256){x=Jo(Error(r(423)),s),s=p1(i,s,p,d,x);break e}else if(p!==x){x=Jo(Error(r(424)),s),s=p1(i,s,p,d,x);break e}else for(Tr=Bi(s.stateNode.containerInfo.firstChild),Ir=s,ct=!0,dn=null,d=Ab(s,null,p,d),s.child=d;d;)d.flags=d.flags&-3|4096,d=d.sibling;else{if(qo(),p===x){s=oi(i,s,d);break e}dr(i,s,p,d)}s=s.child}return s;case 5:return Mb(s),i===null&&Ym(s),p=s.type,x=s.pendingProps,w=i!==null?i.memoizedProps:null,C=x.children,Bm(p,x)?C=null:w!==null&&Bm(p,w)&&(s.flags|=32),f1(i,s),dr(i,s,C,d),s.child;case 6:return i===null&&Ym(s),null;case 13:return g1(i,s,d);case 4:return ip(s,s.stateNode.containerInfo),p=s.pendingProps,i===null?s.child=Qo(s,null,p,d):dr(i,s,p,d),s.child;case 11:return p=s.type,x=s.pendingProps,x=s.elementType===p?x:fn(p,x),l1(i,s,p,x,d);case 7:return dr(i,s,s.pendingProps,d),s.child;case 8:return dr(i,s,s.pendingProps.children,d),s.child;case 12:return dr(i,s,s.pendingProps.children,d),s.child;case 10:e:{if(p=s.type._context,x=s.pendingProps,w=s.memoizedProps,C=x.value,rt(Kc,p._currentValue),p._currentValue=C,w!==null)if(cn(w.value,C)){if(w.children===x.children&&!xr.current){s=oi(i,s,d);break e}}else for(w=s.child,w!==null&&(w.return=s);w!==null;){var T=w.dependencies;if(T!==null){C=w.child;for(var R=T.firstContext;R!==null;){if(R.context===p){if(w.tag===1){R=ai(-1,d&-d),R.tag=2;var Q=w.updateQueue;if(Q!==null){Q=Q.shared;var le=Q.pending;le===null?R.next=R:(R.next=le.next,le.next=R),Q.pending=R}}w.lanes|=d,R=w.alternate,R!==null&&(R.lanes|=d),tp(w.return,d,s),T.lanes|=d;break}R=R.next}}else if(w.tag===10)C=w.type===s.type?null:w.child;else if(w.tag===18){if(C=w.return,C===null)throw Error(r(341));C.lanes|=d,T=C.alternate,T!==null&&(T.lanes|=d),tp(C,d,s),C=w.sibling}else C=w.child;if(C!==null)C.return=w;else for(C=w;C!==null;){if(C===s){C=null;break}if(w=C.sibling,w!==null){w.return=C.return,C=w;break}C=C.return}w=C}dr(i,s,x.children,d),s=s.child}return s;case 9:return x=s.type,p=s.pendingProps.children,Xo(s,d),x=Vr(x),p=p(x),s.flags|=1,dr(i,s,p,d),s.child;case 14:return p=s.type,x=fn(p,s.pendingProps),x=fn(p.type,x),u1(i,s,p,x,d);case 15:return c1(i,s,s.type,s.pendingProps,d);case 17:return p=s.type,x=s.pendingProps,x=s.elementType===p?x:fn(p,x),nd(i,s),s.tag=1,br(p)?(i=!0,zc(s)):i=!1,Xo(s,d),t1(s,p,x),vp(s,p,x,d),wp(null,s,p,!0,i,d);case 19:return y1(i,s,d);case 22:return d1(i,s,d)}throw Error(r(156,s.tag))};function U1(i,s){return wx(i,s)}function $M(i,s,d,p){this.tag=i,this.key=d,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=s,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=p,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Yr(i,s,d,p){return new $M(i,s,d,p)}function Bp(i){return i=i.prototype,!(!i||!i.isReactComponent)}function zM(i){if(typeof i=="function")return Bp(i)?1:0;if(i!=null){if(i=i.$$typeof,i===H)return 11;if(i===he)return 14}return 2}function Zi(i,s){var d=i.alternate;return d===null?(d=Yr(i.tag,s,i.key,i.mode),d.elementType=i.elementType,d.type=i.type,d.stateNode=i.stateNode,d.alternate=i,i.alternate=d):(d.pendingProps=s,d.type=i.type,d.flags=0,d.subtreeFlags=0,d.deletions=null),d.flags=i.flags&14680064,d.childLanes=i.childLanes,d.lanes=i.lanes,d.child=i.child,d.memoizedProps=i.memoizedProps,d.memoizedState=i.memoizedState,d.updateQueue=i.updateQueue,s=i.dependencies,d.dependencies=s===null?null:{lanes:s.lanes,firstContext:s.firstContext},d.sibling=i.sibling,d.index=i.index,d.ref=i.ref,d}function md(i,s,d,p,x,w){var C=2;if(p=i,typeof i=="function")Bp(i)&&(C=1);else if(typeof i=="string")C=5;else e:switch(i){case D:return Ba(d.children,x,w,s);case U:C=8,x|=8;break;case B:return i=Yr(12,d,s,x|2),i.elementType=B,i.lanes=w,i;case pe:return i=Yr(13,d,s,x),i.elementType=pe,i.lanes=w,i;case ue:return i=Yr(19,d,s,x),i.elementType=ue,i.lanes=w,i;case se:return pd(d,x,w,s);default:if(typeof i=="object"&&i!==null)switch(i.$$typeof){case F:C=10;break e;case Y:C=9;break e;case H:C=11;break e;case he:C=14;break e;case ae:C=16,p=null;break e}throw Error(r(130,i==null?i:typeof i,""))}return s=Yr(C,d,s,x),s.elementType=i,s.type=p,s.lanes=w,s}function Ba(i,s,d,p){return i=Yr(7,i,p,s),i.lanes=d,i}function pd(i,s,d,p){return i=Yr(22,i,p,s),i.elementType=se,i.lanes=d,i.stateNode={isHidden:!1},i}function Up(i,s,d){return i=Yr(6,i,null,s),i.lanes=d,i}function Hp(i,s,d){return s=Yr(4,i.children!==null?i.children:[],i.key,s),s.lanes=d,s.stateNode={containerInfo:i.containerInfo,pendingChildren:null,implementation:i.implementation},s}function FM(i,s,d,p,x){this.tag=s,this.containerInfo=i,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=gm(0),this.expirationTimes=gm(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=gm(0),this.identifierPrefix=p,this.onRecoverableError=x,this.mutableSourceEagerHydrationData=null}function Wp(i,s,d,p,x,w,C,T,R){return i=new FM(i,s,d,T,R),s===1?(s=1,w===!0&&(s|=8)):s=0,w=Yr(3,null,null,s),i.current=w,w.stateNode=i,w.memoizedState={element:p,isDehydrated:d,cache:null,transitions:null,pendingSuspenseBoundaries:null},np(w),i}function BM(i,s,d){var p=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}return e(),Xp.exports=t3(),Xp.exports}var nw;function r3(){if(nw)return jd;nw=1;var e=hN();return jd.createRoot=e.createRoot,jd.hydrateRoot=e.hydrateRoot,jd}var n3=r3();const i3=vy(n3);var qu=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},ao,ua,Cs,nN,a3=(nN=class extends qu{constructor(){super();De(this,ao);De(this,ua);De(this,Cs);ye(this,Cs,t=>{if(typeof window<"u"&&window.addEventListener){const r=()=>t();return window.addEventListener("visibilitychange",r,!1),()=>{window.removeEventListener("visibilitychange",r)}}})}onSubscribe(){L(this,ua)||this.setEventListener(L(this,Cs))}onUnsubscribe(){var t;this.hasListeners()||((t=L(this,ua))==null||t.call(this),ye(this,ua,void 0))}setEventListener(t){var r;ye(this,Cs,t),(r=L(this,ua))==null||r.call(this),ye(this,ua,t(n=>{typeof n=="boolean"?this.setFocused(n):this.onFocus()}))}setFocused(t){L(this,ao)!==t&&(ye(this,ao,t),this.onFocus())}onFocus(){const t=this.isFocused();this.listeners.forEach(r=>{r(t)})}isFocused(){var t;return typeof L(this,ao)=="boolean"?L(this,ao):((t=globalThis.document)==null?void 0:t.visibilityState)!=="hidden"}},ao=new WeakMap,ua=new WeakMap,Cs=new WeakMap,nN),xy=new a3,o3={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e),setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)},ca,gy,iN,s3=(iN=class{constructor(){De(this,ca,o3);De(this,gy,!1)}setTimeoutProvider(e){ye(this,ca,e)}setTimeout(e,t){return L(this,ca).setTimeout(e,t)}clearTimeout(e){L(this,ca).clearTimeout(e)}setInterval(e,t){return L(this,ca).setInterval(e,t)}clearInterval(e){L(this,ca).clearInterval(e)}},ca=new WeakMap,gy=new WeakMap,iN),Za=new s3;function l3(e){setTimeout(e,0)}var u3=typeof window>"u"||"Deno"in globalThis;function Er(){}function c3(e,t){return typeof e=="function"?e(t):e}function Vg(e){return typeof e=="number"&&e>=0&&e!==1/0}function mN(e,t){return Math.max(e+(t||0)-Date.now(),0)}function ya(e,t){return typeof e=="function"?e(t):e}function zr(e,t){return typeof e=="function"?e(t):e}function iw(e,t){const{type:r="all",exact:n,fetchStatus:a,predicate:o,queryKey:c,stale:u}=e;if(c){if(n){if(t.queryHash!==by(c,t.options))return!1}else if(!ju(t.queryKey,c))return!1}if(r!=="all"){const f=t.isActive();if(r==="active"&&!f||r==="inactive"&&f)return!1}return!(typeof u=="boolean"&&t.isStale()!==u||a&&a!==t.state.fetchStatus||o&&!o(t))}function aw(e,t){const{exact:r,status:n,predicate:a,mutationKey:o}=e;if(o){if(!t.options.mutationKey)return!1;if(r){if(ku(t.options.mutationKey)!==ku(o))return!1}else if(!ju(t.options.mutationKey,o))return!1}return!(n&&t.state.status!==n||a&&!a(t))}function by(e,t){return((t==null?void 0:t.queryKeyHashFn)||ku)(e)}function ku(e){return JSON.stringify(e,(t,r)=>Qg(r)?Object.keys(r).sort().reduce((n,a)=>(n[a]=r[a],n),{}):r)}function ju(e,t){return e===t?!0:typeof e!=typeof t?!1:e&&t&&typeof e=="object"&&typeof t=="object"?Object.keys(t).every(r=>ju(e[r],t[r])):!1}var d3=Object.prototype.hasOwnProperty;function pN(e,t,r=0){if(e===t)return e;if(r>500)return t;const n=ow(e)&&ow(t);if(!n&&!(Qg(e)&&Qg(t)))return t;const o=(n?e:Object.keys(e)).length,c=n?t:Object.keys(t),u=c.length,f=n?new Array(u):{};let h=0;for(let m=0;m{Za.setTimeout(t,e)})}function Yg(e,t,r){return typeof r.structuralSharing=="function"?r.structuralSharing(e,t):r.structuralSharing!==!1?pN(e,t):t}function h3(e,t,r=0){const n=[...e,t];return r&&n.length>r?n.slice(1):n}function m3(e,t,r=0){const n=[t,...e];return r&&n.length>r?n.slice(0,-1):n}var wy=Symbol();function gN(e,t){return!e.queryFn&&(t!=null&&t.initialPromise)?()=>t.initialPromise:!e.queryFn||e.queryFn===wy?()=>Promise.reject(new Error(`Missing queryFn: '${e.queryHash}'`)):e.queryFn}function vN(e,t){return typeof e=="function"?e(...t):!!e}function p3(e,t,r){let n=!1,a;return Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(a??(a=t()),n||(n=!0,a.aborted?r():a.addEventListener("abort",r,{once:!0})),a)}),e}var Su=(()=>{let e=()=>u3;return{isServer(){return e()},setIsServer(t){e=t}}})();function Xg(){let e,t;const r=new Promise((a,o)=>{e=a,t=o});r.status="pending",r.catch(()=>{});function n(a){Object.assign(r,a),delete r.resolve,delete r.reject}return r.resolve=a=>{n({status:"fulfilled",value:a}),e(a)},r.reject=a=>{n({status:"rejected",reason:a}),t(a)},r}var g3=l3;function v3(){let e=[],t=0,r=u=>{u()},n=u=>{u()},a=g3;const o=u=>{t?e.push(u):a(()=>{r(u)})},c=()=>{const u=e;e=[],u.length&&a(()=>{n(()=>{u.forEach(f=>{r(f)})})})};return{batch:u=>{let f;t++;try{f=u()}finally{t--,t||c()}return f},batchCalls:u=>(...f)=>{o(()=>{u(...f)})},schedule:o,setNotifyFunction:u=>{r=u},setBatchNotifyFunction:u=>{n=u},setScheduler:u=>{a=u}}}var qt=v3(),Ps,da,Os,aN,y3=(aN=class extends qu{constructor(){super();De(this,Ps,!0);De(this,da);De(this,Os);ye(this,Os,t=>{if(typeof window<"u"&&window.addEventListener){const r=()=>t(!0),n=()=>t(!1);return window.addEventListener("online",r,!1),window.addEventListener("offline",n,!1),()=>{window.removeEventListener("online",r),window.removeEventListener("offline",n)}}})}onSubscribe(){L(this,da)||this.setEventListener(L(this,Os))}onUnsubscribe(){var t;this.hasListeners()||((t=L(this,da))==null||t.call(this),ye(this,da,void 0))}setEventListener(t){var r;ye(this,Os,t),(r=L(this,da))==null||r.call(this),ye(this,da,t(this.setOnline.bind(this)))}setOnline(t){L(this,Ps)!==t&&(ye(this,Ps,t),this.listeners.forEach(n=>{n(t)}))}isOnline(){return L(this,Ps)}},Ps=new WeakMap,da=new WeakMap,Os=new WeakMap,aN),of=new y3;function x3(e){return Math.min(1e3*2**e,3e4)}function yN(e){return(e??"online")==="online"?of.isOnline():!0}var Zg=class extends Error{constructor(e){super("CancelledError"),this.revert=e==null?void 0:e.revert,this.silent=e==null?void 0:e.silent}};function xN(e){let t=!1,r=0,n;const a=Xg(),o=()=>a.status!=="pending",c=k=>{var S;if(!o()){const N=new Zg(k);v(N),(S=e.onCancel)==null||S.call(e,N)}},u=()=>{t=!0},f=()=>{t=!1},h=()=>xy.isFocused()&&(e.networkMode==="always"||of.isOnline())&&e.canRun(),m=()=>yN(e.networkMode)&&e.canRun(),g=k=>{o()||(n==null||n(),a.resolve(k))},v=k=>{o()||(n==null||n(),a.reject(k))},b=()=>new Promise(k=>{var S;n=N=>{(o()||h())&&k(N)},(S=e.onPause)==null||S.call(e)}).then(()=>{var k;n=void 0,o()||(k=e.onContinue)==null||k.call(e)}),j=()=>{if(o())return;let k;const S=r===0?e.initialPromise:void 0;try{k=S??e.fn()}catch(N){k=Promise.reject(N)}Promise.resolve(k).then(g).catch(N=>{var O;if(o())return;const E=e.retry??(Su.isServer()?0:3),A=e.retryDelay??x3,P=typeof A=="function"?A(r,N):A,_=E===!0||typeof E=="number"&&rh()?void 0:b()).then(()=>{t?v(N):j()})})};return{promise:a,status:()=>a.status,cancel:c,continue:()=>(n==null||n(),a),cancelRetry:u,continueRetry:f,canStart:m,start:()=>(m()?j():b().then(j),a)}}var oo,oN,bN=(oN=class{constructor(){De(this,oo)}destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),Vg(this.gcTime)&&ye(this,oo,Za.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(Su.isServer()?1/0:300*1e3))}clearGcTimeout(){L(this,oo)!==void 0&&(Za.clearTimeout(L(this,oo)),ye(this,oo,void 0))}},oo=new WeakMap,oN);function b3(e){return{onFetch:(t,r)=>{var m,g,v,b,j;const n=t.options,a=(v=(g=(m=t.fetchOptions)==null?void 0:m.meta)==null?void 0:g.fetchMore)==null?void 0:v.direction,o=((b=t.state.data)==null?void 0:b.pages)||[],c=((j=t.state.data)==null?void 0:j.pageParams)||[];let u={pages:[],pageParams:[]},f=0;const h=async()=>{let k=!1;const S=A=>{p3(A,()=>t.signal,()=>k=!0)},N=gN(t.options,t.fetchOptions),E=async(A,P,_)=>{if(k)return Promise.reject(t.signal.reason);if(P==null&&A.pages.length)return Promise.resolve(A);const D=(()=>{const Y={client:t.client,queryKey:t.queryKey,pageParam:P,direction:_?"backward":"forward",meta:t.options.meta};return S(Y),Y})(),U=await N(D),{maxPages:B}=t.options,F=_?m3:h3;return{pages:F(A.pages,U,B),pageParams:F(A.pageParams,P,B)}};if(a&&o.length){const A=a==="backward",P=A?w3:lw,_={pages:o,pageParams:c},O=P(n,_);u=await E(_,O,A)}else{const A=e??o.length;do{const P=f===0?c[0]??n.initialPageParam:lw(n,u);if(f>0&&P==null)break;u=await E(u,P),f++}while(f{var k,S;return(S=(k=t.options).persister)==null?void 0:S.call(k,h,{client:t.client,queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},r)}:t.fetchFn=h}}}function lw(e,{pages:t,pageParams:r}){const n=t.length-1;return t.length>0?e.getNextPageParam(t[n],t,r[n],r):void 0}function w3(e,{pages:t,pageParams:r}){var n;return t.length>0?(n=e.getPreviousPageParam)==null?void 0:n.call(e,t[0],t,r[0],r):void 0}var _s,so,Ms,Zr,lo,Dt,Hu,uo,$r,wN,ui,sN,k3=(sN=class extends bN{constructor(t){super();De(this,$r);De(this,_s);De(this,so);De(this,Ms);De(this,Zr);De(this,lo);De(this,Dt);De(this,Hu);De(this,uo);ye(this,uo,!1),ye(this,Hu,t.defaultOptions),this.setOptions(t.options),this.observers=[],ye(this,lo,t.client),ye(this,Zr,L(this,lo).getQueryCache()),this.queryKey=t.queryKey,this.queryHash=t.queryHash,ye(this,so,cw(this.options)),this.state=t.state??L(this,so),this.scheduleGc()}get meta(){return this.options.meta}get queryType(){return L(this,_s)}get promise(){var t;return(t=L(this,Dt))==null?void 0:t.promise}setOptions(t){if(this.options={...L(this,Hu),...t},t!=null&&t._type&&ye(this,_s,t._type),this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){const r=cw(this.options);r.data!==void 0&&(this.setState(uw(r.data,r.dataUpdatedAt)),ye(this,so,r))}}optionalRemove(){!this.observers.length&&this.state.fetchStatus==="idle"&&L(this,Zr).remove(this)}setData(t,r){const n=Yg(this.state.data,t,this.options);return He(this,$r,ui).call(this,{data:n,type:"success",dataUpdatedAt:r==null?void 0:r.updatedAt,manual:r==null?void 0:r.manual}),n}setState(t){He(this,$r,ui).call(this,{type:"setState",state:t})}cancel(t){var n,a;const r=(n=L(this,Dt))==null?void 0:n.promise;return(a=L(this,Dt))==null||a.cancel(t),r?r.then(Er).catch(Er):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return L(this,so)}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(t=>zr(t.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===wy||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0?this.observers.some(t=>ya(t.options.staleTime,this)==="static"):!1}isStale(){return this.getObserversCount()>0?this.observers.some(t=>t.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(t=0){return this.state.data===void 0?!0:t==="static"?!1:this.state.isInvalidated?!0:!mN(this.state.dataUpdatedAt,t)}onFocus(){var r;const t=this.observers.find(n=>n.shouldFetchOnWindowFocus());t==null||t.refetch({cancelRefetch:!1}),(r=L(this,Dt))==null||r.continue()}onOnline(){var r;const t=this.observers.find(n=>n.shouldFetchOnReconnect());t==null||t.refetch({cancelRefetch:!1}),(r=L(this,Dt))==null||r.continue()}addObserver(t){this.observers.includes(t)||(this.observers.push(t),this.clearGcTimeout(),L(this,Zr).notify({type:"observerAdded",query:this,observer:t}))}removeObserver(t){this.observers.includes(t)&&(this.observers=this.observers.filter(r=>r!==t),this.observers.length||(L(this,Dt)&&(L(this,uo)||He(this,$r,wN).call(this)?L(this,Dt).cancel({revert:!0}):L(this,Dt).cancelRetry()),this.scheduleGc()),L(this,Zr).notify({type:"observerRemoved",query:this,observer:t}))}getObserversCount(){return this.observers.length}invalidate(){this.state.isInvalidated||He(this,$r,ui).call(this,{type:"invalidate"})}async fetch(t,r){var h,m,g,v,b,j,k,S,N,E,A;if(this.state.fetchStatus!=="idle"&&((h=L(this,Dt))==null?void 0:h.status())!=="rejected"){if(this.state.data!==void 0&&(r!=null&&r.cancelRefetch))this.cancel({silent:!0});else if(L(this,Dt))return L(this,Dt).continueRetry(),L(this,Dt).promise}if(t&&this.setOptions(t),!this.options.queryFn){const P=this.observers.find(_=>_.options.queryFn);P&&this.setOptions(P.options)}const n=new AbortController,a=P=>{Object.defineProperty(P,"signal",{enumerable:!0,get:()=>(ye(this,uo,!0),n.signal)})},o=()=>{const P=gN(this.options,r),O=(()=>{const D={client:L(this,lo),queryKey:this.queryKey,meta:this.meta};return a(D),D})();return ye(this,uo,!1),this.options.persister?this.options.persister(P,O,this):P(O)},u=(()=>{const P={fetchOptions:r,options:this.options,queryKey:this.queryKey,client:L(this,lo),state:this.state,fetchFn:o};return a(P),P})(),f=L(this,_s)==="infinite"?b3(this.options.pages):this.options.behavior;f==null||f.onFetch(u,this),ye(this,Ms,this.state),(this.state.fetchStatus==="idle"||this.state.fetchMeta!==((m=u.fetchOptions)==null?void 0:m.meta))&&He(this,$r,ui).call(this,{type:"fetch",meta:(g=u.fetchOptions)==null?void 0:g.meta}),ye(this,Dt,xN({initialPromise:r==null?void 0:r.initialPromise,fn:u.fetchFn,onCancel:P=>{P instanceof Zg&&P.revert&&this.setState({...L(this,Ms),fetchStatus:"idle"}),n.abort()},onFail:(P,_)=>{He(this,$r,ui).call(this,{type:"failed",failureCount:P,error:_})},onPause:()=>{He(this,$r,ui).call(this,{type:"pause"})},onContinue:()=>{He(this,$r,ui).call(this,{type:"continue"})},retry:u.options.retry,retryDelay:u.options.retryDelay,networkMode:u.options.networkMode,canRun:()=>!0}));try{const P=await L(this,Dt).start();if(P===void 0)throw new Error(`${this.queryHash} data is undefined`);return this.setData(P),(b=(v=L(this,Zr).config).onSuccess)==null||b.call(v,P,this),(k=(j=L(this,Zr).config).onSettled)==null||k.call(j,P,this.state.error,this),P}catch(P){if(P instanceof Zg){if(P.silent)return L(this,Dt).promise;if(P.revert){if(this.state.data===void 0)throw P;return this.state.data}}throw He(this,$r,ui).call(this,{type:"error",error:P}),(N=(S=L(this,Zr).config).onError)==null||N.call(S,P,this),(A=(E=L(this,Zr).config).onSettled)==null||A.call(E,this.state.data,P,this),P}finally{this.scheduleGc()}}},_s=new WeakMap,so=new WeakMap,Ms=new WeakMap,Zr=new WeakMap,lo=new WeakMap,Dt=new WeakMap,Hu=new WeakMap,uo=new WeakMap,$r=new WeakSet,wN=function(){return this.state.fetchStatus==="paused"&&this.state.status==="pending"},ui=function(t){const r=n=>{switch(t.type){case"failed":return{...n,fetchFailureCount:t.failureCount,fetchFailureReason:t.error};case"pause":return{...n,fetchStatus:"paused"};case"continue":return{...n,fetchStatus:"fetching"};case"fetch":return{...n,...kN(n.data,this.options),fetchMeta:t.meta??null};case"success":const a={...n,...uw(t.data,t.dataUpdatedAt),dataUpdateCount:n.dataUpdateCount+1,...!t.manual&&{fetchStatus:"idle",fetchFailureCount:0,fetchFailureReason:null}};return ye(this,Ms,t.manual?a:void 0),a;case"error":const o=t.error;return{...n,error:o,errorUpdateCount:n.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:n.fetchFailureCount+1,fetchFailureReason:o,fetchStatus:"idle",status:"error",isInvalidated:!0};case"invalidate":return{...n,isInvalidated:!0};case"setState":return{...n,...t.state}}};this.state=r(this.state),qt.batch(()=>{this.observers.forEach(n=>{n.onQueryUpdate()}),L(this,Zr).notify({query:this,type:"updated",action:t})})},sN);function kN(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:yN(t.networkMode)?"fetching":"paused",...e===void 0&&{error:null,status:"pending"}}}function uw(e,t){return{data:e,dataUpdatedAt:t??Date.now(),error:null,isInvalidated:!1,status:"success"}}function cw(e){const t=typeof e.initialData=="function"?e.initialData():e.initialData,r=t!==void 0,n=r?typeof e.initialDataUpdatedAt=="function"?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:r?n??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:r?"success":"pending",fetchStatus:"idle"}}var Nr,Ke,Wu,hr,co,Is,di,fa,Ku,Ts,Ds,fo,ho,ha,Rs,Xe,hu,Jg,ev,tv,rv,nv,iv,av,jN,lN,j3=(lN=class extends qu{constructor(t,r){super();De(this,Xe);De(this,Nr);De(this,Ke);De(this,Wu);De(this,hr);De(this,co);De(this,Is);De(this,di);De(this,fa);De(this,Ku);De(this,Ts);De(this,Ds);De(this,fo);De(this,ho);De(this,ha);De(this,Rs,new Set);this.options=r,ye(this,Nr,t),ye(this,fa,null),ye(this,di,Xg()),this.bindMethods(),this.setOptions(r)}bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(L(this,Ke).addObserver(this),dw(L(this,Ke),this.options)?He(this,Xe,hu).call(this):this.updateResult(),He(this,Xe,rv).call(this))}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return ov(L(this,Ke),this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return ov(L(this,Ke),this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,He(this,Xe,nv).call(this),He(this,Xe,iv).call(this),L(this,Ke).removeObserver(this)}setOptions(t){const r=this.options,n=L(this,Ke);if(this.options=L(this,Nr).defaultQueryOptions(t),this.options.enabled!==void 0&&typeof this.options.enabled!="boolean"&&typeof this.options.enabled!="function"&&typeof zr(this.options.enabled,L(this,Ke))!="boolean")throw new Error("Expected enabled to be a boolean or a callback that returns a boolean");He(this,Xe,av).call(this),L(this,Ke).setOptions(this.options),r._defaulted&&!qg(this.options,r)&&L(this,Nr).getQueryCache().notify({type:"observerOptionsUpdated",query:L(this,Ke),observer:this});const a=this.hasListeners();a&&fw(L(this,Ke),n,this.options,r)&&He(this,Xe,hu).call(this),this.updateResult(),a&&(L(this,Ke)!==n||zr(this.options.enabled,L(this,Ke))!==zr(r.enabled,L(this,Ke))||ya(this.options.staleTime,L(this,Ke))!==ya(r.staleTime,L(this,Ke)))&&He(this,Xe,Jg).call(this);const o=He(this,Xe,ev).call(this);a&&(L(this,Ke)!==n||zr(this.options.enabled,L(this,Ke))!==zr(r.enabled,L(this,Ke))||o!==L(this,ha))&&He(this,Xe,tv).call(this,o)}getOptimisticResult(t){const r=L(this,Nr).getQueryCache().build(L(this,Nr),t),n=this.createResult(r,t);return N3(this,n)&&(ye(this,hr,n),ye(this,Is,this.options),ye(this,co,L(this,Ke).state)),n}getCurrentResult(){return L(this,hr)}trackResult(t,r){return new Proxy(t,{get:(n,a)=>(this.trackProp(a),r==null||r(a),a==="promise"&&(this.trackProp("data"),!this.options.experimental_prefetchInRender&&L(this,di).status==="pending"&&L(this,di).reject(new Error("experimental_prefetchInRender feature flag is not enabled"))),Reflect.get(n,a))})}trackProp(t){L(this,Rs).add(t)}getCurrentQuery(){return L(this,Ke)}refetch({...t}={}){return this.fetch({...t})}fetchOptimistic(t){const r=L(this,Nr).defaultQueryOptions(t),n=L(this,Nr).getQueryCache().build(L(this,Nr),r);return n.fetch().then(()=>this.createResult(n,r))}fetch(t){return He(this,Xe,hu).call(this,{...t,cancelRefetch:t.cancelRefetch??!0}).then(()=>(this.updateResult(),L(this,hr)))}createResult(t,r){var B;const n=L(this,Ke),a=this.options,o=L(this,hr),c=L(this,co),u=L(this,Is),h=t!==n?t.state:L(this,Wu),{state:m}=t;let g={...m},v=!1,b;if(r._optimisticResults){const F=this.hasListeners(),Y=!F&&dw(t,r),H=F&&fw(t,n,r,a);(Y||H)&&(g={...g,...kN(m.data,t.options)}),r._optimisticResults==="isRestoring"&&(g.fetchStatus="idle")}let{error:j,errorUpdatedAt:k,status:S}=g;b=g.data;let N=!1;if(r.placeholderData!==void 0&&b===void 0&&S==="pending"){let F;o!=null&&o.isPlaceholderData&&r.placeholderData===(u==null?void 0:u.placeholderData)?(F=o.data,N=!0):F=typeof r.placeholderData=="function"?r.placeholderData((B=L(this,Ds))==null?void 0:B.state.data,L(this,Ds)):r.placeholderData,F!==void 0&&(S="success",b=Yg(o==null?void 0:o.data,F,r),v=!0)}if(r.select&&b!==void 0&&!N)if(o&&b===(c==null?void 0:c.data)&&r.select===L(this,Ku))b=L(this,Ts);else try{ye(this,Ku,r.select),b=r.select(b),b=Yg(o==null?void 0:o.data,b,r),ye(this,Ts,b),ye(this,fa,null)}catch(F){ye(this,fa,F)}L(this,fa)&&(j=L(this,fa),b=L(this,Ts),k=Date.now(),S="error");const E=g.fetchStatus==="fetching",A=S==="pending",P=S==="error",_=A&&E,O=b!==void 0,U={status:S,fetchStatus:g.fetchStatus,isPending:A,isSuccess:S==="success",isError:P,isInitialLoading:_,isLoading:_,data:b,dataUpdatedAt:g.dataUpdatedAt,error:j,errorUpdatedAt:k,failureCount:g.fetchFailureCount,failureReason:g.fetchFailureReason,errorUpdateCount:g.errorUpdateCount,isFetched:t.isFetched(),isFetchedAfterMount:g.dataUpdateCount>h.dataUpdateCount||g.errorUpdateCount>h.errorUpdateCount,isFetching:E,isRefetching:E&&!A,isLoadingError:P&&!O,isPaused:g.fetchStatus==="paused",isPlaceholderData:v,isRefetchError:P&&O,isStale:ky(t,r),refetch:this.refetch,promise:L(this,di),isEnabled:zr(r.enabled,t)!==!1};if(this.options.experimental_prefetchInRender){const F=U.data!==void 0,Y=U.status==="error"&&!F,H=he=>{Y?he.reject(U.error):F&&he.resolve(U.data)},pe=()=>{const he=ye(this,di,U.promise=Xg());H(he)},ue=L(this,di);switch(ue.status){case"pending":t.queryHash===n.queryHash&&H(ue);break;case"fulfilled":(Y||U.data!==ue.value)&&pe();break;case"rejected":(!Y||U.error!==ue.reason)&&pe();break}}return U}updateResult(){const t=L(this,hr),r=this.createResult(L(this,Ke),this.options);if(ye(this,co,L(this,Ke).state),ye(this,Is,this.options),L(this,co).data!==void 0&&ye(this,Ds,L(this,Ke)),qg(r,t))return;ye(this,hr,r);const n=()=>{if(!t)return!0;const{notifyOnChangeProps:a}=this.options,o=typeof a=="function"?a():a;if(o==="all"||!o&&!L(this,Rs).size)return!0;const c=new Set(o??L(this,Rs));return this.options.throwOnError&&c.add("error"),Object.keys(L(this,hr)).some(u=>{const f=u;return L(this,hr)[f]!==t[f]&&c.has(f)})};He(this,Xe,jN).call(this,{listeners:n()})}onQueryUpdate(){this.updateResult(),this.hasListeners()&&He(this,Xe,rv).call(this)}},Nr=new WeakMap,Ke=new WeakMap,Wu=new WeakMap,hr=new WeakMap,co=new WeakMap,Is=new WeakMap,di=new WeakMap,fa=new WeakMap,Ku=new WeakMap,Ts=new WeakMap,Ds=new WeakMap,fo=new WeakMap,ho=new WeakMap,ha=new WeakMap,Rs=new WeakMap,Xe=new WeakSet,hu=function(t){He(this,Xe,av).call(this);let r=L(this,Ke).fetch(this.options,t);return t!=null&&t.throwOnError||(r=r.catch(Er)),r},Jg=function(){He(this,Xe,nv).call(this);const t=ya(this.options.staleTime,L(this,Ke));if(Su.isServer()||L(this,hr).isStale||!Vg(t))return;const n=mN(L(this,hr).dataUpdatedAt,t)+1;ye(this,fo,Za.setTimeout(()=>{L(this,hr).isStale||this.updateResult()},n))},ev=function(){return(typeof this.options.refetchInterval=="function"?this.options.refetchInterval(L(this,Ke)):this.options.refetchInterval)??!1},tv=function(t){He(this,Xe,iv).call(this),ye(this,ha,t),!(Su.isServer()||zr(this.options.enabled,L(this,Ke))===!1||!Vg(L(this,ha))||L(this,ha)===0)&&ye(this,ho,Za.setInterval(()=>{(this.options.refetchIntervalInBackground||xy.isFocused())&&He(this,Xe,hu).call(this)},L(this,ha)))},rv=function(){He(this,Xe,Jg).call(this),He(this,Xe,tv).call(this,He(this,Xe,ev).call(this))},nv=function(){L(this,fo)!==void 0&&(Za.clearTimeout(L(this,fo)),ye(this,fo,void 0))},iv=function(){L(this,ho)!==void 0&&(Za.clearInterval(L(this,ho)),ye(this,ho,void 0))},av=function(){const t=L(this,Nr).getQueryCache().build(L(this,Nr),this.options);if(t===L(this,Ke))return;const r=L(this,Ke);ye(this,Ke,t),ye(this,Wu,t.state),this.hasListeners()&&(r==null||r.removeObserver(this),t.addObserver(this))},jN=function(t){qt.batch(()=>{t.listeners&&this.listeners.forEach(r=>{r(L(this,hr))}),L(this,Nr).getQueryCache().notify({query:L(this,Ke),type:"observerResultsUpdated"})})},lN);function S3(e,t){return zr(t.enabled,e)!==!1&&e.state.data===void 0&&!(e.state.status==="error"&&zr(t.retryOnMount,e)===!1)}function dw(e,t){return S3(e,t)||e.state.data!==void 0&&ov(e,t,t.refetchOnMount)}function ov(e,t,r){if(zr(t.enabled,e)!==!1&&ya(t.staleTime,e)!=="static"){const n=typeof r=="function"?r(e):r;return n==="always"||n!==!1&&ky(e,t)}return!1}function fw(e,t,r,n){return(e!==t||zr(n.enabled,e)===!1)&&(!r.suspense||e.state.status!=="error")&&ky(e,r)}function ky(e,t){return zr(t.enabled,e)!==!1&&e.isStaleByTime(ya(t.staleTime,e))}function N3(e,t){return!qg(e.getCurrentResult(),t)}var Gu,Dn,ir,mo,Rn,na,uN,E3=(uN=class extends bN{constructor(t){super();De(this,Rn);De(this,Gu);De(this,Dn);De(this,ir);De(this,mo);ye(this,Gu,t.client),this.mutationId=t.mutationId,ye(this,ir,t.mutationCache),ye(this,Dn,[]),this.state=t.state||A3(),this.setOptions(t.options),this.scheduleGc()}setOptions(t){this.options=t,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(t){L(this,Dn).includes(t)||(L(this,Dn).push(t),this.clearGcTimeout(),L(this,ir).notify({type:"observerAdded",mutation:this,observer:t}))}removeObserver(t){ye(this,Dn,L(this,Dn).filter(r=>r!==t)),this.scheduleGc(),L(this,ir).notify({type:"observerRemoved",mutation:this,observer:t})}optionalRemove(){L(this,Dn).length||(this.state.status==="pending"?this.scheduleGc():L(this,ir).remove(this))}continue(){var t;return((t=L(this,mo))==null?void 0:t.continue())??this.execute(this.state.variables)}async execute(t){var c,u,f,h,m,g,v,b,j,k,S,N,E,A,P,_,O,D;const r=()=>{He(this,Rn,na).call(this,{type:"continue"})},n={client:L(this,Gu),meta:this.options.meta,mutationKey:this.options.mutationKey};ye(this,mo,xN({fn:()=>this.options.mutationFn?this.options.mutationFn(t,n):Promise.reject(new Error("No mutationFn found")),onFail:(U,B)=>{He(this,Rn,na).call(this,{type:"failed",failureCount:U,error:B})},onPause:()=>{He(this,Rn,na).call(this,{type:"pause"})},onContinue:r,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>L(this,ir).canRun(this)}));const a=this.state.status==="pending",o=!L(this,mo).canStart();try{if(a)r();else{He(this,Rn,na).call(this,{type:"pending",variables:t,isPaused:o}),L(this,ir).config.onMutate&&await L(this,ir).config.onMutate(t,this,n);const B=await((u=(c=this.options).onMutate)==null?void 0:u.call(c,t,n));B!==this.state.context&&He(this,Rn,na).call(this,{type:"pending",context:B,variables:t,isPaused:o})}const U=await L(this,mo).start();return await((h=(f=L(this,ir).config).onSuccess)==null?void 0:h.call(f,U,t,this.state.context,this,n)),await((g=(m=this.options).onSuccess)==null?void 0:g.call(m,U,t,this.state.context,n)),await((b=(v=L(this,ir).config).onSettled)==null?void 0:b.call(v,U,null,this.state.variables,this.state.context,this,n)),await((k=(j=this.options).onSettled)==null?void 0:k.call(j,U,null,t,this.state.context,n)),He(this,Rn,na).call(this,{type:"success",data:U}),U}catch(U){try{await((N=(S=L(this,ir).config).onError)==null?void 0:N.call(S,U,t,this.state.context,this,n))}catch(B){Promise.reject(B)}try{await((A=(E=this.options).onError)==null?void 0:A.call(E,U,t,this.state.context,n))}catch(B){Promise.reject(B)}try{await((_=(P=L(this,ir).config).onSettled)==null?void 0:_.call(P,void 0,U,this.state.variables,this.state.context,this,n))}catch(B){Promise.reject(B)}try{await((D=(O=this.options).onSettled)==null?void 0:D.call(O,void 0,U,t,this.state.context,n))}catch(B){Promise.reject(B)}throw He(this,Rn,na).call(this,{type:"error",error:U}),U}finally{L(this,ir).runNext(this)}}},Gu=new WeakMap,Dn=new WeakMap,ir=new WeakMap,mo=new WeakMap,Rn=new WeakSet,na=function(t){const r=n=>{switch(t.type){case"failed":return{...n,failureCount:t.failureCount,failureReason:t.error};case"pause":return{...n,isPaused:!0};case"continue":return{...n,isPaused:!1};case"pending":return{...n,context:t.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:t.isPaused,status:"pending",variables:t.variables,submittedAt:Date.now()};case"success":return{...n,data:t.data,failureCount:0,failureReason:null,error:null,status:"success",isPaused:!1};case"error":return{...n,data:void 0,error:t.error,failureCount:n.failureCount+1,failureReason:t.error,isPaused:!1,status:"error"}}};this.state=r(this.state),qt.batch(()=>{L(this,Dn).forEach(n=>{n.onMutationUpdate(t)}),L(this,ir).notify({mutation:this,type:"updated",action:t})})},uN);function A3(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}var fi,vn,Vu,cN,C3=(cN=class extends qu{constructor(t={}){super();De(this,fi);De(this,vn);De(this,Vu);this.config=t,ye(this,fi,new Set),ye(this,vn,new Map),ye(this,Vu,0)}build(t,r,n){const a=new E3({client:t,mutationCache:this,mutationId:++kd(this,Vu)._,options:t.defaultMutationOptions(r),state:n});return this.add(a),a}add(t){L(this,fi).add(t);const r=Sd(t);if(typeof r=="string"){const n=L(this,vn).get(r);n?n.push(t):L(this,vn).set(r,[t])}this.notify({type:"added",mutation:t})}remove(t){if(L(this,fi).delete(t)){const r=Sd(t);if(typeof r=="string"){const n=L(this,vn).get(r);if(n)if(n.length>1){const a=n.indexOf(t);a!==-1&&n.splice(a,1)}else n[0]===t&&L(this,vn).delete(r)}}this.notify({type:"removed",mutation:t})}canRun(t){const r=Sd(t);if(typeof r=="string"){const n=L(this,vn).get(r),a=n==null?void 0:n.find(o=>o.state.status==="pending");return!a||a===t}else return!0}runNext(t){var n;const r=Sd(t);if(typeof r=="string"){const a=(n=L(this,vn).get(r))==null?void 0:n.find(o=>o!==t&&o.state.isPaused);return(a==null?void 0:a.continue())??Promise.resolve()}else return Promise.resolve()}clear(){qt.batch(()=>{L(this,fi).forEach(t=>{this.notify({type:"removed",mutation:t})}),L(this,fi).clear(),L(this,vn).clear()})}getAll(){return Array.from(L(this,fi))}find(t){const r={exact:!0,...t};return this.getAll().find(n=>aw(r,n))}findAll(t={}){return this.getAll().filter(r=>aw(t,r))}notify(t){qt.batch(()=>{this.listeners.forEach(r=>{r(t)})})}resumePausedMutations(){const t=this.getAll().filter(r=>r.state.isPaused);return qt.batch(()=>Promise.all(t.map(r=>r.continue().catch(Er))))}},fi=new WeakMap,vn=new WeakMap,Vu=new WeakMap,cN);function Sd(e){var t;return(t=e.options.scope)==null?void 0:t.id}var Ln,dN,P3=(dN=class extends qu{constructor(t={}){super();De(this,Ln);this.config=t,ye(this,Ln,new Map)}build(t,r,n){const a=r.queryKey,o=r.queryHash??by(a,r);let c=this.get(o);return c||(c=new k3({client:t,queryKey:a,queryHash:o,options:t.defaultQueryOptions(r),state:n,defaultOptions:t.getQueryDefaults(a)}),this.add(c)),c}add(t){L(this,Ln).has(t.queryHash)||(L(this,Ln).set(t.queryHash,t),this.notify({type:"added",query:t}))}remove(t){const r=L(this,Ln).get(t.queryHash);r&&(t.destroy(),r===t&&L(this,Ln).delete(t.queryHash),this.notify({type:"removed",query:t}))}clear(){qt.batch(()=>{this.getAll().forEach(t=>{this.remove(t)})})}get(t){return L(this,Ln).get(t)}getAll(){return[...L(this,Ln).values()]}find(t){const r={exact:!0,...t};return this.getAll().find(n=>iw(r,n))}findAll(t={}){const r=this.getAll();return Object.keys(t).length>0?r.filter(n=>iw(t,n)):r}notify(t){qt.batch(()=>{this.listeners.forEach(r=>{r(t)})})}onFocus(){qt.batch(()=>{this.getAll().forEach(t=>{t.onFocus()})})}onOnline(){qt.batch(()=>{this.getAll().forEach(t=>{t.onOnline()})})}},Ln=new WeakMap,dN),vt,ma,pa,Ls,$s,ga,zs,Fs,fN,O3=(fN=class{constructor(e={}){De(this,vt);De(this,ma);De(this,pa);De(this,Ls);De(this,$s);De(this,ga);De(this,zs);De(this,Fs);ye(this,vt,e.queryCache||new P3),ye(this,ma,e.mutationCache||new C3),ye(this,pa,e.defaultOptions||{}),ye(this,Ls,new Map),ye(this,$s,new Map),ye(this,ga,0)}mount(){kd(this,ga)._++,L(this,ga)===1&&(ye(this,zs,xy.subscribe(async e=>{e&&(await this.resumePausedMutations(),L(this,vt).onFocus())})),ye(this,Fs,of.subscribe(async e=>{e&&(await this.resumePausedMutations(),L(this,vt).onOnline())})))}unmount(){var e,t;kd(this,ga)._--,L(this,ga)===0&&((e=L(this,zs))==null||e.call(this),ye(this,zs,void 0),(t=L(this,Fs))==null||t.call(this),ye(this,Fs,void 0))}isFetching(e){return L(this,vt).findAll({...e,fetchStatus:"fetching"}).length}isMutating(e){return L(this,ma).findAll({...e,status:"pending"}).length}getQueryData(e){var r;const t=this.defaultQueryOptions({queryKey:e});return(r=L(this,vt).get(t.queryHash))==null?void 0:r.state.data}ensureQueryData(e){const t=this.defaultQueryOptions(e),r=L(this,vt).build(this,t),n=r.state.data;return n===void 0?this.fetchQuery(e):(e.revalidateIfStale&&r.isStaleByTime(ya(t.staleTime,r))&&this.prefetchQuery(t),Promise.resolve(n))}getQueriesData(e){return L(this,vt).findAll(e).map(({queryKey:t,state:r})=>{const n=r.data;return[t,n]})}setQueryData(e,t,r){const n=this.defaultQueryOptions({queryKey:e}),a=L(this,vt).get(n.queryHash),o=a==null?void 0:a.state.data,c=c3(t,o);if(c!==void 0)return L(this,vt).build(this,n).setData(c,{...r,manual:!0})}setQueriesData(e,t,r){return qt.batch(()=>L(this,vt).findAll(e).map(({queryKey:n})=>[n,this.setQueryData(n,t,r)]))}getQueryState(e){var r;const t=this.defaultQueryOptions({queryKey:e});return(r=L(this,vt).get(t.queryHash))==null?void 0:r.state}removeQueries(e){const t=L(this,vt);qt.batch(()=>{t.findAll(e).forEach(r=>{t.remove(r)})})}resetQueries(e,t){const r=L(this,vt);return qt.batch(()=>(r.findAll(e).forEach(n=>{n.reset()}),this.refetchQueries({type:"active",...e},t)))}cancelQueries(e,t={}){const r={revert:!0,...t},n=qt.batch(()=>L(this,vt).findAll(e).map(a=>a.cancel(r)));return Promise.all(n).then(Er).catch(Er)}invalidateQueries(e,t={}){return qt.batch(()=>(L(this,vt).findAll(e).forEach(r=>{r.invalidate()}),(e==null?void 0:e.refetchType)==="none"?Promise.resolve():this.refetchQueries({...e,type:(e==null?void 0:e.refetchType)??(e==null?void 0:e.type)??"active"},t)))}refetchQueries(e,t={}){const r={...t,cancelRefetch:t.cancelRefetch??!0},n=qt.batch(()=>L(this,vt).findAll(e).filter(a=>!a.isDisabled()&&!a.isStatic()).map(a=>{let o=a.fetch(void 0,r);return r.throwOnError||(o=o.catch(Er)),a.state.fetchStatus==="paused"?Promise.resolve():o}));return Promise.all(n).then(Er)}fetchQuery(e){const t=this.defaultQueryOptions(e);t.retry===void 0&&(t.retry=!1);const r=L(this,vt).build(this,t);return r.isStaleByTime(ya(t.staleTime,r))?r.fetch(t):Promise.resolve(r.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(Er).catch(Er)}fetchInfiniteQuery(e){return e._type="infinite",this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(Er).catch(Er)}ensureInfiniteQueryData(e){return e._type="infinite",this.ensureQueryData(e)}resumePausedMutations(){return of.isOnline()?L(this,ma).resumePausedMutations():Promise.resolve()}getQueryCache(){return L(this,vt)}getMutationCache(){return L(this,ma)}getDefaultOptions(){return L(this,pa)}setDefaultOptions(e){ye(this,pa,e)}setQueryDefaults(e,t){L(this,Ls).set(ku(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){const t=[...L(this,Ls).values()],r={};return t.forEach(n=>{ju(e,n.queryKey)&&Object.assign(r,n.defaultOptions)}),r}setMutationDefaults(e,t){L(this,$s).set(ku(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){const t=[...L(this,$s).values()],r={};return t.forEach(n=>{ju(e,n.mutationKey)&&Object.assign(r,n.defaultOptions)}),r}defaultQueryOptions(e){if(e._defaulted)return e;const t={...L(this,pa).queries,...this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||(t.queryHash=by(t.queryKey,t)),t.refetchOnReconnect===void 0&&(t.refetchOnReconnect=t.networkMode!=="always"),t.throwOnError===void 0&&(t.throwOnError=!!t.suspense),!t.networkMode&&t.persister&&(t.networkMode="offlineFirst"),t.queryFn===wy&&(t.enabled=!1),t}defaultMutationOptions(e){return e!=null&&e._defaulted?e:{...L(this,pa).mutations,...(e==null?void 0:e.mutationKey)&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){L(this,vt).clear(),L(this,ma).clear()}},vt=new WeakMap,ma=new WeakMap,pa=new WeakMap,Ls=new WeakMap,$s=new WeakMap,ga=new WeakMap,zs=new WeakMap,Fs=new WeakMap,fN),SN=y.createContext(void 0),Yn=e=>{const t=y.useContext(SN);if(!t)throw new Error("No QueryClient set, use QueryClientProvider to set one");return t},_3=({client:e,children:t})=>(y.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),l.jsx(SN.Provider,{value:e,children:t})),NN=y.createContext(!1),M3=()=>y.useContext(NN);NN.Provider;function I3(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}var T3=y.createContext(I3()),D3=()=>y.useContext(T3),R3=(e,t,r)=>{const n=r!=null&&r.state.error&&typeof e.throwOnError=="function"?vN(e.throwOnError,[r.state.error,r]):e.throwOnError;(e.suspense||e.experimental_prefetchInRender||n)&&(t.isReset()||(e.retryOnMount=!1))},L3=e=>{y.useEffect(()=>{e.clearReset()},[e])},$3=({result:e,errorResetBoundary:t,throwOnError:r,query:n,suspense:a})=>e.isError&&!t.isReset()&&!e.isFetching&&n&&(a&&e.data===void 0||vN(r,[e.error,n])),z3=e=>{if(e.suspense){const r=a=>a==="static"?a:Math.max(a??1e3,1e3),n=e.staleTime;e.staleTime=typeof n=="function"?(...a)=>r(n(...a)):r(n),typeof e.gcTime=="number"&&(e.gcTime=Math.max(e.gcTime,1e3))}},F3=(e,t)=>e.isLoading&&e.isFetching&&!t,B3=(e,t)=>(e==null?void 0:e.suspense)&&t.isPending,hw=(e,t,r)=>t.fetchOptimistic(e).catch(()=>{r.clearReset()});function U3(e,t,r){var b,j,k,S;const n=M3(),a=D3(),o=Yn(),c=o.defaultQueryOptions(e);(j=(b=o.getDefaultOptions().queries)==null?void 0:b._experimental_beforeQuery)==null||j.call(b,c);const u=o.getQueryCache().get(c.queryHash),f=e.subscribed!==!1;c._optimisticResults=n?"isRestoring":f?"optimistic":void 0,z3(c),R3(c,a,u),L3(a);const h=!o.getQueryCache().get(c.queryHash),[m]=y.useState(()=>new t(o,c)),g=m.getOptimisticResult(c),v=!n&&f;if(y.useSyncExternalStore(y.useCallback(N=>{const E=v?m.subscribe(qt.batchCalls(N)):Er;return m.updateResult(),E},[m,v]),()=>m.getCurrentResult(),()=>m.getCurrentResult()),y.useEffect(()=>{m.setOptions(c)},[c,m]),B3(c,g))throw hw(c,m,a);if($3({result:g,errorResetBoundary:a,throwOnError:c.throwOnError,query:u,suspense:c.suspense}))throw g.error;if((S=(k=o.getDefaultOptions().queries)==null?void 0:k._experimental_afterQuery)==null||S.call(k,c,g),c.experimental_prefetchInRender&&!Su.isServer()&&F3(g,n)){const N=h?hw(c,m,a):u==null?void 0:u.promise;N==null||N.catch(Er).finally(()=>{m.updateResult()})}return c.notifyOnChangeProps?g:m.trackResult(g)}function $t(e,t){return U3(e,j3)}/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. @@ -187,7 +187,7 @@ Error generating stack: `+w.message+` * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const Fs=de("Code",[["polyline",{points:"16 18 22 12 16 6",key:"z7tu5w"}],["polyline",{points:"8 6 2 12 8 18",key:"1eg1df"}]]);/** + */const Bs=de("Code",[["polyline",{points:"16 18 22 12 16 6",key:"z7tu5w"}],["polyline",{points:"8 6 2 12 8 18",key:"1eg1df"}]]);/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. @@ -222,17 +222,17 @@ Error generating stack: `+w.message+` * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const Bs=de("Download",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"7 10 12 15 17 10",key:"2ggqvy"}],["line",{x1:"12",x2:"12",y1:"15",y2:"3",key:"1vk2je"}]]);/** + */const Us=de("Download",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"7 10 12 15 17 10",key:"2ggqvy"}],["line",{x1:"12",x2:"12",y1:"15",y2:"3",key:"1vk2je"}]]);/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const Us=de("ExternalLink",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]);/** + */const Hs=de("ExternalLink",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]);/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const hw=de("EyeOff",[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]]);/** + */const mw=de("EyeOff",[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]]);/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. @@ -287,7 +287,7 @@ Error generating stack: `+w.message+` * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const mw=de("Info",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]]);/** + */const pw=de("Info",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]]);/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. @@ -302,7 +302,7 @@ Error generating stack: `+w.message+` * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const ky=de("Layers",[["path",{d:"m12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83Z",key:"8b97xw"}],["path",{d:"m22 17.65-9.17 4.16a2 2 0 0 1-1.66 0L2 17.65",key:"dd6zsq"}],["path",{d:"m22 12.65-9.17 4.16a2 2 0 0 1-1.66 0L2 12.65",key:"ep9fru"}]]);/** + */const jy=de("Layers",[["path",{d:"m12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83Z",key:"8b97xw"}],["path",{d:"m22 17.65-9.17 4.16a2 2 0 0 1-1.66 0L2 17.65",key:"dd6zsq"}],["path",{d:"m22 12.65-9.17 4.16a2 2 0 0 1-1.66 0L2 12.65",key:"ep9fru"}]]);/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. @@ -352,7 +352,7 @@ Error generating stack: `+w.message+` * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const pw=de("Monitor",[["rect",{width:"20",height:"14",x:"2",y:"3",rx:"2",key:"48i651"}],["line",{x1:"8",x2:"16",y1:"21",y2:"21",key:"1svkeh"}],["line",{x1:"12",x2:"12",y1:"17",y2:"21",key:"vw1qmm"}]]);/** + */const gw=de("Monitor",[["rect",{width:"20",height:"14",x:"2",y:"3",rx:"2",key:"48i651"}],["line",{x1:"8",x2:"16",y1:"21",y2:"21",key:"1svkeh"}],["line",{x1:"12",x2:"12",y1:"17",y2:"21",key:"vw1qmm"}]]);/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. @@ -447,12 +447,12 @@ Error generating stack: `+w.message+` * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const ws=de("Shield",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]]);/** + */const ks=de("Shield",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]]);/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const gw=de("Shuffle",[["path",{d:"M2 18h1.4c1.3 0 2.5-.6 3.3-1.7l6.1-8.6c.7-1.1 2-1.7 3.3-1.7H22",key:"1wmou1"}],["path",{d:"m18 2 4 4-4 4",key:"pucp1d"}],["path",{d:"M2 6h1.9c1.5 0 2.9.9 3.6 2.2",key:"10bdb2"}],["path",{d:"M22 18h-5.9c-1.3 0-2.6-.7-3.3-1.8l-.5-.8",key:"vgxac0"}],["path",{d:"m18 14 4 4-4 4",key:"10pe0f"}]]);/** + */const vw=de("Shuffle",[["path",{d:"M2 18h1.4c1.3 0 2.5-.6 3.3-1.7l6.1-8.6c.7-1.1 2-1.7 3.3-1.7H22",key:"1wmou1"}],["path",{d:"m18 2 4 4-4 4",key:"pucp1d"}],["path",{d:"M2 6h1.9c1.5 0 2.9.9 3.6 2.2",key:"10bdb2"}],["path",{d:"M22 18h-5.9c-1.3 0-2.6-.7-3.3-1.8l-.5-.8",key:"vgxac0"}],["path",{d:"m18 14 4 4-4 4",key:"10pe0f"}]]);/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. @@ -467,7 +467,7 @@ Error generating stack: `+w.message+` * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const ys=de("Sparkles",[["path",{d:"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z",key:"4pj2yx"}],["path",{d:"M20 3v4",key:"1olli1"}],["path",{d:"M22 5h-4",key:"1gvqau"}],["path",{d:"M4 17v2",key:"vumght"}],["path",{d:"M5 18H3",key:"zchphs"}]]);/** + */const xs=de("Sparkles",[["path",{d:"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z",key:"4pj2yx"}],["path",{d:"M20 3v4",key:"1olli1"}],["path",{d:"M22 5h-4",key:"1gvqau"}],["path",{d:"M4 17v2",key:"vumght"}],["path",{d:"M5 18H3",key:"zchphs"}]]);/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. @@ -517,12 +517,12 @@ Error generating stack: `+w.message+` * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const xa=de("Zap",[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]]),mu=[{id:"dashboard",label:"Zentrale",hint:"System- & Stack-Status",icon:v4},{id:"models",label:"Modell-Manager",hint:"Verwalten, laden & Gateway-Routing",icon:lf},{id:"memory",label:"Gedächtnis",hint:"Geteiltes Memory verwalten",icon:Ao},{id:"connect",label:"Verbinden",hint:"IDE-/Agent-Configs erzeugen",icon:cf},{id:"agent",label:"Hermes",hint:"Agent-Status & Verdrahtung",icon:wn},{id:"terminal",label:"Terminal",hint:"Interaktives Hermes-Agent-Terminal",icon:IN},{id:"guide",label:"Anleitung",hint:"Einrichten & Vibe-Coding",icon:t4}];var vw=1,H4=.9,W4=.8,K4=.17,eg=.1,tg=.999,G4=.9999,V4=.99,q4=/[\\\/_+.#"@\[\(\{&]/,Q4=/[\\\/_+.#"@\[\(\{&]/g,Y4=/[\s-]/,DN=/[\s-]/g;function dv(e,t,r,n,a,o,c){if(o===t.length)return a===e.length?vw:V4;var u=`${a},${o}`;if(c[u]!==void 0)return c[u];for(var f=n.charAt(o),h=r.indexOf(f,a),m=0,g,v,b,j;h>=0;)g=dv(e,t,r,n,h+1,o+1,c),g>m&&(h===a?g*=vw:q4.test(e.charAt(h-1))?(g*=W4,b=e.slice(a,h-1).match(Q4),b&&a>0&&(g*=Math.pow(tg,b.length))):Y4.test(e.charAt(h-1))?(g*=H4,j=e.slice(a,h-1).match(DN),j&&a>0&&(g*=Math.pow(tg,j.length))):(g*=K4,a>0&&(g*=Math.pow(tg,h-a))),e.charAt(h)!==t.charAt(o)&&(g*=G4)),(gg&&(g=v*eg)),g>m&&(m=g),h=r.indexOf(f,h+1);return c[u]=m,m}function yw(e){return e.toLowerCase().replace(DN," ")}function X4(e,t,r){return e=r&&r.length>0?`${e+" "+r.join(" ")}`:e,dv(e,t,yw(e),yw(t),0,0,{})}function ba(e,t,{checkForDefaultPrevented:r=!0}={}){return function(a){if(e==null||e(a),r===!1||!a.defaultPrevented)return t==null?void 0:t(a)}}function xw(e,t){if(typeof e=="function")return e(t);e!=null&&(e.current=t)}function Hs(...e){return t=>{let r=!1;const n=e.map(a=>{const o=xw(a,t);return!r&&typeof o=="function"&&(r=!0),o});if(r)return()=>{for(let a=0;a{var N;const{scope:v,children:b,...j}=g,k=((N=v==null?void 0:v[e])==null?void 0:N[f])||u,S=y.useMemo(()=>j,Object.values(j));return l.jsx(k.Provider,{value:S,children:b})};h.displayName=o+"Provider";function m(g,v){var k;const b=((k=v==null?void 0:v[e])==null?void 0:k[f])||u,j=y.useContext(b);if(j)return j;if(c!==void 0)return c;throw new Error(`\`${g}\` must be used within \`${o}\``)}return[h,m]}const a=()=>{const o=r.map(c=>y.createContext(c));return function(u){const f=(u==null?void 0:u[e])||o;return y.useMemo(()=>({[`__scope${e}`]:{...u,[e]:f}}),[u,f])}};return a.scopeName=e,[n,J4(a,...t)]}function J4(...e){const t=e[0];if(e.length===1)return t;const r=()=>{const n=e.map(a=>({useScope:a(),scopeName:a.scopeName}));return function(o){const c=n.reduce((u,{useScope:f,scopeName:h})=>{const g=f(o)[`__scope${h}`];return{...u,...g}},{});return y.useMemo(()=>({[`__scope${t.scopeName}`]:c}),[c])}};return r.scopeName=t.scopeName,r}var Nu=globalThis!=null&&globalThis.document?y.useLayoutEffect:()=>{},eI=lh[" useId ".trim().toString()]||(()=>{}),tI=0;function vi(e){const[t,r]=y.useState(eI());return Nu(()=>{r(n=>n??String(tI++))},[e]),t?`radix-${t}`:""}var rI=lh[" useInsertionEffect ".trim().toString()]||Nu;function nI({prop:e,defaultProp:t,onChange:r=()=>{},caller:n}){const[a,o,c]=iI({defaultProp:t,onChange:r}),u=e!==void 0,f=u?e:a;{const m=y.useRef(e!==void 0);y.useEffect(()=>{const g=m.current;g!==u&&console.warn(`${n} is changing from ${g?"controlled":"uncontrolled"} to ${u?"controlled":"uncontrolled"}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`),m.current=u},[u,n])}const h=y.useCallback(m=>{var g;if(u){const v=aI(m)?m(e):m;v!==e&&((g=c.current)==null||g.call(c,v))}else o(m)},[u,e,o,c]);return[f,h]}function iI({defaultProp:e,onChange:t}){const[r,n]=y.useState(e),a=y.useRef(r),o=y.useRef(t);return rI(()=>{o.current=t},[t]),y.useEffect(()=>{var c;a.current!==r&&((c=o.current)==null||c.call(o,r),a.current=r)},[r,a]),[r,n,o]}function aI(e){return typeof e=="function"}var fh=hN();function RN(e){const t=y.forwardRef((r,n)=>{let{children:a,...o}=r,c=null,u=!1;const f=[];bw(a)&&typeof Nd=="function"&&(a=Nd(a._payload)),y.Children.forEach(a,v=>{var b;if(cI(v)){u=!0;const j=v;let k="child"in j.props?j.props.child:j.props.children;bw(k)&&typeof Nd=="function"&&(k=Nd(k._payload)),c=sI(j,k),f.push((b=c==null?void 0:c.props)==null?void 0:b.children)}else f.push(v)}),c?c=y.cloneElement(c,void 0,f):!u&&y.Children.count(a)===1&&y.isValidElement(a)&&(c=a);const h=c?uI(c):void 0,m=Co(n,h);if(!c){if(a||a===0)throw new Error(u?mI(e):hI(e));return a}const g=lI(o,c.props??{});return c.type!==y.Fragment&&(g.ref=n?m:h),y.cloneElement(c,g)});return t.displayName=`${e}.Slot`,t}var oI=Symbol.for("radix.slottable"),sI=(e,t)=>{if("child"in e.props){const r=e.props.child;return y.isValidElement(r)?y.cloneElement(r,void 0,e.props.children(r.props.children)):null}return y.isValidElement(t)?t:null};function lI(e,t){const r={...t};for(const n in t){const a=e[n],o=t[n];/^on[A-Z]/.test(n)?a&&o?r[n]=(...u)=>{const f=o(...u);return a(...u),f}:a&&(r[n]=a):n==="style"?r[n]={...a,...o}:n==="className"&&(r[n]=[a,o].filter(Boolean).join(" "))}return{...e,...r}}function uI(e){var n,a;let t=(n=Object.getOwnPropertyDescriptor(e.props,"ref"))==null?void 0:n.get,r=t&&"isReactWarning"in t&&t.isReactWarning;return r?e.ref:(t=(a=Object.getOwnPropertyDescriptor(e,"ref"))==null?void 0:a.get,r=t&&"isReactWarning"in t&&t.isReactWarning,r?e.props.ref:e.props.ref||e.ref)}function cI(e){return y.isValidElement(e)&&typeof e.type=="function"&&"__radixId"in e.type&&e.type.__radixId===oI}var dI=Symbol.for("react.lazy");function bw(e){return e!=null&&typeof e=="object"&&"$$typeof"in e&&e.$$typeof===dI&&"_payload"in e&&fI(e._payload)}function fI(e){return typeof e=="object"&&e!==null&&"then"in e}var hI=e=>`${e} failed to slot onto its children. Expected a single React element child or \`Slottable\`.`,mI=e=>`${e} failed to slot onto its \`Slottable\`. Expected \`Slottable\` to receive a single React element child.`,Nd=lh[" use ".trim().toString()],pI=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],Xt=pI.reduce((e,t)=>{const r=RN(`Primitive.${t}`),n=y.forwardRef((a,o)=>{const{asChild:c,...u}=a,f=c?r:t;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),l.jsx(f,{...u,ref:o})});return n.displayName=`Primitive.${t}`,{...e,[t]:n}},{});function gI(e,t){e&&fh.flushSync(()=>e.dispatchEvent(t))}function Eu(e){const t=y.useRef(e);return y.useEffect(()=>{t.current=e}),y.useMemo(()=>((...r)=>{var n;return(n=t.current)==null?void 0:n.call(t,...r)}),[])}function vI(e,t=globalThis==null?void 0:globalThis.document){const r=Eu(e);y.useEffect(()=>{const n=a=>{a.key==="Escape"&&r(a)};return t.addEventListener("keydown",n,{capture:!0}),()=>t.removeEventListener("keydown",n,{capture:!0})},[r,t])}var yI="DismissableLayer",fv="dismissableLayer.update",xI="dismissableLayer.pointerDownOutside",bI="dismissableLayer.focusOutside",ww,jy=y.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set,dismissableSurfaces:new Set}),LN=y.forwardRef((e,t)=>{const{disableOutsidePointerEvents:r=!1,deferPointerDownOutside:n=!1,onEscapeKeyDown:a,onPointerDownOutside:o,onFocusOutside:c,onInteractOutside:u,onDismiss:f,...h}=e,m=y.useContext(jy),[g,v]=y.useState(null),b=(g==null?void 0:g.ownerDocument)??(globalThis==null?void 0:globalThis.document),[,j]=y.useState({}),k=Co(t,B=>v(B)),S=Array.from(m.layers),[N]=[...m.layersWithOutsidePointerEventsDisabled].slice(-1),E=S.indexOf(N),A=g?S.indexOf(g):-1,P=m.layersWithOutsidePointerEventsDisabled.size>0,_=A>=E,O=y.useRef(!1),D=SI(B=>{const F=B.target;if(!(F instanceof Node))return;const Y=[...m.branches].some(H=>H.contains(F));!_||Y||(o==null||o(B),u==null||u(B),B.defaultPrevented||f==null||f())},{ownerDocument:b,deferPointerDownOutside:n,isDeferredPointerDownOutsideRef:O,dismissableSurfaces:m.dismissableSurfaces}),U=NI(B=>{if(n&&O.current)return;const F=B.target;[...m.branches].some(H=>H.contains(F))||(c==null||c(B),u==null||u(B),B.defaultPrevented||f==null||f())},b);return vI(B=>{A===m.layers.size-1&&(a==null||a(B),!B.defaultPrevented&&f&&(B.preventDefault(),f()))},b),y.useEffect(()=>{if(g)return r&&(m.layersWithOutsidePointerEventsDisabled.size===0&&(ww=b.body.style.pointerEvents,b.body.style.pointerEvents="none"),m.layersWithOutsidePointerEventsDisabled.add(g)),m.layers.add(g),kw(),()=>{r&&(m.layersWithOutsidePointerEventsDisabled.delete(g),m.layersWithOutsidePointerEventsDisabled.size===0&&(b.body.style.pointerEvents=ww))}},[g,b,r,m]),y.useEffect(()=>()=>{g&&(m.layers.delete(g),m.layersWithOutsidePointerEventsDisabled.delete(g),kw())},[g,m]),y.useEffect(()=>{const B=()=>j({});return document.addEventListener(fv,B),()=>document.removeEventListener(fv,B)},[]),l.jsx(Xt.div,{...h,ref:k,style:{pointerEvents:P?_?"auto":"none":void 0,...e.style},onFocusCapture:ba(e.onFocusCapture,U.onFocusCapture),onBlurCapture:ba(e.onBlurCapture,U.onBlurCapture),onPointerDownCapture:ba(e.onPointerDownCapture,D.onPointerDownCapture)})});LN.displayName=yI;var wI="DismissableLayerBranch",kI=y.forwardRef((e,t)=>{const r=y.useContext(jy),n=y.useRef(null),a=Co(t,n);return y.useEffect(()=>{const o=n.current;if(o)return r.branches.add(o),()=>{r.branches.delete(o)}},[r.branches]),l.jsx(Xt.div,{...e,ref:a})});kI.displayName=wI;function jI(){const e=y.useContext(jy),[t,r]=y.useState(null);return y.useEffect(()=>{if(t)return e.dismissableSurfaces.add(t),()=>{e.dismissableSurfaces.delete(t)}},[t,e.dismissableSurfaces]),r}function SI(e,t){const{ownerDocument:r=globalThis==null?void 0:globalThis.document,deferPointerDownOutside:n=!1,isDeferredPointerDownOutsideRef:a,dismissableSurfaces:o}=t,c=Eu(e),u=y.useRef(!1),f=y.useRef(!1),h=y.useRef(new Map),m=y.useRef(()=>{});return y.useEffect(()=>{function g(){f.current=!1,a.current=!1,h.current.clear()}function v(){return Array.from(h.current.values()).some(Boolean)}function b(E){if(!f.current)return;const A=E.target;A instanceof Node&&[...o].some(_=>_.contains(A))||h.current.set(E.type,!0),E.type==="click"&&window.setTimeout(()=>{f.current&&m.current()},0)}function j(E){f.current&&h.current.set(E.type,!1)}const k=E=>{if(E.target&&!u.current){let A=function(){r.removeEventListener("click",m.current);const _=v();g(),_||$N(xI,c,P,{discrete:!0})};const P={originalEvent:E};f.current=!0,a.current=n&&E.button===0,h.current.clear(),!n||E.button!==0?A():(r.removeEventListener("click",m.current),m.current=A,r.addEventListener("click",m.current,{once:!0}))}else r.removeEventListener("click",m.current),g();u.current=!1},S=["pointerup","mousedown","mouseup","touchstart","touchend","click"];for(const E of S)r.addEventListener(E,b,!0),r.addEventListener(E,j);const N=window.setTimeout(()=>{r.addEventListener("pointerdown",k)},0);return()=>{window.clearTimeout(N),r.removeEventListener("pointerdown",k),r.removeEventListener("click",m.current);for(const E of S)r.removeEventListener(E,b,!0),r.removeEventListener(E,j)}},[r,c,n,a,o]),{onPointerDownCapture:()=>u.current=!0}}function NI(e,t=globalThis==null?void 0:globalThis.document){const r=Eu(e),n=y.useRef(!1);return y.useEffect(()=>{const a=o=>{o.target&&!n.current&&$N(bI,r,{originalEvent:o},{discrete:!1})};return t.addEventListener("focusin",a),()=>t.removeEventListener("focusin",a)},[t,r]),{onFocusCapture:()=>n.current=!0,onBlurCapture:()=>n.current=!1}}function kw(){const e=new CustomEvent(fv);document.dispatchEvent(e)}function $N(e,t,r,{discrete:n}){const a=r.originalEvent.target,o=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:r});t&&a.addEventListener(e,t,{once:!0}),n?gI(a,o):a.dispatchEvent(o)}var rg="focusScope.autoFocusOnMount",ng="focusScope.autoFocusOnUnmount",jw={bubbles:!1,cancelable:!0},EI="FocusScope",zN=y.forwardRef((e,t)=>{const{loop:r=!1,trapped:n=!1,onMountAutoFocus:a,onUnmountAutoFocus:o,...c}=e,[u,f]=y.useState(null),h=Eu(a),m=Eu(o),g=y.useRef(null),v=Co(t,k=>f(k)),b=y.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;y.useEffect(()=>{if(n){let k=function(A){if(b.paused||!u)return;const P=A.target;u.contains(P)?g.current=P:ia(g.current,{select:!0})},S=function(A){if(b.paused||!u)return;const P=A.relatedTarget;P!==null&&(u.contains(P)||ia(g.current,{select:!0}))},N=function(A){if(document.activeElement===document.body)for(const _ of A)_.removedNodes.length>0&&ia(u)};document.addEventListener("focusin",k),document.addEventListener("focusout",S);const E=new MutationObserver(N);return u&&E.observe(u,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",k),document.removeEventListener("focusout",S),E.disconnect()}}},[n,u,b.paused]),y.useEffect(()=>{if(u){Nw.add(b);const k=document.activeElement;if(!u.contains(k)){const N=new CustomEvent(rg,jw);u.addEventListener(rg,h),u.dispatchEvent(N),N.defaultPrevented||(AI(MI(FN(u)),{select:!0}),document.activeElement===k&&ia(u))}return()=>{u.removeEventListener(rg,h),setTimeout(()=>{const N=new CustomEvent(ng,jw);u.addEventListener(ng,m),u.dispatchEvent(N),N.defaultPrevented||ia(k??document.body,{select:!0}),u.removeEventListener(ng,m),Nw.remove(b)},0)}}},[u,h,m,b]);const j=y.useCallback(k=>{if(!r&&!n||b.paused)return;const S=k.key==="Tab"&&!k.altKey&&!k.ctrlKey&&!k.metaKey,N=document.activeElement;if(S&&N){const E=k.currentTarget,[A,P]=CI(E);A&&P?!k.shiftKey&&N===P?(k.preventDefault(),r&&ia(A,{select:!0})):k.shiftKey&&N===A&&(k.preventDefault(),r&&ia(P,{select:!0})):N===E&&k.preventDefault()}},[r,n,b.paused]);return l.jsx(Xt.div,{tabIndex:-1,...c,ref:v,onKeyDown:j})});zN.displayName=EI;function AI(e,{select:t=!1}={}){const r=document.activeElement;for(const n of e)if(ia(n,{select:t}),document.activeElement!==r)return}function CI(e){const t=FN(e),r=Sw(t,e),n=Sw(t.reverse(),e);return[r,n]}function FN(e){const t=[],r=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:n=>{const a=n.tagName==="INPUT"&&n.type==="hidden";return n.disabled||n.hidden||a?NodeFilter.FILTER_SKIP:n.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;r.nextNode();)t.push(r.currentNode);return t}function Sw(e,t){for(const r of e)if(!PI(r,{upTo:t}))return r}function PI(e,{upTo:t}){if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(t!==void 0&&e===t)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1}function OI(e){return e instanceof HTMLInputElement&&"select"in e}function ia(e,{select:t=!1}={}){if(e&&e.focus){const r=document.activeElement;e.focus({preventScroll:!0}),e!==r&&OI(e)&&t&&e.select()}}var Nw=_I();function _I(){let e=[];return{add(t){const r=e[0];t!==r&&(r==null||r.pause()),e=Ew(e,t),e.unshift(t)},remove(t){var r;e=Ew(e,t),(r=e[0])==null||r.resume()}}}function Ew(e,t){const r=[...e],n=r.indexOf(t);return n!==-1&&r.splice(n,1),r}function MI(e){return e.filter(t=>t.tagName!=="A")}var II="Portal",BN=y.forwardRef((e,t)=>{var u;const{container:r,...n}=e,[a,o]=y.useState(!1);Nu(()=>o(!0),[]);const c=r||a&&((u=globalThis==null?void 0:globalThis.document)==null?void 0:u.body);return c?fh.createPortal(l.jsx(Xt.div,{...n,ref:t}),c):null});BN.displayName=II;function TI(e,t){return y.useReducer((r,n)=>t[r][n]??r,e)}var hh=e=>{const{present:t,children:r}=e,n=DI(t),a=typeof r=="function"?r({present:n.isPresent}):y.Children.only(r),o=RI(n.ref,LI(a));return typeof r=="function"||n.isPresent?y.cloneElement(a,{ref:o}):null};hh.displayName="Presence";function DI(e){const[t,r]=y.useState(),n=y.useRef(null),a=y.useRef(e),o=y.useRef("none"),c=e?"mounted":"unmounted",[u,f]=TI(c,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return y.useEffect(()=>{const h=Ed(n.current);o.current=u==="mounted"?h:"none"},[u]),Nu(()=>{const h=n.current,m=a.current;if(m!==e){const v=o.current,b=Ed(h);e?f("MOUNT"):b==="none"||(h==null?void 0:h.display)==="none"?f("UNMOUNT"):f(m&&v!==b?"ANIMATION_OUT":"UNMOUNT"),a.current=e}},[e,f]),Nu(()=>{if(t){let h;const m=t.ownerDocument.defaultView??window,g=b=>{const k=Ed(n.current).includes(CSS.escape(b.animationName));if(b.target===t&&k&&(f("ANIMATION_END"),!a.current)){const S=t.style.animationFillMode;t.style.animationFillMode="forwards",h=m.setTimeout(()=>{t.style.animationFillMode==="forwards"&&(t.style.animationFillMode=S)})}},v=b=>{b.target===t&&(o.current=Ed(n.current))};return t.addEventListener("animationstart",v),t.addEventListener("animationcancel",g),t.addEventListener("animationend",g),()=>{m.clearTimeout(h),t.removeEventListener("animationstart",v),t.removeEventListener("animationcancel",g),t.removeEventListener("animationend",g)}}else f("ANIMATION_END")},[t,f]),{isPresent:["mounted","unmountSuspended"].includes(u),ref:y.useCallback(h=>{n.current=h?getComputedStyle(h):null,r(h)},[])}}function Aw(e,t){if(typeof e=="function")return e(t);e!=null&&(e.current=t)}function RI(...e){const t=y.useRef(e);return t.current=e,y.useCallback(r=>{const n=t.current;let a=!1;const o=n.map(c=>{const u=Aw(c,r);return!a&&typeof u=="function"&&(a=!0),u});if(a)return()=>{for(let c=0;c{_n||(_n={start:Cw(),end:Cw()});const{start:e,end:t}=_n;return document.body.firstElementChild!==e&&document.body.insertAdjacentElement("afterbegin",e),document.body.lastElementChild!==t&&document.body.insertAdjacentElement("beforeend",t),Ad++,()=>{Ad===1&&(_n==null||_n.start.remove(),_n==null||_n.end.remove(),_n=null),Ad=Math.max(0,Ad-1)}},[])}function Cw(){const e=document.createElement("span");return e.setAttribute("data-radix-focus-guard",""),e.tabIndex=0,e.style.outline="none",e.style.opacity="0",e.style.position="fixed",e.style.pointerEvents="none",e}var $n=function(){return $n=Object.assign||function(t){for(var r,n=1,a=arguments.length;n"u")return tT;var t=rT(e),r=document.documentElement.clientWidth,n=window.innerWidth;return{left:t[0],top:t[1],right:t[2],gap:Math.max(0,n-r+t[2]-t[0])}},iT=KN(),ks="data-scroll-locked",aT=function(e,t,r,n){var a=e.left,o=e.top,c=e.right,u=e.gap;return r===void 0&&(r="margin"),` + */const xa=de("Zap",[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]]),mu=[{id:"dashboard",label:"Zentrale",hint:"System- & Stack-Status",icon:v4},{id:"models",label:"Modell-Manager",hint:"Verwalten, laden & Gateway-Routing",icon:lf},{id:"memory",label:"Gedächtnis",hint:"Geteiltes Memory verwalten",icon:Ao},{id:"connect",label:"Verbinden",hint:"IDE-/Agent-Configs erzeugen",icon:cf},{id:"agent",label:"Hermes",hint:"Agent-Status & Verdrahtung",icon:wn},{id:"terminal",label:"Terminal",hint:"Interaktives Hermes-Agent-Terminal",icon:IN},{id:"guide",label:"Anleitung",hint:"Einrichten & Vibe-Coding",icon:t4}];var yw=1,H4=.9,W4=.8,K4=.17,eg=.1,tg=.999,G4=.9999,V4=.99,q4=/[\\\/_+.#"@\[\(\{&]/,Q4=/[\\\/_+.#"@\[\(\{&]/g,Y4=/[\s-]/,DN=/[\s-]/g;function dv(e,t,r,n,a,o,c){if(o===t.length)return a===e.length?yw:V4;var u=`${a},${o}`;if(c[u]!==void 0)return c[u];for(var f=n.charAt(o),h=r.indexOf(f,a),m=0,g,v,b,j;h>=0;)g=dv(e,t,r,n,h+1,o+1,c),g>m&&(h===a?g*=yw:q4.test(e.charAt(h-1))?(g*=W4,b=e.slice(a,h-1).match(Q4),b&&a>0&&(g*=Math.pow(tg,b.length))):Y4.test(e.charAt(h-1))?(g*=H4,j=e.slice(a,h-1).match(DN),j&&a>0&&(g*=Math.pow(tg,j.length))):(g*=K4,a>0&&(g*=Math.pow(tg,h-a))),e.charAt(h)!==t.charAt(o)&&(g*=G4)),(gg&&(g=v*eg)),g>m&&(m=g),h=r.indexOf(f,h+1);return c[u]=m,m}function xw(e){return e.toLowerCase().replace(DN," ")}function X4(e,t,r){return e=r&&r.length>0?`${e+" "+r.join(" ")}`:e,dv(e,t,xw(e),xw(t),0,0,{})}function ba(e,t,{checkForDefaultPrevented:r=!0}={}){return function(a){if(e==null||e(a),r===!1||!a.defaultPrevented)return t==null?void 0:t(a)}}function bw(e,t){if(typeof e=="function")return e(t);e!=null&&(e.current=t)}function Ws(...e){return t=>{let r=!1;const n=e.map(a=>{const o=bw(a,t);return!r&&typeof o=="function"&&(r=!0),o});if(r)return()=>{for(let a=0;a{var N;const{scope:v,children:b,...j}=g,k=((N=v==null?void 0:v[e])==null?void 0:N[f])||u,S=y.useMemo(()=>j,Object.values(j));return l.jsx(k.Provider,{value:S,children:b})};h.displayName=o+"Provider";function m(g,v){var k;const b=((k=v==null?void 0:v[e])==null?void 0:k[f])||u,j=y.useContext(b);if(j)return j;if(c!==void 0)return c;throw new Error(`\`${g}\` must be used within \`${o}\``)}return[h,m]}const a=()=>{const o=r.map(c=>y.createContext(c));return function(u){const f=(u==null?void 0:u[e])||o;return y.useMemo(()=>({[`__scope${e}`]:{...u,[e]:f}}),[u,f])}};return a.scopeName=e,[n,J4(a,...t)]}function J4(...e){const t=e[0];if(e.length===1)return t;const r=()=>{const n=e.map(a=>({useScope:a(),scopeName:a.scopeName}));return function(o){const c=n.reduce((u,{useScope:f,scopeName:h})=>{const g=f(o)[`__scope${h}`];return{...u,...g}},{});return y.useMemo(()=>({[`__scope${t.scopeName}`]:c}),[c])}};return r.scopeName=t.scopeName,r}var Nu=globalThis!=null&&globalThis.document?y.useLayoutEffect:()=>{},eI=lh[" useId ".trim().toString()]||(()=>{}),tI=0;function vi(e){const[t,r]=y.useState(eI());return Nu(()=>{r(n=>n??String(tI++))},[e]),t?`radix-${t}`:""}var rI=lh[" useInsertionEffect ".trim().toString()]||Nu;function nI({prop:e,defaultProp:t,onChange:r=()=>{},caller:n}){const[a,o,c]=iI({defaultProp:t,onChange:r}),u=e!==void 0,f=u?e:a;{const m=y.useRef(e!==void 0);y.useEffect(()=>{const g=m.current;g!==u&&console.warn(`${n} is changing from ${g?"controlled":"uncontrolled"} to ${u?"controlled":"uncontrolled"}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`),m.current=u},[u,n])}const h=y.useCallback(m=>{var g;if(u){const v=aI(m)?m(e):m;v!==e&&((g=c.current)==null||g.call(c,v))}else o(m)},[u,e,o,c]);return[f,h]}function iI({defaultProp:e,onChange:t}){const[r,n]=y.useState(e),a=y.useRef(r),o=y.useRef(t);return rI(()=>{o.current=t},[t]),y.useEffect(()=>{var c;a.current!==r&&((c=o.current)==null||c.call(o,r),a.current=r)},[r,a]),[r,n,o]}function aI(e){return typeof e=="function"}var fh=hN();function RN(e){const t=y.forwardRef((r,n)=>{let{children:a,...o}=r,c=null,u=!1;const f=[];ww(a)&&typeof Nd=="function"&&(a=Nd(a._payload)),y.Children.forEach(a,v=>{var b;if(cI(v)){u=!0;const j=v;let k="child"in j.props?j.props.child:j.props.children;ww(k)&&typeof Nd=="function"&&(k=Nd(k._payload)),c=sI(j,k),f.push((b=c==null?void 0:c.props)==null?void 0:b.children)}else f.push(v)}),c?c=y.cloneElement(c,void 0,f):!u&&y.Children.count(a)===1&&y.isValidElement(a)&&(c=a);const h=c?uI(c):void 0,m=Co(n,h);if(!c){if(a||a===0)throw new Error(u?mI(e):hI(e));return a}const g=lI(o,c.props??{});return c.type!==y.Fragment&&(g.ref=n?m:h),y.cloneElement(c,g)});return t.displayName=`${e}.Slot`,t}var oI=Symbol.for("radix.slottable"),sI=(e,t)=>{if("child"in e.props){const r=e.props.child;return y.isValidElement(r)?y.cloneElement(r,void 0,e.props.children(r.props.children)):null}return y.isValidElement(t)?t:null};function lI(e,t){const r={...t};for(const n in t){const a=e[n],o=t[n];/^on[A-Z]/.test(n)?a&&o?r[n]=(...u)=>{const f=o(...u);return a(...u),f}:a&&(r[n]=a):n==="style"?r[n]={...a,...o}:n==="className"&&(r[n]=[a,o].filter(Boolean).join(" "))}return{...e,...r}}function uI(e){var n,a;let t=(n=Object.getOwnPropertyDescriptor(e.props,"ref"))==null?void 0:n.get,r=t&&"isReactWarning"in t&&t.isReactWarning;return r?e.ref:(t=(a=Object.getOwnPropertyDescriptor(e,"ref"))==null?void 0:a.get,r=t&&"isReactWarning"in t&&t.isReactWarning,r?e.props.ref:e.props.ref||e.ref)}function cI(e){return y.isValidElement(e)&&typeof e.type=="function"&&"__radixId"in e.type&&e.type.__radixId===oI}var dI=Symbol.for("react.lazy");function ww(e){return e!=null&&typeof e=="object"&&"$$typeof"in e&&e.$$typeof===dI&&"_payload"in e&&fI(e._payload)}function fI(e){return typeof e=="object"&&e!==null&&"then"in e}var hI=e=>`${e} failed to slot onto its children. Expected a single React element child or \`Slottable\`.`,mI=e=>`${e} failed to slot onto its \`Slottable\`. Expected \`Slottable\` to receive a single React element child.`,Nd=lh[" use ".trim().toString()],pI=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],Xt=pI.reduce((e,t)=>{const r=RN(`Primitive.${t}`),n=y.forwardRef((a,o)=>{const{asChild:c,...u}=a,f=c?r:t;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),l.jsx(f,{...u,ref:o})});return n.displayName=`Primitive.${t}`,{...e,[t]:n}},{});function gI(e,t){e&&fh.flushSync(()=>e.dispatchEvent(t))}function Eu(e){const t=y.useRef(e);return y.useEffect(()=>{t.current=e}),y.useMemo(()=>((...r)=>{var n;return(n=t.current)==null?void 0:n.call(t,...r)}),[])}function vI(e,t=globalThis==null?void 0:globalThis.document){const r=Eu(e);y.useEffect(()=>{const n=a=>{a.key==="Escape"&&r(a)};return t.addEventListener("keydown",n,{capture:!0}),()=>t.removeEventListener("keydown",n,{capture:!0})},[r,t])}var yI="DismissableLayer",fv="dismissableLayer.update",xI="dismissableLayer.pointerDownOutside",bI="dismissableLayer.focusOutside",kw,Sy=y.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set,dismissableSurfaces:new Set}),LN=y.forwardRef((e,t)=>{const{disableOutsidePointerEvents:r=!1,deferPointerDownOutside:n=!1,onEscapeKeyDown:a,onPointerDownOutside:o,onFocusOutside:c,onInteractOutside:u,onDismiss:f,...h}=e,m=y.useContext(Sy),[g,v]=y.useState(null),b=(g==null?void 0:g.ownerDocument)??(globalThis==null?void 0:globalThis.document),[,j]=y.useState({}),k=Co(t,B=>v(B)),S=Array.from(m.layers),[N]=[...m.layersWithOutsidePointerEventsDisabled].slice(-1),E=S.indexOf(N),A=g?S.indexOf(g):-1,P=m.layersWithOutsidePointerEventsDisabled.size>0,_=A>=E,O=y.useRef(!1),D=SI(B=>{const F=B.target;if(!(F instanceof Node))return;const Y=[...m.branches].some(H=>H.contains(F));!_||Y||(o==null||o(B),u==null||u(B),B.defaultPrevented||f==null||f())},{ownerDocument:b,deferPointerDownOutside:n,isDeferredPointerDownOutsideRef:O,dismissableSurfaces:m.dismissableSurfaces}),U=NI(B=>{if(n&&O.current)return;const F=B.target;[...m.branches].some(H=>H.contains(F))||(c==null||c(B),u==null||u(B),B.defaultPrevented||f==null||f())},b);return vI(B=>{A===m.layers.size-1&&(a==null||a(B),!B.defaultPrevented&&f&&(B.preventDefault(),f()))},b),y.useEffect(()=>{if(g)return r&&(m.layersWithOutsidePointerEventsDisabled.size===0&&(kw=b.body.style.pointerEvents,b.body.style.pointerEvents="none"),m.layersWithOutsidePointerEventsDisabled.add(g)),m.layers.add(g),jw(),()=>{r&&(m.layersWithOutsidePointerEventsDisabled.delete(g),m.layersWithOutsidePointerEventsDisabled.size===0&&(b.body.style.pointerEvents=kw))}},[g,b,r,m]),y.useEffect(()=>()=>{g&&(m.layers.delete(g),m.layersWithOutsidePointerEventsDisabled.delete(g),jw())},[g,m]),y.useEffect(()=>{const B=()=>j({});return document.addEventListener(fv,B),()=>document.removeEventListener(fv,B)},[]),l.jsx(Xt.div,{...h,ref:k,style:{pointerEvents:P?_?"auto":"none":void 0,...e.style},onFocusCapture:ba(e.onFocusCapture,U.onFocusCapture),onBlurCapture:ba(e.onBlurCapture,U.onBlurCapture),onPointerDownCapture:ba(e.onPointerDownCapture,D.onPointerDownCapture)})});LN.displayName=yI;var wI="DismissableLayerBranch",kI=y.forwardRef((e,t)=>{const r=y.useContext(Sy),n=y.useRef(null),a=Co(t,n);return y.useEffect(()=>{const o=n.current;if(o)return r.branches.add(o),()=>{r.branches.delete(o)}},[r.branches]),l.jsx(Xt.div,{...e,ref:a})});kI.displayName=wI;function jI(){const e=y.useContext(Sy),[t,r]=y.useState(null);return y.useEffect(()=>{if(t)return e.dismissableSurfaces.add(t),()=>{e.dismissableSurfaces.delete(t)}},[t,e.dismissableSurfaces]),r}function SI(e,t){const{ownerDocument:r=globalThis==null?void 0:globalThis.document,deferPointerDownOutside:n=!1,isDeferredPointerDownOutsideRef:a,dismissableSurfaces:o}=t,c=Eu(e),u=y.useRef(!1),f=y.useRef(!1),h=y.useRef(new Map),m=y.useRef(()=>{});return y.useEffect(()=>{function g(){f.current=!1,a.current=!1,h.current.clear()}function v(){return Array.from(h.current.values()).some(Boolean)}function b(E){if(!f.current)return;const A=E.target;A instanceof Node&&[...o].some(_=>_.contains(A))||h.current.set(E.type,!0),E.type==="click"&&window.setTimeout(()=>{f.current&&m.current()},0)}function j(E){f.current&&h.current.set(E.type,!1)}const k=E=>{if(E.target&&!u.current){let A=function(){r.removeEventListener("click",m.current);const _=v();g(),_||$N(xI,c,P,{discrete:!0})};const P={originalEvent:E};f.current=!0,a.current=n&&E.button===0,h.current.clear(),!n||E.button!==0?A():(r.removeEventListener("click",m.current),m.current=A,r.addEventListener("click",m.current,{once:!0}))}else r.removeEventListener("click",m.current),g();u.current=!1},S=["pointerup","mousedown","mouseup","touchstart","touchend","click"];for(const E of S)r.addEventListener(E,b,!0),r.addEventListener(E,j);const N=window.setTimeout(()=>{r.addEventListener("pointerdown",k)},0);return()=>{window.clearTimeout(N),r.removeEventListener("pointerdown",k),r.removeEventListener("click",m.current);for(const E of S)r.removeEventListener(E,b,!0),r.removeEventListener(E,j)}},[r,c,n,a,o]),{onPointerDownCapture:()=>u.current=!0}}function NI(e,t=globalThis==null?void 0:globalThis.document){const r=Eu(e),n=y.useRef(!1);return y.useEffect(()=>{const a=o=>{o.target&&!n.current&&$N(bI,r,{originalEvent:o},{discrete:!1})};return t.addEventListener("focusin",a),()=>t.removeEventListener("focusin",a)},[t,r]),{onFocusCapture:()=>n.current=!0,onBlurCapture:()=>n.current=!1}}function jw(){const e=new CustomEvent(fv);document.dispatchEvent(e)}function $N(e,t,r,{discrete:n}){const a=r.originalEvent.target,o=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:r});t&&a.addEventListener(e,t,{once:!0}),n?gI(a,o):a.dispatchEvent(o)}var rg="focusScope.autoFocusOnMount",ng="focusScope.autoFocusOnUnmount",Sw={bubbles:!1,cancelable:!0},EI="FocusScope",zN=y.forwardRef((e,t)=>{const{loop:r=!1,trapped:n=!1,onMountAutoFocus:a,onUnmountAutoFocus:o,...c}=e,[u,f]=y.useState(null),h=Eu(a),m=Eu(o),g=y.useRef(null),v=Co(t,k=>f(k)),b=y.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;y.useEffect(()=>{if(n){let k=function(A){if(b.paused||!u)return;const P=A.target;u.contains(P)?g.current=P:ia(g.current,{select:!0})},S=function(A){if(b.paused||!u)return;const P=A.relatedTarget;P!==null&&(u.contains(P)||ia(g.current,{select:!0}))},N=function(A){if(document.activeElement===document.body)for(const _ of A)_.removedNodes.length>0&&ia(u)};document.addEventListener("focusin",k),document.addEventListener("focusout",S);const E=new MutationObserver(N);return u&&E.observe(u,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",k),document.removeEventListener("focusout",S),E.disconnect()}}},[n,u,b.paused]),y.useEffect(()=>{if(u){Ew.add(b);const k=document.activeElement;if(!u.contains(k)){const N=new CustomEvent(rg,Sw);u.addEventListener(rg,h),u.dispatchEvent(N),N.defaultPrevented||(AI(MI(FN(u)),{select:!0}),document.activeElement===k&&ia(u))}return()=>{u.removeEventListener(rg,h),setTimeout(()=>{const N=new CustomEvent(ng,Sw);u.addEventListener(ng,m),u.dispatchEvent(N),N.defaultPrevented||ia(k??document.body,{select:!0}),u.removeEventListener(ng,m),Ew.remove(b)},0)}}},[u,h,m,b]);const j=y.useCallback(k=>{if(!r&&!n||b.paused)return;const S=k.key==="Tab"&&!k.altKey&&!k.ctrlKey&&!k.metaKey,N=document.activeElement;if(S&&N){const E=k.currentTarget,[A,P]=CI(E);A&&P?!k.shiftKey&&N===P?(k.preventDefault(),r&&ia(A,{select:!0})):k.shiftKey&&N===A&&(k.preventDefault(),r&&ia(P,{select:!0})):N===E&&k.preventDefault()}},[r,n,b.paused]);return l.jsx(Xt.div,{tabIndex:-1,...c,ref:v,onKeyDown:j})});zN.displayName=EI;function AI(e,{select:t=!1}={}){const r=document.activeElement;for(const n of e)if(ia(n,{select:t}),document.activeElement!==r)return}function CI(e){const t=FN(e),r=Nw(t,e),n=Nw(t.reverse(),e);return[r,n]}function FN(e){const t=[],r=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:n=>{const a=n.tagName==="INPUT"&&n.type==="hidden";return n.disabled||n.hidden||a?NodeFilter.FILTER_SKIP:n.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;r.nextNode();)t.push(r.currentNode);return t}function Nw(e,t){for(const r of e)if(!PI(r,{upTo:t}))return r}function PI(e,{upTo:t}){if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(t!==void 0&&e===t)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1}function OI(e){return e instanceof HTMLInputElement&&"select"in e}function ia(e,{select:t=!1}={}){if(e&&e.focus){const r=document.activeElement;e.focus({preventScroll:!0}),e!==r&&OI(e)&&t&&e.select()}}var Ew=_I();function _I(){let e=[];return{add(t){const r=e[0];t!==r&&(r==null||r.pause()),e=Aw(e,t),e.unshift(t)},remove(t){var r;e=Aw(e,t),(r=e[0])==null||r.resume()}}}function Aw(e,t){const r=[...e],n=r.indexOf(t);return n!==-1&&r.splice(n,1),r}function MI(e){return e.filter(t=>t.tagName!=="A")}var II="Portal",BN=y.forwardRef((e,t)=>{var u;const{container:r,...n}=e,[a,o]=y.useState(!1);Nu(()=>o(!0),[]);const c=r||a&&((u=globalThis==null?void 0:globalThis.document)==null?void 0:u.body);return c?fh.createPortal(l.jsx(Xt.div,{...n,ref:t}),c):null});BN.displayName=II;function TI(e,t){return y.useReducer((r,n)=>t[r][n]??r,e)}var hh=e=>{const{present:t,children:r}=e,n=DI(t),a=typeof r=="function"?r({present:n.isPresent}):y.Children.only(r),o=RI(n.ref,LI(a));return typeof r=="function"||n.isPresent?y.cloneElement(a,{ref:o}):null};hh.displayName="Presence";function DI(e){const[t,r]=y.useState(),n=y.useRef(null),a=y.useRef(e),o=y.useRef("none"),c=e?"mounted":"unmounted",[u,f]=TI(c,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return y.useEffect(()=>{const h=Ed(n.current);o.current=u==="mounted"?h:"none"},[u]),Nu(()=>{const h=n.current,m=a.current;if(m!==e){const v=o.current,b=Ed(h);e?f("MOUNT"):b==="none"||(h==null?void 0:h.display)==="none"?f("UNMOUNT"):f(m&&v!==b?"ANIMATION_OUT":"UNMOUNT"),a.current=e}},[e,f]),Nu(()=>{if(t){let h;const m=t.ownerDocument.defaultView??window,g=b=>{const k=Ed(n.current).includes(CSS.escape(b.animationName));if(b.target===t&&k&&(f("ANIMATION_END"),!a.current)){const S=t.style.animationFillMode;t.style.animationFillMode="forwards",h=m.setTimeout(()=>{t.style.animationFillMode==="forwards"&&(t.style.animationFillMode=S)})}},v=b=>{b.target===t&&(o.current=Ed(n.current))};return t.addEventListener("animationstart",v),t.addEventListener("animationcancel",g),t.addEventListener("animationend",g),()=>{m.clearTimeout(h),t.removeEventListener("animationstart",v),t.removeEventListener("animationcancel",g),t.removeEventListener("animationend",g)}}else f("ANIMATION_END")},[t,f]),{isPresent:["mounted","unmountSuspended"].includes(u),ref:y.useCallback(h=>{n.current=h?getComputedStyle(h):null,r(h)},[])}}function Cw(e,t){if(typeof e=="function")return e(t);e!=null&&(e.current=t)}function RI(...e){const t=y.useRef(e);return t.current=e,y.useCallback(r=>{const n=t.current;let a=!1;const o=n.map(c=>{const u=Cw(c,r);return!a&&typeof u=="function"&&(a=!0),u});if(a)return()=>{for(let c=0;c{_n||(_n={start:Pw(),end:Pw()});const{start:e,end:t}=_n;return document.body.firstElementChild!==e&&document.body.insertAdjacentElement("afterbegin",e),document.body.lastElementChild!==t&&document.body.insertAdjacentElement("beforeend",t),Ad++,()=>{Ad===1&&(_n==null||_n.start.remove(),_n==null||_n.end.remove(),_n=null),Ad=Math.max(0,Ad-1)}},[])}function Pw(){const e=document.createElement("span");return e.setAttribute("data-radix-focus-guard",""),e.tabIndex=0,e.style.outline="none",e.style.opacity="0",e.style.position="fixed",e.style.pointerEvents="none",e}var $n=function(){return $n=Object.assign||function(t){for(var r,n=1,a=arguments.length;n"u")return tT;var t=rT(e),r=document.documentElement.clientWidth,n=window.innerWidth;return{left:t[0],top:t[1],right:t[2],gap:Math.max(0,n-r+t[2]-t[0])}},iT=KN(),js="data-scroll-locked",aT=function(e,t,r,n){var a=e.left,o=e.top,c=e.right,u=e.gap;return r===void 0&&(r="margin"),` .`.concat(FI,` { overflow: hidden `).concat(n,`; padding-right: `).concat(u,"px ").concat(n,`; } - body[`).concat(ks,`] { + body[`).concat(js,`] { overflow: hidden `).concat(n,`; overscroll-behavior: contain; `).concat([t&&"position: relative ".concat(n,";"),r==="margin"&&` @@ -551,13 +551,13 @@ Error generating stack: `+w.message+` margin-right: 0 `).concat(n,`; } - body[`).concat(ks,`] { + body[`).concat(js,`] { `).concat(BI,": ").concat(u,`px; } -`)},Ow=function(){var e=parseInt(document.body.getAttribute(ks)||"0",10);return isFinite(e)?e:0},oT=function(){y.useEffect(function(){return document.body.setAttribute(ks,(Ow()+1).toString()),function(){var e=Ow()-1;e<=0?document.body.removeAttribute(ks):document.body.setAttribute(ks,e.toString())}},[])},sT=function(e){var t=e.noRelative,r=e.noImportant,n=e.gapMode,a=n===void 0?"margin":n;oT();var o=y.useMemo(function(){return nT(a)},[a]);return y.createElement(iT,{styles:aT(o,!t,a,r?"":"!important")})},hv=!1;if(typeof window<"u")try{var Cd=Object.defineProperty({},"passive",{get:function(){return hv=!0,!0}});window.addEventListener("test",Cd,Cd),window.removeEventListener("test",Cd,Cd)}catch{hv=!1}var is=hv?{passive:!1}:!1,lT=function(e){return e.tagName==="TEXTAREA"},GN=function(e,t){if(!(e instanceof Element))return!1;var r=window.getComputedStyle(e);return r[t]!=="hidden"&&!(r.overflowY===r.overflowX&&!lT(e)&&r[t]==="visible")},uT=function(e){return GN(e,"overflowY")},cT=function(e){return GN(e,"overflowX")},_w=function(e,t){var r=t.ownerDocument,n=t;do{typeof ShadowRoot<"u"&&n instanceof ShadowRoot&&(n=n.host);var a=VN(e,n);if(a){var o=qN(e,n),c=o[1],u=o[2];if(c>u)return!0}n=n.parentNode}while(n&&n!==r.body);return!1},dT=function(e){var t=e.scrollTop,r=e.scrollHeight,n=e.clientHeight;return[t,r,n]},fT=function(e){var t=e.scrollLeft,r=e.scrollWidth,n=e.clientWidth;return[t,r,n]},VN=function(e,t){return e==="v"?uT(t):cT(t)},qN=function(e,t){return e==="v"?dT(t):fT(t)},hT=function(e,t){return e==="h"&&t==="rtl"?-1:1},mT=function(e,t,r,n,a){var o=hT(e,window.getComputedStyle(t).direction),c=o*n,u=r.target,f=t.contains(u),h=!1,m=c>0,g=0,v=0;do{if(!u)break;var b=qN(e,u),j=b[0],k=b[1],S=b[2],N=k-S-o*j;(j||N)&&VN(e,u)&&(g+=N,v+=j);var E=u.parentNode;u=E&&E.nodeType===Node.DOCUMENT_FRAGMENT_NODE?E.host:E}while(!f&&u!==document.body||f&&(t.contains(u)||t===u));return(m&&Math.abs(g)<1||!m&&Math.abs(v)<1)&&(h=!0),h},Pd=function(e){return"changedTouches"in e?[e.changedTouches[0].clientX,e.changedTouches[0].clientY]:[0,0]},Mw=function(e){return[e.deltaX,e.deltaY]},Iw=function(e){return e&&"current"in e?e.current:e},pT=function(e,t){return e[0]===t[0]&&e[1]===t[1]},gT=function(e){return` +`)},_w=function(){var e=parseInt(document.body.getAttribute(js)||"0",10);return isFinite(e)?e:0},oT=function(){y.useEffect(function(){return document.body.setAttribute(js,(_w()+1).toString()),function(){var e=_w()-1;e<=0?document.body.removeAttribute(js):document.body.setAttribute(js,e.toString())}},[])},sT=function(e){var t=e.noRelative,r=e.noImportant,n=e.gapMode,a=n===void 0?"margin":n;oT();var o=y.useMemo(function(){return nT(a)},[a]);return y.createElement(iT,{styles:aT(o,!t,a,r?"":"!important")})},hv=!1;if(typeof window<"u")try{var Cd=Object.defineProperty({},"passive",{get:function(){return hv=!0,!0}});window.addEventListener("test",Cd,Cd),window.removeEventListener("test",Cd,Cd)}catch{hv=!1}var as=hv?{passive:!1}:!1,lT=function(e){return e.tagName==="TEXTAREA"},GN=function(e,t){if(!(e instanceof Element))return!1;var r=window.getComputedStyle(e);return r[t]!=="hidden"&&!(r.overflowY===r.overflowX&&!lT(e)&&r[t]==="visible")},uT=function(e){return GN(e,"overflowY")},cT=function(e){return GN(e,"overflowX")},Mw=function(e,t){var r=t.ownerDocument,n=t;do{typeof ShadowRoot<"u"&&n instanceof ShadowRoot&&(n=n.host);var a=VN(e,n);if(a){var o=qN(e,n),c=o[1],u=o[2];if(c>u)return!0}n=n.parentNode}while(n&&n!==r.body);return!1},dT=function(e){var t=e.scrollTop,r=e.scrollHeight,n=e.clientHeight;return[t,r,n]},fT=function(e){var t=e.scrollLeft,r=e.scrollWidth,n=e.clientWidth;return[t,r,n]},VN=function(e,t){return e==="v"?uT(t):cT(t)},qN=function(e,t){return e==="v"?dT(t):fT(t)},hT=function(e,t){return e==="h"&&t==="rtl"?-1:1},mT=function(e,t,r,n,a){var o=hT(e,window.getComputedStyle(t).direction),c=o*n,u=r.target,f=t.contains(u),h=!1,m=c>0,g=0,v=0;do{if(!u)break;var b=qN(e,u),j=b[0],k=b[1],S=b[2],N=k-S-o*j;(j||N)&&VN(e,u)&&(g+=N,v+=j);var E=u.parentNode;u=E&&E.nodeType===Node.DOCUMENT_FRAGMENT_NODE?E.host:E}while(!f&&u!==document.body||f&&(t.contains(u)||t===u));return(m&&Math.abs(g)<1||!m&&Math.abs(v)<1)&&(h=!0),h},Pd=function(e){return"changedTouches"in e?[e.changedTouches[0].clientX,e.changedTouches[0].clientY]:[0,0]},Iw=function(e){return[e.deltaX,e.deltaY]},Tw=function(e){return e&&"current"in e?e.current:e},pT=function(e,t){return e[0]===t[0]&&e[1]===t[1]},gT=function(e){return` .block-interactivity-`.concat(e,` {pointer-events: none;} .allow-interactivity-`).concat(e,` {pointer-events: all;} -`)},vT=0,as=[];function yT(e){var t=y.useRef([]),r=y.useRef([0,0]),n=y.useRef(),a=y.useState(vT++)[0],o=y.useState(KN)[0],c=y.useRef(e);y.useEffect(function(){c.current=e},[e]),y.useEffect(function(){if(e.inert){document.body.classList.add("block-interactivity-".concat(a));var k=zI([e.lockRef.current],(e.shards||[]).map(Iw),!0).filter(Boolean);return k.forEach(function(S){return S.classList.add("allow-interactivity-".concat(a))}),function(){document.body.classList.remove("block-interactivity-".concat(a)),k.forEach(function(S){return S.classList.remove("allow-interactivity-".concat(a))})}}},[e.inert,e.lockRef.current,e.shards]);var u=y.useCallback(function(k,S){if("touches"in k&&k.touches.length===2||k.type==="wheel"&&k.ctrlKey)return!c.current.allowPinchZoom;var N=Pd(k),E=r.current,A="deltaX"in k?k.deltaX:E[0]-N[0],P="deltaY"in k?k.deltaY:E[1]-N[1],_,O=k.target,D=Math.abs(A)>Math.abs(P)?"h":"v";if("touches"in k&&D==="h"&&O.type==="range")return!1;var U=window.getSelection(),B=U&&U.anchorNode,F=B?B===O||B.contains(O):!1;if(F)return!1;var Y=_w(D,O);if(!Y)return!0;if(Y?_=D:(_=D==="v"?"h":"v",Y=_w(D,O)),!Y)return!1;if(!n.current&&"changedTouches"in k&&(A||P)&&(n.current=_),!_)return!0;var H=n.current||_;return mT(H,S,k,H==="h"?A:P)},[]),f=y.useCallback(function(k){var S=k;if(!(!as.length||as[as.length-1]!==o)){var N="deltaY"in S?Mw(S):Pd(S),E=t.current.filter(function(_){return _.name===S.type&&(_.target===S.target||S.target===_.shadowParent)&&pT(_.delta,N)})[0];if(E&&E.should){S.cancelable&&S.preventDefault();return}if(!E){var A=(c.current.shards||[]).map(Iw).filter(Boolean).filter(function(_){return _.contains(S.target)}),P=A.length>0?u(S,A[0]):!c.current.noIsolation;P&&S.cancelable&&S.preventDefault()}}},[]),h=y.useCallback(function(k,S,N,E){var A={name:k,delta:S,target:N,should:E,shadowParent:xT(N)};t.current.push(A),setTimeout(function(){t.current=t.current.filter(function(P){return P!==A})},1)},[]),m=y.useCallback(function(k){r.current=Pd(k),n.current=void 0},[]),g=y.useCallback(function(k){h(k.type,Mw(k),k.target,u(k,e.lockRef.current))},[]),v=y.useCallback(function(k){h(k.type,Pd(k),k.target,u(k,e.lockRef.current))},[]);y.useEffect(function(){return as.push(o),e.setCallbacks({onScrollCapture:g,onWheelCapture:g,onTouchMoveCapture:v}),document.addEventListener("wheel",f,is),document.addEventListener("touchmove",f,is),document.addEventListener("touchstart",m,is),function(){as=as.filter(function(k){return k!==o}),document.removeEventListener("wheel",f,is),document.removeEventListener("touchmove",f,is),document.removeEventListener("touchstart",m,is)}},[]);var b=e.removeScrollBar,j=e.inert;return y.createElement(y.Fragment,null,j?y.createElement(o,{styles:gT(a)}):null,b?y.createElement(sT,{noRelative:e.noRelative,gapMode:e.gapMode}):null)}function xT(e){for(var t=null;e!==null;)e instanceof ShadowRoot&&(t=e.host,e=e.host),e=e.parentNode;return t}const bT=qI(WN,yT);var QN=y.forwardRef(function(e,t){return y.createElement(mh,$n({},e,{ref:t,sideCar:bT}))});QN.classNames=mh.classNames;var wT=function(e){if(typeof document>"u")return null;var t=Array.isArray(e)?e[0]:e;return t.ownerDocument.body},os=new WeakMap,Od=new WeakMap,_d={},sg=0,YN=function(e){return e&&(e.host||YN(e.parentNode))},kT=function(e,t){return t.map(function(r){if(e.contains(r))return r;var n=YN(r);return n&&e.contains(n)?n:(console.error("aria-hidden",r,"in not contained inside",e,". Doing nothing"),null)}).filter(function(r){return!!r})},jT=function(e,t,r,n){var a=kT(t,Array.isArray(e)?e:[e]);_d[r]||(_d[r]=new WeakMap);var o=_d[r],c=[],u=new Set,f=new Set(a),h=function(g){!g||u.has(g)||(u.add(g),h(g.parentNode))};a.forEach(h);var m=function(g){!g||f.has(g)||Array.prototype.forEach.call(g.children,function(v){if(u.has(v))m(v);else try{var b=v.getAttribute(n),j=b!==null&&b!=="false",k=(os.get(v)||0)+1,S=(o.get(v)||0)+1;os.set(v,k),o.set(v,S),c.push(v),k===1&&j&&Od.set(v,!0),S===1&&v.setAttribute(r,"true"),j||v.setAttribute(n,"true")}catch(N){console.error("aria-hidden: cannot operate on ",v,N)}})};return m(t),u.clear(),sg++,function(){c.forEach(function(g){var v=os.get(g)-1,b=o.get(g)-1;os.set(g,v),o.set(g,b),v||(Od.has(g)||g.removeAttribute(n),Od.delete(g)),b||g.removeAttribute(r)}),sg--,sg||(os=new WeakMap,os=new WeakMap,Od=new WeakMap,_d={})}},ST=function(e,t,r){r===void 0&&(r="data-aria-hidden");var n=Array.from(Array.isArray(e)?e:[e]),a=wT(e);return a?(n.push.apply(n,Array.from(a.querySelectorAll("[aria-live], script"))),jT(n,a,r,"aria-hidden")):function(){return null}},ph="Dialog",[XN]=Z4(ph),[NT,Sn]=XN(ph),ZN=e=>{const{__scopeDialog:t,children:r,open:n,defaultOpen:a,onOpenChange:o,modal:c=!0}=e,u=y.useRef(null),f=y.useRef(null),[h,m]=nI({prop:n,defaultProp:a??!1,onChange:o,caller:ph});return l.jsx(NT,{scope:t,triggerRef:u,contentRef:f,contentId:vi(),titleId:vi(),descriptionId:vi(),open:h,onOpenChange:m,onOpenToggle:y.useCallback(()=>m(g=>!g),[m]),modal:c,children:r})};ZN.displayName=ph;var JN="DialogTrigger",ET=y.forwardRef((e,t)=>{const{__scopeDialog:r,...n}=e,a=Sn(JN,r),o=Co(t,a.triggerRef);return l.jsx(Xt.button,{type:"button","aria-haspopup":"dialog","aria-expanded":a.open,"aria-controls":a.open?a.contentId:void 0,"data-state":Ny(a.open),...n,ref:o,onClick:ba(e.onClick,a.onOpenToggle)})});ET.displayName=JN;var Sy="DialogPortal",[AT,eE]=XN(Sy,{forceMount:void 0}),tE=e=>{const{__scopeDialog:t,forceMount:r,children:n,container:a}=e,o=Sn(Sy,t);return l.jsx(AT,{scope:t,forceMount:r,children:y.Children.map(n,c=>l.jsx(hh,{present:r||o.open,children:l.jsx(BN,{asChild:!0,container:a,children:c})}))})};tE.displayName=Sy;var hf="DialogOverlay",rE=y.forwardRef((e,t)=>{const r=eE(hf,e.__scopeDialog),{forceMount:n=r.forceMount,...a}=e,o=Sn(hf,e.__scopeDialog);return o.modal?l.jsx(hh,{present:n||o.open,children:l.jsx(PT,{...a,ref:t})}):null});rE.displayName=hf;var CT=RN("DialogOverlay.RemoveScroll"),PT=y.forwardRef((e,t)=>{const{__scopeDialog:r,...n}=e,a=Sn(hf,r),o=jI(),c=Co(t,o);return l.jsx(QN,{as:CT,allowPinchZoom:!0,shards:[a.contentRef],children:l.jsx(Xt.div,{"data-state":Ny(a.open),...n,ref:c,style:{pointerEvents:"auto",...n.style}})})}),Ws="DialogContent",nE=y.forwardRef((e,t)=>{const r=eE(Ws,e.__scopeDialog),{forceMount:n=r.forceMount,...a}=e,o=Sn(Ws,e.__scopeDialog);return l.jsx(hh,{present:n||o.open,children:o.modal?l.jsx(OT,{...a,ref:t}):l.jsx(_T,{...a,ref:t})})});nE.displayName=Ws;var OT=y.forwardRef((e,t)=>{const r=Sn(Ws,e.__scopeDialog),n=y.useRef(null),a=Co(t,r.contentRef,n);return y.useEffect(()=>{const o=n.current;if(o)return ST(o)},[]),l.jsx(iE,{...e,ref:a,trapFocus:r.open,disableOutsidePointerEvents:r.open,onCloseAutoFocus:ba(e.onCloseAutoFocus,o=>{var c;o.preventDefault(),(c=r.triggerRef.current)==null||c.focus()}),onPointerDownOutside:ba(e.onPointerDownOutside,o=>{const c=o.detail.originalEvent,u=c.button===0&&c.ctrlKey===!0;(c.button===2||u)&&o.preventDefault()}),onFocusOutside:ba(e.onFocusOutside,o=>o.preventDefault())})}),_T=y.forwardRef((e,t)=>{const r=Sn(Ws,e.__scopeDialog),n=y.useRef(!1),a=y.useRef(!1);return l.jsx(iE,{...e,ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:o=>{var c,u;(c=e.onCloseAutoFocus)==null||c.call(e,o),o.defaultPrevented||(n.current||(u=r.triggerRef.current)==null||u.focus(),o.preventDefault()),n.current=!1,a.current=!1},onInteractOutside:o=>{var f,h;(f=e.onInteractOutside)==null||f.call(e,o),o.defaultPrevented||(n.current=!0,o.detail.originalEvent.type==="pointerdown"&&(a.current=!0));const c=o.target;((h=r.triggerRef.current)==null?void 0:h.contains(c))&&o.preventDefault(),o.detail.originalEvent.type==="focusin"&&a.current&&o.preventDefault()}})}),iE=y.forwardRef((e,t)=>{const{__scopeDialog:r,trapFocus:n,onOpenAutoFocus:a,onCloseAutoFocus:o,...c}=e,u=Sn(Ws,r);return $I(),l.jsx(l.Fragment,{children:l.jsx(zN,{asChild:!0,loop:!0,trapped:n,onMountAutoFocus:a,onUnmountAutoFocus:o,children:l.jsx(LN,{role:"dialog",id:u.contentId,"aria-describedby":u.descriptionId,"aria-labelledby":u.titleId,"data-state":Ny(u.open),...c,ref:t,deferPointerDownOutside:!0,onDismiss:()=>u.onOpenChange(!1)})})})}),aE="DialogTitle",MT=y.forwardRef((e,t)=>{const{__scopeDialog:r,...n}=e,a=Sn(aE,r);return l.jsx(Xt.h2,{id:a.titleId,...n,ref:t})});MT.displayName=aE;var oE="DialogDescription",IT=y.forwardRef((e,t)=>{const{__scopeDialog:r,...n}=e,a=Sn(oE,r);return l.jsx(Xt.p,{id:a.descriptionId,...n,ref:t})});IT.displayName=oE;var sE="DialogClose",TT=y.forwardRef((e,t)=>{const{__scopeDialog:r,...n}=e,a=Sn(sE,r);return l.jsx(Xt.button,{type:"button",...n,ref:t,onClick:ba(e.onClick,()=>a.onOpenChange(!1))})});TT.displayName=sE;function Ny(e){return e?"open":"closed"}var Zl='[cmdk-group=""]',lg='[cmdk-group-items=""]',DT='[cmdk-group-heading=""]',lE='[cmdk-item=""]',Tw=`${lE}:not([aria-disabled="true"])`,mv="cmdk-item-select",ps="data-value",RT=(e,t,r)=>X4(e,t,r),uE=y.createContext(void 0),Yu=()=>y.useContext(uE),cE=y.createContext(void 0),Ey=()=>y.useContext(cE),dE=y.createContext(void 0),fE=y.forwardRef((e,t)=>{let r=gs(()=>{var M,K;return{search:"",value:(K=(M=e.value)!=null?M:e.defaultValue)!=null?K:"",selectedItemId:void 0,filtered:{count:0,items:new Map,groups:new Set}}}),n=gs(()=>new Set),a=gs(()=>new Map),o=gs(()=>new Map),c=gs(()=>new Set),u=hE(e),{label:f,children:h,value:m,onValueChange:g,filter:v,shouldFilter:b,loop:j,disablePointerSelection:k=!1,vimBindings:S=!0,...N}=e,E=vi(),A=vi(),P=vi(),_=y.useRef(null),O=VT();yo(()=>{if(m!==void 0){let M=m.trim();r.current.value=M,D.emit()}},[m]),yo(()=>{O(6,pe)},[]);let D=y.useMemo(()=>({subscribe:M=>(c.current.add(M),()=>c.current.delete(M)),snapshot:()=>r.current,setState:(M,K,ne)=>{var Z,me,ge,Pe;if(!Object.is(r.current[M],K)){if(r.current[M]=K,M==="search")H(),F(),O(1,Y);else if(M==="value"){if(document.activeElement.hasAttribute("cmdk-input")||document.activeElement.hasAttribute("cmdk-root")){let re=document.getElementById(P);re?re.focus():(Z=document.getElementById(E))==null||Z.focus()}if(O(7,()=>{var re;r.current.selectedItemId=(re=ue())==null?void 0:re.id,D.emit()}),ne||O(5,pe),((me=u.current)==null?void 0:me.value)!==void 0){let re=K??"";(Pe=(ge=u.current).onValueChange)==null||Pe.call(ge,re);return}}D.emit()}},emit:()=>{c.current.forEach(M=>M())}}),[]),U=y.useMemo(()=>({value:(M,K,ne)=>{var Z;K!==((Z=o.current.get(M))==null?void 0:Z.value)&&(o.current.set(M,{value:K,keywords:ne}),r.current.filtered.items.set(M,B(K,ne)),O(2,()=>{F(),D.emit()}))},item:(M,K)=>(n.current.add(M),K&&(a.current.has(K)?a.current.get(K).add(M):a.current.set(K,new Set([M]))),O(3,()=>{H(),F(),r.current.value||Y(),D.emit()}),()=>{o.current.delete(M),n.current.delete(M),r.current.filtered.items.delete(M);let ne=ue();O(4,()=>{H(),(ne==null?void 0:ne.getAttribute("id"))===M&&Y(),D.emit()})}),group:M=>(a.current.has(M)||a.current.set(M,new Set),()=>{o.current.delete(M),a.current.delete(M)}),filter:()=>u.current.shouldFilter,label:f||e["aria-label"],getDisablePointerSelection:()=>u.current.disablePointerSelection,listId:E,inputId:P,labelId:A,listInnerRef:_}),[]);function B(M,K){var ne,Z;let me=(Z=(ne=u.current)==null?void 0:ne.filter)!=null?Z:RT;return M?me(M,r.current.search,K):0}function F(){if(!r.current.search||u.current.shouldFilter===!1)return;let M=r.current.filtered.items,K=[];r.current.filtered.groups.forEach(Z=>{let me=a.current.get(Z),ge=0;me.forEach(Pe=>{let re=M.get(Pe);ge=Math.max(re,ge)}),K.push([Z,ge])});let ne=_.current;he().sort((Z,me)=>{var ge,Pe;let re=Z.getAttribute("id"),xe=me.getAttribute("id");return((ge=M.get(xe))!=null?ge:0)-((Pe=M.get(re))!=null?Pe:0)}).forEach(Z=>{let me=Z.closest(lg);me?me.appendChild(Z.parentElement===me?Z:Z.closest(`${lg} > *`)):ne.appendChild(Z.parentElement===ne?Z:Z.closest(`${lg} > *`))}),K.sort((Z,me)=>me[1]-Z[1]).forEach(Z=>{var me;let ge=(me=_.current)==null?void 0:me.querySelector(`${Zl}[${ps}="${encodeURIComponent(Z[0])}"]`);ge==null||ge.parentElement.appendChild(ge)})}function Y(){let M=he().find(ne=>ne.getAttribute("aria-disabled")!=="true"),K=M==null?void 0:M.getAttribute(ps);D.setState("value",K||void 0)}function H(){var M,K,ne,Z;if(!r.current.search||u.current.shouldFilter===!1){r.current.filtered.count=n.current.size;return}r.current.filtered.groups=new Set;let me=0;for(let ge of n.current){let Pe=(K=(M=o.current.get(ge))==null?void 0:M.value)!=null?K:"",re=(Z=(ne=o.current.get(ge))==null?void 0:ne.keywords)!=null?Z:[],xe=B(Pe,re);r.current.filtered.items.set(ge,xe),xe>0&&me++}for(let[ge,Pe]of a.current)for(let re of Pe)if(r.current.filtered.items.get(re)>0){r.current.filtered.groups.add(ge);break}r.current.filtered.count=me}function pe(){var M,K,ne;let Z=ue();Z&&(((M=Z.parentElement)==null?void 0:M.firstChild)===Z&&((ne=(K=Z.closest(Zl))==null?void 0:K.querySelector(DT))==null||ne.scrollIntoView({block:"nearest"})),Z.scrollIntoView({block:"nearest"}))}function ue(){var M;return(M=_.current)==null?void 0:M.querySelector(`${lE}[aria-selected="true"]`)}function he(){var M;return Array.from(((M=_.current)==null?void 0:M.querySelectorAll(Tw))||[])}function ae(M){let K=he()[M];K&&D.setState("value",K.getAttribute(ps))}function se(M){var K;let ne=ue(),Z=he(),me=Z.findIndex(Pe=>Pe===ne),ge=Z[me+M];(K=u.current)!=null&&K.loop&&(ge=me+M<0?Z[Z.length-1]:me+M===Z.length?Z[0]:Z[me+M]),ge&&D.setState("value",ge.getAttribute(ps))}function X(M){let K=ue(),ne=K==null?void 0:K.closest(Zl),Z;for(;ne&&!Z;)ne=M>0?KT(ne,Zl):GT(ne,Zl),Z=ne==null?void 0:ne.querySelector(Tw);Z?D.setState("value",Z.getAttribute(ps)):se(M)}let te=()=>ae(he().length-1),J=M=>{M.preventDefault(),M.metaKey?te():M.altKey?X(1):se(1)},I=M=>{M.preventDefault(),M.metaKey?ae(0):M.altKey?X(-1):se(-1)};return y.createElement(Xt.div,{ref:t,tabIndex:-1,...N,"cmdk-root":"",onKeyDown:M=>{var K;(K=N.onKeyDown)==null||K.call(N,M);let ne=M.nativeEvent.isComposing||M.keyCode===229;if(!(M.defaultPrevented||ne))switch(M.key){case"n":case"j":{S&&M.ctrlKey&&J(M);break}case"ArrowDown":{J(M);break}case"p":case"k":{S&&M.ctrlKey&&I(M);break}case"ArrowUp":{I(M);break}case"Home":{M.preventDefault(),ae(0);break}case"End":{M.preventDefault(),te();break}case"Enter":{M.preventDefault();let Z=ue();if(Z){let me=new Event(mv);Z.dispatchEvent(me)}}}}},y.createElement("label",{"cmdk-label":"",htmlFor:U.inputId,id:U.labelId,style:QT},f),gh(e,M=>y.createElement(cE.Provider,{value:D},y.createElement(uE.Provider,{value:U},M))))}),LT=y.forwardRef((e,t)=>{var r,n;let a=vi(),o=y.useRef(null),c=y.useContext(dE),u=Yu(),f=hE(e),h=(n=(r=f.current)==null?void 0:r.forceMount)!=null?n:c==null?void 0:c.forceMount;yo(()=>{if(!h)return u.item(a,c==null?void 0:c.id)},[h]);let m=mE(a,o,[e.value,e.children,o],e.keywords),g=Ey(),v=ja(O=>O.value&&O.value===m.current),b=ja(O=>h||u.filter()===!1?!0:O.search?O.filtered.items.get(a)>0:!0);y.useEffect(()=>{let O=o.current;if(!(!O||e.disabled))return O.addEventListener(mv,j),()=>O.removeEventListener(mv,j)},[b,e.onSelect,e.disabled]);function j(){var O,D;k(),(D=(O=f.current).onSelect)==null||D.call(O,m.current)}function k(){g.setState("value",m.current,!0)}if(!b)return null;let{disabled:S,value:N,onSelect:E,forceMount:A,keywords:P,..._}=e;return y.createElement(Xt.div,{ref:Hs(o,t),..._,id:a,"cmdk-item":"",role:"option","aria-disabled":!!S,"aria-selected":!!v,"data-disabled":!!S,"data-selected":!!v,onPointerMove:S||u.getDisablePointerSelection()?void 0:k,onClick:S?void 0:j},e.children)}),$T=y.forwardRef((e,t)=>{let{heading:r,children:n,forceMount:a,...o}=e,c=vi(),u=y.useRef(null),f=y.useRef(null),h=vi(),m=Yu(),g=ja(b=>a||m.filter()===!1?!0:b.search?b.filtered.groups.has(c):!0);yo(()=>m.group(c),[]),mE(c,u,[e.value,e.heading,f]);let v=y.useMemo(()=>({id:c,forceMount:a}),[a]);return y.createElement(Xt.div,{ref:Hs(u,t),...o,"cmdk-group":"",role:"presentation",hidden:g?void 0:!0},r&&y.createElement("div",{ref:f,"cmdk-group-heading":"","aria-hidden":!0,id:h},r),gh(e,b=>y.createElement("div",{"cmdk-group-items":"",role:"group","aria-labelledby":r?h:void 0},y.createElement(dE.Provider,{value:v},b))))}),zT=y.forwardRef((e,t)=>{let{alwaysRender:r,...n}=e,a=y.useRef(null),o=ja(c=>!c.search);return!r&&!o?null:y.createElement(Xt.div,{ref:Hs(a,t),...n,"cmdk-separator":"",role:"separator"})}),FT=y.forwardRef((e,t)=>{let{onValueChange:r,...n}=e,a=e.value!=null,o=Ey(),c=ja(h=>h.search),u=ja(h=>h.selectedItemId),f=Yu();return y.useEffect(()=>{e.value!=null&&o.setState("search",e.value)},[e.value]),y.createElement(Xt.input,{ref:t,...n,"cmdk-input":"",autoComplete:"off",autoCorrect:"off",spellCheck:!1,"aria-autocomplete":"list",role:"combobox","aria-expanded":!0,"aria-controls":f.listId,"aria-labelledby":f.labelId,"aria-activedescendant":u,id:f.inputId,type:"text",value:a?e.value:c,onChange:h=>{a||o.setState("search",h.target.value),r==null||r(h.target.value)}})}),BT=y.forwardRef((e,t)=>{let{children:r,label:n="Suggestions",...a}=e,o=y.useRef(null),c=y.useRef(null),u=ja(h=>h.selectedItemId),f=Yu();return y.useEffect(()=>{if(c.current&&o.current){let h=c.current,m=o.current,g,v=new ResizeObserver(()=>{g=requestAnimationFrame(()=>{let b=h.offsetHeight;m.style.setProperty("--cmdk-list-height",b.toFixed(1)+"px")})});return v.observe(h),()=>{cancelAnimationFrame(g),v.unobserve(h)}}},[]),y.createElement(Xt.div,{ref:Hs(o,t),...a,"cmdk-list":"",role:"listbox",tabIndex:-1,"aria-activedescendant":u,"aria-label":n,id:f.listId},gh(e,h=>y.createElement("div",{ref:Hs(c,f.listInnerRef),"cmdk-list-sizer":""},h)))}),UT=y.forwardRef((e,t)=>{let{open:r,onOpenChange:n,overlayClassName:a,contentClassName:o,container:c,...u}=e;return y.createElement(ZN,{open:r,onOpenChange:n},y.createElement(tE,{container:c},y.createElement(rE,{"cmdk-overlay":"",className:a}),y.createElement(nE,{"aria-label":e.label,"cmdk-dialog":"",className:o},y.createElement(fE,{ref:t,...u}))))}),HT=y.forwardRef((e,t)=>ja(r=>r.filtered.count===0)?y.createElement(Xt.div,{ref:t,...e,"cmdk-empty":"",role:"presentation"}):null),WT=y.forwardRef((e,t)=>{let{progress:r,children:n,label:a="Loading...",...o}=e;return y.createElement(Xt.div,{ref:t,...o,"cmdk-loading":"",role:"progressbar","aria-valuenow":r,"aria-valuemin":0,"aria-valuemax":100,"aria-label":a},gh(e,c=>y.createElement("div",{"aria-hidden":!0},c)))}),ss=Object.assign(fE,{List:BT,Item:LT,Input:FT,Group:$T,Separator:zT,Dialog:UT,Empty:HT,Loading:WT});function KT(e,t){let r=e.nextElementSibling;for(;r;){if(r.matches(t))return r;r=r.nextElementSibling}}function GT(e,t){let r=e.previousElementSibling;for(;r;){if(r.matches(t))return r;r=r.previousElementSibling}}function hE(e){let t=y.useRef(e);return yo(()=>{t.current=e}),t}var yo=typeof window>"u"?y.useEffect:y.useLayoutEffect;function gs(e){let t=y.useRef();return t.current===void 0&&(t.current=e()),t}function ja(e){let t=Ey(),r=()=>e(t.snapshot());return y.useSyncExternalStore(t.subscribe,r,r)}function mE(e,t,r,n=[]){let a=y.useRef(),o=Yu();return yo(()=>{var c;let u=(()=>{var h;for(let m of r){if(typeof m=="string")return m.trim();if(typeof m=="object"&&"current"in m)return m.current?(h=m.current.textContent)==null?void 0:h.trim():a.current}})(),f=n.map(h=>h.trim());o.value(e,u,f),(c=t.current)==null||c.setAttribute(ps,u),a.current=u}),a}var VT=()=>{let[e,t]=y.useState(),r=gs(()=>new Map);return yo(()=>{r.current.forEach(n=>n()),r.current=new Map},[e]),(n,a)=>{r.current.set(n,a),t({})}};function qT(e){let t=e.type;return typeof t=="function"?t(e.props):"render"in t?t.render(e.props):e}function gh({asChild:e,children:t},r){return e&&y.isValidElement(t)?y.cloneElement(qT(t),{ref:t.ref},r(t.props.children)):r(t)}var QT={position:"absolute",width:"1px",height:"1px",padding:"0",margin:"-1px",overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0"};function YT({onNavigate:e}){const[t,r]=y.useState(!1);return y.useEffect(()=>{const n=a=>{(a.metaKey||a.ctrlKey)&&a.key.toLowerCase()==="k"&&(a.preventDefault(),r(o=>!o))};return document.addEventListener("keydown",n),()=>document.removeEventListener("keydown",n)},[]),l.jsx(ss.Dialog,{open:t,onOpenChange:r,label:"Befehlspalette",className:"fixed inset-0 z-50 flex items-start justify-center bg-black/50 p-4 pt-[12vh] overscroll-contain",onClick:()=>r(!1),children:l.jsxs("div",{className:"w-full max-w-lg overflow-hidden rounded-xl border border-border bg-popover text-popover-foreground shadow-2xl",onClick:n=>n.stopPropagation(),children:[l.jsx(ss.Input,{autoFocus:!0,placeholder:"Springe zu… (Modelle, Routing, System …)",className:"w-full border-b border-border bg-transparent px-4 py-3 text-sm outline-none placeholder:text-muted-foreground"}),l.jsxs(ss.List,{className:"max-h-80 overflow-y-auto p-2",children:[l.jsx(ss.Empty,{className:"px-3 py-6 text-center text-sm text-muted-foreground",children:"Nichts gefunden."}),l.jsx(ss.Group,{heading:"Bereiche",className:"px-1 py-1 text-xs text-muted-foreground",children:mu.map(n=>l.jsxs(ss.Item,{value:`${n.label} ${n.hint}`,onSelect:()=>{e(n.id),r(!1)},className:"flex cursor-pointer items-center gap-3 rounded-md px-3 py-2 text-sm text-foreground aria-selected:bg-accent aria-selected:text-accent-foreground",children:[l.jsx(n.icon,{className:"h-4 w-4 text-primary"}),l.jsx("span",{children:n.label}),l.jsx("span",{className:"ml-auto truncate text-xs text-muted-foreground",children:n.hint})]},n.id))})]})]})})}const pE="mc_expert_mode",pv="mc-expert-mode-change",XT=()=>{try{return localStorage.getItem(pE)==="true"}catch{return!1}};function ZT(e){return window.addEventListener(pv,e),window.addEventListener("storage",e),()=>{window.removeEventListener(pv,e),window.removeEventListener("storage",e)}}function Dw(e){localStorage.setItem(pE,String(e)),window.dispatchEvent(new Event(pv))}function gE(){return y.useSyncExternalStore(ZT,XT,()=>!1)}function vE(e){var t,r,n="";if(typeof e=="string"||typeof e=="number")n+=e;else if(typeof e=="object")if(Array.isArray(e)){var a=e.length;for(t=0;t{const t=tD(e),{conflictingClassGroups:r,conflictingClassGroupModifiers:n}=e;return{getClassGroupId:c=>{const u=c.split(Ay);return u[0]===""&&u.length!==1&&u.shift(),yE(u,t)||eD(c)},getConflictingClassGroupIds:(c,u)=>{const f=r[c]||[];return u&&n[c]?[...f,...n[c]]:f}}},yE=(e,t)=>{var c;if(e.length===0)return t.classGroupId;const r=e[0],n=t.nextPart.get(r),a=n?yE(e.slice(1),n):void 0;if(a)return a;if(t.validators.length===0)return;const o=e.join(Ay);return(c=t.validators.find(({validator:u})=>u(o)))==null?void 0:c.classGroupId},Rw=/^\[(.+)\]$/,eD=e=>{if(Rw.test(e)){const t=Rw.exec(e)[1],r=t==null?void 0:t.substring(0,t.indexOf(":"));if(r)return"arbitrary.."+r}},tD=e=>{const{theme:t,prefix:r}=e,n={nextPart:new Map,validators:[]};return nD(Object.entries(e.classGroups),r).forEach(([o,c])=>{gv(c,n,o,t)}),n},gv=(e,t,r,n)=>{e.forEach(a=>{if(typeof a=="string"){const o=a===""?t:Lw(t,a);o.classGroupId=r;return}if(typeof a=="function"){if(rD(a)){gv(a(n),t,r,n);return}t.validators.push({validator:a,classGroupId:r});return}Object.entries(a).forEach(([o,c])=>{gv(c,Lw(t,o),r,n)})})},Lw=(e,t)=>{let r=e;return t.split(Ay).forEach(n=>{r.nextPart.has(n)||r.nextPart.set(n,{nextPart:new Map,validators:[]}),r=r.nextPart.get(n)}),r},rD=e=>e.isThemeGetter,nD=(e,t)=>t?e.map(([r,n])=>{const a=n.map(o=>typeof o=="string"?t+o:typeof o=="object"?Object.fromEntries(Object.entries(o).map(([c,u])=>[t+c,u])):o);return[r,a]}):e,iD=e=>{if(e<1)return{get:()=>{},set:()=>{}};let t=0,r=new Map,n=new Map;const a=(o,c)=>{r.set(o,c),t++,t>e&&(t=0,n=r,r=new Map)};return{get(o){let c=r.get(o);if(c!==void 0)return c;if((c=n.get(o))!==void 0)return a(o,c),c},set(o,c){r.has(o)?r.set(o,c):a(o,c)}}},xE="!",aD=e=>{const{separator:t,experimentalParseClassName:r}=e,n=t.length===1,a=t[0],o=t.length,c=u=>{const f=[];let h=0,m=0,g;for(let S=0;Sm?g-m:void 0;return{modifiers:f,hasImportantModifier:b,baseClassName:j,maybePostfixModifierPosition:k}};return r?u=>r({className:u,parseClassName:c}):c},oD=e=>{if(e.length<=1)return e;const t=[];let r=[];return e.forEach(n=>{n[0]==="["?(t.push(...r.sort(),n),r=[]):r.push(n)}),t.push(...r.sort()),t},sD=e=>({cache:iD(e.cacheSize),parseClassName:aD(e),...JT(e)}),lD=/\s+/,uD=(e,t)=>{const{parseClassName:r,getClassGroupId:n,getConflictingClassGroupIds:a}=t,o=[],c=e.trim().split(lD);let u="";for(let f=c.length-1;f>=0;f-=1){const h=c[f],{modifiers:m,hasImportantModifier:g,baseClassName:v,maybePostfixModifierPosition:b}=r(h);let j=!!b,k=n(j?v.substring(0,b):v);if(!k){if(!j){u=h+(u.length>0?" "+u:u);continue}if(k=n(v),!k){u=h+(u.length>0?" "+u:u);continue}j=!1}const S=oD(m).join(":"),N=g?S+xE:S,E=N+k;if(o.includes(E))continue;o.push(E);const A=a(k,j);for(let P=0;P0?" "+u:u)}return u};function cD(){let e=0,t,r,n="";for(;e{if(typeof e=="string")return e;let t,r="";for(let n=0;ng(m),e());return r=sD(h),n=r.cache.get,a=r.cache.set,o=u,u(f)}function u(f){const h=n(f);if(h)return h;const m=uD(f,r);return a(f,m),m}return function(){return o(cD.apply(null,arguments))}}const ot=e=>{const t=r=>r[e]||[];return t.isThemeGetter=!0,t},wE=/^\[(?:([a-z-]+):)?(.+)\]$/i,fD=/^\d+\/\d+$/,hD=new Set(["px","full","screen"]),mD=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,pD=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,gD=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,vD=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,yD=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,li=e=>js(e)||hD.has(e)||fD.test(e),ea=e=>tl(e,"length",ED),js=e=>!!e&&!Number.isNaN(Number(e)),ug=e=>tl(e,"number",js),Jl=e=>!!e&&Number.isInteger(Number(e)),xD=e=>e.endsWith("%")&&js(e.slice(0,-1)),$e=e=>wE.test(e),ta=e=>mD.test(e),bD=new Set(["length","size","percentage"]),wD=e=>tl(e,bD,kE),kD=e=>tl(e,"position",kE),jD=new Set(["image","url"]),SD=e=>tl(e,jD,CD),ND=e=>tl(e,"",AD),eu=()=>!0,tl=(e,t,r)=>{const n=wE.exec(e);return n?n[1]?typeof t=="string"?n[1]===t:t.has(n[1]):r(n[2]):!1},ED=e=>pD.test(e)&&!gD.test(e),kE=()=>!1,AD=e=>vD.test(e),CD=e=>yD.test(e),PD=()=>{const e=ot("colors"),t=ot("spacing"),r=ot("blur"),n=ot("brightness"),a=ot("borderColor"),o=ot("borderRadius"),c=ot("borderSpacing"),u=ot("borderWidth"),f=ot("contrast"),h=ot("grayscale"),m=ot("hueRotate"),g=ot("invert"),v=ot("gap"),b=ot("gradientColorStops"),j=ot("gradientColorStopPositions"),k=ot("inset"),S=ot("margin"),N=ot("opacity"),E=ot("padding"),A=ot("saturate"),P=ot("scale"),_=ot("sepia"),O=ot("skew"),D=ot("space"),U=ot("translate"),B=()=>["auto","contain","none"],F=()=>["auto","hidden","clip","visible","scroll"],Y=()=>["auto",$e,t],H=()=>[$e,t],pe=()=>["",li,ea],ue=()=>["auto",js,$e],he=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],ae=()=>["solid","dashed","dotted","double","none"],se=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],X=()=>["start","end","center","between","around","evenly","stretch"],te=()=>["","0",$e],J=()=>["auto","avoid","all","avoid-page","page","left","right","column"],I=()=>[js,$e];return{cacheSize:500,separator:":",theme:{colors:[eu],spacing:[li,ea],blur:["none","",ta,$e],brightness:I(),borderColor:[e],borderRadius:["none","","full",ta,$e],borderSpacing:H(),borderWidth:pe(),contrast:I(),grayscale:te(),hueRotate:I(),invert:te(),gap:H(),gradientColorStops:[e],gradientColorStopPositions:[xD,ea],inset:Y(),margin:Y(),opacity:I(),padding:H(),saturate:I(),scale:I(),sepia:te(),skew:I(),space:H(),translate:H()},classGroups:{aspect:[{aspect:["auto","square","video",$e]}],container:["container"],columns:[{columns:[ta]}],"break-after":[{"break-after":J()}],"break-before":[{"break-before":J()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...he(),$e]}],overflow:[{overflow:F()}],"overflow-x":[{"overflow-x":F()}],"overflow-y":[{"overflow-y":F()}],overscroll:[{overscroll:B()}],"overscroll-x":[{"overscroll-x":B()}],"overscroll-y":[{"overscroll-y":B()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[k]}],"inset-x":[{"inset-x":[k]}],"inset-y":[{"inset-y":[k]}],start:[{start:[k]}],end:[{end:[k]}],top:[{top:[k]}],right:[{right:[k]}],bottom:[{bottom:[k]}],left:[{left:[k]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",Jl,$e]}],basis:[{basis:Y()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",$e]}],grow:[{grow:te()}],shrink:[{shrink:te()}],order:[{order:["first","last","none",Jl,$e]}],"grid-cols":[{"grid-cols":[eu]}],"col-start-end":[{col:["auto",{span:["full",Jl,$e]},$e]}],"col-start":[{"col-start":ue()}],"col-end":[{"col-end":ue()}],"grid-rows":[{"grid-rows":[eu]}],"row-start-end":[{row:["auto",{span:[Jl,$e]},$e]}],"row-start":[{"row-start":ue()}],"row-end":[{"row-end":ue()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",$e]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",$e]}],gap:[{gap:[v]}],"gap-x":[{"gap-x":[v]}],"gap-y":[{"gap-y":[v]}],"justify-content":[{justify:["normal",...X()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...X(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...X(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[E]}],px:[{px:[E]}],py:[{py:[E]}],ps:[{ps:[E]}],pe:[{pe:[E]}],pt:[{pt:[E]}],pr:[{pr:[E]}],pb:[{pb:[E]}],pl:[{pl:[E]}],m:[{m:[S]}],mx:[{mx:[S]}],my:[{my:[S]}],ms:[{ms:[S]}],me:[{me:[S]}],mt:[{mt:[S]}],mr:[{mr:[S]}],mb:[{mb:[S]}],ml:[{ml:[S]}],"space-x":[{"space-x":[D]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[D]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",$e,t]}],"min-w":[{"min-w":[$e,t,"min","max","fit"]}],"max-w":[{"max-w":[$e,t,"none","full","min","max","fit","prose",{screen:[ta]},ta]}],h:[{h:[$e,t,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[$e,t,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[$e,t,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[$e,t,"auto","min","max","fit"]}],"font-size":[{text:["base",ta,ea]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",ug]}],"font-family":[{font:[eu]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",$e]}],"line-clamp":[{"line-clamp":["none",js,ug]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",li,$e]}],"list-image":[{"list-image":["none",$e]}],"list-style-type":[{list:["none","disc","decimal",$e]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[e]}],"placeholder-opacity":[{"placeholder-opacity":[N]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[e]}],"text-opacity":[{"text-opacity":[N]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...ae(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",li,ea]}],"underline-offset":[{"underline-offset":["auto",li,$e]}],"text-decoration-color":[{decoration:[e]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:H()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",$e]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",$e]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[N]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...he(),kD]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",wD]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},SD]}],"bg-color":[{bg:[e]}],"gradient-from-pos":[{from:[j]}],"gradient-via-pos":[{via:[j]}],"gradient-to-pos":[{to:[j]}],"gradient-from":[{from:[b]}],"gradient-via":[{via:[b]}],"gradient-to":[{to:[b]}],rounded:[{rounded:[o]}],"rounded-s":[{"rounded-s":[o]}],"rounded-e":[{"rounded-e":[o]}],"rounded-t":[{"rounded-t":[o]}],"rounded-r":[{"rounded-r":[o]}],"rounded-b":[{"rounded-b":[o]}],"rounded-l":[{"rounded-l":[o]}],"rounded-ss":[{"rounded-ss":[o]}],"rounded-se":[{"rounded-se":[o]}],"rounded-ee":[{"rounded-ee":[o]}],"rounded-es":[{"rounded-es":[o]}],"rounded-tl":[{"rounded-tl":[o]}],"rounded-tr":[{"rounded-tr":[o]}],"rounded-br":[{"rounded-br":[o]}],"rounded-bl":[{"rounded-bl":[o]}],"border-w":[{border:[u]}],"border-w-x":[{"border-x":[u]}],"border-w-y":[{"border-y":[u]}],"border-w-s":[{"border-s":[u]}],"border-w-e":[{"border-e":[u]}],"border-w-t":[{"border-t":[u]}],"border-w-r":[{"border-r":[u]}],"border-w-b":[{"border-b":[u]}],"border-w-l":[{"border-l":[u]}],"border-opacity":[{"border-opacity":[N]}],"border-style":[{border:[...ae(),"hidden"]}],"divide-x":[{"divide-x":[u]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[u]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[N]}],"divide-style":[{divide:ae()}],"border-color":[{border:[a]}],"border-color-x":[{"border-x":[a]}],"border-color-y":[{"border-y":[a]}],"border-color-s":[{"border-s":[a]}],"border-color-e":[{"border-e":[a]}],"border-color-t":[{"border-t":[a]}],"border-color-r":[{"border-r":[a]}],"border-color-b":[{"border-b":[a]}],"border-color-l":[{"border-l":[a]}],"divide-color":[{divide:[a]}],"outline-style":[{outline:["",...ae()]}],"outline-offset":[{"outline-offset":[li,$e]}],"outline-w":[{outline:[li,ea]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:pe()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[e]}],"ring-opacity":[{"ring-opacity":[N]}],"ring-offset-w":[{"ring-offset":[li,ea]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",ta,ND]}],"shadow-color":[{shadow:[eu]}],opacity:[{opacity:[N]}],"mix-blend":[{"mix-blend":[...se(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":se()}],filter:[{filter:["","none"]}],blur:[{blur:[r]}],brightness:[{brightness:[n]}],contrast:[{contrast:[f]}],"drop-shadow":[{"drop-shadow":["","none",ta,$e]}],grayscale:[{grayscale:[h]}],"hue-rotate":[{"hue-rotate":[m]}],invert:[{invert:[g]}],saturate:[{saturate:[A]}],sepia:[{sepia:[_]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[r]}],"backdrop-brightness":[{"backdrop-brightness":[n]}],"backdrop-contrast":[{"backdrop-contrast":[f]}],"backdrop-grayscale":[{"backdrop-grayscale":[h]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[m]}],"backdrop-invert":[{"backdrop-invert":[g]}],"backdrop-opacity":[{"backdrop-opacity":[N]}],"backdrop-saturate":[{"backdrop-saturate":[A]}],"backdrop-sepia":[{"backdrop-sepia":[_]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[c]}],"border-spacing-x":[{"border-spacing-x":[c]}],"border-spacing-y":[{"border-spacing-y":[c]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",$e]}],duration:[{duration:I()}],ease:[{ease:["linear","in","out","in-out",$e]}],delay:[{delay:I()}],animate:[{animate:["none","spin","ping","pulse","bounce",$e]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[P]}],"scale-x":[{"scale-x":[P]}],"scale-y":[{"scale-y":[P]}],rotate:[{rotate:[Jl,$e]}],"translate-x":[{"translate-x":[U]}],"translate-y":[{"translate-y":[U]}],"skew-x":[{"skew-x":[O]}],"skew-y":[{"skew-y":[O]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",$e]}],accent:[{accent:["auto",e]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",$e]}],"caret-color":[{caret:[e]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":H()}],"scroll-mx":[{"scroll-mx":H()}],"scroll-my":[{"scroll-my":H()}],"scroll-ms":[{"scroll-ms":H()}],"scroll-me":[{"scroll-me":H()}],"scroll-mt":[{"scroll-mt":H()}],"scroll-mr":[{"scroll-mr":H()}],"scroll-mb":[{"scroll-mb":H()}],"scroll-ml":[{"scroll-ml":H()}],"scroll-p":[{"scroll-p":H()}],"scroll-px":[{"scroll-px":H()}],"scroll-py":[{"scroll-py":H()}],"scroll-ps":[{"scroll-ps":H()}],"scroll-pe":[{"scroll-pe":H()}],"scroll-pt":[{"scroll-pt":H()}],"scroll-pr":[{"scroll-pr":H()}],"scroll-pb":[{"scroll-pb":H()}],"scroll-pl":[{"scroll-pl":H()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",$e]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[li,ea,ug]}],stroke:[{stroke:[e,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}},OD=dD(PD);function ee(...e){return OD(nt(e))}function Ks(e){return e?e.replace(/127\.0\.0\.1|localhost/g,"192.168.178.151"):""}function jE(){const e=gE();return l.jsxs("div",{className:"flex items-center rounded-md border border-border/40 bg-background/40 p-0.5",role:"group","aria-label":"Ansichtsmodus",title:"Einfach zeigt nur das Wichtigste. Experte zeigt alle technischen Details.",children:[l.jsxs("button",{onClick:()=>Dw(!1),"aria-pressed":!e,className:ee("flex items-center gap-1 rounded px-2 py-1 text-xs font-semibold transition-all cursor-pointer",e?"text-muted-foreground hover:text-foreground":"bg-primary/15 text-primary shadow-sm"),children:[l.jsx(ys,{className:"h-3.5 w-3.5"})," Einfach"]}),l.jsxs("button",{onClick:()=>Dw(!0),"aria-pressed":e,className:ee("flex items-center gap-1 rounded px-2 py-1 text-xs font-semibold transition-all cursor-pointer",e?"bg-primary/15 text-primary shadow-sm":"text-muted-foreground hover:text-foreground"),children:[l.jsx($4,{className:"h-3.5 w-3.5"})," Experte"]})]})}async function Se(e,t){var f;const r={"Content-Type":"application/json",...t==null?void 0:t.headers},n=localStorage.getItem("mc_sudo_password"),a=localStorage.getItem("mc_hf_token");n&&(r["X-Sudo-Password"]=n);let o=t==null?void 0:t.body;if((((f=t==null?void 0:t.method)==null?void 0:f.toUpperCase())||"GET")==="POST"){if(typeof o=="string")try{const h=JSON.parse(o);let m=!1;n&&!("sudo_password"in h)&&(h.sudo_password=n,m=!0),a&&!("hf_token"in h)&&(h.hf_token=a,m=!0),m&&(o=JSON.stringify(h))}catch{}else if(!o){const h={};n&&(h.sudo_password=n),a&&(h.hf_token=a),Object.keys(h).length>0&&(o=JSON.stringify(h))}}const u=await fetch(e,{...t,headers:r,body:o});if(!u.ok)throw new Error(`${u.status} ${u.statusText}`);return u.json()}const SE=(e,t,r=!1,n=!0)=>Se("/api/groups",{method:"PUT",body:JSON.stringify({group:e,members:t,swap:r,persist:n})}),_D=e=>Se("/api/routing/policy",{method:"PUT",body:JSON.stringify(e)}),Ve={health:["health"],systemStatus:["system-status"],services:["services"],models:["models"],groups:["groups"],routing:["routing"],routingPolicy:["routing-policy"],voiceMetrics:["voice-metrics"],jobs:["jobs"],tokenStats:["token-stats"],agentStatus:["agent-status"],hermesBrain:["hermes-brain"],updates:["updates"],discover:["discover"],drafts:e=>["drafts",e??""],connect:e=>["connect",e??""],connectHealth:["connect-health"],memory:(e,t)=>["memory",e??"",t??""],memoryGraph:["memory-graph"]},MD=(e=!0)=>$t({queryKey:Ve.memoryGraph,queryFn:()=>Se("/api/memory/graph"),enabled:e}),Cy=()=>$t({queryKey:Ve.health,queryFn:()=>Se("/api/health"),refetchInterval:1e4}),Po=(e=5e3)=>$t({queryKey:Ve.systemStatus,queryFn:()=>Se("/api/system/status"),refetchInterval:e}),NE=(e=3e3)=>$t({queryKey:Ve.services,queryFn:()=>Se("/api/system/services"),refetchInterval:e}),Ni=(e=4e3)=>$t({queryKey:Ve.models,queryFn:()=>Se("/api/models"),refetchInterval:e}),EE=(e=8e3)=>$t({queryKey:Ve.groups,queryFn:()=>Se("/api/groups"),refetchInterval:e}),ID=(e=5e3)=>$t({queryKey:Ve.voiceMetrics,queryFn:()=>Se("/api/voice/metrics"),refetchInterval:e}),TD=()=>$t({queryKey:Ve.routingPolicy,queryFn:()=>Se("/api/routing/policy")}),DD=(e=2e3)=>$t({queryKey:Ve.jobs,queryFn:()=>Se("/api/jobs"),refetchInterval:e,select:t=>t.jobs??[]}),Py=(e=3e3)=>$t({queryKey:Ve.tokenStats,queryFn:()=>Se("/api/system/token-stats"),refetchInterval:e}),Oy=(e=5e3)=>$t({queryKey:Ve.agentStatus,queryFn:()=>Se("/api/agent/status"),refetchInterval:e}),AE=(e=6e4)=>$t({queryKey:Ve.hermesBrain,queryFn:()=>Se("/api/agent/brain"),refetchInterval:e}),vh=e=>$t({queryKey:Ve.updates,queryFn:()=>Se("/api/maintenance/updates"),refetchInterval:e}),RD=()=>$t({queryKey:Ve.discover,queryFn:()=>Se("/api/discover")}),LD=e=>$t({queryKey:Ve.drafts(e),queryFn:()=>Se(`/api/models/drafts?target=${encodeURIComponent(e??"")}`),enabled:!!e}),$D=e=>$t({queryKey:Ve.connect(e),queryFn:()=>Se(e?`/api/connect?${e}`:"/api/connect")}),zD=()=>$t({queryKey:Ve.connectHealth,queryFn:()=>Se("/api/connect/health"),refetchInterval:15e3}),vv=e=>$t({queryKey:Ve.memory(e==null?void 0:e.q,e==null?void 0:e.category),queryFn:()=>{const t=new URLSearchParams;return e!=null&&e.q&&t.set("q",e.q),e!=null&&e.category&&t.set("category",e.category),Se(`/api/memory?${t}`)},select:t=>e!=null&&e.limit?t.slice(0,e.limit):t});let yv=[],xv=[];const bv=new Set,CE=()=>bv.forEach(e=>e());function PE(e){return bv.add(e),()=>{bv.delete(e)}}function FD(e){yv=[...yv,e].slice(-40),CE()}function BD(e){xv=[...xv,e].slice(-40),CE()}const UD=()=>y.useSyncExternalStore(PE,()=>yv),HD=()=>y.useSyncExternalStore(PE,()=>xv);function WD(){const{data:e,dataUpdatedAt:t}=Po(3e3),{data:r,dataUpdatedAt:n}=Py(3e3),a=y.useRef(null);y.useEffect(()=>{var o,c,u,f;e&&FD({t:Date.now(),cpu:((o=e.cpu)==null?void 0:o.percent)??0,ram:((c=e.ram)==null?void 0:c.percent)??0,gpu:((u=e.gpu)==null?void 0:u.busy_percent)??null,disk:((f=e.disk)==null?void 0:f.percent)??null})},[t]),y.useEffect(()=>{if(!r)return;const o=Date.now(),c=r.prompt_tokens,u=r.completion_tokens;if(a.current){const f=Math.max((o-a.current.t)/1e3,.001);BD({t:o,prompt:Math.max(0,(c-a.current.p)/f),completion:Math.max(0,(u-a.current.c)/f)})}a.current={p:c,c:u,t:o}},[n])}function KD(){const{data:e,error:t}=Po(3e3),r=UD();return{sys:e,hist:r,error:t}}function aa(e){return(e/1024**3).toFixed(1)}function wv(e){return e?e>1024**3?`${(e/1024**3).toFixed(1)} GB`:`${(e/1024**2).toFixed(0)} MB`:""}function Lr(e){if(!e)return"—";const t=e/1024**3;return t>=1?`${t.toFixed(1)} GB`:`${(e/1024**2).toFixed(0)} MB`}function GD(e){if(!e)return"";const t=Math.floor(e/60);return t>0?`${t} min`:`${e} s`}function $w(e){return e?`${Math.round(e/1024)}k`:"—"}var VD=["dangerouslySetInnerHTML","onCopy","onCopyCapture","onCut","onCutCapture","onPaste","onPasteCapture","onCompositionEnd","onCompositionEndCapture","onCompositionStart","onCompositionStartCapture","onCompositionUpdate","onCompositionUpdateCapture","onFocus","onFocusCapture","onBlur","onBlurCapture","onChange","onChangeCapture","onBeforeInput","onBeforeInputCapture","onInput","onInputCapture","onReset","onResetCapture","onSubmit","onSubmitCapture","onInvalid","onInvalidCapture","onLoad","onLoadCapture","onError","onErrorCapture","onKeyDown","onKeyDownCapture","onKeyPress","onKeyPressCapture","onKeyUp","onKeyUpCapture","onAbort","onAbortCapture","onCanPlay","onCanPlayCapture","onCanPlayThrough","onCanPlayThroughCapture","onDurationChange","onDurationChangeCapture","onEmptied","onEmptiedCapture","onEncrypted","onEncryptedCapture","onEnded","onEndedCapture","onLoadedData","onLoadedDataCapture","onLoadedMetadata","onLoadedMetadataCapture","onLoadStart","onLoadStartCapture","onPause","onPauseCapture","onPlay","onPlayCapture","onPlaying","onPlayingCapture","onProgress","onProgressCapture","onRateChange","onRateChangeCapture","onSeeked","onSeekedCapture","onSeeking","onSeekingCapture","onStalled","onStalledCapture","onSuspend","onSuspendCapture","onTimeUpdate","onTimeUpdateCapture","onVolumeChange","onVolumeChangeCapture","onWaiting","onWaitingCapture","onAuxClick","onAuxClickCapture","onClick","onClickCapture","onContextMenu","onContextMenuCapture","onDoubleClick","onDoubleClickCapture","onDrag","onDragCapture","onDragEnd","onDragEndCapture","onDragEnter","onDragEnterCapture","onDragExit","onDragExitCapture","onDragLeave","onDragLeaveCapture","onDragOver","onDragOverCapture","onDragStart","onDragStartCapture","onDrop","onDropCapture","onMouseDown","onMouseDownCapture","onMouseEnter","onMouseLeave","onMouseMove","onMouseMoveCapture","onMouseOut","onMouseOutCapture","onMouseOver","onMouseOverCapture","onMouseUp","onMouseUpCapture","onSelect","onSelectCapture","onTouchCancel","onTouchCancelCapture","onTouchEnd","onTouchEndCapture","onTouchMove","onTouchMoveCapture","onTouchStart","onTouchStartCapture","onPointerDown","onPointerDownCapture","onPointerMove","onPointerMoveCapture","onPointerUp","onPointerUpCapture","onPointerCancel","onPointerCancelCapture","onPointerEnter","onPointerEnterCapture","onPointerLeave","onPointerLeaveCapture","onPointerOver","onPointerOverCapture","onPointerOut","onPointerOutCapture","onGotPointerCapture","onGotPointerCaptureCapture","onLostPointerCapture","onLostPointerCaptureCapture","onScroll","onScrollCapture","onWheel","onWheelCapture","onAnimationStart","onAnimationStartCapture","onAnimationEnd","onAnimationEndCapture","onAnimationIteration","onAnimationIterationCapture","onTransitionEnd","onTransitionEndCapture"];function _y(e){if(typeof e!="string")return!1;var t=VD;return t.includes(e)}var qD=["aria-activedescendant","aria-atomic","aria-autocomplete","aria-busy","aria-checked","aria-colcount","aria-colindex","aria-colspan","aria-controls","aria-current","aria-describedby","aria-details","aria-disabled","aria-errormessage","aria-expanded","aria-flowto","aria-haspopup","aria-hidden","aria-invalid","aria-keyshortcuts","aria-label","aria-labelledby","aria-level","aria-live","aria-modal","aria-multiline","aria-multiselectable","aria-orientation","aria-owns","aria-placeholder","aria-posinset","aria-pressed","aria-readonly","aria-relevant","aria-required","aria-roledescription","aria-rowcount","aria-rowindex","aria-rowspan","aria-selected","aria-setsize","aria-sort","aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext","className","color","height","id","lang","max","media","method","min","name","style","target","width","role","tabIndex","accentHeight","accumulate","additive","alignmentBaseline","allowReorder","alphabetic","amplitude","arabicForm","ascent","attributeName","attributeType","autoReverse","azimuth","baseFrequency","baselineShift","baseProfile","bbox","begin","bias","by","calcMode","capHeight","clip","clipPath","clipPathUnits","clipRule","colorInterpolation","colorInterpolationFilters","colorProfile","colorRendering","contentScriptType","contentStyleType","cursor","cx","cy","d","decelerate","descent","diffuseConstant","direction","display","divisor","dominantBaseline","dur","dx","dy","edgeMode","elevation","enableBackground","end","exponent","externalResourcesRequired","fill","fillOpacity","fillRule","filter","filterRes","filterUnits","floodColor","floodOpacity","focusable","fontFamily","fontSize","fontSizeAdjust","fontStretch","fontStyle","fontVariant","fontWeight","format","from","fx","fy","g1","g2","glyphName","glyphOrientationHorizontal","glyphOrientationVertical","glyphRef","gradientTransform","gradientUnits","hanging","horizAdvX","horizOriginX","href","ideographic","imageRendering","in2","in","intercept","k1","k2","k3","k4","k","kernelMatrix","kernelUnitLength","kerning","keyPoints","keySplines","keyTimes","lengthAdjust","letterSpacing","lightingColor","limitingConeAngle","local","markerEnd","markerHeight","markerMid","markerStart","markerUnits","markerWidth","mask","maskContentUnits","maskUnits","mathematical","mode","numOctaves","offset","opacity","operator","order","orient","orientation","origin","overflow","overlinePosition","overlineThickness","paintOrder","panose1","pathLength","patternContentUnits","patternTransform","patternUnits","pointerEvents","pointsAtX","pointsAtY","pointsAtZ","preserveAlpha","preserveAspectRatio","primitiveUnits","r","radius","refX","refY","renderingIntent","repeatCount","repeatDur","requiredExtensions","requiredFeatures","restart","result","rotate","rx","ry","seed","shapeRendering","slope","spacing","specularConstant","specularExponent","speed","spreadMethod","startOffset","stdDeviation","stemh","stemv","stitchTiles","stopColor","stopOpacity","strikethroughPosition","strikethroughThickness","string","stroke","strokeDasharray","strokeDashoffset","strokeLinecap","strokeLinejoin","strokeMiterlimit","strokeOpacity","strokeWidth","surfaceScale","systemLanguage","tableValues","targetX","targetY","textAnchor","textDecoration","textLength","textRendering","to","transform","u1","u2","underlinePosition","underlineThickness","unicode","unicodeBidi","unicodeRange","unitsPerEm","vAlphabetic","values","vectorEffect","version","vertAdvY","vertOriginX","vertOriginY","vHanging","vIdeographic","viewTarget","visibility","vMathematical","widths","wordSpacing","writingMode","x1","x2","x","xChannelSelector","xHeight","xlinkActuate","xlinkArcrole","xlinkHref","xlinkRole","xlinkShow","xlinkTitle","xlinkType","xmlBase","xmlLang","xmlns","xmlnsXlink","xmlSpace","y1","y2","y","yChannelSelector","z","zoomAndPan","ref","key","angle"],QD=new Set(qD);function OE(e){return typeof e!="string"?!1:QD.has(e)}function _E(e){return typeof e=="string"&&e.startsWith("data-")}function kn(e){if(typeof e!="object"||e===null)return{};var t={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(OE(r)||_E(r))&&(t[r]=e[r]);return t}function yh(e){if(e==null)return null;if(y.isValidElement(e)&&typeof e.props=="object"&&e.props!==null){var t=e.props;return kn(t)}return typeof e=="object"&&!Array.isArray(e)?kn(e):null}function rn(e){var t={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(OE(r)||_E(r)||_y(r))&&(t[r]=e[r]);return t}function YD(e){return e==null?null:y.isValidElement(e)?rn(e.props):typeof e=="object"&&!Array.isArray(e)?rn(e):null}var XD=["children","width","height","viewBox","className","style","title","desc"];function kv(){return kv=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var r=e.children,n=e.width,a=e.height,o=e.viewBox,c=e.className,u=e.style,f=e.title,h=e.desc,m=ZD(e,XD),g=o||{width:n,height:a,x:0,y:0},v=nt("recharts-surface",c);return y.createElement("svg",kv({},rn(m),{className:v,width:n,height:a,style:u,viewBox:"".concat(g.x," ").concat(g.y," ").concat(g.width," ").concat(g.height),ref:t}),y.createElement("title",null,f),y.createElement("desc",null,h),r)}),eR=["children","className"];function jv(){return jv=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var r=e.children,n=e.className,a=tR(e,eR),o=nt("recharts-layer",n);return y.createElement("g",jv({className:o},rn(a),{ref:t}),r)}),nR=y.createContext(null);function yt(e){return function(){return e}}const Sv=Math.PI,Nv=2*Sv,qa=1e-6,iR=Nv-qa;function IE(e){this._+=e[0];for(let t=1,r=e.length;t=0))throw new Error(`invalid digits: ${e}`);if(t>15)return IE;const r=10**t;return function(n){this._+=n[0];for(let a=1,o=n.length;aqa)if(!(Math.abs(g*f-h*m)>qa)||!o)this._append`L${this._x1=t},${this._y1=r}`;else{let b=n-c,j=a-u,k=f*f+h*h,S=b*b+j*j,N=Math.sqrt(k),E=Math.sqrt(v),A=o*Math.tan((Sv-Math.acos((k+v-S)/(2*N*E)))/2),P=A/E,_=A/N;Math.abs(P-1)>qa&&this._append`L${t+P*m},${r+P*g}`,this._append`A${o},${o},0,0,${+(g*b>m*j)},${this._x1=t+_*f},${this._y1=r+_*h}`}}arc(t,r,n,a,o,c){if(t=+t,r=+r,n=+n,c=!!c,n<0)throw new Error(`negative radius: ${n}`);let u=n*Math.cos(a),f=n*Math.sin(a),h=t+u,m=r+f,g=1^c,v=c?a-o:o-a;this._x1===null?this._append`M${h},${m}`:(Math.abs(this._x1-h)>qa||Math.abs(this._y1-m)>qa)&&this._append`L${h},${m}`,n&&(v<0&&(v=v%Nv+Nv),v>iR?this._append`A${n},${n},0,1,${g},${t-u},${r-f}A${n},${n},0,1,${g},${this._x1=h},${this._y1=m}`:v>qa&&this._append`A${n},${n},0,${+(v>=Sv)},${g},${this._x1=t+n*Math.cos(o)},${this._y1=r+n*Math.sin(o)}`)}rect(t,r,n,a){this._append`M${this._x0=this._x1=+t},${this._y0=this._y1=+r}h${n=+n}v${+a}h${-n}Z`}toString(){return this._}}function TE(e){let t=3;return e.digits=function(r){if(!arguments.length)return t;if(r==null)t=null;else{const n=Math.floor(r);if(!(n>=0))throw new RangeError(`invalid digits: ${r}`);t=n}return e},()=>new oR(t)}function My(e){return typeof e=="object"&&"length"in e?e:Array.from(e)}function DE(e){this._context=e}DE.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:this._context.lineTo(e,t);break}}};function xh(e){return new DE(e)}function RE(e){return e[0]}function LE(e){return e[1]}function $E(e,t){var r=yt(!0),n=null,a=xh,o=null,c=TE(u);e=typeof e=="function"?e:e===void 0?RE:yt(e),t=typeof t=="function"?t:t===void 0?LE:yt(t);function u(f){var h,m=(f=My(f)).length,g,v=!1,b;for(n==null&&(o=a(b=c())),h=0;h<=m;++h)!(h=b;--j)u.point(A[j],P[j]);u.lineEnd(),u.areaEnd()}N&&(A[v]=+e(S,v,g),P[v]=+t(S,v,g),u.point(n?+n(S,v,g):A[v],r?+r(S,v,g):P[v]))}if(E)return u=null,E+""||null}function m(){return $E().defined(a).curve(c).context(o)}return h.x=function(g){return arguments.length?(e=typeof g=="function"?g:yt(+g),n=null,h):e},h.x0=function(g){return arguments.length?(e=typeof g=="function"?g:yt(+g),h):e},h.x1=function(g){return arguments.length?(n=g==null?null:typeof g=="function"?g:yt(+g),h):n},h.y=function(g){return arguments.length?(t=typeof g=="function"?g:yt(+g),r=null,h):t},h.y0=function(g){return arguments.length?(t=typeof g=="function"?g:yt(+g),h):t},h.y1=function(g){return arguments.length?(r=g==null?null:typeof g=="function"?g:yt(+g),h):r},h.lineX0=h.lineY0=function(){return m().x(e).y(t)},h.lineY1=function(){return m().x(e).y(r)},h.lineX1=function(){return m().x(n).y(t)},h.defined=function(g){return arguments.length?(a=typeof g=="function"?g:yt(!!g),h):a},h.curve=function(g){return arguments.length?(c=g,o!=null&&(u=c(o)),h):c},h.context=function(g){return arguments.length?(g==null?o=u=null:u=c(o=g),h):o},h}class zE{constructor(t,r){this._context=t,this._x=r}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line}point(t,r){switch(t=+t,r=+r,this._point){case 0:{this._point=1,this._line?this._context.lineTo(t,r):this._context.moveTo(t,r);break}case 1:this._point=2;default:{this._x?this._context.bezierCurveTo(this._x0=(this._x0+t)/2,this._y0,this._x0,r,t,r):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+r)/2,t,this._y0,t,r);break}}this._x0=t,this._y0=r}}function sR(e){return new zE(e,!0)}function lR(e){return new zE(e,!1)}function mf(){}function pf(e,t,r){e._context.bezierCurveTo((2*e._x0+e._x1)/3,(2*e._y0+e._y1)/3,(e._x0+2*e._x1)/3,(e._y0+2*e._y1)/3,(e._x0+4*e._x1+t)/6,(e._y0+4*e._y1+r)/6)}function FE(e){this._context=e}FE.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:pf(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:pf(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function uR(e){return new FE(e)}function BE(e){this._context=e}BE.prototype={areaStart:mf,areaEnd:mf,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:{this._context.moveTo(this._x2,this._y2),this._context.closePath();break}case 2:{this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break}case 3:{this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4);break}}},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._x2=e,this._y2=t;break;case 1:this._point=2,this._x3=e,this._y3=t;break;case 2:this._point=3,this._x4=e,this._y4=t,this._context.moveTo((this._x0+4*this._x1+e)/6,(this._y0+4*this._y1+t)/6);break;default:pf(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function cR(e){return new BE(e)}function UE(e){this._context=e}UE.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var r=(this._x0+4*this._x1+e)/6,n=(this._y0+4*this._y1+t)/6;this._line?this._context.lineTo(r,n):this._context.moveTo(r,n);break;case 3:this._point=4;default:pf(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function dR(e){return new UE(e)}function HE(e){this._context=e}HE.prototype={areaStart:mf,areaEnd:mf,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(e,t){e=+e,t=+t,this._point?this._context.lineTo(e,t):(this._point=1,this._context.moveTo(e,t))}};function fR(e){return new HE(e)}function zw(e){return e<0?-1:1}function Fw(e,t,r){var n=e._x1-e._x0,a=t-e._x1,o=(e._y1-e._y0)/(n||a<0&&-0),c=(r-e._y1)/(a||n<0&&-0),u=(o*a+c*n)/(n+a);return(zw(o)+zw(c))*Math.min(Math.abs(o),Math.abs(c),.5*Math.abs(u))||0}function Bw(e,t){var r=e._x1-e._x0;return r?(3*(e._y1-e._y0)/r-t)/2:t}function cg(e,t,r){var n=e._x0,a=e._y0,o=e._x1,c=e._y1,u=(o-n)/3;e._context.bezierCurveTo(n+u,a+u*t,o-u,c-u*r,o,c)}function gf(e){this._context=e}gf.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:cg(this,this._t0,Bw(this,this._t0));break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){var r=NaN;if(e=+e,t=+t,!(e===this._x1&&t===this._y1)){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,cg(this,Bw(this,r=Fw(this,e,t)),r);break;default:cg(this,this._t0,r=Fw(this,e,t));break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t,this._t0=r}}};function WE(e){this._context=new KE(e)}(WE.prototype=Object.create(gf.prototype)).point=function(e,t){gf.prototype.point.call(this,t,e)};function KE(e){this._context=e}KE.prototype={moveTo:function(e,t){this._context.moveTo(t,e)},closePath:function(){this._context.closePath()},lineTo:function(e,t){this._context.lineTo(t,e)},bezierCurveTo:function(e,t,r,n,a,o){this._context.bezierCurveTo(t,e,n,r,o,a)}};function hR(e){return new gf(e)}function mR(e){return new WE(e)}function GE(e){this._context=e}GE.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=[],this._y=[]},lineEnd:function(){var e=this._x,t=this._y,r=e.length;if(r)if(this._line?this._context.lineTo(e[0],t[0]):this._context.moveTo(e[0],t[0]),r===2)this._context.lineTo(e[1],t[1]);else for(var n=Uw(e),a=Uw(t),o=0,c=1;c=0;--t)a[t]=(c[t]-a[t+1])/o[t];for(o[r-1]=(e[r]+a[r-1])/2,t=0;t=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:{if(this._t<=0)this._context.lineTo(this._x,t),this._context.lineTo(e,t);else{var r=this._x*(1-this._t)+e*this._t;this._context.lineTo(r,this._y),this._context.lineTo(r,t)}break}}this._x=e,this._y=t}};function gR(e){return new bh(e,.5)}function vR(e){return new bh(e,0)}function yR(e){return new bh(e,1)}function xo(e,t){if((c=e.length)>1)for(var r=1,n,a,o=e[t[0]],c,u=o.length;r=0;)r[t]=t;return r}function xR(e,t){return e[t]}function bR(e){const t=[];return t.key=e,t}function wR(){var e=yt([]),t=Ev,r=xo,n=xR;function a(o){var c=Array.from(e.apply(this,arguments),bR),u,f=c.length,h=-1,m;for(const g of o)for(u=0,++h;u0){for(var r,n,a=0,o=e[0].length,c;a0){for(var r=0,n=e[t[0]],a,o=n.length;r0)||!((o=(a=e[t[0]]).length)>0))){for(var r=0,n=1,a,o,c;n1&&arguments[1]!==void 0?arguments[1]:ER,r=10**t,n=Math.round(e*r)/r;return Object.is(n,-0)?0:n}function Gt(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n{var u=r[c-1];return typeof u=="string"?a+u+o:u!==void 0?a+va(u)+o:a+o},"")}var Jr=e=>e===0?0:e>0?1:-1,Kn=e=>typeof e=="number"&&e!=+e,bo=e=>typeof e=="string"&&e.length>1&&e.indexOf("%")===e.length-1,Ee=e=>(typeof e=="number"||e instanceof Number)&&!Kn(e),Gn=e=>Ee(e)||typeof e=="string",AR=0,Au=e=>{var t=++AR;return"".concat(e||"").concat(t)},Sa=function(t,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,a=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1;if(!Ee(t)&&typeof t!="string")return n;var o;if(bo(t)){if(r==null)return n;var c=t.indexOf("%");o=r*parseFloat(t.slice(0,c))/100}else o=+t;return Kn(o)&&(o=n),a&&r!=null&&o>r&&(o=r),o},QE=e=>{if(!Array.isArray(e))return!1;for(var t=e.length,r={},n=0;nn&&(typeof t=="function"?t(n):Oo(n,t))===r)}var Yt=e=>e===null||typeof e>"u",Dy=e=>Yt(e)?e:"".concat(e.charAt(0).toUpperCase()).concat(e.slice(1));function Ar(e){return e!=null}function rl(){}var XE=e=>"radius"in e&&"startAngle"in e&&"endAngle"in e,Ry=(e,t)=>{if(!e||typeof e=="function"||typeof e=="boolean")return null;var r=e;if(y.isValidElement(e)&&(r=e.props),typeof r!="object"&&typeof r!="function")return null;var n={};return Object.keys(r).forEach(a=>{_y(a)&&typeof r[a]=="function"&&(n[a]=(o=>r[a](r,o)))}),n},CR=(e,t,r)=>n=>(e(t,r,n),null),PR=(e,t,r)=>{if(e===null||typeof e!="object"&&typeof e!="function")return null;var n=null;return Object.keys(e).forEach(a=>{var o=e[a];_y(a)&&typeof o=="function"&&(n||(n={}),n[a]=CR(o,t,r))}),n};function Hw(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function OR(e){for(var t=1;t(c[u]===void 0&&n[u]!==void 0&&(c[u]=n[u]),c),r);return o}function TR(e,t){const r=new Map;for(let n=0;nObject.prototype.propertyIsEnumerable.call(e,t))}function Ly(e){return e==null?e===void 0?"[object Undefined]":"[object Null]":Object.prototype.toString.call(e)}const zR="[object RegExp]",JE="[object String]",e5="[object Number]",t5="[object Boolean]",r5="[object Arguments]",FR="[object Symbol]",BR="[object Date]",UR="[object Map]",HR="[object Set]",WR="[object Array]",KR="[object ArrayBuffer]",GR="[object Object]",VR="[object DataView]",qR="[object Uint8Array]",QR="[object Uint8ClampedArray]",YR="[object Uint16Array]",XR="[object Uint32Array]",ZR="[object Int8Array]",JR="[object Int16Array]",eL="[object Int32Array]",tL="[object Float32Array]",rL="[object Float64Array]",Ww=typeof globalThis=="object"&&globalThis||typeof window=="object"&&window||typeof self=="object"&&self||typeof global=="object"&&global||(function(){return this})();function nL(e){return typeof Ww.Buffer<"u"&&Ww.Buffer.isBuffer(e)}function iL(e,t){return Ja(e,void 0,e,new Map,t)}function Ja(e,t,r,n=new Map,a=void 0){const o=a==null?void 0:a(e,t,r,n);if(o!==void 0)return o;if(Cv(e))return e;if(n.has(e))return n.get(e);if(Array.isArray(e)){const c=new Array(e.length);n.set(e,c);for(let u=0;u{}):Pv(e,t,function n(a,o,c,u,f,h){const m=r(a,o,c,u,f,h);return m!==void 0?!!m:Pv(a,o,n,h,!1)},new Map,!0)}function Pv(e,t,r,n,a=!1){if(t===e)return!0;switch(typeof t){case"object":return sL(e,t,r,n);case"function":return Object.keys(t).length>0?Pv(e,{...t},r,n,a):Zd(e,t);default:return n5(e)&&a?typeof t=="string"?t==="":!0:Zd(e,t)}}function sL(e,t,r,n){if(t==null)return!0;if(Array.isArray(t))return a5(e,t,r,n);if(t instanceof Map)return lL(e,t,r,n);if(t instanceof Set)return uL(e,t,r,n);const a=Object.keys(t);if(e==null||Cv(e))return a.length===0;if(a.length===0)return!0;if(n!=null&&n.has(t))return n.get(t)===e;n==null||n.set(t,e);try{for(let o=0;o{})}function cL(e){return e=oL(e),t=>o5(t,e)}function dL(e,t){return iL(e,(r,n,a,o)=>{if(typeof e=="object"){if(Ly(e)==="[object Object]"&&typeof e.constructor!="function"){const c={};return o.set(e,c),gn(c,e,a,o),c}switch(Object.prototype.toString.call(e)){case e5:case JE:case t5:{const c=new e.constructor(e==null?void 0:e.valueOf());return gn(c,e),c}case r5:{const c={};return gn(c,e),c.length=e.length,c[Symbol.iterator]=e[Symbol.iterator],c}default:return}}})}function fL(e){return dL(e)}const hL=/^(?:0|[1-9]\d*)$/;function s5(e,t=Number.MAX_SAFE_INTEGER){switch(typeof e){case"number":return Number.isInteger(e)&&e>=0&&e=0}function l5(e){return e!=null&&typeof e!="function"&&yL(e.length)}function xL(e){return typeof e=="object"&&e!==null}function bL(e){return xL(e)&&l5(e)}function Kw(e,t=ZE){return bL(e)?TR(Array.from(e),DR(vL(t),1)):[]}function wL(e,t,r){return t===!0?Kw(e,r):typeof t=="function"?Kw(e,t):e}var dg={exports:{}},fg={},hg={exports:{}},mg={};/** +`)},vT=0,os=[];function yT(e){var t=y.useRef([]),r=y.useRef([0,0]),n=y.useRef(),a=y.useState(vT++)[0],o=y.useState(KN)[0],c=y.useRef(e);y.useEffect(function(){c.current=e},[e]),y.useEffect(function(){if(e.inert){document.body.classList.add("block-interactivity-".concat(a));var k=zI([e.lockRef.current],(e.shards||[]).map(Tw),!0).filter(Boolean);return k.forEach(function(S){return S.classList.add("allow-interactivity-".concat(a))}),function(){document.body.classList.remove("block-interactivity-".concat(a)),k.forEach(function(S){return S.classList.remove("allow-interactivity-".concat(a))})}}},[e.inert,e.lockRef.current,e.shards]);var u=y.useCallback(function(k,S){if("touches"in k&&k.touches.length===2||k.type==="wheel"&&k.ctrlKey)return!c.current.allowPinchZoom;var N=Pd(k),E=r.current,A="deltaX"in k?k.deltaX:E[0]-N[0],P="deltaY"in k?k.deltaY:E[1]-N[1],_,O=k.target,D=Math.abs(A)>Math.abs(P)?"h":"v";if("touches"in k&&D==="h"&&O.type==="range")return!1;var U=window.getSelection(),B=U&&U.anchorNode,F=B?B===O||B.contains(O):!1;if(F)return!1;var Y=Mw(D,O);if(!Y)return!0;if(Y?_=D:(_=D==="v"?"h":"v",Y=Mw(D,O)),!Y)return!1;if(!n.current&&"changedTouches"in k&&(A||P)&&(n.current=_),!_)return!0;var H=n.current||_;return mT(H,S,k,H==="h"?A:P)},[]),f=y.useCallback(function(k){var S=k;if(!(!os.length||os[os.length-1]!==o)){var N="deltaY"in S?Iw(S):Pd(S),E=t.current.filter(function(_){return _.name===S.type&&(_.target===S.target||S.target===_.shadowParent)&&pT(_.delta,N)})[0];if(E&&E.should){S.cancelable&&S.preventDefault();return}if(!E){var A=(c.current.shards||[]).map(Tw).filter(Boolean).filter(function(_){return _.contains(S.target)}),P=A.length>0?u(S,A[0]):!c.current.noIsolation;P&&S.cancelable&&S.preventDefault()}}},[]),h=y.useCallback(function(k,S,N,E){var A={name:k,delta:S,target:N,should:E,shadowParent:xT(N)};t.current.push(A),setTimeout(function(){t.current=t.current.filter(function(P){return P!==A})},1)},[]),m=y.useCallback(function(k){r.current=Pd(k),n.current=void 0},[]),g=y.useCallback(function(k){h(k.type,Iw(k),k.target,u(k,e.lockRef.current))},[]),v=y.useCallback(function(k){h(k.type,Pd(k),k.target,u(k,e.lockRef.current))},[]);y.useEffect(function(){return os.push(o),e.setCallbacks({onScrollCapture:g,onWheelCapture:g,onTouchMoveCapture:v}),document.addEventListener("wheel",f,as),document.addEventListener("touchmove",f,as),document.addEventListener("touchstart",m,as),function(){os=os.filter(function(k){return k!==o}),document.removeEventListener("wheel",f,as),document.removeEventListener("touchmove",f,as),document.removeEventListener("touchstart",m,as)}},[]);var b=e.removeScrollBar,j=e.inert;return y.createElement(y.Fragment,null,j?y.createElement(o,{styles:gT(a)}):null,b?y.createElement(sT,{noRelative:e.noRelative,gapMode:e.gapMode}):null)}function xT(e){for(var t=null;e!==null;)e instanceof ShadowRoot&&(t=e.host,e=e.host),e=e.parentNode;return t}const bT=qI(WN,yT);var QN=y.forwardRef(function(e,t){return y.createElement(mh,$n({},e,{ref:t,sideCar:bT}))});QN.classNames=mh.classNames;var wT=function(e){if(typeof document>"u")return null;var t=Array.isArray(e)?e[0]:e;return t.ownerDocument.body},ss=new WeakMap,Od=new WeakMap,_d={},sg=0,YN=function(e){return e&&(e.host||YN(e.parentNode))},kT=function(e,t){return t.map(function(r){if(e.contains(r))return r;var n=YN(r);return n&&e.contains(n)?n:(console.error("aria-hidden",r,"in not contained inside",e,". Doing nothing"),null)}).filter(function(r){return!!r})},jT=function(e,t,r,n){var a=kT(t,Array.isArray(e)?e:[e]);_d[r]||(_d[r]=new WeakMap);var o=_d[r],c=[],u=new Set,f=new Set(a),h=function(g){!g||u.has(g)||(u.add(g),h(g.parentNode))};a.forEach(h);var m=function(g){!g||f.has(g)||Array.prototype.forEach.call(g.children,function(v){if(u.has(v))m(v);else try{var b=v.getAttribute(n),j=b!==null&&b!=="false",k=(ss.get(v)||0)+1,S=(o.get(v)||0)+1;ss.set(v,k),o.set(v,S),c.push(v),k===1&&j&&Od.set(v,!0),S===1&&v.setAttribute(r,"true"),j||v.setAttribute(n,"true")}catch(N){console.error("aria-hidden: cannot operate on ",v,N)}})};return m(t),u.clear(),sg++,function(){c.forEach(function(g){var v=ss.get(g)-1,b=o.get(g)-1;ss.set(g,v),o.set(g,b),v||(Od.has(g)||g.removeAttribute(n),Od.delete(g)),b||g.removeAttribute(r)}),sg--,sg||(ss=new WeakMap,ss=new WeakMap,Od=new WeakMap,_d={})}},ST=function(e,t,r){r===void 0&&(r="data-aria-hidden");var n=Array.from(Array.isArray(e)?e:[e]),a=wT(e);return a?(n.push.apply(n,Array.from(a.querySelectorAll("[aria-live], script"))),jT(n,a,r,"aria-hidden")):function(){return null}},ph="Dialog",[XN]=Z4(ph),[NT,Sn]=XN(ph),ZN=e=>{const{__scopeDialog:t,children:r,open:n,defaultOpen:a,onOpenChange:o,modal:c=!0}=e,u=y.useRef(null),f=y.useRef(null),[h,m]=nI({prop:n,defaultProp:a??!1,onChange:o,caller:ph});return l.jsx(NT,{scope:t,triggerRef:u,contentRef:f,contentId:vi(),titleId:vi(),descriptionId:vi(),open:h,onOpenChange:m,onOpenToggle:y.useCallback(()=>m(g=>!g),[m]),modal:c,children:r})};ZN.displayName=ph;var JN="DialogTrigger",ET=y.forwardRef((e,t)=>{const{__scopeDialog:r,...n}=e,a=Sn(JN,r),o=Co(t,a.triggerRef);return l.jsx(Xt.button,{type:"button","aria-haspopup":"dialog","aria-expanded":a.open,"aria-controls":a.open?a.contentId:void 0,"data-state":Ey(a.open),...n,ref:o,onClick:ba(e.onClick,a.onOpenToggle)})});ET.displayName=JN;var Ny="DialogPortal",[AT,eE]=XN(Ny,{forceMount:void 0}),tE=e=>{const{__scopeDialog:t,forceMount:r,children:n,container:a}=e,o=Sn(Ny,t);return l.jsx(AT,{scope:t,forceMount:r,children:y.Children.map(n,c=>l.jsx(hh,{present:r||o.open,children:l.jsx(BN,{asChild:!0,container:a,children:c})}))})};tE.displayName=Ny;var hf="DialogOverlay",rE=y.forwardRef((e,t)=>{const r=eE(hf,e.__scopeDialog),{forceMount:n=r.forceMount,...a}=e,o=Sn(hf,e.__scopeDialog);return o.modal?l.jsx(hh,{present:n||o.open,children:l.jsx(PT,{...a,ref:t})}):null});rE.displayName=hf;var CT=RN("DialogOverlay.RemoveScroll"),PT=y.forwardRef((e,t)=>{const{__scopeDialog:r,...n}=e,a=Sn(hf,r),o=jI(),c=Co(t,o);return l.jsx(QN,{as:CT,allowPinchZoom:!0,shards:[a.contentRef],children:l.jsx(Xt.div,{"data-state":Ey(a.open),...n,ref:c,style:{pointerEvents:"auto",...n.style}})})}),Ks="DialogContent",nE=y.forwardRef((e,t)=>{const r=eE(Ks,e.__scopeDialog),{forceMount:n=r.forceMount,...a}=e,o=Sn(Ks,e.__scopeDialog);return l.jsx(hh,{present:n||o.open,children:o.modal?l.jsx(OT,{...a,ref:t}):l.jsx(_T,{...a,ref:t})})});nE.displayName=Ks;var OT=y.forwardRef((e,t)=>{const r=Sn(Ks,e.__scopeDialog),n=y.useRef(null),a=Co(t,r.contentRef,n);return y.useEffect(()=>{const o=n.current;if(o)return ST(o)},[]),l.jsx(iE,{...e,ref:a,trapFocus:r.open,disableOutsidePointerEvents:r.open,onCloseAutoFocus:ba(e.onCloseAutoFocus,o=>{var c;o.preventDefault(),(c=r.triggerRef.current)==null||c.focus()}),onPointerDownOutside:ba(e.onPointerDownOutside,o=>{const c=o.detail.originalEvent,u=c.button===0&&c.ctrlKey===!0;(c.button===2||u)&&o.preventDefault()}),onFocusOutside:ba(e.onFocusOutside,o=>o.preventDefault())})}),_T=y.forwardRef((e,t)=>{const r=Sn(Ks,e.__scopeDialog),n=y.useRef(!1),a=y.useRef(!1);return l.jsx(iE,{...e,ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:o=>{var c,u;(c=e.onCloseAutoFocus)==null||c.call(e,o),o.defaultPrevented||(n.current||(u=r.triggerRef.current)==null||u.focus(),o.preventDefault()),n.current=!1,a.current=!1},onInteractOutside:o=>{var f,h;(f=e.onInteractOutside)==null||f.call(e,o),o.defaultPrevented||(n.current=!0,o.detail.originalEvent.type==="pointerdown"&&(a.current=!0));const c=o.target;((h=r.triggerRef.current)==null?void 0:h.contains(c))&&o.preventDefault(),o.detail.originalEvent.type==="focusin"&&a.current&&o.preventDefault()}})}),iE=y.forwardRef((e,t)=>{const{__scopeDialog:r,trapFocus:n,onOpenAutoFocus:a,onCloseAutoFocus:o,...c}=e,u=Sn(Ks,r);return $I(),l.jsx(l.Fragment,{children:l.jsx(zN,{asChild:!0,loop:!0,trapped:n,onMountAutoFocus:a,onUnmountAutoFocus:o,children:l.jsx(LN,{role:"dialog",id:u.contentId,"aria-describedby":u.descriptionId,"aria-labelledby":u.titleId,"data-state":Ey(u.open),...c,ref:t,deferPointerDownOutside:!0,onDismiss:()=>u.onOpenChange(!1)})})})}),aE="DialogTitle",MT=y.forwardRef((e,t)=>{const{__scopeDialog:r,...n}=e,a=Sn(aE,r);return l.jsx(Xt.h2,{id:a.titleId,...n,ref:t})});MT.displayName=aE;var oE="DialogDescription",IT=y.forwardRef((e,t)=>{const{__scopeDialog:r,...n}=e,a=Sn(oE,r);return l.jsx(Xt.p,{id:a.descriptionId,...n,ref:t})});IT.displayName=oE;var sE="DialogClose",TT=y.forwardRef((e,t)=>{const{__scopeDialog:r,...n}=e,a=Sn(sE,r);return l.jsx(Xt.button,{type:"button",...n,ref:t,onClick:ba(e.onClick,()=>a.onOpenChange(!1))})});TT.displayName=sE;function Ey(e){return e?"open":"closed"}var Zl='[cmdk-group=""]',lg='[cmdk-group-items=""]',DT='[cmdk-group-heading=""]',lE='[cmdk-item=""]',Dw=`${lE}:not([aria-disabled="true"])`,mv="cmdk-item-select",gs="data-value",RT=(e,t,r)=>X4(e,t,r),uE=y.createContext(void 0),Yu=()=>y.useContext(uE),cE=y.createContext(void 0),Ay=()=>y.useContext(cE),dE=y.createContext(void 0),fE=y.forwardRef((e,t)=>{let r=vs(()=>{var M,K;return{search:"",value:(K=(M=e.value)!=null?M:e.defaultValue)!=null?K:"",selectedItemId:void 0,filtered:{count:0,items:new Map,groups:new Set}}}),n=vs(()=>new Set),a=vs(()=>new Map),o=vs(()=>new Map),c=vs(()=>new Set),u=hE(e),{label:f,children:h,value:m,onValueChange:g,filter:v,shouldFilter:b,loop:j,disablePointerSelection:k=!1,vimBindings:S=!0,...N}=e,E=vi(),A=vi(),P=vi(),_=y.useRef(null),O=VT();yo(()=>{if(m!==void 0){let M=m.trim();r.current.value=M,D.emit()}},[m]),yo(()=>{O(6,pe)},[]);let D=y.useMemo(()=>({subscribe:M=>(c.current.add(M),()=>c.current.delete(M)),snapshot:()=>r.current,setState:(M,K,ne)=>{var Z,me,ge,Pe;if(!Object.is(r.current[M],K)){if(r.current[M]=K,M==="search")H(),F(),O(1,Y);else if(M==="value"){if(document.activeElement.hasAttribute("cmdk-input")||document.activeElement.hasAttribute("cmdk-root")){let re=document.getElementById(P);re?re.focus():(Z=document.getElementById(E))==null||Z.focus()}if(O(7,()=>{var re;r.current.selectedItemId=(re=ue())==null?void 0:re.id,D.emit()}),ne||O(5,pe),((me=u.current)==null?void 0:me.value)!==void 0){let re=K??"";(Pe=(ge=u.current).onValueChange)==null||Pe.call(ge,re);return}}D.emit()}},emit:()=>{c.current.forEach(M=>M())}}),[]),U=y.useMemo(()=>({value:(M,K,ne)=>{var Z;K!==((Z=o.current.get(M))==null?void 0:Z.value)&&(o.current.set(M,{value:K,keywords:ne}),r.current.filtered.items.set(M,B(K,ne)),O(2,()=>{F(),D.emit()}))},item:(M,K)=>(n.current.add(M),K&&(a.current.has(K)?a.current.get(K).add(M):a.current.set(K,new Set([M]))),O(3,()=>{H(),F(),r.current.value||Y(),D.emit()}),()=>{o.current.delete(M),n.current.delete(M),r.current.filtered.items.delete(M);let ne=ue();O(4,()=>{H(),(ne==null?void 0:ne.getAttribute("id"))===M&&Y(),D.emit()})}),group:M=>(a.current.has(M)||a.current.set(M,new Set),()=>{o.current.delete(M),a.current.delete(M)}),filter:()=>u.current.shouldFilter,label:f||e["aria-label"],getDisablePointerSelection:()=>u.current.disablePointerSelection,listId:E,inputId:P,labelId:A,listInnerRef:_}),[]);function B(M,K){var ne,Z;let me=(Z=(ne=u.current)==null?void 0:ne.filter)!=null?Z:RT;return M?me(M,r.current.search,K):0}function F(){if(!r.current.search||u.current.shouldFilter===!1)return;let M=r.current.filtered.items,K=[];r.current.filtered.groups.forEach(Z=>{let me=a.current.get(Z),ge=0;me.forEach(Pe=>{let re=M.get(Pe);ge=Math.max(re,ge)}),K.push([Z,ge])});let ne=_.current;he().sort((Z,me)=>{var ge,Pe;let re=Z.getAttribute("id"),xe=me.getAttribute("id");return((ge=M.get(xe))!=null?ge:0)-((Pe=M.get(re))!=null?Pe:0)}).forEach(Z=>{let me=Z.closest(lg);me?me.appendChild(Z.parentElement===me?Z:Z.closest(`${lg} > *`)):ne.appendChild(Z.parentElement===ne?Z:Z.closest(`${lg} > *`))}),K.sort((Z,me)=>me[1]-Z[1]).forEach(Z=>{var me;let ge=(me=_.current)==null?void 0:me.querySelector(`${Zl}[${gs}="${encodeURIComponent(Z[0])}"]`);ge==null||ge.parentElement.appendChild(ge)})}function Y(){let M=he().find(ne=>ne.getAttribute("aria-disabled")!=="true"),K=M==null?void 0:M.getAttribute(gs);D.setState("value",K||void 0)}function H(){var M,K,ne,Z;if(!r.current.search||u.current.shouldFilter===!1){r.current.filtered.count=n.current.size;return}r.current.filtered.groups=new Set;let me=0;for(let ge of n.current){let Pe=(K=(M=o.current.get(ge))==null?void 0:M.value)!=null?K:"",re=(Z=(ne=o.current.get(ge))==null?void 0:ne.keywords)!=null?Z:[],xe=B(Pe,re);r.current.filtered.items.set(ge,xe),xe>0&&me++}for(let[ge,Pe]of a.current)for(let re of Pe)if(r.current.filtered.items.get(re)>0){r.current.filtered.groups.add(ge);break}r.current.filtered.count=me}function pe(){var M,K,ne;let Z=ue();Z&&(((M=Z.parentElement)==null?void 0:M.firstChild)===Z&&((ne=(K=Z.closest(Zl))==null?void 0:K.querySelector(DT))==null||ne.scrollIntoView({block:"nearest"})),Z.scrollIntoView({block:"nearest"}))}function ue(){var M;return(M=_.current)==null?void 0:M.querySelector(`${lE}[aria-selected="true"]`)}function he(){var M;return Array.from(((M=_.current)==null?void 0:M.querySelectorAll(Dw))||[])}function ae(M){let K=he()[M];K&&D.setState("value",K.getAttribute(gs))}function se(M){var K;let ne=ue(),Z=he(),me=Z.findIndex(Pe=>Pe===ne),ge=Z[me+M];(K=u.current)!=null&&K.loop&&(ge=me+M<0?Z[Z.length-1]:me+M===Z.length?Z[0]:Z[me+M]),ge&&D.setState("value",ge.getAttribute(gs))}function X(M){let K=ue(),ne=K==null?void 0:K.closest(Zl),Z;for(;ne&&!Z;)ne=M>0?KT(ne,Zl):GT(ne,Zl),Z=ne==null?void 0:ne.querySelector(Dw);Z?D.setState("value",Z.getAttribute(gs)):se(M)}let te=()=>ae(he().length-1),J=M=>{M.preventDefault(),M.metaKey?te():M.altKey?X(1):se(1)},I=M=>{M.preventDefault(),M.metaKey?ae(0):M.altKey?X(-1):se(-1)};return y.createElement(Xt.div,{ref:t,tabIndex:-1,...N,"cmdk-root":"",onKeyDown:M=>{var K;(K=N.onKeyDown)==null||K.call(N,M);let ne=M.nativeEvent.isComposing||M.keyCode===229;if(!(M.defaultPrevented||ne))switch(M.key){case"n":case"j":{S&&M.ctrlKey&&J(M);break}case"ArrowDown":{J(M);break}case"p":case"k":{S&&M.ctrlKey&&I(M);break}case"ArrowUp":{I(M);break}case"Home":{M.preventDefault(),ae(0);break}case"End":{M.preventDefault(),te();break}case"Enter":{M.preventDefault();let Z=ue();if(Z){let me=new Event(mv);Z.dispatchEvent(me)}}}}},y.createElement("label",{"cmdk-label":"",htmlFor:U.inputId,id:U.labelId,style:QT},f),gh(e,M=>y.createElement(cE.Provider,{value:D},y.createElement(uE.Provider,{value:U},M))))}),LT=y.forwardRef((e,t)=>{var r,n;let a=vi(),o=y.useRef(null),c=y.useContext(dE),u=Yu(),f=hE(e),h=(n=(r=f.current)==null?void 0:r.forceMount)!=null?n:c==null?void 0:c.forceMount;yo(()=>{if(!h)return u.item(a,c==null?void 0:c.id)},[h]);let m=mE(a,o,[e.value,e.children,o],e.keywords),g=Ay(),v=ja(O=>O.value&&O.value===m.current),b=ja(O=>h||u.filter()===!1?!0:O.search?O.filtered.items.get(a)>0:!0);y.useEffect(()=>{let O=o.current;if(!(!O||e.disabled))return O.addEventListener(mv,j),()=>O.removeEventListener(mv,j)},[b,e.onSelect,e.disabled]);function j(){var O,D;k(),(D=(O=f.current).onSelect)==null||D.call(O,m.current)}function k(){g.setState("value",m.current,!0)}if(!b)return null;let{disabled:S,value:N,onSelect:E,forceMount:A,keywords:P,..._}=e;return y.createElement(Xt.div,{ref:Ws(o,t),..._,id:a,"cmdk-item":"",role:"option","aria-disabled":!!S,"aria-selected":!!v,"data-disabled":!!S,"data-selected":!!v,onPointerMove:S||u.getDisablePointerSelection()?void 0:k,onClick:S?void 0:j},e.children)}),$T=y.forwardRef((e,t)=>{let{heading:r,children:n,forceMount:a,...o}=e,c=vi(),u=y.useRef(null),f=y.useRef(null),h=vi(),m=Yu(),g=ja(b=>a||m.filter()===!1?!0:b.search?b.filtered.groups.has(c):!0);yo(()=>m.group(c),[]),mE(c,u,[e.value,e.heading,f]);let v=y.useMemo(()=>({id:c,forceMount:a}),[a]);return y.createElement(Xt.div,{ref:Ws(u,t),...o,"cmdk-group":"",role:"presentation",hidden:g?void 0:!0},r&&y.createElement("div",{ref:f,"cmdk-group-heading":"","aria-hidden":!0,id:h},r),gh(e,b=>y.createElement("div",{"cmdk-group-items":"",role:"group","aria-labelledby":r?h:void 0},y.createElement(dE.Provider,{value:v},b))))}),zT=y.forwardRef((e,t)=>{let{alwaysRender:r,...n}=e,a=y.useRef(null),o=ja(c=>!c.search);return!r&&!o?null:y.createElement(Xt.div,{ref:Ws(a,t),...n,"cmdk-separator":"",role:"separator"})}),FT=y.forwardRef((e,t)=>{let{onValueChange:r,...n}=e,a=e.value!=null,o=Ay(),c=ja(h=>h.search),u=ja(h=>h.selectedItemId),f=Yu();return y.useEffect(()=>{e.value!=null&&o.setState("search",e.value)},[e.value]),y.createElement(Xt.input,{ref:t,...n,"cmdk-input":"",autoComplete:"off",autoCorrect:"off",spellCheck:!1,"aria-autocomplete":"list",role:"combobox","aria-expanded":!0,"aria-controls":f.listId,"aria-labelledby":f.labelId,"aria-activedescendant":u,id:f.inputId,type:"text",value:a?e.value:c,onChange:h=>{a||o.setState("search",h.target.value),r==null||r(h.target.value)}})}),BT=y.forwardRef((e,t)=>{let{children:r,label:n="Suggestions",...a}=e,o=y.useRef(null),c=y.useRef(null),u=ja(h=>h.selectedItemId),f=Yu();return y.useEffect(()=>{if(c.current&&o.current){let h=c.current,m=o.current,g,v=new ResizeObserver(()=>{g=requestAnimationFrame(()=>{let b=h.offsetHeight;m.style.setProperty("--cmdk-list-height",b.toFixed(1)+"px")})});return v.observe(h),()=>{cancelAnimationFrame(g),v.unobserve(h)}}},[]),y.createElement(Xt.div,{ref:Ws(o,t),...a,"cmdk-list":"",role:"listbox",tabIndex:-1,"aria-activedescendant":u,"aria-label":n,id:f.listId},gh(e,h=>y.createElement("div",{ref:Ws(c,f.listInnerRef),"cmdk-list-sizer":""},h)))}),UT=y.forwardRef((e,t)=>{let{open:r,onOpenChange:n,overlayClassName:a,contentClassName:o,container:c,...u}=e;return y.createElement(ZN,{open:r,onOpenChange:n},y.createElement(tE,{container:c},y.createElement(rE,{"cmdk-overlay":"",className:a}),y.createElement(nE,{"aria-label":e.label,"cmdk-dialog":"",className:o},y.createElement(fE,{ref:t,...u}))))}),HT=y.forwardRef((e,t)=>ja(r=>r.filtered.count===0)?y.createElement(Xt.div,{ref:t,...e,"cmdk-empty":"",role:"presentation"}):null),WT=y.forwardRef((e,t)=>{let{progress:r,children:n,label:a="Loading...",...o}=e;return y.createElement(Xt.div,{ref:t,...o,"cmdk-loading":"",role:"progressbar","aria-valuenow":r,"aria-valuemin":0,"aria-valuemax":100,"aria-label":a},gh(e,c=>y.createElement("div",{"aria-hidden":!0},c)))}),ls=Object.assign(fE,{List:BT,Item:LT,Input:FT,Group:$T,Separator:zT,Dialog:UT,Empty:HT,Loading:WT});function KT(e,t){let r=e.nextElementSibling;for(;r;){if(r.matches(t))return r;r=r.nextElementSibling}}function GT(e,t){let r=e.previousElementSibling;for(;r;){if(r.matches(t))return r;r=r.previousElementSibling}}function hE(e){let t=y.useRef(e);return yo(()=>{t.current=e}),t}var yo=typeof window>"u"?y.useEffect:y.useLayoutEffect;function vs(e){let t=y.useRef();return t.current===void 0&&(t.current=e()),t}function ja(e){let t=Ay(),r=()=>e(t.snapshot());return y.useSyncExternalStore(t.subscribe,r,r)}function mE(e,t,r,n=[]){let a=y.useRef(),o=Yu();return yo(()=>{var c;let u=(()=>{var h;for(let m of r){if(typeof m=="string")return m.trim();if(typeof m=="object"&&"current"in m)return m.current?(h=m.current.textContent)==null?void 0:h.trim():a.current}})(),f=n.map(h=>h.trim());o.value(e,u,f),(c=t.current)==null||c.setAttribute(gs,u),a.current=u}),a}var VT=()=>{let[e,t]=y.useState(),r=vs(()=>new Map);return yo(()=>{r.current.forEach(n=>n()),r.current=new Map},[e]),(n,a)=>{r.current.set(n,a),t({})}};function qT(e){let t=e.type;return typeof t=="function"?t(e.props):"render"in t?t.render(e.props):e}function gh({asChild:e,children:t},r){return e&&y.isValidElement(t)?y.cloneElement(qT(t),{ref:t.ref},r(t.props.children)):r(t)}var QT={position:"absolute",width:"1px",height:"1px",padding:"0",margin:"-1px",overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0"};function YT({onNavigate:e}){const[t,r]=y.useState(!1);return y.useEffect(()=>{const n=a=>{(a.metaKey||a.ctrlKey)&&a.key.toLowerCase()==="k"&&(a.preventDefault(),r(o=>!o))};return document.addEventListener("keydown",n),()=>document.removeEventListener("keydown",n)},[]),l.jsx(ls.Dialog,{open:t,onOpenChange:r,label:"Befehlspalette",className:"fixed inset-0 z-50 flex items-start justify-center bg-black/50 p-4 pt-[12vh] overscroll-contain",onClick:()=>r(!1),children:l.jsxs("div",{className:"w-full max-w-lg overflow-hidden rounded-xl border border-border bg-popover text-popover-foreground shadow-2xl",onClick:n=>n.stopPropagation(),children:[l.jsx(ls.Input,{autoFocus:!0,placeholder:"Springe zu… (Modelle, Routing, System …)",className:"w-full border-b border-border bg-transparent px-4 py-3 text-sm outline-none placeholder:text-muted-foreground"}),l.jsxs(ls.List,{className:"max-h-80 overflow-y-auto p-2",children:[l.jsx(ls.Empty,{className:"px-3 py-6 text-center text-sm text-muted-foreground",children:"Nichts gefunden."}),l.jsx(ls.Group,{heading:"Bereiche",className:"px-1 py-1 text-xs text-muted-foreground",children:mu.map(n=>l.jsxs(ls.Item,{value:`${n.label} ${n.hint}`,onSelect:()=>{e(n.id),r(!1)},className:"flex cursor-pointer items-center gap-3 rounded-md px-3 py-2 text-sm text-foreground aria-selected:bg-accent aria-selected:text-accent-foreground",children:[l.jsx(n.icon,{className:"h-4 w-4 text-primary"}),l.jsx("span",{children:n.label}),l.jsx("span",{className:"ml-auto truncate text-xs text-muted-foreground",children:n.hint})]},n.id))})]})]})})}const pE="mc_expert_mode",pv="mc-expert-mode-change",XT=()=>{try{return localStorage.getItem(pE)==="true"}catch{return!1}};function ZT(e){return window.addEventListener(pv,e),window.addEventListener("storage",e),()=>{window.removeEventListener(pv,e),window.removeEventListener("storage",e)}}function Rw(e){localStorage.setItem(pE,String(e)),window.dispatchEvent(new Event(pv))}function gE(){return y.useSyncExternalStore(ZT,XT,()=>!1)}function vE(e){var t,r,n="";if(typeof e=="string"||typeof e=="number")n+=e;else if(typeof e=="object")if(Array.isArray(e)){var a=e.length;for(t=0;t{const t=tD(e),{conflictingClassGroups:r,conflictingClassGroupModifiers:n}=e;return{getClassGroupId:c=>{const u=c.split(Cy);return u[0]===""&&u.length!==1&&u.shift(),yE(u,t)||eD(c)},getConflictingClassGroupIds:(c,u)=>{const f=r[c]||[];return u&&n[c]?[...f,...n[c]]:f}}},yE=(e,t)=>{var c;if(e.length===0)return t.classGroupId;const r=e[0],n=t.nextPart.get(r),a=n?yE(e.slice(1),n):void 0;if(a)return a;if(t.validators.length===0)return;const o=e.join(Cy);return(c=t.validators.find(({validator:u})=>u(o)))==null?void 0:c.classGroupId},Lw=/^\[(.+)\]$/,eD=e=>{if(Lw.test(e)){const t=Lw.exec(e)[1],r=t==null?void 0:t.substring(0,t.indexOf(":"));if(r)return"arbitrary.."+r}},tD=e=>{const{theme:t,prefix:r}=e,n={nextPart:new Map,validators:[]};return nD(Object.entries(e.classGroups),r).forEach(([o,c])=>{gv(c,n,o,t)}),n},gv=(e,t,r,n)=>{e.forEach(a=>{if(typeof a=="string"){const o=a===""?t:$w(t,a);o.classGroupId=r;return}if(typeof a=="function"){if(rD(a)){gv(a(n),t,r,n);return}t.validators.push({validator:a,classGroupId:r});return}Object.entries(a).forEach(([o,c])=>{gv(c,$w(t,o),r,n)})})},$w=(e,t)=>{let r=e;return t.split(Cy).forEach(n=>{r.nextPart.has(n)||r.nextPart.set(n,{nextPart:new Map,validators:[]}),r=r.nextPart.get(n)}),r},rD=e=>e.isThemeGetter,nD=(e,t)=>t?e.map(([r,n])=>{const a=n.map(o=>typeof o=="string"?t+o:typeof o=="object"?Object.fromEntries(Object.entries(o).map(([c,u])=>[t+c,u])):o);return[r,a]}):e,iD=e=>{if(e<1)return{get:()=>{},set:()=>{}};let t=0,r=new Map,n=new Map;const a=(o,c)=>{r.set(o,c),t++,t>e&&(t=0,n=r,r=new Map)};return{get(o){let c=r.get(o);if(c!==void 0)return c;if((c=n.get(o))!==void 0)return a(o,c),c},set(o,c){r.has(o)?r.set(o,c):a(o,c)}}},xE="!",aD=e=>{const{separator:t,experimentalParseClassName:r}=e,n=t.length===1,a=t[0],o=t.length,c=u=>{const f=[];let h=0,m=0,g;for(let S=0;Sm?g-m:void 0;return{modifiers:f,hasImportantModifier:b,baseClassName:j,maybePostfixModifierPosition:k}};return r?u=>r({className:u,parseClassName:c}):c},oD=e=>{if(e.length<=1)return e;const t=[];let r=[];return e.forEach(n=>{n[0]==="["?(t.push(...r.sort(),n),r=[]):r.push(n)}),t.push(...r.sort()),t},sD=e=>({cache:iD(e.cacheSize),parseClassName:aD(e),...JT(e)}),lD=/\s+/,uD=(e,t)=>{const{parseClassName:r,getClassGroupId:n,getConflictingClassGroupIds:a}=t,o=[],c=e.trim().split(lD);let u="";for(let f=c.length-1;f>=0;f-=1){const h=c[f],{modifiers:m,hasImportantModifier:g,baseClassName:v,maybePostfixModifierPosition:b}=r(h);let j=!!b,k=n(j?v.substring(0,b):v);if(!k){if(!j){u=h+(u.length>0?" "+u:u);continue}if(k=n(v),!k){u=h+(u.length>0?" "+u:u);continue}j=!1}const S=oD(m).join(":"),N=g?S+xE:S,E=N+k;if(o.includes(E))continue;o.push(E);const A=a(k,j);for(let P=0;P0?" "+u:u)}return u};function cD(){let e=0,t,r,n="";for(;e{if(typeof e=="string")return e;let t,r="";for(let n=0;ng(m),e());return r=sD(h),n=r.cache.get,a=r.cache.set,o=u,u(f)}function u(f){const h=n(f);if(h)return h;const m=uD(f,r);return a(f,m),m}return function(){return o(cD.apply(null,arguments))}}const ot=e=>{const t=r=>r[e]||[];return t.isThemeGetter=!0,t},wE=/^\[(?:([a-z-]+):)?(.+)\]$/i,fD=/^\d+\/\d+$/,hD=new Set(["px","full","screen"]),mD=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,pD=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,gD=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,vD=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,yD=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,li=e=>Ss(e)||hD.has(e)||fD.test(e),ea=e=>rl(e,"length",ED),Ss=e=>!!e&&!Number.isNaN(Number(e)),ug=e=>rl(e,"number",Ss),Jl=e=>!!e&&Number.isInteger(Number(e)),xD=e=>e.endsWith("%")&&Ss(e.slice(0,-1)),$e=e=>wE.test(e),ta=e=>mD.test(e),bD=new Set(["length","size","percentage"]),wD=e=>rl(e,bD,kE),kD=e=>rl(e,"position",kE),jD=new Set(["image","url"]),SD=e=>rl(e,jD,CD),ND=e=>rl(e,"",AD),eu=()=>!0,rl=(e,t,r)=>{const n=wE.exec(e);return n?n[1]?typeof t=="string"?n[1]===t:t.has(n[1]):r(n[2]):!1},ED=e=>pD.test(e)&&!gD.test(e),kE=()=>!1,AD=e=>vD.test(e),CD=e=>yD.test(e),PD=()=>{const e=ot("colors"),t=ot("spacing"),r=ot("blur"),n=ot("brightness"),a=ot("borderColor"),o=ot("borderRadius"),c=ot("borderSpacing"),u=ot("borderWidth"),f=ot("contrast"),h=ot("grayscale"),m=ot("hueRotate"),g=ot("invert"),v=ot("gap"),b=ot("gradientColorStops"),j=ot("gradientColorStopPositions"),k=ot("inset"),S=ot("margin"),N=ot("opacity"),E=ot("padding"),A=ot("saturate"),P=ot("scale"),_=ot("sepia"),O=ot("skew"),D=ot("space"),U=ot("translate"),B=()=>["auto","contain","none"],F=()=>["auto","hidden","clip","visible","scroll"],Y=()=>["auto",$e,t],H=()=>[$e,t],pe=()=>["",li,ea],ue=()=>["auto",Ss,$e],he=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],ae=()=>["solid","dashed","dotted","double","none"],se=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],X=()=>["start","end","center","between","around","evenly","stretch"],te=()=>["","0",$e],J=()=>["auto","avoid","all","avoid-page","page","left","right","column"],I=()=>[Ss,$e];return{cacheSize:500,separator:":",theme:{colors:[eu],spacing:[li,ea],blur:["none","",ta,$e],brightness:I(),borderColor:[e],borderRadius:["none","","full",ta,$e],borderSpacing:H(),borderWidth:pe(),contrast:I(),grayscale:te(),hueRotate:I(),invert:te(),gap:H(),gradientColorStops:[e],gradientColorStopPositions:[xD,ea],inset:Y(),margin:Y(),opacity:I(),padding:H(),saturate:I(),scale:I(),sepia:te(),skew:I(),space:H(),translate:H()},classGroups:{aspect:[{aspect:["auto","square","video",$e]}],container:["container"],columns:[{columns:[ta]}],"break-after":[{"break-after":J()}],"break-before":[{"break-before":J()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...he(),$e]}],overflow:[{overflow:F()}],"overflow-x":[{"overflow-x":F()}],"overflow-y":[{"overflow-y":F()}],overscroll:[{overscroll:B()}],"overscroll-x":[{"overscroll-x":B()}],"overscroll-y":[{"overscroll-y":B()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[k]}],"inset-x":[{"inset-x":[k]}],"inset-y":[{"inset-y":[k]}],start:[{start:[k]}],end:[{end:[k]}],top:[{top:[k]}],right:[{right:[k]}],bottom:[{bottom:[k]}],left:[{left:[k]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",Jl,$e]}],basis:[{basis:Y()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",$e]}],grow:[{grow:te()}],shrink:[{shrink:te()}],order:[{order:["first","last","none",Jl,$e]}],"grid-cols":[{"grid-cols":[eu]}],"col-start-end":[{col:["auto",{span:["full",Jl,$e]},$e]}],"col-start":[{"col-start":ue()}],"col-end":[{"col-end":ue()}],"grid-rows":[{"grid-rows":[eu]}],"row-start-end":[{row:["auto",{span:[Jl,$e]},$e]}],"row-start":[{"row-start":ue()}],"row-end":[{"row-end":ue()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",$e]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",$e]}],gap:[{gap:[v]}],"gap-x":[{"gap-x":[v]}],"gap-y":[{"gap-y":[v]}],"justify-content":[{justify:["normal",...X()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...X(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...X(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[E]}],px:[{px:[E]}],py:[{py:[E]}],ps:[{ps:[E]}],pe:[{pe:[E]}],pt:[{pt:[E]}],pr:[{pr:[E]}],pb:[{pb:[E]}],pl:[{pl:[E]}],m:[{m:[S]}],mx:[{mx:[S]}],my:[{my:[S]}],ms:[{ms:[S]}],me:[{me:[S]}],mt:[{mt:[S]}],mr:[{mr:[S]}],mb:[{mb:[S]}],ml:[{ml:[S]}],"space-x":[{"space-x":[D]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[D]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",$e,t]}],"min-w":[{"min-w":[$e,t,"min","max","fit"]}],"max-w":[{"max-w":[$e,t,"none","full","min","max","fit","prose",{screen:[ta]},ta]}],h:[{h:[$e,t,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[$e,t,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[$e,t,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[$e,t,"auto","min","max","fit"]}],"font-size":[{text:["base",ta,ea]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",ug]}],"font-family":[{font:[eu]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",$e]}],"line-clamp":[{"line-clamp":["none",Ss,ug]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",li,$e]}],"list-image":[{"list-image":["none",$e]}],"list-style-type":[{list:["none","disc","decimal",$e]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[e]}],"placeholder-opacity":[{"placeholder-opacity":[N]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[e]}],"text-opacity":[{"text-opacity":[N]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...ae(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",li,ea]}],"underline-offset":[{"underline-offset":["auto",li,$e]}],"text-decoration-color":[{decoration:[e]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:H()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",$e]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",$e]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[N]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...he(),kD]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",wD]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},SD]}],"bg-color":[{bg:[e]}],"gradient-from-pos":[{from:[j]}],"gradient-via-pos":[{via:[j]}],"gradient-to-pos":[{to:[j]}],"gradient-from":[{from:[b]}],"gradient-via":[{via:[b]}],"gradient-to":[{to:[b]}],rounded:[{rounded:[o]}],"rounded-s":[{"rounded-s":[o]}],"rounded-e":[{"rounded-e":[o]}],"rounded-t":[{"rounded-t":[o]}],"rounded-r":[{"rounded-r":[o]}],"rounded-b":[{"rounded-b":[o]}],"rounded-l":[{"rounded-l":[o]}],"rounded-ss":[{"rounded-ss":[o]}],"rounded-se":[{"rounded-se":[o]}],"rounded-ee":[{"rounded-ee":[o]}],"rounded-es":[{"rounded-es":[o]}],"rounded-tl":[{"rounded-tl":[o]}],"rounded-tr":[{"rounded-tr":[o]}],"rounded-br":[{"rounded-br":[o]}],"rounded-bl":[{"rounded-bl":[o]}],"border-w":[{border:[u]}],"border-w-x":[{"border-x":[u]}],"border-w-y":[{"border-y":[u]}],"border-w-s":[{"border-s":[u]}],"border-w-e":[{"border-e":[u]}],"border-w-t":[{"border-t":[u]}],"border-w-r":[{"border-r":[u]}],"border-w-b":[{"border-b":[u]}],"border-w-l":[{"border-l":[u]}],"border-opacity":[{"border-opacity":[N]}],"border-style":[{border:[...ae(),"hidden"]}],"divide-x":[{"divide-x":[u]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[u]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[N]}],"divide-style":[{divide:ae()}],"border-color":[{border:[a]}],"border-color-x":[{"border-x":[a]}],"border-color-y":[{"border-y":[a]}],"border-color-s":[{"border-s":[a]}],"border-color-e":[{"border-e":[a]}],"border-color-t":[{"border-t":[a]}],"border-color-r":[{"border-r":[a]}],"border-color-b":[{"border-b":[a]}],"border-color-l":[{"border-l":[a]}],"divide-color":[{divide:[a]}],"outline-style":[{outline:["",...ae()]}],"outline-offset":[{"outline-offset":[li,$e]}],"outline-w":[{outline:[li,ea]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:pe()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[e]}],"ring-opacity":[{"ring-opacity":[N]}],"ring-offset-w":[{"ring-offset":[li,ea]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",ta,ND]}],"shadow-color":[{shadow:[eu]}],opacity:[{opacity:[N]}],"mix-blend":[{"mix-blend":[...se(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":se()}],filter:[{filter:["","none"]}],blur:[{blur:[r]}],brightness:[{brightness:[n]}],contrast:[{contrast:[f]}],"drop-shadow":[{"drop-shadow":["","none",ta,$e]}],grayscale:[{grayscale:[h]}],"hue-rotate":[{"hue-rotate":[m]}],invert:[{invert:[g]}],saturate:[{saturate:[A]}],sepia:[{sepia:[_]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[r]}],"backdrop-brightness":[{"backdrop-brightness":[n]}],"backdrop-contrast":[{"backdrop-contrast":[f]}],"backdrop-grayscale":[{"backdrop-grayscale":[h]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[m]}],"backdrop-invert":[{"backdrop-invert":[g]}],"backdrop-opacity":[{"backdrop-opacity":[N]}],"backdrop-saturate":[{"backdrop-saturate":[A]}],"backdrop-sepia":[{"backdrop-sepia":[_]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[c]}],"border-spacing-x":[{"border-spacing-x":[c]}],"border-spacing-y":[{"border-spacing-y":[c]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",$e]}],duration:[{duration:I()}],ease:[{ease:["linear","in","out","in-out",$e]}],delay:[{delay:I()}],animate:[{animate:["none","spin","ping","pulse","bounce",$e]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[P]}],"scale-x":[{"scale-x":[P]}],"scale-y":[{"scale-y":[P]}],rotate:[{rotate:[Jl,$e]}],"translate-x":[{"translate-x":[U]}],"translate-y":[{"translate-y":[U]}],"skew-x":[{"skew-x":[O]}],"skew-y":[{"skew-y":[O]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",$e]}],accent:[{accent:["auto",e]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",$e]}],"caret-color":[{caret:[e]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":H()}],"scroll-mx":[{"scroll-mx":H()}],"scroll-my":[{"scroll-my":H()}],"scroll-ms":[{"scroll-ms":H()}],"scroll-me":[{"scroll-me":H()}],"scroll-mt":[{"scroll-mt":H()}],"scroll-mr":[{"scroll-mr":H()}],"scroll-mb":[{"scroll-mb":H()}],"scroll-ml":[{"scroll-ml":H()}],"scroll-p":[{"scroll-p":H()}],"scroll-px":[{"scroll-px":H()}],"scroll-py":[{"scroll-py":H()}],"scroll-ps":[{"scroll-ps":H()}],"scroll-pe":[{"scroll-pe":H()}],"scroll-pt":[{"scroll-pt":H()}],"scroll-pr":[{"scroll-pr":H()}],"scroll-pb":[{"scroll-pb":H()}],"scroll-pl":[{"scroll-pl":H()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",$e]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[li,ea,ug]}],stroke:[{stroke:[e,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}},OD=dD(PD);function ee(...e){return OD(nt(e))}function Gs(e){return e?e.replace(/127\.0\.0\.1|localhost/g,"192.168.178.151"):""}function jE(){const e=gE();return l.jsxs("div",{className:"flex items-center rounded-md border border-border/40 bg-background/40 p-0.5",role:"group","aria-label":"Ansichtsmodus",title:"Einfach zeigt nur das Wichtigste. Experte zeigt alle technischen Details.",children:[l.jsxs("button",{onClick:()=>Rw(!1),"aria-pressed":!e,className:ee("flex items-center gap-1 rounded px-2 py-1 text-xs font-semibold transition-all cursor-pointer",e?"text-muted-foreground hover:text-foreground":"bg-primary/15 text-primary shadow-sm"),children:[l.jsx(xs,{className:"h-3.5 w-3.5"})," Einfach"]}),l.jsxs("button",{onClick:()=>Rw(!0),"aria-pressed":e,className:ee("flex items-center gap-1 rounded px-2 py-1 text-xs font-semibold transition-all cursor-pointer",e?"bg-primary/15 text-primary shadow-sm":"text-muted-foreground hover:text-foreground"),children:[l.jsx($4,{className:"h-3.5 w-3.5"})," Experte"]})]})}async function Se(e,t){var f;const r={"Content-Type":"application/json",...t==null?void 0:t.headers},n=localStorage.getItem("mc_sudo_password"),a=localStorage.getItem("mc_hf_token");n&&(r["X-Sudo-Password"]=n);let o=t==null?void 0:t.body;if((((f=t==null?void 0:t.method)==null?void 0:f.toUpperCase())||"GET")==="POST"){if(typeof o=="string")try{const h=JSON.parse(o);let m=!1;n&&!("sudo_password"in h)&&(h.sudo_password=n,m=!0),a&&!("hf_token"in h)&&(h.hf_token=a,m=!0),m&&(o=JSON.stringify(h))}catch{}else if(!o){const h={};n&&(h.sudo_password=n),a&&(h.hf_token=a),Object.keys(h).length>0&&(o=JSON.stringify(h))}}const u=await fetch(e,{...t,headers:r,body:o});if(!u.ok)throw new Error(`${u.status} ${u.statusText}`);return u.json()}const SE=(e,t,r=!1,n=!0)=>Se("/api/groups",{method:"PUT",body:JSON.stringify({group:e,members:t,swap:r,persist:n})}),_D=e=>Se("/api/routing/policy",{method:"PUT",body:JSON.stringify(e)}),Ve={health:["health"],systemStatus:["system-status"],services:["services"],models:["models"],groups:["groups"],routing:["routing"],routingPolicy:["routing-policy"],voiceMetrics:["voice-metrics"],jobs:["jobs"],tokenStats:["token-stats"],agentStatus:["agent-status"],hermesBrain:["hermes-brain"],updates:["updates"],discover:["discover"],drafts:e=>["drafts",e??""],connect:e=>["connect",e??""],connectHealth:["connect-health"],memory:(e,t)=>["memory",e??"",t??""],memoryGraph:["memory-graph"]},MD=(e=!0)=>$t({queryKey:Ve.memoryGraph,queryFn:()=>Se("/api/memory/graph"),enabled:e}),Py=()=>$t({queryKey:Ve.health,queryFn:()=>Se("/api/health"),refetchInterval:1e4}),Po=(e=5e3)=>$t({queryKey:Ve.systemStatus,queryFn:()=>Se("/api/system/status"),refetchInterval:e}),NE=(e=3e3)=>$t({queryKey:Ve.services,queryFn:()=>Se("/api/system/services"),refetchInterval:e}),Ni=(e=4e3)=>$t({queryKey:Ve.models,queryFn:()=>Se("/api/models"),refetchInterval:e}),EE=(e=8e3)=>$t({queryKey:Ve.groups,queryFn:()=>Se("/api/groups"),refetchInterval:e}),ID=(e=5e3)=>$t({queryKey:Ve.voiceMetrics,queryFn:()=>Se("/api/voice/metrics"),refetchInterval:e}),TD=()=>$t({queryKey:Ve.routingPolicy,queryFn:()=>Se("/api/routing/policy")}),DD=(e=2e3)=>$t({queryKey:Ve.jobs,queryFn:()=>Se("/api/jobs"),refetchInterval:e,select:t=>t.jobs??[]}),Oy=(e=3e3)=>$t({queryKey:Ve.tokenStats,queryFn:()=>Se("/api/system/token-stats"),refetchInterval:e}),_y=(e=5e3)=>$t({queryKey:Ve.agentStatus,queryFn:()=>Se("/api/agent/status"),refetchInterval:e}),AE=(e=6e4)=>$t({queryKey:Ve.hermesBrain,queryFn:()=>Se("/api/agent/brain"),refetchInterval:e}),vh=e=>$t({queryKey:Ve.updates,queryFn:()=>Se("/api/maintenance/updates"),refetchInterval:e}),RD=()=>$t({queryKey:Ve.discover,queryFn:()=>Se("/api/discover")}),LD=e=>$t({queryKey:Ve.drafts(e),queryFn:()=>Se(`/api/models/drafts?target=${encodeURIComponent(e??"")}`),enabled:!!e}),$D=e=>$t({queryKey:Ve.connect(e),queryFn:()=>Se(e?`/api/connect?${e}`:"/api/connect")}),zD=()=>$t({queryKey:Ve.connectHealth,queryFn:()=>Se("/api/connect/health"),refetchInterval:15e3}),vv=e=>$t({queryKey:Ve.memory(e==null?void 0:e.q,e==null?void 0:e.category),queryFn:()=>{const t=new URLSearchParams;return e!=null&&e.q&&t.set("q",e.q),e!=null&&e.category&&t.set("category",e.category),Se(`/api/memory?${t}`)},select:t=>e!=null&&e.limit?t.slice(0,e.limit):t});let yv=[],xv=[];const bv=new Set,CE=()=>bv.forEach(e=>e());function PE(e){return bv.add(e),()=>{bv.delete(e)}}function FD(e){yv=[...yv,e].slice(-40),CE()}function BD(e){xv=[...xv,e].slice(-40),CE()}const UD=()=>y.useSyncExternalStore(PE,()=>yv),HD=()=>y.useSyncExternalStore(PE,()=>xv);function WD(){const{data:e,dataUpdatedAt:t}=Po(3e3),{data:r,dataUpdatedAt:n}=Oy(3e3),a=y.useRef(null);y.useEffect(()=>{var o,c,u,f;e&&FD({t:Date.now(),cpu:((o=e.cpu)==null?void 0:o.percent)??0,ram:((c=e.ram)==null?void 0:c.percent)??0,gpu:((u=e.gpu)==null?void 0:u.busy_percent)??null,disk:((f=e.disk)==null?void 0:f.percent)??null})},[t]),y.useEffect(()=>{if(!r)return;const o=Date.now(),c=r.prompt_tokens,u=r.completion_tokens;if(a.current){const f=Math.max((o-a.current.t)/1e3,.001);BD({t:o,prompt:Math.max(0,(c-a.current.p)/f),completion:Math.max(0,(u-a.current.c)/f)})}a.current={p:c,c:u,t:o}},[n])}function KD(){const{data:e,error:t}=Po(3e3),r=UD();return{sys:e,hist:r,error:t}}function aa(e){return(e/1024**3).toFixed(1)}function wv(e){return e?e>1024**3?`${(e/1024**3).toFixed(1)} GB`:`${(e/1024**2).toFixed(0)} MB`:""}function Lr(e){if(!e)return"—";const t=e/1024**3;return t>=1?`${t.toFixed(1)} GB`:`${(e/1024**2).toFixed(0)} MB`}function GD(e){if(!e)return"";const t=Math.floor(e/60);return t>0?`${t} min`:`${e} s`}function zw(e){return e?`${Math.round(e/1024)}k`:"—"}var VD=["dangerouslySetInnerHTML","onCopy","onCopyCapture","onCut","onCutCapture","onPaste","onPasteCapture","onCompositionEnd","onCompositionEndCapture","onCompositionStart","onCompositionStartCapture","onCompositionUpdate","onCompositionUpdateCapture","onFocus","onFocusCapture","onBlur","onBlurCapture","onChange","onChangeCapture","onBeforeInput","onBeforeInputCapture","onInput","onInputCapture","onReset","onResetCapture","onSubmit","onSubmitCapture","onInvalid","onInvalidCapture","onLoad","onLoadCapture","onError","onErrorCapture","onKeyDown","onKeyDownCapture","onKeyPress","onKeyPressCapture","onKeyUp","onKeyUpCapture","onAbort","onAbortCapture","onCanPlay","onCanPlayCapture","onCanPlayThrough","onCanPlayThroughCapture","onDurationChange","onDurationChangeCapture","onEmptied","onEmptiedCapture","onEncrypted","onEncryptedCapture","onEnded","onEndedCapture","onLoadedData","onLoadedDataCapture","onLoadedMetadata","onLoadedMetadataCapture","onLoadStart","onLoadStartCapture","onPause","onPauseCapture","onPlay","onPlayCapture","onPlaying","onPlayingCapture","onProgress","onProgressCapture","onRateChange","onRateChangeCapture","onSeeked","onSeekedCapture","onSeeking","onSeekingCapture","onStalled","onStalledCapture","onSuspend","onSuspendCapture","onTimeUpdate","onTimeUpdateCapture","onVolumeChange","onVolumeChangeCapture","onWaiting","onWaitingCapture","onAuxClick","onAuxClickCapture","onClick","onClickCapture","onContextMenu","onContextMenuCapture","onDoubleClick","onDoubleClickCapture","onDrag","onDragCapture","onDragEnd","onDragEndCapture","onDragEnter","onDragEnterCapture","onDragExit","onDragExitCapture","onDragLeave","onDragLeaveCapture","onDragOver","onDragOverCapture","onDragStart","onDragStartCapture","onDrop","onDropCapture","onMouseDown","onMouseDownCapture","onMouseEnter","onMouseLeave","onMouseMove","onMouseMoveCapture","onMouseOut","onMouseOutCapture","onMouseOver","onMouseOverCapture","onMouseUp","onMouseUpCapture","onSelect","onSelectCapture","onTouchCancel","onTouchCancelCapture","onTouchEnd","onTouchEndCapture","onTouchMove","onTouchMoveCapture","onTouchStart","onTouchStartCapture","onPointerDown","onPointerDownCapture","onPointerMove","onPointerMoveCapture","onPointerUp","onPointerUpCapture","onPointerCancel","onPointerCancelCapture","onPointerEnter","onPointerEnterCapture","onPointerLeave","onPointerLeaveCapture","onPointerOver","onPointerOverCapture","onPointerOut","onPointerOutCapture","onGotPointerCapture","onGotPointerCaptureCapture","onLostPointerCapture","onLostPointerCaptureCapture","onScroll","onScrollCapture","onWheel","onWheelCapture","onAnimationStart","onAnimationStartCapture","onAnimationEnd","onAnimationEndCapture","onAnimationIteration","onAnimationIterationCapture","onTransitionEnd","onTransitionEndCapture"];function My(e){if(typeof e!="string")return!1;var t=VD;return t.includes(e)}var qD=["aria-activedescendant","aria-atomic","aria-autocomplete","aria-busy","aria-checked","aria-colcount","aria-colindex","aria-colspan","aria-controls","aria-current","aria-describedby","aria-details","aria-disabled","aria-errormessage","aria-expanded","aria-flowto","aria-haspopup","aria-hidden","aria-invalid","aria-keyshortcuts","aria-label","aria-labelledby","aria-level","aria-live","aria-modal","aria-multiline","aria-multiselectable","aria-orientation","aria-owns","aria-placeholder","aria-posinset","aria-pressed","aria-readonly","aria-relevant","aria-required","aria-roledescription","aria-rowcount","aria-rowindex","aria-rowspan","aria-selected","aria-setsize","aria-sort","aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext","className","color","height","id","lang","max","media","method","min","name","style","target","width","role","tabIndex","accentHeight","accumulate","additive","alignmentBaseline","allowReorder","alphabetic","amplitude","arabicForm","ascent","attributeName","attributeType","autoReverse","azimuth","baseFrequency","baselineShift","baseProfile","bbox","begin","bias","by","calcMode","capHeight","clip","clipPath","clipPathUnits","clipRule","colorInterpolation","colorInterpolationFilters","colorProfile","colorRendering","contentScriptType","contentStyleType","cursor","cx","cy","d","decelerate","descent","diffuseConstant","direction","display","divisor","dominantBaseline","dur","dx","dy","edgeMode","elevation","enableBackground","end","exponent","externalResourcesRequired","fill","fillOpacity","fillRule","filter","filterRes","filterUnits","floodColor","floodOpacity","focusable","fontFamily","fontSize","fontSizeAdjust","fontStretch","fontStyle","fontVariant","fontWeight","format","from","fx","fy","g1","g2","glyphName","glyphOrientationHorizontal","glyphOrientationVertical","glyphRef","gradientTransform","gradientUnits","hanging","horizAdvX","horizOriginX","href","ideographic","imageRendering","in2","in","intercept","k1","k2","k3","k4","k","kernelMatrix","kernelUnitLength","kerning","keyPoints","keySplines","keyTimes","lengthAdjust","letterSpacing","lightingColor","limitingConeAngle","local","markerEnd","markerHeight","markerMid","markerStart","markerUnits","markerWidth","mask","maskContentUnits","maskUnits","mathematical","mode","numOctaves","offset","opacity","operator","order","orient","orientation","origin","overflow","overlinePosition","overlineThickness","paintOrder","panose1","pathLength","patternContentUnits","patternTransform","patternUnits","pointerEvents","pointsAtX","pointsAtY","pointsAtZ","preserveAlpha","preserveAspectRatio","primitiveUnits","r","radius","refX","refY","renderingIntent","repeatCount","repeatDur","requiredExtensions","requiredFeatures","restart","result","rotate","rx","ry","seed","shapeRendering","slope","spacing","specularConstant","specularExponent","speed","spreadMethod","startOffset","stdDeviation","stemh","stemv","stitchTiles","stopColor","stopOpacity","strikethroughPosition","strikethroughThickness","string","stroke","strokeDasharray","strokeDashoffset","strokeLinecap","strokeLinejoin","strokeMiterlimit","strokeOpacity","strokeWidth","surfaceScale","systemLanguage","tableValues","targetX","targetY","textAnchor","textDecoration","textLength","textRendering","to","transform","u1","u2","underlinePosition","underlineThickness","unicode","unicodeBidi","unicodeRange","unitsPerEm","vAlphabetic","values","vectorEffect","version","vertAdvY","vertOriginX","vertOriginY","vHanging","vIdeographic","viewTarget","visibility","vMathematical","widths","wordSpacing","writingMode","x1","x2","x","xChannelSelector","xHeight","xlinkActuate","xlinkArcrole","xlinkHref","xlinkRole","xlinkShow","xlinkTitle","xlinkType","xmlBase","xmlLang","xmlns","xmlnsXlink","xmlSpace","y1","y2","y","yChannelSelector","z","zoomAndPan","ref","key","angle"],QD=new Set(qD);function OE(e){return typeof e!="string"?!1:QD.has(e)}function _E(e){return typeof e=="string"&&e.startsWith("data-")}function kn(e){if(typeof e!="object"||e===null)return{};var t={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(OE(r)||_E(r))&&(t[r]=e[r]);return t}function yh(e){if(e==null)return null;if(y.isValidElement(e)&&typeof e.props=="object"&&e.props!==null){var t=e.props;return kn(t)}return typeof e=="object"&&!Array.isArray(e)?kn(e):null}function rn(e){var t={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(OE(r)||_E(r)||My(r))&&(t[r]=e[r]);return t}function YD(e){return e==null?null:y.isValidElement(e)?rn(e.props):typeof e=="object"&&!Array.isArray(e)?rn(e):null}var XD=["children","width","height","viewBox","className","style","title","desc"];function kv(){return kv=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var r=e.children,n=e.width,a=e.height,o=e.viewBox,c=e.className,u=e.style,f=e.title,h=e.desc,m=ZD(e,XD),g=o||{width:n,height:a,x:0,y:0},v=nt("recharts-surface",c);return y.createElement("svg",kv({},rn(m),{className:v,width:n,height:a,style:u,viewBox:"".concat(g.x," ").concat(g.y," ").concat(g.width," ").concat(g.height),ref:t}),y.createElement("title",null,f),y.createElement("desc",null,h),r)}),eR=["children","className"];function jv(){return jv=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var r=e.children,n=e.className,a=tR(e,eR),o=nt("recharts-layer",n);return y.createElement("g",jv({className:o},rn(a),{ref:t}),r)}),nR=y.createContext(null);function yt(e){return function(){return e}}const Sv=Math.PI,Nv=2*Sv,qa=1e-6,iR=Nv-qa;function IE(e){this._+=e[0];for(let t=1,r=e.length;t=0))throw new Error(`invalid digits: ${e}`);if(t>15)return IE;const r=10**t;return function(n){this._+=n[0];for(let a=1,o=n.length;aqa)if(!(Math.abs(g*f-h*m)>qa)||!o)this._append`L${this._x1=t},${this._y1=r}`;else{let b=n-c,j=a-u,k=f*f+h*h,S=b*b+j*j,N=Math.sqrt(k),E=Math.sqrt(v),A=o*Math.tan((Sv-Math.acos((k+v-S)/(2*N*E)))/2),P=A/E,_=A/N;Math.abs(P-1)>qa&&this._append`L${t+P*m},${r+P*g}`,this._append`A${o},${o},0,0,${+(g*b>m*j)},${this._x1=t+_*f},${this._y1=r+_*h}`}}arc(t,r,n,a,o,c){if(t=+t,r=+r,n=+n,c=!!c,n<0)throw new Error(`negative radius: ${n}`);let u=n*Math.cos(a),f=n*Math.sin(a),h=t+u,m=r+f,g=1^c,v=c?a-o:o-a;this._x1===null?this._append`M${h},${m}`:(Math.abs(this._x1-h)>qa||Math.abs(this._y1-m)>qa)&&this._append`L${h},${m}`,n&&(v<0&&(v=v%Nv+Nv),v>iR?this._append`A${n},${n},0,1,${g},${t-u},${r-f}A${n},${n},0,1,${g},${this._x1=h},${this._y1=m}`:v>qa&&this._append`A${n},${n},0,${+(v>=Sv)},${g},${this._x1=t+n*Math.cos(o)},${this._y1=r+n*Math.sin(o)}`)}rect(t,r,n,a){this._append`M${this._x0=this._x1=+t},${this._y0=this._y1=+r}h${n=+n}v${+a}h${-n}Z`}toString(){return this._}}function TE(e){let t=3;return e.digits=function(r){if(!arguments.length)return t;if(r==null)t=null;else{const n=Math.floor(r);if(!(n>=0))throw new RangeError(`invalid digits: ${r}`);t=n}return e},()=>new oR(t)}function Iy(e){return typeof e=="object"&&"length"in e?e:Array.from(e)}function DE(e){this._context=e}DE.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:this._context.lineTo(e,t);break}}};function xh(e){return new DE(e)}function RE(e){return e[0]}function LE(e){return e[1]}function $E(e,t){var r=yt(!0),n=null,a=xh,o=null,c=TE(u);e=typeof e=="function"?e:e===void 0?RE:yt(e),t=typeof t=="function"?t:t===void 0?LE:yt(t);function u(f){var h,m=(f=Iy(f)).length,g,v=!1,b;for(n==null&&(o=a(b=c())),h=0;h<=m;++h)!(h=b;--j)u.point(A[j],P[j]);u.lineEnd(),u.areaEnd()}N&&(A[v]=+e(S,v,g),P[v]=+t(S,v,g),u.point(n?+n(S,v,g):A[v],r?+r(S,v,g):P[v]))}if(E)return u=null,E+""||null}function m(){return $E().defined(a).curve(c).context(o)}return h.x=function(g){return arguments.length?(e=typeof g=="function"?g:yt(+g),n=null,h):e},h.x0=function(g){return arguments.length?(e=typeof g=="function"?g:yt(+g),h):e},h.x1=function(g){return arguments.length?(n=g==null?null:typeof g=="function"?g:yt(+g),h):n},h.y=function(g){return arguments.length?(t=typeof g=="function"?g:yt(+g),r=null,h):t},h.y0=function(g){return arguments.length?(t=typeof g=="function"?g:yt(+g),h):t},h.y1=function(g){return arguments.length?(r=g==null?null:typeof g=="function"?g:yt(+g),h):r},h.lineX0=h.lineY0=function(){return m().x(e).y(t)},h.lineY1=function(){return m().x(e).y(r)},h.lineX1=function(){return m().x(n).y(t)},h.defined=function(g){return arguments.length?(a=typeof g=="function"?g:yt(!!g),h):a},h.curve=function(g){return arguments.length?(c=g,o!=null&&(u=c(o)),h):c},h.context=function(g){return arguments.length?(g==null?o=u=null:u=c(o=g),h):o},h}class zE{constructor(t,r){this._context=t,this._x=r}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line}point(t,r){switch(t=+t,r=+r,this._point){case 0:{this._point=1,this._line?this._context.lineTo(t,r):this._context.moveTo(t,r);break}case 1:this._point=2;default:{this._x?this._context.bezierCurveTo(this._x0=(this._x0+t)/2,this._y0,this._x0,r,t,r):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+r)/2,t,this._y0,t,r);break}}this._x0=t,this._y0=r}}function sR(e){return new zE(e,!0)}function lR(e){return new zE(e,!1)}function mf(){}function pf(e,t,r){e._context.bezierCurveTo((2*e._x0+e._x1)/3,(2*e._y0+e._y1)/3,(e._x0+2*e._x1)/3,(e._y0+2*e._y1)/3,(e._x0+4*e._x1+t)/6,(e._y0+4*e._y1+r)/6)}function FE(e){this._context=e}FE.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:pf(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:pf(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function uR(e){return new FE(e)}function BE(e){this._context=e}BE.prototype={areaStart:mf,areaEnd:mf,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:{this._context.moveTo(this._x2,this._y2),this._context.closePath();break}case 2:{this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break}case 3:{this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4);break}}},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._x2=e,this._y2=t;break;case 1:this._point=2,this._x3=e,this._y3=t;break;case 2:this._point=3,this._x4=e,this._y4=t,this._context.moveTo((this._x0+4*this._x1+e)/6,(this._y0+4*this._y1+t)/6);break;default:pf(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function cR(e){return new BE(e)}function UE(e){this._context=e}UE.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var r=(this._x0+4*this._x1+e)/6,n=(this._y0+4*this._y1+t)/6;this._line?this._context.lineTo(r,n):this._context.moveTo(r,n);break;case 3:this._point=4;default:pf(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function dR(e){return new UE(e)}function HE(e){this._context=e}HE.prototype={areaStart:mf,areaEnd:mf,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(e,t){e=+e,t=+t,this._point?this._context.lineTo(e,t):(this._point=1,this._context.moveTo(e,t))}};function fR(e){return new HE(e)}function Fw(e){return e<0?-1:1}function Bw(e,t,r){var n=e._x1-e._x0,a=t-e._x1,o=(e._y1-e._y0)/(n||a<0&&-0),c=(r-e._y1)/(a||n<0&&-0),u=(o*a+c*n)/(n+a);return(Fw(o)+Fw(c))*Math.min(Math.abs(o),Math.abs(c),.5*Math.abs(u))||0}function Uw(e,t){var r=e._x1-e._x0;return r?(3*(e._y1-e._y0)/r-t)/2:t}function cg(e,t,r){var n=e._x0,a=e._y0,o=e._x1,c=e._y1,u=(o-n)/3;e._context.bezierCurveTo(n+u,a+u*t,o-u,c-u*r,o,c)}function gf(e){this._context=e}gf.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:cg(this,this._t0,Uw(this,this._t0));break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){var r=NaN;if(e=+e,t=+t,!(e===this._x1&&t===this._y1)){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,cg(this,Uw(this,r=Bw(this,e,t)),r);break;default:cg(this,this._t0,r=Bw(this,e,t));break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t,this._t0=r}}};function WE(e){this._context=new KE(e)}(WE.prototype=Object.create(gf.prototype)).point=function(e,t){gf.prototype.point.call(this,t,e)};function KE(e){this._context=e}KE.prototype={moveTo:function(e,t){this._context.moveTo(t,e)},closePath:function(){this._context.closePath()},lineTo:function(e,t){this._context.lineTo(t,e)},bezierCurveTo:function(e,t,r,n,a,o){this._context.bezierCurveTo(t,e,n,r,o,a)}};function hR(e){return new gf(e)}function mR(e){return new WE(e)}function GE(e){this._context=e}GE.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=[],this._y=[]},lineEnd:function(){var e=this._x,t=this._y,r=e.length;if(r)if(this._line?this._context.lineTo(e[0],t[0]):this._context.moveTo(e[0],t[0]),r===2)this._context.lineTo(e[1],t[1]);else for(var n=Hw(e),a=Hw(t),o=0,c=1;c=0;--t)a[t]=(c[t]-a[t+1])/o[t];for(o[r-1]=(e[r]+a[r-1])/2,t=0;t=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:{if(this._t<=0)this._context.lineTo(this._x,t),this._context.lineTo(e,t);else{var r=this._x*(1-this._t)+e*this._t;this._context.lineTo(r,this._y),this._context.lineTo(r,t)}break}}this._x=e,this._y=t}};function gR(e){return new bh(e,.5)}function vR(e){return new bh(e,0)}function yR(e){return new bh(e,1)}function xo(e,t){if((c=e.length)>1)for(var r=1,n,a,o=e[t[0]],c,u=o.length;r=0;)r[t]=t;return r}function xR(e,t){return e[t]}function bR(e){const t=[];return t.key=e,t}function wR(){var e=yt([]),t=Ev,r=xo,n=xR;function a(o){var c=Array.from(e.apply(this,arguments),bR),u,f=c.length,h=-1,m;for(const g of o)for(u=0,++h;u0){for(var r,n,a=0,o=e[0].length,c;a0){for(var r=0,n=e[t[0]],a,o=n.length;r0)||!((o=(a=e[t[0]]).length)>0))){for(var r=0,n=1,a,o,c;n1&&arguments[1]!==void 0?arguments[1]:ER,r=10**t,n=Math.round(e*r)/r;return Object.is(n,-0)?0:n}function Gt(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n{var u=r[c-1];return typeof u=="string"?a+u+o:u!==void 0?a+va(u)+o:a+o},"")}var Jr=e=>e===0?0:e>0?1:-1,Kn=e=>typeof e=="number"&&e!=+e,bo=e=>typeof e=="string"&&e.length>1&&e.indexOf("%")===e.length-1,Ee=e=>(typeof e=="number"||e instanceof Number)&&!Kn(e),Gn=e=>Ee(e)||typeof e=="string",AR=0,Au=e=>{var t=++AR;return"".concat(e||"").concat(t)},Sa=function(t,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,a=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1;if(!Ee(t)&&typeof t!="string")return n;var o;if(bo(t)){if(r==null)return n;var c=t.indexOf("%");o=r*parseFloat(t.slice(0,c))/100}else o=+t;return Kn(o)&&(o=n),a&&r!=null&&o>r&&(o=r),o},QE=e=>{if(!Array.isArray(e))return!1;for(var t=e.length,r={},n=0;nn&&(typeof t=="function"?t(n):Oo(n,t))===r)}var Yt=e=>e===null||typeof e>"u",Ry=e=>Yt(e)?e:"".concat(e.charAt(0).toUpperCase()).concat(e.slice(1));function Ar(e){return e!=null}function nl(){}var XE=e=>"radius"in e&&"startAngle"in e&&"endAngle"in e,Ly=(e,t)=>{if(!e||typeof e=="function"||typeof e=="boolean")return null;var r=e;if(y.isValidElement(e)&&(r=e.props),typeof r!="object"&&typeof r!="function")return null;var n={};return Object.keys(r).forEach(a=>{My(a)&&typeof r[a]=="function"&&(n[a]=(o=>r[a](r,o)))}),n},CR=(e,t,r)=>n=>(e(t,r,n),null),PR=(e,t,r)=>{if(e===null||typeof e!="object"&&typeof e!="function")return null;var n=null;return Object.keys(e).forEach(a=>{var o=e[a];My(a)&&typeof o=="function"&&(n||(n={}),n[a]=CR(o,t,r))}),n};function Ww(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function OR(e){for(var t=1;t(c[u]===void 0&&n[u]!==void 0&&(c[u]=n[u]),c),r);return o}function TR(e,t){const r=new Map;for(let n=0;nObject.prototype.propertyIsEnumerable.call(e,t))}function $y(e){return e==null?e===void 0?"[object Undefined]":"[object Null]":Object.prototype.toString.call(e)}const zR="[object RegExp]",JE="[object String]",e5="[object Number]",t5="[object Boolean]",r5="[object Arguments]",FR="[object Symbol]",BR="[object Date]",UR="[object Map]",HR="[object Set]",WR="[object Array]",KR="[object ArrayBuffer]",GR="[object Object]",VR="[object DataView]",qR="[object Uint8Array]",QR="[object Uint8ClampedArray]",YR="[object Uint16Array]",XR="[object Uint32Array]",ZR="[object Int8Array]",JR="[object Int16Array]",eL="[object Int32Array]",tL="[object Float32Array]",rL="[object Float64Array]",Kw=typeof globalThis=="object"&&globalThis||typeof window=="object"&&window||typeof self=="object"&&self||typeof global=="object"&&global||(function(){return this})();function nL(e){return typeof Kw.Buffer<"u"&&Kw.Buffer.isBuffer(e)}function iL(e,t){return Ja(e,void 0,e,new Map,t)}function Ja(e,t,r,n=new Map,a=void 0){const o=a==null?void 0:a(e,t,r,n);if(o!==void 0)return o;if(Cv(e))return e;if(n.has(e))return n.get(e);if(Array.isArray(e)){const c=new Array(e.length);n.set(e,c);for(let u=0;u{}):Pv(e,t,function n(a,o,c,u,f,h){const m=r(a,o,c,u,f,h);return m!==void 0?!!m:Pv(a,o,n,h,!1)},new Map,!0)}function Pv(e,t,r,n,a=!1){if(t===e)return!0;switch(typeof t){case"object":return sL(e,t,r,n);case"function":return Object.keys(t).length>0?Pv(e,{...t},r,n,a):Zd(e,t);default:return n5(e)&&a?typeof t=="string"?t==="":!0:Zd(e,t)}}function sL(e,t,r,n){if(t==null)return!0;if(Array.isArray(t))return a5(e,t,r,n);if(t instanceof Map)return lL(e,t,r,n);if(t instanceof Set)return uL(e,t,r,n);const a=Object.keys(t);if(e==null||Cv(e))return a.length===0;if(a.length===0)return!0;if(n!=null&&n.has(t))return n.get(t)===e;n==null||n.set(t,e);try{for(let o=0;o{})}function cL(e){return e=oL(e),t=>o5(t,e)}function dL(e,t){return iL(e,(r,n,a,o)=>{if(typeof e=="object"){if($y(e)==="[object Object]"&&typeof e.constructor!="function"){const c={};return o.set(e,c),gn(c,e,a,o),c}switch(Object.prototype.toString.call(e)){case e5:case JE:case t5:{const c=new e.constructor(e==null?void 0:e.valueOf());return gn(c,e),c}case r5:{const c={};return gn(c,e),c.length=e.length,c[Symbol.iterator]=e[Symbol.iterator],c}default:return}}})}function fL(e){return dL(e)}const hL=/^(?:0|[1-9]\d*)$/;function s5(e,t=Number.MAX_SAFE_INTEGER){switch(typeof e){case"number":return Number.isInteger(e)&&e>=0&&e=0}function l5(e){return e!=null&&typeof e!="function"&&yL(e.length)}function xL(e){return typeof e=="object"&&e!==null}function bL(e){return xL(e)&&l5(e)}function Gw(e,t=ZE){return bL(e)?TR(Array.from(e),DR(vL(t),1)):[]}function wL(e,t,r){return t===!0?Gw(e,r):typeof t=="function"?Gw(e,t):e}var dg={exports:{}},fg={},hg={exports:{}},mg={};/** * @license React * use-sync-external-store-shim.production.js * @@ -565,7 +565,7 @@ Error generating stack: `+w.message+` * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var Gw;function kL(){if(Gw)return mg;Gw=1;var e=el();function t(g,v){return g===v&&(g!==0||1/g===1/v)||g!==g&&v!==v}var r=typeof Object.is=="function"?Object.is:t,n=e.useState,a=e.useEffect,o=e.useLayoutEffect,c=e.useDebugValue;function u(g,v){var b=v(),j=n({inst:{value:b,getSnapshot:v}}),k=j[0].inst,S=j[1];return o(function(){k.value=b,k.getSnapshot=v,f(k)&&S({inst:k})},[g,b,v]),a(function(){return f(k)&&S({inst:k}),g(function(){f(k)&&S({inst:k})})},[g]),c(b),b}function f(g){var v=g.getSnapshot;g=g.value;try{var b=v();return!r(g,b)}catch{return!0}}function h(g,v){return v()}var m=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?h:u;return mg.useSyncExternalStore=e.useSyncExternalStore!==void 0?e.useSyncExternalStore:m,mg}var Vw;function jL(){return Vw||(Vw=1,hg.exports=kL()),hg.exports}/** + */var Vw;function kL(){if(Vw)return mg;Vw=1;var e=tl();function t(g,v){return g===v&&(g!==0||1/g===1/v)||g!==g&&v!==v}var r=typeof Object.is=="function"?Object.is:t,n=e.useState,a=e.useEffect,o=e.useLayoutEffect,c=e.useDebugValue;function u(g,v){var b=v(),j=n({inst:{value:b,getSnapshot:v}}),k=j[0].inst,S=j[1];return o(function(){k.value=b,k.getSnapshot=v,f(k)&&S({inst:k})},[g,b,v]),a(function(){return f(k)&&S({inst:k}),g(function(){f(k)&&S({inst:k})})},[g]),c(b),b}function f(g){var v=g.getSnapshot;g=g.value;try{var b=v();return!r(g,b)}catch{return!0}}function h(g,v){return v()}var m=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?h:u;return mg.useSyncExternalStore=e.useSyncExternalStore!==void 0?e.useSyncExternalStore:m,mg}var qw;function jL(){return qw||(qw=1,hg.exports=kL()),hg.exports}/** * @license React * use-sync-external-store-shim/with-selector.production.js * @@ -573,12 +573,12 @@ Error generating stack: `+w.message+` * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var qw;function SL(){if(qw)return fg;qw=1;var e=el(),t=jL();function r(h,m){return h===m&&(h!==0||1/h===1/m)||h!==h&&m!==m}var n=typeof Object.is=="function"?Object.is:r,a=t.useSyncExternalStore,o=e.useRef,c=e.useEffect,u=e.useMemo,f=e.useDebugValue;return fg.useSyncExternalStoreWithSelector=function(h,m,g,v,b){var j=o(null);if(j.current===null){var k={hasValue:!1,value:null};j.current=k}else k=j.current;j=u(function(){function N(O){if(!E){if(E=!0,A=O,O=v(O),b!==void 0&&k.hasValue){var D=k.value;if(b(D,O))return P=D}return P=O}if(D=P,n(A,O))return D;var U=v(O);return b!==void 0&&b(D,U)?(A=O,D):(A=O,P=U)}var E=!1,A,P,_=g===void 0?null:g;return[function(){return N(m())},_===null?void 0:function(){return N(_())}]},[m,g,v,b]);var S=a(h,j[0],j[1]);return c(function(){k.hasValue=!0,k.value=S},[S]),f(S),S},fg}var Qw;function NL(){return Qw||(Qw=1,dg.exports=SL()),dg.exports}var EL=NL(),$y=y.createContext(null),AL=e=>e,Nt=()=>{var e=y.useContext($y);return e?e.store.dispatch:AL},Jd=()=>{},CL=()=>Jd,PL=(e,t)=>e===t;function Me(e){var t=y.useContext($y),r=y.useMemo(()=>t?n=>{if(n!=null)return e(n)}:Jd,[t,e]);return EL.useSyncExternalStoreWithSelector(t?t.subscription.addNestedSub:CL,t?t.store.getState:Jd,t?t.store.getState:Jd,r,PL)}function OL(e,t=`expected a function, instead received ${typeof e}`){if(typeof e!="function")throw new TypeError(t)}function _L(e,t="expected all items to be functions, instead received the following types: "){if(!e.every(r=>typeof r=="function")){const r=e.map(n=>typeof n=="function"?`function ${n.name||"unnamed"}()`:typeof n).join(", ");throw new TypeError(`${t}[${r}]`)}}var Yw=e=>Array.isArray(e)?e:[e];function ML(e){const t=Array.isArray(e[0])?e[0]:e;return _L(t,"createSelector expects all input-selectors to be functions, but received the following types: "),t}function IL(e,t){const r=[],{length:n}=e;for(let a=0;atypeof WeakRef>"u"?TL:WeakRef,u5=DL(),RL=0,Xw=1;function Id(){return{s:RL,v:void 0,o:null,p:null}}function LL(e){return e instanceof u5?e.deref():e}function c5(e,t={}){let r=Id();const{resultEqualityCheck:n}=t;let a,o=0;function c(){let u=r;const{length:f}=arguments;for(let g=0,v=f;g{r=Id(),c.resetResultsCount()},c.resultsCount=()=>o,c.resetResultsCount=()=>{o=0},c}function $L(e,...t){const r=typeof e=="function"?{memoize:e,memoizeOptions:t}:e,n=(...a)=>{let o=0,c=0,u,f={},h=a.pop();typeof h=="object"&&(f=h,h=a.pop()),OL(h,`createSelector expects an output function after the inputs, but received: [${typeof h}]`);const m={...r,...f},{memoize:g,memoizeOptions:v=[],argsMemoize:b=c5,argsMemoizeOptions:j=[]}=m,k=Yw(v),S=Yw(j),N=ML(a),E=g(function(){return o++,h.apply(null,arguments)},...k),A=b(function(){c++;const _=IL(N,arguments);return u=E.apply(null,_),u},...S);return Object.assign(A,{resultFunc:h,memoizedResultFunc:E,dependencies:N,dependencyRecomputations:()=>c,resetDependencyRecomputations:()=>{c=0},lastResult:()=>u,recomputations:()=>o,resetRecomputations:()=>{o=0},memoize:g,argsMemoize:b})};return Object.assign(n,{withTypes:()=>n}),n}var q=$L(c5);function zL(e,t=1){const r=[],n=Math.floor(t),a=(o,c)=>{for(let u=0;u{if(e!==t){const n=Zw(e),a=Zw(t);if(n===a&&n===0){if(et)return r==="desc"?-1:1}return r==="desc"?a-n:n-a}return 0};function d5(e){return typeof e=="symbol"||e instanceof Symbol}const BL=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,UL=/^\w*$/;function HL(e,t){return Array.isArray(e)?!1:typeof e=="number"||typeof e=="boolean"||e==null||d5(e)?!0:typeof e=="string"&&(UL.test(e)||!BL.test(e))||t!=null}function WL(e,t,r,n){if(e==null)return[];r=r,Array.isArray(e)||(e=Object.values(e)),Array.isArray(t)||(t=t==null?[null]:[t]),t.length===0&&(t=[null]),Array.isArray(r)||(r=r==null?[]:[r]),r=r.map(u=>String(u));const a=(u,f)=>{let h=u;for(let m=0;mf==null||u==null?f:typeof u=="object"&&"key"in u?Object.hasOwn(f,u.key)?f[u.key]:a(f,u.path):typeof u=="function"?u(f):Array.isArray(u)?a(f,u):typeof f=="object"?f[u]:f,c=t.map(u=>(Array.isArray(u)&&u.length===1&&(u=u[0]),u==null||typeof u=="function"||Array.isArray(u)||HL(u)?u:{key:u,path:Ty(u)}));return e.map(u=>({original:u,criteria:c.map(f=>o(f,u))})).slice().sort((u,f)=>{for(let h=0;hu.original)}function wh(e,...t){const r=t.length;return r>1&&Ov(e,t[0],t[1])?t=[]:r>2&&Ov(t[0],t[1],t[2])&&(t=[t[0]]),WL(e,zL(t),["asc"])}var f5=e=>e.legend.settings,KL=e=>e.legend.size,GL=e=>e.legend.payload;q([GL,f5],(e,t)=>{var r=t.itemSorter,n=e.flat(1);return r?wh(n,r):n});function VL(e,t){return XL(e)||YL(e,t)||QL(e,t)||qL()}function qL(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function QL(e,t){if(e){if(typeof e=="string")return Jw(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Jw(e,t):void 0}}function Jw(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);rTd||Math.abs(e.left-t.left)>Td||Math.abs(e.top-t.top)>Td||Math.abs(e.width-t.width)>Td}function tk(e){var t=e.getBoundingClientRect();return{height:t.height,left:t.left,top:t.top,width:t.width}}function ZL(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],t=y.useState({height:0,left:0,top:0,width:0}),r=VL(t,2),n=r[0],a=r[1],o=y.useRef(null),c=y.useRef(n);c.current=n;var u=y.useCallback(f=>{if(o.current!=null&&(o.current.disconnect(),o.current=null),f!=null){var h=tk(f);if(ek(h,c.current)&&a(h),typeof ResizeObserver<"u"){var m=new ResizeObserver(()=>{var g=tk(f);ek(g,c.current)&&a(g)});m.observe(f),o.current=m}}},[...e]);return y.useEffect(()=>()=>{var f;(f=o.current)===null||f===void 0||f.disconnect()},[]),[n,u]}function Kt(e){return`Minified Redux error #${e}; visit https://redux.js.org/Errors?code=${e} for the full message or use the non-minified dev environment for full errors. `}var JL=typeof Symbol=="function"&&Symbol.observable||"@@observable",rk=JL,pg=()=>Math.random().toString(36).substring(7).split("").join("."),e$={INIT:`@@redux/INIT${pg()}`,REPLACE:`@@redux/REPLACE${pg()}`,PROBE_UNKNOWN_ACTION:()=>`@@redux/PROBE_UNKNOWN_ACTION${pg()}`},vf=e$;function zy(e){if(typeof e!="object"||e===null)return!1;let t=e;for(;Object.getPrototypeOf(t)!==null;)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t||Object.getPrototypeOf(e)===null}function h5(e,t,r){if(typeof e!="function")throw new Error(Kt(2));if(typeof t=="function"&&typeof r=="function"||typeof r=="function"&&typeof arguments[3]=="function")throw new Error(Kt(0));if(typeof t=="function"&&typeof r>"u"&&(r=t,t=void 0),typeof r<"u"){if(typeof r!="function")throw new Error(Kt(1));return r(h5)(e,t)}let n=e,a=t,o=new Map,c=o,u=0,f=!1;function h(){c===o&&(c=new Map,o.forEach((S,N)=>{c.set(N,S)}))}function m(){if(f)throw new Error(Kt(3));return a}function g(S){if(typeof S!="function")throw new Error(Kt(4));if(f)throw new Error(Kt(5));let N=!0;h();const E=u++;return c.set(E,S),function(){if(N){if(f)throw new Error(Kt(6));N=!1,h(),c.delete(E),o=null}}}function v(S){if(!zy(S))throw new Error(Kt(7));if(typeof S.type>"u")throw new Error(Kt(8));if(typeof S.type!="string")throw new Error(Kt(17));if(f)throw new Error(Kt(9));try{f=!0,a=n(a,S)}finally{f=!1}return(o=c).forEach(E=>{E()}),S}function b(S){if(typeof S!="function")throw new Error(Kt(10));n=S,v({type:vf.REPLACE})}function j(){const S=g;return{subscribe(N){if(typeof N!="object"||N===null)throw new Error(Kt(11));function E(){const P=N;P.next&&P.next(m())}return E(),{unsubscribe:S(E)}},[rk](){return this}}}return v({type:vf.INIT}),{dispatch:v,subscribe:g,getState:m,replaceReducer:b,[rk]:j}}function t$(e){Object.keys(e).forEach(t=>{const r=e[t];if(typeof r(void 0,{type:vf.INIT})>"u")throw new Error(Kt(12));if(typeof r(void 0,{type:vf.PROBE_UNKNOWN_ACTION()})>"u")throw new Error(Kt(13))})}function m5(e){const t=Object.keys(e),r={};for(let o=0;o"u")throw u&&u.type,new Error(Kt(14));h[g]=j,f=f||j!==b}return f=f||n.length!==Object.keys(c).length,f?h:c}}function yf(...e){return e.length===0?t=>t:e.length===1?e[0]:e.reduce((t,r)=>(...n)=>t(r(...n)))}function r$(...e){return t=>(r,n)=>{const a=t(r,n);let o=()=>{throw new Error(Kt(15))};const c={getState:a.getState,dispatch:(f,...h)=>o(f,...h)},u=e.map(f=>f(c));return o=yf(...u)(a.dispatch),{...a,dispatch:o}}}function p5(e){return zy(e)&&"type"in e&&typeof e.type=="string"}var g5=Symbol.for("immer-nothing"),nk=Symbol.for("immer-draftable"),vr=Symbol.for("immer-state");function yn(e,...t){throw new Error(`[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`)}var Br=Object,Gs=Br.getPrototypeOf,xf="constructor",kh="prototype",_v="configurable",bf="enumerable",ef="writable",Cu="value",wi=e=>!!e&&!!e[vr];function jn(e){var t;return e?v5(e)||Sh(e)||!!e[nk]||!!((t=e[xf])!=null&&t[nk])||Nh(e)||Eh(e):!1}var n$=Br[kh][xf].toString(),ik=new WeakMap;function v5(e){if(!e||!Fy(e))return!1;const t=Gs(e);if(t===null||t===Br[kh])return!0;const r=Br.hasOwnProperty.call(t,xf)&&t[xf];if(r===Object)return!0;if(!vs(r))return!1;let n=ik.get(r);return n===void 0&&(n=Function.toString.call(r),ik.set(r,n)),n===n$}function jh(e,t,r=!0){Xu(e)===0?(r?Reflect.ownKeys(e):Br.keys(e)).forEach(a=>{t(a,e[a],e)}):e.forEach((n,a)=>t(a,n,e))}function Xu(e){const t=e[vr];return t?t.type_:Sh(e)?1:Nh(e)?2:Eh(e)?3:0}var ak=(e,t,r=Xu(e))=>r===2?e.has(t):Br[kh].hasOwnProperty.call(e,t),Mv=(e,t,r=Xu(e))=>r===2?e.get(t):e[t],wf=(e,t,r,n=Xu(e))=>{n===2?e.set(t,r):n===3?e.add(r):e[t]=r};function i$(e,t){return e===t?e!==0||1/e===1/t:e!==e&&t!==t}var Sh=Array.isArray,Nh=e=>e instanceof Map,Eh=e=>e instanceof Set,Fy=e=>typeof e=="object",vs=e=>typeof e=="function",gg=e=>typeof e=="boolean";function a$(e){const t=+e;return Number.isInteger(t)&&String(t)===e}var ci=e=>e.copy_||e.base_,By=e=>e.modified_?e.copy_:e.base_;function Iv(e,t){if(Nh(e))return new Map(e);if(Eh(e))return new Set(e);if(Sh(e))return Array[kh].slice.call(e);const r=v5(e);if(t===!0||t==="class_only"&&!r){const n=Br.getOwnPropertyDescriptors(e);delete n[vr];let a=Reflect.ownKeys(n);for(let o=0;o1&&Br.defineProperties(e,{set:Dd,add:Dd,clear:Dd,delete:Dd}),Br.freeze(e),t&&jh(e,(r,n)=>{Uy(n,!0)},!1)),e}function o$(){yn(2)}var Dd={[Cu]:o$};function Ah(e){return e===null||!Fy(e)?!0:Br.isFrozen(e)}var kf="MapSet",Tv="Patches",ok="ArrayMethods",y5={};function wo(e){const t=y5[e];return t||yn(0,e),t}var sk=e=>!!y5[e],Pu,x5=()=>Pu,s$=(e,t)=>({drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0,handledSet_:new Set,processedForPatches_:new Set,mapSetPlugin_:sk(kf)?wo(kf):void 0,arrayMethodsPlugin_:sk(ok)?wo(ok):void 0});function lk(e,t){t&&(e.patchPlugin_=wo(Tv),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function Dv(e){Rv(e),e.drafts_.forEach(l$),e.drafts_=null}function Rv(e){e===Pu&&(Pu=e.parent_)}var uk=e=>Pu=s$(Pu,e);function l$(e){const t=e[vr];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0}function ck(e,t){t.unfinalizedDrafts_=t.drafts_.length;const r=t.drafts_[0];if(e!==void 0&&e!==r){r[vr].modified_&&(Dv(t),yn(4)),jn(e)&&(e=dk(t,e));const{patchPlugin_:a}=t;a&&a.generateReplacementPatches_(r[vr].base_,e,t)}else e=dk(t,r);return u$(t,e,!0),Dv(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e!==g5?e:void 0}function dk(e,t){if(Ah(t))return t;const r=t[vr];if(!r)return jf(t,e.handledSet_,e);if(!Ch(r,e))return t;if(!r.modified_)return r.base_;if(!r.finalized_){const{callbacks_:n}=r;if(n)for(;n.length>0;)n.pop()(e);k5(r,e)}return r.copy_}function u$(e,t,r=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&Uy(t,r)}function b5(e){e.finalized_=!0,e.scope_.unfinalizedDrafts_--}var Ch=(e,t)=>e.scope_===t,c$=[];function w5(e,t,r,n){const a=ci(e),o=e.type_;if(n!==void 0&&Mv(a,n,o)===t){wf(a,n,r,o);return}if(!e.draftLocations_){const u=e.draftLocations_=new Map;jh(a,(f,h)=>{if(wi(h)){const m=u.get(h)||[];m.push(f),u.set(h,m)}})}const c=e.draftLocations_.get(t)??c$;for(const u of c)wf(a,u,r,o)}function d$(e,t,r){e.callbacks_.push(function(a){var u;const o=t;if(!o||!Ch(o,a))return;(u=a.mapSetPlugin_)==null||u.fixSetContents(o);const c=By(o);w5(e,o.draft_??o,c,r),k5(o,a)})}function k5(e,t){var n;if(e.modified_&&!e.finalized_&&(e.type_===3||e.type_===1&&e.allIndicesReassigned_||(((n=e.assigned_)==null?void 0:n.size)??0)>0)){const{patchPlugin_:a}=t;if(a){const o=a.getPath(e);o&&a.generatePatches_(e,o,t)}b5(e)}}function f$(e,t,r){const{scope_:n}=e;if(wi(r)){const a=r[vr];Ch(a,n)&&a.callbacks_.push(function(){tf(e);const c=By(a);w5(e,r,c,t)})}else jn(r)&&e.callbacks_.push(function(){const o=ci(e);e.type_===3?o.has(r)&&jf(r,n.handledSet_,n):Mv(o,t,e.type_)===r&&n.drafts_.length>1&&(e.assigned_.get(t)??!1)===!0&&e.copy_&&jf(Mv(e.copy_,t,e.type_),n.handledSet_,n)})}function jf(e,t,r){return!r.immer_.autoFreeze_&&r.unfinalizedDrafts_<1||wi(e)||t.has(e)||!jn(e)||Ah(e)||(t.add(e),jh(e,(n,a)=>{if(wi(a)){const o=a[vr];if(Ch(o,r)){const c=By(o);wf(e,n,c,e.type_),b5(o)}}else jn(a)&&jf(a,t,r)})),e}function h$(e,t){const r=Sh(e),n={type_:r?1:0,scope_:t?t.scope_:x5(),modified_:!1,finalized_:!1,assigned_:void 0,parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1,callbacks_:void 0};let a=n,o=Sf;r&&(a=[n],o=Ou);const{revoke:c,proxy:u}=Proxy.revocable(a,o);return n.draft_=u,n.revoke_=c,[u,n]}var Sf={get(e,t){if(t===vr)return e;let r=e.scope_.arrayMethodsPlugin_;const n=e.type_===1&&typeof t=="string";if(n&&r!=null&&r.isArrayOperationMethod(t))return r.createMethodInterceptor(e,t);const a=ci(e);if(!ak(a,t,e.type_))return m$(e,a,t);const o=a[t];if(e.finalized_||!jn(o)||n&&e.operationMethod&&(r!=null&&r.isMutatingArrayMethod(e.operationMethod))&&a$(t))return o;if(o===vg(e.base_,t)){tf(e);const c=e.type_===1?+t:t,u=$v(e.scope_,o,e,c);return e.copy_[c]=u}return o},has(e,t){return t in ci(e)},ownKeys(e){return Reflect.ownKeys(ci(e))},set(e,t,r){const n=j5(ci(e),t);if(n!=null&&n.set)return n.set.call(e.draft_,r),!0;if(!e.modified_){const a=vg(ci(e),t),o=a==null?void 0:a[vr];if(o&&o.base_===r)return e.copy_[t]=r,e.assigned_.set(t,!1),!0;if(i$(r,a)&&(r!==void 0||ak(e.base_,t,e.type_)))return!0;tf(e),Lv(e)}return e.copy_[t]===r&&(r!==void 0||t in e.copy_)||Number.isNaN(r)&&Number.isNaN(e.copy_[t])||(e.copy_[t]=r,e.assigned_.set(t,!0),f$(e,t,r)),!0},deleteProperty(e,t){return tf(e),vg(e.base_,t)!==void 0||t in e.base_?(e.assigned_.set(t,!1),Lv(e)):e.assigned_.delete(t),e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){const r=ci(e),n=Reflect.getOwnPropertyDescriptor(r,t);return n&&{[ef]:!0,[_v]:e.type_!==1||t!=="length",[bf]:n[bf],[Cu]:r[t]}},defineProperty(){yn(11)},getPrototypeOf(e){return Gs(e.base_)},setPrototypeOf(){yn(12)}},Ou={};for(let e in Sf){let t=Sf[e];Ou[e]=function(){const r=arguments;return r[0]=r[0][0],t.apply(this,r)}}Ou.deleteProperty=function(e,t){return Ou.set.call(this,e,t,void 0)};Ou.set=function(e,t,r){return Sf.set.call(this,e[0],t,r,e[0])};function vg(e,t){const r=e[vr];return(r?ci(r):e)[t]}function m$(e,t,r){var a;const n=j5(t,r);return n?Cu in n?n[Cu]:(a=n.get)==null?void 0:a.call(e.draft_):void 0}function j5(e,t){if(!(t in e))return;let r=Gs(e);for(;r;){const n=Object.getOwnPropertyDescriptor(r,t);if(n)return n;r=Gs(r)}}function Lv(e){e.modified_||(e.modified_=!0,e.parent_&&Lv(e.parent_))}function tf(e){e.copy_||(e.assigned_=new Map,e.copy_=Iv(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var p$=class{constructor(t){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!1,this.produce=(r,n,a)=>{if(vs(r)&&!vs(n)){const c=n;n=r;const u=this;return function(h=c,...m){return u.produce(h,g=>n.call(this,g,...m))}}vs(n)||yn(6),a!==void 0&&!vs(a)&&yn(7);let o;if(jn(r)){const c=uk(this),u=$v(c,r,void 0);let f=!0;try{o=n(u),f=!1}finally{f?Dv(c):Rv(c)}return lk(c,a),ck(o,c)}else if(!r||!Fy(r)){if(o=n(r),o===void 0&&(o=r),o===g5&&(o=void 0),this.autoFreeze_&&Uy(o,!0),a){const c=[],u=[];wo(Tv).generateReplacementPatches_(r,o,{patches_:c,inversePatches_:u}),a(c,u)}return o}else yn(1,r)},this.produceWithPatches=(r,n)=>{if(vs(r))return(u,...f)=>this.produceWithPatches(u,h=>r(h,...f));let a,o;return[this.produce(r,n,(u,f)=>{a=u,o=f}),a,o]},gg(t==null?void 0:t.autoFreeze)&&this.setAutoFreeze(t.autoFreeze),gg(t==null?void 0:t.useStrictShallowCopy)&&this.setUseStrictShallowCopy(t.useStrictShallowCopy),gg(t==null?void 0:t.useStrictIteration)&&this.setUseStrictIteration(t.useStrictIteration)}createDraft(t){jn(t)||yn(8),wi(t)&&(t=en(t));const r=uk(this),n=$v(r,t,void 0);return n[vr].isManual_=!0,Rv(r),n}finishDraft(t,r){const n=t&&t[vr];(!n||!n.isManual_)&&yn(9);const{scope_:a}=n;return lk(a,r),ck(void 0,a)}setAutoFreeze(t){this.autoFreeze_=t}setUseStrictShallowCopy(t){this.useStrictShallowCopy_=t}setUseStrictIteration(t){this.useStrictIteration_=t}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(t,r){let n;for(n=r.length-1;n>=0;n--){const o=r[n];if(o.path.length===0&&o.op==="replace"){t=o.value;break}}n>-1&&(r=r.slice(n+1));const a=wo(Tv).applyPatches_;return wi(t)?a(t,r):this.produce(t,o=>a(o,r))}};function $v(e,t,r,n){const[a,o]=Nh(t)?wo(kf).proxyMap_(t,r):Eh(t)?wo(kf).proxySet_(t,r):h$(t,r);return((r==null?void 0:r.scope_)??x5()).drafts_.push(a),o.callbacks_=(r==null?void 0:r.callbacks_)??[],o.key_=n,r&&n!==void 0?d$(r,o,n):o.callbacks_.push(function(f){var m;(m=f.mapSetPlugin_)==null||m.fixSetContents(o);const{patchPlugin_:h}=f;o.modified_&&h&&h.generatePatches_(o,[],f)}),a}function en(e){return wi(e)||yn(10,e),S5(e)}function S5(e){if(!jn(e)||Ah(e))return e;const t=e[vr];let r,n=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,r=Iv(e,t.scope_.immer_.useStrictShallowCopy_),n=t.scope_.immer_.shouldUseStrictIteration()}else r=Iv(e,!0);return jh(r,(a,o)=>{wf(r,a,S5(o))},n),t&&(t.finalized_=!1),r}var g$=new p$,N5=g$.produce;function E5(e){return({dispatch:r,getState:n})=>a=>o=>typeof o=="function"?o(r,n,e):a(o)}var v$=E5(),y$=E5,x$=typeof window<"u"&&window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__?window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__:function(){if(arguments.length!==0)return typeof arguments[0]=="object"?yf:yf.apply(null,arguments)};function Hr(e,t){function r(...n){if(t){let a=t(...n);if(!a)throw new Error(Ur(0));return{type:e,payload:a.payload,..."meta"in a&&{meta:a.meta},..."error"in a&&{error:a.error}}}return{type:e,payload:n[0]}}return r.toString=()=>`${e}`,r.type=e,r.match=n=>p5(n)&&n.type===e,r}var A5=class pu extends Array{constructor(...t){super(...t),Object.setPrototypeOf(this,pu.prototype)}static get[Symbol.species](){return pu}concat(...t){return super.concat.apply(this,t)}prepend(...t){return t.length===1&&Array.isArray(t[0])?new pu(...t[0].concat(this)):new pu(...t.concat(this))}};function fk(e){return jn(e)?N5(e,()=>{}):e}function Rd(e,t,r){return e.has(t)?e.get(t):e.set(t,r(t)).get(t)}function b$(e){return typeof e=="boolean"}var w$=()=>function(t){const{thunk:r=!0,immutableCheck:n=!0,serializableCheck:a=!0,actionCreatorCheck:o=!0}=t??{};let c=new A5;return r&&(b$(r)?c.push(v$):c.push(y$(r.extraArgument))),c},C5="RTK_autoBatch",st=()=>e=>({payload:e,meta:{[C5]:!0}}),hk=e=>t=>{setTimeout(t,e)},k$=(e,t)=>r=>{let n=!1;const a=()=>{n||(n=!0,cancelAnimationFrame(o),clearTimeout(c),r())},o=e(a),c=setTimeout(a,t)},P5=(e={type:"raf"})=>t=>(...r)=>{const n=t(...r);let a=!0,o=!1,c=!1;const u=new Set,f=e.type==="tick"?queueMicrotask:e.type==="raf"?typeof window<"u"&&window.requestAnimationFrame?k$(window.requestAnimationFrame,100):hk(10):e.type==="callback"?e.queueNotification:hk(e.timeout),h=()=>{c=!1,o&&(o=!1,u.forEach(m=>m()))};return Object.assign({},n,{subscribe(m){const g=()=>a&&m(),v=n.subscribe(g);return u.add(m),()=>{v(),u.delete(m)}},dispatch(m){var g;try{return a=!((g=m==null?void 0:m.meta)!=null&&g[C5]),o=!a,o&&(c||(c=!0,f(h))),n.dispatch(m)}finally{a=!0}}})},j$=e=>function(r){const{autoBatch:n=!0}=r??{};let a=new A5(e);return n&&a.push(P5(typeof n=="object"?n:void 0)),a};function S$(e){const t=w$(),{reducer:r=void 0,middleware:n,devTools:a=!0,preloadedState:o=void 0,enhancers:c=void 0}=e||{};let u;if(typeof r=="function")u=r;else if(zy(r))u=m5(r);else throw new Error(Ur(1));let f;typeof n=="function"?f=n(t):f=t();let h=yf;a&&(h=x$({trace:!1,...typeof a=="object"&&a}));const m=r$(...f),g=j$(m);let v=typeof c=="function"?c(g):g();const b=h(...v);return h5(u,o,b)}function O5(e){const t={},r=[];let n;const a={addCase(o,c){const u=typeof o=="string"?o:o.type;if(!u)throw new Error(Ur(28));if(u in t)throw new Error(Ur(29));return t[u]=c,a},addAsyncThunk(o,c){return c.pending&&(t[o.pending.type]=c.pending),c.rejected&&(t[o.rejected.type]=c.rejected),c.fulfilled&&(t[o.fulfilled.type]=c.fulfilled),c.settled&&r.push({matcher:o.settled,reducer:c.settled}),a},addMatcher(o,c){return r.push({matcher:o,reducer:c}),a},addDefaultCase(o){return n=o,a}};return e(a),[t,r,n]}function N$(e){return typeof e=="function"}function E$(e,t){let[r,n,a]=O5(t),o;if(N$(e))o=()=>fk(e());else{const u=fk(e);o=()=>u}function c(u=o(),f){let h=[r[f.type],...n.filter(({matcher:m})=>m(f)).map(({reducer:m})=>m)];return h.filter(m=>!!m).length===0&&(h=[a]),h.reduce((m,g)=>{if(g)if(wi(m)){const b=g(m,f);return b===void 0?m:b}else{if(jn(m))return N5(m,v=>g(v,f));{const v=g(m,f);if(v===void 0){if(m===null)return m;throw Error("A case reducer on a non-draftable value must not return undefined")}return v}}return m},u)}return c.getInitialState=o,c}var A$="ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW",C$=(e=21)=>{let t="",r=e;for(;r--;)t+=A$[Math.random()*64|0];return t},P$=Symbol.for("rtk-slice-createasyncthunk");function O$(e,t){return`${e}/${t}`}function _$({creators:e}={}){var r;const t=(r=e==null?void 0:e.asyncThunk)==null?void 0:r[P$];return function(a){const{name:o,reducerPath:c=o}=a;if(!o)throw new Error(Ur(11));const u=(typeof a.reducers=="function"?a.reducers(I$()):a.reducers)||{},f=Object.keys(u),h={sliceCaseReducersByName:{},sliceCaseReducersByType:{},actionCreators:{},sliceMatchers:[]},m={addCase(P,_){const O=typeof P=="string"?P:P.type;if(!O)throw new Error(Ur(12));if(O in h.sliceCaseReducersByType)throw new Error(Ur(13));return h.sliceCaseReducersByType[O]=_,m},addMatcher(P,_){return h.sliceMatchers.push({matcher:P,reducer:_}),m},exposeAction(P,_){return h.actionCreators[P]=_,m},exposeCaseReducer(P,_){return h.sliceCaseReducersByName[P]=_,m}};f.forEach(P=>{const _=u[P],O={reducerName:P,type:O$(o,P),createNotation:typeof a.reducers=="function"};D$(_)?L$(O,_,m,t):T$(O,_,m)});function g(){const[P={},_=[],O=void 0]=typeof a.extraReducers=="function"?O5(a.extraReducers):[a.extraReducers],D={...P,...h.sliceCaseReducersByType};return E$(a.initialState,U=>{for(let B in D)U.addCase(B,D[B]);for(let B of h.sliceMatchers)U.addMatcher(B.matcher,B.reducer);for(let B of _)U.addMatcher(B.matcher,B.reducer);O&&U.addDefaultCase(O)})}const v=P=>P,b=new Map,j=new WeakMap;let k;function S(P,_){return k||(k=g()),k(P,_)}function N(){return k||(k=g()),k.getInitialState()}function E(P,_=!1){function O(U){let B=U[P];return typeof B>"u"&&_&&(B=Rd(j,O,N)),B}function D(U=v){const B=Rd(b,_,()=>new WeakMap);return Rd(B,U,()=>{const F={};for(const[Y,H]of Object.entries(a.selectors??{}))F[Y]=M$(H,U,()=>Rd(j,U,N),_);return F})}return{reducerPath:P,getSelectors:D,get selectors(){return D(O)},selectSlice:O}}const A={name:o,reducer:S,actions:h.actionCreators,caseReducers:h.sliceCaseReducersByName,getInitialState:N,...E(c),injectInto(P,{reducerPath:_,...O}={}){const D=_??c;return P.inject({reducerPath:D,reducer:S},O),{...A,...E(D,!0)}}};return A}}function M$(e,t,r,n){function a(o,...c){let u=t(o);return typeof u>"u"&&n&&(u=r()),e(u,...c)}return a.unwrapped=e,a}var lr=_$();function I$(){function e(t,r){return{_reducerDefinitionType:"asyncThunk",payloadCreator:t,...r}}return e.withTypes=()=>e,{reducer(t){return Object.assign({[t.name](...r){return t(...r)}}[t.name],{_reducerDefinitionType:"reducer"})},preparedReducer(t,r){return{_reducerDefinitionType:"reducerWithPrepare",prepare:t,reducer:r}},asyncThunk:e}}function T$({type:e,reducerName:t,createNotation:r},n,a){let o,c;if("reducer"in n){if(r&&!R$(n))throw new Error(Ur(17));o=n.reducer,c=n.prepare}else o=n;a.addCase(e,o).exposeCaseReducer(t,o).exposeAction(t,c?Hr(e,c):Hr(e))}function D$(e){return e._reducerDefinitionType==="asyncThunk"}function R$(e){return e._reducerDefinitionType==="reducerWithPrepare"}function L$({type:e,reducerName:t},r,n,a){if(!a)throw new Error(Ur(18));const{payloadCreator:o,fulfilled:c,pending:u,rejected:f,settled:h,options:m}=r,g=a(e,o,m);n.exposeAction(t,g),c&&n.addCase(g.fulfilled,c),u&&n.addCase(g.pending,u),f&&n.addCase(g.rejected,f),h&&n.addMatcher(g.settled,h),n.exposeCaseReducer(t,{fulfilled:c||Ld,pending:u||Ld,rejected:f||Ld,settled:h||Ld})}function Ld(){}var $$="task",_5="listener",M5="completed",Hy="cancelled",z$=`task-${Hy}`,F$=`task-${M5}`,zv=`${_5}-${Hy}`,B$=`${_5}-${M5}`,Ph=class{constructor(e){Yl(this,"code");Yl(this,"name","TaskAbortError");Yl(this,"message");this.code=e,this.message=`${$$} ${Hy} (reason: ${e})`}},Wy=(e,t)=>{if(typeof e!="function")throw new TypeError(Ur(32))},Nf=()=>{},I5=(e,t=Nf)=>(e.catch(t),e),T5=(e,t)=>(e.addEventListener("abort",t,{once:!0}),()=>e.removeEventListener("abort",t)),po=e=>{if(e.aborted)throw new Ph(e.reason)};function D5(e,t){let r=Nf;return new Promise((n,a)=>{const o=()=>a(new Ph(e.reason));if(e.aborted){o();return}r=T5(e,o),t.finally(()=>r()).then(n,a)}).finally(()=>{r=Nf})}var U$=async(e,t)=>{try{return await Promise.resolve(),{status:"ok",value:await e()}}catch(r){return{status:r instanceof Ph?"cancelled":"rejected",error:r}}finally{t==null||t()}},Ef=e=>t=>I5(D5(e,t).then(r=>(po(e),r))),R5=e=>{const t=Ef(e);return r=>t(new Promise(n=>setTimeout(n,r)))},{assign:Ss}=Object,mk={},Oh="listenerMiddleware",H$=(e,t)=>{const r=n=>T5(e,()=>n.abort(e.reason));return(n,a)=>{Wy(n);const o=new AbortController;r(o);const c=U$(async()=>{po(e),po(o.signal);const u=await n({pause:Ef(o.signal),delay:R5(o.signal),signal:o.signal});return po(o.signal),u},()=>o.abort(F$));return a!=null&&a.autoJoin&&t.push(c.catch(Nf)),{result:Ef(e)(c),cancel(){o.abort(z$)}}}},W$=(e,t)=>{const r=async(n,a)=>{po(t);let o=()=>{};const u=[new Promise((f,h)=>{let m=e({predicate:n,effect:(g,v)=>{v.unsubscribe(),f([g,v.getState(),v.getOriginalState()])}});o=()=>{m(),h()}})];a!=null&&u.push(new Promise(f=>setTimeout(f,a,null)));try{const f=await D5(t,Promise.race(u));return po(t),f}finally{o()}};return((n,a)=>I5(r(n,a)))},L5=e=>{let{type:t,actionCreator:r,matcher:n,predicate:a,effect:o}=e;if(t)a=Hr(t).match;else if(r)t=r.type,a=r.match;else if(n)a=n;else if(!a)throw new Error(Ur(21));return Wy(o),{predicate:a,type:t,effect:o}},$5=Ss(e=>{const{type:t,predicate:r,effect:n}=L5(e);return{id:C$(),effect:n,type:t,predicate:r,pending:new Set,unsubscribe:()=>{throw new Error(Ur(22))}}},{withTypes:()=>$5}),pk=(e,t)=>{const{type:r,effect:n,predicate:a}=L5(t);return Array.from(e.values()).find(o=>(typeof r=="string"?o.type===r:o.predicate===a)&&o.effect===n)},Fv=e=>{e.pending.forEach(t=>{t.abort(zv)})},K$=(e,t)=>()=>{for(const r of t.keys())Fv(r);e.clear()},gk=(e,t,r)=>{try{e(t,r)}catch(n){setTimeout(()=>{throw n},0)}},z5=Ss(Hr(`${Oh}/add`),{withTypes:()=>z5}),G$=Hr(`${Oh}/removeAll`),F5=Ss(Hr(`${Oh}/remove`),{withTypes:()=>F5}),V$=(...e)=>{console.error(`${Oh}/error`,...e)},Zu=(e={})=>{const t=new Map,r=new Map,n=b=>{const j=r.get(b)??0;r.set(b,j+1)},a=b=>{const j=r.get(b)??1;j===1?r.delete(b):r.set(b,j-1)},{extra:o,onError:c=V$}=e;Wy(c);const u=b=>(b.unsubscribe=()=>t.delete(b.id),t.set(b.id,b),j=>{b.unsubscribe(),j!=null&&j.cancelActive&&Fv(b)}),f=(b=>{const j=pk(t,b)??$5(b);return u(j)});Ss(f,{withTypes:()=>f});const h=b=>{const j=pk(t,b);return j&&(j.unsubscribe(),b.cancelActive&&Fv(j)),!!j};Ss(h,{withTypes:()=>h});const m=async(b,j,k,S)=>{const N=new AbortController,E=W$(f,N.signal),A=[];try{b.pending.add(N),n(b),await Promise.resolve(b.effect(j,Ss({},k,{getOriginalState:S,condition:(P,_)=>E(P,_).then(Boolean),take:E,delay:R5(N.signal),pause:Ef(N.signal),extra:o,signal:N.signal,fork:H$(N.signal,A),unsubscribe:b.unsubscribe,subscribe:()=>{t.set(b.id,b)},cancelActiveListeners:()=>{b.pending.forEach((P,_,O)=>{P!==N&&(P.abort(zv),O.delete(P))})},cancel:()=>{N.abort(zv),b.pending.delete(N)},throwIfCancelled:()=>{po(N.signal)}})))}catch(P){P instanceof Ph||gk(c,P,{raisedBy:"effect"})}finally{await Promise.all(A),N.abort(B$),a(b),b.pending.delete(N)}},g=K$(t,r);return{middleware:b=>j=>k=>{if(!p5(k))return j(k);if(z5.match(k))return f(k.payload);if(G$.match(k)){g();return}if(F5.match(k))return h(k.payload);let S=b.getState();const N=()=>{if(S===mk)throw new Error(Ur(23));return S};let E;try{if(E=j(k),t.size>0){const A=b.getState(),P=Array.from(t.values());for(const _ of P){let O=!1;try{O=_.predicate(k,A,S)}catch(D){O=!1,gk(c,D,{raisedBy:"predicate"})}O&&m(_,k,b,N)}}}finally{S=mk}return E},startListening:f,stopListening:h,clearListeners:g}};function Ur(e){return`Minified Redux Toolkit error #${e}; visit https://redux-toolkit.js.org/Errors?code=${e} for the full message or use the non-minified dev environment for full errors. `}var q$={layoutType:"horizontal",width:0,height:0,margin:{top:5,right:5,bottom:5,left:5},scale:1},B5=lr({name:"chartLayout",initialState:q$,reducers:{setLayout(e,t){e.layoutType=t.payload},setChartSize(e,t){e.width=t.payload.width,e.height=t.payload.height},setMargin(e,t){var r,n,a,o;e.margin.top=(r=t.payload.top)!==null&&r!==void 0?r:0,e.margin.right=(n=t.payload.right)!==null&&n!==void 0?n:0,e.margin.bottom=(a=t.payload.bottom)!==null&&a!==void 0?a:0,e.margin.left=(o=t.payload.left)!==null&&o!==void 0?o:0},setScale(e,t){e.scale=t.payload}}}),_h=B5.actions,Q$=_h.setMargin,Y$=_h.setLayout,X$=_h.setChartSize,Z$=_h.setScale,J$=B5.reducer;function U5(e,t,r){return Array.isArray(e)&&e&&t+r!==0?e.slice(t,r+1):e}function We(e){return Number.isFinite(e)}function Vn(e){return typeof e=="number"&&e>0&&Number.isFinite(e)}function vk(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function xs(e){for(var t=1;t{if(t&&r){var n=r.width,a=r.height,o=t.align,c=t.verticalAlign,u=t.layout;if((u==="vertical"||u==="horizontal"&&c==="middle")&&o!=="center"&&Ee(e[o]))return xs(xs({},e),{},{[o]:e[o]+(n||0)});if((u==="horizontal"||u==="vertical"&&o==="center")&&c!=="middle"&&Ee(e[c]))return xs(xs({},e),{},{[c]:e[c]+(a||0)})}return e},Xn=(e,t)=>e==="horizontal"&&t==="xAxis"||e==="vertical"&&t==="yAxis"||e==="centric"&&t==="angleAxis"||e==="radial"&&t==="radiusAxis",H5=(e,t,r,n)=>{if(n)return e.map(u=>u.coordinate);var a,o,c=e.map(u=>(u.coordinate===t&&(a=!0),u.coordinate===r&&(o=!0),u.coordinate));return a||c.push(t),o||c.push(r),c},W5=(e,t,r)=>{if(!e)return null;var n=e.duplicateDomain,a=e.type,o=e.range,c=e.scale,u=e.realScaleType,f=e.isCategorical,h=e.categoricalDomain,m=e.tickCount,g=e.ticks,v=e.niceTicks,b=e.axisType;if(!c)return null;var j=u==="scaleBand"&&c.bandwidth?c.bandwidth()/2:2,k=a==="category"&&c.bandwidth?c.bandwidth()/j:0;if(k=b==="angleAxis"&&o&&o.length>=2?Jr(o[0]-o[1])*2*k:k,g||v){var S=(g||v||[]).map((N,E)=>{var A=n?n.indexOf(N):N,P=c.map(A);return We(P)?{coordinate:P+k,value:N,offset:k,index:E}:null}).filter(Ar);return S}return f&&h?h.map((N,E)=>{var A=c.map(N);return We(A)?{coordinate:A+k,value:N,index:E,offset:k}:null}).filter(Ar):c.ticks&&m!=null?c.ticks(m).map((N,E)=>{var A=c.map(N);return We(A)?{coordinate:A+k,value:N,index:E,offset:k}:null}).filter(Ar):c.domain().map((N,E)=>{var A=c.map(N);return We(A)?{coordinate:A+k,value:n?n[N]:N,index:E,offset:k}:null}).filter(Ar)},iz=e=>{var t,r=e.length;if(!(r<=0)){var n=(t=e[0])===null||t===void 0?void 0:t.length;if(!(n==null||n<=0))for(var a=0;a=0?(h[0]=o,o+=v,h[1]=o):(h[0]=c,c+=v,h[1]=c)}}}},az=e=>{var t,r=e.length;if(!(r<=0)){var n=(t=e[0])===null||t===void 0?void 0:t.length;if(!(n==null||n<=0))for(var a=0;a=0?(f[0]=o,o+=h,f[1]=o):(f[0]=0,f[1]=0)}}}},oz={sign:iz,expand:kR,none:xo,silhouette:jR,wiggle:SR,positive:az},sz=(e,t,r)=>{var n,a=(n=oz[r])!==null&&n!==void 0?n:xo,o=wR().keys(t).value((u,f)=>Number(Lt(u,f,0))).order(Ev).offset(a),c=o(e);return c.forEach((u,f)=>{u.forEach((h,m)=>{var g=Lt(e[m],t[f],0);Array.isArray(g)&&g.length===2&&Ee(g[0])&&Ee(g[1])&&(h[0]=g[0],h[1]=g[1])})}),c};function lz(e){return e==null?void 0:String(e)}function yk(e){var t=e.axis,r=e.ticks,n=e.bandSize,a=e.entry,o=e.index,c=e.dataKey;if(t.type==="category"){if(!t.allowDuplicatedCategory&&t.dataKey&&!Yt(a[t.dataKey])){var u=YE(r,"value",a[t.dataKey]);if(u)return u.coordinate+n/2}return r!=null&&r[o]?r[o].coordinate+n/2:null}var f=Lt(a,Yt(c)?t.dataKey:c),h=t.scale.map(f);return Ee(h)?h:null}var uz=e=>{var t=e.flat(2).filter(Ee);return[Math.min(...t),Math.max(...t)]},cz=e=>[e[0]===1/0?0:e[0],e[1]===-1/0?0:e[1]],dz=(e,t,r)=>{if(!(e==null||Object.keys(e).length===0))return cz(Object.keys(e).reduce((n,a)=>{var o=e[a];if(!o)return n;var c=o.stackedData,u=c.reduce((f,h)=>{var m=U5(h,t,r),g=uz(m);return!We(g[0])||!We(g[1])?f:[Math.min(f[0],g[0]),Math.max(f[1],g[1])]},[1/0,-1/0]);return[Math.min(u[0],n[0]),Math.max(u[1],n[1])]},[1/0,-1/0]))},xk=/^dataMin[\s]*-[\s]*([0-9]+([.]{1}[0-9]+){0,1})$/,bk=/^dataMax[\s]*\+[\s]*([0-9]+([.]{1}[0-9]+){0,1})$/,Af=(e,t,r)=>{if(e&&e.scale&&e.scale.bandwidth){var n=e.scale.bandwidth();if(!r||n>0)return n}if(e&&t&&t.length>=2){for(var a=wh(t,m=>m.coordinate),o=1/0,c=1,u=a.length;c{if(t==="horizontal")return e.relativeX;if(t==="vertical")return e.relativeY},hz=(e,t)=>t==="centric"?e.angle:e.radius,Ei=e=>e.layout.width,Ai=e=>e.layout.height,mz=e=>e.layout.scale,G5=e=>e.layout.margin,Mh=q(e=>e.cartesianAxis.xAxis,e=>Object.values(e)),Ih=q(e=>e.cartesianAxis.yAxis,e=>Object.values(e)),pz="data-recharts-item-index",gz="data-recharts-item-id",Ju=60;function kk(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function $d(e){for(var t=1;te.brush.height;function wz(e){var t=Ih(e);return t.reduce((r,n)=>{if(n.orientation==="left"&&!n.mirror&&!n.hide){var a=typeof n.width=="number"?n.width:Ju;return r+a}return r},0)}function kz(e){var t=Ih(e);return t.reduce((r,n)=>{if(n.orientation==="right"&&!n.mirror&&!n.hide){var a=typeof n.width=="number"?n.width:Ju;return r+a}return r},0)}function jz(e){var t=Mh(e);return t.reduce((r,n)=>n.orientation==="top"&&!n.mirror&&!n.hide?r+n.height:r,0)}function Sz(e){var t=Mh(e);return t.reduce((r,n)=>n.orientation==="bottom"&&!n.mirror&&!n.hide?r+n.height:r,0)}var Zt=q([Ei,Ai,G5,bz,wz,kz,jz,Sz,f5,KL],(e,t,r,n,a,o,c,u,f,h)=>{var m={left:(r.left||0)+a,right:(r.right||0)+o},g={top:(r.top||0)+c,bottom:(r.bottom||0)+u},v=$d($d({},g),m),b=v.bottom;v.bottom+=n,v=nz(v,f,h);var j=e-v.left-v.right,k=t-v.top-v.bottom;return $d($d({brushBottom:b},v),{},{width:Math.max(j,0),height:Math.max(k,0)})}),Nz=q(Zt,e=>({x:e.left,y:e.top,width:e.width,height:e.height})),V5=q(Ei,Ai,(e,t)=>({x:0,y:0,width:e,height:t})),Ez=y.createContext(null),Pr=()=>y.useContext(Ez)!=null,Th=e=>e.brush,Dh=q([Th,Zt,G5],(e,t,r)=>({height:e.height,x:Ee(e.x)?e.x:t.left,y:Ee(e.y)?e.y:t.top+t.height+t.brushBottom-((r==null?void 0:r.bottom)||0),width:Ee(e.width)?e.width:t.width}));function Az(e,t,{signal:r,edges:n}={}){let a,o=null;const c=n!=null&&n.includes("leading"),u=n==null||n.includes("trailing"),f=()=>{o!==null&&(e.apply(a,o),a=void 0,o=null)},h=()=>{u&&f(),b()};let m=null;const g=()=>{m!=null&&clearTimeout(m),m=setTimeout(()=>{m=null,h()},t)},v=()=>{m!==null&&(clearTimeout(m),m=null)},b=()=>{v(),a=void 0,o=null},j=()=>{f()},k=function(...S){if(r!=null&&r.aborted)return;a=this,o=S;const N=m==null;g(),c&&N&&f()};return k.schedule=g,k.cancel=b,k.flush=j,r==null||r.addEventListener("abort",b,{once:!0}),k}function Cz(e,t=0,r={}){typeof r!="object"&&(r={});const{leading:n=!1,trailing:a=!0,maxWait:o}=r,c=Array(2);n&&(c[0]="leading"),a&&(c[1]="trailing");let u,f=null;const h=Az(function(...v){u=e.apply(this,v),f=null},t,{edges:c}),m=function(...v){return o!=null&&(f===null&&(f=Date.now()),Date.now()-f>=o)?(u=e.apply(this,v),f=Date.now(),h.cancel(),h.schedule(),u):(h.apply(this,v),u)},g=()=>(h.flush(),u);return m.cancel=h.cancel,m.flush=g,m}function Pz(e,t=0,r={}){const{leading:n=!0,trailing:a=!0}=r;return Cz(e,t,{leading:n,maxWait:t,trailing:a})}var Cf=function(t,r){for(var n=arguments.length,a=new Array(n>2?n-2:0),o=2;oa[c++]))}},zn={width:"100%",height:"100%",debounce:0,minWidth:0,initialDimension:{width:-1,height:-1}},q5=(e,t,r)=>{var n=r.width,a=n===void 0?zn.width:n,o=r.height,c=o===void 0?zn.height:o,u=r.aspect,f=r.maxHeight,h=bo(a)?e:Number(a),m=bo(c)?t:Number(c);return u&&u>0&&(h?m=h/u:m&&(h=m*u),f&&m!=null&&m>f&&(m=f)),{calculatedWidth:h,calculatedHeight:m}},Oz={width:0,height:0,overflow:"visible"},_z={width:0,overflowX:"visible"},Mz={height:0,overflowY:"visible"},Iz={},Tz=e=>{var t=e.width,r=e.height,n=bo(t),a=bo(r);return n&&a?Oz:n?_z:a?Mz:Iz};function Dz(e){var t=e.width,r=e.height,n=e.aspect,a=t,o=r;return a===void 0&&o===void 0?(a=zn.width,o=zn.height):a===void 0?a=n&&n>0?void 0:zn.width:o===void 0&&(o=n&&n>0?void 0:zn.height),{width:a,height:o}}var Rz=["aspect","initialDimension","width","height","minWidth","minHeight","maxHeight","children","debounce","id","className","onResize","style"];function Pf(){return Pf=Object.assign?Object.assign.bind():function(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);r({width:r,height:n}),[r,n]);return Vz(a)?y.createElement(Q5.Provider,{value:a},t):null}var Ky=()=>y.useContext(Q5),qz=y.forwardRef((e,t)=>{var r=e.aspect,n=e.initialDimension,a=n===void 0?zn.initialDimension:n,o=e.width,c=e.height,u=e.minWidth,f=u===void 0?zn.minWidth:u,h=e.minHeight,m=e.maxHeight,g=e.children,v=e.debounce,b=v===void 0?zn.debounce:v,j=e.id,k=e.className,S=e.onResize,N=e.style,E=N===void 0?{}:N,A=Kz(e,Rz),P=y.useRef(null),_=y.useRef();_.current=S,y.useImperativeHandle(t,()=>P.current);var O=y.useState({containerWidth:a.width,containerHeight:a.height}),D=Fz(O,2),U=D[0],B=D[1],F=y.useCallback((ae,se)=>{B(X=>{var te=Math.round(ae),J=Math.round(se);return X.containerWidth===te&&X.containerHeight===J?X:{containerWidth:te,containerHeight:J}})},[]);y.useEffect(()=>{if(P.current==null||typeof ResizeObserver>"u")return rl;var ae=I=>{var M,K=I[0];if(K!=null){var ne=K.contentRect,Z=ne.width,me=ne.height;F(Z,me),(M=_.current)===null||M===void 0||M.call(_,Z,me)}};b>0&&(ae=Pz(ae,b,{trailing:!0,leading:!1}));var se=new ResizeObserver(ae),X=P.current.getBoundingClientRect(),te=X.width,J=X.height;return F(te,J),se.observe(P.current),()=>{se.disconnect()}},[F,b]);var Y=U.containerWidth,H=U.containerHeight;Cf(!r||r>0,"The aspect(%s) must be greater than zero.",r);var pe=q5(Y,H,{width:o,height:c,aspect:r,maxHeight:m}),ue=pe.calculatedWidth,he=pe.calculatedHeight;return Cf(Y<0||H<0||ue!=null&&ue>0||he!=null&&he>0,`The width(%s) and height(%s) of chart should be greater than 0, + */var Qw;function SL(){if(Qw)return fg;Qw=1;var e=tl(),t=jL();function r(h,m){return h===m&&(h!==0||1/h===1/m)||h!==h&&m!==m}var n=typeof Object.is=="function"?Object.is:r,a=t.useSyncExternalStore,o=e.useRef,c=e.useEffect,u=e.useMemo,f=e.useDebugValue;return fg.useSyncExternalStoreWithSelector=function(h,m,g,v,b){var j=o(null);if(j.current===null){var k={hasValue:!1,value:null};j.current=k}else k=j.current;j=u(function(){function N(O){if(!E){if(E=!0,A=O,O=v(O),b!==void 0&&k.hasValue){var D=k.value;if(b(D,O))return P=D}return P=O}if(D=P,n(A,O))return D;var U=v(O);return b!==void 0&&b(D,U)?(A=O,D):(A=O,P=U)}var E=!1,A,P,_=g===void 0?null:g;return[function(){return N(m())},_===null?void 0:function(){return N(_())}]},[m,g,v,b]);var S=a(h,j[0],j[1]);return c(function(){k.hasValue=!0,k.value=S},[S]),f(S),S},fg}var Yw;function NL(){return Yw||(Yw=1,dg.exports=SL()),dg.exports}var EL=NL(),zy=y.createContext(null),AL=e=>e,Nt=()=>{var e=y.useContext(zy);return e?e.store.dispatch:AL},Jd=()=>{},CL=()=>Jd,PL=(e,t)=>e===t;function Me(e){var t=y.useContext(zy),r=y.useMemo(()=>t?n=>{if(n!=null)return e(n)}:Jd,[t,e]);return EL.useSyncExternalStoreWithSelector(t?t.subscription.addNestedSub:CL,t?t.store.getState:Jd,t?t.store.getState:Jd,r,PL)}function OL(e,t=`expected a function, instead received ${typeof e}`){if(typeof e!="function")throw new TypeError(t)}function _L(e,t="expected all items to be functions, instead received the following types: "){if(!e.every(r=>typeof r=="function")){const r=e.map(n=>typeof n=="function"?`function ${n.name||"unnamed"}()`:typeof n).join(", ");throw new TypeError(`${t}[${r}]`)}}var Xw=e=>Array.isArray(e)?e:[e];function ML(e){const t=Array.isArray(e[0])?e[0]:e;return _L(t,"createSelector expects all input-selectors to be functions, but received the following types: "),t}function IL(e,t){const r=[],{length:n}=e;for(let a=0;atypeof WeakRef>"u"?TL:WeakRef,u5=DL(),RL=0,Zw=1;function Id(){return{s:RL,v:void 0,o:null,p:null}}function LL(e){return e instanceof u5?e.deref():e}function c5(e,t={}){let r=Id();const{resultEqualityCheck:n}=t;let a,o=0;function c(){let u=r;const{length:f}=arguments;for(let g=0,v=f;g{r=Id(),c.resetResultsCount()},c.resultsCount=()=>o,c.resetResultsCount=()=>{o=0},c}function $L(e,...t){const r=typeof e=="function"?{memoize:e,memoizeOptions:t}:e,n=(...a)=>{let o=0,c=0,u,f={},h=a.pop();typeof h=="object"&&(f=h,h=a.pop()),OL(h,`createSelector expects an output function after the inputs, but received: [${typeof h}]`);const m={...r,...f},{memoize:g,memoizeOptions:v=[],argsMemoize:b=c5,argsMemoizeOptions:j=[]}=m,k=Xw(v),S=Xw(j),N=ML(a),E=g(function(){return o++,h.apply(null,arguments)},...k),A=b(function(){c++;const _=IL(N,arguments);return u=E.apply(null,_),u},...S);return Object.assign(A,{resultFunc:h,memoizedResultFunc:E,dependencies:N,dependencyRecomputations:()=>c,resetDependencyRecomputations:()=>{c=0},lastResult:()=>u,recomputations:()=>o,resetRecomputations:()=>{o=0},memoize:g,argsMemoize:b})};return Object.assign(n,{withTypes:()=>n}),n}var q=$L(c5);function zL(e,t=1){const r=[],n=Math.floor(t),a=(o,c)=>{for(let u=0;u{if(e!==t){const n=Jw(e),a=Jw(t);if(n===a&&n===0){if(et)return r==="desc"?-1:1}return r==="desc"?a-n:n-a}return 0};function d5(e){return typeof e=="symbol"||e instanceof Symbol}const BL=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,UL=/^\w*$/;function HL(e,t){return Array.isArray(e)?!1:typeof e=="number"||typeof e=="boolean"||e==null||d5(e)?!0:typeof e=="string"&&(UL.test(e)||!BL.test(e))||t!=null}function WL(e,t,r,n){if(e==null)return[];r=r,Array.isArray(e)||(e=Object.values(e)),Array.isArray(t)||(t=t==null?[null]:[t]),t.length===0&&(t=[null]),Array.isArray(r)||(r=r==null?[]:[r]),r=r.map(u=>String(u));const a=(u,f)=>{let h=u;for(let m=0;mf==null||u==null?f:typeof u=="object"&&"key"in u?Object.hasOwn(f,u.key)?f[u.key]:a(f,u.path):typeof u=="function"?u(f):Array.isArray(u)?a(f,u):typeof f=="object"?f[u]:f,c=t.map(u=>(Array.isArray(u)&&u.length===1&&(u=u[0]),u==null||typeof u=="function"||Array.isArray(u)||HL(u)?u:{key:u,path:Dy(u)}));return e.map(u=>({original:u,criteria:c.map(f=>o(f,u))})).slice().sort((u,f)=>{for(let h=0;hu.original)}function wh(e,...t){const r=t.length;return r>1&&Ov(e,t[0],t[1])?t=[]:r>2&&Ov(t[0],t[1],t[2])&&(t=[t[0]]),WL(e,zL(t),["asc"])}var f5=e=>e.legend.settings,KL=e=>e.legend.size,GL=e=>e.legend.payload;q([GL,f5],(e,t)=>{var r=t.itemSorter,n=e.flat(1);return r?wh(n,r):n});function VL(e,t){return XL(e)||YL(e,t)||QL(e,t)||qL()}function qL(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function QL(e,t){if(e){if(typeof e=="string")return ek(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?ek(e,t):void 0}}function ek(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);rTd||Math.abs(e.left-t.left)>Td||Math.abs(e.top-t.top)>Td||Math.abs(e.width-t.width)>Td}function rk(e){var t=e.getBoundingClientRect();return{height:t.height,left:t.left,top:t.top,width:t.width}}function ZL(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],t=y.useState({height:0,left:0,top:0,width:0}),r=VL(t,2),n=r[0],a=r[1],o=y.useRef(null),c=y.useRef(n);c.current=n;var u=y.useCallback(f=>{if(o.current!=null&&(o.current.disconnect(),o.current=null),f!=null){var h=rk(f);if(tk(h,c.current)&&a(h),typeof ResizeObserver<"u"){var m=new ResizeObserver(()=>{var g=rk(f);tk(g,c.current)&&a(g)});m.observe(f),o.current=m}}},[...e]);return y.useEffect(()=>()=>{var f;(f=o.current)===null||f===void 0||f.disconnect()},[]),[n,u]}function Kt(e){return`Minified Redux error #${e}; visit https://redux.js.org/Errors?code=${e} for the full message or use the non-minified dev environment for full errors. `}var JL=typeof Symbol=="function"&&Symbol.observable||"@@observable",nk=JL,pg=()=>Math.random().toString(36).substring(7).split("").join("."),e$={INIT:`@@redux/INIT${pg()}`,REPLACE:`@@redux/REPLACE${pg()}`,PROBE_UNKNOWN_ACTION:()=>`@@redux/PROBE_UNKNOWN_ACTION${pg()}`},vf=e$;function Fy(e){if(typeof e!="object"||e===null)return!1;let t=e;for(;Object.getPrototypeOf(t)!==null;)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t||Object.getPrototypeOf(e)===null}function h5(e,t,r){if(typeof e!="function")throw new Error(Kt(2));if(typeof t=="function"&&typeof r=="function"||typeof r=="function"&&typeof arguments[3]=="function")throw new Error(Kt(0));if(typeof t=="function"&&typeof r>"u"&&(r=t,t=void 0),typeof r<"u"){if(typeof r!="function")throw new Error(Kt(1));return r(h5)(e,t)}let n=e,a=t,o=new Map,c=o,u=0,f=!1;function h(){c===o&&(c=new Map,o.forEach((S,N)=>{c.set(N,S)}))}function m(){if(f)throw new Error(Kt(3));return a}function g(S){if(typeof S!="function")throw new Error(Kt(4));if(f)throw new Error(Kt(5));let N=!0;h();const E=u++;return c.set(E,S),function(){if(N){if(f)throw new Error(Kt(6));N=!1,h(),c.delete(E),o=null}}}function v(S){if(!Fy(S))throw new Error(Kt(7));if(typeof S.type>"u")throw new Error(Kt(8));if(typeof S.type!="string")throw new Error(Kt(17));if(f)throw new Error(Kt(9));try{f=!0,a=n(a,S)}finally{f=!1}return(o=c).forEach(E=>{E()}),S}function b(S){if(typeof S!="function")throw new Error(Kt(10));n=S,v({type:vf.REPLACE})}function j(){const S=g;return{subscribe(N){if(typeof N!="object"||N===null)throw new Error(Kt(11));function E(){const P=N;P.next&&P.next(m())}return E(),{unsubscribe:S(E)}},[nk](){return this}}}return v({type:vf.INIT}),{dispatch:v,subscribe:g,getState:m,replaceReducer:b,[nk]:j}}function t$(e){Object.keys(e).forEach(t=>{const r=e[t];if(typeof r(void 0,{type:vf.INIT})>"u")throw new Error(Kt(12));if(typeof r(void 0,{type:vf.PROBE_UNKNOWN_ACTION()})>"u")throw new Error(Kt(13))})}function m5(e){const t=Object.keys(e),r={};for(let o=0;o"u")throw u&&u.type,new Error(Kt(14));h[g]=j,f=f||j!==b}return f=f||n.length!==Object.keys(c).length,f?h:c}}function yf(...e){return e.length===0?t=>t:e.length===1?e[0]:e.reduce((t,r)=>(...n)=>t(r(...n)))}function r$(...e){return t=>(r,n)=>{const a=t(r,n);let o=()=>{throw new Error(Kt(15))};const c={getState:a.getState,dispatch:(f,...h)=>o(f,...h)},u=e.map(f=>f(c));return o=yf(...u)(a.dispatch),{...a,dispatch:o}}}function p5(e){return Fy(e)&&"type"in e&&typeof e.type=="string"}var g5=Symbol.for("immer-nothing"),ik=Symbol.for("immer-draftable"),vr=Symbol.for("immer-state");function yn(e,...t){throw new Error(`[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`)}var Br=Object,Vs=Br.getPrototypeOf,xf="constructor",kh="prototype",_v="configurable",bf="enumerable",ef="writable",Cu="value",wi=e=>!!e&&!!e[vr];function jn(e){var t;return e?v5(e)||Sh(e)||!!e[ik]||!!((t=e[xf])!=null&&t[ik])||Nh(e)||Eh(e):!1}var n$=Br[kh][xf].toString(),ak=new WeakMap;function v5(e){if(!e||!By(e))return!1;const t=Vs(e);if(t===null||t===Br[kh])return!0;const r=Br.hasOwnProperty.call(t,xf)&&t[xf];if(r===Object)return!0;if(!ys(r))return!1;let n=ak.get(r);return n===void 0&&(n=Function.toString.call(r),ak.set(r,n)),n===n$}function jh(e,t,r=!0){Xu(e)===0?(r?Reflect.ownKeys(e):Br.keys(e)).forEach(a=>{t(a,e[a],e)}):e.forEach((n,a)=>t(a,n,e))}function Xu(e){const t=e[vr];return t?t.type_:Sh(e)?1:Nh(e)?2:Eh(e)?3:0}var ok=(e,t,r=Xu(e))=>r===2?e.has(t):Br[kh].hasOwnProperty.call(e,t),Mv=(e,t,r=Xu(e))=>r===2?e.get(t):e[t],wf=(e,t,r,n=Xu(e))=>{n===2?e.set(t,r):n===3?e.add(r):e[t]=r};function i$(e,t){return e===t?e!==0||1/e===1/t:e!==e&&t!==t}var Sh=Array.isArray,Nh=e=>e instanceof Map,Eh=e=>e instanceof Set,By=e=>typeof e=="object",ys=e=>typeof e=="function",gg=e=>typeof e=="boolean";function a$(e){const t=+e;return Number.isInteger(t)&&String(t)===e}var ci=e=>e.copy_||e.base_,Uy=e=>e.modified_?e.copy_:e.base_;function Iv(e,t){if(Nh(e))return new Map(e);if(Eh(e))return new Set(e);if(Sh(e))return Array[kh].slice.call(e);const r=v5(e);if(t===!0||t==="class_only"&&!r){const n=Br.getOwnPropertyDescriptors(e);delete n[vr];let a=Reflect.ownKeys(n);for(let o=0;o1&&Br.defineProperties(e,{set:Dd,add:Dd,clear:Dd,delete:Dd}),Br.freeze(e),t&&jh(e,(r,n)=>{Hy(n,!0)},!1)),e}function o$(){yn(2)}var Dd={[Cu]:o$};function Ah(e){return e===null||!By(e)?!0:Br.isFrozen(e)}var kf="MapSet",Tv="Patches",sk="ArrayMethods",y5={};function wo(e){const t=y5[e];return t||yn(0,e),t}var lk=e=>!!y5[e],Pu,x5=()=>Pu,s$=(e,t)=>({drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0,handledSet_:new Set,processedForPatches_:new Set,mapSetPlugin_:lk(kf)?wo(kf):void 0,arrayMethodsPlugin_:lk(sk)?wo(sk):void 0});function uk(e,t){t&&(e.patchPlugin_=wo(Tv),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function Dv(e){Rv(e),e.drafts_.forEach(l$),e.drafts_=null}function Rv(e){e===Pu&&(Pu=e.parent_)}var ck=e=>Pu=s$(Pu,e);function l$(e){const t=e[vr];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0}function dk(e,t){t.unfinalizedDrafts_=t.drafts_.length;const r=t.drafts_[0];if(e!==void 0&&e!==r){r[vr].modified_&&(Dv(t),yn(4)),jn(e)&&(e=fk(t,e));const{patchPlugin_:a}=t;a&&a.generateReplacementPatches_(r[vr].base_,e,t)}else e=fk(t,r);return u$(t,e,!0),Dv(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e!==g5?e:void 0}function fk(e,t){if(Ah(t))return t;const r=t[vr];if(!r)return jf(t,e.handledSet_,e);if(!Ch(r,e))return t;if(!r.modified_)return r.base_;if(!r.finalized_){const{callbacks_:n}=r;if(n)for(;n.length>0;)n.pop()(e);k5(r,e)}return r.copy_}function u$(e,t,r=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&Hy(t,r)}function b5(e){e.finalized_=!0,e.scope_.unfinalizedDrafts_--}var Ch=(e,t)=>e.scope_===t,c$=[];function w5(e,t,r,n){const a=ci(e),o=e.type_;if(n!==void 0&&Mv(a,n,o)===t){wf(a,n,r,o);return}if(!e.draftLocations_){const u=e.draftLocations_=new Map;jh(a,(f,h)=>{if(wi(h)){const m=u.get(h)||[];m.push(f),u.set(h,m)}})}const c=e.draftLocations_.get(t)??c$;for(const u of c)wf(a,u,r,o)}function d$(e,t,r){e.callbacks_.push(function(a){var u;const o=t;if(!o||!Ch(o,a))return;(u=a.mapSetPlugin_)==null||u.fixSetContents(o);const c=Uy(o);w5(e,o.draft_??o,c,r),k5(o,a)})}function k5(e,t){var n;if(e.modified_&&!e.finalized_&&(e.type_===3||e.type_===1&&e.allIndicesReassigned_||(((n=e.assigned_)==null?void 0:n.size)??0)>0)){const{patchPlugin_:a}=t;if(a){const o=a.getPath(e);o&&a.generatePatches_(e,o,t)}b5(e)}}function f$(e,t,r){const{scope_:n}=e;if(wi(r)){const a=r[vr];Ch(a,n)&&a.callbacks_.push(function(){tf(e);const c=Uy(a);w5(e,r,c,t)})}else jn(r)&&e.callbacks_.push(function(){const o=ci(e);e.type_===3?o.has(r)&&jf(r,n.handledSet_,n):Mv(o,t,e.type_)===r&&n.drafts_.length>1&&(e.assigned_.get(t)??!1)===!0&&e.copy_&&jf(Mv(e.copy_,t,e.type_),n.handledSet_,n)})}function jf(e,t,r){return!r.immer_.autoFreeze_&&r.unfinalizedDrafts_<1||wi(e)||t.has(e)||!jn(e)||Ah(e)||(t.add(e),jh(e,(n,a)=>{if(wi(a)){const o=a[vr];if(Ch(o,r)){const c=Uy(o);wf(e,n,c,e.type_),b5(o)}}else jn(a)&&jf(a,t,r)})),e}function h$(e,t){const r=Sh(e),n={type_:r?1:0,scope_:t?t.scope_:x5(),modified_:!1,finalized_:!1,assigned_:void 0,parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1,callbacks_:void 0};let a=n,o=Sf;r&&(a=[n],o=Ou);const{revoke:c,proxy:u}=Proxy.revocable(a,o);return n.draft_=u,n.revoke_=c,[u,n]}var Sf={get(e,t){if(t===vr)return e;let r=e.scope_.arrayMethodsPlugin_;const n=e.type_===1&&typeof t=="string";if(n&&r!=null&&r.isArrayOperationMethod(t))return r.createMethodInterceptor(e,t);const a=ci(e);if(!ok(a,t,e.type_))return m$(e,a,t);const o=a[t];if(e.finalized_||!jn(o)||n&&e.operationMethod&&(r!=null&&r.isMutatingArrayMethod(e.operationMethod))&&a$(t))return o;if(o===vg(e.base_,t)){tf(e);const c=e.type_===1?+t:t,u=$v(e.scope_,o,e,c);return e.copy_[c]=u}return o},has(e,t){return t in ci(e)},ownKeys(e){return Reflect.ownKeys(ci(e))},set(e,t,r){const n=j5(ci(e),t);if(n!=null&&n.set)return n.set.call(e.draft_,r),!0;if(!e.modified_){const a=vg(ci(e),t),o=a==null?void 0:a[vr];if(o&&o.base_===r)return e.copy_[t]=r,e.assigned_.set(t,!1),!0;if(i$(r,a)&&(r!==void 0||ok(e.base_,t,e.type_)))return!0;tf(e),Lv(e)}return e.copy_[t]===r&&(r!==void 0||t in e.copy_)||Number.isNaN(r)&&Number.isNaN(e.copy_[t])||(e.copy_[t]=r,e.assigned_.set(t,!0),f$(e,t,r)),!0},deleteProperty(e,t){return tf(e),vg(e.base_,t)!==void 0||t in e.base_?(e.assigned_.set(t,!1),Lv(e)):e.assigned_.delete(t),e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){const r=ci(e),n=Reflect.getOwnPropertyDescriptor(r,t);return n&&{[ef]:!0,[_v]:e.type_!==1||t!=="length",[bf]:n[bf],[Cu]:r[t]}},defineProperty(){yn(11)},getPrototypeOf(e){return Vs(e.base_)},setPrototypeOf(){yn(12)}},Ou={};for(let e in Sf){let t=Sf[e];Ou[e]=function(){const r=arguments;return r[0]=r[0][0],t.apply(this,r)}}Ou.deleteProperty=function(e,t){return Ou.set.call(this,e,t,void 0)};Ou.set=function(e,t,r){return Sf.set.call(this,e[0],t,r,e[0])};function vg(e,t){const r=e[vr];return(r?ci(r):e)[t]}function m$(e,t,r){var a;const n=j5(t,r);return n?Cu in n?n[Cu]:(a=n.get)==null?void 0:a.call(e.draft_):void 0}function j5(e,t){if(!(t in e))return;let r=Vs(e);for(;r;){const n=Object.getOwnPropertyDescriptor(r,t);if(n)return n;r=Vs(r)}}function Lv(e){e.modified_||(e.modified_=!0,e.parent_&&Lv(e.parent_))}function tf(e){e.copy_||(e.assigned_=new Map,e.copy_=Iv(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var p$=class{constructor(t){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!1,this.produce=(r,n,a)=>{if(ys(r)&&!ys(n)){const c=n;n=r;const u=this;return function(h=c,...m){return u.produce(h,g=>n.call(this,g,...m))}}ys(n)||yn(6),a!==void 0&&!ys(a)&&yn(7);let o;if(jn(r)){const c=ck(this),u=$v(c,r,void 0);let f=!0;try{o=n(u),f=!1}finally{f?Dv(c):Rv(c)}return uk(c,a),dk(o,c)}else if(!r||!By(r)){if(o=n(r),o===void 0&&(o=r),o===g5&&(o=void 0),this.autoFreeze_&&Hy(o,!0),a){const c=[],u=[];wo(Tv).generateReplacementPatches_(r,o,{patches_:c,inversePatches_:u}),a(c,u)}return o}else yn(1,r)},this.produceWithPatches=(r,n)=>{if(ys(r))return(u,...f)=>this.produceWithPatches(u,h=>r(h,...f));let a,o;return[this.produce(r,n,(u,f)=>{a=u,o=f}),a,o]},gg(t==null?void 0:t.autoFreeze)&&this.setAutoFreeze(t.autoFreeze),gg(t==null?void 0:t.useStrictShallowCopy)&&this.setUseStrictShallowCopy(t.useStrictShallowCopy),gg(t==null?void 0:t.useStrictIteration)&&this.setUseStrictIteration(t.useStrictIteration)}createDraft(t){jn(t)||yn(8),wi(t)&&(t=en(t));const r=ck(this),n=$v(r,t,void 0);return n[vr].isManual_=!0,Rv(r),n}finishDraft(t,r){const n=t&&t[vr];(!n||!n.isManual_)&&yn(9);const{scope_:a}=n;return uk(a,r),dk(void 0,a)}setAutoFreeze(t){this.autoFreeze_=t}setUseStrictShallowCopy(t){this.useStrictShallowCopy_=t}setUseStrictIteration(t){this.useStrictIteration_=t}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(t,r){let n;for(n=r.length-1;n>=0;n--){const o=r[n];if(o.path.length===0&&o.op==="replace"){t=o.value;break}}n>-1&&(r=r.slice(n+1));const a=wo(Tv).applyPatches_;return wi(t)?a(t,r):this.produce(t,o=>a(o,r))}};function $v(e,t,r,n){const[a,o]=Nh(t)?wo(kf).proxyMap_(t,r):Eh(t)?wo(kf).proxySet_(t,r):h$(t,r);return((r==null?void 0:r.scope_)??x5()).drafts_.push(a),o.callbacks_=(r==null?void 0:r.callbacks_)??[],o.key_=n,r&&n!==void 0?d$(r,o,n):o.callbacks_.push(function(f){var m;(m=f.mapSetPlugin_)==null||m.fixSetContents(o);const{patchPlugin_:h}=f;o.modified_&&h&&h.generatePatches_(o,[],f)}),a}function en(e){return wi(e)||yn(10,e),S5(e)}function S5(e){if(!jn(e)||Ah(e))return e;const t=e[vr];let r,n=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,r=Iv(e,t.scope_.immer_.useStrictShallowCopy_),n=t.scope_.immer_.shouldUseStrictIteration()}else r=Iv(e,!0);return jh(r,(a,o)=>{wf(r,a,S5(o))},n),t&&(t.finalized_=!1),r}var g$=new p$,N5=g$.produce;function E5(e){return({dispatch:r,getState:n})=>a=>o=>typeof o=="function"?o(r,n,e):a(o)}var v$=E5(),y$=E5,x$=typeof window<"u"&&window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__?window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__:function(){if(arguments.length!==0)return typeof arguments[0]=="object"?yf:yf.apply(null,arguments)};function Hr(e,t){function r(...n){if(t){let a=t(...n);if(!a)throw new Error(Ur(0));return{type:e,payload:a.payload,..."meta"in a&&{meta:a.meta},..."error"in a&&{error:a.error}}}return{type:e,payload:n[0]}}return r.toString=()=>`${e}`,r.type=e,r.match=n=>p5(n)&&n.type===e,r}var A5=class pu extends Array{constructor(...t){super(...t),Object.setPrototypeOf(this,pu.prototype)}static get[Symbol.species](){return pu}concat(...t){return super.concat.apply(this,t)}prepend(...t){return t.length===1&&Array.isArray(t[0])?new pu(...t[0].concat(this)):new pu(...t.concat(this))}};function hk(e){return jn(e)?N5(e,()=>{}):e}function Rd(e,t,r){return e.has(t)?e.get(t):e.set(t,r(t)).get(t)}function b$(e){return typeof e=="boolean"}var w$=()=>function(t){const{thunk:r=!0,immutableCheck:n=!0,serializableCheck:a=!0,actionCreatorCheck:o=!0}=t??{};let c=new A5;return r&&(b$(r)?c.push(v$):c.push(y$(r.extraArgument))),c},C5="RTK_autoBatch",st=()=>e=>({payload:e,meta:{[C5]:!0}}),mk=e=>t=>{setTimeout(t,e)},k$=(e,t)=>r=>{let n=!1;const a=()=>{n||(n=!0,cancelAnimationFrame(o),clearTimeout(c),r())},o=e(a),c=setTimeout(a,t)},P5=(e={type:"raf"})=>t=>(...r)=>{const n=t(...r);let a=!0,o=!1,c=!1;const u=new Set,f=e.type==="tick"?queueMicrotask:e.type==="raf"?typeof window<"u"&&window.requestAnimationFrame?k$(window.requestAnimationFrame,100):mk(10):e.type==="callback"?e.queueNotification:mk(e.timeout),h=()=>{c=!1,o&&(o=!1,u.forEach(m=>m()))};return Object.assign({},n,{subscribe(m){const g=()=>a&&m(),v=n.subscribe(g);return u.add(m),()=>{v(),u.delete(m)}},dispatch(m){var g;try{return a=!((g=m==null?void 0:m.meta)!=null&&g[C5]),o=!a,o&&(c||(c=!0,f(h))),n.dispatch(m)}finally{a=!0}}})},j$=e=>function(r){const{autoBatch:n=!0}=r??{};let a=new A5(e);return n&&a.push(P5(typeof n=="object"?n:void 0)),a};function S$(e){const t=w$(),{reducer:r=void 0,middleware:n,devTools:a=!0,preloadedState:o=void 0,enhancers:c=void 0}=e||{};let u;if(typeof r=="function")u=r;else if(Fy(r))u=m5(r);else throw new Error(Ur(1));let f;typeof n=="function"?f=n(t):f=t();let h=yf;a&&(h=x$({trace:!1,...typeof a=="object"&&a}));const m=r$(...f),g=j$(m);let v=typeof c=="function"?c(g):g();const b=h(...v);return h5(u,o,b)}function O5(e){const t={},r=[];let n;const a={addCase(o,c){const u=typeof o=="string"?o:o.type;if(!u)throw new Error(Ur(28));if(u in t)throw new Error(Ur(29));return t[u]=c,a},addAsyncThunk(o,c){return c.pending&&(t[o.pending.type]=c.pending),c.rejected&&(t[o.rejected.type]=c.rejected),c.fulfilled&&(t[o.fulfilled.type]=c.fulfilled),c.settled&&r.push({matcher:o.settled,reducer:c.settled}),a},addMatcher(o,c){return r.push({matcher:o,reducer:c}),a},addDefaultCase(o){return n=o,a}};return e(a),[t,r,n]}function N$(e){return typeof e=="function"}function E$(e,t){let[r,n,a]=O5(t),o;if(N$(e))o=()=>hk(e());else{const u=hk(e);o=()=>u}function c(u=o(),f){let h=[r[f.type],...n.filter(({matcher:m})=>m(f)).map(({reducer:m})=>m)];return h.filter(m=>!!m).length===0&&(h=[a]),h.reduce((m,g)=>{if(g)if(wi(m)){const b=g(m,f);return b===void 0?m:b}else{if(jn(m))return N5(m,v=>g(v,f));{const v=g(m,f);if(v===void 0){if(m===null)return m;throw Error("A case reducer on a non-draftable value must not return undefined")}return v}}return m},u)}return c.getInitialState=o,c}var A$="ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW",C$=(e=21)=>{let t="",r=e;for(;r--;)t+=A$[Math.random()*64|0];return t},P$=Symbol.for("rtk-slice-createasyncthunk");function O$(e,t){return`${e}/${t}`}function _$({creators:e}={}){var r;const t=(r=e==null?void 0:e.asyncThunk)==null?void 0:r[P$];return function(a){const{name:o,reducerPath:c=o}=a;if(!o)throw new Error(Ur(11));const u=(typeof a.reducers=="function"?a.reducers(I$()):a.reducers)||{},f=Object.keys(u),h={sliceCaseReducersByName:{},sliceCaseReducersByType:{},actionCreators:{},sliceMatchers:[]},m={addCase(P,_){const O=typeof P=="string"?P:P.type;if(!O)throw new Error(Ur(12));if(O in h.sliceCaseReducersByType)throw new Error(Ur(13));return h.sliceCaseReducersByType[O]=_,m},addMatcher(P,_){return h.sliceMatchers.push({matcher:P,reducer:_}),m},exposeAction(P,_){return h.actionCreators[P]=_,m},exposeCaseReducer(P,_){return h.sliceCaseReducersByName[P]=_,m}};f.forEach(P=>{const _=u[P],O={reducerName:P,type:O$(o,P),createNotation:typeof a.reducers=="function"};D$(_)?L$(O,_,m,t):T$(O,_,m)});function g(){const[P={},_=[],O=void 0]=typeof a.extraReducers=="function"?O5(a.extraReducers):[a.extraReducers],D={...P,...h.sliceCaseReducersByType};return E$(a.initialState,U=>{for(let B in D)U.addCase(B,D[B]);for(let B of h.sliceMatchers)U.addMatcher(B.matcher,B.reducer);for(let B of _)U.addMatcher(B.matcher,B.reducer);O&&U.addDefaultCase(O)})}const v=P=>P,b=new Map,j=new WeakMap;let k;function S(P,_){return k||(k=g()),k(P,_)}function N(){return k||(k=g()),k.getInitialState()}function E(P,_=!1){function O(U){let B=U[P];return typeof B>"u"&&_&&(B=Rd(j,O,N)),B}function D(U=v){const B=Rd(b,_,()=>new WeakMap);return Rd(B,U,()=>{const F={};for(const[Y,H]of Object.entries(a.selectors??{}))F[Y]=M$(H,U,()=>Rd(j,U,N),_);return F})}return{reducerPath:P,getSelectors:D,get selectors(){return D(O)},selectSlice:O}}const A={name:o,reducer:S,actions:h.actionCreators,caseReducers:h.sliceCaseReducersByName,getInitialState:N,...E(c),injectInto(P,{reducerPath:_,...O}={}){const D=_??c;return P.inject({reducerPath:D,reducer:S},O),{...A,...E(D,!0)}}};return A}}function M$(e,t,r,n){function a(o,...c){let u=t(o);return typeof u>"u"&&n&&(u=r()),e(u,...c)}return a.unwrapped=e,a}var lr=_$();function I$(){function e(t,r){return{_reducerDefinitionType:"asyncThunk",payloadCreator:t,...r}}return e.withTypes=()=>e,{reducer(t){return Object.assign({[t.name](...r){return t(...r)}}[t.name],{_reducerDefinitionType:"reducer"})},preparedReducer(t,r){return{_reducerDefinitionType:"reducerWithPrepare",prepare:t,reducer:r}},asyncThunk:e}}function T$({type:e,reducerName:t,createNotation:r},n,a){let o,c;if("reducer"in n){if(r&&!R$(n))throw new Error(Ur(17));o=n.reducer,c=n.prepare}else o=n;a.addCase(e,o).exposeCaseReducer(t,o).exposeAction(t,c?Hr(e,c):Hr(e))}function D$(e){return e._reducerDefinitionType==="asyncThunk"}function R$(e){return e._reducerDefinitionType==="reducerWithPrepare"}function L$({type:e,reducerName:t},r,n,a){if(!a)throw new Error(Ur(18));const{payloadCreator:o,fulfilled:c,pending:u,rejected:f,settled:h,options:m}=r,g=a(e,o,m);n.exposeAction(t,g),c&&n.addCase(g.fulfilled,c),u&&n.addCase(g.pending,u),f&&n.addCase(g.rejected,f),h&&n.addMatcher(g.settled,h),n.exposeCaseReducer(t,{fulfilled:c||Ld,pending:u||Ld,rejected:f||Ld,settled:h||Ld})}function Ld(){}var $$="task",_5="listener",M5="completed",Wy="cancelled",z$=`task-${Wy}`,F$=`task-${M5}`,zv=`${_5}-${Wy}`,B$=`${_5}-${M5}`,Ph=class{constructor(e){is(this,"code");is(this,"name","TaskAbortError");is(this,"message");this.code=e,this.message=`${$$} ${Wy} (reason: ${e})`}},Ky=(e,t)=>{if(typeof e!="function")throw new TypeError(Ur(32))},Nf=()=>{},I5=(e,t=Nf)=>(e.catch(t),e),T5=(e,t)=>(e.addEventListener("abort",t,{once:!0}),()=>e.removeEventListener("abort",t)),po=e=>{if(e.aborted)throw new Ph(e.reason)};function D5(e,t){let r=Nf;return new Promise((n,a)=>{const o=()=>a(new Ph(e.reason));if(e.aborted){o();return}r=T5(e,o),t.finally(()=>r()).then(n,a)}).finally(()=>{r=Nf})}var U$=async(e,t)=>{try{return await Promise.resolve(),{status:"ok",value:await e()}}catch(r){return{status:r instanceof Ph?"cancelled":"rejected",error:r}}finally{t==null||t()}},Ef=e=>t=>I5(D5(e,t).then(r=>(po(e),r))),R5=e=>{const t=Ef(e);return r=>t(new Promise(n=>setTimeout(n,r)))},{assign:Ns}=Object,pk={},Oh="listenerMiddleware",H$=(e,t)=>{const r=n=>T5(e,()=>n.abort(e.reason));return(n,a)=>{Ky(n);const o=new AbortController;r(o);const c=U$(async()=>{po(e),po(o.signal);const u=await n({pause:Ef(o.signal),delay:R5(o.signal),signal:o.signal});return po(o.signal),u},()=>o.abort(F$));return a!=null&&a.autoJoin&&t.push(c.catch(Nf)),{result:Ef(e)(c),cancel(){o.abort(z$)}}}},W$=(e,t)=>{const r=async(n,a)=>{po(t);let o=()=>{};const u=[new Promise((f,h)=>{let m=e({predicate:n,effect:(g,v)=>{v.unsubscribe(),f([g,v.getState(),v.getOriginalState()])}});o=()=>{m(),h()}})];a!=null&&u.push(new Promise(f=>setTimeout(f,a,null)));try{const f=await D5(t,Promise.race(u));return po(t),f}finally{o()}};return((n,a)=>I5(r(n,a)))},L5=e=>{let{type:t,actionCreator:r,matcher:n,predicate:a,effect:o}=e;if(t)a=Hr(t).match;else if(r)t=r.type,a=r.match;else if(n)a=n;else if(!a)throw new Error(Ur(21));return Ky(o),{predicate:a,type:t,effect:o}},$5=Ns(e=>{const{type:t,predicate:r,effect:n}=L5(e);return{id:C$(),effect:n,type:t,predicate:r,pending:new Set,unsubscribe:()=>{throw new Error(Ur(22))}}},{withTypes:()=>$5}),gk=(e,t)=>{const{type:r,effect:n,predicate:a}=L5(t);return Array.from(e.values()).find(o=>(typeof r=="string"?o.type===r:o.predicate===a)&&o.effect===n)},Fv=e=>{e.pending.forEach(t=>{t.abort(zv)})},K$=(e,t)=>()=>{for(const r of t.keys())Fv(r);e.clear()},vk=(e,t,r)=>{try{e(t,r)}catch(n){setTimeout(()=>{throw n},0)}},z5=Ns(Hr(`${Oh}/add`),{withTypes:()=>z5}),G$=Hr(`${Oh}/removeAll`),F5=Ns(Hr(`${Oh}/remove`),{withTypes:()=>F5}),V$=(...e)=>{console.error(`${Oh}/error`,...e)},Zu=(e={})=>{const t=new Map,r=new Map,n=b=>{const j=r.get(b)??0;r.set(b,j+1)},a=b=>{const j=r.get(b)??1;j===1?r.delete(b):r.set(b,j-1)},{extra:o,onError:c=V$}=e;Ky(c);const u=b=>(b.unsubscribe=()=>t.delete(b.id),t.set(b.id,b),j=>{b.unsubscribe(),j!=null&&j.cancelActive&&Fv(b)}),f=(b=>{const j=gk(t,b)??$5(b);return u(j)});Ns(f,{withTypes:()=>f});const h=b=>{const j=gk(t,b);return j&&(j.unsubscribe(),b.cancelActive&&Fv(j)),!!j};Ns(h,{withTypes:()=>h});const m=async(b,j,k,S)=>{const N=new AbortController,E=W$(f,N.signal),A=[];try{b.pending.add(N),n(b),await Promise.resolve(b.effect(j,Ns({},k,{getOriginalState:S,condition:(P,_)=>E(P,_).then(Boolean),take:E,delay:R5(N.signal),pause:Ef(N.signal),extra:o,signal:N.signal,fork:H$(N.signal,A),unsubscribe:b.unsubscribe,subscribe:()=>{t.set(b.id,b)},cancelActiveListeners:()=>{b.pending.forEach((P,_,O)=>{P!==N&&(P.abort(zv),O.delete(P))})},cancel:()=>{N.abort(zv),b.pending.delete(N)},throwIfCancelled:()=>{po(N.signal)}})))}catch(P){P instanceof Ph||vk(c,P,{raisedBy:"effect"})}finally{await Promise.all(A),N.abort(B$),a(b),b.pending.delete(N)}},g=K$(t,r);return{middleware:b=>j=>k=>{if(!p5(k))return j(k);if(z5.match(k))return f(k.payload);if(G$.match(k)){g();return}if(F5.match(k))return h(k.payload);let S=b.getState();const N=()=>{if(S===pk)throw new Error(Ur(23));return S};let E;try{if(E=j(k),t.size>0){const A=b.getState(),P=Array.from(t.values());for(const _ of P){let O=!1;try{O=_.predicate(k,A,S)}catch(D){O=!1,vk(c,D,{raisedBy:"predicate"})}O&&m(_,k,b,N)}}}finally{S=pk}return E},startListening:f,stopListening:h,clearListeners:g}};function Ur(e){return`Minified Redux Toolkit error #${e}; visit https://redux-toolkit.js.org/Errors?code=${e} for the full message or use the non-minified dev environment for full errors. `}var q$={layoutType:"horizontal",width:0,height:0,margin:{top:5,right:5,bottom:5,left:5},scale:1},B5=lr({name:"chartLayout",initialState:q$,reducers:{setLayout(e,t){e.layoutType=t.payload},setChartSize(e,t){e.width=t.payload.width,e.height=t.payload.height},setMargin(e,t){var r,n,a,o;e.margin.top=(r=t.payload.top)!==null&&r!==void 0?r:0,e.margin.right=(n=t.payload.right)!==null&&n!==void 0?n:0,e.margin.bottom=(a=t.payload.bottom)!==null&&a!==void 0?a:0,e.margin.left=(o=t.payload.left)!==null&&o!==void 0?o:0},setScale(e,t){e.scale=t.payload}}}),_h=B5.actions,Q$=_h.setMargin,Y$=_h.setLayout,X$=_h.setChartSize,Z$=_h.setScale,J$=B5.reducer;function U5(e,t,r){return Array.isArray(e)&&e&&t+r!==0?e.slice(t,r+1):e}function We(e){return Number.isFinite(e)}function Vn(e){return typeof e=="number"&&e>0&&Number.isFinite(e)}function yk(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function bs(e){for(var t=1;t{if(t&&r){var n=r.width,a=r.height,o=t.align,c=t.verticalAlign,u=t.layout;if((u==="vertical"||u==="horizontal"&&c==="middle")&&o!=="center"&&Ee(e[o]))return bs(bs({},e),{},{[o]:e[o]+(n||0)});if((u==="horizontal"||u==="vertical"&&o==="center")&&c!=="middle"&&Ee(e[c]))return bs(bs({},e),{},{[c]:e[c]+(a||0)})}return e},Xn=(e,t)=>e==="horizontal"&&t==="xAxis"||e==="vertical"&&t==="yAxis"||e==="centric"&&t==="angleAxis"||e==="radial"&&t==="radiusAxis",H5=(e,t,r,n)=>{if(n)return e.map(u=>u.coordinate);var a,o,c=e.map(u=>(u.coordinate===t&&(a=!0),u.coordinate===r&&(o=!0),u.coordinate));return a||c.push(t),o||c.push(r),c},W5=(e,t,r)=>{if(!e)return null;var n=e.duplicateDomain,a=e.type,o=e.range,c=e.scale,u=e.realScaleType,f=e.isCategorical,h=e.categoricalDomain,m=e.tickCount,g=e.ticks,v=e.niceTicks,b=e.axisType;if(!c)return null;var j=u==="scaleBand"&&c.bandwidth?c.bandwidth()/2:2,k=a==="category"&&c.bandwidth?c.bandwidth()/j:0;if(k=b==="angleAxis"&&o&&o.length>=2?Jr(o[0]-o[1])*2*k:k,g||v){var S=(g||v||[]).map((N,E)=>{var A=n?n.indexOf(N):N,P=c.map(A);return We(P)?{coordinate:P+k,value:N,offset:k,index:E}:null}).filter(Ar);return S}return f&&h?h.map((N,E)=>{var A=c.map(N);return We(A)?{coordinate:A+k,value:N,index:E,offset:k}:null}).filter(Ar):c.ticks&&m!=null?c.ticks(m).map((N,E)=>{var A=c.map(N);return We(A)?{coordinate:A+k,value:N,index:E,offset:k}:null}).filter(Ar):c.domain().map((N,E)=>{var A=c.map(N);return We(A)?{coordinate:A+k,value:n?n[N]:N,index:E,offset:k}:null}).filter(Ar)},iz=e=>{var t,r=e.length;if(!(r<=0)){var n=(t=e[0])===null||t===void 0?void 0:t.length;if(!(n==null||n<=0))for(var a=0;a=0?(h[0]=o,o+=v,h[1]=o):(h[0]=c,c+=v,h[1]=c)}}}},az=e=>{var t,r=e.length;if(!(r<=0)){var n=(t=e[0])===null||t===void 0?void 0:t.length;if(!(n==null||n<=0))for(var a=0;a=0?(f[0]=o,o+=h,f[1]=o):(f[0]=0,f[1]=0)}}}},oz={sign:iz,expand:kR,none:xo,silhouette:jR,wiggle:SR,positive:az},sz=(e,t,r)=>{var n,a=(n=oz[r])!==null&&n!==void 0?n:xo,o=wR().keys(t).value((u,f)=>Number(Lt(u,f,0))).order(Ev).offset(a),c=o(e);return c.forEach((u,f)=>{u.forEach((h,m)=>{var g=Lt(e[m],t[f],0);Array.isArray(g)&&g.length===2&&Ee(g[0])&&Ee(g[1])&&(h[0]=g[0],h[1]=g[1])})}),c};function lz(e){return e==null?void 0:String(e)}function xk(e){var t=e.axis,r=e.ticks,n=e.bandSize,a=e.entry,o=e.index,c=e.dataKey;if(t.type==="category"){if(!t.allowDuplicatedCategory&&t.dataKey&&!Yt(a[t.dataKey])){var u=YE(r,"value",a[t.dataKey]);if(u)return u.coordinate+n/2}return r!=null&&r[o]?r[o].coordinate+n/2:null}var f=Lt(a,Yt(c)?t.dataKey:c),h=t.scale.map(f);return Ee(h)?h:null}var uz=e=>{var t=e.flat(2).filter(Ee);return[Math.min(...t),Math.max(...t)]},cz=e=>[e[0]===1/0?0:e[0],e[1]===-1/0?0:e[1]],dz=(e,t,r)=>{if(!(e==null||Object.keys(e).length===0))return cz(Object.keys(e).reduce((n,a)=>{var o=e[a];if(!o)return n;var c=o.stackedData,u=c.reduce((f,h)=>{var m=U5(h,t,r),g=uz(m);return!We(g[0])||!We(g[1])?f:[Math.min(f[0],g[0]),Math.max(f[1],g[1])]},[1/0,-1/0]);return[Math.min(u[0],n[0]),Math.max(u[1],n[1])]},[1/0,-1/0]))},bk=/^dataMin[\s]*-[\s]*([0-9]+([.]{1}[0-9]+){0,1})$/,wk=/^dataMax[\s]*\+[\s]*([0-9]+([.]{1}[0-9]+){0,1})$/,Af=(e,t,r)=>{if(e&&e.scale&&e.scale.bandwidth){var n=e.scale.bandwidth();if(!r||n>0)return n}if(e&&t&&t.length>=2){for(var a=wh(t,m=>m.coordinate),o=1/0,c=1,u=a.length;c{if(t==="horizontal")return e.relativeX;if(t==="vertical")return e.relativeY},hz=(e,t)=>t==="centric"?e.angle:e.radius,Ei=e=>e.layout.width,Ai=e=>e.layout.height,mz=e=>e.layout.scale,G5=e=>e.layout.margin,Mh=q(e=>e.cartesianAxis.xAxis,e=>Object.values(e)),Ih=q(e=>e.cartesianAxis.yAxis,e=>Object.values(e)),pz="data-recharts-item-index",gz="data-recharts-item-id",Ju=60;function jk(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function $d(e){for(var t=1;te.brush.height;function wz(e){var t=Ih(e);return t.reduce((r,n)=>{if(n.orientation==="left"&&!n.mirror&&!n.hide){var a=typeof n.width=="number"?n.width:Ju;return r+a}return r},0)}function kz(e){var t=Ih(e);return t.reduce((r,n)=>{if(n.orientation==="right"&&!n.mirror&&!n.hide){var a=typeof n.width=="number"?n.width:Ju;return r+a}return r},0)}function jz(e){var t=Mh(e);return t.reduce((r,n)=>n.orientation==="top"&&!n.mirror&&!n.hide?r+n.height:r,0)}function Sz(e){var t=Mh(e);return t.reduce((r,n)=>n.orientation==="bottom"&&!n.mirror&&!n.hide?r+n.height:r,0)}var Zt=q([Ei,Ai,G5,bz,wz,kz,jz,Sz,f5,KL],(e,t,r,n,a,o,c,u,f,h)=>{var m={left:(r.left||0)+a,right:(r.right||0)+o},g={top:(r.top||0)+c,bottom:(r.bottom||0)+u},v=$d($d({},g),m),b=v.bottom;v.bottom+=n,v=nz(v,f,h);var j=e-v.left-v.right,k=t-v.top-v.bottom;return $d($d({brushBottom:b},v),{},{width:Math.max(j,0),height:Math.max(k,0)})}),Nz=q(Zt,e=>({x:e.left,y:e.top,width:e.width,height:e.height})),V5=q(Ei,Ai,(e,t)=>({x:0,y:0,width:e,height:t})),Ez=y.createContext(null),Pr=()=>y.useContext(Ez)!=null,Th=e=>e.brush,Dh=q([Th,Zt,G5],(e,t,r)=>({height:e.height,x:Ee(e.x)?e.x:t.left,y:Ee(e.y)?e.y:t.top+t.height+t.brushBottom-((r==null?void 0:r.bottom)||0),width:Ee(e.width)?e.width:t.width}));function Az(e,t,{signal:r,edges:n}={}){let a,o=null;const c=n!=null&&n.includes("leading"),u=n==null||n.includes("trailing"),f=()=>{o!==null&&(e.apply(a,o),a=void 0,o=null)},h=()=>{u&&f(),b()};let m=null;const g=()=>{m!=null&&clearTimeout(m),m=setTimeout(()=>{m=null,h()},t)},v=()=>{m!==null&&(clearTimeout(m),m=null)},b=()=>{v(),a=void 0,o=null},j=()=>{f()},k=function(...S){if(r!=null&&r.aborted)return;a=this,o=S;const N=m==null;g(),c&&N&&f()};return k.schedule=g,k.cancel=b,k.flush=j,r==null||r.addEventListener("abort",b,{once:!0}),k}function Cz(e,t=0,r={}){typeof r!="object"&&(r={});const{leading:n=!1,trailing:a=!0,maxWait:o}=r,c=Array(2);n&&(c[0]="leading"),a&&(c[1]="trailing");let u,f=null;const h=Az(function(...v){u=e.apply(this,v),f=null},t,{edges:c}),m=function(...v){return o!=null&&(f===null&&(f=Date.now()),Date.now()-f>=o)?(u=e.apply(this,v),f=Date.now(),h.cancel(),h.schedule(),u):(h.apply(this,v),u)},g=()=>(h.flush(),u);return m.cancel=h.cancel,m.flush=g,m}function Pz(e,t=0,r={}){const{leading:n=!0,trailing:a=!0}=r;return Cz(e,t,{leading:n,maxWait:t,trailing:a})}var Cf=function(t,r){for(var n=arguments.length,a=new Array(n>2?n-2:0),o=2;oa[c++]))}},zn={width:"100%",height:"100%",debounce:0,minWidth:0,initialDimension:{width:-1,height:-1}},q5=(e,t,r)=>{var n=r.width,a=n===void 0?zn.width:n,o=r.height,c=o===void 0?zn.height:o,u=r.aspect,f=r.maxHeight,h=bo(a)?e:Number(a),m=bo(c)?t:Number(c);return u&&u>0&&(h?m=h/u:m&&(h=m*u),f&&m!=null&&m>f&&(m=f)),{calculatedWidth:h,calculatedHeight:m}},Oz={width:0,height:0,overflow:"visible"},_z={width:0,overflowX:"visible"},Mz={height:0,overflowY:"visible"},Iz={},Tz=e=>{var t=e.width,r=e.height,n=bo(t),a=bo(r);return n&&a?Oz:n?_z:a?Mz:Iz};function Dz(e){var t=e.width,r=e.height,n=e.aspect,a=t,o=r;return a===void 0&&o===void 0?(a=zn.width,o=zn.height):a===void 0?a=n&&n>0?void 0:zn.width:o===void 0&&(o=n&&n>0?void 0:zn.height),{width:a,height:o}}var Rz=["aspect","initialDimension","width","height","minWidth","minHeight","maxHeight","children","debounce","id","className","onResize","style"];function Pf(){return Pf=Object.assign?Object.assign.bind():function(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);r({width:r,height:n}),[r,n]);return Vz(a)?y.createElement(Q5.Provider,{value:a},t):null}var Gy=()=>y.useContext(Q5),qz=y.forwardRef((e,t)=>{var r=e.aspect,n=e.initialDimension,a=n===void 0?zn.initialDimension:n,o=e.width,c=e.height,u=e.minWidth,f=u===void 0?zn.minWidth:u,h=e.minHeight,m=e.maxHeight,g=e.children,v=e.debounce,b=v===void 0?zn.debounce:v,j=e.id,k=e.className,S=e.onResize,N=e.style,E=N===void 0?{}:N,A=Kz(e,Rz),P=y.useRef(null),_=y.useRef();_.current=S,y.useImperativeHandle(t,()=>P.current);var O=y.useState({containerWidth:a.width,containerHeight:a.height}),D=Fz(O,2),U=D[0],B=D[1],F=y.useCallback((ae,se)=>{B(X=>{var te=Math.round(ae),J=Math.round(se);return X.containerWidth===te&&X.containerHeight===J?X:{containerWidth:te,containerHeight:J}})},[]);y.useEffect(()=>{if(P.current==null||typeof ResizeObserver>"u")return nl;var ae=I=>{var M,K=I[0];if(K!=null){var ne=K.contentRect,Z=ne.width,me=ne.height;F(Z,me),(M=_.current)===null||M===void 0||M.call(_,Z,me)}};b>0&&(ae=Pz(ae,b,{trailing:!0,leading:!1}));var se=new ResizeObserver(ae),X=P.current.getBoundingClientRect(),te=X.width,J=X.height;return F(te,J),se.observe(P.current),()=>{se.disconnect()}},[F,b]);var Y=U.containerWidth,H=U.containerHeight;Cf(!r||r>0,"The aspect(%s) must be greater than zero.",r);var pe=q5(Y,H,{width:o,height:c,aspect:r,maxHeight:m}),ue=pe.calculatedWidth,he=pe.calculatedHeight;return Cf(Y<0||H<0||ue!=null&&ue>0||he!=null&&he>0,`The width(%s) and height(%s) of chart should be greater than 0, please check the style of container, or the props width(%s) and height(%s), or add a minWidth(%s) or minHeight(%s) or use aspect(%s) to control the - height and width.`,ue,he,o,c,f,h,r),y.createElement("div",Pf({id:j?"".concat(j):void 0,className:nt("recharts-responsive-container",k),style:Sk(Sk({},E),{},{width:o,height:c,minWidth:f,minHeight:h,maxHeight:m}),ref:P},A),y.createElement("div",{style:Tz({width:o,height:c})},y.createElement(Y5,{width:ue,height:he},g)))}),Qz=y.forwardRef((e,t)=>{var r=Ky();if(Vn(r.width)&&Vn(r.height))return e.children;var n=Dz({width:e.width,height:e.height,aspect:e.aspect}),a=n.width,o=n.height,c=q5(void 0,void 0,{width:a,height:o,aspect:e.aspect,maxHeight:e.maxHeight}),u=c.calculatedWidth,f=c.calculatedHeight;return Ee(u)&&Ee(f)?y.createElement(Y5,{width:u,height:f},e.children):y.createElement(qz,Pf({},e,{width:a,height:o,ref:t}))});function Gy(e){if(e)return{x:e.x,y:e.y,upperWidth:"upperWidth"in e?e.upperWidth:e.width,lowerWidth:"lowerWidth"in e?e.lowerWidth:e.width,width:e.width,height:e.height}}var Rh=()=>{var e,t=Pr(),r=Me(Nz),n=Me(Dh),a=(e=Me(Th))===null||e===void 0?void 0:e.padding;return!t||!n||!a?r:{width:n.width-a.left-a.right,height:n.height-a.top-a.bottom,x:a.left,y:a.top}},Yz={top:0,bottom:0,left:0,right:0,width:0,height:0,brushBottom:0},X5=()=>{var e;return(e=Me(Zt))!==null&&e!==void 0?e:Yz},Z5=()=>Me(Ei),J5=()=>Me(Ai),ft=e=>e.layout.layoutType,nl=()=>Me(ft),Vy=()=>{var e=nl();if(e==="horizontal"||e==="vertical")return e},eA=e=>{var t=e.layout.layoutType;if(t==="centric"||t==="radial")return t},Xz=()=>{var e=nl();return e!==void 0},ec=e=>{var t=Nt(),r=Pr(),n=e.width,a=e.height,o=Ky(),c=n,u=a;return o&&(c=o.width>0?o.width:n,u=o.height>0?o.height:a),y.useEffect(()=>{!r&&Vn(c)&&Vn(u)&&t(X$({width:c,height:u}))},[t,r,c,u]),null},tA=Symbol.for("immer-nothing"),Ek=Symbol.for("immer-draftable"),Wr=Symbol.for("immer-state");function xn(e,...t){throw new Error(`[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`)}var _u=Object.getPrototypeOf;function Vs(e){return!!e&&!!e[Wr]}function ko(e){var t;return e?rA(e)||Array.isArray(e)||!!e[Ek]||!!((t=e.constructor)!=null&&t[Ek])||tc(e)||$h(e):!1}var Zz=Object.prototype.constructor.toString(),Ak=new WeakMap;function rA(e){if(!e||typeof e!="object")return!1;const t=Object.getPrototypeOf(e);if(t===null||t===Object.prototype)return!0;const r=Object.hasOwnProperty.call(t,"constructor")&&t.constructor;if(r===Object)return!0;if(typeof r!="function")return!1;let n=Ak.get(r);return n===void 0&&(n=Function.toString.call(r),Ak.set(r,n)),n===Zz}function Of(e,t,r=!0){Lh(e)===0?(r?Reflect.ownKeys(e):Object.keys(e)).forEach(a=>{t(a,e[a],e)}):e.forEach((n,a)=>t(a,n,e))}function Lh(e){const t=e[Wr];return t?t.type_:Array.isArray(e)?1:tc(e)?2:$h(e)?3:0}function Bv(e,t){return Lh(e)===2?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function nA(e,t,r){const n=Lh(e);n===2?e.set(t,r):n===3?e.add(r):e[t]=r}function Jz(e,t){return e===t?e!==0||1/e===1/t:e!==e&&t!==t}function tc(e){return e instanceof Map}function $h(e){return e instanceof Set}function Qa(e){return e.copy_||e.base_}function Uv(e,t){if(tc(e))return new Map(e);if($h(e))return new Set(e);if(Array.isArray(e))return Array.prototype.slice.call(e);const r=rA(e);if(t===!0||t==="class_only"&&!r){const n=Object.getOwnPropertyDescriptors(e);delete n[Wr];let a=Reflect.ownKeys(n);for(let o=0;o1&&Object.defineProperties(e,{set:zd,add:zd,clear:zd,delete:zd}),Object.freeze(e),t&&Object.values(e).forEach(r=>qy(r,!0))),e}function e6(){xn(2)}var zd={value:e6};function zh(e){return e===null||typeof e!="object"?!0:Object.isFrozen(e)}var t6={};function jo(e){const t=t6[e];return t||xn(0,e),t}var Mu;function iA(){return Mu}function r6(e,t){return{drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0}}function Ck(e,t){t&&(jo("Patches"),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function Hv(e){Wv(e),e.drafts_.forEach(n6),e.drafts_=null}function Wv(e){e===Mu&&(Mu=e.parent_)}function Pk(e){return Mu=r6(Mu,e)}function n6(e){const t=e[Wr];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0}function Ok(e,t){t.unfinalizedDrafts_=t.drafts_.length;const r=t.drafts_[0];return e!==void 0&&e!==r?(r[Wr].modified_&&(Hv(t),xn(4)),ko(e)&&(e=_f(t,e),t.parent_||Mf(t,e)),t.patches_&&jo("Patches").generateReplacementPatches_(r[Wr].base_,e,t.patches_,t.inversePatches_)):e=_f(t,r,[]),Hv(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e!==tA?e:void 0}function _f(e,t,r){if(zh(t))return t;const n=e.immer_.shouldUseStrictIteration(),a=t[Wr];if(!a)return Of(t,(o,c)=>_k(e,a,t,o,c,r),n),t;if(a.scope_!==e)return t;if(!a.modified_)return Mf(e,a.base_,!0),a.base_;if(!a.finalized_){a.finalized_=!0,a.scope_.unfinalizedDrafts_--;const o=a.copy_;let c=o,u=!1;a.type_===3&&(c=new Set(o),o.clear(),u=!0),Of(c,(f,h)=>_k(e,a,o,f,h,r,u),n),Mf(e,o,!1),r&&e.patches_&&jo("Patches").generatePatches_(a,r,e.patches_,e.inversePatches_)}return a.copy_}function _k(e,t,r,n,a,o,c){if(a==null||typeof a!="object"&&!c)return;const u=zh(a);if(!(u&&!c)){if(Vs(a)){const f=o&&t&&t.type_!==3&&!Bv(t.assigned_,n)?o.concat(n):void 0,h=_f(e,a,f);if(nA(r,n,h),Vs(h))e.canAutoFreeze_=!1;else return}else c&&r.add(a);if(ko(a)&&!u){if(!e.immer_.autoFreeze_&&e.unfinalizedDrafts_<1||t&&t.base_&&t.base_[n]===a&&u)return;_f(e,a),(!t||!t.scope_.parent_)&&typeof n!="symbol"&&(tc(r)?r.has(n):Object.prototype.propertyIsEnumerable.call(r,n))&&Mf(e,a)}}}function Mf(e,t,r=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&qy(t,r)}function i6(e,t){const r=Array.isArray(e),n={type_:r?1:0,scope_:t?t.scope_:iA(),modified_:!1,finalized_:!1,assigned_:{},parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1};let a=n,o=Qy;r&&(a=[n],o=Iu);const{revoke:c,proxy:u}=Proxy.revocable(a,o);return n.draft_=u,n.revoke_=c,u}var Qy={get(e,t){if(t===Wr)return e;const r=Qa(e);if(!Bv(r,t))return a6(e,r,t);const n=r[t];return e.finalized_||!ko(n)?n:n===yg(e.base_,t)?(xg(e),e.copy_[t]=Gv(n,e)):n},has(e,t){return t in Qa(e)},ownKeys(e){return Reflect.ownKeys(Qa(e))},set(e,t,r){const n=aA(Qa(e),t);if(n!=null&&n.set)return n.set.call(e.draft_,r),!0;if(!e.modified_){const a=yg(Qa(e),t),o=a==null?void 0:a[Wr];if(o&&o.base_===r)return e.copy_[t]=r,e.assigned_[t]=!1,!0;if(Jz(r,a)&&(r!==void 0||Bv(e.base_,t)))return!0;xg(e),Kv(e)}return e.copy_[t]===r&&(r!==void 0||t in e.copy_)||Number.isNaN(r)&&Number.isNaN(e.copy_[t])||(e.copy_[t]=r,e.assigned_[t]=!0),!0},deleteProperty(e,t){return yg(e.base_,t)!==void 0||t in e.base_?(e.assigned_[t]=!1,xg(e),Kv(e)):delete e.assigned_[t],e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){const r=Qa(e),n=Reflect.getOwnPropertyDescriptor(r,t);return n&&{writable:!0,configurable:e.type_!==1||t!=="length",enumerable:n.enumerable,value:r[t]}},defineProperty(){xn(11)},getPrototypeOf(e){return _u(e.base_)},setPrototypeOf(){xn(12)}},Iu={};Of(Qy,(e,t)=>{Iu[e]=function(){return arguments[0]=arguments[0][0],t.apply(this,arguments)}});Iu.deleteProperty=function(e,t){return Iu.set.call(this,e,t,void 0)};Iu.set=function(e,t,r){return Qy.set.call(this,e[0],t,r,e[0])};function yg(e,t){const r=e[Wr];return(r?Qa(r):e)[t]}function a6(e,t,r){var a;const n=aA(t,r);return n?"value"in n?n.value:(a=n.get)==null?void 0:a.call(e.draft_):void 0}function aA(e,t){if(!(t in e))return;let r=_u(e);for(;r;){const n=Object.getOwnPropertyDescriptor(r,t);if(n)return n;r=_u(r)}}function Kv(e){e.modified_||(e.modified_=!0,e.parent_&&Kv(e.parent_))}function xg(e){e.copy_||(e.copy_=Uv(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var o6=class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!0,this.produce=(t,r,n)=>{if(typeof t=="function"&&typeof r!="function"){const o=r;r=t;const c=this;return function(f=o,...h){return c.produce(f,m=>r.call(this,m,...h))}}typeof r!="function"&&xn(6),n!==void 0&&typeof n!="function"&&xn(7);let a;if(ko(t)){const o=Pk(this),c=Gv(t,void 0);let u=!0;try{a=r(c),u=!1}finally{u?Hv(o):Wv(o)}return Ck(o,n),Ok(a,o)}else if(!t||typeof t!="object"){if(a=r(t),a===void 0&&(a=t),a===tA&&(a=void 0),this.autoFreeze_&&qy(a,!0),n){const o=[],c=[];jo("Patches").generateReplacementPatches_(t,a,o,c),n(o,c)}return a}else xn(1,t)},this.produceWithPatches=(t,r)=>{if(typeof t=="function")return(c,...u)=>this.produceWithPatches(c,f=>t(f,...u));let n,a;return[this.produce(t,r,(c,u)=>{n=c,a=u}),n,a]},typeof(e==null?void 0:e.autoFreeze)=="boolean"&&this.setAutoFreeze(e.autoFreeze),typeof(e==null?void 0:e.useStrictShallowCopy)=="boolean"&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),typeof(e==null?void 0:e.useStrictIteration)=="boolean"&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){ko(e)||xn(8),Vs(e)&&(e=s6(e));const t=Pk(this),r=Gv(e,void 0);return r[Wr].isManual_=!0,Wv(t),r}finishDraft(e,t){const r=e&&e[Wr];(!r||!r.isManual_)&&xn(9);const{scope_:n}=r;return Ck(n,t),Ok(void 0,n)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}setUseStrictIteration(e){this.useStrictIteration_=e}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(e,t){let r;for(r=t.length-1;r>=0;r--){const a=t[r];if(a.path.length===0&&a.op==="replace"){e=a.value;break}}r>-1&&(t=t.slice(r+1));const n=jo("Patches").applyPatches_;return Vs(e)?n(e,t):this.produce(e,a=>n(a,t))}};function Gv(e,t){const r=tc(e)?jo("MapSet").proxyMap_(e,t):$h(e)?jo("MapSet").proxySet_(e,t):i6(e,t);return(t?t.scope_:iA()).drafts_.push(r),r}function s6(e){return Vs(e)||xn(10,e),oA(e)}function oA(e){if(!ko(e)||zh(e))return e;const t=e[Wr];let r,n=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,r=Uv(e,t.scope_.immer_.useStrictShallowCopy_),n=t.scope_.immer_.shouldUseStrictIteration()}else r=Uv(e,!0);return Of(r,(a,o)=>{nA(r,a,oA(o))},n),t&&(t.finalized_=!1),r}var l6=new o6;l6.produce;var u6={settings:{layout:"horizontal",align:"center",verticalAlign:"bottom",itemSorter:"value"},size:{width:0,height:0},payload:[]},sA=lr({name:"legend",initialState:u6,reducers:{setLegendSize(e,t){e.size.width=t.payload.width,e.size.height=t.payload.height},setLegendSettings(e,t){e.settings.align=t.payload.align,e.settings.layout=t.payload.layout,e.settings.verticalAlign=t.payload.verticalAlign,e.settings.itemSorter=t.payload.itemSorter},addLegendPayload:{reducer(e,t){e.payload.push(t.payload)},prepare:st()},replaceLegendPayload:{reducer(e,t){var r=t.payload,n=r.prev,a=r.next,o=en(e).payload.indexOf(n);o>-1&&(e.payload[o]=a)},prepare:st()},removeLegendPayload:{reducer(e,t){var r=en(e).payload.indexOf(t.payload);r>-1&&e.payload.splice(r,1)},prepare:st()}}}),rc=sA.actions;rc.setLegendSize;rc.setLegendSettings;var c6=rc.addLegendPayload,d6=rc.replaceLegendPayload,f6=rc.removeLegendPayload,h6=sA.reducer,bg={exports:{}},wg={};/** + height and width.`,ue,he,o,c,f,h,r),y.createElement("div",Pf({id:j?"".concat(j):void 0,className:nt("recharts-responsive-container",k),style:Nk(Nk({},E),{},{width:o,height:c,minWidth:f,minHeight:h,maxHeight:m}),ref:P},A),y.createElement("div",{style:Tz({width:o,height:c})},y.createElement(Y5,{width:ue,height:he},g)))}),Qz=y.forwardRef((e,t)=>{var r=Gy();if(Vn(r.width)&&Vn(r.height))return e.children;var n=Dz({width:e.width,height:e.height,aspect:e.aspect}),a=n.width,o=n.height,c=q5(void 0,void 0,{width:a,height:o,aspect:e.aspect,maxHeight:e.maxHeight}),u=c.calculatedWidth,f=c.calculatedHeight;return Ee(u)&&Ee(f)?y.createElement(Y5,{width:u,height:f},e.children):y.createElement(qz,Pf({},e,{width:a,height:o,ref:t}))});function Vy(e){if(e)return{x:e.x,y:e.y,upperWidth:"upperWidth"in e?e.upperWidth:e.width,lowerWidth:"lowerWidth"in e?e.lowerWidth:e.width,width:e.width,height:e.height}}var Rh=()=>{var e,t=Pr(),r=Me(Nz),n=Me(Dh),a=(e=Me(Th))===null||e===void 0?void 0:e.padding;return!t||!n||!a?r:{width:n.width-a.left-a.right,height:n.height-a.top-a.bottom,x:a.left,y:a.top}},Yz={top:0,bottom:0,left:0,right:0,width:0,height:0,brushBottom:0},X5=()=>{var e;return(e=Me(Zt))!==null&&e!==void 0?e:Yz},Z5=()=>Me(Ei),J5=()=>Me(Ai),ft=e=>e.layout.layoutType,il=()=>Me(ft),qy=()=>{var e=il();if(e==="horizontal"||e==="vertical")return e},eA=e=>{var t=e.layout.layoutType;if(t==="centric"||t==="radial")return t},Xz=()=>{var e=il();return e!==void 0},ec=e=>{var t=Nt(),r=Pr(),n=e.width,a=e.height,o=Gy(),c=n,u=a;return o&&(c=o.width>0?o.width:n,u=o.height>0?o.height:a),y.useEffect(()=>{!r&&Vn(c)&&Vn(u)&&t(X$({width:c,height:u}))},[t,r,c,u]),null},tA=Symbol.for("immer-nothing"),Ak=Symbol.for("immer-draftable"),Wr=Symbol.for("immer-state");function xn(e,...t){throw new Error(`[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`)}var _u=Object.getPrototypeOf;function qs(e){return!!e&&!!e[Wr]}function ko(e){var t;return e?rA(e)||Array.isArray(e)||!!e[Ak]||!!((t=e.constructor)!=null&&t[Ak])||tc(e)||$h(e):!1}var Zz=Object.prototype.constructor.toString(),Ck=new WeakMap;function rA(e){if(!e||typeof e!="object")return!1;const t=Object.getPrototypeOf(e);if(t===null||t===Object.prototype)return!0;const r=Object.hasOwnProperty.call(t,"constructor")&&t.constructor;if(r===Object)return!0;if(typeof r!="function")return!1;let n=Ck.get(r);return n===void 0&&(n=Function.toString.call(r),Ck.set(r,n)),n===Zz}function Of(e,t,r=!0){Lh(e)===0?(r?Reflect.ownKeys(e):Object.keys(e)).forEach(a=>{t(a,e[a],e)}):e.forEach((n,a)=>t(a,n,e))}function Lh(e){const t=e[Wr];return t?t.type_:Array.isArray(e)?1:tc(e)?2:$h(e)?3:0}function Bv(e,t){return Lh(e)===2?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function nA(e,t,r){const n=Lh(e);n===2?e.set(t,r):n===3?e.add(r):e[t]=r}function Jz(e,t){return e===t?e!==0||1/e===1/t:e!==e&&t!==t}function tc(e){return e instanceof Map}function $h(e){return e instanceof Set}function Qa(e){return e.copy_||e.base_}function Uv(e,t){if(tc(e))return new Map(e);if($h(e))return new Set(e);if(Array.isArray(e))return Array.prototype.slice.call(e);const r=rA(e);if(t===!0||t==="class_only"&&!r){const n=Object.getOwnPropertyDescriptors(e);delete n[Wr];let a=Reflect.ownKeys(n);for(let o=0;o1&&Object.defineProperties(e,{set:zd,add:zd,clear:zd,delete:zd}),Object.freeze(e),t&&Object.values(e).forEach(r=>Qy(r,!0))),e}function e6(){xn(2)}var zd={value:e6};function zh(e){return e===null||typeof e!="object"?!0:Object.isFrozen(e)}var t6={};function jo(e){const t=t6[e];return t||xn(0,e),t}var Mu;function iA(){return Mu}function r6(e,t){return{drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0}}function Pk(e,t){t&&(jo("Patches"),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function Hv(e){Wv(e),e.drafts_.forEach(n6),e.drafts_=null}function Wv(e){e===Mu&&(Mu=e.parent_)}function Ok(e){return Mu=r6(Mu,e)}function n6(e){const t=e[Wr];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0}function _k(e,t){t.unfinalizedDrafts_=t.drafts_.length;const r=t.drafts_[0];return e!==void 0&&e!==r?(r[Wr].modified_&&(Hv(t),xn(4)),ko(e)&&(e=_f(t,e),t.parent_||Mf(t,e)),t.patches_&&jo("Patches").generateReplacementPatches_(r[Wr].base_,e,t.patches_,t.inversePatches_)):e=_f(t,r,[]),Hv(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e!==tA?e:void 0}function _f(e,t,r){if(zh(t))return t;const n=e.immer_.shouldUseStrictIteration(),a=t[Wr];if(!a)return Of(t,(o,c)=>Mk(e,a,t,o,c,r),n),t;if(a.scope_!==e)return t;if(!a.modified_)return Mf(e,a.base_,!0),a.base_;if(!a.finalized_){a.finalized_=!0,a.scope_.unfinalizedDrafts_--;const o=a.copy_;let c=o,u=!1;a.type_===3&&(c=new Set(o),o.clear(),u=!0),Of(c,(f,h)=>Mk(e,a,o,f,h,r,u),n),Mf(e,o,!1),r&&e.patches_&&jo("Patches").generatePatches_(a,r,e.patches_,e.inversePatches_)}return a.copy_}function Mk(e,t,r,n,a,o,c){if(a==null||typeof a!="object"&&!c)return;const u=zh(a);if(!(u&&!c)){if(qs(a)){const f=o&&t&&t.type_!==3&&!Bv(t.assigned_,n)?o.concat(n):void 0,h=_f(e,a,f);if(nA(r,n,h),qs(h))e.canAutoFreeze_=!1;else return}else c&&r.add(a);if(ko(a)&&!u){if(!e.immer_.autoFreeze_&&e.unfinalizedDrafts_<1||t&&t.base_&&t.base_[n]===a&&u)return;_f(e,a),(!t||!t.scope_.parent_)&&typeof n!="symbol"&&(tc(r)?r.has(n):Object.prototype.propertyIsEnumerable.call(r,n))&&Mf(e,a)}}}function Mf(e,t,r=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&Qy(t,r)}function i6(e,t){const r=Array.isArray(e),n={type_:r?1:0,scope_:t?t.scope_:iA(),modified_:!1,finalized_:!1,assigned_:{},parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1};let a=n,o=Yy;r&&(a=[n],o=Iu);const{revoke:c,proxy:u}=Proxy.revocable(a,o);return n.draft_=u,n.revoke_=c,u}var Yy={get(e,t){if(t===Wr)return e;const r=Qa(e);if(!Bv(r,t))return a6(e,r,t);const n=r[t];return e.finalized_||!ko(n)?n:n===yg(e.base_,t)?(xg(e),e.copy_[t]=Gv(n,e)):n},has(e,t){return t in Qa(e)},ownKeys(e){return Reflect.ownKeys(Qa(e))},set(e,t,r){const n=aA(Qa(e),t);if(n!=null&&n.set)return n.set.call(e.draft_,r),!0;if(!e.modified_){const a=yg(Qa(e),t),o=a==null?void 0:a[Wr];if(o&&o.base_===r)return e.copy_[t]=r,e.assigned_[t]=!1,!0;if(Jz(r,a)&&(r!==void 0||Bv(e.base_,t)))return!0;xg(e),Kv(e)}return e.copy_[t]===r&&(r!==void 0||t in e.copy_)||Number.isNaN(r)&&Number.isNaN(e.copy_[t])||(e.copy_[t]=r,e.assigned_[t]=!0),!0},deleteProperty(e,t){return yg(e.base_,t)!==void 0||t in e.base_?(e.assigned_[t]=!1,xg(e),Kv(e)):delete e.assigned_[t],e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){const r=Qa(e),n=Reflect.getOwnPropertyDescriptor(r,t);return n&&{writable:!0,configurable:e.type_!==1||t!=="length",enumerable:n.enumerable,value:r[t]}},defineProperty(){xn(11)},getPrototypeOf(e){return _u(e.base_)},setPrototypeOf(){xn(12)}},Iu={};Of(Yy,(e,t)=>{Iu[e]=function(){return arguments[0]=arguments[0][0],t.apply(this,arguments)}});Iu.deleteProperty=function(e,t){return Iu.set.call(this,e,t,void 0)};Iu.set=function(e,t,r){return Yy.set.call(this,e[0],t,r,e[0])};function yg(e,t){const r=e[Wr];return(r?Qa(r):e)[t]}function a6(e,t,r){var a;const n=aA(t,r);return n?"value"in n?n.value:(a=n.get)==null?void 0:a.call(e.draft_):void 0}function aA(e,t){if(!(t in e))return;let r=_u(e);for(;r;){const n=Object.getOwnPropertyDescriptor(r,t);if(n)return n;r=_u(r)}}function Kv(e){e.modified_||(e.modified_=!0,e.parent_&&Kv(e.parent_))}function xg(e){e.copy_||(e.copy_=Uv(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var o6=class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!0,this.produce=(t,r,n)=>{if(typeof t=="function"&&typeof r!="function"){const o=r;r=t;const c=this;return function(f=o,...h){return c.produce(f,m=>r.call(this,m,...h))}}typeof r!="function"&&xn(6),n!==void 0&&typeof n!="function"&&xn(7);let a;if(ko(t)){const o=Ok(this),c=Gv(t,void 0);let u=!0;try{a=r(c),u=!1}finally{u?Hv(o):Wv(o)}return Pk(o,n),_k(a,o)}else if(!t||typeof t!="object"){if(a=r(t),a===void 0&&(a=t),a===tA&&(a=void 0),this.autoFreeze_&&Qy(a,!0),n){const o=[],c=[];jo("Patches").generateReplacementPatches_(t,a,o,c),n(o,c)}return a}else xn(1,t)},this.produceWithPatches=(t,r)=>{if(typeof t=="function")return(c,...u)=>this.produceWithPatches(c,f=>t(f,...u));let n,a;return[this.produce(t,r,(c,u)=>{n=c,a=u}),n,a]},typeof(e==null?void 0:e.autoFreeze)=="boolean"&&this.setAutoFreeze(e.autoFreeze),typeof(e==null?void 0:e.useStrictShallowCopy)=="boolean"&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),typeof(e==null?void 0:e.useStrictIteration)=="boolean"&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){ko(e)||xn(8),qs(e)&&(e=s6(e));const t=Ok(this),r=Gv(e,void 0);return r[Wr].isManual_=!0,Wv(t),r}finishDraft(e,t){const r=e&&e[Wr];(!r||!r.isManual_)&&xn(9);const{scope_:n}=r;return Pk(n,t),_k(void 0,n)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}setUseStrictIteration(e){this.useStrictIteration_=e}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(e,t){let r;for(r=t.length-1;r>=0;r--){const a=t[r];if(a.path.length===0&&a.op==="replace"){e=a.value;break}}r>-1&&(t=t.slice(r+1));const n=jo("Patches").applyPatches_;return qs(e)?n(e,t):this.produce(e,a=>n(a,t))}};function Gv(e,t){const r=tc(e)?jo("MapSet").proxyMap_(e,t):$h(e)?jo("MapSet").proxySet_(e,t):i6(e,t);return(t?t.scope_:iA()).drafts_.push(r),r}function s6(e){return qs(e)||xn(10,e),oA(e)}function oA(e){if(!ko(e)||zh(e))return e;const t=e[Wr];let r,n=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,r=Uv(e,t.scope_.immer_.useStrictShallowCopy_),n=t.scope_.immer_.shouldUseStrictIteration()}else r=Uv(e,!0);return Of(r,(a,o)=>{nA(r,a,oA(o))},n),t&&(t.finalized_=!1),r}var l6=new o6;l6.produce;var u6={settings:{layout:"horizontal",align:"center",verticalAlign:"bottom",itemSorter:"value"},size:{width:0,height:0},payload:[]},sA=lr({name:"legend",initialState:u6,reducers:{setLegendSize(e,t){e.size.width=t.payload.width,e.size.height=t.payload.height},setLegendSettings(e,t){e.settings.align=t.payload.align,e.settings.layout=t.payload.layout,e.settings.verticalAlign=t.payload.verticalAlign,e.settings.itemSorter=t.payload.itemSorter},addLegendPayload:{reducer(e,t){e.payload.push(t.payload)},prepare:st()},replaceLegendPayload:{reducer(e,t){var r=t.payload,n=r.prev,a=r.next,o=en(e).payload.indexOf(n);o>-1&&(e.payload[o]=a)},prepare:st()},removeLegendPayload:{reducer(e,t){var r=en(e).payload.indexOf(t.payload);r>-1&&e.payload.splice(r,1)},prepare:st()}}}),rc=sA.actions;rc.setLegendSize;rc.setLegendSettings;var c6=rc.addLegendPayload,d6=rc.replaceLegendPayload,f6=rc.removeLegendPayload,h6=sA.reducer,bg={exports:{}},wg={};/** * @license React * use-sync-external-store-with-selector.production.js * @@ -586,56 +586,56 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var Mk;function m6(){if(Mk)return wg;Mk=1;var e=el();function t(f,h){return f===h&&(f!==0||1/f===1/h)||f!==f&&h!==h}var r=typeof Object.is=="function"?Object.is:t,n=e.useSyncExternalStore,a=e.useRef,o=e.useEffect,c=e.useMemo,u=e.useDebugValue;return wg.useSyncExternalStoreWithSelector=function(f,h,m,g,v){var b=a(null);if(b.current===null){var j={hasValue:!1,value:null};b.current=j}else j=b.current;b=c(function(){function S(_){if(!N){if(N=!0,E=_,_=g(_),v!==void 0&&j.hasValue){var O=j.value;if(v(O,_))return A=O}return A=_}if(O=A,r(E,_))return O;var D=g(_);return v!==void 0&&v(O,D)?(E=_,O):(E=_,A=D)}var N=!1,E,A,P=m===void 0?null:m;return[function(){return S(h())},P===null?void 0:function(){return S(P())}]},[h,m,g,v]);var k=n(f,b[0],b[1]);return o(function(){j.hasValue=!0,j.value=k},[k]),u(k),k},wg}var Ik;function p6(){return Ik||(Ik=1,bg.exports=m6()),bg.exports}p6();function g6(e){e()}function v6(){let e=null,t=null;return{clear(){e=null,t=null},notify(){g6(()=>{let r=e;for(;r;)r.callback(),r=r.next})},get(){const r=[];let n=e;for(;n;)r.push(n),n=n.next;return r},subscribe(r){let n=!0;const a=t={callback:r,next:null,prev:t};return a.prev?a.prev.next=a:e=a,function(){!n||e===null||(n=!1,a.next?a.next.prev=a.prev:t=a.prev,a.prev?a.prev.next=a.next:e=a.next)}}}}var Tk={notify(){},get:()=>[]};function y6(e,t){let r,n=Tk,a=0,o=!1;function c(k){m();const S=n.subscribe(k);let N=!1;return()=>{N||(N=!0,S(),g())}}function u(){n.notify()}function f(){j.onStateChange&&j.onStateChange()}function h(){return o}function m(){a++,r||(r=e.subscribe(f),n=v6())}function g(){a--,r&&a===0&&(r(),r=void 0,n.clear(),n=Tk)}function v(){o||(o=!0,m())}function b(){o&&(o=!1,g())}const j={addNestedSub:c,notifyNestedSubs:u,handleChangeWrapper:f,isSubscribed:h,trySubscribe:v,tryUnsubscribe:b,getListeners:()=>n};return j}var x6=()=>typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",b6=x6(),w6=()=>typeof navigator<"u"&&navigator.product==="ReactNative",k6=w6(),j6=()=>b6||k6?y.useLayoutEffect:y.useEffect,S6=j6();function Dk(e,t){return e===t?e!==0||t!==0||1/e===1/t:e!==e&&t!==t}function N6(e,t){if(Dk(e,t))return!0;if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;const r=Object.keys(e),n=Object.keys(t);if(r.length!==n.length)return!1;for(let a=0;a{const f=y6(a);return{store:a,subscription:f,getServerState:n?()=>n:void 0}},[a,n]),c=y.useMemo(()=>a.getState(),[a]);S6(()=>{const{subscription:f}=o;return f.onStateChange=f.notifyNestedSubs,f.trySubscribe(),c!==a.getState()&&f.notifyNestedSubs(),()=>{f.tryUnsubscribe(),f.onStateChange=void 0}},[o,c]);const u=r||A6;return y.createElement(u.Provider,{value:o},t)}var P6=C6,O6=new Set(["axisLine","tickLine","activeBar","activeDot","activeLabel","activeShape","allowEscapeViewBox","background","cursor","dot","label","line","margin","padding","position","shape","style","tick","wrapperStyle","radius","throttledEvents"]);function _6(e,t){return e==null&&t==null?!0:typeof e=="number"&&typeof t=="number"?e===t||e!==e&&t!==t:e===t}function Fh(e,t){var r=new Set([...Object.keys(e),...Object.keys(t)]);for(var n of r)if(O6.has(n)){if(e[n]==null&&t[n]==null)continue;if(!N6(e[n],t[n]))return!1}else if(!_6(e[n],t[n]))return!1;return!0}function Vv(){return Vv=Object.assign?Object.assign.bind():function(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);r{var t=e.separator,r=t===void 0?ls.separator:t,n=e.contentStyle,a=e.itemStyle,o=e.labelStyle,c=o===void 0?ls.labelStyle:o,u=e.payload,f=e.formatter,h=e.itemSorter,m=e.wrapperClassName,g=e.labelClassName,v=e.label,b=e.labelFormatter,j=e.accessibilityLayer,k=j===void 0?ls.accessibilityLayer:j,S=()=>{if(u&&u.length){var U={padding:0,margin:0},B=B6(u,h),F=B.map((Y,H)=>{if(!Y||Y.type==="none")return null;var pe=Y.formatter||f||F6,ue=Y.value,he=Y.name,ae=ue,se=he;if(pe){var X=pe(ue,he,Y,H,u);if(Array.isArray(X)){var te=D6(X,2);ae=te[0],se=te[1]}else if(X!=null)ae=X;else return null}var J=tu(tu({},ls.itemStyle),{},{color:Y.color||ls.itemStyle.color},a);return y.createElement("li",{className:"recharts-tooltip-item",key:"tooltip-item-".concat(H),style:J},Gn(se)?y.createElement("span",{className:"recharts-tooltip-item-name"},se):null,Gn(se)?y.createElement("span",{className:"recharts-tooltip-item-separator"},r):null,y.createElement("span",{className:"recharts-tooltip-item-value"},ae),y.createElement("span",{className:"recharts-tooltip-item-unit"},Y.unit||""))});return y.createElement("ul",{className:"recharts-tooltip-item-list",style:U},F)}return null},N=tu(tu({},ls.contentStyle),n),E=tu({margin:0},c),A=!Yt(v),P=A?v:"",_=nt("recharts-default-tooltip",m),O=nt("recharts-tooltip-label",g);A&&b&&u!==void 0&&u!==null&&(P=b(v,u));var D=k?{role:"status","aria-live":"assertive"}:{};return y.createElement("div",Vv({className:_,style:N},D),y.createElement("p",{className:O,style:E},y.isValidElement(P)?P:"".concat(P)),S())},ru="recharts-tooltip-wrapper",H6={visibility:"hidden"};function W6(e){var t=e.coordinate,r=e.translateX,n=e.translateY;return nt(ru,{["".concat(ru,"-right")]:Ee(r)&&t&&Ee(t.x)&&r>=t.x,["".concat(ru,"-left")]:Ee(r)&&t&&Ee(t.x)&&r=t.y,["".concat(ru,"-top")]:Ee(n)&&t&&Ee(t.y)&&n0?a:0),g=r[n]+a;if(t[n])return c[n]?m:g;var v=f[n];if(v==null)return 0;if(c[n]){var b=m,j=v;return bS?Math.max(m,v):Math.max(g,v)}function K6(e){var t=e.translateX,r=e.translateY,n=e.useTranslate3d;return{transform:n?"translate3d(".concat(t,"px, ").concat(r,"px, 0)"):"translate(".concat(t,"px, ").concat(r,"px)")}}function G6(e){var t=e.allowEscapeViewBox,r=e.coordinate,n=e.offsetTop,a=e.offsetLeft,o=e.position,c=e.reverseDirection,u=e.tooltipBox,f=e.useTranslate3d,h=e.viewBox,m,g,v;return u.height>0&&u.width>0&&r?(g=$k({allowEscapeViewBox:t,coordinate:r,key:"x",offset:a,position:o,reverseDirection:c,tooltipDimension:u.width,viewBox:h,viewBoxDimension:h.width}),v=$k({allowEscapeViewBox:t,coordinate:r,key:"y",offset:n,position:o,reverseDirection:c,tooltipDimension:u.height,viewBox:h,viewBoxDimension:h.height}),m=K6({translateX:g,translateY:v,useTranslate3d:f})):m=H6,{cssProperties:m,cssClasses:W6({translateX:g,translateY:v,coordinate:r})}}var V6=()=>!(typeof window<"u"&&window.document&&window.document.createElement&&window.setTimeout),nc={isSsr:V6()};function q6(e,t){return Z6(e)||X6(e,t)||Y6(e,t)||Q6()}function Q6(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function Y6(e,t){if(e){if(typeof e=="string")return zk(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?zk(e,t):void 0}}function zk(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);rnc.isSsr||!window.matchMedia?!1:window.matchMedia("(prefers-reduced-motion: reduce)").matches),t=q6(e,2),r=t[0],n=t[1];return y.useEffect(()=>{if(window.matchMedia){var a=window.matchMedia("(prefers-reduced-motion: reduce)"),o=()=>{n(a.matches)};return a.addEventListener("change",o),()=>{a.removeEventListener("change",o)}}},[]),r}function Fk(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function us(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);r({dismissed:!1,dismissedAtCoordinate:{x:0,y:0}})),h=r8(f,2),m=h[0],g=h[1];y.useEffect(()=>{var N=E=>{if(E.key==="Escape"){var A,P,_,O;g({dismissed:!0,dismissedAtCoordinate:{x:(A=(P=e.coordinate)===null||P===void 0?void 0:P.x)!==null&&A!==void 0?A:0,y:(_=(O=e.coordinate)===null||O===void 0?void 0:O.y)!==null&&_!==void 0?_:0}})}};return document.addEventListener("keydown",N),()=>{document.removeEventListener("keydown",N)}},[(t=e.coordinate)===null||t===void 0?void 0:t.x,(r=e.coordinate)===null||r===void 0?void 0:r.y]),m.dismissed&&(((n=(a=e.coordinate)===null||a===void 0?void 0:a.x)!==null&&n!==void 0?n:0)!==m.dismissedAtCoordinate.x||((o=(c=e.coordinate)===null||c===void 0?void 0:c.y)!==null&&o!==void 0?o:0)!==m.dismissedAtCoordinate.y)&&g(us(us({},m),{},{dismissed:!1}));var v=G6({allowEscapeViewBox:e.allowEscapeViewBox,coordinate:e.coordinate,offsetLeft:typeof e.offset=="number"?e.offset:e.offset.x,offsetTop:typeof e.offset=="number"?e.offset:e.offset.y,position:e.position,reverseDirection:e.reverseDirection,tooltipBox:{height:e.lastBoundingBox.height,width:e.lastBoundingBox.width},useTranslate3d:e.useTranslate3d,viewBox:e.viewBox}),b=v.cssClasses,j=v.cssProperties,k=e.hasPortalFromProps?{}:us(us({transition:s8({prefersReducedMotion:u,isAnimationActive:e.isAnimationActive,active:e.active,animationDuration:e.animationDuration,animationEasing:e.animationEasing})},j),{},{pointerEvents:"none",position:"absolute",top:0,left:0}),S=us(us({},k),{},{visibility:!m.dismissed&&e.active&&e.hasPayload?"visible":"hidden"},e.wrapperStyle);return y.createElement("div",{xmlns:"http://www.w3.org/1999/xhtml",tabIndex:-1,className:b,style:S,ref:e.innerRef},e.children)}var u8=y.memo(l8),uA=()=>{var e;return(e=Me(t=>t.rootProps.accessibilityLayer))!==null&&e!==void 0?e:!0};function qv(){return qv=Object.assign?Object.assign.bind():function(e){for(var t=1;tWe(e.x)&&We(e.y),Kk=e=>e.base!=null&&If(e.base)&&If(e),nu=e=>e.x,iu=e=>e.y,h8=(e,t)=>{if(typeof e=="function")return e;var r="curve".concat(Dy(e));if((r==="curveMonotone"||r==="curveBump")&&t){var n=Wk["".concat(r).concat(t==="vertical"?"Y":"X")];if(n)return n}return Wk[r]||xh},Gk={connectNulls:!1,type:"linear"},m8=e=>{var t=e.type,r=t===void 0?Gk.type:t,n=e.points,a=n===void 0?[]:n,o=e.baseLine,c=e.layout,u=e.connectNulls,f=u===void 0?Gk.connectNulls:u,h=h8(r,c),m=f?a.filter(If):a;if(Array.isArray(o)){var g,v=a.map((N,E)=>Hk(Hk({},N),{},{base:o[E]}));c==="vertical"?g=Md().y(iu).x1(nu).x0(N=>N.base.x):g=Md().x(nu).y1(iu).y0(N=>N.base.y);var b=g.defined(Kk).curve(h),j=f?v.filter(Kk):v;return b(j)}var k;c==="vertical"&&Ee(o)?k=Md().y(iu).x1(nu).x0(o):Ee(o)?k=Md().x(nu).y1(iu).y0(o):k=$E().x(nu).y(iu);var S=k.defined(If).curve(h);return S(m)},rf=e=>{var t=e.className,r=e.points,n=e.path,a=e.pathRef,o=nl();if((!r||!r.length)&&!n)return null;var c={type:e.type,points:e.points,baseLine:e.baseLine,layout:e.layout||o,connectNulls:e.connectNulls},u=r&&r.length?m8(c):n;return y.createElement("path",qv({},kn(e),Ry(e),{className:nt("recharts-curve",t),d:u===null?void 0:u,ref:a}))},p8=["x","y","top","left","width","height","className"];function Qv(){return Qv=Object.assign?Object.assign.bind():function(e){for(var t=1;t"M".concat(e,",").concat(a,"v").concat(n,"M").concat(o,",").concat(t,"h").concat(r),j8=e=>{var t=e.x,r=t===void 0?0:t,n=e.y,a=n===void 0?0:n,o=e.top,c=o===void 0?0:o,u=e.left,f=u===void 0?0:u,h=e.width,m=h===void 0?0:h,g=e.height,v=g===void 0?0:g,b=e.className,j=b8(e,p8),k=g8({x:r,y:a,top:c,left:f,width:m,height:v},j);return!Ee(r)||!Ee(a)||!Ee(m)||!Ee(v)||!Ee(c)||!Ee(f)?null:y.createElement("path",Qv({},rn(k),{className:nt("recharts-cross",b),d:k8(r,a,m,v,c,f)}))};function S8(e,t,r,n){var a=n/2;return{stroke:"none",fill:"#ccc",x:e==="horizontal"?t.x-a:r.left+.5,y:e==="horizontal"?r.top+.5:t.y-a,width:e==="horizontal"?n:r.width-1,height:e==="horizontal"?r.height-1:n}}var Tf=1e-4,cA=(e,t)=>[0,3*e,3*t-6*e,3*e-3*t+1],dA=(e,t)=>e.map((r,n)=>r*t**n).reduce((r,n)=>r+n),qk=(e,t)=>r=>{var n=cA(e,t);return dA(n,r)},N8=(e,t)=>r=>{var n=cA(e,t),a=[...n.map((o,c)=>o*c).slice(1),0];return dA(a,r)},E8=e=>{var t,r=e.split("(");if(r.length!==2||r[0]!=="cubic-bezier")return null;var n=(t=r[1])===null||t===void 0||(t=t.split(")")[0])===null||t===void 0?void 0:t.split(",");if(n==null||n.length!==4)return null;var a=n.map(o=>parseFloat(o));return[a[0],a[1],a[2],a[3]]},A8=function(){for(var t=arguments.length,r=new Array(t),n=0;n{var a=qk(e,r),o=qk(t,n),c=N8(e,r),u=h=>h>1?1:h<0?0:h,f=h=>{for(var m=h>1?1:h,g=m,v=0;v<8;++v){var b=a(g)-m,j=c(g);if(Math.abs(b-m)0&&arguments[0]!==void 0?arguments[0]:{},r=t.stiff,n=r===void 0?100:r,a=t.damping,o=a===void 0?8:a,c=t.dt,u=c===void 0?16.67:c,f=1,h=[0],m=0,g=0,v=1e4,b=0;b{var E,A,P;if(N<=0)return 0;if(N>=1)return f;var _=N*S,O=Math.floor(_),D=_-O;return((E=h[O])!==null&&E!==void 0?E:0)+(((A=h[O+1])!==null&&A!==void 0?A:0)-((P=h[O])!==null&&P!==void 0?P:0))*D}},O8=e=>{if(typeof e=="string")switch(e){case"ease":case"ease-in-out":case"ease-out":case"ease-in":case"linear":return Qk(e);case"spring":return P8();default:if(e.split("(")[0]==="cubic-bezier")return Qk(e)}return typeof e=="function"?e:null},_8=(e,t,r)=>{var n,a=o=>{var c=t.tick(o);if(t.getState()==="active"){if(r(t.getInterpolated()),t.getProgress()===1){t.complete(),n=void 0;return}n=e.setTimeout(a,c);return}n=e.setTimeout(a,c)};return n=e.setTimeout(a,0),()=>{var o;return(o=n)===null||o===void 0?void 0:o()}},fA=y.createContext(_8);fA.Provider;function M8(e){var t=y.useContext(fA);return y.useMemo(()=>e??t,[e,t])}function I8(e,t,r){return(t=T8(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function T8(e){var t=D8(e,"string");return typeof t=="symbol"?t:t+""}function D8(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}var Yk="init",Xk="pending",Zk="active",R8="completed";function Sg(e){return Math.max(0,e)}class L8{getAnimationStartedTime(){return this.animationStartedTime}getBeginStartedTime(){return this.beginStartedTime}constructor(t){var r;I8(this,"state",Yk),this.animationId=t.animationId,this.onAnimationEnd=t.onAnimationEnd,this.animationDuration=Sg(t.animationDuration),this.animationBegin=Sg(t.animationBegin),this.progress=0,this.from=t.from,this.to=t.to,this.easing=t.easing,(r=t.onAnimationStart)===null||r===void 0||r.call(t)}getState(){return this.state}getEasing(){return this.easing}getAnimationDuration(){return this.animationDuration}tick(t){if(this.getState()===Yk)return this.state=Xk,this.beginStartedTime=t,this.animationBegin;if(this.getState()===Xk){if(this.beginStartedTime==null)throw new Error;var r=t-this.beginStartedTime;return r>=this.animationBegin?(this.state=Zk,this.animationStartedTime=t,this.nextAnimationUpdate(0)):Sg(this.animationBegin-r)}if(this.getState()===Zk){if(this.animationStartedTime==null)throw new Error;var n=t-this.animationStartedTime;return this.setProgress(n/this.animationDuration),this.nextAnimationUpdate(n)}return 0}setProgress(t){this.progress=Math.min(1,Math.max(0,t))}getProgress(){return this.progress}complete(){if(this.progress=1,this.state==="active"){var t;(t=this.onAnimationEnd)===null||t===void 0||t.call(this)}this.state=R8}getFrom(){return this.from}getTo(){return this.to}getAnimationId(){return this.animationId}getAnimationBegin(){return this.animationBegin}}class $8 extends L8{nextAnimationUpdate(){return 0}getInterpolated(){return this.easing(mi(this.getFrom(),this.getTo(),this.getProgress()))}}class z8{setTimeout(t){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,n=performance.now(),a=null,o=c=>{c-n>=r?t(c):a=requestAnimationFrame(o)};return a=requestAnimationFrame(o),()=>{a!=null&&cancelAnimationFrame(a)}}}function F8(e,t){return W8(e)||H8(e,t)||U8(e,t)||B8()}function B8(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function U8(e,t){if(e){if(typeof e=="string")return Jk(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Jk(e,t):void 0}}function Jk(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{},onAnimationStart:()=>{}},ej=0,Ng=1;function hA(e){var t=on(e,K8),r=t.animationId,n=t.isActive,a=t.canBegin,o=t.duration,c=t.easing,u=t.begin,f=t.onAnimationEnd,h=t.onAnimationStart,m=t.children,g=lA(),v=n==="auto"?!nc.isSsr&&!g:n,b=M8(t.animationController),j=y.useState(v?ej:Ng),k=F8(j,2),S=k[0],N=k[1];return y.useEffect(()=>{v||N(Ng)},[v]),y.useEffect(()=>{var E=O8(c);if(!v||!a||E==null)return rl;var A=new z8,P=new $8({animationId:r,easing:E,animationDuration:o,animationBegin:u,onAnimationStart:h,onAnimationEnd:f,from:ej,to:Ng});return b(A,P,N)},[b,r,v,a,o,c,u,h,f]),m(Number(S))}function mA(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"animation-",r=y.useRef(Au(t)),n=y.useRef(e);return n.current!==e&&(r.current=Au(t),n.current=e),r.current}var G8=e=>e.replace(/([A-Z])/g,t=>"-".concat(t.toLowerCase())),V8=(e,t,r)=>e.map(n=>"".concat(G8(n)," ").concat(t,"ms ").concat(r)).join(","),q8=["radius"],Q8=["radius"],tj,rj,nj,ij,aj,oj,sj,lj,uj,cj;function dj(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function fj(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);r{var o=va(r),c=va(n),u=Math.min(Math.abs(o)/2,Math.abs(c)/2),f=c>=0?1:-1,h=o>=0?1:-1,m=c>=0&&o>=0||c<0&&o<0?1:0,g;if(u>0&&Array.isArray(a)){for(var v=[0,0,0,0],b=0,j=4;bu?u:S}g=Gt(tj||(tj=Mn(["M",",",""])),e,t+f*v[0]),v[0]>0&&(g+=Gt(rj||(rj=Mn(["A ",",",",0,0,",",",",",""])),v[0],v[0],m,e+h*v[0],t)),g+=Gt(nj||(nj=Mn(["L ",",",""])),e+r-h*v[1],t),v[1]>0&&(g+=Gt(ij||(ij=Mn(["A ",",",",0,0,",`, - `,",",""])),v[1],v[1],m,e+r,t+f*v[1])),g+=Gt(aj||(aj=Mn(["L ",",",""])),e+r,t+n-f*v[2]),v[2]>0&&(g+=Gt(oj||(oj=Mn(["A ",",",",0,0,",`, - `,",",""])),v[2],v[2],m,e+r-h*v[2],t+n)),g+=Gt(sj||(sj=Mn(["L ",",",""])),e+h*v[3],t+n),v[3]>0&&(g+=Gt(lj||(lj=Mn(["A ",",",",0,0,",`, - `,",",""])),v[3],v[3],m,e,t+n-f*v[3])),g+="Z"}else if(u>0&&a===+a&&a>0){var N=Math.min(u,a);g=Gt(uj||(uj=Mn(["M ",",",` + */var Ik;function m6(){if(Ik)return wg;Ik=1;var e=tl();function t(f,h){return f===h&&(f!==0||1/f===1/h)||f!==f&&h!==h}var r=typeof Object.is=="function"?Object.is:t,n=e.useSyncExternalStore,a=e.useRef,o=e.useEffect,c=e.useMemo,u=e.useDebugValue;return wg.useSyncExternalStoreWithSelector=function(f,h,m,g,v){var b=a(null);if(b.current===null){var j={hasValue:!1,value:null};b.current=j}else j=b.current;b=c(function(){function S(_){if(!N){if(N=!0,E=_,_=g(_),v!==void 0&&j.hasValue){var O=j.value;if(v(O,_))return A=O}return A=_}if(O=A,r(E,_))return O;var D=g(_);return v!==void 0&&v(O,D)?(E=_,O):(E=_,A=D)}var N=!1,E,A,P=m===void 0?null:m;return[function(){return S(h())},P===null?void 0:function(){return S(P())}]},[h,m,g,v]);var k=n(f,b[0],b[1]);return o(function(){j.hasValue=!0,j.value=k},[k]),u(k),k},wg}var Tk;function p6(){return Tk||(Tk=1,bg.exports=m6()),bg.exports}p6();function g6(e){e()}function v6(){let e=null,t=null;return{clear(){e=null,t=null},notify(){g6(()=>{let r=e;for(;r;)r.callback(),r=r.next})},get(){const r=[];let n=e;for(;n;)r.push(n),n=n.next;return r},subscribe(r){let n=!0;const a=t={callback:r,next:null,prev:t};return a.prev?a.prev.next=a:e=a,function(){!n||e===null||(n=!1,a.next?a.next.prev=a.prev:t=a.prev,a.prev?a.prev.next=a.next:e=a.next)}}}}var Dk={notify(){},get:()=>[]};function y6(e,t){let r,n=Dk,a=0,o=!1;function c(k){m();const S=n.subscribe(k);let N=!1;return()=>{N||(N=!0,S(),g())}}function u(){n.notify()}function f(){j.onStateChange&&j.onStateChange()}function h(){return o}function m(){a++,r||(r=e.subscribe(f),n=v6())}function g(){a--,r&&a===0&&(r(),r=void 0,n.clear(),n=Dk)}function v(){o||(o=!0,m())}function b(){o&&(o=!1,g())}const j={addNestedSub:c,notifyNestedSubs:u,handleChangeWrapper:f,isSubscribed:h,trySubscribe:v,tryUnsubscribe:b,getListeners:()=>n};return j}var x6=()=>typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",b6=x6(),w6=()=>typeof navigator<"u"&&navigator.product==="ReactNative",k6=w6(),j6=()=>b6||k6?y.useLayoutEffect:y.useEffect,S6=j6();function Rk(e,t){return e===t?e!==0||t!==0||1/e===1/t:e!==e&&t!==t}function N6(e,t){if(Rk(e,t))return!0;if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;const r=Object.keys(e),n=Object.keys(t);if(r.length!==n.length)return!1;for(let a=0;a{const f=y6(a);return{store:a,subscription:f,getServerState:n?()=>n:void 0}},[a,n]),c=y.useMemo(()=>a.getState(),[a]);S6(()=>{const{subscription:f}=o;return f.onStateChange=f.notifyNestedSubs,f.trySubscribe(),c!==a.getState()&&f.notifyNestedSubs(),()=>{f.tryUnsubscribe(),f.onStateChange=void 0}},[o,c]);const u=r||A6;return y.createElement(u.Provider,{value:o},t)}var P6=C6,O6=new Set(["axisLine","tickLine","activeBar","activeDot","activeLabel","activeShape","allowEscapeViewBox","background","cursor","dot","label","line","margin","padding","position","shape","style","tick","wrapperStyle","radius","throttledEvents"]);function _6(e,t){return e==null&&t==null?!0:typeof e=="number"&&typeof t=="number"?e===t||e!==e&&t!==t:e===t}function Fh(e,t){var r=new Set([...Object.keys(e),...Object.keys(t)]);for(var n of r)if(O6.has(n)){if(e[n]==null&&t[n]==null)continue;if(!N6(e[n],t[n]))return!1}else if(!_6(e[n],t[n]))return!1;return!0}function Vv(){return Vv=Object.assign?Object.assign.bind():function(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);r{var t=e.separator,r=t===void 0?us.separator:t,n=e.contentStyle,a=e.itemStyle,o=e.labelStyle,c=o===void 0?us.labelStyle:o,u=e.payload,f=e.formatter,h=e.itemSorter,m=e.wrapperClassName,g=e.labelClassName,v=e.label,b=e.labelFormatter,j=e.accessibilityLayer,k=j===void 0?us.accessibilityLayer:j,S=()=>{if(u&&u.length){var U={padding:0,margin:0},B=B6(u,h),F=B.map((Y,H)=>{if(!Y||Y.type==="none")return null;var pe=Y.formatter||f||F6,ue=Y.value,he=Y.name,ae=ue,se=he;if(pe){var X=pe(ue,he,Y,H,u);if(Array.isArray(X)){var te=D6(X,2);ae=te[0],se=te[1]}else if(X!=null)ae=X;else return null}var J=tu(tu({},us.itemStyle),{},{color:Y.color||us.itemStyle.color},a);return y.createElement("li",{className:"recharts-tooltip-item",key:"tooltip-item-".concat(H),style:J},Gn(se)?y.createElement("span",{className:"recharts-tooltip-item-name"},se):null,Gn(se)?y.createElement("span",{className:"recharts-tooltip-item-separator"},r):null,y.createElement("span",{className:"recharts-tooltip-item-value"},ae),y.createElement("span",{className:"recharts-tooltip-item-unit"},Y.unit||""))});return y.createElement("ul",{className:"recharts-tooltip-item-list",style:U},F)}return null},N=tu(tu({},us.contentStyle),n),E=tu({margin:0},c),A=!Yt(v),P=A?v:"",_=nt("recharts-default-tooltip",m),O=nt("recharts-tooltip-label",g);A&&b&&u!==void 0&&u!==null&&(P=b(v,u));var D=k?{role:"status","aria-live":"assertive"}:{};return y.createElement("div",Vv({className:_,style:N},D),y.createElement("p",{className:O,style:E},y.isValidElement(P)?P:"".concat(P)),S())},ru="recharts-tooltip-wrapper",H6={visibility:"hidden"};function W6(e){var t=e.coordinate,r=e.translateX,n=e.translateY;return nt(ru,{["".concat(ru,"-right")]:Ee(r)&&t&&Ee(t.x)&&r>=t.x,["".concat(ru,"-left")]:Ee(r)&&t&&Ee(t.x)&&r=t.y,["".concat(ru,"-top")]:Ee(n)&&t&&Ee(t.y)&&n0?a:0),g=r[n]+a;if(t[n])return c[n]?m:g;var v=f[n];if(v==null)return 0;if(c[n]){var b=m,j=v;return bS?Math.max(m,v):Math.max(g,v)}function K6(e){var t=e.translateX,r=e.translateY,n=e.useTranslate3d;return{transform:n?"translate3d(".concat(t,"px, ").concat(r,"px, 0)"):"translate(".concat(t,"px, ").concat(r,"px)")}}function G6(e){var t=e.allowEscapeViewBox,r=e.coordinate,n=e.offsetTop,a=e.offsetLeft,o=e.position,c=e.reverseDirection,u=e.tooltipBox,f=e.useTranslate3d,h=e.viewBox,m,g,v;return u.height>0&&u.width>0&&r?(g=zk({allowEscapeViewBox:t,coordinate:r,key:"x",offset:a,position:o,reverseDirection:c,tooltipDimension:u.width,viewBox:h,viewBoxDimension:h.width}),v=zk({allowEscapeViewBox:t,coordinate:r,key:"y",offset:n,position:o,reverseDirection:c,tooltipDimension:u.height,viewBox:h,viewBoxDimension:h.height}),m=K6({translateX:g,translateY:v,useTranslate3d:f})):m=H6,{cssProperties:m,cssClasses:W6({translateX:g,translateY:v,coordinate:r})}}var V6=()=>!(typeof window<"u"&&window.document&&window.document.createElement&&window.setTimeout),nc={isSsr:V6()};function q6(e,t){return Z6(e)||X6(e,t)||Y6(e,t)||Q6()}function Q6(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function Y6(e,t){if(e){if(typeof e=="string")return Fk(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Fk(e,t):void 0}}function Fk(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);rnc.isSsr||!window.matchMedia?!1:window.matchMedia("(prefers-reduced-motion: reduce)").matches),t=q6(e,2),r=t[0],n=t[1];return y.useEffect(()=>{if(window.matchMedia){var a=window.matchMedia("(prefers-reduced-motion: reduce)"),o=()=>{n(a.matches)};return a.addEventListener("change",o),()=>{a.removeEventListener("change",o)}}},[]),r}function Bk(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function cs(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);r({dismissed:!1,dismissedAtCoordinate:{x:0,y:0}})),h=r8(f,2),m=h[0],g=h[1];y.useEffect(()=>{var N=E=>{if(E.key==="Escape"){var A,P,_,O;g({dismissed:!0,dismissedAtCoordinate:{x:(A=(P=e.coordinate)===null||P===void 0?void 0:P.x)!==null&&A!==void 0?A:0,y:(_=(O=e.coordinate)===null||O===void 0?void 0:O.y)!==null&&_!==void 0?_:0}})}};return document.addEventListener("keydown",N),()=>{document.removeEventListener("keydown",N)}},[(t=e.coordinate)===null||t===void 0?void 0:t.x,(r=e.coordinate)===null||r===void 0?void 0:r.y]),m.dismissed&&(((n=(a=e.coordinate)===null||a===void 0?void 0:a.x)!==null&&n!==void 0?n:0)!==m.dismissedAtCoordinate.x||((o=(c=e.coordinate)===null||c===void 0?void 0:c.y)!==null&&o!==void 0?o:0)!==m.dismissedAtCoordinate.y)&&g(cs(cs({},m),{},{dismissed:!1}));var v=G6({allowEscapeViewBox:e.allowEscapeViewBox,coordinate:e.coordinate,offsetLeft:typeof e.offset=="number"?e.offset:e.offset.x,offsetTop:typeof e.offset=="number"?e.offset:e.offset.y,position:e.position,reverseDirection:e.reverseDirection,tooltipBox:{height:e.lastBoundingBox.height,width:e.lastBoundingBox.width},useTranslate3d:e.useTranslate3d,viewBox:e.viewBox}),b=v.cssClasses,j=v.cssProperties,k=e.hasPortalFromProps?{}:cs(cs({transition:s8({prefersReducedMotion:u,isAnimationActive:e.isAnimationActive,active:e.active,animationDuration:e.animationDuration,animationEasing:e.animationEasing})},j),{},{pointerEvents:"none",position:"absolute",top:0,left:0}),S=cs(cs({},k),{},{visibility:!m.dismissed&&e.active&&e.hasPayload?"visible":"hidden"},e.wrapperStyle);return y.createElement("div",{xmlns:"http://www.w3.org/1999/xhtml",tabIndex:-1,className:b,style:S,ref:e.innerRef},e.children)}var u8=y.memo(l8),uA=()=>{var e;return(e=Me(t=>t.rootProps.accessibilityLayer))!==null&&e!==void 0?e:!0};function qv(){return qv=Object.assign?Object.assign.bind():function(e){for(var t=1;tWe(e.x)&&We(e.y),Gk=e=>e.base!=null&&If(e.base)&&If(e),nu=e=>e.x,iu=e=>e.y,h8=(e,t)=>{if(typeof e=="function")return e;var r="curve".concat(Ry(e));if((r==="curveMonotone"||r==="curveBump")&&t){var n=Kk["".concat(r).concat(t==="vertical"?"Y":"X")];if(n)return n}return Kk[r]||xh},Vk={connectNulls:!1,type:"linear"},m8=e=>{var t=e.type,r=t===void 0?Vk.type:t,n=e.points,a=n===void 0?[]:n,o=e.baseLine,c=e.layout,u=e.connectNulls,f=u===void 0?Vk.connectNulls:u,h=h8(r,c),m=f?a.filter(If):a;if(Array.isArray(o)){var g,v=a.map((N,E)=>Wk(Wk({},N),{},{base:o[E]}));c==="vertical"?g=Md().y(iu).x1(nu).x0(N=>N.base.x):g=Md().x(nu).y1(iu).y0(N=>N.base.y);var b=g.defined(Gk).curve(h),j=f?v.filter(Gk):v;return b(j)}var k;c==="vertical"&&Ee(o)?k=Md().y(iu).x1(nu).x0(o):Ee(o)?k=Md().x(nu).y1(iu).y0(o):k=$E().x(nu).y(iu);var S=k.defined(If).curve(h);return S(m)},rf=e=>{var t=e.className,r=e.points,n=e.path,a=e.pathRef,o=il();if((!r||!r.length)&&!n)return null;var c={type:e.type,points:e.points,baseLine:e.baseLine,layout:e.layout||o,connectNulls:e.connectNulls},u=r&&r.length?m8(c):n;return y.createElement("path",qv({},kn(e),Ly(e),{className:nt("recharts-curve",t),d:u===null?void 0:u,ref:a}))},p8=["x","y","top","left","width","height","className"];function Qv(){return Qv=Object.assign?Object.assign.bind():function(e){for(var t=1;t"M".concat(e,",").concat(a,"v").concat(n,"M").concat(o,",").concat(t,"h").concat(r),j8=e=>{var t=e.x,r=t===void 0?0:t,n=e.y,a=n===void 0?0:n,o=e.top,c=o===void 0?0:o,u=e.left,f=u===void 0?0:u,h=e.width,m=h===void 0?0:h,g=e.height,v=g===void 0?0:g,b=e.className,j=b8(e,p8),k=g8({x:r,y:a,top:c,left:f,width:m,height:v},j);return!Ee(r)||!Ee(a)||!Ee(m)||!Ee(v)||!Ee(c)||!Ee(f)?null:y.createElement("path",Qv({},rn(k),{className:nt("recharts-cross",b),d:k8(r,a,m,v,c,f)}))};function S8(e,t,r,n){var a=n/2;return{stroke:"none",fill:"#ccc",x:e==="horizontal"?t.x-a:r.left+.5,y:e==="horizontal"?r.top+.5:t.y-a,width:e==="horizontal"?n:r.width-1,height:e==="horizontal"?r.height-1:n}}var Tf=1e-4,cA=(e,t)=>[0,3*e,3*t-6*e,3*e-3*t+1],dA=(e,t)=>e.map((r,n)=>r*t**n).reduce((r,n)=>r+n),Qk=(e,t)=>r=>{var n=cA(e,t);return dA(n,r)},N8=(e,t)=>r=>{var n=cA(e,t),a=[...n.map((o,c)=>o*c).slice(1),0];return dA(a,r)},E8=e=>{var t,r=e.split("(");if(r.length!==2||r[0]!=="cubic-bezier")return null;var n=(t=r[1])===null||t===void 0||(t=t.split(")")[0])===null||t===void 0?void 0:t.split(",");if(n==null||n.length!==4)return null;var a=n.map(o=>parseFloat(o));return[a[0],a[1],a[2],a[3]]},A8=function(){for(var t=arguments.length,r=new Array(t),n=0;n{var a=Qk(e,r),o=Qk(t,n),c=N8(e,r),u=h=>h>1?1:h<0?0:h,f=h=>{for(var m=h>1?1:h,g=m,v=0;v<8;++v){var b=a(g)-m,j=c(g);if(Math.abs(b-m)0&&arguments[0]!==void 0?arguments[0]:{},r=t.stiff,n=r===void 0?100:r,a=t.damping,o=a===void 0?8:a,c=t.dt,u=c===void 0?16.67:c,f=1,h=[0],m=0,g=0,v=1e4,b=0;b{var E,A,P;if(N<=0)return 0;if(N>=1)return f;var _=N*S,O=Math.floor(_),D=_-O;return((E=h[O])!==null&&E!==void 0?E:0)+(((A=h[O+1])!==null&&A!==void 0?A:0)-((P=h[O])!==null&&P!==void 0?P:0))*D}},O8=e=>{if(typeof e=="string")switch(e){case"ease":case"ease-in-out":case"ease-out":case"ease-in":case"linear":return Yk(e);case"spring":return P8();default:if(e.split("(")[0]==="cubic-bezier")return Yk(e)}return typeof e=="function"?e:null},_8=(e,t,r)=>{var n,a=o=>{var c=t.tick(o);if(t.getState()==="active"){if(r(t.getInterpolated()),t.getProgress()===1){t.complete(),n=void 0;return}n=e.setTimeout(a,c);return}n=e.setTimeout(a,c)};return n=e.setTimeout(a,0),()=>{var o;return(o=n)===null||o===void 0?void 0:o()}},fA=y.createContext(_8);fA.Provider;function M8(e){var t=y.useContext(fA);return y.useMemo(()=>e??t,[e,t])}function I8(e,t,r){return(t=T8(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function T8(e){var t=D8(e,"string");return typeof t=="symbol"?t:t+""}function D8(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}var Xk="init",Zk="pending",Jk="active",R8="completed";function Sg(e){return Math.max(0,e)}class L8{getAnimationStartedTime(){return this.animationStartedTime}getBeginStartedTime(){return this.beginStartedTime}constructor(t){var r;I8(this,"state",Xk),this.animationId=t.animationId,this.onAnimationEnd=t.onAnimationEnd,this.animationDuration=Sg(t.animationDuration),this.animationBegin=Sg(t.animationBegin),this.progress=0,this.from=t.from,this.to=t.to,this.easing=t.easing,(r=t.onAnimationStart)===null||r===void 0||r.call(t)}getState(){return this.state}getEasing(){return this.easing}getAnimationDuration(){return this.animationDuration}tick(t){if(this.getState()===Xk)return this.state=Zk,this.beginStartedTime=t,this.animationBegin;if(this.getState()===Zk){if(this.beginStartedTime==null)throw new Error;var r=t-this.beginStartedTime;return r>=this.animationBegin?(this.state=Jk,this.animationStartedTime=t,this.nextAnimationUpdate(0)):Sg(this.animationBegin-r)}if(this.getState()===Jk){if(this.animationStartedTime==null)throw new Error;var n=t-this.animationStartedTime;return this.setProgress(n/this.animationDuration),this.nextAnimationUpdate(n)}return 0}setProgress(t){this.progress=Math.min(1,Math.max(0,t))}getProgress(){return this.progress}complete(){if(this.progress=1,this.state==="active"){var t;(t=this.onAnimationEnd)===null||t===void 0||t.call(this)}this.state=R8}getFrom(){return this.from}getTo(){return this.to}getAnimationId(){return this.animationId}getAnimationBegin(){return this.animationBegin}}class $8 extends L8{nextAnimationUpdate(){return 0}getInterpolated(){return this.easing(mi(this.getFrom(),this.getTo(),this.getProgress()))}}class z8{setTimeout(t){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,n=performance.now(),a=null,o=c=>{c-n>=r?t(c):a=requestAnimationFrame(o)};return a=requestAnimationFrame(o),()=>{a!=null&&cancelAnimationFrame(a)}}}function F8(e,t){return W8(e)||H8(e,t)||U8(e,t)||B8()}function B8(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function U8(e,t){if(e){if(typeof e=="string")return ej(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?ej(e,t):void 0}}function ej(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{},onAnimationStart:()=>{}},tj=0,Ng=1;function hA(e){var t=on(e,K8),r=t.animationId,n=t.isActive,a=t.canBegin,o=t.duration,c=t.easing,u=t.begin,f=t.onAnimationEnd,h=t.onAnimationStart,m=t.children,g=lA(),v=n==="auto"?!nc.isSsr&&!g:n,b=M8(t.animationController),j=y.useState(v?tj:Ng),k=F8(j,2),S=k[0],N=k[1];return y.useEffect(()=>{v||N(Ng)},[v]),y.useEffect(()=>{var E=O8(c);if(!v||!a||E==null)return nl;var A=new z8,P=new $8({animationId:r,easing:E,animationDuration:o,animationBegin:u,onAnimationStart:h,onAnimationEnd:f,from:tj,to:Ng});return b(A,P,N)},[b,r,v,a,o,c,u,h,f]),m(Number(S))}function mA(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"animation-",r=y.useRef(Au(t)),n=y.useRef(e);return n.current!==e&&(r.current=Au(t),n.current=e),r.current}var G8=e=>e.replace(/([A-Z])/g,t=>"-".concat(t.toLowerCase())),V8=(e,t,r)=>e.map(n=>"".concat(G8(n)," ").concat(t,"ms ").concat(r)).join(","),q8=["radius"],Q8=["radius"],rj,nj,ij,aj,oj,sj,lj,uj,cj,dj;function fj(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function hj(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);r{var o=va(r),c=va(n),u=Math.min(Math.abs(o)/2,Math.abs(c)/2),f=c>=0?1:-1,h=o>=0?1:-1,m=c>=0&&o>=0||c<0&&o<0?1:0,g;if(u>0&&Array.isArray(a)){for(var v=[0,0,0,0],b=0,j=4;bu?u:S}g=Gt(rj||(rj=Mn(["M",",",""])),e,t+f*v[0]),v[0]>0&&(g+=Gt(nj||(nj=Mn(["A ",",",",0,0,",",",",",""])),v[0],v[0],m,e+h*v[0],t)),g+=Gt(ij||(ij=Mn(["L ",",",""])),e+r-h*v[1],t),v[1]>0&&(g+=Gt(aj||(aj=Mn(["A ",",",",0,0,",`, + `,",",""])),v[1],v[1],m,e+r,t+f*v[1])),g+=Gt(oj||(oj=Mn(["L ",",",""])),e+r,t+n-f*v[2]),v[2]>0&&(g+=Gt(sj||(sj=Mn(["A ",",",",0,0,",`, + `,",",""])),v[2],v[2],m,e+r-h*v[2],t+n)),g+=Gt(lj||(lj=Mn(["L ",",",""])),e+h*v[3],t+n),v[3]>0&&(g+=Gt(uj||(uj=Mn(["A ",",",",0,0,",`, + `,",",""])),v[3],v[3],m,e,t+n-f*v[3])),g+="Z"}else if(u>0&&a===+a&&a>0){var N=Math.min(u,a);g=Gt(cj||(cj=Mn(["M ",",",` A `,",",",0,0,",",",",",` L `,",",` A `,",",",0,0,",",",",",` L `,",",` A `,",",",0,0,",",",",",` L `,",",` - A `,",",",0,0,",",",","," Z"])),e,t+f*N,N,N,m,e+h*N,t,e+r-h*N,t,N,N,m,e+r,t+f*N,e+r,t+n-f*N,N,N,m,e+r-h*N,t+n,e+h*N,t+n,N,N,m,e,t+n-f*N)}else g=Gt(cj||(cj=Mn(["M ",","," h "," v "," h "," Z"])),e,t,r,n,-r);return g},gj={x:0,y:0,width:0,height:0,radius:0,isAnimationActive:!1,isUpdateAnimationActive:!1,animationBegin:0,animationDuration:1500,animationEasing:"ease"},aF=e=>{var t=on(e,gj),r=y.useRef(null),n=y.useState(-1),a=eF(n,2),o=a[0],c=a[1];y.useEffect(()=>{if(r.current&&r.current.getTotalLength)try{var X=r.current.getTotalLength();X&&c(X)}catch{}},[]);var u=t.x,f=t.y,h=t.width,m=t.height,g=t.radius,v=t.className,b=t.animationEasing,j=t.animationDuration,k=t.animationBegin,S=t.isAnimationActive,N=t.isUpdateAnimationActive,E=y.useRef(h),A=y.useRef(m),P=y.useRef(u),_=y.useRef(f),O=y.useMemo(()=>({x:u,y:f,width:h,height:m,radius:g}),[u,f,h,m,g]),D=mA(O,"rectangle-");if(u!==+u||f!==+f||h!==+h||m!==+m||h===0||m===0)return null;var U=nt("recharts-rectangle",v);if(!N){var B=rn(t);B.radius;var F=hj(B,q8);return y.createElement("path",Df({},F,{x:va(u),y:va(f),width:va(h),height:va(m),radius:typeof g=="number"?g:void 0,className:U,d:pj(u,f,h,m,g)}))}var Y=E.current,H=A.current,pe=P.current,ue=_.current,he="0px ".concat(o===-1?1:o,"px"),ae="".concat(o,"px ").concat(o,"px"),se=V8(["strokeDasharray"],j,typeof b=="string"?b:gj.animationEasing);return y.createElement(hA,{animationId:D,key:D,canBegin:o>0,duration:j,easing:b,isActive:N,begin:k},X=>{var te=mi(Y,h,X),J=mi(H,m,X),I=mi(pe,u,X),M=mi(ue,f,X);r.current&&(E.current=te,A.current=J,P.current=I,_.current=M);var K;S?X>0?K={transition:se,strokeDasharray:ae}:K={strokeDasharray:he}:K={strokeDasharray:ae};var ne=rn(t);ne.radius;var Z=hj(ne,Q8);return y.createElement("path",Df({},Z,{radius:typeof g=="number"?g:void 0,className:U,d:pj(I,M,te,J,g),ref:r,style:fj(fj({},K),t.style)}))})};function vj(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function yj(e){for(var t=1;te*180/Math.PI,Qt=(e,t,r,n)=>({x:e+Math.cos(-Rf*n)*r,y:t+Math.sin(-Rf*n)*r}),cF=function(t,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{top:0,right:0,bottom:0,left:0};return Math.min(Math.abs(t-(n.left||0)-(n.right||0)),Math.abs(r-(n.top||0)-(n.bottom||0)))/2},dF=(e,t)=>{var r=e.x,n=e.y,a=t.x,o=t.y;return Math.sqrt((r-a)**2+(n-o)**2)},fF=(e,t)=>{var r=e.x,n=e.y,a=t.cx,o=t.cy,c=dF({x:r,y:n},{x:a,y:o});if(c<=0)return{radius:c,angle:0};var u=(r-a)/c,f=Math.acos(u);return n>o&&(f=2*Math.PI-f),{radius:c,angle:uF(f),angleInRadian:f}},hF=e=>{var t=e.startAngle,r=e.endAngle,n=Math.floor(t/360),a=Math.floor(r/360),o=Math.min(n,a);return{startAngle:t-o*360,endAngle:r-o*360}},mF=(e,t)=>{var r=t.startAngle,n=t.endAngle,a=Math.floor(r/360),o=Math.floor(n/360),c=Math.min(a,o);return e+c*360},pF=(e,t)=>{var r=e.relativeX,n=e.relativeY,a=fF({x:r,y:n},t),o=a.radius,c=a.angle,u=t.innerRadius,f=t.outerRadius;if(of||o===0)return null;var h=hF(t),m=h.startAngle,g=h.endAngle,v=c,b;if(m<=g){for(;v>g;)v-=360;for(;v=m&&v<=g}else{for(;v>m;)v-=360;for(;v=g&&v<=m}return b?yj(yj({},t),{},{radius:o,angle:mF(v,t)}):null};function pA(e){var t=e.cx,r=e.cy,n=e.radius,a=e.startAngle,o=e.endAngle,c=Qt(t,r,n,a),u=Qt(t,r,n,o);return{points:[c,u],cx:t,cy:r,radius:n,startAngle:a,endAngle:o}}var xj,bj,wj,kj,jj,Sj,Nj;function Yv(){return Yv=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var r=Jr(t-e),n=Math.min(Math.abs(t-e),359.999);return r*n},Fd=e=>{var t=e.cx,r=e.cy,n=e.radius,a=e.angle,o=e.sign,c=e.isExternal,u=e.cornerRadius,f=e.cornerIsExternal,h=u*(c?1:-1)+n,m=Math.asin(u/h)/Rf,g=f?a:a+o*m,v=Qt(t,r,h,g),b=Qt(t,r,n,g),j=f?a-o*m:a,k=Qt(t,r,h*Math.cos(m*Rf),j);return{center:v,circleTangency:b,lineTangency:k,theta:m}},gA=e=>{var t=e.cx,r=e.cy,n=e.innerRadius,a=e.outerRadius,o=e.startAngle,c=e.endAngle,u=gF(o,c),f=o+u,h=Qt(t,r,a,o),m=Qt(t,r,a,f),g=Gt(xj||(xj=eo(["M ",",",` + A `,",",",0,0,",",",","," Z"])),e,t+f*N,N,N,m,e+h*N,t,e+r-h*N,t,N,N,m,e+r,t+f*N,e+r,t+n-f*N,N,N,m,e+r-h*N,t+n,e+h*N,t+n,N,N,m,e,t+n-f*N)}else g=Gt(dj||(dj=Mn(["M ",","," h "," v "," h "," Z"])),e,t,r,n,-r);return g},vj={x:0,y:0,width:0,height:0,radius:0,isAnimationActive:!1,isUpdateAnimationActive:!1,animationBegin:0,animationDuration:1500,animationEasing:"ease"},aF=e=>{var t=on(e,vj),r=y.useRef(null),n=y.useState(-1),a=eF(n,2),o=a[0],c=a[1];y.useEffect(()=>{if(r.current&&r.current.getTotalLength)try{var X=r.current.getTotalLength();X&&c(X)}catch{}},[]);var u=t.x,f=t.y,h=t.width,m=t.height,g=t.radius,v=t.className,b=t.animationEasing,j=t.animationDuration,k=t.animationBegin,S=t.isAnimationActive,N=t.isUpdateAnimationActive,E=y.useRef(h),A=y.useRef(m),P=y.useRef(u),_=y.useRef(f),O=y.useMemo(()=>({x:u,y:f,width:h,height:m,radius:g}),[u,f,h,m,g]),D=mA(O,"rectangle-");if(u!==+u||f!==+f||h!==+h||m!==+m||h===0||m===0)return null;var U=nt("recharts-rectangle",v);if(!N){var B=rn(t);B.radius;var F=mj(B,q8);return y.createElement("path",Df({},F,{x:va(u),y:va(f),width:va(h),height:va(m),radius:typeof g=="number"?g:void 0,className:U,d:gj(u,f,h,m,g)}))}var Y=E.current,H=A.current,pe=P.current,ue=_.current,he="0px ".concat(o===-1?1:o,"px"),ae="".concat(o,"px ").concat(o,"px"),se=V8(["strokeDasharray"],j,typeof b=="string"?b:vj.animationEasing);return y.createElement(hA,{animationId:D,key:D,canBegin:o>0,duration:j,easing:b,isActive:N,begin:k},X=>{var te=mi(Y,h,X),J=mi(H,m,X),I=mi(pe,u,X),M=mi(ue,f,X);r.current&&(E.current=te,A.current=J,P.current=I,_.current=M);var K;S?X>0?K={transition:se,strokeDasharray:ae}:K={strokeDasharray:he}:K={strokeDasharray:ae};var ne=rn(t);ne.radius;var Z=mj(ne,Q8);return y.createElement("path",Df({},Z,{radius:typeof g=="number"?g:void 0,className:U,d:gj(I,M,te,J,g),ref:r,style:hj(hj({},K),t.style)}))})};function yj(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function xj(e){for(var t=1;te*180/Math.PI,Qt=(e,t,r,n)=>({x:e+Math.cos(-Rf*n)*r,y:t+Math.sin(-Rf*n)*r}),cF=function(t,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{top:0,right:0,bottom:0,left:0};return Math.min(Math.abs(t-(n.left||0)-(n.right||0)),Math.abs(r-(n.top||0)-(n.bottom||0)))/2},dF=(e,t)=>{var r=e.x,n=e.y,a=t.x,o=t.y;return Math.sqrt((r-a)**2+(n-o)**2)},fF=(e,t)=>{var r=e.x,n=e.y,a=t.cx,o=t.cy,c=dF({x:r,y:n},{x:a,y:o});if(c<=0)return{radius:c,angle:0};var u=(r-a)/c,f=Math.acos(u);return n>o&&(f=2*Math.PI-f),{radius:c,angle:uF(f),angleInRadian:f}},hF=e=>{var t=e.startAngle,r=e.endAngle,n=Math.floor(t/360),a=Math.floor(r/360),o=Math.min(n,a);return{startAngle:t-o*360,endAngle:r-o*360}},mF=(e,t)=>{var r=t.startAngle,n=t.endAngle,a=Math.floor(r/360),o=Math.floor(n/360),c=Math.min(a,o);return e+c*360},pF=(e,t)=>{var r=e.relativeX,n=e.relativeY,a=fF({x:r,y:n},t),o=a.radius,c=a.angle,u=t.innerRadius,f=t.outerRadius;if(of||o===0)return null;var h=hF(t),m=h.startAngle,g=h.endAngle,v=c,b;if(m<=g){for(;v>g;)v-=360;for(;v=m&&v<=g}else{for(;v>m;)v-=360;for(;v=g&&v<=m}return b?xj(xj({},t),{},{radius:o,angle:mF(v,t)}):null};function pA(e){var t=e.cx,r=e.cy,n=e.radius,a=e.startAngle,o=e.endAngle,c=Qt(t,r,n,a),u=Qt(t,r,n,o);return{points:[c,u],cx:t,cy:r,radius:n,startAngle:a,endAngle:o}}var bj,wj,kj,jj,Sj,Nj,Ej;function Yv(){return Yv=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var r=Jr(t-e),n=Math.min(Math.abs(t-e),359.999);return r*n},Fd=e=>{var t=e.cx,r=e.cy,n=e.radius,a=e.angle,o=e.sign,c=e.isExternal,u=e.cornerRadius,f=e.cornerIsExternal,h=u*(c?1:-1)+n,m=Math.asin(u/h)/Rf,g=f?a:a+o*m,v=Qt(t,r,h,g),b=Qt(t,r,n,g),j=f?a-o*m:a,k=Qt(t,r,h*Math.cos(m*Rf),j);return{center:v,circleTangency:b,lineTangency:k,theta:m}},gA=e=>{var t=e.cx,r=e.cy,n=e.innerRadius,a=e.outerRadius,o=e.startAngle,c=e.endAngle,u=gF(o,c),f=o+u,h=Qt(t,r,a,o),m=Qt(t,r,a,f),g=Gt(bj||(bj=eo(["M ",",",` A `,",",`,0, `,",",`, `,",",` - `])),h.x,h.y,a,a,+(Math.abs(u)>180),+(o>f),m.x,m.y);if(n>0){var v=Qt(t,r,n,o),b=Qt(t,r,n,f);g+=Gt(bj||(bj=eo(["L ",",",` + `])),h.x,h.y,a,a,+(Math.abs(u)>180),+(o>f),m.x,m.y);if(n>0){var v=Qt(t,r,n,o),b=Qt(t,r,n,f);g+=Gt(wj||(wj=eo(["L ",",",` A `,",",`,0, `,",",`, - `,","," Z"])),b.x,b.y,n,n,+(Math.abs(u)>180),+(o<=f),v.x,v.y)}else g+=Gt(wj||(wj=eo(["L ",","," Z"])),t,r);return g},vF=e=>{var t=e.cx,r=e.cy,n=e.innerRadius,a=e.outerRadius,o=e.cornerRadius,c=e.forceCornerRadius,u=e.cornerIsExternal,f=e.startAngle,h=e.endAngle,m=Jr(h-f),g=Fd({cx:t,cy:r,radius:a,angle:f,sign:m,cornerRadius:o,cornerIsExternal:u}),v=g.circleTangency,b=g.lineTangency,j=g.theta,k=Fd({cx:t,cy:r,radius:a,angle:h,sign:-m,cornerRadius:o,cornerIsExternal:u}),S=k.circleTangency,N=k.lineTangency,E=k.theta,A=u?Math.abs(f-h):Math.abs(f-h)-j-E;if(A<0)return c?Gt(kj||(kj=eo(["M ",",",` + `,","," Z"])),b.x,b.y,n,n,+(Math.abs(u)>180),+(o<=f),v.x,v.y)}else g+=Gt(kj||(kj=eo(["L ",","," Z"])),t,r);return g},vF=e=>{var t=e.cx,r=e.cy,n=e.innerRadius,a=e.outerRadius,o=e.cornerRadius,c=e.forceCornerRadius,u=e.cornerIsExternal,f=e.startAngle,h=e.endAngle,m=Jr(h-f),g=Fd({cx:t,cy:r,radius:a,angle:f,sign:m,cornerRadius:o,cornerIsExternal:u}),v=g.circleTangency,b=g.lineTangency,j=g.theta,k=Fd({cx:t,cy:r,radius:a,angle:h,sign:-m,cornerRadius:o,cornerIsExternal:u}),S=k.circleTangency,N=k.lineTangency,E=k.theta,A=u?Math.abs(f-h):Math.abs(f-h)-j-E;if(A<0)return c?Gt(jj||(jj=eo(["M ",",",` a`,",",",0,0,1,",`,0 a`,",",",0,0,1,",`,0 - `])),b.x,b.y,o,o,o*2,o,o,-o*2):gA({cx:t,cy:r,innerRadius:n,outerRadius:a,startAngle:f,endAngle:h});var P=Gt(jj||(jj=eo(["M ",",",` + `])),b.x,b.y,o,o,o*2,o,o,-o*2):gA({cx:t,cy:r,innerRadius:n,outerRadius:a,startAngle:f,endAngle:h});var P=Gt(Sj||(Sj=eo(["M ",",",` A`,",",",0,0,",",",",",` A`,",",",0,",",",",",",",` A`,",",",0,0,",",",",",` - `])),b.x,b.y,o,o,+(m<0),v.x,v.y,a,a,+(A>180),+(m<0),S.x,S.y,o,o,+(m<0),N.x,N.y);if(n>0){var _=Fd({cx:t,cy:r,radius:n,angle:f,sign:m,isExternal:!0,cornerRadius:o,cornerIsExternal:u}),O=_.circleTangency,D=_.lineTangency,U=_.theta,B=Fd({cx:t,cy:r,radius:n,angle:h,sign:-m,isExternal:!0,cornerRadius:o,cornerIsExternal:u}),F=B.circleTangency,Y=B.lineTangency,H=B.theta,pe=u?Math.abs(f-h):Math.abs(f-h)-U-H;if(pe<0&&o===0)return"".concat(P,"L").concat(t,",").concat(r,"Z");P+=Gt(Sj||(Sj=eo(["L",",",` + `])),b.x,b.y,o,o,+(m<0),v.x,v.y,a,a,+(A>180),+(m<0),S.x,S.y,o,o,+(m<0),N.x,N.y);if(n>0){var _=Fd({cx:t,cy:r,radius:n,angle:f,sign:m,isExternal:!0,cornerRadius:o,cornerIsExternal:u}),O=_.circleTangency,D=_.lineTangency,U=_.theta,B=Fd({cx:t,cy:r,radius:n,angle:h,sign:-m,isExternal:!0,cornerRadius:o,cornerIsExternal:u}),F=B.circleTangency,Y=B.lineTangency,H=B.theta,pe=u?Math.abs(f-h):Math.abs(f-h)-U-H;if(pe<0&&o===0)return"".concat(P,"L").concat(t,",").concat(r,"Z");P+=Gt(Nj||(Nj=eo(["L",",",` A`,",",",0,0,",",",",",` A`,",",",0,",",",",",",",` - A`,",",",0,0,",",",",","Z"])),Y.x,Y.y,o,o,+(m<0),F.x,F.y,n,n,+(pe>180),+(m>0),O.x,O.y,o,o,+(m<0),D.x,D.y)}else P+=Gt(Nj||(Nj=eo(["L",",","Z"])),t,r);return P},yF={cx:0,cy:0,innerRadius:0,outerRadius:0,startAngle:0,endAngle:0,cornerRadius:0,forceCornerRadius:!1,cornerIsExternal:!1},xF=e=>{var t=on(e,yF),r=t.cx,n=t.cy,a=t.innerRadius,o=t.outerRadius,c=t.cornerRadius,u=t.forceCornerRadius,f=t.cornerIsExternal,h=t.startAngle,m=t.endAngle,g=t.className;if(o0&&Math.abs(h-m)<360?k=vF({cx:r,cy:n,innerRadius:a,outerRadius:o,cornerRadius:Math.min(j,b/2),forceCornerRadius:u,cornerIsExternal:f,startAngle:h,endAngle:m}):k=gA({cx:r,cy:n,innerRadius:a,outerRadius:o,startAngle:h,endAngle:m}),y.createElement("path",Yv({},rn(t),{className:v,d:k}))};function bF(e,t,r){if(e==="horizontal")return[{x:t.x,y:r.top},{x:t.x,y:r.top+r.height}];if(e==="vertical")return[{x:r.left,y:t.y},{x:r.left+r.width,y:t.y}];if(XE(t)){if(e==="centric"){var n=t.cx,a=t.cy,o=t.innerRadius,c=t.outerRadius,u=t.angle,f=Qt(n,a,o,u),h=Qt(n,a,c,u);return[{x:f.x,y:f.y},{x:h.x,y:h.y}]}return pA(t)}}function wF(e){return d5(e)?NaN:Number(e)}function Eg(e){return e?(e=wF(e),e===1/0||e===-1/0?(e<0?-1:1)*Number.MAX_VALUE:e===e?e:0):e===0?e:0}function vA(e,t,r){r&&typeof r!="number"&&Ov(e,t,r)&&(t=r=void 0),e=Eg(e),t===void 0?(t=e,e=0):t=Eg(t),r=r===void 0?ee.chartData,Yy=q([Nn],e=>{var t=e.chartData!=null?e.chartData.length-1:0;return{chartData:e.chartData,computedData:e.computedData,dataEndIndex:t,dataStartIndex:0}}),Bh=(e,t,r,n)=>n?Yy(e):Nn(e),kF=(e,t,r)=>r?Yy(e):Nn(e),jF=q([Bh],e=>{var t=e.chartData,r=e.dataStartIndex,n=e.dataEndIndex;return t!=null?t.slice(r,n+1):[]});q([Yy],e=>{var t=e.chartData,r=e.dataStartIndex,n=e.dataEndIndex;return t!=null?t.slice(r,n+1):[]});var SF=q([Nn],e=>{var t=e.chartData,r=e.dataStartIndex,n=e.dataEndIndex;return t!=null?t.slice(r,n+1):[]});function Xy(e,t){return CF(e)||AF(e,t)||EF(e,t)||NF()}function NF(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function EF(e,t){if(e){if(typeof e=="string")return Ej(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Ej(e,t):void 0}}function Ej(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);re.e^o.s<0?1:-1;for(n=o.d.length,a=e.d.length,t=0,r=ne.d[t]^o.s<0?1:-1;return n===a?0:n>a^o.s<0?1:-1};we.decimalPlaces=we.dp=function(){var e=this,t=e.d.length-1,r=(t-e.e)*lt;if(t=e.d[t],t)for(;t%10==0;t/=10)r--;return r<0?0:r};we.dividedBy=we.div=function(e){return yi(this,new this.constructor(e))};we.dividedToIntegerBy=we.idiv=function(e){var t=this,r=t.constructor;return tt(yi(t,new r(e),0,1),r.precision)};we.equals=we.eq=function(e){return!this.cmp(e)};we.exponent=function(){return St(this)};we.greaterThan=we.gt=function(e){return this.cmp(e)>0};we.greaterThanOrEqualTo=we.gte=function(e){return this.cmp(e)>=0};we.isInteger=we.isint=function(){return this.e>this.d.length-2};we.isNegative=we.isneg=function(){return this.s<0};we.isPositive=we.ispos=function(){return this.s>0};we.isZero=function(){return this.s===0};we.lessThan=we.lt=function(e){return this.cmp(e)<0};we.lessThanOrEqualTo=we.lte=function(e){return this.cmp(e)<1};we.logarithm=we.log=function(e){var t,r=this,n=r.constructor,a=n.precision,o=a+5;if(e===void 0)e=new n(10);else if(e=new n(e),e.s<1||e.eq(Fr))throw Error(an+"NaN");if(r.s<1)throw Error(an+(r.s?"NaN":"-Infinity"));return r.eq(Fr)?new n(0):(dt=!1,t=yi(Tu(r,o),Tu(e,o),o),dt=!0,tt(t,a))};we.minus=we.sub=function(e){var t=this;return e=new t.constructor(e),t.s==e.s?kA(t,e):bA(t,(e.s=-e.s,e))};we.modulo=we.mod=function(e){var t,r=this,n=r.constructor,a=n.precision;if(e=new n(e),!e.s)throw Error(an+"NaN");return r.s?(dt=!1,t=yi(r,e,0,1).times(e),dt=!0,r.minus(t)):tt(new n(r),a)};we.naturalExponential=we.exp=function(){return wA(this)};we.naturalLogarithm=we.ln=function(){return Tu(this)};we.negated=we.neg=function(){var e=new this.constructor(this);return e.s=-e.s||0,e};we.plus=we.add=function(e){var t=this;return e=new t.constructor(e),t.s==e.s?bA(t,e):kA(t,(e.s=-e.s,e))};we.precision=we.sd=function(e){var t,r,n,a=this;if(e!==void 0&&e!==!!e&&e!==1&&e!==0)throw Error(go+e);if(t=St(a)+1,n=a.d.length-1,r=n*lt+1,n=a.d[n],n){for(;n%10==0;n/=10)r--;for(n=a.d[0];n>=10;n/=10)r++}return e&&t>r?t:r};we.squareRoot=we.sqrt=function(){var e,t,r,n,a,o,c,u=this,f=u.constructor;if(u.s<1){if(!u.s)return new f(0);throw Error(an+"NaN")}for(e=St(u),dt=!1,a=Math.sqrt(+u),a==0||a==1/0?(t=Fn(u.d),(t.length+e)%2==0&&(t+="0"),a=Math.sqrt(t),e=al((e+1)/2)-(e<0||e%2),a==1/0?t="5e"+e:(t=a.toExponential(),t=t.slice(0,t.indexOf("e")+1)+e),n=new f(t)):n=new f(a.toString()),r=f.precision,a=c=r+3;;)if(o=n,n=o.plus(yi(u,o,c+2)).times(.5),Fn(o.d).slice(0,c)===(t=Fn(n.d)).slice(0,c)){if(t=t.slice(c-3,c+1),a==c&&t=="4999"){if(tt(o,r+1,0),o.times(o).eq(u)){n=o;break}}else if(t!="9999")break;c+=4}return dt=!0,tt(n,r)};we.times=we.mul=function(e){var t,r,n,a,o,c,u,f,h,m=this,g=m.constructor,v=m.d,b=(e=new g(e)).d;if(!m.s||!e.s)return new g(0);for(e.s*=m.s,r=m.e+e.e,f=v.length,h=b.length,f=0;){for(t=0,a=f+n;a>n;)u=o[a]+b[n]*v[a-n-1]+t,o[a--]=u%Rt|0,t=u/Rt|0;o[a]=(o[a]+t)%Rt|0}for(;!o[--c];)o.pop();return t?++r:o.shift(),e.d=o,e.e=r,dt?tt(e,g.precision):e};we.toDecimalPlaces=we.todp=function(e,t){var r=this,n=r.constructor;return r=new n(r),e===void 0?r:(qn(e,0,il),t===void 0?t=n.rounding:qn(t,0,8),tt(r,e+St(r)+1,t))};we.toExponential=function(e,t){var r,n=this,a=n.constructor;return e===void 0?r=So(n,!0):(qn(e,0,il),t===void 0?t=a.rounding:qn(t,0,8),n=tt(new a(n),e+1,t),r=So(n,!0,e+1)),r};we.toFixed=function(e,t){var r,n,a=this,o=a.constructor;return e===void 0?So(a):(qn(e,0,il),t===void 0?t=o.rounding:qn(t,0,8),n=tt(new o(a),e+St(a)+1,t),r=So(n.abs(),!1,e+St(n)+1),a.isneg()&&!a.isZero()?"-"+r:r)};we.toInteger=we.toint=function(){var e=this,t=e.constructor;return tt(new t(e),St(e)+1,t.rounding)};we.toNumber=function(){return+this};we.toPower=we.pow=function(e){var t,r,n,a,o,c,u=this,f=u.constructor,h=12,m=+(e=new f(e));if(!e.s)return new f(Fr);if(u=new f(u),!u.s){if(e.s<1)throw Error(an+"Infinity");return u}if(u.eq(Fr))return u;if(n=f.precision,e.eq(Fr))return tt(u,n);if(t=e.e,r=e.d.length-1,c=t>=r,o=u.s,c){if((r=m<0?-m:m)<=xA){for(a=new f(Fr),t=Math.ceil(n/lt+4),dt=!1;r%2&&(a=a.times(u),Pj(a.d,t)),r=al(r/2),r!==0;)u=u.times(u),Pj(u.d,t);return dt=!0,e.s<0?new f(Fr).div(a):tt(a,n)}}else if(o<0)throw Error(an+"NaN");return o=o<0&&e.d[Math.max(t,r)]&1?-1:1,u.s=1,dt=!1,a=e.times(Tu(u,n+h)),dt=!0,a=wA(a),a.s=o,a};we.toPrecision=function(e,t){var r,n,a=this,o=a.constructor;return e===void 0?(r=St(a),n=So(a,r<=o.toExpNeg||r>=o.toExpPos)):(qn(e,1,il),t===void 0?t=o.rounding:qn(t,0,8),a=tt(new o(a),e,t),r=St(a),n=So(a,e<=r||r<=o.toExpNeg,e)),n};we.toSignificantDigits=we.tosd=function(e,t){var r=this,n=r.constructor;return e===void 0?(e=n.precision,t=n.rounding):(qn(e,1,il),t===void 0?t=n.rounding:qn(t,0,8)),tt(new n(r),e,t)};we.toString=we.valueOf=we.val=we.toJSON=we[Symbol.for("nodejs.util.inspect.custom")]=function(){var e=this,t=St(e),r=e.constructor;return So(e,t<=r.toExpNeg||t>=r.toExpPos)};function bA(e,t){var r,n,a,o,c,u,f,h,m=e.constructor,g=m.precision;if(!e.s||!t.s)return t.s||(t=new m(e)),dt?tt(t,g):t;if(f=e.d,h=t.d,c=e.e,a=t.e,f=f.slice(),o=c-a,o){for(o<0?(n=f,o=-o,u=h.length):(n=h,a=c,u=f.length),c=Math.ceil(g/lt),u=c>u?c+1:u+1,o>u&&(o=u,n.length=1),n.reverse();o--;)n.push(0);n.reverse()}for(u=f.length,o=h.length,u-o<0&&(o=u,n=h,h=f,f=n),r=0;o;)r=(f[--o]=f[o]+h[o]+r)/Rt|0,f[o]%=Rt;for(r&&(f.unshift(r),++a),u=f.length;f[--u]==0;)f.pop();return t.d=f,t.e=a,dt?tt(t,g):t}function qn(e,t,r){if(e!==~~e||er)throw Error(go+e)}function Fn(e){var t,r,n,a=e.length-1,o="",c=e[0];if(a>0){for(o+=c,t=1;tc?1:-1;else for(u=f=0;ua[u]?1:-1;break}return f}function r(n,a,o){for(var c=0;o--;)n[o]-=c,c=n[o]1;)n.shift()}return function(n,a,o,c){var u,f,h,m,g,v,b,j,k,S,N,E,A,P,_,O,D,U,B=n.constructor,F=n.s==a.s?1:-1,Y=n.d,H=a.d;if(!n.s)return new B(n);if(!a.s)throw Error(an+"Division by zero");for(f=n.e-a.e,D=H.length,_=Y.length,b=new B(F),j=b.d=[],h=0;H[h]==(Y[h]||0);)++h;if(H[h]>(Y[h]||0)&&--f,o==null?E=o=B.precision:c?E=o+(St(n)-St(a))+1:E=o,E<0)return new B(0);if(E=E/lt+2|0,h=0,D==1)for(m=0,H=H[0],E++;(h<_||m)&&E--;h++)A=m*Rt+(Y[h]||0),j[h]=A/H|0,m=A%H|0;else{for(m=Rt/(H[0]+1)|0,m>1&&(H=e(H,m),Y=e(Y,m),D=H.length,_=Y.length),P=D,k=Y.slice(0,D),S=k.length;S=Rt/2&&++O;do m=0,u=t(H,k,D,S),u<0?(N=k[0],D!=S&&(N=N*Rt+(k[1]||0)),m=N/O|0,m>1?(m>=Rt&&(m=Rt-1),g=e(H,m),v=g.length,S=k.length,u=t(g,k,v,S),u==1&&(m--,r(g,D16)throw Error(Zy+St(e));if(!e.s)return new m(Fr);for(dt=!1,u=g,c=new m(.03125);e.abs().gte(.1);)e=e.times(c),h+=5;for(n=Math.log(Ya(2,h))/Math.LN10*2+5|0,u+=n,r=a=o=new m(Fr),m.precision=u;;){if(a=tt(a.times(e),u),r=r.times(++f),c=o.plus(yi(a,r,u)),Fn(c.d).slice(0,u)===Fn(o.d).slice(0,u)){for(;h--;)o=tt(o.times(o),u);return m.precision=g,t==null?(dt=!0,tt(o,g)):o}o=c}}function St(e){for(var t=e.e*lt,r=e.d[0];r>=10;r/=10)t++;return t}function Ag(e,t,r){if(t>e.LN10.sd())throw dt=!0,r&&(e.precision=r),Error(an+"LN10 precision limit exceeded");return tt(new e(e.LN10),t)}function oa(e){for(var t="";e--;)t+="0";return t}function Tu(e,t){var r,n,a,o,c,u,f,h,m,g=1,v=10,b=e,j=b.d,k=b.constructor,S=k.precision;if(b.s<1)throw Error(an+(b.s?"NaN":"-Infinity"));if(b.eq(Fr))return new k(0);if(t==null?(dt=!1,h=S):h=t,b.eq(10))return t==null&&(dt=!0),Ag(k,h);if(h+=v,k.precision=h,r=Fn(j),n=r.charAt(0),o=St(b),Math.abs(o)<15e14){for(;n<7&&n!=1||n==1&&r.charAt(1)>3;)b=b.times(e),r=Fn(b.d),n=r.charAt(0),g++;o=St(b),n>1?(b=new k("0."+r),o++):b=new k(n+"."+r.slice(1))}else return f=Ag(k,h+2,S).times(o+""),b=Tu(new k(n+"."+r.slice(1)),h-v).plus(f),k.precision=S,t==null?(dt=!0,tt(b,S)):b;for(u=c=b=yi(b.minus(Fr),b.plus(Fr),h),m=tt(b.times(b),h),a=3;;){if(c=tt(c.times(m),h),f=u.plus(yi(c,new k(a),h)),Fn(f.d).slice(0,h)===Fn(u.d).slice(0,h))return u=u.times(2),o!==0&&(u=u.plus(Ag(k,h+2,S).times(o+""))),u=yi(u,new k(g),h),k.precision=S,t==null?(dt=!0,tt(u,S)):u;u=f,a+=2}}function Cj(e,t){var r,n,a;for((r=t.indexOf("."))>-1&&(t=t.replace(".","")),(n=t.search(/e/i))>0?(r<0&&(r=n),r+=+t.slice(n+1),t=t.substring(0,n)):r<0&&(r=t.length),n=0;t.charCodeAt(n)===48;)++n;for(a=t.length;t.charCodeAt(a-1)===48;)--a;if(t=t.slice(n,a),t){if(a-=n,r=r-n-1,e.e=al(r/lt),e.d=[],n=(r+1)%lt,r<0&&(n+=lt),nLf||e.e<-Lf))throw Error(Zy+r)}else e.s=0,e.e=0,e.d=[0];return e}function tt(e,t,r){var n,a,o,c,u,f,h,m,g=e.d;for(c=1,o=g[0];o>=10;o/=10)c++;if(n=t-c,n<0)n+=lt,a=t,h=g[m=0];else{if(m=Math.ceil((n+1)/lt),o=g.length,m>=o)return e;for(h=o=g[m],c=1;o>=10;o/=10)c++;n%=lt,a=n-lt+c}if(r!==void 0&&(o=Ya(10,c-a-1),u=h/o%10|0,f=t<0||g[m+1]!==void 0||h%o,f=r<4?(u||f)&&(r==0||r==(e.s<0?3:2)):u>5||u==5&&(r==4||f||r==6&&(n>0?a>0?h/Ya(10,c-a):0:g[m-1])%10&1||r==(e.s<0?8:7))),t<1||!g[0])return f?(o=St(e),g.length=1,t=t-o-1,g[0]=Ya(10,(lt-t%lt)%lt),e.e=al(-t/lt)||0):(g.length=1,g[0]=e.e=e.s=0),e;if(n==0?(g.length=m,o=1,m--):(g.length=m+1,o=Ya(10,lt-n),g[m]=a>0?(h/Ya(10,c-a)%Ya(10,a)|0)*o:0),f)for(;;)if(m==0){(g[0]+=o)==Rt&&(g[0]=1,++e.e);break}else{if(g[m]+=o,g[m]!=Rt)break;g[m--]=0,o=1}for(n=g.length;g[--n]===0;)g.pop();if(dt&&(e.e>Lf||e.e<-Lf))throw Error(Zy+St(e));return e}function kA(e,t){var r,n,a,o,c,u,f,h,m,g,v=e.constructor,b=v.precision;if(!e.s||!t.s)return t.s?t.s=-t.s:t=new v(e),dt?tt(t,b):t;if(f=e.d,g=t.d,n=t.e,h=e.e,f=f.slice(),c=h-n,c){for(m=c<0,m?(r=f,c=-c,u=g.length):(r=g,n=h,u=f.length),a=Math.max(Math.ceil(b/lt),u)+2,c>a&&(c=a,r.length=1),r.reverse(),a=c;a--;)r.push(0);r.reverse()}else{for(a=f.length,u=g.length,m=a0;--a)f[u++]=0;for(a=g.length;a>c;){if(f[--a]0?o=o.charAt(0)+"."+o.slice(1)+oa(n):c>1&&(o=o.charAt(0)+"."+o.slice(1)),o=o+(a<0?"e":"e+")+a):a<0?(o="0."+oa(-a-1)+o,r&&(n=r-c)>0&&(o+=oa(n))):a>=c?(o+=oa(a+1-c),r&&(n=r-a-1)>0&&(o=o+"."+oa(n))):((n=a+1)0&&(a+1===c&&(o+="."),o+=oa(n))),e.s<0?"-"+o:o}function Pj(e,t){if(e.length>t)return e.length=t,!0}function jA(e){var t,r,n;function a(o){var c=this;if(!(c instanceof a))return new a(o);if(c.constructor=a,o instanceof a){c.s=o.s,c.e=o.e,c.d=(o=o.d)?o.slice():o;return}if(typeof o=="number"){if(o*0!==0)throw Error(go+o);if(o>0)c.s=1;else if(o<0)o=-o,c.s=-1;else{c.s=0,c.e=0,c.d=[0];return}if(o===~~o&&o<1e7){c.e=0,c.d=[o];return}return Cj(c,o.toString())}else if(typeof o!="string")throw Error(go+o);if(o.charCodeAt(0)===45?(o=o.slice(1),c.s=-1):c.s=1,_F.test(o))Cj(c,o);else throw Error(go+o)}if(a.prototype=we,a.ROUND_UP=0,a.ROUND_DOWN=1,a.ROUND_CEIL=2,a.ROUND_FLOOR=3,a.ROUND_HALF_UP=4,a.ROUND_HALF_DOWN=5,a.ROUND_HALF_EVEN=6,a.ROUND_HALF_CEIL=7,a.ROUND_HALF_FLOOR=8,a.clone=jA,a.config=a.set=MF,e===void 0&&(e={}),e)for(n=["precision","rounding","toExpNeg","toExpPos","LN10"],t=0;t=a[t+1]&&n<=a[t+2])this[r]=n;else throw Error(go+r+": "+n);if((n=e[r="LN10"])!==void 0)if(n==Math.LN10)this[r]=new this(n);else throw Error(go+r+": "+n);return this}var Jy=jA(OF);Fr=new Jy(1);const Ge=Jy;function SA(e){var t;return e===0?t=1:t=Math.floor(new Ge(e).abs().log(10).toNumber())+1,t}function NA(e,t,r){for(var n=new Ge(e),a=0,o=[];n.lt(t)&&a<1e5;)o.push(n.toNumber()),n=n.add(r),a++;return o}function Du(e,t){return RF(e)||DF(e,t)||TF(e,t)||IF()}function IF(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function TF(e,t){if(e){if(typeof e=="string")return Oj(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Oj(e,t):void 0}}function Oj(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{var t=Du(e,2),r=t[0],n=t[1],a=r,o=n;return r>n&&(a=n,o=r),[a,o]},e0=(e,t,r)=>{if(e.lte(0))return new Ge(0);var n=SA(e.toNumber()),a=new Ge(10).pow(n),o=e.div(a),c=n!==1?.05:.1,u=new Ge(Math.ceil(o.div(c).toNumber())).add(r).mul(c),f=u.mul(a);return t?new Ge(f.toNumber()):new Ge(Math.ceil(f.toNumber()))},AA=(e,t,r)=>{var n;if(e.lte(0))return new Ge(0);var a=[1,2,2.5,5],o=e.toNumber(),c=Math.floor(new Ge(o).abs().log(10).toNumber()),u=new Ge(10).pow(c),f=e.div(u).toNumber(),h=a.findIndex(b=>b>=f-1e-10);if(h===-1&&(u=u.mul(10),h=0),h+=r,h>=a.length){var m=Math.floor(h/a.length);h%=a.length,u=u.mul(new Ge(10).pow(m))}var g=(n=a[h])!==null&&n!==void 0?n:1,v=new Ge(g).mul(u);return t?v:new Ge(Math.ceil(v.toNumber()))},LF=(e,t,r)=>{var n=new Ge(1),a=new Ge(e);if(!a.isint()&&r){var o=Math.abs(e);o<1?(n=new Ge(10).pow(SA(e)-1),a=new Ge(Math.floor(a.div(n).toNumber())).mul(n)):o>1&&(a=new Ge(Math.floor(e)))}else e===0?a=new Ge(Math.floor((t-1)/2)):r||(a=new Ge(Math.floor(e)));for(var c=Math.floor((t-1)/2),u=[],f=0;f4&&arguments[4]!==void 0?arguments[4]:0,c=arguments.length>5&&arguments[5]!==void 0?arguments[5]:e0;if(!Number.isFinite((r-t)/(n-1)))return{step:new Ge(0),tickMin:new Ge(0),tickMax:new Ge(0)};var u=c(new Ge(r).sub(t).div(n-1),a,o),f;t<=0&&r>=0?f=new Ge(0):(f=new Ge(t).add(r).div(2),f=f.sub(new Ge(f).mod(u)));var h=Math.ceil(f.sub(t).div(u).toNumber()),m=Math.ceil(new Ge(r).sub(f).div(u).toNumber()),g=h+m+1;return g>n?CA(t,r,n,a,o+1,c):(g0?m+(n-g):m,h=r>0?h:h+(n-g)),{step:u,tickMin:f.sub(new Ge(h).mul(u)),tickMax:f.add(new Ge(m).mul(u))})},_j=function(t){var r=Du(t,2),n=r[0],a=r[1],o=arguments.length>1&&arguments[1]!==void 0?arguments[1]:6,c=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,u=arguments.length>3&&arguments[3]!==void 0?arguments[3]:"auto",f=Math.max(o,2),h=EA([n,a]),m=Du(h,2),g=m[0],v=m[1];if(g===-1/0||v===1/0){var b=v===1/0?[g,...Array(o-1).fill(1/0)]:[...Array(o-1).fill(-1/0),v];return n>a?b.reverse():b}if(g===v)return LF(g,o,c);var j=u==="snap125"?AA:e0,k=CA(g,v,f,c,0,j),S=k.step,N=k.tickMin,E=k.tickMax,A=NA(N,E.add(new Ge(.1).mul(S)),S);return n>a?A.reverse():A},Mj=function(t,r){var n=Du(t,2),a=n[0],o=n[1],c=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,u=arguments.length>3&&arguments[3]!==void 0?arguments[3]:"auto",f=EA([a,o]),h=Du(f,2),m=h[0],g=h[1];if(m===-1/0||g===1/0)return[a,o];if(m===g)return[m];var v=u==="snap125"?AA:e0,b=Math.max(r,2),j=v(new Ge(g).sub(m).div(b-1),c,0),k=[...NA(new Ge(m),new Ge(g),j),g];return c===!1&&(k=k.map(S=>Math.round(S))),a>o?k.reverse():k},$F=e=>e.rootProps.barCategoryGap,Uh=e=>e.rootProps.stackOffset,PA=e=>e.rootProps.reverseStackOrder,t0=e=>e.options.chartName,r0=e=>e.rootProps.syncId,OA=e=>e.rootProps.syncMethod,n0=e=>e.options.eventEmitter,zF=e=>e.rootProps.baseValue,pr={grid:-100,barBackground:-50,area:100,cursorRectangle:200,bar:300,line:400,axis:500,scatter:600,activeBar:1e3,cursorLine:1100,activeDot:1200,label:2e3},Ua={allowDecimals:!1,allowDataOverflow:!1,angleAxisId:0,reversed:!1,scale:"auto",tick:!0,type:"auto"},In={allowDataOverflow:!1,allowDecimals:!1,allowDuplicatedCategory:!0,includeHidden:!1,radiusAxisId:0,reversed:!1,scale:"auto",tick:!0,tickCount:5,type:"auto"},Hh=(e,t)=>{if(!(!e||!t))return e!=null&&e.reversed?[t[1],t[0]]:t};function Wh(e,t,r){if(r!=="auto")return r;if(e!=null)return Xn(e,t)?"category":"number"}function Ij(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function $f(e){for(var t=1;t{if(t!=null)return e.polarAxis.angleAxis[t]},i0=q([HF,eA],(e,t)=>{var r;if(e!=null)return e;var n=(r=Wh(t,"angleAxis",Tj.type))!==null&&r!==void 0?r:"category";return $f($f({},Tj),{},{type:n})}),WF=(e,t)=>e.polarAxis.radiusAxis[t],a0=q([WF,eA],(e,t)=>{var r;if(e!=null)return e;var n=(r=Wh(t,"radiusAxis",Dj.type))!==null&&r!==void 0?r:"category";return $f($f({},Dj),{},{type:n})}),Kh=e=>e.polarOptions,o0=q([Ei,Ai,Zt],cF),_A=q([Kh,o0],(e,t)=>{if(e!=null)return Sa(e.innerRadius,t,0)}),MA=q([Kh,o0],(e,t)=>{if(e!=null)return Sa(e.outerRadius,t,t*.8)}),KF=e=>{if(e==null)return[0,0];var t=e.startAngle,r=e.endAngle;return[t,r]},IA=q([Kh],KF);q([i0,IA],Hh);var TA=q([o0,_A,MA],(e,t,r)=>{if(!(e==null||t==null||r==null))return[t,r]});q([a0,TA],Hh);var DA=q([ft,Kh,_A,MA,Ei,Ai],(e,t,r,n,a,o)=>{if(!(e!=="centric"&&e!=="radial"||t==null||r==null||n==null)){var c=t.cx,u=t.cy,f=t.startAngle,h=t.endAngle;return{cx:Sa(c,a,a/2),cy:Sa(u,o,o/2),innerRadius:r,outerRadius:n,startAngle:f,endAngle:h,clockWise:!1}}}),zt=(e,t)=>t,Gh=(e,t,r)=>r;function s0(e){return e==null?void 0:e.id}function RA(e,t,r){var n=t.chartData,a=n===void 0?[]:n,o=r.allowDuplicatedCategory,c=r.dataKey,u=new Map;return e.forEach(f=>{var h,m=(h=f.data)!==null&&h!==void 0?h:a;if(!(m==null||m.length===0)){var g=s0(f);m.forEach((v,b)=>{var j=c==null||o?b:String(Lt(v,c,null)),k=Lt(v,f.dataKey,0),S;u.has(j)?S=u.get(j):S={},Object.assign(S,{[g]:k}),u.set(j,S)})}}),Array.from(u.values())}function l0(e){return"stackId"in e&&e.stackId!=null&&e.dataKey!=null}var Vh=(e,t)=>e===t?!0:e==null||t==null?!1:e[0]===t[0]&&e[1]===t[1];function qh(e,t){return Array.isArray(e)&&Array.isArray(t)&&e.length===0&&t.length===0?!0:e===t}function GF(e,t){if(e.length===t.length){for(var r=0;r{var t=ft(e);return t==="horizontal"?"xAxis":t==="vertical"?"yAxis":t==="centric"?"angleAxis":"radiusAxis"},ol=e=>e.tooltip.settings.axisId;function u0(e){if(e!=null){var t=e.ticks,r=e.bandwidth,n=e.range(),a=[Math.min(...n),Math.max(...n)];return{domain:()=>e.domain(),range:(function(o){function c(){return o.apply(this,arguments)}return c.toString=function(){return o.toString()},c})(()=>a),rangeMin:()=>a[0],rangeMax:()=>a[1],isInRange(o){var c=a[0],u=a[1];return c<=u?o>=c&&o<=u:o>=u&&o<=c},bandwidth:r?()=>r.call(e):void 0,ticks:t?o=>t.call(e,o):void 0,map:(o,c)=>{var u=e(o);if(u!=null){if(e.bandwidth&&c!==null&&c!==void 0&&c.position){var f=e.bandwidth();switch(c.position){case"middle":u+=f/2;break;case"end":u+=f;break}}return u}}}}}var VF=(e,t)=>{if(t!=null)switch(e){case"linear":{if(!Bn(t)){for(var r,n,a=0;an)&&(n=o))}return r!==void 0&&n!==void 0?[r,n]:void 0}return t}default:return t}};function wa(e,t){return e==null||t==null?NaN:et?1:e>=t?0:NaN}function qF(e,t){return e==null||t==null?NaN:te?1:t>=e?0:NaN}function c0(e){let t,r,n;e.length!==2?(t=wa,r=(u,f)=>wa(e(u),f),n=(u,f)=>e(u)-f):(t=e===wa||e===qF?e:QF,r=e,n=e);function a(u,f,h=0,m=u.length){if(h>>1;r(u[g],f)<0?h=g+1:m=g}while(h>>1;r(u[g],f)<=0?h=g+1:m=g}while(hh&&n(u[g-1],f)>-n(u[g],f)?g-1:g}return{left:a,center:c,right:o}}function QF(){return 0}function LA(e){return e===null?NaN:+e}function*YF(e,t){for(let r of e)r!=null&&(r=+r)>=r&&(yield r)}const XF=c0(wa),ic=XF.right;c0(LA).center;class Rj extends Map{constructor(t,r=e9){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:r}}),t!=null)for(const[n,a]of t)this.set(n,a)}get(t){return super.get(Lj(this,t))}has(t){return super.has(Lj(this,t))}set(t,r){return super.set(ZF(this,t),r)}delete(t){return super.delete(JF(this,t))}}function Lj({_intern:e,_key:t},r){const n=t(r);return e.has(n)?e.get(n):r}function ZF({_intern:e,_key:t},r){const n=t(r);return e.has(n)?e.get(n):(e.set(n,r),r)}function JF({_intern:e,_key:t},r){const n=t(r);return e.has(n)&&(r=e.get(n),e.delete(n)),r}function e9(e){return e!==null&&typeof e=="object"?e.valueOf():e}function t9(e=wa){if(e===wa)return $A;if(typeof e!="function")throw new TypeError("compare is not a function");return(t,r)=>{const n=e(t,r);return n||n===0?n:(e(r,r)===0)-(e(t,t)===0)}}function $A(e,t){return(e==null||!(e>=e))-(t==null||!(t>=t))||(et?1:0)}const r9=Math.sqrt(50),n9=Math.sqrt(10),i9=Math.sqrt(2);function zf(e,t,r){const n=(t-e)/Math.max(0,r),a=Math.floor(Math.log10(n)),o=n/Math.pow(10,a),c=o>=r9?10:o>=n9?5:o>=i9?2:1;let u,f,h;return a<0?(h=Math.pow(10,-a)/c,u=Math.round(e*h),f=Math.round(t*h),u/ht&&--f,h=-h):(h=Math.pow(10,a)*c,u=Math.round(e/h),f=Math.round(t/h),u*ht&&--f),f0))return[];if(e===t)return[e];const n=t=a))return[];const u=o-a+1,f=new Array(u);if(n)if(c<0)for(let h=0;h=n)&&(r=n);return r}function zj(e,t){let r;for(const n of e)n!=null&&(r>n||r===void 0&&n>=n)&&(r=n);return r}function zA(e,t,r=0,n=1/0,a){if(t=Math.floor(t),r=Math.floor(Math.max(0,r)),n=Math.floor(Math.min(e.length-1,n)),!(r<=t&&t<=n))return e;for(a=a===void 0?$A:t9(a);n>r;){if(n-r>600){const f=n-r+1,h=t-r+1,m=Math.log(f),g=.5*Math.exp(2*m/3),v=.5*Math.sqrt(m*g*(f-g)/f)*(h-f/2<0?-1:1),b=Math.max(r,Math.floor(t-h*g/f+v)),j=Math.min(n,Math.floor(t+(f-h)*g/f+v));zA(e,t,b,j,a)}const o=e[t];let c=r,u=n;for(au(e,r,t),a(e[n],o)>0&&au(e,r,n);c0;)--u}a(e[r],o)===0?au(e,r,u):(++u,au(e,u,n)),u<=t&&(r=u+1),t<=u&&(n=u-1)}return e}function au(e,t,r){const n=e[t];e[t]=e[r],e[r]=n}function a9(e,t,r){if(e=Float64Array.from(YF(e)),!(!(n=e.length)||isNaN(t=+t))){if(t<=0||n<2)return zj(e);if(t>=1)return $j(e);var n,a=(n-1)*t,o=Math.floor(a),c=$j(zA(e,o).subarray(0,o+1)),u=zj(e.subarray(o+1));return c+(u-c)*(a-o)}}function o9(e,t,r=LA){if(!(!(n=e.length)||isNaN(t=+t))){if(t<=0||n<2)return+r(e[0],0,e);if(t>=1)return+r(e[n-1],n-1,e);var n,a=(n-1)*t,o=Math.floor(a),c=+r(e[o],o,e),u=+r(e[o+1],o+1,e);return c+(u-c)*(a-o)}}function s9(e,t,r){e=+e,t=+t,r=(a=arguments.length)<2?(t=e,e=0,1):a<3?1:+r;for(var n=-1,a=Math.max(0,Math.ceil((t-e)/r))|0,o=new Array(a);++n>8&15|t>>4&240,t>>4&15|t&240,(t&15)<<4|t&15,1):r===8?Bd(t>>24&255,t>>16&255,t>>8&255,(t&255)/255):r===4?Bd(t>>12&15|t>>8&240,t>>8&15|t>>4&240,t>>4&15|t&240,((t&15)<<4|t&15)/255):null):(t=c9.exec(e))?new Cr(t[1],t[2],t[3],1):(t=d9.exec(e))?new Cr(t[1]*255/100,t[2]*255/100,t[3]*255/100,1):(t=f9.exec(e))?Bd(t[1],t[2],t[3],t[4]):(t=h9.exec(e))?Bd(t[1]*255/100,t[2]*255/100,t[3]*255/100,t[4]):(t=m9.exec(e))?Gj(t[1],t[2]/100,t[3]/100,1):(t=p9.exec(e))?Gj(t[1],t[2]/100,t[3]/100,t[4]):Fj.hasOwnProperty(e)?Hj(Fj[e]):e==="transparent"?new Cr(NaN,NaN,NaN,0):null}function Hj(e){return new Cr(e>>16&255,e>>8&255,e&255,1)}function Bd(e,t,r,n){return n<=0&&(e=t=r=NaN),new Cr(e,t,r,n)}function y9(e){return e instanceof ac||(e=$u(e)),e?(e=e.rgb(),new Cr(e.r,e.g,e.b,e.opacity)):new Cr}function ty(e,t,r,n){return arguments.length===1?y9(e):new Cr(e,t,r,n??1)}function Cr(e,t,r,n){this.r=+e,this.g=+t,this.b=+r,this.opacity=+n}h0(Cr,ty,BA(ac,{brighter(e){return e=e==null?Ff:Math.pow(Ff,e),new Cr(this.r*e,this.g*e,this.b*e,this.opacity)},darker(e){return e=e==null?Ru:Math.pow(Ru,e),new Cr(this.r*e,this.g*e,this.b*e,this.opacity)},rgb(){return this},clamp(){return new Cr(vo(this.r),vo(this.g),vo(this.b),Bf(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:Wj,formatHex:Wj,formatHex8:x9,formatRgb:Kj,toString:Kj}));function Wj(){return`#${to(this.r)}${to(this.g)}${to(this.b)}`}function x9(){return`#${to(this.r)}${to(this.g)}${to(this.b)}${to((isNaN(this.opacity)?1:this.opacity)*255)}`}function Kj(){const e=Bf(this.opacity);return`${e===1?"rgb(":"rgba("}${vo(this.r)}, ${vo(this.g)}, ${vo(this.b)}${e===1?")":`, ${e})`}`}function Bf(e){return isNaN(e)?1:Math.max(0,Math.min(1,e))}function vo(e){return Math.max(0,Math.min(255,Math.round(e)||0))}function to(e){return e=vo(e),(e<16?"0":"")+e.toString(16)}function Gj(e,t,r,n){return n<=0?e=t=r=NaN:r<=0||r>=1?e=t=NaN:t<=0&&(e=NaN),new bn(e,t,r,n)}function UA(e){if(e instanceof bn)return new bn(e.h,e.s,e.l,e.opacity);if(e instanceof ac||(e=$u(e)),!e)return new bn;if(e instanceof bn)return e;e=e.rgb();var t=e.r/255,r=e.g/255,n=e.b/255,a=Math.min(t,r,n),o=Math.max(t,r,n),c=NaN,u=o-a,f=(o+a)/2;return u?(t===o?c=(r-n)/u+(r0&&f<1?0:c,new bn(c,u,f,e.opacity)}function b9(e,t,r,n){return arguments.length===1?UA(e):new bn(e,t,r,n??1)}function bn(e,t,r,n){this.h=+e,this.s=+t,this.l=+r,this.opacity=+n}h0(bn,b9,BA(ac,{brighter(e){return e=e==null?Ff:Math.pow(Ff,e),new bn(this.h,this.s,this.l*e,this.opacity)},darker(e){return e=e==null?Ru:Math.pow(Ru,e),new bn(this.h,this.s,this.l*e,this.opacity)},rgb(){var e=this.h%360+(this.h<0)*360,t=isNaN(e)||isNaN(this.s)?0:this.s,r=this.l,n=r+(r<.5?r:1-r)*t,a=2*r-n;return new Cr(Cg(e>=240?e-240:e+120,a,n),Cg(e,a,n),Cg(e<120?e+240:e-120,a,n),this.opacity)},clamp(){return new bn(Vj(this.h),Ud(this.s),Ud(this.l),Bf(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const e=Bf(this.opacity);return`${e===1?"hsl(":"hsla("}${Vj(this.h)}, ${Ud(this.s)*100}%, ${Ud(this.l)*100}%${e===1?")":`, ${e})`}`}}));function Vj(e){return e=(e||0)%360,e<0?e+360:e}function Ud(e){return Math.max(0,Math.min(1,e||0))}function Cg(e,t,r){return(e<60?t+(r-t)*e/60:e<180?r:e<240?t+(r-t)*(240-e)/60:t)*255}const m0=e=>()=>e;function w9(e,t){return function(r){return e+r*t}}function k9(e,t,r){return e=Math.pow(e,r),t=Math.pow(t,r)-e,r=1/r,function(n){return Math.pow(e+n*t,r)}}function j9(e){return(e=+e)==1?HA:function(t,r){return r-t?k9(t,r,e):m0(isNaN(t)?r:t)}}function HA(e,t){var r=t-e;return r?w9(e,r):m0(isNaN(e)?t:e)}const qj=(function e(t){var r=j9(t);function n(a,o){var c=r((a=ty(a)).r,(o=ty(o)).r),u=r(a.g,o.g),f=r(a.b,o.b),h=HA(a.opacity,o.opacity);return function(m){return a.r=c(m),a.g=u(m),a.b=f(m),a.opacity=h(m),a+""}}return n.gamma=e,n})(1);function S9(e,t){t||(t=[]);var r=e?Math.min(t.length,e.length):0,n=t.slice(),a;return function(o){for(a=0;ar&&(o=t.slice(r,o),u[c]?u[c]+=o:u[++c]=o),(n=n[0])===(a=a[0])?u[c]?u[c]+=a:u[++c]=a:(u[++c]=null,f.push({i:c,x:Uf(n,a)})),r=Pg.lastIndex;return rt&&(r=e,e=t,t=r),function(n){return Math.max(e,Math.min(t,n))}}function D9(e,t,r){var n=e[0],a=e[1],o=t[0],c=t[1];return a2?R9:D9,f=h=null,g}function g(v){return v==null||isNaN(v=+v)?o:(f||(f=u(e.map(n),t,r)))(n(c(v)))}return g.invert=function(v){return c(a((h||(h=u(t,e.map(n),Uf)))(v)))},g.domain=function(v){return arguments.length?(e=Array.from(v,Hf),m()):e.slice()},g.range=function(v){return arguments.length?(t=Array.from(v),m()):t.slice()},g.rangeRound=function(v){return t=Array.from(v),r=p0,m()},g.clamp=function(v){return arguments.length?(c=v?!0:gr,m()):c!==gr},g.interpolate=function(v){return arguments.length?(r=v,m()):r},g.unknown=function(v){return arguments.length?(o=v,g):o},function(v,b){return n=v,a=b,m()}}function g0(){return Qh()(gr,gr)}function L9(e){return Math.abs(e=Math.round(e))>=1e21?e.toLocaleString("en").replace(/,/g,""):e.toString(10)}function Wf(e,t){if(!isFinite(e)||e===0)return null;var r=(e=t?e.toExponential(t-1):e.toExponential()).indexOf("e"),n=e.slice(0,r);return[n.length>1?n[0]+n.slice(2):n,+e.slice(r+1)]}function qs(e){return e=Wf(Math.abs(e)),e?e[1]:NaN}function $9(e,t){return function(r,n){for(var a=r.length,o=[],c=0,u=e[0],f=0;a>0&&u>0&&(f+u+1>n&&(u=Math.max(1,n-f)),o.push(r.substring(a-=u,a+u)),!((f+=u+1)>n));)u=e[c=(c+1)%e.length];return o.reverse().join(t)}}function z9(e){return function(t){return t.replace(/[0-9]/g,function(r){return e[+r]})}}var F9=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function zu(e){if(!(t=F9.exec(e)))throw new Error("invalid format: "+e);var t;return new v0({fill:t[1],align:t[2],sign:t[3],symbol:t[4],zero:t[5],width:t[6],comma:t[7],precision:t[8]&&t[8].slice(1),trim:t[9],type:t[10]})}zu.prototype=v0.prototype;function v0(e){this.fill=e.fill===void 0?" ":e.fill+"",this.align=e.align===void 0?">":e.align+"",this.sign=e.sign===void 0?"-":e.sign+"",this.symbol=e.symbol===void 0?"":e.symbol+"",this.zero=!!e.zero,this.width=e.width===void 0?void 0:+e.width,this.comma=!!e.comma,this.precision=e.precision===void 0?void 0:+e.precision,this.trim=!!e.trim,this.type=e.type===void 0?"":e.type+""}v0.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(this.width===void 0?"":Math.max(1,this.width|0))+(this.comma?",":"")+(this.precision===void 0?"":"."+Math.max(0,this.precision|0))+(this.trim?"~":"")+this.type};function B9(e){e:for(var t=e.length,r=1,n=-1,a;r0&&(n=0);break}return n>0?e.slice(0,n)+e.slice(a+1):e}var Kf;function U9(e,t){var r=Wf(e,t);if(!r)return Kf=void 0,e.toPrecision(t);var n=r[0],a=r[1],o=a-(Kf=Math.max(-8,Math.min(8,Math.floor(a/3)))*3)+1,c=n.length;return o===c?n:o>c?n+new Array(o-c+1).join("0"):o>0?n.slice(0,o)+"."+n.slice(o):"0."+new Array(1-o).join("0")+Wf(e,Math.max(0,t+o-1))[0]}function Yj(e,t){var r=Wf(e,t);if(!r)return e+"";var n=r[0],a=r[1];return a<0?"0."+new Array(-a).join("0")+n:n.length>a+1?n.slice(0,a+1)+"."+n.slice(a+1):n+new Array(a-n.length+2).join("0")}const Xj={"%":(e,t)=>(e*100).toFixed(t),b:e=>Math.round(e).toString(2),c:e=>e+"",d:L9,e:(e,t)=>e.toExponential(t),f:(e,t)=>e.toFixed(t),g:(e,t)=>e.toPrecision(t),o:e=>Math.round(e).toString(8),p:(e,t)=>Yj(e*100,t),r:Yj,s:U9,X:e=>Math.round(e).toString(16).toUpperCase(),x:e=>Math.round(e).toString(16)};function Zj(e){return e}var Jj=Array.prototype.map,eS=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function H9(e){var t=e.grouping===void 0||e.thousands===void 0?Zj:$9(Jj.call(e.grouping,Number),e.thousands+""),r=e.currency===void 0?"":e.currency[0]+"",n=e.currency===void 0?"":e.currency[1]+"",a=e.decimal===void 0?".":e.decimal+"",o=e.numerals===void 0?Zj:z9(Jj.call(e.numerals,String)),c=e.percent===void 0?"%":e.percent+"",u=e.minus===void 0?"−":e.minus+"",f=e.nan===void 0?"NaN":e.nan+"";function h(g,v){g=zu(g);var b=g.fill,j=g.align,k=g.sign,S=g.symbol,N=g.zero,E=g.width,A=g.comma,P=g.precision,_=g.trim,O=g.type;O==="n"?(A=!0,O="g"):Xj[O]||(P===void 0&&(P=12),_=!0,O="g"),(N||b==="0"&&j==="=")&&(N=!0,b="0",j="=");var D=(v&&v.prefix!==void 0?v.prefix:"")+(S==="$"?r:S==="#"&&/[boxX]/.test(O)?"0"+O.toLowerCase():""),U=(S==="$"?n:/[%p]/.test(O)?c:"")+(v&&v.suffix!==void 0?v.suffix:""),B=Xj[O],F=/[defgprs%]/.test(O);P=P===void 0?6:/[gprs]/.test(O)?Math.max(1,Math.min(21,P)):Math.max(0,Math.min(20,P));function Y(H){var pe=D,ue=U,he,ae,se;if(O==="c")ue=B(H)+ue,H="";else{H=+H;var X=H<0||1/H<0;if(H=isNaN(H)?f:B(Math.abs(H),P),_&&(H=B9(H)),X&&+H==0&&k!=="+"&&(X=!1),pe=(X?k==="("?k:u:k==="-"||k==="("?"":k)+pe,ue=(O==="s"&&!isNaN(H)&&Kf!==void 0?eS[8+Kf/3]:"")+ue+(X&&k==="("?")":""),F){for(he=-1,ae=H.length;++hese||se>57){ue=(se===46?a+H.slice(he+1):H.slice(he))+ue,H=H.slice(0,he);break}}}A&&!N&&(H=t(H,1/0));var te=pe.length+H.length+ue.length,J=te>1)+pe+H+ue+J.slice(te);break;default:H=J+pe+H+ue;break}return o(H)}return Y.toString=function(){return g+""},Y}function m(g,v){var b=Math.max(-8,Math.min(8,Math.floor(qs(v)/3)))*3,j=Math.pow(10,-b),k=h((g=zu(g),g.type="f",g),{suffix:eS[8+b/3]});return function(S){return k(j*S)}}return{format:h,formatPrefix:m}}var Hd,y0,WA;W9({thousands:",",grouping:[3],currency:["$",""]});function W9(e){return Hd=H9(e),y0=Hd.format,WA=Hd.formatPrefix,Hd}function K9(e){return Math.max(0,-qs(Math.abs(e)))}function G9(e,t){return Math.max(0,Math.max(-8,Math.min(8,Math.floor(qs(t)/3)))*3-qs(Math.abs(e)))}function V9(e,t){return e=Math.abs(e),t=Math.abs(t)-e,Math.max(0,qs(t)-qs(e))+1}function KA(e,t,r,n){var a=Jv(e,t,r),o;switch(n=zu(n??",f"),n.type){case"s":{var c=Math.max(Math.abs(e),Math.abs(t));return n.precision==null&&!isNaN(o=G9(a,c))&&(n.precision=o),WA(n,c)}case"":case"e":case"g":case"p":case"r":{n.precision==null&&!isNaN(o=V9(a,Math.max(Math.abs(e),Math.abs(t))))&&(n.precision=o-(n.type==="e"));break}case"f":case"%":{n.precision==null&&!isNaN(o=K9(a))&&(n.precision=o-(n.type==="%")*2);break}}return y0(n)}function Na(e){var t=e.domain;return e.ticks=function(r){var n=t();return Xv(n[0],n[n.length-1],r??10)},e.tickFormat=function(r,n){var a=t();return KA(a[0],a[a.length-1],r??10,n)},e.nice=function(r){r==null&&(r=10);var n=t(),a=0,o=n.length-1,c=n[a],u=n[o],f,h,m=10;for(u0;){if(h=Zv(c,u,r),h===f)return n[a]=c,n[o]=u,t(n);if(h>0)c=Math.floor(c/h)*h,u=Math.ceil(u/h)*h;else if(h<0)c=Math.ceil(c*h)/h,u=Math.floor(u*h)/h;else break;f=h}return e},e}function GA(){var e=g0();return e.copy=function(){return oc(e,GA())},sn.apply(e,arguments),Na(e)}function VA(e){var t;function r(n){return n==null||isNaN(n=+n)?t:n}return r.invert=r,r.domain=r.range=function(n){return arguments.length?(e=Array.from(n,Hf),r):e.slice()},r.unknown=function(n){return arguments.length?(t=n,r):t},r.copy=function(){return VA(e).unknown(t)},e=arguments.length?Array.from(e,Hf):[0,1],Na(r)}function qA(e,t){e=e.slice();var r=0,n=e.length-1,a=e[r],o=e[n],c;return oMath.pow(e,t)}function Z9(e){return e===Math.E?Math.log:e===10&&Math.log10||e===2&&Math.log2||(e=Math.log(e),t=>Math.log(t)/e)}function nS(e){return(t,r)=>-e(-t,r)}function x0(e){const t=e(tS,rS),r=t.domain;let n=10,a,o;function c(){return a=Z9(n),o=X9(n),r()[0]<0?(a=nS(a),o=nS(o),e(q9,Q9)):e(tS,rS),t}return t.base=function(u){return arguments.length?(n=+u,c()):n},t.domain=function(u){return arguments.length?(r(u),c()):r()},t.ticks=u=>{const f=r();let h=f[0],m=f[f.length-1];const g=m0){for(;v<=b;++v)for(j=1;jm)break;N.push(k)}}else for(;v<=b;++v)for(j=n-1;j>=1;--j)if(k=v>0?j/o(-v):j*o(v),!(km)break;N.push(k)}N.length*2{if(u==null&&(u=10),f==null&&(f=n===10?"s":","),typeof f!="function"&&(!(n%1)&&(f=zu(f)).precision==null&&(f.trim=!0),f=y0(f)),u===1/0)return f;const h=Math.max(1,n*u/t.ticks().length);return m=>{let g=m/o(Math.round(a(m)));return g*nr(qA(r(),{floor:u=>o(Math.floor(a(u))),ceil:u=>o(Math.ceil(a(u)))})),t}function QA(){const e=x0(Qh()).domain([1,10]);return e.copy=()=>oc(e,QA()).base(e.base()),sn.apply(e,arguments),e}function iS(e){return function(t){return Math.sign(t)*Math.log1p(Math.abs(t/e))}}function aS(e){return function(t){return Math.sign(t)*Math.expm1(Math.abs(t))*e}}function b0(e){var t=1,r=e(iS(t),aS(t));return r.constant=function(n){return arguments.length?e(iS(t=+n),aS(t)):t},Na(r)}function YA(){var e=b0(Qh());return e.copy=function(){return oc(e,YA()).constant(e.constant())},sn.apply(e,arguments)}function oS(e){return function(t){return t<0?-Math.pow(-t,e):Math.pow(t,e)}}function J9(e){return e<0?-Math.sqrt(-e):Math.sqrt(e)}function e7(e){return e<0?-e*e:e*e}function w0(e){var t=e(gr,gr),r=1;function n(){return r===1?e(gr,gr):r===.5?e(J9,e7):e(oS(r),oS(1/r))}return t.exponent=function(a){return arguments.length?(r=+a,n()):r},Na(t)}function k0(){var e=w0(Qh());return e.copy=function(){return oc(e,k0()).exponent(e.exponent())},sn.apply(e,arguments),e}function t7(){return k0.apply(null,arguments).exponent(.5)}function sS(e){return Math.sign(e)*e*e}function r7(e){return Math.sign(e)*Math.sqrt(Math.abs(e))}function XA(){var e=g0(),t=[0,1],r=!1,n;function a(o){var c=r7(e(o));return isNaN(c)?n:r?Math.round(c):c}return a.invert=function(o){return e.invert(sS(o))},a.domain=function(o){return arguments.length?(e.domain(o),a):e.domain()},a.range=function(o){return arguments.length?(e.range((t=Array.from(o,Hf)).map(sS)),a):t.slice()},a.rangeRound=function(o){return a.range(o).round(!0)},a.round=function(o){return arguments.length?(r=!!o,a):r},a.clamp=function(o){return arguments.length?(e.clamp(o),a):e.clamp()},a.unknown=function(o){return arguments.length?(n=o,a):n},a.copy=function(){return XA(e.domain(),t).round(r).clamp(e.clamp()).unknown(n)},sn.apply(a,arguments),Na(a)}function ZA(){var e=[],t=[],r=[],n;function a(){var c=0,u=Math.max(1,t.length);for(r=new Array(u-1);++c0?r[u-1]:e[0],u=r?[n[r-1],t]:[n[h-1],n[h]]},c.unknown=function(f){return arguments.length&&(o=f),c},c.thresholds=function(){return n.slice()},c.copy=function(){return JA().domain([e,t]).range(a).unknown(o)},sn.apply(Na(c),arguments)}function eC(){var e=[.5],t=[0,1],r,n=1;function a(o){return o!=null&&o<=o?t[ic(e,o,0,n)]:r}return a.domain=function(o){return arguments.length?(e=Array.from(o),n=Math.min(e.length,t.length-1),a):e.slice()},a.range=function(o){return arguments.length?(t=Array.from(o),n=Math.min(e.length,t.length-1),a):t.slice()},a.invertExtent=function(o){var c=t.indexOf(o);return[e[c-1],e[c]]},a.unknown=function(o){return arguments.length?(r=o,a):r},a.copy=function(){return eC().domain(e).range(t).unknown(r)},sn.apply(a,arguments)}const Og=new Date,_g=new Date;function Ot(e,t,r,n){function a(o){return e(o=arguments.length===0?new Date:new Date(+o)),o}return a.floor=o=>(e(o=new Date(+o)),o),a.ceil=o=>(e(o=new Date(o-1)),t(o,1),e(o),o),a.round=o=>{const c=a(o),u=a.ceil(o);return o-c(t(o=new Date(+o),c==null?1:Math.floor(c)),o),a.range=(o,c,u)=>{const f=[];if(o=a.ceil(o),u=u==null?1:Math.floor(u),!(o0))return f;let h;do f.push(h=new Date(+o)),t(o,u),e(o);while(hOt(c=>{if(c>=c)for(;e(c),!o(c);)c.setTime(c-1)},(c,u)=>{if(c>=c)if(u<0)for(;++u<=0;)for(;t(c,-1),!o(c););else for(;--u>=0;)for(;t(c,1),!o(c););}),r&&(a.count=(o,c)=>(Og.setTime(+o),_g.setTime(+c),e(Og),e(_g),Math.floor(r(Og,_g))),a.every=o=>(o=Math.floor(o),!isFinite(o)||!(o>0)?null:o>1?a.filter(n?c=>n(c)%o===0:c=>a.count(0,c)%o===0):a)),a}const Gf=Ot(()=>{},(e,t)=>{e.setTime(+e+t)},(e,t)=>t-e);Gf.every=e=>(e=Math.floor(e),!isFinite(e)||!(e>0)?null:e>1?Ot(t=>{t.setTime(Math.floor(t/e)*e)},(t,r)=>{t.setTime(+t+r*e)},(t,r)=>(r-t)/e):Gf);Gf.range;const pi=1e3,tn=pi*60,gi=tn*60,ki=gi*24,j0=ki*7,lS=ki*30,Mg=ki*365,ro=Ot(e=>{e.setTime(e-e.getMilliseconds())},(e,t)=>{e.setTime(+e+t*pi)},(e,t)=>(t-e)/pi,e=>e.getUTCSeconds());ro.range;const S0=Ot(e=>{e.setTime(e-e.getMilliseconds()-e.getSeconds()*pi)},(e,t)=>{e.setTime(+e+t*tn)},(e,t)=>(t-e)/tn,e=>e.getMinutes());S0.range;const N0=Ot(e=>{e.setUTCSeconds(0,0)},(e,t)=>{e.setTime(+e+t*tn)},(e,t)=>(t-e)/tn,e=>e.getUTCMinutes());N0.range;const E0=Ot(e=>{e.setTime(e-e.getMilliseconds()-e.getSeconds()*pi-e.getMinutes()*tn)},(e,t)=>{e.setTime(+e+t*gi)},(e,t)=>(t-e)/gi,e=>e.getHours());E0.range;const A0=Ot(e=>{e.setUTCMinutes(0,0,0)},(e,t)=>{e.setTime(+e+t*gi)},(e,t)=>(t-e)/gi,e=>e.getUTCHours());A0.range;const sc=Ot(e=>e.setHours(0,0,0,0),(e,t)=>e.setDate(e.getDate()+t),(e,t)=>(t-e-(t.getTimezoneOffset()-e.getTimezoneOffset())*tn)/ki,e=>e.getDate()-1);sc.range;const Yh=Ot(e=>{e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCDate(e.getUTCDate()+t)},(e,t)=>(t-e)/ki,e=>e.getUTCDate()-1);Yh.range;const tC=Ot(e=>{e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCDate(e.getUTCDate()+t)},(e,t)=>(t-e)/ki,e=>Math.floor(e/ki));tC.range;function _o(e){return Ot(t=>{t.setDate(t.getDate()-(t.getDay()+7-e)%7),t.setHours(0,0,0,0)},(t,r)=>{t.setDate(t.getDate()+r*7)},(t,r)=>(r-t-(r.getTimezoneOffset()-t.getTimezoneOffset())*tn)/j0)}const Xh=_o(0),Vf=_o(1),n7=_o(2),i7=_o(3),Qs=_o(4),a7=_o(5),o7=_o(6);Xh.range;Vf.range;n7.range;i7.range;Qs.range;a7.range;o7.range;function Mo(e){return Ot(t=>{t.setUTCDate(t.getUTCDate()-(t.getUTCDay()+7-e)%7),t.setUTCHours(0,0,0,0)},(t,r)=>{t.setUTCDate(t.getUTCDate()+r*7)},(t,r)=>(r-t)/j0)}const Zh=Mo(0),qf=Mo(1),s7=Mo(2),l7=Mo(3),Ys=Mo(4),u7=Mo(5),c7=Mo(6);Zh.range;qf.range;s7.range;l7.range;Ys.range;u7.range;c7.range;const C0=Ot(e=>{e.setDate(1),e.setHours(0,0,0,0)},(e,t)=>{e.setMonth(e.getMonth()+t)},(e,t)=>t.getMonth()-e.getMonth()+(t.getFullYear()-e.getFullYear())*12,e=>e.getMonth());C0.range;const P0=Ot(e=>{e.setUTCDate(1),e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCMonth(e.getUTCMonth()+t)},(e,t)=>t.getUTCMonth()-e.getUTCMonth()+(t.getUTCFullYear()-e.getUTCFullYear())*12,e=>e.getUTCMonth());P0.range;const ji=Ot(e=>{e.setMonth(0,1),e.setHours(0,0,0,0)},(e,t)=>{e.setFullYear(e.getFullYear()+t)},(e,t)=>t.getFullYear()-e.getFullYear(),e=>e.getFullYear());ji.every=e=>!isFinite(e=Math.floor(e))||!(e>0)?null:Ot(t=>{t.setFullYear(Math.floor(t.getFullYear()/e)*e),t.setMonth(0,1),t.setHours(0,0,0,0)},(t,r)=>{t.setFullYear(t.getFullYear()+r*e)});ji.range;const Si=Ot(e=>{e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCFullYear(e.getUTCFullYear()+t)},(e,t)=>t.getUTCFullYear()-e.getUTCFullYear(),e=>e.getUTCFullYear());Si.every=e=>!isFinite(e=Math.floor(e))||!(e>0)?null:Ot(t=>{t.setUTCFullYear(Math.floor(t.getUTCFullYear()/e)*e),t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)},(t,r)=>{t.setUTCFullYear(t.getUTCFullYear()+r*e)});Si.range;function rC(e,t,r,n,a,o){const c=[[ro,1,pi],[ro,5,5*pi],[ro,15,15*pi],[ro,30,30*pi],[o,1,tn],[o,5,5*tn],[o,15,15*tn],[o,30,30*tn],[a,1,gi],[a,3,3*gi],[a,6,6*gi],[a,12,12*gi],[n,1,ki],[n,2,2*ki],[r,1,j0],[t,1,lS],[t,3,3*lS],[e,1,Mg]];function u(h,m,g){const v=mS).right(c,v);if(b===c.length)return e.every(Jv(h/Mg,m/Mg,g));if(b===0)return Gf.every(Math.max(Jv(h,m,g),1));const[j,k]=c[v/c[b-1][2]53)return null;"w"in ie||(ie.w=1),"Z"in ie?(Fe=Tg(ou(ie.y,0,1)),Oe=Fe.getUTCDay(),Fe=Oe>4||Oe===0?qf.ceil(Fe):qf(Fe),Fe=Yh.offset(Fe,(ie.V-1)*7),ie.y=Fe.getUTCFullYear(),ie.m=Fe.getUTCMonth(),ie.d=Fe.getUTCDate()+(ie.w+6)%7):(Fe=Ig(ou(ie.y,0,1)),Oe=Fe.getDay(),Fe=Oe>4||Oe===0?Vf.ceil(Fe):Vf(Fe),Fe=sc.offset(Fe,(ie.V-1)*7),ie.y=Fe.getFullYear(),ie.m=Fe.getMonth(),ie.d=Fe.getDate()+(ie.w+6)%7)}else("W"in ie||"U"in ie)&&("w"in ie||(ie.w="u"in ie?ie.u%7:"W"in ie?1:0),Oe="Z"in ie?Tg(ou(ie.y,0,1)).getUTCDay():Ig(ou(ie.y,0,1)).getDay(),ie.m=0,ie.d="W"in ie?(ie.w+6)%7+ie.W*7-(Oe+5)%7:ie.w+ie.U*7-(Oe+6)%7);return"Z"in ie?(ie.H+=ie.Z/100|0,ie.M+=ie.Z%100,Tg(ie)):Ig(ie)}}function U(re,xe,_e,ie){for(var Je=0,Fe=xe.length,Oe=_e.length,ut,Jt;Je=Oe)return-1;if(ut=xe.charCodeAt(Je++),ut===37){if(ut=xe.charAt(Je++),Jt=_[ut in uS?xe.charAt(Je++):ut],!Jt||(ie=Jt(re,_e,ie))<0)return-1}else if(ut!=_e.charCodeAt(ie++))return-1}return ie}function B(re,xe,_e){var ie=h.exec(xe.slice(_e));return ie?(re.p=m.get(ie[0].toLowerCase()),_e+ie[0].length):-1}function F(re,xe,_e){var ie=b.exec(xe.slice(_e));return ie?(re.w=j.get(ie[0].toLowerCase()),_e+ie[0].length):-1}function Y(re,xe,_e){var ie=g.exec(xe.slice(_e));return ie?(re.w=v.get(ie[0].toLowerCase()),_e+ie[0].length):-1}function H(re,xe,_e){var ie=N.exec(xe.slice(_e));return ie?(re.m=E.get(ie[0].toLowerCase()),_e+ie[0].length):-1}function pe(re,xe,_e){var ie=k.exec(xe.slice(_e));return ie?(re.m=S.get(ie[0].toLowerCase()),_e+ie[0].length):-1}function ue(re,xe,_e){return U(re,t,xe,_e)}function he(re,xe,_e){return U(re,r,xe,_e)}function ae(re,xe,_e){return U(re,n,xe,_e)}function se(re){return c[re.getDay()]}function X(re){return o[re.getDay()]}function te(re){return f[re.getMonth()]}function J(re){return u[re.getMonth()]}function I(re){return a[+(re.getHours()>=12)]}function M(re){return 1+~~(re.getMonth()/3)}function K(re){return c[re.getUTCDay()]}function ne(re){return o[re.getUTCDay()]}function Z(re){return f[re.getUTCMonth()]}function me(re){return u[re.getUTCMonth()]}function ge(re){return a[+(re.getUTCHours()>=12)]}function Pe(re){return 1+~~(re.getUTCMonth()/3)}return{format:function(re){var xe=O(re+="",A);return xe.toString=function(){return re},xe},parse:function(re){var xe=D(re+="",!1);return xe.toString=function(){return re},xe},utcFormat:function(re){var xe=O(re+="",P);return xe.toString=function(){return re},xe},utcParse:function(re){var xe=D(re+="",!0);return xe.toString=function(){return re},xe}}}var uS={"-":"",_:" ",0:"0"},Bt=/^\s*\d+/,g7=/^%/,v7=/[\\^$*+?|[\]().{}]/g;function Ye(e,t,r){var n=e<0?"-":"",a=(n?-e:e)+"",o=a.length;return n+(o[t.toLowerCase(),r]))}function x7(e,t,r){var n=Bt.exec(t.slice(r,r+1));return n?(e.w=+n[0],r+n[0].length):-1}function b7(e,t,r){var n=Bt.exec(t.slice(r,r+1));return n?(e.u=+n[0],r+n[0].length):-1}function w7(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.U=+n[0],r+n[0].length):-1}function k7(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.V=+n[0],r+n[0].length):-1}function j7(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.W=+n[0],r+n[0].length):-1}function cS(e,t,r){var n=Bt.exec(t.slice(r,r+4));return n?(e.y=+n[0],r+n[0].length):-1}function dS(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.y=+n[0]+(+n[0]>68?1900:2e3),r+n[0].length):-1}function S7(e,t,r){var n=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(t.slice(r,r+6));return n?(e.Z=n[1]?0:-(n[2]+(n[3]||"00")),r+n[0].length):-1}function N7(e,t,r){var n=Bt.exec(t.slice(r,r+1));return n?(e.q=n[0]*3-3,r+n[0].length):-1}function E7(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.m=n[0]-1,r+n[0].length):-1}function fS(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.d=+n[0],r+n[0].length):-1}function A7(e,t,r){var n=Bt.exec(t.slice(r,r+3));return n?(e.m=0,e.d=+n[0],r+n[0].length):-1}function hS(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.H=+n[0],r+n[0].length):-1}function C7(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.M=+n[0],r+n[0].length):-1}function P7(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.S=+n[0],r+n[0].length):-1}function O7(e,t,r){var n=Bt.exec(t.slice(r,r+3));return n?(e.L=+n[0],r+n[0].length):-1}function _7(e,t,r){var n=Bt.exec(t.slice(r,r+6));return n?(e.L=Math.floor(n[0]/1e3),r+n[0].length):-1}function M7(e,t,r){var n=g7.exec(t.slice(r,r+1));return n?r+n[0].length:-1}function I7(e,t,r){var n=Bt.exec(t.slice(r));return n?(e.Q=+n[0],r+n[0].length):-1}function T7(e,t,r){var n=Bt.exec(t.slice(r));return n?(e.s=+n[0],r+n[0].length):-1}function mS(e,t){return Ye(e.getDate(),t,2)}function D7(e,t){return Ye(e.getHours(),t,2)}function R7(e,t){return Ye(e.getHours()%12||12,t,2)}function L7(e,t){return Ye(1+sc.count(ji(e),e),t,3)}function nC(e,t){return Ye(e.getMilliseconds(),t,3)}function $7(e,t){return nC(e,t)+"000"}function z7(e,t){return Ye(e.getMonth()+1,t,2)}function F7(e,t){return Ye(e.getMinutes(),t,2)}function B7(e,t){return Ye(e.getSeconds(),t,2)}function U7(e){var t=e.getDay();return t===0?7:t}function H7(e,t){return Ye(Xh.count(ji(e)-1,e),t,2)}function iC(e){var t=e.getDay();return t>=4||t===0?Qs(e):Qs.ceil(e)}function W7(e,t){return e=iC(e),Ye(Qs.count(ji(e),e)+(ji(e).getDay()===4),t,2)}function K7(e){return e.getDay()}function G7(e,t){return Ye(Vf.count(ji(e)-1,e),t,2)}function V7(e,t){return Ye(e.getFullYear()%100,t,2)}function q7(e,t){return e=iC(e),Ye(e.getFullYear()%100,t,2)}function Q7(e,t){return Ye(e.getFullYear()%1e4,t,4)}function Y7(e,t){var r=e.getDay();return e=r>=4||r===0?Qs(e):Qs.ceil(e),Ye(e.getFullYear()%1e4,t,4)}function X7(e){var t=e.getTimezoneOffset();return(t>0?"-":(t*=-1,"+"))+Ye(t/60|0,"0",2)+Ye(t%60,"0",2)}function pS(e,t){return Ye(e.getUTCDate(),t,2)}function Z7(e,t){return Ye(e.getUTCHours(),t,2)}function J7(e,t){return Ye(e.getUTCHours()%12||12,t,2)}function eB(e,t){return Ye(1+Yh.count(Si(e),e),t,3)}function aC(e,t){return Ye(e.getUTCMilliseconds(),t,3)}function tB(e,t){return aC(e,t)+"000"}function rB(e,t){return Ye(e.getUTCMonth()+1,t,2)}function nB(e,t){return Ye(e.getUTCMinutes(),t,2)}function iB(e,t){return Ye(e.getUTCSeconds(),t,2)}function aB(e){var t=e.getUTCDay();return t===0?7:t}function oB(e,t){return Ye(Zh.count(Si(e)-1,e),t,2)}function oC(e){var t=e.getUTCDay();return t>=4||t===0?Ys(e):Ys.ceil(e)}function sB(e,t){return e=oC(e),Ye(Ys.count(Si(e),e)+(Si(e).getUTCDay()===4),t,2)}function lB(e){return e.getUTCDay()}function uB(e,t){return Ye(qf.count(Si(e)-1,e),t,2)}function cB(e,t){return Ye(e.getUTCFullYear()%100,t,2)}function dB(e,t){return e=oC(e),Ye(e.getUTCFullYear()%100,t,2)}function fB(e,t){return Ye(e.getUTCFullYear()%1e4,t,4)}function hB(e,t){var r=e.getUTCDay();return e=r>=4||r===0?Ys(e):Ys.ceil(e),Ye(e.getUTCFullYear()%1e4,t,4)}function mB(){return"+0000"}function gS(){return"%"}function vS(e){return+e}function yS(e){return Math.floor(+e/1e3)}var cs,sC,lC;pB({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});function pB(e){return cs=p7(e),sC=cs.format,cs.parse,lC=cs.utcFormat,cs.utcParse,cs}function gB(e){return new Date(e)}function vB(e){return e instanceof Date?+e:+new Date(+e)}function O0(e,t,r,n,a,o,c,u,f,h){var m=g0(),g=m.invert,v=m.domain,b=h(".%L"),j=h(":%S"),k=h("%I:%M"),S=h("%I %p"),N=h("%a %d"),E=h("%b %d"),A=h("%B"),P=h("%Y");function _(O){return(f(O)t(a/(e.length-1)))},r.quantiles=function(n){return Array.from({length:n+1},(a,o)=>a9(e,o/n))},r.copy=function(){return fC(t).domain(e)},Ci.apply(r,arguments)}function em(){var e=0,t=.5,r=1,n=1,a,o,c,u,f,h=gr,m,g=!1,v;function b(k){return isNaN(k=+k)?v:(k=.5+((k=+m(k))-o)*(n*k{if(e!=null){var n=e.scale,a=e.type;if(n==="auto")return a==="category"&&r&&(r.indexOf("LineChart")>=0||r.indexOf("AreaChart")>=0||r.indexOf("ComposedChart")>=0&&!t)?"point":a==="category"?"band":"linear";if(typeof n=="string")return SB(n)?n:"point"}};function NB(e,t){for(var r=0,n=e.length,a=e[0]t)?r=o+1:n=o}return r}function yC(e,t){if(e){var r=t??e.domain(),n=r.map(o=>{var c;return(c=e(o))!==null&&c!==void 0?c:0}),a=e.range();if(!(r.length===0||a.length<2))return o=>{var c,u,f=NB(n,o);if(f<=0)return r[0];if(f>=r.length)return r[r.length-1];var h=(c=n[f-1])!==null&&c!==void 0?c:0,m=(u=n[f])!==null&&u!==void 0?u:0;return Math.abs(o-h)<=Math.abs(o-m)?r[f-1]:r[f]}}}function EB(e){if(e!=null)return"invert"in e&&typeof e.invert=="function"?e.invert.bind(e):yC(e,void 0)}function bS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function Qf(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);re.cartesianAxis.xAxis[t],Pi=(e,t)=>{var r=bC(e,t);return r??Ct},Pt={allowDataOverflow:!1,allowDecimals:!0,allowDuplicatedCategory:!0,angle:0,dataKey:void 0,domain:iy,hide:!0,id:0,includeHidden:!1,interval:"preserveEnd",minTickGap:5,mirror:!1,name:void 0,orientation:"left",padding:{top:0,bottom:0},reversed:!1,scale:"auto",tick:!0,tickCount:5,tickFormatter:void 0,ticks:void 0,type:"number",unit:void 0,niceTicks:"auto",width:Ju},wC=(e,t)=>e.cartesianAxis.yAxis[t],Oi=(e,t)=>{var r=wC(e,t);return r??Pt},TB={domain:[0,"auto"],includeHidden:!1,reversed:!1,allowDataOverflow:!1,allowDuplicatedCategory:!1,dataKey:void 0,id:0,name:"",range:[64,64],scale:"auto",type:"number",unit:""},T0=(e,t)=>{var r=e.cartesianAxis.zAxis[t];return r??TB},yr=(e,t,r)=>{switch(t){case"xAxis":return Pi(e,r);case"yAxis":return Oi(e,r);case"zAxis":return T0(e,r);case"angleAxis":return i0(e,r);case"radiusAxis":return a0(e,r);default:throw new Error("Unexpected axis type: ".concat(t))}},DB=(e,t,r)=>{switch(t){case"xAxis":return Pi(e,r);case"yAxis":return Oi(e,r);default:throw new Error("Unexpected axis type: ".concat(t))}},lc=(e,t,r)=>{switch(t){case"xAxis":return Pi(e,r);case"yAxis":return Oi(e,r);case"angleAxis":return i0(e,r);case"radiusAxis":return a0(e,r);default:throw new Error("Unexpected axis type: ".concat(t))}},kC=e=>e.graphicalItems.cartesianItems.some(t=>t.type==="bar")||e.graphicalItems.polarItems.some(t=>t.type==="radialBar");function jC(e,t){return r=>{switch(e){case"xAxis":return"xAxisId"in r&&r.xAxisId===t;case"yAxis":return"yAxisId"in r&&r.yAxisId===t;case"zAxis":return"zAxisId"in r&&r.zAxisId===t;case"angleAxis":return"angleAxisId"in r&&r.angleAxisId===t;case"radiusAxis":return"radiusAxisId"in r&&r.radiusAxisId===t;default:return!1}}}var SC=e=>e.graphicalItems.cartesianItems,RB=q([zt,Gh],jC),NC=(e,t,r)=>e.filter(r).filter(n=>(t==null?void 0:t.includeHidden)===!0?!0:!n.hide),ll=q([SC,yr,RB],NC,{memoizeOptions:{resultEqualityCheck:qh}}),EC=q([ll],e=>e.filter(t=>t.type==="area"||t.type==="bar").filter(l0)),AC=e=>e.filter(t=>!("stackId"in t)||t.stackId===void 0),LB=q([ll],AC),CC=e=>e.map(t=>t.data).filter(Boolean).flat(1),$B=q([ll],e=>e.some(t=>!t.data)),PC=q([ll],CC,{memoizeOptions:{resultEqualityCheck:qh}}),OC=(e,t)=>{var r=t.chartData,n=r===void 0?[]:r,a=t.dataStartIndex,o=t.dataEndIndex;return e.length>0?e:n.slice(a,o+1)},D0=q([PC,Bh],OC),zB=(e,t,r)=>(t==null?void 0:t.dataKey)!=null?e.map(n=>({value:Lt(n,t.dataKey)})):r.length>0?r.map(n=>n.dataKey).flatMap(n=>e.map(a=>({value:Lt(a,n)}))):e.map(n=>({value:n})),_C=(e,t,r,n,a,o)=>{var c=n.chartData,u=c===void 0?[]:c,f=n.dataStartIndex,h=n.dataEndIndex,m=zB(e,t,r);if(a&&(t==null?void 0:t.dataKey)!=null&&o.length>0){var g=u.slice(f,h+1),v=g.map(b=>({value:Lt(b,t.dataKey)})).filter(b=>b.value!=null);return[...v,...m]}return m},uc=q([D0,yr,ll,Bh,$B,PC],_C);function Es(e){if(Gn(e)||e instanceof Date){var t=Number(e);if(We(t))return t}}function kS(e){if(Array.isArray(e)){var t=[Es(e[0]),Es(e[1])];return Bn(t)?t:void 0}var r=Es(e);if(r!=null)return[r,r]}function Qn(e){return e.map(Es).filter(Ar)}function FB(e,t){var r=Es(e),n=Es(t);return r==null&&n==null?0:r==null?-1:n==null?1:r-n}var BB=q([uc],e=>e==null?void 0:e.map(t=>t.value).sort(FB));function MC(e,t){switch(e){case"xAxis":return t.direction==="x";case"yAxis":return t.direction==="y";default:return!1}}function UB(e,t,r){if(!r)return[];if(!r.length)return[];var n;if(typeof t=="number"&&!Kn(t))n=t;else if(Array.isArray(t)){var a=Qn(t);a.length>0&&(n=Math.max(...a))}return n==null?[]:Qn(r.flatMap(o=>{var c=Lt(e,o.dataKey),u,f;if(Array.isArray(c)){var h=xC(c,2);u=h[0],f=h[1]}else u=f=c;if(!(!We(u)||!We(f)))return[n-u,n+f]}))}var _t=e=>{var t=Ft(e),r=ol(e);return lc(e,t,r)},Xs=q([_t],e=>e==null?void 0:e.dataKey),HB=q([EC,Bh,_t],RA),IC=(e,t,r,n)=>{var a={},o=t.reduce((c,u)=>{if(u.stackId==null)return c;var f=c[u.stackId];return f==null&&(f=[]),f.push(u),c[u.stackId]=f,c},a);return Object.fromEntries(Object.entries(o).map(c=>{var u=xC(c,2),f=u[0],h=u[1],m=n?[...h].reverse():h,g=m.map(s0);return[f,{stackedData:sz(e,g,r),graphicalItems:m}]}))},TC=q([HB,EC,Uh,PA],IC),DC=(e,t,r,n)=>{var a=t.dataStartIndex,o=t.dataEndIndex;if(n==null&&r!=="zAxis")return dz(e,a,o)},WB=q([yr],e=>e.allowDataOverflow),R0=e=>{var t;if(e==null||!("domain"in e))return iy;if(e.domain!=null)return e.domain;if("ticks"in e&&e.ticks!=null){if(e.type==="number"){var r=Qn(e.ticks);return[Math.min(...r),Math.max(...r)]}if(e.type==="category")return e.ticks.map(String)}return(t=e==null?void 0:e.domain)!==null&&t!==void 0?t:iy},RC=q([yr],R0),LC=q([RC,WB],yA),KB=q([TC,Nn,zt,LC],DC,{memoizeOptions:{resultEqualityCheck:Vh}}),L0=e=>e.errorBars,GB=(e,t,r)=>e.flatMap(n=>t[n.id]).filter(Boolean).filter(n=>MC(r,n)),Yf=function(){for(var t=arguments.length,r=new Array(t),n=0;n5&&arguments[5]!==void 0?arguments[5]:[],u,f;if(n.length>0&&n.forEach(h=>{var m,g=h.data!=null?[...h.data]:c,v=(m=a[h.id])===null||m===void 0?void 0:m.filter(b=>MC(o,b));g.forEach(b=>{var j,k=Lt(b,(j=r.dataKey)!==null&&j!==void 0?j:h.dataKey),S=UB(b,k,v);if(S.length>=2){var N=Math.min(...S),E=Math.max(...S);(u==null||Nf)&&(f=E)}var A=kS(k);A!=null&&(u=u==null?A[0]:Math.min(u,A[0]),f=f==null?A[1]:Math.max(f,A[1]))})}),(r==null?void 0:r.dataKey)!=null&&n.length===0&&t.forEach(h=>{var m=kS(Lt(h,r.dataKey));m!=null&&(u=u==null?m[0]:Math.min(u,m[0]),f=f==null?m[1]:Math.max(f,m[1]))}),We(u)&&We(f))return[u,f]},VB=q([D0,yr,LB,L0,zt,jF],$C,{memoizeOptions:{resultEqualityCheck:Vh}});function qB(e){var t=e.value;if(Gn(t)||t instanceof Date)return t}var QB=(e,t,r)=>{var n=e.map(qB).filter(a=>a!=null);return r&&(t.dataKey==null||t.allowDuplicatedCategory&&QE(n))?vA(0,e.length):t.allowDuplicatedCategory?n:Array.from(new Set(n))},zC=e=>e.referenceElements.dots,ul=(e,t,r)=>e.filter(n=>n.ifOverflow==="extendDomain").filter(n=>t==="xAxis"?n.xAxisId===r:n.yAxisId===r),YB=q([zC,zt,Gh],ul),FC=e=>e.referenceElements.areas,XB=q([FC,zt,Gh],ul),BC=e=>e.referenceElements.lines,ZB=q([BC,zt,Gh],ul),UC=(e,t)=>{if(e!=null){var r=Qn(e.map(n=>t==="xAxis"?n.x:n.y));if(r.length!==0)return[Math.min(...r),Math.max(...r)]}},JB=q(YB,zt,UC),HC=(e,t)=>{if(e!=null){var r=Qn(e.flatMap(n=>[t==="xAxis"?n.x1:n.y1,t==="xAxis"?n.x2:n.y2]));if(r.length!==0)return[Math.min(...r),Math.max(...r)]}},eU=q([XB,zt],HC);function tU(e){var t;if(e.x!=null)return Qn([e.x]);var r=(t=e.segment)===null||t===void 0?void 0:t.map(n=>n.x);return r==null||r.length===0?[]:Qn(r)}function rU(e){var t;if(e.y!=null)return Qn([e.y]);var r=(t=e.segment)===null||t===void 0?void 0:t.map(n=>n.y);return r==null||r.length===0?[]:Qn(r)}var WC=(e,t)=>{if(e!=null){var r=e.flatMap(n=>t==="xAxis"?tU(n):rU(n));if(r.length!==0)return[Math.min(...r),Math.max(...r)]}},nU=q([ZB,zt],WC),iU=q(JB,nU,eU,(e,t,r)=>Yf(e,r,t)),KC=(e,t,r,n,a,o,c,u)=>{if(r!=null)return r;var f=c==="vertical"&&u==="xAxis"||c==="horizontal"&&u==="yAxis",h=f?Yf(n,o,a):Yf(o,a);return PF(t,h,e.allowDataOverflow)},aU=q([yr,RC,LC,KB,VB,iU,ft,zt],KC,{memoizeOptions:{resultEqualityCheck:Vh}}),oU=[0,1],GC=(e,t,r,n,a,o,c)=>{if(!((e==null||r==null||r.length===0)&&c===void 0)){var u=e.dataKey,f=e.type,h=Xn(t,o);if(h&&u==null){var m;return vA(0,(m=r==null?void 0:r.length)!==null&&m!==void 0?m:0)}return f==="category"?QB(n,e,h):a==="expand"&&!h?oU:c}},$0=q([yr,ft,D0,uc,Uh,zt,aU],GC),cl=q([yr,kC,t0],vC),VC=(e,t,r)=>{var n=t.niceTicks;if(n!=="none"){var a=R0(t),o=Array.isArray(a)&&(a[0]==="auto"||a[1]==="auto");if((n==="snap125"||n==="adaptive")&&t!=null&&t.tickCount&&Bn(e)){if(o)return _j(e,t.tickCount,t.allowDecimals,n);if(t.type==="number")return Mj(e,t.tickCount,t.allowDecimals,n)}if(n==="auto"&&r==="linear"&&t!=null&&t.tickCount){if(o&&Bn(e))return _j(e,t.tickCount,t.allowDecimals,"adaptive");if(t.type==="number"&&Bn(e))return Mj(e,t.tickCount,t.allowDecimals,"adaptive")}}},z0=q([$0,lc,cl],VC),qC=(e,t,r,n)=>{if(n!=="angleAxis"&&(e==null?void 0:e.type)==="number"&&Bn(t)&&Array.isArray(r)&&r.length>0){var a,o,c=t[0],u=(a=r[0])!==null&&a!==void 0?a:0,f=t[1],h=(o=r[r.length-1])!==null&&o!==void 0?o:0;return[Math.min(c,u),Math.max(f,h)]}return t},sU=q([yr,$0,z0,zt],qC),lU=q(uc,yr,(e,t)=>{if(!(!t||t.type!=="number")){var r=1/0,n=Array.from(Qn(e.map(g=>g.value))).sort((g,v)=>g-v),a=n[0],o=n[n.length-1];if(a==null||o==null)return 1/0;var c=o-a;if(c===0)return 1/0;for(var u=0;ua,(e,t,r,n,a)=>{if(!We(e))return 0;var o=t==="vertical"?n.height:n.width;if(a==="gap")return e*o/2;if(a==="no-gap"){var c=Sa(r,e*o),u=e*o/2;return u-c-(u-c)/o*c}return 0}),uU=(e,t,r)=>{var n=Pi(e,t);return n==null||typeof n.padding!="string"?0:QC(e,"xAxis",t,r,n.padding)},cU=(e,t,r)=>{var n=Oi(e,t);return n==null||typeof n.padding!="string"?0:QC(e,"yAxis",t,r,n.padding)},dU=q(Pi,uU,(e,t)=>{var r,n;if(e==null)return{left:0,right:0};var a=e.padding;return typeof a=="string"?{left:t,right:t}:{left:((r=a.left)!==null&&r!==void 0?r:0)+t,right:((n=a.right)!==null&&n!==void 0?n:0)+t}}),fU=q(Oi,cU,(e,t)=>{var r,n;if(e==null)return{top:0,bottom:0};var a=e.padding;return typeof a=="string"?{top:t,bottom:t}:{top:((r=a.top)!==null&&r!==void 0?r:0)+t,bottom:((n=a.bottom)!==null&&n!==void 0?n:0)+t}}),YC=q([Zt,dU,Dh,Th,(e,t,r)=>r],(e,t,r,n,a)=>{var o=n.padding;return a?[o.left,r.width-o.right]:[e.left+t.left,e.left+e.width-t.right]}),XC=q([Zt,ft,fU,Dh,Th,(e,t,r)=>r],(e,t,r,n,a,o)=>{var c=a.padding;return o?[n.height-c.bottom,c.top]:t==="horizontal"?[e.top+e.height-r.bottom,e.top+r.top]:[e.top+r.top,e.top+e.height-r.bottom]}),cc=(e,t,r,n)=>{var a;switch(t){case"xAxis":return YC(e,r,n);case"yAxis":return XC(e,r,n);case"zAxis":return(a=T0(e,r))===null||a===void 0?void 0:a.range;case"angleAxis":return IA(e);case"radiusAxis":return TA(e,r);default:return}},ZC=q([yr,cc],Hh),hU=q([cl,sU],VF),F0=q([yr,cl,hU,ZC],I0),JC=(e,t,r,n)=>{if(!(r==null||r.dataKey==null)){var a=r.type,o=r.scale,c=Xn(e,n);if(c&&(a==="number"||o!=="auto"))return t.map(u=>u.value)}},B0=q([ft,uc,lc,zt],JC),tm=q([F0],u0);q([F0],EB);q([F0,BB],yC);q([ll,L0,zt],GB);function eP(e,t){return e.idt.id?1:0}var rm=(e,t)=>t,nm=(e,t,r)=>r,mU=q(Mh,rm,nm,(e,t,r)=>e.filter(n=>n.orientation===t).filter(n=>n.mirror===r).sort(eP)),pU=q(Ih,rm,nm,(e,t,r)=>e.filter(n=>n.orientation===t).filter(n=>n.mirror===r).sort(eP)),tP=(e,t)=>({width:e.width,height:t.height}),gU=(e,t)=>{var r=typeof t.width=="number"?t.width:Ju;return{width:r,height:e.height}},vU=q(Zt,Pi,tP),yU=(e,t,r)=>{switch(t){case"top":return e.top;case"bottom":return r-e.bottom;default:return 0}},xU=(e,t,r)=>{switch(t){case"left":return e.left;case"right":return r-e.right;default:return 0}},bU=q(Ai,Zt,mU,rm,nm,(e,t,r,n,a)=>{var o={},c;return r.forEach(u=>{var f=tP(t,u);c==null&&(c=yU(t,n,e));var h=n==="top"&&!a||n==="bottom"&&a;o[u.id]=c-Number(h)*f.height,c+=(h?-1:1)*f.height}),o}),wU=q(Ei,Zt,pU,rm,nm,(e,t,r,n,a)=>{var o={},c;return r.forEach(u=>{var f=gU(t,u);c==null&&(c=xU(t,n,e));var h=n==="left"&&!a||n==="right"&&a;o[u.id]=c-Number(h)*f.width,c+=(h?-1:1)*f.width}),o}),kU=(e,t)=>{var r=Pi(e,t);if(r!=null)return bU(e,r.orientation,r.mirror)},jU=q([Zt,Pi,kU,(e,t)=>t],(e,t,r,n)=>{if(t!=null){var a=r==null?void 0:r[n];return a==null?{x:e.left,y:0}:{x:e.left,y:a}}}),SU=(e,t)=>{var r=Oi(e,t);if(r!=null)return wU(e,r.orientation,r.mirror)},NU=q([Zt,Oi,SU,(e,t)=>t],(e,t,r,n)=>{if(t!=null){var a=r==null?void 0:r[n];return a==null?{x:0,y:e.top}:{x:a,y:e.top}}}),EU=q(Zt,Oi,(e,t)=>{var r=typeof t.width=="number"?t.width:Ju;return{width:r,height:e.height}}),rP=(e,t,r,n)=>{if(r!=null){var a=r.allowDuplicatedCategory,o=r.type,c=r.dataKey,u=Xn(e,n),f=t.map(m=>m.value),h=f.filter(m=>m!=null);if(c&&u&&o==="category"&&a&&QE(h))return f}},U0=q([ft,uc,yr,zt],rP),jS=q([ft,DB,cl,tm,U0,B0,cc,z0,zt],(e,t,r,n,a,o,c,u,f)=>{if(t!=null){var h=Xn(e,f);return{angle:t.angle,interval:t.interval,minTickGap:t.minTickGap,orientation:t.orientation,tick:t.tick,tickCount:t.tickCount,tickFormatter:t.tickFormatter,ticks:t.ticks,type:t.type,unit:t.unit,axisType:f,categoricalDomain:o,duplicateDomain:a,isCategorical:h,niceTicks:u,range:c,realScaleType:r,scale:n}}}),AU=(e,t,r,n,a,o,c,u,f)=>{if(!(t==null||n==null)){var h=Xn(e,f),m=t.type,g=t.ticks,v=t.tickCount,b=r==="scaleBand"&&typeof n.bandwidth=="function"?n.bandwidth()/2:2,j=m==="category"&&n.bandwidth?n.bandwidth()/b:0;j=f==="angleAxis"&&o!=null&&o.length>=2?Jr(o[0]-o[1])*2*j:j;var k=g||a;return k?k.map((S,N)=>{var E=c?c.indexOf(S):S,A=n.map(E);return We(A)?{index:N,coordinate:A+j,value:S,offset:j}:null}).filter(Ar):h&&u?u.map((S,N)=>{var E=n.map(S);return We(E)?{coordinate:E+j,value:S,index:N,offset:j}:null}).filter(Ar):n.ticks?n.ticks(v).map((S,N)=>{var E=n.map(S);return We(E)?{coordinate:E+j,value:S,index:N,offset:j}:null}).filter(Ar):n.domain().map((S,N)=>{var E=n.map(S);return We(E)?{coordinate:E+j,value:c?c[S]:S,index:N,offset:j}:null}).filter(Ar)}},nP=q([ft,lc,cl,tm,z0,cc,U0,B0,zt],AU),CU=(e,t,r,n,a,o,c)=>{if(!(t==null||r==null||n==null||n[0]===n[1])){var u=Xn(e,c),f=t.tickCount,h=0;return h=c==="angleAxis"&&(n==null?void 0:n.length)>=2?Jr(n[0]-n[1])*2*h:h,u&&o?o.map((m,g)=>{var v=r.map(m);return We(v)?{coordinate:v+h,value:m,index:g,offset:h}:null}).filter(Ar):r.ticks?r.ticks(f).map((m,g)=>{var v=r.map(m);return We(v)?{coordinate:v+h,value:m,index:g,offset:h}:null}).filter(Ar):r.domain().map((m,g)=>{var v=r.map(m);return We(v)?{coordinate:v+h,value:a?a[m]:m,index:g,offset:h}:null}).filter(Ar)}},iP=q([ft,lc,tm,cc,U0,B0,zt],CU),aP=q(yr,tm,(e,t)=>{if(!(e==null||t==null))return Qf(Qf({},e),{},{scale:t})}),PU=q([yr,cl,$0,ZC],I0),OU=q([PU],u0);q((e,t,r)=>T0(e,r),OU,(e,t)=>{if(!(e==null||t==null))return Qf(Qf({},e),{},{scale:t})});var _U=q([ft,Mh,Ih],(e,t,r)=>{switch(e){case"horizontal":return t.some(n=>n.reversed)?"right-to-left":"left-to-right";case"vertical":return r.some(n=>n.reversed)?"bottom-to-top":"top-to-bottom";case"centric":case"radial":return"left-to-right";default:return}}),MU=(e,t,r)=>{var n;return(n=e.renderedTicks[t])===null||n===void 0?void 0:n[r]};q([MU],e=>{if(!(!e||e.length===0))return t=>{var r,n=1/0,a=e[0];for(var o of e){var c=Math.abs(o.coordinate-t);ce.options.defaultTooltipEventType,sP=e=>e.options.validateTooltipEventTypes;function lP(e,t,r){if(e==null)return t;var n=e?"axis":"item";return r==null?t:r.includes(n)?n:t}function dc(e,t){var r=oP(e),n=sP(e);return lP(t,r,n)}function IU(e){return Me(t=>dc(t,e))}var uP=(e,t)=>{var r,n=Number(t);if(!(Kn(n)||t==null))return n>=0?e==null||(r=e[n])===null||r===void 0?void 0:r.value:void 0},TU=e=>e.tooltip.settings,la={active:!1,index:null,dataKey:void 0,graphicalItemId:void 0,coordinate:void 0},DU={itemInteraction:{click:la,hover:la},axisInteraction:{click:la,hover:la},keyboardInteraction:la,syncInteraction:{active:!1,index:null,dataKey:void 0,label:void 0,coordinate:void 0,sourceViewBox:void 0,graphicalItemId:void 0},tooltipItemPayloads:[],settings:{shared:void 0,trigger:"hover",axisId:0,active:!1,defaultIndex:void 0}},cP=lr({name:"tooltip",initialState:DU,reducers:{addTooltipEntrySettings:{reducer(e,t){e.tooltipItemPayloads.push(t.payload)},prepare:st()},replaceTooltipEntrySettings:{reducer(e,t){var r=t.payload,n=r.prev,a=r.next,o=en(e).tooltipItemPayloads.indexOf(n);o>-1&&(e.tooltipItemPayloads[o]=a)},prepare:st()},removeTooltipEntrySettings:{reducer(e,t){var r=en(e).tooltipItemPayloads.indexOf(t.payload);r>-1&&e.tooltipItemPayloads.splice(r,1)},prepare:st()},setTooltipSettingsState(e,t){e.settings=t.payload},setActiveMouseOverItemIndex(e,t){e.syncInteraction.active=!1,e.syncInteraction.sourceViewBox=void 0,e.keyboardInteraction.active=!1,e.itemInteraction.hover.active=!0,e.itemInteraction.hover.index=t.payload.activeIndex,e.itemInteraction.hover.dataKey=t.payload.activeDataKey,e.itemInteraction.hover.graphicalItemId=t.payload.activeGraphicalItemId,e.itemInteraction.hover.coordinate=t.payload.activeCoordinate},mouseLeaveChart(e){e.itemInteraction.hover.active=!1,e.axisInteraction.hover.active=!1},mouseLeaveItem(e){e.itemInteraction.hover.active=!1},setActiveClickItemIndex(e,t){e.syncInteraction.active=!1,e.syncInteraction.sourceViewBox=void 0,e.itemInteraction.click.active=!0,e.keyboardInteraction.active=!1,e.itemInteraction.click.index=t.payload.activeIndex,e.itemInteraction.click.dataKey=t.payload.activeDataKey,e.itemInteraction.click.graphicalItemId=t.payload.activeGraphicalItemId,e.itemInteraction.click.coordinate=t.payload.activeCoordinate},setMouseOverAxisIndex(e,t){e.syncInteraction.active=!1,e.syncInteraction.sourceViewBox=void 0,e.axisInteraction.hover.active=!0,e.keyboardInteraction.active=!1,e.axisInteraction.hover.index=t.payload.activeIndex,e.axisInteraction.hover.dataKey=t.payload.activeDataKey,e.axisInteraction.hover.coordinate=t.payload.activeCoordinate},setMouseClickAxisIndex(e,t){e.syncInteraction.active=!1,e.syncInteraction.sourceViewBox=void 0,e.keyboardInteraction.active=!1,e.axisInteraction.click.active=!0,e.axisInteraction.click.index=t.payload.activeIndex,e.axisInteraction.click.dataKey=t.payload.activeDataKey,e.axisInteraction.click.coordinate=t.payload.activeCoordinate},setSyncInteraction(e,t){e.syncInteraction=t.payload},setKeyboardInteraction(e,t){e.keyboardInteraction.active=t.payload.active,e.keyboardInteraction.index=t.payload.activeIndex,e.keyboardInteraction.coordinate=t.payload.activeCoordinate}}}),ln=cP.actions,RU=ln.addTooltipEntrySettings,LU=ln.replaceTooltipEntrySettings,$U=ln.removeTooltipEntrySettings,zU=ln.setTooltipSettingsState,FU=ln.setActiveMouseOverItemIndex;ln.mouseLeaveItem;var dP=ln.mouseLeaveChart;ln.setActiveClickItemIndex;var fP=ln.setMouseOverAxisIndex,BU=ln.setMouseClickAxisIndex,gu=ln.setSyncInteraction,Xf=ln.setKeyboardInteraction,UU=cP.reducer;function SS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function Wd(e){for(var t=1;t{if(t==null)return la;var a=GU(e,t,r);if(a==null)return la;if(a.active)return a;if(e.keyboardInteraction.active)return e.keyboardInteraction;if(e.syncInteraction.active&&e.syncInteraction.index!=null)return e.syncInteraction;var o=e.settings.active===!0;if(VU(a)){if(o)return Wd(Wd({},a),{},{active:!0})}else if(n!=null)return{active:!0,coordinate:void 0,dataKey:void 0,index:n,graphicalItemId:void 0};return Wd(Wd({},la),{},{coordinate:a.coordinate})};function qU(e){if(typeof e=="number")return Number.isFinite(e)?e:void 0;if(e instanceof Date){var t=e.valueOf();return Number.isFinite(t)?t:void 0}var r=Number(e);return Number.isFinite(r)?r:void 0}function QU(e,t){var r=qU(e),n=t[0],a=t[1];if(r===void 0)return!1;var o=Math.min(n,a),c=Math.max(n,a);return r>=o&&r<=c}function YU(e,t,r){if(r==null||t==null)return!0;var n=Lt(e,t);return n==null||!Bn(r)?!0:QU(n,r)}var xu=(e,t,r,n)=>{var a=e==null?void 0:e.index;if(a==null)return null;var o=Number(a);if(!We(o))return a;var c=0,u=1/0;t.length>0&&(u=t.length-1);var f=Math.max(c,Math.min(o,u)),h=t[f];return h==null||YU(h,r,n)?String(f):null},mP=(e,t,r,n,a,o,c)=>{if(o!=null){var u=c[0],f=u==null?void 0:u.getPosition(o);if(f!=null)return f;var h=a==null?void 0:a[Number(o)];if(h)switch(r){case"horizontal":return{x:h.coordinate,y:(n.top+t)/2};default:return{x:(n.left+e)/2,y:h.coordinate}}}},pP=(e,t,r,n)=>{if(t==="axis")return e.tooltipItemPayloads;if(e.tooltipItemPayloads.length===0)return[];var a;if(r==="hover"?a=e.itemInteraction.hover.graphicalItemId:a=e.itemInteraction.click.graphicalItemId,e.syncInteraction.active&&a==null)return e.tooltipItemPayloads;if(a==null&&(n!=null||e.keyboardInteraction.active)){var o=e.tooltipItemPayloads[0];return o!=null?[o]:[]}return e.tooltipItemPayloads.filter(c=>{var u;return((u=c.settings)===null||u===void 0?void 0:u.graphicalItemId)===a})},gP=e=>e.options.tooltipPayloadSearcher,dl=e=>e.tooltip;function NS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function ES(e){for(var t=1;te(t)}function AS(e){if(typeof e=="string")return e}function nH(e){if(!(e==null||typeof e!="object")){var t="name"in e?eH(e.name):void 0,r="unit"in e?tH(e.unit):void 0,n="dataKey"in e?rH(e.dataKey):void 0,a="payload"in e?e.payload:void 0,o="color"in e?AS(e.color):void 0,c="fill"in e?AS(e.fill):void 0;return{name:t,unit:r,dataKey:n,payload:a,color:o,fill:c}}}function iH(e,t){return e??t}var vP=(e,t,r,n,a,o,c)=>{if(!(t==null||o==null)){var u=r.chartData,f=r.computedData,h=r.dataStartIndex,m=r.dataEndIndex,g=[];return e.reduce((v,b)=>{var j,k=b.dataDefinedOnItem,S=b.settings,N=iH(k,u),E=Array.isArray(N)?U5(N,h,m):N,A=(j=S==null?void 0:S.dataKey)!==null&&j!==void 0?j:n,P=S==null?void 0:S.nameKey,_;if(n&&Array.isArray(E)&&!Array.isArray(E[0])&&c==="axis"?_=YE(E,n,a):_=o(E,t,f,P),Array.isArray(_))_.forEach(D=>{var U,B,F=nH(D),Y=F==null?void 0:F.name,H=F==null?void 0:F.dataKey,pe=F==null?void 0:F.payload,ue=ES(ES({},S),{},{name:Y,unit:F==null?void 0:F.unit,color:(U=F==null?void 0:F.color)!==null&&U!==void 0?U:S==null?void 0:S.color,fill:(B=F==null?void 0:F.fill)!==null&&B!==void 0?B:S==null?void 0:S.fill});v.push(wk({tooltipEntrySettings:ue,dataKey:H,payload:pe,value:Lt(pe,H),name:Y==null?void 0:String(Y)}))});else{var O;v.push(wk({tooltipEntrySettings:S,dataKey:A,payload:_,value:Lt(_,A),name:(O=Lt(_,P))!==null&&O!==void 0?O:S==null?void 0:S.name}))}return v},g)}},H0=q([_t,kC,t0],vC),aH=q([e=>e.graphicalItems.cartesianItems,e=>e.graphicalItems.polarItems],(e,t)=>[...e,...t]),oH=q([Ft,ol],jC),Io=q([aH,_t,oH],NC,{memoizeOptions:{resultEqualityCheck:qh}}),sH=q([Io],e=>e.filter(l0)),yP=q([Io],CC,{memoizeOptions:{resultEqualityCheck:qh}}),lH=q([Io],e=>e.some(t=>!t.data)),No=q([yP,Nn],OC),uH=q([sH,Nn,_t],RA),W0=q([No,_t,Io,Nn,lH,yP],_C),xP=q([_t],R0),cH=q([_t],e=>e.allowDataOverflow),bP=q([xP,cH],yA),dH=q([Io],e=>e.filter(l0)),fH=q([uH,dH,Uh,PA],IC),hH=q([fH,Nn,Ft,bP],DC),mH=q([Io],AC),pH=q([No,_t,mH,L0,Ft,SF],$C,{memoizeOptions:{resultEqualityCheck:Vh}}),gH=q([zC,Ft,ol],ul),vH=q([gH,Ft],UC),yH=q([FC,Ft,ol],ul),xH=q([yH,Ft],HC),bH=q([BC,Ft,ol],ul),wH=q([bH,Ft],WC),kH=q([vH,wH,xH],Yf),jH=q([_t,xP,bP,hH,pH,kH,ft,Ft],KC),Zs=q([_t,ft,No,W0,Uh,Ft,jH],GC),SH=q([Zs,_t,H0],VC),NH=q([_t,Zs,SH,Ft],qC),wP=e=>{var t=Ft(e),r=ol(e),n=!1;return cc(e,t,r,n)},kP=q([_t,wP],Hh),EH=q([_t,H0,NH,kP],I0),jP=q([EH],u0),AH=q([ft,W0,_t,Ft],rP),CH=q([ft,W0,_t,Ft],JC),PH=(e,t,r,n,a,o,c,u)=>{if(t){var f=t.type,h=Xn(e,u);if(n){var m=r==="scaleBand"&&n.bandwidth?n.bandwidth()/2:2,g=f==="category"&&n.bandwidth?n.bandwidth()/m:0;return g=u==="angleAxis"&&a!=null&&(a==null?void 0:a.length)>=2?Jr(a[0]-a[1])*2*g:g,h&&c?c.map((v,b)=>{var j=n.map(v);return We(j)?{coordinate:j+g,value:v,index:b,offset:g}:null}).filter(Ar):n.domain().map((v,b)=>{var j=n.map(v);return We(j)?{coordinate:j+g,value:o?o[v]:v,index:b,offset:g}:null}).filter(Ar)}}},_i=q([ft,_t,H0,jP,wP,AH,CH,Ft],PH),K0=q([oP,sP,TU],(e,t,r)=>lP(r.shared,e,t)),SP=e=>e.tooltip.settings.trigger,G0=e=>e.tooltip.settings.defaultIndex,fc=q([dl,K0,SP,G0],hP),Fu=q([fc,No,Xs,Zs],xu),NP=q([_i,Fu],uP),OH=q([fc],e=>{if(e)return e.dataKey}),_H=q([fc],e=>{if(e)return e.graphicalItemId}),EP=q([dl,K0,SP,G0],pP),MH=q([Ei,Ai,ft,Zt,_i,G0,EP],mP),IH=q([fc,MH],(e,t)=>e!=null&&e.coordinate?e.coordinate:t),TH=q([fc],e=>{var t;return(t=e==null?void 0:e.active)!==null&&t!==void 0?t:!1}),DH=q([EP,Fu,Nn,Xs,NP,gP,K0],vP),RH=q([DH],e=>{if(e!=null){var t=e.map(r=>r.payload).filter(r=>r!=null);return Array.from(new Set(t))}});function CS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function PS(e){for(var t=1;tMe(_t),BH=()=>{var e=FH(),t=Me(_i),r=Me(jP);return Af(!e||!r?void 0:PS(PS({},e),{},{scale:r}),t)};function OS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function ds(e){for(var t=1;t{var a=t.find(o=>o&&o.index===r);if(a){if(e==="horizontal")return{x:a.coordinate,y:n.relativeY};if(e==="vertical")return{x:n.relativeX,y:a.coordinate}}return{x:0,y:0}},GH=(e,t,r,n)=>{var a=t.find(h=>h&&h.index===r);if(a){if(e==="centric"){var o=a.coordinate,c=n.radius;return ds(ds(ds({},n),Qt(n.cx,n.cy,c,o)),{},{angle:o,radius:c})}var u=a.coordinate,f=n.angle;return ds(ds(ds({},n),Qt(n.cx,n.cy,u,f)),{},{angle:f,radius:u})}return{angle:0,clockWise:!1,cx:0,cy:0,endAngle:0,innerRadius:0,outerRadius:0,radius:0,startAngle:0,x:0,y:0}};function VH(e,t){var r=e.relativeX,n=e.relativeY;return r>=t.left&&r<=t.left+t.width&&n>=t.top&&n<=t.top+t.height}var AP=(e,t,r,n,a)=>{var o,c=(o=t==null?void 0:t.length)!==null&&o!==void 0?o:0;if(c<=1||e==null)return 0;if(n==="angleAxis"&&a!=null&&Math.abs(Math.abs(a[1]-a[0])-360)<=1e-6)for(var u=0;u0?(f=r[u-1])===null||f===void 0?void 0:f.coordinate:(h=r[c-1])===null||h===void 0?void 0:h.coordinate,j=(m=r[u])===null||m===void 0?void 0:m.coordinate,k=u>=c-1?(g=r[0])===null||g===void 0?void 0:g.coordinate:(v=r[u+1])===null||v===void 0?void 0:v.coordinate,S=void 0;if(!(b==null||j==null||k==null))if(Jr(j-b)!==Jr(k-j)){var N=[];if(Jr(k-j)===Jr(a[1]-a[0])){S=k;var E=j+a[1]-a[0];N[0]=Math.min(E,(E+b)/2),N[1]=Math.max(E,(E+b)/2)}else{S=b;var A=k+a[1]-a[0];N[0]=Math.min(j,(A+j)/2),N[1]=Math.max(j,(A+j)/2)}var P=[Math.min(j,(S+j)/2),Math.max(j,(S+j)/2)];if(e>P[0]&&e<=P[1]||e>=N[0]&&e<=N[1]){var _;return(_=r[u])===null||_===void 0?void 0:_.index}}else{var O=Math.min(b,k),D=Math.max(b,k);if(e>(O+j)/2&&e<=(D+j)/2){var U;return(U=r[u])===null||U===void 0?void 0:U.index}}}else if(t)for(var B=0;B(F.coordinate+H.coordinate)/2||B>0&&B(F.coordinate+H.coordinate)/2&&e<=(F.coordinate+Y.coordinate)/2)return F.index}}return-1},CP=()=>Me(t0),V0=(e,t)=>t,PP=(e,t,r)=>r,q0=(e,t,r,n)=>n,qH=q(_i,e=>wh(e,t=>t.coordinate)),Q0=q([dl,V0,PP,q0],hP),Y0=q([Q0,No,Xs,Zs],xu),QH=(e,t,r)=>{if(t!=null){var n=dl(e);return t==="axis"?r==="hover"?n.axisInteraction.hover.dataKey:n.axisInteraction.click.dataKey:r==="hover"?n.itemInteraction.hover.dataKey:n.itemInteraction.click.dataKey}},OP=q([dl,V0,PP,q0],pP),Zf=q([Ei,Ai,ft,Zt,_i,q0,OP],mP),YH=q([Q0,Zf],(e,t)=>{var r;return(r=e.coordinate)!==null&&r!==void 0?r:t}),_P=q([_i,Y0],uP),XH=q([OP,Y0,Nn,Xs,_P,gP,V0],vP),ZH=q([Q0,Y0],(e,t)=>({isActive:e.active&&t!=null,activeIndex:t})),JH=(e,t,r,n,a,o,c)=>{if(!(!e||!r||!n||!a)&&VH(e,c)){var u=fz(e,t),f=AP(u,o,a,r,n),h=KH(t,a,f,e);return{activeIndex:String(f),activeCoordinate:h}}},eW=(e,t,r,n,a,o,c)=>{if(!(!e||!n||!a||!o||!r)){var u=pF(e,r);if(u){var f=hz(u,t),h=AP(f,c,o,n,a),m=GH(t,o,h,u);return{activeIndex:String(h),activeCoordinate:m}}}},tW=(e,t,r,n,a,o,c,u)=>{if(!(!e||!t||!n||!a||!o))return t==="horizontal"||t==="vertical"?JH(e,t,n,a,o,c,u):eW(e,t,r,n,a,o,c)},rW=q(e=>e.zIndex.zIndexMap,(e,t)=>t,(e,t,r)=>r,(e,t,r)=>{if(t!=null){var n=e[t];if(n!=null)return r?n.panoramaElement:n.element}}),nW=q(e=>e.zIndex.zIndexMap,e=>{var t=Object.keys(e).map(n=>parseInt(n,10)).concat(Object.values(pr)),r=Array.from(new Set(t));return r.sort((n,a)=>n-a)},{memoizeOptions:{resultEqualityCheck:GF}});function _S(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function MS(e){for(var t=1;tMS(MS({},e),{},{[t]:{element:void 0,panoramaElement:void 0,consumers:0}}),sW)},uW=new Set(Object.values(pr));function cW(e){return uW.has(e)}var MP=lr({name:"zIndex",initialState:lW,reducers:{registerZIndexPortal:{reducer:(e,t)=>{var r=t.payload.zIndex;e.zIndexMap[r]?e.zIndexMap[r].consumers+=1:e.zIndexMap[r]={consumers:1,element:void 0,panoramaElement:void 0}},prepare:st()},unregisterZIndexPortal:{reducer:(e,t)=>{var r=t.payload.zIndex;e.zIndexMap[r]&&(e.zIndexMap[r].consumers-=1,e.zIndexMap[r].consumers<=0&&!cW(r)&&delete e.zIndexMap[r])},prepare:st()},registerZIndexPortalElement:{reducer:(e,t)=>{var r=t.payload,n=r.zIndex,a=r.element,o=r.isPanorama;e.zIndexMap[n]?o?e.zIndexMap[n].panoramaElement=a:e.zIndexMap[n].element=a:e.zIndexMap[n]={consumers:0,element:o?void 0:a,panoramaElement:o?a:void 0}},prepare:st()},unregisterZIndexPortalElement:{reducer:(e,t)=>{var r=t.payload.zIndex;e.zIndexMap[r]&&(t.payload.isPanorama?e.zIndexMap[r].panoramaElement=void 0:e.zIndexMap[r].element=void 0)},prepare:st()}}}),im=MP.actions,dW=im.registerZIndexPortal,Dg=im.unregisterZIndexPortal,fW=im.registerZIndexPortalElement,hW=im.unregisterZIndexPortalElement,mW=MP.reducer;function Mi(e){var t=e.zIndex,r=e.children,n=Xz(),a=n&&t!==void 0&&t!==0,o=Pr(),c=y.useRef(void 0),u=y.useRef(new Set),f=Nt(),h=Me(g=>rW(g,t,o));if(y.useLayoutEffect(()=>{if(!a){var g=u.current;g.forEach(b=>{f(Dg({zIndex:b}))}),g.clear(),c.current=void 0;return}if(u.current.has(t)||(f(dW({zIndex:t})),u.current.add(t)),h){c.current=h;var v=u.current;v.forEach(b=>{b!==t&&(f(Dg({zIndex:b})),v.delete(b))})}},[f,t,a,h]),y.useLayoutEffect(()=>{var g=u.current;return()=>{g.forEach(v=>{f(Dg({zIndex:v}))}),g.clear()}},[f]),!a)return r;var m=h??c.current;return m?fh.createPortal(r,m):null}function ay(){return ay=Object.assign?Object.assign.bind():function(e){for(var t=1;ty.useContext(IP),Rg={exports:{}},TS;function kW(){return TS||(TS=1,(function(e){var t=Object.prototype.hasOwnProperty,r="~";function n(){}Object.create&&(n.prototype=Object.create(null),new n().__proto__||(r=!1));function a(f,h,m){this.fn=f,this.context=h,this.once=m||!1}function o(f,h,m,g,v){if(typeof m!="function")throw new TypeError("The listener must be a function");var b=new a(m,g||f,v),j=r?r+h:h;return f._events[j]?f._events[j].fn?f._events[j]=[f._events[j],b]:f._events[j].push(b):(f._events[j]=b,f._eventsCount++),f}function c(f,h){--f._eventsCount===0?f._events=new n:delete f._events[h]}function u(){this._events=new n,this._eventsCount=0}u.prototype.eventNames=function(){var h=[],m,g;if(this._eventsCount===0)return h;for(g in m=this._events)t.call(m,g)&&h.push(r?g.slice(1):g);return Object.getOwnPropertySymbols?h.concat(Object.getOwnPropertySymbols(m)):h},u.prototype.listeners=function(h){var m=r?r+h:h,g=this._events[m];if(!g)return[];if(g.fn)return[g.fn];for(var v=0,b=g.length,j=new Array(b);v{if(t&&Array.isArray(e)){var r=Number.parseInt(t,10);if(!Kn(r))return e[r]}},EW={chartName:"",tooltipPayloadSearcher:()=>{},eventEmitter:void 0,defaultTooltipEventType:"axis"},TP=lr({name:"options",initialState:EW,reducers:{createEventEmitter:e=>{e.eventEmitter==null&&(e.eventEmitter=Symbol("rechartsEventEmitter"))}}}),AW=TP.reducer,CW=TP.actions.createEventEmitter;function PW(e){return e.tooltip.syncInteraction}var OW={chartData:void 0,computedData:void 0,dataStartIndex:0,dataEndIndex:0},DP=lr({name:"chartData",initialState:OW,reducers:{setChartData(e,t){if(e.chartData=t.payload,t.payload==null){e.dataStartIndex=0,e.dataEndIndex=0;return}t.payload.length>0&&e.dataEndIndex!==t.payload.length-1&&(e.dataEndIndex=t.payload.length-1)},setComputedData(e,t){e.computedData=t.payload},setDataStartEndIndexes(e,t){var r=t.payload,n=r.startIndex,a=r.endIndex;n!=null&&(e.dataStartIndex=n),a!=null&&(e.dataEndIndex=a)}}}),X0=DP.actions,RS=X0.setChartData,_W=X0.setDataStartEndIndexes;X0.setComputedData;var MW=DP.reducer,IW=["x","y"];function LS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function fs(e){for(var t=1;tf.rootProps.className);y.useEffect(()=>{if(e==null)return rl;var f=(h,m,g)=>{if(t!==g&&e===h){if(m.payload.active===!1){r(gu({active:!1,coordinate:void 0,dataKey:void 0,index:null,label:void 0,sourceViewBox:void 0,graphicalItemId:void 0}));return}if(n==="index"){var v;if(c&&m!==null&&m!==void 0&&(v=m.payload)!==null&&v!==void 0&&v.coordinate&&m.payload.sourceViewBox){var b=m.payload.coordinate,j=b.x,k=b.y,S=LW(b,IW),N=m.payload.sourceViewBox,E=N.x,A=N.y,P=N.width,_=N.height,O=fs(fs({},S),{},{x:c.x+(P?(j-E)/P:0)*c.width,y:c.y+(_?(k-A)/_:0)*c.height});r(fs(fs({},m),{},{payload:fs(fs({},m.payload),{},{coordinate:O})}))}else r(m);return}if(a!=null){var D;if(typeof n=="function"){var U={activeTooltipIndex:m.payload.index==null?void 0:Number(m.payload.index),isTooltipActive:m.payload.active,activeIndex:m.payload.index==null?void 0:Number(m.payload.index),activeLabel:m.payload.label,activeDataKey:m.payload.dataKey,activeCoordinate:m.payload.coordinate},B=n(a,U);D=a[B]}else n==="value"&&(D=a.find(se=>String(se.value)===m.payload.label));var F=m.payload.coordinate;if(F==null||c==null){r(gu({active:!1,coordinate:void 0,dataKey:void 0,index:null,label:void 0,sourceViewBox:void 0,graphicalItemId:void 0}));return}if(D==null){r(gu({active:!1,coordinate:void 0,dataKey:void 0,index:null,label:void 0,sourceViewBox:m.payload.sourceViewBox,graphicalItemId:void 0}));return}var Y=F.x,H=F.y,pe=Math.min(Y,c.x+c.width),ue=Math.min(H,c.y+c.height),he={x:o==="horizontal"?D.coordinate:pe,y:o==="horizontal"?ue:D.coordinate},ae=gu({active:m.payload.active,coordinate:he,dataKey:m.payload.dataKey,index:String(D.index),label:m.payload.label,sourceViewBox:m.payload.sourceViewBox,graphicalItemId:m.payload.graphicalItemId});r(ae)}}};return Bu.on(oy,f),()=>{Bu.off(oy,f)}},[u,r,t,e,n,a,o,c])}function FW(){var e=Me(r0),t=Me(n0),r=Nt();y.useEffect(()=>{if(e==null)return rl;var n=(a,o,c)=>{t!==c&&e===a&&r(_W(o))};return Bu.on(DS,n),()=>{Bu.off(DS,n)}},[r,t,e])}function BW(){var e=Nt();y.useEffect(()=>{e(CW())},[e]),zW(),FW()}function UW(e,t,r,n,a,o){var c=Me(j=>QH(j,e,t)),u=Me(_H),f=Me(n0),h=Me(r0),m=Me(OA),g=Me(PW),v=(g==null?void 0:g.sourceViewBox)!=null,b=Rh();y.useEffect(()=>{if(!v&&h!=null&&f!=null){var j=gu({active:o,coordinate:r,dataKey:c,index:a,label:typeof n=="number"?String(n):n,sourceViewBox:b,graphicalItemId:u});Bu.emit(oy,h,j,f)}},[v,r,c,u,a,n,f,h,m,o,b])}function $S(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function zS(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);r{D(zU({shared:E,trigger:A,axisId:O,active:a,defaultIndex:U}))},[D,E,A,O,a,U]);var B=Rh(),F=uA(),Y=IU(E),H=(t=Me(_e=>ZH(_e,Y,A,U)))!==null&&t!==void 0?t:{},pe=H.activeIndex,ue=H.isActive,he=Me(_e=>XH(_e,Y,A,U)),ae=Me(_e=>_P(_e,Y,A,U)),se=Me(_e=>YH(_e,Y,A,U)),X=he,te=wW(),J=(r=a??ue)!==null&&r!==void 0?r:!1,I=ZL([X,J]),M=GW(I,2),K=M[0],ne=M[1],Z=Y==="axis"?ae:void 0;UW(Y,A,se,Z,pe,J);var me=_??te;if(me==null||B==null||Y==null)return null;var ge=X??BS;J||(ge=BS),h&&ge.length&&(ge=wL(ge.filter(_e=>_e.value!=null&&(_e.hide!==!0||n.includeHidden)),v,XW));var Pe=ge.length>0,re=zS(zS({},n),{},{payload:ge,label:Z,active:J,activeIndex:pe,coordinate:se,accessibilityLayer:F}),xe=y.createElement(u8,{allowEscapeViewBox:o,animationDuration:c,animationEasing:u,isAnimationActive:m,active:J,coordinate:se,hasPayload:Pe,offset:g,position:b,reverseDirection:j,useTranslate3d:k,viewBox:B,wrapperStyle:S,lastBoundingBox:K,innerRef:ne,hasPortalFromProps:!!_},ZW(f,re));return y.createElement(y.Fragment,null,fh.createPortal(xe,me),J&&y.createElement(bW,{cursor:N,tooltipEventType:Y,coordinate:se,payload:ge,index:pe}))}function tK(e,t,r){return(t=rK(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function rK(e){var t=nK(e,"string");return typeof t=="symbol"?t:t+""}function nK(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}class iK{constructor(t){tK(this,"cache",new Map),this.maxSize=t}get(t){var r=this.cache.get(t);return r!==void 0&&(this.cache.delete(t),this.cache.set(t,r)),r}set(t,r){if(this.cache.has(t))this.cache.delete(t);else if(this.cache.size>=this.maxSize){var n=this.cache.keys().next().value;n!=null&&this.cache.delete(n)}this.cache.set(t,r)}clear(){this.cache.clear()}size(){return this.cache.size}}function US(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function aK(e){for(var t=1;t{try{var r=document.getElementById(WS);r||(r=document.createElement("span"),r.setAttribute("id",WS),r.setAttribute("aria-hidden","true"),document.body.appendChild(r)),Object.assign(r.style,cK,t),r.textContent="".concat(e);var n=r.getBoundingClientRect();return{width:n.width,height:n.height}}catch{return{width:0,height:0}}},bu=function(t){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(t==null||nc.isSsr)return{width:0,height:0};if(!RP.enableCache)return KS(t,r);var n=dK(t,r),a=HS.get(n);if(a)return a;var o=KS(t,r);return HS.set(n,o),o},LP;function Jf(e,t){return pK(e)||mK(e,t)||hK(e,t)||fK()}function fK(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function hK(e,t){if(e){if(typeof e=="string")return GS(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?GS(e,t):void 0}}function GS(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);re.length)&&(t=e.length);for(var r=0,n=Array(t);r{var t=e.children,r=e.breakAll,n=e.style;try{var a=[];Yt(t)||(r?a=t.toString().split(""):a=t.toString().split(zP));var o=a.map(u=>({word:u,width:bu(u,n).width})),c=r?0:bu(" ",n).width;return{wordsWithComputedWidth:o,spaceWidth:c}}catch{return null}};function BP(e){return e==="start"||e==="middle"||e==="end"||e==="inherit"}function DK(e){return Yt(e)||typeof e=="string"||typeof e=="number"||typeof e=="boolean"}var UP=(e,t,r,n)=>e.reduce((a,o)=>{var c=o.word,u=o.width,f=a[a.length-1];if(f&&u!=null&&(t==null||n||f.width+u+re.reduce((t,r)=>t.width>r.width?t:r),RK="…",JS=(e,t,r,n,a,o,c,u)=>{var f=e.slice(0,t),h=FP({breakAll:r,style:n,children:f+RK});if(!h)return[!1,[]];var m=UP(h.wordsWithComputedWidth,o,c,u),g=m.length>a||HP(m).width>Number(o);return[g,m]},LK=(e,t,r,n,a)=>{var o=e.maxLines,c=e.children,u=e.style,f=e.breakAll,h=Ee(o),m=String(c),g=UP(t,n,r,a);if(!h||a)return g;var v=g.length>o||HP(g).width>Number(n);if(!v)return g;for(var b=0,j=m.length-1,k=0,S;b<=j&&k<=m.length-1;){var N=Math.floor((b+j)/2),E=N-1,A=JS(m,E,f,u,o,n,r,a),P=XS(A,2),_=P[0],O=P[1],D=JS(m,N,f,u,o,n,r,a),U=XS(D,1),B=U[0];if(!_&&!B&&(b=N+1),_&&B&&(j=N-1),!_&&B){S=O;break}k++}return S||g},e2=e=>{var t=Yt(e)?[]:e.toString().split(zP);return[{words:t,width:void 0}]},$K=e=>{var t=e.width,r=e.scaleToFit,n=e.children,a=e.style,o=e.breakAll,c=e.maxLines;if((t||r)&&!nc.isSsr){var u,f,h=FP({breakAll:o,children:n,style:a});if(h){var m=h.wordsWithComputedWidth,g=h.spaceWidth;u=m,f=g}else return e2(n);return LK({breakAll:o,children:n,maxLines:c,style:a},u,f,t,!!r)}return e2(n)},WP="#808080",zK={angle:0,breakAll:!1,capHeight:"0.71em",fill:WP,lineHeight:"1em",scaleToFit:!1,textAnchor:"start",verticalAnchor:"end",x:0,y:0},Z0=y.forwardRef((e,t)=>{var r=on(e,zK),n=r.x,a=r.y,o=r.lineHeight,c=r.capHeight,u=r.fill,f=r.scaleToFit,h=r.textAnchor,m=r.verticalAnchor,g=YS(r,CK),v=y.useMemo(()=>$K({breakAll:g.breakAll,children:g.children,maxLines:g.maxLines,scaleToFit:f,style:g.style,width:g.width}),[g.breakAll,g.children,g.maxLines,f,g.style,g.width]),b=g.dx,j=g.dy,k=g.angle,S=g.className,N=g.breakAll,E=YS(g,PK);if(!Gn(n)||!Gn(a)||v.length===0)return null;var A=Number(n)+(Ee(b)?b:0),P=Number(a)+(Ee(j)?j:0);if(!We(A)||!We(P))return null;var _;switch(m){case"start":_=Lg("calc(".concat(c,")"));break;case"middle":_=Lg("calc(".concat((v.length-1)/2," * -").concat(o," + (").concat(c," / 2))"));break;default:_=Lg("calc(".concat(v.length-1," * -").concat(o,")"));break}var O=[],D=v[0];if(f&&D!=null){var U=D.width,B=g.width;O.push("scale(".concat(Ee(B)&&Ee(U)?B/U:1,")"))}return k&&O.push("rotate(".concat(k,", ").concat(A,", ").concat(P,")")),O.length&&(E.transform=O.join(" ")),y.createElement("text",sy({},rn(E),{ref:t,x:A,y:P,className:nt("recharts-text",S),textAnchor:h,fill:u.includes("url")?WP:u}),v.map((F,Y)=>{var H=F.words.join(N?"":" ");return y.createElement("tspan",{x:A,dy:Y===0?_:o,key:"".concat(H,"-").concat(Y)},H)}))});Z0.displayName="Text";function t2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function Tn(e){for(var t=1;t{var t=e.viewBox,r=e.position,n=e.offset,a=n===void 0?0:n,o=e.parentViewBox,c=Gy(t),u=c.x,f=c.y,h=c.height,m=c.upperWidth,g=c.lowerWidth,v=u,b=u+(m-g)/2,j=(v+b)/2,k=(m+g)/2,S=v+m/2,N=h>=0?1:-1,E=N*a,A=N>0?"end":"start",P=N>0?"start":"end",_=m>=0?1:-1,O=_*a,D=_>0?"end":"start",U=_>0?"start":"end",B=o;if(r==="top"){var F={x:v+m/2,y:f-E,horizontalAnchor:"middle",verticalAnchor:A};return B&&(F.height=Math.max(f-B.y,0),F.width=m),F}if(r==="bottom"){var Y={x:b+g/2,y:f+h+E,horizontalAnchor:"middle",verticalAnchor:P};return B&&(Y.height=Math.max(B.y+B.height-(f+h),0),Y.width=g),Y}if(r==="left"){var H={x:j-O,y:f+h/2,horizontalAnchor:D,verticalAnchor:"middle"};return B&&(H.width=Math.max(H.x-B.x,0),H.height=h),H}if(r==="right"){var pe={x:j+k+O,y:f+h/2,horizontalAnchor:U,verticalAnchor:"middle"};return B&&(pe.width=Math.max(B.x+B.width-pe.x,0),pe.height=h),pe}var ue=B?{width:k,height:h}:{};return r==="insideLeft"?Tn({x:j+O,y:f+h/2,horizontalAnchor:U,verticalAnchor:"middle"},ue):r==="insideRight"?Tn({x:j+k-O,y:f+h/2,horizontalAnchor:D,verticalAnchor:"middle"},ue):r==="insideTop"?Tn({x:v+m/2,y:f+E,horizontalAnchor:"middle",verticalAnchor:P},ue):r==="insideBottom"?Tn({x:b+g/2,y:f+h-E,horizontalAnchor:"middle",verticalAnchor:A},ue):r==="insideTopLeft"?Tn({x:v+O,y:f+E,horizontalAnchor:U,verticalAnchor:P},ue):r==="insideTopRight"?Tn({x:v+m-O,y:f+E,horizontalAnchor:D,verticalAnchor:P},ue):r==="insideBottomLeft"?Tn({x:b+O,y:f+h-E,horizontalAnchor:U,verticalAnchor:A},ue):r==="insideBottomRight"?Tn({x:b+g-O,y:f+h-E,horizontalAnchor:D,verticalAnchor:A},ue):r&&typeof r=="object"&&(Ee(r.x)||bo(r.x))&&(Ee(r.y)||bo(r.y))?Tn({x:u+Sa(r.x,k),y:f+Sa(r.y,h),horizontalAnchor:"end",verticalAnchor:"end"},ue):Tn({x:S,y:f+h/2,horizontalAnchor:"middle",verticalAnchor:"middle"},ue)},WK=["labelRef"],KK=["content"];function r2(e,t){if(e==null)return{};var r,n,a=GK(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n{var t=e.x,r=e.y,n=e.upperWidth,a=e.lowerWidth,o=e.width,c=e.height,u=e.children,f=y.useMemo(()=>({x:t,y:r,upperWidth:n,lowerWidth:a,width:o,height:c}),[t,r,n,a,o,c]);return y.createElement(KP.Provider,{value:f},u)},GP=()=>{var e=y.useContext(KP),t=Rh();return e||(t?Gy(t):void 0)},XK=y.createContext(null),ZK=()=>{var e=y.useContext(XK),t=Me(DA);return e||t},JK=e=>{var t=e.value,r=e.formatter,n=Yt(e.children)?t:e.children;return typeof r=="function"?r(n):n},J0=e=>e!=null&&typeof e=="function",eG=(e,t)=>{var r=Jr(t-e),n=Math.min(Math.abs(t-e),360);return r*n},tG=(e,t,r,n,a)=>{var o=e.offset,c=e.className,u=a.cx,f=a.cy,h=a.innerRadius,m=a.outerRadius,g=a.startAngle,v=a.endAngle,b=a.clockWise,j=(h+m)/2,k=eG(g,v),S=k>=0?1:-1,N,E;switch(t){case"insideStart":N=g+S*o,E=b;break;case"insideEnd":N=v-S*o,E=!b;break;case"end":N=v+S*o,E=b;break;default:throw new Error("Unsupported position ".concat(t))}E=k<=0?E:!E;var A=Qt(u,f,j,N),P=Qt(u,f,j,N+(E?1:-1)*359),_="M".concat(A.x,",").concat(A.y,` + A`,",",",0,0,",",",",","Z"])),Y.x,Y.y,o,o,+(m<0),F.x,F.y,n,n,+(pe>180),+(m>0),O.x,O.y,o,o,+(m<0),D.x,D.y)}else P+=Gt(Ej||(Ej=eo(["L",",","Z"])),t,r);return P},yF={cx:0,cy:0,innerRadius:0,outerRadius:0,startAngle:0,endAngle:0,cornerRadius:0,forceCornerRadius:!1,cornerIsExternal:!1},xF=e=>{var t=on(e,yF),r=t.cx,n=t.cy,a=t.innerRadius,o=t.outerRadius,c=t.cornerRadius,u=t.forceCornerRadius,f=t.cornerIsExternal,h=t.startAngle,m=t.endAngle,g=t.className;if(o0&&Math.abs(h-m)<360?k=vF({cx:r,cy:n,innerRadius:a,outerRadius:o,cornerRadius:Math.min(j,b/2),forceCornerRadius:u,cornerIsExternal:f,startAngle:h,endAngle:m}):k=gA({cx:r,cy:n,innerRadius:a,outerRadius:o,startAngle:h,endAngle:m}),y.createElement("path",Yv({},rn(t),{className:v,d:k}))};function bF(e,t,r){if(e==="horizontal")return[{x:t.x,y:r.top},{x:t.x,y:r.top+r.height}];if(e==="vertical")return[{x:r.left,y:t.y},{x:r.left+r.width,y:t.y}];if(XE(t)){if(e==="centric"){var n=t.cx,a=t.cy,o=t.innerRadius,c=t.outerRadius,u=t.angle,f=Qt(n,a,o,u),h=Qt(n,a,c,u);return[{x:f.x,y:f.y},{x:h.x,y:h.y}]}return pA(t)}}function wF(e){return d5(e)?NaN:Number(e)}function Eg(e){return e?(e=wF(e),e===1/0||e===-1/0?(e<0?-1:1)*Number.MAX_VALUE:e===e?e:0):e===0?e:0}function vA(e,t,r){r&&typeof r!="number"&&Ov(e,t,r)&&(t=r=void 0),e=Eg(e),t===void 0?(t=e,e=0):t=Eg(t),r=r===void 0?ee.chartData,Xy=q([Nn],e=>{var t=e.chartData!=null?e.chartData.length-1:0;return{chartData:e.chartData,computedData:e.computedData,dataEndIndex:t,dataStartIndex:0}}),Bh=(e,t,r,n)=>n?Xy(e):Nn(e),kF=(e,t,r)=>r?Xy(e):Nn(e),jF=q([Bh],e=>{var t=e.chartData,r=e.dataStartIndex,n=e.dataEndIndex;return t!=null?t.slice(r,n+1):[]});q([Xy],e=>{var t=e.chartData,r=e.dataStartIndex,n=e.dataEndIndex;return t!=null?t.slice(r,n+1):[]});var SF=q([Nn],e=>{var t=e.chartData,r=e.dataStartIndex,n=e.dataEndIndex;return t!=null?t.slice(r,n+1):[]});function Zy(e,t){return CF(e)||AF(e,t)||EF(e,t)||NF()}function NF(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function EF(e,t){if(e){if(typeof e=="string")return Aj(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Aj(e,t):void 0}}function Aj(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);re.e^o.s<0?1:-1;for(n=o.d.length,a=e.d.length,t=0,r=ne.d[t]^o.s<0?1:-1;return n===a?0:n>a^o.s<0?1:-1};we.decimalPlaces=we.dp=function(){var e=this,t=e.d.length-1,r=(t-e.e)*lt;if(t=e.d[t],t)for(;t%10==0;t/=10)r--;return r<0?0:r};we.dividedBy=we.div=function(e){return yi(this,new this.constructor(e))};we.dividedToIntegerBy=we.idiv=function(e){var t=this,r=t.constructor;return tt(yi(t,new r(e),0,1),r.precision)};we.equals=we.eq=function(e){return!this.cmp(e)};we.exponent=function(){return St(this)};we.greaterThan=we.gt=function(e){return this.cmp(e)>0};we.greaterThanOrEqualTo=we.gte=function(e){return this.cmp(e)>=0};we.isInteger=we.isint=function(){return this.e>this.d.length-2};we.isNegative=we.isneg=function(){return this.s<0};we.isPositive=we.ispos=function(){return this.s>0};we.isZero=function(){return this.s===0};we.lessThan=we.lt=function(e){return this.cmp(e)<0};we.lessThanOrEqualTo=we.lte=function(e){return this.cmp(e)<1};we.logarithm=we.log=function(e){var t,r=this,n=r.constructor,a=n.precision,o=a+5;if(e===void 0)e=new n(10);else if(e=new n(e),e.s<1||e.eq(Fr))throw Error(an+"NaN");if(r.s<1)throw Error(an+(r.s?"NaN":"-Infinity"));return r.eq(Fr)?new n(0):(dt=!1,t=yi(Tu(r,o),Tu(e,o),o),dt=!0,tt(t,a))};we.minus=we.sub=function(e){var t=this;return e=new t.constructor(e),t.s==e.s?kA(t,e):bA(t,(e.s=-e.s,e))};we.modulo=we.mod=function(e){var t,r=this,n=r.constructor,a=n.precision;if(e=new n(e),!e.s)throw Error(an+"NaN");return r.s?(dt=!1,t=yi(r,e,0,1).times(e),dt=!0,r.minus(t)):tt(new n(r),a)};we.naturalExponential=we.exp=function(){return wA(this)};we.naturalLogarithm=we.ln=function(){return Tu(this)};we.negated=we.neg=function(){var e=new this.constructor(this);return e.s=-e.s||0,e};we.plus=we.add=function(e){var t=this;return e=new t.constructor(e),t.s==e.s?bA(t,e):kA(t,(e.s=-e.s,e))};we.precision=we.sd=function(e){var t,r,n,a=this;if(e!==void 0&&e!==!!e&&e!==1&&e!==0)throw Error(go+e);if(t=St(a)+1,n=a.d.length-1,r=n*lt+1,n=a.d[n],n){for(;n%10==0;n/=10)r--;for(n=a.d[0];n>=10;n/=10)r++}return e&&t>r?t:r};we.squareRoot=we.sqrt=function(){var e,t,r,n,a,o,c,u=this,f=u.constructor;if(u.s<1){if(!u.s)return new f(0);throw Error(an+"NaN")}for(e=St(u),dt=!1,a=Math.sqrt(+u),a==0||a==1/0?(t=Fn(u.d),(t.length+e)%2==0&&(t+="0"),a=Math.sqrt(t),e=ol((e+1)/2)-(e<0||e%2),a==1/0?t="5e"+e:(t=a.toExponential(),t=t.slice(0,t.indexOf("e")+1)+e),n=new f(t)):n=new f(a.toString()),r=f.precision,a=c=r+3;;)if(o=n,n=o.plus(yi(u,o,c+2)).times(.5),Fn(o.d).slice(0,c)===(t=Fn(n.d)).slice(0,c)){if(t=t.slice(c-3,c+1),a==c&&t=="4999"){if(tt(o,r+1,0),o.times(o).eq(u)){n=o;break}}else if(t!="9999")break;c+=4}return dt=!0,tt(n,r)};we.times=we.mul=function(e){var t,r,n,a,o,c,u,f,h,m=this,g=m.constructor,v=m.d,b=(e=new g(e)).d;if(!m.s||!e.s)return new g(0);for(e.s*=m.s,r=m.e+e.e,f=v.length,h=b.length,f=0;){for(t=0,a=f+n;a>n;)u=o[a]+b[n]*v[a-n-1]+t,o[a--]=u%Rt|0,t=u/Rt|0;o[a]=(o[a]+t)%Rt|0}for(;!o[--c];)o.pop();return t?++r:o.shift(),e.d=o,e.e=r,dt?tt(e,g.precision):e};we.toDecimalPlaces=we.todp=function(e,t){var r=this,n=r.constructor;return r=new n(r),e===void 0?r:(qn(e,0,al),t===void 0?t=n.rounding:qn(t,0,8),tt(r,e+St(r)+1,t))};we.toExponential=function(e,t){var r,n=this,a=n.constructor;return e===void 0?r=So(n,!0):(qn(e,0,al),t===void 0?t=a.rounding:qn(t,0,8),n=tt(new a(n),e+1,t),r=So(n,!0,e+1)),r};we.toFixed=function(e,t){var r,n,a=this,o=a.constructor;return e===void 0?So(a):(qn(e,0,al),t===void 0?t=o.rounding:qn(t,0,8),n=tt(new o(a),e+St(a)+1,t),r=So(n.abs(),!1,e+St(n)+1),a.isneg()&&!a.isZero()?"-"+r:r)};we.toInteger=we.toint=function(){var e=this,t=e.constructor;return tt(new t(e),St(e)+1,t.rounding)};we.toNumber=function(){return+this};we.toPower=we.pow=function(e){var t,r,n,a,o,c,u=this,f=u.constructor,h=12,m=+(e=new f(e));if(!e.s)return new f(Fr);if(u=new f(u),!u.s){if(e.s<1)throw Error(an+"Infinity");return u}if(u.eq(Fr))return u;if(n=f.precision,e.eq(Fr))return tt(u,n);if(t=e.e,r=e.d.length-1,c=t>=r,o=u.s,c){if((r=m<0?-m:m)<=xA){for(a=new f(Fr),t=Math.ceil(n/lt+4),dt=!1;r%2&&(a=a.times(u),Oj(a.d,t)),r=ol(r/2),r!==0;)u=u.times(u),Oj(u.d,t);return dt=!0,e.s<0?new f(Fr).div(a):tt(a,n)}}else if(o<0)throw Error(an+"NaN");return o=o<0&&e.d[Math.max(t,r)]&1?-1:1,u.s=1,dt=!1,a=e.times(Tu(u,n+h)),dt=!0,a=wA(a),a.s=o,a};we.toPrecision=function(e,t){var r,n,a=this,o=a.constructor;return e===void 0?(r=St(a),n=So(a,r<=o.toExpNeg||r>=o.toExpPos)):(qn(e,1,al),t===void 0?t=o.rounding:qn(t,0,8),a=tt(new o(a),e,t),r=St(a),n=So(a,e<=r||r<=o.toExpNeg,e)),n};we.toSignificantDigits=we.tosd=function(e,t){var r=this,n=r.constructor;return e===void 0?(e=n.precision,t=n.rounding):(qn(e,1,al),t===void 0?t=n.rounding:qn(t,0,8)),tt(new n(r),e,t)};we.toString=we.valueOf=we.val=we.toJSON=we[Symbol.for("nodejs.util.inspect.custom")]=function(){var e=this,t=St(e),r=e.constructor;return So(e,t<=r.toExpNeg||t>=r.toExpPos)};function bA(e,t){var r,n,a,o,c,u,f,h,m=e.constructor,g=m.precision;if(!e.s||!t.s)return t.s||(t=new m(e)),dt?tt(t,g):t;if(f=e.d,h=t.d,c=e.e,a=t.e,f=f.slice(),o=c-a,o){for(o<0?(n=f,o=-o,u=h.length):(n=h,a=c,u=f.length),c=Math.ceil(g/lt),u=c>u?c+1:u+1,o>u&&(o=u,n.length=1),n.reverse();o--;)n.push(0);n.reverse()}for(u=f.length,o=h.length,u-o<0&&(o=u,n=h,h=f,f=n),r=0;o;)r=(f[--o]=f[o]+h[o]+r)/Rt|0,f[o]%=Rt;for(r&&(f.unshift(r),++a),u=f.length;f[--u]==0;)f.pop();return t.d=f,t.e=a,dt?tt(t,g):t}function qn(e,t,r){if(e!==~~e||er)throw Error(go+e)}function Fn(e){var t,r,n,a=e.length-1,o="",c=e[0];if(a>0){for(o+=c,t=1;tc?1:-1;else for(u=f=0;ua[u]?1:-1;break}return f}function r(n,a,o){for(var c=0;o--;)n[o]-=c,c=n[o]1;)n.shift()}return function(n,a,o,c){var u,f,h,m,g,v,b,j,k,S,N,E,A,P,_,O,D,U,B=n.constructor,F=n.s==a.s?1:-1,Y=n.d,H=a.d;if(!n.s)return new B(n);if(!a.s)throw Error(an+"Division by zero");for(f=n.e-a.e,D=H.length,_=Y.length,b=new B(F),j=b.d=[],h=0;H[h]==(Y[h]||0);)++h;if(H[h]>(Y[h]||0)&&--f,o==null?E=o=B.precision:c?E=o+(St(n)-St(a))+1:E=o,E<0)return new B(0);if(E=E/lt+2|0,h=0,D==1)for(m=0,H=H[0],E++;(h<_||m)&&E--;h++)A=m*Rt+(Y[h]||0),j[h]=A/H|0,m=A%H|0;else{for(m=Rt/(H[0]+1)|0,m>1&&(H=e(H,m),Y=e(Y,m),D=H.length,_=Y.length),P=D,k=Y.slice(0,D),S=k.length;S=Rt/2&&++O;do m=0,u=t(H,k,D,S),u<0?(N=k[0],D!=S&&(N=N*Rt+(k[1]||0)),m=N/O|0,m>1?(m>=Rt&&(m=Rt-1),g=e(H,m),v=g.length,S=k.length,u=t(g,k,v,S),u==1&&(m--,r(g,D16)throw Error(Jy+St(e));if(!e.s)return new m(Fr);for(dt=!1,u=g,c=new m(.03125);e.abs().gte(.1);)e=e.times(c),h+=5;for(n=Math.log(Ya(2,h))/Math.LN10*2+5|0,u+=n,r=a=o=new m(Fr),m.precision=u;;){if(a=tt(a.times(e),u),r=r.times(++f),c=o.plus(yi(a,r,u)),Fn(c.d).slice(0,u)===Fn(o.d).slice(0,u)){for(;h--;)o=tt(o.times(o),u);return m.precision=g,t==null?(dt=!0,tt(o,g)):o}o=c}}function St(e){for(var t=e.e*lt,r=e.d[0];r>=10;r/=10)t++;return t}function Ag(e,t,r){if(t>e.LN10.sd())throw dt=!0,r&&(e.precision=r),Error(an+"LN10 precision limit exceeded");return tt(new e(e.LN10),t)}function oa(e){for(var t="";e--;)t+="0";return t}function Tu(e,t){var r,n,a,o,c,u,f,h,m,g=1,v=10,b=e,j=b.d,k=b.constructor,S=k.precision;if(b.s<1)throw Error(an+(b.s?"NaN":"-Infinity"));if(b.eq(Fr))return new k(0);if(t==null?(dt=!1,h=S):h=t,b.eq(10))return t==null&&(dt=!0),Ag(k,h);if(h+=v,k.precision=h,r=Fn(j),n=r.charAt(0),o=St(b),Math.abs(o)<15e14){for(;n<7&&n!=1||n==1&&r.charAt(1)>3;)b=b.times(e),r=Fn(b.d),n=r.charAt(0),g++;o=St(b),n>1?(b=new k("0."+r),o++):b=new k(n+"."+r.slice(1))}else return f=Ag(k,h+2,S).times(o+""),b=Tu(new k(n+"."+r.slice(1)),h-v).plus(f),k.precision=S,t==null?(dt=!0,tt(b,S)):b;for(u=c=b=yi(b.minus(Fr),b.plus(Fr),h),m=tt(b.times(b),h),a=3;;){if(c=tt(c.times(m),h),f=u.plus(yi(c,new k(a),h)),Fn(f.d).slice(0,h)===Fn(u.d).slice(0,h))return u=u.times(2),o!==0&&(u=u.plus(Ag(k,h+2,S).times(o+""))),u=yi(u,new k(g),h),k.precision=S,t==null?(dt=!0,tt(u,S)):u;u=f,a+=2}}function Pj(e,t){var r,n,a;for((r=t.indexOf("."))>-1&&(t=t.replace(".","")),(n=t.search(/e/i))>0?(r<0&&(r=n),r+=+t.slice(n+1),t=t.substring(0,n)):r<0&&(r=t.length),n=0;t.charCodeAt(n)===48;)++n;for(a=t.length;t.charCodeAt(a-1)===48;)--a;if(t=t.slice(n,a),t){if(a-=n,r=r-n-1,e.e=ol(r/lt),e.d=[],n=(r+1)%lt,r<0&&(n+=lt),nLf||e.e<-Lf))throw Error(Jy+r)}else e.s=0,e.e=0,e.d=[0];return e}function tt(e,t,r){var n,a,o,c,u,f,h,m,g=e.d;for(c=1,o=g[0];o>=10;o/=10)c++;if(n=t-c,n<0)n+=lt,a=t,h=g[m=0];else{if(m=Math.ceil((n+1)/lt),o=g.length,m>=o)return e;for(h=o=g[m],c=1;o>=10;o/=10)c++;n%=lt,a=n-lt+c}if(r!==void 0&&(o=Ya(10,c-a-1),u=h/o%10|0,f=t<0||g[m+1]!==void 0||h%o,f=r<4?(u||f)&&(r==0||r==(e.s<0?3:2)):u>5||u==5&&(r==4||f||r==6&&(n>0?a>0?h/Ya(10,c-a):0:g[m-1])%10&1||r==(e.s<0?8:7))),t<1||!g[0])return f?(o=St(e),g.length=1,t=t-o-1,g[0]=Ya(10,(lt-t%lt)%lt),e.e=ol(-t/lt)||0):(g.length=1,g[0]=e.e=e.s=0),e;if(n==0?(g.length=m,o=1,m--):(g.length=m+1,o=Ya(10,lt-n),g[m]=a>0?(h/Ya(10,c-a)%Ya(10,a)|0)*o:0),f)for(;;)if(m==0){(g[0]+=o)==Rt&&(g[0]=1,++e.e);break}else{if(g[m]+=o,g[m]!=Rt)break;g[m--]=0,o=1}for(n=g.length;g[--n]===0;)g.pop();if(dt&&(e.e>Lf||e.e<-Lf))throw Error(Jy+St(e));return e}function kA(e,t){var r,n,a,o,c,u,f,h,m,g,v=e.constructor,b=v.precision;if(!e.s||!t.s)return t.s?t.s=-t.s:t=new v(e),dt?tt(t,b):t;if(f=e.d,g=t.d,n=t.e,h=e.e,f=f.slice(),c=h-n,c){for(m=c<0,m?(r=f,c=-c,u=g.length):(r=g,n=h,u=f.length),a=Math.max(Math.ceil(b/lt),u)+2,c>a&&(c=a,r.length=1),r.reverse(),a=c;a--;)r.push(0);r.reverse()}else{for(a=f.length,u=g.length,m=a0;--a)f[u++]=0;for(a=g.length;a>c;){if(f[--a]0?o=o.charAt(0)+"."+o.slice(1)+oa(n):c>1&&(o=o.charAt(0)+"."+o.slice(1)),o=o+(a<0?"e":"e+")+a):a<0?(o="0."+oa(-a-1)+o,r&&(n=r-c)>0&&(o+=oa(n))):a>=c?(o+=oa(a+1-c),r&&(n=r-a-1)>0&&(o=o+"."+oa(n))):((n=a+1)0&&(a+1===c&&(o+="."),o+=oa(n))),e.s<0?"-"+o:o}function Oj(e,t){if(e.length>t)return e.length=t,!0}function jA(e){var t,r,n;function a(o){var c=this;if(!(c instanceof a))return new a(o);if(c.constructor=a,o instanceof a){c.s=o.s,c.e=o.e,c.d=(o=o.d)?o.slice():o;return}if(typeof o=="number"){if(o*0!==0)throw Error(go+o);if(o>0)c.s=1;else if(o<0)o=-o,c.s=-1;else{c.s=0,c.e=0,c.d=[0];return}if(o===~~o&&o<1e7){c.e=0,c.d=[o];return}return Pj(c,o.toString())}else if(typeof o!="string")throw Error(go+o);if(o.charCodeAt(0)===45?(o=o.slice(1),c.s=-1):c.s=1,_F.test(o))Pj(c,o);else throw Error(go+o)}if(a.prototype=we,a.ROUND_UP=0,a.ROUND_DOWN=1,a.ROUND_CEIL=2,a.ROUND_FLOOR=3,a.ROUND_HALF_UP=4,a.ROUND_HALF_DOWN=5,a.ROUND_HALF_EVEN=6,a.ROUND_HALF_CEIL=7,a.ROUND_HALF_FLOOR=8,a.clone=jA,a.config=a.set=MF,e===void 0&&(e={}),e)for(n=["precision","rounding","toExpNeg","toExpPos","LN10"],t=0;t=a[t+1]&&n<=a[t+2])this[r]=n;else throw Error(go+r+": "+n);if((n=e[r="LN10"])!==void 0)if(n==Math.LN10)this[r]=new this(n);else throw Error(go+r+": "+n);return this}var e0=jA(OF);Fr=new e0(1);const Ge=e0;function SA(e){var t;return e===0?t=1:t=Math.floor(new Ge(e).abs().log(10).toNumber())+1,t}function NA(e,t,r){for(var n=new Ge(e),a=0,o=[];n.lt(t)&&a<1e5;)o.push(n.toNumber()),n=n.add(r),a++;return o}function Du(e,t){return RF(e)||DF(e,t)||TF(e,t)||IF()}function IF(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function TF(e,t){if(e){if(typeof e=="string")return _j(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?_j(e,t):void 0}}function _j(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{var t=Du(e,2),r=t[0],n=t[1],a=r,o=n;return r>n&&(a=n,o=r),[a,o]},t0=(e,t,r)=>{if(e.lte(0))return new Ge(0);var n=SA(e.toNumber()),a=new Ge(10).pow(n),o=e.div(a),c=n!==1?.05:.1,u=new Ge(Math.ceil(o.div(c).toNumber())).add(r).mul(c),f=u.mul(a);return t?new Ge(f.toNumber()):new Ge(Math.ceil(f.toNumber()))},AA=(e,t,r)=>{var n;if(e.lte(0))return new Ge(0);var a=[1,2,2.5,5],o=e.toNumber(),c=Math.floor(new Ge(o).abs().log(10).toNumber()),u=new Ge(10).pow(c),f=e.div(u).toNumber(),h=a.findIndex(b=>b>=f-1e-10);if(h===-1&&(u=u.mul(10),h=0),h+=r,h>=a.length){var m=Math.floor(h/a.length);h%=a.length,u=u.mul(new Ge(10).pow(m))}var g=(n=a[h])!==null&&n!==void 0?n:1,v=new Ge(g).mul(u);return t?v:new Ge(Math.ceil(v.toNumber()))},LF=(e,t,r)=>{var n=new Ge(1),a=new Ge(e);if(!a.isint()&&r){var o=Math.abs(e);o<1?(n=new Ge(10).pow(SA(e)-1),a=new Ge(Math.floor(a.div(n).toNumber())).mul(n)):o>1&&(a=new Ge(Math.floor(e)))}else e===0?a=new Ge(Math.floor((t-1)/2)):r||(a=new Ge(Math.floor(e)));for(var c=Math.floor((t-1)/2),u=[],f=0;f4&&arguments[4]!==void 0?arguments[4]:0,c=arguments.length>5&&arguments[5]!==void 0?arguments[5]:t0;if(!Number.isFinite((r-t)/(n-1)))return{step:new Ge(0),tickMin:new Ge(0),tickMax:new Ge(0)};var u=c(new Ge(r).sub(t).div(n-1),a,o),f;t<=0&&r>=0?f=new Ge(0):(f=new Ge(t).add(r).div(2),f=f.sub(new Ge(f).mod(u)));var h=Math.ceil(f.sub(t).div(u).toNumber()),m=Math.ceil(new Ge(r).sub(f).div(u).toNumber()),g=h+m+1;return g>n?CA(t,r,n,a,o+1,c):(g0?m+(n-g):m,h=r>0?h:h+(n-g)),{step:u,tickMin:f.sub(new Ge(h).mul(u)),tickMax:f.add(new Ge(m).mul(u))})},Mj=function(t){var r=Du(t,2),n=r[0],a=r[1],o=arguments.length>1&&arguments[1]!==void 0?arguments[1]:6,c=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,u=arguments.length>3&&arguments[3]!==void 0?arguments[3]:"auto",f=Math.max(o,2),h=EA([n,a]),m=Du(h,2),g=m[0],v=m[1];if(g===-1/0||v===1/0){var b=v===1/0?[g,...Array(o-1).fill(1/0)]:[...Array(o-1).fill(-1/0),v];return n>a?b.reverse():b}if(g===v)return LF(g,o,c);var j=u==="snap125"?AA:t0,k=CA(g,v,f,c,0,j),S=k.step,N=k.tickMin,E=k.tickMax,A=NA(N,E.add(new Ge(.1).mul(S)),S);return n>a?A.reverse():A},Ij=function(t,r){var n=Du(t,2),a=n[0],o=n[1],c=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,u=arguments.length>3&&arguments[3]!==void 0?arguments[3]:"auto",f=EA([a,o]),h=Du(f,2),m=h[0],g=h[1];if(m===-1/0||g===1/0)return[a,o];if(m===g)return[m];var v=u==="snap125"?AA:t0,b=Math.max(r,2),j=v(new Ge(g).sub(m).div(b-1),c,0),k=[...NA(new Ge(m),new Ge(g),j),g];return c===!1&&(k=k.map(S=>Math.round(S))),a>o?k.reverse():k},$F=e=>e.rootProps.barCategoryGap,Uh=e=>e.rootProps.stackOffset,PA=e=>e.rootProps.reverseStackOrder,r0=e=>e.options.chartName,n0=e=>e.rootProps.syncId,OA=e=>e.rootProps.syncMethod,i0=e=>e.options.eventEmitter,zF=e=>e.rootProps.baseValue,pr={grid:-100,barBackground:-50,area:100,cursorRectangle:200,bar:300,line:400,axis:500,scatter:600,activeBar:1e3,cursorLine:1100,activeDot:1200,label:2e3},Ua={allowDecimals:!1,allowDataOverflow:!1,angleAxisId:0,reversed:!1,scale:"auto",tick:!0,type:"auto"},In={allowDataOverflow:!1,allowDecimals:!1,allowDuplicatedCategory:!0,includeHidden:!1,radiusAxisId:0,reversed:!1,scale:"auto",tick:!0,tickCount:5,type:"auto"},Hh=(e,t)=>{if(!(!e||!t))return e!=null&&e.reversed?[t[1],t[0]]:t};function Wh(e,t,r){if(r!=="auto")return r;if(e!=null)return Xn(e,t)?"category":"number"}function Tj(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function $f(e){for(var t=1;t{if(t!=null)return e.polarAxis.angleAxis[t]},a0=q([HF,eA],(e,t)=>{var r;if(e!=null)return e;var n=(r=Wh(t,"angleAxis",Dj.type))!==null&&r!==void 0?r:"category";return $f($f({},Dj),{},{type:n})}),WF=(e,t)=>e.polarAxis.radiusAxis[t],o0=q([WF,eA],(e,t)=>{var r;if(e!=null)return e;var n=(r=Wh(t,"radiusAxis",Rj.type))!==null&&r!==void 0?r:"category";return $f($f({},Rj),{},{type:n})}),Kh=e=>e.polarOptions,s0=q([Ei,Ai,Zt],cF),_A=q([Kh,s0],(e,t)=>{if(e!=null)return Sa(e.innerRadius,t,0)}),MA=q([Kh,s0],(e,t)=>{if(e!=null)return Sa(e.outerRadius,t,t*.8)}),KF=e=>{if(e==null)return[0,0];var t=e.startAngle,r=e.endAngle;return[t,r]},IA=q([Kh],KF);q([a0,IA],Hh);var TA=q([s0,_A,MA],(e,t,r)=>{if(!(e==null||t==null||r==null))return[t,r]});q([o0,TA],Hh);var DA=q([ft,Kh,_A,MA,Ei,Ai],(e,t,r,n,a,o)=>{if(!(e!=="centric"&&e!=="radial"||t==null||r==null||n==null)){var c=t.cx,u=t.cy,f=t.startAngle,h=t.endAngle;return{cx:Sa(c,a,a/2),cy:Sa(u,o,o/2),innerRadius:r,outerRadius:n,startAngle:f,endAngle:h,clockWise:!1}}}),zt=(e,t)=>t,Gh=(e,t,r)=>r;function l0(e){return e==null?void 0:e.id}function RA(e,t,r){var n=t.chartData,a=n===void 0?[]:n,o=r.allowDuplicatedCategory,c=r.dataKey,u=new Map;return e.forEach(f=>{var h,m=(h=f.data)!==null&&h!==void 0?h:a;if(!(m==null||m.length===0)){var g=l0(f);m.forEach((v,b)=>{var j=c==null||o?b:String(Lt(v,c,null)),k=Lt(v,f.dataKey,0),S;u.has(j)?S=u.get(j):S={},Object.assign(S,{[g]:k}),u.set(j,S)})}}),Array.from(u.values())}function u0(e){return"stackId"in e&&e.stackId!=null&&e.dataKey!=null}var Vh=(e,t)=>e===t?!0:e==null||t==null?!1:e[0]===t[0]&&e[1]===t[1];function qh(e,t){return Array.isArray(e)&&Array.isArray(t)&&e.length===0&&t.length===0?!0:e===t}function GF(e,t){if(e.length===t.length){for(var r=0;r{var t=ft(e);return t==="horizontal"?"xAxis":t==="vertical"?"yAxis":t==="centric"?"angleAxis":"radiusAxis"},sl=e=>e.tooltip.settings.axisId;function c0(e){if(e!=null){var t=e.ticks,r=e.bandwidth,n=e.range(),a=[Math.min(...n),Math.max(...n)];return{domain:()=>e.domain(),range:(function(o){function c(){return o.apply(this,arguments)}return c.toString=function(){return o.toString()},c})(()=>a),rangeMin:()=>a[0],rangeMax:()=>a[1],isInRange(o){var c=a[0],u=a[1];return c<=u?o>=c&&o<=u:o>=u&&o<=c},bandwidth:r?()=>r.call(e):void 0,ticks:t?o=>t.call(e,o):void 0,map:(o,c)=>{var u=e(o);if(u!=null){if(e.bandwidth&&c!==null&&c!==void 0&&c.position){var f=e.bandwidth();switch(c.position){case"middle":u+=f/2;break;case"end":u+=f;break}}return u}}}}}var VF=(e,t)=>{if(t!=null)switch(e){case"linear":{if(!Bn(t)){for(var r,n,a=0;an)&&(n=o))}return r!==void 0&&n!==void 0?[r,n]:void 0}return t}default:return t}};function wa(e,t){return e==null||t==null?NaN:et?1:e>=t?0:NaN}function qF(e,t){return e==null||t==null?NaN:te?1:t>=e?0:NaN}function d0(e){let t,r,n;e.length!==2?(t=wa,r=(u,f)=>wa(e(u),f),n=(u,f)=>e(u)-f):(t=e===wa||e===qF?e:QF,r=e,n=e);function a(u,f,h=0,m=u.length){if(h>>1;r(u[g],f)<0?h=g+1:m=g}while(h>>1;r(u[g],f)<=0?h=g+1:m=g}while(hh&&n(u[g-1],f)>-n(u[g],f)?g-1:g}return{left:a,center:c,right:o}}function QF(){return 0}function LA(e){return e===null?NaN:+e}function*YF(e,t){for(let r of e)r!=null&&(r=+r)>=r&&(yield r)}const XF=d0(wa),ic=XF.right;d0(LA).center;class Lj extends Map{constructor(t,r=e9){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:r}}),t!=null)for(const[n,a]of t)this.set(n,a)}get(t){return super.get($j(this,t))}has(t){return super.has($j(this,t))}set(t,r){return super.set(ZF(this,t),r)}delete(t){return super.delete(JF(this,t))}}function $j({_intern:e,_key:t},r){const n=t(r);return e.has(n)?e.get(n):r}function ZF({_intern:e,_key:t},r){const n=t(r);return e.has(n)?e.get(n):(e.set(n,r),r)}function JF({_intern:e,_key:t},r){const n=t(r);return e.has(n)&&(r=e.get(n),e.delete(n)),r}function e9(e){return e!==null&&typeof e=="object"?e.valueOf():e}function t9(e=wa){if(e===wa)return $A;if(typeof e!="function")throw new TypeError("compare is not a function");return(t,r)=>{const n=e(t,r);return n||n===0?n:(e(r,r)===0)-(e(t,t)===0)}}function $A(e,t){return(e==null||!(e>=e))-(t==null||!(t>=t))||(et?1:0)}const r9=Math.sqrt(50),n9=Math.sqrt(10),i9=Math.sqrt(2);function zf(e,t,r){const n=(t-e)/Math.max(0,r),a=Math.floor(Math.log10(n)),o=n/Math.pow(10,a),c=o>=r9?10:o>=n9?5:o>=i9?2:1;let u,f,h;return a<0?(h=Math.pow(10,-a)/c,u=Math.round(e*h),f=Math.round(t*h),u/ht&&--f,h=-h):(h=Math.pow(10,a)*c,u=Math.round(e/h),f=Math.round(t/h),u*ht&&--f),f0))return[];if(e===t)return[e];const n=t=a))return[];const u=o-a+1,f=new Array(u);if(n)if(c<0)for(let h=0;h=n)&&(r=n);return r}function Fj(e,t){let r;for(const n of e)n!=null&&(r>n||r===void 0&&n>=n)&&(r=n);return r}function zA(e,t,r=0,n=1/0,a){if(t=Math.floor(t),r=Math.floor(Math.max(0,r)),n=Math.floor(Math.min(e.length-1,n)),!(r<=t&&t<=n))return e;for(a=a===void 0?$A:t9(a);n>r;){if(n-r>600){const f=n-r+1,h=t-r+1,m=Math.log(f),g=.5*Math.exp(2*m/3),v=.5*Math.sqrt(m*g*(f-g)/f)*(h-f/2<0?-1:1),b=Math.max(r,Math.floor(t-h*g/f+v)),j=Math.min(n,Math.floor(t+(f-h)*g/f+v));zA(e,t,b,j,a)}const o=e[t];let c=r,u=n;for(au(e,r,t),a(e[n],o)>0&&au(e,r,n);c0;)--u}a(e[r],o)===0?au(e,r,u):(++u,au(e,u,n)),u<=t&&(r=u+1),t<=u&&(n=u-1)}return e}function au(e,t,r){const n=e[t];e[t]=e[r],e[r]=n}function a9(e,t,r){if(e=Float64Array.from(YF(e)),!(!(n=e.length)||isNaN(t=+t))){if(t<=0||n<2)return Fj(e);if(t>=1)return zj(e);var n,a=(n-1)*t,o=Math.floor(a),c=zj(zA(e,o).subarray(0,o+1)),u=Fj(e.subarray(o+1));return c+(u-c)*(a-o)}}function o9(e,t,r=LA){if(!(!(n=e.length)||isNaN(t=+t))){if(t<=0||n<2)return+r(e[0],0,e);if(t>=1)return+r(e[n-1],n-1,e);var n,a=(n-1)*t,o=Math.floor(a),c=+r(e[o],o,e),u=+r(e[o+1],o+1,e);return c+(u-c)*(a-o)}}function s9(e,t,r){e=+e,t=+t,r=(a=arguments.length)<2?(t=e,e=0,1):a<3?1:+r;for(var n=-1,a=Math.max(0,Math.ceil((t-e)/r))|0,o=new Array(a);++n>8&15|t>>4&240,t>>4&15|t&240,(t&15)<<4|t&15,1):r===8?Bd(t>>24&255,t>>16&255,t>>8&255,(t&255)/255):r===4?Bd(t>>12&15|t>>8&240,t>>8&15|t>>4&240,t>>4&15|t&240,((t&15)<<4|t&15)/255):null):(t=c9.exec(e))?new Cr(t[1],t[2],t[3],1):(t=d9.exec(e))?new Cr(t[1]*255/100,t[2]*255/100,t[3]*255/100,1):(t=f9.exec(e))?Bd(t[1],t[2],t[3],t[4]):(t=h9.exec(e))?Bd(t[1]*255/100,t[2]*255/100,t[3]*255/100,t[4]):(t=m9.exec(e))?Vj(t[1],t[2]/100,t[3]/100,1):(t=p9.exec(e))?Vj(t[1],t[2]/100,t[3]/100,t[4]):Bj.hasOwnProperty(e)?Wj(Bj[e]):e==="transparent"?new Cr(NaN,NaN,NaN,0):null}function Wj(e){return new Cr(e>>16&255,e>>8&255,e&255,1)}function Bd(e,t,r,n){return n<=0&&(e=t=r=NaN),new Cr(e,t,r,n)}function y9(e){return e instanceof ac||(e=$u(e)),e?(e=e.rgb(),new Cr(e.r,e.g,e.b,e.opacity)):new Cr}function ty(e,t,r,n){return arguments.length===1?y9(e):new Cr(e,t,r,n??1)}function Cr(e,t,r,n){this.r=+e,this.g=+t,this.b=+r,this.opacity=+n}m0(Cr,ty,BA(ac,{brighter(e){return e=e==null?Ff:Math.pow(Ff,e),new Cr(this.r*e,this.g*e,this.b*e,this.opacity)},darker(e){return e=e==null?Ru:Math.pow(Ru,e),new Cr(this.r*e,this.g*e,this.b*e,this.opacity)},rgb(){return this},clamp(){return new Cr(vo(this.r),vo(this.g),vo(this.b),Bf(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:Kj,formatHex:Kj,formatHex8:x9,formatRgb:Gj,toString:Gj}));function Kj(){return`#${to(this.r)}${to(this.g)}${to(this.b)}`}function x9(){return`#${to(this.r)}${to(this.g)}${to(this.b)}${to((isNaN(this.opacity)?1:this.opacity)*255)}`}function Gj(){const e=Bf(this.opacity);return`${e===1?"rgb(":"rgba("}${vo(this.r)}, ${vo(this.g)}, ${vo(this.b)}${e===1?")":`, ${e})`}`}function Bf(e){return isNaN(e)?1:Math.max(0,Math.min(1,e))}function vo(e){return Math.max(0,Math.min(255,Math.round(e)||0))}function to(e){return e=vo(e),(e<16?"0":"")+e.toString(16)}function Vj(e,t,r,n){return n<=0?e=t=r=NaN:r<=0||r>=1?e=t=NaN:t<=0&&(e=NaN),new bn(e,t,r,n)}function UA(e){if(e instanceof bn)return new bn(e.h,e.s,e.l,e.opacity);if(e instanceof ac||(e=$u(e)),!e)return new bn;if(e instanceof bn)return e;e=e.rgb();var t=e.r/255,r=e.g/255,n=e.b/255,a=Math.min(t,r,n),o=Math.max(t,r,n),c=NaN,u=o-a,f=(o+a)/2;return u?(t===o?c=(r-n)/u+(r0&&f<1?0:c,new bn(c,u,f,e.opacity)}function b9(e,t,r,n){return arguments.length===1?UA(e):new bn(e,t,r,n??1)}function bn(e,t,r,n){this.h=+e,this.s=+t,this.l=+r,this.opacity=+n}m0(bn,b9,BA(ac,{brighter(e){return e=e==null?Ff:Math.pow(Ff,e),new bn(this.h,this.s,this.l*e,this.opacity)},darker(e){return e=e==null?Ru:Math.pow(Ru,e),new bn(this.h,this.s,this.l*e,this.opacity)},rgb(){var e=this.h%360+(this.h<0)*360,t=isNaN(e)||isNaN(this.s)?0:this.s,r=this.l,n=r+(r<.5?r:1-r)*t,a=2*r-n;return new Cr(Cg(e>=240?e-240:e+120,a,n),Cg(e,a,n),Cg(e<120?e+240:e-120,a,n),this.opacity)},clamp(){return new bn(qj(this.h),Ud(this.s),Ud(this.l),Bf(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const e=Bf(this.opacity);return`${e===1?"hsl(":"hsla("}${qj(this.h)}, ${Ud(this.s)*100}%, ${Ud(this.l)*100}%${e===1?")":`, ${e})`}`}}));function qj(e){return e=(e||0)%360,e<0?e+360:e}function Ud(e){return Math.max(0,Math.min(1,e||0))}function Cg(e,t,r){return(e<60?t+(r-t)*e/60:e<180?r:e<240?t+(r-t)*(240-e)/60:t)*255}const p0=e=>()=>e;function w9(e,t){return function(r){return e+r*t}}function k9(e,t,r){return e=Math.pow(e,r),t=Math.pow(t,r)-e,r=1/r,function(n){return Math.pow(e+n*t,r)}}function j9(e){return(e=+e)==1?HA:function(t,r){return r-t?k9(t,r,e):p0(isNaN(t)?r:t)}}function HA(e,t){var r=t-e;return r?w9(e,r):p0(isNaN(e)?t:e)}const Qj=(function e(t){var r=j9(t);function n(a,o){var c=r((a=ty(a)).r,(o=ty(o)).r),u=r(a.g,o.g),f=r(a.b,o.b),h=HA(a.opacity,o.opacity);return function(m){return a.r=c(m),a.g=u(m),a.b=f(m),a.opacity=h(m),a+""}}return n.gamma=e,n})(1);function S9(e,t){t||(t=[]);var r=e?Math.min(t.length,e.length):0,n=t.slice(),a;return function(o){for(a=0;ar&&(o=t.slice(r,o),u[c]?u[c]+=o:u[++c]=o),(n=n[0])===(a=a[0])?u[c]?u[c]+=a:u[++c]=a:(u[++c]=null,f.push({i:c,x:Uf(n,a)})),r=Pg.lastIndex;return rt&&(r=e,e=t,t=r),function(n){return Math.max(e,Math.min(t,n))}}function D9(e,t,r){var n=e[0],a=e[1],o=t[0],c=t[1];return a2?R9:D9,f=h=null,g}function g(v){return v==null||isNaN(v=+v)?o:(f||(f=u(e.map(n),t,r)))(n(c(v)))}return g.invert=function(v){return c(a((h||(h=u(t,e.map(n),Uf)))(v)))},g.domain=function(v){return arguments.length?(e=Array.from(v,Hf),m()):e.slice()},g.range=function(v){return arguments.length?(t=Array.from(v),m()):t.slice()},g.rangeRound=function(v){return t=Array.from(v),r=g0,m()},g.clamp=function(v){return arguments.length?(c=v?!0:gr,m()):c!==gr},g.interpolate=function(v){return arguments.length?(r=v,m()):r},g.unknown=function(v){return arguments.length?(o=v,g):o},function(v,b){return n=v,a=b,m()}}function v0(){return Qh()(gr,gr)}function L9(e){return Math.abs(e=Math.round(e))>=1e21?e.toLocaleString("en").replace(/,/g,""):e.toString(10)}function Wf(e,t){if(!isFinite(e)||e===0)return null;var r=(e=t?e.toExponential(t-1):e.toExponential()).indexOf("e"),n=e.slice(0,r);return[n.length>1?n[0]+n.slice(2):n,+e.slice(r+1)]}function Qs(e){return e=Wf(Math.abs(e)),e?e[1]:NaN}function $9(e,t){return function(r,n){for(var a=r.length,o=[],c=0,u=e[0],f=0;a>0&&u>0&&(f+u+1>n&&(u=Math.max(1,n-f)),o.push(r.substring(a-=u,a+u)),!((f+=u+1)>n));)u=e[c=(c+1)%e.length];return o.reverse().join(t)}}function z9(e){return function(t){return t.replace(/[0-9]/g,function(r){return e[+r]})}}var F9=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function zu(e){if(!(t=F9.exec(e)))throw new Error("invalid format: "+e);var t;return new y0({fill:t[1],align:t[2],sign:t[3],symbol:t[4],zero:t[5],width:t[6],comma:t[7],precision:t[8]&&t[8].slice(1),trim:t[9],type:t[10]})}zu.prototype=y0.prototype;function y0(e){this.fill=e.fill===void 0?" ":e.fill+"",this.align=e.align===void 0?">":e.align+"",this.sign=e.sign===void 0?"-":e.sign+"",this.symbol=e.symbol===void 0?"":e.symbol+"",this.zero=!!e.zero,this.width=e.width===void 0?void 0:+e.width,this.comma=!!e.comma,this.precision=e.precision===void 0?void 0:+e.precision,this.trim=!!e.trim,this.type=e.type===void 0?"":e.type+""}y0.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(this.width===void 0?"":Math.max(1,this.width|0))+(this.comma?",":"")+(this.precision===void 0?"":"."+Math.max(0,this.precision|0))+(this.trim?"~":"")+this.type};function B9(e){e:for(var t=e.length,r=1,n=-1,a;r0&&(n=0);break}return n>0?e.slice(0,n)+e.slice(a+1):e}var Kf;function U9(e,t){var r=Wf(e,t);if(!r)return Kf=void 0,e.toPrecision(t);var n=r[0],a=r[1],o=a-(Kf=Math.max(-8,Math.min(8,Math.floor(a/3)))*3)+1,c=n.length;return o===c?n:o>c?n+new Array(o-c+1).join("0"):o>0?n.slice(0,o)+"."+n.slice(o):"0."+new Array(1-o).join("0")+Wf(e,Math.max(0,t+o-1))[0]}function Xj(e,t){var r=Wf(e,t);if(!r)return e+"";var n=r[0],a=r[1];return a<0?"0."+new Array(-a).join("0")+n:n.length>a+1?n.slice(0,a+1)+"."+n.slice(a+1):n+new Array(a-n.length+2).join("0")}const Zj={"%":(e,t)=>(e*100).toFixed(t),b:e=>Math.round(e).toString(2),c:e=>e+"",d:L9,e:(e,t)=>e.toExponential(t),f:(e,t)=>e.toFixed(t),g:(e,t)=>e.toPrecision(t),o:e=>Math.round(e).toString(8),p:(e,t)=>Xj(e*100,t),r:Xj,s:U9,X:e=>Math.round(e).toString(16).toUpperCase(),x:e=>Math.round(e).toString(16)};function Jj(e){return e}var eS=Array.prototype.map,tS=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function H9(e){var t=e.grouping===void 0||e.thousands===void 0?Jj:$9(eS.call(e.grouping,Number),e.thousands+""),r=e.currency===void 0?"":e.currency[0]+"",n=e.currency===void 0?"":e.currency[1]+"",a=e.decimal===void 0?".":e.decimal+"",o=e.numerals===void 0?Jj:z9(eS.call(e.numerals,String)),c=e.percent===void 0?"%":e.percent+"",u=e.minus===void 0?"−":e.minus+"",f=e.nan===void 0?"NaN":e.nan+"";function h(g,v){g=zu(g);var b=g.fill,j=g.align,k=g.sign,S=g.symbol,N=g.zero,E=g.width,A=g.comma,P=g.precision,_=g.trim,O=g.type;O==="n"?(A=!0,O="g"):Zj[O]||(P===void 0&&(P=12),_=!0,O="g"),(N||b==="0"&&j==="=")&&(N=!0,b="0",j="=");var D=(v&&v.prefix!==void 0?v.prefix:"")+(S==="$"?r:S==="#"&&/[boxX]/.test(O)?"0"+O.toLowerCase():""),U=(S==="$"?n:/[%p]/.test(O)?c:"")+(v&&v.suffix!==void 0?v.suffix:""),B=Zj[O],F=/[defgprs%]/.test(O);P=P===void 0?6:/[gprs]/.test(O)?Math.max(1,Math.min(21,P)):Math.max(0,Math.min(20,P));function Y(H){var pe=D,ue=U,he,ae,se;if(O==="c")ue=B(H)+ue,H="";else{H=+H;var X=H<0||1/H<0;if(H=isNaN(H)?f:B(Math.abs(H),P),_&&(H=B9(H)),X&&+H==0&&k!=="+"&&(X=!1),pe=(X?k==="("?k:u:k==="-"||k==="("?"":k)+pe,ue=(O==="s"&&!isNaN(H)&&Kf!==void 0?tS[8+Kf/3]:"")+ue+(X&&k==="("?")":""),F){for(he=-1,ae=H.length;++hese||se>57){ue=(se===46?a+H.slice(he+1):H.slice(he))+ue,H=H.slice(0,he);break}}}A&&!N&&(H=t(H,1/0));var te=pe.length+H.length+ue.length,J=te>1)+pe+H+ue+J.slice(te);break;default:H=J+pe+H+ue;break}return o(H)}return Y.toString=function(){return g+""},Y}function m(g,v){var b=Math.max(-8,Math.min(8,Math.floor(Qs(v)/3)))*3,j=Math.pow(10,-b),k=h((g=zu(g),g.type="f",g),{suffix:tS[8+b/3]});return function(S){return k(j*S)}}return{format:h,formatPrefix:m}}var Hd,x0,WA;W9({thousands:",",grouping:[3],currency:["$",""]});function W9(e){return Hd=H9(e),x0=Hd.format,WA=Hd.formatPrefix,Hd}function K9(e){return Math.max(0,-Qs(Math.abs(e)))}function G9(e,t){return Math.max(0,Math.max(-8,Math.min(8,Math.floor(Qs(t)/3)))*3-Qs(Math.abs(e)))}function V9(e,t){return e=Math.abs(e),t=Math.abs(t)-e,Math.max(0,Qs(t)-Qs(e))+1}function KA(e,t,r,n){var a=Jv(e,t,r),o;switch(n=zu(n??",f"),n.type){case"s":{var c=Math.max(Math.abs(e),Math.abs(t));return n.precision==null&&!isNaN(o=G9(a,c))&&(n.precision=o),WA(n,c)}case"":case"e":case"g":case"p":case"r":{n.precision==null&&!isNaN(o=V9(a,Math.max(Math.abs(e),Math.abs(t))))&&(n.precision=o-(n.type==="e"));break}case"f":case"%":{n.precision==null&&!isNaN(o=K9(a))&&(n.precision=o-(n.type==="%")*2);break}}return x0(n)}function Na(e){var t=e.domain;return e.ticks=function(r){var n=t();return Xv(n[0],n[n.length-1],r??10)},e.tickFormat=function(r,n){var a=t();return KA(a[0],a[a.length-1],r??10,n)},e.nice=function(r){r==null&&(r=10);var n=t(),a=0,o=n.length-1,c=n[a],u=n[o],f,h,m=10;for(u0;){if(h=Zv(c,u,r),h===f)return n[a]=c,n[o]=u,t(n);if(h>0)c=Math.floor(c/h)*h,u=Math.ceil(u/h)*h;else if(h<0)c=Math.ceil(c*h)/h,u=Math.floor(u*h)/h;else break;f=h}return e},e}function GA(){var e=v0();return e.copy=function(){return oc(e,GA())},sn.apply(e,arguments),Na(e)}function VA(e){var t;function r(n){return n==null||isNaN(n=+n)?t:n}return r.invert=r,r.domain=r.range=function(n){return arguments.length?(e=Array.from(n,Hf),r):e.slice()},r.unknown=function(n){return arguments.length?(t=n,r):t},r.copy=function(){return VA(e).unknown(t)},e=arguments.length?Array.from(e,Hf):[0,1],Na(r)}function qA(e,t){e=e.slice();var r=0,n=e.length-1,a=e[r],o=e[n],c;return oMath.pow(e,t)}function Z9(e){return e===Math.E?Math.log:e===10&&Math.log10||e===2&&Math.log2||(e=Math.log(e),t=>Math.log(t)/e)}function iS(e){return(t,r)=>-e(-t,r)}function b0(e){const t=e(rS,nS),r=t.domain;let n=10,a,o;function c(){return a=Z9(n),o=X9(n),r()[0]<0?(a=iS(a),o=iS(o),e(q9,Q9)):e(rS,nS),t}return t.base=function(u){return arguments.length?(n=+u,c()):n},t.domain=function(u){return arguments.length?(r(u),c()):r()},t.ticks=u=>{const f=r();let h=f[0],m=f[f.length-1];const g=m0){for(;v<=b;++v)for(j=1;jm)break;N.push(k)}}else for(;v<=b;++v)for(j=n-1;j>=1;--j)if(k=v>0?j/o(-v):j*o(v),!(km)break;N.push(k)}N.length*2{if(u==null&&(u=10),f==null&&(f=n===10?"s":","),typeof f!="function"&&(!(n%1)&&(f=zu(f)).precision==null&&(f.trim=!0),f=x0(f)),u===1/0)return f;const h=Math.max(1,n*u/t.ticks().length);return m=>{let g=m/o(Math.round(a(m)));return g*nr(qA(r(),{floor:u=>o(Math.floor(a(u))),ceil:u=>o(Math.ceil(a(u)))})),t}function QA(){const e=b0(Qh()).domain([1,10]);return e.copy=()=>oc(e,QA()).base(e.base()),sn.apply(e,arguments),e}function aS(e){return function(t){return Math.sign(t)*Math.log1p(Math.abs(t/e))}}function oS(e){return function(t){return Math.sign(t)*Math.expm1(Math.abs(t))*e}}function w0(e){var t=1,r=e(aS(t),oS(t));return r.constant=function(n){return arguments.length?e(aS(t=+n),oS(t)):t},Na(r)}function YA(){var e=w0(Qh());return e.copy=function(){return oc(e,YA()).constant(e.constant())},sn.apply(e,arguments)}function sS(e){return function(t){return t<0?-Math.pow(-t,e):Math.pow(t,e)}}function J9(e){return e<0?-Math.sqrt(-e):Math.sqrt(e)}function e7(e){return e<0?-e*e:e*e}function k0(e){var t=e(gr,gr),r=1;function n(){return r===1?e(gr,gr):r===.5?e(J9,e7):e(sS(r),sS(1/r))}return t.exponent=function(a){return arguments.length?(r=+a,n()):r},Na(t)}function j0(){var e=k0(Qh());return e.copy=function(){return oc(e,j0()).exponent(e.exponent())},sn.apply(e,arguments),e}function t7(){return j0.apply(null,arguments).exponent(.5)}function lS(e){return Math.sign(e)*e*e}function r7(e){return Math.sign(e)*Math.sqrt(Math.abs(e))}function XA(){var e=v0(),t=[0,1],r=!1,n;function a(o){var c=r7(e(o));return isNaN(c)?n:r?Math.round(c):c}return a.invert=function(o){return e.invert(lS(o))},a.domain=function(o){return arguments.length?(e.domain(o),a):e.domain()},a.range=function(o){return arguments.length?(e.range((t=Array.from(o,Hf)).map(lS)),a):t.slice()},a.rangeRound=function(o){return a.range(o).round(!0)},a.round=function(o){return arguments.length?(r=!!o,a):r},a.clamp=function(o){return arguments.length?(e.clamp(o),a):e.clamp()},a.unknown=function(o){return arguments.length?(n=o,a):n},a.copy=function(){return XA(e.domain(),t).round(r).clamp(e.clamp()).unknown(n)},sn.apply(a,arguments),Na(a)}function ZA(){var e=[],t=[],r=[],n;function a(){var c=0,u=Math.max(1,t.length);for(r=new Array(u-1);++c0?r[u-1]:e[0],u=r?[n[r-1],t]:[n[h-1],n[h]]},c.unknown=function(f){return arguments.length&&(o=f),c},c.thresholds=function(){return n.slice()},c.copy=function(){return JA().domain([e,t]).range(a).unknown(o)},sn.apply(Na(c),arguments)}function eC(){var e=[.5],t=[0,1],r,n=1;function a(o){return o!=null&&o<=o?t[ic(e,o,0,n)]:r}return a.domain=function(o){return arguments.length?(e=Array.from(o),n=Math.min(e.length,t.length-1),a):e.slice()},a.range=function(o){return arguments.length?(t=Array.from(o),n=Math.min(e.length,t.length-1),a):t.slice()},a.invertExtent=function(o){var c=t.indexOf(o);return[e[c-1],e[c]]},a.unknown=function(o){return arguments.length?(r=o,a):r},a.copy=function(){return eC().domain(e).range(t).unknown(r)},sn.apply(a,arguments)}const Og=new Date,_g=new Date;function Ot(e,t,r,n){function a(o){return e(o=arguments.length===0?new Date:new Date(+o)),o}return a.floor=o=>(e(o=new Date(+o)),o),a.ceil=o=>(e(o=new Date(o-1)),t(o,1),e(o),o),a.round=o=>{const c=a(o),u=a.ceil(o);return o-c(t(o=new Date(+o),c==null?1:Math.floor(c)),o),a.range=(o,c,u)=>{const f=[];if(o=a.ceil(o),u=u==null?1:Math.floor(u),!(o0))return f;let h;do f.push(h=new Date(+o)),t(o,u),e(o);while(hOt(c=>{if(c>=c)for(;e(c),!o(c);)c.setTime(c-1)},(c,u)=>{if(c>=c)if(u<0)for(;++u<=0;)for(;t(c,-1),!o(c););else for(;--u>=0;)for(;t(c,1),!o(c););}),r&&(a.count=(o,c)=>(Og.setTime(+o),_g.setTime(+c),e(Og),e(_g),Math.floor(r(Og,_g))),a.every=o=>(o=Math.floor(o),!isFinite(o)||!(o>0)?null:o>1?a.filter(n?c=>n(c)%o===0:c=>a.count(0,c)%o===0):a)),a}const Gf=Ot(()=>{},(e,t)=>{e.setTime(+e+t)},(e,t)=>t-e);Gf.every=e=>(e=Math.floor(e),!isFinite(e)||!(e>0)?null:e>1?Ot(t=>{t.setTime(Math.floor(t/e)*e)},(t,r)=>{t.setTime(+t+r*e)},(t,r)=>(r-t)/e):Gf);Gf.range;const pi=1e3,tn=pi*60,gi=tn*60,ki=gi*24,S0=ki*7,uS=ki*30,Mg=ki*365,ro=Ot(e=>{e.setTime(e-e.getMilliseconds())},(e,t)=>{e.setTime(+e+t*pi)},(e,t)=>(t-e)/pi,e=>e.getUTCSeconds());ro.range;const N0=Ot(e=>{e.setTime(e-e.getMilliseconds()-e.getSeconds()*pi)},(e,t)=>{e.setTime(+e+t*tn)},(e,t)=>(t-e)/tn,e=>e.getMinutes());N0.range;const E0=Ot(e=>{e.setUTCSeconds(0,0)},(e,t)=>{e.setTime(+e+t*tn)},(e,t)=>(t-e)/tn,e=>e.getUTCMinutes());E0.range;const A0=Ot(e=>{e.setTime(e-e.getMilliseconds()-e.getSeconds()*pi-e.getMinutes()*tn)},(e,t)=>{e.setTime(+e+t*gi)},(e,t)=>(t-e)/gi,e=>e.getHours());A0.range;const C0=Ot(e=>{e.setUTCMinutes(0,0,0)},(e,t)=>{e.setTime(+e+t*gi)},(e,t)=>(t-e)/gi,e=>e.getUTCHours());C0.range;const sc=Ot(e=>e.setHours(0,0,0,0),(e,t)=>e.setDate(e.getDate()+t),(e,t)=>(t-e-(t.getTimezoneOffset()-e.getTimezoneOffset())*tn)/ki,e=>e.getDate()-1);sc.range;const Yh=Ot(e=>{e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCDate(e.getUTCDate()+t)},(e,t)=>(t-e)/ki,e=>e.getUTCDate()-1);Yh.range;const tC=Ot(e=>{e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCDate(e.getUTCDate()+t)},(e,t)=>(t-e)/ki,e=>Math.floor(e/ki));tC.range;function _o(e){return Ot(t=>{t.setDate(t.getDate()-(t.getDay()+7-e)%7),t.setHours(0,0,0,0)},(t,r)=>{t.setDate(t.getDate()+r*7)},(t,r)=>(r-t-(r.getTimezoneOffset()-t.getTimezoneOffset())*tn)/S0)}const Xh=_o(0),Vf=_o(1),n7=_o(2),i7=_o(3),Ys=_o(4),a7=_o(5),o7=_o(6);Xh.range;Vf.range;n7.range;i7.range;Ys.range;a7.range;o7.range;function Mo(e){return Ot(t=>{t.setUTCDate(t.getUTCDate()-(t.getUTCDay()+7-e)%7),t.setUTCHours(0,0,0,0)},(t,r)=>{t.setUTCDate(t.getUTCDate()+r*7)},(t,r)=>(r-t)/S0)}const Zh=Mo(0),qf=Mo(1),s7=Mo(2),l7=Mo(3),Xs=Mo(4),u7=Mo(5),c7=Mo(6);Zh.range;qf.range;s7.range;l7.range;Xs.range;u7.range;c7.range;const P0=Ot(e=>{e.setDate(1),e.setHours(0,0,0,0)},(e,t)=>{e.setMonth(e.getMonth()+t)},(e,t)=>t.getMonth()-e.getMonth()+(t.getFullYear()-e.getFullYear())*12,e=>e.getMonth());P0.range;const O0=Ot(e=>{e.setUTCDate(1),e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCMonth(e.getUTCMonth()+t)},(e,t)=>t.getUTCMonth()-e.getUTCMonth()+(t.getUTCFullYear()-e.getUTCFullYear())*12,e=>e.getUTCMonth());O0.range;const ji=Ot(e=>{e.setMonth(0,1),e.setHours(0,0,0,0)},(e,t)=>{e.setFullYear(e.getFullYear()+t)},(e,t)=>t.getFullYear()-e.getFullYear(),e=>e.getFullYear());ji.every=e=>!isFinite(e=Math.floor(e))||!(e>0)?null:Ot(t=>{t.setFullYear(Math.floor(t.getFullYear()/e)*e),t.setMonth(0,1),t.setHours(0,0,0,0)},(t,r)=>{t.setFullYear(t.getFullYear()+r*e)});ji.range;const Si=Ot(e=>{e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCFullYear(e.getUTCFullYear()+t)},(e,t)=>t.getUTCFullYear()-e.getUTCFullYear(),e=>e.getUTCFullYear());Si.every=e=>!isFinite(e=Math.floor(e))||!(e>0)?null:Ot(t=>{t.setUTCFullYear(Math.floor(t.getUTCFullYear()/e)*e),t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)},(t,r)=>{t.setUTCFullYear(t.getUTCFullYear()+r*e)});Si.range;function rC(e,t,r,n,a,o){const c=[[ro,1,pi],[ro,5,5*pi],[ro,15,15*pi],[ro,30,30*pi],[o,1,tn],[o,5,5*tn],[o,15,15*tn],[o,30,30*tn],[a,1,gi],[a,3,3*gi],[a,6,6*gi],[a,12,12*gi],[n,1,ki],[n,2,2*ki],[r,1,S0],[t,1,uS],[t,3,3*uS],[e,1,Mg]];function u(h,m,g){const v=mS).right(c,v);if(b===c.length)return e.every(Jv(h/Mg,m/Mg,g));if(b===0)return Gf.every(Math.max(Jv(h,m,g),1));const[j,k]=c[v/c[b-1][2]53)return null;"w"in ie||(ie.w=1),"Z"in ie?(Fe=Tg(ou(ie.y,0,1)),Oe=Fe.getUTCDay(),Fe=Oe>4||Oe===0?qf.ceil(Fe):qf(Fe),Fe=Yh.offset(Fe,(ie.V-1)*7),ie.y=Fe.getUTCFullYear(),ie.m=Fe.getUTCMonth(),ie.d=Fe.getUTCDate()+(ie.w+6)%7):(Fe=Ig(ou(ie.y,0,1)),Oe=Fe.getDay(),Fe=Oe>4||Oe===0?Vf.ceil(Fe):Vf(Fe),Fe=sc.offset(Fe,(ie.V-1)*7),ie.y=Fe.getFullYear(),ie.m=Fe.getMonth(),ie.d=Fe.getDate()+(ie.w+6)%7)}else("W"in ie||"U"in ie)&&("w"in ie||(ie.w="u"in ie?ie.u%7:"W"in ie?1:0),Oe="Z"in ie?Tg(ou(ie.y,0,1)).getUTCDay():Ig(ou(ie.y,0,1)).getDay(),ie.m=0,ie.d="W"in ie?(ie.w+6)%7+ie.W*7-(Oe+5)%7:ie.w+ie.U*7-(Oe+6)%7);return"Z"in ie?(ie.H+=ie.Z/100|0,ie.M+=ie.Z%100,Tg(ie)):Ig(ie)}}function U(re,xe,_e,ie){for(var Je=0,Fe=xe.length,Oe=_e.length,ut,Jt;Je=Oe)return-1;if(ut=xe.charCodeAt(Je++),ut===37){if(ut=xe.charAt(Je++),Jt=_[ut in cS?xe.charAt(Je++):ut],!Jt||(ie=Jt(re,_e,ie))<0)return-1}else if(ut!=_e.charCodeAt(ie++))return-1}return ie}function B(re,xe,_e){var ie=h.exec(xe.slice(_e));return ie?(re.p=m.get(ie[0].toLowerCase()),_e+ie[0].length):-1}function F(re,xe,_e){var ie=b.exec(xe.slice(_e));return ie?(re.w=j.get(ie[0].toLowerCase()),_e+ie[0].length):-1}function Y(re,xe,_e){var ie=g.exec(xe.slice(_e));return ie?(re.w=v.get(ie[0].toLowerCase()),_e+ie[0].length):-1}function H(re,xe,_e){var ie=N.exec(xe.slice(_e));return ie?(re.m=E.get(ie[0].toLowerCase()),_e+ie[0].length):-1}function pe(re,xe,_e){var ie=k.exec(xe.slice(_e));return ie?(re.m=S.get(ie[0].toLowerCase()),_e+ie[0].length):-1}function ue(re,xe,_e){return U(re,t,xe,_e)}function he(re,xe,_e){return U(re,r,xe,_e)}function ae(re,xe,_e){return U(re,n,xe,_e)}function se(re){return c[re.getDay()]}function X(re){return o[re.getDay()]}function te(re){return f[re.getMonth()]}function J(re){return u[re.getMonth()]}function I(re){return a[+(re.getHours()>=12)]}function M(re){return 1+~~(re.getMonth()/3)}function K(re){return c[re.getUTCDay()]}function ne(re){return o[re.getUTCDay()]}function Z(re){return f[re.getUTCMonth()]}function me(re){return u[re.getUTCMonth()]}function ge(re){return a[+(re.getUTCHours()>=12)]}function Pe(re){return 1+~~(re.getUTCMonth()/3)}return{format:function(re){var xe=O(re+="",A);return xe.toString=function(){return re},xe},parse:function(re){var xe=D(re+="",!1);return xe.toString=function(){return re},xe},utcFormat:function(re){var xe=O(re+="",P);return xe.toString=function(){return re},xe},utcParse:function(re){var xe=D(re+="",!0);return xe.toString=function(){return re},xe}}}var cS={"-":"",_:" ",0:"0"},Bt=/^\s*\d+/,g7=/^%/,v7=/[\\^$*+?|[\]().{}]/g;function Ye(e,t,r){var n=e<0?"-":"",a=(n?-e:e)+"",o=a.length;return n+(o[t.toLowerCase(),r]))}function x7(e,t,r){var n=Bt.exec(t.slice(r,r+1));return n?(e.w=+n[0],r+n[0].length):-1}function b7(e,t,r){var n=Bt.exec(t.slice(r,r+1));return n?(e.u=+n[0],r+n[0].length):-1}function w7(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.U=+n[0],r+n[0].length):-1}function k7(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.V=+n[0],r+n[0].length):-1}function j7(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.W=+n[0],r+n[0].length):-1}function dS(e,t,r){var n=Bt.exec(t.slice(r,r+4));return n?(e.y=+n[0],r+n[0].length):-1}function fS(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.y=+n[0]+(+n[0]>68?1900:2e3),r+n[0].length):-1}function S7(e,t,r){var n=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(t.slice(r,r+6));return n?(e.Z=n[1]?0:-(n[2]+(n[3]||"00")),r+n[0].length):-1}function N7(e,t,r){var n=Bt.exec(t.slice(r,r+1));return n?(e.q=n[0]*3-3,r+n[0].length):-1}function E7(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.m=n[0]-1,r+n[0].length):-1}function hS(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.d=+n[0],r+n[0].length):-1}function A7(e,t,r){var n=Bt.exec(t.slice(r,r+3));return n?(e.m=0,e.d=+n[0],r+n[0].length):-1}function mS(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.H=+n[0],r+n[0].length):-1}function C7(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.M=+n[0],r+n[0].length):-1}function P7(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.S=+n[0],r+n[0].length):-1}function O7(e,t,r){var n=Bt.exec(t.slice(r,r+3));return n?(e.L=+n[0],r+n[0].length):-1}function _7(e,t,r){var n=Bt.exec(t.slice(r,r+6));return n?(e.L=Math.floor(n[0]/1e3),r+n[0].length):-1}function M7(e,t,r){var n=g7.exec(t.slice(r,r+1));return n?r+n[0].length:-1}function I7(e,t,r){var n=Bt.exec(t.slice(r));return n?(e.Q=+n[0],r+n[0].length):-1}function T7(e,t,r){var n=Bt.exec(t.slice(r));return n?(e.s=+n[0],r+n[0].length):-1}function pS(e,t){return Ye(e.getDate(),t,2)}function D7(e,t){return Ye(e.getHours(),t,2)}function R7(e,t){return Ye(e.getHours()%12||12,t,2)}function L7(e,t){return Ye(1+sc.count(ji(e),e),t,3)}function nC(e,t){return Ye(e.getMilliseconds(),t,3)}function $7(e,t){return nC(e,t)+"000"}function z7(e,t){return Ye(e.getMonth()+1,t,2)}function F7(e,t){return Ye(e.getMinutes(),t,2)}function B7(e,t){return Ye(e.getSeconds(),t,2)}function U7(e){var t=e.getDay();return t===0?7:t}function H7(e,t){return Ye(Xh.count(ji(e)-1,e),t,2)}function iC(e){var t=e.getDay();return t>=4||t===0?Ys(e):Ys.ceil(e)}function W7(e,t){return e=iC(e),Ye(Ys.count(ji(e),e)+(ji(e).getDay()===4),t,2)}function K7(e){return e.getDay()}function G7(e,t){return Ye(Vf.count(ji(e)-1,e),t,2)}function V7(e,t){return Ye(e.getFullYear()%100,t,2)}function q7(e,t){return e=iC(e),Ye(e.getFullYear()%100,t,2)}function Q7(e,t){return Ye(e.getFullYear()%1e4,t,4)}function Y7(e,t){var r=e.getDay();return e=r>=4||r===0?Ys(e):Ys.ceil(e),Ye(e.getFullYear()%1e4,t,4)}function X7(e){var t=e.getTimezoneOffset();return(t>0?"-":(t*=-1,"+"))+Ye(t/60|0,"0",2)+Ye(t%60,"0",2)}function gS(e,t){return Ye(e.getUTCDate(),t,2)}function Z7(e,t){return Ye(e.getUTCHours(),t,2)}function J7(e,t){return Ye(e.getUTCHours()%12||12,t,2)}function eB(e,t){return Ye(1+Yh.count(Si(e),e),t,3)}function aC(e,t){return Ye(e.getUTCMilliseconds(),t,3)}function tB(e,t){return aC(e,t)+"000"}function rB(e,t){return Ye(e.getUTCMonth()+1,t,2)}function nB(e,t){return Ye(e.getUTCMinutes(),t,2)}function iB(e,t){return Ye(e.getUTCSeconds(),t,2)}function aB(e){var t=e.getUTCDay();return t===0?7:t}function oB(e,t){return Ye(Zh.count(Si(e)-1,e),t,2)}function oC(e){var t=e.getUTCDay();return t>=4||t===0?Xs(e):Xs.ceil(e)}function sB(e,t){return e=oC(e),Ye(Xs.count(Si(e),e)+(Si(e).getUTCDay()===4),t,2)}function lB(e){return e.getUTCDay()}function uB(e,t){return Ye(qf.count(Si(e)-1,e),t,2)}function cB(e,t){return Ye(e.getUTCFullYear()%100,t,2)}function dB(e,t){return e=oC(e),Ye(e.getUTCFullYear()%100,t,2)}function fB(e,t){return Ye(e.getUTCFullYear()%1e4,t,4)}function hB(e,t){var r=e.getUTCDay();return e=r>=4||r===0?Xs(e):Xs.ceil(e),Ye(e.getUTCFullYear()%1e4,t,4)}function mB(){return"+0000"}function vS(){return"%"}function yS(e){return+e}function xS(e){return Math.floor(+e/1e3)}var ds,sC,lC;pB({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});function pB(e){return ds=p7(e),sC=ds.format,ds.parse,lC=ds.utcFormat,ds.utcParse,ds}function gB(e){return new Date(e)}function vB(e){return e instanceof Date?+e:+new Date(+e)}function _0(e,t,r,n,a,o,c,u,f,h){var m=v0(),g=m.invert,v=m.domain,b=h(".%L"),j=h(":%S"),k=h("%I:%M"),S=h("%I %p"),N=h("%a %d"),E=h("%b %d"),A=h("%B"),P=h("%Y");function _(O){return(f(O)t(a/(e.length-1)))},r.quantiles=function(n){return Array.from({length:n+1},(a,o)=>a9(e,o/n))},r.copy=function(){return fC(t).domain(e)},Ci.apply(r,arguments)}function em(){var e=0,t=.5,r=1,n=1,a,o,c,u,f,h=gr,m,g=!1,v;function b(k){return isNaN(k=+k)?v:(k=.5+((k=+m(k))-o)*(n*k{if(e!=null){var n=e.scale,a=e.type;if(n==="auto")return a==="category"&&r&&(r.indexOf("LineChart")>=0||r.indexOf("AreaChart")>=0||r.indexOf("ComposedChart")>=0&&!t)?"point":a==="category"?"band":"linear";if(typeof n=="string")return SB(n)?n:"point"}};function NB(e,t){for(var r=0,n=e.length,a=e[0]t)?r=o+1:n=o}return r}function yC(e,t){if(e){var r=t??e.domain(),n=r.map(o=>{var c;return(c=e(o))!==null&&c!==void 0?c:0}),a=e.range();if(!(r.length===0||a.length<2))return o=>{var c,u,f=NB(n,o);if(f<=0)return r[0];if(f>=r.length)return r[r.length-1];var h=(c=n[f-1])!==null&&c!==void 0?c:0,m=(u=n[f])!==null&&u!==void 0?u:0;return Math.abs(o-h)<=Math.abs(o-m)?r[f-1]:r[f]}}}function EB(e){if(e!=null)return"invert"in e&&typeof e.invert=="function"?e.invert.bind(e):yC(e,void 0)}function wS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function Qf(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);re.cartesianAxis.xAxis[t],Pi=(e,t)=>{var r=bC(e,t);return r??Ct},Pt={allowDataOverflow:!1,allowDecimals:!0,allowDuplicatedCategory:!0,angle:0,dataKey:void 0,domain:iy,hide:!0,id:0,includeHidden:!1,interval:"preserveEnd",minTickGap:5,mirror:!1,name:void 0,orientation:"left",padding:{top:0,bottom:0},reversed:!1,scale:"auto",tick:!0,tickCount:5,tickFormatter:void 0,ticks:void 0,type:"number",unit:void 0,niceTicks:"auto",width:Ju},wC=(e,t)=>e.cartesianAxis.yAxis[t],Oi=(e,t)=>{var r=wC(e,t);return r??Pt},TB={domain:[0,"auto"],includeHidden:!1,reversed:!1,allowDataOverflow:!1,allowDuplicatedCategory:!1,dataKey:void 0,id:0,name:"",range:[64,64],scale:"auto",type:"number",unit:""},D0=(e,t)=>{var r=e.cartesianAxis.zAxis[t];return r??TB},yr=(e,t,r)=>{switch(t){case"xAxis":return Pi(e,r);case"yAxis":return Oi(e,r);case"zAxis":return D0(e,r);case"angleAxis":return a0(e,r);case"radiusAxis":return o0(e,r);default:throw new Error("Unexpected axis type: ".concat(t))}},DB=(e,t,r)=>{switch(t){case"xAxis":return Pi(e,r);case"yAxis":return Oi(e,r);default:throw new Error("Unexpected axis type: ".concat(t))}},lc=(e,t,r)=>{switch(t){case"xAxis":return Pi(e,r);case"yAxis":return Oi(e,r);case"angleAxis":return a0(e,r);case"radiusAxis":return o0(e,r);default:throw new Error("Unexpected axis type: ".concat(t))}},kC=e=>e.graphicalItems.cartesianItems.some(t=>t.type==="bar")||e.graphicalItems.polarItems.some(t=>t.type==="radialBar");function jC(e,t){return r=>{switch(e){case"xAxis":return"xAxisId"in r&&r.xAxisId===t;case"yAxis":return"yAxisId"in r&&r.yAxisId===t;case"zAxis":return"zAxisId"in r&&r.zAxisId===t;case"angleAxis":return"angleAxisId"in r&&r.angleAxisId===t;case"radiusAxis":return"radiusAxisId"in r&&r.radiusAxisId===t;default:return!1}}}var SC=e=>e.graphicalItems.cartesianItems,RB=q([zt,Gh],jC),NC=(e,t,r)=>e.filter(r).filter(n=>(t==null?void 0:t.includeHidden)===!0?!0:!n.hide),ul=q([SC,yr,RB],NC,{memoizeOptions:{resultEqualityCheck:qh}}),EC=q([ul],e=>e.filter(t=>t.type==="area"||t.type==="bar").filter(u0)),AC=e=>e.filter(t=>!("stackId"in t)||t.stackId===void 0),LB=q([ul],AC),CC=e=>e.map(t=>t.data).filter(Boolean).flat(1),$B=q([ul],e=>e.some(t=>!t.data)),PC=q([ul],CC,{memoizeOptions:{resultEqualityCheck:qh}}),OC=(e,t)=>{var r=t.chartData,n=r===void 0?[]:r,a=t.dataStartIndex,o=t.dataEndIndex;return e.length>0?e:n.slice(a,o+1)},R0=q([PC,Bh],OC),zB=(e,t,r)=>(t==null?void 0:t.dataKey)!=null?e.map(n=>({value:Lt(n,t.dataKey)})):r.length>0?r.map(n=>n.dataKey).flatMap(n=>e.map(a=>({value:Lt(a,n)}))):e.map(n=>({value:n})),_C=(e,t,r,n,a,o)=>{var c=n.chartData,u=c===void 0?[]:c,f=n.dataStartIndex,h=n.dataEndIndex,m=zB(e,t,r);if(a&&(t==null?void 0:t.dataKey)!=null&&o.length>0){var g=u.slice(f,h+1),v=g.map(b=>({value:Lt(b,t.dataKey)})).filter(b=>b.value!=null);return[...v,...m]}return m},uc=q([R0,yr,ul,Bh,$B,PC],_C);function As(e){if(Gn(e)||e instanceof Date){var t=Number(e);if(We(t))return t}}function jS(e){if(Array.isArray(e)){var t=[As(e[0]),As(e[1])];return Bn(t)?t:void 0}var r=As(e);if(r!=null)return[r,r]}function Qn(e){return e.map(As).filter(Ar)}function FB(e,t){var r=As(e),n=As(t);return r==null&&n==null?0:r==null?-1:n==null?1:r-n}var BB=q([uc],e=>e==null?void 0:e.map(t=>t.value).sort(FB));function MC(e,t){switch(e){case"xAxis":return t.direction==="x";case"yAxis":return t.direction==="y";default:return!1}}function UB(e,t,r){if(!r)return[];if(!r.length)return[];var n;if(typeof t=="number"&&!Kn(t))n=t;else if(Array.isArray(t)){var a=Qn(t);a.length>0&&(n=Math.max(...a))}return n==null?[]:Qn(r.flatMap(o=>{var c=Lt(e,o.dataKey),u,f;if(Array.isArray(c)){var h=xC(c,2);u=h[0],f=h[1]}else u=f=c;if(!(!We(u)||!We(f)))return[n-u,n+f]}))}var _t=e=>{var t=Ft(e),r=sl(e);return lc(e,t,r)},Zs=q([_t],e=>e==null?void 0:e.dataKey),HB=q([EC,Bh,_t],RA),IC=(e,t,r,n)=>{var a={},o=t.reduce((c,u)=>{if(u.stackId==null)return c;var f=c[u.stackId];return f==null&&(f=[]),f.push(u),c[u.stackId]=f,c},a);return Object.fromEntries(Object.entries(o).map(c=>{var u=xC(c,2),f=u[0],h=u[1],m=n?[...h].reverse():h,g=m.map(l0);return[f,{stackedData:sz(e,g,r),graphicalItems:m}]}))},TC=q([HB,EC,Uh,PA],IC),DC=(e,t,r,n)=>{var a=t.dataStartIndex,o=t.dataEndIndex;if(n==null&&r!=="zAxis")return dz(e,a,o)},WB=q([yr],e=>e.allowDataOverflow),L0=e=>{var t;if(e==null||!("domain"in e))return iy;if(e.domain!=null)return e.domain;if("ticks"in e&&e.ticks!=null){if(e.type==="number"){var r=Qn(e.ticks);return[Math.min(...r),Math.max(...r)]}if(e.type==="category")return e.ticks.map(String)}return(t=e==null?void 0:e.domain)!==null&&t!==void 0?t:iy},RC=q([yr],L0),LC=q([RC,WB],yA),KB=q([TC,Nn,zt,LC],DC,{memoizeOptions:{resultEqualityCheck:Vh}}),$0=e=>e.errorBars,GB=(e,t,r)=>e.flatMap(n=>t[n.id]).filter(Boolean).filter(n=>MC(r,n)),Yf=function(){for(var t=arguments.length,r=new Array(t),n=0;n5&&arguments[5]!==void 0?arguments[5]:[],u,f;if(n.length>0&&n.forEach(h=>{var m,g=h.data!=null?[...h.data]:c,v=(m=a[h.id])===null||m===void 0?void 0:m.filter(b=>MC(o,b));g.forEach(b=>{var j,k=Lt(b,(j=r.dataKey)!==null&&j!==void 0?j:h.dataKey),S=UB(b,k,v);if(S.length>=2){var N=Math.min(...S),E=Math.max(...S);(u==null||Nf)&&(f=E)}var A=jS(k);A!=null&&(u=u==null?A[0]:Math.min(u,A[0]),f=f==null?A[1]:Math.max(f,A[1]))})}),(r==null?void 0:r.dataKey)!=null&&n.length===0&&t.forEach(h=>{var m=jS(Lt(h,r.dataKey));m!=null&&(u=u==null?m[0]:Math.min(u,m[0]),f=f==null?m[1]:Math.max(f,m[1]))}),We(u)&&We(f))return[u,f]},VB=q([R0,yr,LB,$0,zt,jF],$C,{memoizeOptions:{resultEqualityCheck:Vh}});function qB(e){var t=e.value;if(Gn(t)||t instanceof Date)return t}var QB=(e,t,r)=>{var n=e.map(qB).filter(a=>a!=null);return r&&(t.dataKey==null||t.allowDuplicatedCategory&&QE(n))?vA(0,e.length):t.allowDuplicatedCategory?n:Array.from(new Set(n))},zC=e=>e.referenceElements.dots,cl=(e,t,r)=>e.filter(n=>n.ifOverflow==="extendDomain").filter(n=>t==="xAxis"?n.xAxisId===r:n.yAxisId===r),YB=q([zC,zt,Gh],cl),FC=e=>e.referenceElements.areas,XB=q([FC,zt,Gh],cl),BC=e=>e.referenceElements.lines,ZB=q([BC,zt,Gh],cl),UC=(e,t)=>{if(e!=null){var r=Qn(e.map(n=>t==="xAxis"?n.x:n.y));if(r.length!==0)return[Math.min(...r),Math.max(...r)]}},JB=q(YB,zt,UC),HC=(e,t)=>{if(e!=null){var r=Qn(e.flatMap(n=>[t==="xAxis"?n.x1:n.y1,t==="xAxis"?n.x2:n.y2]));if(r.length!==0)return[Math.min(...r),Math.max(...r)]}},eU=q([XB,zt],HC);function tU(e){var t;if(e.x!=null)return Qn([e.x]);var r=(t=e.segment)===null||t===void 0?void 0:t.map(n=>n.x);return r==null||r.length===0?[]:Qn(r)}function rU(e){var t;if(e.y!=null)return Qn([e.y]);var r=(t=e.segment)===null||t===void 0?void 0:t.map(n=>n.y);return r==null||r.length===0?[]:Qn(r)}var WC=(e,t)=>{if(e!=null){var r=e.flatMap(n=>t==="xAxis"?tU(n):rU(n));if(r.length!==0)return[Math.min(...r),Math.max(...r)]}},nU=q([ZB,zt],WC),iU=q(JB,nU,eU,(e,t,r)=>Yf(e,r,t)),KC=(e,t,r,n,a,o,c,u)=>{if(r!=null)return r;var f=c==="vertical"&&u==="xAxis"||c==="horizontal"&&u==="yAxis",h=f?Yf(n,o,a):Yf(o,a);return PF(t,h,e.allowDataOverflow)},aU=q([yr,RC,LC,KB,VB,iU,ft,zt],KC,{memoizeOptions:{resultEqualityCheck:Vh}}),oU=[0,1],GC=(e,t,r,n,a,o,c)=>{if(!((e==null||r==null||r.length===0)&&c===void 0)){var u=e.dataKey,f=e.type,h=Xn(t,o);if(h&&u==null){var m;return vA(0,(m=r==null?void 0:r.length)!==null&&m!==void 0?m:0)}return f==="category"?QB(n,e,h):a==="expand"&&!h?oU:c}},z0=q([yr,ft,R0,uc,Uh,zt,aU],GC),dl=q([yr,kC,r0],vC),VC=(e,t,r)=>{var n=t.niceTicks;if(n!=="none"){var a=L0(t),o=Array.isArray(a)&&(a[0]==="auto"||a[1]==="auto");if((n==="snap125"||n==="adaptive")&&t!=null&&t.tickCount&&Bn(e)){if(o)return Mj(e,t.tickCount,t.allowDecimals,n);if(t.type==="number")return Ij(e,t.tickCount,t.allowDecimals,n)}if(n==="auto"&&r==="linear"&&t!=null&&t.tickCount){if(o&&Bn(e))return Mj(e,t.tickCount,t.allowDecimals,"adaptive");if(t.type==="number"&&Bn(e))return Ij(e,t.tickCount,t.allowDecimals,"adaptive")}}},F0=q([z0,lc,dl],VC),qC=(e,t,r,n)=>{if(n!=="angleAxis"&&(e==null?void 0:e.type)==="number"&&Bn(t)&&Array.isArray(r)&&r.length>0){var a,o,c=t[0],u=(a=r[0])!==null&&a!==void 0?a:0,f=t[1],h=(o=r[r.length-1])!==null&&o!==void 0?o:0;return[Math.min(c,u),Math.max(f,h)]}return t},sU=q([yr,z0,F0,zt],qC),lU=q(uc,yr,(e,t)=>{if(!(!t||t.type!=="number")){var r=1/0,n=Array.from(Qn(e.map(g=>g.value))).sort((g,v)=>g-v),a=n[0],o=n[n.length-1];if(a==null||o==null)return 1/0;var c=o-a;if(c===0)return 1/0;for(var u=0;ua,(e,t,r,n,a)=>{if(!We(e))return 0;var o=t==="vertical"?n.height:n.width;if(a==="gap")return e*o/2;if(a==="no-gap"){var c=Sa(r,e*o),u=e*o/2;return u-c-(u-c)/o*c}return 0}),uU=(e,t,r)=>{var n=Pi(e,t);return n==null||typeof n.padding!="string"?0:QC(e,"xAxis",t,r,n.padding)},cU=(e,t,r)=>{var n=Oi(e,t);return n==null||typeof n.padding!="string"?0:QC(e,"yAxis",t,r,n.padding)},dU=q(Pi,uU,(e,t)=>{var r,n;if(e==null)return{left:0,right:0};var a=e.padding;return typeof a=="string"?{left:t,right:t}:{left:((r=a.left)!==null&&r!==void 0?r:0)+t,right:((n=a.right)!==null&&n!==void 0?n:0)+t}}),fU=q(Oi,cU,(e,t)=>{var r,n;if(e==null)return{top:0,bottom:0};var a=e.padding;return typeof a=="string"?{top:t,bottom:t}:{top:((r=a.top)!==null&&r!==void 0?r:0)+t,bottom:((n=a.bottom)!==null&&n!==void 0?n:0)+t}}),YC=q([Zt,dU,Dh,Th,(e,t,r)=>r],(e,t,r,n,a)=>{var o=n.padding;return a?[o.left,r.width-o.right]:[e.left+t.left,e.left+e.width-t.right]}),XC=q([Zt,ft,fU,Dh,Th,(e,t,r)=>r],(e,t,r,n,a,o)=>{var c=a.padding;return o?[n.height-c.bottom,c.top]:t==="horizontal"?[e.top+e.height-r.bottom,e.top+r.top]:[e.top+r.top,e.top+e.height-r.bottom]}),cc=(e,t,r,n)=>{var a;switch(t){case"xAxis":return YC(e,r,n);case"yAxis":return XC(e,r,n);case"zAxis":return(a=D0(e,r))===null||a===void 0?void 0:a.range;case"angleAxis":return IA(e);case"radiusAxis":return TA(e,r);default:return}},ZC=q([yr,cc],Hh),hU=q([dl,sU],VF),B0=q([yr,dl,hU,ZC],T0),JC=(e,t,r,n)=>{if(!(r==null||r.dataKey==null)){var a=r.type,o=r.scale,c=Xn(e,n);if(c&&(a==="number"||o!=="auto"))return t.map(u=>u.value)}},U0=q([ft,uc,lc,zt],JC),tm=q([B0],c0);q([B0],EB);q([B0,BB],yC);q([ul,$0,zt],GB);function eP(e,t){return e.idt.id?1:0}var rm=(e,t)=>t,nm=(e,t,r)=>r,mU=q(Mh,rm,nm,(e,t,r)=>e.filter(n=>n.orientation===t).filter(n=>n.mirror===r).sort(eP)),pU=q(Ih,rm,nm,(e,t,r)=>e.filter(n=>n.orientation===t).filter(n=>n.mirror===r).sort(eP)),tP=(e,t)=>({width:e.width,height:t.height}),gU=(e,t)=>{var r=typeof t.width=="number"?t.width:Ju;return{width:r,height:e.height}},vU=q(Zt,Pi,tP),yU=(e,t,r)=>{switch(t){case"top":return e.top;case"bottom":return r-e.bottom;default:return 0}},xU=(e,t,r)=>{switch(t){case"left":return e.left;case"right":return r-e.right;default:return 0}},bU=q(Ai,Zt,mU,rm,nm,(e,t,r,n,a)=>{var o={},c;return r.forEach(u=>{var f=tP(t,u);c==null&&(c=yU(t,n,e));var h=n==="top"&&!a||n==="bottom"&&a;o[u.id]=c-Number(h)*f.height,c+=(h?-1:1)*f.height}),o}),wU=q(Ei,Zt,pU,rm,nm,(e,t,r,n,a)=>{var o={},c;return r.forEach(u=>{var f=gU(t,u);c==null&&(c=xU(t,n,e));var h=n==="left"&&!a||n==="right"&&a;o[u.id]=c-Number(h)*f.width,c+=(h?-1:1)*f.width}),o}),kU=(e,t)=>{var r=Pi(e,t);if(r!=null)return bU(e,r.orientation,r.mirror)},jU=q([Zt,Pi,kU,(e,t)=>t],(e,t,r,n)=>{if(t!=null){var a=r==null?void 0:r[n];return a==null?{x:e.left,y:0}:{x:e.left,y:a}}}),SU=(e,t)=>{var r=Oi(e,t);if(r!=null)return wU(e,r.orientation,r.mirror)},NU=q([Zt,Oi,SU,(e,t)=>t],(e,t,r,n)=>{if(t!=null){var a=r==null?void 0:r[n];return a==null?{x:0,y:e.top}:{x:a,y:e.top}}}),EU=q(Zt,Oi,(e,t)=>{var r=typeof t.width=="number"?t.width:Ju;return{width:r,height:e.height}}),rP=(e,t,r,n)=>{if(r!=null){var a=r.allowDuplicatedCategory,o=r.type,c=r.dataKey,u=Xn(e,n),f=t.map(m=>m.value),h=f.filter(m=>m!=null);if(c&&u&&o==="category"&&a&&QE(h))return f}},H0=q([ft,uc,yr,zt],rP),SS=q([ft,DB,dl,tm,H0,U0,cc,F0,zt],(e,t,r,n,a,o,c,u,f)=>{if(t!=null){var h=Xn(e,f);return{angle:t.angle,interval:t.interval,minTickGap:t.minTickGap,orientation:t.orientation,tick:t.tick,tickCount:t.tickCount,tickFormatter:t.tickFormatter,ticks:t.ticks,type:t.type,unit:t.unit,axisType:f,categoricalDomain:o,duplicateDomain:a,isCategorical:h,niceTicks:u,range:c,realScaleType:r,scale:n}}}),AU=(e,t,r,n,a,o,c,u,f)=>{if(!(t==null||n==null)){var h=Xn(e,f),m=t.type,g=t.ticks,v=t.tickCount,b=r==="scaleBand"&&typeof n.bandwidth=="function"?n.bandwidth()/2:2,j=m==="category"&&n.bandwidth?n.bandwidth()/b:0;j=f==="angleAxis"&&o!=null&&o.length>=2?Jr(o[0]-o[1])*2*j:j;var k=g||a;return k?k.map((S,N)=>{var E=c?c.indexOf(S):S,A=n.map(E);return We(A)?{index:N,coordinate:A+j,value:S,offset:j}:null}).filter(Ar):h&&u?u.map((S,N)=>{var E=n.map(S);return We(E)?{coordinate:E+j,value:S,index:N,offset:j}:null}).filter(Ar):n.ticks?n.ticks(v).map((S,N)=>{var E=n.map(S);return We(E)?{coordinate:E+j,value:S,index:N,offset:j}:null}).filter(Ar):n.domain().map((S,N)=>{var E=n.map(S);return We(E)?{coordinate:E+j,value:c?c[S]:S,index:N,offset:j}:null}).filter(Ar)}},nP=q([ft,lc,dl,tm,F0,cc,H0,U0,zt],AU),CU=(e,t,r,n,a,o,c)=>{if(!(t==null||r==null||n==null||n[0]===n[1])){var u=Xn(e,c),f=t.tickCount,h=0;return h=c==="angleAxis"&&(n==null?void 0:n.length)>=2?Jr(n[0]-n[1])*2*h:h,u&&o?o.map((m,g)=>{var v=r.map(m);return We(v)?{coordinate:v+h,value:m,index:g,offset:h}:null}).filter(Ar):r.ticks?r.ticks(f).map((m,g)=>{var v=r.map(m);return We(v)?{coordinate:v+h,value:m,index:g,offset:h}:null}).filter(Ar):r.domain().map((m,g)=>{var v=r.map(m);return We(v)?{coordinate:v+h,value:a?a[m]:m,index:g,offset:h}:null}).filter(Ar)}},iP=q([ft,lc,tm,cc,H0,U0,zt],CU),aP=q(yr,tm,(e,t)=>{if(!(e==null||t==null))return Qf(Qf({},e),{},{scale:t})}),PU=q([yr,dl,z0,ZC],T0),OU=q([PU],c0);q((e,t,r)=>D0(e,r),OU,(e,t)=>{if(!(e==null||t==null))return Qf(Qf({},e),{},{scale:t})});var _U=q([ft,Mh,Ih],(e,t,r)=>{switch(e){case"horizontal":return t.some(n=>n.reversed)?"right-to-left":"left-to-right";case"vertical":return r.some(n=>n.reversed)?"bottom-to-top":"top-to-bottom";case"centric":case"radial":return"left-to-right";default:return}}),MU=(e,t,r)=>{var n;return(n=e.renderedTicks[t])===null||n===void 0?void 0:n[r]};q([MU],e=>{if(!(!e||e.length===0))return t=>{var r,n=1/0,a=e[0];for(var o of e){var c=Math.abs(o.coordinate-t);ce.options.defaultTooltipEventType,sP=e=>e.options.validateTooltipEventTypes;function lP(e,t,r){if(e==null)return t;var n=e?"axis":"item";return r==null?t:r.includes(n)?n:t}function dc(e,t){var r=oP(e),n=sP(e);return lP(t,r,n)}function IU(e){return Me(t=>dc(t,e))}var uP=(e,t)=>{var r,n=Number(t);if(!(Kn(n)||t==null))return n>=0?e==null||(r=e[n])===null||r===void 0?void 0:r.value:void 0},TU=e=>e.tooltip.settings,la={active:!1,index:null,dataKey:void 0,graphicalItemId:void 0,coordinate:void 0},DU={itemInteraction:{click:la,hover:la},axisInteraction:{click:la,hover:la},keyboardInteraction:la,syncInteraction:{active:!1,index:null,dataKey:void 0,label:void 0,coordinate:void 0,sourceViewBox:void 0,graphicalItemId:void 0},tooltipItemPayloads:[],settings:{shared:void 0,trigger:"hover",axisId:0,active:!1,defaultIndex:void 0}},cP=lr({name:"tooltip",initialState:DU,reducers:{addTooltipEntrySettings:{reducer(e,t){e.tooltipItemPayloads.push(t.payload)},prepare:st()},replaceTooltipEntrySettings:{reducer(e,t){var r=t.payload,n=r.prev,a=r.next,o=en(e).tooltipItemPayloads.indexOf(n);o>-1&&(e.tooltipItemPayloads[o]=a)},prepare:st()},removeTooltipEntrySettings:{reducer(e,t){var r=en(e).tooltipItemPayloads.indexOf(t.payload);r>-1&&e.tooltipItemPayloads.splice(r,1)},prepare:st()},setTooltipSettingsState(e,t){e.settings=t.payload},setActiveMouseOverItemIndex(e,t){e.syncInteraction.active=!1,e.syncInteraction.sourceViewBox=void 0,e.keyboardInteraction.active=!1,e.itemInteraction.hover.active=!0,e.itemInteraction.hover.index=t.payload.activeIndex,e.itemInteraction.hover.dataKey=t.payload.activeDataKey,e.itemInteraction.hover.graphicalItemId=t.payload.activeGraphicalItemId,e.itemInteraction.hover.coordinate=t.payload.activeCoordinate},mouseLeaveChart(e){e.itemInteraction.hover.active=!1,e.axisInteraction.hover.active=!1},mouseLeaveItem(e){e.itemInteraction.hover.active=!1},setActiveClickItemIndex(e,t){e.syncInteraction.active=!1,e.syncInteraction.sourceViewBox=void 0,e.itemInteraction.click.active=!0,e.keyboardInteraction.active=!1,e.itemInteraction.click.index=t.payload.activeIndex,e.itemInteraction.click.dataKey=t.payload.activeDataKey,e.itemInteraction.click.graphicalItemId=t.payload.activeGraphicalItemId,e.itemInteraction.click.coordinate=t.payload.activeCoordinate},setMouseOverAxisIndex(e,t){e.syncInteraction.active=!1,e.syncInteraction.sourceViewBox=void 0,e.axisInteraction.hover.active=!0,e.keyboardInteraction.active=!1,e.axisInteraction.hover.index=t.payload.activeIndex,e.axisInteraction.hover.dataKey=t.payload.activeDataKey,e.axisInteraction.hover.coordinate=t.payload.activeCoordinate},setMouseClickAxisIndex(e,t){e.syncInteraction.active=!1,e.syncInteraction.sourceViewBox=void 0,e.keyboardInteraction.active=!1,e.axisInteraction.click.active=!0,e.axisInteraction.click.index=t.payload.activeIndex,e.axisInteraction.click.dataKey=t.payload.activeDataKey,e.axisInteraction.click.coordinate=t.payload.activeCoordinate},setSyncInteraction(e,t){e.syncInteraction=t.payload},setKeyboardInteraction(e,t){e.keyboardInteraction.active=t.payload.active,e.keyboardInteraction.index=t.payload.activeIndex,e.keyboardInteraction.coordinate=t.payload.activeCoordinate}}}),ln=cP.actions,RU=ln.addTooltipEntrySettings,LU=ln.replaceTooltipEntrySettings,$U=ln.removeTooltipEntrySettings,zU=ln.setTooltipSettingsState,FU=ln.setActiveMouseOverItemIndex;ln.mouseLeaveItem;var dP=ln.mouseLeaveChart;ln.setActiveClickItemIndex;var fP=ln.setMouseOverAxisIndex,BU=ln.setMouseClickAxisIndex,gu=ln.setSyncInteraction,Xf=ln.setKeyboardInteraction,UU=cP.reducer;function NS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function Wd(e){for(var t=1;t{if(t==null)return la;var a=GU(e,t,r);if(a==null)return la;if(a.active)return a;if(e.keyboardInteraction.active)return e.keyboardInteraction;if(e.syncInteraction.active&&e.syncInteraction.index!=null)return e.syncInteraction;var o=e.settings.active===!0;if(VU(a)){if(o)return Wd(Wd({},a),{},{active:!0})}else if(n!=null)return{active:!0,coordinate:void 0,dataKey:void 0,index:n,graphicalItemId:void 0};return Wd(Wd({},la),{},{coordinate:a.coordinate})};function qU(e){if(typeof e=="number")return Number.isFinite(e)?e:void 0;if(e instanceof Date){var t=e.valueOf();return Number.isFinite(t)?t:void 0}var r=Number(e);return Number.isFinite(r)?r:void 0}function QU(e,t){var r=qU(e),n=t[0],a=t[1];if(r===void 0)return!1;var o=Math.min(n,a),c=Math.max(n,a);return r>=o&&r<=c}function YU(e,t,r){if(r==null||t==null)return!0;var n=Lt(e,t);return n==null||!Bn(r)?!0:QU(n,r)}var xu=(e,t,r,n)=>{var a=e==null?void 0:e.index;if(a==null)return null;var o=Number(a);if(!We(o))return a;var c=0,u=1/0;t.length>0&&(u=t.length-1);var f=Math.max(c,Math.min(o,u)),h=t[f];return h==null||YU(h,r,n)?String(f):null},mP=(e,t,r,n,a,o,c)=>{if(o!=null){var u=c[0],f=u==null?void 0:u.getPosition(o);if(f!=null)return f;var h=a==null?void 0:a[Number(o)];if(h)switch(r){case"horizontal":return{x:h.coordinate,y:(n.top+t)/2};default:return{x:(n.left+e)/2,y:h.coordinate}}}},pP=(e,t,r,n)=>{if(t==="axis")return e.tooltipItemPayloads;if(e.tooltipItemPayloads.length===0)return[];var a;if(r==="hover"?a=e.itemInteraction.hover.graphicalItemId:a=e.itemInteraction.click.graphicalItemId,e.syncInteraction.active&&a==null)return e.tooltipItemPayloads;if(a==null&&(n!=null||e.keyboardInteraction.active)){var o=e.tooltipItemPayloads[0];return o!=null?[o]:[]}return e.tooltipItemPayloads.filter(c=>{var u;return((u=c.settings)===null||u===void 0?void 0:u.graphicalItemId)===a})},gP=e=>e.options.tooltipPayloadSearcher,fl=e=>e.tooltip;function ES(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function AS(e){for(var t=1;te(t)}function CS(e){if(typeof e=="string")return e}function nH(e){if(!(e==null||typeof e!="object")){var t="name"in e?eH(e.name):void 0,r="unit"in e?tH(e.unit):void 0,n="dataKey"in e?rH(e.dataKey):void 0,a="payload"in e?e.payload:void 0,o="color"in e?CS(e.color):void 0,c="fill"in e?CS(e.fill):void 0;return{name:t,unit:r,dataKey:n,payload:a,color:o,fill:c}}}function iH(e,t){return e??t}var vP=(e,t,r,n,a,o,c)=>{if(!(t==null||o==null)){var u=r.chartData,f=r.computedData,h=r.dataStartIndex,m=r.dataEndIndex,g=[];return e.reduce((v,b)=>{var j,k=b.dataDefinedOnItem,S=b.settings,N=iH(k,u),E=Array.isArray(N)?U5(N,h,m):N,A=(j=S==null?void 0:S.dataKey)!==null&&j!==void 0?j:n,P=S==null?void 0:S.nameKey,_;if(n&&Array.isArray(E)&&!Array.isArray(E[0])&&c==="axis"?_=YE(E,n,a):_=o(E,t,f,P),Array.isArray(_))_.forEach(D=>{var U,B,F=nH(D),Y=F==null?void 0:F.name,H=F==null?void 0:F.dataKey,pe=F==null?void 0:F.payload,ue=AS(AS({},S),{},{name:Y,unit:F==null?void 0:F.unit,color:(U=F==null?void 0:F.color)!==null&&U!==void 0?U:S==null?void 0:S.color,fill:(B=F==null?void 0:F.fill)!==null&&B!==void 0?B:S==null?void 0:S.fill});v.push(kk({tooltipEntrySettings:ue,dataKey:H,payload:pe,value:Lt(pe,H),name:Y==null?void 0:String(Y)}))});else{var O;v.push(kk({tooltipEntrySettings:S,dataKey:A,payload:_,value:Lt(_,A),name:(O=Lt(_,P))!==null&&O!==void 0?O:S==null?void 0:S.name}))}return v},g)}},W0=q([_t,kC,r0],vC),aH=q([e=>e.graphicalItems.cartesianItems,e=>e.graphicalItems.polarItems],(e,t)=>[...e,...t]),oH=q([Ft,sl],jC),Io=q([aH,_t,oH],NC,{memoizeOptions:{resultEqualityCheck:qh}}),sH=q([Io],e=>e.filter(u0)),yP=q([Io],CC,{memoizeOptions:{resultEqualityCheck:qh}}),lH=q([Io],e=>e.some(t=>!t.data)),No=q([yP,Nn],OC),uH=q([sH,Nn,_t],RA),K0=q([No,_t,Io,Nn,lH,yP],_C),xP=q([_t],L0),cH=q([_t],e=>e.allowDataOverflow),bP=q([xP,cH],yA),dH=q([Io],e=>e.filter(u0)),fH=q([uH,dH,Uh,PA],IC),hH=q([fH,Nn,Ft,bP],DC),mH=q([Io],AC),pH=q([No,_t,mH,$0,Ft,SF],$C,{memoizeOptions:{resultEqualityCheck:Vh}}),gH=q([zC,Ft,sl],cl),vH=q([gH,Ft],UC),yH=q([FC,Ft,sl],cl),xH=q([yH,Ft],HC),bH=q([BC,Ft,sl],cl),wH=q([bH,Ft],WC),kH=q([vH,wH,xH],Yf),jH=q([_t,xP,bP,hH,pH,kH,ft,Ft],KC),Js=q([_t,ft,No,K0,Uh,Ft,jH],GC),SH=q([Js,_t,W0],VC),NH=q([_t,Js,SH,Ft],qC),wP=e=>{var t=Ft(e),r=sl(e),n=!1;return cc(e,t,r,n)},kP=q([_t,wP],Hh),EH=q([_t,W0,NH,kP],T0),jP=q([EH],c0),AH=q([ft,K0,_t,Ft],rP),CH=q([ft,K0,_t,Ft],JC),PH=(e,t,r,n,a,o,c,u)=>{if(t){var f=t.type,h=Xn(e,u);if(n){var m=r==="scaleBand"&&n.bandwidth?n.bandwidth()/2:2,g=f==="category"&&n.bandwidth?n.bandwidth()/m:0;return g=u==="angleAxis"&&a!=null&&(a==null?void 0:a.length)>=2?Jr(a[0]-a[1])*2*g:g,h&&c?c.map((v,b)=>{var j=n.map(v);return We(j)?{coordinate:j+g,value:v,index:b,offset:g}:null}).filter(Ar):n.domain().map((v,b)=>{var j=n.map(v);return We(j)?{coordinate:j+g,value:o?o[v]:v,index:b,offset:g}:null}).filter(Ar)}}},_i=q([ft,_t,W0,jP,wP,AH,CH,Ft],PH),G0=q([oP,sP,TU],(e,t,r)=>lP(r.shared,e,t)),SP=e=>e.tooltip.settings.trigger,V0=e=>e.tooltip.settings.defaultIndex,fc=q([fl,G0,SP,V0],hP),Fu=q([fc,No,Zs,Js],xu),NP=q([_i,Fu],uP),OH=q([fc],e=>{if(e)return e.dataKey}),_H=q([fc],e=>{if(e)return e.graphicalItemId}),EP=q([fl,G0,SP,V0],pP),MH=q([Ei,Ai,ft,Zt,_i,V0,EP],mP),IH=q([fc,MH],(e,t)=>e!=null&&e.coordinate?e.coordinate:t),TH=q([fc],e=>{var t;return(t=e==null?void 0:e.active)!==null&&t!==void 0?t:!1}),DH=q([EP,Fu,Nn,Zs,NP,gP,G0],vP),RH=q([DH],e=>{if(e!=null){var t=e.map(r=>r.payload).filter(r=>r!=null);return Array.from(new Set(t))}});function PS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function OS(e){for(var t=1;tMe(_t),BH=()=>{var e=FH(),t=Me(_i),r=Me(jP);return Af(!e||!r?void 0:OS(OS({},e),{},{scale:r}),t)};function _S(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function fs(e){for(var t=1;t{var a=t.find(o=>o&&o.index===r);if(a){if(e==="horizontal")return{x:a.coordinate,y:n.relativeY};if(e==="vertical")return{x:n.relativeX,y:a.coordinate}}return{x:0,y:0}},GH=(e,t,r,n)=>{var a=t.find(h=>h&&h.index===r);if(a){if(e==="centric"){var o=a.coordinate,c=n.radius;return fs(fs(fs({},n),Qt(n.cx,n.cy,c,o)),{},{angle:o,radius:c})}var u=a.coordinate,f=n.angle;return fs(fs(fs({},n),Qt(n.cx,n.cy,u,f)),{},{angle:f,radius:u})}return{angle:0,clockWise:!1,cx:0,cy:0,endAngle:0,innerRadius:0,outerRadius:0,radius:0,startAngle:0,x:0,y:0}};function VH(e,t){var r=e.relativeX,n=e.relativeY;return r>=t.left&&r<=t.left+t.width&&n>=t.top&&n<=t.top+t.height}var AP=(e,t,r,n,a)=>{var o,c=(o=t==null?void 0:t.length)!==null&&o!==void 0?o:0;if(c<=1||e==null)return 0;if(n==="angleAxis"&&a!=null&&Math.abs(Math.abs(a[1]-a[0])-360)<=1e-6)for(var u=0;u0?(f=r[u-1])===null||f===void 0?void 0:f.coordinate:(h=r[c-1])===null||h===void 0?void 0:h.coordinate,j=(m=r[u])===null||m===void 0?void 0:m.coordinate,k=u>=c-1?(g=r[0])===null||g===void 0?void 0:g.coordinate:(v=r[u+1])===null||v===void 0?void 0:v.coordinate,S=void 0;if(!(b==null||j==null||k==null))if(Jr(j-b)!==Jr(k-j)){var N=[];if(Jr(k-j)===Jr(a[1]-a[0])){S=k;var E=j+a[1]-a[0];N[0]=Math.min(E,(E+b)/2),N[1]=Math.max(E,(E+b)/2)}else{S=b;var A=k+a[1]-a[0];N[0]=Math.min(j,(A+j)/2),N[1]=Math.max(j,(A+j)/2)}var P=[Math.min(j,(S+j)/2),Math.max(j,(S+j)/2)];if(e>P[0]&&e<=P[1]||e>=N[0]&&e<=N[1]){var _;return(_=r[u])===null||_===void 0?void 0:_.index}}else{var O=Math.min(b,k),D=Math.max(b,k);if(e>(O+j)/2&&e<=(D+j)/2){var U;return(U=r[u])===null||U===void 0?void 0:U.index}}}else if(t)for(var B=0;B(F.coordinate+H.coordinate)/2||B>0&&B(F.coordinate+H.coordinate)/2&&e<=(F.coordinate+Y.coordinate)/2)return F.index}}return-1},CP=()=>Me(r0),q0=(e,t)=>t,PP=(e,t,r)=>r,Q0=(e,t,r,n)=>n,qH=q(_i,e=>wh(e,t=>t.coordinate)),Y0=q([fl,q0,PP,Q0],hP),X0=q([Y0,No,Zs,Js],xu),QH=(e,t,r)=>{if(t!=null){var n=fl(e);return t==="axis"?r==="hover"?n.axisInteraction.hover.dataKey:n.axisInteraction.click.dataKey:r==="hover"?n.itemInteraction.hover.dataKey:n.itemInteraction.click.dataKey}},OP=q([fl,q0,PP,Q0],pP),Zf=q([Ei,Ai,ft,Zt,_i,Q0,OP],mP),YH=q([Y0,Zf],(e,t)=>{var r;return(r=e.coordinate)!==null&&r!==void 0?r:t}),_P=q([_i,X0],uP),XH=q([OP,X0,Nn,Zs,_P,gP,q0],vP),ZH=q([Y0,X0],(e,t)=>({isActive:e.active&&t!=null,activeIndex:t})),JH=(e,t,r,n,a,o,c)=>{if(!(!e||!r||!n||!a)&&VH(e,c)){var u=fz(e,t),f=AP(u,o,a,r,n),h=KH(t,a,f,e);return{activeIndex:String(f),activeCoordinate:h}}},eW=(e,t,r,n,a,o,c)=>{if(!(!e||!n||!a||!o||!r)){var u=pF(e,r);if(u){var f=hz(u,t),h=AP(f,c,o,n,a),m=GH(t,o,h,u);return{activeIndex:String(h),activeCoordinate:m}}}},tW=(e,t,r,n,a,o,c,u)=>{if(!(!e||!t||!n||!a||!o))return t==="horizontal"||t==="vertical"?JH(e,t,n,a,o,c,u):eW(e,t,r,n,a,o,c)},rW=q(e=>e.zIndex.zIndexMap,(e,t)=>t,(e,t,r)=>r,(e,t,r)=>{if(t!=null){var n=e[t];if(n!=null)return r?n.panoramaElement:n.element}}),nW=q(e=>e.zIndex.zIndexMap,e=>{var t=Object.keys(e).map(n=>parseInt(n,10)).concat(Object.values(pr)),r=Array.from(new Set(t));return r.sort((n,a)=>n-a)},{memoizeOptions:{resultEqualityCheck:GF}});function MS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function IS(e){for(var t=1;tIS(IS({},e),{},{[t]:{element:void 0,panoramaElement:void 0,consumers:0}}),sW)},uW=new Set(Object.values(pr));function cW(e){return uW.has(e)}var MP=lr({name:"zIndex",initialState:lW,reducers:{registerZIndexPortal:{reducer:(e,t)=>{var r=t.payload.zIndex;e.zIndexMap[r]?e.zIndexMap[r].consumers+=1:e.zIndexMap[r]={consumers:1,element:void 0,panoramaElement:void 0}},prepare:st()},unregisterZIndexPortal:{reducer:(e,t)=>{var r=t.payload.zIndex;e.zIndexMap[r]&&(e.zIndexMap[r].consumers-=1,e.zIndexMap[r].consumers<=0&&!cW(r)&&delete e.zIndexMap[r])},prepare:st()},registerZIndexPortalElement:{reducer:(e,t)=>{var r=t.payload,n=r.zIndex,a=r.element,o=r.isPanorama;e.zIndexMap[n]?o?e.zIndexMap[n].panoramaElement=a:e.zIndexMap[n].element=a:e.zIndexMap[n]={consumers:0,element:o?void 0:a,panoramaElement:o?a:void 0}},prepare:st()},unregisterZIndexPortalElement:{reducer:(e,t)=>{var r=t.payload.zIndex;e.zIndexMap[r]&&(t.payload.isPanorama?e.zIndexMap[r].panoramaElement=void 0:e.zIndexMap[r].element=void 0)},prepare:st()}}}),im=MP.actions,dW=im.registerZIndexPortal,Dg=im.unregisterZIndexPortal,fW=im.registerZIndexPortalElement,hW=im.unregisterZIndexPortalElement,mW=MP.reducer;function Mi(e){var t=e.zIndex,r=e.children,n=Xz(),a=n&&t!==void 0&&t!==0,o=Pr(),c=y.useRef(void 0),u=y.useRef(new Set),f=Nt(),h=Me(g=>rW(g,t,o));if(y.useLayoutEffect(()=>{if(!a){var g=u.current;g.forEach(b=>{f(Dg({zIndex:b}))}),g.clear(),c.current=void 0;return}if(u.current.has(t)||(f(dW({zIndex:t})),u.current.add(t)),h){c.current=h;var v=u.current;v.forEach(b=>{b!==t&&(f(Dg({zIndex:b})),v.delete(b))})}},[f,t,a,h]),y.useLayoutEffect(()=>{var g=u.current;return()=>{g.forEach(v=>{f(Dg({zIndex:v}))}),g.clear()}},[f]),!a)return r;var m=h??c.current;return m?fh.createPortal(r,m):null}function ay(){return ay=Object.assign?Object.assign.bind():function(e){for(var t=1;ty.useContext(IP),Rg={exports:{}},DS;function kW(){return DS||(DS=1,(function(e){var t=Object.prototype.hasOwnProperty,r="~";function n(){}Object.create&&(n.prototype=Object.create(null),new n().__proto__||(r=!1));function a(f,h,m){this.fn=f,this.context=h,this.once=m||!1}function o(f,h,m,g,v){if(typeof m!="function")throw new TypeError("The listener must be a function");var b=new a(m,g||f,v),j=r?r+h:h;return f._events[j]?f._events[j].fn?f._events[j]=[f._events[j],b]:f._events[j].push(b):(f._events[j]=b,f._eventsCount++),f}function c(f,h){--f._eventsCount===0?f._events=new n:delete f._events[h]}function u(){this._events=new n,this._eventsCount=0}u.prototype.eventNames=function(){var h=[],m,g;if(this._eventsCount===0)return h;for(g in m=this._events)t.call(m,g)&&h.push(r?g.slice(1):g);return Object.getOwnPropertySymbols?h.concat(Object.getOwnPropertySymbols(m)):h},u.prototype.listeners=function(h){var m=r?r+h:h,g=this._events[m];if(!g)return[];if(g.fn)return[g.fn];for(var v=0,b=g.length,j=new Array(b);v{if(t&&Array.isArray(e)){var r=Number.parseInt(t,10);if(!Kn(r))return e[r]}},EW={chartName:"",tooltipPayloadSearcher:()=>{},eventEmitter:void 0,defaultTooltipEventType:"axis"},TP=lr({name:"options",initialState:EW,reducers:{createEventEmitter:e=>{e.eventEmitter==null&&(e.eventEmitter=Symbol("rechartsEventEmitter"))}}}),AW=TP.reducer,CW=TP.actions.createEventEmitter;function PW(e){return e.tooltip.syncInteraction}var OW={chartData:void 0,computedData:void 0,dataStartIndex:0,dataEndIndex:0},DP=lr({name:"chartData",initialState:OW,reducers:{setChartData(e,t){if(e.chartData=t.payload,t.payload==null){e.dataStartIndex=0,e.dataEndIndex=0;return}t.payload.length>0&&e.dataEndIndex!==t.payload.length-1&&(e.dataEndIndex=t.payload.length-1)},setComputedData(e,t){e.computedData=t.payload},setDataStartEndIndexes(e,t){var r=t.payload,n=r.startIndex,a=r.endIndex;n!=null&&(e.dataStartIndex=n),a!=null&&(e.dataEndIndex=a)}}}),Z0=DP.actions,LS=Z0.setChartData,_W=Z0.setDataStartEndIndexes;Z0.setComputedData;var MW=DP.reducer,IW=["x","y"];function $S(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function hs(e){for(var t=1;tf.rootProps.className);y.useEffect(()=>{if(e==null)return nl;var f=(h,m,g)=>{if(t!==g&&e===h){if(m.payload.active===!1){r(gu({active:!1,coordinate:void 0,dataKey:void 0,index:null,label:void 0,sourceViewBox:void 0,graphicalItemId:void 0}));return}if(n==="index"){var v;if(c&&m!==null&&m!==void 0&&(v=m.payload)!==null&&v!==void 0&&v.coordinate&&m.payload.sourceViewBox){var b=m.payload.coordinate,j=b.x,k=b.y,S=LW(b,IW),N=m.payload.sourceViewBox,E=N.x,A=N.y,P=N.width,_=N.height,O=hs(hs({},S),{},{x:c.x+(P?(j-E)/P:0)*c.width,y:c.y+(_?(k-A)/_:0)*c.height});r(hs(hs({},m),{},{payload:hs(hs({},m.payload),{},{coordinate:O})}))}else r(m);return}if(a!=null){var D;if(typeof n=="function"){var U={activeTooltipIndex:m.payload.index==null?void 0:Number(m.payload.index),isTooltipActive:m.payload.active,activeIndex:m.payload.index==null?void 0:Number(m.payload.index),activeLabel:m.payload.label,activeDataKey:m.payload.dataKey,activeCoordinate:m.payload.coordinate},B=n(a,U);D=a[B]}else n==="value"&&(D=a.find(se=>String(se.value)===m.payload.label));var F=m.payload.coordinate;if(F==null||c==null){r(gu({active:!1,coordinate:void 0,dataKey:void 0,index:null,label:void 0,sourceViewBox:void 0,graphicalItemId:void 0}));return}if(D==null){r(gu({active:!1,coordinate:void 0,dataKey:void 0,index:null,label:void 0,sourceViewBox:m.payload.sourceViewBox,graphicalItemId:void 0}));return}var Y=F.x,H=F.y,pe=Math.min(Y,c.x+c.width),ue=Math.min(H,c.y+c.height),he={x:o==="horizontal"?D.coordinate:pe,y:o==="horizontal"?ue:D.coordinate},ae=gu({active:m.payload.active,coordinate:he,dataKey:m.payload.dataKey,index:String(D.index),label:m.payload.label,sourceViewBox:m.payload.sourceViewBox,graphicalItemId:m.payload.graphicalItemId});r(ae)}}};return Bu.on(oy,f),()=>{Bu.off(oy,f)}},[u,r,t,e,n,a,o,c])}function FW(){var e=Me(n0),t=Me(i0),r=Nt();y.useEffect(()=>{if(e==null)return nl;var n=(a,o,c)=>{t!==c&&e===a&&r(_W(o))};return Bu.on(RS,n),()=>{Bu.off(RS,n)}},[r,t,e])}function BW(){var e=Nt();y.useEffect(()=>{e(CW())},[e]),zW(),FW()}function UW(e,t,r,n,a,o){var c=Me(j=>QH(j,e,t)),u=Me(_H),f=Me(i0),h=Me(n0),m=Me(OA),g=Me(PW),v=(g==null?void 0:g.sourceViewBox)!=null,b=Rh();y.useEffect(()=>{if(!v&&h!=null&&f!=null){var j=gu({active:o,coordinate:r,dataKey:c,index:a,label:typeof n=="number"?String(n):n,sourceViewBox:b,graphicalItemId:u});Bu.emit(oy,h,j,f)}},[v,r,c,u,a,n,f,h,m,o,b])}function zS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function FS(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);r{D(zU({shared:E,trigger:A,axisId:O,active:a,defaultIndex:U}))},[D,E,A,O,a,U]);var B=Rh(),F=uA(),Y=IU(E),H=(t=Me(_e=>ZH(_e,Y,A,U)))!==null&&t!==void 0?t:{},pe=H.activeIndex,ue=H.isActive,he=Me(_e=>XH(_e,Y,A,U)),ae=Me(_e=>_P(_e,Y,A,U)),se=Me(_e=>YH(_e,Y,A,U)),X=he,te=wW(),J=(r=a??ue)!==null&&r!==void 0?r:!1,I=ZL([X,J]),M=GW(I,2),K=M[0],ne=M[1],Z=Y==="axis"?ae:void 0;UW(Y,A,se,Z,pe,J);var me=_??te;if(me==null||B==null||Y==null)return null;var ge=X??US;J||(ge=US),h&&ge.length&&(ge=wL(ge.filter(_e=>_e.value!=null&&(_e.hide!==!0||n.includeHidden)),v,XW));var Pe=ge.length>0,re=FS(FS({},n),{},{payload:ge,label:Z,active:J,activeIndex:pe,coordinate:se,accessibilityLayer:F}),xe=y.createElement(u8,{allowEscapeViewBox:o,animationDuration:c,animationEasing:u,isAnimationActive:m,active:J,coordinate:se,hasPayload:Pe,offset:g,position:b,reverseDirection:j,useTranslate3d:k,viewBox:B,wrapperStyle:S,lastBoundingBox:K,innerRef:ne,hasPortalFromProps:!!_},ZW(f,re));return y.createElement(y.Fragment,null,fh.createPortal(xe,me),J&&y.createElement(bW,{cursor:N,tooltipEventType:Y,coordinate:se,payload:ge,index:pe}))}function tK(e,t,r){return(t=rK(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function rK(e){var t=nK(e,"string");return typeof t=="symbol"?t:t+""}function nK(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}class iK{constructor(t){tK(this,"cache",new Map),this.maxSize=t}get(t){var r=this.cache.get(t);return r!==void 0&&(this.cache.delete(t),this.cache.set(t,r)),r}set(t,r){if(this.cache.has(t))this.cache.delete(t);else if(this.cache.size>=this.maxSize){var n=this.cache.keys().next().value;n!=null&&this.cache.delete(n)}this.cache.set(t,r)}clear(){this.cache.clear()}size(){return this.cache.size}}function HS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function aK(e){for(var t=1;t{try{var r=document.getElementById(KS);r||(r=document.createElement("span"),r.setAttribute("id",KS),r.setAttribute("aria-hidden","true"),document.body.appendChild(r)),Object.assign(r.style,cK,t),r.textContent="".concat(e);var n=r.getBoundingClientRect();return{width:n.width,height:n.height}}catch{return{width:0,height:0}}},bu=function(t){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(t==null||nc.isSsr)return{width:0,height:0};if(!RP.enableCache)return GS(t,r);var n=dK(t,r),a=WS.get(n);if(a)return a;var o=GS(t,r);return WS.set(n,o),o},LP;function Jf(e,t){return pK(e)||mK(e,t)||hK(e,t)||fK()}function fK(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function hK(e,t){if(e){if(typeof e=="string")return VS(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?VS(e,t):void 0}}function VS(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);re.length)&&(t=e.length);for(var r=0,n=Array(t);r{var t=e.children,r=e.breakAll,n=e.style;try{var a=[];Yt(t)||(r?a=t.toString().split(""):a=t.toString().split(zP));var o=a.map(u=>({word:u,width:bu(u,n).width})),c=r?0:bu(" ",n).width;return{wordsWithComputedWidth:o,spaceWidth:c}}catch{return null}};function BP(e){return e==="start"||e==="middle"||e==="end"||e==="inherit"}function DK(e){return Yt(e)||typeof e=="string"||typeof e=="number"||typeof e=="boolean"}var UP=(e,t,r,n)=>e.reduce((a,o)=>{var c=o.word,u=o.width,f=a[a.length-1];if(f&&u!=null&&(t==null||n||f.width+u+re.reduce((t,r)=>t.width>r.width?t:r),RK="…",e2=(e,t,r,n,a,o,c,u)=>{var f=e.slice(0,t),h=FP({breakAll:r,style:n,children:f+RK});if(!h)return[!1,[]];var m=UP(h.wordsWithComputedWidth,o,c,u),g=m.length>a||HP(m).width>Number(o);return[g,m]},LK=(e,t,r,n,a)=>{var o=e.maxLines,c=e.children,u=e.style,f=e.breakAll,h=Ee(o),m=String(c),g=UP(t,n,r,a);if(!h||a)return g;var v=g.length>o||HP(g).width>Number(n);if(!v)return g;for(var b=0,j=m.length-1,k=0,S;b<=j&&k<=m.length-1;){var N=Math.floor((b+j)/2),E=N-1,A=e2(m,E,f,u,o,n,r,a),P=ZS(A,2),_=P[0],O=P[1],D=e2(m,N,f,u,o,n,r,a),U=ZS(D,1),B=U[0];if(!_&&!B&&(b=N+1),_&&B&&(j=N-1),!_&&B){S=O;break}k++}return S||g},t2=e=>{var t=Yt(e)?[]:e.toString().split(zP);return[{words:t,width:void 0}]},$K=e=>{var t=e.width,r=e.scaleToFit,n=e.children,a=e.style,o=e.breakAll,c=e.maxLines;if((t||r)&&!nc.isSsr){var u,f,h=FP({breakAll:o,children:n,style:a});if(h){var m=h.wordsWithComputedWidth,g=h.spaceWidth;u=m,f=g}else return t2(n);return LK({breakAll:o,children:n,maxLines:c,style:a},u,f,t,!!r)}return t2(n)},WP="#808080",zK={angle:0,breakAll:!1,capHeight:"0.71em",fill:WP,lineHeight:"1em",scaleToFit:!1,textAnchor:"start",verticalAnchor:"end",x:0,y:0},J0=y.forwardRef((e,t)=>{var r=on(e,zK),n=r.x,a=r.y,o=r.lineHeight,c=r.capHeight,u=r.fill,f=r.scaleToFit,h=r.textAnchor,m=r.verticalAnchor,g=XS(r,CK),v=y.useMemo(()=>$K({breakAll:g.breakAll,children:g.children,maxLines:g.maxLines,scaleToFit:f,style:g.style,width:g.width}),[g.breakAll,g.children,g.maxLines,f,g.style,g.width]),b=g.dx,j=g.dy,k=g.angle,S=g.className,N=g.breakAll,E=XS(g,PK);if(!Gn(n)||!Gn(a)||v.length===0)return null;var A=Number(n)+(Ee(b)?b:0),P=Number(a)+(Ee(j)?j:0);if(!We(A)||!We(P))return null;var _;switch(m){case"start":_=Lg("calc(".concat(c,")"));break;case"middle":_=Lg("calc(".concat((v.length-1)/2," * -").concat(o," + (").concat(c," / 2))"));break;default:_=Lg("calc(".concat(v.length-1," * -").concat(o,")"));break}var O=[],D=v[0];if(f&&D!=null){var U=D.width,B=g.width;O.push("scale(".concat(Ee(B)&&Ee(U)?B/U:1,")"))}return k&&O.push("rotate(".concat(k,", ").concat(A,", ").concat(P,")")),O.length&&(E.transform=O.join(" ")),y.createElement("text",sy({},rn(E),{ref:t,x:A,y:P,className:nt("recharts-text",S),textAnchor:h,fill:u.includes("url")?WP:u}),v.map((F,Y)=>{var H=F.words.join(N?"":" ");return y.createElement("tspan",{x:A,dy:Y===0?_:o,key:"".concat(H,"-").concat(Y)},H)}))});J0.displayName="Text";function r2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function Tn(e){for(var t=1;t{var t=e.viewBox,r=e.position,n=e.offset,a=n===void 0?0:n,o=e.parentViewBox,c=Vy(t),u=c.x,f=c.y,h=c.height,m=c.upperWidth,g=c.lowerWidth,v=u,b=u+(m-g)/2,j=(v+b)/2,k=(m+g)/2,S=v+m/2,N=h>=0?1:-1,E=N*a,A=N>0?"end":"start",P=N>0?"start":"end",_=m>=0?1:-1,O=_*a,D=_>0?"end":"start",U=_>0?"start":"end",B=o;if(r==="top"){var F={x:v+m/2,y:f-E,horizontalAnchor:"middle",verticalAnchor:A};return B&&(F.height=Math.max(f-B.y,0),F.width=m),F}if(r==="bottom"){var Y={x:b+g/2,y:f+h+E,horizontalAnchor:"middle",verticalAnchor:P};return B&&(Y.height=Math.max(B.y+B.height-(f+h),0),Y.width=g),Y}if(r==="left"){var H={x:j-O,y:f+h/2,horizontalAnchor:D,verticalAnchor:"middle"};return B&&(H.width=Math.max(H.x-B.x,0),H.height=h),H}if(r==="right"){var pe={x:j+k+O,y:f+h/2,horizontalAnchor:U,verticalAnchor:"middle"};return B&&(pe.width=Math.max(B.x+B.width-pe.x,0),pe.height=h),pe}var ue=B?{width:k,height:h}:{};return r==="insideLeft"?Tn({x:j+O,y:f+h/2,horizontalAnchor:U,verticalAnchor:"middle"},ue):r==="insideRight"?Tn({x:j+k-O,y:f+h/2,horizontalAnchor:D,verticalAnchor:"middle"},ue):r==="insideTop"?Tn({x:v+m/2,y:f+E,horizontalAnchor:"middle",verticalAnchor:P},ue):r==="insideBottom"?Tn({x:b+g/2,y:f+h-E,horizontalAnchor:"middle",verticalAnchor:A},ue):r==="insideTopLeft"?Tn({x:v+O,y:f+E,horizontalAnchor:U,verticalAnchor:P},ue):r==="insideTopRight"?Tn({x:v+m-O,y:f+E,horizontalAnchor:D,verticalAnchor:P},ue):r==="insideBottomLeft"?Tn({x:b+O,y:f+h-E,horizontalAnchor:U,verticalAnchor:A},ue):r==="insideBottomRight"?Tn({x:b+g-O,y:f+h-E,horizontalAnchor:D,verticalAnchor:A},ue):r&&typeof r=="object"&&(Ee(r.x)||bo(r.x))&&(Ee(r.y)||bo(r.y))?Tn({x:u+Sa(r.x,k),y:f+Sa(r.y,h),horizontalAnchor:"end",verticalAnchor:"end"},ue):Tn({x:S,y:f+h/2,horizontalAnchor:"middle",verticalAnchor:"middle"},ue)},WK=["labelRef"],KK=["content"];function n2(e,t){if(e==null)return{};var r,n,a=GK(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n{var t=e.x,r=e.y,n=e.upperWidth,a=e.lowerWidth,o=e.width,c=e.height,u=e.children,f=y.useMemo(()=>({x:t,y:r,upperWidth:n,lowerWidth:a,width:o,height:c}),[t,r,n,a,o,c]);return y.createElement(KP.Provider,{value:f},u)},GP=()=>{var e=y.useContext(KP),t=Rh();return e||(t?Vy(t):void 0)},XK=y.createContext(null),ZK=()=>{var e=y.useContext(XK),t=Me(DA);return e||t},JK=e=>{var t=e.value,r=e.formatter,n=Yt(e.children)?t:e.children;return typeof r=="function"?r(n):n},ex=e=>e!=null&&typeof e=="function",eG=(e,t)=>{var r=Jr(t-e),n=Math.min(Math.abs(t-e),360);return r*n},tG=(e,t,r,n,a)=>{var o=e.offset,c=e.className,u=a.cx,f=a.cy,h=a.innerRadius,m=a.outerRadius,g=a.startAngle,v=a.endAngle,b=a.clockWise,j=(h+m)/2,k=eG(g,v),S=k>=0?1:-1,N,E;switch(t){case"insideStart":N=g+S*o,E=b;break;case"insideEnd":N=v-S*o,E=!b;break;case"end":N=v+S*o,E=b;break;default:throw new Error("Unsupported position ".concat(t))}E=k<=0?E:!E;var A=Qt(u,f,j,N),P=Qt(u,f,j,N+(E?1:-1)*359),_="M".concat(A.x,",").concat(A.y,` A`).concat(j,",").concat(j,",0,1,").concat(E?0:1,`, - `).concat(P.x,",").concat(P.y),O=Yt(e.id)?Au("recharts-radial-line-"):e.id;return y.createElement("text",hi({},n,{dominantBaseline:"central",className:nt("recharts-radial-bar-label",c)}),y.createElement("defs",null,y.createElement("path",{id:O,d:_})),y.createElement("textPath",{xlinkHref:"#".concat(O)},r))},rG=(e,t,r)=>{var n=e.cx,a=e.cy,o=e.innerRadius,c=e.outerRadius,u=e.startAngle,f=e.endAngle,h=(u+f)/2;if(r==="outside"){var m=Qt(n,a,c+t,h),g=m.x,v=m.y;return{x:g,y:v,textAnchor:g>=n?"start":"end",verticalAnchor:"middle"}}if(r==="center")return{x:n,y:a,textAnchor:"middle",verticalAnchor:"middle"};if(r==="centerTop")return{x:n,y:a,textAnchor:"middle",verticalAnchor:"start"};if(r==="centerBottom")return{x:n,y:a,textAnchor:"middle",verticalAnchor:"end"};var b=(o+c)/2,j=Qt(n,a,b,h),k=j.x,S=j.y;return{x:k,y:S,textAnchor:"middle",verticalAnchor:"middle"}},nf=e=>e!=null&&"cx"in e&&Ee(e.cx),nG={angle:0,offset:5,zIndex:pr.label,position:"middle",textBreakAll:!1};function iG(e){if(!nf(e))return e;var t=e.cx,r=e.cy,n=e.outerRadius,a=n*2;return{x:t-n,y:r-n,width:a,upperWidth:a,lowerWidth:a,height:a}}function sa(e){var t=on(e,nG),r=t.viewBox,n=t.parentViewBox,a=t.position,o=t.value,c=t.children,u=t.content,f=t.className,h=f===void 0?"":f,m=t.textBreakAll,g=t.labelRef,v=ZK(),b=GP(),j=a==="center"?b:v??b,k,S,N;r==null?k=j:nf(r)?k=r:k=Gy(r);var E=iG(k);if(!k||Yt(o)&&Yt(c)&&!y.isValidElement(u)&&typeof u!="function")return null;var A=vu(vu({},t),{},{viewBox:k});if(y.isValidElement(u)){A.labelRef;var P=r2(A,WK);return y.cloneElement(u,P)}if(typeof u=="function"){A.content;var _=r2(A,KK);if(S=y.createElement(u,_),y.isValidElement(S))return S}else S=JK(t);var O=rn(t);if(nf(k)){if(a==="insideStart"||a==="insideEnd"||a==="end")return tG(t,a,S,O,k);N=rG(k,t.offset,t.position)}else{if(!E)return null;var D=HK({viewBox:E,position:a,offset:t.offset,parentViewBox:nf(n)?void 0:n});N=vu(vu({x:D.x,y:D.y,textAnchor:D.horizontalAnchor,verticalAnchor:D.verticalAnchor},D.width!==void 0?{width:D.width}:{}),D.height!==void 0?{height:D.height}:{})}return y.createElement(Mi,{zIndex:t.zIndex},y.createElement(Z0,hi({ref:g,className:nt("recharts-label",h)},O,N,{textAnchor:BP(O.textAnchor)?O.textAnchor:N.textAnchor,breakAll:m}),S))}sa.displayName="Label";var aG=(e,t,r)=>{if(!e)return null;var n={viewBox:t,labelRef:r};return e===!0?y.createElement(sa,hi({key:"label-implicit"},n)):Gn(e)?y.createElement(sa,hi({key:"label-implicit",value:e},n)):y.isValidElement(e)?e.type===sa?y.cloneElement(e,vu({key:"label-implicit"},n)):y.createElement(sa,hi({key:"label-implicit",content:e},n)):J0(e)?y.createElement(sa,hi({key:"label-implicit",content:e},n)):e&&typeof e=="object"?y.createElement(sa,hi({},e,{key:"label-implicit"},n)):null};function oG(e){var t=e.label,r=e.labelRef,n=GP();return aG(t,n,r)||null}var sG=["valueAccessor"],lG=["dataKey","clockWise","id","textBreakAll","zIndex"];function eh(){return eh=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var t=Array.isArray(e.value)?e.value[e.value.length-1]:e.value;if(DK(t))return t},VP=y.createContext(void 0),dG=VP.Provider,qP=y.createContext(void 0);qP.Provider;function fG(){return y.useContext(VP)}function hG(){return y.useContext(qP)}function af(e){var t=e.valueAccessor,r=t===void 0?cG:t,n=i2(e,sG),a=n.dataKey;n.clockWise;var o=n.id,c=n.textBreakAll,u=n.zIndex,f=i2(n,lG),h=fG(),m=hG(),g=h||m;return!g||!g.length?null:y.createElement(Mi,{zIndex:u??pr.label},y.createElement(nn,{className:"recharts-label-list"},g.map((v,b)=>{var j,k=Yt(a)?r(v,b):Lt(v.payload,a),S=Yt(o)?{}:{id:"".concat(o,"-").concat(b)};return y.createElement(sa,eh({key:"label-".concat(b)},rn(v),f,S,{fill:(j=n.fill)!==null&&j!==void 0?j:v.fill,parentViewBox:v.parentViewBox,value:k,textBreakAll:c,viewBox:v.viewBox,index:b,zIndex:0}))})))}af.displayName="LabelList";function mG(e){var t=e.label;return t?t===!0?y.createElement(af,{key:"labelList-implicit"}):y.isValidElement(t)||J0(t)?y.createElement(af,{key:"labelList-implicit",content:t}):typeof t=="object"?y.createElement(af,eh({key:"labelList-implicit"},t,{type:String(t.type)})):null:null}function ly(){return ly=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var t=e.cx,r=e.cy,n=e.r,a=e.className,o=nt("recharts-dot",a);return Ee(t)&&Ee(r)&&Ee(n)?y.createElement("circle",ly({},kn(e),Ry(e),{className:o,cx:t,cy:r,r:n})):null},pG={radiusAxis:{},angleAxis:{}},YP=lr({name:"polarAxis",initialState:pG,reducers:{addRadiusAxis(e,t){e.radiusAxis[t.payload.id]=t.payload},removeRadiusAxis(e,t){delete e.radiusAxis[t.payload.id]},addAngleAxis(e,t){e.angleAxis[t.payload.id]=t.payload},removeAngleAxis(e,t){delete e.angleAxis[t.payload.id]}}}),am=YP.actions;am.addRadiusAxis;am.removeRadiusAxis;am.addAngleAxis;am.removeAngleAxis;var gG=YP.reducer;function vG(e){return e&&typeof e=="object"&&"className"in e&&typeof e.className=="string"?e.className:""}var XP=e=>e&&typeof e=="object"&&"clipDot"in e?!!e.clipDot:!0;function a2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function o2(e){for(var t=1;t{n||(a.current===null?r(RU(t)):a.current!==t&&r(LU({prev:a.current,next:t})),a.current=t)},[t,r,n]),y.useLayoutEffect(()=>()=>{a.current&&(r($U(a.current)),a.current=null)},[r]),null}function AG(e){var t=e.legendPayload,r=Nt(),n=Pr(),a=y.useRef(null);return y.useLayoutEffect(()=>{n||(a.current===null?r(c6(t)):a.current!==t&&r(d6({prev:a.current,next:t})),a.current=t)},[r,n,t]),y.useLayoutEffect(()=>()=>{a.current&&(r(f6(a.current)),a.current=null)},[r]),null}function CG(e,t){return MG(e)||_G(e,t)||OG(e,t)||PG()}function PG(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function OG(e,t){if(e){if(typeof e=="string")return s2(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?s2(e,t):void 0}}function s2(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r2&&arguments[2]!==void 0?arguments[2]:[],n=[];for(var a of r)n.push({status:"removed",prev:a});for(var o=0;oe[Math.floor(o*r)]);return tx(n,t)}function DG(e,t){var r=t.map((n,a)=>e[a]);return tx(r,t)}function RG(e,t){for(var r=new Map,n=0;n{var b=r(g,v);if(b!=null){var j=n.get(b);if(j!==void 0)return a.add(b),j}}),c=[];for(var u of n){var f=CG(u,2),h=f[0],m=f[1];a.has(h)||c.push(m)}return tx(o,t,c)}function uy(e,t,r){return t==null?null:e==null?t.map(n=>({status:"added",next:n})):r===ex?TG(e,t):r===IG?DG(e,t):LG(e,t,r)}function JP(e,t){var r=y.useRef(e),n=y.useRef(t.current),a=y.useRef(!0);r.current!==e&&(r.current=e,n.current=t.current,a.current=!1);var o=y.useCallback(function(c,u){var f=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;if(u===0){a.current=!0;return}u===1&&(n.current=c),u>0&&a.current&&f&&(t.current=c)},[t]);return{startValue:n.current,syncStepValue:o}}function $G(e,t){return UG(e)||BG(e,t)||FG(e,t)||zG()}function zG(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function FG(e,t){if(e){if(typeof e=="string")return l2(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?l2(e,t):void 0}}function l2(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{typeof e=="function"&&e(),o(!0)},[e]),u=y.useCallback(()=>{typeof t=="function"&&t(),o(!1)},[t]);return{isAnimating:a,handleAnimationStart:c,handleAnimationEnd:u}}function WG(e){var t,r=e.animationInput,n=e.animationIdPrefix,a=e.items,o=e.previousItemsRef,c=e.isAnimationActive,u=e.animationBegin,f=e.animationDuration,h=e.animationEasing,m=e.onAnimationStart,g=e.onAnimationEnd,v=e.animationInterpolateFn,b=e.animationMatchBy,j=e.shouldUpdatePreviousRef,k=e.children,S=e.layout,N=mA(r,n),E=JP(N,o),A=(t=E.startValue)!==null&&t!==void 0?t:null,P=uy(A,a,b??ex);return y.createElement(hA,{animationId:N,begin:u,duration:f,isActive:c,easing:h,onAnimationEnd:g,onAnimationStart:m,key:N},_=>{var O=A==null,D=a==null?a:v(P,_,S),U=j?j(_):_>0;return E.syncStepValue(D,_,U),D==null?null:k(D,_,O)})}var $g;function KG(e,t){return QG(e)||qG(e,t)||VG(e,t)||GG()}function GG(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function VG(e,t){if(e){if(typeof e=="string")return u2(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?u2(e,t):void 0}}function u2(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{var e=y.useState(()=>Au("uid-")),t=KG(e,1),r=t[0];return r},eO=($g=lh.useId)!==null&&$g!==void 0?$g:YG;function XG(e,t){var r=eO();return t||(e?"".concat(e,"-").concat(r):r)}var ZG=y.createContext(void 0),JG=e=>{var t=e.id,r=e.type,n=e.children,a=XG("recharts-".concat(r),t);return y.createElement(ZG.Provider,{value:a},n(a))},eV={cartesianItems:[],polarItems:[]},tO=lr({name:"graphicalItems",initialState:eV,reducers:{addCartesianGraphicalItem:{reducer(e,t){e.cartesianItems.push(t.payload)},prepare:st()},replaceCartesianGraphicalItem:{reducer(e,t){var r=t.payload,n=r.prev,a=r.next,o=en(e).cartesianItems.indexOf(n);o>-1&&(e.cartesianItems[o]=a)},prepare:st()},removeCartesianGraphicalItem:{reducer(e,t){var r=en(e).cartesianItems.indexOf(t.payload);r>-1&&e.cartesianItems.splice(r,1)},prepare:st()},addPolarGraphicalItem:{reducer(e,t){e.polarItems.push(t.payload)},prepare:st()},removePolarGraphicalItem:{reducer(e,t){var r=en(e).polarItems.indexOf(t.payload);r>-1&&e.polarItems.splice(r,1)},prepare:st()},replacePolarGraphicalItem:{reducer(e,t){var r=t.payload,n=r.prev,a=r.next,o=en(e).polarItems.indexOf(n);o>-1&&(e.polarItems[o]=a)},prepare:st()}}}),fl=tO.actions,tV=fl.addCartesianGraphicalItem,rV=fl.replaceCartesianGraphicalItem,nV=fl.removeCartesianGraphicalItem;fl.addPolarGraphicalItem;fl.removePolarGraphicalItem;fl.replacePolarGraphicalItem;var iV=tO.reducer,aV=e=>{var t=Nt(),r=y.useRef(null);return y.useLayoutEffect(()=>{r.current===null?t(tV(e)):r.current!==e&&t(rV({prev:r.current,next:e})),r.current=e},[t,e]),y.useLayoutEffect(()=>()=>{r.current&&(t(nV(r.current)),r.current=null)},[t]),null},oV=y.memo(aV),sV=["points"];function c2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function zg(e){for(var t=1;t{var N,E,A=zg(zg(zg({r:3},c),v),{},{index:S,cx:(N=k.x)!==null&&N!==void 0?N:void 0,cy:(E=k.y)!==null&&E!==void 0?E:void 0,dataKey:o,value:k.value,payload:k.payload,points:t});return y.createElement(hV,{key:"dot-".concat(S),option:r,dotProps:A,className:a})}),j={};return u&&f!=null&&(j.clipPath="url(#clipPath-".concat(g?"":"dots-").concat(f,")")),y.createElement(Mi,{zIndex:m},y.createElement(nn,th({className:n},j),b))}function d2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function f2(e){for(var t=1;t({top:e.top,bottom:e.bottom,left:e.left,right:e.right})),PV=q([CV,Ei,Ai],(e,t,r)=>{if(!(!e||t==null||r==null))return{x:e.left,y:e.top,width:Math.max(0,t-e.left-e.right),height:Math.max(0,r-e.top-e.bottom)}}),rx=()=>Me(PV),OV=()=>Me(RH);function h2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function Fg(e){for(var t=1;t{var t=e.point,r=e.childIndex,n=e.mainColor,a=e.activeDot,o=e.dataKey,c=e.clipPath;if(a===!1||t.x==null||t.y==null)return null;var u={index:r,dataKey:o,cx:t.x,cy:t.y,r:4,fill:n??"none",strokeWidth:2,stroke:"#fff",payload:t.payload,value:t.value},f=Fg(Fg(Fg({},u),yh(a)),Ry(a)),h;return y.isValidElement(a)?h=y.cloneElement(a,f):typeof a=="function"?h=a(f):h=y.createElement(QP,f),y.createElement(nn,{className:"recharts-active-dot",clipPath:c},h)};function m2(e){var t=e.points,r=e.mainColor,n=e.activeDot,a=e.itemDataKey,o=e.clipPath,c=e.zIndex,u=c===void 0?pr.activeDot:c,f=Me(Fu),h=OV();if(t==null||h==null)return null;var m=t.find(g=>h.includes(g.payload));return Yt(m)?null:y.createElement(Mi,{zIndex:u},y.createElement(TV,{point:m,childIndex:Number(f),mainColor:r,dataKey:a,activeDot:n,clipPath:o}))}var DV=e=>{var t=e.chartData,r=Nt(),n=Pr();return y.useEffect(()=>n?()=>{}:(r(RS(t)),()=>{r(RS(void 0))}),[t,r,n]),null},p2={x:0,y:0,width:0,height:0,padding:{top:0,right:0,bottom:0,left:0}},iO=lr({name:"brush",initialState:p2,reducers:{setBrushSettings(e,t){return t.payload==null?p2:t.payload}}});iO.actions.setBrushSettings;var RV=iO.reducer;function LV(e){return(e%180+180)%180}var $V=function(t){var r=t.width,n=t.height,a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,o=LV(a),c=o*Math.PI/180,u=Math.atan(n/r),f=c>u&&c{e.dots.push(t.payload)},removeDot:(e,t)=>{var r=en(e).dots.findIndex(n=>n===t.payload);r!==-1&&e.dots.splice(r,1)},addArea:(e,t)=>{e.areas.push(t.payload)},removeArea:(e,t)=>{var r=en(e).areas.findIndex(n=>n===t.payload);r!==-1&&e.areas.splice(r,1)},addLine:(e,t)=>{e.lines.push(t.payload)},removeLine:(e,t)=>{var r=en(e).lines.findIndex(n=>n===t.payload);r!==-1&&e.lines.splice(r,1)}}}),hl=aO.actions;hl.addDot;hl.removeDot;hl.addArea;hl.removeArea;hl.addLine;hl.removeLine;var FV=aO.reducer;function BV(e,t){return KV(e)||WV(e,t)||HV(e,t)||UV()}function UV(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function HV(e,t){if(e){if(typeof e=="string")return g2(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?g2(e,t):void 0}}function g2(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{var t=e.children,r=y.useState("".concat(Au("recharts"),"-clip")),n=BV(r,1),a=n[0],o=rx();if(o==null)return null;var c=o.x,u=o.y,f=o.width,h=o.height;return y.createElement(GV.Provider,{value:a},y.createElement("defs",null,y.createElement("clipPath",{id:a},y.createElement("rect",{x:c,y:u,height:h,width:f}))),t)};function oO(e,t){if(t<1)return[];if(t===1)return e;for(var r=[],n=0;ne*a)return!1;var o=r();return e*(t-e*o/2-n)>=0&&e*(t+e*o/2-a)<=0}function YV(e,t){return oO(e,t+1)}function XV(e,t,r,n,a){for(var o=(n||[]).slice(),c=t.start,u=t.end,f=0,h=1,m=c,g=function(){var j=n==null?void 0:n[f];if(j===void 0)return{v:oO(n,h)};var k=f,S,N=()=>(S===void 0&&(S=r(j,k)),S),E=j.coordinate,A=f===0||Uu(e,E,N,m,u);A||(f=0,m=c,h+=1),A&&(m=E+e*(N()/2+a),f+=h)},v;h<=o.length;)if(v=g(),v)return v.v;return[]}function ZV(e,t,r,n,a){var o=(n||[]).slice(),c=o.length;if(c===0)return[];for(var u=t.start,f=t.end,h=1;h<=c;h++){for(var m=(c-1)%h,g=u,v=!0,b=function(){var P=n[k];if(P==null)return 0;var _=k,O,D=()=>(O===void 0&&(O=r(P,_)),O),U=P.coordinate,B=k===m||Uu(e,U,D,g,f);if(!B)return v=!1,1;B&&(g=U+e*(D()/2+a))},j,k=m;k(k===void 0&&(k=r(b,v)),k);if(v===c-1){var N=e*(j.coordinate+e*S()/2-f);o[v]=j=ar(ar({},j),{},{tickCoord:N>0?j.coordinate-N*e:j.coordinate})}else o[v]=j=ar(ar({},j),{},{tickCoord:j.coordinate});if(j.tickCoord!=null){var E=Uu(e,j.tickCoord,S,u,f);E&&(f=j.tickCoord-e*(S()/2+a),o[v]=ar(ar({},j),{},{isShow:!0}))}},m=c-1;m>=0;m--)h(m);return o}function nq(e,t,r,n,a,o){var c=(n||[]).slice(),u=c.length,f=t.start,h=t.end;if(o){var m=n[u-1];if(m!=null){var g=r(m,u-1),v=e*(m.coordinate+e*g/2-h);if(c[u-1]=m=ar(ar({},m),{},{tickCoord:v>0?m.coordinate-v*e:m.coordinate}),m.tickCoord!=null){var b=Uu(e,m.tickCoord,()=>g,f,h);b&&(h=m.tickCoord-e*(g/2+a),c[u-1]=ar(ar({},m),{},{isShow:!0}))}}}for(var j=o?u-1:u,k=function(E){var A=c[E];if(A==null)return 1;var P=A,_,O=()=>(_===void 0&&(_=r(A,E)),_);if(E===0){var D=e*(P.coordinate-e*O()/2-f);c[E]=P=ar(ar({},P),{},{tickCoord:D<0?P.coordinate-D*e:P.coordinate})}else c[E]=P=ar(ar({},P),{},{tickCoord:P.coordinate});if(P.tickCoord!=null){var U=Uu(e,P.tickCoord,O,f,h);U&&(f=P.tickCoord+e*(O()/2+a),c[E]=ar(ar({},P),{},{isShow:!0}))}},S=0;S{var D=typeof h=="function"?h(_.value,O):_.value;return j==="width"?qV(bu(D,{fontSize:t,letterSpacing:r}),k,g):bu(D,{fontSize:t,letterSpacing:r})[j]},N=a[0],E=a[1],A=a.length>=2&&N!=null&&E!=null?Jr(E.coordinate-N.coordinate):1,P=QV(o,A,j);return f==="equidistantPreserveStart"?XV(A,P,S,a,c):f==="equidistantPreserveEnd"?ZV(A,P,S,a,c):(f==="preserveStart"||f==="preserveStartEnd"?b=nq(A,P,S,a,c,f==="preserveStartEnd"):b=rq(A,P,S,a,c),b.filter(_=>_.isShow))}var iq=e=>{var t=e.ticks,r=e.label,n=e.labelGapWithTick,a=n,o=e.tickSize,c=o===void 0?0:o,u=e.tickMargin,f=u===void 0?0:u,h=0;if(t){Array.from(t).forEach(b=>{if(b){var j=b.getBoundingClientRect();j.width>h&&(h=j.width)}});var m=r?r.getBoundingClientRect().width:0,g=c+f,v=h+g+m+(r?a:0);return Math.round(v)}return 0},aq={xAxis:{},yAxis:{}},sO=lr({name:"renderedTicks",initialState:aq,reducers:{setRenderedTicks:(e,t)=>{var r=t.payload,n=r.axisType,a=r.axisId,o=r.ticks;e[n][a]=o},removeRenderedTicks:(e,t)=>{var r=t.payload,n=r.axisType,a=r.axisId;delete e[n][a]}}}),lO=sO.actions,oq=lO.setRenderedTicks,sq=lO.removeRenderedTicks,lq=sO.reducer,uq=["axisLine","width","height","className","hide","ticks","axisType","axisId"];function y2(e,t){return hq(e)||fq(e,t)||dq(e,t)||cq()}function cq(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function dq(e,t){if(e){if(typeof e=="string")return x2(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?x2(e,t):void 0}}function x2(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{if(n==null||r==null)return rl;var o=t.map(c=>({value:c.value,coordinate:c.coordinate,offset:c.offset,index:c.index}));return a(oq({ticks:o,axisId:n,axisType:r})),()=>{a(sq({axisId:n,axisType:r}))}},[a,t,n,r]),null}var Nq=y.forwardRef((e,t)=>{var r=e.ticks,n=r===void 0?[]:r,a=e.tick,o=e.tickLine,c=e.stroke,u=e.tickFormatter,f=e.unit,h=e.padding,m=e.tickTextProps,g=e.orientation,v=e.mirror,b=e.x,j=e.y,k=e.width,S=e.height,N=e.tickSize,E=e.tickMargin,A=e.fontSize,P=e.letterSpacing,_=e.getTicksConfig,O=e.events,D=e.axisType,U=e.axisId,B=nx(xt(xt({},_),{},{ticks:n}),A,P),F=kn(_),Y=yh(a),H=BP(F.textAnchor)?F.textAnchor:wq(g,v),pe=kq(g,v),ue={};typeof o=="object"&&(ue=o);var he=xt(xt({},F),{},{fill:"none"},ue),ae=B.map(te=>xt({entry:te},bq(te,b,j,k,S,g,N,v,E))),se=ae.map(te=>{var J=te.entry,I=te.line;return y.createElement(nn,{className:"recharts-cartesian-axis-tick",key:"tick-".concat(J.value,"-").concat(J.coordinate,"-").concat(J.tickCoord)},o&&y.createElement("line",Eo({},he,I,{className:nt("recharts-cartesian-axis-tick-line",Oo(o,"className"))})))}),X=ae.map((te,J)=>{var I,M,K=te.entry,ne=te.tick,Z=xt(xt(xt(xt({verticalAnchor:pe},F),{},{textAnchor:H,stroke:"none",fill:c},ne),{},{index:J,payload:K,visibleTicksCount:B.length,tickFormatter:u,padding:h},m),{},{angle:(I=(M=m==null?void 0:m.angle)!==null&&M!==void 0?M:F.angle)!==null&&I!==void 0?I:0}),me=xt(xt({},Z),Y);return y.createElement(nn,Eo({className:"recharts-cartesian-axis-tick-label",key:"tick-label-".concat(K.value,"-").concat(K.coordinate,"-").concat(K.tickCoord)},PR(O,K,J)),a&&y.createElement(jq,{option:a,tickProps:me,value:"".concat(typeof u=="function"?u(K.value,J):K.value).concat(f||"")}))});return y.createElement("g",{className:"recharts-cartesian-axis-ticks recharts-".concat(D,"-ticks")},y.createElement(Sq,{ticks:B,axisId:U,axisType:D}),X.length>0&&y.createElement(Mi,{zIndex:pr.label},y.createElement("g",{className:"recharts-cartesian-axis-tick-labels recharts-".concat(D,"-tick-labels"),ref:t},X)),se.length>0&&y.createElement("g",{className:"recharts-cartesian-axis-tick-lines recharts-".concat(D,"-tick-lines")},se))}),Eq=y.forwardRef((e,t)=>{var r=e.axisLine,n=e.width,a=e.height,o=e.className,c=e.hide,u=e.ticks,f=e.axisType,h=e.axisId,m=mq(e,uq),g=y.useState(""),v=y2(g,2),b=v[0],j=v[1],k=y.useState(""),S=y2(k,2),N=S[0],E=S[1],A=y.useRef(null);y.useImperativeHandle(t,()=>({getCalculatedWidth:()=>{var _;return iq({ticks:A.current,label:(_=e.labelRef)===null||_===void 0?void 0:_.current,labelGapWithTick:5,tickSize:e.tickSize,tickMargin:e.tickMargin})}}));var P=y.useCallback(_=>{if(_){var O=_.getElementsByClassName("recharts-cartesian-axis-tick-value");A.current=O;var D=O[0];if(D){var U=window.getComputedStyle(D),B=U.fontSize,F=U.letterSpacing;(B!==b||F!==N)&&(j(B),E(F))}}},[b,N]);return c||n!=null&&n<=0||a!=null&&a<=0?null:y.createElement(Mi,{zIndex:e.zIndex},y.createElement(nn,{className:nt("recharts-cartesian-axis",o)},y.createElement(xq,{x:e.x,y:e.y,width:n,height:a,orientation:e.orientation,mirror:e.mirror,axisLine:r,otherSvgProps:kn(e)}),y.createElement(Nq,{ref:P,axisType:f,events:m,fontSize:b,getTicksConfig:e,height:e.height,letterSpacing:N,mirror:e.mirror,orientation:e.orientation,padding:e.padding,stroke:e.stroke,tick:e.tick,tickFormatter:e.tickFormatter,tickLine:e.tickLine,tickMargin:e.tickMargin,tickSize:e.tickSize,tickTextProps:e.tickTextProps,ticks:u,unit:e.unit,width:e.width,x:e.x,y:e.y,axisId:h}),y.createElement(YK,{x:e.x,y:e.y,width:e.width,height:e.height,lowerWidth:e.width,upperWidth:e.width},y.createElement(oG,{label:e.label,labelRef:e.labelRef}),e.children)))}),ix=y.forwardRef((e,t)=>{var r=on(e,xi);return y.createElement(Eq,Eo({},r,{ref:t}))});ix.displayName="CartesianAxis";var Aq=["x1","y1","x2","y2","key"],Cq=["offset"],Pq=["xAxisId","yAxisId"],Oq=["xAxisId","yAxisId"];function w2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function or(e){for(var t=1;t{var t=e.fill;if(!t||t==="none")return null;var r=e.fillOpacity,n=e.x,a=e.y,o=e.width,c=e.height,u=e.ry;return y.createElement("rect",{x:n,y:a,ry:u,width:o,height:c,stroke:"none",fill:t,fillOpacity:r,className:"recharts-cartesian-grid-bg"})};function uO(e){var t=e.option,r=e.lineItemProps,n;if(y.isValidElement(t))n=y.cloneElement(t,r);else if(typeof t=="function")n=t(r);else{var a,o=r.x1,c=r.y1,u=r.x2,f=r.y2,h=r.key,m=rh(r,Aq),g=(a=kn(m))!==null&&a!==void 0?a:{};g.offset;var v=rh(g,Cq);n=y.createElement("line",no({},v,{x1:o,y1:c,x2:u,y2:f,fill:"none",key:h}))}return n}function Rq(e){var t=e.x,r=e.width,n=e.horizontal,a=n===void 0?!0:n,o=e.horizontalPoints;if(!a||!o||!o.length)return null;e.xAxisId,e.yAxisId;var c=rh(e,Pq),u=o.map((f,h)=>{var m=or(or({},c),{},{x1:t,y1:f,x2:t+r,y2:f,key:"line-".concat(h),index:h});return y.createElement(uO,{key:"line-".concat(h),option:a,lineItemProps:m})});return y.createElement("g",{className:"recharts-cartesian-grid-horizontal"},u)}function Lq(e){var t=e.y,r=e.height,n=e.vertical,a=n===void 0?!0:n,o=e.verticalPoints;if(!a||!o||!o.length)return null;e.xAxisId,e.yAxisId;var c=rh(e,Oq),u=o.map((f,h)=>{var m=or(or({},c),{},{x1:f,y1:t,x2:f,y2:t+r,key:"line-".concat(h),index:h});return y.createElement(uO,{option:a,lineItemProps:m,key:"line-".concat(h)})});return y.createElement("g",{className:"recharts-cartesian-grid-vertical"},u)}function $q(e){var t=e.horizontalFill,r=e.fillOpacity,n=e.x,a=e.y,o=e.width,c=e.height,u=e.horizontalPoints,f=e.horizontal,h=f===void 0?!0:f;if(!h||!t||!t.length||u==null)return null;var m=u.map(v=>Math.round(v+a-a)).sort((v,b)=>v-b);a!==m[0]&&m.unshift(0);var g=m.map((v,b)=>{var j=m[b+1],k=j==null,S=k?a+c-v:j-v;if(S<=0)return null;var N=b%t.length;return y.createElement("rect",{key:"react-".concat(b),y:v,x:n,height:S,width:o,stroke:"none",fill:t[N],fillOpacity:r,className:"recharts-cartesian-grid-bg"})});return y.createElement("g",{className:"recharts-cartesian-gridstripes-horizontal"},g)}function zq(e){var t=e.vertical,r=t===void 0?!0:t,n=e.verticalFill,a=e.fillOpacity,o=e.x,c=e.y,u=e.width,f=e.height,h=e.verticalPoints;if(!r||!n||!n.length)return null;var m=h.map(v=>Math.round(v+o-o)).sort((v,b)=>v-b);o!==m[0]&&m.unshift(0);var g=m.map((v,b)=>{var j=m[b+1],k=j==null,S=k?o+u-v:j-v;if(S<=0)return null;var N=b%n.length;return y.createElement("rect",{key:"react-".concat(b),x:v,y:c,width:S,height:f,stroke:"none",fill:n[N],fillOpacity:a,className:"recharts-cartesian-grid-bg"})});return y.createElement("g",{className:"recharts-cartesian-gridstripes-vertical"},g)}var Fq=(e,t)=>{var r=e.xAxis,n=e.width,a=e.height,o=e.offset;return H5(nx(or(or(or({},xi),r),{},{ticks:W5(r),viewBox:{x:0,y:0,width:n,height:a}})),o.left,o.left+o.width,t)},Bq=(e,t)=>{var r=e.yAxis,n=e.width,a=e.height,o=e.offset;return H5(nx(or(or(or({},xi),r),{},{ticks:W5(r),viewBox:{x:0,y:0,width:n,height:a}})),o.top,o.top+o.height,t)},Uq={horizontal:!0,vertical:!0,horizontalPoints:[],verticalPoints:[],stroke:"#ccc",fill:"none",verticalFill:[],horizontalFill:[],xAxisId:0,yAxisId:0,syncWithTicks:!1,zIndex:pr.grid};function cO(e){var t=Z5(),r=J5(),n=X5(),a=or(or({},on(e,Uq)),{},{x:Ee(e.x)?e.x:n.left,y:Ee(e.y)?e.y:n.top,width:Ee(e.width)?e.width:n.width,height:Ee(e.height)?e.height:n.height}),o=a.xAxisId,c=a.yAxisId,u=a.x,f=a.y,h=a.width,m=a.height,g=a.syncWithTicks,v=a.horizontalValues,b=a.verticalValues,j=Pr(),k=Me(B=>jS(B,"xAxis",o,j)),S=Me(B=>jS(B,"yAxis",c,j));if(!Vn(h)||!Vn(m)||!Ee(u)||!Ee(f))return null;var N=a.verticalCoordinatesGenerator||Fq,E=a.horizontalCoordinatesGenerator||Bq,A=a.horizontalPoints,P=a.verticalPoints;if((!A||!A.length)&&typeof E=="function"){var _=v&&v.length,O=E({yAxis:S?or(or({},S),{},{ticks:_?v:S.ticks}):void 0,width:t??h,height:r??m,offset:n},_?!0:g);Cf(Array.isArray(O),"horizontalCoordinatesGenerator should return Array but instead it returned [".concat(typeof O,"]")),Array.isArray(O)&&(A=O)}if((!P||!P.length)&&typeof N=="function"){var D=b&&b.length,U=N({xAxis:k?or(or({},k),{},{ticks:D?b:k.ticks}):void 0,width:t??h,height:r??m,offset:n},D?!0:g);Cf(Array.isArray(U),"verticalCoordinatesGenerator should return Array but instead it returned [".concat(typeof U,"]")),Array.isArray(U)&&(P=U)}return y.createElement(Mi,{zIndex:a.zIndex},y.createElement("g",{className:"recharts-cartesian-grid"},y.createElement(Dq,{fill:a.fill,fillOpacity:a.fillOpacity,x:a.x,y:a.y,width:a.width,height:a.height,ry:a.ry}),y.createElement($q,no({},a,{horizontalPoints:A})),y.createElement(zq,no({},a,{verticalPoints:P})),y.createElement(Rq,no({},a,{offset:n,horizontalPoints:A,xAxis:k,yAxis:S})),y.createElement(Lq,no({},a,{offset:n,verticalPoints:P,xAxis:k,yAxis:S}))))}cO.displayName="CartesianGrid";var Hq={},dO=lr({name:"errorBars",initialState:Hq,reducers:{addErrorBar:(e,t)=>{var r=t.payload,n=r.itemId,a=r.errorBar;e[n]||(e[n]=[]),e[n].push(a)},replaceErrorBar:(e,t)=>{var r=t.payload,n=r.itemId,a=r.prev,o=r.next;e[n]&&(e[n]=e[n].map(c=>c.dataKey===a.dataKey&&c.direction===a.direction?o:c))},removeErrorBar:(e,t)=>{var r=t.payload,n=r.itemId,a=r.errorBar;e[n]&&(e[n]=e[n].filter(o=>o.dataKey!==a.dataKey||o.direction!==a.direction))}}}),ax=dO.actions;ax.addErrorBar;ax.replaceErrorBar;ax.removeErrorBar;var Wq=dO.reducer;function fO(e,t){var r,n,a=Me(h=>Pi(h,e)),o=Me(h=>Oi(h,t)),c=(r=a==null?void 0:a.allowDataOverflow)!==null&&r!==void 0?r:Ct.allowDataOverflow,u=(n=o==null?void 0:o.allowDataOverflow)!==null&&n!==void 0?n:Pt.allowDataOverflow,f=c||u;return{needClip:f,needClipX:c,needClipY:u}}function Kq(e){var t=e.xAxisId,r=e.yAxisId,n=e.clipPathId,a=rx(),o=fO(t,r),c=o.needClipX,u=o.needClipY,f=o.needClip,h=Me(A=>YC(A,t,!1)),m=Me(A=>XC(A,r,!1));if(!f||!a)return null;var g=a.x,v=a.y,b=a.width,j=a.height,k=c&&h?Math.min(h[0],h[1]):g-b/2,S=u&&m?Math.min(m[0],m[1]):v-j/2,N=c&&h?Math.abs(h[1]-h[0]):b*2,E=u&&m?Math.abs(m[1]-m[0]):j*2;return y.createElement("clipPath",{id:"clipPath-".concat(n)},y.createElement("rect",{x:k,y:S,width:N,height:E}))}function Gq(e){var t=yh(e),r=3,n=2;if(t!=null){var a=t.r,o=t.strokeWidth,c=Number(a),u=Number(o);return(Number.isNaN(c)||c<0)&&(c=r),(Number.isNaN(u)||u<0)&&(u=n),{r:c,strokeWidth:u}}return{r,strokeWidth:n}}function ox(e,t){var r,n;return(r=(n=e.graphicalItems.cartesianItems.find(a=>a.id===t))===null||n===void 0?void 0:n.xAxisId)!==null&&r!==void 0?r:rO}function sx(e,t){var r,n;return(r=(n=e.graphicalItems.cartesianItems.find(a=>a.id===t))===null||n===void 0?void 0:n.yAxisId)!==null&&r!==void 0?r:rO}var hO=(e,t,r)=>aP(e,"xAxis",ox(e,t),r),mO=(e,t,r)=>iP(e,"xAxis",ox(e,t),r),pO=(e,t,r)=>aP(e,"yAxis",sx(e,t),r),gO=(e,t,r)=>iP(e,"yAxis",sx(e,t),r),Vq=q([ft,hO,pO,mO,gO],(e,t,r,n,a)=>Xn(e,"xAxis")?Af(t,n,!1):Af(r,a,!1)),qq=(e,t)=>t,vO=q([SC,qq],(e,t)=>e.filter(r=>r.type==="area").find(r=>r.id===t)),yO=e=>{var t=ft(e),r=Xn(t,"xAxis");return r?"yAxis":"xAxis"},Qq=(e,t)=>{var r=yO(e);return r==="yAxis"?sx(e,t):ox(e,t)},Yq=(e,t,r)=>TC(e,yO(e),Qq(e,t),r),Xq=q([vO,Yq],(e,t)=>{var r;if(!(e==null||t==null)){var n=e.stackId,a=s0(e);if(!(n==null||a==null)){var o=(r=t[n])===null||r===void 0?void 0:r.stackedData,c=o==null?void 0:o.find(u=>u.key===a);if(c!=null)return c.map(u=>[u[0],u[1]])}}}),Zq=q([ft,hO,pO,mO,gO,Xq,kF,Vq,vO,zF],(e,t,r,n,a,o,c,u,f,h)=>{var m=c.chartData,g=c.dataStartIndex,v=c.dataEndIndex;if(!(f==null||e!=="horizontal"&&e!=="vertical"||t==null||r==null||n==null||a==null||n.length===0||a.length===0||u==null)){var b=f.data,j;if(b&&b.length>0?j=b:j=m==null?void 0:m.slice(g,v+1),j!=null)return SQ({layout:e,xAxis:t,yAxis:r,xAxisTicks:n,yAxisTicks:a,dataStartIndex:g,areaSettings:f,stackedData:o,displayedData:j,chartBaseValue:h,bandSize:u})}}),Jq=["animationElapsedTime","isAnimating","isEntrance","layout","isRange","stroke","connectNulls"],eQ=["id","baseLine"];function wu(){return wu=Object.assign?Object.assign.bind():function(e){for(var t=1;tg.y||0));return Ee(a)?m=Math.max(a,m):a&&Array.isArray(a)&&a.length&&(m=Math.max(...a.map(g=>g.y||0),m)),Ee(m)?y.createElement("rect",{x:ug.x||0));return Ee(a)?m=Math.max(a,m):a&&Array.isArray(a)&&a.length&&(m=Math.max(...a.map(g=>g.x||0),m)),Ee(m)?y.createElement("rect",{x:0,y:ue==null?[]:t===1?e.flatMap(r=>r.status==="removed"?[]:[r.next]):e.flatMap(r=>r.status==="matched"?[Js(Js({},r.next),{},{x:mi(r.prev.x,r.next.x,t),y:mi(r.prev.y,r.next.y,t)})]:r.status==="added"?[r.next]:[]),bO={activeDot:!0,animationBegin:0,animationDuration:1500,animationEasing:"ease",animationMatchBy:ex,animationInterpolateFn:fQ,connectNulls:!1,dot:!1,fill:"#3182bd",fillOpacity:.6,hide:!1,isAnimationActive:"auto",legendType:"line",stroke:"#3182bd",strokeWidth:1,type:"linear",label:!1,shape:aQ,xAxisId:0,yAxisId:0,zIndex:pr.area};function ih(e,t){return e&&e!=="none"?e:t}var hQ=e=>{var t=e.dataKey,r=e.name,n=e.stroke,a=e.fill,o=e.legendType,c=e.hide;return[{inactive:c,dataKey:t,type:o,color:ih(n,a),value:K5(r,t),payload:e}]},mQ=y.memo(e=>{var t=e.dataKey,r=e.data,n=e.stroke,a=e.strokeWidth,o=e.fill,c=e.name,u=e.hide,f=e.unit,h=e.tooltipType,m=e.id,g={dataDefinedOnItem:r,getPosition:rl,settings:{stroke:n,strokeWidth:a,fill:o,dataKey:t,nameKey:void 0,name:K5(c,t),hide:u,type:h,color:ih(n,o),unit:f,graphicalItemId:m}};return y.createElement(EG,{tooltipEntrySettings:g})});function pQ(e){var t=e.clipPathId,r=e.points,n=e.props,a=n.needClip,o=n.dot,c=n.dataKey,u=kn(n);return y.createElement(pV,{points:r,dot:o,className:"recharts-area-dots",dotClassName:"recharts-area-dot",dataKey:c,baseProps:u,needClip:a,clipPathId:t})}function gQ(e){var t=e.showLabels,r=e.children,n=e.points,a=n.map(o=>{var c,u,f={x:(c=o.x)!==null&&c!==void 0?c:0,y:(u=o.y)!==null&&u!==void 0?u:0,width:0,lowerWidth:0,upperWidth:0,height:0};return Js(Js({},f),{},{value:o.value,payload:o.payload,parentViewBox:void 0,viewBox:f,fill:void 0})});return y.createElement(dG,{value:t?a:void 0},r)}function vQ(e){var t=e.points,r=e.baseLine,n=e.needClip,a=e.clipPathId,o=e.props,c=e.animationElapsedTime,u=e.isAnimating,f=e.isEntrance,h=o.layout,m=o.type,g=o.stroke,v=o.connectNulls,b=o.isRange,j=o.shape,k=o.id,S=xO(o,oQ),N=rn(S),E=Js(Js({},N),{},{id:k,points:t,connectNulls:v,type:m,baseLine:r,layout:h,stroke:g,isRange:b,animationElapsedTime:c,isAnimating:u,isEntrance:f});return y.createElement(y.Fragment,null,(t==null?void 0:t.length)>1&&y.createElement(nn,{clipPath:n?"url(#clipPath-".concat(a,")"):void 0},y.createElement(NG,{option:j,DefaultShape:bO.shape,shapeProps:E})),y.createElement(pQ,{points:t,props:S,clipPathId:a}))}function yQ(e,t,r){if(Ee(e)){var n=Ee(t)?t:void 0;return mi(n,e,r)}if(Yt(e)||Kn(e)){var a=Ee(t)?t:void 0;return mi(a,0,r)}return e}function xQ(e){var t=e.needClip,r=e.clipPathId,n=e.props,a=e.previousPointsRef,o=e.previousBaselineRef,c=n.points,u=n.baseLine,f=n.isAnimationActive,h=n.animationBegin,m=n.animationDuration,g=n.animationEasing,v=n.animationMatchBy,b=n.animationInterpolateFn,j=y.useMemo(()=>({points:c,baseLine:u}),[c,u]),k=JP(j,o),S=Vy(),N=HG(n.onAnimationStart,n.onAnimationEnd),E=N.isAnimating,A=N.handleAnimationStart,P=N.handleAnimationEnd,_=k.startValue;if(S==null)return null;var O;return Array.isArray(u)&&Array.isArray(_)?O=uy(_,u,v):Array.isArray(u)?O=uy(null,u,v):O=null,y.createElement(WG,{animationInput:j,animationIdPrefix:"recharts-area-",items:c,previousItemsRef:a,isAnimationActive:f,animationBegin:h,animationDuration:m,animationEasing:g,onAnimationStart:A,onAnimationEnd:P,animationInterpolateFn:b,animationMatchBy:v,layout:S},(D,U,B)=>{var F;return U===1?F=u:Array.isArray(u)?F=b(O,U,S):F=B?u:yQ(u,_,U),k.syncStepValue(F,U),y.createElement(gQ,{showLabels:!E,points:c},n.children,y.createElement(vQ,{points:D,baseLine:F,needClip:t,clipPathId:r,props:n,animationElapsedTime:U,isAnimating:E||U<1,isEntrance:B}),y.createElement(mG,{label:n.label}))})}function bQ(e){var t=e.needClip,r=e.clipPathId,n=e.props,a=y.useRef(null),o=y.useRef();return y.createElement(xQ,{needClip:t,clipPathId:r,props:n,previousPointsRef:a,previousBaselineRef:o})}class wQ extends y.PureComponent{render(){var t=this.props,r=t.hide,n=t.dot,a=t.points,o=t.className,c=t.top,u=t.left,f=t.needClip,h=t.xAxisId,m=t.yAxisId,g=t.width,v=t.height,b=t.id,j=t.baseLine,k=t.zIndex;if(r)return null;var S=nt("recharts-area",o),N=b,E=Gq(n),A=E.r,P=E.strokeWidth,_=XP(n),O=A*2+P,D=f?"url(#clipPath-".concat(_?"":"dots-").concat(N,")"):void 0;return y.createElement(Mi,{zIndex:k},y.createElement(nn,{className:S},f&&y.createElement("defs",null,y.createElement(Kq,{clipPathId:N,xAxisId:h,yAxisId:m}),!_&&y.createElement("clipPath",{id:"clipPath-dots-".concat(N)},y.createElement("rect",{x:u-O/2,y:c-O/2,width:g+O,height:v+O}))),y.createElement(bQ,{needClip:f,clipPathId:N,props:this.props})),y.createElement(m2,{points:a,mainColor:ih(this.props.stroke,this.props.fill),itemDataKey:this.props.dataKey,activeDot:this.props.activeDot,clipPath:D}),this.props.isRange&&Array.isArray(j)&&y.createElement(m2,{points:j,mainColor:ih(this.props.stroke,this.props.fill),itemDataKey:this.props.dataKey,activeDot:this.props.activeDot,clipPath:D}))}}function kQ(e){var t,r=e.activeDot,n=e.animationBegin,a=e.animationDuration,o=e.animationEasing,c=e.connectNulls,u=e.dot,f=e.fill,h=e.fillOpacity,m=e.hide,g=e.isAnimationActive,v=e.legendType,b=e.stroke,j=e.xAxisId,k=e.yAxisId,S=xO(e,sQ),N=nl(),E=CP(),A=fO(j,k),P=A.needClip,_=Pr(),O=(t=Me(he=>Zq(he,e.id,_)))!==null&&t!==void 0?t:{},D=O.points,U=O.isRange,B=O.baseLine,F=rx();if(N!=="horizontal"&&N!=="vertical"||F==null||E!=="AreaChart"&&E!=="ComposedChart")return null;var Y=F.height,H=F.width,pe=F.x,ue=F.y;return!D||!D.length?null:y.createElement(wQ,nh({},S,{activeDot:r,animationBegin:n,animationDuration:a,animationEasing:o,baseLine:B,connectNulls:c,dot:u,fill:f,fillOpacity:h,height:Y,hide:m,layout:N,isAnimationActive:g,isRange:U,legendType:v,needClip:P,points:D,stroke:b,width:H,left:pe,top:ue,xAxisId:j,yAxisId:k}))}var jQ=(e,t,r,n,a)=>{var o=r??t;if(Ee(o))return o;var c=e==="horizontal"?a:n,u=c.scale.domain();if(c.type==="number"){var f=Math.max(u[0],u[1]),h=Math.min(u[0],u[1]);return o==="dataMin"?h:o==="dataMax"||f<0?f:Math.max(Math.min(u[0],u[1]),0)}return o==="dataMin"?u[0]:o==="dataMax"?u[1]:u[0]};function SQ(e){var t=e.areaSettings,r=t.connectNulls,n=t.baseValue,a=t.dataKey,o=e.stackedData,c=e.layout,u=e.chartBaseValue,f=e.xAxis,h=e.yAxis,m=e.displayedData,g=e.dataStartIndex,v=e.xAxisTicks,b=e.yAxisTicks,j=e.bandSize,k=o&&o.length,S=jQ(c,u,n,f,h),N=c==="horizontal",E=!1,A=m.map((_,O)=>{var D,U,B,F;if(k)F=o[g+O];else{var Y=Lt(_,a);Array.isArray(Y)?(F=Y,E=!0):F=[S,Y]}var H=(D=(U=F)===null||U===void 0?void 0:U[1])!==null&&D!==void 0?D:null,pe=H==null||k&&!r&&Lt(_,a)==null;if(N){var ue;return{x:yk({axis:f,ticks:v,bandSize:j,entry:_,index:O}),y:pe?null:(ue=h.scale.map(H))!==null&&ue!==void 0?ue:null,value:F,payload:_}}return{x:pe?null:(B=f.scale.map(H))!==null&&B!==void 0?B:null,y:yk({axis:h,ticks:b,bandSize:j,entry:_,index:O}),value:F,payload:_}}),P;return k||E?P=A.map(_=>{var O,D=Array.isArray(_.value)?_.value[0]:null;if(N){var U;return{x:_.x,y:D!=null&&_.y!=null&&(U=h.scale.map(D))!==null&&U!==void 0?U:null,payload:_.payload}}return{x:D!=null&&(O=f.scale.map(D))!==null&&O!==void 0?O:null,y:_.y,payload:_.payload}}):P=N?h.scale.map(S):f.scale.map(S),{points:A,baseLine:P??0,isRange:E}}function NQ(e){var t=on(e,bO),r=Pr();return y.createElement(JG,{id:t.id,type:"area"},n=>y.createElement(y.Fragment,null,y.createElement(AG,{legendPayload:hQ(t)}),y.createElement(mQ,{dataKey:t.dataKey,data:t.data,stroke:t.stroke,strokeWidth:t.strokeWidth,fill:t.fill,name:t.name,hide:t.hide,unit:t.unit,tooltipType:t.tooltipType,id:n}),y.createElement(oV,{type:"area",id:n,data:t.data,dataKey:t.dataKey,xAxisId:t.xAxisId,yAxisId:t.yAxisId,zAxisId:0,stackId:lz(t.stackId),hide:t.hide,barSize:void 0,baseValue:t.baseValue,isPanorama:r,connectNulls:t.connectNulls}),y.createElement(kQ,nh({},t,{id:n}))))}var wO=y.memo(NQ,Fh);wO.displayName="Area";var EQ=["domain","range"],AQ=["domain","range"];function S2(e,t){if(e==null)return{};var r,n,a=CQ(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n{if(c!=null)return A2(A2({},o),{},{type:c})},[o,c]);return y.useLayoutEffect(()=>{u!=null&&(r.current===null?t(bV(u)):r.current!==u&&t(wV({prev:r.current,next:u})),r.current=u)},[u,t]),y.useLayoutEffect(()=>()=>{r.current&&(t(kV(r.current)),r.current=null)},[t]),null}var LQ=e=>{var t=e.xAxisId,r=e.className,n=Me(V5),a=Pr(),o="xAxis",c=Me(v=>nP(v,o,t,a)),u=Me(v=>vU(v,t)),f=Me(v=>jU(v,t)),h=Me(v=>bC(v,t));if(u==null||f==null||h==null)return null;e.dangerouslySetInnerHTML,e.ticks,e.scale;var m=dy(e,OQ);h.id,h.scale;var g=dy(h,_Q);return y.createElement(ix,cy({},m,g,{x:f.x,y:f.y,width:u.width,height:u.height,className:nt("recharts-".concat(o," ").concat(o),r),viewBox:n,ticks:c,axisType:o,axisId:t}))},$Q={allowDataOverflow:Ct.allowDataOverflow,allowDecimals:Ct.allowDecimals,allowDuplicatedCategory:Ct.allowDuplicatedCategory,angle:Ct.angle,axisLine:xi.axisLine,height:Ct.height,hide:!1,includeHidden:Ct.includeHidden,interval:Ct.interval,label:!1,minTickGap:Ct.minTickGap,mirror:Ct.mirror,orientation:Ct.orientation,padding:Ct.padding,reversed:Ct.reversed,scale:Ct.scale,tick:Ct.tick,tickCount:Ct.tickCount,tickLine:xi.tickLine,tickSize:xi.tickSize,type:Ct.type,niceTicks:Ct.niceTicks,xAxisId:0},zQ=e=>{var t=on(e,$Q);return y.createElement(y.Fragment,null,y.createElement(RQ,{allowDataOverflow:t.allowDataOverflow,allowDecimals:t.allowDecimals,allowDuplicatedCategory:t.allowDuplicatedCategory,angle:t.angle,dataKey:t.dataKey,domain:t.domain,height:t.height,hide:t.hide,id:t.xAxisId,includeHidden:t.includeHidden,interval:t.interval,minTickGap:t.minTickGap,mirror:t.mirror,name:t.name,orientation:t.orientation,padding:t.padding,reversed:t.reversed,scale:t.scale,tick:t.tick,tickCount:t.tickCount,tickFormatter:t.tickFormatter,ticks:t.ticks,type:t.type,unit:t.unit,niceTicks:t.niceTicks}),y.createElement(LQ,t))},jO=y.memo(zQ,kO);jO.displayName="XAxis";var FQ=["type"],BQ=["dangerouslySetInnerHTML","ticks","scale"],UQ=["id","scale"];function fy(){return fy=Object.assign?Object.assign.bind():function(e){for(var t=1;t{if(c!=null)return P2(P2({},o),{},{type:c})},[c,o]);return y.useLayoutEffect(()=>{u!=null&&(r.current===null?t(jV(u)):r.current!==u&&t(SV({prev:r.current,next:u})),r.current=u)},[u,t]),y.useLayoutEffect(()=>()=>{r.current&&(t(NV(r.current)),r.current=null)},[t]),null}function qQ(e){var t=e.yAxisId,r=e.className,n=e.width,a=e.label,o=y.useRef(null),c=y.useRef(null),u=Me(V5),f=Pr(),h=Nt(),m="yAxis",g=Me(N=>EU(N,t)),v=Me(N=>NU(N,t)),b=Me(N=>nP(N,m,t,f)),j=Me(N=>wC(N,t));if(y.useLayoutEffect(()=>{if(!(n!=="auto"||!g||J0(a)||y.isValidElement(a)||j==null)){var N=o.current;if(N){var E=N.getCalculatedWidth();Math.round(g.width)!==Math.round(E)&&h(EV({id:t,width:E}))}}},[b,g,h,a,t,n,j]),g==null||v==null||j==null)return null;e.dangerouslySetInnerHTML,e.ticks,e.scale;var k=hy(e,BQ);j.id,j.scale;var S=hy(j,UQ);return y.createElement(ix,fy({},k,S,{ref:o,labelRef:c,x:v.x,y:v.y,tickTextProps:n==="auto"?{width:void 0}:{width:n},width:g.width,height:g.height,className:nt("recharts-".concat(m," ").concat(m),r),viewBox:u,ticks:b,axisType:m,axisId:t}))}var QQ={allowDataOverflow:Pt.allowDataOverflow,allowDecimals:Pt.allowDecimals,allowDuplicatedCategory:Pt.allowDuplicatedCategory,angle:Pt.angle,axisLine:xi.axisLine,hide:!1,includeHidden:Pt.includeHidden,interval:Pt.interval,label:!1,minTickGap:Pt.minTickGap,mirror:Pt.mirror,orientation:Pt.orientation,padding:Pt.padding,reversed:Pt.reversed,scale:Pt.scale,tick:Pt.tick,tickCount:Pt.tickCount,tickLine:xi.tickLine,tickSize:xi.tickSize,type:Pt.type,niceTicks:Pt.niceTicks,width:Pt.width,yAxisId:0},YQ=e=>{var t=on(e,QQ);return y.createElement(y.Fragment,null,y.createElement(VQ,{interval:t.interval,id:t.yAxisId,scale:t.scale,type:t.type,domain:t.domain,allowDataOverflow:t.allowDataOverflow,dataKey:t.dataKey,allowDuplicatedCategory:t.allowDuplicatedCategory,allowDecimals:t.allowDecimals,tickCount:t.tickCount,padding:t.padding,includeHidden:t.includeHidden,reversed:t.reversed,ticks:t.ticks,width:t.width,orientation:t.orientation,mirror:t.mirror,hide:t.hide,unit:t.unit,name:t.name,angle:t.angle,minTickGap:t.minTickGap,tick:t.tick,tickFormatter:t.tickFormatter,niceTicks:t.niceTicks}),y.createElement(qQ,t))},SO=y.memo(YQ,kO);SO.displayName="YAxis";var XQ=(e,t)=>t,lx=q([XQ,ft,DA,Ft,kP,_i,qH,Zt],tW);function ZQ(e){return"getBBox"in e.currentTarget&&typeof e.currentTarget.getBBox=="function"}function ux(e){var t=e.currentTarget.getBoundingClientRect(),r,n;if(ZQ(e)){var a=e.currentTarget.getBBox();r=a.width>0?t.width/a.width:1,n=a.height>0?t.height/a.height:1}else{var o=e.currentTarget;r=o.offsetWidth>0?t.width/o.offsetWidth:1,n=o.offsetHeight>0?t.height/o.offsetHeight:1}var c=(u,f)=>({relativeX:Math.round((u-t.left)/r),relativeY:Math.round((f-t.top)/n)});return"touches"in e?Array.from(e.touches).map(u=>c(u.clientX,u.clientY)):c(e.clientX,e.clientY)}var NO=Hr("mouseClick"),EO=Zu();EO.startListening({actionCreator:NO,effect:(e,t)=>{var r=e.payload,n=lx(t.getState(),ux(r));(n==null?void 0:n.activeIndex)!=null&&t.dispatch(BU({activeIndex:n.activeIndex,activeDataKey:void 0,activeCoordinate:n.activeCoordinate}))}});var my=Hr("mouseMove"),AO=Zu(),hs=null,Ha=null,Bg=null;AO.startListening({actionCreator:my,effect:(e,t)=>{var r=e.payload,n=t.getState(),a=n.eventSettings,o=a.throttleDelay,c=a.throttledEvents,u=c==="all"||(c==null?void 0:c.includes("mousemove"));hs!==null&&(cancelAnimationFrame(hs),hs=null),Ha!==null&&(typeof o!="number"||!u)&&(clearTimeout(Ha),Ha=null),Bg=ux(r);var f=()=>{var h=t.getState(),m=dc(h,h.tooltip.settings.shared);if(!Bg){hs=null,Ha=null;return}if(m==="axis"){var g=lx(h,Bg);(g==null?void 0:g.activeIndex)!=null?t.dispatch(fP({activeIndex:g.activeIndex,activeDataKey:void 0,activeCoordinate:g.activeCoordinate})):t.dispatch(dP())}hs=null,Ha=null};if(!u){f();return}o==="raf"?hs=requestAnimationFrame(f):typeof o=="number"&&Ha===null&&(Ha=setTimeout(f,o))}});function JQ(e,t){return t instanceof HTMLElement?"HTMLElement <".concat(t.tagName,' class="').concat(t.className,'">'):t===window?"global.window":e==="children"&&typeof t=="object"&&t!==null?"<>":t}var O2={accessibilityLayer:!0,barCategoryGap:"10%",barGap:4,barSize:void 0,className:void 0,maxBarSize:void 0,stackOffset:"none",syncId:void 0,syncMethod:"index",baseValue:void 0,reverseStackOrder:!1},CO=lr({name:"rootProps",initialState:O2,reducers:{updateOptions:(e,t)=>{var r;e.accessibilityLayer=t.payload.accessibilityLayer,e.barCategoryGap=t.payload.barCategoryGap,e.barGap=(r=t.payload.barGap)!==null&&r!==void 0?r:O2.barGap,e.barSize=t.payload.barSize,e.maxBarSize=t.payload.maxBarSize,e.stackOffset=t.payload.stackOffset,e.syncId=t.payload.syncId,e.syncMethod=t.payload.syncMethod,e.className=t.payload.className,e.baseValue=t.payload.baseValue,e.reverseStackOrder=t.payload.reverseStackOrder}}}),eY=CO.reducer,tY=CO.actions.updateOptions,rY=null,nY={updatePolarOptions:(e,t)=>e===null?t.payload:(e.startAngle=t.payload.startAngle,e.endAngle=t.payload.endAngle,e.cx=t.payload.cx,e.cy=t.payload.cy,e.innerRadius=t.payload.innerRadius,e.outerRadius=t.payload.outerRadius,e)},PO=lr({name:"polarOptions",initialState:rY,reducers:nY});PO.actions.updatePolarOptions;var iY=PO.reducer,OO=Hr("keyDown"),_O=Hr("focus"),MO=Hr("blur"),om=Zu(),ms=null,Wa=null,Gd=null;om.startListening({actionCreator:OO,effect:(e,t)=>{Gd=e.payload,ms!==null&&(cancelAnimationFrame(ms),ms=null);var r=t.getState(),n=r.eventSettings,a=n.throttleDelay,o=n.throttledEvents,c=o==="all"||o.includes("keydown");Wa!==null&&(typeof a!="number"||!c)&&(clearTimeout(Wa),Wa=null);var u=()=>{try{var f=t.getState(),h=f.rootProps.accessibilityLayer!==!1;if(!h)return;var m=f.tooltip.keyboardInteraction,g=Gd;if(g!=="ArrowRight"&&g!=="ArrowLeft"&&g!=="Enter")return;var v=xu(m,No(f),Xs(f),Zs(f)),b=v==null?-1:Number(v),j=!Number.isFinite(b)||b<0,k=_i(f),S=No(f),N=dc(f,f.tooltip.settings.shared);if(g==="Enter"){if(j)return;var E=Zf(f,N,"hover",String(m.index));t.dispatch(Xf({active:!m.active,activeIndex:m.index,activeCoordinate:E}));return}var A=_U(f),P=A==="left-to-right"?1:-1,_=g==="ArrowRight"?1:-1,O;if(j){var D=Xs(f),U=Zs(f),B=_*P,F=he=>({active:!1,index:String(he),dataKey:void 0,graphicalItemId:void 0,coordinate:void 0});if(O=-1,B>0){for(var Y=0;Y=0;H--)if(xu(F(H),S,D,U)!=null){O=H;break}if(O<0)return}else{O=b+_*P;var pe=(k==null?void 0:k.length)||S.length;if(pe===0||O>=pe||O<0)return}var ue=Zf(f,N,"hover",String(O));t.dispatch(Xf({active:!0,activeIndex:O.toString(),activeCoordinate:ue}))}finally{ms=null,Wa=null}};if(!c){u();return}a==="raf"?ms=requestAnimationFrame(u):typeof a=="number"&&Wa===null&&(u(),Gd=null,Wa=setTimeout(()=>{Gd?u():(Wa=null,ms=null)},a))}});om.startListening({actionCreator:_O,effect:(e,t)=>{var r=t.getState(),n=r.rootProps.accessibilityLayer!==!1;if(n){var a=r.tooltip.keyboardInteraction;if(!a.active&&a.index==null){var o="0",c=dc(r,r.tooltip.settings.shared),u=Zf(r,c,"hover",String(o));t.dispatch(Xf({active:!0,activeIndex:o,activeCoordinate:u}))}}}});om.startListening({actionCreator:MO,effect:(e,t)=>{var r=t.getState(),n=r.rootProps.accessibilityLayer!==!1;if(n){var a=r.tooltip.keyboardInteraction;a.active&&t.dispatch(Xf({active:!1,activeIndex:a.index,activeCoordinate:a.coordinate}))}}});function IO(e){e.persist();var t=e.currentTarget;return new Proxy(e,{get:(r,n)=>{if(n==="currentTarget")return t;var a=Reflect.get(r,n);return typeof a=="function"?a.bind(r):a}})}var Xr=Hr("externalEvent"),TO=Zu(),Vd=new Map,uu=new Map,Ug=new Map;TO.startListening({actionCreator:Xr,effect:(e,t)=>{var r=e.payload,n=r.handler,a=r.reactEvent;if(n!=null){var o=a.type,c=IO(a);Ug.set(o,{handler:n,reactEvent:c});var u=Vd.get(o);u!==void 0&&(cancelAnimationFrame(u),Vd.delete(o));var f=t.getState(),h=f.eventSettings,m=h.throttleDelay,g=h.throttledEvents,v=g,b=v==="all"||(v==null?void 0:v.includes(o)),j=uu.get(o);j!==void 0&&(typeof m!="number"||!b)&&(clearTimeout(j),uu.delete(o));var k=()=>{var E=Ug.get(o);try{if(!E)return;var A=E.handler,P=E.reactEvent,_=t.getState(),O={activeCoordinate:IH(_),activeDataKey:OH(_),activeIndex:Fu(_),activeLabel:NP(_),activeTooltipIndex:Fu(_),isTooltipActive:TH(_)};A&&A(O,P)}finally{Vd.delete(o),uu.delete(o),Ug.delete(o)}};if(!b){k();return}if(m==="raf"){var S=requestAnimationFrame(k);Vd.set(o,S)}else if(typeof m=="number"){if(!uu.has(o)){k();var N=setTimeout(k,m);uu.set(o,N)}}else k()}}});var aY=q([dl],e=>e.tooltipItemPayloads),oY=q([aY,(e,t)=>t,(e,t,r)=>r],(e,t,r)=>{if(t!=null){var n=e.find(o=>o.settings.graphicalItemId===r);if(n!=null){var a=n.getPosition;if(a!=null)return a(t)}}}),DO=Hr("touchMove"),RO=Zu(),Ka=null,ra=null,_2=null,cu=null;RO.startListening({actionCreator:DO,effect:(e,t)=>{var r=e.payload;if(!(r.touches==null||r.touches.length===0)){cu=IO(r);var n=t.getState(),a=n.eventSettings,o=a.throttleDelay,c=a.throttledEvents,u=c==="all"||c.includes("touchmove");Ka!==null&&(cancelAnimationFrame(Ka),Ka=null),ra!==null&&(typeof o!="number"||!u)&&(clearTimeout(ra),ra=null),_2=Array.from(r.touches).map(h=>ux({clientX:h.clientX,clientY:h.clientY,currentTarget:r.currentTarget}));var f=()=>{if(cu!=null){var h=t.getState(),m=dc(h,h.tooltip.settings.shared);if(m==="axis"){var g,v=(g=_2)===null||g===void 0?void 0:g[0];if(v==null){Ka=null,ra=null;return}var b=lx(h,v);(b==null?void 0:b.activeIndex)!=null&&t.dispatch(fP({activeIndex:b.activeIndex,activeDataKey:void 0,activeCoordinate:b.activeCoordinate}))}else if(m==="item"){var j,k=cu.touches[0];if(document.elementFromPoint==null||k==null)return;var S=document.elementFromPoint(k.clientX,k.clientY);if(!S||!S.getAttribute)return;var N=S.getAttribute(pz),E=(j=S.getAttribute(gz))!==null&&j!==void 0?j:void 0,A=Io(h).find(O=>O.id===E);if(N==null||A==null||E==null)return;var P=A.dataKey,_=oY(h,N,E);t.dispatch(FU({activeDataKey:P,activeIndex:N,activeCoordinate:_,activeGraphicalItemId:E}))}Ka=null,ra=null}};if(!u){f();return}o==="raf"?Ka=requestAnimationFrame(f):typeof o=="number"&&ra===null&&(f(),cu=null,ra=setTimeout(()=>{cu?f():(ra=null,Ka=null)},o))}}});var LO={throttleDelay:"raf",throttledEvents:["mousemove","touchmove","pointermove","scroll","wheel"]},$O=lr({name:"eventSettings",initialState:LO,reducers:{setEventSettings:(e,t)=>{t.payload.throttleDelay!=null&&(e.throttleDelay=t.payload.throttleDelay),t.payload.throttledEvents!=null&&(e.throttledEvents=t.payload.throttledEvents)}}}),sY=$O.actions.setEventSettings,lY=$O.reducer,uY=m5({brush:RV,cartesianAxis:AV,chartData:MW,errorBars:Wq,eventSettings:lY,graphicalItems:iV,layout:J$,legend:h6,options:AW,polarAxis:gG,polarOptions:iY,referenceElements:FV,renderedTicks:lq,rootProps:eY,tooltip:UU,zIndex:mW}),cY=function(t){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"Chart";return S$({reducer:uY,preloadedState:t,middleware:n=>{var a;return n({serializableCheck:!1,immutableCheck:!["commonjs","es6","production"].includes((a="es6")!==null&&a!==void 0?a:"")}).concat([EO.middleware,AO.middleware,om.middleware,TO.middleware,RO.middleware])},enhancers:n=>{var a=n;return typeof n=="function"&&(a=n()),a.concat(P5({type:"raf"}))},devTools:{serialize:{replacer:JQ},name:"recharts-".concat(r)}})};function dY(e){var t=e.preloadedState,r=e.children,n=e.reduxStoreName,a=Pr(),o=y.useRef(null);if(a)return r;o.current==null&&(o.current=cY(t,n));var c=$y;return y.createElement(P6,{context:c,store:o.current},r)}function fY(e){var t=e.layout,r=e.margin,n=Nt(),a=Pr();return y.useEffect(()=>{a||(n(Y$(t)),n(Q$(r)))},[n,a,t,r]),null}var hY=y.memo(fY,Fh);function mY(e){var t=Nt();return y.useEffect(()=>{t(tY(e))},[t,e]),null}var pY=e=>{var t=Nt();return y.useEffect(()=>{t(sY(e))},[t,e]),null},gY=y.memo(pY,Fh);function M2(e){var t=e.zIndex,r=e.isPanorama,n=y.useRef(null),a=Nt();return y.useLayoutEffect(()=>(n.current&&a(fW({zIndex:t,element:n.current,isPanorama:r})),()=>{a(hW({zIndex:t,isPanorama:r}))}),[a,t,r]),y.createElement("g",{tabIndex:-1,ref:n,className:"recharts-zIndex-layer_".concat(t)})}function I2(e){var t=e.children,r=e.isPanorama,n=Me(nW);if(!n||n.length===0)return t;var a=n.filter(c=>c<0),o=n.filter(c=>c>0);return y.createElement(y.Fragment,null,a.map(c=>y.createElement(M2,{key:c,zIndex:c,isPanorama:r})),t,o.map(c=>y.createElement(M2,{key:c,zIndex:c,isPanorama:r})))}var vY=["children"];function yY(e,t){if(e==null)return{};var r,n,a=xY(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n{var r=Z5(),n=J5(),a=uA();if(!Vn(r)||!Vn(n))return null;var o=e.children,c=e.otherAttributes,u=e.title,f=e.desc,h,m;return c!=null&&(typeof c.tabIndex=="number"?h=c.tabIndex:h=a?0:void 0,typeof c.role=="string"?m=c.role:m=a?"application":void 0),y.createElement(ME,ah({},c,{title:u,desc:f,role:m,tabIndex:h,width:r,height:n,style:bY,ref:t}),o)}),kY=e=>{var t=e.children,r=Me(Dh);if(!r)return null;var n=r.width,a=r.height,o=r.y,c=r.x;return y.createElement(ME,{width:n,height:a,x:c,y:o},t)},T2=y.forwardRef((e,t)=>{var r=e.children,n=yY(e,vY),a=Pr();return a?y.createElement(kY,null,y.createElement(I2,{isPanorama:!0},r)):y.createElement(wY,ah({ref:t},n),y.createElement(I2,{isPanorama:!1},r))});function jY(e,t){return AY(e)||EY(e,t)||NY(e,t)||SY()}function SY(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function NY(e,t){if(e){if(typeof e=="string")return D2(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?D2(e,t):void 0}}function D2(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{if(n!=null){var c=n.getBoundingClientRect(),u=c.width/n.offsetWidth;We(u)&&u!==o&&e(Z$(u))}},[n,e,o]),a}function R2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function PY(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);r(BW(),null);function sh(e){if(typeof e=="number")return e;if(typeof e=="string"){var t=parseFloat(e);if(!Number.isNaN(t))return t}return 0}var $Y=y.forwardRef((e,t)=>{var r,n,a=y.useRef(null),o=y.useState({containerWidth:sh((r=e.style)===null||r===void 0?void 0:r.width),containerHeight:sh((n=e.style)===null||n===void 0?void 0:n.height)}),c=oh(o,2),u=c[0],f=c[1],h=y.useCallback((g,v)=>{f(b=>{var j=Math.round(g),k=Math.round(v);return b.containerWidth===j&&b.containerHeight===k?b:{containerWidth:j,containerHeight:k}})},[]),m=y.useCallback(g=>{if(typeof t=="function"&&t(g),a.current!=null&&(a.current.disconnect(),a.current=null),g!=null&&typeof ResizeObserver<"u"){var v=g.getBoundingClientRect(),b=v.width,j=v.height;h(b,j);var k=N=>{var E=N[0];if(E!=null){var A=E.contentRect,P=A.width,_=A.height;h(P,_)}},S=new ResizeObserver(k);S.observe(g),a.current=S}},[t,h]);return y.useEffect(()=>()=>{var g=a.current;g!=null&&g.disconnect()},[h]),y.createElement(y.Fragment,null,y.createElement(ec,{width:u.containerWidth,height:u.containerHeight}),y.createElement("div",ka({ref:m},e)))}),zY=y.forwardRef((e,t)=>{var r=e.width,n=e.height,a=y.useState({containerWidth:sh(r),containerHeight:sh(n)}),o=oh(a,2),c=o[0],u=o[1],f=y.useCallback((m,g)=>{u(v=>{var b=Math.round(m),j=Math.round(g);return v.containerWidth===b&&v.containerHeight===j?v:{containerWidth:b,containerHeight:j}})},[]),h=y.useCallback(m=>{if(typeof t=="function"&&t(m),m!=null){var g=m.getBoundingClientRect(),v=g.width,b=g.height;f(v,b)}},[t,f]);return y.createElement(y.Fragment,null,y.createElement(ec,{width:c.containerWidth,height:c.containerHeight}),y.createElement("div",ka({ref:h},e)))}),FY=y.forwardRef((e,t)=>{var r=e.width,n=e.height;return y.createElement(y.Fragment,null,y.createElement(ec,{width:r,height:n}),y.createElement("div",ka({ref:t},e)))}),BY=y.forwardRef((e,t)=>{var r=e.width,n=e.height;return typeof r=="string"||typeof n=="string"?y.createElement(zY,ka({},e,{ref:t})):typeof r=="number"&&typeof n=="number"?y.createElement(FY,ka({},e,{width:r,height:n,ref:t})):y.createElement(y.Fragment,null,y.createElement(ec,{width:r,height:n}),y.createElement("div",ka({ref:t},e)))});function UY(e){return e?$Y:BY}var HY=y.forwardRef((e,t)=>{var r=e.children,n=e.className,a=e.height,o=e.onClick,c=e.onContextMenu,u=e.onDoubleClick,f=e.onMouseDown,h=e.onMouseEnter,m=e.onMouseLeave,g=e.onMouseMove,v=e.onMouseUp,b=e.onTouchEnd,j=e.onTouchMove,k=e.onTouchStart,S=e.style,N=e.width,E=e.responsive,A=e.dispatchTouchEvents,P=A===void 0?!0:A,_=y.useRef(null),O=Nt(),D=y.useState(null),U=oh(D,2),B=U[0],F=U[1],Y=y.useState(null),H=oh(Y,2),pe=H[0],ue=H[1],he=CY(),ae=Ky(),se=(ae==null?void 0:ae.width)>0?ae.width:N,X=(ae==null?void 0:ae.height)>0?ae.height:a,te=y.useCallback(Oe=>{he(Oe),typeof t=="function"&&t(Oe),F(Oe),ue(Oe),Oe!=null&&(_.current=Oe)},[he,t,F,ue]),J=y.useCallback(Oe=>{O(NO(Oe)),O(Xr({handler:o,reactEvent:Oe}))},[O,o]),I=y.useCallback(Oe=>{O(my(Oe)),O(Xr({handler:h,reactEvent:Oe}))},[O,h]),M=y.useCallback(Oe=>{O(dP()),O(Xr({handler:m,reactEvent:Oe}))},[O,m]),K=y.useCallback(Oe=>{O(my(Oe)),O(Xr({handler:g,reactEvent:Oe}))},[O,g]),ne=y.useCallback(()=>{O(_O())},[O]),Z=y.useCallback(()=>{O(MO())},[O]),me=y.useCallback(Oe=>{O(OO(Oe.key))},[O]),ge=y.useCallback(Oe=>{O(Xr({handler:c,reactEvent:Oe}))},[O,c]),Pe=y.useCallback(Oe=>{O(Xr({handler:u,reactEvent:Oe}))},[O,u]),re=y.useCallback(Oe=>{O(Xr({handler:f,reactEvent:Oe}))},[O,f]),xe=y.useCallback(Oe=>{O(Xr({handler:v,reactEvent:Oe}))},[O,v]),_e=y.useCallback(Oe=>{O(Xr({handler:k,reactEvent:Oe}))},[O,k]),ie=y.useCallback(Oe=>{P&&O(DO(Oe)),O(Xr({handler:j,reactEvent:Oe}))},[O,P,j]),Je=y.useCallback(Oe=>{O(Xr({handler:b,reactEvent:Oe}))},[O,b]),Fe=UY(E);return y.createElement(IP.Provider,{value:B},y.createElement(nR.Provider,{value:pe},y.createElement(Fe,{width:se??(S==null?void 0:S.width),height:X??(S==null?void 0:S.height),className:nt("recharts-wrapper",n),style:PY({position:"relative",cursor:"default",width:se,height:X},S),onClick:J,onContextMenu:ge,onDoubleClick:Pe,onFocus:ne,onBlur:Z,onKeyDown:me,onMouseDown:re,onMouseEnter:I,onMouseLeave:M,onMouseMove:K,onMouseUp:xe,onTouchEnd:Je,onTouchMove:ie,onTouchStart:_e,ref:te},y.createElement(LY,null),r)))}),WY=["width","height","responsive","children","className","style","compact","title","desc"];function KY(e,t){if(e==null)return{};var r,n,a=GY(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n{var r=e.width,n=e.height,a=e.responsive,o=e.children,c=e.className,u=e.style,f=e.compact,h=e.title,m=e.desc,g=KY(e,WY),v=kn(g);return f?y.createElement(y.Fragment,null,y.createElement(ec,{width:r,height:n}),y.createElement(T2,{otherAttributes:v,title:h,desc:m},o)):y.createElement(HY,{className:c,style:u,width:r,height:n,responsive:a??!1,onClick:e.onClick,onMouseLeave:e.onMouseLeave,onMouseEnter:e.onMouseEnter,onMouseMove:e.onMouseMove,onMouseDown:e.onMouseDown,onMouseUp:e.onMouseUp,onContextMenu:e.onContextMenu,onDoubleClick:e.onDoubleClick,onTouchStart:e.onTouchStart,onTouchMove:e.onTouchMove,onTouchEnd:e.onTouchEnd},y.createElement(T2,{otherAttributes:v,title:h,desc:m,ref:t},y.createElement(VV,null,o)))});function py(){return py=Object.assign?Object.assign.bind():function(e){for(var t=1;ty.createElement(eX,{chartName:"AreaChart",defaultTooltipEventType:"axis",validateTooltipEventTypes:tX,tooltipPayloadSearcher:NW,categoricalChartProps:e,ref:t}));const nX="rgba(130,130,150,0.14)",z2="rgba(130,130,150,0.85)";function iX(e){if(e<=0)return 10;const t=Math.pow(10,Math.floor(Math.log10(e))),r=e/t;return(r<=1?1:r<=2?2:r<=5?5:10)*t}function zO(e,t){return`${t==="%"?Math.round(e):e>=1e3?`${(e/1e3).toFixed(1)}k`:Math.round(e).toString()}${t}`}function aX({active:e,payload:t,unit:r}){return!e||!(t!=null&&t.length)?null:l.jsx("div",{className:"rounded-lg border border-border/70 bg-popover/95 px-3 py-2 shadow-xl backdrop-blur",children:l.jsx("div",{className:"space-y-1",children:t.map(n=>l.jsxs("div",{className:"flex items-center gap-2 text-[11px] font-mono",children:[l.jsx("span",{className:"h-2 w-2 rounded-full",style:{background:n.color}}),l.jsx("span",{className:"uppercase tracking-wider text-muted-foreground",children:n.name}),l.jsx("span",{className:"ml-auto pl-3 font-bold tabular-nums text-foreground",children:zO(n.value,r)})]},n.dataKey))})})}function FO({data:e,series:t,unit:r="%",yMode:n="percent",height:a=176}){const o=e.reduce((u,f)=>t.reduce((h,m)=>Math.max(h,Number(f[m.key])||0),u),0),c=n==="percent"?Math.min(100,Math.max(25,Math.ceil(o*1.2/25)*25)):Math.max(iX(o*1.15),10);return l.jsx("div",{style:{height:a},className:"w-full",children:l.jsx(Qz,{width:"100%",height:"100%",children:l.jsxs(rX,{data:e,margin:{top:8,right:6,bottom:0,left:-12},children:[l.jsx("defs",{children:t.map(u=>l.jsxs("linearGradient",{id:`grad-${u.key}`,x1:"0",y1:"0",x2:"0",y2:"1",children:[l.jsx("stop",{offset:"0%",stopColor:u.color,stopOpacity:.22}),l.jsx("stop",{offset:"100%",stopColor:u.color,stopOpacity:0})]},u.key))}),l.jsx(cO,{vertical:!1,stroke:nX}),l.jsx(jO,{dataKey:"t",hide:!0}),l.jsx(SO,{domain:[0,c],ticks:[0,c/2,c],tickFormatter:u=>zO(u,r),width:42,axisLine:!1,tickLine:!1,tick:{fontSize:10,fill:z2}}),l.jsx(eK,{content:l.jsx(aX,{unit:r}),cursor:{stroke:z2,strokeOpacity:.4,strokeDasharray:"3 3"}}),t.map(u=>l.jsx(wO,{type:"monotone",dataKey:u.key,name:u.label,stroke:u.color,strokeWidth:2,fill:`url(#grad-${u.key})`,dot:!1,activeDot:{r:3,strokeWidth:0},isAnimationActive:!1,connectNulls:!0},u.key))]})})})}const oX=[{key:"cpu",label:"CPU",color:"#2dd4bf"},{key:"ram",label:"RAM",color:"#38bdf8"},{key:"gpu",label:"GPU",color:"#a78bfa"},{key:"disk",label:"Disk",color:"#fbbf24"}];function BO(){var c,u,f,h;const{sys:e,hist:t}=KD(),r=!!(e!=null&&e.gpu&&e.gpu.busy_percent!=null&&e.gpu.gtt_used!=null&&e.gpu.gtt_total!=null),n=oX.filter(m=>m.key!=="gpu"||r),a={cpu:(c=e==null?void 0:e.cpu)==null?void 0:c.percent,ram:(u=e==null?void 0:e.ram)==null?void 0:u.percent,gpu:r?e.gpu.busy_percent:null,disk:(f=e==null?void 0:e.disk)==null?void 0:f.percent},o={cpu:(h=e==null?void 0:e.cpu)!=null&&h.cores?`${e.cpu.cores} Cores`:"",ram:e?`${aa(e.ram.used)}/${aa(e.ram.total)} GB`:"",gpu:r?`${aa(e.gpu.gtt_used)}/${aa(e.gpu.gtt_total)} GB`:"",disk:e!=null&&e.disk?`${aa(e.disk.used)}/${aa(e.disk.total)} GB`:""};return l.jsxs("div",{className:"flex flex-col justify-between rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"mb-3 flex items-center gap-2",children:[l.jsx(Hn,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"System-Status"}),l.jsxs("span",{className:"ml-1 inline-flex items-center gap-1 text-[10px] font-medium text-muted-foreground/70",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"})," live"]})]}),e?l.jsxs(l.Fragment,{children:[l.jsx("div",{className:"mb-2 grid grid-cols-2 gap-x-4 gap-y-1.5",children:n.map(m=>l.jsxs("div",{className:"flex min-w-0 items-center gap-1.5",children:[l.jsx("span",{className:"h-2 w-2 shrink-0 rounded-full",style:{background:m.color}}),l.jsx("span",{className:"shrink-0 text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:m.label}),l.jsxs("span",{className:"shrink-0 font-mono text-xs font-bold tabular-nums text-foreground",children:[Math.round(a[m.key]??0),"%"]}),o[m.key]&&l.jsx("span",{className:"truncate font-mono text-[10px] text-muted-foreground/60",children:o[m.key]})]},m.key))}),l.jsx(FO,{data:t,series:n,unit:"%",yMode:"percent",height:176})]}):l.jsx("div",{className:"flex h-44 items-center justify-center text-xs text-muted-foreground",children:"Lade Systemdaten…"})]}),(e==null?void 0:e.temp)&&(e.temp.cpu||e.temp.gpu)&&l.jsxs("div",{className:"mt-3 flex gap-4 border-t border-border/30 pt-3 font-mono text-xs text-muted-foreground/80",children:[e.temp.cpu!=null&&l.jsxs("span",{children:["CPU Temp: ",e.temp.cpu," °C"]}),e.temp.gpu!=null&&l.jsxs("span",{children:["GPU Temp: ",e.temp.gpu," °C"]})]})]})}function du({label:e,value:t,tone:r}){return l.jsxs("div",{className:ee("flex items-center justify-between rounded-lg border px-3 py-1.5 text-xs",r==="alert"?"border-amber-500/30 bg-amber-500/5 font-semibold text-amber-400":r==="accent"?"border-primary/30 bg-primary/5 font-semibold text-primary":"border-border/30 bg-background/25 text-muted-foreground"),children:[l.jsx("span",{className:"flex items-center gap-1.5",children:e}),l.jsx("span",{className:"font-mono text-[10px]",children:t})]})}function sX(){var r;const{data:e}=vh(3e3),t=()=>window.dispatchEvent(new CustomEvent("open-system-drawer",{detail:{tab:"maintenance"}}));return l.jsxs("div",{className:"flex flex-col justify-between rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15",children:[l.jsxs("div",{className:"space-y-4",children:[l.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-2 border-b border-border/20 pb-2",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(D4,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"Updates & Pflege"})]}),(e==null?void 0:e.last_check)&&l.jsxs("span",{className:"font-mono text-[9px] text-muted-foreground/80",children:["Zuletzt gesucht: ",new Date(e.last_check*1e3).toLocaleString("de-DE",{day:"2-digit",month:"2-digit",hour:"2-digit",minute:"2-digit"})]})]}),e?l.jsxs("div",{className:"space-y-1.5",children:[l.jsx(du,{label:"OS-Pakete",tone:e.os>0?"alert":"muted",value:e.os>0?`${e.os} verfügbar`:"aktuell"}),l.jsx(du,{label:"Inferenz-Engine (llama.cpp)",tone:e.engine>0?"alert":"muted",value:e.engine>0?"Update verfügbar":"aktuell"}),l.jsx(du,{label:"Router (llama-swap)",tone:e.swap>0?"alert":"muted",value:e.swap>0?"Update verfügbar":"aktuell"}),l.jsx(du,{label:"Modell-Upgrades",tone:e.models>0?"accent":"muted",value:e.models>0?`${e.models} verfügbar`:"aktuell"}),(r=e.components)==null?void 0:r.map(n=>l.jsx(du,{tone:n.update===!0?"alert":"muted",label:l.jsxs(l.Fragment,{children:[n.name,n.reachable===!1&&l.jsx("span",{className:"text-[8px] font-bold uppercase text-red-400/80",children:"offline"})]}),value:n.update===!0?`Update: ${n.latest}`:n.update===!1?"aktuell":n.latest?`neueste: ${n.latest}`:"—"},n.key))]}):l.jsx("div",{className:"flex h-24 items-center justify-center text-xs text-muted-foreground",children:"Lade Updates..."})]}),l.jsxs("button",{onClick:t,className:"mt-4 flex h-9 w-full items-center justify-center gap-1.5 rounded-lg bg-primary text-xs font-semibold text-primary-foreground shadow-md shadow-primary/10 transition-all hover:opacity-90 cursor-pointer",children:["Updates verwalten & Pflege ",l.jsx(ch,{className:"h-3.5 w-3.5"})]})]})}function UO({type:e,title:t,message:r,defaultValue:n,autoValue:a,autoLabel:o,onConfirm:c,onCancel:u}){const f=y.useRef(null);return l.jsx("div",{className:"fixed inset-0 z-[99] bg-black/60 backdrop-blur-sm flex items-center justify-center p-4 overscroll-contain",role:"dialog","aria-modal":"true","aria-label":t,children:l.jsxs("div",{className:"w-full max-w-sm rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[l.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary",children:t}),l.jsx("button",{onClick:u||(()=>c()),"aria-label":"Schließen",className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:l.jsx(Wn,{className:"h-4 w-4","aria-hidden":"true"})})]}),l.jsx("p",{className:"text-xs text-muted-foreground leading-relaxed",children:r}),e==="prompt"&&l.jsxs("div",{className:"flex gap-2",children:[l.jsx("input",{ref:f,type:"text",defaultValue:n,"aria-label":t,className:"flex-1 h-9 px-3 text-xs bg-background/40 border border-border/60 rounded-lg outline-none focus:border-primary transition-colors text-foreground",autoFocus:!0,onKeyDown:h=>{var m;h.key==="Enter"&&c((m=f.current)==null?void 0:m.value)}}),a!==void 0&&l.jsx("button",{type:"button",onClick:()=>{f.current&&(f.current.value=a)},title:"Setup-bewussten Optimalwert eintragen",className:"h-9 px-3 shrink-0 text-xs font-semibold text-primary border border-primary/50 bg-primary/10 hover:bg-primary/20 rounded-lg transition-colors cursor-pointer",children:o||"Auto"})]}),l.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[(e==="confirm"||e==="prompt")&&l.jsx("button",{onClick:u,className:"h-8 px-4 flex items-center justify-center text-xs font-semibold text-muted-foreground border border-border/60 bg-background/20 hover:bg-accent rounded-lg transition-colors cursor-pointer",children:"Abbrechen"}),l.jsx("button",{onClick:()=>{var m;const h=e==="prompt"?(m=f.current)==null?void 0:m.value:void 0;c(h)},className:"h-8 px-4 flex items-center justify-center text-xs font-semibold text-primary-foreground bg-primary hover:bg-primary/95 rounded-lg transition-colors cursor-pointer",children:e==="confirm"?"Ja, fortfahren":e==="prompt"?"Übernehmen":"OK"})]})]})})}function Aa(){const[e,t]=y.useState(null),r=y.useCallback(()=>t(null),[]),n=y.useCallback((u,f,h)=>{t({type:"alert",title:u,message:f,onConfirm:()=>{t(null),h==null||h()}})},[]),a=y.useCallback((u,f,h,m)=>{t({type:"confirm",title:u,message:f,onConfirm:()=>{t(null),h()},onCancel:()=>{t(null),m==null||m()}})},[]),o=y.useCallback((u,f,h,m,g,v)=>{t({type:"prompt",title:u,message:f,defaultValue:h,autoValue:v==null?void 0:v.autoValue,autoLabel:v==null?void 0:v.autoLabel,onConfirm:b=>{t(null),m(b)},onCancel:()=>{t(null),g==null||g()}})},[]),c=e?l.jsx(UO,{...e}):null;return{showAlert:n,showConfirm:a,showPrompt:o,close:r,dialogElement:c}}function lX(){const e=Yn(),{data:t}=Oy(3e3),{data:r}=Ni(),{showAlert:n,dialogElement:a}=Aa(),[o,c]=y.useState(!1),u=(r==null?void 0:r.models)??[];async function f(h){try{await Se("/api/agent/brain",{method:"POST",body:JSON.stringify({model:h})}),n("Erfolgreich",`Hermes-Gehirn wurde auf '${h}' geändert. Der Gateway-Dienst wurde neu gestartet.`),e.invalidateQueries({queryKey:Ve.agentStatus}),c(!1)}catch(m){n("Fehler",`Fehler beim Wechseln des Gehirns: ${m.message}`)}}return l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15 flex flex-col justify-between",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center justify-between mb-4",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(wn,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold tracking-wide uppercase text-foreground",children:"Hermes Agent"})]}),(t==null?void 0:t.terminal_url)&&l.jsxs("a",{href:Ks(t.terminal_url),target:"_blank",rel:"noopener",className:ee("flex items-center gap-1 px-3 py-1 rounded-lg text-xs font-medium transition-all",t.terminal_reachable?"bg-primary text-primary-foreground hover:opacity-90 shadow-md shadow-primary/20":"border border-border text-muted-foreground"),children:[l.jsx(Us,{className:"h-3 w-3"})," Terminal öffnen"]})]}),t?l.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[l.jsxs("div",{className:"p-3 bg-background/20 rounded-xl border border-border/40",children:[l.jsx("div",{className:"text-[10px] text-muted-foreground uppercase font-semibold",children:"Gateway"}),l.jsxs("div",{className:"flex items-center gap-2 mt-1",children:[l.jsx("span",{className:ee("h-2 w-2 rounded-full",t.gateway_reachable?"bg-emerald-500 animate-pulse":"bg-amber-500")}),l.jsx("span",{className:"text-xs font-medium",children:t.gateway_reachable?"Online":"Offline"})]})]}),l.jsxs("div",{className:"p-3 bg-background/20 rounded-xl border border-border/40",children:[l.jsx("div",{className:"text-[10px] text-muted-foreground uppercase font-semibold",children:"Terminal"}),l.jsxs("div",{className:"flex items-center gap-2 mt-1",children:[l.jsx("span",{className:ee("h-2 w-2 rounded-full",t.terminal_reachable?"bg-emerald-500 animate-pulse":"bg-amber-500")}),l.jsx("span",{className:"text-xs font-medium",children:t.terminal_reachable?"Online":"Offline"})]})]}),l.jsxs("div",{onClick:()=>c(!0),className:"p-3 bg-background/20 rounded-xl border border-border/40 hover:border-primary/45 hover:bg-background/30 transition-all duration-300 cursor-pointer",children:[l.jsxs("div",{className:"flex justify-between items-center",children:[l.jsx("span",{className:"text-[10px] text-muted-foreground uppercase font-semibold",children:"Gehirn"}),l.jsx(Hn,{className:"h-3 w-3 text-primary"})]}),l.jsxs("div",{className:"text-xs font-medium mt-1 font-mono text-primary truncate flex items-center gap-1",children:[l.jsx(ky,{className:"h-3 w-3 shrink-0"}),t.brain_model||"auto"]})]}),l.jsxs("div",{className:"p-3 bg-background/20 rounded-xl border border-border/40",children:[l.jsxs("div",{className:"flex justify-between items-center",children:[l.jsx("span",{className:"text-[10px] text-muted-foreground uppercase font-semibold",children:"Verdrahtung"}),l.jsx(Qu,{className:"h-3 w-3 text-primary"})]}),l.jsxs("div",{className:"text-[10px] font-mono mt-1 space-y-0.5 text-muted-foreground",children:[l.jsxs("div",{children:["Config: ",t.has_config?l.jsx("span",{className:"text-emerald-400",children:"✓"}):"—"]}),l.jsxs("div",{children:["Skills: ",t.has_skills?l.jsx("span",{className:"text-emerald-400",children:"✓"}):"—"]}),l.jsxs("div",{children:["Memory: ",t.has_memories?l.jsx("span",{className:"text-emerald-400",children:"✓"}):"—"]})]})]})]}):l.jsx("div",{className:"h-28 flex items-center justify-center text-xs text-muted-foreground",children:"Lade Agenten-Status…"})]}),t&&l.jsxs("div",{className:"mt-3 border-t border-border/30 pt-3 space-y-1.5",children:[l.jsxs("div",{className:"flex items-center justify-between text-[10px] text-muted-foreground",children:[l.jsx("span",{children:"Telegram"}),l.jsx("span",{className:ee("font-semibold",t.telegram_enabled?"text-emerald-400":""),children:t.telegram_enabled?"aktiv":"nicht konfiguriert"})]}),l.jsxs("div",{className:"flex items-center justify-between text-[10px] text-muted-foreground",children:[l.jsx("span",{children:"MCP-Server"}),l.jsxs("span",{className:"font-semibold text-foreground",children:[t.mcp_server_count??0," verbunden"]})]}),l.jsxs("div",{className:"flex items-center justify-between text-[10px] text-muted-foreground",children:[l.jsx("span",{children:"PC Executor"}),l.jsx("span",{className:ee("font-semibold",t.pc_executor_reachable?"text-emerald-400":""),children:t.pc_executor_reachable?"erreichbar":"nicht verbunden"})]})]}),t&&o&&l.jsx("div",{className:"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm flex items-center justify-center p-4",children:l.jsxs("div",{className:"w-full max-w-md rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[l.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[l.jsxs("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary flex items-center gap-1.5",children:[l.jsx(Hn,{className:"h-4 w-4"}),l.jsx("span",{children:"Hermes-Gehirn konfigurieren"})]}),l.jsx("button",{onClick:()=>c(!1),className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:l.jsx(Wn,{className:"h-4 w-4"})})]}),l.jsxs("p",{className:"text-xs text-muted-foreground leading-relaxed",children:['Das „Gehirn" ist das primäre LLM für Hermes. Wähle ein Modell aus deiner Bibliothek oder nutze ein Gateway-Alias (',l.jsx("code",{className:"text-primary font-semibold",children:"auto"})," / ",l.jsx("code",{className:"text-primary font-semibold",children:"fast"})," / ",l.jsx("code",{className:"text-primary font-semibold",children:"heavy"}),"):"]}),l.jsx("div",{className:"space-y-1.5 max-h-60 overflow-y-auto pr-1",children:["auto","fast","heavy",...u.map(h=>{var m;return((m=h.name.split("/").pop())==null?void 0:m.replace(".gguf",""))||h.name})].map(h=>{const m=["auto","fast","heavy"].includes(h);return l.jsxs("button",{onClick:()=>f(h),className:ee("w-full text-left px-3 py-2.5 rounded-lg text-xs hover:bg-accent flex items-center justify-between font-mono cursor-pointer border border-border/30",t.brain_model===h||!t.brain_model&&h==="auto"?"text-primary font-bold bg-primary/10 border-primary/30":"text-foreground bg-background/20"),children:[l.jsxs("div",{className:"flex flex-col text-left",children:[l.jsx("span",{className:"font-semibold truncate max-w-[280px]",children:h}),l.jsx("span",{className:"text-[9px] text-muted-foreground mt-0.5",children:m?"Gateway Routing Alias":"Installiertes GGUF Modell"})]}),(t.brain_model===h||!t.brain_model&&h==="auto")&&l.jsx(sr,{className:"h-4 w-4 shrink-0 text-primary"})]},h)})})]})}),a]})}function uX(){const e=Yn(),{data:t=[]}=vv({limit:3}),[r,n]=y.useState(""),[a,o]=y.useState("stable"),[c,u]=y.useState(!1);async function f(){if(!(!r.trim()||c)){u(!0);try{await Se("/api/memory",{method:"POST",body:JSON.stringify({content:r,category:a,source:"dashboard"})}),n(""),e.invalidateQueries({queryKey:["memory"]})}catch(h){console.error(h)}finally{u(!1)}}}return l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15 flex flex-col justify-between",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center gap-2 mb-4",children:[l.jsx(Ao,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold tracking-wide uppercase text-foreground",children:"Gedächtnis"})]}),l.jsxs("div",{className:"space-y-3",children:[l.jsx("textarea",{value:r,onChange:h=>n(h.target.value),"aria-label":"Fakt oder Regel im Gedächtnis speichern",placeholder:"Fakt / Regel im Pool speichern…",rows:2,className:"w-full resize-none rounded-xl border border-border/50 bg-background/30 p-2 text-[10px] outline-none focus:ring-1 focus:ring-primary transition-all leading-normal"}),l.jsxs("div",{className:"flex items-center gap-2 justify-between",children:[l.jsxs("select",{value:a,onChange:h=>o(h.target.value),"aria-label":"Kategorie",className:"h-7 rounded-lg border border-border/50 bg-background/50 px-2 text-[10px] outline-none cursor-pointer",children:[l.jsx("option",{value:"stable",children:"🔵 Fakt"}),l.jsx("option",{value:"instruction",children:"📋 Regel"}),l.jsx("option",{value:"user",children:"👤 User"}),l.jsx("option",{value:"versioned",children:"🟡 Version"})]}),l.jsxs("button",{onClick:f,disabled:!r.trim()||c,className:"flex h-7 items-center gap-1 rounded-lg bg-primary px-3 text-[10px] font-semibold text-primary-foreground hover:opacity-90 disabled:opacity-50 transition-all cursor-pointer",children:[l.jsx(df,{className:"h-3.5 w-3.5"})," Speichern"]})]})]}),l.jsxs("div",{className:"mt-3.5 space-y-1.5",children:[l.jsx("div",{className:"text-[9px] text-muted-foreground uppercase font-bold tracking-wider",children:"Zuletzt gespeichert:"}),l.jsx("div",{className:"max-h-20 overflow-y-auto space-y-1 pr-1 scrollbar-thin",children:t.length===0?l.jsx("div",{className:"text-[10px] text-muted-foreground/75 py-1",children:"Keine Einträge vorhanden."}):t.map(h=>l.jsxs("div",{className:"text-[10px] bg-background/10 border border-border/30 rounded p-1.5 flex items-start gap-1.5",children:[l.jsx("span",{className:"shrink-0 text-[8px] font-mono text-muted-foreground/80 px-1 py-0.5 rounded bg-muted/20",children:h.category}),l.jsx("span",{className:"truncate flex-1 text-muted-foreground hover:text-foreground transition-colors",title:h.content,children:h.content})]},h.id))})]})]}),l.jsx("div",{className:"mt-4 text-[10px] text-muted-foreground/80 border-t border-border/30 pt-3",children:"Steht allen Clients per MCP zur Verfügung."})]})}const F2=[{key:"prompt",label:"Prompt",color:"#f59e0b"},{key:"completion",label:"Antwort",color:"#2dd4bf"}];function HO(){const{data:e}=Py(3e3),t=HD(),r=t[t.length-1],n=r?Math.round(r.prompt+r.completion):0;return l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15",children:[l.jsxs("div",{className:"mb-3 flex items-start justify-between gap-3",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(uh,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"Token-Durchsatz"}),l.jsxs("span",{className:"ml-1 inline-flex items-center gap-1 text-[10px] font-medium text-muted-foreground/70",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"})," live"]})]}),e&&l.jsxs("div",{className:"mt-2 flex items-baseline gap-2",children:[l.jsx("span",{className:"font-space text-3xl font-bold tracking-tight text-foreground tabular-nums",children:n.toLocaleString("de-DE")}),l.jsx("span",{className:"text-xs text-muted-foreground",children:"tok/s aktuell"})]}),e&&l.jsxs("div",{className:"mt-0.5 space-y-0.5 font-mono text-[11px] text-muted-foreground/70",children:[l.jsxs("div",{children:[e.total_tokens.toLocaleString("de-DE")," Tokens gesamt · ",l.jsxs("span",{className:"text-emerald-400/90",children:[e.saved_eur.toLocaleString("de-DE",{minimumFractionDigits:2})," € gespart"]})]}),l.jsxs("div",{className:"text-muted-foreground/55",children:["Input ",e.prompt_tokens.toLocaleString("de-DE")," · Output ",e.completion_tokens.toLocaleString("de-DE")]})]})]}),l.jsx("div",{className:"flex shrink-0 flex-col items-end gap-1.5 pt-1",children:F2.map(a=>l.jsxs("div",{className:"flex items-center gap-1.5",children:[l.jsx("span",{className:"h-2 w-2 rounded-full",style:{background:a.color}}),l.jsx("span",{className:"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:a.label}),l.jsx("span",{className:"font-mono text-xs font-bold tabular-nums text-foreground",children:Math.round((r==null?void 0:r[a.key])??0)})]},a.key))})]}),e?l.jsx(FO,{data:t,series:F2,unit:" tok/s",yMode:"auto",height:150}):l.jsx("div",{className:"flex h-[150px] items-center justify-center text-xs text-muted-foreground",children:"Lade Durchsatz…"}),l.jsx("div",{className:"mt-2 border-t border-border/30 pt-2 text-[10px] text-muted-foreground/70",children:"Durchsatz aus dem Gateway abgeleitet (Prefill vs. Generierung). Flach bei Leerlauf."})]})}function cX(){const{data:e}=NE(3e3),{showAlert:t,dialogElement:r}=Aa(),[n,a]=y.useState({});async function o(c){a(u=>({...u,[c]:!0}));try{const u=await Se("/api/maintenance/restart",{method:"POST",body:JSON.stringify({service:c})});u.ok||t("Fehler",`Neustart fehlgeschlagen: ${u.err||"Unbekannt"}`)}catch(u){t("Fehler",`Fehler: ${u.message}`)}finally{a(u=>({...u,[c]:!1}))}}return l.jsxs("div",{className:"flex flex-col rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15",children:[l.jsxs("div",{className:"mb-3 flex items-center justify-between",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(ff,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"Dienste"})]}),l.jsx("button",{onClick:()=>window.dispatchEvent(new CustomEvent("open-system-drawer",{detail:{tab:"logs"}})),className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground transition-colors hover:text-primary cursor-pointer",children:"Logs / Pflege"})]}),e?l.jsxs("div",{className:"flex flex-1 flex-col",children:[l.jsx("div",{className:"space-y-1.5",children:e.services.map(c=>l.jsxs("div",{className:"group flex items-center justify-between gap-2 rounded-xl border border-border/30 bg-background/20 p-2.5",children:[l.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[l.jsx("span",{className:ee("h-2.5 w-2.5 shrink-0 rounded-full ring-2 ring-black/40",c.ok?"bg-emerald-500":"bg-amber-500")}),l.jsxs("div",{className:"min-w-0",children:[l.jsx("div",{className:"truncate text-xs font-bold text-foreground",children:c.name}),l.jsx("div",{className:"truncate font-mono text-[9px] text-muted-foreground/60",children:c.url})]})]}),l.jsx("button",{onClick:()=>o(c.name),disabled:n[c.name],className:"flex h-7 w-7 shrink-0 items-center justify-center rounded-lg border border-border/40 text-muted-foreground opacity-0 transition-all hover:bg-primary/5 hover:text-primary group-hover:opacity-100",title:"Dienst neu starten",children:l.jsx(Xa,{className:ee("h-3.5 w-3.5",n[c.name]&&"animate-spin")})})]},c.name))}),l.jsxs("div",{className:"mt-auto flex flex-wrap gap-3 border-t border-border/20 pt-2.5 text-[10px] font-semibold text-muted-foreground",children:[l.jsxs("a",{href:Ks(e.links.engine_ui),target:"_blank",rel:"noopener",className:"flex items-center gap-1 rounded px-1.5 py-0.5 text-primary transition-colors hover:bg-primary/10",children:[l.jsx(Us,{className:"h-3 w-3"})," Engine"]}),l.jsxs("a",{href:Ks(e.links.gateway),target:"_blank",rel:"noopener",className:"flex items-center gap-1 rounded px-1.5 py-0.5 text-primary transition-colors hover:bg-primary/10",children:[l.jsx(Us,{className:"h-3 w-3"})," Gateway"]})]})]}):l.jsx("div",{className:"flex h-24 items-center justify-center text-xs text-muted-foreground",children:"Lade Dienste…"}),r]})}const Hg=[{key:"stt",label:"STT",hint:"Sprache → Text"},{key:"vision",label:"Bildschirm-Sicht",hint:"Vision-Beschreibung"},{key:"chat_ttfb",label:"Chat-TTFB",hint:"Zeit bis 1. Token"},{key:"tts",label:"TTS",hint:"Text → Sprache"}];function qd(e){return e==null?"—":e>=1e3?`${(e/1e3).toFixed(2)} s`:`${Math.round(e)} ms`}function dX({stat:e,label:t,hint:r,maxP95:n}){const a=!!e&&e.count>0,o=a&&e.p95_ms&&n>0?Math.max(4,Math.min(100,e.p95_ms/n*100)):0;return l.jsxs("div",{className:"space-y-1.5",children:[l.jsxs("div",{className:"flex items-baseline justify-between gap-2",children:[l.jsxs("div",{className:"flex items-baseline gap-2 min-w-0",children:[l.jsx("span",{className:"text-xs font-semibold text-foreground",children:t}),l.jsx("span",{className:"truncate text-[10px] text-muted-foreground/60",children:r})]}),a?l.jsx("span",{className:"shrink-0 font-mono text-sm font-bold tabular-nums text-foreground",children:qd(e.p50_ms)}):l.jsx("span",{className:"shrink-0 text-[10px] italic text-muted-foreground/50",children:"noch keine Messungen"})]}),l.jsx("div",{className:"h-1.5 w-full overflow-hidden rounded-full bg-background/50 border border-border/30",children:l.jsx("div",{className:"h-full rounded-full bg-gradient-to-r from-teal-500 to-indigo-500 transition-all duration-500",style:{width:`${o}%`}})}),a&&l.jsxs("div",{className:"flex items-center gap-3 font-mono text-[10px] text-muted-foreground/65",children:[l.jsxs("span",{children:["p50 ",qd(e.p50_ms)]}),l.jsxs("span",{children:["p95 ",qd(e.p95_ms)]}),l.jsxs("span",{children:["zuletzt ",qd(e.last_ms)]}),l.jsxs("span",{className:"text-muted-foreground/45",children:["· n=",e.count]})]})]})}function WO(){const{data:e}=ID(5e3),t=Math.max(1,...Hg.map(n=>{var a;return((a=e==null?void 0:e[n.key])==null?void 0:a.p95_ms)??0})),r=Hg.some(n=>{var a;return(((a=e==null?void 0:e[n.key])==null?void 0:a.count)??0)>0});return l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15",children:[l.jsxs("div",{className:"mb-4 flex items-center gap-2",children:[l.jsx(_N,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"Sprach-Latenz"}),l.jsxs("span",{className:"ml-1 inline-flex items-center gap-1 text-[10px] font-medium text-muted-foreground/70",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"})," live"]})]}),l.jsx("div",{className:"grid gap-4 sm:grid-cols-2",children:Hg.map(n=>l.jsx(dX,{stat:e==null?void 0:e[n.key],label:n.label,hint:n.hint,maxP95:t},n.key))}),l.jsx("div",{className:"mt-4 border-t border-border/30 pt-2 text-[10px] text-muted-foreground/70",children:r?"Server-seitige Dauer je Pipeline-Stufe (p50 prominent). Rollender Schnitt über die letzten Turns; Reset bei Neustart.":"Noch keine Voice-Turns gemessen — sprich einmal über den „Sprechen“-Tab, dann erscheinen hier STT/Vision/Chat/TTS."})]})}const KO=[{role:"hermes",label:"Lucys Hirn",short:"Hirn",icon:Ao,desc:"Lucys Alltags-Verstand — denkt und redet mit dir. Immer bereit.",tone:"bg-indigo-500/15 text-indigo-400 border-indigo-500/25",protected:!0},{role:"embed",label:"Lucys Gedächtnis",short:"Gedächtnis",icon:CN,desc:"Merkt sich Wichtiges und findet es später wieder.",tone:"bg-emerald-500/15 text-emerald-400 border-emerald-500/25",protected:!0},{role:"vision",label:"Lucys Augen",short:"Augen",icon:uf,desc:"Sieht Bilder und Screenshots und beschreibt, was drauf ist.",tone:"bg-pink-500/15 text-pink-400 border-pink-500/25"},{role:"heavy",label:"Großes Hirn",short:"Groß",icon:Y3,desc:"Das schwere Geschütz — wird für besonders knifflige Fragen dazugeholt.",tone:"bg-amber-500/15 text-amber-400 border-amber-500/25"},{role:"coder-lite",label:"Programmierer (schnell)",short:"Code schnell",icon:Fs,desc:"Schnelles Programmieren im Alltag.",tone:"bg-violet-500/15 text-violet-400 border-violet-500/25"},{role:"coder",label:"Programmierer (gründlich)",short:"Code gründlich",icon:Fs,desc:"Schreibt und prüft Code besonders sorgfältig — für schwere Coding-Aufgaben.",tone:"bg-fuchsia-500/15 text-fuchsia-400 border-fuchsia-500/25"},{role:"scout",label:"Späher",short:"Späher",icon:B4,desc:"Schneller erster Blick und grobe Einschätzung.",tone:"bg-teal-500/15 text-teal-400 border-teal-500/25"}],GO=KO.map(e=>e.role),B2=Object.fromEntries(KO.map(e=>[e.role,e])),U2=e=>({role:e||"?",label:e||"unbekannt",short:e||"?",icon:Ao,desc:"Rolle ohne hinterlegten Klartext-Namen.",tone:"bg-slate-500/15 text-slate-300 border-slate-500/25"}),fX={fast:"hermes",coder_lite:"coder-lite"};function mr(e){return e&&(B2[e]||B2[fX[e]])||U2(e)}function io({role:e,dense:t=!1,className:r}){const n=mr(e),a=n.icon;return l.jsxs("span",{className:ee("inline-flex items-center gap-1 rounded px-1.5 py-0.5 text-[10px] font-semibold border tracking-wide",n.tone,r),title:`${n.desc} (${n.role})`,children:[l.jsx(a,{className:"h-3 w-3 shrink-0","aria-hidden":"true"}),t?n.short:n.label]})}function hX({fit:e}){const t={perfect:"bg-emerald-500/15 text-emerald-400 border border-emerald-500/20",marginal:"bg-amber-500/15 text-amber-400 border border-amber-500/20",too_tight:"bg-red-500/15 text-red-400 border border-red-500/20"}[e.level];return l.jsxs("span",{className:ee("rounded px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wider font-mono",t),children:[e.text," • ",e.req_gb," GB RAM"]})}function H2(e){const t=e.toLowerCase();return t.includes("qwen")?{name:"Qwen",color:"bg-purple-500/20 text-purple-300 border-purple-500/30",initial:"Q"}:t.includes("gemma")?{name:"Gemma",color:"bg-blue-500/20 text-blue-300 border-blue-500/30",initial:"G"}:t.includes("llama")?{name:"Llama",color:"bg-red-500/20 text-red-300 border-red-500/30",initial:"🦙"}:t.includes("mistral")||t.includes("mixtral")?{name:"Mistral",color:"bg-orange-500/20 text-orange-300 border-orange-500/30",initial:"M"}:t.includes("deepseek")?{name:"DeepSeek",color:"bg-cyan-500/20 text-cyan-300 border-cyan-500/30",initial:"D"}:t.includes("hermes")||t.includes("nous")?{name:"Hermes",color:"bg-amber-500/20 text-amber-300 border-amber-500/30",initial:"H"}:t.includes("phi")?{name:"Phi",color:"bg-emerald-500/20 text-emerald-300 border-emerald-500/30",initial:"Φ"}:{name:"Other",color:"bg-slate-500/20 text-slate-300 border-slate-500/30",initial:"AI"}}function mX(){var b,j,k;const{data:e}=Ni(2e3),{data:t}=Py(2e3),{data:r}=Po(),n=(e==null?void 0:e.models)??[],a=(e==null?void 0:e.running)??[],o=((b=r==null?void 0:r.gpu)==null?void 0:b.gtt_total)||((j=r==null?void 0:r.gpu)==null?void 0:j.vram_total)||0,c=((k=r==null?void 0:r.gpu)==null?void 0:k.gtt_used)||0,u=o>0?Math.min(100,c/o*100):0,f=u>=88?"bg-red-500":u>=70?"bg-amber-500":"bg-teal-500",h=u>=88?"text-red-400":u>=70?"text-amber-400":"text-foreground",m=y.useRef(null),[g,v]=y.useState(!1);return y.useEffect(()=>{if(!t)return;const S=t.total_tokens;if(m.current!==null&&S>m.current){v(!0);const N=setTimeout(()=>v(!1),4e3);return m.current=S,()=>clearTimeout(N)}m.current=S},[t==null?void 0:t.total_tokens]),l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15 flex flex-col",children:[l.jsxs("div",{className:"flex items-center justify-between mb-4",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(lf,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold tracking-wide uppercase text-foreground",children:"Modelle"})]}),l.jsxs("span",{className:ee("flex items-center gap-1.5 text-[10px] font-bold uppercase tracking-wider font-mono px-2 py-0.5 rounded-full border transition-colors",g?"bg-emerald-500/10 text-emerald-400 border-emerald-500/30":"bg-background/30 text-muted-foreground/70 border-border/40"),children:[g?l.jsx(xa,{className:"h-3 w-3 animate-pulse"}):l.jsx(N4,{className:"h-3 w-3"}),g?"Inferenz aktiv":"Idle"]})]}),o>0&&l.jsxs("div",{className:"mb-4",children:[l.jsxs("div",{className:"flex items-center justify-between text-[10px] font-mono text-muted-foreground/80 mb-1",children:[l.jsx("span",{className:"uppercase tracking-wider font-semibold",children:"Speicher-Pool"}),l.jsxs("span",{children:[l.jsx("span",{className:ee("font-bold",h),children:aa(c)})," / ",aa(o)," GB belegt"]})]}),l.jsx("div",{className:"h-1.5 w-full rounded-full bg-background/50 border border-border/30 overflow-hidden",children:l.jsx("div",{className:ee("h-full rounded-full transition-all duration-500",f),style:{width:`${u}%`}})})]}),l.jsx("div",{className:"space-y-2 flex-1",children:GO.map(S=>{var A;const N=n.find(P=>P.role===S),E=N?a.includes(N.name):!1;return l.jsxs("div",{className:ee("flex items-center justify-between gap-2 p-2 rounded-xl border transition-all duration-300",E?"border-emerald-500/30 bg-emerald-500/5 shadow-sm shadow-emerald-500/5":N?"border-primary/20 bg-primary/5":"border-border/30 bg-background/10 opacity-60"),children:[l.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[l.jsx(io,{role:S,className:"shrink-0"}),l.jsxs("div",{className:"flex flex-col min-w-0",children:[l.jsx("span",{className:"text-xs font-semibold truncate font-mono text-foreground",children:N?(A=N.name.split("/").pop())==null?void 0:A.replace(/\.gguf$/i,""):"nicht zugewiesen"}),N&&l.jsxs("div",{className:"flex gap-1 items-center mt-0.5 flex-wrap text-muted-foreground/70",children:[l.jsx("span",{className:"text-[9px] font-mono",children:Lr(N.size_bytes)}),N.prompt_cache&&l.jsx("span",{className:"text-[7px] leading-none font-mono font-bold bg-cyan-500/10 text-cyan-400 border border-cyan-500/20 px-1 py-0.5 rounded",title:"Prompt Caching aktiv",children:"PC"}),N.spec_active&&l.jsx("span",{className:"text-[7px] leading-none font-mono font-bold bg-emerald-500/10 text-emerald-400 border border-emerald-500/20 px-1 py-0.5 rounded",title:`Speculative Decoding aktiv (Draft: ${N.spec_draft_model})`,children:"SPEC"}),N.parallel_slots>1&&l.jsxs("span",{className:"text-[7px] leading-none font-mono font-bold bg-violet-500/10 text-violet-400 border border-violet-500/20 px-1 py-0.5 rounded",title:`${N.parallel_slots} parallele Slots aktiv`,children:["SLOTS: ",N.parallel_slots]}),N.incomplete&&l.jsx("span",{className:"text-[7px] leading-none font-mono font-bold bg-amber-500/10 text-amber-400 border border-amber-500/20 px-1 py-0.5 rounded",title:"GGUF-Datei fehlt",children:"⚠ fehlt"})]})]})]}),l.jsx("span",{className:"shrink-0",children:N?E?l.jsxs("span",{className:"flex items-center gap-1 text-[8px] font-semibold text-emerald-400 uppercase tracking-wider font-mono",children:[l.jsx("span",{className:ee("h-1.5 w-1.5 rounded-full bg-emerald-500",g&&"animate-pulse")})," warm"]}):l.jsx("span",{className:"text-[8px] font-semibold text-muted-foreground uppercase tracking-wider font-mono",children:"bereit"}):l.jsx("span",{className:"text-[8px] font-semibold text-muted-foreground/60 uppercase tracking-wider font-mono",children:"—"})})]},S)})}),l.jsx("div",{className:"mt-4 text-[10px] text-muted-foreground/80 border-t border-border/30 pt-3",children:"Laden erfolgt automatisch per Auto-Swap. Details & Routing im Modell-Manager."})]})}function pX(){var P,_,O,D,U,B;const{data:e}=Cy(),{data:t}=NE(),{data:r}=Ni(),{data:n}=Po(),a=!!e&&!!t,o=F=>{var Y;return(Y=t==null?void 0:t.services.find(H=>H.name.toLowerCase().includes(F)))==null?void 0:Y.ok},c=e==null?void 0:e.engine_reachable,u=(P=e==null?void 0:e.brain)==null?void 0:P.ready,f=((_=e==null?void 0:e.brain)==null?void 0:_.model)||((O=r==null?void 0:r.models.find(F=>F.role==="hermes"))==null?void 0:O.name)||"",h=[];h.push((()=>{const F={id:"brain",label:"Lucys Hirn",icon:Ao,critical:!0};return a?c===!1?{...F,status:"down",detail:"Die Motor-Maschine (Engine) läuft nicht — Lucy kann gerade gar nicht denken.",repair:{kind:"restart",service:"llama-swap",label:"Motor neu starten",needsSudo:!0}}:u===!1?{...F,status:"down",detail:"Lucys Hirn ist gerade eingeschlafen — einmal aufwecken.",repair:f?{kind:"loadModel",model:f,label:"Hirn aufwecken"}:void 0}:{...F,status:"ok",detail:"Wach und ansprechbar."}:{...F,status:"loading",detail:"Wird geprüft …"}})()),h.push((()=>{const F={id:"memory",label:"Lucys Gedächtnis",icon:CN,critical:!0},Y=o("mem0");return!a||Y===void 0?{...F,status:"loading",detail:"Wird geprüft …"}:Y?{...F,status:"ok",detail:"Merkt sich Neues und findet Altes wieder."}:{...F,status:"down",detail:"Lucy kann sich gerade nichts merken — das Gedächtnis antwortet nicht.",repair:{kind:"restart",service:"mem0-service",label:"Gedächtnis neu starten"}}})()),h.push((()=>{const F={id:"gateway",label:"Verbindung (Gateway)",icon:cf,critical:!0},Y=e?e.gateway_reachable:o("integriert");return!a||Y===void 0?{...F,status:"loading",detail:"Wird geprüft …"}:Y?{...F,status:"ok",detail:"Apps und IDEs können Lucy erreichen."}:{...F,status:"down",detail:"Die Verbindungs-Zentrale antwortet nicht — Apps erreichen Lucy nicht.",repair:{kind:"restart",service:"mission-control-2",label:"Zentrale neu starten"}}})()),h.push((()=>{const F={id:"agent",label:"Lucys Agent (Hermes)",icon:wn,critical:!0},Y=o("hermes-gateway");return!a||Y===void 0?{...F,status:"loading",detail:"Wird geprüft …"}:Y?{...F,status:"ok",detail:"Lucy ist bereit zu reden und zu handeln."}:{...F,status:"down",detail:"Lucys Agent ist offline — sie reagiert gerade nicht.",repair:{kind:"restart",service:"hermes-gateway",label:"Agent neu starten"}}})()),h.push((()=>{const F={id:"voice",label:"Lucys Stimme",icon:S4,critical:!1},Y=o("voice");return!a||Y===void 0?{...F,status:"loading",detail:"Wird geprüft …"}:Y?{...F,status:"ok",detail:"Lucy kann hören und sprechen."}:{...F,status:"warn",detail:"Sprechen ist gerade aus — Tippen geht weiter normal.",repair:{kind:"restart",service:"voice-service",label:"Stimme neu starten"}}})());const m=((D=n==null?void 0:n.gpu)==null?void 0:D.gtt_total)||((U=n==null?void 0:n.gpu)==null?void 0:U.vram_total)||0,g=((B=n==null?void 0:n.gpu)==null?void 0:B.gtt_used)||0,v=m>0?Math.min(100,g/m*100):0,b=1024**3,j=m?v>=90?{status:"full",usedGb:g/b,totalGb:m/b,pct:v,text:"Speicher fast voll — Lucy könnte langsamer werden."}:v>=72?{status:"warn",usedGb:g/b,totalGb:m/b,pct:v,text:"Speicher gut gefüllt — noch okay."}:{status:"ok",usedGb:g/b,totalGb:m/b,pct:v,text:"Genug Speicher frei."}:{status:"unknown",usedGb:0,totalGb:0,pct:0,text:"Speicher-Auslastung unbekannt."},k=h.some(F=>F.status==="loading"),S=h.filter(F=>F.critical&&F.status==="down"),N=h.filter(F=>F.status==="warn"||!F.critical&&F.status==="down"),E=j.status==="full";return{verdict:k&&!S.length?"loading":S.length?"problem":N.length||E?"warn":"gut",checks:h,memory:j,problems:S}}const gX={ok:"bg-emerald-500",warn:"bg-amber-500",down:"bg-red-500",loading:"bg-muted-foreground/40"};function VO({frame:e="lucy"}={}){const{verdict:t,checks:r,memory:n,problems:a}=pX(),{showAlert:o,dialogElement:c}=Aa(),u=Yn(),[f,h]=y.useState({});async function m(S,N){h(E=>({...E,[S]:!0}));try{if(N.kind==="loadModel")await Se(`/api/models/${encodeURIComponent(N.model)}/load`,{method:"POST"});else{const E=await Se("/api/maintenance/restart",{method:"POST",body:JSON.stringify({service:N.service})});E.ok||o("Reparatur nicht ganz geklappt",(E.err||"Unbekannter Fehler")+(N.needsSudo?` + `).concat(P.x,",").concat(P.y),O=Yt(e.id)?Au("recharts-radial-line-"):e.id;return y.createElement("text",hi({},n,{dominantBaseline:"central",className:nt("recharts-radial-bar-label",c)}),y.createElement("defs",null,y.createElement("path",{id:O,d:_})),y.createElement("textPath",{xlinkHref:"#".concat(O)},r))},rG=(e,t,r)=>{var n=e.cx,a=e.cy,o=e.innerRadius,c=e.outerRadius,u=e.startAngle,f=e.endAngle,h=(u+f)/2;if(r==="outside"){var m=Qt(n,a,c+t,h),g=m.x,v=m.y;return{x:g,y:v,textAnchor:g>=n?"start":"end",verticalAnchor:"middle"}}if(r==="center")return{x:n,y:a,textAnchor:"middle",verticalAnchor:"middle"};if(r==="centerTop")return{x:n,y:a,textAnchor:"middle",verticalAnchor:"start"};if(r==="centerBottom")return{x:n,y:a,textAnchor:"middle",verticalAnchor:"end"};var b=(o+c)/2,j=Qt(n,a,b,h),k=j.x,S=j.y;return{x:k,y:S,textAnchor:"middle",verticalAnchor:"middle"}},nf=e=>e!=null&&"cx"in e&&Ee(e.cx),nG={angle:0,offset:5,zIndex:pr.label,position:"middle",textBreakAll:!1};function iG(e){if(!nf(e))return e;var t=e.cx,r=e.cy,n=e.outerRadius,a=n*2;return{x:t-n,y:r-n,width:a,upperWidth:a,lowerWidth:a,height:a}}function sa(e){var t=on(e,nG),r=t.viewBox,n=t.parentViewBox,a=t.position,o=t.value,c=t.children,u=t.content,f=t.className,h=f===void 0?"":f,m=t.textBreakAll,g=t.labelRef,v=ZK(),b=GP(),j=a==="center"?b:v??b,k,S,N;r==null?k=j:nf(r)?k=r:k=Vy(r);var E=iG(k);if(!k||Yt(o)&&Yt(c)&&!y.isValidElement(u)&&typeof u!="function")return null;var A=vu(vu({},t),{},{viewBox:k});if(y.isValidElement(u)){A.labelRef;var P=n2(A,WK);return y.cloneElement(u,P)}if(typeof u=="function"){A.content;var _=n2(A,KK);if(S=y.createElement(u,_),y.isValidElement(S))return S}else S=JK(t);var O=rn(t);if(nf(k)){if(a==="insideStart"||a==="insideEnd"||a==="end")return tG(t,a,S,O,k);N=rG(k,t.offset,t.position)}else{if(!E)return null;var D=HK({viewBox:E,position:a,offset:t.offset,parentViewBox:nf(n)?void 0:n});N=vu(vu({x:D.x,y:D.y,textAnchor:D.horizontalAnchor,verticalAnchor:D.verticalAnchor},D.width!==void 0?{width:D.width}:{}),D.height!==void 0?{height:D.height}:{})}return y.createElement(Mi,{zIndex:t.zIndex},y.createElement(J0,hi({ref:g,className:nt("recharts-label",h)},O,N,{textAnchor:BP(O.textAnchor)?O.textAnchor:N.textAnchor,breakAll:m}),S))}sa.displayName="Label";var aG=(e,t,r)=>{if(!e)return null;var n={viewBox:t,labelRef:r};return e===!0?y.createElement(sa,hi({key:"label-implicit"},n)):Gn(e)?y.createElement(sa,hi({key:"label-implicit",value:e},n)):y.isValidElement(e)?e.type===sa?y.cloneElement(e,vu({key:"label-implicit"},n)):y.createElement(sa,hi({key:"label-implicit",content:e},n)):ex(e)?y.createElement(sa,hi({key:"label-implicit",content:e},n)):e&&typeof e=="object"?y.createElement(sa,hi({},e,{key:"label-implicit"},n)):null};function oG(e){var t=e.label,r=e.labelRef,n=GP();return aG(t,n,r)||null}var sG=["valueAccessor"],lG=["dataKey","clockWise","id","textBreakAll","zIndex"];function eh(){return eh=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var t=Array.isArray(e.value)?e.value[e.value.length-1]:e.value;if(DK(t))return t},VP=y.createContext(void 0),dG=VP.Provider,qP=y.createContext(void 0);qP.Provider;function fG(){return y.useContext(VP)}function hG(){return y.useContext(qP)}function af(e){var t=e.valueAccessor,r=t===void 0?cG:t,n=a2(e,sG),a=n.dataKey;n.clockWise;var o=n.id,c=n.textBreakAll,u=n.zIndex,f=a2(n,lG),h=fG(),m=hG(),g=h||m;return!g||!g.length?null:y.createElement(Mi,{zIndex:u??pr.label},y.createElement(nn,{className:"recharts-label-list"},g.map((v,b)=>{var j,k=Yt(a)?r(v,b):Lt(v.payload,a),S=Yt(o)?{}:{id:"".concat(o,"-").concat(b)};return y.createElement(sa,eh({key:"label-".concat(b)},rn(v),f,S,{fill:(j=n.fill)!==null&&j!==void 0?j:v.fill,parentViewBox:v.parentViewBox,value:k,textBreakAll:c,viewBox:v.viewBox,index:b,zIndex:0}))})))}af.displayName="LabelList";function mG(e){var t=e.label;return t?t===!0?y.createElement(af,{key:"labelList-implicit"}):y.isValidElement(t)||ex(t)?y.createElement(af,{key:"labelList-implicit",content:t}):typeof t=="object"?y.createElement(af,eh({key:"labelList-implicit"},t,{type:String(t.type)})):null:null}function ly(){return ly=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var t=e.cx,r=e.cy,n=e.r,a=e.className,o=nt("recharts-dot",a);return Ee(t)&&Ee(r)&&Ee(n)?y.createElement("circle",ly({},kn(e),Ly(e),{className:o,cx:t,cy:r,r:n})):null},pG={radiusAxis:{},angleAxis:{}},YP=lr({name:"polarAxis",initialState:pG,reducers:{addRadiusAxis(e,t){e.radiusAxis[t.payload.id]=t.payload},removeRadiusAxis(e,t){delete e.radiusAxis[t.payload.id]},addAngleAxis(e,t){e.angleAxis[t.payload.id]=t.payload},removeAngleAxis(e,t){delete e.angleAxis[t.payload.id]}}}),am=YP.actions;am.addRadiusAxis;am.removeRadiusAxis;am.addAngleAxis;am.removeAngleAxis;var gG=YP.reducer;function vG(e){return e&&typeof e=="object"&&"className"in e&&typeof e.className=="string"?e.className:""}var XP=e=>e&&typeof e=="object"&&"clipDot"in e?!!e.clipDot:!0;function o2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function s2(e){for(var t=1;t{n||(a.current===null?r(RU(t)):a.current!==t&&r(LU({prev:a.current,next:t})),a.current=t)},[t,r,n]),y.useLayoutEffect(()=>()=>{a.current&&(r($U(a.current)),a.current=null)},[r]),null}function AG(e){var t=e.legendPayload,r=Nt(),n=Pr(),a=y.useRef(null);return y.useLayoutEffect(()=>{n||(a.current===null?r(c6(t)):a.current!==t&&r(d6({prev:a.current,next:t})),a.current=t)},[r,n,t]),y.useLayoutEffect(()=>()=>{a.current&&(r(f6(a.current)),a.current=null)},[r]),null}function CG(e,t){return MG(e)||_G(e,t)||OG(e,t)||PG()}function PG(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function OG(e,t){if(e){if(typeof e=="string")return l2(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?l2(e,t):void 0}}function l2(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r2&&arguments[2]!==void 0?arguments[2]:[],n=[];for(var a of r)n.push({status:"removed",prev:a});for(var o=0;oe[Math.floor(o*r)]);return rx(n,t)}function DG(e,t){var r=t.map((n,a)=>e[a]);return rx(r,t)}function RG(e,t){for(var r=new Map,n=0;n{var b=r(g,v);if(b!=null){var j=n.get(b);if(j!==void 0)return a.add(b),j}}),c=[];for(var u of n){var f=CG(u,2),h=f[0],m=f[1];a.has(h)||c.push(m)}return rx(o,t,c)}function uy(e,t,r){return t==null?null:e==null?t.map(n=>({status:"added",next:n})):r===tx?TG(e,t):r===IG?DG(e,t):LG(e,t,r)}function JP(e,t){var r=y.useRef(e),n=y.useRef(t.current),a=y.useRef(!0);r.current!==e&&(r.current=e,n.current=t.current,a.current=!1);var o=y.useCallback(function(c,u){var f=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;if(u===0){a.current=!0;return}u===1&&(n.current=c),u>0&&a.current&&f&&(t.current=c)},[t]);return{startValue:n.current,syncStepValue:o}}function $G(e,t){return UG(e)||BG(e,t)||FG(e,t)||zG()}function zG(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function FG(e,t){if(e){if(typeof e=="string")return u2(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?u2(e,t):void 0}}function u2(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{typeof e=="function"&&e(),o(!0)},[e]),u=y.useCallback(()=>{typeof t=="function"&&t(),o(!1)},[t]);return{isAnimating:a,handleAnimationStart:c,handleAnimationEnd:u}}function WG(e){var t,r=e.animationInput,n=e.animationIdPrefix,a=e.items,o=e.previousItemsRef,c=e.isAnimationActive,u=e.animationBegin,f=e.animationDuration,h=e.animationEasing,m=e.onAnimationStart,g=e.onAnimationEnd,v=e.animationInterpolateFn,b=e.animationMatchBy,j=e.shouldUpdatePreviousRef,k=e.children,S=e.layout,N=mA(r,n),E=JP(N,o),A=(t=E.startValue)!==null&&t!==void 0?t:null,P=uy(A,a,b??tx);return y.createElement(hA,{animationId:N,begin:u,duration:f,isActive:c,easing:h,onAnimationEnd:g,onAnimationStart:m,key:N},_=>{var O=A==null,D=a==null?a:v(P,_,S),U=j?j(_):_>0;return E.syncStepValue(D,_,U),D==null?null:k(D,_,O)})}var $g;function KG(e,t){return QG(e)||qG(e,t)||VG(e,t)||GG()}function GG(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function VG(e,t){if(e){if(typeof e=="string")return c2(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?c2(e,t):void 0}}function c2(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{var e=y.useState(()=>Au("uid-")),t=KG(e,1),r=t[0];return r},eO=($g=lh.useId)!==null&&$g!==void 0?$g:YG;function XG(e,t){var r=eO();return t||(e?"".concat(e,"-").concat(r):r)}var ZG=y.createContext(void 0),JG=e=>{var t=e.id,r=e.type,n=e.children,a=XG("recharts-".concat(r),t);return y.createElement(ZG.Provider,{value:a},n(a))},eV={cartesianItems:[],polarItems:[]},tO=lr({name:"graphicalItems",initialState:eV,reducers:{addCartesianGraphicalItem:{reducer(e,t){e.cartesianItems.push(t.payload)},prepare:st()},replaceCartesianGraphicalItem:{reducer(e,t){var r=t.payload,n=r.prev,a=r.next,o=en(e).cartesianItems.indexOf(n);o>-1&&(e.cartesianItems[o]=a)},prepare:st()},removeCartesianGraphicalItem:{reducer(e,t){var r=en(e).cartesianItems.indexOf(t.payload);r>-1&&e.cartesianItems.splice(r,1)},prepare:st()},addPolarGraphicalItem:{reducer(e,t){e.polarItems.push(t.payload)},prepare:st()},removePolarGraphicalItem:{reducer(e,t){var r=en(e).polarItems.indexOf(t.payload);r>-1&&e.polarItems.splice(r,1)},prepare:st()},replacePolarGraphicalItem:{reducer(e,t){var r=t.payload,n=r.prev,a=r.next,o=en(e).polarItems.indexOf(n);o>-1&&(e.polarItems[o]=a)},prepare:st()}}}),hl=tO.actions,tV=hl.addCartesianGraphicalItem,rV=hl.replaceCartesianGraphicalItem,nV=hl.removeCartesianGraphicalItem;hl.addPolarGraphicalItem;hl.removePolarGraphicalItem;hl.replacePolarGraphicalItem;var iV=tO.reducer,aV=e=>{var t=Nt(),r=y.useRef(null);return y.useLayoutEffect(()=>{r.current===null?t(tV(e)):r.current!==e&&t(rV({prev:r.current,next:e})),r.current=e},[t,e]),y.useLayoutEffect(()=>()=>{r.current&&(t(nV(r.current)),r.current=null)},[t]),null},oV=y.memo(aV),sV=["points"];function d2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function zg(e){for(var t=1;t{var N,E,A=zg(zg(zg({r:3},c),v),{},{index:S,cx:(N=k.x)!==null&&N!==void 0?N:void 0,cy:(E=k.y)!==null&&E!==void 0?E:void 0,dataKey:o,value:k.value,payload:k.payload,points:t});return y.createElement(hV,{key:"dot-".concat(S),option:r,dotProps:A,className:a})}),j={};return u&&f!=null&&(j.clipPath="url(#clipPath-".concat(g?"":"dots-").concat(f,")")),y.createElement(Mi,{zIndex:m},y.createElement(nn,th({className:n},j),b))}function f2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function h2(e){for(var t=1;t({top:e.top,bottom:e.bottom,left:e.left,right:e.right})),PV=q([CV,Ei,Ai],(e,t,r)=>{if(!(!e||t==null||r==null))return{x:e.left,y:e.top,width:Math.max(0,t-e.left-e.right),height:Math.max(0,r-e.top-e.bottom)}}),nx=()=>Me(PV),OV=()=>Me(RH);function m2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function Fg(e){for(var t=1;t{var t=e.point,r=e.childIndex,n=e.mainColor,a=e.activeDot,o=e.dataKey,c=e.clipPath;if(a===!1||t.x==null||t.y==null)return null;var u={index:r,dataKey:o,cx:t.x,cy:t.y,r:4,fill:n??"none",strokeWidth:2,stroke:"#fff",payload:t.payload,value:t.value},f=Fg(Fg(Fg({},u),yh(a)),Ly(a)),h;return y.isValidElement(a)?h=y.cloneElement(a,f):typeof a=="function"?h=a(f):h=y.createElement(QP,f),y.createElement(nn,{className:"recharts-active-dot",clipPath:c},h)};function p2(e){var t=e.points,r=e.mainColor,n=e.activeDot,a=e.itemDataKey,o=e.clipPath,c=e.zIndex,u=c===void 0?pr.activeDot:c,f=Me(Fu),h=OV();if(t==null||h==null)return null;var m=t.find(g=>h.includes(g.payload));return Yt(m)?null:y.createElement(Mi,{zIndex:u},y.createElement(TV,{point:m,childIndex:Number(f),mainColor:r,dataKey:a,activeDot:n,clipPath:o}))}var DV=e=>{var t=e.chartData,r=Nt(),n=Pr();return y.useEffect(()=>n?()=>{}:(r(LS(t)),()=>{r(LS(void 0))}),[t,r,n]),null},g2={x:0,y:0,width:0,height:0,padding:{top:0,right:0,bottom:0,left:0}},iO=lr({name:"brush",initialState:g2,reducers:{setBrushSettings(e,t){return t.payload==null?g2:t.payload}}});iO.actions.setBrushSettings;var RV=iO.reducer;function LV(e){return(e%180+180)%180}var $V=function(t){var r=t.width,n=t.height,a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,o=LV(a),c=o*Math.PI/180,u=Math.atan(n/r),f=c>u&&c{e.dots.push(t.payload)},removeDot:(e,t)=>{var r=en(e).dots.findIndex(n=>n===t.payload);r!==-1&&e.dots.splice(r,1)},addArea:(e,t)=>{e.areas.push(t.payload)},removeArea:(e,t)=>{var r=en(e).areas.findIndex(n=>n===t.payload);r!==-1&&e.areas.splice(r,1)},addLine:(e,t)=>{e.lines.push(t.payload)},removeLine:(e,t)=>{var r=en(e).lines.findIndex(n=>n===t.payload);r!==-1&&e.lines.splice(r,1)}}}),ml=aO.actions;ml.addDot;ml.removeDot;ml.addArea;ml.removeArea;ml.addLine;ml.removeLine;var FV=aO.reducer;function BV(e,t){return KV(e)||WV(e,t)||HV(e,t)||UV()}function UV(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function HV(e,t){if(e){if(typeof e=="string")return v2(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?v2(e,t):void 0}}function v2(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{var t=e.children,r=y.useState("".concat(Au("recharts"),"-clip")),n=BV(r,1),a=n[0],o=nx();if(o==null)return null;var c=o.x,u=o.y,f=o.width,h=o.height;return y.createElement(GV.Provider,{value:a},y.createElement("defs",null,y.createElement("clipPath",{id:a},y.createElement("rect",{x:c,y:u,height:h,width:f}))),t)};function oO(e,t){if(t<1)return[];if(t===1)return e;for(var r=[],n=0;ne*a)return!1;var o=r();return e*(t-e*o/2-n)>=0&&e*(t+e*o/2-a)<=0}function YV(e,t){return oO(e,t+1)}function XV(e,t,r,n,a){for(var o=(n||[]).slice(),c=t.start,u=t.end,f=0,h=1,m=c,g=function(){var j=n==null?void 0:n[f];if(j===void 0)return{v:oO(n,h)};var k=f,S,N=()=>(S===void 0&&(S=r(j,k)),S),E=j.coordinate,A=f===0||Uu(e,E,N,m,u);A||(f=0,m=c,h+=1),A&&(m=E+e*(N()/2+a),f+=h)},v;h<=o.length;)if(v=g(),v)return v.v;return[]}function ZV(e,t,r,n,a){var o=(n||[]).slice(),c=o.length;if(c===0)return[];for(var u=t.start,f=t.end,h=1;h<=c;h++){for(var m=(c-1)%h,g=u,v=!0,b=function(){var P=n[k];if(P==null)return 0;var _=k,O,D=()=>(O===void 0&&(O=r(P,_)),O),U=P.coordinate,B=k===m||Uu(e,U,D,g,f);if(!B)return v=!1,1;B&&(g=U+e*(D()/2+a))},j,k=m;k(k===void 0&&(k=r(b,v)),k);if(v===c-1){var N=e*(j.coordinate+e*S()/2-f);o[v]=j=ar(ar({},j),{},{tickCoord:N>0?j.coordinate-N*e:j.coordinate})}else o[v]=j=ar(ar({},j),{},{tickCoord:j.coordinate});if(j.tickCoord!=null){var E=Uu(e,j.tickCoord,S,u,f);E&&(f=j.tickCoord-e*(S()/2+a),o[v]=ar(ar({},j),{},{isShow:!0}))}},m=c-1;m>=0;m--)h(m);return o}function nq(e,t,r,n,a,o){var c=(n||[]).slice(),u=c.length,f=t.start,h=t.end;if(o){var m=n[u-1];if(m!=null){var g=r(m,u-1),v=e*(m.coordinate+e*g/2-h);if(c[u-1]=m=ar(ar({},m),{},{tickCoord:v>0?m.coordinate-v*e:m.coordinate}),m.tickCoord!=null){var b=Uu(e,m.tickCoord,()=>g,f,h);b&&(h=m.tickCoord-e*(g/2+a),c[u-1]=ar(ar({},m),{},{isShow:!0}))}}}for(var j=o?u-1:u,k=function(E){var A=c[E];if(A==null)return 1;var P=A,_,O=()=>(_===void 0&&(_=r(A,E)),_);if(E===0){var D=e*(P.coordinate-e*O()/2-f);c[E]=P=ar(ar({},P),{},{tickCoord:D<0?P.coordinate-D*e:P.coordinate})}else c[E]=P=ar(ar({},P),{},{tickCoord:P.coordinate});if(P.tickCoord!=null){var U=Uu(e,P.tickCoord,O,f,h);U&&(f=P.tickCoord+e*(O()/2+a),c[E]=ar(ar({},P),{},{isShow:!0}))}},S=0;S{var D=typeof h=="function"?h(_.value,O):_.value;return j==="width"?qV(bu(D,{fontSize:t,letterSpacing:r}),k,g):bu(D,{fontSize:t,letterSpacing:r})[j]},N=a[0],E=a[1],A=a.length>=2&&N!=null&&E!=null?Jr(E.coordinate-N.coordinate):1,P=QV(o,A,j);return f==="equidistantPreserveStart"?XV(A,P,S,a,c):f==="equidistantPreserveEnd"?ZV(A,P,S,a,c):(f==="preserveStart"||f==="preserveStartEnd"?b=nq(A,P,S,a,c,f==="preserveStartEnd"):b=rq(A,P,S,a,c),b.filter(_=>_.isShow))}var iq=e=>{var t=e.ticks,r=e.label,n=e.labelGapWithTick,a=n,o=e.tickSize,c=o===void 0?0:o,u=e.tickMargin,f=u===void 0?0:u,h=0;if(t){Array.from(t).forEach(b=>{if(b){var j=b.getBoundingClientRect();j.width>h&&(h=j.width)}});var m=r?r.getBoundingClientRect().width:0,g=c+f,v=h+g+m+(r?a:0);return Math.round(v)}return 0},aq={xAxis:{},yAxis:{}},sO=lr({name:"renderedTicks",initialState:aq,reducers:{setRenderedTicks:(e,t)=>{var r=t.payload,n=r.axisType,a=r.axisId,o=r.ticks;e[n][a]=o},removeRenderedTicks:(e,t)=>{var r=t.payload,n=r.axisType,a=r.axisId;delete e[n][a]}}}),lO=sO.actions,oq=lO.setRenderedTicks,sq=lO.removeRenderedTicks,lq=sO.reducer,uq=["axisLine","width","height","className","hide","ticks","axisType","axisId"];function x2(e,t){return hq(e)||fq(e,t)||dq(e,t)||cq()}function cq(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function dq(e,t){if(e){if(typeof e=="string")return b2(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?b2(e,t):void 0}}function b2(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{if(n==null||r==null)return nl;var o=t.map(c=>({value:c.value,coordinate:c.coordinate,offset:c.offset,index:c.index}));return a(oq({ticks:o,axisId:n,axisType:r})),()=>{a(sq({axisId:n,axisType:r}))}},[a,t,n,r]),null}var Nq=y.forwardRef((e,t)=>{var r=e.ticks,n=r===void 0?[]:r,a=e.tick,o=e.tickLine,c=e.stroke,u=e.tickFormatter,f=e.unit,h=e.padding,m=e.tickTextProps,g=e.orientation,v=e.mirror,b=e.x,j=e.y,k=e.width,S=e.height,N=e.tickSize,E=e.tickMargin,A=e.fontSize,P=e.letterSpacing,_=e.getTicksConfig,O=e.events,D=e.axisType,U=e.axisId,B=ix(xt(xt({},_),{},{ticks:n}),A,P),F=kn(_),Y=yh(a),H=BP(F.textAnchor)?F.textAnchor:wq(g,v),pe=kq(g,v),ue={};typeof o=="object"&&(ue=o);var he=xt(xt({},F),{},{fill:"none"},ue),ae=B.map(te=>xt({entry:te},bq(te,b,j,k,S,g,N,v,E))),se=ae.map(te=>{var J=te.entry,I=te.line;return y.createElement(nn,{className:"recharts-cartesian-axis-tick",key:"tick-".concat(J.value,"-").concat(J.coordinate,"-").concat(J.tickCoord)},o&&y.createElement("line",Eo({},he,I,{className:nt("recharts-cartesian-axis-tick-line",Oo(o,"className"))})))}),X=ae.map((te,J)=>{var I,M,K=te.entry,ne=te.tick,Z=xt(xt(xt(xt({verticalAnchor:pe},F),{},{textAnchor:H,stroke:"none",fill:c},ne),{},{index:J,payload:K,visibleTicksCount:B.length,tickFormatter:u,padding:h},m),{},{angle:(I=(M=m==null?void 0:m.angle)!==null&&M!==void 0?M:F.angle)!==null&&I!==void 0?I:0}),me=xt(xt({},Z),Y);return y.createElement(nn,Eo({className:"recharts-cartesian-axis-tick-label",key:"tick-label-".concat(K.value,"-").concat(K.coordinate,"-").concat(K.tickCoord)},PR(O,K,J)),a&&y.createElement(jq,{option:a,tickProps:me,value:"".concat(typeof u=="function"?u(K.value,J):K.value).concat(f||"")}))});return y.createElement("g",{className:"recharts-cartesian-axis-ticks recharts-".concat(D,"-ticks")},y.createElement(Sq,{ticks:B,axisId:U,axisType:D}),X.length>0&&y.createElement(Mi,{zIndex:pr.label},y.createElement("g",{className:"recharts-cartesian-axis-tick-labels recharts-".concat(D,"-tick-labels"),ref:t},X)),se.length>0&&y.createElement("g",{className:"recharts-cartesian-axis-tick-lines recharts-".concat(D,"-tick-lines")},se))}),Eq=y.forwardRef((e,t)=>{var r=e.axisLine,n=e.width,a=e.height,o=e.className,c=e.hide,u=e.ticks,f=e.axisType,h=e.axisId,m=mq(e,uq),g=y.useState(""),v=x2(g,2),b=v[0],j=v[1],k=y.useState(""),S=x2(k,2),N=S[0],E=S[1],A=y.useRef(null);y.useImperativeHandle(t,()=>({getCalculatedWidth:()=>{var _;return iq({ticks:A.current,label:(_=e.labelRef)===null||_===void 0?void 0:_.current,labelGapWithTick:5,tickSize:e.tickSize,tickMargin:e.tickMargin})}}));var P=y.useCallback(_=>{if(_){var O=_.getElementsByClassName("recharts-cartesian-axis-tick-value");A.current=O;var D=O[0];if(D){var U=window.getComputedStyle(D),B=U.fontSize,F=U.letterSpacing;(B!==b||F!==N)&&(j(B),E(F))}}},[b,N]);return c||n!=null&&n<=0||a!=null&&a<=0?null:y.createElement(Mi,{zIndex:e.zIndex},y.createElement(nn,{className:nt("recharts-cartesian-axis",o)},y.createElement(xq,{x:e.x,y:e.y,width:n,height:a,orientation:e.orientation,mirror:e.mirror,axisLine:r,otherSvgProps:kn(e)}),y.createElement(Nq,{ref:P,axisType:f,events:m,fontSize:b,getTicksConfig:e,height:e.height,letterSpacing:N,mirror:e.mirror,orientation:e.orientation,padding:e.padding,stroke:e.stroke,tick:e.tick,tickFormatter:e.tickFormatter,tickLine:e.tickLine,tickMargin:e.tickMargin,tickSize:e.tickSize,tickTextProps:e.tickTextProps,ticks:u,unit:e.unit,width:e.width,x:e.x,y:e.y,axisId:h}),y.createElement(YK,{x:e.x,y:e.y,width:e.width,height:e.height,lowerWidth:e.width,upperWidth:e.width},y.createElement(oG,{label:e.label,labelRef:e.labelRef}),e.children)))}),ax=y.forwardRef((e,t)=>{var r=on(e,xi);return y.createElement(Eq,Eo({},r,{ref:t}))});ax.displayName="CartesianAxis";var Aq=["x1","y1","x2","y2","key"],Cq=["offset"],Pq=["xAxisId","yAxisId"],Oq=["xAxisId","yAxisId"];function k2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function or(e){for(var t=1;t{var t=e.fill;if(!t||t==="none")return null;var r=e.fillOpacity,n=e.x,a=e.y,o=e.width,c=e.height,u=e.ry;return y.createElement("rect",{x:n,y:a,ry:u,width:o,height:c,stroke:"none",fill:t,fillOpacity:r,className:"recharts-cartesian-grid-bg"})};function uO(e){var t=e.option,r=e.lineItemProps,n;if(y.isValidElement(t))n=y.cloneElement(t,r);else if(typeof t=="function")n=t(r);else{var a,o=r.x1,c=r.y1,u=r.x2,f=r.y2,h=r.key,m=rh(r,Aq),g=(a=kn(m))!==null&&a!==void 0?a:{};g.offset;var v=rh(g,Cq);n=y.createElement("line",no({},v,{x1:o,y1:c,x2:u,y2:f,fill:"none",key:h}))}return n}function Rq(e){var t=e.x,r=e.width,n=e.horizontal,a=n===void 0?!0:n,o=e.horizontalPoints;if(!a||!o||!o.length)return null;e.xAxisId,e.yAxisId;var c=rh(e,Pq),u=o.map((f,h)=>{var m=or(or({},c),{},{x1:t,y1:f,x2:t+r,y2:f,key:"line-".concat(h),index:h});return y.createElement(uO,{key:"line-".concat(h),option:a,lineItemProps:m})});return y.createElement("g",{className:"recharts-cartesian-grid-horizontal"},u)}function Lq(e){var t=e.y,r=e.height,n=e.vertical,a=n===void 0?!0:n,o=e.verticalPoints;if(!a||!o||!o.length)return null;e.xAxisId,e.yAxisId;var c=rh(e,Oq),u=o.map((f,h)=>{var m=or(or({},c),{},{x1:f,y1:t,x2:f,y2:t+r,key:"line-".concat(h),index:h});return y.createElement(uO,{option:a,lineItemProps:m,key:"line-".concat(h)})});return y.createElement("g",{className:"recharts-cartesian-grid-vertical"},u)}function $q(e){var t=e.horizontalFill,r=e.fillOpacity,n=e.x,a=e.y,o=e.width,c=e.height,u=e.horizontalPoints,f=e.horizontal,h=f===void 0?!0:f;if(!h||!t||!t.length||u==null)return null;var m=u.map(v=>Math.round(v+a-a)).sort((v,b)=>v-b);a!==m[0]&&m.unshift(0);var g=m.map((v,b)=>{var j=m[b+1],k=j==null,S=k?a+c-v:j-v;if(S<=0)return null;var N=b%t.length;return y.createElement("rect",{key:"react-".concat(b),y:v,x:n,height:S,width:o,stroke:"none",fill:t[N],fillOpacity:r,className:"recharts-cartesian-grid-bg"})});return y.createElement("g",{className:"recharts-cartesian-gridstripes-horizontal"},g)}function zq(e){var t=e.vertical,r=t===void 0?!0:t,n=e.verticalFill,a=e.fillOpacity,o=e.x,c=e.y,u=e.width,f=e.height,h=e.verticalPoints;if(!r||!n||!n.length)return null;var m=h.map(v=>Math.round(v+o-o)).sort((v,b)=>v-b);o!==m[0]&&m.unshift(0);var g=m.map((v,b)=>{var j=m[b+1],k=j==null,S=k?o+u-v:j-v;if(S<=0)return null;var N=b%n.length;return y.createElement("rect",{key:"react-".concat(b),x:v,y:c,width:S,height:f,stroke:"none",fill:n[N],fillOpacity:a,className:"recharts-cartesian-grid-bg"})});return y.createElement("g",{className:"recharts-cartesian-gridstripes-vertical"},g)}var Fq=(e,t)=>{var r=e.xAxis,n=e.width,a=e.height,o=e.offset;return H5(ix(or(or(or({},xi),r),{},{ticks:W5(r),viewBox:{x:0,y:0,width:n,height:a}})),o.left,o.left+o.width,t)},Bq=(e,t)=>{var r=e.yAxis,n=e.width,a=e.height,o=e.offset;return H5(ix(or(or(or({},xi),r),{},{ticks:W5(r),viewBox:{x:0,y:0,width:n,height:a}})),o.top,o.top+o.height,t)},Uq={horizontal:!0,vertical:!0,horizontalPoints:[],verticalPoints:[],stroke:"#ccc",fill:"none",verticalFill:[],horizontalFill:[],xAxisId:0,yAxisId:0,syncWithTicks:!1,zIndex:pr.grid};function cO(e){var t=Z5(),r=J5(),n=X5(),a=or(or({},on(e,Uq)),{},{x:Ee(e.x)?e.x:n.left,y:Ee(e.y)?e.y:n.top,width:Ee(e.width)?e.width:n.width,height:Ee(e.height)?e.height:n.height}),o=a.xAxisId,c=a.yAxisId,u=a.x,f=a.y,h=a.width,m=a.height,g=a.syncWithTicks,v=a.horizontalValues,b=a.verticalValues,j=Pr(),k=Me(B=>SS(B,"xAxis",o,j)),S=Me(B=>SS(B,"yAxis",c,j));if(!Vn(h)||!Vn(m)||!Ee(u)||!Ee(f))return null;var N=a.verticalCoordinatesGenerator||Fq,E=a.horizontalCoordinatesGenerator||Bq,A=a.horizontalPoints,P=a.verticalPoints;if((!A||!A.length)&&typeof E=="function"){var _=v&&v.length,O=E({yAxis:S?or(or({},S),{},{ticks:_?v:S.ticks}):void 0,width:t??h,height:r??m,offset:n},_?!0:g);Cf(Array.isArray(O),"horizontalCoordinatesGenerator should return Array but instead it returned [".concat(typeof O,"]")),Array.isArray(O)&&(A=O)}if((!P||!P.length)&&typeof N=="function"){var D=b&&b.length,U=N({xAxis:k?or(or({},k),{},{ticks:D?b:k.ticks}):void 0,width:t??h,height:r??m,offset:n},D?!0:g);Cf(Array.isArray(U),"verticalCoordinatesGenerator should return Array but instead it returned [".concat(typeof U,"]")),Array.isArray(U)&&(P=U)}return y.createElement(Mi,{zIndex:a.zIndex},y.createElement("g",{className:"recharts-cartesian-grid"},y.createElement(Dq,{fill:a.fill,fillOpacity:a.fillOpacity,x:a.x,y:a.y,width:a.width,height:a.height,ry:a.ry}),y.createElement($q,no({},a,{horizontalPoints:A})),y.createElement(zq,no({},a,{verticalPoints:P})),y.createElement(Rq,no({},a,{offset:n,horizontalPoints:A,xAxis:k,yAxis:S})),y.createElement(Lq,no({},a,{offset:n,verticalPoints:P,xAxis:k,yAxis:S}))))}cO.displayName="CartesianGrid";var Hq={},dO=lr({name:"errorBars",initialState:Hq,reducers:{addErrorBar:(e,t)=>{var r=t.payload,n=r.itemId,a=r.errorBar;e[n]||(e[n]=[]),e[n].push(a)},replaceErrorBar:(e,t)=>{var r=t.payload,n=r.itemId,a=r.prev,o=r.next;e[n]&&(e[n]=e[n].map(c=>c.dataKey===a.dataKey&&c.direction===a.direction?o:c))},removeErrorBar:(e,t)=>{var r=t.payload,n=r.itemId,a=r.errorBar;e[n]&&(e[n]=e[n].filter(o=>o.dataKey!==a.dataKey||o.direction!==a.direction))}}}),ox=dO.actions;ox.addErrorBar;ox.replaceErrorBar;ox.removeErrorBar;var Wq=dO.reducer;function fO(e,t){var r,n,a=Me(h=>Pi(h,e)),o=Me(h=>Oi(h,t)),c=(r=a==null?void 0:a.allowDataOverflow)!==null&&r!==void 0?r:Ct.allowDataOverflow,u=(n=o==null?void 0:o.allowDataOverflow)!==null&&n!==void 0?n:Pt.allowDataOverflow,f=c||u;return{needClip:f,needClipX:c,needClipY:u}}function Kq(e){var t=e.xAxisId,r=e.yAxisId,n=e.clipPathId,a=nx(),o=fO(t,r),c=o.needClipX,u=o.needClipY,f=o.needClip,h=Me(A=>YC(A,t,!1)),m=Me(A=>XC(A,r,!1));if(!f||!a)return null;var g=a.x,v=a.y,b=a.width,j=a.height,k=c&&h?Math.min(h[0],h[1]):g-b/2,S=u&&m?Math.min(m[0],m[1]):v-j/2,N=c&&h?Math.abs(h[1]-h[0]):b*2,E=u&&m?Math.abs(m[1]-m[0]):j*2;return y.createElement("clipPath",{id:"clipPath-".concat(n)},y.createElement("rect",{x:k,y:S,width:N,height:E}))}function Gq(e){var t=yh(e),r=3,n=2;if(t!=null){var a=t.r,o=t.strokeWidth,c=Number(a),u=Number(o);return(Number.isNaN(c)||c<0)&&(c=r),(Number.isNaN(u)||u<0)&&(u=n),{r:c,strokeWidth:u}}return{r,strokeWidth:n}}function sx(e,t){var r,n;return(r=(n=e.graphicalItems.cartesianItems.find(a=>a.id===t))===null||n===void 0?void 0:n.xAxisId)!==null&&r!==void 0?r:rO}function lx(e,t){var r,n;return(r=(n=e.graphicalItems.cartesianItems.find(a=>a.id===t))===null||n===void 0?void 0:n.yAxisId)!==null&&r!==void 0?r:rO}var hO=(e,t,r)=>aP(e,"xAxis",sx(e,t),r),mO=(e,t,r)=>iP(e,"xAxis",sx(e,t),r),pO=(e,t,r)=>aP(e,"yAxis",lx(e,t),r),gO=(e,t,r)=>iP(e,"yAxis",lx(e,t),r),Vq=q([ft,hO,pO,mO,gO],(e,t,r,n,a)=>Xn(e,"xAxis")?Af(t,n,!1):Af(r,a,!1)),qq=(e,t)=>t,vO=q([SC,qq],(e,t)=>e.filter(r=>r.type==="area").find(r=>r.id===t)),yO=e=>{var t=ft(e),r=Xn(t,"xAxis");return r?"yAxis":"xAxis"},Qq=(e,t)=>{var r=yO(e);return r==="yAxis"?lx(e,t):sx(e,t)},Yq=(e,t,r)=>TC(e,yO(e),Qq(e,t),r),Xq=q([vO,Yq],(e,t)=>{var r;if(!(e==null||t==null)){var n=e.stackId,a=l0(e);if(!(n==null||a==null)){var o=(r=t[n])===null||r===void 0?void 0:r.stackedData,c=o==null?void 0:o.find(u=>u.key===a);if(c!=null)return c.map(u=>[u[0],u[1]])}}}),Zq=q([ft,hO,pO,mO,gO,Xq,kF,Vq,vO,zF],(e,t,r,n,a,o,c,u,f,h)=>{var m=c.chartData,g=c.dataStartIndex,v=c.dataEndIndex;if(!(f==null||e!=="horizontal"&&e!=="vertical"||t==null||r==null||n==null||a==null||n.length===0||a.length===0||u==null)){var b=f.data,j;if(b&&b.length>0?j=b:j=m==null?void 0:m.slice(g,v+1),j!=null)return SQ({layout:e,xAxis:t,yAxis:r,xAxisTicks:n,yAxisTicks:a,dataStartIndex:g,areaSettings:f,stackedData:o,displayedData:j,chartBaseValue:h,bandSize:u})}}),Jq=["animationElapsedTime","isAnimating","isEntrance","layout","isRange","stroke","connectNulls"],eQ=["id","baseLine"];function wu(){return wu=Object.assign?Object.assign.bind():function(e){for(var t=1;tg.y||0));return Ee(a)?m=Math.max(a,m):a&&Array.isArray(a)&&a.length&&(m=Math.max(...a.map(g=>g.y||0),m)),Ee(m)?y.createElement("rect",{x:ug.x||0));return Ee(a)?m=Math.max(a,m):a&&Array.isArray(a)&&a.length&&(m=Math.max(...a.map(g=>g.x||0),m)),Ee(m)?y.createElement("rect",{x:0,y:ue==null?[]:t===1?e.flatMap(r=>r.status==="removed"?[]:[r.next]):e.flatMap(r=>r.status==="matched"?[el(el({},r.next),{},{x:mi(r.prev.x,r.next.x,t),y:mi(r.prev.y,r.next.y,t)})]:r.status==="added"?[r.next]:[]),bO={activeDot:!0,animationBegin:0,animationDuration:1500,animationEasing:"ease",animationMatchBy:tx,animationInterpolateFn:fQ,connectNulls:!1,dot:!1,fill:"#3182bd",fillOpacity:.6,hide:!1,isAnimationActive:"auto",legendType:"line",stroke:"#3182bd",strokeWidth:1,type:"linear",label:!1,shape:aQ,xAxisId:0,yAxisId:0,zIndex:pr.area};function ih(e,t){return e&&e!=="none"?e:t}var hQ=e=>{var t=e.dataKey,r=e.name,n=e.stroke,a=e.fill,o=e.legendType,c=e.hide;return[{inactive:c,dataKey:t,type:o,color:ih(n,a),value:K5(r,t),payload:e}]},mQ=y.memo(e=>{var t=e.dataKey,r=e.data,n=e.stroke,a=e.strokeWidth,o=e.fill,c=e.name,u=e.hide,f=e.unit,h=e.tooltipType,m=e.id,g={dataDefinedOnItem:r,getPosition:nl,settings:{stroke:n,strokeWidth:a,fill:o,dataKey:t,nameKey:void 0,name:K5(c,t),hide:u,type:h,color:ih(n,o),unit:f,graphicalItemId:m}};return y.createElement(EG,{tooltipEntrySettings:g})});function pQ(e){var t=e.clipPathId,r=e.points,n=e.props,a=n.needClip,o=n.dot,c=n.dataKey,u=kn(n);return y.createElement(pV,{points:r,dot:o,className:"recharts-area-dots",dotClassName:"recharts-area-dot",dataKey:c,baseProps:u,needClip:a,clipPathId:t})}function gQ(e){var t=e.showLabels,r=e.children,n=e.points,a=n.map(o=>{var c,u,f={x:(c=o.x)!==null&&c!==void 0?c:0,y:(u=o.y)!==null&&u!==void 0?u:0,width:0,lowerWidth:0,upperWidth:0,height:0};return el(el({},f),{},{value:o.value,payload:o.payload,parentViewBox:void 0,viewBox:f,fill:void 0})});return y.createElement(dG,{value:t?a:void 0},r)}function vQ(e){var t=e.points,r=e.baseLine,n=e.needClip,a=e.clipPathId,o=e.props,c=e.animationElapsedTime,u=e.isAnimating,f=e.isEntrance,h=o.layout,m=o.type,g=o.stroke,v=o.connectNulls,b=o.isRange,j=o.shape,k=o.id,S=xO(o,oQ),N=rn(S),E=el(el({},N),{},{id:k,points:t,connectNulls:v,type:m,baseLine:r,layout:h,stroke:g,isRange:b,animationElapsedTime:c,isAnimating:u,isEntrance:f});return y.createElement(y.Fragment,null,(t==null?void 0:t.length)>1&&y.createElement(nn,{clipPath:n?"url(#clipPath-".concat(a,")"):void 0},y.createElement(NG,{option:j,DefaultShape:bO.shape,shapeProps:E})),y.createElement(pQ,{points:t,props:S,clipPathId:a}))}function yQ(e,t,r){if(Ee(e)){var n=Ee(t)?t:void 0;return mi(n,e,r)}if(Yt(e)||Kn(e)){var a=Ee(t)?t:void 0;return mi(a,0,r)}return e}function xQ(e){var t=e.needClip,r=e.clipPathId,n=e.props,a=e.previousPointsRef,o=e.previousBaselineRef,c=n.points,u=n.baseLine,f=n.isAnimationActive,h=n.animationBegin,m=n.animationDuration,g=n.animationEasing,v=n.animationMatchBy,b=n.animationInterpolateFn,j=y.useMemo(()=>({points:c,baseLine:u}),[c,u]),k=JP(j,o),S=qy(),N=HG(n.onAnimationStart,n.onAnimationEnd),E=N.isAnimating,A=N.handleAnimationStart,P=N.handleAnimationEnd,_=k.startValue;if(S==null)return null;var O;return Array.isArray(u)&&Array.isArray(_)?O=uy(_,u,v):Array.isArray(u)?O=uy(null,u,v):O=null,y.createElement(WG,{animationInput:j,animationIdPrefix:"recharts-area-",items:c,previousItemsRef:a,isAnimationActive:f,animationBegin:h,animationDuration:m,animationEasing:g,onAnimationStart:A,onAnimationEnd:P,animationInterpolateFn:b,animationMatchBy:v,layout:S},(D,U,B)=>{var F;return U===1?F=u:Array.isArray(u)?F=b(O,U,S):F=B?u:yQ(u,_,U),k.syncStepValue(F,U),y.createElement(gQ,{showLabels:!E,points:c},n.children,y.createElement(vQ,{points:D,baseLine:F,needClip:t,clipPathId:r,props:n,animationElapsedTime:U,isAnimating:E||U<1,isEntrance:B}),y.createElement(mG,{label:n.label}))})}function bQ(e){var t=e.needClip,r=e.clipPathId,n=e.props,a=y.useRef(null),o=y.useRef();return y.createElement(xQ,{needClip:t,clipPathId:r,props:n,previousPointsRef:a,previousBaselineRef:o})}class wQ extends y.PureComponent{render(){var t=this.props,r=t.hide,n=t.dot,a=t.points,o=t.className,c=t.top,u=t.left,f=t.needClip,h=t.xAxisId,m=t.yAxisId,g=t.width,v=t.height,b=t.id,j=t.baseLine,k=t.zIndex;if(r)return null;var S=nt("recharts-area",o),N=b,E=Gq(n),A=E.r,P=E.strokeWidth,_=XP(n),O=A*2+P,D=f?"url(#clipPath-".concat(_?"":"dots-").concat(N,")"):void 0;return y.createElement(Mi,{zIndex:k},y.createElement(nn,{className:S},f&&y.createElement("defs",null,y.createElement(Kq,{clipPathId:N,xAxisId:h,yAxisId:m}),!_&&y.createElement("clipPath",{id:"clipPath-dots-".concat(N)},y.createElement("rect",{x:u-O/2,y:c-O/2,width:g+O,height:v+O}))),y.createElement(bQ,{needClip:f,clipPathId:N,props:this.props})),y.createElement(p2,{points:a,mainColor:ih(this.props.stroke,this.props.fill),itemDataKey:this.props.dataKey,activeDot:this.props.activeDot,clipPath:D}),this.props.isRange&&Array.isArray(j)&&y.createElement(p2,{points:j,mainColor:ih(this.props.stroke,this.props.fill),itemDataKey:this.props.dataKey,activeDot:this.props.activeDot,clipPath:D}))}}function kQ(e){var t,r=e.activeDot,n=e.animationBegin,a=e.animationDuration,o=e.animationEasing,c=e.connectNulls,u=e.dot,f=e.fill,h=e.fillOpacity,m=e.hide,g=e.isAnimationActive,v=e.legendType,b=e.stroke,j=e.xAxisId,k=e.yAxisId,S=xO(e,sQ),N=il(),E=CP(),A=fO(j,k),P=A.needClip,_=Pr(),O=(t=Me(he=>Zq(he,e.id,_)))!==null&&t!==void 0?t:{},D=O.points,U=O.isRange,B=O.baseLine,F=nx();if(N!=="horizontal"&&N!=="vertical"||F==null||E!=="AreaChart"&&E!=="ComposedChart")return null;var Y=F.height,H=F.width,pe=F.x,ue=F.y;return!D||!D.length?null:y.createElement(wQ,nh({},S,{activeDot:r,animationBegin:n,animationDuration:a,animationEasing:o,baseLine:B,connectNulls:c,dot:u,fill:f,fillOpacity:h,height:Y,hide:m,layout:N,isAnimationActive:g,isRange:U,legendType:v,needClip:P,points:D,stroke:b,width:H,left:pe,top:ue,xAxisId:j,yAxisId:k}))}var jQ=(e,t,r,n,a)=>{var o=r??t;if(Ee(o))return o;var c=e==="horizontal"?a:n,u=c.scale.domain();if(c.type==="number"){var f=Math.max(u[0],u[1]),h=Math.min(u[0],u[1]);return o==="dataMin"?h:o==="dataMax"||f<0?f:Math.max(Math.min(u[0],u[1]),0)}return o==="dataMin"?u[0]:o==="dataMax"?u[1]:u[0]};function SQ(e){var t=e.areaSettings,r=t.connectNulls,n=t.baseValue,a=t.dataKey,o=e.stackedData,c=e.layout,u=e.chartBaseValue,f=e.xAxis,h=e.yAxis,m=e.displayedData,g=e.dataStartIndex,v=e.xAxisTicks,b=e.yAxisTicks,j=e.bandSize,k=o&&o.length,S=jQ(c,u,n,f,h),N=c==="horizontal",E=!1,A=m.map((_,O)=>{var D,U,B,F;if(k)F=o[g+O];else{var Y=Lt(_,a);Array.isArray(Y)?(F=Y,E=!0):F=[S,Y]}var H=(D=(U=F)===null||U===void 0?void 0:U[1])!==null&&D!==void 0?D:null,pe=H==null||k&&!r&&Lt(_,a)==null;if(N){var ue;return{x:xk({axis:f,ticks:v,bandSize:j,entry:_,index:O}),y:pe?null:(ue=h.scale.map(H))!==null&&ue!==void 0?ue:null,value:F,payload:_}}return{x:pe?null:(B=f.scale.map(H))!==null&&B!==void 0?B:null,y:xk({axis:h,ticks:b,bandSize:j,entry:_,index:O}),value:F,payload:_}}),P;return k||E?P=A.map(_=>{var O,D=Array.isArray(_.value)?_.value[0]:null;if(N){var U;return{x:_.x,y:D!=null&&_.y!=null&&(U=h.scale.map(D))!==null&&U!==void 0?U:null,payload:_.payload}}return{x:D!=null&&(O=f.scale.map(D))!==null&&O!==void 0?O:null,y:_.y,payload:_.payload}}):P=N?h.scale.map(S):f.scale.map(S),{points:A,baseLine:P??0,isRange:E}}function NQ(e){var t=on(e,bO),r=Pr();return y.createElement(JG,{id:t.id,type:"area"},n=>y.createElement(y.Fragment,null,y.createElement(AG,{legendPayload:hQ(t)}),y.createElement(mQ,{dataKey:t.dataKey,data:t.data,stroke:t.stroke,strokeWidth:t.strokeWidth,fill:t.fill,name:t.name,hide:t.hide,unit:t.unit,tooltipType:t.tooltipType,id:n}),y.createElement(oV,{type:"area",id:n,data:t.data,dataKey:t.dataKey,xAxisId:t.xAxisId,yAxisId:t.yAxisId,zAxisId:0,stackId:lz(t.stackId),hide:t.hide,barSize:void 0,baseValue:t.baseValue,isPanorama:r,connectNulls:t.connectNulls}),y.createElement(kQ,nh({},t,{id:n}))))}var wO=y.memo(NQ,Fh);wO.displayName="Area";var EQ=["domain","range"],AQ=["domain","range"];function N2(e,t){if(e==null)return{};var r,n,a=CQ(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n{if(c!=null)return C2(C2({},o),{},{type:c})},[o,c]);return y.useLayoutEffect(()=>{u!=null&&(r.current===null?t(bV(u)):r.current!==u&&t(wV({prev:r.current,next:u})),r.current=u)},[u,t]),y.useLayoutEffect(()=>()=>{r.current&&(t(kV(r.current)),r.current=null)},[t]),null}var LQ=e=>{var t=e.xAxisId,r=e.className,n=Me(V5),a=Pr(),o="xAxis",c=Me(v=>nP(v,o,t,a)),u=Me(v=>vU(v,t)),f=Me(v=>jU(v,t)),h=Me(v=>bC(v,t));if(u==null||f==null||h==null)return null;e.dangerouslySetInnerHTML,e.ticks,e.scale;var m=dy(e,OQ);h.id,h.scale;var g=dy(h,_Q);return y.createElement(ax,cy({},m,g,{x:f.x,y:f.y,width:u.width,height:u.height,className:nt("recharts-".concat(o," ").concat(o),r),viewBox:n,ticks:c,axisType:o,axisId:t}))},$Q={allowDataOverflow:Ct.allowDataOverflow,allowDecimals:Ct.allowDecimals,allowDuplicatedCategory:Ct.allowDuplicatedCategory,angle:Ct.angle,axisLine:xi.axisLine,height:Ct.height,hide:!1,includeHidden:Ct.includeHidden,interval:Ct.interval,label:!1,minTickGap:Ct.minTickGap,mirror:Ct.mirror,orientation:Ct.orientation,padding:Ct.padding,reversed:Ct.reversed,scale:Ct.scale,tick:Ct.tick,tickCount:Ct.tickCount,tickLine:xi.tickLine,tickSize:xi.tickSize,type:Ct.type,niceTicks:Ct.niceTicks,xAxisId:0},zQ=e=>{var t=on(e,$Q);return y.createElement(y.Fragment,null,y.createElement(RQ,{allowDataOverflow:t.allowDataOverflow,allowDecimals:t.allowDecimals,allowDuplicatedCategory:t.allowDuplicatedCategory,angle:t.angle,dataKey:t.dataKey,domain:t.domain,height:t.height,hide:t.hide,id:t.xAxisId,includeHidden:t.includeHidden,interval:t.interval,minTickGap:t.minTickGap,mirror:t.mirror,name:t.name,orientation:t.orientation,padding:t.padding,reversed:t.reversed,scale:t.scale,tick:t.tick,tickCount:t.tickCount,tickFormatter:t.tickFormatter,ticks:t.ticks,type:t.type,unit:t.unit,niceTicks:t.niceTicks}),y.createElement(LQ,t))},jO=y.memo(zQ,kO);jO.displayName="XAxis";var FQ=["type"],BQ=["dangerouslySetInnerHTML","ticks","scale"],UQ=["id","scale"];function fy(){return fy=Object.assign?Object.assign.bind():function(e){for(var t=1;t{if(c!=null)return O2(O2({},o),{},{type:c})},[c,o]);return y.useLayoutEffect(()=>{u!=null&&(r.current===null?t(jV(u)):r.current!==u&&t(SV({prev:r.current,next:u})),r.current=u)},[u,t]),y.useLayoutEffect(()=>()=>{r.current&&(t(NV(r.current)),r.current=null)},[t]),null}function qQ(e){var t=e.yAxisId,r=e.className,n=e.width,a=e.label,o=y.useRef(null),c=y.useRef(null),u=Me(V5),f=Pr(),h=Nt(),m="yAxis",g=Me(N=>EU(N,t)),v=Me(N=>NU(N,t)),b=Me(N=>nP(N,m,t,f)),j=Me(N=>wC(N,t));if(y.useLayoutEffect(()=>{if(!(n!=="auto"||!g||ex(a)||y.isValidElement(a)||j==null)){var N=o.current;if(N){var E=N.getCalculatedWidth();Math.round(g.width)!==Math.round(E)&&h(EV({id:t,width:E}))}}},[b,g,h,a,t,n,j]),g==null||v==null||j==null)return null;e.dangerouslySetInnerHTML,e.ticks,e.scale;var k=hy(e,BQ);j.id,j.scale;var S=hy(j,UQ);return y.createElement(ax,fy({},k,S,{ref:o,labelRef:c,x:v.x,y:v.y,tickTextProps:n==="auto"?{width:void 0}:{width:n},width:g.width,height:g.height,className:nt("recharts-".concat(m," ").concat(m),r),viewBox:u,ticks:b,axisType:m,axisId:t}))}var QQ={allowDataOverflow:Pt.allowDataOverflow,allowDecimals:Pt.allowDecimals,allowDuplicatedCategory:Pt.allowDuplicatedCategory,angle:Pt.angle,axisLine:xi.axisLine,hide:!1,includeHidden:Pt.includeHidden,interval:Pt.interval,label:!1,minTickGap:Pt.minTickGap,mirror:Pt.mirror,orientation:Pt.orientation,padding:Pt.padding,reversed:Pt.reversed,scale:Pt.scale,tick:Pt.tick,tickCount:Pt.tickCount,tickLine:xi.tickLine,tickSize:xi.tickSize,type:Pt.type,niceTicks:Pt.niceTicks,width:Pt.width,yAxisId:0},YQ=e=>{var t=on(e,QQ);return y.createElement(y.Fragment,null,y.createElement(VQ,{interval:t.interval,id:t.yAxisId,scale:t.scale,type:t.type,domain:t.domain,allowDataOverflow:t.allowDataOverflow,dataKey:t.dataKey,allowDuplicatedCategory:t.allowDuplicatedCategory,allowDecimals:t.allowDecimals,tickCount:t.tickCount,padding:t.padding,includeHidden:t.includeHidden,reversed:t.reversed,ticks:t.ticks,width:t.width,orientation:t.orientation,mirror:t.mirror,hide:t.hide,unit:t.unit,name:t.name,angle:t.angle,minTickGap:t.minTickGap,tick:t.tick,tickFormatter:t.tickFormatter,niceTicks:t.niceTicks}),y.createElement(qQ,t))},SO=y.memo(YQ,kO);SO.displayName="YAxis";var XQ=(e,t)=>t,ux=q([XQ,ft,DA,Ft,kP,_i,qH,Zt],tW);function ZQ(e){return"getBBox"in e.currentTarget&&typeof e.currentTarget.getBBox=="function"}function cx(e){var t=e.currentTarget.getBoundingClientRect(),r,n;if(ZQ(e)){var a=e.currentTarget.getBBox();r=a.width>0?t.width/a.width:1,n=a.height>0?t.height/a.height:1}else{var o=e.currentTarget;r=o.offsetWidth>0?t.width/o.offsetWidth:1,n=o.offsetHeight>0?t.height/o.offsetHeight:1}var c=(u,f)=>({relativeX:Math.round((u-t.left)/r),relativeY:Math.round((f-t.top)/n)});return"touches"in e?Array.from(e.touches).map(u=>c(u.clientX,u.clientY)):c(e.clientX,e.clientY)}var NO=Hr("mouseClick"),EO=Zu();EO.startListening({actionCreator:NO,effect:(e,t)=>{var r=e.payload,n=ux(t.getState(),cx(r));(n==null?void 0:n.activeIndex)!=null&&t.dispatch(BU({activeIndex:n.activeIndex,activeDataKey:void 0,activeCoordinate:n.activeCoordinate}))}});var my=Hr("mouseMove"),AO=Zu(),ms=null,Ha=null,Bg=null;AO.startListening({actionCreator:my,effect:(e,t)=>{var r=e.payload,n=t.getState(),a=n.eventSettings,o=a.throttleDelay,c=a.throttledEvents,u=c==="all"||(c==null?void 0:c.includes("mousemove"));ms!==null&&(cancelAnimationFrame(ms),ms=null),Ha!==null&&(typeof o!="number"||!u)&&(clearTimeout(Ha),Ha=null),Bg=cx(r);var f=()=>{var h=t.getState(),m=dc(h,h.tooltip.settings.shared);if(!Bg){ms=null,Ha=null;return}if(m==="axis"){var g=ux(h,Bg);(g==null?void 0:g.activeIndex)!=null?t.dispatch(fP({activeIndex:g.activeIndex,activeDataKey:void 0,activeCoordinate:g.activeCoordinate})):t.dispatch(dP())}ms=null,Ha=null};if(!u){f();return}o==="raf"?ms=requestAnimationFrame(f):typeof o=="number"&&Ha===null&&(Ha=setTimeout(f,o))}});function JQ(e,t){return t instanceof HTMLElement?"HTMLElement <".concat(t.tagName,' class="').concat(t.className,'">'):t===window?"global.window":e==="children"&&typeof t=="object"&&t!==null?"<>":t}var _2={accessibilityLayer:!0,barCategoryGap:"10%",barGap:4,barSize:void 0,className:void 0,maxBarSize:void 0,stackOffset:"none",syncId:void 0,syncMethod:"index",baseValue:void 0,reverseStackOrder:!1},CO=lr({name:"rootProps",initialState:_2,reducers:{updateOptions:(e,t)=>{var r;e.accessibilityLayer=t.payload.accessibilityLayer,e.barCategoryGap=t.payload.barCategoryGap,e.barGap=(r=t.payload.barGap)!==null&&r!==void 0?r:_2.barGap,e.barSize=t.payload.barSize,e.maxBarSize=t.payload.maxBarSize,e.stackOffset=t.payload.stackOffset,e.syncId=t.payload.syncId,e.syncMethod=t.payload.syncMethod,e.className=t.payload.className,e.baseValue=t.payload.baseValue,e.reverseStackOrder=t.payload.reverseStackOrder}}}),eY=CO.reducer,tY=CO.actions.updateOptions,rY=null,nY={updatePolarOptions:(e,t)=>e===null?t.payload:(e.startAngle=t.payload.startAngle,e.endAngle=t.payload.endAngle,e.cx=t.payload.cx,e.cy=t.payload.cy,e.innerRadius=t.payload.innerRadius,e.outerRadius=t.payload.outerRadius,e)},PO=lr({name:"polarOptions",initialState:rY,reducers:nY});PO.actions.updatePolarOptions;var iY=PO.reducer,OO=Hr("keyDown"),_O=Hr("focus"),MO=Hr("blur"),om=Zu(),ps=null,Wa=null,Gd=null;om.startListening({actionCreator:OO,effect:(e,t)=>{Gd=e.payload,ps!==null&&(cancelAnimationFrame(ps),ps=null);var r=t.getState(),n=r.eventSettings,a=n.throttleDelay,o=n.throttledEvents,c=o==="all"||o.includes("keydown");Wa!==null&&(typeof a!="number"||!c)&&(clearTimeout(Wa),Wa=null);var u=()=>{try{var f=t.getState(),h=f.rootProps.accessibilityLayer!==!1;if(!h)return;var m=f.tooltip.keyboardInteraction,g=Gd;if(g!=="ArrowRight"&&g!=="ArrowLeft"&&g!=="Enter")return;var v=xu(m,No(f),Zs(f),Js(f)),b=v==null?-1:Number(v),j=!Number.isFinite(b)||b<0,k=_i(f),S=No(f),N=dc(f,f.tooltip.settings.shared);if(g==="Enter"){if(j)return;var E=Zf(f,N,"hover",String(m.index));t.dispatch(Xf({active:!m.active,activeIndex:m.index,activeCoordinate:E}));return}var A=_U(f),P=A==="left-to-right"?1:-1,_=g==="ArrowRight"?1:-1,O;if(j){var D=Zs(f),U=Js(f),B=_*P,F=he=>({active:!1,index:String(he),dataKey:void 0,graphicalItemId:void 0,coordinate:void 0});if(O=-1,B>0){for(var Y=0;Y=0;H--)if(xu(F(H),S,D,U)!=null){O=H;break}if(O<0)return}else{O=b+_*P;var pe=(k==null?void 0:k.length)||S.length;if(pe===0||O>=pe||O<0)return}var ue=Zf(f,N,"hover",String(O));t.dispatch(Xf({active:!0,activeIndex:O.toString(),activeCoordinate:ue}))}finally{ps=null,Wa=null}};if(!c){u();return}a==="raf"?ps=requestAnimationFrame(u):typeof a=="number"&&Wa===null&&(u(),Gd=null,Wa=setTimeout(()=>{Gd?u():(Wa=null,ps=null)},a))}});om.startListening({actionCreator:_O,effect:(e,t)=>{var r=t.getState(),n=r.rootProps.accessibilityLayer!==!1;if(n){var a=r.tooltip.keyboardInteraction;if(!a.active&&a.index==null){var o="0",c=dc(r,r.tooltip.settings.shared),u=Zf(r,c,"hover",String(o));t.dispatch(Xf({active:!0,activeIndex:o,activeCoordinate:u}))}}}});om.startListening({actionCreator:MO,effect:(e,t)=>{var r=t.getState(),n=r.rootProps.accessibilityLayer!==!1;if(n){var a=r.tooltip.keyboardInteraction;a.active&&t.dispatch(Xf({active:!1,activeIndex:a.index,activeCoordinate:a.coordinate}))}}});function IO(e){e.persist();var t=e.currentTarget;return new Proxy(e,{get:(r,n)=>{if(n==="currentTarget")return t;var a=Reflect.get(r,n);return typeof a=="function"?a.bind(r):a}})}var Xr=Hr("externalEvent"),TO=Zu(),Vd=new Map,uu=new Map,Ug=new Map;TO.startListening({actionCreator:Xr,effect:(e,t)=>{var r=e.payload,n=r.handler,a=r.reactEvent;if(n!=null){var o=a.type,c=IO(a);Ug.set(o,{handler:n,reactEvent:c});var u=Vd.get(o);u!==void 0&&(cancelAnimationFrame(u),Vd.delete(o));var f=t.getState(),h=f.eventSettings,m=h.throttleDelay,g=h.throttledEvents,v=g,b=v==="all"||(v==null?void 0:v.includes(o)),j=uu.get(o);j!==void 0&&(typeof m!="number"||!b)&&(clearTimeout(j),uu.delete(o));var k=()=>{var E=Ug.get(o);try{if(!E)return;var A=E.handler,P=E.reactEvent,_=t.getState(),O={activeCoordinate:IH(_),activeDataKey:OH(_),activeIndex:Fu(_),activeLabel:NP(_),activeTooltipIndex:Fu(_),isTooltipActive:TH(_)};A&&A(O,P)}finally{Vd.delete(o),uu.delete(o),Ug.delete(o)}};if(!b){k();return}if(m==="raf"){var S=requestAnimationFrame(k);Vd.set(o,S)}else if(typeof m=="number"){if(!uu.has(o)){k();var N=setTimeout(k,m);uu.set(o,N)}}else k()}}});var aY=q([fl],e=>e.tooltipItemPayloads),oY=q([aY,(e,t)=>t,(e,t,r)=>r],(e,t,r)=>{if(t!=null){var n=e.find(o=>o.settings.graphicalItemId===r);if(n!=null){var a=n.getPosition;if(a!=null)return a(t)}}}),DO=Hr("touchMove"),RO=Zu(),Ka=null,ra=null,M2=null,cu=null;RO.startListening({actionCreator:DO,effect:(e,t)=>{var r=e.payload;if(!(r.touches==null||r.touches.length===0)){cu=IO(r);var n=t.getState(),a=n.eventSettings,o=a.throttleDelay,c=a.throttledEvents,u=c==="all"||c.includes("touchmove");Ka!==null&&(cancelAnimationFrame(Ka),Ka=null),ra!==null&&(typeof o!="number"||!u)&&(clearTimeout(ra),ra=null),M2=Array.from(r.touches).map(h=>cx({clientX:h.clientX,clientY:h.clientY,currentTarget:r.currentTarget}));var f=()=>{if(cu!=null){var h=t.getState(),m=dc(h,h.tooltip.settings.shared);if(m==="axis"){var g,v=(g=M2)===null||g===void 0?void 0:g[0];if(v==null){Ka=null,ra=null;return}var b=ux(h,v);(b==null?void 0:b.activeIndex)!=null&&t.dispatch(fP({activeIndex:b.activeIndex,activeDataKey:void 0,activeCoordinate:b.activeCoordinate}))}else if(m==="item"){var j,k=cu.touches[0];if(document.elementFromPoint==null||k==null)return;var S=document.elementFromPoint(k.clientX,k.clientY);if(!S||!S.getAttribute)return;var N=S.getAttribute(pz),E=(j=S.getAttribute(gz))!==null&&j!==void 0?j:void 0,A=Io(h).find(O=>O.id===E);if(N==null||A==null||E==null)return;var P=A.dataKey,_=oY(h,N,E);t.dispatch(FU({activeDataKey:P,activeIndex:N,activeCoordinate:_,activeGraphicalItemId:E}))}Ka=null,ra=null}};if(!u){f();return}o==="raf"?Ka=requestAnimationFrame(f):typeof o=="number"&&ra===null&&(f(),cu=null,ra=setTimeout(()=>{cu?f():(ra=null,Ka=null)},o))}}});var LO={throttleDelay:"raf",throttledEvents:["mousemove","touchmove","pointermove","scroll","wheel"]},$O=lr({name:"eventSettings",initialState:LO,reducers:{setEventSettings:(e,t)=>{t.payload.throttleDelay!=null&&(e.throttleDelay=t.payload.throttleDelay),t.payload.throttledEvents!=null&&(e.throttledEvents=t.payload.throttledEvents)}}}),sY=$O.actions.setEventSettings,lY=$O.reducer,uY=m5({brush:RV,cartesianAxis:AV,chartData:MW,errorBars:Wq,eventSettings:lY,graphicalItems:iV,layout:J$,legend:h6,options:AW,polarAxis:gG,polarOptions:iY,referenceElements:FV,renderedTicks:lq,rootProps:eY,tooltip:UU,zIndex:mW}),cY=function(t){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"Chart";return S$({reducer:uY,preloadedState:t,middleware:n=>{var a;return n({serializableCheck:!1,immutableCheck:!["commonjs","es6","production"].includes((a="es6")!==null&&a!==void 0?a:"")}).concat([EO.middleware,AO.middleware,om.middleware,TO.middleware,RO.middleware])},enhancers:n=>{var a=n;return typeof n=="function"&&(a=n()),a.concat(P5({type:"raf"}))},devTools:{serialize:{replacer:JQ},name:"recharts-".concat(r)}})};function dY(e){var t=e.preloadedState,r=e.children,n=e.reduxStoreName,a=Pr(),o=y.useRef(null);if(a)return r;o.current==null&&(o.current=cY(t,n));var c=zy;return y.createElement(P6,{context:c,store:o.current},r)}function fY(e){var t=e.layout,r=e.margin,n=Nt(),a=Pr();return y.useEffect(()=>{a||(n(Y$(t)),n(Q$(r)))},[n,a,t,r]),null}var hY=y.memo(fY,Fh);function mY(e){var t=Nt();return y.useEffect(()=>{t(tY(e))},[t,e]),null}var pY=e=>{var t=Nt();return y.useEffect(()=>{t(sY(e))},[t,e]),null},gY=y.memo(pY,Fh);function I2(e){var t=e.zIndex,r=e.isPanorama,n=y.useRef(null),a=Nt();return y.useLayoutEffect(()=>(n.current&&a(fW({zIndex:t,element:n.current,isPanorama:r})),()=>{a(hW({zIndex:t,isPanorama:r}))}),[a,t,r]),y.createElement("g",{tabIndex:-1,ref:n,className:"recharts-zIndex-layer_".concat(t)})}function T2(e){var t=e.children,r=e.isPanorama,n=Me(nW);if(!n||n.length===0)return t;var a=n.filter(c=>c<0),o=n.filter(c=>c>0);return y.createElement(y.Fragment,null,a.map(c=>y.createElement(I2,{key:c,zIndex:c,isPanorama:r})),t,o.map(c=>y.createElement(I2,{key:c,zIndex:c,isPanorama:r})))}var vY=["children"];function yY(e,t){if(e==null)return{};var r,n,a=xY(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n{var r=Z5(),n=J5(),a=uA();if(!Vn(r)||!Vn(n))return null;var o=e.children,c=e.otherAttributes,u=e.title,f=e.desc,h,m;return c!=null&&(typeof c.tabIndex=="number"?h=c.tabIndex:h=a?0:void 0,typeof c.role=="string"?m=c.role:m=a?"application":void 0),y.createElement(ME,ah({},c,{title:u,desc:f,role:m,tabIndex:h,width:r,height:n,style:bY,ref:t}),o)}),kY=e=>{var t=e.children,r=Me(Dh);if(!r)return null;var n=r.width,a=r.height,o=r.y,c=r.x;return y.createElement(ME,{width:n,height:a,x:c,y:o},t)},D2=y.forwardRef((e,t)=>{var r=e.children,n=yY(e,vY),a=Pr();return a?y.createElement(kY,null,y.createElement(T2,{isPanorama:!0},r)):y.createElement(wY,ah({ref:t},n),y.createElement(T2,{isPanorama:!1},r))});function jY(e,t){return AY(e)||EY(e,t)||NY(e,t)||SY()}function SY(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function NY(e,t){if(e){if(typeof e=="string")return R2(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?R2(e,t):void 0}}function R2(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{if(n!=null){var c=n.getBoundingClientRect(),u=c.width/n.offsetWidth;We(u)&&u!==o&&e(Z$(u))}},[n,e,o]),a}function L2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function PY(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);r(BW(),null);function sh(e){if(typeof e=="number")return e;if(typeof e=="string"){var t=parseFloat(e);if(!Number.isNaN(t))return t}return 0}var $Y=y.forwardRef((e,t)=>{var r,n,a=y.useRef(null),o=y.useState({containerWidth:sh((r=e.style)===null||r===void 0?void 0:r.width),containerHeight:sh((n=e.style)===null||n===void 0?void 0:n.height)}),c=oh(o,2),u=c[0],f=c[1],h=y.useCallback((g,v)=>{f(b=>{var j=Math.round(g),k=Math.round(v);return b.containerWidth===j&&b.containerHeight===k?b:{containerWidth:j,containerHeight:k}})},[]),m=y.useCallback(g=>{if(typeof t=="function"&&t(g),a.current!=null&&(a.current.disconnect(),a.current=null),g!=null&&typeof ResizeObserver<"u"){var v=g.getBoundingClientRect(),b=v.width,j=v.height;h(b,j);var k=N=>{var E=N[0];if(E!=null){var A=E.contentRect,P=A.width,_=A.height;h(P,_)}},S=new ResizeObserver(k);S.observe(g),a.current=S}},[t,h]);return y.useEffect(()=>()=>{var g=a.current;g!=null&&g.disconnect()},[h]),y.createElement(y.Fragment,null,y.createElement(ec,{width:u.containerWidth,height:u.containerHeight}),y.createElement("div",ka({ref:m},e)))}),zY=y.forwardRef((e,t)=>{var r=e.width,n=e.height,a=y.useState({containerWidth:sh(r),containerHeight:sh(n)}),o=oh(a,2),c=o[0],u=o[1],f=y.useCallback((m,g)=>{u(v=>{var b=Math.round(m),j=Math.round(g);return v.containerWidth===b&&v.containerHeight===j?v:{containerWidth:b,containerHeight:j}})},[]),h=y.useCallback(m=>{if(typeof t=="function"&&t(m),m!=null){var g=m.getBoundingClientRect(),v=g.width,b=g.height;f(v,b)}},[t,f]);return y.createElement(y.Fragment,null,y.createElement(ec,{width:c.containerWidth,height:c.containerHeight}),y.createElement("div",ka({ref:h},e)))}),FY=y.forwardRef((e,t)=>{var r=e.width,n=e.height;return y.createElement(y.Fragment,null,y.createElement(ec,{width:r,height:n}),y.createElement("div",ka({ref:t},e)))}),BY=y.forwardRef((e,t)=>{var r=e.width,n=e.height;return typeof r=="string"||typeof n=="string"?y.createElement(zY,ka({},e,{ref:t})):typeof r=="number"&&typeof n=="number"?y.createElement(FY,ka({},e,{width:r,height:n,ref:t})):y.createElement(y.Fragment,null,y.createElement(ec,{width:r,height:n}),y.createElement("div",ka({ref:t},e)))});function UY(e){return e?$Y:BY}var HY=y.forwardRef((e,t)=>{var r=e.children,n=e.className,a=e.height,o=e.onClick,c=e.onContextMenu,u=e.onDoubleClick,f=e.onMouseDown,h=e.onMouseEnter,m=e.onMouseLeave,g=e.onMouseMove,v=e.onMouseUp,b=e.onTouchEnd,j=e.onTouchMove,k=e.onTouchStart,S=e.style,N=e.width,E=e.responsive,A=e.dispatchTouchEvents,P=A===void 0?!0:A,_=y.useRef(null),O=Nt(),D=y.useState(null),U=oh(D,2),B=U[0],F=U[1],Y=y.useState(null),H=oh(Y,2),pe=H[0],ue=H[1],he=CY(),ae=Gy(),se=(ae==null?void 0:ae.width)>0?ae.width:N,X=(ae==null?void 0:ae.height)>0?ae.height:a,te=y.useCallback(Oe=>{he(Oe),typeof t=="function"&&t(Oe),F(Oe),ue(Oe),Oe!=null&&(_.current=Oe)},[he,t,F,ue]),J=y.useCallback(Oe=>{O(NO(Oe)),O(Xr({handler:o,reactEvent:Oe}))},[O,o]),I=y.useCallback(Oe=>{O(my(Oe)),O(Xr({handler:h,reactEvent:Oe}))},[O,h]),M=y.useCallback(Oe=>{O(dP()),O(Xr({handler:m,reactEvent:Oe}))},[O,m]),K=y.useCallback(Oe=>{O(my(Oe)),O(Xr({handler:g,reactEvent:Oe}))},[O,g]),ne=y.useCallback(()=>{O(_O())},[O]),Z=y.useCallback(()=>{O(MO())},[O]),me=y.useCallback(Oe=>{O(OO(Oe.key))},[O]),ge=y.useCallback(Oe=>{O(Xr({handler:c,reactEvent:Oe}))},[O,c]),Pe=y.useCallback(Oe=>{O(Xr({handler:u,reactEvent:Oe}))},[O,u]),re=y.useCallback(Oe=>{O(Xr({handler:f,reactEvent:Oe}))},[O,f]),xe=y.useCallback(Oe=>{O(Xr({handler:v,reactEvent:Oe}))},[O,v]),_e=y.useCallback(Oe=>{O(Xr({handler:k,reactEvent:Oe}))},[O,k]),ie=y.useCallback(Oe=>{P&&O(DO(Oe)),O(Xr({handler:j,reactEvent:Oe}))},[O,P,j]),Je=y.useCallback(Oe=>{O(Xr({handler:b,reactEvent:Oe}))},[O,b]),Fe=UY(E);return y.createElement(IP.Provider,{value:B},y.createElement(nR.Provider,{value:pe},y.createElement(Fe,{width:se??(S==null?void 0:S.width),height:X??(S==null?void 0:S.height),className:nt("recharts-wrapper",n),style:PY({position:"relative",cursor:"default",width:se,height:X},S),onClick:J,onContextMenu:ge,onDoubleClick:Pe,onFocus:ne,onBlur:Z,onKeyDown:me,onMouseDown:re,onMouseEnter:I,onMouseLeave:M,onMouseMove:K,onMouseUp:xe,onTouchEnd:Je,onTouchMove:ie,onTouchStart:_e,ref:te},y.createElement(LY,null),r)))}),WY=["width","height","responsive","children","className","style","compact","title","desc"];function KY(e,t){if(e==null)return{};var r,n,a=GY(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n{var r=e.width,n=e.height,a=e.responsive,o=e.children,c=e.className,u=e.style,f=e.compact,h=e.title,m=e.desc,g=KY(e,WY),v=kn(g);return f?y.createElement(y.Fragment,null,y.createElement(ec,{width:r,height:n}),y.createElement(D2,{otherAttributes:v,title:h,desc:m},o)):y.createElement(HY,{className:c,style:u,width:r,height:n,responsive:a??!1,onClick:e.onClick,onMouseLeave:e.onMouseLeave,onMouseEnter:e.onMouseEnter,onMouseMove:e.onMouseMove,onMouseDown:e.onMouseDown,onMouseUp:e.onMouseUp,onContextMenu:e.onContextMenu,onDoubleClick:e.onDoubleClick,onTouchStart:e.onTouchStart,onTouchMove:e.onTouchMove,onTouchEnd:e.onTouchEnd},y.createElement(D2,{otherAttributes:v,title:h,desc:m,ref:t},y.createElement(VV,null,o)))});function py(){return py=Object.assign?Object.assign.bind():function(e){for(var t=1;ty.createElement(eX,{chartName:"AreaChart",defaultTooltipEventType:"axis",validateTooltipEventTypes:tX,tooltipPayloadSearcher:NW,categoricalChartProps:e,ref:t}));const nX="rgba(130,130,150,0.14)",F2="rgba(130,130,150,0.85)";function iX(e){if(e<=0)return 10;const t=Math.pow(10,Math.floor(Math.log10(e))),r=e/t;return(r<=1?1:r<=2?2:r<=5?5:10)*t}function zO(e,t){return`${t==="%"?Math.round(e):e>=1e3?`${(e/1e3).toFixed(1)}k`:Math.round(e).toString()}${t}`}function aX({active:e,payload:t,unit:r}){return!e||!(t!=null&&t.length)?null:l.jsx("div",{className:"rounded-lg border border-border/70 bg-popover/95 px-3 py-2 shadow-xl backdrop-blur",children:l.jsx("div",{className:"space-y-1",children:t.map(n=>l.jsxs("div",{className:"flex items-center gap-2 text-[11px] font-mono",children:[l.jsx("span",{className:"h-2 w-2 rounded-full",style:{background:n.color}}),l.jsx("span",{className:"uppercase tracking-wider text-muted-foreground",children:n.name}),l.jsx("span",{className:"ml-auto pl-3 font-bold tabular-nums text-foreground",children:zO(n.value,r)})]},n.dataKey))})})}function FO({data:e,series:t,unit:r="%",yMode:n="percent",height:a=176}){const o=e.reduce((u,f)=>t.reduce((h,m)=>Math.max(h,Number(f[m.key])||0),u),0),c=n==="percent"?Math.min(100,Math.max(25,Math.ceil(o*1.2/25)*25)):Math.max(iX(o*1.15),10);return l.jsx("div",{style:{height:a},className:"w-full",children:l.jsx(Qz,{width:"100%",height:"100%",children:l.jsxs(rX,{data:e,margin:{top:8,right:6,bottom:0,left:-12},children:[l.jsx("defs",{children:t.map(u=>l.jsxs("linearGradient",{id:`grad-${u.key}`,x1:"0",y1:"0",x2:"0",y2:"1",children:[l.jsx("stop",{offset:"0%",stopColor:u.color,stopOpacity:.22}),l.jsx("stop",{offset:"100%",stopColor:u.color,stopOpacity:0})]},u.key))}),l.jsx(cO,{vertical:!1,stroke:nX}),l.jsx(jO,{dataKey:"t",hide:!0}),l.jsx(SO,{domain:[0,c],ticks:[0,c/2,c],tickFormatter:u=>zO(u,r),width:42,axisLine:!1,tickLine:!1,tick:{fontSize:10,fill:F2}}),l.jsx(eK,{content:l.jsx(aX,{unit:r}),cursor:{stroke:F2,strokeOpacity:.4,strokeDasharray:"3 3"}}),t.map(u=>l.jsx(wO,{type:"monotone",dataKey:u.key,name:u.label,stroke:u.color,strokeWidth:2,fill:`url(#grad-${u.key})`,dot:!1,activeDot:{r:3,strokeWidth:0},isAnimationActive:!1,connectNulls:!0},u.key))]})})})}const oX=[{key:"cpu",label:"CPU",color:"#2dd4bf"},{key:"ram",label:"RAM",color:"#38bdf8"},{key:"gpu",label:"GPU",color:"#a78bfa"},{key:"disk",label:"Disk",color:"#fbbf24"}];function BO(){var c,u,f,h;const{sys:e,hist:t}=KD(),r=!!(e!=null&&e.gpu&&e.gpu.busy_percent!=null&&e.gpu.gtt_used!=null&&e.gpu.gtt_total!=null),n=oX.filter(m=>m.key!=="gpu"||r),a={cpu:(c=e==null?void 0:e.cpu)==null?void 0:c.percent,ram:(u=e==null?void 0:e.ram)==null?void 0:u.percent,gpu:r?e.gpu.busy_percent:null,disk:(f=e==null?void 0:e.disk)==null?void 0:f.percent},o={cpu:(h=e==null?void 0:e.cpu)!=null&&h.cores?`${e.cpu.cores} Cores`:"",ram:e?`${aa(e.ram.used)}/${aa(e.ram.total)} GB`:"",gpu:r?`${aa(e.gpu.gtt_used)}/${aa(e.gpu.gtt_total)} GB`:"",disk:e!=null&&e.disk?`${aa(e.disk.used)}/${aa(e.disk.total)} GB`:""};return l.jsxs("div",{className:"flex flex-col justify-between rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"mb-3 flex items-center gap-2",children:[l.jsx(Hn,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"System-Status"}),l.jsxs("span",{className:"ml-1 inline-flex items-center gap-1 text-[10px] font-medium text-muted-foreground/70",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"})," live"]})]}),e?l.jsxs(l.Fragment,{children:[l.jsx("div",{className:"mb-2 grid grid-cols-2 gap-x-4 gap-y-1.5",children:n.map(m=>l.jsxs("div",{className:"flex min-w-0 items-center gap-1.5",children:[l.jsx("span",{className:"h-2 w-2 shrink-0 rounded-full",style:{background:m.color}}),l.jsx("span",{className:"shrink-0 text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:m.label}),l.jsxs("span",{className:"shrink-0 font-mono text-xs font-bold tabular-nums text-foreground",children:[Math.round(a[m.key]??0),"%"]}),o[m.key]&&l.jsx("span",{className:"truncate font-mono text-[10px] text-muted-foreground/60",children:o[m.key]})]},m.key))}),l.jsx(FO,{data:t,series:n,unit:"%",yMode:"percent",height:176})]}):l.jsx("div",{className:"flex h-44 items-center justify-center text-xs text-muted-foreground",children:"Lade Systemdaten…"})]}),(e==null?void 0:e.temp)&&(e.temp.cpu||e.temp.gpu)&&l.jsxs("div",{className:"mt-3 flex gap-4 border-t border-border/30 pt-3 font-mono text-xs text-muted-foreground/80",children:[e.temp.cpu!=null&&l.jsxs("span",{children:["CPU Temp: ",e.temp.cpu," °C"]}),e.temp.gpu!=null&&l.jsxs("span",{children:["GPU Temp: ",e.temp.gpu," °C"]})]})]})}function du({label:e,value:t,tone:r}){return l.jsxs("div",{className:ee("flex items-center justify-between rounded-lg border px-3 py-1.5 text-xs",r==="alert"?"border-amber-500/30 bg-amber-500/5 font-semibold text-amber-400":r==="accent"?"border-primary/30 bg-primary/5 font-semibold text-primary":"border-border/30 bg-background/25 text-muted-foreground"),children:[l.jsx("span",{className:"flex items-center gap-1.5",children:e}),l.jsx("span",{className:"font-mono text-[10px]",children:t})]})}function sX(){var r;const{data:e}=vh(3e3),t=()=>window.dispatchEvent(new CustomEvent("open-system-drawer",{detail:{tab:"maintenance"}}));return l.jsxs("div",{className:"flex flex-col justify-between rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15",children:[l.jsxs("div",{className:"space-y-4",children:[l.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-2 border-b border-border/20 pb-2",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(D4,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"Updates & Pflege"})]}),(e==null?void 0:e.last_check)&&l.jsxs("span",{className:"font-mono text-[9px] text-muted-foreground/80",children:["Zuletzt gesucht: ",new Date(e.last_check*1e3).toLocaleString("de-DE",{day:"2-digit",month:"2-digit",hour:"2-digit",minute:"2-digit"})]})]}),e?l.jsxs("div",{className:"space-y-1.5",children:[l.jsx(du,{label:"OS-Pakete",tone:e.os>0?"alert":"muted",value:e.os>0?`${e.os} verfügbar`:"aktuell"}),l.jsx(du,{label:"Inferenz-Engine (llama.cpp)",tone:e.engine>0?"alert":"muted",value:e.engine>0?"Update verfügbar":"aktuell"}),l.jsx(du,{label:"Router (llama-swap)",tone:e.swap>0?"alert":"muted",value:e.swap>0?"Update verfügbar":"aktuell"}),l.jsx(du,{label:"Modell-Upgrades",tone:e.models>0?"accent":"muted",value:e.models>0?`${e.models} verfügbar`:"aktuell"}),(r=e.components)==null?void 0:r.map(n=>l.jsx(du,{tone:n.update===!0?"alert":"muted",label:l.jsxs(l.Fragment,{children:[n.name,n.reachable===!1&&l.jsx("span",{className:"text-[8px] font-bold uppercase text-red-400/80",children:"offline"})]}),value:n.update===!0?`Update: ${n.latest}`:n.update===!1?"aktuell":n.latest?`neueste: ${n.latest}`:"—"},n.key))]}):l.jsx("div",{className:"flex h-24 items-center justify-center text-xs text-muted-foreground",children:"Lade Updates..."})]}),l.jsxs("button",{onClick:t,className:"mt-4 flex h-9 w-full items-center justify-center gap-1.5 rounded-lg bg-primary text-xs font-semibold text-primary-foreground shadow-md shadow-primary/10 transition-all hover:opacity-90 cursor-pointer",children:["Updates verwalten & Pflege ",l.jsx(ch,{className:"h-3.5 w-3.5"})]})]})}function UO({type:e,title:t,message:r,defaultValue:n,autoValue:a,autoLabel:o,onConfirm:c,onCancel:u}){const f=y.useRef(null);return l.jsx("div",{className:"fixed inset-0 z-[99] bg-black/60 backdrop-blur-sm flex items-center justify-center p-4 overscroll-contain",role:"dialog","aria-modal":"true","aria-label":t,children:l.jsxs("div",{className:"w-full max-w-sm rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[l.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary",children:t}),l.jsx("button",{onClick:u||(()=>c()),"aria-label":"Schließen",className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:l.jsx(Wn,{className:"h-4 w-4","aria-hidden":"true"})})]}),l.jsx("p",{className:"text-xs text-muted-foreground leading-relaxed",children:r}),e==="prompt"&&l.jsxs("div",{className:"flex gap-2",children:[l.jsx("input",{ref:f,type:"text",defaultValue:n,"aria-label":t,className:"flex-1 h-9 px-3 text-xs bg-background/40 border border-border/60 rounded-lg outline-none focus:border-primary transition-colors text-foreground",autoFocus:!0,onKeyDown:h=>{var m;h.key==="Enter"&&c((m=f.current)==null?void 0:m.value)}}),a!==void 0&&l.jsx("button",{type:"button",onClick:()=>{f.current&&(f.current.value=a)},title:"Setup-bewussten Optimalwert eintragen",className:"h-9 px-3 shrink-0 text-xs font-semibold text-primary border border-primary/50 bg-primary/10 hover:bg-primary/20 rounded-lg transition-colors cursor-pointer",children:o||"Auto"})]}),l.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[(e==="confirm"||e==="prompt")&&l.jsx("button",{onClick:u,className:"h-8 px-4 flex items-center justify-center text-xs font-semibold text-muted-foreground border border-border/60 bg-background/20 hover:bg-accent rounded-lg transition-colors cursor-pointer",children:"Abbrechen"}),l.jsx("button",{onClick:()=>{var m;const h=e==="prompt"?(m=f.current)==null?void 0:m.value:void 0;c(h)},className:"h-8 px-4 flex items-center justify-center text-xs font-semibold text-primary-foreground bg-primary hover:bg-primary/95 rounded-lg transition-colors cursor-pointer",children:e==="confirm"?"Ja, fortfahren":e==="prompt"?"Übernehmen":"OK"})]})]})})}function Aa(){const[e,t]=y.useState(null),r=y.useCallback(()=>t(null),[]),n=y.useCallback((u,f,h)=>{t({type:"alert",title:u,message:f,onConfirm:()=>{t(null),h==null||h()}})},[]),a=y.useCallback((u,f,h,m)=>{t({type:"confirm",title:u,message:f,onConfirm:()=>{t(null),h()},onCancel:()=>{t(null),m==null||m()}})},[]),o=y.useCallback((u,f,h,m,g,v)=>{t({type:"prompt",title:u,message:f,defaultValue:h,autoValue:v==null?void 0:v.autoValue,autoLabel:v==null?void 0:v.autoLabel,onConfirm:b=>{t(null),m(b)},onCancel:()=>{t(null),g==null||g()}})},[]),c=e?l.jsx(UO,{...e}):null;return{showAlert:n,showConfirm:a,showPrompt:o,close:r,dialogElement:c}}function lX(){const e=Yn(),{data:t}=_y(3e3),{data:r}=Ni(),{showAlert:n,dialogElement:a}=Aa(),[o,c]=y.useState(!1),u=(r==null?void 0:r.models)??[];async function f(h){try{await Se("/api/agent/brain",{method:"POST",body:JSON.stringify({model:h})}),n("Erfolgreich",`Hermes-Gehirn wurde auf '${h}' geändert. Der Gateway-Dienst wurde neu gestartet.`),e.invalidateQueries({queryKey:Ve.agentStatus}),c(!1)}catch(m){n("Fehler",`Fehler beim Wechseln des Gehirns: ${m.message}`)}}return l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15 flex flex-col justify-between",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center justify-between mb-4",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(wn,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold tracking-wide uppercase text-foreground",children:"Hermes Agent"})]}),(t==null?void 0:t.terminal_url)&&l.jsxs("a",{href:Gs(t.terminal_url),target:"_blank",rel:"noopener",className:ee("flex items-center gap-1 px-3 py-1 rounded-lg text-xs font-medium transition-all",t.terminal_reachable?"bg-primary text-primary-foreground hover:opacity-90 shadow-md shadow-primary/20":"border border-border text-muted-foreground"),children:[l.jsx(Hs,{className:"h-3 w-3"})," Terminal öffnen"]})]}),t?l.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[l.jsxs("div",{className:"p-3 bg-background/20 rounded-xl border border-border/40",children:[l.jsx("div",{className:"text-[10px] text-muted-foreground uppercase font-semibold",children:"Gateway"}),l.jsxs("div",{className:"flex items-center gap-2 mt-1",children:[l.jsx("span",{className:ee("h-2 w-2 rounded-full",t.gateway_reachable?"bg-emerald-500 animate-pulse":"bg-amber-500")}),l.jsx("span",{className:"text-xs font-medium",children:t.gateway_reachable?"Online":"Offline"})]})]}),l.jsxs("div",{className:"p-3 bg-background/20 rounded-xl border border-border/40",children:[l.jsx("div",{className:"text-[10px] text-muted-foreground uppercase font-semibold",children:"Terminal"}),l.jsxs("div",{className:"flex items-center gap-2 mt-1",children:[l.jsx("span",{className:ee("h-2 w-2 rounded-full",t.terminal_reachable?"bg-emerald-500 animate-pulse":"bg-amber-500")}),l.jsx("span",{className:"text-xs font-medium",children:t.terminal_reachable?"Online":"Offline"})]})]}),l.jsxs("div",{onClick:()=>c(!0),className:"p-3 bg-background/20 rounded-xl border border-border/40 hover:border-primary/45 hover:bg-background/30 transition-all duration-300 cursor-pointer",children:[l.jsxs("div",{className:"flex justify-between items-center",children:[l.jsx("span",{className:"text-[10px] text-muted-foreground uppercase font-semibold",children:"Gehirn"}),l.jsx(Hn,{className:"h-3 w-3 text-primary"})]}),l.jsxs("div",{className:"text-xs font-medium mt-1 font-mono text-primary truncate flex items-center gap-1",children:[l.jsx(jy,{className:"h-3 w-3 shrink-0"}),t.brain_model||"auto"]})]}),l.jsxs("div",{className:"p-3 bg-background/20 rounded-xl border border-border/40",children:[l.jsxs("div",{className:"flex justify-between items-center",children:[l.jsx("span",{className:"text-[10px] text-muted-foreground uppercase font-semibold",children:"Verdrahtung"}),l.jsx(Qu,{className:"h-3 w-3 text-primary"})]}),l.jsxs("div",{className:"text-[10px] font-mono mt-1 space-y-0.5 text-muted-foreground",children:[l.jsxs("div",{children:["Config: ",t.has_config?l.jsx("span",{className:"text-emerald-400",children:"✓"}):"—"]}),l.jsxs("div",{children:["Skills: ",t.has_skills?l.jsx("span",{className:"text-emerald-400",children:"✓"}):"—"]}),l.jsxs("div",{children:["Memory: ",t.has_memories?l.jsx("span",{className:"text-emerald-400",children:"✓"}):"—"]})]})]})]}):l.jsx("div",{className:"h-28 flex items-center justify-center text-xs text-muted-foreground",children:"Lade Agenten-Status…"})]}),t&&l.jsxs("div",{className:"mt-3 border-t border-border/30 pt-3 space-y-1.5",children:[l.jsxs("div",{className:"flex items-center justify-between text-[10px] text-muted-foreground",children:[l.jsx("span",{children:"Telegram"}),l.jsx("span",{className:ee("font-semibold",t.telegram_enabled?"text-emerald-400":""),children:t.telegram_enabled?"aktiv":"nicht konfiguriert"})]}),l.jsxs("div",{className:"flex items-center justify-between text-[10px] text-muted-foreground",children:[l.jsx("span",{children:"MCP-Server"}),l.jsxs("span",{className:"font-semibold text-foreground",children:[t.mcp_server_count??0," verbunden"]})]}),l.jsxs("div",{className:"flex items-center justify-between text-[10px] text-muted-foreground",children:[l.jsx("span",{children:"PC Executor"}),l.jsx("span",{className:ee("font-semibold",t.pc_executor_reachable?"text-emerald-400":""),children:t.pc_executor_reachable?"erreichbar":"nicht verbunden"})]})]}),t&&o&&l.jsx("div",{className:"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm flex items-center justify-center p-4",children:l.jsxs("div",{className:"w-full max-w-md rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[l.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[l.jsxs("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary flex items-center gap-1.5",children:[l.jsx(Hn,{className:"h-4 w-4"}),l.jsx("span",{children:"Hermes-Gehirn konfigurieren"})]}),l.jsx("button",{onClick:()=>c(!1),className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:l.jsx(Wn,{className:"h-4 w-4"})})]}),l.jsxs("p",{className:"text-xs text-muted-foreground leading-relaxed",children:['Das „Gehirn" ist das primäre LLM für Hermes. Wähle ein Modell aus deiner Bibliothek oder nutze ein Gateway-Alias (',l.jsx("code",{className:"text-primary font-semibold",children:"auto"})," / ",l.jsx("code",{className:"text-primary font-semibold",children:"fast"})," / ",l.jsx("code",{className:"text-primary font-semibold",children:"heavy"}),"):"]}),l.jsx("div",{className:"space-y-1.5 max-h-60 overflow-y-auto pr-1",children:["auto","fast","heavy",...u.map(h=>{var m;return((m=h.name.split("/").pop())==null?void 0:m.replace(".gguf",""))||h.name})].map(h=>{const m=["auto","fast","heavy"].includes(h);return l.jsxs("button",{onClick:()=>f(h),className:ee("w-full text-left px-3 py-2.5 rounded-lg text-xs hover:bg-accent flex items-center justify-between font-mono cursor-pointer border border-border/30",t.brain_model===h||!t.brain_model&&h==="auto"?"text-primary font-bold bg-primary/10 border-primary/30":"text-foreground bg-background/20"),children:[l.jsxs("div",{className:"flex flex-col text-left",children:[l.jsx("span",{className:"font-semibold truncate max-w-[280px]",children:h}),l.jsx("span",{className:"text-[9px] text-muted-foreground mt-0.5",children:m?"Gateway Routing Alias":"Installiertes GGUF Modell"})]}),(t.brain_model===h||!t.brain_model&&h==="auto")&&l.jsx(sr,{className:"h-4 w-4 shrink-0 text-primary"})]},h)})})]})}),a]})}function uX(){const e=Yn(),{data:t=[]}=vv({limit:3}),[r,n]=y.useState(""),[a,o]=y.useState("stable"),[c,u]=y.useState(!1);async function f(){if(!(!r.trim()||c)){u(!0);try{await Se("/api/memory",{method:"POST",body:JSON.stringify({content:r,category:a,source:"dashboard"})}),n(""),e.invalidateQueries({queryKey:["memory"]})}catch(h){console.error(h)}finally{u(!1)}}}return l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15 flex flex-col justify-between",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center gap-2 mb-4",children:[l.jsx(Ao,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold tracking-wide uppercase text-foreground",children:"Gedächtnis"})]}),l.jsxs("div",{className:"space-y-3",children:[l.jsx("textarea",{value:r,onChange:h=>n(h.target.value),"aria-label":"Fakt oder Regel im Gedächtnis speichern",placeholder:"Fakt / Regel im Pool speichern…",rows:2,className:"w-full resize-none rounded-xl border border-border/50 bg-background/30 p-2 text-[10px] outline-none focus:ring-1 focus:ring-primary transition-all leading-normal"}),l.jsxs("div",{className:"flex items-center gap-2 justify-between",children:[l.jsxs("select",{value:a,onChange:h=>o(h.target.value),"aria-label":"Kategorie",className:"h-7 rounded-lg border border-border/50 bg-background/50 px-2 text-[10px] outline-none cursor-pointer",children:[l.jsx("option",{value:"stable",children:"🔵 Fakt"}),l.jsx("option",{value:"instruction",children:"📋 Regel"}),l.jsx("option",{value:"user",children:"👤 User"}),l.jsx("option",{value:"versioned",children:"🟡 Version"})]}),l.jsxs("button",{onClick:f,disabled:!r.trim()||c,className:"flex h-7 items-center gap-1 rounded-lg bg-primary px-3 text-[10px] font-semibold text-primary-foreground hover:opacity-90 disabled:opacity-50 transition-all cursor-pointer",children:[l.jsx(df,{className:"h-3.5 w-3.5"})," Speichern"]})]})]}),l.jsxs("div",{className:"mt-3.5 space-y-1.5",children:[l.jsx("div",{className:"text-[9px] text-muted-foreground uppercase font-bold tracking-wider",children:"Zuletzt gespeichert:"}),l.jsx("div",{className:"max-h-20 overflow-y-auto space-y-1 pr-1 scrollbar-thin",children:t.length===0?l.jsx("div",{className:"text-[10px] text-muted-foreground/75 py-1",children:"Keine Einträge vorhanden."}):t.map(h=>l.jsxs("div",{className:"text-[10px] bg-background/10 border border-border/30 rounded p-1.5 flex items-start gap-1.5",children:[l.jsx("span",{className:"shrink-0 text-[8px] font-mono text-muted-foreground/80 px-1 py-0.5 rounded bg-muted/20",children:h.category}),l.jsx("span",{className:"truncate flex-1 text-muted-foreground hover:text-foreground transition-colors",title:h.content,children:h.content})]},h.id))})]})]}),l.jsx("div",{className:"mt-4 text-[10px] text-muted-foreground/80 border-t border-border/30 pt-3",children:"Steht allen Clients per MCP zur Verfügung."})]})}const B2=[{key:"prompt",label:"Prompt",color:"#f59e0b"},{key:"completion",label:"Antwort",color:"#2dd4bf"}];function HO(){const{data:e}=Oy(3e3),t=HD(),r=t[t.length-1],n=r?Math.round(r.prompt+r.completion):0;return l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15",children:[l.jsxs("div",{className:"mb-3 flex items-start justify-between gap-3",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(uh,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"Token-Durchsatz"}),l.jsxs("span",{className:"ml-1 inline-flex items-center gap-1 text-[10px] font-medium text-muted-foreground/70",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"})," live"]})]}),e&&l.jsxs("div",{className:"mt-2 flex items-baseline gap-2",children:[l.jsx("span",{className:"font-space text-3xl font-bold tracking-tight text-foreground tabular-nums",children:n.toLocaleString("de-DE")}),l.jsx("span",{className:"text-xs text-muted-foreground",children:"tok/s aktuell"})]}),e&&l.jsxs("div",{className:"mt-0.5 space-y-0.5 font-mono text-[11px] text-muted-foreground/70",children:[l.jsxs("div",{children:[e.total_tokens.toLocaleString("de-DE")," Tokens gesamt · ",l.jsxs("span",{className:"text-emerald-400/90",children:[e.saved_eur.toLocaleString("de-DE",{minimumFractionDigits:2})," € gespart"]})]}),l.jsxs("div",{className:"text-muted-foreground/55",children:["Input ",e.prompt_tokens.toLocaleString("de-DE")," · Output ",e.completion_tokens.toLocaleString("de-DE")]})]})]}),l.jsx("div",{className:"flex shrink-0 flex-col items-end gap-1.5 pt-1",children:B2.map(a=>l.jsxs("div",{className:"flex items-center gap-1.5",children:[l.jsx("span",{className:"h-2 w-2 rounded-full",style:{background:a.color}}),l.jsx("span",{className:"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:a.label}),l.jsx("span",{className:"font-mono text-xs font-bold tabular-nums text-foreground",children:Math.round((r==null?void 0:r[a.key])??0)})]},a.key))})]}),e?l.jsx(FO,{data:t,series:B2,unit:" tok/s",yMode:"auto",height:150}):l.jsx("div",{className:"flex h-[150px] items-center justify-center text-xs text-muted-foreground",children:"Lade Durchsatz…"}),l.jsx("div",{className:"mt-2 border-t border-border/30 pt-2 text-[10px] text-muted-foreground/70",children:"Durchsatz aus dem Gateway abgeleitet (Prefill vs. Generierung). Flach bei Leerlauf."})]})}function cX(){const{data:e}=NE(3e3),{showAlert:t,dialogElement:r}=Aa(),[n,a]=y.useState({});async function o(c){a(u=>({...u,[c]:!0}));try{const u=await Se("/api/maintenance/restart",{method:"POST",body:JSON.stringify({service:c})});u.ok||t("Fehler",`Neustart fehlgeschlagen: ${u.err||"Unbekannt"}`)}catch(u){t("Fehler",`Fehler: ${u.message}`)}finally{a(u=>({...u,[c]:!1}))}}return l.jsxs("div",{className:"flex flex-col rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15",children:[l.jsxs("div",{className:"mb-3 flex items-center justify-between",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(ff,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"Dienste"})]}),l.jsx("button",{onClick:()=>window.dispatchEvent(new CustomEvent("open-system-drawer",{detail:{tab:"logs"}})),className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground transition-colors hover:text-primary cursor-pointer",children:"Logs / Pflege"})]}),e?l.jsxs("div",{className:"flex flex-1 flex-col",children:[l.jsx("div",{className:"space-y-1.5",children:e.services.map(c=>l.jsxs("div",{className:"group flex items-center justify-between gap-2 rounded-xl border border-border/30 bg-background/20 p-2.5",children:[l.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[l.jsx("span",{className:ee("h-2.5 w-2.5 shrink-0 rounded-full ring-2 ring-black/40",c.ok?"bg-emerald-500":"bg-amber-500")}),l.jsxs("div",{className:"min-w-0",children:[l.jsx("div",{className:"truncate text-xs font-bold text-foreground",children:c.name}),l.jsx("div",{className:"truncate font-mono text-[9px] text-muted-foreground/60",children:c.url})]})]}),l.jsx("button",{onClick:()=>o(c.name),disabled:n[c.name],className:"flex h-7 w-7 shrink-0 items-center justify-center rounded-lg border border-border/40 text-muted-foreground opacity-0 transition-all hover:bg-primary/5 hover:text-primary group-hover:opacity-100",title:"Dienst neu starten",children:l.jsx(Xa,{className:ee("h-3.5 w-3.5",n[c.name]&&"animate-spin")})})]},c.name))}),l.jsxs("div",{className:"mt-auto flex flex-wrap gap-3 border-t border-border/20 pt-2.5 text-[10px] font-semibold text-muted-foreground",children:[l.jsxs("a",{href:Gs(e.links.engine_ui),target:"_blank",rel:"noopener",className:"flex items-center gap-1 rounded px-1.5 py-0.5 text-primary transition-colors hover:bg-primary/10",children:[l.jsx(Hs,{className:"h-3 w-3"})," Engine"]}),l.jsxs("a",{href:Gs(e.links.gateway),target:"_blank",rel:"noopener",className:"flex items-center gap-1 rounded px-1.5 py-0.5 text-primary transition-colors hover:bg-primary/10",children:[l.jsx(Hs,{className:"h-3 w-3"})," Gateway"]})]})]}):l.jsx("div",{className:"flex h-24 items-center justify-center text-xs text-muted-foreground",children:"Lade Dienste…"}),r]})}const Hg=[{key:"stt",label:"STT",hint:"Sprache → Text"},{key:"vision",label:"Bildschirm-Sicht",hint:"Vision-Beschreibung"},{key:"chat_ttfb",label:"Chat-TTFB",hint:"Zeit bis 1. Token"},{key:"tts",label:"TTS",hint:"Text → Sprache"}];function qd(e){return e==null?"—":e>=1e3?`${(e/1e3).toFixed(2)} s`:`${Math.round(e)} ms`}function dX({stat:e,label:t,hint:r,maxP95:n}){const a=!!e&&e.count>0,o=a&&e.p95_ms&&n>0?Math.max(4,Math.min(100,e.p95_ms/n*100)):0;return l.jsxs("div",{className:"space-y-1.5",children:[l.jsxs("div",{className:"flex items-baseline justify-between gap-2",children:[l.jsxs("div",{className:"flex items-baseline gap-2 min-w-0",children:[l.jsx("span",{className:"text-xs font-semibold text-foreground",children:t}),l.jsx("span",{className:"truncate text-[10px] text-muted-foreground/60",children:r})]}),a?l.jsx("span",{className:"shrink-0 font-mono text-sm font-bold tabular-nums text-foreground",children:qd(e.p50_ms)}):l.jsx("span",{className:"shrink-0 text-[10px] italic text-muted-foreground/50",children:"noch keine Messungen"})]}),l.jsx("div",{className:"h-1.5 w-full overflow-hidden rounded-full bg-background/50 border border-border/30",children:l.jsx("div",{className:"h-full rounded-full bg-gradient-to-r from-teal-500 to-indigo-500 transition-all duration-500",style:{width:`${o}%`}})}),a&&l.jsxs("div",{className:"flex items-center gap-3 font-mono text-[10px] text-muted-foreground/65",children:[l.jsxs("span",{children:["p50 ",qd(e.p50_ms)]}),l.jsxs("span",{children:["p95 ",qd(e.p95_ms)]}),l.jsxs("span",{children:["zuletzt ",qd(e.last_ms)]}),l.jsxs("span",{className:"text-muted-foreground/45",children:["· n=",e.count]})]})]})}function WO(){const{data:e}=ID(5e3),t=Math.max(1,...Hg.map(n=>{var a;return((a=e==null?void 0:e[n.key])==null?void 0:a.p95_ms)??0})),r=Hg.some(n=>{var a;return(((a=e==null?void 0:e[n.key])==null?void 0:a.count)??0)>0});return l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15",children:[l.jsxs("div",{className:"mb-4 flex items-center gap-2",children:[l.jsx(_N,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"Sprach-Latenz"}),l.jsxs("span",{className:"ml-1 inline-flex items-center gap-1 text-[10px] font-medium text-muted-foreground/70",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"})," live"]})]}),l.jsx("div",{className:"grid gap-4 sm:grid-cols-2",children:Hg.map(n=>l.jsx(dX,{stat:e==null?void 0:e[n.key],label:n.label,hint:n.hint,maxP95:t},n.key))}),l.jsx("div",{className:"mt-4 border-t border-border/30 pt-2 text-[10px] text-muted-foreground/70",children:r?"Server-seitige Dauer je Pipeline-Stufe (p50 prominent). Rollender Schnitt über die letzten Turns; Reset bei Neustart.":"Noch keine Voice-Turns gemessen — sprich einmal über den „Sprechen“-Tab, dann erscheinen hier STT/Vision/Chat/TTS."})]})}const KO=[{role:"hermes",label:"Lucys Hirn",short:"Hirn",icon:Ao,desc:"Lucys Alltags-Verstand — denkt und redet mit dir. Immer bereit.",tone:"bg-indigo-500/15 text-indigo-400 border-indigo-500/25",protected:!0},{role:"embed",label:"Lucys Gedächtnis",short:"Gedächtnis",icon:CN,desc:"Merkt sich Wichtiges und findet es später wieder.",tone:"bg-emerald-500/15 text-emerald-400 border-emerald-500/25",protected:!0},{role:"vision",label:"Lucys Augen",short:"Augen",icon:uf,desc:"Sieht Bilder und Screenshots und beschreibt, was drauf ist.",tone:"bg-pink-500/15 text-pink-400 border-pink-500/25"},{role:"heavy",label:"Großes Hirn",short:"Groß",icon:Y3,desc:"Das schwere Geschütz — wird für besonders knifflige Fragen dazugeholt.",tone:"bg-amber-500/15 text-amber-400 border-amber-500/25"},{role:"coder-lite",label:"Programmierer (schnell)",short:"Code schnell",icon:Bs,desc:"Schnelles Programmieren im Alltag.",tone:"bg-violet-500/15 text-violet-400 border-violet-500/25"},{role:"coder",label:"Programmierer (gründlich)",short:"Code gründlich",icon:Bs,desc:"Schreibt und prüft Code besonders sorgfältig — für schwere Coding-Aufgaben.",tone:"bg-fuchsia-500/15 text-fuchsia-400 border-fuchsia-500/25"},{role:"scout",label:"Späher",short:"Späher",icon:B4,desc:"Schneller erster Blick und grobe Einschätzung.",tone:"bg-teal-500/15 text-teal-400 border-teal-500/25"}],GO=KO.map(e=>e.role),U2=Object.fromEntries(KO.map(e=>[e.role,e])),H2=e=>({role:e||"?",label:e||"unbekannt",short:e||"?",icon:Ao,desc:"Rolle ohne hinterlegten Klartext-Namen.",tone:"bg-slate-500/15 text-slate-300 border-slate-500/25"}),fX={fast:"hermes",coder_lite:"coder-lite"};function mr(e){return e&&(U2[e]||U2[fX[e]])||H2(e)}function io({role:e,dense:t=!1,className:r}){const n=mr(e),a=n.icon;return l.jsxs("span",{className:ee("inline-flex items-center gap-1 rounded px-1.5 py-0.5 text-[10px] font-semibold border tracking-wide",n.tone,r),title:`${n.desc} (${n.role})`,children:[l.jsx(a,{className:"h-3 w-3 shrink-0","aria-hidden":"true"}),t?n.short:n.label]})}function hX({fit:e}){const t={perfect:"bg-emerald-500/15 text-emerald-400 border border-emerald-500/20",marginal:"bg-amber-500/15 text-amber-400 border border-amber-500/20",too_tight:"bg-red-500/15 text-red-400 border border-red-500/20"}[e.level];return l.jsxs("span",{className:ee("rounded px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wider font-mono",t),children:[e.text," • ",e.req_gb," GB RAM"]})}function W2(e){const t=e.toLowerCase();return t.includes("qwen")?{name:"Qwen",color:"bg-purple-500/20 text-purple-300 border-purple-500/30",initial:"Q"}:t.includes("gemma")?{name:"Gemma",color:"bg-blue-500/20 text-blue-300 border-blue-500/30",initial:"G"}:t.includes("llama")?{name:"Llama",color:"bg-red-500/20 text-red-300 border-red-500/30",initial:"🦙"}:t.includes("mistral")||t.includes("mixtral")?{name:"Mistral",color:"bg-orange-500/20 text-orange-300 border-orange-500/30",initial:"M"}:t.includes("deepseek")?{name:"DeepSeek",color:"bg-cyan-500/20 text-cyan-300 border-cyan-500/30",initial:"D"}:t.includes("hermes")||t.includes("nous")?{name:"Hermes",color:"bg-amber-500/20 text-amber-300 border-amber-500/30",initial:"H"}:t.includes("phi")?{name:"Phi",color:"bg-emerald-500/20 text-emerald-300 border-emerald-500/30",initial:"Φ"}:{name:"Other",color:"bg-slate-500/20 text-slate-300 border-slate-500/30",initial:"AI"}}function mX(){var b,j,k;const{data:e}=Ni(2e3),{data:t}=Oy(2e3),{data:r}=Po(),n=(e==null?void 0:e.models)??[],a=(e==null?void 0:e.running)??[],o=((b=r==null?void 0:r.gpu)==null?void 0:b.gtt_total)||((j=r==null?void 0:r.gpu)==null?void 0:j.vram_total)||0,c=((k=r==null?void 0:r.gpu)==null?void 0:k.gtt_used)||0,u=o>0?Math.min(100,c/o*100):0,f=u>=88?"bg-red-500":u>=70?"bg-amber-500":"bg-teal-500",h=u>=88?"text-red-400":u>=70?"text-amber-400":"text-foreground",m=y.useRef(null),[g,v]=y.useState(!1);return y.useEffect(()=>{if(!t)return;const S=t.total_tokens;if(m.current!==null&&S>m.current){v(!0);const N=setTimeout(()=>v(!1),4e3);return m.current=S,()=>clearTimeout(N)}m.current=S},[t==null?void 0:t.total_tokens]),l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15 flex flex-col",children:[l.jsxs("div",{className:"flex items-center justify-between mb-4",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(lf,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold tracking-wide uppercase text-foreground",children:"Modelle"})]}),l.jsxs("span",{className:ee("flex items-center gap-1.5 text-[10px] font-bold uppercase tracking-wider font-mono px-2 py-0.5 rounded-full border transition-colors",g?"bg-emerald-500/10 text-emerald-400 border-emerald-500/30":"bg-background/30 text-muted-foreground/70 border-border/40"),children:[g?l.jsx(xa,{className:"h-3 w-3 animate-pulse"}):l.jsx(N4,{className:"h-3 w-3"}),g?"Inferenz aktiv":"Idle"]})]}),o>0&&l.jsxs("div",{className:"mb-4",children:[l.jsxs("div",{className:"flex items-center justify-between text-[10px] font-mono text-muted-foreground/80 mb-1",children:[l.jsx("span",{className:"uppercase tracking-wider font-semibold",children:"Speicher-Pool"}),l.jsxs("span",{children:[l.jsx("span",{className:ee("font-bold",h),children:aa(c)})," / ",aa(o)," GB belegt"]})]}),l.jsx("div",{className:"h-1.5 w-full rounded-full bg-background/50 border border-border/30 overflow-hidden",children:l.jsx("div",{className:ee("h-full rounded-full transition-all duration-500",f),style:{width:`${u}%`}})})]}),l.jsx("div",{className:"space-y-2 flex-1",children:GO.map(S=>{var A;const N=n.find(P=>P.role===S),E=N?a.includes(N.name):!1;return l.jsxs("div",{className:ee("flex items-center justify-between gap-2 p-2 rounded-xl border transition-all duration-300",E?"border-emerald-500/30 bg-emerald-500/5 shadow-sm shadow-emerald-500/5":N?"border-primary/20 bg-primary/5":"border-border/30 bg-background/10 opacity-60"),children:[l.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[l.jsx(io,{role:S,className:"shrink-0"}),l.jsxs("div",{className:"flex flex-col min-w-0",children:[l.jsx("span",{className:"text-xs font-semibold truncate font-mono text-foreground",children:N?(A=N.name.split("/").pop())==null?void 0:A.replace(/\.gguf$/i,""):"nicht zugewiesen"}),N&&l.jsxs("div",{className:"flex gap-1 items-center mt-0.5 flex-wrap text-muted-foreground/70",children:[l.jsx("span",{className:"text-[9px] font-mono",children:Lr(N.size_bytes)}),N.prompt_cache&&l.jsx("span",{className:"text-[7px] leading-none font-mono font-bold bg-cyan-500/10 text-cyan-400 border border-cyan-500/20 px-1 py-0.5 rounded",title:"Prompt Caching aktiv",children:"PC"}),N.spec_active&&l.jsx("span",{className:"text-[7px] leading-none font-mono font-bold bg-emerald-500/10 text-emerald-400 border border-emerald-500/20 px-1 py-0.5 rounded",title:`Speculative Decoding aktiv (Draft: ${N.spec_draft_model})`,children:"SPEC"}),N.parallel_slots>1&&l.jsxs("span",{className:"text-[7px] leading-none font-mono font-bold bg-violet-500/10 text-violet-400 border border-violet-500/20 px-1 py-0.5 rounded",title:`${N.parallel_slots} parallele Slots aktiv`,children:["SLOTS: ",N.parallel_slots]}),N.incomplete&&l.jsx("span",{className:"text-[7px] leading-none font-mono font-bold bg-amber-500/10 text-amber-400 border border-amber-500/20 px-1 py-0.5 rounded",title:"GGUF-Datei fehlt",children:"⚠ fehlt"})]})]})]}),l.jsx("span",{className:"shrink-0",children:N?E?l.jsxs("span",{className:"flex items-center gap-1 text-[8px] font-semibold text-emerald-400 uppercase tracking-wider font-mono",children:[l.jsx("span",{className:ee("h-1.5 w-1.5 rounded-full bg-emerald-500",g&&"animate-pulse")})," warm"]}):l.jsx("span",{className:"text-[8px] font-semibold text-muted-foreground uppercase tracking-wider font-mono",children:"bereit"}):l.jsx("span",{className:"text-[8px] font-semibold text-muted-foreground/60 uppercase tracking-wider font-mono",children:"—"})})]},S)})}),l.jsx("div",{className:"mt-4 text-[10px] text-muted-foreground/80 border-t border-border/30 pt-3",children:"Laden erfolgt automatisch per Auto-Swap. Details & Routing im Modell-Manager."})]})}function pX(){var P,_,O,D,U,B;const{data:e}=Py(),{data:t}=NE(),{data:r}=Ni(),{data:n}=Po(),a=!!e&&!!t,o=F=>{var Y;return(Y=t==null?void 0:t.services.find(H=>H.name.toLowerCase().includes(F)))==null?void 0:Y.ok},c=e==null?void 0:e.engine_reachable,u=(P=e==null?void 0:e.brain)==null?void 0:P.ready,f=((_=e==null?void 0:e.brain)==null?void 0:_.model)||((O=r==null?void 0:r.models.find(F=>F.role==="hermes"))==null?void 0:O.name)||"",h=[];h.push((()=>{const F={id:"brain",label:"Lucys Hirn",icon:Ao,critical:!0};return a?c===!1?{...F,status:"down",detail:"Die Motor-Maschine (Engine) läuft nicht — Lucy kann gerade gar nicht denken.",repair:{kind:"restart",service:"llama-swap",label:"Motor neu starten",needsSudo:!0}}:u===!1?{...F,status:"down",detail:"Lucys Hirn ist gerade eingeschlafen — einmal aufwecken.",repair:f?{kind:"loadModel",model:f,label:"Hirn aufwecken"}:void 0}:{...F,status:"ok",detail:"Wach und ansprechbar."}:{...F,status:"loading",detail:"Wird geprüft …"}})()),h.push((()=>{const F={id:"memory",label:"Lucys Gedächtnis",icon:CN,critical:!0},Y=o("mem0");return!a||Y===void 0?{...F,status:"loading",detail:"Wird geprüft …"}:Y?{...F,status:"ok",detail:"Merkt sich Neues und findet Altes wieder."}:{...F,status:"down",detail:"Lucy kann sich gerade nichts merken — das Gedächtnis antwortet nicht.",repair:{kind:"restart",service:"mem0-service",label:"Gedächtnis neu starten"}}})()),h.push((()=>{const F={id:"gateway",label:"Verbindung (Gateway)",icon:cf,critical:!0},Y=e?e.gateway_reachable:o("integriert");return!a||Y===void 0?{...F,status:"loading",detail:"Wird geprüft …"}:Y?{...F,status:"ok",detail:"Apps und IDEs können Lucy erreichen."}:{...F,status:"down",detail:"Die Verbindungs-Zentrale antwortet nicht — Apps erreichen Lucy nicht.",repair:{kind:"restart",service:"mission-control-2",label:"Zentrale neu starten"}}})()),h.push((()=>{const F={id:"agent",label:"Lucys Agent (Hermes)",icon:wn,critical:!0},Y=o("hermes-gateway");return!a||Y===void 0?{...F,status:"loading",detail:"Wird geprüft …"}:Y?{...F,status:"ok",detail:"Lucy ist bereit zu reden und zu handeln."}:{...F,status:"down",detail:"Lucys Agent ist offline — sie reagiert gerade nicht.",repair:{kind:"restart",service:"hermes-gateway",label:"Agent neu starten"}}})()),h.push((()=>{const F={id:"voice",label:"Lucys Stimme",icon:S4,critical:!1},Y=o("voice");return!a||Y===void 0?{...F,status:"loading",detail:"Wird geprüft …"}:Y?{...F,status:"ok",detail:"Lucy kann hören und sprechen."}:{...F,status:"warn",detail:"Sprechen ist gerade aus — Tippen geht weiter normal.",repair:{kind:"restart",service:"voice-service",label:"Stimme neu starten"}}})());const m=((D=n==null?void 0:n.gpu)==null?void 0:D.gtt_total)||((U=n==null?void 0:n.gpu)==null?void 0:U.vram_total)||0,g=((B=n==null?void 0:n.gpu)==null?void 0:B.gtt_used)||0,v=m>0?Math.min(100,g/m*100):0,b=1024**3,j=m?v>=90?{status:"full",usedGb:g/b,totalGb:m/b,pct:v,text:"Speicher fast voll — Lucy könnte langsamer werden."}:v>=72?{status:"warn",usedGb:g/b,totalGb:m/b,pct:v,text:"Speicher gut gefüllt — noch okay."}:{status:"ok",usedGb:g/b,totalGb:m/b,pct:v,text:"Genug Speicher frei."}:{status:"unknown",usedGb:0,totalGb:0,pct:0,text:"Speicher-Auslastung unbekannt."},k=h.some(F=>F.status==="loading"),S=h.filter(F=>F.critical&&F.status==="down"),N=h.filter(F=>F.status==="warn"||!F.critical&&F.status==="down"),E=j.status==="full";return{verdict:k&&!S.length?"loading":S.length?"problem":N.length||E?"warn":"gut",checks:h,memory:j,problems:S}}const gX={ok:"bg-emerald-500",warn:"bg-amber-500",down:"bg-red-500",loading:"bg-muted-foreground/40"};function VO({frame:e="lucy"}={}){const{verdict:t,checks:r,memory:n,problems:a}=pX(),{showAlert:o,dialogElement:c}=Aa(),u=Yn(),[f,h]=y.useState({});async function m(S,N){h(E=>({...E,[S]:!0}));try{if(N.kind==="loadModel")await Se(`/api/models/${encodeURIComponent(N.model)}/load`,{method:"POST"});else{const E=await Se("/api/maintenance/restart",{method:"POST",body:JSON.stringify({service:N.service})});E.ok||o("Reparatur nicht ganz geklappt",(E.err||"Unbekannter Fehler")+(N.needsSudo?` -Tipp: Dafür wird evtl. das Box-Passwort gebraucht (oben rechts hinterlegen).`:""))}u.invalidateQueries({queryKey:Ve.health}),u.invalidateQueries({queryKey:Ve.services}),u.invalidateQueries({queryKey:Ve.models})}catch(E){o("Reparatur fehlgeschlagen",String((E==null?void 0:E.message)||E))}finally{h(E=>({...E,[S]:!1}))}}const g=e==="box"?{loading:"Box wird geprüft …",gut:"Alles okay",warn:"Kleinigkeit an der Box",problem:"Box braucht Hilfe"}:{loading:"Lucy wird geprüft …",gut:"Lucy geht's gut 💚",warn:"Kleinigkeit bei Lucy",problem:"Lucy braucht Hilfe"},v={loading:{ring:"border-border/60 bg-card/45",icon:dh,iconCls:"text-muted-foreground animate-spin",title:g.loading,sub:"Einen Moment, ich schaue nach dem Rechten."},gut:{ring:"border-emerald-500/40 bg-emerald-500/5",icon:h4,iconCls:"text-emerald-400",title:g.gut,sub:"Alle wichtigen Fähigkeiten laufen."},warn:{ring:"border-amber-500/40 bg-amber-500/5",icon:bi,iconCls:"text-amber-400",title:g.warn,sub:"Nichts Schlimmes — nur ein Hinweis."},problem:{ring:"border-red-500/50 bg-red-500/5",icon:bi,iconCls:"text-red-400",title:g.problem,sub:`${a.length} wichtige${a.length===1?"s":""} Problem${a.length===1?"":"e"} gefunden.`}}[t],b=v.icon,j={ok:"bg-emerald-500",warn:"bg-amber-500",full:"bg-red-500",unknown:"bg-muted-foreground/40"}[n.status],k={ok:"text-emerald-400",warn:"text-amber-400",full:"text-red-400",unknown:"text-muted-foreground"}[n.status];return l.jsxs("div",{className:ee("rounded-2xl border p-5 shadow-lg shadow-black/15 backdrop-blur-md transition-colors",v.ring),children:[l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsx("div",{className:"flex h-11 w-11 shrink-0 items-center justify-center rounded-xl border border-border/40 bg-background/30",children:l.jsx(b,{className:ee("h-6 w-6",v.iconCls)})}),l.jsxs("div",{className:"min-w-0",children:[l.jsx("h2",{className:"text-base font-bold tracking-tight text-foreground",children:v.title}),l.jsx("p",{className:"text-xs text-muted-foreground",children:v.sub})]})]}),l.jsxs("div",{className:"mt-4 rounded-xl border border-border/30 bg-background/20 p-3",children:[l.jsxs("div",{className:"mb-1.5 flex items-center justify-between text-[11px]",children:[l.jsxs("span",{className:"flex items-center gap-1.5 font-semibold uppercase tracking-wider text-muted-foreground",children:[l.jsx(yu,{className:"h-3.5 w-3.5"})," Speicher"]}),l.jsx("span",{className:ee("font-mono font-bold",k),children:n.status==="unknown"?"—":`${n.usedGb.toFixed(0)} / ${n.totalGb.toFixed(0)} GB`})]}),l.jsx("div",{className:"h-2 w-full overflow-hidden rounded-full border border-border/30 bg-background/50",children:l.jsx("div",{className:ee("h-full rounded-full transition-all duration-500",j),style:{width:`${n.pct}%`}})}),l.jsx("p",{className:ee("mt-1.5 text-[11px]",k),children:n.text})]}),l.jsx("div",{className:"mt-4 space-y-1.5",children:r.map(S=>l.jsx(vX,{c:S,busy:!!f[S.id],onRepair:()=>S.repair&&m(S.id,S.repair)},S.id))}),c]})}function vX({c:e,busy:t,onRepair:r}){const n=e.icon,a=e.status==="down"||e.status==="warn";return l.jsxs("div",{className:ee("flex items-center justify-between gap-3 rounded-xl border p-2.5 transition-colors",e.status==="down"?"border-red-500/25 bg-red-500/5":e.status==="warn"?"border-amber-500/20 bg-amber-500/5":"border-border/30 bg-background/15"),children:[l.jsxs("div",{className:"flex min-w-0 items-center gap-2.5",children:[l.jsxs("span",{className:"relative flex h-8 w-8 shrink-0 items-center justify-center rounded-lg border border-border/40 bg-background/30 text-foreground/80",children:[l.jsx(n,{className:"h-4 w-4"}),l.jsx("span",{className:ee("absolute -right-0.5 -top-0.5 h-2.5 w-2.5 rounded-full ring-2 ring-black/40",gX[e.status],e.status==="down"&&"animate-pulse")})]}),l.jsxs("div",{className:"min-w-0",children:[l.jsxs("div",{className:"flex items-center gap-1.5 text-xs font-bold text-foreground",children:[e.label,e.status==="ok"&&l.jsx(sr,{className:"h-3 w-3 text-emerald-400"}),!e.critical&&l.jsx("span",{className:"rounded bg-background/40 px-1 py-0.5 text-[8px] font-semibold uppercase tracking-wider text-muted-foreground/60",children:"optional"})]}),l.jsx("div",{className:"truncate text-[11px] text-muted-foreground",children:e.detail})]})]}),a&&e.repair&&l.jsxs("button",{onClick:r,disabled:t,className:ee("flex h-8 shrink-0 items-center gap-1.5 rounded-lg border px-2.5 text-[10px] font-bold uppercase tracking-wide transition-all cursor-pointer disabled:opacity-60",e.status==="down"?"border-red-500/40 bg-red-500/10 text-red-300 hover:bg-red-500/20":"border-amber-500/40 bg-amber-500/10 text-amber-300 hover:bg-amber-500/20"),title:e.repair.label,children:[t?l.jsx(dh,{className:"h-3.5 w-3.5 animate-spin"}):l.jsx(Qu,{className:"h-3.5 w-3.5"}),e.repair.label]}),a&&!e.repair&&l.jsxs("span",{className:"flex shrink-0 items-center gap-1 text-[10px] font-semibold text-muted-foreground",title:"Keine Auto-Reparatur bekannt",children:[l.jsx(L4,{className:"h-3.5 w-3.5"})," manuell"]})]})}function W2({children:e}){return l.jsx("p",{className:"mb-2 ml-0.5 text-[11px] font-semibold uppercase tracking-wider text-muted-foreground/60",children:e})}function yX(){return l.jsxs("div",{className:"space-y-7",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Zentrale"}),l.jsx("p",{className:"text-sm text-muted-foreground",children:"Aktueller Status von System, Modellen und Agent."})]}),l.jsx(VO,{}),l.jsxs("div",{className:"grid items-stretch gap-6 lg:grid-cols-3",children:[l.jsx(BO,{}),l.jsx(HO,{}),l.jsx(mX,{})]}),l.jsxs("section",{children:[l.jsx(W2,{children:"Stack & Telemetrie"}),l.jsxs("div",{className:"grid gap-6 md:grid-cols-2",children:[l.jsx(cX,{}),l.jsx(WO,{})]})]}),l.jsxs("section",{children:[l.jsx(W2,{children:"Betrieb & Wissen"}),l.jsxs("div",{className:"grid gap-6 md:grid-cols-3",children:[l.jsx(sX,{}),l.jsx(lX,{}),l.jsx(uX,{})]})]})]})}function xX(){const e=Yn(),{data:t=[]}=DD(2e3),{showAlert:r,dialogElement:n}=Aa();async function a(u){try{await Se(`/api/jobs/${u}/cancel`,{method:"POST"}),e.invalidateQueries({queryKey:Ve.jobs})}catch(f){r("Fehler",f.message)}}const o=t.filter(u=>u.state==="running"||u.state==="queued"),c=t.filter(u=>u.state!=="running"&&u.state!=="queued").slice(-3);return o.length===0&&c.length===0?null:l.jsxs("div",{className:"space-y-3 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-4 shadow-lg shadow-black/10",children:[l.jsx("div",{className:"text-[11px] font-semibold text-muted-foreground uppercase tracking-wider",children:"Aktive Downloads"}),o.map(u=>l.jsxs("div",{className:"space-y-1.5 p-3 rounded-xl bg-background/20 border border-border/40",children:[l.jsxs("div",{className:"flex justify-between items-center text-xs",children:[l.jsx("span",{className:"font-semibold truncate max-w-[250px]",children:u.label}),l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsxs("span",{className:"text-muted-foreground font-mono",children:[u.progress??0,"% • ",wv(u.done_bytes),"/",wv(u.total_bytes),u.eta_s?` • ETA ${GD(u.eta_s)}`:""]}),l.jsx("button",{onClick:()=>a(u.id),className:"text-[10px] text-red-400 hover:text-red-300 font-semibold border border-red-500/25 bg-red-500/5 px-2 py-0.5 rounded transition-all cursor-pointer",children:"Abbrechen"})]})]}),l.jsx("div",{className:"h-1.5 overflow-hidden rounded-full bg-muted",children:l.jsx("div",{className:"h-full rounded-full bg-primary transition-all duration-500",style:{width:`${u.progress??0}%`}})})]},u.id)),c.map(u=>l.jsxs("div",{className:"flex justify-between items-center text-xs text-muted-foreground px-1",children:[l.jsx("span",{className:"truncate",children:u.label}),l.jsx("span",{className:ee("font-semibold text-[10px] px-1.5 py-0.5 rounded uppercase font-mono",u.state==="done"?"bg-emerald-500/10 text-emerald-400":"bg-amber-500/10 text-amber-400"),children:u.state})]},u.id)),n]})}function Ga({children:e,tone:t="muted"}){const r={muted:"bg-muted text-muted-foreground",primary:"bg-primary/15 text-primary",warn:"bg-amber-500/15 text-amber-500"};return l.jsx("span",{className:`rounded px-1.5 py-0.5 text-[11px] font-medium ${r[t]}`,children:e})}function K2({caps:e}){return e?l.jsxs("span",{className:"inline-flex flex-wrap gap-1",children:[e.coder&&l.jsx(Ga,{children:"💻 Code"}),e.vision&&l.jsx(Ga,{children:"👁 Bild"}),e.reasoning&&l.jsx(Ga,{children:"🧠 Reason"}),e.moe&&l.jsxs(Ga,{tone:"primary",children:["🧩 MoE",e.active_b?`·${e.active_b}b`:""]}),e.tools==="yes"&&l.jsx(Ga,{tone:"primary",children:"🛠 Tools"}),e.tools==="likely"&&l.jsx(Ga,{tone:"warn",children:"🛠 Tools?"}),e.embedding&&l.jsx(Ga,{children:"🔢 Embed"})]}):null}function bX({model:e,onClose:t,onChanged:r}){var k,S;const{data:n,isLoading:a}=LD(e.gguf_path),[o,c]=y.useState(null),[u,f]=y.useState(""),h=n==null?void 0:n.target_vocab,m=(n==null?void 0:n.drafts)??[],g=m.filter(N=>N.compatible===!0),v=e.spec_draft_model;async function b(N){c(N??"__clear__"),f("");try{await Se(`/api/models/${encodeURIComponent(e.name)}/draft`,{method:"POST",body:JSON.stringify({draft_path:N})}),r(),t()}catch(E){f(String((E==null?void 0:E.message)||E)),c(null)}}const j=N=>{var E;return N?`${N.pre??"?"} · ${((E=N.n_vocab)==null?void 0:E.toLocaleString())??"?"} Tokens`:"—"};return l.jsx("div",{className:"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm flex items-center justify-center p-4",children:l.jsxs("div",{className:"w-full max-w-lg rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[l.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[l.jsxs("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary flex items-center gap-2",children:[l.jsx(xa,{className:"h-4 w-4"})," Speculative Draft"]}),l.jsx("button",{onClick:t,className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:l.jsx(Wn,{className:"h-4 w-4"})})]}),l.jsxs("div",{className:"text-xs text-muted-foreground leading-relaxed",children:['Beschleunigt die Token-Generierung mit einem kleinen "Draft"-Modell. Voraussetzung: der Draft muss den ',l.jsx("strong",{className:"text-foreground",children:"exakt gleichen Tokenizer (Vocab)"})," haben wie das Modell — sonst lehnt llama.cpp es ab."]}),l.jsxs("div",{className:"rounded-lg border border-border/40 bg-background/30 px-3 py-2 text-[11px] font-mono flex items-center justify-between",children:[l.jsx("span",{className:"text-muted-foreground",children:(k=e.name.split("/").pop())==null?void 0:k.replace(/\.gguf$/i,"")}),l.jsxs("span",{className:"text-foreground",children:["Vocab: ",j(h)]})]}),e.spec_active&&v&&l.jsxs("div",{className:"rounded-lg border border-emerald-500/30 bg-emerald-500/5 px-3 py-2 flex items-center justify-between gap-2",children:[l.jsxs("span",{className:"text-[11px] text-emerald-400 font-mono flex items-center gap-1.5 truncate",children:[l.jsx(sr,{className:"h-3.5 w-3.5 shrink-0"})," Aktiv: ",v]}),l.jsx("button",{onClick:()=>b(null),disabled:o!==null,className:"h-6 px-2.5 rounded border border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/10 text-amber-400 text-[9px] font-bold uppercase shrink-0 cursor-pointer disabled:opacity-50",children:"Deaktivieren"})]}),!(n!=null&&n.target_exists)&&l.jsxs("div",{className:"rounded-lg border border-amber-500/30 bg-amber-500/5 px-3 py-2 text-[11px] text-amber-400 flex items-center gap-2",children:[l.jsx(bi,{className:"h-3.5 w-3.5 shrink-0"}),"Modell-GGUF noch nicht vorhanden — Spec-Draft ist nach dem Download konfigurierbar."]}),l.jsx("div",{className:"space-y-1.5 max-h-64 overflow-y-auto pr-1",children:a?l.jsx("div",{className:"text-xs text-muted-foreground py-6 text-center",children:"Prüfe Vocab-Kompatibilität…"}):m.length===0?l.jsxs("div",{className:"text-[11px] text-muted-foreground border border-dashed border-border/50 rounded-lg p-4 text-center",children:["Keine Draft-Modelle in ",l.jsx("code",{className:"font-mono",children:"/srv/models/drafts"}),". Lade ein kleines same-family-Modell (z.B. Qwen3-0.6B) und lege es dort ab."]}):m.map(N=>{var P,_;const E=N.filename===v,A=N.compatible===!0;return l.jsxs("div",{className:ee("rounded-lg border px-3 py-2 flex items-center justify-between gap-2 text-left",A?"border-border/40 bg-background/20":"border-border/20 bg-background/10 opacity-60",E&&"border-primary/40 bg-primary/10"),children:[l.jsxs("div",{className:"min-w-0",children:[l.jsxs("div",{className:"text-[11px] font-mono font-semibold text-foreground truncate flex items-center gap-1.5",children:[N.filename,N.mtp&&l.jsx("span",{className:"shrink-0 rounded bg-indigo-500/15 px-1.5 py-0.5 text-[8px] font-bold uppercase tracking-wider text-indigo-400 border border-indigo-500/25",title:"MTP-Kopf (Multi-Token-Prediction) — by-construction vocab-identisch, höchste Akzeptanzrate",children:"MTP"})]}),l.jsxs("div",{className:"text-[9px] text-muted-foreground font-mono",children:[Lr(N.size_bytes)," · Vocab: ",j(N.vocab)]})]}),A?E?l.jsxs("span",{className:"text-[9px] font-bold uppercase text-primary flex items-center gap-1 shrink-0",children:[l.jsx(sr,{className:"h-3.5 w-3.5"})," Aktiv"]}):l.jsx("button",{onClick:()=>b(N.path),disabled:o!==null,className:"h-7 px-3 rounded-lg border border-emerald-500/30 bg-emerald-500/5 hover:bg-emerald-500/15 text-emerald-400 text-[9px] font-bold uppercase shrink-0 cursor-pointer disabled:opacity-50",children:"Aktivieren"}):l.jsxs("span",{className:"text-[9px] font-bold uppercase text-amber-400/80 flex items-center gap-1 shrink-0",title:N.compatible===!1?`Inkompatibel: Tokenizer/Vocab weicht ab (Draft ${(P=N.vocab)==null?void 0:P.pre}/${(_=N.vocab)==null?void 0:_.n_vocab} ≠ Modell ${h==null?void 0:h.pre}/${h==null?void 0:h.n_vocab}).`:"Kompatibilität nicht prüfbar (Datei fehlt).",children:[l.jsx(bi,{className:"h-3.5 w-3.5"})," ",N.compatible===!1?"Vocab ≠":"n/a"]})]},N.path)})}),!a&&(n==null?void 0:n.target_exists)&&m.length>0&&g.length===0&&l.jsxs("div",{className:"rounded-lg border border-amber-500/30 bg-amber-500/5 px-3 py-2 text-[11px] text-amber-400 leading-relaxed",children:["Kein vocab-kompatibler Draft verfügbar — Speculative Decoding ist für dieses Modell nicht möglich. Es braucht einen Draft mit identischem Tokenizer (pre=",l.jsx("span",{className:"font-mono",children:h==null?void 0:h.pre}),", n_vocab=",l.jsx("span",{className:"font-mono",children:(S=h==null?void 0:h.n_vocab)==null?void 0:S.toLocaleString()}),")."]}),u&&l.jsx("div",{className:"text-[10px] text-red-400 font-mono",children:u})]})})}const wX=["fast","heavy","heavy_chars"],kX=["coder_lite","coder","coding_escalate_chars"];function jX(){const e=Yn(),{data:t,isLoading:r}=TD(),[n,a]=y.useState(null),[o,c]=y.useState(!1),[u,f]=y.useState(""),[h,m]=y.useState(0);if(y.useEffect(()=>{t!=null&&t.policy&&!n&&a({...t.policy})},[t,n]),r||!t||!n)return l.jsx("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 text-xs text-muted-foreground",children:"Lade Routing-Policy…"});const g=N=>t.fields.find(E=>E.key===N),v=Object.keys(n).some(N=>n[N]!==t.policy[N]),b=(N,E)=>{a(A=>A&&{...A,[N]:E}),f("")},j=N=>b(N,t.defaults[N]);async function k(){if(!n)return;const N={};for(const E of Object.keys(n))n[E]!==t.policy[E]&&(N[E]=n[E]);if(Object.keys(N).length!==0){c(!0),f("");try{const{policy:E}=await _D(N);a({...E}),e.invalidateQueries({queryKey:Ve.routingPolicy}),e.invalidateQueries({queryKey:Ve.routing}),m(Date.now()),setTimeout(()=>m(0),2e3)}catch(E){f(E.message||String(E))}finally{c(!1)}}}function S({k:N}){const E=g(N),A=n[N],P=n[N]===t.defaults[N];return l.jsxs("div",{className:"space-y-1",children:[l.jsxs("div",{className:"flex items-center justify-between gap-2",children:[l.jsx("label",{className:"text-[10px] font-semibold text-muted-foreground",children:E.label}),!P&&l.jsxs("button",{onClick:()=>j(N),className:"flex items-center gap-0.5 text-[9px] text-muted-foreground/60 hover:text-foreground transition-colors cursor-pointer",title:`Auf Default zurücksetzen (${String(t.defaults[N])||"leer"})`,children:[l.jsx(_4,{className:"h-2.5 w-2.5"})," Default"]})]}),E.type==="bool"?l.jsxs("button",{onClick:()=>b(N,!A),className:ee("flex h-8 w-full items-center justify-between rounded-lg border px-3 text-[11px] font-semibold transition-all cursor-pointer",A?"border-emerald-500/40 bg-emerald-500/10 text-emerald-300":"border-border/40 bg-background/40 text-muted-foreground"),children:[l.jsx("span",{children:A?"An":"Aus"}),l.jsx("span",{className:ee("h-3.5 w-3.5 rounded-full transition-colors",A?"bg-emerald-400":"bg-muted-foreground/40")})]}):E.type==="int"?l.jsx("input",{type:"number",value:A,min:E.min,max:E.max,"aria-label":E.label,onChange:_=>b(N,Number(_.target.value)),className:"h-8 w-full rounded-lg border border-border/40 bg-background/40 px-3 font-mono text-[11px] text-foreground outline-none focus:border-primary/50"}):l.jsx("input",{type:"text",value:A,"aria-label":E.label,spellCheck:!1,placeholder:N==="coder_lite"?"(leer = aus)":"",onChange:_=>b(N,_.target.value),className:"h-8 w-full rounded-lg border border-border/40 bg-background/40 px-3 font-mono text-[11px] text-foreground outline-none focus:border-primary/50"})]})}return l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-4",children:[l.jsxs("div",{className:"flex items-center justify-between gap-3 flex-wrap",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(z4,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("span",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"Lane-Routing & Policy"}),l.jsx("span",{className:"text-[9px] font-mono px-1.5 py-0.5 rounded bg-emerald-500/10 text-emerald-300 border border-emerald-500/20",children:"hot-reload"})]}),l.jsxs("div",{className:"flex items-center gap-2",children:[u&&l.jsx("span",{className:"text-[10px] text-red-400 max-w-[280px] truncate",title:u,children:u}),h>0&&l.jsxs("span",{className:"flex items-center gap-1 text-[10px] text-emerald-400",children:[l.jsx(sr,{className:"h-3.5 w-3.5"})," gespeichert"]}),l.jsxs("button",{onClick:k,disabled:!v||o,className:ee("h-8 px-4 rounded-lg text-[10px] font-bold uppercase tracking-wide transition-all flex items-center gap-1.5",v&&!o?"bg-primary text-primary-foreground hover:opacity-90 cursor-pointer shadow-md shadow-primary/10":"bg-background/40 text-muted-foreground/50 border border-border/40 cursor-not-allowed"),children:[o?l.jsx(dh,{className:"h-3.5 w-3.5 animate-spin"}):null,"Speichern"]})]})]}),l.jsxs("p",{className:"text-[10px] text-muted-foreground/70 leading-relaxed -mt-1",children:["Welches echte Modell hinter den virtuellen Lanes ",l.jsx("code",{className:"text-cyan-300",children:"chat"})," und"," ",l.jsx("code",{className:"text-cyan-300",children:"coding"})," steckt. Änderungen greifen sofort (kein Neustart). Die Keyword-Heuristiken bleiben im Code."]}),l.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[l.jsxs("div",{className:"rounded-xl border border-border/40 bg-background/25 p-4 space-y-3",children:[l.jsxs("div",{className:"flex items-center gap-2 border-b border-border/30 pb-2",children:[l.jsx(k4,{className:"h-4 w-4 text-teal-400"}),l.jsx("span",{className:"text-[11px] font-bold uppercase tracking-wider text-foreground",children:"chat"}),l.jsx("span",{className:"text-[9px] text-muted-foreground/60 font-mono",children:"(= auto)"})]}),wX.map(N=>l.jsx(S,{k:N},N))]}),l.jsxs("div",{className:"rounded-xl border border-border/40 bg-background/25 p-4 space-y-3",children:[l.jsxs("div",{className:"flex items-center gap-2 border-b border-border/30 pb-2",children:[l.jsx(i4,{className:"h-4 w-4 text-indigo-400"}),l.jsx("span",{className:"text-[11px] font-bold uppercase tracking-wider text-foreground",children:"coding"}),l.jsx("span",{className:"text-[9px] text-muted-foreground/60 font-mono",children:"(agentisch → immer Coder)"})]}),kX.map(N=>l.jsx(S,{k:N},N))]})]}),l.jsx("div",{className:"rounded-xl border border-border/40 bg-background/25 p-4",children:l.jsx("div",{className:"max-w-xs",children:l.jsx(S,{k:"fast_no_think"})})})]})}function SX(){var pe,ue,he;const e=Yn(),{data:t}=Ni(4e3),{data:r}=EE(),{data:n}=Po(),{data:a}=AE(),{showAlert:o,dialogElement:c}=Aa(),[u,f]=y.useState(!1),[h,m]=y.useState(!1),g=(t==null?void 0:t.models)??[],v=(t==null?void 0:t.running)??[],b=(pe=r==null?void 0:r.groups)==null?void 0:pe.brains,j=(b==null?void 0:b.members)??[],k=ae=>g.find(se=>se.name===ae),S=ae=>{var se;return((se=ae.split("/").pop())==null?void 0:se.replace(/\.gguf$/i,""))||ae},N=j.map(k).filter(Boolean),E=1024**3,A=a==null?void 0:a.budget,P=N.reduce((ae,se)=>ae+(se.size_bytes||0),0)/E,_=((ue=n==null?void 0:n.gpu)==null?void 0:ue.gtt_total)||((he=n==null?void 0:n.gpu)==null?void 0:he.vram_total)||0,O=(A==null?void 0:A.gtt_gb)||(_?_/E:0),D=(A==null?void 0:A.warm_projected_gb)??P,U=O>0?Math.min(100,D/O*100):0,B=g.filter(ae=>!j.includes(ae.name)&&!ae.incomplete);async function F(ae){m(!0);try{await SE("brains",ae,(b==null?void 0:b.swap)??!1,(b==null?void 0:b.persist)??!0),e.invalidateQueries({queryKey:Ve.groups}),e.invalidateQueries({queryKey:Ve.models}),e.invalidateQueries({queryKey:Ve.hermesBrain})}catch(se){o("Fehler",`Immer-bereit-Set konnte nicht geändert werden: ${(se==null?void 0:se.message)||se}`)}finally{m(!1)}}function Y(ae){const se=k(ae);if(se&&mr(se.role).protected){o("Geschützt",`„${mr(se.role).label}" ist lebenswichtig und bleibt immer bereit.`);return}F(j.filter(X=>X!==ae))}function H(ae){f(!1),F([...j,ae])}return b?l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-4",children:[l.jsx(G2,{}),l.jsxs("div",{className:"space-y-1.5",children:[N.length===0&&l.jsx("div",{className:"text-xs text-muted-foreground",children:"Noch keine Modelle im Set."}),N.map(ae=>{const se=v.includes(ae.name),X=mr(ae.role).protected;return l.jsxs("div",{className:"flex items-center justify-between gap-2 rounded-xl border border-border/30 bg-background/20 p-2.5",children:[l.jsxs("div",{className:"flex min-w-0 items-center gap-2.5",children:[l.jsx("span",{className:ee("h-2 w-2 shrink-0 rounded-full ring-2 ring-black/40",se?"bg-emerald-500 animate-pulse":"bg-muted-foreground/40"),title:se?"Gerade warm (bereit)":"Reserviert — lädt bei Bedarf sofort"}),ae.role&&l.jsx(io,{role:ae.role,dense:!0,className:"shrink-0"}),l.jsx("span",{className:"truncate font-mono text-xs font-semibold text-foreground",title:ae.name,children:S(ae.name)}),l.jsx("span",{className:"shrink-0 font-mono text-[10px] text-muted-foreground/70",children:Lr(ae.size_bytes)})]}),X?l.jsx("span",{className:"shrink-0 text-[10px] font-semibold text-muted-foreground",title:"Lebenswichtig — bleibt immer im Set.",children:"🔒"}):l.jsx("button",{onClick:()=>Y(ae.name),disabled:h,className:"flex h-7 w-7 shrink-0 items-center justify-center rounded-lg border border-border/40 text-muted-foreground transition-colors hover:bg-red-500/5 hover:text-red-400 cursor-pointer disabled:opacity-50",title:"Aus dem Immer-bereit-Set nehmen (lädt dann nur noch bei Bedarf)",children:l.jsx(Wn,{className:"h-3.5 w-3.5"})})]},ae.name)})]}),l.jsxs("button",{onClick:()=>f(!0),disabled:h||B.length===0,className:"flex h-8 w-full items-center justify-center gap-1.5 rounded-lg border border-dashed border-border/50 text-[11px] font-semibold uppercase tracking-wide text-muted-foreground transition-colors hover:border-primary/40 hover:text-primary cursor-pointer disabled:opacity-50",children:[l.jsx(df,{className:"h-3.5 w-3.5"})," Modell dauerhaft bereithalten"]}),l.jsxs("div",{className:"rounded-xl border border-border/30 bg-background/20 p-3",children:[l.jsxs("div",{className:"mb-1.5 flex items-center justify-between text-[11px]",children:[l.jsxs("span",{className:"flex items-center gap-1.5 font-semibold uppercase tracking-wider text-muted-foreground",title:"Modellgewichte + Arbeitsspeicher (KV-Cache)",children:[l.jsx(yu,{className:"h-3.5 w-3.5"})," Reserviert fürs Set"]}),l.jsxs("span",{className:"font-mono font-bold text-foreground",children:[D.toFixed(1),O>0?` / ${O.toFixed(0)}`:""," GB"]})]}),l.jsx("div",{className:"h-2 w-full overflow-hidden rounded-full border border-border/30 bg-background/50",children:l.jsx("div",{className:ee("h-full rounded-full transition-all duration-500",U>=85?"bg-red-500":U>=65?"bg-amber-500":"bg-teal-500"),style:{width:`${U}%`}})}),A&&!A.fits&&l.jsxs("p",{className:"mt-2 flex items-start gap-1.5 text-[11px] text-amber-400",children:[l.jsx(bi,{className:"mt-0.5 h-3.5 w-3.5 shrink-0"}),l.jsxs("span",{children:["Zusammen mit dem größten Gelegenheits-Modell (~",A.largest_ondemand_gb," GB, z. B. das große Hirn) passt das Set nicht gleichzeitig in den Speicher. Beim Laden wird das Set kurz verdrängt und danach automatisch nachgeladen — kostet ein paar Sekunden."]})]}),A&&A.fits&&l.jsxs("p",{className:"mt-2 flex items-center gap-1.5 text-[11px] text-emerald-400",children:[l.jsx(sr,{className:"h-3.5 w-3.5 shrink-0"})," Passt auch neben dem größten Gelegenheits-Modell — nichts wird verdrängt."]})]}),u&&l.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/60 p-4 backdrop-blur-sm",role:"dialog","aria-modal":"true","aria-label":"Modell zum Immer-bereit-Set hinzufügen",children:l.jsxs("div",{className:"w-full max-w-md space-y-3 rounded-2xl border border-border/80 bg-card p-6 shadow-2xl animate-in fade-in zoom-in-95 duration-200",children:[l.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary",children:"Dauerhaft bereithalten"}),l.jsx("button",{onClick:()=>f(!1),className:"rounded p-1 text-muted-foreground hover:bg-accent hover:text-foreground cursor-pointer",children:l.jsx(Wn,{className:"h-4 w-4"})})]}),l.jsx("p",{className:"text-xs text-muted-foreground",children:"Wähle ein Modell, das ohne Ladezeit bereitstehen soll:"}),l.jsx("div",{className:"max-h-60 space-y-1.5 overflow-y-auto pr-1",children:B.map(ae=>l.jsxs("button",{onClick:()=>H(ae.name),className:"flex w-full items-center justify-between gap-2 rounded-lg border border-border/30 bg-background/20 px-3 py-2.5 text-left transition-colors hover:bg-accent cursor-pointer",children:[l.jsxs("span",{className:"flex min-w-0 items-center gap-2",children:[ae.role&&l.jsx(io,{role:ae.role,dense:!0,className:"shrink-0"}),l.jsx("span",{className:"truncate font-mono text-xs font-semibold text-foreground",children:S(ae.name)})]}),l.jsx("span",{className:"shrink-0 font-mono text-[10px] text-muted-foreground/70",children:Lr(ae.size_bytes)})]},ae.name))})]})}),c]}):l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10",children:[l.jsx(G2,{}),l.jsx("p",{className:"mt-3 text-xs text-muted-foreground",children:"Es gibt noch kein Immer-bereit-Set. Es entsteht automatisch, sobald Lucys Hirn zugewiesen ist."}),c]})}function G2(){return l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(xa,{className:"h-4.5 w-4.5 text-primary"}),l.jsxs("div",{children:[l.jsx("h2",{className:"text-sm font-bold uppercase tracking-wide text-foreground",children:"Immer-bereit-Set"}),l.jsx("p",{className:"text-[11px] text-muted-foreground",children:"Diese Modelle hält Lucy immer bereit — sie antworten ohne Ladezeit."})]})]})}function qO(){var Fe,Oe,ut,Jt;const e=Yn(),{data:t,isLoading:r,error:n}=Ni(4e3),{data:a}=vh(4e3),{data:o}=AE(),{data:c}=Po(),{data:u}=EE(),{showAlert:f,showConfirm:h,showPrompt:m,dialogElement:g}=Aa(),v=gE(),b=W=>!!mr(W).protected,j=(t==null?void 0:t.models)??[],k=(t==null?void 0:t.running)??[],S=n?String(n):"",N=()=>{e.invalidateQueries({queryKey:Ve.models}),e.invalidateQueries({queryKey:Ve.routing})},E=(Fe=u==null?void 0:u.groups)==null?void 0:Fe.brains,A=(E==null?void 0:E.members)??[],P=W=>A.includes(W),_=A.some(W=>k.includes(W));async function O(W){if(!E){f("Keine brains-Gruppe","Es existiert noch keine Ko-Residenz-Gruppe „brains“ in der Engine-Konfiguration. Lege sie erst über die Gruppen-Verwaltung an.");return}const Ae=A.includes(W)?A.filter(Be=>Be!==W):[...A,W];try{await SE("brains",Ae,E.swap??!1,E.persist??!0),e.invalidateQueries({queryKey:Ve.groups}),N()}catch(Be){f("Fehler",`Ko-Residenz konnte nicht geändert werden: ${Be.message||Be}`)}}const[D,U]=y.useState(null),[B,F]=y.useState(null),[Y,H]=y.useState(null),[pe,ue]=y.useState("grid"),[he,ae]=y.useState("all"),se=j.filter(W=>he==="in_use"?!!W.role||k.includes(W.name):!0);async function X(W){try{await Se(`/api/models/${encodeURIComponent(W)}/load`,{method:"POST"}),N()}catch(ke){f("Fehler",`Fehler beim Laden des Modells: ${ke.message}`)}}async function te(W){if(E&&_&&!P(W)){const ke=A.filter(Ae=>k.includes(Ae)).map(Ae=>Ae.split("/").pop()).join(", ");h("Verdrängt das Hirn?",`„${W.split("/").pop()}“ ist nicht in der Ko-Residenz-Gruppe „brains“. Beim Laden wirft es das aktuell warme Hirn (${ke}) raus — Lucy verliert Hirn bzw. Augen. +Tipp: Dafür wird evtl. das Box-Passwort gebraucht (oben rechts hinterlegen).`:""))}u.invalidateQueries({queryKey:Ve.health}),u.invalidateQueries({queryKey:Ve.services}),u.invalidateQueries({queryKey:Ve.models})}catch(E){o("Reparatur fehlgeschlagen",String((E==null?void 0:E.message)||E))}finally{h(E=>({...E,[S]:!1}))}}const g=e==="box"?{loading:"Box wird geprüft …",gut:"Alles okay",warn:"Kleinigkeit an der Box",problem:"Box braucht Hilfe"}:{loading:"Lucy wird geprüft …",gut:"Lucy geht's gut 💚",warn:"Kleinigkeit bei Lucy",problem:"Lucy braucht Hilfe"},v={loading:{ring:"border-border/60 bg-card/45",icon:dh,iconCls:"text-muted-foreground animate-spin",title:g.loading,sub:"Einen Moment, ich schaue nach dem Rechten."},gut:{ring:"border-emerald-500/40 bg-emerald-500/5",icon:h4,iconCls:"text-emerald-400",title:g.gut,sub:"Alle wichtigen Fähigkeiten laufen."},warn:{ring:"border-amber-500/40 bg-amber-500/5",icon:bi,iconCls:"text-amber-400",title:g.warn,sub:"Nichts Schlimmes — nur ein Hinweis."},problem:{ring:"border-red-500/50 bg-red-500/5",icon:bi,iconCls:"text-red-400",title:g.problem,sub:`${a.length} wichtige${a.length===1?"s":""} Problem${a.length===1?"":"e"} gefunden.`}}[t],b=v.icon,j={ok:"bg-emerald-500",warn:"bg-amber-500",full:"bg-red-500",unknown:"bg-muted-foreground/40"}[n.status],k={ok:"text-emerald-400",warn:"text-amber-400",full:"text-red-400",unknown:"text-muted-foreground"}[n.status];return l.jsxs("div",{className:ee("rounded-2xl border p-5 shadow-lg shadow-black/15 backdrop-blur-md transition-colors",v.ring),children:[l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsx("div",{className:"flex h-11 w-11 shrink-0 items-center justify-center rounded-xl border border-border/40 bg-background/30",children:l.jsx(b,{className:ee("h-6 w-6",v.iconCls)})}),l.jsxs("div",{className:"min-w-0",children:[l.jsx("h2",{className:"text-base font-bold tracking-tight text-foreground",children:v.title}),l.jsx("p",{className:"text-xs text-muted-foreground",children:v.sub})]})]}),l.jsxs("div",{className:"mt-4 rounded-xl border border-border/30 bg-background/20 p-3",children:[l.jsxs("div",{className:"mb-1.5 flex items-center justify-between text-[11px]",children:[l.jsxs("span",{className:"flex items-center gap-1.5 font-semibold uppercase tracking-wider text-muted-foreground",children:[l.jsx(yu,{className:"h-3.5 w-3.5"})," Speicher"]}),l.jsx("span",{className:ee("font-mono font-bold",k),children:n.status==="unknown"?"—":`${n.usedGb.toFixed(0)} / ${n.totalGb.toFixed(0)} GB`})]}),l.jsx("div",{className:"h-2 w-full overflow-hidden rounded-full border border-border/30 bg-background/50",children:l.jsx("div",{className:ee("h-full rounded-full transition-all duration-500",j),style:{width:`${n.pct}%`}})}),l.jsx("p",{className:ee("mt-1.5 text-[11px]",k),children:n.text})]}),l.jsx("div",{className:"mt-4 space-y-1.5",children:r.map(S=>l.jsx(vX,{c:S,busy:!!f[S.id],onRepair:()=>S.repair&&m(S.id,S.repair)},S.id))}),c]})}function vX({c:e,busy:t,onRepair:r}){const n=e.icon,a=e.status==="down"||e.status==="warn";return l.jsxs("div",{className:ee("flex items-center justify-between gap-3 rounded-xl border p-2.5 transition-colors",e.status==="down"?"border-red-500/25 bg-red-500/5":e.status==="warn"?"border-amber-500/20 bg-amber-500/5":"border-border/30 bg-background/15"),children:[l.jsxs("div",{className:"flex min-w-0 items-center gap-2.5",children:[l.jsxs("span",{className:"relative flex h-8 w-8 shrink-0 items-center justify-center rounded-lg border border-border/40 bg-background/30 text-foreground/80",children:[l.jsx(n,{className:"h-4 w-4"}),l.jsx("span",{className:ee("absolute -right-0.5 -top-0.5 h-2.5 w-2.5 rounded-full ring-2 ring-black/40",gX[e.status],e.status==="down"&&"animate-pulse")})]}),l.jsxs("div",{className:"min-w-0",children:[l.jsxs("div",{className:"flex items-center gap-1.5 text-xs font-bold text-foreground",children:[e.label,e.status==="ok"&&l.jsx(sr,{className:"h-3 w-3 text-emerald-400"}),!e.critical&&l.jsx("span",{className:"rounded bg-background/40 px-1 py-0.5 text-[8px] font-semibold uppercase tracking-wider text-muted-foreground/60",children:"optional"})]}),l.jsx("div",{className:"truncate text-[11px] text-muted-foreground",children:e.detail})]})]}),a&&e.repair&&l.jsxs("button",{onClick:r,disabled:t,className:ee("flex h-8 shrink-0 items-center gap-1.5 rounded-lg border px-2.5 text-[10px] font-bold uppercase tracking-wide transition-all cursor-pointer disabled:opacity-60",e.status==="down"?"border-red-500/40 bg-red-500/10 text-red-300 hover:bg-red-500/20":"border-amber-500/40 bg-amber-500/10 text-amber-300 hover:bg-amber-500/20"),title:e.repair.label,children:[t?l.jsx(dh,{className:"h-3.5 w-3.5 animate-spin"}):l.jsx(Qu,{className:"h-3.5 w-3.5"}),e.repair.label]}),a&&!e.repair&&l.jsxs("span",{className:"flex shrink-0 items-center gap-1 text-[10px] font-semibold text-muted-foreground",title:"Keine Auto-Reparatur bekannt",children:[l.jsx(L4,{className:"h-3.5 w-3.5"})," manuell"]})]})}function K2({children:e}){return l.jsx("p",{className:"mb-2 ml-0.5 text-[11px] font-semibold uppercase tracking-wider text-muted-foreground/60",children:e})}function yX(){return l.jsxs("div",{className:"space-y-7",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Zentrale"}),l.jsx("p",{className:"text-sm text-muted-foreground",children:"Aktueller Status von System, Modellen und Agent."})]}),l.jsx(VO,{}),l.jsxs("div",{className:"grid items-stretch gap-6 lg:grid-cols-3",children:[l.jsx(BO,{}),l.jsx(HO,{}),l.jsx(mX,{})]}),l.jsxs("section",{children:[l.jsx(K2,{children:"Stack & Telemetrie"}),l.jsxs("div",{className:"grid gap-6 md:grid-cols-2",children:[l.jsx(cX,{}),l.jsx(WO,{})]})]}),l.jsxs("section",{children:[l.jsx(K2,{children:"Betrieb & Wissen"}),l.jsxs("div",{className:"grid gap-6 md:grid-cols-3",children:[l.jsx(sX,{}),l.jsx(lX,{}),l.jsx(uX,{})]})]})]})}function xX(){const e=Yn(),{data:t=[]}=DD(2e3),{showAlert:r,dialogElement:n}=Aa();async function a(u){try{await Se(`/api/jobs/${u}/cancel`,{method:"POST"}),e.invalidateQueries({queryKey:Ve.jobs})}catch(f){r("Fehler",f.message)}}const o=t.filter(u=>u.state==="running"||u.state==="queued"),c=t.filter(u=>u.state!=="running"&&u.state!=="queued").slice(-3);return o.length===0&&c.length===0?null:l.jsxs("div",{className:"space-y-3 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-4 shadow-lg shadow-black/10",children:[l.jsx("div",{className:"text-[11px] font-semibold text-muted-foreground uppercase tracking-wider",children:"Aktive Downloads"}),o.map(u=>l.jsxs("div",{className:"space-y-1.5 p-3 rounded-xl bg-background/20 border border-border/40",children:[l.jsxs("div",{className:"flex justify-between items-center text-xs",children:[l.jsx("span",{className:"font-semibold truncate max-w-[250px]",children:u.label}),l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsxs("span",{className:"text-muted-foreground font-mono",children:[u.progress??0,"% • ",wv(u.done_bytes),"/",wv(u.total_bytes),u.eta_s?` • ETA ${GD(u.eta_s)}`:""]}),l.jsx("button",{onClick:()=>a(u.id),className:"text-[10px] text-red-400 hover:text-red-300 font-semibold border border-red-500/25 bg-red-500/5 px-2 py-0.5 rounded transition-all cursor-pointer",children:"Abbrechen"})]})]}),l.jsx("div",{className:"h-1.5 overflow-hidden rounded-full bg-muted",children:l.jsx("div",{className:"h-full rounded-full bg-primary transition-all duration-500",style:{width:`${u.progress??0}%`}})})]},u.id)),c.map(u=>l.jsxs("div",{className:"flex justify-between items-center text-xs text-muted-foreground px-1",children:[l.jsx("span",{className:"truncate",children:u.label}),l.jsx("span",{className:ee("font-semibold text-[10px] px-1.5 py-0.5 rounded uppercase font-mono",u.state==="done"?"bg-emerald-500/10 text-emerald-400":"bg-amber-500/10 text-amber-400"),children:u.state})]},u.id)),n]})}function Ga({children:e,tone:t="muted"}){const r={muted:"bg-muted text-muted-foreground",primary:"bg-primary/15 text-primary",warn:"bg-amber-500/15 text-amber-500"};return l.jsx("span",{className:`rounded px-1.5 py-0.5 text-[11px] font-medium ${r[t]}`,children:e})}function G2({caps:e}){return e?l.jsxs("span",{className:"inline-flex flex-wrap gap-1",children:[e.coder&&l.jsx(Ga,{children:"💻 Code"}),e.vision&&l.jsx(Ga,{children:"👁 Bild"}),e.reasoning&&l.jsx(Ga,{children:"🧠 Reason"}),e.moe&&l.jsxs(Ga,{tone:"primary",children:["🧩 MoE",e.active_b?`·${e.active_b}b`:""]}),e.tools==="yes"&&l.jsx(Ga,{tone:"primary",children:"🛠 Tools"}),e.tools==="likely"&&l.jsx(Ga,{tone:"warn",children:"🛠 Tools?"}),e.embedding&&l.jsx(Ga,{children:"🔢 Embed"})]}):null}function bX({model:e,onClose:t,onChanged:r}){var k,S;const{data:n,isLoading:a}=LD(e.gguf_path),[o,c]=y.useState(null),[u,f]=y.useState(""),h=n==null?void 0:n.target_vocab,m=(n==null?void 0:n.drafts)??[],g=m.filter(N=>N.compatible===!0),v=e.spec_draft_model;async function b(N){c(N??"__clear__"),f("");try{await Se(`/api/models/${encodeURIComponent(e.name)}/draft`,{method:"POST",body:JSON.stringify({draft_path:N})}),r(),t()}catch(E){f(String((E==null?void 0:E.message)||E)),c(null)}}const j=N=>{var E;return N?`${N.pre??"?"} · ${((E=N.n_vocab)==null?void 0:E.toLocaleString())??"?"} Tokens`:"—"};return l.jsx("div",{className:"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm flex items-center justify-center p-4",children:l.jsxs("div",{className:"w-full max-w-lg rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[l.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[l.jsxs("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary flex items-center gap-2",children:[l.jsx(xa,{className:"h-4 w-4"})," Speculative Draft"]}),l.jsx("button",{onClick:t,className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:l.jsx(Wn,{className:"h-4 w-4"})})]}),l.jsxs("div",{className:"text-xs text-muted-foreground leading-relaxed",children:['Beschleunigt die Token-Generierung mit einem kleinen "Draft"-Modell. Voraussetzung: der Draft muss den ',l.jsx("strong",{className:"text-foreground",children:"exakt gleichen Tokenizer (Vocab)"})," haben wie das Modell — sonst lehnt llama.cpp es ab."]}),l.jsxs("div",{className:"rounded-lg border border-border/40 bg-background/30 px-3 py-2 text-[11px] font-mono flex items-center justify-between",children:[l.jsx("span",{className:"text-muted-foreground",children:(k=e.name.split("/").pop())==null?void 0:k.replace(/\.gguf$/i,"")}),l.jsxs("span",{className:"text-foreground",children:["Vocab: ",j(h)]})]}),e.spec_active&&v&&l.jsxs("div",{className:"rounded-lg border border-emerald-500/30 bg-emerald-500/5 px-3 py-2 flex items-center justify-between gap-2",children:[l.jsxs("span",{className:"text-[11px] text-emerald-400 font-mono flex items-center gap-1.5 truncate",children:[l.jsx(sr,{className:"h-3.5 w-3.5 shrink-0"})," Aktiv: ",v]}),l.jsx("button",{onClick:()=>b(null),disabled:o!==null,className:"h-6 px-2.5 rounded border border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/10 text-amber-400 text-[9px] font-bold uppercase shrink-0 cursor-pointer disabled:opacity-50",children:"Deaktivieren"})]}),!(n!=null&&n.target_exists)&&l.jsxs("div",{className:"rounded-lg border border-amber-500/30 bg-amber-500/5 px-3 py-2 text-[11px] text-amber-400 flex items-center gap-2",children:[l.jsx(bi,{className:"h-3.5 w-3.5 shrink-0"}),"Modell-GGUF noch nicht vorhanden — Spec-Draft ist nach dem Download konfigurierbar."]}),l.jsx("div",{className:"space-y-1.5 max-h-64 overflow-y-auto pr-1",children:a?l.jsx("div",{className:"text-xs text-muted-foreground py-6 text-center",children:"Prüfe Vocab-Kompatibilität…"}):m.length===0?l.jsxs("div",{className:"text-[11px] text-muted-foreground border border-dashed border-border/50 rounded-lg p-4 text-center",children:["Keine Draft-Modelle in ",l.jsx("code",{className:"font-mono",children:"/srv/models/drafts"}),". Lade ein kleines same-family-Modell (z.B. Qwen3-0.6B) und lege es dort ab."]}):m.map(N=>{var P,_;const E=N.filename===v,A=N.compatible===!0;return l.jsxs("div",{className:ee("rounded-lg border px-3 py-2 flex items-center justify-between gap-2 text-left",A?"border-border/40 bg-background/20":"border-border/20 bg-background/10 opacity-60",E&&"border-primary/40 bg-primary/10"),children:[l.jsxs("div",{className:"min-w-0",children:[l.jsxs("div",{className:"text-[11px] font-mono font-semibold text-foreground truncate flex items-center gap-1.5",children:[N.filename,N.mtp&&l.jsx("span",{className:"shrink-0 rounded bg-indigo-500/15 px-1.5 py-0.5 text-[8px] font-bold uppercase tracking-wider text-indigo-400 border border-indigo-500/25",title:"MTP-Kopf (Multi-Token-Prediction) — by-construction vocab-identisch, höchste Akzeptanzrate",children:"MTP"})]}),l.jsxs("div",{className:"text-[9px] text-muted-foreground font-mono",children:[Lr(N.size_bytes)," · Vocab: ",j(N.vocab)]})]}),A?E?l.jsxs("span",{className:"text-[9px] font-bold uppercase text-primary flex items-center gap-1 shrink-0",children:[l.jsx(sr,{className:"h-3.5 w-3.5"})," Aktiv"]}):l.jsx("button",{onClick:()=>b(N.path),disabled:o!==null,className:"h-7 px-3 rounded-lg border border-emerald-500/30 bg-emerald-500/5 hover:bg-emerald-500/15 text-emerald-400 text-[9px] font-bold uppercase shrink-0 cursor-pointer disabled:opacity-50",children:"Aktivieren"}):l.jsxs("span",{className:"text-[9px] font-bold uppercase text-amber-400/80 flex items-center gap-1 shrink-0",title:N.compatible===!1?`Inkompatibel: Tokenizer/Vocab weicht ab (Draft ${(P=N.vocab)==null?void 0:P.pre}/${(_=N.vocab)==null?void 0:_.n_vocab} ≠ Modell ${h==null?void 0:h.pre}/${h==null?void 0:h.n_vocab}).`:"Kompatibilität nicht prüfbar (Datei fehlt).",children:[l.jsx(bi,{className:"h-3.5 w-3.5"})," ",N.compatible===!1?"Vocab ≠":"n/a"]})]},N.path)})}),!a&&(n==null?void 0:n.target_exists)&&m.length>0&&g.length===0&&l.jsxs("div",{className:"rounded-lg border border-amber-500/30 bg-amber-500/5 px-3 py-2 text-[11px] text-amber-400 leading-relaxed",children:["Kein vocab-kompatibler Draft verfügbar — Speculative Decoding ist für dieses Modell nicht möglich. Es braucht einen Draft mit identischem Tokenizer (pre=",l.jsx("span",{className:"font-mono",children:h==null?void 0:h.pre}),", n_vocab=",l.jsx("span",{className:"font-mono",children:(S=h==null?void 0:h.n_vocab)==null?void 0:S.toLocaleString()}),")."]}),u&&l.jsx("div",{className:"text-[10px] text-red-400 font-mono",children:u})]})})}const wX=["fast","heavy","heavy_chars"],kX=["coder_lite","coder","coding_escalate_chars"];function jX(){const e=Yn(),{data:t,isLoading:r}=TD(),[n,a]=y.useState(null),[o,c]=y.useState(!1),[u,f]=y.useState(""),[h,m]=y.useState(0);if(y.useEffect(()=>{t!=null&&t.policy&&!n&&a({...t.policy})},[t,n]),r||!t||!n)return l.jsx("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 text-xs text-muted-foreground",children:"Lade Routing-Policy…"});const g=N=>t.fields.find(E=>E.key===N),v=Object.keys(n).some(N=>n[N]!==t.policy[N]),b=(N,E)=>{a(A=>A&&{...A,[N]:E}),f("")},j=N=>b(N,t.defaults[N]);async function k(){if(!n)return;const N={};for(const E of Object.keys(n))n[E]!==t.policy[E]&&(N[E]=n[E]);if(Object.keys(N).length!==0){c(!0),f("");try{const{policy:E}=await _D(N);a({...E}),e.invalidateQueries({queryKey:Ve.routingPolicy}),e.invalidateQueries({queryKey:Ve.routing}),m(Date.now()),setTimeout(()=>m(0),2e3)}catch(E){f(E.message||String(E))}finally{c(!1)}}}function S({k:N}){const E=g(N),A=n[N],P=n[N]===t.defaults[N];return l.jsxs("div",{className:"space-y-1",children:[l.jsxs("div",{className:"flex items-center justify-between gap-2",children:[l.jsx("label",{className:"text-[10px] font-semibold text-muted-foreground",children:E.label}),!P&&l.jsxs("button",{onClick:()=>j(N),className:"flex items-center gap-0.5 text-[9px] text-muted-foreground/60 hover:text-foreground transition-colors cursor-pointer",title:`Auf Default zurücksetzen (${String(t.defaults[N])||"leer"})`,children:[l.jsx(_4,{className:"h-2.5 w-2.5"})," Default"]})]}),E.type==="bool"?l.jsxs("button",{onClick:()=>b(N,!A),className:ee("flex h-8 w-full items-center justify-between rounded-lg border px-3 text-[11px] font-semibold transition-all cursor-pointer",A?"border-emerald-500/40 bg-emerald-500/10 text-emerald-300":"border-border/40 bg-background/40 text-muted-foreground"),children:[l.jsx("span",{children:A?"An":"Aus"}),l.jsx("span",{className:ee("h-3.5 w-3.5 rounded-full transition-colors",A?"bg-emerald-400":"bg-muted-foreground/40")})]}):E.type==="int"?l.jsx("input",{type:"number",value:A,min:E.min,max:E.max,"aria-label":E.label,onChange:_=>b(N,Number(_.target.value)),className:"h-8 w-full rounded-lg border border-border/40 bg-background/40 px-3 font-mono text-[11px] text-foreground outline-none focus:border-primary/50"}):l.jsx("input",{type:"text",value:A,"aria-label":E.label,spellCheck:!1,placeholder:N==="coder_lite"?"(leer = aus)":"",onChange:_=>b(N,_.target.value),className:"h-8 w-full rounded-lg border border-border/40 bg-background/40 px-3 font-mono text-[11px] text-foreground outline-none focus:border-primary/50"})]})}return l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-4",children:[l.jsxs("div",{className:"flex items-center justify-between gap-3 flex-wrap",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(z4,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("span",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"Lane-Routing & Policy"}),l.jsx("span",{className:"text-[9px] font-mono px-1.5 py-0.5 rounded bg-emerald-500/10 text-emerald-300 border border-emerald-500/20",children:"hot-reload"})]}),l.jsxs("div",{className:"flex items-center gap-2",children:[u&&l.jsx("span",{className:"text-[10px] text-red-400 max-w-[280px] truncate",title:u,children:u}),h>0&&l.jsxs("span",{className:"flex items-center gap-1 text-[10px] text-emerald-400",children:[l.jsx(sr,{className:"h-3.5 w-3.5"})," gespeichert"]}),l.jsxs("button",{onClick:k,disabled:!v||o,className:ee("h-8 px-4 rounded-lg text-[10px] font-bold uppercase tracking-wide transition-all flex items-center gap-1.5",v&&!o?"bg-primary text-primary-foreground hover:opacity-90 cursor-pointer shadow-md shadow-primary/10":"bg-background/40 text-muted-foreground/50 border border-border/40 cursor-not-allowed"),children:[o?l.jsx(dh,{className:"h-3.5 w-3.5 animate-spin"}):null,"Speichern"]})]})]}),l.jsxs("p",{className:"text-[10px] text-muted-foreground/70 leading-relaxed -mt-1",children:["Welches echte Modell hinter den virtuellen Lanes ",l.jsx("code",{className:"text-cyan-300",children:"chat"})," und"," ",l.jsx("code",{className:"text-cyan-300",children:"coding"})," steckt. Änderungen greifen sofort (kein Neustart). Die Keyword-Heuristiken bleiben im Code."]}),l.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[l.jsxs("div",{className:"rounded-xl border border-border/40 bg-background/25 p-4 space-y-3",children:[l.jsxs("div",{className:"flex items-center gap-2 border-b border-border/30 pb-2",children:[l.jsx(k4,{className:"h-4 w-4 text-teal-400"}),l.jsx("span",{className:"text-[11px] font-bold uppercase tracking-wider text-foreground",children:"chat"}),l.jsx("span",{className:"text-[9px] text-muted-foreground/60 font-mono",children:"(= auto)"})]}),wX.map(N=>l.jsx(S,{k:N},N))]}),l.jsxs("div",{className:"rounded-xl border border-border/40 bg-background/25 p-4 space-y-3",children:[l.jsxs("div",{className:"flex items-center gap-2 border-b border-border/30 pb-2",children:[l.jsx(i4,{className:"h-4 w-4 text-indigo-400"}),l.jsx("span",{className:"text-[11px] font-bold uppercase tracking-wider text-foreground",children:"coding"}),l.jsx("span",{className:"text-[9px] text-muted-foreground/60 font-mono",children:"(agentisch → immer Coder)"})]}),kX.map(N=>l.jsx(S,{k:N},N))]})]}),l.jsx("div",{className:"rounded-xl border border-border/40 bg-background/25 p-4",children:l.jsx("div",{className:"max-w-xs",children:l.jsx(S,{k:"fast_no_think"})})})]})}function SX(){var pe,ue,he;const e=Yn(),{data:t}=Ni(4e3),{data:r}=EE(),{data:n}=Po(),{data:a}=AE(),{showAlert:o,dialogElement:c}=Aa(),[u,f]=y.useState(!1),[h,m]=y.useState(!1),g=(t==null?void 0:t.models)??[],v=(t==null?void 0:t.running)??[],b=(pe=r==null?void 0:r.groups)==null?void 0:pe.brains,j=(b==null?void 0:b.members)??[],k=ae=>g.find(se=>se.name===ae),S=ae=>{var se;return((se=ae.split("/").pop())==null?void 0:se.replace(/\.gguf$/i,""))||ae},N=j.map(k).filter(Boolean),E=1024**3,A=a==null?void 0:a.budget,P=N.reduce((ae,se)=>ae+(se.size_bytes||0),0)/E,_=((ue=n==null?void 0:n.gpu)==null?void 0:ue.gtt_total)||((he=n==null?void 0:n.gpu)==null?void 0:he.vram_total)||0,O=(A==null?void 0:A.gtt_gb)||(_?_/E:0),D=(A==null?void 0:A.warm_projected_gb)??P,U=O>0?Math.min(100,D/O*100):0,B=g.filter(ae=>!j.includes(ae.name)&&!ae.incomplete);async function F(ae){m(!0);try{await SE("brains",ae,(b==null?void 0:b.swap)??!1,(b==null?void 0:b.persist)??!0),e.invalidateQueries({queryKey:Ve.groups}),e.invalidateQueries({queryKey:Ve.models}),e.invalidateQueries({queryKey:Ve.hermesBrain})}catch(se){o("Fehler",`Immer-bereit-Set konnte nicht geändert werden: ${(se==null?void 0:se.message)||se}`)}finally{m(!1)}}function Y(ae){const se=k(ae);if(se&&mr(se.role).protected){o("Geschützt",`„${mr(se.role).label}" ist lebenswichtig und bleibt immer bereit.`);return}F(j.filter(X=>X!==ae))}function H(ae){f(!1),F([...j,ae])}return b?l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-4",children:[l.jsx(V2,{}),l.jsxs("div",{className:"space-y-1.5",children:[N.length===0&&l.jsx("div",{className:"text-xs text-muted-foreground",children:"Noch keine Modelle im Set."}),N.map(ae=>{const se=v.includes(ae.name),X=mr(ae.role).protected;return l.jsxs("div",{className:"flex items-center justify-between gap-2 rounded-xl border border-border/30 bg-background/20 p-2.5",children:[l.jsxs("div",{className:"flex min-w-0 items-center gap-2.5",children:[l.jsx("span",{className:ee("h-2 w-2 shrink-0 rounded-full ring-2 ring-black/40",se?"bg-emerald-500 animate-pulse":"bg-muted-foreground/40"),title:se?"Gerade warm (bereit)":"Reserviert — lädt bei Bedarf sofort"}),ae.role&&l.jsx(io,{role:ae.role,dense:!0,className:"shrink-0"}),l.jsx("span",{className:"truncate font-mono text-xs font-semibold text-foreground",title:ae.name,children:S(ae.name)}),l.jsx("span",{className:"shrink-0 font-mono text-[10px] text-muted-foreground/70",children:Lr(ae.size_bytes)})]}),X?l.jsx("span",{className:"shrink-0 text-[10px] font-semibold text-muted-foreground",title:"Lebenswichtig — bleibt immer im Set.",children:"🔒"}):l.jsx("button",{onClick:()=>Y(ae.name),disabled:h,className:"flex h-7 w-7 shrink-0 items-center justify-center rounded-lg border border-border/40 text-muted-foreground transition-colors hover:bg-red-500/5 hover:text-red-400 cursor-pointer disabled:opacity-50",title:"Aus dem Immer-bereit-Set nehmen (lädt dann nur noch bei Bedarf)",children:l.jsx(Wn,{className:"h-3.5 w-3.5"})})]},ae.name)})]}),l.jsxs("button",{onClick:()=>f(!0),disabled:h||B.length===0,className:"flex h-8 w-full items-center justify-center gap-1.5 rounded-lg border border-dashed border-border/50 text-[11px] font-semibold uppercase tracking-wide text-muted-foreground transition-colors hover:border-primary/40 hover:text-primary cursor-pointer disabled:opacity-50",children:[l.jsx(df,{className:"h-3.5 w-3.5"})," Modell dauerhaft bereithalten"]}),l.jsxs("div",{className:"rounded-xl border border-border/30 bg-background/20 p-3",children:[l.jsxs("div",{className:"mb-1.5 flex items-center justify-between text-[11px]",children:[l.jsxs("span",{className:"flex items-center gap-1.5 font-semibold uppercase tracking-wider text-muted-foreground",title:"Modellgewichte + Arbeitsspeicher (KV-Cache)",children:[l.jsx(yu,{className:"h-3.5 w-3.5"})," Reserviert fürs Set"]}),l.jsxs("span",{className:"font-mono font-bold text-foreground",children:[D.toFixed(1),O>0?` / ${O.toFixed(0)}`:""," GB"]})]}),l.jsx("div",{className:"h-2 w-full overflow-hidden rounded-full border border-border/30 bg-background/50",children:l.jsx("div",{className:ee("h-full rounded-full transition-all duration-500",U>=85?"bg-red-500":U>=65?"bg-amber-500":"bg-teal-500"),style:{width:`${U}%`}})}),A&&!A.fits&&l.jsxs("p",{className:"mt-2 flex items-start gap-1.5 text-[11px] text-amber-400",children:[l.jsx(bi,{className:"mt-0.5 h-3.5 w-3.5 shrink-0"}),l.jsxs("span",{children:["Zusammen mit dem größten Gelegenheits-Modell (~",A.largest_ondemand_gb," GB, z. B. das große Hirn) passt das Set nicht gleichzeitig in den Speicher. Beim Laden wird das Set kurz verdrängt und danach automatisch nachgeladen — kostet ein paar Sekunden."]})]}),A&&A.fits&&l.jsxs("p",{className:"mt-2 flex items-center gap-1.5 text-[11px] text-emerald-400",children:[l.jsx(sr,{className:"h-3.5 w-3.5 shrink-0"})," Passt auch neben dem größten Gelegenheits-Modell — nichts wird verdrängt."]})]}),u&&l.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/60 p-4 backdrop-blur-sm",role:"dialog","aria-modal":"true","aria-label":"Modell zum Immer-bereit-Set hinzufügen",children:l.jsxs("div",{className:"w-full max-w-md space-y-3 rounded-2xl border border-border/80 bg-card p-6 shadow-2xl animate-in fade-in zoom-in-95 duration-200",children:[l.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary",children:"Dauerhaft bereithalten"}),l.jsx("button",{onClick:()=>f(!1),className:"rounded p-1 text-muted-foreground hover:bg-accent hover:text-foreground cursor-pointer",children:l.jsx(Wn,{className:"h-4 w-4"})})]}),l.jsx("p",{className:"text-xs text-muted-foreground",children:"Wähle ein Modell, das ohne Ladezeit bereitstehen soll:"}),l.jsx("div",{className:"max-h-60 space-y-1.5 overflow-y-auto pr-1",children:B.map(ae=>l.jsxs("button",{onClick:()=>H(ae.name),className:"flex w-full items-center justify-between gap-2 rounded-lg border border-border/30 bg-background/20 px-3 py-2.5 text-left transition-colors hover:bg-accent cursor-pointer",children:[l.jsxs("span",{className:"flex min-w-0 items-center gap-2",children:[ae.role&&l.jsx(io,{role:ae.role,dense:!0,className:"shrink-0"}),l.jsx("span",{className:"truncate font-mono text-xs font-semibold text-foreground",children:S(ae.name)})]}),l.jsx("span",{className:"shrink-0 font-mono text-[10px] text-muted-foreground/70",children:Lr(ae.size_bytes)})]},ae.name))})]})}),c]}):l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10",children:[l.jsx(V2,{}),l.jsx("p",{className:"mt-3 text-xs text-muted-foreground",children:"Es gibt noch kein Immer-bereit-Set. Es entsteht automatisch, sobald Lucys Hirn zugewiesen ist."}),c]})}function V2(){return l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(xa,{className:"h-4.5 w-4.5 text-primary"}),l.jsxs("div",{children:[l.jsx("h2",{className:"text-sm font-bold uppercase tracking-wide text-foreground",children:"Immer-bereit-Set"}),l.jsx("p",{className:"text-[11px] text-muted-foreground",children:"Diese Modelle hält Lucy immer bereit — sie antworten ohne Ladezeit."})]})]})}function qO(){var Fe,Oe,ut,Jt;const e=Yn(),{data:t,isLoading:r,error:n}=Ni(4e3),{data:a}=vh(4e3),{data:o}=AE(),{data:c}=Po(),{data:u}=EE(),{showAlert:f,showConfirm:h,showPrompt:m,dialogElement:g}=Aa(),v=gE(),b=W=>!!mr(W).protected,j=(t==null?void 0:t.models)??[],k=(t==null?void 0:t.running)??[],S=n?String(n):"",N=()=>{e.invalidateQueries({queryKey:Ve.models}),e.invalidateQueries({queryKey:Ve.routing})},E=(Fe=u==null?void 0:u.groups)==null?void 0:Fe.brains,A=(E==null?void 0:E.members)??[],P=W=>A.includes(W),_=A.some(W=>k.includes(W));async function O(W){if(!E){f("Keine brains-Gruppe","Es existiert noch keine Ko-Residenz-Gruppe „brains“ in der Engine-Konfiguration. Lege sie erst über die Gruppen-Verwaltung an.");return}const Ae=A.includes(W)?A.filter(Be=>Be!==W):[...A,W];try{await SE("brains",Ae,E.swap??!1,E.persist??!0),e.invalidateQueries({queryKey:Ve.groups}),N()}catch(Be){f("Fehler",`Ko-Residenz konnte nicht geändert werden: ${Be.message||Be}`)}}const[D,U]=y.useState(null),[B,F]=y.useState(null),[Y,H]=y.useState(null),[pe,ue]=y.useState("grid"),[he,ae]=y.useState("all"),se=j.filter(W=>he==="in_use"?!!W.role||k.includes(W.name):!0);async function X(W){try{await Se(`/api/models/${encodeURIComponent(W)}/load`,{method:"POST"}),N()}catch(ke){f("Fehler",`Fehler beim Laden des Modells: ${ke.message}`)}}async function te(W){if(E&&_&&!P(W)){const ke=A.filter(Ae=>k.includes(Ae)).map(Ae=>Ae.split("/").pop()).join(", ");h("Verdrängt das Hirn?",`„${W.split("/").pop()}“ ist nicht in der Ko-Residenz-Gruppe „brains“. Beim Laden wirft es das aktuell warme Hirn (${ke}) raus — Lucy verliert Hirn bzw. Augen. Trotzdem exklusiv laden? Tipp: Mit dem 🧠-Schalter machst du das Modell dauerhaft ko-resident, dann bleiben beide warm.`,()=>X(W));return}X(W)}async function J(W){const ke=j.find(Ae=>Ae.name===W);if(ke&&b(ke.role)){f("Geschützt",`„${mr(ke.role).label}" ist lebenswichtig für Lucy und bleibt geladen. Zum Entladen erst im Experten-Modus die Rolle einem anderen Modell geben.`);return}try{await Se(`/api/models/${encodeURIComponent(W)}/unload`,{method:"POST"}),N()}catch(Ae){f("Fehler",`Fehler beim Entladen des Modells: ${Ae.message}`)}}async function I(){try{await Se("/api/models/unload",{method:"POST"}),N()}catch(W){f("Fehler",`Fehler beim Entladen aller Modelle: ${W.message}`)}}async function M(W,ke){try{const Ae=await Se(`/api/models/${encodeURIComponent(ke)}/role`,{method:"POST",body:JSON.stringify({role:W||null})});N(),Ae!=null&&Ae.warning&&f("Hirn gesetzt — Hinweis",Ae.warning)}catch(Ae){f("Fehler",`Fehler beim Zuweisen der Rolle: ${Ae.message||Ae}`)}}function K(W){U(W),F(null),Se(`/api/roles/${encodeURIComponent(W)}/recommend`).then(ke=>F(ke)).catch(()=>{})}async function ne(W,ke){let Ae=null;try{Ae=await Se(`/api/models/${encodeURIComponent(W)}/ctx/auto`)}catch{}const Be=Ae?`Optimal für dein Setup: ${(Ae.ctx/1024).toFixed(0)}k (${Ae.ctx}) — GTT ${Ae.gtt_gb} GB − reserviert ${Ae.reserved_gb} GB (${Ae.mode}) → ${Ae.budget_gb} GB frei. »Auto« trägt diesen Wert ein.`:"Gib die gewünschte Kontextlänge in Tokens an:";m("Kontextlänge anpassen",Be,String(ke||32768),async et=>{if(et)try{await Se(`/api/models/${encodeURIComponent(W)}/ctx`,{method:"POST",body:JSON.stringify({ctx:parseInt(et,10)})}),N()}catch(Ut){f("Fehler",`Fehler beim Setzen des Kontexts: ${Ut.message||Ut}`)}},void 0,Ae?{autoValue:String(Ae.ctx),autoLabel:`Auto (${(Ae.ctx/1024).toFixed(0)}k)`}:void 0)}async function Z(W){const ke=j.find(Ae=>Ae.name===W);if(ke&&b(ke.role)){f("Geschützt",`„${mr(ke.role).label}" ist lebenswichtig für Lucy und kann nicht gelöscht werden. Weise die Rolle zuerst einem anderen Modell zu.`);return}h("Modell löschen?",`Modell '${W}' und alle zugehörigen GGUF-Dateien unwiderruflich von der Box löschen?`,async()=>{try{await Se(`/api/models/${encodeURIComponent(W)}`,{method:"DELETE"}),N()}catch(Ae){f("Fehler",`Fehler beim Löschen: ${Ae.message||Ae}`)}})}async function me(W,ke,Ae,Be){try{await Se("/api/models/install",{method:"POST",body:JSON.stringify({repo:W,role:ke,quant:Ae,jinja:Be})}),f("Herunterladen gestartet",`Download für '${W}' gestartet! Der Fortschritt wird oben angezeigt.`)}catch(et){f("Fehler",`Fehler beim Starten des Upgrades: ${et.message||et}`)}}async function ge(W){const ke=o==null?void 0:o.budget,Ae=ke&&!ke.fits?` @@ -649,15 +649,15 @@ Trotzdem exklusiv laden? Tipp: Mit dem 🧠-Schalter machst du das Modell dauerh stroke-dasharray: 4 6; animation: flow-dash 1s linear infinite; } - `}),l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-3.5",children:[l.jsxs("div",{className:"flex justify-between items-center",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(yu,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("span",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"VRAM / Memory Belegung"})]}),l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsxs("span",{className:"text-[10px] font-mono text-muted-foreground",children:["Speicher-Pool: ",Lr(re)," Gewichte",_e>0?` · ${Lr(_e)} real belegt (inkl. KV)`:""," / ",Lr(Je)]}),v&&k.length>0&&l.jsx("button",{onClick:I,className:"h-6 px-2.5 rounded border border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/10 text-amber-400 text-[9px] font-bold uppercase transition-all cursor-pointer",children:"Alle entladen"})]})]}),l.jsx("div",{className:"h-7 w-full rounded-xl bg-background/50 border border-border/40 overflow-hidden flex p-0.5 relative group",children:Pe.length===0?l.jsx("div",{className:"w-full h-full flex items-center justify-center text-[10px] text-muted-foreground/60 italic font-mono select-none",children:"VRAM Leer — Auto-Swap lädt Modelle bei Anfrage"}):Pe.map((W,ke)=>{var et;const Ae=(W.size_bytes||0)/Je*100,Be=["from-teal-500 to-emerald-500","from-indigo-500 to-blue-500","from-purple-500 to-pink-500","from-cyan-500 to-sky-500"][ke%4];return l.jsxs("div",{style:{width:`${Ae}%`},className:ee("h-full rounded bg-gradient-to-r flex items-center justify-between px-2.5 transition-all text-white/95 shrink-0 shadow-inner select-none",Be),title:`${W.name} (${Lr(W.size_bytes)})`,children:[l.jsxs("span",{className:"text-[9px] font-bold truncate max-w-[120px] font-space tracking-wide",children:[W.role?`[${mr(W.role).short}] `:"",(et=W.name.split("/").pop())==null?void 0:et.replace(".gguf","")]}),l.jsx("span",{className:"text-[8px] font-mono opacity-80",children:Lr(W.size_bytes)})]},W.name)})})]}),l.jsx(SX,{}),v&&l.jsx(jX,{}),l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-3.5",children:[l.jsx("div",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground px-1",children:v?"Gateway Steckplatz-Belegung (Slot-Zuweisung)":"Wer macht was bei Lucy — zum Ändern antippen"}),l.jsx("div",{className:"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-6 gap-3",children:GO.map(W=>{var Be;const ke=j.find(et=>et.role===W),Ae=ke?k.includes(ke.name):!1;return l.jsxs("div",{onClick:()=>K(W),className:ee("rounded-xl border p-3 flex flex-col justify-between gap-2.5 transition-all cursor-pointer select-none text-left bg-background/25 hover:border-primary/45 hover:bg-background/40 group min-h-[90px]",Ae?"border-emerald-500/40 shadow-sm shadow-emerald-500/5":ke?"border-primary/20 bg-primary/5":"border-border/30 border-dashed opacity-75"),children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx(io,{role:W}),Ae&&l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-400 animate-pulse"})]}),l.jsx("div",{className:"text-[10px] font-mono font-medium truncate text-foreground/90 pr-1 font-space",title:ke==null?void 0:ke.name,children:ke?(Be=ke.name.split("/").pop())==null?void 0:Be.replace(/\.gguf$/i,""):"nicht zugewiesen"}),l.jsx("div",{className:"text-[8px] text-primary/70 group-hover:text-primary font-bold uppercase tracking-wider transition-colors font-space",children:"Ändern ➔"})]},W)})})]}),(o==null?void 0:o.current)&&l.jsxs("div",{className:"rounded-2xl border border-indigo-500/30 bg-indigo-500/5 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-3.5",children:[l.jsxs("div",{className:"flex items-center justify-between flex-wrap gap-2",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(wn,{className:"h-4.5 w-4.5 text-indigo-400"}),l.jsx("span",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"Agent-Hirn (Hermes)"}),o.current.version!=null&&l.jsxs("span",{className:"text-[9px] font-mono px-1.5 py-0.5 rounded bg-indigo-500/15 text-indigo-300 border border-indigo-500/25",children:["v",o.current.version]})]}),l.jsx("button",{onClick:()=>window.dispatchEvent(new CustomEvent("mc-navigate",{detail:{view:"agent"}})),className:"h-7 px-3 rounded-lg border border-indigo-500/30 bg-indigo-500/5 text-indigo-300 text-[9px] font-bold uppercase hover:bg-indigo-500/15 transition-all cursor-pointer",title:"Hirn-Wechsel passiert jetzt zentral im Hermes-Tab",children:"Im Hermes-Tab wechseln →"})]}),l.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-3 rounded-xl bg-background/30 border border-border/30 p-3.5",children:[l.jsxs("div",{className:"min-w-0",children:[l.jsx("div",{className:"text-xs font-mono font-bold text-foreground truncate",title:o.current.name,children:o.current.name.split("/").pop()}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2 mt-0.5",children:[l.jsx("span",{children:o.current.params_b?`${o.current.params_b}B`:"—"}),l.jsx("span",{children:"•"}),l.jsx("span",{children:o.current.quant||"GGUF"}),l.jsx("span",{children:"•"}),l.jsx("span",{children:Lr(o.current.size_bytes||0)})]})]}),o.update_available&&o.recommended?l.jsxs("button",{onClick:()=>ge(o.recommended.repo),className:ee("h-8 px-3 shrink-0 flex items-center justify-center gap-1.5 rounded-lg text-[10px] font-bold uppercase transition-all cursor-pointer shadow-md",o.budget&&!o.budget.fits?"bg-red-500 text-white hover:bg-red-400 shadow-red-500/10":"bg-amber-500 text-black hover:bg-amber-400 shadow-amber-500/10"),children:[l.jsx(Bs,{className:"h-3.5 w-3.5"})," Aktualisieren"]}):l.jsxs("span",{className:"h-8 px-3 shrink-0 flex items-center gap-1.5 text-[10px] font-bold text-emerald-400 uppercase tracking-wide bg-emerald-500/5 border border-emerald-500/15 rounded-lg select-none",children:[l.jsx(sr,{className:"h-4 w-4"})," Neueste Generation"]})]}),o.update_available&&o.recommended&&l.jsxs("div",{className:"text-[10px] text-amber-400/90 flex items-center gap-1.5",children:[l.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-amber-400 animate-ping shrink-0"}),"Neuere Generation verfügbar: ",l.jsx("span",{className:"font-mono font-bold",children:o.recommended.name.replace(/-GGUF$/i,"")}),"(v",o.recommended.version,", ",o.recommended.params_b,"B) — von NousResearch."]}),o.budget&&l.jsxs("div",{className:ee("text-[10px] flex items-start gap-1.5 leading-relaxed",o.budget.fits?"text-muted-foreground/80":"text-red-400 font-semibold"),children:[l.jsx(yu,{className:"h-3 w-3 shrink-0 mt-0.5"}),l.jsxs("span",{children:["Always-On-Brain ~",o.budget.brain_gb," GB + größtes on-demand (~",o.budget.largest_ondemand_gb," GB) = ",(o.budget.brain_gb+o.budget.largest_ondemand_gb).toFixed(1)," / ",o.budget.gtt_gb," GB",o.budget.fits?" · passt gleichzeitig ✓":" · passt NICHT gleichzeitig ⚠ — heavy/coder würden das Brain verdrängen. Kleineres Brain oder weniger Kontext."]})]})]}),l.jsxs("div",{className:"space-y-4",children:[l.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-3 px-1",children:[l.jsxs("div",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:["Installierte Modell-Bibliothek (",se.length," von ",j.length,")"]}),l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsxs("div",{className:"flex rounded-lg border border-border/40 bg-card/45 p-0.5",children:[l.jsx("button",{onClick:()=>ae("all"),className:ee("px-2.5 py-1 rounded-md text-[9px] font-bold uppercase transition-all cursor-pointer",he==="all"?"bg-primary text-primary-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:"Vorhanden"}),l.jsx("button",{onClick:()=>ae("in_use"),className:ee("px-2.5 py-1 rounded-md text-[9px] font-bold uppercase transition-all cursor-pointer",he==="in_use"?"bg-primary text-primary-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:"In Benutzung"})]}),l.jsxs("div",{className:"flex rounded-lg border border-border/40 bg-card/45 p-0.5",children:[l.jsx("button",{onClick:()=>ue("grid"),className:ee("px-2.5 py-1 rounded-md text-[9px] font-bold uppercase transition-all cursor-pointer",pe==="grid"?"bg-primary text-primary-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:"Grid"}),l.jsx("button",{onClick:()=>ue("list"),className:ee("px-2.5 py-1 rounded-md text-[9px] font-bold uppercase transition-all cursor-pointer",pe==="list"?"bg-primary text-primary-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:"List"})]})]})]}),pe==="grid"?l.jsx("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-3",children:se.length===0?l.jsx("div",{className:"col-span-full text-xs text-muted-foreground border border-dashed border-border/60 rounded-2xl p-12 text-center select-none",children:he==="in_use"?"Keine Modelle in Benutzung (keine Zuweisung oder warm geladene Modelle).":'Keine Modelle konfiguriert. Verwende den Tab "Modelle finden" zum Herunterladen.'}):se.map(W=>{const ke=k.includes(W.name),Ae=a==null?void 0:a.model_list.find(et=>et.role===W.role),Be=H2(W.name);return l.jsxs("div",{className:ee("rounded-2xl border bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 flex flex-col justify-between gap-4 transition-all duration-300 hover:border-primary/40 group relative overflow-hidden",ke?"border-primary/45 shadow-primary/5":W.role?"border-primary/30 bg-primary/5 shadow-inner":"border-border/60"),children:[l.jsxs("div",{className:"space-y-3",children:[l.jsx("div",{className:"flex items-start justify-between gap-3",children:l.jsxs("div",{className:"flex gap-2.5 min-w-0",children:[l.jsx("div",{className:ee("w-7 h-7 rounded-lg border flex items-center justify-center font-bold text-xs shrink-0 shadow-sm",Be.color),title:Be.name,children:Be.initial}),l.jsxs("div",{className:"min-w-0",children:[l.jsx("h3",{className:"text-xs font-bold tracking-tight text-foreground line-clamp-2 break-all font-mono",title:W.name,children:W.name.split("/").pop()}),l.jsxs("div",{className:"flex items-center gap-2 flex-wrap mt-1",children:[l.jsx("span",{className:"text-[9px] font-mono text-muted-foreground bg-background/40 px-1.5 py-0.5 rounded border border-border/30",children:W.quant||"GGUF"}),ke&&l.jsxs("span",{className:"flex items-center gap-1 text-[9px] font-semibold text-emerald-400 uppercase tracking-wider",children:[l.jsx(uh,{className:"h-3 w-3 animate-pulse"})," Warm"]}),W.role&&l.jsx(io,{role:W.role,dense:!0}),b(W.role)&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-background/40 border border-border/40 text-[9px] font-semibold text-muted-foreground",title:"Lebenswichtig für Lucy — geschützt vor Löschen/Entladen.",children:"🔒 geschützt"}),v&&P(W.name)&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-fuchsia-500/10 border border-fuchsia-500/30 text-[9px] font-mono text-fuchsia-300 font-bold uppercase",title:"Ko-resident in der brains-Gruppe — bleibt mit dem Hirn gemeinsam warm, verdrängt es nicht.",children:"🧠 Ko-resident"}),v&&W.prompt_cache&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-cyan-500/10 border border-cyan-500/20 text-[9px] font-mono text-cyan-400 font-bold uppercase",title:"Prompt Caching aktiv",children:"PC"}),v&&(W.spec_active?l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-emerald-500/10 border border-emerald-500/20 text-[9px] font-mono text-emerald-400 font-bold uppercase",title:`Speculative Decoding aktiv (Draft: ${W.spec_draft_model})`,children:"SPEC"}):W.spec_draft_model?l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/20 text-[9px] font-mono text-amber-400 font-bold uppercase",title:`Draft gesetzt (${W.spec_draft_model}), aber INAKTIV — --spec-type fehlt oder Vocab inkompatibel. Über 'Spec' neu konfigurieren.`,children:"SPEC?"}):null),v&&W.parallel_slots>1&&l.jsxs("span",{className:"px-1.5 py-0.5 rounded bg-violet-500/10 border border-violet-500/20 text-[9px] font-mono text-violet-400 font-bold uppercase",title:`${W.parallel_slots} parallele Slots aktiv`,children:["SLOTS: ",W.parallel_slots]}),W.incomplete&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/20 text-[9px] font-mono text-amber-400 font-bold uppercase",title:"GGUF-Datei fehlt — Modell kann nicht geladen werden",children:"⚠ Datei fehlt"})]})]})]})}),l.jsx("div",{className:"border-t border-border/30 pt-3 flex flex-wrap gap-1",children:l.jsx(K2,{caps:W.capabilities})})]}),l.jsxs("div",{className:"space-y-3 pt-1",children:[l.jsxs("div",{className:"grid grid-cols-2 gap-2 text-[10px] font-mono text-muted-foreground",children:[l.jsxs("div",{className:"flex items-center gap-1.5 p-2 bg-background/20 rounded-lg border border-border/20",children:[l.jsx(yu,{className:"h-3.5 w-3.5 text-primary/80"}),l.jsxs("div",{children:[l.jsx("div",{className:"text-[8px] uppercase tracking-wider font-semibold text-muted-foreground/60",children:"Größe"}),l.jsx("div",{className:"text-foreground font-semibold",children:Lr(W.size_bytes)})]})]}),l.jsxs("div",{className:"flex items-center gap-1.5 p-2 bg-background/20 rounded-lg border border-border/20",children:[l.jsx(C4,{className:"h-3.5 w-3.5 text-primary/80"}),l.jsxs("div",{children:[l.jsx("div",{className:"text-[8px] uppercase tracking-wider font-semibold text-muted-foreground/60",children:"Kontext"}),l.jsx("div",{className:"text-foreground font-semibold",children:$w(W.ctx)})]})]})]}),Ae&&l.jsxs("div",{className:"p-3 bg-amber-500/5 border border-amber-500/30 rounded-xl space-y-2 flex flex-col justify-between shrink-0",children:[l.jsxs("div",{className:"text-[9px] font-semibold text-amber-400 flex items-center gap-1",children:[l.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-amber-400 animate-ping"}),l.jsxs("span",{children:["Upgrade verfügbar: ",Ae.repo.split("/").pop()]})]}),l.jsxs("button",{onClick:()=>me(Ae.repo,W.role,W.quant||"Q4_K_M",W.capabilities.tools!=="no"),className:"h-7 w-full flex items-center justify-center gap-1 rounded-lg bg-amber-500 text-black text-[10px] font-bold hover:bg-amber-400 transition-colors cursor-pointer",children:[l.jsx(Bs,{className:"h-3 w-3"})," Smart-Swap starten"]})]}),l.jsxs("div",{className:"flex items-center gap-1.5 border-t border-border/20 pt-3 mt-auto",children:[(()=>{const et=b(W.role),Ut=ke&&et,ht=W.incomplete&&!ke||Ut;return l.jsx("button",{onClick:()=>ke?J(W.name):te(W.name),disabled:ht,title:Ut?`„${mr(W.role).label}" bleibt geladen (geschützt).`:void 0,className:ee("flex-1 h-7 rounded-lg text-[9px] font-bold uppercase transition-all border flex items-center justify-center gap-1",ht?"border-border/30 bg-background/10 text-muted-foreground/50 cursor-not-allowed":ke?"border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/15 text-amber-400 cursor-pointer":"border-primary/30 bg-primary/5 hover:bg-primary/15 text-primary cursor-pointer"),children:Ut?"🔒 geladen":ke?"Entladen":"Laden"})})(),v&&l.jsx("button",{onClick:()=>ne(W.name,W.ctx),className:"h-7 px-2.5 rounded-lg border border-border/40 text-[9px] font-bold uppercase hover:bg-accent text-muted-foreground transition-colors cursor-pointer",title:"Kontextlänge anpassen",children:"Ctx"}),v&&E&&l.jsx("button",{onClick:()=>O(W.name),className:ee("h-7 px-2.5 rounded-lg border text-[9px] font-bold uppercase transition-colors cursor-pointer",P(W.name)?"border-fuchsia-500/40 bg-fuchsia-500/10 text-fuchsia-300 hover:bg-fuchsia-500/20":"border-border/40 text-muted-foreground hover:bg-accent"),title:P(W.name)?"Ko-resident (brains): bleibt mit dem Hirn gemeinsam warm. Klick = aus der Gruppe nehmen.":"Zur brains-Gruppe hinzufügen — lädt dann ko-resident neben dem Hirn, statt es zu verdrängen.",children:"🧠"}),v&&l.jsxs("button",{onClick:()=>H(W),className:ee("h-7 px-2.5 rounded-lg border text-[9px] font-bold uppercase transition-colors cursor-pointer flex items-center gap-1",W.spec_active?"border-emerald-500/30 text-emerald-400 hover:bg-emerald-500/10":W.spec_draft_model?"border-amber-500/30 text-amber-400 hover:bg-amber-500/10":"border-border/40 text-muted-foreground hover:bg-accent"),title:"Speculative Draft konfigurieren (Vocab-geprüft)",children:[l.jsx(xa,{className:"h-3 w-3"})," Spec"]}),l.jsx("button",{onClick:()=>Z(W.name),disabled:b(W.role),className:ee("h-7 w-7 rounded-lg border border-border/40 flex items-center justify-center transition-colors",b(W.role)?"text-muted-foreground/40 cursor-not-allowed":"text-muted-foreground hover:text-red-400 hover:bg-red-500/5 cursor-pointer"),"aria-label":"Modell löschen",title:b(W.role)?`„${mr(W.role).label}" ist geschützt und kann nicht gelöscht werden.`:"Modell löschen",children:l.jsx(cv,{className:"h-3.5 w-3.5","aria-hidden":"true"})})]})]})]},W.name)})}):l.jsx("div",{className:"space-y-2",children:se.length===0?l.jsx("div",{className:"text-xs text-muted-foreground border border-dashed border-border/60 rounded-2xl p-12 text-center select-none",children:he==="in_use"?"Keine Modelle in Benutzung (keine Zuweisung oder warm geladene Modelle).":'Keine Modelle konfiguriert. Verwende den Tab "Modelle finden" zum Herunterladen.'}):se.map(W=>{const ke=k.includes(W.name),Ae=H2(W.name);return l.jsxs("div",{className:ee("rounded-xl border bg-card/45 backdrop-blur-md p-3.5 shadow-lg shadow-black/5 flex flex-col sm:flex-row sm:items-center justify-between gap-3 hover:border-primary/40 transition-all",ke?"border-primary/45":W.role?"border-primary/30 bg-primary/5":"border-border/60"),children:[l.jsxs("div",{className:"flex items-center gap-3 min-w-0",children:[l.jsx("div",{className:ee("w-8 h-8 rounded-lg border border-border/40 flex items-center justify-center font-bold text-xs shrink-0 shadow-sm",Ae.color),title:Ae.name,children:Ae.initial}),l.jsxs("div",{className:"min-w-0 text-left",children:[l.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[l.jsx("h4",{className:"text-xs font-bold text-foreground truncate max-w-[250px] sm:max-w-[400px] break-all font-mono",title:W.name,children:W.name.split("/").pop()}),W.role&&l.jsx(io,{role:W.role,dense:!0,className:"shrink-0"}),b(W.role)&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-background/40 border border-border/40 text-[8px] font-semibold text-muted-foreground shrink-0",title:"Lebenswichtig für Lucy — geschützt vor Löschen/Entladen.",children:"🔒 geschützt"}),v&&P(W.name)&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-fuchsia-500/10 border border-fuchsia-500/30 text-[8px] font-mono text-fuchsia-300 font-bold uppercase shrink-0",title:"Ko-resident in der brains-Gruppe — bleibt mit dem Hirn gemeinsam warm.",children:"🧠 Ko-resident"}),v&&W.prompt_cache&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-cyan-500/10 border border-cyan-500/20 text-[8px] font-mono text-cyan-400 font-bold uppercase shrink-0",title:"Prompt Caching aktiv",children:"PC"}),v&&(W.spec_active?l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-emerald-500/10 border border-emerald-500/20 text-[8px] font-mono text-emerald-400 font-bold uppercase shrink-0",title:`Speculative Decoding aktiv (Draft: ${W.spec_draft_model})`,children:"SPEC"}):W.spec_draft_model?l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/20 text-[8px] font-mono text-amber-400 font-bold uppercase shrink-0",title:`Draft gesetzt (${W.spec_draft_model}), aber INAKTIV — --spec-type fehlt oder Vocab inkompatibel.`,children:"SPEC?"}):null),v&&W.parallel_slots>1&&l.jsxs("span",{className:"px-1.5 py-0.5 rounded bg-violet-500/10 border border-violet-500/20 text-[8px] font-mono text-violet-400 font-bold uppercase shrink-0",title:`${W.parallel_slots} parallele Slots aktiv`,children:["SLOTS: ",W.parallel_slots]}),W.incomplete&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/20 text-[8px] font-mono text-amber-400 font-bold uppercase shrink-0",title:"GGUF-Datei fehlt",children:"⚠ Datei fehlt"}),ke&&l.jsxs("span",{className:"flex items-center gap-0.5 text-[8px] font-semibold text-emerald-400 uppercase tracking-wider shrink-0",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"})," warm"]})]}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2 mt-0.5",children:[l.jsxs("span",{children:["Größe: ",Lr(W.size_bytes)]}),l.jsx("span",{children:"•"}),l.jsxs("span",{children:["Kontext: ",$w(W.ctx)]}),l.jsx("span",{children:"•"}),l.jsx("span",{className:"font-mono text-[9px]",children:W.quant||"GGUF"})]})]})]}),l.jsxs("div",{className:"flex items-center gap-3 shrink-0 self-end sm:self-auto",children:[l.jsx("div",{className:"hidden lg:flex flex-wrap gap-1",children:l.jsx(K2,{caps:W.capabilities})}),l.jsxs("div",{className:"flex items-center gap-1.5",children:[(()=>{const Be=b(W.role),et=ke&&Be,Ut=W.incomplete&&!ke||et;return l.jsx("button",{onClick:()=>ke?J(W.name):te(W.name),disabled:Ut,title:et?`„${mr(W.role).label}" bleibt geladen (geschützt).`:void 0,className:ee("h-7 px-3 rounded-lg text-[9px] font-bold uppercase transition-all border flex items-center gap-1",Ut?"border-border/30 bg-background/10 text-muted-foreground/50 cursor-not-allowed":ke?"border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/15 text-amber-400 cursor-pointer":"border-primary/30 bg-primary/5 hover:bg-primary/15 text-primary cursor-pointer"),children:et?"🔒 geladen":ke?"Entladen":"Laden"})})(),v&&l.jsx("button",{onClick:()=>ne(W.name,W.ctx),className:"h-7 px-2.5 rounded-lg border border-border/40 text-[9px] font-bold uppercase hover:bg-accent text-muted-foreground transition-all cursor-pointer",title:"Kontextlänge anpassen",children:"Ctx"}),v&&E&&l.jsx("button",{onClick:()=>O(W.name),className:ee("h-7 px-2.5 rounded-lg border text-[9px] font-bold uppercase transition-colors cursor-pointer",P(W.name)?"border-fuchsia-500/40 bg-fuchsia-500/10 text-fuchsia-300 hover:bg-fuchsia-500/20":"border-border/40 text-muted-foreground hover:bg-accent"),title:P(W.name)?"Ko-resident (brains): bleibt mit dem Hirn gemeinsam warm. Klick = aus der Gruppe nehmen.":"Zur brains-Gruppe hinzufügen — lädt dann ko-resident neben dem Hirn, statt es zu verdrängen.",children:"🧠"}),v&&l.jsxs("button",{onClick:()=>H(W),className:ee("h-7 px-2.5 rounded-lg border text-[9px] font-bold uppercase transition-all cursor-pointer flex items-center gap-1",W.spec_active?"border-emerald-500/30 text-emerald-400 hover:bg-emerald-500/10":W.spec_draft_model?"border-amber-500/30 text-amber-400 hover:bg-amber-500/10":"border-border/40 text-muted-foreground hover:bg-accent"),title:"Speculative Draft konfigurieren (Vocab-geprüft)",children:[l.jsx(xa,{className:"h-3 w-3"})," Spec"]}),l.jsx("button",{onClick:()=>Z(W.name),disabled:b(W.role),className:ee("h-7 w-7 rounded-lg flex items-center justify-center border border-border/40 transition-all",b(W.role)?"text-muted-foreground/40 cursor-not-allowed":"text-muted-foreground hover:text-red-400 hover:bg-red-500/5 cursor-pointer"),"aria-label":"Modell löschen",title:b(W.role)?`„${mr(W.role).label}" ist geschützt und kann nicht gelöscht werden.`:"Modell löschen",children:l.jsx(cv,{className:"h-3.5 w-3.5","aria-hidden":"true"})})]})]})]},W.name)})})]}),D&&(()=>{var et,Ut;const W=B&&B.role===D?B:null,ke={};W==null||W.models.forEach(ht=>{ke[ht.name]=ht});const Ae=W?W.models.map(ht=>j.find(ur=>ur.name===ht.name)).filter(Boolean):j,Be=ht=>{M(D,ht),U(null)};return l.jsx("div",{className:"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm flex items-center justify-center p-4 overscroll-contain",role:"dialog","aria-modal":"true","aria-label":`${mr(D).label} konfigurieren`,children:l.jsxs("div",{className:"w-full max-w-md rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[l.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[l.jsxs("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary flex items-center gap-1.5",children:[l.jsx(io,{role:D})," festlegen"]}),l.jsx("button",{onClick:()=>U(null),className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:l.jsx(Wn,{className:"h-4 w-4"})})]}),l.jsxs("div",{className:"flex items-center justify-between gap-2",children:[l.jsxs("p",{className:"text-xs text-muted-foreground",children:["Wähle ein Modell für ",l.jsx("strong",{className:"text-foreground",children:mr(D).label}),l.jsx("span",{className:"block text-[10px] text-muted-foreground/70 mt-0.5",children:mr(D).desc})]}),(W==null?void 0:W.recommended)&&l.jsxs("button",{onClick:()=>Be(W.recommended),title:(et=ke[W.recommended])==null?void 0:et.reason,className:"shrink-0 h-7 px-3 text-[11px] font-semibold text-primary border border-primary/50 bg-primary/10 hover:bg-primary/20 rounded-lg cursor-pointer flex items-center gap-1",children:[l.jsx(xa,{className:"h-3 w-3"})," Auto: ",(Ut=W.recommended.split("/").pop())==null?void 0:Ut.replace(/\.gguf$/i,"")]})]}),l.jsxs("div",{className:"space-y-1.5 max-h-60 overflow-y-auto pr-1",children:[b(D)?l.jsx("div",{className:"w-full px-3 py-2 rounded-lg text-[11px] text-muted-foreground border border-border/30 bg-background/20 flex items-center gap-1.5",children:"🔒 Diese Rolle ist lebenswichtig und kann nicht leer bleiben — wähle stattdessen ein anderes Modell."}):l.jsx("button",{onClick:()=>Be(""),className:"w-full text-left px-3 py-2 rounded-lg text-xs hover:bg-accent text-red-400 font-semibold cursor-pointer border border-red-500/20 bg-red-500/5 flex items-center justify-between",children:l.jsx("span",{children:"Zuweisung entfernen"})}),Ae.map(ht=>{var Or;const ur=ke[ht.name],Ca=ht.role===D,Jn=!!(ur!=null&&ur.recommended),Ii=!!ur&&!ur.suitable;return l.jsxs("button",{onClick:()=>Be(ht.name),className:ee("w-full text-left px-3 py-2.5 rounded-lg text-xs hover:bg-accent flex items-center justify-between font-mono cursor-pointer border",Jn?"border-primary/50 bg-primary/10":Ca?"text-primary font-bold bg-primary/5 border-primary/30":Ii?"border-border/20 bg-background/10 opacity-60":"text-foreground bg-background/20 border-border/30"),children:[l.jsxs("div",{className:"flex flex-col text-left min-w-0",children:[l.jsxs("span",{className:"truncate max-w-[260px] font-semibold flex items-center gap-1.5",children:[(Or=ht.name.split("/").pop())==null?void 0:Or.replace(/\.gguf$/i,""),Jn&&l.jsx("span",{className:"text-[8px] font-bold uppercase tracking-wide text-primary bg-primary/15 px-1.5 py-0.5 rounded",children:"Empfohlen"})]}),l.jsx("span",{className:"text-[9px] text-muted-foreground mt-0.5",children:ur?`${ur.params_b}B · ${ht.quant} · ${ur.reason}`:`${Lr(ht.size_bytes)} · ${ht.quant}`})]}),Ca&&l.jsx(sr,{className:"h-4 w-4 shrink-0 text-primary"})]},ht.name)})]})]})})})(),Y&&l.jsx(bX,{model:Y,onClose:()=>H(null),onChanged:N}),g]})}const NX=[{key:"popular",label:"Beliebt",q:""},{key:"coder",label:"Coder",q:"coder"},{key:"vision",label:"Vision",q:"vision"},{key:"reasoning",label:"Reasoning",q:"reasoning"},{key:"small",label:"Klein (≤4B)",q:"3B"}],EX=["fast","heavy","coder","vision","hermes","scout"],AX=new Intl.NumberFormat(void 0,{notation:"compact",maximumFractionDigits:1});function V2(e){return AX.format(e)}function CX(){const{data:e}=Ni(),t=(e==null?void 0:e.models)??[],[r,n]=y.useState(""),[a,o]=y.useState([]),[c,u]=y.useState(!1),[f,h]=y.useState(""),[m,g]=y.useState("popular"),[v,b]=y.useState(""),[j,k]=y.useState(null),[S,N]=y.useState([]),[E,A]=y.useState("Q4_K_M"),[P,_]=y.useState(""),[O,D]=y.useState(null),[U,B]=y.useState(!1),[F,Y]=y.useState({});async function H(M){u(!0),h("");try{const K=await Se(`/api/hf/search?q=${encodeURIComponent(M)}`);o(K.results),K.results.length||h("Keine Ergebnisse.")}catch(K){h(`Suche fehlgeschlagen: ${K}`)}finally{u(!1)}}y.useEffect(()=>{H("")},[]);function pe(M){g(M.key),n(""),H(M.q)}function ue(){g(""),H(r)}async function he(M,K,ne){B(!1);try{const Z=await Se(`/api/fit?params_b=0&quant=${encodeURIComponent(K)}&ctx=8192&name=${encodeURIComponent(M)}&role=${encodeURIComponent(ne)}`);D(Z)}catch{D(null)}}async function ae(M){if(j===M){k(null);return}k(M),N([]),D(null),_(""),B(!1),h("Analysiere Repository…");try{const K=await Se(`/api/hf/quants?repo=${encodeURIComponent(M)}`);N(K.quants);const ne=K.quants.includes("Q4_K_M")?"Q4_K_M":K.quants[0]||"Q4_K_M";A(ne),h(K.quants.length?"":"Keine GGUF-Dateien in diesem Repo gefunden."),K.quants.length&&he(K.repo,ne,"")}catch(K){h(`Fehler: ${K}`)}}function se(){const M=v.trim();M&&(o(K=>K.some(ne=>ne.repo===M)?K:[{repo:M,downloads:0,likes:0},...K]),b(""),ae(M))}const X=P?t.find(M=>(M.role||"").toLowerCase()===P):void 0;async function te(M){if((O==null?void 0:O.fit.level)==="too_tight"&&!U){B(!0);return}Y(K=>({...K,[M]:"Starte…"}));try{await Se("/api/models/install",{method:"POST",body:JSON.stringify({repo:M,quant:E,role:P||void 0,jinja:!0})}),Y(K=>({...K,[M]:"Download läuft"})),B(!1)}catch{Y(ne=>({...ne,[M]:"Fehler"}))}}const J=M=>{var ne;const K=((ne=M.split("/").pop())==null?void 0:ne.toLowerCase().replace(/-gguf$/i,""))||"";return K.length>3&&t.some(Z=>Z.name.toLowerCase().includes(K))},I=M=>M==="perfect"?"text-emerald-400 border-emerald-500/40 bg-emerald-500/10":M==="marginal"?"text-amber-400 border-amber-500/40 bg-amber-500/10":"text-red-400 border-red-500/40 bg-red-500/10";return l.jsxs("div",{className:"space-y-5",children:[l.jsxs("div",{className:"flex gap-2",children:[l.jsxs("div",{className:"relative flex-1",children:[l.jsx(MN,{className:"absolute left-3 top-2.5 h-4 w-4 text-muted-foreground"}),l.jsx("input",{value:r,onChange:M=>n(M.target.value),onKeyDown:M=>M.key==="Enter"&&ue(),"aria-label":"HuggingFace durchsuchen",type:"search",spellCheck:!1,placeholder:"HuggingFace durchsuchen (z.B. Qwen Coder, Llama-3.1, gemma)…",className:"w-full h-10 pl-9 pr-3 rounded-xl border border-border/60 bg-background/40 text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground"})]}),l.jsx("button",{onClick:ue,className:"h-10 px-5 rounded-xl bg-primary text-primary-foreground text-xs font-semibold hover:opacity-90 transition-all cursor-pointer",children:"Suchen"})]}),l.jsx("div",{className:"flex items-center gap-2 flex-wrap",children:NX.map(M=>l.jsxs("button",{onClick:()=>pe(M),className:ee("flex items-center gap-1.5 rounded-full px-3 py-1.5 text-[11px] font-semibold transition-all cursor-pointer border",m===M.key?"bg-primary/15 text-primary border-primary/30":"border-border/50 text-muted-foreground hover:text-foreground hover:border-border"),children:[M.key==="popular"&&l.jsx(u4,{className:"h-3 w-3"}),M.label]},M.key))}),c?l.jsx("div",{className:"text-xs text-muted-foreground py-10 text-center",children:"Lade GGUF-Modelle von HuggingFace…"}):l.jsxs("div",{className:"space-y-2",children:[a.map(M=>{const K=j===M.repo,ne=J(M.repo),Z=M.repo.includes("/")?M.repo.split("/")[0]:"—",me=M.repo.split("/").pop();return l.jsxs("div",{className:ee("rounded-xl border bg-card/45 backdrop-blur-md transition-all",K?"border-primary/40 shadow-lg shadow-primary/5":"border-border/50 hover:border-primary/30"),children:[l.jsxs("button",{onClick:()=>ae(M.repo),className:"w-full flex items-center gap-3 p-3.5 text-left cursor-pointer",children:[l.jsxs("div",{className:"min-w-0 flex-1",children:[l.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[l.jsx("span",{className:"text-xs font-bold font-mono text-foreground truncate max-w-[280px]",title:M.repo,children:me}),ne&&l.jsxs("span",{className:"flex items-center gap-1 text-[8px] font-bold text-emerald-400 uppercase tracking-wider bg-emerald-500/10 border border-emerald-500/20 px-1.5 py-0.5 rounded",children:[l.jsx(sr,{className:"h-2.5 w-2.5"})," installiert"]})]}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-3 mt-0.5 font-mono",children:[l.jsx("span",{children:Z}),l.jsxs("span",{className:"flex items-center gap-1",children:[l.jsx(Bs,{className:"h-3 w-3"})," ",V2(M.downloads)]}),M.likes>0&&l.jsxs("span",{className:"flex items-center gap-1",children:[l.jsx(m4,{className:"h-3 w-3"})," ",V2(M.likes)]})]})]}),K?l.jsx(ON,{className:"h-4 w-4 text-muted-foreground shrink-0"}):l.jsx(PN,{className:"h-4 w-4 text-muted-foreground shrink-0"})]}),K&&l.jsx("div",{className:"border-t border-border/30 p-3.5 space-y-3",children:S.length===0?l.jsx("div",{className:"text-[11px] text-muted-foreground font-mono",children:f||"Lade Quants…"}):l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[l.jsx("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground",children:"Quant"}),l.jsx("select",{value:E,onChange:ge=>{A(ge.target.value),he(M.repo,ge.target.value,P)},"aria-label":"Quantisierung",className:"h-8 rounded-lg border border-border/60 bg-background/40 px-2 text-xs text-foreground font-semibold outline-none",children:S.map(ge=>l.jsx("option",{value:ge,className:"bg-popover text-foreground",children:ge},ge))}),l.jsx("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground ml-1",children:"Rolle"}),l.jsxs("select",{value:P,onChange:ge=>{_(ge.target.value),he(M.repo,E,ge.target.value)},"aria-label":"Rolle",title:"Optional — bestimmt Auto-Konfiguration + setup-bewussten Kontext",className:"h-8 rounded-lg border border-border/60 bg-background/40 px-2 text-xs text-foreground font-semibold outline-none",children:[l.jsx("option",{value:"",className:"bg-popover text-foreground",children:"keine"}),EX.map(ge=>l.jsx("option",{value:ge,className:"bg-popover text-foreground",children:ge},ge))]}),l.jsx("button",{onClick:()=>te(M.repo),disabled:!!F[M.repo]&&F[M.repo]==="Download läuft",className:ee("h-8 px-3.5 ml-auto rounded-lg text-xs font-semibold transition-all cursor-pointer flex items-center gap-1.5",U?"bg-red-500 text-white hover:opacity-90":"bg-primary text-primary-foreground hover:opacity-90"),children:F[M.repo]?F[M.repo]:U?l.jsxs(l.Fragment,{children:[l.jsx(bi,{className:"h-3.5 w-3.5"})," OOM — trotzdem laden"]}):l.jsxs(l.Fragment,{children:[l.jsx(Bs,{className:"h-3.5 w-3.5"})," Herunterladen"]})})]}),O&&l.jsxs("div",{className:ee("flex flex-wrap items-center gap-x-3 gap-y-1 rounded-lg border px-3 py-2 text-[11px] font-medium",I(O.fit.level)),children:[l.jsx("span",{className:"font-bold uppercase tracking-wide",children:O.fit.text}),l.jsxs("span",{className:"font-mono opacity-90",children:["~",O.params_b,"B · ~",O.fit.req_gb," GB / ",O.sys_ram_gb," GB · ~",O.fit.tps," t/s"]}),O.fit.level!=="too_tight"?l.jsxs("span",{className:"font-mono opacity-80",children:["ctx → ",(O.assigned_ctx/1024).toFixed(0),"k"]}):l.jsx("span",{className:"opacity-90",children:"— passt nicht, würde beim Laden abstürzen (OOM)."})]}),X&&l.jsxs("div",{className:"flex items-start gap-2 rounded-lg border border-amber-500/40 bg-amber-500/10 px-3 py-2 text-[11px] text-amber-400",children:[l.jsx(bi,{className:"h-3.5 w-3.5 mt-0.5 shrink-0"}),l.jsxs("span",{children:["Rolle ",l.jsxs("strong",{children:["„",P,'"']})," hält aktuell ",l.jsx("strong",{children:X.name.split("/").pop()})," — wird beim Download übernommen."]})]})]})})]},M.repo)}),!a.length&&!c&&l.jsx("div",{className:"text-xs text-muted-foreground py-10 text-center",children:f||"Keine Ergebnisse."})]}),l.jsxs("div",{className:"border-t border-border/30 pt-4 flex flex-col sm:flex-row gap-2 items-stretch sm:items-center",children:[l.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground shrink-0",children:"Direkt:"}),l.jsx("input",{value:v,onChange:M=>b(M.target.value),onKeyDown:M=>M.key==="Enter"&&se(),"aria-label":"Repository oder URL direkt eingeben",spellCheck:!1,placeholder:"org/repo oder HF-URL (z.B. unsloth/Qwen2.5-Coder-7B-Instruct-GGUF)",className:"flex-1 h-9 rounded-lg border border-border/60 bg-background/40 px-3 text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground font-mono"}),l.jsx("button",{onClick:se,className:"h-9 px-4 rounded-lg border border-border/60 bg-background/20 text-xs font-semibold hover:border-primary/50 hover:bg-background/40 transition-all cursor-pointer whitespace-nowrap",children:"Laden"})]})]})}const PX={fast:{title:"Schnelles Alltags-Hirn",desc:"Schnelle MoE-Antworten für Chat, Zusammenfassungen und alltägliche Aufgaben.",icon:xa},heavy:{title:"Schweres Reasoning",desc:"Große Modelle für komplexe Logik, Mathematik und tiefgründiges Planen.",icon:Ao},coder:{title:"Coden & Entwicklung",desc:"Autovervollständigung, Refactoring und Codegenerierung direkt in deiner IDE.",icon:Fs},vision:{title:"Bilder & Vision",desc:"Verarbeitet Bilder, Screenshots und visuelle Diagramme in multimodalen Chats.",icon:uf},hermes:{title:"Lucys Hirn (Agent)",desc:"Lucys dauer-warmes Agent-Hirn mit Tool-Calling — bleibt ko-resident, lädt nie kalt nach.",icon:Q3},scout:{title:"Multimodal-Allrounder",desc:"Multimodaler Allrounder für schnelle Antworten, Übersetzungen und Alltag.",icon:lv}};function OX(){const{data:e,isLoading:t,error:r}=RD(),{data:n}=Ni(),{data:a}=vh(),o=(n==null?void 0:n.models)??[],c=r?String(r):"",[u,f]=y.useState({}),[h,m]=y.useState({}),[g,v]=y.useState("recommended");async function b(j,k,S,N){f(E=>({...E,[j]:"Starte..."}));try{await Se("/api/models/install",{method:"POST",body:JSON.stringify({repo:j,role:k,quant:S,jinja:N})}),f(E=>({...E,[j]:"Download läuft"}))}catch{f(A=>({...A,[j]:"Fehler"}))}}return l.jsxs("div",{className:"space-y-6",children:[l.jsx("div",{className:"flex rounded-xl border border-border/60 bg-card/45 backdrop-blur-md p-1 w-fit",children:[["recommended","Empfohlen"],["browse","Stöbern & Suchen"]].map(([j,k])=>l.jsx("button",{onClick:()=>v(j),className:ee("rounded-lg px-4 py-1.5 text-xs font-semibold tracking-wide transition-all cursor-pointer",g===j?"bg-primary text-primary-foreground shadow-md shadow-primary/10":"text-muted-foreground hover:text-foreground"),children:k},j))}),g==="browse"?l.jsx(CX,{}):t?l.jsx("div",{className:"text-xs text-muted-foreground py-12 text-center",children:"Analysiere Hardware und suche passende GGUF-Empfehlungen…"}):c||!e?l.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400",children:["Empfehlungsdienst temporär nicht erreichbar (",c,")."]}):l.jsxs("div",{className:"space-y-8",children:[l.jsxs("div",{className:"text-[10px] font-mono text-muted-foreground bg-background/25 border border-border/40 p-4 rounded-xl flex flex-col sm:flex-row sm:items-center justify-between gap-3 shadow-sm",children:[l.jsxs("div",{children:["Modell-Registry geladen für ",l.jsxs("span",{className:"text-foreground font-bold",children:[e.sys_ram_gb," GB"]})," System-RAM."]}),l.jsxs("div",{className:"flex items-center gap-1.5",children:[l.jsx(F4,{className:"h-3.5 w-3.5 text-primary fill-primary/20"}),l.jsx("span",{children:"Empfehlungen sind automatisch auf deine Box-Hardware optimiert."})]})]}),l.jsx("div",{className:"grid gap-6 md:grid-cols-2",children:e.categories.map(j=>{const k=PX[j.role]||{title:j.title||j.role,desc:"Spezifisches Modell für diese Systemrolle.",icon:ky},S=k.icon,N=o.find(D=>D.role===j.role),E=a==null?void 0:a.model_list.find(D=>D.role===j.role),A=j.models.find(D=>D.repo===j.recommended)||j.models[0];if(!A)return null;const P=u[A.repo],_=j.models.filter(D=>D.repo!==j.recommended),O=!!h[j.role];return l.jsxs("div",{className:ee("rounded-2xl border bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 flex flex-col justify-between gap-5 transition-all duration-300 hover:border-primary/40",N?"border-border/60":"border-primary/20 shadow-primary/5"),children:[l.jsxs("div",{className:"space-y-4",children:[l.jsxs("div",{className:"flex items-start justify-between gap-3",children:[l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsx("div",{className:"w-10 h-10 rounded-xl bg-primary/10 border border-primary/20 flex items-center justify-center text-primary shadow-sm shrink-0",children:l.jsx(S,{className:"h-5.5 w-5.5"})}),l.jsxs("div",{children:[l.jsx("h3",{className:"text-sm font-bold tracking-tight text-foreground",children:k.title}),l.jsxs("span",{className:"text-[9px] font-mono text-muted-foreground uppercase bg-background/50 px-1.5 py-0.5 rounded border border-border/30 inline-block mt-0.5",children:["Rolle: ",j.role]})]})]}),N?l.jsxs("span",{className:"flex items-center gap-1.5 text-[9px] font-bold text-emerald-400 uppercase tracking-wider bg-emerald-500/10 border border-emerald-500/20 px-2.5 py-1 rounded-lg",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"}),"Aktiviert"]}):l.jsx("span",{className:"text-[9px] font-bold text-primary/70 uppercase tracking-wider bg-primary/10 border border-primary/20 px-2.5 py-1 rounded-lg",children:"Frei"})]}),l.jsx("p",{className:"text-xs text-muted-foreground leading-relaxed",children:k.desc}),l.jsx("div",{className:"p-3.5 rounded-xl bg-background/35 border border-border/30 space-y-2.5",children:N?l.jsxs("div",{className:"space-y-1.5",children:[l.jsx("div",{className:"text-[9px] font-bold uppercase tracking-wider text-muted-foreground/60",children:"Aktive GGUF-Belegung"}),l.jsx("div",{className:"text-xs font-mono font-bold text-foreground truncate",title:N.name,children:N.name.split("/").pop()}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2",children:[l.jsxs("span",{children:["Größe: ",wv(N.size_bytes||0)]}),l.jsx("span",{children:"•"}),l.jsxs("span",{children:["Quant: ",N.quant||"GGUF"]})]})]}):l.jsxs("div",{className:"space-y-1.5",children:[l.jsx("div",{className:"text-[9px] font-bold uppercase tracking-wider text-primary/80",children:"Empfohlenes Modell"}),l.jsx("div",{className:"text-xs font-mono font-bold text-foreground truncate",title:A.name,children:A.name}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2 flex-wrap",children:[l.jsxs("span",{children:["Ersteller: ",A.author]}),l.jsx("span",{children:"•"}),l.jsxs("span",{children:["Quant: ",A.quant]})]}),l.jsx("div",{className:"flex items-center gap-1.5 pt-0.5",children:l.jsx(hX,{fit:A.fit})})]})}),l.jsx("div",{className:"pt-1",children:N?E?l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"text-[9px] font-semibold text-amber-400 flex items-center gap-1.5",children:[l.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-amber-400 animate-ping shrink-0"}),l.jsxs("span",{children:["Bessere Version in der Registry: ",E.repo.split("/").pop()]})]}),l.jsxs("button",{onClick:()=>b(E.repo,j.role,A.quant||"Q4_K_M",A.caps.tools!=="no"),disabled:!!u[E.repo],className:"h-8 w-full flex items-center justify-center gap-1.5 rounded-lg bg-amber-500 text-black text-xs font-bold hover:bg-amber-400 disabled:opacity-50 transition-all cursor-pointer shadow-md shadow-amber-500/10",children:[l.jsx(Bs,{className:"h-3.5 w-3.5"}),u[E.repo]||"Auf neue Version aktualisieren"]})]}):l.jsxs("div",{className:"h-8 flex items-center justify-center gap-1.5 text-[10px] font-bold text-emerald-400 uppercase tracking-wide bg-emerald-500/5 border border-emerald-500/10 rounded-lg select-none",children:[l.jsx(sr,{className:"h-4 w-4"})," Auf neuestem Stand"]}):l.jsxs("button",{onClick:()=>b(A.repo,j.role,A.quant||"Q4_K_M",A.caps.tools!=="no"),disabled:!!P,className:ee("h-8 w-full flex items-center justify-center gap-1.5 rounded-lg text-xs font-bold transition-all cursor-pointer border",P?"border-primary/40 bg-primary/5 text-primary":"bg-primary text-primary-foreground hover:opacity-90 shadow-md shadow-primary/10"),children:[l.jsx(Bs,{className:"h-3.5 w-3.5"}),P||"Optimales Modell einsetzen"]})})]}),_.length>0&&l.jsxs("div",{className:"border-t border-border/20 pt-3",children:[l.jsxs("button",{onClick:()=>m(D=>({...D,[j.role]:!O})),className:"flex items-center gap-1.5 text-[10px] text-muted-foreground/80 hover:text-foreground transition-colors cursor-pointer",children:[O?l.jsx(ON,{className:"h-3 w-3"}):l.jsx(PN,{className:"h-3 w-3"}),l.jsxs("span",{children:["Alternative Empfehlungen anzeigen (",_.length,")"]})]}),O&&l.jsx("div",{className:"mt-2.5 space-y-2 max-h-36 overflow-y-auto pr-1 scrollbar-thin",children:_.map(D=>l.jsxs("div",{className:"p-2 rounded-lg bg-background/25 border border-border/20 flex items-center justify-between gap-3",children:[l.jsxs("div",{className:"min-w-0",children:[l.jsx("div",{className:"text-[10px] font-mono font-bold text-foreground truncate",title:D.name,children:D.name}),l.jsxs("div",{className:"text-[9px] text-muted-foreground flex items-center gap-1.5 mt-0.5",children:[l.jsxs("span",{children:["Quant: ",D.quant]}),l.jsx("span",{children:"•"}),l.jsx("span",{children:D.fit.text})]})]}),l.jsx("button",{onClick:()=>b(D.repo,j.role,D.quant||"Q4_K_M",D.caps.tools!=="no"),disabled:!!u[D.repo],className:"h-6 px-2.5 rounded bg-background/40 hover:bg-background/80 border border-border/40 text-[9px] font-bold text-foreground transition-all cursor-pointer shrink-0 disabled:opacity-50",children:u[D.repo]||"Installieren"})]},D.repo))})]})]},j.role)})})]})]})}function _X(){const[e,t]=y.useState("cockpit");return l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{className:"flex flex-col sm:flex-row justify-between sm:items-center gap-4",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Modell-Manager"}),l.jsx("p",{className:"text-sm text-muted-foreground",children:"Verwalte deine Modelle und passe das Gateway-Routing live über das interaktive Cockpit an."})]}),l.jsx("div",{className:"flex rounded-xl border border-border/60 bg-card/45 backdrop-blur-md p-1 self-start",children:["cockpit","discover"].map(r=>l.jsx("button",{onClick:()=>t(r),className:ee("rounded-lg px-4 py-1.5 text-xs font-semibold tracking-wide uppercase transition-all cursor-pointer",e===r?"bg-primary text-primary-foreground shadow-md shadow-primary/10":"text-muted-foreground hover:text-foreground"),children:r==="cockpit"?"Cockpit":"Modelle finden"},r))})]}),l.jsx(xX,{}),l.jsx("div",{className:"transition-all duration-300",children:e==="cockpit"?l.jsx(qO,{}):l.jsx(OX,{})})]})}const MX={cline:"cline_settings.json",cursor:"Settings → Models",opencode:"opencode.jsonc",zed:"settings.json",continue:"~/.continue/config.json",claude_code:"~/.zshrc / env"};function q2({line:e,loading:t}){return t||!e?l.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] font-semibold text-muted-foreground",children:[l.jsx(dh,{className:"h-3 w-3 animate-spin"})," prüfe…"]}):e.ok?l.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] font-semibold text-emerald-400",children:[l.jsx(e4,{className:"h-3 w-3"})," ",e.detail]}):l.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] font-semibold text-red-400",children:[l.jsx(r4,{className:"h-3 w-3"})," ",e.detail]})}function Q2({tool:e,fileName:t,accent:r,copied:n,onCopy:a}){return l.jsxs("div",{className:"flex flex-col border border-border/60 bg-black/60 rounded-2xl overflow-hidden shadow-2xl",children:[l.jsxs("div",{className:"flex h-11 items-center justify-between px-4 border-b border-border/40 bg-black/40 shrink-0",children:[l.jsxs("div",{className:"flex items-center gap-1.5",children:[l.jsx("span",{className:"h-3 w-3 rounded-full bg-red-500/80"}),l.jsx("span",{className:"h-3 w-3 rounded-full bg-amber-500/80"}),l.jsx("span",{className:"h-3 w-3 rounded-full bg-emerald-500/80"})]}),l.jsx("div",{className:"flex items-center gap-1.5 text-[10px] font-mono text-muted-foreground/75 bg-background/30 px-3 py-1 rounded-md border border-border/20",children:l.jsx("span",{children:t})}),l.jsxs("button",{onClick:a,className:"flex h-7 px-2.5 items-center gap-1.5 rounded-lg border border-border/40 bg-background/30 text-[10px] font-semibold text-muted-foreground hover:text-foreground hover:bg-background/60 transition-all cursor-pointer",children:[n?l.jsx(sr,{className:"h-3.5 w-3.5 text-emerald-400"}):l.jsx(uv,{className:"h-3.5 w-3.5"}),l.jsx("span",{children:n?"Kopiert":"Kopieren"})]})]}),l.jsx("pre",{className:ee("p-5 overflow-x-auto text-xs font-mono whitespace-pre leading-relaxed scrollbar-thin select-text bg-black/10",r==="teal"?"text-cyan-200/90":"text-violet-200/90"),children:l.jsx("code",{children:e.snippet})})]})}function QO(){const[e,t]=y.useState(localStorage.getItem("mc_host")||"192.168.178.151"),[r,n]=y.useState(localStorage.getItem("mc_mcp_path")||""),[a,o]=y.useState("cline"),[c,u]=y.useState(null),f=new URLSearchParams({host:e});r&&f.set("mcp_path",r);const{data:h,error:m}=$D(f.toString()),{data:g,isLoading:v}=zD(),b=m?String(m):"";function j(E){t(E),E&&localStorage.setItem("mc_host",E)}function k(E){n(E),localStorage.setItem("mc_mcp_path",E)}const S=h==null?void 0:h.tools[a];async function N(E,A){A&&(await navigator.clipboard.writeText(A),u(E),setTimeout(()=>u(null),1500))}return l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Verbindung & Integration"}),l.jsxs("p",{className:"text-sm text-muted-foreground",children:["Binde deinen lokalen Agenten an die Box an — über ",l.jsx("span",{className:"text-foreground",children:"zwei getrennte Leitungen"}),": das Modell (Gateway) und das geteilte Gedächtnis (MCP)."]})]}),l.jsxs("div",{className:"p-5 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md shadow-lg shadow-black/10",children:[l.jsxs("div",{className:"grid gap-4 md:grid-cols-[170px_1fr] items-center",children:[l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-background/40 p-4 text-center",children:[l.jsx(g4,{className:"h-7 w-7 mx-auto text-muted-foreground"}),l.jsx("div",{className:"mt-2 text-sm font-semibold text-foreground",children:"Dein lokaler Agent"}),l.jsx("div",{className:"text-[11px] text-muted-foreground",children:"Cline · Cursor · Zed …"})]}),l.jsxs("div",{className:"flex flex-col gap-2.5",children:[l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsx(sf,{className:"h-4 w-4 text-muted-foreground shrink-0"}),l.jsxs("div",{className:"flex-1 rounded-xl border border-primary/25 bg-primary/5 px-3.5 py-2.5",children:[l.jsxs("div",{className:"flex items-center justify-between gap-2",children:[l.jsxs("div",{className:"flex items-center gap-2 text-xs font-semibold text-primary",children:[l.jsx(Hn,{className:"h-3.5 w-3.5"})," Leitung 1 — Modell"]}),l.jsx(q2,{line:g==null?void 0:g.gateway,loading:v})]}),l.jsx("div",{className:"mt-1 text-[11px] font-mono text-primary/80",children:"Gateway · :9001/v1 · Lanes chat / coding"})]})]}),l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsx(sf,{className:"h-4 w-4 text-muted-foreground shrink-0"}),l.jsxs("div",{className:"flex-1 rounded-xl border border-violet-500/25 bg-violet-500/5 px-3.5 py-2.5",children:[l.jsxs("div",{className:"flex items-center justify-between gap-2",children:[l.jsxs("div",{className:"flex items-center gap-2 text-xs font-semibold text-violet-300",children:[l.jsx(Ao,{className:"h-3.5 w-3.5"})," Leitung 2 — Gedächtnis"]}),l.jsx(q2,{line:g==null?void 0:g.memory,loading:v})]}),l.jsx("div",{className:"mt-1 text-[11px] font-mono text-violet-300/80",children:"MCP · mcp_memory.py · separat"})]})]})]})]}),l.jsxs("p",{className:"mt-3.5 text-[11px] text-muted-foreground leading-relaxed",children:["Der Gateway liefert ",l.jsx("span",{className:"text-foreground",children:"nur das LLM"}),". Das geteilte Gedächtnis läuft über einen",l.jsx("span",{className:"text-foreground",children:" eigenen MCP-Server"})," — beide werden unabhängig eingerichtet."]})]}),l.jsxs("div",{className:"grid gap-4 md:grid-cols-2 p-5 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md shadow-lg shadow-black/10",children:[l.jsxs("div",{className:"space-y-1.5",children:[l.jsxs("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground flex items-center gap-1.5",children:[l.jsx(f4,{className:"h-3.5 w-3.5 text-primary"})," Box LAN IP-Adresse"]}),l.jsx("input",{value:e,onChange:E=>j(E.target.value),"aria-label":"Box LAN IP-Adresse",spellCheck:!1,placeholder:"z.B. 192.168.178.151",className:"w-full h-9 rounded-lg border border-border/60 bg-background/40 px-3 font-mono text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground"})]}),l.jsxs("div",{className:"space-y-1.5",children:[l.jsxs("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground flex items-center gap-1.5",children:[l.jsx(c4,{className:"h-3.5 w-3.5 text-violet-400"})," Lokaler MCP-Scriptpfad",l.jsx("span",{className:"text-violet-400/70 normal-case font-semibold tracking-normal",children:"(nur Leitung 2)"})]}),l.jsx("input",{value:r,onChange:E=>k(E.target.value),"aria-label":"Lokaler MCP-Scriptpfad",spellCheck:!1,placeholder:"z.B. F:\\Coding Stuff\\mission-control-2\\mcp\\mcp_memory.py",className:"w-full h-9 rounded-lg border border-border/60 bg-background/40 px-3 font-mono text-xs outline-none focus:ring-1 focus:ring-violet-500/50 text-foreground"})]})]}),b&&l.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400",children:["Fehler beim Generieren der Snippets: ",b]}),h&&l.jsxs("div",{className:"grid gap-5 lg:grid-cols-2",children:[l.jsxs("div",{className:"space-y-3 rounded-2xl border border-border/60 border-t-2 border-t-primary/70 bg-card/30 p-4",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center gap-2 text-sm font-space font-bold text-foreground",children:[l.jsx("span",{className:"flex h-5 w-5 items-center justify-center rounded-md bg-primary/15 text-primary text-[11px]",children:"1"}),"Modell anbinden"]}),l.jsx("p",{className:"text-[11px] text-muted-foreground mt-0.5",children:"Wähle dein Tool — das Snippet zeigt auf den Gateway."})]}),l.jsx("div",{className:"flex flex-wrap gap-1.5",children:Object.entries(h.tools).map(([E,A])=>l.jsx("button",{onClick:()=>o(E),className:ee("rounded-lg px-3 py-1.5 text-[11px] font-semibold tracking-wide transition-all cursor-pointer",a===E?"bg-primary text-primary-foreground shadow-md shadow-primary/10":"border border-border/50 text-muted-foreground hover:text-foreground"),children:A.label},E))}),S&&l.jsxs(l.Fragment,{children:[S.note&&l.jsxs("div",{className:"flex items-start gap-2.5 p-3 rounded-xl bg-primary/5 border border-primary/20 text-[11px] text-muted-foreground leading-relaxed",children:[l.jsx(mw,{className:"h-4 w-4 text-primary shrink-0 mt-0.5"}),l.jsx("span",{children:S.note})]}),l.jsx(Q2,{tool:S,fileName:MX[a]||"config.json",accent:"teal",copied:c==="model",onCopy:()=>N("model",S.snippet)})]})]}),l.jsxs("div",{className:"space-y-3 rounded-2xl border border-border/60 border-t-2 border-t-violet-500/70 bg-card/30 p-4",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center gap-2 text-sm font-space font-bold text-foreground",children:[l.jsx("span",{className:"flex h-5 w-5 items-center justify-center rounded-md bg-violet-500/15 text-violet-300 text-[11px]",children:"2"}),"Gedächtnis anbinden",l.jsx("span",{className:"text-[10px] font-medium text-muted-foreground normal-case",children:"optional"})]}),l.jsxs("p",{className:"text-[11px] text-muted-foreground mt-0.5",children:["Ein MCP-Block — gilt zusätzlich für ",l.jsx("em",{children:"jedes"})," Tool aus Schritt 1."]})]}),l.jsxs("div",{className:"flex items-start gap-2.5 p-3 rounded-xl bg-violet-500/5 border border-violet-500/20 text-[11px] text-muted-foreground leading-relaxed",children:[l.jsx(mw,{className:"h-4 w-4 text-violet-400 shrink-0 mt-0.5"}),l.jsx("span",{children:h.memory.note})]}),l.jsx(Q2,{tool:h.memory,fileName:"mcp.json",accent:"violet",copied:c==="memory",onCopy:()=>N("memory",h.memory.snippet)})]})]})]})}const IX="modulepreload",TX=function(e){return"/"+e},Y2={},DX=function(t,r,n){let a=Promise.resolve();if(r&&r.length>0){let c=function(h){return Promise.all(h.map(m=>Promise.resolve(m).then(g=>({status:"fulfilled",value:g}),g=>({status:"rejected",reason:g}))))};document.getElementsByTagName("link");const u=document.querySelector("meta[property=csp-nonce]"),f=(u==null?void 0:u.nonce)||(u==null?void 0:u.getAttribute("nonce"));a=c(r.map(h=>{if(h=TX(h),h in Y2)return;Y2[h]=!0;const m=h.endsWith(".css"),g=m?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${h}"]${g}`))return;const v=document.createElement("link");if(v.rel=m?"stylesheet":IX,m||(v.as="script"),v.crossOrigin="",v.href=h,f&&v.setAttribute("nonce",f),document.head.appendChild(v),m)return new Promise((b,j)=>{v.addEventListener("load",b),v.addEventListener("error",()=>j(new Error(`Unable to preload CSS for ${h}`)))})}))}function o(c){const u=new Event("vite:preloadError",{cancelable:!0});if(u.payload=c,window.dispatchEvent(u),!u.defaultPrevented)throw c}return a.then(c=>{for(const u of c||[])u.status==="rejected"&&o(u.reason);return t().catch(o)})};class RX extends y.Component{constructor(){super(...arguments);Yl(this,"state",{error:null})}static getDerivedStateFromError(r){return{error:r}}render(){return this.state.error?l.jsxs("div",{className:"h-[480px] rounded-2xl border border-red-500/20 bg-red-500/5 p-6 text-xs text-red-400 overflow-auto",children:[l.jsx("div",{className:"font-semibold mb-2",children:"Graph konnte nicht gerendert werden"}),l.jsx("pre",{className:"whitespace-pre-wrap break-words text-[11px] leading-relaxed",children:this.state.error.message})]}):this.props.children}}const LX=y.lazy(()=>DX(()=>import("./GraphView-CfrAKviO.js"),[]).then(e=>({default:e.GraphView}))),Qd=["identity","knowledge","rules","events"],X2=new Set(["auto","agent","hermes"]),Wg={identity:{label:"Identität",icon:U4,bg:"bg-cyan-500/10",text:"text-cyan-400"},knowledge:{label:"Wissen",icon:ws,bg:"bg-indigo-500/10",text:"text-indigo-400"},rules:{label:"Regeln",icon:M4,bg:"bg-violet-500/10",text:"text-violet-400"},events:{label:"Ereignisse",icon:n4,bg:"bg-amber-500/10",text:"text-amber-400"}},Z2={label:"Gedächtnis",icon:sv,text:"text-muted-foreground"},$X={identity:"border-l-cyan-500/80",knowledge:"border-l-indigo-500/80",rules:"border-l-violet-500/80",events:"border-l-amber-500/80"},J2=`Hi Hermes! Lass uns ein kurzes Onboarding machen, damit du dich künftig an mich erinnerst. Stell mir nacheinander ein paar kurze Fragen zu: + `}),l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-3.5",children:[l.jsxs("div",{className:"flex justify-between items-center",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(yu,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("span",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"VRAM / Memory Belegung"})]}),l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsxs("span",{className:"text-[10px] font-mono text-muted-foreground",children:["Speicher-Pool: ",Lr(re)," Gewichte",_e>0?` · ${Lr(_e)} real belegt (inkl. KV)`:""," / ",Lr(Je)]}),v&&k.length>0&&l.jsx("button",{onClick:I,className:"h-6 px-2.5 rounded border border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/10 text-amber-400 text-[9px] font-bold uppercase transition-all cursor-pointer",children:"Alle entladen"})]})]}),l.jsx("div",{className:"h-7 w-full rounded-xl bg-background/50 border border-border/40 overflow-hidden flex p-0.5 relative group",children:Pe.length===0?l.jsx("div",{className:"w-full h-full flex items-center justify-center text-[10px] text-muted-foreground/60 italic font-mono select-none",children:"VRAM Leer — Auto-Swap lädt Modelle bei Anfrage"}):Pe.map((W,ke)=>{var et;const Ae=(W.size_bytes||0)/Je*100,Be=["from-teal-500 to-emerald-500","from-indigo-500 to-blue-500","from-purple-500 to-pink-500","from-cyan-500 to-sky-500"][ke%4];return l.jsxs("div",{style:{width:`${Ae}%`},className:ee("h-full rounded bg-gradient-to-r flex items-center justify-between px-2.5 transition-all text-white/95 shrink-0 shadow-inner select-none",Be),title:`${W.name} (${Lr(W.size_bytes)})`,children:[l.jsxs("span",{className:"text-[9px] font-bold truncate max-w-[120px] font-space tracking-wide",children:[W.role?`[${mr(W.role).short}] `:"",(et=W.name.split("/").pop())==null?void 0:et.replace(".gguf","")]}),l.jsx("span",{className:"text-[8px] font-mono opacity-80",children:Lr(W.size_bytes)})]},W.name)})})]}),l.jsx(SX,{}),v&&l.jsx(jX,{}),l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-3.5",children:[l.jsx("div",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground px-1",children:v?"Gateway Steckplatz-Belegung (Slot-Zuweisung)":"Wer macht was bei Lucy — zum Ändern antippen"}),l.jsx("div",{className:"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-6 gap-3",children:GO.map(W=>{var Be;const ke=j.find(et=>et.role===W),Ae=ke?k.includes(ke.name):!1;return l.jsxs("div",{onClick:()=>K(W),className:ee("rounded-xl border p-3 flex flex-col justify-between gap-2.5 transition-all cursor-pointer select-none text-left bg-background/25 hover:border-primary/45 hover:bg-background/40 group min-h-[90px]",Ae?"border-emerald-500/40 shadow-sm shadow-emerald-500/5":ke?"border-primary/20 bg-primary/5":"border-border/30 border-dashed opacity-75"),children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx(io,{role:W}),Ae&&l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-400 animate-pulse"})]}),l.jsx("div",{className:"text-[10px] font-mono font-medium truncate text-foreground/90 pr-1 font-space",title:ke==null?void 0:ke.name,children:ke?(Be=ke.name.split("/").pop())==null?void 0:Be.replace(/\.gguf$/i,""):"nicht zugewiesen"}),l.jsx("div",{className:"text-[8px] text-primary/70 group-hover:text-primary font-bold uppercase tracking-wider transition-colors font-space",children:"Ändern ➔"})]},W)})})]}),(o==null?void 0:o.current)&&l.jsxs("div",{className:"rounded-2xl border border-indigo-500/30 bg-indigo-500/5 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-3.5",children:[l.jsxs("div",{className:"flex items-center justify-between flex-wrap gap-2",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(wn,{className:"h-4.5 w-4.5 text-indigo-400"}),l.jsx("span",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"Agent-Hirn (Hermes)"}),o.current.version!=null&&l.jsxs("span",{className:"text-[9px] font-mono px-1.5 py-0.5 rounded bg-indigo-500/15 text-indigo-300 border border-indigo-500/25",children:["v",o.current.version]})]}),l.jsx("button",{onClick:()=>window.dispatchEvent(new CustomEvent("mc-navigate",{detail:{view:"agent"}})),className:"h-7 px-3 rounded-lg border border-indigo-500/30 bg-indigo-500/5 text-indigo-300 text-[9px] font-bold uppercase hover:bg-indigo-500/15 transition-all cursor-pointer",title:"Hirn-Wechsel passiert jetzt zentral im Hermes-Tab",children:"Im Hermes-Tab wechseln →"})]}),l.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-3 rounded-xl bg-background/30 border border-border/30 p-3.5",children:[l.jsxs("div",{className:"min-w-0",children:[l.jsx("div",{className:"text-xs font-mono font-bold text-foreground truncate",title:o.current.name,children:o.current.name.split("/").pop()}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2 mt-0.5",children:[l.jsx("span",{children:o.current.params_b?`${o.current.params_b}B`:"—"}),l.jsx("span",{children:"•"}),l.jsx("span",{children:o.current.quant||"GGUF"}),l.jsx("span",{children:"•"}),l.jsx("span",{children:Lr(o.current.size_bytes||0)})]})]}),o.update_available&&o.recommended?l.jsxs("button",{onClick:()=>ge(o.recommended.repo),className:ee("h-8 px-3 shrink-0 flex items-center justify-center gap-1.5 rounded-lg text-[10px] font-bold uppercase transition-all cursor-pointer shadow-md",o.budget&&!o.budget.fits?"bg-red-500 text-white hover:bg-red-400 shadow-red-500/10":"bg-amber-500 text-black hover:bg-amber-400 shadow-amber-500/10"),children:[l.jsx(Us,{className:"h-3.5 w-3.5"})," Aktualisieren"]}):l.jsxs("span",{className:"h-8 px-3 shrink-0 flex items-center gap-1.5 text-[10px] font-bold text-emerald-400 uppercase tracking-wide bg-emerald-500/5 border border-emerald-500/15 rounded-lg select-none",children:[l.jsx(sr,{className:"h-4 w-4"})," Neueste Generation"]})]}),o.update_available&&o.recommended&&l.jsxs("div",{className:"text-[10px] text-amber-400/90 flex items-center gap-1.5",children:[l.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-amber-400 animate-ping shrink-0"}),"Neuere Generation verfügbar: ",l.jsx("span",{className:"font-mono font-bold",children:o.recommended.name.replace(/-GGUF$/i,"")}),"(v",o.recommended.version,", ",o.recommended.params_b,"B) — von NousResearch."]}),o.budget&&l.jsxs("div",{className:ee("text-[10px] flex items-start gap-1.5 leading-relaxed",o.budget.fits?"text-muted-foreground/80":"text-red-400 font-semibold"),children:[l.jsx(yu,{className:"h-3 w-3 shrink-0 mt-0.5"}),l.jsxs("span",{children:["Always-On-Brain ~",o.budget.brain_gb," GB + größtes on-demand (~",o.budget.largest_ondemand_gb," GB) = ",(o.budget.brain_gb+o.budget.largest_ondemand_gb).toFixed(1)," / ",o.budget.gtt_gb," GB",o.budget.fits?" · passt gleichzeitig ✓":" · passt NICHT gleichzeitig ⚠ — heavy/coder würden das Brain verdrängen. Kleineres Brain oder weniger Kontext."]})]})]}),l.jsxs("div",{className:"space-y-4",children:[l.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-3 px-1",children:[l.jsxs("div",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:["Installierte Modell-Bibliothek (",se.length," von ",j.length,")"]}),l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsxs("div",{className:"flex rounded-lg border border-border/40 bg-card/45 p-0.5",children:[l.jsx("button",{onClick:()=>ae("all"),className:ee("px-2.5 py-1 rounded-md text-[9px] font-bold uppercase transition-all cursor-pointer",he==="all"?"bg-primary text-primary-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:"Vorhanden"}),l.jsx("button",{onClick:()=>ae("in_use"),className:ee("px-2.5 py-1 rounded-md text-[9px] font-bold uppercase transition-all cursor-pointer",he==="in_use"?"bg-primary text-primary-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:"In Benutzung"})]}),l.jsxs("div",{className:"flex rounded-lg border border-border/40 bg-card/45 p-0.5",children:[l.jsx("button",{onClick:()=>ue("grid"),className:ee("px-2.5 py-1 rounded-md text-[9px] font-bold uppercase transition-all cursor-pointer",pe==="grid"?"bg-primary text-primary-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:"Grid"}),l.jsx("button",{onClick:()=>ue("list"),className:ee("px-2.5 py-1 rounded-md text-[9px] font-bold uppercase transition-all cursor-pointer",pe==="list"?"bg-primary text-primary-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:"List"})]})]})]}),pe==="grid"?l.jsx("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-3",children:se.length===0?l.jsx("div",{className:"col-span-full text-xs text-muted-foreground border border-dashed border-border/60 rounded-2xl p-12 text-center select-none",children:he==="in_use"?"Keine Modelle in Benutzung (keine Zuweisung oder warm geladene Modelle).":'Keine Modelle konfiguriert. Verwende den Tab "Modelle finden" zum Herunterladen.'}):se.map(W=>{const ke=k.includes(W.name),Ae=a==null?void 0:a.model_list.find(et=>et.role===W.role),Be=W2(W.name);return l.jsxs("div",{className:ee("rounded-2xl border bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 flex flex-col justify-between gap-4 transition-all duration-300 hover:border-primary/40 group relative overflow-hidden",ke?"border-primary/45 shadow-primary/5":W.role?"border-primary/30 bg-primary/5 shadow-inner":"border-border/60"),children:[l.jsxs("div",{className:"space-y-3",children:[l.jsx("div",{className:"flex items-start justify-between gap-3",children:l.jsxs("div",{className:"flex gap-2.5 min-w-0",children:[l.jsx("div",{className:ee("w-7 h-7 rounded-lg border flex items-center justify-center font-bold text-xs shrink-0 shadow-sm",Be.color),title:Be.name,children:Be.initial}),l.jsxs("div",{className:"min-w-0",children:[l.jsx("h3",{className:"text-xs font-bold tracking-tight text-foreground line-clamp-2 break-all font-mono",title:W.name,children:W.name.split("/").pop()}),l.jsxs("div",{className:"flex items-center gap-2 flex-wrap mt-1",children:[l.jsx("span",{className:"text-[9px] font-mono text-muted-foreground bg-background/40 px-1.5 py-0.5 rounded border border-border/30",children:W.quant||"GGUF"}),ke&&l.jsxs("span",{className:"flex items-center gap-1 text-[9px] font-semibold text-emerald-400 uppercase tracking-wider",children:[l.jsx(uh,{className:"h-3 w-3 animate-pulse"})," Warm"]}),W.role&&l.jsx(io,{role:W.role,dense:!0}),b(W.role)&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-background/40 border border-border/40 text-[9px] font-semibold text-muted-foreground",title:"Lebenswichtig für Lucy — geschützt vor Löschen/Entladen.",children:"🔒 geschützt"}),v&&P(W.name)&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-fuchsia-500/10 border border-fuchsia-500/30 text-[9px] font-mono text-fuchsia-300 font-bold uppercase",title:"Ko-resident in der brains-Gruppe — bleibt mit dem Hirn gemeinsam warm, verdrängt es nicht.",children:"🧠 Ko-resident"}),v&&W.prompt_cache&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-cyan-500/10 border border-cyan-500/20 text-[9px] font-mono text-cyan-400 font-bold uppercase",title:"Prompt Caching aktiv",children:"PC"}),v&&(W.spec_active?l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-emerald-500/10 border border-emerald-500/20 text-[9px] font-mono text-emerald-400 font-bold uppercase",title:`Speculative Decoding aktiv (Draft: ${W.spec_draft_model})`,children:"SPEC"}):W.spec_draft_model?l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/20 text-[9px] font-mono text-amber-400 font-bold uppercase",title:`Draft gesetzt (${W.spec_draft_model}), aber INAKTIV — --spec-type fehlt oder Vocab inkompatibel. Über 'Spec' neu konfigurieren.`,children:"SPEC?"}):null),v&&W.parallel_slots>1&&l.jsxs("span",{className:"px-1.5 py-0.5 rounded bg-violet-500/10 border border-violet-500/20 text-[9px] font-mono text-violet-400 font-bold uppercase",title:`${W.parallel_slots} parallele Slots aktiv`,children:["SLOTS: ",W.parallel_slots]}),W.incomplete&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/20 text-[9px] font-mono text-amber-400 font-bold uppercase",title:"GGUF-Datei fehlt — Modell kann nicht geladen werden",children:"⚠ Datei fehlt"})]})]})]})}),l.jsx("div",{className:"border-t border-border/30 pt-3 flex flex-wrap gap-1",children:l.jsx(G2,{caps:W.capabilities})})]}),l.jsxs("div",{className:"space-y-3 pt-1",children:[l.jsxs("div",{className:"grid grid-cols-2 gap-2 text-[10px] font-mono text-muted-foreground",children:[l.jsxs("div",{className:"flex items-center gap-1.5 p-2 bg-background/20 rounded-lg border border-border/20",children:[l.jsx(yu,{className:"h-3.5 w-3.5 text-primary/80"}),l.jsxs("div",{children:[l.jsx("div",{className:"text-[8px] uppercase tracking-wider font-semibold text-muted-foreground/60",children:"Größe"}),l.jsx("div",{className:"text-foreground font-semibold",children:Lr(W.size_bytes)})]})]}),l.jsxs("div",{className:"flex items-center gap-1.5 p-2 bg-background/20 rounded-lg border border-border/20",children:[l.jsx(C4,{className:"h-3.5 w-3.5 text-primary/80"}),l.jsxs("div",{children:[l.jsx("div",{className:"text-[8px] uppercase tracking-wider font-semibold text-muted-foreground/60",children:"Kontext"}),l.jsx("div",{className:"text-foreground font-semibold",children:zw(W.ctx)})]})]})]}),Ae&&l.jsxs("div",{className:"p-3 bg-amber-500/5 border border-amber-500/30 rounded-xl space-y-2 flex flex-col justify-between shrink-0",children:[l.jsxs("div",{className:"text-[9px] font-semibold text-amber-400 flex items-center gap-1",children:[l.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-amber-400 animate-ping"}),l.jsxs("span",{children:["Upgrade verfügbar: ",Ae.repo.split("/").pop()]})]}),l.jsxs("button",{onClick:()=>me(Ae.repo,W.role,W.quant||"Q4_K_M",W.capabilities.tools!=="no"),className:"h-7 w-full flex items-center justify-center gap-1 rounded-lg bg-amber-500 text-black text-[10px] font-bold hover:bg-amber-400 transition-colors cursor-pointer",children:[l.jsx(Us,{className:"h-3 w-3"})," Smart-Swap starten"]})]}),l.jsxs("div",{className:"flex items-center gap-1.5 border-t border-border/20 pt-3 mt-auto",children:[(()=>{const et=b(W.role),Ut=ke&&et,ht=W.incomplete&&!ke||Ut;return l.jsx("button",{onClick:()=>ke?J(W.name):te(W.name),disabled:ht,title:Ut?`„${mr(W.role).label}" bleibt geladen (geschützt).`:void 0,className:ee("flex-1 h-7 rounded-lg text-[9px] font-bold uppercase transition-all border flex items-center justify-center gap-1",ht?"border-border/30 bg-background/10 text-muted-foreground/50 cursor-not-allowed":ke?"border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/15 text-amber-400 cursor-pointer":"border-primary/30 bg-primary/5 hover:bg-primary/15 text-primary cursor-pointer"),children:Ut?"🔒 geladen":ke?"Entladen":"Laden"})})(),v&&l.jsx("button",{onClick:()=>ne(W.name,W.ctx),className:"h-7 px-2.5 rounded-lg border border-border/40 text-[9px] font-bold uppercase hover:bg-accent text-muted-foreground transition-colors cursor-pointer",title:"Kontextlänge anpassen",children:"Ctx"}),v&&E&&l.jsx("button",{onClick:()=>O(W.name),className:ee("h-7 px-2.5 rounded-lg border text-[9px] font-bold uppercase transition-colors cursor-pointer",P(W.name)?"border-fuchsia-500/40 bg-fuchsia-500/10 text-fuchsia-300 hover:bg-fuchsia-500/20":"border-border/40 text-muted-foreground hover:bg-accent"),title:P(W.name)?"Ko-resident (brains): bleibt mit dem Hirn gemeinsam warm. Klick = aus der Gruppe nehmen.":"Zur brains-Gruppe hinzufügen — lädt dann ko-resident neben dem Hirn, statt es zu verdrängen.",children:"🧠"}),v&&l.jsxs("button",{onClick:()=>H(W),className:ee("h-7 px-2.5 rounded-lg border text-[9px] font-bold uppercase transition-colors cursor-pointer flex items-center gap-1",W.spec_active?"border-emerald-500/30 text-emerald-400 hover:bg-emerald-500/10":W.spec_draft_model?"border-amber-500/30 text-amber-400 hover:bg-amber-500/10":"border-border/40 text-muted-foreground hover:bg-accent"),title:"Speculative Draft konfigurieren (Vocab-geprüft)",children:[l.jsx(xa,{className:"h-3 w-3"})," Spec"]}),l.jsx("button",{onClick:()=>Z(W.name),disabled:b(W.role),className:ee("h-7 w-7 rounded-lg border border-border/40 flex items-center justify-center transition-colors",b(W.role)?"text-muted-foreground/40 cursor-not-allowed":"text-muted-foreground hover:text-red-400 hover:bg-red-500/5 cursor-pointer"),"aria-label":"Modell löschen",title:b(W.role)?`„${mr(W.role).label}" ist geschützt und kann nicht gelöscht werden.`:"Modell löschen",children:l.jsx(cv,{className:"h-3.5 w-3.5","aria-hidden":"true"})})]})]})]},W.name)})}):l.jsx("div",{className:"space-y-2",children:se.length===0?l.jsx("div",{className:"text-xs text-muted-foreground border border-dashed border-border/60 rounded-2xl p-12 text-center select-none",children:he==="in_use"?"Keine Modelle in Benutzung (keine Zuweisung oder warm geladene Modelle).":'Keine Modelle konfiguriert. Verwende den Tab "Modelle finden" zum Herunterladen.'}):se.map(W=>{const ke=k.includes(W.name),Ae=W2(W.name);return l.jsxs("div",{className:ee("rounded-xl border bg-card/45 backdrop-blur-md p-3.5 shadow-lg shadow-black/5 flex flex-col sm:flex-row sm:items-center justify-between gap-3 hover:border-primary/40 transition-all",ke?"border-primary/45":W.role?"border-primary/30 bg-primary/5":"border-border/60"),children:[l.jsxs("div",{className:"flex items-center gap-3 min-w-0",children:[l.jsx("div",{className:ee("w-8 h-8 rounded-lg border border-border/40 flex items-center justify-center font-bold text-xs shrink-0 shadow-sm",Ae.color),title:Ae.name,children:Ae.initial}),l.jsxs("div",{className:"min-w-0 text-left",children:[l.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[l.jsx("h4",{className:"text-xs font-bold text-foreground truncate max-w-[250px] sm:max-w-[400px] break-all font-mono",title:W.name,children:W.name.split("/").pop()}),W.role&&l.jsx(io,{role:W.role,dense:!0,className:"shrink-0"}),b(W.role)&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-background/40 border border-border/40 text-[8px] font-semibold text-muted-foreground shrink-0",title:"Lebenswichtig für Lucy — geschützt vor Löschen/Entladen.",children:"🔒 geschützt"}),v&&P(W.name)&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-fuchsia-500/10 border border-fuchsia-500/30 text-[8px] font-mono text-fuchsia-300 font-bold uppercase shrink-0",title:"Ko-resident in der brains-Gruppe — bleibt mit dem Hirn gemeinsam warm.",children:"🧠 Ko-resident"}),v&&W.prompt_cache&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-cyan-500/10 border border-cyan-500/20 text-[8px] font-mono text-cyan-400 font-bold uppercase shrink-0",title:"Prompt Caching aktiv",children:"PC"}),v&&(W.spec_active?l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-emerald-500/10 border border-emerald-500/20 text-[8px] font-mono text-emerald-400 font-bold uppercase shrink-0",title:`Speculative Decoding aktiv (Draft: ${W.spec_draft_model})`,children:"SPEC"}):W.spec_draft_model?l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/20 text-[8px] font-mono text-amber-400 font-bold uppercase shrink-0",title:`Draft gesetzt (${W.spec_draft_model}), aber INAKTIV — --spec-type fehlt oder Vocab inkompatibel.`,children:"SPEC?"}):null),v&&W.parallel_slots>1&&l.jsxs("span",{className:"px-1.5 py-0.5 rounded bg-violet-500/10 border border-violet-500/20 text-[8px] font-mono text-violet-400 font-bold uppercase shrink-0",title:`${W.parallel_slots} parallele Slots aktiv`,children:["SLOTS: ",W.parallel_slots]}),W.incomplete&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/20 text-[8px] font-mono text-amber-400 font-bold uppercase shrink-0",title:"GGUF-Datei fehlt",children:"⚠ Datei fehlt"}),ke&&l.jsxs("span",{className:"flex items-center gap-0.5 text-[8px] font-semibold text-emerald-400 uppercase tracking-wider shrink-0",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"})," warm"]})]}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2 mt-0.5",children:[l.jsxs("span",{children:["Größe: ",Lr(W.size_bytes)]}),l.jsx("span",{children:"•"}),l.jsxs("span",{children:["Kontext: ",zw(W.ctx)]}),l.jsx("span",{children:"•"}),l.jsx("span",{className:"font-mono text-[9px]",children:W.quant||"GGUF"})]})]})]}),l.jsxs("div",{className:"flex items-center gap-3 shrink-0 self-end sm:self-auto",children:[l.jsx("div",{className:"hidden lg:flex flex-wrap gap-1",children:l.jsx(G2,{caps:W.capabilities})}),l.jsxs("div",{className:"flex items-center gap-1.5",children:[(()=>{const Be=b(W.role),et=ke&&Be,Ut=W.incomplete&&!ke||et;return l.jsx("button",{onClick:()=>ke?J(W.name):te(W.name),disabled:Ut,title:et?`„${mr(W.role).label}" bleibt geladen (geschützt).`:void 0,className:ee("h-7 px-3 rounded-lg text-[9px] font-bold uppercase transition-all border flex items-center gap-1",Ut?"border-border/30 bg-background/10 text-muted-foreground/50 cursor-not-allowed":ke?"border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/15 text-amber-400 cursor-pointer":"border-primary/30 bg-primary/5 hover:bg-primary/15 text-primary cursor-pointer"),children:et?"🔒 geladen":ke?"Entladen":"Laden"})})(),v&&l.jsx("button",{onClick:()=>ne(W.name,W.ctx),className:"h-7 px-2.5 rounded-lg border border-border/40 text-[9px] font-bold uppercase hover:bg-accent text-muted-foreground transition-all cursor-pointer",title:"Kontextlänge anpassen",children:"Ctx"}),v&&E&&l.jsx("button",{onClick:()=>O(W.name),className:ee("h-7 px-2.5 rounded-lg border text-[9px] font-bold uppercase transition-colors cursor-pointer",P(W.name)?"border-fuchsia-500/40 bg-fuchsia-500/10 text-fuchsia-300 hover:bg-fuchsia-500/20":"border-border/40 text-muted-foreground hover:bg-accent"),title:P(W.name)?"Ko-resident (brains): bleibt mit dem Hirn gemeinsam warm. Klick = aus der Gruppe nehmen.":"Zur brains-Gruppe hinzufügen — lädt dann ko-resident neben dem Hirn, statt es zu verdrängen.",children:"🧠"}),v&&l.jsxs("button",{onClick:()=>H(W),className:ee("h-7 px-2.5 rounded-lg border text-[9px] font-bold uppercase transition-all cursor-pointer flex items-center gap-1",W.spec_active?"border-emerald-500/30 text-emerald-400 hover:bg-emerald-500/10":W.spec_draft_model?"border-amber-500/30 text-amber-400 hover:bg-amber-500/10":"border-border/40 text-muted-foreground hover:bg-accent"),title:"Speculative Draft konfigurieren (Vocab-geprüft)",children:[l.jsx(xa,{className:"h-3 w-3"})," Spec"]}),l.jsx("button",{onClick:()=>Z(W.name),disabled:b(W.role),className:ee("h-7 w-7 rounded-lg flex items-center justify-center border border-border/40 transition-all",b(W.role)?"text-muted-foreground/40 cursor-not-allowed":"text-muted-foreground hover:text-red-400 hover:bg-red-500/5 cursor-pointer"),"aria-label":"Modell löschen",title:b(W.role)?`„${mr(W.role).label}" ist geschützt und kann nicht gelöscht werden.`:"Modell löschen",children:l.jsx(cv,{className:"h-3.5 w-3.5","aria-hidden":"true"})})]})]})]},W.name)})})]}),D&&(()=>{var et,Ut;const W=B&&B.role===D?B:null,ke={};W==null||W.models.forEach(ht=>{ke[ht.name]=ht});const Ae=W?W.models.map(ht=>j.find(ur=>ur.name===ht.name)).filter(Boolean):j,Be=ht=>{M(D,ht),U(null)};return l.jsx("div",{className:"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm flex items-center justify-center p-4 overscroll-contain",role:"dialog","aria-modal":"true","aria-label":`${mr(D).label} konfigurieren`,children:l.jsxs("div",{className:"w-full max-w-md rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[l.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[l.jsxs("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary flex items-center gap-1.5",children:[l.jsx(io,{role:D})," festlegen"]}),l.jsx("button",{onClick:()=>U(null),className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:l.jsx(Wn,{className:"h-4 w-4"})})]}),l.jsxs("div",{className:"flex items-center justify-between gap-2",children:[l.jsxs("p",{className:"text-xs text-muted-foreground",children:["Wähle ein Modell für ",l.jsx("strong",{className:"text-foreground",children:mr(D).label}),l.jsx("span",{className:"block text-[10px] text-muted-foreground/70 mt-0.5",children:mr(D).desc})]}),(W==null?void 0:W.recommended)&&l.jsxs("button",{onClick:()=>Be(W.recommended),title:(et=ke[W.recommended])==null?void 0:et.reason,className:"shrink-0 h-7 px-3 text-[11px] font-semibold text-primary border border-primary/50 bg-primary/10 hover:bg-primary/20 rounded-lg cursor-pointer flex items-center gap-1",children:[l.jsx(xa,{className:"h-3 w-3"})," Auto: ",(Ut=W.recommended.split("/").pop())==null?void 0:Ut.replace(/\.gguf$/i,"")]})]}),l.jsxs("div",{className:"space-y-1.5 max-h-60 overflow-y-auto pr-1",children:[b(D)?l.jsx("div",{className:"w-full px-3 py-2 rounded-lg text-[11px] text-muted-foreground border border-border/30 bg-background/20 flex items-center gap-1.5",children:"🔒 Diese Rolle ist lebenswichtig und kann nicht leer bleiben — wähle stattdessen ein anderes Modell."}):l.jsx("button",{onClick:()=>Be(""),className:"w-full text-left px-3 py-2 rounded-lg text-xs hover:bg-accent text-red-400 font-semibold cursor-pointer border border-red-500/20 bg-red-500/5 flex items-center justify-between",children:l.jsx("span",{children:"Zuweisung entfernen"})}),Ae.map(ht=>{var Or;const ur=ke[ht.name],Ca=ht.role===D,Jn=!!(ur!=null&&ur.recommended),Ii=!!ur&&!ur.suitable;return l.jsxs("button",{onClick:()=>Be(ht.name),className:ee("w-full text-left px-3 py-2.5 rounded-lg text-xs hover:bg-accent flex items-center justify-between font-mono cursor-pointer border",Jn?"border-primary/50 bg-primary/10":Ca?"text-primary font-bold bg-primary/5 border-primary/30":Ii?"border-border/20 bg-background/10 opacity-60":"text-foreground bg-background/20 border-border/30"),children:[l.jsxs("div",{className:"flex flex-col text-left min-w-0",children:[l.jsxs("span",{className:"truncate max-w-[260px] font-semibold flex items-center gap-1.5",children:[(Or=ht.name.split("/").pop())==null?void 0:Or.replace(/\.gguf$/i,""),Jn&&l.jsx("span",{className:"text-[8px] font-bold uppercase tracking-wide text-primary bg-primary/15 px-1.5 py-0.5 rounded",children:"Empfohlen"})]}),l.jsx("span",{className:"text-[9px] text-muted-foreground mt-0.5",children:ur?`${ur.params_b}B · ${ht.quant} · ${ur.reason}`:`${Lr(ht.size_bytes)} · ${ht.quant}`})]}),Ca&&l.jsx(sr,{className:"h-4 w-4 shrink-0 text-primary"})]},ht.name)})]})]})})})(),Y&&l.jsx(bX,{model:Y,onClose:()=>H(null),onChanged:N}),g]})}const NX=[{key:"popular",label:"Beliebt",q:""},{key:"coder",label:"Coder",q:"coder"},{key:"vision",label:"Vision",q:"vision"},{key:"reasoning",label:"Reasoning",q:"reasoning"},{key:"small",label:"Klein (≤4B)",q:"3B"}],EX=["fast","heavy","coder","vision","hermes","scout"],AX=new Intl.NumberFormat(void 0,{notation:"compact",maximumFractionDigits:1});function q2(e){return AX.format(e)}function CX(){const{data:e}=Ni(),t=(e==null?void 0:e.models)??[],[r,n]=y.useState(""),[a,o]=y.useState([]),[c,u]=y.useState(!1),[f,h]=y.useState(""),[m,g]=y.useState("popular"),[v,b]=y.useState(""),[j,k]=y.useState(null),[S,N]=y.useState([]),[E,A]=y.useState("Q4_K_M"),[P,_]=y.useState(""),[O,D]=y.useState(null),[U,B]=y.useState(!1),[F,Y]=y.useState({});async function H(M){u(!0),h("");try{const K=await Se(`/api/hf/search?q=${encodeURIComponent(M)}`);o(K.results),K.results.length||h("Keine Ergebnisse.")}catch(K){h(`Suche fehlgeschlagen: ${K}`)}finally{u(!1)}}y.useEffect(()=>{H("")},[]);function pe(M){g(M.key),n(""),H(M.q)}function ue(){g(""),H(r)}async function he(M,K,ne){B(!1);try{const Z=await Se(`/api/fit?params_b=0&quant=${encodeURIComponent(K)}&ctx=8192&name=${encodeURIComponent(M)}&role=${encodeURIComponent(ne)}`);D(Z)}catch{D(null)}}async function ae(M){if(j===M){k(null);return}k(M),N([]),D(null),_(""),B(!1),h("Analysiere Repository…");try{const K=await Se(`/api/hf/quants?repo=${encodeURIComponent(M)}`);N(K.quants);const ne=K.quants.includes("Q4_K_M")?"Q4_K_M":K.quants[0]||"Q4_K_M";A(ne),h(K.quants.length?"":"Keine GGUF-Dateien in diesem Repo gefunden."),K.quants.length&&he(K.repo,ne,"")}catch(K){h(`Fehler: ${K}`)}}function se(){const M=v.trim();M&&(o(K=>K.some(ne=>ne.repo===M)?K:[{repo:M,downloads:0,likes:0},...K]),b(""),ae(M))}const X=P?t.find(M=>(M.role||"").toLowerCase()===P):void 0;async function te(M){if((O==null?void 0:O.fit.level)==="too_tight"&&!U){B(!0);return}Y(K=>({...K,[M]:"Starte…"}));try{await Se("/api/models/install",{method:"POST",body:JSON.stringify({repo:M,quant:E,role:P||void 0,jinja:!0})}),Y(K=>({...K,[M]:"Download läuft"})),B(!1)}catch{Y(ne=>({...ne,[M]:"Fehler"}))}}const J=M=>{var ne;const K=((ne=M.split("/").pop())==null?void 0:ne.toLowerCase().replace(/-gguf$/i,""))||"";return K.length>3&&t.some(Z=>Z.name.toLowerCase().includes(K))},I=M=>M==="perfect"?"text-emerald-400 border-emerald-500/40 bg-emerald-500/10":M==="marginal"?"text-amber-400 border-amber-500/40 bg-amber-500/10":"text-red-400 border-red-500/40 bg-red-500/10";return l.jsxs("div",{className:"space-y-5",children:[l.jsxs("div",{className:"flex gap-2",children:[l.jsxs("div",{className:"relative flex-1",children:[l.jsx(MN,{className:"absolute left-3 top-2.5 h-4 w-4 text-muted-foreground"}),l.jsx("input",{value:r,onChange:M=>n(M.target.value),onKeyDown:M=>M.key==="Enter"&&ue(),"aria-label":"HuggingFace durchsuchen",type:"search",spellCheck:!1,placeholder:"HuggingFace durchsuchen (z.B. Qwen Coder, Llama-3.1, gemma)…",className:"w-full h-10 pl-9 pr-3 rounded-xl border border-border/60 bg-background/40 text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground"})]}),l.jsx("button",{onClick:ue,className:"h-10 px-5 rounded-xl bg-primary text-primary-foreground text-xs font-semibold hover:opacity-90 transition-all cursor-pointer",children:"Suchen"})]}),l.jsx("div",{className:"flex items-center gap-2 flex-wrap",children:NX.map(M=>l.jsxs("button",{onClick:()=>pe(M),className:ee("flex items-center gap-1.5 rounded-full px-3 py-1.5 text-[11px] font-semibold transition-all cursor-pointer border",m===M.key?"bg-primary/15 text-primary border-primary/30":"border-border/50 text-muted-foreground hover:text-foreground hover:border-border"),children:[M.key==="popular"&&l.jsx(u4,{className:"h-3 w-3"}),M.label]},M.key))}),c?l.jsx("div",{className:"text-xs text-muted-foreground py-10 text-center",children:"Lade GGUF-Modelle von HuggingFace…"}):l.jsxs("div",{className:"space-y-2",children:[a.map(M=>{const K=j===M.repo,ne=J(M.repo),Z=M.repo.includes("/")?M.repo.split("/")[0]:"—",me=M.repo.split("/").pop();return l.jsxs("div",{className:ee("rounded-xl border bg-card/45 backdrop-blur-md transition-all",K?"border-primary/40 shadow-lg shadow-primary/5":"border-border/50 hover:border-primary/30"),children:[l.jsxs("button",{onClick:()=>ae(M.repo),className:"w-full flex items-center gap-3 p-3.5 text-left cursor-pointer",children:[l.jsxs("div",{className:"min-w-0 flex-1",children:[l.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[l.jsx("span",{className:"text-xs font-bold font-mono text-foreground truncate max-w-[280px]",title:M.repo,children:me}),ne&&l.jsxs("span",{className:"flex items-center gap-1 text-[8px] font-bold text-emerald-400 uppercase tracking-wider bg-emerald-500/10 border border-emerald-500/20 px-1.5 py-0.5 rounded",children:[l.jsx(sr,{className:"h-2.5 w-2.5"})," installiert"]})]}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-3 mt-0.5 font-mono",children:[l.jsx("span",{children:Z}),l.jsxs("span",{className:"flex items-center gap-1",children:[l.jsx(Us,{className:"h-3 w-3"})," ",q2(M.downloads)]}),M.likes>0&&l.jsxs("span",{className:"flex items-center gap-1",children:[l.jsx(m4,{className:"h-3 w-3"})," ",q2(M.likes)]})]})]}),K?l.jsx(ON,{className:"h-4 w-4 text-muted-foreground shrink-0"}):l.jsx(PN,{className:"h-4 w-4 text-muted-foreground shrink-0"})]}),K&&l.jsx("div",{className:"border-t border-border/30 p-3.5 space-y-3",children:S.length===0?l.jsx("div",{className:"text-[11px] text-muted-foreground font-mono",children:f||"Lade Quants…"}):l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[l.jsx("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground",children:"Quant"}),l.jsx("select",{value:E,onChange:ge=>{A(ge.target.value),he(M.repo,ge.target.value,P)},"aria-label":"Quantisierung",className:"h-8 rounded-lg border border-border/60 bg-background/40 px-2 text-xs text-foreground font-semibold outline-none",children:S.map(ge=>l.jsx("option",{value:ge,className:"bg-popover text-foreground",children:ge},ge))}),l.jsx("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground ml-1",children:"Rolle"}),l.jsxs("select",{value:P,onChange:ge=>{_(ge.target.value),he(M.repo,E,ge.target.value)},"aria-label":"Rolle",title:"Optional — bestimmt Auto-Konfiguration + setup-bewussten Kontext",className:"h-8 rounded-lg border border-border/60 bg-background/40 px-2 text-xs text-foreground font-semibold outline-none",children:[l.jsx("option",{value:"",className:"bg-popover text-foreground",children:"keine"}),EX.map(ge=>l.jsx("option",{value:ge,className:"bg-popover text-foreground",children:ge},ge))]}),l.jsx("button",{onClick:()=>te(M.repo),disabled:!!F[M.repo]&&F[M.repo]==="Download läuft",className:ee("h-8 px-3.5 ml-auto rounded-lg text-xs font-semibold transition-all cursor-pointer flex items-center gap-1.5",U?"bg-red-500 text-white hover:opacity-90":"bg-primary text-primary-foreground hover:opacity-90"),children:F[M.repo]?F[M.repo]:U?l.jsxs(l.Fragment,{children:[l.jsx(bi,{className:"h-3.5 w-3.5"})," OOM — trotzdem laden"]}):l.jsxs(l.Fragment,{children:[l.jsx(Us,{className:"h-3.5 w-3.5"})," Herunterladen"]})})]}),O&&l.jsxs("div",{className:ee("flex flex-wrap items-center gap-x-3 gap-y-1 rounded-lg border px-3 py-2 text-[11px] font-medium",I(O.fit.level)),children:[l.jsx("span",{className:"font-bold uppercase tracking-wide",children:O.fit.text}),l.jsxs("span",{className:"font-mono opacity-90",children:["~",O.params_b,"B · ~",O.fit.req_gb," GB / ",O.sys_ram_gb," GB · ~",O.fit.tps," t/s"]}),O.fit.level!=="too_tight"?l.jsxs("span",{className:"font-mono opacity-80",children:["ctx → ",(O.assigned_ctx/1024).toFixed(0),"k"]}):l.jsx("span",{className:"opacity-90",children:"— passt nicht, würde beim Laden abstürzen (OOM)."})]}),X&&l.jsxs("div",{className:"flex items-start gap-2 rounded-lg border border-amber-500/40 bg-amber-500/10 px-3 py-2 text-[11px] text-amber-400",children:[l.jsx(bi,{className:"h-3.5 w-3.5 mt-0.5 shrink-0"}),l.jsxs("span",{children:["Rolle ",l.jsxs("strong",{children:["„",P,'"']})," hält aktuell ",l.jsx("strong",{children:X.name.split("/").pop()})," — wird beim Download übernommen."]})]})]})})]},M.repo)}),!a.length&&!c&&l.jsx("div",{className:"text-xs text-muted-foreground py-10 text-center",children:f||"Keine Ergebnisse."})]}),l.jsxs("div",{className:"border-t border-border/30 pt-4 flex flex-col sm:flex-row gap-2 items-stretch sm:items-center",children:[l.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground shrink-0",children:"Direkt:"}),l.jsx("input",{value:v,onChange:M=>b(M.target.value),onKeyDown:M=>M.key==="Enter"&&se(),"aria-label":"Repository oder URL direkt eingeben",spellCheck:!1,placeholder:"org/repo oder HF-URL (z.B. unsloth/Qwen2.5-Coder-7B-Instruct-GGUF)",className:"flex-1 h-9 rounded-lg border border-border/60 bg-background/40 px-3 text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground font-mono"}),l.jsx("button",{onClick:se,className:"h-9 px-4 rounded-lg border border-border/60 bg-background/20 text-xs font-semibold hover:border-primary/50 hover:bg-background/40 transition-all cursor-pointer whitespace-nowrap",children:"Laden"})]})]})}const PX={fast:{title:"Schnelles Alltags-Hirn",desc:"Schnelle MoE-Antworten für Chat, Zusammenfassungen und alltägliche Aufgaben.",icon:xa},heavy:{title:"Schweres Reasoning",desc:"Große Modelle für komplexe Logik, Mathematik und tiefgründiges Planen.",icon:Ao},coder:{title:"Coden & Entwicklung",desc:"Autovervollständigung, Refactoring und Codegenerierung direkt in deiner IDE.",icon:Bs},vision:{title:"Bilder & Vision",desc:"Verarbeitet Bilder, Screenshots und visuelle Diagramme in multimodalen Chats.",icon:uf},hermes:{title:"Lucys Hirn (Agent)",desc:"Lucys dauer-warmes Agent-Hirn mit Tool-Calling — bleibt ko-resident, lädt nie kalt nach.",icon:Q3},scout:{title:"Multimodal-Allrounder",desc:"Multimodaler Allrounder für schnelle Antworten, Übersetzungen und Alltag.",icon:lv}};function OX(){const{data:e,isLoading:t,error:r}=RD(),{data:n}=Ni(),{data:a}=vh(),o=(n==null?void 0:n.models)??[],c=r?String(r):"",[u,f]=y.useState({}),[h,m]=y.useState({}),[g,v]=y.useState("recommended");async function b(j,k,S,N){f(E=>({...E,[j]:"Starte..."}));try{await Se("/api/models/install",{method:"POST",body:JSON.stringify({repo:j,role:k,quant:S,jinja:N})}),f(E=>({...E,[j]:"Download läuft"}))}catch{f(A=>({...A,[j]:"Fehler"}))}}return l.jsxs("div",{className:"space-y-6",children:[l.jsx("div",{className:"flex rounded-xl border border-border/60 bg-card/45 backdrop-blur-md p-1 w-fit",children:[["recommended","Empfohlen"],["browse","Stöbern & Suchen"]].map(([j,k])=>l.jsx("button",{onClick:()=>v(j),className:ee("rounded-lg px-4 py-1.5 text-xs font-semibold tracking-wide transition-all cursor-pointer",g===j?"bg-primary text-primary-foreground shadow-md shadow-primary/10":"text-muted-foreground hover:text-foreground"),children:k},j))}),g==="browse"?l.jsx(CX,{}):t?l.jsx("div",{className:"text-xs text-muted-foreground py-12 text-center",children:"Analysiere Hardware und suche passende GGUF-Empfehlungen…"}):c||!e?l.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400",children:["Empfehlungsdienst temporär nicht erreichbar (",c,")."]}):l.jsxs("div",{className:"space-y-8",children:[l.jsxs("div",{className:"text-[10px] font-mono text-muted-foreground bg-background/25 border border-border/40 p-4 rounded-xl flex flex-col sm:flex-row sm:items-center justify-between gap-3 shadow-sm",children:[l.jsxs("div",{children:["Modell-Registry geladen für ",l.jsxs("span",{className:"text-foreground font-bold",children:[e.sys_ram_gb," GB"]})," System-RAM."]}),l.jsxs("div",{className:"flex items-center gap-1.5",children:[l.jsx(F4,{className:"h-3.5 w-3.5 text-primary fill-primary/20"}),l.jsx("span",{children:"Empfehlungen sind automatisch auf deine Box-Hardware optimiert."})]})]}),l.jsx("div",{className:"grid gap-6 md:grid-cols-2",children:e.categories.map(j=>{const k=PX[j.role]||{title:j.title||j.role,desc:"Spezifisches Modell für diese Systemrolle.",icon:jy},S=k.icon,N=o.find(D=>D.role===j.role),E=a==null?void 0:a.model_list.find(D=>D.role===j.role),A=j.models.find(D=>D.repo===j.recommended)||j.models[0];if(!A)return null;const P=u[A.repo],_=j.models.filter(D=>D.repo!==j.recommended),O=!!h[j.role];return l.jsxs("div",{className:ee("rounded-2xl border bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 flex flex-col justify-between gap-5 transition-all duration-300 hover:border-primary/40",N?"border-border/60":"border-primary/20 shadow-primary/5"),children:[l.jsxs("div",{className:"space-y-4",children:[l.jsxs("div",{className:"flex items-start justify-between gap-3",children:[l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsx("div",{className:"w-10 h-10 rounded-xl bg-primary/10 border border-primary/20 flex items-center justify-center text-primary shadow-sm shrink-0",children:l.jsx(S,{className:"h-5.5 w-5.5"})}),l.jsxs("div",{children:[l.jsx("h3",{className:"text-sm font-bold tracking-tight text-foreground",children:k.title}),l.jsxs("span",{className:"text-[9px] font-mono text-muted-foreground uppercase bg-background/50 px-1.5 py-0.5 rounded border border-border/30 inline-block mt-0.5",children:["Rolle: ",j.role]})]})]}),N?l.jsxs("span",{className:"flex items-center gap-1.5 text-[9px] font-bold text-emerald-400 uppercase tracking-wider bg-emerald-500/10 border border-emerald-500/20 px-2.5 py-1 rounded-lg",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"}),"Aktiviert"]}):l.jsx("span",{className:"text-[9px] font-bold text-primary/70 uppercase tracking-wider bg-primary/10 border border-primary/20 px-2.5 py-1 rounded-lg",children:"Frei"})]}),l.jsx("p",{className:"text-xs text-muted-foreground leading-relaxed",children:k.desc}),l.jsx("div",{className:"p-3.5 rounded-xl bg-background/35 border border-border/30 space-y-2.5",children:N?l.jsxs("div",{className:"space-y-1.5",children:[l.jsx("div",{className:"text-[9px] font-bold uppercase tracking-wider text-muted-foreground/60",children:"Aktive GGUF-Belegung"}),l.jsx("div",{className:"text-xs font-mono font-bold text-foreground truncate",title:N.name,children:N.name.split("/").pop()}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2",children:[l.jsxs("span",{children:["Größe: ",wv(N.size_bytes||0)]}),l.jsx("span",{children:"•"}),l.jsxs("span",{children:["Quant: ",N.quant||"GGUF"]})]})]}):l.jsxs("div",{className:"space-y-1.5",children:[l.jsx("div",{className:"text-[9px] font-bold uppercase tracking-wider text-primary/80",children:"Empfohlenes Modell"}),l.jsx("div",{className:"text-xs font-mono font-bold text-foreground truncate",title:A.name,children:A.name}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2 flex-wrap",children:[l.jsxs("span",{children:["Ersteller: ",A.author]}),l.jsx("span",{children:"•"}),l.jsxs("span",{children:["Quant: ",A.quant]})]}),l.jsx("div",{className:"flex items-center gap-1.5 pt-0.5",children:l.jsx(hX,{fit:A.fit})})]})}),l.jsx("div",{className:"pt-1",children:N?E?l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"text-[9px] font-semibold text-amber-400 flex items-center gap-1.5",children:[l.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-amber-400 animate-ping shrink-0"}),l.jsxs("span",{children:["Bessere Version in der Registry: ",E.repo.split("/").pop()]})]}),l.jsxs("button",{onClick:()=>b(E.repo,j.role,A.quant||"Q4_K_M",A.caps.tools!=="no"),disabled:!!u[E.repo],className:"h-8 w-full flex items-center justify-center gap-1.5 rounded-lg bg-amber-500 text-black text-xs font-bold hover:bg-amber-400 disabled:opacity-50 transition-all cursor-pointer shadow-md shadow-amber-500/10",children:[l.jsx(Us,{className:"h-3.5 w-3.5"}),u[E.repo]||"Auf neue Version aktualisieren"]})]}):l.jsxs("div",{className:"h-8 flex items-center justify-center gap-1.5 text-[10px] font-bold text-emerald-400 uppercase tracking-wide bg-emerald-500/5 border border-emerald-500/10 rounded-lg select-none",children:[l.jsx(sr,{className:"h-4 w-4"})," Auf neuestem Stand"]}):l.jsxs("button",{onClick:()=>b(A.repo,j.role,A.quant||"Q4_K_M",A.caps.tools!=="no"),disabled:!!P,className:ee("h-8 w-full flex items-center justify-center gap-1.5 rounded-lg text-xs font-bold transition-all cursor-pointer border",P?"border-primary/40 bg-primary/5 text-primary":"bg-primary text-primary-foreground hover:opacity-90 shadow-md shadow-primary/10"),children:[l.jsx(Us,{className:"h-3.5 w-3.5"}),P||"Optimales Modell einsetzen"]})})]}),_.length>0&&l.jsxs("div",{className:"border-t border-border/20 pt-3",children:[l.jsxs("button",{onClick:()=>m(D=>({...D,[j.role]:!O})),className:"flex items-center gap-1.5 text-[10px] text-muted-foreground/80 hover:text-foreground transition-colors cursor-pointer",children:[O?l.jsx(ON,{className:"h-3 w-3"}):l.jsx(PN,{className:"h-3 w-3"}),l.jsxs("span",{children:["Alternative Empfehlungen anzeigen (",_.length,")"]})]}),O&&l.jsx("div",{className:"mt-2.5 space-y-2 max-h-36 overflow-y-auto pr-1 scrollbar-thin",children:_.map(D=>l.jsxs("div",{className:"p-2 rounded-lg bg-background/25 border border-border/20 flex items-center justify-between gap-3",children:[l.jsxs("div",{className:"min-w-0",children:[l.jsx("div",{className:"text-[10px] font-mono font-bold text-foreground truncate",title:D.name,children:D.name}),l.jsxs("div",{className:"text-[9px] text-muted-foreground flex items-center gap-1.5 mt-0.5",children:[l.jsxs("span",{children:["Quant: ",D.quant]}),l.jsx("span",{children:"•"}),l.jsx("span",{children:D.fit.text})]})]}),l.jsx("button",{onClick:()=>b(D.repo,j.role,D.quant||"Q4_K_M",D.caps.tools!=="no"),disabled:!!u[D.repo],className:"h-6 px-2.5 rounded bg-background/40 hover:bg-background/80 border border-border/40 text-[9px] font-bold text-foreground transition-all cursor-pointer shrink-0 disabled:opacity-50",children:u[D.repo]||"Installieren"})]},D.repo))})]})]},j.role)})})]})]})}function _X(){const[e,t]=y.useState("cockpit");return l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{className:"flex flex-col sm:flex-row justify-between sm:items-center gap-4",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Modell-Manager"}),l.jsx("p",{className:"text-sm text-muted-foreground",children:"Verwalte deine Modelle und passe das Gateway-Routing live über das interaktive Cockpit an."})]}),l.jsx("div",{className:"flex rounded-xl border border-border/60 bg-card/45 backdrop-blur-md p-1 self-start",children:["cockpit","discover"].map(r=>l.jsx("button",{onClick:()=>t(r),className:ee("rounded-lg px-4 py-1.5 text-xs font-semibold tracking-wide uppercase transition-all cursor-pointer",e===r?"bg-primary text-primary-foreground shadow-md shadow-primary/10":"text-muted-foreground hover:text-foreground"),children:r==="cockpit"?"Cockpit":"Modelle finden"},r))})]}),l.jsx(xX,{}),l.jsx("div",{className:"transition-all duration-300",children:e==="cockpit"?l.jsx(qO,{}):l.jsx(OX,{})})]})}const MX={cline:"cline_settings.json",cursor:"Settings → Models",opencode:"opencode.jsonc",zed:"settings.json",continue:"~/.continue/config.json",claude_code:"~/.zshrc / env"};function Q2({line:e,loading:t}){return t||!e?l.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] font-semibold text-muted-foreground",children:[l.jsx(dh,{className:"h-3 w-3 animate-spin"})," prüfe…"]}):e.ok?l.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] font-semibold text-emerald-400",children:[l.jsx(e4,{className:"h-3 w-3"})," ",e.detail]}):l.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] font-semibold text-red-400",children:[l.jsx(r4,{className:"h-3 w-3"})," ",e.detail]})}function Y2({tool:e,fileName:t,accent:r,copied:n,onCopy:a}){return l.jsxs("div",{className:"flex flex-col border border-border/60 bg-black/60 rounded-2xl overflow-hidden shadow-2xl",children:[l.jsxs("div",{className:"flex h-11 items-center justify-between px-4 border-b border-border/40 bg-black/40 shrink-0",children:[l.jsxs("div",{className:"flex items-center gap-1.5",children:[l.jsx("span",{className:"h-3 w-3 rounded-full bg-red-500/80"}),l.jsx("span",{className:"h-3 w-3 rounded-full bg-amber-500/80"}),l.jsx("span",{className:"h-3 w-3 rounded-full bg-emerald-500/80"})]}),l.jsx("div",{className:"flex items-center gap-1.5 text-[10px] font-mono text-muted-foreground/75 bg-background/30 px-3 py-1 rounded-md border border-border/20",children:l.jsx("span",{children:t})}),l.jsxs("button",{onClick:a,className:"flex h-7 px-2.5 items-center gap-1.5 rounded-lg border border-border/40 bg-background/30 text-[10px] font-semibold text-muted-foreground hover:text-foreground hover:bg-background/60 transition-all cursor-pointer",children:[n?l.jsx(sr,{className:"h-3.5 w-3.5 text-emerald-400"}):l.jsx(uv,{className:"h-3.5 w-3.5"}),l.jsx("span",{children:n?"Kopiert":"Kopieren"})]})]}),l.jsx("pre",{className:ee("p-5 overflow-x-auto text-xs font-mono whitespace-pre leading-relaxed scrollbar-thin select-text bg-black/10",r==="teal"?"text-cyan-200/90":"text-violet-200/90"),children:l.jsx("code",{children:e.snippet})})]})}function QO(){const[e,t]=y.useState(localStorage.getItem("mc_host")||"192.168.178.151"),[r,n]=y.useState(localStorage.getItem("mc_mcp_path")||""),[a,o]=y.useState("cline"),[c,u]=y.useState(null),f=new URLSearchParams({host:e});r&&f.set("mcp_path",r);const{data:h,error:m}=$D(f.toString()),{data:g,isLoading:v}=zD(),b=m?String(m):"";function j(E){t(E),E&&localStorage.setItem("mc_host",E)}function k(E){n(E),localStorage.setItem("mc_mcp_path",E)}const S=h==null?void 0:h.tools[a];async function N(E,A){A&&(await navigator.clipboard.writeText(A),u(E),setTimeout(()=>u(null),1500))}return l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Verbindung & Integration"}),l.jsxs("p",{className:"text-sm text-muted-foreground",children:["Binde deinen lokalen Agenten an die Box an — über ",l.jsx("span",{className:"text-foreground",children:"zwei getrennte Leitungen"}),": das Modell (Gateway) und das geteilte Gedächtnis (MCP)."]})]}),l.jsxs("div",{className:"p-5 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md shadow-lg shadow-black/10",children:[l.jsxs("div",{className:"grid gap-4 md:grid-cols-[170px_1fr] items-center",children:[l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-background/40 p-4 text-center",children:[l.jsx(g4,{className:"h-7 w-7 mx-auto text-muted-foreground"}),l.jsx("div",{className:"mt-2 text-sm font-semibold text-foreground",children:"Dein lokaler Agent"}),l.jsx("div",{className:"text-[11px] text-muted-foreground",children:"Cline · Cursor · Zed …"})]}),l.jsxs("div",{className:"flex flex-col gap-2.5",children:[l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsx(sf,{className:"h-4 w-4 text-muted-foreground shrink-0"}),l.jsxs("div",{className:"flex-1 rounded-xl border border-primary/25 bg-primary/5 px-3.5 py-2.5",children:[l.jsxs("div",{className:"flex items-center justify-between gap-2",children:[l.jsxs("div",{className:"flex items-center gap-2 text-xs font-semibold text-primary",children:[l.jsx(Hn,{className:"h-3.5 w-3.5"})," Leitung 1 — Modell"]}),l.jsx(Q2,{line:g==null?void 0:g.gateway,loading:v})]}),l.jsx("div",{className:"mt-1 text-[11px] font-mono text-primary/80",children:"Gateway · :9001/v1 · Lanes chat / coding"})]})]}),l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsx(sf,{className:"h-4 w-4 text-muted-foreground shrink-0"}),l.jsxs("div",{className:"flex-1 rounded-xl border border-violet-500/25 bg-violet-500/5 px-3.5 py-2.5",children:[l.jsxs("div",{className:"flex items-center justify-between gap-2",children:[l.jsxs("div",{className:"flex items-center gap-2 text-xs font-semibold text-violet-300",children:[l.jsx(Ao,{className:"h-3.5 w-3.5"})," Leitung 2 — Gedächtnis"]}),l.jsx(Q2,{line:g==null?void 0:g.memory,loading:v})]}),l.jsx("div",{className:"mt-1 text-[11px] font-mono text-violet-300/80",children:"MCP · mcp_memory.py · separat"})]})]})]})]}),l.jsxs("p",{className:"mt-3.5 text-[11px] text-muted-foreground leading-relaxed",children:["Der Gateway liefert ",l.jsx("span",{className:"text-foreground",children:"nur das LLM"}),". Das geteilte Gedächtnis läuft über einen",l.jsx("span",{className:"text-foreground",children:" eigenen MCP-Server"})," — beide werden unabhängig eingerichtet."]})]}),l.jsxs("div",{className:"grid gap-4 md:grid-cols-2 p-5 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md shadow-lg shadow-black/10",children:[l.jsxs("div",{className:"space-y-1.5",children:[l.jsxs("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground flex items-center gap-1.5",children:[l.jsx(f4,{className:"h-3.5 w-3.5 text-primary"})," Box LAN IP-Adresse"]}),l.jsx("input",{value:e,onChange:E=>j(E.target.value),"aria-label":"Box LAN IP-Adresse",spellCheck:!1,placeholder:"z.B. 192.168.178.151",className:"w-full h-9 rounded-lg border border-border/60 bg-background/40 px-3 font-mono text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground"})]}),l.jsxs("div",{className:"space-y-1.5",children:[l.jsxs("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground flex items-center gap-1.5",children:[l.jsx(c4,{className:"h-3.5 w-3.5 text-violet-400"})," Lokaler MCP-Scriptpfad",l.jsx("span",{className:"text-violet-400/70 normal-case font-semibold tracking-normal",children:"(nur Leitung 2)"})]}),l.jsx("input",{value:r,onChange:E=>k(E.target.value),"aria-label":"Lokaler MCP-Scriptpfad",spellCheck:!1,placeholder:"z.B. F:\\Coding Stuff\\mission-control-2\\mcp\\mcp_memory.py",className:"w-full h-9 rounded-lg border border-border/60 bg-background/40 px-3 font-mono text-xs outline-none focus:ring-1 focus:ring-violet-500/50 text-foreground"})]})]}),b&&l.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400",children:["Fehler beim Generieren der Snippets: ",b]}),h&&l.jsxs("div",{className:"grid gap-5 lg:grid-cols-2",children:[l.jsxs("div",{className:"space-y-3 rounded-2xl border border-border/60 border-t-2 border-t-primary/70 bg-card/30 p-4",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center gap-2 text-sm font-space font-bold text-foreground",children:[l.jsx("span",{className:"flex h-5 w-5 items-center justify-center rounded-md bg-primary/15 text-primary text-[11px]",children:"1"}),"Modell anbinden"]}),l.jsx("p",{className:"text-[11px] text-muted-foreground mt-0.5",children:"Wähle dein Tool — das Snippet zeigt auf den Gateway."})]}),l.jsx("div",{className:"flex flex-wrap gap-1.5",children:Object.entries(h.tools).map(([E,A])=>l.jsx("button",{onClick:()=>o(E),className:ee("rounded-lg px-3 py-1.5 text-[11px] font-semibold tracking-wide transition-all cursor-pointer",a===E?"bg-primary text-primary-foreground shadow-md shadow-primary/10":"border border-border/50 text-muted-foreground hover:text-foreground"),children:A.label},E))}),S&&l.jsxs(l.Fragment,{children:[S.note&&l.jsxs("div",{className:"flex items-start gap-2.5 p-3 rounded-xl bg-primary/5 border border-primary/20 text-[11px] text-muted-foreground leading-relaxed",children:[l.jsx(pw,{className:"h-4 w-4 text-primary shrink-0 mt-0.5"}),l.jsx("span",{children:S.note})]}),l.jsx(Y2,{tool:S,fileName:MX[a]||"config.json",accent:"teal",copied:c==="model",onCopy:()=>N("model",S.snippet)})]})]}),l.jsxs("div",{className:"space-y-3 rounded-2xl border border-border/60 border-t-2 border-t-violet-500/70 bg-card/30 p-4",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center gap-2 text-sm font-space font-bold text-foreground",children:[l.jsx("span",{className:"flex h-5 w-5 items-center justify-center rounded-md bg-violet-500/15 text-violet-300 text-[11px]",children:"2"}),"Gedächtnis anbinden",l.jsx("span",{className:"text-[10px] font-medium text-muted-foreground normal-case",children:"optional"})]}),l.jsxs("p",{className:"text-[11px] text-muted-foreground mt-0.5",children:["Ein MCP-Block — gilt zusätzlich für ",l.jsx("em",{children:"jedes"})," Tool aus Schritt 1."]})]}),l.jsxs("div",{className:"flex items-start gap-2.5 p-3 rounded-xl bg-violet-500/5 border border-violet-500/20 text-[11px] text-muted-foreground leading-relaxed",children:[l.jsx(pw,{className:"h-4 w-4 text-violet-400 shrink-0 mt-0.5"}),l.jsx("span",{children:h.memory.note})]}),l.jsx(Y2,{tool:h.memory,fileName:"mcp.json",accent:"violet",copied:c==="memory",onCopy:()=>N("memory",h.memory.snippet)})]})]})]})}const IX="modulepreload",TX=function(e){return"/"+e},X2={},DX=function(t,r,n){let a=Promise.resolve();if(r&&r.length>0){let c=function(h){return Promise.all(h.map(m=>Promise.resolve(m).then(g=>({status:"fulfilled",value:g}),g=>({status:"rejected",reason:g}))))};document.getElementsByTagName("link");const u=document.querySelector("meta[property=csp-nonce]"),f=(u==null?void 0:u.nonce)||(u==null?void 0:u.getAttribute("nonce"));a=c(r.map(h=>{if(h=TX(h),h in X2)return;X2[h]=!0;const m=h.endsWith(".css"),g=m?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${h}"]${g}`))return;const v=document.createElement("link");if(v.rel=m?"stylesheet":IX,m||(v.as="script"),v.crossOrigin="",v.href=h,f&&v.setAttribute("nonce",f),document.head.appendChild(v),m)return new Promise((b,j)=>{v.addEventListener("load",b),v.addEventListener("error",()=>j(new Error(`Unable to preload CSS for ${h}`)))})}))}function o(c){const u=new Event("vite:preloadError",{cancelable:!0});if(u.payload=c,window.dispatchEvent(u),!u.defaultPrevented)throw c}return a.then(c=>{for(const u of c||[])u.status==="rejected"&&o(u.reason);return t().catch(o)})};class RX extends y.Component{constructor(){super(...arguments);is(this,"state",{error:null})}static getDerivedStateFromError(r){return{error:r}}render(){return this.state.error?l.jsxs("div",{className:"h-[480px] rounded-2xl border border-red-500/20 bg-red-500/5 p-6 text-xs text-red-400 overflow-auto",children:[l.jsx("div",{className:"font-semibold mb-2",children:"Graph konnte nicht gerendert werden"}),l.jsx("pre",{className:"whitespace-pre-wrap break-words text-[11px] leading-relaxed",children:this.state.error.message})]}):this.props.children}}const LX=y.lazy(()=>DX(()=>import("./GraphView-E0VQUPTe.js"),[]).then(e=>({default:e.GraphView}))),Qd=["identity","knowledge","rules","events"],Z2=new Set(["auto","agent","hermes"]),Wg={identity:{label:"Identität",icon:U4,bg:"bg-cyan-500/10",text:"text-cyan-400"},knowledge:{label:"Wissen",icon:ks,bg:"bg-indigo-500/10",text:"text-indigo-400"},rules:{label:"Regeln",icon:M4,bg:"bg-violet-500/10",text:"text-violet-400"},events:{label:"Ereignisse",icon:n4,bg:"bg-amber-500/10",text:"text-amber-400"}},J2={label:"Gedächtnis",icon:sv,text:"text-muted-foreground"},$X={identity:"border-l-cyan-500/80",knowledge:"border-l-indigo-500/80",rules:"border-l-violet-500/80",events:"border-l-amber-500/80"},eN=`Hi Hermes! Lass uns ein kurzes Onboarding machen, damit du dich künftig an mich erinnerst. Stell mir nacheinander ein paar kurze Fragen zu: 1) wer ich bin und woran ich gerade arbeite, 2) wie ich angesprochen werden möchte, 3) meine bevorzugten Tools, Sprachen und Arbeitsweise, 4) wichtige Regeln/Konventionen, die du beachten sollst, 5) meine Infrastruktur (Server, Dienste – ohne Geheimnisse). -Frag immer nur eine Sache auf einmal und fass am Ende zusammen, was du dir gemerkt hast.`;function YO(){const[e,t]=y.useState(""),[r,n]=y.useState(""),[a,o]=y.useState(""),[c,u]=y.useState("knowledge"),[f,h]=y.useState(!1),[m,g]=y.useState(!1),[v,b]=y.useState("liste"),[j,k]=y.useState(!1),S=Yn(),{showAlert:N,showConfirm:E,dialogElement:A}=Aa(),{data:P=[]}=vv({}),{data:_=[],error:O}=vv({q:r,category:e}),{data:D}=MD(v==="graph"),U=O?String(O):"",B=()=>{S.invalidateQueries({queryKey:["memory"]}),S.invalidateQueries({queryKey:["memory-graph"]})},F=y.useMemo(()=>{const I=P.length,M=P.filter(K=>X2.has(K.source)).length;return{total:I,auto:M,manual:I-M,cats:new Set(P.map(K=>K.category)).size}},[P]),Y=P.length===0,H=y.useMemo(()=>{const I=D??{nodes:[],edges:[]};if(!r.trim())return I;const M=r.toLowerCase(),K=I.nodes.filter(Z=>Z.content.toLowerCase().includes(M)),ne=new Set(K.map(Z=>Z.id));return{nodes:K,edges:I.edges.filter(Z=>ne.has(Z.source)&&ne.has(Z.target))}},[D,r]),pe=y.useMemo(()=>{const I={};return _.forEach(M=>{var K;(I[K=M.category]??(I[K]=[])).push(M)}),I},[_]),ue=y.useMemo(()=>_.filter(I=>!Qd.includes(I.category)),[_]);async function he(){a.trim()&&(await Se("/api/memory",{method:"POST",body:JSON.stringify({content:a,category:c,source:"ui"})}),o(""),k(!1),B())}function ae(I){E("Eintrag löschen?","Diesen Gedächtnis-Eintrag dauerhaft entfernen?",async()=>{try{await Se(`/api/memory/${I}`,{method:"DELETE"}),B()}catch(M){N("Fehler",`Löschen fehlgeschlagen: ${M.message||M}`)}})}async function se(){try{await navigator.clipboard.writeText(J2),g(!0),setTimeout(()=>g(!1),1800)}catch{N("Kopieren fehlgeschlagen","Markiere den Prompt und kopiere ihn manuell (Strg+C).")}}function X(){se(),window.dispatchEvent(new CustomEvent("mc-navigate",{detail:{view:"terminal"}}))}async function te(){h(!0);try{const I=await Se("/api/memory/dedupe",{method:"POST",body:JSON.stringify({apply:!1})});if(I.duplicate_count===0){N("Ergebnis","Keine Dubletten gefunden — alles sauber.");return}E("Deduplizierung bestätigen",`${I.duplicate_count} Dublette(n) in ${I.groups.length} Gruppe(n) gefunden. Entfernen?`,async()=>{try{await Se("/api/memory/dedupe",{method:"POST",body:JSON.stringify({apply:!0})}),B()}catch(M){N("Fehler",`Fehler beim Löschen: ${M.message}`)}})}catch(I){N("Fehler",`Fehler bei der Deduplizierung: ${I.message}`)}finally{h(!1)}}const J=({value:I,label:M,accent:K})=>l.jsxs("span",{className:ee("flex items-center gap-1.5 text-[11px] rounded-lg px-2.5 py-1 border",K==="auto"?"text-emerald-400 bg-emerald-500/[0.07] border-emerald-500/20":"text-muted-foreground bg-card/40 border-border/50"),children:[K==="auto"&&l.jsx(ys,{className:"h-3 w-3"}),l.jsx("b",{className:ee("font-semibold",K==="auto"?"":"text-foreground"),children:I})," ",M]});return l.jsxs("div",{className:"space-y-5",children:[l.jsxs("div",{className:"flex flex-col lg:flex-row lg:items-center justify-between gap-3",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Gedächtnis-Pool"}),l.jsx("p",{className:"text-sm text-muted-foreground",children:"Geteilte Konstitution — Hermes, IDEs & Gateway lesen und lernen hier per MCP."})]}),l.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[l.jsxs("div",{className:"relative",children:[l.jsx("input",{value:r,onChange:I=>n(I.target.value),"aria-label":"Gedächtnis durchsuchen",type:"search",placeholder:"Semantisch suchen…",className:"w-52 h-9 pl-8 pr-3 rounded-lg border border-border/60 bg-card/45 text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground"}),l.jsx(MN,{className:"absolute left-2.5 top-2.5 h-3.5 w-3.5 text-muted-foreground"})]}),l.jsxs("button",{onClick:()=>k(I=>!I),className:"h-9 px-3 rounded-lg bg-primary text-primary-foreground text-xs font-semibold hover:opacity-90 transition-all flex items-center gap-1.5 cursor-pointer shadow-md shadow-primary/10",children:[l.jsx(df,{className:"h-4 w-4"})," Eintrag"]}),l.jsx("div",{className:"flex items-center gap-1 p-1 bg-card/30 border border-border/40 rounded-lg",children:[["liste",b4,"Liste"],["graph",T4,"Graph"]].map(([I,M,K])=>l.jsxs("button",{onClick:()=>b(I),className:ee("flex h-7 px-2.5 items-center gap-1.5 text-[11px] font-semibold rounded-md transition-all cursor-pointer",v===I?"bg-primary text-primary-foreground":"text-muted-foreground hover:text-foreground"),children:[l.jsx(M,{className:"h-3.5 w-3.5"})," ",K]},I))}),l.jsx("button",{onClick:te,disabled:f,className:"flex h-9 w-9 items-center justify-center rounded-lg border border-border/60 bg-card hover:border-primary/50 transition-all cursor-pointer shadow-md disabled:opacity-50","aria-label":"Duplikate bereinigen",title:"Deduplizieren",children:l.jsx(ys,{className:"h-4 w-4 text-primary","aria-hidden":"true"})})]})]}),!Y&&l.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[l.jsx(J,{value:F.total,label:"Fakten"}),l.jsx(J,{value:F.auto,label:"auto gelernt",accent:"auto"}),l.jsx(J,{value:F.manual,label:"manuell"}),l.jsx(J,{value:F.cats,label:"Kategorien"}),l.jsxs("span",{className:"ml-auto text-[11px] text-muted-foreground/70 flex items-center gap-1.5",children:[l.jsx(ys,{className:"h-3 w-3 text-emerald-400"})," lernt automatisch aus Hermes-Gesprächen"]})]}),j&&l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-4 space-y-3",children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx("div",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Neuen Eintrag anlegen"}),l.jsx("button",{onClick:()=>k(!1),"aria-label":"Schließen",className:"text-muted-foreground hover:text-foreground",children:l.jsx(Wn,{className:"h-4 w-4","aria-hidden":"true"})})]}),l.jsx("textarea",{value:a,onChange:I=>o(I.target.value),rows:2,"aria-label":"Eintragstext",placeholder:"Eine Regel, Vorliebe oder einen stabilen Fakt über dich oder das Projekt…",className:"w-full resize-none rounded-xl border border-border/60 bg-background/30 p-3 text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground leading-relaxed"}),l.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[l.jsx("select",{value:c,onChange:I=>u(I.target.value),"aria-label":"Kategorie",className:"h-8 rounded-lg border border-border/60 bg-background/50 px-2 text-xs outline-none font-semibold text-foreground cursor-pointer",children:Qd.map(I=>{var M;return l.jsx("option",{value:I,className:"bg-popover text-foreground",children:((M=Wg[I])==null?void 0:M.label)||I},I)})}),l.jsxs("button",{onClick:he,className:"h-9 px-4 rounded-lg bg-primary text-primary-foreground text-xs font-semibold hover:opacity-90 transition-all flex items-center gap-1.5 cursor-pointer",children:[l.jsx(df,{className:"h-4 w-4"})," Speichern"]})]})]}),U&&l.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400",children:["Fehler: ",U]}),Y?l.jsxs("div",{className:"rounded-2xl border border-dashed border-border/60 bg-card/20 p-8 sm:p-10 flex flex-col items-center text-center gap-5",children:[l.jsx("div",{className:"h-14 w-14 rounded-2xl bg-primary/10 flex items-center justify-center",children:l.jsx(j4,{className:"h-7 w-7 text-primary"})}),l.jsxs("div",{className:"space-y-1.5 max-w-lg",children:[l.jsx("h3",{className:"text-base font-semibold text-foreground",children:"Lass Hermes dich kennenlernen"}),l.jsx("p",{className:"text-xs text-muted-foreground leading-relaxed",children:"Statt Fakten einzutippen: führ ein kurzes Onboarding-Gespräch mit Hermes. Was ihr besprecht, merkt sich das Gedächtnis automatisch — du musst nichts manuell pflegen."})]}),l.jsxs("div",{className:"w-full max-w-lg text-left",children:[l.jsxs("div",{className:"flex items-center justify-between mb-1.5",children:[l.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground/60",children:"Sende das an Hermes"}),l.jsx("button",{onClick:se,className:"flex items-center gap-1 text-[10px] font-semibold text-muted-foreground hover:text-foreground transition-colors",children:m?l.jsxs(l.Fragment,{children:[l.jsx(sr,{className:"h-3 w-3 text-emerald-400"})," Kopiert"]}):l.jsxs(l.Fragment,{children:[l.jsx(uv,{className:"h-3 w-3"})," Kopieren"]})})]}),l.jsx("pre",{className:"w-full rounded-xl border border-border/60 bg-background/40 p-3.5 text-[11px] leading-relaxed text-foreground/90 whitespace-pre-wrap font-mono",children:J2})]}),l.jsxs("div",{className:"flex flex-wrap items-center justify-center gap-2",children:[l.jsxs("button",{onClick:X,className:"h-9 px-4 rounded-lg bg-primary text-primary-foreground text-xs font-semibold hover:opacity-90 transition-all flex items-center gap-1.5 cursor-pointer",children:[l.jsx(TN,{className:"h-4 w-4"})," Im Terminal starten"]}),l.jsxs("button",{onClick:se,className:"h-9 px-4 rounded-lg border border-border/60 bg-card text-xs font-semibold hover:border-primary/50 transition-all flex items-center gap-1.5 cursor-pointer",children:[m?l.jsx(sr,{className:"h-4 w-4 text-emerald-400"}):l.jsx(uv,{className:"h-4 w-4"})," Prompt kopieren"]})]}),l.jsxs("p",{className:"text-[11px] text-muted-foreground/70 flex items-center gap-1.5",children:[l.jsx(I4,{className:"h-3 w-3"})," Funktioniert genauso über Telegram —"," ",l.jsx("button",{onClick:()=>k(!0),className:"underline hover:text-foreground",children:"oder lieber manuell anlegen"}),"."]})]}):v==="graph"?l.jsx(RX,{children:l.jsx(y.Suspense,{fallback:l.jsx("div",{className:"h-[480px] rounded-2xl border border-border/60 bg-card/30 flex items-center justify-center text-xs text-muted-foreground",children:"Graph wird geladen…"}),children:l.jsx(LX,{data:H,onDelete:ae})})}):l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"flex flex-wrap items-center gap-1.5 p-1 bg-card/30 border border-border/40 rounded-xl w-fit",children:[l.jsx("button",{onClick:()=>t(""),className:ee("h-7 px-3 rounded-lg text-[10px] font-semibold uppercase tracking-wider transition-all cursor-pointer",e?"text-muted-foreground hover:text-foreground":"bg-primary text-primary-foreground"),children:"Alle"}),Qd.map(I=>{const M=Wg[I]||Z2,K=M.icon;return l.jsxs("button",{onClick:()=>t(I),className:ee("h-7 px-2.5 rounded-lg text-[10px] font-semibold uppercase tracking-wider transition-all cursor-pointer flex items-center gap-1",e===I?"bg-primary text-primary-foreground":"text-muted-foreground hover:text-foreground"),children:[l.jsx(K,{className:"h-3 w-3"})," ",M.label]},I)})]}),_.length===0?l.jsx("div",{className:"text-xs text-muted-foreground border border-dashed border-border/60 rounded-2xl p-12 text-center",children:"Keine Einträge für die aktuellen Filterkriterien gefunden."}):l.jsx("div",{className:"space-y-5",children:[...Qd,"__other"].map(I=>{const M=I==="__other"?ue:pe[I]||[];if(!M.length)return null;const K=Wg[I]||Z2,ne=K.icon;return l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center gap-2 mb-2 px-1",children:[l.jsx(ne,{className:ee("h-3.5 w-3.5",K.text)}),l.jsx("span",{className:ee("text-[11px] font-bold uppercase tracking-wider",K.text),children:K.label}),l.jsx("span",{className:"text-[10px] font-mono text-muted-foreground/60 bg-card/50 rounded px-1.5 py-0.5",children:M.length}),l.jsx("div",{className:"ml-1 h-px flex-1 bg-border/30"})]}),l.jsx("div",{className:"space-y-2",children:M.map(Z=>{const me=X2.has(Z.source);return l.jsxs("div",{className:ee("flex items-start justify-between gap-4 p-3.5 rounded-xl border border-l-4 bg-card/45 backdrop-blur-md border-border/60 hover:border-primary/20 transition-all group",$X[Z.category]||"border-l-muted"),children:[l.jsx("span",{className:"text-xs text-foreground leading-relaxed break-words whitespace-pre-wrap flex-1 min-w-0",children:Z.content}),l.jsxs("div",{className:"flex items-center gap-2 shrink-0",children:[typeof Z.score=="number"&&l.jsxs("span",{className:"text-[9px] font-mono text-primary bg-primary/10 px-1.5 py-0.5 rounded",title:"Relevanz der semantischen Suche",children:[Math.round(Z.score*100),"%"]}),l.jsxs("span",{className:ee("flex items-center gap-1 text-[9px] font-mono px-1.5 py-0.5 rounded",me?"text-emerald-400 bg-emerald-500/10":"text-muted-foreground/60 bg-background/20"),title:me?"Automatisch gelernt":"Manuell angelegt",children:[me&&l.jsx(ys,{className:"h-2.5 w-2.5"}),Z.source]}),l.jsx("button",{onClick:()=>ae(Z.id),"aria-label":"Eintrag löschen",title:"Eintrag löschen",className:"h-7 w-7 rounded-lg flex items-center justify-center border border-border/40 text-muted-foreground hover:text-red-400 hover:bg-red-500/5 transition-all opacity-0 group-hover:opacity-100",children:l.jsx(cv,{className:"h-3.5 w-3.5","aria-hidden":"true"})})]})]},Z.id)})})]},I)})})]}),A]})}const zX=["chat","coding","fast","heavy"];function XO(){const{data:e,error:t}=Oy(5e3),{data:r}=Ni(),{showAlert:n,dialogElement:a}=Aa(),o=Yn(),c=t?String(t):"",[u,f]=y.useState(!1),h=(r==null?void 0:r.models)??[];async function m(v){try{await Se("/api/agent/brain",{method:"POST",body:JSON.stringify({model:v})}),n("Erledigt",`Hermes-Hirn zeigt jetzt auf das Alias '${v}'. Der Gateway-Dienst wurde neu gestartet.`),o.invalidateQueries({queryKey:Ve.agentStatus}),f(!1)}catch(b){n("Fehler",`Wechsel fehlgeschlagen: ${b.message||b}`)}}async function g(v){try{await Se("/api/agent/brain/set",{method:"POST",body:JSON.stringify({model_id:v})}),n("Erledigt","Agent-Hirn gewechselt (warm gehalten). Gateway wurde neugestartet."),o.invalidateQueries({queryKey:Ve.agentStatus}),o.invalidateQueries({queryKey:Ve.models}),f(!1)}catch(b){n("Fehler",`Wechsel fehlgeschlagen: ${b.message||b}`)}}return l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{className:"flex flex-col sm:flex-row justify-between sm:items-center gap-4",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Hermes Agenten-Cockpit"}),l.jsxs("p",{className:"text-sm text-muted-foreground",children:["Hermes ist ein autonomer Agent, der im Hintergrund der Box läuft (Port ",l.jsx("code",{children:":8642"}),") und seine eigene UI besitzt."]})]}),(e==null?void 0:e.terminal_url)&&l.jsxs("a",{href:Ks(e.terminal_url),target:"_blank",rel:"noopener",className:ee("flex h-9 px-4 items-center gap-1.5 text-xs font-semibold rounded-lg transition-all cursor-pointer shadow-md shrink-0 self-start",e.terminal_reachable?"bg-primary text-primary-foreground hover:opacity-90 shadow-primary/10":"border border-border/60 text-muted-foreground bg-background/20"),children:[l.jsx(Us,{className:"h-4 w-4"}),l.jsx("span",{children:"Terminal öffnen"})]})]}),c&&l.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400 font-mono",children:["Status nicht lesbar (",c,")."]}),e&&l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10",children:[l.jsxs("div",{className:"mb-4 flex items-center gap-2",children:[l.jsx(wn,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("span",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"Agent-Fluss"})]}),l.jsxs("div",{className:"flex flex-col lg:flex-row lg:items-stretch gap-3",children:[l.jsxs("button",{onClick:()=>e.terminal_reachable&&window.open(Ks(e.terminal_url),"_blank"),title:e.terminal_reachable?"Hermes-Terminal öffnen":"Terminal offline",className:"lg:w-40 shrink-0 rounded-xl border border-border/60 bg-background/30 p-3 text-left hover:border-primary/40 transition-all cursor-pointer flex flex-col justify-center",children:[l.jsxs("div",{className:"flex items-center gap-1.5",children:[l.jsx(uh,{className:ee("h-3.5 w-3.5",e.terminal_reachable?"text-emerald-400":"text-amber-500")}),l.jsx("span",{className:"text-xs font-semibold text-foreground",children:"Terminal"}),l.jsx("span",{className:ee("ml-auto h-1.5 w-1.5 rounded-full animate-pulse",e.terminal_reachable?"bg-emerald-500":"bg-amber-500")})]}),l.jsx("span",{className:"text-[10px] text-muted-foreground font-mono mt-0.5",children:"hermes chat · Clients"})]}),l.jsx("div",{className:"hidden lg:flex items-center text-muted-foreground text-lg select-none",children:"→"}),l.jsxs("div",{className:"flex-1 flex flex-col gap-2.5",children:[l.jsxs("div",{className:"rounded-xl border border-primary/40 bg-primary/5 px-3.5 py-2.5 flex items-center gap-2",children:[l.jsx(wn,{className:"h-3.5 w-3.5 text-primary"}),l.jsx("span",{className:"text-xs font-semibold text-primary",children:"Agent Gateway"}),l.jsx("span",{className:"text-[11px] font-mono text-muted-foreground",children:":8642"}),l.jsxs("span",{className:ee("ml-auto inline-flex items-center gap-1.5 text-[10px] font-bold uppercase font-mono px-2 py-0.5 rounded-full border",e.gateway_reachable?"bg-emerald-500/10 text-emerald-400 border-emerald-500/20":"bg-red-500/10 text-red-400 border-red-500/20"),children:[l.jsx("span",{className:ee("h-1.5 w-1.5 rounded-full",e.gateway_reachable?"bg-emerald-500 animate-pulse":"bg-red-500")}),e.gateway_reachable?"online":"offline"]})]}),l.jsxs("div",{className:"grid gap-2.5 sm:grid-cols-3",children:[l.jsxs("button",{onClick:()=>f(!0),className:"rounded-xl border border-border/60 bg-background/30 p-3 text-left hover:border-primary/45 transition-all cursor-pointer",children:[l.jsxs("div",{className:"flex items-center gap-1.5 text-muted-foreground",children:[l.jsx(Hn,{className:"h-3.5 w-3.5 text-primary"}),l.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider",children:"Hirn"}),l.jsx("span",{className:"ml-auto text-[9px] text-primary/70 font-bold uppercase",children:"wechseln →"})]}),l.jsx("div",{className:"text-[11px] font-mono font-medium text-foreground truncate mt-1",title:e.brain_model,children:e.brain_model||"chat"})]}),l.jsxs("div",{className:"rounded-xl border border-border/60 bg-background/30 p-3",children:[l.jsxs("div",{className:"flex items-center gap-1.5 text-muted-foreground",children:[l.jsx(Qu,{className:"h-3.5 w-3.5 text-primary"}),l.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider",children:"Verdrahtung"})]}),l.jsxs("div",{className:"text-[10px] font-mono mt-1 flex flex-wrap gap-x-2 text-muted-foreground",children:[l.jsxs("span",{children:["Config: ",e.has_config?"✓":"—"]}),l.jsxs("span",{children:["Skills: ",e.has_skills?"✓":"—"]}),l.jsxs("span",{children:["Memory: ",e.has_memories?"✓":"—"]})]})]}),l.jsxs("div",{className:"rounded-xl border border-border/60 bg-background/30 p-3",children:[l.jsxs("div",{className:"flex items-center gap-1.5 text-muted-foreground",children:[l.jsx(pw,{className:"h-3.5 w-3.5 text-primary"}),l.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider",children:"PC"}),l.jsx("span",{className:ee("ml-auto h-1.5 w-1.5 rounded-full",e.pc_executor_reachable?"bg-emerald-500 animate-pulse":"bg-amber-500")})]}),l.jsxs("div",{className:ee("text-[11px] font-mono mt-1",e.pc_executor_reachable?"text-emerald-400":"text-muted-foreground"),children:[":7777 ",e.pc_executor_reachable?"verbunden":"offline"]})]})]})]})]})]}),l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 space-y-4 shadow-lg shadow-black/10",children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(pw,{className:"h-5 w-5 text-primary"}),l.jsx("h3",{className:"text-sm font-bold uppercase tracking-wider text-foreground",children:"PC Verbindung"})]}),l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx("span",{className:ee("h-2 w-2 rounded-full",e.pc_executor_reachable?"bg-emerald-500 animate-pulse":"bg-amber-500")}),l.jsx("span",{className:"text-xs font-semibold text-foreground",children:e.pc_executor_reachable?"Erreichbar":"Nicht verbunden"})]})]}),l.jsxs("div",{className:"grid gap-6 md:grid-cols-2 text-xs text-muted-foreground leading-relaxed text-left",children:[l.jsxs("div",{className:"space-y-3",children:[l.jsxs("p",{children:["Der ",l.jsx("strong",{className:"text-foreground",children:"Hermes PC Executor"})," läuft auf ",l.jsx("code",{className:"text-foreground font-mono px-1 py-0.5 rounded bg-muted/40 border border-border/30",children:"192.168.178.98:7777"})," und ermöglicht Hermes den direkten Zugriff auf deinen Windows-PC — Shell-Befehle, Screenshots, Tastatureingaben."]}),l.jsxs("p",{children:["Hermes erreicht den PC über den MCP-Server ",l.jsx("code",{className:"text-foreground font-mono px-1 py-0.5 rounded bg-muted/40 border border-border/30",children:"hermes-pc-control"}),", der automatisch beim Gateway-Start verbunden wird."]})]}),l.jsx("div",{className:"space-y-3",children:e.pc_executor_reachable?l.jsxs("div",{className:"p-3.5 bg-emerald-500/5 border border-emerald-500/20 rounded-xl space-y-1",children:[l.jsxs("div",{className:"text-emerald-400 font-semibold text-xs flex items-center gap-1.5",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"}),"PC Executor verbunden"]}),l.jsxs("p",{className:"text-[10px]",children:["Hermes kann jetzt per Telegram oder Terminal Befehle auf TobisNicerPC ausführen. Nutze ",l.jsx("code",{className:"text-foreground",children:"pc_shell"}),", ",l.jsx("code",{className:"text-foreground",children:"pc_screenshot"})," oder ",l.jsx("code",{className:"text-foreground",children:"pc_open"}),"."]})]}):l.jsxs("div",{className:"space-y-2",children:[l.jsx("h4",{className:"text-xs font-bold text-foreground",children:"PC Executor starten"}),l.jsxs("p",{children:["Starte ",l.jsx("code",{className:"text-foreground font-mono",children:"start.bat"})," im Ordner ",l.jsx("code",{className:"text-foreground font-mono",children:"client\\hermes-pc\\"})," auf dem Windows-PC und lasse das Fenster offen."]}),l.jsx("div",{className:"p-3 bg-background/25 rounded-xl border border-border/30 font-mono text-[9px] text-cyan-300",children:"client\\hermes-pc\\start.bat"})]})})]})]}),!e.gateway_reachable&&l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 space-y-4 shadow-lg shadow-black/10 text-left",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(ws,{className:"h-5 w-5 text-amber-500"}),l.jsx("h3",{className:"text-sm font-bold uppercase tracking-wider text-foreground",children:"Hermes-Agent Diagnostics"})]}),l.jsxs("div",{className:"text-xs text-muted-foreground space-y-3 leading-relaxed",children:[l.jsx("p",{children:"Der Hermes-Dienst ist auf der Box derzeit offline oder kann sich nicht mit dem lokalen llama-swap verbinden."}),l.jsxs("p",{children:["Stelle sicher, dass die systemd-Dienste auf der Box laufen. Du kannst den Status im ",l.jsx("strong",{children:"OS & Updates Drawer"})," prüfen und die Dienste bei Bedarf neu starten."]}),l.jsxs("div",{className:"p-3.5 bg-background/25 rounded-xl border border-border/30 font-mono text-[10px] space-y-1",children:[l.jsx("div",{className:"text-muted-foreground/60",children:"# Dienste manuell auf der Box prüfen:"}),l.jsx("div",{className:"text-primary",children:"systemctl --user status hermes-gateway"}),l.jsx("div",{className:"text-primary",children:"systemctl --user status hermes-terminal"})]}),l.jsxs("p",{children:["Weitere Einrichtungsdetails (Brain-Konfiguration, MCP-Kopplungen, SSH-Tunneling und Such-Engines) findest du in der Dokumentationsdatei:",l.jsx("code",{className:"ml-1 px-1.5 py-0.5 rounded bg-muted/40 text-foreground border border-border/30",children:"docs/HERMES_SETUP.md"}),"."]})]})]})]}),e&&u&&l.jsx("div",{className:"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm flex items-center justify-center p-4 overscroll-contain",role:"dialog","aria-modal":"true","aria-label":"Hermes-Hirn konfigurieren",children:l.jsxs("div",{className:"w-full max-w-md rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[l.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[l.jsxs("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary flex items-center gap-1.5",children:[l.jsx(Hn,{className:"h-4 w-4"}),l.jsx("span",{children:"Hermes-Hirn konfigurieren"})]}),l.jsx("button",{onClick:()=>f(!1),className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:l.jsx(Wn,{className:"h-4 w-4"})})]}),l.jsxs("div",{className:"space-y-1.5",children:[l.jsx("div",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground",children:"Lane / Gateway-Alias"}),l.jsx("div",{className:"flex flex-wrap gap-1.5",children:zX.map(v=>{const b=e.brain_model===v;return l.jsxs("button",{onClick:()=>m(v),className:ee("px-3 py-1.5 rounded-lg text-xs font-mono font-semibold border transition-all cursor-pointer flex items-center gap-1.5",b?"border-primary/40 bg-primary/10 text-primary":"border-border/30 bg-background/20 text-foreground hover:bg-accent"),children:[v,b&&l.jsx(sr,{className:"h-3.5 w-3.5"})]},v)})}),l.jsxs("p",{className:"text-[10px] text-muted-foreground/70",children:["Schlank & flexibel: das Hirn folgt dem Lane-Routing (z.B. ",l.jsx("code",{className:"text-primary",children:"chat"})," = fast↔heavy)."]})]}),l.jsxs("div",{className:"space-y-1.5",children:[l.jsx("div",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground",children:"Installiertes Modell (warm gehalten)"}),l.jsx("div",{className:"space-y-1.5 max-h-56 overflow-y-auto pr-1",children:h.map(v=>{var j;const b=v.role==="hermes";return l.jsxs("button",{onClick:()=>!b&&g(v.name),disabled:b||v.incomplete,className:ee("w-full text-left px-3 py-2.5 rounded-lg text-xs flex items-center justify-between font-mono border transition-all",b?"border-indigo-500/40 bg-indigo-500/10 text-indigo-300":v.incomplete?"border-border/20 bg-background/10 text-muted-foreground/50 cursor-not-allowed":"border-border/30 bg-background/20 text-foreground hover:bg-accent cursor-pointer"),children:[l.jsxs("div",{className:"flex flex-col min-w-0",children:[l.jsx("span",{className:"font-semibold truncate max-w-[280px]",children:(j=v.name.split("/").pop())==null?void 0:j.replace(/\.gguf$/i,"")}),l.jsxs("span",{className:"text-[9px] text-muted-foreground mt-0.5",children:[v.capabilities.params_b?`${v.capabilities.params_b}B`:"?"," · ",v.capabilities.tools!=="no"?"Tools ✓":"ohne Tools",v.role&&` · Rolle: ${v.role}`]})]}),b?l.jsxs("span",{className:"text-[9px] font-bold uppercase text-indigo-300 shrink-0 flex items-center gap-1",children:[l.jsx(sr,{className:"h-3.5 w-3.5"})," Aktiv"]}):l.jsx("span",{className:"text-[9px] font-bold uppercase text-primary/70 shrink-0",children:"Warm setzen →"})]},v.name)})})]}),l.jsxs("div",{className:"text-[10px] text-amber-400/80 flex items-start gap-1.5 border-t border-border/20 pt-2.5",children:[l.jsx("span",{children:"💡"}),l.jsxs("span",{children:["Für einen ",l.jsx("strong",{children:"Agenten"}),' sind Hermes-Modelle (natives Tool-Calling) meist die robustere Wahl. Neues Modell? Erst über „Modell-Manager → Modelle finden" laden.']})]})]})}),a]})}function FX(){const{data:e}=Oy(5e3),t=e!=null&&e.terminal_url?Ks(e.terminal_url):void 0,r=e==null?void 0:e.terminal_reachable;return l.jsxs("div",{className:"flex h-full flex-col gap-4",children:[l.jsxs("div",{className:"flex flex-wrap items-end justify-between gap-3",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text font-space text-2xl font-bold tracking-tight text-transparent",children:"Hermes Terminal"}),l.jsxs("p",{className:"flex items-center gap-2 text-sm text-muted-foreground",children:["Interaktiver Agent (",l.jsx("code",{className:"rounded bg-background/40 px-1 font-mono text-[11px] text-primary",children:"hermes chat"}),') mit Tools & PC-Steuerung — „mehr als Chatten".']})]}),l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsxs("span",{className:"flex items-center gap-1.5 text-[11px] font-medium text-muted-foreground",children:[l.jsx("span",{className:`h-2 w-2 rounded-full ${r?"bg-emerald-500 animate-pulse":"bg-amber-500"}`}),r?"online":"offline"]}),t&&l.jsxs("a",{href:t,target:"_blank",rel:"noopener",className:"flex h-8 items-center gap-1.5 rounded-lg border border-border/60 bg-background/20 px-3 text-xs font-semibold text-muted-foreground transition-all hover:border-primary/50 hover:text-foreground",children:[l.jsx(Us,{className:"h-3.5 w-3.5"})," In neuem Tab"]})]})]}),t?l.jsxs("div",{className:"relative min-h-[68vh] flex-1 overflow-hidden rounded-2xl border border-border/60 bg-black/50 shadow-lg shadow-black/25",children:[r===!1&&l.jsxs("div",{className:"absolute inset-0 z-10 flex flex-col items-center justify-center gap-3 bg-black/70 text-center",children:[l.jsx(bi,{className:"h-8 w-8 text-amber-400"}),l.jsx("div",{className:"text-sm font-semibold text-amber-300",children:"Terminal nicht erreichbar"}),l.jsxs("p",{className:"max-w-sm text-[11px] leading-normal text-muted-foreground",children:["Der ",l.jsx("code",{className:"font-mono text-primary",children:"hermes-terminal"}),"-Dienst (ttyd) läuft nicht. Auf der Box: ",l.jsx("code",{className:"font-mono",children:"systemctl --user restart hermes-terminal"}),"."]})]}),l.jsx("iframe",{src:t,title:"Hermes Terminal",className:"h-full w-full border-0",style:{minHeight:"68vh"}})]}):l.jsxs("div",{className:"flex min-h-[68vh] flex-1 items-center justify-center rounded-2xl border border-border/60 bg-background/20 text-xs text-muted-foreground",children:[l.jsx(IN,{className:"mr-2 h-4 w-4"})," Lade Terminal…"]})]})}const eN=[{id:"grundlagen",label:"Grundlagen"},{id:"moe",label:"MoE & Quant"},{id:"lokal",label:"Lokal betreiben"},{id:"modelle",label:"Modell-Landschaft"},{id:"gateway",label:"Gateway-Trick"},{id:"mcp",label:"MCP"},{id:"skills",label:"Skills"},{id:"memory",label:"Gedächtnis & RAG"},{id:"agents",label:"Agenten"},{id:"ide",label:"IDE anbinden"},{id:"tricks",label:"Tricks & Kniffe"},{id:"wartung",label:"Sicherheit & Wartung"},{id:"ressourcen",label:"Ressourcen"},{id:"troubleshooting",label:"Troubleshooting"}];function BX(e){var t;(t=document.getElementById(e))==null||t.scrollIntoView({behavior:"smooth",block:"start"})}function Rr({id:e,icon:t,color:r,title:n,kicker:a,children:o,wide:c}){return l.jsxs("section",{id:e,className:ee("scroll-mt-20 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 shadow-lg shadow-black/10 space-y-3",c&&"md:col-span-2"),children:[l.jsxs("div",{className:"flex items-center gap-2.5 border-b border-border/20 pb-3",children:[l.jsx(t,{className:ee("h-5 w-5 shrink-0",r)}),l.jsxs("div",{children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:n}),a&&l.jsx("span",{className:ee("text-[9px] font-mono",r),children:a})]})]}),l.jsx("div",{className:"text-xs text-muted-foreground space-y-2.5 leading-relaxed",children:o})]})}function Va({children:e}){return l.jsxs("div",{className:"mt-1 rounded-xl border border-primary/25 bg-primary/[0.06] p-3 text-[11px] leading-relaxed",children:[l.jsxs("div",{className:"flex items-center gap-1.5 font-bold text-primary mb-1",children:[l.jsx(ys,{className:"h-3 w-3"})," Bei dir konkret"]}),l.jsx("div",{className:"text-muted-foreground space-y-1",children:e})]})}function ze({children:e}){return l.jsx("code",{className:"rounded bg-background/40 border border-border/30 px-1.5 py-0.5 font-mono text-[10px] text-foreground",children:e})}function kt({href:e,name:t,note:r}){return l.jsxs("li",{className:"leading-relaxed",children:[l.jsxs("a",{href:e,target:"_blank",rel:"noopener",className:"text-primary hover:underline font-semibold inline-flex items-center gap-0.5",children:[t,l.jsx(G3,{className:"h-3 w-3 opacity-60"})]}),l.jsxs("span",{className:"text-muted-foreground",children:[" — ",r]})]})}function UX(){const[e,t]=y.useState(!1);return l.jsxs("div",{className:"space-y-7",children:[l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 shadow-lg shadow-black/10 flex items-start gap-4",children:[l.jsx("div",{className:"h-11 w-11 rounded-xl bg-primary/15 flex items-center justify-center shrink-0",children:l.jsx(sv,{className:"h-6 w-6 text-primary"})}),l.jsxs("div",{className:"space-y-1",children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Die AI-Bibel"}),l.jsxs("p",{className:"text-sm text-muted-foreground leading-relaxed max-w-2xl",children:["Allgemeines Nachschlagewerk für lokale & agentische AI — Konzepte, Tricks, Kniffe und kuratierte Quellen. ",l.jsx("span",{className:"font-semibold text-foreground",children:"Stand Juni 2026."})," ","Das meiste gilt überall; ",l.jsx("span",{className:"text-primary font-semibold",children:'„Bei dir konkret"'}),"-Kästen zeigen, was dein Stack daraus macht."]})]})]}),l.jsx("div",{className:"sticky top-0 z-10 -mx-1 px-1",children:l.jsx("div",{className:"rounded-xl border border-border/50 bg-card/70 backdrop-blur-xl p-2 shadow-lg shadow-black/20",children:l.jsxs("div",{className:"flex items-center gap-1.5 flex-wrap",children:[l.jsx(lv,{className:"h-3.5 w-3.5 text-primary ml-1 mr-0.5 shrink-0"}),(e?eN:eN.slice(0,9)).map(r=>l.jsx("button",{onClick:()=>BX(r.id),className:"rounded-lg px-2.5 py-1 text-[11px] font-semibold text-muted-foreground hover:text-primary hover:bg-primary/10 transition-colors cursor-pointer",children:r.label},r.id)),l.jsx("button",{onClick:()=>t(r=>!r),className:"rounded-lg px-2 py-1 text-[11px] font-semibold text-primary hover:bg-primary/10 transition-colors cursor-pointer",children:e?"weniger":"+ mehr"})]})})}),l.jsxs("div",{className:"grid gap-5 md:grid-cols-2",children:[l.jsxs(Rr,{id:"grundlagen",icon:Hn,color:"text-cyan-400",title:"1. Wie LLMs ticken",kicker:"Grundlagen",children:[l.jsxs("p",{children:["Ein LLM ist im Kern ein ",l.jsx("strong",{children:"Wahrscheinlichkeits-Rechner für das nächste Token"}),' (Wortteil). Es „weiß" nichts — es setzt fort, was statistisch am plausibelsten ist. Daraus folgt fast alles andere.']}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Tokens"})," sind die Einheit — ~¾ Wort. Ein- und Ausgabe werden in Tokens gezählt."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Kontextfenster"}),' = wie viele Tokens das Modell gleichzeitig „sehen" kann (Prompt + Antwort). Voll = Anfang fällt raus.']}),l.jsxs("li",{children:[l.jsx("strong",{children:"Parameter"})," = die trainierten Gewichte. Training ist einmalig, ",l.jsx("strong",{children:"Inferenz"})," ist jede Antwort."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Temperatur / Sampling"})," steuert Zufall: niedrig = deterministisch/präzise (Code), hoch = kreativ."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Halluzination"})," ist kein Bug, sondern die Kehrseite des Ratens. Gegenmittel: Grounding via Tools/RAG, Verifikation."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Reasoning-/Thinking-Modelle"}),' „denken" in unsichtbaren Tokens vor der Antwort — besser bei Logik, langsamer/teurer.']})]})]}),l.jsxs(Rr,{id:"moe",icon:ky,color:"text-violet-400",title:"2. MoE & Quantisierung",kicker:"Mehr Modell, weniger Last",children:[l.jsxs("p",{children:[l.jsx("strong",{children:"Mixture of Experts (MoE):"})," Statt für jedes Token das ganze Netz zu aktivieren, wählt ein",l.jsx("em",{children:" Router"})," nur ein paar spezialisierte ",l.jsx("em",{children:"Experts"}),' aus. So läuft ein 100B-Modell mit der aktiven Rechenlast eines viel kleineren (z.B. „122B total / 10B aktiv").']}),l.jsxs("p",{children:[l.jsx("strong",{children:"Quantisierung:"})," Gewichte von FP16 auf weniger Bits eindampfen — kleiner & schneller bei minimalem Qualitätsverlust. Faustregel:"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx(ze,{children:"Q8"})," nahezu verlustfrei, größter Footprint"]}),l.jsxs("li",{children:[l.jsx(ze,{children:"Q6_K"})," sehr gut, guter Mittelweg"]}),l.jsxs("li",{children:[l.jsx(ze,{children:"Q4_K_M"})," der Sweet-Spot für lokal — viel Modell pro GB"]})]}),l.jsxs(Va,{children:["VRAM/RAM ist die harte Grenze — ",l.jsx("strong",{children:"darum"})," ist beides hier zentral: MoE lässt 100B+ überhaupt laufen, Quant entscheidet, was reinpasst. Dein Line-up fährt durchweg ",l.jsx(ze,{children:"Q4_K_M"}),"/",l.jsx(ze,{children:"Q6_K"}),"."]})]}),l.jsxs(Rr,{id:"lokal",icon:ff,color:"text-emerald-400",title:"3. Lokal betreiben: Engines & Backends",kicker:"llama.cpp, vLLM & Co.",wide:!0,children:[l.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:[l.jsx("strong",{children:"Inference-Engines"})," — was die Modelle ausführt:"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"llama.cpp / GGUF"})," — der De-facto-Standard für lokal, CPU+GPU, läuft überall."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Ollama / LM Studio"})," — bequeme Wrapper mit One-Click-Downloads (LM Studio mit GUI)."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"vLLM / TGI"})," — Server-Engines für maximalen Durchsatz auf dicken GPUs."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"llama-swap"})," — Proxy, der ",l.jsx("em",{children:"mehrere"})," Modelle hinter ",l.jsx("em",{children:"einem"})," Port hält und je nach Anfrage automatisch ein-/aussattelt."]})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:[l.jsx("strong",{children:"GPU-Backends"})," — wie gerechnet wird:"]}),l.jsx("ul",{className:"list-disc pl-4 space-y-1",children:l.jsxs("li",{children:[l.jsx(ze,{children:"CUDA"})," NVIDIA · ",l.jsx(ze,{children:"ROCm"})," AMD · ",l.jsx(ze,{children:"Vulkan"})," herstellerübergreifend · ",l.jsx(ze,{children:"Metal"})," Apple"]})}),l.jsxs("p",{className:"pt-1",children:[l.jsx("strong",{children:"Begriffe, die immer wiederkommen:"})," Kontext (",l.jsx(ze,{children:"-c"}),"), Slots/Parallel, KV-Cache, Modell-TTL/Swap, ",l.jsx("strong",{children:"Speculative Decoding"})," (kleines Draft-Modell rät voraus → schneller)."]})]})]}),l.jsxs(Va,{children:["Deine Box hat eine AMD-APU (gfx1151). ",l.jsx("strong",{children:"Einschränkung & Trick:"})," dort schlägt ",l.jsx(ze,{children:"Vulkan/RADV"})," das offizielle ",l.jsx(ze,{children:"ROCm"})," bei Token-Generierung um ~12–22 % — darum läuft die Engine auf Vulkan.",l.jsx(ze,{children:"llama-swap"})," hält die Alltags-Hirne dauerwarm; ",l.jsx(ze,{children:"coder"})," nutzt Spec-Decoding."]})]}),l.jsxs(Rr,{id:"modelle",icon:lf,color:"text-sky-400",title:"4. Modell-Landschaft",kicker:"Stand Juni 2026",wide:!0,children:[l.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsx("p",{children:l.jsx("strong",{children:"Open-Weight (lokal nutzbar):"})}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Qwen"})," (Alibaba) — starke Allrounder + Coder + Vision, viele Größen/MoE."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Llama"})," (Meta), ",l.jsx("strong",{children:"Gemma"})," (Google), ",l.jsx("strong",{children:"Phi"})," (Microsoft) — solide Open-Familien."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"DeepSeek"}),", ",l.jsx("strong",{children:"Mistral/Mixtral"})," — kräftige MoE-/Reasoning-Modelle."]})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsx("p",{children:l.jsx("strong",{children:"Frontier (Cloud-API):"})}),l.jsx("ul",{className:"list-disc pl-4 space-y-1",children:l.jsxs("li",{children:[l.jsx("strong",{children:"Claude"})," (Anthropic), ",l.jsx("strong",{children:"GPT"})," (OpenAI), ",l.jsx("strong",{children:"Gemini"})," (Google) — die stärksten Allrounder, aber nicht lokal."]})}),l.jsxs("p",{className:"pt-1",children:[l.jsx("strong",{children:"Modellwahl nach Aufgabe:"})," schnelles Alltags-Hirn · großes Logik-Hirn für harte Tasks · dediziertes Code-Modell · multimodal für Bilder · Embedding-Modell fürs Gedächtnis."]})]})]}),l.jsx("p",{className:"text-[11px] italic",children:'Leaderboards (HF, LMArena) sind grobe Orientierung — der einzige Benchmark, der zählt, ist deine eigene Aufgabe. Vorsicht vor „Benchmaxxing".'}),l.jsxs(Va,{children:["Dein Line-up via llama-swap: ",l.jsx(ze,{children:"fast"})," (Alltag/Vision/MoE) · ",l.jsx(ze,{children:"heavy"})," (schwere Logik) ·",l.jsx(ze,{children:"coder"})," · ",l.jsx(ze,{children:"scout"})," · ",l.jsx(ze,{children:"vision"})," · ",l.jsx(ze,{children:"embed"})," (fürs Gedächtnis) ·",l.jsx(ze,{children:"hermes"})," (Agent-Hirn). Verwalten/tauschen im ",l.jsx("strong",{children:"Modell-Manager"}),"-Tab."]})]}),l.jsxs(Rr,{id:"gateway",icon:E4,color:"text-amber-400",title:"5. Der Gateway-Trick",kicker:"OpenAI-kompatibel = überall andocken",children:[l.jsxs("p",{children:["Fast jedes AI-Tool spricht heute das ",l.jsx("strong",{children:"OpenAI-Format"})," (",l.jsx(ze,{children:"/v1/chat/completions"}),"). Ein",l.jsx("strong",{children:" Gateway"})," davor gibt dir ",l.jsx("em",{children:"einen"})," Endpunkt für alles: zentrales Key-Management, Logging und transparentes ",l.jsx("strong",{children:"Routing"})," — der Client merkt nicht, welches Modell tatsächlich antwortet."]}),l.jsxs("p",{children:["Die ",l.jsx(ze,{children:"model:auto"}),'-Idee: du sagst „auto", das Gateway wählt das passende Modell je nach Anfrage und lädt es bei Bedarf.']}),l.jsxs(Va,{children:["Dein Gateway: ",l.jsx(ze,{children:"http://192.168.178.151:9001/v1"}),", Model ",l.jsx(ze,{children:"auto"}),", API-Key beliebig. Fertige Configs erzeugt dir der ",l.jsx("strong",{children:"Verbinden"}),"-Tab live — eine Wahrheit, kein Abtippen."]})]}),l.jsxs(Rr,{id:"mcp",icon:cf,color:"text-violet-400",title:"6. MCP — Werkzeuge für Agenten",kicker:"USB-C für AI-Tools",children:[l.jsxs("p",{children:["Das ",l.jsx("strong",{children:"Model Context Protocol"})," (offen, von Anthropic initiiert) standardisiert, wie ein AI-Client mit externen Tools & Datenquellen spricht. Ein ",l.jsx("strong",{children:"MCP-Server"})," bringt Fähigkeiten: Dateien, Web-Fetch, Git, Datenbanken, eigene APIs."]}),l.jsx("p",{children:"Statt für jeden Editor eigene Tools zu schreiben, bindet jeder MCP-fähige Agent denselben Server an."}),l.jsxs("div",{className:"flex items-start gap-1.5 rounded-xl border border-amber-500/25 bg-amber-500/[0.06] p-2.5 text-[11px]",children:[l.jsx(w4,{className:"h-3.5 w-3.5 text-amber-400 shrink-0 mt-0.5"}),l.jsxs("span",{children:[l.jsx("strong",{children:"Sicherheit:"})," ein MCP-Server hat echten Zugriff (Dateien, Shell). Nur vertrauenswürdige Server laufen lassen, Rechte minimal halten, Quelle prüfen."]})]})]}),l.jsxs(Rr,{id:"skills",icon:O4,color:"text-emerald-400",title:"7. Agent Skills",kicker:"Wiederverwendbare Fähigkeiten",children:[l.jsxs("p",{children:["Ein ",l.jsx("strong",{children:"Skill"})," ist ein Ordner mit einer ",l.jsx(ze,{children:"SKILL.md"})," (YAML-Kopf + Anleitung, optional Skripte/Beispiele), den der Agent für eine bestimmte Aufgabe lädt — z.B. TDD, Code-Vereinfachung, API-Design."]}),l.jsx("pre",{className:"p-2.5 bg-background/25 rounded-lg border border-border/30 font-mono text-[9px] text-foreground overflow-x-auto whitespace-pre",children:`--- +Frag immer nur eine Sache auf einmal und fass am Ende zusammen, was du dir gemerkt hast.`;function YO(){const[e,t]=y.useState(""),[r,n]=y.useState(""),[a,o]=y.useState(""),[c,u]=y.useState("knowledge"),[f,h]=y.useState(!1),[m,g]=y.useState(!1),[v,b]=y.useState("liste"),[j,k]=y.useState(!1),S=Yn(),{showAlert:N,showConfirm:E,dialogElement:A}=Aa(),{data:P=[]}=vv({}),{data:_=[],error:O}=vv({q:r,category:e}),{data:D}=MD(v==="graph"),U=O?String(O):"",B=()=>{S.invalidateQueries({queryKey:["memory"]}),S.invalidateQueries({queryKey:["memory-graph"]})},F=y.useMemo(()=>{const I=P.length,M=P.filter(K=>Z2.has(K.source)).length;return{total:I,auto:M,manual:I-M,cats:new Set(P.map(K=>K.category)).size}},[P]),Y=P.length===0,H=y.useMemo(()=>{const I=D??{nodes:[],edges:[]};if(!r.trim())return I;const M=r.toLowerCase(),K=I.nodes.filter(Z=>Z.content.toLowerCase().includes(M)),ne=new Set(K.map(Z=>Z.id));return{nodes:K,edges:I.edges.filter(Z=>ne.has(Z.source)&&ne.has(Z.target))}},[D,r]),pe=y.useMemo(()=>{const I={};return _.forEach(M=>{var K;(I[K=M.category]??(I[K]=[])).push(M)}),I},[_]),ue=y.useMemo(()=>_.filter(I=>!Qd.includes(I.category)),[_]);async function he(){a.trim()&&(await Se("/api/memory",{method:"POST",body:JSON.stringify({content:a,category:c,source:"ui"})}),o(""),k(!1),B())}function ae(I){E("Eintrag löschen?","Diesen Gedächtnis-Eintrag dauerhaft entfernen?",async()=>{try{await Se(`/api/memory/${I}`,{method:"DELETE"}),B()}catch(M){N("Fehler",`Löschen fehlgeschlagen: ${M.message||M}`)}})}async function se(){try{await navigator.clipboard.writeText(eN),g(!0),setTimeout(()=>g(!1),1800)}catch{N("Kopieren fehlgeschlagen","Markiere den Prompt und kopiere ihn manuell (Strg+C).")}}function X(){se(),window.dispatchEvent(new CustomEvent("mc-navigate",{detail:{view:"terminal"}}))}async function te(){h(!0);try{const I=await Se("/api/memory/dedupe",{method:"POST",body:JSON.stringify({apply:!1})});if(I.duplicate_count===0){N("Ergebnis","Keine Dubletten gefunden — alles sauber.");return}E("Deduplizierung bestätigen",`${I.duplicate_count} Dublette(n) in ${I.groups.length} Gruppe(n) gefunden. Entfernen?`,async()=>{try{await Se("/api/memory/dedupe",{method:"POST",body:JSON.stringify({apply:!0})}),B()}catch(M){N("Fehler",`Fehler beim Löschen: ${M.message}`)}})}catch(I){N("Fehler",`Fehler bei der Deduplizierung: ${I.message}`)}finally{h(!1)}}const J=({value:I,label:M,accent:K})=>l.jsxs("span",{className:ee("flex items-center gap-1.5 text-[11px] rounded-lg px-2.5 py-1 border",K==="auto"?"text-emerald-400 bg-emerald-500/[0.07] border-emerald-500/20":"text-muted-foreground bg-card/40 border-border/50"),children:[K==="auto"&&l.jsx(xs,{className:"h-3 w-3"}),l.jsx("b",{className:ee("font-semibold",K==="auto"?"":"text-foreground"),children:I})," ",M]});return l.jsxs("div",{className:"space-y-5",children:[l.jsxs("div",{className:"flex flex-col lg:flex-row lg:items-center justify-between gap-3",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Gedächtnis-Pool"}),l.jsx("p",{className:"text-sm text-muted-foreground",children:"Geteilte Konstitution — Hermes, IDEs & Gateway lesen und lernen hier per MCP."})]}),l.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[l.jsxs("div",{className:"relative",children:[l.jsx("input",{value:r,onChange:I=>n(I.target.value),"aria-label":"Gedächtnis durchsuchen",type:"search",placeholder:"Semantisch suchen…",className:"w-52 h-9 pl-8 pr-3 rounded-lg border border-border/60 bg-card/45 text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground"}),l.jsx(MN,{className:"absolute left-2.5 top-2.5 h-3.5 w-3.5 text-muted-foreground"})]}),l.jsxs("button",{onClick:()=>k(I=>!I),className:"h-9 px-3 rounded-lg bg-primary text-primary-foreground text-xs font-semibold hover:opacity-90 transition-all flex items-center gap-1.5 cursor-pointer shadow-md shadow-primary/10",children:[l.jsx(df,{className:"h-4 w-4"})," Eintrag"]}),l.jsx("div",{className:"flex items-center gap-1 p-1 bg-card/30 border border-border/40 rounded-lg",children:[["liste",b4,"Liste"],["graph",T4,"Graph"]].map(([I,M,K])=>l.jsxs("button",{onClick:()=>b(I),className:ee("flex h-7 px-2.5 items-center gap-1.5 text-[11px] font-semibold rounded-md transition-all cursor-pointer",v===I?"bg-primary text-primary-foreground":"text-muted-foreground hover:text-foreground"),children:[l.jsx(M,{className:"h-3.5 w-3.5"})," ",K]},I))}),l.jsx("button",{onClick:te,disabled:f,className:"flex h-9 w-9 items-center justify-center rounded-lg border border-border/60 bg-card hover:border-primary/50 transition-all cursor-pointer shadow-md disabled:opacity-50","aria-label":"Duplikate bereinigen",title:"Deduplizieren",children:l.jsx(xs,{className:"h-4 w-4 text-primary","aria-hidden":"true"})})]})]}),!Y&&l.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[l.jsx(J,{value:F.total,label:"Fakten"}),l.jsx(J,{value:F.auto,label:"auto gelernt",accent:"auto"}),l.jsx(J,{value:F.manual,label:"manuell"}),l.jsx(J,{value:F.cats,label:"Kategorien"}),l.jsxs("span",{className:"ml-auto text-[11px] text-muted-foreground/70 flex items-center gap-1.5",children:[l.jsx(xs,{className:"h-3 w-3 text-emerald-400"})," lernt automatisch aus Hermes-Gesprächen"]})]}),j&&l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-4 space-y-3",children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx("div",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Neuen Eintrag anlegen"}),l.jsx("button",{onClick:()=>k(!1),"aria-label":"Schließen",className:"text-muted-foreground hover:text-foreground",children:l.jsx(Wn,{className:"h-4 w-4","aria-hidden":"true"})})]}),l.jsx("textarea",{value:a,onChange:I=>o(I.target.value),rows:2,"aria-label":"Eintragstext",placeholder:"Eine Regel, Vorliebe oder einen stabilen Fakt über dich oder das Projekt…",className:"w-full resize-none rounded-xl border border-border/60 bg-background/30 p-3 text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground leading-relaxed"}),l.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[l.jsx("select",{value:c,onChange:I=>u(I.target.value),"aria-label":"Kategorie",className:"h-8 rounded-lg border border-border/60 bg-background/50 px-2 text-xs outline-none font-semibold text-foreground cursor-pointer",children:Qd.map(I=>{var M;return l.jsx("option",{value:I,className:"bg-popover text-foreground",children:((M=Wg[I])==null?void 0:M.label)||I},I)})}),l.jsxs("button",{onClick:he,className:"h-9 px-4 rounded-lg bg-primary text-primary-foreground text-xs font-semibold hover:opacity-90 transition-all flex items-center gap-1.5 cursor-pointer",children:[l.jsx(df,{className:"h-4 w-4"})," Speichern"]})]})]}),U&&l.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400",children:["Fehler: ",U]}),Y?l.jsxs("div",{className:"rounded-2xl border border-dashed border-border/60 bg-card/20 p-8 sm:p-10 flex flex-col items-center text-center gap-5",children:[l.jsx("div",{className:"h-14 w-14 rounded-2xl bg-primary/10 flex items-center justify-center",children:l.jsx(j4,{className:"h-7 w-7 text-primary"})}),l.jsxs("div",{className:"space-y-1.5 max-w-lg",children:[l.jsx("h3",{className:"text-base font-semibold text-foreground",children:"Lass Hermes dich kennenlernen"}),l.jsx("p",{className:"text-xs text-muted-foreground leading-relaxed",children:"Statt Fakten einzutippen: führ ein kurzes Onboarding-Gespräch mit Hermes. Was ihr besprecht, merkt sich das Gedächtnis automatisch — du musst nichts manuell pflegen."})]}),l.jsxs("div",{className:"w-full max-w-lg text-left",children:[l.jsxs("div",{className:"flex items-center justify-between mb-1.5",children:[l.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground/60",children:"Sende das an Hermes"}),l.jsx("button",{onClick:se,className:"flex items-center gap-1 text-[10px] font-semibold text-muted-foreground hover:text-foreground transition-colors",children:m?l.jsxs(l.Fragment,{children:[l.jsx(sr,{className:"h-3 w-3 text-emerald-400"})," Kopiert"]}):l.jsxs(l.Fragment,{children:[l.jsx(uv,{className:"h-3 w-3"})," Kopieren"]})})]}),l.jsx("pre",{className:"w-full rounded-xl border border-border/60 bg-background/40 p-3.5 text-[11px] leading-relaxed text-foreground/90 whitespace-pre-wrap font-mono",children:eN})]}),l.jsxs("div",{className:"flex flex-wrap items-center justify-center gap-2",children:[l.jsxs("button",{onClick:X,className:"h-9 px-4 rounded-lg bg-primary text-primary-foreground text-xs font-semibold hover:opacity-90 transition-all flex items-center gap-1.5 cursor-pointer",children:[l.jsx(TN,{className:"h-4 w-4"})," Im Terminal starten"]}),l.jsxs("button",{onClick:se,className:"h-9 px-4 rounded-lg border border-border/60 bg-card text-xs font-semibold hover:border-primary/50 transition-all flex items-center gap-1.5 cursor-pointer",children:[m?l.jsx(sr,{className:"h-4 w-4 text-emerald-400"}):l.jsx(uv,{className:"h-4 w-4"})," Prompt kopieren"]})]}),l.jsxs("p",{className:"text-[11px] text-muted-foreground/70 flex items-center gap-1.5",children:[l.jsx(I4,{className:"h-3 w-3"})," Funktioniert genauso über Telegram —"," ",l.jsx("button",{onClick:()=>k(!0),className:"underline hover:text-foreground",children:"oder lieber manuell anlegen"}),"."]})]}):v==="graph"?l.jsx(RX,{children:l.jsx(y.Suspense,{fallback:l.jsx("div",{className:"h-[480px] rounded-2xl border border-border/60 bg-card/30 flex items-center justify-center text-xs text-muted-foreground",children:"Graph wird geladen…"}),children:l.jsx(LX,{data:H,onDelete:ae})})}):l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"flex flex-wrap items-center gap-1.5 p-1 bg-card/30 border border-border/40 rounded-xl w-fit",children:[l.jsx("button",{onClick:()=>t(""),className:ee("h-7 px-3 rounded-lg text-[10px] font-semibold uppercase tracking-wider transition-all cursor-pointer",e?"text-muted-foreground hover:text-foreground":"bg-primary text-primary-foreground"),children:"Alle"}),Qd.map(I=>{const M=Wg[I]||J2,K=M.icon;return l.jsxs("button",{onClick:()=>t(I),className:ee("h-7 px-2.5 rounded-lg text-[10px] font-semibold uppercase tracking-wider transition-all cursor-pointer flex items-center gap-1",e===I?"bg-primary text-primary-foreground":"text-muted-foreground hover:text-foreground"),children:[l.jsx(K,{className:"h-3 w-3"})," ",M.label]},I)})]}),_.length===0?l.jsx("div",{className:"text-xs text-muted-foreground border border-dashed border-border/60 rounded-2xl p-12 text-center",children:"Keine Einträge für die aktuellen Filterkriterien gefunden."}):l.jsx("div",{className:"space-y-5",children:[...Qd,"__other"].map(I=>{const M=I==="__other"?ue:pe[I]||[];if(!M.length)return null;const K=Wg[I]||J2,ne=K.icon;return l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center gap-2 mb-2 px-1",children:[l.jsx(ne,{className:ee("h-3.5 w-3.5",K.text)}),l.jsx("span",{className:ee("text-[11px] font-bold uppercase tracking-wider",K.text),children:K.label}),l.jsx("span",{className:"text-[10px] font-mono text-muted-foreground/60 bg-card/50 rounded px-1.5 py-0.5",children:M.length}),l.jsx("div",{className:"ml-1 h-px flex-1 bg-border/30"})]}),l.jsx("div",{className:"space-y-2",children:M.map(Z=>{const me=Z2.has(Z.source);return l.jsxs("div",{className:ee("flex items-start justify-between gap-4 p-3.5 rounded-xl border border-l-4 bg-card/45 backdrop-blur-md border-border/60 hover:border-primary/20 transition-all group",$X[Z.category]||"border-l-muted"),children:[l.jsx("span",{className:"text-xs text-foreground leading-relaxed break-words whitespace-pre-wrap flex-1 min-w-0",children:Z.content}),l.jsxs("div",{className:"flex items-center gap-2 shrink-0",children:[typeof Z.score=="number"&&l.jsxs("span",{className:"text-[9px] font-mono text-primary bg-primary/10 px-1.5 py-0.5 rounded",title:"Relevanz der semantischen Suche",children:[Math.round(Z.score*100),"%"]}),l.jsxs("span",{className:ee("flex items-center gap-1 text-[9px] font-mono px-1.5 py-0.5 rounded",me?"text-emerald-400 bg-emerald-500/10":"text-muted-foreground/60 bg-background/20"),title:me?"Automatisch gelernt":"Manuell angelegt",children:[me&&l.jsx(xs,{className:"h-2.5 w-2.5"}),Z.source]}),l.jsx("button",{onClick:()=>ae(Z.id),"aria-label":"Eintrag löschen",title:"Eintrag löschen",className:"h-7 w-7 rounded-lg flex items-center justify-center border border-border/40 text-muted-foreground hover:text-red-400 hover:bg-red-500/5 transition-all opacity-0 group-hover:opacity-100",children:l.jsx(cv,{className:"h-3.5 w-3.5","aria-hidden":"true"})})]})]},Z.id)})})]},I)})})]}),A]})}const zX=["chat","coding","fast","heavy"];function XO(){const{data:e,error:t}=_y(5e3),{data:r}=Ni(),{showAlert:n,dialogElement:a}=Aa(),o=Yn(),c=t?String(t):"",[u,f]=y.useState(!1),h=(r==null?void 0:r.models)??[];async function m(v){try{await Se("/api/agent/brain",{method:"POST",body:JSON.stringify({model:v})}),n("Erledigt",`Hermes-Hirn zeigt jetzt auf das Alias '${v}'. Der Gateway-Dienst wurde neu gestartet.`),o.invalidateQueries({queryKey:Ve.agentStatus}),f(!1)}catch(b){n("Fehler",`Wechsel fehlgeschlagen: ${b.message||b}`)}}async function g(v){try{await Se("/api/agent/brain/set",{method:"POST",body:JSON.stringify({model_id:v})}),n("Erledigt","Agent-Hirn gewechselt (warm gehalten). Gateway wurde neugestartet."),o.invalidateQueries({queryKey:Ve.agentStatus}),o.invalidateQueries({queryKey:Ve.models}),f(!1)}catch(b){n("Fehler",`Wechsel fehlgeschlagen: ${b.message||b}`)}}return l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{className:"flex flex-col sm:flex-row justify-between sm:items-center gap-4",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Hermes Agenten-Cockpit"}),l.jsxs("p",{className:"text-sm text-muted-foreground",children:["Hermes ist ein autonomer Agent, der im Hintergrund der Box läuft (Port ",l.jsx("code",{children:":8642"}),") und seine eigene UI besitzt."]})]}),(e==null?void 0:e.terminal_url)&&l.jsxs("a",{href:Gs(e.terminal_url),target:"_blank",rel:"noopener",className:ee("flex h-9 px-4 items-center gap-1.5 text-xs font-semibold rounded-lg transition-all cursor-pointer shadow-md shrink-0 self-start",e.terminal_reachable?"bg-primary text-primary-foreground hover:opacity-90 shadow-primary/10":"border border-border/60 text-muted-foreground bg-background/20"),children:[l.jsx(Hs,{className:"h-4 w-4"}),l.jsx("span",{children:"Terminal öffnen"})]})]}),c&&l.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400 font-mono",children:["Status nicht lesbar (",c,")."]}),e&&l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10",children:[l.jsxs("div",{className:"mb-4 flex items-center gap-2",children:[l.jsx(wn,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("span",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"Agent-Fluss"})]}),l.jsxs("div",{className:"flex flex-col lg:flex-row lg:items-stretch gap-3",children:[l.jsxs("button",{onClick:()=>e.terminal_reachable&&window.open(Gs(e.terminal_url),"_blank"),title:e.terminal_reachable?"Hermes-Terminal öffnen":"Terminal offline",className:"lg:w-40 shrink-0 rounded-xl border border-border/60 bg-background/30 p-3 text-left hover:border-primary/40 transition-all cursor-pointer flex flex-col justify-center",children:[l.jsxs("div",{className:"flex items-center gap-1.5",children:[l.jsx(uh,{className:ee("h-3.5 w-3.5",e.terminal_reachable?"text-emerald-400":"text-amber-500")}),l.jsx("span",{className:"text-xs font-semibold text-foreground",children:"Terminal"}),l.jsx("span",{className:ee("ml-auto h-1.5 w-1.5 rounded-full animate-pulse",e.terminal_reachable?"bg-emerald-500":"bg-amber-500")})]}),l.jsx("span",{className:"text-[10px] text-muted-foreground font-mono mt-0.5",children:"hermes chat · Clients"})]}),l.jsx("div",{className:"hidden lg:flex items-center text-muted-foreground text-lg select-none",children:"→"}),l.jsxs("div",{className:"flex-1 flex flex-col gap-2.5",children:[l.jsxs("div",{className:"rounded-xl border border-primary/40 bg-primary/5 px-3.5 py-2.5 flex items-center gap-2",children:[l.jsx(wn,{className:"h-3.5 w-3.5 text-primary"}),l.jsx("span",{className:"text-xs font-semibold text-primary",children:"Agent Gateway"}),l.jsx("span",{className:"text-[11px] font-mono text-muted-foreground",children:":8642"}),l.jsxs("span",{className:ee("ml-auto inline-flex items-center gap-1.5 text-[10px] font-bold uppercase font-mono px-2 py-0.5 rounded-full border",e.gateway_reachable?"bg-emerald-500/10 text-emerald-400 border-emerald-500/20":"bg-red-500/10 text-red-400 border-red-500/20"),children:[l.jsx("span",{className:ee("h-1.5 w-1.5 rounded-full",e.gateway_reachable?"bg-emerald-500 animate-pulse":"bg-red-500")}),e.gateway_reachable?"online":"offline"]})]}),l.jsxs("div",{className:"grid gap-2.5 sm:grid-cols-3",children:[l.jsxs("button",{onClick:()=>f(!0),className:"rounded-xl border border-border/60 bg-background/30 p-3 text-left hover:border-primary/45 transition-all cursor-pointer",children:[l.jsxs("div",{className:"flex items-center gap-1.5 text-muted-foreground",children:[l.jsx(Hn,{className:"h-3.5 w-3.5 text-primary"}),l.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider",children:"Hirn"}),l.jsx("span",{className:"ml-auto text-[9px] text-primary/70 font-bold uppercase",children:"wechseln →"})]}),l.jsx("div",{className:"text-[11px] font-mono font-medium text-foreground truncate mt-1",title:e.brain_model,children:e.brain_model||"chat"})]}),l.jsxs("div",{className:"rounded-xl border border-border/60 bg-background/30 p-3",children:[l.jsxs("div",{className:"flex items-center gap-1.5 text-muted-foreground",children:[l.jsx(Qu,{className:"h-3.5 w-3.5 text-primary"}),l.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider",children:"Verdrahtung"})]}),l.jsxs("div",{className:"text-[10px] font-mono mt-1 flex flex-wrap gap-x-2 text-muted-foreground",children:[l.jsxs("span",{children:["Config: ",e.has_config?"✓":"—"]}),l.jsxs("span",{children:["Skills: ",e.has_skills?"✓":"—"]}),l.jsxs("span",{children:["Memory: ",e.has_memories?"✓":"—"]})]})]}),l.jsxs("div",{className:"rounded-xl border border-border/60 bg-background/30 p-3",children:[l.jsxs("div",{className:"flex items-center gap-1.5 text-muted-foreground",children:[l.jsx(gw,{className:"h-3.5 w-3.5 text-primary"}),l.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider",children:"PC"}),l.jsx("span",{className:ee("ml-auto h-1.5 w-1.5 rounded-full",e.pc_executor_reachable?"bg-emerald-500 animate-pulse":"bg-amber-500")})]}),l.jsxs("div",{className:ee("text-[11px] font-mono mt-1",e.pc_executor_reachable?"text-emerald-400":"text-muted-foreground"),children:[":7777 ",e.pc_executor_reachable?"verbunden":"offline"]})]})]})]})]})]}),l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 space-y-4 shadow-lg shadow-black/10",children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(gw,{className:"h-5 w-5 text-primary"}),l.jsx("h3",{className:"text-sm font-bold uppercase tracking-wider text-foreground",children:"PC Verbindung"})]}),l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx("span",{className:ee("h-2 w-2 rounded-full",e.pc_executor_reachable?"bg-emerald-500 animate-pulse":"bg-amber-500")}),l.jsx("span",{className:"text-xs font-semibold text-foreground",children:e.pc_executor_reachable?"Erreichbar":"Nicht verbunden"})]})]}),l.jsxs("div",{className:"grid gap-6 md:grid-cols-2 text-xs text-muted-foreground leading-relaxed text-left",children:[l.jsxs("div",{className:"space-y-3",children:[l.jsxs("p",{children:["Der ",l.jsx("strong",{className:"text-foreground",children:"Hermes PC Executor"})," läuft auf ",l.jsx("code",{className:"text-foreground font-mono px-1 py-0.5 rounded bg-muted/40 border border-border/30",children:"192.168.178.98:7777"})," und ermöglicht Hermes den direkten Zugriff auf deinen Windows-PC — Shell-Befehle, Screenshots, Tastatureingaben."]}),l.jsxs("p",{children:["Hermes erreicht den PC über den MCP-Server ",l.jsx("code",{className:"text-foreground font-mono px-1 py-0.5 rounded bg-muted/40 border border-border/30",children:"hermes-pc-control"}),", der automatisch beim Gateway-Start verbunden wird."]})]}),l.jsx("div",{className:"space-y-3",children:e.pc_executor_reachable?l.jsxs("div",{className:"p-3.5 bg-emerald-500/5 border border-emerald-500/20 rounded-xl space-y-1",children:[l.jsxs("div",{className:"text-emerald-400 font-semibold text-xs flex items-center gap-1.5",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"}),"PC Executor verbunden"]}),l.jsxs("p",{className:"text-[10px]",children:["Hermes kann jetzt per Telegram oder Terminal Befehle auf TobisNicerPC ausführen. Nutze ",l.jsx("code",{className:"text-foreground",children:"pc_shell"}),", ",l.jsx("code",{className:"text-foreground",children:"pc_screenshot"})," oder ",l.jsx("code",{className:"text-foreground",children:"pc_open"}),"."]})]}):l.jsxs("div",{className:"space-y-2",children:[l.jsx("h4",{className:"text-xs font-bold text-foreground",children:"PC Executor starten"}),l.jsxs("p",{children:["Starte ",l.jsx("code",{className:"text-foreground font-mono",children:"start.bat"})," im Ordner ",l.jsx("code",{className:"text-foreground font-mono",children:"client\\hermes-pc\\"})," auf dem Windows-PC und lasse das Fenster offen."]}),l.jsx("div",{className:"p-3 bg-background/25 rounded-xl border border-border/30 font-mono text-[9px] text-cyan-300",children:"client\\hermes-pc\\start.bat"})]})})]})]}),!e.gateway_reachable&&l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 space-y-4 shadow-lg shadow-black/10 text-left",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(ks,{className:"h-5 w-5 text-amber-500"}),l.jsx("h3",{className:"text-sm font-bold uppercase tracking-wider text-foreground",children:"Hermes-Agent Diagnostics"})]}),l.jsxs("div",{className:"text-xs text-muted-foreground space-y-3 leading-relaxed",children:[l.jsx("p",{children:"Der Hermes-Dienst ist auf der Box derzeit offline oder kann sich nicht mit dem lokalen llama-swap verbinden."}),l.jsxs("p",{children:["Stelle sicher, dass die systemd-Dienste auf der Box laufen. Du kannst den Status im ",l.jsx("strong",{children:"OS & Updates Drawer"})," prüfen und die Dienste bei Bedarf neu starten."]}),l.jsxs("div",{className:"p-3.5 bg-background/25 rounded-xl border border-border/30 font-mono text-[10px] space-y-1",children:[l.jsx("div",{className:"text-muted-foreground/60",children:"# Dienste manuell auf der Box prüfen:"}),l.jsx("div",{className:"text-primary",children:"systemctl --user status hermes-gateway"}),l.jsx("div",{className:"text-primary",children:"systemctl --user status hermes-terminal"})]}),l.jsxs("p",{children:["Weitere Einrichtungsdetails (Brain-Konfiguration, MCP-Kopplungen, SSH-Tunneling und Such-Engines) findest du in der Dokumentationsdatei:",l.jsx("code",{className:"ml-1 px-1.5 py-0.5 rounded bg-muted/40 text-foreground border border-border/30",children:"docs/HERMES_SETUP.md"}),"."]})]})]})]}),e&&u&&l.jsx("div",{className:"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm flex items-center justify-center p-4 overscroll-contain",role:"dialog","aria-modal":"true","aria-label":"Hermes-Hirn konfigurieren",children:l.jsxs("div",{className:"w-full max-w-md rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[l.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[l.jsxs("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary flex items-center gap-1.5",children:[l.jsx(Hn,{className:"h-4 w-4"}),l.jsx("span",{children:"Hermes-Hirn konfigurieren"})]}),l.jsx("button",{onClick:()=>f(!1),className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:l.jsx(Wn,{className:"h-4 w-4"})})]}),l.jsxs("div",{className:"space-y-1.5",children:[l.jsx("div",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground",children:"Lane / Gateway-Alias"}),l.jsx("div",{className:"flex flex-wrap gap-1.5",children:zX.map(v=>{const b=e.brain_model===v;return l.jsxs("button",{onClick:()=>m(v),className:ee("px-3 py-1.5 rounded-lg text-xs font-mono font-semibold border transition-all cursor-pointer flex items-center gap-1.5",b?"border-primary/40 bg-primary/10 text-primary":"border-border/30 bg-background/20 text-foreground hover:bg-accent"),children:[v,b&&l.jsx(sr,{className:"h-3.5 w-3.5"})]},v)})}),l.jsxs("p",{className:"text-[10px] text-muted-foreground/70",children:["Schlank & flexibel: das Hirn folgt dem Lane-Routing (z.B. ",l.jsx("code",{className:"text-primary",children:"chat"})," = fast↔heavy)."]})]}),l.jsxs("div",{className:"space-y-1.5",children:[l.jsx("div",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground",children:"Installiertes Modell (warm gehalten)"}),l.jsx("div",{className:"space-y-1.5 max-h-56 overflow-y-auto pr-1",children:h.map(v=>{var j;const b=v.role==="hermes";return l.jsxs("button",{onClick:()=>!b&&g(v.name),disabled:b||v.incomplete,className:ee("w-full text-left px-3 py-2.5 rounded-lg text-xs flex items-center justify-between font-mono border transition-all",b?"border-indigo-500/40 bg-indigo-500/10 text-indigo-300":v.incomplete?"border-border/20 bg-background/10 text-muted-foreground/50 cursor-not-allowed":"border-border/30 bg-background/20 text-foreground hover:bg-accent cursor-pointer"),children:[l.jsxs("div",{className:"flex flex-col min-w-0",children:[l.jsx("span",{className:"font-semibold truncate max-w-[280px]",children:(j=v.name.split("/").pop())==null?void 0:j.replace(/\.gguf$/i,"")}),l.jsxs("span",{className:"text-[9px] text-muted-foreground mt-0.5",children:[v.capabilities.params_b?`${v.capabilities.params_b}B`:"?"," · ",v.capabilities.tools!=="no"?"Tools ✓":"ohne Tools",v.role&&` · Rolle: ${v.role}`]})]}),b?l.jsxs("span",{className:"text-[9px] font-bold uppercase text-indigo-300 shrink-0 flex items-center gap-1",children:[l.jsx(sr,{className:"h-3.5 w-3.5"})," Aktiv"]}):l.jsx("span",{className:"text-[9px] font-bold uppercase text-primary/70 shrink-0",children:"Warm setzen →"})]},v.name)})})]}),l.jsxs("div",{className:"text-[10px] text-amber-400/80 flex items-start gap-1.5 border-t border-border/20 pt-2.5",children:[l.jsx("span",{children:"💡"}),l.jsxs("span",{children:["Für einen ",l.jsx("strong",{children:"Agenten"}),' sind Hermes-Modelle (natives Tool-Calling) meist die robustere Wahl. Neues Modell? Erst über „Modell-Manager → Modelle finden" laden.']})]})]})}),a]})}function FX(){const{data:e}=_y(5e3),t=e!=null&&e.terminal_url?Gs(e.terminal_url):void 0,r=e==null?void 0:e.terminal_reachable;return l.jsxs("div",{className:"flex h-full flex-col gap-4",children:[l.jsxs("div",{className:"flex flex-wrap items-end justify-between gap-3",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text font-space text-2xl font-bold tracking-tight text-transparent",children:"Hermes Terminal"}),l.jsxs("p",{className:"flex items-center gap-2 text-sm text-muted-foreground",children:["Interaktiver Agent (",l.jsx("code",{className:"rounded bg-background/40 px-1 font-mono text-[11px] text-primary",children:"hermes chat"}),') mit Tools & PC-Steuerung — „mehr als Chatten".']})]}),l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsxs("span",{className:"flex items-center gap-1.5 text-[11px] font-medium text-muted-foreground",children:[l.jsx("span",{className:`h-2 w-2 rounded-full ${r?"bg-emerald-500 animate-pulse":"bg-amber-500"}`}),r?"online":"offline"]}),t&&l.jsxs("a",{href:t,target:"_blank",rel:"noopener",className:"flex h-8 items-center gap-1.5 rounded-lg border border-border/60 bg-background/20 px-3 text-xs font-semibold text-muted-foreground transition-all hover:border-primary/50 hover:text-foreground",children:[l.jsx(Hs,{className:"h-3.5 w-3.5"})," In neuem Tab"]})]})]}),t?l.jsxs("div",{className:"relative min-h-[68vh] flex-1 overflow-hidden rounded-2xl border border-border/60 bg-black/50 shadow-lg shadow-black/25",children:[r===!1&&l.jsxs("div",{className:"absolute inset-0 z-10 flex flex-col items-center justify-center gap-3 bg-black/70 text-center",children:[l.jsx(bi,{className:"h-8 w-8 text-amber-400"}),l.jsx("div",{className:"text-sm font-semibold text-amber-300",children:"Terminal nicht erreichbar"}),l.jsxs("p",{className:"max-w-sm text-[11px] leading-normal text-muted-foreground",children:["Der ",l.jsx("code",{className:"font-mono text-primary",children:"hermes-terminal"}),"-Dienst (ttyd) läuft nicht. Auf der Box: ",l.jsx("code",{className:"font-mono",children:"systemctl --user restart hermes-terminal"}),"."]})]}),l.jsx("iframe",{src:t,title:"Hermes Terminal",className:"h-full w-full border-0",style:{minHeight:"68vh"}})]}):l.jsxs("div",{className:"flex min-h-[68vh] flex-1 items-center justify-center rounded-2xl border border-border/60 bg-background/20 text-xs text-muted-foreground",children:[l.jsx(IN,{className:"mr-2 h-4 w-4"})," Lade Terminal…"]})]})}const tN=[{id:"grundlagen",label:"Grundlagen"},{id:"moe",label:"MoE & Quant"},{id:"lokal",label:"Lokal betreiben"},{id:"modelle",label:"Modell-Landschaft"},{id:"gateway",label:"Gateway-Trick"},{id:"mcp",label:"MCP"},{id:"skills",label:"Skills"},{id:"memory",label:"Gedächtnis & RAG"},{id:"agents",label:"Agenten"},{id:"ide",label:"IDE anbinden"},{id:"tricks",label:"Tricks & Kniffe"},{id:"wartung",label:"Sicherheit & Wartung"},{id:"ressourcen",label:"Ressourcen"},{id:"troubleshooting",label:"Troubleshooting"}];function BX(e){var t;(t=document.getElementById(e))==null||t.scrollIntoView({behavior:"smooth",block:"start"})}function Rr({id:e,icon:t,color:r,title:n,kicker:a,children:o,wide:c}){return l.jsxs("section",{id:e,className:ee("scroll-mt-20 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 shadow-lg shadow-black/10 space-y-3",c&&"md:col-span-2"),children:[l.jsxs("div",{className:"flex items-center gap-2.5 border-b border-border/20 pb-3",children:[l.jsx(t,{className:ee("h-5 w-5 shrink-0",r)}),l.jsxs("div",{children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:n}),a&&l.jsx("span",{className:ee("text-[9px] font-mono",r),children:a})]})]}),l.jsx("div",{className:"text-xs text-muted-foreground space-y-2.5 leading-relaxed",children:o})]})}function Va({children:e}){return l.jsxs("div",{className:"mt-1 rounded-xl border border-primary/25 bg-primary/[0.06] p-3 text-[11px] leading-relaxed",children:[l.jsxs("div",{className:"flex items-center gap-1.5 font-bold text-primary mb-1",children:[l.jsx(xs,{className:"h-3 w-3"})," Bei dir konkret"]}),l.jsx("div",{className:"text-muted-foreground space-y-1",children:e})]})}function ze({children:e}){return l.jsx("code",{className:"rounded bg-background/40 border border-border/30 px-1.5 py-0.5 font-mono text-[10px] text-foreground",children:e})}function kt({href:e,name:t,note:r}){return l.jsxs("li",{className:"leading-relaxed",children:[l.jsxs("a",{href:e,target:"_blank",rel:"noopener",className:"text-primary hover:underline font-semibold inline-flex items-center gap-0.5",children:[t,l.jsx(G3,{className:"h-3 w-3 opacity-60"})]}),l.jsxs("span",{className:"text-muted-foreground",children:[" — ",r]})]})}function UX(){const[e,t]=y.useState(!1);return l.jsxs("div",{className:"space-y-7",children:[l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 shadow-lg shadow-black/10 flex items-start gap-4",children:[l.jsx("div",{className:"h-11 w-11 rounded-xl bg-primary/15 flex items-center justify-center shrink-0",children:l.jsx(sv,{className:"h-6 w-6 text-primary"})}),l.jsxs("div",{className:"space-y-1",children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Die AI-Bibel"}),l.jsxs("p",{className:"text-sm text-muted-foreground leading-relaxed max-w-2xl",children:["Allgemeines Nachschlagewerk für lokale & agentische AI — Konzepte, Tricks, Kniffe und kuratierte Quellen. ",l.jsx("span",{className:"font-semibold text-foreground",children:"Stand Juni 2026."})," ","Das meiste gilt überall; ",l.jsx("span",{className:"text-primary font-semibold",children:'„Bei dir konkret"'}),"-Kästen zeigen, was dein Stack daraus macht."]})]})]}),l.jsx("div",{className:"sticky top-0 z-10 -mx-1 px-1",children:l.jsx("div",{className:"rounded-xl border border-border/50 bg-card/70 backdrop-blur-xl p-2 shadow-lg shadow-black/20",children:l.jsxs("div",{className:"flex items-center gap-1.5 flex-wrap",children:[l.jsx(lv,{className:"h-3.5 w-3.5 text-primary ml-1 mr-0.5 shrink-0"}),(e?tN:tN.slice(0,9)).map(r=>l.jsx("button",{onClick:()=>BX(r.id),className:"rounded-lg px-2.5 py-1 text-[11px] font-semibold text-muted-foreground hover:text-primary hover:bg-primary/10 transition-colors cursor-pointer",children:r.label},r.id)),l.jsx("button",{onClick:()=>t(r=>!r),className:"rounded-lg px-2 py-1 text-[11px] font-semibold text-primary hover:bg-primary/10 transition-colors cursor-pointer",children:e?"weniger":"+ mehr"})]})})}),l.jsxs("div",{className:"grid gap-5 md:grid-cols-2",children:[l.jsxs(Rr,{id:"grundlagen",icon:Hn,color:"text-cyan-400",title:"1. Wie LLMs ticken",kicker:"Grundlagen",children:[l.jsxs("p",{children:["Ein LLM ist im Kern ein ",l.jsx("strong",{children:"Wahrscheinlichkeits-Rechner für das nächste Token"}),' (Wortteil). Es „weiß" nichts — es setzt fort, was statistisch am plausibelsten ist. Daraus folgt fast alles andere.']}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Tokens"})," sind die Einheit — ~¾ Wort. Ein- und Ausgabe werden in Tokens gezählt."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Kontextfenster"}),' = wie viele Tokens das Modell gleichzeitig „sehen" kann (Prompt + Antwort). Voll = Anfang fällt raus.']}),l.jsxs("li",{children:[l.jsx("strong",{children:"Parameter"})," = die trainierten Gewichte. Training ist einmalig, ",l.jsx("strong",{children:"Inferenz"})," ist jede Antwort."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Temperatur / Sampling"})," steuert Zufall: niedrig = deterministisch/präzise (Code), hoch = kreativ."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Halluzination"})," ist kein Bug, sondern die Kehrseite des Ratens. Gegenmittel: Grounding via Tools/RAG, Verifikation."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Reasoning-/Thinking-Modelle"}),' „denken" in unsichtbaren Tokens vor der Antwort — besser bei Logik, langsamer/teurer.']})]})]}),l.jsxs(Rr,{id:"moe",icon:jy,color:"text-violet-400",title:"2. MoE & Quantisierung",kicker:"Mehr Modell, weniger Last",children:[l.jsxs("p",{children:[l.jsx("strong",{children:"Mixture of Experts (MoE):"})," Statt für jedes Token das ganze Netz zu aktivieren, wählt ein",l.jsx("em",{children:" Router"})," nur ein paar spezialisierte ",l.jsx("em",{children:"Experts"}),' aus. So läuft ein 100B-Modell mit der aktiven Rechenlast eines viel kleineren (z.B. „122B total / 10B aktiv").']}),l.jsxs("p",{children:[l.jsx("strong",{children:"Quantisierung:"})," Gewichte von FP16 auf weniger Bits eindampfen — kleiner & schneller bei minimalem Qualitätsverlust. Faustregel:"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx(ze,{children:"Q8"})," nahezu verlustfrei, größter Footprint"]}),l.jsxs("li",{children:[l.jsx(ze,{children:"Q6_K"})," sehr gut, guter Mittelweg"]}),l.jsxs("li",{children:[l.jsx(ze,{children:"Q4_K_M"})," der Sweet-Spot für lokal — viel Modell pro GB"]})]}),l.jsxs(Va,{children:["VRAM/RAM ist die harte Grenze — ",l.jsx("strong",{children:"darum"})," ist beides hier zentral: MoE lässt 100B+ überhaupt laufen, Quant entscheidet, was reinpasst. Dein Line-up fährt durchweg ",l.jsx(ze,{children:"Q4_K_M"}),"/",l.jsx(ze,{children:"Q6_K"}),"."]})]}),l.jsxs(Rr,{id:"lokal",icon:ff,color:"text-emerald-400",title:"3. Lokal betreiben: Engines & Backends",kicker:"llama.cpp, vLLM & Co.",wide:!0,children:[l.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:[l.jsx("strong",{children:"Inference-Engines"})," — was die Modelle ausführt:"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"llama.cpp / GGUF"})," — der De-facto-Standard für lokal, CPU+GPU, läuft überall."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Ollama / LM Studio"})," — bequeme Wrapper mit One-Click-Downloads (LM Studio mit GUI)."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"vLLM / TGI"})," — Server-Engines für maximalen Durchsatz auf dicken GPUs."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"llama-swap"})," — Proxy, der ",l.jsx("em",{children:"mehrere"})," Modelle hinter ",l.jsx("em",{children:"einem"})," Port hält und je nach Anfrage automatisch ein-/aussattelt."]})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:[l.jsx("strong",{children:"GPU-Backends"})," — wie gerechnet wird:"]}),l.jsx("ul",{className:"list-disc pl-4 space-y-1",children:l.jsxs("li",{children:[l.jsx(ze,{children:"CUDA"})," NVIDIA · ",l.jsx(ze,{children:"ROCm"})," AMD · ",l.jsx(ze,{children:"Vulkan"})," herstellerübergreifend · ",l.jsx(ze,{children:"Metal"})," Apple"]})}),l.jsxs("p",{className:"pt-1",children:[l.jsx("strong",{children:"Begriffe, die immer wiederkommen:"})," Kontext (",l.jsx(ze,{children:"-c"}),"), Slots/Parallel, KV-Cache, Modell-TTL/Swap, ",l.jsx("strong",{children:"Speculative Decoding"})," (kleines Draft-Modell rät voraus → schneller)."]})]})]}),l.jsxs(Va,{children:["Deine Box hat eine AMD-APU (gfx1151). ",l.jsx("strong",{children:"Einschränkung & Trick:"})," dort schlägt ",l.jsx(ze,{children:"Vulkan/RADV"})," das offizielle ",l.jsx(ze,{children:"ROCm"})," bei Token-Generierung um ~12–22 % — darum läuft die Engine auf Vulkan.",l.jsx(ze,{children:"llama-swap"})," hält die Alltags-Hirne dauerwarm; ",l.jsx(ze,{children:"coder"})," nutzt Spec-Decoding."]})]}),l.jsxs(Rr,{id:"modelle",icon:lf,color:"text-sky-400",title:"4. Modell-Landschaft",kicker:"Stand Juni 2026",wide:!0,children:[l.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsx("p",{children:l.jsx("strong",{children:"Open-Weight (lokal nutzbar):"})}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Qwen"})," (Alibaba) — starke Allrounder + Coder + Vision, viele Größen/MoE."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Llama"})," (Meta), ",l.jsx("strong",{children:"Gemma"})," (Google), ",l.jsx("strong",{children:"Phi"})," (Microsoft) — solide Open-Familien."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"DeepSeek"}),", ",l.jsx("strong",{children:"Mistral/Mixtral"})," — kräftige MoE-/Reasoning-Modelle."]})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsx("p",{children:l.jsx("strong",{children:"Frontier (Cloud-API):"})}),l.jsx("ul",{className:"list-disc pl-4 space-y-1",children:l.jsxs("li",{children:[l.jsx("strong",{children:"Claude"})," (Anthropic), ",l.jsx("strong",{children:"GPT"})," (OpenAI), ",l.jsx("strong",{children:"Gemini"})," (Google) — die stärksten Allrounder, aber nicht lokal."]})}),l.jsxs("p",{className:"pt-1",children:[l.jsx("strong",{children:"Modellwahl nach Aufgabe:"})," schnelles Alltags-Hirn · großes Logik-Hirn für harte Tasks · dediziertes Code-Modell · multimodal für Bilder · Embedding-Modell fürs Gedächtnis."]})]})]}),l.jsx("p",{className:"text-[11px] italic",children:'Leaderboards (HF, LMArena) sind grobe Orientierung — der einzige Benchmark, der zählt, ist deine eigene Aufgabe. Vorsicht vor „Benchmaxxing".'}),l.jsxs(Va,{children:["Dein Line-up via llama-swap: ",l.jsx(ze,{children:"fast"})," (Alltag/Vision/MoE) · ",l.jsx(ze,{children:"heavy"})," (schwere Logik) ·",l.jsx(ze,{children:"coder"})," · ",l.jsx(ze,{children:"scout"})," · ",l.jsx(ze,{children:"vision"})," · ",l.jsx(ze,{children:"embed"})," (fürs Gedächtnis) ·",l.jsx(ze,{children:"hermes"})," (Agent-Hirn). Verwalten/tauschen im ",l.jsx("strong",{children:"Modell-Manager"}),"-Tab."]})]}),l.jsxs(Rr,{id:"gateway",icon:E4,color:"text-amber-400",title:"5. Der Gateway-Trick",kicker:"OpenAI-kompatibel = überall andocken",children:[l.jsxs("p",{children:["Fast jedes AI-Tool spricht heute das ",l.jsx("strong",{children:"OpenAI-Format"})," (",l.jsx(ze,{children:"/v1/chat/completions"}),"). Ein",l.jsx("strong",{children:" Gateway"})," davor gibt dir ",l.jsx("em",{children:"einen"})," Endpunkt für alles: zentrales Key-Management, Logging und transparentes ",l.jsx("strong",{children:"Routing"})," — der Client merkt nicht, welches Modell tatsächlich antwortet."]}),l.jsxs("p",{children:["Die ",l.jsx(ze,{children:"model:auto"}),'-Idee: du sagst „auto", das Gateway wählt das passende Modell je nach Anfrage und lädt es bei Bedarf.']}),l.jsxs(Va,{children:["Dein Gateway: ",l.jsx(ze,{children:"http://192.168.178.151:9001/v1"}),", Model ",l.jsx(ze,{children:"auto"}),", API-Key beliebig. Fertige Configs erzeugt dir der ",l.jsx("strong",{children:"Verbinden"}),"-Tab live — eine Wahrheit, kein Abtippen."]})]}),l.jsxs(Rr,{id:"mcp",icon:cf,color:"text-violet-400",title:"6. MCP — Werkzeuge für Agenten",kicker:"USB-C für AI-Tools",children:[l.jsxs("p",{children:["Das ",l.jsx("strong",{children:"Model Context Protocol"})," (offen, von Anthropic initiiert) standardisiert, wie ein AI-Client mit externen Tools & Datenquellen spricht. Ein ",l.jsx("strong",{children:"MCP-Server"})," bringt Fähigkeiten: Dateien, Web-Fetch, Git, Datenbanken, eigene APIs."]}),l.jsx("p",{children:"Statt für jeden Editor eigene Tools zu schreiben, bindet jeder MCP-fähige Agent denselben Server an."}),l.jsxs("div",{className:"flex items-start gap-1.5 rounded-xl border border-amber-500/25 bg-amber-500/[0.06] p-2.5 text-[11px]",children:[l.jsx(w4,{className:"h-3.5 w-3.5 text-amber-400 shrink-0 mt-0.5"}),l.jsxs("span",{children:[l.jsx("strong",{children:"Sicherheit:"})," ein MCP-Server hat echten Zugriff (Dateien, Shell). Nur vertrauenswürdige Server laufen lassen, Rechte minimal halten, Quelle prüfen."]})]})]}),l.jsxs(Rr,{id:"skills",icon:O4,color:"text-emerald-400",title:"7. Agent Skills",kicker:"Wiederverwendbare Fähigkeiten",children:[l.jsxs("p",{children:["Ein ",l.jsx("strong",{children:"Skill"})," ist ein Ordner mit einer ",l.jsx(ze,{children:"SKILL.md"})," (YAML-Kopf + Anleitung, optional Skripte/Beispiele), den der Agent für eine bestimmte Aufgabe lädt — z.B. TDD, Code-Vereinfachung, API-Design."]}),l.jsx("pre",{className:"p-2.5 bg-background/25 rounded-lg border border-border/30 font-mono text-[9px] text-foreground overflow-x-auto whitespace-pre",children:`--- name: tdd-pro description: Treibt Entwicklung mit strikter TDD-Praxis --- # Instructions -...`}),l.jsxs("p",{children:["Suchen & installieren über die ",l.jsx("strong",{children:"skills.sh"}),"-Registry: ",l.jsx(ze,{children:"npx skills find"})," /",l.jsx(ze,{children:"npx skills add owner/repo"}),". Skills liegen projektweit (vom Agent beim Start gelesen) oder global."]})]}),l.jsxs(Rr,{id:"memory",icon:s4,color:"text-indigo-400",title:"8. Gedächtnis & RAG",kicker:"Modelle vergessen — du nicht",wide:!0,children:[l.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:["LLMs sind ",l.jsx("strong",{children:"zustandslos"}),": ohne Hilfe weiß das Modell beim nächsten Turn nichts mehr. Gedächtnis lebt extern."]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Embeddings"})," wandeln Text in Vektoren; ein ",l.jsx("strong",{children:"Vektor-Store"})," (Chroma, …) findet semantisch Ähnliches."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"RAG"})," = relevante Fakten vor dem Turn heraussuchen und einblenden statt alles im Prompt zu halten."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Long-Context vs. RAG:"}),' riesige Fenster sind bequem, aber teuer & „lost in the middle" — gezieltes Abrufen skaliert besser.']})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:[l.jsx("strong",{children:"Auto-lernendes Gedächtnis"})," ist die nächste Stufe:"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:["extrahiert Fakten ",l.jsx("em",{children:"selbst"})," aus Gesprächen, statt nur abzuspeichern"]}),l.jsx("li",{children:"dedupliziert semantisch (kein 10× derselbe Fakt)"}),l.jsxs("li",{children:[l.jsx("strong",{children:"Graph-Sicht"})," = Fakten ",l.jsx("em",{children:"plus"})," ihre Beziehungen, nicht nur eine flache Liste"]})]})]})]}),l.jsxs(Va,{children:["Dein Gedächtnis (Tab ",l.jsx("strong",{children:"Gedächtnis"}),") ist ",l.jsx("strong",{children:"Mem0"}),"-basiert: auto-lernend & semantisch, ",l.jsx("strong",{children:"graph-first"})," dargestellt, mit 4-Typen-Taxonomie (",l.jsx(ze,{children:"Identität"})," · ",l.jsx(ze,{children:"Wissen"})," · ",l.jsx(ze,{children:"Regeln"})," · ",l.jsx(ze,{children:"Ereignisse"}),"). Einstieg über ein kurzes ",l.jsx("strong",{children:"Hermes-Onboarding-Gespräch"})," im Terminal — der Agent lernt im Hintergrund nach jedem Turn.",l.jsx("br",{}),l.jsx("strong",{children:"Gotcha:"})," ein gelöschter Fakt kann wieder auftauchen, solange die Original-Nachricht noch im Verlauf steht (additive Extraktion)."]})]}),l.jsxs(Rr,{id:"agents",icon:wn,color:"text-rose-400",title:"9. Autonome Agenten betreiben",kicker:"LLM in der Schleife",wide:!0,children:[l.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:["Ein ",l.jsx("strong",{children:"Agent"})," ist ein LLM in einer Schleife mit Tools:",l.jsx("em",{children:" denken → Tool aufrufen → Ergebnis beobachten → weiter"}),", bis das Ziel erreicht ist."]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Guardrails"})," (Hard-Stop, Tool-Limits) verhindern Endlos-Loops, wenn ein Tool fehlt oder hängt."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Kontext-Hygiene"})," ist die wichtigste Disziplin: frische Sessions starten — vollgemüllte Historien werden langsam, driften und halluzinieren."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Kanäle:"})," CLI/Terminal, Chat-UI, Messaging (z.B. Telegram), reine API."]})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:[l.jsx("strong",{children:"Least Privilege:"})," gib einem Agenten nur die Tools, die er wirklich braucht. Kritische Aktionen (Shell auf dem Host, Löschen, Geld/Deploys) hinter menschliche Freigabe."]}),l.jsxs("p",{children:[l.jsx("strong",{children:"Was sich vollautomatisch lohnt:"})," Modell-Routing, Hintergrund-Gedächtnis, Recherche. ",l.jsx("strong",{children:"Was Freigabe braucht:"})," Systembefehle, Updates/Reboots, permanentes Löschen."]})]})]}),l.jsxs(Va,{children:[l.jsx("strong",{children:"Hermes"})," ist dein Box-Agent (Hirn = ",l.jsx(ze,{children:"fast"}),"). Reden tust du mit ihm im",l.jsx("strong",{children:" Terminal"}),"-Tab (Web-Terminal via ttyd) oder per ",l.jsx("strong",{children:"Telegram"}),". Er hat MCP-Server für Gedächtnis, Stack-Steuerung, Web-Fetch und ",l.jsx("strong",{children:"PC-Steuerung"})," (Executor auf deinem Windows-PC). Status & Verdrahtung im ",l.jsx("strong",{children:"Hermes"}),"-Tab."]})]}),l.jsxs(Rr,{id:"ide",icon:Fs,color:"text-cyan-400",title:"10. IDE / Editor anbinden",kicker:"Vibe-Coding lokal",children:[l.jsxs("p",{children:["Jede ",l.jsx("strong",{children:"OpenAI-kompatible"})," IDE oder Extension lässt sich auf einen lokalen Server umbiegen — Base-URL + Model eintragen, fertig:"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Cline"})," & ",l.jsx("strong",{children:"Roo Code"})," (VS-Code-Extensions, voller Agent + MCP)"]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Cursor"})," (VS-Code-Fork mit Top-Autocomplete)"]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Continue"}),", ",l.jsx("strong",{children:"aider"})," (CLI), ",l.jsx("strong",{children:"OpenCode"})," (Desktop)"]})]}),l.jsxs(Va,{children:["Tipp den Kram nicht ab: der ",l.jsx("strong",{children:"Verbinden"}),"-Tab generiert die fertige Config (inkl. MCP-Gedächtnis) pro Tool zum Kopieren. Essenz: Base ",l.jsx(ze,{children:"…:9001/v1"}),", Model ",l.jsx(ze,{children:"auto"}),", Key beliebig."]})]}),l.jsx(Rr,{id:"tricks",icon:x4,color:"text-amber-400",title:"11. Tricks & Kniffe",kicker:"Was im Alltag wirklich spart",wide:!0,children:l.jsx("div",{className:"grid md:grid-cols-3 gap-3",children:[["Kontext sauber halten","Neue Session statt Mega-Historie. Drift, Tempo und Halluzination hängen direkt am Kontext-Müll."],["Plan-then-Act","Erst Plan/Vorgehen bestätigen lassen, dann ausführen. Spart teure Holzwege."],["Gezielte Edits","Nie ganze Dateien überschreiben für eine Zeile — Such-/Ersetz-Tools nutzen. Weniger Tokens, weniger Fehler."],["Non-interaktive Befehle","Keine interaktiven Prompts im Agent-Terminal; lange Tasks als Background-Job. Sonst hängt der Loop."],["DevTools koppeln","Browser-/Konsolen-Zugriff geben — der Agent liest echte Fehler statt blind zu raten."],["Richtige Modellwahl","Schnelles Hirn für Alltag, großes für harte Logik, Coder fürs Coden. Nicht alles mit der Kanone."],["Akzeptanzkriterien","Sag konkret, woran „fertig“ erkennbar ist. Vage Prompts → vage Ergebnisse."],["Verifizieren statt vertrauen","Tests/Live-Check fordern. „Sollte funktionieren“ ist kein Beweis."],["Regeln ins Gedächtnis","Wiederkehrende Vorlieben/Konventionen einmal ablegen — der Agent zieht sie selbst."]].map(([r,n])=>l.jsxs("div",{className:"space-y-1 p-3 bg-background/10 rounded-xl border border-border/30",children:[l.jsxs("div",{className:"flex items-center gap-1.5 font-bold text-foreground text-[11px]",children:[l.jsx(xa,{className:"h-3 w-3 text-amber-400"})," ",r]}),l.jsx("p",{className:"text-[11px]",children:n})]},r))})}),l.jsx(Rr,{id:"wartung",icon:ws,color:"text-emerald-400",title:"12. Sicherheit & Wartung",kicker:"Damit's auch morgen noch läuft",wide:!0,children:l.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{className:"flex items-center gap-1.5 font-bold text-foreground",children:[l.jsx(_N,{className:"h-3.5 w-3.5 text-emerald-400"})," Goldene Regeln"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Ein ungetesteter Restore ist kein Backup."})," Wiederherstellung mindestens einmal echt durchspielen."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Updates können Dinge still zerschießen"})," — gerade bei AI-Stacks (Embeddings, Provider-Interna). Versionen pinnen, Smoke-Test, Post-Check."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Least Privilege"})," für Agenten, MCP-Server und PC-Zugriff. Kritisches hinter Freigabe."]})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{className:"flex items-center gap-1.5 font-bold text-foreground",children:[l.jsx(Qu,{className:"h-3.5 w-3.5 text-emerald-400"})," Bei dir im SystemDrawer"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Backup:"})," tägliches Voll-Zustands-Backup, getesteter ",l.jsx(ze,{children:"restore.sh"})," (Doku in ",l.jsx(ze,{children:"docs/BACKUP.md"}),")."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Updates:"})," git-basierter Update-Check; ",l.jsx("strong",{children:"Hermes-Update-Button"})," mit anschließendem ",l.jsx("strong",{children:"Gehirn-Check"})," (rot, falls das Update das Gedächtnis zerschießt) + Engine-Update."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Dienste & Gefahrenzone:"})," Restart/Logs pro Dienst, kritische Eingriffe getrennt."]})]}),l.jsx("p",{className:"text-[10px] italic",children:'Erreichbar über das System-Icon → Tab „Wartung".'})]})]})}),l.jsxs("section",{id:"ressourcen",className:"scroll-mt-20 md:col-span-2 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 shadow-lg shadow-black/10 space-y-4",children:[l.jsxs("div",{className:"flex items-center gap-2.5 border-b border-border/20 pb-3",children:[l.jsx(lv,{className:"h-5 w-5 text-primary"}),l.jsxs("div",{children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"13. Kuratierte Ressourcen & Links"}),l.jsx("span",{className:"text-[9px] font-mono text-primary",children:"Sauber geordnet — die guten Quellen"})]})]}),l.jsxs("div",{className:"grid md:grid-cols-2 gap-5 text-xs",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"font-bold text-foreground flex items-center gap-1.5",children:[l.jsx(lf,{className:"h-3.5 w-3.5 text-sky-400"})," Modelle & Engines"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1.5",children:[l.jsx(kt,{href:"https://huggingface.co/models",name:"Hugging Face",note:"das Repository für offene Modelle (GGUF, Embeddings, Datasets)."}),l.jsx(kt,{href:"https://github.com/ggml-org/llama.cpp",name:"llama.cpp",note:"die Referenz-Engine für lokale Inferenz."}),l.jsx(kt,{href:"https://github.com/mostlygeek/llama-swap",name:"llama-swap",note:"mehrere Modelle hinter einem Port, Auto-Swap."}),l.jsx(kt,{href:"https://ollama.com",name:"Ollama",note:"einfachster Einstieg, One-Command-Modelle."}),l.jsx(kt,{href:"https://lmstudio.ai",name:"LM Studio",note:"lokale GUI zum Stöbern, Laden & Chatten."}),l.jsx(kt,{href:"https://github.com/vllm-project/vllm",name:"vLLM",note:"Hochdurchsatz-Serving auf dicken GPUs."})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"font-bold text-foreground flex items-center gap-1.5",children:[l.jsx(cf,{className:"h-3.5 w-3.5 text-violet-400"})," MCP & Skills"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1.5",children:[l.jsx(kt,{href:"https://modelcontextprotocol.io",name:"MCP — offizielle Doku",note:"Spezifikation & Einstieg."}),l.jsx(kt,{href:"https://github.com/modelcontextprotocol/servers",name:"Offizielle MCP-Server",note:"filesystem, git, postgres, fetch & mehr."}),l.jsx(kt,{href:"https://smithery.ai",name:"Smithery",note:"Registry zum Suchen & Auto-Installieren von MCP-Servern."}),l.jsx(kt,{href:"https://glama.ai/mcp/servers",name:"Glama MCP Registry",note:"kuratierte Community-Datenbank."}),l.jsx(kt,{href:"https://skills.sh",name:"skills.sh",note:"Registry & CLI für Agent-Skills."})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"font-bold text-foreground flex items-center gap-1.5",children:[l.jsx(wn,{className:"h-3.5 w-3.5 text-rose-400"})," Agenten & Frameworks"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1.5",children:[l.jsx(kt,{href:"https://github.com/NousResearch/hermes-agent",name:"Hermes Agent (Nous)",note:"der Agent, der auf deiner Box läuft."}),l.jsx(kt,{href:"https://docs.claude.com",name:"Anthropic / Claude Docs",note:"API, Tool-Use, Agent SDK, MCP."}),l.jsx(kt,{href:"https://github.com/cline/cline",name:"Cline",note:"autonomer Coding-Agent für VS Code."}),l.jsx(kt,{href:"https://aider.chat",name:"aider",note:"AI-Pair-Programming im Terminal, git-nativ."}),l.jsx(kt,{href:"https://continue.dev",name:"Continue",note:"Open-Source-Autopilot für IDEs."})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"font-bold text-foreground flex items-center gap-1.5",children:[l.jsx(sv,{className:"h-3.5 w-3.5 text-amber-400"})," Lernen & Community"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1.5",children:[l.jsx(kt,{href:"https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/overview",name:"Prompt-Engineering (Anthropic)",note:"die beste praktische Anleitung."}),l.jsx(kt,{href:"https://github.com/anthropics/anthropic-cookbook",name:"Anthropic Cookbook",note:"lauffähige Rezepte für Tools, RAG, Agenten."}),l.jsx(kt,{href:"https://www.promptingguide.ai",name:"Prompt Engineering Guide",note:"herstellerneutrales Nachschlagewerk."}),l.jsx(kt,{href:"https://github.com/mem0ai/mem0",name:"Mem0",note:"die auto-lernende Memory-Schicht hinter deinem Gedächtnis."}),l.jsx(kt,{href:"https://www.reddit.com/r/LocalLLaMA/",name:"r/LocalLLaMA",note:"der Puls der lokalen-LLM-Szene."})]})]})]})]}),l.jsx(Rr,{id:"troubleshooting",icon:y4,color:"text-rose-400",title:"14. Troubleshooting",kicker:"Wenn's hakt",wide:!0,children:l.jsxs("ul",{className:"space-y-2 list-disc pl-4",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Keine Verbindung?"})," Selbes LAN wie die Box? IP/Port stimmen (",l.jsx(ze,{children:":9001"}),")? Backend-Status in der ",l.jsx("strong",{children:"Zentrale"})," prüfen."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Modell antwortet nicht / langsam?"})," In der ",l.jsx("strong",{children:"Zentrale → Dienste"})," schauen, ob ",l.jsx(ze,{children:"llama-swap"})," grün ist; sonst Restart. Erstes Token nach Swap dauert (Modell lädt)."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Agent dreht durch / halluziniert?"})," Frische Session im ",l.jsx("strong",{children:"Terminal"})," starten — meist ist es vollgemüllter Kontext."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Gedächtnis findet nichts?"})," Embedding-Dienst online? Semantisch suchen (Sinn statt exaktem Wort). Leeres Gedächtnis → Hermes-Onboarding starten."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Update hat etwas zerschossen?"})," Genau dafür gibt es Backup & ",l.jsx(ze,{children:"restore.sh"})," — den getesteten Restore fahren, dann Ursache suchen."]})]})})]}),l.jsx("p",{className:"text-center text-[10px] text-muted-foreground/50 pt-2",children:"Mission Control 2 · AI-Bibel · Stand Juni 2026 — lebendes Dokument, wächst mit dem Stack."})]})}function HX({title:e,hint:t}){return l.jsxs("div",{className:"space-y-4",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-xl font-semibold",children:e}),l.jsx("p",{className:"text-sm text-muted-foreground",children:t})]}),l.jsxs("div",{className:"flex flex-col items-center justify-center gap-3 rounded-xl border border-dashed border-border bg-card/50 py-20 text-center",children:[l.jsx(o4,{className:"h-8 w-8 text-muted-foreground"}),l.jsx("div",{className:"text-sm text-muted-foreground",children:"Kommt in einer späteren Phase."})]})]})}const tN=[{id:"mission-control-2",label:"Mission Control",type:"user",reach:"gateway (integr"},{id:"hermes-gateway",label:"Hermes Gateway",type:"user",reach:"hermes-gateway"},{id:"mem0-service",label:"Mem0 (Gedächtnis)",type:"user",reach:"mem0"},{id:"hermes-terminal",label:"Hermes Terminal",type:"user",reach:"hermes-terminal"},{id:"llama-swap",label:"Llama Swap",type:"system",reach:"llama-swap"}];function fu({icon:e,iconClass:t,name:r,status:n,available:a,busy:o,actionLabel:c,onAction:u}){return l.jsxs("div",{className:ee("flex items-center gap-3 rounded-lg border px-3 py-2",a?"border-amber-500/30 bg-amber-500/5":"border-border/50 bg-background/20"),children:[l.jsx(e,{className:ee("h-4 w-4 shrink-0",t)}),l.jsxs("div",{className:"flex-1 min-w-0",children:[l.jsx("div",{className:"text-xs text-foreground truncate",children:r}),l.jsx("div",{className:ee("text-[10px] truncate",a?"text-amber-400/90":"text-muted-foreground"),children:n})]}),l.jsx("button",{onClick:u,disabled:!a||o,className:ee("text-[11px] font-semibold rounded-lg px-2.5 py-1 transition-colors shrink-0",a?"bg-primary text-primary-foreground hover:opacity-90 cursor-pointer":"border border-border/50 text-muted-foreground/40 cursor-default"),children:o?"…":c})]})}function WX({label:e,ok:t,system:r,busy:n,onRestart:a,onLogs:o}){return l.jsxs("div",{className:"flex items-center gap-2.5 rounded-lg border border-border/50 bg-background/20 px-3 py-2",children:[l.jsx("span",{className:ee("w-1.5 h-1.5 rounded-full shrink-0",t===!0?"bg-emerald-500":t===!1?"bg-red-500":"bg-muted-foreground/40")}),l.jsxs("span",{className:"flex-1 text-xs text-foreground truncate",children:[e,r&&l.jsx("span",{className:"text-[9px] text-muted-foreground",children:" (root)"})]}),l.jsx("button",{onClick:a,disabled:n,title:"Neu starten",className:"text-muted-foreground hover:text-primary transition-colors disabled:opacity-50",children:l.jsx(Xa,{className:ee("h-3.5 w-3.5",n&&"animate-spin")})}),l.jsx("button",{onClick:o,title:"Logs ansehen",className:"text-muted-foreground hover:text-primary transition-colors",children:l.jsx(l4,{className:"h-3.5 w-3.5"})})]})}function Kg(e){return e==null?"":e>1024**3?`${(e/1024**3).toFixed(2)} GB`:`${(e/1024**2).toFixed(1)} MB`}function ZO({open:e,onClose:t,defaultTab:r="maintenance"}){var Ti;const[n,a]=y.useState(null),[o,c]=y.useState([]),[u,f]=y.useState("llama-swap"),[h,m]=y.useState(""),[g,v]=y.useState(!1),[b,j]=y.useState(null),[k,S]=y.useState({}),[N,E]=y.useState("maintenance"),[A,P]=y.useState(!1),[_,O]=y.useState(""),[D,U]=y.useState(!1),[B,F]=y.useState(null),[Y,H]=y.useState([]),[pe,ue]=y.useState(!1),[he,ae]=y.useState(null),[se,X]=y.useState(null);function te($,Le,cr){X({type:"alert",title:$,message:Le,onConfirm:()=>{X(null),cr&&cr()}})}function J($,Le,cr){X({type:"confirm",title:$,message:Le,onConfirm:()=>{X(null),cr()},onCancel:()=>X(null)})}function I($){return $?new Date($*1e3).toLocaleString("de-DE",{day:"2-digit",month:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}):"Nie"}const[M,K]=y.useState(""),[ne,Z]=y.useState(""),[me,ge]=y.useState(!1),[Pe,re]=y.useState(!1);y.useEffect(()=>{e&&(K(localStorage.getItem("mc_sudo_password")||""),Z(localStorage.getItem("mc_hf_token")||""))},[e]),y.useEffect(()=>{e&&r&&E(r)},[e,r]);const xe=y.useRef(null);function _e(){Se("/api/maintenance/updates").then(a).catch($=>console.error("Error loading updates",$))}function ie(){Se("/api/jobs").then($=>c($.jobs||[])).catch($=>console.error("Error loading jobs",$))}function Je(){Se("/api/system/services").then(F).catch(()=>{})}function Fe(){Se("/api/system/backups").then($=>H($.backups||[])).catch(()=>{})}function Oe($){v(!0),j(null),Se(`/api/maintenance/logs?service=${$}&lines=150`).then(Le=>{Le.ok?m(Le.text):(m(`Fehler beim Laden der Logs: ${Le.err||"Unbekannter Fehler"}`),(Le.status==="incorrect_password"||Le.status==="password_required")&&j(Le.status))}).catch(Le=>m(`Fehler: ${Le.message}`)).finally(()=>{v(!1),setTimeout(()=>{xe.current&&(xe.current.scrollTop=xe.current.scrollHeight)},50)})}y.useEffect(()=>{if(!e)return;_e(),ie(),Je(),Fe();const $=setInterval(()=>{ie(),_e(),Je()},3e3);return()=>clearInterval($)},[e]),y.useEffect(()=>{!e||N!=="logs"||Oe(u)},[e,N,u]);function ut($){return($==null?void 0:$.status)==="busy"?(te("Update läuft bereits",`Es läuft gerade „${$.running}". Bitte warte, bis es fertig ist.`),ie(),!0):!1}async function Jt(){try{const $=await Se("/api/maintenance/os-update",{method:"POST"});if(ut($))return;ie(),E("maintenance")}catch($){te("Fehler",`Fehler beim Starten des OS-Updates: ${$.message}`)}}async function W(){try{const $=await Se("/api/maintenance/engine-update",{method:"POST"});if(ut($))return;ie(),E("maintenance")}catch($){te("Fehler",`Fehler beim Engine-Update: ${$.message}`)}}async function ke(){try{const $=await Se("/api/maintenance/swap-update",{method:"POST"});if(ut($))return;ie(),E("maintenance")}catch($){te("Fehler",`Fehler beim Router-Update: ${$.message}`)}}async function Ae(){ue(!0);try{const $=await Se("/api/maintenance/hermes-update",{method:"POST"});if(ut($))return;ie()}catch($){te("Fehler",`Hermes-Update fehlgeschlagen: ${$.message}`)}finally{ue(!1)}}async function Be($){ae({kind:$,loading:!0,data:null});try{const Le=await Se(`/api/maintenance/update-details?kind=${$}`);ae({kind:$,loading:!1,data:Le})}catch(Le){ae({kind:$,loading:!1,data:{kind:$,error:Le.message}})}}function et(){const $=he==null?void 0:he.kind;ae(null),$==="os"?Jt():$==="engine"?W():$==="swap"?ke():$==="hermes"&&Ae()}async function Ut(){P(!0);try{await Se("/api/maintenance/check-updates",{method:"POST"}),ie(),E("maintenance")}catch($){te("Fehler",`Fehler bei der Update-Suche: ${$.message}`)}finally{P(!1)}}async function ht($,Le){try{await Se("/api/models/install",{method:"POST",body:JSON.stringify({repo:$,role:Le})}),te("Gestartet",`Modell-Upgrade für '${Le}' (${$}) gestartet.`),ie(),E("maintenance")}catch(cr){te("Fehler",`Fehler beim Starten des Modell-Upgrades: ${cr.message}`)}}async function ur(){J("Reboot bestätigen","Bist du sicher, dass du das gesamte Host-System neu starten willst?",async()=>{try{await Se("/api/maintenance/reboot",{method:"POST"}),te("Reboot","Reboot ausgelöst. System startet neu...",()=>{t()})}catch($){te("Fehler",`Fehler beim Reboot: ${$.message}`)}})}async function Ca(){U(!0),O("Snapshot wird erzeugt...");try{const $=await Se("/api/system/backup",{method:"POST"});O($.ok?`Snapshot erzeugt: ${$.snapshot} (${$.files.length} Komponenten)`:"Backup fehlgeschlagen."),Fe()}catch($){O(`Fehler: ${$.message}`)}finally{U(!1)}}async function Jn($){S(Le=>({...Le,[$]:!0}));try{const Le=await Se("/api/maintenance/restart",{method:"POST",body:JSON.stringify({service:$})});Le.ok?te("Dienst neu gestartet",`Dienst ${$} wurde erfolgreich neu gestartet.`,()=>{N==="logs"&&u===$&&Oe($)}):te("Fehler",`Fehler beim Neustart: ${Le.err||"Unbekannter Fehler"}`)}catch(Le){te("Fehler",`Fehler beim Neustart: ${Le.message}`)}finally{S(Le=>({...Le,[$]:!1}))}}async function Ii($){try{await Se(`/api/jobs/${$}/cancel`,{method:"POST"}),ie()}catch(Le){te("Fehler",`Fehler beim Abbrechen: ${Le.message}`)}}const Or=o.find($=>($.state==="running"||$.state==="queued")&&$.group==="maintenance");return l.jsxs(l.Fragment,{children:[l.jsx("div",{className:ee("fixed inset-0 bg-black/60 backdrop-blur-sm z-50 transition-opacity duration-300",e?"opacity-100 pointer-events-auto":"opacity-0 pointer-events-none"),onClick:t}),l.jsxs("div",{className:ee("fixed inset-y-0 right-0 w-full sm:w-[640px] bg-card/85 backdrop-blur-xl border-l border-border/60 shadow-2xl z-50 flex flex-col transform transition-transform duration-300 ease-in-out font-sans text-foreground",e?"translate-x-0":"translate-x-full"),children:[l.jsxs("div",{className:"flex h-16 shrink-0 items-center justify-between border-b border-border/40 px-6",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(Hn,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold tracking-wide uppercase font-space",children:"OS-Zentrale & Pflege"})]}),l.jsx("button",{onClick:t,className:"flex h-8 w-8 items-center justify-center rounded-lg border border-border/40 text-muted-foreground hover:bg-accent transition-colors",children:l.jsx(Wn,{className:"h-4 w-4"})})]}),l.jsxs("div",{className:"flex border-b border-border/40 px-6",children:[l.jsx("button",{onClick:()=>E("maintenance"),className:ee("flex-1 py-3 text-xs font-semibold uppercase tracking-wider border-b-2 text-center transition-all",N==="maintenance"?"border-primary text-primary":"border-transparent text-muted-foreground hover:text-foreground"),children:"System-Wartung"}),l.jsx("button",{onClick:()=>E("logs"),className:ee("flex-1 py-3 text-xs font-semibold uppercase tracking-wider border-b-2 text-center transition-all",N==="logs"?"border-primary text-primary":"border-transparent text-muted-foreground hover:text-foreground"),children:"System-Logs"}),l.jsx("button",{onClick:()=>E("settings"),className:ee("flex-1 py-3 text-xs font-semibold uppercase tracking-wider border-b-2 text-center transition-all",N==="settings"?"border-primary text-primary":"border-transparent text-muted-foreground hover:text-foreground"),children:"Einstellungen"})]}),l.jsxs("div",{className:"flex-1 overflow-y-auto p-6 space-y-6",children:[N==="maintenance"&&l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"space-y-2.5",children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Updates"}),l.jsxs("button",{onClick:Ut,disabled:A||!!Or,className:"flex items-center gap-1 text-[10px] font-semibold text-primary hover:text-primary/80 transition-colors disabled:opacity-50",children:[l.jsx(Xa,{className:ee("h-3 w-3",A&&"animate-spin")})," Nach Updates suchen"]})]}),(n==null?void 0:n.last_check)&&l.jsxs("div",{className:"text-[9px] text-muted-foreground -mt-1",children:["Zuletzt gesucht: ",I(n.last_check)]}),Or&&l.jsxs("div",{className:"flex items-center gap-2 rounded-lg border border-amber-500/30 bg-amber-500/10 px-3 py-2 text-[11px] text-amber-300",children:[l.jsx(Xa,{className:"h-3.5 w-3.5 shrink-0 animate-spin"}),l.jsxs("span",{children:["Update läuft: ",l.jsx("span",{className:"font-semibold",children:Or.label})," — bitte warten. Weitere Updates sind solange gesperrt."]})]}),l.jsxs("div",{className:"space-y-1.5",children:[l.jsx(fu,{icon:ws,iconClass:"text-cyan-400",name:"OS-Pakete (apt)",available:!!(n!=null&&n.os),status:n!=null&&n.os?`${n.os} verfügbar`:"aktuell",actionLabel:"Anzeigen",onAction:()=>Be("os")}),l.jsx(fu,{icon:ff,iconClass:"text-violet-400",name:"Inferenz-Engine (llama.cpp)",available:!!(n!=null&&n.engine),status:n!=null&&n.engine?"Update verfügbar":"aktuell",actionLabel:"Anzeigen",onAction:()=>Be("engine")}),l.jsx(fu,{icon:gw,iconClass:"text-fuchsia-400",name:"Router (llama-swap)",available:!!(n!=null&&n.swap),status:n!=null&&n.swap?"Update verfügbar":"aktuell",actionLabel:"Anzeigen",onAction:()=>Be("swap")}),(()=>{var Le;const $=(Le=n==null?void 0:n.components)==null?void 0:Le.find(cr=>cr.key==="hermes_agent");return l.jsx(fu,{icon:wn,iconClass:"text-amber-400",name:"Hermes-Agent",available:($==null?void 0:$.update)===!0,busy:pe,status:($==null?void 0:$.update)===!0?`Update: ${$.latest}`:($==null?void 0:$.reachable)===!1?"offline":"aktuell",actionLabel:"Anzeigen",onAction:()=>Be("hermes")})})(),(Ti=n==null?void 0:n.model_list)==null?void 0:Ti.map($=>l.jsx(fu,{icon:q3,iconClass:"text-emerald-400",name:`Modell · ${$.role}`,available:!0,status:$.title,actionLabel:"Upgrade",onAction:()=>ht($.repo,$.role)},$.role))]})]}),l.jsxs("div",{className:"space-y-2.5",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Dienste"}),l.jsx("div",{className:"space-y-1.5",children:tN.map($=>{var Le;return l.jsx(WX,{label:$.label,system:$.type==="system",ok:(Le=B==null?void 0:B.services.find(cr=>cr.name.toLowerCase().includes($.reach)))==null?void 0:Le.ok,busy:k[$.id],onRestart:()=>Jn($.id),onLogs:()=>{f($.id),E("logs")}},$.id)})})]}),l.jsxs("div",{className:"space-y-2.5",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Backup"}),l.jsxs("div",{className:"rounded-lg border border-border/50 bg-background/20 px-3 py-2.5 flex items-center gap-3",children:[l.jsxs("div",{className:"flex-1 min-w-0",children:[l.jsx("div",{className:"text-xs text-foreground truncate",children:Y[0]?`Letztes: ${Y[0].snapshot}`:"Noch kein Backup"}),l.jsxs("div",{className:"text-[10px] text-muted-foreground",children:[Y.length," Snapshots · Restore per CLI (restore.sh)"]})]}),l.jsxs("button",{onClick:Ca,disabled:D,className:"flex items-center gap-1.5 text-[11px] font-semibold rounded-lg px-2.5 py-1 bg-primary text-primary-foreground hover:opacity-90 transition-all cursor-pointer disabled:opacity-50 shrink-0",children:[l.jsx(X3,{className:ee("h-3.5 w-3.5",D&&"animate-pulse")})," Snapshot"]})]}),_&&l.jsx("div",{className:"text-[10px] font-mono text-primary bg-primary/5 p-2 rounded-lg border border-primary/20 break-all leading-normal",children:_})]}),l.jsxs("div",{className:"space-y-2.5",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-red-400/80",children:"Gefahrenzone"}),l.jsxs("button",{onClick:ur,className:"flex w-full items-center gap-3 p-3 rounded-lg border border-red-500/20 bg-red-500/5 hover:bg-red-500/10 text-red-400 transition-all text-left text-xs font-semibold",children:[l.jsx(P4,{className:"h-4.5 w-4.5"}),l.jsxs("div",{children:[l.jsx("div",{children:"Host-System neu starten"}),l.jsx("div",{className:"text-[10px] text-red-400/80 font-normal",children:"Startet die ganze Box neu"})]})]})]}),l.jsxs("div",{className:"space-y-3",children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Hintergrund-Aufgaben"}),l.jsxs("span",{className:"text-[10px] font-mono bg-primary/10 text-primary px-1.5 py-0.5 rounded-full",children:[o.filter($=>$.state==="running"||$.state==="queued").length," Aktiv"]})]}),l.jsx("div",{className:"space-y-3",children:o.length===0?l.jsx("div",{className:"text-xs text-muted-foreground border border-dashed border-border/60 rounded-xl p-6 text-center",children:"Aktuell keine aktiven Hintergrund-Jobs."}):o.map($=>{const Le=$.state==="running"||$.state==="queued";return l.jsxs("div",{className:ee("p-3 rounded-xl border transition-all duration-300",Le?"border-primary/40 bg-primary/5 shadow-md shadow-primary/5":"border-border/40 bg-background/20 opacity-80"),children:[l.jsxs("div",{className:"flex items-start justify-between gap-3",children:[l.jsxs("div",{className:"space-y-1",children:[l.jsxs("div",{className:"text-xs font-semibold flex items-center gap-1.5",children:[Le&&l.jsxs("span",{className:"flex h-2 w-2 relative",children:[l.jsx("span",{className:"animate-ping absolute inline-flex h-full w-full rounded-full bg-primary opacity-75"}),l.jsx("span",{className:"relative inline-flex rounded-full h-2 w-2 bg-primary"})]}),$.label]}),l.jsxs("div",{className:"text-[10px] font-mono text-muted-foreground uppercase flex items-center gap-2",children:[l.jsxs("span",{children:["ID: ",$.id]}),l.jsx("span",{children:"•"}),l.jsx("span",{className:ee($.state==="done"&&"text-emerald-400",$.state==="failed"&&"text-red-400",$.state==="running"&&"text-primary",$.state==="queued"&&"text-amber-400",$.state==="canceled"&&"text-muted-foreground"),children:$.state})]})]}),Le&&l.jsx("button",{onClick:()=>Ii($.id),className:"text-[10px] font-semibold text-red-400 hover:text-red-300 border border-red-500/20 bg-red-500/5 hover:bg-red-500/10 px-2 py-0.5 rounded transition-colors",children:"Abbrechen"})]}),$.state==="running"&&l.jsxs("div",{className:"mt-3 space-y-1",children:[l.jsx("div",{className:"w-full h-1.5 bg-muted rounded-full overflow-hidden",children:l.jsx("div",{className:"h-full bg-primary transition-all duration-500",style:{width:`${$.progress??0}%`}})}),l.jsxs("div",{className:"flex justify-between items-center text-[9px] font-mono text-muted-foreground",children:[l.jsxs("span",{children:[$.progress??0,"%"]}),$.done_bytes!=null&&$.total_bytes!=null&&l.jsxs("span",{children:[Kg($.done_bytes)," / ",Kg($.total_bytes),$.rate_bps!=null&&` (${Kg($.rate_bps)}/s)`]}),$.eta_s!=null&&l.jsxs("span",{children:["ETA: ",$.eta_s,"s"]})]})]})]},$.id)})})]})]}),N==="logs"&&l.jsxs("div",{className:"flex flex-col h-full space-y-4",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx("select",{value:u,onChange:$=>f($.target.value),className:"flex-1 h-9 px-3 text-xs bg-background/40 border border-border/60 rounded-lg outline-none text-foreground font-semibold",children:tN.map($=>l.jsxs("option",{value:$.id,children:[$.label," (",$.type==="system"?"systemd-root":"user",")"]},$.id))}),l.jsxs("button",{onClick:()=>Jn(u),disabled:k[u],className:"flex h-9 px-3 items-center gap-1.5 text-xs font-semibold rounded-lg border border-border/60 bg-background/20 hover:border-primary/50 transition-colors disabled:opacity-50",title:"Dienst neu starten",children:[l.jsx(Xa,{className:ee("h-3.5 w-3.5",k[u]&&"animate-spin")}),"Restart"]})]}),l.jsxs("div",{className:"flex-1 flex flex-col min-h-[300px] border border-border/60 bg-black/50 rounded-xl overflow-hidden shadow-inner",children:[l.jsxs("div",{className:"flex h-9 items-center justify-between px-4 border-b border-border/40 bg-black/30 shrink-0",children:[l.jsxs("div",{className:"flex items-center gap-1.5 text-[10px] font-mono text-muted-foreground",children:[l.jsx(TN,{className:"h-3 w-3 text-primary"}),l.jsxs("span",{children:["stdout/stderr - ",u]})]}),l.jsx("button",{onClick:()=>Oe(u),disabled:g,className:"text-muted-foreground hover:text-foreground transition-colors",children:l.jsx(Xa,{className:ee("h-3 w-3",g&&"animate-spin")})})]}),l.jsx("pre",{ref:xe,className:"flex-1 p-4 overflow-y-auto text-[10px] font-mono text-cyan-300/90 whitespace-pre-wrap select-text leading-relaxed scrollbar-thin",children:b==="password_required"||b==="incorrect_password"?l.jsxs("div",{className:"flex flex-col items-center justify-center p-6 text-center h-full space-y-3",children:[l.jsx(bi,{className:"h-8 w-8 text-amber-400 animate-pulse animate-duration-1000"}),l.jsx("div",{className:"text-xs font-semibold text-amber-300",children:b==="incorrect_password"?"Falsches Sudo-Passwort hinterlegt.":"Sudo-Passwort für systemd-Dienste erforderlich."}),l.jsxs("p",{className:"text-[10px] text-muted-foreground max-w-xs leading-normal",children:["Für das Auslesen der systemd-Logs von ",u," werden Root-Rechte benötigt. Hinterlege dein Passwort in den Einstellungen."]}),l.jsx("button",{onClick:()=>E("settings"),className:"px-3 py-1.5 text-[10px] font-semibold text-primary-foreground bg-primary hover:bg-primary/95 rounded-md transition-colors mt-2",children:"Sudo-Passwort eintragen"})]}):g&&!h?l.jsx("span",{className:"text-muted-foreground",children:"Lade Logs..."}):h||l.jsx("span",{className:"text-muted-foreground",children:"Keine Logeinträge vorhanden."})})]})]}),N==="settings"&&l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Zugangsdaten & Schlüssel"}),l.jsx("p",{className:"text-[10px] text-muted-foreground leading-normal",children:"Diese Daten werden ausschließlich lokal in deinem Browser (localStorage) gespeichert und bei Bedarf an das Backend übertragen."})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("label",{className:"text-xs font-semibold flex items-center gap-1.5",children:[l.jsx(ws,{className:"h-4 w-4 text-amber-400"}),"Host Sudo-Passwort"]}),l.jsxs("div",{className:"relative",children:[l.jsx("input",{type:me?"text":"password",value:M,onChange:$=>K($.target.value),"aria-label":"Host Sudo-Passwort",name:"sudo-password",autoComplete:"off",spellCheck:!1,placeholder:"Sudo-Passwort für System-Operationen",className:"w-full h-10 pl-3 pr-10 text-xs bg-background/40 border border-border/60 rounded-lg outline-none focus:border-primary transition-colors text-foreground"}),l.jsx("button",{type:"button",onClick:()=>ge(!me),"aria-label":me?"Passwort verbergen":"Passwort anzeigen",className:"absolute inset-y-0 right-0 flex items-center pr-3 text-muted-foreground hover:text-foreground transition-colors",children:me?l.jsx(hw,{className:"h-4 w-4","aria-hidden":"true"}):l.jsx(uf,{className:"h-4 w-4","aria-hidden":"true"})})]}),l.jsx("p",{className:"text-[9px] text-muted-foreground leading-normal",children:"Wird benötigt für systemd-Dienste (Llama Swap logs/restart), OS-Update (apt) und Reboot."})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("label",{className:"text-xs font-semibold flex items-center gap-1.5",children:[l.jsx(p4,{className:"h-4 w-4 text-violet-400"}),"HuggingFace API Token"]}),l.jsxs("div",{className:"relative",children:[l.jsx("input",{type:Pe?"text":"password",value:ne,onChange:$=>Z($.target.value),"aria-label":"HuggingFace API Token",name:"hf-token",autoComplete:"off",spellCheck:!1,placeholder:"hf_…",className:"w-full h-10 pl-3 pr-10 text-xs bg-background/40 border border-border/60 rounded-lg outline-none focus:border-primary transition-colors text-foreground"}),l.jsx("button",{type:"button",onClick:()=>re(!Pe),"aria-label":Pe?"Token verbergen":"Token anzeigen",className:"absolute inset-y-0 right-0 flex items-center pr-3 text-muted-foreground hover:text-foreground transition-colors",children:Pe?l.jsx(hw,{className:"h-4 w-4","aria-hidden":"true"}):l.jsx(uf,{className:"h-4 w-4","aria-hidden":"true"})})]}),l.jsx("p",{className:"text-[9px] text-muted-foreground leading-normal",children:"Erlaubt das Herunterladen von geschützten oder Gate-restricted Modellen direkt über Mission Control."})]}),l.jsxs("div",{className:"flex gap-3 pt-2",children:[l.jsx("button",{onClick:()=>{localStorage.setItem("mc_sudo_password",M),localStorage.setItem("mc_hf_token",ne),te("Erfolgreich","Einstellungen erfolgreich lokal gespeichert.")},className:"flex-1 h-9 flex items-center justify-center text-xs font-semibold text-primary-foreground bg-primary hover:bg-primary/90 rounded-lg transition-colors shadow shadow-primary/10 cursor-pointer",children:"Speichern"}),l.jsx("button",{onClick:()=>{K(""),Z(""),localStorage.removeItem("mc_sudo_password"),localStorage.removeItem("mc_hf_token"),te("Gelöscht","Zugangsdaten gelöscht.")},className:"h-9 px-4 flex items-center justify-center text-xs font-semibold text-muted-foreground border border-border/60 bg-background/20 hover:bg-accent rounded-lg transition-colors cursor-pointer",children:"Zurücksetzen"})]})]})]})]}),he&&(()=>{var mc;const $=he.data,Le={os:{icon:ws,cls:"text-cyan-400",title:"OS-Pakete (apt)"},engine:{icon:ff,cls:"text-violet-400",title:"Inferenz-Engine (llama.cpp)"},swap:{icon:gw,cls:"text-fuchsia-400",title:"Router (llama-swap)"},hermes:{icon:wn,cls:"text-amber-400",title:"Hermes-Agent"}}[he.kind],cr=Le.icon,hc=$?he.kind==="os"?($.count??0)===0:he.kind==="hermes"?($.behind??0)===0:$.installed_build!=null&&$.latest_build!=null&&$.latest_build<=$.installed_build:!0;return l.jsxs("div",{className:"fixed inset-0 z-[60] flex items-center justify-center p-4",children:[l.jsx("div",{className:"absolute inset-0 bg-black/70 backdrop-blur-sm",onClick:()=>ae(null)}),l.jsxs("div",{className:"relative w-full max-w-lg max-h-[80vh] flex flex-col rounded-2xl border border-border/60 bg-card shadow-2xl font-sans text-foreground",children:[l.jsxs("div",{className:"flex h-14 shrink-0 items-center justify-between border-b border-border/40 px-5",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(cr,{className:ee("h-4.5 w-4.5",Le.cls)}),l.jsx("h3",{className:"text-sm font-semibold",children:Le.title})]}),l.jsx("button",{onClick:()=>ae(null),className:"flex h-7 w-7 items-center justify-center rounded-lg border border-border/40 text-muted-foreground hover:bg-accent transition-colors",children:l.jsx(Wn,{className:"h-4 w-4"})})]}),l.jsx("div",{className:"flex-1 overflow-y-auto p-5 text-xs space-y-3 scrollbar-thin",children:he.loading?l.jsxs("div",{className:"flex h-24 items-center justify-center gap-2 text-muted-foreground",children:[l.jsx(Xa,{className:"h-4 w-4 animate-spin"})," Details werden geladen…"]}):$!=null&&$.error?l.jsx("div",{className:"rounded-lg border border-red-500/30 bg-red-500/5 p-3 text-red-400",children:$.error}):he.kind==="os"?(($==null?void 0:$.count)??0)===0?l.jsx("div",{className:"text-muted-foreground",children:"Keine Pakete zu aktualisieren — System ist aktuell."}):l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"text-muted-foreground",children:[$.count," Paket(e) werden aktualisiert:"]}),l.jsx("div",{className:"space-y-1",children:$.packages.map(_r=>l.jsxs("div",{className:"flex items-center justify-between gap-2 rounded-md border border-border/40 bg-background/30 px-2.5 py-1.5",children:[l.jsxs("span",{className:"flex items-center gap-1.5 font-mono text-[11px] truncate",children:[l.jsx(A4,{className:"h-3 w-3 text-cyan-400 shrink-0"}),_r.name]}),l.jsxs("span",{className:"flex items-center gap-1 font-mono text-[10px] text-muted-foreground shrink-0",children:[l.jsx("span",{children:_r.current}),l.jsx(sf,{className:"h-3 w-3"}),l.jsx("span",{className:"text-emerald-400",children:_r.candidate})]})]},_r.name))})]}):he.kind==="engine"||he.kind==="swap"?l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"flex items-center gap-2 font-mono text-[11px]",children:[l.jsxs("span",{className:"rounded-md border border-border/40 bg-background/30 px-2 py-1",children:["Build ",($==null?void 0:$.installed_build)??"?"]}),l.jsx(sf,{className:"h-3.5 w-3.5 text-muted-foreground"}),l.jsxs("span",{className:"rounded-md border border-emerald-500/30 bg-emerald-500/5 px-2 py-1 text-emerald-400",children:["Build ",($==null?void 0:$.latest_build)??"?"]})]}),(($==null?void 0:$.name)||($==null?void 0:$.latest_tag))&&l.jsxs("div",{className:"text-muted-foreground",children:["Release: ",l.jsx("span",{className:"text-foreground",children:$==null?void 0:$.name}),$!=null&&$.latest_tag?` (${$.latest_tag})`:""]}),($==null?void 0:$.url)&&l.jsxs("a",{href:$.url,target:"_blank",rel:"noreferrer",className:"inline-flex items-center gap-1 text-primary hover:underline",children:["Release-Notes auf GitHub ",l.jsx(Us,{className:"h-3 w-3"})]}),($==null?void 0:$.body)&&l.jsx("pre",{className:"whitespace-pre-wrap rounded-lg border border-border/40 bg-background/30 p-3 text-[10px] leading-relaxed text-muted-foreground max-h-60 overflow-y-auto scrollbar-thin",children:$.body})]}):(((mc=$==null?void 0:$.commits)==null?void 0:mc.length)??0)===0?l.jsx("div",{className:"text-muted-foreground",children:"Keine neuen Commits — Hermes-Agent ist bereits aktuell."}):l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"text-muted-foreground",children:[$.behind," neue Commit(s) auf ",l.jsxs("span",{className:"font-mono text-foreground",children:["origin/",$.branch]}),":"]}),l.jsx("div",{className:"space-y-1",children:$.commits.map(_r=>l.jsxs("div",{className:"flex items-start gap-2 rounded-md border border-border/40 bg-background/30 px-2.5 py-1.5",children:[l.jsx(d4,{className:"h-3.5 w-3.5 text-primary shrink-0 mt-0.5"}),l.jsxs("div",{className:"min-w-0",children:[l.jsx("div",{className:"text-[11px] truncate",children:_r.subject}),l.jsxs("div",{className:"font-mono text-[9px] text-muted-foreground",children:[_r.hash," · ",_r.when]})]})]},_r.hash))}),l.jsx("p",{className:"text-[10px] text-muted-foreground leading-normal",children:"Vor dem Update wird automatisch ein Backup erstellt; danach startet der Hermes-Gateway neu."})]})}),l.jsxs("div",{className:"flex gap-3 border-t border-border/40 p-4 shrink-0",children:[l.jsx("button",{onClick:()=>ae(null),className:"h-9 flex-1 rounded-lg border border-border/60 bg-background/20 text-xs font-semibold text-muted-foreground hover:bg-accent transition-colors cursor-pointer",children:"Schließen"}),l.jsx("button",{onClick:et,disabled:he.loading||hc||!!Or,title:Or?`Update läuft bereits: ${Or.label}`:void 0,className:"h-9 flex-1 rounded-lg bg-primary text-xs font-semibold text-primary-foreground hover:opacity-90 transition-all cursor-pointer disabled:opacity-40 disabled:cursor-default",children:Or?"Update läuft…":"Jetzt aktualisieren"})]})]})]})})(),se&&l.jsx(UO,{type:se.type,title:se.title,message:se.message,onConfirm:se.onConfirm,onCancel:se.onCancel})]})}function KX(){const{data:e}=vh(3e4),{data:t}=Ni(),r=((e==null?void 0:e.os)||0)+((e==null?void 0:e.engine)||0)+((e==null?void 0:e.swap)||0)+((e==null?void 0:e.models)||0),n=()=>window.dispatchEvent(new CustomEvent("open-system-drawer",{detail:{tab:"maintenance"}})),a=(t==null?void 0:t.models)??[],o=(t==null?void 0:t.running)??[],c=a.find(m=>m.role==="hermes"),u=a.find(m=>m.role==="coder-lite")||a.find(m=>m.role==="coder"),f=m=>m?o.includes(m):!1,h=m=>{var g;return((g=m==null?void 0:m.split("/").pop())==null?void 0:g.replace(/\.gguf$/i,""))||"—"};return l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Basisstation"}),l.jsx("p",{className:"text-sm text-muted-foreground",children:"Geht's der Box gut, gibt's Updates, was läuft gerade."})]}),l.jsx(VO,{frame:"box"}),l.jsxs("button",{onClick:n,className:ee("w-full flex items-center gap-3 rounded-2xl border p-4 text-left transition-all cursor-pointer",r>0?"border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/10":"border-border/60 bg-card/45 hover:border-primary/40"),children:[r>0?l.jsx(J3,{className:"h-6 w-6 shrink-0 text-amber-400"}):l.jsx(sr,{className:"h-6 w-6 shrink-0 text-emerald-400"}),l.jsxs("div",{className:"flex-1 min-w-0",children:[l.jsx("div",{className:ee("text-sm font-semibold",r>0?"text-amber-400":"text-foreground"),children:r>0?`${r} Update${r===1?"":"s"} verfügbar`:"Alles aktuell"}),l.jsx("div",{className:"text-xs text-muted-foreground",children:r>0?"Antippen, um zu sehen, was genau aktualisiert wird.":"Keine ausstehenden Updates."})]}),r>0&&l.jsxs("span",{className:"shrink-0 flex items-center gap-1 text-xs font-semibold text-amber-400",children:["Ansehen ",l.jsx(ch,{className:"h-4 w-4"})]})]}),l.jsxs("div",{children:[l.jsx("div",{className:"text-xs text-muted-foreground mb-2",children:"Was gerade läuft"}),l.jsx("div",{className:"rounded-2xl border border-border/60 overflow-hidden",children:[{icon:Hn,label:"Lucys Hirn",model:c==null?void 0:c.name,warm:f(c==null?void 0:c.name)},{icon:Fs,label:"Coder (Vibe-Coding)",model:u==null?void 0:u.name,warm:f(u==null?void 0:u.name)}].map(m=>l.jsxs("div",{className:"flex items-center gap-3 px-4 py-3 border-b border-border/40 last:border-0",children:[l.jsx("span",{className:ee("h-2 w-2 shrink-0 rounded-full",m.warm?"bg-emerald-500 animate-pulse":"bg-muted-foreground/40")}),l.jsx(m.icon,{className:"h-4 w-4 text-muted-foreground shrink-0"}),l.jsx("span",{className:"text-sm text-foreground w-40 shrink-0",children:m.label}),l.jsx("span",{className:"text-xs text-muted-foreground flex-1 truncate font-mono",children:h(m.model)}),l.jsx("span",{className:ee("text-xs shrink-0",m.warm?"text-emerald-400":"text-muted-foreground"),children:m.model?m.warm?"warm":"bereit":"nicht gesetzt"})]},m.label))})]}),l.jsxs("div",{className:"grid gap-6 lg:grid-cols-2",children:[l.jsx(BO,{}),l.jsx(HO,{})]}),l.jsx(WO,{})]})}function Gg({icon:e,title:t,sub:r,onClick:n}){return l.jsxs("button",{onClick:n,className:"w-full flex items-center gap-4 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 text-left transition-all hover:border-primary/40 cursor-pointer",children:[l.jsx(e,{className:"h-6 w-6 text-muted-foreground shrink-0"}),l.jsxs("div",{className:"flex-1 min-w-0",children:[l.jsx("div",{className:"text-sm text-foreground",children:t}),l.jsx("div",{className:"text-xs text-muted-foreground",children:r})]}),l.jsx(ch,{className:"h-5 w-5 text-muted-foreground shrink-0"})]})}function GX(){const[e,t]=y.useState(null);return e?l.jsxs("div",{className:"space-y-4",children:[l.jsxs("button",{onClick:()=>t(null),className:"flex items-center gap-1.5 text-xs font-semibold text-muted-foreground hover:text-foreground transition-colors cursor-pointer",children:[l.jsx(AN,{className:"h-4 w-4"})," Maschinenraum"]}),e==="modelle"?l.jsx(qO,{}):l.jsx(XO,{})]}):l.jsxs("div",{className:"space-y-4",children:[l.jsxs("div",{className:"flex items-start justify-between gap-3",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Maschinenraum"}),l.jsx("p",{className:"text-sm text-muted-foreground",children:"Nur nötig, wenn du wirklich was ändern willst."})]}),l.jsx(jE,{})]}),l.jsx(Gg,{icon:Hn,title:"Modelle",sub:"Hirne, Coder, Immer-bereit-Set, Bibliothek",onClick:()=>t("modelle")}),l.jsx(Gg,{icon:R4,title:"Wartung und Logs",sub:"Updates, Backup, Dienste, Logs, Zugangsdaten",onClick:()=>window.dispatchEvent(new CustomEvent("open-system-drawer",{detail:{tab:"maintenance"}}))}),l.jsx(Gg,{icon:wn,title:"Hermes und Verdrahtung",sub:"Agent, Gehirn-Modell, PC-Verbindung",onClick:()=>t("hermes")})]})}const VX=[{id:"start",label:"Start",icon:uh},{id:"vibe",label:"Vibe-Coding",icon:Fs},{id:"konstitution",label:"Konstitution",icon:V3},{id:"maschinenraum",label:"Maschinenraum",icon:Qu}];function qX(){const[e,t]=y.useState("start"),[r,n]=y.useState(!1),[a,o]=y.useState("maintenance"),{data:c}=Cy();y.useEffect(()=>{const f=h=>{var m;o(((m=h.detail)==null?void 0:m.tab)||"maintenance"),n(!0)};return window.addEventListener("open-system-drawer",f),()=>window.removeEventListener("open-system-drawer",f)},[]);const u=c&&c.engine_reachable&&(c.brain?c.brain.ready:!0);return l.jsxs("div",{className:"flex h-full relative",children:[l.jsx("div",{className:"fixed inset-0 -z-50 pointer-events-none overflow-hidden bg-[hsl(224,30%,6%)]",children:l.jsx("div",{className:"absolute inset-0 opacity-30 animate-aurora bg-gradient-to-tr from-teal-500/15 via-indigo-500/10 to-purple-500/15 blur-[130px]"})}),l.jsx(ZO,{open:r,onClose:()=>n(!1),defaultTab:a}),l.jsxs("aside",{className:"flex w-56 shrink-0 flex-col border-r border-border/40 bg-card/45 backdrop-blur-md",children:[l.jsxs("div",{className:"flex items-center gap-2 px-5 py-4 border-b border-border/40",children:[l.jsx("div",{className:"h-7 w-7 rounded-lg bg-primary shadow-md shadow-primary/20"}),l.jsxs("div",{className:"leading-tight",children:[l.jsx("div",{className:"text-sm font-semibold tracking-wide font-space",children:"Mission Control"}),l.jsx("div",{className:"text-[10px] text-muted-foreground",children:"3 · Prototyp"})]})]}),l.jsx("nav",{className:"flex-1 space-y-1 px-3 py-4",children:VX.map(f=>l.jsxs("button",{onClick:()=>t(f.id),className:ee("flex w-full items-center gap-3 rounded-md px-3 py-2 text-sm transition-all cursor-pointer",e===f.id?"bg-primary/15 text-primary":"text-muted-foreground hover:bg-accent hover:text-accent-foreground"),children:[l.jsx(f.icon,{className:"h-4.5 w-4.5 shrink-0"})," ",f.label]},f.id))}),l.jsxs("div",{className:"px-3 py-3 border-t border-border/40 space-y-2",children:[l.jsxs("div",{className:"flex items-center gap-2 px-2 text-xs text-muted-foreground",children:[l.jsx("span",{className:ee("h-2 w-2 rounded-full",u?"bg-emerald-500 animate-pulse":"bg-amber-500")}),u?"Box läuft":"prüfen"]}),l.jsxs("a",{href:"#dashboard",className:"flex items-center gap-1.5 rounded-md px-2 py-1.5 text-[11px] text-muted-foreground hover:text-foreground transition-colors",children:[l.jsx(AN,{className:"h-3.5 w-3.5"})," zurück zu MC2"]})]})]}),l.jsxs("main",{className:"flex-1 min-w-0 overflow-y-auto p-6 scrollbar-thin",children:[e==="start"&&l.jsx(KX,{}),e==="vibe"&&l.jsx(QO,{}),e==="konstitution"&&l.jsx(YO,{}),e==="maschinenraum"&&l.jsx(GX,{})]})]})}function QX(){var j,k,S,N,E;WD();const[e,t]=y.useState(()=>{const A=window.location.hash.slice(1);return mu.some(P=>P.id===A)?A:"dashboard"}),r=y.useCallback(A=>{window.location.hash.slice(1)===A?t(A):window.location.hash=A},[]),[n,a]=y.useState(()=>localStorage.getItem("mc_sidebar_collapsed")==="true"),[o,c]=y.useState(!1),[u,f]=y.useState("maintenance"),[h,m]=y.useState(()=>window.location.hash==="#mc3"),{data:g}=Cy(),{data:v}=Po(2e4);y.useEffect(()=>{document.documentElement.classList.add("dark")},[]),y.useEffect(()=>{const A=P=>{var O;f(((O=P.detail)==null?void 0:O.tab)||"maintenance"),c(!0)};return window.addEventListener("open-system-drawer",A),()=>window.removeEventListener("open-system-drawer",A)},[]),y.useEffect(()=>{const A=P=>{var O;const _=(O=P.detail)==null?void 0:O.view;_&&r(_)};return window.addEventListener("mc-navigate",A),()=>window.removeEventListener("mc-navigate",A)},[r]),y.useEffect(()=>{const A=()=>{m(window.location.hash==="#mc3");const P=window.location.hash.slice(1);mu.some(_=>_.id===P)&&t(P)};return window.addEventListener("hashchange",A),()=>window.removeEventListener("hashchange",A)},[]);const b=mu.find(A=>A.id===e);return h?l.jsx(qX,{}):l.jsxs("div",{className:"flex h-full relative",children:[l.jsxs("div",{className:"fixed inset-0 -z-50 pointer-events-none overflow-hidden bg-[hsl(224,30%,6%)]",children:[l.jsx("div",{className:"absolute inset-0 opacity-35 animate-aurora bg-gradient-to-tr from-teal-500/20 via-indigo-500/15 to-purple-500/20 blur-[130px]"}),l.jsx("div",{className:"absolute top-[-10%] left-[-10%] h-[50%] w-[50%] rounded-full bg-teal-500/15 blur-[160px]"}),l.jsx("div",{className:"absolute bottom-[-10%] right-[-10%] h-[50%] w-[50%] rounded-full bg-purple-500/15 blur-[160px]"}),l.jsx("div",{className:"absolute top-[30%] right-[20%] h-[40%] w-[40%] rounded-full bg-indigo-500/10 blur-[140px]"})]}),l.jsx(YT,{onNavigate:r}),l.jsx(ZO,{open:o,onClose:()=>c(!1),defaultTab:u}),l.jsxs("aside",{className:ee("flex shrink-0 flex-col border-r border-border/40 bg-card/45 backdrop-blur-md transition-all duration-300 ease-in-out",n?"w-16":"w-60"),children:[l.jsxs("div",{className:ee("flex items-center py-4 border-b border-border/40 shrink-0",n?"flex-col gap-3 px-2":"justify-between px-5"),children:[l.jsxs("div",{className:"flex items-center gap-2 overflow-hidden",children:[l.jsx("div",{className:"h-7 w-7 rounded-lg bg-primary shadow-md shadow-primary/20 shrink-0"}),!n&&l.jsxs("div",{className:"leading-tight",children:[l.jsx("div",{className:"text-sm font-semibold tracking-wide font-space",children:"Mission Control"}),l.jsx("div",{className:"text-xs text-muted-foreground",children:"2.0"})]})]}),l.jsx("button",{onClick:()=>{a(A=>{const P=!A;return localStorage.setItem("mc_sidebar_collapsed",P.toString()),P})},className:"p-1 rounded-md hover:bg-accent text-muted-foreground transition-colors cursor-pointer","aria-label":n?"Seitenleiste ausklappen":"Seitenleiste einklappen",title:n?"Maximieren":"Minimieren",children:n?l.jsx(ch,{className:"h-4 w-4","aria-hidden":"true"}):l.jsx(Z3,{className:"h-4 w-4","aria-hidden":"true"})})]}),l.jsx("nav",{className:"flex-1 space-y-1 px-3 py-4 overflow-y-auto",children:mu.map(A=>l.jsxs("a",{href:`#${A.id}`,"aria-current":e===A.id?"page":void 0,className:ee("flex w-full items-center rounded-md text-sm transition-all cursor-pointer",n?"justify-center p-2.5":"gap-3 px-3 py-2",e===A.id?"bg-primary/15 text-primary shadow-sm shadow-primary/5":"text-muted-foreground hover:bg-accent hover:text-accent-foreground"),title:n?A.label:void 0,"aria-label":n?A.label:void 0,children:[l.jsx(A.icon,{className:"h-4.5 w-4.5 shrink-0","aria-hidden":"true"}),!n&&l.jsx("span",{className:"truncate",children:A.label})]},A.id))}),l.jsx("div",{className:ee("py-3 text-xs text-muted-foreground border-t border-border/40 shrink-0",n?"px-2 text-center":"px-5"),children:n?l.jsx("div",{className:"flex justify-center",children:l.jsx("span",{className:ee("h-2.5 w-2.5 rounded-full ring-2 ring-black/40",g?g.engine_reachable?g.brain&&!g.brain.ready?"bg-amber-500 animate-pulse":"bg-emerald-500 animate-pulse":"bg-amber-500":"bg-red-500"),title:g?g.engine_reachable?g.brain&&!g.brain.ready?`Hirn offline (${g.brain.model??"fast"})`:"Engine + Hirn online":"Engine offline":"Backend offline"})}):l.jsxs("div",{className:"space-y-2 text-left",children:[g?l.jsxs(l.Fragment,{children:[l.jsxs("span",{className:"flex items-center gap-2",children:[l.jsx("span",{className:ee("h-2 w-2 rounded-full animate-pulse",g.engine_reachable?"bg-emerald-500":"bg-amber-500")}),l.jsxs("span",{className:"truncate",children:["Engine ",g.engine_reachable?"online":"offline"]})]}),g.brain&&!g.brain.ready&&l.jsxs("span",{className:"flex items-center gap-2 text-amber-400",title:`Agent-Hirn '${g.brain.model??"fast"}' lädt nicht/abgestürzt`,children:[l.jsx("span",{className:"h-2 w-2 rounded-full bg-amber-500 animate-pulse"}),l.jsxs("span",{className:"truncate",children:["Hirn offline",g.brain.model?` (${g.brain.model})`:""]})]})]}):l.jsxs("span",{className:"flex items-center gap-2",children:[l.jsx("span",{className:"h-2 w-2 rounded-full bg-red-500"})," ",l.jsx("span",{className:"truncate",children:"Backend offline"})]}),(v==null?void 0:v.versions)&&l.jsxs("div",{className:"space-y-1 text-[9px] text-muted-foreground/60 mt-2 pt-2 border-t border-border/30",children:[l.jsxs("div",{className:"truncate",title:v.versions.mc2?`${v.versions.mc2.branch}-${v.versions.mc2.hash}${v.versions.mc2.dirty?"*":""} (${v.versions.mc2.date})`:"nicht gefunden",children:[l.jsx("strong",{children:"MC2:"})," ",v.versions.mc2?`${v.versions.mc2.hash}${v.versions.mc2.dirty?"*":""}`:"—"]}),l.jsxs("div",{className:"truncate",title:((j=v.versions.engine)==null?void 0:j.type)==="git"?`${v.versions.engine.branch}-${v.versions.engine.hash}${v.versions.engine.dirty?"*":""} (${v.versions.engine.date})`:((k=v.versions.engine)==null?void 0:k.version_text)||"unbekannt",children:[l.jsx("strong",{children:"Engine:"})," ",((S=v.versions.engine)==null?void 0:S.type)==="git"?`${v.versions.engine.hash}${v.versions.engine.dirty?"*":""}`:((E=(N=v.versions.engine)==null?void 0:N.version_text)==null?void 0:E.split(" ").pop())||"—"]}),l.jsxs("div",{className:"truncate",title:v.versions.hermes_ui?`${v.versions.hermes_ui.branch}-${v.versions.hermes_ui.hash}${v.versions.hermes_ui.dirty?"*":""} (${v.versions.hermes_ui.date})`:"nicht gefunden",children:[l.jsx("strong",{children:"Hermes UI:"})," ",v.versions.hermes_ui?`${v.versions.hermes_ui.hash}${v.versions.hermes_ui.dirty?"*":""}`:"—"]}),l.jsxs("div",{className:"truncate",title:v.versions.hermes_agent?`${v.versions.hermes_agent.branch}-${v.versions.hermes_agent.hash}${v.versions.hermes_agent.dirty?"*":""} (${v.versions.hermes_agent.date})`:"nicht gefunden",children:[l.jsx("strong",{children:"Hermes Agent:"})," ",v.versions.hermes_agent?`${v.versions.hermes_agent.hash}${v.versions.hermes_agent.dirty?"*":""}`:"—"]})]})]})})]}),l.jsxs("div",{className:"flex min-w-0 flex-1 flex-col",children:[l.jsxs("header",{className:"flex h-14 shrink-0 items-center justify-between border-b border-border/40 px-6 bg-card/20 backdrop-blur-sm",children:[l.jsx("div",{className:"text-xs font-medium text-muted-foreground tracking-wide uppercase font-sans",children:b.hint}),l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(jE,{}),l.jsx("a",{href:"https://git.tobisniceshomelab.ddnsfree.com/Hitonabi/mission-control-v2/src/branch/main/docs/BEDIENUNG.md",target:"_blank",rel:"noopener",className:"flex h-8 items-center rounded-md border border-border/40 bg-background/40 px-2.5 text-xs text-muted-foreground hover:bg-accent hover:text-accent-foreground transition-all cursor-pointer font-semibold",title:"Bedien-Anleitung",children:"Hilfe"}),l.jsxs("button",{onClick:()=>{const A=new KeyboardEvent("keydown",{key:"k",metaKey:!0});document.dispatchEvent(A)},className:"flex items-center gap-2 rounded-md border border-border/40 bg-background/40 px-2.5 py-1.5 text-xs text-muted-foreground hover:bg-accent hover:text-accent-foreground transition-all cursor-pointer",children:[l.jsx(a4,{className:"h-3.5 w-3.5"}),l.jsx("span",{children:"Suchen"}),l.jsx("kbd",{className:"rounded bg-muted px-1.5 py-0.5 font-mono text-[9px]",children:"⌘K"})]})]})]}),l.jsxs("main",{className:"flex-1 overflow-y-auto p-6 scrollbar-thin",children:[e==="dashboard"&&l.jsx(yX,{}),e==="models"&&l.jsx(_X,{}),e==="connect"&&l.jsx(QO,{}),e==="memory"&&l.jsx(YO,{}),e==="agent"&&l.jsx(XO,{}),e==="terminal"&&l.jsx(FX,{}),e==="guide"&&l.jsx(UX,{}),!["dashboard","models","connect","memory","agent","terminal","guide"].includes(e)&&l.jsx(HX,{title:b.label,hint:b.hint})]})]})]})}const YX=new O3({defaultOptions:{queries:{retry:1,refetchOnWindowFocus:!1,staleTime:5e3}}});i3.createRoot(document.getElementById("root")).render(l.jsx(fN.StrictMode,{children:l.jsx(_3,{client:YX,children:l.jsx(QX,{})})}));export{Xa as R,ys as S,cv as T,T4 as a,vy as g,l as j,y as r}; +...`}),l.jsxs("p",{children:["Suchen & installieren über die ",l.jsx("strong",{children:"skills.sh"}),"-Registry: ",l.jsx(ze,{children:"npx skills find"})," /",l.jsx(ze,{children:"npx skills add owner/repo"}),". Skills liegen projektweit (vom Agent beim Start gelesen) oder global."]})]}),l.jsxs(Rr,{id:"memory",icon:s4,color:"text-indigo-400",title:"8. Gedächtnis & RAG",kicker:"Modelle vergessen — du nicht",wide:!0,children:[l.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:["LLMs sind ",l.jsx("strong",{children:"zustandslos"}),": ohne Hilfe weiß das Modell beim nächsten Turn nichts mehr. Gedächtnis lebt extern."]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Embeddings"})," wandeln Text in Vektoren; ein ",l.jsx("strong",{children:"Vektor-Store"})," (Chroma, …) findet semantisch Ähnliches."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"RAG"})," = relevante Fakten vor dem Turn heraussuchen und einblenden statt alles im Prompt zu halten."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Long-Context vs. RAG:"}),' riesige Fenster sind bequem, aber teuer & „lost in the middle" — gezieltes Abrufen skaliert besser.']})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:[l.jsx("strong",{children:"Auto-lernendes Gedächtnis"})," ist die nächste Stufe:"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:["extrahiert Fakten ",l.jsx("em",{children:"selbst"})," aus Gesprächen, statt nur abzuspeichern"]}),l.jsx("li",{children:"dedupliziert semantisch (kein 10× derselbe Fakt)"}),l.jsxs("li",{children:[l.jsx("strong",{children:"Graph-Sicht"})," = Fakten ",l.jsx("em",{children:"plus"})," ihre Beziehungen, nicht nur eine flache Liste"]})]})]})]}),l.jsxs(Va,{children:["Dein Gedächtnis (Tab ",l.jsx("strong",{children:"Gedächtnis"}),") ist ",l.jsx("strong",{children:"Mem0"}),"-basiert: auto-lernend & semantisch, ",l.jsx("strong",{children:"graph-first"})," dargestellt, mit 4-Typen-Taxonomie (",l.jsx(ze,{children:"Identität"})," · ",l.jsx(ze,{children:"Wissen"})," · ",l.jsx(ze,{children:"Regeln"})," · ",l.jsx(ze,{children:"Ereignisse"}),"). Einstieg über ein kurzes ",l.jsx("strong",{children:"Hermes-Onboarding-Gespräch"})," im Terminal — der Agent lernt im Hintergrund nach jedem Turn.",l.jsx("br",{}),l.jsx("strong",{children:"Gotcha:"})," ein gelöschter Fakt kann wieder auftauchen, solange die Original-Nachricht noch im Verlauf steht (additive Extraktion)."]})]}),l.jsxs(Rr,{id:"agents",icon:wn,color:"text-rose-400",title:"9. Autonome Agenten betreiben",kicker:"LLM in der Schleife",wide:!0,children:[l.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:["Ein ",l.jsx("strong",{children:"Agent"})," ist ein LLM in einer Schleife mit Tools:",l.jsx("em",{children:" denken → Tool aufrufen → Ergebnis beobachten → weiter"}),", bis das Ziel erreicht ist."]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Guardrails"})," (Hard-Stop, Tool-Limits) verhindern Endlos-Loops, wenn ein Tool fehlt oder hängt."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Kontext-Hygiene"})," ist die wichtigste Disziplin: frische Sessions starten — vollgemüllte Historien werden langsam, driften und halluzinieren."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Kanäle:"})," CLI/Terminal, Chat-UI, Messaging (z.B. Telegram), reine API."]})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:[l.jsx("strong",{children:"Least Privilege:"})," gib einem Agenten nur die Tools, die er wirklich braucht. Kritische Aktionen (Shell auf dem Host, Löschen, Geld/Deploys) hinter menschliche Freigabe."]}),l.jsxs("p",{children:[l.jsx("strong",{children:"Was sich vollautomatisch lohnt:"})," Modell-Routing, Hintergrund-Gedächtnis, Recherche. ",l.jsx("strong",{children:"Was Freigabe braucht:"})," Systembefehle, Updates/Reboots, permanentes Löschen."]})]})]}),l.jsxs(Va,{children:[l.jsx("strong",{children:"Hermes"})," ist dein Box-Agent (Hirn = ",l.jsx(ze,{children:"fast"}),"). Reden tust du mit ihm im",l.jsx("strong",{children:" Terminal"}),"-Tab (Web-Terminal via ttyd) oder per ",l.jsx("strong",{children:"Telegram"}),". Er hat MCP-Server für Gedächtnis, Stack-Steuerung, Web-Fetch und ",l.jsx("strong",{children:"PC-Steuerung"})," (Executor auf deinem Windows-PC). Status & Verdrahtung im ",l.jsx("strong",{children:"Hermes"}),"-Tab."]})]}),l.jsxs(Rr,{id:"ide",icon:Bs,color:"text-cyan-400",title:"10. IDE / Editor anbinden",kicker:"Vibe-Coding lokal",children:[l.jsxs("p",{children:["Jede ",l.jsx("strong",{children:"OpenAI-kompatible"})," IDE oder Extension lässt sich auf einen lokalen Server umbiegen — Base-URL + Model eintragen, fertig:"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Cline"})," & ",l.jsx("strong",{children:"Roo Code"})," (VS-Code-Extensions, voller Agent + MCP)"]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Cursor"})," (VS-Code-Fork mit Top-Autocomplete)"]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Continue"}),", ",l.jsx("strong",{children:"aider"})," (CLI), ",l.jsx("strong",{children:"OpenCode"})," (Desktop)"]})]}),l.jsxs(Va,{children:["Tipp den Kram nicht ab: der ",l.jsx("strong",{children:"Verbinden"}),"-Tab generiert die fertige Config (inkl. MCP-Gedächtnis) pro Tool zum Kopieren. Essenz: Base ",l.jsx(ze,{children:"…:9001/v1"}),", Model ",l.jsx(ze,{children:"auto"}),", Key beliebig."]})]}),l.jsx(Rr,{id:"tricks",icon:x4,color:"text-amber-400",title:"11. Tricks & Kniffe",kicker:"Was im Alltag wirklich spart",wide:!0,children:l.jsx("div",{className:"grid md:grid-cols-3 gap-3",children:[["Kontext sauber halten","Neue Session statt Mega-Historie. Drift, Tempo und Halluzination hängen direkt am Kontext-Müll."],["Plan-then-Act","Erst Plan/Vorgehen bestätigen lassen, dann ausführen. Spart teure Holzwege."],["Gezielte Edits","Nie ganze Dateien überschreiben für eine Zeile — Such-/Ersetz-Tools nutzen. Weniger Tokens, weniger Fehler."],["Non-interaktive Befehle","Keine interaktiven Prompts im Agent-Terminal; lange Tasks als Background-Job. Sonst hängt der Loop."],["DevTools koppeln","Browser-/Konsolen-Zugriff geben — der Agent liest echte Fehler statt blind zu raten."],["Richtige Modellwahl","Schnelles Hirn für Alltag, großes für harte Logik, Coder fürs Coden. Nicht alles mit der Kanone."],["Akzeptanzkriterien","Sag konkret, woran „fertig“ erkennbar ist. Vage Prompts → vage Ergebnisse."],["Verifizieren statt vertrauen","Tests/Live-Check fordern. „Sollte funktionieren“ ist kein Beweis."],["Regeln ins Gedächtnis","Wiederkehrende Vorlieben/Konventionen einmal ablegen — der Agent zieht sie selbst."]].map(([r,n])=>l.jsxs("div",{className:"space-y-1 p-3 bg-background/10 rounded-xl border border-border/30",children:[l.jsxs("div",{className:"flex items-center gap-1.5 font-bold text-foreground text-[11px]",children:[l.jsx(xa,{className:"h-3 w-3 text-amber-400"})," ",r]}),l.jsx("p",{className:"text-[11px]",children:n})]},r))})}),l.jsx(Rr,{id:"wartung",icon:ks,color:"text-emerald-400",title:"12. Sicherheit & Wartung",kicker:"Damit's auch morgen noch läuft",wide:!0,children:l.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{className:"flex items-center gap-1.5 font-bold text-foreground",children:[l.jsx(_N,{className:"h-3.5 w-3.5 text-emerald-400"})," Goldene Regeln"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Ein ungetesteter Restore ist kein Backup."})," Wiederherstellung mindestens einmal echt durchspielen."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Updates können Dinge still zerschießen"})," — gerade bei AI-Stacks (Embeddings, Provider-Interna). Versionen pinnen, Smoke-Test, Post-Check."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Least Privilege"})," für Agenten, MCP-Server und PC-Zugriff. Kritisches hinter Freigabe."]})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{className:"flex items-center gap-1.5 font-bold text-foreground",children:[l.jsx(Qu,{className:"h-3.5 w-3.5 text-emerald-400"})," Bei dir im SystemDrawer"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Backup:"})," tägliches Voll-Zustands-Backup, getesteter ",l.jsx(ze,{children:"restore.sh"})," (Doku in ",l.jsx(ze,{children:"docs/BACKUP.md"}),")."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Updates:"})," git-basierter Update-Check; ",l.jsx("strong",{children:"Hermes-Update-Button"})," mit anschließendem ",l.jsx("strong",{children:"Gehirn-Check"})," (rot, falls das Update das Gedächtnis zerschießt) + Engine-Update."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Dienste & Gefahrenzone:"})," Restart/Logs pro Dienst, kritische Eingriffe getrennt."]})]}),l.jsx("p",{className:"text-[10px] italic",children:'Erreichbar über das System-Icon → Tab „Wartung".'})]})]})}),l.jsxs("section",{id:"ressourcen",className:"scroll-mt-20 md:col-span-2 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 shadow-lg shadow-black/10 space-y-4",children:[l.jsxs("div",{className:"flex items-center gap-2.5 border-b border-border/20 pb-3",children:[l.jsx(lv,{className:"h-5 w-5 text-primary"}),l.jsxs("div",{children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"13. Kuratierte Ressourcen & Links"}),l.jsx("span",{className:"text-[9px] font-mono text-primary",children:"Sauber geordnet — die guten Quellen"})]})]}),l.jsxs("div",{className:"grid md:grid-cols-2 gap-5 text-xs",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"font-bold text-foreground flex items-center gap-1.5",children:[l.jsx(lf,{className:"h-3.5 w-3.5 text-sky-400"})," Modelle & Engines"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1.5",children:[l.jsx(kt,{href:"https://huggingface.co/models",name:"Hugging Face",note:"das Repository für offene Modelle (GGUF, Embeddings, Datasets)."}),l.jsx(kt,{href:"https://github.com/ggml-org/llama.cpp",name:"llama.cpp",note:"die Referenz-Engine für lokale Inferenz."}),l.jsx(kt,{href:"https://github.com/mostlygeek/llama-swap",name:"llama-swap",note:"mehrere Modelle hinter einem Port, Auto-Swap."}),l.jsx(kt,{href:"https://ollama.com",name:"Ollama",note:"einfachster Einstieg, One-Command-Modelle."}),l.jsx(kt,{href:"https://lmstudio.ai",name:"LM Studio",note:"lokale GUI zum Stöbern, Laden & Chatten."}),l.jsx(kt,{href:"https://github.com/vllm-project/vllm",name:"vLLM",note:"Hochdurchsatz-Serving auf dicken GPUs."})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"font-bold text-foreground flex items-center gap-1.5",children:[l.jsx(cf,{className:"h-3.5 w-3.5 text-violet-400"})," MCP & Skills"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1.5",children:[l.jsx(kt,{href:"https://modelcontextprotocol.io",name:"MCP — offizielle Doku",note:"Spezifikation & Einstieg."}),l.jsx(kt,{href:"https://github.com/modelcontextprotocol/servers",name:"Offizielle MCP-Server",note:"filesystem, git, postgres, fetch & mehr."}),l.jsx(kt,{href:"https://smithery.ai",name:"Smithery",note:"Registry zum Suchen & Auto-Installieren von MCP-Servern."}),l.jsx(kt,{href:"https://glama.ai/mcp/servers",name:"Glama MCP Registry",note:"kuratierte Community-Datenbank."}),l.jsx(kt,{href:"https://skills.sh",name:"skills.sh",note:"Registry & CLI für Agent-Skills."})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"font-bold text-foreground flex items-center gap-1.5",children:[l.jsx(wn,{className:"h-3.5 w-3.5 text-rose-400"})," Agenten & Frameworks"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1.5",children:[l.jsx(kt,{href:"https://github.com/NousResearch/hermes-agent",name:"Hermes Agent (Nous)",note:"der Agent, der auf deiner Box läuft."}),l.jsx(kt,{href:"https://docs.claude.com",name:"Anthropic / Claude Docs",note:"API, Tool-Use, Agent SDK, MCP."}),l.jsx(kt,{href:"https://github.com/cline/cline",name:"Cline",note:"autonomer Coding-Agent für VS Code."}),l.jsx(kt,{href:"https://aider.chat",name:"aider",note:"AI-Pair-Programming im Terminal, git-nativ."}),l.jsx(kt,{href:"https://continue.dev",name:"Continue",note:"Open-Source-Autopilot für IDEs."})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"font-bold text-foreground flex items-center gap-1.5",children:[l.jsx(sv,{className:"h-3.5 w-3.5 text-amber-400"})," Lernen & Community"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1.5",children:[l.jsx(kt,{href:"https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/overview",name:"Prompt-Engineering (Anthropic)",note:"die beste praktische Anleitung."}),l.jsx(kt,{href:"https://github.com/anthropics/anthropic-cookbook",name:"Anthropic Cookbook",note:"lauffähige Rezepte für Tools, RAG, Agenten."}),l.jsx(kt,{href:"https://www.promptingguide.ai",name:"Prompt Engineering Guide",note:"herstellerneutrales Nachschlagewerk."}),l.jsx(kt,{href:"https://github.com/mem0ai/mem0",name:"Mem0",note:"die auto-lernende Memory-Schicht hinter deinem Gedächtnis."}),l.jsx(kt,{href:"https://www.reddit.com/r/LocalLLaMA/",name:"r/LocalLLaMA",note:"der Puls der lokalen-LLM-Szene."})]})]})]})]}),l.jsx(Rr,{id:"troubleshooting",icon:y4,color:"text-rose-400",title:"14. Troubleshooting",kicker:"Wenn's hakt",wide:!0,children:l.jsxs("ul",{className:"space-y-2 list-disc pl-4",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Keine Verbindung?"})," Selbes LAN wie die Box? IP/Port stimmen (",l.jsx(ze,{children:":9001"}),")? Backend-Status in der ",l.jsx("strong",{children:"Zentrale"})," prüfen."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Modell antwortet nicht / langsam?"})," In der ",l.jsx("strong",{children:"Zentrale → Dienste"})," schauen, ob ",l.jsx(ze,{children:"llama-swap"})," grün ist; sonst Restart. Erstes Token nach Swap dauert (Modell lädt)."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Agent dreht durch / halluziniert?"})," Frische Session im ",l.jsx("strong",{children:"Terminal"})," starten — meist ist es vollgemüllter Kontext."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Gedächtnis findet nichts?"})," Embedding-Dienst online? Semantisch suchen (Sinn statt exaktem Wort). Leeres Gedächtnis → Hermes-Onboarding starten."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Update hat etwas zerschossen?"})," Genau dafür gibt es Backup & ",l.jsx(ze,{children:"restore.sh"})," — den getesteten Restore fahren, dann Ursache suchen."]})]})})]}),l.jsx("p",{className:"text-center text-[10px] text-muted-foreground/50 pt-2",children:"Mission Control 2 · AI-Bibel · Stand Juni 2026 — lebendes Dokument, wächst mit dem Stack."})]})}function HX({title:e,hint:t}){return l.jsxs("div",{className:"space-y-4",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-xl font-semibold",children:e}),l.jsx("p",{className:"text-sm text-muted-foreground",children:t})]}),l.jsxs("div",{className:"flex flex-col items-center justify-center gap-3 rounded-xl border border-dashed border-border bg-card/50 py-20 text-center",children:[l.jsx(o4,{className:"h-8 w-8 text-muted-foreground"}),l.jsx("div",{className:"text-sm text-muted-foreground",children:"Kommt in einer späteren Phase."})]})]})}const rN=[{id:"mission-control-2",label:"Mission Control",type:"user",reach:"gateway (integr"},{id:"hermes-gateway",label:"Hermes Gateway",type:"user",reach:"hermes-gateway"},{id:"mem0-service",label:"Mem0 (Gedächtnis)",type:"user",reach:"mem0"},{id:"hermes-terminal",label:"Hermes Terminal",type:"user",reach:"hermes-terminal"},{id:"llama-swap",label:"Llama Swap",type:"system",reach:"llama-swap"}];function fu({icon:e,iconClass:t,name:r,status:n,available:a,busy:o,actionLabel:c,onAction:u}){return l.jsxs("div",{className:ee("flex items-center gap-3 rounded-lg border px-3 py-2",a?"border-amber-500/30 bg-amber-500/5":"border-border/50 bg-background/20"),children:[l.jsx(e,{className:ee("h-4 w-4 shrink-0",t)}),l.jsxs("div",{className:"flex-1 min-w-0",children:[l.jsx("div",{className:"text-xs text-foreground truncate",children:r}),l.jsx("div",{className:ee("text-[10px] truncate",a?"text-amber-400/90":"text-muted-foreground"),children:n})]}),l.jsx("button",{onClick:u,disabled:!a||o,className:ee("text-[11px] font-semibold rounded-lg px-2.5 py-1 transition-colors shrink-0",a?"bg-primary text-primary-foreground hover:opacity-90 cursor-pointer":"border border-border/50 text-muted-foreground/40 cursor-default"),children:o?"…":c})]})}function WX({label:e,ok:t,system:r,busy:n,onRestart:a,onLogs:o}){return l.jsxs("div",{className:"flex items-center gap-2.5 rounded-lg border border-border/50 bg-background/20 px-3 py-2",children:[l.jsx("span",{className:ee("w-1.5 h-1.5 rounded-full shrink-0",t===!0?"bg-emerald-500":t===!1?"bg-red-500":"bg-muted-foreground/40")}),l.jsxs("span",{className:"flex-1 text-xs text-foreground truncate",children:[e,r&&l.jsx("span",{className:"text-[9px] text-muted-foreground",children:" (root)"})]}),l.jsx("button",{onClick:a,disabled:n,title:"Neu starten",className:"text-muted-foreground hover:text-primary transition-colors disabled:opacity-50",children:l.jsx(Xa,{className:ee("h-3.5 w-3.5",n&&"animate-spin")})}),l.jsx("button",{onClick:o,title:"Logs ansehen",className:"text-muted-foreground hover:text-primary transition-colors",children:l.jsx(l4,{className:"h-3.5 w-3.5"})})]})}function Kg(e){return e==null?"":e>1024**3?`${(e/1024**3).toFixed(2)} GB`:`${(e/1024**2).toFixed(1)} MB`}function ZO({open:e,onClose:t,defaultTab:r="maintenance"}){var Ti;const[n,a]=y.useState(null),[o,c]=y.useState([]),[u,f]=y.useState("llama-swap"),[h,m]=y.useState(""),[g,v]=y.useState(!1),[b,j]=y.useState(null),[k,S]=y.useState({}),[N,E]=y.useState("maintenance"),[A,P]=y.useState(!1),[_,O]=y.useState(""),[D,U]=y.useState(!1),[B,F]=y.useState(null),[Y,H]=y.useState([]),[pe,ue]=y.useState(!1),[he,ae]=y.useState(null),[se,X]=y.useState(null);function te($,Le,cr){X({type:"alert",title:$,message:Le,onConfirm:()=>{X(null),cr&&cr()}})}function J($,Le,cr){X({type:"confirm",title:$,message:Le,onConfirm:()=>{X(null),cr()},onCancel:()=>X(null)})}function I($){return $?new Date($*1e3).toLocaleString("de-DE",{day:"2-digit",month:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}):"Nie"}const[M,K]=y.useState(""),[ne,Z]=y.useState(""),[me,ge]=y.useState(!1),[Pe,re]=y.useState(!1);y.useEffect(()=>{e&&(K(localStorage.getItem("mc_sudo_password")||""),Z(localStorage.getItem("mc_hf_token")||""))},[e]),y.useEffect(()=>{e&&r&&E(r)},[e,r]);const xe=y.useRef(null);function _e(){Se("/api/maintenance/updates").then(a).catch($=>console.error("Error loading updates",$))}function ie(){Se("/api/jobs").then($=>c($.jobs||[])).catch($=>console.error("Error loading jobs",$))}function Je(){Se("/api/system/services").then(F).catch(()=>{})}function Fe(){Se("/api/system/backups").then($=>H($.backups||[])).catch(()=>{})}function Oe($){v(!0),j(null),Se(`/api/maintenance/logs?service=${$}&lines=150`).then(Le=>{Le.ok?m(Le.text):(m(`Fehler beim Laden der Logs: ${Le.err||"Unbekannter Fehler"}`),(Le.status==="incorrect_password"||Le.status==="password_required")&&j(Le.status))}).catch(Le=>m(`Fehler: ${Le.message}`)).finally(()=>{v(!1),setTimeout(()=>{xe.current&&(xe.current.scrollTop=xe.current.scrollHeight)},50)})}y.useEffect(()=>{if(!e)return;_e(),ie(),Je(),Fe();const $=setInterval(()=>{ie(),_e(),Je()},3e3);return()=>clearInterval($)},[e]),y.useEffect(()=>{!e||N!=="logs"||Oe(u)},[e,N,u]);function ut($){return($==null?void 0:$.status)==="busy"?(te("Update läuft bereits",`Es läuft gerade „${$.running}". Bitte warte, bis es fertig ist.`),ie(),!0):!1}async function Jt(){try{const $=await Se("/api/maintenance/os-update",{method:"POST"});if(ut($))return;ie(),E("maintenance")}catch($){te("Fehler",`Fehler beim Starten des OS-Updates: ${$.message}`)}}async function W(){try{const $=await Se("/api/maintenance/engine-update",{method:"POST"});if(ut($))return;ie(),E("maintenance")}catch($){te("Fehler",`Fehler beim Engine-Update: ${$.message}`)}}async function ke(){try{const $=await Se("/api/maintenance/swap-update",{method:"POST"});if(ut($))return;ie(),E("maintenance")}catch($){te("Fehler",`Fehler beim Router-Update: ${$.message}`)}}async function Ae(){ue(!0);try{const $=await Se("/api/maintenance/hermes-update",{method:"POST"});if(ut($))return;ie()}catch($){te("Fehler",`Hermes-Update fehlgeschlagen: ${$.message}`)}finally{ue(!1)}}async function Be($){ae({kind:$,loading:!0,data:null});try{const Le=await Se(`/api/maintenance/update-details?kind=${$}`);ae({kind:$,loading:!1,data:Le})}catch(Le){ae({kind:$,loading:!1,data:{kind:$,error:Le.message}})}}function et(){const $=he==null?void 0:he.kind;ae(null),$==="os"?Jt():$==="engine"?W():$==="swap"?ke():$==="hermes"&&Ae()}async function Ut(){P(!0);try{await Se("/api/maintenance/check-updates",{method:"POST"}),ie(),E("maintenance")}catch($){te("Fehler",`Fehler bei der Update-Suche: ${$.message}`)}finally{P(!1)}}async function ht($,Le){try{await Se("/api/models/install",{method:"POST",body:JSON.stringify({repo:$,role:Le})}),te("Gestartet",`Modell-Upgrade für '${Le}' (${$}) gestartet.`),ie(),E("maintenance")}catch(cr){te("Fehler",`Fehler beim Starten des Modell-Upgrades: ${cr.message}`)}}async function ur(){J("Reboot bestätigen","Bist du sicher, dass du das gesamte Host-System neu starten willst?",async()=>{try{await Se("/api/maintenance/reboot",{method:"POST"}),te("Reboot","Reboot ausgelöst. System startet neu...",()=>{t()})}catch($){te("Fehler",`Fehler beim Reboot: ${$.message}`)}})}async function Ca(){U(!0),O("Snapshot wird erzeugt...");try{const $=await Se("/api/system/backup",{method:"POST"});O($.ok?`Snapshot erzeugt: ${$.snapshot} (${$.files.length} Komponenten)`:"Backup fehlgeschlagen."),Fe()}catch($){O(`Fehler: ${$.message}`)}finally{U(!1)}}async function Jn($){S(Le=>({...Le,[$]:!0}));try{const Le=await Se("/api/maintenance/restart",{method:"POST",body:JSON.stringify({service:$})});Le.ok?te("Dienst neu gestartet",`Dienst ${$} wurde erfolgreich neu gestartet.`,()=>{N==="logs"&&u===$&&Oe($)}):te("Fehler",`Fehler beim Neustart: ${Le.err||"Unbekannter Fehler"}`)}catch(Le){te("Fehler",`Fehler beim Neustart: ${Le.message}`)}finally{S(Le=>({...Le,[$]:!1}))}}async function Ii($){try{await Se(`/api/jobs/${$}/cancel`,{method:"POST"}),ie()}catch(Le){te("Fehler",`Fehler beim Abbrechen: ${Le.message}`)}}const Or=o.find($=>($.state==="running"||$.state==="queued")&&$.group==="maintenance");return l.jsxs(l.Fragment,{children:[l.jsx("div",{className:ee("fixed inset-0 bg-black/60 backdrop-blur-sm z-50 transition-opacity duration-300",e?"opacity-100 pointer-events-auto":"opacity-0 pointer-events-none"),onClick:t}),l.jsxs("div",{className:ee("fixed inset-y-0 right-0 w-full sm:w-[640px] bg-card/85 backdrop-blur-xl border-l border-border/60 shadow-2xl z-50 flex flex-col transform transition-transform duration-300 ease-in-out font-sans text-foreground",e?"translate-x-0":"translate-x-full"),children:[l.jsxs("div",{className:"flex h-16 shrink-0 items-center justify-between border-b border-border/40 px-6",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(Hn,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold tracking-wide uppercase font-space",children:"OS-Zentrale & Pflege"})]}),l.jsx("button",{onClick:t,className:"flex h-8 w-8 items-center justify-center rounded-lg border border-border/40 text-muted-foreground hover:bg-accent transition-colors",children:l.jsx(Wn,{className:"h-4 w-4"})})]}),l.jsxs("div",{className:"flex border-b border-border/40 px-6",children:[l.jsx("button",{onClick:()=>E("maintenance"),className:ee("flex-1 py-3 text-xs font-semibold uppercase tracking-wider border-b-2 text-center transition-all",N==="maintenance"?"border-primary text-primary":"border-transparent text-muted-foreground hover:text-foreground"),children:"System-Wartung"}),l.jsx("button",{onClick:()=>E("logs"),className:ee("flex-1 py-3 text-xs font-semibold uppercase tracking-wider border-b-2 text-center transition-all",N==="logs"?"border-primary text-primary":"border-transparent text-muted-foreground hover:text-foreground"),children:"System-Logs"}),l.jsx("button",{onClick:()=>E("settings"),className:ee("flex-1 py-3 text-xs font-semibold uppercase tracking-wider border-b-2 text-center transition-all",N==="settings"?"border-primary text-primary":"border-transparent text-muted-foreground hover:text-foreground"),children:"Einstellungen"})]}),l.jsxs("div",{className:"flex-1 overflow-y-auto p-6 space-y-6",children:[N==="maintenance"&&l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"space-y-2.5",children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Updates"}),l.jsxs("button",{onClick:Ut,disabled:A||!!Or,className:"flex items-center gap-1 text-[10px] font-semibold text-primary hover:text-primary/80 transition-colors disabled:opacity-50",children:[l.jsx(Xa,{className:ee("h-3 w-3",A&&"animate-spin")})," Nach Updates suchen"]})]}),(n==null?void 0:n.last_check)&&l.jsxs("div",{className:"text-[9px] text-muted-foreground -mt-1",children:["Zuletzt gesucht: ",I(n.last_check)]}),Or&&l.jsxs("div",{className:"flex items-center gap-2 rounded-lg border border-amber-500/30 bg-amber-500/10 px-3 py-2 text-[11px] text-amber-300",children:[l.jsx(Xa,{className:"h-3.5 w-3.5 shrink-0 animate-spin"}),l.jsxs("span",{children:["Update läuft: ",l.jsx("span",{className:"font-semibold",children:Or.label})," — bitte warten. Weitere Updates sind solange gesperrt."]})]}),l.jsxs("div",{className:"space-y-1.5",children:[l.jsx(fu,{icon:ks,iconClass:"text-cyan-400",name:"OS-Pakete (apt)",available:!!(n!=null&&n.os),status:n!=null&&n.os?`${n.os} verfügbar`:"aktuell",actionLabel:"Anzeigen",onAction:()=>Be("os")}),l.jsx(fu,{icon:ff,iconClass:"text-violet-400",name:"Inferenz-Engine (llama.cpp)",available:!!(n!=null&&n.engine),status:n!=null&&n.engine?"Update verfügbar":"aktuell",actionLabel:"Anzeigen",onAction:()=>Be("engine")}),l.jsx(fu,{icon:vw,iconClass:"text-fuchsia-400",name:"Router (llama-swap)",available:!!(n!=null&&n.swap),status:n!=null&&n.swap?"Update verfügbar":"aktuell",actionLabel:"Anzeigen",onAction:()=>Be("swap")}),(()=>{var Le;const $=(Le=n==null?void 0:n.components)==null?void 0:Le.find(cr=>cr.key==="hermes_agent");return l.jsx(fu,{icon:wn,iconClass:"text-amber-400",name:"Hermes-Agent",available:($==null?void 0:$.update)===!0,busy:pe,status:($==null?void 0:$.update)===!0?`Update: ${$.latest}`:($==null?void 0:$.reachable)===!1?"offline":"aktuell",actionLabel:"Anzeigen",onAction:()=>Be("hermes")})})(),(Ti=n==null?void 0:n.model_list)==null?void 0:Ti.map($=>l.jsx(fu,{icon:q3,iconClass:"text-emerald-400",name:`Modell · ${$.role}`,available:!0,status:$.title,actionLabel:"Upgrade",onAction:()=>ht($.repo,$.role)},$.role))]})]}),l.jsxs("div",{className:"space-y-2.5",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Dienste"}),l.jsx("div",{className:"space-y-1.5",children:rN.map($=>{var Le;return l.jsx(WX,{label:$.label,system:$.type==="system",ok:(Le=B==null?void 0:B.services.find(cr=>cr.name.toLowerCase().includes($.reach)))==null?void 0:Le.ok,busy:k[$.id],onRestart:()=>Jn($.id),onLogs:()=>{f($.id),E("logs")}},$.id)})})]}),l.jsxs("div",{className:"space-y-2.5",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Backup"}),l.jsxs("div",{className:"rounded-lg border border-border/50 bg-background/20 px-3 py-2.5 flex items-center gap-3",children:[l.jsxs("div",{className:"flex-1 min-w-0",children:[l.jsx("div",{className:"text-xs text-foreground truncate",children:Y[0]?`Letztes: ${Y[0].snapshot}`:"Noch kein Backup"}),l.jsxs("div",{className:"text-[10px] text-muted-foreground",children:[Y.length," Snapshots · Restore per CLI (restore.sh)"]})]}),l.jsxs("button",{onClick:Ca,disabled:D,className:"flex items-center gap-1.5 text-[11px] font-semibold rounded-lg px-2.5 py-1 bg-primary text-primary-foreground hover:opacity-90 transition-all cursor-pointer disabled:opacity-50 shrink-0",children:[l.jsx(X3,{className:ee("h-3.5 w-3.5",D&&"animate-pulse")})," Snapshot"]})]}),_&&l.jsx("div",{className:"text-[10px] font-mono text-primary bg-primary/5 p-2 rounded-lg border border-primary/20 break-all leading-normal",children:_})]}),l.jsxs("div",{className:"space-y-2.5",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-red-400/80",children:"Gefahrenzone"}),l.jsxs("button",{onClick:ur,className:"flex w-full items-center gap-3 p-3 rounded-lg border border-red-500/20 bg-red-500/5 hover:bg-red-500/10 text-red-400 transition-all text-left text-xs font-semibold",children:[l.jsx(P4,{className:"h-4.5 w-4.5"}),l.jsxs("div",{children:[l.jsx("div",{children:"Host-System neu starten"}),l.jsx("div",{className:"text-[10px] text-red-400/80 font-normal",children:"Startet die ganze Box neu"})]})]})]}),l.jsxs("div",{className:"space-y-3",children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Hintergrund-Aufgaben"}),l.jsxs("span",{className:"text-[10px] font-mono bg-primary/10 text-primary px-1.5 py-0.5 rounded-full",children:[o.filter($=>$.state==="running"||$.state==="queued").length," Aktiv"]})]}),l.jsx("div",{className:"space-y-3",children:o.length===0?l.jsx("div",{className:"text-xs text-muted-foreground border border-dashed border-border/60 rounded-xl p-6 text-center",children:"Aktuell keine aktiven Hintergrund-Jobs."}):o.map($=>{const Le=$.state==="running"||$.state==="queued";return l.jsxs("div",{className:ee("p-3 rounded-xl border transition-all duration-300",Le?"border-primary/40 bg-primary/5 shadow-md shadow-primary/5":"border-border/40 bg-background/20 opacity-80"),children:[l.jsxs("div",{className:"flex items-start justify-between gap-3",children:[l.jsxs("div",{className:"space-y-1",children:[l.jsxs("div",{className:"text-xs font-semibold flex items-center gap-1.5",children:[Le&&l.jsxs("span",{className:"flex h-2 w-2 relative",children:[l.jsx("span",{className:"animate-ping absolute inline-flex h-full w-full rounded-full bg-primary opacity-75"}),l.jsx("span",{className:"relative inline-flex rounded-full h-2 w-2 bg-primary"})]}),$.label]}),l.jsxs("div",{className:"text-[10px] font-mono text-muted-foreground uppercase flex items-center gap-2",children:[l.jsxs("span",{children:["ID: ",$.id]}),l.jsx("span",{children:"•"}),l.jsx("span",{className:ee($.state==="done"&&"text-emerald-400",$.state==="failed"&&"text-red-400",$.state==="running"&&"text-primary",$.state==="queued"&&"text-amber-400",$.state==="canceled"&&"text-muted-foreground"),children:$.state})]})]}),Le&&l.jsx("button",{onClick:()=>Ii($.id),className:"text-[10px] font-semibold text-red-400 hover:text-red-300 border border-red-500/20 bg-red-500/5 hover:bg-red-500/10 px-2 py-0.5 rounded transition-colors",children:"Abbrechen"})]}),$.state==="running"&&l.jsxs("div",{className:"mt-3 space-y-1",children:[l.jsx("div",{className:"w-full h-1.5 bg-muted rounded-full overflow-hidden",children:l.jsx("div",{className:"h-full bg-primary transition-all duration-500",style:{width:`${$.progress??0}%`}})}),l.jsxs("div",{className:"flex justify-between items-center text-[9px] font-mono text-muted-foreground",children:[l.jsxs("span",{children:[$.progress??0,"%"]}),$.done_bytes!=null&&$.total_bytes!=null&&l.jsxs("span",{children:[Kg($.done_bytes)," / ",Kg($.total_bytes),$.rate_bps!=null&&` (${Kg($.rate_bps)}/s)`]}),$.eta_s!=null&&l.jsxs("span",{children:["ETA: ",$.eta_s,"s"]})]})]})]},$.id)})})]})]}),N==="logs"&&l.jsxs("div",{className:"flex flex-col h-full space-y-4",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx("select",{value:u,onChange:$=>f($.target.value),className:"flex-1 h-9 px-3 text-xs bg-background/40 border border-border/60 rounded-lg outline-none text-foreground font-semibold",children:rN.map($=>l.jsxs("option",{value:$.id,children:[$.label," (",$.type==="system"?"systemd-root":"user",")"]},$.id))}),l.jsxs("button",{onClick:()=>Jn(u),disabled:k[u],className:"flex h-9 px-3 items-center gap-1.5 text-xs font-semibold rounded-lg border border-border/60 bg-background/20 hover:border-primary/50 transition-colors disabled:opacity-50",title:"Dienst neu starten",children:[l.jsx(Xa,{className:ee("h-3.5 w-3.5",k[u]&&"animate-spin")}),"Restart"]})]}),l.jsxs("div",{className:"flex-1 flex flex-col min-h-[300px] border border-border/60 bg-black/50 rounded-xl overflow-hidden shadow-inner",children:[l.jsxs("div",{className:"flex h-9 items-center justify-between px-4 border-b border-border/40 bg-black/30 shrink-0",children:[l.jsxs("div",{className:"flex items-center gap-1.5 text-[10px] font-mono text-muted-foreground",children:[l.jsx(TN,{className:"h-3 w-3 text-primary"}),l.jsxs("span",{children:["stdout/stderr - ",u]})]}),l.jsx("button",{onClick:()=>Oe(u),disabled:g,className:"text-muted-foreground hover:text-foreground transition-colors",children:l.jsx(Xa,{className:ee("h-3 w-3",g&&"animate-spin")})})]}),l.jsx("pre",{ref:xe,className:"flex-1 p-4 overflow-y-auto text-[10px] font-mono text-cyan-300/90 whitespace-pre-wrap select-text leading-relaxed scrollbar-thin",children:b==="password_required"||b==="incorrect_password"?l.jsxs("div",{className:"flex flex-col items-center justify-center p-6 text-center h-full space-y-3",children:[l.jsx(bi,{className:"h-8 w-8 text-amber-400 animate-pulse animate-duration-1000"}),l.jsx("div",{className:"text-xs font-semibold text-amber-300",children:b==="incorrect_password"?"Falsches Sudo-Passwort hinterlegt.":"Sudo-Passwort für systemd-Dienste erforderlich."}),l.jsxs("p",{className:"text-[10px] text-muted-foreground max-w-xs leading-normal",children:["Für das Auslesen der systemd-Logs von ",u," werden Root-Rechte benötigt. Hinterlege dein Passwort in den Einstellungen."]}),l.jsx("button",{onClick:()=>E("settings"),className:"px-3 py-1.5 text-[10px] font-semibold text-primary-foreground bg-primary hover:bg-primary/95 rounded-md transition-colors mt-2",children:"Sudo-Passwort eintragen"})]}):g&&!h?l.jsx("span",{className:"text-muted-foreground",children:"Lade Logs..."}):h||l.jsx("span",{className:"text-muted-foreground",children:"Keine Logeinträge vorhanden."})})]})]}),N==="settings"&&l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Zugangsdaten & Schlüssel"}),l.jsx("p",{className:"text-[10px] text-muted-foreground leading-normal",children:"Diese Daten werden ausschließlich lokal in deinem Browser (localStorage) gespeichert und bei Bedarf an das Backend übertragen."})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("label",{className:"text-xs font-semibold flex items-center gap-1.5",children:[l.jsx(ks,{className:"h-4 w-4 text-amber-400"}),"Host Sudo-Passwort"]}),l.jsxs("div",{className:"relative",children:[l.jsx("input",{type:me?"text":"password",value:M,onChange:$=>K($.target.value),"aria-label":"Host Sudo-Passwort",name:"sudo-password",autoComplete:"off",spellCheck:!1,placeholder:"Sudo-Passwort für System-Operationen",className:"w-full h-10 pl-3 pr-10 text-xs bg-background/40 border border-border/60 rounded-lg outline-none focus:border-primary transition-colors text-foreground"}),l.jsx("button",{type:"button",onClick:()=>ge(!me),"aria-label":me?"Passwort verbergen":"Passwort anzeigen",className:"absolute inset-y-0 right-0 flex items-center pr-3 text-muted-foreground hover:text-foreground transition-colors",children:me?l.jsx(mw,{className:"h-4 w-4","aria-hidden":"true"}):l.jsx(uf,{className:"h-4 w-4","aria-hidden":"true"})})]}),l.jsx("p",{className:"text-[9px] text-muted-foreground leading-normal",children:"Wird benötigt für systemd-Dienste (Llama Swap logs/restart), OS-Update (apt) und Reboot."})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("label",{className:"text-xs font-semibold flex items-center gap-1.5",children:[l.jsx(p4,{className:"h-4 w-4 text-violet-400"}),"HuggingFace API Token"]}),l.jsxs("div",{className:"relative",children:[l.jsx("input",{type:Pe?"text":"password",value:ne,onChange:$=>Z($.target.value),"aria-label":"HuggingFace API Token",name:"hf-token",autoComplete:"off",spellCheck:!1,placeholder:"hf_…",className:"w-full h-10 pl-3 pr-10 text-xs bg-background/40 border border-border/60 rounded-lg outline-none focus:border-primary transition-colors text-foreground"}),l.jsx("button",{type:"button",onClick:()=>re(!Pe),"aria-label":Pe?"Token verbergen":"Token anzeigen",className:"absolute inset-y-0 right-0 flex items-center pr-3 text-muted-foreground hover:text-foreground transition-colors",children:Pe?l.jsx(mw,{className:"h-4 w-4","aria-hidden":"true"}):l.jsx(uf,{className:"h-4 w-4","aria-hidden":"true"})})]}),l.jsx("p",{className:"text-[9px] text-muted-foreground leading-normal",children:"Erlaubt das Herunterladen von geschützten oder Gate-restricted Modellen direkt über Mission Control."})]}),l.jsxs("div",{className:"flex gap-3 pt-2",children:[l.jsx("button",{onClick:()=>{localStorage.setItem("mc_sudo_password",M),localStorage.setItem("mc_hf_token",ne),te("Erfolgreich","Einstellungen erfolgreich lokal gespeichert.")},className:"flex-1 h-9 flex items-center justify-center text-xs font-semibold text-primary-foreground bg-primary hover:bg-primary/90 rounded-lg transition-colors shadow shadow-primary/10 cursor-pointer",children:"Speichern"}),l.jsx("button",{onClick:()=>{K(""),Z(""),localStorage.removeItem("mc_sudo_password"),localStorage.removeItem("mc_hf_token"),te("Gelöscht","Zugangsdaten gelöscht.")},className:"h-9 px-4 flex items-center justify-center text-xs font-semibold text-muted-foreground border border-border/60 bg-background/20 hover:bg-accent rounded-lg transition-colors cursor-pointer",children:"Zurücksetzen"})]})]})]})]}),he&&(()=>{var mc;const $=he.data,Le={os:{icon:ks,cls:"text-cyan-400",title:"OS-Pakete (apt)"},engine:{icon:ff,cls:"text-violet-400",title:"Inferenz-Engine (llama.cpp)"},swap:{icon:vw,cls:"text-fuchsia-400",title:"Router (llama-swap)"},hermes:{icon:wn,cls:"text-amber-400",title:"Hermes-Agent"}}[he.kind],cr=Le.icon,hc=$?he.kind==="os"?($.count??0)===0:he.kind==="hermes"?($.behind??0)===0:$.installed_build!=null&&$.latest_build!=null&&$.latest_build<=$.installed_build:!0;return l.jsxs("div",{className:"fixed inset-0 z-[60] flex items-center justify-center p-4",children:[l.jsx("div",{className:"absolute inset-0 bg-black/70 backdrop-blur-sm",onClick:()=>ae(null)}),l.jsxs("div",{className:"relative w-full max-w-lg max-h-[80vh] flex flex-col rounded-2xl border border-border/60 bg-card shadow-2xl font-sans text-foreground",children:[l.jsxs("div",{className:"flex h-14 shrink-0 items-center justify-between border-b border-border/40 px-5",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(cr,{className:ee("h-4.5 w-4.5",Le.cls)}),l.jsx("h3",{className:"text-sm font-semibold",children:Le.title})]}),l.jsx("button",{onClick:()=>ae(null),className:"flex h-7 w-7 items-center justify-center rounded-lg border border-border/40 text-muted-foreground hover:bg-accent transition-colors",children:l.jsx(Wn,{className:"h-4 w-4"})})]}),l.jsx("div",{className:"flex-1 overflow-y-auto p-5 text-xs space-y-3 scrollbar-thin",children:he.loading?l.jsxs("div",{className:"flex h-24 items-center justify-center gap-2 text-muted-foreground",children:[l.jsx(Xa,{className:"h-4 w-4 animate-spin"})," Details werden geladen…"]}):$!=null&&$.error?l.jsx("div",{className:"rounded-lg border border-red-500/30 bg-red-500/5 p-3 text-red-400",children:$.error}):he.kind==="os"?(($==null?void 0:$.count)??0)===0?l.jsx("div",{className:"text-muted-foreground",children:"Keine Pakete zu aktualisieren — System ist aktuell."}):l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"text-muted-foreground",children:[$.count," Paket(e) werden aktualisiert:"]}),l.jsx("div",{className:"space-y-1",children:$.packages.map(_r=>l.jsxs("div",{className:"flex items-center justify-between gap-2 rounded-md border border-border/40 bg-background/30 px-2.5 py-1.5",children:[l.jsxs("span",{className:"flex items-center gap-1.5 font-mono text-[11px] truncate",children:[l.jsx(A4,{className:"h-3 w-3 text-cyan-400 shrink-0"}),_r.name]}),l.jsxs("span",{className:"flex items-center gap-1 font-mono text-[10px] text-muted-foreground shrink-0",children:[l.jsx("span",{children:_r.current}),l.jsx(sf,{className:"h-3 w-3"}),l.jsx("span",{className:"text-emerald-400",children:_r.candidate})]})]},_r.name))})]}):he.kind==="engine"||he.kind==="swap"?l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"flex items-center gap-2 font-mono text-[11px]",children:[l.jsxs("span",{className:"rounded-md border border-border/40 bg-background/30 px-2 py-1",children:["Build ",($==null?void 0:$.installed_build)??"?"]}),l.jsx(sf,{className:"h-3.5 w-3.5 text-muted-foreground"}),l.jsxs("span",{className:"rounded-md border border-emerald-500/30 bg-emerald-500/5 px-2 py-1 text-emerald-400",children:["Build ",($==null?void 0:$.latest_build)??"?"]})]}),(($==null?void 0:$.name)||($==null?void 0:$.latest_tag))&&l.jsxs("div",{className:"text-muted-foreground",children:["Release: ",l.jsx("span",{className:"text-foreground",children:$==null?void 0:$.name}),$!=null&&$.latest_tag?` (${$.latest_tag})`:""]}),($==null?void 0:$.url)&&l.jsxs("a",{href:$.url,target:"_blank",rel:"noreferrer",className:"inline-flex items-center gap-1 text-primary hover:underline",children:["Release-Notes auf GitHub ",l.jsx(Hs,{className:"h-3 w-3"})]}),($==null?void 0:$.body)&&l.jsx("pre",{className:"whitespace-pre-wrap rounded-lg border border-border/40 bg-background/30 p-3 text-[10px] leading-relaxed text-muted-foreground max-h-60 overflow-y-auto scrollbar-thin",children:$.body})]}):(((mc=$==null?void 0:$.commits)==null?void 0:mc.length)??0)===0?l.jsx("div",{className:"text-muted-foreground",children:"Keine neuen Commits — Hermes-Agent ist bereits aktuell."}):l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"text-muted-foreground",children:[$.behind," neue Commit(s) auf ",l.jsxs("span",{className:"font-mono text-foreground",children:["origin/",$.branch]}),":"]}),l.jsx("div",{className:"space-y-1",children:$.commits.map(_r=>l.jsxs("div",{className:"flex items-start gap-2 rounded-md border border-border/40 bg-background/30 px-2.5 py-1.5",children:[l.jsx(d4,{className:"h-3.5 w-3.5 text-primary shrink-0 mt-0.5"}),l.jsxs("div",{className:"min-w-0",children:[l.jsx("div",{className:"text-[11px] truncate",children:_r.subject}),l.jsxs("div",{className:"font-mono text-[9px] text-muted-foreground",children:[_r.hash," · ",_r.when]})]})]},_r.hash))}),l.jsx("p",{className:"text-[10px] text-muted-foreground leading-normal",children:"Vor dem Update wird automatisch ein Backup erstellt; danach startet der Hermes-Gateway neu."})]})}),l.jsxs("div",{className:"flex gap-3 border-t border-border/40 p-4 shrink-0",children:[l.jsx("button",{onClick:()=>ae(null),className:"h-9 flex-1 rounded-lg border border-border/60 bg-background/20 text-xs font-semibold text-muted-foreground hover:bg-accent transition-colors cursor-pointer",children:"Schließen"}),l.jsx("button",{onClick:et,disabled:he.loading||hc||!!Or,title:Or?`Update läuft bereits: ${Or.label}`:void 0,className:"h-9 flex-1 rounded-lg bg-primary text-xs font-semibold text-primary-foreground hover:opacity-90 transition-all cursor-pointer disabled:opacity-40 disabled:cursor-default",children:Or?"Update läuft…":"Jetzt aktualisieren"})]})]})]})})(),se&&l.jsx(UO,{type:se.type,title:se.title,message:se.message,onConfirm:se.onConfirm,onCancel:se.onCancel})]})}function KX(){const{data:e}=vh(3e4),{data:t}=Ni(),r=((e==null?void 0:e.os)||0)+((e==null?void 0:e.engine)||0)+((e==null?void 0:e.swap)||0)+((e==null?void 0:e.models)||0),n=()=>window.dispatchEvent(new CustomEvent("open-system-drawer",{detail:{tab:"maintenance"}})),a=(t==null?void 0:t.models)??[],o=(t==null?void 0:t.running)??[],c=a.find(m=>m.role==="hermes"),u=a.find(m=>m.role==="coder-lite")||a.find(m=>m.role==="coder"),f=m=>m?o.includes(m):!1,h=m=>{var g;return((g=m==null?void 0:m.split("/").pop())==null?void 0:g.replace(/\.gguf$/i,""))||"—"};return l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Basisstation"}),l.jsx("p",{className:"text-sm text-muted-foreground",children:"Geht's der Box gut, gibt's Updates, was läuft gerade."})]}),l.jsx(VO,{frame:"box"}),l.jsxs("button",{onClick:n,className:ee("w-full flex items-center gap-3 rounded-2xl border p-4 text-left transition-all cursor-pointer",r>0?"border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/10":"border-border/60 bg-card/45 hover:border-primary/40"),children:[r>0?l.jsx(J3,{className:"h-6 w-6 shrink-0 text-amber-400"}):l.jsx(sr,{className:"h-6 w-6 shrink-0 text-emerald-400"}),l.jsxs("div",{className:"flex-1 min-w-0",children:[l.jsx("div",{className:ee("text-sm font-semibold",r>0?"text-amber-400":"text-foreground"),children:r>0?`${r} Update${r===1?"":"s"} verfügbar`:"Alles aktuell"}),l.jsx("div",{className:"text-xs text-muted-foreground",children:r>0?"Antippen, um zu sehen, was genau aktualisiert wird.":"Keine ausstehenden Updates."})]}),r>0&&l.jsxs("span",{className:"shrink-0 flex items-center gap-1 text-xs font-semibold text-amber-400",children:["Ansehen ",l.jsx(ch,{className:"h-4 w-4"})]})]}),l.jsxs("div",{children:[l.jsx("div",{className:"text-xs text-muted-foreground mb-2",children:"Was gerade läuft"}),l.jsx("div",{className:"rounded-2xl border border-border/60 overflow-hidden",children:[{icon:Hn,label:"Lucys Hirn",model:c==null?void 0:c.name,warm:f(c==null?void 0:c.name)},{icon:Bs,label:"Coder (Vibe-Coding)",model:u==null?void 0:u.name,warm:f(u==null?void 0:u.name)}].map(m=>l.jsxs("div",{className:"flex items-center gap-3 px-4 py-3 border-b border-border/40 last:border-0",children:[l.jsx("span",{className:ee("h-2 w-2 shrink-0 rounded-full",m.warm?"bg-emerald-500 animate-pulse":"bg-muted-foreground/40")}),l.jsx(m.icon,{className:"h-4 w-4 text-muted-foreground shrink-0"}),l.jsx("span",{className:"text-sm text-foreground w-40 shrink-0",children:m.label}),l.jsx("span",{className:"text-xs text-muted-foreground flex-1 truncate font-mono",children:h(m.model)}),l.jsx("span",{className:ee("text-xs shrink-0",m.warm?"text-emerald-400":"text-muted-foreground"),children:m.model?m.warm?"warm":"bereit":"nicht gesetzt"})]},m.label))})]}),l.jsxs("div",{className:"grid gap-6 lg:grid-cols-2",children:[l.jsx(BO,{}),l.jsx(HO,{})]}),l.jsx(WO,{})]})}function Gg({icon:e,title:t,sub:r,onClick:n}){return l.jsxs("button",{onClick:n,className:"w-full flex items-center gap-4 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 text-left transition-all hover:border-primary/40 cursor-pointer",children:[l.jsx(e,{className:"h-6 w-6 text-muted-foreground shrink-0"}),l.jsxs("div",{className:"flex-1 min-w-0",children:[l.jsx("div",{className:"text-sm text-foreground",children:t}),l.jsx("div",{className:"text-xs text-muted-foreground",children:r})]}),l.jsx(ch,{className:"h-5 w-5 text-muted-foreground shrink-0"})]})}function GX(){const[e,t]=y.useState(null);return e?l.jsxs("div",{className:"space-y-4",children:[l.jsxs("button",{onClick:()=>t(null),className:"flex items-center gap-1.5 text-xs font-semibold text-muted-foreground hover:text-foreground transition-colors cursor-pointer",children:[l.jsx(AN,{className:"h-4 w-4"})," Maschinenraum"]}),e==="modelle"?l.jsx(qO,{}):l.jsx(XO,{})]}):l.jsxs("div",{className:"space-y-4",children:[l.jsxs("div",{className:"flex items-start justify-between gap-3",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Maschinenraum"}),l.jsx("p",{className:"text-sm text-muted-foreground",children:"Nur nötig, wenn du wirklich was ändern willst."})]}),l.jsx(jE,{})]}),l.jsx(Gg,{icon:Hn,title:"Modelle",sub:"Hirne, Coder, Immer-bereit-Set, Bibliothek",onClick:()=>t("modelle")}),l.jsx(Gg,{icon:R4,title:"Wartung und Logs",sub:"Updates, Backup, Dienste, Logs, Zugangsdaten",onClick:()=>window.dispatchEvent(new CustomEvent("open-system-drawer",{detail:{tab:"maintenance"}}))}),l.jsx(Gg,{icon:wn,title:"Hermes und Verdrahtung",sub:"Agent, Gehirn-Modell, PC-Verbindung",onClick:()=>t("hermes")})]})}const VX=[{id:"start",label:"Start",icon:uh},{id:"vibe",label:"Vibe-Coding",icon:Bs},{id:"konstitution",label:"Konstitution",icon:V3},{id:"maschinenraum",label:"Maschinenraum",icon:Qu}];function qX(){const[e,t]=y.useState("start"),[r,n]=y.useState(!1),[a,o]=y.useState("maintenance"),{data:c}=Py();y.useEffect(()=>{const f=h=>{var m;o(((m=h.detail)==null?void 0:m.tab)||"maintenance"),n(!0)};return window.addEventListener("open-system-drawer",f),()=>window.removeEventListener("open-system-drawer",f)},[]);const u=c&&c.engine_reachable&&(c.brain?c.brain.ready:!0);return l.jsxs("div",{className:"flex h-full relative",children:[l.jsx("div",{className:"fixed inset-0 -z-50 pointer-events-none overflow-hidden bg-[hsl(224,30%,6%)]",children:l.jsx("div",{className:"absolute inset-0 opacity-30 animate-aurora bg-gradient-to-tr from-teal-500/15 via-indigo-500/10 to-purple-500/15 blur-[130px]"})}),l.jsx(ZO,{open:r,onClose:()=>n(!1),defaultTab:a}),l.jsxs("aside",{className:"flex w-56 shrink-0 flex-col border-r border-border/40 bg-card/45 backdrop-blur-md",children:[l.jsxs("div",{className:"flex items-center gap-2 px-5 py-4 border-b border-border/40",children:[l.jsx("div",{className:"h-7 w-7 rounded-lg bg-primary shadow-md shadow-primary/20"}),l.jsxs("div",{className:"leading-tight",children:[l.jsx("div",{className:"text-sm font-semibold tracking-wide font-space",children:"Mission Control"}),l.jsx("div",{className:"text-[10px] text-muted-foreground",children:"3 · Prototyp"})]})]}),l.jsx("nav",{className:"flex-1 space-y-1 px-3 py-4",children:VX.map(f=>l.jsxs("button",{onClick:()=>t(f.id),className:ee("flex w-full items-center gap-3 rounded-md px-3 py-2 text-sm transition-all cursor-pointer",e===f.id?"bg-primary/15 text-primary":"text-muted-foreground hover:bg-accent hover:text-accent-foreground"),children:[l.jsx(f.icon,{className:"h-4.5 w-4.5 shrink-0"})," ",f.label]},f.id))}),l.jsxs("div",{className:"px-3 py-3 border-t border-border/40 space-y-2",children:[l.jsxs("div",{className:"flex items-center gap-2 px-2 text-xs text-muted-foreground",children:[l.jsx("span",{className:ee("h-2 w-2 rounded-full",u?"bg-emerald-500 animate-pulse":"bg-amber-500")}),u?"Box läuft":"prüfen"]}),l.jsxs("a",{href:"#dashboard",className:"flex items-center gap-1.5 rounded-md px-2 py-1.5 text-[11px] text-muted-foreground hover:text-foreground transition-colors",children:[l.jsx(AN,{className:"h-3.5 w-3.5"})," zurück zu MC2"]})]})]}),l.jsxs("main",{className:"flex-1 min-w-0 overflow-y-auto p-6 scrollbar-thin",children:[e==="start"&&l.jsx(KX,{}),e==="vibe"&&l.jsx(QO,{}),e==="konstitution"&&l.jsx(YO,{}),e==="maschinenraum"&&l.jsx(GX,{})]})]})}function QX(){var j,k,S,N,E;WD();const[e,t]=y.useState(()=>{const A=window.location.hash.slice(1);return mu.some(P=>P.id===A)?A:"dashboard"}),r=y.useCallback(A=>{window.location.hash.slice(1)===A?t(A):window.location.hash=A},[]),[n,a]=y.useState(()=>localStorage.getItem("mc_sidebar_collapsed")==="true"),[o,c]=y.useState(!1),[u,f]=y.useState("maintenance"),[h,m]=y.useState(()=>window.location.hash==="#mc3"),{data:g}=Py(),{data:v}=Po(2e4);y.useEffect(()=>{document.documentElement.classList.add("dark")},[]),y.useEffect(()=>{const A=P=>{var O;f(((O=P.detail)==null?void 0:O.tab)||"maintenance"),c(!0)};return window.addEventListener("open-system-drawer",A),()=>window.removeEventListener("open-system-drawer",A)},[]),y.useEffect(()=>{const A=P=>{var O;const _=(O=P.detail)==null?void 0:O.view;_&&r(_)};return window.addEventListener("mc-navigate",A),()=>window.removeEventListener("mc-navigate",A)},[r]),y.useEffect(()=>{const A=()=>{m(window.location.hash==="#mc3");const P=window.location.hash.slice(1);mu.some(_=>_.id===P)&&t(P)};return window.addEventListener("hashchange",A),()=>window.removeEventListener("hashchange",A)},[]);const b=mu.find(A=>A.id===e);return h?l.jsx(qX,{}):l.jsxs("div",{className:"flex h-full relative",children:[l.jsxs("div",{className:"fixed inset-0 -z-50 pointer-events-none overflow-hidden bg-[hsl(224,30%,6%)]",children:[l.jsx("div",{className:"absolute inset-0 opacity-35 animate-aurora bg-gradient-to-tr from-teal-500/20 via-indigo-500/15 to-purple-500/20 blur-[130px]"}),l.jsx("div",{className:"absolute top-[-10%] left-[-10%] h-[50%] w-[50%] rounded-full bg-teal-500/15 blur-[160px]"}),l.jsx("div",{className:"absolute bottom-[-10%] right-[-10%] h-[50%] w-[50%] rounded-full bg-purple-500/15 blur-[160px]"}),l.jsx("div",{className:"absolute top-[30%] right-[20%] h-[40%] w-[40%] rounded-full bg-indigo-500/10 blur-[140px]"})]}),l.jsx(YT,{onNavigate:r}),l.jsx(ZO,{open:o,onClose:()=>c(!1),defaultTab:u}),l.jsxs("aside",{className:ee("flex shrink-0 flex-col border-r border-border/40 bg-card/45 backdrop-blur-md transition-all duration-300 ease-in-out",n?"w-16":"w-60"),children:[l.jsxs("div",{className:ee("flex items-center py-4 border-b border-border/40 shrink-0",n?"flex-col gap-3 px-2":"justify-between px-5"),children:[l.jsxs("div",{className:"flex items-center gap-2 overflow-hidden",children:[l.jsx("div",{className:"h-7 w-7 rounded-lg bg-primary shadow-md shadow-primary/20 shrink-0"}),!n&&l.jsxs("div",{className:"leading-tight",children:[l.jsx("div",{className:"text-sm font-semibold tracking-wide font-space",children:"Mission Control"}),l.jsx("div",{className:"text-xs text-muted-foreground",children:"2.0"})]})]}),l.jsx("button",{onClick:()=>{a(A=>{const P=!A;return localStorage.setItem("mc_sidebar_collapsed",P.toString()),P})},className:"p-1 rounded-md hover:bg-accent text-muted-foreground transition-colors cursor-pointer","aria-label":n?"Seitenleiste ausklappen":"Seitenleiste einklappen",title:n?"Maximieren":"Minimieren",children:n?l.jsx(ch,{className:"h-4 w-4","aria-hidden":"true"}):l.jsx(Z3,{className:"h-4 w-4","aria-hidden":"true"})})]}),l.jsx("nav",{className:"flex-1 space-y-1 px-3 py-4 overflow-y-auto",children:mu.map(A=>l.jsxs("a",{href:`#${A.id}`,"aria-current":e===A.id?"page":void 0,className:ee("flex w-full items-center rounded-md text-sm transition-all cursor-pointer",n?"justify-center p-2.5":"gap-3 px-3 py-2",e===A.id?"bg-primary/15 text-primary shadow-sm shadow-primary/5":"text-muted-foreground hover:bg-accent hover:text-accent-foreground"),title:n?A.label:void 0,"aria-label":n?A.label:void 0,children:[l.jsx(A.icon,{className:"h-4.5 w-4.5 shrink-0","aria-hidden":"true"}),!n&&l.jsx("span",{className:"truncate",children:A.label})]},A.id))}),l.jsx("div",{className:ee("py-3 text-xs text-muted-foreground border-t border-border/40 shrink-0",n?"px-2 text-center":"px-5"),children:n?l.jsx("div",{className:"flex justify-center",children:l.jsx("span",{className:ee("h-2.5 w-2.5 rounded-full ring-2 ring-black/40",g?g.engine_reachable?g.brain&&!g.brain.ready?"bg-amber-500 animate-pulse":"bg-emerald-500 animate-pulse":"bg-amber-500":"bg-red-500"),title:g?g.engine_reachable?g.brain&&!g.brain.ready?`Hirn offline (${g.brain.model??"fast"})`:"Engine + Hirn online":"Engine offline":"Backend offline"})}):l.jsxs("div",{className:"space-y-2 text-left",children:[g?l.jsxs(l.Fragment,{children:[l.jsxs("span",{className:"flex items-center gap-2",children:[l.jsx("span",{className:ee("h-2 w-2 rounded-full animate-pulse",g.engine_reachable?"bg-emerald-500":"bg-amber-500")}),l.jsxs("span",{className:"truncate",children:["Engine ",g.engine_reachable?"online":"offline"]})]}),g.brain&&!g.brain.ready&&l.jsxs("span",{className:"flex items-center gap-2 text-amber-400",title:`Agent-Hirn '${g.brain.model??"fast"}' lädt nicht/abgestürzt`,children:[l.jsx("span",{className:"h-2 w-2 rounded-full bg-amber-500 animate-pulse"}),l.jsxs("span",{className:"truncate",children:["Hirn offline",g.brain.model?` (${g.brain.model})`:""]})]})]}):l.jsxs("span",{className:"flex items-center gap-2",children:[l.jsx("span",{className:"h-2 w-2 rounded-full bg-red-500"})," ",l.jsx("span",{className:"truncate",children:"Backend offline"})]}),(v==null?void 0:v.versions)&&l.jsxs("div",{className:"space-y-1 text-[9px] text-muted-foreground/60 mt-2 pt-2 border-t border-border/30",children:[l.jsxs("div",{className:"truncate",title:v.versions.mc2?`${v.versions.mc2.branch}-${v.versions.mc2.hash}${v.versions.mc2.dirty?"*":""} (${v.versions.mc2.date})`:"nicht gefunden",children:[l.jsx("strong",{children:"MC2:"})," ",v.versions.mc2?`${v.versions.mc2.hash}${v.versions.mc2.dirty?"*":""}`:"—"]}),l.jsxs("div",{className:"truncate",title:((j=v.versions.engine)==null?void 0:j.type)==="git"?`${v.versions.engine.branch}-${v.versions.engine.hash}${v.versions.engine.dirty?"*":""} (${v.versions.engine.date})`:((k=v.versions.engine)==null?void 0:k.version_text)||"unbekannt",children:[l.jsx("strong",{children:"Engine:"})," ",((S=v.versions.engine)==null?void 0:S.type)==="git"?`${v.versions.engine.hash}${v.versions.engine.dirty?"*":""}`:((E=(N=v.versions.engine)==null?void 0:N.version_text)==null?void 0:E.split(" ").pop())||"—"]}),l.jsxs("div",{className:"truncate",title:v.versions.hermes_ui?`${v.versions.hermes_ui.branch}-${v.versions.hermes_ui.hash}${v.versions.hermes_ui.dirty?"*":""} (${v.versions.hermes_ui.date})`:"nicht gefunden",children:[l.jsx("strong",{children:"Hermes UI:"})," ",v.versions.hermes_ui?`${v.versions.hermes_ui.hash}${v.versions.hermes_ui.dirty?"*":""}`:"—"]}),l.jsxs("div",{className:"truncate",title:v.versions.hermes_agent?`${v.versions.hermes_agent.branch}-${v.versions.hermes_agent.hash}${v.versions.hermes_agent.dirty?"*":""} (${v.versions.hermes_agent.date})`:"nicht gefunden",children:[l.jsx("strong",{children:"Hermes Agent:"})," ",v.versions.hermes_agent?`${v.versions.hermes_agent.hash}${v.versions.hermes_agent.dirty?"*":""}`:"—"]})]})]})})]}),l.jsxs("div",{className:"flex min-w-0 flex-1 flex-col",children:[l.jsxs("header",{className:"flex h-14 shrink-0 items-center justify-between border-b border-border/40 px-6 bg-card/20 backdrop-blur-sm",children:[l.jsx("div",{className:"text-xs font-medium text-muted-foreground tracking-wide uppercase font-sans",children:b.hint}),l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(jE,{}),l.jsx("a",{href:"https://git.tobisniceshomelab.ddnsfree.com/Hitonabi/mission-control-v2/src/branch/main/docs/BEDIENUNG.md",target:"_blank",rel:"noopener",className:"flex h-8 items-center rounded-md border border-border/40 bg-background/40 px-2.5 text-xs text-muted-foreground hover:bg-accent hover:text-accent-foreground transition-all cursor-pointer font-semibold",title:"Bedien-Anleitung",children:"Hilfe"}),l.jsxs("button",{onClick:()=>{const A=new KeyboardEvent("keydown",{key:"k",metaKey:!0});document.dispatchEvent(A)},className:"flex items-center gap-2 rounded-md border border-border/40 bg-background/40 px-2.5 py-1.5 text-xs text-muted-foreground hover:bg-accent hover:text-accent-foreground transition-all cursor-pointer",children:[l.jsx(a4,{className:"h-3.5 w-3.5"}),l.jsx("span",{children:"Suchen"}),l.jsx("kbd",{className:"rounded bg-muted px-1.5 py-0.5 font-mono text-[9px]",children:"⌘K"})]})]})]}),l.jsxs("main",{className:"flex-1 overflow-y-auto p-6 scrollbar-thin",children:[e==="dashboard"&&l.jsx(yX,{}),e==="models"&&l.jsx(_X,{}),e==="connect"&&l.jsx(QO,{}),e==="memory"&&l.jsx(YO,{}),e==="agent"&&l.jsx(XO,{}),e==="terminal"&&l.jsx(FX,{}),e==="guide"&&l.jsx(UX,{}),!["dashboard","models","connect","memory","agent","terminal","guide"].includes(e)&&l.jsx(HX,{title:b.label,hint:b.hint})]})]})]})}class YX extends yy.Component{constructor(){super(...arguments);is(this,"state",{error:null})}static getDerivedStateFromError(r){return{error:r}}componentDidCatch(r,n){console.error("Unbehandelter UI-Fehler:",r,n.componentStack)}render(){return this.state.error?l.jsx("div",{className:"min-h-screen flex items-center justify-center bg-neutral-950 text-neutral-200 p-8",children:l.jsxs("div",{className:"max-w-lg space-y-4 text-center",children:[l.jsx("div",{className:"text-2xl",children:"Da ist etwas schiefgelaufen."}),l.jsx("div",{className:"text-sm text-neutral-400 break-all",children:this.state.error.message}),l.jsx("button",{className:"px-4 py-2 rounded-lg bg-neutral-800 hover:bg-neutral-700 border border-neutral-700",onClick:()=>window.location.reload(),children:"Neu laden"})]})}):this.props.children}}const XX=new O3({defaultOptions:{queries:{retry:1,refetchOnWindowFocus:!1,staleTime:5e3}}});i3.createRoot(document.getElementById("root")).render(l.jsx(yy.StrictMode,{children:l.jsx(YX,{children:l.jsx(_3,{client:XX,children:l.jsx(QX,{})})})}));export{Xa as R,xs as S,cv as T,T4 as a,vy as g,l as j,y as r}; diff --git a/frontend/dist/assets/index-_Rap01H_.css b/frontend/dist/assets/index-_Rap01H_.css new file mode 100644 index 0000000..d7e4321 --- /dev/null +++ b/frontend/dist/assets/index-_Rap01H_.css @@ -0,0 +1 @@ +@import"https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Space+Grotesk:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap";/*! tailwindcss v4.3.1 | MIT License | https://tailwindcss.com */@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-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-pan-x:initial;--tw-pan-y:initial;--tw-pinch-zoom:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-divide-y-reverse:0;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction: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-outline-style:solid;--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}}}@layer theme{:root,:host{--font-sans:"Inter", ui-sans-serif, system-ui, -apple-system, sans-serif;--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-orange-300:oklch(83.7% .128 66.29);--color-orange-500:oklch(70.5% .213 47.604);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-teal-400:oklch(77.7% .152 181.912);--color-teal-500:oklch(70.4% .14 182.503);--color-cyan-200:oklch(91.7% .08 205.041);--color-cyan-300:oklch(86.5% .127 207.078);--color-cyan-400:oklch(78.9% .154 211.53);--color-cyan-500:oklch(71.5% .143 215.221);--color-sky-400:oklch(74.6% .16 232.661);--color-sky-500:oklch(68.5% .169 237.323);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-500:oklch(62.3% .214 259.815);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-violet-200:oklch(89.4% .057 293.283);--color-violet-300:oklch(81.1% .111 293.571);--color-violet-400:oklch(70.2% .183 293.541);--color-violet-500:oklch(60.6% .25 292.717);--color-purple-300:oklch(82.7% .119 306.383);--color-purple-500:oklch(62.7% .265 303.9);--color-fuchsia-300:oklch(83.3% .145 321.434);--color-fuchsia-400:oklch(74% .238 322.16);--color-fuchsia-500:oklch(66.7% .295 322.15);--color-pink-400:oklch(71.8% .202 349.761);--color-pink-500:oklch(65.6% .241 354.308);--color-rose-400:oklch(71.2% .194 13.428);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-500:oklch(55.4% .046 257.417);--color-neutral-200:oklch(92.2% 0 0);--color-neutral-400:oklch(70.8% 0 0);--color-neutral-700:oklch(37.1% 0 0);--color-neutral-800:oklch(26.9% 0 0);--color-neutral-950:oklch(14.5% 0 0);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-2xl:42rem;--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);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wide:.025em;--tracking-wider:.05em;--leading-tight:1.25;--leading-normal:1.5;--leading-relaxed:1.625;--radius-xl:.75rem;--radius-2xl:1rem;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0, 0, .2, 1) infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--blur-md:12px;--blur-xl:24px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:"Inter", ui-sans-serif, system-ui, -apple-system, sans-serif;--default-mono-font-family:"JetBrains Mono", ui-monospace, SFMono-Regular, monospace}}@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%;-moz-tab-size:4;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]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance: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 components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.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}.not-sr-only{clip-path:none;white-space:normal;width:auto;height:auto;margin:0;padding:0;position:static;overflow:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-y-0{inset-block:0}.-top-0\.5{top:calc(var(--spacing) * -.5)}.top-0{top:0}.top-2\.5{top:calc(var(--spacing) * 2.5)}.top-3{top:calc(var(--spacing) * 3)}.top-\[-10\%\]{top:-10%}.top-\[30\%\]{top:30%}.-right-0\.5{right:calc(var(--spacing) * -.5)}.right-0{right:0}.right-3{right:calc(var(--spacing) * 3)}.right-\[-10\%\]{right:-10%}.right-\[20\%\]{right:20%}.bottom-3{bottom:calc(var(--spacing) * 3)}.bottom-\[-10\%\]{bottom:-10%}.left-2\.5{left:calc(var(--spacing) * 2.5)}.left-3{left:calc(var(--spacing) * 3)}.left-\[-10\%\]{left:-10%}.isolate{isolation:isolate}.isolation-auto{isolation:auto}.-z-50{z-index:-50}.z-10{z-index:10}.z-50{z-index:50}.z-\[60\]{z-index:60}.z-\[99\]{z-index:99}.col-span-full{grid-column:1/-1}.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-auto{margin-inline:auto}.-mt-1{margin-top:calc(var(--spacing) * -1)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-2\.5{margin-top:calc(var(--spacing) * 2.5)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-3\.5{margin-top:calc(var(--spacing) * 3.5)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-auto{margin-top:auto}.mr-0\.5{margin-right:calc(var(--spacing) * .5)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-1{margin-left:var(--spacing)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.flow-root{display:flow-root}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.inline-grid{display:inline-grid}.inline-table{display:inline-table}.list-item{display:list-item}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-column{display:table-column}.table-column-group{display:table-column-group}.table-footer-group{display:table-footer-group}.table-header-group{display:table-header-group}.table-row{display:table-row}.table-row-group{display:table-row-group}.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-4\.5{height:calc(var(--spacing) * 4.5)}.h-5{height:calc(var(--spacing) * 5)}.h-5\.5{height:calc(var(--spacing) * 5.5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-14{height:calc(var(--spacing) * 14)}.h-16{height:calc(var(--spacing) * 16)}.h-24{height:calc(var(--spacing) * 24)}.h-28{height:calc(var(--spacing) * 28)}.h-44{height:calc(var(--spacing) * 44)}.h-\[40\%\]{height:40%}.h-\[50\%\]{height:50%}.h-\[150px\]{height:150px}.h-\[480px\]{height:480px}.h-\[calc\(100vh-13rem\)\]{height:calc(100vh - 13rem)}.h-full{height:100%}.h-px{height:1px}.max-h-20{max-height:calc(var(--spacing) * 20)}.max-h-36{max-height:calc(var(--spacing) * 36)}.max-h-56{max-height:calc(var(--spacing) * 56)}.max-h-60{max-height:calc(var(--spacing) * 60)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-80{max-height:calc(var(--spacing) * 80)}.max-h-\[80vh\]{max-height:80vh}.min-h-\[68vh\]{min-height:68vh}.min-h-\[90px\]{min-height:90px}.min-h-\[300px\]{min-height:300px}.min-h-\[560px\]{min-height:560px}.min-h-screen{min-height:100vh}.w-1\.5{width:calc(var(--spacing) * 1.5)}.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-4\.5{width:calc(var(--spacing) * 4.5)}.w-5{width:calc(var(--spacing) * 5)}.w-5\.5{width:calc(var(--spacing) * 5.5)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.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-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-40{width:calc(var(--spacing) * 40)}.w-52{width:calc(var(--spacing) * 52)}.w-56{width:calc(var(--spacing) * 56)}.w-60{width:calc(var(--spacing) * 60)}.w-\[40\%\]{width:40%}.w-\[50\%\]{width:50%}.w-fit{width:fit-content}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-\[120px\]{max-width:120px}.max-w-\[180px\]{max-width:180px}.max-w-\[250px\]{max-width:250px}.max-w-\[260px\]{max-width:260px}.max-w-\[280px\]{max-width:280px}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:0}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.translate-x-0{--tw-translate-x:0;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-full{--tw-translate-x:100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-ping{animation:var(--animate-ping)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-pinch-zoom{--tw-pinch-zoom:pinch-zoom;touch-action:var(--tw-pan-x,) var(--tw-pan-y,) var(--tw-pinch-zoom,)}.resize{resize:both}.resize-none{resize:none}.scroll-mt-20{scroll-margin-top:calc(var(--spacing) * 20)}.scrollbar-thin{scrollbar-width:thin}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.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:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * 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-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * 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-3\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3.5) * 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-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * 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-7>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 7) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 7) * 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(.space-y-reverse>:not(:last-child)){--tw-space-y-reverse:1}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}:where(.space-x-reverse>:not(:last-child)){--tw-space-x-reverse:1}.gap-y-1{row-gap:var(--spacing)}.gap-y-1\.5{row-gap:calc(var(--spacing) * 1.5)}:where(.divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-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-y-reverse>:not(:last-child)){--tw-divide-y-reverse:1}.self-end{align-self:flex-end}.self-start{align-self:flex-start}.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}.overscroll-contain{overscroll-behavior:contain}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-s{border-start-start-radius:.25rem;border-end-start-radius:.25rem}.rounded-ss{border-start-start-radius:.25rem}.rounded-e{border-start-end-radius:.25rem;border-end-end-radius:.25rem}.rounded-se{border-start-end-radius:.25rem}.rounded-ee{border-end-end-radius:.25rem}.rounded-es{border-end-start-radius:.25rem}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-tl{border-top-left-radius:.25rem}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-tr{border-top-right-radius:.25rem}.rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-br{border-bottom-right-radius:.25rem}.rounded-bl{border-bottom-left-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-x{border-inline-style:var(--tw-border-style);border-inline-width:1px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.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{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-500\/20{border-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/20{border-color:color-mix(in oklab,var(--color-amber-500) 20%,transparent)}}.border-amber-500\/25{border-color:#f99c0040}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/25{border-color:color-mix(in oklab,var(--color-amber-500) 25%,transparent)}}.border-amber-500\/30{border-color:#f99c004d}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/30{border-color:color-mix(in oklab,var(--color-amber-500) 30%,transparent)}}.border-amber-500\/40{border-color:#f99c0066}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/40{border-color:color-mix(in oklab,var(--color-amber-500) 40%,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-border,.border-border\/20{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/20{border-color:color-mix(in oklab,hsl(var(--border)) 20%,transparent)}}.border-border\/30{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/30{border-color:color-mix(in oklab,hsl(var(--border)) 30%,transparent)}}.border-border\/40{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/40{border-color:color-mix(in oklab,hsl(var(--border)) 40%,transparent)}}.border-border\/50{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/50{border-color:color-mix(in oklab,hsl(var(--border)) 50%,transparent)}}.border-border\/60{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/60{border-color:color-mix(in oklab,hsl(var(--border)) 60%,transparent)}}.border-border\/70{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/70{border-color:color-mix(in oklab,hsl(var(--border)) 70%,transparent)}}.border-border\/80{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/80{border-color:color-mix(in oklab,hsl(var(--border)) 80%,transparent)}}.border-cyan-500\/20{border-color:#00b7d733}@supports (color:color-mix(in lab,red,red)){.border-cyan-500\/20{border-color:color-mix(in oklab,var(--color-cyan-500) 20%,transparent)}}.border-cyan-500\/30{border-color:#00b7d74d}@supports (color:color-mix(in lab,red,red)){.border-cyan-500\/30{border-color:color-mix(in oklab,var(--color-cyan-500) 30%,transparent)}}.border-emerald-500\/10{border-color:#00bb7f1a}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/10{border-color:color-mix(in oklab,var(--color-emerald-500) 10%,transparent)}}.border-emerald-500\/15{border-color:#00bb7f26}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/15{border-color:color-mix(in oklab,var(--color-emerald-500) 15%,transparent)}}.border-emerald-500\/20{border-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/20{border-color:color-mix(in oklab,var(--color-emerald-500) 20%,transparent)}}.border-emerald-500\/25{border-color:#00bb7f40}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/25{border-color:color-mix(in oklab,var(--color-emerald-500) 25%,transparent)}}.border-emerald-500\/30{border-color:#00bb7f4d}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/30{border-color:color-mix(in oklab,var(--color-emerald-500) 30%,transparent)}}.border-emerald-500\/40{border-color:#00bb7f66}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/40{border-color:color-mix(in oklab,var(--color-emerald-500) 40%,transparent)}}.border-fuchsia-500\/25{border-color:#e12afb40}@supports (color:color-mix(in lab,red,red)){.border-fuchsia-500\/25{border-color:color-mix(in oklab,var(--color-fuchsia-500) 25%,transparent)}}.border-fuchsia-500\/30{border-color:#e12afb4d}@supports (color:color-mix(in lab,red,red)){.border-fuchsia-500\/30{border-color:color-mix(in oklab,var(--color-fuchsia-500) 30%,transparent)}}.border-fuchsia-500\/40{border-color:#e12afb66}@supports (color:color-mix(in lab,red,red)){.border-fuchsia-500\/40{border-color:color-mix(in oklab,var(--color-fuchsia-500) 40%,transparent)}}.border-indigo-500\/25{border-color:#625fff40}@supports (color:color-mix(in lab,red,red)){.border-indigo-500\/25{border-color:color-mix(in oklab,var(--color-indigo-500) 25%,transparent)}}.border-indigo-500\/30{border-color:#625fff4d}@supports (color:color-mix(in lab,red,red)){.border-indigo-500\/30{border-color:color-mix(in oklab,var(--color-indigo-500) 30%,transparent)}}.border-indigo-500\/40{border-color:#625fff66}@supports (color:color-mix(in lab,red,red)){.border-indigo-500\/40{border-color:color-mix(in oklab,var(--color-indigo-500) 40%,transparent)}}.border-neutral-700{border-color:var(--color-neutral-700)}.border-orange-500\/30{border-color:#fe6e004d}@supports (color:color-mix(in lab,red,red)){.border-orange-500\/30{border-color:color-mix(in oklab,var(--color-orange-500) 30%,transparent)}}.border-pink-500\/25{border-color:#f6339a40}@supports (color:color-mix(in lab,red,red)){.border-pink-500\/25{border-color:color-mix(in oklab,var(--color-pink-500) 25%,transparent)}}.border-primary,.border-primary\/20{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/20{border-color:color-mix(in oklab,hsl(var(--primary)) 20%,transparent)}}.border-primary\/25{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/25{border-color:color-mix(in oklab,hsl(var(--primary)) 25%,transparent)}}.border-primary\/30{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/30{border-color:color-mix(in oklab,hsl(var(--primary)) 30%,transparent)}}.border-primary\/40{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/40{border-color:color-mix(in oklab,hsl(var(--primary)) 40%,transparent)}}.border-primary\/45{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/45{border-color:color-mix(in oklab,hsl(var(--primary)) 45%,transparent)}}.border-primary\/50{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/50{border-color:color-mix(in oklab,hsl(var(--primary)) 50%,transparent)}}.border-purple-500\/30{border-color:#ac4bff4d}@supports (color:color-mix(in lab,red,red)){.border-purple-500\/30{border-color:color-mix(in oklab,var(--color-purple-500) 30%,transparent)}}.border-red-500\/20{border-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.border-red-500\/20{border-color:color-mix(in oklab,var(--color-red-500) 20%,transparent)}}.border-red-500\/25{border-color:#fb2c3640}@supports (color:color-mix(in lab,red,red)){.border-red-500\/25{border-color:color-mix(in oklab,var(--color-red-500) 25%,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\/40{border-color:#fb2c3666}@supports (color:color-mix(in lab,red,red)){.border-red-500\/40{border-color:color-mix(in oklab,var(--color-red-500) 40%,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-slate-500\/25{border-color:#62748e40}@supports (color:color-mix(in lab,red,red)){.border-slate-500\/25{border-color:color-mix(in oklab,var(--color-slate-500) 25%,transparent)}}.border-slate-500\/30{border-color:#62748e4d}@supports (color:color-mix(in lab,red,red)){.border-slate-500\/30{border-color:color-mix(in oklab,var(--color-slate-500) 30%,transparent)}}.border-teal-500\/25{border-color:#00baa740}@supports (color:color-mix(in lab,red,red)){.border-teal-500\/25{border-color:color-mix(in oklab,var(--color-teal-500) 25%,transparent)}}.border-transparent{border-color:#0000}.border-violet-500\/20{border-color:#8d54ff33}@supports (color:color-mix(in lab,red,red)){.border-violet-500\/20{border-color:color-mix(in oklab,var(--color-violet-500) 20%,transparent)}}.border-violet-500\/25{border-color:#8d54ff40}@supports (color:color-mix(in lab,red,red)){.border-violet-500\/25{border-color:color-mix(in oklab,var(--color-violet-500) 25%,transparent)}}.border-t-primary\/70{border-top-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-t-primary\/70{border-top-color:color-mix(in oklab,hsl(var(--primary)) 70%,transparent)}}.border-t-violet-500\/70{border-top-color:#8d54ffb3}@supports (color:color-mix(in lab,red,red)){.border-t-violet-500\/70{border-top-color:color-mix(in oklab,var(--color-violet-500) 70%,transparent)}}.border-l-amber-500\/80{border-left-color:#f99c00cc}@supports (color:color-mix(in lab,red,red)){.border-l-amber-500\/80{border-left-color:color-mix(in oklab,var(--color-amber-500) 80%,transparent)}}.border-l-cyan-500\/80{border-left-color:#00b7d7cc}@supports (color:color-mix(in lab,red,red)){.border-l-cyan-500\/80{border-left-color:color-mix(in oklab,var(--color-cyan-500) 80%,transparent)}}.border-l-indigo-500\/80{border-left-color:#625fffcc}@supports (color:color-mix(in lab,red,red)){.border-l-indigo-500\/80{border-left-color:color-mix(in oklab,var(--color-indigo-500) 80%,transparent)}}.border-l-muted{border-left-color:hsl(var(--muted))}.border-l-violet-500\/80{border-left-color:#8d54ffcc}@supports (color:color-mix(in lab,red,red)){.border-l-violet-500\/80{border-left-color:color-mix(in oklab,var(--color-violet-500) 80%,transparent)}}.bg-\[\#070a0f\]{background-color:#070a0f}.bg-\[hsl\(224\,30\%\,6\%\)\]{background-color:#0b0d14}.bg-amber-400{background-color:var(--color-amber-400)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-500\/5{background-color:#f99c000d}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/5{background-color:color-mix(in oklab,var(--color-amber-500) 5%,transparent)}}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/10{background-color:color-mix(in oklab,var(--color-amber-500) 10%,transparent)}}.bg-amber-500\/15{background-color:#f99c0026}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/15{background-color:color-mix(in oklab,var(--color-amber-500) 15%,transparent)}}.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-amber-500\/80{background-color:#f99c00cc}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/80{background-color:color-mix(in oklab,var(--color-amber-500) 80%,transparent)}}.bg-amber-500\/\[0\.06\]{background-color:#f99c000f}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-amber-500) 6%,transparent)}}.bg-background\/10{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/10{background-color:color-mix(in oklab,hsl(var(--background)) 10%,transparent)}}.bg-background\/15{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/15{background-color:color-mix(in oklab,hsl(var(--background)) 15%,transparent)}}.bg-background\/20{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/20{background-color:color-mix(in oklab,hsl(var(--background)) 20%,transparent)}}.bg-background\/25{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/25{background-color:color-mix(in oklab,hsl(var(--background)) 25%,transparent)}}.bg-background\/30{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/30{background-color:color-mix(in oklab,hsl(var(--background)) 30%,transparent)}}.bg-background\/35{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/35{background-color:color-mix(in oklab,hsl(var(--background)) 35%,transparent)}}.bg-background\/40{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/40{background-color:color-mix(in oklab,hsl(var(--background)) 40%,transparent)}}.bg-background\/50{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/50{background-color:color-mix(in oklab,hsl(var(--background)) 50%,transparent)}}.bg-black\/10{background-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.bg-black\/10{background-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab,red,red)){.bg-black\/30{background-color:color-mix(in oklab,var(--color-black) 30%,transparent)}}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab,red,red)){.bg-black\/40{background-color:color-mix(in oklab,var(--color-black) 40%,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-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-border\/30{background-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.bg-border\/30{background-color:color-mix(in oklab,hsl(var(--border)) 30%,transparent)}}.bg-card,.bg-card\/20{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/20{background-color:color-mix(in oklab,hsl(var(--card)) 20%,transparent)}}.bg-card\/30{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/30{background-color:color-mix(in oklab,hsl(var(--card)) 30%,transparent)}}.bg-card\/40{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/40{background-color:color-mix(in oklab,hsl(var(--card)) 40%,transparent)}}.bg-card\/45{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/45{background-color:color-mix(in oklab,hsl(var(--card)) 45%,transparent)}}.bg-card\/50{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/50{background-color:color-mix(in oklab,hsl(var(--card)) 50%,transparent)}}.bg-card\/70{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/70{background-color:color-mix(in oklab,hsl(var(--card)) 70%,transparent)}}.bg-card\/85{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/85{background-color:color-mix(in oklab,hsl(var(--card)) 85%,transparent)}}.bg-cyan-500\/10{background-color:#00b7d71a}@supports (color:color-mix(in lab,red,red)){.bg-cyan-500\/10{background-color:color-mix(in oklab,var(--color-cyan-500) 10%,transparent)}}.bg-cyan-500\/20{background-color:#00b7d733}@supports (color:color-mix(in lab,red,red)){.bg-cyan-500\/20{background-color:color-mix(in oklab,var(--color-cyan-500) 20%,transparent)}}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-emerald-500\/5{background-color:#00bb7f0d}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/5{background-color:color-mix(in oklab,var(--color-emerald-500) 5%,transparent)}}.bg-emerald-500\/10{background-color:#00bb7f1a}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/10{background-color:color-mix(in oklab,var(--color-emerald-500) 10%,transparent)}}.bg-emerald-500\/15{background-color:#00bb7f26}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/15{background-color:color-mix(in oklab,var(--color-emerald-500) 15%,transparent)}}.bg-emerald-500\/20{background-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/20{background-color:color-mix(in oklab,var(--color-emerald-500) 20%,transparent)}}.bg-emerald-500\/80{background-color:#00bb7fcc}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/80{background-color:color-mix(in oklab,var(--color-emerald-500) 80%,transparent)}}.bg-emerald-500\/\[0\.07\]{background-color:#00bb7f12}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/\[0\.07\]{background-color:color-mix(in oklab,var(--color-emerald-500) 7%,transparent)}}.bg-fuchsia-500\/10{background-color:#e12afb1a}@supports (color:color-mix(in lab,red,red)){.bg-fuchsia-500\/10{background-color:color-mix(in oklab,var(--color-fuchsia-500) 10%,transparent)}}.bg-fuchsia-500\/15{background-color:#e12afb26}@supports (color:color-mix(in lab,red,red)){.bg-fuchsia-500\/15{background-color:color-mix(in oklab,var(--color-fuchsia-500) 15%,transparent)}}.bg-indigo-500\/5{background-color:#625fff0d}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/5{background-color:color-mix(in oklab,var(--color-indigo-500) 5%,transparent)}}.bg-indigo-500\/10{background-color:#625fff1a}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/10{background-color:color-mix(in oklab,var(--color-indigo-500) 10%,transparent)}}.bg-indigo-500\/15{background-color:#625fff26}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/15{background-color:color-mix(in oklab,var(--color-indigo-500) 15%,transparent)}}.bg-muted{background-color:hsl(var(--muted))}.bg-muted-foreground\/40{background-color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.bg-muted-foreground\/40{background-color:color-mix(in oklab,hsl(var(--muted-foreground)) 40%,transparent)}}.bg-muted\/10{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/10{background-color:color-mix(in oklab,hsl(var(--muted)) 10%,transparent)}}.bg-muted\/20{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/20{background-color:color-mix(in oklab,hsl(var(--muted)) 20%,transparent)}}.bg-muted\/40{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/40{background-color:color-mix(in oklab,hsl(var(--muted)) 40%,transparent)}}.bg-neutral-800{background-color:var(--color-neutral-800)}.bg-neutral-950{background-color:var(--color-neutral-950)}.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-pink-500\/15{background-color:#f6339a26}@supports (color:color-mix(in lab,red,red)){.bg-pink-500\/15{background-color:color-mix(in oklab,var(--color-pink-500) 15%,transparent)}}.bg-popover,.bg-popover\/95{background-color:hsl(var(--popover))}@supports (color:color-mix(in lab,red,red)){.bg-popover\/95{background-color:color-mix(in oklab,hsl(var(--popover)) 95%,transparent)}}.bg-primary,.bg-primary\/5{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/5{background-color:color-mix(in oklab,hsl(var(--primary)) 5%,transparent)}}.bg-primary\/10{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/10{background-color:color-mix(in oklab,hsl(var(--primary)) 10%,transparent)}}.bg-primary\/15{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/15{background-color:color-mix(in oklab,hsl(var(--primary)) 15%,transparent)}}.bg-primary\/\[0\.06\]{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/\[0\.06\]{background-color:color-mix(in oklab,hsl(var(--primary)) 6%,transparent)}}.bg-purple-500\/15{background-color:#ac4bff26}@supports (color:color-mix(in lab,red,red)){.bg-purple-500\/15{background-color:color-mix(in oklab,var(--color-purple-500) 15%,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-red-500{background-color:var(--color-red-500)}.bg-red-500\/5{background-color:#fb2c360d}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/5{background-color:color-mix(in oklab,var(--color-red-500) 5%,transparent)}}.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\/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-slate-500\/15{background-color:#62748e26}@supports (color:color-mix(in lab,red,red)){.bg-slate-500\/15{background-color:color-mix(in oklab,var(--color-slate-500) 15%,transparent)}}.bg-slate-500\/20{background-color:#62748e33}@supports (color:color-mix(in lab,red,red)){.bg-slate-500\/20{background-color:color-mix(in oklab,var(--color-slate-500) 20%,transparent)}}.bg-teal-500{background-color:var(--color-teal-500)}.bg-teal-500\/15{background-color:#00baa726}@supports (color:color-mix(in lab,red,red)){.bg-teal-500\/15{background-color:color-mix(in oklab,var(--color-teal-500) 15%,transparent)}}.bg-transparent{background-color:#0000}.bg-violet-500\/5{background-color:#8d54ff0d}@supports (color:color-mix(in lab,red,red)){.bg-violet-500\/5{background-color:color-mix(in oklab,var(--color-violet-500) 5%,transparent)}}.bg-violet-500\/10{background-color:#8d54ff1a}@supports (color:color-mix(in lab,red,red)){.bg-violet-500\/10{background-color:color-mix(in oklab,var(--color-violet-500) 10%,transparent)}}.bg-violet-500\/15{background-color:#8d54ff26}@supports (color:color-mix(in lab,red,red)){.bg-violet-500\/15{background-color:color-mix(in oklab,var(--color-violet-500) 15%,transparent)}}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-tr{--tw-gradient-position:to top right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-cyan-500{--tw-gradient-from:var(--color-cyan-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-foreground{--tw-gradient-from:hsl(var(--foreground));--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-indigo-500{--tw-gradient-from:var(--color-indigo-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-purple-500{--tw-gradient-from:var(--color-purple-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-teal-500{--tw-gradient-from:var(--color-teal-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-teal-500\/15{--tw-gradient-from:#00baa726}@supports (color:color-mix(in lab,red,red)){.from-teal-500\/15{--tw-gradient-from:color-mix(in oklab, var(--color-teal-500) 15%, transparent)}}.from-teal-500\/15{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-teal-500\/20{--tw-gradient-from:#00baa733}@supports (color:color-mix(in lab,red,red)){.from-teal-500\/20{--tw-gradient-from:color-mix(in oklab, var(--color-teal-500) 20%, transparent)}}.from-teal-500\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.via-foreground{--tw-gradient-via:hsl(var(--foreground));--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-indigo-500\/10{--tw-gradient-via:#625fff1a}@supports (color:color-mix(in lab,red,red)){.via-indigo-500\/10{--tw-gradient-via:color-mix(in oklab, var(--color-indigo-500) 10%, transparent)}}.via-indigo-500\/10{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-indigo-500\/15{--tw-gradient-via:#625fff26}@supports (color:color-mix(in lab,red,red)){.via-indigo-500\/15{--tw-gradient-via:color-mix(in oklab, var(--color-indigo-500) 15%, transparent)}}.via-indigo-500\/15{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.to-blue-500{--tw-gradient-to:var(--color-blue-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-emerald-500{--tw-gradient-to:var(--color-emerald-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-indigo-500{--tw-gradient-to:var(--color-indigo-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-pink-500{--tw-gradient-to:var(--color-pink-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-primary{--tw-gradient-to:hsl(var(--primary));--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-purple-500\/15{--tw-gradient-to:#ac4bff26}@supports (color:color-mix(in lab,red,red)){.to-purple-500\/15{--tw-gradient-to:color-mix(in oklab, var(--color-purple-500) 15%, transparent)}}.to-purple-500\/15{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-purple-500\/20{--tw-gradient-to:#ac4bff33}@supports (color:color-mix(in lab,red,red)){.to-purple-500\/20{--tw-gradient-to:color-mix(in oklab, var(--color-purple-500) 20%, transparent)}}.to-purple-500\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-sky-500{--tw-gradient-to:var(--color-sky-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.bg-repeat{background-repeat:repeat}.fill-primary\/20{fill:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.fill-primary\/20{fill:color-mix(in oklab,hsl(var(--primary)) 20%,transparent)}}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-3\.5{padding:calc(var(--spacing) * 3.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.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:var(--spacing)}.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-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-20{padding-block:calc(var(--spacing) * 20)}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-2\.5{padding-top:calc(var(--spacing) * 2.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-24{padding-top:calc(var(--spacing) * 24)}.pt-\[12vh\]{padding-top:12vh}.pr-1{padding-right:var(--spacing)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-10{padding-right:calc(var(--spacing) * 10)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-8{padding-left:calc(var(--spacing) * 8)}.pl-9{padding-left:calc(var(--spacing) * 9)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,monospace}.font-sans{font-family:Inter,ui-sans-serif,system-ui,-apple-system,sans-serif}.font-space{font-family:Space Grotesk,sans-serif}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--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-\[7px\]{font-size:7px}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-none{--tw-leading:1;line-height:1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.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-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.text-wrap{text-wrap:wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.text-clip{text-overflow:clip}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-300{color:var(--color-amber-300)}.text-amber-400{color:var(--color-amber-400)}.text-amber-400\/80{color:#fcbb00cc}@supports (color:color-mix(in lab,red,red)){.text-amber-400\/80{color:color-mix(in oklab,var(--color-amber-400) 80%,transparent)}}.text-amber-400\/90{color:#fcbb00e6}@supports (color:color-mix(in lab,red,red)){.text-amber-400\/90{color:color-mix(in oklab,var(--color-amber-400) 90%,transparent)}}.text-amber-500{color:var(--color-amber-500)}.text-black{color:var(--color-black)}.text-blue-300{color:var(--color-blue-300)}.text-cyan-200\/90{color:#a2f4fde6}@supports (color:color-mix(in lab,red,red)){.text-cyan-200\/90{color:color-mix(in oklab,var(--color-cyan-200) 90%,transparent)}}.text-cyan-300{color:var(--color-cyan-300)}.text-cyan-300\/90{color:#53eafde6}@supports (color:color-mix(in lab,red,red)){.text-cyan-300\/90{color:color-mix(in oklab,var(--color-cyan-300) 90%,transparent)}}.text-cyan-400{color:var(--color-cyan-400)}.text-emerald-300{color:var(--color-emerald-300)}.text-emerald-400{color:var(--color-emerald-400)}.text-emerald-400\/90{color:#00d294e6}@supports (color:color-mix(in lab,red,red)){.text-emerald-400\/90{color:color-mix(in oklab,var(--color-emerald-400) 90%,transparent)}}.text-foreground,.text-foreground\/80{color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.text-foreground\/80{color:color-mix(in oklab,hsl(var(--foreground)) 80%,transparent)}}.text-foreground\/90{color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.text-foreground\/90{color:color-mix(in oklab,hsl(var(--foreground)) 90%,transparent)}}.text-fuchsia-300{color:var(--color-fuchsia-300)}.text-fuchsia-400{color:var(--color-fuchsia-400)}.text-indigo-300{color:var(--color-indigo-300)}.text-indigo-400{color:var(--color-indigo-400)}.text-muted-foreground,.text-muted-foreground\/40{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/40{color:color-mix(in oklab,hsl(var(--muted-foreground)) 40%,transparent)}}.text-muted-foreground\/45{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/45{color:color-mix(in oklab,hsl(var(--muted-foreground)) 45%,transparent)}}.text-muted-foreground\/50{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/50{color:color-mix(in oklab,hsl(var(--muted-foreground)) 50%,transparent)}}.text-muted-foreground\/55{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/55{color:color-mix(in oklab,hsl(var(--muted-foreground)) 55%,transparent)}}.text-muted-foreground\/60{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/60{color:color-mix(in oklab,hsl(var(--muted-foreground)) 60%,transparent)}}.text-muted-foreground\/65{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/65{color:color-mix(in oklab,hsl(var(--muted-foreground)) 65%,transparent)}}.text-muted-foreground\/70{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/70{color:color-mix(in oklab,hsl(var(--muted-foreground)) 70%,transparent)}}.text-muted-foreground\/75{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/75{color:color-mix(in oklab,hsl(var(--muted-foreground)) 75%,transparent)}}.text-muted-foreground\/80{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/80{color:color-mix(in oklab,hsl(var(--muted-foreground)) 80%,transparent)}}.text-neutral-200{color:var(--color-neutral-200)}.text-neutral-400{color:var(--color-neutral-400)}.text-orange-300{color:var(--color-orange-300)}.text-pink-400{color:var(--color-pink-400)}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-primary\/70{color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.text-primary\/70{color:color-mix(in oklab,hsl(var(--primary)) 70%,transparent)}}.text-primary\/80{color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.text-primary\/80{color:color-mix(in oklab,hsl(var(--primary)) 80%,transparent)}}.text-purple-300{color:var(--color-purple-300)}.text-red-300{color:var(--color-red-300)}.text-red-400{color:var(--color-red-400)}.text-red-400\/80{color:#ff6568cc}@supports (color:color-mix(in lab,red,red)){.text-red-400\/80{color:color-mix(in oklab,var(--color-red-400) 80%,transparent)}}.text-rose-400{color:var(--color-rose-400)}.text-sky-400{color:var(--color-sky-400)}.text-slate-300{color:var(--color-slate-300)}.text-teal-400{color:var(--color-teal-400)}.text-transparent{color:#0000}.text-violet-200\/90{color:#ddd6ffe6}@supports (color:color-mix(in lab,red,red)){.text-violet-200\/90{color:color-mix(in oklab,var(--color-violet-200) 90%,transparent)}}.text-violet-300{color:var(--color-violet-300)}.text-violet-300\/80{color:#c4b4ffcc}@supports (color:color-mix(in lab,red,red)){.text-violet-300\/80{color:color-mix(in oklab,var(--color-violet-300) 80%,transparent)}}.text-violet-400{color:var(--color-violet-400)}.text-violet-400\/70{color:#a685ffb3}@supports (color:color-mix(in lab,red,red)){.text-violet-400\/70{color:color-mix(in oklab,var(--color-violet-400) 70%,transparent)}}.text-white{color:var(--color-white)}.text-white\/95{color:#fffffff2}@supports (color:color-mix(in lab,red,red)){.text-white\/95{color:color-mix(in oklab,var(--color-white) 95%,transparent)}}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.diagonal-fractions{--tw-numeric-fraction:diagonal-fractions;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.lining-nums{--tw-numeric-figure:lining-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.oldstyle-nums{--tw-numeric-figure:oldstyle-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.proportional-nums{--tw-numeric-spacing:proportional-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.slashed-zero{--tw-slashed-zero:slashed-zero;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.stacked-fractions{--tw-numeric-fraction:stacked-fractions;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.normal-nums{font-variant-numeric:normal}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.overline{text-decoration-line:overline}.underline{text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.opacity-0{opacity:0}.opacity-30{opacity:.3}.opacity-35{opacity:.35}.opacity-60{opacity:.6}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.opacity-100{opacity:1}.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-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);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-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px 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-sm{--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-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{--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)}.shadow-amber-500\/10{--tw-shadow-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.shadow-amber-500\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-amber-500) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/5{--tw-shadow-color:#0000000d}@supports (color:color-mix(in lab,red,red)){.shadow-black\/5{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 5%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/10{--tw-shadow-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.shadow-black\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/15{--tw-shadow-color:#00000026}@supports (color:color-mix(in lab,red,red)){.shadow-black\/15{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 15%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/20{--tw-shadow-color:#0003}@supports (color:color-mix(in lab,red,red)){.shadow-black\/20{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 20%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/25{--tw-shadow-color:#00000040}@supports (color:color-mix(in lab,red,red)){.shadow-black\/25{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 25%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-emerald-500\/5{--tw-shadow-color:#00bb7f0d}@supports (color:color-mix(in lab,red,red)){.shadow-emerald-500\/5{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-emerald-500) 5%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-primary\/5{--tw-shadow-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.shadow-primary\/5{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, hsl(var(--primary)) 5%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-primary\/10{--tw-shadow-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.shadow-primary\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, hsl(var(--primary)) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-primary\/20{--tw-shadow-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.shadow-primary\/20{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, hsl(var(--primary)) 20%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-red-500\/10{--tw-shadow-color:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.shadow-red-500\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-red-500) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-black\/40{--tw-ring-color:#0006}@supports (color:color-mix(in lab,red,red)){.ring-black\/40{--tw-ring-color:color-mix(in oklab, var(--color-black) 40%, transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.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,)}.blur-\[130px\]{--tw-blur:blur(130px);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,)}.blur-\[140px\]{--tw-blur:blur(140px);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,)}.blur-\[160px\]{--tw-blur:blur(160px);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,)}.drop-shadow{--tw-drop-shadow-size:drop-shadow(0 1px 2px var(--tw-drop-shadow-color,#0000001a)) drop-shadow(0 1px 1px var(--tw-drop-shadow-color,#0000000f));--tw-drop-shadow:drop-shadow(0 1px 2px #0000001a) drop-shadow(0 1px 1px #0000000f);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,)}.grayscale{--tw-grayscale:grayscale(100%);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,)}.invert{--tw-invert:invert(100%);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,)}.sepia{--tw-sepia:sepia(100%);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,)!important}.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{--tw-backdrop-blur:blur(8px);-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,)}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-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,)}.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,)}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-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,)}.backdrop-grayscale{--tw-backdrop-grayscale:grayscale(100%);-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,)}.backdrop-invert{--tw-backdrop-invert:invert(100%);-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,)}.backdrop-sepia{--tw-backdrop-sepia:sepia(100%);-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,)}.backdrop-filter{-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{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition\!{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events!important;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--tw-duration,var(--default-transition-duration))!important}.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}.duration-500{--tw-duration:.5s;transition-duration:.5s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.select-text{-webkit-user-select:text;user-select:text}:where(.divide-x-reverse>:not(:last-child)){--tw-divide-x-reverse:1}.ring-inset{--tw-ring-inset:inset}@media(hover:hover){.group-hover\:text-primary:is(:where(.group):hover *){color:hsl(var(--primary))}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.last\:border-0:last-child{border-style:var(--tw-border-style);border-width:0}@media(hover:hover){.hover\:border-border:hover{border-color:hsl(var(--border))}.hover\:border-primary\/20:hover{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/20:hover{border-color:color-mix(in oklab,hsl(var(--primary)) 20%,transparent)}}.hover\:border-primary\/30:hover{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/30:hover{border-color:color-mix(in oklab,hsl(var(--primary)) 30%,transparent)}}.hover\:border-primary\/40:hover{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/40:hover{border-color:color-mix(in oklab,hsl(var(--primary)) 40%,transparent)}}.hover\:border-primary\/45:hover{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/45:hover{border-color:color-mix(in oklab,hsl(var(--primary)) 45%,transparent)}}.hover\:border-primary\/50:hover{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/50:hover{border-color:color-mix(in oklab,hsl(var(--primary)) 50%,transparent)}}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-amber-400:hover{background-color:var(--color-amber-400)}.hover\:bg-amber-500\/10:hover{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-amber-500\/10:hover{background-color:color-mix(in oklab,var(--color-amber-500) 10%,transparent)}}.hover\:bg-amber-500\/15:hover{background-color:#f99c0026}@supports (color:color-mix(in lab,red,red)){.hover\:bg-amber-500\/15:hover{background-color:color-mix(in oklab,var(--color-amber-500) 15%,transparent)}}.hover\:bg-amber-500\/20:hover{background-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.hover\:bg-amber-500\/20:hover{background-color:color-mix(in oklab,var(--color-amber-500) 20%,transparent)}}.hover\:bg-background\/30:hover{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-background\/30:hover{background-color:color-mix(in oklab,hsl(var(--background)) 30%,transparent)}}.hover\:bg-background\/40:hover{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-background\/40:hover{background-color:color-mix(in oklab,hsl(var(--background)) 40%,transparent)}}.hover\:bg-background\/60:hover{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-background\/60:hover{background-color:color-mix(in oklab,hsl(var(--background)) 60%,transparent)}}.hover\:bg-background\/80:hover{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-background\/80:hover{background-color:color-mix(in oklab,hsl(var(--background)) 80%,transparent)}}.hover\:bg-emerald-500\/10:hover{background-color:#00bb7f1a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-emerald-500\/10:hover{background-color:color-mix(in oklab,var(--color-emerald-500) 10%,transparent)}}.hover\:bg-emerald-500\/15:hover{background-color:#00bb7f26}@supports (color:color-mix(in lab,red,red)){.hover\:bg-emerald-500\/15:hover{background-color:color-mix(in oklab,var(--color-emerald-500) 15%,transparent)}}.hover\:bg-fuchsia-500\/20:hover{background-color:#e12afb33}@supports (color:color-mix(in lab,red,red)){.hover\:bg-fuchsia-500\/20:hover{background-color:color-mix(in oklab,var(--color-fuchsia-500) 20%,transparent)}}.hover\:bg-indigo-500\/15:hover{background-color:#625fff26}@supports (color:color-mix(in lab,red,red)){.hover\:bg-indigo-500\/15:hover{background-color:color-mix(in oklab,var(--color-indigo-500) 15%,transparent)}}.hover\:bg-neutral-700:hover{background-color:var(--color-neutral-700)}.hover\:bg-primary\/5:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/5:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 5%,transparent)}}.hover\:bg-primary\/10:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/10:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 10%,transparent)}}.hover\:bg-primary\/15:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/15:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 15%,transparent)}}.hover\:bg-primary\/20:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/20:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 20%,transparent)}}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 90%,transparent)}}.hover\:bg-primary\/95:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/95:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 95%,transparent)}}.hover\:bg-red-400:hover{background-color:var(--color-red-400)}.hover\:bg-red-500\/5:hover{background-color:#fb2c360d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-500\/5:hover{background-color:color-mix(in oklab,var(--color-red-500) 5%,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-500\/20:hover{background-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-500\/20:hover{background-color:color-mix(in oklab,var(--color-red-500) 20%,transparent)}}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:text-primary:hover,.hover\:text-primary\/80:hover{color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:text-primary\/80:hover{color:color-mix(in oklab,hsl(var(--primary)) 80%,transparent)}}.hover\:text-red-300:hover{color:var(--color-red-300)}.hover\:text-red-400:hover{color:var(--color-red-400)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-90:hover{opacity:.9}}.focus\:border-primary:focus,.focus\:border-primary\/50:focus{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.focus\:border-primary\/50:focus{border-color:color-mix(in oklab,hsl(var(--primary)) 50%,transparent)}}.focus\:ring-1:focus{--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)}.focus\:ring-primary:focus,.focus\:ring-primary\/50:focus{--tw-ring-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.focus\:ring-primary\/50:focus{--tw-ring-color:color-mix(in oklab, hsl(var(--primary)) 50%, transparent)}}.focus\:ring-violet-500\/50:focus{--tw-ring-color:#8d54ff80}@supports (color:color-mix(in lab,red,red)){.focus\:ring-violet-500\/50:focus{--tw-ring-color:color-mix(in oklab, var(--color-violet-500) 50%, transparent)}}.focus-visible\:ring-2:focus-visible{--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-visible\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:cursor-default:disabled{cursor:default}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.aria-selected\:bg-accent[aria-selected=true]{background-color:hsl(var(--accent))}.aria-selected\:text-accent-foreground[aria-selected=true]{color:hsl(var(--accent-foreground))}@media(min-width:40rem){.sm\:w-\[640px\]{width:640px}.sm\:max-w-\[400px\]{max-width:400px}.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\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:self-auto{align-self:auto}.sm\:p-10{padding:calc(var(--spacing) * 10)}}@media(min-width:48rem){.md\:col-span-2{grid-column:span 2/span 2}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-\[170px_1fr\]{grid-template-columns:170px 1fr}}@media(min-width:64rem){.lg\:flex{display:flex}.lg\:w-40{width:calc(var(--spacing) * 40)}.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\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:grid-cols-\[1fr_300px\]{grid-template-columns:1fr 300px}.lg\:flex-row{flex-direction:row}.lg\:items-center{align-items:center}.lg\:items-stretch{align-items:stretch}}}:root{--background:224 30% 6%;--foreground:210 20% 92%;--card:224 25% 10%;--card-foreground:210 20% 94%;--popover:224 28% 9%;--popover-foreground:210 20% 94%;--primary:172 72% 50%;--primary-foreground:224 47% 8%;--muted:220 16% 14%;--muted-foreground:215 14% 64%;--accent:220 16% 16%;--accent-foreground:210 20% 94%;--border:222 18% 23%;--input:222 18% 23%;--ring:172 72% 50%;--radius:.75rem;color-scheme:dark}.light{--background:0 0% 100%;--foreground:222 22% 12%;--card:0 0% 100%;--card-foreground:222 22% 12%;--popover:0 0% 100%;--popover-foreground:222 22% 12%;--primary:172 70% 38%;--primary-foreground:0 0% 100%;--muted:220 14% 95%;--muted-foreground:220 9% 42%;--accent:220 14% 94%;--accent-foreground:222 22% 12%;--border:220 13% 88%;--input:220 13% 88%;--ring:172 66% 50%;color-scheme:light}@keyframes aurora{0%{background-position:0%}50%{background-position:100%}to{background-position:0%}}.animate-aurora{background-size:200% 200%;animation:25s infinite aurora}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:hsl(var(--border));border-radius:9999px}*{border-color:hsl(var(--border) / .85);outline-color:hsl(var(--primary) / .5)}:focus-visible{outline:2px solid hsl(var(--primary) / .7);outline-offset:2px}@media(prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}html,body,#root{height:100%;overflow:hidden}body{background-color:hsl(var(--background));color:hsl(var(--foreground));font-family:var(--font-sans);-webkit-font-smoothing:antialiased;margin:0}@keyframes flow-cyan{0%{stroke-dasharray:6 3;stroke-dashoffset:18px}to{stroke-dasharray:6 3;stroke-dashoffset:0}}.animate-flow-cyan{animation:1.2s linear infinite flow-cyan}.rounded-2xl.border.bg-card\/45{position:relative;overflow:hidden;background-color:hsl(var(--card) / .85)!important;border-color:hsl(var(--border) / .95)!important;transition:transform .3s cubic-bezier(.4,0,.2,1),background-color .3s cubic-bezier(.4,0,.2,1),border-color .3s cubic-bezier(.4,0,.2,1),box-shadow .3s cubic-bezier(.4,0,.2,1)!important;box-shadow:0 10px 30px -15px #00000073,inset 0 1px #ffffff0d!important}.rounded-2xl.border.bg-card\/45:before{content:"";background:linear-gradient(90deg,hsl(var(--primary)),#6366f1,#a855f7);opacity:.75;height:3.5px;position:absolute;top:0;left:0;right:0;transition:opacity .3s!important}.rounded-2xl.border.bg-card\/45:hover{transform:translateY(-3px);background-color:hsl(var(--card) / .92)!important;border-color:hsl(var(--primary) / .35)!important;box-shadow:0 20px 40px -20px #000000a6,0 0 18px 2px hsl(var(--primary) / .05)!important}.rounded-2xl.border.bg-card\/45:hover:before{opacity:1}.rounded-xl.border.bg-card\/45{background-color:hsl(var(--card) / .88)!important;border-color:hsl(var(--border) / .9)!important;transition:background-color .2s,border-color .2s!important}.rounded-xl.border.bg-card\/45:hover{background-color:hsl(var(--card) / .95)!important;border-color:hsl(var(--primary) / .3)!important}aside nav a[class*="bg-primary/15"]:not([class*=justify-center]){background:linear-gradient(90deg,hsl(var(--primary) / .18),#6366f11f)!important;color:hsl(var(--primary))!important;border-left:3.5px solid hsl(var(--primary))!important;border-radius:0 var(--radius) var(--radius) 0!important;padding-left:calc(.75rem - 3.5px)!important;box-shadow:inset 0 1px #ffffff05!important}aside nav a[class*="bg-primary/15"][class*=justify-center]{background:hsl(var(--primary) / .18)!important;color:hsl(var(--primary))!important;box-shadow:0 0 12px 1px hsl(var(--primary) / .1)!important;border:1px solid hsl(var(--primary) / .3)!important}::-webkit-scrollbar-thumb{border-radius:9999px;background:hsl(var(--primary) / .25)!important}::-webkit-scrollbar-thumb:hover{background:hsl(var(--primary) / .5)!important}input:focus,textarea:focus,select:focus{outline:none;border-color:hsl(var(--primary))!important;box-shadow:0 0 0 2px hsl(var(--primary) / .15)!important}@media(min-width:1440px){html{font-size:16.5px}}@media(min-width:1920px){html{font-size:17.5px}}@media(min-width:2560px){html{font-size:19px}}@media(min-width:3440px){html{font-size:20px}}@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-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-pan-x{syntax:"*";inherits:false}@property --tw-pan-y{syntax:"*";inherits:false}@property --tw-pinch-zoom{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{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-outline-style{syntax:"*";inherits:false;initial-value:solid}@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}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}} diff --git a/frontend/dist/index.html b/frontend/dist/index.html index 54bcb11..0360b9f 100644 --- a/frontend/dist/index.html +++ b/frontend/dist/index.html @@ -7,8 +7,8 @@ Mission Control 2.0 - - + +
diff --git a/frontend/src/components/AppErrorBoundary.tsx b/frontend/src/components/AppErrorBoundary.tsx new file mode 100644 index 0000000..fd18ac7 --- /dev/null +++ b/frontend/src/components/AppErrorBoundary.tsx @@ -0,0 +1,38 @@ +import React from "react" + +// Globale Error Boundary (Review F4): Ein JS-Fehler in einer View riss vorher die komplette +// App in einen weißen Screen. Hier: Fehler anzeigen + Neu-laden-Knopf, Rest bleibt bedienbar +// nach Reload. (GraphView hat zusätzlich seine eigene Boundary für Three.js-Crashes.) +interface State { error: Error | null } + +export class AppErrorBoundary extends React.Component { + state: State = { error: null } + + static getDerivedStateFromError(error: Error): State { + return { error } + } + + componentDidCatch(error: Error, info: React.ErrorInfo) { + console.error("Unbehandelter UI-Fehler:", error, info.componentStack) + } + + render() { + if (!this.state.error) return this.props.children + return ( +
+
+
Da ist etwas schiefgelaufen.
+
+ {this.state.error.message} +
+ +
+
+ ) + } +} diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx index 5a9fa82..8c605e4 100644 --- a/frontend/src/main.tsx +++ b/frontend/src/main.tsx @@ -2,6 +2,7 @@ import React from "react" import ReactDOM from "react-dom/client" import { QueryClient, QueryClientProvider } from "@tanstack/react-query" import App from "./App" +import { AppErrorBoundary } from "./components/AppErrorBoundary" import "./index.css" // Zentraler Daten-Layer: Caching, Dedup, Retry, Polling pro Query-Hook. @@ -17,8 +18,10 @@ const queryClient = new QueryClient({ ReactDOM.createRoot(document.getElementById("root")!).render( - - - + + + + + , ) From a1cea1a1eaa6330b48a5892268afdd0824ae06a9 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 2 Jul 2026 11:09:29 +0200 Subject: [PATCH 20/38] deploy-Config: Kommentar aus dem cmd-Literalblock heraus (waere Teil des Kommandos gewesen) Co-Authored-By: Claude Fable 5 --- deploy/llama-swap.config.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/deploy/llama-swap.config.yaml b/deploy/llama-swap.config.yaml index a49e753..06b8bc1 100644 --- a/deploy/llama-swap.config.yaml +++ b/deploy/llama-swap.config.yaml @@ -4,10 +4,10 @@ globalTTL: 0 models: Qwen3.6-35B-A3B: + # parallel 2 + c 131072: 2 Slots à 65k (Slot 2 = Mem0-Lern-Extraktion, blockiert Voice-Turns + # nicht mehr); KV Q8_0 macht das speicherneutral zu vorher (65k f16). Bench 2026-07-02: + # Q8_0 kostet 0 t/s, MTP n-max 3 = +26% vs. ohne Spec. cmd: | - # parallel 2 + c 131072: 2 Slots à 65k (Slot 2 = Mem0-Lern-Extraktion, blockiert Voice-Turns - # nicht mehr); KV Q8_0 macht das speicherneutral zu vorher (65k f16). Bench 2026-07-02: - # Q8_0 kostet 0 t/s, MTP n-max 3 = +26% vs. ohne Spec. llama-server -m /srv/models/Qwen3.6-35B-A3B-MTP-GGUF/Qwen3.6-35B-A3B-UD-Q4_K_M.gguf --host 127.0.0.1 --port ${PORT} -c 131072 -ngl 999 -fa on --no-mmap --jinja --parallel 2 -cram 16384 -ctk q8_0 -ctv q8_0 --spec-type draft-mtp --spec-draft-n-max 3 ttl: 0 aliases: From 6f7498a956dde739bb386b60b4d9b3e718601633 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 2 Jul 2026 11:21:45 +0200 Subject: [PATCH 21/38] =?UTF-8?q?Turn-Detection:=20Smart=20Turn=20v3=20sem?= =?UTF-8?q?antisch=20(Review=20P2-11)=20=E2=80=94=20live=20verifiziert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - voice_service /turn: smart-turn-v3.2 (8MB ONNX, ~110ms warm inkl. Features); Audio muss LINKS gepadded werden (rechts-Padding -> konstant 'complete', live diagnostiziert) und der Output ist empirisch P(unfertig) — Doku sagt es andersherum, Messung gewinnt - backend /api/voice/turn: Proxy mit fail-open (Turn-Check ist Optimierung, kein Blocker) - useVAD: Semantik-Hold — bei 'incomplete' bis 1,8s auf Fortsetzung warten und anhaengen, statt mitten im Gedanken zu antworten; Deckel 30s; fail-open bei Netzfehlern - Verifiziert: fertig=true(0.74), mitten-im-Wort=false(0.04), via :9001 ok Co-Authored-By: Claude Fable 5 --- backend/routers/voice.py | 19 +++++ .../src/renderer/src/lib/voice/useVAD.ts | 56 ++++++++++++- voice_service/app.py | 80 +++++++++++++++++++ voice_service/requirements.txt | 2 + 4 files changed, 153 insertions(+), 4 deletions(-) diff --git a/backend/routers/voice.py b/backend/routers/voice.py index fe99a78..9cbb602 100644 --- a/backend/routers/voice.py +++ b/backend/routers/voice.py @@ -137,6 +137,25 @@ async def voice_stt(audio: UploadFile = File(...), language: str = Form(default= raise HTTPException(502, f"STT fehlgeschlagen: {exc}") +@router.post("/voice/turn") +async def voice_turn(audio: UploadFile = File(...)) -> dict: + """Semantische Turn-Detection (Smart Turn v3): war die Äußerung fertig? Proxy → Sidecar.""" + data = await audio.read() + if not data: + raise HTTPException(400, "Leeres Audio.") + files = {"audio": (audio.filename or "rec.wav", data, audio.content_type or "audio/wav")} + try: + async with httpx.AsyncClient(timeout=httpx.Timeout(10.0, connect=3.0)) as client: + with Timer("turn"): + r = await client.post(f"{VOICE_SERVICE_URL}/turn", files=files) + r.raise_for_status() + return r.json() + except httpx.HTTPError as exc: + # Turn-Check ist eine Optimierung — bei Ausfall lieber sofort antworten als hängen. + log.warning("Turn-Check fehlgeschlagen: %s", exc) + return {"complete": True, "probability": 1.0, "engine": "fallback"} + + @router.post("/voice/reference") async def voice_set_reference(audio: UploadFile = File(...)) -> dict: """Klon-Referenz (z.B. ElevenLabs-Erzeugnis) hochladen → Chatterbox nutzt sie. Proxy → Sidecar.""" diff --git a/client/lucy-desktop/src/renderer/src/lib/voice/useVAD.ts b/client/lucy-desktop/src/renderer/src/lib/voice/useVAD.ts index f77653d..68f91f6 100644 --- a/client/lucy-desktop/src/renderer/src/lib/voice/useVAD.ts +++ b/client/lucy-desktop/src/renderer/src/lib/voice/useVAD.ts @@ -1,5 +1,6 @@ import { useEffect, useRef } from "react" import { MicVAD } from "@ricky0123/vad-web" +import { BOX_URL } from "../../config" // Freisprech-VAD: lauscht dauerhaft am Mikro und liefert komplette Äußerungen als Blob. // Seit Review P1-7 (2026-07-02) Silero VAD v5 (neuronal, via vad-web/onnxruntime-wasm) statt @@ -19,6 +20,11 @@ const REDEMPTION_MS = 450 // so lange Stille -> Äußerung zu Ende (war 900 const PRE_SPEECH_PAD_MS = 320 // Vorlauf mitschneiden (erster Wortanfang nicht abschneiden) const MIN_SPEECH_MS = 160 // kürzer = Klick/Räuspern -> verwerfen const COOLDOWN_MS = 450 // nach Lucys Antwort kurz taub (Echo/Lautsprecher abklingen lassen) +// Semantische Turn-Detection (Smart Turn v3 auf der Box): meldet sie 'incomplete' (User denkt +// mitten im Satz nach), warten wir bis zu HOLD_MS auf die Fortsetzung und hängen sie an, +// statt mitten im Gedanken zu antworten. Hart begrenzt, damit Lucy nie ewig schweigt. +const HOLD_MS = 1800 +const MAX_UTTERANCE_S = 30 // Sicherheitsdeckel fürs Zusammenhängen // Float32-Samples (16 kHz mono) -> WAV-Blob (PCM16). Ersetzt den MediaRecorder-webm-Umweg: // die Box muss kein Opus mehr dekodieren, Parakeet/Whisper bekommen direkt sauberes WAV. @@ -38,6 +44,25 @@ function toWavBlob(samples: Float32Array, sampleRate = 16000): Blob { return new Blob([buf], { type: "audio/wav" }) } +// Fragt die Box, ob die Äußerung semantisch fertig ist. Fehler => true (nie blockieren). +async function isTurnComplete(audio: Float32Array): Promise { + try { + const fd = new FormData() + fd.append("audio", toWavBlob(audio.subarray(Math.max(0, audio.length - 8 * 16000))), "rec.wav") + const r = await fetch(`${BOX_URL}/api/voice/turn`, { method: "POST", body: fd }) + if (!r.ok) return true + return (await r.json()).complete !== false + } catch { + return true + } +} + +function concatAudio(a: Float32Array, b: Float32Array): Float32Array { + const out = new Float32Array(a.length + b.length) + out.set(a); out.set(b, a.length) + return out +} + export function useVAD({ enabled, paused, onUtterance, onListening }: VADOptions) { const pausedRef = useRef(paused); pausedRef.current = paused const onUtt = useRef(onUtterance); onUtt.current = onUtterance @@ -51,6 +76,15 @@ export function useVAD({ enabled, paused, onUtterance, onListening }: VADOptions if (!enabled) return let cancelled = false let vad: Awaited> | null = null + // Semantik-Hold: bei 'incomplete' gepufferte Äußerung, auf die die Fortsetzung wartet. + let pending: Float32Array | null = null + let holdTimer: ReturnType | null = null + + const emit = (audio: Float32Array) => { + pending = null + if (holdTimer) { clearTimeout(holdTimer); holdTimer = null } + onUtt.current(toWavBlob(audio)) + } ;(async () => { try { @@ -69,15 +103,28 @@ export function useVAD({ enabled, paused, onUtterance, onListening }: VADOptions }), onSpeechStart: () => { if (pausedRef.current || performance.now() < resumeAt.current) return + // User spricht weiter, während eine 'incomplete'-Äußerung gehalten wird -> + // Timer stoppen; die Fortsetzung wird in onSpeechEnd angehängt. + if (holdTimer) { clearTimeout(holdTimer); holdTimer = null } onLst.current?.(true) }, - onSpeechEnd: (audio: Float32Array) => { + onSpeechEnd: async (audio: Float32Array) => { onLst.current?.(false) // Während Lucy denkt/spricht (oder direkt danach) erkannte Sprache = ihr eigenes // Echo bzw. Nachhall -> verwerfen statt transkribieren. - if (cancelled || pausedRef.current || performance.now() < resumeAt.current) return - if (audio.length < MIN_SPEECH_MS * 16) return // 16 Samples/ms @16 kHz - onUtt.current(toWavBlob(audio)) + if (cancelled || pausedRef.current || performance.now() < resumeAt.current) { pending = null; return } + if (!pending && audio.length < MIN_SPEECH_MS * 16) return // 16 Samples/ms @16 kHz + let combined = pending ? concatAudio(pending, audio) : audio + if (combined.length > MAX_UTTERANCE_S * 16000) { + combined = combined.subarray(combined.length - MAX_UTTERANCE_S * 16000) + } + const complete = await isTurnComplete(combined) + if (cancelled) return + if (complete) { emit(combined); return } + // Mitten im Gedanken pausiert: kurz auf die Fortsetzung warten, dann notfalls doch senden. + pending = combined + if (holdTimer) clearTimeout(holdTimer) + holdTimer = setTimeout(() => { if (!cancelled && pending) emit(pending) }, HOLD_MS) }, onVADMisfire: () => onLst.current?.(false), }) @@ -90,6 +137,7 @@ export function useVAD({ enabled, paused, onUtterance, onListening }: VADOptions return () => { cancelled = true + if (holdTimer) clearTimeout(holdTimer) try { vad?.destroy() } catch { /* */ } onLst.current?.(false) } diff --git a/voice_service/app.py b/voice_service/app.py index f54937b..9e4fee9 100644 --- a/voice_service/app.py +++ b/voice_service/app.py @@ -195,6 +195,76 @@ def transcribe(audio_bytes: bytes, suffix: str, language: str, engine: str = "") return transcribe_whisper(audio_bytes, suffix, language) +# ================================================================================= +# Turn-Detection — Smart Turn v3 (pipecat, BSD-2): semantisches Äußerungs-Ende. +# Whisper-Tiny-Encoder + Klassifikator (8 MB int8, ~12 ms CPU). Der Lucy-Client fragt +# nach dem akustischen VAD-Ende hier nach: "War das ein fertiger Satz?" — bei +# 'incomplete' wartet er kurz weiter, statt mitten im Gedanken loszuantworten. +# Inferenz-Pfad 1:1 aus pipecat-ai/smart-turn inference.py (Feature-Shape muss passen). +# ================================================================================= +TURN_REPO = os.environ.get("VOICE_TURN_REPO", "pipecat-ai/smart-turn-v3") +TURN_FILE = os.environ.get("VOICE_TURN_FILE", "smart-turn-v3.2-cpu.onnx") +_turn = None # (session, feature_extractor) +_turn_failed = False + + +def turn_model(): + global _turn, _turn_failed + if _turn is None and not _turn_failed: + try: + import onnxruntime as ort + from huggingface_hub import hf_hub_download + from transformers import WhisperFeatureExtractor + log.info("Lade Smart Turn '%s/%s' …", TURN_REPO, TURN_FILE) + path = hf_hub_download(TURN_REPO, TURN_FILE) + so = ort.SessionOptions() + so.graph_optimization_level = ort.GraphOptimizationLevel.ORT_ENABLE_ALL + sess = ort.InferenceSession(path, sess_options=so, providers=["CPUExecutionProvider"]) + _turn = (sess, WhisperFeatureExtractor(chunk_length=8)) + except Exception: + _turn_failed = True + log.exception("Smart Turn nicht verfügbar — /turn meldet complete=true (Fallback).") + return _turn + + +def check_turn(audio_bytes: bytes, suffix: str) -> dict: + model = turn_model() + if model is None: + return {"complete": True, "probability": 1.0, "engine": "none"} + sess, fe = model + from faster_whisper.audio import decode_audio + with tempfile.NamedTemporaryFile(suffix=suffix, delete=False) as tf: + tf.write(audio_bytes) + src = tf.name + try: + import numpy as np + arr = decode_audio(src, sampling_rate=16000) + # Smart Turn erwartet das Audio AM ENDE des 8-s-Fensters (Zeros vorn) — die Turn-Ende- + # Hinweise liegen in den letzten Frames. Der FeatureExtractor padded rechts (Zeros hinten), + # damit sah das Modell immer nur Padding und meldete konstant 'complete' (live diagnostiziert). + # Darum manuell links auffüllen und exakt 8 s übergeben. + n = 8 * 16000 + arr = arr[-n:] + if len(arr) < n: + arr = np.concatenate([np.zeros(n - len(arr), dtype=np.float32), arr.astype(np.float32)]) + inputs = fe(arr, sampling_rate=16000, return_tensors="np", padding="do_not_pad", + truncation=True, do_normalize=True) + out = sess.run(None, {"input_features": inputs.input_features}) + # Output-Tensor heißt 'logits' — je nach Export roher Logit ODER schon Sigmoid. + # Robust: Werte außerhalb [0,1] durch Sigmoid schicken, sonst direkt nutzen. + raw = float(out[0][0].item() if hasattr(out[0][0], "item") else out[0][0]) + p = raw if 0.0 <= raw <= 1.0 else 1.0 / (1.0 + float(np.exp(-raw))) + # EMPIRISCH VERIFIZIERT (2026-07-02, Box): v3.2-cpu liefert P(UNFERTIG) — + # fertiger Satz -> 0.26, mitten im Wort abgeschnitten -> 0.96, Stille -> 0.99. + # (Die Upstream-Doku beschreibt es andersherum; Messung schlägt Doku.) + return {"complete": p <= 0.5, "probability": round(1.0 - p, 3), "engine": "smart-turn-v3"} + finally: + try: + os.unlink(src) + except OSError: + pass + + # ================================================================================= # TTS — Piper (offizielles Binary; Stimme = ONNX-Datei + .json daneben) # ================================================================================= @@ -467,6 +537,16 @@ async def stt(audio: UploadFile = File(...), language: str = Form(default=""), return {"text": text} +@app.post("/turn") +async def turn(audio: UploadFile = File(...)) -> dict: + """Semantische Turn-Detection: War die Äußerung ein fertiger Gedanke? (Smart Turn v3)""" + data = await audio.read() + if not data: + raise HTTPException(400, "Leeres Audio.") + suffix = Path(audio.filename or "rec.wav").suffix or ".wav" + return check_turn(data, suffix) + + @app.post("/tts") def tts(body: TTSIn) -> Response: text = (body.text or "").strip() diff --git a/voice_service/requirements.txt b/voice_service/requirements.txt index e9946c9..52c9566 100644 --- a/voice_service/requirements.txt +++ b/voice_service/requirements.txt @@ -11,3 +11,5 @@ edge-tts # STT-Default seit Review 2026-07-02: Parakeet-TDT 0.6B v3 (DE-WER besser + ~10x schneller # als whisper-medium auf CPU, via onnx-asr). whisper bleibt als Fallback installiert. onnx-asr[cpu,hub] +# Semantische Turn-Detection (Smart Turn v3, Whisper-Mel-Features) +transformers From 88c2659a9cc594521e789ee8ad2442667d3c158c Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 2 Jul 2026 11:25:46 +0200 Subject: [PATCH 22/38] P3: llama-swap capabilities deklariert + Plugin lernt Tool-Namen (Hermes-0.18-API) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - deploy-Config: capabilities (in/out/tools/context) je Modell — /v1/models informiert Clients korrekt; context = nutzbarer Kontext pro Request (c/parallel) - mc2-memory: sync_turn nutzt messages aus Hermes >=0.18 — nur Tool-NAMEN (Ergebnisse bleiben draussen: untrusted/Poisoning-Vektor); deployt, Postcheck gruen - Mem0 v3-Algorithmus auf der Box verifiziert (BM25/Entity/Hybrid in 2.0.8 aktiv) Co-Authored-By: Claude Fable 5 --- deploy/llama-swap.config.yaml | 30 +++++++++++++++++++++++++++ hermes/plugins/mc2-memory/__init__.py | 12 +++++++++++ 2 files changed, 42 insertions(+) diff --git a/deploy/llama-swap.config.yaml b/deploy/llama-swap.config.yaml index 06b8bc1..33cb109 100644 --- a/deploy/llama-swap.config.yaml +++ b/deploy/llama-swap.config.yaml @@ -13,24 +13,44 @@ models: aliases: - hermes - fast + # context = nutzbarer Kontext PRO REQUEST (c geteilt durch parallel-Slots). + capabilities: + in: [text] + out: [text] + tools: true + context: 65536 Qwen3.5-122B-A10B: cmd: | llama-server -m /srv/models/Qwen3.5-122B-A10B-GGUF/Q4_K_M/Qwen3.5-122B-A10B-Q4_K_M-00001-of-00003.gguf --host 127.0.0.1 --port ${PORT} -c 32768 -ngl 999 -fa on --no-mmap --jinja --cache-reuse 256 -cram 16384 ttl: 600 aliases: - heavy + capabilities: + in: [text] + out: [text] + tools: true + context: 32768 Qwen3-Coder-Next: cmd: | llama-server -m /srv/models/Qwen3-Coder-Next-GGUF/Qwen3-Coder-Next-Q4_K_M.gguf --host 127.0.0.1 --port ${PORT} -c 131072 -ngl 999 -fa on --no-mmap --jinja --cache-reuse 256 -cram 16384 ttl: 600 aliases: - coder + capabilities: + in: [text] + out: [text] + tools: true + context: 131072 Qwen3-VL-8B-Instruct: cmd: | llama-server -m /srv/models/Qwen3-VL-8B-Instruct-GGUF/Qwen3VL-8B-Instruct-Q4_K_M.gguf --host 127.0.0.1 --port ${PORT} -c 32768 -ngl 999 -fa on --no-mmap --mmproj /srv/models/Qwen3-VL-8B-Instruct-GGUF/mmproj-Qwen3VL-8B-Instruct-F16.gguf --jinja ttl: 300 aliases: - vision + capabilities: + in: [text, image] + out: [text] + context: 32768 Qwen3-Embedding-0.6B: cmd: | llama-server -m /srv/models/Qwen3-Embedding-0.6B-GGUF/Qwen3-Embedding-0.6B-Q8_0.gguf --host 127.0.0.1 --port ${PORT} --embedding --pooling last -ngl 999 -fa on --no-mmap -c 8192 @@ -43,12 +63,22 @@ models: ttl: 300 aliases: - coder-lite + capabilities: + in: [text] + out: [text] + tools: true + context: 131072 GLM-4.6V-Flash: cmd: | llama-server -m /srv/models/GLM-4.6V-Flash-GGUF/GLM-4.6V-Flash-Q4_K_M.gguf --host 127.0.0.1 --port ${PORT} -c 131072 -ngl 999 -fa on --no-mmap --mmproj /srv/models/GLM-4.6V-Flash-GGUF/mmproj-BF16.gguf --jinja ttl: 300 aliases: - scout + capabilities: + in: [text, image] + out: [text] + tools: true + context: 131072 groups: brains: swap: false diff --git a/hermes/plugins/mc2-memory/__init__.py b/hermes/plugins/mc2-memory/__init__.py index 9fba4fb..3b8cfa8 100644 --- a/hermes/plugins/mc2-memory/__init__.py +++ b/hermes/plugins/mc2-memory/__init__.py @@ -150,6 +150,18 @@ class MC2MemoryProvider(MemoryProvider): return msgs: List[Dict[str, str]] = [{"role": "user", "content": u}] a = (assistant_content or "").strip() + # Hermes ≥0.18 liefert optional den vollen Turn-Kontext (`messages`, inkl. Tool-Calls). + # Bewusst NUR die Tool-NAMEN mitlernen ("hat X per Tool Y geprüft") — Tool-ERGEBNISSE + # sind untrusted (Web-Inhalte!) und wären ein Poisoning-Vektor am Junk-Guard vorbei. + if messages: + tools = [] + for m in messages: + for tc in (m.get("tool_calls") or []): + name = ((tc.get("function") or {}).get("name") or "").strip() + if name and name not in tools: + tools.append(name) + if tools: + a = (a + f"\n[genutzte Tools: {', '.join(tools[:6])}]").strip() if a: msgs.append({"role": "assistant", "content": a[:4000]}) try: From c3d1cc87e256de3f67c2b2584f5ecb8be983c403 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 2 Jul 2026 11:29:10 +0200 Subject: [PATCH 23/38] Lucy: useVoiceAgent entflochten (Review P2-13a) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit textPipeline.ts (Umlaute/TTS-Cleaning/Emo-Tags/Session-Id), visionIntent.ts, perf.ts — alles pure Funktionen, einzeln testbar; der Hook (397->305 Z) orchestriert nur noch. Verhalten unveraendert, tsc gruen. Co-Authored-By: Claude Fable 5 --- .../src/renderer/src/lib/voice/perf.ts | 8 ++ .../renderer/src/lib/voice/textPipeline.ts | 74 ++++++++++++++ .../renderer/src/lib/voice/useVoiceAgent.ts | 98 ++----------------- .../renderer/src/lib/voice/visionIntent.ts | 11 +++ 4 files changed, 100 insertions(+), 91 deletions(-) create mode 100644 client/lucy-desktop/src/renderer/src/lib/voice/perf.ts create mode 100644 client/lucy-desktop/src/renderer/src/lib/voice/textPipeline.ts create mode 100644 client/lucy-desktop/src/renderer/src/lib/voice/visionIntent.ts diff --git a/client/lucy-desktop/src/renderer/src/lib/voice/perf.ts b/client/lucy-desktop/src/renderer/src/lib/voice/perf.ts new file mode 100644 index 0000000..7e6e3da --- /dev/null +++ b/client/lucy-desktop/src/renderer/src/lib/voice/perf.ts @@ -0,0 +1,8 @@ +// Perf-Diagnose (Client): Zeit pro Stufe ab „Mikro losgelassen". Opt-in via localStorage lucy_perf=1. +// NUR Console (kein POST an den pocket_server — der generiert Audio; POSTs mittendrin +// verursachten hakelige Sprachausgabe). (Aus useVoiceAgent extrahiert, Review P2-13a.) + +export const PERF = typeof localStorage !== "undefined" && localStorage.getItem("lucy_perf") === "1" + +export function plogSend(msg: string) { if (PERF) console.log(`[lucy-perf] ${msg}`) } +export function plog(label: string, ms: number) { plogSend(`${label} = ${Math.round(ms)}ms`) } diff --git a/client/lucy-desktop/src/renderer/src/lib/voice/textPipeline.ts b/client/lucy-desktop/src/renderer/src/lib/voice/textPipeline.ts new file mode 100644 index 0000000..fc31c21 --- /dev/null +++ b/client/lucy-desktop/src/renderer/src/lib/voice/textPipeline.ts @@ -0,0 +1,74 @@ +// Pure Text-Verarbeitung für den Voice-Loop (aus useVoiceAgent extrahiert, Review P2-13a). +// Alles hier ist zustandslos und einzeln testbar — der Hook orchestriert nur noch. + +// Hermes schreibt manchmal ASCII-Umlaute (ue/ae/oe/ss) statt ä/ö/ü/ß -> pocket-tts liest die falsch vor. +// Gezielt häufige UMLAUT-Stämme zurückwandeln. KONSERVATIV: nur Muster, bei denen ASCII fast immer ein +// Umlaut ist (echte "ue"-Wörter wie aktuell/neue/Quelle bleiben unangetastet — die sind hier NICHT gelistet). +const UMLAUT_FIX: [RegExp, string][] = [ + [/ueber/gi, "über"], [/\bfuer\b/gi, "für"], [/natuerlich/gi, "natürlich"], [/zurueck/gi, "zurück"], + [/unterstuetz/gi, "unterstütz"], [/ueberpruef/gi, "überprüf"], [/\bpruef/gi, "prüf"], [/gefuehl/gi, "gefühl"], + [/\bfuehl/gi, "fühl"], [/\bfuehr/gi, "führ"], [/\bfuenf/gi, "fünf"], [/\bgruen/gi, "grün"], [/\bfrueh/gi, "früh"], + [/\bglueck/gi, "glück"], [/\bstueck/gi, "stück"], [/gemuetlich/gi, "gemütlich"], [/verfueg/gi, "verfüg"], + [/\bmoecht/gi, "möcht"], [/\bkoenn/gi, "könn"], [/\bwuerd/gi, "würd"], [/\bmuess/gi, "müss"], [/\bduerf/gi, "dürf"], + [/\bhaett/gi, "hätt"], [/\bwaer/gi, "wär"], [/\bspaet/gi, "spät"], + [/\btaeglich/gi, "täglich"], [/\bnaechst/gi, "nächst"], [/\baehnlich/gi, "ähnlich"], [/waehrend/gi, "während"], + [/\bwaehl/gi, "wähl"], [/erklaer/gi, "erklär"], [/\bschoen/gi, "schön"], [/\bgroess/gi, "größ"], [/\bhoer/gi, "hör"], + [/\boeffn/gi, "öffn"], [/\bboese/gi, "böse"], [/\bloesch/gi, "lösch"], [/\bstoer/gi, "stör"], [/koennt/gi, "könnt"], + // erweitert (30.06.): weitere häufige Stämme + sicheres -ität-Suffix. KONSERVATIV gewählt; + // der TTS-Server (_fix_umlauts) hat zusätzlich ein Netz. neu/aktuell/Steuer/Feuer bleiben unberührt. + [/itaet/gi, "ität"], + [/\bmoeglich/gi, "möglich"], [/gespraech/gi, "gespräch"], [/\bmaerz/gi, "märz"], + [/geschaeft/gi, "geschäft"], [/gefaehr/gi, "gefähr"], [/\bhaeng/gi, "häng"], [/\blaeng/gi, "läng"], + [/\bmaenner/gi, "männer"], [/\bmaedchen/gi, "mädchen"], [/\bvaeter/gi, "väter"], [/\btraeum/gi, "träum"], + [/\bsaetz/gi, "sätz"], [/\bplaetz/gi, "plätz"], [/\bkaelte/gi, "kälte"], [/\bzaehl/gi, "zähl"], + [/\baerg/gi, "ärg"], [/\baerzt/gi, "ärzt"], [/aeusser/gi, "äußer"], + [/\btuer/gi, "tür"], [/\bkueche/gi, "küche"], [/buech/gi, "büch"], [/\bbuero/gi, "büro"], [/\bbuerg/gi, "bürg"], + [/\bsued/gi, "süd"], [/schueler/gi, "schüler"], [/uebung/gi, "übung"], [/kuenstl/gi, "künstl"], + [/\bmuede/gi, "müde"], [/\bmuell/gi, "müll"], [/\bdrueck/gi, "drück"], [/stuetz/gi, "stütz"], + [/\bmoebel/gi, "möbel"], [/loes/gi, "lös"], [/voellig/gi, "völlig"], [/zwoelf/gi, "zwölf"], + [/\bkoenig/gi, "könig"], [/\bhoeh/gi, "höh"], [/\bdoerf/gi, "dörf"], [/\bwoert/gi, "wört"], +] +export function restoreUmlauts(s: string): string { + let out = s + for (const [re, rep] of UMLAUT_FIX) out = out.replace(re, rep as string) + return out +} + +// Optionaler Stimmungs-Tag, den Hermes ans Ende haengen kann ( ...). Steuert NUR den +// Gesichtsausdruck -> wird vor Anzeige UND vor dem Vorlesen entfernt. Fallback = Sentiment-Heuristik. +export const EMO_TAG = //i +export function stripEmoTag(s: string): string { return s.replace(//gi, "").trimEnd() } + +// Hermes hängt bei selbst erzeugten Medien (z.B. eigener Screenshot via pc-control) einen Roh-Token +// „MEDIA:" an. Das ist weder Sprech- noch Anzeigetext -> überall entfernen (bis Medien echt +// gerendert werden). Betrifft auch Lucys eigene Bildschirm-Sicht, die den Screenshot ohnehin schon liefert. +export function stripMedia(s: string): string { + return s.replace(/\bMEDIA:\S+/gi, "").replace(/[ \t]{2,}/g, " ").replace(/[ \t]+\n/g, "\n").trimEnd() +} + +export function cleanForTTS(s: string): string { + return restoreUmlauts(s) + .replace(/```[\s\S]*?```/g, " ").replace(/`([^`]*)`/g, "$1") + .replace(/\[([^\]]+)\]\([^)]+\)/g, "$1") + .replace(/\bMEDIA:\S+/gi, " ") + // Zeitzonen-Codes (UTC/CET/GMT…) + evtl. angehängte Zeit: Pocket mangelt die Akronyme zu + // Kauderwelsch -> aus der Stimme entfernen (Anzeige behält sie). Lucy sagt die lokale Zeit ohnehin. + .replace(/\b(?:UTC|GMT|CET|CEST|MEZ|MESZ|PST|PDT|EST|EDT)\b\s*[+\-]?\d{0,2}(?::\d{2})?/gi, " ") + // Zahlen/Uhrzeiten (18:01 -> „achtzehn Uhr eins", 2026 -> „zweitausend…") normalisiert jetzt + // der lokale pocket_server (text_norm.py, num2words) — kontextsicher (Modellnummern bleiben). + .replace(/https?:\/\/\S+/gi, " ").replace(/www\.\S+/gi, " ").replace(/\b\S+@\S+\.\S+\b/g, " ") + .replace(/[*_#>~|`]+/g, " ").replace(/^\s*[-•·]\s+/gm, " ") + .replace(/\s*&\s*/g, " und ") + .replace(/(\d)\s*%/g, "$1 Prozent").replace(/%/g, " Prozent ") + .replace(/(\d)\s*°\s*C?/g, "$1 Grad").replace(/°/g, " Grad ") + .replace(/\s*=\s*/g, " gleich ").replace(/\s*\/\s*/g, " ") + .replace(/[\u{1F300}-\u{1FAFF}\u{2600}-\u{27BF}\u{2190}-\u{21FF}\u{2B00}-\u{2BFF}]/gu, "") + .replace(/\s+/g, " ").trim() +} + +// FRISCHE Session pro App-Start (NICHT in localStorage persistieren). Sonst wächst der Hermes-Verlauf +// über alle Starts hinweg unbegrenzt (gesehen: 97k+ Tokens) -> Degeneration/Wiederhol-Schleifen. +// Dauerhaftes Gedächtnis liegt ohnehin in Mem0 (sessionunabhängig) -> Continuity bleibt erhalten. +export function newSessionId(): string { + return "lucy-" + Math.random().toString(36).slice(2) + Date.now().toString(36) +} diff --git a/client/lucy-desktop/src/renderer/src/lib/voice/useVoiceAgent.ts b/client/lucy-desktop/src/renderer/src/lib/voice/useVoiceAgent.ts index f9347db..c6de99a 100644 --- a/client/lucy-desktop/src/renderer/src/lib/voice/useVoiceAgent.ts +++ b/client/lucy-desktop/src/renderer/src/lib/voice/useVoiceAgent.ts @@ -5,103 +5,19 @@ import { AudioQueue } from "./audio" import { sentimentToEmotion, type Emotion } from "./sentiment" import { BOX_URL, SYSTEM_PROMPT } from "../../config" import { stt, tts, SpeechScheduler } from "../../voice-core" +import { EMO_TAG, cleanForTTS, newSessionId, restoreUmlauts, stripEmoTag, stripMedia } from "./textPipeline" +import { VISION_RX, extractWindowName } from "./visionIntent" +import { PERF, plog, plogSend } from "./perf" -// Voll-Duplex-Schleife: PTT -> Box /stt -> Box /chat (SSE Hermes) -> CHUNKS -> lokal /tts -> AudioQueue. +// Voll-Duplex-Schleife: PTT/VAD -> Box /stt -> Box /chat (SSE Hermes) -> CHUNKS -> lokal /tts -> AudioQueue. // Hirn+STT = Box (wie WebUI), Stimme = lokal (pocket-tts, CPU). Antwort wird in groessere Bloecke -// gebuendelt (>=MIN_CHUNK Zeichen, kein Mini-Satz-Babble) und satzweise frueh gesprochen. -// Warm-Gate beim Start: Bedienung erst frei, wenn der TTS-Dienst antwortet (Modell geladen). +// gebuendelt und satzweise frueh gesprochen. Warm-Gate beim Start: Bedienung erst frei, wenn der +// TTS-Dienst antwortet. Text-Verarbeitung: textPipeline.ts · Vision-Intent: visionIntent.ts · +// Perf-Logging: perf.ts (Review P2-13a: Hook = nur noch Orchestrierung). export type VoiceStatus = "warming" | "idle" | "listening" | "transcribing" | "thinking" | "speaking" | "error" export interface ChatMsg { role: "user" | "assistant"; text: string } -// Perf-Diagnose (Client): Zeit pro Stufe ab „Mikro losgelassen". Aus via localStorage lucy_perf=0. -// Perf-Diagnose: NUR Console (kein POST an den pocket_server mehr — der generiert Audio; POSTs -// mittendrin verursachten hakelige Sprachausgabe). Diagnose ist durch (Thinking war die Ursache). -const PERF = typeof localStorage !== "undefined" && localStorage.getItem("lucy_perf") === "1" // opt-in statt default -function plogSend(msg: string) { if (PERF) console.log(`[lucy-perf] ${msg}`) } -function plog(label: string, ms: number) { plogSend(`${label} = ${Math.round(ms)}ms`) } - -// Hermes schreibt manchmal ASCII-Umlaute (ue/ae/oe/ss) statt ä/ö/ü/ß -> pocket-tts liest die falsch vor. -// Gezielt häufige UMLAUT-Stämme zurückwandeln. KONSERVATIV: nur Muster, bei denen ASCII fast immer ein -// Umlaut ist (echte "ue"-Wörter wie aktuell/neue/Quelle bleiben unangetastet — die sind hier NICHT gelistet). -const UMLAUT_FIX: [RegExp, string][] = [ - [/ueber/gi, "über"], [/\bfuer\b/gi, "für"], [/natuerlich/gi, "natürlich"], [/zurueck/gi, "zurück"], - [/unterstuetz/gi, "unterstütz"], [/ueberpruef/gi, "überprüf"], [/\bpruef/gi, "prüf"], [/gefuehl/gi, "gefühl"], - [/\bfuehl/gi, "fühl"], [/\bfuehr/gi, "führ"], [/\bfuenf/gi, "fünf"], [/\bgruen/gi, "grün"], [/\bfrueh/gi, "früh"], - [/\bglueck/gi, "glück"], [/\bstueck/gi, "stück"], [/gemuetlich/gi, "gemütlich"], [/verfueg/gi, "verfüg"], - [/\bmoecht/gi, "möcht"], [/\bkoenn/gi, "könn"], [/\bwuerd/gi, "würd"], [/\bmuess/gi, "müss"], [/\bduerf/gi, "dürf"], - [/\bhaett/gi, "hätt"], [/\bwaer/gi, "wär"], [/\bspaet/gi, "spät"], - [/\btaeglich/gi, "täglich"], [/\bnaechst/gi, "nächst"], [/\baehnlich/gi, "ähnlich"], [/waehrend/gi, "während"], - [/\bwaehl/gi, "wähl"], [/erklaer/gi, "erklär"], [/\bschoen/gi, "schön"], [/\bgroess/gi, "größ"], [/\bhoer/gi, "hör"], - [/\boeffn/gi, "öffn"], [/\bboese/gi, "böse"], [/\bloesch/gi, "lösch"], [/\bstoer/gi, "stör"], [/koennt/gi, "könnt"], - // erweitert (30.06.): weitere häufige Stämme + sicheres -ität-Suffix. KONSERVATIV gewählt; - // der TTS-Server (_fix_umlauts) hat zusätzlich ein Netz. neu/aktuell/Steuer/Feuer bleiben unberührt. - [/itaet/gi, "ität"], - [/\bmoeglich/gi, "möglich"], [/gespraech/gi, "gespräch"], [/\bmaerz/gi, "märz"], - [/geschaeft/gi, "geschäft"], [/gefaehr/gi, "gefähr"], [/\bhaeng/gi, "häng"], [/\blaeng/gi, "läng"], - [/\bmaenner/gi, "männer"], [/\bmaedchen/gi, "mädchen"], [/\bvaeter/gi, "väter"], [/\btraeum/gi, "träum"], - [/\bsaetz/gi, "sätz"], [/\bplaetz/gi, "plätz"], [/\bkaelte/gi, "kälte"], [/\bzaehl/gi, "zähl"], - [/\baerg/gi, "ärg"], [/\baerzt/gi, "ärzt"], [/aeusser/gi, "äußer"], - [/\btuer/gi, "tür"], [/\bkueche/gi, "küche"], [/buech/gi, "büch"], [/\bbuero/gi, "büro"], [/\bbuerg/gi, "bürg"], - [/\bsued/gi, "süd"], [/schueler/gi, "schüler"], [/uebung/gi, "übung"], [/kuenstl/gi, "künstl"], - [/\bmuede/gi, "müde"], [/\bmuell/gi, "müll"], [/\bdrueck/gi, "drück"], [/stuetz/gi, "stütz"], - [/\bmoebel/gi, "möbel"], [/loes/gi, "lös"], [/voellig/gi, "völlig"], [/zwoelf/gi, "zwölf"], - [/\bkoenig/gi, "könig"], [/\bhoeh/gi, "höh"], [/\bdoerf/gi, "dörf"], [/\bwoert/gi, "wört"], -] -export function restoreUmlauts(s: string): string { - let out = s - for (const [re, rep] of UMLAUT_FIX) out = out.replace(re, rep as string) - return out -} - -// Optionaler Stimmungs-Tag, den Hermes ans Ende haengen kann ( ...). Steuert NUR den -// Gesichtsausdruck -> wird vor Anzeige UND vor dem Vorlesen entfernt. Fallback = Sentiment-Heuristik. -const EMO_TAG = //i -function stripEmoTag(s: string): string { return s.replace(//gi, "").trimEnd() } - -// Hermes hängt bei selbst erzeugten Medien (z.B. eigener Screenshot via pc-control) einen Roh-Token -// „MEDIA:" an. Das ist weder Sprech- noch Anzeigetext -> überall entfernen (bis Medien echt -// gerendert werden). Betrifft auch Lucys eigene Bildschirm-Sicht, die den Screenshot ohnehin schon liefert. -function stripMedia(s: string): string { - return s.replace(/\bMEDIA:\S+/gi, "").replace(/[ \t]{2,}/g, " ").replace(/[ \t]+\n/g, "\n").trimEnd() -} - -function cleanForTTS(s: string): string { - return restoreUmlauts(s) - .replace(/```[\s\S]*?```/g, " ").replace(/`([^`]*)`/g, "$1") - .replace(/\[([^\]]+)\]\([^)]+\)/g, "$1") - .replace(/\bMEDIA:\S+/gi, " ") - // Zeitzonen-Codes (UTC/CET/GMT…) + evtl. angehängte Zeit: Pocket mangelt die Akronyme zu - // Kauderwelsch -> aus der Stimme entfernen (Anzeige behält sie). Lucy sagt die lokale Zeit ohnehin. - .replace(/\b(?:UTC|GMT|CET|CEST|MEZ|MESZ|PST|PDT|EST|EDT)\b\s*[+\-]?\d{0,2}(?::\d{2})?/gi, " ") - // Zahlen/Uhrzeiten (18:01 -> „achtzehn Uhr eins", 2026 -> „zweitausend…") normalisiert jetzt - // der lokale pocket_server (text_norm.py, num2words) — kontextsicher (Modellnummern bleiben). - .replace(/https?:\/\/\S+/gi, " ").replace(/www\.\S+/gi, " ").replace(/\b\S+@\S+\.\S+\b/g, " ") - .replace(/[*_#>~|`]+/g, " ").replace(/^\s*[-•·]\s+/gm, " ") - .replace(/\s*&\s*/g, " und ") - .replace(/(\d)\s*%/g, "$1 Prozent").replace(/%/g, " Prozent ") - .replace(/(\d)\s*°\s*C?/g, "$1 Grad").replace(/°/g, " Grad ") - .replace(/\s*=\s*/g, " gleich ").replace(/\s*\/\s*/g, " ") - .replace(/[\u{1F300}-\u{1FAFF}\u{2600}-\u{27BF}\u{2190}-\u{21FF}\u{2B00}-\u{2BFF}]/gu, "") - .replace(/\s+/g, " ").trim() -} - -// FRISCHE Session pro App-Start (NICHT in localStorage persistieren). Sonst wächst der Hermes-Verlauf -// über alle Starts hinweg unbegrenzt (gesehen: 97k+ Tokens) -> Degeneration/Wiederhol-Schleifen. -// Dauerhaftes Gedächtnis liegt ohnehin in Mem0 (sessionunabhängig) -> Continuity bleibt erhalten. -function newSessionId(): string { - return "lucy-" + Math.random().toString(36).slice(2) + Date.now().toString(36) -} - -// Bildschirm-Sicht: erkennt im Gesagten die Bitte, auf den Schirm zu schauen -const VISION_RX = /\b(schau|sieh|siehst|guck|guckst|zeig|bildschirm|screen|monitor|fenster|erkennst?|lies (mir|das)|was (steht|ist) (da|hier|auf)|auf meinem (bildschirm|schirm|screen))\b/i -function extractWindowName(text: string): string | null { - // grobe Heuristik: Wort/Phrase nach 'fenster|app|programm|in|auf|bei|im' - const m = text.match(/(?:fenster|app|programm|in|auf|bei|im)\s+([A-Za-zÄÖÜäöü][\w.+\- ]{2,28})/i) - if (!m) return null - return m[1].replace(/\b(an|fenster|programm|app|bildschirm|schirm|screen|siehst|du)\b/gi, "").trim() || null -} - export function useVoiceAgent() { const [status, setStatus] = useState("warming") const [ready, setReady] = useState(false) diff --git a/client/lucy-desktop/src/renderer/src/lib/voice/visionIntent.ts b/client/lucy-desktop/src/renderer/src/lib/voice/visionIntent.ts new file mode 100644 index 0000000..04a400e --- /dev/null +++ b/client/lucy-desktop/src/renderer/src/lib/voice/visionIntent.ts @@ -0,0 +1,11 @@ +// Bildschirm-Sicht-Intent: erkennt im Gesagten die Bitte, auf den Schirm zu schauen +// (aus useVoiceAgent extrahiert, Review P2-13a). + +export const VISION_RX = /\b(schau|sieh|siehst|guck|guckst|zeig|bildschirm|screen|monitor|fenster|erkennst?|lies (mir|das)|was (steht|ist) (da|hier|auf)|auf meinem (bildschirm|schirm|screen))\b/i + +export function extractWindowName(text: string): string | null { + // grobe Heuristik: Wort/Phrase nach 'fenster|app|programm|in|auf|bei|im' + const m = text.match(/(?:fenster|app|programm|in|auf|bei|im)\s+([A-Za-zÄÖÜäöü][\w.+\- ]{2,28})/i) + if (!m) return null + return m[1].replace(/\b(an|fenster|programm|app|bildschirm|schirm|screen|siehst|du)\b/gi, "").trim() || null +} From f90e5f4519638c9e5a7d271ac92f72d94a9e8e52 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 2 Jul 2026 11:31:42 +0200 Subject: [PATCH 24/38] =?UTF-8?q?Lucy:=20Electron=2033=20->=2043=20(Chromi?= =?UTF-8?q?um=20150,=20Node=2024)=20=E2=80=94=20Boot-Smoke-Test=20gruen=20?= =?UTF-8?q?(Review=20P2-13b)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- client/lucy-desktop/package-lock.json | 819 +++----------------------- client/lucy-desktop/package.json | 2 +- 2 files changed, 67 insertions(+), 754 deletions(-) diff --git a/client/lucy-desktop/package-lock.json b/client/lucy-desktop/package-lock.json index d3d1cab..be623de 100644 --- a/client/lucy-desktop/package-lock.json +++ b/client/lucy-desktop/package-lock.json @@ -25,7 +25,7 @@ "@types/react-dom": "^18.3.1", "@types/three": "^0.169.0", "@vitejs/plugin-react": "^4.3.4", - "electron": "^33.2.1", + "electron": "^43.0.0", "electron-vite": "^3.0.0", "typescript": "^5.6.3", "vite": "^6.0.3" @@ -338,26 +338,48 @@ "node": ">=6.9.0" } }, + "node_modules/@electron-internal/extract-zip": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@electron-internal/extract-zip/-/extract-zip-1.0.4.tgz", + "integrity": "sha512-Zr1Vs7E9tpCNhZHDAbFVXc2gEVCG9RqPDjrno5+bdgB6LRAuvgyMHJut4NCVyYwtAieapMzc3fiQ3CSTi75ARg==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=22.12.0" + } + }, "node_modules/@electron/get": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", - "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-5.0.0.tgz", + "integrity": "sha512-pjoBpru1KdEtcExBnuHAP1cAc/5faoedw0hzJkL3o4/IJp7HNF1+fbrdxT3gMYRX2oJfvnA/WXeCTVQpYYxyJA==", "dev": true, "license": "MIT", "dependencies": { "debug": "^4.1.1", - "env-paths": "^2.2.0", - "fs-extra": "^8.1.0", - "got": "^11.8.5", + "env-paths": "^3.0.0", + "graceful-fs": "^4.2.11", "progress": "^2.0.3", - "semver": "^6.2.0", + "semver": "^7.6.3", "sumchecker": "^3.0.1" }, "engines": { - "node": ">=12" + "node": ">=22.12.0" }, "optionalDependencies": { - "global-agent": "^3.0.0" + "undici": "^7.24.4" + } + }, + "node_modules/@electron/get/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/@esbuild/aix-ppc64": { @@ -1671,32 +1693,6 @@ "win32" ] }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dev": true, - "license": "MIT", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@tweenjs/tween.js": { "version": "23.1.3", "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", @@ -1748,19 +1744,6 @@ "@babel/types": "^7.28.2" } }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, "node_modules/@types/debug": { "version": "4.1.13", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", @@ -1800,23 +1783,6 @@ "@types/unist": "*" } }, - "node_modules/@types/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/mdast": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", @@ -1833,12 +1799,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.19.43", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz", - "integrity": "sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==", + "version": "24.13.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.2.tgz", + "integrity": "sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==", "license": "MIT", "dependencies": { - "undici-types": "~6.21.0" + "undici-types": "~7.18.0" } }, "node_modules/@types/offscreencanvas": { @@ -1882,16 +1848,6 @@ "@types/react": "*" } }, - "node_modules/@types/responselike": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", - "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/stats.js": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.4.tgz", @@ -1924,17 +1880,6 @@ "integrity": "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==", "license": "MIT" }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@ungap/structured-clone": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.2.tgz", @@ -2038,15 +1983,6 @@ "require-from-string": "^2.0.2" } }, - "node_modules/boolean": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", - "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "license": "MIT", - "optional": true - }, "node_modules/browserslist": { "version": "4.28.4", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.4.tgz", @@ -2105,16 +2041,6 @@ "ieee754": "^1.2.1" } }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -2125,35 +2051,6 @@ "node": ">=8" } }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/camera-controls": { "version": "2.10.1", "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-2.10.1.tgz", @@ -2234,19 +2131,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/comma-separated-tokens": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", @@ -2332,83 +2216,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -2427,14 +2234,6 @@ "webgl-constants": "^1.1.1" } }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true, - "license": "MIT", - "optional": true - }, "node_modules/devlop": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", @@ -2455,22 +2254,22 @@ "license": "Apache-2.0" }, "node_modules/electron": { - "version": "33.4.11", - "resolved": "https://registry.npmjs.org/electron/-/electron-33.4.11.tgz", - "integrity": "sha512-xmdAs5QWRkInC7TpXGNvzo/7exojubk+72jn1oJL7keNeIlw7xNglf8TGtJtkR4rWC5FJq0oXiIXPS9BcK2Irg==", + "version": "43.0.0", + "resolved": "https://registry.npmjs.org/electron/-/electron-43.0.0.tgz", + "integrity": "sha512-PV60GsWU6qufhuOhw3n+Yix3WPDcqDtBqE8orbEQGQGHEkgp9o/JCPgb7L4vIL0r1HnfPdqSRtboOTqbDkcFDQ==", "dev": true, - "hasInstallScript": true, "license": "MIT", "dependencies": { - "@electron/get": "^2.0.0", - "@types/node": "^20.9.0", - "extract-zip": "^2.0.1" + "@electron-internal/extract-zip": "^1.0.1", + "@electron/get": "^5.0.0", + "@types/node": "^24.9.0" }, "bin": { - "electron": "cli.js" + "electron": "cli.js", + "install-electron": "install.js" }, "engines": { - "node": ">= 12.20.55" + "node": ">= 22.12.0" } }, "node_modules/electron-to-chromium": { @@ -2510,56 +2309,19 @@ } } }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", + "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true, - "license": "MIT", - "optional": true - }, "node_modules/esbuild": { "version": "0.25.12", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", @@ -2612,20 +2374,6 @@ "node": ">=6" } }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/estree-util-is-identifier-name": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", @@ -2642,37 +2390,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "license": "MIT" }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -2703,21 +2420,6 @@ "integrity": "sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ==", "license": "Apache-2.0" }, - "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -2743,119 +2445,12 @@ "node": ">=6.9.0" } }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/global-agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", - "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "es6-error": "^4.1.1", - "matcher": "^3.0.0", - "roarr": "^2.15.3", - "semver": "^7.3.2", - "serialize-error": "^7.0.1" - }, - "engines": { - "node": ">=10.0" - } - }, - "node_modules/global-agent/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "optional": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/glsl-noise": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/glsl-noise/-/glsl-noise-0.0.0.tgz", "integrity": "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==", "license": "MIT" }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -2869,20 +2464,6 @@ "integrity": "sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==", "license": "ISC" }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/hast-util-to-jsx-runtime": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", @@ -2939,27 +2520,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -3100,21 +2660,6 @@ "node": ">=6" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true, - "license": "ISC", - "optional": true - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -3128,26 +2673,6 @@ "node": ">=6" } }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, "node_modules/lie": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", @@ -3185,16 +2710,6 @@ "loose-envify": "cli.js" } }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -3235,20 +2750,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "escape-string-regexp": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/mdast-util-find-and-replace": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", @@ -4109,16 +3610,6 @@ ], "license": "MIT" }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -4154,19 +3645,6 @@ "node": ">=18" } }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -4176,27 +3654,6 @@ "node": ">=0.10.0" } }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, "node_modules/onnxruntime-common": { "version": "1.27.0", "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.27.0.tgz", @@ -4217,16 +3674,6 @@ "protobufjs": "^7.2.4" } }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/parse-entities": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", @@ -4261,13 +3708,6 @@ "node": ">=8" } }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true, - "license": "MIT" - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -4393,30 +3833,6 @@ "node": ">=12.0.0" } }, - "node_modules/pump": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", - "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -4612,45 +4028,6 @@ "node": ">=0.10.0" } }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/roarr": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", - "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" - }, - "engines": { - "node": ">=8.0" - } - }, "node_modules/rollup": { "version": "4.62.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", @@ -4715,31 +4092,6 @@ "semver": "bin/semver.js" } }, - "node_modules/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/serialize-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "type-fest": "^0.13.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -4781,14 +4133,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true - }, "node_modules/stats-gl": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/stats-gl/-/stats-gl-2.4.2.tgz", @@ -5012,20 +4356,6 @@ } } }, - "node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", @@ -5040,10 +4370,21 @@ "node": ">=14.17" } }, + "node_modules/undici": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz", + "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=20.18.1" + } + }, "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "license": "MIT" }, "node_modules/unified": { @@ -5133,16 +4474,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/update-browserslist-db": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", @@ -5321,13 +4652,6 @@ "node": ">= 8" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -5335,17 +4659,6 @@ "dev": true, "license": "ISC" }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, "node_modules/zustand": { "version": "5.0.14", "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.14.tgz", diff --git a/client/lucy-desktop/package.json b/client/lucy-desktop/package.json index 25fa1b4..5e9bdc8 100644 --- a/client/lucy-desktop/package.json +++ b/client/lucy-desktop/package.json @@ -27,7 +27,7 @@ "@types/react-dom": "^18.3.1", "@types/three": "^0.169.0", "@vitejs/plugin-react": "^4.3.4", - "electron": "^33.2.1", + "electron": "^43.0.0", "electron-vite": "^3.0.0", "typescript": "^5.6.3", "vite": "^6.0.3" From 852e723cc8488b1400296e0c2e09517c07b8c43e Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 2 Jul 2026 11:57:44 +0200 Subject: [PATCH 25/38] =?UTF-8?q?Report:=20Nachtrag=202=20=E2=80=94=20P2/P?= =?UTF-8?q?3-Vollausbau=20dokumentiert=20(Turn-Detection,=20F5-Finale,=20E?= =?UTF-8?q?lectron=2043,=20Mem0=20v3,=20Kandidaten,=20Lemonade)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- docs/REVIEW_2026-07-02.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docs/REVIEW_2026-07-02.md b/docs/REVIEW_2026-07-02.md index e0e56a4..eb2c414 100644 --- a/docs/REVIEW_2026-07-02.md +++ b/docs/REVIEW_2026-07-02.md @@ -249,6 +249,21 @@ Quelle: `/api/voice/metrics` (live) + eigener TTFT-Test gegen llama-swap. - **C5 war Fehlalarm** (s. Findings-Tabelle). - **L2 gefixt:** TTS-Warm-Gate mit Retry/Backoff + sichtbarer Fehlermeldung (vorher: nach 120 s stumm „ready" ohne Stimme). +## 7. Nachtrag 2: P2/P3-Vollausbau (02.07., zweite Session-Hälfte) + +| Punkt | Ergebnis | +|---|---| +| **P2-11 Turn-Detection** | ✅ Smart Turn v3.2 (8 MB ONNX) im Voice-Sidecar (`/turn`, ~110 ms warm) + Semantik-Hold im Client (bei „unfertig" bis 1,8 s auf Fortsetzung warten). **Zwei Upstream-Fallen live diagnostiziert:** Audio muss LINKS gepadded werden (sonst konstant „complete"), und der Output ist P(unfertig) — entgegen der Doku. Verifiziert: fertig=0,74→true, mitten im Wort=0,04→false | +| **P2-12 F5 Phase C/D** | ✅ **Verdikt: Pocket bleibt.** F5-ONNX auf 9070 XT/DirectML: RTF 0,59@NFE32 / 0,30@NFE16 — aber nicht streamfähig (TTFA = ganze Satzdauer), NFE16-Qualitätsrisiko, GPU-Dauerbelegung. F5 taugt als Offline-Renderer, nicht für den Dialog-Loop | +| **P2-13a Refactor** | ✅ useVoiceAgent 397→305 Z; textPipeline/visionIntent/perf als pure Module | +| **P2-13b Electron** | ✅ 33→43 (Chromium 150/Node 24), Boot-Smoke-Test grün (allow-scripts-Falle: install.js manuell) | +| **P2-14 Cockpit/SystemDrawer** | ⏸ **bewusst vertagt:** reiner Qualitäts-Refactor von live deployter UI; braucht eine eigene Session mit Browser-Verifikation (MC_API_TARGET-Workflow) statt eines Blind-Splits am Session-Ende | +| **P3-15 Mem0 v3** | ✅ verifiziert aktiv (BM25/Entity/Hybrid in 2.0.8); mc2-memory nutzt jetzt `sync_turn(messages)` — lernt Tool-NAMEN mit (Ergebnisse bewusst nicht: Poisoning-Vektor). Deployt, Postcheck grün | +| **P3-16 llama-swap** | ✅ `capabilities` (in/out/tools/context) je Modell in deploy-Config; Swap-Matrix aktuell unnötig (brains-Gruppe reicht) | +| **P3-17 Kandidaten** | 🔄 Downloads laufen (nohup, Box): Qwen3-VL-30B-A3B (~18 GB) + gpt-oss-120B (~63 GB) nach /srv/models/; 1,6 TB frei. Bench nach Abschluss (Log: /tmp/dl_candidates.log) | +| **P3-18 Lemonade** | 🔄 lemonade-sdk 9.1.4 lokal installiert, Server läuft (OpenAI-kompatibel :8555); GPU-Inferenz-Test s.u. | +| **MC3-Vollbau** | ⛔ außerhalb des Review-Scopes — eigenes Projekt (Prototyp steht unter #mc3) | + --- *Erhoben am 02.07.2026 durch Claude Code (Live-SSH auf Box, lokale PC-Prüfung, 3 Codebase-Agents, 3 Web-Recherche-Runden). Messwerte: /api/voice/metrics (n=13 STT, n=18 chat_ttfb), TTFT-Direktmessung llama-swap :8080.* From 47ade040e608e7889c80f3bf02682c9101709b05 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 2 Jul 2026 11:58:44 +0200 Subject: [PATCH 26/38] gitignore: F5-Eval-venv (lokal, mehrere GB) Co-Authored-By: Claude Fable 5 --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 4de0978..c10301f 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,4 @@ client/lucy-f5/*.onnx client/lucy-f5/*.safetensors client/lucy-f5/*.wav client/lucy-f5/*.zip +client/lucy-f5/venv/ From ed55612cfa1c21e0402962b725106dec70401d72 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 2 Jul 2026 11:59:52 +0200 Subject: [PATCH 27/38] =?UTF-8?q?Report:=20Lemonade-Verdikt=20=E2=80=94=20?= =?UTF-8?q?nicht=20als=20Unterbau;=20GPU-Klon=20besser=20mit=20llama.cpp-V?= =?UTF-8?q?ulkan=20+=20llama-swap=20(Box-Stack)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- docs/REVIEW_2026-07-02.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/REVIEW_2026-07-02.md b/docs/REVIEW_2026-07-02.md index eb2c414..b4e3166 100644 --- a/docs/REVIEW_2026-07-02.md +++ b/docs/REVIEW_2026-07-02.md @@ -261,7 +261,7 @@ Quelle: `/api/voice/metrics` (live) + eigener TTFT-Test gegen llama-swap. | **P3-15 Mem0 v3** | ✅ verifiziert aktiv (BM25/Entity/Hybrid in 2.0.8); mc2-memory nutzt jetzt `sync_turn(messages)` — lernt Tool-NAMEN mit (Ergebnisse bewusst nicht: Poisoning-Vektor). Deployt, Postcheck grün | | **P3-16 llama-swap** | ✅ `capabilities` (in/out/tools/context) je Modell in deploy-Config; Swap-Matrix aktuell unnötig (brains-Gruppe reicht) | | **P3-17 Kandidaten** | 🔄 Downloads laufen (nohup, Box): Qwen3-VL-30B-A3B (~18 GB) + gpt-oss-120B (~63 GB) nach /srv/models/; 1,6 TB frei. Bench nach Abschluss (Log: /tmp/dl_candidates.log) | -| **P3-18 Lemonade** | 🔄 lemonade-sdk 9.1.4 lokal installiert, Server läuft (OpenAI-kompatibel :8555); GPU-Inferenz-Test s.u. | +| **P3-18 Lemonade** | ✅ **Verdikt: nicht als Unterbau.** lemonade-sdk 9.1.4 (Python) installiert + Server lief (OpenAI-API, gute Registry inkl. gpt-oss/GLM) — aber: Python-Edition **offiziell deprecated** (C++-Installer ist der Weg), Server blockiert komplett während Model-Downloads (Health tot >10 min bei 400-MB-Modell), Ryzen-AI-Hybrid auf 9700X unsupported. **Empfehlung für den lokalen GPU-Klon: llama.cpp-Vulkan + llama-swap — derselbe Stack wie die Box** (ein Betriebsmodell, ein Know-how, bewährte Configs). Lemonade-C++ nur, falls Whisper+TTS+LLM aus einer Hand gewünscht | | **MC3-Vollbau** | ⛔ außerhalb des Review-Scopes — eigenes Projekt (Prototyp steht unter #mc3) | --- From f88c2a95c151f99593ba42b8624c0d6e5b182548 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 2 Jul 2026 12:01:15 +0200 Subject: [PATCH 28/38] Report: VL-30B-Bench (90-92 t/s, Vision-Upgrade-Kandidat) + gpt-oss-Handoff dokumentiert Co-Authored-By: Claude Fable 5 --- docs/REVIEW_2026-07-02.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/REVIEW_2026-07-02.md b/docs/REVIEW_2026-07-02.md index b4e3166..c253e86 100644 --- a/docs/REVIEW_2026-07-02.md +++ b/docs/REVIEW_2026-07-02.md @@ -260,7 +260,7 @@ Quelle: `/api/voice/metrics` (live) + eigener TTFT-Test gegen llama-swap. | **P2-14 Cockpit/SystemDrawer** | ⏸ **bewusst vertagt:** reiner Qualitäts-Refactor von live deployter UI; braucht eine eigene Session mit Browser-Verifikation (MC_API_TARGET-Workflow) statt eines Blind-Splits am Session-Ende | | **P3-15 Mem0 v3** | ✅ verifiziert aktiv (BM25/Entity/Hybrid in 2.0.8); mc2-memory nutzt jetzt `sync_turn(messages)` — lernt Tool-NAMEN mit (Ergebnisse bewusst nicht: Poisoning-Vektor). Deployt, Postcheck grün | | **P3-16 llama-swap** | ✅ `capabilities` (in/out/tools/context) je Modell in deploy-Config; Swap-Matrix aktuell unnötig (brains-Gruppe reicht) | -| **P3-17 Kandidaten** | 🔄 Downloads laufen (nohup, Box): Qwen3-VL-30B-A3B (~18 GB) + gpt-oss-120B (~63 GB) nach /srv/models/; 1,6 TB frei. Bench nach Abschluss (Log: /tmp/dl_candidates.log) | +| **P3-17 Kandidaten** | 🟢/🔄 **Qwen3-VL-30B-A3B heruntergeladen + gebencht: tg 90–92 t/s** (MoE 3B aktiv, 19 GB, Vulkan) — klarer Upgrade-Kandidat für die Bildschirm-Sicht (`MC_VISION_MODEL`), Qualitäts-Check mit echten Screenshots + brains-Budget-Entscheid (19 vs. 6 GB warm) beim User. gpt-oss-120B lädt noch (nohup); danach: `bash /tmp/candidate_bench.sh` auf der Box vergleicht ihn gegen heavy (Skript liegt bereit) | | **P3-18 Lemonade** | ✅ **Verdikt: nicht als Unterbau.** lemonade-sdk 9.1.4 (Python) installiert + Server lief (OpenAI-API, gute Registry inkl. gpt-oss/GLM) — aber: Python-Edition **offiziell deprecated** (C++-Installer ist der Weg), Server blockiert komplett während Model-Downloads (Health tot >10 min bei 400-MB-Modell), Ryzen-AI-Hybrid auf 9700X unsupported. **Empfehlung für den lokalen GPU-Klon: llama.cpp-Vulkan + llama-swap — derselbe Stack wie die Box** (ein Betriebsmodell, ein Know-how, bewährte Configs). Lemonade-C++ nur, falls Whisper+TTS+LLM aus einer Hand gewünscht | | **MC3-Vollbau** | ⛔ außerhalb des Review-Scopes — eigenes Projekt (Prototyp steht unter #mc3) | From a16287e19cc11a2a46ffe493bfe74c3face3a2b5 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 2 Jul 2026 12:08:57 +0200 Subject: [PATCH 29/38] =?UTF-8?q?Report:=20Live-Deploy=20verifiziert=20?= =?UTF-8?q?=E2=80=94=20parallel-2=20wirkt=20(echte=20Parallelitaet),=20neu?= =?UTF-8?q?e=20Session=200,85s/first=5Fcontent=20803ms=20(vorher=205,6-12s?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- docs/REVIEW_2026-07-02.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/REVIEW_2026-07-02.md b/docs/REVIEW_2026-07-02.md index c253e86..ef9e626 100644 --- a/docs/REVIEW_2026-07-02.md +++ b/docs/REVIEW_2026-07-02.md @@ -251,6 +251,8 @@ Quelle: `/api/voice/metrics` (live) + eigener TTFT-Test gegen llama-swap. ## 7. Nachtrag 2: P2/P3-Vollausbau (02.07., zweite Session-Hälfte) +**Brain-Config LIVE DEPLOYT + verifiziert (02.07., User-Freigabe):** hermes läuft mit `-c 131072 --parallel 2 -ctk/-ctv q8_0` + MTP. Gemessen: **2 gleichzeitige Requests laufen echt parallel** (~1,9 s/2,0 s statt seriell — Mem0-Extraktion blockiert Voice-Turns nicht mehr), tg 66 t/s (leichter parallel-2-Abschlag vs. 78 solo, bewusster Trade), RAM 40/122 GB. **Voice-E2E: neue Session 0,85 s total, first_content 803 ms** (Morgen-Baseline: 5,6–12 s bei neuen Sessions). capabilities werden via /v1/models ausgeliefert. + | Punkt | Ergebnis | |---|---| | **P2-11 Turn-Detection** | ✅ Smart Turn v3.2 (8 MB ONNX) im Voice-Sidecar (`/turn`, ~110 ms warm) + Semantik-Hold im Client (bei „unfertig" bis 1,8 s auf Fortsetzung warten). **Zwei Upstream-Fallen live diagnostiziert:** Audio muss LINKS gepadded werden (sonst konstant „complete"), und der Output ist P(unfertig) — entgegen der Doku. Verifiziert: fertig=0,74→true, mitten im Wort=0,04→false | From e84386b03e1fe6f9fd8a5de07bdb38c059fc36c6 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 2 Jul 2026 14:42:52 +0200 Subject: [PATCH 30/38] =?UTF-8?q?Frontend:=20SystemDrawer=20entflochten=20?= =?UTF-8?q?(Review=20P2-14,=20Teil=201)=20=E2=80=94=20934=20->=20665=20Zei?= =?UTF-8?q?len?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - components/system/rows.tsx: SERVICES + UpdateRow + ServiceRow + formatBytes - components/system/SettingsTab.tsx: Einstellungen-Tab inkl. eigenem State (localStorage) - components/system/UpdateDetailModal.tsx: Update-Detail-Fenster (os/engine/swap/hermes) - Preview-verifiziert gegen die Live-Box: alle 3 Tabs rendern, Speichern-Flow (Dialog + localStorage) und Logs-Tab (Service-Select) funktionieren Co-Authored-By: Claude Fable 5 --- frontend/src/components/SystemDrawer.tsx | 290 +----------------- .../src/components/system/SettingsTab.tsx | 123 ++++++++ .../components/system/UpdateDetailModal.tsx | 127 ++++++++ frontend/src/components/system/rows.tsx | 57 ++++ 4 files changed, 317 insertions(+), 280 deletions(-) create mode 100644 frontend/src/components/system/SettingsTab.tsx create mode 100644 frontend/src/components/system/UpdateDetailModal.tsx create mode 100644 frontend/src/components/system/rows.tsx diff --git a/frontend/src/components/SystemDrawer.tsx b/frontend/src/components/SystemDrawer.tsx index ddfa91c..0a32aab 100644 --- a/frontend/src/components/SystemDrawer.tsx +++ b/frontend/src/components/SystemDrawer.tsx @@ -1,8 +1,11 @@ import { useEffect, useState, useRef } from "react" -import { X, RefreshCw, Terminal, Cpu, Server, Shield, Power, Eye, EyeOff, Key, AlertTriangle, Camera, Bot, Box, FileText, Package, GitCommit, ExternalLink, ArrowRight, Shuffle } from "lucide-react" +import { X, RefreshCw, Terminal, Cpu, Server, Shield, Power, AlertTriangle, Camera, Bot, Box, Shuffle } from "lucide-react" import { api, type Job, type UpdatesResp, type ServicesResp, type UpdateDetails } from "@/lib/api" import { cn } from "@/lib/utils" import { CustomDialog } from "./CustomDialog" +import { SERVICES, ServiceRow, UpdateRow, formatBytes } from "./system/rows" +import { SettingsTab } from "./system/SettingsTab" +import { UpdateDetailModal, type UpdateDetailState } from "./system/UpdateDetailModal" interface SystemDrawerProps { @@ -11,58 +14,6 @@ interface SystemDrawerProps { defaultTab?: "maintenance" | "logs" | "settings" } -// systemd-Units (restart/logs) + reach = Stichwort zum Mappen auf /api/system/services. -const SERVICES = [ - { id: "mission-control-2", label: "Mission Control", type: "user", reach: "gateway (integr" }, - { id: "hermes-gateway", label: "Hermes Gateway", type: "user", reach: "hermes-gateway" }, - { id: "mem0-service", label: "Mem0 (Gedächtnis)", type: "user", reach: "mem0" }, - { id: "hermes-terminal", label: "Hermes Terminal", type: "user", reach: "hermes-terminal" }, - { id: "llama-swap", label: "Llama Swap", type: "system", reach: "llama-swap" }, -] - -function UpdateRow({ icon: Icon, iconClass, name, status, available, busy, actionLabel, onAction }: { - icon: any; iconClass: string; name: string; status: string; available: boolean; busy?: boolean; actionLabel: string; onAction: () => void -}) { - return ( -
- -
-
{name}
-
{status}
-
- -
- ) -} - -function ServiceRow({ label, ok, system, busy, onRestart, onLogs }: { - label: string; ok?: boolean; system?: boolean; busy?: boolean; onRestart: () => void; onLogs: () => void -}) { - return ( -
- - {label}{system && (root)} - - -
- ) -} - -function formatBytes(bytes?: number) { - if (bytes == null) return "" - if (bytes > 1024 ** 3) return `${(bytes / 1024 ** 3).toFixed(2)} GB` - return `${(bytes / 1024 ** 2).toFixed(1)} MB` -} export function SystemDrawer({ open, onClose, defaultTab = "maintenance" }: SystemDrawerProps) { const [updates, setUpdates] = useState(null) @@ -81,7 +32,7 @@ export function SystemDrawer({ open, onClose, defaultTab = "maintenance" }: Syst const [hermesUpdating, setHermesUpdating] = useState(false) // Update-Detail-Fenster: zeigt VOR dem Anwenden, was genau aktualisiert wird. - const [detail, setDetail] = useState<{ kind: "os" | "engine" | "swap" | "hermes"; loading: boolean; data: UpdateDetails | null } | null>(null) + const [detail, setDetail] = useState(null) // Custom Dialog State const [dialog, setDialog] = useState<{ @@ -128,18 +79,6 @@ export function SystemDrawer({ open, onClose, defaultTab = "maintenance" }: Syst }) } - // Credentials State - const [sudoPasswordInput, setSudoPasswordInput] = useState("") - const [hfTokenInput, setHfTokenInput] = useState("") - const [showSudo, setShowSudo] = useState(false) - const [showHf, setShowHf] = useState(false) - - useEffect(() => { - if (open) { - setSudoPasswordInput(localStorage.getItem("mc_sudo_password") || "") - setHfTokenInput(localStorage.getItem("mc_hf_token") || "") - } - }, [open]) useEffect(() => { if (open && defaultTab) { @@ -702,223 +641,14 @@ export function SystemDrawer({ open, onClose, defaultTab = "maintenance" }: Syst
)} - {activeTab === "settings" && ( -
-
-

Zugangsdaten & Schlüssel

-

- Diese Daten werden ausschließlich lokal in deinem Browser (localStorage) gespeichert und bei Bedarf an das Backend übertragen. -

-
- - {/* Sudo Passwort */} -
- -
- setSudoPasswordInput(e.target.value)} - aria-label="Host Sudo-Passwort" - name="sudo-password" - autoComplete="off" - spellCheck={false} - placeholder="Sudo-Passwort für System-Operationen" - className="w-full h-10 pl-3 pr-10 text-xs bg-background/40 border border-border/60 rounded-lg outline-none focus:border-primary transition-colors text-foreground" - /> - -
-

- Wird benötigt für systemd-Dienste (Llama Swap logs/restart), OS-Update (apt) und Reboot. -

-
- - {/* HuggingFace Token */} -
- -
- setHfTokenInput(e.target.value)} - aria-label="HuggingFace API Token" - name="hf-token" - autoComplete="off" - spellCheck={false} - placeholder="hf_…" - className="w-full h-10 pl-3 pr-10 text-xs bg-background/40 border border-border/60 rounded-lg outline-none focus:border-primary transition-colors text-foreground" - /> - -
-

- Erlaubt das Herunterladen von geschützten oder Gate-restricted Modellen direkt über Mission Control. -

-
- - {/* Buttons */} -
- - -
-
- )} + {activeTab === "settings" && }
- {detail && (() => { - const d = detail.data - const meta = { - os: { icon: Shield, cls: "text-cyan-400", title: "OS-Pakete (apt)" }, - engine: { icon: Server, cls: "text-violet-400", title: "Inferenz-Engine (llama.cpp)" }, - swap: { icon: Shuffle, cls: "text-fuchsia-400", title: "Router (llama-swap)" }, - hermes: { icon: Bot, cls: "text-amber-400", title: "Hermes-Agent" }, - }[detail.kind] - const Icon = meta.icon - const nothing = !d ? true - : detail.kind === "os" ? (d.count ?? 0) === 0 - : detail.kind === "hermes" ? (d.behind ?? 0) === 0 - : (d.installed_build != null && d.latest_build != null && d.latest_build <= d.installed_build) - return ( -
-
setDetail(null)} /> -
- {/* Header */} -
-
- -

{meta.title}

-
- -
- - {/* Body */} -
- {detail.loading ? ( -
- Details werden geladen… -
- ) : d?.error ? ( -
{d.error}
- ) : detail.kind === "os" ? ( - (d?.count ?? 0) === 0 ? ( -
Keine Pakete zu aktualisieren — System ist aktuell.
- ) : ( - <> -
{d!.count} Paket(e) werden aktualisiert:
-
- {d!.packages!.map((p) => ( -
- - {p.name} - - - {p.current}{p.candidate} - -
- ))} -
- - ) - ) : detail.kind === "engine" || detail.kind === "swap" ? ( - <> -
- Build {d?.installed_build ?? "?"} - - Build {d?.latest_build ?? "?"} -
- {(d?.name || d?.latest_tag) && ( -
Release: {d?.name}{d?.latest_tag ? ` (${d.latest_tag})` : ""}
- )} - {d?.url && ( - - Release-Notes auf GitHub - - )} - {d?.body && ( -
{d.body}
- )} - - ) : ( - // hermes - (d?.commits?.length ?? 0) === 0 ? ( -
Keine neuen Commits — Hermes-Agent ist bereits aktuell.
- ) : ( - <> -
{d!.behind} neue Commit(s) auf origin/{d!.branch}:
-
- {d!.commits!.map((c) => ( -
- -
-
{c.subject}
-
{c.hash} · {c.when}
-
-
- ))} -
-

Vor dem Update wird automatisch ein Backup erstellt; danach startet der Hermes-Gateway neu.

- - ) - )} -
- - {/* Footer */} -
- - -
-
-
- ) - })()} + {detail && ( + setDetail(null)} onApply={applyFromDetail} /> + )} {dialog && ( void +}) { + const [sudoPasswordInput, setSudoPasswordInput] = useState("") + const [hfTokenInput, setHfTokenInput] = useState("") + const [showSudo, setShowSudo] = useState(false) + const [showHf, setShowHf] = useState(false) + + useEffect(() => { + if (open) { + setSudoPasswordInput(localStorage.getItem("mc_sudo_password") || "") + setHfTokenInput(localStorage.getItem("mc_hf_token") || "") + } + }, [open]) + + return ( +
+
+

Zugangsdaten & Schlüssel

+

+ Diese Daten werden ausschließlich lokal in deinem Browser (localStorage) gespeichert und bei Bedarf an das Backend übertragen. +

+
+ + {/* Sudo Passwort */} +
+ +
+ setSudoPasswordInput(e.target.value)} + aria-label="Host Sudo-Passwort" + name="sudo-password" + autoComplete="off" + spellCheck={false} + placeholder="Sudo-Passwort für System-Operationen" + className="w-full h-10 pl-3 pr-10 text-xs bg-background/40 border border-border/60 rounded-lg outline-none focus:border-primary transition-colors text-foreground" + /> + +
+

+ Wird benötigt für systemd-Dienste (Llama Swap logs/restart), OS-Update (apt) und Reboot. +

+
+ + {/* HuggingFace Token */} +
+ +
+ setHfTokenInput(e.target.value)} + aria-label="HuggingFace API Token" + name="hf-token" + autoComplete="off" + spellCheck={false} + placeholder="hf_…" + className="w-full h-10 pl-3 pr-10 text-xs bg-background/40 border border-border/60 rounded-lg outline-none focus:border-primary transition-colors text-foreground" + /> + +
+

+ Erlaubt das Herunterladen von geschützten oder Gate-restricted Modellen direkt über Mission Control. +

+
+ + {/* Buttons */} +
+ + +
+
+ ) +} diff --git a/frontend/src/components/system/UpdateDetailModal.tsx b/frontend/src/components/system/UpdateDetailModal.tsx new file mode 100644 index 0000000..b0c3d2c --- /dev/null +++ b/frontend/src/components/system/UpdateDetailModal.tsx @@ -0,0 +1,127 @@ +import { ArrowRight, Bot, ExternalLink, GitCommit, Package, RefreshCw, Server, Shield, Shuffle, X } from "lucide-react" +import { cn } from "@/lib/utils" +import type { Job, UpdateDetails } from "@/lib/api" + +export type UpdateDetailState = { kind: "os" | "engine" | "swap" | "hermes"; loading: boolean; data: UpdateDetails | null } + +// Update-Detail-Fenster des SystemDrawers (Review P2-14: extrahiert): zeigt VOR dem +// Anwenden, was genau aktualisiert wird (apt-Pakete, Engine-Builds, Hermes-Commits). +export function UpdateDetailModal({ detail, maintenanceJob, onClose, onApply }: { + detail: UpdateDetailState + maintenanceJob?: Job + onClose: () => void + onApply: () => void +}) { + const d = detail.data + const meta = { + os: { icon: Shield, cls: "text-cyan-400", title: "OS-Pakete (apt)" }, + engine: { icon: Server, cls: "text-violet-400", title: "Inferenz-Engine (llama.cpp)" }, + swap: { icon: Shuffle, cls: "text-fuchsia-400", title: "Router (llama-swap)" }, + hermes: { icon: Bot, cls: "text-amber-400", title: "Hermes-Agent" }, + }[detail.kind] + const Icon = meta.icon + const nothing = !d ? true + : detail.kind === "os" ? (d.count ?? 0) === 0 + : detail.kind === "hermes" ? (d.behind ?? 0) === 0 + : (d.installed_build != null && d.latest_build != null && d.latest_build <= d.installed_build) + return ( +
+
+
+ {/* Header */} +
+
+ +

{meta.title}

+
+ +
+ + {/* Body */} +
+ {detail.loading ? ( +
+ Details werden geladen… +
+ ) : d?.error ? ( +
{d.error}
+ ) : detail.kind === "os" ? ( + (d?.count ?? 0) === 0 ? ( +
Keine Pakete zu aktualisieren — System ist aktuell.
+ ) : ( + <> +
{d!.count} Paket(e) werden aktualisiert:
+
+ {d!.packages!.map((p) => ( +
+ + {p.name} + + + {p.current}{p.candidate} + +
+ ))} +
+ + ) + ) : detail.kind === "engine" || detail.kind === "swap" ? ( + <> +
+ Build {d?.installed_build ?? "?"} + + Build {d?.latest_build ?? "?"} +
+ {(d?.name || d?.latest_tag) && ( +
Release: {d?.name}{d?.latest_tag ? ` (${d.latest_tag})` : ""}
+ )} + {d?.url && ( +
+ Release-Notes auf GitHub + + )} + {d?.body && ( +
{d.body}
+ )} + + ) : ( + // hermes + (d?.commits?.length ?? 0) === 0 ? ( +
Keine neuen Commits — Hermes-Agent ist bereits aktuell.
+ ) : ( + <> +
{d!.behind} neue Commit(s) auf origin/{d!.branch}:
+
+ {d!.commits!.map((c) => ( +
+ +
+
{c.subject}
+
{c.hash} · {c.when}
+
+
+ ))} +
+

Vor dem Update wird automatisch ein Backup erstellt; danach startet der Hermes-Gateway neu.

+ + ) + )} +
+ + {/* Footer */} +
+ + +
+
+
+ ) +} diff --git a/frontend/src/components/system/rows.tsx b/frontend/src/components/system/rows.tsx new file mode 100644 index 0000000..6500d62 --- /dev/null +++ b/frontend/src/components/system/rows.tsx @@ -0,0 +1,57 @@ +import { RefreshCw, FileText } from "lucide-react" +import { cn } from "@/lib/utils" + +// Präsentations-Atome des SystemDrawers (Review P2-14: aus dem 934-Z-Monolithen extrahiert). + +// systemd-Units (restart/logs) + reach = Stichwort zum Mappen auf /api/system/services. +export const SERVICES = [ + { id: "mission-control-2", label: "Mission Control", type: "user", reach: "gateway (integr" }, + { id: "hermes-gateway", label: "Hermes Gateway", type: "user", reach: "hermes-gateway" }, + { id: "mem0-service", label: "Mem0 (Gedächtnis)", type: "user", reach: "mem0" }, + { id: "hermes-terminal", label: "Hermes Terminal", type: "user", reach: "hermes-terminal" }, + { id: "llama-swap", label: "Llama Swap", type: "system", reach: "llama-swap" }, +] + +export function UpdateRow({ icon: Icon, iconClass, name, status, available, busy, actionLabel, onAction }: { + icon: any; iconClass: string; name: string; status: string; available: boolean; busy?: boolean; actionLabel: string; onAction: () => void +}) { + return ( +
+ +
+
{name}
+
{status}
+
+ +
+ ) +} + +export function ServiceRow({ label, ok, system, busy, onRestart, onLogs }: { + label: string; ok?: boolean; system?: boolean; busy?: boolean; onRestart: () => void; onLogs: () => void +}) { + return ( +
+ + {label}{system && (root)} + + +
+ ) +} + +export function formatBytes(bytes?: number) { + if (bytes == null) return "" + if (bytes > 1024 ** 3) return `${(bytes / 1024 ** 3).toFixed(2)} GB` + return `${(bytes / 1024 ** 2).toFixed(1)} MB` +} From 588d0323352b1404fafa8a34c67e35c09cf66e35 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 2 Jul 2026 14:47:10 +0200 Subject: [PATCH 31/38] =?UTF-8?q?Frontend:=20Cockpit=20entflochten=20(Revi?= =?UTF-8?q?ew=20P2-14,=20Teil=202)=20=E2=80=94=20990=20->=20909=20Zeilen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - views/models/cockpit/RoleAssignModal.tsx: Rollen-Zuweisung inkl. Empfehlungs-Sortierung und Schutzgelaender als eigenstaendige Komponente - Preview-verifiziert gegen die Live-Box: Modal oeffnet per Slot-Karte ('Lucys Hirn festlegen'), Schutzgelaender greift, 9 Modell-Optionen, schliesst sauber - Zone C (Library, ~440 Z) bleibt fuer eine Folge-Session (tief mit Aktions-State verwoben) Co-Authored-By: Claude Fable 5 --- frontend/src/views/models/Cockpit.tsx | 96 ++-------------- .../views/models/cockpit/RoleAssignModal.tsx | 104 ++++++++++++++++++ 2 files changed, 111 insertions(+), 89 deletions(-) create mode 100644 frontend/src/views/models/cockpit/RoleAssignModal.tsx diff --git a/frontend/src/views/models/Cockpit.tsx b/frontend/src/views/models/Cockpit.tsx index 1acda08..0553577 100644 --- a/frontend/src/views/models/Cockpit.tsx +++ b/frontend/src/views/models/Cockpit.tsx @@ -1,5 +1,5 @@ import { useState } from "react" -import { Download, Trash2, Edit3, Activity, HardDrive, X, Check, Zap, Bot } from "lucide-react" +import { Download, Trash2, Edit3, Activity, HardDrive, Check, Zap, Bot } from "lucide-react" import { api, setGroup, type ModelInfo, type RoleRecResp } from "@/lib/api" import { useModels, useGroups, useUpdates, useHermesBrain, useSystemStatus, useQueryClient, qk } from "@/lib/queries" import { useDialog } from "@/lib/useDialog" @@ -8,6 +8,7 @@ import { cn } from "@/lib/utils" import { fmtSize, fmtCtx } from "@/lib/format" import { getBrandInfo, ROLES, RoleLabel, roleMeta } from "@/components/models/ModelBadges" import { SpecDraftModal } from "@/components/models/SpecDraftModal" +import { RoleAssignModal } from "./cockpit/RoleAssignModal" import { LaneEditor } from "@/components/models/LaneEditor" import { WarmSetManager } from "@/components/models/WarmSetManager" import { useExpertMode } from "@/lib/useExpertMode" @@ -887,94 +888,11 @@ export function Cockpit() {
{/* Role Assignment Modal */} - {activeRoleForAssign && (() => { - const rec = roleRec && roleRec.role === activeRoleForAssign ? roleRec : null - const recByName: Record = {} - rec?.models.forEach((r) => { recByName[r.name] = r }) - // Empfohlene Reihenfolge (nach Score) wenn vorhanden, sonst Bibliotheks-Reihenfolge. - const ordered = rec - ? rec.models.map((r) => models.find((m) => m.name === r.name)).filter(Boolean) as ModelInfo[] - : models - const assign = (name: string) => { handleRoleChange(activeRoleForAssign, name); setActiveRoleForAssign(null) } - return ( -
-
-
-

- festlegen -

- -
-
-

- Wähle ein Modell für {roleMeta(activeRoleForAssign).label} - {roleMeta(activeRoleForAssign).desc} -

- {rec?.recommended && ( - - )} -
- -
- {/* Schutzgeländer: eine lebenswichtige Rolle (Hirn/Gedächtnis) lässt sich nicht leeren. */} - {isProtected(activeRoleForAssign) ? ( -
- 🔒 Diese Rolle ist lebenswichtig und kann nicht leer bleiben — wähle stattdessen ein anderes Modell. -
- ) : ( - - )} - {ordered.map((m) => { - const r = recByName[m.name] - const isCur = m.role === activeRoleForAssign - const isRec = !!r?.recommended - const unfit = !!r && !r.suitable - return ( - - ) - })} -
-
-
- ) - })()} + {activeRoleForAssign && ( + { handleRoleChange(activeRoleForAssign, name); setActiveRoleForAssign(null) }} + onClose={() => setActiveRoleForAssign(null)} /> + )} {specModel && ( !!roleMeta(role).protected +export function RoleAssignModal({ role, roleRec, models, onAssign, onClose }: { + role: string + roleRec: RoleRecResp | null + models: ModelInfo[] + onAssign: (modelName: string) => void + onClose: () => void +}) { + const rec = roleRec && roleRec.role === role ? roleRec : null + const recByName: Record = {} + rec?.models.forEach((r) => { recByName[r.name] = r }) + // Empfohlene Reihenfolge (nach Score) wenn vorhanden, sonst Bibliotheks-Reihenfolge. + const ordered = rec + ? rec.models.map((r) => models.find((m) => m.name === r.name)).filter(Boolean) as ModelInfo[] + : models + return ( +
+
+
+

+ festlegen +

+ +
+
+

+ Wähle ein Modell für {roleMeta(role).label} + {roleMeta(role).desc} +

+ {rec?.recommended && ( + + )} +
+ +
+ {/* Schutzgeländer: eine lebenswichtige Rolle (Hirn/Gedächtnis) lässt sich nicht leeren. */} + {isProtected(role) ? ( +
+ 🔒 Diese Rolle ist lebenswichtig und kann nicht leer bleiben — wähle stattdessen ein anderes Modell. +
+ ) : ( + + )} + {ordered.map((m) => { + const r = recByName[m.name] + const isCur = m.role === role + const isRec = !!r?.recommended + const unfit = !!r && !r.suitable + return ( + + ) + })} +
+
+
+ ) +} From 7704ffddab99426df6e6fe65d64d6d3028f9535e Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 2 Jul 2026 14:47:15 +0200 Subject: [PATCH 32/38] dist: Rebuild nach P2-14-Splits Co-Authored-By: Claude Fable 5 --- ...View-E0VQUPTe.js => GraphView-BqZ4z-El.js} | 2 +- frontend/dist/assets/index-B-6TT-6s.js | 663 ++++++++++++++++++ frontend/dist/assets/index-CrYzXlx6.js | 663 ------------------ frontend/dist/index.html | 2 +- 4 files changed, 665 insertions(+), 665 deletions(-) rename frontend/dist/assets/{GraphView-E0VQUPTe.js => GraphView-BqZ4z-El.js} (99%) create mode 100644 frontend/dist/assets/index-B-6TT-6s.js delete mode 100644 frontend/dist/assets/index-CrYzXlx6.js diff --git a/frontend/dist/assets/GraphView-E0VQUPTe.js b/frontend/dist/assets/GraphView-BqZ4z-El.js similarity index 99% rename from frontend/dist/assets/GraphView-E0VQUPTe.js rename to frontend/dist/assets/GraphView-BqZ4z-El.js index 198c864..052ade9 100644 --- a/frontend/dist/assets/GraphView-E0VQUPTe.js +++ b/frontend/dist/assets/GraphView-BqZ4z-El.js @@ -1,4 +1,4 @@ -import{g as bi,r as ce,j as H,R as rr,S as nr,a as Ut,T as ar}from"./index-CrYzXlx6.js";var et={exports:{}},zt;function or(){if(zt)return et.exports;zt=1;var n=typeof Reflect=="object"?Reflect:null,i=n&&typeof n.apply=="function"?n.apply:function(b,R,A){return Function.prototype.apply.call(b,R,A)},t;n&&typeof n.ownKeys=="function"?t=n.ownKeys:Object.getOwnPropertySymbols?t=function(b){return Object.getOwnPropertyNames(b).concat(Object.getOwnPropertySymbols(b))}:t=function(b){return Object.getOwnPropertyNames(b)};function e(p){console&&console.warn&&console.warn(p)}var r=Number.isNaN||function(b){return b!==b};function a(){a.init.call(this)}et.exports=a,et.exports.once=D,a.EventEmitter=a,a.prototype._events=void 0,a.prototype._eventsCount=0,a.prototype._maxListeners=void 0;var o=10;function s(p){if(typeof p!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof p)}Object.defineProperty(a,"defaultMaxListeners",{enumerable:!0,get:function(){return o},set:function(p){if(typeof p!="number"||p<0||r(p))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+p+".");o=p}}),a.init=function(){(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)&&(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},a.prototype.setMaxListeners=function(b){if(typeof b!="number"||b<0||r(b))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+b+".");return this._maxListeners=b,this};function u(p){return p._maxListeners===void 0?a.defaultMaxListeners:p._maxListeners}a.prototype.getMaxListeners=function(){return u(this)},a.prototype.emit=function(b){for(var R=[],A=1;A0&&(P=R[0]),P instanceof Error)throw P;var V=new Error("Unhandled error."+(P?" ("+P.message+")":""));throw V.context=P,V}var z=F[b];if(z===void 0)return!1;if(typeof z=="function")i(z,this,R);else for(var g=z.length,K=y(z,g),A=0;A0&&P.length>G&&!P.warned){P.warned=!0;var V=new Error("Possible EventEmitter memory leak detected. "+P.length+" "+String(b)+" listeners added. Use emitter.setMaxListeners() to increase limit");V.name="MaxListenersExceededWarning",V.emitter=p,V.type=b,V.count=P.length,e(V)}return p}a.prototype.addListener=function(b,R){return h(this,b,R,!1)},a.prototype.on=a.prototype.addListener,a.prototype.prependListener=function(b,R){return h(this,b,R,!0)};function d(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function l(p,b,R){var A={fired:!1,wrapFn:void 0,target:p,type:b,listener:R},G=d.bind(A);return G.listener=R,A.wrapFn=G,G}a.prototype.once=function(b,R){return s(R),this.on(b,l(this,b,R)),this},a.prototype.prependOnceListener=function(b,R){return s(R),this.prependListener(b,l(this,b,R)),this},a.prototype.removeListener=function(b,R){var A,G,F,P,V;if(s(R),G=this._events,G===void 0)return this;if(A=G[b],A===void 0)return this;if(A===R||A.listener===R)--this._eventsCount===0?this._events=Object.create(null):(delete G[b],G.removeListener&&this.emit("removeListener",b,A.listener||R));else if(typeof A!="function"){for(F=-1,P=A.length-1;P>=0;P--)if(A[P]===R||A[P].listener===R){V=A[P].listener,F=P;break}if(F<0)return this;F===0?A.shift():w(A,F),A.length===1&&(G[b]=A[0]),G.removeListener!==void 0&&this.emit("removeListener",b,V||R)}return this},a.prototype.off=a.prototype.removeListener,a.prototype.removeAllListeners=function(b){var R,A,G;if(A=this._events,A===void 0)return this;if(A.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):A[b]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete A[b]),this;if(arguments.length===0){var F=Object.keys(A),P;for(G=0;G=0;G--)this.removeListener(b,R[G]);return this};function f(p,b,R){var A=p._events;if(A===void 0)return[];var G=A[b];return G===void 0?[]:typeof G=="function"?R?[G.listener||G]:[G]:R?T(G):y(G,G.length)}a.prototype.listeners=function(b){return f(this,b,!0)},a.prototype.rawListeners=function(b){return f(this,b,!1)},a.listenerCount=function(p,b){return typeof p.listenerCount=="function"?p.listenerCount(b):c.call(p,b)},a.prototype.listenerCount=c;function c(p){var b=this._events;if(b!==void 0){var R=b[p];if(typeof R=="function")return 1;if(R!==void 0)return R.length}return 0}a.prototype.eventNames=function(){return this._eventsCount>0?t(this._events):[]};function y(p,b){for(var R=new Array(b),A=0;An++}function me(){const n=arguments;let i=null,t=-1;return{[Symbol.iterator](){return this},next(){let e=null;do{if(i===null){if(t++,t>=n.length)return{done:!0};i=n[t][Symbol.iterator]()}if(e=i.next(),e.done){i=null;continue}break}while(!0);return e}}}function Le(){return{[Symbol.iterator](){return this},next(){return{done:!0}}}}class Lt extends Error{constructor(i){super(),this.name="GraphError",this.message=i}}class k extends Lt{constructor(i){super(i),this.name="InvalidArgumentsGraphError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,k.prototype.constructor)}}class C extends Lt{constructor(i){super(i),this.name="NotFoundGraphError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,C.prototype.constructor)}}class I extends Lt{constructor(i){super(i),this.name="UsageGraphError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,I.prototype.constructor)}}function _i(n,i){this.key=n,this.attributes=i,this.clear()}_i.prototype.clear=function(){this.inDegree=0,this.outDegree=0,this.undirectedDegree=0,this.undirectedLoops=0,this.directedLoops=0,this.in={},this.out={},this.undirected={}};function Ti(n,i){this.key=n,this.attributes=i,this.clear()}Ti.prototype.clear=function(){this.inDegree=0,this.outDegree=0,this.directedLoops=0,this.in={},this.out={}};function Si(n,i){this.key=n,this.attributes=i,this.clear()}Si.prototype.clear=function(){this.undirectedDegree=0,this.undirectedLoops=0,this.undirected={}};function Ge(n,i,t,e,r){this.key=i,this.attributes=r,this.undirected=n,this.source=t,this.target=e}Ge.prototype.attach=function(){let n="out",i="in";this.undirected&&(n=i="undirected");const t=this.source.key,e=this.target.key;this.source[n][e]=this,!(this.undirected&&t===e)&&(this.target[i][t]=this)};Ge.prototype.attachMulti=function(){let n="out",i="in";const t=this.source.key,e=this.target.key;this.undirected&&(n=i="undirected");const r=this.source[n],a=r[e];if(typeof a>"u"){r[e]=this,this.undirected&&t===e||(this.target[i][t]=this);return}a.previous=this,this.next=a,r[e]=this,this.target[i][t]=this};Ge.prototype.detach=function(){const n=this.source.key,i=this.target.key;let t="out",e="in";this.undirected&&(t=e="undirected"),delete this.source[t][i],delete this.target[e][n]};Ge.prototype.detachMulti=function(){const n=this.source.key,i=this.target.key;let t="out",e="in";this.undirected&&(t=e="undirected"),this.previous===void 0?this.next===void 0?(delete this.source[t][i],delete this.target[e][n]):(this.next.previous=void 0,this.source[t][i]=this.next,this.target[e][n]=this.next):(this.previous.next=this.next,this.next!==void 0&&(this.next.previous=this.previous))};const Ri=0,Ai=1,hr=2,xi=3;function ye(n,i,t,e,r,a,o){let s,u,h,d;if(e=""+e,t===Ri){if(s=n._nodes.get(e),!s)throw new C(`Graph.${i}: could not find the "${e}" node in the graph.`);h=r,d=a}else if(t===xi){if(r=""+r,u=n._edges.get(r),!u)throw new C(`Graph.${i}: could not find the "${r}" edge in the graph.`);const l=u.source.key,f=u.target.key;if(e===l)s=u.target;else if(e===f)s=u.source;else throw new C(`Graph.${i}: the "${e}" node is not attached to the "${r}" edge (${l}, ${f}).`);h=a,d=o}else{if(u=n._edges.get(e),!u)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`);t===Ai?s=u.source:s=u.target,h=r,d=a}return[s,h,d]}function dr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);return o.attributes[s]}}function lr(n,i,t){n.prototype[i]=function(e,r){const[a]=ye(this,i,t,e,r);return a.attributes}}function cr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);return o.attributes.hasOwnProperty(s)}}function fr(n,i,t){n.prototype[i]=function(e,r,a,o){const[s,u,h]=ye(this,i,t,e,r,a,o);return s.attributes[u]=h,this.emit("nodeAttributesUpdated",{key:s.key,type:"set",attributes:s.attributes,name:u}),this}}function gr(n,i,t){n.prototype[i]=function(e,r,a,o){const[s,u,h]=ye(this,i,t,e,r,a,o);if(typeof h!="function")throw new k(`Graph.${i}: updater should be a function.`);const d=s.attributes,l=h(d[u]);return d[u]=l,this.emit("nodeAttributesUpdated",{key:s.key,type:"set",attributes:s.attributes,name:u}),this}}function pr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);return delete o.attributes[s],this.emit("nodeAttributesUpdated",{key:o.key,type:"remove",attributes:o.attributes,name:s}),this}}function vr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);if(!J(s))throw new k(`Graph.${i}: provided attributes are not a plain object.`);return o.attributes=s,this.emit("nodeAttributesUpdated",{key:o.key,type:"replace",attributes:o.attributes}),this}}function mr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);if(!J(s))throw new k(`Graph.${i}: provided attributes are not a plain object.`);return Z(o.attributes,s),this.emit("nodeAttributesUpdated",{key:o.key,type:"merge",attributes:o.attributes,data:s}),this}}function yr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);if(typeof s!="function")throw new k(`Graph.${i}: provided updater is not a function.`);return o.attributes=s(o.attributes),this.emit("nodeAttributesUpdated",{key:o.key,type:"update",attributes:o.attributes}),this}}const br=[{name:n=>`get${n}Attribute`,attacher:dr},{name:n=>`get${n}Attributes`,attacher:lr},{name:n=>`has${n}Attribute`,attacher:cr},{name:n=>`set${n}Attribute`,attacher:fr},{name:n=>`update${n}Attribute`,attacher:gr},{name:n=>`remove${n}Attribute`,attacher:pr},{name:n=>`replace${n}Attributes`,attacher:vr},{name:n=>`merge${n}Attributes`,attacher:mr},{name:n=>`update${n}Attributes`,attacher:yr}];function wr(n){br.forEach(function({name:i,attacher:t}){t(n,i("Node"),Ri),t(n,i("Source"),Ai),t(n,i("Target"),hr),t(n,i("Opposite"),xi)})}function Er(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return a.attributes[r]}}function _r(n,i,t){n.prototype[i]=function(e){let r;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>1){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const a=""+e,o=""+arguments[1];if(r=oe(this,a,o,t),!r)throw new C(`Graph.${i}: could not find an edge for the given path ("${a}" - "${o}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,r=this._edges.get(e),!r)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return r.attributes}}function Tr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return a.attributes.hasOwnProperty(r)}}function Sr(n,i,t){n.prototype[i]=function(e,r,a){let o;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>3){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const s=""+e,u=""+r;if(r=arguments[2],a=arguments[3],o=oe(this,s,u,t),!o)throw new C(`Graph.${i}: could not find an edge for the given path ("${s}" - "${u}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,o=this._edges.get(e),!o)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return o.attributes[r]=a,this.emit("edgeAttributesUpdated",{key:o.key,type:"set",attributes:o.attributes,name:r}),this}}function Rr(n,i,t){n.prototype[i]=function(e,r,a){let o;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>3){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const s=""+e,u=""+r;if(r=arguments[2],a=arguments[3],o=oe(this,s,u,t),!o)throw new C(`Graph.${i}: could not find an edge for the given path ("${s}" - "${u}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,o=this._edges.get(e),!o)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(typeof a!="function")throw new k(`Graph.${i}: updater should be a function.`);return o.attributes[r]=a(o.attributes[r]),this.emit("edgeAttributesUpdated",{key:o.key,type:"set",attributes:o.attributes,name:r}),this}}function Ar(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return delete a.attributes[r],this.emit("edgeAttributesUpdated",{key:a.key,type:"remove",attributes:a.attributes,name:r}),this}}function xr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(!J(r))throw new k(`Graph.${i}: provided attributes are not a plain object.`);return a.attributes=r,this.emit("edgeAttributesUpdated",{key:a.key,type:"replace",attributes:a.attributes}),this}}function Cr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(!J(r))throw new k(`Graph.${i}: provided attributes are not a plain object.`);return Z(a.attributes,r),this.emit("edgeAttributesUpdated",{key:a.key,type:"merge",attributes:a.attributes,data:r}),this}}function kr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(typeof r!="function")throw new k(`Graph.${i}: provided updater is not a function.`);return a.attributes=r(a.attributes),this.emit("edgeAttributesUpdated",{key:a.key,type:"update",attributes:a.attributes}),this}}const Dr=[{name:n=>`get${n}Attribute`,attacher:Er},{name:n=>`get${n}Attributes`,attacher:_r},{name:n=>`has${n}Attribute`,attacher:Tr},{name:n=>`set${n}Attribute`,attacher:Sr},{name:n=>`update${n}Attribute`,attacher:Rr},{name:n=>`remove${n}Attribute`,attacher:Ar},{name:n=>`replace${n}Attributes`,attacher:xr},{name:n=>`merge${n}Attributes`,attacher:Cr},{name:n=>`update${n}Attributes`,attacher:kr}];function Lr(n){Dr.forEach(function({name:i,attacher:t}){t(n,i("Edge"),"mixed"),t(n,i("DirectedEdge"),"directed"),t(n,i("UndirectedEdge"),"undirected")})}const Gr=[{name:"edges",type:"mixed"},{name:"inEdges",type:"directed",direction:"in"},{name:"outEdges",type:"directed",direction:"out"},{name:"inboundEdges",type:"mixed",direction:"in"},{name:"outboundEdges",type:"mixed",direction:"out"},{name:"directedEdges",type:"directed"},{name:"undirectedEdges",type:"undirected"}];function Fr(n,i,t,e){let r=!1;for(const a in i){if(a===e)continue;const o=i[a];if(r=t(o.key,o.attributes,o.source.key,o.target.key,o.source.attributes,o.target.attributes,o.undirected),n&&r)return o.key}}function Nr(n,i,t,e){let r,a,o,s=!1;for(const u in i)if(u!==e){r=i[u];do{if(a=r.source,o=r.target,s=t(r.key,r.attributes,a.key,o.key,a.attributes,o.attributes,r.undirected),n&&s)return r.key;r=r.next}while(r!==void 0)}}function lt(n,i){const t=Object.keys(n),e=t.length;let r,a=0;return{[Symbol.iterator](){return this},next(){do if(r)r=r.next;else{if(a>=e)return{done:!0};const o=t[a++];if(o===i){r=void 0;continue}r=n[o]}while(!r);return{done:!1,value:{edge:r.key,attributes:r.attributes,source:r.source.key,target:r.target.key,sourceAttributes:r.source.attributes,targetAttributes:r.target.attributes,undirected:r.undirected}}}}}function Pr(n,i,t,e){const r=i[t];if(!r)return;const a=r.source,o=r.target;if(e(r.key,r.attributes,a.key,o.key,a.attributes,o.attributes,r.undirected)&&n)return r.key}function Ir(n,i,t,e){let r=i[t];if(!r)return;let a=!1;do{if(a=e(r.key,r.attributes,r.source.key,r.target.key,r.source.attributes,r.target.attributes,r.undirected),n&&a)return r.key;r=r.next}while(r!==void 0)}function ct(n,i){let t=n[i];if(t.next!==void 0)return{[Symbol.iterator](){return this},next(){if(!t)return{done:!0};const r={edge:t.key,attributes:t.attributes,source:t.source.key,target:t.target.key,sourceAttributes:t.source.attributes,targetAttributes:t.target.attributes,undirected:t.undirected};return t=t.next,{done:!1,value:r}}};let e=!1;return{[Symbol.iterator](){return this},next(){return e===!0?{done:!0}:(e=!0,{done:!1,value:{edge:t.key,attributes:t.attributes,source:t.source.key,target:t.target.key,sourceAttributes:t.source.attributes,targetAttributes:t.target.attributes,undirected:t.undirected}})}}}function Or(n,i){if(n.size===0)return[];if(i==="mixed"||i===n.type)return Array.from(n._edges.keys());const t=i==="undirected"?n.undirectedSize:n.directedSize,e=new Array(t),r=i==="undirected",a=n._edges.values();let o=0,s,u;for(;s=a.next(),s.done!==!0;)u=s.value,u.undirected===r&&(e[o++]=u.key);return e}function Ci(n,i,t,e){if(i.size===0)return;const r=t!=="mixed"&&t!==i.type,a=t==="undirected";let o,s,u=!1;const h=i._edges.values();for(;o=h.next(),o.done!==!0;){if(s=o.value,r&&s.undirected!==a)continue;const{key:d,attributes:l,source:f,target:c}=s;if(u=e(d,l,f.key,c.key,f.attributes,c.attributes,s.undirected),n&&u)return d}}function Ur(n,i){if(n.size===0)return Le();const t=i!=="mixed"&&i!==n.type,e=i==="undirected",r=n._edges.values();return{[Symbol.iterator](){return this},next(){let a,o;for(;;){if(a=r.next(),a.done)return a;if(o=a.value,!(t&&o.undirected!==e))break}return{value:{edge:o.key,attributes:o.attributes,source:o.source.key,target:o.target.key,sourceAttributes:o.source.attributes,targetAttributes:o.target.attributes,undirected:o.undirected},done:!1}}}}function Gt(n,i,t,e,r,a){const o=i?Nr:Fr;let s;if(t!=="undirected"&&(e!=="out"&&(s=o(n,r.in,a),n&&s)||e!=="in"&&(s=o(n,r.out,a,e?void 0:r.key),n&&s))||t!=="directed"&&(s=o(n,r.undirected,a),n&&s))return s}function zr(n,i,t,e){const r=[];return Gt(!1,n,i,t,e,function(a){r.push(a)}),r}function $r(n,i,t){let e=Le();return n!=="undirected"&&(i!=="out"&&typeof t.in<"u"&&(e=me(e,lt(t.in))),i!=="in"&&typeof t.out<"u"&&(e=me(e,lt(t.out,i?void 0:t.key)))),n!=="directed"&&typeof t.undirected<"u"&&(e=me(e,lt(t.undirected))),e}function Ft(n,i,t,e,r,a,o){const s=t?Ir:Pr;let u;if(i!=="undirected"&&(typeof r.in<"u"&&e!=="out"&&(u=s(n,r.in,a,o),n&&u)||typeof r.out<"u"&&e!=="in"&&(e||r.key!==a)&&(u=s(n,r.out,a,o),n&&u))||i!=="directed"&&typeof r.undirected<"u"&&(u=s(n,r.undirected,a,o),n&&u))return u}function Br(n,i,t,e,r){const a=[];return Ft(!1,n,i,t,e,r,function(o){a.push(o)}),a}function Mr(n,i,t,e){let r=Le();return n!=="undirected"&&(typeof t.in<"u"&&i!=="out"&&e in t.in&&(r=me(r,ct(t.in,e))),typeof t.out<"u"&&i!=="in"&&e in t.out&&(i||t.key!==e)&&(r=me(r,ct(t.out,e)))),n!=="directed"&&typeof t.undirected<"u"&&e in t.undirected&&(r=me(r,ct(t.undirected,e))),r}function Hr(n,i){const{name:t,type:e,direction:r}=i;n.prototype[t]=function(a,o){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return[];if(!arguments.length)return Or(this,e);if(arguments.length===1){a=""+a;const s=this._nodes.get(a);if(typeof s>"u")throw new C(`Graph.${t}: could not find the "${a}" node in the graph.`);return zr(this.multi,e==="mixed"?this.type:e,r,s)}if(arguments.length===2){a=""+a,o=""+o;const s=this._nodes.get(a);if(!s)throw new C(`Graph.${t}: could not find the "${a}" source node in the graph.`);if(!this._nodes.has(o))throw new C(`Graph.${t}: could not find the "${o}" target node in the graph.`);return Br(e,this.multi,r,s,o)}throw new k(`Graph.${t}: too many arguments (expecting 0, 1 or 2 and got ${arguments.length}).`)}}function Wr(n,i){const{name:t,type:e,direction:r}=i,a="forEach"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[a]=function(h,d,l){if(!(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)){if(arguments.length===1)return l=h,Ci(!1,this,e,l);if(arguments.length===2){h=""+h,l=d;const f=this._nodes.get(h);if(typeof f>"u")throw new C(`Graph.${a}: could not find the "${h}" node in the graph.`);return Gt(!1,this.multi,e==="mixed"?this.type:e,r,f,l)}if(arguments.length===3){h=""+h,d=""+d;const f=this._nodes.get(h);if(!f)throw new C(`Graph.${a}: could not find the "${h}" source node in the graph.`);if(!this._nodes.has(d))throw new C(`Graph.${a}: could not find the "${d}" target node in the graph.`);return Ft(!1,e,this.multi,r,f,d,l)}throw new k(`Graph.${a}: too many arguments (expecting 1, 2 or 3 and got ${arguments.length}).`)}};const o="map"+t[0].toUpperCase()+t.slice(1);n.prototype[o]=function(){const h=Array.prototype.slice.call(arguments),d=h.pop();let l;if(h.length===0){let f=0;e!=="directed"&&(f+=this.undirectedSize),e!=="undirected"&&(f+=this.directedSize),l=new Array(f);let c=0;h.push((y,w,T,D,m,S,p)=>{l[c++]=d(y,w,T,D,m,S,p)})}else l=[],h.push((f,c,y,w,T,D,m)=>{l.push(d(f,c,y,w,T,D,m))});return this[a].apply(this,h),l};const s="filter"+t[0].toUpperCase()+t.slice(1);n.prototype[s]=function(){const h=Array.prototype.slice.call(arguments),d=h.pop(),l=[];return h.push((f,c,y,w,T,D,m)=>{d(f,c,y,w,T,D,m)&&l.push(f)}),this[a].apply(this,h),l};const u="reduce"+t[0].toUpperCase()+t.slice(1);n.prototype[u]=function(){let h=Array.prototype.slice.call(arguments);if(h.length<2||h.length>4)throw new k(`Graph.${u}: invalid number of arguments (expecting 2, 3 or 4 and got ${h.length}).`);if(typeof h[h.length-1]=="function"&&typeof h[h.length-2]!="function")throw new k(`Graph.${u}: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.`);let d,l;h.length===2?(d=h[0],l=h[1],h=[]):h.length===3?(d=h[1],l=h[2],h=[h[0]]):h.length===4&&(d=h[2],l=h[3],h=[h[0],h[1]]);let f=l;return h.push((c,y,w,T,D,m,S)=>{f=d(f,c,y,w,T,D,m,S)}),this[a].apply(this,h),f}}function jr(n,i){const{name:t,type:e,direction:r}=i,a="find"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[a]=function(u,h,d){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return!1;if(arguments.length===1)return d=u,Ci(!0,this,e,d);if(arguments.length===2){u=""+u,d=h;const l=this._nodes.get(u);if(typeof l>"u")throw new C(`Graph.${a}: could not find the "${u}" node in the graph.`);return Gt(!0,this.multi,e==="mixed"?this.type:e,r,l,d)}if(arguments.length===3){u=""+u,h=""+h;const l=this._nodes.get(u);if(!l)throw new C(`Graph.${a}: could not find the "${u}" source node in the graph.`);if(!this._nodes.has(h))throw new C(`Graph.${a}: could not find the "${h}" target node in the graph.`);return Ft(!0,e,this.multi,r,l,h,d)}throw new k(`Graph.${a}: too many arguments (expecting 1, 2 or 3 and got ${arguments.length}).`)};const o="some"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[o]=function(){const u=Array.prototype.slice.call(arguments),h=u.pop();return u.push((l,f,c,y,w,T,D)=>h(l,f,c,y,w,T,D)),!!this[a].apply(this,u)};const s="every"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[s]=function(){const u=Array.prototype.slice.call(arguments),h=u.pop();return u.push((l,f,c,y,w,T,D)=>!h(l,f,c,y,w,T,D)),!this[a].apply(this,u)}}function Vr(n,i){const{name:t,type:e,direction:r}=i,a=t.slice(0,-1)+"Entries";n.prototype[a]=function(o,s){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return Le();if(!arguments.length)return Ur(this,e);if(arguments.length===1){o=""+o;const u=this._nodes.get(o);if(!u)throw new C(`Graph.${a}: could not find the "${o}" node in the graph.`);return $r(e,r,u)}if(arguments.length===2){o=""+o,s=""+s;const u=this._nodes.get(o);if(!u)throw new C(`Graph.${a}: could not find the "${o}" source node in the graph.`);if(!this._nodes.has(s))throw new C(`Graph.${a}: could not find the "${s}" target node in the graph.`);return Mr(e,r,u,s)}throw new k(`Graph.${a}: too many arguments (expecting 0, 1 or 2 and got ${arguments.length}).`)}}function qr(n){Gr.forEach(i=>{Hr(n,i),Wr(n,i),jr(n,i),Vr(n,i)})}const Kr=[{name:"neighbors",type:"mixed"},{name:"inNeighbors",type:"directed",direction:"in"},{name:"outNeighbors",type:"directed",direction:"out"},{name:"inboundNeighbors",type:"mixed",direction:"in"},{name:"outboundNeighbors",type:"mixed",direction:"out"},{name:"directedNeighbors",type:"directed"},{name:"undirectedNeighbors",type:"undirected"}];function ut(){this.A=null,this.B=null}ut.prototype.wrap=function(n){this.A===null?this.A=n:this.B===null&&(this.B=n)};ut.prototype.has=function(n){return this.A!==null&&n in this.A||this.B!==null&&n in this.B};function Oe(n,i,t,e,r){for(const a in e){const o=e[a],s=o.source,u=o.target,h=s===t?u:s;if(i&&i.has(h.key))continue;const d=r(h.key,h.attributes);if(n&&d)return h.key}}function Nt(n,i,t,e,r){if(i!=="mixed"){if(i==="undirected")return Oe(n,null,e,e.undirected,r);if(typeof t=="string")return Oe(n,null,e,e[t],r)}const a=new ut;let o;if(i!=="undirected"){if(t!=="out"){if(o=Oe(n,null,e,e.in,r),n&&o)return o;a.wrap(e.in)}if(t!=="in"){if(o=Oe(n,a,e,e.out,r),n&&o)return o;a.wrap(e.out)}}if(i!=="directed"&&(o=Oe(n,a,e,e.undirected,r),n&&o))return o}function Yr(n,i,t){if(n!=="mixed"){if(n==="undirected")return Object.keys(t.undirected);if(typeof i=="string")return Object.keys(t[i])}const e=[];return Nt(!1,n,i,t,function(r){e.push(r)}),e}function Ue(n,i,t){const e=Object.keys(t),r=e.length;let a=0;return{[Symbol.iterator](){return this},next(){let o=null;do{if(a>=r)return n&&n.wrap(t),{done:!0};const s=t[e[a++]],u=s.source,h=s.target;if(o=u===i?h:u,n&&n.has(o.key)){o=null;continue}}while(o===null);return{done:!1,value:{neighbor:o.key,attributes:o.attributes}}}}}function Zr(n,i,t){if(n!=="mixed"){if(n==="undirected")return Ue(null,t,t.undirected);if(typeof i=="string")return Ue(null,t,t[i])}let e=Le();const r=new ut;return n!=="undirected"&&(i!=="out"&&(e=me(e,Ue(r,t,t.in))),i!=="in"&&(e=me(e,Ue(r,t,t.out)))),n!=="directed"&&(e=me(e,Ue(r,t,t.undirected))),e}function Xr(n,i){const{name:t,type:e,direction:r}=i;n.prototype[t]=function(a){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return[];a=""+a;const o=this._nodes.get(a);if(typeof o>"u")throw new C(`Graph.${t}: could not find the "${a}" node in the graph.`);return Yr(e==="mixed"?this.type:e,r,o)}}function Jr(n,i){const{name:t,type:e,direction:r}=i,a="forEach"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[a]=function(h,d){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return;h=""+h;const l=this._nodes.get(h);if(typeof l>"u")throw new C(`Graph.${a}: could not find the "${h}" node in the graph.`);Nt(!1,e==="mixed"?this.type:e,r,l,d)};const o="map"+t[0].toUpperCase()+t.slice(1);n.prototype[o]=function(h,d){const l=[];return this[a](h,(f,c)=>{l.push(d(f,c))}),l};const s="filter"+t[0].toUpperCase()+t.slice(1);n.prototype[s]=function(h,d){const l=[];return this[a](h,(f,c)=>{d(f,c)&&l.push(f)}),l};const u="reduce"+t[0].toUpperCase()+t.slice(1);n.prototype[u]=function(h,d,l){if(arguments.length<3)throw new k(`Graph.${u}: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.`);let f=l;return this[a](h,(c,y)=>{f=d(f,c,y)}),f}}function Qr(n,i){const{name:t,type:e,direction:r}=i,a=t[0].toUpperCase()+t.slice(1,-1),o="find"+a;n.prototype[o]=function(h,d){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return;h=""+h;const l=this._nodes.get(h);if(typeof l>"u")throw new C(`Graph.${o}: could not find the "${h}" node in the graph.`);return Nt(!0,e==="mixed"?this.type:e,r,l,d)};const s="some"+a;n.prototype[s]=function(h,d){return!!this[o](h,d)};const u="every"+a;n.prototype[u]=function(h,d){return!this[o](h,(f,c)=>!d(f,c))}}function en(n,i){const{name:t,type:e,direction:r}=i,a=t.slice(0,-1)+"Entries";n.prototype[a]=function(o){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return Le();o=""+o;const s=this._nodes.get(o);if(typeof s>"u")throw new C(`Graph.${a}: could not find the "${o}" node in the graph.`);return Zr(e==="mixed"?this.type:e,r,s)}}function tn(n){Kr.forEach(i=>{Xr(n,i),Jr(n,i),Qr(n,i),en(n,i)})}function tt(n,i,t,e,r){const a=e._nodes.values(),o=e.type;let s,u,h,d,l,f;for(;s=a.next(),s.done!==!0;){let c=!1;if(u=s.value,o!=="undirected"){d=u.out;for(h in d){l=d[h];do f=l.target,c=!0,r(u.key,f.key,u.attributes,f.attributes,l.key,l.attributes,l.undirected),l=l.next;while(l)}}if(o!=="directed"){d=u.undirected;for(h in d)if(!(i&&u.key>h)){l=d[h];do f=l.target,f.key!==h&&(f=l.source),c=!0,r(u.key,f.key,u.attributes,f.attributes,l.key,l.attributes,l.undirected),l=l.next;while(l)}}t&&!c&&r(u.key,null,u.attributes,null,null,null,null)}}function rn(n,i){const t={key:n};return Ei(i.attributes)||(t.attributes=Z({},i.attributes)),t}function nn(n,i,t){const e={key:i,source:t.source.key,target:t.target.key};return Ei(t.attributes)||(e.attributes=Z({},t.attributes)),n==="mixed"&&t.undirected&&(e.undirected=!0),e}function an(n){if(!J(n))throw new k('Graph.import: invalid serialized node. A serialized node should be a plain object with at least a "key" property.');if(!("key"in n))throw new k("Graph.import: serialized node is missing its key.");if("attributes"in n&&(!J(n.attributes)||n.attributes===null))throw new k("Graph.import: invalid attributes. Attributes should be a plain object, null or omitted.")}function on(n){if(!J(n))throw new k('Graph.import: invalid serialized edge. A serialized edge should be a plain object with at least a "source" & "target" property.');if(!("source"in n))throw new k("Graph.import: serialized edge is missing its source.");if(!("target"in n))throw new k("Graph.import: serialized edge is missing its target.");if("attributes"in n&&(!J(n.attributes)||n.attributes===null))throw new k("Graph.import: invalid attributes. Attributes should be a plain object, null or omitted.");if("undirected"in n&&typeof n.undirected!="boolean")throw new k("Graph.import: invalid undirectedness information. Undirected should be boolean or omitted.")}const sn=ur(),un=new Set(["directed","undirected","mixed"]),Bt=new Set(["domain","_events","_eventsCount","_maxListeners"]),hn=[{name:n=>`${n}Edge`,generateKey:!0},{name:n=>`${n}DirectedEdge`,generateKey:!0,type:"directed"},{name:n=>`${n}UndirectedEdge`,generateKey:!0,type:"undirected"},{name:n=>`${n}EdgeWithKey`},{name:n=>`${n}DirectedEdgeWithKey`,type:"directed"},{name:n=>`${n}UndirectedEdgeWithKey`,type:"undirected"}],dn={allowSelfLoops:!0,multi:!1,type:"mixed"};function ln(n,i,t){if(t&&!J(t))throw new k(`Graph.addNode: invalid attributes. Expecting an object but got "${t}"`);if(i=""+i,t=t||{},n._nodes.has(i))throw new I(`Graph.addNode: the "${i}" node already exist in the graph.`);const e=new n.NodeDataClass(i,t);return n._nodes.set(i,e),n.emit("nodeAdded",{key:i,attributes:t}),e}function Mt(n,i,t){const e=new n.NodeDataClass(i,t);return n._nodes.set(i,e),n.emit("nodeAdded",{key:i,attributes:t}),e}function ki(n,i,t,e,r,a,o,s){if(!e&&n.type==="undirected")throw new I(`Graph.${i}: you cannot add a directed edge to an undirected graph. Use the #.addEdge or #.addUndirectedEdge instead.`);if(e&&n.type==="directed")throw new I(`Graph.${i}: you cannot add an undirected edge to a directed graph. Use the #.addEdge or #.addDirectedEdge instead.`);if(s&&!J(s))throw new k(`Graph.${i}: invalid attributes. Expecting an object but got "${s}"`);if(a=""+a,o=""+o,s=s||{},!n.allowSelfLoops&&a===o)throw new I(`Graph.${i}: source & target are the same ("${a}"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.`);const u=n._nodes.get(a),h=n._nodes.get(o);if(!u)throw new C(`Graph.${i}: source node "${a}" not found.`);if(!h)throw new C(`Graph.${i}: target node "${o}" not found.`);const d={key:null,undirected:e,source:a,target:o,attributes:s};if(t)r=n._edgeKeyGenerator();else if(r=""+r,n._edges.has(r))throw new I(`Graph.${i}: the "${r}" edge already exists in the graph.`);if(!n.multi&&(e?typeof u.undirected[o]<"u":typeof u.out[o]<"u"))throw new I(`Graph.${i}: an edge linking "${a}" to "${o}" already exists. If you really want to add multiple edges linking those nodes, you should create a multi graph by using the 'multi' option.`);const l=new Ge(e,r,u,h,s);n._edges.set(r,l);const f=a===o;return e?(u.undirectedDegree++,h.undirectedDegree++,f&&(u.undirectedLoops++,n._undirectedSelfLoopCount++)):(u.outDegree++,h.inDegree++,f&&(u.directedLoops++,n._directedSelfLoopCount++)),n.multi?l.attachMulti():l.attach(),e?n._undirectedSize++:n._directedSize++,d.key=r,n.emit("edgeAdded",d),r}function cn(n,i,t,e,r,a,o,s,u){if(!e&&n.type==="undirected")throw new I(`Graph.${i}: you cannot merge/update a directed edge to an undirected graph. Use the #.mergeEdge/#.updateEdge or #.addUndirectedEdge instead.`);if(e&&n.type==="directed")throw new I(`Graph.${i}: you cannot merge/update an undirected edge to a directed graph. Use the #.mergeEdge/#.updateEdge or #.addDirectedEdge instead.`);if(s){if(u){if(typeof s!="function")throw new k(`Graph.${i}: invalid updater function. Expecting a function but got "${s}"`)}else if(!J(s))throw new k(`Graph.${i}: invalid attributes. Expecting an object but got "${s}"`)}a=""+a,o=""+o;let h;if(u&&(h=s,s=void 0),!n.allowSelfLoops&&a===o)throw new I(`Graph.${i}: source & target are the same ("${a}"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.`);let d=n._nodes.get(a),l=n._nodes.get(o),f,c;if(!t&&(f=n._edges.get(r),f)){if((f.source.key!==a||f.target.key!==o)&&(!e||f.source.key!==o||f.target.key!==a))throw new I(`Graph.${i}: inconsistency detected when attempting to merge the "${r}" edge with "${a}" source & "${o}" target vs. ("${f.source.key}", "${f.target.key}").`);c=f}if(!c&&!n.multi&&d&&(c=e?d.undirected[o]:d.out[o]),c){const m=[c.key,!1,!1,!1];if(u?!h:!s)return m;if(u){const S=c.attributes;c.attributes=h(S),n.emit("edgeAttributesUpdated",{type:"replace",key:c.key,attributes:c.attributes})}else Z(c.attributes,s),n.emit("edgeAttributesUpdated",{type:"merge",key:c.key,attributes:c.attributes,data:s});return m}s=s||{},u&&h&&(s=h(s));const y={key:null,undirected:e,source:a,target:o,attributes:s};if(t)r=n._edgeKeyGenerator();else if(r=""+r,n._edges.has(r))throw new I(`Graph.${i}: the "${r}" edge already exists in the graph.`);let w=!1,T=!1;d||(d=Mt(n,a,{}),w=!0,a===o&&(l=d,T=!0)),l||(l=Mt(n,o,{}),T=!0),f=new Ge(e,r,d,l,s),n._edges.set(r,f);const D=a===o;return e?(d.undirectedDegree++,l.undirectedDegree++,D&&(d.undirectedLoops++,n._undirectedSelfLoopCount++)):(d.outDegree++,l.inDegree++,D&&(d.directedLoops++,n._directedSelfLoopCount++)),n.multi?f.attachMulti():f.attach(),e?n._undirectedSize++:n._directedSize++,y.key=r,n.emit("edgeAdded",y),[r,!0,w,T]}function xe(n,i){n._edges.delete(i.key);const{source:t,target:e,attributes:r}=i,a=i.undirected,o=t===e;a?(t.undirectedDegree--,e.undirectedDegree--,o&&(t.undirectedLoops--,n._undirectedSelfLoopCount--)):(t.outDegree--,e.inDegree--,o&&(t.directedLoops--,n._directedSelfLoopCount--)),n.multi?i.detachMulti():i.detach(),a?n._undirectedSize--:n._directedSize--,n.emit("edgeDropped",{key:i.key,attributes:r,source:t.key,target:e.key,undirected:a})}class j extends wi.EventEmitter{constructor(i){if(super(),i=Z({},dn,i),typeof i.multi!="boolean")throw new k(`Graph.constructor: invalid 'multi' option. Expecting a boolean but got "${i.multi}".`);if(!un.has(i.type))throw new k(`Graph.constructor: invalid 'type' option. Should be one of "mixed", "directed" or "undirected" but got "${i.type}".`);if(typeof i.allowSelfLoops!="boolean")throw new k(`Graph.constructor: invalid 'allowSelfLoops' option. Expecting a boolean but got "${i.allowSelfLoops}".`);const t=i.type==="mixed"?_i:i.type==="directed"?Ti:Si;ae(this,"NodeDataClass",t);const e="geid_"+sn()+"_";let r=0;const a=()=>{let o;do o=e+r++;while(this._edges.has(o));return o};ae(this,"_attributes",{}),ae(this,"_nodes",new Map),ae(this,"_edges",new Map),ae(this,"_directedSize",0),ae(this,"_undirectedSize",0),ae(this,"_directedSelfLoopCount",0),ae(this,"_undirectedSelfLoopCount",0),ae(this,"_edgeKeyGenerator",a),ae(this,"_options",i),Bt.forEach(o=>ae(this,o,this[o])),he(this,"order",()=>this._nodes.size),he(this,"size",()=>this._edges.size),he(this,"directedSize",()=>this._directedSize),he(this,"undirectedSize",()=>this._undirectedSize),he(this,"selfLoopCount",()=>this._directedSelfLoopCount+this._undirectedSelfLoopCount),he(this,"directedSelfLoopCount",()=>this._directedSelfLoopCount),he(this,"undirectedSelfLoopCount",()=>this._undirectedSelfLoopCount),he(this,"multi",this._options.multi),he(this,"type",this._options.type),he(this,"allowSelfLoops",this._options.allowSelfLoops),he(this,"implementation",()=>"graphology")}_resetInstanceCounters(){this._directedSize=0,this._undirectedSize=0,this._directedSelfLoopCount=0,this._undirectedSelfLoopCount=0}hasNode(i){return this._nodes.has(""+i)}hasDirectedEdge(i,t){if(this.type==="undirected")return!1;if(arguments.length===1){const e=""+i,r=this._edges.get(e);return!!r&&!r.undirected}else if(arguments.length===2){i=""+i,t=""+t;const e=this._nodes.get(i);return e?e.out.hasOwnProperty(t):!1}throw new k(`Graph.hasDirectedEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`)}hasUndirectedEdge(i,t){if(this.type==="directed")return!1;if(arguments.length===1){const e=""+i,r=this._edges.get(e);return!!r&&r.undirected}else if(arguments.length===2){i=""+i,t=""+t;const e=this._nodes.get(i);return e?e.undirected.hasOwnProperty(t):!1}throw new k(`Graph.hasDirectedEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`)}hasEdge(i,t){if(arguments.length===1){const e=""+i;return this._edges.has(e)}else if(arguments.length===2){i=""+i,t=""+t;const e=this._nodes.get(i);return e?typeof e.out<"u"&&e.out.hasOwnProperty(t)||typeof e.undirected<"u"&&e.undirected.hasOwnProperty(t):!1}throw new k(`Graph.hasEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`)}directedEdge(i,t){if(this.type==="undirected")return;if(i=""+i,t=""+t,this.multi)throw new I("Graph.directedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.directedEdges instead.");const e=this._nodes.get(i);if(!e)throw new C(`Graph.directedEdge: could not find the "${i}" source node in the graph.`);if(!this._nodes.has(t))throw new C(`Graph.directedEdge: could not find the "${t}" target node in the graph.`);const r=e.out&&e.out[t]||void 0;if(r)return r.key}undirectedEdge(i,t){if(this.type==="directed")return;if(i=""+i,t=""+t,this.multi)throw new I("Graph.undirectedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.undirectedEdges instead.");const e=this._nodes.get(i);if(!e)throw new C(`Graph.undirectedEdge: could not find the "${i}" source node in the graph.`);if(!this._nodes.has(t))throw new C(`Graph.undirectedEdge: could not find the "${t}" target node in the graph.`);const r=e.undirected&&e.undirected[t]||void 0;if(r)return r.key}edge(i,t){if(this.multi)throw new I("Graph.edge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.edges instead.");i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.edge: could not find the "${i}" source node in the graph.`);if(!this._nodes.has(t))throw new C(`Graph.edge: could not find the "${t}" target node in the graph.`);const r=e.out&&e.out[t]||e.undirected&&e.undirected[t]||void 0;if(r)return r.key}areDirectedNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areDirectedNeighbors: could not find the "${i}" node in the graph.`);return this.type==="undirected"?!1:t in e.in||t in e.out}areOutNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areOutNeighbors: could not find the "${i}" node in the graph.`);return this.type==="undirected"?!1:t in e.out}areInNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areInNeighbors: could not find the "${i}" node in the graph.`);return this.type==="undirected"?!1:t in e.in}areUndirectedNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areUndirectedNeighbors: could not find the "${i}" node in the graph.`);return this.type==="directed"?!1:t in e.undirected}areNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areNeighbors: could not find the "${i}" node in the graph.`);return this.type!=="undirected"&&(t in e.in||t in e.out)||this.type!=="directed"&&t in e.undirected}areInboundNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areInboundNeighbors: could not find the "${i}" node in the graph.`);return this.type!=="undirected"&&t in e.in||this.type!=="directed"&&t in e.undirected}areOutboundNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areOutboundNeighbors: could not find the "${i}" node in the graph.`);return this.type!=="undirected"&&t in e.out||this.type!=="directed"&&t in e.undirected}inDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.inDegree: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree}outDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.outDegree: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.outDegree}directedDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.directedDegree: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree+t.outDegree}undirectedDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.undirectedDegree: could not find the "${i}" node in the graph.`);return this.type==="directed"?0:t.undirectedDegree}inboundDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.inboundDegree: could not find the "${i}" node in the graph.`);let e=0;return this.type!=="directed"&&(e+=t.undirectedDegree),this.type!=="undirected"&&(e+=t.inDegree),e}outboundDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.outboundDegree: could not find the "${i}" node in the graph.`);let e=0;return this.type!=="directed"&&(e+=t.undirectedDegree),this.type!=="undirected"&&(e+=t.outDegree),e}degree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.degree: could not find the "${i}" node in the graph.`);let e=0;return this.type!=="directed"&&(e+=t.undirectedDegree),this.type!=="undirected"&&(e+=t.inDegree+t.outDegree),e}inDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.inDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree-t.directedLoops}outDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.outDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.outDegree-t.directedLoops}directedDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.directedDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree+t.outDegree-t.directedLoops*2}undirectedDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.undirectedDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="directed"?0:t.undirectedDegree-t.undirectedLoops*2}inboundDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.inboundDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);let e=0,r=0;return this.type!=="directed"&&(e+=t.undirectedDegree,r+=t.undirectedLoops*2),this.type!=="undirected"&&(e+=t.inDegree,r+=t.directedLoops),e-r}outboundDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.outboundDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);let e=0,r=0;return this.type!=="directed"&&(e+=t.undirectedDegree,r+=t.undirectedLoops*2),this.type!=="undirected"&&(e+=t.outDegree,r+=t.directedLoops),e-r}degreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.degreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);let e=0,r=0;return this.type!=="directed"&&(e+=t.undirectedDegree,r+=t.undirectedLoops*2),this.type!=="undirected"&&(e+=t.inDegree+t.outDegree,r+=t.directedLoops*2),e-r}source(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.source: could not find the "${i}" edge in the graph.`);return t.source.key}target(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.target: could not find the "${i}" edge in the graph.`);return t.target.key}extremities(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.extremities: could not find the "${i}" edge in the graph.`);return[t.source.key,t.target.key]}opposite(i,t){i=""+i,t=""+t;const e=this._edges.get(t);if(!e)throw new C(`Graph.opposite: could not find the "${t}" edge in the graph.`);const r=e.source.key,a=e.target.key;if(i===r)return a;if(i===a)return r;throw new C(`Graph.opposite: the "${i}" node is not attached to the "${t}" edge (${r}, ${a}).`)}hasExtremity(i,t){i=""+i,t=""+t;const e=this._edges.get(i);if(!e)throw new C(`Graph.hasExtremity: could not find the "${i}" edge in the graph.`);return e.source.key===t||e.target.key===t}isUndirected(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.isUndirected: could not find the "${i}" edge in the graph.`);return t.undirected}isDirected(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.isDirected: could not find the "${i}" edge in the graph.`);return!t.undirected}isSelfLoop(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.isSelfLoop: could not find the "${i}" edge in the graph.`);return t.source===t.target}addNode(i,t){return ln(this,i,t).key}mergeNode(i,t){if(t&&!J(t))throw new k(`Graph.mergeNode: invalid attributes. Expecting an object but got "${t}"`);i=""+i,t=t||{};let e=this._nodes.get(i);return e?(t&&(Z(e.attributes,t),this.emit("nodeAttributesUpdated",{type:"merge",key:i,attributes:e.attributes,data:t})),[i,!1]):(e=new this.NodeDataClass(i,t),this._nodes.set(i,e),this.emit("nodeAdded",{key:i,attributes:t}),[i,!0])}updateNode(i,t){if(t&&typeof t!="function")throw new k(`Graph.updateNode: invalid updater function. Expecting a function but got "${t}"`);i=""+i;let e=this._nodes.get(i);if(e){if(t){const a=e.attributes;e.attributes=t(a),this.emit("nodeAttributesUpdated",{type:"replace",key:i,attributes:e.attributes})}return[i,!1]}const r=t?t({}):{};return e=new this.NodeDataClass(i,r),this._nodes.set(i,e),this.emit("nodeAdded",{key:i,attributes:r}),[i,!0]}dropNode(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.dropNode: could not find the "${i}" node in the graph.`);let e;if(this.type!=="undirected"){for(const r in t.out){e=t.out[r];do xe(this,e),e=e.next;while(e)}for(const r in t.in){e=t.in[r];do xe(this,e),e=e.next;while(e)}}if(this.type!=="directed")for(const r in t.undirected){e=t.undirected[r];do xe(this,e),e=e.next;while(e)}this._nodes.delete(i),this.emit("nodeDropped",{key:i,attributes:t.attributes})}dropEdge(i){let t;if(arguments.length>1){const e=""+arguments[0],r=""+arguments[1];if(t=oe(this,e,r,this.type),!t)throw new C(`Graph.dropEdge: could not find the "${e}" -> "${r}" edge in the graph.`)}else if(i=""+i,t=this._edges.get(i),!t)throw new C(`Graph.dropEdge: could not find the "${i}" edge in the graph.`);return xe(this,t),this}dropDirectedEdge(i,t){if(arguments.length<2)throw new I("Graph.dropDirectedEdge: it does not make sense to try and drop a directed edge by key. What if the edge with this key is undirected? Use #.dropEdge for this purpose instead.");if(this.multi)throw new I("Graph.dropDirectedEdge: cannot use a {source,target} combo when dropping an edge in a MultiGraph since we cannot infer the one you want to delete as there could be multiple ones.");i=""+i,t=""+t;const e=oe(this,i,t,"directed");if(!e)throw new C(`Graph.dropDirectedEdge: could not find a "${i}" -> "${t}" edge in the graph.`);return xe(this,e),this}dropUndirectedEdge(i,t){if(arguments.length<2)throw new I("Graph.dropUndirectedEdge: it does not make sense to drop a directed edge by key. What if the edge with this key is undirected? Use #.dropEdge for this purpose instead.");if(this.multi)throw new I("Graph.dropUndirectedEdge: cannot use a {source,target} combo when dropping an edge in a MultiGraph since we cannot infer the one you want to delete as there could be multiple ones.");const e=oe(this,i,t,"undirected");if(!e)throw new C(`Graph.dropUndirectedEdge: could not find a "${i}" -> "${t}" edge in the graph.`);return xe(this,e),this}clear(){this._edges.clear(),this._nodes.clear(),this._resetInstanceCounters(),this.emit("cleared")}clearEdges(){const i=this._nodes.values();let t;for(;t=i.next(),t.done!==!0;)t.value.clear();this._edges.clear(),this._resetInstanceCounters(),this.emit("edgesCleared")}getAttribute(i){return this._attributes[i]}getAttributes(){return this._attributes}hasAttribute(i){return this._attributes.hasOwnProperty(i)}setAttribute(i,t){return this._attributes[i]=t,this.emit("attributesUpdated",{type:"set",attributes:this._attributes,name:i}),this}updateAttribute(i,t){if(typeof t!="function")throw new k("Graph.updateAttribute: updater should be a function.");const e=this._attributes[i];return this._attributes[i]=t(e),this.emit("attributesUpdated",{type:"set",attributes:this._attributes,name:i}),this}removeAttribute(i){return delete this._attributes[i],this.emit("attributesUpdated",{type:"remove",attributes:this._attributes,name:i}),this}replaceAttributes(i){if(!J(i))throw new k("Graph.replaceAttributes: provided attributes are not a plain object.");return this._attributes=i,this.emit("attributesUpdated",{type:"replace",attributes:this._attributes}),this}mergeAttributes(i){if(!J(i))throw new k("Graph.mergeAttributes: provided attributes are not a plain object.");return Z(this._attributes,i),this.emit("attributesUpdated",{type:"merge",attributes:this._attributes,data:i}),this}updateAttributes(i){if(typeof i!="function")throw new k("Graph.updateAttributes: provided updater is not a function.");return this._attributes=i(this._attributes),this.emit("attributesUpdated",{type:"update",attributes:this._attributes}),this}updateEachNodeAttributes(i,t){if(typeof i!="function")throw new k("Graph.updateEachNodeAttributes: expecting an updater function.");if(t&&!$t(t))throw new k("Graph.updateEachNodeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}");const e=this._nodes.values();let r,a;for(;r=e.next(),r.done!==!0;)a=r.value,a.attributes=i(a.key,a.attributes);this.emit("eachNodeAttributesUpdated",{hints:t||null})}updateEachEdgeAttributes(i,t){if(typeof i!="function")throw new k("Graph.updateEachEdgeAttributes: expecting an updater function.");if(t&&!$t(t))throw new k("Graph.updateEachEdgeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}");const e=this._edges.values();let r,a,o,s;for(;r=e.next(),r.done!==!0;)a=r.value,o=a.source,s=a.target,a.attributes=i(a.key,a.attributes,o.key,s.key,o.attributes,s.attributes,a.undirected);this.emit("eachEdgeAttributesUpdated",{hints:t||null})}forEachAdjacencyEntry(i){if(typeof i!="function")throw new k("Graph.forEachAdjacencyEntry: expecting a callback.");tt(!1,!1,!1,this,i)}forEachAdjacencyEntryWithOrphans(i){if(typeof i!="function")throw new k("Graph.forEachAdjacencyEntryWithOrphans: expecting a callback.");tt(!1,!1,!0,this,i)}forEachAssymetricAdjacencyEntry(i){if(typeof i!="function")throw new k("Graph.forEachAssymetricAdjacencyEntry: expecting a callback.");tt(!1,!0,!1,this,i)}forEachAssymetricAdjacencyEntryWithOrphans(i){if(typeof i!="function")throw new k("Graph.forEachAssymetricAdjacencyEntryWithOrphans: expecting a callback.");tt(!1,!0,!0,this,i)}nodes(){return Array.from(this._nodes.keys())}forEachNode(i){if(typeof i!="function")throw new k("Graph.forEachNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)r=e.value,i(r.key,r.attributes)}findNode(i){if(typeof i!="function")throw new k("Graph.findNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)if(r=e.value,i(r.key,r.attributes))return r.key}mapNodes(i){if(typeof i!="function")throw new k("Graph.mapNode: expecting a callback.");const t=this._nodes.values();let e,r;const a=new Array(this.order);let o=0;for(;e=t.next(),e.done!==!0;)r=e.value,a[o++]=i(r.key,r.attributes);return a}someNode(i){if(typeof i!="function")throw new k("Graph.someNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)if(r=e.value,i(r.key,r.attributes))return!0;return!1}everyNode(i){if(typeof i!="function")throw new k("Graph.everyNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)if(r=e.value,!i(r.key,r.attributes))return!1;return!0}filterNodes(i){if(typeof i!="function")throw new k("Graph.filterNodes: expecting a callback.");const t=this._nodes.values();let e,r;const a=[];for(;e=t.next(),e.done!==!0;)r=e.value,i(r.key,r.attributes)&&a.push(r.key);return a}reduceNodes(i,t){if(typeof i!="function")throw new k("Graph.reduceNodes: expecting a callback.");if(arguments.length<2)throw new k("Graph.reduceNodes: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.");let e=t;const r=this._nodes.values();let a,o;for(;a=r.next(),a.done!==!0;)o=a.value,e=i(e,o.key,o.attributes);return e}nodeEntries(){const i=this._nodes.values();return{[Symbol.iterator](){return this},next(){const t=i.next();if(t.done)return t;const e=t.value;return{value:{node:e.key,attributes:e.attributes},done:!1}}}}export(){const i=new Array(this._nodes.size);let t=0;this._nodes.forEach((r,a)=>{i[t++]=rn(a,r)});const e=new Array(this._edges.size);return t=0,this._edges.forEach((r,a)=>{e[t++]=nn(this.type,a,r)}),{options:{type:this.type,multi:this.multi,allowSelfLoops:this.allowSelfLoops},attributes:this.getAttributes(),nodes:i,edges:e}}import(i,t=!1){if(i instanceof j)return i.forEachNode((u,h)=>{t?this.mergeNode(u,h):this.addNode(u,h)}),i.forEachEdge((u,h,d,l,f,c,y)=>{t?y?this.mergeUndirectedEdgeWithKey(u,d,l,h):this.mergeDirectedEdgeWithKey(u,d,l,h):y?this.addUndirectedEdgeWithKey(u,d,l,h):this.addDirectedEdgeWithKey(u,d,l,h)}),this;if(!J(i))throw new k("Graph.import: invalid argument. Expecting a serialized graph or, alternatively, a Graph instance.");if(i.attributes){if(!J(i.attributes))throw new k("Graph.import: invalid attributes. Expecting a plain object.");t?this.mergeAttributes(i.attributes):this.replaceAttributes(i.attributes)}let e,r,a,o,s;if(i.nodes){if(a=i.nodes,!Array.isArray(a))throw new k("Graph.import: invalid nodes. Expecting an array.");for(e=0,r=a.length;e{const a=Z({},e.attributes);e=new t.NodeDataClass(r,a),t._nodes.set(r,e)}),t}copy(i){if(i=i||{},typeof i.type=="string"&&i.type!==this.type&&i.type!=="mixed")throw new I(`Graph.copy: cannot create an incompatible copy from "${this.type}" type to "${i.type}" because this would mean losing information about the current graph.`);if(typeof i.multi=="boolean"&&i.multi!==this.multi&&i.multi!==!0)throw new I("Graph.copy: cannot create an incompatible copy by downgrading a multi graph to a simple one because this would mean losing information about the current graph.");if(typeof i.allowSelfLoops=="boolean"&&i.allowSelfLoops!==this.allowSelfLoops&&i.allowSelfLoops!==!0)throw new I("Graph.copy: cannot create an incompatible copy from a graph allowing self loops to one that does not because this would mean losing information about the current graph.");const t=this.emptyCopy(i),e=this._edges.values();let r,a;for(;r=e.next(),r.done!==!0;)a=r.value,ki(t,"copy",!1,a.undirected,a.key,a.source.key,a.target.key,Z({},a.attributes));return t}toJSON(){return this.export()}toString(){return"[object Graph]"}inspect(){const i={};this._nodes.forEach((a,o)=>{i[o]=a.attributes});const t={},e={};this._edges.forEach((a,o)=>{const s=a.undirected?"--":"->";let u="",h=a.source.key,d=a.target.key,l;a.undirected&&h>d&&(l=h,h=d,d=l);const f=`(${h})${s}(${d})`;o.startsWith("geid_")?this.multi&&(typeof e[f]>"u"?e[f]=0:e[f]++,u+=`${e[f]}. `):u+=`[${o}]: `,u+=f,t[u]=a.attributes});const r={};for(const a in this)this.hasOwnProperty(a)&&!Bt.has(a)&&typeof this[a]!="function"&&typeof a!="symbol"&&(r[a]=this[a]);return r.attributes=this._attributes,r.nodes=i,r.edges=t,ae(r,"constructor",this.constructor),r}}typeof Symbol<"u"&&(j.prototype[Symbol.for("nodejs.util.inspect.custom")]=j.prototype.inspect);hn.forEach(n=>{["add","merge","update"].forEach(i=>{const t=n.name(i),e=i==="add"?ki:cn;n.generateKey?j.prototype[t]=function(r,a,o){return e(this,t,!0,(n.type||this.type)==="undirected",null,r,a,o,i==="update")}:j.prototype[t]=function(r,a,o,s){return e(this,t,!1,(n.type||this.type)==="undirected",r,a,o,s,i==="update")}})});wr(j);Lr(j);qr(j);tn(j);class Di extends j{constructor(i){const t=Z({type:"directed"},i);if("multi"in t&&t.multi!==!1)throw new k("DirectedGraph.from: inconsistent indication that the graph should be multi in given options!");if(t.type!=="directed")throw new k('DirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}class Li extends j{constructor(i){const t=Z({type:"undirected"},i);if("multi"in t&&t.multi!==!1)throw new k("UndirectedGraph.from: inconsistent indication that the graph should be multi in given options!");if(t.type!=="undirected")throw new k('UndirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}class Gi extends j{constructor(i){const t=Z({multi:!0},i);if("multi"in t&&t.multi!==!0)throw new k("MultiGraph.from: inconsistent indication that the graph should be simple in given options!");super(t)}}class Fi extends j{constructor(i){const t=Z({type:"directed",multi:!0},i);if("multi"in t&&t.multi!==!0)throw new k("MultiDirectedGraph.from: inconsistent indication that the graph should be simple in given options!");if(t.type!=="directed")throw new k('MultiDirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}class Ni extends j{constructor(i){const t=Z({type:"undirected",multi:!0},i);if("multi"in t&&t.multi!==!0)throw new k("MultiUndirectedGraph.from: inconsistent indication that the graph should be simple in given options!");if(t.type!=="undirected")throw new k('MultiUndirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}function Fe(n){n.from=function(i,t){const e=Z({},i.options,t),r=new n(e);return r.import(i),r}}Fe(j);Fe(Di);Fe(Li);Fe(Gi);Fe(Fi);Fe(Ni);j.Graph=j;j.DirectedGraph=Di;j.UndirectedGraph=Li;j.MultiGraph=Gi;j.MultiDirectedGraph=Fi;j.MultiUndirectedGraph=Ni;j.InvalidArgumentsGraphError=k;j.NotFoundGraphError=C;j.UsageGraphError=I;var ft,Ht;function Pi(){return Ht||(Ht=1,ft=function(i){return i!==null&&typeof i=="object"&&typeof i.addUndirectedEdgeWithKey=="function"&&typeof i.dropNode=="function"&&typeof i.multi=="boolean"}),ft}var ze={},Wt;function fn(){if(Wt)return ze;Wt=1;function n(e){return typeof e!="number"||isNaN(e)?1:e}function i(e,r){var a={},o=function(h){return typeof h>"u"?r:h};typeof r=="function"&&(o=r);var s=function(h){return o(h[e])},u=function(){return o(void 0)};return typeof e=="string"?(a.fromAttributes=s,a.fromGraph=function(h,d){return s(h.getNodeAttributes(d))},a.fromEntry=function(h,d){return s(d)}):typeof e=="function"?(a.fromAttributes=function(){throw new Error("graphology-utils/getters/createNodeValueGetter: irrelevant usage.")},a.fromGraph=function(h,d){return o(e(d,h.getNodeAttributes(d)))},a.fromEntry=function(h,d){return o(e(h,d))}):(a.fromAttributes=u,a.fromGraph=u,a.fromEntry=u),a}function t(e,r){var a={},o=function(h){return typeof h>"u"?r:h};typeof r=="function"&&(o=r);var s=function(h){return o(h[e])},u=function(){return o(void 0)};return typeof e=="string"?(a.fromAttributes=s,a.fromGraph=function(h,d){return s(h.getEdgeAttributes(d))},a.fromEntry=function(h,d){return s(d)},a.fromPartialEntry=a.fromEntry,a.fromMinimalEntry=a.fromEntry):typeof e=="function"?(a.fromAttributes=function(){throw new Error("graphology-utils/getters/createEdgeValueGetter: irrelevant usage.")},a.fromGraph=function(h,d){var l=h.extremities(d);return o(e(d,h.getEdgeAttributes(d),l[0],l[1],h.getNodeAttributes(l[0]),h.getNodeAttributes(l[1]),h.isUndirected(d)))},a.fromEntry=function(h,d,l,f,c,y,w){return o(e(h,d,l,f,c,y,w))},a.fromPartialEntry=function(h,d,l,f){return o(e(h,d,l,f))},a.fromMinimalEntry=function(h,d){return o(e(h,d))}):(a.fromAttributes=u,a.fromGraph=u,a.fromEntry=u,a.fromMinimalEntry=u),a}return ze.createNodeValueGetter=i,ze.createEdgeValueGetter=t,ze.createEdgeWeightGetter=function(e){return t(e,n)},ze}var gt,jt;function gn(){if(jt)return gt;jt=1;var n=0,i=1,t=2,e=3,r=4,a=5,o=6,s=7,u=8,h=9,d=0,l=1,f=2,c=0,y=1,w=2,T=3,D=4,m=5,S=6,p=7,b=8,R=3,A=10,G=3,F=9,P=10;return gt=function(z,g,K){var te,x,v,$,W,X,ie,Y,N,Ne,re=g.length,tr=K.length,Pe=z.adjustSizes,ir=z.barnesHutTheta*z.barnesHutTheta,qe,q,B,M,fe,U,O,E=[];for(v=0;vYe?(Ee-=(Ke-Ye)/2,Re=Ee+Ke):(we-=(Ye-Ke)/2,Se=we+Ye),E[0+c]=-1,E[0+y]=(we+Se)/2,E[0+w]=(Ee+Re)/2,E[0+T]=Math.max(Se-we,Re-Ee),E[0+D]=-1,E[0+m]=-1,E[0+S]=0,E[0+p]=0,E[0+b]=0,te=1,v=0;v=0){g[v+n]=0)if(U=Math.pow(g[v+n]-E[x+p],2)+Math.pow(g[v+i]-E[x+b],2),Ne=E[x+T],4*Ne*Ne/U0?(O=q*g[v+o]*E[x+S]/U,g[v+t]+=B*O,g[v+e]+=M*O):U<0&&(O=-q*g[v+o]*E[x+S]/Math.sqrt(U),g[v+t]+=B*O,g[v+e]+=M*O):U>0&&(O=q*g[v+o]*E[x+S]/U,g[v+t]+=B*O,g[v+e]+=M*O),x=E[x+D],x<0)break;continue}else{x=E[x+m];continue}else{if(X=E[x+c],X>=0&&X!==v&&(B=g[v+n]-g[X+n],M=g[v+i]-g[X+i],U=B*B+M*M,Pe===!0?U>0?(O=q*g[v+o]*g[X+o]/U,g[v+t]+=B*O,g[v+e]+=M*O):U<0&&(O=-q*g[v+o]*g[X+o]/Math.sqrt(U),g[v+t]+=B*O,g[v+e]+=M*O):U>0&&(O=q*g[v+o]*g[X+o]/U,g[v+t]+=B*O,g[v+e]+=M*O)),x=E[x+D],x<0)break;continue}else for(q=z.scalingRatio,$=0;$0?(O=q*g[$+o]*g[W+o]/U/U,g[$+t]+=B*O,g[$+e]+=M*O,g[W+t]-=B*O,g[W+e]-=M*O):U<0&&(O=100*q*g[$+o]*g[W+o],g[$+t]+=B*O,g[$+e]+=M*O,g[W+t]-=B*O,g[W+e]-=M*O)):(U=Math.sqrt(B*B+M*M),U>0&&(O=q*g[$+o]*g[W+o]/U/U,g[$+t]+=B*O,g[$+e]+=M*O,g[W+t]-=B*O,g[W+e]-=M*O));for(N=z.gravity/z.scalingRatio,q=z.scalingRatio,v=0;v0&&(O=q*g[v+o]*N):U>0&&(O=q*g[v+o]*N/U),g[v+t]-=B*O,g[v+e]-=M*O;for(q=1*(z.outboundAttractionDistribution?qe:1),ie=0;ie0&&(O=-q*fe*Math.log(1+U)/U/g[$+o]):U>0&&(O=-q*fe*Math.log(1+U)/U):z.outboundAttractionDistribution?U>0&&(O=-q*fe/g[$+o]):U>0&&(O=-q*fe)):(U=Math.sqrt(Math.pow(B,2)+Math.pow(M,2)),z.linLogMode?z.outboundAttractionDistribution?U>0&&(O=-q*fe*Math.log(1+U)/U/g[$+o]):U>0&&(O=-q*fe*Math.log(1+U)/U):z.outboundAttractionDistribution?(U=1,O=-q*fe/g[$+o]):(U=1,O=-q*fe)),U>0&&(g[$+t]+=B*O,g[$+e]+=M*O,g[W+t]-=B*O,g[W+e]-=M*O);var Ze,Ie,Xe,_e,Je,Qe;if(Pe===!0)for(v=0;vP&&(g[v+t]=g[v+t]*P/Ze,g[v+e]=g[v+e]*P/Ze),Ie=g[v+o]*Math.sqrt((g[v+r]-g[v+t])*(g[v+r]-g[v+t])+(g[v+a]-g[v+e])*(g[v+a]-g[v+e])),Xe=Math.sqrt((g[v+r]+g[v+t])*(g[v+r]+g[v+t])+(g[v+a]+g[v+e])*(g[v+a]+g[v+e]))/2,_e=.1*Math.log(1+Xe)/(1+Math.sqrt(Ie)),Je=g[v+n]+g[v+t]*(_e/z.slowDown),g[v+n]=Je,Qe=g[v+i]+g[v+e]*(_e/z.slowDown),g[v+i]=Qe);else for(v=0;v=0)?{message:"the `scalingRatio` setting should be a number >= 0."}:"strongGravityMode"in t&&typeof t.strongGravityMode!="boolean"?{message:"the `strongGravityMode` setting should be a boolean."}:"gravity"in t&&!(typeof t.gravity=="number"&&t.gravity>=0)?{message:"the `gravity` setting should be a number >= 0."}:"slowDown"in t&&!(typeof t.slowDown=="number"||t.slowDown>=0)?{message:"the `slowDown` setting should be a number >= 0."}:"barnesHutOptimize"in t&&typeof t.barnesHutOptimize!="boolean"?{message:"the `barnesHutOptimize` setting should be a boolean."}:"barnesHutTheta"in t&&!(typeof t.barnesHutTheta=="number"&&t.barnesHutTheta>=0)?{message:"the `barnesHutTheta` setting should be a number >= 0."}:null},ge.graphToByteArrays=function(t,e){var r=t.order,a=t.size,o={},s,u=new Float32Array(r*n),h=new Float32Array(a*i);return s=0,t.forEachNode(function(d,l){o[d]=s,u[s]=l.x,u[s+1]=l.y,u[s+2]=0,u[s+3]=0,u[s+4]=0,u[s+5]=0,u[s+6]=1,u[s+7]=1,u[s+8]=l.size||1,u[s+9]=l.fixed?1:0,s+=n}),s=0,t.forEachEdge(function(d,l,f,c,y,w,T){var D=o[f],m=o[c],S=e(d,l,f,c,y,w,T);u[D+6]+=S,u[m+6]+=S,h[s]=D,h[s+1]=m,h[s+2]=S,s+=i}),{nodes:u,edges:h}},ge.assignLayoutChanges=function(t,e,r){var a=0;t.updateEachNodeAttributes(function(o,s){return s.x=e[a],s.y=e[a+1],a+=n,r?r(o,s):s})},ge.readGraphPositions=function(t,e){var r=0;t.forEachNode(function(a,o){e[r]=o.x,e[r+1]=o.y,r+=n})},ge.collectLayoutChanges=function(t,e,r){for(var a=t.nodes(),o={},s=0,u=0,h=e.length;s2e3,strongGravityMode:!0,gravity:.05,scalingRatio:10,slowDown:1+Math.log(h)}}var s=a.bind(null,!1);return s.assign=a.bind(null,!0),s.inferSettings=o,vt=s,vt}var yn=mn();const it=bi(yn);function bn(n,i){if(typeof n!="object"||!n)return n;var t=n[Symbol.toPrimitive];if(t!==void 0){var e=t.call(n,i);if(typeof e!="object")return e;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(n)}function je(n){var i=bn(n,"string");return typeof i=="symbol"?i:i+""}function Q(n,i){if(!(n instanceof i))throw new TypeError("Cannot call a class as a function")}function Yt(n,i){for(var t=0;tn.length)&&(i=n.length);for(var t=0,e=Array(i);t0&&(P=R[0]),P instanceof Error)throw P;var V=new Error("Unhandled error."+(P?" ("+P.message+")":""));throw V.context=P,V}var z=F[b];if(z===void 0)return!1;if(typeof z=="function")i(z,this,R);else for(var g=z.length,K=y(z,g),A=0;A0&&P.length>G&&!P.warned){P.warned=!0;var V=new Error("Possible EventEmitter memory leak detected. "+P.length+" "+String(b)+" listeners added. Use emitter.setMaxListeners() to increase limit");V.name="MaxListenersExceededWarning",V.emitter=p,V.type=b,V.count=P.length,e(V)}return p}a.prototype.addListener=function(b,R){return h(this,b,R,!1)},a.prototype.on=a.prototype.addListener,a.prototype.prependListener=function(b,R){return h(this,b,R,!0)};function d(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function l(p,b,R){var A={fired:!1,wrapFn:void 0,target:p,type:b,listener:R},G=d.bind(A);return G.listener=R,A.wrapFn=G,G}a.prototype.once=function(b,R){return s(R),this.on(b,l(this,b,R)),this},a.prototype.prependOnceListener=function(b,R){return s(R),this.prependListener(b,l(this,b,R)),this},a.prototype.removeListener=function(b,R){var A,G,F,P,V;if(s(R),G=this._events,G===void 0)return this;if(A=G[b],A===void 0)return this;if(A===R||A.listener===R)--this._eventsCount===0?this._events=Object.create(null):(delete G[b],G.removeListener&&this.emit("removeListener",b,A.listener||R));else if(typeof A!="function"){for(F=-1,P=A.length-1;P>=0;P--)if(A[P]===R||A[P].listener===R){V=A[P].listener,F=P;break}if(F<0)return this;F===0?A.shift():w(A,F),A.length===1&&(G[b]=A[0]),G.removeListener!==void 0&&this.emit("removeListener",b,V||R)}return this},a.prototype.off=a.prototype.removeListener,a.prototype.removeAllListeners=function(b){var R,A,G;if(A=this._events,A===void 0)return this;if(A.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):A[b]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete A[b]),this;if(arguments.length===0){var F=Object.keys(A),P;for(G=0;G=0;G--)this.removeListener(b,R[G]);return this};function f(p,b,R){var A=p._events;if(A===void 0)return[];var G=A[b];return G===void 0?[]:typeof G=="function"?R?[G.listener||G]:[G]:R?T(G):y(G,G.length)}a.prototype.listeners=function(b){return f(this,b,!0)},a.prototype.rawListeners=function(b){return f(this,b,!1)},a.listenerCount=function(p,b){return typeof p.listenerCount=="function"?p.listenerCount(b):c.call(p,b)},a.prototype.listenerCount=c;function c(p){var b=this._events;if(b!==void 0){var R=b[p];if(typeof R=="function")return 1;if(R!==void 0)return R.length}return 0}a.prototype.eventNames=function(){return this._eventsCount>0?t(this._events):[]};function y(p,b){for(var R=new Array(b),A=0;An++}function me(){const n=arguments;let i=null,t=-1;return{[Symbol.iterator](){return this},next(){let e=null;do{if(i===null){if(t++,t>=n.length)return{done:!0};i=n[t][Symbol.iterator]()}if(e=i.next(),e.done){i=null;continue}break}while(!0);return e}}}function Le(){return{[Symbol.iterator](){return this},next(){return{done:!0}}}}class Lt extends Error{constructor(i){super(),this.name="GraphError",this.message=i}}class k extends Lt{constructor(i){super(i),this.name="InvalidArgumentsGraphError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,k.prototype.constructor)}}class C extends Lt{constructor(i){super(i),this.name="NotFoundGraphError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,C.prototype.constructor)}}class I extends Lt{constructor(i){super(i),this.name="UsageGraphError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,I.prototype.constructor)}}function _i(n,i){this.key=n,this.attributes=i,this.clear()}_i.prototype.clear=function(){this.inDegree=0,this.outDegree=0,this.undirectedDegree=0,this.undirectedLoops=0,this.directedLoops=0,this.in={},this.out={},this.undirected={}};function Ti(n,i){this.key=n,this.attributes=i,this.clear()}Ti.prototype.clear=function(){this.inDegree=0,this.outDegree=0,this.directedLoops=0,this.in={},this.out={}};function Si(n,i){this.key=n,this.attributes=i,this.clear()}Si.prototype.clear=function(){this.undirectedDegree=0,this.undirectedLoops=0,this.undirected={}};function Ge(n,i,t,e,r){this.key=i,this.attributes=r,this.undirected=n,this.source=t,this.target=e}Ge.prototype.attach=function(){let n="out",i="in";this.undirected&&(n=i="undirected");const t=this.source.key,e=this.target.key;this.source[n][e]=this,!(this.undirected&&t===e)&&(this.target[i][t]=this)};Ge.prototype.attachMulti=function(){let n="out",i="in";const t=this.source.key,e=this.target.key;this.undirected&&(n=i="undirected");const r=this.source[n],a=r[e];if(typeof a>"u"){r[e]=this,this.undirected&&t===e||(this.target[i][t]=this);return}a.previous=this,this.next=a,r[e]=this,this.target[i][t]=this};Ge.prototype.detach=function(){const n=this.source.key,i=this.target.key;let t="out",e="in";this.undirected&&(t=e="undirected"),delete this.source[t][i],delete this.target[e][n]};Ge.prototype.detachMulti=function(){const n=this.source.key,i=this.target.key;let t="out",e="in";this.undirected&&(t=e="undirected"),this.previous===void 0?this.next===void 0?(delete this.source[t][i],delete this.target[e][n]):(this.next.previous=void 0,this.source[t][i]=this.next,this.target[e][n]=this.next):(this.previous.next=this.next,this.next!==void 0&&(this.next.previous=this.previous))};const Ri=0,Ai=1,hr=2,xi=3;function ye(n,i,t,e,r,a,o){let s,u,h,d;if(e=""+e,t===Ri){if(s=n._nodes.get(e),!s)throw new C(`Graph.${i}: could not find the "${e}" node in the graph.`);h=r,d=a}else if(t===xi){if(r=""+r,u=n._edges.get(r),!u)throw new C(`Graph.${i}: could not find the "${r}" edge in the graph.`);const l=u.source.key,f=u.target.key;if(e===l)s=u.target;else if(e===f)s=u.source;else throw new C(`Graph.${i}: the "${e}" node is not attached to the "${r}" edge (${l}, ${f}).`);h=a,d=o}else{if(u=n._edges.get(e),!u)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`);t===Ai?s=u.source:s=u.target,h=r,d=a}return[s,h,d]}function dr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);return o.attributes[s]}}function lr(n,i,t){n.prototype[i]=function(e,r){const[a]=ye(this,i,t,e,r);return a.attributes}}function cr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);return o.attributes.hasOwnProperty(s)}}function fr(n,i,t){n.prototype[i]=function(e,r,a,o){const[s,u,h]=ye(this,i,t,e,r,a,o);return s.attributes[u]=h,this.emit("nodeAttributesUpdated",{key:s.key,type:"set",attributes:s.attributes,name:u}),this}}function gr(n,i,t){n.prototype[i]=function(e,r,a,o){const[s,u,h]=ye(this,i,t,e,r,a,o);if(typeof h!="function")throw new k(`Graph.${i}: updater should be a function.`);const d=s.attributes,l=h(d[u]);return d[u]=l,this.emit("nodeAttributesUpdated",{key:s.key,type:"set",attributes:s.attributes,name:u}),this}}function pr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);return delete o.attributes[s],this.emit("nodeAttributesUpdated",{key:o.key,type:"remove",attributes:o.attributes,name:s}),this}}function vr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);if(!J(s))throw new k(`Graph.${i}: provided attributes are not a plain object.`);return o.attributes=s,this.emit("nodeAttributesUpdated",{key:o.key,type:"replace",attributes:o.attributes}),this}}function mr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);if(!J(s))throw new k(`Graph.${i}: provided attributes are not a plain object.`);return Z(o.attributes,s),this.emit("nodeAttributesUpdated",{key:o.key,type:"merge",attributes:o.attributes,data:s}),this}}function yr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);if(typeof s!="function")throw new k(`Graph.${i}: provided updater is not a function.`);return o.attributes=s(o.attributes),this.emit("nodeAttributesUpdated",{key:o.key,type:"update",attributes:o.attributes}),this}}const br=[{name:n=>`get${n}Attribute`,attacher:dr},{name:n=>`get${n}Attributes`,attacher:lr},{name:n=>`has${n}Attribute`,attacher:cr},{name:n=>`set${n}Attribute`,attacher:fr},{name:n=>`update${n}Attribute`,attacher:gr},{name:n=>`remove${n}Attribute`,attacher:pr},{name:n=>`replace${n}Attributes`,attacher:vr},{name:n=>`merge${n}Attributes`,attacher:mr},{name:n=>`update${n}Attributes`,attacher:yr}];function wr(n){br.forEach(function({name:i,attacher:t}){t(n,i("Node"),Ri),t(n,i("Source"),Ai),t(n,i("Target"),hr),t(n,i("Opposite"),xi)})}function Er(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return a.attributes[r]}}function _r(n,i,t){n.prototype[i]=function(e){let r;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>1){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const a=""+e,o=""+arguments[1];if(r=oe(this,a,o,t),!r)throw new C(`Graph.${i}: could not find an edge for the given path ("${a}" - "${o}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,r=this._edges.get(e),!r)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return r.attributes}}function Tr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return a.attributes.hasOwnProperty(r)}}function Sr(n,i,t){n.prototype[i]=function(e,r,a){let o;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>3){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const s=""+e,u=""+r;if(r=arguments[2],a=arguments[3],o=oe(this,s,u,t),!o)throw new C(`Graph.${i}: could not find an edge for the given path ("${s}" - "${u}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,o=this._edges.get(e),!o)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return o.attributes[r]=a,this.emit("edgeAttributesUpdated",{key:o.key,type:"set",attributes:o.attributes,name:r}),this}}function Rr(n,i,t){n.prototype[i]=function(e,r,a){let o;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>3){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const s=""+e,u=""+r;if(r=arguments[2],a=arguments[3],o=oe(this,s,u,t),!o)throw new C(`Graph.${i}: could not find an edge for the given path ("${s}" - "${u}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,o=this._edges.get(e),!o)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(typeof a!="function")throw new k(`Graph.${i}: updater should be a function.`);return o.attributes[r]=a(o.attributes[r]),this.emit("edgeAttributesUpdated",{key:o.key,type:"set",attributes:o.attributes,name:r}),this}}function Ar(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return delete a.attributes[r],this.emit("edgeAttributesUpdated",{key:a.key,type:"remove",attributes:a.attributes,name:r}),this}}function xr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(!J(r))throw new k(`Graph.${i}: provided attributes are not a plain object.`);return a.attributes=r,this.emit("edgeAttributesUpdated",{key:a.key,type:"replace",attributes:a.attributes}),this}}function Cr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(!J(r))throw new k(`Graph.${i}: provided attributes are not a plain object.`);return Z(a.attributes,r),this.emit("edgeAttributesUpdated",{key:a.key,type:"merge",attributes:a.attributes,data:r}),this}}function kr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(typeof r!="function")throw new k(`Graph.${i}: provided updater is not a function.`);return a.attributes=r(a.attributes),this.emit("edgeAttributesUpdated",{key:a.key,type:"update",attributes:a.attributes}),this}}const Dr=[{name:n=>`get${n}Attribute`,attacher:Er},{name:n=>`get${n}Attributes`,attacher:_r},{name:n=>`has${n}Attribute`,attacher:Tr},{name:n=>`set${n}Attribute`,attacher:Sr},{name:n=>`update${n}Attribute`,attacher:Rr},{name:n=>`remove${n}Attribute`,attacher:Ar},{name:n=>`replace${n}Attributes`,attacher:xr},{name:n=>`merge${n}Attributes`,attacher:Cr},{name:n=>`update${n}Attributes`,attacher:kr}];function Lr(n){Dr.forEach(function({name:i,attacher:t}){t(n,i("Edge"),"mixed"),t(n,i("DirectedEdge"),"directed"),t(n,i("UndirectedEdge"),"undirected")})}const Gr=[{name:"edges",type:"mixed"},{name:"inEdges",type:"directed",direction:"in"},{name:"outEdges",type:"directed",direction:"out"},{name:"inboundEdges",type:"mixed",direction:"in"},{name:"outboundEdges",type:"mixed",direction:"out"},{name:"directedEdges",type:"directed"},{name:"undirectedEdges",type:"undirected"}];function Fr(n,i,t,e){let r=!1;for(const a in i){if(a===e)continue;const o=i[a];if(r=t(o.key,o.attributes,o.source.key,o.target.key,o.source.attributes,o.target.attributes,o.undirected),n&&r)return o.key}}function Nr(n,i,t,e){let r,a,o,s=!1;for(const u in i)if(u!==e){r=i[u];do{if(a=r.source,o=r.target,s=t(r.key,r.attributes,a.key,o.key,a.attributes,o.attributes,r.undirected),n&&s)return r.key;r=r.next}while(r!==void 0)}}function lt(n,i){const t=Object.keys(n),e=t.length;let r,a=0;return{[Symbol.iterator](){return this},next(){do if(r)r=r.next;else{if(a>=e)return{done:!0};const o=t[a++];if(o===i){r=void 0;continue}r=n[o]}while(!r);return{done:!1,value:{edge:r.key,attributes:r.attributes,source:r.source.key,target:r.target.key,sourceAttributes:r.source.attributes,targetAttributes:r.target.attributes,undirected:r.undirected}}}}}function Pr(n,i,t,e){const r=i[t];if(!r)return;const a=r.source,o=r.target;if(e(r.key,r.attributes,a.key,o.key,a.attributes,o.attributes,r.undirected)&&n)return r.key}function Ir(n,i,t,e){let r=i[t];if(!r)return;let a=!1;do{if(a=e(r.key,r.attributes,r.source.key,r.target.key,r.source.attributes,r.target.attributes,r.undirected),n&&a)return r.key;r=r.next}while(r!==void 0)}function ct(n,i){let t=n[i];if(t.next!==void 0)return{[Symbol.iterator](){return this},next(){if(!t)return{done:!0};const r={edge:t.key,attributes:t.attributes,source:t.source.key,target:t.target.key,sourceAttributes:t.source.attributes,targetAttributes:t.target.attributes,undirected:t.undirected};return t=t.next,{done:!1,value:r}}};let e=!1;return{[Symbol.iterator](){return this},next(){return e===!0?{done:!0}:(e=!0,{done:!1,value:{edge:t.key,attributes:t.attributes,source:t.source.key,target:t.target.key,sourceAttributes:t.source.attributes,targetAttributes:t.target.attributes,undirected:t.undirected}})}}}function Or(n,i){if(n.size===0)return[];if(i==="mixed"||i===n.type)return Array.from(n._edges.keys());const t=i==="undirected"?n.undirectedSize:n.directedSize,e=new Array(t),r=i==="undirected",a=n._edges.values();let o=0,s,u;for(;s=a.next(),s.done!==!0;)u=s.value,u.undirected===r&&(e[o++]=u.key);return e}function Ci(n,i,t,e){if(i.size===0)return;const r=t!=="mixed"&&t!==i.type,a=t==="undirected";let o,s,u=!1;const h=i._edges.values();for(;o=h.next(),o.done!==!0;){if(s=o.value,r&&s.undirected!==a)continue;const{key:d,attributes:l,source:f,target:c}=s;if(u=e(d,l,f.key,c.key,f.attributes,c.attributes,s.undirected),n&&u)return d}}function Ur(n,i){if(n.size===0)return Le();const t=i!=="mixed"&&i!==n.type,e=i==="undirected",r=n._edges.values();return{[Symbol.iterator](){return this},next(){let a,o;for(;;){if(a=r.next(),a.done)return a;if(o=a.value,!(t&&o.undirected!==e))break}return{value:{edge:o.key,attributes:o.attributes,source:o.source.key,target:o.target.key,sourceAttributes:o.source.attributes,targetAttributes:o.target.attributes,undirected:o.undirected},done:!1}}}}function Gt(n,i,t,e,r,a){const o=i?Nr:Fr;let s;if(t!=="undirected"&&(e!=="out"&&(s=o(n,r.in,a),n&&s)||e!=="in"&&(s=o(n,r.out,a,e?void 0:r.key),n&&s))||t!=="directed"&&(s=o(n,r.undirected,a),n&&s))return s}function zr(n,i,t,e){const r=[];return Gt(!1,n,i,t,e,function(a){r.push(a)}),r}function $r(n,i,t){let e=Le();return n!=="undirected"&&(i!=="out"&&typeof t.in<"u"&&(e=me(e,lt(t.in))),i!=="in"&&typeof t.out<"u"&&(e=me(e,lt(t.out,i?void 0:t.key)))),n!=="directed"&&typeof t.undirected<"u"&&(e=me(e,lt(t.undirected))),e}function Ft(n,i,t,e,r,a,o){const s=t?Ir:Pr;let u;if(i!=="undirected"&&(typeof r.in<"u"&&e!=="out"&&(u=s(n,r.in,a,o),n&&u)||typeof r.out<"u"&&e!=="in"&&(e||r.key!==a)&&(u=s(n,r.out,a,o),n&&u))||i!=="directed"&&typeof r.undirected<"u"&&(u=s(n,r.undirected,a,o),n&&u))return u}function Br(n,i,t,e,r){const a=[];return Ft(!1,n,i,t,e,r,function(o){a.push(o)}),a}function Mr(n,i,t,e){let r=Le();return n!=="undirected"&&(typeof t.in<"u"&&i!=="out"&&e in t.in&&(r=me(r,ct(t.in,e))),typeof t.out<"u"&&i!=="in"&&e in t.out&&(i||t.key!==e)&&(r=me(r,ct(t.out,e)))),n!=="directed"&&typeof t.undirected<"u"&&e in t.undirected&&(r=me(r,ct(t.undirected,e))),r}function Hr(n,i){const{name:t,type:e,direction:r}=i;n.prototype[t]=function(a,o){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return[];if(!arguments.length)return Or(this,e);if(arguments.length===1){a=""+a;const s=this._nodes.get(a);if(typeof s>"u")throw new C(`Graph.${t}: could not find the "${a}" node in the graph.`);return zr(this.multi,e==="mixed"?this.type:e,r,s)}if(arguments.length===2){a=""+a,o=""+o;const s=this._nodes.get(a);if(!s)throw new C(`Graph.${t}: could not find the "${a}" source node in the graph.`);if(!this._nodes.has(o))throw new C(`Graph.${t}: could not find the "${o}" target node in the graph.`);return Br(e,this.multi,r,s,o)}throw new k(`Graph.${t}: too many arguments (expecting 0, 1 or 2 and got ${arguments.length}).`)}}function Wr(n,i){const{name:t,type:e,direction:r}=i,a="forEach"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[a]=function(h,d,l){if(!(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)){if(arguments.length===1)return l=h,Ci(!1,this,e,l);if(arguments.length===2){h=""+h,l=d;const f=this._nodes.get(h);if(typeof f>"u")throw new C(`Graph.${a}: could not find the "${h}" node in the graph.`);return Gt(!1,this.multi,e==="mixed"?this.type:e,r,f,l)}if(arguments.length===3){h=""+h,d=""+d;const f=this._nodes.get(h);if(!f)throw new C(`Graph.${a}: could not find the "${h}" source node in the graph.`);if(!this._nodes.has(d))throw new C(`Graph.${a}: could not find the "${d}" target node in the graph.`);return Ft(!1,e,this.multi,r,f,d,l)}throw new k(`Graph.${a}: too many arguments (expecting 1, 2 or 3 and got ${arguments.length}).`)}};const o="map"+t[0].toUpperCase()+t.slice(1);n.prototype[o]=function(){const h=Array.prototype.slice.call(arguments),d=h.pop();let l;if(h.length===0){let f=0;e!=="directed"&&(f+=this.undirectedSize),e!=="undirected"&&(f+=this.directedSize),l=new Array(f);let c=0;h.push((y,w,T,D,m,S,p)=>{l[c++]=d(y,w,T,D,m,S,p)})}else l=[],h.push((f,c,y,w,T,D,m)=>{l.push(d(f,c,y,w,T,D,m))});return this[a].apply(this,h),l};const s="filter"+t[0].toUpperCase()+t.slice(1);n.prototype[s]=function(){const h=Array.prototype.slice.call(arguments),d=h.pop(),l=[];return h.push((f,c,y,w,T,D,m)=>{d(f,c,y,w,T,D,m)&&l.push(f)}),this[a].apply(this,h),l};const u="reduce"+t[0].toUpperCase()+t.slice(1);n.prototype[u]=function(){let h=Array.prototype.slice.call(arguments);if(h.length<2||h.length>4)throw new k(`Graph.${u}: invalid number of arguments (expecting 2, 3 or 4 and got ${h.length}).`);if(typeof h[h.length-1]=="function"&&typeof h[h.length-2]!="function")throw new k(`Graph.${u}: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.`);let d,l;h.length===2?(d=h[0],l=h[1],h=[]):h.length===3?(d=h[1],l=h[2],h=[h[0]]):h.length===4&&(d=h[2],l=h[3],h=[h[0],h[1]]);let f=l;return h.push((c,y,w,T,D,m,S)=>{f=d(f,c,y,w,T,D,m,S)}),this[a].apply(this,h),f}}function jr(n,i){const{name:t,type:e,direction:r}=i,a="find"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[a]=function(u,h,d){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return!1;if(arguments.length===1)return d=u,Ci(!0,this,e,d);if(arguments.length===2){u=""+u,d=h;const l=this._nodes.get(u);if(typeof l>"u")throw new C(`Graph.${a}: could not find the "${u}" node in the graph.`);return Gt(!0,this.multi,e==="mixed"?this.type:e,r,l,d)}if(arguments.length===3){u=""+u,h=""+h;const l=this._nodes.get(u);if(!l)throw new C(`Graph.${a}: could not find the "${u}" source node in the graph.`);if(!this._nodes.has(h))throw new C(`Graph.${a}: could not find the "${h}" target node in the graph.`);return Ft(!0,e,this.multi,r,l,h,d)}throw new k(`Graph.${a}: too many arguments (expecting 1, 2 or 3 and got ${arguments.length}).`)};const o="some"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[o]=function(){const u=Array.prototype.slice.call(arguments),h=u.pop();return u.push((l,f,c,y,w,T,D)=>h(l,f,c,y,w,T,D)),!!this[a].apply(this,u)};const s="every"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[s]=function(){const u=Array.prototype.slice.call(arguments),h=u.pop();return u.push((l,f,c,y,w,T,D)=>!h(l,f,c,y,w,T,D)),!this[a].apply(this,u)}}function Vr(n,i){const{name:t,type:e,direction:r}=i,a=t.slice(0,-1)+"Entries";n.prototype[a]=function(o,s){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return Le();if(!arguments.length)return Ur(this,e);if(arguments.length===1){o=""+o;const u=this._nodes.get(o);if(!u)throw new C(`Graph.${a}: could not find the "${o}" node in the graph.`);return $r(e,r,u)}if(arguments.length===2){o=""+o,s=""+s;const u=this._nodes.get(o);if(!u)throw new C(`Graph.${a}: could not find the "${o}" source node in the graph.`);if(!this._nodes.has(s))throw new C(`Graph.${a}: could not find the "${s}" target node in the graph.`);return Mr(e,r,u,s)}throw new k(`Graph.${a}: too many arguments (expecting 0, 1 or 2 and got ${arguments.length}).`)}}function qr(n){Gr.forEach(i=>{Hr(n,i),Wr(n,i),jr(n,i),Vr(n,i)})}const Kr=[{name:"neighbors",type:"mixed"},{name:"inNeighbors",type:"directed",direction:"in"},{name:"outNeighbors",type:"directed",direction:"out"},{name:"inboundNeighbors",type:"mixed",direction:"in"},{name:"outboundNeighbors",type:"mixed",direction:"out"},{name:"directedNeighbors",type:"directed"},{name:"undirectedNeighbors",type:"undirected"}];function ut(){this.A=null,this.B=null}ut.prototype.wrap=function(n){this.A===null?this.A=n:this.B===null&&(this.B=n)};ut.prototype.has=function(n){return this.A!==null&&n in this.A||this.B!==null&&n in this.B};function Oe(n,i,t,e,r){for(const a in e){const o=e[a],s=o.source,u=o.target,h=s===t?u:s;if(i&&i.has(h.key))continue;const d=r(h.key,h.attributes);if(n&&d)return h.key}}function Nt(n,i,t,e,r){if(i!=="mixed"){if(i==="undirected")return Oe(n,null,e,e.undirected,r);if(typeof t=="string")return Oe(n,null,e,e[t],r)}const a=new ut;let o;if(i!=="undirected"){if(t!=="out"){if(o=Oe(n,null,e,e.in,r),n&&o)return o;a.wrap(e.in)}if(t!=="in"){if(o=Oe(n,a,e,e.out,r),n&&o)return o;a.wrap(e.out)}}if(i!=="directed"&&(o=Oe(n,a,e,e.undirected,r),n&&o))return o}function Yr(n,i,t){if(n!=="mixed"){if(n==="undirected")return Object.keys(t.undirected);if(typeof i=="string")return Object.keys(t[i])}const e=[];return Nt(!1,n,i,t,function(r){e.push(r)}),e}function Ue(n,i,t){const e=Object.keys(t),r=e.length;let a=0;return{[Symbol.iterator](){return this},next(){let o=null;do{if(a>=r)return n&&n.wrap(t),{done:!0};const s=t[e[a++]],u=s.source,h=s.target;if(o=u===i?h:u,n&&n.has(o.key)){o=null;continue}}while(o===null);return{done:!1,value:{neighbor:o.key,attributes:o.attributes}}}}}function Zr(n,i,t){if(n!=="mixed"){if(n==="undirected")return Ue(null,t,t.undirected);if(typeof i=="string")return Ue(null,t,t[i])}let e=Le();const r=new ut;return n!=="undirected"&&(i!=="out"&&(e=me(e,Ue(r,t,t.in))),i!=="in"&&(e=me(e,Ue(r,t,t.out)))),n!=="directed"&&(e=me(e,Ue(r,t,t.undirected))),e}function Xr(n,i){const{name:t,type:e,direction:r}=i;n.prototype[t]=function(a){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return[];a=""+a;const o=this._nodes.get(a);if(typeof o>"u")throw new C(`Graph.${t}: could not find the "${a}" node in the graph.`);return Yr(e==="mixed"?this.type:e,r,o)}}function Jr(n,i){const{name:t,type:e,direction:r}=i,a="forEach"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[a]=function(h,d){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return;h=""+h;const l=this._nodes.get(h);if(typeof l>"u")throw new C(`Graph.${a}: could not find the "${h}" node in the graph.`);Nt(!1,e==="mixed"?this.type:e,r,l,d)};const o="map"+t[0].toUpperCase()+t.slice(1);n.prototype[o]=function(h,d){const l=[];return this[a](h,(f,c)=>{l.push(d(f,c))}),l};const s="filter"+t[0].toUpperCase()+t.slice(1);n.prototype[s]=function(h,d){const l=[];return this[a](h,(f,c)=>{d(f,c)&&l.push(f)}),l};const u="reduce"+t[0].toUpperCase()+t.slice(1);n.prototype[u]=function(h,d,l){if(arguments.length<3)throw new k(`Graph.${u}: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.`);let f=l;return this[a](h,(c,y)=>{f=d(f,c,y)}),f}}function Qr(n,i){const{name:t,type:e,direction:r}=i,a=t[0].toUpperCase()+t.slice(1,-1),o="find"+a;n.prototype[o]=function(h,d){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return;h=""+h;const l=this._nodes.get(h);if(typeof l>"u")throw new C(`Graph.${o}: could not find the "${h}" node in the graph.`);return Nt(!0,e==="mixed"?this.type:e,r,l,d)};const s="some"+a;n.prototype[s]=function(h,d){return!!this[o](h,d)};const u="every"+a;n.prototype[u]=function(h,d){return!this[o](h,(f,c)=>!d(f,c))}}function en(n,i){const{name:t,type:e,direction:r}=i,a=t.slice(0,-1)+"Entries";n.prototype[a]=function(o){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return Le();o=""+o;const s=this._nodes.get(o);if(typeof s>"u")throw new C(`Graph.${a}: could not find the "${o}" node in the graph.`);return Zr(e==="mixed"?this.type:e,r,s)}}function tn(n){Kr.forEach(i=>{Xr(n,i),Jr(n,i),Qr(n,i),en(n,i)})}function tt(n,i,t,e,r){const a=e._nodes.values(),o=e.type;let s,u,h,d,l,f;for(;s=a.next(),s.done!==!0;){let c=!1;if(u=s.value,o!=="undirected"){d=u.out;for(h in d){l=d[h];do f=l.target,c=!0,r(u.key,f.key,u.attributes,f.attributes,l.key,l.attributes,l.undirected),l=l.next;while(l)}}if(o!=="directed"){d=u.undirected;for(h in d)if(!(i&&u.key>h)){l=d[h];do f=l.target,f.key!==h&&(f=l.source),c=!0,r(u.key,f.key,u.attributes,f.attributes,l.key,l.attributes,l.undirected),l=l.next;while(l)}}t&&!c&&r(u.key,null,u.attributes,null,null,null,null)}}function rn(n,i){const t={key:n};return Ei(i.attributes)||(t.attributes=Z({},i.attributes)),t}function nn(n,i,t){const e={key:i,source:t.source.key,target:t.target.key};return Ei(t.attributes)||(e.attributes=Z({},t.attributes)),n==="mixed"&&t.undirected&&(e.undirected=!0),e}function an(n){if(!J(n))throw new k('Graph.import: invalid serialized node. A serialized node should be a plain object with at least a "key" property.');if(!("key"in n))throw new k("Graph.import: serialized node is missing its key.");if("attributes"in n&&(!J(n.attributes)||n.attributes===null))throw new k("Graph.import: invalid attributes. Attributes should be a plain object, null or omitted.")}function on(n){if(!J(n))throw new k('Graph.import: invalid serialized edge. A serialized edge should be a plain object with at least a "source" & "target" property.');if(!("source"in n))throw new k("Graph.import: serialized edge is missing its source.");if(!("target"in n))throw new k("Graph.import: serialized edge is missing its target.");if("attributes"in n&&(!J(n.attributes)||n.attributes===null))throw new k("Graph.import: invalid attributes. Attributes should be a plain object, null or omitted.");if("undirected"in n&&typeof n.undirected!="boolean")throw new k("Graph.import: invalid undirectedness information. Undirected should be boolean or omitted.")}const sn=ur(),un=new Set(["directed","undirected","mixed"]),Bt=new Set(["domain","_events","_eventsCount","_maxListeners"]),hn=[{name:n=>`${n}Edge`,generateKey:!0},{name:n=>`${n}DirectedEdge`,generateKey:!0,type:"directed"},{name:n=>`${n}UndirectedEdge`,generateKey:!0,type:"undirected"},{name:n=>`${n}EdgeWithKey`},{name:n=>`${n}DirectedEdgeWithKey`,type:"directed"},{name:n=>`${n}UndirectedEdgeWithKey`,type:"undirected"}],dn={allowSelfLoops:!0,multi:!1,type:"mixed"};function ln(n,i,t){if(t&&!J(t))throw new k(`Graph.addNode: invalid attributes. Expecting an object but got "${t}"`);if(i=""+i,t=t||{},n._nodes.has(i))throw new I(`Graph.addNode: the "${i}" node already exist in the graph.`);const e=new n.NodeDataClass(i,t);return n._nodes.set(i,e),n.emit("nodeAdded",{key:i,attributes:t}),e}function Mt(n,i,t){const e=new n.NodeDataClass(i,t);return n._nodes.set(i,e),n.emit("nodeAdded",{key:i,attributes:t}),e}function ki(n,i,t,e,r,a,o,s){if(!e&&n.type==="undirected")throw new I(`Graph.${i}: you cannot add a directed edge to an undirected graph. Use the #.addEdge or #.addUndirectedEdge instead.`);if(e&&n.type==="directed")throw new I(`Graph.${i}: you cannot add an undirected edge to a directed graph. Use the #.addEdge or #.addDirectedEdge instead.`);if(s&&!J(s))throw new k(`Graph.${i}: invalid attributes. Expecting an object but got "${s}"`);if(a=""+a,o=""+o,s=s||{},!n.allowSelfLoops&&a===o)throw new I(`Graph.${i}: source & target are the same ("${a}"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.`);const u=n._nodes.get(a),h=n._nodes.get(o);if(!u)throw new C(`Graph.${i}: source node "${a}" not found.`);if(!h)throw new C(`Graph.${i}: target node "${o}" not found.`);const d={key:null,undirected:e,source:a,target:o,attributes:s};if(t)r=n._edgeKeyGenerator();else if(r=""+r,n._edges.has(r))throw new I(`Graph.${i}: the "${r}" edge already exists in the graph.`);if(!n.multi&&(e?typeof u.undirected[o]<"u":typeof u.out[o]<"u"))throw new I(`Graph.${i}: an edge linking "${a}" to "${o}" already exists. If you really want to add multiple edges linking those nodes, you should create a multi graph by using the 'multi' option.`);const l=new Ge(e,r,u,h,s);n._edges.set(r,l);const f=a===o;return e?(u.undirectedDegree++,h.undirectedDegree++,f&&(u.undirectedLoops++,n._undirectedSelfLoopCount++)):(u.outDegree++,h.inDegree++,f&&(u.directedLoops++,n._directedSelfLoopCount++)),n.multi?l.attachMulti():l.attach(),e?n._undirectedSize++:n._directedSize++,d.key=r,n.emit("edgeAdded",d),r}function cn(n,i,t,e,r,a,o,s,u){if(!e&&n.type==="undirected")throw new I(`Graph.${i}: you cannot merge/update a directed edge to an undirected graph. Use the #.mergeEdge/#.updateEdge or #.addUndirectedEdge instead.`);if(e&&n.type==="directed")throw new I(`Graph.${i}: you cannot merge/update an undirected edge to a directed graph. Use the #.mergeEdge/#.updateEdge or #.addDirectedEdge instead.`);if(s){if(u){if(typeof s!="function")throw new k(`Graph.${i}: invalid updater function. Expecting a function but got "${s}"`)}else if(!J(s))throw new k(`Graph.${i}: invalid attributes. Expecting an object but got "${s}"`)}a=""+a,o=""+o;let h;if(u&&(h=s,s=void 0),!n.allowSelfLoops&&a===o)throw new I(`Graph.${i}: source & target are the same ("${a}"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.`);let d=n._nodes.get(a),l=n._nodes.get(o),f,c;if(!t&&(f=n._edges.get(r),f)){if((f.source.key!==a||f.target.key!==o)&&(!e||f.source.key!==o||f.target.key!==a))throw new I(`Graph.${i}: inconsistency detected when attempting to merge the "${r}" edge with "${a}" source & "${o}" target vs. ("${f.source.key}", "${f.target.key}").`);c=f}if(!c&&!n.multi&&d&&(c=e?d.undirected[o]:d.out[o]),c){const m=[c.key,!1,!1,!1];if(u?!h:!s)return m;if(u){const S=c.attributes;c.attributes=h(S),n.emit("edgeAttributesUpdated",{type:"replace",key:c.key,attributes:c.attributes})}else Z(c.attributes,s),n.emit("edgeAttributesUpdated",{type:"merge",key:c.key,attributes:c.attributes,data:s});return m}s=s||{},u&&h&&(s=h(s));const y={key:null,undirected:e,source:a,target:o,attributes:s};if(t)r=n._edgeKeyGenerator();else if(r=""+r,n._edges.has(r))throw new I(`Graph.${i}: the "${r}" edge already exists in the graph.`);let w=!1,T=!1;d||(d=Mt(n,a,{}),w=!0,a===o&&(l=d,T=!0)),l||(l=Mt(n,o,{}),T=!0),f=new Ge(e,r,d,l,s),n._edges.set(r,f);const D=a===o;return e?(d.undirectedDegree++,l.undirectedDegree++,D&&(d.undirectedLoops++,n._undirectedSelfLoopCount++)):(d.outDegree++,l.inDegree++,D&&(d.directedLoops++,n._directedSelfLoopCount++)),n.multi?f.attachMulti():f.attach(),e?n._undirectedSize++:n._directedSize++,y.key=r,n.emit("edgeAdded",y),[r,!0,w,T]}function xe(n,i){n._edges.delete(i.key);const{source:t,target:e,attributes:r}=i,a=i.undirected,o=t===e;a?(t.undirectedDegree--,e.undirectedDegree--,o&&(t.undirectedLoops--,n._undirectedSelfLoopCount--)):(t.outDegree--,e.inDegree--,o&&(t.directedLoops--,n._directedSelfLoopCount--)),n.multi?i.detachMulti():i.detach(),a?n._undirectedSize--:n._directedSize--,n.emit("edgeDropped",{key:i.key,attributes:r,source:t.key,target:e.key,undirected:a})}class j extends wi.EventEmitter{constructor(i){if(super(),i=Z({},dn,i),typeof i.multi!="boolean")throw new k(`Graph.constructor: invalid 'multi' option. Expecting a boolean but got "${i.multi}".`);if(!un.has(i.type))throw new k(`Graph.constructor: invalid 'type' option. Should be one of "mixed", "directed" or "undirected" but got "${i.type}".`);if(typeof i.allowSelfLoops!="boolean")throw new k(`Graph.constructor: invalid 'allowSelfLoops' option. Expecting a boolean but got "${i.allowSelfLoops}".`);const t=i.type==="mixed"?_i:i.type==="directed"?Ti:Si;ae(this,"NodeDataClass",t);const e="geid_"+sn()+"_";let r=0;const a=()=>{let o;do o=e+r++;while(this._edges.has(o));return o};ae(this,"_attributes",{}),ae(this,"_nodes",new Map),ae(this,"_edges",new Map),ae(this,"_directedSize",0),ae(this,"_undirectedSize",0),ae(this,"_directedSelfLoopCount",0),ae(this,"_undirectedSelfLoopCount",0),ae(this,"_edgeKeyGenerator",a),ae(this,"_options",i),Bt.forEach(o=>ae(this,o,this[o])),he(this,"order",()=>this._nodes.size),he(this,"size",()=>this._edges.size),he(this,"directedSize",()=>this._directedSize),he(this,"undirectedSize",()=>this._undirectedSize),he(this,"selfLoopCount",()=>this._directedSelfLoopCount+this._undirectedSelfLoopCount),he(this,"directedSelfLoopCount",()=>this._directedSelfLoopCount),he(this,"undirectedSelfLoopCount",()=>this._undirectedSelfLoopCount),he(this,"multi",this._options.multi),he(this,"type",this._options.type),he(this,"allowSelfLoops",this._options.allowSelfLoops),he(this,"implementation",()=>"graphology")}_resetInstanceCounters(){this._directedSize=0,this._undirectedSize=0,this._directedSelfLoopCount=0,this._undirectedSelfLoopCount=0}hasNode(i){return this._nodes.has(""+i)}hasDirectedEdge(i,t){if(this.type==="undirected")return!1;if(arguments.length===1){const e=""+i,r=this._edges.get(e);return!!r&&!r.undirected}else if(arguments.length===2){i=""+i,t=""+t;const e=this._nodes.get(i);return e?e.out.hasOwnProperty(t):!1}throw new k(`Graph.hasDirectedEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`)}hasUndirectedEdge(i,t){if(this.type==="directed")return!1;if(arguments.length===1){const e=""+i,r=this._edges.get(e);return!!r&&r.undirected}else if(arguments.length===2){i=""+i,t=""+t;const e=this._nodes.get(i);return e?e.undirected.hasOwnProperty(t):!1}throw new k(`Graph.hasDirectedEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`)}hasEdge(i,t){if(arguments.length===1){const e=""+i;return this._edges.has(e)}else if(arguments.length===2){i=""+i,t=""+t;const e=this._nodes.get(i);return e?typeof e.out<"u"&&e.out.hasOwnProperty(t)||typeof e.undirected<"u"&&e.undirected.hasOwnProperty(t):!1}throw new k(`Graph.hasEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`)}directedEdge(i,t){if(this.type==="undirected")return;if(i=""+i,t=""+t,this.multi)throw new I("Graph.directedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.directedEdges instead.");const e=this._nodes.get(i);if(!e)throw new C(`Graph.directedEdge: could not find the "${i}" source node in the graph.`);if(!this._nodes.has(t))throw new C(`Graph.directedEdge: could not find the "${t}" target node in the graph.`);const r=e.out&&e.out[t]||void 0;if(r)return r.key}undirectedEdge(i,t){if(this.type==="directed")return;if(i=""+i,t=""+t,this.multi)throw new I("Graph.undirectedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.undirectedEdges instead.");const e=this._nodes.get(i);if(!e)throw new C(`Graph.undirectedEdge: could not find the "${i}" source node in the graph.`);if(!this._nodes.has(t))throw new C(`Graph.undirectedEdge: could not find the "${t}" target node in the graph.`);const r=e.undirected&&e.undirected[t]||void 0;if(r)return r.key}edge(i,t){if(this.multi)throw new I("Graph.edge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.edges instead.");i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.edge: could not find the "${i}" source node in the graph.`);if(!this._nodes.has(t))throw new C(`Graph.edge: could not find the "${t}" target node in the graph.`);const r=e.out&&e.out[t]||e.undirected&&e.undirected[t]||void 0;if(r)return r.key}areDirectedNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areDirectedNeighbors: could not find the "${i}" node in the graph.`);return this.type==="undirected"?!1:t in e.in||t in e.out}areOutNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areOutNeighbors: could not find the "${i}" node in the graph.`);return this.type==="undirected"?!1:t in e.out}areInNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areInNeighbors: could not find the "${i}" node in the graph.`);return this.type==="undirected"?!1:t in e.in}areUndirectedNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areUndirectedNeighbors: could not find the "${i}" node in the graph.`);return this.type==="directed"?!1:t in e.undirected}areNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areNeighbors: could not find the "${i}" node in the graph.`);return this.type!=="undirected"&&(t in e.in||t in e.out)||this.type!=="directed"&&t in e.undirected}areInboundNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areInboundNeighbors: could not find the "${i}" node in the graph.`);return this.type!=="undirected"&&t in e.in||this.type!=="directed"&&t in e.undirected}areOutboundNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areOutboundNeighbors: could not find the "${i}" node in the graph.`);return this.type!=="undirected"&&t in e.out||this.type!=="directed"&&t in e.undirected}inDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.inDegree: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree}outDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.outDegree: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.outDegree}directedDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.directedDegree: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree+t.outDegree}undirectedDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.undirectedDegree: could not find the "${i}" node in the graph.`);return this.type==="directed"?0:t.undirectedDegree}inboundDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.inboundDegree: could not find the "${i}" node in the graph.`);let e=0;return this.type!=="directed"&&(e+=t.undirectedDegree),this.type!=="undirected"&&(e+=t.inDegree),e}outboundDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.outboundDegree: could not find the "${i}" node in the graph.`);let e=0;return this.type!=="directed"&&(e+=t.undirectedDegree),this.type!=="undirected"&&(e+=t.outDegree),e}degree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.degree: could not find the "${i}" node in the graph.`);let e=0;return this.type!=="directed"&&(e+=t.undirectedDegree),this.type!=="undirected"&&(e+=t.inDegree+t.outDegree),e}inDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.inDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree-t.directedLoops}outDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.outDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.outDegree-t.directedLoops}directedDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.directedDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree+t.outDegree-t.directedLoops*2}undirectedDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.undirectedDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="directed"?0:t.undirectedDegree-t.undirectedLoops*2}inboundDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.inboundDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);let e=0,r=0;return this.type!=="directed"&&(e+=t.undirectedDegree,r+=t.undirectedLoops*2),this.type!=="undirected"&&(e+=t.inDegree,r+=t.directedLoops),e-r}outboundDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.outboundDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);let e=0,r=0;return this.type!=="directed"&&(e+=t.undirectedDegree,r+=t.undirectedLoops*2),this.type!=="undirected"&&(e+=t.outDegree,r+=t.directedLoops),e-r}degreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.degreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);let e=0,r=0;return this.type!=="directed"&&(e+=t.undirectedDegree,r+=t.undirectedLoops*2),this.type!=="undirected"&&(e+=t.inDegree+t.outDegree,r+=t.directedLoops*2),e-r}source(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.source: could not find the "${i}" edge in the graph.`);return t.source.key}target(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.target: could not find the "${i}" edge in the graph.`);return t.target.key}extremities(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.extremities: could not find the "${i}" edge in the graph.`);return[t.source.key,t.target.key]}opposite(i,t){i=""+i,t=""+t;const e=this._edges.get(t);if(!e)throw new C(`Graph.opposite: could not find the "${t}" edge in the graph.`);const r=e.source.key,a=e.target.key;if(i===r)return a;if(i===a)return r;throw new C(`Graph.opposite: the "${i}" node is not attached to the "${t}" edge (${r}, ${a}).`)}hasExtremity(i,t){i=""+i,t=""+t;const e=this._edges.get(i);if(!e)throw new C(`Graph.hasExtremity: could not find the "${i}" edge in the graph.`);return e.source.key===t||e.target.key===t}isUndirected(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.isUndirected: could not find the "${i}" edge in the graph.`);return t.undirected}isDirected(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.isDirected: could not find the "${i}" edge in the graph.`);return!t.undirected}isSelfLoop(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.isSelfLoop: could not find the "${i}" edge in the graph.`);return t.source===t.target}addNode(i,t){return ln(this,i,t).key}mergeNode(i,t){if(t&&!J(t))throw new k(`Graph.mergeNode: invalid attributes. Expecting an object but got "${t}"`);i=""+i,t=t||{};let e=this._nodes.get(i);return e?(t&&(Z(e.attributes,t),this.emit("nodeAttributesUpdated",{type:"merge",key:i,attributes:e.attributes,data:t})),[i,!1]):(e=new this.NodeDataClass(i,t),this._nodes.set(i,e),this.emit("nodeAdded",{key:i,attributes:t}),[i,!0])}updateNode(i,t){if(t&&typeof t!="function")throw new k(`Graph.updateNode: invalid updater function. Expecting a function but got "${t}"`);i=""+i;let e=this._nodes.get(i);if(e){if(t){const a=e.attributes;e.attributes=t(a),this.emit("nodeAttributesUpdated",{type:"replace",key:i,attributes:e.attributes})}return[i,!1]}const r=t?t({}):{};return e=new this.NodeDataClass(i,r),this._nodes.set(i,e),this.emit("nodeAdded",{key:i,attributes:r}),[i,!0]}dropNode(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.dropNode: could not find the "${i}" node in the graph.`);let e;if(this.type!=="undirected"){for(const r in t.out){e=t.out[r];do xe(this,e),e=e.next;while(e)}for(const r in t.in){e=t.in[r];do xe(this,e),e=e.next;while(e)}}if(this.type!=="directed")for(const r in t.undirected){e=t.undirected[r];do xe(this,e),e=e.next;while(e)}this._nodes.delete(i),this.emit("nodeDropped",{key:i,attributes:t.attributes})}dropEdge(i){let t;if(arguments.length>1){const e=""+arguments[0],r=""+arguments[1];if(t=oe(this,e,r,this.type),!t)throw new C(`Graph.dropEdge: could not find the "${e}" -> "${r}" edge in the graph.`)}else if(i=""+i,t=this._edges.get(i),!t)throw new C(`Graph.dropEdge: could not find the "${i}" edge in the graph.`);return xe(this,t),this}dropDirectedEdge(i,t){if(arguments.length<2)throw new I("Graph.dropDirectedEdge: it does not make sense to try and drop a directed edge by key. What if the edge with this key is undirected? Use #.dropEdge for this purpose instead.");if(this.multi)throw new I("Graph.dropDirectedEdge: cannot use a {source,target} combo when dropping an edge in a MultiGraph since we cannot infer the one you want to delete as there could be multiple ones.");i=""+i,t=""+t;const e=oe(this,i,t,"directed");if(!e)throw new C(`Graph.dropDirectedEdge: could not find a "${i}" -> "${t}" edge in the graph.`);return xe(this,e),this}dropUndirectedEdge(i,t){if(arguments.length<2)throw new I("Graph.dropUndirectedEdge: it does not make sense to drop a directed edge by key. What if the edge with this key is undirected? Use #.dropEdge for this purpose instead.");if(this.multi)throw new I("Graph.dropUndirectedEdge: cannot use a {source,target} combo when dropping an edge in a MultiGraph since we cannot infer the one you want to delete as there could be multiple ones.");const e=oe(this,i,t,"undirected");if(!e)throw new C(`Graph.dropUndirectedEdge: could not find a "${i}" -> "${t}" edge in the graph.`);return xe(this,e),this}clear(){this._edges.clear(),this._nodes.clear(),this._resetInstanceCounters(),this.emit("cleared")}clearEdges(){const i=this._nodes.values();let t;for(;t=i.next(),t.done!==!0;)t.value.clear();this._edges.clear(),this._resetInstanceCounters(),this.emit("edgesCleared")}getAttribute(i){return this._attributes[i]}getAttributes(){return this._attributes}hasAttribute(i){return this._attributes.hasOwnProperty(i)}setAttribute(i,t){return this._attributes[i]=t,this.emit("attributesUpdated",{type:"set",attributes:this._attributes,name:i}),this}updateAttribute(i,t){if(typeof t!="function")throw new k("Graph.updateAttribute: updater should be a function.");const e=this._attributes[i];return this._attributes[i]=t(e),this.emit("attributesUpdated",{type:"set",attributes:this._attributes,name:i}),this}removeAttribute(i){return delete this._attributes[i],this.emit("attributesUpdated",{type:"remove",attributes:this._attributes,name:i}),this}replaceAttributes(i){if(!J(i))throw new k("Graph.replaceAttributes: provided attributes are not a plain object.");return this._attributes=i,this.emit("attributesUpdated",{type:"replace",attributes:this._attributes}),this}mergeAttributes(i){if(!J(i))throw new k("Graph.mergeAttributes: provided attributes are not a plain object.");return Z(this._attributes,i),this.emit("attributesUpdated",{type:"merge",attributes:this._attributes,data:i}),this}updateAttributes(i){if(typeof i!="function")throw new k("Graph.updateAttributes: provided updater is not a function.");return this._attributes=i(this._attributes),this.emit("attributesUpdated",{type:"update",attributes:this._attributes}),this}updateEachNodeAttributes(i,t){if(typeof i!="function")throw new k("Graph.updateEachNodeAttributes: expecting an updater function.");if(t&&!$t(t))throw new k("Graph.updateEachNodeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}");const e=this._nodes.values();let r,a;for(;r=e.next(),r.done!==!0;)a=r.value,a.attributes=i(a.key,a.attributes);this.emit("eachNodeAttributesUpdated",{hints:t||null})}updateEachEdgeAttributes(i,t){if(typeof i!="function")throw new k("Graph.updateEachEdgeAttributes: expecting an updater function.");if(t&&!$t(t))throw new k("Graph.updateEachEdgeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}");const e=this._edges.values();let r,a,o,s;for(;r=e.next(),r.done!==!0;)a=r.value,o=a.source,s=a.target,a.attributes=i(a.key,a.attributes,o.key,s.key,o.attributes,s.attributes,a.undirected);this.emit("eachEdgeAttributesUpdated",{hints:t||null})}forEachAdjacencyEntry(i){if(typeof i!="function")throw new k("Graph.forEachAdjacencyEntry: expecting a callback.");tt(!1,!1,!1,this,i)}forEachAdjacencyEntryWithOrphans(i){if(typeof i!="function")throw new k("Graph.forEachAdjacencyEntryWithOrphans: expecting a callback.");tt(!1,!1,!0,this,i)}forEachAssymetricAdjacencyEntry(i){if(typeof i!="function")throw new k("Graph.forEachAssymetricAdjacencyEntry: expecting a callback.");tt(!1,!0,!1,this,i)}forEachAssymetricAdjacencyEntryWithOrphans(i){if(typeof i!="function")throw new k("Graph.forEachAssymetricAdjacencyEntryWithOrphans: expecting a callback.");tt(!1,!0,!0,this,i)}nodes(){return Array.from(this._nodes.keys())}forEachNode(i){if(typeof i!="function")throw new k("Graph.forEachNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)r=e.value,i(r.key,r.attributes)}findNode(i){if(typeof i!="function")throw new k("Graph.findNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)if(r=e.value,i(r.key,r.attributes))return r.key}mapNodes(i){if(typeof i!="function")throw new k("Graph.mapNode: expecting a callback.");const t=this._nodes.values();let e,r;const a=new Array(this.order);let o=0;for(;e=t.next(),e.done!==!0;)r=e.value,a[o++]=i(r.key,r.attributes);return a}someNode(i){if(typeof i!="function")throw new k("Graph.someNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)if(r=e.value,i(r.key,r.attributes))return!0;return!1}everyNode(i){if(typeof i!="function")throw new k("Graph.everyNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)if(r=e.value,!i(r.key,r.attributes))return!1;return!0}filterNodes(i){if(typeof i!="function")throw new k("Graph.filterNodes: expecting a callback.");const t=this._nodes.values();let e,r;const a=[];for(;e=t.next(),e.done!==!0;)r=e.value,i(r.key,r.attributes)&&a.push(r.key);return a}reduceNodes(i,t){if(typeof i!="function")throw new k("Graph.reduceNodes: expecting a callback.");if(arguments.length<2)throw new k("Graph.reduceNodes: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.");let e=t;const r=this._nodes.values();let a,o;for(;a=r.next(),a.done!==!0;)o=a.value,e=i(e,o.key,o.attributes);return e}nodeEntries(){const i=this._nodes.values();return{[Symbol.iterator](){return this},next(){const t=i.next();if(t.done)return t;const e=t.value;return{value:{node:e.key,attributes:e.attributes},done:!1}}}}export(){const i=new Array(this._nodes.size);let t=0;this._nodes.forEach((r,a)=>{i[t++]=rn(a,r)});const e=new Array(this._edges.size);return t=0,this._edges.forEach((r,a)=>{e[t++]=nn(this.type,a,r)}),{options:{type:this.type,multi:this.multi,allowSelfLoops:this.allowSelfLoops},attributes:this.getAttributes(),nodes:i,edges:e}}import(i,t=!1){if(i instanceof j)return i.forEachNode((u,h)=>{t?this.mergeNode(u,h):this.addNode(u,h)}),i.forEachEdge((u,h,d,l,f,c,y)=>{t?y?this.mergeUndirectedEdgeWithKey(u,d,l,h):this.mergeDirectedEdgeWithKey(u,d,l,h):y?this.addUndirectedEdgeWithKey(u,d,l,h):this.addDirectedEdgeWithKey(u,d,l,h)}),this;if(!J(i))throw new k("Graph.import: invalid argument. Expecting a serialized graph or, alternatively, a Graph instance.");if(i.attributes){if(!J(i.attributes))throw new k("Graph.import: invalid attributes. Expecting a plain object.");t?this.mergeAttributes(i.attributes):this.replaceAttributes(i.attributes)}let e,r,a,o,s;if(i.nodes){if(a=i.nodes,!Array.isArray(a))throw new k("Graph.import: invalid nodes. Expecting an array.");for(e=0,r=a.length;e{const a=Z({},e.attributes);e=new t.NodeDataClass(r,a),t._nodes.set(r,e)}),t}copy(i){if(i=i||{},typeof i.type=="string"&&i.type!==this.type&&i.type!=="mixed")throw new I(`Graph.copy: cannot create an incompatible copy from "${this.type}" type to "${i.type}" because this would mean losing information about the current graph.`);if(typeof i.multi=="boolean"&&i.multi!==this.multi&&i.multi!==!0)throw new I("Graph.copy: cannot create an incompatible copy by downgrading a multi graph to a simple one because this would mean losing information about the current graph.");if(typeof i.allowSelfLoops=="boolean"&&i.allowSelfLoops!==this.allowSelfLoops&&i.allowSelfLoops!==!0)throw new I("Graph.copy: cannot create an incompatible copy from a graph allowing self loops to one that does not because this would mean losing information about the current graph.");const t=this.emptyCopy(i),e=this._edges.values();let r,a;for(;r=e.next(),r.done!==!0;)a=r.value,ki(t,"copy",!1,a.undirected,a.key,a.source.key,a.target.key,Z({},a.attributes));return t}toJSON(){return this.export()}toString(){return"[object Graph]"}inspect(){const i={};this._nodes.forEach((a,o)=>{i[o]=a.attributes});const t={},e={};this._edges.forEach((a,o)=>{const s=a.undirected?"--":"->";let u="",h=a.source.key,d=a.target.key,l;a.undirected&&h>d&&(l=h,h=d,d=l);const f=`(${h})${s}(${d})`;o.startsWith("geid_")?this.multi&&(typeof e[f]>"u"?e[f]=0:e[f]++,u+=`${e[f]}. `):u+=`[${o}]: `,u+=f,t[u]=a.attributes});const r={};for(const a in this)this.hasOwnProperty(a)&&!Bt.has(a)&&typeof this[a]!="function"&&typeof a!="symbol"&&(r[a]=this[a]);return r.attributes=this._attributes,r.nodes=i,r.edges=t,ae(r,"constructor",this.constructor),r}}typeof Symbol<"u"&&(j.prototype[Symbol.for("nodejs.util.inspect.custom")]=j.prototype.inspect);hn.forEach(n=>{["add","merge","update"].forEach(i=>{const t=n.name(i),e=i==="add"?ki:cn;n.generateKey?j.prototype[t]=function(r,a,o){return e(this,t,!0,(n.type||this.type)==="undirected",null,r,a,o,i==="update")}:j.prototype[t]=function(r,a,o,s){return e(this,t,!1,(n.type||this.type)==="undirected",r,a,o,s,i==="update")}})});wr(j);Lr(j);qr(j);tn(j);class Di extends j{constructor(i){const t=Z({type:"directed"},i);if("multi"in t&&t.multi!==!1)throw new k("DirectedGraph.from: inconsistent indication that the graph should be multi in given options!");if(t.type!=="directed")throw new k('DirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}class Li extends j{constructor(i){const t=Z({type:"undirected"},i);if("multi"in t&&t.multi!==!1)throw new k("UndirectedGraph.from: inconsistent indication that the graph should be multi in given options!");if(t.type!=="undirected")throw new k('UndirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}class Gi extends j{constructor(i){const t=Z({multi:!0},i);if("multi"in t&&t.multi!==!0)throw new k("MultiGraph.from: inconsistent indication that the graph should be simple in given options!");super(t)}}class Fi extends j{constructor(i){const t=Z({type:"directed",multi:!0},i);if("multi"in t&&t.multi!==!0)throw new k("MultiDirectedGraph.from: inconsistent indication that the graph should be simple in given options!");if(t.type!=="directed")throw new k('MultiDirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}class Ni extends j{constructor(i){const t=Z({type:"undirected",multi:!0},i);if("multi"in t&&t.multi!==!0)throw new k("MultiUndirectedGraph.from: inconsistent indication that the graph should be simple in given options!");if(t.type!=="undirected")throw new k('MultiUndirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}function Fe(n){n.from=function(i,t){const e=Z({},i.options,t),r=new n(e);return r.import(i),r}}Fe(j);Fe(Di);Fe(Li);Fe(Gi);Fe(Fi);Fe(Ni);j.Graph=j;j.DirectedGraph=Di;j.UndirectedGraph=Li;j.MultiGraph=Gi;j.MultiDirectedGraph=Fi;j.MultiUndirectedGraph=Ni;j.InvalidArgumentsGraphError=k;j.NotFoundGraphError=C;j.UsageGraphError=I;var ft,Ht;function Pi(){return Ht||(Ht=1,ft=function(i){return i!==null&&typeof i=="object"&&typeof i.addUndirectedEdgeWithKey=="function"&&typeof i.dropNode=="function"&&typeof i.multi=="boolean"}),ft}var ze={},Wt;function fn(){if(Wt)return ze;Wt=1;function n(e){return typeof e!="number"||isNaN(e)?1:e}function i(e,r){var a={},o=function(h){return typeof h>"u"?r:h};typeof r=="function"&&(o=r);var s=function(h){return o(h[e])},u=function(){return o(void 0)};return typeof e=="string"?(a.fromAttributes=s,a.fromGraph=function(h,d){return s(h.getNodeAttributes(d))},a.fromEntry=function(h,d){return s(d)}):typeof e=="function"?(a.fromAttributes=function(){throw new Error("graphology-utils/getters/createNodeValueGetter: irrelevant usage.")},a.fromGraph=function(h,d){return o(e(d,h.getNodeAttributes(d)))},a.fromEntry=function(h,d){return o(e(h,d))}):(a.fromAttributes=u,a.fromGraph=u,a.fromEntry=u),a}function t(e,r){var a={},o=function(h){return typeof h>"u"?r:h};typeof r=="function"&&(o=r);var s=function(h){return o(h[e])},u=function(){return o(void 0)};return typeof e=="string"?(a.fromAttributes=s,a.fromGraph=function(h,d){return s(h.getEdgeAttributes(d))},a.fromEntry=function(h,d){return s(d)},a.fromPartialEntry=a.fromEntry,a.fromMinimalEntry=a.fromEntry):typeof e=="function"?(a.fromAttributes=function(){throw new Error("graphology-utils/getters/createEdgeValueGetter: irrelevant usage.")},a.fromGraph=function(h,d){var l=h.extremities(d);return o(e(d,h.getEdgeAttributes(d),l[0],l[1],h.getNodeAttributes(l[0]),h.getNodeAttributes(l[1]),h.isUndirected(d)))},a.fromEntry=function(h,d,l,f,c,y,w){return o(e(h,d,l,f,c,y,w))},a.fromPartialEntry=function(h,d,l,f){return o(e(h,d,l,f))},a.fromMinimalEntry=function(h,d){return o(e(h,d))}):(a.fromAttributes=u,a.fromGraph=u,a.fromEntry=u,a.fromMinimalEntry=u),a}return ze.createNodeValueGetter=i,ze.createEdgeValueGetter=t,ze.createEdgeWeightGetter=function(e){return t(e,n)},ze}var gt,jt;function gn(){if(jt)return gt;jt=1;var n=0,i=1,t=2,e=3,r=4,a=5,o=6,s=7,u=8,h=9,d=0,l=1,f=2,c=0,y=1,w=2,T=3,D=4,m=5,S=6,p=7,b=8,R=3,A=10,G=3,F=9,P=10;return gt=function(z,g,K){var te,x,v,$,W,X,ie,Y,N,Ne,re=g.length,tr=K.length,Pe=z.adjustSizes,ir=z.barnesHutTheta*z.barnesHutTheta,qe,q,B,M,fe,U,O,E=[];for(v=0;vYe?(Ee-=(Ke-Ye)/2,Re=Ee+Ke):(we-=(Ye-Ke)/2,Se=we+Ye),E[0+c]=-1,E[0+y]=(we+Se)/2,E[0+w]=(Ee+Re)/2,E[0+T]=Math.max(Se-we,Re-Ee),E[0+D]=-1,E[0+m]=-1,E[0+S]=0,E[0+p]=0,E[0+b]=0,te=1,v=0;v=0){g[v+n]=0)if(U=Math.pow(g[v+n]-E[x+p],2)+Math.pow(g[v+i]-E[x+b],2),Ne=E[x+T],4*Ne*Ne/U0?(O=q*g[v+o]*E[x+S]/U,g[v+t]+=B*O,g[v+e]+=M*O):U<0&&(O=-q*g[v+o]*E[x+S]/Math.sqrt(U),g[v+t]+=B*O,g[v+e]+=M*O):U>0&&(O=q*g[v+o]*E[x+S]/U,g[v+t]+=B*O,g[v+e]+=M*O),x=E[x+D],x<0)break;continue}else{x=E[x+m];continue}else{if(X=E[x+c],X>=0&&X!==v&&(B=g[v+n]-g[X+n],M=g[v+i]-g[X+i],U=B*B+M*M,Pe===!0?U>0?(O=q*g[v+o]*g[X+o]/U,g[v+t]+=B*O,g[v+e]+=M*O):U<0&&(O=-q*g[v+o]*g[X+o]/Math.sqrt(U),g[v+t]+=B*O,g[v+e]+=M*O):U>0&&(O=q*g[v+o]*g[X+o]/U,g[v+t]+=B*O,g[v+e]+=M*O)),x=E[x+D],x<0)break;continue}else for(q=z.scalingRatio,$=0;$0?(O=q*g[$+o]*g[W+o]/U/U,g[$+t]+=B*O,g[$+e]+=M*O,g[W+t]-=B*O,g[W+e]-=M*O):U<0&&(O=100*q*g[$+o]*g[W+o],g[$+t]+=B*O,g[$+e]+=M*O,g[W+t]-=B*O,g[W+e]-=M*O)):(U=Math.sqrt(B*B+M*M),U>0&&(O=q*g[$+o]*g[W+o]/U/U,g[$+t]+=B*O,g[$+e]+=M*O,g[W+t]-=B*O,g[W+e]-=M*O));for(N=z.gravity/z.scalingRatio,q=z.scalingRatio,v=0;v0&&(O=q*g[v+o]*N):U>0&&(O=q*g[v+o]*N/U),g[v+t]-=B*O,g[v+e]-=M*O;for(q=1*(z.outboundAttractionDistribution?qe:1),ie=0;ie0&&(O=-q*fe*Math.log(1+U)/U/g[$+o]):U>0&&(O=-q*fe*Math.log(1+U)/U):z.outboundAttractionDistribution?U>0&&(O=-q*fe/g[$+o]):U>0&&(O=-q*fe)):(U=Math.sqrt(Math.pow(B,2)+Math.pow(M,2)),z.linLogMode?z.outboundAttractionDistribution?U>0&&(O=-q*fe*Math.log(1+U)/U/g[$+o]):U>0&&(O=-q*fe*Math.log(1+U)/U):z.outboundAttractionDistribution?(U=1,O=-q*fe/g[$+o]):(U=1,O=-q*fe)),U>0&&(g[$+t]+=B*O,g[$+e]+=M*O,g[W+t]-=B*O,g[W+e]-=M*O);var Ze,Ie,Xe,_e,Je,Qe;if(Pe===!0)for(v=0;vP&&(g[v+t]=g[v+t]*P/Ze,g[v+e]=g[v+e]*P/Ze),Ie=g[v+o]*Math.sqrt((g[v+r]-g[v+t])*(g[v+r]-g[v+t])+(g[v+a]-g[v+e])*(g[v+a]-g[v+e])),Xe=Math.sqrt((g[v+r]+g[v+t])*(g[v+r]+g[v+t])+(g[v+a]+g[v+e])*(g[v+a]+g[v+e]))/2,_e=.1*Math.log(1+Xe)/(1+Math.sqrt(Ie)),Je=g[v+n]+g[v+t]*(_e/z.slowDown),g[v+n]=Je,Qe=g[v+i]+g[v+e]*(_e/z.slowDown),g[v+i]=Qe);else for(v=0;v=0)?{message:"the `scalingRatio` setting should be a number >= 0."}:"strongGravityMode"in t&&typeof t.strongGravityMode!="boolean"?{message:"the `strongGravityMode` setting should be a boolean."}:"gravity"in t&&!(typeof t.gravity=="number"&&t.gravity>=0)?{message:"the `gravity` setting should be a number >= 0."}:"slowDown"in t&&!(typeof t.slowDown=="number"||t.slowDown>=0)?{message:"the `slowDown` setting should be a number >= 0."}:"barnesHutOptimize"in t&&typeof t.barnesHutOptimize!="boolean"?{message:"the `barnesHutOptimize` setting should be a boolean."}:"barnesHutTheta"in t&&!(typeof t.barnesHutTheta=="number"&&t.barnesHutTheta>=0)?{message:"the `barnesHutTheta` setting should be a number >= 0."}:null},ge.graphToByteArrays=function(t,e){var r=t.order,a=t.size,o={},s,u=new Float32Array(r*n),h=new Float32Array(a*i);return s=0,t.forEachNode(function(d,l){o[d]=s,u[s]=l.x,u[s+1]=l.y,u[s+2]=0,u[s+3]=0,u[s+4]=0,u[s+5]=0,u[s+6]=1,u[s+7]=1,u[s+8]=l.size||1,u[s+9]=l.fixed?1:0,s+=n}),s=0,t.forEachEdge(function(d,l,f,c,y,w,T){var D=o[f],m=o[c],S=e(d,l,f,c,y,w,T);u[D+6]+=S,u[m+6]+=S,h[s]=D,h[s+1]=m,h[s+2]=S,s+=i}),{nodes:u,edges:h}},ge.assignLayoutChanges=function(t,e,r){var a=0;t.updateEachNodeAttributes(function(o,s){return s.x=e[a],s.y=e[a+1],a+=n,r?r(o,s):s})},ge.readGraphPositions=function(t,e){var r=0;t.forEachNode(function(a,o){e[r]=o.x,e[r+1]=o.y,r+=n})},ge.collectLayoutChanges=function(t,e,r){for(var a=t.nodes(),o={},s=0,u=0,h=e.length;s2e3,strongGravityMode:!0,gravity:.05,scalingRatio:10,slowDown:1+Math.log(h)}}var s=a.bind(null,!1);return s.assign=a.bind(null,!0),s.inferSettings=o,vt=s,vt}var yn=mn();const it=bi(yn);function bn(n,i){if(typeof n!="object"||!n)return n;var t=n[Symbol.toPrimitive];if(t!==void 0){var e=t.call(n,i);if(typeof e!="object")return e;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(n)}function je(n){var i=bn(n,"string");return typeof i=="symbol"?i:i+""}function Q(n,i){if(!(n instanceof i))throw new TypeError("Cannot call a class as a function")}function Yt(n,i){for(var t=0;tn.length)&&(i=n.length);for(var t=0,e=Array(i);t>>16,t=(n&65280)>>>8,e=n&255,r=255,a=zi(i,t,e,r);return bt[n]=a,a}function Zt(n,i,t,e){return t+(i<<8)+(n<<16)}function Xt(n,i,t,e,r,a){var o=Math.floor(t/a*r),s=Math.floor(n.drawingBufferHeight/a-e/a*r),u=new Uint8Array(4);n.bindFramebuffer(n.FRAMEBUFFER,i),n.readPixels(o,s,1,1,n.RGBA,n.UNSIGNED_BYTE,u);var h=De(u,4),d=h[0],l=h[1],f=h[2],c=h[3];return[d,l,f,c]}function _(n,i,t){return(i=je(i))in n?Object.defineProperty(n,i,{value:t,enumerable:!0,configurable:!0,writable:!0}):n[i]=t,n}function Jt(n,i){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var e=Object.getOwnPropertySymbols(n);i&&(e=e.filter(function(r){return Object.getOwnPropertyDescriptor(n,r).enumerable})),t.push.apply(t,e)}return t}function L(n){for(var i=1;i{throw TypeError(e)};var qM=(e,t,r)=>t in e?VM(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var Qo=(e,t,r)=>qM(e,typeof t!="symbol"?t+"":t,r),Up=(e,t,r)=>t.has(e)||G1("Cannot "+r);var L=(e,t,r)=>(Up(e,t,"read from private field"),r?r.call(e):t.get(e)),De=(e,t,r)=>t.has(e)?G1("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,r),ye=(e,t,r,n)=>(Up(e,t,"write to private field"),n?n.call(e,r):t.set(e,r),r),Ue=(e,t,r)=>(Up(e,t,"access private method"),r);var md=(e,t,r,n)=>({set _(a){ye(e,t,a,r)},get _(){return L(e,t,n)}});function QM(e,t){for(var r=0;rn[a]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const a of document.querySelectorAll('link[rel="modulepreload"]'))n(a);new MutationObserver(a=>{for(const o of a)if(o.type==="childList")for(const u of o.addedNodes)u.tagName==="LINK"&&u.rel==="modulepreload"&&n(u)}).observe(document,{childList:!0,subtree:!0});function r(a){const o={};return a.integrity&&(o.integrity=a.integrity),a.referrerPolicy&&(o.referrerPolicy=a.referrerPolicy),a.crossOrigin==="use-credentials"?o.credentials="include":a.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(a){if(a.ep)return;a.ep=!0;const o=r(a);fetch(a.href,o)}})();function dy(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Hp={exports:{}},Wl={},Wp={exports:{}},Fe={};/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var V1;function YM(){if(V1)return Fe;V1=1;var e=Symbol.for("react.element"),t=Symbol.for("react.portal"),r=Symbol.for("react.fragment"),n=Symbol.for("react.strict_mode"),a=Symbol.for("react.profiler"),o=Symbol.for("react.provider"),u=Symbol.for("react.context"),c=Symbol.for("react.forward_ref"),f=Symbol.for("react.suspense"),h=Symbol.for("react.memo"),m=Symbol.for("react.lazy"),g=Symbol.iterator;function v(I){return I===null||typeof I!="object"?null:(I=g&&I[g]||I["@@iterator"],typeof I=="function"?I:null)}var b={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},j=Object.assign,k={};function S(I,_,W){this.props=I,this.context=_,this.refs=k,this.updater=W||b}S.prototype.isReactComponent={},S.prototype.setState=function(I,_){if(typeof I!="object"&&typeof I!="function"&&I!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,I,_,"setState")},S.prototype.forceUpdate=function(I){this.updater.enqueueForceUpdate(this,I,"forceUpdate")};function N(){}N.prototype=S.prototype;function E(I,_,W){this.props=I,this.context=_,this.refs=k,this.updater=W||b}var A=E.prototype=new N;A.constructor=E,j(A,S.prototype),A.isPureReactComponent=!0;var P=Array.isArray,M=Object.prototype.hasOwnProperty,O={current:null},D={key:!0,ref:!0,__self:!0,__source:!0};function B(I,_,W){var ee,Z={},he=null,pe=null;if(_!=null)for(ee in _.ref!==void 0&&(pe=_.ref),_.key!==void 0&&(he=""+_.key),_)M.call(_,ee)&&!D.hasOwnProperty(ee)&&(Z[ee]=_[ee]);var Pe=arguments.length-2;if(Pe===1)Z.children=W;else if(1>>1,_=X[I];if(0>>1;Ia(Z,J))he<_&&0>a(pe,Z)?(X[I]=pe,X[he]=J,I=he):(X[I]=Z,X[ee]=J,I=ee);else if(he<_&&0>a(pe,J))X[I]=pe,X[he]=J,I=he;else break e}}return re}function a(X,re){var J=X.sortIndex-re.sortIndex;return J!==0?J:X.id-re.id}if(typeof performance=="object"&&typeof performance.now=="function"){var o=performance;e.unstable_now=function(){return o.now()}}else{var u=Date,c=u.now();e.unstable_now=function(){return u.now()-c}}var f=[],h=[],m=1,g=null,v=3,b=!1,j=!1,k=!1,S=typeof setTimeout=="function"?setTimeout:null,N=typeof clearTimeout=="function"?clearTimeout:null,E=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function A(X){for(var re=r(h);re!==null;){if(re.callback===null)n(h);else if(re.startTime<=X)n(h),re.sortIndex=re.expirationTime,t(f,re);else break;re=r(h)}}function P(X){if(k=!1,A(X),!j)if(r(f)!==null)j=!0,ie(M);else{var re=r(h);re!==null&&oe(P,re.startTime-X)}}function M(X,re){j=!1,k&&(k=!1,N(B),B=-1),b=!0;var J=v;try{for(A(re),g=r(f);g!==null&&(!(g.expirationTime>re)||X&&!Y());){var I=g.callback;if(typeof I=="function"){g.callback=null,v=g.priorityLevel;var _=I(g.expirationTime<=re);re=e.unstable_now(),typeof _=="function"?g.callback=_:g===r(f)&&n(f),A(re)}else n(f);g=r(f)}if(g!==null)var W=!0;else{var ee=r(h);ee!==null&&oe(P,ee.startTime-re),W=!1}return W}finally{g=null,v=J,b=!1}}var O=!1,D=null,B=-1,F=5,z=-1;function Y(){return!(e.unstable_now()-zX||125I?(X.sortIndex=J,t(h,X),r(f)===null&&X===r(h)&&(k?(N(B),B=-1):k=!0,oe(P,J-I))):(X.sortIndex=_,t(f,X),j||b||(j=!0,ie(M))),X},e.unstable_shouldYield=Y,e.unstable_wrapCallback=function(X){var re=v;return function(){var J=v;v=re;try{return X.apply(this,arguments)}finally{v=J}}}})(Vp)),Vp}var Z1;function e3(){return Z1||(Z1=1,Gp.exports=JM()),Gp.exports}/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var J1;function t3(){if(J1)return br;J1=1;var e=Ks(),t=e3();function r(i){for(var s="https://reactjs.org/docs/error-decoder.html?invariant="+i,d=1;d"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),f=Object.prototype.hasOwnProperty,h=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,m={},g={};function v(i){return f.call(g,i)?!0:f.call(m,i)?!1:h.test(i)?g[i]=!0:(m[i]=!0,!1)}function b(i,s,d,p){if(d!==null&&d.type===0)return!1;switch(typeof s){case"function":case"symbol":return!0;case"boolean":return p?!1:d!==null?!d.acceptsBooleans:(i=i.toLowerCase().slice(0,5),i!=="data-"&&i!=="aria-");default:return!1}}function j(i,s,d,p){if(s===null||typeof s>"u"||b(i,s,d,p))return!0;if(p)return!1;if(d!==null)switch(d.type){case 3:return!s;case 4:return s===!1;case 5:return isNaN(s);case 6:return isNaN(s)||1>s}return!1}function k(i,s,d,p,x,w,C){this.acceptsBooleans=s===2||s===3||s===4,this.attributeName=p,this.attributeNamespace=x,this.mustUseProperty=d,this.propertyName=i,this.type=s,this.sanitizeURL=w,this.removeEmptyString=C}var S={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(i){S[i]=new k(i,0,!1,i,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(i){var s=i[0];S[s]=new k(s,1,!1,i[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(i){S[i]=new k(i,2,!1,i.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(i){S[i]=new k(i,2,!1,i,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(i){S[i]=new k(i,3,!1,i.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(i){S[i]=new k(i,3,!0,i,null,!1,!1)}),["capture","download"].forEach(function(i){S[i]=new k(i,4,!1,i,null,!1,!1)}),["cols","rows","size","span"].forEach(function(i){S[i]=new k(i,6,!1,i,null,!1,!1)}),["rowSpan","start"].forEach(function(i){S[i]=new k(i,5,!1,i.toLowerCase(),null,!1,!1)});var N=/[\-:]([a-z])/g;function E(i){return i[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(i){var s=i.replace(N,E);S[s]=new k(s,1,!1,i,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(i){var s=i.replace(N,E);S[s]=new k(s,1,!1,i,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(i){var s=i.replace(N,E);S[s]=new k(s,1,!1,i,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(i){S[i]=new k(i,1,!1,i.toLowerCase(),null,!1,!1)}),S.xlinkHref=new k("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(i){S[i]=new k(i,1,!1,i.toLowerCase(),null,!0,!0)});function A(i,s,d,p){var x=S.hasOwnProperty(s)?S[s]:null;(x!==null?x.type!==0:p||!(2T||x[C]!==w[T]){var R=` +`+x[C].replace(" at new "," at ");return i.displayName&&R.includes("")&&(R=R.replace("",i.displayName)),R}while(1<=C&&0<=T);break}}}finally{W=!1,Error.prepareStackTrace=d}return(i=i?i.displayName||i.name:"")?_(i):""}function Z(i){switch(i.tag){case 5:return _(i.type);case 16:return _("Lazy");case 13:return _("Suspense");case 19:return _("SuspenseList");case 0:case 2:case 15:return i=ee(i.type,!1),i;case 11:return i=ee(i.type.render,!1),i;case 1:return i=ee(i.type,!0),i;default:return""}}function he(i){if(i==null)return null;if(typeof i=="function")return i.displayName||i.name||null;if(typeof i=="string")return i;switch(i){case D:return"Fragment";case O:return"Portal";case F:return"Profiler";case B:return"StrictMode";case me:return"Suspense";case ue:return"SuspenseList"}if(typeof i=="object")switch(i.$$typeof){case Y:return(i.displayName||"Context")+".Consumer";case z:return(i._context.displayName||"Context")+".Provider";case U:var s=i.render;return i=i.displayName,i||(i=s.displayName||s.name||"",i=i!==""?"ForwardRef("+i+")":"ForwardRef"),i;case ge:return s=i.displayName||null,s!==null?s:he(i.type)||"Memo";case ie:s=i._payload,i=i._init;try{return he(i(s))}catch{}}return null}function pe(i){var s=i.type;switch(i.tag){case 24:return"Cache";case 9:return(s.displayName||"Context")+".Consumer";case 10:return(s._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return i=s.render,i=i.displayName||i.name||"",s.displayName||(i!==""?"ForwardRef("+i+")":"ForwardRef");case 7:return"Fragment";case 5:return s;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return he(s);case 8:return s===B?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof s=="function")return s.displayName||s.name||null;if(typeof s=="string")return s}return null}function Pe(i){switch(typeof i){case"boolean":case"number":case"string":case"undefined":return i;case"object":return i;default:return""}}function ne(i){var s=i.type;return(i=i.nodeName)&&i.toLowerCase()==="input"&&(s==="checkbox"||s==="radio")}function we(i){var s=ne(i)?"checked":"value",d=Object.getOwnPropertyDescriptor(i.constructor.prototype,s),p=""+i[s];if(!i.hasOwnProperty(s)&&typeof d<"u"&&typeof d.get=="function"&&typeof d.set=="function"){var x=d.get,w=d.set;return Object.defineProperty(i,s,{configurable:!0,get:function(){return x.call(this)},set:function(C){p=""+C,w.call(this,C)}}),Object.defineProperty(i,s,{enumerable:d.enumerable}),{getValue:function(){return p},setValue:function(C){p=""+C},stopTracking:function(){i._valueTracker=null,delete i[s]}}}}function _e(i){i._valueTracker||(i._valueTracker=we(i))}function le(i){if(!i)return!1;var s=i._valueTracker;if(!s)return!0;var d=s.getValue(),p="";return i&&(p=ne(i)?i.checked?"true":"false":i.value),i=p,i!==d?(s.setValue(i),!0):!1}function Ze(i){if(i=i||(typeof document<"u"?document:void 0),typeof i>"u")return null;try{return i.activeElement||i.body}catch{return i.body}}function Be(i,s){var d=s.checked;return J({},s,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:d??i._wrapperState.initialChecked})}function Oe(i,s){var d=s.defaultValue==null?"":s.defaultValue,p=s.checked!=null?s.checked:s.defaultChecked;d=Pe(s.value!=null?s.value:d),i._wrapperState={initialChecked:p,initialValue:d,controlled:s.type==="checkbox"||s.type==="radio"?s.checked!=null:s.value!=null}}function yt(i,s){s=s.checked,s!=null&&A(i,"checked",s,!1)}function Xt(i,s){yt(i,s);var d=Pe(s.value),p=s.type;if(d!=null)p==="number"?(d===0&&i.value===""||i.value!=d)&&(i.value=""+d):i.value!==""+d&&(i.value=""+d);else if(p==="submit"||p==="reset"){i.removeAttribute("value");return}s.hasOwnProperty("value")?Se(i,s.type,d):s.hasOwnProperty("defaultValue")&&Se(i,s.type,Pe(s.defaultValue)),s.checked==null&&s.defaultChecked!=null&&(i.defaultChecked=!!s.defaultChecked)}function K(i,s,d){if(s.hasOwnProperty("value")||s.hasOwnProperty("defaultValue")){var p=s.type;if(!(p!=="submit"&&p!=="reset"||s.value!==void 0&&s.value!==null))return;s=""+i._wrapperState.initialValue,d||s===i.value||(i.value=s),i.defaultValue=s}d=i.name,d!==""&&(i.name=""),i.defaultChecked=!!i._wrapperState.initialChecked,d!==""&&(i.name=d)}function Se(i,s,d){(s!=="number"||Ze(i.ownerDocument)!==i)&&(d==null?i.defaultValue=""+i._wrapperState.initialValue:i.defaultValue!==""+d&&(i.defaultValue=""+d))}var Ce=Array.isArray;function Ge(i,s,d,p){if(i=i.options,s){s={};for(var x=0;x"+s.valueOf().toString()+"",s=oc.firstChild;i.firstChild;)i.removeChild(i.firstChild);for(;s.firstChild;)i.appendChild(s.firstChild)}});function ol(i,s){if(s){var d=i.firstChild;if(d&&d===i.lastChild&&d.nodeType===3){d.nodeValue=s;return}}i.textContent=s}var sl={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},XO=["Webkit","ms","Moz","O"];Object.keys(sl).forEach(function(i){XO.forEach(function(s){s=s+i.charAt(0).toUpperCase()+i.substring(1),sl[s]=sl[i]})});function sx(i,s,d){return s==null||typeof s=="boolean"||s===""?"":d||typeof s!="number"||s===0||sl.hasOwnProperty(i)&&sl[i]?(""+s).trim():s+"px"}function lx(i,s){i=i.style;for(var d in s)if(s.hasOwnProperty(d)){var p=d.indexOf("--")===0,x=sx(d,s[d],p);d==="float"&&(d="cssFloat"),p?i.setProperty(d,x):i[d]=x}}var ZO=J({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function em(i,s){if(s){if(ZO[i]&&(s.children!=null||s.dangerouslySetInnerHTML!=null))throw Error(r(137,i));if(s.dangerouslySetInnerHTML!=null){if(s.children!=null)throw Error(r(60));if(typeof s.dangerouslySetInnerHTML!="object"||!("__html"in s.dangerouslySetInnerHTML))throw Error(r(61))}if(s.style!=null&&typeof s.style!="object")throw Error(r(62))}}function tm(i,s){if(i.indexOf("-")===-1)return typeof s.is=="string";switch(i){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var rm=null;function nm(i){return i=i.target||i.srcElement||window,i.correspondingUseElement&&(i=i.correspondingUseElement),i.nodeType===3?i.parentNode:i}var im=null,No=null,Eo=null;function ux(i){if(i=Pl(i)){if(typeof im!="function")throw Error(r(280));var s=i.stateNode;s&&(s=Pc(s),im(i.stateNode,i.type,s))}}function cx(i){No?Eo?Eo.push(i):Eo=[i]:No=i}function dx(){if(No){var i=No,s=Eo;if(Eo=No=null,ux(i),s)for(i=0;i>>=0,i===0?32:31-(u_(i)/c_|0)|0}var dc=64,fc=4194304;function dl(i){switch(i&-i){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: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 i&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return i&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return i}}function hc(i,s){var d=i.pendingLanes;if(d===0)return 0;var p=0,x=i.suspendedLanes,w=i.pingedLanes,C=d&268435455;if(C!==0){var T=C&~x;T!==0?p=dl(T):(w&=C,w!==0&&(p=dl(w)))}else C=d&~x,C!==0?p=dl(C):w!==0&&(p=dl(w));if(p===0)return 0;if(s!==0&&s!==p&&(s&x)===0&&(x=p&-p,w=s&-s,x>=w||x===16&&(w&4194240)!==0))return s;if((p&4)!==0&&(p|=d&16),s=i.entangledLanes,s!==0)for(i=i.entanglements,s&=p;0d;d++)s.push(i);return s}function fl(i,s,d){i.pendingLanes|=s,s!==536870912&&(i.suspendedLanes=0,i.pingedLanes=0),i=i.eventTimes,s=31-nn(s),i[s]=d}function m_(i,s){var d=i.pendingLanes&~s;i.pendingLanes=s,i.suspendedLanes=0,i.pingedLanes=0,i.expiredLanes&=s,i.mutableReadLanes&=s,i.entangledLanes&=s,s=i.entanglements;var p=i.eventTimes;for(i=i.expirationTimes;0=bl),zx=" ",Fx=!1;function Bx(i,s){switch(i){case"keyup":return U_.indexOf(s.keyCode)!==-1;case"keydown":return s.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Ux(i){return i=i.detail,typeof i=="object"&&"data"in i?i.data:null}var Po=!1;function W_(i,s){switch(i){case"compositionend":return Ux(s);case"keypress":return s.which!==32?null:(Fx=!0,zx);case"textInput":return i=s.data,i===zx&&Fx?null:i;default:return null}}function K_(i,s){if(Po)return i==="compositionend"||!km&&Bx(i,s)?(i=Ix(),yc=gm=_i=null,Po=!1,i):null;switch(i){case"paste":return null;case"keypress":if(!(s.ctrlKey||s.altKey||s.metaKey)||s.ctrlKey&&s.altKey){if(s.char&&1=s)return{node:d,offset:s-i};i=p}e:{for(;d;){if(d.nextSibling){d=d.nextSibling;break e}d=d.parentNode}d=void 0}d=Qx(d)}}function Xx(i,s){return i&&s?i===s?!0:i&&i.nodeType===3?!1:s&&s.nodeType===3?Xx(i,s.parentNode):"contains"in i?i.contains(s):i.compareDocumentPosition?!!(i.compareDocumentPosition(s)&16):!1:!1}function Zx(){for(var i=window,s=Ze();s instanceof i.HTMLIFrameElement;){try{var d=typeof s.contentWindow.location.href=="string"}catch{d=!1}if(d)i=s.contentWindow;else break;s=Ze(i.document)}return s}function Nm(i){var s=i&&i.nodeName&&i.nodeName.toLowerCase();return s&&(s==="input"&&(i.type==="text"||i.type==="search"||i.type==="tel"||i.type==="url"||i.type==="password")||s==="textarea"||i.contentEditable==="true")}function eM(i){var s=Zx(),d=i.focusedElem,p=i.selectionRange;if(s!==d&&d&&d.ownerDocument&&Xx(d.ownerDocument.documentElement,d)){if(p!==null&&Nm(d)){if(s=p.start,i=p.end,i===void 0&&(i=s),"selectionStart"in d)d.selectionStart=s,d.selectionEnd=Math.min(i,d.value.length);else if(i=(s=d.ownerDocument||document)&&s.defaultView||window,i.getSelection){i=i.getSelection();var x=d.textContent.length,w=Math.min(p.start,x);p=p.end===void 0?w:Math.min(p.end,x),!i.extend&&w>p&&(x=p,p=w,w=x),x=Yx(d,w);var C=Yx(d,p);x&&C&&(i.rangeCount!==1||i.anchorNode!==x.node||i.anchorOffset!==x.offset||i.focusNode!==C.node||i.focusOffset!==C.offset)&&(s=s.createRange(),s.setStart(x.node,x.offset),i.removeAllRanges(),w>p?(i.addRange(s),i.extend(C.node,C.offset)):(s.setEnd(C.node,C.offset),i.addRange(s)))}}for(s=[],i=d;i=i.parentNode;)i.nodeType===1&&s.push({element:i,left:i.scrollLeft,top:i.scrollTop});for(typeof d.focus=="function"&&d.focus(),d=0;d=document.documentMode,Oo=null,Em=null,Sl=null,Am=!1;function Jx(i,s,d){var p=d.window===d?d.document:d.nodeType===9?d:d.ownerDocument;Am||Oo==null||Oo!==Ze(p)||(p=Oo,"selectionStart"in p&&Nm(p)?p={start:p.selectionStart,end:p.selectionEnd}:(p=(p.ownerDocument&&p.ownerDocument.defaultView||window).getSelection(),p={anchorNode:p.anchorNode,anchorOffset:p.anchorOffset,focusNode:p.focusNode,focusOffset:p.focusOffset}),Sl&&jl(Sl,p)||(Sl=p,p=Ec(Em,"onSelect"),0Do||(i.current=zm[Do],zm[Do]=null,Do--)}function tt(i,s){Do++,zm[Do]=i.current,i.current=s}var Di={},Zt=Ti(Di),pr=Ti(!1),ka=Di;function Ro(i,s){var d=i.type.contextTypes;if(!d)return Di;var p=i.stateNode;if(p&&p.__reactInternalMemoizedUnmaskedChildContext===s)return p.__reactInternalMemoizedMaskedChildContext;var x={},w;for(w in d)x[w]=s[w];return p&&(i=i.stateNode,i.__reactInternalMemoizedUnmaskedChildContext=s,i.__reactInternalMemoizedMaskedChildContext=x),x}function gr(i){return i=i.childContextTypes,i!=null}function Oc(){at(pr),at(Zt)}function mb(i,s,d){if(Zt.current!==Di)throw Error(r(168));tt(Zt,s),tt(pr,d)}function pb(i,s,d){var p=i.stateNode;if(s=s.childContextTypes,typeof p.getChildContext!="function")return d;p=p.getChildContext();for(var x in p)if(!(x in s))throw Error(r(108,pe(i)||"Unknown",x));return J({},d,p)}function _c(i){return i=(i=i.stateNode)&&i.__reactInternalMemoizedMergedChildContext||Di,ka=Zt.current,tt(Zt,i),tt(pr,pr.current),!0}function gb(i,s,d){var p=i.stateNode;if(!p)throw Error(r(169));d?(i=pb(i,s,ka),p.__reactInternalMemoizedMergedChildContext=i,at(pr),at(Zt),tt(Zt,i)):at(pr),tt(pr,d)}var Qn=null,Mc=!1,Fm=!1;function vb(i){Qn===null?Qn=[i]:Qn.push(i)}function fM(i){Mc=!0,vb(i)}function Ri(){if(!Fm&&Qn!==null){Fm=!0;var i=0,s=Je;try{var d=Qn;for(Je=1;i>=C,x-=C,Yn=1<<32-nn(s)+x|d<Re?(It=Te,Te=null):It=Te.sibling;var Qe=ae(H,Te,G[Re],fe);if(Qe===null){Te===null&&(Te=It);break}i&&Te&&Qe.alternate===null&&s(H,Te),$=w(Qe,$,Re),Ie===null?Ae=Qe:Ie.sibling=Qe,Ie=Qe,Te=It}if(Re===G.length)return d(H,Te),ut&&Sa(H,Re),Ae;if(Te===null){for(;ReRe?(It=Te,Te=null):It=Te.sibling;var Ki=ae(H,Te,Qe.value,fe);if(Ki===null){Te===null&&(Te=It);break}i&&Te&&Ki.alternate===null&&s(H,Te),$=w(Ki,$,Re),Ie===null?Ae=Ki:Ie.sibling=Ki,Ie=Ki,Te=It}if(Qe.done)return d(H,Te),ut&&Sa(H,Re),Ae;if(Te===null){for(;!Qe.done;Re++,Qe=G.next())Qe=ce(H,Qe.value,fe),Qe!==null&&($=w(Qe,$,Re),Ie===null?Ae=Qe:Ie.sibling=Qe,Ie=Qe);return ut&&Sa(H,Re),Ae}for(Te=p(H,Te);!Qe.done;Re++,Qe=G.next())Qe=ve(Te,H,Re,Qe.value,fe),Qe!==null&&(i&&Qe.alternate!==null&&Te.delete(Qe.key===null?Re:Qe.key),$=w(Qe,$,Re),Ie===null?Ae=Qe:Ie.sibling=Qe,Ie=Qe);return i&&Te.forEach(function(GM){return s(H,GM)}),ut&&Sa(H,Re),Ae}function bt(H,$,G,fe){if(typeof G=="object"&&G!==null&&G.type===D&&G.key===null&&(G=G.props.children),typeof G=="object"&&G!==null){switch(G.$$typeof){case M:e:{for(var Ae=G.key,Ie=$;Ie!==null;){if(Ie.key===Ae){if(Ae=G.type,Ae===D){if(Ie.tag===7){d(H,Ie.sibling),$=x(Ie,G.props.children),$.return=H,H=$;break e}}else if(Ie.elementType===Ae||typeof Ae=="object"&&Ae!==null&&Ae.$$typeof===ie&&jb(Ae)===Ie.type){d(H,Ie.sibling),$=x(Ie,G.props),$.ref=Ol(H,Ie,G),$.return=H,H=$;break e}d(H,Ie);break}else s(H,Ie);Ie=Ie.sibling}G.type===D?($=Ma(G.props.children,H.mode,fe,G.key),$.return=H,H=$):(fe=od(G.type,G.key,G.props,null,H.mode,fe),fe.ref=Ol(H,$,G),fe.return=H,H=fe)}return C(H);case O:e:{for(Ie=G.key;$!==null;){if($.key===Ie)if($.tag===4&&$.stateNode.containerInfo===G.containerInfo&&$.stateNode.implementation===G.implementation){d(H,$.sibling),$=x($,G.children||[]),$.return=H,H=$;break e}else{d(H,$);break}else s(H,$);$=$.sibling}$=Lp(G,H.mode,fe),$.return=H,H=$}return C(H);case ie:return Ie=G._init,bt(H,$,Ie(G._payload),fe)}if(Ce(G))return ke(H,$,G,fe);if(re(G))return Ne(H,$,G,fe);Rc(H,G)}return typeof G=="string"&&G!==""||typeof G=="number"?(G=""+G,$!==null&&$.tag===6?(d(H,$.sibling),$=x($,G),$.return=H,H=$):(d(H,$),$=Rp(G,H.mode,fe),$.return=H,H=$),C(H)):d(H,$)}return bt}var Fo=Sb(!0),Nb=Sb(!1),Lc=Ti(null),$c=null,Bo=null,Gm=null;function Vm(){Gm=Bo=$c=null}function qm(i){var s=Lc.current;at(Lc),i._currentValue=s}function Qm(i,s,d){for(;i!==null;){var p=i.alternate;if((i.childLanes&s)!==s?(i.childLanes|=s,p!==null&&(p.childLanes|=s)):p!==null&&(p.childLanes&s)!==s&&(p.childLanes|=s),i===d)break;i=i.return}}function Uo(i,s){$c=i,Gm=Bo=null,i=i.dependencies,i!==null&&i.firstContext!==null&&((i.lanes&s)!==0&&(vr=!0),i.firstContext=null)}function Ur(i){var s=i._currentValue;if(Gm!==i)if(i={context:i,memoizedValue:s,next:null},Bo===null){if($c===null)throw Error(r(308));Bo=i,$c.dependencies={lanes:0,firstContext:i}}else Bo=Bo.next=i;return s}var Na=null;function Ym(i){Na===null?Na=[i]:Na.push(i)}function Eb(i,s,d,p){var x=s.interleaved;return x===null?(d.next=d,Ym(s)):(d.next=x.next,x.next=d),s.interleaved=d,Zn(i,p)}function Zn(i,s){i.lanes|=s;var d=i.alternate;for(d!==null&&(d.lanes|=s),d=i,i=i.return;i!==null;)i.childLanes|=s,d=i.alternate,d!==null&&(d.childLanes|=s),d=i,i=i.return;return d.tag===3?d.stateNode:null}var Li=!1;function Xm(i){i.updateQueue={baseState:i.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Ab(i,s){i=i.updateQueue,s.updateQueue===i&&(s.updateQueue={baseState:i.baseState,firstBaseUpdate:i.firstBaseUpdate,lastBaseUpdate:i.lastBaseUpdate,shared:i.shared,effects:i.effects})}function Jn(i,s){return{eventTime:i,lane:s,tag:0,payload:null,callback:null,next:null}}function $i(i,s,d){var p=i.updateQueue;if(p===null)return null;if(p=p.shared,(qe&2)!==0){var x=p.pending;return x===null?s.next=s:(s.next=x.next,x.next=s),p.pending=s,Zn(i,d)}return x=p.interleaved,x===null?(s.next=s,Ym(p)):(s.next=x.next,x.next=s),p.interleaved=s,Zn(i,d)}function zc(i,s,d){if(s=s.updateQueue,s!==null&&(s=s.shared,(d&4194240)!==0)){var p=s.lanes;p&=i.pendingLanes,d|=p,s.lanes=d,dm(i,d)}}function Cb(i,s){var d=i.updateQueue,p=i.alternate;if(p!==null&&(p=p.updateQueue,d===p)){var x=null,w=null;if(d=d.firstBaseUpdate,d!==null){do{var C={eventTime:d.eventTime,lane:d.lane,tag:d.tag,payload:d.payload,callback:d.callback,next:null};w===null?x=w=C:w=w.next=C,d=d.next}while(d!==null);w===null?x=w=s:w=w.next=s}else x=w=s;d={baseState:p.baseState,firstBaseUpdate:x,lastBaseUpdate:w,shared:p.shared,effects:p.effects},i.updateQueue=d;return}i=d.lastBaseUpdate,i===null?d.firstBaseUpdate=s:i.next=s,d.lastBaseUpdate=s}function Fc(i,s,d,p){var x=i.updateQueue;Li=!1;var w=x.firstBaseUpdate,C=x.lastBaseUpdate,T=x.shared.pending;if(T!==null){x.shared.pending=null;var R=T,Q=R.next;R.next=null,C===null?w=Q:C.next=Q,C=R;var se=i.alternate;se!==null&&(se=se.updateQueue,T=se.lastBaseUpdate,T!==C&&(T===null?se.firstBaseUpdate=Q:T.next=Q,se.lastBaseUpdate=R))}if(w!==null){var ce=x.baseState;C=0,se=Q=R=null,T=w;do{var ae=T.lane,ve=T.eventTime;if((p&ae)===ae){se!==null&&(se=se.next={eventTime:ve,lane:0,tag:T.tag,payload:T.payload,callback:T.callback,next:null});e:{var ke=i,Ne=T;switch(ae=s,ve=d,Ne.tag){case 1:if(ke=Ne.payload,typeof ke=="function"){ce=ke.call(ve,ce,ae);break e}ce=ke;break e;case 3:ke.flags=ke.flags&-65537|128;case 0:if(ke=Ne.payload,ae=typeof ke=="function"?ke.call(ve,ce,ae):ke,ae==null)break e;ce=J({},ce,ae);break e;case 2:Li=!0}}T.callback!==null&&T.lane!==0&&(i.flags|=64,ae=x.effects,ae===null?x.effects=[T]:ae.push(T))}else ve={eventTime:ve,lane:ae,tag:T.tag,payload:T.payload,callback:T.callback,next:null},se===null?(Q=se=ve,R=ce):se=se.next=ve,C|=ae;if(T=T.next,T===null){if(T=x.shared.pending,T===null)break;ae=T,T=ae.next,ae.next=null,x.lastBaseUpdate=ae,x.shared.pending=null}}while(!0);if(se===null&&(R=ce),x.baseState=R,x.firstBaseUpdate=Q,x.lastBaseUpdate=se,s=x.shared.interleaved,s!==null){x=s;do C|=x.lane,x=x.next;while(x!==s)}else w===null&&(x.shared.lanes=0);Ca|=C,i.lanes=C,i.memoizedState=ce}}function Pb(i,s,d){if(i=s.effects,s.effects=null,i!==null)for(s=0;sd?d:4,i(!0);var p=rp.transition;rp.transition={};try{i(!1),s()}finally{Je=d,rp.transition=p}}function qb(){return Hr().memoizedState}function gM(i,s,d){var p=Ui(i);if(d={lane:p,action:d,hasEagerState:!1,eagerState:null,next:null},Qb(i))Yb(s,d);else if(d=Eb(i,s,d,p),d!==null){var x=ur();cn(d,i,p,x),Xb(d,s,p)}}function vM(i,s,d){var p=Ui(i),x={lane:p,action:d,hasEagerState:!1,eagerState:null,next:null};if(Qb(i))Yb(s,x);else{var w=i.alternate;if(i.lanes===0&&(w===null||w.lanes===0)&&(w=s.lastRenderedReducer,w!==null))try{var C=s.lastRenderedState,T=w(C,d);if(x.hasEagerState=!0,x.eagerState=T,an(T,C)){var R=s.interleaved;R===null?(x.next=x,Ym(s)):(x.next=R.next,R.next=x),s.interleaved=x;return}}catch{}finally{}d=Eb(i,s,x,p),d!==null&&(x=ur(),cn(d,i,p,x),Xb(d,s,p))}}function Qb(i){var s=i.alternate;return i===ht||s!==null&&s===ht}function Yb(i,s){Tl=Hc=!0;var d=i.pending;d===null?s.next=s:(s.next=d.next,d.next=s),i.pending=s}function Xb(i,s,d){if((d&4194240)!==0){var p=s.lanes;p&=i.pendingLanes,d|=p,s.lanes=d,dm(i,d)}}var Gc={readContext:Ur,useCallback:Jt,useContext:Jt,useEffect:Jt,useImperativeHandle:Jt,useInsertionEffect:Jt,useLayoutEffect:Jt,useMemo:Jt,useReducer:Jt,useRef:Jt,useState:Jt,useDebugValue:Jt,useDeferredValue:Jt,useTransition:Jt,useMutableSource:Jt,useSyncExternalStore:Jt,useId:Jt,unstable_isNewReconciler:!1},yM={readContext:Ur,useCallback:function(i,s){return Sn().memoizedState=[i,s===void 0?null:s],i},useContext:Ur,useEffect:Fb,useImperativeHandle:function(i,s,d){return d=d!=null?d.concat([i]):null,Wc(4194308,4,Hb.bind(null,s,i),d)},useLayoutEffect:function(i,s){return Wc(4194308,4,i,s)},useInsertionEffect:function(i,s){return Wc(4,2,i,s)},useMemo:function(i,s){var d=Sn();return s=s===void 0?null:s,i=i(),d.memoizedState=[i,s],i},useReducer:function(i,s,d){var p=Sn();return s=d!==void 0?d(s):s,p.memoizedState=p.baseState=s,i={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:i,lastRenderedState:s},p.queue=i,i=i.dispatch=gM.bind(null,ht,i),[p.memoizedState,i]},useRef:function(i){var s=Sn();return i={current:i},s.memoizedState=i},useState:$b,useDebugValue:up,useDeferredValue:function(i){return Sn().memoizedState=i},useTransition:function(){var i=$b(!1),s=i[0];return i=pM.bind(null,i[1]),Sn().memoizedState=i,[s,i]},useMutableSource:function(){},useSyncExternalStore:function(i,s,d){var p=ht,x=Sn();if(ut){if(d===void 0)throw Error(r(407));d=d()}else{if(d=s(),Mt===null)throw Error(r(349));(Aa&30)!==0||Ib(p,s,d)}x.memoizedState=d;var w={value:d,getSnapshot:s};return x.queue=w,Fb(Db.bind(null,p,w,i),[i]),p.flags|=2048,Ll(9,Tb.bind(null,p,w,d,s),void 0,null),d},useId:function(){var i=Sn(),s=Mt.identifierPrefix;if(ut){var d=Xn,p=Yn;d=(p&~(1<<32-nn(p)-1)).toString(32)+d,s=":"+s+"R"+d,d=Dl++,0<\/script>",i=i.removeChild(i.firstChild)):typeof p.is=="string"?i=C.createElement(d,{is:p.is}):(i=C.createElement(d),d==="select"&&(C=i,p.multiple?C.multiple=!0:p.size&&(C.size=p.size))):i=C.createElementNS(i,d),i[kn]=s,i[Cl]=p,v1(i,s,!1,!1),s.stateNode=i;e:{switch(C=tm(d,p),d){case"dialog":it("cancel",i),it("close",i),x=p;break;case"iframe":case"object":case"embed":it("load",i),x=p;break;case"video":case"audio":for(x=0;xVo&&(s.flags|=128,p=!0,$l(w,!1),s.lanes=4194304)}else{if(!p)if(i=Bc(C),i!==null){if(s.flags|=128,p=!0,d=i.updateQueue,d!==null&&(s.updateQueue=d,s.flags|=4),$l(w,!0),w.tail===null&&w.tailMode==="hidden"&&!C.alternate&&!ut)return er(s),null}else 2*xt()-w.renderingStartTime>Vo&&d!==1073741824&&(s.flags|=128,p=!0,$l(w,!1),s.lanes=4194304);w.isBackwards?(C.sibling=s.child,s.child=C):(d=w.last,d!==null?d.sibling=C:s.child=C,w.last=C)}return w.tail!==null?(s=w.tail,w.rendering=s,w.tail=s.sibling,w.renderingStartTime=xt(),s.sibling=null,d=ft.current,tt(ft,p?d&1|2:d&1),s):(er(s),null);case 22:case 23:return Ip(),p=s.memoizedState!==null,i!==null&&i.memoizedState!==null!==p&&(s.flags|=8192),p&&(s.mode&1)!==0?(Or&1073741824)!==0&&(er(s),s.subtreeFlags&6&&(s.flags|=8192)):er(s),null;case 24:return null;case 25:return null}throw Error(r(156,s.tag))}function EM(i,s){switch(Um(s),s.tag){case 1:return gr(s.type)&&Oc(),i=s.flags,i&65536?(s.flags=i&-65537|128,s):null;case 3:return Ho(),at(pr),at(Zt),tp(),i=s.flags,(i&65536)!==0&&(i&128)===0?(s.flags=i&-65537|128,s):null;case 5:return Jm(s),null;case 13:if(at(ft),i=s.memoizedState,i!==null&&i.dehydrated!==null){if(s.alternate===null)throw Error(r(340));zo()}return i=s.flags,i&65536?(s.flags=i&-65537|128,s):null;case 19:return at(ft),null;case 4:return Ho(),null;case 10:return qm(s.type._context),null;case 22:case 23:return Ip(),null;case 24:return null;default:return null}}var Yc=!1,tr=!1,AM=typeof WeakSet=="function"?WeakSet:Set,xe=null;function Ko(i,s){var d=i.ref;if(d!==null)if(typeof d=="function")try{d(null)}catch(p){mt(i,s,p)}else d.current=null}function wp(i,s,d){try{d()}catch(p){mt(i,s,p)}}var b1=!1;function CM(i,s){if(Im=gc,i=Zx(),Nm(i)){if("selectionStart"in i)var d={start:i.selectionStart,end:i.selectionEnd};else e:{d=(d=i.ownerDocument)&&d.defaultView||window;var p=d.getSelection&&d.getSelection();if(p&&p.rangeCount!==0){d=p.anchorNode;var x=p.anchorOffset,w=p.focusNode;p=p.focusOffset;try{d.nodeType,w.nodeType}catch{d=null;break e}var C=0,T=-1,R=-1,Q=0,se=0,ce=i,ae=null;t:for(;;){for(var ve;ce!==d||x!==0&&ce.nodeType!==3||(T=C+x),ce!==w||p!==0&&ce.nodeType!==3||(R=C+p),ce.nodeType===3&&(C+=ce.nodeValue.length),(ve=ce.firstChild)!==null;)ae=ce,ce=ve;for(;;){if(ce===i)break t;if(ae===d&&++Q===x&&(T=C),ae===w&&++se===p&&(R=C),(ve=ce.nextSibling)!==null)break;ce=ae,ae=ce.parentNode}ce=ve}d=T===-1||R===-1?null:{start:T,end:R}}else d=null}d=d||{start:0,end:0}}else d=null;for(Tm={focusedElem:i,selectionRange:d},gc=!1,xe=s;xe!==null;)if(s=xe,i=s.child,(s.subtreeFlags&1028)!==0&&i!==null)i.return=s,xe=i;else for(;xe!==null;){s=xe;try{var ke=s.alternate;if((s.flags&1024)!==0)switch(s.tag){case 0:case 11:case 15:break;case 1:if(ke!==null){var Ne=ke.memoizedProps,bt=ke.memoizedState,H=s.stateNode,$=H.getSnapshotBeforeUpdate(s.elementType===s.type?Ne:sn(s.type,Ne),bt);H.__reactInternalSnapshotBeforeUpdate=$}break;case 3:var G=s.stateNode.containerInfo;G.nodeType===1?G.textContent="":G.nodeType===9&&G.documentElement&&G.removeChild(G.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(r(163))}}catch(fe){mt(s,s.return,fe)}if(i=s.sibling,i!==null){i.return=s.return,xe=i;break}xe=s.return}return ke=b1,b1=!1,ke}function zl(i,s,d){var p=s.updateQueue;if(p=p!==null?p.lastEffect:null,p!==null){var x=p=p.next;do{if((x.tag&i)===i){var w=x.destroy;x.destroy=void 0,w!==void 0&&wp(s,d,w)}x=x.next}while(x!==p)}}function Xc(i,s){if(s=s.updateQueue,s=s!==null?s.lastEffect:null,s!==null){var d=s=s.next;do{if((d.tag&i)===i){var p=d.create;d.destroy=p()}d=d.next}while(d!==s)}}function kp(i){var s=i.ref;if(s!==null){var d=i.stateNode;switch(i.tag){case 5:i=d;break;default:i=d}typeof s=="function"?s(i):s.current=i}}function w1(i){var s=i.alternate;s!==null&&(i.alternate=null,w1(s)),i.child=null,i.deletions=null,i.sibling=null,i.tag===5&&(s=i.stateNode,s!==null&&(delete s[kn],delete s[Cl],delete s[$m],delete s[cM],delete s[dM])),i.stateNode=null,i.return=null,i.dependencies=null,i.memoizedProps=null,i.memoizedState=null,i.pendingProps=null,i.stateNode=null,i.updateQueue=null}function k1(i){return i.tag===5||i.tag===3||i.tag===4}function j1(i){e:for(;;){for(;i.sibling===null;){if(i.return===null||k1(i.return))return null;i=i.return}for(i.sibling.return=i.return,i=i.sibling;i.tag!==5&&i.tag!==6&&i.tag!==18;){if(i.flags&2||i.child===null||i.tag===4)continue e;i.child.return=i,i=i.child}if(!(i.flags&2))return i.stateNode}}function jp(i,s,d){var p=i.tag;if(p===5||p===6)i=i.stateNode,s?d.nodeType===8?d.parentNode.insertBefore(i,s):d.insertBefore(i,s):(d.nodeType===8?(s=d.parentNode,s.insertBefore(i,d)):(s=d,s.appendChild(i)),d=d._reactRootContainer,d!=null||s.onclick!==null||(s.onclick=Cc));else if(p!==4&&(i=i.child,i!==null))for(jp(i,s,d),i=i.sibling;i!==null;)jp(i,s,d),i=i.sibling}function Sp(i,s,d){var p=i.tag;if(p===5||p===6)i=i.stateNode,s?d.insertBefore(i,s):d.appendChild(i);else if(p!==4&&(i=i.child,i!==null))for(Sp(i,s,d),i=i.sibling;i!==null;)Sp(i,s,d),i=i.sibling}var Bt=null,ln=!1;function zi(i,s,d){for(d=d.child;d!==null;)S1(i,s,d),d=d.sibling}function S1(i,s,d){if(wn&&typeof wn.onCommitFiberUnmount=="function")try{wn.onCommitFiberUnmount(cc,d)}catch{}switch(d.tag){case 5:tr||Ko(d,s);case 6:var p=Bt,x=ln;Bt=null,zi(i,s,d),Bt=p,ln=x,Bt!==null&&(ln?(i=Bt,d=d.stateNode,i.nodeType===8?i.parentNode.removeChild(d):i.removeChild(d)):Bt.removeChild(d.stateNode));break;case 18:Bt!==null&&(ln?(i=Bt,d=d.stateNode,i.nodeType===8?Lm(i.parentNode,d):i.nodeType===1&&Lm(i,d),vl(i)):Lm(Bt,d.stateNode));break;case 4:p=Bt,x=ln,Bt=d.stateNode.containerInfo,ln=!0,zi(i,s,d),Bt=p,ln=x;break;case 0:case 11:case 14:case 15:if(!tr&&(p=d.updateQueue,p!==null&&(p=p.lastEffect,p!==null))){x=p=p.next;do{var w=x,C=w.destroy;w=w.tag,C!==void 0&&((w&2)!==0||(w&4)!==0)&&wp(d,s,C),x=x.next}while(x!==p)}zi(i,s,d);break;case 1:if(!tr&&(Ko(d,s),p=d.stateNode,typeof p.componentWillUnmount=="function"))try{p.props=d.memoizedProps,p.state=d.memoizedState,p.componentWillUnmount()}catch(T){mt(d,s,T)}zi(i,s,d);break;case 21:zi(i,s,d);break;case 22:d.mode&1?(tr=(p=tr)||d.memoizedState!==null,zi(i,s,d),tr=p):zi(i,s,d);break;default:zi(i,s,d)}}function N1(i){var s=i.updateQueue;if(s!==null){i.updateQueue=null;var d=i.stateNode;d===null&&(d=i.stateNode=new AM),s.forEach(function(p){var x=LM.bind(null,i,p);d.has(p)||(d.add(p),p.then(x,x))})}}function un(i,s){var d=s.deletions;if(d!==null)for(var p=0;px&&(x=C),p&=~w}if(p=x,p=xt()-p,p=(120>p?120:480>p?480:1080>p?1080:1920>p?1920:3e3>p?3e3:4320>p?4320:1960*OM(p/1960))-p,10i?16:i,Bi===null)var p=!1;else{if(i=Bi,Bi=null,rd=0,(qe&6)!==0)throw Error(r(331));var x=qe;for(qe|=4,xe=i.current;xe!==null;){var w=xe,C=w.child;if((xe.flags&16)!==0){var T=w.deletions;if(T!==null){for(var R=0;Rxt()-Ap?Oa(i,0):Ep|=d),xr(i,s)}function $1(i,s){s===0&&((i.mode&1)===0?s=1:(s=fc,fc<<=1,(fc&130023424)===0&&(fc=4194304)));var d=ur();i=Zn(i,s),i!==null&&(fl(i,s,d),xr(i,d))}function RM(i){var s=i.memoizedState,d=0;s!==null&&(d=s.retryLane),$1(i,d)}function LM(i,s){var d=0;switch(i.tag){case 13:var p=i.stateNode,x=i.memoizedState;x!==null&&(d=x.retryLane);break;case 19:p=i.stateNode;break;default:throw Error(r(314))}p!==null&&p.delete(s),$1(i,d)}var z1;z1=function(i,s,d){if(i!==null)if(i.memoizedProps!==s.pendingProps||pr.current)vr=!0;else{if((i.lanes&d)===0&&(s.flags&128)===0)return vr=!1,SM(i,s,d);vr=(i.flags&131072)!==0}else vr=!1,ut&&(s.flags&1048576)!==0&&yb(s,Tc,s.index);switch(s.lanes=0,s.tag){case 2:var p=s.type;Qc(i,s),i=s.pendingProps;var x=Ro(s,Zt.current);Uo(s,d),x=ip(null,s,p,i,x,d);var w=ap();return s.flags|=1,typeof x=="object"&&x!==null&&typeof x.render=="function"&&x.$$typeof===void 0?(s.tag=1,s.memoizedState=null,s.updateQueue=null,gr(p)?(w=!0,_c(s)):w=!1,s.memoizedState=x.state!==null&&x.state!==void 0?x.state:null,Xm(s),x.updater=Vc,s.stateNode=x,x._reactInternals=s,dp(s,p,i,d),s=pp(null,s,p,!0,w,d)):(s.tag=0,ut&&w&&Bm(s),lr(null,s,x,d),s=s.child),s;case 16:p=s.elementType;e:{switch(Qc(i,s),i=s.pendingProps,x=p._init,p=x(p._payload),s.type=p,x=s.tag=zM(p),i=sn(p,i),x){case 0:s=mp(null,s,p,i,d);break e;case 1:s=d1(null,s,p,i,d);break e;case 11:s=o1(null,s,p,i,d);break e;case 14:s=s1(null,s,p,sn(p.type,i),d);break e}throw Error(r(306,p,""))}return s;case 0:return p=s.type,x=s.pendingProps,x=s.elementType===p?x:sn(p,x),mp(i,s,p,x,d);case 1:return p=s.type,x=s.pendingProps,x=s.elementType===p?x:sn(p,x),d1(i,s,p,x,d);case 3:e:{if(f1(s),i===null)throw Error(r(387));p=s.pendingProps,w=s.memoizedState,x=w.element,Ab(i,s),Fc(s,p,null,d);var C=s.memoizedState;if(p=C.element,w.isDehydrated)if(w={element:p,isDehydrated:!1,cache:C.cache,pendingSuspenseBoundaries:C.pendingSuspenseBoundaries,transitions:C.transitions},s.updateQueue.baseState=w,s.memoizedState=w,s.flags&256){x=Wo(Error(r(423)),s),s=h1(i,s,p,d,x);break e}else if(p!==x){x=Wo(Error(r(424)),s),s=h1(i,s,p,d,x);break e}else for(Pr=Ii(s.stateNode.containerInfo.firstChild),Cr=s,ut=!0,on=null,d=Nb(s,null,p,d),s.child=d;d;)d.flags=d.flags&-3|4096,d=d.sibling;else{if(zo(),p===x){s=ei(i,s,d);break e}lr(i,s,p,d)}s=s.child}return s;case 5:return Ob(s),i===null&&Wm(s),p=s.type,x=s.pendingProps,w=i!==null?i.memoizedProps:null,C=x.children,Dm(p,x)?C=null:w!==null&&Dm(p,w)&&(s.flags|=32),c1(i,s),lr(i,s,C,d),s.child;case 6:return i===null&&Wm(s),null;case 13:return m1(i,s,d);case 4:return Zm(s,s.stateNode.containerInfo),p=s.pendingProps,i===null?s.child=Fo(s,null,p,d):lr(i,s,p,d),s.child;case 11:return p=s.type,x=s.pendingProps,x=s.elementType===p?x:sn(p,x),o1(i,s,p,x,d);case 7:return lr(i,s,s.pendingProps,d),s.child;case 8:return lr(i,s,s.pendingProps.children,d),s.child;case 12:return lr(i,s,s.pendingProps.children,d),s.child;case 10:e:{if(p=s.type._context,x=s.pendingProps,w=s.memoizedProps,C=x.value,tt(Lc,p._currentValue),p._currentValue=C,w!==null)if(an(w.value,C)){if(w.children===x.children&&!pr.current){s=ei(i,s,d);break e}}else for(w=s.child,w!==null&&(w.return=s);w!==null;){var T=w.dependencies;if(T!==null){C=w.child;for(var R=T.firstContext;R!==null;){if(R.context===p){if(w.tag===1){R=Jn(-1,d&-d),R.tag=2;var Q=w.updateQueue;if(Q!==null){Q=Q.shared;var se=Q.pending;se===null?R.next=R:(R.next=se.next,se.next=R),Q.pending=R}}w.lanes|=d,R=w.alternate,R!==null&&(R.lanes|=d),Qm(w.return,d,s),T.lanes|=d;break}R=R.next}}else if(w.tag===10)C=w.type===s.type?null:w.child;else if(w.tag===18){if(C=w.return,C===null)throw Error(r(341));C.lanes|=d,T=C.alternate,T!==null&&(T.lanes|=d),Qm(C,d,s),C=w.sibling}else C=w.child;if(C!==null)C.return=w;else for(C=w;C!==null;){if(C===s){C=null;break}if(w=C.sibling,w!==null){w.return=C.return,C=w;break}C=C.return}w=C}lr(i,s,x.children,d),s=s.child}return s;case 9:return x=s.type,p=s.pendingProps.children,Uo(s,d),x=Ur(x),p=p(x),s.flags|=1,lr(i,s,p,d),s.child;case 14:return p=s.type,x=sn(p,s.pendingProps),x=sn(p.type,x),s1(i,s,p,x,d);case 15:return l1(i,s,s.type,s.pendingProps,d);case 17:return p=s.type,x=s.pendingProps,x=s.elementType===p?x:sn(p,x),Qc(i,s),s.tag=1,gr(p)?(i=!0,_c(s)):i=!1,Uo(s,d),Jb(s,p,x),dp(s,p,x,d),pp(null,s,p,!0,i,d);case 19:return g1(i,s,d);case 22:return u1(i,s,d)}throw Error(r(156,s.tag))};function F1(i,s){return xx(i,s)}function $M(i,s,d,p){this.tag=i,this.key=d,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=s,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=p,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Kr(i,s,d,p){return new $M(i,s,d,p)}function Dp(i){return i=i.prototype,!(!i||!i.isReactComponent)}function zM(i){if(typeof i=="function")return Dp(i)?1:0;if(i!=null){if(i=i.$$typeof,i===U)return 11;if(i===ge)return 14}return 2}function Wi(i,s){var d=i.alternate;return d===null?(d=Kr(i.tag,s,i.key,i.mode),d.elementType=i.elementType,d.type=i.type,d.stateNode=i.stateNode,d.alternate=i,i.alternate=d):(d.pendingProps=s,d.type=i.type,d.flags=0,d.subtreeFlags=0,d.deletions=null),d.flags=i.flags&14680064,d.childLanes=i.childLanes,d.lanes=i.lanes,d.child=i.child,d.memoizedProps=i.memoizedProps,d.memoizedState=i.memoizedState,d.updateQueue=i.updateQueue,s=i.dependencies,d.dependencies=s===null?null:{lanes:s.lanes,firstContext:s.firstContext},d.sibling=i.sibling,d.index=i.index,d.ref=i.ref,d}function od(i,s,d,p,x,w){var C=2;if(p=i,typeof i=="function")Dp(i)&&(C=1);else if(typeof i=="string")C=5;else e:switch(i){case D:return Ma(d.children,x,w,s);case B:C=8,x|=8;break;case F:return i=Kr(12,d,s,x|2),i.elementType=F,i.lanes=w,i;case me:return i=Kr(13,d,s,x),i.elementType=me,i.lanes=w,i;case ue:return i=Kr(19,d,s,x),i.elementType=ue,i.lanes=w,i;case oe:return sd(d,x,w,s);default:if(typeof i=="object"&&i!==null)switch(i.$$typeof){case z:C=10;break e;case Y:C=9;break e;case U:C=11;break e;case ge:C=14;break e;case ie:C=16,p=null;break e}throw Error(r(130,i==null?i:typeof i,""))}return s=Kr(C,d,s,x),s.elementType=i,s.type=p,s.lanes=w,s}function Ma(i,s,d,p){return i=Kr(7,i,p,s),i.lanes=d,i}function sd(i,s,d,p){return i=Kr(22,i,p,s),i.elementType=oe,i.lanes=d,i.stateNode={isHidden:!1},i}function Rp(i,s,d){return i=Kr(6,i,null,s),i.lanes=d,i}function Lp(i,s,d){return s=Kr(4,i.children!==null?i.children:[],i.key,s),s.lanes=d,s.stateNode={containerInfo:i.containerInfo,pendingChildren:null,implementation:i.implementation},s}function FM(i,s,d,p,x){this.tag=s,this.containerInfo=i,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=cm(0),this.expirationTimes=cm(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=cm(0),this.identifierPrefix=p,this.onRecoverableError=x,this.mutableSourceEagerHydrationData=null}function $p(i,s,d,p,x,w,C,T,R){return i=new FM(i,s,d,T,R),s===1?(s=1,w===!0&&(s|=8)):s=0,w=Kr(3,null,null,s),i.current=w,w.stateNode=i,w.memoizedState={element:p,isDehydrated:d,cache:null,transitions:null,pendingSuspenseBoundaries:null},Xm(w),i}function BM(i,s,d){var p=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}return e(),Kp.exports=t3(),Kp.exports}var tw;function r3(){if(tw)return pd;tw=1;var e=cN();return pd.createRoot=e.createRoot,pd.hydrateRoot=e.hydrateRoot,pd}var n3=r3();const i3=dy(n3);var Bu=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},Qa,ta,ys,eN,a3=(eN=class extends Bu{constructor(){super();De(this,Qa);De(this,ta);De(this,ys);ye(this,ys,t=>{if(typeof window<"u"&&window.addEventListener){const r=()=>t();return window.addEventListener("visibilitychange",r,!1),()=>{window.removeEventListener("visibilitychange",r)}}})}onSubscribe(){L(this,ta)||this.setEventListener(L(this,ys))}onUnsubscribe(){var t;this.hasListeners()||((t=L(this,ta))==null||t.call(this),ye(this,ta,void 0))}setEventListener(t){var r;ye(this,ys,t),(r=L(this,ta))==null||r.call(this),ye(this,ta,t(n=>{typeof n=="boolean"?this.setFocused(n):this.onFocus()}))}setFocused(t){L(this,Qa)!==t&&(ye(this,Qa,t),this.onFocus())}onFocus(){const t=this.isFocused();this.listeners.forEach(r=>{r(t)})}isFocused(){var t;return typeof L(this,Qa)=="boolean"?L(this,Qa):((t=globalThis.document)==null?void 0:t.visibilityState)!=="hidden"}},Qa=new WeakMap,ta=new WeakMap,ys=new WeakMap,eN),hy=new a3,o3={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e),setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)},ra,cy,tN,s3=(tN=class{constructor(){De(this,ra,o3);De(this,cy,!1)}setTimeoutProvider(e){ye(this,ra,e)}setTimeout(e,t){return L(this,ra).setTimeout(e,t)}clearTimeout(e){L(this,ra).clearTimeout(e)}setInterval(e,t){return L(this,ra).setInterval(e,t)}clearInterval(e){L(this,ra).clearInterval(e)}},ra=new WeakMap,cy=new WeakMap,tN),Ua=new s3;function l3(e){setTimeout(e,0)}var u3=typeof window>"u"||"Deno"in globalThis;function kr(){}function c3(e,t){return typeof e=="function"?e(t):e}function Bg(e){return typeof e=="number"&&e>=0&&e!==1/0}function dN(e,t){return Math.max(e+(t||0)-Date.now(),0)}function ca(e,t){return typeof e=="function"?e(t):e}function Tr(e,t){return typeof e=="function"?e(t):e}function rw(e,t){const{type:r="all",exact:n,fetchStatus:a,predicate:o,queryKey:u,stale:c}=e;if(u){if(n){if(t.queryHash!==my(u,t.options))return!1}else if(!gu(t.queryKey,u))return!1}if(r!=="all"){const f=t.isActive();if(r==="active"&&!f||r==="inactive"&&f)return!1}return!(typeof c=="boolean"&&t.isStale()!==c||a&&a!==t.state.fetchStatus||o&&!o(t))}function nw(e,t){const{exact:r,status:n,predicate:a,mutationKey:o}=e;if(o){if(!t.options.mutationKey)return!1;if(r){if(pu(t.options.mutationKey)!==pu(o))return!1}else if(!gu(t.options.mutationKey,o))return!1}return!(n&&t.state.status!==n||a&&!a(t))}function my(e,t){return((t==null?void 0:t.queryKeyHashFn)||pu)(e)}function pu(e){return JSON.stringify(e,(t,r)=>Hg(r)?Object.keys(r).sort().reduce((n,a)=>(n[a]=r[a],n),{}):r)}function gu(e,t){return e===t?!0:typeof e!=typeof t?!1:e&&t&&typeof e=="object"&&typeof t=="object"?Object.keys(t).every(r=>gu(e[r],t[r])):!1}var d3=Object.prototype.hasOwnProperty;function fN(e,t,r=0){if(e===t)return e;if(r>500)return t;const n=iw(e)&&iw(t);if(!n&&!(Hg(e)&&Hg(t)))return t;const o=(n?e:Object.keys(e)).length,u=n?t:Object.keys(t),c=u.length,f=n?new Array(c):{};let h=0;for(let m=0;m{Ua.setTimeout(t,e)})}function Wg(e,t,r){return typeof r.structuralSharing=="function"?r.structuralSharing(e,t):r.structuralSharing!==!1?fN(e,t):t}function h3(e,t,r=0){const n=[...e,t];return r&&n.length>r?n.slice(1):n}function m3(e,t,r=0){const n=[t,...e];return r&&n.length>r?n.slice(0,-1):n}var py=Symbol();function hN(e,t){return!e.queryFn&&(t!=null&&t.initialPromise)?()=>t.initialPromise:!e.queryFn||e.queryFn===py?()=>Promise.reject(new Error(`Missing queryFn: '${e.queryHash}'`)):e.queryFn}function mN(e,t){return typeof e=="function"?e(...t):!!e}function p3(e,t,r){let n=!1,a;return Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(a??(a=t()),n||(n=!0,a.aborted?r():a.addEventListener("abort",r,{once:!0})),a)}),e}var vu=(()=>{let e=()=>u3;return{isServer(){return e()},setIsServer(t){e=t}}})();function Kg(){let e,t;const r=new Promise((a,o)=>{e=a,t=o});r.status="pending",r.catch(()=>{});function n(a){Object.assign(r,a),delete r.resolve,delete r.reject}return r.resolve=a=>{n({status:"fulfilled",value:a}),e(a)},r.reject=a=>{n({status:"rejected",reason:a}),t(a)},r}var g3=l3;function v3(){let e=[],t=0,r=c=>{c()},n=c=>{c()},a=g3;const o=c=>{t?e.push(c):a(()=>{r(c)})},u=()=>{const c=e;e=[],c.length&&a(()=>{n(()=>{c.forEach(f=>{r(f)})})})};return{batch:c=>{let f;t++;try{f=c()}finally{t--,t||u()}return f},batchCalls:c=>(...f)=>{o(()=>{c(...f)})},schedule:o,setNotifyFunction:c=>{r=c},setBatchNotifyFunction:c=>{n=c},setScheduler:c=>{a=c}}}var Gt=v3(),xs,na,bs,rN,y3=(rN=class extends Bu{constructor(){super();De(this,xs,!0);De(this,na);De(this,bs);ye(this,bs,t=>{if(typeof window<"u"&&window.addEventListener){const r=()=>t(!0),n=()=>t(!1);return window.addEventListener("online",r,!1),window.addEventListener("offline",n,!1),()=>{window.removeEventListener("online",r),window.removeEventListener("offline",n)}}})}onSubscribe(){L(this,na)||this.setEventListener(L(this,bs))}onUnsubscribe(){var t;this.hasListeners()||((t=L(this,na))==null||t.call(this),ye(this,na,void 0))}setEventListener(t){var r;ye(this,bs,t),(r=L(this,na))==null||r.call(this),ye(this,na,t(this.setOnline.bind(this)))}setOnline(t){L(this,xs)!==t&&(ye(this,xs,t),this.listeners.forEach(n=>{n(t)}))}isOnline(){return L(this,xs)}},xs=new WeakMap,na=new WeakMap,bs=new WeakMap,rN),Xd=new y3;function x3(e){return Math.min(1e3*2**e,3e4)}function pN(e){return(e??"online")==="online"?Xd.isOnline():!0}var Gg=class extends Error{constructor(e){super("CancelledError"),this.revert=e==null?void 0:e.revert,this.silent=e==null?void 0:e.silent}};function gN(e){let t=!1,r=0,n;const a=Kg(),o=()=>a.status!=="pending",u=k=>{var S;if(!o()){const N=new Gg(k);v(N),(S=e.onCancel)==null||S.call(e,N)}},c=()=>{t=!0},f=()=>{t=!1},h=()=>hy.isFocused()&&(e.networkMode==="always"||Xd.isOnline())&&e.canRun(),m=()=>pN(e.networkMode)&&e.canRun(),g=k=>{o()||(n==null||n(),a.resolve(k))},v=k=>{o()||(n==null||n(),a.reject(k))},b=()=>new Promise(k=>{var S;n=N=>{(o()||h())&&k(N)},(S=e.onPause)==null||S.call(e)}).then(()=>{var k;n=void 0,o()||(k=e.onContinue)==null||k.call(e)}),j=()=>{if(o())return;let k;const S=r===0?e.initialPromise:void 0;try{k=S??e.fn()}catch(N){k=Promise.reject(N)}Promise.resolve(k).then(g).catch(N=>{var O;if(o())return;const E=e.retry??(vu.isServer()?0:3),A=e.retryDelay??x3,P=typeof A=="function"?A(r,N):A,M=E===!0||typeof E=="number"&&rh()?void 0:b()).then(()=>{t?v(N):j()})})};return{promise:a,status:()=>a.status,cancel:u,continue:()=>(n==null||n(),a),cancelRetry:c,continueRetry:f,canStart:m,start:()=>(m()?j():b().then(j),a)}}var Ya,nN,vN=(nN=class{constructor(){De(this,Ya)}destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),Bg(this.gcTime)&&ye(this,Ya,Ua.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(vu.isServer()?1/0:300*1e3))}clearGcTimeout(){L(this,Ya)!==void 0&&(Ua.clearTimeout(L(this,Ya)),ye(this,Ya,void 0))}},Ya=new WeakMap,nN);function b3(e){return{onFetch:(t,r)=>{var m,g,v,b,j;const n=t.options,a=(v=(g=(m=t.fetchOptions)==null?void 0:m.meta)==null?void 0:g.fetchMore)==null?void 0:v.direction,o=((b=t.state.data)==null?void 0:b.pages)||[],u=((j=t.state.data)==null?void 0:j.pageParams)||[];let c={pages:[],pageParams:[]},f=0;const h=async()=>{let k=!1;const S=A=>{p3(A,()=>t.signal,()=>k=!0)},N=hN(t.options,t.fetchOptions),E=async(A,P,M)=>{if(k)return Promise.reject(t.signal.reason);if(P==null&&A.pages.length)return Promise.resolve(A);const D=(()=>{const Y={client:t.client,queryKey:t.queryKey,pageParam:P,direction:M?"backward":"forward",meta:t.options.meta};return S(Y),Y})(),B=await N(D),{maxPages:F}=t.options,z=M?m3:h3;return{pages:z(A.pages,B,F),pageParams:z(A.pageParams,P,F)}};if(a&&o.length){const A=a==="backward",P=A?w3:ow,M={pages:o,pageParams:u},O=P(n,M);c=await E(M,O,A)}else{const A=e??o.length;do{const P=f===0?u[0]??n.initialPageParam:ow(n,c);if(f>0&&P==null)break;c=await E(c,P),f++}while(f{var k,S;return(S=(k=t.options).persister)==null?void 0:S.call(k,h,{client:t.client,queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},r)}:t.fetchFn=h}}}function ow(e,{pages:t,pageParams:r}){const n=t.length-1;return t.length>0?e.getNextPageParam(t[n],t,r[n],r):void 0}function w3(e,{pages:t,pageParams:r}){var n;return t.length>0?(n=e.getPreviousPageParam)==null?void 0:n.call(e,t[0],t,r[0],r):void 0}var ws,Xa,ks,Vr,Za,Tt,Ru,Ja,Ir,yN,ni,iN,k3=(iN=class extends vN{constructor(t){super();De(this,Ir);De(this,ws);De(this,Xa);De(this,ks);De(this,Vr);De(this,Za);De(this,Tt);De(this,Ru);De(this,Ja);ye(this,Ja,!1),ye(this,Ru,t.defaultOptions),this.setOptions(t.options),this.observers=[],ye(this,Za,t.client),ye(this,Vr,L(this,Za).getQueryCache()),this.queryKey=t.queryKey,this.queryHash=t.queryHash,ye(this,Xa,lw(this.options)),this.state=t.state??L(this,Xa),this.scheduleGc()}get meta(){return this.options.meta}get queryType(){return L(this,ws)}get promise(){var t;return(t=L(this,Tt))==null?void 0:t.promise}setOptions(t){if(this.options={...L(this,Ru),...t},t!=null&&t._type&&ye(this,ws,t._type),this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){const r=lw(this.options);r.data!==void 0&&(this.setState(sw(r.data,r.dataUpdatedAt)),ye(this,Xa,r))}}optionalRemove(){!this.observers.length&&this.state.fetchStatus==="idle"&&L(this,Vr).remove(this)}setData(t,r){const n=Wg(this.state.data,t,this.options);return Ue(this,Ir,ni).call(this,{data:n,type:"success",dataUpdatedAt:r==null?void 0:r.updatedAt,manual:r==null?void 0:r.manual}),n}setState(t){Ue(this,Ir,ni).call(this,{type:"setState",state:t})}cancel(t){var n,a;const r=(n=L(this,Tt))==null?void 0:n.promise;return(a=L(this,Tt))==null||a.cancel(t),r?r.then(kr).catch(kr):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return L(this,Xa)}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(t=>Tr(t.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===py||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0?this.observers.some(t=>ca(t.options.staleTime,this)==="static"):!1}isStale(){return this.getObserversCount()>0?this.observers.some(t=>t.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(t=0){return this.state.data===void 0?!0:t==="static"?!1:this.state.isInvalidated?!0:!dN(this.state.dataUpdatedAt,t)}onFocus(){var r;const t=this.observers.find(n=>n.shouldFetchOnWindowFocus());t==null||t.refetch({cancelRefetch:!1}),(r=L(this,Tt))==null||r.continue()}onOnline(){var r;const t=this.observers.find(n=>n.shouldFetchOnReconnect());t==null||t.refetch({cancelRefetch:!1}),(r=L(this,Tt))==null||r.continue()}addObserver(t){this.observers.includes(t)||(this.observers.push(t),this.clearGcTimeout(),L(this,Vr).notify({type:"observerAdded",query:this,observer:t}))}removeObserver(t){this.observers.includes(t)&&(this.observers=this.observers.filter(r=>r!==t),this.observers.length||(L(this,Tt)&&(L(this,Ja)||Ue(this,Ir,yN).call(this)?L(this,Tt).cancel({revert:!0}):L(this,Tt).cancelRetry()),this.scheduleGc()),L(this,Vr).notify({type:"observerRemoved",query:this,observer:t}))}getObserversCount(){return this.observers.length}invalidate(){this.state.isInvalidated||Ue(this,Ir,ni).call(this,{type:"invalidate"})}async fetch(t,r){var h,m,g,v,b,j,k,S,N,E,A;if(this.state.fetchStatus!=="idle"&&((h=L(this,Tt))==null?void 0:h.status())!=="rejected"){if(this.state.data!==void 0&&(r!=null&&r.cancelRefetch))this.cancel({silent:!0});else if(L(this,Tt))return L(this,Tt).continueRetry(),L(this,Tt).promise}if(t&&this.setOptions(t),!this.options.queryFn){const P=this.observers.find(M=>M.options.queryFn);P&&this.setOptions(P.options)}const n=new AbortController,a=P=>{Object.defineProperty(P,"signal",{enumerable:!0,get:()=>(ye(this,Ja,!0),n.signal)})},o=()=>{const P=hN(this.options,r),O=(()=>{const D={client:L(this,Za),queryKey:this.queryKey,meta:this.meta};return a(D),D})();return ye(this,Ja,!1),this.options.persister?this.options.persister(P,O,this):P(O)},c=(()=>{const P={fetchOptions:r,options:this.options,queryKey:this.queryKey,client:L(this,Za),state:this.state,fetchFn:o};return a(P),P})(),f=L(this,ws)==="infinite"?b3(this.options.pages):this.options.behavior;f==null||f.onFetch(c,this),ye(this,ks,this.state),(this.state.fetchStatus==="idle"||this.state.fetchMeta!==((m=c.fetchOptions)==null?void 0:m.meta))&&Ue(this,Ir,ni).call(this,{type:"fetch",meta:(g=c.fetchOptions)==null?void 0:g.meta}),ye(this,Tt,gN({initialPromise:r==null?void 0:r.initialPromise,fn:c.fetchFn,onCancel:P=>{P instanceof Gg&&P.revert&&this.setState({...L(this,ks),fetchStatus:"idle"}),n.abort()},onFail:(P,M)=>{Ue(this,Ir,ni).call(this,{type:"failed",failureCount:P,error:M})},onPause:()=>{Ue(this,Ir,ni).call(this,{type:"pause"})},onContinue:()=>{Ue(this,Ir,ni).call(this,{type:"continue"})},retry:c.options.retry,retryDelay:c.options.retryDelay,networkMode:c.options.networkMode,canRun:()=>!0}));try{const P=await L(this,Tt).start();if(P===void 0)throw new Error(`${this.queryHash} data is undefined`);return this.setData(P),(b=(v=L(this,Vr).config).onSuccess)==null||b.call(v,P,this),(k=(j=L(this,Vr).config).onSettled)==null||k.call(j,P,this.state.error,this),P}catch(P){if(P instanceof Gg){if(P.silent)return L(this,Tt).promise;if(P.revert){if(this.state.data===void 0)throw P;return this.state.data}}throw Ue(this,Ir,ni).call(this,{type:"error",error:P}),(N=(S=L(this,Vr).config).onError)==null||N.call(S,P,this),(A=(E=L(this,Vr).config).onSettled)==null||A.call(E,this.state.data,P,this),P}finally{this.scheduleGc()}}},ws=new WeakMap,Xa=new WeakMap,ks=new WeakMap,Vr=new WeakMap,Za=new WeakMap,Tt=new WeakMap,Ru=new WeakMap,Ja=new WeakMap,Ir=new WeakSet,yN=function(){return this.state.fetchStatus==="paused"&&this.state.status==="pending"},ni=function(t){const r=n=>{switch(t.type){case"failed":return{...n,fetchFailureCount:t.failureCount,fetchFailureReason:t.error};case"pause":return{...n,fetchStatus:"paused"};case"continue":return{...n,fetchStatus:"fetching"};case"fetch":return{...n,...xN(n.data,this.options),fetchMeta:t.meta??null};case"success":const a={...n,...sw(t.data,t.dataUpdatedAt),dataUpdateCount:n.dataUpdateCount+1,...!t.manual&&{fetchStatus:"idle",fetchFailureCount:0,fetchFailureReason:null}};return ye(this,ks,t.manual?a:void 0),a;case"error":const o=t.error;return{...n,error:o,errorUpdateCount:n.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:n.fetchFailureCount+1,fetchFailureReason:o,fetchStatus:"idle",status:"error",isInvalidated:!0};case"invalidate":return{...n,isInvalidated:!0};case"setState":return{...n,...t.state}}};this.state=r(this.state),Gt.batch(()=>{this.observers.forEach(n=>{n.onQueryUpdate()}),L(this,Vr).notify({query:this,type:"updated",action:t})})},iN);function xN(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:pN(t.networkMode)?"fetching":"paused",...e===void 0&&{error:null,status:"pending"}}}function sw(e,t){return{data:e,dataUpdatedAt:t??Date.now(),error:null,isInvalidated:!1,status:"success"}}function lw(e){const t=typeof e.initialData=="function"?e.initialData():e.initialData,r=t!==void 0,n=r?typeof e.initialDataUpdatedAt=="function"?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:r?n??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:r?"success":"pending",fetchStatus:"idle"}}var wr,We,Lu,cr,eo,js,ai,ia,$u,Ss,Ns,to,ro,aa,Es,Xe,ou,Vg,qg,Qg,Yg,Xg,Zg,Jg,bN,aN,j3=(aN=class extends Bu{constructor(t,r){super();De(this,Xe);De(this,wr);De(this,We);De(this,Lu);De(this,cr);De(this,eo);De(this,js);De(this,ai);De(this,ia);De(this,$u);De(this,Ss);De(this,Ns);De(this,to);De(this,ro);De(this,aa);De(this,Es,new Set);this.options=r,ye(this,wr,t),ye(this,ia,null),ye(this,ai,Kg()),this.bindMethods(),this.setOptions(r)}bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(L(this,We).addObserver(this),uw(L(this,We),this.options)?Ue(this,Xe,ou).call(this):this.updateResult(),Ue(this,Xe,Yg).call(this))}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return ev(L(this,We),this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return ev(L(this,We),this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,Ue(this,Xe,Xg).call(this),Ue(this,Xe,Zg).call(this),L(this,We).removeObserver(this)}setOptions(t){const r=this.options,n=L(this,We);if(this.options=L(this,wr).defaultQueryOptions(t),this.options.enabled!==void 0&&typeof this.options.enabled!="boolean"&&typeof this.options.enabled!="function"&&typeof Tr(this.options.enabled,L(this,We))!="boolean")throw new Error("Expected enabled to be a boolean or a callback that returns a boolean");Ue(this,Xe,Jg).call(this),L(this,We).setOptions(this.options),r._defaulted&&!Ug(this.options,r)&&L(this,wr).getQueryCache().notify({type:"observerOptionsUpdated",query:L(this,We),observer:this});const a=this.hasListeners();a&&cw(L(this,We),n,this.options,r)&&Ue(this,Xe,ou).call(this),this.updateResult(),a&&(L(this,We)!==n||Tr(this.options.enabled,L(this,We))!==Tr(r.enabled,L(this,We))||ca(this.options.staleTime,L(this,We))!==ca(r.staleTime,L(this,We)))&&Ue(this,Xe,Vg).call(this);const o=Ue(this,Xe,qg).call(this);a&&(L(this,We)!==n||Tr(this.options.enabled,L(this,We))!==Tr(r.enabled,L(this,We))||o!==L(this,aa))&&Ue(this,Xe,Qg).call(this,o)}getOptimisticResult(t){const r=L(this,wr).getQueryCache().build(L(this,wr),t),n=this.createResult(r,t);return N3(this,n)&&(ye(this,cr,n),ye(this,js,this.options),ye(this,eo,L(this,We).state)),n}getCurrentResult(){return L(this,cr)}trackResult(t,r){return new Proxy(t,{get:(n,a)=>(this.trackProp(a),r==null||r(a),a==="promise"&&(this.trackProp("data"),!this.options.experimental_prefetchInRender&&L(this,ai).status==="pending"&&L(this,ai).reject(new Error("experimental_prefetchInRender feature flag is not enabled"))),Reflect.get(n,a))})}trackProp(t){L(this,Es).add(t)}getCurrentQuery(){return L(this,We)}refetch({...t}={}){return this.fetch({...t})}fetchOptimistic(t){const r=L(this,wr).defaultQueryOptions(t),n=L(this,wr).getQueryCache().build(L(this,wr),r);return n.fetch().then(()=>this.createResult(n,r))}fetch(t){return Ue(this,Xe,ou).call(this,{...t,cancelRefetch:t.cancelRefetch??!0}).then(()=>(this.updateResult(),L(this,cr)))}createResult(t,r){var F;const n=L(this,We),a=this.options,o=L(this,cr),u=L(this,eo),c=L(this,js),h=t!==n?t.state:L(this,Lu),{state:m}=t;let g={...m},v=!1,b;if(r._optimisticResults){const z=this.hasListeners(),Y=!z&&uw(t,r),U=z&&cw(t,n,r,a);(Y||U)&&(g={...g,...xN(m.data,t.options)}),r._optimisticResults==="isRestoring"&&(g.fetchStatus="idle")}let{error:j,errorUpdatedAt:k,status:S}=g;b=g.data;let N=!1;if(r.placeholderData!==void 0&&b===void 0&&S==="pending"){let z;o!=null&&o.isPlaceholderData&&r.placeholderData===(c==null?void 0:c.placeholderData)?(z=o.data,N=!0):z=typeof r.placeholderData=="function"?r.placeholderData((F=L(this,Ns))==null?void 0:F.state.data,L(this,Ns)):r.placeholderData,z!==void 0&&(S="success",b=Wg(o==null?void 0:o.data,z,r),v=!0)}if(r.select&&b!==void 0&&!N)if(o&&b===(u==null?void 0:u.data)&&r.select===L(this,$u))b=L(this,Ss);else try{ye(this,$u,r.select),b=r.select(b),b=Wg(o==null?void 0:o.data,b,r),ye(this,Ss,b),ye(this,ia,null)}catch(z){ye(this,ia,z)}L(this,ia)&&(j=L(this,ia),b=L(this,Ss),k=Date.now(),S="error");const E=g.fetchStatus==="fetching",A=S==="pending",P=S==="error",M=A&&E,O=b!==void 0,B={status:S,fetchStatus:g.fetchStatus,isPending:A,isSuccess:S==="success",isError:P,isInitialLoading:M,isLoading:M,data:b,dataUpdatedAt:g.dataUpdatedAt,error:j,errorUpdatedAt:k,failureCount:g.fetchFailureCount,failureReason:g.fetchFailureReason,errorUpdateCount:g.errorUpdateCount,isFetched:t.isFetched(),isFetchedAfterMount:g.dataUpdateCount>h.dataUpdateCount||g.errorUpdateCount>h.errorUpdateCount,isFetching:E,isRefetching:E&&!A,isLoadingError:P&&!O,isPaused:g.fetchStatus==="paused",isPlaceholderData:v,isRefetchError:P&&O,isStale:gy(t,r),refetch:this.refetch,promise:L(this,ai),isEnabled:Tr(r.enabled,t)!==!1};if(this.options.experimental_prefetchInRender){const z=B.data!==void 0,Y=B.status==="error"&&!z,U=ge=>{Y?ge.reject(B.error):z&&ge.resolve(B.data)},me=()=>{const ge=ye(this,ai,B.promise=Kg());U(ge)},ue=L(this,ai);switch(ue.status){case"pending":t.queryHash===n.queryHash&&U(ue);break;case"fulfilled":(Y||B.data!==ue.value)&&me();break;case"rejected":(!Y||B.error!==ue.reason)&&me();break}}return B}updateResult(){const t=L(this,cr),r=this.createResult(L(this,We),this.options);if(ye(this,eo,L(this,We).state),ye(this,js,this.options),L(this,eo).data!==void 0&&ye(this,Ns,L(this,We)),Ug(r,t))return;ye(this,cr,r);const n=()=>{if(!t)return!0;const{notifyOnChangeProps:a}=this.options,o=typeof a=="function"?a():a;if(o==="all"||!o&&!L(this,Es).size)return!0;const u=new Set(o??L(this,Es));return this.options.throwOnError&&u.add("error"),Object.keys(L(this,cr)).some(c=>{const f=c;return L(this,cr)[f]!==t[f]&&u.has(f)})};Ue(this,Xe,bN).call(this,{listeners:n()})}onQueryUpdate(){this.updateResult(),this.hasListeners()&&Ue(this,Xe,Yg).call(this)}},wr=new WeakMap,We=new WeakMap,Lu=new WeakMap,cr=new WeakMap,eo=new WeakMap,js=new WeakMap,ai=new WeakMap,ia=new WeakMap,$u=new WeakMap,Ss=new WeakMap,Ns=new WeakMap,to=new WeakMap,ro=new WeakMap,aa=new WeakMap,Es=new WeakMap,Xe=new WeakSet,ou=function(t){Ue(this,Xe,Jg).call(this);let r=L(this,We).fetch(this.options,t);return t!=null&&t.throwOnError||(r=r.catch(kr)),r},Vg=function(){Ue(this,Xe,Xg).call(this);const t=ca(this.options.staleTime,L(this,We));if(vu.isServer()||L(this,cr).isStale||!Bg(t))return;const n=dN(L(this,cr).dataUpdatedAt,t)+1;ye(this,to,Ua.setTimeout(()=>{L(this,cr).isStale||this.updateResult()},n))},qg=function(){return(typeof this.options.refetchInterval=="function"?this.options.refetchInterval(L(this,We)):this.options.refetchInterval)??!1},Qg=function(t){Ue(this,Xe,Zg).call(this),ye(this,aa,t),!(vu.isServer()||Tr(this.options.enabled,L(this,We))===!1||!Bg(L(this,aa))||L(this,aa)===0)&&ye(this,ro,Ua.setInterval(()=>{(this.options.refetchIntervalInBackground||hy.isFocused())&&Ue(this,Xe,ou).call(this)},L(this,aa)))},Yg=function(){Ue(this,Xe,Vg).call(this),Ue(this,Xe,Qg).call(this,Ue(this,Xe,qg).call(this))},Xg=function(){L(this,to)!==void 0&&(Ua.clearTimeout(L(this,to)),ye(this,to,void 0))},Zg=function(){L(this,ro)!==void 0&&(Ua.clearInterval(L(this,ro)),ye(this,ro,void 0))},Jg=function(){const t=L(this,wr).getQueryCache().build(L(this,wr),this.options);if(t===L(this,We))return;const r=L(this,We);ye(this,We,t),ye(this,Lu,t.state),this.hasListeners()&&(r==null||r.removeObserver(this),t.addObserver(this))},bN=function(t){Gt.batch(()=>{t.listeners&&this.listeners.forEach(r=>{r(L(this,cr))}),L(this,wr).getQueryCache().notify({query:L(this,We),type:"observerResultsUpdated"})})},aN);function S3(e,t){return Tr(t.enabled,e)!==!1&&e.state.data===void 0&&!(e.state.status==="error"&&Tr(t.retryOnMount,e)===!1)}function uw(e,t){return S3(e,t)||e.state.data!==void 0&&ev(e,t,t.refetchOnMount)}function ev(e,t,r){if(Tr(t.enabled,e)!==!1&&ca(t.staleTime,e)!=="static"){const n=typeof r=="function"?r(e):r;return n==="always"||n!==!1&&gy(e,t)}return!1}function cw(e,t,r,n){return(e!==t||Tr(n.enabled,e)===!1)&&(!r.suspense||e.state.status!=="error")&&gy(e,r)}function gy(e,t){return Tr(t.enabled,e)!==!1&&e.isStaleByTime(ca(t.staleTime,e))}function N3(e,t){return!Ug(e.getCurrentResult(),t)}var zu,On,rr,no,_n,Qi,oN,E3=(oN=class extends vN{constructor(t){super();De(this,_n);De(this,zu);De(this,On);De(this,rr);De(this,no);ye(this,zu,t.client),this.mutationId=t.mutationId,ye(this,rr,t.mutationCache),ye(this,On,[]),this.state=t.state||A3(),this.setOptions(t.options),this.scheduleGc()}setOptions(t){this.options=t,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(t){L(this,On).includes(t)||(L(this,On).push(t),this.clearGcTimeout(),L(this,rr).notify({type:"observerAdded",mutation:this,observer:t}))}removeObserver(t){ye(this,On,L(this,On).filter(r=>r!==t)),this.scheduleGc(),L(this,rr).notify({type:"observerRemoved",mutation:this,observer:t})}optionalRemove(){L(this,On).length||(this.state.status==="pending"?this.scheduleGc():L(this,rr).remove(this))}continue(){var t;return((t=L(this,no))==null?void 0:t.continue())??this.execute(this.state.variables)}async execute(t){var u,c,f,h,m,g,v,b,j,k,S,N,E,A,P,M,O,D;const r=()=>{Ue(this,_n,Qi).call(this,{type:"continue"})},n={client:L(this,zu),meta:this.options.meta,mutationKey:this.options.mutationKey};ye(this,no,gN({fn:()=>this.options.mutationFn?this.options.mutationFn(t,n):Promise.reject(new Error("No mutationFn found")),onFail:(B,F)=>{Ue(this,_n,Qi).call(this,{type:"failed",failureCount:B,error:F})},onPause:()=>{Ue(this,_n,Qi).call(this,{type:"pause"})},onContinue:r,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>L(this,rr).canRun(this)}));const a=this.state.status==="pending",o=!L(this,no).canStart();try{if(a)r();else{Ue(this,_n,Qi).call(this,{type:"pending",variables:t,isPaused:o}),L(this,rr).config.onMutate&&await L(this,rr).config.onMutate(t,this,n);const F=await((c=(u=this.options).onMutate)==null?void 0:c.call(u,t,n));F!==this.state.context&&Ue(this,_n,Qi).call(this,{type:"pending",context:F,variables:t,isPaused:o})}const B=await L(this,no).start();return await((h=(f=L(this,rr).config).onSuccess)==null?void 0:h.call(f,B,t,this.state.context,this,n)),await((g=(m=this.options).onSuccess)==null?void 0:g.call(m,B,t,this.state.context,n)),await((b=(v=L(this,rr).config).onSettled)==null?void 0:b.call(v,B,null,this.state.variables,this.state.context,this,n)),await((k=(j=this.options).onSettled)==null?void 0:k.call(j,B,null,t,this.state.context,n)),Ue(this,_n,Qi).call(this,{type:"success",data:B}),B}catch(B){try{await((N=(S=L(this,rr).config).onError)==null?void 0:N.call(S,B,t,this.state.context,this,n))}catch(F){Promise.reject(F)}try{await((A=(E=this.options).onError)==null?void 0:A.call(E,B,t,this.state.context,n))}catch(F){Promise.reject(F)}try{await((M=(P=L(this,rr).config).onSettled)==null?void 0:M.call(P,void 0,B,this.state.variables,this.state.context,this,n))}catch(F){Promise.reject(F)}try{await((D=(O=this.options).onSettled)==null?void 0:D.call(O,void 0,B,t,this.state.context,n))}catch(F){Promise.reject(F)}throw Ue(this,_n,Qi).call(this,{type:"error",error:B}),B}finally{L(this,rr).runNext(this)}}},zu=new WeakMap,On=new WeakMap,rr=new WeakMap,no=new WeakMap,_n=new WeakSet,Qi=function(t){const r=n=>{switch(t.type){case"failed":return{...n,failureCount:t.failureCount,failureReason:t.error};case"pause":return{...n,isPaused:!0};case"continue":return{...n,isPaused:!1};case"pending":return{...n,context:t.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:t.isPaused,status:"pending",variables:t.variables,submittedAt:Date.now()};case"success":return{...n,data:t.data,failureCount:0,failureReason:null,error:null,status:"success",isPaused:!1};case"error":return{...n,data:void 0,error:t.error,failureCount:n.failureCount+1,failureReason:t.error,isPaused:!1,status:"error"}}};this.state=r(this.state),Gt.batch(()=>{L(this,On).forEach(n=>{n.onMutationUpdate(t)}),L(this,rr).notify({mutation:this,type:"updated",action:t})})},oN);function A3(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}var oi,fn,Fu,sN,C3=(sN=class extends Bu{constructor(t={}){super();De(this,oi);De(this,fn);De(this,Fu);this.config=t,ye(this,oi,new Set),ye(this,fn,new Map),ye(this,Fu,0)}build(t,r,n){const a=new E3({client:t,mutationCache:this,mutationId:++md(this,Fu)._,options:t.defaultMutationOptions(r),state:n});return this.add(a),a}add(t){L(this,oi).add(t);const r=gd(t);if(typeof r=="string"){const n=L(this,fn).get(r);n?n.push(t):L(this,fn).set(r,[t])}this.notify({type:"added",mutation:t})}remove(t){if(L(this,oi).delete(t)){const r=gd(t);if(typeof r=="string"){const n=L(this,fn).get(r);if(n)if(n.length>1){const a=n.indexOf(t);a!==-1&&n.splice(a,1)}else n[0]===t&&L(this,fn).delete(r)}}this.notify({type:"removed",mutation:t})}canRun(t){const r=gd(t);if(typeof r=="string"){const n=L(this,fn).get(r),a=n==null?void 0:n.find(o=>o.state.status==="pending");return!a||a===t}else return!0}runNext(t){var n;const r=gd(t);if(typeof r=="string"){const a=(n=L(this,fn).get(r))==null?void 0:n.find(o=>o!==t&&o.state.isPaused);return(a==null?void 0:a.continue())??Promise.resolve()}else return Promise.resolve()}clear(){Gt.batch(()=>{L(this,oi).forEach(t=>{this.notify({type:"removed",mutation:t})}),L(this,oi).clear(),L(this,fn).clear()})}getAll(){return Array.from(L(this,oi))}find(t){const r={exact:!0,...t};return this.getAll().find(n=>nw(r,n))}findAll(t={}){return this.getAll().filter(r=>nw(t,r))}notify(t){Gt.batch(()=>{this.listeners.forEach(r=>{r(t)})})}resumePausedMutations(){const t=this.getAll().filter(r=>r.state.isPaused);return Gt.batch(()=>Promise.all(t.map(r=>r.continue().catch(kr))))}},oi=new WeakMap,fn=new WeakMap,Fu=new WeakMap,sN);function gd(e){var t;return(t=e.options.scope)==null?void 0:t.id}var Mn,lN,P3=(lN=class extends Bu{constructor(t={}){super();De(this,Mn);this.config=t,ye(this,Mn,new Map)}build(t,r,n){const a=r.queryKey,o=r.queryHash??my(a,r);let u=this.get(o);return u||(u=new k3({client:t,queryKey:a,queryHash:o,options:t.defaultQueryOptions(r),state:n,defaultOptions:t.getQueryDefaults(a)}),this.add(u)),u}add(t){L(this,Mn).has(t.queryHash)||(L(this,Mn).set(t.queryHash,t),this.notify({type:"added",query:t}))}remove(t){const r=L(this,Mn).get(t.queryHash);r&&(t.destroy(),r===t&&L(this,Mn).delete(t.queryHash),this.notify({type:"removed",query:t}))}clear(){Gt.batch(()=>{this.getAll().forEach(t=>{this.remove(t)})})}get(t){return L(this,Mn).get(t)}getAll(){return[...L(this,Mn).values()]}find(t){const r={exact:!0,...t};return this.getAll().find(n=>rw(r,n))}findAll(t={}){const r=this.getAll();return Object.keys(t).length>0?r.filter(n=>rw(t,n)):r}notify(t){Gt.batch(()=>{this.listeners.forEach(r=>{r(t)})})}onFocus(){Gt.batch(()=>{this.getAll().forEach(t=>{t.onFocus()})})}onOnline(){Gt.batch(()=>{this.getAll().forEach(t=>{t.onOnline()})})}},Mn=new WeakMap,lN),pt,oa,sa,As,Cs,la,Ps,Os,uN,O3=(uN=class{constructor(e={}){De(this,pt);De(this,oa);De(this,sa);De(this,As);De(this,Cs);De(this,la);De(this,Ps);De(this,Os);ye(this,pt,e.queryCache||new P3),ye(this,oa,e.mutationCache||new C3),ye(this,sa,e.defaultOptions||{}),ye(this,As,new Map),ye(this,Cs,new Map),ye(this,la,0)}mount(){md(this,la)._++,L(this,la)===1&&(ye(this,Ps,hy.subscribe(async e=>{e&&(await this.resumePausedMutations(),L(this,pt).onFocus())})),ye(this,Os,Xd.subscribe(async e=>{e&&(await this.resumePausedMutations(),L(this,pt).onOnline())})))}unmount(){var e,t;md(this,la)._--,L(this,la)===0&&((e=L(this,Ps))==null||e.call(this),ye(this,Ps,void 0),(t=L(this,Os))==null||t.call(this),ye(this,Os,void 0))}isFetching(e){return L(this,pt).findAll({...e,fetchStatus:"fetching"}).length}isMutating(e){return L(this,oa).findAll({...e,status:"pending"}).length}getQueryData(e){var r;const t=this.defaultQueryOptions({queryKey:e});return(r=L(this,pt).get(t.queryHash))==null?void 0:r.state.data}ensureQueryData(e){const t=this.defaultQueryOptions(e),r=L(this,pt).build(this,t),n=r.state.data;return n===void 0?this.fetchQuery(e):(e.revalidateIfStale&&r.isStaleByTime(ca(t.staleTime,r))&&this.prefetchQuery(t),Promise.resolve(n))}getQueriesData(e){return L(this,pt).findAll(e).map(({queryKey:t,state:r})=>{const n=r.data;return[t,n]})}setQueryData(e,t,r){const n=this.defaultQueryOptions({queryKey:e}),a=L(this,pt).get(n.queryHash),o=a==null?void 0:a.state.data,u=c3(t,o);if(u!==void 0)return L(this,pt).build(this,n).setData(u,{...r,manual:!0})}setQueriesData(e,t,r){return Gt.batch(()=>L(this,pt).findAll(e).map(({queryKey:n})=>[n,this.setQueryData(n,t,r)]))}getQueryState(e){var r;const t=this.defaultQueryOptions({queryKey:e});return(r=L(this,pt).get(t.queryHash))==null?void 0:r.state}removeQueries(e){const t=L(this,pt);Gt.batch(()=>{t.findAll(e).forEach(r=>{t.remove(r)})})}resetQueries(e,t){const r=L(this,pt);return Gt.batch(()=>(r.findAll(e).forEach(n=>{n.reset()}),this.refetchQueries({type:"active",...e},t)))}cancelQueries(e,t={}){const r={revert:!0,...t},n=Gt.batch(()=>L(this,pt).findAll(e).map(a=>a.cancel(r)));return Promise.all(n).then(kr).catch(kr)}invalidateQueries(e,t={}){return Gt.batch(()=>(L(this,pt).findAll(e).forEach(r=>{r.invalidate()}),(e==null?void 0:e.refetchType)==="none"?Promise.resolve():this.refetchQueries({...e,type:(e==null?void 0:e.refetchType)??(e==null?void 0:e.type)??"active"},t)))}refetchQueries(e,t={}){const r={...t,cancelRefetch:t.cancelRefetch??!0},n=Gt.batch(()=>L(this,pt).findAll(e).filter(a=>!a.isDisabled()&&!a.isStatic()).map(a=>{let o=a.fetch(void 0,r);return r.throwOnError||(o=o.catch(kr)),a.state.fetchStatus==="paused"?Promise.resolve():o}));return Promise.all(n).then(kr)}fetchQuery(e){const t=this.defaultQueryOptions(e);t.retry===void 0&&(t.retry=!1);const r=L(this,pt).build(this,t);return r.isStaleByTime(ca(t.staleTime,r))?r.fetch(t):Promise.resolve(r.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(kr).catch(kr)}fetchInfiniteQuery(e){return e._type="infinite",this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(kr).catch(kr)}ensureInfiniteQueryData(e){return e._type="infinite",this.ensureQueryData(e)}resumePausedMutations(){return Xd.isOnline()?L(this,oa).resumePausedMutations():Promise.resolve()}getQueryCache(){return L(this,pt)}getMutationCache(){return L(this,oa)}getDefaultOptions(){return L(this,sa)}setDefaultOptions(e){ye(this,sa,e)}setQueryDefaults(e,t){L(this,As).set(pu(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){const t=[...L(this,As).values()],r={};return t.forEach(n=>{gu(e,n.queryKey)&&Object.assign(r,n.defaultOptions)}),r}setMutationDefaults(e,t){L(this,Cs).set(pu(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){const t=[...L(this,Cs).values()],r={};return t.forEach(n=>{gu(e,n.mutationKey)&&Object.assign(r,n.defaultOptions)}),r}defaultQueryOptions(e){if(e._defaulted)return e;const t={...L(this,sa).queries,...this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||(t.queryHash=my(t.queryKey,t)),t.refetchOnReconnect===void 0&&(t.refetchOnReconnect=t.networkMode!=="always"),t.throwOnError===void 0&&(t.throwOnError=!!t.suspense),!t.networkMode&&t.persister&&(t.networkMode="offlineFirst"),t.queryFn===py&&(t.enabled=!1),t}defaultMutationOptions(e){return e!=null&&e._defaulted?e:{...L(this,sa).mutations,...(e==null?void 0:e.mutationKey)&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){L(this,pt).clear(),L(this,oa).clear()}},pt=new WeakMap,oa=new WeakMap,sa=new WeakMap,As=new WeakMap,Cs=new WeakMap,la=new WeakMap,Ps=new WeakMap,Os=new WeakMap,uN),wN=y.createContext(void 0),Kn=e=>{const t=y.useContext(wN);if(!t)throw new Error("No QueryClient set, use QueryClientProvider to set one");return t},_3=({client:e,children:t})=>(y.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),l.jsx(wN.Provider,{value:e,children:t})),kN=y.createContext(!1),M3=()=>y.useContext(kN);kN.Provider;function I3(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}var T3=y.createContext(I3()),D3=()=>y.useContext(T3),R3=(e,t,r)=>{const n=r!=null&&r.state.error&&typeof e.throwOnError=="function"?mN(e.throwOnError,[r.state.error,r]):e.throwOnError;(e.suspense||e.experimental_prefetchInRender||n)&&(t.isReset()||(e.retryOnMount=!1))},L3=e=>{y.useEffect(()=>{e.clearReset()},[e])},$3=({result:e,errorResetBoundary:t,throwOnError:r,query:n,suspense:a})=>e.isError&&!t.isReset()&&!e.isFetching&&n&&(a&&e.data===void 0||mN(r,[e.error,n])),z3=e=>{if(e.suspense){const r=a=>a==="static"?a:Math.max(a??1e3,1e3),n=e.staleTime;e.staleTime=typeof n=="function"?(...a)=>r(n(...a)):r(n),typeof e.gcTime=="number"&&(e.gcTime=Math.max(e.gcTime,1e3))}},F3=(e,t)=>e.isLoading&&e.isFetching&&!t,B3=(e,t)=>(e==null?void 0:e.suspense)&&t.isPending,dw=(e,t,r)=>t.fetchOptimistic(e).catch(()=>{r.clearReset()});function U3(e,t,r){var b,j,k,S;const n=M3(),a=D3(),o=Kn(),u=o.defaultQueryOptions(e);(j=(b=o.getDefaultOptions().queries)==null?void 0:b._experimental_beforeQuery)==null||j.call(b,u);const c=o.getQueryCache().get(u.queryHash),f=e.subscribed!==!1;u._optimisticResults=n?"isRestoring":f?"optimistic":void 0,z3(u),R3(u,a,c),L3(a);const h=!o.getQueryCache().get(u.queryHash),[m]=y.useState(()=>new t(o,u)),g=m.getOptimisticResult(u),v=!n&&f;if(y.useSyncExternalStore(y.useCallback(N=>{const E=v?m.subscribe(Gt.batchCalls(N)):kr;return m.updateResult(),E},[m,v]),()=>m.getCurrentResult(),()=>m.getCurrentResult()),y.useEffect(()=>{m.setOptions(u)},[u,m]),B3(u,g))throw dw(u,m,a);if($3({result:g,errorResetBoundary:a,throwOnError:u.throwOnError,query:c,suspense:u.suspense}))throw g.error;if((S=(k=o.getDefaultOptions().queries)==null?void 0:k._experimental_afterQuery)==null||S.call(k,u,g),u.experimental_prefetchInRender&&!vu.isServer()&&F3(g,n)){const N=h?dw(u,m,a):c==null?void 0:c.promise;N==null||N.catch(kr).finally(()=>{m.updateResult()})}return u.notifyOnChangeProps?g:m.trackResult(g)}function Lt(e,t){return U3(e,j3)}/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const H3=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),jN=(...e)=>e.filter((t,r,n)=>!!t&&t.trim()!==""&&n.indexOf(t)===r).join(" ").trim();/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */var W3={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const K3=y.forwardRef(({color:e="currentColor",size:t=24,strokeWidth:r=2,absoluteStrokeWidth:n,className:a="",children:o,iconNode:u,...c},f)=>y.createElement("svg",{ref:f,...W3,width:t,height:t,stroke:e,strokeWidth:n?Number(r)*24/Number(t):r,className:jN("lucide",a),...c},[...u.map(([h,m])=>y.createElement(h,m)),...Array.isArray(o)?o:[o]]));/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const de=(e,t)=>{const r=y.forwardRef(({className:n,...a},o)=>y.createElement(K3,{ref:o,iconNode:t,className:jN(`lucide-${H3(e)}`,n),...a}));return r.displayName=`${e}`,r};/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const eh=de("Activity",[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const SN=de("ArrowLeft",[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Zd=de("ArrowRight",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const G3=de("ArrowUpRight",[["path",{d:"M7 7h10v10",key:"1tivn9"}],["path",{d:"M7 17 17 7",key:"1vkiza"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const NN=de("BookMarked",[["path",{d:"M10 2v8l3-3 3 3V2",key:"sqw3rj"}],["path",{d:"M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H19a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H6.5a1 1 0 0 1 0-5H20",key:"k3hazp"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const tv=de("BookOpen",[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",key:"ruj8y"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const V3=de("Bookmark",[["path",{d:"m19 21-7-4-7 4V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2v16z",key:"1fy3hk"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const gn=de("Bot",[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const q3=de("Box",[["path",{d:"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z",key:"hh9hay"}],["path",{d:"m3.3 7 8.7 5 8.7-5",key:"g66t2b"}],["path",{d:"M12 22V12",key:"d0xqtd"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Jd=de("Boxes",[["path",{d:"M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z",key:"lc1i9w"}],["path",{d:"m7 16.5-4.74-2.85",key:"1o9zyk"}],["path",{d:"m7 16.5 5-3",key:"va8pkn"}],["path",{d:"M7 16.5v5.17",key:"jnp8gn"}],["path",{d:"M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z",key:"8zsnat"}],["path",{d:"m17 16.5-5-3",key:"8arw3v"}],["path",{d:"m17 16.5 4.74-2.85",key:"8rfmw"}],["path",{d:"M17 16.5v5.17",key:"k6z78m"}],["path",{d:"M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z",key:"1xygjf"}],["path",{d:"M12 8 7.26 5.15",key:"1vbdud"}],["path",{d:"m12 8 4.74-2.85",key:"3rx089"}],["path",{d:"M12 13.5V8",key:"1io7kd"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Q3=de("BrainCircuit",[["path",{d:"M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z",key:"l5xja"}],["path",{d:"M9 13a4.5 4.5 0 0 0 3-4",key:"10igwf"}],["path",{d:"M6.003 5.125A3 3 0 0 0 6.401 6.5",key:"105sqy"}],["path",{d:"M3.477 10.896a4 4 0 0 1 .585-.396",key:"ql3yin"}],["path",{d:"M6 18a4 4 0 0 1-1.967-.516",key:"2e4loj"}],["path",{d:"M12 13h4",key:"1ku699"}],["path",{d:"M12 18h6a2 2 0 0 1 2 2v1",key:"105ag5"}],["path",{d:"M12 8h8",key:"1lhi5i"}],["path",{d:"M16 8V5a2 2 0 0 1 2-2",key:"u6izg6"}],["circle",{cx:"16",cy:"13",r:".5",key:"ry7gng"}],["circle",{cx:"18",cy:"3",r:".5",key:"1aiba7"}],["circle",{cx:"20",cy:"21",r:".5",key:"yhc1fs"}],["circle",{cx:"20",cy:"8",r:".5",key:"1e43v0"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Y3=de("BrainCog",[["path",{d:"M12 5a3 3 0 1 0-5.997.142 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588 4 4 0 0 0 7.636 2.106 3.2 3.2 0 0 0 .164-.546c.028-.13.306-.13.335 0a3.2 3.2 0 0 0 .163.546 4 4 0 0 0 7.636-2.106 4 4 0 0 0 .556-6.588 4 4 0 0 0-2.526-5.77A3 3 0 1 0 12 5",key:"1kgmhc"}],["path",{d:"M17.599 6.5a3 3 0 0 0 .399-1.375",key:"tmeiqw"}],["path",{d:"M6.003 5.125A3 3 0 0 0 6.401 6.5",key:"105sqy"}],["path",{d:"M3.477 10.896a4 4 0 0 1 .585-.396",key:"ql3yin"}],["path",{d:"M19.938 10.5a4 4 0 0 1 .585.396",key:"1qfode"}],["path",{d:"M6 18a4 4 0 0 1-1.967-.516",key:"2e4loj"}],["path",{d:"M19.967 17.484A4 4 0 0 1 18 18",key:"159ez6"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}],["path",{d:"m15.7 10.4-.9.4",key:"ayzo6p"}],["path",{d:"m9.2 13.2-.9.4",key:"1uzb3g"}],["path",{d:"m13.6 15.7-.4-.9",key:"11ifqf"}],["path",{d:"m10.8 9.2-.4-.9",key:"1pmk2v"}],["path",{d:"m15.7 13.5-.9-.4",key:"7ng02m"}],["path",{d:"m9.2 10.9-.9-.4",key:"1x66zd"}],["path",{d:"m10.5 15.7.4-.9",key:"3js94g"}],["path",{d:"m13.1 9.2.4-.9",key:"18n7mc"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const yo=de("Brain",[["path",{d:"M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z",key:"l5xja"}],["path",{d:"M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z",key:"ep3f8r"}],["path",{d:"M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4",key:"1p4c4q"}],["path",{d:"M17.599 6.5a3 3 0 0 0 .399-1.375",key:"tmeiqw"}],["path",{d:"M6.003 5.125A3 3 0 0 0 6.401 6.5",key:"105sqy"}],["path",{d:"M3.477 10.896a4 4 0 0 1 .585-.396",key:"ql3yin"}],["path",{d:"M19.938 10.5a4 4 0 0 1 .585.396",key:"1qfode"}],["path",{d:"M6 18a4 4 0 0 1-1.967-.516",key:"2e4loj"}],["path",{d:"M19.967 17.484A4 4 0 0 1 18 18",key:"159ez6"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const X3=de("Camera",[["path",{d:"M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z",key:"1tc9qg"}],["circle",{cx:"12",cy:"13",r:"3",key:"1vg3eu"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const or=de("Check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const EN=de("ChevronDown",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Z3=de("ChevronLeft",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const th=de("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const AN=de("ChevronUp",[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const J3=de("CircleArrowUp",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m16 12-4-4-4 4",key:"177agl"}],["path",{d:"M12 16V8",key:"1sbj14"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const e4=de("CircleCheck",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const t4=de("CircleHelp",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3",key:"1u773s"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const r4=de("CircleX",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"m9 9 6 6",key:"z0biqf"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const n4=de("Clock",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polyline",{points:"12 6 12 12 16 14",key:"68esgv"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const i4=de("CodeXml",[["path",{d:"m18 16 4-4-4-4",key:"1inbqp"}],["path",{d:"m6 8-4 4 4 4",key:"15zrgr"}],["path",{d:"m14.5 4-5 16",key:"e7oirm"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const _s=de("Code",[["polyline",{points:"16 18 22 12 16 6",key:"z7tu5w"}],["polyline",{points:"8 6 2 12 8 18",key:"1eg1df"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const a4=de("Command",[["path",{d:"M15 6v12a3 3 0 1 0 3-3H6a3 3 0 1 0 3 3V6a3 3 0 1 0-3 3h12a3 3 0 1 0-3-3",key:"11bfej"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const rv=de("Compass",[["path",{d:"m16.24 7.76-1.804 5.411a2 2 0 0 1-1.265 1.265L7.76 16.24l1.804-5.411a2 2 0 0 1 1.265-1.265z",key:"9ktpf1"}],["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const o4=de("Construction",[["rect",{x:"2",y:"6",width:"20",height:"8",rx:"1",key:"1estib"}],["path",{d:"M17 14v7",key:"7m2elx"}],["path",{d:"M7 14v7",key:"1cm7wv"}],["path",{d:"M17 3v3",key:"1v4jwn"}],["path",{d:"M7 3v3",key:"7o6guu"}],["path",{d:"M10 14 2.3 6.3",key:"1023jk"}],["path",{d:"m14 6 7.7 7.7",key:"1s8pl2"}],["path",{d:"m8 6 8 8",key:"hl96qh"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const nv=de("Copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const $n=de("Cpu",[["rect",{width:"16",height:"16",x:"4",y:"4",rx:"2",key:"14l7u7"}],["rect",{width:"6",height:"6",x:"9",y:"9",rx:"1",key:"5aljv4"}],["path",{d:"M15 2v2",key:"13l42r"}],["path",{d:"M15 20v2",key:"15mkzm"}],["path",{d:"M2 15h2",key:"1gxd5l"}],["path",{d:"M2 9h2",key:"1bbxkp"}],["path",{d:"M20 15h2",key:"19e6y8"}],["path",{d:"M20 9h2",key:"19tzq7"}],["path",{d:"M9 2v2",key:"165o2o"}],["path",{d:"M9 20v2",key:"i2bqo8"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const s4=de("Database",[["ellipse",{cx:"12",cy:"5",rx:"9",ry:"3",key:"msslwz"}],["path",{d:"M3 5V19A9 3 0 0 0 21 19V5",key:"1wlel7"}],["path",{d:"M3 12A9 3 0 0 0 21 12",key:"mv7ke4"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ms=de("Download",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"7 10 12 15 17 10",key:"2ggqvy"}],["line",{x1:"12",x2:"12",y1:"15",y2:"3",key:"1vk2je"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Is=de("ExternalLink",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const fw=de("EyeOff",[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ef=de("Eye",[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const l4=de("FileText",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const u4=de("Flame",[["path",{d:"M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z",key:"96xj49"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const c4=de("FolderOpen",[["path",{d:"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2",key:"usdka0"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const CN=de("Gauge",[["path",{d:"m12 14 4-4",key:"9kzdfg"}],["path",{d:"M3.34 19a10 10 0 1 1 17.32 0",key:"19p75a"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const d4=de("GitCommitHorizontal",[["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}],["line",{x1:"3",x2:"9",y1:"12",y2:"12",key:"1dyftd"}],["line",{x1:"15",x2:"21",y1:"12",y2:"12",key:"oup4p8"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const f4=de("Globe",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",key:"13o1zl"}],["path",{d:"M2 12h20",key:"9i4pu4"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const du=de("HardDrive",[["line",{x1:"22",x2:"2",y1:"12",y2:"12",key:"1y58io"}],["path",{d:"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z",key:"oot6mr"}],["line",{x1:"6",x2:"6.01",y1:"16",y2:"16",key:"sgf278"}],["line",{x1:"10",x2:"10.01",y1:"16",y2:"16",key:"1l4acy"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const h4=de("HeartPulse",[["path",{d:"M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z",key:"c3ymky"}],["path",{d:"M3.22 12H9.5l.5-1 2 4.5 2-7 1.5 3.5h5.27",key:"1uw2ng"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const m4=de("Heart",[["path",{d:"M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z",key:"c3ymky"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const hw=de("Info",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const p4=de("Key",[["path",{d:"m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4",key:"g0fldk"}],["path",{d:"m21 2-9.6 9.6",key:"1j0ho8"}],["circle",{cx:"7.5",cy:"15.5",r:"5.5",key:"yqb3hr"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const g4=de("Laptop",[["path",{d:"M20 16V7a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v9m16 0H4m16 0 1.28 2.55a1 1 0 0 1-.9 1.45H3.62a1 1 0 0 1-.9-1.45L4 16",key:"tarvll"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const vy=de("Layers",[["path",{d:"m12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83Z",key:"8b97xw"}],["path",{d:"m22 17.65-9.17 4.16a2 2 0 0 1-1.66 0L2 17.65",key:"dd6zsq"}],["path",{d:"m22 12.65-9.17 4.16a2 2 0 0 1-1.66 0L2 12.65",key:"ep9fru"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const v4=de("LayoutDashboard",[["rect",{width:"7",height:"9",x:"3",y:"3",rx:"1",key:"10lvy0"}],["rect",{width:"7",height:"5",x:"14",y:"3",rx:"1",key:"16une8"}],["rect",{width:"7",height:"9",x:"14",y:"12",rx:"1",key:"1hutg5"}],["rect",{width:"7",height:"5",x:"3",y:"16",rx:"1",key:"ldoo1y"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const y4=de("LifeBuoy",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m4.93 4.93 4.24 4.24",key:"1ymg45"}],["path",{d:"m14.83 9.17 4.24-4.24",key:"1cb5xl"}],["path",{d:"m14.83 14.83 4.24 4.24",key:"q42g0n"}],["path",{d:"m9.17 14.83-4.24 4.24",key:"bqpfvv"}],["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const x4=de("Lightbulb",[["path",{d:"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5",key:"1gvzjb"}],["path",{d:"M9 18h6",key:"x1upvd"}],["path",{d:"M10 22h4",key:"ceow96"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const b4=de("List",[["path",{d:"M3 12h.01",key:"nlz23k"}],["path",{d:"M3 18h.01",key:"1tta3j"}],["path",{d:"M3 6h.01",key:"1rqtza"}],["path",{d:"M8 12h13",key:"1za7za"}],["path",{d:"M8 18h13",key:"1lx6n3"}],["path",{d:"M8 6h13",key:"ik3vkj"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const rh=de("LoaderCircle",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const w4=de("Lock",[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const k4=de("MessageSquare",[["path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z",key:"1lielz"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const j4=de("MessagesSquare",[["path",{d:"M14 9a2 2 0 0 1-2 2H6l-4 4V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2z",key:"p1xzt8"}],["path",{d:"M18 9h2a2 2 0 0 1 2 2v11l-4-4h-6a2 2 0 0 1-2-2v-1",key:"1cx29u"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const S4=de("Mic",[["path",{d:"M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z",key:"131961"}],["path",{d:"M19 10v2a7 7 0 0 1-14 0v-2",key:"1vc78b"}],["line",{x1:"12",x2:"12",y1:"19",y2:"22",key:"x3vr5v"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const mw=de("Monitor",[["rect",{width:"20",height:"14",x:"2",y:"3",rx:"2",key:"48i651"}],["line",{x1:"8",x2:"16",y1:"21",y2:"21",key:"1svkeh"}],["line",{x1:"12",x2:"12",y1:"17",y2:"21",key:"vw1qmm"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const N4=de("Moon",[["path",{d:"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z",key:"a7tn18"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const E4=de("Network",[["rect",{x:"16",y:"16",width:"6",height:"6",rx:"1",key:"4q2zg0"}],["rect",{x:"2",y:"16",width:"6",height:"6",rx:"1",key:"8cvhb9"}],["rect",{x:"9",y:"2",width:"6",height:"6",rx:"1",key:"1egb70"}],["path",{d:"M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3",key:"1jsf9p"}],["path",{d:"M12 12V8",key:"2874zd"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const A4=de("Package",[["path",{d:"M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z",key:"1a0edw"}],["path",{d:"M12 22V12",key:"d0xqtd"}],["path",{d:"m3.3 7 7.703 4.734a2 2 0 0 0 1.994 0L20.7 7",key:"yx3hmr"}],["path",{d:"m7.5 4.27 9 5.15",key:"1c824w"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const C4=de("PenLine",[["path",{d:"M12 20h9",key:"t2du7b"}],["path",{d:"M16.376 3.622a1 1 0 0 1 3.002 3.002L7.368 18.635a2 2 0 0 1-.855.506l-2.872.838a.5.5 0 0 1-.62-.62l.838-2.872a2 2 0 0 1 .506-.854z",key:"1ykcvy"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const tf=de("Plug",[["path",{d:"M12 22v-5",key:"1ega77"}],["path",{d:"M9 8V2",key:"14iosj"}],["path",{d:"M15 8V2",key:"18g5xt"}],["path",{d:"M18 8v5a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V8Z",key:"osxo6l"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const rf=de("Plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const P4=de("Power",[["path",{d:"M12 2v10",key:"mnfbl"}],["path",{d:"M18.4 6.6a9 9 0 1 1-12.77.04",key:"obofu9"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const O4=de("Puzzle",[["path",{d:"M15.39 4.39a1 1 0 0 0 1.68-.474 2.5 2.5 0 1 1 3.014 3.015 1 1 0 0 0-.474 1.68l1.683 1.682a2.414 2.414 0 0 1 0 3.414L19.61 15.39a1 1 0 0 1-1.68-.474 2.5 2.5 0 1 0-3.014 3.015 1 1 0 0 1 .474 1.68l-1.683 1.682a2.414 2.414 0 0 1-3.414 0L8.61 19.61a1 1 0 0 0-1.68.474 2.5 2.5 0 1 1-3.014-3.015 1 1 0 0 0 .474-1.68l-1.683-1.682a2.414 2.414 0 0 1 0-3.414L4.39 8.61a1 1 0 0 1 1.68.474 2.5 2.5 0 1 0 3.014-3.015 1 1 0 0 1-.474-1.68l1.683-1.682a2.414 2.414 0 0 1 3.414 0z",key:"w46dr5"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ha=de("RefreshCw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const _4=de("RotateCcw",[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const M4=de("Scroll",[["path",{d:"M19 17V5a2 2 0 0 0-2-2H4",key:"zz82l3"}],["path",{d:"M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3",key:"1ph1d7"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const PN=de("Search",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const I4=de("Send",[["path",{d:"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z",key:"1ffxy3"}],["path",{d:"m21.854 2.147-10.94 10.939",key:"12cjpa"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const nh=de("Server",[["rect",{width:"20",height:"8",x:"2",y:"2",rx:"2",ry:"2",key:"ngkwjq"}],["rect",{width:"20",height:"8",x:"2",y:"14",rx:"2",ry:"2",key:"iecqi9"}],["line",{x1:"6",x2:"6.01",y1:"6",y2:"6",key:"16zg32"}],["line",{x1:"6",x2:"6.01",y1:"18",y2:"18",key:"nzw8ys"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const T4=de("Share2",[["circle",{cx:"18",cy:"5",r:"3",key:"gq8acd"}],["circle",{cx:"6",cy:"12",r:"3",key:"w7nqdw"}],["circle",{cx:"18",cy:"19",r:"3",key:"1xt0gg"}],["line",{x1:"8.59",x2:"15.42",y1:"13.51",y2:"17.49",key:"47mynk"}],["line",{x1:"15.41",x2:"8.59",y1:"6.51",y2:"10.49",key:"1n3mei"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const D4=de("ShieldAlert",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"M12 8v4",key:"1got3b"}],["path",{d:"M12 16h.01",key:"1drbdi"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const R4=de("ShieldCheck",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const L4=de("ShieldQuestion",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"M9.1 9a3 3 0 0 1 5.82 1c0 2-3 3-3 3",key:"mhlwft"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Gs=de("Shield",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ON=de("Shuffle",[["path",{d:"M2 18h1.4c1.3 0 2.5-.6 3.3-1.7l6.1-8.6c.7-1.1 2-1.7 3.3-1.7H22",key:"1wmou1"}],["path",{d:"m18 2 4 4-4 4",key:"pucp1d"}],["path",{d:"M2 6h1.9c1.5 0 2.9.9 3.6 2.2",key:"10bdb2"}],["path",{d:"M22 18h-5.9c-1.3 0-2.6-.7-3.3-1.8l-.5-.8",key:"vgxac0"}],["path",{d:"m18 14 4 4-4 4",key:"10pe0f"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const $4=de("SlidersHorizontal",[["line",{x1:"21",x2:"14",y1:"4",y2:"4",key:"obuewd"}],["line",{x1:"10",x2:"3",y1:"4",y2:"4",key:"1q6298"}],["line",{x1:"21",x2:"12",y1:"12",y2:"12",key:"1iu8h1"}],["line",{x1:"8",x2:"3",y1:"12",y2:"12",key:"ntss68"}],["line",{x1:"21",x2:"16",y1:"20",y2:"20",key:"14d8ph"}],["line",{x1:"12",x2:"3",y1:"20",y2:"20",key:"m0wm8r"}],["line",{x1:"14",x2:"14",y1:"2",y2:"6",key:"14e1ph"}],["line",{x1:"8",x2:"8",y1:"10",y2:"14",key:"1i6ji0"}],["line",{x1:"16",x2:"16",y1:"18",y2:"22",key:"1lctlv"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const z4=de("SlidersVertical",[["line",{x1:"4",x2:"4",y1:"21",y2:"14",key:"1p332r"}],["line",{x1:"4",x2:"4",y1:"10",y2:"3",key:"gb41h5"}],["line",{x1:"12",x2:"12",y1:"21",y2:"12",key:"hf2csr"}],["line",{x1:"12",x2:"12",y1:"8",y2:"3",key:"1kfi7u"}],["line",{x1:"20",x2:"20",y1:"21",y2:"16",key:"1lhrwl"}],["line",{x1:"20",x2:"20",y1:"12",y2:"3",key:"16vvfq"}],["line",{x1:"2",x2:"6",y1:"14",y2:"14",key:"1uebub"}],["line",{x1:"10",x2:"14",y1:"8",y2:"8",key:"1yglbp"}],["line",{x1:"18",x2:"22",y1:"16",y2:"16",key:"1jxqpz"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const cs=de("Sparkles",[["path",{d:"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z",key:"4pj2yx"}],["path",{d:"M20 3v4",key:"1olli1"}],["path",{d:"M22 5h-4",key:"1gvqau"}],["path",{d:"M4 17v2",key:"vumght"}],["path",{d:"M5 18H3",key:"zchphs"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const _N=de("SquareTerminal",[["path",{d:"m7 11 2-2-2-2",key:"1lz0vl"}],["path",{d:"M11 13h4",key:"1p7l4v"}],["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const F4=de("Star",[["path",{d:"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z",key:"r04s7s"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const B4=de("Telescope",[["path",{d:"m10.065 12.493-6.18 1.318a.934.934 0 0 1-1.108-.702l-.537-2.15a1.07 1.07 0 0 1 .691-1.265l13.504-4.44",key:"k4qptu"}],["path",{d:"m13.56 11.747 4.332-.924",key:"19l80z"}],["path",{d:"m16 21-3.105-6.21",key:"7oh9d"}],["path",{d:"M16.485 5.94a2 2 0 0 1 1.455-2.425l1.09-.272a1 1 0 0 1 1.212.727l1.515 6.06a1 1 0 0 1-.727 1.213l-1.09.272a2 2 0 0 1-2.425-1.455z",key:"m7xp4m"}],["path",{d:"m6.158 8.633 1.114 4.456",key:"74o979"}],["path",{d:"m8 21 3.105-6.21",key:"1fvxut"}],["circle",{cx:"12",cy:"13",r:"2",key:"1c1ljs"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const MN=de("Terminal",[["polyline",{points:"4 17 10 11 4 5",key:"akl6gq"}],["line",{x1:"12",x2:"20",y1:"19",y2:"19",key:"q2wloq"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const iv=de("Trash2",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const mi=de("TriangleAlert",[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const U4=de("User",[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",key:"975kel"}],["circle",{cx:"12",cy:"7",r:"4",key:"17ys0d"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Uu=de("Wrench",[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z",key:"cbrjhi"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const zn=de("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ma=de("Zap",[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]]),su=[{id:"dashboard",label:"Zentrale",hint:"System- & Stack-Status",icon:v4},{id:"models",label:"Modell-Manager",hint:"Verwalten, laden & Gateway-Routing",icon:Jd},{id:"memory",label:"Gedächtnis",hint:"Geteiltes Memory verwalten",icon:yo},{id:"connect",label:"Verbinden",hint:"IDE-/Agent-Configs erzeugen",icon:tf},{id:"agent",label:"Hermes",hint:"Agent-Status & Verdrahtung",icon:gn},{id:"terminal",label:"Terminal",hint:"Interaktives Hermes-Agent-Terminal",icon:_N},{id:"guide",label:"Anleitung",hint:"Einrichten & Vibe-Coding",icon:t4}];var pw=1,H4=.9,W4=.8,K4=.17,qp=.1,Qp=.999,G4=.9999,V4=.99,q4=/[\\\/_+.#"@\[\(\{&]/,Q4=/[\\\/_+.#"@\[\(\{&]/g,Y4=/[\s-]/,IN=/[\s-]/g;function av(e,t,r,n,a,o,u){if(o===t.length)return a===e.length?pw:V4;var c=`${a},${o}`;if(u[c]!==void 0)return u[c];for(var f=n.charAt(o),h=r.indexOf(f,a),m=0,g,v,b,j;h>=0;)g=av(e,t,r,n,h+1,o+1,u),g>m&&(h===a?g*=pw:q4.test(e.charAt(h-1))?(g*=W4,b=e.slice(a,h-1).match(Q4),b&&a>0&&(g*=Math.pow(Qp,b.length))):Y4.test(e.charAt(h-1))?(g*=H4,j=e.slice(a,h-1).match(IN),j&&a>0&&(g*=Math.pow(Qp,j.length))):(g*=K4,a>0&&(g*=Math.pow(Qp,h-a))),e.charAt(h)!==t.charAt(o)&&(g*=G4)),(gg&&(g=v*qp)),g>m&&(m=g),h=r.indexOf(f,h+1);return u[c]=m,m}function gw(e){return e.toLowerCase().replace(IN," ")}function X4(e,t,r){return e=r&&r.length>0?`${e+" "+r.join(" ")}`:e,av(e,t,gw(e),gw(t),0,0,{})}function da(e,t,{checkForDefaultPrevented:r=!0}={}){return function(a){if(e==null||e(a),r===!1||!a.defaultPrevented)return t==null?void 0:t(a)}}function vw(e,t){if(typeof e=="function")return e(t);e!=null&&(e.current=t)}function Ts(...e){return t=>{let r=!1;const n=e.map(a=>{const o=vw(a,t);return!r&&typeof o=="function"&&(r=!0),o});if(r)return()=>{for(let a=0;a{var N;const{scope:v,children:b,...j}=g,k=((N=v==null?void 0:v[e])==null?void 0:N[f])||c,S=y.useMemo(()=>j,Object.values(j));return l.jsx(k.Provider,{value:S,children:b})};h.displayName=o+"Provider";function m(g,v){var k;const b=((k=v==null?void 0:v[e])==null?void 0:k[f])||c,j=y.useContext(b);if(j)return j;if(u!==void 0)return u;throw new Error(`\`${g}\` must be used within \`${o}\``)}return[h,m]}const a=()=>{const o=r.map(u=>y.createContext(u));return function(c){const f=(c==null?void 0:c[e])||o;return y.useMemo(()=>({[`__scope${e}`]:{...c,[e]:f}}),[c,f])}};return a.scopeName=e,[n,J4(a,...t)]}function J4(...e){const t=e[0];if(e.length===1)return t;const r=()=>{const n=e.map(a=>({useScope:a(),scopeName:a.scopeName}));return function(o){const u=n.reduce((c,{useScope:f,scopeName:h})=>{const g=f(o)[`__scope${h}`];return{...c,...g}},{});return y.useMemo(()=>({[`__scope${t.scopeName}`]:u}),[u])}};return r.scopeName=t.scopeName,r}var yu=globalThis!=null&&globalThis.document?y.useLayoutEffect:()=>{},eI=Jf[" useId ".trim().toString()]||(()=>{}),tI=0;function di(e){const[t,r]=y.useState(eI());return yu(()=>{r(n=>n??String(tI++))},[e]),t?`radix-${t}`:""}var rI=Jf[" useInsertionEffect ".trim().toString()]||yu;function nI({prop:e,defaultProp:t,onChange:r=()=>{},caller:n}){const[a,o,u]=iI({defaultProp:t,onChange:r}),c=e!==void 0,f=c?e:a;{const m=y.useRef(e!==void 0);y.useEffect(()=>{const g=m.current;g!==c&&console.warn(`${n} is changing from ${g?"controlled":"uncontrolled"} to ${c?"controlled":"uncontrolled"}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`),m.current=c},[c,n])}const h=y.useCallback(m=>{var g;if(c){const v=aI(m)?m(e):m;v!==e&&((g=u.current)==null||g.call(u,v))}else o(m)},[c,e,o,u]);return[f,h]}function iI({defaultProp:e,onChange:t}){const[r,n]=y.useState(e),a=y.useRef(r),o=y.useRef(t);return rI(()=>{o.current=t},[t]),y.useEffect(()=>{var u;a.current!==r&&((u=o.current)==null||u.call(o,r),a.current=r)},[r,a]),[r,n,o]}function aI(e){return typeof e=="function"}var ih=cN();function TN(e){const t=y.forwardRef((r,n)=>{let{children:a,...o}=r,u=null,c=!1;const f=[];yw(a)&&typeof vd=="function"&&(a=vd(a._payload)),y.Children.forEach(a,v=>{var b;if(cI(v)){c=!0;const j=v;let k="child"in j.props?j.props.child:j.props.children;yw(k)&&typeof vd=="function"&&(k=vd(k._payload)),u=sI(j,k),f.push((b=u==null?void 0:u.props)==null?void 0:b.children)}else f.push(v)}),u?u=y.cloneElement(u,void 0,f):!c&&y.Children.count(a)===1&&y.isValidElement(a)&&(u=a);const h=u?uI(u):void 0,m=xo(n,h);if(!u){if(a||a===0)throw new Error(c?mI(e):hI(e));return a}const g=lI(o,u.props??{});return u.type!==y.Fragment&&(g.ref=n?m:h),y.cloneElement(u,g)});return t.displayName=`${e}.Slot`,t}var oI=Symbol.for("radix.slottable"),sI=(e,t)=>{if("child"in e.props){const r=e.props.child;return y.isValidElement(r)?y.cloneElement(r,void 0,e.props.children(r.props.children)):null}return y.isValidElement(t)?t:null};function lI(e,t){const r={...t};for(const n in t){const a=e[n],o=t[n];/^on[A-Z]/.test(n)?a&&o?r[n]=(...c)=>{const f=o(...c);return a(...c),f}:a&&(r[n]=a):n==="style"?r[n]={...a,...o}:n==="className"&&(r[n]=[a,o].filter(Boolean).join(" "))}return{...e,...r}}function uI(e){var n,a;let t=(n=Object.getOwnPropertyDescriptor(e.props,"ref"))==null?void 0:n.get,r=t&&"isReactWarning"in t&&t.isReactWarning;return r?e.ref:(t=(a=Object.getOwnPropertyDescriptor(e,"ref"))==null?void 0:a.get,r=t&&"isReactWarning"in t&&t.isReactWarning,r?e.props.ref:e.props.ref||e.ref)}function cI(e){return y.isValidElement(e)&&typeof e.type=="function"&&"__radixId"in e.type&&e.type.__radixId===oI}var dI=Symbol.for("react.lazy");function yw(e){return e!=null&&typeof e=="object"&&"$$typeof"in e&&e.$$typeof===dI&&"_payload"in e&&fI(e._payload)}function fI(e){return typeof e=="object"&&e!==null&&"then"in e}var hI=e=>`${e} failed to slot onto its children. Expected a single React element child or \`Slottable\`.`,mI=e=>`${e} failed to slot onto its \`Slottable\`. Expected \`Slottable\` to receive a single React element child.`,vd=Jf[" use ".trim().toString()],pI=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],Qt=pI.reduce((e,t)=>{const r=TN(`Primitive.${t}`),n=y.forwardRef((a,o)=>{const{asChild:u,...c}=a,f=u?r:t;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),l.jsx(f,{...c,ref:o})});return n.displayName=`Primitive.${t}`,{...e,[t]:n}},{});function gI(e,t){e&&ih.flushSync(()=>e.dispatchEvent(t))}function xu(e){const t=y.useRef(e);return y.useEffect(()=>{t.current=e}),y.useMemo(()=>((...r)=>{var n;return(n=t.current)==null?void 0:n.call(t,...r)}),[])}function vI(e,t=globalThis==null?void 0:globalThis.document){const r=xu(e);y.useEffect(()=>{const n=a=>{a.key==="Escape"&&r(a)};return t.addEventListener("keydown",n,{capture:!0}),()=>t.removeEventListener("keydown",n,{capture:!0})},[r,t])}var yI="DismissableLayer",ov="dismissableLayer.update",xI="dismissableLayer.pointerDownOutside",bI="dismissableLayer.focusOutside",xw,yy=y.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set,dismissableSurfaces:new Set}),DN=y.forwardRef((e,t)=>{const{disableOutsidePointerEvents:r=!1,deferPointerDownOutside:n=!1,onEscapeKeyDown:a,onPointerDownOutside:o,onFocusOutside:u,onInteractOutside:c,onDismiss:f,...h}=e,m=y.useContext(yy),[g,v]=y.useState(null),b=(g==null?void 0:g.ownerDocument)??(globalThis==null?void 0:globalThis.document),[,j]=y.useState({}),k=xo(t,F=>v(F)),S=Array.from(m.layers),[N]=[...m.layersWithOutsidePointerEventsDisabled].slice(-1),E=S.indexOf(N),A=g?S.indexOf(g):-1,P=m.layersWithOutsidePointerEventsDisabled.size>0,M=A>=E,O=y.useRef(!1),D=SI(F=>{const z=F.target;if(!(z instanceof Node))return;const Y=[...m.branches].some(U=>U.contains(z));!M||Y||(o==null||o(F),c==null||c(F),F.defaultPrevented||f==null||f())},{ownerDocument:b,deferPointerDownOutside:n,isDeferredPointerDownOutsideRef:O,dismissableSurfaces:m.dismissableSurfaces}),B=NI(F=>{if(n&&O.current)return;const z=F.target;[...m.branches].some(U=>U.contains(z))||(u==null||u(F),c==null||c(F),F.defaultPrevented||f==null||f())},b);return vI(F=>{A===m.layers.size-1&&(a==null||a(F),!F.defaultPrevented&&f&&(F.preventDefault(),f()))},b),y.useEffect(()=>{if(g)return r&&(m.layersWithOutsidePointerEventsDisabled.size===0&&(xw=b.body.style.pointerEvents,b.body.style.pointerEvents="none"),m.layersWithOutsidePointerEventsDisabled.add(g)),m.layers.add(g),bw(),()=>{r&&(m.layersWithOutsidePointerEventsDisabled.delete(g),m.layersWithOutsidePointerEventsDisabled.size===0&&(b.body.style.pointerEvents=xw))}},[g,b,r,m]),y.useEffect(()=>()=>{g&&(m.layers.delete(g),m.layersWithOutsidePointerEventsDisabled.delete(g),bw())},[g,m]),y.useEffect(()=>{const F=()=>j({});return document.addEventListener(ov,F),()=>document.removeEventListener(ov,F)},[]),l.jsx(Qt.div,{...h,ref:k,style:{pointerEvents:P?M?"auto":"none":void 0,...e.style},onFocusCapture:da(e.onFocusCapture,B.onFocusCapture),onBlurCapture:da(e.onBlurCapture,B.onBlurCapture),onPointerDownCapture:da(e.onPointerDownCapture,D.onPointerDownCapture)})});DN.displayName=yI;var wI="DismissableLayerBranch",kI=y.forwardRef((e,t)=>{const r=y.useContext(yy),n=y.useRef(null),a=xo(t,n);return y.useEffect(()=>{const o=n.current;if(o)return r.branches.add(o),()=>{r.branches.delete(o)}},[r.branches]),l.jsx(Qt.div,{...e,ref:a})});kI.displayName=wI;function jI(){const e=y.useContext(yy),[t,r]=y.useState(null);return y.useEffect(()=>{if(t)return e.dismissableSurfaces.add(t),()=>{e.dismissableSurfaces.delete(t)}},[t,e.dismissableSurfaces]),r}function SI(e,t){const{ownerDocument:r=globalThis==null?void 0:globalThis.document,deferPointerDownOutside:n=!1,isDeferredPointerDownOutsideRef:a,dismissableSurfaces:o}=t,u=xu(e),c=y.useRef(!1),f=y.useRef(!1),h=y.useRef(new Map),m=y.useRef(()=>{});return y.useEffect(()=>{function g(){f.current=!1,a.current=!1,h.current.clear()}function v(){return Array.from(h.current.values()).some(Boolean)}function b(E){if(!f.current)return;const A=E.target;A instanceof Node&&[...o].some(M=>M.contains(A))||h.current.set(E.type,!0),E.type==="click"&&window.setTimeout(()=>{f.current&&m.current()},0)}function j(E){f.current&&h.current.set(E.type,!1)}const k=E=>{if(E.target&&!c.current){let A=function(){r.removeEventListener("click",m.current);const M=v();g(),M||RN(xI,u,P,{discrete:!0})};const P={originalEvent:E};f.current=!0,a.current=n&&E.button===0,h.current.clear(),!n||E.button!==0?A():(r.removeEventListener("click",m.current),m.current=A,r.addEventListener("click",m.current,{once:!0}))}else r.removeEventListener("click",m.current),g();c.current=!1},S=["pointerup","mousedown","mouseup","touchstart","touchend","click"];for(const E of S)r.addEventListener(E,b,!0),r.addEventListener(E,j);const N=window.setTimeout(()=>{r.addEventListener("pointerdown",k)},0);return()=>{window.clearTimeout(N),r.removeEventListener("pointerdown",k),r.removeEventListener("click",m.current);for(const E of S)r.removeEventListener(E,b,!0),r.removeEventListener(E,j)}},[r,u,n,a,o]),{onPointerDownCapture:()=>c.current=!0}}function NI(e,t=globalThis==null?void 0:globalThis.document){const r=xu(e),n=y.useRef(!1);return y.useEffect(()=>{const a=o=>{o.target&&!n.current&&RN(bI,r,{originalEvent:o},{discrete:!1})};return t.addEventListener("focusin",a),()=>t.removeEventListener("focusin",a)},[t,r]),{onFocusCapture:()=>n.current=!0,onBlurCapture:()=>n.current=!1}}function bw(){const e=new CustomEvent(ov);document.dispatchEvent(e)}function RN(e,t,r,{discrete:n}){const a=r.originalEvent.target,o=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:r});t&&a.addEventListener(e,t,{once:!0}),n?gI(a,o):a.dispatchEvent(o)}var Yp="focusScope.autoFocusOnMount",Xp="focusScope.autoFocusOnUnmount",ww={bubbles:!1,cancelable:!0},EI="FocusScope",LN=y.forwardRef((e,t)=>{const{loop:r=!1,trapped:n=!1,onMountAutoFocus:a,onUnmountAutoFocus:o,...u}=e,[c,f]=y.useState(null),h=xu(a),m=xu(o),g=y.useRef(null),v=xo(t,k=>f(k)),b=y.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;y.useEffect(()=>{if(n){let k=function(A){if(b.paused||!c)return;const P=A.target;c.contains(P)?g.current=P:Yi(g.current,{select:!0})},S=function(A){if(b.paused||!c)return;const P=A.relatedTarget;P!==null&&(c.contains(P)||Yi(g.current,{select:!0}))},N=function(A){if(document.activeElement===document.body)for(const M of A)M.removedNodes.length>0&&Yi(c)};document.addEventListener("focusin",k),document.addEventListener("focusout",S);const E=new MutationObserver(N);return c&&E.observe(c,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",k),document.removeEventListener("focusout",S),E.disconnect()}}},[n,c,b.paused]),y.useEffect(()=>{if(c){jw.add(b);const k=document.activeElement;if(!c.contains(k)){const N=new CustomEvent(Yp,ww);c.addEventListener(Yp,h),c.dispatchEvent(N),N.defaultPrevented||(AI(MI($N(c)),{select:!0}),document.activeElement===k&&Yi(c))}return()=>{c.removeEventListener(Yp,h),setTimeout(()=>{const N=new CustomEvent(Xp,ww);c.addEventListener(Xp,m),c.dispatchEvent(N),N.defaultPrevented||Yi(k??document.body,{select:!0}),c.removeEventListener(Xp,m),jw.remove(b)},0)}}},[c,h,m,b]);const j=y.useCallback(k=>{if(!r&&!n||b.paused)return;const S=k.key==="Tab"&&!k.altKey&&!k.ctrlKey&&!k.metaKey,N=document.activeElement;if(S&&N){const E=k.currentTarget,[A,P]=CI(E);A&&P?!k.shiftKey&&N===P?(k.preventDefault(),r&&Yi(A,{select:!0})):k.shiftKey&&N===A&&(k.preventDefault(),r&&Yi(P,{select:!0})):N===E&&k.preventDefault()}},[r,n,b.paused]);return l.jsx(Qt.div,{tabIndex:-1,...u,ref:v,onKeyDown:j})});LN.displayName=EI;function AI(e,{select:t=!1}={}){const r=document.activeElement;for(const n of e)if(Yi(n,{select:t}),document.activeElement!==r)return}function CI(e){const t=$N(e),r=kw(t,e),n=kw(t.reverse(),e);return[r,n]}function $N(e){const t=[],r=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:n=>{const a=n.tagName==="INPUT"&&n.type==="hidden";return n.disabled||n.hidden||a?NodeFilter.FILTER_SKIP:n.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;r.nextNode();)t.push(r.currentNode);return t}function kw(e,t){for(const r of e)if(!PI(r,{upTo:t}))return r}function PI(e,{upTo:t}){if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(t!==void 0&&e===t)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1}function OI(e){return e instanceof HTMLInputElement&&"select"in e}function Yi(e,{select:t=!1}={}){if(e&&e.focus){const r=document.activeElement;e.focus({preventScroll:!0}),e!==r&&OI(e)&&t&&e.select()}}var jw=_I();function _I(){let e=[];return{add(t){const r=e[0];t!==r&&(r==null||r.pause()),e=Sw(e,t),e.unshift(t)},remove(t){var r;e=Sw(e,t),(r=e[0])==null||r.resume()}}}function Sw(e,t){const r=[...e],n=r.indexOf(t);return n!==-1&&r.splice(n,1),r}function MI(e){return e.filter(t=>t.tagName!=="A")}var II="Portal",zN=y.forwardRef((e,t)=>{var c;const{container:r,...n}=e,[a,o]=y.useState(!1);yu(()=>o(!0),[]);const u=r||a&&((c=globalThis==null?void 0:globalThis.document)==null?void 0:c.body);return u?ih.createPortal(l.jsx(Qt.div,{...n,ref:t}),u):null});zN.displayName=II;function TI(e,t){return y.useReducer((r,n)=>t[r][n]??r,e)}var ah=e=>{const{present:t,children:r}=e,n=DI(t),a=typeof r=="function"?r({present:n.isPresent}):y.Children.only(r),o=RI(n.ref,LI(a));return typeof r=="function"||n.isPresent?y.cloneElement(a,{ref:o}):null};ah.displayName="Presence";function DI(e){const[t,r]=y.useState(),n=y.useRef(null),a=y.useRef(e),o=y.useRef("none"),u=e?"mounted":"unmounted",[c,f]=TI(u,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return y.useEffect(()=>{const h=yd(n.current);o.current=c==="mounted"?h:"none"},[c]),yu(()=>{const h=n.current,m=a.current;if(m!==e){const v=o.current,b=yd(h);e?f("MOUNT"):b==="none"||(h==null?void 0:h.display)==="none"?f("UNMOUNT"):f(m&&v!==b?"ANIMATION_OUT":"UNMOUNT"),a.current=e}},[e,f]),yu(()=>{if(t){let h;const m=t.ownerDocument.defaultView??window,g=b=>{const k=yd(n.current).includes(CSS.escape(b.animationName));if(b.target===t&&k&&(f("ANIMATION_END"),!a.current)){const S=t.style.animationFillMode;t.style.animationFillMode="forwards",h=m.setTimeout(()=>{t.style.animationFillMode==="forwards"&&(t.style.animationFillMode=S)})}},v=b=>{b.target===t&&(o.current=yd(n.current))};return t.addEventListener("animationstart",v),t.addEventListener("animationcancel",g),t.addEventListener("animationend",g),()=>{m.clearTimeout(h),t.removeEventListener("animationstart",v),t.removeEventListener("animationcancel",g),t.removeEventListener("animationend",g)}}else f("ANIMATION_END")},[t,f]),{isPresent:["mounted","unmountSuspended"].includes(c),ref:y.useCallback(h=>{n.current=h?getComputedStyle(h):null,r(h)},[])}}function Nw(e,t){if(typeof e=="function")return e(t);e!=null&&(e.current=t)}function RI(...e){const t=y.useRef(e);return t.current=e,y.useCallback(r=>{const n=t.current;let a=!1;const o=n.map(u=>{const c=Nw(u,r);return!a&&typeof c=="function"&&(a=!0),c});if(a)return()=>{for(let u=0;u{En||(En={start:Ew(),end:Ew()});const{start:e,end:t}=En;return document.body.firstElementChild!==e&&document.body.insertAdjacentElement("afterbegin",e),document.body.lastElementChild!==t&&document.body.insertAdjacentElement("beforeend",t),xd++,()=>{xd===1&&(En==null||En.start.remove(),En==null||En.end.remove(),En=null),xd=Math.max(0,xd-1)}},[])}function Ew(){const e=document.createElement("span");return e.setAttribute("data-radix-focus-guard",""),e.tabIndex=0,e.style.outline="none",e.style.opacity="0",e.style.position="fixed",e.style.pointerEvents="none",e}var In=function(){return In=Object.assign||function(t){for(var r,n=1,a=arguments.length;n"u")return tT;var t=rT(e),r=document.documentElement.clientWidth,n=window.innerWidth;return{left:t[0],top:t[1],right:t[2],gap:Math.max(0,n-r+t[2]-t[0])}},iT=HN(),hs="data-scroll-locked",aT=function(e,t,r,n){var a=e.left,o=e.top,u=e.right,c=e.gap;return r===void 0&&(r="margin"),` + .`.concat(FI,` { + overflow: hidden `).concat(n,`; + padding-right: `).concat(c,"px ").concat(n,`; + } + body[`).concat(hs,`] { + overflow: hidden `).concat(n,`; + overscroll-behavior: contain; + `).concat([t&&"position: relative ".concat(n,";"),r==="margin"&&` + padding-left: `.concat(a,`px; + padding-top: `).concat(o,`px; + padding-right: `).concat(u,`px; + margin-left:0; + margin-top:0; + margin-right: `).concat(c,"px ").concat(n,`; + `),r==="padding"&&"padding-right: ".concat(c,"px ").concat(n,";")].filter(Boolean).join(""),` + } + + .`).concat(Ud,` { + right: `).concat(c,"px ").concat(n,`; + } + + .`).concat(Hd,` { + margin-right: `).concat(c,"px ").concat(n,`; + } + + .`).concat(Ud," .").concat(Ud,` { + right: 0 `).concat(n,`; + } + + .`).concat(Hd," .").concat(Hd,` { + margin-right: 0 `).concat(n,`; + } + + body[`).concat(hs,`] { + `).concat(BI,": ").concat(c,`px; + } +`)},Cw=function(){var e=parseInt(document.body.getAttribute(hs)||"0",10);return isFinite(e)?e:0},oT=function(){y.useEffect(function(){return document.body.setAttribute(hs,(Cw()+1).toString()),function(){var e=Cw()-1;e<=0?document.body.removeAttribute(hs):document.body.setAttribute(hs,e.toString())}},[])},sT=function(e){var t=e.noRelative,r=e.noImportant,n=e.gapMode,a=n===void 0?"margin":n;oT();var o=y.useMemo(function(){return nT(a)},[a]);return y.createElement(iT,{styles:aT(o,!t,a,r?"":"!important")})},sv=!1;if(typeof window<"u")try{var bd=Object.defineProperty({},"passive",{get:function(){return sv=!0,!0}});window.addEventListener("test",bd,bd),window.removeEventListener("test",bd,bd)}catch{sv=!1}var Yo=sv?{passive:!1}:!1,lT=function(e){return e.tagName==="TEXTAREA"},WN=function(e,t){if(!(e instanceof Element))return!1;var r=window.getComputedStyle(e);return r[t]!=="hidden"&&!(r.overflowY===r.overflowX&&!lT(e)&&r[t]==="visible")},uT=function(e){return WN(e,"overflowY")},cT=function(e){return WN(e,"overflowX")},Pw=function(e,t){var r=t.ownerDocument,n=t;do{typeof ShadowRoot<"u"&&n instanceof ShadowRoot&&(n=n.host);var a=KN(e,n);if(a){var o=GN(e,n),u=o[1],c=o[2];if(u>c)return!0}n=n.parentNode}while(n&&n!==r.body);return!1},dT=function(e){var t=e.scrollTop,r=e.scrollHeight,n=e.clientHeight;return[t,r,n]},fT=function(e){var t=e.scrollLeft,r=e.scrollWidth,n=e.clientWidth;return[t,r,n]},KN=function(e,t){return e==="v"?uT(t):cT(t)},GN=function(e,t){return e==="v"?dT(t):fT(t)},hT=function(e,t){return e==="h"&&t==="rtl"?-1:1},mT=function(e,t,r,n,a){var o=hT(e,window.getComputedStyle(t).direction),u=o*n,c=r.target,f=t.contains(c),h=!1,m=u>0,g=0,v=0;do{if(!c)break;var b=GN(e,c),j=b[0],k=b[1],S=b[2],N=k-S-o*j;(j||N)&&KN(e,c)&&(g+=N,v+=j);var E=c.parentNode;c=E&&E.nodeType===Node.DOCUMENT_FRAGMENT_NODE?E.host:E}while(!f&&c!==document.body||f&&(t.contains(c)||t===c));return(m&&Math.abs(g)<1||!m&&Math.abs(v)<1)&&(h=!0),h},wd=function(e){return"changedTouches"in e?[e.changedTouches[0].clientX,e.changedTouches[0].clientY]:[0,0]},Ow=function(e){return[e.deltaX,e.deltaY]},_w=function(e){return e&&"current"in e?e.current:e},pT=function(e,t){return e[0]===t[0]&&e[1]===t[1]},gT=function(e){return` + .block-interactivity-`.concat(e,` {pointer-events: none;} + .allow-interactivity-`).concat(e,` {pointer-events: all;} +`)},vT=0,Xo=[];function yT(e){var t=y.useRef([]),r=y.useRef([0,0]),n=y.useRef(),a=y.useState(vT++)[0],o=y.useState(HN)[0],u=y.useRef(e);y.useEffect(function(){u.current=e},[e]),y.useEffect(function(){if(e.inert){document.body.classList.add("block-interactivity-".concat(a));var k=zI([e.lockRef.current],(e.shards||[]).map(_w),!0).filter(Boolean);return k.forEach(function(S){return S.classList.add("allow-interactivity-".concat(a))}),function(){document.body.classList.remove("block-interactivity-".concat(a)),k.forEach(function(S){return S.classList.remove("allow-interactivity-".concat(a))})}}},[e.inert,e.lockRef.current,e.shards]);var c=y.useCallback(function(k,S){if("touches"in k&&k.touches.length===2||k.type==="wheel"&&k.ctrlKey)return!u.current.allowPinchZoom;var N=wd(k),E=r.current,A="deltaX"in k?k.deltaX:E[0]-N[0],P="deltaY"in k?k.deltaY:E[1]-N[1],M,O=k.target,D=Math.abs(A)>Math.abs(P)?"h":"v";if("touches"in k&&D==="h"&&O.type==="range")return!1;var B=window.getSelection(),F=B&&B.anchorNode,z=F?F===O||F.contains(O):!1;if(z)return!1;var Y=Pw(D,O);if(!Y)return!0;if(Y?M=D:(M=D==="v"?"h":"v",Y=Pw(D,O)),!Y)return!1;if(!n.current&&"changedTouches"in k&&(A||P)&&(n.current=M),!M)return!0;var U=n.current||M;return mT(U,S,k,U==="h"?A:P)},[]),f=y.useCallback(function(k){var S=k;if(!(!Xo.length||Xo[Xo.length-1]!==o)){var N="deltaY"in S?Ow(S):wd(S),E=t.current.filter(function(M){return M.name===S.type&&(M.target===S.target||S.target===M.shadowParent)&&pT(M.delta,N)})[0];if(E&&E.should){S.cancelable&&S.preventDefault();return}if(!E){var A=(u.current.shards||[]).map(_w).filter(Boolean).filter(function(M){return M.contains(S.target)}),P=A.length>0?c(S,A[0]):!u.current.noIsolation;P&&S.cancelable&&S.preventDefault()}}},[]),h=y.useCallback(function(k,S,N,E){var A={name:k,delta:S,target:N,should:E,shadowParent:xT(N)};t.current.push(A),setTimeout(function(){t.current=t.current.filter(function(P){return P!==A})},1)},[]),m=y.useCallback(function(k){r.current=wd(k),n.current=void 0},[]),g=y.useCallback(function(k){h(k.type,Ow(k),k.target,c(k,e.lockRef.current))},[]),v=y.useCallback(function(k){h(k.type,wd(k),k.target,c(k,e.lockRef.current))},[]);y.useEffect(function(){return Xo.push(o),e.setCallbacks({onScrollCapture:g,onWheelCapture:g,onTouchMoveCapture:v}),document.addEventListener("wheel",f,Yo),document.addEventListener("touchmove",f,Yo),document.addEventListener("touchstart",m,Yo),function(){Xo=Xo.filter(function(k){return k!==o}),document.removeEventListener("wheel",f,Yo),document.removeEventListener("touchmove",f,Yo),document.removeEventListener("touchstart",m,Yo)}},[]);var b=e.removeScrollBar,j=e.inert;return y.createElement(y.Fragment,null,j?y.createElement(o,{styles:gT(a)}):null,b?y.createElement(sT,{noRelative:e.noRelative,gapMode:e.gapMode}):null)}function xT(e){for(var t=null;e!==null;)e instanceof ShadowRoot&&(t=e.host,e=e.host),e=e.parentNode;return t}const bT=qI(UN,yT);var VN=y.forwardRef(function(e,t){return y.createElement(oh,In({},e,{ref:t,sideCar:bT}))});VN.classNames=oh.classNames;var wT=function(e){if(typeof document>"u")return null;var t=Array.isArray(e)?e[0]:e;return t.ownerDocument.body},Zo=new WeakMap,kd=new WeakMap,jd={},tg=0,qN=function(e){return e&&(e.host||qN(e.parentNode))},kT=function(e,t){return t.map(function(r){if(e.contains(r))return r;var n=qN(r);return n&&e.contains(n)?n:(console.error("aria-hidden",r,"in not contained inside",e,". Doing nothing"),null)}).filter(function(r){return!!r})},jT=function(e,t,r,n){var a=kT(t,Array.isArray(e)?e:[e]);jd[r]||(jd[r]=new WeakMap);var o=jd[r],u=[],c=new Set,f=new Set(a),h=function(g){!g||c.has(g)||(c.add(g),h(g.parentNode))};a.forEach(h);var m=function(g){!g||f.has(g)||Array.prototype.forEach.call(g.children,function(v){if(c.has(v))m(v);else try{var b=v.getAttribute(n),j=b!==null&&b!=="false",k=(Zo.get(v)||0)+1,S=(o.get(v)||0)+1;Zo.set(v,k),o.set(v,S),u.push(v),k===1&&j&&kd.set(v,!0),S===1&&v.setAttribute(r,"true"),j||v.setAttribute(n,"true")}catch(N){console.error("aria-hidden: cannot operate on ",v,N)}})};return m(t),c.clear(),tg++,function(){u.forEach(function(g){var v=Zo.get(g)-1,b=o.get(g)-1;Zo.set(g,v),o.set(g,b),v||(kd.has(g)||g.removeAttribute(n),kd.delete(g)),b||g.removeAttribute(r)}),tg--,tg||(Zo=new WeakMap,Zo=new WeakMap,kd=new WeakMap,jd={})}},ST=function(e,t,r){r===void 0&&(r="data-aria-hidden");var n=Array.from(Array.isArray(e)?e:[e]),a=wT(e);return a?(n.push.apply(n,Array.from(a.querySelectorAll("[aria-live], script"))),jT(n,a,r,"aria-hidden")):function(){return null}},sh="Dialog",[QN]=Z4(sh),[NT,xn]=QN(sh),YN=e=>{const{__scopeDialog:t,children:r,open:n,defaultOpen:a,onOpenChange:o,modal:u=!0}=e,c=y.useRef(null),f=y.useRef(null),[h,m]=nI({prop:n,defaultProp:a??!1,onChange:o,caller:sh});return l.jsx(NT,{scope:t,triggerRef:c,contentRef:f,contentId:di(),titleId:di(),descriptionId:di(),open:h,onOpenChange:m,onOpenToggle:y.useCallback(()=>m(g=>!g),[m]),modal:u,children:r})};YN.displayName=sh;var XN="DialogTrigger",ET=y.forwardRef((e,t)=>{const{__scopeDialog:r,...n}=e,a=xn(XN,r),o=xo(t,a.triggerRef);return l.jsx(Qt.button,{type:"button","aria-haspopup":"dialog","aria-expanded":a.open,"aria-controls":a.open?a.contentId:void 0,"data-state":by(a.open),...n,ref:o,onClick:da(e.onClick,a.onOpenToggle)})});ET.displayName=XN;var xy="DialogPortal",[AT,ZN]=QN(xy,{forceMount:void 0}),JN=e=>{const{__scopeDialog:t,forceMount:r,children:n,container:a}=e,o=xn(xy,t);return l.jsx(AT,{scope:t,forceMount:r,children:y.Children.map(n,u=>l.jsx(ah,{present:r||o.open,children:l.jsx(zN,{asChild:!0,container:a,children:u})}))})};JN.displayName=xy;var nf="DialogOverlay",eE=y.forwardRef((e,t)=>{const r=ZN(nf,e.__scopeDialog),{forceMount:n=r.forceMount,...a}=e,o=xn(nf,e.__scopeDialog);return o.modal?l.jsx(ah,{present:n||o.open,children:l.jsx(PT,{...a,ref:t})}):null});eE.displayName=nf;var CT=TN("DialogOverlay.RemoveScroll"),PT=y.forwardRef((e,t)=>{const{__scopeDialog:r,...n}=e,a=xn(nf,r),o=jI(),u=xo(t,o);return l.jsx(VN,{as:CT,allowPinchZoom:!0,shards:[a.contentRef],children:l.jsx(Qt.div,{"data-state":by(a.open),...n,ref:u,style:{pointerEvents:"auto",...n.style}})})}),Ds="DialogContent",tE=y.forwardRef((e,t)=>{const r=ZN(Ds,e.__scopeDialog),{forceMount:n=r.forceMount,...a}=e,o=xn(Ds,e.__scopeDialog);return l.jsx(ah,{present:n||o.open,children:o.modal?l.jsx(OT,{...a,ref:t}):l.jsx(_T,{...a,ref:t})})});tE.displayName=Ds;var OT=y.forwardRef((e,t)=>{const r=xn(Ds,e.__scopeDialog),n=y.useRef(null),a=xo(t,r.contentRef,n);return y.useEffect(()=>{const o=n.current;if(o)return ST(o)},[]),l.jsx(rE,{...e,ref:a,trapFocus:r.open,disableOutsidePointerEvents:r.open,onCloseAutoFocus:da(e.onCloseAutoFocus,o=>{var u;o.preventDefault(),(u=r.triggerRef.current)==null||u.focus()}),onPointerDownOutside:da(e.onPointerDownOutside,o=>{const u=o.detail.originalEvent,c=u.button===0&&u.ctrlKey===!0;(u.button===2||c)&&o.preventDefault()}),onFocusOutside:da(e.onFocusOutside,o=>o.preventDefault())})}),_T=y.forwardRef((e,t)=>{const r=xn(Ds,e.__scopeDialog),n=y.useRef(!1),a=y.useRef(!1);return l.jsx(rE,{...e,ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:o=>{var u,c;(u=e.onCloseAutoFocus)==null||u.call(e,o),o.defaultPrevented||(n.current||(c=r.triggerRef.current)==null||c.focus(),o.preventDefault()),n.current=!1,a.current=!1},onInteractOutside:o=>{var f,h;(f=e.onInteractOutside)==null||f.call(e,o),o.defaultPrevented||(n.current=!0,o.detail.originalEvent.type==="pointerdown"&&(a.current=!0));const u=o.target;((h=r.triggerRef.current)==null?void 0:h.contains(u))&&o.preventDefault(),o.detail.originalEvent.type==="focusin"&&a.current&&o.preventDefault()}})}),rE=y.forwardRef((e,t)=>{const{__scopeDialog:r,trapFocus:n,onOpenAutoFocus:a,onCloseAutoFocus:o,...u}=e,c=xn(Ds,r);return $I(),l.jsx(l.Fragment,{children:l.jsx(LN,{asChild:!0,loop:!0,trapped:n,onMountAutoFocus:a,onUnmountAutoFocus:o,children:l.jsx(DN,{role:"dialog",id:c.contentId,"aria-describedby":c.descriptionId,"aria-labelledby":c.titleId,"data-state":by(c.open),...u,ref:t,deferPointerDownOutside:!0,onDismiss:()=>c.onOpenChange(!1)})})})}),nE="DialogTitle",MT=y.forwardRef((e,t)=>{const{__scopeDialog:r,...n}=e,a=xn(nE,r);return l.jsx(Qt.h2,{id:a.titleId,...n,ref:t})});MT.displayName=nE;var iE="DialogDescription",IT=y.forwardRef((e,t)=>{const{__scopeDialog:r,...n}=e,a=xn(iE,r);return l.jsx(Qt.p,{id:a.descriptionId,...n,ref:t})});IT.displayName=iE;var aE="DialogClose",TT=y.forwardRef((e,t)=>{const{__scopeDialog:r,...n}=e,a=xn(aE,r);return l.jsx(Qt.button,{type:"button",...n,ref:t,onClick:da(e.onClick,()=>a.onOpenChange(!1))})});TT.displayName=aE;function by(e){return e?"open":"closed"}var Kl='[cmdk-group=""]',rg='[cmdk-group-items=""]',DT='[cmdk-group-heading=""]',oE='[cmdk-item=""]',Mw=`${oE}:not([aria-disabled="true"])`,lv="cmdk-item-select",ss="data-value",RT=(e,t,r)=>X4(e,t,r),sE=y.createContext(void 0),Hu=()=>y.useContext(sE),lE=y.createContext(void 0),wy=()=>y.useContext(lE),uE=y.createContext(void 0),cE=y.forwardRef((e,t)=>{let r=ls(()=>{var _,W;return{search:"",value:(W=(_=e.value)!=null?_:e.defaultValue)!=null?W:"",selectedItemId:void 0,filtered:{count:0,items:new Map,groups:new Set}}}),n=ls(()=>new Set),a=ls(()=>new Map),o=ls(()=>new Map),u=ls(()=>new Set),c=dE(e),{label:f,children:h,value:m,onValueChange:g,filter:v,shouldFilter:b,loop:j,disablePointerSelection:k=!1,vimBindings:S=!0,...N}=e,E=di(),A=di(),P=di(),M=y.useRef(null),O=VT();lo(()=>{if(m!==void 0){let _=m.trim();r.current.value=_,D.emit()}},[m]),lo(()=>{O(6,me)},[]);let D=y.useMemo(()=>({subscribe:_=>(u.current.add(_),()=>u.current.delete(_)),snapshot:()=>r.current,setState:(_,W,ee)=>{var Z,he,pe,Pe;if(!Object.is(r.current[_],W)){if(r.current[_]=W,_==="search")U(),z(),O(1,Y);else if(_==="value"){if(document.activeElement.hasAttribute("cmdk-input")||document.activeElement.hasAttribute("cmdk-root")){let ne=document.getElementById(P);ne?ne.focus():(Z=document.getElementById(E))==null||Z.focus()}if(O(7,()=>{var ne;r.current.selectedItemId=(ne=ue())==null?void 0:ne.id,D.emit()}),ee||O(5,me),((he=c.current)==null?void 0:he.value)!==void 0){let ne=W??"";(Pe=(pe=c.current).onValueChange)==null||Pe.call(pe,ne);return}}D.emit()}},emit:()=>{u.current.forEach(_=>_())}}),[]),B=y.useMemo(()=>({value:(_,W,ee)=>{var Z;W!==((Z=o.current.get(_))==null?void 0:Z.value)&&(o.current.set(_,{value:W,keywords:ee}),r.current.filtered.items.set(_,F(W,ee)),O(2,()=>{z(),D.emit()}))},item:(_,W)=>(n.current.add(_),W&&(a.current.has(W)?a.current.get(W).add(_):a.current.set(W,new Set([_]))),O(3,()=>{U(),z(),r.current.value||Y(),D.emit()}),()=>{o.current.delete(_),n.current.delete(_),r.current.filtered.items.delete(_);let ee=ue();O(4,()=>{U(),(ee==null?void 0:ee.getAttribute("id"))===_&&Y(),D.emit()})}),group:_=>(a.current.has(_)||a.current.set(_,new Set),()=>{o.current.delete(_),a.current.delete(_)}),filter:()=>c.current.shouldFilter,label:f||e["aria-label"],getDisablePointerSelection:()=>c.current.disablePointerSelection,listId:E,inputId:P,labelId:A,listInnerRef:M}),[]);function F(_,W){var ee,Z;let he=(Z=(ee=c.current)==null?void 0:ee.filter)!=null?Z:RT;return _?he(_,r.current.search,W):0}function z(){if(!r.current.search||c.current.shouldFilter===!1)return;let _=r.current.filtered.items,W=[];r.current.filtered.groups.forEach(Z=>{let he=a.current.get(Z),pe=0;he.forEach(Pe=>{let ne=_.get(Pe);pe=Math.max(ne,pe)}),W.push([Z,pe])});let ee=M.current;ge().sort((Z,he)=>{var pe,Pe;let ne=Z.getAttribute("id"),we=he.getAttribute("id");return((pe=_.get(we))!=null?pe:0)-((Pe=_.get(ne))!=null?Pe:0)}).forEach(Z=>{let he=Z.closest(rg);he?he.appendChild(Z.parentElement===he?Z:Z.closest(`${rg} > *`)):ee.appendChild(Z.parentElement===ee?Z:Z.closest(`${rg} > *`))}),W.sort((Z,he)=>he[1]-Z[1]).forEach(Z=>{var he;let pe=(he=M.current)==null?void 0:he.querySelector(`${Kl}[${ss}="${encodeURIComponent(Z[0])}"]`);pe==null||pe.parentElement.appendChild(pe)})}function Y(){let _=ge().find(ee=>ee.getAttribute("aria-disabled")!=="true"),W=_==null?void 0:_.getAttribute(ss);D.setState("value",W||void 0)}function U(){var _,W,ee,Z;if(!r.current.search||c.current.shouldFilter===!1){r.current.filtered.count=n.current.size;return}r.current.filtered.groups=new Set;let he=0;for(let pe of n.current){let Pe=(W=(_=o.current.get(pe))==null?void 0:_.value)!=null?W:"",ne=(Z=(ee=o.current.get(pe))==null?void 0:ee.keywords)!=null?Z:[],we=F(Pe,ne);r.current.filtered.items.set(pe,we),we>0&&he++}for(let[pe,Pe]of a.current)for(let ne of Pe)if(r.current.filtered.items.get(ne)>0){r.current.filtered.groups.add(pe);break}r.current.filtered.count=he}function me(){var _,W,ee;let Z=ue();Z&&(((_=Z.parentElement)==null?void 0:_.firstChild)===Z&&((ee=(W=Z.closest(Kl))==null?void 0:W.querySelector(DT))==null||ee.scrollIntoView({block:"nearest"})),Z.scrollIntoView({block:"nearest"}))}function ue(){var _;return(_=M.current)==null?void 0:_.querySelector(`${oE}[aria-selected="true"]`)}function ge(){var _;return Array.from(((_=M.current)==null?void 0:_.querySelectorAll(Mw))||[])}function ie(_){let W=ge()[_];W&&D.setState("value",W.getAttribute(ss))}function oe(_){var W;let ee=ue(),Z=ge(),he=Z.findIndex(Pe=>Pe===ee),pe=Z[he+_];(W=c.current)!=null&&W.loop&&(pe=he+_<0?Z[Z.length-1]:he+_===Z.length?Z[0]:Z[he+_]),pe&&D.setState("value",pe.getAttribute(ss))}function X(_){let W=ue(),ee=W==null?void 0:W.closest(Kl),Z;for(;ee&&!Z;)ee=_>0?KT(ee,Kl):GT(ee,Kl),Z=ee==null?void 0:ee.querySelector(Mw);Z?D.setState("value",Z.getAttribute(ss)):oe(_)}let re=()=>ie(ge().length-1),J=_=>{_.preventDefault(),_.metaKey?re():_.altKey?X(1):oe(1)},I=_=>{_.preventDefault(),_.metaKey?ie(0):_.altKey?X(-1):oe(-1)};return y.createElement(Qt.div,{ref:t,tabIndex:-1,...N,"cmdk-root":"",onKeyDown:_=>{var W;(W=N.onKeyDown)==null||W.call(N,_);let ee=_.nativeEvent.isComposing||_.keyCode===229;if(!(_.defaultPrevented||ee))switch(_.key){case"n":case"j":{S&&_.ctrlKey&&J(_);break}case"ArrowDown":{J(_);break}case"p":case"k":{S&&_.ctrlKey&&I(_);break}case"ArrowUp":{I(_);break}case"Home":{_.preventDefault(),ie(0);break}case"End":{_.preventDefault(),re();break}case"Enter":{_.preventDefault();let Z=ue();if(Z){let he=new Event(lv);Z.dispatchEvent(he)}}}}},y.createElement("label",{"cmdk-label":"",htmlFor:B.inputId,id:B.labelId,style:QT},f),lh(e,_=>y.createElement(lE.Provider,{value:D},y.createElement(sE.Provider,{value:B},_))))}),LT=y.forwardRef((e,t)=>{var r,n;let a=di(),o=y.useRef(null),u=y.useContext(uE),c=Hu(),f=dE(e),h=(n=(r=f.current)==null?void 0:r.forceMount)!=null?n:u==null?void 0:u.forceMount;lo(()=>{if(!h)return c.item(a,u==null?void 0:u.id)},[h]);let m=fE(a,o,[e.value,e.children,o],e.keywords),g=wy(),v=pa(O=>O.value&&O.value===m.current),b=pa(O=>h||c.filter()===!1?!0:O.search?O.filtered.items.get(a)>0:!0);y.useEffect(()=>{let O=o.current;if(!(!O||e.disabled))return O.addEventListener(lv,j),()=>O.removeEventListener(lv,j)},[b,e.onSelect,e.disabled]);function j(){var O,D;k(),(D=(O=f.current).onSelect)==null||D.call(O,m.current)}function k(){g.setState("value",m.current,!0)}if(!b)return null;let{disabled:S,value:N,onSelect:E,forceMount:A,keywords:P,...M}=e;return y.createElement(Qt.div,{ref:Ts(o,t),...M,id:a,"cmdk-item":"",role:"option","aria-disabled":!!S,"aria-selected":!!v,"data-disabled":!!S,"data-selected":!!v,onPointerMove:S||c.getDisablePointerSelection()?void 0:k,onClick:S?void 0:j},e.children)}),$T=y.forwardRef((e,t)=>{let{heading:r,children:n,forceMount:a,...o}=e,u=di(),c=y.useRef(null),f=y.useRef(null),h=di(),m=Hu(),g=pa(b=>a||m.filter()===!1?!0:b.search?b.filtered.groups.has(u):!0);lo(()=>m.group(u),[]),fE(u,c,[e.value,e.heading,f]);let v=y.useMemo(()=>({id:u,forceMount:a}),[a]);return y.createElement(Qt.div,{ref:Ts(c,t),...o,"cmdk-group":"",role:"presentation",hidden:g?void 0:!0},r&&y.createElement("div",{ref:f,"cmdk-group-heading":"","aria-hidden":!0,id:h},r),lh(e,b=>y.createElement("div",{"cmdk-group-items":"",role:"group","aria-labelledby":r?h:void 0},y.createElement(uE.Provider,{value:v},b))))}),zT=y.forwardRef((e,t)=>{let{alwaysRender:r,...n}=e,a=y.useRef(null),o=pa(u=>!u.search);return!r&&!o?null:y.createElement(Qt.div,{ref:Ts(a,t),...n,"cmdk-separator":"",role:"separator"})}),FT=y.forwardRef((e,t)=>{let{onValueChange:r,...n}=e,a=e.value!=null,o=wy(),u=pa(h=>h.search),c=pa(h=>h.selectedItemId),f=Hu();return y.useEffect(()=>{e.value!=null&&o.setState("search",e.value)},[e.value]),y.createElement(Qt.input,{ref:t,...n,"cmdk-input":"",autoComplete:"off",autoCorrect:"off",spellCheck:!1,"aria-autocomplete":"list",role:"combobox","aria-expanded":!0,"aria-controls":f.listId,"aria-labelledby":f.labelId,"aria-activedescendant":c,id:f.inputId,type:"text",value:a?e.value:u,onChange:h=>{a||o.setState("search",h.target.value),r==null||r(h.target.value)}})}),BT=y.forwardRef((e,t)=>{let{children:r,label:n="Suggestions",...a}=e,o=y.useRef(null),u=y.useRef(null),c=pa(h=>h.selectedItemId),f=Hu();return y.useEffect(()=>{if(u.current&&o.current){let h=u.current,m=o.current,g,v=new ResizeObserver(()=>{g=requestAnimationFrame(()=>{let b=h.offsetHeight;m.style.setProperty("--cmdk-list-height",b.toFixed(1)+"px")})});return v.observe(h),()=>{cancelAnimationFrame(g),v.unobserve(h)}}},[]),y.createElement(Qt.div,{ref:Ts(o,t),...a,"cmdk-list":"",role:"listbox",tabIndex:-1,"aria-activedescendant":c,"aria-label":n,id:f.listId},lh(e,h=>y.createElement("div",{ref:Ts(u,f.listInnerRef),"cmdk-list-sizer":""},h)))}),UT=y.forwardRef((e,t)=>{let{open:r,onOpenChange:n,overlayClassName:a,contentClassName:o,container:u,...c}=e;return y.createElement(YN,{open:r,onOpenChange:n},y.createElement(JN,{container:u},y.createElement(eE,{"cmdk-overlay":"",className:a}),y.createElement(tE,{"aria-label":e.label,"cmdk-dialog":"",className:o},y.createElement(cE,{ref:t,...c}))))}),HT=y.forwardRef((e,t)=>pa(r=>r.filtered.count===0)?y.createElement(Qt.div,{ref:t,...e,"cmdk-empty":"",role:"presentation"}):null),WT=y.forwardRef((e,t)=>{let{progress:r,children:n,label:a="Loading...",...o}=e;return y.createElement(Qt.div,{ref:t,...o,"cmdk-loading":"",role:"progressbar","aria-valuenow":r,"aria-valuemin":0,"aria-valuemax":100,"aria-label":a},lh(e,u=>y.createElement("div",{"aria-hidden":!0},u)))}),Jo=Object.assign(cE,{List:BT,Item:LT,Input:FT,Group:$T,Separator:zT,Dialog:UT,Empty:HT,Loading:WT});function KT(e,t){let r=e.nextElementSibling;for(;r;){if(r.matches(t))return r;r=r.nextElementSibling}}function GT(e,t){let r=e.previousElementSibling;for(;r;){if(r.matches(t))return r;r=r.previousElementSibling}}function dE(e){let t=y.useRef(e);return lo(()=>{t.current=e}),t}var lo=typeof window>"u"?y.useEffect:y.useLayoutEffect;function ls(e){let t=y.useRef();return t.current===void 0&&(t.current=e()),t}function pa(e){let t=wy(),r=()=>e(t.snapshot());return y.useSyncExternalStore(t.subscribe,r,r)}function fE(e,t,r,n=[]){let a=y.useRef(),o=Hu();return lo(()=>{var u;let c=(()=>{var h;for(let m of r){if(typeof m=="string")return m.trim();if(typeof m=="object"&&"current"in m)return m.current?(h=m.current.textContent)==null?void 0:h.trim():a.current}})(),f=n.map(h=>h.trim());o.value(e,c,f),(u=t.current)==null||u.setAttribute(ss,c),a.current=c}),a}var VT=()=>{let[e,t]=y.useState(),r=ls(()=>new Map);return lo(()=>{r.current.forEach(n=>n()),r.current=new Map},[e]),(n,a)=>{r.current.set(n,a),t({})}};function qT(e){let t=e.type;return typeof t=="function"?t(e.props):"render"in t?t.render(e.props):e}function lh({asChild:e,children:t},r){return e&&y.isValidElement(t)?y.cloneElement(qT(t),{ref:t.ref},r(t.props.children)):r(t)}var QT={position:"absolute",width:"1px",height:"1px",padding:"0",margin:"-1px",overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0"};function YT({onNavigate:e}){const[t,r]=y.useState(!1);return y.useEffect(()=>{const n=a=>{(a.metaKey||a.ctrlKey)&&a.key.toLowerCase()==="k"&&(a.preventDefault(),r(o=>!o))};return document.addEventListener("keydown",n),()=>document.removeEventListener("keydown",n)},[]),l.jsx(Jo.Dialog,{open:t,onOpenChange:r,label:"Befehlspalette",className:"fixed inset-0 z-50 flex items-start justify-center bg-black/50 p-4 pt-[12vh] overscroll-contain",onClick:()=>r(!1),children:l.jsxs("div",{className:"w-full max-w-lg overflow-hidden rounded-xl border border-border bg-popover text-popover-foreground shadow-2xl",onClick:n=>n.stopPropagation(),children:[l.jsx(Jo.Input,{autoFocus:!0,placeholder:"Springe zu… (Modelle, Routing, System …)",className:"w-full border-b border-border bg-transparent px-4 py-3 text-sm outline-none placeholder:text-muted-foreground"}),l.jsxs(Jo.List,{className:"max-h-80 overflow-y-auto p-2",children:[l.jsx(Jo.Empty,{className:"px-3 py-6 text-center text-sm text-muted-foreground",children:"Nichts gefunden."}),l.jsx(Jo.Group,{heading:"Bereiche",className:"px-1 py-1 text-xs text-muted-foreground",children:su.map(n=>l.jsxs(Jo.Item,{value:`${n.label} ${n.hint}`,onSelect:()=>{e(n.id),r(!1)},className:"flex cursor-pointer items-center gap-3 rounded-md px-3 py-2 text-sm text-foreground aria-selected:bg-accent aria-selected:text-accent-foreground",children:[l.jsx(n.icon,{className:"h-4 w-4 text-primary"}),l.jsx("span",{children:n.label}),l.jsx("span",{className:"ml-auto truncate text-xs text-muted-foreground",children:n.hint})]},n.id))})]})]})})}const hE="mc_expert_mode",uv="mc-expert-mode-change",XT=()=>{try{return localStorage.getItem(hE)==="true"}catch{return!1}};function ZT(e){return window.addEventListener(uv,e),window.addEventListener("storage",e),()=>{window.removeEventListener(uv,e),window.removeEventListener("storage",e)}}function Iw(e){localStorage.setItem(hE,String(e)),window.dispatchEvent(new Event(uv))}function mE(){return y.useSyncExternalStore(ZT,XT,()=>!1)}function pE(e){var t,r,n="";if(typeof e=="string"||typeof e=="number")n+=e;else if(typeof e=="object")if(Array.isArray(e)){var a=e.length;for(t=0;t{const t=tD(e),{conflictingClassGroups:r,conflictingClassGroupModifiers:n}=e;return{getClassGroupId:u=>{const c=u.split(ky);return c[0]===""&&c.length!==1&&c.shift(),gE(c,t)||eD(u)},getConflictingClassGroupIds:(u,c)=>{const f=r[u]||[];return c&&n[u]?[...f,...n[u]]:f}}},gE=(e,t)=>{var u;if(e.length===0)return t.classGroupId;const r=e[0],n=t.nextPart.get(r),a=n?gE(e.slice(1),n):void 0;if(a)return a;if(t.validators.length===0)return;const o=e.join(ky);return(u=t.validators.find(({validator:c})=>c(o)))==null?void 0:u.classGroupId},Tw=/^\[(.+)\]$/,eD=e=>{if(Tw.test(e)){const t=Tw.exec(e)[1],r=t==null?void 0:t.substring(0,t.indexOf(":"));if(r)return"arbitrary.."+r}},tD=e=>{const{theme:t,prefix:r}=e,n={nextPart:new Map,validators:[]};return nD(Object.entries(e.classGroups),r).forEach(([o,u])=>{cv(u,n,o,t)}),n},cv=(e,t,r,n)=>{e.forEach(a=>{if(typeof a=="string"){const o=a===""?t:Dw(t,a);o.classGroupId=r;return}if(typeof a=="function"){if(rD(a)){cv(a(n),t,r,n);return}t.validators.push({validator:a,classGroupId:r});return}Object.entries(a).forEach(([o,u])=>{cv(u,Dw(t,o),r,n)})})},Dw=(e,t)=>{let r=e;return t.split(ky).forEach(n=>{r.nextPart.has(n)||r.nextPart.set(n,{nextPart:new Map,validators:[]}),r=r.nextPart.get(n)}),r},rD=e=>e.isThemeGetter,nD=(e,t)=>t?e.map(([r,n])=>{const a=n.map(o=>typeof o=="string"?t+o:typeof o=="object"?Object.fromEntries(Object.entries(o).map(([u,c])=>[t+u,c])):o);return[r,a]}):e,iD=e=>{if(e<1)return{get:()=>{},set:()=>{}};let t=0,r=new Map,n=new Map;const a=(o,u)=>{r.set(o,u),t++,t>e&&(t=0,n=r,r=new Map)};return{get(o){let u=r.get(o);if(u!==void 0)return u;if((u=n.get(o))!==void 0)return a(o,u),u},set(o,u){r.has(o)?r.set(o,u):a(o,u)}}},vE="!",aD=e=>{const{separator:t,experimentalParseClassName:r}=e,n=t.length===1,a=t[0],o=t.length,u=c=>{const f=[];let h=0,m=0,g;for(let S=0;Sm?g-m:void 0;return{modifiers:f,hasImportantModifier:b,baseClassName:j,maybePostfixModifierPosition:k}};return r?c=>r({className:c,parseClassName:u}):u},oD=e=>{if(e.length<=1)return e;const t=[];let r=[];return e.forEach(n=>{n[0]==="["?(t.push(...r.sort(),n),r=[]):r.push(n)}),t.push(...r.sort()),t},sD=e=>({cache:iD(e.cacheSize),parseClassName:aD(e),...JT(e)}),lD=/\s+/,uD=(e,t)=>{const{parseClassName:r,getClassGroupId:n,getConflictingClassGroupIds:a}=t,o=[],u=e.trim().split(lD);let c="";for(let f=u.length-1;f>=0;f-=1){const h=u[f],{modifiers:m,hasImportantModifier:g,baseClassName:v,maybePostfixModifierPosition:b}=r(h);let j=!!b,k=n(j?v.substring(0,b):v);if(!k){if(!j){c=h+(c.length>0?" "+c:c);continue}if(k=n(v),!k){c=h+(c.length>0?" "+c:c);continue}j=!1}const S=oD(m).join(":"),N=g?S+vE:S,E=N+k;if(o.includes(E))continue;o.push(E);const A=a(k,j);for(let P=0;P0?" "+c:c)}return c};function cD(){let e=0,t,r,n="";for(;e{if(typeof e=="string")return e;let t,r="";for(let n=0;ng(m),e());return r=sD(h),n=r.cache.get,a=r.cache.set,o=c,c(f)}function c(f){const h=n(f);if(h)return h;const m=uD(f,r);return a(f,m),m}return function(){return o(cD.apply(null,arguments))}}const ot=e=>{const t=r=>r[e]||[];return t.isThemeGetter=!0,t},xE=/^\[(?:([a-z-]+):)?(.+)\]$/i,fD=/^\d+\/\d+$/,hD=new Set(["px","full","screen"]),mD=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,pD=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,gD=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,vD=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,yD=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,ri=e=>ms(e)||hD.has(e)||fD.test(e),Gi=e=>Vs(e,"length",ED),ms=e=>!!e&&!Number.isNaN(Number(e)),ng=e=>Vs(e,"number",ms),Gl=e=>!!e&&Number.isInteger(Number(e)),xD=e=>e.endsWith("%")&&ms(e.slice(0,-1)),$e=e=>xE.test(e),Vi=e=>mD.test(e),bD=new Set(["length","size","percentage"]),wD=e=>Vs(e,bD,bE),kD=e=>Vs(e,"position",bE),jD=new Set(["image","url"]),SD=e=>Vs(e,jD,CD),ND=e=>Vs(e,"",AD),Vl=()=>!0,Vs=(e,t,r)=>{const n=xE.exec(e);return n?n[1]?typeof t=="string"?n[1]===t:t.has(n[1]):r(n[2]):!1},ED=e=>pD.test(e)&&!gD.test(e),bE=()=>!1,AD=e=>vD.test(e),CD=e=>yD.test(e),PD=()=>{const e=ot("colors"),t=ot("spacing"),r=ot("blur"),n=ot("brightness"),a=ot("borderColor"),o=ot("borderRadius"),u=ot("borderSpacing"),c=ot("borderWidth"),f=ot("contrast"),h=ot("grayscale"),m=ot("hueRotate"),g=ot("invert"),v=ot("gap"),b=ot("gradientColorStops"),j=ot("gradientColorStopPositions"),k=ot("inset"),S=ot("margin"),N=ot("opacity"),E=ot("padding"),A=ot("saturate"),P=ot("scale"),M=ot("sepia"),O=ot("skew"),D=ot("space"),B=ot("translate"),F=()=>["auto","contain","none"],z=()=>["auto","hidden","clip","visible","scroll"],Y=()=>["auto",$e,t],U=()=>[$e,t],me=()=>["",ri,Gi],ue=()=>["auto",ms,$e],ge=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],ie=()=>["solid","dashed","dotted","double","none"],oe=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],X=()=>["start","end","center","between","around","evenly","stretch"],re=()=>["","0",$e],J=()=>["auto","avoid","all","avoid-page","page","left","right","column"],I=()=>[ms,$e];return{cacheSize:500,separator:":",theme:{colors:[Vl],spacing:[ri,Gi],blur:["none","",Vi,$e],brightness:I(),borderColor:[e],borderRadius:["none","","full",Vi,$e],borderSpacing:U(),borderWidth:me(),contrast:I(),grayscale:re(),hueRotate:I(),invert:re(),gap:U(),gradientColorStops:[e],gradientColorStopPositions:[xD,Gi],inset:Y(),margin:Y(),opacity:I(),padding:U(),saturate:I(),scale:I(),sepia:re(),skew:I(),space:U(),translate:U()},classGroups:{aspect:[{aspect:["auto","square","video",$e]}],container:["container"],columns:[{columns:[Vi]}],"break-after":[{"break-after":J()}],"break-before":[{"break-before":J()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...ge(),$e]}],overflow:[{overflow:z()}],"overflow-x":[{"overflow-x":z()}],"overflow-y":[{"overflow-y":z()}],overscroll:[{overscroll:F()}],"overscroll-x":[{"overscroll-x":F()}],"overscroll-y":[{"overscroll-y":F()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[k]}],"inset-x":[{"inset-x":[k]}],"inset-y":[{"inset-y":[k]}],start:[{start:[k]}],end:[{end:[k]}],top:[{top:[k]}],right:[{right:[k]}],bottom:[{bottom:[k]}],left:[{left:[k]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",Gl,$e]}],basis:[{basis:Y()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",$e]}],grow:[{grow:re()}],shrink:[{shrink:re()}],order:[{order:["first","last","none",Gl,$e]}],"grid-cols":[{"grid-cols":[Vl]}],"col-start-end":[{col:["auto",{span:["full",Gl,$e]},$e]}],"col-start":[{"col-start":ue()}],"col-end":[{"col-end":ue()}],"grid-rows":[{"grid-rows":[Vl]}],"row-start-end":[{row:["auto",{span:[Gl,$e]},$e]}],"row-start":[{"row-start":ue()}],"row-end":[{"row-end":ue()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",$e]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",$e]}],gap:[{gap:[v]}],"gap-x":[{"gap-x":[v]}],"gap-y":[{"gap-y":[v]}],"justify-content":[{justify:["normal",...X()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...X(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...X(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[E]}],px:[{px:[E]}],py:[{py:[E]}],ps:[{ps:[E]}],pe:[{pe:[E]}],pt:[{pt:[E]}],pr:[{pr:[E]}],pb:[{pb:[E]}],pl:[{pl:[E]}],m:[{m:[S]}],mx:[{mx:[S]}],my:[{my:[S]}],ms:[{ms:[S]}],me:[{me:[S]}],mt:[{mt:[S]}],mr:[{mr:[S]}],mb:[{mb:[S]}],ml:[{ml:[S]}],"space-x":[{"space-x":[D]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[D]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",$e,t]}],"min-w":[{"min-w":[$e,t,"min","max","fit"]}],"max-w":[{"max-w":[$e,t,"none","full","min","max","fit","prose",{screen:[Vi]},Vi]}],h:[{h:[$e,t,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[$e,t,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[$e,t,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[$e,t,"auto","min","max","fit"]}],"font-size":[{text:["base",Vi,Gi]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",ng]}],"font-family":[{font:[Vl]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",$e]}],"line-clamp":[{"line-clamp":["none",ms,ng]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",ri,$e]}],"list-image":[{"list-image":["none",$e]}],"list-style-type":[{list:["none","disc","decimal",$e]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[e]}],"placeholder-opacity":[{"placeholder-opacity":[N]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[e]}],"text-opacity":[{"text-opacity":[N]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...ie(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",ri,Gi]}],"underline-offset":[{"underline-offset":["auto",ri,$e]}],"text-decoration-color":[{decoration:[e]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:U()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",$e]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",$e]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[N]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...ge(),kD]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",wD]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},SD]}],"bg-color":[{bg:[e]}],"gradient-from-pos":[{from:[j]}],"gradient-via-pos":[{via:[j]}],"gradient-to-pos":[{to:[j]}],"gradient-from":[{from:[b]}],"gradient-via":[{via:[b]}],"gradient-to":[{to:[b]}],rounded:[{rounded:[o]}],"rounded-s":[{"rounded-s":[o]}],"rounded-e":[{"rounded-e":[o]}],"rounded-t":[{"rounded-t":[o]}],"rounded-r":[{"rounded-r":[o]}],"rounded-b":[{"rounded-b":[o]}],"rounded-l":[{"rounded-l":[o]}],"rounded-ss":[{"rounded-ss":[o]}],"rounded-se":[{"rounded-se":[o]}],"rounded-ee":[{"rounded-ee":[o]}],"rounded-es":[{"rounded-es":[o]}],"rounded-tl":[{"rounded-tl":[o]}],"rounded-tr":[{"rounded-tr":[o]}],"rounded-br":[{"rounded-br":[o]}],"rounded-bl":[{"rounded-bl":[o]}],"border-w":[{border:[c]}],"border-w-x":[{"border-x":[c]}],"border-w-y":[{"border-y":[c]}],"border-w-s":[{"border-s":[c]}],"border-w-e":[{"border-e":[c]}],"border-w-t":[{"border-t":[c]}],"border-w-r":[{"border-r":[c]}],"border-w-b":[{"border-b":[c]}],"border-w-l":[{"border-l":[c]}],"border-opacity":[{"border-opacity":[N]}],"border-style":[{border:[...ie(),"hidden"]}],"divide-x":[{"divide-x":[c]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[c]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[N]}],"divide-style":[{divide:ie()}],"border-color":[{border:[a]}],"border-color-x":[{"border-x":[a]}],"border-color-y":[{"border-y":[a]}],"border-color-s":[{"border-s":[a]}],"border-color-e":[{"border-e":[a]}],"border-color-t":[{"border-t":[a]}],"border-color-r":[{"border-r":[a]}],"border-color-b":[{"border-b":[a]}],"border-color-l":[{"border-l":[a]}],"divide-color":[{divide:[a]}],"outline-style":[{outline:["",...ie()]}],"outline-offset":[{"outline-offset":[ri,$e]}],"outline-w":[{outline:[ri,Gi]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:me()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[e]}],"ring-opacity":[{"ring-opacity":[N]}],"ring-offset-w":[{"ring-offset":[ri,Gi]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",Vi,ND]}],"shadow-color":[{shadow:[Vl]}],opacity:[{opacity:[N]}],"mix-blend":[{"mix-blend":[...oe(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":oe()}],filter:[{filter:["","none"]}],blur:[{blur:[r]}],brightness:[{brightness:[n]}],contrast:[{contrast:[f]}],"drop-shadow":[{"drop-shadow":["","none",Vi,$e]}],grayscale:[{grayscale:[h]}],"hue-rotate":[{"hue-rotate":[m]}],invert:[{invert:[g]}],saturate:[{saturate:[A]}],sepia:[{sepia:[M]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[r]}],"backdrop-brightness":[{"backdrop-brightness":[n]}],"backdrop-contrast":[{"backdrop-contrast":[f]}],"backdrop-grayscale":[{"backdrop-grayscale":[h]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[m]}],"backdrop-invert":[{"backdrop-invert":[g]}],"backdrop-opacity":[{"backdrop-opacity":[N]}],"backdrop-saturate":[{"backdrop-saturate":[A]}],"backdrop-sepia":[{"backdrop-sepia":[M]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[u]}],"border-spacing-x":[{"border-spacing-x":[u]}],"border-spacing-y":[{"border-spacing-y":[u]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",$e]}],duration:[{duration:I()}],ease:[{ease:["linear","in","out","in-out",$e]}],delay:[{delay:I()}],animate:[{animate:["none","spin","ping","pulse","bounce",$e]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[P]}],"scale-x":[{"scale-x":[P]}],"scale-y":[{"scale-y":[P]}],rotate:[{rotate:[Gl,$e]}],"translate-x":[{"translate-x":[B]}],"translate-y":[{"translate-y":[B]}],"skew-x":[{"skew-x":[O]}],"skew-y":[{"skew-y":[O]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",$e]}],accent:[{accent:["auto",e]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",$e]}],"caret-color":[{caret:[e]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":U()}],"scroll-mx":[{"scroll-mx":U()}],"scroll-my":[{"scroll-my":U()}],"scroll-ms":[{"scroll-ms":U()}],"scroll-me":[{"scroll-me":U()}],"scroll-mt":[{"scroll-mt":U()}],"scroll-mr":[{"scroll-mr":U()}],"scroll-mb":[{"scroll-mb":U()}],"scroll-ml":[{"scroll-ml":U()}],"scroll-p":[{"scroll-p":U()}],"scroll-px":[{"scroll-px":U()}],"scroll-py":[{"scroll-py":U()}],"scroll-ps":[{"scroll-ps":U()}],"scroll-pe":[{"scroll-pe":U()}],"scroll-pt":[{"scroll-pt":U()}],"scroll-pr":[{"scroll-pr":U()}],"scroll-pb":[{"scroll-pb":U()}],"scroll-pl":[{"scroll-pl":U()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",$e]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[ri,Gi,ng]}],stroke:[{stroke:[e,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}},OD=dD(PD);function te(...e){return OD(rt(e))}function Rs(e){return e?e.replace(/127\.0\.0\.1|localhost/g,"192.168.178.151"):""}function wE(){const e=mE();return l.jsxs("div",{className:"flex items-center rounded-md border border-border/40 bg-background/40 p-0.5",role:"group","aria-label":"Ansichtsmodus",title:"Einfach zeigt nur das Wichtigste. Experte zeigt alle technischen Details.",children:[l.jsxs("button",{onClick:()=>Iw(!1),"aria-pressed":!e,className:te("flex items-center gap-1 rounded px-2 py-1 text-xs font-semibold transition-all cursor-pointer",e?"text-muted-foreground hover:text-foreground":"bg-primary/15 text-primary shadow-sm"),children:[l.jsx(cs,{className:"h-3.5 w-3.5"})," Einfach"]}),l.jsxs("button",{onClick:()=>Iw(!0),"aria-pressed":e,className:te("flex items-center gap-1 rounded px-2 py-1 text-xs font-semibold transition-all cursor-pointer",e?"bg-primary/15 text-primary shadow-sm":"text-muted-foreground hover:text-foreground"),children:[l.jsx($4,{className:"h-3.5 w-3.5"})," Experte"]})]})}async function je(e,t){var f;const r={"Content-Type":"application/json",...t==null?void 0:t.headers},n=localStorage.getItem("mc_sudo_password"),a=localStorage.getItem("mc_hf_token");n&&(r["X-Sudo-Password"]=n);let o=t==null?void 0:t.body;if((((f=t==null?void 0:t.method)==null?void 0:f.toUpperCase())||"GET")==="POST"){if(typeof o=="string")try{const h=JSON.parse(o);let m=!1;n&&!("sudo_password"in h)&&(h.sudo_password=n,m=!0),a&&!("hf_token"in h)&&(h.hf_token=a,m=!0),m&&(o=JSON.stringify(h))}catch{}else if(!o){const h={};n&&(h.sudo_password=n),a&&(h.hf_token=a),Object.keys(h).length>0&&(o=JSON.stringify(h))}}const c=await fetch(e,{...t,headers:r,body:o});if(!c.ok)throw new Error(`${c.status} ${c.statusText}`);return c.json()}const kE=(e,t,r=!1,n=!0)=>je("/api/groups",{method:"PUT",body:JSON.stringify({group:e,members:t,swap:r,persist:n})}),_D=e=>je("/api/routing/policy",{method:"PUT",body:JSON.stringify(e)}),Ve={health:["health"],systemStatus:["system-status"],services:["services"],models:["models"],groups:["groups"],routing:["routing"],routingPolicy:["routing-policy"],voiceMetrics:["voice-metrics"],jobs:["jobs"],tokenStats:["token-stats"],agentStatus:["agent-status"],hermesBrain:["hermes-brain"],updates:["updates"],discover:["discover"],drafts:e=>["drafts",e??""],connect:e=>["connect",e??""],connectHealth:["connect-health"],memory:(e,t)=>["memory",e??"",t??""],memoryGraph:["memory-graph"]},MD=(e=!0)=>Lt({queryKey:Ve.memoryGraph,queryFn:()=>je("/api/memory/graph"),enabled:e}),jy=()=>Lt({queryKey:Ve.health,queryFn:()=>je("/api/health"),refetchInterval:1e4}),bo=(e=5e3)=>Lt({queryKey:Ve.systemStatus,queryFn:()=>je("/api/system/status"),refetchInterval:e}),jE=(e=3e3)=>Lt({queryKey:Ve.services,queryFn:()=>je("/api/system/services"),refetchInterval:e}),xi=(e=4e3)=>Lt({queryKey:Ve.models,queryFn:()=>je("/api/models"),refetchInterval:e}),SE=(e=8e3)=>Lt({queryKey:Ve.groups,queryFn:()=>je("/api/groups"),refetchInterval:e}),ID=(e=5e3)=>Lt({queryKey:Ve.voiceMetrics,queryFn:()=>je("/api/voice/metrics"),refetchInterval:e}),TD=()=>Lt({queryKey:Ve.routingPolicy,queryFn:()=>je("/api/routing/policy")}),DD=(e=2e3)=>Lt({queryKey:Ve.jobs,queryFn:()=>je("/api/jobs"),refetchInterval:e,select:t=>t.jobs??[]}),Sy=(e=3e3)=>Lt({queryKey:Ve.tokenStats,queryFn:()=>je("/api/system/token-stats"),refetchInterval:e}),Ny=(e=5e3)=>Lt({queryKey:Ve.agentStatus,queryFn:()=>je("/api/agent/status"),refetchInterval:e}),NE=(e=6e4)=>Lt({queryKey:Ve.hermesBrain,queryFn:()=>je("/api/agent/brain"),refetchInterval:e}),uh=e=>Lt({queryKey:Ve.updates,queryFn:()=>je("/api/maintenance/updates"),refetchInterval:e}),RD=()=>Lt({queryKey:Ve.discover,queryFn:()=>je("/api/discover")}),LD=e=>Lt({queryKey:Ve.drafts(e),queryFn:()=>je(`/api/models/drafts?target=${encodeURIComponent(e??"")}`),enabled:!!e}),$D=e=>Lt({queryKey:Ve.connect(e),queryFn:()=>je(e?`/api/connect?${e}`:"/api/connect")}),zD=()=>Lt({queryKey:Ve.connectHealth,queryFn:()=>je("/api/connect/health"),refetchInterval:15e3}),dv=e=>Lt({queryKey:Ve.memory(e==null?void 0:e.q,e==null?void 0:e.category),queryFn:()=>{const t=new URLSearchParams;return e!=null&&e.q&&t.set("q",e.q),e!=null&&e.category&&t.set("category",e.category),je(`/api/memory?${t}`)},select:t=>e!=null&&e.limit?t.slice(0,e.limit):t});let fv=[],hv=[];const mv=new Set,EE=()=>mv.forEach(e=>e());function AE(e){return mv.add(e),()=>{mv.delete(e)}}function FD(e){fv=[...fv,e].slice(-40),EE()}function BD(e){hv=[...hv,e].slice(-40),EE()}const UD=()=>y.useSyncExternalStore(AE,()=>fv),HD=()=>y.useSyncExternalStore(AE,()=>hv);function WD(){const{data:e,dataUpdatedAt:t}=bo(3e3),{data:r,dataUpdatedAt:n}=Sy(3e3),a=y.useRef(null);y.useEffect(()=>{var o,u,c,f;e&&FD({t:Date.now(),cpu:((o=e.cpu)==null?void 0:o.percent)??0,ram:((u=e.ram)==null?void 0:u.percent)??0,gpu:((c=e.gpu)==null?void 0:c.busy_percent)??null,disk:((f=e.disk)==null?void 0:f.percent)??null})},[t]),y.useEffect(()=>{if(!r)return;const o=Date.now(),u=r.prompt_tokens,c=r.completion_tokens;if(a.current){const f=Math.max((o-a.current.t)/1e3,.001);BD({t:o,prompt:Math.max(0,(u-a.current.p)/f),completion:Math.max(0,(c-a.current.c)/f)})}a.current={p:u,c,t:o}},[n])}function KD(){const{data:e,error:t}=bo(3e3),r=UD();return{sys:e,hist:r,error:t}}function Xi(e){return(e/1024**3).toFixed(1)}function pv(e){return e?e>1024**3?`${(e/1024**3).toFixed(1)} GB`:`${(e/1024**2).toFixed(0)} MB`:""}function Mr(e){if(!e)return"—";const t=e/1024**3;return t>=1?`${t.toFixed(1)} GB`:`${(e/1024**2).toFixed(0)} MB`}function GD(e){if(!e)return"";const t=Math.floor(e/60);return t>0?`${t} min`:`${e} s`}function Rw(e){return e?`${Math.round(e/1024)}k`:"—"}var VD=["dangerouslySetInnerHTML","onCopy","onCopyCapture","onCut","onCutCapture","onPaste","onPasteCapture","onCompositionEnd","onCompositionEndCapture","onCompositionStart","onCompositionStartCapture","onCompositionUpdate","onCompositionUpdateCapture","onFocus","onFocusCapture","onBlur","onBlurCapture","onChange","onChangeCapture","onBeforeInput","onBeforeInputCapture","onInput","onInputCapture","onReset","onResetCapture","onSubmit","onSubmitCapture","onInvalid","onInvalidCapture","onLoad","onLoadCapture","onError","onErrorCapture","onKeyDown","onKeyDownCapture","onKeyPress","onKeyPressCapture","onKeyUp","onKeyUpCapture","onAbort","onAbortCapture","onCanPlay","onCanPlayCapture","onCanPlayThrough","onCanPlayThroughCapture","onDurationChange","onDurationChangeCapture","onEmptied","onEmptiedCapture","onEncrypted","onEncryptedCapture","onEnded","onEndedCapture","onLoadedData","onLoadedDataCapture","onLoadedMetadata","onLoadedMetadataCapture","onLoadStart","onLoadStartCapture","onPause","onPauseCapture","onPlay","onPlayCapture","onPlaying","onPlayingCapture","onProgress","onProgressCapture","onRateChange","onRateChangeCapture","onSeeked","onSeekedCapture","onSeeking","onSeekingCapture","onStalled","onStalledCapture","onSuspend","onSuspendCapture","onTimeUpdate","onTimeUpdateCapture","onVolumeChange","onVolumeChangeCapture","onWaiting","onWaitingCapture","onAuxClick","onAuxClickCapture","onClick","onClickCapture","onContextMenu","onContextMenuCapture","onDoubleClick","onDoubleClickCapture","onDrag","onDragCapture","onDragEnd","onDragEndCapture","onDragEnter","onDragEnterCapture","onDragExit","onDragExitCapture","onDragLeave","onDragLeaveCapture","onDragOver","onDragOverCapture","onDragStart","onDragStartCapture","onDrop","onDropCapture","onMouseDown","onMouseDownCapture","onMouseEnter","onMouseLeave","onMouseMove","onMouseMoveCapture","onMouseOut","onMouseOutCapture","onMouseOver","onMouseOverCapture","onMouseUp","onMouseUpCapture","onSelect","onSelectCapture","onTouchCancel","onTouchCancelCapture","onTouchEnd","onTouchEndCapture","onTouchMove","onTouchMoveCapture","onTouchStart","onTouchStartCapture","onPointerDown","onPointerDownCapture","onPointerMove","onPointerMoveCapture","onPointerUp","onPointerUpCapture","onPointerCancel","onPointerCancelCapture","onPointerEnter","onPointerEnterCapture","onPointerLeave","onPointerLeaveCapture","onPointerOver","onPointerOverCapture","onPointerOut","onPointerOutCapture","onGotPointerCapture","onGotPointerCaptureCapture","onLostPointerCapture","onLostPointerCaptureCapture","onScroll","onScrollCapture","onWheel","onWheelCapture","onAnimationStart","onAnimationStartCapture","onAnimationEnd","onAnimationEndCapture","onAnimationIteration","onAnimationIterationCapture","onTransitionEnd","onTransitionEndCapture"];function Ey(e){if(typeof e!="string")return!1;var t=VD;return t.includes(e)}var qD=["aria-activedescendant","aria-atomic","aria-autocomplete","aria-busy","aria-checked","aria-colcount","aria-colindex","aria-colspan","aria-controls","aria-current","aria-describedby","aria-details","aria-disabled","aria-errormessage","aria-expanded","aria-flowto","aria-haspopup","aria-hidden","aria-invalid","aria-keyshortcuts","aria-label","aria-labelledby","aria-level","aria-live","aria-modal","aria-multiline","aria-multiselectable","aria-orientation","aria-owns","aria-placeholder","aria-posinset","aria-pressed","aria-readonly","aria-relevant","aria-required","aria-roledescription","aria-rowcount","aria-rowindex","aria-rowspan","aria-selected","aria-setsize","aria-sort","aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext","className","color","height","id","lang","max","media","method","min","name","style","target","width","role","tabIndex","accentHeight","accumulate","additive","alignmentBaseline","allowReorder","alphabetic","amplitude","arabicForm","ascent","attributeName","attributeType","autoReverse","azimuth","baseFrequency","baselineShift","baseProfile","bbox","begin","bias","by","calcMode","capHeight","clip","clipPath","clipPathUnits","clipRule","colorInterpolation","colorInterpolationFilters","colorProfile","colorRendering","contentScriptType","contentStyleType","cursor","cx","cy","d","decelerate","descent","diffuseConstant","direction","display","divisor","dominantBaseline","dur","dx","dy","edgeMode","elevation","enableBackground","end","exponent","externalResourcesRequired","fill","fillOpacity","fillRule","filter","filterRes","filterUnits","floodColor","floodOpacity","focusable","fontFamily","fontSize","fontSizeAdjust","fontStretch","fontStyle","fontVariant","fontWeight","format","from","fx","fy","g1","g2","glyphName","glyphOrientationHorizontal","glyphOrientationVertical","glyphRef","gradientTransform","gradientUnits","hanging","horizAdvX","horizOriginX","href","ideographic","imageRendering","in2","in","intercept","k1","k2","k3","k4","k","kernelMatrix","kernelUnitLength","kerning","keyPoints","keySplines","keyTimes","lengthAdjust","letterSpacing","lightingColor","limitingConeAngle","local","markerEnd","markerHeight","markerMid","markerStart","markerUnits","markerWidth","mask","maskContentUnits","maskUnits","mathematical","mode","numOctaves","offset","opacity","operator","order","orient","orientation","origin","overflow","overlinePosition","overlineThickness","paintOrder","panose1","pathLength","patternContentUnits","patternTransform","patternUnits","pointerEvents","pointsAtX","pointsAtY","pointsAtZ","preserveAlpha","preserveAspectRatio","primitiveUnits","r","radius","refX","refY","renderingIntent","repeatCount","repeatDur","requiredExtensions","requiredFeatures","restart","result","rotate","rx","ry","seed","shapeRendering","slope","spacing","specularConstant","specularExponent","speed","spreadMethod","startOffset","stdDeviation","stemh","stemv","stitchTiles","stopColor","stopOpacity","strikethroughPosition","strikethroughThickness","string","stroke","strokeDasharray","strokeDashoffset","strokeLinecap","strokeLinejoin","strokeMiterlimit","strokeOpacity","strokeWidth","surfaceScale","systemLanguage","tableValues","targetX","targetY","textAnchor","textDecoration","textLength","textRendering","to","transform","u1","u2","underlinePosition","underlineThickness","unicode","unicodeBidi","unicodeRange","unitsPerEm","vAlphabetic","values","vectorEffect","version","vertAdvY","vertOriginX","vertOriginY","vHanging","vIdeographic","viewTarget","visibility","vMathematical","widths","wordSpacing","writingMode","x1","x2","x","xChannelSelector","xHeight","xlinkActuate","xlinkArcrole","xlinkHref","xlinkRole","xlinkShow","xlinkTitle","xlinkType","xmlBase","xmlLang","xmlns","xmlnsXlink","xmlSpace","y1","y2","y","yChannelSelector","z","zoomAndPan","ref","key","angle"],QD=new Set(qD);function CE(e){return typeof e!="string"?!1:QD.has(e)}function PE(e){return typeof e=="string"&&e.startsWith("data-")}function vn(e){if(typeof e!="object"||e===null)return{};var t={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(CE(r)||PE(r))&&(t[r]=e[r]);return t}function ch(e){if(e==null)return null;if(y.isValidElement(e)&&typeof e.props=="object"&&e.props!==null){var t=e.props;return vn(t)}return typeof e=="object"&&!Array.isArray(e)?vn(e):null}function Xr(e){var t={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(CE(r)||PE(r)||Ey(r))&&(t[r]=e[r]);return t}function YD(e){return e==null?null:y.isValidElement(e)?Xr(e.props):typeof e=="object"&&!Array.isArray(e)?Xr(e):null}var XD=["children","width","height","viewBox","className","style","title","desc"];function gv(){return gv=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var r=e.children,n=e.width,a=e.height,o=e.viewBox,u=e.className,c=e.style,f=e.title,h=e.desc,m=ZD(e,XD),g=o||{width:n,height:a,x:0,y:0},v=rt("recharts-surface",u);return y.createElement("svg",gv({},Xr(m),{className:v,width:n,height:a,style:c,viewBox:"".concat(g.x," ").concat(g.y," ").concat(g.width," ").concat(g.height),ref:t}),y.createElement("title",null,f),y.createElement("desc",null,h),r)}),eR=["children","className"];function vv(){return vv=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var r=e.children,n=e.className,a=tR(e,eR),o=rt("recharts-layer",n);return y.createElement("g",vv({className:o},Xr(a),{ref:t}),r)}),nR=y.createContext(null);function gt(e){return function(){return e}}const yv=Math.PI,xv=2*yv,za=1e-6,iR=xv-za;function _E(e){this._+=e[0];for(let t=1,r=e.length;t=0))throw new Error(`invalid digits: ${e}`);if(t>15)return _E;const r=10**t;return function(n){this._+=n[0];for(let a=1,o=n.length;aza)if(!(Math.abs(g*f-h*m)>za)||!o)this._append`L${this._x1=t},${this._y1=r}`;else{let b=n-u,j=a-c,k=f*f+h*h,S=b*b+j*j,N=Math.sqrt(k),E=Math.sqrt(v),A=o*Math.tan((yv-Math.acos((k+v-S)/(2*N*E)))/2),P=A/E,M=A/N;Math.abs(P-1)>za&&this._append`L${t+P*m},${r+P*g}`,this._append`A${o},${o},0,0,${+(g*b>m*j)},${this._x1=t+M*f},${this._y1=r+M*h}`}}arc(t,r,n,a,o,u){if(t=+t,r=+r,n=+n,u=!!u,n<0)throw new Error(`negative radius: ${n}`);let c=n*Math.cos(a),f=n*Math.sin(a),h=t+c,m=r+f,g=1^u,v=u?a-o:o-a;this._x1===null?this._append`M${h},${m}`:(Math.abs(this._x1-h)>za||Math.abs(this._y1-m)>za)&&this._append`L${h},${m}`,n&&(v<0&&(v=v%xv+xv),v>iR?this._append`A${n},${n},0,1,${g},${t-c},${r-f}A${n},${n},0,1,${g},${this._x1=h},${this._y1=m}`:v>za&&this._append`A${n},${n},0,${+(v>=yv)},${g},${this._x1=t+n*Math.cos(o)},${this._y1=r+n*Math.sin(o)}`)}rect(t,r,n,a){this._append`M${this._x0=this._x1=+t},${this._y0=this._y1=+r}h${n=+n}v${+a}h${-n}Z`}toString(){return this._}}function ME(e){let t=3;return e.digits=function(r){if(!arguments.length)return t;if(r==null)t=null;else{const n=Math.floor(r);if(!(n>=0))throw new RangeError(`invalid digits: ${r}`);t=n}return e},()=>new oR(t)}function Ay(e){return typeof e=="object"&&"length"in e?e:Array.from(e)}function IE(e){this._context=e}IE.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:this._context.lineTo(e,t);break}}};function dh(e){return new IE(e)}function TE(e){return e[0]}function DE(e){return e[1]}function RE(e,t){var r=gt(!0),n=null,a=dh,o=null,u=ME(c);e=typeof e=="function"?e:e===void 0?TE:gt(e),t=typeof t=="function"?t:t===void 0?DE:gt(t);function c(f){var h,m=(f=Ay(f)).length,g,v=!1,b;for(n==null&&(o=a(b=u())),h=0;h<=m;++h)!(h=b;--j)c.point(A[j],P[j]);c.lineEnd(),c.areaEnd()}N&&(A[v]=+e(S,v,g),P[v]=+t(S,v,g),c.point(n?+n(S,v,g):A[v],r?+r(S,v,g):P[v]))}if(E)return c=null,E+""||null}function m(){return RE().defined(a).curve(u).context(o)}return h.x=function(g){return arguments.length?(e=typeof g=="function"?g:gt(+g),n=null,h):e},h.x0=function(g){return arguments.length?(e=typeof g=="function"?g:gt(+g),h):e},h.x1=function(g){return arguments.length?(n=g==null?null:typeof g=="function"?g:gt(+g),h):n},h.y=function(g){return arguments.length?(t=typeof g=="function"?g:gt(+g),r=null,h):t},h.y0=function(g){return arguments.length?(t=typeof g=="function"?g:gt(+g),h):t},h.y1=function(g){return arguments.length?(r=g==null?null:typeof g=="function"?g:gt(+g),h):r},h.lineX0=h.lineY0=function(){return m().x(e).y(t)},h.lineY1=function(){return m().x(e).y(r)},h.lineX1=function(){return m().x(n).y(t)},h.defined=function(g){return arguments.length?(a=typeof g=="function"?g:gt(!!g),h):a},h.curve=function(g){return arguments.length?(u=g,o!=null&&(c=u(o)),h):u},h.context=function(g){return arguments.length?(g==null?o=c=null:c=u(o=g),h):o},h}class LE{constructor(t,r){this._context=t,this._x=r}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line}point(t,r){switch(t=+t,r=+r,this._point){case 0:{this._point=1,this._line?this._context.lineTo(t,r):this._context.moveTo(t,r);break}case 1:this._point=2;default:{this._x?this._context.bezierCurveTo(this._x0=(this._x0+t)/2,this._y0,this._x0,r,t,r):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+r)/2,t,this._y0,t,r);break}}this._x0=t,this._y0=r}}function sR(e){return new LE(e,!0)}function lR(e){return new LE(e,!1)}function af(){}function of(e,t,r){e._context.bezierCurveTo((2*e._x0+e._x1)/3,(2*e._y0+e._y1)/3,(e._x0+2*e._x1)/3,(e._y0+2*e._y1)/3,(e._x0+4*e._x1+t)/6,(e._y0+4*e._y1+r)/6)}function $E(e){this._context=e}$E.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:of(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:of(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function uR(e){return new $E(e)}function zE(e){this._context=e}zE.prototype={areaStart:af,areaEnd:af,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:{this._context.moveTo(this._x2,this._y2),this._context.closePath();break}case 2:{this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break}case 3:{this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4);break}}},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._x2=e,this._y2=t;break;case 1:this._point=2,this._x3=e,this._y3=t;break;case 2:this._point=3,this._x4=e,this._y4=t,this._context.moveTo((this._x0+4*this._x1+e)/6,(this._y0+4*this._y1+t)/6);break;default:of(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function cR(e){return new zE(e)}function FE(e){this._context=e}FE.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var r=(this._x0+4*this._x1+e)/6,n=(this._y0+4*this._y1+t)/6;this._line?this._context.lineTo(r,n):this._context.moveTo(r,n);break;case 3:this._point=4;default:of(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function dR(e){return new FE(e)}function BE(e){this._context=e}BE.prototype={areaStart:af,areaEnd:af,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(e,t){e=+e,t=+t,this._point?this._context.lineTo(e,t):(this._point=1,this._context.moveTo(e,t))}};function fR(e){return new BE(e)}function Lw(e){return e<0?-1:1}function $w(e,t,r){var n=e._x1-e._x0,a=t-e._x1,o=(e._y1-e._y0)/(n||a<0&&-0),u=(r-e._y1)/(a||n<0&&-0),c=(o*a+u*n)/(n+a);return(Lw(o)+Lw(u))*Math.min(Math.abs(o),Math.abs(u),.5*Math.abs(c))||0}function zw(e,t){var r=e._x1-e._x0;return r?(3*(e._y1-e._y0)/r-t)/2:t}function ig(e,t,r){var n=e._x0,a=e._y0,o=e._x1,u=e._y1,c=(o-n)/3;e._context.bezierCurveTo(n+c,a+c*t,o-c,u-c*r,o,u)}function sf(e){this._context=e}sf.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:ig(this,this._t0,zw(this,this._t0));break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){var r=NaN;if(e=+e,t=+t,!(e===this._x1&&t===this._y1)){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,ig(this,zw(this,r=$w(this,e,t)),r);break;default:ig(this,this._t0,r=$w(this,e,t));break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t,this._t0=r}}};function UE(e){this._context=new HE(e)}(UE.prototype=Object.create(sf.prototype)).point=function(e,t){sf.prototype.point.call(this,t,e)};function HE(e){this._context=e}HE.prototype={moveTo:function(e,t){this._context.moveTo(t,e)},closePath:function(){this._context.closePath()},lineTo:function(e,t){this._context.lineTo(t,e)},bezierCurveTo:function(e,t,r,n,a,o){this._context.bezierCurveTo(t,e,n,r,o,a)}};function hR(e){return new sf(e)}function mR(e){return new UE(e)}function WE(e){this._context=e}WE.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=[],this._y=[]},lineEnd:function(){var e=this._x,t=this._y,r=e.length;if(r)if(this._line?this._context.lineTo(e[0],t[0]):this._context.moveTo(e[0],t[0]),r===2)this._context.lineTo(e[1],t[1]);else for(var n=Fw(e),a=Fw(t),o=0,u=1;u=0;--t)a[t]=(u[t]-a[t+1])/o[t];for(o[r-1]=(e[r]+a[r-1])/2,t=0;t=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:{if(this._t<=0)this._context.lineTo(this._x,t),this._context.lineTo(e,t);else{var r=this._x*(1-this._t)+e*this._t;this._context.lineTo(r,this._y),this._context.lineTo(r,t)}break}}this._x=e,this._y=t}};function gR(e){return new fh(e,.5)}function vR(e){return new fh(e,0)}function yR(e){return new fh(e,1)}function uo(e,t){if((u=e.length)>1)for(var r=1,n,a,o=e[t[0]],u,c=o.length;r=0;)r[t]=t;return r}function xR(e,t){return e[t]}function bR(e){const t=[];return t.key=e,t}function wR(){var e=gt([]),t=bv,r=uo,n=xR;function a(o){var u=Array.from(e.apply(this,arguments),bR),c,f=u.length,h=-1,m;for(const g of o)for(c=0,++h;c0){for(var r,n,a=0,o=e[0].length,u;a0){for(var r=0,n=e[t[0]],a,o=n.length;r0)||!((o=(a=e[t[0]]).length)>0))){for(var r=0,n=1,a,o,u;n1&&arguments[1]!==void 0?arguments[1]:ER,r=10**t,n=Math.round(e*r)/r;return Object.is(n,-0)?0:n}function Wt(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n{var c=r[u-1];return typeof c=="string"?a+c+o:c!==void 0?a+ua(c)+o:a+o},"")}var qr=e=>e===0?0:e>0?1:-1,Fn=e=>typeof e=="number"&&e!=+e,co=e=>typeof e=="string"&&e.length>1&&e.indexOf("%")===e.length-1,Ee=e=>(typeof e=="number"||e instanceof Number)&&!Fn(e),Bn=e=>Ee(e)||typeof e=="string",AR=0,bu=e=>{var t=++AR;return"".concat(e||"").concat(t)},ga=function(t,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,a=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1;if(!Ee(t)&&typeof t!="string")return n;var o;if(co(t)){if(r==null)return n;var u=t.indexOf("%");o=r*parseFloat(t.slice(0,u))/100}else o=+t;return Fn(o)&&(o=n),a&&r!=null&&o>r&&(o=r),o},VE=e=>{if(!Array.isArray(e))return!1;for(var t=e.length,r={},n=0;nn&&(typeof t=="function"?t(n):wo(n,t))===r)}var qt=e=>e===null||typeof e>"u",Oy=e=>qt(e)?e:"".concat(e.charAt(0).toUpperCase()).concat(e.slice(1));function jr(e){return e!=null}function qs(){}var QE=e=>"radius"in e&&"startAngle"in e&&"endAngle"in e,_y=(e,t)=>{if(!e||typeof e=="function"||typeof e=="boolean")return null;var r=e;if(y.isValidElement(e)&&(r=e.props),typeof r!="object"&&typeof r!="function")return null;var n={};return Object.keys(r).forEach(a=>{Ey(a)&&typeof r[a]=="function"&&(n[a]=(o=>r[a](r,o)))}),n},CR=(e,t,r)=>n=>(e(t,r,n),null),PR=(e,t,r)=>{if(e===null||typeof e!="object"&&typeof e!="function")return null;var n=null;return Object.keys(e).forEach(a=>{var o=e[a];Ey(a)&&typeof o=="function"&&(n||(n={}),n[a]=CR(o,t,r))}),n};function Bw(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function OR(e){for(var t=1;t(u[c]===void 0&&n[c]!==void 0&&(u[c]=n[c]),u),r);return o}function TR(e,t){const r=new Map;for(let n=0;nObject.prototype.propertyIsEnumerable.call(e,t))}function My(e){return e==null?e===void 0?"[object Undefined]":"[object Null]":Object.prototype.toString.call(e)}const zR="[object RegExp]",XE="[object String]",ZE="[object Number]",JE="[object Boolean]",e5="[object Arguments]",FR="[object Symbol]",BR="[object Date]",UR="[object Map]",HR="[object Set]",WR="[object Array]",KR="[object ArrayBuffer]",GR="[object Object]",VR="[object DataView]",qR="[object Uint8Array]",QR="[object Uint8ClampedArray]",YR="[object Uint16Array]",XR="[object Uint32Array]",ZR="[object Int8Array]",JR="[object Int16Array]",eL="[object Int32Array]",tL="[object Float32Array]",rL="[object Float64Array]",Uw=typeof globalThis=="object"&&globalThis||typeof window=="object"&&window||typeof self=="object"&&self||typeof global=="object"&&global||(function(){return this})();function nL(e){return typeof Uw.Buffer<"u"&&Uw.Buffer.isBuffer(e)}function iL(e,t){return Wa(e,void 0,e,new Map,t)}function Wa(e,t,r,n=new Map,a=void 0){const o=a==null?void 0:a(e,t,r,n);if(o!==void 0)return o;if(kv(e))return e;if(n.has(e))return n.get(e);if(Array.isArray(e)){const u=new Array(e.length);n.set(e,u);for(let c=0;c{}):jv(e,t,function n(a,o,u,c,f,h){const m=r(a,o,u,c,f,h);return m!==void 0?!!m:jv(a,o,n,h,!1)},new Map,!0)}function jv(e,t,r,n,a=!1){if(t===e)return!0;switch(typeof t){case"object":return sL(e,t,r,n);case"function":return Object.keys(t).length>0?jv(e,{...t},r,n,a):Wd(e,t);default:return t5(e)&&a?typeof t=="string"?t==="":!0:Wd(e,t)}}function sL(e,t,r,n){if(t==null)return!0;if(Array.isArray(t))return n5(e,t,r,n);if(t instanceof Map)return lL(e,t,r,n);if(t instanceof Set)return uL(e,t,r,n);const a=Object.keys(t);if(e==null||kv(e))return a.length===0;if(a.length===0)return!0;if(n!=null&&n.has(t))return n.get(t)===e;n==null||n.set(t,e);try{for(let o=0;o{})}function cL(e){return e=oL(e),t=>i5(t,e)}function dL(e,t){return iL(e,(r,n,a,o)=>{if(typeof e=="object"){if(My(e)==="[object Object]"&&typeof e.constructor!="function"){const u={};return o.set(e,u),dn(u,e,a,o),u}switch(Object.prototype.toString.call(e)){case ZE:case XE:case JE:{const u=new e.constructor(e==null?void 0:e.valueOf());return dn(u,e),u}case e5:{const u={};return dn(u,e),u.length=e.length,u[Symbol.iterator]=e[Symbol.iterator],u}default:return}}})}function fL(e){return dL(e)}const hL=/^(?:0|[1-9]\d*)$/;function a5(e,t=Number.MAX_SAFE_INTEGER){switch(typeof e){case"number":return Number.isInteger(e)&&e>=0&&e=0}function o5(e){return e!=null&&typeof e!="function"&&yL(e.length)}function xL(e){return typeof e=="object"&&e!==null}function bL(e){return xL(e)&&o5(e)}function Hw(e,t=YE){return bL(e)?TR(Array.from(e),DR(vL(t),1)):[]}function wL(e,t,r){return t===!0?Hw(e,r):typeof t=="function"?Hw(e,t):e}var ag={exports:{}},og={},sg={exports:{}},lg={};/** + * @license React + * use-sync-external-store-shim.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Ww;function kL(){if(Ww)return lg;Ww=1;var e=Ks();function t(g,v){return g===v&&(g!==0||1/g===1/v)||g!==g&&v!==v}var r=typeof Object.is=="function"?Object.is:t,n=e.useState,a=e.useEffect,o=e.useLayoutEffect,u=e.useDebugValue;function c(g,v){var b=v(),j=n({inst:{value:b,getSnapshot:v}}),k=j[0].inst,S=j[1];return o(function(){k.value=b,k.getSnapshot=v,f(k)&&S({inst:k})},[g,b,v]),a(function(){return f(k)&&S({inst:k}),g(function(){f(k)&&S({inst:k})})},[g]),u(b),b}function f(g){var v=g.getSnapshot;g=g.value;try{var b=v();return!r(g,b)}catch{return!0}}function h(g,v){return v()}var m=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?h:c;return lg.useSyncExternalStore=e.useSyncExternalStore!==void 0?e.useSyncExternalStore:m,lg}var Kw;function jL(){return Kw||(Kw=1,sg.exports=kL()),sg.exports}/** + * @license React + * use-sync-external-store-shim/with-selector.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Gw;function SL(){if(Gw)return og;Gw=1;var e=Ks(),t=jL();function r(h,m){return h===m&&(h!==0||1/h===1/m)||h!==h&&m!==m}var n=typeof Object.is=="function"?Object.is:r,a=t.useSyncExternalStore,o=e.useRef,u=e.useEffect,c=e.useMemo,f=e.useDebugValue;return og.useSyncExternalStoreWithSelector=function(h,m,g,v,b){var j=o(null);if(j.current===null){var k={hasValue:!1,value:null};j.current=k}else k=j.current;j=c(function(){function N(O){if(!E){if(E=!0,A=O,O=v(O),b!==void 0&&k.hasValue){var D=k.value;if(b(D,O))return P=D}return P=O}if(D=P,n(A,O))return D;var B=v(O);return b!==void 0&&b(D,B)?(A=O,D):(A=O,P=B)}var E=!1,A,P,M=g===void 0?null:g;return[function(){return N(m())},M===null?void 0:function(){return N(M())}]},[m,g,v,b]);var S=a(h,j[0],j[1]);return u(function(){k.hasValue=!0,k.value=S},[S]),f(S),S},og}var Vw;function NL(){return Vw||(Vw=1,ag.exports=SL()),ag.exports}var EL=NL(),Iy=y.createContext(null),AL=e=>e,St=()=>{var e=y.useContext(Iy);return e?e.store.dispatch:AL},Kd=()=>{},CL=()=>Kd,PL=(e,t)=>e===t;function Me(e){var t=y.useContext(Iy),r=y.useMemo(()=>t?n=>{if(n!=null)return e(n)}:Kd,[t,e]);return EL.useSyncExternalStoreWithSelector(t?t.subscription.addNestedSub:CL,t?t.store.getState:Kd,t?t.store.getState:Kd,r,PL)}function OL(e,t=`expected a function, instead received ${typeof e}`){if(typeof e!="function")throw new TypeError(t)}function _L(e,t="expected all items to be functions, instead received the following types: "){if(!e.every(r=>typeof r=="function")){const r=e.map(n=>typeof n=="function"?`function ${n.name||"unnamed"}()`:typeof n).join(", ");throw new TypeError(`${t}[${r}]`)}}var qw=e=>Array.isArray(e)?e:[e];function ML(e){const t=Array.isArray(e[0])?e[0]:e;return _L(t,"createSelector expects all input-selectors to be functions, but received the following types: "),t}function IL(e,t){const r=[],{length:n}=e;for(let a=0;atypeof WeakRef>"u"?TL:WeakRef,s5=DL(),RL=0,Qw=1;function Nd(){return{s:RL,v:void 0,o:null,p:null}}function LL(e){return e instanceof s5?e.deref():e}function l5(e,t={}){let r=Nd();const{resultEqualityCheck:n}=t;let a,o=0;function u(){let c=r;const{length:f}=arguments;for(let g=0,v=f;g{r=Nd(),u.resetResultsCount()},u.resultsCount=()=>o,u.resetResultsCount=()=>{o=0},u}function $L(e,...t){const r=typeof e=="function"?{memoize:e,memoizeOptions:t}:e,n=(...a)=>{let o=0,u=0,c,f={},h=a.pop();typeof h=="object"&&(f=h,h=a.pop()),OL(h,`createSelector expects an output function after the inputs, but received: [${typeof h}]`);const m={...r,...f},{memoize:g,memoizeOptions:v=[],argsMemoize:b=l5,argsMemoizeOptions:j=[]}=m,k=qw(v),S=qw(j),N=ML(a),E=g(function(){return o++,h.apply(null,arguments)},...k),A=b(function(){u++;const M=IL(N,arguments);return c=E.apply(null,M),c},...S);return Object.assign(A,{resultFunc:h,memoizedResultFunc:E,dependencies:N,dependencyRecomputations:()=>u,resetDependencyRecomputations:()=>{u=0},lastResult:()=>c,recomputations:()=>o,resetRecomputations:()=>{o=0},memoize:g,argsMemoize:b})};return Object.assign(n,{withTypes:()=>n}),n}var V=$L(l5);function zL(e,t=1){const r=[],n=Math.floor(t),a=(o,u)=>{for(let c=0;c{if(e!==t){const n=Yw(e),a=Yw(t);if(n===a&&n===0){if(et)return r==="desc"?-1:1}return r==="desc"?a-n:n-a}return 0};function u5(e){return typeof e=="symbol"||e instanceof Symbol}const BL=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,UL=/^\w*$/;function HL(e,t){return Array.isArray(e)?!1:typeof e=="number"||typeof e=="boolean"||e==null||u5(e)?!0:typeof e=="string"&&(UL.test(e)||!BL.test(e))||t!=null}function WL(e,t,r,n){if(e==null)return[];r=r,Array.isArray(e)||(e=Object.values(e)),Array.isArray(t)||(t=t==null?[null]:[t]),t.length===0&&(t=[null]),Array.isArray(r)||(r=r==null?[]:[r]),r=r.map(c=>String(c));const a=(c,f)=>{let h=c;for(let m=0;mf==null||c==null?f:typeof c=="object"&&"key"in c?Object.hasOwn(f,c.key)?f[c.key]:a(f,c.path):typeof c=="function"?c(f):Array.isArray(c)?a(f,c):typeof f=="object"?f[c]:f,u=t.map(c=>(Array.isArray(c)&&c.length===1&&(c=c[0]),c==null||typeof c=="function"||Array.isArray(c)||HL(c)?c:{key:c,path:Py(c)}));return e.map(c=>({original:c,criteria:u.map(f=>o(f,c))})).slice().sort((c,f)=>{for(let h=0;hc.original)}function hh(e,...t){const r=t.length;return r>1&&Sv(e,t[0],t[1])?t=[]:r>2&&Sv(t[0],t[1],t[2])&&(t=[t[0]]),WL(e,zL(t),["asc"])}var c5=e=>e.legend.settings,KL=e=>e.legend.size,GL=e=>e.legend.payload;V([GL,c5],(e,t)=>{var r=t.itemSorter,n=e.flat(1);return r?hh(n,r):n});function VL(e,t){return XL(e)||YL(e,t)||QL(e,t)||qL()}function qL(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function QL(e,t){if(e){if(typeof e=="string")return Xw(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Xw(e,t):void 0}}function Xw(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);rEd||Math.abs(e.left-t.left)>Ed||Math.abs(e.top-t.top)>Ed||Math.abs(e.width-t.width)>Ed}function Jw(e){var t=e.getBoundingClientRect();return{height:t.height,left:t.left,top:t.top,width:t.width}}function ZL(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],t=y.useState({height:0,left:0,top:0,width:0}),r=VL(t,2),n=r[0],a=r[1],o=y.useRef(null),u=y.useRef(n);u.current=n;var c=y.useCallback(f=>{if(o.current!=null&&(o.current.disconnect(),o.current=null),f!=null){var h=Jw(f);if(Zw(h,u.current)&&a(h),typeof ResizeObserver<"u"){var m=new ResizeObserver(()=>{var g=Jw(f);Zw(g,u.current)&&a(g)});m.observe(f),o.current=m}}},[...e]);return y.useEffect(()=>()=>{var f;(f=o.current)===null||f===void 0||f.disconnect()},[]),[n,c]}function Ht(e){return`Minified Redux error #${e}; visit https://redux.js.org/Errors?code=${e} for the full message or use the non-minified dev environment for full errors. `}var JL=typeof Symbol=="function"&&Symbol.observable||"@@observable",ek=JL,ug=()=>Math.random().toString(36).substring(7).split("").join("."),e$={INIT:`@@redux/INIT${ug()}`,REPLACE:`@@redux/REPLACE${ug()}`,PROBE_UNKNOWN_ACTION:()=>`@@redux/PROBE_UNKNOWN_ACTION${ug()}`},lf=e$;function Ty(e){if(typeof e!="object"||e===null)return!1;let t=e;for(;Object.getPrototypeOf(t)!==null;)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t||Object.getPrototypeOf(e)===null}function d5(e,t,r){if(typeof e!="function")throw new Error(Ht(2));if(typeof t=="function"&&typeof r=="function"||typeof r=="function"&&typeof arguments[3]=="function")throw new Error(Ht(0));if(typeof t=="function"&&typeof r>"u"&&(r=t,t=void 0),typeof r<"u"){if(typeof r!="function")throw new Error(Ht(1));return r(d5)(e,t)}let n=e,a=t,o=new Map,u=o,c=0,f=!1;function h(){u===o&&(u=new Map,o.forEach((S,N)=>{u.set(N,S)}))}function m(){if(f)throw new Error(Ht(3));return a}function g(S){if(typeof S!="function")throw new Error(Ht(4));if(f)throw new Error(Ht(5));let N=!0;h();const E=c++;return u.set(E,S),function(){if(N){if(f)throw new Error(Ht(6));N=!1,h(),u.delete(E),o=null}}}function v(S){if(!Ty(S))throw new Error(Ht(7));if(typeof S.type>"u")throw new Error(Ht(8));if(typeof S.type!="string")throw new Error(Ht(17));if(f)throw new Error(Ht(9));try{f=!0,a=n(a,S)}finally{f=!1}return(o=u).forEach(E=>{E()}),S}function b(S){if(typeof S!="function")throw new Error(Ht(10));n=S,v({type:lf.REPLACE})}function j(){const S=g;return{subscribe(N){if(typeof N!="object"||N===null)throw new Error(Ht(11));function E(){const P=N;P.next&&P.next(m())}return E(),{unsubscribe:S(E)}},[ek](){return this}}}return v({type:lf.INIT}),{dispatch:v,subscribe:g,getState:m,replaceReducer:b,[ek]:j}}function t$(e){Object.keys(e).forEach(t=>{const r=e[t];if(typeof r(void 0,{type:lf.INIT})>"u")throw new Error(Ht(12));if(typeof r(void 0,{type:lf.PROBE_UNKNOWN_ACTION()})>"u")throw new Error(Ht(13))})}function f5(e){const t=Object.keys(e),r={};for(let o=0;o"u")throw c&&c.type,new Error(Ht(14));h[g]=j,f=f||j!==b}return f=f||n.length!==Object.keys(u).length,f?h:u}}function uf(...e){return e.length===0?t=>t:e.length===1?e[0]:e.reduce((t,r)=>(...n)=>t(r(...n)))}function r$(...e){return t=>(r,n)=>{const a=t(r,n);let o=()=>{throw new Error(Ht(15))};const u={getState:a.getState,dispatch:(f,...h)=>o(f,...h)},c=e.map(f=>f(u));return o=uf(...c)(a.dispatch),{...a,dispatch:o}}}function h5(e){return Ty(e)&&"type"in e&&typeof e.type=="string"}var m5=Symbol.for("immer-nothing"),tk=Symbol.for("immer-draftable"),hr=Symbol.for("immer-state");function hn(e,...t){throw new Error(`[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`)}var Rr=Object,Ls=Rr.getPrototypeOf,cf="constructor",mh="prototype",Nv="configurable",df="enumerable",Gd="writable",wu="value",pi=e=>!!e&&!!e[hr];function yn(e){var t;return e?p5(e)||gh(e)||!!e[tk]||!!((t=e[cf])!=null&&t[tk])||vh(e)||yh(e):!1}var n$=Rr[mh][cf].toString(),rk=new WeakMap;function p5(e){if(!e||!Dy(e))return!1;const t=Ls(e);if(t===null||t===Rr[mh])return!0;const r=Rr.hasOwnProperty.call(t,cf)&&t[cf];if(r===Object)return!0;if(!us(r))return!1;let n=rk.get(r);return n===void 0&&(n=Function.toString.call(r),rk.set(r,n)),n===n$}function ph(e,t,r=!0){Wu(e)===0?(r?Reflect.ownKeys(e):Rr.keys(e)).forEach(a=>{t(a,e[a],e)}):e.forEach((n,a)=>t(a,n,e))}function Wu(e){const t=e[hr];return t?t.type_:gh(e)?1:vh(e)?2:yh(e)?3:0}var nk=(e,t,r=Wu(e))=>r===2?e.has(t):Rr[mh].hasOwnProperty.call(e,t),Ev=(e,t,r=Wu(e))=>r===2?e.get(t):e[t],ff=(e,t,r,n=Wu(e))=>{n===2?e.set(t,r):n===3?e.add(r):e[t]=r};function i$(e,t){return e===t?e!==0||1/e===1/t:e!==e&&t!==t}var gh=Array.isArray,vh=e=>e instanceof Map,yh=e=>e instanceof Set,Dy=e=>typeof e=="object",us=e=>typeof e=="function",cg=e=>typeof e=="boolean";function a$(e){const t=+e;return Number.isInteger(t)&&String(t)===e}var ii=e=>e.copy_||e.base_,Ry=e=>e.modified_?e.copy_:e.base_;function Av(e,t){if(vh(e))return new Map(e);if(yh(e))return new Set(e);if(gh(e))return Array[mh].slice.call(e);const r=p5(e);if(t===!0||t==="class_only"&&!r){const n=Rr.getOwnPropertyDescriptors(e);delete n[hr];let a=Reflect.ownKeys(n);for(let o=0;o1&&Rr.defineProperties(e,{set:Ad,add:Ad,clear:Ad,delete:Ad}),Rr.freeze(e),t&&ph(e,(r,n)=>{Ly(n,!0)},!1)),e}function o$(){hn(2)}var Ad={[wu]:o$};function xh(e){return e===null||!Dy(e)?!0:Rr.isFrozen(e)}var hf="MapSet",Cv="Patches",ik="ArrayMethods",g5={};function fo(e){const t=g5[e];return t||hn(0,e),t}var ak=e=>!!g5[e],ku,v5=()=>ku,s$=(e,t)=>({drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0,handledSet_:new Set,processedForPatches_:new Set,mapSetPlugin_:ak(hf)?fo(hf):void 0,arrayMethodsPlugin_:ak(ik)?fo(ik):void 0});function ok(e,t){t&&(e.patchPlugin_=fo(Cv),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function Pv(e){Ov(e),e.drafts_.forEach(l$),e.drafts_=null}function Ov(e){e===ku&&(ku=e.parent_)}var sk=e=>ku=s$(ku,e);function l$(e){const t=e[hr];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0}function lk(e,t){t.unfinalizedDrafts_=t.drafts_.length;const r=t.drafts_[0];if(e!==void 0&&e!==r){r[hr].modified_&&(Pv(t),hn(4)),yn(e)&&(e=uk(t,e));const{patchPlugin_:a}=t;a&&a.generateReplacementPatches_(r[hr].base_,e,t)}else e=uk(t,r);return u$(t,e,!0),Pv(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e!==m5?e:void 0}function uk(e,t){if(xh(t))return t;const r=t[hr];if(!r)return mf(t,e.handledSet_,e);if(!bh(r,e))return t;if(!r.modified_)return r.base_;if(!r.finalized_){const{callbacks_:n}=r;if(n)for(;n.length>0;)n.pop()(e);b5(r,e)}return r.copy_}function u$(e,t,r=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&Ly(t,r)}function y5(e){e.finalized_=!0,e.scope_.unfinalizedDrafts_--}var bh=(e,t)=>e.scope_===t,c$=[];function x5(e,t,r,n){const a=ii(e),o=e.type_;if(n!==void 0&&Ev(a,n,o)===t){ff(a,n,r,o);return}if(!e.draftLocations_){const c=e.draftLocations_=new Map;ph(a,(f,h)=>{if(pi(h)){const m=c.get(h)||[];m.push(f),c.set(h,m)}})}const u=e.draftLocations_.get(t)??c$;for(const c of u)ff(a,c,r,o)}function d$(e,t,r){e.callbacks_.push(function(a){var c;const o=t;if(!o||!bh(o,a))return;(c=a.mapSetPlugin_)==null||c.fixSetContents(o);const u=Ry(o);x5(e,o.draft_??o,u,r),b5(o,a)})}function b5(e,t){var n;if(e.modified_&&!e.finalized_&&(e.type_===3||e.type_===1&&e.allIndicesReassigned_||(((n=e.assigned_)==null?void 0:n.size)??0)>0)){const{patchPlugin_:a}=t;if(a){const o=a.getPath(e);o&&a.generatePatches_(e,o,t)}y5(e)}}function f$(e,t,r){const{scope_:n}=e;if(pi(r)){const a=r[hr];bh(a,n)&&a.callbacks_.push(function(){Vd(e);const u=Ry(a);x5(e,r,u,t)})}else yn(r)&&e.callbacks_.push(function(){const o=ii(e);e.type_===3?o.has(r)&&mf(r,n.handledSet_,n):Ev(o,t,e.type_)===r&&n.drafts_.length>1&&(e.assigned_.get(t)??!1)===!0&&e.copy_&&mf(Ev(e.copy_,t,e.type_),n.handledSet_,n)})}function mf(e,t,r){return!r.immer_.autoFreeze_&&r.unfinalizedDrafts_<1||pi(e)||t.has(e)||!yn(e)||xh(e)||(t.add(e),ph(e,(n,a)=>{if(pi(a)){const o=a[hr];if(bh(o,r)){const u=Ry(o);ff(e,n,u,e.type_),y5(o)}}else yn(a)&&mf(a,t,r)})),e}function h$(e,t){const r=gh(e),n={type_:r?1:0,scope_:t?t.scope_:v5(),modified_:!1,finalized_:!1,assigned_:void 0,parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1,callbacks_:void 0};let a=n,o=pf;r&&(a=[n],o=ju);const{revoke:u,proxy:c}=Proxy.revocable(a,o);return n.draft_=c,n.revoke_=u,[c,n]}var pf={get(e,t){if(t===hr)return e;let r=e.scope_.arrayMethodsPlugin_;const n=e.type_===1&&typeof t=="string";if(n&&r!=null&&r.isArrayOperationMethod(t))return r.createMethodInterceptor(e,t);const a=ii(e);if(!nk(a,t,e.type_))return m$(e,a,t);const o=a[t];if(e.finalized_||!yn(o)||n&&e.operationMethod&&(r!=null&&r.isMutatingArrayMethod(e.operationMethod))&&a$(t))return o;if(o===dg(e.base_,t)){Vd(e);const u=e.type_===1?+t:t,c=Mv(e.scope_,o,e,u);return e.copy_[u]=c}return o},has(e,t){return t in ii(e)},ownKeys(e){return Reflect.ownKeys(ii(e))},set(e,t,r){const n=w5(ii(e),t);if(n!=null&&n.set)return n.set.call(e.draft_,r),!0;if(!e.modified_){const a=dg(ii(e),t),o=a==null?void 0:a[hr];if(o&&o.base_===r)return e.copy_[t]=r,e.assigned_.set(t,!1),!0;if(i$(r,a)&&(r!==void 0||nk(e.base_,t,e.type_)))return!0;Vd(e),_v(e)}return e.copy_[t]===r&&(r!==void 0||t in e.copy_)||Number.isNaN(r)&&Number.isNaN(e.copy_[t])||(e.copy_[t]=r,e.assigned_.set(t,!0),f$(e,t,r)),!0},deleteProperty(e,t){return Vd(e),dg(e.base_,t)!==void 0||t in e.base_?(e.assigned_.set(t,!1),_v(e)):e.assigned_.delete(t),e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){const r=ii(e),n=Reflect.getOwnPropertyDescriptor(r,t);return n&&{[Gd]:!0,[Nv]:e.type_!==1||t!=="length",[df]:n[df],[wu]:r[t]}},defineProperty(){hn(11)},getPrototypeOf(e){return Ls(e.base_)},setPrototypeOf(){hn(12)}},ju={};for(let e in pf){let t=pf[e];ju[e]=function(){const r=arguments;return r[0]=r[0][0],t.apply(this,r)}}ju.deleteProperty=function(e,t){return ju.set.call(this,e,t,void 0)};ju.set=function(e,t,r){return pf.set.call(this,e[0],t,r,e[0])};function dg(e,t){const r=e[hr];return(r?ii(r):e)[t]}function m$(e,t,r){var a;const n=w5(t,r);return n?wu in n?n[wu]:(a=n.get)==null?void 0:a.call(e.draft_):void 0}function w5(e,t){if(!(t in e))return;let r=Ls(e);for(;r;){const n=Object.getOwnPropertyDescriptor(r,t);if(n)return n;r=Ls(r)}}function _v(e){e.modified_||(e.modified_=!0,e.parent_&&_v(e.parent_))}function Vd(e){e.copy_||(e.assigned_=new Map,e.copy_=Av(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var p$=class{constructor(t){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!1,this.produce=(r,n,a)=>{if(us(r)&&!us(n)){const u=n;n=r;const c=this;return function(h=u,...m){return c.produce(h,g=>n.call(this,g,...m))}}us(n)||hn(6),a!==void 0&&!us(a)&&hn(7);let o;if(yn(r)){const u=sk(this),c=Mv(u,r,void 0);let f=!0;try{o=n(c),f=!1}finally{f?Pv(u):Ov(u)}return ok(u,a),lk(o,u)}else if(!r||!Dy(r)){if(o=n(r),o===void 0&&(o=r),o===m5&&(o=void 0),this.autoFreeze_&&Ly(o,!0),a){const u=[],c=[];fo(Cv).generateReplacementPatches_(r,o,{patches_:u,inversePatches_:c}),a(u,c)}return o}else hn(1,r)},this.produceWithPatches=(r,n)=>{if(us(r))return(c,...f)=>this.produceWithPatches(c,h=>r(h,...f));let a,o;return[this.produce(r,n,(c,f)=>{a=c,o=f}),a,o]},cg(t==null?void 0:t.autoFreeze)&&this.setAutoFreeze(t.autoFreeze),cg(t==null?void 0:t.useStrictShallowCopy)&&this.setUseStrictShallowCopy(t.useStrictShallowCopy),cg(t==null?void 0:t.useStrictIteration)&&this.setUseStrictIteration(t.useStrictIteration)}createDraft(t){yn(t)||hn(8),pi(t)&&(t=Qr(t));const r=sk(this),n=Mv(r,t,void 0);return n[hr].isManual_=!0,Ov(r),n}finishDraft(t,r){const n=t&&t[hr];(!n||!n.isManual_)&&hn(9);const{scope_:a}=n;return ok(a,r),lk(void 0,a)}setAutoFreeze(t){this.autoFreeze_=t}setUseStrictShallowCopy(t){this.useStrictShallowCopy_=t}setUseStrictIteration(t){this.useStrictIteration_=t}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(t,r){let n;for(n=r.length-1;n>=0;n--){const o=r[n];if(o.path.length===0&&o.op==="replace"){t=o.value;break}}n>-1&&(r=r.slice(n+1));const a=fo(Cv).applyPatches_;return pi(t)?a(t,r):this.produce(t,o=>a(o,r))}};function Mv(e,t,r,n){const[a,o]=vh(t)?fo(hf).proxyMap_(t,r):yh(t)?fo(hf).proxySet_(t,r):h$(t,r);return((r==null?void 0:r.scope_)??v5()).drafts_.push(a),o.callbacks_=(r==null?void 0:r.callbacks_)??[],o.key_=n,r&&n!==void 0?d$(r,o,n):o.callbacks_.push(function(f){var m;(m=f.mapSetPlugin_)==null||m.fixSetContents(o);const{patchPlugin_:h}=f;o.modified_&&h&&h.generatePatches_(o,[],f)}),a}function Qr(e){return pi(e)||hn(10,e),k5(e)}function k5(e){if(!yn(e)||xh(e))return e;const t=e[hr];let r,n=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,r=Av(e,t.scope_.immer_.useStrictShallowCopy_),n=t.scope_.immer_.shouldUseStrictIteration()}else r=Av(e,!0);return ph(r,(a,o)=>{ff(r,a,k5(o))},n),t&&(t.finalized_=!1),r}var g$=new p$,j5=g$.produce;function S5(e){return({dispatch:r,getState:n})=>a=>o=>typeof o=="function"?o(r,n,e):a(o)}var v$=S5(),y$=S5,x$=typeof window<"u"&&window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__?window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__:function(){if(arguments.length!==0)return typeof arguments[0]=="object"?uf:uf.apply(null,arguments)};function $r(e,t){function r(...n){if(t){let a=t(...n);if(!a)throw new Error(Lr(0));return{type:e,payload:a.payload,..."meta"in a&&{meta:a.meta},..."error"in a&&{error:a.error}}}return{type:e,payload:n[0]}}return r.toString=()=>`${e}`,r.type=e,r.match=n=>h5(n)&&n.type===e,r}var N5=class lu extends Array{constructor(...t){super(...t),Object.setPrototypeOf(this,lu.prototype)}static get[Symbol.species](){return lu}concat(...t){return super.concat.apply(this,t)}prepend(...t){return t.length===1&&Array.isArray(t[0])?new lu(...t[0].concat(this)):new lu(...t.concat(this))}};function ck(e){return yn(e)?j5(e,()=>{}):e}function Cd(e,t,r){return e.has(t)?e.get(t):e.set(t,r(t)).get(t)}function b$(e){return typeof e=="boolean"}var w$=()=>function(t){const{thunk:r=!0,immutableCheck:n=!0,serializableCheck:a=!0,actionCreatorCheck:o=!0}=t??{};let u=new N5;return r&&(b$(r)?u.push(v$):u.push(y$(r.extraArgument))),u},E5="RTK_autoBatch",st=()=>e=>({payload:e,meta:{[E5]:!0}}),dk=e=>t=>{setTimeout(t,e)},k$=(e,t)=>r=>{let n=!1;const a=()=>{n||(n=!0,cancelAnimationFrame(o),clearTimeout(u),r())},o=e(a),u=setTimeout(a,t)},A5=(e={type:"raf"})=>t=>(...r)=>{const n=t(...r);let a=!0,o=!1,u=!1;const c=new Set,f=e.type==="tick"?queueMicrotask:e.type==="raf"?typeof window<"u"&&window.requestAnimationFrame?k$(window.requestAnimationFrame,100):dk(10):e.type==="callback"?e.queueNotification:dk(e.timeout),h=()=>{u=!1,o&&(o=!1,c.forEach(m=>m()))};return Object.assign({},n,{subscribe(m){const g=()=>a&&m(),v=n.subscribe(g);return c.add(m),()=>{v(),c.delete(m)}},dispatch(m){var g;try{return a=!((g=m==null?void 0:m.meta)!=null&&g[E5]),o=!a,o&&(u||(u=!0,f(h))),n.dispatch(m)}finally{a=!0}}})},j$=e=>function(r){const{autoBatch:n=!0}=r??{};let a=new N5(e);return n&&a.push(A5(typeof n=="object"?n:void 0)),a};function S$(e){const t=w$(),{reducer:r=void 0,middleware:n,devTools:a=!0,preloadedState:o=void 0,enhancers:u=void 0}=e||{};let c;if(typeof r=="function")c=r;else if(Ty(r))c=f5(r);else throw new Error(Lr(1));let f;typeof n=="function"?f=n(t):f=t();let h=uf;a&&(h=x$({trace:!1,...typeof a=="object"&&a}));const m=r$(...f),g=j$(m);let v=typeof u=="function"?u(g):g();const b=h(...v);return d5(c,o,b)}function C5(e){const t={},r=[];let n;const a={addCase(o,u){const c=typeof o=="string"?o:o.type;if(!c)throw new Error(Lr(28));if(c in t)throw new Error(Lr(29));return t[c]=u,a},addAsyncThunk(o,u){return u.pending&&(t[o.pending.type]=u.pending),u.rejected&&(t[o.rejected.type]=u.rejected),u.fulfilled&&(t[o.fulfilled.type]=u.fulfilled),u.settled&&r.push({matcher:o.settled,reducer:u.settled}),a},addMatcher(o,u){return r.push({matcher:o,reducer:u}),a},addDefaultCase(o){return n=o,a}};return e(a),[t,r,n]}function N$(e){return typeof e=="function"}function E$(e,t){let[r,n,a]=C5(t),o;if(N$(e))o=()=>ck(e());else{const c=ck(e);o=()=>c}function u(c=o(),f){let h=[r[f.type],...n.filter(({matcher:m})=>m(f)).map(({reducer:m})=>m)];return h.filter(m=>!!m).length===0&&(h=[a]),h.reduce((m,g)=>{if(g)if(pi(m)){const b=g(m,f);return b===void 0?m:b}else{if(yn(m))return j5(m,v=>g(v,f));{const v=g(m,f);if(v===void 0){if(m===null)return m;throw Error("A case reducer on a non-draftable value must not return undefined")}return v}}return m},c)}return u.getInitialState=o,u}var A$="ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW",C$=(e=21)=>{let t="",r=e;for(;r--;)t+=A$[Math.random()*64|0];return t},P$=Symbol.for("rtk-slice-createasyncthunk");function O$(e,t){return`${e}/${t}`}function _$({creators:e}={}){var r;const t=(r=e==null?void 0:e.asyncThunk)==null?void 0:r[P$];return function(a){const{name:o,reducerPath:u=o}=a;if(!o)throw new Error(Lr(11));const c=(typeof a.reducers=="function"?a.reducers(I$()):a.reducers)||{},f=Object.keys(c),h={sliceCaseReducersByName:{},sliceCaseReducersByType:{},actionCreators:{},sliceMatchers:[]},m={addCase(P,M){const O=typeof P=="string"?P:P.type;if(!O)throw new Error(Lr(12));if(O in h.sliceCaseReducersByType)throw new Error(Lr(13));return h.sliceCaseReducersByType[O]=M,m},addMatcher(P,M){return h.sliceMatchers.push({matcher:P,reducer:M}),m},exposeAction(P,M){return h.actionCreators[P]=M,m},exposeCaseReducer(P,M){return h.sliceCaseReducersByName[P]=M,m}};f.forEach(P=>{const M=c[P],O={reducerName:P,type:O$(o,P),createNotation:typeof a.reducers=="function"};D$(M)?L$(O,M,m,t):T$(O,M,m)});function g(){const[P={},M=[],O=void 0]=typeof a.extraReducers=="function"?C5(a.extraReducers):[a.extraReducers],D={...P,...h.sliceCaseReducersByType};return E$(a.initialState,B=>{for(let F in D)B.addCase(F,D[F]);for(let F of h.sliceMatchers)B.addMatcher(F.matcher,F.reducer);for(let F of M)B.addMatcher(F.matcher,F.reducer);O&&B.addDefaultCase(O)})}const v=P=>P,b=new Map,j=new WeakMap;let k;function S(P,M){return k||(k=g()),k(P,M)}function N(){return k||(k=g()),k.getInitialState()}function E(P,M=!1){function O(B){let F=B[P];return typeof F>"u"&&M&&(F=Cd(j,O,N)),F}function D(B=v){const F=Cd(b,M,()=>new WeakMap);return Cd(F,B,()=>{const z={};for(const[Y,U]of Object.entries(a.selectors??{}))z[Y]=M$(U,B,()=>Cd(j,B,N),M);return z})}return{reducerPath:P,getSelectors:D,get selectors(){return D(O)},selectSlice:O}}const A={name:o,reducer:S,actions:h.actionCreators,caseReducers:h.sliceCaseReducersByName,getInitialState:N,...E(u),injectInto(P,{reducerPath:M,...O}={}){const D=M??u;return P.inject({reducerPath:D,reducer:S},O),{...A,...E(D,!0)}}};return A}}function M$(e,t,r,n){function a(o,...u){let c=t(o);return typeof c>"u"&&n&&(c=r()),e(c,...u)}return a.unwrapped=e,a}var sr=_$();function I$(){function e(t,r){return{_reducerDefinitionType:"asyncThunk",payloadCreator:t,...r}}return e.withTypes=()=>e,{reducer(t){return Object.assign({[t.name](...r){return t(...r)}}[t.name],{_reducerDefinitionType:"reducer"})},preparedReducer(t,r){return{_reducerDefinitionType:"reducerWithPrepare",prepare:t,reducer:r}},asyncThunk:e}}function T$({type:e,reducerName:t,createNotation:r},n,a){let o,u;if("reducer"in n){if(r&&!R$(n))throw new Error(Lr(17));o=n.reducer,u=n.prepare}else o=n;a.addCase(e,o).exposeCaseReducer(t,o).exposeAction(t,u?$r(e,u):$r(e))}function D$(e){return e._reducerDefinitionType==="asyncThunk"}function R$(e){return e._reducerDefinitionType==="reducerWithPrepare"}function L$({type:e,reducerName:t},r,n,a){if(!a)throw new Error(Lr(18));const{payloadCreator:o,fulfilled:u,pending:c,rejected:f,settled:h,options:m}=r,g=a(e,o,m);n.exposeAction(t,g),u&&n.addCase(g.fulfilled,u),c&&n.addCase(g.pending,c),f&&n.addCase(g.rejected,f),h&&n.addMatcher(g.settled,h),n.exposeCaseReducer(t,{fulfilled:u||Pd,pending:c||Pd,rejected:f||Pd,settled:h||Pd})}function Pd(){}var $$="task",P5="listener",O5="completed",$y="cancelled",z$=`task-${$y}`,F$=`task-${O5}`,Iv=`${P5}-${$y}`,B$=`${P5}-${O5}`,wh=class{constructor(e){Qo(this,"code");Qo(this,"name","TaskAbortError");Qo(this,"message");this.code=e,this.message=`${$$} ${$y} (reason: ${e})`}},zy=(e,t)=>{if(typeof e!="function")throw new TypeError(Lr(32))},gf=()=>{},_5=(e,t=gf)=>(e.catch(t),e),M5=(e,t)=>(e.addEventListener("abort",t,{once:!0}),()=>e.removeEventListener("abort",t)),io=e=>{if(e.aborted)throw new wh(e.reason)};function I5(e,t){let r=gf;return new Promise((n,a)=>{const o=()=>a(new wh(e.reason));if(e.aborted){o();return}r=M5(e,o),t.finally(()=>r()).then(n,a)}).finally(()=>{r=gf})}var U$=async(e,t)=>{try{return await Promise.resolve(),{status:"ok",value:await e()}}catch(r){return{status:r instanceof wh?"cancelled":"rejected",error:r}}finally{t==null||t()}},vf=e=>t=>_5(I5(e,t).then(r=>(io(e),r))),T5=e=>{const t=vf(e);return r=>t(new Promise(n=>setTimeout(n,r)))},{assign:ps}=Object,fk={},kh="listenerMiddleware",H$=(e,t)=>{const r=n=>M5(e,()=>n.abort(e.reason));return(n,a)=>{zy(n);const o=new AbortController;r(o);const u=U$(async()=>{io(e),io(o.signal);const c=await n({pause:vf(o.signal),delay:T5(o.signal),signal:o.signal});return io(o.signal),c},()=>o.abort(F$));return a!=null&&a.autoJoin&&t.push(u.catch(gf)),{result:vf(e)(u),cancel(){o.abort(z$)}}}},W$=(e,t)=>{const r=async(n,a)=>{io(t);let o=()=>{};const c=[new Promise((f,h)=>{let m=e({predicate:n,effect:(g,v)=>{v.unsubscribe(),f([g,v.getState(),v.getOriginalState()])}});o=()=>{m(),h()}})];a!=null&&c.push(new Promise(f=>setTimeout(f,a,null)));try{const f=await I5(t,Promise.race(c));return io(t),f}finally{o()}};return((n,a)=>_5(r(n,a)))},D5=e=>{let{type:t,actionCreator:r,matcher:n,predicate:a,effect:o}=e;if(t)a=$r(t).match;else if(r)t=r.type,a=r.match;else if(n)a=n;else if(!a)throw new Error(Lr(21));return zy(o),{predicate:a,type:t,effect:o}},R5=ps(e=>{const{type:t,predicate:r,effect:n}=D5(e);return{id:C$(),effect:n,type:t,predicate:r,pending:new Set,unsubscribe:()=>{throw new Error(Lr(22))}}},{withTypes:()=>R5}),hk=(e,t)=>{const{type:r,effect:n,predicate:a}=D5(t);return Array.from(e.values()).find(o=>(typeof r=="string"?o.type===r:o.predicate===a)&&o.effect===n)},Tv=e=>{e.pending.forEach(t=>{t.abort(Iv)})},K$=(e,t)=>()=>{for(const r of t.keys())Tv(r);e.clear()},mk=(e,t,r)=>{try{e(t,r)}catch(n){setTimeout(()=>{throw n},0)}},L5=ps($r(`${kh}/add`),{withTypes:()=>L5}),G$=$r(`${kh}/removeAll`),$5=ps($r(`${kh}/remove`),{withTypes:()=>$5}),V$=(...e)=>{console.error(`${kh}/error`,...e)},Ku=(e={})=>{const t=new Map,r=new Map,n=b=>{const j=r.get(b)??0;r.set(b,j+1)},a=b=>{const j=r.get(b)??1;j===1?r.delete(b):r.set(b,j-1)},{extra:o,onError:u=V$}=e;zy(u);const c=b=>(b.unsubscribe=()=>t.delete(b.id),t.set(b.id,b),j=>{b.unsubscribe(),j!=null&&j.cancelActive&&Tv(b)}),f=(b=>{const j=hk(t,b)??R5(b);return c(j)});ps(f,{withTypes:()=>f});const h=b=>{const j=hk(t,b);return j&&(j.unsubscribe(),b.cancelActive&&Tv(j)),!!j};ps(h,{withTypes:()=>h});const m=async(b,j,k,S)=>{const N=new AbortController,E=W$(f,N.signal),A=[];try{b.pending.add(N),n(b),await Promise.resolve(b.effect(j,ps({},k,{getOriginalState:S,condition:(P,M)=>E(P,M).then(Boolean),take:E,delay:T5(N.signal),pause:vf(N.signal),extra:o,signal:N.signal,fork:H$(N.signal,A),unsubscribe:b.unsubscribe,subscribe:()=>{t.set(b.id,b)},cancelActiveListeners:()=>{b.pending.forEach((P,M,O)=>{P!==N&&(P.abort(Iv),O.delete(P))})},cancel:()=>{N.abort(Iv),b.pending.delete(N)},throwIfCancelled:()=>{io(N.signal)}})))}catch(P){P instanceof wh||mk(u,P,{raisedBy:"effect"})}finally{await Promise.all(A),N.abort(B$),a(b),b.pending.delete(N)}},g=K$(t,r);return{middleware:b=>j=>k=>{if(!h5(k))return j(k);if(L5.match(k))return f(k.payload);if(G$.match(k)){g();return}if($5.match(k))return h(k.payload);let S=b.getState();const N=()=>{if(S===fk)throw new Error(Lr(23));return S};let E;try{if(E=j(k),t.size>0){const A=b.getState(),P=Array.from(t.values());for(const M of P){let O=!1;try{O=M.predicate(k,A,S)}catch(D){O=!1,mk(u,D,{raisedBy:"predicate"})}O&&m(M,k,b,N)}}}finally{S=fk}return E},startListening:f,stopListening:h,clearListeners:g}};function Lr(e){return`Minified Redux Toolkit error #${e}; visit https://redux-toolkit.js.org/Errors?code=${e} for the full message or use the non-minified dev environment for full errors. `}var q$={layoutType:"horizontal",width:0,height:0,margin:{top:5,right:5,bottom:5,left:5},scale:1},z5=sr({name:"chartLayout",initialState:q$,reducers:{setLayout(e,t){e.layoutType=t.payload},setChartSize(e,t){e.width=t.payload.width,e.height=t.payload.height},setMargin(e,t){var r,n,a,o;e.margin.top=(r=t.payload.top)!==null&&r!==void 0?r:0,e.margin.right=(n=t.payload.right)!==null&&n!==void 0?n:0,e.margin.bottom=(a=t.payload.bottom)!==null&&a!==void 0?a:0,e.margin.left=(o=t.payload.left)!==null&&o!==void 0?o:0},setScale(e,t){e.scale=t.payload}}}),jh=z5.actions,Q$=jh.setMargin,Y$=jh.setLayout,X$=jh.setChartSize,Z$=jh.setScale,J$=z5.reducer;function F5(e,t,r){return Array.isArray(e)&&e&&t+r!==0?e.slice(t,r+1):e}function He(e){return Number.isFinite(e)}function Un(e){return typeof e=="number"&&e>0&&Number.isFinite(e)}function pk(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function ds(e){for(var t=1;t{if(t&&r){var n=r.width,a=r.height,o=t.align,u=t.verticalAlign,c=t.layout;if((c==="vertical"||c==="horizontal"&&u==="middle")&&o!=="center"&&Ee(e[o]))return ds(ds({},e),{},{[o]:e[o]+(n||0)});if((c==="horizontal"||c==="vertical"&&o==="center")&&u!=="middle"&&Ee(e[u]))return ds(ds({},e),{},{[u]:e[u]+(a||0)})}return e},Gn=(e,t)=>e==="horizontal"&&t==="xAxis"||e==="vertical"&&t==="yAxis"||e==="centric"&&t==="angleAxis"||e==="radial"&&t==="radiusAxis",B5=(e,t,r,n)=>{if(n)return e.map(c=>c.coordinate);var a,o,u=e.map(c=>(c.coordinate===t&&(a=!0),c.coordinate===r&&(o=!0),c.coordinate));return a||u.push(t),o||u.push(r),u},U5=(e,t,r)=>{if(!e)return null;var n=e.duplicateDomain,a=e.type,o=e.range,u=e.scale,c=e.realScaleType,f=e.isCategorical,h=e.categoricalDomain,m=e.tickCount,g=e.ticks,v=e.niceTicks,b=e.axisType;if(!u)return null;var j=c==="scaleBand"&&u.bandwidth?u.bandwidth()/2:2,k=a==="category"&&u.bandwidth?u.bandwidth()/j:0;if(k=b==="angleAxis"&&o&&o.length>=2?qr(o[0]-o[1])*2*k:k,g||v){var S=(g||v||[]).map((N,E)=>{var A=n?n.indexOf(N):N,P=u.map(A);return He(P)?{coordinate:P+k,value:N,offset:k,index:E}:null}).filter(jr);return S}return f&&h?h.map((N,E)=>{var A=u.map(N);return He(A)?{coordinate:A+k,value:N,index:E,offset:k}:null}).filter(jr):u.ticks&&m!=null?u.ticks(m).map((N,E)=>{var A=u.map(N);return He(A)?{coordinate:A+k,value:N,index:E,offset:k}:null}).filter(jr):u.domain().map((N,E)=>{var A=u.map(N);return He(A)?{coordinate:A+k,value:n?n[N]:N,index:E,offset:k}:null}).filter(jr)},iz=e=>{var t,r=e.length;if(!(r<=0)){var n=(t=e[0])===null||t===void 0?void 0:t.length;if(!(n==null||n<=0))for(var a=0;a=0?(h[0]=o,o+=v,h[1]=o):(h[0]=u,u+=v,h[1]=u)}}}},az=e=>{var t,r=e.length;if(!(r<=0)){var n=(t=e[0])===null||t===void 0?void 0:t.length;if(!(n==null||n<=0))for(var a=0;a=0?(f[0]=o,o+=h,f[1]=o):(f[0]=0,f[1]=0)}}}},oz={sign:iz,expand:kR,none:uo,silhouette:jR,wiggle:SR,positive:az},sz=(e,t,r)=>{var n,a=(n=oz[r])!==null&&n!==void 0?n:uo,o=wR().keys(t).value((c,f)=>Number(Rt(c,f,0))).order(bv).offset(a),u=o(e);return u.forEach((c,f)=>{c.forEach((h,m)=>{var g=Rt(e[m],t[f],0);Array.isArray(g)&&g.length===2&&Ee(g[0])&&Ee(g[1])&&(h[0]=g[0],h[1]=g[1])})}),u};function lz(e){return e==null?void 0:String(e)}function gk(e){var t=e.axis,r=e.ticks,n=e.bandSize,a=e.entry,o=e.index,u=e.dataKey;if(t.type==="category"){if(!t.allowDuplicatedCategory&&t.dataKey&&!qt(a[t.dataKey])){var c=qE(r,"value",a[t.dataKey]);if(c)return c.coordinate+n/2}return r!=null&&r[o]?r[o].coordinate+n/2:null}var f=Rt(a,qt(u)?t.dataKey:u),h=t.scale.map(f);return Ee(h)?h:null}var uz=e=>{var t=e.flat(2).filter(Ee);return[Math.min(...t),Math.max(...t)]},cz=e=>[e[0]===1/0?0:e[0],e[1]===-1/0?0:e[1]],dz=(e,t,r)=>{if(!(e==null||Object.keys(e).length===0))return cz(Object.keys(e).reduce((n,a)=>{var o=e[a];if(!o)return n;var u=o.stackedData,c=u.reduce((f,h)=>{var m=F5(h,t,r),g=uz(m);return!He(g[0])||!He(g[1])?f:[Math.min(f[0],g[0]),Math.max(f[1],g[1])]},[1/0,-1/0]);return[Math.min(c[0],n[0]),Math.max(c[1],n[1])]},[1/0,-1/0]))},vk=/^dataMin[\s]*-[\s]*([0-9]+([.]{1}[0-9]+){0,1})$/,yk=/^dataMax[\s]*\+[\s]*([0-9]+([.]{1}[0-9]+){0,1})$/,yf=(e,t,r)=>{if(e&&e.scale&&e.scale.bandwidth){var n=e.scale.bandwidth();if(!r||n>0)return n}if(e&&t&&t.length>=2){for(var a=hh(t,m=>m.coordinate),o=1/0,u=1,c=a.length;u{if(t==="horizontal")return e.relativeX;if(t==="vertical")return e.relativeY},hz=(e,t)=>t==="centric"?e.angle:e.radius,bi=e=>e.layout.width,wi=e=>e.layout.height,mz=e=>e.layout.scale,W5=e=>e.layout.margin,Sh=V(e=>e.cartesianAxis.xAxis,e=>Object.values(e)),Nh=V(e=>e.cartesianAxis.yAxis,e=>Object.values(e)),pz="data-recharts-item-index",gz="data-recharts-item-id",Gu=60;function bk(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function Od(e){for(var t=1;te.brush.height;function wz(e){var t=Nh(e);return t.reduce((r,n)=>{if(n.orientation==="left"&&!n.mirror&&!n.hide){var a=typeof n.width=="number"?n.width:Gu;return r+a}return r},0)}function kz(e){var t=Nh(e);return t.reduce((r,n)=>{if(n.orientation==="right"&&!n.mirror&&!n.hide){var a=typeof n.width=="number"?n.width:Gu;return r+a}return r},0)}function jz(e){var t=Sh(e);return t.reduce((r,n)=>n.orientation==="top"&&!n.mirror&&!n.hide?r+n.height:r,0)}function Sz(e){var t=Sh(e);return t.reduce((r,n)=>n.orientation==="bottom"&&!n.mirror&&!n.hide?r+n.height:r,0)}var Yt=V([bi,wi,W5,bz,wz,kz,jz,Sz,c5,KL],(e,t,r,n,a,o,u,c,f,h)=>{var m={left:(r.left||0)+a,right:(r.right||0)+o},g={top:(r.top||0)+u,bottom:(r.bottom||0)+c},v=Od(Od({},g),m),b=v.bottom;v.bottom+=n,v=nz(v,f,h);var j=e-v.left-v.right,k=t-v.top-v.bottom;return Od(Od({brushBottom:b},v),{},{width:Math.max(j,0),height:Math.max(k,0)})}),Nz=V(Yt,e=>({x:e.left,y:e.top,width:e.width,height:e.height})),K5=V(bi,wi,(e,t)=>({x:0,y:0,width:e,height:t})),Ez=y.createContext(null),Nr=()=>y.useContext(Ez)!=null,Eh=e=>e.brush,Ah=V([Eh,Yt,W5],(e,t,r)=>({height:e.height,x:Ee(e.x)?e.x:t.left,y:Ee(e.y)?e.y:t.top+t.height+t.brushBottom-((r==null?void 0:r.bottom)||0),width:Ee(e.width)?e.width:t.width}));function Az(e,t,{signal:r,edges:n}={}){let a,o=null;const u=n!=null&&n.includes("leading"),c=n==null||n.includes("trailing"),f=()=>{o!==null&&(e.apply(a,o),a=void 0,o=null)},h=()=>{c&&f(),b()};let m=null;const g=()=>{m!=null&&clearTimeout(m),m=setTimeout(()=>{m=null,h()},t)},v=()=>{m!==null&&(clearTimeout(m),m=null)},b=()=>{v(),a=void 0,o=null},j=()=>{f()},k=function(...S){if(r!=null&&r.aborted)return;a=this,o=S;const N=m==null;g(),u&&N&&f()};return k.schedule=g,k.cancel=b,k.flush=j,r==null||r.addEventListener("abort",b,{once:!0}),k}function Cz(e,t=0,r={}){typeof r!="object"&&(r={});const{leading:n=!1,trailing:a=!0,maxWait:o}=r,u=Array(2);n&&(u[0]="leading"),a&&(u[1]="trailing");let c,f=null;const h=Az(function(...v){c=e.apply(this,v),f=null},t,{edges:u}),m=function(...v){return o!=null&&(f===null&&(f=Date.now()),Date.now()-f>=o)?(c=e.apply(this,v),f=Date.now(),h.cancel(),h.schedule(),c):(h.apply(this,v),c)},g=()=>(h.flush(),c);return m.cancel=h.cancel,m.flush=g,m}function Pz(e,t=0,r={}){const{leading:n=!0,trailing:a=!0}=r;return Cz(e,t,{leading:n,maxWait:t,trailing:a})}var xf=function(t,r){for(var n=arguments.length,a=new Array(n>2?n-2:0),o=2;oa[u++]))}},Tn={width:"100%",height:"100%",debounce:0,minWidth:0,initialDimension:{width:-1,height:-1}},G5=(e,t,r)=>{var n=r.width,a=n===void 0?Tn.width:n,o=r.height,u=o===void 0?Tn.height:o,c=r.aspect,f=r.maxHeight,h=co(a)?e:Number(a),m=co(u)?t:Number(u);return c&&c>0&&(h?m=h/c:m&&(h=m*c),f&&m!=null&&m>f&&(m=f)),{calculatedWidth:h,calculatedHeight:m}},Oz={width:0,height:0,overflow:"visible"},_z={width:0,overflowX:"visible"},Mz={height:0,overflowY:"visible"},Iz={},Tz=e=>{var t=e.width,r=e.height,n=co(t),a=co(r);return n&&a?Oz:n?_z:a?Mz:Iz};function Dz(e){var t=e.width,r=e.height,n=e.aspect,a=t,o=r;return a===void 0&&o===void 0?(a=Tn.width,o=Tn.height):a===void 0?a=n&&n>0?void 0:Tn.width:o===void 0&&(o=n&&n>0?void 0:Tn.height),{width:a,height:o}}var Rz=["aspect","initialDimension","width","height","minWidth","minHeight","maxHeight","children","debounce","id","className","onResize","style"];function bf(){return bf=Object.assign?Object.assign.bind():function(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);r({width:r,height:n}),[r,n]);return Vz(a)?y.createElement(V5.Provider,{value:a},t):null}var Fy=()=>y.useContext(V5),qz=y.forwardRef((e,t)=>{var r=e.aspect,n=e.initialDimension,a=n===void 0?Tn.initialDimension:n,o=e.width,u=e.height,c=e.minWidth,f=c===void 0?Tn.minWidth:c,h=e.minHeight,m=e.maxHeight,g=e.children,v=e.debounce,b=v===void 0?Tn.debounce:v,j=e.id,k=e.className,S=e.onResize,N=e.style,E=N===void 0?{}:N,A=Kz(e,Rz),P=y.useRef(null),M=y.useRef();M.current=S,y.useImperativeHandle(t,()=>P.current);var O=y.useState({containerWidth:a.width,containerHeight:a.height}),D=Fz(O,2),B=D[0],F=D[1],z=y.useCallback((ie,oe)=>{F(X=>{var re=Math.round(ie),J=Math.round(oe);return X.containerWidth===re&&X.containerHeight===J?X:{containerWidth:re,containerHeight:J}})},[]);y.useEffect(()=>{if(P.current==null||typeof ResizeObserver>"u")return qs;var ie=I=>{var _,W=I[0];if(W!=null){var ee=W.contentRect,Z=ee.width,he=ee.height;z(Z,he),(_=M.current)===null||_===void 0||_.call(M,Z,he)}};b>0&&(ie=Pz(ie,b,{trailing:!0,leading:!1}));var oe=new ResizeObserver(ie),X=P.current.getBoundingClientRect(),re=X.width,J=X.height;return z(re,J),oe.observe(P.current),()=>{oe.disconnect()}},[z,b]);var Y=B.containerWidth,U=B.containerHeight;xf(!r||r>0,"The aspect(%s) must be greater than zero.",r);var me=G5(Y,U,{width:o,height:u,aspect:r,maxHeight:m}),ue=me.calculatedWidth,ge=me.calculatedHeight;return xf(Y<0||U<0||ue!=null&&ue>0||ge!=null&&ge>0,`The width(%s) and height(%s) of chart should be greater than 0, + please check the style of container, or the props width(%s) and height(%s), + or add a minWidth(%s) or minHeight(%s) or use aspect(%s) to control the + height and width.`,ue,ge,o,u,f,h,r),y.createElement("div",bf({id:j?"".concat(j):void 0,className:rt("recharts-responsive-container",k),style:kk(kk({},E),{},{width:o,height:u,minWidth:f,minHeight:h,maxHeight:m}),ref:P},A),y.createElement("div",{style:Tz({width:o,height:u})},y.createElement(q5,{width:ue,height:ge},g)))}),Qz=y.forwardRef((e,t)=>{var r=Fy();if(Un(r.width)&&Un(r.height))return e.children;var n=Dz({width:e.width,height:e.height,aspect:e.aspect}),a=n.width,o=n.height,u=G5(void 0,void 0,{width:a,height:o,aspect:e.aspect,maxHeight:e.maxHeight}),c=u.calculatedWidth,f=u.calculatedHeight;return Ee(c)&&Ee(f)?y.createElement(q5,{width:c,height:f},e.children):y.createElement(qz,bf({},e,{width:a,height:o,ref:t}))});function By(e){if(e)return{x:e.x,y:e.y,upperWidth:"upperWidth"in e?e.upperWidth:e.width,lowerWidth:"lowerWidth"in e?e.lowerWidth:e.width,width:e.width,height:e.height}}var Ch=()=>{var e,t=Nr(),r=Me(Nz),n=Me(Ah),a=(e=Me(Eh))===null||e===void 0?void 0:e.padding;return!t||!n||!a?r:{width:n.width-a.left-a.right,height:n.height-a.top-a.bottom,x:a.left,y:a.top}},Yz={top:0,bottom:0,left:0,right:0,width:0,height:0,brushBottom:0},Q5=()=>{var e;return(e=Me(Yt))!==null&&e!==void 0?e:Yz},Y5=()=>Me(bi),X5=()=>Me(wi),dt=e=>e.layout.layoutType,Qs=()=>Me(dt),Uy=()=>{var e=Qs();if(e==="horizontal"||e==="vertical")return e},Z5=e=>{var t=e.layout.layoutType;if(t==="centric"||t==="radial")return t},Xz=()=>{var e=Qs();return e!==void 0},Vu=e=>{var t=St(),r=Nr(),n=e.width,a=e.height,o=Fy(),u=n,c=a;return o&&(u=o.width>0?o.width:n,c=o.height>0?o.height:a),y.useEffect(()=>{!r&&Un(u)&&Un(c)&&t(X$({width:u,height:c}))},[t,r,u,c]),null},J5=Symbol.for("immer-nothing"),Sk=Symbol.for("immer-draftable"),zr=Symbol.for("immer-state");function mn(e,...t){throw new Error(`[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`)}var Su=Object.getPrototypeOf;function $s(e){return!!e&&!!e[zr]}function ho(e){var t;return e?eA(e)||Array.isArray(e)||!!e[Sk]||!!((t=e.constructor)!=null&&t[Sk])||qu(e)||Oh(e):!1}var Zz=Object.prototype.constructor.toString(),Nk=new WeakMap;function eA(e){if(!e||typeof e!="object")return!1;const t=Object.getPrototypeOf(e);if(t===null||t===Object.prototype)return!0;const r=Object.hasOwnProperty.call(t,"constructor")&&t.constructor;if(r===Object)return!0;if(typeof r!="function")return!1;let n=Nk.get(r);return n===void 0&&(n=Function.toString.call(r),Nk.set(r,n)),n===Zz}function wf(e,t,r=!0){Ph(e)===0?(r?Reflect.ownKeys(e):Object.keys(e)).forEach(a=>{t(a,e[a],e)}):e.forEach((n,a)=>t(a,n,e))}function Ph(e){const t=e[zr];return t?t.type_:Array.isArray(e)?1:qu(e)?2:Oh(e)?3:0}function Dv(e,t){return Ph(e)===2?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function tA(e,t,r){const n=Ph(e);n===2?e.set(t,r):n===3?e.add(r):e[t]=r}function Jz(e,t){return e===t?e!==0||1/e===1/t:e!==e&&t!==t}function qu(e){return e instanceof Map}function Oh(e){return e instanceof Set}function Fa(e){return e.copy_||e.base_}function Rv(e,t){if(qu(e))return new Map(e);if(Oh(e))return new Set(e);if(Array.isArray(e))return Array.prototype.slice.call(e);const r=eA(e);if(t===!0||t==="class_only"&&!r){const n=Object.getOwnPropertyDescriptors(e);delete n[zr];let a=Reflect.ownKeys(n);for(let o=0;o1&&Object.defineProperties(e,{set:_d,add:_d,clear:_d,delete:_d}),Object.freeze(e),t&&Object.values(e).forEach(r=>Hy(r,!0))),e}function e6(){mn(2)}var _d={value:e6};function _h(e){return e===null||typeof e!="object"?!0:Object.isFrozen(e)}var t6={};function mo(e){const t=t6[e];return t||mn(0,e),t}var Nu;function rA(){return Nu}function r6(e,t){return{drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0}}function Ek(e,t){t&&(mo("Patches"),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function Lv(e){$v(e),e.drafts_.forEach(n6),e.drafts_=null}function $v(e){e===Nu&&(Nu=e.parent_)}function Ak(e){return Nu=r6(Nu,e)}function n6(e){const t=e[zr];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0}function Ck(e,t){t.unfinalizedDrafts_=t.drafts_.length;const r=t.drafts_[0];return e!==void 0&&e!==r?(r[zr].modified_&&(Lv(t),mn(4)),ho(e)&&(e=kf(t,e),t.parent_||jf(t,e)),t.patches_&&mo("Patches").generateReplacementPatches_(r[zr].base_,e,t.patches_,t.inversePatches_)):e=kf(t,r,[]),Lv(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e!==J5?e:void 0}function kf(e,t,r){if(_h(t))return t;const n=e.immer_.shouldUseStrictIteration(),a=t[zr];if(!a)return wf(t,(o,u)=>Pk(e,a,t,o,u,r),n),t;if(a.scope_!==e)return t;if(!a.modified_)return jf(e,a.base_,!0),a.base_;if(!a.finalized_){a.finalized_=!0,a.scope_.unfinalizedDrafts_--;const o=a.copy_;let u=o,c=!1;a.type_===3&&(u=new Set(o),o.clear(),c=!0),wf(u,(f,h)=>Pk(e,a,o,f,h,r,c),n),jf(e,o,!1),r&&e.patches_&&mo("Patches").generatePatches_(a,r,e.patches_,e.inversePatches_)}return a.copy_}function Pk(e,t,r,n,a,o,u){if(a==null||typeof a!="object"&&!u)return;const c=_h(a);if(!(c&&!u)){if($s(a)){const f=o&&t&&t.type_!==3&&!Dv(t.assigned_,n)?o.concat(n):void 0,h=kf(e,a,f);if(tA(r,n,h),$s(h))e.canAutoFreeze_=!1;else return}else u&&r.add(a);if(ho(a)&&!c){if(!e.immer_.autoFreeze_&&e.unfinalizedDrafts_<1||t&&t.base_&&t.base_[n]===a&&c)return;kf(e,a),(!t||!t.scope_.parent_)&&typeof n!="symbol"&&(qu(r)?r.has(n):Object.prototype.propertyIsEnumerable.call(r,n))&&jf(e,a)}}}function jf(e,t,r=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&Hy(t,r)}function i6(e,t){const r=Array.isArray(e),n={type_:r?1:0,scope_:t?t.scope_:rA(),modified_:!1,finalized_:!1,assigned_:{},parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1};let a=n,o=Wy;r&&(a=[n],o=Eu);const{revoke:u,proxy:c}=Proxy.revocable(a,o);return n.draft_=c,n.revoke_=u,c}var Wy={get(e,t){if(t===zr)return e;const r=Fa(e);if(!Dv(r,t))return a6(e,r,t);const n=r[t];return e.finalized_||!ho(n)?n:n===fg(e.base_,t)?(hg(e),e.copy_[t]=Fv(n,e)):n},has(e,t){return t in Fa(e)},ownKeys(e){return Reflect.ownKeys(Fa(e))},set(e,t,r){const n=nA(Fa(e),t);if(n!=null&&n.set)return n.set.call(e.draft_,r),!0;if(!e.modified_){const a=fg(Fa(e),t),o=a==null?void 0:a[zr];if(o&&o.base_===r)return e.copy_[t]=r,e.assigned_[t]=!1,!0;if(Jz(r,a)&&(r!==void 0||Dv(e.base_,t)))return!0;hg(e),zv(e)}return e.copy_[t]===r&&(r!==void 0||t in e.copy_)||Number.isNaN(r)&&Number.isNaN(e.copy_[t])||(e.copy_[t]=r,e.assigned_[t]=!0),!0},deleteProperty(e,t){return fg(e.base_,t)!==void 0||t in e.base_?(e.assigned_[t]=!1,hg(e),zv(e)):delete e.assigned_[t],e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){const r=Fa(e),n=Reflect.getOwnPropertyDescriptor(r,t);return n&&{writable:!0,configurable:e.type_!==1||t!=="length",enumerable:n.enumerable,value:r[t]}},defineProperty(){mn(11)},getPrototypeOf(e){return Su(e.base_)},setPrototypeOf(){mn(12)}},Eu={};wf(Wy,(e,t)=>{Eu[e]=function(){return arguments[0]=arguments[0][0],t.apply(this,arguments)}});Eu.deleteProperty=function(e,t){return Eu.set.call(this,e,t,void 0)};Eu.set=function(e,t,r){return Wy.set.call(this,e[0],t,r,e[0])};function fg(e,t){const r=e[zr];return(r?Fa(r):e)[t]}function a6(e,t,r){var a;const n=nA(t,r);return n?"value"in n?n.value:(a=n.get)==null?void 0:a.call(e.draft_):void 0}function nA(e,t){if(!(t in e))return;let r=Su(e);for(;r;){const n=Object.getOwnPropertyDescriptor(r,t);if(n)return n;r=Su(r)}}function zv(e){e.modified_||(e.modified_=!0,e.parent_&&zv(e.parent_))}function hg(e){e.copy_||(e.copy_=Rv(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var o6=class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!0,this.produce=(t,r,n)=>{if(typeof t=="function"&&typeof r!="function"){const o=r;r=t;const u=this;return function(f=o,...h){return u.produce(f,m=>r.call(this,m,...h))}}typeof r!="function"&&mn(6),n!==void 0&&typeof n!="function"&&mn(7);let a;if(ho(t)){const o=Ak(this),u=Fv(t,void 0);let c=!0;try{a=r(u),c=!1}finally{c?Lv(o):$v(o)}return Ek(o,n),Ck(a,o)}else if(!t||typeof t!="object"){if(a=r(t),a===void 0&&(a=t),a===J5&&(a=void 0),this.autoFreeze_&&Hy(a,!0),n){const o=[],u=[];mo("Patches").generateReplacementPatches_(t,a,o,u),n(o,u)}return a}else mn(1,t)},this.produceWithPatches=(t,r)=>{if(typeof t=="function")return(u,...c)=>this.produceWithPatches(u,f=>t(f,...c));let n,a;return[this.produce(t,r,(u,c)=>{n=u,a=c}),n,a]},typeof(e==null?void 0:e.autoFreeze)=="boolean"&&this.setAutoFreeze(e.autoFreeze),typeof(e==null?void 0:e.useStrictShallowCopy)=="boolean"&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),typeof(e==null?void 0:e.useStrictIteration)=="boolean"&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){ho(e)||mn(8),$s(e)&&(e=s6(e));const t=Ak(this),r=Fv(e,void 0);return r[zr].isManual_=!0,$v(t),r}finishDraft(e,t){const r=e&&e[zr];(!r||!r.isManual_)&&mn(9);const{scope_:n}=r;return Ek(n,t),Ck(void 0,n)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}setUseStrictIteration(e){this.useStrictIteration_=e}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(e,t){let r;for(r=t.length-1;r>=0;r--){const a=t[r];if(a.path.length===0&&a.op==="replace"){e=a.value;break}}r>-1&&(t=t.slice(r+1));const n=mo("Patches").applyPatches_;return $s(e)?n(e,t):this.produce(e,a=>n(a,t))}};function Fv(e,t){const r=qu(e)?mo("MapSet").proxyMap_(e,t):Oh(e)?mo("MapSet").proxySet_(e,t):i6(e,t);return(t?t.scope_:rA()).drafts_.push(r),r}function s6(e){return $s(e)||mn(10,e),iA(e)}function iA(e){if(!ho(e)||_h(e))return e;const t=e[zr];let r,n=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,r=Rv(e,t.scope_.immer_.useStrictShallowCopy_),n=t.scope_.immer_.shouldUseStrictIteration()}else r=Rv(e,!0);return wf(r,(a,o)=>{tA(r,a,iA(o))},n),t&&(t.finalized_=!1),r}var l6=new o6;l6.produce;var u6={settings:{layout:"horizontal",align:"center",verticalAlign:"bottom",itemSorter:"value"},size:{width:0,height:0},payload:[]},aA=sr({name:"legend",initialState:u6,reducers:{setLegendSize(e,t){e.size.width=t.payload.width,e.size.height=t.payload.height},setLegendSettings(e,t){e.settings.align=t.payload.align,e.settings.layout=t.payload.layout,e.settings.verticalAlign=t.payload.verticalAlign,e.settings.itemSorter=t.payload.itemSorter},addLegendPayload:{reducer(e,t){e.payload.push(t.payload)},prepare:st()},replaceLegendPayload:{reducer(e,t){var r=t.payload,n=r.prev,a=r.next,o=Qr(e).payload.indexOf(n);o>-1&&(e.payload[o]=a)},prepare:st()},removeLegendPayload:{reducer(e,t){var r=Qr(e).payload.indexOf(t.payload);r>-1&&e.payload.splice(r,1)},prepare:st()}}}),Qu=aA.actions;Qu.setLegendSize;Qu.setLegendSettings;var c6=Qu.addLegendPayload,d6=Qu.replaceLegendPayload,f6=Qu.removeLegendPayload,h6=aA.reducer,mg={exports:{}},pg={};/** + * @license React + * use-sync-external-store-with-selector.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Ok;function m6(){if(Ok)return pg;Ok=1;var e=Ks();function t(f,h){return f===h&&(f!==0||1/f===1/h)||f!==f&&h!==h}var r=typeof Object.is=="function"?Object.is:t,n=e.useSyncExternalStore,a=e.useRef,o=e.useEffect,u=e.useMemo,c=e.useDebugValue;return pg.useSyncExternalStoreWithSelector=function(f,h,m,g,v){var b=a(null);if(b.current===null){var j={hasValue:!1,value:null};b.current=j}else j=b.current;b=u(function(){function S(M){if(!N){if(N=!0,E=M,M=g(M),v!==void 0&&j.hasValue){var O=j.value;if(v(O,M))return A=O}return A=M}if(O=A,r(E,M))return O;var D=g(M);return v!==void 0&&v(O,D)?(E=M,O):(E=M,A=D)}var N=!1,E,A,P=m===void 0?null:m;return[function(){return S(h())},P===null?void 0:function(){return S(P())}]},[h,m,g,v]);var k=n(f,b[0],b[1]);return o(function(){j.hasValue=!0,j.value=k},[k]),c(k),k},pg}var _k;function p6(){return _k||(_k=1,mg.exports=m6()),mg.exports}p6();function g6(e){e()}function v6(){let e=null,t=null;return{clear(){e=null,t=null},notify(){g6(()=>{let r=e;for(;r;)r.callback(),r=r.next})},get(){const r=[];let n=e;for(;n;)r.push(n),n=n.next;return r},subscribe(r){let n=!0;const a=t={callback:r,next:null,prev:t};return a.prev?a.prev.next=a:e=a,function(){!n||e===null||(n=!1,a.next?a.next.prev=a.prev:t=a.prev,a.prev?a.prev.next=a.next:e=a.next)}}}}var Mk={notify(){},get:()=>[]};function y6(e,t){let r,n=Mk,a=0,o=!1;function u(k){m();const S=n.subscribe(k);let N=!1;return()=>{N||(N=!0,S(),g())}}function c(){n.notify()}function f(){j.onStateChange&&j.onStateChange()}function h(){return o}function m(){a++,r||(r=e.subscribe(f),n=v6())}function g(){a--,r&&a===0&&(r(),r=void 0,n.clear(),n=Mk)}function v(){o||(o=!0,m())}function b(){o&&(o=!1,g())}const j={addNestedSub:u,notifyNestedSubs:c,handleChangeWrapper:f,isSubscribed:h,trySubscribe:v,tryUnsubscribe:b,getListeners:()=>n};return j}var x6=()=>typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",b6=x6(),w6=()=>typeof navigator<"u"&&navigator.product==="ReactNative",k6=w6(),j6=()=>b6||k6?y.useLayoutEffect:y.useEffect,S6=j6();function Ik(e,t){return e===t?e!==0||t!==0||1/e===1/t:e!==e&&t!==t}function N6(e,t){if(Ik(e,t))return!0;if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;const r=Object.keys(e),n=Object.keys(t);if(r.length!==n.length)return!1;for(let a=0;a{const f=y6(a);return{store:a,subscription:f,getServerState:n?()=>n:void 0}},[a,n]),u=y.useMemo(()=>a.getState(),[a]);S6(()=>{const{subscription:f}=o;return f.onStateChange=f.notifyNestedSubs,f.trySubscribe(),u!==a.getState()&&f.notifyNestedSubs(),()=>{f.tryUnsubscribe(),f.onStateChange=void 0}},[o,u]);const c=r||A6;return y.createElement(c.Provider,{value:o},t)}var P6=C6,O6=new Set(["axisLine","tickLine","activeBar","activeDot","activeLabel","activeShape","allowEscapeViewBox","background","cursor","dot","label","line","margin","padding","position","shape","style","tick","wrapperStyle","radius","throttledEvents"]);function _6(e,t){return e==null&&t==null?!0:typeof e=="number"&&typeof t=="number"?e===t||e!==e&&t!==t:e===t}function Mh(e,t){var r=new Set([...Object.keys(e),...Object.keys(t)]);for(var n of r)if(O6.has(n)){if(e[n]==null&&t[n]==null)continue;if(!N6(e[n],t[n]))return!1}else if(!_6(e[n],t[n]))return!1;return!0}function Bv(){return Bv=Object.assign?Object.assign.bind():function(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);r{var t=e.separator,r=t===void 0?es.separator:t,n=e.contentStyle,a=e.itemStyle,o=e.labelStyle,u=o===void 0?es.labelStyle:o,c=e.payload,f=e.formatter,h=e.itemSorter,m=e.wrapperClassName,g=e.labelClassName,v=e.label,b=e.labelFormatter,j=e.accessibilityLayer,k=j===void 0?es.accessibilityLayer:j,S=()=>{if(c&&c.length){var B={padding:0,margin:0},F=B6(c,h),z=F.map((Y,U)=>{if(!Y||Y.type==="none")return null;var me=Y.formatter||f||F6,ue=Y.value,ge=Y.name,ie=ue,oe=ge;if(me){var X=me(ue,ge,Y,U,c);if(Array.isArray(X)){var re=D6(X,2);ie=re[0],oe=re[1]}else if(X!=null)ie=X;else return null}var J=ql(ql({},es.itemStyle),{},{color:Y.color||es.itemStyle.color},a);return y.createElement("li",{className:"recharts-tooltip-item",key:"tooltip-item-".concat(U),style:J},Bn(oe)?y.createElement("span",{className:"recharts-tooltip-item-name"},oe):null,Bn(oe)?y.createElement("span",{className:"recharts-tooltip-item-separator"},r):null,y.createElement("span",{className:"recharts-tooltip-item-value"},ie),y.createElement("span",{className:"recharts-tooltip-item-unit"},Y.unit||""))});return y.createElement("ul",{className:"recharts-tooltip-item-list",style:B},z)}return null},N=ql(ql({},es.contentStyle),n),E=ql({margin:0},u),A=!qt(v),P=A?v:"",M=rt("recharts-default-tooltip",m),O=rt("recharts-tooltip-label",g);A&&b&&c!==void 0&&c!==null&&(P=b(v,c));var D=k?{role:"status","aria-live":"assertive"}:{};return y.createElement("div",Bv({className:M,style:N},D),y.createElement("p",{className:O,style:E},y.isValidElement(P)?P:"".concat(P)),S())},Ql="recharts-tooltip-wrapper",H6={visibility:"hidden"};function W6(e){var t=e.coordinate,r=e.translateX,n=e.translateY;return rt(Ql,{["".concat(Ql,"-right")]:Ee(r)&&t&&Ee(t.x)&&r>=t.x,["".concat(Ql,"-left")]:Ee(r)&&t&&Ee(t.x)&&r=t.y,["".concat(Ql,"-top")]:Ee(n)&&t&&Ee(t.y)&&n0?a:0),g=r[n]+a;if(t[n])return u[n]?m:g;var v=f[n];if(v==null)return 0;if(u[n]){var b=m,j=v;return bS?Math.max(m,v):Math.max(g,v)}function K6(e){var t=e.translateX,r=e.translateY,n=e.useTranslate3d;return{transform:n?"translate3d(".concat(t,"px, ").concat(r,"px, 0)"):"translate(".concat(t,"px, ").concat(r,"px)")}}function G6(e){var t=e.allowEscapeViewBox,r=e.coordinate,n=e.offsetTop,a=e.offsetLeft,o=e.position,u=e.reverseDirection,c=e.tooltipBox,f=e.useTranslate3d,h=e.viewBox,m,g,v;return c.height>0&&c.width>0&&r?(g=Rk({allowEscapeViewBox:t,coordinate:r,key:"x",offset:a,position:o,reverseDirection:u,tooltipDimension:c.width,viewBox:h,viewBoxDimension:h.width}),v=Rk({allowEscapeViewBox:t,coordinate:r,key:"y",offset:n,position:o,reverseDirection:u,tooltipDimension:c.height,viewBox:h,viewBoxDimension:h.height}),m=K6({translateX:g,translateY:v,useTranslate3d:f})):m=H6,{cssProperties:m,cssClasses:W6({translateX:g,translateY:v,coordinate:r})}}var V6=()=>!(typeof window<"u"&&window.document&&window.document.createElement&&window.setTimeout),Yu={isSsr:V6()};function q6(e,t){return Z6(e)||X6(e,t)||Y6(e,t)||Q6()}function Q6(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function Y6(e,t){if(e){if(typeof e=="string")return Lk(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Lk(e,t):void 0}}function Lk(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);rYu.isSsr||!window.matchMedia?!1:window.matchMedia("(prefers-reduced-motion: reduce)").matches),t=q6(e,2),r=t[0],n=t[1];return y.useEffect(()=>{if(window.matchMedia){var a=window.matchMedia("(prefers-reduced-motion: reduce)"),o=()=>{n(a.matches)};return a.addEventListener("change",o),()=>{a.removeEventListener("change",o)}}},[]),r}function $k(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function ts(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);r({dismissed:!1,dismissedAtCoordinate:{x:0,y:0}})),h=r8(f,2),m=h[0],g=h[1];y.useEffect(()=>{var N=E=>{if(E.key==="Escape"){var A,P,M,O;g({dismissed:!0,dismissedAtCoordinate:{x:(A=(P=e.coordinate)===null||P===void 0?void 0:P.x)!==null&&A!==void 0?A:0,y:(M=(O=e.coordinate)===null||O===void 0?void 0:O.y)!==null&&M!==void 0?M:0}})}};return document.addEventListener("keydown",N),()=>{document.removeEventListener("keydown",N)}},[(t=e.coordinate)===null||t===void 0?void 0:t.x,(r=e.coordinate)===null||r===void 0?void 0:r.y]),m.dismissed&&(((n=(a=e.coordinate)===null||a===void 0?void 0:a.x)!==null&&n!==void 0?n:0)!==m.dismissedAtCoordinate.x||((o=(u=e.coordinate)===null||u===void 0?void 0:u.y)!==null&&o!==void 0?o:0)!==m.dismissedAtCoordinate.y)&&g(ts(ts({},m),{},{dismissed:!1}));var v=G6({allowEscapeViewBox:e.allowEscapeViewBox,coordinate:e.coordinate,offsetLeft:typeof e.offset=="number"?e.offset:e.offset.x,offsetTop:typeof e.offset=="number"?e.offset:e.offset.y,position:e.position,reverseDirection:e.reverseDirection,tooltipBox:{height:e.lastBoundingBox.height,width:e.lastBoundingBox.width},useTranslate3d:e.useTranslate3d,viewBox:e.viewBox}),b=v.cssClasses,j=v.cssProperties,k=e.hasPortalFromProps?{}:ts(ts({transition:s8({prefersReducedMotion:c,isAnimationActive:e.isAnimationActive,active:e.active,animationDuration:e.animationDuration,animationEasing:e.animationEasing})},j),{},{pointerEvents:"none",position:"absolute",top:0,left:0}),S=ts(ts({},k),{},{visibility:!m.dismissed&&e.active&&e.hasPayload?"visible":"hidden"},e.wrapperStyle);return y.createElement("div",{xmlns:"http://www.w3.org/1999/xhtml",tabIndex:-1,className:b,style:S,ref:e.innerRef},e.children)}var u8=y.memo(l8),sA=()=>{var e;return(e=Me(t=>t.rootProps.accessibilityLayer))!==null&&e!==void 0?e:!0};function Uv(){return Uv=Object.assign?Object.assign.bind():function(e){for(var t=1;tHe(e.x)&&He(e.y),Hk=e=>e.base!=null&&Sf(e.base)&&Sf(e),Yl=e=>e.x,Xl=e=>e.y,h8=(e,t)=>{if(typeof e=="function")return e;var r="curve".concat(Oy(e));if((r==="curveMonotone"||r==="curveBump")&&t){var n=Uk["".concat(r).concat(t==="vertical"?"Y":"X")];if(n)return n}return Uk[r]||dh},Wk={connectNulls:!1,type:"linear"},m8=e=>{var t=e.type,r=t===void 0?Wk.type:t,n=e.points,a=n===void 0?[]:n,o=e.baseLine,u=e.layout,c=e.connectNulls,f=c===void 0?Wk.connectNulls:c,h=h8(r,u),m=f?a.filter(Sf):a;if(Array.isArray(o)){var g,v=a.map((N,E)=>Bk(Bk({},N),{},{base:o[E]}));u==="vertical"?g=Sd().y(Xl).x1(Yl).x0(N=>N.base.x):g=Sd().x(Yl).y1(Xl).y0(N=>N.base.y);var b=g.defined(Hk).curve(h),j=f?v.filter(Hk):v;return b(j)}var k;u==="vertical"&&Ee(o)?k=Sd().y(Xl).x1(Yl).x0(o):Ee(o)?k=Sd().x(Yl).y1(Xl).y0(o):k=RE().x(Yl).y(Xl);var S=k.defined(Sf).curve(h);return S(m)},qd=e=>{var t=e.className,r=e.points,n=e.path,a=e.pathRef,o=Qs();if((!r||!r.length)&&!n)return null;var u={type:e.type,points:e.points,baseLine:e.baseLine,layout:e.layout||o,connectNulls:e.connectNulls},c=r&&r.length?m8(u):n;return y.createElement("path",Uv({},vn(e),_y(e),{className:rt("recharts-curve",t),d:c===null?void 0:c,ref:a}))},p8=["x","y","top","left","width","height","className"];function Hv(){return Hv=Object.assign?Object.assign.bind():function(e){for(var t=1;t"M".concat(e,",").concat(a,"v").concat(n,"M").concat(o,",").concat(t,"h").concat(r),j8=e=>{var t=e.x,r=t===void 0?0:t,n=e.y,a=n===void 0?0:n,o=e.top,u=o===void 0?0:o,c=e.left,f=c===void 0?0:c,h=e.width,m=h===void 0?0:h,g=e.height,v=g===void 0?0:g,b=e.className,j=b8(e,p8),k=g8({x:r,y:a,top:u,left:f,width:m,height:v},j);return!Ee(r)||!Ee(a)||!Ee(m)||!Ee(v)||!Ee(u)||!Ee(f)?null:y.createElement("path",Hv({},Xr(k),{className:rt("recharts-cross",b),d:k8(r,a,m,v,u,f)}))};function S8(e,t,r,n){var a=n/2;return{stroke:"none",fill:"#ccc",x:e==="horizontal"?t.x-a:r.left+.5,y:e==="horizontal"?r.top+.5:t.y-a,width:e==="horizontal"?n:r.width-1,height:e==="horizontal"?r.height-1:n}}var Nf=1e-4,lA=(e,t)=>[0,3*e,3*t-6*e,3*e-3*t+1],uA=(e,t)=>e.map((r,n)=>r*t**n).reduce((r,n)=>r+n),Gk=(e,t)=>r=>{var n=lA(e,t);return uA(n,r)},N8=(e,t)=>r=>{var n=lA(e,t),a=[...n.map((o,u)=>o*u).slice(1),0];return uA(a,r)},E8=e=>{var t,r=e.split("(");if(r.length!==2||r[0]!=="cubic-bezier")return null;var n=(t=r[1])===null||t===void 0||(t=t.split(")")[0])===null||t===void 0?void 0:t.split(",");if(n==null||n.length!==4)return null;var a=n.map(o=>parseFloat(o));return[a[0],a[1],a[2],a[3]]},A8=function(){for(var t=arguments.length,r=new Array(t),n=0;n{var a=Gk(e,r),o=Gk(t,n),u=N8(e,r),c=h=>h>1?1:h<0?0:h,f=h=>{for(var m=h>1?1:h,g=m,v=0;v<8;++v){var b=a(g)-m,j=u(g);if(Math.abs(b-m)0&&arguments[0]!==void 0?arguments[0]:{},r=t.stiff,n=r===void 0?100:r,a=t.damping,o=a===void 0?8:a,u=t.dt,c=u===void 0?16.67:u,f=1,h=[0],m=0,g=0,v=1e4,b=0;b{var E,A,P;if(N<=0)return 0;if(N>=1)return f;var M=N*S,O=Math.floor(M),D=M-O;return((E=h[O])!==null&&E!==void 0?E:0)+(((A=h[O+1])!==null&&A!==void 0?A:0)-((P=h[O])!==null&&P!==void 0?P:0))*D}},O8=e=>{if(typeof e=="string")switch(e){case"ease":case"ease-in-out":case"ease-out":case"ease-in":case"linear":return Vk(e);case"spring":return P8();default:if(e.split("(")[0]==="cubic-bezier")return Vk(e)}return typeof e=="function"?e:null},_8=(e,t,r)=>{var n,a=o=>{var u=t.tick(o);if(t.getState()==="active"){if(r(t.getInterpolated()),t.getProgress()===1){t.complete(),n=void 0;return}n=e.setTimeout(a,u);return}n=e.setTimeout(a,u)};return n=e.setTimeout(a,0),()=>{var o;return(o=n)===null||o===void 0?void 0:o()}},cA=y.createContext(_8);cA.Provider;function M8(e){var t=y.useContext(cA);return y.useMemo(()=>e??t,[e,t])}function I8(e,t,r){return(t=T8(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function T8(e){var t=D8(e,"string");return typeof t=="symbol"?t:t+""}function D8(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}var qk="init",Qk="pending",Yk="active",R8="completed";function yg(e){return Math.max(0,e)}class L8{getAnimationStartedTime(){return this.animationStartedTime}getBeginStartedTime(){return this.beginStartedTime}constructor(t){var r;I8(this,"state",qk),this.animationId=t.animationId,this.onAnimationEnd=t.onAnimationEnd,this.animationDuration=yg(t.animationDuration),this.animationBegin=yg(t.animationBegin),this.progress=0,this.from=t.from,this.to=t.to,this.easing=t.easing,(r=t.onAnimationStart)===null||r===void 0||r.call(t)}getState(){return this.state}getEasing(){return this.easing}getAnimationDuration(){return this.animationDuration}tick(t){if(this.getState()===qk)return this.state=Qk,this.beginStartedTime=t,this.animationBegin;if(this.getState()===Qk){if(this.beginStartedTime==null)throw new Error;var r=t-this.beginStartedTime;return r>=this.animationBegin?(this.state=Yk,this.animationStartedTime=t,this.nextAnimationUpdate(0)):yg(this.animationBegin-r)}if(this.getState()===Yk){if(this.animationStartedTime==null)throw new Error;var n=t-this.animationStartedTime;return this.setProgress(n/this.animationDuration),this.nextAnimationUpdate(n)}return 0}setProgress(t){this.progress=Math.min(1,Math.max(0,t))}getProgress(){return this.progress}complete(){if(this.progress=1,this.state==="active"){var t;(t=this.onAnimationEnd)===null||t===void 0||t.call(this)}this.state=R8}getFrom(){return this.from}getTo(){return this.to}getAnimationId(){return this.animationId}getAnimationBegin(){return this.animationBegin}}class $8 extends L8{nextAnimationUpdate(){return 0}getInterpolated(){return this.easing(li(this.getFrom(),this.getTo(),this.getProgress()))}}class z8{setTimeout(t){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,n=performance.now(),a=null,o=u=>{u-n>=r?t(u):a=requestAnimationFrame(o)};return a=requestAnimationFrame(o),()=>{a!=null&&cancelAnimationFrame(a)}}}function F8(e,t){return W8(e)||H8(e,t)||U8(e,t)||B8()}function B8(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function U8(e,t){if(e){if(typeof e=="string")return Xk(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Xk(e,t):void 0}}function Xk(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{},onAnimationStart:()=>{}},Zk=0,xg=1;function dA(e){var t=en(e,K8),r=t.animationId,n=t.isActive,a=t.canBegin,o=t.duration,u=t.easing,c=t.begin,f=t.onAnimationEnd,h=t.onAnimationStart,m=t.children,g=oA(),v=n==="auto"?!Yu.isSsr&&!g:n,b=M8(t.animationController),j=y.useState(v?Zk:xg),k=F8(j,2),S=k[0],N=k[1];return y.useEffect(()=>{v||N(xg)},[v]),y.useEffect(()=>{var E=O8(u);if(!v||!a||E==null)return qs;var A=new z8,P=new $8({animationId:r,easing:E,animationDuration:o,animationBegin:c,onAnimationStart:h,onAnimationEnd:f,from:Zk,to:xg});return b(A,P,N)},[b,r,v,a,o,u,c,h,f]),m(Number(S))}function fA(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"animation-",r=y.useRef(bu(t)),n=y.useRef(e);return n.current!==e&&(r.current=bu(t),n.current=e),r.current}var G8=e=>e.replace(/([A-Z])/g,t=>"-".concat(t.toLowerCase())),V8=(e,t,r)=>e.map(n=>"".concat(G8(n)," ").concat(t,"ms ").concat(r)).join(","),q8=["radius"],Q8=["radius"],Jk,ej,tj,rj,nj,ij,aj,oj,sj,lj;function uj(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function cj(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);r{var o=ua(r),u=ua(n),c=Math.min(Math.abs(o)/2,Math.abs(u)/2),f=u>=0?1:-1,h=o>=0?1:-1,m=u>=0&&o>=0||u<0&&o<0?1:0,g;if(c>0&&Array.isArray(a)){for(var v=[0,0,0,0],b=0,j=4;bc?c:S}g=Wt(Jk||(Jk=An(["M",",",""])),e,t+f*v[0]),v[0]>0&&(g+=Wt(ej||(ej=An(["A ",",",",0,0,",",",",",""])),v[0],v[0],m,e+h*v[0],t)),g+=Wt(tj||(tj=An(["L ",",",""])),e+r-h*v[1],t),v[1]>0&&(g+=Wt(rj||(rj=An(["A ",",",",0,0,",`, + `,",",""])),v[1],v[1],m,e+r,t+f*v[1])),g+=Wt(nj||(nj=An(["L ",",",""])),e+r,t+n-f*v[2]),v[2]>0&&(g+=Wt(ij||(ij=An(["A ",",",",0,0,",`, + `,",",""])),v[2],v[2],m,e+r-h*v[2],t+n)),g+=Wt(aj||(aj=An(["L ",",",""])),e+h*v[3],t+n),v[3]>0&&(g+=Wt(oj||(oj=An(["A ",",",",0,0,",`, + `,",",""])),v[3],v[3],m,e,t+n-f*v[3])),g+="Z"}else if(c>0&&a===+a&&a>0){var N=Math.min(c,a);g=Wt(sj||(sj=An(["M ",",",` + A `,",",",0,0,",",",",",` + L `,",",` + A `,",",",0,0,",",",",",` + L `,",",` + A `,",",",0,0,",",",",",` + L `,",",` + A `,",",",0,0,",",",","," Z"])),e,t+f*N,N,N,m,e+h*N,t,e+r-h*N,t,N,N,m,e+r,t+f*N,e+r,t+n-f*N,N,N,m,e+r-h*N,t+n,e+h*N,t+n,N,N,m,e,t+n-f*N)}else g=Wt(lj||(lj=An(["M ",","," h "," v "," h "," Z"])),e,t,r,n,-r);return g},mj={x:0,y:0,width:0,height:0,radius:0,isAnimationActive:!1,isUpdateAnimationActive:!1,animationBegin:0,animationDuration:1500,animationEasing:"ease"},aF=e=>{var t=en(e,mj),r=y.useRef(null),n=y.useState(-1),a=eF(n,2),o=a[0],u=a[1];y.useEffect(()=>{if(r.current&&r.current.getTotalLength)try{var X=r.current.getTotalLength();X&&u(X)}catch{}},[]);var c=t.x,f=t.y,h=t.width,m=t.height,g=t.radius,v=t.className,b=t.animationEasing,j=t.animationDuration,k=t.animationBegin,S=t.isAnimationActive,N=t.isUpdateAnimationActive,E=y.useRef(h),A=y.useRef(m),P=y.useRef(c),M=y.useRef(f),O=y.useMemo(()=>({x:c,y:f,width:h,height:m,radius:g}),[c,f,h,m,g]),D=fA(O,"rectangle-");if(c!==+c||f!==+f||h!==+h||m!==+m||h===0||m===0)return null;var B=rt("recharts-rectangle",v);if(!N){var F=Xr(t);F.radius;var z=dj(F,q8);return y.createElement("path",Ef({},z,{x:ua(c),y:ua(f),width:ua(h),height:ua(m),radius:typeof g=="number"?g:void 0,className:B,d:hj(c,f,h,m,g)}))}var Y=E.current,U=A.current,me=P.current,ue=M.current,ge="0px ".concat(o===-1?1:o,"px"),ie="".concat(o,"px ").concat(o,"px"),oe=V8(["strokeDasharray"],j,typeof b=="string"?b:mj.animationEasing);return y.createElement(dA,{animationId:D,key:D,canBegin:o>0,duration:j,easing:b,isActive:N,begin:k},X=>{var re=li(Y,h,X),J=li(U,m,X),I=li(me,c,X),_=li(ue,f,X);r.current&&(E.current=re,A.current=J,P.current=I,M.current=_);var W;S?X>0?W={transition:oe,strokeDasharray:ie}:W={strokeDasharray:ge}:W={strokeDasharray:ie};var ee=Xr(t);ee.radius;var Z=dj(ee,Q8);return y.createElement("path",Ef({},Z,{radius:typeof g=="number"?g:void 0,className:B,d:hj(I,_,re,J,g),ref:r,style:cj(cj({},W),t.style)}))})};function pj(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function gj(e){for(var t=1;te*180/Math.PI,Vt=(e,t,r,n)=>({x:e+Math.cos(-Af*n)*r,y:t+Math.sin(-Af*n)*r}),cF=function(t,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{top:0,right:0,bottom:0,left:0};return Math.min(Math.abs(t-(n.left||0)-(n.right||0)),Math.abs(r-(n.top||0)-(n.bottom||0)))/2},dF=(e,t)=>{var r=e.x,n=e.y,a=t.x,o=t.y;return Math.sqrt((r-a)**2+(n-o)**2)},fF=(e,t)=>{var r=e.x,n=e.y,a=t.cx,o=t.cy,u=dF({x:r,y:n},{x:a,y:o});if(u<=0)return{radius:u,angle:0};var c=(r-a)/u,f=Math.acos(c);return n>o&&(f=2*Math.PI-f),{radius:u,angle:uF(f),angleInRadian:f}},hF=e=>{var t=e.startAngle,r=e.endAngle,n=Math.floor(t/360),a=Math.floor(r/360),o=Math.min(n,a);return{startAngle:t-o*360,endAngle:r-o*360}},mF=(e,t)=>{var r=t.startAngle,n=t.endAngle,a=Math.floor(r/360),o=Math.floor(n/360),u=Math.min(a,o);return e+u*360},pF=(e,t)=>{var r=e.relativeX,n=e.relativeY,a=fF({x:r,y:n},t),o=a.radius,u=a.angle,c=t.innerRadius,f=t.outerRadius;if(of||o===0)return null;var h=hF(t),m=h.startAngle,g=h.endAngle,v=u,b;if(m<=g){for(;v>g;)v-=360;for(;v=m&&v<=g}else{for(;v>m;)v-=360;for(;v=g&&v<=m}return b?gj(gj({},t),{},{radius:o,angle:mF(v,t)}):null};function hA(e){var t=e.cx,r=e.cy,n=e.radius,a=e.startAngle,o=e.endAngle,u=Vt(t,r,n,a),c=Vt(t,r,n,o);return{points:[u,c],cx:t,cy:r,radius:n,startAngle:a,endAngle:o}}var vj,yj,xj,bj,wj,kj,jj;function Wv(){return Wv=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var r=qr(t-e),n=Math.min(Math.abs(t-e),359.999);return r*n},Md=e=>{var t=e.cx,r=e.cy,n=e.radius,a=e.angle,o=e.sign,u=e.isExternal,c=e.cornerRadius,f=e.cornerIsExternal,h=c*(u?1:-1)+n,m=Math.asin(c/h)/Af,g=f?a:a+o*m,v=Vt(t,r,h,g),b=Vt(t,r,n,g),j=f?a-o*m:a,k=Vt(t,r,h*Math.cos(m*Af),j);return{center:v,circleTangency:b,lineTangency:k,theta:m}},mA=e=>{var t=e.cx,r=e.cy,n=e.innerRadius,a=e.outerRadius,o=e.startAngle,u=e.endAngle,c=gF(o,u),f=o+c,h=Vt(t,r,a,o),m=Vt(t,r,a,f),g=Wt(vj||(vj=Ka(["M ",",",` + A `,",",`,0, + `,",",`, + `,",",` + `])),h.x,h.y,a,a,+(Math.abs(c)>180),+(o>f),m.x,m.y);if(n>0){var v=Vt(t,r,n,o),b=Vt(t,r,n,f);g+=Wt(yj||(yj=Ka(["L ",",",` + A `,",",`,0, + `,",",`, + `,","," Z"])),b.x,b.y,n,n,+(Math.abs(c)>180),+(o<=f),v.x,v.y)}else g+=Wt(xj||(xj=Ka(["L ",","," Z"])),t,r);return g},vF=e=>{var t=e.cx,r=e.cy,n=e.innerRadius,a=e.outerRadius,o=e.cornerRadius,u=e.forceCornerRadius,c=e.cornerIsExternal,f=e.startAngle,h=e.endAngle,m=qr(h-f),g=Md({cx:t,cy:r,radius:a,angle:f,sign:m,cornerRadius:o,cornerIsExternal:c}),v=g.circleTangency,b=g.lineTangency,j=g.theta,k=Md({cx:t,cy:r,radius:a,angle:h,sign:-m,cornerRadius:o,cornerIsExternal:c}),S=k.circleTangency,N=k.lineTangency,E=k.theta,A=c?Math.abs(f-h):Math.abs(f-h)-j-E;if(A<0)return u?Wt(bj||(bj=Ka(["M ",",",` + a`,",",",0,0,1,",`,0 + a`,",",",0,0,1,",`,0 + `])),b.x,b.y,o,o,o*2,o,o,-o*2):mA({cx:t,cy:r,innerRadius:n,outerRadius:a,startAngle:f,endAngle:h});var P=Wt(wj||(wj=Ka(["M ",",",` + A`,",",",0,0,",",",",",` + A`,",",",0,",",",",",",",` + A`,",",",0,0,",",",",",` + `])),b.x,b.y,o,o,+(m<0),v.x,v.y,a,a,+(A>180),+(m<0),S.x,S.y,o,o,+(m<0),N.x,N.y);if(n>0){var M=Md({cx:t,cy:r,radius:n,angle:f,sign:m,isExternal:!0,cornerRadius:o,cornerIsExternal:c}),O=M.circleTangency,D=M.lineTangency,B=M.theta,F=Md({cx:t,cy:r,radius:n,angle:h,sign:-m,isExternal:!0,cornerRadius:o,cornerIsExternal:c}),z=F.circleTangency,Y=F.lineTangency,U=F.theta,me=c?Math.abs(f-h):Math.abs(f-h)-B-U;if(me<0&&o===0)return"".concat(P,"L").concat(t,",").concat(r,"Z");P+=Wt(kj||(kj=Ka(["L",",",` + A`,",",",0,0,",",",",",` + A`,",",",0,",",",",",",",` + A`,",",",0,0,",",",",","Z"])),Y.x,Y.y,o,o,+(m<0),z.x,z.y,n,n,+(me>180),+(m>0),O.x,O.y,o,o,+(m<0),D.x,D.y)}else P+=Wt(jj||(jj=Ka(["L",",","Z"])),t,r);return P},yF={cx:0,cy:0,innerRadius:0,outerRadius:0,startAngle:0,endAngle:0,cornerRadius:0,forceCornerRadius:!1,cornerIsExternal:!1},xF=e=>{var t=en(e,yF),r=t.cx,n=t.cy,a=t.innerRadius,o=t.outerRadius,u=t.cornerRadius,c=t.forceCornerRadius,f=t.cornerIsExternal,h=t.startAngle,m=t.endAngle,g=t.className;if(o0&&Math.abs(h-m)<360?k=vF({cx:r,cy:n,innerRadius:a,outerRadius:o,cornerRadius:Math.min(j,b/2),forceCornerRadius:c,cornerIsExternal:f,startAngle:h,endAngle:m}):k=mA({cx:r,cy:n,innerRadius:a,outerRadius:o,startAngle:h,endAngle:m}),y.createElement("path",Wv({},Xr(t),{className:v,d:k}))};function bF(e,t,r){if(e==="horizontal")return[{x:t.x,y:r.top},{x:t.x,y:r.top+r.height}];if(e==="vertical")return[{x:r.left,y:t.y},{x:r.left+r.width,y:t.y}];if(QE(t)){if(e==="centric"){var n=t.cx,a=t.cy,o=t.innerRadius,u=t.outerRadius,c=t.angle,f=Vt(n,a,o,c),h=Vt(n,a,u,c);return[{x:f.x,y:f.y},{x:h.x,y:h.y}]}return hA(t)}}function wF(e){return u5(e)?NaN:Number(e)}function bg(e){return e?(e=wF(e),e===1/0||e===-1/0?(e<0?-1:1)*Number.MAX_VALUE:e===e?e:0):e===0?e:0}function pA(e,t,r){r&&typeof r!="number"&&Sv(e,t,r)&&(t=r=void 0),e=bg(e),t===void 0?(t=e,e=0):t=bg(t),r=r===void 0?ee.chartData,Ky=V([bn],e=>{var t=e.chartData!=null?e.chartData.length-1:0;return{chartData:e.chartData,computedData:e.computedData,dataEndIndex:t,dataStartIndex:0}}),Ih=(e,t,r,n)=>n?Ky(e):bn(e),kF=(e,t,r)=>r?Ky(e):bn(e),jF=V([Ih],e=>{var t=e.chartData,r=e.dataStartIndex,n=e.dataEndIndex;return t!=null?t.slice(r,n+1):[]});V([Ky],e=>{var t=e.chartData,r=e.dataStartIndex,n=e.dataEndIndex;return t!=null?t.slice(r,n+1):[]});var SF=V([bn],e=>{var t=e.chartData,r=e.dataStartIndex,n=e.dataEndIndex;return t!=null?t.slice(r,n+1):[]});function Gy(e,t){return CF(e)||AF(e,t)||EF(e,t)||NF()}function NF(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function EF(e,t){if(e){if(typeof e=="string")return Sj(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Sj(e,t):void 0}}function Sj(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);re.e^o.s<0?1:-1;for(n=o.d.length,a=e.d.length,t=0,r=ne.d[t]^o.s<0?1:-1;return n===a?0:n>a^o.s<0?1:-1};be.decimalPlaces=be.dp=function(){var e=this,t=e.d.length-1,r=(t-e.e)*lt;if(t=e.d[t],t)for(;t%10==0;t/=10)r--;return r<0?0:r};be.dividedBy=be.div=function(e){return fi(this,new this.constructor(e))};be.dividedToIntegerBy=be.idiv=function(e){var t=this,r=t.constructor;return et(fi(t,new r(e),0,1),r.precision)};be.equals=be.eq=function(e){return!this.cmp(e)};be.exponent=function(){return jt(this)};be.greaterThan=be.gt=function(e){return this.cmp(e)>0};be.greaterThanOrEqualTo=be.gte=function(e){return this.cmp(e)>=0};be.isInteger=be.isint=function(){return this.e>this.d.length-2};be.isNegative=be.isneg=function(){return this.s<0};be.isPositive=be.ispos=function(){return this.s>0};be.isZero=function(){return this.s===0};be.lessThan=be.lt=function(e){return this.cmp(e)<0};be.lessThanOrEqualTo=be.lte=function(e){return this.cmp(e)<1};be.logarithm=be.log=function(e){var t,r=this,n=r.constructor,a=n.precision,o=a+5;if(e===void 0)e=new n(10);else if(e=new n(e),e.s<1||e.eq(Dr))throw Error(Jr+"NaN");if(r.s<1)throw Error(Jr+(r.s?"NaN":"-Infinity"));return r.eq(Dr)?new n(0):(ct=!1,t=fi(Au(r,o),Au(e,o),o),ct=!0,et(t,a))};be.minus=be.sub=function(e){var t=this;return e=new t.constructor(e),t.s==e.s?bA(t,e):yA(t,(e.s=-e.s,e))};be.modulo=be.mod=function(e){var t,r=this,n=r.constructor,a=n.precision;if(e=new n(e),!e.s)throw Error(Jr+"NaN");return r.s?(ct=!1,t=fi(r,e,0,1).times(e),ct=!0,r.minus(t)):et(new n(r),a)};be.naturalExponential=be.exp=function(){return xA(this)};be.naturalLogarithm=be.ln=function(){return Au(this)};be.negated=be.neg=function(){var e=new this.constructor(this);return e.s=-e.s||0,e};be.plus=be.add=function(e){var t=this;return e=new t.constructor(e),t.s==e.s?yA(t,e):bA(t,(e.s=-e.s,e))};be.precision=be.sd=function(e){var t,r,n,a=this;if(e!==void 0&&e!==!!e&&e!==1&&e!==0)throw Error(ao+e);if(t=jt(a)+1,n=a.d.length-1,r=n*lt+1,n=a.d[n],n){for(;n%10==0;n/=10)r--;for(n=a.d[0];n>=10;n/=10)r++}return e&&t>r?t:r};be.squareRoot=be.sqrt=function(){var e,t,r,n,a,o,u,c=this,f=c.constructor;if(c.s<1){if(!c.s)return new f(0);throw Error(Jr+"NaN")}for(e=jt(c),ct=!1,a=Math.sqrt(+c),a==0||a==1/0?(t=Dn(c.d),(t.length+e)%2==0&&(t+="0"),a=Math.sqrt(t),e=Xs((e+1)/2)-(e<0||e%2),a==1/0?t="5e"+e:(t=a.toExponential(),t=t.slice(0,t.indexOf("e")+1)+e),n=new f(t)):n=new f(a.toString()),r=f.precision,a=u=r+3;;)if(o=n,n=o.plus(fi(c,o,u+2)).times(.5),Dn(o.d).slice(0,u)===(t=Dn(n.d)).slice(0,u)){if(t=t.slice(u-3,u+1),a==u&&t=="4999"){if(et(o,r+1,0),o.times(o).eq(c)){n=o;break}}else if(t!="9999")break;u+=4}return ct=!0,et(n,r)};be.times=be.mul=function(e){var t,r,n,a,o,u,c,f,h,m=this,g=m.constructor,v=m.d,b=(e=new g(e)).d;if(!m.s||!e.s)return new g(0);for(e.s*=m.s,r=m.e+e.e,f=v.length,h=b.length,f=0;){for(t=0,a=f+n;a>n;)c=o[a]+b[n]*v[a-n-1]+t,o[a--]=c%Dt|0,t=c/Dt|0;o[a]=(o[a]+t)%Dt|0}for(;!o[--u];)o.pop();return t?++r:o.shift(),e.d=o,e.e=r,ct?et(e,g.precision):e};be.toDecimalPlaces=be.todp=function(e,t){var r=this,n=r.constructor;return r=new n(r),e===void 0?r:(Hn(e,0,Ys),t===void 0?t=n.rounding:Hn(t,0,8),et(r,e+jt(r)+1,t))};be.toExponential=function(e,t){var r,n=this,a=n.constructor;return e===void 0?r=po(n,!0):(Hn(e,0,Ys),t===void 0?t=a.rounding:Hn(t,0,8),n=et(new a(n),e+1,t),r=po(n,!0,e+1)),r};be.toFixed=function(e,t){var r,n,a=this,o=a.constructor;return e===void 0?po(a):(Hn(e,0,Ys),t===void 0?t=o.rounding:Hn(t,0,8),n=et(new o(a),e+jt(a)+1,t),r=po(n.abs(),!1,e+jt(n)+1),a.isneg()&&!a.isZero()?"-"+r:r)};be.toInteger=be.toint=function(){var e=this,t=e.constructor;return et(new t(e),jt(e)+1,t.rounding)};be.toNumber=function(){return+this};be.toPower=be.pow=function(e){var t,r,n,a,o,u,c=this,f=c.constructor,h=12,m=+(e=new f(e));if(!e.s)return new f(Dr);if(c=new f(c),!c.s){if(e.s<1)throw Error(Jr+"Infinity");return c}if(c.eq(Dr))return c;if(n=f.precision,e.eq(Dr))return et(c,n);if(t=e.e,r=e.d.length-1,u=t>=r,o=c.s,u){if((r=m<0?-m:m)<=vA){for(a=new f(Dr),t=Math.ceil(n/lt+4),ct=!1;r%2&&(a=a.times(c),Aj(a.d,t)),r=Xs(r/2),r!==0;)c=c.times(c),Aj(c.d,t);return ct=!0,e.s<0?new f(Dr).div(a):et(a,n)}}else if(o<0)throw Error(Jr+"NaN");return o=o<0&&e.d[Math.max(t,r)]&1?-1:1,c.s=1,ct=!1,a=e.times(Au(c,n+h)),ct=!0,a=xA(a),a.s=o,a};be.toPrecision=function(e,t){var r,n,a=this,o=a.constructor;return e===void 0?(r=jt(a),n=po(a,r<=o.toExpNeg||r>=o.toExpPos)):(Hn(e,1,Ys),t===void 0?t=o.rounding:Hn(t,0,8),a=et(new o(a),e,t),r=jt(a),n=po(a,e<=r||r<=o.toExpNeg,e)),n};be.toSignificantDigits=be.tosd=function(e,t){var r=this,n=r.constructor;return e===void 0?(e=n.precision,t=n.rounding):(Hn(e,1,Ys),t===void 0?t=n.rounding:Hn(t,0,8)),et(new n(r),e,t)};be.toString=be.valueOf=be.val=be.toJSON=be[Symbol.for("nodejs.util.inspect.custom")]=function(){var e=this,t=jt(e),r=e.constructor;return po(e,t<=r.toExpNeg||t>=r.toExpPos)};function yA(e,t){var r,n,a,o,u,c,f,h,m=e.constructor,g=m.precision;if(!e.s||!t.s)return t.s||(t=new m(e)),ct?et(t,g):t;if(f=e.d,h=t.d,u=e.e,a=t.e,f=f.slice(),o=u-a,o){for(o<0?(n=f,o=-o,c=h.length):(n=h,a=u,c=f.length),u=Math.ceil(g/lt),c=u>c?u+1:c+1,o>c&&(o=c,n.length=1),n.reverse();o--;)n.push(0);n.reverse()}for(c=f.length,o=h.length,c-o<0&&(o=c,n=h,h=f,f=n),r=0;o;)r=(f[--o]=f[o]+h[o]+r)/Dt|0,f[o]%=Dt;for(r&&(f.unshift(r),++a),c=f.length;f[--c]==0;)f.pop();return t.d=f,t.e=a,ct?et(t,g):t}function Hn(e,t,r){if(e!==~~e||er)throw Error(ao+e)}function Dn(e){var t,r,n,a=e.length-1,o="",u=e[0];if(a>0){for(o+=u,t=1;tu?1:-1;else for(c=f=0;ca[c]?1:-1;break}return f}function r(n,a,o){for(var u=0;o--;)n[o]-=u,u=n[o]1;)n.shift()}return function(n,a,o,u){var c,f,h,m,g,v,b,j,k,S,N,E,A,P,M,O,D,B,F=n.constructor,z=n.s==a.s?1:-1,Y=n.d,U=a.d;if(!n.s)return new F(n);if(!a.s)throw Error(Jr+"Division by zero");for(f=n.e-a.e,D=U.length,M=Y.length,b=new F(z),j=b.d=[],h=0;U[h]==(Y[h]||0);)++h;if(U[h]>(Y[h]||0)&&--f,o==null?E=o=F.precision:u?E=o+(jt(n)-jt(a))+1:E=o,E<0)return new F(0);if(E=E/lt+2|0,h=0,D==1)for(m=0,U=U[0],E++;(h1&&(U=e(U,m),Y=e(Y,m),D=U.length,M=Y.length),P=D,k=Y.slice(0,D),S=k.length;S=Dt/2&&++O;do m=0,c=t(U,k,D,S),c<0?(N=k[0],D!=S&&(N=N*Dt+(k[1]||0)),m=N/O|0,m>1?(m>=Dt&&(m=Dt-1),g=e(U,m),v=g.length,S=k.length,c=t(g,k,v,S),c==1&&(m--,r(g,D16)throw Error(Vy+jt(e));if(!e.s)return new m(Dr);for(ct=!1,c=g,u=new m(.03125);e.abs().gte(.1);)e=e.times(u),h+=5;for(n=Math.log(Ba(2,h))/Math.LN10*2+5|0,c+=n,r=a=o=new m(Dr),m.precision=c;;){if(a=et(a.times(e),c),r=r.times(++f),u=o.plus(fi(a,r,c)),Dn(u.d).slice(0,c)===Dn(o.d).slice(0,c)){for(;h--;)o=et(o.times(o),c);return m.precision=g,t==null?(ct=!0,et(o,g)):o}o=u}}function jt(e){for(var t=e.e*lt,r=e.d[0];r>=10;r/=10)t++;return t}function wg(e,t,r){if(t>e.LN10.sd())throw ct=!0,r&&(e.precision=r),Error(Jr+"LN10 precision limit exceeded");return et(new e(e.LN10),t)}function Zi(e){for(var t="";e--;)t+="0";return t}function Au(e,t){var r,n,a,o,u,c,f,h,m,g=1,v=10,b=e,j=b.d,k=b.constructor,S=k.precision;if(b.s<1)throw Error(Jr+(b.s?"NaN":"-Infinity"));if(b.eq(Dr))return new k(0);if(t==null?(ct=!1,h=S):h=t,b.eq(10))return t==null&&(ct=!0),wg(k,h);if(h+=v,k.precision=h,r=Dn(j),n=r.charAt(0),o=jt(b),Math.abs(o)<15e14){for(;n<7&&n!=1||n==1&&r.charAt(1)>3;)b=b.times(e),r=Dn(b.d),n=r.charAt(0),g++;o=jt(b),n>1?(b=new k("0."+r),o++):b=new k(n+"."+r.slice(1))}else return f=wg(k,h+2,S).times(o+""),b=Au(new k(n+"."+r.slice(1)),h-v).plus(f),k.precision=S,t==null?(ct=!0,et(b,S)):b;for(c=u=b=fi(b.minus(Dr),b.plus(Dr),h),m=et(b.times(b),h),a=3;;){if(u=et(u.times(m),h),f=c.plus(fi(u,new k(a),h)),Dn(f.d).slice(0,h)===Dn(c.d).slice(0,h))return c=c.times(2),o!==0&&(c=c.plus(wg(k,h+2,S).times(o+""))),c=fi(c,new k(g),h),k.precision=S,t==null?(ct=!0,et(c,S)):c;c=f,a+=2}}function Ej(e,t){var r,n,a;for((r=t.indexOf("."))>-1&&(t=t.replace(".","")),(n=t.search(/e/i))>0?(r<0&&(r=n),r+=+t.slice(n+1),t=t.substring(0,n)):r<0&&(r=t.length),n=0;t.charCodeAt(n)===48;)++n;for(a=t.length;t.charCodeAt(a-1)===48;)--a;if(t=t.slice(n,a),t){if(a-=n,r=r-n-1,e.e=Xs(r/lt),e.d=[],n=(r+1)%lt,r<0&&(n+=lt),nCf||e.e<-Cf))throw Error(Vy+r)}else e.s=0,e.e=0,e.d=[0];return e}function et(e,t,r){var n,a,o,u,c,f,h,m,g=e.d;for(u=1,o=g[0];o>=10;o/=10)u++;if(n=t-u,n<0)n+=lt,a=t,h=g[m=0];else{if(m=Math.ceil((n+1)/lt),o=g.length,m>=o)return e;for(h=o=g[m],u=1;o>=10;o/=10)u++;n%=lt,a=n-lt+u}if(r!==void 0&&(o=Ba(10,u-a-1),c=h/o%10|0,f=t<0||g[m+1]!==void 0||h%o,f=r<4?(c||f)&&(r==0||r==(e.s<0?3:2)):c>5||c==5&&(r==4||f||r==6&&(n>0?a>0?h/Ba(10,u-a):0:g[m-1])%10&1||r==(e.s<0?8:7))),t<1||!g[0])return f?(o=jt(e),g.length=1,t=t-o-1,g[0]=Ba(10,(lt-t%lt)%lt),e.e=Xs(-t/lt)||0):(g.length=1,g[0]=e.e=e.s=0),e;if(n==0?(g.length=m,o=1,m--):(g.length=m+1,o=Ba(10,lt-n),g[m]=a>0?(h/Ba(10,u-a)%Ba(10,a)|0)*o:0),f)for(;;)if(m==0){(g[0]+=o)==Dt&&(g[0]=1,++e.e);break}else{if(g[m]+=o,g[m]!=Dt)break;g[m--]=0,o=1}for(n=g.length;g[--n]===0;)g.pop();if(ct&&(e.e>Cf||e.e<-Cf))throw Error(Vy+jt(e));return e}function bA(e,t){var r,n,a,o,u,c,f,h,m,g,v=e.constructor,b=v.precision;if(!e.s||!t.s)return t.s?t.s=-t.s:t=new v(e),ct?et(t,b):t;if(f=e.d,g=t.d,n=t.e,h=e.e,f=f.slice(),u=h-n,u){for(m=u<0,m?(r=f,u=-u,c=g.length):(r=g,n=h,c=f.length),a=Math.max(Math.ceil(b/lt),c)+2,u>a&&(u=a,r.length=1),r.reverse(),a=u;a--;)r.push(0);r.reverse()}else{for(a=f.length,c=g.length,m=a0;--a)f[c++]=0;for(a=g.length;a>u;){if(f[--a]0?o=o.charAt(0)+"."+o.slice(1)+Zi(n):u>1&&(o=o.charAt(0)+"."+o.slice(1)),o=o+(a<0?"e":"e+")+a):a<0?(o="0."+Zi(-a-1)+o,r&&(n=r-u)>0&&(o+=Zi(n))):a>=u?(o+=Zi(a+1-u),r&&(n=r-a-1)>0&&(o=o+"."+Zi(n))):((n=a+1)0&&(a+1===u&&(o+="."),o+=Zi(n))),e.s<0?"-"+o:o}function Aj(e,t){if(e.length>t)return e.length=t,!0}function wA(e){var t,r,n;function a(o){var u=this;if(!(u instanceof a))return new a(o);if(u.constructor=a,o instanceof a){u.s=o.s,u.e=o.e,u.d=(o=o.d)?o.slice():o;return}if(typeof o=="number"){if(o*0!==0)throw Error(ao+o);if(o>0)u.s=1;else if(o<0)o=-o,u.s=-1;else{u.s=0,u.e=0,u.d=[0];return}if(o===~~o&&o<1e7){u.e=0,u.d=[o];return}return Ej(u,o.toString())}else if(typeof o!="string")throw Error(ao+o);if(o.charCodeAt(0)===45?(o=o.slice(1),u.s=-1):u.s=1,_F.test(o))Ej(u,o);else throw Error(ao+o)}if(a.prototype=be,a.ROUND_UP=0,a.ROUND_DOWN=1,a.ROUND_CEIL=2,a.ROUND_FLOOR=3,a.ROUND_HALF_UP=4,a.ROUND_HALF_DOWN=5,a.ROUND_HALF_EVEN=6,a.ROUND_HALF_CEIL=7,a.ROUND_HALF_FLOOR=8,a.clone=wA,a.config=a.set=MF,e===void 0&&(e={}),e)for(n=["precision","rounding","toExpNeg","toExpPos","LN10"],t=0;t=a[t+1]&&n<=a[t+2])this[r]=n;else throw Error(ao+r+": "+n);if((n=e[r="LN10"])!==void 0)if(n==Math.LN10)this[r]=new this(n);else throw Error(ao+r+": "+n);return this}var qy=wA(OF);Dr=new qy(1);const Ke=qy;function kA(e){var t;return e===0?t=1:t=Math.floor(new Ke(e).abs().log(10).toNumber())+1,t}function jA(e,t,r){for(var n=new Ke(e),a=0,o=[];n.lt(t)&&a<1e5;)o.push(n.toNumber()),n=n.add(r),a++;return o}function Cu(e,t){return RF(e)||DF(e,t)||TF(e,t)||IF()}function IF(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function TF(e,t){if(e){if(typeof e=="string")return Cj(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Cj(e,t):void 0}}function Cj(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{var t=Cu(e,2),r=t[0],n=t[1],a=r,o=n;return r>n&&(a=n,o=r),[a,o]},Qy=(e,t,r)=>{if(e.lte(0))return new Ke(0);var n=kA(e.toNumber()),a=new Ke(10).pow(n),o=e.div(a),u=n!==1?.05:.1,c=new Ke(Math.ceil(o.div(u).toNumber())).add(r).mul(u),f=c.mul(a);return t?new Ke(f.toNumber()):new Ke(Math.ceil(f.toNumber()))},NA=(e,t,r)=>{var n;if(e.lte(0))return new Ke(0);var a=[1,2,2.5,5],o=e.toNumber(),u=Math.floor(new Ke(o).abs().log(10).toNumber()),c=new Ke(10).pow(u),f=e.div(c).toNumber(),h=a.findIndex(b=>b>=f-1e-10);if(h===-1&&(c=c.mul(10),h=0),h+=r,h>=a.length){var m=Math.floor(h/a.length);h%=a.length,c=c.mul(new Ke(10).pow(m))}var g=(n=a[h])!==null&&n!==void 0?n:1,v=new Ke(g).mul(c);return t?v:new Ke(Math.ceil(v.toNumber()))},LF=(e,t,r)=>{var n=new Ke(1),a=new Ke(e);if(!a.isint()&&r){var o=Math.abs(e);o<1?(n=new Ke(10).pow(kA(e)-1),a=new Ke(Math.floor(a.div(n).toNumber())).mul(n)):o>1&&(a=new Ke(Math.floor(e)))}else e===0?a=new Ke(Math.floor((t-1)/2)):r||(a=new Ke(Math.floor(e)));for(var u=Math.floor((t-1)/2),c=[],f=0;f4&&arguments[4]!==void 0?arguments[4]:0,u=arguments.length>5&&arguments[5]!==void 0?arguments[5]:Qy;if(!Number.isFinite((r-t)/(n-1)))return{step:new Ke(0),tickMin:new Ke(0),tickMax:new Ke(0)};var c=u(new Ke(r).sub(t).div(n-1),a,o),f;t<=0&&r>=0?f=new Ke(0):(f=new Ke(t).add(r).div(2),f=f.sub(new Ke(f).mod(c)));var h=Math.ceil(f.sub(t).div(c).toNumber()),m=Math.ceil(new Ke(r).sub(f).div(c).toNumber()),g=h+m+1;return g>n?EA(t,r,n,a,o+1,u):(g0?m+(n-g):m,h=r>0?h:h+(n-g)),{step:c,tickMin:f.sub(new Ke(h).mul(c)),tickMax:f.add(new Ke(m).mul(c))})},Pj=function(t){var r=Cu(t,2),n=r[0],a=r[1],o=arguments.length>1&&arguments[1]!==void 0?arguments[1]:6,u=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,c=arguments.length>3&&arguments[3]!==void 0?arguments[3]:"auto",f=Math.max(o,2),h=SA([n,a]),m=Cu(h,2),g=m[0],v=m[1];if(g===-1/0||v===1/0){var b=v===1/0?[g,...Array(o-1).fill(1/0)]:[...Array(o-1).fill(-1/0),v];return n>a?b.reverse():b}if(g===v)return LF(g,o,u);var j=c==="snap125"?NA:Qy,k=EA(g,v,f,u,0,j),S=k.step,N=k.tickMin,E=k.tickMax,A=jA(N,E.add(new Ke(.1).mul(S)),S);return n>a?A.reverse():A},Oj=function(t,r){var n=Cu(t,2),a=n[0],o=n[1],u=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,c=arguments.length>3&&arguments[3]!==void 0?arguments[3]:"auto",f=SA([a,o]),h=Cu(f,2),m=h[0],g=h[1];if(m===-1/0||g===1/0)return[a,o];if(m===g)return[m];var v=c==="snap125"?NA:Qy,b=Math.max(r,2),j=v(new Ke(g).sub(m).div(b-1),u,0),k=[...jA(new Ke(m),new Ke(g),j),g];return u===!1&&(k=k.map(S=>Math.round(S))),a>o?k.reverse():k},$F=e=>e.rootProps.barCategoryGap,Th=e=>e.rootProps.stackOffset,AA=e=>e.rootProps.reverseStackOrder,Yy=e=>e.options.chartName,Xy=e=>e.rootProps.syncId,CA=e=>e.rootProps.syncMethod,Zy=e=>e.options.eventEmitter,zF=e=>e.rootProps.baseValue,dr={grid:-100,barBackground:-50,area:100,cursorRectangle:200,bar:300,line:400,axis:500,scatter:600,activeBar:1e3,cursorLine:1100,activeDot:1200,label:2e3},Ia={allowDecimals:!1,allowDataOverflow:!1,angleAxisId:0,reversed:!1,scale:"auto",tick:!0,type:"auto"},Cn={allowDataOverflow:!1,allowDecimals:!1,allowDuplicatedCategory:!0,includeHidden:!1,radiusAxisId:0,reversed:!1,scale:"auto",tick:!0,tickCount:5,type:"auto"},Dh=(e,t)=>{if(!(!e||!t))return e!=null&&e.reversed?[t[1],t[0]]:t};function Rh(e,t,r){if(r!=="auto")return r;if(e!=null)return Gn(e,t)?"category":"number"}function _j(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function Pf(e){for(var t=1;t{if(t!=null)return e.polarAxis.angleAxis[t]},Jy=V([HF,Z5],(e,t)=>{var r;if(e!=null)return e;var n=(r=Rh(t,"angleAxis",Mj.type))!==null&&r!==void 0?r:"category";return Pf(Pf({},Mj),{},{type:n})}),WF=(e,t)=>e.polarAxis.radiusAxis[t],e0=V([WF,Z5],(e,t)=>{var r;if(e!=null)return e;var n=(r=Rh(t,"radiusAxis",Ij.type))!==null&&r!==void 0?r:"category";return Pf(Pf({},Ij),{},{type:n})}),Lh=e=>e.polarOptions,t0=V([bi,wi,Yt],cF),PA=V([Lh,t0],(e,t)=>{if(e!=null)return ga(e.innerRadius,t,0)}),OA=V([Lh,t0],(e,t)=>{if(e!=null)return ga(e.outerRadius,t,t*.8)}),KF=e=>{if(e==null)return[0,0];var t=e.startAngle,r=e.endAngle;return[t,r]},_A=V([Lh],KF);V([Jy,_A],Dh);var MA=V([t0,PA,OA],(e,t,r)=>{if(!(e==null||t==null||r==null))return[t,r]});V([e0,MA],Dh);var IA=V([dt,Lh,PA,OA,bi,wi],(e,t,r,n,a,o)=>{if(!(e!=="centric"&&e!=="radial"||t==null||r==null||n==null)){var u=t.cx,c=t.cy,f=t.startAngle,h=t.endAngle;return{cx:ga(u,a,a/2),cy:ga(c,o,o/2),innerRadius:r,outerRadius:n,startAngle:f,endAngle:h,clockWise:!1}}}),$t=(e,t)=>t,$h=(e,t,r)=>r;function r0(e){return e==null?void 0:e.id}function TA(e,t,r){var n=t.chartData,a=n===void 0?[]:n,o=r.allowDuplicatedCategory,u=r.dataKey,c=new Map;return e.forEach(f=>{var h,m=(h=f.data)!==null&&h!==void 0?h:a;if(!(m==null||m.length===0)){var g=r0(f);m.forEach((v,b)=>{var j=u==null||o?b:String(Rt(v,u,null)),k=Rt(v,f.dataKey,0),S;c.has(j)?S=c.get(j):S={},Object.assign(S,{[g]:k}),c.set(j,S)})}}),Array.from(c.values())}function n0(e){return"stackId"in e&&e.stackId!=null&&e.dataKey!=null}var zh=(e,t)=>e===t?!0:e==null||t==null?!1:e[0]===t[0]&&e[1]===t[1];function Fh(e,t){return Array.isArray(e)&&Array.isArray(t)&&e.length===0&&t.length===0?!0:e===t}function GF(e,t){if(e.length===t.length){for(var r=0;r{var t=dt(e);return t==="horizontal"?"xAxis":t==="vertical"?"yAxis":t==="centric"?"angleAxis":"radiusAxis"},Zs=e=>e.tooltip.settings.axisId;function i0(e){if(e!=null){var t=e.ticks,r=e.bandwidth,n=e.range(),a=[Math.min(...n),Math.max(...n)];return{domain:()=>e.domain(),range:(function(o){function u(){return o.apply(this,arguments)}return u.toString=function(){return o.toString()},u})(()=>a),rangeMin:()=>a[0],rangeMax:()=>a[1],isInRange(o){var u=a[0],c=a[1];return u<=c?o>=u&&o<=c:o>=c&&o<=u},bandwidth:r?()=>r.call(e):void 0,ticks:t?o=>t.call(e,o):void 0,map:(o,u)=>{var c=e(o);if(c!=null){if(e.bandwidth&&u!==null&&u!==void 0&&u.position){var f=e.bandwidth();switch(u.position){case"middle":c+=f/2;break;case"end":c+=f;break}}return c}}}}}var VF=(e,t)=>{if(t!=null)switch(e){case"linear":{if(!Rn(t)){for(var r,n,a=0;an)&&(n=o))}return r!==void 0&&n!==void 0?[r,n]:void 0}return t}default:return t}};function fa(e,t){return e==null||t==null?NaN:et?1:e>=t?0:NaN}function qF(e,t){return e==null||t==null?NaN:te?1:t>=e?0:NaN}function a0(e){let t,r,n;e.length!==2?(t=fa,r=(c,f)=>fa(e(c),f),n=(c,f)=>e(c)-f):(t=e===fa||e===qF?e:QF,r=e,n=e);function a(c,f,h=0,m=c.length){if(h>>1;r(c[g],f)<0?h=g+1:m=g}while(h>>1;r(c[g],f)<=0?h=g+1:m=g}while(hh&&n(c[g-1],f)>-n(c[g],f)?g-1:g}return{left:a,center:u,right:o}}function QF(){return 0}function DA(e){return e===null?NaN:+e}function*YF(e,t){for(let r of e)r!=null&&(r=+r)>=r&&(yield r)}const XF=a0(fa),Xu=XF.right;a0(DA).center;class Tj extends Map{constructor(t,r=e9){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:r}}),t!=null)for(const[n,a]of t)this.set(n,a)}get(t){return super.get(Dj(this,t))}has(t){return super.has(Dj(this,t))}set(t,r){return super.set(ZF(this,t),r)}delete(t){return super.delete(JF(this,t))}}function Dj({_intern:e,_key:t},r){const n=t(r);return e.has(n)?e.get(n):r}function ZF({_intern:e,_key:t},r){const n=t(r);return e.has(n)?e.get(n):(e.set(n,r),r)}function JF({_intern:e,_key:t},r){const n=t(r);return e.has(n)&&(r=e.get(n),e.delete(n)),r}function e9(e){return e!==null&&typeof e=="object"?e.valueOf():e}function t9(e=fa){if(e===fa)return RA;if(typeof e!="function")throw new TypeError("compare is not a function");return(t,r)=>{const n=e(t,r);return n||n===0?n:(e(r,r)===0)-(e(t,t)===0)}}function RA(e,t){return(e==null||!(e>=e))-(t==null||!(t>=t))||(et?1:0)}const r9=Math.sqrt(50),n9=Math.sqrt(10),i9=Math.sqrt(2);function Of(e,t,r){const n=(t-e)/Math.max(0,r),a=Math.floor(Math.log10(n)),o=n/Math.pow(10,a),u=o>=r9?10:o>=n9?5:o>=i9?2:1;let c,f,h;return a<0?(h=Math.pow(10,-a)/u,c=Math.round(e*h),f=Math.round(t*h),c/ht&&--f,h=-h):(h=Math.pow(10,a)*u,c=Math.round(e/h),f=Math.round(t/h),c*ht&&--f),f0))return[];if(e===t)return[e];const n=t=a))return[];const c=o-a+1,f=new Array(c);if(n)if(u<0)for(let h=0;h=n)&&(r=n);return r}function Lj(e,t){let r;for(const n of e)n!=null&&(r>n||r===void 0&&n>=n)&&(r=n);return r}function LA(e,t,r=0,n=1/0,a){if(t=Math.floor(t),r=Math.floor(Math.max(0,r)),n=Math.floor(Math.min(e.length-1,n)),!(r<=t&&t<=n))return e;for(a=a===void 0?RA:t9(a);n>r;){if(n-r>600){const f=n-r+1,h=t-r+1,m=Math.log(f),g=.5*Math.exp(2*m/3),v=.5*Math.sqrt(m*g*(f-g)/f)*(h-f/2<0?-1:1),b=Math.max(r,Math.floor(t-h*g/f+v)),j=Math.min(n,Math.floor(t+(f-h)*g/f+v));LA(e,t,b,j,a)}const o=e[t];let u=r,c=n;for(Zl(e,r,t),a(e[n],o)>0&&Zl(e,r,n);u0;)--c}a(e[r],o)===0?Zl(e,r,c):(++c,Zl(e,c,n)),c<=t&&(r=c+1),t<=c&&(n=c-1)}return e}function Zl(e,t,r){const n=e[t];e[t]=e[r],e[r]=n}function a9(e,t,r){if(e=Float64Array.from(YF(e)),!(!(n=e.length)||isNaN(t=+t))){if(t<=0||n<2)return Lj(e);if(t>=1)return Rj(e);var n,a=(n-1)*t,o=Math.floor(a),u=Rj(LA(e,o).subarray(0,o+1)),c=Lj(e.subarray(o+1));return u+(c-u)*(a-o)}}function o9(e,t,r=DA){if(!(!(n=e.length)||isNaN(t=+t))){if(t<=0||n<2)return+r(e[0],0,e);if(t>=1)return+r(e[n-1],n-1,e);var n,a=(n-1)*t,o=Math.floor(a),u=+r(e[o],o,e),c=+r(e[o+1],o+1,e);return u+(c-u)*(a-o)}}function s9(e,t,r){e=+e,t=+t,r=(a=arguments.length)<2?(t=e,e=0,1):a<3?1:+r;for(var n=-1,a=Math.max(0,Math.ceil((t-e)/r))|0,o=new Array(a);++n>8&15|t>>4&240,t>>4&15|t&240,(t&15)<<4|t&15,1):r===8?Id(t>>24&255,t>>16&255,t>>8&255,(t&255)/255):r===4?Id(t>>12&15|t>>8&240,t>>8&15|t>>4&240,t>>4&15|t&240,((t&15)<<4|t&15)/255):null):(t=c9.exec(e))?new Sr(t[1],t[2],t[3],1):(t=d9.exec(e))?new Sr(t[1]*255/100,t[2]*255/100,t[3]*255/100,1):(t=f9.exec(e))?Id(t[1],t[2],t[3],t[4]):(t=h9.exec(e))?Id(t[1]*255/100,t[2]*255/100,t[3]*255/100,t[4]):(t=m9.exec(e))?Wj(t[1],t[2]/100,t[3]/100,1):(t=p9.exec(e))?Wj(t[1],t[2]/100,t[3]/100,t[4]):$j.hasOwnProperty(e)?Bj($j[e]):e==="transparent"?new Sr(NaN,NaN,NaN,0):null}function Bj(e){return new Sr(e>>16&255,e>>8&255,e&255,1)}function Id(e,t,r,n){return n<=0&&(e=t=r=NaN),new Sr(e,t,r,n)}function y9(e){return e instanceof Zu||(e=_u(e)),e?(e=e.rgb(),new Sr(e.r,e.g,e.b,e.opacity)):new Sr}function Qv(e,t,r,n){return arguments.length===1?y9(e):new Sr(e,t,r,n??1)}function Sr(e,t,r,n){this.r=+e,this.g=+t,this.b=+r,this.opacity=+n}l0(Sr,Qv,zA(Zu,{brighter(e){return e=e==null?_f:Math.pow(_f,e),new Sr(this.r*e,this.g*e,this.b*e,this.opacity)},darker(e){return e=e==null?Pu:Math.pow(Pu,e),new Sr(this.r*e,this.g*e,this.b*e,this.opacity)},rgb(){return this},clamp(){return new Sr(oo(this.r),oo(this.g),oo(this.b),Mf(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:Uj,formatHex:Uj,formatHex8:x9,formatRgb:Hj,toString:Hj}));function Uj(){return`#${Ga(this.r)}${Ga(this.g)}${Ga(this.b)}`}function x9(){return`#${Ga(this.r)}${Ga(this.g)}${Ga(this.b)}${Ga((isNaN(this.opacity)?1:this.opacity)*255)}`}function Hj(){const e=Mf(this.opacity);return`${e===1?"rgb(":"rgba("}${oo(this.r)}, ${oo(this.g)}, ${oo(this.b)}${e===1?")":`, ${e})`}`}function Mf(e){return isNaN(e)?1:Math.max(0,Math.min(1,e))}function oo(e){return Math.max(0,Math.min(255,Math.round(e)||0))}function Ga(e){return e=oo(e),(e<16?"0":"")+e.toString(16)}function Wj(e,t,r,n){return n<=0?e=t=r=NaN:r<=0||r>=1?e=t=NaN:t<=0&&(e=NaN),new pn(e,t,r,n)}function FA(e){if(e instanceof pn)return new pn(e.h,e.s,e.l,e.opacity);if(e instanceof Zu||(e=_u(e)),!e)return new pn;if(e instanceof pn)return e;e=e.rgb();var t=e.r/255,r=e.g/255,n=e.b/255,a=Math.min(t,r,n),o=Math.max(t,r,n),u=NaN,c=o-a,f=(o+a)/2;return c?(t===o?u=(r-n)/c+(r0&&f<1?0:u,new pn(u,c,f,e.opacity)}function b9(e,t,r,n){return arguments.length===1?FA(e):new pn(e,t,r,n??1)}function pn(e,t,r,n){this.h=+e,this.s=+t,this.l=+r,this.opacity=+n}l0(pn,b9,zA(Zu,{brighter(e){return e=e==null?_f:Math.pow(_f,e),new pn(this.h,this.s,this.l*e,this.opacity)},darker(e){return e=e==null?Pu:Math.pow(Pu,e),new pn(this.h,this.s,this.l*e,this.opacity)},rgb(){var e=this.h%360+(this.h<0)*360,t=isNaN(e)||isNaN(this.s)?0:this.s,r=this.l,n=r+(r<.5?r:1-r)*t,a=2*r-n;return new Sr(kg(e>=240?e-240:e+120,a,n),kg(e,a,n),kg(e<120?e+240:e-120,a,n),this.opacity)},clamp(){return new pn(Kj(this.h),Td(this.s),Td(this.l),Mf(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const e=Mf(this.opacity);return`${e===1?"hsl(":"hsla("}${Kj(this.h)}, ${Td(this.s)*100}%, ${Td(this.l)*100}%${e===1?")":`, ${e})`}`}}));function Kj(e){return e=(e||0)%360,e<0?e+360:e}function Td(e){return Math.max(0,Math.min(1,e||0))}function kg(e,t,r){return(e<60?t+(r-t)*e/60:e<180?r:e<240?t+(r-t)*(240-e)/60:t)*255}const u0=e=>()=>e;function w9(e,t){return function(r){return e+r*t}}function k9(e,t,r){return e=Math.pow(e,r),t=Math.pow(t,r)-e,r=1/r,function(n){return Math.pow(e+n*t,r)}}function j9(e){return(e=+e)==1?BA:function(t,r){return r-t?k9(t,r,e):u0(isNaN(t)?r:t)}}function BA(e,t){var r=t-e;return r?w9(e,r):u0(isNaN(e)?t:e)}const Gj=(function e(t){var r=j9(t);function n(a,o){var u=r((a=Qv(a)).r,(o=Qv(o)).r),c=r(a.g,o.g),f=r(a.b,o.b),h=BA(a.opacity,o.opacity);return function(m){return a.r=u(m),a.g=c(m),a.b=f(m),a.opacity=h(m),a+""}}return n.gamma=e,n})(1);function S9(e,t){t||(t=[]);var r=e?Math.min(t.length,e.length):0,n=t.slice(),a;return function(o){for(a=0;ar&&(o=t.slice(r,o),c[u]?c[u]+=o:c[++u]=o),(n=n[0])===(a=a[0])?c[u]?c[u]+=a:c[++u]=a:(c[++u]=null,f.push({i:u,x:If(n,a)})),r=jg.lastIndex;return rt&&(r=e,e=t,t=r),function(n){return Math.max(e,Math.min(t,n))}}function D9(e,t,r){var n=e[0],a=e[1],o=t[0],u=t[1];return a2?R9:D9,f=h=null,g}function g(v){return v==null||isNaN(v=+v)?o:(f||(f=c(e.map(n),t,r)))(n(u(v)))}return g.invert=function(v){return u(a((h||(h=c(t,e.map(n),If)))(v)))},g.domain=function(v){return arguments.length?(e=Array.from(v,Tf),m()):e.slice()},g.range=function(v){return arguments.length?(t=Array.from(v),m()):t.slice()},g.rangeRound=function(v){return t=Array.from(v),r=c0,m()},g.clamp=function(v){return arguments.length?(u=v?!0:fr,m()):u!==fr},g.interpolate=function(v){return arguments.length?(r=v,m()):r},g.unknown=function(v){return arguments.length?(o=v,g):o},function(v,b){return n=v,a=b,m()}}function d0(){return Bh()(fr,fr)}function L9(e){return Math.abs(e=Math.round(e))>=1e21?e.toLocaleString("en").replace(/,/g,""):e.toString(10)}function Df(e,t){if(!isFinite(e)||e===0)return null;var r=(e=t?e.toExponential(t-1):e.toExponential()).indexOf("e"),n=e.slice(0,r);return[n.length>1?n[0]+n.slice(2):n,+e.slice(r+1)]}function zs(e){return e=Df(Math.abs(e)),e?e[1]:NaN}function $9(e,t){return function(r,n){for(var a=r.length,o=[],u=0,c=e[0],f=0;a>0&&c>0&&(f+c+1>n&&(c=Math.max(1,n-f)),o.push(r.substring(a-=c,a+c)),!((f+=c+1)>n));)c=e[u=(u+1)%e.length];return o.reverse().join(t)}}function z9(e){return function(t){return t.replace(/[0-9]/g,function(r){return e[+r]})}}var F9=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function Mu(e){if(!(t=F9.exec(e)))throw new Error("invalid format: "+e);var t;return new f0({fill:t[1],align:t[2],sign:t[3],symbol:t[4],zero:t[5],width:t[6],comma:t[7],precision:t[8]&&t[8].slice(1),trim:t[9],type:t[10]})}Mu.prototype=f0.prototype;function f0(e){this.fill=e.fill===void 0?" ":e.fill+"",this.align=e.align===void 0?">":e.align+"",this.sign=e.sign===void 0?"-":e.sign+"",this.symbol=e.symbol===void 0?"":e.symbol+"",this.zero=!!e.zero,this.width=e.width===void 0?void 0:+e.width,this.comma=!!e.comma,this.precision=e.precision===void 0?void 0:+e.precision,this.trim=!!e.trim,this.type=e.type===void 0?"":e.type+""}f0.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(this.width===void 0?"":Math.max(1,this.width|0))+(this.comma?",":"")+(this.precision===void 0?"":"."+Math.max(0,this.precision|0))+(this.trim?"~":"")+this.type};function B9(e){e:for(var t=e.length,r=1,n=-1,a;r0&&(n=0);break}return n>0?e.slice(0,n)+e.slice(a+1):e}var Rf;function U9(e,t){var r=Df(e,t);if(!r)return Rf=void 0,e.toPrecision(t);var n=r[0],a=r[1],o=a-(Rf=Math.max(-8,Math.min(8,Math.floor(a/3)))*3)+1,u=n.length;return o===u?n:o>u?n+new Array(o-u+1).join("0"):o>0?n.slice(0,o)+"."+n.slice(o):"0."+new Array(1-o).join("0")+Df(e,Math.max(0,t+o-1))[0]}function qj(e,t){var r=Df(e,t);if(!r)return e+"";var n=r[0],a=r[1];return a<0?"0."+new Array(-a).join("0")+n:n.length>a+1?n.slice(0,a+1)+"."+n.slice(a+1):n+new Array(a-n.length+2).join("0")}const Qj={"%":(e,t)=>(e*100).toFixed(t),b:e=>Math.round(e).toString(2),c:e=>e+"",d:L9,e:(e,t)=>e.toExponential(t),f:(e,t)=>e.toFixed(t),g:(e,t)=>e.toPrecision(t),o:e=>Math.round(e).toString(8),p:(e,t)=>qj(e*100,t),r:qj,s:U9,X:e=>Math.round(e).toString(16).toUpperCase(),x:e=>Math.round(e).toString(16)};function Yj(e){return e}var Xj=Array.prototype.map,Zj=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function H9(e){var t=e.grouping===void 0||e.thousands===void 0?Yj:$9(Xj.call(e.grouping,Number),e.thousands+""),r=e.currency===void 0?"":e.currency[0]+"",n=e.currency===void 0?"":e.currency[1]+"",a=e.decimal===void 0?".":e.decimal+"",o=e.numerals===void 0?Yj:z9(Xj.call(e.numerals,String)),u=e.percent===void 0?"%":e.percent+"",c=e.minus===void 0?"−":e.minus+"",f=e.nan===void 0?"NaN":e.nan+"";function h(g,v){g=Mu(g);var b=g.fill,j=g.align,k=g.sign,S=g.symbol,N=g.zero,E=g.width,A=g.comma,P=g.precision,M=g.trim,O=g.type;O==="n"?(A=!0,O="g"):Qj[O]||(P===void 0&&(P=12),M=!0,O="g"),(N||b==="0"&&j==="=")&&(N=!0,b="0",j="=");var D=(v&&v.prefix!==void 0?v.prefix:"")+(S==="$"?r:S==="#"&&/[boxX]/.test(O)?"0"+O.toLowerCase():""),B=(S==="$"?n:/[%p]/.test(O)?u:"")+(v&&v.suffix!==void 0?v.suffix:""),F=Qj[O],z=/[defgprs%]/.test(O);P=P===void 0?6:/[gprs]/.test(O)?Math.max(1,Math.min(21,P)):Math.max(0,Math.min(20,P));function Y(U){var me=D,ue=B,ge,ie,oe;if(O==="c")ue=F(U)+ue,U="";else{U=+U;var X=U<0||1/U<0;if(U=isNaN(U)?f:F(Math.abs(U),P),M&&(U=B9(U)),X&&+U==0&&k!=="+"&&(X=!1),me=(X?k==="("?k:c:k==="-"||k==="("?"":k)+me,ue=(O==="s"&&!isNaN(U)&&Rf!==void 0?Zj[8+Rf/3]:"")+ue+(X&&k==="("?")":""),z){for(ge=-1,ie=U.length;++geoe||oe>57){ue=(oe===46?a+U.slice(ge+1):U.slice(ge))+ue,U=U.slice(0,ge);break}}}A&&!N&&(U=t(U,1/0));var re=me.length+U.length+ue.length,J=re>1)+me+U+ue+J.slice(re);break;default:U=J+me+U+ue;break}return o(U)}return Y.toString=function(){return g+""},Y}function m(g,v){var b=Math.max(-8,Math.min(8,Math.floor(zs(v)/3)))*3,j=Math.pow(10,-b),k=h((g=Mu(g),g.type="f",g),{suffix:Zj[8+b/3]});return function(S){return k(j*S)}}return{format:h,formatPrefix:m}}var Dd,h0,UA;W9({thousands:",",grouping:[3],currency:["$",""]});function W9(e){return Dd=H9(e),h0=Dd.format,UA=Dd.formatPrefix,Dd}function K9(e){return Math.max(0,-zs(Math.abs(e)))}function G9(e,t){return Math.max(0,Math.max(-8,Math.min(8,Math.floor(zs(t)/3)))*3-zs(Math.abs(e)))}function V9(e,t){return e=Math.abs(e),t=Math.abs(t)-e,Math.max(0,zs(t)-zs(e))+1}function HA(e,t,r,n){var a=Vv(e,t,r),o;switch(n=Mu(n??",f"),n.type){case"s":{var u=Math.max(Math.abs(e),Math.abs(t));return n.precision==null&&!isNaN(o=G9(a,u))&&(n.precision=o),UA(n,u)}case"":case"e":case"g":case"p":case"r":{n.precision==null&&!isNaN(o=V9(a,Math.max(Math.abs(e),Math.abs(t))))&&(n.precision=o-(n.type==="e"));break}case"f":case"%":{n.precision==null&&!isNaN(o=K9(a))&&(n.precision=o-(n.type==="%")*2);break}}return h0(n)}function va(e){var t=e.domain;return e.ticks=function(r){var n=t();return Kv(n[0],n[n.length-1],r??10)},e.tickFormat=function(r,n){var a=t();return HA(a[0],a[a.length-1],r??10,n)},e.nice=function(r){r==null&&(r=10);var n=t(),a=0,o=n.length-1,u=n[a],c=n[o],f,h,m=10;for(c0;){if(h=Gv(u,c,r),h===f)return n[a]=u,n[o]=c,t(n);if(h>0)u=Math.floor(u/h)*h,c=Math.ceil(c/h)*h;else if(h<0)u=Math.ceil(u*h)/h,c=Math.floor(c*h)/h;else break;f=h}return e},e}function WA(){var e=d0();return e.copy=function(){return Ju(e,WA())},tn.apply(e,arguments),va(e)}function KA(e){var t;function r(n){return n==null||isNaN(n=+n)?t:n}return r.invert=r,r.domain=r.range=function(n){return arguments.length?(e=Array.from(n,Tf),r):e.slice()},r.unknown=function(n){return arguments.length?(t=n,r):t},r.copy=function(){return KA(e).unknown(t)},e=arguments.length?Array.from(e,Tf):[0,1],va(r)}function GA(e,t){e=e.slice();var r=0,n=e.length-1,a=e[r],o=e[n],u;return oMath.pow(e,t)}function Z9(e){return e===Math.E?Math.log:e===10&&Math.log10||e===2&&Math.log2||(e=Math.log(e),t=>Math.log(t)/e)}function tS(e){return(t,r)=>-e(-t,r)}function m0(e){const t=e(Jj,eS),r=t.domain;let n=10,a,o;function u(){return a=Z9(n),o=X9(n),r()[0]<0?(a=tS(a),o=tS(o),e(q9,Q9)):e(Jj,eS),t}return t.base=function(c){return arguments.length?(n=+c,u()):n},t.domain=function(c){return arguments.length?(r(c),u()):r()},t.ticks=c=>{const f=r();let h=f[0],m=f[f.length-1];const g=m0){for(;v<=b;++v)for(j=1;jm)break;N.push(k)}}else for(;v<=b;++v)for(j=n-1;j>=1;--j)if(k=v>0?j/o(-v):j*o(v),!(km)break;N.push(k)}N.length*2{if(c==null&&(c=10),f==null&&(f=n===10?"s":","),typeof f!="function"&&(!(n%1)&&(f=Mu(f)).precision==null&&(f.trim=!0),f=h0(f)),c===1/0)return f;const h=Math.max(1,n*c/t.ticks().length);return m=>{let g=m/o(Math.round(a(m)));return g*nr(GA(r(),{floor:c=>o(Math.floor(a(c))),ceil:c=>o(Math.ceil(a(c)))})),t}function VA(){const e=m0(Bh()).domain([1,10]);return e.copy=()=>Ju(e,VA()).base(e.base()),tn.apply(e,arguments),e}function rS(e){return function(t){return Math.sign(t)*Math.log1p(Math.abs(t/e))}}function nS(e){return function(t){return Math.sign(t)*Math.expm1(Math.abs(t))*e}}function p0(e){var t=1,r=e(rS(t),nS(t));return r.constant=function(n){return arguments.length?e(rS(t=+n),nS(t)):t},va(r)}function qA(){var e=p0(Bh());return e.copy=function(){return Ju(e,qA()).constant(e.constant())},tn.apply(e,arguments)}function iS(e){return function(t){return t<0?-Math.pow(-t,e):Math.pow(t,e)}}function J9(e){return e<0?-Math.sqrt(-e):Math.sqrt(e)}function e7(e){return e<0?-e*e:e*e}function g0(e){var t=e(fr,fr),r=1;function n(){return r===1?e(fr,fr):r===.5?e(J9,e7):e(iS(r),iS(1/r))}return t.exponent=function(a){return arguments.length?(r=+a,n()):r},va(t)}function v0(){var e=g0(Bh());return e.copy=function(){return Ju(e,v0()).exponent(e.exponent())},tn.apply(e,arguments),e}function t7(){return v0.apply(null,arguments).exponent(.5)}function aS(e){return Math.sign(e)*e*e}function r7(e){return Math.sign(e)*Math.sqrt(Math.abs(e))}function QA(){var e=d0(),t=[0,1],r=!1,n;function a(o){var u=r7(e(o));return isNaN(u)?n:r?Math.round(u):u}return a.invert=function(o){return e.invert(aS(o))},a.domain=function(o){return arguments.length?(e.domain(o),a):e.domain()},a.range=function(o){return arguments.length?(e.range((t=Array.from(o,Tf)).map(aS)),a):t.slice()},a.rangeRound=function(o){return a.range(o).round(!0)},a.round=function(o){return arguments.length?(r=!!o,a):r},a.clamp=function(o){return arguments.length?(e.clamp(o),a):e.clamp()},a.unknown=function(o){return arguments.length?(n=o,a):n},a.copy=function(){return QA(e.domain(),t).round(r).clamp(e.clamp()).unknown(n)},tn.apply(a,arguments),va(a)}function YA(){var e=[],t=[],r=[],n;function a(){var u=0,c=Math.max(1,t.length);for(r=new Array(c-1);++u0?r[c-1]:e[0],c=r?[n[r-1],t]:[n[h-1],n[h]]},u.unknown=function(f){return arguments.length&&(o=f),u},u.thresholds=function(){return n.slice()},u.copy=function(){return XA().domain([e,t]).range(a).unknown(o)},tn.apply(va(u),arguments)}function ZA(){var e=[.5],t=[0,1],r,n=1;function a(o){return o!=null&&o<=o?t[Xu(e,o,0,n)]:r}return a.domain=function(o){return arguments.length?(e=Array.from(o),n=Math.min(e.length,t.length-1),a):e.slice()},a.range=function(o){return arguments.length?(t=Array.from(o),n=Math.min(e.length,t.length-1),a):t.slice()},a.invertExtent=function(o){var u=t.indexOf(o);return[e[u-1],e[u]]},a.unknown=function(o){return arguments.length?(r=o,a):r},a.copy=function(){return ZA().domain(e).range(t).unknown(r)},tn.apply(a,arguments)}const Sg=new Date,Ng=new Date;function Pt(e,t,r,n){function a(o){return e(o=arguments.length===0?new Date:new Date(+o)),o}return a.floor=o=>(e(o=new Date(+o)),o),a.ceil=o=>(e(o=new Date(o-1)),t(o,1),e(o),o),a.round=o=>{const u=a(o),c=a.ceil(o);return o-u(t(o=new Date(+o),u==null?1:Math.floor(u)),o),a.range=(o,u,c)=>{const f=[];if(o=a.ceil(o),c=c==null?1:Math.floor(c),!(o0))return f;let h;do f.push(h=new Date(+o)),t(o,c),e(o);while(hPt(u=>{if(u>=u)for(;e(u),!o(u);)u.setTime(u-1)},(u,c)=>{if(u>=u)if(c<0)for(;++c<=0;)for(;t(u,-1),!o(u););else for(;--c>=0;)for(;t(u,1),!o(u););}),r&&(a.count=(o,u)=>(Sg.setTime(+o),Ng.setTime(+u),e(Sg),e(Ng),Math.floor(r(Sg,Ng))),a.every=o=>(o=Math.floor(o),!isFinite(o)||!(o>0)?null:o>1?a.filter(n?u=>n(u)%o===0:u=>a.count(0,u)%o===0):a)),a}const Lf=Pt(()=>{},(e,t)=>{e.setTime(+e+t)},(e,t)=>t-e);Lf.every=e=>(e=Math.floor(e),!isFinite(e)||!(e>0)?null:e>1?Pt(t=>{t.setTime(Math.floor(t/e)*e)},(t,r)=>{t.setTime(+t+r*e)},(t,r)=>(r-t)/e):Lf);Lf.range;const ui=1e3,Yr=ui*60,ci=Yr*60,gi=ci*24,y0=gi*7,oS=gi*30,Eg=gi*365,Va=Pt(e=>{e.setTime(e-e.getMilliseconds())},(e,t)=>{e.setTime(+e+t*ui)},(e,t)=>(t-e)/ui,e=>e.getUTCSeconds());Va.range;const x0=Pt(e=>{e.setTime(e-e.getMilliseconds()-e.getSeconds()*ui)},(e,t)=>{e.setTime(+e+t*Yr)},(e,t)=>(t-e)/Yr,e=>e.getMinutes());x0.range;const b0=Pt(e=>{e.setUTCSeconds(0,0)},(e,t)=>{e.setTime(+e+t*Yr)},(e,t)=>(t-e)/Yr,e=>e.getUTCMinutes());b0.range;const w0=Pt(e=>{e.setTime(e-e.getMilliseconds()-e.getSeconds()*ui-e.getMinutes()*Yr)},(e,t)=>{e.setTime(+e+t*ci)},(e,t)=>(t-e)/ci,e=>e.getHours());w0.range;const k0=Pt(e=>{e.setUTCMinutes(0,0,0)},(e,t)=>{e.setTime(+e+t*ci)},(e,t)=>(t-e)/ci,e=>e.getUTCHours());k0.range;const ec=Pt(e=>e.setHours(0,0,0,0),(e,t)=>e.setDate(e.getDate()+t),(e,t)=>(t-e-(t.getTimezoneOffset()-e.getTimezoneOffset())*Yr)/gi,e=>e.getDate()-1);ec.range;const Uh=Pt(e=>{e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCDate(e.getUTCDate()+t)},(e,t)=>(t-e)/gi,e=>e.getUTCDate()-1);Uh.range;const JA=Pt(e=>{e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCDate(e.getUTCDate()+t)},(e,t)=>(t-e)/gi,e=>Math.floor(e/gi));JA.range;function ko(e){return Pt(t=>{t.setDate(t.getDate()-(t.getDay()+7-e)%7),t.setHours(0,0,0,0)},(t,r)=>{t.setDate(t.getDate()+r*7)},(t,r)=>(r-t-(r.getTimezoneOffset()-t.getTimezoneOffset())*Yr)/y0)}const Hh=ko(0),$f=ko(1),n7=ko(2),i7=ko(3),Fs=ko(4),a7=ko(5),o7=ko(6);Hh.range;$f.range;n7.range;i7.range;Fs.range;a7.range;o7.range;function jo(e){return Pt(t=>{t.setUTCDate(t.getUTCDate()-(t.getUTCDay()+7-e)%7),t.setUTCHours(0,0,0,0)},(t,r)=>{t.setUTCDate(t.getUTCDate()+r*7)},(t,r)=>(r-t)/y0)}const Wh=jo(0),zf=jo(1),s7=jo(2),l7=jo(3),Bs=jo(4),u7=jo(5),c7=jo(6);Wh.range;zf.range;s7.range;l7.range;Bs.range;u7.range;c7.range;const j0=Pt(e=>{e.setDate(1),e.setHours(0,0,0,0)},(e,t)=>{e.setMonth(e.getMonth()+t)},(e,t)=>t.getMonth()-e.getMonth()+(t.getFullYear()-e.getFullYear())*12,e=>e.getMonth());j0.range;const S0=Pt(e=>{e.setUTCDate(1),e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCMonth(e.getUTCMonth()+t)},(e,t)=>t.getUTCMonth()-e.getUTCMonth()+(t.getUTCFullYear()-e.getUTCFullYear())*12,e=>e.getUTCMonth());S0.range;const vi=Pt(e=>{e.setMonth(0,1),e.setHours(0,0,0,0)},(e,t)=>{e.setFullYear(e.getFullYear()+t)},(e,t)=>t.getFullYear()-e.getFullYear(),e=>e.getFullYear());vi.every=e=>!isFinite(e=Math.floor(e))||!(e>0)?null:Pt(t=>{t.setFullYear(Math.floor(t.getFullYear()/e)*e),t.setMonth(0,1),t.setHours(0,0,0,0)},(t,r)=>{t.setFullYear(t.getFullYear()+r*e)});vi.range;const yi=Pt(e=>{e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCFullYear(e.getUTCFullYear()+t)},(e,t)=>t.getUTCFullYear()-e.getUTCFullYear(),e=>e.getUTCFullYear());yi.every=e=>!isFinite(e=Math.floor(e))||!(e>0)?null:Pt(t=>{t.setUTCFullYear(Math.floor(t.getUTCFullYear()/e)*e),t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)},(t,r)=>{t.setUTCFullYear(t.getUTCFullYear()+r*e)});yi.range;function eC(e,t,r,n,a,o){const u=[[Va,1,ui],[Va,5,5*ui],[Va,15,15*ui],[Va,30,30*ui],[o,1,Yr],[o,5,5*Yr],[o,15,15*Yr],[o,30,30*Yr],[a,1,ci],[a,3,3*ci],[a,6,6*ci],[a,12,12*ci],[n,1,gi],[n,2,2*gi],[r,1,y0],[t,1,oS],[t,3,3*oS],[e,1,Eg]];function c(h,m,g){const v=mS).right(u,v);if(b===u.length)return e.every(Vv(h/Eg,m/Eg,g));if(b===0)return Lf.every(Math.max(Vv(h,m,g),1));const[j,k]=u[v/u[b-1][2]53)return null;"w"in le||(le.w=1),"Z"in le?(Be=Cg(Jl(le.y,0,1)),Oe=Be.getUTCDay(),Be=Oe>4||Oe===0?zf.ceil(Be):zf(Be),Be=Uh.offset(Be,(le.V-1)*7),le.y=Be.getUTCFullYear(),le.m=Be.getUTCMonth(),le.d=Be.getUTCDate()+(le.w+6)%7):(Be=Ag(Jl(le.y,0,1)),Oe=Be.getDay(),Be=Oe>4||Oe===0?$f.ceil(Be):$f(Be),Be=ec.offset(Be,(le.V-1)*7),le.y=Be.getFullYear(),le.m=Be.getMonth(),le.d=Be.getDate()+(le.w+6)%7)}else("W"in le||"U"in le)&&("w"in le||(le.w="u"in le?le.u%7:"W"in le?1:0),Oe="Z"in le?Cg(Jl(le.y,0,1)).getUTCDay():Ag(Jl(le.y,0,1)).getDay(),le.m=0,le.d="W"in le?(le.w+6)%7+le.W*7-(Oe+5)%7:le.w+le.U*7-(Oe+6)%7);return"Z"in le?(le.H+=le.Z/100|0,le.M+=le.Z%100,Cg(le)):Ag(le)}}function B(ne,we,_e,le){for(var Ze=0,Be=we.length,Oe=_e.length,yt,Xt;Ze=Oe)return-1;if(yt=we.charCodeAt(Ze++),yt===37){if(yt=we.charAt(Ze++),Xt=M[yt in sS?we.charAt(Ze++):yt],!Xt||(le=Xt(ne,_e,le))<0)return-1}else if(yt!=_e.charCodeAt(le++))return-1}return le}function F(ne,we,_e){var le=h.exec(we.slice(_e));return le?(ne.p=m.get(le[0].toLowerCase()),_e+le[0].length):-1}function z(ne,we,_e){var le=b.exec(we.slice(_e));return le?(ne.w=j.get(le[0].toLowerCase()),_e+le[0].length):-1}function Y(ne,we,_e){var le=g.exec(we.slice(_e));return le?(ne.w=v.get(le[0].toLowerCase()),_e+le[0].length):-1}function U(ne,we,_e){var le=N.exec(we.slice(_e));return le?(ne.m=E.get(le[0].toLowerCase()),_e+le[0].length):-1}function me(ne,we,_e){var le=k.exec(we.slice(_e));return le?(ne.m=S.get(le[0].toLowerCase()),_e+le[0].length):-1}function ue(ne,we,_e){return B(ne,t,we,_e)}function ge(ne,we,_e){return B(ne,r,we,_e)}function ie(ne,we,_e){return B(ne,n,we,_e)}function oe(ne){return u[ne.getDay()]}function X(ne){return o[ne.getDay()]}function re(ne){return f[ne.getMonth()]}function J(ne){return c[ne.getMonth()]}function I(ne){return a[+(ne.getHours()>=12)]}function _(ne){return 1+~~(ne.getMonth()/3)}function W(ne){return u[ne.getUTCDay()]}function ee(ne){return o[ne.getUTCDay()]}function Z(ne){return f[ne.getUTCMonth()]}function he(ne){return c[ne.getUTCMonth()]}function pe(ne){return a[+(ne.getUTCHours()>=12)]}function Pe(ne){return 1+~~(ne.getUTCMonth()/3)}return{format:function(ne){var we=O(ne+="",A);return we.toString=function(){return ne},we},parse:function(ne){var we=D(ne+="",!1);return we.toString=function(){return ne},we},utcFormat:function(ne){var we=O(ne+="",P);return we.toString=function(){return ne},we},utcParse:function(ne){var we=D(ne+="",!0);return we.toString=function(){return ne},we}}}var sS={"-":"",_:" ",0:"0"},Ft=/^\s*\d+/,g7=/^%/,v7=/[\\^$*+?|[\]().{}]/g;function Ye(e,t,r){var n=e<0?"-":"",a=(n?-e:e)+"",o=a.length;return n+(o[t.toLowerCase(),r]))}function x7(e,t,r){var n=Ft.exec(t.slice(r,r+1));return n?(e.w=+n[0],r+n[0].length):-1}function b7(e,t,r){var n=Ft.exec(t.slice(r,r+1));return n?(e.u=+n[0],r+n[0].length):-1}function w7(e,t,r){var n=Ft.exec(t.slice(r,r+2));return n?(e.U=+n[0],r+n[0].length):-1}function k7(e,t,r){var n=Ft.exec(t.slice(r,r+2));return n?(e.V=+n[0],r+n[0].length):-1}function j7(e,t,r){var n=Ft.exec(t.slice(r,r+2));return n?(e.W=+n[0],r+n[0].length):-1}function lS(e,t,r){var n=Ft.exec(t.slice(r,r+4));return n?(e.y=+n[0],r+n[0].length):-1}function uS(e,t,r){var n=Ft.exec(t.slice(r,r+2));return n?(e.y=+n[0]+(+n[0]>68?1900:2e3),r+n[0].length):-1}function S7(e,t,r){var n=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(t.slice(r,r+6));return n?(e.Z=n[1]?0:-(n[2]+(n[3]||"00")),r+n[0].length):-1}function N7(e,t,r){var n=Ft.exec(t.slice(r,r+1));return n?(e.q=n[0]*3-3,r+n[0].length):-1}function E7(e,t,r){var n=Ft.exec(t.slice(r,r+2));return n?(e.m=n[0]-1,r+n[0].length):-1}function cS(e,t,r){var n=Ft.exec(t.slice(r,r+2));return n?(e.d=+n[0],r+n[0].length):-1}function A7(e,t,r){var n=Ft.exec(t.slice(r,r+3));return n?(e.m=0,e.d=+n[0],r+n[0].length):-1}function dS(e,t,r){var n=Ft.exec(t.slice(r,r+2));return n?(e.H=+n[0],r+n[0].length):-1}function C7(e,t,r){var n=Ft.exec(t.slice(r,r+2));return n?(e.M=+n[0],r+n[0].length):-1}function P7(e,t,r){var n=Ft.exec(t.slice(r,r+2));return n?(e.S=+n[0],r+n[0].length):-1}function O7(e,t,r){var n=Ft.exec(t.slice(r,r+3));return n?(e.L=+n[0],r+n[0].length):-1}function _7(e,t,r){var n=Ft.exec(t.slice(r,r+6));return n?(e.L=Math.floor(n[0]/1e3),r+n[0].length):-1}function M7(e,t,r){var n=g7.exec(t.slice(r,r+1));return n?r+n[0].length:-1}function I7(e,t,r){var n=Ft.exec(t.slice(r));return n?(e.Q=+n[0],r+n[0].length):-1}function T7(e,t,r){var n=Ft.exec(t.slice(r));return n?(e.s=+n[0],r+n[0].length):-1}function fS(e,t){return Ye(e.getDate(),t,2)}function D7(e,t){return Ye(e.getHours(),t,2)}function R7(e,t){return Ye(e.getHours()%12||12,t,2)}function L7(e,t){return Ye(1+ec.count(vi(e),e),t,3)}function tC(e,t){return Ye(e.getMilliseconds(),t,3)}function $7(e,t){return tC(e,t)+"000"}function z7(e,t){return Ye(e.getMonth()+1,t,2)}function F7(e,t){return Ye(e.getMinutes(),t,2)}function B7(e,t){return Ye(e.getSeconds(),t,2)}function U7(e){var t=e.getDay();return t===0?7:t}function H7(e,t){return Ye(Hh.count(vi(e)-1,e),t,2)}function rC(e){var t=e.getDay();return t>=4||t===0?Fs(e):Fs.ceil(e)}function W7(e,t){return e=rC(e),Ye(Fs.count(vi(e),e)+(vi(e).getDay()===4),t,2)}function K7(e){return e.getDay()}function G7(e,t){return Ye($f.count(vi(e)-1,e),t,2)}function V7(e,t){return Ye(e.getFullYear()%100,t,2)}function q7(e,t){return e=rC(e),Ye(e.getFullYear()%100,t,2)}function Q7(e,t){return Ye(e.getFullYear()%1e4,t,4)}function Y7(e,t){var r=e.getDay();return e=r>=4||r===0?Fs(e):Fs.ceil(e),Ye(e.getFullYear()%1e4,t,4)}function X7(e){var t=e.getTimezoneOffset();return(t>0?"-":(t*=-1,"+"))+Ye(t/60|0,"0",2)+Ye(t%60,"0",2)}function hS(e,t){return Ye(e.getUTCDate(),t,2)}function Z7(e,t){return Ye(e.getUTCHours(),t,2)}function J7(e,t){return Ye(e.getUTCHours()%12||12,t,2)}function eB(e,t){return Ye(1+Uh.count(yi(e),e),t,3)}function nC(e,t){return Ye(e.getUTCMilliseconds(),t,3)}function tB(e,t){return nC(e,t)+"000"}function rB(e,t){return Ye(e.getUTCMonth()+1,t,2)}function nB(e,t){return Ye(e.getUTCMinutes(),t,2)}function iB(e,t){return Ye(e.getUTCSeconds(),t,2)}function aB(e){var t=e.getUTCDay();return t===0?7:t}function oB(e,t){return Ye(Wh.count(yi(e)-1,e),t,2)}function iC(e){var t=e.getUTCDay();return t>=4||t===0?Bs(e):Bs.ceil(e)}function sB(e,t){return e=iC(e),Ye(Bs.count(yi(e),e)+(yi(e).getUTCDay()===4),t,2)}function lB(e){return e.getUTCDay()}function uB(e,t){return Ye(zf.count(yi(e)-1,e),t,2)}function cB(e,t){return Ye(e.getUTCFullYear()%100,t,2)}function dB(e,t){return e=iC(e),Ye(e.getUTCFullYear()%100,t,2)}function fB(e,t){return Ye(e.getUTCFullYear()%1e4,t,4)}function hB(e,t){var r=e.getUTCDay();return e=r>=4||r===0?Bs(e):Bs.ceil(e),Ye(e.getUTCFullYear()%1e4,t,4)}function mB(){return"+0000"}function mS(){return"%"}function pS(e){return+e}function gS(e){return Math.floor(+e/1e3)}var rs,aC,oC;pB({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});function pB(e){return rs=p7(e),aC=rs.format,rs.parse,oC=rs.utcFormat,rs.utcParse,rs}function gB(e){return new Date(e)}function vB(e){return e instanceof Date?+e:+new Date(+e)}function N0(e,t,r,n,a,o,u,c,f,h){var m=d0(),g=m.invert,v=m.domain,b=h(".%L"),j=h(":%S"),k=h("%I:%M"),S=h("%I %p"),N=h("%a %d"),E=h("%b %d"),A=h("%B"),P=h("%Y");function M(O){return(f(O)t(a/(e.length-1)))},r.quantiles=function(n){return Array.from({length:n+1},(a,o)=>a9(e,o/n))},r.copy=function(){return cC(t).domain(e)},ki.apply(r,arguments)}function Gh(){var e=0,t=.5,r=1,n=1,a,o,u,c,f,h=fr,m,g=!1,v;function b(k){return isNaN(k=+k)?v:(k=.5+((k=+m(k))-o)*(n*k{if(e!=null){var n=e.scale,a=e.type;if(n==="auto")return a==="category"&&r&&(r.indexOf("LineChart")>=0||r.indexOf("AreaChart")>=0||r.indexOf("ComposedChart")>=0&&!t)?"point":a==="category"?"band":"linear";if(typeof n=="string")return SB(n)?n:"point"}};function NB(e,t){for(var r=0,n=e.length,a=e[0]t)?r=o+1:n=o}return r}function gC(e,t){if(e){var r=t??e.domain(),n=r.map(o=>{var u;return(u=e(o))!==null&&u!==void 0?u:0}),a=e.range();if(!(r.length===0||a.length<2))return o=>{var u,c,f=NB(n,o);if(f<=0)return r[0];if(f>=r.length)return r[r.length-1];var h=(u=n[f-1])!==null&&u!==void 0?u:0,m=(c=n[f])!==null&&c!==void 0?c:0;return Math.abs(o-h)<=Math.abs(o-m)?r[f-1]:r[f]}}}function EB(e){if(e!=null)return"invert"in e&&typeof e.invert=="function"?e.invert.bind(e):gC(e,void 0)}function yS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function Ff(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);re.cartesianAxis.xAxis[t],ji=(e,t)=>{var r=yC(e,t);return r??At},Ct={allowDataOverflow:!1,allowDecimals:!0,allowDuplicatedCategory:!0,angle:0,dataKey:void 0,domain:Zv,hide:!0,id:0,includeHidden:!1,interval:"preserveEnd",minTickGap:5,mirror:!1,name:void 0,orientation:"left",padding:{top:0,bottom:0},reversed:!1,scale:"auto",tick:!0,tickCount:5,tickFormatter:void 0,ticks:void 0,type:"number",unit:void 0,niceTicks:"auto",width:Gu},xC=(e,t)=>e.cartesianAxis.yAxis[t],Si=(e,t)=>{var r=xC(e,t);return r??Ct},TB={domain:[0,"auto"],includeHidden:!1,reversed:!1,allowDataOverflow:!1,allowDuplicatedCategory:!1,dataKey:void 0,id:0,name:"",range:[64,64],scale:"auto",type:"number",unit:""},P0=(e,t)=>{var r=e.cartesianAxis.zAxis[t];return r??TB},mr=(e,t,r)=>{switch(t){case"xAxis":return ji(e,r);case"yAxis":return Si(e,r);case"zAxis":return P0(e,r);case"angleAxis":return Jy(e,r);case"radiusAxis":return e0(e,r);default:throw new Error("Unexpected axis type: ".concat(t))}},DB=(e,t,r)=>{switch(t){case"xAxis":return ji(e,r);case"yAxis":return Si(e,r);default:throw new Error("Unexpected axis type: ".concat(t))}},tc=(e,t,r)=>{switch(t){case"xAxis":return ji(e,r);case"yAxis":return Si(e,r);case"angleAxis":return Jy(e,r);case"radiusAxis":return e0(e,r);default:throw new Error("Unexpected axis type: ".concat(t))}},bC=e=>e.graphicalItems.cartesianItems.some(t=>t.type==="bar")||e.graphicalItems.polarItems.some(t=>t.type==="radialBar");function wC(e,t){return r=>{switch(e){case"xAxis":return"xAxisId"in r&&r.xAxisId===t;case"yAxis":return"yAxisId"in r&&r.yAxisId===t;case"zAxis":return"zAxisId"in r&&r.zAxisId===t;case"angleAxis":return"angleAxisId"in r&&r.angleAxisId===t;case"radiusAxis":return"radiusAxisId"in r&&r.radiusAxisId===t;default:return!1}}}var kC=e=>e.graphicalItems.cartesianItems,RB=V([$t,$h],wC),jC=(e,t,r)=>e.filter(r).filter(n=>(t==null?void 0:t.includeHidden)===!0?!0:!n.hide),el=V([kC,mr,RB],jC,{memoizeOptions:{resultEqualityCheck:Fh}}),SC=V([el],e=>e.filter(t=>t.type==="area"||t.type==="bar").filter(n0)),NC=e=>e.filter(t=>!("stackId"in t)||t.stackId===void 0),LB=V([el],NC),EC=e=>e.map(t=>t.data).filter(Boolean).flat(1),$B=V([el],e=>e.some(t=>!t.data)),AC=V([el],EC,{memoizeOptions:{resultEqualityCheck:Fh}}),CC=(e,t)=>{var r=t.chartData,n=r===void 0?[]:r,a=t.dataStartIndex,o=t.dataEndIndex;return e.length>0?e:n.slice(a,o+1)},O0=V([AC,Ih],CC),zB=(e,t,r)=>(t==null?void 0:t.dataKey)!=null?e.map(n=>({value:Rt(n,t.dataKey)})):r.length>0?r.map(n=>n.dataKey).flatMap(n=>e.map(a=>({value:Rt(a,n)}))):e.map(n=>({value:n})),PC=(e,t,r,n,a,o)=>{var u=n.chartData,c=u===void 0?[]:u,f=n.dataStartIndex,h=n.dataEndIndex,m=zB(e,t,r);if(a&&(t==null?void 0:t.dataKey)!=null&&o.length>0){var g=c.slice(f,h+1),v=g.map(b=>({value:Rt(b,t.dataKey)})).filter(b=>b.value!=null);return[...v,...m]}return m},rc=V([O0,mr,el,Ih,$B,AC],PC);function vs(e){if(Bn(e)||e instanceof Date){var t=Number(e);if(He(t))return t}}function bS(e){if(Array.isArray(e)){var t=[vs(e[0]),vs(e[1])];return Rn(t)?t:void 0}var r=vs(e);if(r!=null)return[r,r]}function Wn(e){return e.map(vs).filter(jr)}function FB(e,t){var r=vs(e),n=vs(t);return r==null&&n==null?0:r==null?-1:n==null?1:r-n}var BB=V([rc],e=>e==null?void 0:e.map(t=>t.value).sort(FB));function OC(e,t){switch(e){case"xAxis":return t.direction==="x";case"yAxis":return t.direction==="y";default:return!1}}function UB(e,t,r){if(!r)return[];if(!r.length)return[];var n;if(typeof t=="number"&&!Fn(t))n=t;else if(Array.isArray(t)){var a=Wn(t);a.length>0&&(n=Math.max(...a))}return n==null?[]:Wn(r.flatMap(o=>{var u=Rt(e,o.dataKey),c,f;if(Array.isArray(u)){var h=vC(u,2);c=h[0],f=h[1]}else c=f=u;if(!(!He(c)||!He(f)))return[n-c,n+f]}))}var Ot=e=>{var t=zt(e),r=Zs(e);return tc(e,t,r)},Us=V([Ot],e=>e==null?void 0:e.dataKey),HB=V([SC,Ih,Ot],TA),_C=(e,t,r,n)=>{var a={},o=t.reduce((u,c)=>{if(c.stackId==null)return u;var f=u[c.stackId];return f==null&&(f=[]),f.push(c),u[c.stackId]=f,u},a);return Object.fromEntries(Object.entries(o).map(u=>{var c=vC(u,2),f=c[0],h=c[1],m=n?[...h].reverse():h,g=m.map(r0);return[f,{stackedData:sz(e,g,r),graphicalItems:m}]}))},MC=V([HB,SC,Th,AA],_C),IC=(e,t,r,n)=>{var a=t.dataStartIndex,o=t.dataEndIndex;if(n==null&&r!=="zAxis")return dz(e,a,o)},WB=V([mr],e=>e.allowDataOverflow),_0=e=>{var t;if(e==null||!("domain"in e))return Zv;if(e.domain!=null)return e.domain;if("ticks"in e&&e.ticks!=null){if(e.type==="number"){var r=Wn(e.ticks);return[Math.min(...r),Math.max(...r)]}if(e.type==="category")return e.ticks.map(String)}return(t=e==null?void 0:e.domain)!==null&&t!==void 0?t:Zv},TC=V([mr],_0),DC=V([TC,WB],gA),KB=V([MC,bn,$t,DC],IC,{memoizeOptions:{resultEqualityCheck:zh}}),M0=e=>e.errorBars,GB=(e,t,r)=>e.flatMap(n=>t[n.id]).filter(Boolean).filter(n=>OC(r,n)),Bf=function(){for(var t=arguments.length,r=new Array(t),n=0;n5&&arguments[5]!==void 0?arguments[5]:[],c,f;if(n.length>0&&n.forEach(h=>{var m,g=h.data!=null?[...h.data]:u,v=(m=a[h.id])===null||m===void 0?void 0:m.filter(b=>OC(o,b));g.forEach(b=>{var j,k=Rt(b,(j=r.dataKey)!==null&&j!==void 0?j:h.dataKey),S=UB(b,k,v);if(S.length>=2){var N=Math.min(...S),E=Math.max(...S);(c==null||Nf)&&(f=E)}var A=bS(k);A!=null&&(c=c==null?A[0]:Math.min(c,A[0]),f=f==null?A[1]:Math.max(f,A[1]))})}),(r==null?void 0:r.dataKey)!=null&&n.length===0&&t.forEach(h=>{var m=bS(Rt(h,r.dataKey));m!=null&&(c=c==null?m[0]:Math.min(c,m[0]),f=f==null?m[1]:Math.max(f,m[1]))}),He(c)&&He(f))return[c,f]},VB=V([O0,mr,LB,M0,$t,jF],RC,{memoizeOptions:{resultEqualityCheck:zh}});function qB(e){var t=e.value;if(Bn(t)||t instanceof Date)return t}var QB=(e,t,r)=>{var n=e.map(qB).filter(a=>a!=null);return r&&(t.dataKey==null||t.allowDuplicatedCategory&&VE(n))?pA(0,e.length):t.allowDuplicatedCategory?n:Array.from(new Set(n))},LC=e=>e.referenceElements.dots,tl=(e,t,r)=>e.filter(n=>n.ifOverflow==="extendDomain").filter(n=>t==="xAxis"?n.xAxisId===r:n.yAxisId===r),YB=V([LC,$t,$h],tl),$C=e=>e.referenceElements.areas,XB=V([$C,$t,$h],tl),zC=e=>e.referenceElements.lines,ZB=V([zC,$t,$h],tl),FC=(e,t)=>{if(e!=null){var r=Wn(e.map(n=>t==="xAxis"?n.x:n.y));if(r.length!==0)return[Math.min(...r),Math.max(...r)]}},JB=V(YB,$t,FC),BC=(e,t)=>{if(e!=null){var r=Wn(e.flatMap(n=>[t==="xAxis"?n.x1:n.y1,t==="xAxis"?n.x2:n.y2]));if(r.length!==0)return[Math.min(...r),Math.max(...r)]}},eU=V([XB,$t],BC);function tU(e){var t;if(e.x!=null)return Wn([e.x]);var r=(t=e.segment)===null||t===void 0?void 0:t.map(n=>n.x);return r==null||r.length===0?[]:Wn(r)}function rU(e){var t;if(e.y!=null)return Wn([e.y]);var r=(t=e.segment)===null||t===void 0?void 0:t.map(n=>n.y);return r==null||r.length===0?[]:Wn(r)}var UC=(e,t)=>{if(e!=null){var r=e.flatMap(n=>t==="xAxis"?tU(n):rU(n));if(r.length!==0)return[Math.min(...r),Math.max(...r)]}},nU=V([ZB,$t],UC),iU=V(JB,nU,eU,(e,t,r)=>Bf(e,r,t)),HC=(e,t,r,n,a,o,u,c)=>{if(r!=null)return r;var f=u==="vertical"&&c==="xAxis"||u==="horizontal"&&c==="yAxis",h=f?Bf(n,o,a):Bf(o,a);return PF(t,h,e.allowDataOverflow)},aU=V([mr,TC,DC,KB,VB,iU,dt,$t],HC,{memoizeOptions:{resultEqualityCheck:zh}}),oU=[0,1],WC=(e,t,r,n,a,o,u)=>{if(!((e==null||r==null||r.length===0)&&u===void 0)){var c=e.dataKey,f=e.type,h=Gn(t,o);if(h&&c==null){var m;return pA(0,(m=r==null?void 0:r.length)!==null&&m!==void 0?m:0)}return f==="category"?QB(n,e,h):a==="expand"&&!h?oU:u}},I0=V([mr,dt,O0,rc,Th,$t,aU],WC),rl=V([mr,bC,Yy],pC),KC=(e,t,r)=>{var n=t.niceTicks;if(n!=="none"){var a=_0(t),o=Array.isArray(a)&&(a[0]==="auto"||a[1]==="auto");if((n==="snap125"||n==="adaptive")&&t!=null&&t.tickCount&&Rn(e)){if(o)return Pj(e,t.tickCount,t.allowDecimals,n);if(t.type==="number")return Oj(e,t.tickCount,t.allowDecimals,n)}if(n==="auto"&&r==="linear"&&t!=null&&t.tickCount){if(o&&Rn(e))return Pj(e,t.tickCount,t.allowDecimals,"adaptive");if(t.type==="number"&&Rn(e))return Oj(e,t.tickCount,t.allowDecimals,"adaptive")}}},T0=V([I0,tc,rl],KC),GC=(e,t,r,n)=>{if(n!=="angleAxis"&&(e==null?void 0:e.type)==="number"&&Rn(t)&&Array.isArray(r)&&r.length>0){var a,o,u=t[0],c=(a=r[0])!==null&&a!==void 0?a:0,f=t[1],h=(o=r[r.length-1])!==null&&o!==void 0?o:0;return[Math.min(u,c),Math.max(f,h)]}return t},sU=V([mr,I0,T0,$t],GC),lU=V(rc,mr,(e,t)=>{if(!(!t||t.type!=="number")){var r=1/0,n=Array.from(Wn(e.map(g=>g.value))).sort((g,v)=>g-v),a=n[0],o=n[n.length-1];if(a==null||o==null)return 1/0;var u=o-a;if(u===0)return 1/0;for(var c=0;ca,(e,t,r,n,a)=>{if(!He(e))return 0;var o=t==="vertical"?n.height:n.width;if(a==="gap")return e*o/2;if(a==="no-gap"){var u=ga(r,e*o),c=e*o/2;return c-u-(c-u)/o*u}return 0}),uU=(e,t,r)=>{var n=ji(e,t);return n==null||typeof n.padding!="string"?0:VC(e,"xAxis",t,r,n.padding)},cU=(e,t,r)=>{var n=Si(e,t);return n==null||typeof n.padding!="string"?0:VC(e,"yAxis",t,r,n.padding)},dU=V(ji,uU,(e,t)=>{var r,n;if(e==null)return{left:0,right:0};var a=e.padding;return typeof a=="string"?{left:t,right:t}:{left:((r=a.left)!==null&&r!==void 0?r:0)+t,right:((n=a.right)!==null&&n!==void 0?n:0)+t}}),fU=V(Si,cU,(e,t)=>{var r,n;if(e==null)return{top:0,bottom:0};var a=e.padding;return typeof a=="string"?{top:t,bottom:t}:{top:((r=a.top)!==null&&r!==void 0?r:0)+t,bottom:((n=a.bottom)!==null&&n!==void 0?n:0)+t}}),qC=V([Yt,dU,Ah,Eh,(e,t,r)=>r],(e,t,r,n,a)=>{var o=n.padding;return a?[o.left,r.width-o.right]:[e.left+t.left,e.left+e.width-t.right]}),QC=V([Yt,dt,fU,Ah,Eh,(e,t,r)=>r],(e,t,r,n,a,o)=>{var u=a.padding;return o?[n.height-u.bottom,u.top]:t==="horizontal"?[e.top+e.height-r.bottom,e.top+r.top]:[e.top+r.top,e.top+e.height-r.bottom]}),nc=(e,t,r,n)=>{var a;switch(t){case"xAxis":return qC(e,r,n);case"yAxis":return QC(e,r,n);case"zAxis":return(a=P0(e,r))===null||a===void 0?void 0:a.range;case"angleAxis":return _A(e);case"radiusAxis":return MA(e,r);default:return}},YC=V([mr,nc],Dh),hU=V([rl,sU],VF),D0=V([mr,rl,hU,YC],C0),XC=(e,t,r,n)=>{if(!(r==null||r.dataKey==null)){var a=r.type,o=r.scale,u=Gn(e,n);if(u&&(a==="number"||o!=="auto"))return t.map(c=>c.value)}},R0=V([dt,rc,tc,$t],XC),Vh=V([D0],i0);V([D0],EB);V([D0,BB],gC);V([el,M0,$t],GB);function ZC(e,t){return e.idt.id?1:0}var qh=(e,t)=>t,Qh=(e,t,r)=>r,mU=V(Sh,qh,Qh,(e,t,r)=>e.filter(n=>n.orientation===t).filter(n=>n.mirror===r).sort(ZC)),pU=V(Nh,qh,Qh,(e,t,r)=>e.filter(n=>n.orientation===t).filter(n=>n.mirror===r).sort(ZC)),JC=(e,t)=>({width:e.width,height:t.height}),gU=(e,t)=>{var r=typeof t.width=="number"?t.width:Gu;return{width:r,height:e.height}},vU=V(Yt,ji,JC),yU=(e,t,r)=>{switch(t){case"top":return e.top;case"bottom":return r-e.bottom;default:return 0}},xU=(e,t,r)=>{switch(t){case"left":return e.left;case"right":return r-e.right;default:return 0}},bU=V(wi,Yt,mU,qh,Qh,(e,t,r,n,a)=>{var o={},u;return r.forEach(c=>{var f=JC(t,c);u==null&&(u=yU(t,n,e));var h=n==="top"&&!a||n==="bottom"&&a;o[c.id]=u-Number(h)*f.height,u+=(h?-1:1)*f.height}),o}),wU=V(bi,Yt,pU,qh,Qh,(e,t,r,n,a)=>{var o={},u;return r.forEach(c=>{var f=gU(t,c);u==null&&(u=xU(t,n,e));var h=n==="left"&&!a||n==="right"&&a;o[c.id]=u-Number(h)*f.width,u+=(h?-1:1)*f.width}),o}),kU=(e,t)=>{var r=ji(e,t);if(r!=null)return bU(e,r.orientation,r.mirror)},jU=V([Yt,ji,kU,(e,t)=>t],(e,t,r,n)=>{if(t!=null){var a=r==null?void 0:r[n];return a==null?{x:e.left,y:0}:{x:e.left,y:a}}}),SU=(e,t)=>{var r=Si(e,t);if(r!=null)return wU(e,r.orientation,r.mirror)},NU=V([Yt,Si,SU,(e,t)=>t],(e,t,r,n)=>{if(t!=null){var a=r==null?void 0:r[n];return a==null?{x:0,y:e.top}:{x:a,y:e.top}}}),EU=V(Yt,Si,(e,t)=>{var r=typeof t.width=="number"?t.width:Gu;return{width:r,height:e.height}}),eP=(e,t,r,n)=>{if(r!=null){var a=r.allowDuplicatedCategory,o=r.type,u=r.dataKey,c=Gn(e,n),f=t.map(m=>m.value),h=f.filter(m=>m!=null);if(u&&c&&o==="category"&&a&&VE(h))return f}},L0=V([dt,rc,mr,$t],eP),wS=V([dt,DB,rl,Vh,L0,R0,nc,T0,$t],(e,t,r,n,a,o,u,c,f)=>{if(t!=null){var h=Gn(e,f);return{angle:t.angle,interval:t.interval,minTickGap:t.minTickGap,orientation:t.orientation,tick:t.tick,tickCount:t.tickCount,tickFormatter:t.tickFormatter,ticks:t.ticks,type:t.type,unit:t.unit,axisType:f,categoricalDomain:o,duplicateDomain:a,isCategorical:h,niceTicks:c,range:u,realScaleType:r,scale:n}}}),AU=(e,t,r,n,a,o,u,c,f)=>{if(!(t==null||n==null)){var h=Gn(e,f),m=t.type,g=t.ticks,v=t.tickCount,b=r==="scaleBand"&&typeof n.bandwidth=="function"?n.bandwidth()/2:2,j=m==="category"&&n.bandwidth?n.bandwidth()/b:0;j=f==="angleAxis"&&o!=null&&o.length>=2?qr(o[0]-o[1])*2*j:j;var k=g||a;return k?k.map((S,N)=>{var E=u?u.indexOf(S):S,A=n.map(E);return He(A)?{index:N,coordinate:A+j,value:S,offset:j}:null}).filter(jr):h&&c?c.map((S,N)=>{var E=n.map(S);return He(E)?{coordinate:E+j,value:S,index:N,offset:j}:null}).filter(jr):n.ticks?n.ticks(v).map((S,N)=>{var E=n.map(S);return He(E)?{coordinate:E+j,value:S,index:N,offset:j}:null}).filter(jr):n.domain().map((S,N)=>{var E=n.map(S);return He(E)?{coordinate:E+j,value:u?u[S]:S,index:N,offset:j}:null}).filter(jr)}},tP=V([dt,tc,rl,Vh,T0,nc,L0,R0,$t],AU),CU=(e,t,r,n,a,o,u)=>{if(!(t==null||r==null||n==null||n[0]===n[1])){var c=Gn(e,u),f=t.tickCount,h=0;return h=u==="angleAxis"&&(n==null?void 0:n.length)>=2?qr(n[0]-n[1])*2*h:h,c&&o?o.map((m,g)=>{var v=r.map(m);return He(v)?{coordinate:v+h,value:m,index:g,offset:h}:null}).filter(jr):r.ticks?r.ticks(f).map((m,g)=>{var v=r.map(m);return He(v)?{coordinate:v+h,value:m,index:g,offset:h}:null}).filter(jr):r.domain().map((m,g)=>{var v=r.map(m);return He(v)?{coordinate:v+h,value:a?a[m]:m,index:g,offset:h}:null}).filter(jr)}},rP=V([dt,tc,Vh,nc,L0,R0,$t],CU),nP=V(mr,Vh,(e,t)=>{if(!(e==null||t==null))return Ff(Ff({},e),{},{scale:t})}),PU=V([mr,rl,I0,YC],C0),OU=V([PU],i0);V((e,t,r)=>P0(e,r),OU,(e,t)=>{if(!(e==null||t==null))return Ff(Ff({},e),{},{scale:t})});var _U=V([dt,Sh,Nh],(e,t,r)=>{switch(e){case"horizontal":return t.some(n=>n.reversed)?"right-to-left":"left-to-right";case"vertical":return r.some(n=>n.reversed)?"bottom-to-top":"top-to-bottom";case"centric":case"radial":return"left-to-right";default:return}}),MU=(e,t,r)=>{var n;return(n=e.renderedTicks[t])===null||n===void 0?void 0:n[r]};V([MU],e=>{if(!(!e||e.length===0))return t=>{var r,n=1/0,a=e[0];for(var o of e){var u=Math.abs(o.coordinate-t);ue.options.defaultTooltipEventType,aP=e=>e.options.validateTooltipEventTypes;function oP(e,t,r){if(e==null)return t;var n=e?"axis":"item";return r==null?t:r.includes(n)?n:t}function ic(e,t){var r=iP(e),n=aP(e);return oP(t,r,n)}function IU(e){return Me(t=>ic(t,e))}var sP=(e,t)=>{var r,n=Number(t);if(!(Fn(n)||t==null))return n>=0?e==null||(r=e[n])===null||r===void 0?void 0:r.value:void 0},TU=e=>e.tooltip.settings,ea={active:!1,index:null,dataKey:void 0,graphicalItemId:void 0,coordinate:void 0},DU={itemInteraction:{click:ea,hover:ea},axisInteraction:{click:ea,hover:ea},keyboardInteraction:ea,syncInteraction:{active:!1,index:null,dataKey:void 0,label:void 0,coordinate:void 0,sourceViewBox:void 0,graphicalItemId:void 0},tooltipItemPayloads:[],settings:{shared:void 0,trigger:"hover",axisId:0,active:!1,defaultIndex:void 0}},lP=sr({name:"tooltip",initialState:DU,reducers:{addTooltipEntrySettings:{reducer(e,t){e.tooltipItemPayloads.push(t.payload)},prepare:st()},replaceTooltipEntrySettings:{reducer(e,t){var r=t.payload,n=r.prev,a=r.next,o=Qr(e).tooltipItemPayloads.indexOf(n);o>-1&&(e.tooltipItemPayloads[o]=a)},prepare:st()},removeTooltipEntrySettings:{reducer(e,t){var r=Qr(e).tooltipItemPayloads.indexOf(t.payload);r>-1&&e.tooltipItemPayloads.splice(r,1)},prepare:st()},setTooltipSettingsState(e,t){e.settings=t.payload},setActiveMouseOverItemIndex(e,t){e.syncInteraction.active=!1,e.syncInteraction.sourceViewBox=void 0,e.keyboardInteraction.active=!1,e.itemInteraction.hover.active=!0,e.itemInteraction.hover.index=t.payload.activeIndex,e.itemInteraction.hover.dataKey=t.payload.activeDataKey,e.itemInteraction.hover.graphicalItemId=t.payload.activeGraphicalItemId,e.itemInteraction.hover.coordinate=t.payload.activeCoordinate},mouseLeaveChart(e){e.itemInteraction.hover.active=!1,e.axisInteraction.hover.active=!1},mouseLeaveItem(e){e.itemInteraction.hover.active=!1},setActiveClickItemIndex(e,t){e.syncInteraction.active=!1,e.syncInteraction.sourceViewBox=void 0,e.itemInteraction.click.active=!0,e.keyboardInteraction.active=!1,e.itemInteraction.click.index=t.payload.activeIndex,e.itemInteraction.click.dataKey=t.payload.activeDataKey,e.itemInteraction.click.graphicalItemId=t.payload.activeGraphicalItemId,e.itemInteraction.click.coordinate=t.payload.activeCoordinate},setMouseOverAxisIndex(e,t){e.syncInteraction.active=!1,e.syncInteraction.sourceViewBox=void 0,e.axisInteraction.hover.active=!0,e.keyboardInteraction.active=!1,e.axisInteraction.hover.index=t.payload.activeIndex,e.axisInteraction.hover.dataKey=t.payload.activeDataKey,e.axisInteraction.hover.coordinate=t.payload.activeCoordinate},setMouseClickAxisIndex(e,t){e.syncInteraction.active=!1,e.syncInteraction.sourceViewBox=void 0,e.keyboardInteraction.active=!1,e.axisInteraction.click.active=!0,e.axisInteraction.click.index=t.payload.activeIndex,e.axisInteraction.click.dataKey=t.payload.activeDataKey,e.axisInteraction.click.coordinate=t.payload.activeCoordinate},setSyncInteraction(e,t){e.syncInteraction=t.payload},setKeyboardInteraction(e,t){e.keyboardInteraction.active=t.payload.active,e.keyboardInteraction.index=t.payload.activeIndex,e.keyboardInteraction.coordinate=t.payload.activeCoordinate}}}),rn=lP.actions,RU=rn.addTooltipEntrySettings,LU=rn.replaceTooltipEntrySettings,$U=rn.removeTooltipEntrySettings,zU=rn.setTooltipSettingsState,FU=rn.setActiveMouseOverItemIndex;rn.mouseLeaveItem;var uP=rn.mouseLeaveChart;rn.setActiveClickItemIndex;var cP=rn.setMouseOverAxisIndex,BU=rn.setMouseClickAxisIndex,uu=rn.setSyncInteraction,Uf=rn.setKeyboardInteraction,UU=lP.reducer;function kS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function Rd(e){for(var t=1;t{if(t==null)return ea;var a=GU(e,t,r);if(a==null)return ea;if(a.active)return a;if(e.keyboardInteraction.active)return e.keyboardInteraction;if(e.syncInteraction.active&&e.syncInteraction.index!=null)return e.syncInteraction;var o=e.settings.active===!0;if(VU(a)){if(o)return Rd(Rd({},a),{},{active:!0})}else if(n!=null)return{active:!0,coordinate:void 0,dataKey:void 0,index:n,graphicalItemId:void 0};return Rd(Rd({},ea),{},{coordinate:a.coordinate})};function qU(e){if(typeof e=="number")return Number.isFinite(e)?e:void 0;if(e instanceof Date){var t=e.valueOf();return Number.isFinite(t)?t:void 0}var r=Number(e);return Number.isFinite(r)?r:void 0}function QU(e,t){var r=qU(e),n=t[0],a=t[1];if(r===void 0)return!1;var o=Math.min(n,a),u=Math.max(n,a);return r>=o&&r<=u}function YU(e,t,r){if(r==null||t==null)return!0;var n=Rt(e,t);return n==null||!Rn(r)?!0:QU(n,r)}var fu=(e,t,r,n)=>{var a=e==null?void 0:e.index;if(a==null)return null;var o=Number(a);if(!He(o))return a;var u=0,c=1/0;t.length>0&&(c=t.length-1);var f=Math.max(u,Math.min(o,c)),h=t[f];return h==null||YU(h,r,n)?String(f):null},fP=(e,t,r,n,a,o,u)=>{if(o!=null){var c=u[0],f=c==null?void 0:c.getPosition(o);if(f!=null)return f;var h=a==null?void 0:a[Number(o)];if(h)switch(r){case"horizontal":return{x:h.coordinate,y:(n.top+t)/2};default:return{x:(n.left+e)/2,y:h.coordinate}}}},hP=(e,t,r,n)=>{if(t==="axis")return e.tooltipItemPayloads;if(e.tooltipItemPayloads.length===0)return[];var a;if(r==="hover"?a=e.itemInteraction.hover.graphicalItemId:a=e.itemInteraction.click.graphicalItemId,e.syncInteraction.active&&a==null)return e.tooltipItemPayloads;if(a==null&&(n!=null||e.keyboardInteraction.active)){var o=e.tooltipItemPayloads[0];return o!=null?[o]:[]}return e.tooltipItemPayloads.filter(u=>{var c;return((c=u.settings)===null||c===void 0?void 0:c.graphicalItemId)===a})},mP=e=>e.options.tooltipPayloadSearcher,nl=e=>e.tooltip;function jS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function SS(e){for(var t=1;te(t)}function NS(e){if(typeof e=="string")return e}function nH(e){if(!(e==null||typeof e!="object")){var t="name"in e?eH(e.name):void 0,r="unit"in e?tH(e.unit):void 0,n="dataKey"in e?rH(e.dataKey):void 0,a="payload"in e?e.payload:void 0,o="color"in e?NS(e.color):void 0,u="fill"in e?NS(e.fill):void 0;return{name:t,unit:r,dataKey:n,payload:a,color:o,fill:u}}}function iH(e,t){return e??t}var pP=(e,t,r,n,a,o,u)=>{if(!(t==null||o==null)){var c=r.chartData,f=r.computedData,h=r.dataStartIndex,m=r.dataEndIndex,g=[];return e.reduce((v,b)=>{var j,k=b.dataDefinedOnItem,S=b.settings,N=iH(k,c),E=Array.isArray(N)?F5(N,h,m):N,A=(j=S==null?void 0:S.dataKey)!==null&&j!==void 0?j:n,P=S==null?void 0:S.nameKey,M;if(n&&Array.isArray(E)&&!Array.isArray(E[0])&&u==="axis"?M=qE(E,n,a):M=o(E,t,f,P),Array.isArray(M))M.forEach(D=>{var B,F,z=nH(D),Y=z==null?void 0:z.name,U=z==null?void 0:z.dataKey,me=z==null?void 0:z.payload,ue=SS(SS({},S),{},{name:Y,unit:z==null?void 0:z.unit,color:(B=z==null?void 0:z.color)!==null&&B!==void 0?B:S==null?void 0:S.color,fill:(F=z==null?void 0:z.fill)!==null&&F!==void 0?F:S==null?void 0:S.fill});v.push(xk({tooltipEntrySettings:ue,dataKey:U,payload:me,value:Rt(me,U),name:Y==null?void 0:String(Y)}))});else{var O;v.push(xk({tooltipEntrySettings:S,dataKey:A,payload:M,value:Rt(M,A),name:(O=Rt(M,P))!==null&&O!==void 0?O:S==null?void 0:S.name}))}return v},g)}},$0=V([Ot,bC,Yy],pC),aH=V([e=>e.graphicalItems.cartesianItems,e=>e.graphicalItems.polarItems],(e,t)=>[...e,...t]),oH=V([zt,Zs],wC),So=V([aH,Ot,oH],jC,{memoizeOptions:{resultEqualityCheck:Fh}}),sH=V([So],e=>e.filter(n0)),gP=V([So],EC,{memoizeOptions:{resultEqualityCheck:Fh}}),lH=V([So],e=>e.some(t=>!t.data)),go=V([gP,bn],CC),uH=V([sH,bn,Ot],TA),z0=V([go,Ot,So,bn,lH,gP],PC),vP=V([Ot],_0),cH=V([Ot],e=>e.allowDataOverflow),yP=V([vP,cH],gA),dH=V([So],e=>e.filter(n0)),fH=V([uH,dH,Th,AA],_C),hH=V([fH,bn,zt,yP],IC),mH=V([So],NC),pH=V([go,Ot,mH,M0,zt,SF],RC,{memoizeOptions:{resultEqualityCheck:zh}}),gH=V([LC,zt,Zs],tl),vH=V([gH,zt],FC),yH=V([$C,zt,Zs],tl),xH=V([yH,zt],BC),bH=V([zC,zt,Zs],tl),wH=V([bH,zt],UC),kH=V([vH,wH,xH],Bf),jH=V([Ot,vP,yP,hH,pH,kH,dt,zt],HC),Hs=V([Ot,dt,go,z0,Th,zt,jH],WC),SH=V([Hs,Ot,$0],KC),NH=V([Ot,Hs,SH,zt],GC),xP=e=>{var t=zt(e),r=Zs(e),n=!1;return nc(e,t,r,n)},bP=V([Ot,xP],Dh),EH=V([Ot,$0,NH,bP],C0),wP=V([EH],i0),AH=V([dt,z0,Ot,zt],eP),CH=V([dt,z0,Ot,zt],XC),PH=(e,t,r,n,a,o,u,c)=>{if(t){var f=t.type,h=Gn(e,c);if(n){var m=r==="scaleBand"&&n.bandwidth?n.bandwidth()/2:2,g=f==="category"&&n.bandwidth?n.bandwidth()/m:0;return g=c==="angleAxis"&&a!=null&&(a==null?void 0:a.length)>=2?qr(a[0]-a[1])*2*g:g,h&&u?u.map((v,b)=>{var j=n.map(v);return He(j)?{coordinate:j+g,value:v,index:b,offset:g}:null}).filter(jr):n.domain().map((v,b)=>{var j=n.map(v);return He(j)?{coordinate:j+g,value:o?o[v]:v,index:b,offset:g}:null}).filter(jr)}}},Ni=V([dt,Ot,$0,wP,xP,AH,CH,zt],PH),F0=V([iP,aP,TU],(e,t,r)=>oP(r.shared,e,t)),kP=e=>e.tooltip.settings.trigger,B0=e=>e.tooltip.settings.defaultIndex,ac=V([nl,F0,kP,B0],dP),Iu=V([ac,go,Us,Hs],fu),jP=V([Ni,Iu],sP),OH=V([ac],e=>{if(e)return e.dataKey}),_H=V([ac],e=>{if(e)return e.graphicalItemId}),SP=V([nl,F0,kP,B0],hP),MH=V([bi,wi,dt,Yt,Ni,B0,SP],fP),IH=V([ac,MH],(e,t)=>e!=null&&e.coordinate?e.coordinate:t),TH=V([ac],e=>{var t;return(t=e==null?void 0:e.active)!==null&&t!==void 0?t:!1}),DH=V([SP,Iu,bn,Us,jP,mP,F0],pP),RH=V([DH],e=>{if(e!=null){var t=e.map(r=>r.payload).filter(r=>r!=null);return Array.from(new Set(t))}});function ES(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function AS(e){for(var t=1;tMe(Ot),BH=()=>{var e=FH(),t=Me(Ni),r=Me(wP);return yf(!e||!r?void 0:AS(AS({},e),{},{scale:r}),t)};function CS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function ns(e){for(var t=1;t{var a=t.find(o=>o&&o.index===r);if(a){if(e==="horizontal")return{x:a.coordinate,y:n.relativeY};if(e==="vertical")return{x:n.relativeX,y:a.coordinate}}return{x:0,y:0}},GH=(e,t,r,n)=>{var a=t.find(h=>h&&h.index===r);if(a){if(e==="centric"){var o=a.coordinate,u=n.radius;return ns(ns(ns({},n),Vt(n.cx,n.cy,u,o)),{},{angle:o,radius:u})}var c=a.coordinate,f=n.angle;return ns(ns(ns({},n),Vt(n.cx,n.cy,c,f)),{},{angle:f,radius:c})}return{angle:0,clockWise:!1,cx:0,cy:0,endAngle:0,innerRadius:0,outerRadius:0,radius:0,startAngle:0,x:0,y:0}};function VH(e,t){var r=e.relativeX,n=e.relativeY;return r>=t.left&&r<=t.left+t.width&&n>=t.top&&n<=t.top+t.height}var NP=(e,t,r,n,a)=>{var o,u=(o=t==null?void 0:t.length)!==null&&o!==void 0?o:0;if(u<=1||e==null)return 0;if(n==="angleAxis"&&a!=null&&Math.abs(Math.abs(a[1]-a[0])-360)<=1e-6)for(var c=0;c0?(f=r[c-1])===null||f===void 0?void 0:f.coordinate:(h=r[u-1])===null||h===void 0?void 0:h.coordinate,j=(m=r[c])===null||m===void 0?void 0:m.coordinate,k=c>=u-1?(g=r[0])===null||g===void 0?void 0:g.coordinate:(v=r[c+1])===null||v===void 0?void 0:v.coordinate,S=void 0;if(!(b==null||j==null||k==null))if(qr(j-b)!==qr(k-j)){var N=[];if(qr(k-j)===qr(a[1]-a[0])){S=k;var E=j+a[1]-a[0];N[0]=Math.min(E,(E+b)/2),N[1]=Math.max(E,(E+b)/2)}else{S=b;var A=k+a[1]-a[0];N[0]=Math.min(j,(A+j)/2),N[1]=Math.max(j,(A+j)/2)}var P=[Math.min(j,(S+j)/2),Math.max(j,(S+j)/2)];if(e>P[0]&&e<=P[1]||e>=N[0]&&e<=N[1]){var M;return(M=r[c])===null||M===void 0?void 0:M.index}}else{var O=Math.min(b,k),D=Math.max(b,k);if(e>(O+j)/2&&e<=(D+j)/2){var B;return(B=r[c])===null||B===void 0?void 0:B.index}}}else if(t)for(var F=0;F(z.coordinate+U.coordinate)/2||F>0&&F(z.coordinate+U.coordinate)/2&&e<=(z.coordinate+Y.coordinate)/2)return z.index}}return-1},EP=()=>Me(Yy),U0=(e,t)=>t,AP=(e,t,r)=>r,H0=(e,t,r,n)=>n,qH=V(Ni,e=>hh(e,t=>t.coordinate)),W0=V([nl,U0,AP,H0],dP),K0=V([W0,go,Us,Hs],fu),QH=(e,t,r)=>{if(t!=null){var n=nl(e);return t==="axis"?r==="hover"?n.axisInteraction.hover.dataKey:n.axisInteraction.click.dataKey:r==="hover"?n.itemInteraction.hover.dataKey:n.itemInteraction.click.dataKey}},CP=V([nl,U0,AP,H0],hP),Hf=V([bi,wi,dt,Yt,Ni,H0,CP],fP),YH=V([W0,Hf],(e,t)=>{var r;return(r=e.coordinate)!==null&&r!==void 0?r:t}),PP=V([Ni,K0],sP),XH=V([CP,K0,bn,Us,PP,mP,U0],pP),ZH=V([W0,K0],(e,t)=>({isActive:e.active&&t!=null,activeIndex:t})),JH=(e,t,r,n,a,o,u)=>{if(!(!e||!r||!n||!a)&&VH(e,u)){var c=fz(e,t),f=NP(c,o,a,r,n),h=KH(t,a,f,e);return{activeIndex:String(f),activeCoordinate:h}}},eW=(e,t,r,n,a,o,u)=>{if(!(!e||!n||!a||!o||!r)){var c=pF(e,r);if(c){var f=hz(c,t),h=NP(f,u,o,n,a),m=GH(t,o,h,c);return{activeIndex:String(h),activeCoordinate:m}}}},tW=(e,t,r,n,a,o,u,c)=>{if(!(!e||!t||!n||!a||!o))return t==="horizontal"||t==="vertical"?JH(e,t,n,a,o,u,c):eW(e,t,r,n,a,o,u)},rW=V(e=>e.zIndex.zIndexMap,(e,t)=>t,(e,t,r)=>r,(e,t,r)=>{if(t!=null){var n=e[t];if(n!=null)return r?n.panoramaElement:n.element}}),nW=V(e=>e.zIndex.zIndexMap,e=>{var t=Object.keys(e).map(n=>parseInt(n,10)).concat(Object.values(dr)),r=Array.from(new Set(t));return r.sort((n,a)=>n-a)},{memoizeOptions:{resultEqualityCheck:GF}});function PS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function OS(e){for(var t=1;tOS(OS({},e),{},{[t]:{element:void 0,panoramaElement:void 0,consumers:0}}),sW)},uW=new Set(Object.values(dr));function cW(e){return uW.has(e)}var OP=sr({name:"zIndex",initialState:lW,reducers:{registerZIndexPortal:{reducer:(e,t)=>{var r=t.payload.zIndex;e.zIndexMap[r]?e.zIndexMap[r].consumers+=1:e.zIndexMap[r]={consumers:1,element:void 0,panoramaElement:void 0}},prepare:st()},unregisterZIndexPortal:{reducer:(e,t)=>{var r=t.payload.zIndex;e.zIndexMap[r]&&(e.zIndexMap[r].consumers-=1,e.zIndexMap[r].consumers<=0&&!cW(r)&&delete e.zIndexMap[r])},prepare:st()},registerZIndexPortalElement:{reducer:(e,t)=>{var r=t.payload,n=r.zIndex,a=r.element,o=r.isPanorama;e.zIndexMap[n]?o?e.zIndexMap[n].panoramaElement=a:e.zIndexMap[n].element=a:e.zIndexMap[n]={consumers:0,element:o?void 0:a,panoramaElement:o?a:void 0}},prepare:st()},unregisterZIndexPortalElement:{reducer:(e,t)=>{var r=t.payload.zIndex;e.zIndexMap[r]&&(t.payload.isPanorama?e.zIndexMap[r].panoramaElement=void 0:e.zIndexMap[r].element=void 0)},prepare:st()}}}),Yh=OP.actions,dW=Yh.registerZIndexPortal,Pg=Yh.unregisterZIndexPortal,fW=Yh.registerZIndexPortalElement,hW=Yh.unregisterZIndexPortalElement,mW=OP.reducer;function Ei(e){var t=e.zIndex,r=e.children,n=Xz(),a=n&&t!==void 0&&t!==0,o=Nr(),u=y.useRef(void 0),c=y.useRef(new Set),f=St(),h=Me(g=>rW(g,t,o));if(y.useLayoutEffect(()=>{if(!a){var g=c.current;g.forEach(b=>{f(Pg({zIndex:b}))}),g.clear(),u.current=void 0;return}if(c.current.has(t)||(f(dW({zIndex:t})),c.current.add(t)),h){u.current=h;var v=c.current;v.forEach(b=>{b!==t&&(f(Pg({zIndex:b})),v.delete(b))})}},[f,t,a,h]),y.useLayoutEffect(()=>{var g=c.current;return()=>{g.forEach(v=>{f(Pg({zIndex:v}))}),g.clear()}},[f]),!a)return r;var m=h??u.current;return m?ih.createPortal(r,m):null}function Jv(){return Jv=Object.assign?Object.assign.bind():function(e){for(var t=1;ty.useContext(_P),Og={exports:{}},MS;function kW(){return MS||(MS=1,(function(e){var t=Object.prototype.hasOwnProperty,r="~";function n(){}Object.create&&(n.prototype=Object.create(null),new n().__proto__||(r=!1));function a(f,h,m){this.fn=f,this.context=h,this.once=m||!1}function o(f,h,m,g,v){if(typeof m!="function")throw new TypeError("The listener must be a function");var b=new a(m,g||f,v),j=r?r+h:h;return f._events[j]?f._events[j].fn?f._events[j]=[f._events[j],b]:f._events[j].push(b):(f._events[j]=b,f._eventsCount++),f}function u(f,h){--f._eventsCount===0?f._events=new n:delete f._events[h]}function c(){this._events=new n,this._eventsCount=0}c.prototype.eventNames=function(){var h=[],m,g;if(this._eventsCount===0)return h;for(g in m=this._events)t.call(m,g)&&h.push(r?g.slice(1):g);return Object.getOwnPropertySymbols?h.concat(Object.getOwnPropertySymbols(m)):h},c.prototype.listeners=function(h){var m=r?r+h:h,g=this._events[m];if(!g)return[];if(g.fn)return[g.fn];for(var v=0,b=g.length,j=new Array(b);v{if(t&&Array.isArray(e)){var r=Number.parseInt(t,10);if(!Fn(r))return e[r]}},EW={chartName:"",tooltipPayloadSearcher:()=>{},eventEmitter:void 0,defaultTooltipEventType:"axis"},MP=sr({name:"options",initialState:EW,reducers:{createEventEmitter:e=>{e.eventEmitter==null&&(e.eventEmitter=Symbol("rechartsEventEmitter"))}}}),AW=MP.reducer,CW=MP.actions.createEventEmitter;function PW(e){return e.tooltip.syncInteraction}var OW={chartData:void 0,computedData:void 0,dataStartIndex:0,dataEndIndex:0},IP=sr({name:"chartData",initialState:OW,reducers:{setChartData(e,t){if(e.chartData=t.payload,t.payload==null){e.dataStartIndex=0,e.dataEndIndex=0;return}t.payload.length>0&&e.dataEndIndex!==t.payload.length-1&&(e.dataEndIndex=t.payload.length-1)},setComputedData(e,t){e.computedData=t.payload},setDataStartEndIndexes(e,t){var r=t.payload,n=r.startIndex,a=r.endIndex;n!=null&&(e.dataStartIndex=n),a!=null&&(e.dataEndIndex=a)}}}),G0=IP.actions,TS=G0.setChartData,_W=G0.setDataStartEndIndexes;G0.setComputedData;var MW=IP.reducer,IW=["x","y"];function DS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function is(e){for(var t=1;tf.rootProps.className);y.useEffect(()=>{if(e==null)return qs;var f=(h,m,g)=>{if(t!==g&&e===h){if(m.payload.active===!1){r(uu({active:!1,coordinate:void 0,dataKey:void 0,index:null,label:void 0,sourceViewBox:void 0,graphicalItemId:void 0}));return}if(n==="index"){var v;if(u&&m!==null&&m!==void 0&&(v=m.payload)!==null&&v!==void 0&&v.coordinate&&m.payload.sourceViewBox){var b=m.payload.coordinate,j=b.x,k=b.y,S=LW(b,IW),N=m.payload.sourceViewBox,E=N.x,A=N.y,P=N.width,M=N.height,O=is(is({},S),{},{x:u.x+(P?(j-E)/P:0)*u.width,y:u.y+(M?(k-A)/M:0)*u.height});r(is(is({},m),{},{payload:is(is({},m.payload),{},{coordinate:O})}))}else r(m);return}if(a!=null){var D;if(typeof n=="function"){var B={activeTooltipIndex:m.payload.index==null?void 0:Number(m.payload.index),isTooltipActive:m.payload.active,activeIndex:m.payload.index==null?void 0:Number(m.payload.index),activeLabel:m.payload.label,activeDataKey:m.payload.dataKey,activeCoordinate:m.payload.coordinate},F=n(a,B);D=a[F]}else n==="value"&&(D=a.find(oe=>String(oe.value)===m.payload.label));var z=m.payload.coordinate;if(z==null||u==null){r(uu({active:!1,coordinate:void 0,dataKey:void 0,index:null,label:void 0,sourceViewBox:void 0,graphicalItemId:void 0}));return}if(D==null){r(uu({active:!1,coordinate:void 0,dataKey:void 0,index:null,label:void 0,sourceViewBox:m.payload.sourceViewBox,graphicalItemId:void 0}));return}var Y=z.x,U=z.y,me=Math.min(Y,u.x+u.width),ue=Math.min(U,u.y+u.height),ge={x:o==="horizontal"?D.coordinate:me,y:o==="horizontal"?ue:D.coordinate},ie=uu({active:m.payload.active,coordinate:ge,dataKey:m.payload.dataKey,index:String(D.index),label:m.payload.label,sourceViewBox:m.payload.sourceViewBox,graphicalItemId:m.payload.graphicalItemId});r(ie)}}};return Tu.on(ey,f),()=>{Tu.off(ey,f)}},[c,r,t,e,n,a,o,u])}function FW(){var e=Me(Xy),t=Me(Zy),r=St();y.useEffect(()=>{if(e==null)return qs;var n=(a,o,u)=>{t!==u&&e===a&&r(_W(o))};return Tu.on(IS,n),()=>{Tu.off(IS,n)}},[r,t,e])}function BW(){var e=St();y.useEffect(()=>{e(CW())},[e]),zW(),FW()}function UW(e,t,r,n,a,o){var u=Me(j=>QH(j,e,t)),c=Me(_H),f=Me(Zy),h=Me(Xy),m=Me(CA),g=Me(PW),v=(g==null?void 0:g.sourceViewBox)!=null,b=Ch();y.useEffect(()=>{if(!v&&h!=null&&f!=null){var j=uu({active:o,coordinate:r,dataKey:u,index:a,label:typeof n=="number"?String(n):n,sourceViewBox:b,graphicalItemId:c});Tu.emit(ey,h,j,f)}},[v,r,u,c,a,n,f,h,m,o,b])}function RS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function LS(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);r{D(zU({shared:E,trigger:A,axisId:O,active:a,defaultIndex:B}))},[D,E,A,O,a,B]);var F=Ch(),z=sA(),Y=IU(E),U=(t=Me(_e=>ZH(_e,Y,A,B)))!==null&&t!==void 0?t:{},me=U.activeIndex,ue=U.isActive,ge=Me(_e=>XH(_e,Y,A,B)),ie=Me(_e=>PP(_e,Y,A,B)),oe=Me(_e=>YH(_e,Y,A,B)),X=ge,re=wW(),J=(r=a??ue)!==null&&r!==void 0?r:!1,I=ZL([X,J]),_=GW(I,2),W=_[0],ee=_[1],Z=Y==="axis"?ie:void 0;UW(Y,A,oe,Z,me,J);var he=M??re;if(he==null||F==null||Y==null)return null;var pe=X??zS;J||(pe=zS),h&&pe.length&&(pe=wL(pe.filter(_e=>_e.value!=null&&(_e.hide!==!0||n.includeHidden)),v,XW));var Pe=pe.length>0,ne=LS(LS({},n),{},{payload:pe,label:Z,active:J,activeIndex:me,coordinate:oe,accessibilityLayer:z}),we=y.createElement(u8,{allowEscapeViewBox:o,animationDuration:u,animationEasing:c,isAnimationActive:m,active:J,coordinate:oe,hasPayload:Pe,offset:g,position:b,reverseDirection:j,useTranslate3d:k,viewBox:F,wrapperStyle:S,lastBoundingBox:W,innerRef:ee,hasPortalFromProps:!!M},ZW(f,ne));return y.createElement(y.Fragment,null,ih.createPortal(we,he),J&&y.createElement(bW,{cursor:N,tooltipEventType:Y,coordinate:oe,payload:pe,index:me}))}function tK(e,t,r){return(t=rK(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function rK(e){var t=nK(e,"string");return typeof t=="symbol"?t:t+""}function nK(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}class iK{constructor(t){tK(this,"cache",new Map),this.maxSize=t}get(t){var r=this.cache.get(t);return r!==void 0&&(this.cache.delete(t),this.cache.set(t,r)),r}set(t,r){if(this.cache.has(t))this.cache.delete(t);else if(this.cache.size>=this.maxSize){var n=this.cache.keys().next().value;n!=null&&this.cache.delete(n)}this.cache.set(t,r)}clear(){this.cache.clear()}size(){return this.cache.size}}function FS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function aK(e){for(var t=1;t{try{var r=document.getElementById(US);r||(r=document.createElement("span"),r.setAttribute("id",US),r.setAttribute("aria-hidden","true"),document.body.appendChild(r)),Object.assign(r.style,cK,t),r.textContent="".concat(e);var n=r.getBoundingClientRect();return{width:n.width,height:n.height}}catch{return{width:0,height:0}}},hu=function(t){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(t==null||Yu.isSsr)return{width:0,height:0};if(!TP.enableCache)return HS(t,r);var n=dK(t,r),a=BS.get(n);if(a)return a;var o=HS(t,r);return BS.set(n,o),o},DP;function Wf(e,t){return pK(e)||mK(e,t)||hK(e,t)||fK()}function fK(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function hK(e,t){if(e){if(typeof e=="string")return WS(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?WS(e,t):void 0}}function WS(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);re.length)&&(t=e.length);for(var r=0,n=Array(t);r{var t=e.children,r=e.breakAll,n=e.style;try{var a=[];qt(t)||(r?a=t.toString().split(""):a=t.toString().split(LP));var o=a.map(c=>({word:c,width:hu(c,n).width})),u=r?0:hu(" ",n).width;return{wordsWithComputedWidth:o,spaceWidth:u}}catch{return null}};function zP(e){return e==="start"||e==="middle"||e==="end"||e==="inherit"}function DK(e){return qt(e)||typeof e=="string"||typeof e=="number"||typeof e=="boolean"}var FP=(e,t,r,n)=>e.reduce((a,o)=>{var u=o.word,c=o.width,f=a[a.length-1];if(f&&c!=null&&(t==null||n||f.width+c+re.reduce((t,r)=>t.width>r.width?t:r),RK="…",XS=(e,t,r,n,a,o,u,c)=>{var f=e.slice(0,t),h=$P({breakAll:r,style:n,children:f+RK});if(!h)return[!1,[]];var m=FP(h.wordsWithComputedWidth,o,u,c),g=m.length>a||BP(m).width>Number(o);return[g,m]},LK=(e,t,r,n,a)=>{var o=e.maxLines,u=e.children,c=e.style,f=e.breakAll,h=Ee(o),m=String(u),g=FP(t,n,r,a);if(!h||a)return g;var v=g.length>o||BP(g).width>Number(n);if(!v)return g;for(var b=0,j=m.length-1,k=0,S;b<=j&&k<=m.length-1;){var N=Math.floor((b+j)/2),E=N-1,A=XS(m,E,f,c,o,n,r,a),P=QS(A,2),M=P[0],O=P[1],D=XS(m,N,f,c,o,n,r,a),B=QS(D,1),F=B[0];if(!M&&!F&&(b=N+1),M&&F&&(j=N-1),!M&&F){S=O;break}k++}return S||g},ZS=e=>{var t=qt(e)?[]:e.toString().split(LP);return[{words:t,width:void 0}]},$K=e=>{var t=e.width,r=e.scaleToFit,n=e.children,a=e.style,o=e.breakAll,u=e.maxLines;if((t||r)&&!Yu.isSsr){var c,f,h=$P({breakAll:o,children:n,style:a});if(h){var m=h.wordsWithComputedWidth,g=h.spaceWidth;c=m,f=g}else return ZS(n);return LK({breakAll:o,children:n,maxLines:u,style:a},c,f,t,!!r)}return ZS(n)},UP="#808080",zK={angle:0,breakAll:!1,capHeight:"0.71em",fill:UP,lineHeight:"1em",scaleToFit:!1,textAnchor:"start",verticalAnchor:"end",x:0,y:0},V0=y.forwardRef((e,t)=>{var r=en(e,zK),n=r.x,a=r.y,o=r.lineHeight,u=r.capHeight,c=r.fill,f=r.scaleToFit,h=r.textAnchor,m=r.verticalAnchor,g=qS(r,CK),v=y.useMemo(()=>$K({breakAll:g.breakAll,children:g.children,maxLines:g.maxLines,scaleToFit:f,style:g.style,width:g.width}),[g.breakAll,g.children,g.maxLines,f,g.style,g.width]),b=g.dx,j=g.dy,k=g.angle,S=g.className,N=g.breakAll,E=qS(g,PK);if(!Bn(n)||!Bn(a)||v.length===0)return null;var A=Number(n)+(Ee(b)?b:0),P=Number(a)+(Ee(j)?j:0);if(!He(A)||!He(P))return null;var M;switch(m){case"start":M=_g("calc(".concat(u,")"));break;case"middle":M=_g("calc(".concat((v.length-1)/2," * -").concat(o," + (").concat(u," / 2))"));break;default:M=_g("calc(".concat(v.length-1," * -").concat(o,")"));break}var O=[],D=v[0];if(f&&D!=null){var B=D.width,F=g.width;O.push("scale(".concat(Ee(F)&&Ee(B)?F/B:1,")"))}return k&&O.push("rotate(".concat(k,", ").concat(A,", ").concat(P,")")),O.length&&(E.transform=O.join(" ")),y.createElement("text",ty({},Xr(E),{ref:t,x:A,y:P,className:rt("recharts-text",S),textAnchor:h,fill:c.includes("url")?UP:c}),v.map((z,Y)=>{var U=z.words.join(N?"":" ");return y.createElement("tspan",{x:A,dy:Y===0?M:o,key:"".concat(U,"-").concat(Y)},U)}))});V0.displayName="Text";function JS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function Pn(e){for(var t=1;t{var t=e.viewBox,r=e.position,n=e.offset,a=n===void 0?0:n,o=e.parentViewBox,u=By(t),c=u.x,f=u.y,h=u.height,m=u.upperWidth,g=u.lowerWidth,v=c,b=c+(m-g)/2,j=(v+b)/2,k=(m+g)/2,S=v+m/2,N=h>=0?1:-1,E=N*a,A=N>0?"end":"start",P=N>0?"start":"end",M=m>=0?1:-1,O=M*a,D=M>0?"end":"start",B=M>0?"start":"end",F=o;if(r==="top"){var z={x:v+m/2,y:f-E,horizontalAnchor:"middle",verticalAnchor:A};return F&&(z.height=Math.max(f-F.y,0),z.width=m),z}if(r==="bottom"){var Y={x:b+g/2,y:f+h+E,horizontalAnchor:"middle",verticalAnchor:P};return F&&(Y.height=Math.max(F.y+F.height-(f+h),0),Y.width=g),Y}if(r==="left"){var U={x:j-O,y:f+h/2,horizontalAnchor:D,verticalAnchor:"middle"};return F&&(U.width=Math.max(U.x-F.x,0),U.height=h),U}if(r==="right"){var me={x:j+k+O,y:f+h/2,horizontalAnchor:B,verticalAnchor:"middle"};return F&&(me.width=Math.max(F.x+F.width-me.x,0),me.height=h),me}var ue=F?{width:k,height:h}:{};return r==="insideLeft"?Pn({x:j+O,y:f+h/2,horizontalAnchor:B,verticalAnchor:"middle"},ue):r==="insideRight"?Pn({x:j+k-O,y:f+h/2,horizontalAnchor:D,verticalAnchor:"middle"},ue):r==="insideTop"?Pn({x:v+m/2,y:f+E,horizontalAnchor:"middle",verticalAnchor:P},ue):r==="insideBottom"?Pn({x:b+g/2,y:f+h-E,horizontalAnchor:"middle",verticalAnchor:A},ue):r==="insideTopLeft"?Pn({x:v+O,y:f+E,horizontalAnchor:B,verticalAnchor:P},ue):r==="insideTopRight"?Pn({x:v+m-O,y:f+E,horizontalAnchor:D,verticalAnchor:P},ue):r==="insideBottomLeft"?Pn({x:b+O,y:f+h-E,horizontalAnchor:B,verticalAnchor:A},ue):r==="insideBottomRight"?Pn({x:b+g-O,y:f+h-E,horizontalAnchor:D,verticalAnchor:A},ue):r&&typeof r=="object"&&(Ee(r.x)||co(r.x))&&(Ee(r.y)||co(r.y))?Pn({x:c+ga(r.x,k),y:f+ga(r.y,h),horizontalAnchor:"end",verticalAnchor:"end"},ue):Pn({x:S,y:f+h/2,horizontalAnchor:"middle",verticalAnchor:"middle"},ue)},WK=["labelRef"],KK=["content"];function e2(e,t){if(e==null)return{};var r,n,a=GK(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n{var t=e.x,r=e.y,n=e.upperWidth,a=e.lowerWidth,o=e.width,u=e.height,c=e.children,f=y.useMemo(()=>({x:t,y:r,upperWidth:n,lowerWidth:a,width:o,height:u}),[t,r,n,a,o,u]);return y.createElement(HP.Provider,{value:f},c)},WP=()=>{var e=y.useContext(HP),t=Ch();return e||(t?By(t):void 0)},XK=y.createContext(null),ZK=()=>{var e=y.useContext(XK),t=Me(IA);return e||t},JK=e=>{var t=e.value,r=e.formatter,n=qt(e.children)?t:e.children;return typeof r=="function"?r(n):n},q0=e=>e!=null&&typeof e=="function",eG=(e,t)=>{var r=qr(t-e),n=Math.min(Math.abs(t-e),360);return r*n},tG=(e,t,r,n,a)=>{var o=e.offset,u=e.className,c=a.cx,f=a.cy,h=a.innerRadius,m=a.outerRadius,g=a.startAngle,v=a.endAngle,b=a.clockWise,j=(h+m)/2,k=eG(g,v),S=k>=0?1:-1,N,E;switch(t){case"insideStart":N=g+S*o,E=b;break;case"insideEnd":N=v-S*o,E=!b;break;case"end":N=v+S*o,E=b;break;default:throw new Error("Unsupported position ".concat(t))}E=k<=0?E:!E;var A=Vt(c,f,j,N),P=Vt(c,f,j,N+(E?1:-1)*359),M="M".concat(A.x,",").concat(A.y,` + A`).concat(j,",").concat(j,",0,1,").concat(E?0:1,`, + `).concat(P.x,",").concat(P.y),O=qt(e.id)?bu("recharts-radial-line-"):e.id;return y.createElement("text",si({},n,{dominantBaseline:"central",className:rt("recharts-radial-bar-label",u)}),y.createElement("defs",null,y.createElement("path",{id:O,d:M})),y.createElement("textPath",{xlinkHref:"#".concat(O)},r))},rG=(e,t,r)=>{var n=e.cx,a=e.cy,o=e.innerRadius,u=e.outerRadius,c=e.startAngle,f=e.endAngle,h=(c+f)/2;if(r==="outside"){var m=Vt(n,a,u+t,h),g=m.x,v=m.y;return{x:g,y:v,textAnchor:g>=n?"start":"end",verticalAnchor:"middle"}}if(r==="center")return{x:n,y:a,textAnchor:"middle",verticalAnchor:"middle"};if(r==="centerTop")return{x:n,y:a,textAnchor:"middle",verticalAnchor:"start"};if(r==="centerBottom")return{x:n,y:a,textAnchor:"middle",verticalAnchor:"end"};var b=(o+u)/2,j=Vt(n,a,b,h),k=j.x,S=j.y;return{x:k,y:S,textAnchor:"middle",verticalAnchor:"middle"}},Qd=e=>e!=null&&"cx"in e&&Ee(e.cx),nG={angle:0,offset:5,zIndex:dr.label,position:"middle",textBreakAll:!1};function iG(e){if(!Qd(e))return e;var t=e.cx,r=e.cy,n=e.outerRadius,a=n*2;return{x:t-n,y:r-n,width:a,upperWidth:a,lowerWidth:a,height:a}}function Ji(e){var t=en(e,nG),r=t.viewBox,n=t.parentViewBox,a=t.position,o=t.value,u=t.children,c=t.content,f=t.className,h=f===void 0?"":f,m=t.textBreakAll,g=t.labelRef,v=ZK(),b=WP(),j=a==="center"?b:v??b,k,S,N;r==null?k=j:Qd(r)?k=r:k=By(r);var E=iG(k);if(!k||qt(o)&&qt(u)&&!y.isValidElement(c)&&typeof c!="function")return null;var A=cu(cu({},t),{},{viewBox:k});if(y.isValidElement(c)){A.labelRef;var P=e2(A,WK);return y.cloneElement(c,P)}if(typeof c=="function"){A.content;var M=e2(A,KK);if(S=y.createElement(c,M),y.isValidElement(S))return S}else S=JK(t);var O=Xr(t);if(Qd(k)){if(a==="insideStart"||a==="insideEnd"||a==="end")return tG(t,a,S,O,k);N=rG(k,t.offset,t.position)}else{if(!E)return null;var D=HK({viewBox:E,position:a,offset:t.offset,parentViewBox:Qd(n)?void 0:n});N=cu(cu({x:D.x,y:D.y,textAnchor:D.horizontalAnchor,verticalAnchor:D.verticalAnchor},D.width!==void 0?{width:D.width}:{}),D.height!==void 0?{height:D.height}:{})}return y.createElement(Ei,{zIndex:t.zIndex},y.createElement(V0,si({ref:g,className:rt("recharts-label",h)},O,N,{textAnchor:zP(O.textAnchor)?O.textAnchor:N.textAnchor,breakAll:m}),S))}Ji.displayName="Label";var aG=(e,t,r)=>{if(!e)return null;var n={viewBox:t,labelRef:r};return e===!0?y.createElement(Ji,si({key:"label-implicit"},n)):Bn(e)?y.createElement(Ji,si({key:"label-implicit",value:e},n)):y.isValidElement(e)?e.type===Ji?y.cloneElement(e,cu({key:"label-implicit"},n)):y.createElement(Ji,si({key:"label-implicit",content:e},n)):q0(e)?y.createElement(Ji,si({key:"label-implicit",content:e},n)):e&&typeof e=="object"?y.createElement(Ji,si({},e,{key:"label-implicit"},n)):null};function oG(e){var t=e.label,r=e.labelRef,n=WP();return aG(t,n,r)||null}var sG=["valueAccessor"],lG=["dataKey","clockWise","id","textBreakAll","zIndex"];function Kf(){return Kf=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var t=Array.isArray(e.value)?e.value[e.value.length-1]:e.value;if(DK(t))return t},KP=y.createContext(void 0),dG=KP.Provider,GP=y.createContext(void 0);GP.Provider;function fG(){return y.useContext(KP)}function hG(){return y.useContext(GP)}function Yd(e){var t=e.valueAccessor,r=t===void 0?cG:t,n=r2(e,sG),a=n.dataKey;n.clockWise;var o=n.id,u=n.textBreakAll,c=n.zIndex,f=r2(n,lG),h=fG(),m=hG(),g=h||m;return!g||!g.length?null:y.createElement(Ei,{zIndex:c??dr.label},y.createElement(Zr,{className:"recharts-label-list"},g.map((v,b)=>{var j,k=qt(a)?r(v,b):Rt(v.payload,a),S=qt(o)?{}:{id:"".concat(o,"-").concat(b)};return y.createElement(Ji,Kf({key:"label-".concat(b)},Xr(v),f,S,{fill:(j=n.fill)!==null&&j!==void 0?j:v.fill,parentViewBox:v.parentViewBox,value:k,textBreakAll:u,viewBox:v.viewBox,index:b,zIndex:0}))})))}Yd.displayName="LabelList";function mG(e){var t=e.label;return t?t===!0?y.createElement(Yd,{key:"labelList-implicit"}):y.isValidElement(t)||q0(t)?y.createElement(Yd,{key:"labelList-implicit",content:t}):typeof t=="object"?y.createElement(Yd,Kf({key:"labelList-implicit"},t,{type:String(t.type)})):null:null}function ry(){return ry=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var t=e.cx,r=e.cy,n=e.r,a=e.className,o=rt("recharts-dot",a);return Ee(t)&&Ee(r)&&Ee(n)?y.createElement("circle",ry({},vn(e),_y(e),{className:o,cx:t,cy:r,r:n})):null},pG={radiusAxis:{},angleAxis:{}},qP=sr({name:"polarAxis",initialState:pG,reducers:{addRadiusAxis(e,t){e.radiusAxis[t.payload.id]=t.payload},removeRadiusAxis(e,t){delete e.radiusAxis[t.payload.id]},addAngleAxis(e,t){e.angleAxis[t.payload.id]=t.payload},removeAngleAxis(e,t){delete e.angleAxis[t.payload.id]}}}),Xh=qP.actions;Xh.addRadiusAxis;Xh.removeRadiusAxis;Xh.addAngleAxis;Xh.removeAngleAxis;var gG=qP.reducer;function vG(e){return e&&typeof e=="object"&&"className"in e&&typeof e.className=="string"?e.className:""}var QP=e=>e&&typeof e=="object"&&"clipDot"in e?!!e.clipDot:!0;function n2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function i2(e){for(var t=1;t{n||(a.current===null?r(RU(t)):a.current!==t&&r(LU({prev:a.current,next:t})),a.current=t)},[t,r,n]),y.useLayoutEffect(()=>()=>{a.current&&(r($U(a.current)),a.current=null)},[r]),null}function AG(e){var t=e.legendPayload,r=St(),n=Nr(),a=y.useRef(null);return y.useLayoutEffect(()=>{n||(a.current===null?r(c6(t)):a.current!==t&&r(d6({prev:a.current,next:t})),a.current=t)},[r,n,t]),y.useLayoutEffect(()=>()=>{a.current&&(r(f6(a.current)),a.current=null)},[r]),null}function CG(e,t){return MG(e)||_G(e,t)||OG(e,t)||PG()}function PG(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function OG(e,t){if(e){if(typeof e=="string")return a2(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?a2(e,t):void 0}}function a2(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r2&&arguments[2]!==void 0?arguments[2]:[],n=[];for(var a of r)n.push({status:"removed",prev:a});for(var o=0;oe[Math.floor(o*r)]);return Y0(n,t)}function DG(e,t){var r=t.map((n,a)=>e[a]);return Y0(r,t)}function RG(e,t){for(var r=new Map,n=0;n{var b=r(g,v);if(b!=null){var j=n.get(b);if(j!==void 0)return a.add(b),j}}),u=[];for(var c of n){var f=CG(c,2),h=f[0],m=f[1];a.has(h)||u.push(m)}return Y0(o,t,u)}function ny(e,t,r){return t==null?null:e==null?t.map(n=>({status:"added",next:n})):r===Q0?TG(e,t):r===IG?DG(e,t):LG(e,t,r)}function XP(e,t){var r=y.useRef(e),n=y.useRef(t.current),a=y.useRef(!0);r.current!==e&&(r.current=e,n.current=t.current,a.current=!1);var o=y.useCallback(function(u,c){var f=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;if(c===0){a.current=!0;return}c===1&&(n.current=u),c>0&&a.current&&f&&(t.current=u)},[t]);return{startValue:n.current,syncStepValue:o}}function $G(e,t){return UG(e)||BG(e,t)||FG(e,t)||zG()}function zG(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function FG(e,t){if(e){if(typeof e=="string")return o2(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?o2(e,t):void 0}}function o2(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{typeof e=="function"&&e(),o(!0)},[e]),c=y.useCallback(()=>{typeof t=="function"&&t(),o(!1)},[t]);return{isAnimating:a,handleAnimationStart:u,handleAnimationEnd:c}}function WG(e){var t,r=e.animationInput,n=e.animationIdPrefix,a=e.items,o=e.previousItemsRef,u=e.isAnimationActive,c=e.animationBegin,f=e.animationDuration,h=e.animationEasing,m=e.onAnimationStart,g=e.onAnimationEnd,v=e.animationInterpolateFn,b=e.animationMatchBy,j=e.shouldUpdatePreviousRef,k=e.children,S=e.layout,N=fA(r,n),E=XP(N,o),A=(t=E.startValue)!==null&&t!==void 0?t:null,P=ny(A,a,b??Q0);return y.createElement(dA,{animationId:N,begin:c,duration:f,isActive:u,easing:h,onAnimationEnd:g,onAnimationStart:m,key:N},M=>{var O=A==null,D=a==null?a:v(P,M,S),B=j?j(M):M>0;return E.syncStepValue(D,M,B),D==null?null:k(D,M,O)})}var Mg;function KG(e,t){return QG(e)||qG(e,t)||VG(e,t)||GG()}function GG(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function VG(e,t){if(e){if(typeof e=="string")return s2(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?s2(e,t):void 0}}function s2(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{var e=y.useState(()=>bu("uid-")),t=KG(e,1),r=t[0];return r},ZP=(Mg=Jf.useId)!==null&&Mg!==void 0?Mg:YG;function XG(e,t){var r=ZP();return t||(e?"".concat(e,"-").concat(r):r)}var ZG=y.createContext(void 0),JG=e=>{var t=e.id,r=e.type,n=e.children,a=XG("recharts-".concat(r),t);return y.createElement(ZG.Provider,{value:a},n(a))},eV={cartesianItems:[],polarItems:[]},JP=sr({name:"graphicalItems",initialState:eV,reducers:{addCartesianGraphicalItem:{reducer(e,t){e.cartesianItems.push(t.payload)},prepare:st()},replaceCartesianGraphicalItem:{reducer(e,t){var r=t.payload,n=r.prev,a=r.next,o=Qr(e).cartesianItems.indexOf(n);o>-1&&(e.cartesianItems[o]=a)},prepare:st()},removeCartesianGraphicalItem:{reducer(e,t){var r=Qr(e).cartesianItems.indexOf(t.payload);r>-1&&e.cartesianItems.splice(r,1)},prepare:st()},addPolarGraphicalItem:{reducer(e,t){e.polarItems.push(t.payload)},prepare:st()},removePolarGraphicalItem:{reducer(e,t){var r=Qr(e).polarItems.indexOf(t.payload);r>-1&&e.polarItems.splice(r,1)},prepare:st()},replacePolarGraphicalItem:{reducer(e,t){var r=t.payload,n=r.prev,a=r.next,o=Qr(e).polarItems.indexOf(n);o>-1&&(e.polarItems[o]=a)},prepare:st()}}}),il=JP.actions,tV=il.addCartesianGraphicalItem,rV=il.replaceCartesianGraphicalItem,nV=il.removeCartesianGraphicalItem;il.addPolarGraphicalItem;il.removePolarGraphicalItem;il.replacePolarGraphicalItem;var iV=JP.reducer,aV=e=>{var t=St(),r=y.useRef(null);return y.useLayoutEffect(()=>{r.current===null?t(tV(e)):r.current!==e&&t(rV({prev:r.current,next:e})),r.current=e},[t,e]),y.useLayoutEffect(()=>()=>{r.current&&(t(nV(r.current)),r.current=null)},[t]),null},oV=y.memo(aV),sV=["points"];function l2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function Ig(e){for(var t=1;t{var N,E,A=Ig(Ig(Ig({r:3},u),v),{},{index:S,cx:(N=k.x)!==null&&N!==void 0?N:void 0,cy:(E=k.y)!==null&&E!==void 0?E:void 0,dataKey:o,value:k.value,payload:k.payload,points:t});return y.createElement(hV,{key:"dot-".concat(S),option:r,dotProps:A,className:a})}),j={};return c&&f!=null&&(j.clipPath="url(#clipPath-".concat(g?"":"dots-").concat(f,")")),y.createElement(Ei,{zIndex:m},y.createElement(Zr,Gf({className:n},j),b))}function u2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function c2(e){for(var t=1;t({top:e.top,bottom:e.bottom,left:e.left,right:e.right})),PV=V([CV,bi,wi],(e,t,r)=>{if(!(!e||t==null||r==null))return{x:e.left,y:e.top,width:Math.max(0,t-e.left-e.right),height:Math.max(0,r-e.top-e.bottom)}}),X0=()=>Me(PV),OV=()=>Me(RH);function d2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function Tg(e){for(var t=1;t{var t=e.point,r=e.childIndex,n=e.mainColor,a=e.activeDot,o=e.dataKey,u=e.clipPath;if(a===!1||t.x==null||t.y==null)return null;var c={index:r,dataKey:o,cx:t.x,cy:t.y,r:4,fill:n??"none",strokeWidth:2,stroke:"#fff",payload:t.payload,value:t.value},f=Tg(Tg(Tg({},c),ch(a)),_y(a)),h;return y.isValidElement(a)?h=y.cloneElement(a,f):typeof a=="function"?h=a(f):h=y.createElement(VP,f),y.createElement(Zr,{className:"recharts-active-dot",clipPath:u},h)};function f2(e){var t=e.points,r=e.mainColor,n=e.activeDot,a=e.itemDataKey,o=e.clipPath,u=e.zIndex,c=u===void 0?dr.activeDot:u,f=Me(Iu),h=OV();if(t==null||h==null)return null;var m=t.find(g=>h.includes(g.payload));return qt(m)?null:y.createElement(Ei,{zIndex:c},y.createElement(TV,{point:m,childIndex:Number(f),mainColor:r,dataKey:a,activeDot:n,clipPath:o}))}var DV=e=>{var t=e.chartData,r=St(),n=Nr();return y.useEffect(()=>n?()=>{}:(r(TS(t)),()=>{r(TS(void 0))}),[t,r,n]),null},h2={x:0,y:0,width:0,height:0,padding:{top:0,right:0,bottom:0,left:0}},rO=sr({name:"brush",initialState:h2,reducers:{setBrushSettings(e,t){return t.payload==null?h2:t.payload}}});rO.actions.setBrushSettings;var RV=rO.reducer;function LV(e){return(e%180+180)%180}var $V=function(t){var r=t.width,n=t.height,a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,o=LV(a),u=o*Math.PI/180,c=Math.atan(n/r),f=u>c&&u{e.dots.push(t.payload)},removeDot:(e,t)=>{var r=Qr(e).dots.findIndex(n=>n===t.payload);r!==-1&&e.dots.splice(r,1)},addArea:(e,t)=>{e.areas.push(t.payload)},removeArea:(e,t)=>{var r=Qr(e).areas.findIndex(n=>n===t.payload);r!==-1&&e.areas.splice(r,1)},addLine:(e,t)=>{e.lines.push(t.payload)},removeLine:(e,t)=>{var r=Qr(e).lines.findIndex(n=>n===t.payload);r!==-1&&e.lines.splice(r,1)}}}),al=nO.actions;al.addDot;al.removeDot;al.addArea;al.removeArea;al.addLine;al.removeLine;var FV=nO.reducer;function BV(e,t){return KV(e)||WV(e,t)||HV(e,t)||UV()}function UV(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function HV(e,t){if(e){if(typeof e=="string")return m2(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?m2(e,t):void 0}}function m2(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{var t=e.children,r=y.useState("".concat(bu("recharts"),"-clip")),n=BV(r,1),a=n[0],o=X0();if(o==null)return null;var u=o.x,c=o.y,f=o.width,h=o.height;return y.createElement(GV.Provider,{value:a},y.createElement("defs",null,y.createElement("clipPath",{id:a},y.createElement("rect",{x:u,y:c,height:h,width:f}))),t)};function iO(e,t){if(t<1)return[];if(t===1)return e;for(var r=[],n=0;ne*a)return!1;var o=r();return e*(t-e*o/2-n)>=0&&e*(t+e*o/2-a)<=0}function YV(e,t){return iO(e,t+1)}function XV(e,t,r,n,a){for(var o=(n||[]).slice(),u=t.start,c=t.end,f=0,h=1,m=u,g=function(){var j=n==null?void 0:n[f];if(j===void 0)return{v:iO(n,h)};var k=f,S,N=()=>(S===void 0&&(S=r(j,k)),S),E=j.coordinate,A=f===0||Du(e,E,N,m,c);A||(f=0,m=u,h+=1),A&&(m=E+e*(N()/2+a),f+=h)},v;h<=o.length;)if(v=g(),v)return v.v;return[]}function ZV(e,t,r,n,a){var o=(n||[]).slice(),u=o.length;if(u===0)return[];for(var c=t.start,f=t.end,h=1;h<=u;h++){for(var m=(u-1)%h,g=c,v=!0,b=function(){var P=n[k];if(P==null)return 0;var M=k,O,D=()=>(O===void 0&&(O=r(P,M)),O),B=P.coordinate,F=k===m||Du(e,B,D,g,f);if(!F)return v=!1,1;F&&(g=B+e*(D()/2+a))},j,k=m;k(k===void 0&&(k=r(b,v)),k);if(v===u-1){var N=e*(j.coordinate+e*S()/2-f);o[v]=j=nr(nr({},j),{},{tickCoord:N>0?j.coordinate-N*e:j.coordinate})}else o[v]=j=nr(nr({},j),{},{tickCoord:j.coordinate});if(j.tickCoord!=null){var E=Du(e,j.tickCoord,S,c,f);E&&(f=j.tickCoord-e*(S()/2+a),o[v]=nr(nr({},j),{},{isShow:!0}))}},m=u-1;m>=0;m--)h(m);return o}function nq(e,t,r,n,a,o){var u=(n||[]).slice(),c=u.length,f=t.start,h=t.end;if(o){var m=n[c-1];if(m!=null){var g=r(m,c-1),v=e*(m.coordinate+e*g/2-h);if(u[c-1]=m=nr(nr({},m),{},{tickCoord:v>0?m.coordinate-v*e:m.coordinate}),m.tickCoord!=null){var b=Du(e,m.tickCoord,()=>g,f,h);b&&(h=m.tickCoord-e*(g/2+a),u[c-1]=nr(nr({},m),{},{isShow:!0}))}}}for(var j=o?c-1:c,k=function(E){var A=u[E];if(A==null)return 1;var P=A,M,O=()=>(M===void 0&&(M=r(A,E)),M);if(E===0){var D=e*(P.coordinate-e*O()/2-f);u[E]=P=nr(nr({},P),{},{tickCoord:D<0?P.coordinate-D*e:P.coordinate})}else u[E]=P=nr(nr({},P),{},{tickCoord:P.coordinate});if(P.tickCoord!=null){var B=Du(e,P.tickCoord,O,f,h);B&&(f=P.tickCoord+e*(O()/2+a),u[E]=nr(nr({},P),{},{isShow:!0}))}},S=0;S{var D=typeof h=="function"?h(M.value,O):M.value;return j==="width"?qV(hu(D,{fontSize:t,letterSpacing:r}),k,g):hu(D,{fontSize:t,letterSpacing:r})[j]},N=a[0],E=a[1],A=a.length>=2&&N!=null&&E!=null?qr(E.coordinate-N.coordinate):1,P=QV(o,A,j);return f==="equidistantPreserveStart"?XV(A,P,S,a,u):f==="equidistantPreserveEnd"?ZV(A,P,S,a,u):(f==="preserveStart"||f==="preserveStartEnd"?b=nq(A,P,S,a,u,f==="preserveStartEnd"):b=rq(A,P,S,a,u),b.filter(M=>M.isShow))}var iq=e=>{var t=e.ticks,r=e.label,n=e.labelGapWithTick,a=n,o=e.tickSize,u=o===void 0?0:o,c=e.tickMargin,f=c===void 0?0:c,h=0;if(t){Array.from(t).forEach(b=>{if(b){var j=b.getBoundingClientRect();j.width>h&&(h=j.width)}});var m=r?r.getBoundingClientRect().width:0,g=u+f,v=h+g+m+(r?a:0);return Math.round(v)}return 0},aq={xAxis:{},yAxis:{}},aO=sr({name:"renderedTicks",initialState:aq,reducers:{setRenderedTicks:(e,t)=>{var r=t.payload,n=r.axisType,a=r.axisId,o=r.ticks;e[n][a]=o},removeRenderedTicks:(e,t)=>{var r=t.payload,n=r.axisType,a=r.axisId;delete e[n][a]}}}),oO=aO.actions,oq=oO.setRenderedTicks,sq=oO.removeRenderedTicks,lq=aO.reducer,uq=["axisLine","width","height","className","hide","ticks","axisType","axisId"];function g2(e,t){return hq(e)||fq(e,t)||dq(e,t)||cq()}function cq(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function dq(e,t){if(e){if(typeof e=="string")return v2(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?v2(e,t):void 0}}function v2(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{if(n==null||r==null)return qs;var o=t.map(u=>({value:u.value,coordinate:u.coordinate,offset:u.offset,index:u.index}));return a(oq({ticks:o,axisId:n,axisType:r})),()=>{a(sq({axisId:n,axisType:r}))}},[a,t,n,r]),null}var Nq=y.forwardRef((e,t)=>{var r=e.ticks,n=r===void 0?[]:r,a=e.tick,o=e.tickLine,u=e.stroke,c=e.tickFormatter,f=e.unit,h=e.padding,m=e.tickTextProps,g=e.orientation,v=e.mirror,b=e.x,j=e.y,k=e.width,S=e.height,N=e.tickSize,E=e.tickMargin,A=e.fontSize,P=e.letterSpacing,M=e.getTicksConfig,O=e.events,D=e.axisType,B=e.axisId,F=Z0(vt(vt({},M),{},{ticks:n}),A,P),z=vn(M),Y=ch(a),U=zP(z.textAnchor)?z.textAnchor:wq(g,v),me=kq(g,v),ue={};typeof o=="object"&&(ue=o);var ge=vt(vt({},z),{},{fill:"none"},ue),ie=F.map(re=>vt({entry:re},bq(re,b,j,k,S,g,N,v,E))),oe=ie.map(re=>{var J=re.entry,I=re.line;return y.createElement(Zr,{className:"recharts-cartesian-axis-tick",key:"tick-".concat(J.value,"-").concat(J.coordinate,"-").concat(J.tickCoord)},o&&y.createElement("line",vo({},ge,I,{className:rt("recharts-cartesian-axis-tick-line",wo(o,"className"))})))}),X=ie.map((re,J)=>{var I,_,W=re.entry,ee=re.tick,Z=vt(vt(vt(vt({verticalAnchor:me},z),{},{textAnchor:U,stroke:"none",fill:u},ee),{},{index:J,payload:W,visibleTicksCount:F.length,tickFormatter:c,padding:h},m),{},{angle:(I=(_=m==null?void 0:m.angle)!==null&&_!==void 0?_:z.angle)!==null&&I!==void 0?I:0}),he=vt(vt({},Z),Y);return y.createElement(Zr,vo({className:"recharts-cartesian-axis-tick-label",key:"tick-label-".concat(W.value,"-").concat(W.coordinate,"-").concat(W.tickCoord)},PR(O,W,J)),a&&y.createElement(jq,{option:a,tickProps:he,value:"".concat(typeof c=="function"?c(W.value,J):W.value).concat(f||"")}))});return y.createElement("g",{className:"recharts-cartesian-axis-ticks recharts-".concat(D,"-ticks")},y.createElement(Sq,{ticks:F,axisId:B,axisType:D}),X.length>0&&y.createElement(Ei,{zIndex:dr.label},y.createElement("g",{className:"recharts-cartesian-axis-tick-labels recharts-".concat(D,"-tick-labels"),ref:t},X)),oe.length>0&&y.createElement("g",{className:"recharts-cartesian-axis-tick-lines recharts-".concat(D,"-tick-lines")},oe))}),Eq=y.forwardRef((e,t)=>{var r=e.axisLine,n=e.width,a=e.height,o=e.className,u=e.hide,c=e.ticks,f=e.axisType,h=e.axisId,m=mq(e,uq),g=y.useState(""),v=g2(g,2),b=v[0],j=v[1],k=y.useState(""),S=g2(k,2),N=S[0],E=S[1],A=y.useRef(null);y.useImperativeHandle(t,()=>({getCalculatedWidth:()=>{var M;return iq({ticks:A.current,label:(M=e.labelRef)===null||M===void 0?void 0:M.current,labelGapWithTick:5,tickSize:e.tickSize,tickMargin:e.tickMargin})}}));var P=y.useCallback(M=>{if(M){var O=M.getElementsByClassName("recharts-cartesian-axis-tick-value");A.current=O;var D=O[0];if(D){var B=window.getComputedStyle(D),F=B.fontSize,z=B.letterSpacing;(F!==b||z!==N)&&(j(F),E(z))}}},[b,N]);return u||n!=null&&n<=0||a!=null&&a<=0?null:y.createElement(Ei,{zIndex:e.zIndex},y.createElement(Zr,{className:rt("recharts-cartesian-axis",o)},y.createElement(xq,{x:e.x,y:e.y,width:n,height:a,orientation:e.orientation,mirror:e.mirror,axisLine:r,otherSvgProps:vn(e)}),y.createElement(Nq,{ref:P,axisType:f,events:m,fontSize:b,getTicksConfig:e,height:e.height,letterSpacing:N,mirror:e.mirror,orientation:e.orientation,padding:e.padding,stroke:e.stroke,tick:e.tick,tickFormatter:e.tickFormatter,tickLine:e.tickLine,tickMargin:e.tickMargin,tickSize:e.tickSize,tickTextProps:e.tickTextProps,ticks:c,unit:e.unit,width:e.width,x:e.x,y:e.y,axisId:h}),y.createElement(YK,{x:e.x,y:e.y,width:e.width,height:e.height,lowerWidth:e.width,upperWidth:e.width},y.createElement(oG,{label:e.label,labelRef:e.labelRef}),e.children)))}),J0=y.forwardRef((e,t)=>{var r=en(e,hi);return y.createElement(Eq,vo({},r,{ref:t}))});J0.displayName="CartesianAxis";var Aq=["x1","y1","x2","y2","key"],Cq=["offset"],Pq=["xAxisId","yAxisId"],Oq=["xAxisId","yAxisId"];function x2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function ar(e){for(var t=1;t{var t=e.fill;if(!t||t==="none")return null;var r=e.fillOpacity,n=e.x,a=e.y,o=e.width,u=e.height,c=e.ry;return y.createElement("rect",{x:n,y:a,ry:c,width:o,height:u,stroke:"none",fill:t,fillOpacity:r,className:"recharts-cartesian-grid-bg"})};function sO(e){var t=e.option,r=e.lineItemProps,n;if(y.isValidElement(t))n=y.cloneElement(t,r);else if(typeof t=="function")n=t(r);else{var a,o=r.x1,u=r.y1,c=r.x2,f=r.y2,h=r.key,m=Vf(r,Aq),g=(a=vn(m))!==null&&a!==void 0?a:{};g.offset;var v=Vf(g,Cq);n=y.createElement("line",qa({},v,{x1:o,y1:u,x2:c,y2:f,fill:"none",key:h}))}return n}function Rq(e){var t=e.x,r=e.width,n=e.horizontal,a=n===void 0?!0:n,o=e.horizontalPoints;if(!a||!o||!o.length)return null;e.xAxisId,e.yAxisId;var u=Vf(e,Pq),c=o.map((f,h)=>{var m=ar(ar({},u),{},{x1:t,y1:f,x2:t+r,y2:f,key:"line-".concat(h),index:h});return y.createElement(sO,{key:"line-".concat(h),option:a,lineItemProps:m})});return y.createElement("g",{className:"recharts-cartesian-grid-horizontal"},c)}function Lq(e){var t=e.y,r=e.height,n=e.vertical,a=n===void 0?!0:n,o=e.verticalPoints;if(!a||!o||!o.length)return null;e.xAxisId,e.yAxisId;var u=Vf(e,Oq),c=o.map((f,h)=>{var m=ar(ar({},u),{},{x1:f,y1:t,x2:f,y2:t+r,key:"line-".concat(h),index:h});return y.createElement(sO,{option:a,lineItemProps:m,key:"line-".concat(h)})});return y.createElement("g",{className:"recharts-cartesian-grid-vertical"},c)}function $q(e){var t=e.horizontalFill,r=e.fillOpacity,n=e.x,a=e.y,o=e.width,u=e.height,c=e.horizontalPoints,f=e.horizontal,h=f===void 0?!0:f;if(!h||!t||!t.length||c==null)return null;var m=c.map(v=>Math.round(v+a-a)).sort((v,b)=>v-b);a!==m[0]&&m.unshift(0);var g=m.map((v,b)=>{var j=m[b+1],k=j==null,S=k?a+u-v:j-v;if(S<=0)return null;var N=b%t.length;return y.createElement("rect",{key:"react-".concat(b),y:v,x:n,height:S,width:o,stroke:"none",fill:t[N],fillOpacity:r,className:"recharts-cartesian-grid-bg"})});return y.createElement("g",{className:"recharts-cartesian-gridstripes-horizontal"},g)}function zq(e){var t=e.vertical,r=t===void 0?!0:t,n=e.verticalFill,a=e.fillOpacity,o=e.x,u=e.y,c=e.width,f=e.height,h=e.verticalPoints;if(!r||!n||!n.length)return null;var m=h.map(v=>Math.round(v+o-o)).sort((v,b)=>v-b);o!==m[0]&&m.unshift(0);var g=m.map((v,b)=>{var j=m[b+1],k=j==null,S=k?o+c-v:j-v;if(S<=0)return null;var N=b%n.length;return y.createElement("rect",{key:"react-".concat(b),x:v,y:u,width:S,height:f,stroke:"none",fill:n[N],fillOpacity:a,className:"recharts-cartesian-grid-bg"})});return y.createElement("g",{className:"recharts-cartesian-gridstripes-vertical"},g)}var Fq=(e,t)=>{var r=e.xAxis,n=e.width,a=e.height,o=e.offset;return B5(Z0(ar(ar(ar({},hi),r),{},{ticks:U5(r),viewBox:{x:0,y:0,width:n,height:a}})),o.left,o.left+o.width,t)},Bq=(e,t)=>{var r=e.yAxis,n=e.width,a=e.height,o=e.offset;return B5(Z0(ar(ar(ar({},hi),r),{},{ticks:U5(r),viewBox:{x:0,y:0,width:n,height:a}})),o.top,o.top+o.height,t)},Uq={horizontal:!0,vertical:!0,horizontalPoints:[],verticalPoints:[],stroke:"#ccc",fill:"none",verticalFill:[],horizontalFill:[],xAxisId:0,yAxisId:0,syncWithTicks:!1,zIndex:dr.grid};function lO(e){var t=Y5(),r=X5(),n=Q5(),a=ar(ar({},en(e,Uq)),{},{x:Ee(e.x)?e.x:n.left,y:Ee(e.y)?e.y:n.top,width:Ee(e.width)?e.width:n.width,height:Ee(e.height)?e.height:n.height}),o=a.xAxisId,u=a.yAxisId,c=a.x,f=a.y,h=a.width,m=a.height,g=a.syncWithTicks,v=a.horizontalValues,b=a.verticalValues,j=Nr(),k=Me(F=>wS(F,"xAxis",o,j)),S=Me(F=>wS(F,"yAxis",u,j));if(!Un(h)||!Un(m)||!Ee(c)||!Ee(f))return null;var N=a.verticalCoordinatesGenerator||Fq,E=a.horizontalCoordinatesGenerator||Bq,A=a.horizontalPoints,P=a.verticalPoints;if((!A||!A.length)&&typeof E=="function"){var M=v&&v.length,O=E({yAxis:S?ar(ar({},S),{},{ticks:M?v:S.ticks}):void 0,width:t??h,height:r??m,offset:n},M?!0:g);xf(Array.isArray(O),"horizontalCoordinatesGenerator should return Array but instead it returned [".concat(typeof O,"]")),Array.isArray(O)&&(A=O)}if((!P||!P.length)&&typeof N=="function"){var D=b&&b.length,B=N({xAxis:k?ar(ar({},k),{},{ticks:D?b:k.ticks}):void 0,width:t??h,height:r??m,offset:n},D?!0:g);xf(Array.isArray(B),"verticalCoordinatesGenerator should return Array but instead it returned [".concat(typeof B,"]")),Array.isArray(B)&&(P=B)}return y.createElement(Ei,{zIndex:a.zIndex},y.createElement("g",{className:"recharts-cartesian-grid"},y.createElement(Dq,{fill:a.fill,fillOpacity:a.fillOpacity,x:a.x,y:a.y,width:a.width,height:a.height,ry:a.ry}),y.createElement($q,qa({},a,{horizontalPoints:A})),y.createElement(zq,qa({},a,{verticalPoints:P})),y.createElement(Rq,qa({},a,{offset:n,horizontalPoints:A,xAxis:k,yAxis:S})),y.createElement(Lq,qa({},a,{offset:n,verticalPoints:P,xAxis:k,yAxis:S}))))}lO.displayName="CartesianGrid";var Hq={},uO=sr({name:"errorBars",initialState:Hq,reducers:{addErrorBar:(e,t)=>{var r=t.payload,n=r.itemId,a=r.errorBar;e[n]||(e[n]=[]),e[n].push(a)},replaceErrorBar:(e,t)=>{var r=t.payload,n=r.itemId,a=r.prev,o=r.next;e[n]&&(e[n]=e[n].map(u=>u.dataKey===a.dataKey&&u.direction===a.direction?o:u))},removeErrorBar:(e,t)=>{var r=t.payload,n=r.itemId,a=r.errorBar;e[n]&&(e[n]=e[n].filter(o=>o.dataKey!==a.dataKey||o.direction!==a.direction))}}}),ex=uO.actions;ex.addErrorBar;ex.replaceErrorBar;ex.removeErrorBar;var Wq=uO.reducer;function cO(e,t){var r,n,a=Me(h=>ji(h,e)),o=Me(h=>Si(h,t)),u=(r=a==null?void 0:a.allowDataOverflow)!==null&&r!==void 0?r:At.allowDataOverflow,c=(n=o==null?void 0:o.allowDataOverflow)!==null&&n!==void 0?n:Ct.allowDataOverflow,f=u||c;return{needClip:f,needClipX:u,needClipY:c}}function Kq(e){var t=e.xAxisId,r=e.yAxisId,n=e.clipPathId,a=X0(),o=cO(t,r),u=o.needClipX,c=o.needClipY,f=o.needClip,h=Me(A=>qC(A,t,!1)),m=Me(A=>QC(A,r,!1));if(!f||!a)return null;var g=a.x,v=a.y,b=a.width,j=a.height,k=u&&h?Math.min(h[0],h[1]):g-b/2,S=c&&m?Math.min(m[0],m[1]):v-j/2,N=u&&h?Math.abs(h[1]-h[0]):b*2,E=c&&m?Math.abs(m[1]-m[0]):j*2;return y.createElement("clipPath",{id:"clipPath-".concat(n)},y.createElement("rect",{x:k,y:S,width:N,height:E}))}function Gq(e){var t=ch(e),r=3,n=2;if(t!=null){var a=t.r,o=t.strokeWidth,u=Number(a),c=Number(o);return(Number.isNaN(u)||u<0)&&(u=r),(Number.isNaN(c)||c<0)&&(c=n),{r:u,strokeWidth:c}}return{r,strokeWidth:n}}function tx(e,t){var r,n;return(r=(n=e.graphicalItems.cartesianItems.find(a=>a.id===t))===null||n===void 0?void 0:n.xAxisId)!==null&&r!==void 0?r:eO}function rx(e,t){var r,n;return(r=(n=e.graphicalItems.cartesianItems.find(a=>a.id===t))===null||n===void 0?void 0:n.yAxisId)!==null&&r!==void 0?r:eO}var dO=(e,t,r)=>nP(e,"xAxis",tx(e,t),r),fO=(e,t,r)=>rP(e,"xAxis",tx(e,t),r),hO=(e,t,r)=>nP(e,"yAxis",rx(e,t),r),mO=(e,t,r)=>rP(e,"yAxis",rx(e,t),r),Vq=V([dt,dO,hO,fO,mO],(e,t,r,n,a)=>Gn(e,"xAxis")?yf(t,n,!1):yf(r,a,!1)),qq=(e,t)=>t,pO=V([kC,qq],(e,t)=>e.filter(r=>r.type==="area").find(r=>r.id===t)),gO=e=>{var t=dt(e),r=Gn(t,"xAxis");return r?"yAxis":"xAxis"},Qq=(e,t)=>{var r=gO(e);return r==="yAxis"?rx(e,t):tx(e,t)},Yq=(e,t,r)=>MC(e,gO(e),Qq(e,t),r),Xq=V([pO,Yq],(e,t)=>{var r;if(!(e==null||t==null)){var n=e.stackId,a=r0(e);if(!(n==null||a==null)){var o=(r=t[n])===null||r===void 0?void 0:r.stackedData,u=o==null?void 0:o.find(c=>c.key===a);if(u!=null)return u.map(c=>[c[0],c[1]])}}}),Zq=V([dt,dO,hO,fO,mO,Xq,kF,Vq,pO,zF],(e,t,r,n,a,o,u,c,f,h)=>{var m=u.chartData,g=u.dataStartIndex,v=u.dataEndIndex;if(!(f==null||e!=="horizontal"&&e!=="vertical"||t==null||r==null||n==null||a==null||n.length===0||a.length===0||c==null)){var b=f.data,j;if(b&&b.length>0?j=b:j=m==null?void 0:m.slice(g,v+1),j!=null)return SQ({layout:e,xAxis:t,yAxis:r,xAxisTicks:n,yAxisTicks:a,dataStartIndex:g,areaSettings:f,stackedData:o,displayedData:j,chartBaseValue:h,bandSize:c})}}),Jq=["animationElapsedTime","isAnimating","isEntrance","layout","isRange","stroke","connectNulls"],eQ=["id","baseLine"];function mu(){return mu=Object.assign?Object.assign.bind():function(e){for(var t=1;tg.y||0));return Ee(a)?m=Math.max(a,m):a&&Array.isArray(a)&&a.length&&(m=Math.max(...a.map(g=>g.y||0),m)),Ee(m)?y.createElement("rect",{x:cg.x||0));return Ee(a)?m=Math.max(a,m):a&&Array.isArray(a)&&a.length&&(m=Math.max(...a.map(g=>g.x||0),m)),Ee(m)?y.createElement("rect",{x:0,y:ce==null?[]:t===1?e.flatMap(r=>r.status==="removed"?[]:[r.next]):e.flatMap(r=>r.status==="matched"?[Ws(Ws({},r.next),{},{x:li(r.prev.x,r.next.x,t),y:li(r.prev.y,r.next.y,t)})]:r.status==="added"?[r.next]:[]),yO={activeDot:!0,animationBegin:0,animationDuration:1500,animationEasing:"ease",animationMatchBy:Q0,animationInterpolateFn:fQ,connectNulls:!1,dot:!1,fill:"#3182bd",fillOpacity:.6,hide:!1,isAnimationActive:"auto",legendType:"line",stroke:"#3182bd",strokeWidth:1,type:"linear",label:!1,shape:aQ,xAxisId:0,yAxisId:0,zIndex:dr.area};function Qf(e,t){return e&&e!=="none"?e:t}var hQ=e=>{var t=e.dataKey,r=e.name,n=e.stroke,a=e.fill,o=e.legendType,u=e.hide;return[{inactive:u,dataKey:t,type:o,color:Qf(n,a),value:H5(r,t),payload:e}]},mQ=y.memo(e=>{var t=e.dataKey,r=e.data,n=e.stroke,a=e.strokeWidth,o=e.fill,u=e.name,c=e.hide,f=e.unit,h=e.tooltipType,m=e.id,g={dataDefinedOnItem:r,getPosition:qs,settings:{stroke:n,strokeWidth:a,fill:o,dataKey:t,nameKey:void 0,name:H5(u,t),hide:c,type:h,color:Qf(n,o),unit:f,graphicalItemId:m}};return y.createElement(EG,{tooltipEntrySettings:g})});function pQ(e){var t=e.clipPathId,r=e.points,n=e.props,a=n.needClip,o=n.dot,u=n.dataKey,c=vn(n);return y.createElement(pV,{points:r,dot:o,className:"recharts-area-dots",dotClassName:"recharts-area-dot",dataKey:u,baseProps:c,needClip:a,clipPathId:t})}function gQ(e){var t=e.showLabels,r=e.children,n=e.points,a=n.map(o=>{var u,c,f={x:(u=o.x)!==null&&u!==void 0?u:0,y:(c=o.y)!==null&&c!==void 0?c:0,width:0,lowerWidth:0,upperWidth:0,height:0};return Ws(Ws({},f),{},{value:o.value,payload:o.payload,parentViewBox:void 0,viewBox:f,fill:void 0})});return y.createElement(dG,{value:t?a:void 0},r)}function vQ(e){var t=e.points,r=e.baseLine,n=e.needClip,a=e.clipPathId,o=e.props,u=e.animationElapsedTime,c=e.isAnimating,f=e.isEntrance,h=o.layout,m=o.type,g=o.stroke,v=o.connectNulls,b=o.isRange,j=o.shape,k=o.id,S=vO(o,oQ),N=Xr(S),E=Ws(Ws({},N),{},{id:k,points:t,connectNulls:v,type:m,baseLine:r,layout:h,stroke:g,isRange:b,animationElapsedTime:u,isAnimating:c,isEntrance:f});return y.createElement(y.Fragment,null,(t==null?void 0:t.length)>1&&y.createElement(Zr,{clipPath:n?"url(#clipPath-".concat(a,")"):void 0},y.createElement(NG,{option:j,DefaultShape:yO.shape,shapeProps:E})),y.createElement(pQ,{points:t,props:S,clipPathId:a}))}function yQ(e,t,r){if(Ee(e)){var n=Ee(t)?t:void 0;return li(n,e,r)}if(qt(e)||Fn(e)){var a=Ee(t)?t:void 0;return li(a,0,r)}return e}function xQ(e){var t=e.needClip,r=e.clipPathId,n=e.props,a=e.previousPointsRef,o=e.previousBaselineRef,u=n.points,c=n.baseLine,f=n.isAnimationActive,h=n.animationBegin,m=n.animationDuration,g=n.animationEasing,v=n.animationMatchBy,b=n.animationInterpolateFn,j=y.useMemo(()=>({points:u,baseLine:c}),[u,c]),k=XP(j,o),S=Uy(),N=HG(n.onAnimationStart,n.onAnimationEnd),E=N.isAnimating,A=N.handleAnimationStart,P=N.handleAnimationEnd,M=k.startValue;if(S==null)return null;var O;return Array.isArray(c)&&Array.isArray(M)?O=ny(M,c,v):Array.isArray(c)?O=ny(null,c,v):O=null,y.createElement(WG,{animationInput:j,animationIdPrefix:"recharts-area-",items:u,previousItemsRef:a,isAnimationActive:f,animationBegin:h,animationDuration:m,animationEasing:g,onAnimationStart:A,onAnimationEnd:P,animationInterpolateFn:b,animationMatchBy:v,layout:S},(D,B,F)=>{var z;return B===1?z=c:Array.isArray(c)?z=b(O,B,S):z=F?c:yQ(c,M,B),k.syncStepValue(z,B),y.createElement(gQ,{showLabels:!E,points:u},n.children,y.createElement(vQ,{points:D,baseLine:z,needClip:t,clipPathId:r,props:n,animationElapsedTime:B,isAnimating:E||B<1,isEntrance:F}),y.createElement(mG,{label:n.label}))})}function bQ(e){var t=e.needClip,r=e.clipPathId,n=e.props,a=y.useRef(null),o=y.useRef();return y.createElement(xQ,{needClip:t,clipPathId:r,props:n,previousPointsRef:a,previousBaselineRef:o})}class wQ extends y.PureComponent{render(){var t=this.props,r=t.hide,n=t.dot,a=t.points,o=t.className,u=t.top,c=t.left,f=t.needClip,h=t.xAxisId,m=t.yAxisId,g=t.width,v=t.height,b=t.id,j=t.baseLine,k=t.zIndex;if(r)return null;var S=rt("recharts-area",o),N=b,E=Gq(n),A=E.r,P=E.strokeWidth,M=QP(n),O=A*2+P,D=f?"url(#clipPath-".concat(M?"":"dots-").concat(N,")"):void 0;return y.createElement(Ei,{zIndex:k},y.createElement(Zr,{className:S},f&&y.createElement("defs",null,y.createElement(Kq,{clipPathId:N,xAxisId:h,yAxisId:m}),!M&&y.createElement("clipPath",{id:"clipPath-dots-".concat(N)},y.createElement("rect",{x:c-O/2,y:u-O/2,width:g+O,height:v+O}))),y.createElement(bQ,{needClip:f,clipPathId:N,props:this.props})),y.createElement(f2,{points:a,mainColor:Qf(this.props.stroke,this.props.fill),itemDataKey:this.props.dataKey,activeDot:this.props.activeDot,clipPath:D}),this.props.isRange&&Array.isArray(j)&&y.createElement(f2,{points:j,mainColor:Qf(this.props.stroke,this.props.fill),itemDataKey:this.props.dataKey,activeDot:this.props.activeDot,clipPath:D}))}}function kQ(e){var t,r=e.activeDot,n=e.animationBegin,a=e.animationDuration,o=e.animationEasing,u=e.connectNulls,c=e.dot,f=e.fill,h=e.fillOpacity,m=e.hide,g=e.isAnimationActive,v=e.legendType,b=e.stroke,j=e.xAxisId,k=e.yAxisId,S=vO(e,sQ),N=Qs(),E=EP(),A=cO(j,k),P=A.needClip,M=Nr(),O=(t=Me(ge=>Zq(ge,e.id,M)))!==null&&t!==void 0?t:{},D=O.points,B=O.isRange,F=O.baseLine,z=X0();if(N!=="horizontal"&&N!=="vertical"||z==null||E!=="AreaChart"&&E!=="ComposedChart")return null;var Y=z.height,U=z.width,me=z.x,ue=z.y;return!D||!D.length?null:y.createElement(wQ,qf({},S,{activeDot:r,animationBegin:n,animationDuration:a,animationEasing:o,baseLine:F,connectNulls:u,dot:c,fill:f,fillOpacity:h,height:Y,hide:m,layout:N,isAnimationActive:g,isRange:B,legendType:v,needClip:P,points:D,stroke:b,width:U,left:me,top:ue,xAxisId:j,yAxisId:k}))}var jQ=(e,t,r,n,a)=>{var o=r??t;if(Ee(o))return o;var u=e==="horizontal"?a:n,c=u.scale.domain();if(u.type==="number"){var f=Math.max(c[0],c[1]),h=Math.min(c[0],c[1]);return o==="dataMin"?h:o==="dataMax"||f<0?f:Math.max(Math.min(c[0],c[1]),0)}return o==="dataMin"?c[0]:o==="dataMax"?c[1]:c[0]};function SQ(e){var t=e.areaSettings,r=t.connectNulls,n=t.baseValue,a=t.dataKey,o=e.stackedData,u=e.layout,c=e.chartBaseValue,f=e.xAxis,h=e.yAxis,m=e.displayedData,g=e.dataStartIndex,v=e.xAxisTicks,b=e.yAxisTicks,j=e.bandSize,k=o&&o.length,S=jQ(u,c,n,f,h),N=u==="horizontal",E=!1,A=m.map((M,O)=>{var D,B,F,z;if(k)z=o[g+O];else{var Y=Rt(M,a);Array.isArray(Y)?(z=Y,E=!0):z=[S,Y]}var U=(D=(B=z)===null||B===void 0?void 0:B[1])!==null&&D!==void 0?D:null,me=U==null||k&&!r&&Rt(M,a)==null;if(N){var ue;return{x:gk({axis:f,ticks:v,bandSize:j,entry:M,index:O}),y:me?null:(ue=h.scale.map(U))!==null&&ue!==void 0?ue:null,value:z,payload:M}}return{x:me?null:(F=f.scale.map(U))!==null&&F!==void 0?F:null,y:gk({axis:h,ticks:b,bandSize:j,entry:M,index:O}),value:z,payload:M}}),P;return k||E?P=A.map(M=>{var O,D=Array.isArray(M.value)?M.value[0]:null;if(N){var B;return{x:M.x,y:D!=null&&M.y!=null&&(B=h.scale.map(D))!==null&&B!==void 0?B:null,payload:M.payload}}return{x:D!=null&&(O=f.scale.map(D))!==null&&O!==void 0?O:null,y:M.y,payload:M.payload}}):P=N?h.scale.map(S):f.scale.map(S),{points:A,baseLine:P??0,isRange:E}}function NQ(e){var t=en(e,yO),r=Nr();return y.createElement(JG,{id:t.id,type:"area"},n=>y.createElement(y.Fragment,null,y.createElement(AG,{legendPayload:hQ(t)}),y.createElement(mQ,{dataKey:t.dataKey,data:t.data,stroke:t.stroke,strokeWidth:t.strokeWidth,fill:t.fill,name:t.name,hide:t.hide,unit:t.unit,tooltipType:t.tooltipType,id:n}),y.createElement(oV,{type:"area",id:n,data:t.data,dataKey:t.dataKey,xAxisId:t.xAxisId,yAxisId:t.yAxisId,zAxisId:0,stackId:lz(t.stackId),hide:t.hide,barSize:void 0,baseValue:t.baseValue,isPanorama:r,connectNulls:t.connectNulls}),y.createElement(kQ,qf({},t,{id:n}))))}var xO=y.memo(NQ,Mh);xO.displayName="Area";var EQ=["domain","range"],AQ=["domain","range"];function k2(e,t){if(e==null)return{};var r,n,a=CQ(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n{if(u!=null)return N2(N2({},o),{},{type:u})},[o,u]);return y.useLayoutEffect(()=>{c!=null&&(r.current===null?t(bV(c)):r.current!==c&&t(wV({prev:r.current,next:c})),r.current=c)},[c,t]),y.useLayoutEffect(()=>()=>{r.current&&(t(kV(r.current)),r.current=null)},[t]),null}var LQ=e=>{var t=e.xAxisId,r=e.className,n=Me(K5),a=Nr(),o="xAxis",u=Me(v=>tP(v,o,t,a)),c=Me(v=>vU(v,t)),f=Me(v=>jU(v,t)),h=Me(v=>yC(v,t));if(c==null||f==null||h==null)return null;e.dangerouslySetInnerHTML,e.ticks,e.scale;var m=ay(e,OQ);h.id,h.scale;var g=ay(h,_Q);return y.createElement(J0,iy({},m,g,{x:f.x,y:f.y,width:c.width,height:c.height,className:rt("recharts-".concat(o," ").concat(o),r),viewBox:n,ticks:u,axisType:o,axisId:t}))},$Q={allowDataOverflow:At.allowDataOverflow,allowDecimals:At.allowDecimals,allowDuplicatedCategory:At.allowDuplicatedCategory,angle:At.angle,axisLine:hi.axisLine,height:At.height,hide:!1,includeHidden:At.includeHidden,interval:At.interval,label:!1,minTickGap:At.minTickGap,mirror:At.mirror,orientation:At.orientation,padding:At.padding,reversed:At.reversed,scale:At.scale,tick:At.tick,tickCount:At.tickCount,tickLine:hi.tickLine,tickSize:hi.tickSize,type:At.type,niceTicks:At.niceTicks,xAxisId:0},zQ=e=>{var t=en(e,$Q);return y.createElement(y.Fragment,null,y.createElement(RQ,{allowDataOverflow:t.allowDataOverflow,allowDecimals:t.allowDecimals,allowDuplicatedCategory:t.allowDuplicatedCategory,angle:t.angle,dataKey:t.dataKey,domain:t.domain,height:t.height,hide:t.hide,id:t.xAxisId,includeHidden:t.includeHidden,interval:t.interval,minTickGap:t.minTickGap,mirror:t.mirror,name:t.name,orientation:t.orientation,padding:t.padding,reversed:t.reversed,scale:t.scale,tick:t.tick,tickCount:t.tickCount,tickFormatter:t.tickFormatter,ticks:t.ticks,type:t.type,unit:t.unit,niceTicks:t.niceTicks}),y.createElement(LQ,t))},wO=y.memo(zQ,bO);wO.displayName="XAxis";var FQ=["type"],BQ=["dangerouslySetInnerHTML","ticks","scale"],UQ=["id","scale"];function oy(){return oy=Object.assign?Object.assign.bind():function(e){for(var t=1;t{if(u!=null)return A2(A2({},o),{},{type:u})},[u,o]);return y.useLayoutEffect(()=>{c!=null&&(r.current===null?t(jV(c)):r.current!==c&&t(SV({prev:r.current,next:c})),r.current=c)},[c,t]),y.useLayoutEffect(()=>()=>{r.current&&(t(NV(r.current)),r.current=null)},[t]),null}function qQ(e){var t=e.yAxisId,r=e.className,n=e.width,a=e.label,o=y.useRef(null),u=y.useRef(null),c=Me(K5),f=Nr(),h=St(),m="yAxis",g=Me(N=>EU(N,t)),v=Me(N=>NU(N,t)),b=Me(N=>tP(N,m,t,f)),j=Me(N=>xC(N,t));if(y.useLayoutEffect(()=>{if(!(n!=="auto"||!g||q0(a)||y.isValidElement(a)||j==null)){var N=o.current;if(N){var E=N.getCalculatedWidth();Math.round(g.width)!==Math.round(E)&&h(EV({id:t,width:E}))}}},[b,g,h,a,t,n,j]),g==null||v==null||j==null)return null;e.dangerouslySetInnerHTML,e.ticks,e.scale;var k=sy(e,BQ);j.id,j.scale;var S=sy(j,UQ);return y.createElement(J0,oy({},k,S,{ref:o,labelRef:u,x:v.x,y:v.y,tickTextProps:n==="auto"?{width:void 0}:{width:n},width:g.width,height:g.height,className:rt("recharts-".concat(m," ").concat(m),r),viewBox:c,ticks:b,axisType:m,axisId:t}))}var QQ={allowDataOverflow:Ct.allowDataOverflow,allowDecimals:Ct.allowDecimals,allowDuplicatedCategory:Ct.allowDuplicatedCategory,angle:Ct.angle,axisLine:hi.axisLine,hide:!1,includeHidden:Ct.includeHidden,interval:Ct.interval,label:!1,minTickGap:Ct.minTickGap,mirror:Ct.mirror,orientation:Ct.orientation,padding:Ct.padding,reversed:Ct.reversed,scale:Ct.scale,tick:Ct.tick,tickCount:Ct.tickCount,tickLine:hi.tickLine,tickSize:hi.tickSize,type:Ct.type,niceTicks:Ct.niceTicks,width:Ct.width,yAxisId:0},YQ=e=>{var t=en(e,QQ);return y.createElement(y.Fragment,null,y.createElement(VQ,{interval:t.interval,id:t.yAxisId,scale:t.scale,type:t.type,domain:t.domain,allowDataOverflow:t.allowDataOverflow,dataKey:t.dataKey,allowDuplicatedCategory:t.allowDuplicatedCategory,allowDecimals:t.allowDecimals,tickCount:t.tickCount,padding:t.padding,includeHidden:t.includeHidden,reversed:t.reversed,ticks:t.ticks,width:t.width,orientation:t.orientation,mirror:t.mirror,hide:t.hide,unit:t.unit,name:t.name,angle:t.angle,minTickGap:t.minTickGap,tick:t.tick,tickFormatter:t.tickFormatter,niceTicks:t.niceTicks}),y.createElement(qQ,t))},kO=y.memo(YQ,bO);kO.displayName="YAxis";var XQ=(e,t)=>t,nx=V([XQ,dt,IA,zt,bP,Ni,qH,Yt],tW);function ZQ(e){return"getBBox"in e.currentTarget&&typeof e.currentTarget.getBBox=="function"}function ix(e){var t=e.currentTarget.getBoundingClientRect(),r,n;if(ZQ(e)){var a=e.currentTarget.getBBox();r=a.width>0?t.width/a.width:1,n=a.height>0?t.height/a.height:1}else{var o=e.currentTarget;r=o.offsetWidth>0?t.width/o.offsetWidth:1,n=o.offsetHeight>0?t.height/o.offsetHeight:1}var u=(c,f)=>({relativeX:Math.round((c-t.left)/r),relativeY:Math.round((f-t.top)/n)});return"touches"in e?Array.from(e.touches).map(c=>u(c.clientX,c.clientY)):u(e.clientX,e.clientY)}var jO=$r("mouseClick"),SO=Ku();SO.startListening({actionCreator:jO,effect:(e,t)=>{var r=e.payload,n=nx(t.getState(),ix(r));(n==null?void 0:n.activeIndex)!=null&&t.dispatch(BU({activeIndex:n.activeIndex,activeDataKey:void 0,activeCoordinate:n.activeCoordinate}))}});var ly=$r("mouseMove"),NO=Ku(),as=null,Ta=null,Dg=null;NO.startListening({actionCreator:ly,effect:(e,t)=>{var r=e.payload,n=t.getState(),a=n.eventSettings,o=a.throttleDelay,u=a.throttledEvents,c=u==="all"||(u==null?void 0:u.includes("mousemove"));as!==null&&(cancelAnimationFrame(as),as=null),Ta!==null&&(typeof o!="number"||!c)&&(clearTimeout(Ta),Ta=null),Dg=ix(r);var f=()=>{var h=t.getState(),m=ic(h,h.tooltip.settings.shared);if(!Dg){as=null,Ta=null;return}if(m==="axis"){var g=nx(h,Dg);(g==null?void 0:g.activeIndex)!=null?t.dispatch(cP({activeIndex:g.activeIndex,activeDataKey:void 0,activeCoordinate:g.activeCoordinate})):t.dispatch(uP())}as=null,Ta=null};if(!c){f();return}o==="raf"?as=requestAnimationFrame(f):typeof o=="number"&&Ta===null&&(Ta=setTimeout(f,o))}});function JQ(e,t){return t instanceof HTMLElement?"HTMLElement <".concat(t.tagName,' class="').concat(t.className,'">'):t===window?"global.window":e==="children"&&typeof t=="object"&&t!==null?"<>":t}var C2={accessibilityLayer:!0,barCategoryGap:"10%",barGap:4,barSize:void 0,className:void 0,maxBarSize:void 0,stackOffset:"none",syncId:void 0,syncMethod:"index",baseValue:void 0,reverseStackOrder:!1},EO=sr({name:"rootProps",initialState:C2,reducers:{updateOptions:(e,t)=>{var r;e.accessibilityLayer=t.payload.accessibilityLayer,e.barCategoryGap=t.payload.barCategoryGap,e.barGap=(r=t.payload.barGap)!==null&&r!==void 0?r:C2.barGap,e.barSize=t.payload.barSize,e.maxBarSize=t.payload.maxBarSize,e.stackOffset=t.payload.stackOffset,e.syncId=t.payload.syncId,e.syncMethod=t.payload.syncMethod,e.className=t.payload.className,e.baseValue=t.payload.baseValue,e.reverseStackOrder=t.payload.reverseStackOrder}}}),eY=EO.reducer,tY=EO.actions.updateOptions,rY=null,nY={updatePolarOptions:(e,t)=>e===null?t.payload:(e.startAngle=t.payload.startAngle,e.endAngle=t.payload.endAngle,e.cx=t.payload.cx,e.cy=t.payload.cy,e.innerRadius=t.payload.innerRadius,e.outerRadius=t.payload.outerRadius,e)},AO=sr({name:"polarOptions",initialState:rY,reducers:nY});AO.actions.updatePolarOptions;var iY=AO.reducer,CO=$r("keyDown"),PO=$r("focus"),OO=$r("blur"),Zh=Ku(),os=null,Da=null,$d=null;Zh.startListening({actionCreator:CO,effect:(e,t)=>{$d=e.payload,os!==null&&(cancelAnimationFrame(os),os=null);var r=t.getState(),n=r.eventSettings,a=n.throttleDelay,o=n.throttledEvents,u=o==="all"||o.includes("keydown");Da!==null&&(typeof a!="number"||!u)&&(clearTimeout(Da),Da=null);var c=()=>{try{var f=t.getState(),h=f.rootProps.accessibilityLayer!==!1;if(!h)return;var m=f.tooltip.keyboardInteraction,g=$d;if(g!=="ArrowRight"&&g!=="ArrowLeft"&&g!=="Enter")return;var v=fu(m,go(f),Us(f),Hs(f)),b=v==null?-1:Number(v),j=!Number.isFinite(b)||b<0,k=Ni(f),S=go(f),N=ic(f,f.tooltip.settings.shared);if(g==="Enter"){if(j)return;var E=Hf(f,N,"hover",String(m.index));t.dispatch(Uf({active:!m.active,activeIndex:m.index,activeCoordinate:E}));return}var A=_U(f),P=A==="left-to-right"?1:-1,M=g==="ArrowRight"?1:-1,O;if(j){var D=Us(f),B=Hs(f),F=M*P,z=ge=>({active:!1,index:String(ge),dataKey:void 0,graphicalItemId:void 0,coordinate:void 0});if(O=-1,F>0){for(var Y=0;Y=0;U--)if(fu(z(U),S,D,B)!=null){O=U;break}if(O<0)return}else{O=b+M*P;var me=(k==null?void 0:k.length)||S.length;if(me===0||O>=me||O<0)return}var ue=Hf(f,N,"hover",String(O));t.dispatch(Uf({active:!0,activeIndex:O.toString(),activeCoordinate:ue}))}finally{os=null,Da=null}};if(!u){c();return}a==="raf"?os=requestAnimationFrame(c):typeof a=="number"&&Da===null&&(c(),$d=null,Da=setTimeout(()=>{$d?c():(Da=null,os=null)},a))}});Zh.startListening({actionCreator:PO,effect:(e,t)=>{var r=t.getState(),n=r.rootProps.accessibilityLayer!==!1;if(n){var a=r.tooltip.keyboardInteraction;if(!a.active&&a.index==null){var o="0",u=ic(r,r.tooltip.settings.shared),c=Hf(r,u,"hover",String(o));t.dispatch(Uf({active:!0,activeIndex:o,activeCoordinate:c}))}}}});Zh.startListening({actionCreator:OO,effect:(e,t)=>{var r=t.getState(),n=r.rootProps.accessibilityLayer!==!1;if(n){var a=r.tooltip.keyboardInteraction;a.active&&t.dispatch(Uf({active:!1,activeIndex:a.index,activeCoordinate:a.coordinate}))}}});function _O(e){e.persist();var t=e.currentTarget;return new Proxy(e,{get:(r,n)=>{if(n==="currentTarget")return t;var a=Reflect.get(r,n);return typeof a=="function"?a.bind(r):a}})}var Gr=$r("externalEvent"),MO=Ku(),zd=new Map,ru=new Map,Rg=new Map;MO.startListening({actionCreator:Gr,effect:(e,t)=>{var r=e.payload,n=r.handler,a=r.reactEvent;if(n!=null){var o=a.type,u=_O(a);Rg.set(o,{handler:n,reactEvent:u});var c=zd.get(o);c!==void 0&&(cancelAnimationFrame(c),zd.delete(o));var f=t.getState(),h=f.eventSettings,m=h.throttleDelay,g=h.throttledEvents,v=g,b=v==="all"||(v==null?void 0:v.includes(o)),j=ru.get(o);j!==void 0&&(typeof m!="number"||!b)&&(clearTimeout(j),ru.delete(o));var k=()=>{var E=Rg.get(o);try{if(!E)return;var A=E.handler,P=E.reactEvent,M=t.getState(),O={activeCoordinate:IH(M),activeDataKey:OH(M),activeIndex:Iu(M),activeLabel:jP(M),activeTooltipIndex:Iu(M),isTooltipActive:TH(M)};A&&A(O,P)}finally{zd.delete(o),ru.delete(o),Rg.delete(o)}};if(!b){k();return}if(m==="raf"){var S=requestAnimationFrame(k);zd.set(o,S)}else if(typeof m=="number"){if(!ru.has(o)){k();var N=setTimeout(k,m);ru.set(o,N)}}else k()}}});var aY=V([nl],e=>e.tooltipItemPayloads),oY=V([aY,(e,t)=>t,(e,t,r)=>r],(e,t,r)=>{if(t!=null){var n=e.find(o=>o.settings.graphicalItemId===r);if(n!=null){var a=n.getPosition;if(a!=null)return a(t)}}}),IO=$r("touchMove"),TO=Ku(),Ra=null,qi=null,P2=null,nu=null;TO.startListening({actionCreator:IO,effect:(e,t)=>{var r=e.payload;if(!(r.touches==null||r.touches.length===0)){nu=_O(r);var n=t.getState(),a=n.eventSettings,o=a.throttleDelay,u=a.throttledEvents,c=u==="all"||u.includes("touchmove");Ra!==null&&(cancelAnimationFrame(Ra),Ra=null),qi!==null&&(typeof o!="number"||!c)&&(clearTimeout(qi),qi=null),P2=Array.from(r.touches).map(h=>ix({clientX:h.clientX,clientY:h.clientY,currentTarget:r.currentTarget}));var f=()=>{if(nu!=null){var h=t.getState(),m=ic(h,h.tooltip.settings.shared);if(m==="axis"){var g,v=(g=P2)===null||g===void 0?void 0:g[0];if(v==null){Ra=null,qi=null;return}var b=nx(h,v);(b==null?void 0:b.activeIndex)!=null&&t.dispatch(cP({activeIndex:b.activeIndex,activeDataKey:void 0,activeCoordinate:b.activeCoordinate}))}else if(m==="item"){var j,k=nu.touches[0];if(document.elementFromPoint==null||k==null)return;var S=document.elementFromPoint(k.clientX,k.clientY);if(!S||!S.getAttribute)return;var N=S.getAttribute(pz),E=(j=S.getAttribute(gz))!==null&&j!==void 0?j:void 0,A=So(h).find(O=>O.id===E);if(N==null||A==null||E==null)return;var P=A.dataKey,M=oY(h,N,E);t.dispatch(FU({activeDataKey:P,activeIndex:N,activeCoordinate:M,activeGraphicalItemId:E}))}Ra=null,qi=null}};if(!c){f();return}o==="raf"?Ra=requestAnimationFrame(f):typeof o=="number"&&qi===null&&(f(),nu=null,qi=setTimeout(()=>{nu?f():(qi=null,Ra=null)},o))}}});var DO={throttleDelay:"raf",throttledEvents:["mousemove","touchmove","pointermove","scroll","wheel"]},RO=sr({name:"eventSettings",initialState:DO,reducers:{setEventSettings:(e,t)=>{t.payload.throttleDelay!=null&&(e.throttleDelay=t.payload.throttleDelay),t.payload.throttledEvents!=null&&(e.throttledEvents=t.payload.throttledEvents)}}}),sY=RO.actions.setEventSettings,lY=RO.reducer,uY=f5({brush:RV,cartesianAxis:AV,chartData:MW,errorBars:Wq,eventSettings:lY,graphicalItems:iV,layout:J$,legend:h6,options:AW,polarAxis:gG,polarOptions:iY,referenceElements:FV,renderedTicks:lq,rootProps:eY,tooltip:UU,zIndex:mW}),cY=function(t){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"Chart";return S$({reducer:uY,preloadedState:t,middleware:n=>{var a;return n({serializableCheck:!1,immutableCheck:!["commonjs","es6","production"].includes((a="es6")!==null&&a!==void 0?a:"")}).concat([SO.middleware,NO.middleware,Zh.middleware,MO.middleware,TO.middleware])},enhancers:n=>{var a=n;return typeof n=="function"&&(a=n()),a.concat(A5({type:"raf"}))},devTools:{serialize:{replacer:JQ},name:"recharts-".concat(r)}})};function dY(e){var t=e.preloadedState,r=e.children,n=e.reduxStoreName,a=Nr(),o=y.useRef(null);if(a)return r;o.current==null&&(o.current=cY(t,n));var u=Iy;return y.createElement(P6,{context:u,store:o.current},r)}function fY(e){var t=e.layout,r=e.margin,n=St(),a=Nr();return y.useEffect(()=>{a||(n(Y$(t)),n(Q$(r)))},[n,a,t,r]),null}var hY=y.memo(fY,Mh);function mY(e){var t=St();return y.useEffect(()=>{t(tY(e))},[t,e]),null}var pY=e=>{var t=St();return y.useEffect(()=>{t(sY(e))},[t,e]),null},gY=y.memo(pY,Mh);function O2(e){var t=e.zIndex,r=e.isPanorama,n=y.useRef(null),a=St();return y.useLayoutEffect(()=>(n.current&&a(fW({zIndex:t,element:n.current,isPanorama:r})),()=>{a(hW({zIndex:t,isPanorama:r}))}),[a,t,r]),y.createElement("g",{tabIndex:-1,ref:n,className:"recharts-zIndex-layer_".concat(t)})}function _2(e){var t=e.children,r=e.isPanorama,n=Me(nW);if(!n||n.length===0)return t;var a=n.filter(u=>u<0),o=n.filter(u=>u>0);return y.createElement(y.Fragment,null,a.map(u=>y.createElement(O2,{key:u,zIndex:u,isPanorama:r})),t,o.map(u=>y.createElement(O2,{key:u,zIndex:u,isPanorama:r})))}var vY=["children"];function yY(e,t){if(e==null)return{};var r,n,a=xY(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n{var r=Y5(),n=X5(),a=sA();if(!Un(r)||!Un(n))return null;var o=e.children,u=e.otherAttributes,c=e.title,f=e.desc,h,m;return u!=null&&(typeof u.tabIndex=="number"?h=u.tabIndex:h=a?0:void 0,typeof u.role=="string"?m=u.role:m=a?"application":void 0),y.createElement(OE,Yf({},u,{title:c,desc:f,role:m,tabIndex:h,width:r,height:n,style:bY,ref:t}),o)}),kY=e=>{var t=e.children,r=Me(Ah);if(!r)return null;var n=r.width,a=r.height,o=r.y,u=r.x;return y.createElement(OE,{width:n,height:a,x:u,y:o},t)},M2=y.forwardRef((e,t)=>{var r=e.children,n=yY(e,vY),a=Nr();return a?y.createElement(kY,null,y.createElement(_2,{isPanorama:!0},r)):y.createElement(wY,Yf({ref:t},n),y.createElement(_2,{isPanorama:!1},r))});function jY(e,t){return AY(e)||EY(e,t)||NY(e,t)||SY()}function SY(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function NY(e,t){if(e){if(typeof e=="string")return I2(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?I2(e,t):void 0}}function I2(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{if(n!=null){var u=n.getBoundingClientRect(),c=u.width/n.offsetWidth;He(c)&&c!==o&&e(Z$(c))}},[n,e,o]),a}function T2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function PY(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);r(BW(),null);function Zf(e){if(typeof e=="number")return e;if(typeof e=="string"){var t=parseFloat(e);if(!Number.isNaN(t))return t}return 0}var $Y=y.forwardRef((e,t)=>{var r,n,a=y.useRef(null),o=y.useState({containerWidth:Zf((r=e.style)===null||r===void 0?void 0:r.width),containerHeight:Zf((n=e.style)===null||n===void 0?void 0:n.height)}),u=Xf(o,2),c=u[0],f=u[1],h=y.useCallback((g,v)=>{f(b=>{var j=Math.round(g),k=Math.round(v);return b.containerWidth===j&&b.containerHeight===k?b:{containerWidth:j,containerHeight:k}})},[]),m=y.useCallback(g=>{if(typeof t=="function"&&t(g),a.current!=null&&(a.current.disconnect(),a.current=null),g!=null&&typeof ResizeObserver<"u"){var v=g.getBoundingClientRect(),b=v.width,j=v.height;h(b,j);var k=N=>{var E=N[0];if(E!=null){var A=E.contentRect,P=A.width,M=A.height;h(P,M)}},S=new ResizeObserver(k);S.observe(g),a.current=S}},[t,h]);return y.useEffect(()=>()=>{var g=a.current;g!=null&&g.disconnect()},[h]),y.createElement(y.Fragment,null,y.createElement(Vu,{width:c.containerWidth,height:c.containerHeight}),y.createElement("div",ha({ref:m},e)))}),zY=y.forwardRef((e,t)=>{var r=e.width,n=e.height,a=y.useState({containerWidth:Zf(r),containerHeight:Zf(n)}),o=Xf(a,2),u=o[0],c=o[1],f=y.useCallback((m,g)=>{c(v=>{var b=Math.round(m),j=Math.round(g);return v.containerWidth===b&&v.containerHeight===j?v:{containerWidth:b,containerHeight:j}})},[]),h=y.useCallback(m=>{if(typeof t=="function"&&t(m),m!=null){var g=m.getBoundingClientRect(),v=g.width,b=g.height;f(v,b)}},[t,f]);return y.createElement(y.Fragment,null,y.createElement(Vu,{width:u.containerWidth,height:u.containerHeight}),y.createElement("div",ha({ref:h},e)))}),FY=y.forwardRef((e,t)=>{var r=e.width,n=e.height;return y.createElement(y.Fragment,null,y.createElement(Vu,{width:r,height:n}),y.createElement("div",ha({ref:t},e)))}),BY=y.forwardRef((e,t)=>{var r=e.width,n=e.height;return typeof r=="string"||typeof n=="string"?y.createElement(zY,ha({},e,{ref:t})):typeof r=="number"&&typeof n=="number"?y.createElement(FY,ha({},e,{width:r,height:n,ref:t})):y.createElement(y.Fragment,null,y.createElement(Vu,{width:r,height:n}),y.createElement("div",ha({ref:t},e)))});function UY(e){return e?$Y:BY}var HY=y.forwardRef((e,t)=>{var r=e.children,n=e.className,a=e.height,o=e.onClick,u=e.onContextMenu,c=e.onDoubleClick,f=e.onMouseDown,h=e.onMouseEnter,m=e.onMouseLeave,g=e.onMouseMove,v=e.onMouseUp,b=e.onTouchEnd,j=e.onTouchMove,k=e.onTouchStart,S=e.style,N=e.width,E=e.responsive,A=e.dispatchTouchEvents,P=A===void 0?!0:A,M=y.useRef(null),O=St(),D=y.useState(null),B=Xf(D,2),F=B[0],z=B[1],Y=y.useState(null),U=Xf(Y,2),me=U[0],ue=U[1],ge=CY(),ie=Fy(),oe=(ie==null?void 0:ie.width)>0?ie.width:N,X=(ie==null?void 0:ie.height)>0?ie.height:a,re=y.useCallback(Oe=>{ge(Oe),typeof t=="function"&&t(Oe),z(Oe),ue(Oe),Oe!=null&&(M.current=Oe)},[ge,t,z,ue]),J=y.useCallback(Oe=>{O(jO(Oe)),O(Gr({handler:o,reactEvent:Oe}))},[O,o]),I=y.useCallback(Oe=>{O(ly(Oe)),O(Gr({handler:h,reactEvent:Oe}))},[O,h]),_=y.useCallback(Oe=>{O(uP()),O(Gr({handler:m,reactEvent:Oe}))},[O,m]),W=y.useCallback(Oe=>{O(ly(Oe)),O(Gr({handler:g,reactEvent:Oe}))},[O,g]),ee=y.useCallback(()=>{O(PO())},[O]),Z=y.useCallback(()=>{O(OO())},[O]),he=y.useCallback(Oe=>{O(CO(Oe.key))},[O]),pe=y.useCallback(Oe=>{O(Gr({handler:u,reactEvent:Oe}))},[O,u]),Pe=y.useCallback(Oe=>{O(Gr({handler:c,reactEvent:Oe}))},[O,c]),ne=y.useCallback(Oe=>{O(Gr({handler:f,reactEvent:Oe}))},[O,f]),we=y.useCallback(Oe=>{O(Gr({handler:v,reactEvent:Oe}))},[O,v]),_e=y.useCallback(Oe=>{O(Gr({handler:k,reactEvent:Oe}))},[O,k]),le=y.useCallback(Oe=>{P&&O(IO(Oe)),O(Gr({handler:j,reactEvent:Oe}))},[O,P,j]),Ze=y.useCallback(Oe=>{O(Gr({handler:b,reactEvent:Oe}))},[O,b]),Be=UY(E);return y.createElement(_P.Provider,{value:F},y.createElement(nR.Provider,{value:me},y.createElement(Be,{width:oe??(S==null?void 0:S.width),height:X??(S==null?void 0:S.height),className:rt("recharts-wrapper",n),style:PY({position:"relative",cursor:"default",width:oe,height:X},S),onClick:J,onContextMenu:pe,onDoubleClick:Pe,onFocus:ee,onBlur:Z,onKeyDown:he,onMouseDown:ne,onMouseEnter:I,onMouseLeave:_,onMouseMove:W,onMouseUp:we,onTouchEnd:Ze,onTouchMove:le,onTouchStart:_e,ref:re},y.createElement(LY,null),r)))}),WY=["width","height","responsive","children","className","style","compact","title","desc"];function KY(e,t){if(e==null)return{};var r,n,a=GY(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n{var r=e.width,n=e.height,a=e.responsive,o=e.children,u=e.className,c=e.style,f=e.compact,h=e.title,m=e.desc,g=KY(e,WY),v=vn(g);return f?y.createElement(y.Fragment,null,y.createElement(Vu,{width:r,height:n}),y.createElement(M2,{otherAttributes:v,title:h,desc:m},o)):y.createElement(HY,{className:u,style:c,width:r,height:n,responsive:a??!1,onClick:e.onClick,onMouseLeave:e.onMouseLeave,onMouseEnter:e.onMouseEnter,onMouseMove:e.onMouseMove,onMouseDown:e.onMouseDown,onMouseUp:e.onMouseUp,onContextMenu:e.onContextMenu,onDoubleClick:e.onDoubleClick,onTouchStart:e.onTouchStart,onTouchMove:e.onTouchMove,onTouchEnd:e.onTouchEnd},y.createElement(M2,{otherAttributes:v,title:h,desc:m,ref:t},y.createElement(VV,null,o)))});function uy(){return uy=Object.assign?Object.assign.bind():function(e){for(var t=1;ty.createElement(eX,{chartName:"AreaChart",defaultTooltipEventType:"axis",validateTooltipEventTypes:tX,tooltipPayloadSearcher:NW,categoricalChartProps:e,ref:t}));const nX="rgba(130,130,150,0.14)",L2="rgba(130,130,150,0.85)";function iX(e){if(e<=0)return 10;const t=Math.pow(10,Math.floor(Math.log10(e))),r=e/t;return(r<=1?1:r<=2?2:r<=5?5:10)*t}function LO(e,t){return`${t==="%"?Math.round(e):e>=1e3?`${(e/1e3).toFixed(1)}k`:Math.round(e).toString()}${t}`}function aX({active:e,payload:t,unit:r}){return!e||!(t!=null&&t.length)?null:l.jsx("div",{className:"rounded-lg border border-border/70 bg-popover/95 px-3 py-2 shadow-xl backdrop-blur",children:l.jsx("div",{className:"space-y-1",children:t.map(n=>l.jsxs("div",{className:"flex items-center gap-2 text-[11px] font-mono",children:[l.jsx("span",{className:"h-2 w-2 rounded-full",style:{background:n.color}}),l.jsx("span",{className:"uppercase tracking-wider text-muted-foreground",children:n.name}),l.jsx("span",{className:"ml-auto pl-3 font-bold tabular-nums text-foreground",children:LO(n.value,r)})]},n.dataKey))})})}function $O({data:e,series:t,unit:r="%",yMode:n="percent",height:a=176}){const o=e.reduce((c,f)=>t.reduce((h,m)=>Math.max(h,Number(f[m.key])||0),c),0),u=n==="percent"?Math.min(100,Math.max(25,Math.ceil(o*1.2/25)*25)):Math.max(iX(o*1.15),10);return l.jsx("div",{style:{height:a},className:"w-full",children:l.jsx(Qz,{width:"100%",height:"100%",children:l.jsxs(rX,{data:e,margin:{top:8,right:6,bottom:0,left:-12},children:[l.jsx("defs",{children:t.map(c=>l.jsxs("linearGradient",{id:`grad-${c.key}`,x1:"0",y1:"0",x2:"0",y2:"1",children:[l.jsx("stop",{offset:"0%",stopColor:c.color,stopOpacity:.22}),l.jsx("stop",{offset:"100%",stopColor:c.color,stopOpacity:0})]},c.key))}),l.jsx(lO,{vertical:!1,stroke:nX}),l.jsx(wO,{dataKey:"t",hide:!0}),l.jsx(kO,{domain:[0,u],ticks:[0,u/2,u],tickFormatter:c=>LO(c,r),width:42,axisLine:!1,tickLine:!1,tick:{fontSize:10,fill:L2}}),l.jsx(eK,{content:l.jsx(aX,{unit:r}),cursor:{stroke:L2,strokeOpacity:.4,strokeDasharray:"3 3"}}),t.map(c=>l.jsx(xO,{type:"monotone",dataKey:c.key,name:c.label,stroke:c.color,strokeWidth:2,fill:`url(#grad-${c.key})`,dot:!1,activeDot:{r:3,strokeWidth:0},isAnimationActive:!1,connectNulls:!0},c.key))]})})})}const oX=[{key:"cpu",label:"CPU",color:"#2dd4bf"},{key:"ram",label:"RAM",color:"#38bdf8"},{key:"gpu",label:"GPU",color:"#a78bfa"},{key:"disk",label:"Disk",color:"#fbbf24"}];function zO(){var u,c,f,h;const{sys:e,hist:t}=KD(),r=!!(e!=null&&e.gpu&&e.gpu.busy_percent!=null&&e.gpu.gtt_used!=null&&e.gpu.gtt_total!=null),n=oX.filter(m=>m.key!=="gpu"||r),a={cpu:(u=e==null?void 0:e.cpu)==null?void 0:u.percent,ram:(c=e==null?void 0:e.ram)==null?void 0:c.percent,gpu:r?e.gpu.busy_percent:null,disk:(f=e==null?void 0:e.disk)==null?void 0:f.percent},o={cpu:(h=e==null?void 0:e.cpu)!=null&&h.cores?`${e.cpu.cores} Cores`:"",ram:e?`${Xi(e.ram.used)}/${Xi(e.ram.total)} GB`:"",gpu:r?`${Xi(e.gpu.gtt_used)}/${Xi(e.gpu.gtt_total)} GB`:"",disk:e!=null&&e.disk?`${Xi(e.disk.used)}/${Xi(e.disk.total)} GB`:""};return l.jsxs("div",{className:"flex flex-col justify-between rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"mb-3 flex items-center gap-2",children:[l.jsx($n,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"System-Status"}),l.jsxs("span",{className:"ml-1 inline-flex items-center gap-1 text-[10px] font-medium text-muted-foreground/70",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"})," live"]})]}),e?l.jsxs(l.Fragment,{children:[l.jsx("div",{className:"mb-2 grid grid-cols-2 gap-x-4 gap-y-1.5",children:n.map(m=>l.jsxs("div",{className:"flex min-w-0 items-center gap-1.5",children:[l.jsx("span",{className:"h-2 w-2 shrink-0 rounded-full",style:{background:m.color}}),l.jsx("span",{className:"shrink-0 text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:m.label}),l.jsxs("span",{className:"shrink-0 font-mono text-xs font-bold tabular-nums text-foreground",children:[Math.round(a[m.key]??0),"%"]}),o[m.key]&&l.jsx("span",{className:"truncate font-mono text-[10px] text-muted-foreground/60",children:o[m.key]})]},m.key))}),l.jsx($O,{data:t,series:n,unit:"%",yMode:"percent",height:176})]}):l.jsx("div",{className:"flex h-44 items-center justify-center text-xs text-muted-foreground",children:"Lade Systemdaten…"})]}),(e==null?void 0:e.temp)&&(e.temp.cpu||e.temp.gpu)&&l.jsxs("div",{className:"mt-3 flex gap-4 border-t border-border/30 pt-3 font-mono text-xs text-muted-foreground/80",children:[e.temp.cpu!=null&&l.jsxs("span",{children:["CPU Temp: ",e.temp.cpu," °C"]}),e.temp.gpu!=null&&l.jsxs("span",{children:["GPU Temp: ",e.temp.gpu," °C"]})]})]})}function iu({label:e,value:t,tone:r}){return l.jsxs("div",{className:te("flex items-center justify-between rounded-lg border px-3 py-1.5 text-xs",r==="alert"?"border-amber-500/30 bg-amber-500/5 font-semibold text-amber-400":r==="accent"?"border-primary/30 bg-primary/5 font-semibold text-primary":"border-border/30 bg-background/25 text-muted-foreground"),children:[l.jsx("span",{className:"flex items-center gap-1.5",children:e}),l.jsx("span",{className:"font-mono text-[10px]",children:t})]})}function sX(){var r;const{data:e}=uh(3e3),t=()=>window.dispatchEvent(new CustomEvent("open-system-drawer",{detail:{tab:"maintenance"}}));return l.jsxs("div",{className:"flex flex-col justify-between rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15",children:[l.jsxs("div",{className:"space-y-4",children:[l.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-2 border-b border-border/20 pb-2",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(D4,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"Updates & Pflege"})]}),(e==null?void 0:e.last_check)&&l.jsxs("span",{className:"font-mono text-[9px] text-muted-foreground/80",children:["Zuletzt gesucht: ",new Date(e.last_check*1e3).toLocaleString("de-DE",{day:"2-digit",month:"2-digit",hour:"2-digit",minute:"2-digit"})]})]}),e?l.jsxs("div",{className:"space-y-1.5",children:[l.jsx(iu,{label:"OS-Pakete",tone:e.os>0?"alert":"muted",value:e.os>0?`${e.os} verfügbar`:"aktuell"}),l.jsx(iu,{label:"Inferenz-Engine (llama.cpp)",tone:e.engine>0?"alert":"muted",value:e.engine>0?"Update verfügbar":"aktuell"}),l.jsx(iu,{label:"Router (llama-swap)",tone:e.swap>0?"alert":"muted",value:e.swap>0?"Update verfügbar":"aktuell"}),l.jsx(iu,{label:"Modell-Upgrades",tone:e.models>0?"accent":"muted",value:e.models>0?`${e.models} verfügbar`:"aktuell"}),(r=e.components)==null?void 0:r.map(n=>l.jsx(iu,{tone:n.update===!0?"alert":"muted",label:l.jsxs(l.Fragment,{children:[n.name,n.reachable===!1&&l.jsx("span",{className:"text-[8px] font-bold uppercase text-red-400/80",children:"offline"})]}),value:n.update===!0?`Update: ${n.latest}`:n.update===!1?"aktuell":n.latest?`neueste: ${n.latest}`:"—"},n.key))]}):l.jsx("div",{className:"flex h-24 items-center justify-center text-xs text-muted-foreground",children:"Lade Updates..."})]}),l.jsxs("button",{onClick:t,className:"mt-4 flex h-9 w-full items-center justify-center gap-1.5 rounded-lg bg-primary text-xs font-semibold text-primary-foreground shadow-md shadow-primary/10 transition-all hover:opacity-90 cursor-pointer",children:["Updates verwalten & Pflege ",l.jsx(th,{className:"h-3.5 w-3.5"})]})]})}function FO({type:e,title:t,message:r,defaultValue:n,autoValue:a,autoLabel:o,onConfirm:u,onCancel:c}){const f=y.useRef(null);return l.jsx("div",{className:"fixed inset-0 z-[99] bg-black/60 backdrop-blur-sm flex items-center justify-center p-4 overscroll-contain",role:"dialog","aria-modal":"true","aria-label":t,children:l.jsxs("div",{className:"w-full max-w-sm rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[l.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary",children:t}),l.jsx("button",{onClick:c||(()=>u()),"aria-label":"Schließen",className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:l.jsx(zn,{className:"h-4 w-4","aria-hidden":"true"})})]}),l.jsx("p",{className:"text-xs text-muted-foreground leading-relaxed",children:r}),e==="prompt"&&l.jsxs("div",{className:"flex gap-2",children:[l.jsx("input",{ref:f,type:"text",defaultValue:n,"aria-label":t,className:"flex-1 h-9 px-3 text-xs bg-background/40 border border-border/60 rounded-lg outline-none focus:border-primary transition-colors text-foreground",autoFocus:!0,onKeyDown:h=>{var m;h.key==="Enter"&&u((m=f.current)==null?void 0:m.value)}}),a!==void 0&&l.jsx("button",{type:"button",onClick:()=>{f.current&&(f.current.value=a)},title:"Setup-bewussten Optimalwert eintragen",className:"h-9 px-3 shrink-0 text-xs font-semibold text-primary border border-primary/50 bg-primary/10 hover:bg-primary/20 rounded-lg transition-colors cursor-pointer",children:o||"Auto"})]}),l.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[(e==="confirm"||e==="prompt")&&l.jsx("button",{onClick:c,className:"h-8 px-4 flex items-center justify-center text-xs font-semibold text-muted-foreground border border-border/60 bg-background/20 hover:bg-accent rounded-lg transition-colors cursor-pointer",children:"Abbrechen"}),l.jsx("button",{onClick:()=>{var m;const h=e==="prompt"?(m=f.current)==null?void 0:m.value:void 0;u(h)},className:"h-8 px-4 flex items-center justify-center text-xs font-semibold text-primary-foreground bg-primary hover:bg-primary/95 rounded-lg transition-colors cursor-pointer",children:e==="confirm"?"Ja, fortfahren":e==="prompt"?"Übernehmen":"OK"})]})]})})}function xa(){const[e,t]=y.useState(null),r=y.useCallback(()=>t(null),[]),n=y.useCallback((c,f,h)=>{t({type:"alert",title:c,message:f,onConfirm:()=>{t(null),h==null||h()}})},[]),a=y.useCallback((c,f,h,m)=>{t({type:"confirm",title:c,message:f,onConfirm:()=>{t(null),h()},onCancel:()=>{t(null),m==null||m()}})},[]),o=y.useCallback((c,f,h,m,g,v)=>{t({type:"prompt",title:c,message:f,defaultValue:h,autoValue:v==null?void 0:v.autoValue,autoLabel:v==null?void 0:v.autoLabel,onConfirm:b=>{t(null),m(b)},onCancel:()=>{t(null),g==null||g()}})},[]),u=e?l.jsx(FO,{...e}):null;return{showAlert:n,showConfirm:a,showPrompt:o,close:r,dialogElement:u}}function lX(){const e=Kn(),{data:t}=Ny(3e3),{data:r}=xi(),{showAlert:n,dialogElement:a}=xa(),[o,u]=y.useState(!1),c=(r==null?void 0:r.models)??[];async function f(h){try{await je("/api/agent/brain",{method:"POST",body:JSON.stringify({model:h})}),n("Erfolgreich",`Hermes-Gehirn wurde auf '${h}' geändert. Der Gateway-Dienst wurde neu gestartet.`),e.invalidateQueries({queryKey:Ve.agentStatus}),u(!1)}catch(m){n("Fehler",`Fehler beim Wechseln des Gehirns: ${m.message}`)}}return l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15 flex flex-col justify-between",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center justify-between mb-4",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(gn,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold tracking-wide uppercase text-foreground",children:"Hermes Agent"})]}),(t==null?void 0:t.terminal_url)&&l.jsxs("a",{href:Rs(t.terminal_url),target:"_blank",rel:"noopener",className:te("flex items-center gap-1 px-3 py-1 rounded-lg text-xs font-medium transition-all",t.terminal_reachable?"bg-primary text-primary-foreground hover:opacity-90 shadow-md shadow-primary/20":"border border-border text-muted-foreground"),children:[l.jsx(Is,{className:"h-3 w-3"})," Terminal öffnen"]})]}),t?l.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[l.jsxs("div",{className:"p-3 bg-background/20 rounded-xl border border-border/40",children:[l.jsx("div",{className:"text-[10px] text-muted-foreground uppercase font-semibold",children:"Gateway"}),l.jsxs("div",{className:"flex items-center gap-2 mt-1",children:[l.jsx("span",{className:te("h-2 w-2 rounded-full",t.gateway_reachable?"bg-emerald-500 animate-pulse":"bg-amber-500")}),l.jsx("span",{className:"text-xs font-medium",children:t.gateway_reachable?"Online":"Offline"})]})]}),l.jsxs("div",{className:"p-3 bg-background/20 rounded-xl border border-border/40",children:[l.jsx("div",{className:"text-[10px] text-muted-foreground uppercase font-semibold",children:"Terminal"}),l.jsxs("div",{className:"flex items-center gap-2 mt-1",children:[l.jsx("span",{className:te("h-2 w-2 rounded-full",t.terminal_reachable?"bg-emerald-500 animate-pulse":"bg-amber-500")}),l.jsx("span",{className:"text-xs font-medium",children:t.terminal_reachable?"Online":"Offline"})]})]}),l.jsxs("div",{onClick:()=>u(!0),className:"p-3 bg-background/20 rounded-xl border border-border/40 hover:border-primary/45 hover:bg-background/30 transition-all duration-300 cursor-pointer",children:[l.jsxs("div",{className:"flex justify-between items-center",children:[l.jsx("span",{className:"text-[10px] text-muted-foreground uppercase font-semibold",children:"Gehirn"}),l.jsx($n,{className:"h-3 w-3 text-primary"})]}),l.jsxs("div",{className:"text-xs font-medium mt-1 font-mono text-primary truncate flex items-center gap-1",children:[l.jsx(vy,{className:"h-3 w-3 shrink-0"}),t.brain_model||"auto"]})]}),l.jsxs("div",{className:"p-3 bg-background/20 rounded-xl border border-border/40",children:[l.jsxs("div",{className:"flex justify-between items-center",children:[l.jsx("span",{className:"text-[10px] text-muted-foreground uppercase font-semibold",children:"Verdrahtung"}),l.jsx(Uu,{className:"h-3 w-3 text-primary"})]}),l.jsxs("div",{className:"text-[10px] font-mono mt-1 space-y-0.5 text-muted-foreground",children:[l.jsxs("div",{children:["Config: ",t.has_config?l.jsx("span",{className:"text-emerald-400",children:"✓"}):"—"]}),l.jsxs("div",{children:["Skills: ",t.has_skills?l.jsx("span",{className:"text-emerald-400",children:"✓"}):"—"]}),l.jsxs("div",{children:["Memory: ",t.has_memories?l.jsx("span",{className:"text-emerald-400",children:"✓"}):"—"]})]})]})]}):l.jsx("div",{className:"h-28 flex items-center justify-center text-xs text-muted-foreground",children:"Lade Agenten-Status…"})]}),t&&l.jsxs("div",{className:"mt-3 border-t border-border/30 pt-3 space-y-1.5",children:[l.jsxs("div",{className:"flex items-center justify-between text-[10px] text-muted-foreground",children:[l.jsx("span",{children:"Telegram"}),l.jsx("span",{className:te("font-semibold",t.telegram_enabled?"text-emerald-400":""),children:t.telegram_enabled?"aktiv":"nicht konfiguriert"})]}),l.jsxs("div",{className:"flex items-center justify-between text-[10px] text-muted-foreground",children:[l.jsx("span",{children:"MCP-Server"}),l.jsxs("span",{className:"font-semibold text-foreground",children:[t.mcp_server_count??0," verbunden"]})]}),l.jsxs("div",{className:"flex items-center justify-between text-[10px] text-muted-foreground",children:[l.jsx("span",{children:"PC Executor"}),l.jsx("span",{className:te("font-semibold",t.pc_executor_reachable?"text-emerald-400":""),children:t.pc_executor_reachable?"erreichbar":"nicht verbunden"})]})]}),t&&o&&l.jsx("div",{className:"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm flex items-center justify-center p-4",children:l.jsxs("div",{className:"w-full max-w-md rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[l.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[l.jsxs("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary flex items-center gap-1.5",children:[l.jsx($n,{className:"h-4 w-4"}),l.jsx("span",{children:"Hermes-Gehirn konfigurieren"})]}),l.jsx("button",{onClick:()=>u(!1),className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:l.jsx(zn,{className:"h-4 w-4"})})]}),l.jsxs("p",{className:"text-xs text-muted-foreground leading-relaxed",children:['Das „Gehirn" ist das primäre LLM für Hermes. Wähle ein Modell aus deiner Bibliothek oder nutze ein Gateway-Alias (',l.jsx("code",{className:"text-primary font-semibold",children:"auto"})," / ",l.jsx("code",{className:"text-primary font-semibold",children:"fast"})," / ",l.jsx("code",{className:"text-primary font-semibold",children:"heavy"}),"):"]}),l.jsx("div",{className:"space-y-1.5 max-h-60 overflow-y-auto pr-1",children:["auto","fast","heavy",...c.map(h=>{var m;return((m=h.name.split("/").pop())==null?void 0:m.replace(".gguf",""))||h.name})].map(h=>{const m=["auto","fast","heavy"].includes(h);return l.jsxs("button",{onClick:()=>f(h),className:te("w-full text-left px-3 py-2.5 rounded-lg text-xs hover:bg-accent flex items-center justify-between font-mono cursor-pointer border border-border/30",t.brain_model===h||!t.brain_model&&h==="auto"?"text-primary font-bold bg-primary/10 border-primary/30":"text-foreground bg-background/20"),children:[l.jsxs("div",{className:"flex flex-col text-left",children:[l.jsx("span",{className:"font-semibold truncate max-w-[280px]",children:h}),l.jsx("span",{className:"text-[9px] text-muted-foreground mt-0.5",children:m?"Gateway Routing Alias":"Installiertes GGUF Modell"})]}),(t.brain_model===h||!t.brain_model&&h==="auto")&&l.jsx(or,{className:"h-4 w-4 shrink-0 text-primary"})]},h)})})]})}),a]})}function uX(){const e=Kn(),{data:t=[]}=dv({limit:3}),[r,n]=y.useState(""),[a,o]=y.useState("stable"),[u,c]=y.useState(!1);async function f(){if(!(!r.trim()||u)){c(!0);try{await je("/api/memory",{method:"POST",body:JSON.stringify({content:r,category:a,source:"dashboard"})}),n(""),e.invalidateQueries({queryKey:["memory"]})}catch(h){console.error(h)}finally{c(!1)}}}return l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15 flex flex-col justify-between",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center gap-2 mb-4",children:[l.jsx(yo,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold tracking-wide uppercase text-foreground",children:"Gedächtnis"})]}),l.jsxs("div",{className:"space-y-3",children:[l.jsx("textarea",{value:r,onChange:h=>n(h.target.value),"aria-label":"Fakt oder Regel im Gedächtnis speichern",placeholder:"Fakt / Regel im Pool speichern…",rows:2,className:"w-full resize-none rounded-xl border border-border/50 bg-background/30 p-2 text-[10px] outline-none focus:ring-1 focus:ring-primary transition-all leading-normal"}),l.jsxs("div",{className:"flex items-center gap-2 justify-between",children:[l.jsxs("select",{value:a,onChange:h=>o(h.target.value),"aria-label":"Kategorie",className:"h-7 rounded-lg border border-border/50 bg-background/50 px-2 text-[10px] outline-none cursor-pointer",children:[l.jsx("option",{value:"stable",children:"🔵 Fakt"}),l.jsx("option",{value:"instruction",children:"📋 Regel"}),l.jsx("option",{value:"user",children:"👤 User"}),l.jsx("option",{value:"versioned",children:"🟡 Version"})]}),l.jsxs("button",{onClick:f,disabled:!r.trim()||u,className:"flex h-7 items-center gap-1 rounded-lg bg-primary px-3 text-[10px] font-semibold text-primary-foreground hover:opacity-90 disabled:opacity-50 transition-all cursor-pointer",children:[l.jsx(rf,{className:"h-3.5 w-3.5"})," Speichern"]})]})]}),l.jsxs("div",{className:"mt-3.5 space-y-1.5",children:[l.jsx("div",{className:"text-[9px] text-muted-foreground uppercase font-bold tracking-wider",children:"Zuletzt gespeichert:"}),l.jsx("div",{className:"max-h-20 overflow-y-auto space-y-1 pr-1 scrollbar-thin",children:t.length===0?l.jsx("div",{className:"text-[10px] text-muted-foreground/75 py-1",children:"Keine Einträge vorhanden."}):t.map(h=>l.jsxs("div",{className:"text-[10px] bg-background/10 border border-border/30 rounded p-1.5 flex items-start gap-1.5",children:[l.jsx("span",{className:"shrink-0 text-[8px] font-mono text-muted-foreground/80 px-1 py-0.5 rounded bg-muted/20",children:h.category}),l.jsx("span",{className:"truncate flex-1 text-muted-foreground hover:text-foreground transition-colors",title:h.content,children:h.content})]},h.id))})]})]}),l.jsx("div",{className:"mt-4 text-[10px] text-muted-foreground/80 border-t border-border/30 pt-3",children:"Steht allen Clients per MCP zur Verfügung."})]})}const $2=[{key:"prompt",label:"Prompt",color:"#f59e0b"},{key:"completion",label:"Antwort",color:"#2dd4bf"}];function BO(){const{data:e}=Sy(3e3),t=HD(),r=t[t.length-1],n=r?Math.round(r.prompt+r.completion):0;return l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15",children:[l.jsxs("div",{className:"mb-3 flex items-start justify-between gap-3",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(eh,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"Token-Durchsatz"}),l.jsxs("span",{className:"ml-1 inline-flex items-center gap-1 text-[10px] font-medium text-muted-foreground/70",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"})," live"]})]}),e&&l.jsxs("div",{className:"mt-2 flex items-baseline gap-2",children:[l.jsx("span",{className:"font-space text-3xl font-bold tracking-tight text-foreground tabular-nums",children:n.toLocaleString("de-DE")}),l.jsx("span",{className:"text-xs text-muted-foreground",children:"tok/s aktuell"})]}),e&&l.jsxs("div",{className:"mt-0.5 space-y-0.5 font-mono text-[11px] text-muted-foreground/70",children:[l.jsxs("div",{children:[e.total_tokens.toLocaleString("de-DE")," Tokens gesamt · ",l.jsxs("span",{className:"text-emerald-400/90",children:[e.saved_eur.toLocaleString("de-DE",{minimumFractionDigits:2})," € gespart"]})]}),l.jsxs("div",{className:"text-muted-foreground/55",children:["Input ",e.prompt_tokens.toLocaleString("de-DE")," · Output ",e.completion_tokens.toLocaleString("de-DE")]})]})]}),l.jsx("div",{className:"flex shrink-0 flex-col items-end gap-1.5 pt-1",children:$2.map(a=>l.jsxs("div",{className:"flex items-center gap-1.5",children:[l.jsx("span",{className:"h-2 w-2 rounded-full",style:{background:a.color}}),l.jsx("span",{className:"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:a.label}),l.jsx("span",{className:"font-mono text-xs font-bold tabular-nums text-foreground",children:Math.round((r==null?void 0:r[a.key])??0)})]},a.key))})]}),e?l.jsx($O,{data:t,series:$2,unit:" tok/s",yMode:"auto",height:150}):l.jsx("div",{className:"flex h-[150px] items-center justify-center text-xs text-muted-foreground",children:"Lade Durchsatz…"}),l.jsx("div",{className:"mt-2 border-t border-border/30 pt-2 text-[10px] text-muted-foreground/70",children:"Durchsatz aus dem Gateway abgeleitet (Prefill vs. Generierung). Flach bei Leerlauf."})]})}function cX(){const{data:e}=jE(3e3),{showAlert:t,dialogElement:r}=xa(),[n,a]=y.useState({});async function o(u){a(c=>({...c,[u]:!0}));try{const c=await je("/api/maintenance/restart",{method:"POST",body:JSON.stringify({service:u})});c.ok||t("Fehler",`Neustart fehlgeschlagen: ${c.err||"Unbekannt"}`)}catch(c){t("Fehler",`Fehler: ${c.message}`)}finally{a(c=>({...c,[u]:!1}))}}return l.jsxs("div",{className:"flex flex-col rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15",children:[l.jsxs("div",{className:"mb-3 flex items-center justify-between",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(nh,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"Dienste"})]}),l.jsx("button",{onClick:()=>window.dispatchEvent(new CustomEvent("open-system-drawer",{detail:{tab:"logs"}})),className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground transition-colors hover:text-primary cursor-pointer",children:"Logs / Pflege"})]}),e?l.jsxs("div",{className:"flex flex-1 flex-col",children:[l.jsx("div",{className:"space-y-1.5",children:e.services.map(u=>l.jsxs("div",{className:"group flex items-center justify-between gap-2 rounded-xl border border-border/30 bg-background/20 p-2.5",children:[l.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[l.jsx("span",{className:te("h-2.5 w-2.5 shrink-0 rounded-full ring-2 ring-black/40",u.ok?"bg-emerald-500":"bg-amber-500")}),l.jsxs("div",{className:"min-w-0",children:[l.jsx("div",{className:"truncate text-xs font-bold text-foreground",children:u.name}),l.jsx("div",{className:"truncate font-mono text-[9px] text-muted-foreground/60",children:u.url})]})]}),l.jsx("button",{onClick:()=>o(u.name),disabled:n[u.name],className:"flex h-7 w-7 shrink-0 items-center justify-center rounded-lg border border-border/40 text-muted-foreground opacity-0 transition-all hover:bg-primary/5 hover:text-primary group-hover:opacity-100",title:"Dienst neu starten",children:l.jsx(Ha,{className:te("h-3.5 w-3.5",n[u.name]&&"animate-spin")})})]},u.name))}),l.jsxs("div",{className:"mt-auto flex flex-wrap gap-3 border-t border-border/20 pt-2.5 text-[10px] font-semibold text-muted-foreground",children:[l.jsxs("a",{href:Rs(e.links.engine_ui),target:"_blank",rel:"noopener",className:"flex items-center gap-1 rounded px-1.5 py-0.5 text-primary transition-colors hover:bg-primary/10",children:[l.jsx(Is,{className:"h-3 w-3"})," Engine"]}),l.jsxs("a",{href:Rs(e.links.gateway),target:"_blank",rel:"noopener",className:"flex items-center gap-1 rounded px-1.5 py-0.5 text-primary transition-colors hover:bg-primary/10",children:[l.jsx(Is,{className:"h-3 w-3"})," Gateway"]})]})]}):l.jsx("div",{className:"flex h-24 items-center justify-center text-xs text-muted-foreground",children:"Lade Dienste…"}),r]})}const Lg=[{key:"stt",label:"STT",hint:"Sprache → Text"},{key:"vision",label:"Bildschirm-Sicht",hint:"Vision-Beschreibung"},{key:"chat_ttfb",label:"Chat-TTFB",hint:"Zeit bis 1. Token"},{key:"tts",label:"TTS",hint:"Text → Sprache"}];function Fd(e){return e==null?"—":e>=1e3?`${(e/1e3).toFixed(2)} s`:`${Math.round(e)} ms`}function dX({stat:e,label:t,hint:r,maxP95:n}){const a=!!e&&e.count>0,o=a&&e.p95_ms&&n>0?Math.max(4,Math.min(100,e.p95_ms/n*100)):0;return l.jsxs("div",{className:"space-y-1.5",children:[l.jsxs("div",{className:"flex items-baseline justify-between gap-2",children:[l.jsxs("div",{className:"flex items-baseline gap-2 min-w-0",children:[l.jsx("span",{className:"text-xs font-semibold text-foreground",children:t}),l.jsx("span",{className:"truncate text-[10px] text-muted-foreground/60",children:r})]}),a?l.jsx("span",{className:"shrink-0 font-mono text-sm font-bold tabular-nums text-foreground",children:Fd(e.p50_ms)}):l.jsx("span",{className:"shrink-0 text-[10px] italic text-muted-foreground/50",children:"noch keine Messungen"})]}),l.jsx("div",{className:"h-1.5 w-full overflow-hidden rounded-full bg-background/50 border border-border/30",children:l.jsx("div",{className:"h-full rounded-full bg-gradient-to-r from-teal-500 to-indigo-500 transition-all duration-500",style:{width:`${o}%`}})}),a&&l.jsxs("div",{className:"flex items-center gap-3 font-mono text-[10px] text-muted-foreground/65",children:[l.jsxs("span",{children:["p50 ",Fd(e.p50_ms)]}),l.jsxs("span",{children:["p95 ",Fd(e.p95_ms)]}),l.jsxs("span",{children:["zuletzt ",Fd(e.last_ms)]}),l.jsxs("span",{className:"text-muted-foreground/45",children:["· n=",e.count]})]})]})}function UO(){const{data:e}=ID(5e3),t=Math.max(1,...Lg.map(n=>{var a;return((a=e==null?void 0:e[n.key])==null?void 0:a.p95_ms)??0})),r=Lg.some(n=>{var a;return(((a=e==null?void 0:e[n.key])==null?void 0:a.count)??0)>0});return l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15",children:[l.jsxs("div",{className:"mb-4 flex items-center gap-2",children:[l.jsx(CN,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"Sprach-Latenz"}),l.jsxs("span",{className:"ml-1 inline-flex items-center gap-1 text-[10px] font-medium text-muted-foreground/70",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"})," live"]})]}),l.jsx("div",{className:"grid gap-4 sm:grid-cols-2",children:Lg.map(n=>l.jsx(dX,{stat:e==null?void 0:e[n.key],label:n.label,hint:n.hint,maxP95:t},n.key))}),l.jsx("div",{className:"mt-4 border-t border-border/30 pt-2 text-[10px] text-muted-foreground/70",children:r?"Server-seitige Dauer je Pipeline-Stufe (p50 prominent). Rollender Schnitt über die letzten Turns; Reset bei Neustart.":"Noch keine Voice-Turns gemessen — sprich einmal über den „Sprechen“-Tab, dann erscheinen hier STT/Vision/Chat/TTS."})]})}const HO=[{role:"hermes",label:"Lucys Hirn",short:"Hirn",icon:yo,desc:"Lucys Alltags-Verstand — denkt und redet mit dir. Immer bereit.",tone:"bg-indigo-500/15 text-indigo-400 border-indigo-500/25",protected:!0},{role:"embed",label:"Lucys Gedächtnis",short:"Gedächtnis",icon:NN,desc:"Merkt sich Wichtiges und findet es später wieder.",tone:"bg-emerald-500/15 text-emerald-400 border-emerald-500/25",protected:!0},{role:"vision",label:"Lucys Augen",short:"Augen",icon:ef,desc:"Sieht Bilder und Screenshots und beschreibt, was drauf ist.",tone:"bg-pink-500/15 text-pink-400 border-pink-500/25"},{role:"heavy",label:"Großes Hirn",short:"Groß",icon:Y3,desc:"Das schwere Geschütz — wird für besonders knifflige Fragen dazugeholt.",tone:"bg-amber-500/15 text-amber-400 border-amber-500/25"},{role:"coder-lite",label:"Programmierer (schnell)",short:"Code schnell",icon:_s,desc:"Schnelles Programmieren im Alltag.",tone:"bg-violet-500/15 text-violet-400 border-violet-500/25"},{role:"coder",label:"Programmierer (gründlich)",short:"Code gründlich",icon:_s,desc:"Schreibt und prüft Code besonders sorgfältig — für schwere Coding-Aufgaben.",tone:"bg-fuchsia-500/15 text-fuchsia-400 border-fuchsia-500/25"},{role:"scout",label:"Späher",short:"Späher",icon:B4,desc:"Schneller erster Blick und grobe Einschätzung.",tone:"bg-teal-500/15 text-teal-400 border-teal-500/25"}],WO=HO.map(e=>e.role),z2=Object.fromEntries(HO.map(e=>[e.role,e])),F2=e=>({role:e||"?",label:e||"unbekannt",short:e||"?",icon:yo,desc:"Rolle ohne hinterlegten Klartext-Namen.",tone:"bg-slate-500/15 text-slate-300 border-slate-500/25"}),fX={fast:"hermes",coder_lite:"coder-lite"};function ir(e){return e&&(z2[e]||z2[fX[e]])||F2(e)}function so({role:e,dense:t=!1,className:r}){const n=ir(e),a=n.icon;return l.jsxs("span",{className:te("inline-flex items-center gap-1 rounded px-1.5 py-0.5 text-[10px] font-semibold border tracking-wide",n.tone,r),title:`${n.desc} (${n.role})`,children:[l.jsx(a,{className:"h-3 w-3 shrink-0","aria-hidden":"true"}),t?n.short:n.label]})}function hX({fit:e}){const t={perfect:"bg-emerald-500/15 text-emerald-400 border border-emerald-500/20",marginal:"bg-amber-500/15 text-amber-400 border border-amber-500/20",too_tight:"bg-red-500/15 text-red-400 border border-red-500/20"}[e.level];return l.jsxs("span",{className:te("rounded px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wider font-mono",t),children:[e.text," • ",e.req_gb," GB RAM"]})}function B2(e){const t=e.toLowerCase();return t.includes("qwen")?{name:"Qwen",color:"bg-purple-500/20 text-purple-300 border-purple-500/30",initial:"Q"}:t.includes("gemma")?{name:"Gemma",color:"bg-blue-500/20 text-blue-300 border-blue-500/30",initial:"G"}:t.includes("llama")?{name:"Llama",color:"bg-red-500/20 text-red-300 border-red-500/30",initial:"🦙"}:t.includes("mistral")||t.includes("mixtral")?{name:"Mistral",color:"bg-orange-500/20 text-orange-300 border-orange-500/30",initial:"M"}:t.includes("deepseek")?{name:"DeepSeek",color:"bg-cyan-500/20 text-cyan-300 border-cyan-500/30",initial:"D"}:t.includes("hermes")||t.includes("nous")?{name:"Hermes",color:"bg-amber-500/20 text-amber-300 border-amber-500/30",initial:"H"}:t.includes("phi")?{name:"Phi",color:"bg-emerald-500/20 text-emerald-300 border-emerald-500/30",initial:"Φ"}:{name:"Other",color:"bg-slate-500/20 text-slate-300 border-slate-500/30",initial:"AI"}}function mX(){var b,j,k;const{data:e}=xi(2e3),{data:t}=Sy(2e3),{data:r}=bo(),n=(e==null?void 0:e.models)??[],a=(e==null?void 0:e.running)??[],o=((b=r==null?void 0:r.gpu)==null?void 0:b.gtt_total)||((j=r==null?void 0:r.gpu)==null?void 0:j.vram_total)||0,u=((k=r==null?void 0:r.gpu)==null?void 0:k.gtt_used)||0,c=o>0?Math.min(100,u/o*100):0,f=c>=88?"bg-red-500":c>=70?"bg-amber-500":"bg-teal-500",h=c>=88?"text-red-400":c>=70?"text-amber-400":"text-foreground",m=y.useRef(null),[g,v]=y.useState(!1);return y.useEffect(()=>{if(!t)return;const S=t.total_tokens;if(m.current!==null&&S>m.current){v(!0);const N=setTimeout(()=>v(!1),4e3);return m.current=S,()=>clearTimeout(N)}m.current=S},[t==null?void 0:t.total_tokens]),l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15 flex flex-col",children:[l.jsxs("div",{className:"flex items-center justify-between mb-4",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(Jd,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold tracking-wide uppercase text-foreground",children:"Modelle"})]}),l.jsxs("span",{className:te("flex items-center gap-1.5 text-[10px] font-bold uppercase tracking-wider font-mono px-2 py-0.5 rounded-full border transition-colors",g?"bg-emerald-500/10 text-emerald-400 border-emerald-500/30":"bg-background/30 text-muted-foreground/70 border-border/40"),children:[g?l.jsx(ma,{className:"h-3 w-3 animate-pulse"}):l.jsx(N4,{className:"h-3 w-3"}),g?"Inferenz aktiv":"Idle"]})]}),o>0&&l.jsxs("div",{className:"mb-4",children:[l.jsxs("div",{className:"flex items-center justify-between text-[10px] font-mono text-muted-foreground/80 mb-1",children:[l.jsx("span",{className:"uppercase tracking-wider font-semibold",children:"Speicher-Pool"}),l.jsxs("span",{children:[l.jsx("span",{className:te("font-bold",h),children:Xi(u)})," / ",Xi(o)," GB belegt"]})]}),l.jsx("div",{className:"h-1.5 w-full rounded-full bg-background/50 border border-border/30 overflow-hidden",children:l.jsx("div",{className:te("h-full rounded-full transition-all duration-500",f),style:{width:`${c}%`}})})]}),l.jsx("div",{className:"space-y-2 flex-1",children:WO.map(S=>{var A;const N=n.find(P=>P.role===S),E=N?a.includes(N.name):!1;return l.jsxs("div",{className:te("flex items-center justify-between gap-2 p-2 rounded-xl border transition-all duration-300",E?"border-emerald-500/30 bg-emerald-500/5 shadow-sm shadow-emerald-500/5":N?"border-primary/20 bg-primary/5":"border-border/30 bg-background/10 opacity-60"),children:[l.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[l.jsx(so,{role:S,className:"shrink-0"}),l.jsxs("div",{className:"flex flex-col min-w-0",children:[l.jsx("span",{className:"text-xs font-semibold truncate font-mono text-foreground",children:N?(A=N.name.split("/").pop())==null?void 0:A.replace(/\.gguf$/i,""):"nicht zugewiesen"}),N&&l.jsxs("div",{className:"flex gap-1 items-center mt-0.5 flex-wrap text-muted-foreground/70",children:[l.jsx("span",{className:"text-[9px] font-mono",children:Mr(N.size_bytes)}),N.prompt_cache&&l.jsx("span",{className:"text-[7px] leading-none font-mono font-bold bg-cyan-500/10 text-cyan-400 border border-cyan-500/20 px-1 py-0.5 rounded",title:"Prompt Caching aktiv",children:"PC"}),N.spec_active&&l.jsx("span",{className:"text-[7px] leading-none font-mono font-bold bg-emerald-500/10 text-emerald-400 border border-emerald-500/20 px-1 py-0.5 rounded",title:`Speculative Decoding aktiv (Draft: ${N.spec_draft_model})`,children:"SPEC"}),N.parallel_slots>1&&l.jsxs("span",{className:"text-[7px] leading-none font-mono font-bold bg-violet-500/10 text-violet-400 border border-violet-500/20 px-1 py-0.5 rounded",title:`${N.parallel_slots} parallele Slots aktiv`,children:["SLOTS: ",N.parallel_slots]}),N.incomplete&&l.jsx("span",{className:"text-[7px] leading-none font-mono font-bold bg-amber-500/10 text-amber-400 border border-amber-500/20 px-1 py-0.5 rounded",title:"GGUF-Datei fehlt",children:"⚠ fehlt"})]})]})]}),l.jsx("span",{className:"shrink-0",children:N?E?l.jsxs("span",{className:"flex items-center gap-1 text-[8px] font-semibold text-emerald-400 uppercase tracking-wider font-mono",children:[l.jsx("span",{className:te("h-1.5 w-1.5 rounded-full bg-emerald-500",g&&"animate-pulse")})," warm"]}):l.jsx("span",{className:"text-[8px] font-semibold text-muted-foreground uppercase tracking-wider font-mono",children:"bereit"}):l.jsx("span",{className:"text-[8px] font-semibold text-muted-foreground/60 uppercase tracking-wider font-mono",children:"—"})})]},S)})}),l.jsx("div",{className:"mt-4 text-[10px] text-muted-foreground/80 border-t border-border/30 pt-3",children:"Laden erfolgt automatisch per Auto-Swap. Details & Routing im Modell-Manager."})]})}function pX(){var P,M,O,D,B,F;const{data:e}=jy(),{data:t}=jE(),{data:r}=xi(),{data:n}=bo(),a=!!e&&!!t,o=z=>{var Y;return(Y=t==null?void 0:t.services.find(U=>U.name.toLowerCase().includes(z)))==null?void 0:Y.ok},u=e==null?void 0:e.engine_reachable,c=(P=e==null?void 0:e.brain)==null?void 0:P.ready,f=((M=e==null?void 0:e.brain)==null?void 0:M.model)||((O=r==null?void 0:r.models.find(z=>z.role==="hermes"))==null?void 0:O.name)||"",h=[];h.push((()=>{const z={id:"brain",label:"Lucys Hirn",icon:yo,critical:!0};return a?u===!1?{...z,status:"down",detail:"Die Motor-Maschine (Engine) läuft nicht — Lucy kann gerade gar nicht denken.",repair:{kind:"restart",service:"llama-swap",label:"Motor neu starten",needsSudo:!0}}:c===!1?{...z,status:"down",detail:"Lucys Hirn ist gerade eingeschlafen — einmal aufwecken.",repair:f?{kind:"loadModel",model:f,label:"Hirn aufwecken"}:void 0}:{...z,status:"ok",detail:"Wach und ansprechbar."}:{...z,status:"loading",detail:"Wird geprüft …"}})()),h.push((()=>{const z={id:"memory",label:"Lucys Gedächtnis",icon:NN,critical:!0},Y=o("mem0");return!a||Y===void 0?{...z,status:"loading",detail:"Wird geprüft …"}:Y?{...z,status:"ok",detail:"Merkt sich Neues und findet Altes wieder."}:{...z,status:"down",detail:"Lucy kann sich gerade nichts merken — das Gedächtnis antwortet nicht.",repair:{kind:"restart",service:"mem0-service",label:"Gedächtnis neu starten"}}})()),h.push((()=>{const z={id:"gateway",label:"Verbindung (Gateway)",icon:tf,critical:!0},Y=e?e.gateway_reachable:o("integriert");return!a||Y===void 0?{...z,status:"loading",detail:"Wird geprüft …"}:Y?{...z,status:"ok",detail:"Apps und IDEs können Lucy erreichen."}:{...z,status:"down",detail:"Die Verbindungs-Zentrale antwortet nicht — Apps erreichen Lucy nicht.",repair:{kind:"restart",service:"mission-control-2",label:"Zentrale neu starten"}}})()),h.push((()=>{const z={id:"agent",label:"Lucys Agent (Hermes)",icon:gn,critical:!0},Y=o("hermes-gateway");return!a||Y===void 0?{...z,status:"loading",detail:"Wird geprüft …"}:Y?{...z,status:"ok",detail:"Lucy ist bereit zu reden und zu handeln."}:{...z,status:"down",detail:"Lucys Agent ist offline — sie reagiert gerade nicht.",repair:{kind:"restart",service:"hermes-gateway",label:"Agent neu starten"}}})()),h.push((()=>{const z={id:"voice",label:"Lucys Stimme",icon:S4,critical:!1},Y=o("voice");return!a||Y===void 0?{...z,status:"loading",detail:"Wird geprüft …"}:Y?{...z,status:"ok",detail:"Lucy kann hören und sprechen."}:{...z,status:"warn",detail:"Sprechen ist gerade aus — Tippen geht weiter normal.",repair:{kind:"restart",service:"voice-service",label:"Stimme neu starten"}}})());const m=((D=n==null?void 0:n.gpu)==null?void 0:D.gtt_total)||((B=n==null?void 0:n.gpu)==null?void 0:B.vram_total)||0,g=((F=n==null?void 0:n.gpu)==null?void 0:F.gtt_used)||0,v=m>0?Math.min(100,g/m*100):0,b=1024**3,j=m?v>=90?{status:"full",usedGb:g/b,totalGb:m/b,pct:v,text:"Speicher fast voll — Lucy könnte langsamer werden."}:v>=72?{status:"warn",usedGb:g/b,totalGb:m/b,pct:v,text:"Speicher gut gefüllt — noch okay."}:{status:"ok",usedGb:g/b,totalGb:m/b,pct:v,text:"Genug Speicher frei."}:{status:"unknown",usedGb:0,totalGb:0,pct:0,text:"Speicher-Auslastung unbekannt."},k=h.some(z=>z.status==="loading"),S=h.filter(z=>z.critical&&z.status==="down"),N=h.filter(z=>z.status==="warn"||!z.critical&&z.status==="down"),E=j.status==="full";return{verdict:k&&!S.length?"loading":S.length?"problem":N.length||E?"warn":"gut",checks:h,memory:j,problems:S}}const gX={ok:"bg-emerald-500",warn:"bg-amber-500",down:"bg-red-500",loading:"bg-muted-foreground/40"};function KO({frame:e="lucy"}={}){const{verdict:t,checks:r,memory:n,problems:a}=pX(),{showAlert:o,dialogElement:u}=xa(),c=Kn(),[f,h]=y.useState({});async function m(S,N){h(E=>({...E,[S]:!0}));try{if(N.kind==="loadModel")await je(`/api/models/${encodeURIComponent(N.model)}/load`,{method:"POST"});else{const E=await je("/api/maintenance/restart",{method:"POST",body:JSON.stringify({service:N.service})});E.ok||o("Reparatur nicht ganz geklappt",(E.err||"Unbekannter Fehler")+(N.needsSudo?` + +Tipp: Dafür wird evtl. das Box-Passwort gebraucht (oben rechts hinterlegen).`:""))}c.invalidateQueries({queryKey:Ve.health}),c.invalidateQueries({queryKey:Ve.services}),c.invalidateQueries({queryKey:Ve.models})}catch(E){o("Reparatur fehlgeschlagen",String((E==null?void 0:E.message)||E))}finally{h(E=>({...E,[S]:!1}))}}const g=e==="box"?{loading:"Box wird geprüft …",gut:"Alles okay",warn:"Kleinigkeit an der Box",problem:"Box braucht Hilfe"}:{loading:"Lucy wird geprüft …",gut:"Lucy geht's gut 💚",warn:"Kleinigkeit bei Lucy",problem:"Lucy braucht Hilfe"},v={loading:{ring:"border-border/60 bg-card/45",icon:rh,iconCls:"text-muted-foreground animate-spin",title:g.loading,sub:"Einen Moment, ich schaue nach dem Rechten."},gut:{ring:"border-emerald-500/40 bg-emerald-500/5",icon:h4,iconCls:"text-emerald-400",title:g.gut,sub:"Alle wichtigen Fähigkeiten laufen."},warn:{ring:"border-amber-500/40 bg-amber-500/5",icon:mi,iconCls:"text-amber-400",title:g.warn,sub:"Nichts Schlimmes — nur ein Hinweis."},problem:{ring:"border-red-500/50 bg-red-500/5",icon:mi,iconCls:"text-red-400",title:g.problem,sub:`${a.length} wichtige${a.length===1?"s":""} Problem${a.length===1?"":"e"} gefunden.`}}[t],b=v.icon,j={ok:"bg-emerald-500",warn:"bg-amber-500",full:"bg-red-500",unknown:"bg-muted-foreground/40"}[n.status],k={ok:"text-emerald-400",warn:"text-amber-400",full:"text-red-400",unknown:"text-muted-foreground"}[n.status];return l.jsxs("div",{className:te("rounded-2xl border p-5 shadow-lg shadow-black/15 backdrop-blur-md transition-colors",v.ring),children:[l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsx("div",{className:"flex h-11 w-11 shrink-0 items-center justify-center rounded-xl border border-border/40 bg-background/30",children:l.jsx(b,{className:te("h-6 w-6",v.iconCls)})}),l.jsxs("div",{className:"min-w-0",children:[l.jsx("h2",{className:"text-base font-bold tracking-tight text-foreground",children:v.title}),l.jsx("p",{className:"text-xs text-muted-foreground",children:v.sub})]})]}),l.jsxs("div",{className:"mt-4 rounded-xl border border-border/30 bg-background/20 p-3",children:[l.jsxs("div",{className:"mb-1.5 flex items-center justify-between text-[11px]",children:[l.jsxs("span",{className:"flex items-center gap-1.5 font-semibold uppercase tracking-wider text-muted-foreground",children:[l.jsx(du,{className:"h-3.5 w-3.5"})," Speicher"]}),l.jsx("span",{className:te("font-mono font-bold",k),children:n.status==="unknown"?"—":`${n.usedGb.toFixed(0)} / ${n.totalGb.toFixed(0)} GB`})]}),l.jsx("div",{className:"h-2 w-full overflow-hidden rounded-full border border-border/30 bg-background/50",children:l.jsx("div",{className:te("h-full rounded-full transition-all duration-500",j),style:{width:`${n.pct}%`}})}),l.jsx("p",{className:te("mt-1.5 text-[11px]",k),children:n.text})]}),l.jsx("div",{className:"mt-4 space-y-1.5",children:r.map(S=>l.jsx(vX,{c:S,busy:!!f[S.id],onRepair:()=>S.repair&&m(S.id,S.repair)},S.id))}),u]})}function vX({c:e,busy:t,onRepair:r}){const n=e.icon,a=e.status==="down"||e.status==="warn";return l.jsxs("div",{className:te("flex items-center justify-between gap-3 rounded-xl border p-2.5 transition-colors",e.status==="down"?"border-red-500/25 bg-red-500/5":e.status==="warn"?"border-amber-500/20 bg-amber-500/5":"border-border/30 bg-background/15"),children:[l.jsxs("div",{className:"flex min-w-0 items-center gap-2.5",children:[l.jsxs("span",{className:"relative flex h-8 w-8 shrink-0 items-center justify-center rounded-lg border border-border/40 bg-background/30 text-foreground/80",children:[l.jsx(n,{className:"h-4 w-4"}),l.jsx("span",{className:te("absolute -right-0.5 -top-0.5 h-2.5 w-2.5 rounded-full ring-2 ring-black/40",gX[e.status],e.status==="down"&&"animate-pulse")})]}),l.jsxs("div",{className:"min-w-0",children:[l.jsxs("div",{className:"flex items-center gap-1.5 text-xs font-bold text-foreground",children:[e.label,e.status==="ok"&&l.jsx(or,{className:"h-3 w-3 text-emerald-400"}),!e.critical&&l.jsx("span",{className:"rounded bg-background/40 px-1 py-0.5 text-[8px] font-semibold uppercase tracking-wider text-muted-foreground/60",children:"optional"})]}),l.jsx("div",{className:"truncate text-[11px] text-muted-foreground",children:e.detail})]})]}),a&&e.repair&&l.jsxs("button",{onClick:r,disabled:t,className:te("flex h-8 shrink-0 items-center gap-1.5 rounded-lg border px-2.5 text-[10px] font-bold uppercase tracking-wide transition-all cursor-pointer disabled:opacity-60",e.status==="down"?"border-red-500/40 bg-red-500/10 text-red-300 hover:bg-red-500/20":"border-amber-500/40 bg-amber-500/10 text-amber-300 hover:bg-amber-500/20"),title:e.repair.label,children:[t?l.jsx(rh,{className:"h-3.5 w-3.5 animate-spin"}):l.jsx(Uu,{className:"h-3.5 w-3.5"}),e.repair.label]}),a&&!e.repair&&l.jsxs("span",{className:"flex shrink-0 items-center gap-1 text-[10px] font-semibold text-muted-foreground",title:"Keine Auto-Reparatur bekannt",children:[l.jsx(L4,{className:"h-3.5 w-3.5"})," manuell"]})]})}function U2({children:e}){return l.jsx("p",{className:"mb-2 ml-0.5 text-[11px] font-semibold uppercase tracking-wider text-muted-foreground/60",children:e})}function yX(){return l.jsxs("div",{className:"space-y-7",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Zentrale"}),l.jsx("p",{className:"text-sm text-muted-foreground",children:"Aktueller Status von System, Modellen und Agent."})]}),l.jsx(KO,{}),l.jsxs("div",{className:"grid items-stretch gap-6 lg:grid-cols-3",children:[l.jsx(zO,{}),l.jsx(BO,{}),l.jsx(mX,{})]}),l.jsxs("section",{children:[l.jsx(U2,{children:"Stack & Telemetrie"}),l.jsxs("div",{className:"grid gap-6 md:grid-cols-2",children:[l.jsx(cX,{}),l.jsx(UO,{})]})]}),l.jsxs("section",{children:[l.jsx(U2,{children:"Betrieb & Wissen"}),l.jsxs("div",{className:"grid gap-6 md:grid-cols-3",children:[l.jsx(sX,{}),l.jsx(lX,{}),l.jsx(uX,{})]})]})]})}function xX(){const e=Kn(),{data:t=[]}=DD(2e3),{showAlert:r,dialogElement:n}=xa();async function a(c){try{await je(`/api/jobs/${c}/cancel`,{method:"POST"}),e.invalidateQueries({queryKey:Ve.jobs})}catch(f){r("Fehler",f.message)}}const o=t.filter(c=>c.state==="running"||c.state==="queued"),u=t.filter(c=>c.state!=="running"&&c.state!=="queued").slice(-3);return o.length===0&&u.length===0?null:l.jsxs("div",{className:"space-y-3 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-4 shadow-lg shadow-black/10",children:[l.jsx("div",{className:"text-[11px] font-semibold text-muted-foreground uppercase tracking-wider",children:"Aktive Downloads"}),o.map(c=>l.jsxs("div",{className:"space-y-1.5 p-3 rounded-xl bg-background/20 border border-border/40",children:[l.jsxs("div",{className:"flex justify-between items-center text-xs",children:[l.jsx("span",{className:"font-semibold truncate max-w-[250px]",children:c.label}),l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsxs("span",{className:"text-muted-foreground font-mono",children:[c.progress??0,"% • ",pv(c.done_bytes),"/",pv(c.total_bytes),c.eta_s?` • ETA ${GD(c.eta_s)}`:""]}),l.jsx("button",{onClick:()=>a(c.id),className:"text-[10px] text-red-400 hover:text-red-300 font-semibold border border-red-500/25 bg-red-500/5 px-2 py-0.5 rounded transition-all cursor-pointer",children:"Abbrechen"})]})]}),l.jsx("div",{className:"h-1.5 overflow-hidden rounded-full bg-muted",children:l.jsx("div",{className:"h-full rounded-full bg-primary transition-all duration-500",style:{width:`${c.progress??0}%`}})})]},c.id)),u.map(c=>l.jsxs("div",{className:"flex justify-between items-center text-xs text-muted-foreground px-1",children:[l.jsx("span",{className:"truncate",children:c.label}),l.jsx("span",{className:te("font-semibold text-[10px] px-1.5 py-0.5 rounded uppercase font-mono",c.state==="done"?"bg-emerald-500/10 text-emerald-400":"bg-amber-500/10 text-amber-400"),children:c.state})]},c.id)),n]})}function La({children:e,tone:t="muted"}){const r={muted:"bg-muted text-muted-foreground",primary:"bg-primary/15 text-primary",warn:"bg-amber-500/15 text-amber-500"};return l.jsx("span",{className:`rounded px-1.5 py-0.5 text-[11px] font-medium ${r[t]}`,children:e})}function H2({caps:e}){return e?l.jsxs("span",{className:"inline-flex flex-wrap gap-1",children:[e.coder&&l.jsx(La,{children:"💻 Code"}),e.vision&&l.jsx(La,{children:"👁 Bild"}),e.reasoning&&l.jsx(La,{children:"🧠 Reason"}),e.moe&&l.jsxs(La,{tone:"primary",children:["🧩 MoE",e.active_b?`·${e.active_b}b`:""]}),e.tools==="yes"&&l.jsx(La,{tone:"primary",children:"🛠 Tools"}),e.tools==="likely"&&l.jsx(La,{tone:"warn",children:"🛠 Tools?"}),e.embedding&&l.jsx(La,{children:"🔢 Embed"})]}):null}function bX({model:e,onClose:t,onChanged:r}){var k,S;const{data:n,isLoading:a}=LD(e.gguf_path),[o,u]=y.useState(null),[c,f]=y.useState(""),h=n==null?void 0:n.target_vocab,m=(n==null?void 0:n.drafts)??[],g=m.filter(N=>N.compatible===!0),v=e.spec_draft_model;async function b(N){u(N??"__clear__"),f("");try{await je(`/api/models/${encodeURIComponent(e.name)}/draft`,{method:"POST",body:JSON.stringify({draft_path:N})}),r(),t()}catch(E){f(String((E==null?void 0:E.message)||E)),u(null)}}const j=N=>{var E;return N?`${N.pre??"?"} · ${((E=N.n_vocab)==null?void 0:E.toLocaleString())??"?"} Tokens`:"—"};return l.jsx("div",{className:"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm flex items-center justify-center p-4",children:l.jsxs("div",{className:"w-full max-w-lg rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[l.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[l.jsxs("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary flex items-center gap-2",children:[l.jsx(ma,{className:"h-4 w-4"})," Speculative Draft"]}),l.jsx("button",{onClick:t,className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:l.jsx(zn,{className:"h-4 w-4"})})]}),l.jsxs("div",{className:"text-xs text-muted-foreground leading-relaxed",children:['Beschleunigt die Token-Generierung mit einem kleinen "Draft"-Modell. Voraussetzung: der Draft muss den ',l.jsx("strong",{className:"text-foreground",children:"exakt gleichen Tokenizer (Vocab)"})," haben wie das Modell — sonst lehnt llama.cpp es ab."]}),l.jsxs("div",{className:"rounded-lg border border-border/40 bg-background/30 px-3 py-2 text-[11px] font-mono flex items-center justify-between",children:[l.jsx("span",{className:"text-muted-foreground",children:(k=e.name.split("/").pop())==null?void 0:k.replace(/\.gguf$/i,"")}),l.jsxs("span",{className:"text-foreground",children:["Vocab: ",j(h)]})]}),e.spec_active&&v&&l.jsxs("div",{className:"rounded-lg border border-emerald-500/30 bg-emerald-500/5 px-3 py-2 flex items-center justify-between gap-2",children:[l.jsxs("span",{className:"text-[11px] text-emerald-400 font-mono flex items-center gap-1.5 truncate",children:[l.jsx(or,{className:"h-3.5 w-3.5 shrink-0"})," Aktiv: ",v]}),l.jsx("button",{onClick:()=>b(null),disabled:o!==null,className:"h-6 px-2.5 rounded border border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/10 text-amber-400 text-[9px] font-bold uppercase shrink-0 cursor-pointer disabled:opacity-50",children:"Deaktivieren"})]}),!(n!=null&&n.target_exists)&&l.jsxs("div",{className:"rounded-lg border border-amber-500/30 bg-amber-500/5 px-3 py-2 text-[11px] text-amber-400 flex items-center gap-2",children:[l.jsx(mi,{className:"h-3.5 w-3.5 shrink-0"}),"Modell-GGUF noch nicht vorhanden — Spec-Draft ist nach dem Download konfigurierbar."]}),l.jsx("div",{className:"space-y-1.5 max-h-64 overflow-y-auto pr-1",children:a?l.jsx("div",{className:"text-xs text-muted-foreground py-6 text-center",children:"Prüfe Vocab-Kompatibilität…"}):m.length===0?l.jsxs("div",{className:"text-[11px] text-muted-foreground border border-dashed border-border/50 rounded-lg p-4 text-center",children:["Keine Draft-Modelle in ",l.jsx("code",{className:"font-mono",children:"/srv/models/drafts"}),". Lade ein kleines same-family-Modell (z.B. Qwen3-0.6B) und lege es dort ab."]}):m.map(N=>{var P,M;const E=N.filename===v,A=N.compatible===!0;return l.jsxs("div",{className:te("rounded-lg border px-3 py-2 flex items-center justify-between gap-2 text-left",A?"border-border/40 bg-background/20":"border-border/20 bg-background/10 opacity-60",E&&"border-primary/40 bg-primary/10"),children:[l.jsxs("div",{className:"min-w-0",children:[l.jsxs("div",{className:"text-[11px] font-mono font-semibold text-foreground truncate flex items-center gap-1.5",children:[N.filename,N.mtp&&l.jsx("span",{className:"shrink-0 rounded bg-indigo-500/15 px-1.5 py-0.5 text-[8px] font-bold uppercase tracking-wider text-indigo-400 border border-indigo-500/25",title:"MTP-Kopf (Multi-Token-Prediction) — by-construction vocab-identisch, höchste Akzeptanzrate",children:"MTP"})]}),l.jsxs("div",{className:"text-[9px] text-muted-foreground font-mono",children:[Mr(N.size_bytes)," · Vocab: ",j(N.vocab)]})]}),A?E?l.jsxs("span",{className:"text-[9px] font-bold uppercase text-primary flex items-center gap-1 shrink-0",children:[l.jsx(or,{className:"h-3.5 w-3.5"})," Aktiv"]}):l.jsx("button",{onClick:()=>b(N.path),disabled:o!==null,className:"h-7 px-3 rounded-lg border border-emerald-500/30 bg-emerald-500/5 hover:bg-emerald-500/15 text-emerald-400 text-[9px] font-bold uppercase shrink-0 cursor-pointer disabled:opacity-50",children:"Aktivieren"}):l.jsxs("span",{className:"text-[9px] font-bold uppercase text-amber-400/80 flex items-center gap-1 shrink-0",title:N.compatible===!1?`Inkompatibel: Tokenizer/Vocab weicht ab (Draft ${(P=N.vocab)==null?void 0:P.pre}/${(M=N.vocab)==null?void 0:M.n_vocab} ≠ Modell ${h==null?void 0:h.pre}/${h==null?void 0:h.n_vocab}).`:"Kompatibilität nicht prüfbar (Datei fehlt).",children:[l.jsx(mi,{className:"h-3.5 w-3.5"})," ",N.compatible===!1?"Vocab ≠":"n/a"]})]},N.path)})}),!a&&(n==null?void 0:n.target_exists)&&m.length>0&&g.length===0&&l.jsxs("div",{className:"rounded-lg border border-amber-500/30 bg-amber-500/5 px-3 py-2 text-[11px] text-amber-400 leading-relaxed",children:["Kein vocab-kompatibler Draft verfügbar — Speculative Decoding ist für dieses Modell nicht möglich. Es braucht einen Draft mit identischem Tokenizer (pre=",l.jsx("span",{className:"font-mono",children:h==null?void 0:h.pre}),", n_vocab=",l.jsx("span",{className:"font-mono",children:(S=h==null?void 0:h.n_vocab)==null?void 0:S.toLocaleString()}),")."]}),c&&l.jsx("div",{className:"text-[10px] text-red-400 font-mono",children:c})]})})}const wX=e=>!!ir(e).protected;function kX({role:e,roleRec:t,models:r,onAssign:n,onClose:a}){var f,h;const o=t&&t.role===e?t:null,u={};o==null||o.models.forEach(m=>{u[m.name]=m});const c=o?o.models.map(m=>r.find(g=>g.name===m.name)).filter(Boolean):r;return l.jsx("div",{className:"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm flex items-center justify-center p-4 overscroll-contain",role:"dialog","aria-modal":"true","aria-label":`${ir(e).label} konfigurieren`,children:l.jsxs("div",{className:"w-full max-w-md rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[l.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[l.jsxs("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary flex items-center gap-1.5",children:[l.jsx(so,{role:e})," festlegen"]}),l.jsx("button",{onClick:a,className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:l.jsx(zn,{className:"h-4 w-4"})})]}),l.jsxs("div",{className:"flex items-center justify-between gap-2",children:[l.jsxs("p",{className:"text-xs text-muted-foreground",children:["Wähle ein Modell für ",l.jsx("strong",{className:"text-foreground",children:ir(e).label}),l.jsx("span",{className:"block text-[10px] text-muted-foreground/70 mt-0.5",children:ir(e).desc})]}),(o==null?void 0:o.recommended)&&l.jsxs("button",{onClick:()=>n(o.recommended),title:(f=u[o.recommended])==null?void 0:f.reason,className:"shrink-0 h-7 px-3 text-[11px] font-semibold text-primary border border-primary/50 bg-primary/10 hover:bg-primary/20 rounded-lg cursor-pointer flex items-center gap-1",children:[l.jsx(ma,{className:"h-3 w-3"})," Auto: ",(h=o.recommended.split("/").pop())==null?void 0:h.replace(/\.gguf$/i,"")]})]}),l.jsxs("div",{className:"space-y-1.5 max-h-60 overflow-y-auto pr-1",children:[wX(e)?l.jsx("div",{className:"w-full px-3 py-2 rounded-lg text-[11px] text-muted-foreground border border-border/30 bg-background/20 flex items-center gap-1.5",children:"🔒 Diese Rolle ist lebenswichtig und kann nicht leer bleiben — wähle stattdessen ein anderes Modell."}):l.jsx("button",{onClick:()=>n(""),className:"w-full text-left px-3 py-2 rounded-lg text-xs hover:bg-accent text-red-400 font-semibold cursor-pointer border border-red-500/20 bg-red-500/5 flex items-center justify-between",children:l.jsx("span",{children:"Zuweisung entfernen"})}),c.map(m=>{var k;const g=u[m.name],v=m.role===e,b=!!(g!=null&&g.recommended),j=!!g&&!g.suitable;return l.jsxs("button",{onClick:()=>n(m.name),className:te("w-full text-left px-3 py-2.5 rounded-lg text-xs hover:bg-accent flex items-center justify-between font-mono cursor-pointer border",b?"border-primary/50 bg-primary/10":v?"text-primary font-bold bg-primary/5 border-primary/30":j?"border-border/20 bg-background/10 opacity-60":"text-foreground bg-background/20 border-border/30"),children:[l.jsxs("div",{className:"flex flex-col text-left min-w-0",children:[l.jsxs("span",{className:"truncate max-w-[260px] font-semibold flex items-center gap-1.5",children:[(k=m.name.split("/").pop())==null?void 0:k.replace(/\.gguf$/i,""),b&&l.jsx("span",{className:"text-[8px] font-bold uppercase tracking-wide text-primary bg-primary/15 px-1.5 py-0.5 rounded",children:"Empfohlen"})]}),l.jsx("span",{className:"text-[9px] text-muted-foreground mt-0.5",children:g?`${g.params_b}B · ${m.quant} · ${g.reason}`:`${Mr(m.size_bytes)} · ${m.quant}`})]}),v&&l.jsx(or,{className:"h-4 w-4 shrink-0 text-primary"})]},m.name)})]})]})})}const jX=["fast","heavy","heavy_chars"],SX=["coder_lite","coder","coding_escalate_chars"];function NX(){const e=Kn(),{data:t,isLoading:r}=TD(),[n,a]=y.useState(null),[o,u]=y.useState(!1),[c,f]=y.useState(""),[h,m]=y.useState(0);if(y.useEffect(()=>{t!=null&&t.policy&&!n&&a({...t.policy})},[t,n]),r||!t||!n)return l.jsx("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 text-xs text-muted-foreground",children:"Lade Routing-Policy…"});const g=N=>t.fields.find(E=>E.key===N),v=Object.keys(n).some(N=>n[N]!==t.policy[N]),b=(N,E)=>{a(A=>A&&{...A,[N]:E}),f("")},j=N=>b(N,t.defaults[N]);async function k(){if(!n)return;const N={};for(const E of Object.keys(n))n[E]!==t.policy[E]&&(N[E]=n[E]);if(Object.keys(N).length!==0){u(!0),f("");try{const{policy:E}=await _D(N);a({...E}),e.invalidateQueries({queryKey:Ve.routingPolicy}),e.invalidateQueries({queryKey:Ve.routing}),m(Date.now()),setTimeout(()=>m(0),2e3)}catch(E){f(E.message||String(E))}finally{u(!1)}}}function S({k:N}){const E=g(N),A=n[N],P=n[N]===t.defaults[N];return l.jsxs("div",{className:"space-y-1",children:[l.jsxs("div",{className:"flex items-center justify-between gap-2",children:[l.jsx("label",{className:"text-[10px] font-semibold text-muted-foreground",children:E.label}),!P&&l.jsxs("button",{onClick:()=>j(N),className:"flex items-center gap-0.5 text-[9px] text-muted-foreground/60 hover:text-foreground transition-colors cursor-pointer",title:`Auf Default zurücksetzen (${String(t.defaults[N])||"leer"})`,children:[l.jsx(_4,{className:"h-2.5 w-2.5"})," Default"]})]}),E.type==="bool"?l.jsxs("button",{onClick:()=>b(N,!A),className:te("flex h-8 w-full items-center justify-between rounded-lg border px-3 text-[11px] font-semibold transition-all cursor-pointer",A?"border-emerald-500/40 bg-emerald-500/10 text-emerald-300":"border-border/40 bg-background/40 text-muted-foreground"),children:[l.jsx("span",{children:A?"An":"Aus"}),l.jsx("span",{className:te("h-3.5 w-3.5 rounded-full transition-colors",A?"bg-emerald-400":"bg-muted-foreground/40")})]}):E.type==="int"?l.jsx("input",{type:"number",value:A,min:E.min,max:E.max,"aria-label":E.label,onChange:M=>b(N,Number(M.target.value)),className:"h-8 w-full rounded-lg border border-border/40 bg-background/40 px-3 font-mono text-[11px] text-foreground outline-none focus:border-primary/50"}):l.jsx("input",{type:"text",value:A,"aria-label":E.label,spellCheck:!1,placeholder:N==="coder_lite"?"(leer = aus)":"",onChange:M=>b(N,M.target.value),className:"h-8 w-full rounded-lg border border-border/40 bg-background/40 px-3 font-mono text-[11px] text-foreground outline-none focus:border-primary/50"})]})}return l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-4",children:[l.jsxs("div",{className:"flex items-center justify-between gap-3 flex-wrap",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(z4,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("span",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"Lane-Routing & Policy"}),l.jsx("span",{className:"text-[9px] font-mono px-1.5 py-0.5 rounded bg-emerald-500/10 text-emerald-300 border border-emerald-500/20",children:"hot-reload"})]}),l.jsxs("div",{className:"flex items-center gap-2",children:[c&&l.jsx("span",{className:"text-[10px] text-red-400 max-w-[280px] truncate",title:c,children:c}),h>0&&l.jsxs("span",{className:"flex items-center gap-1 text-[10px] text-emerald-400",children:[l.jsx(or,{className:"h-3.5 w-3.5"})," gespeichert"]}),l.jsxs("button",{onClick:k,disabled:!v||o,className:te("h-8 px-4 rounded-lg text-[10px] font-bold uppercase tracking-wide transition-all flex items-center gap-1.5",v&&!o?"bg-primary text-primary-foreground hover:opacity-90 cursor-pointer shadow-md shadow-primary/10":"bg-background/40 text-muted-foreground/50 border border-border/40 cursor-not-allowed"),children:[o?l.jsx(rh,{className:"h-3.5 w-3.5 animate-spin"}):null,"Speichern"]})]})]}),l.jsxs("p",{className:"text-[10px] text-muted-foreground/70 leading-relaxed -mt-1",children:["Welches echte Modell hinter den virtuellen Lanes ",l.jsx("code",{className:"text-cyan-300",children:"chat"})," und"," ",l.jsx("code",{className:"text-cyan-300",children:"coding"})," steckt. Änderungen greifen sofort (kein Neustart). Die Keyword-Heuristiken bleiben im Code."]}),l.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[l.jsxs("div",{className:"rounded-xl border border-border/40 bg-background/25 p-4 space-y-3",children:[l.jsxs("div",{className:"flex items-center gap-2 border-b border-border/30 pb-2",children:[l.jsx(k4,{className:"h-4 w-4 text-teal-400"}),l.jsx("span",{className:"text-[11px] font-bold uppercase tracking-wider text-foreground",children:"chat"}),l.jsx("span",{className:"text-[9px] text-muted-foreground/60 font-mono",children:"(= auto)"})]}),jX.map(N=>l.jsx(S,{k:N},N))]}),l.jsxs("div",{className:"rounded-xl border border-border/40 bg-background/25 p-4 space-y-3",children:[l.jsxs("div",{className:"flex items-center gap-2 border-b border-border/30 pb-2",children:[l.jsx(i4,{className:"h-4 w-4 text-indigo-400"}),l.jsx("span",{className:"text-[11px] font-bold uppercase tracking-wider text-foreground",children:"coding"}),l.jsx("span",{className:"text-[9px] text-muted-foreground/60 font-mono",children:"(agentisch → immer Coder)"})]}),SX.map(N=>l.jsx(S,{k:N},N))]})]}),l.jsx("div",{className:"rounded-xl border border-border/40 bg-background/25 p-4",children:l.jsx("div",{className:"max-w-xs",children:l.jsx(S,{k:"fast_no_think"})})})]})}function EX(){var me,ue,ge;const e=Kn(),{data:t}=xi(4e3),{data:r}=SE(),{data:n}=bo(),{data:a}=NE(),{showAlert:o,dialogElement:u}=xa(),[c,f]=y.useState(!1),[h,m]=y.useState(!1),g=(t==null?void 0:t.models)??[],v=(t==null?void 0:t.running)??[],b=(me=r==null?void 0:r.groups)==null?void 0:me.brains,j=(b==null?void 0:b.members)??[],k=ie=>g.find(oe=>oe.name===ie),S=ie=>{var oe;return((oe=ie.split("/").pop())==null?void 0:oe.replace(/\.gguf$/i,""))||ie},N=j.map(k).filter(Boolean),E=1024**3,A=a==null?void 0:a.budget,P=N.reduce((ie,oe)=>ie+(oe.size_bytes||0),0)/E,M=((ue=n==null?void 0:n.gpu)==null?void 0:ue.gtt_total)||((ge=n==null?void 0:n.gpu)==null?void 0:ge.vram_total)||0,O=(A==null?void 0:A.gtt_gb)||(M?M/E:0),D=(A==null?void 0:A.warm_projected_gb)??P,B=O>0?Math.min(100,D/O*100):0,F=g.filter(ie=>!j.includes(ie.name)&&!ie.incomplete);async function z(ie){m(!0);try{await kE("brains",ie,(b==null?void 0:b.swap)??!1,(b==null?void 0:b.persist)??!0),e.invalidateQueries({queryKey:Ve.groups}),e.invalidateQueries({queryKey:Ve.models}),e.invalidateQueries({queryKey:Ve.hermesBrain})}catch(oe){o("Fehler",`Immer-bereit-Set konnte nicht geändert werden: ${(oe==null?void 0:oe.message)||oe}`)}finally{m(!1)}}function Y(ie){const oe=k(ie);if(oe&&ir(oe.role).protected){o("Geschützt",`„${ir(oe.role).label}" ist lebenswichtig und bleibt immer bereit.`);return}z(j.filter(X=>X!==ie))}function U(ie){f(!1),z([...j,ie])}return b?l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-4",children:[l.jsx(W2,{}),l.jsxs("div",{className:"space-y-1.5",children:[N.length===0&&l.jsx("div",{className:"text-xs text-muted-foreground",children:"Noch keine Modelle im Set."}),N.map(ie=>{const oe=v.includes(ie.name),X=ir(ie.role).protected;return l.jsxs("div",{className:"flex items-center justify-between gap-2 rounded-xl border border-border/30 bg-background/20 p-2.5",children:[l.jsxs("div",{className:"flex min-w-0 items-center gap-2.5",children:[l.jsx("span",{className:te("h-2 w-2 shrink-0 rounded-full ring-2 ring-black/40",oe?"bg-emerald-500 animate-pulse":"bg-muted-foreground/40"),title:oe?"Gerade warm (bereit)":"Reserviert — lädt bei Bedarf sofort"}),ie.role&&l.jsx(so,{role:ie.role,dense:!0,className:"shrink-0"}),l.jsx("span",{className:"truncate font-mono text-xs font-semibold text-foreground",title:ie.name,children:S(ie.name)}),l.jsx("span",{className:"shrink-0 font-mono text-[10px] text-muted-foreground/70",children:Mr(ie.size_bytes)})]}),X?l.jsx("span",{className:"shrink-0 text-[10px] font-semibold text-muted-foreground",title:"Lebenswichtig — bleibt immer im Set.",children:"🔒"}):l.jsx("button",{onClick:()=>Y(ie.name),disabled:h,className:"flex h-7 w-7 shrink-0 items-center justify-center rounded-lg border border-border/40 text-muted-foreground transition-colors hover:bg-red-500/5 hover:text-red-400 cursor-pointer disabled:opacity-50",title:"Aus dem Immer-bereit-Set nehmen (lädt dann nur noch bei Bedarf)",children:l.jsx(zn,{className:"h-3.5 w-3.5"})})]},ie.name)})]}),l.jsxs("button",{onClick:()=>f(!0),disabled:h||F.length===0,className:"flex h-8 w-full items-center justify-center gap-1.5 rounded-lg border border-dashed border-border/50 text-[11px] font-semibold uppercase tracking-wide text-muted-foreground transition-colors hover:border-primary/40 hover:text-primary cursor-pointer disabled:opacity-50",children:[l.jsx(rf,{className:"h-3.5 w-3.5"})," Modell dauerhaft bereithalten"]}),l.jsxs("div",{className:"rounded-xl border border-border/30 bg-background/20 p-3",children:[l.jsxs("div",{className:"mb-1.5 flex items-center justify-between text-[11px]",children:[l.jsxs("span",{className:"flex items-center gap-1.5 font-semibold uppercase tracking-wider text-muted-foreground",title:"Modellgewichte + Arbeitsspeicher (KV-Cache)",children:[l.jsx(du,{className:"h-3.5 w-3.5"})," Reserviert fürs Set"]}),l.jsxs("span",{className:"font-mono font-bold text-foreground",children:[D.toFixed(1),O>0?` / ${O.toFixed(0)}`:""," GB"]})]}),l.jsx("div",{className:"h-2 w-full overflow-hidden rounded-full border border-border/30 bg-background/50",children:l.jsx("div",{className:te("h-full rounded-full transition-all duration-500",B>=85?"bg-red-500":B>=65?"bg-amber-500":"bg-teal-500"),style:{width:`${B}%`}})}),A&&!A.fits&&l.jsxs("p",{className:"mt-2 flex items-start gap-1.5 text-[11px] text-amber-400",children:[l.jsx(mi,{className:"mt-0.5 h-3.5 w-3.5 shrink-0"}),l.jsxs("span",{children:["Zusammen mit dem größten Gelegenheits-Modell (~",A.largest_ondemand_gb," GB, z. B. das große Hirn) passt das Set nicht gleichzeitig in den Speicher. Beim Laden wird das Set kurz verdrängt und danach automatisch nachgeladen — kostet ein paar Sekunden."]})]}),A&&A.fits&&l.jsxs("p",{className:"mt-2 flex items-center gap-1.5 text-[11px] text-emerald-400",children:[l.jsx(or,{className:"h-3.5 w-3.5 shrink-0"})," Passt auch neben dem größten Gelegenheits-Modell — nichts wird verdrängt."]})]}),c&&l.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/60 p-4 backdrop-blur-sm",role:"dialog","aria-modal":"true","aria-label":"Modell zum Immer-bereit-Set hinzufügen",children:l.jsxs("div",{className:"w-full max-w-md space-y-3 rounded-2xl border border-border/80 bg-card p-6 shadow-2xl animate-in fade-in zoom-in-95 duration-200",children:[l.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary",children:"Dauerhaft bereithalten"}),l.jsx("button",{onClick:()=>f(!1),className:"rounded p-1 text-muted-foreground hover:bg-accent hover:text-foreground cursor-pointer",children:l.jsx(zn,{className:"h-4 w-4"})})]}),l.jsx("p",{className:"text-xs text-muted-foreground",children:"Wähle ein Modell, das ohne Ladezeit bereitstehen soll:"}),l.jsx("div",{className:"max-h-60 space-y-1.5 overflow-y-auto pr-1",children:F.map(ie=>l.jsxs("button",{onClick:()=>U(ie.name),className:"flex w-full items-center justify-between gap-2 rounded-lg border border-border/30 bg-background/20 px-3 py-2.5 text-left transition-colors hover:bg-accent cursor-pointer",children:[l.jsxs("span",{className:"flex min-w-0 items-center gap-2",children:[ie.role&&l.jsx(so,{role:ie.role,dense:!0,className:"shrink-0"}),l.jsx("span",{className:"truncate font-mono text-xs font-semibold text-foreground",children:S(ie.name)})]}),l.jsx("span",{className:"shrink-0 font-mono text-[10px] text-muted-foreground/70",children:Mr(ie.size_bytes)})]},ie.name))})]})}),u]}):l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10",children:[l.jsx(W2,{}),l.jsx("p",{className:"mt-3 text-xs text-muted-foreground",children:"Es gibt noch kein Immer-bereit-Set. Es entsteht automatisch, sobald Lucys Hirn zugewiesen ist."}),u]})}function W2(){return l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(ma,{className:"h-4.5 w-4.5 text-primary"}),l.jsxs("div",{children:[l.jsx("h2",{className:"text-sm font-bold uppercase tracking-wide text-foreground",children:"Immer-bereit-Set"}),l.jsx("p",{className:"text-[11px] text-muted-foreground",children:"Diese Modelle hält Lucy immer bereit — sie antworten ohne Ladezeit."})]})]})}function GO(){var Be,Oe,yt,Xt;const e=Kn(),{data:t,isLoading:r,error:n}=xi(4e3),{data:a}=uh(4e3),{data:o}=NE(),{data:u}=bo(),{data:c}=SE(),{showAlert:f,showConfirm:h,showPrompt:m,dialogElement:g}=xa(),v=mE(),b=K=>!!ir(K).protected,j=(t==null?void 0:t.models)??[],k=(t==null?void 0:t.running)??[],S=n?String(n):"",N=()=>{e.invalidateQueries({queryKey:Ve.models}),e.invalidateQueries({queryKey:Ve.routing})},E=(Be=c==null?void 0:c.groups)==null?void 0:Be.brains,A=(E==null?void 0:E.members)??[],P=K=>A.includes(K),M=A.some(K=>k.includes(K));async function O(K){if(!E){f("Keine brains-Gruppe","Es existiert noch keine Ko-Residenz-Gruppe „brains“ in der Engine-Konfiguration. Lege sie erst über die Gruppen-Verwaltung an.");return}const Ce=A.includes(K)?A.filter(Ge=>Ge!==K):[...A,K];try{await kE("brains",Ce,E.swap??!1,E.persist??!0),e.invalidateQueries({queryKey:Ve.groups}),N()}catch(Ge){f("Fehler",`Ko-Residenz konnte nicht geändert werden: ${Ge.message||Ge}`)}}const[D,B]=y.useState(null),[F,z]=y.useState(null),[Y,U]=y.useState(null),[me,ue]=y.useState("grid"),[ge,ie]=y.useState("all"),oe=j.filter(K=>ge==="in_use"?!!K.role||k.includes(K.name):!0);async function X(K){try{await je(`/api/models/${encodeURIComponent(K)}/load`,{method:"POST"}),N()}catch(Se){f("Fehler",`Fehler beim Laden des Modells: ${Se.message}`)}}async function re(K){if(E&&M&&!P(K)){const Se=A.filter(Ce=>k.includes(Ce)).map(Ce=>Ce.split("/").pop()).join(", ");h("Verdrängt das Hirn?",`„${K.split("/").pop()}“ ist nicht in der Ko-Residenz-Gruppe „brains“. Beim Laden wirft es das aktuell warme Hirn (${Se}) raus — Lucy verliert Hirn bzw. Augen. + +Trotzdem exklusiv laden? Tipp: Mit dem 🧠-Schalter machst du das Modell dauerhaft ko-resident, dann bleiben beide warm.`,()=>X(K));return}X(K)}async function J(K){const Se=j.find(Ce=>Ce.name===K);if(Se&&b(Se.role)){f("Geschützt",`„${ir(Se.role).label}" ist lebenswichtig für Lucy und bleibt geladen. Zum Entladen erst im Experten-Modus die Rolle einem anderen Modell geben.`);return}try{await je(`/api/models/${encodeURIComponent(K)}/unload`,{method:"POST"}),N()}catch(Ce){f("Fehler",`Fehler beim Entladen des Modells: ${Ce.message}`)}}async function I(){try{await je("/api/models/unload",{method:"POST"}),N()}catch(K){f("Fehler",`Fehler beim Entladen aller Modelle: ${K.message}`)}}async function _(K,Se){try{const Ce=await je(`/api/models/${encodeURIComponent(Se)}/role`,{method:"POST",body:JSON.stringify({role:K||null})});N(),Ce!=null&&Ce.warning&&f("Hirn gesetzt — Hinweis",Ce.warning)}catch(Ce){f("Fehler",`Fehler beim Zuweisen der Rolle: ${Ce.message||Ce}`)}}function W(K){B(K),z(null),je(`/api/roles/${encodeURIComponent(K)}/recommend`).then(Se=>z(Se)).catch(()=>{})}async function ee(K,Se){let Ce=null;try{Ce=await je(`/api/models/${encodeURIComponent(K)}/ctx/auto`)}catch{}const Ge=Ce?`Optimal für dein Setup: ${(Ce.ctx/1024).toFixed(0)}k (${Ce.ctx}) — GTT ${Ce.gtt_gb} GB − reserviert ${Ce.reserved_gb} GB (${Ce.mode}) → ${Ce.budget_gb} GB frei. »Auto« trägt diesen Wert ein.`:"Gib die gewünschte Kontextlänge in Tokens an:";m("Kontextlänge anpassen",Ge,String(Se||32768),async nt=>{if(nt)try{await je(`/api/models/${encodeURIComponent(K)}/ctx`,{method:"POST",body:JSON.stringify({ctx:parseInt(nt,10)})}),N()}catch(q){f("Fehler",`Fehler beim Setzen des Kontexts: ${q.message||q}`)}},void 0,Ce?{autoValue:String(Ce.ctx),autoLabel:`Auto (${(Ce.ctx/1024).toFixed(0)}k)`}:void 0)}async function Z(K){const Se=j.find(Ce=>Ce.name===K);if(Se&&b(Se.role)){f("Geschützt",`„${ir(Se.role).label}" ist lebenswichtig für Lucy und kann nicht gelöscht werden. Weise die Rolle zuerst einem anderen Modell zu.`);return}h("Modell löschen?",`Modell '${K}' und alle zugehörigen GGUF-Dateien unwiderruflich von der Box löschen?`,async()=>{try{await je(`/api/models/${encodeURIComponent(K)}`,{method:"DELETE"}),N()}catch(Ce){f("Fehler",`Fehler beim Löschen: ${Ce.message||Ce}`)}})}async function he(K,Se,Ce,Ge){try{await je("/api/models/install",{method:"POST",body:JSON.stringify({repo:K,role:Se,quant:Ce,jinja:Ge})}),f("Herunterladen gestartet",`Download für '${K}' gestartet! Der Fortschritt wird oben angezeigt.`)}catch(nt){f("Fehler",`Fehler beim Starten des Upgrades: ${nt.message||nt}`)}}async function pe(K){const Se=o==null?void 0:o.budget,Ce=Se&&!Se.fits?` + +⚠ Speicher-Warnung: Dieses Brain (~${Se.brain_gb} GB) muss immer resident sein. Zusammen mit dem größten on-demand-Modell (~${Se.largest_ondemand_gb} GB) sprengt das das Budget (${Se.gtt_gb} GB) → heavy/coder würden das Brain verdrängen. Erwäge ein kleineres Brain oder weniger Kontext.`:"";h("Agent-Hirn aktualisieren?",`Neues Hermes-Modell '${K.split("/").pop()}' herunterladen und als Agent-Hirn (Rolle hermes) setzen? Hermes nutzt danach automatisch das neue Modell.${Ce}`,async()=>{try{await je("/api/models/install",{method:"POST",body:JSON.stringify({repo:K,role:"hermes",quant:"Q4_K_M",jinja:!0})}),f("Download gestartet","Das neue Agent-Hirn wird geladen. Fortschritt oben."),N()}catch(Ge){f("Fehler",`Update fehlgeschlagen: ${Ge.message||Ge}`)}})}if(r)return l.jsx("div",{className:"text-xs text-muted-foreground py-12 text-center",children:"Initialisiere HUD Cockpit…"});if(S)return l.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400",children:["Gateway oder Engine nicht erreichbar (",S,")."]});const Pe=j.filter(K=>k.includes(K.name)),ne=Pe.reduce((K,Se)=>K+(Se.size_bytes||0),0),we=((Oe=u==null?void 0:u.gpu)==null?void 0:Oe.gtt_total)||((yt=u==null?void 0:u.gpu)==null?void 0:yt.vram_total)||0,_e=((Xt=u==null?void 0:u.gpu)==null?void 0:Xt.gtt_used)||0,le=16*1024**3,Ze=we>2*1024**3?we:ne>le?ne*1.2:le;return l.jsxs("div",{className:"space-y-8",children:[l.jsx("style",{children:` + @keyframes flow-dash { + to { + stroke-dashoffset: -20; + } + } + .svg-flow-path { + stroke-dasharray: 4 6; + animation: flow-dash 1s linear infinite; + } + `}),l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-3.5",children:[l.jsxs("div",{className:"flex justify-between items-center",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(du,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("span",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"VRAM / Memory Belegung"})]}),l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsxs("span",{className:"text-[10px] font-mono text-muted-foreground",children:["Speicher-Pool: ",Mr(ne)," Gewichte",_e>0?` · ${Mr(_e)} real belegt (inkl. KV)`:""," / ",Mr(Ze)]}),v&&k.length>0&&l.jsx("button",{onClick:I,className:"h-6 px-2.5 rounded border border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/10 text-amber-400 text-[9px] font-bold uppercase transition-all cursor-pointer",children:"Alle entladen"})]})]}),l.jsx("div",{className:"h-7 w-full rounded-xl bg-background/50 border border-border/40 overflow-hidden flex p-0.5 relative group",children:Pe.length===0?l.jsx("div",{className:"w-full h-full flex items-center justify-center text-[10px] text-muted-foreground/60 italic font-mono select-none",children:"VRAM Leer — Auto-Swap lädt Modelle bei Anfrage"}):Pe.map((K,Se)=>{var nt;const Ce=(K.size_bytes||0)/Ze*100,Ge=["from-teal-500 to-emerald-500","from-indigo-500 to-blue-500","from-purple-500 to-pink-500","from-cyan-500 to-sky-500"][Se%4];return l.jsxs("div",{style:{width:`${Ce}%`},className:te("h-full rounded bg-gradient-to-r flex items-center justify-between px-2.5 transition-all text-white/95 shrink-0 shadow-inner select-none",Ge),title:`${K.name} (${Mr(K.size_bytes)})`,children:[l.jsxs("span",{className:"text-[9px] font-bold truncate max-w-[120px] font-space tracking-wide",children:[K.role?`[${ir(K.role).short}] `:"",(nt=K.name.split("/").pop())==null?void 0:nt.replace(".gguf","")]}),l.jsx("span",{className:"text-[8px] font-mono opacity-80",children:Mr(K.size_bytes)})]},K.name)})})]}),l.jsx(EX,{}),v&&l.jsx(NX,{}),l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-3.5",children:[l.jsx("div",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground px-1",children:v?"Gateway Steckplatz-Belegung (Slot-Zuweisung)":"Wer macht was bei Lucy — zum Ändern antippen"}),l.jsx("div",{className:"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-6 gap-3",children:WO.map(K=>{var Ge;const Se=j.find(nt=>nt.role===K),Ce=Se?k.includes(Se.name):!1;return l.jsxs("div",{onClick:()=>W(K),className:te("rounded-xl border p-3 flex flex-col justify-between gap-2.5 transition-all cursor-pointer select-none text-left bg-background/25 hover:border-primary/45 hover:bg-background/40 group min-h-[90px]",Ce?"border-emerald-500/40 shadow-sm shadow-emerald-500/5":Se?"border-primary/20 bg-primary/5":"border-border/30 border-dashed opacity-75"),children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx(so,{role:K}),Ce&&l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-400 animate-pulse"})]}),l.jsx("div",{className:"text-[10px] font-mono font-medium truncate text-foreground/90 pr-1 font-space",title:Se==null?void 0:Se.name,children:Se?(Ge=Se.name.split("/").pop())==null?void 0:Ge.replace(/\.gguf$/i,""):"nicht zugewiesen"}),l.jsx("div",{className:"text-[8px] text-primary/70 group-hover:text-primary font-bold uppercase tracking-wider transition-colors font-space",children:"Ändern ➔"})]},K)})})]}),(o==null?void 0:o.current)&&l.jsxs("div",{className:"rounded-2xl border border-indigo-500/30 bg-indigo-500/5 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-3.5",children:[l.jsxs("div",{className:"flex items-center justify-between flex-wrap gap-2",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(gn,{className:"h-4.5 w-4.5 text-indigo-400"}),l.jsx("span",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"Agent-Hirn (Hermes)"}),o.current.version!=null&&l.jsxs("span",{className:"text-[9px] font-mono px-1.5 py-0.5 rounded bg-indigo-500/15 text-indigo-300 border border-indigo-500/25",children:["v",o.current.version]})]}),l.jsx("button",{onClick:()=>window.dispatchEvent(new CustomEvent("mc-navigate",{detail:{view:"agent"}})),className:"h-7 px-3 rounded-lg border border-indigo-500/30 bg-indigo-500/5 text-indigo-300 text-[9px] font-bold uppercase hover:bg-indigo-500/15 transition-all cursor-pointer",title:"Hirn-Wechsel passiert jetzt zentral im Hermes-Tab",children:"Im Hermes-Tab wechseln →"})]}),l.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-3 rounded-xl bg-background/30 border border-border/30 p-3.5",children:[l.jsxs("div",{className:"min-w-0",children:[l.jsx("div",{className:"text-xs font-mono font-bold text-foreground truncate",title:o.current.name,children:o.current.name.split("/").pop()}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2 mt-0.5",children:[l.jsx("span",{children:o.current.params_b?`${o.current.params_b}B`:"—"}),l.jsx("span",{children:"•"}),l.jsx("span",{children:o.current.quant||"GGUF"}),l.jsx("span",{children:"•"}),l.jsx("span",{children:Mr(o.current.size_bytes||0)})]})]}),o.update_available&&o.recommended?l.jsxs("button",{onClick:()=>pe(o.recommended.repo),className:te("h-8 px-3 shrink-0 flex items-center justify-center gap-1.5 rounded-lg text-[10px] font-bold uppercase transition-all cursor-pointer shadow-md",o.budget&&!o.budget.fits?"bg-red-500 text-white hover:bg-red-400 shadow-red-500/10":"bg-amber-500 text-black hover:bg-amber-400 shadow-amber-500/10"),children:[l.jsx(Ms,{className:"h-3.5 w-3.5"})," Aktualisieren"]}):l.jsxs("span",{className:"h-8 px-3 shrink-0 flex items-center gap-1.5 text-[10px] font-bold text-emerald-400 uppercase tracking-wide bg-emerald-500/5 border border-emerald-500/15 rounded-lg select-none",children:[l.jsx(or,{className:"h-4 w-4"})," Neueste Generation"]})]}),o.update_available&&o.recommended&&l.jsxs("div",{className:"text-[10px] text-amber-400/90 flex items-center gap-1.5",children:[l.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-amber-400 animate-ping shrink-0"}),"Neuere Generation verfügbar: ",l.jsx("span",{className:"font-mono font-bold",children:o.recommended.name.replace(/-GGUF$/i,"")}),"(v",o.recommended.version,", ",o.recommended.params_b,"B) — von NousResearch."]}),o.budget&&l.jsxs("div",{className:te("text-[10px] flex items-start gap-1.5 leading-relaxed",o.budget.fits?"text-muted-foreground/80":"text-red-400 font-semibold"),children:[l.jsx(du,{className:"h-3 w-3 shrink-0 mt-0.5"}),l.jsxs("span",{children:["Always-On-Brain ~",o.budget.brain_gb," GB + größtes on-demand (~",o.budget.largest_ondemand_gb," GB) = ",(o.budget.brain_gb+o.budget.largest_ondemand_gb).toFixed(1)," / ",o.budget.gtt_gb," GB",o.budget.fits?" · passt gleichzeitig ✓":" · passt NICHT gleichzeitig ⚠ — heavy/coder würden das Brain verdrängen. Kleineres Brain oder weniger Kontext."]})]})]}),l.jsxs("div",{className:"space-y-4",children:[l.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-3 px-1",children:[l.jsxs("div",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:["Installierte Modell-Bibliothek (",oe.length," von ",j.length,")"]}),l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsxs("div",{className:"flex rounded-lg border border-border/40 bg-card/45 p-0.5",children:[l.jsx("button",{onClick:()=>ie("all"),className:te("px-2.5 py-1 rounded-md text-[9px] font-bold uppercase transition-all cursor-pointer",ge==="all"?"bg-primary text-primary-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:"Vorhanden"}),l.jsx("button",{onClick:()=>ie("in_use"),className:te("px-2.5 py-1 rounded-md text-[9px] font-bold uppercase transition-all cursor-pointer",ge==="in_use"?"bg-primary text-primary-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:"In Benutzung"})]}),l.jsxs("div",{className:"flex rounded-lg border border-border/40 bg-card/45 p-0.5",children:[l.jsx("button",{onClick:()=>ue("grid"),className:te("px-2.5 py-1 rounded-md text-[9px] font-bold uppercase transition-all cursor-pointer",me==="grid"?"bg-primary text-primary-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:"Grid"}),l.jsx("button",{onClick:()=>ue("list"),className:te("px-2.5 py-1 rounded-md text-[9px] font-bold uppercase transition-all cursor-pointer",me==="list"?"bg-primary text-primary-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:"List"})]})]})]}),me==="grid"?l.jsx("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-3",children:oe.length===0?l.jsx("div",{className:"col-span-full text-xs text-muted-foreground border border-dashed border-border/60 rounded-2xl p-12 text-center select-none",children:ge==="in_use"?"Keine Modelle in Benutzung (keine Zuweisung oder warm geladene Modelle).":'Keine Modelle konfiguriert. Verwende den Tab "Modelle finden" zum Herunterladen.'}):oe.map(K=>{const Se=k.includes(K.name),Ce=a==null?void 0:a.model_list.find(nt=>nt.role===K.role),Ge=B2(K.name);return l.jsxs("div",{className:te("rounded-2xl border bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 flex flex-col justify-between gap-4 transition-all duration-300 hover:border-primary/40 group relative overflow-hidden",Se?"border-primary/45 shadow-primary/5":K.role?"border-primary/30 bg-primary/5 shadow-inner":"border-border/60"),children:[l.jsxs("div",{className:"space-y-3",children:[l.jsx("div",{className:"flex items-start justify-between gap-3",children:l.jsxs("div",{className:"flex gap-2.5 min-w-0",children:[l.jsx("div",{className:te("w-7 h-7 rounded-lg border flex items-center justify-center font-bold text-xs shrink-0 shadow-sm",Ge.color),title:Ge.name,children:Ge.initial}),l.jsxs("div",{className:"min-w-0",children:[l.jsx("h3",{className:"text-xs font-bold tracking-tight text-foreground line-clamp-2 break-all font-mono",title:K.name,children:K.name.split("/").pop()}),l.jsxs("div",{className:"flex items-center gap-2 flex-wrap mt-1",children:[l.jsx("span",{className:"text-[9px] font-mono text-muted-foreground bg-background/40 px-1.5 py-0.5 rounded border border-border/30",children:K.quant||"GGUF"}),Se&&l.jsxs("span",{className:"flex items-center gap-1 text-[9px] font-semibold text-emerald-400 uppercase tracking-wider",children:[l.jsx(eh,{className:"h-3 w-3 animate-pulse"})," Warm"]}),K.role&&l.jsx(so,{role:K.role,dense:!0}),b(K.role)&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-background/40 border border-border/40 text-[9px] font-semibold text-muted-foreground",title:"Lebenswichtig für Lucy — geschützt vor Löschen/Entladen.",children:"🔒 geschützt"}),v&&P(K.name)&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-fuchsia-500/10 border border-fuchsia-500/30 text-[9px] font-mono text-fuchsia-300 font-bold uppercase",title:"Ko-resident in der brains-Gruppe — bleibt mit dem Hirn gemeinsam warm, verdrängt es nicht.",children:"🧠 Ko-resident"}),v&&K.prompt_cache&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-cyan-500/10 border border-cyan-500/20 text-[9px] font-mono text-cyan-400 font-bold uppercase",title:"Prompt Caching aktiv",children:"PC"}),v&&(K.spec_active?l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-emerald-500/10 border border-emerald-500/20 text-[9px] font-mono text-emerald-400 font-bold uppercase",title:`Speculative Decoding aktiv (Draft: ${K.spec_draft_model})`,children:"SPEC"}):K.spec_draft_model?l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/20 text-[9px] font-mono text-amber-400 font-bold uppercase",title:`Draft gesetzt (${K.spec_draft_model}), aber INAKTIV — --spec-type fehlt oder Vocab inkompatibel. Über 'Spec' neu konfigurieren.`,children:"SPEC?"}):null),v&&K.parallel_slots>1&&l.jsxs("span",{className:"px-1.5 py-0.5 rounded bg-violet-500/10 border border-violet-500/20 text-[9px] font-mono text-violet-400 font-bold uppercase",title:`${K.parallel_slots} parallele Slots aktiv`,children:["SLOTS: ",K.parallel_slots]}),K.incomplete&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/20 text-[9px] font-mono text-amber-400 font-bold uppercase",title:"GGUF-Datei fehlt — Modell kann nicht geladen werden",children:"⚠ Datei fehlt"})]})]})]})}),l.jsx("div",{className:"border-t border-border/30 pt-3 flex flex-wrap gap-1",children:l.jsx(H2,{caps:K.capabilities})})]}),l.jsxs("div",{className:"space-y-3 pt-1",children:[l.jsxs("div",{className:"grid grid-cols-2 gap-2 text-[10px] font-mono text-muted-foreground",children:[l.jsxs("div",{className:"flex items-center gap-1.5 p-2 bg-background/20 rounded-lg border border-border/20",children:[l.jsx(du,{className:"h-3.5 w-3.5 text-primary/80"}),l.jsxs("div",{children:[l.jsx("div",{className:"text-[8px] uppercase tracking-wider font-semibold text-muted-foreground/60",children:"Größe"}),l.jsx("div",{className:"text-foreground font-semibold",children:Mr(K.size_bytes)})]})]}),l.jsxs("div",{className:"flex items-center gap-1.5 p-2 bg-background/20 rounded-lg border border-border/20",children:[l.jsx(C4,{className:"h-3.5 w-3.5 text-primary/80"}),l.jsxs("div",{children:[l.jsx("div",{className:"text-[8px] uppercase tracking-wider font-semibold text-muted-foreground/60",children:"Kontext"}),l.jsx("div",{className:"text-foreground font-semibold",children:Rw(K.ctx)})]})]})]}),Ce&&l.jsxs("div",{className:"p-3 bg-amber-500/5 border border-amber-500/30 rounded-xl space-y-2 flex flex-col justify-between shrink-0",children:[l.jsxs("div",{className:"text-[9px] font-semibold text-amber-400 flex items-center gap-1",children:[l.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-amber-400 animate-ping"}),l.jsxs("span",{children:["Upgrade verfügbar: ",Ce.repo.split("/").pop()]})]}),l.jsxs("button",{onClick:()=>he(Ce.repo,K.role,K.quant||"Q4_K_M",K.capabilities.tools!=="no"),className:"h-7 w-full flex items-center justify-center gap-1 rounded-lg bg-amber-500 text-black text-[10px] font-bold hover:bg-amber-400 transition-colors cursor-pointer",children:[l.jsx(Ms,{className:"h-3 w-3"})," Smart-Swap starten"]})]}),l.jsxs("div",{className:"flex items-center gap-1.5 border-t border-border/20 pt-3 mt-auto",children:[(()=>{const nt=b(K.role),q=Se&&nt,Le=K.incomplete&&!Se||q;return l.jsx("button",{onClick:()=>Se?J(K.name):re(K.name),disabled:Le,title:q?`„${ir(K.role).label}" bleibt geladen (geschützt).`:void 0,className:te("flex-1 h-7 rounded-lg text-[9px] font-bold uppercase transition-all border flex items-center justify-center gap-1",Le?"border-border/30 bg-background/10 text-muted-foreground/50 cursor-not-allowed":Se?"border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/15 text-amber-400 cursor-pointer":"border-primary/30 bg-primary/5 hover:bg-primary/15 text-primary cursor-pointer"),children:q?"🔒 geladen":Se?"Entladen":"Laden"})})(),v&&l.jsx("button",{onClick:()=>ee(K.name,K.ctx),className:"h-7 px-2.5 rounded-lg border border-border/40 text-[9px] font-bold uppercase hover:bg-accent text-muted-foreground transition-colors cursor-pointer",title:"Kontextlänge anpassen",children:"Ctx"}),v&&E&&l.jsx("button",{onClick:()=>O(K.name),className:te("h-7 px-2.5 rounded-lg border text-[9px] font-bold uppercase transition-colors cursor-pointer",P(K.name)?"border-fuchsia-500/40 bg-fuchsia-500/10 text-fuchsia-300 hover:bg-fuchsia-500/20":"border-border/40 text-muted-foreground hover:bg-accent"),title:P(K.name)?"Ko-resident (brains): bleibt mit dem Hirn gemeinsam warm. Klick = aus der Gruppe nehmen.":"Zur brains-Gruppe hinzufügen — lädt dann ko-resident neben dem Hirn, statt es zu verdrängen.",children:"🧠"}),v&&l.jsxs("button",{onClick:()=>U(K),className:te("h-7 px-2.5 rounded-lg border text-[9px] font-bold uppercase transition-colors cursor-pointer flex items-center gap-1",K.spec_active?"border-emerald-500/30 text-emerald-400 hover:bg-emerald-500/10":K.spec_draft_model?"border-amber-500/30 text-amber-400 hover:bg-amber-500/10":"border-border/40 text-muted-foreground hover:bg-accent"),title:"Speculative Draft konfigurieren (Vocab-geprüft)",children:[l.jsx(ma,{className:"h-3 w-3"})," Spec"]}),l.jsx("button",{onClick:()=>Z(K.name),disabled:b(K.role),className:te("h-7 w-7 rounded-lg border border-border/40 flex items-center justify-center transition-colors",b(K.role)?"text-muted-foreground/40 cursor-not-allowed":"text-muted-foreground hover:text-red-400 hover:bg-red-500/5 cursor-pointer"),"aria-label":"Modell löschen",title:b(K.role)?`„${ir(K.role).label}" ist geschützt und kann nicht gelöscht werden.`:"Modell löschen",children:l.jsx(iv,{className:"h-3.5 w-3.5","aria-hidden":"true"})})]})]})]},K.name)})}):l.jsx("div",{className:"space-y-2",children:oe.length===0?l.jsx("div",{className:"text-xs text-muted-foreground border border-dashed border-border/60 rounded-2xl p-12 text-center select-none",children:ge==="in_use"?"Keine Modelle in Benutzung (keine Zuweisung oder warm geladene Modelle).":'Keine Modelle konfiguriert. Verwende den Tab "Modelle finden" zum Herunterladen.'}):oe.map(K=>{const Se=k.includes(K.name),Ce=B2(K.name);return l.jsxs("div",{className:te("rounded-xl border bg-card/45 backdrop-blur-md p-3.5 shadow-lg shadow-black/5 flex flex-col sm:flex-row sm:items-center justify-between gap-3 hover:border-primary/40 transition-all",Se?"border-primary/45":K.role?"border-primary/30 bg-primary/5":"border-border/60"),children:[l.jsxs("div",{className:"flex items-center gap-3 min-w-0",children:[l.jsx("div",{className:te("w-8 h-8 rounded-lg border border-border/40 flex items-center justify-center font-bold text-xs shrink-0 shadow-sm",Ce.color),title:Ce.name,children:Ce.initial}),l.jsxs("div",{className:"min-w-0 text-left",children:[l.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[l.jsx("h4",{className:"text-xs font-bold text-foreground truncate max-w-[250px] sm:max-w-[400px] break-all font-mono",title:K.name,children:K.name.split("/").pop()}),K.role&&l.jsx(so,{role:K.role,dense:!0,className:"shrink-0"}),b(K.role)&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-background/40 border border-border/40 text-[8px] font-semibold text-muted-foreground shrink-0",title:"Lebenswichtig für Lucy — geschützt vor Löschen/Entladen.",children:"🔒 geschützt"}),v&&P(K.name)&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-fuchsia-500/10 border border-fuchsia-500/30 text-[8px] font-mono text-fuchsia-300 font-bold uppercase shrink-0",title:"Ko-resident in der brains-Gruppe — bleibt mit dem Hirn gemeinsam warm.",children:"🧠 Ko-resident"}),v&&K.prompt_cache&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-cyan-500/10 border border-cyan-500/20 text-[8px] font-mono text-cyan-400 font-bold uppercase shrink-0",title:"Prompt Caching aktiv",children:"PC"}),v&&(K.spec_active?l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-emerald-500/10 border border-emerald-500/20 text-[8px] font-mono text-emerald-400 font-bold uppercase shrink-0",title:`Speculative Decoding aktiv (Draft: ${K.spec_draft_model})`,children:"SPEC"}):K.spec_draft_model?l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/20 text-[8px] font-mono text-amber-400 font-bold uppercase shrink-0",title:`Draft gesetzt (${K.spec_draft_model}), aber INAKTIV — --spec-type fehlt oder Vocab inkompatibel.`,children:"SPEC?"}):null),v&&K.parallel_slots>1&&l.jsxs("span",{className:"px-1.5 py-0.5 rounded bg-violet-500/10 border border-violet-500/20 text-[8px] font-mono text-violet-400 font-bold uppercase shrink-0",title:`${K.parallel_slots} parallele Slots aktiv`,children:["SLOTS: ",K.parallel_slots]}),K.incomplete&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/20 text-[8px] font-mono text-amber-400 font-bold uppercase shrink-0",title:"GGUF-Datei fehlt",children:"⚠ Datei fehlt"}),Se&&l.jsxs("span",{className:"flex items-center gap-0.5 text-[8px] font-semibold text-emerald-400 uppercase tracking-wider shrink-0",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"})," warm"]})]}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2 mt-0.5",children:[l.jsxs("span",{children:["Größe: ",Mr(K.size_bytes)]}),l.jsx("span",{children:"•"}),l.jsxs("span",{children:["Kontext: ",Rw(K.ctx)]}),l.jsx("span",{children:"•"}),l.jsx("span",{className:"font-mono text-[9px]",children:K.quant||"GGUF"})]})]})]}),l.jsxs("div",{className:"flex items-center gap-3 shrink-0 self-end sm:self-auto",children:[l.jsx("div",{className:"hidden lg:flex flex-wrap gap-1",children:l.jsx(H2,{caps:K.capabilities})}),l.jsxs("div",{className:"flex items-center gap-1.5",children:[(()=>{const Ge=b(K.role),nt=Se&&Ge,q=K.incomplete&&!Se||nt;return l.jsx("button",{onClick:()=>Se?J(K.name):re(K.name),disabled:q,title:nt?`„${ir(K.role).label}" bleibt geladen (geschützt).`:void 0,className:te("h-7 px-3 rounded-lg text-[9px] font-bold uppercase transition-all border flex items-center gap-1",q?"border-border/30 bg-background/10 text-muted-foreground/50 cursor-not-allowed":Se?"border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/15 text-amber-400 cursor-pointer":"border-primary/30 bg-primary/5 hover:bg-primary/15 text-primary cursor-pointer"),children:nt?"🔒 geladen":Se?"Entladen":"Laden"})})(),v&&l.jsx("button",{onClick:()=>ee(K.name,K.ctx),className:"h-7 px-2.5 rounded-lg border border-border/40 text-[9px] font-bold uppercase hover:bg-accent text-muted-foreground transition-all cursor-pointer",title:"Kontextlänge anpassen",children:"Ctx"}),v&&E&&l.jsx("button",{onClick:()=>O(K.name),className:te("h-7 px-2.5 rounded-lg border text-[9px] font-bold uppercase transition-colors cursor-pointer",P(K.name)?"border-fuchsia-500/40 bg-fuchsia-500/10 text-fuchsia-300 hover:bg-fuchsia-500/20":"border-border/40 text-muted-foreground hover:bg-accent"),title:P(K.name)?"Ko-resident (brains): bleibt mit dem Hirn gemeinsam warm. Klick = aus der Gruppe nehmen.":"Zur brains-Gruppe hinzufügen — lädt dann ko-resident neben dem Hirn, statt es zu verdrängen.",children:"🧠"}),v&&l.jsxs("button",{onClick:()=>U(K),className:te("h-7 px-2.5 rounded-lg border text-[9px] font-bold uppercase transition-all cursor-pointer flex items-center gap-1",K.spec_active?"border-emerald-500/30 text-emerald-400 hover:bg-emerald-500/10":K.spec_draft_model?"border-amber-500/30 text-amber-400 hover:bg-amber-500/10":"border-border/40 text-muted-foreground hover:bg-accent"),title:"Speculative Draft konfigurieren (Vocab-geprüft)",children:[l.jsx(ma,{className:"h-3 w-3"})," Spec"]}),l.jsx("button",{onClick:()=>Z(K.name),disabled:b(K.role),className:te("h-7 w-7 rounded-lg flex items-center justify-center border border-border/40 transition-all",b(K.role)?"text-muted-foreground/40 cursor-not-allowed":"text-muted-foreground hover:text-red-400 hover:bg-red-500/5 cursor-pointer"),"aria-label":"Modell löschen",title:b(K.role)?`„${ir(K.role).label}" ist geschützt und kann nicht gelöscht werden.`:"Modell löschen",children:l.jsx(iv,{className:"h-3.5 w-3.5","aria-hidden":"true"})})]})]})]},K.name)})})]}),D&&l.jsx(kX,{role:D,roleRec:F,models:j,onAssign:K=>{_(D,K),B(null)},onClose:()=>B(null)}),Y&&l.jsx(bX,{model:Y,onClose:()=>U(null),onChanged:N}),g]})}const AX=[{key:"popular",label:"Beliebt",q:""},{key:"coder",label:"Coder",q:"coder"},{key:"vision",label:"Vision",q:"vision"},{key:"reasoning",label:"Reasoning",q:"reasoning"},{key:"small",label:"Klein (≤4B)",q:"3B"}],CX=["fast","heavy","coder","vision","hermes","scout"],PX=new Intl.NumberFormat(void 0,{notation:"compact",maximumFractionDigits:1});function K2(e){return PX.format(e)}function OX(){const{data:e}=xi(),t=(e==null?void 0:e.models)??[],[r,n]=y.useState(""),[a,o]=y.useState([]),[u,c]=y.useState(!1),[f,h]=y.useState(""),[m,g]=y.useState("popular"),[v,b]=y.useState(""),[j,k]=y.useState(null),[S,N]=y.useState([]),[E,A]=y.useState("Q4_K_M"),[P,M]=y.useState(""),[O,D]=y.useState(null),[B,F]=y.useState(!1),[z,Y]=y.useState({});async function U(_){c(!0),h("");try{const W=await je(`/api/hf/search?q=${encodeURIComponent(_)}`);o(W.results),W.results.length||h("Keine Ergebnisse.")}catch(W){h(`Suche fehlgeschlagen: ${W}`)}finally{c(!1)}}y.useEffect(()=>{U("")},[]);function me(_){g(_.key),n(""),U(_.q)}function ue(){g(""),U(r)}async function ge(_,W,ee){F(!1);try{const Z=await je(`/api/fit?params_b=0&quant=${encodeURIComponent(W)}&ctx=8192&name=${encodeURIComponent(_)}&role=${encodeURIComponent(ee)}`);D(Z)}catch{D(null)}}async function ie(_){if(j===_){k(null);return}k(_),N([]),D(null),M(""),F(!1),h("Analysiere Repository…");try{const W=await je(`/api/hf/quants?repo=${encodeURIComponent(_)}`);N(W.quants);const ee=W.quants.includes("Q4_K_M")?"Q4_K_M":W.quants[0]||"Q4_K_M";A(ee),h(W.quants.length?"":"Keine GGUF-Dateien in diesem Repo gefunden."),W.quants.length&&ge(W.repo,ee,"")}catch(W){h(`Fehler: ${W}`)}}function oe(){const _=v.trim();_&&(o(W=>W.some(ee=>ee.repo===_)?W:[{repo:_,downloads:0,likes:0},...W]),b(""),ie(_))}const X=P?t.find(_=>(_.role||"").toLowerCase()===P):void 0;async function re(_){if((O==null?void 0:O.fit.level)==="too_tight"&&!B){F(!0);return}Y(W=>({...W,[_]:"Starte…"}));try{await je("/api/models/install",{method:"POST",body:JSON.stringify({repo:_,quant:E,role:P||void 0,jinja:!0})}),Y(W=>({...W,[_]:"Download läuft"})),F(!1)}catch{Y(ee=>({...ee,[_]:"Fehler"}))}}const J=_=>{var ee;const W=((ee=_.split("/").pop())==null?void 0:ee.toLowerCase().replace(/-gguf$/i,""))||"";return W.length>3&&t.some(Z=>Z.name.toLowerCase().includes(W))},I=_=>_==="perfect"?"text-emerald-400 border-emerald-500/40 bg-emerald-500/10":_==="marginal"?"text-amber-400 border-amber-500/40 bg-amber-500/10":"text-red-400 border-red-500/40 bg-red-500/10";return l.jsxs("div",{className:"space-y-5",children:[l.jsxs("div",{className:"flex gap-2",children:[l.jsxs("div",{className:"relative flex-1",children:[l.jsx(PN,{className:"absolute left-3 top-2.5 h-4 w-4 text-muted-foreground"}),l.jsx("input",{value:r,onChange:_=>n(_.target.value),onKeyDown:_=>_.key==="Enter"&&ue(),"aria-label":"HuggingFace durchsuchen",type:"search",spellCheck:!1,placeholder:"HuggingFace durchsuchen (z.B. Qwen Coder, Llama-3.1, gemma)…",className:"w-full h-10 pl-9 pr-3 rounded-xl border border-border/60 bg-background/40 text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground"})]}),l.jsx("button",{onClick:ue,className:"h-10 px-5 rounded-xl bg-primary text-primary-foreground text-xs font-semibold hover:opacity-90 transition-all cursor-pointer",children:"Suchen"})]}),l.jsx("div",{className:"flex items-center gap-2 flex-wrap",children:AX.map(_=>l.jsxs("button",{onClick:()=>me(_),className:te("flex items-center gap-1.5 rounded-full px-3 py-1.5 text-[11px] font-semibold transition-all cursor-pointer border",m===_.key?"bg-primary/15 text-primary border-primary/30":"border-border/50 text-muted-foreground hover:text-foreground hover:border-border"),children:[_.key==="popular"&&l.jsx(u4,{className:"h-3 w-3"}),_.label]},_.key))}),u?l.jsx("div",{className:"text-xs text-muted-foreground py-10 text-center",children:"Lade GGUF-Modelle von HuggingFace…"}):l.jsxs("div",{className:"space-y-2",children:[a.map(_=>{const W=j===_.repo,ee=J(_.repo),Z=_.repo.includes("/")?_.repo.split("/")[0]:"—",he=_.repo.split("/").pop();return l.jsxs("div",{className:te("rounded-xl border bg-card/45 backdrop-blur-md transition-all",W?"border-primary/40 shadow-lg shadow-primary/5":"border-border/50 hover:border-primary/30"),children:[l.jsxs("button",{onClick:()=>ie(_.repo),className:"w-full flex items-center gap-3 p-3.5 text-left cursor-pointer",children:[l.jsxs("div",{className:"min-w-0 flex-1",children:[l.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[l.jsx("span",{className:"text-xs font-bold font-mono text-foreground truncate max-w-[280px]",title:_.repo,children:he}),ee&&l.jsxs("span",{className:"flex items-center gap-1 text-[8px] font-bold text-emerald-400 uppercase tracking-wider bg-emerald-500/10 border border-emerald-500/20 px-1.5 py-0.5 rounded",children:[l.jsx(or,{className:"h-2.5 w-2.5"})," installiert"]})]}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-3 mt-0.5 font-mono",children:[l.jsx("span",{children:Z}),l.jsxs("span",{className:"flex items-center gap-1",children:[l.jsx(Ms,{className:"h-3 w-3"})," ",K2(_.downloads)]}),_.likes>0&&l.jsxs("span",{className:"flex items-center gap-1",children:[l.jsx(m4,{className:"h-3 w-3"})," ",K2(_.likes)]})]})]}),W?l.jsx(AN,{className:"h-4 w-4 text-muted-foreground shrink-0"}):l.jsx(EN,{className:"h-4 w-4 text-muted-foreground shrink-0"})]}),W&&l.jsx("div",{className:"border-t border-border/30 p-3.5 space-y-3",children:S.length===0?l.jsx("div",{className:"text-[11px] text-muted-foreground font-mono",children:f||"Lade Quants…"}):l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[l.jsx("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground",children:"Quant"}),l.jsx("select",{value:E,onChange:pe=>{A(pe.target.value),ge(_.repo,pe.target.value,P)},"aria-label":"Quantisierung",className:"h-8 rounded-lg border border-border/60 bg-background/40 px-2 text-xs text-foreground font-semibold outline-none",children:S.map(pe=>l.jsx("option",{value:pe,className:"bg-popover text-foreground",children:pe},pe))}),l.jsx("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground ml-1",children:"Rolle"}),l.jsxs("select",{value:P,onChange:pe=>{M(pe.target.value),ge(_.repo,E,pe.target.value)},"aria-label":"Rolle",title:"Optional — bestimmt Auto-Konfiguration + setup-bewussten Kontext",className:"h-8 rounded-lg border border-border/60 bg-background/40 px-2 text-xs text-foreground font-semibold outline-none",children:[l.jsx("option",{value:"",className:"bg-popover text-foreground",children:"keine"}),CX.map(pe=>l.jsx("option",{value:pe,className:"bg-popover text-foreground",children:pe},pe))]}),l.jsx("button",{onClick:()=>re(_.repo),disabled:!!z[_.repo]&&z[_.repo]==="Download läuft",className:te("h-8 px-3.5 ml-auto rounded-lg text-xs font-semibold transition-all cursor-pointer flex items-center gap-1.5",B?"bg-red-500 text-white hover:opacity-90":"bg-primary text-primary-foreground hover:opacity-90"),children:z[_.repo]?z[_.repo]:B?l.jsxs(l.Fragment,{children:[l.jsx(mi,{className:"h-3.5 w-3.5"})," OOM — trotzdem laden"]}):l.jsxs(l.Fragment,{children:[l.jsx(Ms,{className:"h-3.5 w-3.5"})," Herunterladen"]})})]}),O&&l.jsxs("div",{className:te("flex flex-wrap items-center gap-x-3 gap-y-1 rounded-lg border px-3 py-2 text-[11px] font-medium",I(O.fit.level)),children:[l.jsx("span",{className:"font-bold uppercase tracking-wide",children:O.fit.text}),l.jsxs("span",{className:"font-mono opacity-90",children:["~",O.params_b,"B · ~",O.fit.req_gb," GB / ",O.sys_ram_gb," GB · ~",O.fit.tps," t/s"]}),O.fit.level!=="too_tight"?l.jsxs("span",{className:"font-mono opacity-80",children:["ctx → ",(O.assigned_ctx/1024).toFixed(0),"k"]}):l.jsx("span",{className:"opacity-90",children:"— passt nicht, würde beim Laden abstürzen (OOM)."})]}),X&&l.jsxs("div",{className:"flex items-start gap-2 rounded-lg border border-amber-500/40 bg-amber-500/10 px-3 py-2 text-[11px] text-amber-400",children:[l.jsx(mi,{className:"h-3.5 w-3.5 mt-0.5 shrink-0"}),l.jsxs("span",{children:["Rolle ",l.jsxs("strong",{children:["„",P,'"']})," hält aktuell ",l.jsx("strong",{children:X.name.split("/").pop()})," — wird beim Download übernommen."]})]})]})})]},_.repo)}),!a.length&&!u&&l.jsx("div",{className:"text-xs text-muted-foreground py-10 text-center",children:f||"Keine Ergebnisse."})]}),l.jsxs("div",{className:"border-t border-border/30 pt-4 flex flex-col sm:flex-row gap-2 items-stretch sm:items-center",children:[l.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground shrink-0",children:"Direkt:"}),l.jsx("input",{value:v,onChange:_=>b(_.target.value),onKeyDown:_=>_.key==="Enter"&&oe(),"aria-label":"Repository oder URL direkt eingeben",spellCheck:!1,placeholder:"org/repo oder HF-URL (z.B. unsloth/Qwen2.5-Coder-7B-Instruct-GGUF)",className:"flex-1 h-9 rounded-lg border border-border/60 bg-background/40 px-3 text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground font-mono"}),l.jsx("button",{onClick:oe,className:"h-9 px-4 rounded-lg border border-border/60 bg-background/20 text-xs font-semibold hover:border-primary/50 hover:bg-background/40 transition-all cursor-pointer whitespace-nowrap",children:"Laden"})]})]})}const _X={fast:{title:"Schnelles Alltags-Hirn",desc:"Schnelle MoE-Antworten für Chat, Zusammenfassungen und alltägliche Aufgaben.",icon:ma},heavy:{title:"Schweres Reasoning",desc:"Große Modelle für komplexe Logik, Mathematik und tiefgründiges Planen.",icon:yo},coder:{title:"Coden & Entwicklung",desc:"Autovervollständigung, Refactoring und Codegenerierung direkt in deiner IDE.",icon:_s},vision:{title:"Bilder & Vision",desc:"Verarbeitet Bilder, Screenshots und visuelle Diagramme in multimodalen Chats.",icon:ef},hermes:{title:"Lucys Hirn (Agent)",desc:"Lucys dauer-warmes Agent-Hirn mit Tool-Calling — bleibt ko-resident, lädt nie kalt nach.",icon:Q3},scout:{title:"Multimodal-Allrounder",desc:"Multimodaler Allrounder für schnelle Antworten, Übersetzungen und Alltag.",icon:rv}};function MX(){const{data:e,isLoading:t,error:r}=RD(),{data:n}=xi(),{data:a}=uh(),o=(n==null?void 0:n.models)??[],u=r?String(r):"",[c,f]=y.useState({}),[h,m]=y.useState({}),[g,v]=y.useState("recommended");async function b(j,k,S,N){f(E=>({...E,[j]:"Starte..."}));try{await je("/api/models/install",{method:"POST",body:JSON.stringify({repo:j,role:k,quant:S,jinja:N})}),f(E=>({...E,[j]:"Download läuft"}))}catch{f(A=>({...A,[j]:"Fehler"}))}}return l.jsxs("div",{className:"space-y-6",children:[l.jsx("div",{className:"flex rounded-xl border border-border/60 bg-card/45 backdrop-blur-md p-1 w-fit",children:[["recommended","Empfohlen"],["browse","Stöbern & Suchen"]].map(([j,k])=>l.jsx("button",{onClick:()=>v(j),className:te("rounded-lg px-4 py-1.5 text-xs font-semibold tracking-wide transition-all cursor-pointer",g===j?"bg-primary text-primary-foreground shadow-md shadow-primary/10":"text-muted-foreground hover:text-foreground"),children:k},j))}),g==="browse"?l.jsx(OX,{}):t?l.jsx("div",{className:"text-xs text-muted-foreground py-12 text-center",children:"Analysiere Hardware und suche passende GGUF-Empfehlungen…"}):u||!e?l.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400",children:["Empfehlungsdienst temporär nicht erreichbar (",u,")."]}):l.jsxs("div",{className:"space-y-8",children:[l.jsxs("div",{className:"text-[10px] font-mono text-muted-foreground bg-background/25 border border-border/40 p-4 rounded-xl flex flex-col sm:flex-row sm:items-center justify-between gap-3 shadow-sm",children:[l.jsxs("div",{children:["Modell-Registry geladen für ",l.jsxs("span",{className:"text-foreground font-bold",children:[e.sys_ram_gb," GB"]})," System-RAM."]}),l.jsxs("div",{className:"flex items-center gap-1.5",children:[l.jsx(F4,{className:"h-3.5 w-3.5 text-primary fill-primary/20"}),l.jsx("span",{children:"Empfehlungen sind automatisch auf deine Box-Hardware optimiert."})]})]}),l.jsx("div",{className:"grid gap-6 md:grid-cols-2",children:e.categories.map(j=>{const k=_X[j.role]||{title:j.title||j.role,desc:"Spezifisches Modell für diese Systemrolle.",icon:vy},S=k.icon,N=o.find(D=>D.role===j.role),E=a==null?void 0:a.model_list.find(D=>D.role===j.role),A=j.models.find(D=>D.repo===j.recommended)||j.models[0];if(!A)return null;const P=c[A.repo],M=j.models.filter(D=>D.repo!==j.recommended),O=!!h[j.role];return l.jsxs("div",{className:te("rounded-2xl border bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 flex flex-col justify-between gap-5 transition-all duration-300 hover:border-primary/40",N?"border-border/60":"border-primary/20 shadow-primary/5"),children:[l.jsxs("div",{className:"space-y-4",children:[l.jsxs("div",{className:"flex items-start justify-between gap-3",children:[l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsx("div",{className:"w-10 h-10 rounded-xl bg-primary/10 border border-primary/20 flex items-center justify-center text-primary shadow-sm shrink-0",children:l.jsx(S,{className:"h-5.5 w-5.5"})}),l.jsxs("div",{children:[l.jsx("h3",{className:"text-sm font-bold tracking-tight text-foreground",children:k.title}),l.jsxs("span",{className:"text-[9px] font-mono text-muted-foreground uppercase bg-background/50 px-1.5 py-0.5 rounded border border-border/30 inline-block mt-0.5",children:["Rolle: ",j.role]})]})]}),N?l.jsxs("span",{className:"flex items-center gap-1.5 text-[9px] font-bold text-emerald-400 uppercase tracking-wider bg-emerald-500/10 border border-emerald-500/20 px-2.5 py-1 rounded-lg",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"}),"Aktiviert"]}):l.jsx("span",{className:"text-[9px] font-bold text-primary/70 uppercase tracking-wider bg-primary/10 border border-primary/20 px-2.5 py-1 rounded-lg",children:"Frei"})]}),l.jsx("p",{className:"text-xs text-muted-foreground leading-relaxed",children:k.desc}),l.jsx("div",{className:"p-3.5 rounded-xl bg-background/35 border border-border/30 space-y-2.5",children:N?l.jsxs("div",{className:"space-y-1.5",children:[l.jsx("div",{className:"text-[9px] font-bold uppercase tracking-wider text-muted-foreground/60",children:"Aktive GGUF-Belegung"}),l.jsx("div",{className:"text-xs font-mono font-bold text-foreground truncate",title:N.name,children:N.name.split("/").pop()}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2",children:[l.jsxs("span",{children:["Größe: ",pv(N.size_bytes||0)]}),l.jsx("span",{children:"•"}),l.jsxs("span",{children:["Quant: ",N.quant||"GGUF"]})]})]}):l.jsxs("div",{className:"space-y-1.5",children:[l.jsx("div",{className:"text-[9px] font-bold uppercase tracking-wider text-primary/80",children:"Empfohlenes Modell"}),l.jsx("div",{className:"text-xs font-mono font-bold text-foreground truncate",title:A.name,children:A.name}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2 flex-wrap",children:[l.jsxs("span",{children:["Ersteller: ",A.author]}),l.jsx("span",{children:"•"}),l.jsxs("span",{children:["Quant: ",A.quant]})]}),l.jsx("div",{className:"flex items-center gap-1.5 pt-0.5",children:l.jsx(hX,{fit:A.fit})})]})}),l.jsx("div",{className:"pt-1",children:N?E?l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"text-[9px] font-semibold text-amber-400 flex items-center gap-1.5",children:[l.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-amber-400 animate-ping shrink-0"}),l.jsxs("span",{children:["Bessere Version in der Registry: ",E.repo.split("/").pop()]})]}),l.jsxs("button",{onClick:()=>b(E.repo,j.role,A.quant||"Q4_K_M",A.caps.tools!=="no"),disabled:!!c[E.repo],className:"h-8 w-full flex items-center justify-center gap-1.5 rounded-lg bg-amber-500 text-black text-xs font-bold hover:bg-amber-400 disabled:opacity-50 transition-all cursor-pointer shadow-md shadow-amber-500/10",children:[l.jsx(Ms,{className:"h-3.5 w-3.5"}),c[E.repo]||"Auf neue Version aktualisieren"]})]}):l.jsxs("div",{className:"h-8 flex items-center justify-center gap-1.5 text-[10px] font-bold text-emerald-400 uppercase tracking-wide bg-emerald-500/5 border border-emerald-500/10 rounded-lg select-none",children:[l.jsx(or,{className:"h-4 w-4"})," Auf neuestem Stand"]}):l.jsxs("button",{onClick:()=>b(A.repo,j.role,A.quant||"Q4_K_M",A.caps.tools!=="no"),disabled:!!P,className:te("h-8 w-full flex items-center justify-center gap-1.5 rounded-lg text-xs font-bold transition-all cursor-pointer border",P?"border-primary/40 bg-primary/5 text-primary":"bg-primary text-primary-foreground hover:opacity-90 shadow-md shadow-primary/10"),children:[l.jsx(Ms,{className:"h-3.5 w-3.5"}),P||"Optimales Modell einsetzen"]})})]}),M.length>0&&l.jsxs("div",{className:"border-t border-border/20 pt-3",children:[l.jsxs("button",{onClick:()=>m(D=>({...D,[j.role]:!O})),className:"flex items-center gap-1.5 text-[10px] text-muted-foreground/80 hover:text-foreground transition-colors cursor-pointer",children:[O?l.jsx(AN,{className:"h-3 w-3"}):l.jsx(EN,{className:"h-3 w-3"}),l.jsxs("span",{children:["Alternative Empfehlungen anzeigen (",M.length,")"]})]}),O&&l.jsx("div",{className:"mt-2.5 space-y-2 max-h-36 overflow-y-auto pr-1 scrollbar-thin",children:M.map(D=>l.jsxs("div",{className:"p-2 rounded-lg bg-background/25 border border-border/20 flex items-center justify-between gap-3",children:[l.jsxs("div",{className:"min-w-0",children:[l.jsx("div",{className:"text-[10px] font-mono font-bold text-foreground truncate",title:D.name,children:D.name}),l.jsxs("div",{className:"text-[9px] text-muted-foreground flex items-center gap-1.5 mt-0.5",children:[l.jsxs("span",{children:["Quant: ",D.quant]}),l.jsx("span",{children:"•"}),l.jsx("span",{children:D.fit.text})]})]}),l.jsx("button",{onClick:()=>b(D.repo,j.role,D.quant||"Q4_K_M",D.caps.tools!=="no"),disabled:!!c[D.repo],className:"h-6 px-2.5 rounded bg-background/40 hover:bg-background/80 border border-border/40 text-[9px] font-bold text-foreground transition-all cursor-pointer shrink-0 disabled:opacity-50",children:c[D.repo]||"Installieren"})]},D.repo))})]})]},j.role)})})]})]})}function IX(){const[e,t]=y.useState("cockpit");return l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{className:"flex flex-col sm:flex-row justify-between sm:items-center gap-4",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Modell-Manager"}),l.jsx("p",{className:"text-sm text-muted-foreground",children:"Verwalte deine Modelle und passe das Gateway-Routing live über das interaktive Cockpit an."})]}),l.jsx("div",{className:"flex rounded-xl border border-border/60 bg-card/45 backdrop-blur-md p-1 self-start",children:["cockpit","discover"].map(r=>l.jsx("button",{onClick:()=>t(r),className:te("rounded-lg px-4 py-1.5 text-xs font-semibold tracking-wide uppercase transition-all cursor-pointer",e===r?"bg-primary text-primary-foreground shadow-md shadow-primary/10":"text-muted-foreground hover:text-foreground"),children:r==="cockpit"?"Cockpit":"Modelle finden"},r))})]}),l.jsx(xX,{}),l.jsx("div",{className:"transition-all duration-300",children:e==="cockpit"?l.jsx(GO,{}):l.jsx(MX,{})})]})}const TX={cline:"cline_settings.json",cursor:"Settings → Models",opencode:"opencode.jsonc",zed:"settings.json",continue:"~/.continue/config.json",claude_code:"~/.zshrc / env"};function G2({line:e,loading:t}){return t||!e?l.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] font-semibold text-muted-foreground",children:[l.jsx(rh,{className:"h-3 w-3 animate-spin"})," prüfe…"]}):e.ok?l.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] font-semibold text-emerald-400",children:[l.jsx(e4,{className:"h-3 w-3"})," ",e.detail]}):l.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] font-semibold text-red-400",children:[l.jsx(r4,{className:"h-3 w-3"})," ",e.detail]})}function V2({tool:e,fileName:t,accent:r,copied:n,onCopy:a}){return l.jsxs("div",{className:"flex flex-col border border-border/60 bg-black/60 rounded-2xl overflow-hidden shadow-2xl",children:[l.jsxs("div",{className:"flex h-11 items-center justify-between px-4 border-b border-border/40 bg-black/40 shrink-0",children:[l.jsxs("div",{className:"flex items-center gap-1.5",children:[l.jsx("span",{className:"h-3 w-3 rounded-full bg-red-500/80"}),l.jsx("span",{className:"h-3 w-3 rounded-full bg-amber-500/80"}),l.jsx("span",{className:"h-3 w-3 rounded-full bg-emerald-500/80"})]}),l.jsx("div",{className:"flex items-center gap-1.5 text-[10px] font-mono text-muted-foreground/75 bg-background/30 px-3 py-1 rounded-md border border-border/20",children:l.jsx("span",{children:t})}),l.jsxs("button",{onClick:a,className:"flex h-7 px-2.5 items-center gap-1.5 rounded-lg border border-border/40 bg-background/30 text-[10px] font-semibold text-muted-foreground hover:text-foreground hover:bg-background/60 transition-all cursor-pointer",children:[n?l.jsx(or,{className:"h-3.5 w-3.5 text-emerald-400"}):l.jsx(nv,{className:"h-3.5 w-3.5"}),l.jsx("span",{children:n?"Kopiert":"Kopieren"})]})]}),l.jsx("pre",{className:te("p-5 overflow-x-auto text-xs font-mono whitespace-pre leading-relaxed scrollbar-thin select-text bg-black/10",r==="teal"?"text-cyan-200/90":"text-violet-200/90"),children:l.jsx("code",{children:e.snippet})})]})}function VO(){const[e,t]=y.useState(localStorage.getItem("mc_host")||"192.168.178.151"),[r,n]=y.useState(localStorage.getItem("mc_mcp_path")||""),[a,o]=y.useState("cline"),[u,c]=y.useState(null),f=new URLSearchParams({host:e});r&&f.set("mcp_path",r);const{data:h,error:m}=$D(f.toString()),{data:g,isLoading:v}=zD(),b=m?String(m):"";function j(E){t(E),E&&localStorage.setItem("mc_host",E)}function k(E){n(E),localStorage.setItem("mc_mcp_path",E)}const S=h==null?void 0:h.tools[a];async function N(E,A){A&&(await navigator.clipboard.writeText(A),c(E),setTimeout(()=>c(null),1500))}return l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Verbindung & Integration"}),l.jsxs("p",{className:"text-sm text-muted-foreground",children:["Binde deinen lokalen Agenten an die Box an — über ",l.jsx("span",{className:"text-foreground",children:"zwei getrennte Leitungen"}),": das Modell (Gateway) und das geteilte Gedächtnis (MCP)."]})]}),l.jsxs("div",{className:"p-5 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md shadow-lg shadow-black/10",children:[l.jsxs("div",{className:"grid gap-4 md:grid-cols-[170px_1fr] items-center",children:[l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-background/40 p-4 text-center",children:[l.jsx(g4,{className:"h-7 w-7 mx-auto text-muted-foreground"}),l.jsx("div",{className:"mt-2 text-sm font-semibold text-foreground",children:"Dein lokaler Agent"}),l.jsx("div",{className:"text-[11px] text-muted-foreground",children:"Cline · Cursor · Zed …"})]}),l.jsxs("div",{className:"flex flex-col gap-2.5",children:[l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsx(Zd,{className:"h-4 w-4 text-muted-foreground shrink-0"}),l.jsxs("div",{className:"flex-1 rounded-xl border border-primary/25 bg-primary/5 px-3.5 py-2.5",children:[l.jsxs("div",{className:"flex items-center justify-between gap-2",children:[l.jsxs("div",{className:"flex items-center gap-2 text-xs font-semibold text-primary",children:[l.jsx($n,{className:"h-3.5 w-3.5"})," Leitung 1 — Modell"]}),l.jsx(G2,{line:g==null?void 0:g.gateway,loading:v})]}),l.jsx("div",{className:"mt-1 text-[11px] font-mono text-primary/80",children:"Gateway · :9001/v1 · Lanes chat / coding"})]})]}),l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsx(Zd,{className:"h-4 w-4 text-muted-foreground shrink-0"}),l.jsxs("div",{className:"flex-1 rounded-xl border border-violet-500/25 bg-violet-500/5 px-3.5 py-2.5",children:[l.jsxs("div",{className:"flex items-center justify-between gap-2",children:[l.jsxs("div",{className:"flex items-center gap-2 text-xs font-semibold text-violet-300",children:[l.jsx(yo,{className:"h-3.5 w-3.5"})," Leitung 2 — Gedächtnis"]}),l.jsx(G2,{line:g==null?void 0:g.memory,loading:v})]}),l.jsx("div",{className:"mt-1 text-[11px] font-mono text-violet-300/80",children:"MCP · mcp_memory.py · separat"})]})]})]})]}),l.jsxs("p",{className:"mt-3.5 text-[11px] text-muted-foreground leading-relaxed",children:["Der Gateway liefert ",l.jsx("span",{className:"text-foreground",children:"nur das LLM"}),". Das geteilte Gedächtnis läuft über einen",l.jsx("span",{className:"text-foreground",children:" eigenen MCP-Server"})," — beide werden unabhängig eingerichtet."]})]}),l.jsxs("div",{className:"grid gap-4 md:grid-cols-2 p-5 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md shadow-lg shadow-black/10",children:[l.jsxs("div",{className:"space-y-1.5",children:[l.jsxs("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground flex items-center gap-1.5",children:[l.jsx(f4,{className:"h-3.5 w-3.5 text-primary"})," Box LAN IP-Adresse"]}),l.jsx("input",{value:e,onChange:E=>j(E.target.value),"aria-label":"Box LAN IP-Adresse",spellCheck:!1,placeholder:"z.B. 192.168.178.151",className:"w-full h-9 rounded-lg border border-border/60 bg-background/40 px-3 font-mono text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground"})]}),l.jsxs("div",{className:"space-y-1.5",children:[l.jsxs("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground flex items-center gap-1.5",children:[l.jsx(c4,{className:"h-3.5 w-3.5 text-violet-400"})," Lokaler MCP-Scriptpfad",l.jsx("span",{className:"text-violet-400/70 normal-case font-semibold tracking-normal",children:"(nur Leitung 2)"})]}),l.jsx("input",{value:r,onChange:E=>k(E.target.value),"aria-label":"Lokaler MCP-Scriptpfad",spellCheck:!1,placeholder:"z.B. F:\\Coding Stuff\\mission-control-2\\mcp\\mcp_memory.py",className:"w-full h-9 rounded-lg border border-border/60 bg-background/40 px-3 font-mono text-xs outline-none focus:ring-1 focus:ring-violet-500/50 text-foreground"})]})]}),b&&l.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400",children:["Fehler beim Generieren der Snippets: ",b]}),h&&l.jsxs("div",{className:"grid gap-5 lg:grid-cols-2",children:[l.jsxs("div",{className:"space-y-3 rounded-2xl border border-border/60 border-t-2 border-t-primary/70 bg-card/30 p-4",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center gap-2 text-sm font-space font-bold text-foreground",children:[l.jsx("span",{className:"flex h-5 w-5 items-center justify-center rounded-md bg-primary/15 text-primary text-[11px]",children:"1"}),"Modell anbinden"]}),l.jsx("p",{className:"text-[11px] text-muted-foreground mt-0.5",children:"Wähle dein Tool — das Snippet zeigt auf den Gateway."})]}),l.jsx("div",{className:"flex flex-wrap gap-1.5",children:Object.entries(h.tools).map(([E,A])=>l.jsx("button",{onClick:()=>o(E),className:te("rounded-lg px-3 py-1.5 text-[11px] font-semibold tracking-wide transition-all cursor-pointer",a===E?"bg-primary text-primary-foreground shadow-md shadow-primary/10":"border border-border/50 text-muted-foreground hover:text-foreground"),children:A.label},E))}),S&&l.jsxs(l.Fragment,{children:[S.note&&l.jsxs("div",{className:"flex items-start gap-2.5 p-3 rounded-xl bg-primary/5 border border-primary/20 text-[11px] text-muted-foreground leading-relaxed",children:[l.jsx(hw,{className:"h-4 w-4 text-primary shrink-0 mt-0.5"}),l.jsx("span",{children:S.note})]}),l.jsx(V2,{tool:S,fileName:TX[a]||"config.json",accent:"teal",copied:u==="model",onCopy:()=>N("model",S.snippet)})]})]}),l.jsxs("div",{className:"space-y-3 rounded-2xl border border-border/60 border-t-2 border-t-violet-500/70 bg-card/30 p-4",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center gap-2 text-sm font-space font-bold text-foreground",children:[l.jsx("span",{className:"flex h-5 w-5 items-center justify-center rounded-md bg-violet-500/15 text-violet-300 text-[11px]",children:"2"}),"Gedächtnis anbinden",l.jsx("span",{className:"text-[10px] font-medium text-muted-foreground normal-case",children:"optional"})]}),l.jsxs("p",{className:"text-[11px] text-muted-foreground mt-0.5",children:["Ein MCP-Block — gilt zusätzlich für ",l.jsx("em",{children:"jedes"})," Tool aus Schritt 1."]})]}),l.jsxs("div",{className:"flex items-start gap-2.5 p-3 rounded-xl bg-violet-500/5 border border-violet-500/20 text-[11px] text-muted-foreground leading-relaxed",children:[l.jsx(hw,{className:"h-4 w-4 text-violet-400 shrink-0 mt-0.5"}),l.jsx("span",{children:h.memory.note})]}),l.jsx(V2,{tool:h.memory,fileName:"mcp.json",accent:"violet",copied:u==="memory",onCopy:()=>N("memory",h.memory.snippet)})]})]})]})}const DX="modulepreload",RX=function(e){return"/"+e},q2={},LX=function(t,r,n){let a=Promise.resolve();if(r&&r.length>0){let u=function(h){return Promise.all(h.map(m=>Promise.resolve(m).then(g=>({status:"fulfilled",value:g}),g=>({status:"rejected",reason:g}))))};document.getElementsByTagName("link");const c=document.querySelector("meta[property=csp-nonce]"),f=(c==null?void 0:c.nonce)||(c==null?void 0:c.getAttribute("nonce"));a=u(r.map(h=>{if(h=RX(h),h in q2)return;q2[h]=!0;const m=h.endsWith(".css"),g=m?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${h}"]${g}`))return;const v=document.createElement("link");if(v.rel=m?"stylesheet":DX,m||(v.as="script"),v.crossOrigin="",v.href=h,f&&v.setAttribute("nonce",f),document.head.appendChild(v),m)return new Promise((b,j)=>{v.addEventListener("load",b),v.addEventListener("error",()=>j(new Error(`Unable to preload CSS for ${h}`)))})}))}function o(u){const c=new Event("vite:preloadError",{cancelable:!0});if(c.payload=u,window.dispatchEvent(c),!c.defaultPrevented)throw u}return a.then(u=>{for(const c of u||[])c.status==="rejected"&&o(c.reason);return t().catch(o)})};class $X extends y.Component{constructor(){super(...arguments);Qo(this,"state",{error:null})}static getDerivedStateFromError(r){return{error:r}}render(){return this.state.error?l.jsxs("div",{className:"h-[480px] rounded-2xl border border-red-500/20 bg-red-500/5 p-6 text-xs text-red-400 overflow-auto",children:[l.jsx("div",{className:"font-semibold mb-2",children:"Graph konnte nicht gerendert werden"}),l.jsx("pre",{className:"whitespace-pre-wrap break-words text-[11px] leading-relaxed",children:this.state.error.message})]}):this.props.children}}const zX=y.lazy(()=>LX(()=>import("./GraphView-BqZ4z-El.js"),[]).then(e=>({default:e.GraphView}))),Bd=["identity","knowledge","rules","events"],Q2=new Set(["auto","agent","hermes"]),$g={identity:{label:"Identität",icon:U4,bg:"bg-cyan-500/10",text:"text-cyan-400"},knowledge:{label:"Wissen",icon:Gs,bg:"bg-indigo-500/10",text:"text-indigo-400"},rules:{label:"Regeln",icon:M4,bg:"bg-violet-500/10",text:"text-violet-400"},events:{label:"Ereignisse",icon:n4,bg:"bg-amber-500/10",text:"text-amber-400"}},Y2={label:"Gedächtnis",icon:tv,text:"text-muted-foreground"},FX={identity:"border-l-cyan-500/80",knowledge:"border-l-indigo-500/80",rules:"border-l-violet-500/80",events:"border-l-amber-500/80"},X2=`Hi Hermes! Lass uns ein kurzes Onboarding machen, damit du dich künftig an mich erinnerst. Stell mir nacheinander ein paar kurze Fragen zu: +1) wer ich bin und woran ich gerade arbeite, +2) wie ich angesprochen werden möchte, +3) meine bevorzugten Tools, Sprachen und Arbeitsweise, +4) wichtige Regeln/Konventionen, die du beachten sollst, +5) meine Infrastruktur (Server, Dienste – ohne Geheimnisse). +Frag immer nur eine Sache auf einmal und fass am Ende zusammen, was du dir gemerkt hast.`;function qO(){const[e,t]=y.useState(""),[r,n]=y.useState(""),[a,o]=y.useState(""),[u,c]=y.useState("knowledge"),[f,h]=y.useState(!1),[m,g]=y.useState(!1),[v,b]=y.useState("liste"),[j,k]=y.useState(!1),S=Kn(),{showAlert:N,showConfirm:E,dialogElement:A}=xa(),{data:P=[]}=dv({}),{data:M=[],error:O}=dv({q:r,category:e}),{data:D}=MD(v==="graph"),B=O?String(O):"",F=()=>{S.invalidateQueries({queryKey:["memory"]}),S.invalidateQueries({queryKey:["memory-graph"]})},z=y.useMemo(()=>{const I=P.length,_=P.filter(W=>Q2.has(W.source)).length;return{total:I,auto:_,manual:I-_,cats:new Set(P.map(W=>W.category)).size}},[P]),Y=P.length===0,U=y.useMemo(()=>{const I=D??{nodes:[],edges:[]};if(!r.trim())return I;const _=r.toLowerCase(),W=I.nodes.filter(Z=>Z.content.toLowerCase().includes(_)),ee=new Set(W.map(Z=>Z.id));return{nodes:W,edges:I.edges.filter(Z=>ee.has(Z.source)&&ee.has(Z.target))}},[D,r]),me=y.useMemo(()=>{const I={};return M.forEach(_=>{var W;(I[W=_.category]??(I[W]=[])).push(_)}),I},[M]),ue=y.useMemo(()=>M.filter(I=>!Bd.includes(I.category)),[M]);async function ge(){a.trim()&&(await je("/api/memory",{method:"POST",body:JSON.stringify({content:a,category:u,source:"ui"})}),o(""),k(!1),F())}function ie(I){E("Eintrag löschen?","Diesen Gedächtnis-Eintrag dauerhaft entfernen?",async()=>{try{await je(`/api/memory/${I}`,{method:"DELETE"}),F()}catch(_){N("Fehler",`Löschen fehlgeschlagen: ${_.message||_}`)}})}async function oe(){try{await navigator.clipboard.writeText(X2),g(!0),setTimeout(()=>g(!1),1800)}catch{N("Kopieren fehlgeschlagen","Markiere den Prompt und kopiere ihn manuell (Strg+C).")}}function X(){oe(),window.dispatchEvent(new CustomEvent("mc-navigate",{detail:{view:"terminal"}}))}async function re(){h(!0);try{const I=await je("/api/memory/dedupe",{method:"POST",body:JSON.stringify({apply:!1})});if(I.duplicate_count===0){N("Ergebnis","Keine Dubletten gefunden — alles sauber.");return}E("Deduplizierung bestätigen",`${I.duplicate_count} Dublette(n) in ${I.groups.length} Gruppe(n) gefunden. Entfernen?`,async()=>{try{await je("/api/memory/dedupe",{method:"POST",body:JSON.stringify({apply:!0})}),F()}catch(_){N("Fehler",`Fehler beim Löschen: ${_.message}`)}})}catch(I){N("Fehler",`Fehler bei der Deduplizierung: ${I.message}`)}finally{h(!1)}}const J=({value:I,label:_,accent:W})=>l.jsxs("span",{className:te("flex items-center gap-1.5 text-[11px] rounded-lg px-2.5 py-1 border",W==="auto"?"text-emerald-400 bg-emerald-500/[0.07] border-emerald-500/20":"text-muted-foreground bg-card/40 border-border/50"),children:[W==="auto"&&l.jsx(cs,{className:"h-3 w-3"}),l.jsx("b",{className:te("font-semibold",W==="auto"?"":"text-foreground"),children:I})," ",_]});return l.jsxs("div",{className:"space-y-5",children:[l.jsxs("div",{className:"flex flex-col lg:flex-row lg:items-center justify-between gap-3",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Gedächtnis-Pool"}),l.jsx("p",{className:"text-sm text-muted-foreground",children:"Geteilte Konstitution — Hermes, IDEs & Gateway lesen und lernen hier per MCP."})]}),l.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[l.jsxs("div",{className:"relative",children:[l.jsx("input",{value:r,onChange:I=>n(I.target.value),"aria-label":"Gedächtnis durchsuchen",type:"search",placeholder:"Semantisch suchen…",className:"w-52 h-9 pl-8 pr-3 rounded-lg border border-border/60 bg-card/45 text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground"}),l.jsx(PN,{className:"absolute left-2.5 top-2.5 h-3.5 w-3.5 text-muted-foreground"})]}),l.jsxs("button",{onClick:()=>k(I=>!I),className:"h-9 px-3 rounded-lg bg-primary text-primary-foreground text-xs font-semibold hover:opacity-90 transition-all flex items-center gap-1.5 cursor-pointer shadow-md shadow-primary/10",children:[l.jsx(rf,{className:"h-4 w-4"})," Eintrag"]}),l.jsx("div",{className:"flex items-center gap-1 p-1 bg-card/30 border border-border/40 rounded-lg",children:[["liste",b4,"Liste"],["graph",T4,"Graph"]].map(([I,_,W])=>l.jsxs("button",{onClick:()=>b(I),className:te("flex h-7 px-2.5 items-center gap-1.5 text-[11px] font-semibold rounded-md transition-all cursor-pointer",v===I?"bg-primary text-primary-foreground":"text-muted-foreground hover:text-foreground"),children:[l.jsx(_,{className:"h-3.5 w-3.5"})," ",W]},I))}),l.jsx("button",{onClick:re,disabled:f,className:"flex h-9 w-9 items-center justify-center rounded-lg border border-border/60 bg-card hover:border-primary/50 transition-all cursor-pointer shadow-md disabled:opacity-50","aria-label":"Duplikate bereinigen",title:"Deduplizieren",children:l.jsx(cs,{className:"h-4 w-4 text-primary","aria-hidden":"true"})})]})]}),!Y&&l.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[l.jsx(J,{value:z.total,label:"Fakten"}),l.jsx(J,{value:z.auto,label:"auto gelernt",accent:"auto"}),l.jsx(J,{value:z.manual,label:"manuell"}),l.jsx(J,{value:z.cats,label:"Kategorien"}),l.jsxs("span",{className:"ml-auto text-[11px] text-muted-foreground/70 flex items-center gap-1.5",children:[l.jsx(cs,{className:"h-3 w-3 text-emerald-400"})," lernt automatisch aus Hermes-Gesprächen"]})]}),j&&l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-4 space-y-3",children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx("div",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Neuen Eintrag anlegen"}),l.jsx("button",{onClick:()=>k(!1),"aria-label":"Schließen",className:"text-muted-foreground hover:text-foreground",children:l.jsx(zn,{className:"h-4 w-4","aria-hidden":"true"})})]}),l.jsx("textarea",{value:a,onChange:I=>o(I.target.value),rows:2,"aria-label":"Eintragstext",placeholder:"Eine Regel, Vorliebe oder einen stabilen Fakt über dich oder das Projekt…",className:"w-full resize-none rounded-xl border border-border/60 bg-background/30 p-3 text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground leading-relaxed"}),l.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[l.jsx("select",{value:u,onChange:I=>c(I.target.value),"aria-label":"Kategorie",className:"h-8 rounded-lg border border-border/60 bg-background/50 px-2 text-xs outline-none font-semibold text-foreground cursor-pointer",children:Bd.map(I=>{var _;return l.jsx("option",{value:I,className:"bg-popover text-foreground",children:((_=$g[I])==null?void 0:_.label)||I},I)})}),l.jsxs("button",{onClick:ge,className:"h-9 px-4 rounded-lg bg-primary text-primary-foreground text-xs font-semibold hover:opacity-90 transition-all flex items-center gap-1.5 cursor-pointer",children:[l.jsx(rf,{className:"h-4 w-4"})," Speichern"]})]})]}),B&&l.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400",children:["Fehler: ",B]}),Y?l.jsxs("div",{className:"rounded-2xl border border-dashed border-border/60 bg-card/20 p-8 sm:p-10 flex flex-col items-center text-center gap-5",children:[l.jsx("div",{className:"h-14 w-14 rounded-2xl bg-primary/10 flex items-center justify-center",children:l.jsx(j4,{className:"h-7 w-7 text-primary"})}),l.jsxs("div",{className:"space-y-1.5 max-w-lg",children:[l.jsx("h3",{className:"text-base font-semibold text-foreground",children:"Lass Hermes dich kennenlernen"}),l.jsx("p",{className:"text-xs text-muted-foreground leading-relaxed",children:"Statt Fakten einzutippen: führ ein kurzes Onboarding-Gespräch mit Hermes. Was ihr besprecht, merkt sich das Gedächtnis automatisch — du musst nichts manuell pflegen."})]}),l.jsxs("div",{className:"w-full max-w-lg text-left",children:[l.jsxs("div",{className:"flex items-center justify-between mb-1.5",children:[l.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground/60",children:"Sende das an Hermes"}),l.jsx("button",{onClick:oe,className:"flex items-center gap-1 text-[10px] font-semibold text-muted-foreground hover:text-foreground transition-colors",children:m?l.jsxs(l.Fragment,{children:[l.jsx(or,{className:"h-3 w-3 text-emerald-400"})," Kopiert"]}):l.jsxs(l.Fragment,{children:[l.jsx(nv,{className:"h-3 w-3"})," Kopieren"]})})]}),l.jsx("pre",{className:"w-full rounded-xl border border-border/60 bg-background/40 p-3.5 text-[11px] leading-relaxed text-foreground/90 whitespace-pre-wrap font-mono",children:X2})]}),l.jsxs("div",{className:"flex flex-wrap items-center justify-center gap-2",children:[l.jsxs("button",{onClick:X,className:"h-9 px-4 rounded-lg bg-primary text-primary-foreground text-xs font-semibold hover:opacity-90 transition-all flex items-center gap-1.5 cursor-pointer",children:[l.jsx(MN,{className:"h-4 w-4"})," Im Terminal starten"]}),l.jsxs("button",{onClick:oe,className:"h-9 px-4 rounded-lg border border-border/60 bg-card text-xs font-semibold hover:border-primary/50 transition-all flex items-center gap-1.5 cursor-pointer",children:[m?l.jsx(or,{className:"h-4 w-4 text-emerald-400"}):l.jsx(nv,{className:"h-4 w-4"})," Prompt kopieren"]})]}),l.jsxs("p",{className:"text-[11px] text-muted-foreground/70 flex items-center gap-1.5",children:[l.jsx(I4,{className:"h-3 w-3"})," Funktioniert genauso über Telegram —"," ",l.jsx("button",{onClick:()=>k(!0),className:"underline hover:text-foreground",children:"oder lieber manuell anlegen"}),"."]})]}):v==="graph"?l.jsx($X,{children:l.jsx(y.Suspense,{fallback:l.jsx("div",{className:"h-[480px] rounded-2xl border border-border/60 bg-card/30 flex items-center justify-center text-xs text-muted-foreground",children:"Graph wird geladen…"}),children:l.jsx(zX,{data:U,onDelete:ie})})}):l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"flex flex-wrap items-center gap-1.5 p-1 bg-card/30 border border-border/40 rounded-xl w-fit",children:[l.jsx("button",{onClick:()=>t(""),className:te("h-7 px-3 rounded-lg text-[10px] font-semibold uppercase tracking-wider transition-all cursor-pointer",e?"text-muted-foreground hover:text-foreground":"bg-primary text-primary-foreground"),children:"Alle"}),Bd.map(I=>{const _=$g[I]||Y2,W=_.icon;return l.jsxs("button",{onClick:()=>t(I),className:te("h-7 px-2.5 rounded-lg text-[10px] font-semibold uppercase tracking-wider transition-all cursor-pointer flex items-center gap-1",e===I?"bg-primary text-primary-foreground":"text-muted-foreground hover:text-foreground"),children:[l.jsx(W,{className:"h-3 w-3"})," ",_.label]},I)})]}),M.length===0?l.jsx("div",{className:"text-xs text-muted-foreground border border-dashed border-border/60 rounded-2xl p-12 text-center",children:"Keine Einträge für die aktuellen Filterkriterien gefunden."}):l.jsx("div",{className:"space-y-5",children:[...Bd,"__other"].map(I=>{const _=I==="__other"?ue:me[I]||[];if(!_.length)return null;const W=$g[I]||Y2,ee=W.icon;return l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center gap-2 mb-2 px-1",children:[l.jsx(ee,{className:te("h-3.5 w-3.5",W.text)}),l.jsx("span",{className:te("text-[11px] font-bold uppercase tracking-wider",W.text),children:W.label}),l.jsx("span",{className:"text-[10px] font-mono text-muted-foreground/60 bg-card/50 rounded px-1.5 py-0.5",children:_.length}),l.jsx("div",{className:"ml-1 h-px flex-1 bg-border/30"})]}),l.jsx("div",{className:"space-y-2",children:_.map(Z=>{const he=Q2.has(Z.source);return l.jsxs("div",{className:te("flex items-start justify-between gap-4 p-3.5 rounded-xl border border-l-4 bg-card/45 backdrop-blur-md border-border/60 hover:border-primary/20 transition-all group",FX[Z.category]||"border-l-muted"),children:[l.jsx("span",{className:"text-xs text-foreground leading-relaxed break-words whitespace-pre-wrap flex-1 min-w-0",children:Z.content}),l.jsxs("div",{className:"flex items-center gap-2 shrink-0",children:[typeof Z.score=="number"&&l.jsxs("span",{className:"text-[9px] font-mono text-primary bg-primary/10 px-1.5 py-0.5 rounded",title:"Relevanz der semantischen Suche",children:[Math.round(Z.score*100),"%"]}),l.jsxs("span",{className:te("flex items-center gap-1 text-[9px] font-mono px-1.5 py-0.5 rounded",he?"text-emerald-400 bg-emerald-500/10":"text-muted-foreground/60 bg-background/20"),title:he?"Automatisch gelernt":"Manuell angelegt",children:[he&&l.jsx(cs,{className:"h-2.5 w-2.5"}),Z.source]}),l.jsx("button",{onClick:()=>ie(Z.id),"aria-label":"Eintrag löschen",title:"Eintrag löschen",className:"h-7 w-7 rounded-lg flex items-center justify-center border border-border/40 text-muted-foreground hover:text-red-400 hover:bg-red-500/5 transition-all opacity-0 group-hover:opacity-100",children:l.jsx(iv,{className:"h-3.5 w-3.5","aria-hidden":"true"})})]})]},Z.id)})})]},I)})})]}),A]})}const BX=["chat","coding","fast","heavy"];function QO(){const{data:e,error:t}=Ny(5e3),{data:r}=xi(),{showAlert:n,dialogElement:a}=xa(),o=Kn(),u=t?String(t):"",[c,f]=y.useState(!1),h=(r==null?void 0:r.models)??[];async function m(v){try{await je("/api/agent/brain",{method:"POST",body:JSON.stringify({model:v})}),n("Erledigt",`Hermes-Hirn zeigt jetzt auf das Alias '${v}'. Der Gateway-Dienst wurde neu gestartet.`),o.invalidateQueries({queryKey:Ve.agentStatus}),f(!1)}catch(b){n("Fehler",`Wechsel fehlgeschlagen: ${b.message||b}`)}}async function g(v){try{await je("/api/agent/brain/set",{method:"POST",body:JSON.stringify({model_id:v})}),n("Erledigt","Agent-Hirn gewechselt (warm gehalten). Gateway wurde neugestartet."),o.invalidateQueries({queryKey:Ve.agentStatus}),o.invalidateQueries({queryKey:Ve.models}),f(!1)}catch(b){n("Fehler",`Wechsel fehlgeschlagen: ${b.message||b}`)}}return l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{className:"flex flex-col sm:flex-row justify-between sm:items-center gap-4",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Hermes Agenten-Cockpit"}),l.jsxs("p",{className:"text-sm text-muted-foreground",children:["Hermes ist ein autonomer Agent, der im Hintergrund der Box läuft (Port ",l.jsx("code",{children:":8642"}),") und seine eigene UI besitzt."]})]}),(e==null?void 0:e.terminal_url)&&l.jsxs("a",{href:Rs(e.terminal_url),target:"_blank",rel:"noopener",className:te("flex h-9 px-4 items-center gap-1.5 text-xs font-semibold rounded-lg transition-all cursor-pointer shadow-md shrink-0 self-start",e.terminal_reachable?"bg-primary text-primary-foreground hover:opacity-90 shadow-primary/10":"border border-border/60 text-muted-foreground bg-background/20"),children:[l.jsx(Is,{className:"h-4 w-4"}),l.jsx("span",{children:"Terminal öffnen"})]})]}),u&&l.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400 font-mono",children:["Status nicht lesbar (",u,")."]}),e&&l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10",children:[l.jsxs("div",{className:"mb-4 flex items-center gap-2",children:[l.jsx(gn,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("span",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"Agent-Fluss"})]}),l.jsxs("div",{className:"flex flex-col lg:flex-row lg:items-stretch gap-3",children:[l.jsxs("button",{onClick:()=>e.terminal_reachable&&window.open(Rs(e.terminal_url),"_blank"),title:e.terminal_reachable?"Hermes-Terminal öffnen":"Terminal offline",className:"lg:w-40 shrink-0 rounded-xl border border-border/60 bg-background/30 p-3 text-left hover:border-primary/40 transition-all cursor-pointer flex flex-col justify-center",children:[l.jsxs("div",{className:"flex items-center gap-1.5",children:[l.jsx(eh,{className:te("h-3.5 w-3.5",e.terminal_reachable?"text-emerald-400":"text-amber-500")}),l.jsx("span",{className:"text-xs font-semibold text-foreground",children:"Terminal"}),l.jsx("span",{className:te("ml-auto h-1.5 w-1.5 rounded-full animate-pulse",e.terminal_reachable?"bg-emerald-500":"bg-amber-500")})]}),l.jsx("span",{className:"text-[10px] text-muted-foreground font-mono mt-0.5",children:"hermes chat · Clients"})]}),l.jsx("div",{className:"hidden lg:flex items-center text-muted-foreground text-lg select-none",children:"→"}),l.jsxs("div",{className:"flex-1 flex flex-col gap-2.5",children:[l.jsxs("div",{className:"rounded-xl border border-primary/40 bg-primary/5 px-3.5 py-2.5 flex items-center gap-2",children:[l.jsx(gn,{className:"h-3.5 w-3.5 text-primary"}),l.jsx("span",{className:"text-xs font-semibold text-primary",children:"Agent Gateway"}),l.jsx("span",{className:"text-[11px] font-mono text-muted-foreground",children:":8642"}),l.jsxs("span",{className:te("ml-auto inline-flex items-center gap-1.5 text-[10px] font-bold uppercase font-mono px-2 py-0.5 rounded-full border",e.gateway_reachable?"bg-emerald-500/10 text-emerald-400 border-emerald-500/20":"bg-red-500/10 text-red-400 border-red-500/20"),children:[l.jsx("span",{className:te("h-1.5 w-1.5 rounded-full",e.gateway_reachable?"bg-emerald-500 animate-pulse":"bg-red-500")}),e.gateway_reachable?"online":"offline"]})]}),l.jsxs("div",{className:"grid gap-2.5 sm:grid-cols-3",children:[l.jsxs("button",{onClick:()=>f(!0),className:"rounded-xl border border-border/60 bg-background/30 p-3 text-left hover:border-primary/45 transition-all cursor-pointer",children:[l.jsxs("div",{className:"flex items-center gap-1.5 text-muted-foreground",children:[l.jsx($n,{className:"h-3.5 w-3.5 text-primary"}),l.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider",children:"Hirn"}),l.jsx("span",{className:"ml-auto text-[9px] text-primary/70 font-bold uppercase",children:"wechseln →"})]}),l.jsx("div",{className:"text-[11px] font-mono font-medium text-foreground truncate mt-1",title:e.brain_model,children:e.brain_model||"chat"})]}),l.jsxs("div",{className:"rounded-xl border border-border/60 bg-background/30 p-3",children:[l.jsxs("div",{className:"flex items-center gap-1.5 text-muted-foreground",children:[l.jsx(Uu,{className:"h-3.5 w-3.5 text-primary"}),l.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider",children:"Verdrahtung"})]}),l.jsxs("div",{className:"text-[10px] font-mono mt-1 flex flex-wrap gap-x-2 text-muted-foreground",children:[l.jsxs("span",{children:["Config: ",e.has_config?"✓":"—"]}),l.jsxs("span",{children:["Skills: ",e.has_skills?"✓":"—"]}),l.jsxs("span",{children:["Memory: ",e.has_memories?"✓":"—"]})]})]}),l.jsxs("div",{className:"rounded-xl border border-border/60 bg-background/30 p-3",children:[l.jsxs("div",{className:"flex items-center gap-1.5 text-muted-foreground",children:[l.jsx(mw,{className:"h-3.5 w-3.5 text-primary"}),l.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider",children:"PC"}),l.jsx("span",{className:te("ml-auto h-1.5 w-1.5 rounded-full",e.pc_executor_reachable?"bg-emerald-500 animate-pulse":"bg-amber-500")})]}),l.jsxs("div",{className:te("text-[11px] font-mono mt-1",e.pc_executor_reachable?"text-emerald-400":"text-muted-foreground"),children:[":7777 ",e.pc_executor_reachable?"verbunden":"offline"]})]})]})]})]})]}),l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 space-y-4 shadow-lg shadow-black/10",children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(mw,{className:"h-5 w-5 text-primary"}),l.jsx("h3",{className:"text-sm font-bold uppercase tracking-wider text-foreground",children:"PC Verbindung"})]}),l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx("span",{className:te("h-2 w-2 rounded-full",e.pc_executor_reachable?"bg-emerald-500 animate-pulse":"bg-amber-500")}),l.jsx("span",{className:"text-xs font-semibold text-foreground",children:e.pc_executor_reachable?"Erreichbar":"Nicht verbunden"})]})]}),l.jsxs("div",{className:"grid gap-6 md:grid-cols-2 text-xs text-muted-foreground leading-relaxed text-left",children:[l.jsxs("div",{className:"space-y-3",children:[l.jsxs("p",{children:["Der ",l.jsx("strong",{className:"text-foreground",children:"Hermes PC Executor"})," läuft auf ",l.jsx("code",{className:"text-foreground font-mono px-1 py-0.5 rounded bg-muted/40 border border-border/30",children:"192.168.178.98:7777"})," und ermöglicht Hermes den direkten Zugriff auf deinen Windows-PC — Shell-Befehle, Screenshots, Tastatureingaben."]}),l.jsxs("p",{children:["Hermes erreicht den PC über den MCP-Server ",l.jsx("code",{className:"text-foreground font-mono px-1 py-0.5 rounded bg-muted/40 border border-border/30",children:"hermes-pc-control"}),", der automatisch beim Gateway-Start verbunden wird."]})]}),l.jsx("div",{className:"space-y-3",children:e.pc_executor_reachable?l.jsxs("div",{className:"p-3.5 bg-emerald-500/5 border border-emerald-500/20 rounded-xl space-y-1",children:[l.jsxs("div",{className:"text-emerald-400 font-semibold text-xs flex items-center gap-1.5",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"}),"PC Executor verbunden"]}),l.jsxs("p",{className:"text-[10px]",children:["Hermes kann jetzt per Telegram oder Terminal Befehle auf TobisNicerPC ausführen. Nutze ",l.jsx("code",{className:"text-foreground",children:"pc_shell"}),", ",l.jsx("code",{className:"text-foreground",children:"pc_screenshot"})," oder ",l.jsx("code",{className:"text-foreground",children:"pc_open"}),"."]})]}):l.jsxs("div",{className:"space-y-2",children:[l.jsx("h4",{className:"text-xs font-bold text-foreground",children:"PC Executor starten"}),l.jsxs("p",{children:["Starte ",l.jsx("code",{className:"text-foreground font-mono",children:"start.bat"})," im Ordner ",l.jsx("code",{className:"text-foreground font-mono",children:"client\\hermes-pc\\"})," auf dem Windows-PC und lasse das Fenster offen."]}),l.jsx("div",{className:"p-3 bg-background/25 rounded-xl border border-border/30 font-mono text-[9px] text-cyan-300",children:"client\\hermes-pc\\start.bat"})]})})]})]}),!e.gateway_reachable&&l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 space-y-4 shadow-lg shadow-black/10 text-left",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(Gs,{className:"h-5 w-5 text-amber-500"}),l.jsx("h3",{className:"text-sm font-bold uppercase tracking-wider text-foreground",children:"Hermes-Agent Diagnostics"})]}),l.jsxs("div",{className:"text-xs text-muted-foreground space-y-3 leading-relaxed",children:[l.jsx("p",{children:"Der Hermes-Dienst ist auf der Box derzeit offline oder kann sich nicht mit dem lokalen llama-swap verbinden."}),l.jsxs("p",{children:["Stelle sicher, dass die systemd-Dienste auf der Box laufen. Du kannst den Status im ",l.jsx("strong",{children:"OS & Updates Drawer"})," prüfen und die Dienste bei Bedarf neu starten."]}),l.jsxs("div",{className:"p-3.5 bg-background/25 rounded-xl border border-border/30 font-mono text-[10px] space-y-1",children:[l.jsx("div",{className:"text-muted-foreground/60",children:"# Dienste manuell auf der Box prüfen:"}),l.jsx("div",{className:"text-primary",children:"systemctl --user status hermes-gateway"}),l.jsx("div",{className:"text-primary",children:"systemctl --user status hermes-terminal"})]}),l.jsxs("p",{children:["Weitere Einrichtungsdetails (Brain-Konfiguration, MCP-Kopplungen, SSH-Tunneling und Such-Engines) findest du in der Dokumentationsdatei:",l.jsx("code",{className:"ml-1 px-1.5 py-0.5 rounded bg-muted/40 text-foreground border border-border/30",children:"docs/HERMES_SETUP.md"}),"."]})]})]})]}),e&&c&&l.jsx("div",{className:"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm flex items-center justify-center p-4 overscroll-contain",role:"dialog","aria-modal":"true","aria-label":"Hermes-Hirn konfigurieren",children:l.jsxs("div",{className:"w-full max-w-md rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[l.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[l.jsxs("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary flex items-center gap-1.5",children:[l.jsx($n,{className:"h-4 w-4"}),l.jsx("span",{children:"Hermes-Hirn konfigurieren"})]}),l.jsx("button",{onClick:()=>f(!1),className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:l.jsx(zn,{className:"h-4 w-4"})})]}),l.jsxs("div",{className:"space-y-1.5",children:[l.jsx("div",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground",children:"Lane / Gateway-Alias"}),l.jsx("div",{className:"flex flex-wrap gap-1.5",children:BX.map(v=>{const b=e.brain_model===v;return l.jsxs("button",{onClick:()=>m(v),className:te("px-3 py-1.5 rounded-lg text-xs font-mono font-semibold border transition-all cursor-pointer flex items-center gap-1.5",b?"border-primary/40 bg-primary/10 text-primary":"border-border/30 bg-background/20 text-foreground hover:bg-accent"),children:[v,b&&l.jsx(or,{className:"h-3.5 w-3.5"})]},v)})}),l.jsxs("p",{className:"text-[10px] text-muted-foreground/70",children:["Schlank & flexibel: das Hirn folgt dem Lane-Routing (z.B. ",l.jsx("code",{className:"text-primary",children:"chat"})," = fast↔heavy)."]})]}),l.jsxs("div",{className:"space-y-1.5",children:[l.jsx("div",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground",children:"Installiertes Modell (warm gehalten)"}),l.jsx("div",{className:"space-y-1.5 max-h-56 overflow-y-auto pr-1",children:h.map(v=>{var j;const b=v.role==="hermes";return l.jsxs("button",{onClick:()=>!b&&g(v.name),disabled:b||v.incomplete,className:te("w-full text-left px-3 py-2.5 rounded-lg text-xs flex items-center justify-between font-mono border transition-all",b?"border-indigo-500/40 bg-indigo-500/10 text-indigo-300":v.incomplete?"border-border/20 bg-background/10 text-muted-foreground/50 cursor-not-allowed":"border-border/30 bg-background/20 text-foreground hover:bg-accent cursor-pointer"),children:[l.jsxs("div",{className:"flex flex-col min-w-0",children:[l.jsx("span",{className:"font-semibold truncate max-w-[280px]",children:(j=v.name.split("/").pop())==null?void 0:j.replace(/\.gguf$/i,"")}),l.jsxs("span",{className:"text-[9px] text-muted-foreground mt-0.5",children:[v.capabilities.params_b?`${v.capabilities.params_b}B`:"?"," · ",v.capabilities.tools!=="no"?"Tools ✓":"ohne Tools",v.role&&` · Rolle: ${v.role}`]})]}),b?l.jsxs("span",{className:"text-[9px] font-bold uppercase text-indigo-300 shrink-0 flex items-center gap-1",children:[l.jsx(or,{className:"h-3.5 w-3.5"})," Aktiv"]}):l.jsx("span",{className:"text-[9px] font-bold uppercase text-primary/70 shrink-0",children:"Warm setzen →"})]},v.name)})})]}),l.jsxs("div",{className:"text-[10px] text-amber-400/80 flex items-start gap-1.5 border-t border-border/20 pt-2.5",children:[l.jsx("span",{children:"💡"}),l.jsxs("span",{children:["Für einen ",l.jsx("strong",{children:"Agenten"}),' sind Hermes-Modelle (natives Tool-Calling) meist die robustere Wahl. Neues Modell? Erst über „Modell-Manager → Modelle finden" laden.']})]})]})}),a]})}function UX(){const{data:e}=Ny(5e3),t=e!=null&&e.terminal_url?Rs(e.terminal_url):void 0,r=e==null?void 0:e.terminal_reachable;return l.jsxs("div",{className:"flex h-full flex-col gap-4",children:[l.jsxs("div",{className:"flex flex-wrap items-end justify-between gap-3",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text font-space text-2xl font-bold tracking-tight text-transparent",children:"Hermes Terminal"}),l.jsxs("p",{className:"flex items-center gap-2 text-sm text-muted-foreground",children:["Interaktiver Agent (",l.jsx("code",{className:"rounded bg-background/40 px-1 font-mono text-[11px] text-primary",children:"hermes chat"}),') mit Tools & PC-Steuerung — „mehr als Chatten".']})]}),l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsxs("span",{className:"flex items-center gap-1.5 text-[11px] font-medium text-muted-foreground",children:[l.jsx("span",{className:`h-2 w-2 rounded-full ${r?"bg-emerald-500 animate-pulse":"bg-amber-500"}`}),r?"online":"offline"]}),t&&l.jsxs("a",{href:t,target:"_blank",rel:"noopener",className:"flex h-8 items-center gap-1.5 rounded-lg border border-border/60 bg-background/20 px-3 text-xs font-semibold text-muted-foreground transition-all hover:border-primary/50 hover:text-foreground",children:[l.jsx(Is,{className:"h-3.5 w-3.5"})," In neuem Tab"]})]})]}),t?l.jsxs("div",{className:"relative min-h-[68vh] flex-1 overflow-hidden rounded-2xl border border-border/60 bg-black/50 shadow-lg shadow-black/25",children:[r===!1&&l.jsxs("div",{className:"absolute inset-0 z-10 flex flex-col items-center justify-center gap-3 bg-black/70 text-center",children:[l.jsx(mi,{className:"h-8 w-8 text-amber-400"}),l.jsx("div",{className:"text-sm font-semibold text-amber-300",children:"Terminal nicht erreichbar"}),l.jsxs("p",{className:"max-w-sm text-[11px] leading-normal text-muted-foreground",children:["Der ",l.jsx("code",{className:"font-mono text-primary",children:"hermes-terminal"}),"-Dienst (ttyd) läuft nicht. Auf der Box: ",l.jsx("code",{className:"font-mono",children:"systemctl --user restart hermes-terminal"}),"."]})]}),l.jsx("iframe",{src:t,title:"Hermes Terminal",className:"h-full w-full border-0",style:{minHeight:"68vh"}})]}):l.jsxs("div",{className:"flex min-h-[68vh] flex-1 items-center justify-center rounded-2xl border border-border/60 bg-background/20 text-xs text-muted-foreground",children:[l.jsx(_N,{className:"mr-2 h-4 w-4"})," Lade Terminal…"]})]})}const Z2=[{id:"grundlagen",label:"Grundlagen"},{id:"moe",label:"MoE & Quant"},{id:"lokal",label:"Lokal betreiben"},{id:"modelle",label:"Modell-Landschaft"},{id:"gateway",label:"Gateway-Trick"},{id:"mcp",label:"MCP"},{id:"skills",label:"Skills"},{id:"memory",label:"Gedächtnis & RAG"},{id:"agents",label:"Agenten"},{id:"ide",label:"IDE anbinden"},{id:"tricks",label:"Tricks & Kniffe"},{id:"wartung",label:"Sicherheit & Wartung"},{id:"ressourcen",label:"Ressourcen"},{id:"troubleshooting",label:"Troubleshooting"}];function HX(e){var t;(t=document.getElementById(e))==null||t.scrollIntoView({behavior:"smooth",block:"start"})}function _r({id:e,icon:t,color:r,title:n,kicker:a,children:o,wide:u}){return l.jsxs("section",{id:e,className:te("scroll-mt-20 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 shadow-lg shadow-black/10 space-y-3",u&&"md:col-span-2"),children:[l.jsxs("div",{className:"flex items-center gap-2.5 border-b border-border/20 pb-3",children:[l.jsx(t,{className:te("h-5 w-5 shrink-0",r)}),l.jsxs("div",{children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:n}),a&&l.jsx("span",{className:te("text-[9px] font-mono",r),children:a})]})]}),l.jsx("div",{className:"text-xs text-muted-foreground space-y-2.5 leading-relaxed",children:o})]})}function $a({children:e}){return l.jsxs("div",{className:"mt-1 rounded-xl border border-primary/25 bg-primary/[0.06] p-3 text-[11px] leading-relaxed",children:[l.jsxs("div",{className:"flex items-center gap-1.5 font-bold text-primary mb-1",children:[l.jsx(cs,{className:"h-3 w-3"})," Bei dir konkret"]}),l.jsx("div",{className:"text-muted-foreground space-y-1",children:e})]})}function ze({children:e}){return l.jsx("code",{className:"rounded bg-background/40 border border-border/30 px-1.5 py-0.5 font-mono text-[10px] text-foreground",children:e})}function wt({href:e,name:t,note:r}){return l.jsxs("li",{className:"leading-relaxed",children:[l.jsxs("a",{href:e,target:"_blank",rel:"noopener",className:"text-primary hover:underline font-semibold inline-flex items-center gap-0.5",children:[t,l.jsx(G3,{className:"h-3 w-3 opacity-60"})]}),l.jsxs("span",{className:"text-muted-foreground",children:[" — ",r]})]})}function WX(){const[e,t]=y.useState(!1);return l.jsxs("div",{className:"space-y-7",children:[l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 shadow-lg shadow-black/10 flex items-start gap-4",children:[l.jsx("div",{className:"h-11 w-11 rounded-xl bg-primary/15 flex items-center justify-center shrink-0",children:l.jsx(tv,{className:"h-6 w-6 text-primary"})}),l.jsxs("div",{className:"space-y-1",children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Die AI-Bibel"}),l.jsxs("p",{className:"text-sm text-muted-foreground leading-relaxed max-w-2xl",children:["Allgemeines Nachschlagewerk für lokale & agentische AI — Konzepte, Tricks, Kniffe und kuratierte Quellen. ",l.jsx("span",{className:"font-semibold text-foreground",children:"Stand Juni 2026."})," ","Das meiste gilt überall; ",l.jsx("span",{className:"text-primary font-semibold",children:'„Bei dir konkret"'}),"-Kästen zeigen, was dein Stack daraus macht."]})]})]}),l.jsx("div",{className:"sticky top-0 z-10 -mx-1 px-1",children:l.jsx("div",{className:"rounded-xl border border-border/50 bg-card/70 backdrop-blur-xl p-2 shadow-lg shadow-black/20",children:l.jsxs("div",{className:"flex items-center gap-1.5 flex-wrap",children:[l.jsx(rv,{className:"h-3.5 w-3.5 text-primary ml-1 mr-0.5 shrink-0"}),(e?Z2:Z2.slice(0,9)).map(r=>l.jsx("button",{onClick:()=>HX(r.id),className:"rounded-lg px-2.5 py-1 text-[11px] font-semibold text-muted-foreground hover:text-primary hover:bg-primary/10 transition-colors cursor-pointer",children:r.label},r.id)),l.jsx("button",{onClick:()=>t(r=>!r),className:"rounded-lg px-2 py-1 text-[11px] font-semibold text-primary hover:bg-primary/10 transition-colors cursor-pointer",children:e?"weniger":"+ mehr"})]})})}),l.jsxs("div",{className:"grid gap-5 md:grid-cols-2",children:[l.jsxs(_r,{id:"grundlagen",icon:$n,color:"text-cyan-400",title:"1. Wie LLMs ticken",kicker:"Grundlagen",children:[l.jsxs("p",{children:["Ein LLM ist im Kern ein ",l.jsx("strong",{children:"Wahrscheinlichkeits-Rechner für das nächste Token"}),' (Wortteil). Es „weiß" nichts — es setzt fort, was statistisch am plausibelsten ist. Daraus folgt fast alles andere.']}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Tokens"})," sind die Einheit — ~¾ Wort. Ein- und Ausgabe werden in Tokens gezählt."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Kontextfenster"}),' = wie viele Tokens das Modell gleichzeitig „sehen" kann (Prompt + Antwort). Voll = Anfang fällt raus.']}),l.jsxs("li",{children:[l.jsx("strong",{children:"Parameter"})," = die trainierten Gewichte. Training ist einmalig, ",l.jsx("strong",{children:"Inferenz"})," ist jede Antwort."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Temperatur / Sampling"})," steuert Zufall: niedrig = deterministisch/präzise (Code), hoch = kreativ."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Halluzination"})," ist kein Bug, sondern die Kehrseite des Ratens. Gegenmittel: Grounding via Tools/RAG, Verifikation."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Reasoning-/Thinking-Modelle"}),' „denken" in unsichtbaren Tokens vor der Antwort — besser bei Logik, langsamer/teurer.']})]})]}),l.jsxs(_r,{id:"moe",icon:vy,color:"text-violet-400",title:"2. MoE & Quantisierung",kicker:"Mehr Modell, weniger Last",children:[l.jsxs("p",{children:[l.jsx("strong",{children:"Mixture of Experts (MoE):"})," Statt für jedes Token das ganze Netz zu aktivieren, wählt ein",l.jsx("em",{children:" Router"})," nur ein paar spezialisierte ",l.jsx("em",{children:"Experts"}),' aus. So läuft ein 100B-Modell mit der aktiven Rechenlast eines viel kleineren (z.B. „122B total / 10B aktiv").']}),l.jsxs("p",{children:[l.jsx("strong",{children:"Quantisierung:"})," Gewichte von FP16 auf weniger Bits eindampfen — kleiner & schneller bei minimalem Qualitätsverlust. Faustregel:"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx(ze,{children:"Q8"})," nahezu verlustfrei, größter Footprint"]}),l.jsxs("li",{children:[l.jsx(ze,{children:"Q6_K"})," sehr gut, guter Mittelweg"]}),l.jsxs("li",{children:[l.jsx(ze,{children:"Q4_K_M"})," der Sweet-Spot für lokal — viel Modell pro GB"]})]}),l.jsxs($a,{children:["VRAM/RAM ist die harte Grenze — ",l.jsx("strong",{children:"darum"})," ist beides hier zentral: MoE lässt 100B+ überhaupt laufen, Quant entscheidet, was reinpasst. Dein Line-up fährt durchweg ",l.jsx(ze,{children:"Q4_K_M"}),"/",l.jsx(ze,{children:"Q6_K"}),"."]})]}),l.jsxs(_r,{id:"lokal",icon:nh,color:"text-emerald-400",title:"3. Lokal betreiben: Engines & Backends",kicker:"llama.cpp, vLLM & Co.",wide:!0,children:[l.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:[l.jsx("strong",{children:"Inference-Engines"})," — was die Modelle ausführt:"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"llama.cpp / GGUF"})," — der De-facto-Standard für lokal, CPU+GPU, läuft überall."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Ollama / LM Studio"})," — bequeme Wrapper mit One-Click-Downloads (LM Studio mit GUI)."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"vLLM / TGI"})," — Server-Engines für maximalen Durchsatz auf dicken GPUs."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"llama-swap"})," — Proxy, der ",l.jsx("em",{children:"mehrere"})," Modelle hinter ",l.jsx("em",{children:"einem"})," Port hält und je nach Anfrage automatisch ein-/aussattelt."]})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:[l.jsx("strong",{children:"GPU-Backends"})," — wie gerechnet wird:"]}),l.jsx("ul",{className:"list-disc pl-4 space-y-1",children:l.jsxs("li",{children:[l.jsx(ze,{children:"CUDA"})," NVIDIA · ",l.jsx(ze,{children:"ROCm"})," AMD · ",l.jsx(ze,{children:"Vulkan"})," herstellerübergreifend · ",l.jsx(ze,{children:"Metal"})," Apple"]})}),l.jsxs("p",{className:"pt-1",children:[l.jsx("strong",{children:"Begriffe, die immer wiederkommen:"})," Kontext (",l.jsx(ze,{children:"-c"}),"), Slots/Parallel, KV-Cache, Modell-TTL/Swap, ",l.jsx("strong",{children:"Speculative Decoding"})," (kleines Draft-Modell rät voraus → schneller)."]})]})]}),l.jsxs($a,{children:["Deine Box hat eine AMD-APU (gfx1151). ",l.jsx("strong",{children:"Einschränkung & Trick:"})," dort schlägt ",l.jsx(ze,{children:"Vulkan/RADV"})," das offizielle ",l.jsx(ze,{children:"ROCm"})," bei Token-Generierung um ~12–22 % — darum läuft die Engine auf Vulkan.",l.jsx(ze,{children:"llama-swap"})," hält die Alltags-Hirne dauerwarm; ",l.jsx(ze,{children:"coder"})," nutzt Spec-Decoding."]})]}),l.jsxs(_r,{id:"modelle",icon:Jd,color:"text-sky-400",title:"4. Modell-Landschaft",kicker:"Stand Juni 2026",wide:!0,children:[l.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsx("p",{children:l.jsx("strong",{children:"Open-Weight (lokal nutzbar):"})}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Qwen"})," (Alibaba) — starke Allrounder + Coder + Vision, viele Größen/MoE."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Llama"})," (Meta), ",l.jsx("strong",{children:"Gemma"})," (Google), ",l.jsx("strong",{children:"Phi"})," (Microsoft) — solide Open-Familien."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"DeepSeek"}),", ",l.jsx("strong",{children:"Mistral/Mixtral"})," — kräftige MoE-/Reasoning-Modelle."]})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsx("p",{children:l.jsx("strong",{children:"Frontier (Cloud-API):"})}),l.jsx("ul",{className:"list-disc pl-4 space-y-1",children:l.jsxs("li",{children:[l.jsx("strong",{children:"Claude"})," (Anthropic), ",l.jsx("strong",{children:"GPT"})," (OpenAI), ",l.jsx("strong",{children:"Gemini"})," (Google) — die stärksten Allrounder, aber nicht lokal."]})}),l.jsxs("p",{className:"pt-1",children:[l.jsx("strong",{children:"Modellwahl nach Aufgabe:"})," schnelles Alltags-Hirn · großes Logik-Hirn für harte Tasks · dediziertes Code-Modell · multimodal für Bilder · Embedding-Modell fürs Gedächtnis."]})]})]}),l.jsx("p",{className:"text-[11px] italic",children:'Leaderboards (HF, LMArena) sind grobe Orientierung — der einzige Benchmark, der zählt, ist deine eigene Aufgabe. Vorsicht vor „Benchmaxxing".'}),l.jsxs($a,{children:["Dein Line-up via llama-swap: ",l.jsx(ze,{children:"fast"})," (Alltag/Vision/MoE) · ",l.jsx(ze,{children:"heavy"})," (schwere Logik) ·",l.jsx(ze,{children:"coder"})," · ",l.jsx(ze,{children:"scout"})," · ",l.jsx(ze,{children:"vision"})," · ",l.jsx(ze,{children:"embed"})," (fürs Gedächtnis) ·",l.jsx(ze,{children:"hermes"})," (Agent-Hirn). Verwalten/tauschen im ",l.jsx("strong",{children:"Modell-Manager"}),"-Tab."]})]}),l.jsxs(_r,{id:"gateway",icon:E4,color:"text-amber-400",title:"5. Der Gateway-Trick",kicker:"OpenAI-kompatibel = überall andocken",children:[l.jsxs("p",{children:["Fast jedes AI-Tool spricht heute das ",l.jsx("strong",{children:"OpenAI-Format"})," (",l.jsx(ze,{children:"/v1/chat/completions"}),"). Ein",l.jsx("strong",{children:" Gateway"})," davor gibt dir ",l.jsx("em",{children:"einen"})," Endpunkt für alles: zentrales Key-Management, Logging und transparentes ",l.jsx("strong",{children:"Routing"})," — der Client merkt nicht, welches Modell tatsächlich antwortet."]}),l.jsxs("p",{children:["Die ",l.jsx(ze,{children:"model:auto"}),'-Idee: du sagst „auto", das Gateway wählt das passende Modell je nach Anfrage und lädt es bei Bedarf.']}),l.jsxs($a,{children:["Dein Gateway: ",l.jsx(ze,{children:"http://192.168.178.151:9001/v1"}),", Model ",l.jsx(ze,{children:"auto"}),", API-Key beliebig. Fertige Configs erzeugt dir der ",l.jsx("strong",{children:"Verbinden"}),"-Tab live — eine Wahrheit, kein Abtippen."]})]}),l.jsxs(_r,{id:"mcp",icon:tf,color:"text-violet-400",title:"6. MCP — Werkzeuge für Agenten",kicker:"USB-C für AI-Tools",children:[l.jsxs("p",{children:["Das ",l.jsx("strong",{children:"Model Context Protocol"})," (offen, von Anthropic initiiert) standardisiert, wie ein AI-Client mit externen Tools & Datenquellen spricht. Ein ",l.jsx("strong",{children:"MCP-Server"})," bringt Fähigkeiten: Dateien, Web-Fetch, Git, Datenbanken, eigene APIs."]}),l.jsx("p",{children:"Statt für jeden Editor eigene Tools zu schreiben, bindet jeder MCP-fähige Agent denselben Server an."}),l.jsxs("div",{className:"flex items-start gap-1.5 rounded-xl border border-amber-500/25 bg-amber-500/[0.06] p-2.5 text-[11px]",children:[l.jsx(w4,{className:"h-3.5 w-3.5 text-amber-400 shrink-0 mt-0.5"}),l.jsxs("span",{children:[l.jsx("strong",{children:"Sicherheit:"})," ein MCP-Server hat echten Zugriff (Dateien, Shell). Nur vertrauenswürdige Server laufen lassen, Rechte minimal halten, Quelle prüfen."]})]})]}),l.jsxs(_r,{id:"skills",icon:O4,color:"text-emerald-400",title:"7. Agent Skills",kicker:"Wiederverwendbare Fähigkeiten",children:[l.jsxs("p",{children:["Ein ",l.jsx("strong",{children:"Skill"})," ist ein Ordner mit einer ",l.jsx(ze,{children:"SKILL.md"})," (YAML-Kopf + Anleitung, optional Skripte/Beispiele), den der Agent für eine bestimmte Aufgabe lädt — z.B. TDD, Code-Vereinfachung, API-Design."]}),l.jsx("pre",{className:"p-2.5 bg-background/25 rounded-lg border border-border/30 font-mono text-[9px] text-foreground overflow-x-auto whitespace-pre",children:`--- +name: tdd-pro +description: Treibt Entwicklung mit strikter TDD-Praxis +--- +# Instructions +...`}),l.jsxs("p",{children:["Suchen & installieren über die ",l.jsx("strong",{children:"skills.sh"}),"-Registry: ",l.jsx(ze,{children:"npx skills find"})," /",l.jsx(ze,{children:"npx skills add owner/repo"}),". Skills liegen projektweit (vom Agent beim Start gelesen) oder global."]})]}),l.jsxs(_r,{id:"memory",icon:s4,color:"text-indigo-400",title:"8. Gedächtnis & RAG",kicker:"Modelle vergessen — du nicht",wide:!0,children:[l.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:["LLMs sind ",l.jsx("strong",{children:"zustandslos"}),": ohne Hilfe weiß das Modell beim nächsten Turn nichts mehr. Gedächtnis lebt extern."]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Embeddings"})," wandeln Text in Vektoren; ein ",l.jsx("strong",{children:"Vektor-Store"})," (Chroma, …) findet semantisch Ähnliches."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"RAG"})," = relevante Fakten vor dem Turn heraussuchen und einblenden statt alles im Prompt zu halten."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Long-Context vs. RAG:"}),' riesige Fenster sind bequem, aber teuer & „lost in the middle" — gezieltes Abrufen skaliert besser.']})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:[l.jsx("strong",{children:"Auto-lernendes Gedächtnis"})," ist die nächste Stufe:"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:["extrahiert Fakten ",l.jsx("em",{children:"selbst"})," aus Gesprächen, statt nur abzuspeichern"]}),l.jsx("li",{children:"dedupliziert semantisch (kein 10× derselbe Fakt)"}),l.jsxs("li",{children:[l.jsx("strong",{children:"Graph-Sicht"})," = Fakten ",l.jsx("em",{children:"plus"})," ihre Beziehungen, nicht nur eine flache Liste"]})]})]})]}),l.jsxs($a,{children:["Dein Gedächtnis (Tab ",l.jsx("strong",{children:"Gedächtnis"}),") ist ",l.jsx("strong",{children:"Mem0"}),"-basiert: auto-lernend & semantisch, ",l.jsx("strong",{children:"graph-first"})," dargestellt, mit 4-Typen-Taxonomie (",l.jsx(ze,{children:"Identität"})," · ",l.jsx(ze,{children:"Wissen"})," · ",l.jsx(ze,{children:"Regeln"})," · ",l.jsx(ze,{children:"Ereignisse"}),"). Einstieg über ein kurzes ",l.jsx("strong",{children:"Hermes-Onboarding-Gespräch"})," im Terminal — der Agent lernt im Hintergrund nach jedem Turn.",l.jsx("br",{}),l.jsx("strong",{children:"Gotcha:"})," ein gelöschter Fakt kann wieder auftauchen, solange die Original-Nachricht noch im Verlauf steht (additive Extraktion)."]})]}),l.jsxs(_r,{id:"agents",icon:gn,color:"text-rose-400",title:"9. Autonome Agenten betreiben",kicker:"LLM in der Schleife",wide:!0,children:[l.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:["Ein ",l.jsx("strong",{children:"Agent"})," ist ein LLM in einer Schleife mit Tools:",l.jsx("em",{children:" denken → Tool aufrufen → Ergebnis beobachten → weiter"}),", bis das Ziel erreicht ist."]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Guardrails"})," (Hard-Stop, Tool-Limits) verhindern Endlos-Loops, wenn ein Tool fehlt oder hängt."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Kontext-Hygiene"})," ist die wichtigste Disziplin: frische Sessions starten — vollgemüllte Historien werden langsam, driften und halluzinieren."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Kanäle:"})," CLI/Terminal, Chat-UI, Messaging (z.B. Telegram), reine API."]})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:[l.jsx("strong",{children:"Least Privilege:"})," gib einem Agenten nur die Tools, die er wirklich braucht. Kritische Aktionen (Shell auf dem Host, Löschen, Geld/Deploys) hinter menschliche Freigabe."]}),l.jsxs("p",{children:[l.jsx("strong",{children:"Was sich vollautomatisch lohnt:"})," Modell-Routing, Hintergrund-Gedächtnis, Recherche. ",l.jsx("strong",{children:"Was Freigabe braucht:"})," Systembefehle, Updates/Reboots, permanentes Löschen."]})]})]}),l.jsxs($a,{children:[l.jsx("strong",{children:"Hermes"})," ist dein Box-Agent (Hirn = ",l.jsx(ze,{children:"fast"}),"). Reden tust du mit ihm im",l.jsx("strong",{children:" Terminal"}),"-Tab (Web-Terminal via ttyd) oder per ",l.jsx("strong",{children:"Telegram"}),". Er hat MCP-Server für Gedächtnis, Stack-Steuerung, Web-Fetch und ",l.jsx("strong",{children:"PC-Steuerung"})," (Executor auf deinem Windows-PC). Status & Verdrahtung im ",l.jsx("strong",{children:"Hermes"}),"-Tab."]})]}),l.jsxs(_r,{id:"ide",icon:_s,color:"text-cyan-400",title:"10. IDE / Editor anbinden",kicker:"Vibe-Coding lokal",children:[l.jsxs("p",{children:["Jede ",l.jsx("strong",{children:"OpenAI-kompatible"})," IDE oder Extension lässt sich auf einen lokalen Server umbiegen — Base-URL + Model eintragen, fertig:"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Cline"})," & ",l.jsx("strong",{children:"Roo Code"})," (VS-Code-Extensions, voller Agent + MCP)"]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Cursor"})," (VS-Code-Fork mit Top-Autocomplete)"]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Continue"}),", ",l.jsx("strong",{children:"aider"})," (CLI), ",l.jsx("strong",{children:"OpenCode"})," (Desktop)"]})]}),l.jsxs($a,{children:["Tipp den Kram nicht ab: der ",l.jsx("strong",{children:"Verbinden"}),"-Tab generiert die fertige Config (inkl. MCP-Gedächtnis) pro Tool zum Kopieren. Essenz: Base ",l.jsx(ze,{children:"…:9001/v1"}),", Model ",l.jsx(ze,{children:"auto"}),", Key beliebig."]})]}),l.jsx(_r,{id:"tricks",icon:x4,color:"text-amber-400",title:"11. Tricks & Kniffe",kicker:"Was im Alltag wirklich spart",wide:!0,children:l.jsx("div",{className:"grid md:grid-cols-3 gap-3",children:[["Kontext sauber halten","Neue Session statt Mega-Historie. Drift, Tempo und Halluzination hängen direkt am Kontext-Müll."],["Plan-then-Act","Erst Plan/Vorgehen bestätigen lassen, dann ausführen. Spart teure Holzwege."],["Gezielte Edits","Nie ganze Dateien überschreiben für eine Zeile — Such-/Ersetz-Tools nutzen. Weniger Tokens, weniger Fehler."],["Non-interaktive Befehle","Keine interaktiven Prompts im Agent-Terminal; lange Tasks als Background-Job. Sonst hängt der Loop."],["DevTools koppeln","Browser-/Konsolen-Zugriff geben — der Agent liest echte Fehler statt blind zu raten."],["Richtige Modellwahl","Schnelles Hirn für Alltag, großes für harte Logik, Coder fürs Coden. Nicht alles mit der Kanone."],["Akzeptanzkriterien","Sag konkret, woran „fertig“ erkennbar ist. Vage Prompts → vage Ergebnisse."],["Verifizieren statt vertrauen","Tests/Live-Check fordern. „Sollte funktionieren“ ist kein Beweis."],["Regeln ins Gedächtnis","Wiederkehrende Vorlieben/Konventionen einmal ablegen — der Agent zieht sie selbst."]].map(([r,n])=>l.jsxs("div",{className:"space-y-1 p-3 bg-background/10 rounded-xl border border-border/30",children:[l.jsxs("div",{className:"flex items-center gap-1.5 font-bold text-foreground text-[11px]",children:[l.jsx(ma,{className:"h-3 w-3 text-amber-400"})," ",r]}),l.jsx("p",{className:"text-[11px]",children:n})]},r))})}),l.jsx(_r,{id:"wartung",icon:Gs,color:"text-emerald-400",title:"12. Sicherheit & Wartung",kicker:"Damit's auch morgen noch läuft",wide:!0,children:l.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{className:"flex items-center gap-1.5 font-bold text-foreground",children:[l.jsx(CN,{className:"h-3.5 w-3.5 text-emerald-400"})," Goldene Regeln"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Ein ungetesteter Restore ist kein Backup."})," Wiederherstellung mindestens einmal echt durchspielen."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Updates können Dinge still zerschießen"})," — gerade bei AI-Stacks (Embeddings, Provider-Interna). Versionen pinnen, Smoke-Test, Post-Check."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Least Privilege"})," für Agenten, MCP-Server und PC-Zugriff. Kritisches hinter Freigabe."]})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{className:"flex items-center gap-1.5 font-bold text-foreground",children:[l.jsx(Uu,{className:"h-3.5 w-3.5 text-emerald-400"})," Bei dir im SystemDrawer"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Backup:"})," tägliches Voll-Zustands-Backup, getesteter ",l.jsx(ze,{children:"restore.sh"})," (Doku in ",l.jsx(ze,{children:"docs/BACKUP.md"}),")."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Updates:"})," git-basierter Update-Check; ",l.jsx("strong",{children:"Hermes-Update-Button"})," mit anschließendem ",l.jsx("strong",{children:"Gehirn-Check"})," (rot, falls das Update das Gedächtnis zerschießt) + Engine-Update."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Dienste & Gefahrenzone:"})," Restart/Logs pro Dienst, kritische Eingriffe getrennt."]})]}),l.jsx("p",{className:"text-[10px] italic",children:'Erreichbar über das System-Icon → Tab „Wartung".'})]})]})}),l.jsxs("section",{id:"ressourcen",className:"scroll-mt-20 md:col-span-2 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 shadow-lg shadow-black/10 space-y-4",children:[l.jsxs("div",{className:"flex items-center gap-2.5 border-b border-border/20 pb-3",children:[l.jsx(rv,{className:"h-5 w-5 text-primary"}),l.jsxs("div",{children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"13. Kuratierte Ressourcen & Links"}),l.jsx("span",{className:"text-[9px] font-mono text-primary",children:"Sauber geordnet — die guten Quellen"})]})]}),l.jsxs("div",{className:"grid md:grid-cols-2 gap-5 text-xs",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"font-bold text-foreground flex items-center gap-1.5",children:[l.jsx(Jd,{className:"h-3.5 w-3.5 text-sky-400"})," Modelle & Engines"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1.5",children:[l.jsx(wt,{href:"https://huggingface.co/models",name:"Hugging Face",note:"das Repository für offene Modelle (GGUF, Embeddings, Datasets)."}),l.jsx(wt,{href:"https://github.com/ggml-org/llama.cpp",name:"llama.cpp",note:"die Referenz-Engine für lokale Inferenz."}),l.jsx(wt,{href:"https://github.com/mostlygeek/llama-swap",name:"llama-swap",note:"mehrere Modelle hinter einem Port, Auto-Swap."}),l.jsx(wt,{href:"https://ollama.com",name:"Ollama",note:"einfachster Einstieg, One-Command-Modelle."}),l.jsx(wt,{href:"https://lmstudio.ai",name:"LM Studio",note:"lokale GUI zum Stöbern, Laden & Chatten."}),l.jsx(wt,{href:"https://github.com/vllm-project/vllm",name:"vLLM",note:"Hochdurchsatz-Serving auf dicken GPUs."})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"font-bold text-foreground flex items-center gap-1.5",children:[l.jsx(tf,{className:"h-3.5 w-3.5 text-violet-400"})," MCP & Skills"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1.5",children:[l.jsx(wt,{href:"https://modelcontextprotocol.io",name:"MCP — offizielle Doku",note:"Spezifikation & Einstieg."}),l.jsx(wt,{href:"https://github.com/modelcontextprotocol/servers",name:"Offizielle MCP-Server",note:"filesystem, git, postgres, fetch & mehr."}),l.jsx(wt,{href:"https://smithery.ai",name:"Smithery",note:"Registry zum Suchen & Auto-Installieren von MCP-Servern."}),l.jsx(wt,{href:"https://glama.ai/mcp/servers",name:"Glama MCP Registry",note:"kuratierte Community-Datenbank."}),l.jsx(wt,{href:"https://skills.sh",name:"skills.sh",note:"Registry & CLI für Agent-Skills."})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"font-bold text-foreground flex items-center gap-1.5",children:[l.jsx(gn,{className:"h-3.5 w-3.5 text-rose-400"})," Agenten & Frameworks"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1.5",children:[l.jsx(wt,{href:"https://github.com/NousResearch/hermes-agent",name:"Hermes Agent (Nous)",note:"der Agent, der auf deiner Box läuft."}),l.jsx(wt,{href:"https://docs.claude.com",name:"Anthropic / Claude Docs",note:"API, Tool-Use, Agent SDK, MCP."}),l.jsx(wt,{href:"https://github.com/cline/cline",name:"Cline",note:"autonomer Coding-Agent für VS Code."}),l.jsx(wt,{href:"https://aider.chat",name:"aider",note:"AI-Pair-Programming im Terminal, git-nativ."}),l.jsx(wt,{href:"https://continue.dev",name:"Continue",note:"Open-Source-Autopilot für IDEs."})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"font-bold text-foreground flex items-center gap-1.5",children:[l.jsx(tv,{className:"h-3.5 w-3.5 text-amber-400"})," Lernen & Community"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1.5",children:[l.jsx(wt,{href:"https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/overview",name:"Prompt-Engineering (Anthropic)",note:"die beste praktische Anleitung."}),l.jsx(wt,{href:"https://github.com/anthropics/anthropic-cookbook",name:"Anthropic Cookbook",note:"lauffähige Rezepte für Tools, RAG, Agenten."}),l.jsx(wt,{href:"https://www.promptingguide.ai",name:"Prompt Engineering Guide",note:"herstellerneutrales Nachschlagewerk."}),l.jsx(wt,{href:"https://github.com/mem0ai/mem0",name:"Mem0",note:"die auto-lernende Memory-Schicht hinter deinem Gedächtnis."}),l.jsx(wt,{href:"https://www.reddit.com/r/LocalLLaMA/",name:"r/LocalLLaMA",note:"der Puls der lokalen-LLM-Szene."})]})]})]})]}),l.jsx(_r,{id:"troubleshooting",icon:y4,color:"text-rose-400",title:"14. Troubleshooting",kicker:"Wenn's hakt",wide:!0,children:l.jsxs("ul",{className:"space-y-2 list-disc pl-4",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Keine Verbindung?"})," Selbes LAN wie die Box? IP/Port stimmen (",l.jsx(ze,{children:":9001"}),")? Backend-Status in der ",l.jsx("strong",{children:"Zentrale"})," prüfen."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Modell antwortet nicht / langsam?"})," In der ",l.jsx("strong",{children:"Zentrale → Dienste"})," schauen, ob ",l.jsx(ze,{children:"llama-swap"})," grün ist; sonst Restart. Erstes Token nach Swap dauert (Modell lädt)."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Agent dreht durch / halluziniert?"})," Frische Session im ",l.jsx("strong",{children:"Terminal"})," starten — meist ist es vollgemüllter Kontext."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Gedächtnis findet nichts?"})," Embedding-Dienst online? Semantisch suchen (Sinn statt exaktem Wort). Leeres Gedächtnis → Hermes-Onboarding starten."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Update hat etwas zerschossen?"})," Genau dafür gibt es Backup & ",l.jsx(ze,{children:"restore.sh"})," — den getesteten Restore fahren, dann Ursache suchen."]})]})})]}),l.jsx("p",{className:"text-center text-[10px] text-muted-foreground/50 pt-2",children:"Mission Control 2 · AI-Bibel · Stand Juni 2026 — lebendes Dokument, wächst mit dem Stack."})]})}function KX({title:e,hint:t}){return l.jsxs("div",{className:"space-y-4",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-xl font-semibold",children:e}),l.jsx("p",{className:"text-sm text-muted-foreground",children:t})]}),l.jsxs("div",{className:"flex flex-col items-center justify-center gap-3 rounded-xl border border-dashed border-border bg-card/50 py-20 text-center",children:[l.jsx(o4,{className:"h-8 w-8 text-muted-foreground"}),l.jsx("div",{className:"text-sm text-muted-foreground",children:"Kommt in einer späteren Phase."})]})]})}const J2=[{id:"mission-control-2",label:"Mission Control",type:"user",reach:"gateway (integr"},{id:"hermes-gateway",label:"Hermes Gateway",type:"user",reach:"hermes-gateway"},{id:"mem0-service",label:"Mem0 (Gedächtnis)",type:"user",reach:"mem0"},{id:"hermes-terminal",label:"Hermes Terminal",type:"user",reach:"hermes-terminal"},{id:"llama-swap",label:"Llama Swap",type:"system",reach:"llama-swap"}];function au({icon:e,iconClass:t,name:r,status:n,available:a,busy:o,actionLabel:u,onAction:c}){return l.jsxs("div",{className:te("flex items-center gap-3 rounded-lg border px-3 py-2",a?"border-amber-500/30 bg-amber-500/5":"border-border/50 bg-background/20"),children:[l.jsx(e,{className:te("h-4 w-4 shrink-0",t)}),l.jsxs("div",{className:"flex-1 min-w-0",children:[l.jsx("div",{className:"text-xs text-foreground truncate",children:r}),l.jsx("div",{className:te("text-[10px] truncate",a?"text-amber-400/90":"text-muted-foreground"),children:n})]}),l.jsx("button",{onClick:c,disabled:!a||o,className:te("text-[11px] font-semibold rounded-lg px-2.5 py-1 transition-colors shrink-0",a?"bg-primary text-primary-foreground hover:opacity-90 cursor-pointer":"border border-border/50 text-muted-foreground/40 cursor-default"),children:o?"…":u})]})}function GX({label:e,ok:t,system:r,busy:n,onRestart:a,onLogs:o}){return l.jsxs("div",{className:"flex items-center gap-2.5 rounded-lg border border-border/50 bg-background/20 px-3 py-2",children:[l.jsx("span",{className:te("w-1.5 h-1.5 rounded-full shrink-0",t===!0?"bg-emerald-500":t===!1?"bg-red-500":"bg-muted-foreground/40")}),l.jsxs("span",{className:"flex-1 text-xs text-foreground truncate",children:[e,r&&l.jsx("span",{className:"text-[9px] text-muted-foreground",children:" (root)"})]}),l.jsx("button",{onClick:a,disabled:n,title:"Neu starten",className:"text-muted-foreground hover:text-primary transition-colors disabled:opacity-50",children:l.jsx(Ha,{className:te("h-3.5 w-3.5",n&&"animate-spin")})}),l.jsx("button",{onClick:o,title:"Logs ansehen",className:"text-muted-foreground hover:text-primary transition-colors",children:l.jsx(l4,{className:"h-3.5 w-3.5"})})]})}function zg(e){return e==null?"":e>1024**3?`${(e/1024**3).toFixed(2)} GB`:`${(e/1024**2).toFixed(1)} MB`}function VX({open:e,showAlert:t}){const[r,n]=y.useState(""),[a,o]=y.useState(""),[u,c]=y.useState(!1),[f,h]=y.useState(!1);return y.useEffect(()=>{e&&(n(localStorage.getItem("mc_sudo_password")||""),o(localStorage.getItem("mc_hf_token")||""))},[e]),l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Zugangsdaten & Schlüssel"}),l.jsx("p",{className:"text-[10px] text-muted-foreground leading-normal",children:"Diese Daten werden ausschließlich lokal in deinem Browser (localStorage) gespeichert und bei Bedarf an das Backend übertragen."})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("label",{className:"text-xs font-semibold flex items-center gap-1.5",children:[l.jsx(Gs,{className:"h-4 w-4 text-amber-400"}),"Host Sudo-Passwort"]}),l.jsxs("div",{className:"relative",children:[l.jsx("input",{type:u?"text":"password",value:r,onChange:m=>n(m.target.value),"aria-label":"Host Sudo-Passwort",name:"sudo-password",autoComplete:"off",spellCheck:!1,placeholder:"Sudo-Passwort für System-Operationen",className:"w-full h-10 pl-3 pr-10 text-xs bg-background/40 border border-border/60 rounded-lg outline-none focus:border-primary transition-colors text-foreground"}),l.jsx("button",{type:"button",onClick:()=>c(!u),"aria-label":u?"Passwort verbergen":"Passwort anzeigen",className:"absolute inset-y-0 right-0 flex items-center pr-3 text-muted-foreground hover:text-foreground transition-colors",children:u?l.jsx(fw,{className:"h-4 w-4","aria-hidden":"true"}):l.jsx(ef,{className:"h-4 w-4","aria-hidden":"true"})})]}),l.jsx("p",{className:"text-[9px] text-muted-foreground leading-normal",children:"Wird benötigt für systemd-Dienste (Llama Swap logs/restart), OS-Update (apt) und Reboot."})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("label",{className:"text-xs font-semibold flex items-center gap-1.5",children:[l.jsx(p4,{className:"h-4 w-4 text-violet-400"}),"HuggingFace API Token"]}),l.jsxs("div",{className:"relative",children:[l.jsx("input",{type:f?"text":"password",value:a,onChange:m=>o(m.target.value),"aria-label":"HuggingFace API Token",name:"hf-token",autoComplete:"off",spellCheck:!1,placeholder:"hf_…",className:"w-full h-10 pl-3 pr-10 text-xs bg-background/40 border border-border/60 rounded-lg outline-none focus:border-primary transition-colors text-foreground"}),l.jsx("button",{type:"button",onClick:()=>h(!f),"aria-label":f?"Token verbergen":"Token anzeigen",className:"absolute inset-y-0 right-0 flex items-center pr-3 text-muted-foreground hover:text-foreground transition-colors",children:f?l.jsx(fw,{className:"h-4 w-4","aria-hidden":"true"}):l.jsx(ef,{className:"h-4 w-4","aria-hidden":"true"})})]}),l.jsx("p",{className:"text-[9px] text-muted-foreground leading-normal",children:"Erlaubt das Herunterladen von geschützten oder Gate-restricted Modellen direkt über Mission Control."})]}),l.jsxs("div",{className:"flex gap-3 pt-2",children:[l.jsx("button",{onClick:()=>{localStorage.setItem("mc_sudo_password",r),localStorage.setItem("mc_hf_token",a),t("Erfolgreich","Einstellungen erfolgreich lokal gespeichert.")},className:"flex-1 h-9 flex items-center justify-center text-xs font-semibold text-primary-foreground bg-primary hover:bg-primary/90 rounded-lg transition-colors shadow shadow-primary/10 cursor-pointer",children:"Speichern"}),l.jsx("button",{onClick:()=>{n(""),o(""),localStorage.removeItem("mc_sudo_password"),localStorage.removeItem("mc_hf_token"),t("Gelöscht","Zugangsdaten gelöscht.")},className:"h-9 px-4 flex items-center justify-center text-xs font-semibold text-muted-foreground border border-border/60 bg-background/20 hover:bg-accent rounded-lg transition-colors cursor-pointer",children:"Zurücksetzen"})]})]})}function qX({detail:e,maintenanceJob:t,onClose:r,onApply:n}){var f;const a=e.data,o={os:{icon:Gs,cls:"text-cyan-400",title:"OS-Pakete (apt)"},engine:{icon:nh,cls:"text-violet-400",title:"Inferenz-Engine (llama.cpp)"},swap:{icon:ON,cls:"text-fuchsia-400",title:"Router (llama-swap)"},hermes:{icon:gn,cls:"text-amber-400",title:"Hermes-Agent"}}[e.kind],u=o.icon,c=a?e.kind==="os"?(a.count??0)===0:e.kind==="hermes"?(a.behind??0)===0:a.installed_build!=null&&a.latest_build!=null&&a.latest_build<=a.installed_build:!0;return l.jsxs("div",{className:"fixed inset-0 z-[60] flex items-center justify-center p-4",children:[l.jsx("div",{className:"absolute inset-0 bg-black/70 backdrop-blur-sm",onClick:r}),l.jsxs("div",{className:"relative w-full max-w-lg max-h-[80vh] flex flex-col rounded-2xl border border-border/60 bg-card shadow-2xl font-sans text-foreground",children:[l.jsxs("div",{className:"flex h-14 shrink-0 items-center justify-between border-b border-border/40 px-5",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(u,{className:te("h-4.5 w-4.5",o.cls)}),l.jsx("h3",{className:"text-sm font-semibold",children:o.title})]}),l.jsx("button",{onClick:r,className:"flex h-7 w-7 items-center justify-center rounded-lg border border-border/40 text-muted-foreground hover:bg-accent transition-colors",children:l.jsx(zn,{className:"h-4 w-4"})})]}),l.jsx("div",{className:"flex-1 overflow-y-auto p-5 text-xs space-y-3 scrollbar-thin",children:e.loading?l.jsxs("div",{className:"flex h-24 items-center justify-center gap-2 text-muted-foreground",children:[l.jsx(Ha,{className:"h-4 w-4 animate-spin"})," Details werden geladen…"]}):a!=null&&a.error?l.jsx("div",{className:"rounded-lg border border-red-500/30 bg-red-500/5 p-3 text-red-400",children:a.error}):e.kind==="os"?((a==null?void 0:a.count)??0)===0?l.jsx("div",{className:"text-muted-foreground",children:"Keine Pakete zu aktualisieren — System ist aktuell."}):l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"text-muted-foreground",children:[a.count," Paket(e) werden aktualisiert:"]}),l.jsx("div",{className:"space-y-1",children:a.packages.map(h=>l.jsxs("div",{className:"flex items-center justify-between gap-2 rounded-md border border-border/40 bg-background/30 px-2.5 py-1.5",children:[l.jsxs("span",{className:"flex items-center gap-1.5 font-mono text-[11px] truncate",children:[l.jsx(A4,{className:"h-3 w-3 text-cyan-400 shrink-0"}),h.name]}),l.jsxs("span",{className:"flex items-center gap-1 font-mono text-[10px] text-muted-foreground shrink-0",children:[l.jsx("span",{children:h.current}),l.jsx(Zd,{className:"h-3 w-3"}),l.jsx("span",{className:"text-emerald-400",children:h.candidate})]})]},h.name))})]}):e.kind==="engine"||e.kind==="swap"?l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"flex items-center gap-2 font-mono text-[11px]",children:[l.jsxs("span",{className:"rounded-md border border-border/40 bg-background/30 px-2 py-1",children:["Build ",(a==null?void 0:a.installed_build)??"?"]}),l.jsx(Zd,{className:"h-3.5 w-3.5 text-muted-foreground"}),l.jsxs("span",{className:"rounded-md border border-emerald-500/30 bg-emerald-500/5 px-2 py-1 text-emerald-400",children:["Build ",(a==null?void 0:a.latest_build)??"?"]})]}),((a==null?void 0:a.name)||(a==null?void 0:a.latest_tag))&&l.jsxs("div",{className:"text-muted-foreground",children:["Release: ",l.jsx("span",{className:"text-foreground",children:a==null?void 0:a.name}),a!=null&&a.latest_tag?` (${a.latest_tag})`:""]}),(a==null?void 0:a.url)&&l.jsxs("a",{href:a.url,target:"_blank",rel:"noreferrer",className:"inline-flex items-center gap-1 text-primary hover:underline",children:["Release-Notes auf GitHub ",l.jsx(Is,{className:"h-3 w-3"})]}),(a==null?void 0:a.body)&&l.jsx("pre",{className:"whitespace-pre-wrap rounded-lg border border-border/40 bg-background/30 p-3 text-[10px] leading-relaxed text-muted-foreground max-h-60 overflow-y-auto scrollbar-thin",children:a.body})]}):(((f=a==null?void 0:a.commits)==null?void 0:f.length)??0)===0?l.jsx("div",{className:"text-muted-foreground",children:"Keine neuen Commits — Hermes-Agent ist bereits aktuell."}):l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"text-muted-foreground",children:[a.behind," neue Commit(s) auf ",l.jsxs("span",{className:"font-mono text-foreground",children:["origin/",a.branch]}),":"]}),l.jsx("div",{className:"space-y-1",children:a.commits.map(h=>l.jsxs("div",{className:"flex items-start gap-2 rounded-md border border-border/40 bg-background/30 px-2.5 py-1.5",children:[l.jsx(d4,{className:"h-3.5 w-3.5 text-primary shrink-0 mt-0.5"}),l.jsxs("div",{className:"min-w-0",children:[l.jsx("div",{className:"text-[11px] truncate",children:h.subject}),l.jsxs("div",{className:"font-mono text-[9px] text-muted-foreground",children:[h.hash," · ",h.when]})]})]},h.hash))}),l.jsx("p",{className:"text-[10px] text-muted-foreground leading-normal",children:"Vor dem Update wird automatisch ein Backup erstellt; danach startet der Hermes-Gateway neu."})]})}),l.jsxs("div",{className:"flex gap-3 border-t border-border/40 p-4 shrink-0",children:[l.jsx("button",{onClick:r,className:"h-9 flex-1 rounded-lg border border-border/60 bg-background/20 text-xs font-semibold text-muted-foreground hover:bg-accent transition-colors cursor-pointer",children:"Schließen"}),l.jsx("button",{onClick:n,disabled:e.loading||c||!!t,title:t?`Update läuft bereits: ${t.label}`:void 0,className:"h-9 flex-1 rounded-lg bg-primary text-xs font-semibold text-primary-foreground hover:opacity-90 transition-all cursor-pointer disabled:opacity-40 disabled:cursor-default",children:t?"Update läuft…":"Jetzt aktualisieren"})]})]})]})}function YO({open:e,onClose:t,defaultTab:r="maintenance"}){var nt;const[n,a]=y.useState(null),[o,u]=y.useState([]),[c,f]=y.useState("llama-swap"),[h,m]=y.useState(""),[g,v]=y.useState(!1),[b,j]=y.useState(null),[k,S]=y.useState({}),[N,E]=y.useState("maintenance"),[A,P]=y.useState(!1),[M,O]=y.useState(""),[D,B]=y.useState(!1),[F,z]=y.useState(null),[Y,U]=y.useState([]),[me,ue]=y.useState(!1),[ge,ie]=y.useState(null),[oe,X]=y.useState(null);function re(q,Le,Er){X({type:"alert",title:q,message:Le,onConfirm:()=>{X(null),Er&&Er()}})}function J(q,Le,Er){X({type:"confirm",title:q,message:Le,onConfirm:()=>{X(null),Er()},onCancel:()=>X(null)})}function I(q){return q?new Date(q*1e3).toLocaleString("de-DE",{day:"2-digit",month:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}):"Nie"}y.useEffect(()=>{e&&r&&E(r)},[e,r]);const _=y.useRef(null);function W(){je("/api/maintenance/updates").then(a).catch(q=>console.error("Error loading updates",q))}function ee(){je("/api/jobs").then(q=>u(q.jobs||[])).catch(q=>console.error("Error loading jobs",q))}function Z(){je("/api/system/services").then(z).catch(()=>{})}function he(){je("/api/system/backups").then(q=>U(q.backups||[])).catch(()=>{})}function pe(q){v(!0),j(null),je(`/api/maintenance/logs?service=${q}&lines=150`).then(Le=>{Le.ok?m(Le.text):(m(`Fehler beim Laden der Logs: ${Le.err||"Unbekannter Fehler"}`),(Le.status==="incorrect_password"||Le.status==="password_required")&&j(Le.status))}).catch(Le=>m(`Fehler: ${Le.message}`)).finally(()=>{v(!1),setTimeout(()=>{_.current&&(_.current.scrollTop=_.current.scrollHeight)},50)})}y.useEffect(()=>{if(!e)return;W(),ee(),Z(),he();const q=setInterval(()=>{ee(),W(),Z()},3e3);return()=>clearInterval(q)},[e]),y.useEffect(()=>{!e||N!=="logs"||pe(c)},[e,N,c]);function Pe(q){return(q==null?void 0:q.status)==="busy"?(re("Update läuft bereits",`Es läuft gerade „${q.running}". Bitte warte, bis es fertig ist.`),ee(),!0):!1}async function ne(){try{const q=await je("/api/maintenance/os-update",{method:"POST"});if(Pe(q))return;ee(),E("maintenance")}catch(q){re("Fehler",`Fehler beim Starten des OS-Updates: ${q.message}`)}}async function we(){try{const q=await je("/api/maintenance/engine-update",{method:"POST"});if(Pe(q))return;ee(),E("maintenance")}catch(q){re("Fehler",`Fehler beim Engine-Update: ${q.message}`)}}async function _e(){try{const q=await je("/api/maintenance/swap-update",{method:"POST"});if(Pe(q))return;ee(),E("maintenance")}catch(q){re("Fehler",`Fehler beim Router-Update: ${q.message}`)}}async function le(){ue(!0);try{const q=await je("/api/maintenance/hermes-update",{method:"POST"});if(Pe(q))return;ee()}catch(q){re("Fehler",`Hermes-Update fehlgeschlagen: ${q.message}`)}finally{ue(!1)}}async function Ze(q){ie({kind:q,loading:!0,data:null});try{const Le=await je(`/api/maintenance/update-details?kind=${q}`);ie({kind:q,loading:!1,data:Le})}catch(Le){ie({kind:q,loading:!1,data:{kind:q,error:Le.message}})}}function Be(){const q=ge==null?void 0:ge.kind;ie(null),q==="os"?ne():q==="engine"?we():q==="swap"?_e():q==="hermes"&&le()}async function Oe(){P(!0);try{await je("/api/maintenance/check-updates",{method:"POST"}),ee(),E("maintenance")}catch(q){re("Fehler",`Fehler bei der Update-Suche: ${q.message}`)}finally{P(!1)}}async function yt(q,Le){try{await je("/api/models/install",{method:"POST",body:JSON.stringify({repo:q,role:Le})}),re("Gestartet",`Modell-Upgrade für '${Le}' (${q}) gestartet.`),ee(),E("maintenance")}catch(Er){re("Fehler",`Fehler beim Starten des Modell-Upgrades: ${Er.message}`)}}async function Xt(){J("Reboot bestätigen","Bist du sicher, dass du das gesamte Host-System neu starten willst?",async()=>{try{await je("/api/maintenance/reboot",{method:"POST"}),re("Reboot","Reboot ausgelöst. System startet neu...",()=>{t()})}catch(q){re("Fehler",`Fehler beim Reboot: ${q.message}`)}})}async function K(){B(!0),O("Snapshot wird erzeugt...");try{const q=await je("/api/system/backup",{method:"POST"});O(q.ok?`Snapshot erzeugt: ${q.snapshot} (${q.files.length} Komponenten)`:"Backup fehlgeschlagen."),he()}catch(q){O(`Fehler: ${q.message}`)}finally{B(!1)}}async function Se(q){S(Le=>({...Le,[q]:!0}));try{const Le=await je("/api/maintenance/restart",{method:"POST",body:JSON.stringify({service:q})});Le.ok?re("Dienst neu gestartet",`Dienst ${q} wurde erfolgreich neu gestartet.`,()=>{N==="logs"&&c===q&&pe(q)}):re("Fehler",`Fehler beim Neustart: ${Le.err||"Unbekannter Fehler"}`)}catch(Le){re("Fehler",`Fehler beim Neustart: ${Le.message}`)}finally{S(Le=>({...Le,[q]:!1}))}}async function Ce(q){try{await je(`/api/jobs/${q}/cancel`,{method:"POST"}),ee()}catch(Le){re("Fehler",`Fehler beim Abbrechen: ${Le.message}`)}}const Ge=o.find(q=>(q.state==="running"||q.state==="queued")&&q.group==="maintenance");return l.jsxs(l.Fragment,{children:[l.jsx("div",{className:te("fixed inset-0 bg-black/60 backdrop-blur-sm z-50 transition-opacity duration-300",e?"opacity-100 pointer-events-auto":"opacity-0 pointer-events-none"),onClick:t}),l.jsxs("div",{className:te("fixed inset-y-0 right-0 w-full sm:w-[640px] bg-card/85 backdrop-blur-xl border-l border-border/60 shadow-2xl z-50 flex flex-col transform transition-transform duration-300 ease-in-out font-sans text-foreground",e?"translate-x-0":"translate-x-full"),children:[l.jsxs("div",{className:"flex h-16 shrink-0 items-center justify-between border-b border-border/40 px-6",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx($n,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold tracking-wide uppercase font-space",children:"OS-Zentrale & Pflege"})]}),l.jsx("button",{onClick:t,className:"flex h-8 w-8 items-center justify-center rounded-lg border border-border/40 text-muted-foreground hover:bg-accent transition-colors",children:l.jsx(zn,{className:"h-4 w-4"})})]}),l.jsxs("div",{className:"flex border-b border-border/40 px-6",children:[l.jsx("button",{onClick:()=>E("maintenance"),className:te("flex-1 py-3 text-xs font-semibold uppercase tracking-wider border-b-2 text-center transition-all",N==="maintenance"?"border-primary text-primary":"border-transparent text-muted-foreground hover:text-foreground"),children:"System-Wartung"}),l.jsx("button",{onClick:()=>E("logs"),className:te("flex-1 py-3 text-xs font-semibold uppercase tracking-wider border-b-2 text-center transition-all",N==="logs"?"border-primary text-primary":"border-transparent text-muted-foreground hover:text-foreground"),children:"System-Logs"}),l.jsx("button",{onClick:()=>E("settings"),className:te("flex-1 py-3 text-xs font-semibold uppercase tracking-wider border-b-2 text-center transition-all",N==="settings"?"border-primary text-primary":"border-transparent text-muted-foreground hover:text-foreground"),children:"Einstellungen"})]}),l.jsxs("div",{className:"flex-1 overflow-y-auto p-6 space-y-6",children:[N==="maintenance"&&l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"space-y-2.5",children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Updates"}),l.jsxs("button",{onClick:Oe,disabled:A||!!Ge,className:"flex items-center gap-1 text-[10px] font-semibold text-primary hover:text-primary/80 transition-colors disabled:opacity-50",children:[l.jsx(Ha,{className:te("h-3 w-3",A&&"animate-spin")})," Nach Updates suchen"]})]}),(n==null?void 0:n.last_check)&&l.jsxs("div",{className:"text-[9px] text-muted-foreground -mt-1",children:["Zuletzt gesucht: ",I(n.last_check)]}),Ge&&l.jsxs("div",{className:"flex items-center gap-2 rounded-lg border border-amber-500/30 bg-amber-500/10 px-3 py-2 text-[11px] text-amber-300",children:[l.jsx(Ha,{className:"h-3.5 w-3.5 shrink-0 animate-spin"}),l.jsxs("span",{children:["Update läuft: ",l.jsx("span",{className:"font-semibold",children:Ge.label})," — bitte warten. Weitere Updates sind solange gesperrt."]})]}),l.jsxs("div",{className:"space-y-1.5",children:[l.jsx(au,{icon:Gs,iconClass:"text-cyan-400",name:"OS-Pakete (apt)",available:!!(n!=null&&n.os),status:n!=null&&n.os?`${n.os} verfügbar`:"aktuell",actionLabel:"Anzeigen",onAction:()=>Ze("os")}),l.jsx(au,{icon:nh,iconClass:"text-violet-400",name:"Inferenz-Engine (llama.cpp)",available:!!(n!=null&&n.engine),status:n!=null&&n.engine?"Update verfügbar":"aktuell",actionLabel:"Anzeigen",onAction:()=>Ze("engine")}),l.jsx(au,{icon:ON,iconClass:"text-fuchsia-400",name:"Router (llama-swap)",available:!!(n!=null&&n.swap),status:n!=null&&n.swap?"Update verfügbar":"aktuell",actionLabel:"Anzeigen",onAction:()=>Ze("swap")}),(()=>{var Le;const q=(Le=n==null?void 0:n.components)==null?void 0:Le.find(Er=>Er.key==="hermes_agent");return l.jsx(au,{icon:gn,iconClass:"text-amber-400",name:"Hermes-Agent",available:(q==null?void 0:q.update)===!0,busy:me,status:(q==null?void 0:q.update)===!0?`Update: ${q.latest}`:(q==null?void 0:q.reachable)===!1?"offline":"aktuell",actionLabel:"Anzeigen",onAction:()=>Ze("hermes")})})(),(nt=n==null?void 0:n.model_list)==null?void 0:nt.map(q=>l.jsx(au,{icon:q3,iconClass:"text-emerald-400",name:`Modell · ${q.role}`,available:!0,status:q.title,actionLabel:"Upgrade",onAction:()=>yt(q.repo,q.role)},q.role))]})]}),l.jsxs("div",{className:"space-y-2.5",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Dienste"}),l.jsx("div",{className:"space-y-1.5",children:J2.map(q=>{var Le;return l.jsx(GX,{label:q.label,system:q.type==="system",ok:(Le=F==null?void 0:F.services.find(Er=>Er.name.toLowerCase().includes(q.reach)))==null?void 0:Le.ok,busy:k[q.id],onRestart:()=>Se(q.id),onLogs:()=>{f(q.id),E("logs")}},q.id)})})]}),l.jsxs("div",{className:"space-y-2.5",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Backup"}),l.jsxs("div",{className:"rounded-lg border border-border/50 bg-background/20 px-3 py-2.5 flex items-center gap-3",children:[l.jsxs("div",{className:"flex-1 min-w-0",children:[l.jsx("div",{className:"text-xs text-foreground truncate",children:Y[0]?`Letztes: ${Y[0].snapshot}`:"Noch kein Backup"}),l.jsxs("div",{className:"text-[10px] text-muted-foreground",children:[Y.length," Snapshots · Restore per CLI (restore.sh)"]})]}),l.jsxs("button",{onClick:K,disabled:D,className:"flex items-center gap-1.5 text-[11px] font-semibold rounded-lg px-2.5 py-1 bg-primary text-primary-foreground hover:opacity-90 transition-all cursor-pointer disabled:opacity-50 shrink-0",children:[l.jsx(X3,{className:te("h-3.5 w-3.5",D&&"animate-pulse")})," Snapshot"]})]}),M&&l.jsx("div",{className:"text-[10px] font-mono text-primary bg-primary/5 p-2 rounded-lg border border-primary/20 break-all leading-normal",children:M})]}),l.jsxs("div",{className:"space-y-2.5",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-red-400/80",children:"Gefahrenzone"}),l.jsxs("button",{onClick:Xt,className:"flex w-full items-center gap-3 p-3 rounded-lg border border-red-500/20 bg-red-500/5 hover:bg-red-500/10 text-red-400 transition-all text-left text-xs font-semibold",children:[l.jsx(P4,{className:"h-4.5 w-4.5"}),l.jsxs("div",{children:[l.jsx("div",{children:"Host-System neu starten"}),l.jsx("div",{className:"text-[10px] text-red-400/80 font-normal",children:"Startet die ganze Box neu"})]})]})]}),l.jsxs("div",{className:"space-y-3",children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Hintergrund-Aufgaben"}),l.jsxs("span",{className:"text-[10px] font-mono bg-primary/10 text-primary px-1.5 py-0.5 rounded-full",children:[o.filter(q=>q.state==="running"||q.state==="queued").length," Aktiv"]})]}),l.jsx("div",{className:"space-y-3",children:o.length===0?l.jsx("div",{className:"text-xs text-muted-foreground border border-dashed border-border/60 rounded-xl p-6 text-center",children:"Aktuell keine aktiven Hintergrund-Jobs."}):o.map(q=>{const Le=q.state==="running"||q.state==="queued";return l.jsxs("div",{className:te("p-3 rounded-xl border transition-all duration-300",Le?"border-primary/40 bg-primary/5 shadow-md shadow-primary/5":"border-border/40 bg-background/20 opacity-80"),children:[l.jsxs("div",{className:"flex items-start justify-between gap-3",children:[l.jsxs("div",{className:"space-y-1",children:[l.jsxs("div",{className:"text-xs font-semibold flex items-center gap-1.5",children:[Le&&l.jsxs("span",{className:"flex h-2 w-2 relative",children:[l.jsx("span",{className:"animate-ping absolute inline-flex h-full w-full rounded-full bg-primary opacity-75"}),l.jsx("span",{className:"relative inline-flex rounded-full h-2 w-2 bg-primary"})]}),q.label]}),l.jsxs("div",{className:"text-[10px] font-mono text-muted-foreground uppercase flex items-center gap-2",children:[l.jsxs("span",{children:["ID: ",q.id]}),l.jsx("span",{children:"•"}),l.jsx("span",{className:te(q.state==="done"&&"text-emerald-400",q.state==="failed"&&"text-red-400",q.state==="running"&&"text-primary",q.state==="queued"&&"text-amber-400",q.state==="canceled"&&"text-muted-foreground"),children:q.state})]})]}),Le&&l.jsx("button",{onClick:()=>Ce(q.id),className:"text-[10px] font-semibold text-red-400 hover:text-red-300 border border-red-500/20 bg-red-500/5 hover:bg-red-500/10 px-2 py-0.5 rounded transition-colors",children:"Abbrechen"})]}),q.state==="running"&&l.jsxs("div",{className:"mt-3 space-y-1",children:[l.jsx("div",{className:"w-full h-1.5 bg-muted rounded-full overflow-hidden",children:l.jsx("div",{className:"h-full bg-primary transition-all duration-500",style:{width:`${q.progress??0}%`}})}),l.jsxs("div",{className:"flex justify-between items-center text-[9px] font-mono text-muted-foreground",children:[l.jsxs("span",{children:[q.progress??0,"%"]}),q.done_bytes!=null&&q.total_bytes!=null&&l.jsxs("span",{children:[zg(q.done_bytes)," / ",zg(q.total_bytes),q.rate_bps!=null&&` (${zg(q.rate_bps)}/s)`]}),q.eta_s!=null&&l.jsxs("span",{children:["ETA: ",q.eta_s,"s"]})]})]})]},q.id)})})]})]}),N==="logs"&&l.jsxs("div",{className:"flex flex-col h-full space-y-4",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx("select",{value:c,onChange:q=>f(q.target.value),className:"flex-1 h-9 px-3 text-xs bg-background/40 border border-border/60 rounded-lg outline-none text-foreground font-semibold",children:J2.map(q=>l.jsxs("option",{value:q.id,children:[q.label," (",q.type==="system"?"systemd-root":"user",")"]},q.id))}),l.jsxs("button",{onClick:()=>Se(c),disabled:k[c],className:"flex h-9 px-3 items-center gap-1.5 text-xs font-semibold rounded-lg border border-border/60 bg-background/20 hover:border-primary/50 transition-colors disabled:opacity-50",title:"Dienst neu starten",children:[l.jsx(Ha,{className:te("h-3.5 w-3.5",k[c]&&"animate-spin")}),"Restart"]})]}),l.jsxs("div",{className:"flex-1 flex flex-col min-h-[300px] border border-border/60 bg-black/50 rounded-xl overflow-hidden shadow-inner",children:[l.jsxs("div",{className:"flex h-9 items-center justify-between px-4 border-b border-border/40 bg-black/30 shrink-0",children:[l.jsxs("div",{className:"flex items-center gap-1.5 text-[10px] font-mono text-muted-foreground",children:[l.jsx(MN,{className:"h-3 w-3 text-primary"}),l.jsxs("span",{children:["stdout/stderr - ",c]})]}),l.jsx("button",{onClick:()=>pe(c),disabled:g,className:"text-muted-foreground hover:text-foreground transition-colors",children:l.jsx(Ha,{className:te("h-3 w-3",g&&"animate-spin")})})]}),l.jsx("pre",{ref:_,className:"flex-1 p-4 overflow-y-auto text-[10px] font-mono text-cyan-300/90 whitespace-pre-wrap select-text leading-relaxed scrollbar-thin",children:b==="password_required"||b==="incorrect_password"?l.jsxs("div",{className:"flex flex-col items-center justify-center p-6 text-center h-full space-y-3",children:[l.jsx(mi,{className:"h-8 w-8 text-amber-400 animate-pulse animate-duration-1000"}),l.jsx("div",{className:"text-xs font-semibold text-amber-300",children:b==="incorrect_password"?"Falsches Sudo-Passwort hinterlegt.":"Sudo-Passwort für systemd-Dienste erforderlich."}),l.jsxs("p",{className:"text-[10px] text-muted-foreground max-w-xs leading-normal",children:["Für das Auslesen der systemd-Logs von ",c," werden Root-Rechte benötigt. Hinterlege dein Passwort in den Einstellungen."]}),l.jsx("button",{onClick:()=>E("settings"),className:"px-3 py-1.5 text-[10px] font-semibold text-primary-foreground bg-primary hover:bg-primary/95 rounded-md transition-colors mt-2",children:"Sudo-Passwort eintragen"})]}):g&&!h?l.jsx("span",{className:"text-muted-foreground",children:"Lade Logs..."}):h||l.jsx("span",{className:"text-muted-foreground",children:"Keine Logeinträge vorhanden."})})]})]}),N==="settings"&&l.jsx(VX,{open:e,showAlert:re})]})]}),ge&&l.jsx(qX,{detail:ge,maintenanceJob:Ge,onClose:()=>ie(null),onApply:Be}),oe&&l.jsx(FO,{type:oe.type,title:oe.title,message:oe.message,onConfirm:oe.onConfirm,onCancel:oe.onCancel})]})}function QX(){const{data:e}=uh(3e4),{data:t}=xi(),r=((e==null?void 0:e.os)||0)+((e==null?void 0:e.engine)||0)+((e==null?void 0:e.swap)||0)+((e==null?void 0:e.models)||0),n=()=>window.dispatchEvent(new CustomEvent("open-system-drawer",{detail:{tab:"maintenance"}})),a=(t==null?void 0:t.models)??[],o=(t==null?void 0:t.running)??[],u=a.find(m=>m.role==="hermes"),c=a.find(m=>m.role==="coder-lite")||a.find(m=>m.role==="coder"),f=m=>m?o.includes(m):!1,h=m=>{var g;return((g=m==null?void 0:m.split("/").pop())==null?void 0:g.replace(/\.gguf$/i,""))||"—"};return l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Basisstation"}),l.jsx("p",{className:"text-sm text-muted-foreground",children:"Geht's der Box gut, gibt's Updates, was läuft gerade."})]}),l.jsx(KO,{frame:"box"}),l.jsxs("button",{onClick:n,className:te("w-full flex items-center gap-3 rounded-2xl border p-4 text-left transition-all cursor-pointer",r>0?"border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/10":"border-border/60 bg-card/45 hover:border-primary/40"),children:[r>0?l.jsx(J3,{className:"h-6 w-6 shrink-0 text-amber-400"}):l.jsx(or,{className:"h-6 w-6 shrink-0 text-emerald-400"}),l.jsxs("div",{className:"flex-1 min-w-0",children:[l.jsx("div",{className:te("text-sm font-semibold",r>0?"text-amber-400":"text-foreground"),children:r>0?`${r} Update${r===1?"":"s"} verfügbar`:"Alles aktuell"}),l.jsx("div",{className:"text-xs text-muted-foreground",children:r>0?"Antippen, um zu sehen, was genau aktualisiert wird.":"Keine ausstehenden Updates."})]}),r>0&&l.jsxs("span",{className:"shrink-0 flex items-center gap-1 text-xs font-semibold text-amber-400",children:["Ansehen ",l.jsx(th,{className:"h-4 w-4"})]})]}),l.jsxs("div",{children:[l.jsx("div",{className:"text-xs text-muted-foreground mb-2",children:"Was gerade läuft"}),l.jsx("div",{className:"rounded-2xl border border-border/60 overflow-hidden",children:[{icon:$n,label:"Lucys Hirn",model:u==null?void 0:u.name,warm:f(u==null?void 0:u.name)},{icon:_s,label:"Coder (Vibe-Coding)",model:c==null?void 0:c.name,warm:f(c==null?void 0:c.name)}].map(m=>l.jsxs("div",{className:"flex items-center gap-3 px-4 py-3 border-b border-border/40 last:border-0",children:[l.jsx("span",{className:te("h-2 w-2 shrink-0 rounded-full",m.warm?"bg-emerald-500 animate-pulse":"bg-muted-foreground/40")}),l.jsx(m.icon,{className:"h-4 w-4 text-muted-foreground shrink-0"}),l.jsx("span",{className:"text-sm text-foreground w-40 shrink-0",children:m.label}),l.jsx("span",{className:"text-xs text-muted-foreground flex-1 truncate font-mono",children:h(m.model)}),l.jsx("span",{className:te("text-xs shrink-0",m.warm?"text-emerald-400":"text-muted-foreground"),children:m.model?m.warm?"warm":"bereit":"nicht gesetzt"})]},m.label))})]}),l.jsxs("div",{className:"grid gap-6 lg:grid-cols-2",children:[l.jsx(zO,{}),l.jsx(BO,{})]}),l.jsx(UO,{})]})}function Fg({icon:e,title:t,sub:r,onClick:n}){return l.jsxs("button",{onClick:n,className:"w-full flex items-center gap-4 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 text-left transition-all hover:border-primary/40 cursor-pointer",children:[l.jsx(e,{className:"h-6 w-6 text-muted-foreground shrink-0"}),l.jsxs("div",{className:"flex-1 min-w-0",children:[l.jsx("div",{className:"text-sm text-foreground",children:t}),l.jsx("div",{className:"text-xs text-muted-foreground",children:r})]}),l.jsx(th,{className:"h-5 w-5 text-muted-foreground shrink-0"})]})}function YX(){const[e,t]=y.useState(null);return e?l.jsxs("div",{className:"space-y-4",children:[l.jsxs("button",{onClick:()=>t(null),className:"flex items-center gap-1.5 text-xs font-semibold text-muted-foreground hover:text-foreground transition-colors cursor-pointer",children:[l.jsx(SN,{className:"h-4 w-4"})," Maschinenraum"]}),e==="modelle"?l.jsx(GO,{}):l.jsx(QO,{})]}):l.jsxs("div",{className:"space-y-4",children:[l.jsxs("div",{className:"flex items-start justify-between gap-3",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Maschinenraum"}),l.jsx("p",{className:"text-sm text-muted-foreground",children:"Nur nötig, wenn du wirklich was ändern willst."})]}),l.jsx(wE,{})]}),l.jsx(Fg,{icon:$n,title:"Modelle",sub:"Hirne, Coder, Immer-bereit-Set, Bibliothek",onClick:()=>t("modelle")}),l.jsx(Fg,{icon:R4,title:"Wartung und Logs",sub:"Updates, Backup, Dienste, Logs, Zugangsdaten",onClick:()=>window.dispatchEvent(new CustomEvent("open-system-drawer",{detail:{tab:"maintenance"}}))}),l.jsx(Fg,{icon:gn,title:"Hermes und Verdrahtung",sub:"Agent, Gehirn-Modell, PC-Verbindung",onClick:()=>t("hermes")})]})}const XX=[{id:"start",label:"Start",icon:eh},{id:"vibe",label:"Vibe-Coding",icon:_s},{id:"konstitution",label:"Konstitution",icon:V3},{id:"maschinenraum",label:"Maschinenraum",icon:Uu}];function ZX(){const[e,t]=y.useState("start"),[r,n]=y.useState(!1),[a,o]=y.useState("maintenance"),{data:u}=jy();y.useEffect(()=>{const f=h=>{var m;o(((m=h.detail)==null?void 0:m.tab)||"maintenance"),n(!0)};return window.addEventListener("open-system-drawer",f),()=>window.removeEventListener("open-system-drawer",f)},[]);const c=u&&u.engine_reachable&&(u.brain?u.brain.ready:!0);return l.jsxs("div",{className:"flex h-full relative",children:[l.jsx("div",{className:"fixed inset-0 -z-50 pointer-events-none overflow-hidden bg-[hsl(224,30%,6%)]",children:l.jsx("div",{className:"absolute inset-0 opacity-30 animate-aurora bg-gradient-to-tr from-teal-500/15 via-indigo-500/10 to-purple-500/15 blur-[130px]"})}),l.jsx(YO,{open:r,onClose:()=>n(!1),defaultTab:a}),l.jsxs("aside",{className:"flex w-56 shrink-0 flex-col border-r border-border/40 bg-card/45 backdrop-blur-md",children:[l.jsxs("div",{className:"flex items-center gap-2 px-5 py-4 border-b border-border/40",children:[l.jsx("div",{className:"h-7 w-7 rounded-lg bg-primary shadow-md shadow-primary/20"}),l.jsxs("div",{className:"leading-tight",children:[l.jsx("div",{className:"text-sm font-semibold tracking-wide font-space",children:"Mission Control"}),l.jsx("div",{className:"text-[10px] text-muted-foreground",children:"3 · Prototyp"})]})]}),l.jsx("nav",{className:"flex-1 space-y-1 px-3 py-4",children:XX.map(f=>l.jsxs("button",{onClick:()=>t(f.id),className:te("flex w-full items-center gap-3 rounded-md px-3 py-2 text-sm transition-all cursor-pointer",e===f.id?"bg-primary/15 text-primary":"text-muted-foreground hover:bg-accent hover:text-accent-foreground"),children:[l.jsx(f.icon,{className:"h-4.5 w-4.5 shrink-0"})," ",f.label]},f.id))}),l.jsxs("div",{className:"px-3 py-3 border-t border-border/40 space-y-2",children:[l.jsxs("div",{className:"flex items-center gap-2 px-2 text-xs text-muted-foreground",children:[l.jsx("span",{className:te("h-2 w-2 rounded-full",c?"bg-emerald-500 animate-pulse":"bg-amber-500")}),c?"Box läuft":"prüfen"]}),l.jsxs("a",{href:"#dashboard",className:"flex items-center gap-1.5 rounded-md px-2 py-1.5 text-[11px] text-muted-foreground hover:text-foreground transition-colors",children:[l.jsx(SN,{className:"h-3.5 w-3.5"})," zurück zu MC2"]})]})]}),l.jsxs("main",{className:"flex-1 min-w-0 overflow-y-auto p-6 scrollbar-thin",children:[e==="start"&&l.jsx(QX,{}),e==="vibe"&&l.jsx(VO,{}),e==="konstitution"&&l.jsx(qO,{}),e==="maschinenraum"&&l.jsx(YX,{})]})]})}function JX(){var j,k,S,N,E;WD();const[e,t]=y.useState(()=>{const A=window.location.hash.slice(1);return su.some(P=>P.id===A)?A:"dashboard"}),r=y.useCallback(A=>{window.location.hash.slice(1)===A?t(A):window.location.hash=A},[]),[n,a]=y.useState(()=>localStorage.getItem("mc_sidebar_collapsed")==="true"),[o,u]=y.useState(!1),[c,f]=y.useState("maintenance"),[h,m]=y.useState(()=>window.location.hash==="#mc3"),{data:g}=jy(),{data:v}=bo(2e4);y.useEffect(()=>{document.documentElement.classList.add("dark")},[]),y.useEffect(()=>{const A=P=>{var O;f(((O=P.detail)==null?void 0:O.tab)||"maintenance"),u(!0)};return window.addEventListener("open-system-drawer",A),()=>window.removeEventListener("open-system-drawer",A)},[]),y.useEffect(()=>{const A=P=>{var O;const M=(O=P.detail)==null?void 0:O.view;M&&r(M)};return window.addEventListener("mc-navigate",A),()=>window.removeEventListener("mc-navigate",A)},[r]),y.useEffect(()=>{const A=()=>{m(window.location.hash==="#mc3");const P=window.location.hash.slice(1);su.some(M=>M.id===P)&&t(P)};return window.addEventListener("hashchange",A),()=>window.removeEventListener("hashchange",A)},[]);const b=su.find(A=>A.id===e);return h?l.jsx(ZX,{}):l.jsxs("div",{className:"flex h-full relative",children:[l.jsxs("div",{className:"fixed inset-0 -z-50 pointer-events-none overflow-hidden bg-[hsl(224,30%,6%)]",children:[l.jsx("div",{className:"absolute inset-0 opacity-35 animate-aurora bg-gradient-to-tr from-teal-500/20 via-indigo-500/15 to-purple-500/20 blur-[130px]"}),l.jsx("div",{className:"absolute top-[-10%] left-[-10%] h-[50%] w-[50%] rounded-full bg-teal-500/15 blur-[160px]"}),l.jsx("div",{className:"absolute bottom-[-10%] right-[-10%] h-[50%] w-[50%] rounded-full bg-purple-500/15 blur-[160px]"}),l.jsx("div",{className:"absolute top-[30%] right-[20%] h-[40%] w-[40%] rounded-full bg-indigo-500/10 blur-[140px]"})]}),l.jsx(YT,{onNavigate:r}),l.jsx(YO,{open:o,onClose:()=>u(!1),defaultTab:c}),l.jsxs("aside",{className:te("flex shrink-0 flex-col border-r border-border/40 bg-card/45 backdrop-blur-md transition-all duration-300 ease-in-out",n?"w-16":"w-60"),children:[l.jsxs("div",{className:te("flex items-center py-4 border-b border-border/40 shrink-0",n?"flex-col gap-3 px-2":"justify-between px-5"),children:[l.jsxs("div",{className:"flex items-center gap-2 overflow-hidden",children:[l.jsx("div",{className:"h-7 w-7 rounded-lg bg-primary shadow-md shadow-primary/20 shrink-0"}),!n&&l.jsxs("div",{className:"leading-tight",children:[l.jsx("div",{className:"text-sm font-semibold tracking-wide font-space",children:"Mission Control"}),l.jsx("div",{className:"text-xs text-muted-foreground",children:"2.0"})]})]}),l.jsx("button",{onClick:()=>{a(A=>{const P=!A;return localStorage.setItem("mc_sidebar_collapsed",P.toString()),P})},className:"p-1 rounded-md hover:bg-accent text-muted-foreground transition-colors cursor-pointer","aria-label":n?"Seitenleiste ausklappen":"Seitenleiste einklappen",title:n?"Maximieren":"Minimieren",children:n?l.jsx(th,{className:"h-4 w-4","aria-hidden":"true"}):l.jsx(Z3,{className:"h-4 w-4","aria-hidden":"true"})})]}),l.jsx("nav",{className:"flex-1 space-y-1 px-3 py-4 overflow-y-auto",children:su.map(A=>l.jsxs("a",{href:`#${A.id}`,"aria-current":e===A.id?"page":void 0,className:te("flex w-full items-center rounded-md text-sm transition-all cursor-pointer",n?"justify-center p-2.5":"gap-3 px-3 py-2",e===A.id?"bg-primary/15 text-primary shadow-sm shadow-primary/5":"text-muted-foreground hover:bg-accent hover:text-accent-foreground"),title:n?A.label:void 0,"aria-label":n?A.label:void 0,children:[l.jsx(A.icon,{className:"h-4.5 w-4.5 shrink-0","aria-hidden":"true"}),!n&&l.jsx("span",{className:"truncate",children:A.label})]},A.id))}),l.jsx("div",{className:te("py-3 text-xs text-muted-foreground border-t border-border/40 shrink-0",n?"px-2 text-center":"px-5"),children:n?l.jsx("div",{className:"flex justify-center",children:l.jsx("span",{className:te("h-2.5 w-2.5 rounded-full ring-2 ring-black/40",g?g.engine_reachable?g.brain&&!g.brain.ready?"bg-amber-500 animate-pulse":"bg-emerald-500 animate-pulse":"bg-amber-500":"bg-red-500"),title:g?g.engine_reachable?g.brain&&!g.brain.ready?`Hirn offline (${g.brain.model??"fast"})`:"Engine + Hirn online":"Engine offline":"Backend offline"})}):l.jsxs("div",{className:"space-y-2 text-left",children:[g?l.jsxs(l.Fragment,{children:[l.jsxs("span",{className:"flex items-center gap-2",children:[l.jsx("span",{className:te("h-2 w-2 rounded-full animate-pulse",g.engine_reachable?"bg-emerald-500":"bg-amber-500")}),l.jsxs("span",{className:"truncate",children:["Engine ",g.engine_reachable?"online":"offline"]})]}),g.brain&&!g.brain.ready&&l.jsxs("span",{className:"flex items-center gap-2 text-amber-400",title:`Agent-Hirn '${g.brain.model??"fast"}' lädt nicht/abgestürzt`,children:[l.jsx("span",{className:"h-2 w-2 rounded-full bg-amber-500 animate-pulse"}),l.jsxs("span",{className:"truncate",children:["Hirn offline",g.brain.model?` (${g.brain.model})`:""]})]})]}):l.jsxs("span",{className:"flex items-center gap-2",children:[l.jsx("span",{className:"h-2 w-2 rounded-full bg-red-500"})," ",l.jsx("span",{className:"truncate",children:"Backend offline"})]}),(v==null?void 0:v.versions)&&l.jsxs("div",{className:"space-y-1 text-[9px] text-muted-foreground/60 mt-2 pt-2 border-t border-border/30",children:[l.jsxs("div",{className:"truncate",title:v.versions.mc2?`${v.versions.mc2.branch}-${v.versions.mc2.hash}${v.versions.mc2.dirty?"*":""} (${v.versions.mc2.date})`:"nicht gefunden",children:[l.jsx("strong",{children:"MC2:"})," ",v.versions.mc2?`${v.versions.mc2.hash}${v.versions.mc2.dirty?"*":""}`:"—"]}),l.jsxs("div",{className:"truncate",title:((j=v.versions.engine)==null?void 0:j.type)==="git"?`${v.versions.engine.branch}-${v.versions.engine.hash}${v.versions.engine.dirty?"*":""} (${v.versions.engine.date})`:((k=v.versions.engine)==null?void 0:k.version_text)||"unbekannt",children:[l.jsx("strong",{children:"Engine:"})," ",((S=v.versions.engine)==null?void 0:S.type)==="git"?`${v.versions.engine.hash}${v.versions.engine.dirty?"*":""}`:((E=(N=v.versions.engine)==null?void 0:N.version_text)==null?void 0:E.split(" ").pop())||"—"]}),l.jsxs("div",{className:"truncate",title:v.versions.hermes_ui?`${v.versions.hermes_ui.branch}-${v.versions.hermes_ui.hash}${v.versions.hermes_ui.dirty?"*":""} (${v.versions.hermes_ui.date})`:"nicht gefunden",children:[l.jsx("strong",{children:"Hermes UI:"})," ",v.versions.hermes_ui?`${v.versions.hermes_ui.hash}${v.versions.hermes_ui.dirty?"*":""}`:"—"]}),l.jsxs("div",{className:"truncate",title:v.versions.hermes_agent?`${v.versions.hermes_agent.branch}-${v.versions.hermes_agent.hash}${v.versions.hermes_agent.dirty?"*":""} (${v.versions.hermes_agent.date})`:"nicht gefunden",children:[l.jsx("strong",{children:"Hermes Agent:"})," ",v.versions.hermes_agent?`${v.versions.hermes_agent.hash}${v.versions.hermes_agent.dirty?"*":""}`:"—"]})]})]})})]}),l.jsxs("div",{className:"flex min-w-0 flex-1 flex-col",children:[l.jsxs("header",{className:"flex h-14 shrink-0 items-center justify-between border-b border-border/40 px-6 bg-card/20 backdrop-blur-sm",children:[l.jsx("div",{className:"text-xs font-medium text-muted-foreground tracking-wide uppercase font-sans",children:b.hint}),l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(wE,{}),l.jsx("a",{href:"https://git.tobisniceshomelab.ddnsfree.com/Hitonabi/mission-control-v2/src/branch/main/docs/BEDIENUNG.md",target:"_blank",rel:"noopener",className:"flex h-8 items-center rounded-md border border-border/40 bg-background/40 px-2.5 text-xs text-muted-foreground hover:bg-accent hover:text-accent-foreground transition-all cursor-pointer font-semibold",title:"Bedien-Anleitung",children:"Hilfe"}),l.jsxs("button",{onClick:()=>{const A=new KeyboardEvent("keydown",{key:"k",metaKey:!0});document.dispatchEvent(A)},className:"flex items-center gap-2 rounded-md border border-border/40 bg-background/40 px-2.5 py-1.5 text-xs text-muted-foreground hover:bg-accent hover:text-accent-foreground transition-all cursor-pointer",children:[l.jsx(a4,{className:"h-3.5 w-3.5"}),l.jsx("span",{children:"Suchen"}),l.jsx("kbd",{className:"rounded bg-muted px-1.5 py-0.5 font-mono text-[9px]",children:"⌘K"})]})]})]}),l.jsxs("main",{className:"flex-1 overflow-y-auto p-6 scrollbar-thin",children:[e==="dashboard"&&l.jsx(yX,{}),e==="models"&&l.jsx(IX,{}),e==="connect"&&l.jsx(VO,{}),e==="memory"&&l.jsx(qO,{}),e==="agent"&&l.jsx(QO,{}),e==="terminal"&&l.jsx(UX,{}),e==="guide"&&l.jsx(WX,{}),!["dashboard","models","connect","memory","agent","terminal","guide"].includes(e)&&l.jsx(KX,{title:b.label,hint:b.hint})]})]})]})}class eZ extends fy.Component{constructor(){super(...arguments);Qo(this,"state",{error:null})}static getDerivedStateFromError(r){return{error:r}}componentDidCatch(r,n){console.error("Unbehandelter UI-Fehler:",r,n.componentStack)}render(){return this.state.error?l.jsx("div",{className:"min-h-screen flex items-center justify-center bg-neutral-950 text-neutral-200 p-8",children:l.jsxs("div",{className:"max-w-lg space-y-4 text-center",children:[l.jsx("div",{className:"text-2xl",children:"Da ist etwas schiefgelaufen."}),l.jsx("div",{className:"text-sm text-neutral-400 break-all",children:this.state.error.message}),l.jsx("button",{className:"px-4 py-2 rounded-lg bg-neutral-800 hover:bg-neutral-700 border border-neutral-700",onClick:()=>window.location.reload(),children:"Neu laden"})]})}):this.props.children}}const tZ=new O3({defaultOptions:{queries:{retry:1,refetchOnWindowFocus:!1,staleTime:5e3}}});i3.createRoot(document.getElementById("root")).render(l.jsx(fy.StrictMode,{children:l.jsx(eZ,{children:l.jsx(_3,{client:tZ,children:l.jsx(JX,{})})})}));export{Ha as R,cs as S,iv as T,T4 as a,dy as g,l as j,y as r}; diff --git a/frontend/dist/assets/index-CrYzXlx6.js b/frontend/dist/assets/index-CrYzXlx6.js deleted file mode 100644 index 64012d6..0000000 --- a/frontend/dist/assets/index-CrYzXlx6.js +++ /dev/null @@ -1,663 +0,0 @@ -var VM=Object.defineProperty;var q1=e=>{throw TypeError(e)};var qM=(e,t,r)=>t in e?VM(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var is=(e,t,r)=>qM(e,typeof t!="symbol"?t+"":t,r),qp=(e,t,r)=>t.has(e)||q1("Cannot "+r);var L=(e,t,r)=>(qp(e,t,"read from private field"),r?r.call(e):t.get(e)),De=(e,t,r)=>t.has(e)?q1("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,r),ye=(e,t,r,n)=>(qp(e,t,"write to private field"),n?n.call(e,r):t.set(e,r),r),He=(e,t,r)=>(qp(e,t,"access private method"),r);var kd=(e,t,r,n)=>({set _(a){ye(e,t,a,r)},get _(){return L(e,t,n)}});function QM(e,t){for(var r=0;rn[a]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const a of document.querySelectorAll('link[rel="modulepreload"]'))n(a);new MutationObserver(a=>{for(const o of a)if(o.type==="childList")for(const c of o.addedNodes)c.tagName==="LINK"&&c.rel==="modulepreload"&&n(c)}).observe(document,{childList:!0,subtree:!0});function r(a){const o={};return a.integrity&&(o.integrity=a.integrity),a.referrerPolicy&&(o.referrerPolicy=a.referrerPolicy),a.crossOrigin==="use-credentials"?o.credentials="include":a.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(a){if(a.ep)return;a.ep=!0;const o=r(a);fetch(a.href,o)}})();function vy(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Qp={exports:{}},Xl={},Yp={exports:{}},Ue={};/** - * @license React - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Q1;function YM(){if(Q1)return Ue;Q1=1;var e=Symbol.for("react.element"),t=Symbol.for("react.portal"),r=Symbol.for("react.fragment"),n=Symbol.for("react.strict_mode"),a=Symbol.for("react.profiler"),o=Symbol.for("react.provider"),c=Symbol.for("react.context"),u=Symbol.for("react.forward_ref"),f=Symbol.for("react.suspense"),h=Symbol.for("react.memo"),m=Symbol.for("react.lazy"),g=Symbol.iterator;function v(I){return I===null||typeof I!="object"?null:(I=g&&I[g]||I["@@iterator"],typeof I=="function"?I:null)}var b={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},j=Object.assign,k={};function S(I,M,K){this.props=I,this.context=M,this.refs=k,this.updater=K||b}S.prototype.isReactComponent={},S.prototype.setState=function(I,M){if(typeof I!="object"&&typeof I!="function"&&I!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,I,M,"setState")},S.prototype.forceUpdate=function(I){this.updater.enqueueForceUpdate(this,I,"forceUpdate")};function N(){}N.prototype=S.prototype;function E(I,M,K){this.props=I,this.context=M,this.refs=k,this.updater=K||b}var A=E.prototype=new N;A.constructor=E,j(A,S.prototype),A.isPureReactComponent=!0;var P=Array.isArray,_=Object.prototype.hasOwnProperty,O={current:null},D={key:!0,ref:!0,__self:!0,__source:!0};function U(I,M,K){var ne,Z={},me=null,ge=null;if(M!=null)for(ne in M.ref!==void 0&&(ge=M.ref),M.key!==void 0&&(me=""+M.key),M)_.call(M,ne)&&!D.hasOwnProperty(ne)&&(Z[ne]=M[ne]);var Pe=arguments.length-2;if(Pe===1)Z.children=K;else if(1>>1,M=X[I];if(0>>1;Ia(Z,J))mea(ge,Z)?(X[I]=ge,X[me]=J,I=me):(X[I]=Z,X[ne]=J,I=ne);else if(mea(ge,J))X[I]=ge,X[me]=J,I=me;else break e}}return te}function a(X,te){var J=X.sortIndex-te.sortIndex;return J!==0?J:X.id-te.id}if(typeof performance=="object"&&typeof performance.now=="function"){var o=performance;e.unstable_now=function(){return o.now()}}else{var c=Date,u=c.now();e.unstable_now=function(){return c.now()-u}}var f=[],h=[],m=1,g=null,v=3,b=!1,j=!1,k=!1,S=typeof setTimeout=="function"?setTimeout:null,N=typeof clearTimeout=="function"?clearTimeout:null,E=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function A(X){for(var te=r(h);te!==null;){if(te.callback===null)n(h);else if(te.startTime<=X)n(h),te.sortIndex=te.expirationTime,t(f,te);else break;te=r(h)}}function P(X){if(k=!1,A(X),!j)if(r(f)!==null)j=!0,ae(_);else{var te=r(h);te!==null&&se(P,te.startTime-X)}}function _(X,te){j=!1,k&&(k=!1,N(U),U=-1),b=!0;var J=v;try{for(A(te),g=r(f);g!==null&&(!(g.expirationTime>te)||X&&!Y());){var I=g.callback;if(typeof I=="function"){g.callback=null,v=g.priorityLevel;var M=I(g.expirationTime<=te);te=e.unstable_now(),typeof M=="function"?g.callback=M:g===r(f)&&n(f),A(te)}else n(f);g=r(f)}if(g!==null)var K=!0;else{var ne=r(h);ne!==null&&se(P,ne.startTime-te),K=!1}return K}finally{g=null,v=J,b=!1}}var O=!1,D=null,U=-1,B=5,F=-1;function Y(){return!(e.unstable_now()-FX||125I?(X.sortIndex=J,t(h,X),r(f)===null&&X===r(h)&&(k?(N(U),U=-1):k=!0,se(P,J-I))):(X.sortIndex=M,t(f,X),j||b||(j=!0,ae(_))),X},e.unstable_shouldYield=Y,e.unstable_wrapCallback=function(X){var te=v;return function(){var J=v;v=te;try{return X.apply(this,arguments)}finally{v=J}}}})(Jp)),Jp}var ew;function e3(){return ew||(ew=1,Zp.exports=JM()),Zp.exports}/** - * @license React - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var tw;function t3(){if(tw)return Sr;tw=1;var e=tl(),t=e3();function r(i){for(var s="https://reactjs.org/docs/error-decoder.html?invariant="+i,d=1;d"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),f=Object.prototype.hasOwnProperty,h=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,m={},g={};function v(i){return f.call(g,i)?!0:f.call(m,i)?!1:h.test(i)?g[i]=!0:(m[i]=!0,!1)}function b(i,s,d,p){if(d!==null&&d.type===0)return!1;switch(typeof s){case"function":case"symbol":return!0;case"boolean":return p?!1:d!==null?!d.acceptsBooleans:(i=i.toLowerCase().slice(0,5),i!=="data-"&&i!=="aria-");default:return!1}}function j(i,s,d,p){if(s===null||typeof s>"u"||b(i,s,d,p))return!0;if(p)return!1;if(d!==null)switch(d.type){case 3:return!s;case 4:return s===!1;case 5:return isNaN(s);case 6:return isNaN(s)||1>s}return!1}function k(i,s,d,p,x,w,C){this.acceptsBooleans=s===2||s===3||s===4,this.attributeName=p,this.attributeNamespace=x,this.mustUseProperty=d,this.propertyName=i,this.type=s,this.sanitizeURL=w,this.removeEmptyString=C}var S={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(i){S[i]=new k(i,0,!1,i,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(i){var s=i[0];S[s]=new k(s,1,!1,i[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(i){S[i]=new k(i,2,!1,i.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(i){S[i]=new k(i,2,!1,i,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(i){S[i]=new k(i,3,!1,i.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(i){S[i]=new k(i,3,!0,i,null,!1,!1)}),["capture","download"].forEach(function(i){S[i]=new k(i,4,!1,i,null,!1,!1)}),["cols","rows","size","span"].forEach(function(i){S[i]=new k(i,6,!1,i,null,!1,!1)}),["rowSpan","start"].forEach(function(i){S[i]=new k(i,5,!1,i.toLowerCase(),null,!1,!1)});var N=/[\-:]([a-z])/g;function E(i){return i[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(i){var s=i.replace(N,E);S[s]=new k(s,1,!1,i,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(i){var s=i.replace(N,E);S[s]=new k(s,1,!1,i,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(i){var s=i.replace(N,E);S[s]=new k(s,1,!1,i,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(i){S[i]=new k(i,1,!1,i.toLowerCase(),null,!1,!1)}),S.xlinkHref=new k("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(i){S[i]=new k(i,1,!1,i.toLowerCase(),null,!0,!0)});function A(i,s,d,p){var x=S.hasOwnProperty(s)?S[s]:null;(x!==null?x.type!==0:p||!(2T||x[C]!==w[T]){var R=` -`+x[C].replace(" at new "," at ");return i.displayName&&R.includes("")&&(R=R.replace("",i.displayName)),R}while(1<=C&&0<=T);break}}}finally{K=!1,Error.prepareStackTrace=d}return(i=i?i.displayName||i.name:"")?M(i):""}function Z(i){switch(i.tag){case 5:return M(i.type);case 16:return M("Lazy");case 13:return M("Suspense");case 19:return M("SuspenseList");case 0:case 2:case 15:return i=ne(i.type,!1),i;case 11:return i=ne(i.type.render,!1),i;case 1:return i=ne(i.type,!0),i;default:return""}}function me(i){if(i==null)return null;if(typeof i=="function")return i.displayName||i.name||null;if(typeof i=="string")return i;switch(i){case D:return"Fragment";case O:return"Portal";case B:return"Profiler";case U:return"StrictMode";case pe:return"Suspense";case ue:return"SuspenseList"}if(typeof i=="object")switch(i.$$typeof){case Y:return(i.displayName||"Context")+".Consumer";case F:return(i._context.displayName||"Context")+".Provider";case H:var s=i.render;return i=i.displayName,i||(i=s.displayName||s.name||"",i=i!==""?"ForwardRef("+i+")":"ForwardRef"),i;case he:return s=i.displayName||null,s!==null?s:me(i.type)||"Memo";case ae:s=i._payload,i=i._init;try{return me(i(s))}catch{}}return null}function ge(i){var s=i.type;switch(i.tag){case 24:return"Cache";case 9:return(s.displayName||"Context")+".Consumer";case 10:return(s._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return i=s.render,i=i.displayName||i.name||"",s.displayName||(i!==""?"ForwardRef("+i+")":"ForwardRef");case 7:return"Fragment";case 5:return s;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return me(s);case 8:return s===U?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof s=="function")return s.displayName||s.name||null;if(typeof s=="string")return s}return null}function Pe(i){switch(typeof i){case"boolean":case"number":case"string":case"undefined":return i;case"object":return i;default:return""}}function re(i){var s=i.type;return(i=i.nodeName)&&i.toLowerCase()==="input"&&(s==="checkbox"||s==="radio")}function xe(i){var s=re(i)?"checked":"value",d=Object.getOwnPropertyDescriptor(i.constructor.prototype,s),p=""+i[s];if(!i.hasOwnProperty(s)&&typeof d<"u"&&typeof d.get=="function"&&typeof d.set=="function"){var x=d.get,w=d.set;return Object.defineProperty(i,s,{configurable:!0,get:function(){return x.call(this)},set:function(C){p=""+C,w.call(this,C)}}),Object.defineProperty(i,s,{enumerable:d.enumerable}),{getValue:function(){return p},setValue:function(C){p=""+C},stopTracking:function(){i._valueTracker=null,delete i[s]}}}}function _e(i){i._valueTracker||(i._valueTracker=xe(i))}function ie(i){if(!i)return!1;var s=i._valueTracker;if(!s)return!0;var d=s.getValue(),p="";return i&&(p=re(i)?i.checked?"true":"false":i.value),i=p,i!==d?(s.setValue(i),!0):!1}function Je(i){if(i=i||(typeof document<"u"?document:void 0),typeof i>"u")return null;try{return i.activeElement||i.body}catch{return i.body}}function Fe(i,s){var d=s.checked;return J({},s,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:d??i._wrapperState.initialChecked})}function Oe(i,s){var d=s.defaultValue==null?"":s.defaultValue,p=s.checked!=null?s.checked:s.defaultChecked;d=Pe(s.value!=null?s.value:d),i._wrapperState={initialChecked:p,initialValue:d,controlled:s.type==="checkbox"||s.type==="radio"?s.checked!=null:s.value!=null}}function ut(i,s){s=s.checked,s!=null&&A(i,"checked",s,!1)}function Jt(i,s){ut(i,s);var d=Pe(s.value),p=s.type;if(d!=null)p==="number"?(d===0&&i.value===""||i.value!=d)&&(i.value=""+d):i.value!==""+d&&(i.value=""+d);else if(p==="submit"||p==="reset"){i.removeAttribute("value");return}s.hasOwnProperty("value")?ke(i,s.type,d):s.hasOwnProperty("defaultValue")&&ke(i,s.type,Pe(s.defaultValue)),s.checked==null&&s.defaultChecked!=null&&(i.defaultChecked=!!s.defaultChecked)}function W(i,s,d){if(s.hasOwnProperty("value")||s.hasOwnProperty("defaultValue")){var p=s.type;if(!(p!=="submit"&&p!=="reset"||s.value!==void 0&&s.value!==null))return;s=""+i._wrapperState.initialValue,d||s===i.value||(i.value=s),i.defaultValue=s}d=i.name,d!==""&&(i.name=""),i.defaultChecked=!!i._wrapperState.initialChecked,d!==""&&(i.name=d)}function ke(i,s,d){(s!=="number"||Je(i.ownerDocument)!==i)&&(d==null?i.defaultValue=""+i._wrapperState.initialValue:i.defaultValue!==""+d&&(i.defaultValue=""+d))}var Ae=Array.isArray;function Be(i,s,d,p){if(i=i.options,s){s={};for(var x=0;x"+s.valueOf().toString()+"",s=Ii.firstChild;i.firstChild;)i.removeChild(i.firstChild);for(;s.firstChild;)i.appendChild(s.firstChild)}});function Ti(i,s){if(s){var d=i.firstChild;if(d&&d===i.lastChild&&d.nodeType===3){d.nodeValue=s;return}}i.textContent=s}var $={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Le=["Webkit","ms","Moz","O"];Object.keys($).forEach(function(i){Le.forEach(function(s){s=s+i.charAt(0).toUpperCase()+i.substring(1),$[s]=$[i]})});function cr(i,s,d){return s==null||typeof s=="boolean"||s===""?"":d||typeof s!="number"||s===0||$.hasOwnProperty(i)&&$[i]?(""+s).trim():s+"px"}function hc(i,s){i=i.style;for(var d in s)if(s.hasOwnProperty(d)){var p=d.indexOf("--")===0,x=cr(d,s[d],p);d==="float"&&(d="cssFloat"),p?i.setProperty(d,x):i[d]=x}}var mc=J({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function _r(i,s){if(s){if(mc[i]&&(s.children!=null||s.dangerouslySetInnerHTML!=null))throw Error(r(137,i));if(s.dangerouslySetInnerHTML!=null){if(s.children!=null)throw Error(r(60));if(typeof s.dangerouslySetInnerHTML!="object"||!("__html"in s.dangerouslySetInnerHTML))throw Error(r(61))}if(s.style!=null&&typeof s.style!="object")throw Error(r(62))}}function sm(i,s){if(i.indexOf("-")===-1)return typeof s.is=="string";switch(i){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var lm=null;function um(i){return i=i.target||i.srcElement||window,i.correspondingUseElement&&(i=i.correspondingUseElement),i.nodeType===3?i.parentNode:i}var cm=null,To=null,Do=null;function dx(i){if(i=Rl(i)){if(typeof cm!="function")throw Error(r(280));var s=i.stateNode;s&&(s=Lc(s),cm(i.stateNode,i.type,s))}}function fx(i){To?Do?Do.push(i):Do=[i]:To=i}function hx(){if(To){var i=To,s=Do;if(Do=To=null,dx(i),s)for(i=0;i>>=0,i===0?32:31-(u_(i)/c_|0)|0}var xc=64,bc=4194304;function yl(i){switch(i&-i){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: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 i&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return i&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return i}}function wc(i,s){var d=i.pendingLanes;if(d===0)return 0;var p=0,x=i.suspendedLanes,w=i.pingedLanes,C=d&268435455;if(C!==0){var T=C&~x;T!==0?p=yl(T):(w&=C,w!==0&&(p=yl(w)))}else C=d&~x,C!==0?p=yl(C):w!==0&&(p=yl(w));if(p===0)return 0;if(s!==0&&s!==p&&(s&x)===0&&(x=p&-p,w=s&-s,x>=w||x===16&&(w&4194240)!==0))return s;if((p&4)!==0&&(p|=d&16),s=i.entangledLanes,s!==0)for(i=i.entanglements,s&=p;0d;d++)s.push(i);return s}function xl(i,s,d){i.pendingLanes|=s,s!==536870912&&(i.suspendedLanes=0,i.pingedLanes=0),i=i.eventTimes,s=31-un(s),i[s]=d}function m_(i,s){var d=i.pendingLanes&~s;i.pendingLanes=s,i.suspendedLanes=0,i.pingedLanes=0,i.expiredLanes&=s,i.mutableReadLanes&=s,i.entangledLanes&=s,s=i.entanglements;var p=i.eventTimes;for(i=i.expirationTimes;0=Al),Bx=" ",Ux=!1;function Hx(i,s){switch(i){case"keyup":return U_.indexOf(s.keyCode)!==-1;case"keydown":return s.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Wx(i){return i=i.detail,typeof i=="object"&&"data"in i?i.data:null}var $o=!1;function W_(i,s){switch(i){case"compositionend":return Wx(s);case"keypress":return s.which!==32?null:(Ux=!0,Bx);case"textInput":return i=s.data,i===Bx&&Ux?null:i;default:return null}}function K_(i,s){if($o)return i==="compositionend"||!Cm&&Hx(i,s)?(i=Dx(),Ec=km=zi=null,$o=!1,i):null;switch(i){case"paste":return null;case"keypress":if(!(s.ctrlKey||s.altKey||s.metaKey)||s.ctrlKey&&s.altKey){if(s.char&&1=s)return{node:d,offset:s-i};i=p}e:{for(;d;){if(d.nextSibling){d=d.nextSibling;break e}d=d.parentNode}d=void 0}d=Xx(d)}}function Jx(i,s){return i&&s?i===s?!0:i&&i.nodeType===3?!1:s&&s.nodeType===3?Jx(i,s.parentNode):"contains"in i?i.contains(s):i.compareDocumentPosition?!!(i.compareDocumentPosition(s)&16):!1:!1}function eb(){for(var i=window,s=Je();s instanceof i.HTMLIFrameElement;){try{var d=typeof s.contentWindow.location.href=="string"}catch{d=!1}if(d)i=s.contentWindow;else break;s=Je(i.document)}return s}function _m(i){var s=i&&i.nodeName&&i.nodeName.toLowerCase();return s&&(s==="input"&&(i.type==="text"||i.type==="search"||i.type==="tel"||i.type==="url"||i.type==="password")||s==="textarea"||i.contentEditable==="true")}function eM(i){var s=eb(),d=i.focusedElem,p=i.selectionRange;if(s!==d&&d&&d.ownerDocument&&Jx(d.ownerDocument.documentElement,d)){if(p!==null&&_m(d)){if(s=p.start,i=p.end,i===void 0&&(i=s),"selectionStart"in d)d.selectionStart=s,d.selectionEnd=Math.min(i,d.value.length);else if(i=(s=d.ownerDocument||document)&&s.defaultView||window,i.getSelection){i=i.getSelection();var x=d.textContent.length,w=Math.min(p.start,x);p=p.end===void 0?w:Math.min(p.end,x),!i.extend&&w>p&&(x=p,p=w,w=x),x=Zx(d,w);var C=Zx(d,p);x&&C&&(i.rangeCount!==1||i.anchorNode!==x.node||i.anchorOffset!==x.offset||i.focusNode!==C.node||i.focusOffset!==C.offset)&&(s=s.createRange(),s.setStart(x.node,x.offset),i.removeAllRanges(),w>p?(i.addRange(s),i.extend(C.node,C.offset)):(s.setEnd(C.node,C.offset),i.addRange(s)))}}for(s=[],i=d;i=i.parentNode;)i.nodeType===1&&s.push({element:i,left:i.scrollLeft,top:i.scrollTop});for(typeof d.focus=="function"&&d.focus(),d=0;d=document.documentMode,zo=null,Mm=null,_l=null,Im=!1;function tb(i,s,d){var p=d.window===d?d.document:d.nodeType===9?d:d.ownerDocument;Im||zo==null||zo!==Je(p)||(p=zo,"selectionStart"in p&&_m(p)?p={start:p.selectionStart,end:p.selectionEnd}:(p=(p.ownerDocument&&p.ownerDocument.defaultView||window).getSelection(),p={anchorNode:p.anchorNode,anchorOffset:p.anchorOffset,focusNode:p.focusNode,focusOffset:p.focusOffset}),_l&&Ol(_l,p)||(_l=p,p=Tc(Mm,"onSelect"),0Wo||(i.current=Km[Wo],Km[Wo]=null,Wo--)}function rt(i,s){Wo++,Km[Wo]=i.current,i.current=s}var Hi={},er=Ui(Hi),xr=Ui(!1),_a=Hi;function Ko(i,s){var d=i.type.contextTypes;if(!d)return Hi;var p=i.stateNode;if(p&&p.__reactInternalMemoizedUnmaskedChildContext===s)return p.__reactInternalMemoizedMaskedChildContext;var x={},w;for(w in d)x[w]=s[w];return p&&(i=i.stateNode,i.__reactInternalMemoizedUnmaskedChildContext=s,i.__reactInternalMemoizedMaskedChildContext=x),x}function br(i){return i=i.childContextTypes,i!=null}function $c(){at(xr),at(er)}function gb(i,s,d){if(er.current!==Hi)throw Error(r(168));rt(er,s),rt(xr,d)}function vb(i,s,d){var p=i.stateNode;if(s=s.childContextTypes,typeof p.getChildContext!="function")return d;p=p.getChildContext();for(var x in p)if(!(x in s))throw Error(r(108,ge(i)||"Unknown",x));return J({},d,p)}function zc(i){return i=(i=i.stateNode)&&i.__reactInternalMemoizedMergedChildContext||Hi,_a=er.current,rt(er,i),rt(xr,xr.current),!0}function yb(i,s,d){var p=i.stateNode;if(!p)throw Error(r(169));d?(i=vb(i,s,_a),p.__reactInternalMemoizedMergedChildContext=i,at(xr),at(er),rt(er,i)):at(xr),rt(xr,d)}var ti=null,Fc=!1,Gm=!1;function xb(i){ti===null?ti=[i]:ti.push(i)}function fM(i){Fc=!0,xb(i)}function Wi(){if(!Gm&&ti!==null){Gm=!0;var i=0,s=Ze;try{var d=ti;for(Ze=1;i>=C,x-=C,ri=1<<32-un(s)+x|d<Re?(Tt=Te,Te=null):Tt=Te.sibling;var Qe=oe(G,Te,V[Re],fe);if(Qe===null){Te===null&&(Te=Tt);break}i&&Te&&Qe.alternate===null&&s(G,Te),z=w(Qe,z,Re),Ie===null?Ce=Qe:Ie.sibling=Qe,Ie=Qe,Te=Tt}if(Re===V.length)return d(G,Te),ct&&Ia(G,Re),Ce;if(Te===null){for(;ReRe?(Tt=Te,Te=null):Tt=Te.sibling;var Ji=oe(G,Te,Qe.value,fe);if(Ji===null){Te===null&&(Te=Tt);break}i&&Te&&Ji.alternate===null&&s(G,Te),z=w(Ji,z,Re),Ie===null?Ce=Ji:Ie.sibling=Ji,Ie=Ji,Te=Tt}if(Qe.done)return d(G,Te),ct&&Ia(G,Re),Ce;if(Te===null){for(;!Qe.done;Re++,Qe=V.next())Qe=ce(G,Qe.value,fe),Qe!==null&&(z=w(Qe,z,Re),Ie===null?Ce=Qe:Ie.sibling=Qe,Ie=Qe);return ct&&Ia(G,Re),Ce}for(Te=p(G,Te);!Qe.done;Re++,Qe=V.next())Qe=ve(Te,G,Re,Qe.value,fe),Qe!==null&&(i&&Qe.alternate!==null&&Te.delete(Qe.key===null?Re:Qe.key),z=w(Qe,z,Re),Ie===null?Ce=Qe:Ie.sibling=Qe,Ie=Qe);return i&&Te.forEach(function(GM){return s(G,GM)}),ct&&Ia(G,Re),Ce}function wt(G,z,V,fe){if(typeof V=="object"&&V!==null&&V.type===D&&V.key===null&&(V=V.props.children),typeof V=="object"&&V!==null){switch(V.$$typeof){case _:e:{for(var Ce=V.key,Ie=z;Ie!==null;){if(Ie.key===Ce){if(Ce=V.type,Ce===D){if(Ie.tag===7){d(G,Ie.sibling),z=x(Ie,V.props.children),z.return=G,G=z;break e}}else if(Ie.elementType===Ce||typeof Ce=="object"&&Ce!==null&&Ce.$$typeof===ae&&Nb(Ce)===Ie.type){d(G,Ie.sibling),z=x(Ie,V.props),z.ref=Ll(G,Ie,V),z.return=G,G=z;break e}d(G,Ie);break}else s(G,Ie);Ie=Ie.sibling}V.type===D?(z=Ba(V.props.children,G.mode,fe,V.key),z.return=G,G=z):(fe=md(V.type,V.key,V.props,null,G.mode,fe),fe.ref=Ll(G,z,V),fe.return=G,G=fe)}return C(G);case O:e:{for(Ie=V.key;z!==null;){if(z.key===Ie)if(z.tag===4&&z.stateNode.containerInfo===V.containerInfo&&z.stateNode.implementation===V.implementation){d(G,z.sibling),z=x(z,V.children||[]),z.return=G,G=z;break e}else{d(G,z);break}else s(G,z);z=z.sibling}z=Hp(V,G.mode,fe),z.return=G,G=z}return C(G);case ae:return Ie=V._init,wt(G,z,Ie(V._payload),fe)}if(Ae(V))return je(G,z,V,fe);if(te(V))return Ne(G,z,V,fe);Wc(G,V)}return typeof V=="string"&&V!==""||typeof V=="number"?(V=""+V,z!==null&&z.tag===6?(d(G,z.sibling),z=x(z,V),z.return=G,G=z):(d(G,z),z=Up(V,G.mode,fe),z.return=G,G=z),C(G)):d(G,z)}return wt}var Qo=Eb(!0),Ab=Eb(!1),Kc=Ui(null),Gc=null,Yo=null,Zm=null;function Jm(){Zm=Yo=Gc=null}function ep(i){var s=Kc.current;at(Kc),i._currentValue=s}function tp(i,s,d){for(;i!==null;){var p=i.alternate;if((i.childLanes&s)!==s?(i.childLanes|=s,p!==null&&(p.childLanes|=s)):p!==null&&(p.childLanes&s)!==s&&(p.childLanes|=s),i===d)break;i=i.return}}function Xo(i,s){Gc=i,Zm=Yo=null,i=i.dependencies,i!==null&&i.firstContext!==null&&((i.lanes&s)!==0&&(wr=!0),i.firstContext=null)}function Vr(i){var s=i._currentValue;if(Zm!==i)if(i={context:i,memoizedValue:s,next:null},Yo===null){if(Gc===null)throw Error(r(308));Yo=i,Gc.dependencies={lanes:0,firstContext:i}}else Yo=Yo.next=i;return s}var Ta=null;function rp(i){Ta===null?Ta=[i]:Ta.push(i)}function Cb(i,s,d,p){var x=s.interleaved;return x===null?(d.next=d,rp(s)):(d.next=x.next,x.next=d),s.interleaved=d,ii(i,p)}function ii(i,s){i.lanes|=s;var d=i.alternate;for(d!==null&&(d.lanes|=s),d=i,i=i.return;i!==null;)i.childLanes|=s,d=i.alternate,d!==null&&(d.childLanes|=s),d=i,i=i.return;return d.tag===3?d.stateNode:null}var Ki=!1;function np(i){i.updateQueue={baseState:i.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Pb(i,s){i=i.updateQueue,s.updateQueue===i&&(s.updateQueue={baseState:i.baseState,firstBaseUpdate:i.firstBaseUpdate,lastBaseUpdate:i.lastBaseUpdate,shared:i.shared,effects:i.effects})}function ai(i,s){return{eventTime:i,lane:s,tag:0,payload:null,callback:null,next:null}}function Gi(i,s,d){var p=i.updateQueue;if(p===null)return null;if(p=p.shared,(qe&2)!==0){var x=p.pending;return x===null?s.next=s:(s.next=x.next,x.next=s),p.pending=s,ii(i,d)}return x=p.interleaved,x===null?(s.next=s,rp(p)):(s.next=x.next,x.next=s),p.interleaved=s,ii(i,d)}function Vc(i,s,d){if(s=s.updateQueue,s!==null&&(s=s.shared,(d&4194240)!==0)){var p=s.lanes;p&=i.pendingLanes,d|=p,s.lanes=d,vm(i,d)}}function Ob(i,s){var d=i.updateQueue,p=i.alternate;if(p!==null&&(p=p.updateQueue,d===p)){var x=null,w=null;if(d=d.firstBaseUpdate,d!==null){do{var C={eventTime:d.eventTime,lane:d.lane,tag:d.tag,payload:d.payload,callback:d.callback,next:null};w===null?x=w=C:w=w.next=C,d=d.next}while(d!==null);w===null?x=w=s:w=w.next=s}else x=w=s;d={baseState:p.baseState,firstBaseUpdate:x,lastBaseUpdate:w,shared:p.shared,effects:p.effects},i.updateQueue=d;return}i=d.lastBaseUpdate,i===null?d.firstBaseUpdate=s:i.next=s,d.lastBaseUpdate=s}function qc(i,s,d,p){var x=i.updateQueue;Ki=!1;var w=x.firstBaseUpdate,C=x.lastBaseUpdate,T=x.shared.pending;if(T!==null){x.shared.pending=null;var R=T,Q=R.next;R.next=null,C===null?w=Q:C.next=Q,C=R;var le=i.alternate;le!==null&&(le=le.updateQueue,T=le.lastBaseUpdate,T!==C&&(T===null?le.firstBaseUpdate=Q:T.next=Q,le.lastBaseUpdate=R))}if(w!==null){var ce=x.baseState;C=0,le=Q=R=null,T=w;do{var oe=T.lane,ve=T.eventTime;if((p&oe)===oe){le!==null&&(le=le.next={eventTime:ve,lane:0,tag:T.tag,payload:T.payload,callback:T.callback,next:null});e:{var je=i,Ne=T;switch(oe=s,ve=d,Ne.tag){case 1:if(je=Ne.payload,typeof je=="function"){ce=je.call(ve,ce,oe);break e}ce=je;break e;case 3:je.flags=je.flags&-65537|128;case 0:if(je=Ne.payload,oe=typeof je=="function"?je.call(ve,ce,oe):je,oe==null)break e;ce=J({},ce,oe);break e;case 2:Ki=!0}}T.callback!==null&&T.lane!==0&&(i.flags|=64,oe=x.effects,oe===null?x.effects=[T]:oe.push(T))}else ve={eventTime:ve,lane:oe,tag:T.tag,payload:T.payload,callback:T.callback,next:null},le===null?(Q=le=ve,R=ce):le=le.next=ve,C|=oe;if(T=T.next,T===null){if(T=x.shared.pending,T===null)break;oe=T,T=oe.next,oe.next=null,x.lastBaseUpdate=oe,x.shared.pending=null}}while(!0);if(le===null&&(R=ce),x.baseState=R,x.firstBaseUpdate=Q,x.lastBaseUpdate=le,s=x.shared.interleaved,s!==null){x=s;do C|=x.lane,x=x.next;while(x!==s)}else w===null&&(x.shared.lanes=0);La|=C,i.lanes=C,i.memoizedState=ce}}function _b(i,s,d){if(i=s.effects,s.effects=null,i!==null)for(s=0;sd?d:4,i(!0);var p=lp.transition;lp.transition={};try{i(!1),s()}finally{Ze=d,lp.transition=p}}function Yb(){return qr().memoizedState}function gM(i,s,d){var p=Yi(i);if(d={lane:p,action:d,hasEagerState:!1,eagerState:null,next:null},Xb(i))Zb(s,d);else if(d=Cb(i,s,d,p),d!==null){var x=fr();pn(d,i,p,x),Jb(d,s,p)}}function vM(i,s,d){var p=Yi(i),x={lane:p,action:d,hasEagerState:!1,eagerState:null,next:null};if(Xb(i))Zb(s,x);else{var w=i.alternate;if(i.lanes===0&&(w===null||w.lanes===0)&&(w=s.lastRenderedReducer,w!==null))try{var C=s.lastRenderedState,T=w(C,d);if(x.hasEagerState=!0,x.eagerState=T,cn(T,C)){var R=s.interleaved;R===null?(x.next=x,rp(s)):(x.next=R.next,R.next=x),s.interleaved=x;return}}catch{}finally{}d=Cb(i,s,x,p),d!==null&&(x=fr(),pn(d,i,p,x),Jb(d,s,p))}}function Xb(i){var s=i.alternate;return i===pt||s!==null&&s===pt}function Zb(i,s){Bl=Xc=!0;var d=i.pending;d===null?s.next=s:(s.next=d.next,d.next=s),i.pending=s}function Jb(i,s,d){if((d&4194240)!==0){var p=s.lanes;p&=i.pendingLanes,d|=p,s.lanes=d,vm(i,d)}}var ed={readContext:Vr,useCallback:tr,useContext:tr,useEffect:tr,useImperativeHandle:tr,useInsertionEffect:tr,useLayoutEffect:tr,useMemo:tr,useReducer:tr,useRef:tr,useState:tr,useDebugValue:tr,useDeferredValue:tr,useTransition:tr,useMutableSource:tr,useSyncExternalStore:tr,useId:tr,unstable_isNewReconciler:!1},yM={readContext:Vr,useCallback:function(i,s){return Pn().memoizedState=[i,s===void 0?null:s],i},useContext:Vr,useEffect:Ub,useImperativeHandle:function(i,s,d){return d=d!=null?d.concat([i]):null,Zc(4194308,4,Kb.bind(null,s,i),d)},useLayoutEffect:function(i,s){return Zc(4194308,4,i,s)},useInsertionEffect:function(i,s){return Zc(4,2,i,s)},useMemo:function(i,s){var d=Pn();return s=s===void 0?null:s,i=i(),d.memoizedState=[i,s],i},useReducer:function(i,s,d){var p=Pn();return s=d!==void 0?d(s):s,p.memoizedState=p.baseState=s,i={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:i,lastRenderedState:s},p.queue=i,i=i.dispatch=gM.bind(null,pt,i),[p.memoizedState,i]},useRef:function(i){var s=Pn();return i={current:i},s.memoizedState=i},useState:Fb,useDebugValue:pp,useDeferredValue:function(i){return Pn().memoizedState=i},useTransition:function(){var i=Fb(!1),s=i[0];return i=pM.bind(null,i[1]),Pn().memoizedState=i,[s,i]},useMutableSource:function(){},useSyncExternalStore:function(i,s,d){var p=pt,x=Pn();if(ct){if(d===void 0)throw Error(r(407));d=d()}else{if(d=s(),It===null)throw Error(r(349));(Ra&30)!==0||Db(p,s,d)}x.memoizedState=d;var w={value:d,getSnapshot:s};return x.queue=w,Ub(Lb.bind(null,p,w,i),[i]),p.flags|=2048,Wl(9,Rb.bind(null,p,w,d,s),void 0,null),d},useId:function(){var i=Pn(),s=It.identifierPrefix;if(ct){var d=ni,p=ri;d=(p&~(1<<32-un(p)-1)).toString(32)+d,s=":"+s+"R"+d,d=Ul++,0<\/script>",i=i.removeChild(i.firstChild)):typeof p.is=="string"?i=C.createElement(d,{is:p.is}):(i=C.createElement(d),d==="select"&&(C=i,p.multiple?C.multiple=!0:p.size&&(C.size=p.size))):i=C.createElementNS(i,d),i[An]=s,i[Dl]=p,x1(i,s,!1,!1),s.stateNode=i;e:{switch(C=sm(d,p),d){case"dialog":it("cancel",i),it("close",i),x=p;break;case"iframe":case"object":case"embed":it("load",i),x=p;break;case"video":case"audio":for(x=0;xrs&&(s.flags|=128,p=!0,Kl(w,!1),s.lanes=4194304)}else{if(!p)if(i=Qc(C),i!==null){if(s.flags|=128,p=!0,d=i.updateQueue,d!==null&&(s.updateQueue=d,s.flags|=4),Kl(w,!0),w.tail===null&&w.tailMode==="hidden"&&!C.alternate&&!ct)return rr(s),null}else 2*bt()-w.renderingStartTime>rs&&d!==1073741824&&(s.flags|=128,p=!0,Kl(w,!1),s.lanes=4194304);w.isBackwards?(C.sibling=s.child,s.child=C):(d=w.last,d!==null?d.sibling=C:s.child=C,w.last=C)}return w.tail!==null?(s=w.tail,w.rendering=s,w.tail=s.sibling,w.renderingStartTime=bt(),s.sibling=null,d=mt.current,rt(mt,p?d&1|2:d&1),s):(rr(s),null);case 22:case 23:return zp(),p=s.memoizedState!==null,i!==null&&i.memoizedState!==null!==p&&(s.flags|=8192),p&&(s.mode&1)!==0?(Dr&1073741824)!==0&&(rr(s),s.subtreeFlags&6&&(s.flags|=8192)):rr(s),null;case 24:return null;case 25:return null}throw Error(r(156,s.tag))}function EM(i,s){switch(qm(s),s.tag){case 1:return br(s.type)&&$c(),i=s.flags,i&65536?(s.flags=i&-65537|128,s):null;case 3:return Zo(),at(xr),at(er),sp(),i=s.flags,(i&65536)!==0&&(i&128)===0?(s.flags=i&-65537|128,s):null;case 5:return ap(s),null;case 13:if(at(mt),i=s.memoizedState,i!==null&&i.dehydrated!==null){if(s.alternate===null)throw Error(r(340));qo()}return i=s.flags,i&65536?(s.flags=i&-65537|128,s):null;case 19:return at(mt),null;case 4:return Zo(),null;case 10:return ep(s.type._context),null;case 22:case 23:return zp(),null;case 24:return null;default:return null}}var id=!1,nr=!1,AM=typeof WeakSet=="function"?WeakSet:Set,be=null;function es(i,s){var d=i.ref;if(d!==null)if(typeof d=="function")try{d(null)}catch(p){gt(i,s,p)}else d.current=null}function Ap(i,s,d){try{d()}catch(p){gt(i,s,p)}}var k1=!1;function CM(i,s){if(zm=Sc,i=eb(),_m(i)){if("selectionStart"in i)var d={start:i.selectionStart,end:i.selectionEnd};else e:{d=(d=i.ownerDocument)&&d.defaultView||window;var p=d.getSelection&&d.getSelection();if(p&&p.rangeCount!==0){d=p.anchorNode;var x=p.anchorOffset,w=p.focusNode;p=p.focusOffset;try{d.nodeType,w.nodeType}catch{d=null;break e}var C=0,T=-1,R=-1,Q=0,le=0,ce=i,oe=null;t:for(;;){for(var ve;ce!==d||x!==0&&ce.nodeType!==3||(T=C+x),ce!==w||p!==0&&ce.nodeType!==3||(R=C+p),ce.nodeType===3&&(C+=ce.nodeValue.length),(ve=ce.firstChild)!==null;)oe=ce,ce=ve;for(;;){if(ce===i)break t;if(oe===d&&++Q===x&&(T=C),oe===w&&++le===p&&(R=C),(ve=ce.nextSibling)!==null)break;ce=oe,oe=ce.parentNode}ce=ve}d=T===-1||R===-1?null:{start:T,end:R}}else d=null}d=d||{start:0,end:0}}else d=null;for(Fm={focusedElem:i,selectionRange:d},Sc=!1,be=s;be!==null;)if(s=be,i=s.child,(s.subtreeFlags&1028)!==0&&i!==null)i.return=s,be=i;else for(;be!==null;){s=be;try{var je=s.alternate;if((s.flags&1024)!==0)switch(s.tag){case 0:case 11:case 15:break;case 1:if(je!==null){var Ne=je.memoizedProps,wt=je.memoizedState,G=s.stateNode,z=G.getSnapshotBeforeUpdate(s.elementType===s.type?Ne:fn(s.type,Ne),wt);G.__reactInternalSnapshotBeforeUpdate=z}break;case 3:var V=s.stateNode.containerInfo;V.nodeType===1?V.textContent="":V.nodeType===9&&V.documentElement&&V.removeChild(V.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(r(163))}}catch(fe){gt(s,s.return,fe)}if(i=s.sibling,i!==null){i.return=s.return,be=i;break}be=s.return}return je=k1,k1=!1,je}function Gl(i,s,d){var p=s.updateQueue;if(p=p!==null?p.lastEffect:null,p!==null){var x=p=p.next;do{if((x.tag&i)===i){var w=x.destroy;x.destroy=void 0,w!==void 0&&Ap(s,d,w)}x=x.next}while(x!==p)}}function ad(i,s){if(s=s.updateQueue,s=s!==null?s.lastEffect:null,s!==null){var d=s=s.next;do{if((d.tag&i)===i){var p=d.create;d.destroy=p()}d=d.next}while(d!==s)}}function Cp(i){var s=i.ref;if(s!==null){var d=i.stateNode;switch(i.tag){case 5:i=d;break;default:i=d}typeof s=="function"?s(i):s.current=i}}function j1(i){var s=i.alternate;s!==null&&(i.alternate=null,j1(s)),i.child=null,i.deletions=null,i.sibling=null,i.tag===5&&(s=i.stateNode,s!==null&&(delete s[An],delete s[Dl],delete s[Wm],delete s[cM],delete s[dM])),i.stateNode=null,i.return=null,i.dependencies=null,i.memoizedProps=null,i.memoizedState=null,i.pendingProps=null,i.stateNode=null,i.updateQueue=null}function S1(i){return i.tag===5||i.tag===3||i.tag===4}function N1(i){e:for(;;){for(;i.sibling===null;){if(i.return===null||S1(i.return))return null;i=i.return}for(i.sibling.return=i.return,i=i.sibling;i.tag!==5&&i.tag!==6&&i.tag!==18;){if(i.flags&2||i.child===null||i.tag===4)continue e;i.child.return=i,i=i.child}if(!(i.flags&2))return i.stateNode}}function Pp(i,s,d){var p=i.tag;if(p===5||p===6)i=i.stateNode,s?d.nodeType===8?d.parentNode.insertBefore(i,s):d.insertBefore(i,s):(d.nodeType===8?(s=d.parentNode,s.insertBefore(i,d)):(s=d,s.appendChild(i)),d=d._reactRootContainer,d!=null||s.onclick!==null||(s.onclick=Rc));else if(p!==4&&(i=i.child,i!==null))for(Pp(i,s,d),i=i.sibling;i!==null;)Pp(i,s,d),i=i.sibling}function Op(i,s,d){var p=i.tag;if(p===5||p===6)i=i.stateNode,s?d.insertBefore(i,s):d.appendChild(i);else if(p!==4&&(i=i.child,i!==null))for(Op(i,s,d),i=i.sibling;i!==null;)Op(i,s,d),i=i.sibling}var Ht=null,hn=!1;function Vi(i,s,d){for(d=d.child;d!==null;)E1(i,s,d),d=d.sibling}function E1(i,s,d){if(En&&typeof En.onCommitFiberUnmount=="function")try{En.onCommitFiberUnmount(yc,d)}catch{}switch(d.tag){case 5:nr||es(d,s);case 6:var p=Ht,x=hn;Ht=null,Vi(i,s,d),Ht=p,hn=x,Ht!==null&&(hn?(i=Ht,d=d.stateNode,i.nodeType===8?i.parentNode.removeChild(d):i.removeChild(d)):Ht.removeChild(d.stateNode));break;case 18:Ht!==null&&(hn?(i=Ht,d=d.stateNode,i.nodeType===8?Hm(i.parentNode,d):i.nodeType===1&&Hm(i,d),Sl(i)):Hm(Ht,d.stateNode));break;case 4:p=Ht,x=hn,Ht=d.stateNode.containerInfo,hn=!0,Vi(i,s,d),Ht=p,hn=x;break;case 0:case 11:case 14:case 15:if(!nr&&(p=d.updateQueue,p!==null&&(p=p.lastEffect,p!==null))){x=p=p.next;do{var w=x,C=w.destroy;w=w.tag,C!==void 0&&((w&2)!==0||(w&4)!==0)&&Ap(d,s,C),x=x.next}while(x!==p)}Vi(i,s,d);break;case 1:if(!nr&&(es(d,s),p=d.stateNode,typeof p.componentWillUnmount=="function"))try{p.props=d.memoizedProps,p.state=d.memoizedState,p.componentWillUnmount()}catch(T){gt(d,s,T)}Vi(i,s,d);break;case 21:Vi(i,s,d);break;case 22:d.mode&1?(nr=(p=nr)||d.memoizedState!==null,Vi(i,s,d),nr=p):Vi(i,s,d);break;default:Vi(i,s,d)}}function A1(i){var s=i.updateQueue;if(s!==null){i.updateQueue=null;var d=i.stateNode;d===null&&(d=i.stateNode=new AM),s.forEach(function(p){var x=LM.bind(null,i,p);d.has(p)||(d.add(p),p.then(x,x))})}}function mn(i,s){var d=s.deletions;if(d!==null)for(var p=0;px&&(x=C),p&=~w}if(p=x,p=bt()-p,p=(120>p?120:480>p?480:1080>p?1080:1920>p?1920:3e3>p?3e3:4320>p?4320:1960*OM(p/1960))-p,10i?16:i,Qi===null)var p=!1;else{if(i=Qi,Qi=null,cd=0,(qe&6)!==0)throw Error(r(331));var x=qe;for(qe|=4,be=i.current;be!==null;){var w=be,C=w.child;if((be.flags&16)!==0){var T=w.deletions;if(T!==null){for(var R=0;Rbt()-Ip?za(i,0):Mp|=d),jr(i,s)}function F1(i,s){s===0&&((i.mode&1)===0?s=1:(s=bc,bc<<=1,(bc&130023424)===0&&(bc=4194304)));var d=fr();i=ii(i,s),i!==null&&(xl(i,s,d),jr(i,d))}function RM(i){var s=i.memoizedState,d=0;s!==null&&(d=s.retryLane),F1(i,d)}function LM(i,s){var d=0;switch(i.tag){case 13:var p=i.stateNode,x=i.memoizedState;x!==null&&(d=x.retryLane);break;case 19:p=i.stateNode;break;default:throw Error(r(314))}p!==null&&p.delete(s),F1(i,d)}var B1;B1=function(i,s,d){if(i!==null)if(i.memoizedProps!==s.pendingProps||xr.current)wr=!0;else{if((i.lanes&d)===0&&(s.flags&128)===0)return wr=!1,SM(i,s,d);wr=(i.flags&131072)!==0}else wr=!1,ct&&(s.flags&1048576)!==0&&bb(s,Uc,s.index);switch(s.lanes=0,s.tag){case 2:var p=s.type;nd(i,s),i=s.pendingProps;var x=Ko(s,er.current);Xo(s,d),x=cp(null,s,p,i,x,d);var w=dp();return s.flags|=1,typeof x=="object"&&x!==null&&typeof x.render=="function"&&x.$$typeof===void 0?(s.tag=1,s.memoizedState=null,s.updateQueue=null,br(p)?(w=!0,zc(s)):w=!1,s.memoizedState=x.state!==null&&x.state!==void 0?x.state:null,np(s),x.updater=td,s.stateNode=x,x._reactInternals=s,vp(s,p,i,d),s=wp(null,s,p,!0,w,d)):(s.tag=0,ct&&w&&Vm(s),dr(null,s,x,d),s=s.child),s;case 16:p=s.elementType;e:{switch(nd(i,s),i=s.pendingProps,x=p._init,p=x(p._payload),s.type=p,x=s.tag=zM(p),i=fn(p,i),x){case 0:s=bp(null,s,p,i,d);break e;case 1:s=h1(null,s,p,i,d);break e;case 11:s=l1(null,s,p,i,d);break e;case 14:s=u1(null,s,p,fn(p.type,i),d);break e}throw Error(r(306,p,""))}return s;case 0:return p=s.type,x=s.pendingProps,x=s.elementType===p?x:fn(p,x),bp(i,s,p,x,d);case 1:return p=s.type,x=s.pendingProps,x=s.elementType===p?x:fn(p,x),h1(i,s,p,x,d);case 3:e:{if(m1(s),i===null)throw Error(r(387));p=s.pendingProps,w=s.memoizedState,x=w.element,Pb(i,s),qc(s,p,null,d);var C=s.memoizedState;if(p=C.element,w.isDehydrated)if(w={element:p,isDehydrated:!1,cache:C.cache,pendingSuspenseBoundaries:C.pendingSuspenseBoundaries,transitions:C.transitions},s.updateQueue.baseState=w,s.memoizedState=w,s.flags&256){x=Jo(Error(r(423)),s),s=p1(i,s,p,d,x);break e}else if(p!==x){x=Jo(Error(r(424)),s),s=p1(i,s,p,d,x);break e}else for(Tr=Bi(s.stateNode.containerInfo.firstChild),Ir=s,ct=!0,dn=null,d=Ab(s,null,p,d),s.child=d;d;)d.flags=d.flags&-3|4096,d=d.sibling;else{if(qo(),p===x){s=oi(i,s,d);break e}dr(i,s,p,d)}s=s.child}return s;case 5:return Mb(s),i===null&&Ym(s),p=s.type,x=s.pendingProps,w=i!==null?i.memoizedProps:null,C=x.children,Bm(p,x)?C=null:w!==null&&Bm(p,w)&&(s.flags|=32),f1(i,s),dr(i,s,C,d),s.child;case 6:return i===null&&Ym(s),null;case 13:return g1(i,s,d);case 4:return ip(s,s.stateNode.containerInfo),p=s.pendingProps,i===null?s.child=Qo(s,null,p,d):dr(i,s,p,d),s.child;case 11:return p=s.type,x=s.pendingProps,x=s.elementType===p?x:fn(p,x),l1(i,s,p,x,d);case 7:return dr(i,s,s.pendingProps,d),s.child;case 8:return dr(i,s,s.pendingProps.children,d),s.child;case 12:return dr(i,s,s.pendingProps.children,d),s.child;case 10:e:{if(p=s.type._context,x=s.pendingProps,w=s.memoizedProps,C=x.value,rt(Kc,p._currentValue),p._currentValue=C,w!==null)if(cn(w.value,C)){if(w.children===x.children&&!xr.current){s=oi(i,s,d);break e}}else for(w=s.child,w!==null&&(w.return=s);w!==null;){var T=w.dependencies;if(T!==null){C=w.child;for(var R=T.firstContext;R!==null;){if(R.context===p){if(w.tag===1){R=ai(-1,d&-d),R.tag=2;var Q=w.updateQueue;if(Q!==null){Q=Q.shared;var le=Q.pending;le===null?R.next=R:(R.next=le.next,le.next=R),Q.pending=R}}w.lanes|=d,R=w.alternate,R!==null&&(R.lanes|=d),tp(w.return,d,s),T.lanes|=d;break}R=R.next}}else if(w.tag===10)C=w.type===s.type?null:w.child;else if(w.tag===18){if(C=w.return,C===null)throw Error(r(341));C.lanes|=d,T=C.alternate,T!==null&&(T.lanes|=d),tp(C,d,s),C=w.sibling}else C=w.child;if(C!==null)C.return=w;else for(C=w;C!==null;){if(C===s){C=null;break}if(w=C.sibling,w!==null){w.return=C.return,C=w;break}C=C.return}w=C}dr(i,s,x.children,d),s=s.child}return s;case 9:return x=s.type,p=s.pendingProps.children,Xo(s,d),x=Vr(x),p=p(x),s.flags|=1,dr(i,s,p,d),s.child;case 14:return p=s.type,x=fn(p,s.pendingProps),x=fn(p.type,x),u1(i,s,p,x,d);case 15:return c1(i,s,s.type,s.pendingProps,d);case 17:return p=s.type,x=s.pendingProps,x=s.elementType===p?x:fn(p,x),nd(i,s),s.tag=1,br(p)?(i=!0,zc(s)):i=!1,Xo(s,d),t1(s,p,x),vp(s,p,x,d),wp(null,s,p,!0,i,d);case 19:return y1(i,s,d);case 22:return d1(i,s,d)}throw Error(r(156,s.tag))};function U1(i,s){return wx(i,s)}function $M(i,s,d,p){this.tag=i,this.key=d,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=s,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=p,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Yr(i,s,d,p){return new $M(i,s,d,p)}function Bp(i){return i=i.prototype,!(!i||!i.isReactComponent)}function zM(i){if(typeof i=="function")return Bp(i)?1:0;if(i!=null){if(i=i.$$typeof,i===H)return 11;if(i===he)return 14}return 2}function Zi(i,s){var d=i.alternate;return d===null?(d=Yr(i.tag,s,i.key,i.mode),d.elementType=i.elementType,d.type=i.type,d.stateNode=i.stateNode,d.alternate=i,i.alternate=d):(d.pendingProps=s,d.type=i.type,d.flags=0,d.subtreeFlags=0,d.deletions=null),d.flags=i.flags&14680064,d.childLanes=i.childLanes,d.lanes=i.lanes,d.child=i.child,d.memoizedProps=i.memoizedProps,d.memoizedState=i.memoizedState,d.updateQueue=i.updateQueue,s=i.dependencies,d.dependencies=s===null?null:{lanes:s.lanes,firstContext:s.firstContext},d.sibling=i.sibling,d.index=i.index,d.ref=i.ref,d}function md(i,s,d,p,x,w){var C=2;if(p=i,typeof i=="function")Bp(i)&&(C=1);else if(typeof i=="string")C=5;else e:switch(i){case D:return Ba(d.children,x,w,s);case U:C=8,x|=8;break;case B:return i=Yr(12,d,s,x|2),i.elementType=B,i.lanes=w,i;case pe:return i=Yr(13,d,s,x),i.elementType=pe,i.lanes=w,i;case ue:return i=Yr(19,d,s,x),i.elementType=ue,i.lanes=w,i;case se:return pd(d,x,w,s);default:if(typeof i=="object"&&i!==null)switch(i.$$typeof){case F:C=10;break e;case Y:C=9;break e;case H:C=11;break e;case he:C=14;break e;case ae:C=16,p=null;break e}throw Error(r(130,i==null?i:typeof i,""))}return s=Yr(C,d,s,x),s.elementType=i,s.type=p,s.lanes=w,s}function Ba(i,s,d,p){return i=Yr(7,i,p,s),i.lanes=d,i}function pd(i,s,d,p){return i=Yr(22,i,p,s),i.elementType=se,i.lanes=d,i.stateNode={isHidden:!1},i}function Up(i,s,d){return i=Yr(6,i,null,s),i.lanes=d,i}function Hp(i,s,d){return s=Yr(4,i.children!==null?i.children:[],i.key,s),s.lanes=d,s.stateNode={containerInfo:i.containerInfo,pendingChildren:null,implementation:i.implementation},s}function FM(i,s,d,p,x){this.tag=s,this.containerInfo=i,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=gm(0),this.expirationTimes=gm(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=gm(0),this.identifierPrefix=p,this.onRecoverableError=x,this.mutableSourceEagerHydrationData=null}function Wp(i,s,d,p,x,w,C,T,R){return i=new FM(i,s,d,T,R),s===1?(s=1,w===!0&&(s|=8)):s=0,w=Yr(3,null,null,s),i.current=w,w.stateNode=i,w.memoizedState={element:p,isDehydrated:d,cache:null,transitions:null,pendingSuspenseBoundaries:null},np(w),i}function BM(i,s,d){var p=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}return e(),Xp.exports=t3(),Xp.exports}var nw;function r3(){if(nw)return jd;nw=1;var e=hN();return jd.createRoot=e.createRoot,jd.hydrateRoot=e.hydrateRoot,jd}var n3=r3();const i3=vy(n3);var qu=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},ao,ua,Cs,nN,a3=(nN=class extends qu{constructor(){super();De(this,ao);De(this,ua);De(this,Cs);ye(this,Cs,t=>{if(typeof window<"u"&&window.addEventListener){const r=()=>t();return window.addEventListener("visibilitychange",r,!1),()=>{window.removeEventListener("visibilitychange",r)}}})}onSubscribe(){L(this,ua)||this.setEventListener(L(this,Cs))}onUnsubscribe(){var t;this.hasListeners()||((t=L(this,ua))==null||t.call(this),ye(this,ua,void 0))}setEventListener(t){var r;ye(this,Cs,t),(r=L(this,ua))==null||r.call(this),ye(this,ua,t(n=>{typeof n=="boolean"?this.setFocused(n):this.onFocus()}))}setFocused(t){L(this,ao)!==t&&(ye(this,ao,t),this.onFocus())}onFocus(){const t=this.isFocused();this.listeners.forEach(r=>{r(t)})}isFocused(){var t;return typeof L(this,ao)=="boolean"?L(this,ao):((t=globalThis.document)==null?void 0:t.visibilityState)!=="hidden"}},ao=new WeakMap,ua=new WeakMap,Cs=new WeakMap,nN),xy=new a3,o3={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e),setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)},ca,gy,iN,s3=(iN=class{constructor(){De(this,ca,o3);De(this,gy,!1)}setTimeoutProvider(e){ye(this,ca,e)}setTimeout(e,t){return L(this,ca).setTimeout(e,t)}clearTimeout(e){L(this,ca).clearTimeout(e)}setInterval(e,t){return L(this,ca).setInterval(e,t)}clearInterval(e){L(this,ca).clearInterval(e)}},ca=new WeakMap,gy=new WeakMap,iN),Za=new s3;function l3(e){setTimeout(e,0)}var u3=typeof window>"u"||"Deno"in globalThis;function Er(){}function c3(e,t){return typeof e=="function"?e(t):e}function Vg(e){return typeof e=="number"&&e>=0&&e!==1/0}function mN(e,t){return Math.max(e+(t||0)-Date.now(),0)}function ya(e,t){return typeof e=="function"?e(t):e}function zr(e,t){return typeof e=="function"?e(t):e}function iw(e,t){const{type:r="all",exact:n,fetchStatus:a,predicate:o,queryKey:c,stale:u}=e;if(c){if(n){if(t.queryHash!==by(c,t.options))return!1}else if(!ju(t.queryKey,c))return!1}if(r!=="all"){const f=t.isActive();if(r==="active"&&!f||r==="inactive"&&f)return!1}return!(typeof u=="boolean"&&t.isStale()!==u||a&&a!==t.state.fetchStatus||o&&!o(t))}function aw(e,t){const{exact:r,status:n,predicate:a,mutationKey:o}=e;if(o){if(!t.options.mutationKey)return!1;if(r){if(ku(t.options.mutationKey)!==ku(o))return!1}else if(!ju(t.options.mutationKey,o))return!1}return!(n&&t.state.status!==n||a&&!a(t))}function by(e,t){return((t==null?void 0:t.queryKeyHashFn)||ku)(e)}function ku(e){return JSON.stringify(e,(t,r)=>Qg(r)?Object.keys(r).sort().reduce((n,a)=>(n[a]=r[a],n),{}):r)}function ju(e,t){return e===t?!0:typeof e!=typeof t?!1:e&&t&&typeof e=="object"&&typeof t=="object"?Object.keys(t).every(r=>ju(e[r],t[r])):!1}var d3=Object.prototype.hasOwnProperty;function pN(e,t,r=0){if(e===t)return e;if(r>500)return t;const n=ow(e)&&ow(t);if(!n&&!(Qg(e)&&Qg(t)))return t;const o=(n?e:Object.keys(e)).length,c=n?t:Object.keys(t),u=c.length,f=n?new Array(u):{};let h=0;for(let m=0;m{Za.setTimeout(t,e)})}function Yg(e,t,r){return typeof r.structuralSharing=="function"?r.structuralSharing(e,t):r.structuralSharing!==!1?pN(e,t):t}function h3(e,t,r=0){const n=[...e,t];return r&&n.length>r?n.slice(1):n}function m3(e,t,r=0){const n=[t,...e];return r&&n.length>r?n.slice(0,-1):n}var wy=Symbol();function gN(e,t){return!e.queryFn&&(t!=null&&t.initialPromise)?()=>t.initialPromise:!e.queryFn||e.queryFn===wy?()=>Promise.reject(new Error(`Missing queryFn: '${e.queryHash}'`)):e.queryFn}function vN(e,t){return typeof e=="function"?e(...t):!!e}function p3(e,t,r){let n=!1,a;return Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(a??(a=t()),n||(n=!0,a.aborted?r():a.addEventListener("abort",r,{once:!0})),a)}),e}var Su=(()=>{let e=()=>u3;return{isServer(){return e()},setIsServer(t){e=t}}})();function Xg(){let e,t;const r=new Promise((a,o)=>{e=a,t=o});r.status="pending",r.catch(()=>{});function n(a){Object.assign(r,a),delete r.resolve,delete r.reject}return r.resolve=a=>{n({status:"fulfilled",value:a}),e(a)},r.reject=a=>{n({status:"rejected",reason:a}),t(a)},r}var g3=l3;function v3(){let e=[],t=0,r=u=>{u()},n=u=>{u()},a=g3;const o=u=>{t?e.push(u):a(()=>{r(u)})},c=()=>{const u=e;e=[],u.length&&a(()=>{n(()=>{u.forEach(f=>{r(f)})})})};return{batch:u=>{let f;t++;try{f=u()}finally{t--,t||c()}return f},batchCalls:u=>(...f)=>{o(()=>{u(...f)})},schedule:o,setNotifyFunction:u=>{r=u},setBatchNotifyFunction:u=>{n=u},setScheduler:u=>{a=u}}}var qt=v3(),Ps,da,Os,aN,y3=(aN=class extends qu{constructor(){super();De(this,Ps,!0);De(this,da);De(this,Os);ye(this,Os,t=>{if(typeof window<"u"&&window.addEventListener){const r=()=>t(!0),n=()=>t(!1);return window.addEventListener("online",r,!1),window.addEventListener("offline",n,!1),()=>{window.removeEventListener("online",r),window.removeEventListener("offline",n)}}})}onSubscribe(){L(this,da)||this.setEventListener(L(this,Os))}onUnsubscribe(){var t;this.hasListeners()||((t=L(this,da))==null||t.call(this),ye(this,da,void 0))}setEventListener(t){var r;ye(this,Os,t),(r=L(this,da))==null||r.call(this),ye(this,da,t(this.setOnline.bind(this)))}setOnline(t){L(this,Ps)!==t&&(ye(this,Ps,t),this.listeners.forEach(n=>{n(t)}))}isOnline(){return L(this,Ps)}},Ps=new WeakMap,da=new WeakMap,Os=new WeakMap,aN),of=new y3;function x3(e){return Math.min(1e3*2**e,3e4)}function yN(e){return(e??"online")==="online"?of.isOnline():!0}var Zg=class extends Error{constructor(e){super("CancelledError"),this.revert=e==null?void 0:e.revert,this.silent=e==null?void 0:e.silent}};function xN(e){let t=!1,r=0,n;const a=Xg(),o=()=>a.status!=="pending",c=k=>{var S;if(!o()){const N=new Zg(k);v(N),(S=e.onCancel)==null||S.call(e,N)}},u=()=>{t=!0},f=()=>{t=!1},h=()=>xy.isFocused()&&(e.networkMode==="always"||of.isOnline())&&e.canRun(),m=()=>yN(e.networkMode)&&e.canRun(),g=k=>{o()||(n==null||n(),a.resolve(k))},v=k=>{o()||(n==null||n(),a.reject(k))},b=()=>new Promise(k=>{var S;n=N=>{(o()||h())&&k(N)},(S=e.onPause)==null||S.call(e)}).then(()=>{var k;n=void 0,o()||(k=e.onContinue)==null||k.call(e)}),j=()=>{if(o())return;let k;const S=r===0?e.initialPromise:void 0;try{k=S??e.fn()}catch(N){k=Promise.reject(N)}Promise.resolve(k).then(g).catch(N=>{var O;if(o())return;const E=e.retry??(Su.isServer()?0:3),A=e.retryDelay??x3,P=typeof A=="function"?A(r,N):A,_=E===!0||typeof E=="number"&&rh()?void 0:b()).then(()=>{t?v(N):j()})})};return{promise:a,status:()=>a.status,cancel:c,continue:()=>(n==null||n(),a),cancelRetry:u,continueRetry:f,canStart:m,start:()=>(m()?j():b().then(j),a)}}var oo,oN,bN=(oN=class{constructor(){De(this,oo)}destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),Vg(this.gcTime)&&ye(this,oo,Za.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(Su.isServer()?1/0:300*1e3))}clearGcTimeout(){L(this,oo)!==void 0&&(Za.clearTimeout(L(this,oo)),ye(this,oo,void 0))}},oo=new WeakMap,oN);function b3(e){return{onFetch:(t,r)=>{var m,g,v,b,j;const n=t.options,a=(v=(g=(m=t.fetchOptions)==null?void 0:m.meta)==null?void 0:g.fetchMore)==null?void 0:v.direction,o=((b=t.state.data)==null?void 0:b.pages)||[],c=((j=t.state.data)==null?void 0:j.pageParams)||[];let u={pages:[],pageParams:[]},f=0;const h=async()=>{let k=!1;const S=A=>{p3(A,()=>t.signal,()=>k=!0)},N=gN(t.options,t.fetchOptions),E=async(A,P,_)=>{if(k)return Promise.reject(t.signal.reason);if(P==null&&A.pages.length)return Promise.resolve(A);const D=(()=>{const Y={client:t.client,queryKey:t.queryKey,pageParam:P,direction:_?"backward":"forward",meta:t.options.meta};return S(Y),Y})(),U=await N(D),{maxPages:B}=t.options,F=_?m3:h3;return{pages:F(A.pages,U,B),pageParams:F(A.pageParams,P,B)}};if(a&&o.length){const A=a==="backward",P=A?w3:lw,_={pages:o,pageParams:c},O=P(n,_);u=await E(_,O,A)}else{const A=e??o.length;do{const P=f===0?c[0]??n.initialPageParam:lw(n,u);if(f>0&&P==null)break;u=await E(u,P),f++}while(f{var k,S;return(S=(k=t.options).persister)==null?void 0:S.call(k,h,{client:t.client,queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},r)}:t.fetchFn=h}}}function lw(e,{pages:t,pageParams:r}){const n=t.length-1;return t.length>0?e.getNextPageParam(t[n],t,r[n],r):void 0}function w3(e,{pages:t,pageParams:r}){var n;return t.length>0?(n=e.getPreviousPageParam)==null?void 0:n.call(e,t[0],t,r[0],r):void 0}var _s,so,Ms,Zr,lo,Dt,Hu,uo,$r,wN,ui,sN,k3=(sN=class extends bN{constructor(t){super();De(this,$r);De(this,_s);De(this,so);De(this,Ms);De(this,Zr);De(this,lo);De(this,Dt);De(this,Hu);De(this,uo);ye(this,uo,!1),ye(this,Hu,t.defaultOptions),this.setOptions(t.options),this.observers=[],ye(this,lo,t.client),ye(this,Zr,L(this,lo).getQueryCache()),this.queryKey=t.queryKey,this.queryHash=t.queryHash,ye(this,so,cw(this.options)),this.state=t.state??L(this,so),this.scheduleGc()}get meta(){return this.options.meta}get queryType(){return L(this,_s)}get promise(){var t;return(t=L(this,Dt))==null?void 0:t.promise}setOptions(t){if(this.options={...L(this,Hu),...t},t!=null&&t._type&&ye(this,_s,t._type),this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){const r=cw(this.options);r.data!==void 0&&(this.setState(uw(r.data,r.dataUpdatedAt)),ye(this,so,r))}}optionalRemove(){!this.observers.length&&this.state.fetchStatus==="idle"&&L(this,Zr).remove(this)}setData(t,r){const n=Yg(this.state.data,t,this.options);return He(this,$r,ui).call(this,{data:n,type:"success",dataUpdatedAt:r==null?void 0:r.updatedAt,manual:r==null?void 0:r.manual}),n}setState(t){He(this,$r,ui).call(this,{type:"setState",state:t})}cancel(t){var n,a;const r=(n=L(this,Dt))==null?void 0:n.promise;return(a=L(this,Dt))==null||a.cancel(t),r?r.then(Er).catch(Er):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return L(this,so)}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(t=>zr(t.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===wy||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0?this.observers.some(t=>ya(t.options.staleTime,this)==="static"):!1}isStale(){return this.getObserversCount()>0?this.observers.some(t=>t.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(t=0){return this.state.data===void 0?!0:t==="static"?!1:this.state.isInvalidated?!0:!mN(this.state.dataUpdatedAt,t)}onFocus(){var r;const t=this.observers.find(n=>n.shouldFetchOnWindowFocus());t==null||t.refetch({cancelRefetch:!1}),(r=L(this,Dt))==null||r.continue()}onOnline(){var r;const t=this.observers.find(n=>n.shouldFetchOnReconnect());t==null||t.refetch({cancelRefetch:!1}),(r=L(this,Dt))==null||r.continue()}addObserver(t){this.observers.includes(t)||(this.observers.push(t),this.clearGcTimeout(),L(this,Zr).notify({type:"observerAdded",query:this,observer:t}))}removeObserver(t){this.observers.includes(t)&&(this.observers=this.observers.filter(r=>r!==t),this.observers.length||(L(this,Dt)&&(L(this,uo)||He(this,$r,wN).call(this)?L(this,Dt).cancel({revert:!0}):L(this,Dt).cancelRetry()),this.scheduleGc()),L(this,Zr).notify({type:"observerRemoved",query:this,observer:t}))}getObserversCount(){return this.observers.length}invalidate(){this.state.isInvalidated||He(this,$r,ui).call(this,{type:"invalidate"})}async fetch(t,r){var h,m,g,v,b,j,k,S,N,E,A;if(this.state.fetchStatus!=="idle"&&((h=L(this,Dt))==null?void 0:h.status())!=="rejected"){if(this.state.data!==void 0&&(r!=null&&r.cancelRefetch))this.cancel({silent:!0});else if(L(this,Dt))return L(this,Dt).continueRetry(),L(this,Dt).promise}if(t&&this.setOptions(t),!this.options.queryFn){const P=this.observers.find(_=>_.options.queryFn);P&&this.setOptions(P.options)}const n=new AbortController,a=P=>{Object.defineProperty(P,"signal",{enumerable:!0,get:()=>(ye(this,uo,!0),n.signal)})},o=()=>{const P=gN(this.options,r),O=(()=>{const D={client:L(this,lo),queryKey:this.queryKey,meta:this.meta};return a(D),D})();return ye(this,uo,!1),this.options.persister?this.options.persister(P,O,this):P(O)},u=(()=>{const P={fetchOptions:r,options:this.options,queryKey:this.queryKey,client:L(this,lo),state:this.state,fetchFn:o};return a(P),P})(),f=L(this,_s)==="infinite"?b3(this.options.pages):this.options.behavior;f==null||f.onFetch(u,this),ye(this,Ms,this.state),(this.state.fetchStatus==="idle"||this.state.fetchMeta!==((m=u.fetchOptions)==null?void 0:m.meta))&&He(this,$r,ui).call(this,{type:"fetch",meta:(g=u.fetchOptions)==null?void 0:g.meta}),ye(this,Dt,xN({initialPromise:r==null?void 0:r.initialPromise,fn:u.fetchFn,onCancel:P=>{P instanceof Zg&&P.revert&&this.setState({...L(this,Ms),fetchStatus:"idle"}),n.abort()},onFail:(P,_)=>{He(this,$r,ui).call(this,{type:"failed",failureCount:P,error:_})},onPause:()=>{He(this,$r,ui).call(this,{type:"pause"})},onContinue:()=>{He(this,$r,ui).call(this,{type:"continue"})},retry:u.options.retry,retryDelay:u.options.retryDelay,networkMode:u.options.networkMode,canRun:()=>!0}));try{const P=await L(this,Dt).start();if(P===void 0)throw new Error(`${this.queryHash} data is undefined`);return this.setData(P),(b=(v=L(this,Zr).config).onSuccess)==null||b.call(v,P,this),(k=(j=L(this,Zr).config).onSettled)==null||k.call(j,P,this.state.error,this),P}catch(P){if(P instanceof Zg){if(P.silent)return L(this,Dt).promise;if(P.revert){if(this.state.data===void 0)throw P;return this.state.data}}throw He(this,$r,ui).call(this,{type:"error",error:P}),(N=(S=L(this,Zr).config).onError)==null||N.call(S,P,this),(A=(E=L(this,Zr).config).onSettled)==null||A.call(E,this.state.data,P,this),P}finally{this.scheduleGc()}}},_s=new WeakMap,so=new WeakMap,Ms=new WeakMap,Zr=new WeakMap,lo=new WeakMap,Dt=new WeakMap,Hu=new WeakMap,uo=new WeakMap,$r=new WeakSet,wN=function(){return this.state.fetchStatus==="paused"&&this.state.status==="pending"},ui=function(t){const r=n=>{switch(t.type){case"failed":return{...n,fetchFailureCount:t.failureCount,fetchFailureReason:t.error};case"pause":return{...n,fetchStatus:"paused"};case"continue":return{...n,fetchStatus:"fetching"};case"fetch":return{...n,...kN(n.data,this.options),fetchMeta:t.meta??null};case"success":const a={...n,...uw(t.data,t.dataUpdatedAt),dataUpdateCount:n.dataUpdateCount+1,...!t.manual&&{fetchStatus:"idle",fetchFailureCount:0,fetchFailureReason:null}};return ye(this,Ms,t.manual?a:void 0),a;case"error":const o=t.error;return{...n,error:o,errorUpdateCount:n.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:n.fetchFailureCount+1,fetchFailureReason:o,fetchStatus:"idle",status:"error",isInvalidated:!0};case"invalidate":return{...n,isInvalidated:!0};case"setState":return{...n,...t.state}}};this.state=r(this.state),qt.batch(()=>{this.observers.forEach(n=>{n.onQueryUpdate()}),L(this,Zr).notify({query:this,type:"updated",action:t})})},sN);function kN(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:yN(t.networkMode)?"fetching":"paused",...e===void 0&&{error:null,status:"pending"}}}function uw(e,t){return{data:e,dataUpdatedAt:t??Date.now(),error:null,isInvalidated:!1,status:"success"}}function cw(e){const t=typeof e.initialData=="function"?e.initialData():e.initialData,r=t!==void 0,n=r?typeof e.initialDataUpdatedAt=="function"?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:r?n??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:r?"success":"pending",fetchStatus:"idle"}}var Nr,Ke,Wu,hr,co,Is,di,fa,Ku,Ts,Ds,fo,ho,ha,Rs,Xe,hu,Jg,ev,tv,rv,nv,iv,av,jN,lN,j3=(lN=class extends qu{constructor(t,r){super();De(this,Xe);De(this,Nr);De(this,Ke);De(this,Wu);De(this,hr);De(this,co);De(this,Is);De(this,di);De(this,fa);De(this,Ku);De(this,Ts);De(this,Ds);De(this,fo);De(this,ho);De(this,ha);De(this,Rs,new Set);this.options=r,ye(this,Nr,t),ye(this,fa,null),ye(this,di,Xg()),this.bindMethods(),this.setOptions(r)}bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(L(this,Ke).addObserver(this),dw(L(this,Ke),this.options)?He(this,Xe,hu).call(this):this.updateResult(),He(this,Xe,rv).call(this))}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return ov(L(this,Ke),this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return ov(L(this,Ke),this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,He(this,Xe,nv).call(this),He(this,Xe,iv).call(this),L(this,Ke).removeObserver(this)}setOptions(t){const r=this.options,n=L(this,Ke);if(this.options=L(this,Nr).defaultQueryOptions(t),this.options.enabled!==void 0&&typeof this.options.enabled!="boolean"&&typeof this.options.enabled!="function"&&typeof zr(this.options.enabled,L(this,Ke))!="boolean")throw new Error("Expected enabled to be a boolean or a callback that returns a boolean");He(this,Xe,av).call(this),L(this,Ke).setOptions(this.options),r._defaulted&&!qg(this.options,r)&&L(this,Nr).getQueryCache().notify({type:"observerOptionsUpdated",query:L(this,Ke),observer:this});const a=this.hasListeners();a&&fw(L(this,Ke),n,this.options,r)&&He(this,Xe,hu).call(this),this.updateResult(),a&&(L(this,Ke)!==n||zr(this.options.enabled,L(this,Ke))!==zr(r.enabled,L(this,Ke))||ya(this.options.staleTime,L(this,Ke))!==ya(r.staleTime,L(this,Ke)))&&He(this,Xe,Jg).call(this);const o=He(this,Xe,ev).call(this);a&&(L(this,Ke)!==n||zr(this.options.enabled,L(this,Ke))!==zr(r.enabled,L(this,Ke))||o!==L(this,ha))&&He(this,Xe,tv).call(this,o)}getOptimisticResult(t){const r=L(this,Nr).getQueryCache().build(L(this,Nr),t),n=this.createResult(r,t);return N3(this,n)&&(ye(this,hr,n),ye(this,Is,this.options),ye(this,co,L(this,Ke).state)),n}getCurrentResult(){return L(this,hr)}trackResult(t,r){return new Proxy(t,{get:(n,a)=>(this.trackProp(a),r==null||r(a),a==="promise"&&(this.trackProp("data"),!this.options.experimental_prefetchInRender&&L(this,di).status==="pending"&&L(this,di).reject(new Error("experimental_prefetchInRender feature flag is not enabled"))),Reflect.get(n,a))})}trackProp(t){L(this,Rs).add(t)}getCurrentQuery(){return L(this,Ke)}refetch({...t}={}){return this.fetch({...t})}fetchOptimistic(t){const r=L(this,Nr).defaultQueryOptions(t),n=L(this,Nr).getQueryCache().build(L(this,Nr),r);return n.fetch().then(()=>this.createResult(n,r))}fetch(t){return He(this,Xe,hu).call(this,{...t,cancelRefetch:t.cancelRefetch??!0}).then(()=>(this.updateResult(),L(this,hr)))}createResult(t,r){var B;const n=L(this,Ke),a=this.options,o=L(this,hr),c=L(this,co),u=L(this,Is),h=t!==n?t.state:L(this,Wu),{state:m}=t;let g={...m},v=!1,b;if(r._optimisticResults){const F=this.hasListeners(),Y=!F&&dw(t,r),H=F&&fw(t,n,r,a);(Y||H)&&(g={...g,...kN(m.data,t.options)}),r._optimisticResults==="isRestoring"&&(g.fetchStatus="idle")}let{error:j,errorUpdatedAt:k,status:S}=g;b=g.data;let N=!1;if(r.placeholderData!==void 0&&b===void 0&&S==="pending"){let F;o!=null&&o.isPlaceholderData&&r.placeholderData===(u==null?void 0:u.placeholderData)?(F=o.data,N=!0):F=typeof r.placeholderData=="function"?r.placeholderData((B=L(this,Ds))==null?void 0:B.state.data,L(this,Ds)):r.placeholderData,F!==void 0&&(S="success",b=Yg(o==null?void 0:o.data,F,r),v=!0)}if(r.select&&b!==void 0&&!N)if(o&&b===(c==null?void 0:c.data)&&r.select===L(this,Ku))b=L(this,Ts);else try{ye(this,Ku,r.select),b=r.select(b),b=Yg(o==null?void 0:o.data,b,r),ye(this,Ts,b),ye(this,fa,null)}catch(F){ye(this,fa,F)}L(this,fa)&&(j=L(this,fa),b=L(this,Ts),k=Date.now(),S="error");const E=g.fetchStatus==="fetching",A=S==="pending",P=S==="error",_=A&&E,O=b!==void 0,U={status:S,fetchStatus:g.fetchStatus,isPending:A,isSuccess:S==="success",isError:P,isInitialLoading:_,isLoading:_,data:b,dataUpdatedAt:g.dataUpdatedAt,error:j,errorUpdatedAt:k,failureCount:g.fetchFailureCount,failureReason:g.fetchFailureReason,errorUpdateCount:g.errorUpdateCount,isFetched:t.isFetched(),isFetchedAfterMount:g.dataUpdateCount>h.dataUpdateCount||g.errorUpdateCount>h.errorUpdateCount,isFetching:E,isRefetching:E&&!A,isLoadingError:P&&!O,isPaused:g.fetchStatus==="paused",isPlaceholderData:v,isRefetchError:P&&O,isStale:ky(t,r),refetch:this.refetch,promise:L(this,di),isEnabled:zr(r.enabled,t)!==!1};if(this.options.experimental_prefetchInRender){const F=U.data!==void 0,Y=U.status==="error"&&!F,H=he=>{Y?he.reject(U.error):F&&he.resolve(U.data)},pe=()=>{const he=ye(this,di,U.promise=Xg());H(he)},ue=L(this,di);switch(ue.status){case"pending":t.queryHash===n.queryHash&&H(ue);break;case"fulfilled":(Y||U.data!==ue.value)&&pe();break;case"rejected":(!Y||U.error!==ue.reason)&&pe();break}}return U}updateResult(){const t=L(this,hr),r=this.createResult(L(this,Ke),this.options);if(ye(this,co,L(this,Ke).state),ye(this,Is,this.options),L(this,co).data!==void 0&&ye(this,Ds,L(this,Ke)),qg(r,t))return;ye(this,hr,r);const n=()=>{if(!t)return!0;const{notifyOnChangeProps:a}=this.options,o=typeof a=="function"?a():a;if(o==="all"||!o&&!L(this,Rs).size)return!0;const c=new Set(o??L(this,Rs));return this.options.throwOnError&&c.add("error"),Object.keys(L(this,hr)).some(u=>{const f=u;return L(this,hr)[f]!==t[f]&&c.has(f)})};He(this,Xe,jN).call(this,{listeners:n()})}onQueryUpdate(){this.updateResult(),this.hasListeners()&&He(this,Xe,rv).call(this)}},Nr=new WeakMap,Ke=new WeakMap,Wu=new WeakMap,hr=new WeakMap,co=new WeakMap,Is=new WeakMap,di=new WeakMap,fa=new WeakMap,Ku=new WeakMap,Ts=new WeakMap,Ds=new WeakMap,fo=new WeakMap,ho=new WeakMap,ha=new WeakMap,Rs=new WeakMap,Xe=new WeakSet,hu=function(t){He(this,Xe,av).call(this);let r=L(this,Ke).fetch(this.options,t);return t!=null&&t.throwOnError||(r=r.catch(Er)),r},Jg=function(){He(this,Xe,nv).call(this);const t=ya(this.options.staleTime,L(this,Ke));if(Su.isServer()||L(this,hr).isStale||!Vg(t))return;const n=mN(L(this,hr).dataUpdatedAt,t)+1;ye(this,fo,Za.setTimeout(()=>{L(this,hr).isStale||this.updateResult()},n))},ev=function(){return(typeof this.options.refetchInterval=="function"?this.options.refetchInterval(L(this,Ke)):this.options.refetchInterval)??!1},tv=function(t){He(this,Xe,iv).call(this),ye(this,ha,t),!(Su.isServer()||zr(this.options.enabled,L(this,Ke))===!1||!Vg(L(this,ha))||L(this,ha)===0)&&ye(this,ho,Za.setInterval(()=>{(this.options.refetchIntervalInBackground||xy.isFocused())&&He(this,Xe,hu).call(this)},L(this,ha)))},rv=function(){He(this,Xe,Jg).call(this),He(this,Xe,tv).call(this,He(this,Xe,ev).call(this))},nv=function(){L(this,fo)!==void 0&&(Za.clearTimeout(L(this,fo)),ye(this,fo,void 0))},iv=function(){L(this,ho)!==void 0&&(Za.clearInterval(L(this,ho)),ye(this,ho,void 0))},av=function(){const t=L(this,Nr).getQueryCache().build(L(this,Nr),this.options);if(t===L(this,Ke))return;const r=L(this,Ke);ye(this,Ke,t),ye(this,Wu,t.state),this.hasListeners()&&(r==null||r.removeObserver(this),t.addObserver(this))},jN=function(t){qt.batch(()=>{t.listeners&&this.listeners.forEach(r=>{r(L(this,hr))}),L(this,Nr).getQueryCache().notify({query:L(this,Ke),type:"observerResultsUpdated"})})},lN);function S3(e,t){return zr(t.enabled,e)!==!1&&e.state.data===void 0&&!(e.state.status==="error"&&zr(t.retryOnMount,e)===!1)}function dw(e,t){return S3(e,t)||e.state.data!==void 0&&ov(e,t,t.refetchOnMount)}function ov(e,t,r){if(zr(t.enabled,e)!==!1&&ya(t.staleTime,e)!=="static"){const n=typeof r=="function"?r(e):r;return n==="always"||n!==!1&&ky(e,t)}return!1}function fw(e,t,r,n){return(e!==t||zr(n.enabled,e)===!1)&&(!r.suspense||e.state.status!=="error")&&ky(e,r)}function ky(e,t){return zr(t.enabled,e)!==!1&&e.isStaleByTime(ya(t.staleTime,e))}function N3(e,t){return!qg(e.getCurrentResult(),t)}var Gu,Dn,ir,mo,Rn,na,uN,E3=(uN=class extends bN{constructor(t){super();De(this,Rn);De(this,Gu);De(this,Dn);De(this,ir);De(this,mo);ye(this,Gu,t.client),this.mutationId=t.mutationId,ye(this,ir,t.mutationCache),ye(this,Dn,[]),this.state=t.state||A3(),this.setOptions(t.options),this.scheduleGc()}setOptions(t){this.options=t,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(t){L(this,Dn).includes(t)||(L(this,Dn).push(t),this.clearGcTimeout(),L(this,ir).notify({type:"observerAdded",mutation:this,observer:t}))}removeObserver(t){ye(this,Dn,L(this,Dn).filter(r=>r!==t)),this.scheduleGc(),L(this,ir).notify({type:"observerRemoved",mutation:this,observer:t})}optionalRemove(){L(this,Dn).length||(this.state.status==="pending"?this.scheduleGc():L(this,ir).remove(this))}continue(){var t;return((t=L(this,mo))==null?void 0:t.continue())??this.execute(this.state.variables)}async execute(t){var c,u,f,h,m,g,v,b,j,k,S,N,E,A,P,_,O,D;const r=()=>{He(this,Rn,na).call(this,{type:"continue"})},n={client:L(this,Gu),meta:this.options.meta,mutationKey:this.options.mutationKey};ye(this,mo,xN({fn:()=>this.options.mutationFn?this.options.mutationFn(t,n):Promise.reject(new Error("No mutationFn found")),onFail:(U,B)=>{He(this,Rn,na).call(this,{type:"failed",failureCount:U,error:B})},onPause:()=>{He(this,Rn,na).call(this,{type:"pause"})},onContinue:r,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>L(this,ir).canRun(this)}));const a=this.state.status==="pending",o=!L(this,mo).canStart();try{if(a)r();else{He(this,Rn,na).call(this,{type:"pending",variables:t,isPaused:o}),L(this,ir).config.onMutate&&await L(this,ir).config.onMutate(t,this,n);const B=await((u=(c=this.options).onMutate)==null?void 0:u.call(c,t,n));B!==this.state.context&&He(this,Rn,na).call(this,{type:"pending",context:B,variables:t,isPaused:o})}const U=await L(this,mo).start();return await((h=(f=L(this,ir).config).onSuccess)==null?void 0:h.call(f,U,t,this.state.context,this,n)),await((g=(m=this.options).onSuccess)==null?void 0:g.call(m,U,t,this.state.context,n)),await((b=(v=L(this,ir).config).onSettled)==null?void 0:b.call(v,U,null,this.state.variables,this.state.context,this,n)),await((k=(j=this.options).onSettled)==null?void 0:k.call(j,U,null,t,this.state.context,n)),He(this,Rn,na).call(this,{type:"success",data:U}),U}catch(U){try{await((N=(S=L(this,ir).config).onError)==null?void 0:N.call(S,U,t,this.state.context,this,n))}catch(B){Promise.reject(B)}try{await((A=(E=this.options).onError)==null?void 0:A.call(E,U,t,this.state.context,n))}catch(B){Promise.reject(B)}try{await((_=(P=L(this,ir).config).onSettled)==null?void 0:_.call(P,void 0,U,this.state.variables,this.state.context,this,n))}catch(B){Promise.reject(B)}try{await((D=(O=this.options).onSettled)==null?void 0:D.call(O,void 0,U,t,this.state.context,n))}catch(B){Promise.reject(B)}throw He(this,Rn,na).call(this,{type:"error",error:U}),U}finally{L(this,ir).runNext(this)}}},Gu=new WeakMap,Dn=new WeakMap,ir=new WeakMap,mo=new WeakMap,Rn=new WeakSet,na=function(t){const r=n=>{switch(t.type){case"failed":return{...n,failureCount:t.failureCount,failureReason:t.error};case"pause":return{...n,isPaused:!0};case"continue":return{...n,isPaused:!1};case"pending":return{...n,context:t.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:t.isPaused,status:"pending",variables:t.variables,submittedAt:Date.now()};case"success":return{...n,data:t.data,failureCount:0,failureReason:null,error:null,status:"success",isPaused:!1};case"error":return{...n,data:void 0,error:t.error,failureCount:n.failureCount+1,failureReason:t.error,isPaused:!1,status:"error"}}};this.state=r(this.state),qt.batch(()=>{L(this,Dn).forEach(n=>{n.onMutationUpdate(t)}),L(this,ir).notify({mutation:this,type:"updated",action:t})})},uN);function A3(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}var fi,vn,Vu,cN,C3=(cN=class extends qu{constructor(t={}){super();De(this,fi);De(this,vn);De(this,Vu);this.config=t,ye(this,fi,new Set),ye(this,vn,new Map),ye(this,Vu,0)}build(t,r,n){const a=new E3({client:t,mutationCache:this,mutationId:++kd(this,Vu)._,options:t.defaultMutationOptions(r),state:n});return this.add(a),a}add(t){L(this,fi).add(t);const r=Sd(t);if(typeof r=="string"){const n=L(this,vn).get(r);n?n.push(t):L(this,vn).set(r,[t])}this.notify({type:"added",mutation:t})}remove(t){if(L(this,fi).delete(t)){const r=Sd(t);if(typeof r=="string"){const n=L(this,vn).get(r);if(n)if(n.length>1){const a=n.indexOf(t);a!==-1&&n.splice(a,1)}else n[0]===t&&L(this,vn).delete(r)}}this.notify({type:"removed",mutation:t})}canRun(t){const r=Sd(t);if(typeof r=="string"){const n=L(this,vn).get(r),a=n==null?void 0:n.find(o=>o.state.status==="pending");return!a||a===t}else return!0}runNext(t){var n;const r=Sd(t);if(typeof r=="string"){const a=(n=L(this,vn).get(r))==null?void 0:n.find(o=>o!==t&&o.state.isPaused);return(a==null?void 0:a.continue())??Promise.resolve()}else return Promise.resolve()}clear(){qt.batch(()=>{L(this,fi).forEach(t=>{this.notify({type:"removed",mutation:t})}),L(this,fi).clear(),L(this,vn).clear()})}getAll(){return Array.from(L(this,fi))}find(t){const r={exact:!0,...t};return this.getAll().find(n=>aw(r,n))}findAll(t={}){return this.getAll().filter(r=>aw(t,r))}notify(t){qt.batch(()=>{this.listeners.forEach(r=>{r(t)})})}resumePausedMutations(){const t=this.getAll().filter(r=>r.state.isPaused);return qt.batch(()=>Promise.all(t.map(r=>r.continue().catch(Er))))}},fi=new WeakMap,vn=new WeakMap,Vu=new WeakMap,cN);function Sd(e){var t;return(t=e.options.scope)==null?void 0:t.id}var Ln,dN,P3=(dN=class extends qu{constructor(t={}){super();De(this,Ln);this.config=t,ye(this,Ln,new Map)}build(t,r,n){const a=r.queryKey,o=r.queryHash??by(a,r);let c=this.get(o);return c||(c=new k3({client:t,queryKey:a,queryHash:o,options:t.defaultQueryOptions(r),state:n,defaultOptions:t.getQueryDefaults(a)}),this.add(c)),c}add(t){L(this,Ln).has(t.queryHash)||(L(this,Ln).set(t.queryHash,t),this.notify({type:"added",query:t}))}remove(t){const r=L(this,Ln).get(t.queryHash);r&&(t.destroy(),r===t&&L(this,Ln).delete(t.queryHash),this.notify({type:"removed",query:t}))}clear(){qt.batch(()=>{this.getAll().forEach(t=>{this.remove(t)})})}get(t){return L(this,Ln).get(t)}getAll(){return[...L(this,Ln).values()]}find(t){const r={exact:!0,...t};return this.getAll().find(n=>iw(r,n))}findAll(t={}){const r=this.getAll();return Object.keys(t).length>0?r.filter(n=>iw(t,n)):r}notify(t){qt.batch(()=>{this.listeners.forEach(r=>{r(t)})})}onFocus(){qt.batch(()=>{this.getAll().forEach(t=>{t.onFocus()})})}onOnline(){qt.batch(()=>{this.getAll().forEach(t=>{t.onOnline()})})}},Ln=new WeakMap,dN),vt,ma,pa,Ls,$s,ga,zs,Fs,fN,O3=(fN=class{constructor(e={}){De(this,vt);De(this,ma);De(this,pa);De(this,Ls);De(this,$s);De(this,ga);De(this,zs);De(this,Fs);ye(this,vt,e.queryCache||new P3),ye(this,ma,e.mutationCache||new C3),ye(this,pa,e.defaultOptions||{}),ye(this,Ls,new Map),ye(this,$s,new Map),ye(this,ga,0)}mount(){kd(this,ga)._++,L(this,ga)===1&&(ye(this,zs,xy.subscribe(async e=>{e&&(await this.resumePausedMutations(),L(this,vt).onFocus())})),ye(this,Fs,of.subscribe(async e=>{e&&(await this.resumePausedMutations(),L(this,vt).onOnline())})))}unmount(){var e,t;kd(this,ga)._--,L(this,ga)===0&&((e=L(this,zs))==null||e.call(this),ye(this,zs,void 0),(t=L(this,Fs))==null||t.call(this),ye(this,Fs,void 0))}isFetching(e){return L(this,vt).findAll({...e,fetchStatus:"fetching"}).length}isMutating(e){return L(this,ma).findAll({...e,status:"pending"}).length}getQueryData(e){var r;const t=this.defaultQueryOptions({queryKey:e});return(r=L(this,vt).get(t.queryHash))==null?void 0:r.state.data}ensureQueryData(e){const t=this.defaultQueryOptions(e),r=L(this,vt).build(this,t),n=r.state.data;return n===void 0?this.fetchQuery(e):(e.revalidateIfStale&&r.isStaleByTime(ya(t.staleTime,r))&&this.prefetchQuery(t),Promise.resolve(n))}getQueriesData(e){return L(this,vt).findAll(e).map(({queryKey:t,state:r})=>{const n=r.data;return[t,n]})}setQueryData(e,t,r){const n=this.defaultQueryOptions({queryKey:e}),a=L(this,vt).get(n.queryHash),o=a==null?void 0:a.state.data,c=c3(t,o);if(c!==void 0)return L(this,vt).build(this,n).setData(c,{...r,manual:!0})}setQueriesData(e,t,r){return qt.batch(()=>L(this,vt).findAll(e).map(({queryKey:n})=>[n,this.setQueryData(n,t,r)]))}getQueryState(e){var r;const t=this.defaultQueryOptions({queryKey:e});return(r=L(this,vt).get(t.queryHash))==null?void 0:r.state}removeQueries(e){const t=L(this,vt);qt.batch(()=>{t.findAll(e).forEach(r=>{t.remove(r)})})}resetQueries(e,t){const r=L(this,vt);return qt.batch(()=>(r.findAll(e).forEach(n=>{n.reset()}),this.refetchQueries({type:"active",...e},t)))}cancelQueries(e,t={}){const r={revert:!0,...t},n=qt.batch(()=>L(this,vt).findAll(e).map(a=>a.cancel(r)));return Promise.all(n).then(Er).catch(Er)}invalidateQueries(e,t={}){return qt.batch(()=>(L(this,vt).findAll(e).forEach(r=>{r.invalidate()}),(e==null?void 0:e.refetchType)==="none"?Promise.resolve():this.refetchQueries({...e,type:(e==null?void 0:e.refetchType)??(e==null?void 0:e.type)??"active"},t)))}refetchQueries(e,t={}){const r={...t,cancelRefetch:t.cancelRefetch??!0},n=qt.batch(()=>L(this,vt).findAll(e).filter(a=>!a.isDisabled()&&!a.isStatic()).map(a=>{let o=a.fetch(void 0,r);return r.throwOnError||(o=o.catch(Er)),a.state.fetchStatus==="paused"?Promise.resolve():o}));return Promise.all(n).then(Er)}fetchQuery(e){const t=this.defaultQueryOptions(e);t.retry===void 0&&(t.retry=!1);const r=L(this,vt).build(this,t);return r.isStaleByTime(ya(t.staleTime,r))?r.fetch(t):Promise.resolve(r.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(Er).catch(Er)}fetchInfiniteQuery(e){return e._type="infinite",this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(Er).catch(Er)}ensureInfiniteQueryData(e){return e._type="infinite",this.ensureQueryData(e)}resumePausedMutations(){return of.isOnline()?L(this,ma).resumePausedMutations():Promise.resolve()}getQueryCache(){return L(this,vt)}getMutationCache(){return L(this,ma)}getDefaultOptions(){return L(this,pa)}setDefaultOptions(e){ye(this,pa,e)}setQueryDefaults(e,t){L(this,Ls).set(ku(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){const t=[...L(this,Ls).values()],r={};return t.forEach(n=>{ju(e,n.queryKey)&&Object.assign(r,n.defaultOptions)}),r}setMutationDefaults(e,t){L(this,$s).set(ku(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){const t=[...L(this,$s).values()],r={};return t.forEach(n=>{ju(e,n.mutationKey)&&Object.assign(r,n.defaultOptions)}),r}defaultQueryOptions(e){if(e._defaulted)return e;const t={...L(this,pa).queries,...this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||(t.queryHash=by(t.queryKey,t)),t.refetchOnReconnect===void 0&&(t.refetchOnReconnect=t.networkMode!=="always"),t.throwOnError===void 0&&(t.throwOnError=!!t.suspense),!t.networkMode&&t.persister&&(t.networkMode="offlineFirst"),t.queryFn===wy&&(t.enabled=!1),t}defaultMutationOptions(e){return e!=null&&e._defaulted?e:{...L(this,pa).mutations,...(e==null?void 0:e.mutationKey)&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){L(this,vt).clear(),L(this,ma).clear()}},vt=new WeakMap,ma=new WeakMap,pa=new WeakMap,Ls=new WeakMap,$s=new WeakMap,ga=new WeakMap,zs=new WeakMap,Fs=new WeakMap,fN),SN=y.createContext(void 0),Yn=e=>{const t=y.useContext(SN);if(!t)throw new Error("No QueryClient set, use QueryClientProvider to set one");return t},_3=({client:e,children:t})=>(y.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),l.jsx(SN.Provider,{value:e,children:t})),NN=y.createContext(!1),M3=()=>y.useContext(NN);NN.Provider;function I3(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}var T3=y.createContext(I3()),D3=()=>y.useContext(T3),R3=(e,t,r)=>{const n=r!=null&&r.state.error&&typeof e.throwOnError=="function"?vN(e.throwOnError,[r.state.error,r]):e.throwOnError;(e.suspense||e.experimental_prefetchInRender||n)&&(t.isReset()||(e.retryOnMount=!1))},L3=e=>{y.useEffect(()=>{e.clearReset()},[e])},$3=({result:e,errorResetBoundary:t,throwOnError:r,query:n,suspense:a})=>e.isError&&!t.isReset()&&!e.isFetching&&n&&(a&&e.data===void 0||vN(r,[e.error,n])),z3=e=>{if(e.suspense){const r=a=>a==="static"?a:Math.max(a??1e3,1e3),n=e.staleTime;e.staleTime=typeof n=="function"?(...a)=>r(n(...a)):r(n),typeof e.gcTime=="number"&&(e.gcTime=Math.max(e.gcTime,1e3))}},F3=(e,t)=>e.isLoading&&e.isFetching&&!t,B3=(e,t)=>(e==null?void 0:e.suspense)&&t.isPending,hw=(e,t,r)=>t.fetchOptimistic(e).catch(()=>{r.clearReset()});function U3(e,t,r){var b,j,k,S;const n=M3(),a=D3(),o=Yn(),c=o.defaultQueryOptions(e);(j=(b=o.getDefaultOptions().queries)==null?void 0:b._experimental_beforeQuery)==null||j.call(b,c);const u=o.getQueryCache().get(c.queryHash),f=e.subscribed!==!1;c._optimisticResults=n?"isRestoring":f?"optimistic":void 0,z3(c),R3(c,a,u),L3(a);const h=!o.getQueryCache().get(c.queryHash),[m]=y.useState(()=>new t(o,c)),g=m.getOptimisticResult(c),v=!n&&f;if(y.useSyncExternalStore(y.useCallback(N=>{const E=v?m.subscribe(qt.batchCalls(N)):Er;return m.updateResult(),E},[m,v]),()=>m.getCurrentResult(),()=>m.getCurrentResult()),y.useEffect(()=>{m.setOptions(c)},[c,m]),B3(c,g))throw hw(c,m,a);if($3({result:g,errorResetBoundary:a,throwOnError:c.throwOnError,query:u,suspense:c.suspense}))throw g.error;if((S=(k=o.getDefaultOptions().queries)==null?void 0:k._experimental_afterQuery)==null||S.call(k,c,g),c.experimental_prefetchInRender&&!Su.isServer()&&F3(g,n)){const N=h?hw(c,m,a):u==null?void 0:u.promise;N==null||N.catch(Er).finally(()=>{m.updateResult()})}return c.notifyOnChangeProps?g:m.trackResult(g)}function $t(e,t){return U3(e,j3)}/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const H3=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),EN=(...e)=>e.filter((t,r,n)=>!!t&&t.trim()!==""&&n.indexOf(t)===r).join(" ").trim();/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */var W3={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const K3=y.forwardRef(({color:e="currentColor",size:t=24,strokeWidth:r=2,absoluteStrokeWidth:n,className:a="",children:o,iconNode:c,...u},f)=>y.createElement("svg",{ref:f,...W3,width:t,height:t,stroke:e,strokeWidth:n?Number(r)*24/Number(t):r,className:EN("lucide",a),...u},[...c.map(([h,m])=>y.createElement(h,m)),...Array.isArray(o)?o:[o]]));/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const de=(e,t)=>{const r=y.forwardRef(({className:n,...a},o)=>y.createElement(K3,{ref:o,iconNode:t,className:EN(`lucide-${H3(e)}`,n),...a}));return r.displayName=`${e}`,r};/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const uh=de("Activity",[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const AN=de("ArrowLeft",[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const sf=de("ArrowRight",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const G3=de("ArrowUpRight",[["path",{d:"M7 7h10v10",key:"1tivn9"}],["path",{d:"M7 17 17 7",key:"1vkiza"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const CN=de("BookMarked",[["path",{d:"M10 2v8l3-3 3 3V2",key:"sqw3rj"}],["path",{d:"M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H19a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H6.5a1 1 0 0 1 0-5H20",key:"k3hazp"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const sv=de("BookOpen",[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",key:"ruj8y"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const V3=de("Bookmark",[["path",{d:"m19 21-7-4-7 4V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2v16z",key:"1fy3hk"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const wn=de("Bot",[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const q3=de("Box",[["path",{d:"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z",key:"hh9hay"}],["path",{d:"m3.3 7 8.7 5 8.7-5",key:"g66t2b"}],["path",{d:"M12 22V12",key:"d0xqtd"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const lf=de("Boxes",[["path",{d:"M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z",key:"lc1i9w"}],["path",{d:"m7 16.5-4.74-2.85",key:"1o9zyk"}],["path",{d:"m7 16.5 5-3",key:"va8pkn"}],["path",{d:"M7 16.5v5.17",key:"jnp8gn"}],["path",{d:"M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z",key:"8zsnat"}],["path",{d:"m17 16.5-5-3",key:"8arw3v"}],["path",{d:"m17 16.5 4.74-2.85",key:"8rfmw"}],["path",{d:"M17 16.5v5.17",key:"k6z78m"}],["path",{d:"M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z",key:"1xygjf"}],["path",{d:"M12 8 7.26 5.15",key:"1vbdud"}],["path",{d:"m12 8 4.74-2.85",key:"3rx089"}],["path",{d:"M12 13.5V8",key:"1io7kd"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Q3=de("BrainCircuit",[["path",{d:"M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z",key:"l5xja"}],["path",{d:"M9 13a4.5 4.5 0 0 0 3-4",key:"10igwf"}],["path",{d:"M6.003 5.125A3 3 0 0 0 6.401 6.5",key:"105sqy"}],["path",{d:"M3.477 10.896a4 4 0 0 1 .585-.396",key:"ql3yin"}],["path",{d:"M6 18a4 4 0 0 1-1.967-.516",key:"2e4loj"}],["path",{d:"M12 13h4",key:"1ku699"}],["path",{d:"M12 18h6a2 2 0 0 1 2 2v1",key:"105ag5"}],["path",{d:"M12 8h8",key:"1lhi5i"}],["path",{d:"M16 8V5a2 2 0 0 1 2-2",key:"u6izg6"}],["circle",{cx:"16",cy:"13",r:".5",key:"ry7gng"}],["circle",{cx:"18",cy:"3",r:".5",key:"1aiba7"}],["circle",{cx:"20",cy:"21",r:".5",key:"yhc1fs"}],["circle",{cx:"20",cy:"8",r:".5",key:"1e43v0"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Y3=de("BrainCog",[["path",{d:"M12 5a3 3 0 1 0-5.997.142 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588 4 4 0 0 0 7.636 2.106 3.2 3.2 0 0 0 .164-.546c.028-.13.306-.13.335 0a3.2 3.2 0 0 0 .163.546 4 4 0 0 0 7.636-2.106 4 4 0 0 0 .556-6.588 4 4 0 0 0-2.526-5.77A3 3 0 1 0 12 5",key:"1kgmhc"}],["path",{d:"M17.599 6.5a3 3 0 0 0 .399-1.375",key:"tmeiqw"}],["path",{d:"M6.003 5.125A3 3 0 0 0 6.401 6.5",key:"105sqy"}],["path",{d:"M3.477 10.896a4 4 0 0 1 .585-.396",key:"ql3yin"}],["path",{d:"M19.938 10.5a4 4 0 0 1 .585.396",key:"1qfode"}],["path",{d:"M6 18a4 4 0 0 1-1.967-.516",key:"2e4loj"}],["path",{d:"M19.967 17.484A4 4 0 0 1 18 18",key:"159ez6"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}],["path",{d:"m15.7 10.4-.9.4",key:"ayzo6p"}],["path",{d:"m9.2 13.2-.9.4",key:"1uzb3g"}],["path",{d:"m13.6 15.7-.4-.9",key:"11ifqf"}],["path",{d:"m10.8 9.2-.4-.9",key:"1pmk2v"}],["path",{d:"m15.7 13.5-.9-.4",key:"7ng02m"}],["path",{d:"m9.2 10.9-.9-.4",key:"1x66zd"}],["path",{d:"m10.5 15.7.4-.9",key:"3js94g"}],["path",{d:"m13.1 9.2.4-.9",key:"18n7mc"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Ao=de("Brain",[["path",{d:"M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z",key:"l5xja"}],["path",{d:"M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z",key:"ep3f8r"}],["path",{d:"M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4",key:"1p4c4q"}],["path",{d:"M17.599 6.5a3 3 0 0 0 .399-1.375",key:"tmeiqw"}],["path",{d:"M6.003 5.125A3 3 0 0 0 6.401 6.5",key:"105sqy"}],["path",{d:"M3.477 10.896a4 4 0 0 1 .585-.396",key:"ql3yin"}],["path",{d:"M19.938 10.5a4 4 0 0 1 .585.396",key:"1qfode"}],["path",{d:"M6 18a4 4 0 0 1-1.967-.516",key:"2e4loj"}],["path",{d:"M19.967 17.484A4 4 0 0 1 18 18",key:"159ez6"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const X3=de("Camera",[["path",{d:"M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z",key:"1tc9qg"}],["circle",{cx:"12",cy:"13",r:"3",key:"1vg3eu"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const sr=de("Check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const PN=de("ChevronDown",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Z3=de("ChevronLeft",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const ch=de("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const ON=de("ChevronUp",[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const J3=de("CircleArrowUp",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m16 12-4-4-4 4",key:"177agl"}],["path",{d:"M12 16V8",key:"1sbj14"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const e4=de("CircleCheck",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const t4=de("CircleHelp",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3",key:"1u773s"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const r4=de("CircleX",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"m9 9 6 6",key:"z0biqf"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const n4=de("Clock",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polyline",{points:"12 6 12 12 16 14",key:"68esgv"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const i4=de("CodeXml",[["path",{d:"m18 16 4-4-4-4",key:"1inbqp"}],["path",{d:"m6 8-4 4 4 4",key:"15zrgr"}],["path",{d:"m14.5 4-5 16",key:"e7oirm"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Bs=de("Code",[["polyline",{points:"16 18 22 12 16 6",key:"z7tu5w"}],["polyline",{points:"8 6 2 12 8 18",key:"1eg1df"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const a4=de("Command",[["path",{d:"M15 6v12a3 3 0 1 0 3-3H6a3 3 0 1 0 3 3V6a3 3 0 1 0-3 3h12a3 3 0 1 0-3-3",key:"11bfej"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const lv=de("Compass",[["path",{d:"m16.24 7.76-1.804 5.411a2 2 0 0 1-1.265 1.265L7.76 16.24l1.804-5.411a2 2 0 0 1 1.265-1.265z",key:"9ktpf1"}],["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const o4=de("Construction",[["rect",{x:"2",y:"6",width:"20",height:"8",rx:"1",key:"1estib"}],["path",{d:"M17 14v7",key:"7m2elx"}],["path",{d:"M7 14v7",key:"1cm7wv"}],["path",{d:"M17 3v3",key:"1v4jwn"}],["path",{d:"M7 3v3",key:"7o6guu"}],["path",{d:"M10 14 2.3 6.3",key:"1023jk"}],["path",{d:"m14 6 7.7 7.7",key:"1s8pl2"}],["path",{d:"m8 6 8 8",key:"hl96qh"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const uv=de("Copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Hn=de("Cpu",[["rect",{width:"16",height:"16",x:"4",y:"4",rx:"2",key:"14l7u7"}],["rect",{width:"6",height:"6",x:"9",y:"9",rx:"1",key:"5aljv4"}],["path",{d:"M15 2v2",key:"13l42r"}],["path",{d:"M15 20v2",key:"15mkzm"}],["path",{d:"M2 15h2",key:"1gxd5l"}],["path",{d:"M2 9h2",key:"1bbxkp"}],["path",{d:"M20 15h2",key:"19e6y8"}],["path",{d:"M20 9h2",key:"19tzq7"}],["path",{d:"M9 2v2",key:"165o2o"}],["path",{d:"M9 20v2",key:"i2bqo8"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const s4=de("Database",[["ellipse",{cx:"12",cy:"5",rx:"9",ry:"3",key:"msslwz"}],["path",{d:"M3 5V19A9 3 0 0 0 21 19V5",key:"1wlel7"}],["path",{d:"M3 12A9 3 0 0 0 21 12",key:"mv7ke4"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Us=de("Download",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"7 10 12 15 17 10",key:"2ggqvy"}],["line",{x1:"12",x2:"12",y1:"15",y2:"3",key:"1vk2je"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Hs=de("ExternalLink",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const mw=de("EyeOff",[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const uf=de("Eye",[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const l4=de("FileText",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const u4=de("Flame",[["path",{d:"M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z",key:"96xj49"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const c4=de("FolderOpen",[["path",{d:"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2",key:"usdka0"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const _N=de("Gauge",[["path",{d:"m12 14 4-4",key:"9kzdfg"}],["path",{d:"M3.34 19a10 10 0 1 1 17.32 0",key:"19p75a"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const d4=de("GitCommitHorizontal",[["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}],["line",{x1:"3",x2:"9",y1:"12",y2:"12",key:"1dyftd"}],["line",{x1:"15",x2:"21",y1:"12",y2:"12",key:"oup4p8"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const f4=de("Globe",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",key:"13o1zl"}],["path",{d:"M2 12h20",key:"9i4pu4"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const yu=de("HardDrive",[["line",{x1:"22",x2:"2",y1:"12",y2:"12",key:"1y58io"}],["path",{d:"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z",key:"oot6mr"}],["line",{x1:"6",x2:"6.01",y1:"16",y2:"16",key:"sgf278"}],["line",{x1:"10",x2:"10.01",y1:"16",y2:"16",key:"1l4acy"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const h4=de("HeartPulse",[["path",{d:"M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z",key:"c3ymky"}],["path",{d:"M3.22 12H9.5l.5-1 2 4.5 2-7 1.5 3.5h5.27",key:"1uw2ng"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const m4=de("Heart",[["path",{d:"M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z",key:"c3ymky"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const pw=de("Info",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const p4=de("Key",[["path",{d:"m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4",key:"g0fldk"}],["path",{d:"m21 2-9.6 9.6",key:"1j0ho8"}],["circle",{cx:"7.5",cy:"15.5",r:"5.5",key:"yqb3hr"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const g4=de("Laptop",[["path",{d:"M20 16V7a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v9m16 0H4m16 0 1.28 2.55a1 1 0 0 1-.9 1.45H3.62a1 1 0 0 1-.9-1.45L4 16",key:"tarvll"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const jy=de("Layers",[["path",{d:"m12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83Z",key:"8b97xw"}],["path",{d:"m22 17.65-9.17 4.16a2 2 0 0 1-1.66 0L2 17.65",key:"dd6zsq"}],["path",{d:"m22 12.65-9.17 4.16a2 2 0 0 1-1.66 0L2 12.65",key:"ep9fru"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const v4=de("LayoutDashboard",[["rect",{width:"7",height:"9",x:"3",y:"3",rx:"1",key:"10lvy0"}],["rect",{width:"7",height:"5",x:"14",y:"3",rx:"1",key:"16une8"}],["rect",{width:"7",height:"9",x:"14",y:"12",rx:"1",key:"1hutg5"}],["rect",{width:"7",height:"5",x:"3",y:"16",rx:"1",key:"ldoo1y"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const y4=de("LifeBuoy",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m4.93 4.93 4.24 4.24",key:"1ymg45"}],["path",{d:"m14.83 9.17 4.24-4.24",key:"1cb5xl"}],["path",{d:"m14.83 14.83 4.24 4.24",key:"q42g0n"}],["path",{d:"m9.17 14.83-4.24 4.24",key:"bqpfvv"}],["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const x4=de("Lightbulb",[["path",{d:"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5",key:"1gvzjb"}],["path",{d:"M9 18h6",key:"x1upvd"}],["path",{d:"M10 22h4",key:"ceow96"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const b4=de("List",[["path",{d:"M3 12h.01",key:"nlz23k"}],["path",{d:"M3 18h.01",key:"1tta3j"}],["path",{d:"M3 6h.01",key:"1rqtza"}],["path",{d:"M8 12h13",key:"1za7za"}],["path",{d:"M8 18h13",key:"1lx6n3"}],["path",{d:"M8 6h13",key:"ik3vkj"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const dh=de("LoaderCircle",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const w4=de("Lock",[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const k4=de("MessageSquare",[["path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z",key:"1lielz"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const j4=de("MessagesSquare",[["path",{d:"M14 9a2 2 0 0 1-2 2H6l-4 4V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2z",key:"p1xzt8"}],["path",{d:"M18 9h2a2 2 0 0 1 2 2v11l-4-4h-6a2 2 0 0 1-2-2v-1",key:"1cx29u"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const S4=de("Mic",[["path",{d:"M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z",key:"131961"}],["path",{d:"M19 10v2a7 7 0 0 1-14 0v-2",key:"1vc78b"}],["line",{x1:"12",x2:"12",y1:"19",y2:"22",key:"x3vr5v"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const gw=de("Monitor",[["rect",{width:"20",height:"14",x:"2",y:"3",rx:"2",key:"48i651"}],["line",{x1:"8",x2:"16",y1:"21",y2:"21",key:"1svkeh"}],["line",{x1:"12",x2:"12",y1:"17",y2:"21",key:"vw1qmm"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const N4=de("Moon",[["path",{d:"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z",key:"a7tn18"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const E4=de("Network",[["rect",{x:"16",y:"16",width:"6",height:"6",rx:"1",key:"4q2zg0"}],["rect",{x:"2",y:"16",width:"6",height:"6",rx:"1",key:"8cvhb9"}],["rect",{x:"9",y:"2",width:"6",height:"6",rx:"1",key:"1egb70"}],["path",{d:"M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3",key:"1jsf9p"}],["path",{d:"M12 12V8",key:"2874zd"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const A4=de("Package",[["path",{d:"M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z",key:"1a0edw"}],["path",{d:"M12 22V12",key:"d0xqtd"}],["path",{d:"m3.3 7 7.703 4.734a2 2 0 0 0 1.994 0L20.7 7",key:"yx3hmr"}],["path",{d:"m7.5 4.27 9 5.15",key:"1c824w"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const C4=de("PenLine",[["path",{d:"M12 20h9",key:"t2du7b"}],["path",{d:"M16.376 3.622a1 1 0 0 1 3.002 3.002L7.368 18.635a2 2 0 0 1-.855.506l-2.872.838a.5.5 0 0 1-.62-.62l.838-2.872a2 2 0 0 1 .506-.854z",key:"1ykcvy"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const cf=de("Plug",[["path",{d:"M12 22v-5",key:"1ega77"}],["path",{d:"M9 8V2",key:"14iosj"}],["path",{d:"M15 8V2",key:"18g5xt"}],["path",{d:"M18 8v5a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V8Z",key:"osxo6l"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const df=de("Plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const P4=de("Power",[["path",{d:"M12 2v10",key:"mnfbl"}],["path",{d:"M18.4 6.6a9 9 0 1 1-12.77.04",key:"obofu9"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const O4=de("Puzzle",[["path",{d:"M15.39 4.39a1 1 0 0 0 1.68-.474 2.5 2.5 0 1 1 3.014 3.015 1 1 0 0 0-.474 1.68l1.683 1.682a2.414 2.414 0 0 1 0 3.414L19.61 15.39a1 1 0 0 1-1.68-.474 2.5 2.5 0 1 0-3.014 3.015 1 1 0 0 1 .474 1.68l-1.683 1.682a2.414 2.414 0 0 1-3.414 0L8.61 19.61a1 1 0 0 0-1.68.474 2.5 2.5 0 1 1-3.014-3.015 1 1 0 0 0 .474-1.68l-1.683-1.682a2.414 2.414 0 0 1 0-3.414L4.39 8.61a1 1 0 0 1 1.68.474 2.5 2.5 0 1 0 3.014-3.015 1 1 0 0 1-.474-1.68l1.683-1.682a2.414 2.414 0 0 1 3.414 0z",key:"w46dr5"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Xa=de("RefreshCw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const _4=de("RotateCcw",[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const M4=de("Scroll",[["path",{d:"M19 17V5a2 2 0 0 0-2-2H4",key:"zz82l3"}],["path",{d:"M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3",key:"1ph1d7"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const MN=de("Search",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const I4=de("Send",[["path",{d:"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z",key:"1ffxy3"}],["path",{d:"m21.854 2.147-10.94 10.939",key:"12cjpa"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const ff=de("Server",[["rect",{width:"20",height:"8",x:"2",y:"2",rx:"2",ry:"2",key:"ngkwjq"}],["rect",{width:"20",height:"8",x:"2",y:"14",rx:"2",ry:"2",key:"iecqi9"}],["line",{x1:"6",x2:"6.01",y1:"6",y2:"6",key:"16zg32"}],["line",{x1:"6",x2:"6.01",y1:"18",y2:"18",key:"nzw8ys"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const T4=de("Share2",[["circle",{cx:"18",cy:"5",r:"3",key:"gq8acd"}],["circle",{cx:"6",cy:"12",r:"3",key:"w7nqdw"}],["circle",{cx:"18",cy:"19",r:"3",key:"1xt0gg"}],["line",{x1:"8.59",x2:"15.42",y1:"13.51",y2:"17.49",key:"47mynk"}],["line",{x1:"15.41",x2:"8.59",y1:"6.51",y2:"10.49",key:"1n3mei"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const D4=de("ShieldAlert",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"M12 8v4",key:"1got3b"}],["path",{d:"M12 16h.01",key:"1drbdi"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const R4=de("ShieldCheck",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const L4=de("ShieldQuestion",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"M9.1 9a3 3 0 0 1 5.82 1c0 2-3 3-3 3",key:"mhlwft"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const ks=de("Shield",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const vw=de("Shuffle",[["path",{d:"M2 18h1.4c1.3 0 2.5-.6 3.3-1.7l6.1-8.6c.7-1.1 2-1.7 3.3-1.7H22",key:"1wmou1"}],["path",{d:"m18 2 4 4-4 4",key:"pucp1d"}],["path",{d:"M2 6h1.9c1.5 0 2.9.9 3.6 2.2",key:"10bdb2"}],["path",{d:"M22 18h-5.9c-1.3 0-2.6-.7-3.3-1.8l-.5-.8",key:"vgxac0"}],["path",{d:"m18 14 4 4-4 4",key:"10pe0f"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const $4=de("SlidersHorizontal",[["line",{x1:"21",x2:"14",y1:"4",y2:"4",key:"obuewd"}],["line",{x1:"10",x2:"3",y1:"4",y2:"4",key:"1q6298"}],["line",{x1:"21",x2:"12",y1:"12",y2:"12",key:"1iu8h1"}],["line",{x1:"8",x2:"3",y1:"12",y2:"12",key:"ntss68"}],["line",{x1:"21",x2:"16",y1:"20",y2:"20",key:"14d8ph"}],["line",{x1:"12",x2:"3",y1:"20",y2:"20",key:"m0wm8r"}],["line",{x1:"14",x2:"14",y1:"2",y2:"6",key:"14e1ph"}],["line",{x1:"8",x2:"8",y1:"10",y2:"14",key:"1i6ji0"}],["line",{x1:"16",x2:"16",y1:"18",y2:"22",key:"1lctlv"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const z4=de("SlidersVertical",[["line",{x1:"4",x2:"4",y1:"21",y2:"14",key:"1p332r"}],["line",{x1:"4",x2:"4",y1:"10",y2:"3",key:"gb41h5"}],["line",{x1:"12",x2:"12",y1:"21",y2:"12",key:"hf2csr"}],["line",{x1:"12",x2:"12",y1:"8",y2:"3",key:"1kfi7u"}],["line",{x1:"20",x2:"20",y1:"21",y2:"16",key:"1lhrwl"}],["line",{x1:"20",x2:"20",y1:"12",y2:"3",key:"16vvfq"}],["line",{x1:"2",x2:"6",y1:"14",y2:"14",key:"1uebub"}],["line",{x1:"10",x2:"14",y1:"8",y2:"8",key:"1yglbp"}],["line",{x1:"18",x2:"22",y1:"16",y2:"16",key:"1jxqpz"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const xs=de("Sparkles",[["path",{d:"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z",key:"4pj2yx"}],["path",{d:"M20 3v4",key:"1olli1"}],["path",{d:"M22 5h-4",key:"1gvqau"}],["path",{d:"M4 17v2",key:"vumght"}],["path",{d:"M5 18H3",key:"zchphs"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const IN=de("SquareTerminal",[["path",{d:"m7 11 2-2-2-2",key:"1lz0vl"}],["path",{d:"M11 13h4",key:"1p7l4v"}],["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const F4=de("Star",[["path",{d:"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z",key:"r04s7s"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const B4=de("Telescope",[["path",{d:"m10.065 12.493-6.18 1.318a.934.934 0 0 1-1.108-.702l-.537-2.15a1.07 1.07 0 0 1 .691-1.265l13.504-4.44",key:"k4qptu"}],["path",{d:"m13.56 11.747 4.332-.924",key:"19l80z"}],["path",{d:"m16 21-3.105-6.21",key:"7oh9d"}],["path",{d:"M16.485 5.94a2 2 0 0 1 1.455-2.425l1.09-.272a1 1 0 0 1 1.212.727l1.515 6.06a1 1 0 0 1-.727 1.213l-1.09.272a2 2 0 0 1-2.425-1.455z",key:"m7xp4m"}],["path",{d:"m6.158 8.633 1.114 4.456",key:"74o979"}],["path",{d:"m8 21 3.105-6.21",key:"1fvxut"}],["circle",{cx:"12",cy:"13",r:"2",key:"1c1ljs"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const TN=de("Terminal",[["polyline",{points:"4 17 10 11 4 5",key:"akl6gq"}],["line",{x1:"12",x2:"20",y1:"19",y2:"19",key:"q2wloq"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const cv=de("Trash2",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const bi=de("TriangleAlert",[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const U4=de("User",[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",key:"975kel"}],["circle",{cx:"12",cy:"7",r:"4",key:"17ys0d"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Qu=de("Wrench",[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z",key:"cbrjhi"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Wn=de("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const xa=de("Zap",[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]]),mu=[{id:"dashboard",label:"Zentrale",hint:"System- & Stack-Status",icon:v4},{id:"models",label:"Modell-Manager",hint:"Verwalten, laden & Gateway-Routing",icon:lf},{id:"memory",label:"Gedächtnis",hint:"Geteiltes Memory verwalten",icon:Ao},{id:"connect",label:"Verbinden",hint:"IDE-/Agent-Configs erzeugen",icon:cf},{id:"agent",label:"Hermes",hint:"Agent-Status & Verdrahtung",icon:wn},{id:"terminal",label:"Terminal",hint:"Interaktives Hermes-Agent-Terminal",icon:IN},{id:"guide",label:"Anleitung",hint:"Einrichten & Vibe-Coding",icon:t4}];var yw=1,H4=.9,W4=.8,K4=.17,eg=.1,tg=.999,G4=.9999,V4=.99,q4=/[\\\/_+.#"@\[\(\{&]/,Q4=/[\\\/_+.#"@\[\(\{&]/g,Y4=/[\s-]/,DN=/[\s-]/g;function dv(e,t,r,n,a,o,c){if(o===t.length)return a===e.length?yw:V4;var u=`${a},${o}`;if(c[u]!==void 0)return c[u];for(var f=n.charAt(o),h=r.indexOf(f,a),m=0,g,v,b,j;h>=0;)g=dv(e,t,r,n,h+1,o+1,c),g>m&&(h===a?g*=yw:q4.test(e.charAt(h-1))?(g*=W4,b=e.slice(a,h-1).match(Q4),b&&a>0&&(g*=Math.pow(tg,b.length))):Y4.test(e.charAt(h-1))?(g*=H4,j=e.slice(a,h-1).match(DN),j&&a>0&&(g*=Math.pow(tg,j.length))):(g*=K4,a>0&&(g*=Math.pow(tg,h-a))),e.charAt(h)!==t.charAt(o)&&(g*=G4)),(gg&&(g=v*eg)),g>m&&(m=g),h=r.indexOf(f,h+1);return c[u]=m,m}function xw(e){return e.toLowerCase().replace(DN," ")}function X4(e,t,r){return e=r&&r.length>0?`${e+" "+r.join(" ")}`:e,dv(e,t,xw(e),xw(t),0,0,{})}function ba(e,t,{checkForDefaultPrevented:r=!0}={}){return function(a){if(e==null||e(a),r===!1||!a.defaultPrevented)return t==null?void 0:t(a)}}function bw(e,t){if(typeof e=="function")return e(t);e!=null&&(e.current=t)}function Ws(...e){return t=>{let r=!1;const n=e.map(a=>{const o=bw(a,t);return!r&&typeof o=="function"&&(r=!0),o});if(r)return()=>{for(let a=0;a{var N;const{scope:v,children:b,...j}=g,k=((N=v==null?void 0:v[e])==null?void 0:N[f])||u,S=y.useMemo(()=>j,Object.values(j));return l.jsx(k.Provider,{value:S,children:b})};h.displayName=o+"Provider";function m(g,v){var k;const b=((k=v==null?void 0:v[e])==null?void 0:k[f])||u,j=y.useContext(b);if(j)return j;if(c!==void 0)return c;throw new Error(`\`${g}\` must be used within \`${o}\``)}return[h,m]}const a=()=>{const o=r.map(c=>y.createContext(c));return function(u){const f=(u==null?void 0:u[e])||o;return y.useMemo(()=>({[`__scope${e}`]:{...u,[e]:f}}),[u,f])}};return a.scopeName=e,[n,J4(a,...t)]}function J4(...e){const t=e[0];if(e.length===1)return t;const r=()=>{const n=e.map(a=>({useScope:a(),scopeName:a.scopeName}));return function(o){const c=n.reduce((u,{useScope:f,scopeName:h})=>{const g=f(o)[`__scope${h}`];return{...u,...g}},{});return y.useMemo(()=>({[`__scope${t.scopeName}`]:c}),[c])}};return r.scopeName=t.scopeName,r}var Nu=globalThis!=null&&globalThis.document?y.useLayoutEffect:()=>{},eI=lh[" useId ".trim().toString()]||(()=>{}),tI=0;function vi(e){const[t,r]=y.useState(eI());return Nu(()=>{r(n=>n??String(tI++))},[e]),t?`radix-${t}`:""}var rI=lh[" useInsertionEffect ".trim().toString()]||Nu;function nI({prop:e,defaultProp:t,onChange:r=()=>{},caller:n}){const[a,o,c]=iI({defaultProp:t,onChange:r}),u=e!==void 0,f=u?e:a;{const m=y.useRef(e!==void 0);y.useEffect(()=>{const g=m.current;g!==u&&console.warn(`${n} is changing from ${g?"controlled":"uncontrolled"} to ${u?"controlled":"uncontrolled"}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`),m.current=u},[u,n])}const h=y.useCallback(m=>{var g;if(u){const v=aI(m)?m(e):m;v!==e&&((g=c.current)==null||g.call(c,v))}else o(m)},[u,e,o,c]);return[f,h]}function iI({defaultProp:e,onChange:t}){const[r,n]=y.useState(e),a=y.useRef(r),o=y.useRef(t);return rI(()=>{o.current=t},[t]),y.useEffect(()=>{var c;a.current!==r&&((c=o.current)==null||c.call(o,r),a.current=r)},[r,a]),[r,n,o]}function aI(e){return typeof e=="function"}var fh=hN();function RN(e){const t=y.forwardRef((r,n)=>{let{children:a,...o}=r,c=null,u=!1;const f=[];ww(a)&&typeof Nd=="function"&&(a=Nd(a._payload)),y.Children.forEach(a,v=>{var b;if(cI(v)){u=!0;const j=v;let k="child"in j.props?j.props.child:j.props.children;ww(k)&&typeof Nd=="function"&&(k=Nd(k._payload)),c=sI(j,k),f.push((b=c==null?void 0:c.props)==null?void 0:b.children)}else f.push(v)}),c?c=y.cloneElement(c,void 0,f):!u&&y.Children.count(a)===1&&y.isValidElement(a)&&(c=a);const h=c?uI(c):void 0,m=Co(n,h);if(!c){if(a||a===0)throw new Error(u?mI(e):hI(e));return a}const g=lI(o,c.props??{});return c.type!==y.Fragment&&(g.ref=n?m:h),y.cloneElement(c,g)});return t.displayName=`${e}.Slot`,t}var oI=Symbol.for("radix.slottable"),sI=(e,t)=>{if("child"in e.props){const r=e.props.child;return y.isValidElement(r)?y.cloneElement(r,void 0,e.props.children(r.props.children)):null}return y.isValidElement(t)?t:null};function lI(e,t){const r={...t};for(const n in t){const a=e[n],o=t[n];/^on[A-Z]/.test(n)?a&&o?r[n]=(...u)=>{const f=o(...u);return a(...u),f}:a&&(r[n]=a):n==="style"?r[n]={...a,...o}:n==="className"&&(r[n]=[a,o].filter(Boolean).join(" "))}return{...e,...r}}function uI(e){var n,a;let t=(n=Object.getOwnPropertyDescriptor(e.props,"ref"))==null?void 0:n.get,r=t&&"isReactWarning"in t&&t.isReactWarning;return r?e.ref:(t=(a=Object.getOwnPropertyDescriptor(e,"ref"))==null?void 0:a.get,r=t&&"isReactWarning"in t&&t.isReactWarning,r?e.props.ref:e.props.ref||e.ref)}function cI(e){return y.isValidElement(e)&&typeof e.type=="function"&&"__radixId"in e.type&&e.type.__radixId===oI}var dI=Symbol.for("react.lazy");function ww(e){return e!=null&&typeof e=="object"&&"$$typeof"in e&&e.$$typeof===dI&&"_payload"in e&&fI(e._payload)}function fI(e){return typeof e=="object"&&e!==null&&"then"in e}var hI=e=>`${e} failed to slot onto its children. Expected a single React element child or \`Slottable\`.`,mI=e=>`${e} failed to slot onto its \`Slottable\`. Expected \`Slottable\` to receive a single React element child.`,Nd=lh[" use ".trim().toString()],pI=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],Xt=pI.reduce((e,t)=>{const r=RN(`Primitive.${t}`),n=y.forwardRef((a,o)=>{const{asChild:c,...u}=a,f=c?r:t;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),l.jsx(f,{...u,ref:o})});return n.displayName=`Primitive.${t}`,{...e,[t]:n}},{});function gI(e,t){e&&fh.flushSync(()=>e.dispatchEvent(t))}function Eu(e){const t=y.useRef(e);return y.useEffect(()=>{t.current=e}),y.useMemo(()=>((...r)=>{var n;return(n=t.current)==null?void 0:n.call(t,...r)}),[])}function vI(e,t=globalThis==null?void 0:globalThis.document){const r=Eu(e);y.useEffect(()=>{const n=a=>{a.key==="Escape"&&r(a)};return t.addEventListener("keydown",n,{capture:!0}),()=>t.removeEventListener("keydown",n,{capture:!0})},[r,t])}var yI="DismissableLayer",fv="dismissableLayer.update",xI="dismissableLayer.pointerDownOutside",bI="dismissableLayer.focusOutside",kw,Sy=y.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set,dismissableSurfaces:new Set}),LN=y.forwardRef((e,t)=>{const{disableOutsidePointerEvents:r=!1,deferPointerDownOutside:n=!1,onEscapeKeyDown:a,onPointerDownOutside:o,onFocusOutside:c,onInteractOutside:u,onDismiss:f,...h}=e,m=y.useContext(Sy),[g,v]=y.useState(null),b=(g==null?void 0:g.ownerDocument)??(globalThis==null?void 0:globalThis.document),[,j]=y.useState({}),k=Co(t,B=>v(B)),S=Array.from(m.layers),[N]=[...m.layersWithOutsidePointerEventsDisabled].slice(-1),E=S.indexOf(N),A=g?S.indexOf(g):-1,P=m.layersWithOutsidePointerEventsDisabled.size>0,_=A>=E,O=y.useRef(!1),D=SI(B=>{const F=B.target;if(!(F instanceof Node))return;const Y=[...m.branches].some(H=>H.contains(F));!_||Y||(o==null||o(B),u==null||u(B),B.defaultPrevented||f==null||f())},{ownerDocument:b,deferPointerDownOutside:n,isDeferredPointerDownOutsideRef:O,dismissableSurfaces:m.dismissableSurfaces}),U=NI(B=>{if(n&&O.current)return;const F=B.target;[...m.branches].some(H=>H.contains(F))||(c==null||c(B),u==null||u(B),B.defaultPrevented||f==null||f())},b);return vI(B=>{A===m.layers.size-1&&(a==null||a(B),!B.defaultPrevented&&f&&(B.preventDefault(),f()))},b),y.useEffect(()=>{if(g)return r&&(m.layersWithOutsidePointerEventsDisabled.size===0&&(kw=b.body.style.pointerEvents,b.body.style.pointerEvents="none"),m.layersWithOutsidePointerEventsDisabled.add(g)),m.layers.add(g),jw(),()=>{r&&(m.layersWithOutsidePointerEventsDisabled.delete(g),m.layersWithOutsidePointerEventsDisabled.size===0&&(b.body.style.pointerEvents=kw))}},[g,b,r,m]),y.useEffect(()=>()=>{g&&(m.layers.delete(g),m.layersWithOutsidePointerEventsDisabled.delete(g),jw())},[g,m]),y.useEffect(()=>{const B=()=>j({});return document.addEventListener(fv,B),()=>document.removeEventListener(fv,B)},[]),l.jsx(Xt.div,{...h,ref:k,style:{pointerEvents:P?_?"auto":"none":void 0,...e.style},onFocusCapture:ba(e.onFocusCapture,U.onFocusCapture),onBlurCapture:ba(e.onBlurCapture,U.onBlurCapture),onPointerDownCapture:ba(e.onPointerDownCapture,D.onPointerDownCapture)})});LN.displayName=yI;var wI="DismissableLayerBranch",kI=y.forwardRef((e,t)=>{const r=y.useContext(Sy),n=y.useRef(null),a=Co(t,n);return y.useEffect(()=>{const o=n.current;if(o)return r.branches.add(o),()=>{r.branches.delete(o)}},[r.branches]),l.jsx(Xt.div,{...e,ref:a})});kI.displayName=wI;function jI(){const e=y.useContext(Sy),[t,r]=y.useState(null);return y.useEffect(()=>{if(t)return e.dismissableSurfaces.add(t),()=>{e.dismissableSurfaces.delete(t)}},[t,e.dismissableSurfaces]),r}function SI(e,t){const{ownerDocument:r=globalThis==null?void 0:globalThis.document,deferPointerDownOutside:n=!1,isDeferredPointerDownOutsideRef:a,dismissableSurfaces:o}=t,c=Eu(e),u=y.useRef(!1),f=y.useRef(!1),h=y.useRef(new Map),m=y.useRef(()=>{});return y.useEffect(()=>{function g(){f.current=!1,a.current=!1,h.current.clear()}function v(){return Array.from(h.current.values()).some(Boolean)}function b(E){if(!f.current)return;const A=E.target;A instanceof Node&&[...o].some(_=>_.contains(A))||h.current.set(E.type,!0),E.type==="click"&&window.setTimeout(()=>{f.current&&m.current()},0)}function j(E){f.current&&h.current.set(E.type,!1)}const k=E=>{if(E.target&&!u.current){let A=function(){r.removeEventListener("click",m.current);const _=v();g(),_||$N(xI,c,P,{discrete:!0})};const P={originalEvent:E};f.current=!0,a.current=n&&E.button===0,h.current.clear(),!n||E.button!==0?A():(r.removeEventListener("click",m.current),m.current=A,r.addEventListener("click",m.current,{once:!0}))}else r.removeEventListener("click",m.current),g();u.current=!1},S=["pointerup","mousedown","mouseup","touchstart","touchend","click"];for(const E of S)r.addEventListener(E,b,!0),r.addEventListener(E,j);const N=window.setTimeout(()=>{r.addEventListener("pointerdown",k)},0);return()=>{window.clearTimeout(N),r.removeEventListener("pointerdown",k),r.removeEventListener("click",m.current);for(const E of S)r.removeEventListener(E,b,!0),r.removeEventListener(E,j)}},[r,c,n,a,o]),{onPointerDownCapture:()=>u.current=!0}}function NI(e,t=globalThis==null?void 0:globalThis.document){const r=Eu(e),n=y.useRef(!1);return y.useEffect(()=>{const a=o=>{o.target&&!n.current&&$N(bI,r,{originalEvent:o},{discrete:!1})};return t.addEventListener("focusin",a),()=>t.removeEventListener("focusin",a)},[t,r]),{onFocusCapture:()=>n.current=!0,onBlurCapture:()=>n.current=!1}}function jw(){const e=new CustomEvent(fv);document.dispatchEvent(e)}function $N(e,t,r,{discrete:n}){const a=r.originalEvent.target,o=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:r});t&&a.addEventListener(e,t,{once:!0}),n?gI(a,o):a.dispatchEvent(o)}var rg="focusScope.autoFocusOnMount",ng="focusScope.autoFocusOnUnmount",Sw={bubbles:!1,cancelable:!0},EI="FocusScope",zN=y.forwardRef((e,t)=>{const{loop:r=!1,trapped:n=!1,onMountAutoFocus:a,onUnmountAutoFocus:o,...c}=e,[u,f]=y.useState(null),h=Eu(a),m=Eu(o),g=y.useRef(null),v=Co(t,k=>f(k)),b=y.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;y.useEffect(()=>{if(n){let k=function(A){if(b.paused||!u)return;const P=A.target;u.contains(P)?g.current=P:ia(g.current,{select:!0})},S=function(A){if(b.paused||!u)return;const P=A.relatedTarget;P!==null&&(u.contains(P)||ia(g.current,{select:!0}))},N=function(A){if(document.activeElement===document.body)for(const _ of A)_.removedNodes.length>0&&ia(u)};document.addEventListener("focusin",k),document.addEventListener("focusout",S);const E=new MutationObserver(N);return u&&E.observe(u,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",k),document.removeEventListener("focusout",S),E.disconnect()}}},[n,u,b.paused]),y.useEffect(()=>{if(u){Ew.add(b);const k=document.activeElement;if(!u.contains(k)){const N=new CustomEvent(rg,Sw);u.addEventListener(rg,h),u.dispatchEvent(N),N.defaultPrevented||(AI(MI(FN(u)),{select:!0}),document.activeElement===k&&ia(u))}return()=>{u.removeEventListener(rg,h),setTimeout(()=>{const N=new CustomEvent(ng,Sw);u.addEventListener(ng,m),u.dispatchEvent(N),N.defaultPrevented||ia(k??document.body,{select:!0}),u.removeEventListener(ng,m),Ew.remove(b)},0)}}},[u,h,m,b]);const j=y.useCallback(k=>{if(!r&&!n||b.paused)return;const S=k.key==="Tab"&&!k.altKey&&!k.ctrlKey&&!k.metaKey,N=document.activeElement;if(S&&N){const E=k.currentTarget,[A,P]=CI(E);A&&P?!k.shiftKey&&N===P?(k.preventDefault(),r&&ia(A,{select:!0})):k.shiftKey&&N===A&&(k.preventDefault(),r&&ia(P,{select:!0})):N===E&&k.preventDefault()}},[r,n,b.paused]);return l.jsx(Xt.div,{tabIndex:-1,...c,ref:v,onKeyDown:j})});zN.displayName=EI;function AI(e,{select:t=!1}={}){const r=document.activeElement;for(const n of e)if(ia(n,{select:t}),document.activeElement!==r)return}function CI(e){const t=FN(e),r=Nw(t,e),n=Nw(t.reverse(),e);return[r,n]}function FN(e){const t=[],r=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:n=>{const a=n.tagName==="INPUT"&&n.type==="hidden";return n.disabled||n.hidden||a?NodeFilter.FILTER_SKIP:n.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;r.nextNode();)t.push(r.currentNode);return t}function Nw(e,t){for(const r of e)if(!PI(r,{upTo:t}))return r}function PI(e,{upTo:t}){if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(t!==void 0&&e===t)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1}function OI(e){return e instanceof HTMLInputElement&&"select"in e}function ia(e,{select:t=!1}={}){if(e&&e.focus){const r=document.activeElement;e.focus({preventScroll:!0}),e!==r&&OI(e)&&t&&e.select()}}var Ew=_I();function _I(){let e=[];return{add(t){const r=e[0];t!==r&&(r==null||r.pause()),e=Aw(e,t),e.unshift(t)},remove(t){var r;e=Aw(e,t),(r=e[0])==null||r.resume()}}}function Aw(e,t){const r=[...e],n=r.indexOf(t);return n!==-1&&r.splice(n,1),r}function MI(e){return e.filter(t=>t.tagName!=="A")}var II="Portal",BN=y.forwardRef((e,t)=>{var u;const{container:r,...n}=e,[a,o]=y.useState(!1);Nu(()=>o(!0),[]);const c=r||a&&((u=globalThis==null?void 0:globalThis.document)==null?void 0:u.body);return c?fh.createPortal(l.jsx(Xt.div,{...n,ref:t}),c):null});BN.displayName=II;function TI(e,t){return y.useReducer((r,n)=>t[r][n]??r,e)}var hh=e=>{const{present:t,children:r}=e,n=DI(t),a=typeof r=="function"?r({present:n.isPresent}):y.Children.only(r),o=RI(n.ref,LI(a));return typeof r=="function"||n.isPresent?y.cloneElement(a,{ref:o}):null};hh.displayName="Presence";function DI(e){const[t,r]=y.useState(),n=y.useRef(null),a=y.useRef(e),o=y.useRef("none"),c=e?"mounted":"unmounted",[u,f]=TI(c,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return y.useEffect(()=>{const h=Ed(n.current);o.current=u==="mounted"?h:"none"},[u]),Nu(()=>{const h=n.current,m=a.current;if(m!==e){const v=o.current,b=Ed(h);e?f("MOUNT"):b==="none"||(h==null?void 0:h.display)==="none"?f("UNMOUNT"):f(m&&v!==b?"ANIMATION_OUT":"UNMOUNT"),a.current=e}},[e,f]),Nu(()=>{if(t){let h;const m=t.ownerDocument.defaultView??window,g=b=>{const k=Ed(n.current).includes(CSS.escape(b.animationName));if(b.target===t&&k&&(f("ANIMATION_END"),!a.current)){const S=t.style.animationFillMode;t.style.animationFillMode="forwards",h=m.setTimeout(()=>{t.style.animationFillMode==="forwards"&&(t.style.animationFillMode=S)})}},v=b=>{b.target===t&&(o.current=Ed(n.current))};return t.addEventListener("animationstart",v),t.addEventListener("animationcancel",g),t.addEventListener("animationend",g),()=>{m.clearTimeout(h),t.removeEventListener("animationstart",v),t.removeEventListener("animationcancel",g),t.removeEventListener("animationend",g)}}else f("ANIMATION_END")},[t,f]),{isPresent:["mounted","unmountSuspended"].includes(u),ref:y.useCallback(h=>{n.current=h?getComputedStyle(h):null,r(h)},[])}}function Cw(e,t){if(typeof e=="function")return e(t);e!=null&&(e.current=t)}function RI(...e){const t=y.useRef(e);return t.current=e,y.useCallback(r=>{const n=t.current;let a=!1;const o=n.map(c=>{const u=Cw(c,r);return!a&&typeof u=="function"&&(a=!0),u});if(a)return()=>{for(let c=0;c{_n||(_n={start:Pw(),end:Pw()});const{start:e,end:t}=_n;return document.body.firstElementChild!==e&&document.body.insertAdjacentElement("afterbegin",e),document.body.lastElementChild!==t&&document.body.insertAdjacentElement("beforeend",t),Ad++,()=>{Ad===1&&(_n==null||_n.start.remove(),_n==null||_n.end.remove(),_n=null),Ad=Math.max(0,Ad-1)}},[])}function Pw(){const e=document.createElement("span");return e.setAttribute("data-radix-focus-guard",""),e.tabIndex=0,e.style.outline="none",e.style.opacity="0",e.style.position="fixed",e.style.pointerEvents="none",e}var $n=function(){return $n=Object.assign||function(t){for(var r,n=1,a=arguments.length;n"u")return tT;var t=rT(e),r=document.documentElement.clientWidth,n=window.innerWidth;return{left:t[0],top:t[1],right:t[2],gap:Math.max(0,n-r+t[2]-t[0])}},iT=KN(),js="data-scroll-locked",aT=function(e,t,r,n){var a=e.left,o=e.top,c=e.right,u=e.gap;return r===void 0&&(r="margin"),` - .`.concat(FI,` { - overflow: hidden `).concat(n,`; - padding-right: `).concat(u,"px ").concat(n,`; - } - body[`).concat(js,`] { - overflow: hidden `).concat(n,`; - overscroll-behavior: contain; - `).concat([t&&"position: relative ".concat(n,";"),r==="margin"&&` - padding-left: `.concat(a,`px; - padding-top: `).concat(o,`px; - padding-right: `).concat(c,`px; - margin-left:0; - margin-top:0; - margin-right: `).concat(u,"px ").concat(n,`; - `),r==="padding"&&"padding-right: ".concat(u,"px ").concat(n,";")].filter(Boolean).join(""),` - } - - .`).concat(Yd,` { - right: `).concat(u,"px ").concat(n,`; - } - - .`).concat(Xd,` { - margin-right: `).concat(u,"px ").concat(n,`; - } - - .`).concat(Yd," .").concat(Yd,` { - right: 0 `).concat(n,`; - } - - .`).concat(Xd," .").concat(Xd,` { - margin-right: 0 `).concat(n,`; - } - - body[`).concat(js,`] { - `).concat(BI,": ").concat(u,`px; - } -`)},_w=function(){var e=parseInt(document.body.getAttribute(js)||"0",10);return isFinite(e)?e:0},oT=function(){y.useEffect(function(){return document.body.setAttribute(js,(_w()+1).toString()),function(){var e=_w()-1;e<=0?document.body.removeAttribute(js):document.body.setAttribute(js,e.toString())}},[])},sT=function(e){var t=e.noRelative,r=e.noImportant,n=e.gapMode,a=n===void 0?"margin":n;oT();var o=y.useMemo(function(){return nT(a)},[a]);return y.createElement(iT,{styles:aT(o,!t,a,r?"":"!important")})},hv=!1;if(typeof window<"u")try{var Cd=Object.defineProperty({},"passive",{get:function(){return hv=!0,!0}});window.addEventListener("test",Cd,Cd),window.removeEventListener("test",Cd,Cd)}catch{hv=!1}var as=hv?{passive:!1}:!1,lT=function(e){return e.tagName==="TEXTAREA"},GN=function(e,t){if(!(e instanceof Element))return!1;var r=window.getComputedStyle(e);return r[t]!=="hidden"&&!(r.overflowY===r.overflowX&&!lT(e)&&r[t]==="visible")},uT=function(e){return GN(e,"overflowY")},cT=function(e){return GN(e,"overflowX")},Mw=function(e,t){var r=t.ownerDocument,n=t;do{typeof ShadowRoot<"u"&&n instanceof ShadowRoot&&(n=n.host);var a=VN(e,n);if(a){var o=qN(e,n),c=o[1],u=o[2];if(c>u)return!0}n=n.parentNode}while(n&&n!==r.body);return!1},dT=function(e){var t=e.scrollTop,r=e.scrollHeight,n=e.clientHeight;return[t,r,n]},fT=function(e){var t=e.scrollLeft,r=e.scrollWidth,n=e.clientWidth;return[t,r,n]},VN=function(e,t){return e==="v"?uT(t):cT(t)},qN=function(e,t){return e==="v"?dT(t):fT(t)},hT=function(e,t){return e==="h"&&t==="rtl"?-1:1},mT=function(e,t,r,n,a){var o=hT(e,window.getComputedStyle(t).direction),c=o*n,u=r.target,f=t.contains(u),h=!1,m=c>0,g=0,v=0;do{if(!u)break;var b=qN(e,u),j=b[0],k=b[1],S=b[2],N=k-S-o*j;(j||N)&&VN(e,u)&&(g+=N,v+=j);var E=u.parentNode;u=E&&E.nodeType===Node.DOCUMENT_FRAGMENT_NODE?E.host:E}while(!f&&u!==document.body||f&&(t.contains(u)||t===u));return(m&&Math.abs(g)<1||!m&&Math.abs(v)<1)&&(h=!0),h},Pd=function(e){return"changedTouches"in e?[e.changedTouches[0].clientX,e.changedTouches[0].clientY]:[0,0]},Iw=function(e){return[e.deltaX,e.deltaY]},Tw=function(e){return e&&"current"in e?e.current:e},pT=function(e,t){return e[0]===t[0]&&e[1]===t[1]},gT=function(e){return` - .block-interactivity-`.concat(e,` {pointer-events: none;} - .allow-interactivity-`).concat(e,` {pointer-events: all;} -`)},vT=0,os=[];function yT(e){var t=y.useRef([]),r=y.useRef([0,0]),n=y.useRef(),a=y.useState(vT++)[0],o=y.useState(KN)[0],c=y.useRef(e);y.useEffect(function(){c.current=e},[e]),y.useEffect(function(){if(e.inert){document.body.classList.add("block-interactivity-".concat(a));var k=zI([e.lockRef.current],(e.shards||[]).map(Tw),!0).filter(Boolean);return k.forEach(function(S){return S.classList.add("allow-interactivity-".concat(a))}),function(){document.body.classList.remove("block-interactivity-".concat(a)),k.forEach(function(S){return S.classList.remove("allow-interactivity-".concat(a))})}}},[e.inert,e.lockRef.current,e.shards]);var u=y.useCallback(function(k,S){if("touches"in k&&k.touches.length===2||k.type==="wheel"&&k.ctrlKey)return!c.current.allowPinchZoom;var N=Pd(k),E=r.current,A="deltaX"in k?k.deltaX:E[0]-N[0],P="deltaY"in k?k.deltaY:E[1]-N[1],_,O=k.target,D=Math.abs(A)>Math.abs(P)?"h":"v";if("touches"in k&&D==="h"&&O.type==="range")return!1;var U=window.getSelection(),B=U&&U.anchorNode,F=B?B===O||B.contains(O):!1;if(F)return!1;var Y=Mw(D,O);if(!Y)return!0;if(Y?_=D:(_=D==="v"?"h":"v",Y=Mw(D,O)),!Y)return!1;if(!n.current&&"changedTouches"in k&&(A||P)&&(n.current=_),!_)return!0;var H=n.current||_;return mT(H,S,k,H==="h"?A:P)},[]),f=y.useCallback(function(k){var S=k;if(!(!os.length||os[os.length-1]!==o)){var N="deltaY"in S?Iw(S):Pd(S),E=t.current.filter(function(_){return _.name===S.type&&(_.target===S.target||S.target===_.shadowParent)&&pT(_.delta,N)})[0];if(E&&E.should){S.cancelable&&S.preventDefault();return}if(!E){var A=(c.current.shards||[]).map(Tw).filter(Boolean).filter(function(_){return _.contains(S.target)}),P=A.length>0?u(S,A[0]):!c.current.noIsolation;P&&S.cancelable&&S.preventDefault()}}},[]),h=y.useCallback(function(k,S,N,E){var A={name:k,delta:S,target:N,should:E,shadowParent:xT(N)};t.current.push(A),setTimeout(function(){t.current=t.current.filter(function(P){return P!==A})},1)},[]),m=y.useCallback(function(k){r.current=Pd(k),n.current=void 0},[]),g=y.useCallback(function(k){h(k.type,Iw(k),k.target,u(k,e.lockRef.current))},[]),v=y.useCallback(function(k){h(k.type,Pd(k),k.target,u(k,e.lockRef.current))},[]);y.useEffect(function(){return os.push(o),e.setCallbacks({onScrollCapture:g,onWheelCapture:g,onTouchMoveCapture:v}),document.addEventListener("wheel",f,as),document.addEventListener("touchmove",f,as),document.addEventListener("touchstart",m,as),function(){os=os.filter(function(k){return k!==o}),document.removeEventListener("wheel",f,as),document.removeEventListener("touchmove",f,as),document.removeEventListener("touchstart",m,as)}},[]);var b=e.removeScrollBar,j=e.inert;return y.createElement(y.Fragment,null,j?y.createElement(o,{styles:gT(a)}):null,b?y.createElement(sT,{noRelative:e.noRelative,gapMode:e.gapMode}):null)}function xT(e){for(var t=null;e!==null;)e instanceof ShadowRoot&&(t=e.host,e=e.host),e=e.parentNode;return t}const bT=qI(WN,yT);var QN=y.forwardRef(function(e,t){return y.createElement(mh,$n({},e,{ref:t,sideCar:bT}))});QN.classNames=mh.classNames;var wT=function(e){if(typeof document>"u")return null;var t=Array.isArray(e)?e[0]:e;return t.ownerDocument.body},ss=new WeakMap,Od=new WeakMap,_d={},sg=0,YN=function(e){return e&&(e.host||YN(e.parentNode))},kT=function(e,t){return t.map(function(r){if(e.contains(r))return r;var n=YN(r);return n&&e.contains(n)?n:(console.error("aria-hidden",r,"in not contained inside",e,". Doing nothing"),null)}).filter(function(r){return!!r})},jT=function(e,t,r,n){var a=kT(t,Array.isArray(e)?e:[e]);_d[r]||(_d[r]=new WeakMap);var o=_d[r],c=[],u=new Set,f=new Set(a),h=function(g){!g||u.has(g)||(u.add(g),h(g.parentNode))};a.forEach(h);var m=function(g){!g||f.has(g)||Array.prototype.forEach.call(g.children,function(v){if(u.has(v))m(v);else try{var b=v.getAttribute(n),j=b!==null&&b!=="false",k=(ss.get(v)||0)+1,S=(o.get(v)||0)+1;ss.set(v,k),o.set(v,S),c.push(v),k===1&&j&&Od.set(v,!0),S===1&&v.setAttribute(r,"true"),j||v.setAttribute(n,"true")}catch(N){console.error("aria-hidden: cannot operate on ",v,N)}})};return m(t),u.clear(),sg++,function(){c.forEach(function(g){var v=ss.get(g)-1,b=o.get(g)-1;ss.set(g,v),o.set(g,b),v||(Od.has(g)||g.removeAttribute(n),Od.delete(g)),b||g.removeAttribute(r)}),sg--,sg||(ss=new WeakMap,ss=new WeakMap,Od=new WeakMap,_d={})}},ST=function(e,t,r){r===void 0&&(r="data-aria-hidden");var n=Array.from(Array.isArray(e)?e:[e]),a=wT(e);return a?(n.push.apply(n,Array.from(a.querySelectorAll("[aria-live], script"))),jT(n,a,r,"aria-hidden")):function(){return null}},ph="Dialog",[XN]=Z4(ph),[NT,Sn]=XN(ph),ZN=e=>{const{__scopeDialog:t,children:r,open:n,defaultOpen:a,onOpenChange:o,modal:c=!0}=e,u=y.useRef(null),f=y.useRef(null),[h,m]=nI({prop:n,defaultProp:a??!1,onChange:o,caller:ph});return l.jsx(NT,{scope:t,triggerRef:u,contentRef:f,contentId:vi(),titleId:vi(),descriptionId:vi(),open:h,onOpenChange:m,onOpenToggle:y.useCallback(()=>m(g=>!g),[m]),modal:c,children:r})};ZN.displayName=ph;var JN="DialogTrigger",ET=y.forwardRef((e,t)=>{const{__scopeDialog:r,...n}=e,a=Sn(JN,r),o=Co(t,a.triggerRef);return l.jsx(Xt.button,{type:"button","aria-haspopup":"dialog","aria-expanded":a.open,"aria-controls":a.open?a.contentId:void 0,"data-state":Ey(a.open),...n,ref:o,onClick:ba(e.onClick,a.onOpenToggle)})});ET.displayName=JN;var Ny="DialogPortal",[AT,eE]=XN(Ny,{forceMount:void 0}),tE=e=>{const{__scopeDialog:t,forceMount:r,children:n,container:a}=e,o=Sn(Ny,t);return l.jsx(AT,{scope:t,forceMount:r,children:y.Children.map(n,c=>l.jsx(hh,{present:r||o.open,children:l.jsx(BN,{asChild:!0,container:a,children:c})}))})};tE.displayName=Ny;var hf="DialogOverlay",rE=y.forwardRef((e,t)=>{const r=eE(hf,e.__scopeDialog),{forceMount:n=r.forceMount,...a}=e,o=Sn(hf,e.__scopeDialog);return o.modal?l.jsx(hh,{present:n||o.open,children:l.jsx(PT,{...a,ref:t})}):null});rE.displayName=hf;var CT=RN("DialogOverlay.RemoveScroll"),PT=y.forwardRef((e,t)=>{const{__scopeDialog:r,...n}=e,a=Sn(hf,r),o=jI(),c=Co(t,o);return l.jsx(QN,{as:CT,allowPinchZoom:!0,shards:[a.contentRef],children:l.jsx(Xt.div,{"data-state":Ey(a.open),...n,ref:c,style:{pointerEvents:"auto",...n.style}})})}),Ks="DialogContent",nE=y.forwardRef((e,t)=>{const r=eE(Ks,e.__scopeDialog),{forceMount:n=r.forceMount,...a}=e,o=Sn(Ks,e.__scopeDialog);return l.jsx(hh,{present:n||o.open,children:o.modal?l.jsx(OT,{...a,ref:t}):l.jsx(_T,{...a,ref:t})})});nE.displayName=Ks;var OT=y.forwardRef((e,t)=>{const r=Sn(Ks,e.__scopeDialog),n=y.useRef(null),a=Co(t,r.contentRef,n);return y.useEffect(()=>{const o=n.current;if(o)return ST(o)},[]),l.jsx(iE,{...e,ref:a,trapFocus:r.open,disableOutsidePointerEvents:r.open,onCloseAutoFocus:ba(e.onCloseAutoFocus,o=>{var c;o.preventDefault(),(c=r.triggerRef.current)==null||c.focus()}),onPointerDownOutside:ba(e.onPointerDownOutside,o=>{const c=o.detail.originalEvent,u=c.button===0&&c.ctrlKey===!0;(c.button===2||u)&&o.preventDefault()}),onFocusOutside:ba(e.onFocusOutside,o=>o.preventDefault())})}),_T=y.forwardRef((e,t)=>{const r=Sn(Ks,e.__scopeDialog),n=y.useRef(!1),a=y.useRef(!1);return l.jsx(iE,{...e,ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:o=>{var c,u;(c=e.onCloseAutoFocus)==null||c.call(e,o),o.defaultPrevented||(n.current||(u=r.triggerRef.current)==null||u.focus(),o.preventDefault()),n.current=!1,a.current=!1},onInteractOutside:o=>{var f,h;(f=e.onInteractOutside)==null||f.call(e,o),o.defaultPrevented||(n.current=!0,o.detail.originalEvent.type==="pointerdown"&&(a.current=!0));const c=o.target;((h=r.triggerRef.current)==null?void 0:h.contains(c))&&o.preventDefault(),o.detail.originalEvent.type==="focusin"&&a.current&&o.preventDefault()}})}),iE=y.forwardRef((e,t)=>{const{__scopeDialog:r,trapFocus:n,onOpenAutoFocus:a,onCloseAutoFocus:o,...c}=e,u=Sn(Ks,r);return $I(),l.jsx(l.Fragment,{children:l.jsx(zN,{asChild:!0,loop:!0,trapped:n,onMountAutoFocus:a,onUnmountAutoFocus:o,children:l.jsx(LN,{role:"dialog",id:u.contentId,"aria-describedby":u.descriptionId,"aria-labelledby":u.titleId,"data-state":Ey(u.open),...c,ref:t,deferPointerDownOutside:!0,onDismiss:()=>u.onOpenChange(!1)})})})}),aE="DialogTitle",MT=y.forwardRef((e,t)=>{const{__scopeDialog:r,...n}=e,a=Sn(aE,r);return l.jsx(Xt.h2,{id:a.titleId,...n,ref:t})});MT.displayName=aE;var oE="DialogDescription",IT=y.forwardRef((e,t)=>{const{__scopeDialog:r,...n}=e,a=Sn(oE,r);return l.jsx(Xt.p,{id:a.descriptionId,...n,ref:t})});IT.displayName=oE;var sE="DialogClose",TT=y.forwardRef((e,t)=>{const{__scopeDialog:r,...n}=e,a=Sn(sE,r);return l.jsx(Xt.button,{type:"button",...n,ref:t,onClick:ba(e.onClick,()=>a.onOpenChange(!1))})});TT.displayName=sE;function Ey(e){return e?"open":"closed"}var Zl='[cmdk-group=""]',lg='[cmdk-group-items=""]',DT='[cmdk-group-heading=""]',lE='[cmdk-item=""]',Dw=`${lE}:not([aria-disabled="true"])`,mv="cmdk-item-select",gs="data-value",RT=(e,t,r)=>X4(e,t,r),uE=y.createContext(void 0),Yu=()=>y.useContext(uE),cE=y.createContext(void 0),Ay=()=>y.useContext(cE),dE=y.createContext(void 0),fE=y.forwardRef((e,t)=>{let r=vs(()=>{var M,K;return{search:"",value:(K=(M=e.value)!=null?M:e.defaultValue)!=null?K:"",selectedItemId:void 0,filtered:{count:0,items:new Map,groups:new Set}}}),n=vs(()=>new Set),a=vs(()=>new Map),o=vs(()=>new Map),c=vs(()=>new Set),u=hE(e),{label:f,children:h,value:m,onValueChange:g,filter:v,shouldFilter:b,loop:j,disablePointerSelection:k=!1,vimBindings:S=!0,...N}=e,E=vi(),A=vi(),P=vi(),_=y.useRef(null),O=VT();yo(()=>{if(m!==void 0){let M=m.trim();r.current.value=M,D.emit()}},[m]),yo(()=>{O(6,pe)},[]);let D=y.useMemo(()=>({subscribe:M=>(c.current.add(M),()=>c.current.delete(M)),snapshot:()=>r.current,setState:(M,K,ne)=>{var Z,me,ge,Pe;if(!Object.is(r.current[M],K)){if(r.current[M]=K,M==="search")H(),F(),O(1,Y);else if(M==="value"){if(document.activeElement.hasAttribute("cmdk-input")||document.activeElement.hasAttribute("cmdk-root")){let re=document.getElementById(P);re?re.focus():(Z=document.getElementById(E))==null||Z.focus()}if(O(7,()=>{var re;r.current.selectedItemId=(re=ue())==null?void 0:re.id,D.emit()}),ne||O(5,pe),((me=u.current)==null?void 0:me.value)!==void 0){let re=K??"";(Pe=(ge=u.current).onValueChange)==null||Pe.call(ge,re);return}}D.emit()}},emit:()=>{c.current.forEach(M=>M())}}),[]),U=y.useMemo(()=>({value:(M,K,ne)=>{var Z;K!==((Z=o.current.get(M))==null?void 0:Z.value)&&(o.current.set(M,{value:K,keywords:ne}),r.current.filtered.items.set(M,B(K,ne)),O(2,()=>{F(),D.emit()}))},item:(M,K)=>(n.current.add(M),K&&(a.current.has(K)?a.current.get(K).add(M):a.current.set(K,new Set([M]))),O(3,()=>{H(),F(),r.current.value||Y(),D.emit()}),()=>{o.current.delete(M),n.current.delete(M),r.current.filtered.items.delete(M);let ne=ue();O(4,()=>{H(),(ne==null?void 0:ne.getAttribute("id"))===M&&Y(),D.emit()})}),group:M=>(a.current.has(M)||a.current.set(M,new Set),()=>{o.current.delete(M),a.current.delete(M)}),filter:()=>u.current.shouldFilter,label:f||e["aria-label"],getDisablePointerSelection:()=>u.current.disablePointerSelection,listId:E,inputId:P,labelId:A,listInnerRef:_}),[]);function B(M,K){var ne,Z;let me=(Z=(ne=u.current)==null?void 0:ne.filter)!=null?Z:RT;return M?me(M,r.current.search,K):0}function F(){if(!r.current.search||u.current.shouldFilter===!1)return;let M=r.current.filtered.items,K=[];r.current.filtered.groups.forEach(Z=>{let me=a.current.get(Z),ge=0;me.forEach(Pe=>{let re=M.get(Pe);ge=Math.max(re,ge)}),K.push([Z,ge])});let ne=_.current;he().sort((Z,me)=>{var ge,Pe;let re=Z.getAttribute("id"),xe=me.getAttribute("id");return((ge=M.get(xe))!=null?ge:0)-((Pe=M.get(re))!=null?Pe:0)}).forEach(Z=>{let me=Z.closest(lg);me?me.appendChild(Z.parentElement===me?Z:Z.closest(`${lg} > *`)):ne.appendChild(Z.parentElement===ne?Z:Z.closest(`${lg} > *`))}),K.sort((Z,me)=>me[1]-Z[1]).forEach(Z=>{var me;let ge=(me=_.current)==null?void 0:me.querySelector(`${Zl}[${gs}="${encodeURIComponent(Z[0])}"]`);ge==null||ge.parentElement.appendChild(ge)})}function Y(){let M=he().find(ne=>ne.getAttribute("aria-disabled")!=="true"),K=M==null?void 0:M.getAttribute(gs);D.setState("value",K||void 0)}function H(){var M,K,ne,Z;if(!r.current.search||u.current.shouldFilter===!1){r.current.filtered.count=n.current.size;return}r.current.filtered.groups=new Set;let me=0;for(let ge of n.current){let Pe=(K=(M=o.current.get(ge))==null?void 0:M.value)!=null?K:"",re=(Z=(ne=o.current.get(ge))==null?void 0:ne.keywords)!=null?Z:[],xe=B(Pe,re);r.current.filtered.items.set(ge,xe),xe>0&&me++}for(let[ge,Pe]of a.current)for(let re of Pe)if(r.current.filtered.items.get(re)>0){r.current.filtered.groups.add(ge);break}r.current.filtered.count=me}function pe(){var M,K,ne;let Z=ue();Z&&(((M=Z.parentElement)==null?void 0:M.firstChild)===Z&&((ne=(K=Z.closest(Zl))==null?void 0:K.querySelector(DT))==null||ne.scrollIntoView({block:"nearest"})),Z.scrollIntoView({block:"nearest"}))}function ue(){var M;return(M=_.current)==null?void 0:M.querySelector(`${lE}[aria-selected="true"]`)}function he(){var M;return Array.from(((M=_.current)==null?void 0:M.querySelectorAll(Dw))||[])}function ae(M){let K=he()[M];K&&D.setState("value",K.getAttribute(gs))}function se(M){var K;let ne=ue(),Z=he(),me=Z.findIndex(Pe=>Pe===ne),ge=Z[me+M];(K=u.current)!=null&&K.loop&&(ge=me+M<0?Z[Z.length-1]:me+M===Z.length?Z[0]:Z[me+M]),ge&&D.setState("value",ge.getAttribute(gs))}function X(M){let K=ue(),ne=K==null?void 0:K.closest(Zl),Z;for(;ne&&!Z;)ne=M>0?KT(ne,Zl):GT(ne,Zl),Z=ne==null?void 0:ne.querySelector(Dw);Z?D.setState("value",Z.getAttribute(gs)):se(M)}let te=()=>ae(he().length-1),J=M=>{M.preventDefault(),M.metaKey?te():M.altKey?X(1):se(1)},I=M=>{M.preventDefault(),M.metaKey?ae(0):M.altKey?X(-1):se(-1)};return y.createElement(Xt.div,{ref:t,tabIndex:-1,...N,"cmdk-root":"",onKeyDown:M=>{var K;(K=N.onKeyDown)==null||K.call(N,M);let ne=M.nativeEvent.isComposing||M.keyCode===229;if(!(M.defaultPrevented||ne))switch(M.key){case"n":case"j":{S&&M.ctrlKey&&J(M);break}case"ArrowDown":{J(M);break}case"p":case"k":{S&&M.ctrlKey&&I(M);break}case"ArrowUp":{I(M);break}case"Home":{M.preventDefault(),ae(0);break}case"End":{M.preventDefault(),te();break}case"Enter":{M.preventDefault();let Z=ue();if(Z){let me=new Event(mv);Z.dispatchEvent(me)}}}}},y.createElement("label",{"cmdk-label":"",htmlFor:U.inputId,id:U.labelId,style:QT},f),gh(e,M=>y.createElement(cE.Provider,{value:D},y.createElement(uE.Provider,{value:U},M))))}),LT=y.forwardRef((e,t)=>{var r,n;let a=vi(),o=y.useRef(null),c=y.useContext(dE),u=Yu(),f=hE(e),h=(n=(r=f.current)==null?void 0:r.forceMount)!=null?n:c==null?void 0:c.forceMount;yo(()=>{if(!h)return u.item(a,c==null?void 0:c.id)},[h]);let m=mE(a,o,[e.value,e.children,o],e.keywords),g=Ay(),v=ja(O=>O.value&&O.value===m.current),b=ja(O=>h||u.filter()===!1?!0:O.search?O.filtered.items.get(a)>0:!0);y.useEffect(()=>{let O=o.current;if(!(!O||e.disabled))return O.addEventListener(mv,j),()=>O.removeEventListener(mv,j)},[b,e.onSelect,e.disabled]);function j(){var O,D;k(),(D=(O=f.current).onSelect)==null||D.call(O,m.current)}function k(){g.setState("value",m.current,!0)}if(!b)return null;let{disabled:S,value:N,onSelect:E,forceMount:A,keywords:P,..._}=e;return y.createElement(Xt.div,{ref:Ws(o,t),..._,id:a,"cmdk-item":"",role:"option","aria-disabled":!!S,"aria-selected":!!v,"data-disabled":!!S,"data-selected":!!v,onPointerMove:S||u.getDisablePointerSelection()?void 0:k,onClick:S?void 0:j},e.children)}),$T=y.forwardRef((e,t)=>{let{heading:r,children:n,forceMount:a,...o}=e,c=vi(),u=y.useRef(null),f=y.useRef(null),h=vi(),m=Yu(),g=ja(b=>a||m.filter()===!1?!0:b.search?b.filtered.groups.has(c):!0);yo(()=>m.group(c),[]),mE(c,u,[e.value,e.heading,f]);let v=y.useMemo(()=>({id:c,forceMount:a}),[a]);return y.createElement(Xt.div,{ref:Ws(u,t),...o,"cmdk-group":"",role:"presentation",hidden:g?void 0:!0},r&&y.createElement("div",{ref:f,"cmdk-group-heading":"","aria-hidden":!0,id:h},r),gh(e,b=>y.createElement("div",{"cmdk-group-items":"",role:"group","aria-labelledby":r?h:void 0},y.createElement(dE.Provider,{value:v},b))))}),zT=y.forwardRef((e,t)=>{let{alwaysRender:r,...n}=e,a=y.useRef(null),o=ja(c=>!c.search);return!r&&!o?null:y.createElement(Xt.div,{ref:Ws(a,t),...n,"cmdk-separator":"",role:"separator"})}),FT=y.forwardRef((e,t)=>{let{onValueChange:r,...n}=e,a=e.value!=null,o=Ay(),c=ja(h=>h.search),u=ja(h=>h.selectedItemId),f=Yu();return y.useEffect(()=>{e.value!=null&&o.setState("search",e.value)},[e.value]),y.createElement(Xt.input,{ref:t,...n,"cmdk-input":"",autoComplete:"off",autoCorrect:"off",spellCheck:!1,"aria-autocomplete":"list",role:"combobox","aria-expanded":!0,"aria-controls":f.listId,"aria-labelledby":f.labelId,"aria-activedescendant":u,id:f.inputId,type:"text",value:a?e.value:c,onChange:h=>{a||o.setState("search",h.target.value),r==null||r(h.target.value)}})}),BT=y.forwardRef((e,t)=>{let{children:r,label:n="Suggestions",...a}=e,o=y.useRef(null),c=y.useRef(null),u=ja(h=>h.selectedItemId),f=Yu();return y.useEffect(()=>{if(c.current&&o.current){let h=c.current,m=o.current,g,v=new ResizeObserver(()=>{g=requestAnimationFrame(()=>{let b=h.offsetHeight;m.style.setProperty("--cmdk-list-height",b.toFixed(1)+"px")})});return v.observe(h),()=>{cancelAnimationFrame(g),v.unobserve(h)}}},[]),y.createElement(Xt.div,{ref:Ws(o,t),...a,"cmdk-list":"",role:"listbox",tabIndex:-1,"aria-activedescendant":u,"aria-label":n,id:f.listId},gh(e,h=>y.createElement("div",{ref:Ws(c,f.listInnerRef),"cmdk-list-sizer":""},h)))}),UT=y.forwardRef((e,t)=>{let{open:r,onOpenChange:n,overlayClassName:a,contentClassName:o,container:c,...u}=e;return y.createElement(ZN,{open:r,onOpenChange:n},y.createElement(tE,{container:c},y.createElement(rE,{"cmdk-overlay":"",className:a}),y.createElement(nE,{"aria-label":e.label,"cmdk-dialog":"",className:o},y.createElement(fE,{ref:t,...u}))))}),HT=y.forwardRef((e,t)=>ja(r=>r.filtered.count===0)?y.createElement(Xt.div,{ref:t,...e,"cmdk-empty":"",role:"presentation"}):null),WT=y.forwardRef((e,t)=>{let{progress:r,children:n,label:a="Loading...",...o}=e;return y.createElement(Xt.div,{ref:t,...o,"cmdk-loading":"",role:"progressbar","aria-valuenow":r,"aria-valuemin":0,"aria-valuemax":100,"aria-label":a},gh(e,c=>y.createElement("div",{"aria-hidden":!0},c)))}),ls=Object.assign(fE,{List:BT,Item:LT,Input:FT,Group:$T,Separator:zT,Dialog:UT,Empty:HT,Loading:WT});function KT(e,t){let r=e.nextElementSibling;for(;r;){if(r.matches(t))return r;r=r.nextElementSibling}}function GT(e,t){let r=e.previousElementSibling;for(;r;){if(r.matches(t))return r;r=r.previousElementSibling}}function hE(e){let t=y.useRef(e);return yo(()=>{t.current=e}),t}var yo=typeof window>"u"?y.useEffect:y.useLayoutEffect;function vs(e){let t=y.useRef();return t.current===void 0&&(t.current=e()),t}function ja(e){let t=Ay(),r=()=>e(t.snapshot());return y.useSyncExternalStore(t.subscribe,r,r)}function mE(e,t,r,n=[]){let a=y.useRef(),o=Yu();return yo(()=>{var c;let u=(()=>{var h;for(let m of r){if(typeof m=="string")return m.trim();if(typeof m=="object"&&"current"in m)return m.current?(h=m.current.textContent)==null?void 0:h.trim():a.current}})(),f=n.map(h=>h.trim());o.value(e,u,f),(c=t.current)==null||c.setAttribute(gs,u),a.current=u}),a}var VT=()=>{let[e,t]=y.useState(),r=vs(()=>new Map);return yo(()=>{r.current.forEach(n=>n()),r.current=new Map},[e]),(n,a)=>{r.current.set(n,a),t({})}};function qT(e){let t=e.type;return typeof t=="function"?t(e.props):"render"in t?t.render(e.props):e}function gh({asChild:e,children:t},r){return e&&y.isValidElement(t)?y.cloneElement(qT(t),{ref:t.ref},r(t.props.children)):r(t)}var QT={position:"absolute",width:"1px",height:"1px",padding:"0",margin:"-1px",overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0"};function YT({onNavigate:e}){const[t,r]=y.useState(!1);return y.useEffect(()=>{const n=a=>{(a.metaKey||a.ctrlKey)&&a.key.toLowerCase()==="k"&&(a.preventDefault(),r(o=>!o))};return document.addEventListener("keydown",n),()=>document.removeEventListener("keydown",n)},[]),l.jsx(ls.Dialog,{open:t,onOpenChange:r,label:"Befehlspalette",className:"fixed inset-0 z-50 flex items-start justify-center bg-black/50 p-4 pt-[12vh] overscroll-contain",onClick:()=>r(!1),children:l.jsxs("div",{className:"w-full max-w-lg overflow-hidden rounded-xl border border-border bg-popover text-popover-foreground shadow-2xl",onClick:n=>n.stopPropagation(),children:[l.jsx(ls.Input,{autoFocus:!0,placeholder:"Springe zu… (Modelle, Routing, System …)",className:"w-full border-b border-border bg-transparent px-4 py-3 text-sm outline-none placeholder:text-muted-foreground"}),l.jsxs(ls.List,{className:"max-h-80 overflow-y-auto p-2",children:[l.jsx(ls.Empty,{className:"px-3 py-6 text-center text-sm text-muted-foreground",children:"Nichts gefunden."}),l.jsx(ls.Group,{heading:"Bereiche",className:"px-1 py-1 text-xs text-muted-foreground",children:mu.map(n=>l.jsxs(ls.Item,{value:`${n.label} ${n.hint}`,onSelect:()=>{e(n.id),r(!1)},className:"flex cursor-pointer items-center gap-3 rounded-md px-3 py-2 text-sm text-foreground aria-selected:bg-accent aria-selected:text-accent-foreground",children:[l.jsx(n.icon,{className:"h-4 w-4 text-primary"}),l.jsx("span",{children:n.label}),l.jsx("span",{className:"ml-auto truncate text-xs text-muted-foreground",children:n.hint})]},n.id))})]})]})})}const pE="mc_expert_mode",pv="mc-expert-mode-change",XT=()=>{try{return localStorage.getItem(pE)==="true"}catch{return!1}};function ZT(e){return window.addEventListener(pv,e),window.addEventListener("storage",e),()=>{window.removeEventListener(pv,e),window.removeEventListener("storage",e)}}function Rw(e){localStorage.setItem(pE,String(e)),window.dispatchEvent(new Event(pv))}function gE(){return y.useSyncExternalStore(ZT,XT,()=>!1)}function vE(e){var t,r,n="";if(typeof e=="string"||typeof e=="number")n+=e;else if(typeof e=="object")if(Array.isArray(e)){var a=e.length;for(t=0;t{const t=tD(e),{conflictingClassGroups:r,conflictingClassGroupModifiers:n}=e;return{getClassGroupId:c=>{const u=c.split(Cy);return u[0]===""&&u.length!==1&&u.shift(),yE(u,t)||eD(c)},getConflictingClassGroupIds:(c,u)=>{const f=r[c]||[];return u&&n[c]?[...f,...n[c]]:f}}},yE=(e,t)=>{var c;if(e.length===0)return t.classGroupId;const r=e[0],n=t.nextPart.get(r),a=n?yE(e.slice(1),n):void 0;if(a)return a;if(t.validators.length===0)return;const o=e.join(Cy);return(c=t.validators.find(({validator:u})=>u(o)))==null?void 0:c.classGroupId},Lw=/^\[(.+)\]$/,eD=e=>{if(Lw.test(e)){const t=Lw.exec(e)[1],r=t==null?void 0:t.substring(0,t.indexOf(":"));if(r)return"arbitrary.."+r}},tD=e=>{const{theme:t,prefix:r}=e,n={nextPart:new Map,validators:[]};return nD(Object.entries(e.classGroups),r).forEach(([o,c])=>{gv(c,n,o,t)}),n},gv=(e,t,r,n)=>{e.forEach(a=>{if(typeof a=="string"){const o=a===""?t:$w(t,a);o.classGroupId=r;return}if(typeof a=="function"){if(rD(a)){gv(a(n),t,r,n);return}t.validators.push({validator:a,classGroupId:r});return}Object.entries(a).forEach(([o,c])=>{gv(c,$w(t,o),r,n)})})},$w=(e,t)=>{let r=e;return t.split(Cy).forEach(n=>{r.nextPart.has(n)||r.nextPart.set(n,{nextPart:new Map,validators:[]}),r=r.nextPart.get(n)}),r},rD=e=>e.isThemeGetter,nD=(e,t)=>t?e.map(([r,n])=>{const a=n.map(o=>typeof o=="string"?t+o:typeof o=="object"?Object.fromEntries(Object.entries(o).map(([c,u])=>[t+c,u])):o);return[r,a]}):e,iD=e=>{if(e<1)return{get:()=>{},set:()=>{}};let t=0,r=new Map,n=new Map;const a=(o,c)=>{r.set(o,c),t++,t>e&&(t=0,n=r,r=new Map)};return{get(o){let c=r.get(o);if(c!==void 0)return c;if((c=n.get(o))!==void 0)return a(o,c),c},set(o,c){r.has(o)?r.set(o,c):a(o,c)}}},xE="!",aD=e=>{const{separator:t,experimentalParseClassName:r}=e,n=t.length===1,a=t[0],o=t.length,c=u=>{const f=[];let h=0,m=0,g;for(let S=0;Sm?g-m:void 0;return{modifiers:f,hasImportantModifier:b,baseClassName:j,maybePostfixModifierPosition:k}};return r?u=>r({className:u,parseClassName:c}):c},oD=e=>{if(e.length<=1)return e;const t=[];let r=[];return e.forEach(n=>{n[0]==="["?(t.push(...r.sort(),n),r=[]):r.push(n)}),t.push(...r.sort()),t},sD=e=>({cache:iD(e.cacheSize),parseClassName:aD(e),...JT(e)}),lD=/\s+/,uD=(e,t)=>{const{parseClassName:r,getClassGroupId:n,getConflictingClassGroupIds:a}=t,o=[],c=e.trim().split(lD);let u="";for(let f=c.length-1;f>=0;f-=1){const h=c[f],{modifiers:m,hasImportantModifier:g,baseClassName:v,maybePostfixModifierPosition:b}=r(h);let j=!!b,k=n(j?v.substring(0,b):v);if(!k){if(!j){u=h+(u.length>0?" "+u:u);continue}if(k=n(v),!k){u=h+(u.length>0?" "+u:u);continue}j=!1}const S=oD(m).join(":"),N=g?S+xE:S,E=N+k;if(o.includes(E))continue;o.push(E);const A=a(k,j);for(let P=0;P0?" "+u:u)}return u};function cD(){let e=0,t,r,n="";for(;e{if(typeof e=="string")return e;let t,r="";for(let n=0;ng(m),e());return r=sD(h),n=r.cache.get,a=r.cache.set,o=u,u(f)}function u(f){const h=n(f);if(h)return h;const m=uD(f,r);return a(f,m),m}return function(){return o(cD.apply(null,arguments))}}const ot=e=>{const t=r=>r[e]||[];return t.isThemeGetter=!0,t},wE=/^\[(?:([a-z-]+):)?(.+)\]$/i,fD=/^\d+\/\d+$/,hD=new Set(["px","full","screen"]),mD=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,pD=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,gD=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,vD=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,yD=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,li=e=>Ss(e)||hD.has(e)||fD.test(e),ea=e=>rl(e,"length",ED),Ss=e=>!!e&&!Number.isNaN(Number(e)),ug=e=>rl(e,"number",Ss),Jl=e=>!!e&&Number.isInteger(Number(e)),xD=e=>e.endsWith("%")&&Ss(e.slice(0,-1)),$e=e=>wE.test(e),ta=e=>mD.test(e),bD=new Set(["length","size","percentage"]),wD=e=>rl(e,bD,kE),kD=e=>rl(e,"position",kE),jD=new Set(["image","url"]),SD=e=>rl(e,jD,CD),ND=e=>rl(e,"",AD),eu=()=>!0,rl=(e,t,r)=>{const n=wE.exec(e);return n?n[1]?typeof t=="string"?n[1]===t:t.has(n[1]):r(n[2]):!1},ED=e=>pD.test(e)&&!gD.test(e),kE=()=>!1,AD=e=>vD.test(e),CD=e=>yD.test(e),PD=()=>{const e=ot("colors"),t=ot("spacing"),r=ot("blur"),n=ot("brightness"),a=ot("borderColor"),o=ot("borderRadius"),c=ot("borderSpacing"),u=ot("borderWidth"),f=ot("contrast"),h=ot("grayscale"),m=ot("hueRotate"),g=ot("invert"),v=ot("gap"),b=ot("gradientColorStops"),j=ot("gradientColorStopPositions"),k=ot("inset"),S=ot("margin"),N=ot("opacity"),E=ot("padding"),A=ot("saturate"),P=ot("scale"),_=ot("sepia"),O=ot("skew"),D=ot("space"),U=ot("translate"),B=()=>["auto","contain","none"],F=()=>["auto","hidden","clip","visible","scroll"],Y=()=>["auto",$e,t],H=()=>[$e,t],pe=()=>["",li,ea],ue=()=>["auto",Ss,$e],he=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],ae=()=>["solid","dashed","dotted","double","none"],se=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],X=()=>["start","end","center","between","around","evenly","stretch"],te=()=>["","0",$e],J=()=>["auto","avoid","all","avoid-page","page","left","right","column"],I=()=>[Ss,$e];return{cacheSize:500,separator:":",theme:{colors:[eu],spacing:[li,ea],blur:["none","",ta,$e],brightness:I(),borderColor:[e],borderRadius:["none","","full",ta,$e],borderSpacing:H(),borderWidth:pe(),contrast:I(),grayscale:te(),hueRotate:I(),invert:te(),gap:H(),gradientColorStops:[e],gradientColorStopPositions:[xD,ea],inset:Y(),margin:Y(),opacity:I(),padding:H(),saturate:I(),scale:I(),sepia:te(),skew:I(),space:H(),translate:H()},classGroups:{aspect:[{aspect:["auto","square","video",$e]}],container:["container"],columns:[{columns:[ta]}],"break-after":[{"break-after":J()}],"break-before":[{"break-before":J()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...he(),$e]}],overflow:[{overflow:F()}],"overflow-x":[{"overflow-x":F()}],"overflow-y":[{"overflow-y":F()}],overscroll:[{overscroll:B()}],"overscroll-x":[{"overscroll-x":B()}],"overscroll-y":[{"overscroll-y":B()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[k]}],"inset-x":[{"inset-x":[k]}],"inset-y":[{"inset-y":[k]}],start:[{start:[k]}],end:[{end:[k]}],top:[{top:[k]}],right:[{right:[k]}],bottom:[{bottom:[k]}],left:[{left:[k]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",Jl,$e]}],basis:[{basis:Y()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",$e]}],grow:[{grow:te()}],shrink:[{shrink:te()}],order:[{order:["first","last","none",Jl,$e]}],"grid-cols":[{"grid-cols":[eu]}],"col-start-end":[{col:["auto",{span:["full",Jl,$e]},$e]}],"col-start":[{"col-start":ue()}],"col-end":[{"col-end":ue()}],"grid-rows":[{"grid-rows":[eu]}],"row-start-end":[{row:["auto",{span:[Jl,$e]},$e]}],"row-start":[{"row-start":ue()}],"row-end":[{"row-end":ue()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",$e]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",$e]}],gap:[{gap:[v]}],"gap-x":[{"gap-x":[v]}],"gap-y":[{"gap-y":[v]}],"justify-content":[{justify:["normal",...X()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...X(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...X(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[E]}],px:[{px:[E]}],py:[{py:[E]}],ps:[{ps:[E]}],pe:[{pe:[E]}],pt:[{pt:[E]}],pr:[{pr:[E]}],pb:[{pb:[E]}],pl:[{pl:[E]}],m:[{m:[S]}],mx:[{mx:[S]}],my:[{my:[S]}],ms:[{ms:[S]}],me:[{me:[S]}],mt:[{mt:[S]}],mr:[{mr:[S]}],mb:[{mb:[S]}],ml:[{ml:[S]}],"space-x":[{"space-x":[D]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[D]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",$e,t]}],"min-w":[{"min-w":[$e,t,"min","max","fit"]}],"max-w":[{"max-w":[$e,t,"none","full","min","max","fit","prose",{screen:[ta]},ta]}],h:[{h:[$e,t,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[$e,t,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[$e,t,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[$e,t,"auto","min","max","fit"]}],"font-size":[{text:["base",ta,ea]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",ug]}],"font-family":[{font:[eu]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",$e]}],"line-clamp":[{"line-clamp":["none",Ss,ug]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",li,$e]}],"list-image":[{"list-image":["none",$e]}],"list-style-type":[{list:["none","disc","decimal",$e]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[e]}],"placeholder-opacity":[{"placeholder-opacity":[N]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[e]}],"text-opacity":[{"text-opacity":[N]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...ae(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",li,ea]}],"underline-offset":[{"underline-offset":["auto",li,$e]}],"text-decoration-color":[{decoration:[e]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:H()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",$e]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",$e]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[N]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...he(),kD]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",wD]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},SD]}],"bg-color":[{bg:[e]}],"gradient-from-pos":[{from:[j]}],"gradient-via-pos":[{via:[j]}],"gradient-to-pos":[{to:[j]}],"gradient-from":[{from:[b]}],"gradient-via":[{via:[b]}],"gradient-to":[{to:[b]}],rounded:[{rounded:[o]}],"rounded-s":[{"rounded-s":[o]}],"rounded-e":[{"rounded-e":[o]}],"rounded-t":[{"rounded-t":[o]}],"rounded-r":[{"rounded-r":[o]}],"rounded-b":[{"rounded-b":[o]}],"rounded-l":[{"rounded-l":[o]}],"rounded-ss":[{"rounded-ss":[o]}],"rounded-se":[{"rounded-se":[o]}],"rounded-ee":[{"rounded-ee":[o]}],"rounded-es":[{"rounded-es":[o]}],"rounded-tl":[{"rounded-tl":[o]}],"rounded-tr":[{"rounded-tr":[o]}],"rounded-br":[{"rounded-br":[o]}],"rounded-bl":[{"rounded-bl":[o]}],"border-w":[{border:[u]}],"border-w-x":[{"border-x":[u]}],"border-w-y":[{"border-y":[u]}],"border-w-s":[{"border-s":[u]}],"border-w-e":[{"border-e":[u]}],"border-w-t":[{"border-t":[u]}],"border-w-r":[{"border-r":[u]}],"border-w-b":[{"border-b":[u]}],"border-w-l":[{"border-l":[u]}],"border-opacity":[{"border-opacity":[N]}],"border-style":[{border:[...ae(),"hidden"]}],"divide-x":[{"divide-x":[u]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[u]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[N]}],"divide-style":[{divide:ae()}],"border-color":[{border:[a]}],"border-color-x":[{"border-x":[a]}],"border-color-y":[{"border-y":[a]}],"border-color-s":[{"border-s":[a]}],"border-color-e":[{"border-e":[a]}],"border-color-t":[{"border-t":[a]}],"border-color-r":[{"border-r":[a]}],"border-color-b":[{"border-b":[a]}],"border-color-l":[{"border-l":[a]}],"divide-color":[{divide:[a]}],"outline-style":[{outline:["",...ae()]}],"outline-offset":[{"outline-offset":[li,$e]}],"outline-w":[{outline:[li,ea]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:pe()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[e]}],"ring-opacity":[{"ring-opacity":[N]}],"ring-offset-w":[{"ring-offset":[li,ea]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",ta,ND]}],"shadow-color":[{shadow:[eu]}],opacity:[{opacity:[N]}],"mix-blend":[{"mix-blend":[...se(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":se()}],filter:[{filter:["","none"]}],blur:[{blur:[r]}],brightness:[{brightness:[n]}],contrast:[{contrast:[f]}],"drop-shadow":[{"drop-shadow":["","none",ta,$e]}],grayscale:[{grayscale:[h]}],"hue-rotate":[{"hue-rotate":[m]}],invert:[{invert:[g]}],saturate:[{saturate:[A]}],sepia:[{sepia:[_]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[r]}],"backdrop-brightness":[{"backdrop-brightness":[n]}],"backdrop-contrast":[{"backdrop-contrast":[f]}],"backdrop-grayscale":[{"backdrop-grayscale":[h]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[m]}],"backdrop-invert":[{"backdrop-invert":[g]}],"backdrop-opacity":[{"backdrop-opacity":[N]}],"backdrop-saturate":[{"backdrop-saturate":[A]}],"backdrop-sepia":[{"backdrop-sepia":[_]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[c]}],"border-spacing-x":[{"border-spacing-x":[c]}],"border-spacing-y":[{"border-spacing-y":[c]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",$e]}],duration:[{duration:I()}],ease:[{ease:["linear","in","out","in-out",$e]}],delay:[{delay:I()}],animate:[{animate:["none","spin","ping","pulse","bounce",$e]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[P]}],"scale-x":[{"scale-x":[P]}],"scale-y":[{"scale-y":[P]}],rotate:[{rotate:[Jl,$e]}],"translate-x":[{"translate-x":[U]}],"translate-y":[{"translate-y":[U]}],"skew-x":[{"skew-x":[O]}],"skew-y":[{"skew-y":[O]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",$e]}],accent:[{accent:["auto",e]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",$e]}],"caret-color":[{caret:[e]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":H()}],"scroll-mx":[{"scroll-mx":H()}],"scroll-my":[{"scroll-my":H()}],"scroll-ms":[{"scroll-ms":H()}],"scroll-me":[{"scroll-me":H()}],"scroll-mt":[{"scroll-mt":H()}],"scroll-mr":[{"scroll-mr":H()}],"scroll-mb":[{"scroll-mb":H()}],"scroll-ml":[{"scroll-ml":H()}],"scroll-p":[{"scroll-p":H()}],"scroll-px":[{"scroll-px":H()}],"scroll-py":[{"scroll-py":H()}],"scroll-ps":[{"scroll-ps":H()}],"scroll-pe":[{"scroll-pe":H()}],"scroll-pt":[{"scroll-pt":H()}],"scroll-pr":[{"scroll-pr":H()}],"scroll-pb":[{"scroll-pb":H()}],"scroll-pl":[{"scroll-pl":H()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",$e]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[li,ea,ug]}],stroke:[{stroke:[e,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}},OD=dD(PD);function ee(...e){return OD(nt(e))}function Gs(e){return e?e.replace(/127\.0\.0\.1|localhost/g,"192.168.178.151"):""}function jE(){const e=gE();return l.jsxs("div",{className:"flex items-center rounded-md border border-border/40 bg-background/40 p-0.5",role:"group","aria-label":"Ansichtsmodus",title:"Einfach zeigt nur das Wichtigste. Experte zeigt alle technischen Details.",children:[l.jsxs("button",{onClick:()=>Rw(!1),"aria-pressed":!e,className:ee("flex items-center gap-1 rounded px-2 py-1 text-xs font-semibold transition-all cursor-pointer",e?"text-muted-foreground hover:text-foreground":"bg-primary/15 text-primary shadow-sm"),children:[l.jsx(xs,{className:"h-3.5 w-3.5"})," Einfach"]}),l.jsxs("button",{onClick:()=>Rw(!0),"aria-pressed":e,className:ee("flex items-center gap-1 rounded px-2 py-1 text-xs font-semibold transition-all cursor-pointer",e?"bg-primary/15 text-primary shadow-sm":"text-muted-foreground hover:text-foreground"),children:[l.jsx($4,{className:"h-3.5 w-3.5"})," Experte"]})]})}async function Se(e,t){var f;const r={"Content-Type":"application/json",...t==null?void 0:t.headers},n=localStorage.getItem("mc_sudo_password"),a=localStorage.getItem("mc_hf_token");n&&(r["X-Sudo-Password"]=n);let o=t==null?void 0:t.body;if((((f=t==null?void 0:t.method)==null?void 0:f.toUpperCase())||"GET")==="POST"){if(typeof o=="string")try{const h=JSON.parse(o);let m=!1;n&&!("sudo_password"in h)&&(h.sudo_password=n,m=!0),a&&!("hf_token"in h)&&(h.hf_token=a,m=!0),m&&(o=JSON.stringify(h))}catch{}else if(!o){const h={};n&&(h.sudo_password=n),a&&(h.hf_token=a),Object.keys(h).length>0&&(o=JSON.stringify(h))}}const u=await fetch(e,{...t,headers:r,body:o});if(!u.ok)throw new Error(`${u.status} ${u.statusText}`);return u.json()}const SE=(e,t,r=!1,n=!0)=>Se("/api/groups",{method:"PUT",body:JSON.stringify({group:e,members:t,swap:r,persist:n})}),_D=e=>Se("/api/routing/policy",{method:"PUT",body:JSON.stringify(e)}),Ve={health:["health"],systemStatus:["system-status"],services:["services"],models:["models"],groups:["groups"],routing:["routing"],routingPolicy:["routing-policy"],voiceMetrics:["voice-metrics"],jobs:["jobs"],tokenStats:["token-stats"],agentStatus:["agent-status"],hermesBrain:["hermes-brain"],updates:["updates"],discover:["discover"],drafts:e=>["drafts",e??""],connect:e=>["connect",e??""],connectHealth:["connect-health"],memory:(e,t)=>["memory",e??"",t??""],memoryGraph:["memory-graph"]},MD=(e=!0)=>$t({queryKey:Ve.memoryGraph,queryFn:()=>Se("/api/memory/graph"),enabled:e}),Py=()=>$t({queryKey:Ve.health,queryFn:()=>Se("/api/health"),refetchInterval:1e4}),Po=(e=5e3)=>$t({queryKey:Ve.systemStatus,queryFn:()=>Se("/api/system/status"),refetchInterval:e}),NE=(e=3e3)=>$t({queryKey:Ve.services,queryFn:()=>Se("/api/system/services"),refetchInterval:e}),Ni=(e=4e3)=>$t({queryKey:Ve.models,queryFn:()=>Se("/api/models"),refetchInterval:e}),EE=(e=8e3)=>$t({queryKey:Ve.groups,queryFn:()=>Se("/api/groups"),refetchInterval:e}),ID=(e=5e3)=>$t({queryKey:Ve.voiceMetrics,queryFn:()=>Se("/api/voice/metrics"),refetchInterval:e}),TD=()=>$t({queryKey:Ve.routingPolicy,queryFn:()=>Se("/api/routing/policy")}),DD=(e=2e3)=>$t({queryKey:Ve.jobs,queryFn:()=>Se("/api/jobs"),refetchInterval:e,select:t=>t.jobs??[]}),Oy=(e=3e3)=>$t({queryKey:Ve.tokenStats,queryFn:()=>Se("/api/system/token-stats"),refetchInterval:e}),_y=(e=5e3)=>$t({queryKey:Ve.agentStatus,queryFn:()=>Se("/api/agent/status"),refetchInterval:e}),AE=(e=6e4)=>$t({queryKey:Ve.hermesBrain,queryFn:()=>Se("/api/agent/brain"),refetchInterval:e}),vh=e=>$t({queryKey:Ve.updates,queryFn:()=>Se("/api/maintenance/updates"),refetchInterval:e}),RD=()=>$t({queryKey:Ve.discover,queryFn:()=>Se("/api/discover")}),LD=e=>$t({queryKey:Ve.drafts(e),queryFn:()=>Se(`/api/models/drafts?target=${encodeURIComponent(e??"")}`),enabled:!!e}),$D=e=>$t({queryKey:Ve.connect(e),queryFn:()=>Se(e?`/api/connect?${e}`:"/api/connect")}),zD=()=>$t({queryKey:Ve.connectHealth,queryFn:()=>Se("/api/connect/health"),refetchInterval:15e3}),vv=e=>$t({queryKey:Ve.memory(e==null?void 0:e.q,e==null?void 0:e.category),queryFn:()=>{const t=new URLSearchParams;return e!=null&&e.q&&t.set("q",e.q),e!=null&&e.category&&t.set("category",e.category),Se(`/api/memory?${t}`)},select:t=>e!=null&&e.limit?t.slice(0,e.limit):t});let yv=[],xv=[];const bv=new Set,CE=()=>bv.forEach(e=>e());function PE(e){return bv.add(e),()=>{bv.delete(e)}}function FD(e){yv=[...yv,e].slice(-40),CE()}function BD(e){xv=[...xv,e].slice(-40),CE()}const UD=()=>y.useSyncExternalStore(PE,()=>yv),HD=()=>y.useSyncExternalStore(PE,()=>xv);function WD(){const{data:e,dataUpdatedAt:t}=Po(3e3),{data:r,dataUpdatedAt:n}=Oy(3e3),a=y.useRef(null);y.useEffect(()=>{var o,c,u,f;e&&FD({t:Date.now(),cpu:((o=e.cpu)==null?void 0:o.percent)??0,ram:((c=e.ram)==null?void 0:c.percent)??0,gpu:((u=e.gpu)==null?void 0:u.busy_percent)??null,disk:((f=e.disk)==null?void 0:f.percent)??null})},[t]),y.useEffect(()=>{if(!r)return;const o=Date.now(),c=r.prompt_tokens,u=r.completion_tokens;if(a.current){const f=Math.max((o-a.current.t)/1e3,.001);BD({t:o,prompt:Math.max(0,(c-a.current.p)/f),completion:Math.max(0,(u-a.current.c)/f)})}a.current={p:c,c:u,t:o}},[n])}function KD(){const{data:e,error:t}=Po(3e3),r=UD();return{sys:e,hist:r,error:t}}function aa(e){return(e/1024**3).toFixed(1)}function wv(e){return e?e>1024**3?`${(e/1024**3).toFixed(1)} GB`:`${(e/1024**2).toFixed(0)} MB`:""}function Lr(e){if(!e)return"—";const t=e/1024**3;return t>=1?`${t.toFixed(1)} GB`:`${(e/1024**2).toFixed(0)} MB`}function GD(e){if(!e)return"";const t=Math.floor(e/60);return t>0?`${t} min`:`${e} s`}function zw(e){return e?`${Math.round(e/1024)}k`:"—"}var VD=["dangerouslySetInnerHTML","onCopy","onCopyCapture","onCut","onCutCapture","onPaste","onPasteCapture","onCompositionEnd","onCompositionEndCapture","onCompositionStart","onCompositionStartCapture","onCompositionUpdate","onCompositionUpdateCapture","onFocus","onFocusCapture","onBlur","onBlurCapture","onChange","onChangeCapture","onBeforeInput","onBeforeInputCapture","onInput","onInputCapture","onReset","onResetCapture","onSubmit","onSubmitCapture","onInvalid","onInvalidCapture","onLoad","onLoadCapture","onError","onErrorCapture","onKeyDown","onKeyDownCapture","onKeyPress","onKeyPressCapture","onKeyUp","onKeyUpCapture","onAbort","onAbortCapture","onCanPlay","onCanPlayCapture","onCanPlayThrough","onCanPlayThroughCapture","onDurationChange","onDurationChangeCapture","onEmptied","onEmptiedCapture","onEncrypted","onEncryptedCapture","onEnded","onEndedCapture","onLoadedData","onLoadedDataCapture","onLoadedMetadata","onLoadedMetadataCapture","onLoadStart","onLoadStartCapture","onPause","onPauseCapture","onPlay","onPlayCapture","onPlaying","onPlayingCapture","onProgress","onProgressCapture","onRateChange","onRateChangeCapture","onSeeked","onSeekedCapture","onSeeking","onSeekingCapture","onStalled","onStalledCapture","onSuspend","onSuspendCapture","onTimeUpdate","onTimeUpdateCapture","onVolumeChange","onVolumeChangeCapture","onWaiting","onWaitingCapture","onAuxClick","onAuxClickCapture","onClick","onClickCapture","onContextMenu","onContextMenuCapture","onDoubleClick","onDoubleClickCapture","onDrag","onDragCapture","onDragEnd","onDragEndCapture","onDragEnter","onDragEnterCapture","onDragExit","onDragExitCapture","onDragLeave","onDragLeaveCapture","onDragOver","onDragOverCapture","onDragStart","onDragStartCapture","onDrop","onDropCapture","onMouseDown","onMouseDownCapture","onMouseEnter","onMouseLeave","onMouseMove","onMouseMoveCapture","onMouseOut","onMouseOutCapture","onMouseOver","onMouseOverCapture","onMouseUp","onMouseUpCapture","onSelect","onSelectCapture","onTouchCancel","onTouchCancelCapture","onTouchEnd","onTouchEndCapture","onTouchMove","onTouchMoveCapture","onTouchStart","onTouchStartCapture","onPointerDown","onPointerDownCapture","onPointerMove","onPointerMoveCapture","onPointerUp","onPointerUpCapture","onPointerCancel","onPointerCancelCapture","onPointerEnter","onPointerEnterCapture","onPointerLeave","onPointerLeaveCapture","onPointerOver","onPointerOverCapture","onPointerOut","onPointerOutCapture","onGotPointerCapture","onGotPointerCaptureCapture","onLostPointerCapture","onLostPointerCaptureCapture","onScroll","onScrollCapture","onWheel","onWheelCapture","onAnimationStart","onAnimationStartCapture","onAnimationEnd","onAnimationEndCapture","onAnimationIteration","onAnimationIterationCapture","onTransitionEnd","onTransitionEndCapture"];function My(e){if(typeof e!="string")return!1;var t=VD;return t.includes(e)}var qD=["aria-activedescendant","aria-atomic","aria-autocomplete","aria-busy","aria-checked","aria-colcount","aria-colindex","aria-colspan","aria-controls","aria-current","aria-describedby","aria-details","aria-disabled","aria-errormessage","aria-expanded","aria-flowto","aria-haspopup","aria-hidden","aria-invalid","aria-keyshortcuts","aria-label","aria-labelledby","aria-level","aria-live","aria-modal","aria-multiline","aria-multiselectable","aria-orientation","aria-owns","aria-placeholder","aria-posinset","aria-pressed","aria-readonly","aria-relevant","aria-required","aria-roledescription","aria-rowcount","aria-rowindex","aria-rowspan","aria-selected","aria-setsize","aria-sort","aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext","className","color","height","id","lang","max","media","method","min","name","style","target","width","role","tabIndex","accentHeight","accumulate","additive","alignmentBaseline","allowReorder","alphabetic","amplitude","arabicForm","ascent","attributeName","attributeType","autoReverse","azimuth","baseFrequency","baselineShift","baseProfile","bbox","begin","bias","by","calcMode","capHeight","clip","clipPath","clipPathUnits","clipRule","colorInterpolation","colorInterpolationFilters","colorProfile","colorRendering","contentScriptType","contentStyleType","cursor","cx","cy","d","decelerate","descent","diffuseConstant","direction","display","divisor","dominantBaseline","dur","dx","dy","edgeMode","elevation","enableBackground","end","exponent","externalResourcesRequired","fill","fillOpacity","fillRule","filter","filterRes","filterUnits","floodColor","floodOpacity","focusable","fontFamily","fontSize","fontSizeAdjust","fontStretch","fontStyle","fontVariant","fontWeight","format","from","fx","fy","g1","g2","glyphName","glyphOrientationHorizontal","glyphOrientationVertical","glyphRef","gradientTransform","gradientUnits","hanging","horizAdvX","horizOriginX","href","ideographic","imageRendering","in2","in","intercept","k1","k2","k3","k4","k","kernelMatrix","kernelUnitLength","kerning","keyPoints","keySplines","keyTimes","lengthAdjust","letterSpacing","lightingColor","limitingConeAngle","local","markerEnd","markerHeight","markerMid","markerStart","markerUnits","markerWidth","mask","maskContentUnits","maskUnits","mathematical","mode","numOctaves","offset","opacity","operator","order","orient","orientation","origin","overflow","overlinePosition","overlineThickness","paintOrder","panose1","pathLength","patternContentUnits","patternTransform","patternUnits","pointerEvents","pointsAtX","pointsAtY","pointsAtZ","preserveAlpha","preserveAspectRatio","primitiveUnits","r","radius","refX","refY","renderingIntent","repeatCount","repeatDur","requiredExtensions","requiredFeatures","restart","result","rotate","rx","ry","seed","shapeRendering","slope","spacing","specularConstant","specularExponent","speed","spreadMethod","startOffset","stdDeviation","stemh","stemv","stitchTiles","stopColor","stopOpacity","strikethroughPosition","strikethroughThickness","string","stroke","strokeDasharray","strokeDashoffset","strokeLinecap","strokeLinejoin","strokeMiterlimit","strokeOpacity","strokeWidth","surfaceScale","systemLanguage","tableValues","targetX","targetY","textAnchor","textDecoration","textLength","textRendering","to","transform","u1","u2","underlinePosition","underlineThickness","unicode","unicodeBidi","unicodeRange","unitsPerEm","vAlphabetic","values","vectorEffect","version","vertAdvY","vertOriginX","vertOriginY","vHanging","vIdeographic","viewTarget","visibility","vMathematical","widths","wordSpacing","writingMode","x1","x2","x","xChannelSelector","xHeight","xlinkActuate","xlinkArcrole","xlinkHref","xlinkRole","xlinkShow","xlinkTitle","xlinkType","xmlBase","xmlLang","xmlns","xmlnsXlink","xmlSpace","y1","y2","y","yChannelSelector","z","zoomAndPan","ref","key","angle"],QD=new Set(qD);function OE(e){return typeof e!="string"?!1:QD.has(e)}function _E(e){return typeof e=="string"&&e.startsWith("data-")}function kn(e){if(typeof e!="object"||e===null)return{};var t={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(OE(r)||_E(r))&&(t[r]=e[r]);return t}function yh(e){if(e==null)return null;if(y.isValidElement(e)&&typeof e.props=="object"&&e.props!==null){var t=e.props;return kn(t)}return typeof e=="object"&&!Array.isArray(e)?kn(e):null}function rn(e){var t={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(OE(r)||_E(r)||My(r))&&(t[r]=e[r]);return t}function YD(e){return e==null?null:y.isValidElement(e)?rn(e.props):typeof e=="object"&&!Array.isArray(e)?rn(e):null}var XD=["children","width","height","viewBox","className","style","title","desc"];function kv(){return kv=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var r=e.children,n=e.width,a=e.height,o=e.viewBox,c=e.className,u=e.style,f=e.title,h=e.desc,m=ZD(e,XD),g=o||{width:n,height:a,x:0,y:0},v=nt("recharts-surface",c);return y.createElement("svg",kv({},rn(m),{className:v,width:n,height:a,style:u,viewBox:"".concat(g.x," ").concat(g.y," ").concat(g.width," ").concat(g.height),ref:t}),y.createElement("title",null,f),y.createElement("desc",null,h),r)}),eR=["children","className"];function jv(){return jv=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var r=e.children,n=e.className,a=tR(e,eR),o=nt("recharts-layer",n);return y.createElement("g",jv({className:o},rn(a),{ref:t}),r)}),nR=y.createContext(null);function yt(e){return function(){return e}}const Sv=Math.PI,Nv=2*Sv,qa=1e-6,iR=Nv-qa;function IE(e){this._+=e[0];for(let t=1,r=e.length;t=0))throw new Error(`invalid digits: ${e}`);if(t>15)return IE;const r=10**t;return function(n){this._+=n[0];for(let a=1,o=n.length;aqa)if(!(Math.abs(g*f-h*m)>qa)||!o)this._append`L${this._x1=t},${this._y1=r}`;else{let b=n-c,j=a-u,k=f*f+h*h,S=b*b+j*j,N=Math.sqrt(k),E=Math.sqrt(v),A=o*Math.tan((Sv-Math.acos((k+v-S)/(2*N*E)))/2),P=A/E,_=A/N;Math.abs(P-1)>qa&&this._append`L${t+P*m},${r+P*g}`,this._append`A${o},${o},0,0,${+(g*b>m*j)},${this._x1=t+_*f},${this._y1=r+_*h}`}}arc(t,r,n,a,o,c){if(t=+t,r=+r,n=+n,c=!!c,n<0)throw new Error(`negative radius: ${n}`);let u=n*Math.cos(a),f=n*Math.sin(a),h=t+u,m=r+f,g=1^c,v=c?a-o:o-a;this._x1===null?this._append`M${h},${m}`:(Math.abs(this._x1-h)>qa||Math.abs(this._y1-m)>qa)&&this._append`L${h},${m}`,n&&(v<0&&(v=v%Nv+Nv),v>iR?this._append`A${n},${n},0,1,${g},${t-u},${r-f}A${n},${n},0,1,${g},${this._x1=h},${this._y1=m}`:v>qa&&this._append`A${n},${n},0,${+(v>=Sv)},${g},${this._x1=t+n*Math.cos(o)},${this._y1=r+n*Math.sin(o)}`)}rect(t,r,n,a){this._append`M${this._x0=this._x1=+t},${this._y0=this._y1=+r}h${n=+n}v${+a}h${-n}Z`}toString(){return this._}}function TE(e){let t=3;return e.digits=function(r){if(!arguments.length)return t;if(r==null)t=null;else{const n=Math.floor(r);if(!(n>=0))throw new RangeError(`invalid digits: ${r}`);t=n}return e},()=>new oR(t)}function Iy(e){return typeof e=="object"&&"length"in e?e:Array.from(e)}function DE(e){this._context=e}DE.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:this._context.lineTo(e,t);break}}};function xh(e){return new DE(e)}function RE(e){return e[0]}function LE(e){return e[1]}function $E(e,t){var r=yt(!0),n=null,a=xh,o=null,c=TE(u);e=typeof e=="function"?e:e===void 0?RE:yt(e),t=typeof t=="function"?t:t===void 0?LE:yt(t);function u(f){var h,m=(f=Iy(f)).length,g,v=!1,b;for(n==null&&(o=a(b=c())),h=0;h<=m;++h)!(h=b;--j)u.point(A[j],P[j]);u.lineEnd(),u.areaEnd()}N&&(A[v]=+e(S,v,g),P[v]=+t(S,v,g),u.point(n?+n(S,v,g):A[v],r?+r(S,v,g):P[v]))}if(E)return u=null,E+""||null}function m(){return $E().defined(a).curve(c).context(o)}return h.x=function(g){return arguments.length?(e=typeof g=="function"?g:yt(+g),n=null,h):e},h.x0=function(g){return arguments.length?(e=typeof g=="function"?g:yt(+g),h):e},h.x1=function(g){return arguments.length?(n=g==null?null:typeof g=="function"?g:yt(+g),h):n},h.y=function(g){return arguments.length?(t=typeof g=="function"?g:yt(+g),r=null,h):t},h.y0=function(g){return arguments.length?(t=typeof g=="function"?g:yt(+g),h):t},h.y1=function(g){return arguments.length?(r=g==null?null:typeof g=="function"?g:yt(+g),h):r},h.lineX0=h.lineY0=function(){return m().x(e).y(t)},h.lineY1=function(){return m().x(e).y(r)},h.lineX1=function(){return m().x(n).y(t)},h.defined=function(g){return arguments.length?(a=typeof g=="function"?g:yt(!!g),h):a},h.curve=function(g){return arguments.length?(c=g,o!=null&&(u=c(o)),h):c},h.context=function(g){return arguments.length?(g==null?o=u=null:u=c(o=g),h):o},h}class zE{constructor(t,r){this._context=t,this._x=r}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line}point(t,r){switch(t=+t,r=+r,this._point){case 0:{this._point=1,this._line?this._context.lineTo(t,r):this._context.moveTo(t,r);break}case 1:this._point=2;default:{this._x?this._context.bezierCurveTo(this._x0=(this._x0+t)/2,this._y0,this._x0,r,t,r):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+r)/2,t,this._y0,t,r);break}}this._x0=t,this._y0=r}}function sR(e){return new zE(e,!0)}function lR(e){return new zE(e,!1)}function mf(){}function pf(e,t,r){e._context.bezierCurveTo((2*e._x0+e._x1)/3,(2*e._y0+e._y1)/3,(e._x0+2*e._x1)/3,(e._y0+2*e._y1)/3,(e._x0+4*e._x1+t)/6,(e._y0+4*e._y1+r)/6)}function FE(e){this._context=e}FE.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:pf(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:pf(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function uR(e){return new FE(e)}function BE(e){this._context=e}BE.prototype={areaStart:mf,areaEnd:mf,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:{this._context.moveTo(this._x2,this._y2),this._context.closePath();break}case 2:{this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break}case 3:{this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4);break}}},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._x2=e,this._y2=t;break;case 1:this._point=2,this._x3=e,this._y3=t;break;case 2:this._point=3,this._x4=e,this._y4=t,this._context.moveTo((this._x0+4*this._x1+e)/6,(this._y0+4*this._y1+t)/6);break;default:pf(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function cR(e){return new BE(e)}function UE(e){this._context=e}UE.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var r=(this._x0+4*this._x1+e)/6,n=(this._y0+4*this._y1+t)/6;this._line?this._context.lineTo(r,n):this._context.moveTo(r,n);break;case 3:this._point=4;default:pf(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function dR(e){return new UE(e)}function HE(e){this._context=e}HE.prototype={areaStart:mf,areaEnd:mf,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(e,t){e=+e,t=+t,this._point?this._context.lineTo(e,t):(this._point=1,this._context.moveTo(e,t))}};function fR(e){return new HE(e)}function Fw(e){return e<0?-1:1}function Bw(e,t,r){var n=e._x1-e._x0,a=t-e._x1,o=(e._y1-e._y0)/(n||a<0&&-0),c=(r-e._y1)/(a||n<0&&-0),u=(o*a+c*n)/(n+a);return(Fw(o)+Fw(c))*Math.min(Math.abs(o),Math.abs(c),.5*Math.abs(u))||0}function Uw(e,t){var r=e._x1-e._x0;return r?(3*(e._y1-e._y0)/r-t)/2:t}function cg(e,t,r){var n=e._x0,a=e._y0,o=e._x1,c=e._y1,u=(o-n)/3;e._context.bezierCurveTo(n+u,a+u*t,o-u,c-u*r,o,c)}function gf(e){this._context=e}gf.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:cg(this,this._t0,Uw(this,this._t0));break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){var r=NaN;if(e=+e,t=+t,!(e===this._x1&&t===this._y1)){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,cg(this,Uw(this,r=Bw(this,e,t)),r);break;default:cg(this,this._t0,r=Bw(this,e,t));break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t,this._t0=r}}};function WE(e){this._context=new KE(e)}(WE.prototype=Object.create(gf.prototype)).point=function(e,t){gf.prototype.point.call(this,t,e)};function KE(e){this._context=e}KE.prototype={moveTo:function(e,t){this._context.moveTo(t,e)},closePath:function(){this._context.closePath()},lineTo:function(e,t){this._context.lineTo(t,e)},bezierCurveTo:function(e,t,r,n,a,o){this._context.bezierCurveTo(t,e,n,r,o,a)}};function hR(e){return new gf(e)}function mR(e){return new WE(e)}function GE(e){this._context=e}GE.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=[],this._y=[]},lineEnd:function(){var e=this._x,t=this._y,r=e.length;if(r)if(this._line?this._context.lineTo(e[0],t[0]):this._context.moveTo(e[0],t[0]),r===2)this._context.lineTo(e[1],t[1]);else for(var n=Hw(e),a=Hw(t),o=0,c=1;c=0;--t)a[t]=(c[t]-a[t+1])/o[t];for(o[r-1]=(e[r]+a[r-1])/2,t=0;t=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:{if(this._t<=0)this._context.lineTo(this._x,t),this._context.lineTo(e,t);else{var r=this._x*(1-this._t)+e*this._t;this._context.lineTo(r,this._y),this._context.lineTo(r,t)}break}}this._x=e,this._y=t}};function gR(e){return new bh(e,.5)}function vR(e){return new bh(e,0)}function yR(e){return new bh(e,1)}function xo(e,t){if((c=e.length)>1)for(var r=1,n,a,o=e[t[0]],c,u=o.length;r=0;)r[t]=t;return r}function xR(e,t){return e[t]}function bR(e){const t=[];return t.key=e,t}function wR(){var e=yt([]),t=Ev,r=xo,n=xR;function a(o){var c=Array.from(e.apply(this,arguments),bR),u,f=c.length,h=-1,m;for(const g of o)for(u=0,++h;u0){for(var r,n,a=0,o=e[0].length,c;a0){for(var r=0,n=e[t[0]],a,o=n.length;r0)||!((o=(a=e[t[0]]).length)>0))){for(var r=0,n=1,a,o,c;n1&&arguments[1]!==void 0?arguments[1]:ER,r=10**t,n=Math.round(e*r)/r;return Object.is(n,-0)?0:n}function Gt(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n{var u=r[c-1];return typeof u=="string"?a+u+o:u!==void 0?a+va(u)+o:a+o},"")}var Jr=e=>e===0?0:e>0?1:-1,Kn=e=>typeof e=="number"&&e!=+e,bo=e=>typeof e=="string"&&e.length>1&&e.indexOf("%")===e.length-1,Ee=e=>(typeof e=="number"||e instanceof Number)&&!Kn(e),Gn=e=>Ee(e)||typeof e=="string",AR=0,Au=e=>{var t=++AR;return"".concat(e||"").concat(t)},Sa=function(t,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,a=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1;if(!Ee(t)&&typeof t!="string")return n;var o;if(bo(t)){if(r==null)return n;var c=t.indexOf("%");o=r*parseFloat(t.slice(0,c))/100}else o=+t;return Kn(o)&&(o=n),a&&r!=null&&o>r&&(o=r),o},QE=e=>{if(!Array.isArray(e))return!1;for(var t=e.length,r={},n=0;nn&&(typeof t=="function"?t(n):Oo(n,t))===r)}var Yt=e=>e===null||typeof e>"u",Ry=e=>Yt(e)?e:"".concat(e.charAt(0).toUpperCase()).concat(e.slice(1));function Ar(e){return e!=null}function nl(){}var XE=e=>"radius"in e&&"startAngle"in e&&"endAngle"in e,Ly=(e,t)=>{if(!e||typeof e=="function"||typeof e=="boolean")return null;var r=e;if(y.isValidElement(e)&&(r=e.props),typeof r!="object"&&typeof r!="function")return null;var n={};return Object.keys(r).forEach(a=>{My(a)&&typeof r[a]=="function"&&(n[a]=(o=>r[a](r,o)))}),n},CR=(e,t,r)=>n=>(e(t,r,n),null),PR=(e,t,r)=>{if(e===null||typeof e!="object"&&typeof e!="function")return null;var n=null;return Object.keys(e).forEach(a=>{var o=e[a];My(a)&&typeof o=="function"&&(n||(n={}),n[a]=CR(o,t,r))}),n};function Ww(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function OR(e){for(var t=1;t(c[u]===void 0&&n[u]!==void 0&&(c[u]=n[u]),c),r);return o}function TR(e,t){const r=new Map;for(let n=0;nObject.prototype.propertyIsEnumerable.call(e,t))}function $y(e){return e==null?e===void 0?"[object Undefined]":"[object Null]":Object.prototype.toString.call(e)}const zR="[object RegExp]",JE="[object String]",e5="[object Number]",t5="[object Boolean]",r5="[object Arguments]",FR="[object Symbol]",BR="[object Date]",UR="[object Map]",HR="[object Set]",WR="[object Array]",KR="[object ArrayBuffer]",GR="[object Object]",VR="[object DataView]",qR="[object Uint8Array]",QR="[object Uint8ClampedArray]",YR="[object Uint16Array]",XR="[object Uint32Array]",ZR="[object Int8Array]",JR="[object Int16Array]",eL="[object Int32Array]",tL="[object Float32Array]",rL="[object Float64Array]",Kw=typeof globalThis=="object"&&globalThis||typeof window=="object"&&window||typeof self=="object"&&self||typeof global=="object"&&global||(function(){return this})();function nL(e){return typeof Kw.Buffer<"u"&&Kw.Buffer.isBuffer(e)}function iL(e,t){return Ja(e,void 0,e,new Map,t)}function Ja(e,t,r,n=new Map,a=void 0){const o=a==null?void 0:a(e,t,r,n);if(o!==void 0)return o;if(Cv(e))return e;if(n.has(e))return n.get(e);if(Array.isArray(e)){const c=new Array(e.length);n.set(e,c);for(let u=0;u{}):Pv(e,t,function n(a,o,c,u,f,h){const m=r(a,o,c,u,f,h);return m!==void 0?!!m:Pv(a,o,n,h,!1)},new Map,!0)}function Pv(e,t,r,n,a=!1){if(t===e)return!0;switch(typeof t){case"object":return sL(e,t,r,n);case"function":return Object.keys(t).length>0?Pv(e,{...t},r,n,a):Zd(e,t);default:return n5(e)&&a?typeof t=="string"?t==="":!0:Zd(e,t)}}function sL(e,t,r,n){if(t==null)return!0;if(Array.isArray(t))return a5(e,t,r,n);if(t instanceof Map)return lL(e,t,r,n);if(t instanceof Set)return uL(e,t,r,n);const a=Object.keys(t);if(e==null||Cv(e))return a.length===0;if(a.length===0)return!0;if(n!=null&&n.has(t))return n.get(t)===e;n==null||n.set(t,e);try{for(let o=0;o{})}function cL(e){return e=oL(e),t=>o5(t,e)}function dL(e,t){return iL(e,(r,n,a,o)=>{if(typeof e=="object"){if($y(e)==="[object Object]"&&typeof e.constructor!="function"){const c={};return o.set(e,c),gn(c,e,a,o),c}switch(Object.prototype.toString.call(e)){case e5:case JE:case t5:{const c=new e.constructor(e==null?void 0:e.valueOf());return gn(c,e),c}case r5:{const c={};return gn(c,e),c.length=e.length,c[Symbol.iterator]=e[Symbol.iterator],c}default:return}}})}function fL(e){return dL(e)}const hL=/^(?:0|[1-9]\d*)$/;function s5(e,t=Number.MAX_SAFE_INTEGER){switch(typeof e){case"number":return Number.isInteger(e)&&e>=0&&e=0}function l5(e){return e!=null&&typeof e!="function"&&yL(e.length)}function xL(e){return typeof e=="object"&&e!==null}function bL(e){return xL(e)&&l5(e)}function Gw(e,t=ZE){return bL(e)?TR(Array.from(e),DR(vL(t),1)):[]}function wL(e,t,r){return t===!0?Gw(e,r):typeof t=="function"?Gw(e,t):e}var dg={exports:{}},fg={},hg={exports:{}},mg={};/** - * @license React - * use-sync-external-store-shim.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Vw;function kL(){if(Vw)return mg;Vw=1;var e=tl();function t(g,v){return g===v&&(g!==0||1/g===1/v)||g!==g&&v!==v}var r=typeof Object.is=="function"?Object.is:t,n=e.useState,a=e.useEffect,o=e.useLayoutEffect,c=e.useDebugValue;function u(g,v){var b=v(),j=n({inst:{value:b,getSnapshot:v}}),k=j[0].inst,S=j[1];return o(function(){k.value=b,k.getSnapshot=v,f(k)&&S({inst:k})},[g,b,v]),a(function(){return f(k)&&S({inst:k}),g(function(){f(k)&&S({inst:k})})},[g]),c(b),b}function f(g){var v=g.getSnapshot;g=g.value;try{var b=v();return!r(g,b)}catch{return!0}}function h(g,v){return v()}var m=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?h:u;return mg.useSyncExternalStore=e.useSyncExternalStore!==void 0?e.useSyncExternalStore:m,mg}var qw;function jL(){return qw||(qw=1,hg.exports=kL()),hg.exports}/** - * @license React - * use-sync-external-store-shim/with-selector.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Qw;function SL(){if(Qw)return fg;Qw=1;var e=tl(),t=jL();function r(h,m){return h===m&&(h!==0||1/h===1/m)||h!==h&&m!==m}var n=typeof Object.is=="function"?Object.is:r,a=t.useSyncExternalStore,o=e.useRef,c=e.useEffect,u=e.useMemo,f=e.useDebugValue;return fg.useSyncExternalStoreWithSelector=function(h,m,g,v,b){var j=o(null);if(j.current===null){var k={hasValue:!1,value:null};j.current=k}else k=j.current;j=u(function(){function N(O){if(!E){if(E=!0,A=O,O=v(O),b!==void 0&&k.hasValue){var D=k.value;if(b(D,O))return P=D}return P=O}if(D=P,n(A,O))return D;var U=v(O);return b!==void 0&&b(D,U)?(A=O,D):(A=O,P=U)}var E=!1,A,P,_=g===void 0?null:g;return[function(){return N(m())},_===null?void 0:function(){return N(_())}]},[m,g,v,b]);var S=a(h,j[0],j[1]);return c(function(){k.hasValue=!0,k.value=S},[S]),f(S),S},fg}var Yw;function NL(){return Yw||(Yw=1,dg.exports=SL()),dg.exports}var EL=NL(),zy=y.createContext(null),AL=e=>e,Nt=()=>{var e=y.useContext(zy);return e?e.store.dispatch:AL},Jd=()=>{},CL=()=>Jd,PL=(e,t)=>e===t;function Me(e){var t=y.useContext(zy),r=y.useMemo(()=>t?n=>{if(n!=null)return e(n)}:Jd,[t,e]);return EL.useSyncExternalStoreWithSelector(t?t.subscription.addNestedSub:CL,t?t.store.getState:Jd,t?t.store.getState:Jd,r,PL)}function OL(e,t=`expected a function, instead received ${typeof e}`){if(typeof e!="function")throw new TypeError(t)}function _L(e,t="expected all items to be functions, instead received the following types: "){if(!e.every(r=>typeof r=="function")){const r=e.map(n=>typeof n=="function"?`function ${n.name||"unnamed"}()`:typeof n).join(", ");throw new TypeError(`${t}[${r}]`)}}var Xw=e=>Array.isArray(e)?e:[e];function ML(e){const t=Array.isArray(e[0])?e[0]:e;return _L(t,"createSelector expects all input-selectors to be functions, but received the following types: "),t}function IL(e,t){const r=[],{length:n}=e;for(let a=0;atypeof WeakRef>"u"?TL:WeakRef,u5=DL(),RL=0,Zw=1;function Id(){return{s:RL,v:void 0,o:null,p:null}}function LL(e){return e instanceof u5?e.deref():e}function c5(e,t={}){let r=Id();const{resultEqualityCheck:n}=t;let a,o=0;function c(){let u=r;const{length:f}=arguments;for(let g=0,v=f;g{r=Id(),c.resetResultsCount()},c.resultsCount=()=>o,c.resetResultsCount=()=>{o=0},c}function $L(e,...t){const r=typeof e=="function"?{memoize:e,memoizeOptions:t}:e,n=(...a)=>{let o=0,c=0,u,f={},h=a.pop();typeof h=="object"&&(f=h,h=a.pop()),OL(h,`createSelector expects an output function after the inputs, but received: [${typeof h}]`);const m={...r,...f},{memoize:g,memoizeOptions:v=[],argsMemoize:b=c5,argsMemoizeOptions:j=[]}=m,k=Xw(v),S=Xw(j),N=ML(a),E=g(function(){return o++,h.apply(null,arguments)},...k),A=b(function(){c++;const _=IL(N,arguments);return u=E.apply(null,_),u},...S);return Object.assign(A,{resultFunc:h,memoizedResultFunc:E,dependencies:N,dependencyRecomputations:()=>c,resetDependencyRecomputations:()=>{c=0},lastResult:()=>u,recomputations:()=>o,resetRecomputations:()=>{o=0},memoize:g,argsMemoize:b})};return Object.assign(n,{withTypes:()=>n}),n}var q=$L(c5);function zL(e,t=1){const r=[],n=Math.floor(t),a=(o,c)=>{for(let u=0;u{if(e!==t){const n=Jw(e),a=Jw(t);if(n===a&&n===0){if(et)return r==="desc"?-1:1}return r==="desc"?a-n:n-a}return 0};function d5(e){return typeof e=="symbol"||e instanceof Symbol}const BL=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,UL=/^\w*$/;function HL(e,t){return Array.isArray(e)?!1:typeof e=="number"||typeof e=="boolean"||e==null||d5(e)?!0:typeof e=="string"&&(UL.test(e)||!BL.test(e))||t!=null}function WL(e,t,r,n){if(e==null)return[];r=r,Array.isArray(e)||(e=Object.values(e)),Array.isArray(t)||(t=t==null?[null]:[t]),t.length===0&&(t=[null]),Array.isArray(r)||(r=r==null?[]:[r]),r=r.map(u=>String(u));const a=(u,f)=>{let h=u;for(let m=0;mf==null||u==null?f:typeof u=="object"&&"key"in u?Object.hasOwn(f,u.key)?f[u.key]:a(f,u.path):typeof u=="function"?u(f):Array.isArray(u)?a(f,u):typeof f=="object"?f[u]:f,c=t.map(u=>(Array.isArray(u)&&u.length===1&&(u=u[0]),u==null||typeof u=="function"||Array.isArray(u)||HL(u)?u:{key:u,path:Dy(u)}));return e.map(u=>({original:u,criteria:c.map(f=>o(f,u))})).slice().sort((u,f)=>{for(let h=0;hu.original)}function wh(e,...t){const r=t.length;return r>1&&Ov(e,t[0],t[1])?t=[]:r>2&&Ov(t[0],t[1],t[2])&&(t=[t[0]]),WL(e,zL(t),["asc"])}var f5=e=>e.legend.settings,KL=e=>e.legend.size,GL=e=>e.legend.payload;q([GL,f5],(e,t)=>{var r=t.itemSorter,n=e.flat(1);return r?wh(n,r):n});function VL(e,t){return XL(e)||YL(e,t)||QL(e,t)||qL()}function qL(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function QL(e,t){if(e){if(typeof e=="string")return ek(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?ek(e,t):void 0}}function ek(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);rTd||Math.abs(e.left-t.left)>Td||Math.abs(e.top-t.top)>Td||Math.abs(e.width-t.width)>Td}function rk(e){var t=e.getBoundingClientRect();return{height:t.height,left:t.left,top:t.top,width:t.width}}function ZL(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],t=y.useState({height:0,left:0,top:0,width:0}),r=VL(t,2),n=r[0],a=r[1],o=y.useRef(null),c=y.useRef(n);c.current=n;var u=y.useCallback(f=>{if(o.current!=null&&(o.current.disconnect(),o.current=null),f!=null){var h=rk(f);if(tk(h,c.current)&&a(h),typeof ResizeObserver<"u"){var m=new ResizeObserver(()=>{var g=rk(f);tk(g,c.current)&&a(g)});m.observe(f),o.current=m}}},[...e]);return y.useEffect(()=>()=>{var f;(f=o.current)===null||f===void 0||f.disconnect()},[]),[n,u]}function Kt(e){return`Minified Redux error #${e}; visit https://redux.js.org/Errors?code=${e} for the full message or use the non-minified dev environment for full errors. `}var JL=typeof Symbol=="function"&&Symbol.observable||"@@observable",nk=JL,pg=()=>Math.random().toString(36).substring(7).split("").join("."),e$={INIT:`@@redux/INIT${pg()}`,REPLACE:`@@redux/REPLACE${pg()}`,PROBE_UNKNOWN_ACTION:()=>`@@redux/PROBE_UNKNOWN_ACTION${pg()}`},vf=e$;function Fy(e){if(typeof e!="object"||e===null)return!1;let t=e;for(;Object.getPrototypeOf(t)!==null;)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t||Object.getPrototypeOf(e)===null}function h5(e,t,r){if(typeof e!="function")throw new Error(Kt(2));if(typeof t=="function"&&typeof r=="function"||typeof r=="function"&&typeof arguments[3]=="function")throw new Error(Kt(0));if(typeof t=="function"&&typeof r>"u"&&(r=t,t=void 0),typeof r<"u"){if(typeof r!="function")throw new Error(Kt(1));return r(h5)(e,t)}let n=e,a=t,o=new Map,c=o,u=0,f=!1;function h(){c===o&&(c=new Map,o.forEach((S,N)=>{c.set(N,S)}))}function m(){if(f)throw new Error(Kt(3));return a}function g(S){if(typeof S!="function")throw new Error(Kt(4));if(f)throw new Error(Kt(5));let N=!0;h();const E=u++;return c.set(E,S),function(){if(N){if(f)throw new Error(Kt(6));N=!1,h(),c.delete(E),o=null}}}function v(S){if(!Fy(S))throw new Error(Kt(7));if(typeof S.type>"u")throw new Error(Kt(8));if(typeof S.type!="string")throw new Error(Kt(17));if(f)throw new Error(Kt(9));try{f=!0,a=n(a,S)}finally{f=!1}return(o=c).forEach(E=>{E()}),S}function b(S){if(typeof S!="function")throw new Error(Kt(10));n=S,v({type:vf.REPLACE})}function j(){const S=g;return{subscribe(N){if(typeof N!="object"||N===null)throw new Error(Kt(11));function E(){const P=N;P.next&&P.next(m())}return E(),{unsubscribe:S(E)}},[nk](){return this}}}return v({type:vf.INIT}),{dispatch:v,subscribe:g,getState:m,replaceReducer:b,[nk]:j}}function t$(e){Object.keys(e).forEach(t=>{const r=e[t];if(typeof r(void 0,{type:vf.INIT})>"u")throw new Error(Kt(12));if(typeof r(void 0,{type:vf.PROBE_UNKNOWN_ACTION()})>"u")throw new Error(Kt(13))})}function m5(e){const t=Object.keys(e),r={};for(let o=0;o"u")throw u&&u.type,new Error(Kt(14));h[g]=j,f=f||j!==b}return f=f||n.length!==Object.keys(c).length,f?h:c}}function yf(...e){return e.length===0?t=>t:e.length===1?e[0]:e.reduce((t,r)=>(...n)=>t(r(...n)))}function r$(...e){return t=>(r,n)=>{const a=t(r,n);let o=()=>{throw new Error(Kt(15))};const c={getState:a.getState,dispatch:(f,...h)=>o(f,...h)},u=e.map(f=>f(c));return o=yf(...u)(a.dispatch),{...a,dispatch:o}}}function p5(e){return Fy(e)&&"type"in e&&typeof e.type=="string"}var g5=Symbol.for("immer-nothing"),ik=Symbol.for("immer-draftable"),vr=Symbol.for("immer-state");function yn(e,...t){throw new Error(`[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`)}var Br=Object,Vs=Br.getPrototypeOf,xf="constructor",kh="prototype",_v="configurable",bf="enumerable",ef="writable",Cu="value",wi=e=>!!e&&!!e[vr];function jn(e){var t;return e?v5(e)||Sh(e)||!!e[ik]||!!((t=e[xf])!=null&&t[ik])||Nh(e)||Eh(e):!1}var n$=Br[kh][xf].toString(),ak=new WeakMap;function v5(e){if(!e||!By(e))return!1;const t=Vs(e);if(t===null||t===Br[kh])return!0;const r=Br.hasOwnProperty.call(t,xf)&&t[xf];if(r===Object)return!0;if(!ys(r))return!1;let n=ak.get(r);return n===void 0&&(n=Function.toString.call(r),ak.set(r,n)),n===n$}function jh(e,t,r=!0){Xu(e)===0?(r?Reflect.ownKeys(e):Br.keys(e)).forEach(a=>{t(a,e[a],e)}):e.forEach((n,a)=>t(a,n,e))}function Xu(e){const t=e[vr];return t?t.type_:Sh(e)?1:Nh(e)?2:Eh(e)?3:0}var ok=(e,t,r=Xu(e))=>r===2?e.has(t):Br[kh].hasOwnProperty.call(e,t),Mv=(e,t,r=Xu(e))=>r===2?e.get(t):e[t],wf=(e,t,r,n=Xu(e))=>{n===2?e.set(t,r):n===3?e.add(r):e[t]=r};function i$(e,t){return e===t?e!==0||1/e===1/t:e!==e&&t!==t}var Sh=Array.isArray,Nh=e=>e instanceof Map,Eh=e=>e instanceof Set,By=e=>typeof e=="object",ys=e=>typeof e=="function",gg=e=>typeof e=="boolean";function a$(e){const t=+e;return Number.isInteger(t)&&String(t)===e}var ci=e=>e.copy_||e.base_,Uy=e=>e.modified_?e.copy_:e.base_;function Iv(e,t){if(Nh(e))return new Map(e);if(Eh(e))return new Set(e);if(Sh(e))return Array[kh].slice.call(e);const r=v5(e);if(t===!0||t==="class_only"&&!r){const n=Br.getOwnPropertyDescriptors(e);delete n[vr];let a=Reflect.ownKeys(n);for(let o=0;o1&&Br.defineProperties(e,{set:Dd,add:Dd,clear:Dd,delete:Dd}),Br.freeze(e),t&&jh(e,(r,n)=>{Hy(n,!0)},!1)),e}function o$(){yn(2)}var Dd={[Cu]:o$};function Ah(e){return e===null||!By(e)?!0:Br.isFrozen(e)}var kf="MapSet",Tv="Patches",sk="ArrayMethods",y5={};function wo(e){const t=y5[e];return t||yn(0,e),t}var lk=e=>!!y5[e],Pu,x5=()=>Pu,s$=(e,t)=>({drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0,handledSet_:new Set,processedForPatches_:new Set,mapSetPlugin_:lk(kf)?wo(kf):void 0,arrayMethodsPlugin_:lk(sk)?wo(sk):void 0});function uk(e,t){t&&(e.patchPlugin_=wo(Tv),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function Dv(e){Rv(e),e.drafts_.forEach(l$),e.drafts_=null}function Rv(e){e===Pu&&(Pu=e.parent_)}var ck=e=>Pu=s$(Pu,e);function l$(e){const t=e[vr];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0}function dk(e,t){t.unfinalizedDrafts_=t.drafts_.length;const r=t.drafts_[0];if(e!==void 0&&e!==r){r[vr].modified_&&(Dv(t),yn(4)),jn(e)&&(e=fk(t,e));const{patchPlugin_:a}=t;a&&a.generateReplacementPatches_(r[vr].base_,e,t)}else e=fk(t,r);return u$(t,e,!0),Dv(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e!==g5?e:void 0}function fk(e,t){if(Ah(t))return t;const r=t[vr];if(!r)return jf(t,e.handledSet_,e);if(!Ch(r,e))return t;if(!r.modified_)return r.base_;if(!r.finalized_){const{callbacks_:n}=r;if(n)for(;n.length>0;)n.pop()(e);k5(r,e)}return r.copy_}function u$(e,t,r=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&Hy(t,r)}function b5(e){e.finalized_=!0,e.scope_.unfinalizedDrafts_--}var Ch=(e,t)=>e.scope_===t,c$=[];function w5(e,t,r,n){const a=ci(e),o=e.type_;if(n!==void 0&&Mv(a,n,o)===t){wf(a,n,r,o);return}if(!e.draftLocations_){const u=e.draftLocations_=new Map;jh(a,(f,h)=>{if(wi(h)){const m=u.get(h)||[];m.push(f),u.set(h,m)}})}const c=e.draftLocations_.get(t)??c$;for(const u of c)wf(a,u,r,o)}function d$(e,t,r){e.callbacks_.push(function(a){var u;const o=t;if(!o||!Ch(o,a))return;(u=a.mapSetPlugin_)==null||u.fixSetContents(o);const c=Uy(o);w5(e,o.draft_??o,c,r),k5(o,a)})}function k5(e,t){var n;if(e.modified_&&!e.finalized_&&(e.type_===3||e.type_===1&&e.allIndicesReassigned_||(((n=e.assigned_)==null?void 0:n.size)??0)>0)){const{patchPlugin_:a}=t;if(a){const o=a.getPath(e);o&&a.generatePatches_(e,o,t)}b5(e)}}function f$(e,t,r){const{scope_:n}=e;if(wi(r)){const a=r[vr];Ch(a,n)&&a.callbacks_.push(function(){tf(e);const c=Uy(a);w5(e,r,c,t)})}else jn(r)&&e.callbacks_.push(function(){const o=ci(e);e.type_===3?o.has(r)&&jf(r,n.handledSet_,n):Mv(o,t,e.type_)===r&&n.drafts_.length>1&&(e.assigned_.get(t)??!1)===!0&&e.copy_&&jf(Mv(e.copy_,t,e.type_),n.handledSet_,n)})}function jf(e,t,r){return!r.immer_.autoFreeze_&&r.unfinalizedDrafts_<1||wi(e)||t.has(e)||!jn(e)||Ah(e)||(t.add(e),jh(e,(n,a)=>{if(wi(a)){const o=a[vr];if(Ch(o,r)){const c=Uy(o);wf(e,n,c,e.type_),b5(o)}}else jn(a)&&jf(a,t,r)})),e}function h$(e,t){const r=Sh(e),n={type_:r?1:0,scope_:t?t.scope_:x5(),modified_:!1,finalized_:!1,assigned_:void 0,parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1,callbacks_:void 0};let a=n,o=Sf;r&&(a=[n],o=Ou);const{revoke:c,proxy:u}=Proxy.revocable(a,o);return n.draft_=u,n.revoke_=c,[u,n]}var Sf={get(e,t){if(t===vr)return e;let r=e.scope_.arrayMethodsPlugin_;const n=e.type_===1&&typeof t=="string";if(n&&r!=null&&r.isArrayOperationMethod(t))return r.createMethodInterceptor(e,t);const a=ci(e);if(!ok(a,t,e.type_))return m$(e,a,t);const o=a[t];if(e.finalized_||!jn(o)||n&&e.operationMethod&&(r!=null&&r.isMutatingArrayMethod(e.operationMethod))&&a$(t))return o;if(o===vg(e.base_,t)){tf(e);const c=e.type_===1?+t:t,u=$v(e.scope_,o,e,c);return e.copy_[c]=u}return o},has(e,t){return t in ci(e)},ownKeys(e){return Reflect.ownKeys(ci(e))},set(e,t,r){const n=j5(ci(e),t);if(n!=null&&n.set)return n.set.call(e.draft_,r),!0;if(!e.modified_){const a=vg(ci(e),t),o=a==null?void 0:a[vr];if(o&&o.base_===r)return e.copy_[t]=r,e.assigned_.set(t,!1),!0;if(i$(r,a)&&(r!==void 0||ok(e.base_,t,e.type_)))return!0;tf(e),Lv(e)}return e.copy_[t]===r&&(r!==void 0||t in e.copy_)||Number.isNaN(r)&&Number.isNaN(e.copy_[t])||(e.copy_[t]=r,e.assigned_.set(t,!0),f$(e,t,r)),!0},deleteProperty(e,t){return tf(e),vg(e.base_,t)!==void 0||t in e.base_?(e.assigned_.set(t,!1),Lv(e)):e.assigned_.delete(t),e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){const r=ci(e),n=Reflect.getOwnPropertyDescriptor(r,t);return n&&{[ef]:!0,[_v]:e.type_!==1||t!=="length",[bf]:n[bf],[Cu]:r[t]}},defineProperty(){yn(11)},getPrototypeOf(e){return Vs(e.base_)},setPrototypeOf(){yn(12)}},Ou={};for(let e in Sf){let t=Sf[e];Ou[e]=function(){const r=arguments;return r[0]=r[0][0],t.apply(this,r)}}Ou.deleteProperty=function(e,t){return Ou.set.call(this,e,t,void 0)};Ou.set=function(e,t,r){return Sf.set.call(this,e[0],t,r,e[0])};function vg(e,t){const r=e[vr];return(r?ci(r):e)[t]}function m$(e,t,r){var a;const n=j5(t,r);return n?Cu in n?n[Cu]:(a=n.get)==null?void 0:a.call(e.draft_):void 0}function j5(e,t){if(!(t in e))return;let r=Vs(e);for(;r;){const n=Object.getOwnPropertyDescriptor(r,t);if(n)return n;r=Vs(r)}}function Lv(e){e.modified_||(e.modified_=!0,e.parent_&&Lv(e.parent_))}function tf(e){e.copy_||(e.assigned_=new Map,e.copy_=Iv(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var p$=class{constructor(t){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!1,this.produce=(r,n,a)=>{if(ys(r)&&!ys(n)){const c=n;n=r;const u=this;return function(h=c,...m){return u.produce(h,g=>n.call(this,g,...m))}}ys(n)||yn(6),a!==void 0&&!ys(a)&&yn(7);let o;if(jn(r)){const c=ck(this),u=$v(c,r,void 0);let f=!0;try{o=n(u),f=!1}finally{f?Dv(c):Rv(c)}return uk(c,a),dk(o,c)}else if(!r||!By(r)){if(o=n(r),o===void 0&&(o=r),o===g5&&(o=void 0),this.autoFreeze_&&Hy(o,!0),a){const c=[],u=[];wo(Tv).generateReplacementPatches_(r,o,{patches_:c,inversePatches_:u}),a(c,u)}return o}else yn(1,r)},this.produceWithPatches=(r,n)=>{if(ys(r))return(u,...f)=>this.produceWithPatches(u,h=>r(h,...f));let a,o;return[this.produce(r,n,(u,f)=>{a=u,o=f}),a,o]},gg(t==null?void 0:t.autoFreeze)&&this.setAutoFreeze(t.autoFreeze),gg(t==null?void 0:t.useStrictShallowCopy)&&this.setUseStrictShallowCopy(t.useStrictShallowCopy),gg(t==null?void 0:t.useStrictIteration)&&this.setUseStrictIteration(t.useStrictIteration)}createDraft(t){jn(t)||yn(8),wi(t)&&(t=en(t));const r=ck(this),n=$v(r,t,void 0);return n[vr].isManual_=!0,Rv(r),n}finishDraft(t,r){const n=t&&t[vr];(!n||!n.isManual_)&&yn(9);const{scope_:a}=n;return uk(a,r),dk(void 0,a)}setAutoFreeze(t){this.autoFreeze_=t}setUseStrictShallowCopy(t){this.useStrictShallowCopy_=t}setUseStrictIteration(t){this.useStrictIteration_=t}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(t,r){let n;for(n=r.length-1;n>=0;n--){const o=r[n];if(o.path.length===0&&o.op==="replace"){t=o.value;break}}n>-1&&(r=r.slice(n+1));const a=wo(Tv).applyPatches_;return wi(t)?a(t,r):this.produce(t,o=>a(o,r))}};function $v(e,t,r,n){const[a,o]=Nh(t)?wo(kf).proxyMap_(t,r):Eh(t)?wo(kf).proxySet_(t,r):h$(t,r);return((r==null?void 0:r.scope_)??x5()).drafts_.push(a),o.callbacks_=(r==null?void 0:r.callbacks_)??[],o.key_=n,r&&n!==void 0?d$(r,o,n):o.callbacks_.push(function(f){var m;(m=f.mapSetPlugin_)==null||m.fixSetContents(o);const{patchPlugin_:h}=f;o.modified_&&h&&h.generatePatches_(o,[],f)}),a}function en(e){return wi(e)||yn(10,e),S5(e)}function S5(e){if(!jn(e)||Ah(e))return e;const t=e[vr];let r,n=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,r=Iv(e,t.scope_.immer_.useStrictShallowCopy_),n=t.scope_.immer_.shouldUseStrictIteration()}else r=Iv(e,!0);return jh(r,(a,o)=>{wf(r,a,S5(o))},n),t&&(t.finalized_=!1),r}var g$=new p$,N5=g$.produce;function E5(e){return({dispatch:r,getState:n})=>a=>o=>typeof o=="function"?o(r,n,e):a(o)}var v$=E5(),y$=E5,x$=typeof window<"u"&&window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__?window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__:function(){if(arguments.length!==0)return typeof arguments[0]=="object"?yf:yf.apply(null,arguments)};function Hr(e,t){function r(...n){if(t){let a=t(...n);if(!a)throw new Error(Ur(0));return{type:e,payload:a.payload,..."meta"in a&&{meta:a.meta},..."error"in a&&{error:a.error}}}return{type:e,payload:n[0]}}return r.toString=()=>`${e}`,r.type=e,r.match=n=>p5(n)&&n.type===e,r}var A5=class pu extends Array{constructor(...t){super(...t),Object.setPrototypeOf(this,pu.prototype)}static get[Symbol.species](){return pu}concat(...t){return super.concat.apply(this,t)}prepend(...t){return t.length===1&&Array.isArray(t[0])?new pu(...t[0].concat(this)):new pu(...t.concat(this))}};function hk(e){return jn(e)?N5(e,()=>{}):e}function Rd(e,t,r){return e.has(t)?e.get(t):e.set(t,r(t)).get(t)}function b$(e){return typeof e=="boolean"}var w$=()=>function(t){const{thunk:r=!0,immutableCheck:n=!0,serializableCheck:a=!0,actionCreatorCheck:o=!0}=t??{};let c=new A5;return r&&(b$(r)?c.push(v$):c.push(y$(r.extraArgument))),c},C5="RTK_autoBatch",st=()=>e=>({payload:e,meta:{[C5]:!0}}),mk=e=>t=>{setTimeout(t,e)},k$=(e,t)=>r=>{let n=!1;const a=()=>{n||(n=!0,cancelAnimationFrame(o),clearTimeout(c),r())},o=e(a),c=setTimeout(a,t)},P5=(e={type:"raf"})=>t=>(...r)=>{const n=t(...r);let a=!0,o=!1,c=!1;const u=new Set,f=e.type==="tick"?queueMicrotask:e.type==="raf"?typeof window<"u"&&window.requestAnimationFrame?k$(window.requestAnimationFrame,100):mk(10):e.type==="callback"?e.queueNotification:mk(e.timeout),h=()=>{c=!1,o&&(o=!1,u.forEach(m=>m()))};return Object.assign({},n,{subscribe(m){const g=()=>a&&m(),v=n.subscribe(g);return u.add(m),()=>{v(),u.delete(m)}},dispatch(m){var g;try{return a=!((g=m==null?void 0:m.meta)!=null&&g[C5]),o=!a,o&&(c||(c=!0,f(h))),n.dispatch(m)}finally{a=!0}}})},j$=e=>function(r){const{autoBatch:n=!0}=r??{};let a=new A5(e);return n&&a.push(P5(typeof n=="object"?n:void 0)),a};function S$(e){const t=w$(),{reducer:r=void 0,middleware:n,devTools:a=!0,preloadedState:o=void 0,enhancers:c=void 0}=e||{};let u;if(typeof r=="function")u=r;else if(Fy(r))u=m5(r);else throw new Error(Ur(1));let f;typeof n=="function"?f=n(t):f=t();let h=yf;a&&(h=x$({trace:!1,...typeof a=="object"&&a}));const m=r$(...f),g=j$(m);let v=typeof c=="function"?c(g):g();const b=h(...v);return h5(u,o,b)}function O5(e){const t={},r=[];let n;const a={addCase(o,c){const u=typeof o=="string"?o:o.type;if(!u)throw new Error(Ur(28));if(u in t)throw new Error(Ur(29));return t[u]=c,a},addAsyncThunk(o,c){return c.pending&&(t[o.pending.type]=c.pending),c.rejected&&(t[o.rejected.type]=c.rejected),c.fulfilled&&(t[o.fulfilled.type]=c.fulfilled),c.settled&&r.push({matcher:o.settled,reducer:c.settled}),a},addMatcher(o,c){return r.push({matcher:o,reducer:c}),a},addDefaultCase(o){return n=o,a}};return e(a),[t,r,n]}function N$(e){return typeof e=="function"}function E$(e,t){let[r,n,a]=O5(t),o;if(N$(e))o=()=>hk(e());else{const u=hk(e);o=()=>u}function c(u=o(),f){let h=[r[f.type],...n.filter(({matcher:m})=>m(f)).map(({reducer:m})=>m)];return h.filter(m=>!!m).length===0&&(h=[a]),h.reduce((m,g)=>{if(g)if(wi(m)){const b=g(m,f);return b===void 0?m:b}else{if(jn(m))return N5(m,v=>g(v,f));{const v=g(m,f);if(v===void 0){if(m===null)return m;throw Error("A case reducer on a non-draftable value must not return undefined")}return v}}return m},u)}return c.getInitialState=o,c}var A$="ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW",C$=(e=21)=>{let t="",r=e;for(;r--;)t+=A$[Math.random()*64|0];return t},P$=Symbol.for("rtk-slice-createasyncthunk");function O$(e,t){return`${e}/${t}`}function _$({creators:e}={}){var r;const t=(r=e==null?void 0:e.asyncThunk)==null?void 0:r[P$];return function(a){const{name:o,reducerPath:c=o}=a;if(!o)throw new Error(Ur(11));const u=(typeof a.reducers=="function"?a.reducers(I$()):a.reducers)||{},f=Object.keys(u),h={sliceCaseReducersByName:{},sliceCaseReducersByType:{},actionCreators:{},sliceMatchers:[]},m={addCase(P,_){const O=typeof P=="string"?P:P.type;if(!O)throw new Error(Ur(12));if(O in h.sliceCaseReducersByType)throw new Error(Ur(13));return h.sliceCaseReducersByType[O]=_,m},addMatcher(P,_){return h.sliceMatchers.push({matcher:P,reducer:_}),m},exposeAction(P,_){return h.actionCreators[P]=_,m},exposeCaseReducer(P,_){return h.sliceCaseReducersByName[P]=_,m}};f.forEach(P=>{const _=u[P],O={reducerName:P,type:O$(o,P),createNotation:typeof a.reducers=="function"};D$(_)?L$(O,_,m,t):T$(O,_,m)});function g(){const[P={},_=[],O=void 0]=typeof a.extraReducers=="function"?O5(a.extraReducers):[a.extraReducers],D={...P,...h.sliceCaseReducersByType};return E$(a.initialState,U=>{for(let B in D)U.addCase(B,D[B]);for(let B of h.sliceMatchers)U.addMatcher(B.matcher,B.reducer);for(let B of _)U.addMatcher(B.matcher,B.reducer);O&&U.addDefaultCase(O)})}const v=P=>P,b=new Map,j=new WeakMap;let k;function S(P,_){return k||(k=g()),k(P,_)}function N(){return k||(k=g()),k.getInitialState()}function E(P,_=!1){function O(U){let B=U[P];return typeof B>"u"&&_&&(B=Rd(j,O,N)),B}function D(U=v){const B=Rd(b,_,()=>new WeakMap);return Rd(B,U,()=>{const F={};for(const[Y,H]of Object.entries(a.selectors??{}))F[Y]=M$(H,U,()=>Rd(j,U,N),_);return F})}return{reducerPath:P,getSelectors:D,get selectors(){return D(O)},selectSlice:O}}const A={name:o,reducer:S,actions:h.actionCreators,caseReducers:h.sliceCaseReducersByName,getInitialState:N,...E(c),injectInto(P,{reducerPath:_,...O}={}){const D=_??c;return P.inject({reducerPath:D,reducer:S},O),{...A,...E(D,!0)}}};return A}}function M$(e,t,r,n){function a(o,...c){let u=t(o);return typeof u>"u"&&n&&(u=r()),e(u,...c)}return a.unwrapped=e,a}var lr=_$();function I$(){function e(t,r){return{_reducerDefinitionType:"asyncThunk",payloadCreator:t,...r}}return e.withTypes=()=>e,{reducer(t){return Object.assign({[t.name](...r){return t(...r)}}[t.name],{_reducerDefinitionType:"reducer"})},preparedReducer(t,r){return{_reducerDefinitionType:"reducerWithPrepare",prepare:t,reducer:r}},asyncThunk:e}}function T$({type:e,reducerName:t,createNotation:r},n,a){let o,c;if("reducer"in n){if(r&&!R$(n))throw new Error(Ur(17));o=n.reducer,c=n.prepare}else o=n;a.addCase(e,o).exposeCaseReducer(t,o).exposeAction(t,c?Hr(e,c):Hr(e))}function D$(e){return e._reducerDefinitionType==="asyncThunk"}function R$(e){return e._reducerDefinitionType==="reducerWithPrepare"}function L$({type:e,reducerName:t},r,n,a){if(!a)throw new Error(Ur(18));const{payloadCreator:o,fulfilled:c,pending:u,rejected:f,settled:h,options:m}=r,g=a(e,o,m);n.exposeAction(t,g),c&&n.addCase(g.fulfilled,c),u&&n.addCase(g.pending,u),f&&n.addCase(g.rejected,f),h&&n.addMatcher(g.settled,h),n.exposeCaseReducer(t,{fulfilled:c||Ld,pending:u||Ld,rejected:f||Ld,settled:h||Ld})}function Ld(){}var $$="task",_5="listener",M5="completed",Wy="cancelled",z$=`task-${Wy}`,F$=`task-${M5}`,zv=`${_5}-${Wy}`,B$=`${_5}-${M5}`,Ph=class{constructor(e){is(this,"code");is(this,"name","TaskAbortError");is(this,"message");this.code=e,this.message=`${$$} ${Wy} (reason: ${e})`}},Ky=(e,t)=>{if(typeof e!="function")throw new TypeError(Ur(32))},Nf=()=>{},I5=(e,t=Nf)=>(e.catch(t),e),T5=(e,t)=>(e.addEventListener("abort",t,{once:!0}),()=>e.removeEventListener("abort",t)),po=e=>{if(e.aborted)throw new Ph(e.reason)};function D5(e,t){let r=Nf;return new Promise((n,a)=>{const o=()=>a(new Ph(e.reason));if(e.aborted){o();return}r=T5(e,o),t.finally(()=>r()).then(n,a)}).finally(()=>{r=Nf})}var U$=async(e,t)=>{try{return await Promise.resolve(),{status:"ok",value:await e()}}catch(r){return{status:r instanceof Ph?"cancelled":"rejected",error:r}}finally{t==null||t()}},Ef=e=>t=>I5(D5(e,t).then(r=>(po(e),r))),R5=e=>{const t=Ef(e);return r=>t(new Promise(n=>setTimeout(n,r)))},{assign:Ns}=Object,pk={},Oh="listenerMiddleware",H$=(e,t)=>{const r=n=>T5(e,()=>n.abort(e.reason));return(n,a)=>{Ky(n);const o=new AbortController;r(o);const c=U$(async()=>{po(e),po(o.signal);const u=await n({pause:Ef(o.signal),delay:R5(o.signal),signal:o.signal});return po(o.signal),u},()=>o.abort(F$));return a!=null&&a.autoJoin&&t.push(c.catch(Nf)),{result:Ef(e)(c),cancel(){o.abort(z$)}}}},W$=(e,t)=>{const r=async(n,a)=>{po(t);let o=()=>{};const u=[new Promise((f,h)=>{let m=e({predicate:n,effect:(g,v)=>{v.unsubscribe(),f([g,v.getState(),v.getOriginalState()])}});o=()=>{m(),h()}})];a!=null&&u.push(new Promise(f=>setTimeout(f,a,null)));try{const f=await D5(t,Promise.race(u));return po(t),f}finally{o()}};return((n,a)=>I5(r(n,a)))},L5=e=>{let{type:t,actionCreator:r,matcher:n,predicate:a,effect:o}=e;if(t)a=Hr(t).match;else if(r)t=r.type,a=r.match;else if(n)a=n;else if(!a)throw new Error(Ur(21));return Ky(o),{predicate:a,type:t,effect:o}},$5=Ns(e=>{const{type:t,predicate:r,effect:n}=L5(e);return{id:C$(),effect:n,type:t,predicate:r,pending:new Set,unsubscribe:()=>{throw new Error(Ur(22))}}},{withTypes:()=>$5}),gk=(e,t)=>{const{type:r,effect:n,predicate:a}=L5(t);return Array.from(e.values()).find(o=>(typeof r=="string"?o.type===r:o.predicate===a)&&o.effect===n)},Fv=e=>{e.pending.forEach(t=>{t.abort(zv)})},K$=(e,t)=>()=>{for(const r of t.keys())Fv(r);e.clear()},vk=(e,t,r)=>{try{e(t,r)}catch(n){setTimeout(()=>{throw n},0)}},z5=Ns(Hr(`${Oh}/add`),{withTypes:()=>z5}),G$=Hr(`${Oh}/removeAll`),F5=Ns(Hr(`${Oh}/remove`),{withTypes:()=>F5}),V$=(...e)=>{console.error(`${Oh}/error`,...e)},Zu=(e={})=>{const t=new Map,r=new Map,n=b=>{const j=r.get(b)??0;r.set(b,j+1)},a=b=>{const j=r.get(b)??1;j===1?r.delete(b):r.set(b,j-1)},{extra:o,onError:c=V$}=e;Ky(c);const u=b=>(b.unsubscribe=()=>t.delete(b.id),t.set(b.id,b),j=>{b.unsubscribe(),j!=null&&j.cancelActive&&Fv(b)}),f=(b=>{const j=gk(t,b)??$5(b);return u(j)});Ns(f,{withTypes:()=>f});const h=b=>{const j=gk(t,b);return j&&(j.unsubscribe(),b.cancelActive&&Fv(j)),!!j};Ns(h,{withTypes:()=>h});const m=async(b,j,k,S)=>{const N=new AbortController,E=W$(f,N.signal),A=[];try{b.pending.add(N),n(b),await Promise.resolve(b.effect(j,Ns({},k,{getOriginalState:S,condition:(P,_)=>E(P,_).then(Boolean),take:E,delay:R5(N.signal),pause:Ef(N.signal),extra:o,signal:N.signal,fork:H$(N.signal,A),unsubscribe:b.unsubscribe,subscribe:()=>{t.set(b.id,b)},cancelActiveListeners:()=>{b.pending.forEach((P,_,O)=>{P!==N&&(P.abort(zv),O.delete(P))})},cancel:()=>{N.abort(zv),b.pending.delete(N)},throwIfCancelled:()=>{po(N.signal)}})))}catch(P){P instanceof Ph||vk(c,P,{raisedBy:"effect"})}finally{await Promise.all(A),N.abort(B$),a(b),b.pending.delete(N)}},g=K$(t,r);return{middleware:b=>j=>k=>{if(!p5(k))return j(k);if(z5.match(k))return f(k.payload);if(G$.match(k)){g();return}if(F5.match(k))return h(k.payload);let S=b.getState();const N=()=>{if(S===pk)throw new Error(Ur(23));return S};let E;try{if(E=j(k),t.size>0){const A=b.getState(),P=Array.from(t.values());for(const _ of P){let O=!1;try{O=_.predicate(k,A,S)}catch(D){O=!1,vk(c,D,{raisedBy:"predicate"})}O&&m(_,k,b,N)}}}finally{S=pk}return E},startListening:f,stopListening:h,clearListeners:g}};function Ur(e){return`Minified Redux Toolkit error #${e}; visit https://redux-toolkit.js.org/Errors?code=${e} for the full message or use the non-minified dev environment for full errors. `}var q$={layoutType:"horizontal",width:0,height:0,margin:{top:5,right:5,bottom:5,left:5},scale:1},B5=lr({name:"chartLayout",initialState:q$,reducers:{setLayout(e,t){e.layoutType=t.payload},setChartSize(e,t){e.width=t.payload.width,e.height=t.payload.height},setMargin(e,t){var r,n,a,o;e.margin.top=(r=t.payload.top)!==null&&r!==void 0?r:0,e.margin.right=(n=t.payload.right)!==null&&n!==void 0?n:0,e.margin.bottom=(a=t.payload.bottom)!==null&&a!==void 0?a:0,e.margin.left=(o=t.payload.left)!==null&&o!==void 0?o:0},setScale(e,t){e.scale=t.payload}}}),_h=B5.actions,Q$=_h.setMargin,Y$=_h.setLayout,X$=_h.setChartSize,Z$=_h.setScale,J$=B5.reducer;function U5(e,t,r){return Array.isArray(e)&&e&&t+r!==0?e.slice(t,r+1):e}function We(e){return Number.isFinite(e)}function Vn(e){return typeof e=="number"&&e>0&&Number.isFinite(e)}function yk(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function bs(e){for(var t=1;t{if(t&&r){var n=r.width,a=r.height,o=t.align,c=t.verticalAlign,u=t.layout;if((u==="vertical"||u==="horizontal"&&c==="middle")&&o!=="center"&&Ee(e[o]))return bs(bs({},e),{},{[o]:e[o]+(n||0)});if((u==="horizontal"||u==="vertical"&&o==="center")&&c!=="middle"&&Ee(e[c]))return bs(bs({},e),{},{[c]:e[c]+(a||0)})}return e},Xn=(e,t)=>e==="horizontal"&&t==="xAxis"||e==="vertical"&&t==="yAxis"||e==="centric"&&t==="angleAxis"||e==="radial"&&t==="radiusAxis",H5=(e,t,r,n)=>{if(n)return e.map(u=>u.coordinate);var a,o,c=e.map(u=>(u.coordinate===t&&(a=!0),u.coordinate===r&&(o=!0),u.coordinate));return a||c.push(t),o||c.push(r),c},W5=(e,t,r)=>{if(!e)return null;var n=e.duplicateDomain,a=e.type,o=e.range,c=e.scale,u=e.realScaleType,f=e.isCategorical,h=e.categoricalDomain,m=e.tickCount,g=e.ticks,v=e.niceTicks,b=e.axisType;if(!c)return null;var j=u==="scaleBand"&&c.bandwidth?c.bandwidth()/2:2,k=a==="category"&&c.bandwidth?c.bandwidth()/j:0;if(k=b==="angleAxis"&&o&&o.length>=2?Jr(o[0]-o[1])*2*k:k,g||v){var S=(g||v||[]).map((N,E)=>{var A=n?n.indexOf(N):N,P=c.map(A);return We(P)?{coordinate:P+k,value:N,offset:k,index:E}:null}).filter(Ar);return S}return f&&h?h.map((N,E)=>{var A=c.map(N);return We(A)?{coordinate:A+k,value:N,index:E,offset:k}:null}).filter(Ar):c.ticks&&m!=null?c.ticks(m).map((N,E)=>{var A=c.map(N);return We(A)?{coordinate:A+k,value:N,index:E,offset:k}:null}).filter(Ar):c.domain().map((N,E)=>{var A=c.map(N);return We(A)?{coordinate:A+k,value:n?n[N]:N,index:E,offset:k}:null}).filter(Ar)},iz=e=>{var t,r=e.length;if(!(r<=0)){var n=(t=e[0])===null||t===void 0?void 0:t.length;if(!(n==null||n<=0))for(var a=0;a=0?(h[0]=o,o+=v,h[1]=o):(h[0]=c,c+=v,h[1]=c)}}}},az=e=>{var t,r=e.length;if(!(r<=0)){var n=(t=e[0])===null||t===void 0?void 0:t.length;if(!(n==null||n<=0))for(var a=0;a=0?(f[0]=o,o+=h,f[1]=o):(f[0]=0,f[1]=0)}}}},oz={sign:iz,expand:kR,none:xo,silhouette:jR,wiggle:SR,positive:az},sz=(e,t,r)=>{var n,a=(n=oz[r])!==null&&n!==void 0?n:xo,o=wR().keys(t).value((u,f)=>Number(Lt(u,f,0))).order(Ev).offset(a),c=o(e);return c.forEach((u,f)=>{u.forEach((h,m)=>{var g=Lt(e[m],t[f],0);Array.isArray(g)&&g.length===2&&Ee(g[0])&&Ee(g[1])&&(h[0]=g[0],h[1]=g[1])})}),c};function lz(e){return e==null?void 0:String(e)}function xk(e){var t=e.axis,r=e.ticks,n=e.bandSize,a=e.entry,o=e.index,c=e.dataKey;if(t.type==="category"){if(!t.allowDuplicatedCategory&&t.dataKey&&!Yt(a[t.dataKey])){var u=YE(r,"value",a[t.dataKey]);if(u)return u.coordinate+n/2}return r!=null&&r[o]?r[o].coordinate+n/2:null}var f=Lt(a,Yt(c)?t.dataKey:c),h=t.scale.map(f);return Ee(h)?h:null}var uz=e=>{var t=e.flat(2).filter(Ee);return[Math.min(...t),Math.max(...t)]},cz=e=>[e[0]===1/0?0:e[0],e[1]===-1/0?0:e[1]],dz=(e,t,r)=>{if(!(e==null||Object.keys(e).length===0))return cz(Object.keys(e).reduce((n,a)=>{var o=e[a];if(!o)return n;var c=o.stackedData,u=c.reduce((f,h)=>{var m=U5(h,t,r),g=uz(m);return!We(g[0])||!We(g[1])?f:[Math.min(f[0],g[0]),Math.max(f[1],g[1])]},[1/0,-1/0]);return[Math.min(u[0],n[0]),Math.max(u[1],n[1])]},[1/0,-1/0]))},bk=/^dataMin[\s]*-[\s]*([0-9]+([.]{1}[0-9]+){0,1})$/,wk=/^dataMax[\s]*\+[\s]*([0-9]+([.]{1}[0-9]+){0,1})$/,Af=(e,t,r)=>{if(e&&e.scale&&e.scale.bandwidth){var n=e.scale.bandwidth();if(!r||n>0)return n}if(e&&t&&t.length>=2){for(var a=wh(t,m=>m.coordinate),o=1/0,c=1,u=a.length;c{if(t==="horizontal")return e.relativeX;if(t==="vertical")return e.relativeY},hz=(e,t)=>t==="centric"?e.angle:e.radius,Ei=e=>e.layout.width,Ai=e=>e.layout.height,mz=e=>e.layout.scale,G5=e=>e.layout.margin,Mh=q(e=>e.cartesianAxis.xAxis,e=>Object.values(e)),Ih=q(e=>e.cartesianAxis.yAxis,e=>Object.values(e)),pz="data-recharts-item-index",gz="data-recharts-item-id",Ju=60;function jk(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function $d(e){for(var t=1;te.brush.height;function wz(e){var t=Ih(e);return t.reduce((r,n)=>{if(n.orientation==="left"&&!n.mirror&&!n.hide){var a=typeof n.width=="number"?n.width:Ju;return r+a}return r},0)}function kz(e){var t=Ih(e);return t.reduce((r,n)=>{if(n.orientation==="right"&&!n.mirror&&!n.hide){var a=typeof n.width=="number"?n.width:Ju;return r+a}return r},0)}function jz(e){var t=Mh(e);return t.reduce((r,n)=>n.orientation==="top"&&!n.mirror&&!n.hide?r+n.height:r,0)}function Sz(e){var t=Mh(e);return t.reduce((r,n)=>n.orientation==="bottom"&&!n.mirror&&!n.hide?r+n.height:r,0)}var Zt=q([Ei,Ai,G5,bz,wz,kz,jz,Sz,f5,KL],(e,t,r,n,a,o,c,u,f,h)=>{var m={left:(r.left||0)+a,right:(r.right||0)+o},g={top:(r.top||0)+c,bottom:(r.bottom||0)+u},v=$d($d({},g),m),b=v.bottom;v.bottom+=n,v=nz(v,f,h);var j=e-v.left-v.right,k=t-v.top-v.bottom;return $d($d({brushBottom:b},v),{},{width:Math.max(j,0),height:Math.max(k,0)})}),Nz=q(Zt,e=>({x:e.left,y:e.top,width:e.width,height:e.height})),V5=q(Ei,Ai,(e,t)=>({x:0,y:0,width:e,height:t})),Ez=y.createContext(null),Pr=()=>y.useContext(Ez)!=null,Th=e=>e.brush,Dh=q([Th,Zt,G5],(e,t,r)=>({height:e.height,x:Ee(e.x)?e.x:t.left,y:Ee(e.y)?e.y:t.top+t.height+t.brushBottom-((r==null?void 0:r.bottom)||0),width:Ee(e.width)?e.width:t.width}));function Az(e,t,{signal:r,edges:n}={}){let a,o=null;const c=n!=null&&n.includes("leading"),u=n==null||n.includes("trailing"),f=()=>{o!==null&&(e.apply(a,o),a=void 0,o=null)},h=()=>{u&&f(),b()};let m=null;const g=()=>{m!=null&&clearTimeout(m),m=setTimeout(()=>{m=null,h()},t)},v=()=>{m!==null&&(clearTimeout(m),m=null)},b=()=>{v(),a=void 0,o=null},j=()=>{f()},k=function(...S){if(r!=null&&r.aborted)return;a=this,o=S;const N=m==null;g(),c&&N&&f()};return k.schedule=g,k.cancel=b,k.flush=j,r==null||r.addEventListener("abort",b,{once:!0}),k}function Cz(e,t=0,r={}){typeof r!="object"&&(r={});const{leading:n=!1,trailing:a=!0,maxWait:o}=r,c=Array(2);n&&(c[0]="leading"),a&&(c[1]="trailing");let u,f=null;const h=Az(function(...v){u=e.apply(this,v),f=null},t,{edges:c}),m=function(...v){return o!=null&&(f===null&&(f=Date.now()),Date.now()-f>=o)?(u=e.apply(this,v),f=Date.now(),h.cancel(),h.schedule(),u):(h.apply(this,v),u)},g=()=>(h.flush(),u);return m.cancel=h.cancel,m.flush=g,m}function Pz(e,t=0,r={}){const{leading:n=!0,trailing:a=!0}=r;return Cz(e,t,{leading:n,maxWait:t,trailing:a})}var Cf=function(t,r){for(var n=arguments.length,a=new Array(n>2?n-2:0),o=2;oa[c++]))}},zn={width:"100%",height:"100%",debounce:0,minWidth:0,initialDimension:{width:-1,height:-1}},q5=(e,t,r)=>{var n=r.width,a=n===void 0?zn.width:n,o=r.height,c=o===void 0?zn.height:o,u=r.aspect,f=r.maxHeight,h=bo(a)?e:Number(a),m=bo(c)?t:Number(c);return u&&u>0&&(h?m=h/u:m&&(h=m*u),f&&m!=null&&m>f&&(m=f)),{calculatedWidth:h,calculatedHeight:m}},Oz={width:0,height:0,overflow:"visible"},_z={width:0,overflowX:"visible"},Mz={height:0,overflowY:"visible"},Iz={},Tz=e=>{var t=e.width,r=e.height,n=bo(t),a=bo(r);return n&&a?Oz:n?_z:a?Mz:Iz};function Dz(e){var t=e.width,r=e.height,n=e.aspect,a=t,o=r;return a===void 0&&o===void 0?(a=zn.width,o=zn.height):a===void 0?a=n&&n>0?void 0:zn.width:o===void 0&&(o=n&&n>0?void 0:zn.height),{width:a,height:o}}var Rz=["aspect","initialDimension","width","height","minWidth","minHeight","maxHeight","children","debounce","id","className","onResize","style"];function Pf(){return Pf=Object.assign?Object.assign.bind():function(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);r({width:r,height:n}),[r,n]);return Vz(a)?y.createElement(Q5.Provider,{value:a},t):null}var Gy=()=>y.useContext(Q5),qz=y.forwardRef((e,t)=>{var r=e.aspect,n=e.initialDimension,a=n===void 0?zn.initialDimension:n,o=e.width,c=e.height,u=e.minWidth,f=u===void 0?zn.minWidth:u,h=e.minHeight,m=e.maxHeight,g=e.children,v=e.debounce,b=v===void 0?zn.debounce:v,j=e.id,k=e.className,S=e.onResize,N=e.style,E=N===void 0?{}:N,A=Kz(e,Rz),P=y.useRef(null),_=y.useRef();_.current=S,y.useImperativeHandle(t,()=>P.current);var O=y.useState({containerWidth:a.width,containerHeight:a.height}),D=Fz(O,2),U=D[0],B=D[1],F=y.useCallback((ae,se)=>{B(X=>{var te=Math.round(ae),J=Math.round(se);return X.containerWidth===te&&X.containerHeight===J?X:{containerWidth:te,containerHeight:J}})},[]);y.useEffect(()=>{if(P.current==null||typeof ResizeObserver>"u")return nl;var ae=I=>{var M,K=I[0];if(K!=null){var ne=K.contentRect,Z=ne.width,me=ne.height;F(Z,me),(M=_.current)===null||M===void 0||M.call(_,Z,me)}};b>0&&(ae=Pz(ae,b,{trailing:!0,leading:!1}));var se=new ResizeObserver(ae),X=P.current.getBoundingClientRect(),te=X.width,J=X.height;return F(te,J),se.observe(P.current),()=>{se.disconnect()}},[F,b]);var Y=U.containerWidth,H=U.containerHeight;Cf(!r||r>0,"The aspect(%s) must be greater than zero.",r);var pe=q5(Y,H,{width:o,height:c,aspect:r,maxHeight:m}),ue=pe.calculatedWidth,he=pe.calculatedHeight;return Cf(Y<0||H<0||ue!=null&&ue>0||he!=null&&he>0,`The width(%s) and height(%s) of chart should be greater than 0, - please check the style of container, or the props width(%s) and height(%s), - or add a minWidth(%s) or minHeight(%s) or use aspect(%s) to control the - height and width.`,ue,he,o,c,f,h,r),y.createElement("div",Pf({id:j?"".concat(j):void 0,className:nt("recharts-responsive-container",k),style:Nk(Nk({},E),{},{width:o,height:c,minWidth:f,minHeight:h,maxHeight:m}),ref:P},A),y.createElement("div",{style:Tz({width:o,height:c})},y.createElement(Y5,{width:ue,height:he},g)))}),Qz=y.forwardRef((e,t)=>{var r=Gy();if(Vn(r.width)&&Vn(r.height))return e.children;var n=Dz({width:e.width,height:e.height,aspect:e.aspect}),a=n.width,o=n.height,c=q5(void 0,void 0,{width:a,height:o,aspect:e.aspect,maxHeight:e.maxHeight}),u=c.calculatedWidth,f=c.calculatedHeight;return Ee(u)&&Ee(f)?y.createElement(Y5,{width:u,height:f},e.children):y.createElement(qz,Pf({},e,{width:a,height:o,ref:t}))});function Vy(e){if(e)return{x:e.x,y:e.y,upperWidth:"upperWidth"in e?e.upperWidth:e.width,lowerWidth:"lowerWidth"in e?e.lowerWidth:e.width,width:e.width,height:e.height}}var Rh=()=>{var e,t=Pr(),r=Me(Nz),n=Me(Dh),a=(e=Me(Th))===null||e===void 0?void 0:e.padding;return!t||!n||!a?r:{width:n.width-a.left-a.right,height:n.height-a.top-a.bottom,x:a.left,y:a.top}},Yz={top:0,bottom:0,left:0,right:0,width:0,height:0,brushBottom:0},X5=()=>{var e;return(e=Me(Zt))!==null&&e!==void 0?e:Yz},Z5=()=>Me(Ei),J5=()=>Me(Ai),ft=e=>e.layout.layoutType,il=()=>Me(ft),qy=()=>{var e=il();if(e==="horizontal"||e==="vertical")return e},eA=e=>{var t=e.layout.layoutType;if(t==="centric"||t==="radial")return t},Xz=()=>{var e=il();return e!==void 0},ec=e=>{var t=Nt(),r=Pr(),n=e.width,a=e.height,o=Gy(),c=n,u=a;return o&&(c=o.width>0?o.width:n,u=o.height>0?o.height:a),y.useEffect(()=>{!r&&Vn(c)&&Vn(u)&&t(X$({width:c,height:u}))},[t,r,c,u]),null},tA=Symbol.for("immer-nothing"),Ak=Symbol.for("immer-draftable"),Wr=Symbol.for("immer-state");function xn(e,...t){throw new Error(`[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`)}var _u=Object.getPrototypeOf;function qs(e){return!!e&&!!e[Wr]}function ko(e){var t;return e?rA(e)||Array.isArray(e)||!!e[Ak]||!!((t=e.constructor)!=null&&t[Ak])||tc(e)||$h(e):!1}var Zz=Object.prototype.constructor.toString(),Ck=new WeakMap;function rA(e){if(!e||typeof e!="object")return!1;const t=Object.getPrototypeOf(e);if(t===null||t===Object.prototype)return!0;const r=Object.hasOwnProperty.call(t,"constructor")&&t.constructor;if(r===Object)return!0;if(typeof r!="function")return!1;let n=Ck.get(r);return n===void 0&&(n=Function.toString.call(r),Ck.set(r,n)),n===Zz}function Of(e,t,r=!0){Lh(e)===0?(r?Reflect.ownKeys(e):Object.keys(e)).forEach(a=>{t(a,e[a],e)}):e.forEach((n,a)=>t(a,n,e))}function Lh(e){const t=e[Wr];return t?t.type_:Array.isArray(e)?1:tc(e)?2:$h(e)?3:0}function Bv(e,t){return Lh(e)===2?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function nA(e,t,r){const n=Lh(e);n===2?e.set(t,r):n===3?e.add(r):e[t]=r}function Jz(e,t){return e===t?e!==0||1/e===1/t:e!==e&&t!==t}function tc(e){return e instanceof Map}function $h(e){return e instanceof Set}function Qa(e){return e.copy_||e.base_}function Uv(e,t){if(tc(e))return new Map(e);if($h(e))return new Set(e);if(Array.isArray(e))return Array.prototype.slice.call(e);const r=rA(e);if(t===!0||t==="class_only"&&!r){const n=Object.getOwnPropertyDescriptors(e);delete n[Wr];let a=Reflect.ownKeys(n);for(let o=0;o1&&Object.defineProperties(e,{set:zd,add:zd,clear:zd,delete:zd}),Object.freeze(e),t&&Object.values(e).forEach(r=>Qy(r,!0))),e}function e6(){xn(2)}var zd={value:e6};function zh(e){return e===null||typeof e!="object"?!0:Object.isFrozen(e)}var t6={};function jo(e){const t=t6[e];return t||xn(0,e),t}var Mu;function iA(){return Mu}function r6(e,t){return{drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0}}function Pk(e,t){t&&(jo("Patches"),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function Hv(e){Wv(e),e.drafts_.forEach(n6),e.drafts_=null}function Wv(e){e===Mu&&(Mu=e.parent_)}function Ok(e){return Mu=r6(Mu,e)}function n6(e){const t=e[Wr];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0}function _k(e,t){t.unfinalizedDrafts_=t.drafts_.length;const r=t.drafts_[0];return e!==void 0&&e!==r?(r[Wr].modified_&&(Hv(t),xn(4)),ko(e)&&(e=_f(t,e),t.parent_||Mf(t,e)),t.patches_&&jo("Patches").generateReplacementPatches_(r[Wr].base_,e,t.patches_,t.inversePatches_)):e=_f(t,r,[]),Hv(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e!==tA?e:void 0}function _f(e,t,r){if(zh(t))return t;const n=e.immer_.shouldUseStrictIteration(),a=t[Wr];if(!a)return Of(t,(o,c)=>Mk(e,a,t,o,c,r),n),t;if(a.scope_!==e)return t;if(!a.modified_)return Mf(e,a.base_,!0),a.base_;if(!a.finalized_){a.finalized_=!0,a.scope_.unfinalizedDrafts_--;const o=a.copy_;let c=o,u=!1;a.type_===3&&(c=new Set(o),o.clear(),u=!0),Of(c,(f,h)=>Mk(e,a,o,f,h,r,u),n),Mf(e,o,!1),r&&e.patches_&&jo("Patches").generatePatches_(a,r,e.patches_,e.inversePatches_)}return a.copy_}function Mk(e,t,r,n,a,o,c){if(a==null||typeof a!="object"&&!c)return;const u=zh(a);if(!(u&&!c)){if(qs(a)){const f=o&&t&&t.type_!==3&&!Bv(t.assigned_,n)?o.concat(n):void 0,h=_f(e,a,f);if(nA(r,n,h),qs(h))e.canAutoFreeze_=!1;else return}else c&&r.add(a);if(ko(a)&&!u){if(!e.immer_.autoFreeze_&&e.unfinalizedDrafts_<1||t&&t.base_&&t.base_[n]===a&&u)return;_f(e,a),(!t||!t.scope_.parent_)&&typeof n!="symbol"&&(tc(r)?r.has(n):Object.prototype.propertyIsEnumerable.call(r,n))&&Mf(e,a)}}}function Mf(e,t,r=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&Qy(t,r)}function i6(e,t){const r=Array.isArray(e),n={type_:r?1:0,scope_:t?t.scope_:iA(),modified_:!1,finalized_:!1,assigned_:{},parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1};let a=n,o=Yy;r&&(a=[n],o=Iu);const{revoke:c,proxy:u}=Proxy.revocable(a,o);return n.draft_=u,n.revoke_=c,u}var Yy={get(e,t){if(t===Wr)return e;const r=Qa(e);if(!Bv(r,t))return a6(e,r,t);const n=r[t];return e.finalized_||!ko(n)?n:n===yg(e.base_,t)?(xg(e),e.copy_[t]=Gv(n,e)):n},has(e,t){return t in Qa(e)},ownKeys(e){return Reflect.ownKeys(Qa(e))},set(e,t,r){const n=aA(Qa(e),t);if(n!=null&&n.set)return n.set.call(e.draft_,r),!0;if(!e.modified_){const a=yg(Qa(e),t),o=a==null?void 0:a[Wr];if(o&&o.base_===r)return e.copy_[t]=r,e.assigned_[t]=!1,!0;if(Jz(r,a)&&(r!==void 0||Bv(e.base_,t)))return!0;xg(e),Kv(e)}return e.copy_[t]===r&&(r!==void 0||t in e.copy_)||Number.isNaN(r)&&Number.isNaN(e.copy_[t])||(e.copy_[t]=r,e.assigned_[t]=!0),!0},deleteProperty(e,t){return yg(e.base_,t)!==void 0||t in e.base_?(e.assigned_[t]=!1,xg(e),Kv(e)):delete e.assigned_[t],e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){const r=Qa(e),n=Reflect.getOwnPropertyDescriptor(r,t);return n&&{writable:!0,configurable:e.type_!==1||t!=="length",enumerable:n.enumerable,value:r[t]}},defineProperty(){xn(11)},getPrototypeOf(e){return _u(e.base_)},setPrototypeOf(){xn(12)}},Iu={};Of(Yy,(e,t)=>{Iu[e]=function(){return arguments[0]=arguments[0][0],t.apply(this,arguments)}});Iu.deleteProperty=function(e,t){return Iu.set.call(this,e,t,void 0)};Iu.set=function(e,t,r){return Yy.set.call(this,e[0],t,r,e[0])};function yg(e,t){const r=e[Wr];return(r?Qa(r):e)[t]}function a6(e,t,r){var a;const n=aA(t,r);return n?"value"in n?n.value:(a=n.get)==null?void 0:a.call(e.draft_):void 0}function aA(e,t){if(!(t in e))return;let r=_u(e);for(;r;){const n=Object.getOwnPropertyDescriptor(r,t);if(n)return n;r=_u(r)}}function Kv(e){e.modified_||(e.modified_=!0,e.parent_&&Kv(e.parent_))}function xg(e){e.copy_||(e.copy_=Uv(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var o6=class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!0,this.produce=(t,r,n)=>{if(typeof t=="function"&&typeof r!="function"){const o=r;r=t;const c=this;return function(f=o,...h){return c.produce(f,m=>r.call(this,m,...h))}}typeof r!="function"&&xn(6),n!==void 0&&typeof n!="function"&&xn(7);let a;if(ko(t)){const o=Ok(this),c=Gv(t,void 0);let u=!0;try{a=r(c),u=!1}finally{u?Hv(o):Wv(o)}return Pk(o,n),_k(a,o)}else if(!t||typeof t!="object"){if(a=r(t),a===void 0&&(a=t),a===tA&&(a=void 0),this.autoFreeze_&&Qy(a,!0),n){const o=[],c=[];jo("Patches").generateReplacementPatches_(t,a,o,c),n(o,c)}return a}else xn(1,t)},this.produceWithPatches=(t,r)=>{if(typeof t=="function")return(c,...u)=>this.produceWithPatches(c,f=>t(f,...u));let n,a;return[this.produce(t,r,(c,u)=>{n=c,a=u}),n,a]},typeof(e==null?void 0:e.autoFreeze)=="boolean"&&this.setAutoFreeze(e.autoFreeze),typeof(e==null?void 0:e.useStrictShallowCopy)=="boolean"&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),typeof(e==null?void 0:e.useStrictIteration)=="boolean"&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){ko(e)||xn(8),qs(e)&&(e=s6(e));const t=Ok(this),r=Gv(e,void 0);return r[Wr].isManual_=!0,Wv(t),r}finishDraft(e,t){const r=e&&e[Wr];(!r||!r.isManual_)&&xn(9);const{scope_:n}=r;return Pk(n,t),_k(void 0,n)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}setUseStrictIteration(e){this.useStrictIteration_=e}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(e,t){let r;for(r=t.length-1;r>=0;r--){const a=t[r];if(a.path.length===0&&a.op==="replace"){e=a.value;break}}r>-1&&(t=t.slice(r+1));const n=jo("Patches").applyPatches_;return qs(e)?n(e,t):this.produce(e,a=>n(a,t))}};function Gv(e,t){const r=tc(e)?jo("MapSet").proxyMap_(e,t):$h(e)?jo("MapSet").proxySet_(e,t):i6(e,t);return(t?t.scope_:iA()).drafts_.push(r),r}function s6(e){return qs(e)||xn(10,e),oA(e)}function oA(e){if(!ko(e)||zh(e))return e;const t=e[Wr];let r,n=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,r=Uv(e,t.scope_.immer_.useStrictShallowCopy_),n=t.scope_.immer_.shouldUseStrictIteration()}else r=Uv(e,!0);return Of(r,(a,o)=>{nA(r,a,oA(o))},n),t&&(t.finalized_=!1),r}var l6=new o6;l6.produce;var u6={settings:{layout:"horizontal",align:"center",verticalAlign:"bottom",itemSorter:"value"},size:{width:0,height:0},payload:[]},sA=lr({name:"legend",initialState:u6,reducers:{setLegendSize(e,t){e.size.width=t.payload.width,e.size.height=t.payload.height},setLegendSettings(e,t){e.settings.align=t.payload.align,e.settings.layout=t.payload.layout,e.settings.verticalAlign=t.payload.verticalAlign,e.settings.itemSorter=t.payload.itemSorter},addLegendPayload:{reducer(e,t){e.payload.push(t.payload)},prepare:st()},replaceLegendPayload:{reducer(e,t){var r=t.payload,n=r.prev,a=r.next,o=en(e).payload.indexOf(n);o>-1&&(e.payload[o]=a)},prepare:st()},removeLegendPayload:{reducer(e,t){var r=en(e).payload.indexOf(t.payload);r>-1&&e.payload.splice(r,1)},prepare:st()}}}),rc=sA.actions;rc.setLegendSize;rc.setLegendSettings;var c6=rc.addLegendPayload,d6=rc.replaceLegendPayload,f6=rc.removeLegendPayload,h6=sA.reducer,bg={exports:{}},wg={};/** - * @license React - * use-sync-external-store-with-selector.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Ik;function m6(){if(Ik)return wg;Ik=1;var e=tl();function t(f,h){return f===h&&(f!==0||1/f===1/h)||f!==f&&h!==h}var r=typeof Object.is=="function"?Object.is:t,n=e.useSyncExternalStore,a=e.useRef,o=e.useEffect,c=e.useMemo,u=e.useDebugValue;return wg.useSyncExternalStoreWithSelector=function(f,h,m,g,v){var b=a(null);if(b.current===null){var j={hasValue:!1,value:null};b.current=j}else j=b.current;b=c(function(){function S(_){if(!N){if(N=!0,E=_,_=g(_),v!==void 0&&j.hasValue){var O=j.value;if(v(O,_))return A=O}return A=_}if(O=A,r(E,_))return O;var D=g(_);return v!==void 0&&v(O,D)?(E=_,O):(E=_,A=D)}var N=!1,E,A,P=m===void 0?null:m;return[function(){return S(h())},P===null?void 0:function(){return S(P())}]},[h,m,g,v]);var k=n(f,b[0],b[1]);return o(function(){j.hasValue=!0,j.value=k},[k]),u(k),k},wg}var Tk;function p6(){return Tk||(Tk=1,bg.exports=m6()),bg.exports}p6();function g6(e){e()}function v6(){let e=null,t=null;return{clear(){e=null,t=null},notify(){g6(()=>{let r=e;for(;r;)r.callback(),r=r.next})},get(){const r=[];let n=e;for(;n;)r.push(n),n=n.next;return r},subscribe(r){let n=!0;const a=t={callback:r,next:null,prev:t};return a.prev?a.prev.next=a:e=a,function(){!n||e===null||(n=!1,a.next?a.next.prev=a.prev:t=a.prev,a.prev?a.prev.next=a.next:e=a.next)}}}}var Dk={notify(){},get:()=>[]};function y6(e,t){let r,n=Dk,a=0,o=!1;function c(k){m();const S=n.subscribe(k);let N=!1;return()=>{N||(N=!0,S(),g())}}function u(){n.notify()}function f(){j.onStateChange&&j.onStateChange()}function h(){return o}function m(){a++,r||(r=e.subscribe(f),n=v6())}function g(){a--,r&&a===0&&(r(),r=void 0,n.clear(),n=Dk)}function v(){o||(o=!0,m())}function b(){o&&(o=!1,g())}const j={addNestedSub:c,notifyNestedSubs:u,handleChangeWrapper:f,isSubscribed:h,trySubscribe:v,tryUnsubscribe:b,getListeners:()=>n};return j}var x6=()=>typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",b6=x6(),w6=()=>typeof navigator<"u"&&navigator.product==="ReactNative",k6=w6(),j6=()=>b6||k6?y.useLayoutEffect:y.useEffect,S6=j6();function Rk(e,t){return e===t?e!==0||t!==0||1/e===1/t:e!==e&&t!==t}function N6(e,t){if(Rk(e,t))return!0;if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;const r=Object.keys(e),n=Object.keys(t);if(r.length!==n.length)return!1;for(let a=0;a{const f=y6(a);return{store:a,subscription:f,getServerState:n?()=>n:void 0}},[a,n]),c=y.useMemo(()=>a.getState(),[a]);S6(()=>{const{subscription:f}=o;return f.onStateChange=f.notifyNestedSubs,f.trySubscribe(),c!==a.getState()&&f.notifyNestedSubs(),()=>{f.tryUnsubscribe(),f.onStateChange=void 0}},[o,c]);const u=r||A6;return y.createElement(u.Provider,{value:o},t)}var P6=C6,O6=new Set(["axisLine","tickLine","activeBar","activeDot","activeLabel","activeShape","allowEscapeViewBox","background","cursor","dot","label","line","margin","padding","position","shape","style","tick","wrapperStyle","radius","throttledEvents"]);function _6(e,t){return e==null&&t==null?!0:typeof e=="number"&&typeof t=="number"?e===t||e!==e&&t!==t:e===t}function Fh(e,t){var r=new Set([...Object.keys(e),...Object.keys(t)]);for(var n of r)if(O6.has(n)){if(e[n]==null&&t[n]==null)continue;if(!N6(e[n],t[n]))return!1}else if(!_6(e[n],t[n]))return!1;return!0}function Vv(){return Vv=Object.assign?Object.assign.bind():function(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);r{var t=e.separator,r=t===void 0?us.separator:t,n=e.contentStyle,a=e.itemStyle,o=e.labelStyle,c=o===void 0?us.labelStyle:o,u=e.payload,f=e.formatter,h=e.itemSorter,m=e.wrapperClassName,g=e.labelClassName,v=e.label,b=e.labelFormatter,j=e.accessibilityLayer,k=j===void 0?us.accessibilityLayer:j,S=()=>{if(u&&u.length){var U={padding:0,margin:0},B=B6(u,h),F=B.map((Y,H)=>{if(!Y||Y.type==="none")return null;var pe=Y.formatter||f||F6,ue=Y.value,he=Y.name,ae=ue,se=he;if(pe){var X=pe(ue,he,Y,H,u);if(Array.isArray(X)){var te=D6(X,2);ae=te[0],se=te[1]}else if(X!=null)ae=X;else return null}var J=tu(tu({},us.itemStyle),{},{color:Y.color||us.itemStyle.color},a);return y.createElement("li",{className:"recharts-tooltip-item",key:"tooltip-item-".concat(H),style:J},Gn(se)?y.createElement("span",{className:"recharts-tooltip-item-name"},se):null,Gn(se)?y.createElement("span",{className:"recharts-tooltip-item-separator"},r):null,y.createElement("span",{className:"recharts-tooltip-item-value"},ae),y.createElement("span",{className:"recharts-tooltip-item-unit"},Y.unit||""))});return y.createElement("ul",{className:"recharts-tooltip-item-list",style:U},F)}return null},N=tu(tu({},us.contentStyle),n),E=tu({margin:0},c),A=!Yt(v),P=A?v:"",_=nt("recharts-default-tooltip",m),O=nt("recharts-tooltip-label",g);A&&b&&u!==void 0&&u!==null&&(P=b(v,u));var D=k?{role:"status","aria-live":"assertive"}:{};return y.createElement("div",Vv({className:_,style:N},D),y.createElement("p",{className:O,style:E},y.isValidElement(P)?P:"".concat(P)),S())},ru="recharts-tooltip-wrapper",H6={visibility:"hidden"};function W6(e){var t=e.coordinate,r=e.translateX,n=e.translateY;return nt(ru,{["".concat(ru,"-right")]:Ee(r)&&t&&Ee(t.x)&&r>=t.x,["".concat(ru,"-left")]:Ee(r)&&t&&Ee(t.x)&&r=t.y,["".concat(ru,"-top")]:Ee(n)&&t&&Ee(t.y)&&n0?a:0),g=r[n]+a;if(t[n])return c[n]?m:g;var v=f[n];if(v==null)return 0;if(c[n]){var b=m,j=v;return bS?Math.max(m,v):Math.max(g,v)}function K6(e){var t=e.translateX,r=e.translateY,n=e.useTranslate3d;return{transform:n?"translate3d(".concat(t,"px, ").concat(r,"px, 0)"):"translate(".concat(t,"px, ").concat(r,"px)")}}function G6(e){var t=e.allowEscapeViewBox,r=e.coordinate,n=e.offsetTop,a=e.offsetLeft,o=e.position,c=e.reverseDirection,u=e.tooltipBox,f=e.useTranslate3d,h=e.viewBox,m,g,v;return u.height>0&&u.width>0&&r?(g=zk({allowEscapeViewBox:t,coordinate:r,key:"x",offset:a,position:o,reverseDirection:c,tooltipDimension:u.width,viewBox:h,viewBoxDimension:h.width}),v=zk({allowEscapeViewBox:t,coordinate:r,key:"y",offset:n,position:o,reverseDirection:c,tooltipDimension:u.height,viewBox:h,viewBoxDimension:h.height}),m=K6({translateX:g,translateY:v,useTranslate3d:f})):m=H6,{cssProperties:m,cssClasses:W6({translateX:g,translateY:v,coordinate:r})}}var V6=()=>!(typeof window<"u"&&window.document&&window.document.createElement&&window.setTimeout),nc={isSsr:V6()};function q6(e,t){return Z6(e)||X6(e,t)||Y6(e,t)||Q6()}function Q6(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function Y6(e,t){if(e){if(typeof e=="string")return Fk(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Fk(e,t):void 0}}function Fk(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);rnc.isSsr||!window.matchMedia?!1:window.matchMedia("(prefers-reduced-motion: reduce)").matches),t=q6(e,2),r=t[0],n=t[1];return y.useEffect(()=>{if(window.matchMedia){var a=window.matchMedia("(prefers-reduced-motion: reduce)"),o=()=>{n(a.matches)};return a.addEventListener("change",o),()=>{a.removeEventListener("change",o)}}},[]),r}function Bk(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function cs(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);r({dismissed:!1,dismissedAtCoordinate:{x:0,y:0}})),h=r8(f,2),m=h[0],g=h[1];y.useEffect(()=>{var N=E=>{if(E.key==="Escape"){var A,P,_,O;g({dismissed:!0,dismissedAtCoordinate:{x:(A=(P=e.coordinate)===null||P===void 0?void 0:P.x)!==null&&A!==void 0?A:0,y:(_=(O=e.coordinate)===null||O===void 0?void 0:O.y)!==null&&_!==void 0?_:0}})}};return document.addEventListener("keydown",N),()=>{document.removeEventListener("keydown",N)}},[(t=e.coordinate)===null||t===void 0?void 0:t.x,(r=e.coordinate)===null||r===void 0?void 0:r.y]),m.dismissed&&(((n=(a=e.coordinate)===null||a===void 0?void 0:a.x)!==null&&n!==void 0?n:0)!==m.dismissedAtCoordinate.x||((o=(c=e.coordinate)===null||c===void 0?void 0:c.y)!==null&&o!==void 0?o:0)!==m.dismissedAtCoordinate.y)&&g(cs(cs({},m),{},{dismissed:!1}));var v=G6({allowEscapeViewBox:e.allowEscapeViewBox,coordinate:e.coordinate,offsetLeft:typeof e.offset=="number"?e.offset:e.offset.x,offsetTop:typeof e.offset=="number"?e.offset:e.offset.y,position:e.position,reverseDirection:e.reverseDirection,tooltipBox:{height:e.lastBoundingBox.height,width:e.lastBoundingBox.width},useTranslate3d:e.useTranslate3d,viewBox:e.viewBox}),b=v.cssClasses,j=v.cssProperties,k=e.hasPortalFromProps?{}:cs(cs({transition:s8({prefersReducedMotion:u,isAnimationActive:e.isAnimationActive,active:e.active,animationDuration:e.animationDuration,animationEasing:e.animationEasing})},j),{},{pointerEvents:"none",position:"absolute",top:0,left:0}),S=cs(cs({},k),{},{visibility:!m.dismissed&&e.active&&e.hasPayload?"visible":"hidden"},e.wrapperStyle);return y.createElement("div",{xmlns:"http://www.w3.org/1999/xhtml",tabIndex:-1,className:b,style:S,ref:e.innerRef},e.children)}var u8=y.memo(l8),uA=()=>{var e;return(e=Me(t=>t.rootProps.accessibilityLayer))!==null&&e!==void 0?e:!0};function qv(){return qv=Object.assign?Object.assign.bind():function(e){for(var t=1;tWe(e.x)&&We(e.y),Gk=e=>e.base!=null&&If(e.base)&&If(e),nu=e=>e.x,iu=e=>e.y,h8=(e,t)=>{if(typeof e=="function")return e;var r="curve".concat(Ry(e));if((r==="curveMonotone"||r==="curveBump")&&t){var n=Kk["".concat(r).concat(t==="vertical"?"Y":"X")];if(n)return n}return Kk[r]||xh},Vk={connectNulls:!1,type:"linear"},m8=e=>{var t=e.type,r=t===void 0?Vk.type:t,n=e.points,a=n===void 0?[]:n,o=e.baseLine,c=e.layout,u=e.connectNulls,f=u===void 0?Vk.connectNulls:u,h=h8(r,c),m=f?a.filter(If):a;if(Array.isArray(o)){var g,v=a.map((N,E)=>Wk(Wk({},N),{},{base:o[E]}));c==="vertical"?g=Md().y(iu).x1(nu).x0(N=>N.base.x):g=Md().x(nu).y1(iu).y0(N=>N.base.y);var b=g.defined(Gk).curve(h),j=f?v.filter(Gk):v;return b(j)}var k;c==="vertical"&&Ee(o)?k=Md().y(iu).x1(nu).x0(o):Ee(o)?k=Md().x(nu).y1(iu).y0(o):k=$E().x(nu).y(iu);var S=k.defined(If).curve(h);return S(m)},rf=e=>{var t=e.className,r=e.points,n=e.path,a=e.pathRef,o=il();if((!r||!r.length)&&!n)return null;var c={type:e.type,points:e.points,baseLine:e.baseLine,layout:e.layout||o,connectNulls:e.connectNulls},u=r&&r.length?m8(c):n;return y.createElement("path",qv({},kn(e),Ly(e),{className:nt("recharts-curve",t),d:u===null?void 0:u,ref:a}))},p8=["x","y","top","left","width","height","className"];function Qv(){return Qv=Object.assign?Object.assign.bind():function(e){for(var t=1;t"M".concat(e,",").concat(a,"v").concat(n,"M").concat(o,",").concat(t,"h").concat(r),j8=e=>{var t=e.x,r=t===void 0?0:t,n=e.y,a=n===void 0?0:n,o=e.top,c=o===void 0?0:o,u=e.left,f=u===void 0?0:u,h=e.width,m=h===void 0?0:h,g=e.height,v=g===void 0?0:g,b=e.className,j=b8(e,p8),k=g8({x:r,y:a,top:c,left:f,width:m,height:v},j);return!Ee(r)||!Ee(a)||!Ee(m)||!Ee(v)||!Ee(c)||!Ee(f)?null:y.createElement("path",Qv({},rn(k),{className:nt("recharts-cross",b),d:k8(r,a,m,v,c,f)}))};function S8(e,t,r,n){var a=n/2;return{stroke:"none",fill:"#ccc",x:e==="horizontal"?t.x-a:r.left+.5,y:e==="horizontal"?r.top+.5:t.y-a,width:e==="horizontal"?n:r.width-1,height:e==="horizontal"?r.height-1:n}}var Tf=1e-4,cA=(e,t)=>[0,3*e,3*t-6*e,3*e-3*t+1],dA=(e,t)=>e.map((r,n)=>r*t**n).reduce((r,n)=>r+n),Qk=(e,t)=>r=>{var n=cA(e,t);return dA(n,r)},N8=(e,t)=>r=>{var n=cA(e,t),a=[...n.map((o,c)=>o*c).slice(1),0];return dA(a,r)},E8=e=>{var t,r=e.split("(");if(r.length!==2||r[0]!=="cubic-bezier")return null;var n=(t=r[1])===null||t===void 0||(t=t.split(")")[0])===null||t===void 0?void 0:t.split(",");if(n==null||n.length!==4)return null;var a=n.map(o=>parseFloat(o));return[a[0],a[1],a[2],a[3]]},A8=function(){for(var t=arguments.length,r=new Array(t),n=0;n{var a=Qk(e,r),o=Qk(t,n),c=N8(e,r),u=h=>h>1?1:h<0?0:h,f=h=>{for(var m=h>1?1:h,g=m,v=0;v<8;++v){var b=a(g)-m,j=c(g);if(Math.abs(b-m)0&&arguments[0]!==void 0?arguments[0]:{},r=t.stiff,n=r===void 0?100:r,a=t.damping,o=a===void 0?8:a,c=t.dt,u=c===void 0?16.67:c,f=1,h=[0],m=0,g=0,v=1e4,b=0;b{var E,A,P;if(N<=0)return 0;if(N>=1)return f;var _=N*S,O=Math.floor(_),D=_-O;return((E=h[O])!==null&&E!==void 0?E:0)+(((A=h[O+1])!==null&&A!==void 0?A:0)-((P=h[O])!==null&&P!==void 0?P:0))*D}},O8=e=>{if(typeof e=="string")switch(e){case"ease":case"ease-in-out":case"ease-out":case"ease-in":case"linear":return Yk(e);case"spring":return P8();default:if(e.split("(")[0]==="cubic-bezier")return Yk(e)}return typeof e=="function"?e:null},_8=(e,t,r)=>{var n,a=o=>{var c=t.tick(o);if(t.getState()==="active"){if(r(t.getInterpolated()),t.getProgress()===1){t.complete(),n=void 0;return}n=e.setTimeout(a,c);return}n=e.setTimeout(a,c)};return n=e.setTimeout(a,0),()=>{var o;return(o=n)===null||o===void 0?void 0:o()}},fA=y.createContext(_8);fA.Provider;function M8(e){var t=y.useContext(fA);return y.useMemo(()=>e??t,[e,t])}function I8(e,t,r){return(t=T8(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function T8(e){var t=D8(e,"string");return typeof t=="symbol"?t:t+""}function D8(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}var Xk="init",Zk="pending",Jk="active",R8="completed";function Sg(e){return Math.max(0,e)}class L8{getAnimationStartedTime(){return this.animationStartedTime}getBeginStartedTime(){return this.beginStartedTime}constructor(t){var r;I8(this,"state",Xk),this.animationId=t.animationId,this.onAnimationEnd=t.onAnimationEnd,this.animationDuration=Sg(t.animationDuration),this.animationBegin=Sg(t.animationBegin),this.progress=0,this.from=t.from,this.to=t.to,this.easing=t.easing,(r=t.onAnimationStart)===null||r===void 0||r.call(t)}getState(){return this.state}getEasing(){return this.easing}getAnimationDuration(){return this.animationDuration}tick(t){if(this.getState()===Xk)return this.state=Zk,this.beginStartedTime=t,this.animationBegin;if(this.getState()===Zk){if(this.beginStartedTime==null)throw new Error;var r=t-this.beginStartedTime;return r>=this.animationBegin?(this.state=Jk,this.animationStartedTime=t,this.nextAnimationUpdate(0)):Sg(this.animationBegin-r)}if(this.getState()===Jk){if(this.animationStartedTime==null)throw new Error;var n=t-this.animationStartedTime;return this.setProgress(n/this.animationDuration),this.nextAnimationUpdate(n)}return 0}setProgress(t){this.progress=Math.min(1,Math.max(0,t))}getProgress(){return this.progress}complete(){if(this.progress=1,this.state==="active"){var t;(t=this.onAnimationEnd)===null||t===void 0||t.call(this)}this.state=R8}getFrom(){return this.from}getTo(){return this.to}getAnimationId(){return this.animationId}getAnimationBegin(){return this.animationBegin}}class $8 extends L8{nextAnimationUpdate(){return 0}getInterpolated(){return this.easing(mi(this.getFrom(),this.getTo(),this.getProgress()))}}class z8{setTimeout(t){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,n=performance.now(),a=null,o=c=>{c-n>=r?t(c):a=requestAnimationFrame(o)};return a=requestAnimationFrame(o),()=>{a!=null&&cancelAnimationFrame(a)}}}function F8(e,t){return W8(e)||H8(e,t)||U8(e,t)||B8()}function B8(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function U8(e,t){if(e){if(typeof e=="string")return ej(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?ej(e,t):void 0}}function ej(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{},onAnimationStart:()=>{}},tj=0,Ng=1;function hA(e){var t=on(e,K8),r=t.animationId,n=t.isActive,a=t.canBegin,o=t.duration,c=t.easing,u=t.begin,f=t.onAnimationEnd,h=t.onAnimationStart,m=t.children,g=lA(),v=n==="auto"?!nc.isSsr&&!g:n,b=M8(t.animationController),j=y.useState(v?tj:Ng),k=F8(j,2),S=k[0],N=k[1];return y.useEffect(()=>{v||N(Ng)},[v]),y.useEffect(()=>{var E=O8(c);if(!v||!a||E==null)return nl;var A=new z8,P=new $8({animationId:r,easing:E,animationDuration:o,animationBegin:u,onAnimationStart:h,onAnimationEnd:f,from:tj,to:Ng});return b(A,P,N)},[b,r,v,a,o,c,u,h,f]),m(Number(S))}function mA(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"animation-",r=y.useRef(Au(t)),n=y.useRef(e);return n.current!==e&&(r.current=Au(t),n.current=e),r.current}var G8=e=>e.replace(/([A-Z])/g,t=>"-".concat(t.toLowerCase())),V8=(e,t,r)=>e.map(n=>"".concat(G8(n)," ").concat(t,"ms ").concat(r)).join(","),q8=["radius"],Q8=["radius"],rj,nj,ij,aj,oj,sj,lj,uj,cj,dj;function fj(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function hj(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);r{var o=va(r),c=va(n),u=Math.min(Math.abs(o)/2,Math.abs(c)/2),f=c>=0?1:-1,h=o>=0?1:-1,m=c>=0&&o>=0||c<0&&o<0?1:0,g;if(u>0&&Array.isArray(a)){for(var v=[0,0,0,0],b=0,j=4;bu?u:S}g=Gt(rj||(rj=Mn(["M",",",""])),e,t+f*v[0]),v[0]>0&&(g+=Gt(nj||(nj=Mn(["A ",",",",0,0,",",",",",""])),v[0],v[0],m,e+h*v[0],t)),g+=Gt(ij||(ij=Mn(["L ",",",""])),e+r-h*v[1],t),v[1]>0&&(g+=Gt(aj||(aj=Mn(["A ",",",",0,0,",`, - `,",",""])),v[1],v[1],m,e+r,t+f*v[1])),g+=Gt(oj||(oj=Mn(["L ",",",""])),e+r,t+n-f*v[2]),v[2]>0&&(g+=Gt(sj||(sj=Mn(["A ",",",",0,0,",`, - `,",",""])),v[2],v[2],m,e+r-h*v[2],t+n)),g+=Gt(lj||(lj=Mn(["L ",",",""])),e+h*v[3],t+n),v[3]>0&&(g+=Gt(uj||(uj=Mn(["A ",",",",0,0,",`, - `,",",""])),v[3],v[3],m,e,t+n-f*v[3])),g+="Z"}else if(u>0&&a===+a&&a>0){var N=Math.min(u,a);g=Gt(cj||(cj=Mn(["M ",",",` - A `,",",",0,0,",",",",",` - L `,",",` - A `,",",",0,0,",",",",",` - L `,",",` - A `,",",",0,0,",",",",",` - L `,",",` - A `,",",",0,0,",",",","," Z"])),e,t+f*N,N,N,m,e+h*N,t,e+r-h*N,t,N,N,m,e+r,t+f*N,e+r,t+n-f*N,N,N,m,e+r-h*N,t+n,e+h*N,t+n,N,N,m,e,t+n-f*N)}else g=Gt(dj||(dj=Mn(["M ",","," h "," v "," h "," Z"])),e,t,r,n,-r);return g},vj={x:0,y:0,width:0,height:0,radius:0,isAnimationActive:!1,isUpdateAnimationActive:!1,animationBegin:0,animationDuration:1500,animationEasing:"ease"},aF=e=>{var t=on(e,vj),r=y.useRef(null),n=y.useState(-1),a=eF(n,2),o=a[0],c=a[1];y.useEffect(()=>{if(r.current&&r.current.getTotalLength)try{var X=r.current.getTotalLength();X&&c(X)}catch{}},[]);var u=t.x,f=t.y,h=t.width,m=t.height,g=t.radius,v=t.className,b=t.animationEasing,j=t.animationDuration,k=t.animationBegin,S=t.isAnimationActive,N=t.isUpdateAnimationActive,E=y.useRef(h),A=y.useRef(m),P=y.useRef(u),_=y.useRef(f),O=y.useMemo(()=>({x:u,y:f,width:h,height:m,radius:g}),[u,f,h,m,g]),D=mA(O,"rectangle-");if(u!==+u||f!==+f||h!==+h||m!==+m||h===0||m===0)return null;var U=nt("recharts-rectangle",v);if(!N){var B=rn(t);B.radius;var F=mj(B,q8);return y.createElement("path",Df({},F,{x:va(u),y:va(f),width:va(h),height:va(m),radius:typeof g=="number"?g:void 0,className:U,d:gj(u,f,h,m,g)}))}var Y=E.current,H=A.current,pe=P.current,ue=_.current,he="0px ".concat(o===-1?1:o,"px"),ae="".concat(o,"px ").concat(o,"px"),se=V8(["strokeDasharray"],j,typeof b=="string"?b:vj.animationEasing);return y.createElement(hA,{animationId:D,key:D,canBegin:o>0,duration:j,easing:b,isActive:N,begin:k},X=>{var te=mi(Y,h,X),J=mi(H,m,X),I=mi(pe,u,X),M=mi(ue,f,X);r.current&&(E.current=te,A.current=J,P.current=I,_.current=M);var K;S?X>0?K={transition:se,strokeDasharray:ae}:K={strokeDasharray:he}:K={strokeDasharray:ae};var ne=rn(t);ne.radius;var Z=mj(ne,Q8);return y.createElement("path",Df({},Z,{radius:typeof g=="number"?g:void 0,className:U,d:gj(I,M,te,J,g),ref:r,style:hj(hj({},K),t.style)}))})};function yj(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function xj(e){for(var t=1;te*180/Math.PI,Qt=(e,t,r,n)=>({x:e+Math.cos(-Rf*n)*r,y:t+Math.sin(-Rf*n)*r}),cF=function(t,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{top:0,right:0,bottom:0,left:0};return Math.min(Math.abs(t-(n.left||0)-(n.right||0)),Math.abs(r-(n.top||0)-(n.bottom||0)))/2},dF=(e,t)=>{var r=e.x,n=e.y,a=t.x,o=t.y;return Math.sqrt((r-a)**2+(n-o)**2)},fF=(e,t)=>{var r=e.x,n=e.y,a=t.cx,o=t.cy,c=dF({x:r,y:n},{x:a,y:o});if(c<=0)return{radius:c,angle:0};var u=(r-a)/c,f=Math.acos(u);return n>o&&(f=2*Math.PI-f),{radius:c,angle:uF(f),angleInRadian:f}},hF=e=>{var t=e.startAngle,r=e.endAngle,n=Math.floor(t/360),a=Math.floor(r/360),o=Math.min(n,a);return{startAngle:t-o*360,endAngle:r-o*360}},mF=(e,t)=>{var r=t.startAngle,n=t.endAngle,a=Math.floor(r/360),o=Math.floor(n/360),c=Math.min(a,o);return e+c*360},pF=(e,t)=>{var r=e.relativeX,n=e.relativeY,a=fF({x:r,y:n},t),o=a.radius,c=a.angle,u=t.innerRadius,f=t.outerRadius;if(of||o===0)return null;var h=hF(t),m=h.startAngle,g=h.endAngle,v=c,b;if(m<=g){for(;v>g;)v-=360;for(;v=m&&v<=g}else{for(;v>m;)v-=360;for(;v=g&&v<=m}return b?xj(xj({},t),{},{radius:o,angle:mF(v,t)}):null};function pA(e){var t=e.cx,r=e.cy,n=e.radius,a=e.startAngle,o=e.endAngle,c=Qt(t,r,n,a),u=Qt(t,r,n,o);return{points:[c,u],cx:t,cy:r,radius:n,startAngle:a,endAngle:o}}var bj,wj,kj,jj,Sj,Nj,Ej;function Yv(){return Yv=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var r=Jr(t-e),n=Math.min(Math.abs(t-e),359.999);return r*n},Fd=e=>{var t=e.cx,r=e.cy,n=e.radius,a=e.angle,o=e.sign,c=e.isExternal,u=e.cornerRadius,f=e.cornerIsExternal,h=u*(c?1:-1)+n,m=Math.asin(u/h)/Rf,g=f?a:a+o*m,v=Qt(t,r,h,g),b=Qt(t,r,n,g),j=f?a-o*m:a,k=Qt(t,r,h*Math.cos(m*Rf),j);return{center:v,circleTangency:b,lineTangency:k,theta:m}},gA=e=>{var t=e.cx,r=e.cy,n=e.innerRadius,a=e.outerRadius,o=e.startAngle,c=e.endAngle,u=gF(o,c),f=o+u,h=Qt(t,r,a,o),m=Qt(t,r,a,f),g=Gt(bj||(bj=eo(["M ",",",` - A `,",",`,0, - `,",",`, - `,",",` - `])),h.x,h.y,a,a,+(Math.abs(u)>180),+(o>f),m.x,m.y);if(n>0){var v=Qt(t,r,n,o),b=Qt(t,r,n,f);g+=Gt(wj||(wj=eo(["L ",",",` - A `,",",`,0, - `,",",`, - `,","," Z"])),b.x,b.y,n,n,+(Math.abs(u)>180),+(o<=f),v.x,v.y)}else g+=Gt(kj||(kj=eo(["L ",","," Z"])),t,r);return g},vF=e=>{var t=e.cx,r=e.cy,n=e.innerRadius,a=e.outerRadius,o=e.cornerRadius,c=e.forceCornerRadius,u=e.cornerIsExternal,f=e.startAngle,h=e.endAngle,m=Jr(h-f),g=Fd({cx:t,cy:r,radius:a,angle:f,sign:m,cornerRadius:o,cornerIsExternal:u}),v=g.circleTangency,b=g.lineTangency,j=g.theta,k=Fd({cx:t,cy:r,radius:a,angle:h,sign:-m,cornerRadius:o,cornerIsExternal:u}),S=k.circleTangency,N=k.lineTangency,E=k.theta,A=u?Math.abs(f-h):Math.abs(f-h)-j-E;if(A<0)return c?Gt(jj||(jj=eo(["M ",",",` - a`,",",",0,0,1,",`,0 - a`,",",",0,0,1,",`,0 - `])),b.x,b.y,o,o,o*2,o,o,-o*2):gA({cx:t,cy:r,innerRadius:n,outerRadius:a,startAngle:f,endAngle:h});var P=Gt(Sj||(Sj=eo(["M ",",",` - A`,",",",0,0,",",",",",` - A`,",",",0,",",",",",",",` - A`,",",",0,0,",",",",",` - `])),b.x,b.y,o,o,+(m<0),v.x,v.y,a,a,+(A>180),+(m<0),S.x,S.y,o,o,+(m<0),N.x,N.y);if(n>0){var _=Fd({cx:t,cy:r,radius:n,angle:f,sign:m,isExternal:!0,cornerRadius:o,cornerIsExternal:u}),O=_.circleTangency,D=_.lineTangency,U=_.theta,B=Fd({cx:t,cy:r,radius:n,angle:h,sign:-m,isExternal:!0,cornerRadius:o,cornerIsExternal:u}),F=B.circleTangency,Y=B.lineTangency,H=B.theta,pe=u?Math.abs(f-h):Math.abs(f-h)-U-H;if(pe<0&&o===0)return"".concat(P,"L").concat(t,",").concat(r,"Z");P+=Gt(Nj||(Nj=eo(["L",",",` - A`,",",",0,0,",",",",",` - A`,",",",0,",",",",",",",` - A`,",",",0,0,",",",",","Z"])),Y.x,Y.y,o,o,+(m<0),F.x,F.y,n,n,+(pe>180),+(m>0),O.x,O.y,o,o,+(m<0),D.x,D.y)}else P+=Gt(Ej||(Ej=eo(["L",",","Z"])),t,r);return P},yF={cx:0,cy:0,innerRadius:0,outerRadius:0,startAngle:0,endAngle:0,cornerRadius:0,forceCornerRadius:!1,cornerIsExternal:!1},xF=e=>{var t=on(e,yF),r=t.cx,n=t.cy,a=t.innerRadius,o=t.outerRadius,c=t.cornerRadius,u=t.forceCornerRadius,f=t.cornerIsExternal,h=t.startAngle,m=t.endAngle,g=t.className;if(o0&&Math.abs(h-m)<360?k=vF({cx:r,cy:n,innerRadius:a,outerRadius:o,cornerRadius:Math.min(j,b/2),forceCornerRadius:u,cornerIsExternal:f,startAngle:h,endAngle:m}):k=gA({cx:r,cy:n,innerRadius:a,outerRadius:o,startAngle:h,endAngle:m}),y.createElement("path",Yv({},rn(t),{className:v,d:k}))};function bF(e,t,r){if(e==="horizontal")return[{x:t.x,y:r.top},{x:t.x,y:r.top+r.height}];if(e==="vertical")return[{x:r.left,y:t.y},{x:r.left+r.width,y:t.y}];if(XE(t)){if(e==="centric"){var n=t.cx,a=t.cy,o=t.innerRadius,c=t.outerRadius,u=t.angle,f=Qt(n,a,o,u),h=Qt(n,a,c,u);return[{x:f.x,y:f.y},{x:h.x,y:h.y}]}return pA(t)}}function wF(e){return d5(e)?NaN:Number(e)}function Eg(e){return e?(e=wF(e),e===1/0||e===-1/0?(e<0?-1:1)*Number.MAX_VALUE:e===e?e:0):e===0?e:0}function vA(e,t,r){r&&typeof r!="number"&&Ov(e,t,r)&&(t=r=void 0),e=Eg(e),t===void 0?(t=e,e=0):t=Eg(t),r=r===void 0?ee.chartData,Xy=q([Nn],e=>{var t=e.chartData!=null?e.chartData.length-1:0;return{chartData:e.chartData,computedData:e.computedData,dataEndIndex:t,dataStartIndex:0}}),Bh=(e,t,r,n)=>n?Xy(e):Nn(e),kF=(e,t,r)=>r?Xy(e):Nn(e),jF=q([Bh],e=>{var t=e.chartData,r=e.dataStartIndex,n=e.dataEndIndex;return t!=null?t.slice(r,n+1):[]});q([Xy],e=>{var t=e.chartData,r=e.dataStartIndex,n=e.dataEndIndex;return t!=null?t.slice(r,n+1):[]});var SF=q([Nn],e=>{var t=e.chartData,r=e.dataStartIndex,n=e.dataEndIndex;return t!=null?t.slice(r,n+1):[]});function Zy(e,t){return CF(e)||AF(e,t)||EF(e,t)||NF()}function NF(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function EF(e,t){if(e){if(typeof e=="string")return Aj(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Aj(e,t):void 0}}function Aj(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);re.e^o.s<0?1:-1;for(n=o.d.length,a=e.d.length,t=0,r=ne.d[t]^o.s<0?1:-1;return n===a?0:n>a^o.s<0?1:-1};we.decimalPlaces=we.dp=function(){var e=this,t=e.d.length-1,r=(t-e.e)*lt;if(t=e.d[t],t)for(;t%10==0;t/=10)r--;return r<0?0:r};we.dividedBy=we.div=function(e){return yi(this,new this.constructor(e))};we.dividedToIntegerBy=we.idiv=function(e){var t=this,r=t.constructor;return tt(yi(t,new r(e),0,1),r.precision)};we.equals=we.eq=function(e){return!this.cmp(e)};we.exponent=function(){return St(this)};we.greaterThan=we.gt=function(e){return this.cmp(e)>0};we.greaterThanOrEqualTo=we.gte=function(e){return this.cmp(e)>=0};we.isInteger=we.isint=function(){return this.e>this.d.length-2};we.isNegative=we.isneg=function(){return this.s<0};we.isPositive=we.ispos=function(){return this.s>0};we.isZero=function(){return this.s===0};we.lessThan=we.lt=function(e){return this.cmp(e)<0};we.lessThanOrEqualTo=we.lte=function(e){return this.cmp(e)<1};we.logarithm=we.log=function(e){var t,r=this,n=r.constructor,a=n.precision,o=a+5;if(e===void 0)e=new n(10);else if(e=new n(e),e.s<1||e.eq(Fr))throw Error(an+"NaN");if(r.s<1)throw Error(an+(r.s?"NaN":"-Infinity"));return r.eq(Fr)?new n(0):(dt=!1,t=yi(Tu(r,o),Tu(e,o),o),dt=!0,tt(t,a))};we.minus=we.sub=function(e){var t=this;return e=new t.constructor(e),t.s==e.s?kA(t,e):bA(t,(e.s=-e.s,e))};we.modulo=we.mod=function(e){var t,r=this,n=r.constructor,a=n.precision;if(e=new n(e),!e.s)throw Error(an+"NaN");return r.s?(dt=!1,t=yi(r,e,0,1).times(e),dt=!0,r.minus(t)):tt(new n(r),a)};we.naturalExponential=we.exp=function(){return wA(this)};we.naturalLogarithm=we.ln=function(){return Tu(this)};we.negated=we.neg=function(){var e=new this.constructor(this);return e.s=-e.s||0,e};we.plus=we.add=function(e){var t=this;return e=new t.constructor(e),t.s==e.s?bA(t,e):kA(t,(e.s=-e.s,e))};we.precision=we.sd=function(e){var t,r,n,a=this;if(e!==void 0&&e!==!!e&&e!==1&&e!==0)throw Error(go+e);if(t=St(a)+1,n=a.d.length-1,r=n*lt+1,n=a.d[n],n){for(;n%10==0;n/=10)r--;for(n=a.d[0];n>=10;n/=10)r++}return e&&t>r?t:r};we.squareRoot=we.sqrt=function(){var e,t,r,n,a,o,c,u=this,f=u.constructor;if(u.s<1){if(!u.s)return new f(0);throw Error(an+"NaN")}for(e=St(u),dt=!1,a=Math.sqrt(+u),a==0||a==1/0?(t=Fn(u.d),(t.length+e)%2==0&&(t+="0"),a=Math.sqrt(t),e=ol((e+1)/2)-(e<0||e%2),a==1/0?t="5e"+e:(t=a.toExponential(),t=t.slice(0,t.indexOf("e")+1)+e),n=new f(t)):n=new f(a.toString()),r=f.precision,a=c=r+3;;)if(o=n,n=o.plus(yi(u,o,c+2)).times(.5),Fn(o.d).slice(0,c)===(t=Fn(n.d)).slice(0,c)){if(t=t.slice(c-3,c+1),a==c&&t=="4999"){if(tt(o,r+1,0),o.times(o).eq(u)){n=o;break}}else if(t!="9999")break;c+=4}return dt=!0,tt(n,r)};we.times=we.mul=function(e){var t,r,n,a,o,c,u,f,h,m=this,g=m.constructor,v=m.d,b=(e=new g(e)).d;if(!m.s||!e.s)return new g(0);for(e.s*=m.s,r=m.e+e.e,f=v.length,h=b.length,f=0;){for(t=0,a=f+n;a>n;)u=o[a]+b[n]*v[a-n-1]+t,o[a--]=u%Rt|0,t=u/Rt|0;o[a]=(o[a]+t)%Rt|0}for(;!o[--c];)o.pop();return t?++r:o.shift(),e.d=o,e.e=r,dt?tt(e,g.precision):e};we.toDecimalPlaces=we.todp=function(e,t){var r=this,n=r.constructor;return r=new n(r),e===void 0?r:(qn(e,0,al),t===void 0?t=n.rounding:qn(t,0,8),tt(r,e+St(r)+1,t))};we.toExponential=function(e,t){var r,n=this,a=n.constructor;return e===void 0?r=So(n,!0):(qn(e,0,al),t===void 0?t=a.rounding:qn(t,0,8),n=tt(new a(n),e+1,t),r=So(n,!0,e+1)),r};we.toFixed=function(e,t){var r,n,a=this,o=a.constructor;return e===void 0?So(a):(qn(e,0,al),t===void 0?t=o.rounding:qn(t,0,8),n=tt(new o(a),e+St(a)+1,t),r=So(n.abs(),!1,e+St(n)+1),a.isneg()&&!a.isZero()?"-"+r:r)};we.toInteger=we.toint=function(){var e=this,t=e.constructor;return tt(new t(e),St(e)+1,t.rounding)};we.toNumber=function(){return+this};we.toPower=we.pow=function(e){var t,r,n,a,o,c,u=this,f=u.constructor,h=12,m=+(e=new f(e));if(!e.s)return new f(Fr);if(u=new f(u),!u.s){if(e.s<1)throw Error(an+"Infinity");return u}if(u.eq(Fr))return u;if(n=f.precision,e.eq(Fr))return tt(u,n);if(t=e.e,r=e.d.length-1,c=t>=r,o=u.s,c){if((r=m<0?-m:m)<=xA){for(a=new f(Fr),t=Math.ceil(n/lt+4),dt=!1;r%2&&(a=a.times(u),Oj(a.d,t)),r=ol(r/2),r!==0;)u=u.times(u),Oj(u.d,t);return dt=!0,e.s<0?new f(Fr).div(a):tt(a,n)}}else if(o<0)throw Error(an+"NaN");return o=o<0&&e.d[Math.max(t,r)]&1?-1:1,u.s=1,dt=!1,a=e.times(Tu(u,n+h)),dt=!0,a=wA(a),a.s=o,a};we.toPrecision=function(e,t){var r,n,a=this,o=a.constructor;return e===void 0?(r=St(a),n=So(a,r<=o.toExpNeg||r>=o.toExpPos)):(qn(e,1,al),t===void 0?t=o.rounding:qn(t,0,8),a=tt(new o(a),e,t),r=St(a),n=So(a,e<=r||r<=o.toExpNeg,e)),n};we.toSignificantDigits=we.tosd=function(e,t){var r=this,n=r.constructor;return e===void 0?(e=n.precision,t=n.rounding):(qn(e,1,al),t===void 0?t=n.rounding:qn(t,0,8)),tt(new n(r),e,t)};we.toString=we.valueOf=we.val=we.toJSON=we[Symbol.for("nodejs.util.inspect.custom")]=function(){var e=this,t=St(e),r=e.constructor;return So(e,t<=r.toExpNeg||t>=r.toExpPos)};function bA(e,t){var r,n,a,o,c,u,f,h,m=e.constructor,g=m.precision;if(!e.s||!t.s)return t.s||(t=new m(e)),dt?tt(t,g):t;if(f=e.d,h=t.d,c=e.e,a=t.e,f=f.slice(),o=c-a,o){for(o<0?(n=f,o=-o,u=h.length):(n=h,a=c,u=f.length),c=Math.ceil(g/lt),u=c>u?c+1:u+1,o>u&&(o=u,n.length=1),n.reverse();o--;)n.push(0);n.reverse()}for(u=f.length,o=h.length,u-o<0&&(o=u,n=h,h=f,f=n),r=0;o;)r=(f[--o]=f[o]+h[o]+r)/Rt|0,f[o]%=Rt;for(r&&(f.unshift(r),++a),u=f.length;f[--u]==0;)f.pop();return t.d=f,t.e=a,dt?tt(t,g):t}function qn(e,t,r){if(e!==~~e||er)throw Error(go+e)}function Fn(e){var t,r,n,a=e.length-1,o="",c=e[0];if(a>0){for(o+=c,t=1;tc?1:-1;else for(u=f=0;ua[u]?1:-1;break}return f}function r(n,a,o){for(var c=0;o--;)n[o]-=c,c=n[o]1;)n.shift()}return function(n,a,o,c){var u,f,h,m,g,v,b,j,k,S,N,E,A,P,_,O,D,U,B=n.constructor,F=n.s==a.s?1:-1,Y=n.d,H=a.d;if(!n.s)return new B(n);if(!a.s)throw Error(an+"Division by zero");for(f=n.e-a.e,D=H.length,_=Y.length,b=new B(F),j=b.d=[],h=0;H[h]==(Y[h]||0);)++h;if(H[h]>(Y[h]||0)&&--f,o==null?E=o=B.precision:c?E=o+(St(n)-St(a))+1:E=o,E<0)return new B(0);if(E=E/lt+2|0,h=0,D==1)for(m=0,H=H[0],E++;(h<_||m)&&E--;h++)A=m*Rt+(Y[h]||0),j[h]=A/H|0,m=A%H|0;else{for(m=Rt/(H[0]+1)|0,m>1&&(H=e(H,m),Y=e(Y,m),D=H.length,_=Y.length),P=D,k=Y.slice(0,D),S=k.length;S=Rt/2&&++O;do m=0,u=t(H,k,D,S),u<0?(N=k[0],D!=S&&(N=N*Rt+(k[1]||0)),m=N/O|0,m>1?(m>=Rt&&(m=Rt-1),g=e(H,m),v=g.length,S=k.length,u=t(g,k,v,S),u==1&&(m--,r(g,D16)throw Error(Jy+St(e));if(!e.s)return new m(Fr);for(dt=!1,u=g,c=new m(.03125);e.abs().gte(.1);)e=e.times(c),h+=5;for(n=Math.log(Ya(2,h))/Math.LN10*2+5|0,u+=n,r=a=o=new m(Fr),m.precision=u;;){if(a=tt(a.times(e),u),r=r.times(++f),c=o.plus(yi(a,r,u)),Fn(c.d).slice(0,u)===Fn(o.d).slice(0,u)){for(;h--;)o=tt(o.times(o),u);return m.precision=g,t==null?(dt=!0,tt(o,g)):o}o=c}}function St(e){for(var t=e.e*lt,r=e.d[0];r>=10;r/=10)t++;return t}function Ag(e,t,r){if(t>e.LN10.sd())throw dt=!0,r&&(e.precision=r),Error(an+"LN10 precision limit exceeded");return tt(new e(e.LN10),t)}function oa(e){for(var t="";e--;)t+="0";return t}function Tu(e,t){var r,n,a,o,c,u,f,h,m,g=1,v=10,b=e,j=b.d,k=b.constructor,S=k.precision;if(b.s<1)throw Error(an+(b.s?"NaN":"-Infinity"));if(b.eq(Fr))return new k(0);if(t==null?(dt=!1,h=S):h=t,b.eq(10))return t==null&&(dt=!0),Ag(k,h);if(h+=v,k.precision=h,r=Fn(j),n=r.charAt(0),o=St(b),Math.abs(o)<15e14){for(;n<7&&n!=1||n==1&&r.charAt(1)>3;)b=b.times(e),r=Fn(b.d),n=r.charAt(0),g++;o=St(b),n>1?(b=new k("0."+r),o++):b=new k(n+"."+r.slice(1))}else return f=Ag(k,h+2,S).times(o+""),b=Tu(new k(n+"."+r.slice(1)),h-v).plus(f),k.precision=S,t==null?(dt=!0,tt(b,S)):b;for(u=c=b=yi(b.minus(Fr),b.plus(Fr),h),m=tt(b.times(b),h),a=3;;){if(c=tt(c.times(m),h),f=u.plus(yi(c,new k(a),h)),Fn(f.d).slice(0,h)===Fn(u.d).slice(0,h))return u=u.times(2),o!==0&&(u=u.plus(Ag(k,h+2,S).times(o+""))),u=yi(u,new k(g),h),k.precision=S,t==null?(dt=!0,tt(u,S)):u;u=f,a+=2}}function Pj(e,t){var r,n,a;for((r=t.indexOf("."))>-1&&(t=t.replace(".","")),(n=t.search(/e/i))>0?(r<0&&(r=n),r+=+t.slice(n+1),t=t.substring(0,n)):r<0&&(r=t.length),n=0;t.charCodeAt(n)===48;)++n;for(a=t.length;t.charCodeAt(a-1)===48;)--a;if(t=t.slice(n,a),t){if(a-=n,r=r-n-1,e.e=ol(r/lt),e.d=[],n=(r+1)%lt,r<0&&(n+=lt),nLf||e.e<-Lf))throw Error(Jy+r)}else e.s=0,e.e=0,e.d=[0];return e}function tt(e,t,r){var n,a,o,c,u,f,h,m,g=e.d;for(c=1,o=g[0];o>=10;o/=10)c++;if(n=t-c,n<0)n+=lt,a=t,h=g[m=0];else{if(m=Math.ceil((n+1)/lt),o=g.length,m>=o)return e;for(h=o=g[m],c=1;o>=10;o/=10)c++;n%=lt,a=n-lt+c}if(r!==void 0&&(o=Ya(10,c-a-1),u=h/o%10|0,f=t<0||g[m+1]!==void 0||h%o,f=r<4?(u||f)&&(r==0||r==(e.s<0?3:2)):u>5||u==5&&(r==4||f||r==6&&(n>0?a>0?h/Ya(10,c-a):0:g[m-1])%10&1||r==(e.s<0?8:7))),t<1||!g[0])return f?(o=St(e),g.length=1,t=t-o-1,g[0]=Ya(10,(lt-t%lt)%lt),e.e=ol(-t/lt)||0):(g.length=1,g[0]=e.e=e.s=0),e;if(n==0?(g.length=m,o=1,m--):(g.length=m+1,o=Ya(10,lt-n),g[m]=a>0?(h/Ya(10,c-a)%Ya(10,a)|0)*o:0),f)for(;;)if(m==0){(g[0]+=o)==Rt&&(g[0]=1,++e.e);break}else{if(g[m]+=o,g[m]!=Rt)break;g[m--]=0,o=1}for(n=g.length;g[--n]===0;)g.pop();if(dt&&(e.e>Lf||e.e<-Lf))throw Error(Jy+St(e));return e}function kA(e,t){var r,n,a,o,c,u,f,h,m,g,v=e.constructor,b=v.precision;if(!e.s||!t.s)return t.s?t.s=-t.s:t=new v(e),dt?tt(t,b):t;if(f=e.d,g=t.d,n=t.e,h=e.e,f=f.slice(),c=h-n,c){for(m=c<0,m?(r=f,c=-c,u=g.length):(r=g,n=h,u=f.length),a=Math.max(Math.ceil(b/lt),u)+2,c>a&&(c=a,r.length=1),r.reverse(),a=c;a--;)r.push(0);r.reverse()}else{for(a=f.length,u=g.length,m=a0;--a)f[u++]=0;for(a=g.length;a>c;){if(f[--a]0?o=o.charAt(0)+"."+o.slice(1)+oa(n):c>1&&(o=o.charAt(0)+"."+o.slice(1)),o=o+(a<0?"e":"e+")+a):a<0?(o="0."+oa(-a-1)+o,r&&(n=r-c)>0&&(o+=oa(n))):a>=c?(o+=oa(a+1-c),r&&(n=r-a-1)>0&&(o=o+"."+oa(n))):((n=a+1)0&&(a+1===c&&(o+="."),o+=oa(n))),e.s<0?"-"+o:o}function Oj(e,t){if(e.length>t)return e.length=t,!0}function jA(e){var t,r,n;function a(o){var c=this;if(!(c instanceof a))return new a(o);if(c.constructor=a,o instanceof a){c.s=o.s,c.e=o.e,c.d=(o=o.d)?o.slice():o;return}if(typeof o=="number"){if(o*0!==0)throw Error(go+o);if(o>0)c.s=1;else if(o<0)o=-o,c.s=-1;else{c.s=0,c.e=0,c.d=[0];return}if(o===~~o&&o<1e7){c.e=0,c.d=[o];return}return Pj(c,o.toString())}else if(typeof o!="string")throw Error(go+o);if(o.charCodeAt(0)===45?(o=o.slice(1),c.s=-1):c.s=1,_F.test(o))Pj(c,o);else throw Error(go+o)}if(a.prototype=we,a.ROUND_UP=0,a.ROUND_DOWN=1,a.ROUND_CEIL=2,a.ROUND_FLOOR=3,a.ROUND_HALF_UP=4,a.ROUND_HALF_DOWN=5,a.ROUND_HALF_EVEN=6,a.ROUND_HALF_CEIL=7,a.ROUND_HALF_FLOOR=8,a.clone=jA,a.config=a.set=MF,e===void 0&&(e={}),e)for(n=["precision","rounding","toExpNeg","toExpPos","LN10"],t=0;t=a[t+1]&&n<=a[t+2])this[r]=n;else throw Error(go+r+": "+n);if((n=e[r="LN10"])!==void 0)if(n==Math.LN10)this[r]=new this(n);else throw Error(go+r+": "+n);return this}var e0=jA(OF);Fr=new e0(1);const Ge=e0;function SA(e){var t;return e===0?t=1:t=Math.floor(new Ge(e).abs().log(10).toNumber())+1,t}function NA(e,t,r){for(var n=new Ge(e),a=0,o=[];n.lt(t)&&a<1e5;)o.push(n.toNumber()),n=n.add(r),a++;return o}function Du(e,t){return RF(e)||DF(e,t)||TF(e,t)||IF()}function IF(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function TF(e,t){if(e){if(typeof e=="string")return _j(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?_j(e,t):void 0}}function _j(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{var t=Du(e,2),r=t[0],n=t[1],a=r,o=n;return r>n&&(a=n,o=r),[a,o]},t0=(e,t,r)=>{if(e.lte(0))return new Ge(0);var n=SA(e.toNumber()),a=new Ge(10).pow(n),o=e.div(a),c=n!==1?.05:.1,u=new Ge(Math.ceil(o.div(c).toNumber())).add(r).mul(c),f=u.mul(a);return t?new Ge(f.toNumber()):new Ge(Math.ceil(f.toNumber()))},AA=(e,t,r)=>{var n;if(e.lte(0))return new Ge(0);var a=[1,2,2.5,5],o=e.toNumber(),c=Math.floor(new Ge(o).abs().log(10).toNumber()),u=new Ge(10).pow(c),f=e.div(u).toNumber(),h=a.findIndex(b=>b>=f-1e-10);if(h===-1&&(u=u.mul(10),h=0),h+=r,h>=a.length){var m=Math.floor(h/a.length);h%=a.length,u=u.mul(new Ge(10).pow(m))}var g=(n=a[h])!==null&&n!==void 0?n:1,v=new Ge(g).mul(u);return t?v:new Ge(Math.ceil(v.toNumber()))},LF=(e,t,r)=>{var n=new Ge(1),a=new Ge(e);if(!a.isint()&&r){var o=Math.abs(e);o<1?(n=new Ge(10).pow(SA(e)-1),a=new Ge(Math.floor(a.div(n).toNumber())).mul(n)):o>1&&(a=new Ge(Math.floor(e)))}else e===0?a=new Ge(Math.floor((t-1)/2)):r||(a=new Ge(Math.floor(e)));for(var c=Math.floor((t-1)/2),u=[],f=0;f4&&arguments[4]!==void 0?arguments[4]:0,c=arguments.length>5&&arguments[5]!==void 0?arguments[5]:t0;if(!Number.isFinite((r-t)/(n-1)))return{step:new Ge(0),tickMin:new Ge(0),tickMax:new Ge(0)};var u=c(new Ge(r).sub(t).div(n-1),a,o),f;t<=0&&r>=0?f=new Ge(0):(f=new Ge(t).add(r).div(2),f=f.sub(new Ge(f).mod(u)));var h=Math.ceil(f.sub(t).div(u).toNumber()),m=Math.ceil(new Ge(r).sub(f).div(u).toNumber()),g=h+m+1;return g>n?CA(t,r,n,a,o+1,c):(g0?m+(n-g):m,h=r>0?h:h+(n-g)),{step:u,tickMin:f.sub(new Ge(h).mul(u)),tickMax:f.add(new Ge(m).mul(u))})},Mj=function(t){var r=Du(t,2),n=r[0],a=r[1],o=arguments.length>1&&arguments[1]!==void 0?arguments[1]:6,c=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,u=arguments.length>3&&arguments[3]!==void 0?arguments[3]:"auto",f=Math.max(o,2),h=EA([n,a]),m=Du(h,2),g=m[0],v=m[1];if(g===-1/0||v===1/0){var b=v===1/0?[g,...Array(o-1).fill(1/0)]:[...Array(o-1).fill(-1/0),v];return n>a?b.reverse():b}if(g===v)return LF(g,o,c);var j=u==="snap125"?AA:t0,k=CA(g,v,f,c,0,j),S=k.step,N=k.tickMin,E=k.tickMax,A=NA(N,E.add(new Ge(.1).mul(S)),S);return n>a?A.reverse():A},Ij=function(t,r){var n=Du(t,2),a=n[0],o=n[1],c=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,u=arguments.length>3&&arguments[3]!==void 0?arguments[3]:"auto",f=EA([a,o]),h=Du(f,2),m=h[0],g=h[1];if(m===-1/0||g===1/0)return[a,o];if(m===g)return[m];var v=u==="snap125"?AA:t0,b=Math.max(r,2),j=v(new Ge(g).sub(m).div(b-1),c,0),k=[...NA(new Ge(m),new Ge(g),j),g];return c===!1&&(k=k.map(S=>Math.round(S))),a>o?k.reverse():k},$F=e=>e.rootProps.barCategoryGap,Uh=e=>e.rootProps.stackOffset,PA=e=>e.rootProps.reverseStackOrder,r0=e=>e.options.chartName,n0=e=>e.rootProps.syncId,OA=e=>e.rootProps.syncMethod,i0=e=>e.options.eventEmitter,zF=e=>e.rootProps.baseValue,pr={grid:-100,barBackground:-50,area:100,cursorRectangle:200,bar:300,line:400,axis:500,scatter:600,activeBar:1e3,cursorLine:1100,activeDot:1200,label:2e3},Ua={allowDecimals:!1,allowDataOverflow:!1,angleAxisId:0,reversed:!1,scale:"auto",tick:!0,type:"auto"},In={allowDataOverflow:!1,allowDecimals:!1,allowDuplicatedCategory:!0,includeHidden:!1,radiusAxisId:0,reversed:!1,scale:"auto",tick:!0,tickCount:5,type:"auto"},Hh=(e,t)=>{if(!(!e||!t))return e!=null&&e.reversed?[t[1],t[0]]:t};function Wh(e,t,r){if(r!=="auto")return r;if(e!=null)return Xn(e,t)?"category":"number"}function Tj(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function $f(e){for(var t=1;t{if(t!=null)return e.polarAxis.angleAxis[t]},a0=q([HF,eA],(e,t)=>{var r;if(e!=null)return e;var n=(r=Wh(t,"angleAxis",Dj.type))!==null&&r!==void 0?r:"category";return $f($f({},Dj),{},{type:n})}),WF=(e,t)=>e.polarAxis.radiusAxis[t],o0=q([WF,eA],(e,t)=>{var r;if(e!=null)return e;var n=(r=Wh(t,"radiusAxis",Rj.type))!==null&&r!==void 0?r:"category";return $f($f({},Rj),{},{type:n})}),Kh=e=>e.polarOptions,s0=q([Ei,Ai,Zt],cF),_A=q([Kh,s0],(e,t)=>{if(e!=null)return Sa(e.innerRadius,t,0)}),MA=q([Kh,s0],(e,t)=>{if(e!=null)return Sa(e.outerRadius,t,t*.8)}),KF=e=>{if(e==null)return[0,0];var t=e.startAngle,r=e.endAngle;return[t,r]},IA=q([Kh],KF);q([a0,IA],Hh);var TA=q([s0,_A,MA],(e,t,r)=>{if(!(e==null||t==null||r==null))return[t,r]});q([o0,TA],Hh);var DA=q([ft,Kh,_A,MA,Ei,Ai],(e,t,r,n,a,o)=>{if(!(e!=="centric"&&e!=="radial"||t==null||r==null||n==null)){var c=t.cx,u=t.cy,f=t.startAngle,h=t.endAngle;return{cx:Sa(c,a,a/2),cy:Sa(u,o,o/2),innerRadius:r,outerRadius:n,startAngle:f,endAngle:h,clockWise:!1}}}),zt=(e,t)=>t,Gh=(e,t,r)=>r;function l0(e){return e==null?void 0:e.id}function RA(e,t,r){var n=t.chartData,a=n===void 0?[]:n,o=r.allowDuplicatedCategory,c=r.dataKey,u=new Map;return e.forEach(f=>{var h,m=(h=f.data)!==null&&h!==void 0?h:a;if(!(m==null||m.length===0)){var g=l0(f);m.forEach((v,b)=>{var j=c==null||o?b:String(Lt(v,c,null)),k=Lt(v,f.dataKey,0),S;u.has(j)?S=u.get(j):S={},Object.assign(S,{[g]:k}),u.set(j,S)})}}),Array.from(u.values())}function u0(e){return"stackId"in e&&e.stackId!=null&&e.dataKey!=null}var Vh=(e,t)=>e===t?!0:e==null||t==null?!1:e[0]===t[0]&&e[1]===t[1];function qh(e,t){return Array.isArray(e)&&Array.isArray(t)&&e.length===0&&t.length===0?!0:e===t}function GF(e,t){if(e.length===t.length){for(var r=0;r{var t=ft(e);return t==="horizontal"?"xAxis":t==="vertical"?"yAxis":t==="centric"?"angleAxis":"radiusAxis"},sl=e=>e.tooltip.settings.axisId;function c0(e){if(e!=null){var t=e.ticks,r=e.bandwidth,n=e.range(),a=[Math.min(...n),Math.max(...n)];return{domain:()=>e.domain(),range:(function(o){function c(){return o.apply(this,arguments)}return c.toString=function(){return o.toString()},c})(()=>a),rangeMin:()=>a[0],rangeMax:()=>a[1],isInRange(o){var c=a[0],u=a[1];return c<=u?o>=c&&o<=u:o>=u&&o<=c},bandwidth:r?()=>r.call(e):void 0,ticks:t?o=>t.call(e,o):void 0,map:(o,c)=>{var u=e(o);if(u!=null){if(e.bandwidth&&c!==null&&c!==void 0&&c.position){var f=e.bandwidth();switch(c.position){case"middle":u+=f/2;break;case"end":u+=f;break}}return u}}}}}var VF=(e,t)=>{if(t!=null)switch(e){case"linear":{if(!Bn(t)){for(var r,n,a=0;an)&&(n=o))}return r!==void 0&&n!==void 0?[r,n]:void 0}return t}default:return t}};function wa(e,t){return e==null||t==null?NaN:et?1:e>=t?0:NaN}function qF(e,t){return e==null||t==null?NaN:te?1:t>=e?0:NaN}function d0(e){let t,r,n;e.length!==2?(t=wa,r=(u,f)=>wa(e(u),f),n=(u,f)=>e(u)-f):(t=e===wa||e===qF?e:QF,r=e,n=e);function a(u,f,h=0,m=u.length){if(h>>1;r(u[g],f)<0?h=g+1:m=g}while(h>>1;r(u[g],f)<=0?h=g+1:m=g}while(hh&&n(u[g-1],f)>-n(u[g],f)?g-1:g}return{left:a,center:c,right:o}}function QF(){return 0}function LA(e){return e===null?NaN:+e}function*YF(e,t){for(let r of e)r!=null&&(r=+r)>=r&&(yield r)}const XF=d0(wa),ic=XF.right;d0(LA).center;class Lj extends Map{constructor(t,r=e9){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:r}}),t!=null)for(const[n,a]of t)this.set(n,a)}get(t){return super.get($j(this,t))}has(t){return super.has($j(this,t))}set(t,r){return super.set(ZF(this,t),r)}delete(t){return super.delete(JF(this,t))}}function $j({_intern:e,_key:t},r){const n=t(r);return e.has(n)?e.get(n):r}function ZF({_intern:e,_key:t},r){const n=t(r);return e.has(n)?e.get(n):(e.set(n,r),r)}function JF({_intern:e,_key:t},r){const n=t(r);return e.has(n)&&(r=e.get(n),e.delete(n)),r}function e9(e){return e!==null&&typeof e=="object"?e.valueOf():e}function t9(e=wa){if(e===wa)return $A;if(typeof e!="function")throw new TypeError("compare is not a function");return(t,r)=>{const n=e(t,r);return n||n===0?n:(e(r,r)===0)-(e(t,t)===0)}}function $A(e,t){return(e==null||!(e>=e))-(t==null||!(t>=t))||(et?1:0)}const r9=Math.sqrt(50),n9=Math.sqrt(10),i9=Math.sqrt(2);function zf(e,t,r){const n=(t-e)/Math.max(0,r),a=Math.floor(Math.log10(n)),o=n/Math.pow(10,a),c=o>=r9?10:o>=n9?5:o>=i9?2:1;let u,f,h;return a<0?(h=Math.pow(10,-a)/c,u=Math.round(e*h),f=Math.round(t*h),u/ht&&--f,h=-h):(h=Math.pow(10,a)*c,u=Math.round(e/h),f=Math.round(t/h),u*ht&&--f),f0))return[];if(e===t)return[e];const n=t=a))return[];const u=o-a+1,f=new Array(u);if(n)if(c<0)for(let h=0;h=n)&&(r=n);return r}function Fj(e,t){let r;for(const n of e)n!=null&&(r>n||r===void 0&&n>=n)&&(r=n);return r}function zA(e,t,r=0,n=1/0,a){if(t=Math.floor(t),r=Math.floor(Math.max(0,r)),n=Math.floor(Math.min(e.length-1,n)),!(r<=t&&t<=n))return e;for(a=a===void 0?$A:t9(a);n>r;){if(n-r>600){const f=n-r+1,h=t-r+1,m=Math.log(f),g=.5*Math.exp(2*m/3),v=.5*Math.sqrt(m*g*(f-g)/f)*(h-f/2<0?-1:1),b=Math.max(r,Math.floor(t-h*g/f+v)),j=Math.min(n,Math.floor(t+(f-h)*g/f+v));zA(e,t,b,j,a)}const o=e[t];let c=r,u=n;for(au(e,r,t),a(e[n],o)>0&&au(e,r,n);c0;)--u}a(e[r],o)===0?au(e,r,u):(++u,au(e,u,n)),u<=t&&(r=u+1),t<=u&&(n=u-1)}return e}function au(e,t,r){const n=e[t];e[t]=e[r],e[r]=n}function a9(e,t,r){if(e=Float64Array.from(YF(e)),!(!(n=e.length)||isNaN(t=+t))){if(t<=0||n<2)return Fj(e);if(t>=1)return zj(e);var n,a=(n-1)*t,o=Math.floor(a),c=zj(zA(e,o).subarray(0,o+1)),u=Fj(e.subarray(o+1));return c+(u-c)*(a-o)}}function o9(e,t,r=LA){if(!(!(n=e.length)||isNaN(t=+t))){if(t<=0||n<2)return+r(e[0],0,e);if(t>=1)return+r(e[n-1],n-1,e);var n,a=(n-1)*t,o=Math.floor(a),c=+r(e[o],o,e),u=+r(e[o+1],o+1,e);return c+(u-c)*(a-o)}}function s9(e,t,r){e=+e,t=+t,r=(a=arguments.length)<2?(t=e,e=0,1):a<3?1:+r;for(var n=-1,a=Math.max(0,Math.ceil((t-e)/r))|0,o=new Array(a);++n>8&15|t>>4&240,t>>4&15|t&240,(t&15)<<4|t&15,1):r===8?Bd(t>>24&255,t>>16&255,t>>8&255,(t&255)/255):r===4?Bd(t>>12&15|t>>8&240,t>>8&15|t>>4&240,t>>4&15|t&240,((t&15)<<4|t&15)/255):null):(t=c9.exec(e))?new Cr(t[1],t[2],t[3],1):(t=d9.exec(e))?new Cr(t[1]*255/100,t[2]*255/100,t[3]*255/100,1):(t=f9.exec(e))?Bd(t[1],t[2],t[3],t[4]):(t=h9.exec(e))?Bd(t[1]*255/100,t[2]*255/100,t[3]*255/100,t[4]):(t=m9.exec(e))?Vj(t[1],t[2]/100,t[3]/100,1):(t=p9.exec(e))?Vj(t[1],t[2]/100,t[3]/100,t[4]):Bj.hasOwnProperty(e)?Wj(Bj[e]):e==="transparent"?new Cr(NaN,NaN,NaN,0):null}function Wj(e){return new Cr(e>>16&255,e>>8&255,e&255,1)}function Bd(e,t,r,n){return n<=0&&(e=t=r=NaN),new Cr(e,t,r,n)}function y9(e){return e instanceof ac||(e=$u(e)),e?(e=e.rgb(),new Cr(e.r,e.g,e.b,e.opacity)):new Cr}function ty(e,t,r,n){return arguments.length===1?y9(e):new Cr(e,t,r,n??1)}function Cr(e,t,r,n){this.r=+e,this.g=+t,this.b=+r,this.opacity=+n}m0(Cr,ty,BA(ac,{brighter(e){return e=e==null?Ff:Math.pow(Ff,e),new Cr(this.r*e,this.g*e,this.b*e,this.opacity)},darker(e){return e=e==null?Ru:Math.pow(Ru,e),new Cr(this.r*e,this.g*e,this.b*e,this.opacity)},rgb(){return this},clamp(){return new Cr(vo(this.r),vo(this.g),vo(this.b),Bf(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:Kj,formatHex:Kj,formatHex8:x9,formatRgb:Gj,toString:Gj}));function Kj(){return`#${to(this.r)}${to(this.g)}${to(this.b)}`}function x9(){return`#${to(this.r)}${to(this.g)}${to(this.b)}${to((isNaN(this.opacity)?1:this.opacity)*255)}`}function Gj(){const e=Bf(this.opacity);return`${e===1?"rgb(":"rgba("}${vo(this.r)}, ${vo(this.g)}, ${vo(this.b)}${e===1?")":`, ${e})`}`}function Bf(e){return isNaN(e)?1:Math.max(0,Math.min(1,e))}function vo(e){return Math.max(0,Math.min(255,Math.round(e)||0))}function to(e){return e=vo(e),(e<16?"0":"")+e.toString(16)}function Vj(e,t,r,n){return n<=0?e=t=r=NaN:r<=0||r>=1?e=t=NaN:t<=0&&(e=NaN),new bn(e,t,r,n)}function UA(e){if(e instanceof bn)return new bn(e.h,e.s,e.l,e.opacity);if(e instanceof ac||(e=$u(e)),!e)return new bn;if(e instanceof bn)return e;e=e.rgb();var t=e.r/255,r=e.g/255,n=e.b/255,a=Math.min(t,r,n),o=Math.max(t,r,n),c=NaN,u=o-a,f=(o+a)/2;return u?(t===o?c=(r-n)/u+(r0&&f<1?0:c,new bn(c,u,f,e.opacity)}function b9(e,t,r,n){return arguments.length===1?UA(e):new bn(e,t,r,n??1)}function bn(e,t,r,n){this.h=+e,this.s=+t,this.l=+r,this.opacity=+n}m0(bn,b9,BA(ac,{brighter(e){return e=e==null?Ff:Math.pow(Ff,e),new bn(this.h,this.s,this.l*e,this.opacity)},darker(e){return e=e==null?Ru:Math.pow(Ru,e),new bn(this.h,this.s,this.l*e,this.opacity)},rgb(){var e=this.h%360+(this.h<0)*360,t=isNaN(e)||isNaN(this.s)?0:this.s,r=this.l,n=r+(r<.5?r:1-r)*t,a=2*r-n;return new Cr(Cg(e>=240?e-240:e+120,a,n),Cg(e,a,n),Cg(e<120?e+240:e-120,a,n),this.opacity)},clamp(){return new bn(qj(this.h),Ud(this.s),Ud(this.l),Bf(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const e=Bf(this.opacity);return`${e===1?"hsl(":"hsla("}${qj(this.h)}, ${Ud(this.s)*100}%, ${Ud(this.l)*100}%${e===1?")":`, ${e})`}`}}));function qj(e){return e=(e||0)%360,e<0?e+360:e}function Ud(e){return Math.max(0,Math.min(1,e||0))}function Cg(e,t,r){return(e<60?t+(r-t)*e/60:e<180?r:e<240?t+(r-t)*(240-e)/60:t)*255}const p0=e=>()=>e;function w9(e,t){return function(r){return e+r*t}}function k9(e,t,r){return e=Math.pow(e,r),t=Math.pow(t,r)-e,r=1/r,function(n){return Math.pow(e+n*t,r)}}function j9(e){return(e=+e)==1?HA:function(t,r){return r-t?k9(t,r,e):p0(isNaN(t)?r:t)}}function HA(e,t){var r=t-e;return r?w9(e,r):p0(isNaN(e)?t:e)}const Qj=(function e(t){var r=j9(t);function n(a,o){var c=r((a=ty(a)).r,(o=ty(o)).r),u=r(a.g,o.g),f=r(a.b,o.b),h=HA(a.opacity,o.opacity);return function(m){return a.r=c(m),a.g=u(m),a.b=f(m),a.opacity=h(m),a+""}}return n.gamma=e,n})(1);function S9(e,t){t||(t=[]);var r=e?Math.min(t.length,e.length):0,n=t.slice(),a;return function(o){for(a=0;ar&&(o=t.slice(r,o),u[c]?u[c]+=o:u[++c]=o),(n=n[0])===(a=a[0])?u[c]?u[c]+=a:u[++c]=a:(u[++c]=null,f.push({i:c,x:Uf(n,a)})),r=Pg.lastIndex;return rt&&(r=e,e=t,t=r),function(n){return Math.max(e,Math.min(t,n))}}function D9(e,t,r){var n=e[0],a=e[1],o=t[0],c=t[1];return a2?R9:D9,f=h=null,g}function g(v){return v==null||isNaN(v=+v)?o:(f||(f=u(e.map(n),t,r)))(n(c(v)))}return g.invert=function(v){return c(a((h||(h=u(t,e.map(n),Uf)))(v)))},g.domain=function(v){return arguments.length?(e=Array.from(v,Hf),m()):e.slice()},g.range=function(v){return arguments.length?(t=Array.from(v),m()):t.slice()},g.rangeRound=function(v){return t=Array.from(v),r=g0,m()},g.clamp=function(v){return arguments.length?(c=v?!0:gr,m()):c!==gr},g.interpolate=function(v){return arguments.length?(r=v,m()):r},g.unknown=function(v){return arguments.length?(o=v,g):o},function(v,b){return n=v,a=b,m()}}function v0(){return Qh()(gr,gr)}function L9(e){return Math.abs(e=Math.round(e))>=1e21?e.toLocaleString("en").replace(/,/g,""):e.toString(10)}function Wf(e,t){if(!isFinite(e)||e===0)return null;var r=(e=t?e.toExponential(t-1):e.toExponential()).indexOf("e"),n=e.slice(0,r);return[n.length>1?n[0]+n.slice(2):n,+e.slice(r+1)]}function Qs(e){return e=Wf(Math.abs(e)),e?e[1]:NaN}function $9(e,t){return function(r,n){for(var a=r.length,o=[],c=0,u=e[0],f=0;a>0&&u>0&&(f+u+1>n&&(u=Math.max(1,n-f)),o.push(r.substring(a-=u,a+u)),!((f+=u+1)>n));)u=e[c=(c+1)%e.length];return o.reverse().join(t)}}function z9(e){return function(t){return t.replace(/[0-9]/g,function(r){return e[+r]})}}var F9=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function zu(e){if(!(t=F9.exec(e)))throw new Error("invalid format: "+e);var t;return new y0({fill:t[1],align:t[2],sign:t[3],symbol:t[4],zero:t[5],width:t[6],comma:t[7],precision:t[8]&&t[8].slice(1),trim:t[9],type:t[10]})}zu.prototype=y0.prototype;function y0(e){this.fill=e.fill===void 0?" ":e.fill+"",this.align=e.align===void 0?">":e.align+"",this.sign=e.sign===void 0?"-":e.sign+"",this.symbol=e.symbol===void 0?"":e.symbol+"",this.zero=!!e.zero,this.width=e.width===void 0?void 0:+e.width,this.comma=!!e.comma,this.precision=e.precision===void 0?void 0:+e.precision,this.trim=!!e.trim,this.type=e.type===void 0?"":e.type+""}y0.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(this.width===void 0?"":Math.max(1,this.width|0))+(this.comma?",":"")+(this.precision===void 0?"":"."+Math.max(0,this.precision|0))+(this.trim?"~":"")+this.type};function B9(e){e:for(var t=e.length,r=1,n=-1,a;r0&&(n=0);break}return n>0?e.slice(0,n)+e.slice(a+1):e}var Kf;function U9(e,t){var r=Wf(e,t);if(!r)return Kf=void 0,e.toPrecision(t);var n=r[0],a=r[1],o=a-(Kf=Math.max(-8,Math.min(8,Math.floor(a/3)))*3)+1,c=n.length;return o===c?n:o>c?n+new Array(o-c+1).join("0"):o>0?n.slice(0,o)+"."+n.slice(o):"0."+new Array(1-o).join("0")+Wf(e,Math.max(0,t+o-1))[0]}function Xj(e,t){var r=Wf(e,t);if(!r)return e+"";var n=r[0],a=r[1];return a<0?"0."+new Array(-a).join("0")+n:n.length>a+1?n.slice(0,a+1)+"."+n.slice(a+1):n+new Array(a-n.length+2).join("0")}const Zj={"%":(e,t)=>(e*100).toFixed(t),b:e=>Math.round(e).toString(2),c:e=>e+"",d:L9,e:(e,t)=>e.toExponential(t),f:(e,t)=>e.toFixed(t),g:(e,t)=>e.toPrecision(t),o:e=>Math.round(e).toString(8),p:(e,t)=>Xj(e*100,t),r:Xj,s:U9,X:e=>Math.round(e).toString(16).toUpperCase(),x:e=>Math.round(e).toString(16)};function Jj(e){return e}var eS=Array.prototype.map,tS=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function H9(e){var t=e.grouping===void 0||e.thousands===void 0?Jj:$9(eS.call(e.grouping,Number),e.thousands+""),r=e.currency===void 0?"":e.currency[0]+"",n=e.currency===void 0?"":e.currency[1]+"",a=e.decimal===void 0?".":e.decimal+"",o=e.numerals===void 0?Jj:z9(eS.call(e.numerals,String)),c=e.percent===void 0?"%":e.percent+"",u=e.minus===void 0?"−":e.minus+"",f=e.nan===void 0?"NaN":e.nan+"";function h(g,v){g=zu(g);var b=g.fill,j=g.align,k=g.sign,S=g.symbol,N=g.zero,E=g.width,A=g.comma,P=g.precision,_=g.trim,O=g.type;O==="n"?(A=!0,O="g"):Zj[O]||(P===void 0&&(P=12),_=!0,O="g"),(N||b==="0"&&j==="=")&&(N=!0,b="0",j="=");var D=(v&&v.prefix!==void 0?v.prefix:"")+(S==="$"?r:S==="#"&&/[boxX]/.test(O)?"0"+O.toLowerCase():""),U=(S==="$"?n:/[%p]/.test(O)?c:"")+(v&&v.suffix!==void 0?v.suffix:""),B=Zj[O],F=/[defgprs%]/.test(O);P=P===void 0?6:/[gprs]/.test(O)?Math.max(1,Math.min(21,P)):Math.max(0,Math.min(20,P));function Y(H){var pe=D,ue=U,he,ae,se;if(O==="c")ue=B(H)+ue,H="";else{H=+H;var X=H<0||1/H<0;if(H=isNaN(H)?f:B(Math.abs(H),P),_&&(H=B9(H)),X&&+H==0&&k!=="+"&&(X=!1),pe=(X?k==="("?k:u:k==="-"||k==="("?"":k)+pe,ue=(O==="s"&&!isNaN(H)&&Kf!==void 0?tS[8+Kf/3]:"")+ue+(X&&k==="("?")":""),F){for(he=-1,ae=H.length;++hese||se>57){ue=(se===46?a+H.slice(he+1):H.slice(he))+ue,H=H.slice(0,he);break}}}A&&!N&&(H=t(H,1/0));var te=pe.length+H.length+ue.length,J=te>1)+pe+H+ue+J.slice(te);break;default:H=J+pe+H+ue;break}return o(H)}return Y.toString=function(){return g+""},Y}function m(g,v){var b=Math.max(-8,Math.min(8,Math.floor(Qs(v)/3)))*3,j=Math.pow(10,-b),k=h((g=zu(g),g.type="f",g),{suffix:tS[8+b/3]});return function(S){return k(j*S)}}return{format:h,formatPrefix:m}}var Hd,x0,WA;W9({thousands:",",grouping:[3],currency:["$",""]});function W9(e){return Hd=H9(e),x0=Hd.format,WA=Hd.formatPrefix,Hd}function K9(e){return Math.max(0,-Qs(Math.abs(e)))}function G9(e,t){return Math.max(0,Math.max(-8,Math.min(8,Math.floor(Qs(t)/3)))*3-Qs(Math.abs(e)))}function V9(e,t){return e=Math.abs(e),t=Math.abs(t)-e,Math.max(0,Qs(t)-Qs(e))+1}function KA(e,t,r,n){var a=Jv(e,t,r),o;switch(n=zu(n??",f"),n.type){case"s":{var c=Math.max(Math.abs(e),Math.abs(t));return n.precision==null&&!isNaN(o=G9(a,c))&&(n.precision=o),WA(n,c)}case"":case"e":case"g":case"p":case"r":{n.precision==null&&!isNaN(o=V9(a,Math.max(Math.abs(e),Math.abs(t))))&&(n.precision=o-(n.type==="e"));break}case"f":case"%":{n.precision==null&&!isNaN(o=K9(a))&&(n.precision=o-(n.type==="%")*2);break}}return x0(n)}function Na(e){var t=e.domain;return e.ticks=function(r){var n=t();return Xv(n[0],n[n.length-1],r??10)},e.tickFormat=function(r,n){var a=t();return KA(a[0],a[a.length-1],r??10,n)},e.nice=function(r){r==null&&(r=10);var n=t(),a=0,o=n.length-1,c=n[a],u=n[o],f,h,m=10;for(u0;){if(h=Zv(c,u,r),h===f)return n[a]=c,n[o]=u,t(n);if(h>0)c=Math.floor(c/h)*h,u=Math.ceil(u/h)*h;else if(h<0)c=Math.ceil(c*h)/h,u=Math.floor(u*h)/h;else break;f=h}return e},e}function GA(){var e=v0();return e.copy=function(){return oc(e,GA())},sn.apply(e,arguments),Na(e)}function VA(e){var t;function r(n){return n==null||isNaN(n=+n)?t:n}return r.invert=r,r.domain=r.range=function(n){return arguments.length?(e=Array.from(n,Hf),r):e.slice()},r.unknown=function(n){return arguments.length?(t=n,r):t},r.copy=function(){return VA(e).unknown(t)},e=arguments.length?Array.from(e,Hf):[0,1],Na(r)}function qA(e,t){e=e.slice();var r=0,n=e.length-1,a=e[r],o=e[n],c;return oMath.pow(e,t)}function Z9(e){return e===Math.E?Math.log:e===10&&Math.log10||e===2&&Math.log2||(e=Math.log(e),t=>Math.log(t)/e)}function iS(e){return(t,r)=>-e(-t,r)}function b0(e){const t=e(rS,nS),r=t.domain;let n=10,a,o;function c(){return a=Z9(n),o=X9(n),r()[0]<0?(a=iS(a),o=iS(o),e(q9,Q9)):e(rS,nS),t}return t.base=function(u){return arguments.length?(n=+u,c()):n},t.domain=function(u){return arguments.length?(r(u),c()):r()},t.ticks=u=>{const f=r();let h=f[0],m=f[f.length-1];const g=m0){for(;v<=b;++v)for(j=1;jm)break;N.push(k)}}else for(;v<=b;++v)for(j=n-1;j>=1;--j)if(k=v>0?j/o(-v):j*o(v),!(km)break;N.push(k)}N.length*2{if(u==null&&(u=10),f==null&&(f=n===10?"s":","),typeof f!="function"&&(!(n%1)&&(f=zu(f)).precision==null&&(f.trim=!0),f=x0(f)),u===1/0)return f;const h=Math.max(1,n*u/t.ticks().length);return m=>{let g=m/o(Math.round(a(m)));return g*nr(qA(r(),{floor:u=>o(Math.floor(a(u))),ceil:u=>o(Math.ceil(a(u)))})),t}function QA(){const e=b0(Qh()).domain([1,10]);return e.copy=()=>oc(e,QA()).base(e.base()),sn.apply(e,arguments),e}function aS(e){return function(t){return Math.sign(t)*Math.log1p(Math.abs(t/e))}}function oS(e){return function(t){return Math.sign(t)*Math.expm1(Math.abs(t))*e}}function w0(e){var t=1,r=e(aS(t),oS(t));return r.constant=function(n){return arguments.length?e(aS(t=+n),oS(t)):t},Na(r)}function YA(){var e=w0(Qh());return e.copy=function(){return oc(e,YA()).constant(e.constant())},sn.apply(e,arguments)}function sS(e){return function(t){return t<0?-Math.pow(-t,e):Math.pow(t,e)}}function J9(e){return e<0?-Math.sqrt(-e):Math.sqrt(e)}function e7(e){return e<0?-e*e:e*e}function k0(e){var t=e(gr,gr),r=1;function n(){return r===1?e(gr,gr):r===.5?e(J9,e7):e(sS(r),sS(1/r))}return t.exponent=function(a){return arguments.length?(r=+a,n()):r},Na(t)}function j0(){var e=k0(Qh());return e.copy=function(){return oc(e,j0()).exponent(e.exponent())},sn.apply(e,arguments),e}function t7(){return j0.apply(null,arguments).exponent(.5)}function lS(e){return Math.sign(e)*e*e}function r7(e){return Math.sign(e)*Math.sqrt(Math.abs(e))}function XA(){var e=v0(),t=[0,1],r=!1,n;function a(o){var c=r7(e(o));return isNaN(c)?n:r?Math.round(c):c}return a.invert=function(o){return e.invert(lS(o))},a.domain=function(o){return arguments.length?(e.domain(o),a):e.domain()},a.range=function(o){return arguments.length?(e.range((t=Array.from(o,Hf)).map(lS)),a):t.slice()},a.rangeRound=function(o){return a.range(o).round(!0)},a.round=function(o){return arguments.length?(r=!!o,a):r},a.clamp=function(o){return arguments.length?(e.clamp(o),a):e.clamp()},a.unknown=function(o){return arguments.length?(n=o,a):n},a.copy=function(){return XA(e.domain(),t).round(r).clamp(e.clamp()).unknown(n)},sn.apply(a,arguments),Na(a)}function ZA(){var e=[],t=[],r=[],n;function a(){var c=0,u=Math.max(1,t.length);for(r=new Array(u-1);++c0?r[u-1]:e[0],u=r?[n[r-1],t]:[n[h-1],n[h]]},c.unknown=function(f){return arguments.length&&(o=f),c},c.thresholds=function(){return n.slice()},c.copy=function(){return JA().domain([e,t]).range(a).unknown(o)},sn.apply(Na(c),arguments)}function eC(){var e=[.5],t=[0,1],r,n=1;function a(o){return o!=null&&o<=o?t[ic(e,o,0,n)]:r}return a.domain=function(o){return arguments.length?(e=Array.from(o),n=Math.min(e.length,t.length-1),a):e.slice()},a.range=function(o){return arguments.length?(t=Array.from(o),n=Math.min(e.length,t.length-1),a):t.slice()},a.invertExtent=function(o){var c=t.indexOf(o);return[e[c-1],e[c]]},a.unknown=function(o){return arguments.length?(r=o,a):r},a.copy=function(){return eC().domain(e).range(t).unknown(r)},sn.apply(a,arguments)}const Og=new Date,_g=new Date;function Ot(e,t,r,n){function a(o){return e(o=arguments.length===0?new Date:new Date(+o)),o}return a.floor=o=>(e(o=new Date(+o)),o),a.ceil=o=>(e(o=new Date(o-1)),t(o,1),e(o),o),a.round=o=>{const c=a(o),u=a.ceil(o);return o-c(t(o=new Date(+o),c==null?1:Math.floor(c)),o),a.range=(o,c,u)=>{const f=[];if(o=a.ceil(o),u=u==null?1:Math.floor(u),!(o0))return f;let h;do f.push(h=new Date(+o)),t(o,u),e(o);while(hOt(c=>{if(c>=c)for(;e(c),!o(c);)c.setTime(c-1)},(c,u)=>{if(c>=c)if(u<0)for(;++u<=0;)for(;t(c,-1),!o(c););else for(;--u>=0;)for(;t(c,1),!o(c););}),r&&(a.count=(o,c)=>(Og.setTime(+o),_g.setTime(+c),e(Og),e(_g),Math.floor(r(Og,_g))),a.every=o=>(o=Math.floor(o),!isFinite(o)||!(o>0)?null:o>1?a.filter(n?c=>n(c)%o===0:c=>a.count(0,c)%o===0):a)),a}const Gf=Ot(()=>{},(e,t)=>{e.setTime(+e+t)},(e,t)=>t-e);Gf.every=e=>(e=Math.floor(e),!isFinite(e)||!(e>0)?null:e>1?Ot(t=>{t.setTime(Math.floor(t/e)*e)},(t,r)=>{t.setTime(+t+r*e)},(t,r)=>(r-t)/e):Gf);Gf.range;const pi=1e3,tn=pi*60,gi=tn*60,ki=gi*24,S0=ki*7,uS=ki*30,Mg=ki*365,ro=Ot(e=>{e.setTime(e-e.getMilliseconds())},(e,t)=>{e.setTime(+e+t*pi)},(e,t)=>(t-e)/pi,e=>e.getUTCSeconds());ro.range;const N0=Ot(e=>{e.setTime(e-e.getMilliseconds()-e.getSeconds()*pi)},(e,t)=>{e.setTime(+e+t*tn)},(e,t)=>(t-e)/tn,e=>e.getMinutes());N0.range;const E0=Ot(e=>{e.setUTCSeconds(0,0)},(e,t)=>{e.setTime(+e+t*tn)},(e,t)=>(t-e)/tn,e=>e.getUTCMinutes());E0.range;const A0=Ot(e=>{e.setTime(e-e.getMilliseconds()-e.getSeconds()*pi-e.getMinutes()*tn)},(e,t)=>{e.setTime(+e+t*gi)},(e,t)=>(t-e)/gi,e=>e.getHours());A0.range;const C0=Ot(e=>{e.setUTCMinutes(0,0,0)},(e,t)=>{e.setTime(+e+t*gi)},(e,t)=>(t-e)/gi,e=>e.getUTCHours());C0.range;const sc=Ot(e=>e.setHours(0,0,0,0),(e,t)=>e.setDate(e.getDate()+t),(e,t)=>(t-e-(t.getTimezoneOffset()-e.getTimezoneOffset())*tn)/ki,e=>e.getDate()-1);sc.range;const Yh=Ot(e=>{e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCDate(e.getUTCDate()+t)},(e,t)=>(t-e)/ki,e=>e.getUTCDate()-1);Yh.range;const tC=Ot(e=>{e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCDate(e.getUTCDate()+t)},(e,t)=>(t-e)/ki,e=>Math.floor(e/ki));tC.range;function _o(e){return Ot(t=>{t.setDate(t.getDate()-(t.getDay()+7-e)%7),t.setHours(0,0,0,0)},(t,r)=>{t.setDate(t.getDate()+r*7)},(t,r)=>(r-t-(r.getTimezoneOffset()-t.getTimezoneOffset())*tn)/S0)}const Xh=_o(0),Vf=_o(1),n7=_o(2),i7=_o(3),Ys=_o(4),a7=_o(5),o7=_o(6);Xh.range;Vf.range;n7.range;i7.range;Ys.range;a7.range;o7.range;function Mo(e){return Ot(t=>{t.setUTCDate(t.getUTCDate()-(t.getUTCDay()+7-e)%7),t.setUTCHours(0,0,0,0)},(t,r)=>{t.setUTCDate(t.getUTCDate()+r*7)},(t,r)=>(r-t)/S0)}const Zh=Mo(0),qf=Mo(1),s7=Mo(2),l7=Mo(3),Xs=Mo(4),u7=Mo(5),c7=Mo(6);Zh.range;qf.range;s7.range;l7.range;Xs.range;u7.range;c7.range;const P0=Ot(e=>{e.setDate(1),e.setHours(0,0,0,0)},(e,t)=>{e.setMonth(e.getMonth()+t)},(e,t)=>t.getMonth()-e.getMonth()+(t.getFullYear()-e.getFullYear())*12,e=>e.getMonth());P0.range;const O0=Ot(e=>{e.setUTCDate(1),e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCMonth(e.getUTCMonth()+t)},(e,t)=>t.getUTCMonth()-e.getUTCMonth()+(t.getUTCFullYear()-e.getUTCFullYear())*12,e=>e.getUTCMonth());O0.range;const ji=Ot(e=>{e.setMonth(0,1),e.setHours(0,0,0,0)},(e,t)=>{e.setFullYear(e.getFullYear()+t)},(e,t)=>t.getFullYear()-e.getFullYear(),e=>e.getFullYear());ji.every=e=>!isFinite(e=Math.floor(e))||!(e>0)?null:Ot(t=>{t.setFullYear(Math.floor(t.getFullYear()/e)*e),t.setMonth(0,1),t.setHours(0,0,0,0)},(t,r)=>{t.setFullYear(t.getFullYear()+r*e)});ji.range;const Si=Ot(e=>{e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCFullYear(e.getUTCFullYear()+t)},(e,t)=>t.getUTCFullYear()-e.getUTCFullYear(),e=>e.getUTCFullYear());Si.every=e=>!isFinite(e=Math.floor(e))||!(e>0)?null:Ot(t=>{t.setUTCFullYear(Math.floor(t.getUTCFullYear()/e)*e),t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)},(t,r)=>{t.setUTCFullYear(t.getUTCFullYear()+r*e)});Si.range;function rC(e,t,r,n,a,o){const c=[[ro,1,pi],[ro,5,5*pi],[ro,15,15*pi],[ro,30,30*pi],[o,1,tn],[o,5,5*tn],[o,15,15*tn],[o,30,30*tn],[a,1,gi],[a,3,3*gi],[a,6,6*gi],[a,12,12*gi],[n,1,ki],[n,2,2*ki],[r,1,S0],[t,1,uS],[t,3,3*uS],[e,1,Mg]];function u(h,m,g){const v=mS).right(c,v);if(b===c.length)return e.every(Jv(h/Mg,m/Mg,g));if(b===0)return Gf.every(Math.max(Jv(h,m,g),1));const[j,k]=c[v/c[b-1][2]53)return null;"w"in ie||(ie.w=1),"Z"in ie?(Fe=Tg(ou(ie.y,0,1)),Oe=Fe.getUTCDay(),Fe=Oe>4||Oe===0?qf.ceil(Fe):qf(Fe),Fe=Yh.offset(Fe,(ie.V-1)*7),ie.y=Fe.getUTCFullYear(),ie.m=Fe.getUTCMonth(),ie.d=Fe.getUTCDate()+(ie.w+6)%7):(Fe=Ig(ou(ie.y,0,1)),Oe=Fe.getDay(),Fe=Oe>4||Oe===0?Vf.ceil(Fe):Vf(Fe),Fe=sc.offset(Fe,(ie.V-1)*7),ie.y=Fe.getFullYear(),ie.m=Fe.getMonth(),ie.d=Fe.getDate()+(ie.w+6)%7)}else("W"in ie||"U"in ie)&&("w"in ie||(ie.w="u"in ie?ie.u%7:"W"in ie?1:0),Oe="Z"in ie?Tg(ou(ie.y,0,1)).getUTCDay():Ig(ou(ie.y,0,1)).getDay(),ie.m=0,ie.d="W"in ie?(ie.w+6)%7+ie.W*7-(Oe+5)%7:ie.w+ie.U*7-(Oe+6)%7);return"Z"in ie?(ie.H+=ie.Z/100|0,ie.M+=ie.Z%100,Tg(ie)):Ig(ie)}}function U(re,xe,_e,ie){for(var Je=0,Fe=xe.length,Oe=_e.length,ut,Jt;Je=Oe)return-1;if(ut=xe.charCodeAt(Je++),ut===37){if(ut=xe.charAt(Je++),Jt=_[ut in cS?xe.charAt(Je++):ut],!Jt||(ie=Jt(re,_e,ie))<0)return-1}else if(ut!=_e.charCodeAt(ie++))return-1}return ie}function B(re,xe,_e){var ie=h.exec(xe.slice(_e));return ie?(re.p=m.get(ie[0].toLowerCase()),_e+ie[0].length):-1}function F(re,xe,_e){var ie=b.exec(xe.slice(_e));return ie?(re.w=j.get(ie[0].toLowerCase()),_e+ie[0].length):-1}function Y(re,xe,_e){var ie=g.exec(xe.slice(_e));return ie?(re.w=v.get(ie[0].toLowerCase()),_e+ie[0].length):-1}function H(re,xe,_e){var ie=N.exec(xe.slice(_e));return ie?(re.m=E.get(ie[0].toLowerCase()),_e+ie[0].length):-1}function pe(re,xe,_e){var ie=k.exec(xe.slice(_e));return ie?(re.m=S.get(ie[0].toLowerCase()),_e+ie[0].length):-1}function ue(re,xe,_e){return U(re,t,xe,_e)}function he(re,xe,_e){return U(re,r,xe,_e)}function ae(re,xe,_e){return U(re,n,xe,_e)}function se(re){return c[re.getDay()]}function X(re){return o[re.getDay()]}function te(re){return f[re.getMonth()]}function J(re){return u[re.getMonth()]}function I(re){return a[+(re.getHours()>=12)]}function M(re){return 1+~~(re.getMonth()/3)}function K(re){return c[re.getUTCDay()]}function ne(re){return o[re.getUTCDay()]}function Z(re){return f[re.getUTCMonth()]}function me(re){return u[re.getUTCMonth()]}function ge(re){return a[+(re.getUTCHours()>=12)]}function Pe(re){return 1+~~(re.getUTCMonth()/3)}return{format:function(re){var xe=O(re+="",A);return xe.toString=function(){return re},xe},parse:function(re){var xe=D(re+="",!1);return xe.toString=function(){return re},xe},utcFormat:function(re){var xe=O(re+="",P);return xe.toString=function(){return re},xe},utcParse:function(re){var xe=D(re+="",!0);return xe.toString=function(){return re},xe}}}var cS={"-":"",_:" ",0:"0"},Bt=/^\s*\d+/,g7=/^%/,v7=/[\\^$*+?|[\]().{}]/g;function Ye(e,t,r){var n=e<0?"-":"",a=(n?-e:e)+"",o=a.length;return n+(o[t.toLowerCase(),r]))}function x7(e,t,r){var n=Bt.exec(t.slice(r,r+1));return n?(e.w=+n[0],r+n[0].length):-1}function b7(e,t,r){var n=Bt.exec(t.slice(r,r+1));return n?(e.u=+n[0],r+n[0].length):-1}function w7(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.U=+n[0],r+n[0].length):-1}function k7(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.V=+n[0],r+n[0].length):-1}function j7(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.W=+n[0],r+n[0].length):-1}function dS(e,t,r){var n=Bt.exec(t.slice(r,r+4));return n?(e.y=+n[0],r+n[0].length):-1}function fS(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.y=+n[0]+(+n[0]>68?1900:2e3),r+n[0].length):-1}function S7(e,t,r){var n=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(t.slice(r,r+6));return n?(e.Z=n[1]?0:-(n[2]+(n[3]||"00")),r+n[0].length):-1}function N7(e,t,r){var n=Bt.exec(t.slice(r,r+1));return n?(e.q=n[0]*3-3,r+n[0].length):-1}function E7(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.m=n[0]-1,r+n[0].length):-1}function hS(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.d=+n[0],r+n[0].length):-1}function A7(e,t,r){var n=Bt.exec(t.slice(r,r+3));return n?(e.m=0,e.d=+n[0],r+n[0].length):-1}function mS(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.H=+n[0],r+n[0].length):-1}function C7(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.M=+n[0],r+n[0].length):-1}function P7(e,t,r){var n=Bt.exec(t.slice(r,r+2));return n?(e.S=+n[0],r+n[0].length):-1}function O7(e,t,r){var n=Bt.exec(t.slice(r,r+3));return n?(e.L=+n[0],r+n[0].length):-1}function _7(e,t,r){var n=Bt.exec(t.slice(r,r+6));return n?(e.L=Math.floor(n[0]/1e3),r+n[0].length):-1}function M7(e,t,r){var n=g7.exec(t.slice(r,r+1));return n?r+n[0].length:-1}function I7(e,t,r){var n=Bt.exec(t.slice(r));return n?(e.Q=+n[0],r+n[0].length):-1}function T7(e,t,r){var n=Bt.exec(t.slice(r));return n?(e.s=+n[0],r+n[0].length):-1}function pS(e,t){return Ye(e.getDate(),t,2)}function D7(e,t){return Ye(e.getHours(),t,2)}function R7(e,t){return Ye(e.getHours()%12||12,t,2)}function L7(e,t){return Ye(1+sc.count(ji(e),e),t,3)}function nC(e,t){return Ye(e.getMilliseconds(),t,3)}function $7(e,t){return nC(e,t)+"000"}function z7(e,t){return Ye(e.getMonth()+1,t,2)}function F7(e,t){return Ye(e.getMinutes(),t,2)}function B7(e,t){return Ye(e.getSeconds(),t,2)}function U7(e){var t=e.getDay();return t===0?7:t}function H7(e,t){return Ye(Xh.count(ji(e)-1,e),t,2)}function iC(e){var t=e.getDay();return t>=4||t===0?Ys(e):Ys.ceil(e)}function W7(e,t){return e=iC(e),Ye(Ys.count(ji(e),e)+(ji(e).getDay()===4),t,2)}function K7(e){return e.getDay()}function G7(e,t){return Ye(Vf.count(ji(e)-1,e),t,2)}function V7(e,t){return Ye(e.getFullYear()%100,t,2)}function q7(e,t){return e=iC(e),Ye(e.getFullYear()%100,t,2)}function Q7(e,t){return Ye(e.getFullYear()%1e4,t,4)}function Y7(e,t){var r=e.getDay();return e=r>=4||r===0?Ys(e):Ys.ceil(e),Ye(e.getFullYear()%1e4,t,4)}function X7(e){var t=e.getTimezoneOffset();return(t>0?"-":(t*=-1,"+"))+Ye(t/60|0,"0",2)+Ye(t%60,"0",2)}function gS(e,t){return Ye(e.getUTCDate(),t,2)}function Z7(e,t){return Ye(e.getUTCHours(),t,2)}function J7(e,t){return Ye(e.getUTCHours()%12||12,t,2)}function eB(e,t){return Ye(1+Yh.count(Si(e),e),t,3)}function aC(e,t){return Ye(e.getUTCMilliseconds(),t,3)}function tB(e,t){return aC(e,t)+"000"}function rB(e,t){return Ye(e.getUTCMonth()+1,t,2)}function nB(e,t){return Ye(e.getUTCMinutes(),t,2)}function iB(e,t){return Ye(e.getUTCSeconds(),t,2)}function aB(e){var t=e.getUTCDay();return t===0?7:t}function oB(e,t){return Ye(Zh.count(Si(e)-1,e),t,2)}function oC(e){var t=e.getUTCDay();return t>=4||t===0?Xs(e):Xs.ceil(e)}function sB(e,t){return e=oC(e),Ye(Xs.count(Si(e),e)+(Si(e).getUTCDay()===4),t,2)}function lB(e){return e.getUTCDay()}function uB(e,t){return Ye(qf.count(Si(e)-1,e),t,2)}function cB(e,t){return Ye(e.getUTCFullYear()%100,t,2)}function dB(e,t){return e=oC(e),Ye(e.getUTCFullYear()%100,t,2)}function fB(e,t){return Ye(e.getUTCFullYear()%1e4,t,4)}function hB(e,t){var r=e.getUTCDay();return e=r>=4||r===0?Xs(e):Xs.ceil(e),Ye(e.getUTCFullYear()%1e4,t,4)}function mB(){return"+0000"}function vS(){return"%"}function yS(e){return+e}function xS(e){return Math.floor(+e/1e3)}var ds,sC,lC;pB({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});function pB(e){return ds=p7(e),sC=ds.format,ds.parse,lC=ds.utcFormat,ds.utcParse,ds}function gB(e){return new Date(e)}function vB(e){return e instanceof Date?+e:+new Date(+e)}function _0(e,t,r,n,a,o,c,u,f,h){var m=v0(),g=m.invert,v=m.domain,b=h(".%L"),j=h(":%S"),k=h("%I:%M"),S=h("%I %p"),N=h("%a %d"),E=h("%b %d"),A=h("%B"),P=h("%Y");function _(O){return(f(O)t(a/(e.length-1)))},r.quantiles=function(n){return Array.from({length:n+1},(a,o)=>a9(e,o/n))},r.copy=function(){return fC(t).domain(e)},Ci.apply(r,arguments)}function em(){var e=0,t=.5,r=1,n=1,a,o,c,u,f,h=gr,m,g=!1,v;function b(k){return isNaN(k=+k)?v:(k=.5+((k=+m(k))-o)*(n*k{if(e!=null){var n=e.scale,a=e.type;if(n==="auto")return a==="category"&&r&&(r.indexOf("LineChart")>=0||r.indexOf("AreaChart")>=0||r.indexOf("ComposedChart")>=0&&!t)?"point":a==="category"?"band":"linear";if(typeof n=="string")return SB(n)?n:"point"}};function NB(e,t){for(var r=0,n=e.length,a=e[0]t)?r=o+1:n=o}return r}function yC(e,t){if(e){var r=t??e.domain(),n=r.map(o=>{var c;return(c=e(o))!==null&&c!==void 0?c:0}),a=e.range();if(!(r.length===0||a.length<2))return o=>{var c,u,f=NB(n,o);if(f<=0)return r[0];if(f>=r.length)return r[r.length-1];var h=(c=n[f-1])!==null&&c!==void 0?c:0,m=(u=n[f])!==null&&u!==void 0?u:0;return Math.abs(o-h)<=Math.abs(o-m)?r[f-1]:r[f]}}}function EB(e){if(e!=null)return"invert"in e&&typeof e.invert=="function"?e.invert.bind(e):yC(e,void 0)}function wS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function Qf(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);re.cartesianAxis.xAxis[t],Pi=(e,t)=>{var r=bC(e,t);return r??Ct},Pt={allowDataOverflow:!1,allowDecimals:!0,allowDuplicatedCategory:!0,angle:0,dataKey:void 0,domain:iy,hide:!0,id:0,includeHidden:!1,interval:"preserveEnd",minTickGap:5,mirror:!1,name:void 0,orientation:"left",padding:{top:0,bottom:0},reversed:!1,scale:"auto",tick:!0,tickCount:5,tickFormatter:void 0,ticks:void 0,type:"number",unit:void 0,niceTicks:"auto",width:Ju},wC=(e,t)=>e.cartesianAxis.yAxis[t],Oi=(e,t)=>{var r=wC(e,t);return r??Pt},TB={domain:[0,"auto"],includeHidden:!1,reversed:!1,allowDataOverflow:!1,allowDuplicatedCategory:!1,dataKey:void 0,id:0,name:"",range:[64,64],scale:"auto",type:"number",unit:""},D0=(e,t)=>{var r=e.cartesianAxis.zAxis[t];return r??TB},yr=(e,t,r)=>{switch(t){case"xAxis":return Pi(e,r);case"yAxis":return Oi(e,r);case"zAxis":return D0(e,r);case"angleAxis":return a0(e,r);case"radiusAxis":return o0(e,r);default:throw new Error("Unexpected axis type: ".concat(t))}},DB=(e,t,r)=>{switch(t){case"xAxis":return Pi(e,r);case"yAxis":return Oi(e,r);default:throw new Error("Unexpected axis type: ".concat(t))}},lc=(e,t,r)=>{switch(t){case"xAxis":return Pi(e,r);case"yAxis":return Oi(e,r);case"angleAxis":return a0(e,r);case"radiusAxis":return o0(e,r);default:throw new Error("Unexpected axis type: ".concat(t))}},kC=e=>e.graphicalItems.cartesianItems.some(t=>t.type==="bar")||e.graphicalItems.polarItems.some(t=>t.type==="radialBar");function jC(e,t){return r=>{switch(e){case"xAxis":return"xAxisId"in r&&r.xAxisId===t;case"yAxis":return"yAxisId"in r&&r.yAxisId===t;case"zAxis":return"zAxisId"in r&&r.zAxisId===t;case"angleAxis":return"angleAxisId"in r&&r.angleAxisId===t;case"radiusAxis":return"radiusAxisId"in r&&r.radiusAxisId===t;default:return!1}}}var SC=e=>e.graphicalItems.cartesianItems,RB=q([zt,Gh],jC),NC=(e,t,r)=>e.filter(r).filter(n=>(t==null?void 0:t.includeHidden)===!0?!0:!n.hide),ul=q([SC,yr,RB],NC,{memoizeOptions:{resultEqualityCheck:qh}}),EC=q([ul],e=>e.filter(t=>t.type==="area"||t.type==="bar").filter(u0)),AC=e=>e.filter(t=>!("stackId"in t)||t.stackId===void 0),LB=q([ul],AC),CC=e=>e.map(t=>t.data).filter(Boolean).flat(1),$B=q([ul],e=>e.some(t=>!t.data)),PC=q([ul],CC,{memoizeOptions:{resultEqualityCheck:qh}}),OC=(e,t)=>{var r=t.chartData,n=r===void 0?[]:r,a=t.dataStartIndex,o=t.dataEndIndex;return e.length>0?e:n.slice(a,o+1)},R0=q([PC,Bh],OC),zB=(e,t,r)=>(t==null?void 0:t.dataKey)!=null?e.map(n=>({value:Lt(n,t.dataKey)})):r.length>0?r.map(n=>n.dataKey).flatMap(n=>e.map(a=>({value:Lt(a,n)}))):e.map(n=>({value:n})),_C=(e,t,r,n,a,o)=>{var c=n.chartData,u=c===void 0?[]:c,f=n.dataStartIndex,h=n.dataEndIndex,m=zB(e,t,r);if(a&&(t==null?void 0:t.dataKey)!=null&&o.length>0){var g=u.slice(f,h+1),v=g.map(b=>({value:Lt(b,t.dataKey)})).filter(b=>b.value!=null);return[...v,...m]}return m},uc=q([R0,yr,ul,Bh,$B,PC],_C);function As(e){if(Gn(e)||e instanceof Date){var t=Number(e);if(We(t))return t}}function jS(e){if(Array.isArray(e)){var t=[As(e[0]),As(e[1])];return Bn(t)?t:void 0}var r=As(e);if(r!=null)return[r,r]}function Qn(e){return e.map(As).filter(Ar)}function FB(e,t){var r=As(e),n=As(t);return r==null&&n==null?0:r==null?-1:n==null?1:r-n}var BB=q([uc],e=>e==null?void 0:e.map(t=>t.value).sort(FB));function MC(e,t){switch(e){case"xAxis":return t.direction==="x";case"yAxis":return t.direction==="y";default:return!1}}function UB(e,t,r){if(!r)return[];if(!r.length)return[];var n;if(typeof t=="number"&&!Kn(t))n=t;else if(Array.isArray(t)){var a=Qn(t);a.length>0&&(n=Math.max(...a))}return n==null?[]:Qn(r.flatMap(o=>{var c=Lt(e,o.dataKey),u,f;if(Array.isArray(c)){var h=xC(c,2);u=h[0],f=h[1]}else u=f=c;if(!(!We(u)||!We(f)))return[n-u,n+f]}))}var _t=e=>{var t=Ft(e),r=sl(e);return lc(e,t,r)},Zs=q([_t],e=>e==null?void 0:e.dataKey),HB=q([EC,Bh,_t],RA),IC=(e,t,r,n)=>{var a={},o=t.reduce((c,u)=>{if(u.stackId==null)return c;var f=c[u.stackId];return f==null&&(f=[]),f.push(u),c[u.stackId]=f,c},a);return Object.fromEntries(Object.entries(o).map(c=>{var u=xC(c,2),f=u[0],h=u[1],m=n?[...h].reverse():h,g=m.map(l0);return[f,{stackedData:sz(e,g,r),graphicalItems:m}]}))},TC=q([HB,EC,Uh,PA],IC),DC=(e,t,r,n)=>{var a=t.dataStartIndex,o=t.dataEndIndex;if(n==null&&r!=="zAxis")return dz(e,a,o)},WB=q([yr],e=>e.allowDataOverflow),L0=e=>{var t;if(e==null||!("domain"in e))return iy;if(e.domain!=null)return e.domain;if("ticks"in e&&e.ticks!=null){if(e.type==="number"){var r=Qn(e.ticks);return[Math.min(...r),Math.max(...r)]}if(e.type==="category")return e.ticks.map(String)}return(t=e==null?void 0:e.domain)!==null&&t!==void 0?t:iy},RC=q([yr],L0),LC=q([RC,WB],yA),KB=q([TC,Nn,zt,LC],DC,{memoizeOptions:{resultEqualityCheck:Vh}}),$0=e=>e.errorBars,GB=(e,t,r)=>e.flatMap(n=>t[n.id]).filter(Boolean).filter(n=>MC(r,n)),Yf=function(){for(var t=arguments.length,r=new Array(t),n=0;n5&&arguments[5]!==void 0?arguments[5]:[],u,f;if(n.length>0&&n.forEach(h=>{var m,g=h.data!=null?[...h.data]:c,v=(m=a[h.id])===null||m===void 0?void 0:m.filter(b=>MC(o,b));g.forEach(b=>{var j,k=Lt(b,(j=r.dataKey)!==null&&j!==void 0?j:h.dataKey),S=UB(b,k,v);if(S.length>=2){var N=Math.min(...S),E=Math.max(...S);(u==null||Nf)&&(f=E)}var A=jS(k);A!=null&&(u=u==null?A[0]:Math.min(u,A[0]),f=f==null?A[1]:Math.max(f,A[1]))})}),(r==null?void 0:r.dataKey)!=null&&n.length===0&&t.forEach(h=>{var m=jS(Lt(h,r.dataKey));m!=null&&(u=u==null?m[0]:Math.min(u,m[0]),f=f==null?m[1]:Math.max(f,m[1]))}),We(u)&&We(f))return[u,f]},VB=q([R0,yr,LB,$0,zt,jF],$C,{memoizeOptions:{resultEqualityCheck:Vh}});function qB(e){var t=e.value;if(Gn(t)||t instanceof Date)return t}var QB=(e,t,r)=>{var n=e.map(qB).filter(a=>a!=null);return r&&(t.dataKey==null||t.allowDuplicatedCategory&&QE(n))?vA(0,e.length):t.allowDuplicatedCategory?n:Array.from(new Set(n))},zC=e=>e.referenceElements.dots,cl=(e,t,r)=>e.filter(n=>n.ifOverflow==="extendDomain").filter(n=>t==="xAxis"?n.xAxisId===r:n.yAxisId===r),YB=q([zC,zt,Gh],cl),FC=e=>e.referenceElements.areas,XB=q([FC,zt,Gh],cl),BC=e=>e.referenceElements.lines,ZB=q([BC,zt,Gh],cl),UC=(e,t)=>{if(e!=null){var r=Qn(e.map(n=>t==="xAxis"?n.x:n.y));if(r.length!==0)return[Math.min(...r),Math.max(...r)]}},JB=q(YB,zt,UC),HC=(e,t)=>{if(e!=null){var r=Qn(e.flatMap(n=>[t==="xAxis"?n.x1:n.y1,t==="xAxis"?n.x2:n.y2]));if(r.length!==0)return[Math.min(...r),Math.max(...r)]}},eU=q([XB,zt],HC);function tU(e){var t;if(e.x!=null)return Qn([e.x]);var r=(t=e.segment)===null||t===void 0?void 0:t.map(n=>n.x);return r==null||r.length===0?[]:Qn(r)}function rU(e){var t;if(e.y!=null)return Qn([e.y]);var r=(t=e.segment)===null||t===void 0?void 0:t.map(n=>n.y);return r==null||r.length===0?[]:Qn(r)}var WC=(e,t)=>{if(e!=null){var r=e.flatMap(n=>t==="xAxis"?tU(n):rU(n));if(r.length!==0)return[Math.min(...r),Math.max(...r)]}},nU=q([ZB,zt],WC),iU=q(JB,nU,eU,(e,t,r)=>Yf(e,r,t)),KC=(e,t,r,n,a,o,c,u)=>{if(r!=null)return r;var f=c==="vertical"&&u==="xAxis"||c==="horizontal"&&u==="yAxis",h=f?Yf(n,o,a):Yf(o,a);return PF(t,h,e.allowDataOverflow)},aU=q([yr,RC,LC,KB,VB,iU,ft,zt],KC,{memoizeOptions:{resultEqualityCheck:Vh}}),oU=[0,1],GC=(e,t,r,n,a,o,c)=>{if(!((e==null||r==null||r.length===0)&&c===void 0)){var u=e.dataKey,f=e.type,h=Xn(t,o);if(h&&u==null){var m;return vA(0,(m=r==null?void 0:r.length)!==null&&m!==void 0?m:0)}return f==="category"?QB(n,e,h):a==="expand"&&!h?oU:c}},z0=q([yr,ft,R0,uc,Uh,zt,aU],GC),dl=q([yr,kC,r0],vC),VC=(e,t,r)=>{var n=t.niceTicks;if(n!=="none"){var a=L0(t),o=Array.isArray(a)&&(a[0]==="auto"||a[1]==="auto");if((n==="snap125"||n==="adaptive")&&t!=null&&t.tickCount&&Bn(e)){if(o)return Mj(e,t.tickCount,t.allowDecimals,n);if(t.type==="number")return Ij(e,t.tickCount,t.allowDecimals,n)}if(n==="auto"&&r==="linear"&&t!=null&&t.tickCount){if(o&&Bn(e))return Mj(e,t.tickCount,t.allowDecimals,"adaptive");if(t.type==="number"&&Bn(e))return Ij(e,t.tickCount,t.allowDecimals,"adaptive")}}},F0=q([z0,lc,dl],VC),qC=(e,t,r,n)=>{if(n!=="angleAxis"&&(e==null?void 0:e.type)==="number"&&Bn(t)&&Array.isArray(r)&&r.length>0){var a,o,c=t[0],u=(a=r[0])!==null&&a!==void 0?a:0,f=t[1],h=(o=r[r.length-1])!==null&&o!==void 0?o:0;return[Math.min(c,u),Math.max(f,h)]}return t},sU=q([yr,z0,F0,zt],qC),lU=q(uc,yr,(e,t)=>{if(!(!t||t.type!=="number")){var r=1/0,n=Array.from(Qn(e.map(g=>g.value))).sort((g,v)=>g-v),a=n[0],o=n[n.length-1];if(a==null||o==null)return 1/0;var c=o-a;if(c===0)return 1/0;for(var u=0;ua,(e,t,r,n,a)=>{if(!We(e))return 0;var o=t==="vertical"?n.height:n.width;if(a==="gap")return e*o/2;if(a==="no-gap"){var c=Sa(r,e*o),u=e*o/2;return u-c-(u-c)/o*c}return 0}),uU=(e,t,r)=>{var n=Pi(e,t);return n==null||typeof n.padding!="string"?0:QC(e,"xAxis",t,r,n.padding)},cU=(e,t,r)=>{var n=Oi(e,t);return n==null||typeof n.padding!="string"?0:QC(e,"yAxis",t,r,n.padding)},dU=q(Pi,uU,(e,t)=>{var r,n;if(e==null)return{left:0,right:0};var a=e.padding;return typeof a=="string"?{left:t,right:t}:{left:((r=a.left)!==null&&r!==void 0?r:0)+t,right:((n=a.right)!==null&&n!==void 0?n:0)+t}}),fU=q(Oi,cU,(e,t)=>{var r,n;if(e==null)return{top:0,bottom:0};var a=e.padding;return typeof a=="string"?{top:t,bottom:t}:{top:((r=a.top)!==null&&r!==void 0?r:0)+t,bottom:((n=a.bottom)!==null&&n!==void 0?n:0)+t}}),YC=q([Zt,dU,Dh,Th,(e,t,r)=>r],(e,t,r,n,a)=>{var o=n.padding;return a?[o.left,r.width-o.right]:[e.left+t.left,e.left+e.width-t.right]}),XC=q([Zt,ft,fU,Dh,Th,(e,t,r)=>r],(e,t,r,n,a,o)=>{var c=a.padding;return o?[n.height-c.bottom,c.top]:t==="horizontal"?[e.top+e.height-r.bottom,e.top+r.top]:[e.top+r.top,e.top+e.height-r.bottom]}),cc=(e,t,r,n)=>{var a;switch(t){case"xAxis":return YC(e,r,n);case"yAxis":return XC(e,r,n);case"zAxis":return(a=D0(e,r))===null||a===void 0?void 0:a.range;case"angleAxis":return IA(e);case"radiusAxis":return TA(e,r);default:return}},ZC=q([yr,cc],Hh),hU=q([dl,sU],VF),B0=q([yr,dl,hU,ZC],T0),JC=(e,t,r,n)=>{if(!(r==null||r.dataKey==null)){var a=r.type,o=r.scale,c=Xn(e,n);if(c&&(a==="number"||o!=="auto"))return t.map(u=>u.value)}},U0=q([ft,uc,lc,zt],JC),tm=q([B0],c0);q([B0],EB);q([B0,BB],yC);q([ul,$0,zt],GB);function eP(e,t){return e.idt.id?1:0}var rm=(e,t)=>t,nm=(e,t,r)=>r,mU=q(Mh,rm,nm,(e,t,r)=>e.filter(n=>n.orientation===t).filter(n=>n.mirror===r).sort(eP)),pU=q(Ih,rm,nm,(e,t,r)=>e.filter(n=>n.orientation===t).filter(n=>n.mirror===r).sort(eP)),tP=(e,t)=>({width:e.width,height:t.height}),gU=(e,t)=>{var r=typeof t.width=="number"?t.width:Ju;return{width:r,height:e.height}},vU=q(Zt,Pi,tP),yU=(e,t,r)=>{switch(t){case"top":return e.top;case"bottom":return r-e.bottom;default:return 0}},xU=(e,t,r)=>{switch(t){case"left":return e.left;case"right":return r-e.right;default:return 0}},bU=q(Ai,Zt,mU,rm,nm,(e,t,r,n,a)=>{var o={},c;return r.forEach(u=>{var f=tP(t,u);c==null&&(c=yU(t,n,e));var h=n==="top"&&!a||n==="bottom"&&a;o[u.id]=c-Number(h)*f.height,c+=(h?-1:1)*f.height}),o}),wU=q(Ei,Zt,pU,rm,nm,(e,t,r,n,a)=>{var o={},c;return r.forEach(u=>{var f=gU(t,u);c==null&&(c=xU(t,n,e));var h=n==="left"&&!a||n==="right"&&a;o[u.id]=c-Number(h)*f.width,c+=(h?-1:1)*f.width}),o}),kU=(e,t)=>{var r=Pi(e,t);if(r!=null)return bU(e,r.orientation,r.mirror)},jU=q([Zt,Pi,kU,(e,t)=>t],(e,t,r,n)=>{if(t!=null){var a=r==null?void 0:r[n];return a==null?{x:e.left,y:0}:{x:e.left,y:a}}}),SU=(e,t)=>{var r=Oi(e,t);if(r!=null)return wU(e,r.orientation,r.mirror)},NU=q([Zt,Oi,SU,(e,t)=>t],(e,t,r,n)=>{if(t!=null){var a=r==null?void 0:r[n];return a==null?{x:0,y:e.top}:{x:a,y:e.top}}}),EU=q(Zt,Oi,(e,t)=>{var r=typeof t.width=="number"?t.width:Ju;return{width:r,height:e.height}}),rP=(e,t,r,n)=>{if(r!=null){var a=r.allowDuplicatedCategory,o=r.type,c=r.dataKey,u=Xn(e,n),f=t.map(m=>m.value),h=f.filter(m=>m!=null);if(c&&u&&o==="category"&&a&&QE(h))return f}},H0=q([ft,uc,yr,zt],rP),SS=q([ft,DB,dl,tm,H0,U0,cc,F0,zt],(e,t,r,n,a,o,c,u,f)=>{if(t!=null){var h=Xn(e,f);return{angle:t.angle,interval:t.interval,minTickGap:t.minTickGap,orientation:t.orientation,tick:t.tick,tickCount:t.tickCount,tickFormatter:t.tickFormatter,ticks:t.ticks,type:t.type,unit:t.unit,axisType:f,categoricalDomain:o,duplicateDomain:a,isCategorical:h,niceTicks:u,range:c,realScaleType:r,scale:n}}}),AU=(e,t,r,n,a,o,c,u,f)=>{if(!(t==null||n==null)){var h=Xn(e,f),m=t.type,g=t.ticks,v=t.tickCount,b=r==="scaleBand"&&typeof n.bandwidth=="function"?n.bandwidth()/2:2,j=m==="category"&&n.bandwidth?n.bandwidth()/b:0;j=f==="angleAxis"&&o!=null&&o.length>=2?Jr(o[0]-o[1])*2*j:j;var k=g||a;return k?k.map((S,N)=>{var E=c?c.indexOf(S):S,A=n.map(E);return We(A)?{index:N,coordinate:A+j,value:S,offset:j}:null}).filter(Ar):h&&u?u.map((S,N)=>{var E=n.map(S);return We(E)?{coordinate:E+j,value:S,index:N,offset:j}:null}).filter(Ar):n.ticks?n.ticks(v).map((S,N)=>{var E=n.map(S);return We(E)?{coordinate:E+j,value:S,index:N,offset:j}:null}).filter(Ar):n.domain().map((S,N)=>{var E=n.map(S);return We(E)?{coordinate:E+j,value:c?c[S]:S,index:N,offset:j}:null}).filter(Ar)}},nP=q([ft,lc,dl,tm,F0,cc,H0,U0,zt],AU),CU=(e,t,r,n,a,o,c)=>{if(!(t==null||r==null||n==null||n[0]===n[1])){var u=Xn(e,c),f=t.tickCount,h=0;return h=c==="angleAxis"&&(n==null?void 0:n.length)>=2?Jr(n[0]-n[1])*2*h:h,u&&o?o.map((m,g)=>{var v=r.map(m);return We(v)?{coordinate:v+h,value:m,index:g,offset:h}:null}).filter(Ar):r.ticks?r.ticks(f).map((m,g)=>{var v=r.map(m);return We(v)?{coordinate:v+h,value:m,index:g,offset:h}:null}).filter(Ar):r.domain().map((m,g)=>{var v=r.map(m);return We(v)?{coordinate:v+h,value:a?a[m]:m,index:g,offset:h}:null}).filter(Ar)}},iP=q([ft,lc,tm,cc,H0,U0,zt],CU),aP=q(yr,tm,(e,t)=>{if(!(e==null||t==null))return Qf(Qf({},e),{},{scale:t})}),PU=q([yr,dl,z0,ZC],T0),OU=q([PU],c0);q((e,t,r)=>D0(e,r),OU,(e,t)=>{if(!(e==null||t==null))return Qf(Qf({},e),{},{scale:t})});var _U=q([ft,Mh,Ih],(e,t,r)=>{switch(e){case"horizontal":return t.some(n=>n.reversed)?"right-to-left":"left-to-right";case"vertical":return r.some(n=>n.reversed)?"bottom-to-top":"top-to-bottom";case"centric":case"radial":return"left-to-right";default:return}}),MU=(e,t,r)=>{var n;return(n=e.renderedTicks[t])===null||n===void 0?void 0:n[r]};q([MU],e=>{if(!(!e||e.length===0))return t=>{var r,n=1/0,a=e[0];for(var o of e){var c=Math.abs(o.coordinate-t);ce.options.defaultTooltipEventType,sP=e=>e.options.validateTooltipEventTypes;function lP(e,t,r){if(e==null)return t;var n=e?"axis":"item";return r==null?t:r.includes(n)?n:t}function dc(e,t){var r=oP(e),n=sP(e);return lP(t,r,n)}function IU(e){return Me(t=>dc(t,e))}var uP=(e,t)=>{var r,n=Number(t);if(!(Kn(n)||t==null))return n>=0?e==null||(r=e[n])===null||r===void 0?void 0:r.value:void 0},TU=e=>e.tooltip.settings,la={active:!1,index:null,dataKey:void 0,graphicalItemId:void 0,coordinate:void 0},DU={itemInteraction:{click:la,hover:la},axisInteraction:{click:la,hover:la},keyboardInteraction:la,syncInteraction:{active:!1,index:null,dataKey:void 0,label:void 0,coordinate:void 0,sourceViewBox:void 0,graphicalItemId:void 0},tooltipItemPayloads:[],settings:{shared:void 0,trigger:"hover",axisId:0,active:!1,defaultIndex:void 0}},cP=lr({name:"tooltip",initialState:DU,reducers:{addTooltipEntrySettings:{reducer(e,t){e.tooltipItemPayloads.push(t.payload)},prepare:st()},replaceTooltipEntrySettings:{reducer(e,t){var r=t.payload,n=r.prev,a=r.next,o=en(e).tooltipItemPayloads.indexOf(n);o>-1&&(e.tooltipItemPayloads[o]=a)},prepare:st()},removeTooltipEntrySettings:{reducer(e,t){var r=en(e).tooltipItemPayloads.indexOf(t.payload);r>-1&&e.tooltipItemPayloads.splice(r,1)},prepare:st()},setTooltipSettingsState(e,t){e.settings=t.payload},setActiveMouseOverItemIndex(e,t){e.syncInteraction.active=!1,e.syncInteraction.sourceViewBox=void 0,e.keyboardInteraction.active=!1,e.itemInteraction.hover.active=!0,e.itemInteraction.hover.index=t.payload.activeIndex,e.itemInteraction.hover.dataKey=t.payload.activeDataKey,e.itemInteraction.hover.graphicalItemId=t.payload.activeGraphicalItemId,e.itemInteraction.hover.coordinate=t.payload.activeCoordinate},mouseLeaveChart(e){e.itemInteraction.hover.active=!1,e.axisInteraction.hover.active=!1},mouseLeaveItem(e){e.itemInteraction.hover.active=!1},setActiveClickItemIndex(e,t){e.syncInteraction.active=!1,e.syncInteraction.sourceViewBox=void 0,e.itemInteraction.click.active=!0,e.keyboardInteraction.active=!1,e.itemInteraction.click.index=t.payload.activeIndex,e.itemInteraction.click.dataKey=t.payload.activeDataKey,e.itemInteraction.click.graphicalItemId=t.payload.activeGraphicalItemId,e.itemInteraction.click.coordinate=t.payload.activeCoordinate},setMouseOverAxisIndex(e,t){e.syncInteraction.active=!1,e.syncInteraction.sourceViewBox=void 0,e.axisInteraction.hover.active=!0,e.keyboardInteraction.active=!1,e.axisInteraction.hover.index=t.payload.activeIndex,e.axisInteraction.hover.dataKey=t.payload.activeDataKey,e.axisInteraction.hover.coordinate=t.payload.activeCoordinate},setMouseClickAxisIndex(e,t){e.syncInteraction.active=!1,e.syncInteraction.sourceViewBox=void 0,e.keyboardInteraction.active=!1,e.axisInteraction.click.active=!0,e.axisInteraction.click.index=t.payload.activeIndex,e.axisInteraction.click.dataKey=t.payload.activeDataKey,e.axisInteraction.click.coordinate=t.payload.activeCoordinate},setSyncInteraction(e,t){e.syncInteraction=t.payload},setKeyboardInteraction(e,t){e.keyboardInteraction.active=t.payload.active,e.keyboardInteraction.index=t.payload.activeIndex,e.keyboardInteraction.coordinate=t.payload.activeCoordinate}}}),ln=cP.actions,RU=ln.addTooltipEntrySettings,LU=ln.replaceTooltipEntrySettings,$U=ln.removeTooltipEntrySettings,zU=ln.setTooltipSettingsState,FU=ln.setActiveMouseOverItemIndex;ln.mouseLeaveItem;var dP=ln.mouseLeaveChart;ln.setActiveClickItemIndex;var fP=ln.setMouseOverAxisIndex,BU=ln.setMouseClickAxisIndex,gu=ln.setSyncInteraction,Xf=ln.setKeyboardInteraction,UU=cP.reducer;function NS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function Wd(e){for(var t=1;t{if(t==null)return la;var a=GU(e,t,r);if(a==null)return la;if(a.active)return a;if(e.keyboardInteraction.active)return e.keyboardInteraction;if(e.syncInteraction.active&&e.syncInteraction.index!=null)return e.syncInteraction;var o=e.settings.active===!0;if(VU(a)){if(o)return Wd(Wd({},a),{},{active:!0})}else if(n!=null)return{active:!0,coordinate:void 0,dataKey:void 0,index:n,graphicalItemId:void 0};return Wd(Wd({},la),{},{coordinate:a.coordinate})};function qU(e){if(typeof e=="number")return Number.isFinite(e)?e:void 0;if(e instanceof Date){var t=e.valueOf();return Number.isFinite(t)?t:void 0}var r=Number(e);return Number.isFinite(r)?r:void 0}function QU(e,t){var r=qU(e),n=t[0],a=t[1];if(r===void 0)return!1;var o=Math.min(n,a),c=Math.max(n,a);return r>=o&&r<=c}function YU(e,t,r){if(r==null||t==null)return!0;var n=Lt(e,t);return n==null||!Bn(r)?!0:QU(n,r)}var xu=(e,t,r,n)=>{var a=e==null?void 0:e.index;if(a==null)return null;var o=Number(a);if(!We(o))return a;var c=0,u=1/0;t.length>0&&(u=t.length-1);var f=Math.max(c,Math.min(o,u)),h=t[f];return h==null||YU(h,r,n)?String(f):null},mP=(e,t,r,n,a,o,c)=>{if(o!=null){var u=c[0],f=u==null?void 0:u.getPosition(o);if(f!=null)return f;var h=a==null?void 0:a[Number(o)];if(h)switch(r){case"horizontal":return{x:h.coordinate,y:(n.top+t)/2};default:return{x:(n.left+e)/2,y:h.coordinate}}}},pP=(e,t,r,n)=>{if(t==="axis")return e.tooltipItemPayloads;if(e.tooltipItemPayloads.length===0)return[];var a;if(r==="hover"?a=e.itemInteraction.hover.graphicalItemId:a=e.itemInteraction.click.graphicalItemId,e.syncInteraction.active&&a==null)return e.tooltipItemPayloads;if(a==null&&(n!=null||e.keyboardInteraction.active)){var o=e.tooltipItemPayloads[0];return o!=null?[o]:[]}return e.tooltipItemPayloads.filter(c=>{var u;return((u=c.settings)===null||u===void 0?void 0:u.graphicalItemId)===a})},gP=e=>e.options.tooltipPayloadSearcher,fl=e=>e.tooltip;function ES(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function AS(e){for(var t=1;te(t)}function CS(e){if(typeof e=="string")return e}function nH(e){if(!(e==null||typeof e!="object")){var t="name"in e?eH(e.name):void 0,r="unit"in e?tH(e.unit):void 0,n="dataKey"in e?rH(e.dataKey):void 0,a="payload"in e?e.payload:void 0,o="color"in e?CS(e.color):void 0,c="fill"in e?CS(e.fill):void 0;return{name:t,unit:r,dataKey:n,payload:a,color:o,fill:c}}}function iH(e,t){return e??t}var vP=(e,t,r,n,a,o,c)=>{if(!(t==null||o==null)){var u=r.chartData,f=r.computedData,h=r.dataStartIndex,m=r.dataEndIndex,g=[];return e.reduce((v,b)=>{var j,k=b.dataDefinedOnItem,S=b.settings,N=iH(k,u),E=Array.isArray(N)?U5(N,h,m):N,A=(j=S==null?void 0:S.dataKey)!==null&&j!==void 0?j:n,P=S==null?void 0:S.nameKey,_;if(n&&Array.isArray(E)&&!Array.isArray(E[0])&&c==="axis"?_=YE(E,n,a):_=o(E,t,f,P),Array.isArray(_))_.forEach(D=>{var U,B,F=nH(D),Y=F==null?void 0:F.name,H=F==null?void 0:F.dataKey,pe=F==null?void 0:F.payload,ue=AS(AS({},S),{},{name:Y,unit:F==null?void 0:F.unit,color:(U=F==null?void 0:F.color)!==null&&U!==void 0?U:S==null?void 0:S.color,fill:(B=F==null?void 0:F.fill)!==null&&B!==void 0?B:S==null?void 0:S.fill});v.push(kk({tooltipEntrySettings:ue,dataKey:H,payload:pe,value:Lt(pe,H),name:Y==null?void 0:String(Y)}))});else{var O;v.push(kk({tooltipEntrySettings:S,dataKey:A,payload:_,value:Lt(_,A),name:(O=Lt(_,P))!==null&&O!==void 0?O:S==null?void 0:S.name}))}return v},g)}},W0=q([_t,kC,r0],vC),aH=q([e=>e.graphicalItems.cartesianItems,e=>e.graphicalItems.polarItems],(e,t)=>[...e,...t]),oH=q([Ft,sl],jC),Io=q([aH,_t,oH],NC,{memoizeOptions:{resultEqualityCheck:qh}}),sH=q([Io],e=>e.filter(u0)),yP=q([Io],CC,{memoizeOptions:{resultEqualityCheck:qh}}),lH=q([Io],e=>e.some(t=>!t.data)),No=q([yP,Nn],OC),uH=q([sH,Nn,_t],RA),K0=q([No,_t,Io,Nn,lH,yP],_C),xP=q([_t],L0),cH=q([_t],e=>e.allowDataOverflow),bP=q([xP,cH],yA),dH=q([Io],e=>e.filter(u0)),fH=q([uH,dH,Uh,PA],IC),hH=q([fH,Nn,Ft,bP],DC),mH=q([Io],AC),pH=q([No,_t,mH,$0,Ft,SF],$C,{memoizeOptions:{resultEqualityCheck:Vh}}),gH=q([zC,Ft,sl],cl),vH=q([gH,Ft],UC),yH=q([FC,Ft,sl],cl),xH=q([yH,Ft],HC),bH=q([BC,Ft,sl],cl),wH=q([bH,Ft],WC),kH=q([vH,wH,xH],Yf),jH=q([_t,xP,bP,hH,pH,kH,ft,Ft],KC),Js=q([_t,ft,No,K0,Uh,Ft,jH],GC),SH=q([Js,_t,W0],VC),NH=q([_t,Js,SH,Ft],qC),wP=e=>{var t=Ft(e),r=sl(e),n=!1;return cc(e,t,r,n)},kP=q([_t,wP],Hh),EH=q([_t,W0,NH,kP],T0),jP=q([EH],c0),AH=q([ft,K0,_t,Ft],rP),CH=q([ft,K0,_t,Ft],JC),PH=(e,t,r,n,a,o,c,u)=>{if(t){var f=t.type,h=Xn(e,u);if(n){var m=r==="scaleBand"&&n.bandwidth?n.bandwidth()/2:2,g=f==="category"&&n.bandwidth?n.bandwidth()/m:0;return g=u==="angleAxis"&&a!=null&&(a==null?void 0:a.length)>=2?Jr(a[0]-a[1])*2*g:g,h&&c?c.map((v,b)=>{var j=n.map(v);return We(j)?{coordinate:j+g,value:v,index:b,offset:g}:null}).filter(Ar):n.domain().map((v,b)=>{var j=n.map(v);return We(j)?{coordinate:j+g,value:o?o[v]:v,index:b,offset:g}:null}).filter(Ar)}}},_i=q([ft,_t,W0,jP,wP,AH,CH,Ft],PH),G0=q([oP,sP,TU],(e,t,r)=>lP(r.shared,e,t)),SP=e=>e.tooltip.settings.trigger,V0=e=>e.tooltip.settings.defaultIndex,fc=q([fl,G0,SP,V0],hP),Fu=q([fc,No,Zs,Js],xu),NP=q([_i,Fu],uP),OH=q([fc],e=>{if(e)return e.dataKey}),_H=q([fc],e=>{if(e)return e.graphicalItemId}),EP=q([fl,G0,SP,V0],pP),MH=q([Ei,Ai,ft,Zt,_i,V0,EP],mP),IH=q([fc,MH],(e,t)=>e!=null&&e.coordinate?e.coordinate:t),TH=q([fc],e=>{var t;return(t=e==null?void 0:e.active)!==null&&t!==void 0?t:!1}),DH=q([EP,Fu,Nn,Zs,NP,gP,G0],vP),RH=q([DH],e=>{if(e!=null){var t=e.map(r=>r.payload).filter(r=>r!=null);return Array.from(new Set(t))}});function PS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function OS(e){for(var t=1;tMe(_t),BH=()=>{var e=FH(),t=Me(_i),r=Me(jP);return Af(!e||!r?void 0:OS(OS({},e),{},{scale:r}),t)};function _S(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function fs(e){for(var t=1;t{var a=t.find(o=>o&&o.index===r);if(a){if(e==="horizontal")return{x:a.coordinate,y:n.relativeY};if(e==="vertical")return{x:n.relativeX,y:a.coordinate}}return{x:0,y:0}},GH=(e,t,r,n)=>{var a=t.find(h=>h&&h.index===r);if(a){if(e==="centric"){var o=a.coordinate,c=n.radius;return fs(fs(fs({},n),Qt(n.cx,n.cy,c,o)),{},{angle:o,radius:c})}var u=a.coordinate,f=n.angle;return fs(fs(fs({},n),Qt(n.cx,n.cy,u,f)),{},{angle:f,radius:u})}return{angle:0,clockWise:!1,cx:0,cy:0,endAngle:0,innerRadius:0,outerRadius:0,radius:0,startAngle:0,x:0,y:0}};function VH(e,t){var r=e.relativeX,n=e.relativeY;return r>=t.left&&r<=t.left+t.width&&n>=t.top&&n<=t.top+t.height}var AP=(e,t,r,n,a)=>{var o,c=(o=t==null?void 0:t.length)!==null&&o!==void 0?o:0;if(c<=1||e==null)return 0;if(n==="angleAxis"&&a!=null&&Math.abs(Math.abs(a[1]-a[0])-360)<=1e-6)for(var u=0;u0?(f=r[u-1])===null||f===void 0?void 0:f.coordinate:(h=r[c-1])===null||h===void 0?void 0:h.coordinate,j=(m=r[u])===null||m===void 0?void 0:m.coordinate,k=u>=c-1?(g=r[0])===null||g===void 0?void 0:g.coordinate:(v=r[u+1])===null||v===void 0?void 0:v.coordinate,S=void 0;if(!(b==null||j==null||k==null))if(Jr(j-b)!==Jr(k-j)){var N=[];if(Jr(k-j)===Jr(a[1]-a[0])){S=k;var E=j+a[1]-a[0];N[0]=Math.min(E,(E+b)/2),N[1]=Math.max(E,(E+b)/2)}else{S=b;var A=k+a[1]-a[0];N[0]=Math.min(j,(A+j)/2),N[1]=Math.max(j,(A+j)/2)}var P=[Math.min(j,(S+j)/2),Math.max(j,(S+j)/2)];if(e>P[0]&&e<=P[1]||e>=N[0]&&e<=N[1]){var _;return(_=r[u])===null||_===void 0?void 0:_.index}}else{var O=Math.min(b,k),D=Math.max(b,k);if(e>(O+j)/2&&e<=(D+j)/2){var U;return(U=r[u])===null||U===void 0?void 0:U.index}}}else if(t)for(var B=0;B(F.coordinate+H.coordinate)/2||B>0&&B(F.coordinate+H.coordinate)/2&&e<=(F.coordinate+Y.coordinate)/2)return F.index}}return-1},CP=()=>Me(r0),q0=(e,t)=>t,PP=(e,t,r)=>r,Q0=(e,t,r,n)=>n,qH=q(_i,e=>wh(e,t=>t.coordinate)),Y0=q([fl,q0,PP,Q0],hP),X0=q([Y0,No,Zs,Js],xu),QH=(e,t,r)=>{if(t!=null){var n=fl(e);return t==="axis"?r==="hover"?n.axisInteraction.hover.dataKey:n.axisInteraction.click.dataKey:r==="hover"?n.itemInteraction.hover.dataKey:n.itemInteraction.click.dataKey}},OP=q([fl,q0,PP,Q0],pP),Zf=q([Ei,Ai,ft,Zt,_i,Q0,OP],mP),YH=q([Y0,Zf],(e,t)=>{var r;return(r=e.coordinate)!==null&&r!==void 0?r:t}),_P=q([_i,X0],uP),XH=q([OP,X0,Nn,Zs,_P,gP,q0],vP),ZH=q([Y0,X0],(e,t)=>({isActive:e.active&&t!=null,activeIndex:t})),JH=(e,t,r,n,a,o,c)=>{if(!(!e||!r||!n||!a)&&VH(e,c)){var u=fz(e,t),f=AP(u,o,a,r,n),h=KH(t,a,f,e);return{activeIndex:String(f),activeCoordinate:h}}},eW=(e,t,r,n,a,o,c)=>{if(!(!e||!n||!a||!o||!r)){var u=pF(e,r);if(u){var f=hz(u,t),h=AP(f,c,o,n,a),m=GH(t,o,h,u);return{activeIndex:String(h),activeCoordinate:m}}}},tW=(e,t,r,n,a,o,c,u)=>{if(!(!e||!t||!n||!a||!o))return t==="horizontal"||t==="vertical"?JH(e,t,n,a,o,c,u):eW(e,t,r,n,a,o,c)},rW=q(e=>e.zIndex.zIndexMap,(e,t)=>t,(e,t,r)=>r,(e,t,r)=>{if(t!=null){var n=e[t];if(n!=null)return r?n.panoramaElement:n.element}}),nW=q(e=>e.zIndex.zIndexMap,e=>{var t=Object.keys(e).map(n=>parseInt(n,10)).concat(Object.values(pr)),r=Array.from(new Set(t));return r.sort((n,a)=>n-a)},{memoizeOptions:{resultEqualityCheck:GF}});function MS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function IS(e){for(var t=1;tIS(IS({},e),{},{[t]:{element:void 0,panoramaElement:void 0,consumers:0}}),sW)},uW=new Set(Object.values(pr));function cW(e){return uW.has(e)}var MP=lr({name:"zIndex",initialState:lW,reducers:{registerZIndexPortal:{reducer:(e,t)=>{var r=t.payload.zIndex;e.zIndexMap[r]?e.zIndexMap[r].consumers+=1:e.zIndexMap[r]={consumers:1,element:void 0,panoramaElement:void 0}},prepare:st()},unregisterZIndexPortal:{reducer:(e,t)=>{var r=t.payload.zIndex;e.zIndexMap[r]&&(e.zIndexMap[r].consumers-=1,e.zIndexMap[r].consumers<=0&&!cW(r)&&delete e.zIndexMap[r])},prepare:st()},registerZIndexPortalElement:{reducer:(e,t)=>{var r=t.payload,n=r.zIndex,a=r.element,o=r.isPanorama;e.zIndexMap[n]?o?e.zIndexMap[n].panoramaElement=a:e.zIndexMap[n].element=a:e.zIndexMap[n]={consumers:0,element:o?void 0:a,panoramaElement:o?a:void 0}},prepare:st()},unregisterZIndexPortalElement:{reducer:(e,t)=>{var r=t.payload.zIndex;e.zIndexMap[r]&&(t.payload.isPanorama?e.zIndexMap[r].panoramaElement=void 0:e.zIndexMap[r].element=void 0)},prepare:st()}}}),im=MP.actions,dW=im.registerZIndexPortal,Dg=im.unregisterZIndexPortal,fW=im.registerZIndexPortalElement,hW=im.unregisterZIndexPortalElement,mW=MP.reducer;function Mi(e){var t=e.zIndex,r=e.children,n=Xz(),a=n&&t!==void 0&&t!==0,o=Pr(),c=y.useRef(void 0),u=y.useRef(new Set),f=Nt(),h=Me(g=>rW(g,t,o));if(y.useLayoutEffect(()=>{if(!a){var g=u.current;g.forEach(b=>{f(Dg({zIndex:b}))}),g.clear(),c.current=void 0;return}if(u.current.has(t)||(f(dW({zIndex:t})),u.current.add(t)),h){c.current=h;var v=u.current;v.forEach(b=>{b!==t&&(f(Dg({zIndex:b})),v.delete(b))})}},[f,t,a,h]),y.useLayoutEffect(()=>{var g=u.current;return()=>{g.forEach(v=>{f(Dg({zIndex:v}))}),g.clear()}},[f]),!a)return r;var m=h??c.current;return m?fh.createPortal(r,m):null}function ay(){return ay=Object.assign?Object.assign.bind():function(e){for(var t=1;ty.useContext(IP),Rg={exports:{}},DS;function kW(){return DS||(DS=1,(function(e){var t=Object.prototype.hasOwnProperty,r="~";function n(){}Object.create&&(n.prototype=Object.create(null),new n().__proto__||(r=!1));function a(f,h,m){this.fn=f,this.context=h,this.once=m||!1}function o(f,h,m,g,v){if(typeof m!="function")throw new TypeError("The listener must be a function");var b=new a(m,g||f,v),j=r?r+h:h;return f._events[j]?f._events[j].fn?f._events[j]=[f._events[j],b]:f._events[j].push(b):(f._events[j]=b,f._eventsCount++),f}function c(f,h){--f._eventsCount===0?f._events=new n:delete f._events[h]}function u(){this._events=new n,this._eventsCount=0}u.prototype.eventNames=function(){var h=[],m,g;if(this._eventsCount===0)return h;for(g in m=this._events)t.call(m,g)&&h.push(r?g.slice(1):g);return Object.getOwnPropertySymbols?h.concat(Object.getOwnPropertySymbols(m)):h},u.prototype.listeners=function(h){var m=r?r+h:h,g=this._events[m];if(!g)return[];if(g.fn)return[g.fn];for(var v=0,b=g.length,j=new Array(b);v{if(t&&Array.isArray(e)){var r=Number.parseInt(t,10);if(!Kn(r))return e[r]}},EW={chartName:"",tooltipPayloadSearcher:()=>{},eventEmitter:void 0,defaultTooltipEventType:"axis"},TP=lr({name:"options",initialState:EW,reducers:{createEventEmitter:e=>{e.eventEmitter==null&&(e.eventEmitter=Symbol("rechartsEventEmitter"))}}}),AW=TP.reducer,CW=TP.actions.createEventEmitter;function PW(e){return e.tooltip.syncInteraction}var OW={chartData:void 0,computedData:void 0,dataStartIndex:0,dataEndIndex:0},DP=lr({name:"chartData",initialState:OW,reducers:{setChartData(e,t){if(e.chartData=t.payload,t.payload==null){e.dataStartIndex=0,e.dataEndIndex=0;return}t.payload.length>0&&e.dataEndIndex!==t.payload.length-1&&(e.dataEndIndex=t.payload.length-1)},setComputedData(e,t){e.computedData=t.payload},setDataStartEndIndexes(e,t){var r=t.payload,n=r.startIndex,a=r.endIndex;n!=null&&(e.dataStartIndex=n),a!=null&&(e.dataEndIndex=a)}}}),Z0=DP.actions,LS=Z0.setChartData,_W=Z0.setDataStartEndIndexes;Z0.setComputedData;var MW=DP.reducer,IW=["x","y"];function $S(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function hs(e){for(var t=1;tf.rootProps.className);y.useEffect(()=>{if(e==null)return nl;var f=(h,m,g)=>{if(t!==g&&e===h){if(m.payload.active===!1){r(gu({active:!1,coordinate:void 0,dataKey:void 0,index:null,label:void 0,sourceViewBox:void 0,graphicalItemId:void 0}));return}if(n==="index"){var v;if(c&&m!==null&&m!==void 0&&(v=m.payload)!==null&&v!==void 0&&v.coordinate&&m.payload.sourceViewBox){var b=m.payload.coordinate,j=b.x,k=b.y,S=LW(b,IW),N=m.payload.sourceViewBox,E=N.x,A=N.y,P=N.width,_=N.height,O=hs(hs({},S),{},{x:c.x+(P?(j-E)/P:0)*c.width,y:c.y+(_?(k-A)/_:0)*c.height});r(hs(hs({},m),{},{payload:hs(hs({},m.payload),{},{coordinate:O})}))}else r(m);return}if(a!=null){var D;if(typeof n=="function"){var U={activeTooltipIndex:m.payload.index==null?void 0:Number(m.payload.index),isTooltipActive:m.payload.active,activeIndex:m.payload.index==null?void 0:Number(m.payload.index),activeLabel:m.payload.label,activeDataKey:m.payload.dataKey,activeCoordinate:m.payload.coordinate},B=n(a,U);D=a[B]}else n==="value"&&(D=a.find(se=>String(se.value)===m.payload.label));var F=m.payload.coordinate;if(F==null||c==null){r(gu({active:!1,coordinate:void 0,dataKey:void 0,index:null,label:void 0,sourceViewBox:void 0,graphicalItemId:void 0}));return}if(D==null){r(gu({active:!1,coordinate:void 0,dataKey:void 0,index:null,label:void 0,sourceViewBox:m.payload.sourceViewBox,graphicalItemId:void 0}));return}var Y=F.x,H=F.y,pe=Math.min(Y,c.x+c.width),ue=Math.min(H,c.y+c.height),he={x:o==="horizontal"?D.coordinate:pe,y:o==="horizontal"?ue:D.coordinate},ae=gu({active:m.payload.active,coordinate:he,dataKey:m.payload.dataKey,index:String(D.index),label:m.payload.label,sourceViewBox:m.payload.sourceViewBox,graphicalItemId:m.payload.graphicalItemId});r(ae)}}};return Bu.on(oy,f),()=>{Bu.off(oy,f)}},[u,r,t,e,n,a,o,c])}function FW(){var e=Me(n0),t=Me(i0),r=Nt();y.useEffect(()=>{if(e==null)return nl;var n=(a,o,c)=>{t!==c&&e===a&&r(_W(o))};return Bu.on(RS,n),()=>{Bu.off(RS,n)}},[r,t,e])}function BW(){var e=Nt();y.useEffect(()=>{e(CW())},[e]),zW(),FW()}function UW(e,t,r,n,a,o){var c=Me(j=>QH(j,e,t)),u=Me(_H),f=Me(i0),h=Me(n0),m=Me(OA),g=Me(PW),v=(g==null?void 0:g.sourceViewBox)!=null,b=Rh();y.useEffect(()=>{if(!v&&h!=null&&f!=null){var j=gu({active:o,coordinate:r,dataKey:c,index:a,label:typeof n=="number"?String(n):n,sourceViewBox:b,graphicalItemId:u});Bu.emit(oy,h,j,f)}},[v,r,c,u,a,n,f,h,m,o,b])}function zS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function FS(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);r{D(zU({shared:E,trigger:A,axisId:O,active:a,defaultIndex:U}))},[D,E,A,O,a,U]);var B=Rh(),F=uA(),Y=IU(E),H=(t=Me(_e=>ZH(_e,Y,A,U)))!==null&&t!==void 0?t:{},pe=H.activeIndex,ue=H.isActive,he=Me(_e=>XH(_e,Y,A,U)),ae=Me(_e=>_P(_e,Y,A,U)),se=Me(_e=>YH(_e,Y,A,U)),X=he,te=wW(),J=(r=a??ue)!==null&&r!==void 0?r:!1,I=ZL([X,J]),M=GW(I,2),K=M[0],ne=M[1],Z=Y==="axis"?ae:void 0;UW(Y,A,se,Z,pe,J);var me=_??te;if(me==null||B==null||Y==null)return null;var ge=X??US;J||(ge=US),h&&ge.length&&(ge=wL(ge.filter(_e=>_e.value!=null&&(_e.hide!==!0||n.includeHidden)),v,XW));var Pe=ge.length>0,re=FS(FS({},n),{},{payload:ge,label:Z,active:J,activeIndex:pe,coordinate:se,accessibilityLayer:F}),xe=y.createElement(u8,{allowEscapeViewBox:o,animationDuration:c,animationEasing:u,isAnimationActive:m,active:J,coordinate:se,hasPayload:Pe,offset:g,position:b,reverseDirection:j,useTranslate3d:k,viewBox:B,wrapperStyle:S,lastBoundingBox:K,innerRef:ne,hasPortalFromProps:!!_},ZW(f,re));return y.createElement(y.Fragment,null,fh.createPortal(xe,me),J&&y.createElement(bW,{cursor:N,tooltipEventType:Y,coordinate:se,payload:ge,index:pe}))}function tK(e,t,r){return(t=rK(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function rK(e){var t=nK(e,"string");return typeof t=="symbol"?t:t+""}function nK(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}class iK{constructor(t){tK(this,"cache",new Map),this.maxSize=t}get(t){var r=this.cache.get(t);return r!==void 0&&(this.cache.delete(t),this.cache.set(t,r)),r}set(t,r){if(this.cache.has(t))this.cache.delete(t);else if(this.cache.size>=this.maxSize){var n=this.cache.keys().next().value;n!=null&&this.cache.delete(n)}this.cache.set(t,r)}clear(){this.cache.clear()}size(){return this.cache.size}}function HS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function aK(e){for(var t=1;t{try{var r=document.getElementById(KS);r||(r=document.createElement("span"),r.setAttribute("id",KS),r.setAttribute("aria-hidden","true"),document.body.appendChild(r)),Object.assign(r.style,cK,t),r.textContent="".concat(e);var n=r.getBoundingClientRect();return{width:n.width,height:n.height}}catch{return{width:0,height:0}}},bu=function(t){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(t==null||nc.isSsr)return{width:0,height:0};if(!RP.enableCache)return GS(t,r);var n=dK(t,r),a=WS.get(n);if(a)return a;var o=GS(t,r);return WS.set(n,o),o},LP;function Jf(e,t){return pK(e)||mK(e,t)||hK(e,t)||fK()}function fK(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function hK(e,t){if(e){if(typeof e=="string")return VS(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?VS(e,t):void 0}}function VS(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);re.length)&&(t=e.length);for(var r=0,n=Array(t);r{var t=e.children,r=e.breakAll,n=e.style;try{var a=[];Yt(t)||(r?a=t.toString().split(""):a=t.toString().split(zP));var o=a.map(u=>({word:u,width:bu(u,n).width})),c=r?0:bu(" ",n).width;return{wordsWithComputedWidth:o,spaceWidth:c}}catch{return null}};function BP(e){return e==="start"||e==="middle"||e==="end"||e==="inherit"}function DK(e){return Yt(e)||typeof e=="string"||typeof e=="number"||typeof e=="boolean"}var UP=(e,t,r,n)=>e.reduce((a,o)=>{var c=o.word,u=o.width,f=a[a.length-1];if(f&&u!=null&&(t==null||n||f.width+u+re.reduce((t,r)=>t.width>r.width?t:r),RK="…",e2=(e,t,r,n,a,o,c,u)=>{var f=e.slice(0,t),h=FP({breakAll:r,style:n,children:f+RK});if(!h)return[!1,[]];var m=UP(h.wordsWithComputedWidth,o,c,u),g=m.length>a||HP(m).width>Number(o);return[g,m]},LK=(e,t,r,n,a)=>{var o=e.maxLines,c=e.children,u=e.style,f=e.breakAll,h=Ee(o),m=String(c),g=UP(t,n,r,a);if(!h||a)return g;var v=g.length>o||HP(g).width>Number(n);if(!v)return g;for(var b=0,j=m.length-1,k=0,S;b<=j&&k<=m.length-1;){var N=Math.floor((b+j)/2),E=N-1,A=e2(m,E,f,u,o,n,r,a),P=ZS(A,2),_=P[0],O=P[1],D=e2(m,N,f,u,o,n,r,a),U=ZS(D,1),B=U[0];if(!_&&!B&&(b=N+1),_&&B&&(j=N-1),!_&&B){S=O;break}k++}return S||g},t2=e=>{var t=Yt(e)?[]:e.toString().split(zP);return[{words:t,width:void 0}]},$K=e=>{var t=e.width,r=e.scaleToFit,n=e.children,a=e.style,o=e.breakAll,c=e.maxLines;if((t||r)&&!nc.isSsr){var u,f,h=FP({breakAll:o,children:n,style:a});if(h){var m=h.wordsWithComputedWidth,g=h.spaceWidth;u=m,f=g}else return t2(n);return LK({breakAll:o,children:n,maxLines:c,style:a},u,f,t,!!r)}return t2(n)},WP="#808080",zK={angle:0,breakAll:!1,capHeight:"0.71em",fill:WP,lineHeight:"1em",scaleToFit:!1,textAnchor:"start",verticalAnchor:"end",x:0,y:0},J0=y.forwardRef((e,t)=>{var r=on(e,zK),n=r.x,a=r.y,o=r.lineHeight,c=r.capHeight,u=r.fill,f=r.scaleToFit,h=r.textAnchor,m=r.verticalAnchor,g=XS(r,CK),v=y.useMemo(()=>$K({breakAll:g.breakAll,children:g.children,maxLines:g.maxLines,scaleToFit:f,style:g.style,width:g.width}),[g.breakAll,g.children,g.maxLines,f,g.style,g.width]),b=g.dx,j=g.dy,k=g.angle,S=g.className,N=g.breakAll,E=XS(g,PK);if(!Gn(n)||!Gn(a)||v.length===0)return null;var A=Number(n)+(Ee(b)?b:0),P=Number(a)+(Ee(j)?j:0);if(!We(A)||!We(P))return null;var _;switch(m){case"start":_=Lg("calc(".concat(c,")"));break;case"middle":_=Lg("calc(".concat((v.length-1)/2," * -").concat(o," + (").concat(c," / 2))"));break;default:_=Lg("calc(".concat(v.length-1," * -").concat(o,")"));break}var O=[],D=v[0];if(f&&D!=null){var U=D.width,B=g.width;O.push("scale(".concat(Ee(B)&&Ee(U)?B/U:1,")"))}return k&&O.push("rotate(".concat(k,", ").concat(A,", ").concat(P,")")),O.length&&(E.transform=O.join(" ")),y.createElement("text",sy({},rn(E),{ref:t,x:A,y:P,className:nt("recharts-text",S),textAnchor:h,fill:u.includes("url")?WP:u}),v.map((F,Y)=>{var H=F.words.join(N?"":" ");return y.createElement("tspan",{x:A,dy:Y===0?_:o,key:"".concat(H,"-").concat(Y)},H)}))});J0.displayName="Text";function r2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function Tn(e){for(var t=1;t{var t=e.viewBox,r=e.position,n=e.offset,a=n===void 0?0:n,o=e.parentViewBox,c=Vy(t),u=c.x,f=c.y,h=c.height,m=c.upperWidth,g=c.lowerWidth,v=u,b=u+(m-g)/2,j=(v+b)/2,k=(m+g)/2,S=v+m/2,N=h>=0?1:-1,E=N*a,A=N>0?"end":"start",P=N>0?"start":"end",_=m>=0?1:-1,O=_*a,D=_>0?"end":"start",U=_>0?"start":"end",B=o;if(r==="top"){var F={x:v+m/2,y:f-E,horizontalAnchor:"middle",verticalAnchor:A};return B&&(F.height=Math.max(f-B.y,0),F.width=m),F}if(r==="bottom"){var Y={x:b+g/2,y:f+h+E,horizontalAnchor:"middle",verticalAnchor:P};return B&&(Y.height=Math.max(B.y+B.height-(f+h),0),Y.width=g),Y}if(r==="left"){var H={x:j-O,y:f+h/2,horizontalAnchor:D,verticalAnchor:"middle"};return B&&(H.width=Math.max(H.x-B.x,0),H.height=h),H}if(r==="right"){var pe={x:j+k+O,y:f+h/2,horizontalAnchor:U,verticalAnchor:"middle"};return B&&(pe.width=Math.max(B.x+B.width-pe.x,0),pe.height=h),pe}var ue=B?{width:k,height:h}:{};return r==="insideLeft"?Tn({x:j+O,y:f+h/2,horizontalAnchor:U,verticalAnchor:"middle"},ue):r==="insideRight"?Tn({x:j+k-O,y:f+h/2,horizontalAnchor:D,verticalAnchor:"middle"},ue):r==="insideTop"?Tn({x:v+m/2,y:f+E,horizontalAnchor:"middle",verticalAnchor:P},ue):r==="insideBottom"?Tn({x:b+g/2,y:f+h-E,horizontalAnchor:"middle",verticalAnchor:A},ue):r==="insideTopLeft"?Tn({x:v+O,y:f+E,horizontalAnchor:U,verticalAnchor:P},ue):r==="insideTopRight"?Tn({x:v+m-O,y:f+E,horizontalAnchor:D,verticalAnchor:P},ue):r==="insideBottomLeft"?Tn({x:b+O,y:f+h-E,horizontalAnchor:U,verticalAnchor:A},ue):r==="insideBottomRight"?Tn({x:b+g-O,y:f+h-E,horizontalAnchor:D,verticalAnchor:A},ue):r&&typeof r=="object"&&(Ee(r.x)||bo(r.x))&&(Ee(r.y)||bo(r.y))?Tn({x:u+Sa(r.x,k),y:f+Sa(r.y,h),horizontalAnchor:"end",verticalAnchor:"end"},ue):Tn({x:S,y:f+h/2,horizontalAnchor:"middle",verticalAnchor:"middle"},ue)},WK=["labelRef"],KK=["content"];function n2(e,t){if(e==null)return{};var r,n,a=GK(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n{var t=e.x,r=e.y,n=e.upperWidth,a=e.lowerWidth,o=e.width,c=e.height,u=e.children,f=y.useMemo(()=>({x:t,y:r,upperWidth:n,lowerWidth:a,width:o,height:c}),[t,r,n,a,o,c]);return y.createElement(KP.Provider,{value:f},u)},GP=()=>{var e=y.useContext(KP),t=Rh();return e||(t?Vy(t):void 0)},XK=y.createContext(null),ZK=()=>{var e=y.useContext(XK),t=Me(DA);return e||t},JK=e=>{var t=e.value,r=e.formatter,n=Yt(e.children)?t:e.children;return typeof r=="function"?r(n):n},ex=e=>e!=null&&typeof e=="function",eG=(e,t)=>{var r=Jr(t-e),n=Math.min(Math.abs(t-e),360);return r*n},tG=(e,t,r,n,a)=>{var o=e.offset,c=e.className,u=a.cx,f=a.cy,h=a.innerRadius,m=a.outerRadius,g=a.startAngle,v=a.endAngle,b=a.clockWise,j=(h+m)/2,k=eG(g,v),S=k>=0?1:-1,N,E;switch(t){case"insideStart":N=g+S*o,E=b;break;case"insideEnd":N=v-S*o,E=!b;break;case"end":N=v+S*o,E=b;break;default:throw new Error("Unsupported position ".concat(t))}E=k<=0?E:!E;var A=Qt(u,f,j,N),P=Qt(u,f,j,N+(E?1:-1)*359),_="M".concat(A.x,",").concat(A.y,` - A`).concat(j,",").concat(j,",0,1,").concat(E?0:1,`, - `).concat(P.x,",").concat(P.y),O=Yt(e.id)?Au("recharts-radial-line-"):e.id;return y.createElement("text",hi({},n,{dominantBaseline:"central",className:nt("recharts-radial-bar-label",c)}),y.createElement("defs",null,y.createElement("path",{id:O,d:_})),y.createElement("textPath",{xlinkHref:"#".concat(O)},r))},rG=(e,t,r)=>{var n=e.cx,a=e.cy,o=e.innerRadius,c=e.outerRadius,u=e.startAngle,f=e.endAngle,h=(u+f)/2;if(r==="outside"){var m=Qt(n,a,c+t,h),g=m.x,v=m.y;return{x:g,y:v,textAnchor:g>=n?"start":"end",verticalAnchor:"middle"}}if(r==="center")return{x:n,y:a,textAnchor:"middle",verticalAnchor:"middle"};if(r==="centerTop")return{x:n,y:a,textAnchor:"middle",verticalAnchor:"start"};if(r==="centerBottom")return{x:n,y:a,textAnchor:"middle",verticalAnchor:"end"};var b=(o+c)/2,j=Qt(n,a,b,h),k=j.x,S=j.y;return{x:k,y:S,textAnchor:"middle",verticalAnchor:"middle"}},nf=e=>e!=null&&"cx"in e&&Ee(e.cx),nG={angle:0,offset:5,zIndex:pr.label,position:"middle",textBreakAll:!1};function iG(e){if(!nf(e))return e;var t=e.cx,r=e.cy,n=e.outerRadius,a=n*2;return{x:t-n,y:r-n,width:a,upperWidth:a,lowerWidth:a,height:a}}function sa(e){var t=on(e,nG),r=t.viewBox,n=t.parentViewBox,a=t.position,o=t.value,c=t.children,u=t.content,f=t.className,h=f===void 0?"":f,m=t.textBreakAll,g=t.labelRef,v=ZK(),b=GP(),j=a==="center"?b:v??b,k,S,N;r==null?k=j:nf(r)?k=r:k=Vy(r);var E=iG(k);if(!k||Yt(o)&&Yt(c)&&!y.isValidElement(u)&&typeof u!="function")return null;var A=vu(vu({},t),{},{viewBox:k});if(y.isValidElement(u)){A.labelRef;var P=n2(A,WK);return y.cloneElement(u,P)}if(typeof u=="function"){A.content;var _=n2(A,KK);if(S=y.createElement(u,_),y.isValidElement(S))return S}else S=JK(t);var O=rn(t);if(nf(k)){if(a==="insideStart"||a==="insideEnd"||a==="end")return tG(t,a,S,O,k);N=rG(k,t.offset,t.position)}else{if(!E)return null;var D=HK({viewBox:E,position:a,offset:t.offset,parentViewBox:nf(n)?void 0:n});N=vu(vu({x:D.x,y:D.y,textAnchor:D.horizontalAnchor,verticalAnchor:D.verticalAnchor},D.width!==void 0?{width:D.width}:{}),D.height!==void 0?{height:D.height}:{})}return y.createElement(Mi,{zIndex:t.zIndex},y.createElement(J0,hi({ref:g,className:nt("recharts-label",h)},O,N,{textAnchor:BP(O.textAnchor)?O.textAnchor:N.textAnchor,breakAll:m}),S))}sa.displayName="Label";var aG=(e,t,r)=>{if(!e)return null;var n={viewBox:t,labelRef:r};return e===!0?y.createElement(sa,hi({key:"label-implicit"},n)):Gn(e)?y.createElement(sa,hi({key:"label-implicit",value:e},n)):y.isValidElement(e)?e.type===sa?y.cloneElement(e,vu({key:"label-implicit"},n)):y.createElement(sa,hi({key:"label-implicit",content:e},n)):ex(e)?y.createElement(sa,hi({key:"label-implicit",content:e},n)):e&&typeof e=="object"?y.createElement(sa,hi({},e,{key:"label-implicit"},n)):null};function oG(e){var t=e.label,r=e.labelRef,n=GP();return aG(t,n,r)||null}var sG=["valueAccessor"],lG=["dataKey","clockWise","id","textBreakAll","zIndex"];function eh(){return eh=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var t=Array.isArray(e.value)?e.value[e.value.length-1]:e.value;if(DK(t))return t},VP=y.createContext(void 0),dG=VP.Provider,qP=y.createContext(void 0);qP.Provider;function fG(){return y.useContext(VP)}function hG(){return y.useContext(qP)}function af(e){var t=e.valueAccessor,r=t===void 0?cG:t,n=a2(e,sG),a=n.dataKey;n.clockWise;var o=n.id,c=n.textBreakAll,u=n.zIndex,f=a2(n,lG),h=fG(),m=hG(),g=h||m;return!g||!g.length?null:y.createElement(Mi,{zIndex:u??pr.label},y.createElement(nn,{className:"recharts-label-list"},g.map((v,b)=>{var j,k=Yt(a)?r(v,b):Lt(v.payload,a),S=Yt(o)?{}:{id:"".concat(o,"-").concat(b)};return y.createElement(sa,eh({key:"label-".concat(b)},rn(v),f,S,{fill:(j=n.fill)!==null&&j!==void 0?j:v.fill,parentViewBox:v.parentViewBox,value:k,textBreakAll:c,viewBox:v.viewBox,index:b,zIndex:0}))})))}af.displayName="LabelList";function mG(e){var t=e.label;return t?t===!0?y.createElement(af,{key:"labelList-implicit"}):y.isValidElement(t)||ex(t)?y.createElement(af,{key:"labelList-implicit",content:t}):typeof t=="object"?y.createElement(af,eh({key:"labelList-implicit"},t,{type:String(t.type)})):null:null}function ly(){return ly=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var t=e.cx,r=e.cy,n=e.r,a=e.className,o=nt("recharts-dot",a);return Ee(t)&&Ee(r)&&Ee(n)?y.createElement("circle",ly({},kn(e),Ly(e),{className:o,cx:t,cy:r,r:n})):null},pG={radiusAxis:{},angleAxis:{}},YP=lr({name:"polarAxis",initialState:pG,reducers:{addRadiusAxis(e,t){e.radiusAxis[t.payload.id]=t.payload},removeRadiusAxis(e,t){delete e.radiusAxis[t.payload.id]},addAngleAxis(e,t){e.angleAxis[t.payload.id]=t.payload},removeAngleAxis(e,t){delete e.angleAxis[t.payload.id]}}}),am=YP.actions;am.addRadiusAxis;am.removeRadiusAxis;am.addAngleAxis;am.removeAngleAxis;var gG=YP.reducer;function vG(e){return e&&typeof e=="object"&&"className"in e&&typeof e.className=="string"?e.className:""}var XP=e=>e&&typeof e=="object"&&"clipDot"in e?!!e.clipDot:!0;function o2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function s2(e){for(var t=1;t{n||(a.current===null?r(RU(t)):a.current!==t&&r(LU({prev:a.current,next:t})),a.current=t)},[t,r,n]),y.useLayoutEffect(()=>()=>{a.current&&(r($U(a.current)),a.current=null)},[r]),null}function AG(e){var t=e.legendPayload,r=Nt(),n=Pr(),a=y.useRef(null);return y.useLayoutEffect(()=>{n||(a.current===null?r(c6(t)):a.current!==t&&r(d6({prev:a.current,next:t})),a.current=t)},[r,n,t]),y.useLayoutEffect(()=>()=>{a.current&&(r(f6(a.current)),a.current=null)},[r]),null}function CG(e,t){return MG(e)||_G(e,t)||OG(e,t)||PG()}function PG(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function OG(e,t){if(e){if(typeof e=="string")return l2(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?l2(e,t):void 0}}function l2(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r2&&arguments[2]!==void 0?arguments[2]:[],n=[];for(var a of r)n.push({status:"removed",prev:a});for(var o=0;oe[Math.floor(o*r)]);return rx(n,t)}function DG(e,t){var r=t.map((n,a)=>e[a]);return rx(r,t)}function RG(e,t){for(var r=new Map,n=0;n{var b=r(g,v);if(b!=null){var j=n.get(b);if(j!==void 0)return a.add(b),j}}),c=[];for(var u of n){var f=CG(u,2),h=f[0],m=f[1];a.has(h)||c.push(m)}return rx(o,t,c)}function uy(e,t,r){return t==null?null:e==null?t.map(n=>({status:"added",next:n})):r===tx?TG(e,t):r===IG?DG(e,t):LG(e,t,r)}function JP(e,t){var r=y.useRef(e),n=y.useRef(t.current),a=y.useRef(!0);r.current!==e&&(r.current=e,n.current=t.current,a.current=!1);var o=y.useCallback(function(c,u){var f=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;if(u===0){a.current=!0;return}u===1&&(n.current=c),u>0&&a.current&&f&&(t.current=c)},[t]);return{startValue:n.current,syncStepValue:o}}function $G(e,t){return UG(e)||BG(e,t)||FG(e,t)||zG()}function zG(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function FG(e,t){if(e){if(typeof e=="string")return u2(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?u2(e,t):void 0}}function u2(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{typeof e=="function"&&e(),o(!0)},[e]),u=y.useCallback(()=>{typeof t=="function"&&t(),o(!1)},[t]);return{isAnimating:a,handleAnimationStart:c,handleAnimationEnd:u}}function WG(e){var t,r=e.animationInput,n=e.animationIdPrefix,a=e.items,o=e.previousItemsRef,c=e.isAnimationActive,u=e.animationBegin,f=e.animationDuration,h=e.animationEasing,m=e.onAnimationStart,g=e.onAnimationEnd,v=e.animationInterpolateFn,b=e.animationMatchBy,j=e.shouldUpdatePreviousRef,k=e.children,S=e.layout,N=mA(r,n),E=JP(N,o),A=(t=E.startValue)!==null&&t!==void 0?t:null,P=uy(A,a,b??tx);return y.createElement(hA,{animationId:N,begin:u,duration:f,isActive:c,easing:h,onAnimationEnd:g,onAnimationStart:m,key:N},_=>{var O=A==null,D=a==null?a:v(P,_,S),U=j?j(_):_>0;return E.syncStepValue(D,_,U),D==null?null:k(D,_,O)})}var $g;function KG(e,t){return QG(e)||qG(e,t)||VG(e,t)||GG()}function GG(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function VG(e,t){if(e){if(typeof e=="string")return c2(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?c2(e,t):void 0}}function c2(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{var e=y.useState(()=>Au("uid-")),t=KG(e,1),r=t[0];return r},eO=($g=lh.useId)!==null&&$g!==void 0?$g:YG;function XG(e,t){var r=eO();return t||(e?"".concat(e,"-").concat(r):r)}var ZG=y.createContext(void 0),JG=e=>{var t=e.id,r=e.type,n=e.children,a=XG("recharts-".concat(r),t);return y.createElement(ZG.Provider,{value:a},n(a))},eV={cartesianItems:[],polarItems:[]},tO=lr({name:"graphicalItems",initialState:eV,reducers:{addCartesianGraphicalItem:{reducer(e,t){e.cartesianItems.push(t.payload)},prepare:st()},replaceCartesianGraphicalItem:{reducer(e,t){var r=t.payload,n=r.prev,a=r.next,o=en(e).cartesianItems.indexOf(n);o>-1&&(e.cartesianItems[o]=a)},prepare:st()},removeCartesianGraphicalItem:{reducer(e,t){var r=en(e).cartesianItems.indexOf(t.payload);r>-1&&e.cartesianItems.splice(r,1)},prepare:st()},addPolarGraphicalItem:{reducer(e,t){e.polarItems.push(t.payload)},prepare:st()},removePolarGraphicalItem:{reducer(e,t){var r=en(e).polarItems.indexOf(t.payload);r>-1&&e.polarItems.splice(r,1)},prepare:st()},replacePolarGraphicalItem:{reducer(e,t){var r=t.payload,n=r.prev,a=r.next,o=en(e).polarItems.indexOf(n);o>-1&&(e.polarItems[o]=a)},prepare:st()}}}),hl=tO.actions,tV=hl.addCartesianGraphicalItem,rV=hl.replaceCartesianGraphicalItem,nV=hl.removeCartesianGraphicalItem;hl.addPolarGraphicalItem;hl.removePolarGraphicalItem;hl.replacePolarGraphicalItem;var iV=tO.reducer,aV=e=>{var t=Nt(),r=y.useRef(null);return y.useLayoutEffect(()=>{r.current===null?t(tV(e)):r.current!==e&&t(rV({prev:r.current,next:e})),r.current=e},[t,e]),y.useLayoutEffect(()=>()=>{r.current&&(t(nV(r.current)),r.current=null)},[t]),null},oV=y.memo(aV),sV=["points"];function d2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function zg(e){for(var t=1;t{var N,E,A=zg(zg(zg({r:3},c),v),{},{index:S,cx:(N=k.x)!==null&&N!==void 0?N:void 0,cy:(E=k.y)!==null&&E!==void 0?E:void 0,dataKey:o,value:k.value,payload:k.payload,points:t});return y.createElement(hV,{key:"dot-".concat(S),option:r,dotProps:A,className:a})}),j={};return u&&f!=null&&(j.clipPath="url(#clipPath-".concat(g?"":"dots-").concat(f,")")),y.createElement(Mi,{zIndex:m},y.createElement(nn,th({className:n},j),b))}function f2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function h2(e){for(var t=1;t({top:e.top,bottom:e.bottom,left:e.left,right:e.right})),PV=q([CV,Ei,Ai],(e,t,r)=>{if(!(!e||t==null||r==null))return{x:e.left,y:e.top,width:Math.max(0,t-e.left-e.right),height:Math.max(0,r-e.top-e.bottom)}}),nx=()=>Me(PV),OV=()=>Me(RH);function m2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function Fg(e){for(var t=1;t{var t=e.point,r=e.childIndex,n=e.mainColor,a=e.activeDot,o=e.dataKey,c=e.clipPath;if(a===!1||t.x==null||t.y==null)return null;var u={index:r,dataKey:o,cx:t.x,cy:t.y,r:4,fill:n??"none",strokeWidth:2,stroke:"#fff",payload:t.payload,value:t.value},f=Fg(Fg(Fg({},u),yh(a)),Ly(a)),h;return y.isValidElement(a)?h=y.cloneElement(a,f):typeof a=="function"?h=a(f):h=y.createElement(QP,f),y.createElement(nn,{className:"recharts-active-dot",clipPath:c},h)};function p2(e){var t=e.points,r=e.mainColor,n=e.activeDot,a=e.itemDataKey,o=e.clipPath,c=e.zIndex,u=c===void 0?pr.activeDot:c,f=Me(Fu),h=OV();if(t==null||h==null)return null;var m=t.find(g=>h.includes(g.payload));return Yt(m)?null:y.createElement(Mi,{zIndex:u},y.createElement(TV,{point:m,childIndex:Number(f),mainColor:r,dataKey:a,activeDot:n,clipPath:o}))}var DV=e=>{var t=e.chartData,r=Nt(),n=Pr();return y.useEffect(()=>n?()=>{}:(r(LS(t)),()=>{r(LS(void 0))}),[t,r,n]),null},g2={x:0,y:0,width:0,height:0,padding:{top:0,right:0,bottom:0,left:0}},iO=lr({name:"brush",initialState:g2,reducers:{setBrushSettings(e,t){return t.payload==null?g2:t.payload}}});iO.actions.setBrushSettings;var RV=iO.reducer;function LV(e){return(e%180+180)%180}var $V=function(t){var r=t.width,n=t.height,a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,o=LV(a),c=o*Math.PI/180,u=Math.atan(n/r),f=c>u&&c{e.dots.push(t.payload)},removeDot:(e,t)=>{var r=en(e).dots.findIndex(n=>n===t.payload);r!==-1&&e.dots.splice(r,1)},addArea:(e,t)=>{e.areas.push(t.payload)},removeArea:(e,t)=>{var r=en(e).areas.findIndex(n=>n===t.payload);r!==-1&&e.areas.splice(r,1)},addLine:(e,t)=>{e.lines.push(t.payload)},removeLine:(e,t)=>{var r=en(e).lines.findIndex(n=>n===t.payload);r!==-1&&e.lines.splice(r,1)}}}),ml=aO.actions;ml.addDot;ml.removeDot;ml.addArea;ml.removeArea;ml.addLine;ml.removeLine;var FV=aO.reducer;function BV(e,t){return KV(e)||WV(e,t)||HV(e,t)||UV()}function UV(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function HV(e,t){if(e){if(typeof e=="string")return v2(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?v2(e,t):void 0}}function v2(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{var t=e.children,r=y.useState("".concat(Au("recharts"),"-clip")),n=BV(r,1),a=n[0],o=nx();if(o==null)return null;var c=o.x,u=o.y,f=o.width,h=o.height;return y.createElement(GV.Provider,{value:a},y.createElement("defs",null,y.createElement("clipPath",{id:a},y.createElement("rect",{x:c,y:u,height:h,width:f}))),t)};function oO(e,t){if(t<1)return[];if(t===1)return e;for(var r=[],n=0;ne*a)return!1;var o=r();return e*(t-e*o/2-n)>=0&&e*(t+e*o/2-a)<=0}function YV(e,t){return oO(e,t+1)}function XV(e,t,r,n,a){for(var o=(n||[]).slice(),c=t.start,u=t.end,f=0,h=1,m=c,g=function(){var j=n==null?void 0:n[f];if(j===void 0)return{v:oO(n,h)};var k=f,S,N=()=>(S===void 0&&(S=r(j,k)),S),E=j.coordinate,A=f===0||Uu(e,E,N,m,u);A||(f=0,m=c,h+=1),A&&(m=E+e*(N()/2+a),f+=h)},v;h<=o.length;)if(v=g(),v)return v.v;return[]}function ZV(e,t,r,n,a){var o=(n||[]).slice(),c=o.length;if(c===0)return[];for(var u=t.start,f=t.end,h=1;h<=c;h++){for(var m=(c-1)%h,g=u,v=!0,b=function(){var P=n[k];if(P==null)return 0;var _=k,O,D=()=>(O===void 0&&(O=r(P,_)),O),U=P.coordinate,B=k===m||Uu(e,U,D,g,f);if(!B)return v=!1,1;B&&(g=U+e*(D()/2+a))},j,k=m;k(k===void 0&&(k=r(b,v)),k);if(v===c-1){var N=e*(j.coordinate+e*S()/2-f);o[v]=j=ar(ar({},j),{},{tickCoord:N>0?j.coordinate-N*e:j.coordinate})}else o[v]=j=ar(ar({},j),{},{tickCoord:j.coordinate});if(j.tickCoord!=null){var E=Uu(e,j.tickCoord,S,u,f);E&&(f=j.tickCoord-e*(S()/2+a),o[v]=ar(ar({},j),{},{isShow:!0}))}},m=c-1;m>=0;m--)h(m);return o}function nq(e,t,r,n,a,o){var c=(n||[]).slice(),u=c.length,f=t.start,h=t.end;if(o){var m=n[u-1];if(m!=null){var g=r(m,u-1),v=e*(m.coordinate+e*g/2-h);if(c[u-1]=m=ar(ar({},m),{},{tickCoord:v>0?m.coordinate-v*e:m.coordinate}),m.tickCoord!=null){var b=Uu(e,m.tickCoord,()=>g,f,h);b&&(h=m.tickCoord-e*(g/2+a),c[u-1]=ar(ar({},m),{},{isShow:!0}))}}}for(var j=o?u-1:u,k=function(E){var A=c[E];if(A==null)return 1;var P=A,_,O=()=>(_===void 0&&(_=r(A,E)),_);if(E===0){var D=e*(P.coordinate-e*O()/2-f);c[E]=P=ar(ar({},P),{},{tickCoord:D<0?P.coordinate-D*e:P.coordinate})}else c[E]=P=ar(ar({},P),{},{tickCoord:P.coordinate});if(P.tickCoord!=null){var U=Uu(e,P.tickCoord,O,f,h);U&&(f=P.tickCoord+e*(O()/2+a),c[E]=ar(ar({},P),{},{isShow:!0}))}},S=0;S{var D=typeof h=="function"?h(_.value,O):_.value;return j==="width"?qV(bu(D,{fontSize:t,letterSpacing:r}),k,g):bu(D,{fontSize:t,letterSpacing:r})[j]},N=a[0],E=a[1],A=a.length>=2&&N!=null&&E!=null?Jr(E.coordinate-N.coordinate):1,P=QV(o,A,j);return f==="equidistantPreserveStart"?XV(A,P,S,a,c):f==="equidistantPreserveEnd"?ZV(A,P,S,a,c):(f==="preserveStart"||f==="preserveStartEnd"?b=nq(A,P,S,a,c,f==="preserveStartEnd"):b=rq(A,P,S,a,c),b.filter(_=>_.isShow))}var iq=e=>{var t=e.ticks,r=e.label,n=e.labelGapWithTick,a=n,o=e.tickSize,c=o===void 0?0:o,u=e.tickMargin,f=u===void 0?0:u,h=0;if(t){Array.from(t).forEach(b=>{if(b){var j=b.getBoundingClientRect();j.width>h&&(h=j.width)}});var m=r?r.getBoundingClientRect().width:0,g=c+f,v=h+g+m+(r?a:0);return Math.round(v)}return 0},aq={xAxis:{},yAxis:{}},sO=lr({name:"renderedTicks",initialState:aq,reducers:{setRenderedTicks:(e,t)=>{var r=t.payload,n=r.axisType,a=r.axisId,o=r.ticks;e[n][a]=o},removeRenderedTicks:(e,t)=>{var r=t.payload,n=r.axisType,a=r.axisId;delete e[n][a]}}}),lO=sO.actions,oq=lO.setRenderedTicks,sq=lO.removeRenderedTicks,lq=sO.reducer,uq=["axisLine","width","height","className","hide","ticks","axisType","axisId"];function x2(e,t){return hq(e)||fq(e,t)||dq(e,t)||cq()}function cq(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function dq(e,t){if(e){if(typeof e=="string")return b2(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?b2(e,t):void 0}}function b2(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{if(n==null||r==null)return nl;var o=t.map(c=>({value:c.value,coordinate:c.coordinate,offset:c.offset,index:c.index}));return a(oq({ticks:o,axisId:n,axisType:r})),()=>{a(sq({axisId:n,axisType:r}))}},[a,t,n,r]),null}var Nq=y.forwardRef((e,t)=>{var r=e.ticks,n=r===void 0?[]:r,a=e.tick,o=e.tickLine,c=e.stroke,u=e.tickFormatter,f=e.unit,h=e.padding,m=e.tickTextProps,g=e.orientation,v=e.mirror,b=e.x,j=e.y,k=e.width,S=e.height,N=e.tickSize,E=e.tickMargin,A=e.fontSize,P=e.letterSpacing,_=e.getTicksConfig,O=e.events,D=e.axisType,U=e.axisId,B=ix(xt(xt({},_),{},{ticks:n}),A,P),F=kn(_),Y=yh(a),H=BP(F.textAnchor)?F.textAnchor:wq(g,v),pe=kq(g,v),ue={};typeof o=="object"&&(ue=o);var he=xt(xt({},F),{},{fill:"none"},ue),ae=B.map(te=>xt({entry:te},bq(te,b,j,k,S,g,N,v,E))),se=ae.map(te=>{var J=te.entry,I=te.line;return y.createElement(nn,{className:"recharts-cartesian-axis-tick",key:"tick-".concat(J.value,"-").concat(J.coordinate,"-").concat(J.tickCoord)},o&&y.createElement("line",Eo({},he,I,{className:nt("recharts-cartesian-axis-tick-line",Oo(o,"className"))})))}),X=ae.map((te,J)=>{var I,M,K=te.entry,ne=te.tick,Z=xt(xt(xt(xt({verticalAnchor:pe},F),{},{textAnchor:H,stroke:"none",fill:c},ne),{},{index:J,payload:K,visibleTicksCount:B.length,tickFormatter:u,padding:h},m),{},{angle:(I=(M=m==null?void 0:m.angle)!==null&&M!==void 0?M:F.angle)!==null&&I!==void 0?I:0}),me=xt(xt({},Z),Y);return y.createElement(nn,Eo({className:"recharts-cartesian-axis-tick-label",key:"tick-label-".concat(K.value,"-").concat(K.coordinate,"-").concat(K.tickCoord)},PR(O,K,J)),a&&y.createElement(jq,{option:a,tickProps:me,value:"".concat(typeof u=="function"?u(K.value,J):K.value).concat(f||"")}))});return y.createElement("g",{className:"recharts-cartesian-axis-ticks recharts-".concat(D,"-ticks")},y.createElement(Sq,{ticks:B,axisId:U,axisType:D}),X.length>0&&y.createElement(Mi,{zIndex:pr.label},y.createElement("g",{className:"recharts-cartesian-axis-tick-labels recharts-".concat(D,"-tick-labels"),ref:t},X)),se.length>0&&y.createElement("g",{className:"recharts-cartesian-axis-tick-lines recharts-".concat(D,"-tick-lines")},se))}),Eq=y.forwardRef((e,t)=>{var r=e.axisLine,n=e.width,a=e.height,o=e.className,c=e.hide,u=e.ticks,f=e.axisType,h=e.axisId,m=mq(e,uq),g=y.useState(""),v=x2(g,2),b=v[0],j=v[1],k=y.useState(""),S=x2(k,2),N=S[0],E=S[1],A=y.useRef(null);y.useImperativeHandle(t,()=>({getCalculatedWidth:()=>{var _;return iq({ticks:A.current,label:(_=e.labelRef)===null||_===void 0?void 0:_.current,labelGapWithTick:5,tickSize:e.tickSize,tickMargin:e.tickMargin})}}));var P=y.useCallback(_=>{if(_){var O=_.getElementsByClassName("recharts-cartesian-axis-tick-value");A.current=O;var D=O[0];if(D){var U=window.getComputedStyle(D),B=U.fontSize,F=U.letterSpacing;(B!==b||F!==N)&&(j(B),E(F))}}},[b,N]);return c||n!=null&&n<=0||a!=null&&a<=0?null:y.createElement(Mi,{zIndex:e.zIndex},y.createElement(nn,{className:nt("recharts-cartesian-axis",o)},y.createElement(xq,{x:e.x,y:e.y,width:n,height:a,orientation:e.orientation,mirror:e.mirror,axisLine:r,otherSvgProps:kn(e)}),y.createElement(Nq,{ref:P,axisType:f,events:m,fontSize:b,getTicksConfig:e,height:e.height,letterSpacing:N,mirror:e.mirror,orientation:e.orientation,padding:e.padding,stroke:e.stroke,tick:e.tick,tickFormatter:e.tickFormatter,tickLine:e.tickLine,tickMargin:e.tickMargin,tickSize:e.tickSize,tickTextProps:e.tickTextProps,ticks:u,unit:e.unit,width:e.width,x:e.x,y:e.y,axisId:h}),y.createElement(YK,{x:e.x,y:e.y,width:e.width,height:e.height,lowerWidth:e.width,upperWidth:e.width},y.createElement(oG,{label:e.label,labelRef:e.labelRef}),e.children)))}),ax=y.forwardRef((e,t)=>{var r=on(e,xi);return y.createElement(Eq,Eo({},r,{ref:t}))});ax.displayName="CartesianAxis";var Aq=["x1","y1","x2","y2","key"],Cq=["offset"],Pq=["xAxisId","yAxisId"],Oq=["xAxisId","yAxisId"];function k2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function or(e){for(var t=1;t{var t=e.fill;if(!t||t==="none")return null;var r=e.fillOpacity,n=e.x,a=e.y,o=e.width,c=e.height,u=e.ry;return y.createElement("rect",{x:n,y:a,ry:u,width:o,height:c,stroke:"none",fill:t,fillOpacity:r,className:"recharts-cartesian-grid-bg"})};function uO(e){var t=e.option,r=e.lineItemProps,n;if(y.isValidElement(t))n=y.cloneElement(t,r);else if(typeof t=="function")n=t(r);else{var a,o=r.x1,c=r.y1,u=r.x2,f=r.y2,h=r.key,m=rh(r,Aq),g=(a=kn(m))!==null&&a!==void 0?a:{};g.offset;var v=rh(g,Cq);n=y.createElement("line",no({},v,{x1:o,y1:c,x2:u,y2:f,fill:"none",key:h}))}return n}function Rq(e){var t=e.x,r=e.width,n=e.horizontal,a=n===void 0?!0:n,o=e.horizontalPoints;if(!a||!o||!o.length)return null;e.xAxisId,e.yAxisId;var c=rh(e,Pq),u=o.map((f,h)=>{var m=or(or({},c),{},{x1:t,y1:f,x2:t+r,y2:f,key:"line-".concat(h),index:h});return y.createElement(uO,{key:"line-".concat(h),option:a,lineItemProps:m})});return y.createElement("g",{className:"recharts-cartesian-grid-horizontal"},u)}function Lq(e){var t=e.y,r=e.height,n=e.vertical,a=n===void 0?!0:n,o=e.verticalPoints;if(!a||!o||!o.length)return null;e.xAxisId,e.yAxisId;var c=rh(e,Oq),u=o.map((f,h)=>{var m=or(or({},c),{},{x1:f,y1:t,x2:f,y2:t+r,key:"line-".concat(h),index:h});return y.createElement(uO,{option:a,lineItemProps:m,key:"line-".concat(h)})});return y.createElement("g",{className:"recharts-cartesian-grid-vertical"},u)}function $q(e){var t=e.horizontalFill,r=e.fillOpacity,n=e.x,a=e.y,o=e.width,c=e.height,u=e.horizontalPoints,f=e.horizontal,h=f===void 0?!0:f;if(!h||!t||!t.length||u==null)return null;var m=u.map(v=>Math.round(v+a-a)).sort((v,b)=>v-b);a!==m[0]&&m.unshift(0);var g=m.map((v,b)=>{var j=m[b+1],k=j==null,S=k?a+c-v:j-v;if(S<=0)return null;var N=b%t.length;return y.createElement("rect",{key:"react-".concat(b),y:v,x:n,height:S,width:o,stroke:"none",fill:t[N],fillOpacity:r,className:"recharts-cartesian-grid-bg"})});return y.createElement("g",{className:"recharts-cartesian-gridstripes-horizontal"},g)}function zq(e){var t=e.vertical,r=t===void 0?!0:t,n=e.verticalFill,a=e.fillOpacity,o=e.x,c=e.y,u=e.width,f=e.height,h=e.verticalPoints;if(!r||!n||!n.length)return null;var m=h.map(v=>Math.round(v+o-o)).sort((v,b)=>v-b);o!==m[0]&&m.unshift(0);var g=m.map((v,b)=>{var j=m[b+1],k=j==null,S=k?o+u-v:j-v;if(S<=0)return null;var N=b%n.length;return y.createElement("rect",{key:"react-".concat(b),x:v,y:c,width:S,height:f,stroke:"none",fill:n[N],fillOpacity:a,className:"recharts-cartesian-grid-bg"})});return y.createElement("g",{className:"recharts-cartesian-gridstripes-vertical"},g)}var Fq=(e,t)=>{var r=e.xAxis,n=e.width,a=e.height,o=e.offset;return H5(ix(or(or(or({},xi),r),{},{ticks:W5(r),viewBox:{x:0,y:0,width:n,height:a}})),o.left,o.left+o.width,t)},Bq=(e,t)=>{var r=e.yAxis,n=e.width,a=e.height,o=e.offset;return H5(ix(or(or(or({},xi),r),{},{ticks:W5(r),viewBox:{x:0,y:0,width:n,height:a}})),o.top,o.top+o.height,t)},Uq={horizontal:!0,vertical:!0,horizontalPoints:[],verticalPoints:[],stroke:"#ccc",fill:"none",verticalFill:[],horizontalFill:[],xAxisId:0,yAxisId:0,syncWithTicks:!1,zIndex:pr.grid};function cO(e){var t=Z5(),r=J5(),n=X5(),a=or(or({},on(e,Uq)),{},{x:Ee(e.x)?e.x:n.left,y:Ee(e.y)?e.y:n.top,width:Ee(e.width)?e.width:n.width,height:Ee(e.height)?e.height:n.height}),o=a.xAxisId,c=a.yAxisId,u=a.x,f=a.y,h=a.width,m=a.height,g=a.syncWithTicks,v=a.horizontalValues,b=a.verticalValues,j=Pr(),k=Me(B=>SS(B,"xAxis",o,j)),S=Me(B=>SS(B,"yAxis",c,j));if(!Vn(h)||!Vn(m)||!Ee(u)||!Ee(f))return null;var N=a.verticalCoordinatesGenerator||Fq,E=a.horizontalCoordinatesGenerator||Bq,A=a.horizontalPoints,P=a.verticalPoints;if((!A||!A.length)&&typeof E=="function"){var _=v&&v.length,O=E({yAxis:S?or(or({},S),{},{ticks:_?v:S.ticks}):void 0,width:t??h,height:r??m,offset:n},_?!0:g);Cf(Array.isArray(O),"horizontalCoordinatesGenerator should return Array but instead it returned [".concat(typeof O,"]")),Array.isArray(O)&&(A=O)}if((!P||!P.length)&&typeof N=="function"){var D=b&&b.length,U=N({xAxis:k?or(or({},k),{},{ticks:D?b:k.ticks}):void 0,width:t??h,height:r??m,offset:n},D?!0:g);Cf(Array.isArray(U),"verticalCoordinatesGenerator should return Array but instead it returned [".concat(typeof U,"]")),Array.isArray(U)&&(P=U)}return y.createElement(Mi,{zIndex:a.zIndex},y.createElement("g",{className:"recharts-cartesian-grid"},y.createElement(Dq,{fill:a.fill,fillOpacity:a.fillOpacity,x:a.x,y:a.y,width:a.width,height:a.height,ry:a.ry}),y.createElement($q,no({},a,{horizontalPoints:A})),y.createElement(zq,no({},a,{verticalPoints:P})),y.createElement(Rq,no({},a,{offset:n,horizontalPoints:A,xAxis:k,yAxis:S})),y.createElement(Lq,no({},a,{offset:n,verticalPoints:P,xAxis:k,yAxis:S}))))}cO.displayName="CartesianGrid";var Hq={},dO=lr({name:"errorBars",initialState:Hq,reducers:{addErrorBar:(e,t)=>{var r=t.payload,n=r.itemId,a=r.errorBar;e[n]||(e[n]=[]),e[n].push(a)},replaceErrorBar:(e,t)=>{var r=t.payload,n=r.itemId,a=r.prev,o=r.next;e[n]&&(e[n]=e[n].map(c=>c.dataKey===a.dataKey&&c.direction===a.direction?o:c))},removeErrorBar:(e,t)=>{var r=t.payload,n=r.itemId,a=r.errorBar;e[n]&&(e[n]=e[n].filter(o=>o.dataKey!==a.dataKey||o.direction!==a.direction))}}}),ox=dO.actions;ox.addErrorBar;ox.replaceErrorBar;ox.removeErrorBar;var Wq=dO.reducer;function fO(e,t){var r,n,a=Me(h=>Pi(h,e)),o=Me(h=>Oi(h,t)),c=(r=a==null?void 0:a.allowDataOverflow)!==null&&r!==void 0?r:Ct.allowDataOverflow,u=(n=o==null?void 0:o.allowDataOverflow)!==null&&n!==void 0?n:Pt.allowDataOverflow,f=c||u;return{needClip:f,needClipX:c,needClipY:u}}function Kq(e){var t=e.xAxisId,r=e.yAxisId,n=e.clipPathId,a=nx(),o=fO(t,r),c=o.needClipX,u=o.needClipY,f=o.needClip,h=Me(A=>YC(A,t,!1)),m=Me(A=>XC(A,r,!1));if(!f||!a)return null;var g=a.x,v=a.y,b=a.width,j=a.height,k=c&&h?Math.min(h[0],h[1]):g-b/2,S=u&&m?Math.min(m[0],m[1]):v-j/2,N=c&&h?Math.abs(h[1]-h[0]):b*2,E=u&&m?Math.abs(m[1]-m[0]):j*2;return y.createElement("clipPath",{id:"clipPath-".concat(n)},y.createElement("rect",{x:k,y:S,width:N,height:E}))}function Gq(e){var t=yh(e),r=3,n=2;if(t!=null){var a=t.r,o=t.strokeWidth,c=Number(a),u=Number(o);return(Number.isNaN(c)||c<0)&&(c=r),(Number.isNaN(u)||u<0)&&(u=n),{r:c,strokeWidth:u}}return{r,strokeWidth:n}}function sx(e,t){var r,n;return(r=(n=e.graphicalItems.cartesianItems.find(a=>a.id===t))===null||n===void 0?void 0:n.xAxisId)!==null&&r!==void 0?r:rO}function lx(e,t){var r,n;return(r=(n=e.graphicalItems.cartesianItems.find(a=>a.id===t))===null||n===void 0?void 0:n.yAxisId)!==null&&r!==void 0?r:rO}var hO=(e,t,r)=>aP(e,"xAxis",sx(e,t),r),mO=(e,t,r)=>iP(e,"xAxis",sx(e,t),r),pO=(e,t,r)=>aP(e,"yAxis",lx(e,t),r),gO=(e,t,r)=>iP(e,"yAxis",lx(e,t),r),Vq=q([ft,hO,pO,mO,gO],(e,t,r,n,a)=>Xn(e,"xAxis")?Af(t,n,!1):Af(r,a,!1)),qq=(e,t)=>t,vO=q([SC,qq],(e,t)=>e.filter(r=>r.type==="area").find(r=>r.id===t)),yO=e=>{var t=ft(e),r=Xn(t,"xAxis");return r?"yAxis":"xAxis"},Qq=(e,t)=>{var r=yO(e);return r==="yAxis"?lx(e,t):sx(e,t)},Yq=(e,t,r)=>TC(e,yO(e),Qq(e,t),r),Xq=q([vO,Yq],(e,t)=>{var r;if(!(e==null||t==null)){var n=e.stackId,a=l0(e);if(!(n==null||a==null)){var o=(r=t[n])===null||r===void 0?void 0:r.stackedData,c=o==null?void 0:o.find(u=>u.key===a);if(c!=null)return c.map(u=>[u[0],u[1]])}}}),Zq=q([ft,hO,pO,mO,gO,Xq,kF,Vq,vO,zF],(e,t,r,n,a,o,c,u,f,h)=>{var m=c.chartData,g=c.dataStartIndex,v=c.dataEndIndex;if(!(f==null||e!=="horizontal"&&e!=="vertical"||t==null||r==null||n==null||a==null||n.length===0||a.length===0||u==null)){var b=f.data,j;if(b&&b.length>0?j=b:j=m==null?void 0:m.slice(g,v+1),j!=null)return SQ({layout:e,xAxis:t,yAxis:r,xAxisTicks:n,yAxisTicks:a,dataStartIndex:g,areaSettings:f,stackedData:o,displayedData:j,chartBaseValue:h,bandSize:u})}}),Jq=["animationElapsedTime","isAnimating","isEntrance","layout","isRange","stroke","connectNulls"],eQ=["id","baseLine"];function wu(){return wu=Object.assign?Object.assign.bind():function(e){for(var t=1;tg.y||0));return Ee(a)?m=Math.max(a,m):a&&Array.isArray(a)&&a.length&&(m=Math.max(...a.map(g=>g.y||0),m)),Ee(m)?y.createElement("rect",{x:ug.x||0));return Ee(a)?m=Math.max(a,m):a&&Array.isArray(a)&&a.length&&(m=Math.max(...a.map(g=>g.x||0),m)),Ee(m)?y.createElement("rect",{x:0,y:ue==null?[]:t===1?e.flatMap(r=>r.status==="removed"?[]:[r.next]):e.flatMap(r=>r.status==="matched"?[el(el({},r.next),{},{x:mi(r.prev.x,r.next.x,t),y:mi(r.prev.y,r.next.y,t)})]:r.status==="added"?[r.next]:[]),bO={activeDot:!0,animationBegin:0,animationDuration:1500,animationEasing:"ease",animationMatchBy:tx,animationInterpolateFn:fQ,connectNulls:!1,dot:!1,fill:"#3182bd",fillOpacity:.6,hide:!1,isAnimationActive:"auto",legendType:"line",stroke:"#3182bd",strokeWidth:1,type:"linear",label:!1,shape:aQ,xAxisId:0,yAxisId:0,zIndex:pr.area};function ih(e,t){return e&&e!=="none"?e:t}var hQ=e=>{var t=e.dataKey,r=e.name,n=e.stroke,a=e.fill,o=e.legendType,c=e.hide;return[{inactive:c,dataKey:t,type:o,color:ih(n,a),value:K5(r,t),payload:e}]},mQ=y.memo(e=>{var t=e.dataKey,r=e.data,n=e.stroke,a=e.strokeWidth,o=e.fill,c=e.name,u=e.hide,f=e.unit,h=e.tooltipType,m=e.id,g={dataDefinedOnItem:r,getPosition:nl,settings:{stroke:n,strokeWidth:a,fill:o,dataKey:t,nameKey:void 0,name:K5(c,t),hide:u,type:h,color:ih(n,o),unit:f,graphicalItemId:m}};return y.createElement(EG,{tooltipEntrySettings:g})});function pQ(e){var t=e.clipPathId,r=e.points,n=e.props,a=n.needClip,o=n.dot,c=n.dataKey,u=kn(n);return y.createElement(pV,{points:r,dot:o,className:"recharts-area-dots",dotClassName:"recharts-area-dot",dataKey:c,baseProps:u,needClip:a,clipPathId:t})}function gQ(e){var t=e.showLabels,r=e.children,n=e.points,a=n.map(o=>{var c,u,f={x:(c=o.x)!==null&&c!==void 0?c:0,y:(u=o.y)!==null&&u!==void 0?u:0,width:0,lowerWidth:0,upperWidth:0,height:0};return el(el({},f),{},{value:o.value,payload:o.payload,parentViewBox:void 0,viewBox:f,fill:void 0})});return y.createElement(dG,{value:t?a:void 0},r)}function vQ(e){var t=e.points,r=e.baseLine,n=e.needClip,a=e.clipPathId,o=e.props,c=e.animationElapsedTime,u=e.isAnimating,f=e.isEntrance,h=o.layout,m=o.type,g=o.stroke,v=o.connectNulls,b=o.isRange,j=o.shape,k=o.id,S=xO(o,oQ),N=rn(S),E=el(el({},N),{},{id:k,points:t,connectNulls:v,type:m,baseLine:r,layout:h,stroke:g,isRange:b,animationElapsedTime:c,isAnimating:u,isEntrance:f});return y.createElement(y.Fragment,null,(t==null?void 0:t.length)>1&&y.createElement(nn,{clipPath:n?"url(#clipPath-".concat(a,")"):void 0},y.createElement(NG,{option:j,DefaultShape:bO.shape,shapeProps:E})),y.createElement(pQ,{points:t,props:S,clipPathId:a}))}function yQ(e,t,r){if(Ee(e)){var n=Ee(t)?t:void 0;return mi(n,e,r)}if(Yt(e)||Kn(e)){var a=Ee(t)?t:void 0;return mi(a,0,r)}return e}function xQ(e){var t=e.needClip,r=e.clipPathId,n=e.props,a=e.previousPointsRef,o=e.previousBaselineRef,c=n.points,u=n.baseLine,f=n.isAnimationActive,h=n.animationBegin,m=n.animationDuration,g=n.animationEasing,v=n.animationMatchBy,b=n.animationInterpolateFn,j=y.useMemo(()=>({points:c,baseLine:u}),[c,u]),k=JP(j,o),S=qy(),N=HG(n.onAnimationStart,n.onAnimationEnd),E=N.isAnimating,A=N.handleAnimationStart,P=N.handleAnimationEnd,_=k.startValue;if(S==null)return null;var O;return Array.isArray(u)&&Array.isArray(_)?O=uy(_,u,v):Array.isArray(u)?O=uy(null,u,v):O=null,y.createElement(WG,{animationInput:j,animationIdPrefix:"recharts-area-",items:c,previousItemsRef:a,isAnimationActive:f,animationBegin:h,animationDuration:m,animationEasing:g,onAnimationStart:A,onAnimationEnd:P,animationInterpolateFn:b,animationMatchBy:v,layout:S},(D,U,B)=>{var F;return U===1?F=u:Array.isArray(u)?F=b(O,U,S):F=B?u:yQ(u,_,U),k.syncStepValue(F,U),y.createElement(gQ,{showLabels:!E,points:c},n.children,y.createElement(vQ,{points:D,baseLine:F,needClip:t,clipPathId:r,props:n,animationElapsedTime:U,isAnimating:E||U<1,isEntrance:B}),y.createElement(mG,{label:n.label}))})}function bQ(e){var t=e.needClip,r=e.clipPathId,n=e.props,a=y.useRef(null),o=y.useRef();return y.createElement(xQ,{needClip:t,clipPathId:r,props:n,previousPointsRef:a,previousBaselineRef:o})}class wQ extends y.PureComponent{render(){var t=this.props,r=t.hide,n=t.dot,a=t.points,o=t.className,c=t.top,u=t.left,f=t.needClip,h=t.xAxisId,m=t.yAxisId,g=t.width,v=t.height,b=t.id,j=t.baseLine,k=t.zIndex;if(r)return null;var S=nt("recharts-area",o),N=b,E=Gq(n),A=E.r,P=E.strokeWidth,_=XP(n),O=A*2+P,D=f?"url(#clipPath-".concat(_?"":"dots-").concat(N,")"):void 0;return y.createElement(Mi,{zIndex:k},y.createElement(nn,{className:S},f&&y.createElement("defs",null,y.createElement(Kq,{clipPathId:N,xAxisId:h,yAxisId:m}),!_&&y.createElement("clipPath",{id:"clipPath-dots-".concat(N)},y.createElement("rect",{x:u-O/2,y:c-O/2,width:g+O,height:v+O}))),y.createElement(bQ,{needClip:f,clipPathId:N,props:this.props})),y.createElement(p2,{points:a,mainColor:ih(this.props.stroke,this.props.fill),itemDataKey:this.props.dataKey,activeDot:this.props.activeDot,clipPath:D}),this.props.isRange&&Array.isArray(j)&&y.createElement(p2,{points:j,mainColor:ih(this.props.stroke,this.props.fill),itemDataKey:this.props.dataKey,activeDot:this.props.activeDot,clipPath:D}))}}function kQ(e){var t,r=e.activeDot,n=e.animationBegin,a=e.animationDuration,o=e.animationEasing,c=e.connectNulls,u=e.dot,f=e.fill,h=e.fillOpacity,m=e.hide,g=e.isAnimationActive,v=e.legendType,b=e.stroke,j=e.xAxisId,k=e.yAxisId,S=xO(e,sQ),N=il(),E=CP(),A=fO(j,k),P=A.needClip,_=Pr(),O=(t=Me(he=>Zq(he,e.id,_)))!==null&&t!==void 0?t:{},D=O.points,U=O.isRange,B=O.baseLine,F=nx();if(N!=="horizontal"&&N!=="vertical"||F==null||E!=="AreaChart"&&E!=="ComposedChart")return null;var Y=F.height,H=F.width,pe=F.x,ue=F.y;return!D||!D.length?null:y.createElement(wQ,nh({},S,{activeDot:r,animationBegin:n,animationDuration:a,animationEasing:o,baseLine:B,connectNulls:c,dot:u,fill:f,fillOpacity:h,height:Y,hide:m,layout:N,isAnimationActive:g,isRange:U,legendType:v,needClip:P,points:D,stroke:b,width:H,left:pe,top:ue,xAxisId:j,yAxisId:k}))}var jQ=(e,t,r,n,a)=>{var o=r??t;if(Ee(o))return o;var c=e==="horizontal"?a:n,u=c.scale.domain();if(c.type==="number"){var f=Math.max(u[0],u[1]),h=Math.min(u[0],u[1]);return o==="dataMin"?h:o==="dataMax"||f<0?f:Math.max(Math.min(u[0],u[1]),0)}return o==="dataMin"?u[0]:o==="dataMax"?u[1]:u[0]};function SQ(e){var t=e.areaSettings,r=t.connectNulls,n=t.baseValue,a=t.dataKey,o=e.stackedData,c=e.layout,u=e.chartBaseValue,f=e.xAxis,h=e.yAxis,m=e.displayedData,g=e.dataStartIndex,v=e.xAxisTicks,b=e.yAxisTicks,j=e.bandSize,k=o&&o.length,S=jQ(c,u,n,f,h),N=c==="horizontal",E=!1,A=m.map((_,O)=>{var D,U,B,F;if(k)F=o[g+O];else{var Y=Lt(_,a);Array.isArray(Y)?(F=Y,E=!0):F=[S,Y]}var H=(D=(U=F)===null||U===void 0?void 0:U[1])!==null&&D!==void 0?D:null,pe=H==null||k&&!r&&Lt(_,a)==null;if(N){var ue;return{x:xk({axis:f,ticks:v,bandSize:j,entry:_,index:O}),y:pe?null:(ue=h.scale.map(H))!==null&&ue!==void 0?ue:null,value:F,payload:_}}return{x:pe?null:(B=f.scale.map(H))!==null&&B!==void 0?B:null,y:xk({axis:h,ticks:b,bandSize:j,entry:_,index:O}),value:F,payload:_}}),P;return k||E?P=A.map(_=>{var O,D=Array.isArray(_.value)?_.value[0]:null;if(N){var U;return{x:_.x,y:D!=null&&_.y!=null&&(U=h.scale.map(D))!==null&&U!==void 0?U:null,payload:_.payload}}return{x:D!=null&&(O=f.scale.map(D))!==null&&O!==void 0?O:null,y:_.y,payload:_.payload}}):P=N?h.scale.map(S):f.scale.map(S),{points:A,baseLine:P??0,isRange:E}}function NQ(e){var t=on(e,bO),r=Pr();return y.createElement(JG,{id:t.id,type:"area"},n=>y.createElement(y.Fragment,null,y.createElement(AG,{legendPayload:hQ(t)}),y.createElement(mQ,{dataKey:t.dataKey,data:t.data,stroke:t.stroke,strokeWidth:t.strokeWidth,fill:t.fill,name:t.name,hide:t.hide,unit:t.unit,tooltipType:t.tooltipType,id:n}),y.createElement(oV,{type:"area",id:n,data:t.data,dataKey:t.dataKey,xAxisId:t.xAxisId,yAxisId:t.yAxisId,zAxisId:0,stackId:lz(t.stackId),hide:t.hide,barSize:void 0,baseValue:t.baseValue,isPanorama:r,connectNulls:t.connectNulls}),y.createElement(kQ,nh({},t,{id:n}))))}var wO=y.memo(NQ,Fh);wO.displayName="Area";var EQ=["domain","range"],AQ=["domain","range"];function N2(e,t){if(e==null)return{};var r,n,a=CQ(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n{if(c!=null)return C2(C2({},o),{},{type:c})},[o,c]);return y.useLayoutEffect(()=>{u!=null&&(r.current===null?t(bV(u)):r.current!==u&&t(wV({prev:r.current,next:u})),r.current=u)},[u,t]),y.useLayoutEffect(()=>()=>{r.current&&(t(kV(r.current)),r.current=null)},[t]),null}var LQ=e=>{var t=e.xAxisId,r=e.className,n=Me(V5),a=Pr(),o="xAxis",c=Me(v=>nP(v,o,t,a)),u=Me(v=>vU(v,t)),f=Me(v=>jU(v,t)),h=Me(v=>bC(v,t));if(u==null||f==null||h==null)return null;e.dangerouslySetInnerHTML,e.ticks,e.scale;var m=dy(e,OQ);h.id,h.scale;var g=dy(h,_Q);return y.createElement(ax,cy({},m,g,{x:f.x,y:f.y,width:u.width,height:u.height,className:nt("recharts-".concat(o," ").concat(o),r),viewBox:n,ticks:c,axisType:o,axisId:t}))},$Q={allowDataOverflow:Ct.allowDataOverflow,allowDecimals:Ct.allowDecimals,allowDuplicatedCategory:Ct.allowDuplicatedCategory,angle:Ct.angle,axisLine:xi.axisLine,height:Ct.height,hide:!1,includeHidden:Ct.includeHidden,interval:Ct.interval,label:!1,minTickGap:Ct.minTickGap,mirror:Ct.mirror,orientation:Ct.orientation,padding:Ct.padding,reversed:Ct.reversed,scale:Ct.scale,tick:Ct.tick,tickCount:Ct.tickCount,tickLine:xi.tickLine,tickSize:xi.tickSize,type:Ct.type,niceTicks:Ct.niceTicks,xAxisId:0},zQ=e=>{var t=on(e,$Q);return y.createElement(y.Fragment,null,y.createElement(RQ,{allowDataOverflow:t.allowDataOverflow,allowDecimals:t.allowDecimals,allowDuplicatedCategory:t.allowDuplicatedCategory,angle:t.angle,dataKey:t.dataKey,domain:t.domain,height:t.height,hide:t.hide,id:t.xAxisId,includeHidden:t.includeHidden,interval:t.interval,minTickGap:t.minTickGap,mirror:t.mirror,name:t.name,orientation:t.orientation,padding:t.padding,reversed:t.reversed,scale:t.scale,tick:t.tick,tickCount:t.tickCount,tickFormatter:t.tickFormatter,ticks:t.ticks,type:t.type,unit:t.unit,niceTicks:t.niceTicks}),y.createElement(LQ,t))},jO=y.memo(zQ,kO);jO.displayName="XAxis";var FQ=["type"],BQ=["dangerouslySetInnerHTML","ticks","scale"],UQ=["id","scale"];function fy(){return fy=Object.assign?Object.assign.bind():function(e){for(var t=1;t{if(c!=null)return O2(O2({},o),{},{type:c})},[c,o]);return y.useLayoutEffect(()=>{u!=null&&(r.current===null?t(jV(u)):r.current!==u&&t(SV({prev:r.current,next:u})),r.current=u)},[u,t]),y.useLayoutEffect(()=>()=>{r.current&&(t(NV(r.current)),r.current=null)},[t]),null}function qQ(e){var t=e.yAxisId,r=e.className,n=e.width,a=e.label,o=y.useRef(null),c=y.useRef(null),u=Me(V5),f=Pr(),h=Nt(),m="yAxis",g=Me(N=>EU(N,t)),v=Me(N=>NU(N,t)),b=Me(N=>nP(N,m,t,f)),j=Me(N=>wC(N,t));if(y.useLayoutEffect(()=>{if(!(n!=="auto"||!g||ex(a)||y.isValidElement(a)||j==null)){var N=o.current;if(N){var E=N.getCalculatedWidth();Math.round(g.width)!==Math.round(E)&&h(EV({id:t,width:E}))}}},[b,g,h,a,t,n,j]),g==null||v==null||j==null)return null;e.dangerouslySetInnerHTML,e.ticks,e.scale;var k=hy(e,BQ);j.id,j.scale;var S=hy(j,UQ);return y.createElement(ax,fy({},k,S,{ref:o,labelRef:c,x:v.x,y:v.y,tickTextProps:n==="auto"?{width:void 0}:{width:n},width:g.width,height:g.height,className:nt("recharts-".concat(m," ").concat(m),r),viewBox:u,ticks:b,axisType:m,axisId:t}))}var QQ={allowDataOverflow:Pt.allowDataOverflow,allowDecimals:Pt.allowDecimals,allowDuplicatedCategory:Pt.allowDuplicatedCategory,angle:Pt.angle,axisLine:xi.axisLine,hide:!1,includeHidden:Pt.includeHidden,interval:Pt.interval,label:!1,minTickGap:Pt.minTickGap,mirror:Pt.mirror,orientation:Pt.orientation,padding:Pt.padding,reversed:Pt.reversed,scale:Pt.scale,tick:Pt.tick,tickCount:Pt.tickCount,tickLine:xi.tickLine,tickSize:xi.tickSize,type:Pt.type,niceTicks:Pt.niceTicks,width:Pt.width,yAxisId:0},YQ=e=>{var t=on(e,QQ);return y.createElement(y.Fragment,null,y.createElement(VQ,{interval:t.interval,id:t.yAxisId,scale:t.scale,type:t.type,domain:t.domain,allowDataOverflow:t.allowDataOverflow,dataKey:t.dataKey,allowDuplicatedCategory:t.allowDuplicatedCategory,allowDecimals:t.allowDecimals,tickCount:t.tickCount,padding:t.padding,includeHidden:t.includeHidden,reversed:t.reversed,ticks:t.ticks,width:t.width,orientation:t.orientation,mirror:t.mirror,hide:t.hide,unit:t.unit,name:t.name,angle:t.angle,minTickGap:t.minTickGap,tick:t.tick,tickFormatter:t.tickFormatter,niceTicks:t.niceTicks}),y.createElement(qQ,t))},SO=y.memo(YQ,kO);SO.displayName="YAxis";var XQ=(e,t)=>t,ux=q([XQ,ft,DA,Ft,kP,_i,qH,Zt],tW);function ZQ(e){return"getBBox"in e.currentTarget&&typeof e.currentTarget.getBBox=="function"}function cx(e){var t=e.currentTarget.getBoundingClientRect(),r,n;if(ZQ(e)){var a=e.currentTarget.getBBox();r=a.width>0?t.width/a.width:1,n=a.height>0?t.height/a.height:1}else{var o=e.currentTarget;r=o.offsetWidth>0?t.width/o.offsetWidth:1,n=o.offsetHeight>0?t.height/o.offsetHeight:1}var c=(u,f)=>({relativeX:Math.round((u-t.left)/r),relativeY:Math.round((f-t.top)/n)});return"touches"in e?Array.from(e.touches).map(u=>c(u.clientX,u.clientY)):c(e.clientX,e.clientY)}var NO=Hr("mouseClick"),EO=Zu();EO.startListening({actionCreator:NO,effect:(e,t)=>{var r=e.payload,n=ux(t.getState(),cx(r));(n==null?void 0:n.activeIndex)!=null&&t.dispatch(BU({activeIndex:n.activeIndex,activeDataKey:void 0,activeCoordinate:n.activeCoordinate}))}});var my=Hr("mouseMove"),AO=Zu(),ms=null,Ha=null,Bg=null;AO.startListening({actionCreator:my,effect:(e,t)=>{var r=e.payload,n=t.getState(),a=n.eventSettings,o=a.throttleDelay,c=a.throttledEvents,u=c==="all"||(c==null?void 0:c.includes("mousemove"));ms!==null&&(cancelAnimationFrame(ms),ms=null),Ha!==null&&(typeof o!="number"||!u)&&(clearTimeout(Ha),Ha=null),Bg=cx(r);var f=()=>{var h=t.getState(),m=dc(h,h.tooltip.settings.shared);if(!Bg){ms=null,Ha=null;return}if(m==="axis"){var g=ux(h,Bg);(g==null?void 0:g.activeIndex)!=null?t.dispatch(fP({activeIndex:g.activeIndex,activeDataKey:void 0,activeCoordinate:g.activeCoordinate})):t.dispatch(dP())}ms=null,Ha=null};if(!u){f();return}o==="raf"?ms=requestAnimationFrame(f):typeof o=="number"&&Ha===null&&(Ha=setTimeout(f,o))}});function JQ(e,t){return t instanceof HTMLElement?"HTMLElement <".concat(t.tagName,' class="').concat(t.className,'">'):t===window?"global.window":e==="children"&&typeof t=="object"&&t!==null?"<>":t}var _2={accessibilityLayer:!0,barCategoryGap:"10%",barGap:4,barSize:void 0,className:void 0,maxBarSize:void 0,stackOffset:"none",syncId:void 0,syncMethod:"index",baseValue:void 0,reverseStackOrder:!1},CO=lr({name:"rootProps",initialState:_2,reducers:{updateOptions:(e,t)=>{var r;e.accessibilityLayer=t.payload.accessibilityLayer,e.barCategoryGap=t.payload.barCategoryGap,e.barGap=(r=t.payload.barGap)!==null&&r!==void 0?r:_2.barGap,e.barSize=t.payload.barSize,e.maxBarSize=t.payload.maxBarSize,e.stackOffset=t.payload.stackOffset,e.syncId=t.payload.syncId,e.syncMethod=t.payload.syncMethod,e.className=t.payload.className,e.baseValue=t.payload.baseValue,e.reverseStackOrder=t.payload.reverseStackOrder}}}),eY=CO.reducer,tY=CO.actions.updateOptions,rY=null,nY={updatePolarOptions:(e,t)=>e===null?t.payload:(e.startAngle=t.payload.startAngle,e.endAngle=t.payload.endAngle,e.cx=t.payload.cx,e.cy=t.payload.cy,e.innerRadius=t.payload.innerRadius,e.outerRadius=t.payload.outerRadius,e)},PO=lr({name:"polarOptions",initialState:rY,reducers:nY});PO.actions.updatePolarOptions;var iY=PO.reducer,OO=Hr("keyDown"),_O=Hr("focus"),MO=Hr("blur"),om=Zu(),ps=null,Wa=null,Gd=null;om.startListening({actionCreator:OO,effect:(e,t)=>{Gd=e.payload,ps!==null&&(cancelAnimationFrame(ps),ps=null);var r=t.getState(),n=r.eventSettings,a=n.throttleDelay,o=n.throttledEvents,c=o==="all"||o.includes("keydown");Wa!==null&&(typeof a!="number"||!c)&&(clearTimeout(Wa),Wa=null);var u=()=>{try{var f=t.getState(),h=f.rootProps.accessibilityLayer!==!1;if(!h)return;var m=f.tooltip.keyboardInteraction,g=Gd;if(g!=="ArrowRight"&&g!=="ArrowLeft"&&g!=="Enter")return;var v=xu(m,No(f),Zs(f),Js(f)),b=v==null?-1:Number(v),j=!Number.isFinite(b)||b<0,k=_i(f),S=No(f),N=dc(f,f.tooltip.settings.shared);if(g==="Enter"){if(j)return;var E=Zf(f,N,"hover",String(m.index));t.dispatch(Xf({active:!m.active,activeIndex:m.index,activeCoordinate:E}));return}var A=_U(f),P=A==="left-to-right"?1:-1,_=g==="ArrowRight"?1:-1,O;if(j){var D=Zs(f),U=Js(f),B=_*P,F=he=>({active:!1,index:String(he),dataKey:void 0,graphicalItemId:void 0,coordinate:void 0});if(O=-1,B>0){for(var Y=0;Y=0;H--)if(xu(F(H),S,D,U)!=null){O=H;break}if(O<0)return}else{O=b+_*P;var pe=(k==null?void 0:k.length)||S.length;if(pe===0||O>=pe||O<0)return}var ue=Zf(f,N,"hover",String(O));t.dispatch(Xf({active:!0,activeIndex:O.toString(),activeCoordinate:ue}))}finally{ps=null,Wa=null}};if(!c){u();return}a==="raf"?ps=requestAnimationFrame(u):typeof a=="number"&&Wa===null&&(u(),Gd=null,Wa=setTimeout(()=>{Gd?u():(Wa=null,ps=null)},a))}});om.startListening({actionCreator:_O,effect:(e,t)=>{var r=t.getState(),n=r.rootProps.accessibilityLayer!==!1;if(n){var a=r.tooltip.keyboardInteraction;if(!a.active&&a.index==null){var o="0",c=dc(r,r.tooltip.settings.shared),u=Zf(r,c,"hover",String(o));t.dispatch(Xf({active:!0,activeIndex:o,activeCoordinate:u}))}}}});om.startListening({actionCreator:MO,effect:(e,t)=>{var r=t.getState(),n=r.rootProps.accessibilityLayer!==!1;if(n){var a=r.tooltip.keyboardInteraction;a.active&&t.dispatch(Xf({active:!1,activeIndex:a.index,activeCoordinate:a.coordinate}))}}});function IO(e){e.persist();var t=e.currentTarget;return new Proxy(e,{get:(r,n)=>{if(n==="currentTarget")return t;var a=Reflect.get(r,n);return typeof a=="function"?a.bind(r):a}})}var Xr=Hr("externalEvent"),TO=Zu(),Vd=new Map,uu=new Map,Ug=new Map;TO.startListening({actionCreator:Xr,effect:(e,t)=>{var r=e.payload,n=r.handler,a=r.reactEvent;if(n!=null){var o=a.type,c=IO(a);Ug.set(o,{handler:n,reactEvent:c});var u=Vd.get(o);u!==void 0&&(cancelAnimationFrame(u),Vd.delete(o));var f=t.getState(),h=f.eventSettings,m=h.throttleDelay,g=h.throttledEvents,v=g,b=v==="all"||(v==null?void 0:v.includes(o)),j=uu.get(o);j!==void 0&&(typeof m!="number"||!b)&&(clearTimeout(j),uu.delete(o));var k=()=>{var E=Ug.get(o);try{if(!E)return;var A=E.handler,P=E.reactEvent,_=t.getState(),O={activeCoordinate:IH(_),activeDataKey:OH(_),activeIndex:Fu(_),activeLabel:NP(_),activeTooltipIndex:Fu(_),isTooltipActive:TH(_)};A&&A(O,P)}finally{Vd.delete(o),uu.delete(o),Ug.delete(o)}};if(!b){k();return}if(m==="raf"){var S=requestAnimationFrame(k);Vd.set(o,S)}else if(typeof m=="number"){if(!uu.has(o)){k();var N=setTimeout(k,m);uu.set(o,N)}}else k()}}});var aY=q([fl],e=>e.tooltipItemPayloads),oY=q([aY,(e,t)=>t,(e,t,r)=>r],(e,t,r)=>{if(t!=null){var n=e.find(o=>o.settings.graphicalItemId===r);if(n!=null){var a=n.getPosition;if(a!=null)return a(t)}}}),DO=Hr("touchMove"),RO=Zu(),Ka=null,ra=null,M2=null,cu=null;RO.startListening({actionCreator:DO,effect:(e,t)=>{var r=e.payload;if(!(r.touches==null||r.touches.length===0)){cu=IO(r);var n=t.getState(),a=n.eventSettings,o=a.throttleDelay,c=a.throttledEvents,u=c==="all"||c.includes("touchmove");Ka!==null&&(cancelAnimationFrame(Ka),Ka=null),ra!==null&&(typeof o!="number"||!u)&&(clearTimeout(ra),ra=null),M2=Array.from(r.touches).map(h=>cx({clientX:h.clientX,clientY:h.clientY,currentTarget:r.currentTarget}));var f=()=>{if(cu!=null){var h=t.getState(),m=dc(h,h.tooltip.settings.shared);if(m==="axis"){var g,v=(g=M2)===null||g===void 0?void 0:g[0];if(v==null){Ka=null,ra=null;return}var b=ux(h,v);(b==null?void 0:b.activeIndex)!=null&&t.dispatch(fP({activeIndex:b.activeIndex,activeDataKey:void 0,activeCoordinate:b.activeCoordinate}))}else if(m==="item"){var j,k=cu.touches[0];if(document.elementFromPoint==null||k==null)return;var S=document.elementFromPoint(k.clientX,k.clientY);if(!S||!S.getAttribute)return;var N=S.getAttribute(pz),E=(j=S.getAttribute(gz))!==null&&j!==void 0?j:void 0,A=Io(h).find(O=>O.id===E);if(N==null||A==null||E==null)return;var P=A.dataKey,_=oY(h,N,E);t.dispatch(FU({activeDataKey:P,activeIndex:N,activeCoordinate:_,activeGraphicalItemId:E}))}Ka=null,ra=null}};if(!u){f();return}o==="raf"?Ka=requestAnimationFrame(f):typeof o=="number"&&ra===null&&(f(),cu=null,ra=setTimeout(()=>{cu?f():(ra=null,Ka=null)},o))}}});var LO={throttleDelay:"raf",throttledEvents:["mousemove","touchmove","pointermove","scroll","wheel"]},$O=lr({name:"eventSettings",initialState:LO,reducers:{setEventSettings:(e,t)=>{t.payload.throttleDelay!=null&&(e.throttleDelay=t.payload.throttleDelay),t.payload.throttledEvents!=null&&(e.throttledEvents=t.payload.throttledEvents)}}}),sY=$O.actions.setEventSettings,lY=$O.reducer,uY=m5({brush:RV,cartesianAxis:AV,chartData:MW,errorBars:Wq,eventSettings:lY,graphicalItems:iV,layout:J$,legend:h6,options:AW,polarAxis:gG,polarOptions:iY,referenceElements:FV,renderedTicks:lq,rootProps:eY,tooltip:UU,zIndex:mW}),cY=function(t){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"Chart";return S$({reducer:uY,preloadedState:t,middleware:n=>{var a;return n({serializableCheck:!1,immutableCheck:!["commonjs","es6","production"].includes((a="es6")!==null&&a!==void 0?a:"")}).concat([EO.middleware,AO.middleware,om.middleware,TO.middleware,RO.middleware])},enhancers:n=>{var a=n;return typeof n=="function"&&(a=n()),a.concat(P5({type:"raf"}))},devTools:{serialize:{replacer:JQ},name:"recharts-".concat(r)}})};function dY(e){var t=e.preloadedState,r=e.children,n=e.reduxStoreName,a=Pr(),o=y.useRef(null);if(a)return r;o.current==null&&(o.current=cY(t,n));var c=zy;return y.createElement(P6,{context:c,store:o.current},r)}function fY(e){var t=e.layout,r=e.margin,n=Nt(),a=Pr();return y.useEffect(()=>{a||(n(Y$(t)),n(Q$(r)))},[n,a,t,r]),null}var hY=y.memo(fY,Fh);function mY(e){var t=Nt();return y.useEffect(()=>{t(tY(e))},[t,e]),null}var pY=e=>{var t=Nt();return y.useEffect(()=>{t(sY(e))},[t,e]),null},gY=y.memo(pY,Fh);function I2(e){var t=e.zIndex,r=e.isPanorama,n=y.useRef(null),a=Nt();return y.useLayoutEffect(()=>(n.current&&a(fW({zIndex:t,element:n.current,isPanorama:r})),()=>{a(hW({zIndex:t,isPanorama:r}))}),[a,t,r]),y.createElement("g",{tabIndex:-1,ref:n,className:"recharts-zIndex-layer_".concat(t)})}function T2(e){var t=e.children,r=e.isPanorama,n=Me(nW);if(!n||n.length===0)return t;var a=n.filter(c=>c<0),o=n.filter(c=>c>0);return y.createElement(y.Fragment,null,a.map(c=>y.createElement(I2,{key:c,zIndex:c,isPanorama:r})),t,o.map(c=>y.createElement(I2,{key:c,zIndex:c,isPanorama:r})))}var vY=["children"];function yY(e,t){if(e==null)return{};var r,n,a=xY(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n{var r=Z5(),n=J5(),a=uA();if(!Vn(r)||!Vn(n))return null;var o=e.children,c=e.otherAttributes,u=e.title,f=e.desc,h,m;return c!=null&&(typeof c.tabIndex=="number"?h=c.tabIndex:h=a?0:void 0,typeof c.role=="string"?m=c.role:m=a?"application":void 0),y.createElement(ME,ah({},c,{title:u,desc:f,role:m,tabIndex:h,width:r,height:n,style:bY,ref:t}),o)}),kY=e=>{var t=e.children,r=Me(Dh);if(!r)return null;var n=r.width,a=r.height,o=r.y,c=r.x;return y.createElement(ME,{width:n,height:a,x:c,y:o},t)},D2=y.forwardRef((e,t)=>{var r=e.children,n=yY(e,vY),a=Pr();return a?y.createElement(kY,null,y.createElement(T2,{isPanorama:!0},r)):y.createElement(wY,ah({ref:t},n),y.createElement(T2,{isPanorama:!1},r))});function jY(e,t){return AY(e)||EY(e,t)||NY(e,t)||SY()}function SY(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function NY(e,t){if(e){if(typeof e=="string")return R2(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?R2(e,t):void 0}}function R2(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{if(n!=null){var c=n.getBoundingClientRect(),u=c.width/n.offsetWidth;We(u)&&u!==o&&e(Z$(u))}},[n,e,o]),a}function L2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function PY(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);r(BW(),null);function sh(e){if(typeof e=="number")return e;if(typeof e=="string"){var t=parseFloat(e);if(!Number.isNaN(t))return t}return 0}var $Y=y.forwardRef((e,t)=>{var r,n,a=y.useRef(null),o=y.useState({containerWidth:sh((r=e.style)===null||r===void 0?void 0:r.width),containerHeight:sh((n=e.style)===null||n===void 0?void 0:n.height)}),c=oh(o,2),u=c[0],f=c[1],h=y.useCallback((g,v)=>{f(b=>{var j=Math.round(g),k=Math.round(v);return b.containerWidth===j&&b.containerHeight===k?b:{containerWidth:j,containerHeight:k}})},[]),m=y.useCallback(g=>{if(typeof t=="function"&&t(g),a.current!=null&&(a.current.disconnect(),a.current=null),g!=null&&typeof ResizeObserver<"u"){var v=g.getBoundingClientRect(),b=v.width,j=v.height;h(b,j);var k=N=>{var E=N[0];if(E!=null){var A=E.contentRect,P=A.width,_=A.height;h(P,_)}},S=new ResizeObserver(k);S.observe(g),a.current=S}},[t,h]);return y.useEffect(()=>()=>{var g=a.current;g!=null&&g.disconnect()},[h]),y.createElement(y.Fragment,null,y.createElement(ec,{width:u.containerWidth,height:u.containerHeight}),y.createElement("div",ka({ref:m},e)))}),zY=y.forwardRef((e,t)=>{var r=e.width,n=e.height,a=y.useState({containerWidth:sh(r),containerHeight:sh(n)}),o=oh(a,2),c=o[0],u=o[1],f=y.useCallback((m,g)=>{u(v=>{var b=Math.round(m),j=Math.round(g);return v.containerWidth===b&&v.containerHeight===j?v:{containerWidth:b,containerHeight:j}})},[]),h=y.useCallback(m=>{if(typeof t=="function"&&t(m),m!=null){var g=m.getBoundingClientRect(),v=g.width,b=g.height;f(v,b)}},[t,f]);return y.createElement(y.Fragment,null,y.createElement(ec,{width:c.containerWidth,height:c.containerHeight}),y.createElement("div",ka({ref:h},e)))}),FY=y.forwardRef((e,t)=>{var r=e.width,n=e.height;return y.createElement(y.Fragment,null,y.createElement(ec,{width:r,height:n}),y.createElement("div",ka({ref:t},e)))}),BY=y.forwardRef((e,t)=>{var r=e.width,n=e.height;return typeof r=="string"||typeof n=="string"?y.createElement(zY,ka({},e,{ref:t})):typeof r=="number"&&typeof n=="number"?y.createElement(FY,ka({},e,{width:r,height:n,ref:t})):y.createElement(y.Fragment,null,y.createElement(ec,{width:r,height:n}),y.createElement("div",ka({ref:t},e)))});function UY(e){return e?$Y:BY}var HY=y.forwardRef((e,t)=>{var r=e.children,n=e.className,a=e.height,o=e.onClick,c=e.onContextMenu,u=e.onDoubleClick,f=e.onMouseDown,h=e.onMouseEnter,m=e.onMouseLeave,g=e.onMouseMove,v=e.onMouseUp,b=e.onTouchEnd,j=e.onTouchMove,k=e.onTouchStart,S=e.style,N=e.width,E=e.responsive,A=e.dispatchTouchEvents,P=A===void 0?!0:A,_=y.useRef(null),O=Nt(),D=y.useState(null),U=oh(D,2),B=U[0],F=U[1],Y=y.useState(null),H=oh(Y,2),pe=H[0],ue=H[1],he=CY(),ae=Gy(),se=(ae==null?void 0:ae.width)>0?ae.width:N,X=(ae==null?void 0:ae.height)>0?ae.height:a,te=y.useCallback(Oe=>{he(Oe),typeof t=="function"&&t(Oe),F(Oe),ue(Oe),Oe!=null&&(_.current=Oe)},[he,t,F,ue]),J=y.useCallback(Oe=>{O(NO(Oe)),O(Xr({handler:o,reactEvent:Oe}))},[O,o]),I=y.useCallback(Oe=>{O(my(Oe)),O(Xr({handler:h,reactEvent:Oe}))},[O,h]),M=y.useCallback(Oe=>{O(dP()),O(Xr({handler:m,reactEvent:Oe}))},[O,m]),K=y.useCallback(Oe=>{O(my(Oe)),O(Xr({handler:g,reactEvent:Oe}))},[O,g]),ne=y.useCallback(()=>{O(_O())},[O]),Z=y.useCallback(()=>{O(MO())},[O]),me=y.useCallback(Oe=>{O(OO(Oe.key))},[O]),ge=y.useCallback(Oe=>{O(Xr({handler:c,reactEvent:Oe}))},[O,c]),Pe=y.useCallback(Oe=>{O(Xr({handler:u,reactEvent:Oe}))},[O,u]),re=y.useCallback(Oe=>{O(Xr({handler:f,reactEvent:Oe}))},[O,f]),xe=y.useCallback(Oe=>{O(Xr({handler:v,reactEvent:Oe}))},[O,v]),_e=y.useCallback(Oe=>{O(Xr({handler:k,reactEvent:Oe}))},[O,k]),ie=y.useCallback(Oe=>{P&&O(DO(Oe)),O(Xr({handler:j,reactEvent:Oe}))},[O,P,j]),Je=y.useCallback(Oe=>{O(Xr({handler:b,reactEvent:Oe}))},[O,b]),Fe=UY(E);return y.createElement(IP.Provider,{value:B},y.createElement(nR.Provider,{value:pe},y.createElement(Fe,{width:se??(S==null?void 0:S.width),height:X??(S==null?void 0:S.height),className:nt("recharts-wrapper",n),style:PY({position:"relative",cursor:"default",width:se,height:X},S),onClick:J,onContextMenu:ge,onDoubleClick:Pe,onFocus:ne,onBlur:Z,onKeyDown:me,onMouseDown:re,onMouseEnter:I,onMouseLeave:M,onMouseMove:K,onMouseUp:xe,onTouchEnd:Je,onTouchMove:ie,onTouchStart:_e,ref:te},y.createElement(LY,null),r)))}),WY=["width","height","responsive","children","className","style","compact","title","desc"];function KY(e,t){if(e==null)return{};var r,n,a=GY(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n{var r=e.width,n=e.height,a=e.responsive,o=e.children,c=e.className,u=e.style,f=e.compact,h=e.title,m=e.desc,g=KY(e,WY),v=kn(g);return f?y.createElement(y.Fragment,null,y.createElement(ec,{width:r,height:n}),y.createElement(D2,{otherAttributes:v,title:h,desc:m},o)):y.createElement(HY,{className:c,style:u,width:r,height:n,responsive:a??!1,onClick:e.onClick,onMouseLeave:e.onMouseLeave,onMouseEnter:e.onMouseEnter,onMouseMove:e.onMouseMove,onMouseDown:e.onMouseDown,onMouseUp:e.onMouseUp,onContextMenu:e.onContextMenu,onDoubleClick:e.onDoubleClick,onTouchStart:e.onTouchStart,onTouchMove:e.onTouchMove,onTouchEnd:e.onTouchEnd},y.createElement(D2,{otherAttributes:v,title:h,desc:m,ref:t},y.createElement(VV,null,o)))});function py(){return py=Object.assign?Object.assign.bind():function(e){for(var t=1;ty.createElement(eX,{chartName:"AreaChart",defaultTooltipEventType:"axis",validateTooltipEventTypes:tX,tooltipPayloadSearcher:NW,categoricalChartProps:e,ref:t}));const nX="rgba(130,130,150,0.14)",F2="rgba(130,130,150,0.85)";function iX(e){if(e<=0)return 10;const t=Math.pow(10,Math.floor(Math.log10(e))),r=e/t;return(r<=1?1:r<=2?2:r<=5?5:10)*t}function zO(e,t){return`${t==="%"?Math.round(e):e>=1e3?`${(e/1e3).toFixed(1)}k`:Math.round(e).toString()}${t}`}function aX({active:e,payload:t,unit:r}){return!e||!(t!=null&&t.length)?null:l.jsx("div",{className:"rounded-lg border border-border/70 bg-popover/95 px-3 py-2 shadow-xl backdrop-blur",children:l.jsx("div",{className:"space-y-1",children:t.map(n=>l.jsxs("div",{className:"flex items-center gap-2 text-[11px] font-mono",children:[l.jsx("span",{className:"h-2 w-2 rounded-full",style:{background:n.color}}),l.jsx("span",{className:"uppercase tracking-wider text-muted-foreground",children:n.name}),l.jsx("span",{className:"ml-auto pl-3 font-bold tabular-nums text-foreground",children:zO(n.value,r)})]},n.dataKey))})})}function FO({data:e,series:t,unit:r="%",yMode:n="percent",height:a=176}){const o=e.reduce((u,f)=>t.reduce((h,m)=>Math.max(h,Number(f[m.key])||0),u),0),c=n==="percent"?Math.min(100,Math.max(25,Math.ceil(o*1.2/25)*25)):Math.max(iX(o*1.15),10);return l.jsx("div",{style:{height:a},className:"w-full",children:l.jsx(Qz,{width:"100%",height:"100%",children:l.jsxs(rX,{data:e,margin:{top:8,right:6,bottom:0,left:-12},children:[l.jsx("defs",{children:t.map(u=>l.jsxs("linearGradient",{id:`grad-${u.key}`,x1:"0",y1:"0",x2:"0",y2:"1",children:[l.jsx("stop",{offset:"0%",stopColor:u.color,stopOpacity:.22}),l.jsx("stop",{offset:"100%",stopColor:u.color,stopOpacity:0})]},u.key))}),l.jsx(cO,{vertical:!1,stroke:nX}),l.jsx(jO,{dataKey:"t",hide:!0}),l.jsx(SO,{domain:[0,c],ticks:[0,c/2,c],tickFormatter:u=>zO(u,r),width:42,axisLine:!1,tickLine:!1,tick:{fontSize:10,fill:F2}}),l.jsx(eK,{content:l.jsx(aX,{unit:r}),cursor:{stroke:F2,strokeOpacity:.4,strokeDasharray:"3 3"}}),t.map(u=>l.jsx(wO,{type:"monotone",dataKey:u.key,name:u.label,stroke:u.color,strokeWidth:2,fill:`url(#grad-${u.key})`,dot:!1,activeDot:{r:3,strokeWidth:0},isAnimationActive:!1,connectNulls:!0},u.key))]})})})}const oX=[{key:"cpu",label:"CPU",color:"#2dd4bf"},{key:"ram",label:"RAM",color:"#38bdf8"},{key:"gpu",label:"GPU",color:"#a78bfa"},{key:"disk",label:"Disk",color:"#fbbf24"}];function BO(){var c,u,f,h;const{sys:e,hist:t}=KD(),r=!!(e!=null&&e.gpu&&e.gpu.busy_percent!=null&&e.gpu.gtt_used!=null&&e.gpu.gtt_total!=null),n=oX.filter(m=>m.key!=="gpu"||r),a={cpu:(c=e==null?void 0:e.cpu)==null?void 0:c.percent,ram:(u=e==null?void 0:e.ram)==null?void 0:u.percent,gpu:r?e.gpu.busy_percent:null,disk:(f=e==null?void 0:e.disk)==null?void 0:f.percent},o={cpu:(h=e==null?void 0:e.cpu)!=null&&h.cores?`${e.cpu.cores} Cores`:"",ram:e?`${aa(e.ram.used)}/${aa(e.ram.total)} GB`:"",gpu:r?`${aa(e.gpu.gtt_used)}/${aa(e.gpu.gtt_total)} GB`:"",disk:e!=null&&e.disk?`${aa(e.disk.used)}/${aa(e.disk.total)} GB`:""};return l.jsxs("div",{className:"flex flex-col justify-between rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"mb-3 flex items-center gap-2",children:[l.jsx(Hn,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"System-Status"}),l.jsxs("span",{className:"ml-1 inline-flex items-center gap-1 text-[10px] font-medium text-muted-foreground/70",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"})," live"]})]}),e?l.jsxs(l.Fragment,{children:[l.jsx("div",{className:"mb-2 grid grid-cols-2 gap-x-4 gap-y-1.5",children:n.map(m=>l.jsxs("div",{className:"flex min-w-0 items-center gap-1.5",children:[l.jsx("span",{className:"h-2 w-2 shrink-0 rounded-full",style:{background:m.color}}),l.jsx("span",{className:"shrink-0 text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:m.label}),l.jsxs("span",{className:"shrink-0 font-mono text-xs font-bold tabular-nums text-foreground",children:[Math.round(a[m.key]??0),"%"]}),o[m.key]&&l.jsx("span",{className:"truncate font-mono text-[10px] text-muted-foreground/60",children:o[m.key]})]},m.key))}),l.jsx(FO,{data:t,series:n,unit:"%",yMode:"percent",height:176})]}):l.jsx("div",{className:"flex h-44 items-center justify-center text-xs text-muted-foreground",children:"Lade Systemdaten…"})]}),(e==null?void 0:e.temp)&&(e.temp.cpu||e.temp.gpu)&&l.jsxs("div",{className:"mt-3 flex gap-4 border-t border-border/30 pt-3 font-mono text-xs text-muted-foreground/80",children:[e.temp.cpu!=null&&l.jsxs("span",{children:["CPU Temp: ",e.temp.cpu," °C"]}),e.temp.gpu!=null&&l.jsxs("span",{children:["GPU Temp: ",e.temp.gpu," °C"]})]})]})}function du({label:e,value:t,tone:r}){return l.jsxs("div",{className:ee("flex items-center justify-between rounded-lg border px-3 py-1.5 text-xs",r==="alert"?"border-amber-500/30 bg-amber-500/5 font-semibold text-amber-400":r==="accent"?"border-primary/30 bg-primary/5 font-semibold text-primary":"border-border/30 bg-background/25 text-muted-foreground"),children:[l.jsx("span",{className:"flex items-center gap-1.5",children:e}),l.jsx("span",{className:"font-mono text-[10px]",children:t})]})}function sX(){var r;const{data:e}=vh(3e3),t=()=>window.dispatchEvent(new CustomEvent("open-system-drawer",{detail:{tab:"maintenance"}}));return l.jsxs("div",{className:"flex flex-col justify-between rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15",children:[l.jsxs("div",{className:"space-y-4",children:[l.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-2 border-b border-border/20 pb-2",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(D4,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"Updates & Pflege"})]}),(e==null?void 0:e.last_check)&&l.jsxs("span",{className:"font-mono text-[9px] text-muted-foreground/80",children:["Zuletzt gesucht: ",new Date(e.last_check*1e3).toLocaleString("de-DE",{day:"2-digit",month:"2-digit",hour:"2-digit",minute:"2-digit"})]})]}),e?l.jsxs("div",{className:"space-y-1.5",children:[l.jsx(du,{label:"OS-Pakete",tone:e.os>0?"alert":"muted",value:e.os>0?`${e.os} verfügbar`:"aktuell"}),l.jsx(du,{label:"Inferenz-Engine (llama.cpp)",tone:e.engine>0?"alert":"muted",value:e.engine>0?"Update verfügbar":"aktuell"}),l.jsx(du,{label:"Router (llama-swap)",tone:e.swap>0?"alert":"muted",value:e.swap>0?"Update verfügbar":"aktuell"}),l.jsx(du,{label:"Modell-Upgrades",tone:e.models>0?"accent":"muted",value:e.models>0?`${e.models} verfügbar`:"aktuell"}),(r=e.components)==null?void 0:r.map(n=>l.jsx(du,{tone:n.update===!0?"alert":"muted",label:l.jsxs(l.Fragment,{children:[n.name,n.reachable===!1&&l.jsx("span",{className:"text-[8px] font-bold uppercase text-red-400/80",children:"offline"})]}),value:n.update===!0?`Update: ${n.latest}`:n.update===!1?"aktuell":n.latest?`neueste: ${n.latest}`:"—"},n.key))]}):l.jsx("div",{className:"flex h-24 items-center justify-center text-xs text-muted-foreground",children:"Lade Updates..."})]}),l.jsxs("button",{onClick:t,className:"mt-4 flex h-9 w-full items-center justify-center gap-1.5 rounded-lg bg-primary text-xs font-semibold text-primary-foreground shadow-md shadow-primary/10 transition-all hover:opacity-90 cursor-pointer",children:["Updates verwalten & Pflege ",l.jsx(ch,{className:"h-3.5 w-3.5"})]})]})}function UO({type:e,title:t,message:r,defaultValue:n,autoValue:a,autoLabel:o,onConfirm:c,onCancel:u}){const f=y.useRef(null);return l.jsx("div",{className:"fixed inset-0 z-[99] bg-black/60 backdrop-blur-sm flex items-center justify-center p-4 overscroll-contain",role:"dialog","aria-modal":"true","aria-label":t,children:l.jsxs("div",{className:"w-full max-w-sm rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[l.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary",children:t}),l.jsx("button",{onClick:u||(()=>c()),"aria-label":"Schließen",className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:l.jsx(Wn,{className:"h-4 w-4","aria-hidden":"true"})})]}),l.jsx("p",{className:"text-xs text-muted-foreground leading-relaxed",children:r}),e==="prompt"&&l.jsxs("div",{className:"flex gap-2",children:[l.jsx("input",{ref:f,type:"text",defaultValue:n,"aria-label":t,className:"flex-1 h-9 px-3 text-xs bg-background/40 border border-border/60 rounded-lg outline-none focus:border-primary transition-colors text-foreground",autoFocus:!0,onKeyDown:h=>{var m;h.key==="Enter"&&c((m=f.current)==null?void 0:m.value)}}),a!==void 0&&l.jsx("button",{type:"button",onClick:()=>{f.current&&(f.current.value=a)},title:"Setup-bewussten Optimalwert eintragen",className:"h-9 px-3 shrink-0 text-xs font-semibold text-primary border border-primary/50 bg-primary/10 hover:bg-primary/20 rounded-lg transition-colors cursor-pointer",children:o||"Auto"})]}),l.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[(e==="confirm"||e==="prompt")&&l.jsx("button",{onClick:u,className:"h-8 px-4 flex items-center justify-center text-xs font-semibold text-muted-foreground border border-border/60 bg-background/20 hover:bg-accent rounded-lg transition-colors cursor-pointer",children:"Abbrechen"}),l.jsx("button",{onClick:()=>{var m;const h=e==="prompt"?(m=f.current)==null?void 0:m.value:void 0;c(h)},className:"h-8 px-4 flex items-center justify-center text-xs font-semibold text-primary-foreground bg-primary hover:bg-primary/95 rounded-lg transition-colors cursor-pointer",children:e==="confirm"?"Ja, fortfahren":e==="prompt"?"Übernehmen":"OK"})]})]})})}function Aa(){const[e,t]=y.useState(null),r=y.useCallback(()=>t(null),[]),n=y.useCallback((u,f,h)=>{t({type:"alert",title:u,message:f,onConfirm:()=>{t(null),h==null||h()}})},[]),a=y.useCallback((u,f,h,m)=>{t({type:"confirm",title:u,message:f,onConfirm:()=>{t(null),h()},onCancel:()=>{t(null),m==null||m()}})},[]),o=y.useCallback((u,f,h,m,g,v)=>{t({type:"prompt",title:u,message:f,defaultValue:h,autoValue:v==null?void 0:v.autoValue,autoLabel:v==null?void 0:v.autoLabel,onConfirm:b=>{t(null),m(b)},onCancel:()=>{t(null),g==null||g()}})},[]),c=e?l.jsx(UO,{...e}):null;return{showAlert:n,showConfirm:a,showPrompt:o,close:r,dialogElement:c}}function lX(){const e=Yn(),{data:t}=_y(3e3),{data:r}=Ni(),{showAlert:n,dialogElement:a}=Aa(),[o,c]=y.useState(!1),u=(r==null?void 0:r.models)??[];async function f(h){try{await Se("/api/agent/brain",{method:"POST",body:JSON.stringify({model:h})}),n("Erfolgreich",`Hermes-Gehirn wurde auf '${h}' geändert. Der Gateway-Dienst wurde neu gestartet.`),e.invalidateQueries({queryKey:Ve.agentStatus}),c(!1)}catch(m){n("Fehler",`Fehler beim Wechseln des Gehirns: ${m.message}`)}}return l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15 flex flex-col justify-between",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center justify-between mb-4",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(wn,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold tracking-wide uppercase text-foreground",children:"Hermes Agent"})]}),(t==null?void 0:t.terminal_url)&&l.jsxs("a",{href:Gs(t.terminal_url),target:"_blank",rel:"noopener",className:ee("flex items-center gap-1 px-3 py-1 rounded-lg text-xs font-medium transition-all",t.terminal_reachable?"bg-primary text-primary-foreground hover:opacity-90 shadow-md shadow-primary/20":"border border-border text-muted-foreground"),children:[l.jsx(Hs,{className:"h-3 w-3"})," Terminal öffnen"]})]}),t?l.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[l.jsxs("div",{className:"p-3 bg-background/20 rounded-xl border border-border/40",children:[l.jsx("div",{className:"text-[10px] text-muted-foreground uppercase font-semibold",children:"Gateway"}),l.jsxs("div",{className:"flex items-center gap-2 mt-1",children:[l.jsx("span",{className:ee("h-2 w-2 rounded-full",t.gateway_reachable?"bg-emerald-500 animate-pulse":"bg-amber-500")}),l.jsx("span",{className:"text-xs font-medium",children:t.gateway_reachable?"Online":"Offline"})]})]}),l.jsxs("div",{className:"p-3 bg-background/20 rounded-xl border border-border/40",children:[l.jsx("div",{className:"text-[10px] text-muted-foreground uppercase font-semibold",children:"Terminal"}),l.jsxs("div",{className:"flex items-center gap-2 mt-1",children:[l.jsx("span",{className:ee("h-2 w-2 rounded-full",t.terminal_reachable?"bg-emerald-500 animate-pulse":"bg-amber-500")}),l.jsx("span",{className:"text-xs font-medium",children:t.terminal_reachable?"Online":"Offline"})]})]}),l.jsxs("div",{onClick:()=>c(!0),className:"p-3 bg-background/20 rounded-xl border border-border/40 hover:border-primary/45 hover:bg-background/30 transition-all duration-300 cursor-pointer",children:[l.jsxs("div",{className:"flex justify-between items-center",children:[l.jsx("span",{className:"text-[10px] text-muted-foreground uppercase font-semibold",children:"Gehirn"}),l.jsx(Hn,{className:"h-3 w-3 text-primary"})]}),l.jsxs("div",{className:"text-xs font-medium mt-1 font-mono text-primary truncate flex items-center gap-1",children:[l.jsx(jy,{className:"h-3 w-3 shrink-0"}),t.brain_model||"auto"]})]}),l.jsxs("div",{className:"p-3 bg-background/20 rounded-xl border border-border/40",children:[l.jsxs("div",{className:"flex justify-between items-center",children:[l.jsx("span",{className:"text-[10px] text-muted-foreground uppercase font-semibold",children:"Verdrahtung"}),l.jsx(Qu,{className:"h-3 w-3 text-primary"})]}),l.jsxs("div",{className:"text-[10px] font-mono mt-1 space-y-0.5 text-muted-foreground",children:[l.jsxs("div",{children:["Config: ",t.has_config?l.jsx("span",{className:"text-emerald-400",children:"✓"}):"—"]}),l.jsxs("div",{children:["Skills: ",t.has_skills?l.jsx("span",{className:"text-emerald-400",children:"✓"}):"—"]}),l.jsxs("div",{children:["Memory: ",t.has_memories?l.jsx("span",{className:"text-emerald-400",children:"✓"}):"—"]})]})]})]}):l.jsx("div",{className:"h-28 flex items-center justify-center text-xs text-muted-foreground",children:"Lade Agenten-Status…"})]}),t&&l.jsxs("div",{className:"mt-3 border-t border-border/30 pt-3 space-y-1.5",children:[l.jsxs("div",{className:"flex items-center justify-between text-[10px] text-muted-foreground",children:[l.jsx("span",{children:"Telegram"}),l.jsx("span",{className:ee("font-semibold",t.telegram_enabled?"text-emerald-400":""),children:t.telegram_enabled?"aktiv":"nicht konfiguriert"})]}),l.jsxs("div",{className:"flex items-center justify-between text-[10px] text-muted-foreground",children:[l.jsx("span",{children:"MCP-Server"}),l.jsxs("span",{className:"font-semibold text-foreground",children:[t.mcp_server_count??0," verbunden"]})]}),l.jsxs("div",{className:"flex items-center justify-between text-[10px] text-muted-foreground",children:[l.jsx("span",{children:"PC Executor"}),l.jsx("span",{className:ee("font-semibold",t.pc_executor_reachable?"text-emerald-400":""),children:t.pc_executor_reachable?"erreichbar":"nicht verbunden"})]})]}),t&&o&&l.jsx("div",{className:"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm flex items-center justify-center p-4",children:l.jsxs("div",{className:"w-full max-w-md rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[l.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[l.jsxs("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary flex items-center gap-1.5",children:[l.jsx(Hn,{className:"h-4 w-4"}),l.jsx("span",{children:"Hermes-Gehirn konfigurieren"})]}),l.jsx("button",{onClick:()=>c(!1),className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:l.jsx(Wn,{className:"h-4 w-4"})})]}),l.jsxs("p",{className:"text-xs text-muted-foreground leading-relaxed",children:['Das „Gehirn" ist das primäre LLM für Hermes. Wähle ein Modell aus deiner Bibliothek oder nutze ein Gateway-Alias (',l.jsx("code",{className:"text-primary font-semibold",children:"auto"})," / ",l.jsx("code",{className:"text-primary font-semibold",children:"fast"})," / ",l.jsx("code",{className:"text-primary font-semibold",children:"heavy"}),"):"]}),l.jsx("div",{className:"space-y-1.5 max-h-60 overflow-y-auto pr-1",children:["auto","fast","heavy",...u.map(h=>{var m;return((m=h.name.split("/").pop())==null?void 0:m.replace(".gguf",""))||h.name})].map(h=>{const m=["auto","fast","heavy"].includes(h);return l.jsxs("button",{onClick:()=>f(h),className:ee("w-full text-left px-3 py-2.5 rounded-lg text-xs hover:bg-accent flex items-center justify-between font-mono cursor-pointer border border-border/30",t.brain_model===h||!t.brain_model&&h==="auto"?"text-primary font-bold bg-primary/10 border-primary/30":"text-foreground bg-background/20"),children:[l.jsxs("div",{className:"flex flex-col text-left",children:[l.jsx("span",{className:"font-semibold truncate max-w-[280px]",children:h}),l.jsx("span",{className:"text-[9px] text-muted-foreground mt-0.5",children:m?"Gateway Routing Alias":"Installiertes GGUF Modell"})]}),(t.brain_model===h||!t.brain_model&&h==="auto")&&l.jsx(sr,{className:"h-4 w-4 shrink-0 text-primary"})]},h)})})]})}),a]})}function uX(){const e=Yn(),{data:t=[]}=vv({limit:3}),[r,n]=y.useState(""),[a,o]=y.useState("stable"),[c,u]=y.useState(!1);async function f(){if(!(!r.trim()||c)){u(!0);try{await Se("/api/memory",{method:"POST",body:JSON.stringify({content:r,category:a,source:"dashboard"})}),n(""),e.invalidateQueries({queryKey:["memory"]})}catch(h){console.error(h)}finally{u(!1)}}}return l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15 flex flex-col justify-between",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center gap-2 mb-4",children:[l.jsx(Ao,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold tracking-wide uppercase text-foreground",children:"Gedächtnis"})]}),l.jsxs("div",{className:"space-y-3",children:[l.jsx("textarea",{value:r,onChange:h=>n(h.target.value),"aria-label":"Fakt oder Regel im Gedächtnis speichern",placeholder:"Fakt / Regel im Pool speichern…",rows:2,className:"w-full resize-none rounded-xl border border-border/50 bg-background/30 p-2 text-[10px] outline-none focus:ring-1 focus:ring-primary transition-all leading-normal"}),l.jsxs("div",{className:"flex items-center gap-2 justify-between",children:[l.jsxs("select",{value:a,onChange:h=>o(h.target.value),"aria-label":"Kategorie",className:"h-7 rounded-lg border border-border/50 bg-background/50 px-2 text-[10px] outline-none cursor-pointer",children:[l.jsx("option",{value:"stable",children:"🔵 Fakt"}),l.jsx("option",{value:"instruction",children:"📋 Regel"}),l.jsx("option",{value:"user",children:"👤 User"}),l.jsx("option",{value:"versioned",children:"🟡 Version"})]}),l.jsxs("button",{onClick:f,disabled:!r.trim()||c,className:"flex h-7 items-center gap-1 rounded-lg bg-primary px-3 text-[10px] font-semibold text-primary-foreground hover:opacity-90 disabled:opacity-50 transition-all cursor-pointer",children:[l.jsx(df,{className:"h-3.5 w-3.5"})," Speichern"]})]})]}),l.jsxs("div",{className:"mt-3.5 space-y-1.5",children:[l.jsx("div",{className:"text-[9px] text-muted-foreground uppercase font-bold tracking-wider",children:"Zuletzt gespeichert:"}),l.jsx("div",{className:"max-h-20 overflow-y-auto space-y-1 pr-1 scrollbar-thin",children:t.length===0?l.jsx("div",{className:"text-[10px] text-muted-foreground/75 py-1",children:"Keine Einträge vorhanden."}):t.map(h=>l.jsxs("div",{className:"text-[10px] bg-background/10 border border-border/30 rounded p-1.5 flex items-start gap-1.5",children:[l.jsx("span",{className:"shrink-0 text-[8px] font-mono text-muted-foreground/80 px-1 py-0.5 rounded bg-muted/20",children:h.category}),l.jsx("span",{className:"truncate flex-1 text-muted-foreground hover:text-foreground transition-colors",title:h.content,children:h.content})]},h.id))})]})]}),l.jsx("div",{className:"mt-4 text-[10px] text-muted-foreground/80 border-t border-border/30 pt-3",children:"Steht allen Clients per MCP zur Verfügung."})]})}const B2=[{key:"prompt",label:"Prompt",color:"#f59e0b"},{key:"completion",label:"Antwort",color:"#2dd4bf"}];function HO(){const{data:e}=Oy(3e3),t=HD(),r=t[t.length-1],n=r?Math.round(r.prompt+r.completion):0;return l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15",children:[l.jsxs("div",{className:"mb-3 flex items-start justify-between gap-3",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(uh,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"Token-Durchsatz"}),l.jsxs("span",{className:"ml-1 inline-flex items-center gap-1 text-[10px] font-medium text-muted-foreground/70",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"})," live"]})]}),e&&l.jsxs("div",{className:"mt-2 flex items-baseline gap-2",children:[l.jsx("span",{className:"font-space text-3xl font-bold tracking-tight text-foreground tabular-nums",children:n.toLocaleString("de-DE")}),l.jsx("span",{className:"text-xs text-muted-foreground",children:"tok/s aktuell"})]}),e&&l.jsxs("div",{className:"mt-0.5 space-y-0.5 font-mono text-[11px] text-muted-foreground/70",children:[l.jsxs("div",{children:[e.total_tokens.toLocaleString("de-DE")," Tokens gesamt · ",l.jsxs("span",{className:"text-emerald-400/90",children:[e.saved_eur.toLocaleString("de-DE",{minimumFractionDigits:2})," € gespart"]})]}),l.jsxs("div",{className:"text-muted-foreground/55",children:["Input ",e.prompt_tokens.toLocaleString("de-DE")," · Output ",e.completion_tokens.toLocaleString("de-DE")]})]})]}),l.jsx("div",{className:"flex shrink-0 flex-col items-end gap-1.5 pt-1",children:B2.map(a=>l.jsxs("div",{className:"flex items-center gap-1.5",children:[l.jsx("span",{className:"h-2 w-2 rounded-full",style:{background:a.color}}),l.jsx("span",{className:"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:a.label}),l.jsx("span",{className:"font-mono text-xs font-bold tabular-nums text-foreground",children:Math.round((r==null?void 0:r[a.key])??0)})]},a.key))})]}),e?l.jsx(FO,{data:t,series:B2,unit:" tok/s",yMode:"auto",height:150}):l.jsx("div",{className:"flex h-[150px] items-center justify-center text-xs text-muted-foreground",children:"Lade Durchsatz…"}),l.jsx("div",{className:"mt-2 border-t border-border/30 pt-2 text-[10px] text-muted-foreground/70",children:"Durchsatz aus dem Gateway abgeleitet (Prefill vs. Generierung). Flach bei Leerlauf."})]})}function cX(){const{data:e}=NE(3e3),{showAlert:t,dialogElement:r}=Aa(),[n,a]=y.useState({});async function o(c){a(u=>({...u,[c]:!0}));try{const u=await Se("/api/maintenance/restart",{method:"POST",body:JSON.stringify({service:c})});u.ok||t("Fehler",`Neustart fehlgeschlagen: ${u.err||"Unbekannt"}`)}catch(u){t("Fehler",`Fehler: ${u.message}`)}finally{a(u=>({...u,[c]:!1}))}}return l.jsxs("div",{className:"flex flex-col rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15",children:[l.jsxs("div",{className:"mb-3 flex items-center justify-between",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(ff,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"Dienste"})]}),l.jsx("button",{onClick:()=>window.dispatchEvent(new CustomEvent("open-system-drawer",{detail:{tab:"logs"}})),className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground transition-colors hover:text-primary cursor-pointer",children:"Logs / Pflege"})]}),e?l.jsxs("div",{className:"flex flex-1 flex-col",children:[l.jsx("div",{className:"space-y-1.5",children:e.services.map(c=>l.jsxs("div",{className:"group flex items-center justify-between gap-2 rounded-xl border border-border/30 bg-background/20 p-2.5",children:[l.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[l.jsx("span",{className:ee("h-2.5 w-2.5 shrink-0 rounded-full ring-2 ring-black/40",c.ok?"bg-emerald-500":"bg-amber-500")}),l.jsxs("div",{className:"min-w-0",children:[l.jsx("div",{className:"truncate text-xs font-bold text-foreground",children:c.name}),l.jsx("div",{className:"truncate font-mono text-[9px] text-muted-foreground/60",children:c.url})]})]}),l.jsx("button",{onClick:()=>o(c.name),disabled:n[c.name],className:"flex h-7 w-7 shrink-0 items-center justify-center rounded-lg border border-border/40 text-muted-foreground opacity-0 transition-all hover:bg-primary/5 hover:text-primary group-hover:opacity-100",title:"Dienst neu starten",children:l.jsx(Xa,{className:ee("h-3.5 w-3.5",n[c.name]&&"animate-spin")})})]},c.name))}),l.jsxs("div",{className:"mt-auto flex flex-wrap gap-3 border-t border-border/20 pt-2.5 text-[10px] font-semibold text-muted-foreground",children:[l.jsxs("a",{href:Gs(e.links.engine_ui),target:"_blank",rel:"noopener",className:"flex items-center gap-1 rounded px-1.5 py-0.5 text-primary transition-colors hover:bg-primary/10",children:[l.jsx(Hs,{className:"h-3 w-3"})," Engine"]}),l.jsxs("a",{href:Gs(e.links.gateway),target:"_blank",rel:"noopener",className:"flex items-center gap-1 rounded px-1.5 py-0.5 text-primary transition-colors hover:bg-primary/10",children:[l.jsx(Hs,{className:"h-3 w-3"})," Gateway"]})]})]}):l.jsx("div",{className:"flex h-24 items-center justify-center text-xs text-muted-foreground",children:"Lade Dienste…"}),r]})}const Hg=[{key:"stt",label:"STT",hint:"Sprache → Text"},{key:"vision",label:"Bildschirm-Sicht",hint:"Vision-Beschreibung"},{key:"chat_ttfb",label:"Chat-TTFB",hint:"Zeit bis 1. Token"},{key:"tts",label:"TTS",hint:"Text → Sprache"}];function qd(e){return e==null?"—":e>=1e3?`${(e/1e3).toFixed(2)} s`:`${Math.round(e)} ms`}function dX({stat:e,label:t,hint:r,maxP95:n}){const a=!!e&&e.count>0,o=a&&e.p95_ms&&n>0?Math.max(4,Math.min(100,e.p95_ms/n*100)):0;return l.jsxs("div",{className:"space-y-1.5",children:[l.jsxs("div",{className:"flex items-baseline justify-between gap-2",children:[l.jsxs("div",{className:"flex items-baseline gap-2 min-w-0",children:[l.jsx("span",{className:"text-xs font-semibold text-foreground",children:t}),l.jsx("span",{className:"truncate text-[10px] text-muted-foreground/60",children:r})]}),a?l.jsx("span",{className:"shrink-0 font-mono text-sm font-bold tabular-nums text-foreground",children:qd(e.p50_ms)}):l.jsx("span",{className:"shrink-0 text-[10px] italic text-muted-foreground/50",children:"noch keine Messungen"})]}),l.jsx("div",{className:"h-1.5 w-full overflow-hidden rounded-full bg-background/50 border border-border/30",children:l.jsx("div",{className:"h-full rounded-full bg-gradient-to-r from-teal-500 to-indigo-500 transition-all duration-500",style:{width:`${o}%`}})}),a&&l.jsxs("div",{className:"flex items-center gap-3 font-mono text-[10px] text-muted-foreground/65",children:[l.jsxs("span",{children:["p50 ",qd(e.p50_ms)]}),l.jsxs("span",{children:["p95 ",qd(e.p95_ms)]}),l.jsxs("span",{children:["zuletzt ",qd(e.last_ms)]}),l.jsxs("span",{className:"text-muted-foreground/45",children:["· n=",e.count]})]})]})}function WO(){const{data:e}=ID(5e3),t=Math.max(1,...Hg.map(n=>{var a;return((a=e==null?void 0:e[n.key])==null?void 0:a.p95_ms)??0})),r=Hg.some(n=>{var a;return(((a=e==null?void 0:e[n.key])==null?void 0:a.count)??0)>0});return l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15",children:[l.jsxs("div",{className:"mb-4 flex items-center gap-2",children:[l.jsx(_N,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"Sprach-Latenz"}),l.jsxs("span",{className:"ml-1 inline-flex items-center gap-1 text-[10px] font-medium text-muted-foreground/70",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"})," live"]})]}),l.jsx("div",{className:"grid gap-4 sm:grid-cols-2",children:Hg.map(n=>l.jsx(dX,{stat:e==null?void 0:e[n.key],label:n.label,hint:n.hint,maxP95:t},n.key))}),l.jsx("div",{className:"mt-4 border-t border-border/30 pt-2 text-[10px] text-muted-foreground/70",children:r?"Server-seitige Dauer je Pipeline-Stufe (p50 prominent). Rollender Schnitt über die letzten Turns; Reset bei Neustart.":"Noch keine Voice-Turns gemessen — sprich einmal über den „Sprechen“-Tab, dann erscheinen hier STT/Vision/Chat/TTS."})]})}const KO=[{role:"hermes",label:"Lucys Hirn",short:"Hirn",icon:Ao,desc:"Lucys Alltags-Verstand — denkt und redet mit dir. Immer bereit.",tone:"bg-indigo-500/15 text-indigo-400 border-indigo-500/25",protected:!0},{role:"embed",label:"Lucys Gedächtnis",short:"Gedächtnis",icon:CN,desc:"Merkt sich Wichtiges und findet es später wieder.",tone:"bg-emerald-500/15 text-emerald-400 border-emerald-500/25",protected:!0},{role:"vision",label:"Lucys Augen",short:"Augen",icon:uf,desc:"Sieht Bilder und Screenshots und beschreibt, was drauf ist.",tone:"bg-pink-500/15 text-pink-400 border-pink-500/25"},{role:"heavy",label:"Großes Hirn",short:"Groß",icon:Y3,desc:"Das schwere Geschütz — wird für besonders knifflige Fragen dazugeholt.",tone:"bg-amber-500/15 text-amber-400 border-amber-500/25"},{role:"coder-lite",label:"Programmierer (schnell)",short:"Code schnell",icon:Bs,desc:"Schnelles Programmieren im Alltag.",tone:"bg-violet-500/15 text-violet-400 border-violet-500/25"},{role:"coder",label:"Programmierer (gründlich)",short:"Code gründlich",icon:Bs,desc:"Schreibt und prüft Code besonders sorgfältig — für schwere Coding-Aufgaben.",tone:"bg-fuchsia-500/15 text-fuchsia-400 border-fuchsia-500/25"},{role:"scout",label:"Späher",short:"Späher",icon:B4,desc:"Schneller erster Blick und grobe Einschätzung.",tone:"bg-teal-500/15 text-teal-400 border-teal-500/25"}],GO=KO.map(e=>e.role),U2=Object.fromEntries(KO.map(e=>[e.role,e])),H2=e=>({role:e||"?",label:e||"unbekannt",short:e||"?",icon:Ao,desc:"Rolle ohne hinterlegten Klartext-Namen.",tone:"bg-slate-500/15 text-slate-300 border-slate-500/25"}),fX={fast:"hermes",coder_lite:"coder-lite"};function mr(e){return e&&(U2[e]||U2[fX[e]])||H2(e)}function io({role:e,dense:t=!1,className:r}){const n=mr(e),a=n.icon;return l.jsxs("span",{className:ee("inline-flex items-center gap-1 rounded px-1.5 py-0.5 text-[10px] font-semibold border tracking-wide",n.tone,r),title:`${n.desc} (${n.role})`,children:[l.jsx(a,{className:"h-3 w-3 shrink-0","aria-hidden":"true"}),t?n.short:n.label]})}function hX({fit:e}){const t={perfect:"bg-emerald-500/15 text-emerald-400 border border-emerald-500/20",marginal:"bg-amber-500/15 text-amber-400 border border-amber-500/20",too_tight:"bg-red-500/15 text-red-400 border border-red-500/20"}[e.level];return l.jsxs("span",{className:ee("rounded px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wider font-mono",t),children:[e.text," • ",e.req_gb," GB RAM"]})}function W2(e){const t=e.toLowerCase();return t.includes("qwen")?{name:"Qwen",color:"bg-purple-500/20 text-purple-300 border-purple-500/30",initial:"Q"}:t.includes("gemma")?{name:"Gemma",color:"bg-blue-500/20 text-blue-300 border-blue-500/30",initial:"G"}:t.includes("llama")?{name:"Llama",color:"bg-red-500/20 text-red-300 border-red-500/30",initial:"🦙"}:t.includes("mistral")||t.includes("mixtral")?{name:"Mistral",color:"bg-orange-500/20 text-orange-300 border-orange-500/30",initial:"M"}:t.includes("deepseek")?{name:"DeepSeek",color:"bg-cyan-500/20 text-cyan-300 border-cyan-500/30",initial:"D"}:t.includes("hermes")||t.includes("nous")?{name:"Hermes",color:"bg-amber-500/20 text-amber-300 border-amber-500/30",initial:"H"}:t.includes("phi")?{name:"Phi",color:"bg-emerald-500/20 text-emerald-300 border-emerald-500/30",initial:"Φ"}:{name:"Other",color:"bg-slate-500/20 text-slate-300 border-slate-500/30",initial:"AI"}}function mX(){var b,j,k;const{data:e}=Ni(2e3),{data:t}=Oy(2e3),{data:r}=Po(),n=(e==null?void 0:e.models)??[],a=(e==null?void 0:e.running)??[],o=((b=r==null?void 0:r.gpu)==null?void 0:b.gtt_total)||((j=r==null?void 0:r.gpu)==null?void 0:j.vram_total)||0,c=((k=r==null?void 0:r.gpu)==null?void 0:k.gtt_used)||0,u=o>0?Math.min(100,c/o*100):0,f=u>=88?"bg-red-500":u>=70?"bg-amber-500":"bg-teal-500",h=u>=88?"text-red-400":u>=70?"text-amber-400":"text-foreground",m=y.useRef(null),[g,v]=y.useState(!1);return y.useEffect(()=>{if(!t)return;const S=t.total_tokens;if(m.current!==null&&S>m.current){v(!0);const N=setTimeout(()=>v(!1),4e3);return m.current=S,()=>clearTimeout(N)}m.current=S},[t==null?void 0:t.total_tokens]),l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/15 flex flex-col",children:[l.jsxs("div",{className:"flex items-center justify-between mb-4",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(lf,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold tracking-wide uppercase text-foreground",children:"Modelle"})]}),l.jsxs("span",{className:ee("flex items-center gap-1.5 text-[10px] font-bold uppercase tracking-wider font-mono px-2 py-0.5 rounded-full border transition-colors",g?"bg-emerald-500/10 text-emerald-400 border-emerald-500/30":"bg-background/30 text-muted-foreground/70 border-border/40"),children:[g?l.jsx(xa,{className:"h-3 w-3 animate-pulse"}):l.jsx(N4,{className:"h-3 w-3"}),g?"Inferenz aktiv":"Idle"]})]}),o>0&&l.jsxs("div",{className:"mb-4",children:[l.jsxs("div",{className:"flex items-center justify-between text-[10px] font-mono text-muted-foreground/80 mb-1",children:[l.jsx("span",{className:"uppercase tracking-wider font-semibold",children:"Speicher-Pool"}),l.jsxs("span",{children:[l.jsx("span",{className:ee("font-bold",h),children:aa(c)})," / ",aa(o)," GB belegt"]})]}),l.jsx("div",{className:"h-1.5 w-full rounded-full bg-background/50 border border-border/30 overflow-hidden",children:l.jsx("div",{className:ee("h-full rounded-full transition-all duration-500",f),style:{width:`${u}%`}})})]}),l.jsx("div",{className:"space-y-2 flex-1",children:GO.map(S=>{var A;const N=n.find(P=>P.role===S),E=N?a.includes(N.name):!1;return l.jsxs("div",{className:ee("flex items-center justify-between gap-2 p-2 rounded-xl border transition-all duration-300",E?"border-emerald-500/30 bg-emerald-500/5 shadow-sm shadow-emerald-500/5":N?"border-primary/20 bg-primary/5":"border-border/30 bg-background/10 opacity-60"),children:[l.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[l.jsx(io,{role:S,className:"shrink-0"}),l.jsxs("div",{className:"flex flex-col min-w-0",children:[l.jsx("span",{className:"text-xs font-semibold truncate font-mono text-foreground",children:N?(A=N.name.split("/").pop())==null?void 0:A.replace(/\.gguf$/i,""):"nicht zugewiesen"}),N&&l.jsxs("div",{className:"flex gap-1 items-center mt-0.5 flex-wrap text-muted-foreground/70",children:[l.jsx("span",{className:"text-[9px] font-mono",children:Lr(N.size_bytes)}),N.prompt_cache&&l.jsx("span",{className:"text-[7px] leading-none font-mono font-bold bg-cyan-500/10 text-cyan-400 border border-cyan-500/20 px-1 py-0.5 rounded",title:"Prompt Caching aktiv",children:"PC"}),N.spec_active&&l.jsx("span",{className:"text-[7px] leading-none font-mono font-bold bg-emerald-500/10 text-emerald-400 border border-emerald-500/20 px-1 py-0.5 rounded",title:`Speculative Decoding aktiv (Draft: ${N.spec_draft_model})`,children:"SPEC"}),N.parallel_slots>1&&l.jsxs("span",{className:"text-[7px] leading-none font-mono font-bold bg-violet-500/10 text-violet-400 border border-violet-500/20 px-1 py-0.5 rounded",title:`${N.parallel_slots} parallele Slots aktiv`,children:["SLOTS: ",N.parallel_slots]}),N.incomplete&&l.jsx("span",{className:"text-[7px] leading-none font-mono font-bold bg-amber-500/10 text-amber-400 border border-amber-500/20 px-1 py-0.5 rounded",title:"GGUF-Datei fehlt",children:"⚠ fehlt"})]})]})]}),l.jsx("span",{className:"shrink-0",children:N?E?l.jsxs("span",{className:"flex items-center gap-1 text-[8px] font-semibold text-emerald-400 uppercase tracking-wider font-mono",children:[l.jsx("span",{className:ee("h-1.5 w-1.5 rounded-full bg-emerald-500",g&&"animate-pulse")})," warm"]}):l.jsx("span",{className:"text-[8px] font-semibold text-muted-foreground uppercase tracking-wider font-mono",children:"bereit"}):l.jsx("span",{className:"text-[8px] font-semibold text-muted-foreground/60 uppercase tracking-wider font-mono",children:"—"})})]},S)})}),l.jsx("div",{className:"mt-4 text-[10px] text-muted-foreground/80 border-t border-border/30 pt-3",children:"Laden erfolgt automatisch per Auto-Swap. Details & Routing im Modell-Manager."})]})}function pX(){var P,_,O,D,U,B;const{data:e}=Py(),{data:t}=NE(),{data:r}=Ni(),{data:n}=Po(),a=!!e&&!!t,o=F=>{var Y;return(Y=t==null?void 0:t.services.find(H=>H.name.toLowerCase().includes(F)))==null?void 0:Y.ok},c=e==null?void 0:e.engine_reachable,u=(P=e==null?void 0:e.brain)==null?void 0:P.ready,f=((_=e==null?void 0:e.brain)==null?void 0:_.model)||((O=r==null?void 0:r.models.find(F=>F.role==="hermes"))==null?void 0:O.name)||"",h=[];h.push((()=>{const F={id:"brain",label:"Lucys Hirn",icon:Ao,critical:!0};return a?c===!1?{...F,status:"down",detail:"Die Motor-Maschine (Engine) läuft nicht — Lucy kann gerade gar nicht denken.",repair:{kind:"restart",service:"llama-swap",label:"Motor neu starten",needsSudo:!0}}:u===!1?{...F,status:"down",detail:"Lucys Hirn ist gerade eingeschlafen — einmal aufwecken.",repair:f?{kind:"loadModel",model:f,label:"Hirn aufwecken"}:void 0}:{...F,status:"ok",detail:"Wach und ansprechbar."}:{...F,status:"loading",detail:"Wird geprüft …"}})()),h.push((()=>{const F={id:"memory",label:"Lucys Gedächtnis",icon:CN,critical:!0},Y=o("mem0");return!a||Y===void 0?{...F,status:"loading",detail:"Wird geprüft …"}:Y?{...F,status:"ok",detail:"Merkt sich Neues und findet Altes wieder."}:{...F,status:"down",detail:"Lucy kann sich gerade nichts merken — das Gedächtnis antwortet nicht.",repair:{kind:"restart",service:"mem0-service",label:"Gedächtnis neu starten"}}})()),h.push((()=>{const F={id:"gateway",label:"Verbindung (Gateway)",icon:cf,critical:!0},Y=e?e.gateway_reachable:o("integriert");return!a||Y===void 0?{...F,status:"loading",detail:"Wird geprüft …"}:Y?{...F,status:"ok",detail:"Apps und IDEs können Lucy erreichen."}:{...F,status:"down",detail:"Die Verbindungs-Zentrale antwortet nicht — Apps erreichen Lucy nicht.",repair:{kind:"restart",service:"mission-control-2",label:"Zentrale neu starten"}}})()),h.push((()=>{const F={id:"agent",label:"Lucys Agent (Hermes)",icon:wn,critical:!0},Y=o("hermes-gateway");return!a||Y===void 0?{...F,status:"loading",detail:"Wird geprüft …"}:Y?{...F,status:"ok",detail:"Lucy ist bereit zu reden und zu handeln."}:{...F,status:"down",detail:"Lucys Agent ist offline — sie reagiert gerade nicht.",repair:{kind:"restart",service:"hermes-gateway",label:"Agent neu starten"}}})()),h.push((()=>{const F={id:"voice",label:"Lucys Stimme",icon:S4,critical:!1},Y=o("voice");return!a||Y===void 0?{...F,status:"loading",detail:"Wird geprüft …"}:Y?{...F,status:"ok",detail:"Lucy kann hören und sprechen."}:{...F,status:"warn",detail:"Sprechen ist gerade aus — Tippen geht weiter normal.",repair:{kind:"restart",service:"voice-service",label:"Stimme neu starten"}}})());const m=((D=n==null?void 0:n.gpu)==null?void 0:D.gtt_total)||((U=n==null?void 0:n.gpu)==null?void 0:U.vram_total)||0,g=((B=n==null?void 0:n.gpu)==null?void 0:B.gtt_used)||0,v=m>0?Math.min(100,g/m*100):0,b=1024**3,j=m?v>=90?{status:"full",usedGb:g/b,totalGb:m/b,pct:v,text:"Speicher fast voll — Lucy könnte langsamer werden."}:v>=72?{status:"warn",usedGb:g/b,totalGb:m/b,pct:v,text:"Speicher gut gefüllt — noch okay."}:{status:"ok",usedGb:g/b,totalGb:m/b,pct:v,text:"Genug Speicher frei."}:{status:"unknown",usedGb:0,totalGb:0,pct:0,text:"Speicher-Auslastung unbekannt."},k=h.some(F=>F.status==="loading"),S=h.filter(F=>F.critical&&F.status==="down"),N=h.filter(F=>F.status==="warn"||!F.critical&&F.status==="down"),E=j.status==="full";return{verdict:k&&!S.length?"loading":S.length?"problem":N.length||E?"warn":"gut",checks:h,memory:j,problems:S}}const gX={ok:"bg-emerald-500",warn:"bg-amber-500",down:"bg-red-500",loading:"bg-muted-foreground/40"};function VO({frame:e="lucy"}={}){const{verdict:t,checks:r,memory:n,problems:a}=pX(),{showAlert:o,dialogElement:c}=Aa(),u=Yn(),[f,h]=y.useState({});async function m(S,N){h(E=>({...E,[S]:!0}));try{if(N.kind==="loadModel")await Se(`/api/models/${encodeURIComponent(N.model)}/load`,{method:"POST"});else{const E=await Se("/api/maintenance/restart",{method:"POST",body:JSON.stringify({service:N.service})});E.ok||o("Reparatur nicht ganz geklappt",(E.err||"Unbekannter Fehler")+(N.needsSudo?` - -Tipp: Dafür wird evtl. das Box-Passwort gebraucht (oben rechts hinterlegen).`:""))}u.invalidateQueries({queryKey:Ve.health}),u.invalidateQueries({queryKey:Ve.services}),u.invalidateQueries({queryKey:Ve.models})}catch(E){o("Reparatur fehlgeschlagen",String((E==null?void 0:E.message)||E))}finally{h(E=>({...E,[S]:!1}))}}const g=e==="box"?{loading:"Box wird geprüft …",gut:"Alles okay",warn:"Kleinigkeit an der Box",problem:"Box braucht Hilfe"}:{loading:"Lucy wird geprüft …",gut:"Lucy geht's gut 💚",warn:"Kleinigkeit bei Lucy",problem:"Lucy braucht Hilfe"},v={loading:{ring:"border-border/60 bg-card/45",icon:dh,iconCls:"text-muted-foreground animate-spin",title:g.loading,sub:"Einen Moment, ich schaue nach dem Rechten."},gut:{ring:"border-emerald-500/40 bg-emerald-500/5",icon:h4,iconCls:"text-emerald-400",title:g.gut,sub:"Alle wichtigen Fähigkeiten laufen."},warn:{ring:"border-amber-500/40 bg-amber-500/5",icon:bi,iconCls:"text-amber-400",title:g.warn,sub:"Nichts Schlimmes — nur ein Hinweis."},problem:{ring:"border-red-500/50 bg-red-500/5",icon:bi,iconCls:"text-red-400",title:g.problem,sub:`${a.length} wichtige${a.length===1?"s":""} Problem${a.length===1?"":"e"} gefunden.`}}[t],b=v.icon,j={ok:"bg-emerald-500",warn:"bg-amber-500",full:"bg-red-500",unknown:"bg-muted-foreground/40"}[n.status],k={ok:"text-emerald-400",warn:"text-amber-400",full:"text-red-400",unknown:"text-muted-foreground"}[n.status];return l.jsxs("div",{className:ee("rounded-2xl border p-5 shadow-lg shadow-black/15 backdrop-blur-md transition-colors",v.ring),children:[l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsx("div",{className:"flex h-11 w-11 shrink-0 items-center justify-center rounded-xl border border-border/40 bg-background/30",children:l.jsx(b,{className:ee("h-6 w-6",v.iconCls)})}),l.jsxs("div",{className:"min-w-0",children:[l.jsx("h2",{className:"text-base font-bold tracking-tight text-foreground",children:v.title}),l.jsx("p",{className:"text-xs text-muted-foreground",children:v.sub})]})]}),l.jsxs("div",{className:"mt-4 rounded-xl border border-border/30 bg-background/20 p-3",children:[l.jsxs("div",{className:"mb-1.5 flex items-center justify-between text-[11px]",children:[l.jsxs("span",{className:"flex items-center gap-1.5 font-semibold uppercase tracking-wider text-muted-foreground",children:[l.jsx(yu,{className:"h-3.5 w-3.5"})," Speicher"]}),l.jsx("span",{className:ee("font-mono font-bold",k),children:n.status==="unknown"?"—":`${n.usedGb.toFixed(0)} / ${n.totalGb.toFixed(0)} GB`})]}),l.jsx("div",{className:"h-2 w-full overflow-hidden rounded-full border border-border/30 bg-background/50",children:l.jsx("div",{className:ee("h-full rounded-full transition-all duration-500",j),style:{width:`${n.pct}%`}})}),l.jsx("p",{className:ee("mt-1.5 text-[11px]",k),children:n.text})]}),l.jsx("div",{className:"mt-4 space-y-1.5",children:r.map(S=>l.jsx(vX,{c:S,busy:!!f[S.id],onRepair:()=>S.repair&&m(S.id,S.repair)},S.id))}),c]})}function vX({c:e,busy:t,onRepair:r}){const n=e.icon,a=e.status==="down"||e.status==="warn";return l.jsxs("div",{className:ee("flex items-center justify-between gap-3 rounded-xl border p-2.5 transition-colors",e.status==="down"?"border-red-500/25 bg-red-500/5":e.status==="warn"?"border-amber-500/20 bg-amber-500/5":"border-border/30 bg-background/15"),children:[l.jsxs("div",{className:"flex min-w-0 items-center gap-2.5",children:[l.jsxs("span",{className:"relative flex h-8 w-8 shrink-0 items-center justify-center rounded-lg border border-border/40 bg-background/30 text-foreground/80",children:[l.jsx(n,{className:"h-4 w-4"}),l.jsx("span",{className:ee("absolute -right-0.5 -top-0.5 h-2.5 w-2.5 rounded-full ring-2 ring-black/40",gX[e.status],e.status==="down"&&"animate-pulse")})]}),l.jsxs("div",{className:"min-w-0",children:[l.jsxs("div",{className:"flex items-center gap-1.5 text-xs font-bold text-foreground",children:[e.label,e.status==="ok"&&l.jsx(sr,{className:"h-3 w-3 text-emerald-400"}),!e.critical&&l.jsx("span",{className:"rounded bg-background/40 px-1 py-0.5 text-[8px] font-semibold uppercase tracking-wider text-muted-foreground/60",children:"optional"})]}),l.jsx("div",{className:"truncate text-[11px] text-muted-foreground",children:e.detail})]})]}),a&&e.repair&&l.jsxs("button",{onClick:r,disabled:t,className:ee("flex h-8 shrink-0 items-center gap-1.5 rounded-lg border px-2.5 text-[10px] font-bold uppercase tracking-wide transition-all cursor-pointer disabled:opacity-60",e.status==="down"?"border-red-500/40 bg-red-500/10 text-red-300 hover:bg-red-500/20":"border-amber-500/40 bg-amber-500/10 text-amber-300 hover:bg-amber-500/20"),title:e.repair.label,children:[t?l.jsx(dh,{className:"h-3.5 w-3.5 animate-spin"}):l.jsx(Qu,{className:"h-3.5 w-3.5"}),e.repair.label]}),a&&!e.repair&&l.jsxs("span",{className:"flex shrink-0 items-center gap-1 text-[10px] font-semibold text-muted-foreground",title:"Keine Auto-Reparatur bekannt",children:[l.jsx(L4,{className:"h-3.5 w-3.5"})," manuell"]})]})}function K2({children:e}){return l.jsx("p",{className:"mb-2 ml-0.5 text-[11px] font-semibold uppercase tracking-wider text-muted-foreground/60",children:e})}function yX(){return l.jsxs("div",{className:"space-y-7",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Zentrale"}),l.jsx("p",{className:"text-sm text-muted-foreground",children:"Aktueller Status von System, Modellen und Agent."})]}),l.jsx(VO,{}),l.jsxs("div",{className:"grid items-stretch gap-6 lg:grid-cols-3",children:[l.jsx(BO,{}),l.jsx(HO,{}),l.jsx(mX,{})]}),l.jsxs("section",{children:[l.jsx(K2,{children:"Stack & Telemetrie"}),l.jsxs("div",{className:"grid gap-6 md:grid-cols-2",children:[l.jsx(cX,{}),l.jsx(WO,{})]})]}),l.jsxs("section",{children:[l.jsx(K2,{children:"Betrieb & Wissen"}),l.jsxs("div",{className:"grid gap-6 md:grid-cols-3",children:[l.jsx(sX,{}),l.jsx(lX,{}),l.jsx(uX,{})]})]})]})}function xX(){const e=Yn(),{data:t=[]}=DD(2e3),{showAlert:r,dialogElement:n}=Aa();async function a(u){try{await Se(`/api/jobs/${u}/cancel`,{method:"POST"}),e.invalidateQueries({queryKey:Ve.jobs})}catch(f){r("Fehler",f.message)}}const o=t.filter(u=>u.state==="running"||u.state==="queued"),c=t.filter(u=>u.state!=="running"&&u.state!=="queued").slice(-3);return o.length===0&&c.length===0?null:l.jsxs("div",{className:"space-y-3 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-4 shadow-lg shadow-black/10",children:[l.jsx("div",{className:"text-[11px] font-semibold text-muted-foreground uppercase tracking-wider",children:"Aktive Downloads"}),o.map(u=>l.jsxs("div",{className:"space-y-1.5 p-3 rounded-xl bg-background/20 border border-border/40",children:[l.jsxs("div",{className:"flex justify-between items-center text-xs",children:[l.jsx("span",{className:"font-semibold truncate max-w-[250px]",children:u.label}),l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsxs("span",{className:"text-muted-foreground font-mono",children:[u.progress??0,"% • ",wv(u.done_bytes),"/",wv(u.total_bytes),u.eta_s?` • ETA ${GD(u.eta_s)}`:""]}),l.jsx("button",{onClick:()=>a(u.id),className:"text-[10px] text-red-400 hover:text-red-300 font-semibold border border-red-500/25 bg-red-500/5 px-2 py-0.5 rounded transition-all cursor-pointer",children:"Abbrechen"})]})]}),l.jsx("div",{className:"h-1.5 overflow-hidden rounded-full bg-muted",children:l.jsx("div",{className:"h-full rounded-full bg-primary transition-all duration-500",style:{width:`${u.progress??0}%`}})})]},u.id)),c.map(u=>l.jsxs("div",{className:"flex justify-between items-center text-xs text-muted-foreground px-1",children:[l.jsx("span",{className:"truncate",children:u.label}),l.jsx("span",{className:ee("font-semibold text-[10px] px-1.5 py-0.5 rounded uppercase font-mono",u.state==="done"?"bg-emerald-500/10 text-emerald-400":"bg-amber-500/10 text-amber-400"),children:u.state})]},u.id)),n]})}function Ga({children:e,tone:t="muted"}){const r={muted:"bg-muted text-muted-foreground",primary:"bg-primary/15 text-primary",warn:"bg-amber-500/15 text-amber-500"};return l.jsx("span",{className:`rounded px-1.5 py-0.5 text-[11px] font-medium ${r[t]}`,children:e})}function G2({caps:e}){return e?l.jsxs("span",{className:"inline-flex flex-wrap gap-1",children:[e.coder&&l.jsx(Ga,{children:"💻 Code"}),e.vision&&l.jsx(Ga,{children:"👁 Bild"}),e.reasoning&&l.jsx(Ga,{children:"🧠 Reason"}),e.moe&&l.jsxs(Ga,{tone:"primary",children:["🧩 MoE",e.active_b?`·${e.active_b}b`:""]}),e.tools==="yes"&&l.jsx(Ga,{tone:"primary",children:"🛠 Tools"}),e.tools==="likely"&&l.jsx(Ga,{tone:"warn",children:"🛠 Tools?"}),e.embedding&&l.jsx(Ga,{children:"🔢 Embed"})]}):null}function bX({model:e,onClose:t,onChanged:r}){var k,S;const{data:n,isLoading:a}=LD(e.gguf_path),[o,c]=y.useState(null),[u,f]=y.useState(""),h=n==null?void 0:n.target_vocab,m=(n==null?void 0:n.drafts)??[],g=m.filter(N=>N.compatible===!0),v=e.spec_draft_model;async function b(N){c(N??"__clear__"),f("");try{await Se(`/api/models/${encodeURIComponent(e.name)}/draft`,{method:"POST",body:JSON.stringify({draft_path:N})}),r(),t()}catch(E){f(String((E==null?void 0:E.message)||E)),c(null)}}const j=N=>{var E;return N?`${N.pre??"?"} · ${((E=N.n_vocab)==null?void 0:E.toLocaleString())??"?"} Tokens`:"—"};return l.jsx("div",{className:"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm flex items-center justify-center p-4",children:l.jsxs("div",{className:"w-full max-w-lg rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[l.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[l.jsxs("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary flex items-center gap-2",children:[l.jsx(xa,{className:"h-4 w-4"})," Speculative Draft"]}),l.jsx("button",{onClick:t,className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:l.jsx(Wn,{className:"h-4 w-4"})})]}),l.jsxs("div",{className:"text-xs text-muted-foreground leading-relaxed",children:['Beschleunigt die Token-Generierung mit einem kleinen "Draft"-Modell. Voraussetzung: der Draft muss den ',l.jsx("strong",{className:"text-foreground",children:"exakt gleichen Tokenizer (Vocab)"})," haben wie das Modell — sonst lehnt llama.cpp es ab."]}),l.jsxs("div",{className:"rounded-lg border border-border/40 bg-background/30 px-3 py-2 text-[11px] font-mono flex items-center justify-between",children:[l.jsx("span",{className:"text-muted-foreground",children:(k=e.name.split("/").pop())==null?void 0:k.replace(/\.gguf$/i,"")}),l.jsxs("span",{className:"text-foreground",children:["Vocab: ",j(h)]})]}),e.spec_active&&v&&l.jsxs("div",{className:"rounded-lg border border-emerald-500/30 bg-emerald-500/5 px-3 py-2 flex items-center justify-between gap-2",children:[l.jsxs("span",{className:"text-[11px] text-emerald-400 font-mono flex items-center gap-1.5 truncate",children:[l.jsx(sr,{className:"h-3.5 w-3.5 shrink-0"})," Aktiv: ",v]}),l.jsx("button",{onClick:()=>b(null),disabled:o!==null,className:"h-6 px-2.5 rounded border border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/10 text-amber-400 text-[9px] font-bold uppercase shrink-0 cursor-pointer disabled:opacity-50",children:"Deaktivieren"})]}),!(n!=null&&n.target_exists)&&l.jsxs("div",{className:"rounded-lg border border-amber-500/30 bg-amber-500/5 px-3 py-2 text-[11px] text-amber-400 flex items-center gap-2",children:[l.jsx(bi,{className:"h-3.5 w-3.5 shrink-0"}),"Modell-GGUF noch nicht vorhanden — Spec-Draft ist nach dem Download konfigurierbar."]}),l.jsx("div",{className:"space-y-1.5 max-h-64 overflow-y-auto pr-1",children:a?l.jsx("div",{className:"text-xs text-muted-foreground py-6 text-center",children:"Prüfe Vocab-Kompatibilität…"}):m.length===0?l.jsxs("div",{className:"text-[11px] text-muted-foreground border border-dashed border-border/50 rounded-lg p-4 text-center",children:["Keine Draft-Modelle in ",l.jsx("code",{className:"font-mono",children:"/srv/models/drafts"}),". Lade ein kleines same-family-Modell (z.B. Qwen3-0.6B) und lege es dort ab."]}):m.map(N=>{var P,_;const E=N.filename===v,A=N.compatible===!0;return l.jsxs("div",{className:ee("rounded-lg border px-3 py-2 flex items-center justify-between gap-2 text-left",A?"border-border/40 bg-background/20":"border-border/20 bg-background/10 opacity-60",E&&"border-primary/40 bg-primary/10"),children:[l.jsxs("div",{className:"min-w-0",children:[l.jsxs("div",{className:"text-[11px] font-mono font-semibold text-foreground truncate flex items-center gap-1.5",children:[N.filename,N.mtp&&l.jsx("span",{className:"shrink-0 rounded bg-indigo-500/15 px-1.5 py-0.5 text-[8px] font-bold uppercase tracking-wider text-indigo-400 border border-indigo-500/25",title:"MTP-Kopf (Multi-Token-Prediction) — by-construction vocab-identisch, höchste Akzeptanzrate",children:"MTP"})]}),l.jsxs("div",{className:"text-[9px] text-muted-foreground font-mono",children:[Lr(N.size_bytes)," · Vocab: ",j(N.vocab)]})]}),A?E?l.jsxs("span",{className:"text-[9px] font-bold uppercase text-primary flex items-center gap-1 shrink-0",children:[l.jsx(sr,{className:"h-3.5 w-3.5"})," Aktiv"]}):l.jsx("button",{onClick:()=>b(N.path),disabled:o!==null,className:"h-7 px-3 rounded-lg border border-emerald-500/30 bg-emerald-500/5 hover:bg-emerald-500/15 text-emerald-400 text-[9px] font-bold uppercase shrink-0 cursor-pointer disabled:opacity-50",children:"Aktivieren"}):l.jsxs("span",{className:"text-[9px] font-bold uppercase text-amber-400/80 flex items-center gap-1 shrink-0",title:N.compatible===!1?`Inkompatibel: Tokenizer/Vocab weicht ab (Draft ${(P=N.vocab)==null?void 0:P.pre}/${(_=N.vocab)==null?void 0:_.n_vocab} ≠ Modell ${h==null?void 0:h.pre}/${h==null?void 0:h.n_vocab}).`:"Kompatibilität nicht prüfbar (Datei fehlt).",children:[l.jsx(bi,{className:"h-3.5 w-3.5"})," ",N.compatible===!1?"Vocab ≠":"n/a"]})]},N.path)})}),!a&&(n==null?void 0:n.target_exists)&&m.length>0&&g.length===0&&l.jsxs("div",{className:"rounded-lg border border-amber-500/30 bg-amber-500/5 px-3 py-2 text-[11px] text-amber-400 leading-relaxed",children:["Kein vocab-kompatibler Draft verfügbar — Speculative Decoding ist für dieses Modell nicht möglich. Es braucht einen Draft mit identischem Tokenizer (pre=",l.jsx("span",{className:"font-mono",children:h==null?void 0:h.pre}),", n_vocab=",l.jsx("span",{className:"font-mono",children:(S=h==null?void 0:h.n_vocab)==null?void 0:S.toLocaleString()}),")."]}),u&&l.jsx("div",{className:"text-[10px] text-red-400 font-mono",children:u})]})})}const wX=["fast","heavy","heavy_chars"],kX=["coder_lite","coder","coding_escalate_chars"];function jX(){const e=Yn(),{data:t,isLoading:r}=TD(),[n,a]=y.useState(null),[o,c]=y.useState(!1),[u,f]=y.useState(""),[h,m]=y.useState(0);if(y.useEffect(()=>{t!=null&&t.policy&&!n&&a({...t.policy})},[t,n]),r||!t||!n)return l.jsx("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 text-xs text-muted-foreground",children:"Lade Routing-Policy…"});const g=N=>t.fields.find(E=>E.key===N),v=Object.keys(n).some(N=>n[N]!==t.policy[N]),b=(N,E)=>{a(A=>A&&{...A,[N]:E}),f("")},j=N=>b(N,t.defaults[N]);async function k(){if(!n)return;const N={};for(const E of Object.keys(n))n[E]!==t.policy[E]&&(N[E]=n[E]);if(Object.keys(N).length!==0){c(!0),f("");try{const{policy:E}=await _D(N);a({...E}),e.invalidateQueries({queryKey:Ve.routingPolicy}),e.invalidateQueries({queryKey:Ve.routing}),m(Date.now()),setTimeout(()=>m(0),2e3)}catch(E){f(E.message||String(E))}finally{c(!1)}}}function S({k:N}){const E=g(N),A=n[N],P=n[N]===t.defaults[N];return l.jsxs("div",{className:"space-y-1",children:[l.jsxs("div",{className:"flex items-center justify-between gap-2",children:[l.jsx("label",{className:"text-[10px] font-semibold text-muted-foreground",children:E.label}),!P&&l.jsxs("button",{onClick:()=>j(N),className:"flex items-center gap-0.5 text-[9px] text-muted-foreground/60 hover:text-foreground transition-colors cursor-pointer",title:`Auf Default zurücksetzen (${String(t.defaults[N])||"leer"})`,children:[l.jsx(_4,{className:"h-2.5 w-2.5"})," Default"]})]}),E.type==="bool"?l.jsxs("button",{onClick:()=>b(N,!A),className:ee("flex h-8 w-full items-center justify-between rounded-lg border px-3 text-[11px] font-semibold transition-all cursor-pointer",A?"border-emerald-500/40 bg-emerald-500/10 text-emerald-300":"border-border/40 bg-background/40 text-muted-foreground"),children:[l.jsx("span",{children:A?"An":"Aus"}),l.jsx("span",{className:ee("h-3.5 w-3.5 rounded-full transition-colors",A?"bg-emerald-400":"bg-muted-foreground/40")})]}):E.type==="int"?l.jsx("input",{type:"number",value:A,min:E.min,max:E.max,"aria-label":E.label,onChange:_=>b(N,Number(_.target.value)),className:"h-8 w-full rounded-lg border border-border/40 bg-background/40 px-3 font-mono text-[11px] text-foreground outline-none focus:border-primary/50"}):l.jsx("input",{type:"text",value:A,"aria-label":E.label,spellCheck:!1,placeholder:N==="coder_lite"?"(leer = aus)":"",onChange:_=>b(N,_.target.value),className:"h-8 w-full rounded-lg border border-border/40 bg-background/40 px-3 font-mono text-[11px] text-foreground outline-none focus:border-primary/50"})]})}return l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-4",children:[l.jsxs("div",{className:"flex items-center justify-between gap-3 flex-wrap",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(z4,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("span",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"Lane-Routing & Policy"}),l.jsx("span",{className:"text-[9px] font-mono px-1.5 py-0.5 rounded bg-emerald-500/10 text-emerald-300 border border-emerald-500/20",children:"hot-reload"})]}),l.jsxs("div",{className:"flex items-center gap-2",children:[u&&l.jsx("span",{className:"text-[10px] text-red-400 max-w-[280px] truncate",title:u,children:u}),h>0&&l.jsxs("span",{className:"flex items-center gap-1 text-[10px] text-emerald-400",children:[l.jsx(sr,{className:"h-3.5 w-3.5"})," gespeichert"]}),l.jsxs("button",{onClick:k,disabled:!v||o,className:ee("h-8 px-4 rounded-lg text-[10px] font-bold uppercase tracking-wide transition-all flex items-center gap-1.5",v&&!o?"bg-primary text-primary-foreground hover:opacity-90 cursor-pointer shadow-md shadow-primary/10":"bg-background/40 text-muted-foreground/50 border border-border/40 cursor-not-allowed"),children:[o?l.jsx(dh,{className:"h-3.5 w-3.5 animate-spin"}):null,"Speichern"]})]})]}),l.jsxs("p",{className:"text-[10px] text-muted-foreground/70 leading-relaxed -mt-1",children:["Welches echte Modell hinter den virtuellen Lanes ",l.jsx("code",{className:"text-cyan-300",children:"chat"})," und"," ",l.jsx("code",{className:"text-cyan-300",children:"coding"})," steckt. Änderungen greifen sofort (kein Neustart). Die Keyword-Heuristiken bleiben im Code."]}),l.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[l.jsxs("div",{className:"rounded-xl border border-border/40 bg-background/25 p-4 space-y-3",children:[l.jsxs("div",{className:"flex items-center gap-2 border-b border-border/30 pb-2",children:[l.jsx(k4,{className:"h-4 w-4 text-teal-400"}),l.jsx("span",{className:"text-[11px] font-bold uppercase tracking-wider text-foreground",children:"chat"}),l.jsx("span",{className:"text-[9px] text-muted-foreground/60 font-mono",children:"(= auto)"})]}),wX.map(N=>l.jsx(S,{k:N},N))]}),l.jsxs("div",{className:"rounded-xl border border-border/40 bg-background/25 p-4 space-y-3",children:[l.jsxs("div",{className:"flex items-center gap-2 border-b border-border/30 pb-2",children:[l.jsx(i4,{className:"h-4 w-4 text-indigo-400"}),l.jsx("span",{className:"text-[11px] font-bold uppercase tracking-wider text-foreground",children:"coding"}),l.jsx("span",{className:"text-[9px] text-muted-foreground/60 font-mono",children:"(agentisch → immer Coder)"})]}),kX.map(N=>l.jsx(S,{k:N},N))]})]}),l.jsx("div",{className:"rounded-xl border border-border/40 bg-background/25 p-4",children:l.jsx("div",{className:"max-w-xs",children:l.jsx(S,{k:"fast_no_think"})})})]})}function SX(){var pe,ue,he;const e=Yn(),{data:t}=Ni(4e3),{data:r}=EE(),{data:n}=Po(),{data:a}=AE(),{showAlert:o,dialogElement:c}=Aa(),[u,f]=y.useState(!1),[h,m]=y.useState(!1),g=(t==null?void 0:t.models)??[],v=(t==null?void 0:t.running)??[],b=(pe=r==null?void 0:r.groups)==null?void 0:pe.brains,j=(b==null?void 0:b.members)??[],k=ae=>g.find(se=>se.name===ae),S=ae=>{var se;return((se=ae.split("/").pop())==null?void 0:se.replace(/\.gguf$/i,""))||ae},N=j.map(k).filter(Boolean),E=1024**3,A=a==null?void 0:a.budget,P=N.reduce((ae,se)=>ae+(se.size_bytes||0),0)/E,_=((ue=n==null?void 0:n.gpu)==null?void 0:ue.gtt_total)||((he=n==null?void 0:n.gpu)==null?void 0:he.vram_total)||0,O=(A==null?void 0:A.gtt_gb)||(_?_/E:0),D=(A==null?void 0:A.warm_projected_gb)??P,U=O>0?Math.min(100,D/O*100):0,B=g.filter(ae=>!j.includes(ae.name)&&!ae.incomplete);async function F(ae){m(!0);try{await SE("brains",ae,(b==null?void 0:b.swap)??!1,(b==null?void 0:b.persist)??!0),e.invalidateQueries({queryKey:Ve.groups}),e.invalidateQueries({queryKey:Ve.models}),e.invalidateQueries({queryKey:Ve.hermesBrain})}catch(se){o("Fehler",`Immer-bereit-Set konnte nicht geändert werden: ${(se==null?void 0:se.message)||se}`)}finally{m(!1)}}function Y(ae){const se=k(ae);if(se&&mr(se.role).protected){o("Geschützt",`„${mr(se.role).label}" ist lebenswichtig und bleibt immer bereit.`);return}F(j.filter(X=>X!==ae))}function H(ae){f(!1),F([...j,ae])}return b?l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-4",children:[l.jsx(V2,{}),l.jsxs("div",{className:"space-y-1.5",children:[N.length===0&&l.jsx("div",{className:"text-xs text-muted-foreground",children:"Noch keine Modelle im Set."}),N.map(ae=>{const se=v.includes(ae.name),X=mr(ae.role).protected;return l.jsxs("div",{className:"flex items-center justify-between gap-2 rounded-xl border border-border/30 bg-background/20 p-2.5",children:[l.jsxs("div",{className:"flex min-w-0 items-center gap-2.5",children:[l.jsx("span",{className:ee("h-2 w-2 shrink-0 rounded-full ring-2 ring-black/40",se?"bg-emerald-500 animate-pulse":"bg-muted-foreground/40"),title:se?"Gerade warm (bereit)":"Reserviert — lädt bei Bedarf sofort"}),ae.role&&l.jsx(io,{role:ae.role,dense:!0,className:"shrink-0"}),l.jsx("span",{className:"truncate font-mono text-xs font-semibold text-foreground",title:ae.name,children:S(ae.name)}),l.jsx("span",{className:"shrink-0 font-mono text-[10px] text-muted-foreground/70",children:Lr(ae.size_bytes)})]}),X?l.jsx("span",{className:"shrink-0 text-[10px] font-semibold text-muted-foreground",title:"Lebenswichtig — bleibt immer im Set.",children:"🔒"}):l.jsx("button",{onClick:()=>Y(ae.name),disabled:h,className:"flex h-7 w-7 shrink-0 items-center justify-center rounded-lg border border-border/40 text-muted-foreground transition-colors hover:bg-red-500/5 hover:text-red-400 cursor-pointer disabled:opacity-50",title:"Aus dem Immer-bereit-Set nehmen (lädt dann nur noch bei Bedarf)",children:l.jsx(Wn,{className:"h-3.5 w-3.5"})})]},ae.name)})]}),l.jsxs("button",{onClick:()=>f(!0),disabled:h||B.length===0,className:"flex h-8 w-full items-center justify-center gap-1.5 rounded-lg border border-dashed border-border/50 text-[11px] font-semibold uppercase tracking-wide text-muted-foreground transition-colors hover:border-primary/40 hover:text-primary cursor-pointer disabled:opacity-50",children:[l.jsx(df,{className:"h-3.5 w-3.5"})," Modell dauerhaft bereithalten"]}),l.jsxs("div",{className:"rounded-xl border border-border/30 bg-background/20 p-3",children:[l.jsxs("div",{className:"mb-1.5 flex items-center justify-between text-[11px]",children:[l.jsxs("span",{className:"flex items-center gap-1.5 font-semibold uppercase tracking-wider text-muted-foreground",title:"Modellgewichte + Arbeitsspeicher (KV-Cache)",children:[l.jsx(yu,{className:"h-3.5 w-3.5"})," Reserviert fürs Set"]}),l.jsxs("span",{className:"font-mono font-bold text-foreground",children:[D.toFixed(1),O>0?` / ${O.toFixed(0)}`:""," GB"]})]}),l.jsx("div",{className:"h-2 w-full overflow-hidden rounded-full border border-border/30 bg-background/50",children:l.jsx("div",{className:ee("h-full rounded-full transition-all duration-500",U>=85?"bg-red-500":U>=65?"bg-amber-500":"bg-teal-500"),style:{width:`${U}%`}})}),A&&!A.fits&&l.jsxs("p",{className:"mt-2 flex items-start gap-1.5 text-[11px] text-amber-400",children:[l.jsx(bi,{className:"mt-0.5 h-3.5 w-3.5 shrink-0"}),l.jsxs("span",{children:["Zusammen mit dem größten Gelegenheits-Modell (~",A.largest_ondemand_gb," GB, z. B. das große Hirn) passt das Set nicht gleichzeitig in den Speicher. Beim Laden wird das Set kurz verdrängt und danach automatisch nachgeladen — kostet ein paar Sekunden."]})]}),A&&A.fits&&l.jsxs("p",{className:"mt-2 flex items-center gap-1.5 text-[11px] text-emerald-400",children:[l.jsx(sr,{className:"h-3.5 w-3.5 shrink-0"})," Passt auch neben dem größten Gelegenheits-Modell — nichts wird verdrängt."]})]}),u&&l.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/60 p-4 backdrop-blur-sm",role:"dialog","aria-modal":"true","aria-label":"Modell zum Immer-bereit-Set hinzufügen",children:l.jsxs("div",{className:"w-full max-w-md space-y-3 rounded-2xl border border-border/80 bg-card p-6 shadow-2xl animate-in fade-in zoom-in-95 duration-200",children:[l.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary",children:"Dauerhaft bereithalten"}),l.jsx("button",{onClick:()=>f(!1),className:"rounded p-1 text-muted-foreground hover:bg-accent hover:text-foreground cursor-pointer",children:l.jsx(Wn,{className:"h-4 w-4"})})]}),l.jsx("p",{className:"text-xs text-muted-foreground",children:"Wähle ein Modell, das ohne Ladezeit bereitstehen soll:"}),l.jsx("div",{className:"max-h-60 space-y-1.5 overflow-y-auto pr-1",children:B.map(ae=>l.jsxs("button",{onClick:()=>H(ae.name),className:"flex w-full items-center justify-between gap-2 rounded-lg border border-border/30 bg-background/20 px-3 py-2.5 text-left transition-colors hover:bg-accent cursor-pointer",children:[l.jsxs("span",{className:"flex min-w-0 items-center gap-2",children:[ae.role&&l.jsx(io,{role:ae.role,dense:!0,className:"shrink-0"}),l.jsx("span",{className:"truncate font-mono text-xs font-semibold text-foreground",children:S(ae.name)})]}),l.jsx("span",{className:"shrink-0 font-mono text-[10px] text-muted-foreground/70",children:Lr(ae.size_bytes)})]},ae.name))})]})}),c]}):l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10",children:[l.jsx(V2,{}),l.jsx("p",{className:"mt-3 text-xs text-muted-foreground",children:"Es gibt noch kein Immer-bereit-Set. Es entsteht automatisch, sobald Lucys Hirn zugewiesen ist."}),c]})}function V2(){return l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(xa,{className:"h-4.5 w-4.5 text-primary"}),l.jsxs("div",{children:[l.jsx("h2",{className:"text-sm font-bold uppercase tracking-wide text-foreground",children:"Immer-bereit-Set"}),l.jsx("p",{className:"text-[11px] text-muted-foreground",children:"Diese Modelle hält Lucy immer bereit — sie antworten ohne Ladezeit."})]})]})}function qO(){var Fe,Oe,ut,Jt;const e=Yn(),{data:t,isLoading:r,error:n}=Ni(4e3),{data:a}=vh(4e3),{data:o}=AE(),{data:c}=Po(),{data:u}=EE(),{showAlert:f,showConfirm:h,showPrompt:m,dialogElement:g}=Aa(),v=gE(),b=W=>!!mr(W).protected,j=(t==null?void 0:t.models)??[],k=(t==null?void 0:t.running)??[],S=n?String(n):"",N=()=>{e.invalidateQueries({queryKey:Ve.models}),e.invalidateQueries({queryKey:Ve.routing})},E=(Fe=u==null?void 0:u.groups)==null?void 0:Fe.brains,A=(E==null?void 0:E.members)??[],P=W=>A.includes(W),_=A.some(W=>k.includes(W));async function O(W){if(!E){f("Keine brains-Gruppe","Es existiert noch keine Ko-Residenz-Gruppe „brains“ in der Engine-Konfiguration. Lege sie erst über die Gruppen-Verwaltung an.");return}const Ae=A.includes(W)?A.filter(Be=>Be!==W):[...A,W];try{await SE("brains",Ae,E.swap??!1,E.persist??!0),e.invalidateQueries({queryKey:Ve.groups}),N()}catch(Be){f("Fehler",`Ko-Residenz konnte nicht geändert werden: ${Be.message||Be}`)}}const[D,U]=y.useState(null),[B,F]=y.useState(null),[Y,H]=y.useState(null),[pe,ue]=y.useState("grid"),[he,ae]=y.useState("all"),se=j.filter(W=>he==="in_use"?!!W.role||k.includes(W.name):!0);async function X(W){try{await Se(`/api/models/${encodeURIComponent(W)}/load`,{method:"POST"}),N()}catch(ke){f("Fehler",`Fehler beim Laden des Modells: ${ke.message}`)}}async function te(W){if(E&&_&&!P(W)){const ke=A.filter(Ae=>k.includes(Ae)).map(Ae=>Ae.split("/").pop()).join(", ");h("Verdrängt das Hirn?",`„${W.split("/").pop()}“ ist nicht in der Ko-Residenz-Gruppe „brains“. Beim Laden wirft es das aktuell warme Hirn (${ke}) raus — Lucy verliert Hirn bzw. Augen. - -Trotzdem exklusiv laden? Tipp: Mit dem 🧠-Schalter machst du das Modell dauerhaft ko-resident, dann bleiben beide warm.`,()=>X(W));return}X(W)}async function J(W){const ke=j.find(Ae=>Ae.name===W);if(ke&&b(ke.role)){f("Geschützt",`„${mr(ke.role).label}" ist lebenswichtig für Lucy und bleibt geladen. Zum Entladen erst im Experten-Modus die Rolle einem anderen Modell geben.`);return}try{await Se(`/api/models/${encodeURIComponent(W)}/unload`,{method:"POST"}),N()}catch(Ae){f("Fehler",`Fehler beim Entladen des Modells: ${Ae.message}`)}}async function I(){try{await Se("/api/models/unload",{method:"POST"}),N()}catch(W){f("Fehler",`Fehler beim Entladen aller Modelle: ${W.message}`)}}async function M(W,ke){try{const Ae=await Se(`/api/models/${encodeURIComponent(ke)}/role`,{method:"POST",body:JSON.stringify({role:W||null})});N(),Ae!=null&&Ae.warning&&f("Hirn gesetzt — Hinweis",Ae.warning)}catch(Ae){f("Fehler",`Fehler beim Zuweisen der Rolle: ${Ae.message||Ae}`)}}function K(W){U(W),F(null),Se(`/api/roles/${encodeURIComponent(W)}/recommend`).then(ke=>F(ke)).catch(()=>{})}async function ne(W,ke){let Ae=null;try{Ae=await Se(`/api/models/${encodeURIComponent(W)}/ctx/auto`)}catch{}const Be=Ae?`Optimal für dein Setup: ${(Ae.ctx/1024).toFixed(0)}k (${Ae.ctx}) — GTT ${Ae.gtt_gb} GB − reserviert ${Ae.reserved_gb} GB (${Ae.mode}) → ${Ae.budget_gb} GB frei. »Auto« trägt diesen Wert ein.`:"Gib die gewünschte Kontextlänge in Tokens an:";m("Kontextlänge anpassen",Be,String(ke||32768),async et=>{if(et)try{await Se(`/api/models/${encodeURIComponent(W)}/ctx`,{method:"POST",body:JSON.stringify({ctx:parseInt(et,10)})}),N()}catch(Ut){f("Fehler",`Fehler beim Setzen des Kontexts: ${Ut.message||Ut}`)}},void 0,Ae?{autoValue:String(Ae.ctx),autoLabel:`Auto (${(Ae.ctx/1024).toFixed(0)}k)`}:void 0)}async function Z(W){const ke=j.find(Ae=>Ae.name===W);if(ke&&b(ke.role)){f("Geschützt",`„${mr(ke.role).label}" ist lebenswichtig für Lucy und kann nicht gelöscht werden. Weise die Rolle zuerst einem anderen Modell zu.`);return}h("Modell löschen?",`Modell '${W}' und alle zugehörigen GGUF-Dateien unwiderruflich von der Box löschen?`,async()=>{try{await Se(`/api/models/${encodeURIComponent(W)}`,{method:"DELETE"}),N()}catch(Ae){f("Fehler",`Fehler beim Löschen: ${Ae.message||Ae}`)}})}async function me(W,ke,Ae,Be){try{await Se("/api/models/install",{method:"POST",body:JSON.stringify({repo:W,role:ke,quant:Ae,jinja:Be})}),f("Herunterladen gestartet",`Download für '${W}' gestartet! Der Fortschritt wird oben angezeigt.`)}catch(et){f("Fehler",`Fehler beim Starten des Upgrades: ${et.message||et}`)}}async function ge(W){const ke=o==null?void 0:o.budget,Ae=ke&&!ke.fits?` - -⚠ Speicher-Warnung: Dieses Brain (~${ke.brain_gb} GB) muss immer resident sein. Zusammen mit dem größten on-demand-Modell (~${ke.largest_ondemand_gb} GB) sprengt das das Budget (${ke.gtt_gb} GB) → heavy/coder würden das Brain verdrängen. Erwäge ein kleineres Brain oder weniger Kontext.`:"";h("Agent-Hirn aktualisieren?",`Neues Hermes-Modell '${W.split("/").pop()}' herunterladen und als Agent-Hirn (Rolle hermes) setzen? Hermes nutzt danach automatisch das neue Modell.${Ae}`,async()=>{try{await Se("/api/models/install",{method:"POST",body:JSON.stringify({repo:W,role:"hermes",quant:"Q4_K_M",jinja:!0})}),f("Download gestartet","Das neue Agent-Hirn wird geladen. Fortschritt oben."),N()}catch(Be){f("Fehler",`Update fehlgeschlagen: ${Be.message||Be}`)}})}if(r)return l.jsx("div",{className:"text-xs text-muted-foreground py-12 text-center",children:"Initialisiere HUD Cockpit…"});if(S)return l.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400",children:["Gateway oder Engine nicht erreichbar (",S,")."]});const Pe=j.filter(W=>k.includes(W.name)),re=Pe.reduce((W,ke)=>W+(ke.size_bytes||0),0),xe=((Oe=c==null?void 0:c.gpu)==null?void 0:Oe.gtt_total)||((ut=c==null?void 0:c.gpu)==null?void 0:ut.vram_total)||0,_e=((Jt=c==null?void 0:c.gpu)==null?void 0:Jt.gtt_used)||0,ie=16*1024**3,Je=xe>2*1024**3?xe:re>ie?re*1.2:ie;return l.jsxs("div",{className:"space-y-8",children:[l.jsx("style",{children:` - @keyframes flow-dash { - to { - stroke-dashoffset: -20; - } - } - .svg-flow-path { - stroke-dasharray: 4 6; - animation: flow-dash 1s linear infinite; - } - `}),l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-3.5",children:[l.jsxs("div",{className:"flex justify-between items-center",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(yu,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("span",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"VRAM / Memory Belegung"})]}),l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsxs("span",{className:"text-[10px] font-mono text-muted-foreground",children:["Speicher-Pool: ",Lr(re)," Gewichte",_e>0?` · ${Lr(_e)} real belegt (inkl. KV)`:""," / ",Lr(Je)]}),v&&k.length>0&&l.jsx("button",{onClick:I,className:"h-6 px-2.5 rounded border border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/10 text-amber-400 text-[9px] font-bold uppercase transition-all cursor-pointer",children:"Alle entladen"})]})]}),l.jsx("div",{className:"h-7 w-full rounded-xl bg-background/50 border border-border/40 overflow-hidden flex p-0.5 relative group",children:Pe.length===0?l.jsx("div",{className:"w-full h-full flex items-center justify-center text-[10px] text-muted-foreground/60 italic font-mono select-none",children:"VRAM Leer — Auto-Swap lädt Modelle bei Anfrage"}):Pe.map((W,ke)=>{var et;const Ae=(W.size_bytes||0)/Je*100,Be=["from-teal-500 to-emerald-500","from-indigo-500 to-blue-500","from-purple-500 to-pink-500","from-cyan-500 to-sky-500"][ke%4];return l.jsxs("div",{style:{width:`${Ae}%`},className:ee("h-full rounded bg-gradient-to-r flex items-center justify-between px-2.5 transition-all text-white/95 shrink-0 shadow-inner select-none",Be),title:`${W.name} (${Lr(W.size_bytes)})`,children:[l.jsxs("span",{className:"text-[9px] font-bold truncate max-w-[120px] font-space tracking-wide",children:[W.role?`[${mr(W.role).short}] `:"",(et=W.name.split("/").pop())==null?void 0:et.replace(".gguf","")]}),l.jsx("span",{className:"text-[8px] font-mono opacity-80",children:Lr(W.size_bytes)})]},W.name)})})]}),l.jsx(SX,{}),v&&l.jsx(jX,{}),l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-3.5",children:[l.jsx("div",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground px-1",children:v?"Gateway Steckplatz-Belegung (Slot-Zuweisung)":"Wer macht was bei Lucy — zum Ändern antippen"}),l.jsx("div",{className:"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-6 gap-3",children:GO.map(W=>{var Be;const ke=j.find(et=>et.role===W),Ae=ke?k.includes(ke.name):!1;return l.jsxs("div",{onClick:()=>K(W),className:ee("rounded-xl border p-3 flex flex-col justify-between gap-2.5 transition-all cursor-pointer select-none text-left bg-background/25 hover:border-primary/45 hover:bg-background/40 group min-h-[90px]",Ae?"border-emerald-500/40 shadow-sm shadow-emerald-500/5":ke?"border-primary/20 bg-primary/5":"border-border/30 border-dashed opacity-75"),children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx(io,{role:W}),Ae&&l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-400 animate-pulse"})]}),l.jsx("div",{className:"text-[10px] font-mono font-medium truncate text-foreground/90 pr-1 font-space",title:ke==null?void 0:ke.name,children:ke?(Be=ke.name.split("/").pop())==null?void 0:Be.replace(/\.gguf$/i,""):"nicht zugewiesen"}),l.jsx("div",{className:"text-[8px] text-primary/70 group-hover:text-primary font-bold uppercase tracking-wider transition-colors font-space",children:"Ändern ➔"})]},W)})})]}),(o==null?void 0:o.current)&&l.jsxs("div",{className:"rounded-2xl border border-indigo-500/30 bg-indigo-500/5 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-3.5",children:[l.jsxs("div",{className:"flex items-center justify-between flex-wrap gap-2",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(wn,{className:"h-4.5 w-4.5 text-indigo-400"}),l.jsx("span",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"Agent-Hirn (Hermes)"}),o.current.version!=null&&l.jsxs("span",{className:"text-[9px] font-mono px-1.5 py-0.5 rounded bg-indigo-500/15 text-indigo-300 border border-indigo-500/25",children:["v",o.current.version]})]}),l.jsx("button",{onClick:()=>window.dispatchEvent(new CustomEvent("mc-navigate",{detail:{view:"agent"}})),className:"h-7 px-3 rounded-lg border border-indigo-500/30 bg-indigo-500/5 text-indigo-300 text-[9px] font-bold uppercase hover:bg-indigo-500/15 transition-all cursor-pointer",title:"Hirn-Wechsel passiert jetzt zentral im Hermes-Tab",children:"Im Hermes-Tab wechseln →"})]}),l.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-3 rounded-xl bg-background/30 border border-border/30 p-3.5",children:[l.jsxs("div",{className:"min-w-0",children:[l.jsx("div",{className:"text-xs font-mono font-bold text-foreground truncate",title:o.current.name,children:o.current.name.split("/").pop()}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2 mt-0.5",children:[l.jsx("span",{children:o.current.params_b?`${o.current.params_b}B`:"—"}),l.jsx("span",{children:"•"}),l.jsx("span",{children:o.current.quant||"GGUF"}),l.jsx("span",{children:"•"}),l.jsx("span",{children:Lr(o.current.size_bytes||0)})]})]}),o.update_available&&o.recommended?l.jsxs("button",{onClick:()=>ge(o.recommended.repo),className:ee("h-8 px-3 shrink-0 flex items-center justify-center gap-1.5 rounded-lg text-[10px] font-bold uppercase transition-all cursor-pointer shadow-md",o.budget&&!o.budget.fits?"bg-red-500 text-white hover:bg-red-400 shadow-red-500/10":"bg-amber-500 text-black hover:bg-amber-400 shadow-amber-500/10"),children:[l.jsx(Us,{className:"h-3.5 w-3.5"})," Aktualisieren"]}):l.jsxs("span",{className:"h-8 px-3 shrink-0 flex items-center gap-1.5 text-[10px] font-bold text-emerald-400 uppercase tracking-wide bg-emerald-500/5 border border-emerald-500/15 rounded-lg select-none",children:[l.jsx(sr,{className:"h-4 w-4"})," Neueste Generation"]})]}),o.update_available&&o.recommended&&l.jsxs("div",{className:"text-[10px] text-amber-400/90 flex items-center gap-1.5",children:[l.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-amber-400 animate-ping shrink-0"}),"Neuere Generation verfügbar: ",l.jsx("span",{className:"font-mono font-bold",children:o.recommended.name.replace(/-GGUF$/i,"")}),"(v",o.recommended.version,", ",o.recommended.params_b,"B) — von NousResearch."]}),o.budget&&l.jsxs("div",{className:ee("text-[10px] flex items-start gap-1.5 leading-relaxed",o.budget.fits?"text-muted-foreground/80":"text-red-400 font-semibold"),children:[l.jsx(yu,{className:"h-3 w-3 shrink-0 mt-0.5"}),l.jsxs("span",{children:["Always-On-Brain ~",o.budget.brain_gb," GB + größtes on-demand (~",o.budget.largest_ondemand_gb," GB) = ",(o.budget.brain_gb+o.budget.largest_ondemand_gb).toFixed(1)," / ",o.budget.gtt_gb," GB",o.budget.fits?" · passt gleichzeitig ✓":" · passt NICHT gleichzeitig ⚠ — heavy/coder würden das Brain verdrängen. Kleineres Brain oder weniger Kontext."]})]})]}),l.jsxs("div",{className:"space-y-4",children:[l.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-3 px-1",children:[l.jsxs("div",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:["Installierte Modell-Bibliothek (",se.length," von ",j.length,")"]}),l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsxs("div",{className:"flex rounded-lg border border-border/40 bg-card/45 p-0.5",children:[l.jsx("button",{onClick:()=>ae("all"),className:ee("px-2.5 py-1 rounded-md text-[9px] font-bold uppercase transition-all cursor-pointer",he==="all"?"bg-primary text-primary-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:"Vorhanden"}),l.jsx("button",{onClick:()=>ae("in_use"),className:ee("px-2.5 py-1 rounded-md text-[9px] font-bold uppercase transition-all cursor-pointer",he==="in_use"?"bg-primary text-primary-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:"In Benutzung"})]}),l.jsxs("div",{className:"flex rounded-lg border border-border/40 bg-card/45 p-0.5",children:[l.jsx("button",{onClick:()=>ue("grid"),className:ee("px-2.5 py-1 rounded-md text-[9px] font-bold uppercase transition-all cursor-pointer",pe==="grid"?"bg-primary text-primary-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:"Grid"}),l.jsx("button",{onClick:()=>ue("list"),className:ee("px-2.5 py-1 rounded-md text-[9px] font-bold uppercase transition-all cursor-pointer",pe==="list"?"bg-primary text-primary-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:"List"})]})]})]}),pe==="grid"?l.jsx("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-3",children:se.length===0?l.jsx("div",{className:"col-span-full text-xs text-muted-foreground border border-dashed border-border/60 rounded-2xl p-12 text-center select-none",children:he==="in_use"?"Keine Modelle in Benutzung (keine Zuweisung oder warm geladene Modelle).":'Keine Modelle konfiguriert. Verwende den Tab "Modelle finden" zum Herunterladen.'}):se.map(W=>{const ke=k.includes(W.name),Ae=a==null?void 0:a.model_list.find(et=>et.role===W.role),Be=W2(W.name);return l.jsxs("div",{className:ee("rounded-2xl border bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 flex flex-col justify-between gap-4 transition-all duration-300 hover:border-primary/40 group relative overflow-hidden",ke?"border-primary/45 shadow-primary/5":W.role?"border-primary/30 bg-primary/5 shadow-inner":"border-border/60"),children:[l.jsxs("div",{className:"space-y-3",children:[l.jsx("div",{className:"flex items-start justify-between gap-3",children:l.jsxs("div",{className:"flex gap-2.5 min-w-0",children:[l.jsx("div",{className:ee("w-7 h-7 rounded-lg border flex items-center justify-center font-bold text-xs shrink-0 shadow-sm",Be.color),title:Be.name,children:Be.initial}),l.jsxs("div",{className:"min-w-0",children:[l.jsx("h3",{className:"text-xs font-bold tracking-tight text-foreground line-clamp-2 break-all font-mono",title:W.name,children:W.name.split("/").pop()}),l.jsxs("div",{className:"flex items-center gap-2 flex-wrap mt-1",children:[l.jsx("span",{className:"text-[9px] font-mono text-muted-foreground bg-background/40 px-1.5 py-0.5 rounded border border-border/30",children:W.quant||"GGUF"}),ke&&l.jsxs("span",{className:"flex items-center gap-1 text-[9px] font-semibold text-emerald-400 uppercase tracking-wider",children:[l.jsx(uh,{className:"h-3 w-3 animate-pulse"})," Warm"]}),W.role&&l.jsx(io,{role:W.role,dense:!0}),b(W.role)&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-background/40 border border-border/40 text-[9px] font-semibold text-muted-foreground",title:"Lebenswichtig für Lucy — geschützt vor Löschen/Entladen.",children:"🔒 geschützt"}),v&&P(W.name)&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-fuchsia-500/10 border border-fuchsia-500/30 text-[9px] font-mono text-fuchsia-300 font-bold uppercase",title:"Ko-resident in der brains-Gruppe — bleibt mit dem Hirn gemeinsam warm, verdrängt es nicht.",children:"🧠 Ko-resident"}),v&&W.prompt_cache&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-cyan-500/10 border border-cyan-500/20 text-[9px] font-mono text-cyan-400 font-bold uppercase",title:"Prompt Caching aktiv",children:"PC"}),v&&(W.spec_active?l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-emerald-500/10 border border-emerald-500/20 text-[9px] font-mono text-emerald-400 font-bold uppercase",title:`Speculative Decoding aktiv (Draft: ${W.spec_draft_model})`,children:"SPEC"}):W.spec_draft_model?l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/20 text-[9px] font-mono text-amber-400 font-bold uppercase",title:`Draft gesetzt (${W.spec_draft_model}), aber INAKTIV — --spec-type fehlt oder Vocab inkompatibel. Über 'Spec' neu konfigurieren.`,children:"SPEC?"}):null),v&&W.parallel_slots>1&&l.jsxs("span",{className:"px-1.5 py-0.5 rounded bg-violet-500/10 border border-violet-500/20 text-[9px] font-mono text-violet-400 font-bold uppercase",title:`${W.parallel_slots} parallele Slots aktiv`,children:["SLOTS: ",W.parallel_slots]}),W.incomplete&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/20 text-[9px] font-mono text-amber-400 font-bold uppercase",title:"GGUF-Datei fehlt — Modell kann nicht geladen werden",children:"⚠ Datei fehlt"})]})]})]})}),l.jsx("div",{className:"border-t border-border/30 pt-3 flex flex-wrap gap-1",children:l.jsx(G2,{caps:W.capabilities})})]}),l.jsxs("div",{className:"space-y-3 pt-1",children:[l.jsxs("div",{className:"grid grid-cols-2 gap-2 text-[10px] font-mono text-muted-foreground",children:[l.jsxs("div",{className:"flex items-center gap-1.5 p-2 bg-background/20 rounded-lg border border-border/20",children:[l.jsx(yu,{className:"h-3.5 w-3.5 text-primary/80"}),l.jsxs("div",{children:[l.jsx("div",{className:"text-[8px] uppercase tracking-wider font-semibold text-muted-foreground/60",children:"Größe"}),l.jsx("div",{className:"text-foreground font-semibold",children:Lr(W.size_bytes)})]})]}),l.jsxs("div",{className:"flex items-center gap-1.5 p-2 bg-background/20 rounded-lg border border-border/20",children:[l.jsx(C4,{className:"h-3.5 w-3.5 text-primary/80"}),l.jsxs("div",{children:[l.jsx("div",{className:"text-[8px] uppercase tracking-wider font-semibold text-muted-foreground/60",children:"Kontext"}),l.jsx("div",{className:"text-foreground font-semibold",children:zw(W.ctx)})]})]})]}),Ae&&l.jsxs("div",{className:"p-3 bg-amber-500/5 border border-amber-500/30 rounded-xl space-y-2 flex flex-col justify-between shrink-0",children:[l.jsxs("div",{className:"text-[9px] font-semibold text-amber-400 flex items-center gap-1",children:[l.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-amber-400 animate-ping"}),l.jsxs("span",{children:["Upgrade verfügbar: ",Ae.repo.split("/").pop()]})]}),l.jsxs("button",{onClick:()=>me(Ae.repo,W.role,W.quant||"Q4_K_M",W.capabilities.tools!=="no"),className:"h-7 w-full flex items-center justify-center gap-1 rounded-lg bg-amber-500 text-black text-[10px] font-bold hover:bg-amber-400 transition-colors cursor-pointer",children:[l.jsx(Us,{className:"h-3 w-3"})," Smart-Swap starten"]})]}),l.jsxs("div",{className:"flex items-center gap-1.5 border-t border-border/20 pt-3 mt-auto",children:[(()=>{const et=b(W.role),Ut=ke&&et,ht=W.incomplete&&!ke||Ut;return l.jsx("button",{onClick:()=>ke?J(W.name):te(W.name),disabled:ht,title:Ut?`„${mr(W.role).label}" bleibt geladen (geschützt).`:void 0,className:ee("flex-1 h-7 rounded-lg text-[9px] font-bold uppercase transition-all border flex items-center justify-center gap-1",ht?"border-border/30 bg-background/10 text-muted-foreground/50 cursor-not-allowed":ke?"border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/15 text-amber-400 cursor-pointer":"border-primary/30 bg-primary/5 hover:bg-primary/15 text-primary cursor-pointer"),children:Ut?"🔒 geladen":ke?"Entladen":"Laden"})})(),v&&l.jsx("button",{onClick:()=>ne(W.name,W.ctx),className:"h-7 px-2.5 rounded-lg border border-border/40 text-[9px] font-bold uppercase hover:bg-accent text-muted-foreground transition-colors cursor-pointer",title:"Kontextlänge anpassen",children:"Ctx"}),v&&E&&l.jsx("button",{onClick:()=>O(W.name),className:ee("h-7 px-2.5 rounded-lg border text-[9px] font-bold uppercase transition-colors cursor-pointer",P(W.name)?"border-fuchsia-500/40 bg-fuchsia-500/10 text-fuchsia-300 hover:bg-fuchsia-500/20":"border-border/40 text-muted-foreground hover:bg-accent"),title:P(W.name)?"Ko-resident (brains): bleibt mit dem Hirn gemeinsam warm. Klick = aus der Gruppe nehmen.":"Zur brains-Gruppe hinzufügen — lädt dann ko-resident neben dem Hirn, statt es zu verdrängen.",children:"🧠"}),v&&l.jsxs("button",{onClick:()=>H(W),className:ee("h-7 px-2.5 rounded-lg border text-[9px] font-bold uppercase transition-colors cursor-pointer flex items-center gap-1",W.spec_active?"border-emerald-500/30 text-emerald-400 hover:bg-emerald-500/10":W.spec_draft_model?"border-amber-500/30 text-amber-400 hover:bg-amber-500/10":"border-border/40 text-muted-foreground hover:bg-accent"),title:"Speculative Draft konfigurieren (Vocab-geprüft)",children:[l.jsx(xa,{className:"h-3 w-3"})," Spec"]}),l.jsx("button",{onClick:()=>Z(W.name),disabled:b(W.role),className:ee("h-7 w-7 rounded-lg border border-border/40 flex items-center justify-center transition-colors",b(W.role)?"text-muted-foreground/40 cursor-not-allowed":"text-muted-foreground hover:text-red-400 hover:bg-red-500/5 cursor-pointer"),"aria-label":"Modell löschen",title:b(W.role)?`„${mr(W.role).label}" ist geschützt und kann nicht gelöscht werden.`:"Modell löschen",children:l.jsx(cv,{className:"h-3.5 w-3.5","aria-hidden":"true"})})]})]})]},W.name)})}):l.jsx("div",{className:"space-y-2",children:se.length===0?l.jsx("div",{className:"text-xs text-muted-foreground border border-dashed border-border/60 rounded-2xl p-12 text-center select-none",children:he==="in_use"?"Keine Modelle in Benutzung (keine Zuweisung oder warm geladene Modelle).":'Keine Modelle konfiguriert. Verwende den Tab "Modelle finden" zum Herunterladen.'}):se.map(W=>{const ke=k.includes(W.name),Ae=W2(W.name);return l.jsxs("div",{className:ee("rounded-xl border bg-card/45 backdrop-blur-md p-3.5 shadow-lg shadow-black/5 flex flex-col sm:flex-row sm:items-center justify-between gap-3 hover:border-primary/40 transition-all",ke?"border-primary/45":W.role?"border-primary/30 bg-primary/5":"border-border/60"),children:[l.jsxs("div",{className:"flex items-center gap-3 min-w-0",children:[l.jsx("div",{className:ee("w-8 h-8 rounded-lg border border-border/40 flex items-center justify-center font-bold text-xs shrink-0 shadow-sm",Ae.color),title:Ae.name,children:Ae.initial}),l.jsxs("div",{className:"min-w-0 text-left",children:[l.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[l.jsx("h4",{className:"text-xs font-bold text-foreground truncate max-w-[250px] sm:max-w-[400px] break-all font-mono",title:W.name,children:W.name.split("/").pop()}),W.role&&l.jsx(io,{role:W.role,dense:!0,className:"shrink-0"}),b(W.role)&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-background/40 border border-border/40 text-[8px] font-semibold text-muted-foreground shrink-0",title:"Lebenswichtig für Lucy — geschützt vor Löschen/Entladen.",children:"🔒 geschützt"}),v&&P(W.name)&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-fuchsia-500/10 border border-fuchsia-500/30 text-[8px] font-mono text-fuchsia-300 font-bold uppercase shrink-0",title:"Ko-resident in der brains-Gruppe — bleibt mit dem Hirn gemeinsam warm.",children:"🧠 Ko-resident"}),v&&W.prompt_cache&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-cyan-500/10 border border-cyan-500/20 text-[8px] font-mono text-cyan-400 font-bold uppercase shrink-0",title:"Prompt Caching aktiv",children:"PC"}),v&&(W.spec_active?l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-emerald-500/10 border border-emerald-500/20 text-[8px] font-mono text-emerald-400 font-bold uppercase shrink-0",title:`Speculative Decoding aktiv (Draft: ${W.spec_draft_model})`,children:"SPEC"}):W.spec_draft_model?l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/20 text-[8px] font-mono text-amber-400 font-bold uppercase shrink-0",title:`Draft gesetzt (${W.spec_draft_model}), aber INAKTIV — --spec-type fehlt oder Vocab inkompatibel.`,children:"SPEC?"}):null),v&&W.parallel_slots>1&&l.jsxs("span",{className:"px-1.5 py-0.5 rounded bg-violet-500/10 border border-violet-500/20 text-[8px] font-mono text-violet-400 font-bold uppercase shrink-0",title:`${W.parallel_slots} parallele Slots aktiv`,children:["SLOTS: ",W.parallel_slots]}),W.incomplete&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/20 text-[8px] font-mono text-amber-400 font-bold uppercase shrink-0",title:"GGUF-Datei fehlt",children:"⚠ Datei fehlt"}),ke&&l.jsxs("span",{className:"flex items-center gap-0.5 text-[8px] font-semibold text-emerald-400 uppercase tracking-wider shrink-0",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"})," warm"]})]}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2 mt-0.5",children:[l.jsxs("span",{children:["Größe: ",Lr(W.size_bytes)]}),l.jsx("span",{children:"•"}),l.jsxs("span",{children:["Kontext: ",zw(W.ctx)]}),l.jsx("span",{children:"•"}),l.jsx("span",{className:"font-mono text-[9px]",children:W.quant||"GGUF"})]})]})]}),l.jsxs("div",{className:"flex items-center gap-3 shrink-0 self-end sm:self-auto",children:[l.jsx("div",{className:"hidden lg:flex flex-wrap gap-1",children:l.jsx(G2,{caps:W.capabilities})}),l.jsxs("div",{className:"flex items-center gap-1.5",children:[(()=>{const Be=b(W.role),et=ke&&Be,Ut=W.incomplete&&!ke||et;return l.jsx("button",{onClick:()=>ke?J(W.name):te(W.name),disabled:Ut,title:et?`„${mr(W.role).label}" bleibt geladen (geschützt).`:void 0,className:ee("h-7 px-3 rounded-lg text-[9px] font-bold uppercase transition-all border flex items-center gap-1",Ut?"border-border/30 bg-background/10 text-muted-foreground/50 cursor-not-allowed":ke?"border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/15 text-amber-400 cursor-pointer":"border-primary/30 bg-primary/5 hover:bg-primary/15 text-primary cursor-pointer"),children:et?"🔒 geladen":ke?"Entladen":"Laden"})})(),v&&l.jsx("button",{onClick:()=>ne(W.name,W.ctx),className:"h-7 px-2.5 rounded-lg border border-border/40 text-[9px] font-bold uppercase hover:bg-accent text-muted-foreground transition-all cursor-pointer",title:"Kontextlänge anpassen",children:"Ctx"}),v&&E&&l.jsx("button",{onClick:()=>O(W.name),className:ee("h-7 px-2.5 rounded-lg border text-[9px] font-bold uppercase transition-colors cursor-pointer",P(W.name)?"border-fuchsia-500/40 bg-fuchsia-500/10 text-fuchsia-300 hover:bg-fuchsia-500/20":"border-border/40 text-muted-foreground hover:bg-accent"),title:P(W.name)?"Ko-resident (brains): bleibt mit dem Hirn gemeinsam warm. Klick = aus der Gruppe nehmen.":"Zur brains-Gruppe hinzufügen — lädt dann ko-resident neben dem Hirn, statt es zu verdrängen.",children:"🧠"}),v&&l.jsxs("button",{onClick:()=>H(W),className:ee("h-7 px-2.5 rounded-lg border text-[9px] font-bold uppercase transition-all cursor-pointer flex items-center gap-1",W.spec_active?"border-emerald-500/30 text-emerald-400 hover:bg-emerald-500/10":W.spec_draft_model?"border-amber-500/30 text-amber-400 hover:bg-amber-500/10":"border-border/40 text-muted-foreground hover:bg-accent"),title:"Speculative Draft konfigurieren (Vocab-geprüft)",children:[l.jsx(xa,{className:"h-3 w-3"})," Spec"]}),l.jsx("button",{onClick:()=>Z(W.name),disabled:b(W.role),className:ee("h-7 w-7 rounded-lg flex items-center justify-center border border-border/40 transition-all",b(W.role)?"text-muted-foreground/40 cursor-not-allowed":"text-muted-foreground hover:text-red-400 hover:bg-red-500/5 cursor-pointer"),"aria-label":"Modell löschen",title:b(W.role)?`„${mr(W.role).label}" ist geschützt und kann nicht gelöscht werden.`:"Modell löschen",children:l.jsx(cv,{className:"h-3.5 w-3.5","aria-hidden":"true"})})]})]})]},W.name)})})]}),D&&(()=>{var et,Ut;const W=B&&B.role===D?B:null,ke={};W==null||W.models.forEach(ht=>{ke[ht.name]=ht});const Ae=W?W.models.map(ht=>j.find(ur=>ur.name===ht.name)).filter(Boolean):j,Be=ht=>{M(D,ht),U(null)};return l.jsx("div",{className:"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm flex items-center justify-center p-4 overscroll-contain",role:"dialog","aria-modal":"true","aria-label":`${mr(D).label} konfigurieren`,children:l.jsxs("div",{className:"w-full max-w-md rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[l.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[l.jsxs("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary flex items-center gap-1.5",children:[l.jsx(io,{role:D})," festlegen"]}),l.jsx("button",{onClick:()=>U(null),className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:l.jsx(Wn,{className:"h-4 w-4"})})]}),l.jsxs("div",{className:"flex items-center justify-between gap-2",children:[l.jsxs("p",{className:"text-xs text-muted-foreground",children:["Wähle ein Modell für ",l.jsx("strong",{className:"text-foreground",children:mr(D).label}),l.jsx("span",{className:"block text-[10px] text-muted-foreground/70 mt-0.5",children:mr(D).desc})]}),(W==null?void 0:W.recommended)&&l.jsxs("button",{onClick:()=>Be(W.recommended),title:(et=ke[W.recommended])==null?void 0:et.reason,className:"shrink-0 h-7 px-3 text-[11px] font-semibold text-primary border border-primary/50 bg-primary/10 hover:bg-primary/20 rounded-lg cursor-pointer flex items-center gap-1",children:[l.jsx(xa,{className:"h-3 w-3"})," Auto: ",(Ut=W.recommended.split("/").pop())==null?void 0:Ut.replace(/\.gguf$/i,"")]})]}),l.jsxs("div",{className:"space-y-1.5 max-h-60 overflow-y-auto pr-1",children:[b(D)?l.jsx("div",{className:"w-full px-3 py-2 rounded-lg text-[11px] text-muted-foreground border border-border/30 bg-background/20 flex items-center gap-1.5",children:"🔒 Diese Rolle ist lebenswichtig und kann nicht leer bleiben — wähle stattdessen ein anderes Modell."}):l.jsx("button",{onClick:()=>Be(""),className:"w-full text-left px-3 py-2 rounded-lg text-xs hover:bg-accent text-red-400 font-semibold cursor-pointer border border-red-500/20 bg-red-500/5 flex items-center justify-between",children:l.jsx("span",{children:"Zuweisung entfernen"})}),Ae.map(ht=>{var Or;const ur=ke[ht.name],Ca=ht.role===D,Jn=!!(ur!=null&&ur.recommended),Ii=!!ur&&!ur.suitable;return l.jsxs("button",{onClick:()=>Be(ht.name),className:ee("w-full text-left px-3 py-2.5 rounded-lg text-xs hover:bg-accent flex items-center justify-between font-mono cursor-pointer border",Jn?"border-primary/50 bg-primary/10":Ca?"text-primary font-bold bg-primary/5 border-primary/30":Ii?"border-border/20 bg-background/10 opacity-60":"text-foreground bg-background/20 border-border/30"),children:[l.jsxs("div",{className:"flex flex-col text-left min-w-0",children:[l.jsxs("span",{className:"truncate max-w-[260px] font-semibold flex items-center gap-1.5",children:[(Or=ht.name.split("/").pop())==null?void 0:Or.replace(/\.gguf$/i,""),Jn&&l.jsx("span",{className:"text-[8px] font-bold uppercase tracking-wide text-primary bg-primary/15 px-1.5 py-0.5 rounded",children:"Empfohlen"})]}),l.jsx("span",{className:"text-[9px] text-muted-foreground mt-0.5",children:ur?`${ur.params_b}B · ${ht.quant} · ${ur.reason}`:`${Lr(ht.size_bytes)} · ${ht.quant}`})]}),Ca&&l.jsx(sr,{className:"h-4 w-4 shrink-0 text-primary"})]},ht.name)})]})]})})})(),Y&&l.jsx(bX,{model:Y,onClose:()=>H(null),onChanged:N}),g]})}const NX=[{key:"popular",label:"Beliebt",q:""},{key:"coder",label:"Coder",q:"coder"},{key:"vision",label:"Vision",q:"vision"},{key:"reasoning",label:"Reasoning",q:"reasoning"},{key:"small",label:"Klein (≤4B)",q:"3B"}],EX=["fast","heavy","coder","vision","hermes","scout"],AX=new Intl.NumberFormat(void 0,{notation:"compact",maximumFractionDigits:1});function q2(e){return AX.format(e)}function CX(){const{data:e}=Ni(),t=(e==null?void 0:e.models)??[],[r,n]=y.useState(""),[a,o]=y.useState([]),[c,u]=y.useState(!1),[f,h]=y.useState(""),[m,g]=y.useState("popular"),[v,b]=y.useState(""),[j,k]=y.useState(null),[S,N]=y.useState([]),[E,A]=y.useState("Q4_K_M"),[P,_]=y.useState(""),[O,D]=y.useState(null),[U,B]=y.useState(!1),[F,Y]=y.useState({});async function H(M){u(!0),h("");try{const K=await Se(`/api/hf/search?q=${encodeURIComponent(M)}`);o(K.results),K.results.length||h("Keine Ergebnisse.")}catch(K){h(`Suche fehlgeschlagen: ${K}`)}finally{u(!1)}}y.useEffect(()=>{H("")},[]);function pe(M){g(M.key),n(""),H(M.q)}function ue(){g(""),H(r)}async function he(M,K,ne){B(!1);try{const Z=await Se(`/api/fit?params_b=0&quant=${encodeURIComponent(K)}&ctx=8192&name=${encodeURIComponent(M)}&role=${encodeURIComponent(ne)}`);D(Z)}catch{D(null)}}async function ae(M){if(j===M){k(null);return}k(M),N([]),D(null),_(""),B(!1),h("Analysiere Repository…");try{const K=await Se(`/api/hf/quants?repo=${encodeURIComponent(M)}`);N(K.quants);const ne=K.quants.includes("Q4_K_M")?"Q4_K_M":K.quants[0]||"Q4_K_M";A(ne),h(K.quants.length?"":"Keine GGUF-Dateien in diesem Repo gefunden."),K.quants.length&&he(K.repo,ne,"")}catch(K){h(`Fehler: ${K}`)}}function se(){const M=v.trim();M&&(o(K=>K.some(ne=>ne.repo===M)?K:[{repo:M,downloads:0,likes:0},...K]),b(""),ae(M))}const X=P?t.find(M=>(M.role||"").toLowerCase()===P):void 0;async function te(M){if((O==null?void 0:O.fit.level)==="too_tight"&&!U){B(!0);return}Y(K=>({...K,[M]:"Starte…"}));try{await Se("/api/models/install",{method:"POST",body:JSON.stringify({repo:M,quant:E,role:P||void 0,jinja:!0})}),Y(K=>({...K,[M]:"Download läuft"})),B(!1)}catch{Y(ne=>({...ne,[M]:"Fehler"}))}}const J=M=>{var ne;const K=((ne=M.split("/").pop())==null?void 0:ne.toLowerCase().replace(/-gguf$/i,""))||"";return K.length>3&&t.some(Z=>Z.name.toLowerCase().includes(K))},I=M=>M==="perfect"?"text-emerald-400 border-emerald-500/40 bg-emerald-500/10":M==="marginal"?"text-amber-400 border-amber-500/40 bg-amber-500/10":"text-red-400 border-red-500/40 bg-red-500/10";return l.jsxs("div",{className:"space-y-5",children:[l.jsxs("div",{className:"flex gap-2",children:[l.jsxs("div",{className:"relative flex-1",children:[l.jsx(MN,{className:"absolute left-3 top-2.5 h-4 w-4 text-muted-foreground"}),l.jsx("input",{value:r,onChange:M=>n(M.target.value),onKeyDown:M=>M.key==="Enter"&&ue(),"aria-label":"HuggingFace durchsuchen",type:"search",spellCheck:!1,placeholder:"HuggingFace durchsuchen (z.B. Qwen Coder, Llama-3.1, gemma)…",className:"w-full h-10 pl-9 pr-3 rounded-xl border border-border/60 bg-background/40 text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground"})]}),l.jsx("button",{onClick:ue,className:"h-10 px-5 rounded-xl bg-primary text-primary-foreground text-xs font-semibold hover:opacity-90 transition-all cursor-pointer",children:"Suchen"})]}),l.jsx("div",{className:"flex items-center gap-2 flex-wrap",children:NX.map(M=>l.jsxs("button",{onClick:()=>pe(M),className:ee("flex items-center gap-1.5 rounded-full px-3 py-1.5 text-[11px] font-semibold transition-all cursor-pointer border",m===M.key?"bg-primary/15 text-primary border-primary/30":"border-border/50 text-muted-foreground hover:text-foreground hover:border-border"),children:[M.key==="popular"&&l.jsx(u4,{className:"h-3 w-3"}),M.label]},M.key))}),c?l.jsx("div",{className:"text-xs text-muted-foreground py-10 text-center",children:"Lade GGUF-Modelle von HuggingFace…"}):l.jsxs("div",{className:"space-y-2",children:[a.map(M=>{const K=j===M.repo,ne=J(M.repo),Z=M.repo.includes("/")?M.repo.split("/")[0]:"—",me=M.repo.split("/").pop();return l.jsxs("div",{className:ee("rounded-xl border bg-card/45 backdrop-blur-md transition-all",K?"border-primary/40 shadow-lg shadow-primary/5":"border-border/50 hover:border-primary/30"),children:[l.jsxs("button",{onClick:()=>ae(M.repo),className:"w-full flex items-center gap-3 p-3.5 text-left cursor-pointer",children:[l.jsxs("div",{className:"min-w-0 flex-1",children:[l.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[l.jsx("span",{className:"text-xs font-bold font-mono text-foreground truncate max-w-[280px]",title:M.repo,children:me}),ne&&l.jsxs("span",{className:"flex items-center gap-1 text-[8px] font-bold text-emerald-400 uppercase tracking-wider bg-emerald-500/10 border border-emerald-500/20 px-1.5 py-0.5 rounded",children:[l.jsx(sr,{className:"h-2.5 w-2.5"})," installiert"]})]}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-3 mt-0.5 font-mono",children:[l.jsx("span",{children:Z}),l.jsxs("span",{className:"flex items-center gap-1",children:[l.jsx(Us,{className:"h-3 w-3"})," ",q2(M.downloads)]}),M.likes>0&&l.jsxs("span",{className:"flex items-center gap-1",children:[l.jsx(m4,{className:"h-3 w-3"})," ",q2(M.likes)]})]})]}),K?l.jsx(ON,{className:"h-4 w-4 text-muted-foreground shrink-0"}):l.jsx(PN,{className:"h-4 w-4 text-muted-foreground shrink-0"})]}),K&&l.jsx("div",{className:"border-t border-border/30 p-3.5 space-y-3",children:S.length===0?l.jsx("div",{className:"text-[11px] text-muted-foreground font-mono",children:f||"Lade Quants…"}):l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[l.jsx("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground",children:"Quant"}),l.jsx("select",{value:E,onChange:ge=>{A(ge.target.value),he(M.repo,ge.target.value,P)},"aria-label":"Quantisierung",className:"h-8 rounded-lg border border-border/60 bg-background/40 px-2 text-xs text-foreground font-semibold outline-none",children:S.map(ge=>l.jsx("option",{value:ge,className:"bg-popover text-foreground",children:ge},ge))}),l.jsx("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground ml-1",children:"Rolle"}),l.jsxs("select",{value:P,onChange:ge=>{_(ge.target.value),he(M.repo,E,ge.target.value)},"aria-label":"Rolle",title:"Optional — bestimmt Auto-Konfiguration + setup-bewussten Kontext",className:"h-8 rounded-lg border border-border/60 bg-background/40 px-2 text-xs text-foreground font-semibold outline-none",children:[l.jsx("option",{value:"",className:"bg-popover text-foreground",children:"keine"}),EX.map(ge=>l.jsx("option",{value:ge,className:"bg-popover text-foreground",children:ge},ge))]}),l.jsx("button",{onClick:()=>te(M.repo),disabled:!!F[M.repo]&&F[M.repo]==="Download läuft",className:ee("h-8 px-3.5 ml-auto rounded-lg text-xs font-semibold transition-all cursor-pointer flex items-center gap-1.5",U?"bg-red-500 text-white hover:opacity-90":"bg-primary text-primary-foreground hover:opacity-90"),children:F[M.repo]?F[M.repo]:U?l.jsxs(l.Fragment,{children:[l.jsx(bi,{className:"h-3.5 w-3.5"})," OOM — trotzdem laden"]}):l.jsxs(l.Fragment,{children:[l.jsx(Us,{className:"h-3.5 w-3.5"})," Herunterladen"]})})]}),O&&l.jsxs("div",{className:ee("flex flex-wrap items-center gap-x-3 gap-y-1 rounded-lg border px-3 py-2 text-[11px] font-medium",I(O.fit.level)),children:[l.jsx("span",{className:"font-bold uppercase tracking-wide",children:O.fit.text}),l.jsxs("span",{className:"font-mono opacity-90",children:["~",O.params_b,"B · ~",O.fit.req_gb," GB / ",O.sys_ram_gb," GB · ~",O.fit.tps," t/s"]}),O.fit.level!=="too_tight"?l.jsxs("span",{className:"font-mono opacity-80",children:["ctx → ",(O.assigned_ctx/1024).toFixed(0),"k"]}):l.jsx("span",{className:"opacity-90",children:"— passt nicht, würde beim Laden abstürzen (OOM)."})]}),X&&l.jsxs("div",{className:"flex items-start gap-2 rounded-lg border border-amber-500/40 bg-amber-500/10 px-3 py-2 text-[11px] text-amber-400",children:[l.jsx(bi,{className:"h-3.5 w-3.5 mt-0.5 shrink-0"}),l.jsxs("span",{children:["Rolle ",l.jsxs("strong",{children:["„",P,'"']})," hält aktuell ",l.jsx("strong",{children:X.name.split("/").pop()})," — wird beim Download übernommen."]})]})]})})]},M.repo)}),!a.length&&!c&&l.jsx("div",{className:"text-xs text-muted-foreground py-10 text-center",children:f||"Keine Ergebnisse."})]}),l.jsxs("div",{className:"border-t border-border/30 pt-4 flex flex-col sm:flex-row gap-2 items-stretch sm:items-center",children:[l.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground shrink-0",children:"Direkt:"}),l.jsx("input",{value:v,onChange:M=>b(M.target.value),onKeyDown:M=>M.key==="Enter"&&se(),"aria-label":"Repository oder URL direkt eingeben",spellCheck:!1,placeholder:"org/repo oder HF-URL (z.B. unsloth/Qwen2.5-Coder-7B-Instruct-GGUF)",className:"flex-1 h-9 rounded-lg border border-border/60 bg-background/40 px-3 text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground font-mono"}),l.jsx("button",{onClick:se,className:"h-9 px-4 rounded-lg border border-border/60 bg-background/20 text-xs font-semibold hover:border-primary/50 hover:bg-background/40 transition-all cursor-pointer whitespace-nowrap",children:"Laden"})]})]})}const PX={fast:{title:"Schnelles Alltags-Hirn",desc:"Schnelle MoE-Antworten für Chat, Zusammenfassungen und alltägliche Aufgaben.",icon:xa},heavy:{title:"Schweres Reasoning",desc:"Große Modelle für komplexe Logik, Mathematik und tiefgründiges Planen.",icon:Ao},coder:{title:"Coden & Entwicklung",desc:"Autovervollständigung, Refactoring und Codegenerierung direkt in deiner IDE.",icon:Bs},vision:{title:"Bilder & Vision",desc:"Verarbeitet Bilder, Screenshots und visuelle Diagramme in multimodalen Chats.",icon:uf},hermes:{title:"Lucys Hirn (Agent)",desc:"Lucys dauer-warmes Agent-Hirn mit Tool-Calling — bleibt ko-resident, lädt nie kalt nach.",icon:Q3},scout:{title:"Multimodal-Allrounder",desc:"Multimodaler Allrounder für schnelle Antworten, Übersetzungen und Alltag.",icon:lv}};function OX(){const{data:e,isLoading:t,error:r}=RD(),{data:n}=Ni(),{data:a}=vh(),o=(n==null?void 0:n.models)??[],c=r?String(r):"",[u,f]=y.useState({}),[h,m]=y.useState({}),[g,v]=y.useState("recommended");async function b(j,k,S,N){f(E=>({...E,[j]:"Starte..."}));try{await Se("/api/models/install",{method:"POST",body:JSON.stringify({repo:j,role:k,quant:S,jinja:N})}),f(E=>({...E,[j]:"Download läuft"}))}catch{f(A=>({...A,[j]:"Fehler"}))}}return l.jsxs("div",{className:"space-y-6",children:[l.jsx("div",{className:"flex rounded-xl border border-border/60 bg-card/45 backdrop-blur-md p-1 w-fit",children:[["recommended","Empfohlen"],["browse","Stöbern & Suchen"]].map(([j,k])=>l.jsx("button",{onClick:()=>v(j),className:ee("rounded-lg px-4 py-1.5 text-xs font-semibold tracking-wide transition-all cursor-pointer",g===j?"bg-primary text-primary-foreground shadow-md shadow-primary/10":"text-muted-foreground hover:text-foreground"),children:k},j))}),g==="browse"?l.jsx(CX,{}):t?l.jsx("div",{className:"text-xs text-muted-foreground py-12 text-center",children:"Analysiere Hardware und suche passende GGUF-Empfehlungen…"}):c||!e?l.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400",children:["Empfehlungsdienst temporär nicht erreichbar (",c,")."]}):l.jsxs("div",{className:"space-y-8",children:[l.jsxs("div",{className:"text-[10px] font-mono text-muted-foreground bg-background/25 border border-border/40 p-4 rounded-xl flex flex-col sm:flex-row sm:items-center justify-between gap-3 shadow-sm",children:[l.jsxs("div",{children:["Modell-Registry geladen für ",l.jsxs("span",{className:"text-foreground font-bold",children:[e.sys_ram_gb," GB"]})," System-RAM."]}),l.jsxs("div",{className:"flex items-center gap-1.5",children:[l.jsx(F4,{className:"h-3.5 w-3.5 text-primary fill-primary/20"}),l.jsx("span",{children:"Empfehlungen sind automatisch auf deine Box-Hardware optimiert."})]})]}),l.jsx("div",{className:"grid gap-6 md:grid-cols-2",children:e.categories.map(j=>{const k=PX[j.role]||{title:j.title||j.role,desc:"Spezifisches Modell für diese Systemrolle.",icon:jy},S=k.icon,N=o.find(D=>D.role===j.role),E=a==null?void 0:a.model_list.find(D=>D.role===j.role),A=j.models.find(D=>D.repo===j.recommended)||j.models[0];if(!A)return null;const P=u[A.repo],_=j.models.filter(D=>D.repo!==j.recommended),O=!!h[j.role];return l.jsxs("div",{className:ee("rounded-2xl border bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 flex flex-col justify-between gap-5 transition-all duration-300 hover:border-primary/40",N?"border-border/60":"border-primary/20 shadow-primary/5"),children:[l.jsxs("div",{className:"space-y-4",children:[l.jsxs("div",{className:"flex items-start justify-between gap-3",children:[l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsx("div",{className:"w-10 h-10 rounded-xl bg-primary/10 border border-primary/20 flex items-center justify-center text-primary shadow-sm shrink-0",children:l.jsx(S,{className:"h-5.5 w-5.5"})}),l.jsxs("div",{children:[l.jsx("h3",{className:"text-sm font-bold tracking-tight text-foreground",children:k.title}),l.jsxs("span",{className:"text-[9px] font-mono text-muted-foreground uppercase bg-background/50 px-1.5 py-0.5 rounded border border-border/30 inline-block mt-0.5",children:["Rolle: ",j.role]})]})]}),N?l.jsxs("span",{className:"flex items-center gap-1.5 text-[9px] font-bold text-emerald-400 uppercase tracking-wider bg-emerald-500/10 border border-emerald-500/20 px-2.5 py-1 rounded-lg",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"}),"Aktiviert"]}):l.jsx("span",{className:"text-[9px] font-bold text-primary/70 uppercase tracking-wider bg-primary/10 border border-primary/20 px-2.5 py-1 rounded-lg",children:"Frei"})]}),l.jsx("p",{className:"text-xs text-muted-foreground leading-relaxed",children:k.desc}),l.jsx("div",{className:"p-3.5 rounded-xl bg-background/35 border border-border/30 space-y-2.5",children:N?l.jsxs("div",{className:"space-y-1.5",children:[l.jsx("div",{className:"text-[9px] font-bold uppercase tracking-wider text-muted-foreground/60",children:"Aktive GGUF-Belegung"}),l.jsx("div",{className:"text-xs font-mono font-bold text-foreground truncate",title:N.name,children:N.name.split("/").pop()}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2",children:[l.jsxs("span",{children:["Größe: ",wv(N.size_bytes||0)]}),l.jsx("span",{children:"•"}),l.jsxs("span",{children:["Quant: ",N.quant||"GGUF"]})]})]}):l.jsxs("div",{className:"space-y-1.5",children:[l.jsx("div",{className:"text-[9px] font-bold uppercase tracking-wider text-primary/80",children:"Empfohlenes Modell"}),l.jsx("div",{className:"text-xs font-mono font-bold text-foreground truncate",title:A.name,children:A.name}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2 flex-wrap",children:[l.jsxs("span",{children:["Ersteller: ",A.author]}),l.jsx("span",{children:"•"}),l.jsxs("span",{children:["Quant: ",A.quant]})]}),l.jsx("div",{className:"flex items-center gap-1.5 pt-0.5",children:l.jsx(hX,{fit:A.fit})})]})}),l.jsx("div",{className:"pt-1",children:N?E?l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"text-[9px] font-semibold text-amber-400 flex items-center gap-1.5",children:[l.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-amber-400 animate-ping shrink-0"}),l.jsxs("span",{children:["Bessere Version in der Registry: ",E.repo.split("/").pop()]})]}),l.jsxs("button",{onClick:()=>b(E.repo,j.role,A.quant||"Q4_K_M",A.caps.tools!=="no"),disabled:!!u[E.repo],className:"h-8 w-full flex items-center justify-center gap-1.5 rounded-lg bg-amber-500 text-black text-xs font-bold hover:bg-amber-400 disabled:opacity-50 transition-all cursor-pointer shadow-md shadow-amber-500/10",children:[l.jsx(Us,{className:"h-3.5 w-3.5"}),u[E.repo]||"Auf neue Version aktualisieren"]})]}):l.jsxs("div",{className:"h-8 flex items-center justify-center gap-1.5 text-[10px] font-bold text-emerald-400 uppercase tracking-wide bg-emerald-500/5 border border-emerald-500/10 rounded-lg select-none",children:[l.jsx(sr,{className:"h-4 w-4"})," Auf neuestem Stand"]}):l.jsxs("button",{onClick:()=>b(A.repo,j.role,A.quant||"Q4_K_M",A.caps.tools!=="no"),disabled:!!P,className:ee("h-8 w-full flex items-center justify-center gap-1.5 rounded-lg text-xs font-bold transition-all cursor-pointer border",P?"border-primary/40 bg-primary/5 text-primary":"bg-primary text-primary-foreground hover:opacity-90 shadow-md shadow-primary/10"),children:[l.jsx(Us,{className:"h-3.5 w-3.5"}),P||"Optimales Modell einsetzen"]})})]}),_.length>0&&l.jsxs("div",{className:"border-t border-border/20 pt-3",children:[l.jsxs("button",{onClick:()=>m(D=>({...D,[j.role]:!O})),className:"flex items-center gap-1.5 text-[10px] text-muted-foreground/80 hover:text-foreground transition-colors cursor-pointer",children:[O?l.jsx(ON,{className:"h-3 w-3"}):l.jsx(PN,{className:"h-3 w-3"}),l.jsxs("span",{children:["Alternative Empfehlungen anzeigen (",_.length,")"]})]}),O&&l.jsx("div",{className:"mt-2.5 space-y-2 max-h-36 overflow-y-auto pr-1 scrollbar-thin",children:_.map(D=>l.jsxs("div",{className:"p-2 rounded-lg bg-background/25 border border-border/20 flex items-center justify-between gap-3",children:[l.jsxs("div",{className:"min-w-0",children:[l.jsx("div",{className:"text-[10px] font-mono font-bold text-foreground truncate",title:D.name,children:D.name}),l.jsxs("div",{className:"text-[9px] text-muted-foreground flex items-center gap-1.5 mt-0.5",children:[l.jsxs("span",{children:["Quant: ",D.quant]}),l.jsx("span",{children:"•"}),l.jsx("span",{children:D.fit.text})]})]}),l.jsx("button",{onClick:()=>b(D.repo,j.role,D.quant||"Q4_K_M",D.caps.tools!=="no"),disabled:!!u[D.repo],className:"h-6 px-2.5 rounded bg-background/40 hover:bg-background/80 border border-border/40 text-[9px] font-bold text-foreground transition-all cursor-pointer shrink-0 disabled:opacity-50",children:u[D.repo]||"Installieren"})]},D.repo))})]})]},j.role)})})]})]})}function _X(){const[e,t]=y.useState("cockpit");return l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{className:"flex flex-col sm:flex-row justify-between sm:items-center gap-4",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Modell-Manager"}),l.jsx("p",{className:"text-sm text-muted-foreground",children:"Verwalte deine Modelle und passe das Gateway-Routing live über das interaktive Cockpit an."})]}),l.jsx("div",{className:"flex rounded-xl border border-border/60 bg-card/45 backdrop-blur-md p-1 self-start",children:["cockpit","discover"].map(r=>l.jsx("button",{onClick:()=>t(r),className:ee("rounded-lg px-4 py-1.5 text-xs font-semibold tracking-wide uppercase transition-all cursor-pointer",e===r?"bg-primary text-primary-foreground shadow-md shadow-primary/10":"text-muted-foreground hover:text-foreground"),children:r==="cockpit"?"Cockpit":"Modelle finden"},r))})]}),l.jsx(xX,{}),l.jsx("div",{className:"transition-all duration-300",children:e==="cockpit"?l.jsx(qO,{}):l.jsx(OX,{})})]})}const MX={cline:"cline_settings.json",cursor:"Settings → Models",opencode:"opencode.jsonc",zed:"settings.json",continue:"~/.continue/config.json",claude_code:"~/.zshrc / env"};function Q2({line:e,loading:t}){return t||!e?l.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] font-semibold text-muted-foreground",children:[l.jsx(dh,{className:"h-3 w-3 animate-spin"})," prüfe…"]}):e.ok?l.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] font-semibold text-emerald-400",children:[l.jsx(e4,{className:"h-3 w-3"})," ",e.detail]}):l.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] font-semibold text-red-400",children:[l.jsx(r4,{className:"h-3 w-3"})," ",e.detail]})}function Y2({tool:e,fileName:t,accent:r,copied:n,onCopy:a}){return l.jsxs("div",{className:"flex flex-col border border-border/60 bg-black/60 rounded-2xl overflow-hidden shadow-2xl",children:[l.jsxs("div",{className:"flex h-11 items-center justify-between px-4 border-b border-border/40 bg-black/40 shrink-0",children:[l.jsxs("div",{className:"flex items-center gap-1.5",children:[l.jsx("span",{className:"h-3 w-3 rounded-full bg-red-500/80"}),l.jsx("span",{className:"h-3 w-3 rounded-full bg-amber-500/80"}),l.jsx("span",{className:"h-3 w-3 rounded-full bg-emerald-500/80"})]}),l.jsx("div",{className:"flex items-center gap-1.5 text-[10px] font-mono text-muted-foreground/75 bg-background/30 px-3 py-1 rounded-md border border-border/20",children:l.jsx("span",{children:t})}),l.jsxs("button",{onClick:a,className:"flex h-7 px-2.5 items-center gap-1.5 rounded-lg border border-border/40 bg-background/30 text-[10px] font-semibold text-muted-foreground hover:text-foreground hover:bg-background/60 transition-all cursor-pointer",children:[n?l.jsx(sr,{className:"h-3.5 w-3.5 text-emerald-400"}):l.jsx(uv,{className:"h-3.5 w-3.5"}),l.jsx("span",{children:n?"Kopiert":"Kopieren"})]})]}),l.jsx("pre",{className:ee("p-5 overflow-x-auto text-xs font-mono whitespace-pre leading-relaxed scrollbar-thin select-text bg-black/10",r==="teal"?"text-cyan-200/90":"text-violet-200/90"),children:l.jsx("code",{children:e.snippet})})]})}function QO(){const[e,t]=y.useState(localStorage.getItem("mc_host")||"192.168.178.151"),[r,n]=y.useState(localStorage.getItem("mc_mcp_path")||""),[a,o]=y.useState("cline"),[c,u]=y.useState(null),f=new URLSearchParams({host:e});r&&f.set("mcp_path",r);const{data:h,error:m}=$D(f.toString()),{data:g,isLoading:v}=zD(),b=m?String(m):"";function j(E){t(E),E&&localStorage.setItem("mc_host",E)}function k(E){n(E),localStorage.setItem("mc_mcp_path",E)}const S=h==null?void 0:h.tools[a];async function N(E,A){A&&(await navigator.clipboard.writeText(A),u(E),setTimeout(()=>u(null),1500))}return l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Verbindung & Integration"}),l.jsxs("p",{className:"text-sm text-muted-foreground",children:["Binde deinen lokalen Agenten an die Box an — über ",l.jsx("span",{className:"text-foreground",children:"zwei getrennte Leitungen"}),": das Modell (Gateway) und das geteilte Gedächtnis (MCP)."]})]}),l.jsxs("div",{className:"p-5 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md shadow-lg shadow-black/10",children:[l.jsxs("div",{className:"grid gap-4 md:grid-cols-[170px_1fr] items-center",children:[l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-background/40 p-4 text-center",children:[l.jsx(g4,{className:"h-7 w-7 mx-auto text-muted-foreground"}),l.jsx("div",{className:"mt-2 text-sm font-semibold text-foreground",children:"Dein lokaler Agent"}),l.jsx("div",{className:"text-[11px] text-muted-foreground",children:"Cline · Cursor · Zed …"})]}),l.jsxs("div",{className:"flex flex-col gap-2.5",children:[l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsx(sf,{className:"h-4 w-4 text-muted-foreground shrink-0"}),l.jsxs("div",{className:"flex-1 rounded-xl border border-primary/25 bg-primary/5 px-3.5 py-2.5",children:[l.jsxs("div",{className:"flex items-center justify-between gap-2",children:[l.jsxs("div",{className:"flex items-center gap-2 text-xs font-semibold text-primary",children:[l.jsx(Hn,{className:"h-3.5 w-3.5"})," Leitung 1 — Modell"]}),l.jsx(Q2,{line:g==null?void 0:g.gateway,loading:v})]}),l.jsx("div",{className:"mt-1 text-[11px] font-mono text-primary/80",children:"Gateway · :9001/v1 · Lanes chat / coding"})]})]}),l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsx(sf,{className:"h-4 w-4 text-muted-foreground shrink-0"}),l.jsxs("div",{className:"flex-1 rounded-xl border border-violet-500/25 bg-violet-500/5 px-3.5 py-2.5",children:[l.jsxs("div",{className:"flex items-center justify-between gap-2",children:[l.jsxs("div",{className:"flex items-center gap-2 text-xs font-semibold text-violet-300",children:[l.jsx(Ao,{className:"h-3.5 w-3.5"})," Leitung 2 — Gedächtnis"]}),l.jsx(Q2,{line:g==null?void 0:g.memory,loading:v})]}),l.jsx("div",{className:"mt-1 text-[11px] font-mono text-violet-300/80",children:"MCP · mcp_memory.py · separat"})]})]})]})]}),l.jsxs("p",{className:"mt-3.5 text-[11px] text-muted-foreground leading-relaxed",children:["Der Gateway liefert ",l.jsx("span",{className:"text-foreground",children:"nur das LLM"}),". Das geteilte Gedächtnis läuft über einen",l.jsx("span",{className:"text-foreground",children:" eigenen MCP-Server"})," — beide werden unabhängig eingerichtet."]})]}),l.jsxs("div",{className:"grid gap-4 md:grid-cols-2 p-5 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md shadow-lg shadow-black/10",children:[l.jsxs("div",{className:"space-y-1.5",children:[l.jsxs("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground flex items-center gap-1.5",children:[l.jsx(f4,{className:"h-3.5 w-3.5 text-primary"})," Box LAN IP-Adresse"]}),l.jsx("input",{value:e,onChange:E=>j(E.target.value),"aria-label":"Box LAN IP-Adresse",spellCheck:!1,placeholder:"z.B. 192.168.178.151",className:"w-full h-9 rounded-lg border border-border/60 bg-background/40 px-3 font-mono text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground"})]}),l.jsxs("div",{className:"space-y-1.5",children:[l.jsxs("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground flex items-center gap-1.5",children:[l.jsx(c4,{className:"h-3.5 w-3.5 text-violet-400"})," Lokaler MCP-Scriptpfad",l.jsx("span",{className:"text-violet-400/70 normal-case font-semibold tracking-normal",children:"(nur Leitung 2)"})]}),l.jsx("input",{value:r,onChange:E=>k(E.target.value),"aria-label":"Lokaler MCP-Scriptpfad",spellCheck:!1,placeholder:"z.B. F:\\Coding Stuff\\mission-control-2\\mcp\\mcp_memory.py",className:"w-full h-9 rounded-lg border border-border/60 bg-background/40 px-3 font-mono text-xs outline-none focus:ring-1 focus:ring-violet-500/50 text-foreground"})]})]}),b&&l.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400",children:["Fehler beim Generieren der Snippets: ",b]}),h&&l.jsxs("div",{className:"grid gap-5 lg:grid-cols-2",children:[l.jsxs("div",{className:"space-y-3 rounded-2xl border border-border/60 border-t-2 border-t-primary/70 bg-card/30 p-4",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center gap-2 text-sm font-space font-bold text-foreground",children:[l.jsx("span",{className:"flex h-5 w-5 items-center justify-center rounded-md bg-primary/15 text-primary text-[11px]",children:"1"}),"Modell anbinden"]}),l.jsx("p",{className:"text-[11px] text-muted-foreground mt-0.5",children:"Wähle dein Tool — das Snippet zeigt auf den Gateway."})]}),l.jsx("div",{className:"flex flex-wrap gap-1.5",children:Object.entries(h.tools).map(([E,A])=>l.jsx("button",{onClick:()=>o(E),className:ee("rounded-lg px-3 py-1.5 text-[11px] font-semibold tracking-wide transition-all cursor-pointer",a===E?"bg-primary text-primary-foreground shadow-md shadow-primary/10":"border border-border/50 text-muted-foreground hover:text-foreground"),children:A.label},E))}),S&&l.jsxs(l.Fragment,{children:[S.note&&l.jsxs("div",{className:"flex items-start gap-2.5 p-3 rounded-xl bg-primary/5 border border-primary/20 text-[11px] text-muted-foreground leading-relaxed",children:[l.jsx(pw,{className:"h-4 w-4 text-primary shrink-0 mt-0.5"}),l.jsx("span",{children:S.note})]}),l.jsx(Y2,{tool:S,fileName:MX[a]||"config.json",accent:"teal",copied:c==="model",onCopy:()=>N("model",S.snippet)})]})]}),l.jsxs("div",{className:"space-y-3 rounded-2xl border border-border/60 border-t-2 border-t-violet-500/70 bg-card/30 p-4",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center gap-2 text-sm font-space font-bold text-foreground",children:[l.jsx("span",{className:"flex h-5 w-5 items-center justify-center rounded-md bg-violet-500/15 text-violet-300 text-[11px]",children:"2"}),"Gedächtnis anbinden",l.jsx("span",{className:"text-[10px] font-medium text-muted-foreground normal-case",children:"optional"})]}),l.jsxs("p",{className:"text-[11px] text-muted-foreground mt-0.5",children:["Ein MCP-Block — gilt zusätzlich für ",l.jsx("em",{children:"jedes"})," Tool aus Schritt 1."]})]}),l.jsxs("div",{className:"flex items-start gap-2.5 p-3 rounded-xl bg-violet-500/5 border border-violet-500/20 text-[11px] text-muted-foreground leading-relaxed",children:[l.jsx(pw,{className:"h-4 w-4 text-violet-400 shrink-0 mt-0.5"}),l.jsx("span",{children:h.memory.note})]}),l.jsx(Y2,{tool:h.memory,fileName:"mcp.json",accent:"violet",copied:c==="memory",onCopy:()=>N("memory",h.memory.snippet)})]})]})]})}const IX="modulepreload",TX=function(e){return"/"+e},X2={},DX=function(t,r,n){let a=Promise.resolve();if(r&&r.length>0){let c=function(h){return Promise.all(h.map(m=>Promise.resolve(m).then(g=>({status:"fulfilled",value:g}),g=>({status:"rejected",reason:g}))))};document.getElementsByTagName("link");const u=document.querySelector("meta[property=csp-nonce]"),f=(u==null?void 0:u.nonce)||(u==null?void 0:u.getAttribute("nonce"));a=c(r.map(h=>{if(h=TX(h),h in X2)return;X2[h]=!0;const m=h.endsWith(".css"),g=m?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${h}"]${g}`))return;const v=document.createElement("link");if(v.rel=m?"stylesheet":IX,m||(v.as="script"),v.crossOrigin="",v.href=h,f&&v.setAttribute("nonce",f),document.head.appendChild(v),m)return new Promise((b,j)=>{v.addEventListener("load",b),v.addEventListener("error",()=>j(new Error(`Unable to preload CSS for ${h}`)))})}))}function o(c){const u=new Event("vite:preloadError",{cancelable:!0});if(u.payload=c,window.dispatchEvent(u),!u.defaultPrevented)throw c}return a.then(c=>{for(const u of c||[])u.status==="rejected"&&o(u.reason);return t().catch(o)})};class RX extends y.Component{constructor(){super(...arguments);is(this,"state",{error:null})}static getDerivedStateFromError(r){return{error:r}}render(){return this.state.error?l.jsxs("div",{className:"h-[480px] rounded-2xl border border-red-500/20 bg-red-500/5 p-6 text-xs text-red-400 overflow-auto",children:[l.jsx("div",{className:"font-semibold mb-2",children:"Graph konnte nicht gerendert werden"}),l.jsx("pre",{className:"whitespace-pre-wrap break-words text-[11px] leading-relaxed",children:this.state.error.message})]}):this.props.children}}const LX=y.lazy(()=>DX(()=>import("./GraphView-E0VQUPTe.js"),[]).then(e=>({default:e.GraphView}))),Qd=["identity","knowledge","rules","events"],Z2=new Set(["auto","agent","hermes"]),Wg={identity:{label:"Identität",icon:U4,bg:"bg-cyan-500/10",text:"text-cyan-400"},knowledge:{label:"Wissen",icon:ks,bg:"bg-indigo-500/10",text:"text-indigo-400"},rules:{label:"Regeln",icon:M4,bg:"bg-violet-500/10",text:"text-violet-400"},events:{label:"Ereignisse",icon:n4,bg:"bg-amber-500/10",text:"text-amber-400"}},J2={label:"Gedächtnis",icon:sv,text:"text-muted-foreground"},$X={identity:"border-l-cyan-500/80",knowledge:"border-l-indigo-500/80",rules:"border-l-violet-500/80",events:"border-l-amber-500/80"},eN=`Hi Hermes! Lass uns ein kurzes Onboarding machen, damit du dich künftig an mich erinnerst. Stell mir nacheinander ein paar kurze Fragen zu: -1) wer ich bin und woran ich gerade arbeite, -2) wie ich angesprochen werden möchte, -3) meine bevorzugten Tools, Sprachen und Arbeitsweise, -4) wichtige Regeln/Konventionen, die du beachten sollst, -5) meine Infrastruktur (Server, Dienste – ohne Geheimnisse). -Frag immer nur eine Sache auf einmal und fass am Ende zusammen, was du dir gemerkt hast.`;function YO(){const[e,t]=y.useState(""),[r,n]=y.useState(""),[a,o]=y.useState(""),[c,u]=y.useState("knowledge"),[f,h]=y.useState(!1),[m,g]=y.useState(!1),[v,b]=y.useState("liste"),[j,k]=y.useState(!1),S=Yn(),{showAlert:N,showConfirm:E,dialogElement:A}=Aa(),{data:P=[]}=vv({}),{data:_=[],error:O}=vv({q:r,category:e}),{data:D}=MD(v==="graph"),U=O?String(O):"",B=()=>{S.invalidateQueries({queryKey:["memory"]}),S.invalidateQueries({queryKey:["memory-graph"]})},F=y.useMemo(()=>{const I=P.length,M=P.filter(K=>Z2.has(K.source)).length;return{total:I,auto:M,manual:I-M,cats:new Set(P.map(K=>K.category)).size}},[P]),Y=P.length===0,H=y.useMemo(()=>{const I=D??{nodes:[],edges:[]};if(!r.trim())return I;const M=r.toLowerCase(),K=I.nodes.filter(Z=>Z.content.toLowerCase().includes(M)),ne=new Set(K.map(Z=>Z.id));return{nodes:K,edges:I.edges.filter(Z=>ne.has(Z.source)&&ne.has(Z.target))}},[D,r]),pe=y.useMemo(()=>{const I={};return _.forEach(M=>{var K;(I[K=M.category]??(I[K]=[])).push(M)}),I},[_]),ue=y.useMemo(()=>_.filter(I=>!Qd.includes(I.category)),[_]);async function he(){a.trim()&&(await Se("/api/memory",{method:"POST",body:JSON.stringify({content:a,category:c,source:"ui"})}),o(""),k(!1),B())}function ae(I){E("Eintrag löschen?","Diesen Gedächtnis-Eintrag dauerhaft entfernen?",async()=>{try{await Se(`/api/memory/${I}`,{method:"DELETE"}),B()}catch(M){N("Fehler",`Löschen fehlgeschlagen: ${M.message||M}`)}})}async function se(){try{await navigator.clipboard.writeText(eN),g(!0),setTimeout(()=>g(!1),1800)}catch{N("Kopieren fehlgeschlagen","Markiere den Prompt und kopiere ihn manuell (Strg+C).")}}function X(){se(),window.dispatchEvent(new CustomEvent("mc-navigate",{detail:{view:"terminal"}}))}async function te(){h(!0);try{const I=await Se("/api/memory/dedupe",{method:"POST",body:JSON.stringify({apply:!1})});if(I.duplicate_count===0){N("Ergebnis","Keine Dubletten gefunden — alles sauber.");return}E("Deduplizierung bestätigen",`${I.duplicate_count} Dublette(n) in ${I.groups.length} Gruppe(n) gefunden. Entfernen?`,async()=>{try{await Se("/api/memory/dedupe",{method:"POST",body:JSON.stringify({apply:!0})}),B()}catch(M){N("Fehler",`Fehler beim Löschen: ${M.message}`)}})}catch(I){N("Fehler",`Fehler bei der Deduplizierung: ${I.message}`)}finally{h(!1)}}const J=({value:I,label:M,accent:K})=>l.jsxs("span",{className:ee("flex items-center gap-1.5 text-[11px] rounded-lg px-2.5 py-1 border",K==="auto"?"text-emerald-400 bg-emerald-500/[0.07] border-emerald-500/20":"text-muted-foreground bg-card/40 border-border/50"),children:[K==="auto"&&l.jsx(xs,{className:"h-3 w-3"}),l.jsx("b",{className:ee("font-semibold",K==="auto"?"":"text-foreground"),children:I})," ",M]});return l.jsxs("div",{className:"space-y-5",children:[l.jsxs("div",{className:"flex flex-col lg:flex-row lg:items-center justify-between gap-3",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Gedächtnis-Pool"}),l.jsx("p",{className:"text-sm text-muted-foreground",children:"Geteilte Konstitution — Hermes, IDEs & Gateway lesen und lernen hier per MCP."})]}),l.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[l.jsxs("div",{className:"relative",children:[l.jsx("input",{value:r,onChange:I=>n(I.target.value),"aria-label":"Gedächtnis durchsuchen",type:"search",placeholder:"Semantisch suchen…",className:"w-52 h-9 pl-8 pr-3 rounded-lg border border-border/60 bg-card/45 text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground"}),l.jsx(MN,{className:"absolute left-2.5 top-2.5 h-3.5 w-3.5 text-muted-foreground"})]}),l.jsxs("button",{onClick:()=>k(I=>!I),className:"h-9 px-3 rounded-lg bg-primary text-primary-foreground text-xs font-semibold hover:opacity-90 transition-all flex items-center gap-1.5 cursor-pointer shadow-md shadow-primary/10",children:[l.jsx(df,{className:"h-4 w-4"})," Eintrag"]}),l.jsx("div",{className:"flex items-center gap-1 p-1 bg-card/30 border border-border/40 rounded-lg",children:[["liste",b4,"Liste"],["graph",T4,"Graph"]].map(([I,M,K])=>l.jsxs("button",{onClick:()=>b(I),className:ee("flex h-7 px-2.5 items-center gap-1.5 text-[11px] font-semibold rounded-md transition-all cursor-pointer",v===I?"bg-primary text-primary-foreground":"text-muted-foreground hover:text-foreground"),children:[l.jsx(M,{className:"h-3.5 w-3.5"})," ",K]},I))}),l.jsx("button",{onClick:te,disabled:f,className:"flex h-9 w-9 items-center justify-center rounded-lg border border-border/60 bg-card hover:border-primary/50 transition-all cursor-pointer shadow-md disabled:opacity-50","aria-label":"Duplikate bereinigen",title:"Deduplizieren",children:l.jsx(xs,{className:"h-4 w-4 text-primary","aria-hidden":"true"})})]})]}),!Y&&l.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[l.jsx(J,{value:F.total,label:"Fakten"}),l.jsx(J,{value:F.auto,label:"auto gelernt",accent:"auto"}),l.jsx(J,{value:F.manual,label:"manuell"}),l.jsx(J,{value:F.cats,label:"Kategorien"}),l.jsxs("span",{className:"ml-auto text-[11px] text-muted-foreground/70 flex items-center gap-1.5",children:[l.jsx(xs,{className:"h-3 w-3 text-emerald-400"})," lernt automatisch aus Hermes-Gesprächen"]})]}),j&&l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-4 space-y-3",children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx("div",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Neuen Eintrag anlegen"}),l.jsx("button",{onClick:()=>k(!1),"aria-label":"Schließen",className:"text-muted-foreground hover:text-foreground",children:l.jsx(Wn,{className:"h-4 w-4","aria-hidden":"true"})})]}),l.jsx("textarea",{value:a,onChange:I=>o(I.target.value),rows:2,"aria-label":"Eintragstext",placeholder:"Eine Regel, Vorliebe oder einen stabilen Fakt über dich oder das Projekt…",className:"w-full resize-none rounded-xl border border-border/60 bg-background/30 p-3 text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground leading-relaxed"}),l.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[l.jsx("select",{value:c,onChange:I=>u(I.target.value),"aria-label":"Kategorie",className:"h-8 rounded-lg border border-border/60 bg-background/50 px-2 text-xs outline-none font-semibold text-foreground cursor-pointer",children:Qd.map(I=>{var M;return l.jsx("option",{value:I,className:"bg-popover text-foreground",children:((M=Wg[I])==null?void 0:M.label)||I},I)})}),l.jsxs("button",{onClick:he,className:"h-9 px-4 rounded-lg bg-primary text-primary-foreground text-xs font-semibold hover:opacity-90 transition-all flex items-center gap-1.5 cursor-pointer",children:[l.jsx(df,{className:"h-4 w-4"})," Speichern"]})]})]}),U&&l.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400",children:["Fehler: ",U]}),Y?l.jsxs("div",{className:"rounded-2xl border border-dashed border-border/60 bg-card/20 p-8 sm:p-10 flex flex-col items-center text-center gap-5",children:[l.jsx("div",{className:"h-14 w-14 rounded-2xl bg-primary/10 flex items-center justify-center",children:l.jsx(j4,{className:"h-7 w-7 text-primary"})}),l.jsxs("div",{className:"space-y-1.5 max-w-lg",children:[l.jsx("h3",{className:"text-base font-semibold text-foreground",children:"Lass Hermes dich kennenlernen"}),l.jsx("p",{className:"text-xs text-muted-foreground leading-relaxed",children:"Statt Fakten einzutippen: führ ein kurzes Onboarding-Gespräch mit Hermes. Was ihr besprecht, merkt sich das Gedächtnis automatisch — du musst nichts manuell pflegen."})]}),l.jsxs("div",{className:"w-full max-w-lg text-left",children:[l.jsxs("div",{className:"flex items-center justify-between mb-1.5",children:[l.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground/60",children:"Sende das an Hermes"}),l.jsx("button",{onClick:se,className:"flex items-center gap-1 text-[10px] font-semibold text-muted-foreground hover:text-foreground transition-colors",children:m?l.jsxs(l.Fragment,{children:[l.jsx(sr,{className:"h-3 w-3 text-emerald-400"})," Kopiert"]}):l.jsxs(l.Fragment,{children:[l.jsx(uv,{className:"h-3 w-3"})," Kopieren"]})})]}),l.jsx("pre",{className:"w-full rounded-xl border border-border/60 bg-background/40 p-3.5 text-[11px] leading-relaxed text-foreground/90 whitespace-pre-wrap font-mono",children:eN})]}),l.jsxs("div",{className:"flex flex-wrap items-center justify-center gap-2",children:[l.jsxs("button",{onClick:X,className:"h-9 px-4 rounded-lg bg-primary text-primary-foreground text-xs font-semibold hover:opacity-90 transition-all flex items-center gap-1.5 cursor-pointer",children:[l.jsx(TN,{className:"h-4 w-4"})," Im Terminal starten"]}),l.jsxs("button",{onClick:se,className:"h-9 px-4 rounded-lg border border-border/60 bg-card text-xs font-semibold hover:border-primary/50 transition-all flex items-center gap-1.5 cursor-pointer",children:[m?l.jsx(sr,{className:"h-4 w-4 text-emerald-400"}):l.jsx(uv,{className:"h-4 w-4"})," Prompt kopieren"]})]}),l.jsxs("p",{className:"text-[11px] text-muted-foreground/70 flex items-center gap-1.5",children:[l.jsx(I4,{className:"h-3 w-3"})," Funktioniert genauso über Telegram —"," ",l.jsx("button",{onClick:()=>k(!0),className:"underline hover:text-foreground",children:"oder lieber manuell anlegen"}),"."]})]}):v==="graph"?l.jsx(RX,{children:l.jsx(y.Suspense,{fallback:l.jsx("div",{className:"h-[480px] rounded-2xl border border-border/60 bg-card/30 flex items-center justify-center text-xs text-muted-foreground",children:"Graph wird geladen…"}),children:l.jsx(LX,{data:H,onDelete:ae})})}):l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"flex flex-wrap items-center gap-1.5 p-1 bg-card/30 border border-border/40 rounded-xl w-fit",children:[l.jsx("button",{onClick:()=>t(""),className:ee("h-7 px-3 rounded-lg text-[10px] font-semibold uppercase tracking-wider transition-all cursor-pointer",e?"text-muted-foreground hover:text-foreground":"bg-primary text-primary-foreground"),children:"Alle"}),Qd.map(I=>{const M=Wg[I]||J2,K=M.icon;return l.jsxs("button",{onClick:()=>t(I),className:ee("h-7 px-2.5 rounded-lg text-[10px] font-semibold uppercase tracking-wider transition-all cursor-pointer flex items-center gap-1",e===I?"bg-primary text-primary-foreground":"text-muted-foreground hover:text-foreground"),children:[l.jsx(K,{className:"h-3 w-3"})," ",M.label]},I)})]}),_.length===0?l.jsx("div",{className:"text-xs text-muted-foreground border border-dashed border-border/60 rounded-2xl p-12 text-center",children:"Keine Einträge für die aktuellen Filterkriterien gefunden."}):l.jsx("div",{className:"space-y-5",children:[...Qd,"__other"].map(I=>{const M=I==="__other"?ue:pe[I]||[];if(!M.length)return null;const K=Wg[I]||J2,ne=K.icon;return l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center gap-2 mb-2 px-1",children:[l.jsx(ne,{className:ee("h-3.5 w-3.5",K.text)}),l.jsx("span",{className:ee("text-[11px] font-bold uppercase tracking-wider",K.text),children:K.label}),l.jsx("span",{className:"text-[10px] font-mono text-muted-foreground/60 bg-card/50 rounded px-1.5 py-0.5",children:M.length}),l.jsx("div",{className:"ml-1 h-px flex-1 bg-border/30"})]}),l.jsx("div",{className:"space-y-2",children:M.map(Z=>{const me=Z2.has(Z.source);return l.jsxs("div",{className:ee("flex items-start justify-between gap-4 p-3.5 rounded-xl border border-l-4 bg-card/45 backdrop-blur-md border-border/60 hover:border-primary/20 transition-all group",$X[Z.category]||"border-l-muted"),children:[l.jsx("span",{className:"text-xs text-foreground leading-relaxed break-words whitespace-pre-wrap flex-1 min-w-0",children:Z.content}),l.jsxs("div",{className:"flex items-center gap-2 shrink-0",children:[typeof Z.score=="number"&&l.jsxs("span",{className:"text-[9px] font-mono text-primary bg-primary/10 px-1.5 py-0.5 rounded",title:"Relevanz der semantischen Suche",children:[Math.round(Z.score*100),"%"]}),l.jsxs("span",{className:ee("flex items-center gap-1 text-[9px] font-mono px-1.5 py-0.5 rounded",me?"text-emerald-400 bg-emerald-500/10":"text-muted-foreground/60 bg-background/20"),title:me?"Automatisch gelernt":"Manuell angelegt",children:[me&&l.jsx(xs,{className:"h-2.5 w-2.5"}),Z.source]}),l.jsx("button",{onClick:()=>ae(Z.id),"aria-label":"Eintrag löschen",title:"Eintrag löschen",className:"h-7 w-7 rounded-lg flex items-center justify-center border border-border/40 text-muted-foreground hover:text-red-400 hover:bg-red-500/5 transition-all opacity-0 group-hover:opacity-100",children:l.jsx(cv,{className:"h-3.5 w-3.5","aria-hidden":"true"})})]})]},Z.id)})})]},I)})})]}),A]})}const zX=["chat","coding","fast","heavy"];function XO(){const{data:e,error:t}=_y(5e3),{data:r}=Ni(),{showAlert:n,dialogElement:a}=Aa(),o=Yn(),c=t?String(t):"",[u,f]=y.useState(!1),h=(r==null?void 0:r.models)??[];async function m(v){try{await Se("/api/agent/brain",{method:"POST",body:JSON.stringify({model:v})}),n("Erledigt",`Hermes-Hirn zeigt jetzt auf das Alias '${v}'. Der Gateway-Dienst wurde neu gestartet.`),o.invalidateQueries({queryKey:Ve.agentStatus}),f(!1)}catch(b){n("Fehler",`Wechsel fehlgeschlagen: ${b.message||b}`)}}async function g(v){try{await Se("/api/agent/brain/set",{method:"POST",body:JSON.stringify({model_id:v})}),n("Erledigt","Agent-Hirn gewechselt (warm gehalten). Gateway wurde neugestartet."),o.invalidateQueries({queryKey:Ve.agentStatus}),o.invalidateQueries({queryKey:Ve.models}),f(!1)}catch(b){n("Fehler",`Wechsel fehlgeschlagen: ${b.message||b}`)}}return l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{className:"flex flex-col sm:flex-row justify-between sm:items-center gap-4",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Hermes Agenten-Cockpit"}),l.jsxs("p",{className:"text-sm text-muted-foreground",children:["Hermes ist ein autonomer Agent, der im Hintergrund der Box läuft (Port ",l.jsx("code",{children:":8642"}),") und seine eigene UI besitzt."]})]}),(e==null?void 0:e.terminal_url)&&l.jsxs("a",{href:Gs(e.terminal_url),target:"_blank",rel:"noopener",className:ee("flex h-9 px-4 items-center gap-1.5 text-xs font-semibold rounded-lg transition-all cursor-pointer shadow-md shrink-0 self-start",e.terminal_reachable?"bg-primary text-primary-foreground hover:opacity-90 shadow-primary/10":"border border-border/60 text-muted-foreground bg-background/20"),children:[l.jsx(Hs,{className:"h-4 w-4"}),l.jsx("span",{children:"Terminal öffnen"})]})]}),c&&l.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400 font-mono",children:["Status nicht lesbar (",c,")."]}),e&&l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10",children:[l.jsxs("div",{className:"mb-4 flex items-center gap-2",children:[l.jsx(wn,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("span",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"Agent-Fluss"})]}),l.jsxs("div",{className:"flex flex-col lg:flex-row lg:items-stretch gap-3",children:[l.jsxs("button",{onClick:()=>e.terminal_reachable&&window.open(Gs(e.terminal_url),"_blank"),title:e.terminal_reachable?"Hermes-Terminal öffnen":"Terminal offline",className:"lg:w-40 shrink-0 rounded-xl border border-border/60 bg-background/30 p-3 text-left hover:border-primary/40 transition-all cursor-pointer flex flex-col justify-center",children:[l.jsxs("div",{className:"flex items-center gap-1.5",children:[l.jsx(uh,{className:ee("h-3.5 w-3.5",e.terminal_reachable?"text-emerald-400":"text-amber-500")}),l.jsx("span",{className:"text-xs font-semibold text-foreground",children:"Terminal"}),l.jsx("span",{className:ee("ml-auto h-1.5 w-1.5 rounded-full animate-pulse",e.terminal_reachable?"bg-emerald-500":"bg-amber-500")})]}),l.jsx("span",{className:"text-[10px] text-muted-foreground font-mono mt-0.5",children:"hermes chat · Clients"})]}),l.jsx("div",{className:"hidden lg:flex items-center text-muted-foreground text-lg select-none",children:"→"}),l.jsxs("div",{className:"flex-1 flex flex-col gap-2.5",children:[l.jsxs("div",{className:"rounded-xl border border-primary/40 bg-primary/5 px-3.5 py-2.5 flex items-center gap-2",children:[l.jsx(wn,{className:"h-3.5 w-3.5 text-primary"}),l.jsx("span",{className:"text-xs font-semibold text-primary",children:"Agent Gateway"}),l.jsx("span",{className:"text-[11px] font-mono text-muted-foreground",children:":8642"}),l.jsxs("span",{className:ee("ml-auto inline-flex items-center gap-1.5 text-[10px] font-bold uppercase font-mono px-2 py-0.5 rounded-full border",e.gateway_reachable?"bg-emerald-500/10 text-emerald-400 border-emerald-500/20":"bg-red-500/10 text-red-400 border-red-500/20"),children:[l.jsx("span",{className:ee("h-1.5 w-1.5 rounded-full",e.gateway_reachable?"bg-emerald-500 animate-pulse":"bg-red-500")}),e.gateway_reachable?"online":"offline"]})]}),l.jsxs("div",{className:"grid gap-2.5 sm:grid-cols-3",children:[l.jsxs("button",{onClick:()=>f(!0),className:"rounded-xl border border-border/60 bg-background/30 p-3 text-left hover:border-primary/45 transition-all cursor-pointer",children:[l.jsxs("div",{className:"flex items-center gap-1.5 text-muted-foreground",children:[l.jsx(Hn,{className:"h-3.5 w-3.5 text-primary"}),l.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider",children:"Hirn"}),l.jsx("span",{className:"ml-auto text-[9px] text-primary/70 font-bold uppercase",children:"wechseln →"})]}),l.jsx("div",{className:"text-[11px] font-mono font-medium text-foreground truncate mt-1",title:e.brain_model,children:e.brain_model||"chat"})]}),l.jsxs("div",{className:"rounded-xl border border-border/60 bg-background/30 p-3",children:[l.jsxs("div",{className:"flex items-center gap-1.5 text-muted-foreground",children:[l.jsx(Qu,{className:"h-3.5 w-3.5 text-primary"}),l.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider",children:"Verdrahtung"})]}),l.jsxs("div",{className:"text-[10px] font-mono mt-1 flex flex-wrap gap-x-2 text-muted-foreground",children:[l.jsxs("span",{children:["Config: ",e.has_config?"✓":"—"]}),l.jsxs("span",{children:["Skills: ",e.has_skills?"✓":"—"]}),l.jsxs("span",{children:["Memory: ",e.has_memories?"✓":"—"]})]})]}),l.jsxs("div",{className:"rounded-xl border border-border/60 bg-background/30 p-3",children:[l.jsxs("div",{className:"flex items-center gap-1.5 text-muted-foreground",children:[l.jsx(gw,{className:"h-3.5 w-3.5 text-primary"}),l.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider",children:"PC"}),l.jsx("span",{className:ee("ml-auto h-1.5 w-1.5 rounded-full",e.pc_executor_reachable?"bg-emerald-500 animate-pulse":"bg-amber-500")})]}),l.jsxs("div",{className:ee("text-[11px] font-mono mt-1",e.pc_executor_reachable?"text-emerald-400":"text-muted-foreground"),children:[":7777 ",e.pc_executor_reachable?"verbunden":"offline"]})]})]})]})]})]}),l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 space-y-4 shadow-lg shadow-black/10",children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(gw,{className:"h-5 w-5 text-primary"}),l.jsx("h3",{className:"text-sm font-bold uppercase tracking-wider text-foreground",children:"PC Verbindung"})]}),l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx("span",{className:ee("h-2 w-2 rounded-full",e.pc_executor_reachable?"bg-emerald-500 animate-pulse":"bg-amber-500")}),l.jsx("span",{className:"text-xs font-semibold text-foreground",children:e.pc_executor_reachable?"Erreichbar":"Nicht verbunden"})]})]}),l.jsxs("div",{className:"grid gap-6 md:grid-cols-2 text-xs text-muted-foreground leading-relaxed text-left",children:[l.jsxs("div",{className:"space-y-3",children:[l.jsxs("p",{children:["Der ",l.jsx("strong",{className:"text-foreground",children:"Hermes PC Executor"})," läuft auf ",l.jsx("code",{className:"text-foreground font-mono px-1 py-0.5 rounded bg-muted/40 border border-border/30",children:"192.168.178.98:7777"})," und ermöglicht Hermes den direkten Zugriff auf deinen Windows-PC — Shell-Befehle, Screenshots, Tastatureingaben."]}),l.jsxs("p",{children:["Hermes erreicht den PC über den MCP-Server ",l.jsx("code",{className:"text-foreground font-mono px-1 py-0.5 rounded bg-muted/40 border border-border/30",children:"hermes-pc-control"}),", der automatisch beim Gateway-Start verbunden wird."]})]}),l.jsx("div",{className:"space-y-3",children:e.pc_executor_reachable?l.jsxs("div",{className:"p-3.5 bg-emerald-500/5 border border-emerald-500/20 rounded-xl space-y-1",children:[l.jsxs("div",{className:"text-emerald-400 font-semibold text-xs flex items-center gap-1.5",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"}),"PC Executor verbunden"]}),l.jsxs("p",{className:"text-[10px]",children:["Hermes kann jetzt per Telegram oder Terminal Befehle auf TobisNicerPC ausführen. Nutze ",l.jsx("code",{className:"text-foreground",children:"pc_shell"}),", ",l.jsx("code",{className:"text-foreground",children:"pc_screenshot"})," oder ",l.jsx("code",{className:"text-foreground",children:"pc_open"}),"."]})]}):l.jsxs("div",{className:"space-y-2",children:[l.jsx("h4",{className:"text-xs font-bold text-foreground",children:"PC Executor starten"}),l.jsxs("p",{children:["Starte ",l.jsx("code",{className:"text-foreground font-mono",children:"start.bat"})," im Ordner ",l.jsx("code",{className:"text-foreground font-mono",children:"client\\hermes-pc\\"})," auf dem Windows-PC und lasse das Fenster offen."]}),l.jsx("div",{className:"p-3 bg-background/25 rounded-xl border border-border/30 font-mono text-[9px] text-cyan-300",children:"client\\hermes-pc\\start.bat"})]})})]})]}),!e.gateway_reachable&&l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 space-y-4 shadow-lg shadow-black/10 text-left",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(ks,{className:"h-5 w-5 text-amber-500"}),l.jsx("h3",{className:"text-sm font-bold uppercase tracking-wider text-foreground",children:"Hermes-Agent Diagnostics"})]}),l.jsxs("div",{className:"text-xs text-muted-foreground space-y-3 leading-relaxed",children:[l.jsx("p",{children:"Der Hermes-Dienst ist auf der Box derzeit offline oder kann sich nicht mit dem lokalen llama-swap verbinden."}),l.jsxs("p",{children:["Stelle sicher, dass die systemd-Dienste auf der Box laufen. Du kannst den Status im ",l.jsx("strong",{children:"OS & Updates Drawer"})," prüfen und die Dienste bei Bedarf neu starten."]}),l.jsxs("div",{className:"p-3.5 bg-background/25 rounded-xl border border-border/30 font-mono text-[10px] space-y-1",children:[l.jsx("div",{className:"text-muted-foreground/60",children:"# Dienste manuell auf der Box prüfen:"}),l.jsx("div",{className:"text-primary",children:"systemctl --user status hermes-gateway"}),l.jsx("div",{className:"text-primary",children:"systemctl --user status hermes-terminal"})]}),l.jsxs("p",{children:["Weitere Einrichtungsdetails (Brain-Konfiguration, MCP-Kopplungen, SSH-Tunneling und Such-Engines) findest du in der Dokumentationsdatei:",l.jsx("code",{className:"ml-1 px-1.5 py-0.5 rounded bg-muted/40 text-foreground border border-border/30",children:"docs/HERMES_SETUP.md"}),"."]})]})]})]}),e&&u&&l.jsx("div",{className:"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm flex items-center justify-center p-4 overscroll-contain",role:"dialog","aria-modal":"true","aria-label":"Hermes-Hirn konfigurieren",children:l.jsxs("div",{className:"w-full max-w-md rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[l.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[l.jsxs("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary flex items-center gap-1.5",children:[l.jsx(Hn,{className:"h-4 w-4"}),l.jsx("span",{children:"Hermes-Hirn konfigurieren"})]}),l.jsx("button",{onClick:()=>f(!1),className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:l.jsx(Wn,{className:"h-4 w-4"})})]}),l.jsxs("div",{className:"space-y-1.5",children:[l.jsx("div",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground",children:"Lane / Gateway-Alias"}),l.jsx("div",{className:"flex flex-wrap gap-1.5",children:zX.map(v=>{const b=e.brain_model===v;return l.jsxs("button",{onClick:()=>m(v),className:ee("px-3 py-1.5 rounded-lg text-xs font-mono font-semibold border transition-all cursor-pointer flex items-center gap-1.5",b?"border-primary/40 bg-primary/10 text-primary":"border-border/30 bg-background/20 text-foreground hover:bg-accent"),children:[v,b&&l.jsx(sr,{className:"h-3.5 w-3.5"})]},v)})}),l.jsxs("p",{className:"text-[10px] text-muted-foreground/70",children:["Schlank & flexibel: das Hirn folgt dem Lane-Routing (z.B. ",l.jsx("code",{className:"text-primary",children:"chat"})," = fast↔heavy)."]})]}),l.jsxs("div",{className:"space-y-1.5",children:[l.jsx("div",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground",children:"Installiertes Modell (warm gehalten)"}),l.jsx("div",{className:"space-y-1.5 max-h-56 overflow-y-auto pr-1",children:h.map(v=>{var j;const b=v.role==="hermes";return l.jsxs("button",{onClick:()=>!b&&g(v.name),disabled:b||v.incomplete,className:ee("w-full text-left px-3 py-2.5 rounded-lg text-xs flex items-center justify-between font-mono border transition-all",b?"border-indigo-500/40 bg-indigo-500/10 text-indigo-300":v.incomplete?"border-border/20 bg-background/10 text-muted-foreground/50 cursor-not-allowed":"border-border/30 bg-background/20 text-foreground hover:bg-accent cursor-pointer"),children:[l.jsxs("div",{className:"flex flex-col min-w-0",children:[l.jsx("span",{className:"font-semibold truncate max-w-[280px]",children:(j=v.name.split("/").pop())==null?void 0:j.replace(/\.gguf$/i,"")}),l.jsxs("span",{className:"text-[9px] text-muted-foreground mt-0.5",children:[v.capabilities.params_b?`${v.capabilities.params_b}B`:"?"," · ",v.capabilities.tools!=="no"?"Tools ✓":"ohne Tools",v.role&&` · Rolle: ${v.role}`]})]}),b?l.jsxs("span",{className:"text-[9px] font-bold uppercase text-indigo-300 shrink-0 flex items-center gap-1",children:[l.jsx(sr,{className:"h-3.5 w-3.5"})," Aktiv"]}):l.jsx("span",{className:"text-[9px] font-bold uppercase text-primary/70 shrink-0",children:"Warm setzen →"})]},v.name)})})]}),l.jsxs("div",{className:"text-[10px] text-amber-400/80 flex items-start gap-1.5 border-t border-border/20 pt-2.5",children:[l.jsx("span",{children:"💡"}),l.jsxs("span",{children:["Für einen ",l.jsx("strong",{children:"Agenten"}),' sind Hermes-Modelle (natives Tool-Calling) meist die robustere Wahl. Neues Modell? Erst über „Modell-Manager → Modelle finden" laden.']})]})]})}),a]})}function FX(){const{data:e}=_y(5e3),t=e!=null&&e.terminal_url?Gs(e.terminal_url):void 0,r=e==null?void 0:e.terminal_reachable;return l.jsxs("div",{className:"flex h-full flex-col gap-4",children:[l.jsxs("div",{className:"flex flex-wrap items-end justify-between gap-3",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text font-space text-2xl font-bold tracking-tight text-transparent",children:"Hermes Terminal"}),l.jsxs("p",{className:"flex items-center gap-2 text-sm text-muted-foreground",children:["Interaktiver Agent (",l.jsx("code",{className:"rounded bg-background/40 px-1 font-mono text-[11px] text-primary",children:"hermes chat"}),') mit Tools & PC-Steuerung — „mehr als Chatten".']})]}),l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsxs("span",{className:"flex items-center gap-1.5 text-[11px] font-medium text-muted-foreground",children:[l.jsx("span",{className:`h-2 w-2 rounded-full ${r?"bg-emerald-500 animate-pulse":"bg-amber-500"}`}),r?"online":"offline"]}),t&&l.jsxs("a",{href:t,target:"_blank",rel:"noopener",className:"flex h-8 items-center gap-1.5 rounded-lg border border-border/60 bg-background/20 px-3 text-xs font-semibold text-muted-foreground transition-all hover:border-primary/50 hover:text-foreground",children:[l.jsx(Hs,{className:"h-3.5 w-3.5"})," In neuem Tab"]})]})]}),t?l.jsxs("div",{className:"relative min-h-[68vh] flex-1 overflow-hidden rounded-2xl border border-border/60 bg-black/50 shadow-lg shadow-black/25",children:[r===!1&&l.jsxs("div",{className:"absolute inset-0 z-10 flex flex-col items-center justify-center gap-3 bg-black/70 text-center",children:[l.jsx(bi,{className:"h-8 w-8 text-amber-400"}),l.jsx("div",{className:"text-sm font-semibold text-amber-300",children:"Terminal nicht erreichbar"}),l.jsxs("p",{className:"max-w-sm text-[11px] leading-normal text-muted-foreground",children:["Der ",l.jsx("code",{className:"font-mono text-primary",children:"hermes-terminal"}),"-Dienst (ttyd) läuft nicht. Auf der Box: ",l.jsx("code",{className:"font-mono",children:"systemctl --user restart hermes-terminal"}),"."]})]}),l.jsx("iframe",{src:t,title:"Hermes Terminal",className:"h-full w-full border-0",style:{minHeight:"68vh"}})]}):l.jsxs("div",{className:"flex min-h-[68vh] flex-1 items-center justify-center rounded-2xl border border-border/60 bg-background/20 text-xs text-muted-foreground",children:[l.jsx(IN,{className:"mr-2 h-4 w-4"})," Lade Terminal…"]})]})}const tN=[{id:"grundlagen",label:"Grundlagen"},{id:"moe",label:"MoE & Quant"},{id:"lokal",label:"Lokal betreiben"},{id:"modelle",label:"Modell-Landschaft"},{id:"gateway",label:"Gateway-Trick"},{id:"mcp",label:"MCP"},{id:"skills",label:"Skills"},{id:"memory",label:"Gedächtnis & RAG"},{id:"agents",label:"Agenten"},{id:"ide",label:"IDE anbinden"},{id:"tricks",label:"Tricks & Kniffe"},{id:"wartung",label:"Sicherheit & Wartung"},{id:"ressourcen",label:"Ressourcen"},{id:"troubleshooting",label:"Troubleshooting"}];function BX(e){var t;(t=document.getElementById(e))==null||t.scrollIntoView({behavior:"smooth",block:"start"})}function Rr({id:e,icon:t,color:r,title:n,kicker:a,children:o,wide:c}){return l.jsxs("section",{id:e,className:ee("scroll-mt-20 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 shadow-lg shadow-black/10 space-y-3",c&&"md:col-span-2"),children:[l.jsxs("div",{className:"flex items-center gap-2.5 border-b border-border/20 pb-3",children:[l.jsx(t,{className:ee("h-5 w-5 shrink-0",r)}),l.jsxs("div",{children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:n}),a&&l.jsx("span",{className:ee("text-[9px] font-mono",r),children:a})]})]}),l.jsx("div",{className:"text-xs text-muted-foreground space-y-2.5 leading-relaxed",children:o})]})}function Va({children:e}){return l.jsxs("div",{className:"mt-1 rounded-xl border border-primary/25 bg-primary/[0.06] p-3 text-[11px] leading-relaxed",children:[l.jsxs("div",{className:"flex items-center gap-1.5 font-bold text-primary mb-1",children:[l.jsx(xs,{className:"h-3 w-3"})," Bei dir konkret"]}),l.jsx("div",{className:"text-muted-foreground space-y-1",children:e})]})}function ze({children:e}){return l.jsx("code",{className:"rounded bg-background/40 border border-border/30 px-1.5 py-0.5 font-mono text-[10px] text-foreground",children:e})}function kt({href:e,name:t,note:r}){return l.jsxs("li",{className:"leading-relaxed",children:[l.jsxs("a",{href:e,target:"_blank",rel:"noopener",className:"text-primary hover:underline font-semibold inline-flex items-center gap-0.5",children:[t,l.jsx(G3,{className:"h-3 w-3 opacity-60"})]}),l.jsxs("span",{className:"text-muted-foreground",children:[" — ",r]})]})}function UX(){const[e,t]=y.useState(!1);return l.jsxs("div",{className:"space-y-7",children:[l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 shadow-lg shadow-black/10 flex items-start gap-4",children:[l.jsx("div",{className:"h-11 w-11 rounded-xl bg-primary/15 flex items-center justify-center shrink-0",children:l.jsx(sv,{className:"h-6 w-6 text-primary"})}),l.jsxs("div",{className:"space-y-1",children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Die AI-Bibel"}),l.jsxs("p",{className:"text-sm text-muted-foreground leading-relaxed max-w-2xl",children:["Allgemeines Nachschlagewerk für lokale & agentische AI — Konzepte, Tricks, Kniffe und kuratierte Quellen. ",l.jsx("span",{className:"font-semibold text-foreground",children:"Stand Juni 2026."})," ","Das meiste gilt überall; ",l.jsx("span",{className:"text-primary font-semibold",children:'„Bei dir konkret"'}),"-Kästen zeigen, was dein Stack daraus macht."]})]})]}),l.jsx("div",{className:"sticky top-0 z-10 -mx-1 px-1",children:l.jsx("div",{className:"rounded-xl border border-border/50 bg-card/70 backdrop-blur-xl p-2 shadow-lg shadow-black/20",children:l.jsxs("div",{className:"flex items-center gap-1.5 flex-wrap",children:[l.jsx(lv,{className:"h-3.5 w-3.5 text-primary ml-1 mr-0.5 shrink-0"}),(e?tN:tN.slice(0,9)).map(r=>l.jsx("button",{onClick:()=>BX(r.id),className:"rounded-lg px-2.5 py-1 text-[11px] font-semibold text-muted-foreground hover:text-primary hover:bg-primary/10 transition-colors cursor-pointer",children:r.label},r.id)),l.jsx("button",{onClick:()=>t(r=>!r),className:"rounded-lg px-2 py-1 text-[11px] font-semibold text-primary hover:bg-primary/10 transition-colors cursor-pointer",children:e?"weniger":"+ mehr"})]})})}),l.jsxs("div",{className:"grid gap-5 md:grid-cols-2",children:[l.jsxs(Rr,{id:"grundlagen",icon:Hn,color:"text-cyan-400",title:"1. Wie LLMs ticken",kicker:"Grundlagen",children:[l.jsxs("p",{children:["Ein LLM ist im Kern ein ",l.jsx("strong",{children:"Wahrscheinlichkeits-Rechner für das nächste Token"}),' (Wortteil). Es „weiß" nichts — es setzt fort, was statistisch am plausibelsten ist. Daraus folgt fast alles andere.']}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Tokens"})," sind die Einheit — ~¾ Wort. Ein- und Ausgabe werden in Tokens gezählt."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Kontextfenster"}),' = wie viele Tokens das Modell gleichzeitig „sehen" kann (Prompt + Antwort). Voll = Anfang fällt raus.']}),l.jsxs("li",{children:[l.jsx("strong",{children:"Parameter"})," = die trainierten Gewichte. Training ist einmalig, ",l.jsx("strong",{children:"Inferenz"})," ist jede Antwort."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Temperatur / Sampling"})," steuert Zufall: niedrig = deterministisch/präzise (Code), hoch = kreativ."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Halluzination"})," ist kein Bug, sondern die Kehrseite des Ratens. Gegenmittel: Grounding via Tools/RAG, Verifikation."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Reasoning-/Thinking-Modelle"}),' „denken" in unsichtbaren Tokens vor der Antwort — besser bei Logik, langsamer/teurer.']})]})]}),l.jsxs(Rr,{id:"moe",icon:jy,color:"text-violet-400",title:"2. MoE & Quantisierung",kicker:"Mehr Modell, weniger Last",children:[l.jsxs("p",{children:[l.jsx("strong",{children:"Mixture of Experts (MoE):"})," Statt für jedes Token das ganze Netz zu aktivieren, wählt ein",l.jsx("em",{children:" Router"})," nur ein paar spezialisierte ",l.jsx("em",{children:"Experts"}),' aus. So läuft ein 100B-Modell mit der aktiven Rechenlast eines viel kleineren (z.B. „122B total / 10B aktiv").']}),l.jsxs("p",{children:[l.jsx("strong",{children:"Quantisierung:"})," Gewichte von FP16 auf weniger Bits eindampfen — kleiner & schneller bei minimalem Qualitätsverlust. Faustregel:"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx(ze,{children:"Q8"})," nahezu verlustfrei, größter Footprint"]}),l.jsxs("li",{children:[l.jsx(ze,{children:"Q6_K"})," sehr gut, guter Mittelweg"]}),l.jsxs("li",{children:[l.jsx(ze,{children:"Q4_K_M"})," der Sweet-Spot für lokal — viel Modell pro GB"]})]}),l.jsxs(Va,{children:["VRAM/RAM ist die harte Grenze — ",l.jsx("strong",{children:"darum"})," ist beides hier zentral: MoE lässt 100B+ überhaupt laufen, Quant entscheidet, was reinpasst. Dein Line-up fährt durchweg ",l.jsx(ze,{children:"Q4_K_M"}),"/",l.jsx(ze,{children:"Q6_K"}),"."]})]}),l.jsxs(Rr,{id:"lokal",icon:ff,color:"text-emerald-400",title:"3. Lokal betreiben: Engines & Backends",kicker:"llama.cpp, vLLM & Co.",wide:!0,children:[l.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:[l.jsx("strong",{children:"Inference-Engines"})," — was die Modelle ausführt:"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"llama.cpp / GGUF"})," — der De-facto-Standard für lokal, CPU+GPU, läuft überall."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Ollama / LM Studio"})," — bequeme Wrapper mit One-Click-Downloads (LM Studio mit GUI)."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"vLLM / TGI"})," — Server-Engines für maximalen Durchsatz auf dicken GPUs."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"llama-swap"})," — Proxy, der ",l.jsx("em",{children:"mehrere"})," Modelle hinter ",l.jsx("em",{children:"einem"})," Port hält und je nach Anfrage automatisch ein-/aussattelt."]})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:[l.jsx("strong",{children:"GPU-Backends"})," — wie gerechnet wird:"]}),l.jsx("ul",{className:"list-disc pl-4 space-y-1",children:l.jsxs("li",{children:[l.jsx(ze,{children:"CUDA"})," NVIDIA · ",l.jsx(ze,{children:"ROCm"})," AMD · ",l.jsx(ze,{children:"Vulkan"})," herstellerübergreifend · ",l.jsx(ze,{children:"Metal"})," Apple"]})}),l.jsxs("p",{className:"pt-1",children:[l.jsx("strong",{children:"Begriffe, die immer wiederkommen:"})," Kontext (",l.jsx(ze,{children:"-c"}),"), Slots/Parallel, KV-Cache, Modell-TTL/Swap, ",l.jsx("strong",{children:"Speculative Decoding"})," (kleines Draft-Modell rät voraus → schneller)."]})]})]}),l.jsxs(Va,{children:["Deine Box hat eine AMD-APU (gfx1151). ",l.jsx("strong",{children:"Einschränkung & Trick:"})," dort schlägt ",l.jsx(ze,{children:"Vulkan/RADV"})," das offizielle ",l.jsx(ze,{children:"ROCm"})," bei Token-Generierung um ~12–22 % — darum läuft die Engine auf Vulkan.",l.jsx(ze,{children:"llama-swap"})," hält die Alltags-Hirne dauerwarm; ",l.jsx(ze,{children:"coder"})," nutzt Spec-Decoding."]})]}),l.jsxs(Rr,{id:"modelle",icon:lf,color:"text-sky-400",title:"4. Modell-Landschaft",kicker:"Stand Juni 2026",wide:!0,children:[l.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsx("p",{children:l.jsx("strong",{children:"Open-Weight (lokal nutzbar):"})}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Qwen"})," (Alibaba) — starke Allrounder + Coder + Vision, viele Größen/MoE."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Llama"})," (Meta), ",l.jsx("strong",{children:"Gemma"})," (Google), ",l.jsx("strong",{children:"Phi"})," (Microsoft) — solide Open-Familien."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"DeepSeek"}),", ",l.jsx("strong",{children:"Mistral/Mixtral"})," — kräftige MoE-/Reasoning-Modelle."]})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsx("p",{children:l.jsx("strong",{children:"Frontier (Cloud-API):"})}),l.jsx("ul",{className:"list-disc pl-4 space-y-1",children:l.jsxs("li",{children:[l.jsx("strong",{children:"Claude"})," (Anthropic), ",l.jsx("strong",{children:"GPT"})," (OpenAI), ",l.jsx("strong",{children:"Gemini"})," (Google) — die stärksten Allrounder, aber nicht lokal."]})}),l.jsxs("p",{className:"pt-1",children:[l.jsx("strong",{children:"Modellwahl nach Aufgabe:"})," schnelles Alltags-Hirn · großes Logik-Hirn für harte Tasks · dediziertes Code-Modell · multimodal für Bilder · Embedding-Modell fürs Gedächtnis."]})]})]}),l.jsx("p",{className:"text-[11px] italic",children:'Leaderboards (HF, LMArena) sind grobe Orientierung — der einzige Benchmark, der zählt, ist deine eigene Aufgabe. Vorsicht vor „Benchmaxxing".'}),l.jsxs(Va,{children:["Dein Line-up via llama-swap: ",l.jsx(ze,{children:"fast"})," (Alltag/Vision/MoE) · ",l.jsx(ze,{children:"heavy"})," (schwere Logik) ·",l.jsx(ze,{children:"coder"})," · ",l.jsx(ze,{children:"scout"})," · ",l.jsx(ze,{children:"vision"})," · ",l.jsx(ze,{children:"embed"})," (fürs Gedächtnis) ·",l.jsx(ze,{children:"hermes"})," (Agent-Hirn). Verwalten/tauschen im ",l.jsx("strong",{children:"Modell-Manager"}),"-Tab."]})]}),l.jsxs(Rr,{id:"gateway",icon:E4,color:"text-amber-400",title:"5. Der Gateway-Trick",kicker:"OpenAI-kompatibel = überall andocken",children:[l.jsxs("p",{children:["Fast jedes AI-Tool spricht heute das ",l.jsx("strong",{children:"OpenAI-Format"})," (",l.jsx(ze,{children:"/v1/chat/completions"}),"). Ein",l.jsx("strong",{children:" Gateway"})," davor gibt dir ",l.jsx("em",{children:"einen"})," Endpunkt für alles: zentrales Key-Management, Logging und transparentes ",l.jsx("strong",{children:"Routing"})," — der Client merkt nicht, welches Modell tatsächlich antwortet."]}),l.jsxs("p",{children:["Die ",l.jsx(ze,{children:"model:auto"}),'-Idee: du sagst „auto", das Gateway wählt das passende Modell je nach Anfrage und lädt es bei Bedarf.']}),l.jsxs(Va,{children:["Dein Gateway: ",l.jsx(ze,{children:"http://192.168.178.151:9001/v1"}),", Model ",l.jsx(ze,{children:"auto"}),", API-Key beliebig. Fertige Configs erzeugt dir der ",l.jsx("strong",{children:"Verbinden"}),"-Tab live — eine Wahrheit, kein Abtippen."]})]}),l.jsxs(Rr,{id:"mcp",icon:cf,color:"text-violet-400",title:"6. MCP — Werkzeuge für Agenten",kicker:"USB-C für AI-Tools",children:[l.jsxs("p",{children:["Das ",l.jsx("strong",{children:"Model Context Protocol"})," (offen, von Anthropic initiiert) standardisiert, wie ein AI-Client mit externen Tools & Datenquellen spricht. Ein ",l.jsx("strong",{children:"MCP-Server"})," bringt Fähigkeiten: Dateien, Web-Fetch, Git, Datenbanken, eigene APIs."]}),l.jsx("p",{children:"Statt für jeden Editor eigene Tools zu schreiben, bindet jeder MCP-fähige Agent denselben Server an."}),l.jsxs("div",{className:"flex items-start gap-1.5 rounded-xl border border-amber-500/25 bg-amber-500/[0.06] p-2.5 text-[11px]",children:[l.jsx(w4,{className:"h-3.5 w-3.5 text-amber-400 shrink-0 mt-0.5"}),l.jsxs("span",{children:[l.jsx("strong",{children:"Sicherheit:"})," ein MCP-Server hat echten Zugriff (Dateien, Shell). Nur vertrauenswürdige Server laufen lassen, Rechte minimal halten, Quelle prüfen."]})]})]}),l.jsxs(Rr,{id:"skills",icon:O4,color:"text-emerald-400",title:"7. Agent Skills",kicker:"Wiederverwendbare Fähigkeiten",children:[l.jsxs("p",{children:["Ein ",l.jsx("strong",{children:"Skill"})," ist ein Ordner mit einer ",l.jsx(ze,{children:"SKILL.md"})," (YAML-Kopf + Anleitung, optional Skripte/Beispiele), den der Agent für eine bestimmte Aufgabe lädt — z.B. TDD, Code-Vereinfachung, API-Design."]}),l.jsx("pre",{className:"p-2.5 bg-background/25 rounded-lg border border-border/30 font-mono text-[9px] text-foreground overflow-x-auto whitespace-pre",children:`--- -name: tdd-pro -description: Treibt Entwicklung mit strikter TDD-Praxis ---- -# Instructions -...`}),l.jsxs("p",{children:["Suchen & installieren über die ",l.jsx("strong",{children:"skills.sh"}),"-Registry: ",l.jsx(ze,{children:"npx skills find"})," /",l.jsx(ze,{children:"npx skills add owner/repo"}),". Skills liegen projektweit (vom Agent beim Start gelesen) oder global."]})]}),l.jsxs(Rr,{id:"memory",icon:s4,color:"text-indigo-400",title:"8. Gedächtnis & RAG",kicker:"Modelle vergessen — du nicht",wide:!0,children:[l.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:["LLMs sind ",l.jsx("strong",{children:"zustandslos"}),": ohne Hilfe weiß das Modell beim nächsten Turn nichts mehr. Gedächtnis lebt extern."]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Embeddings"})," wandeln Text in Vektoren; ein ",l.jsx("strong",{children:"Vektor-Store"})," (Chroma, …) findet semantisch Ähnliches."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"RAG"})," = relevante Fakten vor dem Turn heraussuchen und einblenden statt alles im Prompt zu halten."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Long-Context vs. RAG:"}),' riesige Fenster sind bequem, aber teuer & „lost in the middle" — gezieltes Abrufen skaliert besser.']})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:[l.jsx("strong",{children:"Auto-lernendes Gedächtnis"})," ist die nächste Stufe:"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:["extrahiert Fakten ",l.jsx("em",{children:"selbst"})," aus Gesprächen, statt nur abzuspeichern"]}),l.jsx("li",{children:"dedupliziert semantisch (kein 10× derselbe Fakt)"}),l.jsxs("li",{children:[l.jsx("strong",{children:"Graph-Sicht"})," = Fakten ",l.jsx("em",{children:"plus"})," ihre Beziehungen, nicht nur eine flache Liste"]})]})]})]}),l.jsxs(Va,{children:["Dein Gedächtnis (Tab ",l.jsx("strong",{children:"Gedächtnis"}),") ist ",l.jsx("strong",{children:"Mem0"}),"-basiert: auto-lernend & semantisch, ",l.jsx("strong",{children:"graph-first"})," dargestellt, mit 4-Typen-Taxonomie (",l.jsx(ze,{children:"Identität"})," · ",l.jsx(ze,{children:"Wissen"})," · ",l.jsx(ze,{children:"Regeln"})," · ",l.jsx(ze,{children:"Ereignisse"}),"). Einstieg über ein kurzes ",l.jsx("strong",{children:"Hermes-Onboarding-Gespräch"})," im Terminal — der Agent lernt im Hintergrund nach jedem Turn.",l.jsx("br",{}),l.jsx("strong",{children:"Gotcha:"})," ein gelöschter Fakt kann wieder auftauchen, solange die Original-Nachricht noch im Verlauf steht (additive Extraktion)."]})]}),l.jsxs(Rr,{id:"agents",icon:wn,color:"text-rose-400",title:"9. Autonome Agenten betreiben",kicker:"LLM in der Schleife",wide:!0,children:[l.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:["Ein ",l.jsx("strong",{children:"Agent"})," ist ein LLM in einer Schleife mit Tools:",l.jsx("em",{children:" denken → Tool aufrufen → Ergebnis beobachten → weiter"}),", bis das Ziel erreicht ist."]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Guardrails"})," (Hard-Stop, Tool-Limits) verhindern Endlos-Loops, wenn ein Tool fehlt oder hängt."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Kontext-Hygiene"})," ist die wichtigste Disziplin: frische Sessions starten — vollgemüllte Historien werden langsam, driften und halluzinieren."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Kanäle:"})," CLI/Terminal, Chat-UI, Messaging (z.B. Telegram), reine API."]})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:[l.jsx("strong",{children:"Least Privilege:"})," gib einem Agenten nur die Tools, die er wirklich braucht. Kritische Aktionen (Shell auf dem Host, Löschen, Geld/Deploys) hinter menschliche Freigabe."]}),l.jsxs("p",{children:[l.jsx("strong",{children:"Was sich vollautomatisch lohnt:"})," Modell-Routing, Hintergrund-Gedächtnis, Recherche. ",l.jsx("strong",{children:"Was Freigabe braucht:"})," Systembefehle, Updates/Reboots, permanentes Löschen."]})]})]}),l.jsxs(Va,{children:[l.jsx("strong",{children:"Hermes"})," ist dein Box-Agent (Hirn = ",l.jsx(ze,{children:"fast"}),"). Reden tust du mit ihm im",l.jsx("strong",{children:" Terminal"}),"-Tab (Web-Terminal via ttyd) oder per ",l.jsx("strong",{children:"Telegram"}),". Er hat MCP-Server für Gedächtnis, Stack-Steuerung, Web-Fetch und ",l.jsx("strong",{children:"PC-Steuerung"})," (Executor auf deinem Windows-PC). Status & Verdrahtung im ",l.jsx("strong",{children:"Hermes"}),"-Tab."]})]}),l.jsxs(Rr,{id:"ide",icon:Bs,color:"text-cyan-400",title:"10. IDE / Editor anbinden",kicker:"Vibe-Coding lokal",children:[l.jsxs("p",{children:["Jede ",l.jsx("strong",{children:"OpenAI-kompatible"})," IDE oder Extension lässt sich auf einen lokalen Server umbiegen — Base-URL + Model eintragen, fertig:"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Cline"})," & ",l.jsx("strong",{children:"Roo Code"})," (VS-Code-Extensions, voller Agent + MCP)"]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Cursor"})," (VS-Code-Fork mit Top-Autocomplete)"]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Continue"}),", ",l.jsx("strong",{children:"aider"})," (CLI), ",l.jsx("strong",{children:"OpenCode"})," (Desktop)"]})]}),l.jsxs(Va,{children:["Tipp den Kram nicht ab: der ",l.jsx("strong",{children:"Verbinden"}),"-Tab generiert die fertige Config (inkl. MCP-Gedächtnis) pro Tool zum Kopieren. Essenz: Base ",l.jsx(ze,{children:"…:9001/v1"}),", Model ",l.jsx(ze,{children:"auto"}),", Key beliebig."]})]}),l.jsx(Rr,{id:"tricks",icon:x4,color:"text-amber-400",title:"11. Tricks & Kniffe",kicker:"Was im Alltag wirklich spart",wide:!0,children:l.jsx("div",{className:"grid md:grid-cols-3 gap-3",children:[["Kontext sauber halten","Neue Session statt Mega-Historie. Drift, Tempo und Halluzination hängen direkt am Kontext-Müll."],["Plan-then-Act","Erst Plan/Vorgehen bestätigen lassen, dann ausführen. Spart teure Holzwege."],["Gezielte Edits","Nie ganze Dateien überschreiben für eine Zeile — Such-/Ersetz-Tools nutzen. Weniger Tokens, weniger Fehler."],["Non-interaktive Befehle","Keine interaktiven Prompts im Agent-Terminal; lange Tasks als Background-Job. Sonst hängt der Loop."],["DevTools koppeln","Browser-/Konsolen-Zugriff geben — der Agent liest echte Fehler statt blind zu raten."],["Richtige Modellwahl","Schnelles Hirn für Alltag, großes für harte Logik, Coder fürs Coden. Nicht alles mit der Kanone."],["Akzeptanzkriterien","Sag konkret, woran „fertig“ erkennbar ist. Vage Prompts → vage Ergebnisse."],["Verifizieren statt vertrauen","Tests/Live-Check fordern. „Sollte funktionieren“ ist kein Beweis."],["Regeln ins Gedächtnis","Wiederkehrende Vorlieben/Konventionen einmal ablegen — der Agent zieht sie selbst."]].map(([r,n])=>l.jsxs("div",{className:"space-y-1 p-3 bg-background/10 rounded-xl border border-border/30",children:[l.jsxs("div",{className:"flex items-center gap-1.5 font-bold text-foreground text-[11px]",children:[l.jsx(xa,{className:"h-3 w-3 text-amber-400"})," ",r]}),l.jsx("p",{className:"text-[11px]",children:n})]},r))})}),l.jsx(Rr,{id:"wartung",icon:ks,color:"text-emerald-400",title:"12. Sicherheit & Wartung",kicker:"Damit's auch morgen noch läuft",wide:!0,children:l.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{className:"flex items-center gap-1.5 font-bold text-foreground",children:[l.jsx(_N,{className:"h-3.5 w-3.5 text-emerald-400"})," Goldene Regeln"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Ein ungetesteter Restore ist kein Backup."})," Wiederherstellung mindestens einmal echt durchspielen."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Updates können Dinge still zerschießen"})," — gerade bei AI-Stacks (Embeddings, Provider-Interna). Versionen pinnen, Smoke-Test, Post-Check."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Least Privilege"})," für Agenten, MCP-Server und PC-Zugriff. Kritisches hinter Freigabe."]})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{className:"flex items-center gap-1.5 font-bold text-foreground",children:[l.jsx(Qu,{className:"h-3.5 w-3.5 text-emerald-400"})," Bei dir im SystemDrawer"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Backup:"})," tägliches Voll-Zustands-Backup, getesteter ",l.jsx(ze,{children:"restore.sh"})," (Doku in ",l.jsx(ze,{children:"docs/BACKUP.md"}),")."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Updates:"})," git-basierter Update-Check; ",l.jsx("strong",{children:"Hermes-Update-Button"})," mit anschließendem ",l.jsx("strong",{children:"Gehirn-Check"})," (rot, falls das Update das Gedächtnis zerschießt) + Engine-Update."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Dienste & Gefahrenzone:"})," Restart/Logs pro Dienst, kritische Eingriffe getrennt."]})]}),l.jsx("p",{className:"text-[10px] italic",children:'Erreichbar über das System-Icon → Tab „Wartung".'})]})]})}),l.jsxs("section",{id:"ressourcen",className:"scroll-mt-20 md:col-span-2 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 shadow-lg shadow-black/10 space-y-4",children:[l.jsxs("div",{className:"flex items-center gap-2.5 border-b border-border/20 pb-3",children:[l.jsx(lv,{className:"h-5 w-5 text-primary"}),l.jsxs("div",{children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"13. Kuratierte Ressourcen & Links"}),l.jsx("span",{className:"text-[9px] font-mono text-primary",children:"Sauber geordnet — die guten Quellen"})]})]}),l.jsxs("div",{className:"grid md:grid-cols-2 gap-5 text-xs",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"font-bold text-foreground flex items-center gap-1.5",children:[l.jsx(lf,{className:"h-3.5 w-3.5 text-sky-400"})," Modelle & Engines"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1.5",children:[l.jsx(kt,{href:"https://huggingface.co/models",name:"Hugging Face",note:"das Repository für offene Modelle (GGUF, Embeddings, Datasets)."}),l.jsx(kt,{href:"https://github.com/ggml-org/llama.cpp",name:"llama.cpp",note:"die Referenz-Engine für lokale Inferenz."}),l.jsx(kt,{href:"https://github.com/mostlygeek/llama-swap",name:"llama-swap",note:"mehrere Modelle hinter einem Port, Auto-Swap."}),l.jsx(kt,{href:"https://ollama.com",name:"Ollama",note:"einfachster Einstieg, One-Command-Modelle."}),l.jsx(kt,{href:"https://lmstudio.ai",name:"LM Studio",note:"lokale GUI zum Stöbern, Laden & Chatten."}),l.jsx(kt,{href:"https://github.com/vllm-project/vllm",name:"vLLM",note:"Hochdurchsatz-Serving auf dicken GPUs."})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"font-bold text-foreground flex items-center gap-1.5",children:[l.jsx(cf,{className:"h-3.5 w-3.5 text-violet-400"})," MCP & Skills"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1.5",children:[l.jsx(kt,{href:"https://modelcontextprotocol.io",name:"MCP — offizielle Doku",note:"Spezifikation & Einstieg."}),l.jsx(kt,{href:"https://github.com/modelcontextprotocol/servers",name:"Offizielle MCP-Server",note:"filesystem, git, postgres, fetch & mehr."}),l.jsx(kt,{href:"https://smithery.ai",name:"Smithery",note:"Registry zum Suchen & Auto-Installieren von MCP-Servern."}),l.jsx(kt,{href:"https://glama.ai/mcp/servers",name:"Glama MCP Registry",note:"kuratierte Community-Datenbank."}),l.jsx(kt,{href:"https://skills.sh",name:"skills.sh",note:"Registry & CLI für Agent-Skills."})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"font-bold text-foreground flex items-center gap-1.5",children:[l.jsx(wn,{className:"h-3.5 w-3.5 text-rose-400"})," Agenten & Frameworks"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1.5",children:[l.jsx(kt,{href:"https://github.com/NousResearch/hermes-agent",name:"Hermes Agent (Nous)",note:"der Agent, der auf deiner Box läuft."}),l.jsx(kt,{href:"https://docs.claude.com",name:"Anthropic / Claude Docs",note:"API, Tool-Use, Agent SDK, MCP."}),l.jsx(kt,{href:"https://github.com/cline/cline",name:"Cline",note:"autonomer Coding-Agent für VS Code."}),l.jsx(kt,{href:"https://aider.chat",name:"aider",note:"AI-Pair-Programming im Terminal, git-nativ."}),l.jsx(kt,{href:"https://continue.dev",name:"Continue",note:"Open-Source-Autopilot für IDEs."})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"font-bold text-foreground flex items-center gap-1.5",children:[l.jsx(sv,{className:"h-3.5 w-3.5 text-amber-400"})," Lernen & Community"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1.5",children:[l.jsx(kt,{href:"https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/overview",name:"Prompt-Engineering (Anthropic)",note:"die beste praktische Anleitung."}),l.jsx(kt,{href:"https://github.com/anthropics/anthropic-cookbook",name:"Anthropic Cookbook",note:"lauffähige Rezepte für Tools, RAG, Agenten."}),l.jsx(kt,{href:"https://www.promptingguide.ai",name:"Prompt Engineering Guide",note:"herstellerneutrales Nachschlagewerk."}),l.jsx(kt,{href:"https://github.com/mem0ai/mem0",name:"Mem0",note:"die auto-lernende Memory-Schicht hinter deinem Gedächtnis."}),l.jsx(kt,{href:"https://www.reddit.com/r/LocalLLaMA/",name:"r/LocalLLaMA",note:"der Puls der lokalen-LLM-Szene."})]})]})]})]}),l.jsx(Rr,{id:"troubleshooting",icon:y4,color:"text-rose-400",title:"14. Troubleshooting",kicker:"Wenn's hakt",wide:!0,children:l.jsxs("ul",{className:"space-y-2 list-disc pl-4",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Keine Verbindung?"})," Selbes LAN wie die Box? IP/Port stimmen (",l.jsx(ze,{children:":9001"}),")? Backend-Status in der ",l.jsx("strong",{children:"Zentrale"})," prüfen."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Modell antwortet nicht / langsam?"})," In der ",l.jsx("strong",{children:"Zentrale → Dienste"})," schauen, ob ",l.jsx(ze,{children:"llama-swap"})," grün ist; sonst Restart. Erstes Token nach Swap dauert (Modell lädt)."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Agent dreht durch / halluziniert?"})," Frische Session im ",l.jsx("strong",{children:"Terminal"})," starten — meist ist es vollgemüllter Kontext."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Gedächtnis findet nichts?"})," Embedding-Dienst online? Semantisch suchen (Sinn statt exaktem Wort). Leeres Gedächtnis → Hermes-Onboarding starten."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Update hat etwas zerschossen?"})," Genau dafür gibt es Backup & ",l.jsx(ze,{children:"restore.sh"})," — den getesteten Restore fahren, dann Ursache suchen."]})]})})]}),l.jsx("p",{className:"text-center text-[10px] text-muted-foreground/50 pt-2",children:"Mission Control 2 · AI-Bibel · Stand Juni 2026 — lebendes Dokument, wächst mit dem Stack."})]})}function HX({title:e,hint:t}){return l.jsxs("div",{className:"space-y-4",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-xl font-semibold",children:e}),l.jsx("p",{className:"text-sm text-muted-foreground",children:t})]}),l.jsxs("div",{className:"flex flex-col items-center justify-center gap-3 rounded-xl border border-dashed border-border bg-card/50 py-20 text-center",children:[l.jsx(o4,{className:"h-8 w-8 text-muted-foreground"}),l.jsx("div",{className:"text-sm text-muted-foreground",children:"Kommt in einer späteren Phase."})]})]})}const rN=[{id:"mission-control-2",label:"Mission Control",type:"user",reach:"gateway (integr"},{id:"hermes-gateway",label:"Hermes Gateway",type:"user",reach:"hermes-gateway"},{id:"mem0-service",label:"Mem0 (Gedächtnis)",type:"user",reach:"mem0"},{id:"hermes-terminal",label:"Hermes Terminal",type:"user",reach:"hermes-terminal"},{id:"llama-swap",label:"Llama Swap",type:"system",reach:"llama-swap"}];function fu({icon:e,iconClass:t,name:r,status:n,available:a,busy:o,actionLabel:c,onAction:u}){return l.jsxs("div",{className:ee("flex items-center gap-3 rounded-lg border px-3 py-2",a?"border-amber-500/30 bg-amber-500/5":"border-border/50 bg-background/20"),children:[l.jsx(e,{className:ee("h-4 w-4 shrink-0",t)}),l.jsxs("div",{className:"flex-1 min-w-0",children:[l.jsx("div",{className:"text-xs text-foreground truncate",children:r}),l.jsx("div",{className:ee("text-[10px] truncate",a?"text-amber-400/90":"text-muted-foreground"),children:n})]}),l.jsx("button",{onClick:u,disabled:!a||o,className:ee("text-[11px] font-semibold rounded-lg px-2.5 py-1 transition-colors shrink-0",a?"bg-primary text-primary-foreground hover:opacity-90 cursor-pointer":"border border-border/50 text-muted-foreground/40 cursor-default"),children:o?"…":c})]})}function WX({label:e,ok:t,system:r,busy:n,onRestart:a,onLogs:o}){return l.jsxs("div",{className:"flex items-center gap-2.5 rounded-lg border border-border/50 bg-background/20 px-3 py-2",children:[l.jsx("span",{className:ee("w-1.5 h-1.5 rounded-full shrink-0",t===!0?"bg-emerald-500":t===!1?"bg-red-500":"bg-muted-foreground/40")}),l.jsxs("span",{className:"flex-1 text-xs text-foreground truncate",children:[e,r&&l.jsx("span",{className:"text-[9px] text-muted-foreground",children:" (root)"})]}),l.jsx("button",{onClick:a,disabled:n,title:"Neu starten",className:"text-muted-foreground hover:text-primary transition-colors disabled:opacity-50",children:l.jsx(Xa,{className:ee("h-3.5 w-3.5",n&&"animate-spin")})}),l.jsx("button",{onClick:o,title:"Logs ansehen",className:"text-muted-foreground hover:text-primary transition-colors",children:l.jsx(l4,{className:"h-3.5 w-3.5"})})]})}function Kg(e){return e==null?"":e>1024**3?`${(e/1024**3).toFixed(2)} GB`:`${(e/1024**2).toFixed(1)} MB`}function ZO({open:e,onClose:t,defaultTab:r="maintenance"}){var Ti;const[n,a]=y.useState(null),[o,c]=y.useState([]),[u,f]=y.useState("llama-swap"),[h,m]=y.useState(""),[g,v]=y.useState(!1),[b,j]=y.useState(null),[k,S]=y.useState({}),[N,E]=y.useState("maintenance"),[A,P]=y.useState(!1),[_,O]=y.useState(""),[D,U]=y.useState(!1),[B,F]=y.useState(null),[Y,H]=y.useState([]),[pe,ue]=y.useState(!1),[he,ae]=y.useState(null),[se,X]=y.useState(null);function te($,Le,cr){X({type:"alert",title:$,message:Le,onConfirm:()=>{X(null),cr&&cr()}})}function J($,Le,cr){X({type:"confirm",title:$,message:Le,onConfirm:()=>{X(null),cr()},onCancel:()=>X(null)})}function I($){return $?new Date($*1e3).toLocaleString("de-DE",{day:"2-digit",month:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}):"Nie"}const[M,K]=y.useState(""),[ne,Z]=y.useState(""),[me,ge]=y.useState(!1),[Pe,re]=y.useState(!1);y.useEffect(()=>{e&&(K(localStorage.getItem("mc_sudo_password")||""),Z(localStorage.getItem("mc_hf_token")||""))},[e]),y.useEffect(()=>{e&&r&&E(r)},[e,r]);const xe=y.useRef(null);function _e(){Se("/api/maintenance/updates").then(a).catch($=>console.error("Error loading updates",$))}function ie(){Se("/api/jobs").then($=>c($.jobs||[])).catch($=>console.error("Error loading jobs",$))}function Je(){Se("/api/system/services").then(F).catch(()=>{})}function Fe(){Se("/api/system/backups").then($=>H($.backups||[])).catch(()=>{})}function Oe($){v(!0),j(null),Se(`/api/maintenance/logs?service=${$}&lines=150`).then(Le=>{Le.ok?m(Le.text):(m(`Fehler beim Laden der Logs: ${Le.err||"Unbekannter Fehler"}`),(Le.status==="incorrect_password"||Le.status==="password_required")&&j(Le.status))}).catch(Le=>m(`Fehler: ${Le.message}`)).finally(()=>{v(!1),setTimeout(()=>{xe.current&&(xe.current.scrollTop=xe.current.scrollHeight)},50)})}y.useEffect(()=>{if(!e)return;_e(),ie(),Je(),Fe();const $=setInterval(()=>{ie(),_e(),Je()},3e3);return()=>clearInterval($)},[e]),y.useEffect(()=>{!e||N!=="logs"||Oe(u)},[e,N,u]);function ut($){return($==null?void 0:$.status)==="busy"?(te("Update läuft bereits",`Es läuft gerade „${$.running}". Bitte warte, bis es fertig ist.`),ie(),!0):!1}async function Jt(){try{const $=await Se("/api/maintenance/os-update",{method:"POST"});if(ut($))return;ie(),E("maintenance")}catch($){te("Fehler",`Fehler beim Starten des OS-Updates: ${$.message}`)}}async function W(){try{const $=await Se("/api/maintenance/engine-update",{method:"POST"});if(ut($))return;ie(),E("maintenance")}catch($){te("Fehler",`Fehler beim Engine-Update: ${$.message}`)}}async function ke(){try{const $=await Se("/api/maintenance/swap-update",{method:"POST"});if(ut($))return;ie(),E("maintenance")}catch($){te("Fehler",`Fehler beim Router-Update: ${$.message}`)}}async function Ae(){ue(!0);try{const $=await Se("/api/maintenance/hermes-update",{method:"POST"});if(ut($))return;ie()}catch($){te("Fehler",`Hermes-Update fehlgeschlagen: ${$.message}`)}finally{ue(!1)}}async function Be($){ae({kind:$,loading:!0,data:null});try{const Le=await Se(`/api/maintenance/update-details?kind=${$}`);ae({kind:$,loading:!1,data:Le})}catch(Le){ae({kind:$,loading:!1,data:{kind:$,error:Le.message}})}}function et(){const $=he==null?void 0:he.kind;ae(null),$==="os"?Jt():$==="engine"?W():$==="swap"?ke():$==="hermes"&&Ae()}async function Ut(){P(!0);try{await Se("/api/maintenance/check-updates",{method:"POST"}),ie(),E("maintenance")}catch($){te("Fehler",`Fehler bei der Update-Suche: ${$.message}`)}finally{P(!1)}}async function ht($,Le){try{await Se("/api/models/install",{method:"POST",body:JSON.stringify({repo:$,role:Le})}),te("Gestartet",`Modell-Upgrade für '${Le}' (${$}) gestartet.`),ie(),E("maintenance")}catch(cr){te("Fehler",`Fehler beim Starten des Modell-Upgrades: ${cr.message}`)}}async function ur(){J("Reboot bestätigen","Bist du sicher, dass du das gesamte Host-System neu starten willst?",async()=>{try{await Se("/api/maintenance/reboot",{method:"POST"}),te("Reboot","Reboot ausgelöst. System startet neu...",()=>{t()})}catch($){te("Fehler",`Fehler beim Reboot: ${$.message}`)}})}async function Ca(){U(!0),O("Snapshot wird erzeugt...");try{const $=await Se("/api/system/backup",{method:"POST"});O($.ok?`Snapshot erzeugt: ${$.snapshot} (${$.files.length} Komponenten)`:"Backup fehlgeschlagen."),Fe()}catch($){O(`Fehler: ${$.message}`)}finally{U(!1)}}async function Jn($){S(Le=>({...Le,[$]:!0}));try{const Le=await Se("/api/maintenance/restart",{method:"POST",body:JSON.stringify({service:$})});Le.ok?te("Dienst neu gestartet",`Dienst ${$} wurde erfolgreich neu gestartet.`,()=>{N==="logs"&&u===$&&Oe($)}):te("Fehler",`Fehler beim Neustart: ${Le.err||"Unbekannter Fehler"}`)}catch(Le){te("Fehler",`Fehler beim Neustart: ${Le.message}`)}finally{S(Le=>({...Le,[$]:!1}))}}async function Ii($){try{await Se(`/api/jobs/${$}/cancel`,{method:"POST"}),ie()}catch(Le){te("Fehler",`Fehler beim Abbrechen: ${Le.message}`)}}const Or=o.find($=>($.state==="running"||$.state==="queued")&&$.group==="maintenance");return l.jsxs(l.Fragment,{children:[l.jsx("div",{className:ee("fixed inset-0 bg-black/60 backdrop-blur-sm z-50 transition-opacity duration-300",e?"opacity-100 pointer-events-auto":"opacity-0 pointer-events-none"),onClick:t}),l.jsxs("div",{className:ee("fixed inset-y-0 right-0 w-full sm:w-[640px] bg-card/85 backdrop-blur-xl border-l border-border/60 shadow-2xl z-50 flex flex-col transform transition-transform duration-300 ease-in-out font-sans text-foreground",e?"translate-x-0":"translate-x-full"),children:[l.jsxs("div",{className:"flex h-16 shrink-0 items-center justify-between border-b border-border/40 px-6",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(Hn,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold tracking-wide uppercase font-space",children:"OS-Zentrale & Pflege"})]}),l.jsx("button",{onClick:t,className:"flex h-8 w-8 items-center justify-center rounded-lg border border-border/40 text-muted-foreground hover:bg-accent transition-colors",children:l.jsx(Wn,{className:"h-4 w-4"})})]}),l.jsxs("div",{className:"flex border-b border-border/40 px-6",children:[l.jsx("button",{onClick:()=>E("maintenance"),className:ee("flex-1 py-3 text-xs font-semibold uppercase tracking-wider border-b-2 text-center transition-all",N==="maintenance"?"border-primary text-primary":"border-transparent text-muted-foreground hover:text-foreground"),children:"System-Wartung"}),l.jsx("button",{onClick:()=>E("logs"),className:ee("flex-1 py-3 text-xs font-semibold uppercase tracking-wider border-b-2 text-center transition-all",N==="logs"?"border-primary text-primary":"border-transparent text-muted-foreground hover:text-foreground"),children:"System-Logs"}),l.jsx("button",{onClick:()=>E("settings"),className:ee("flex-1 py-3 text-xs font-semibold uppercase tracking-wider border-b-2 text-center transition-all",N==="settings"?"border-primary text-primary":"border-transparent text-muted-foreground hover:text-foreground"),children:"Einstellungen"})]}),l.jsxs("div",{className:"flex-1 overflow-y-auto p-6 space-y-6",children:[N==="maintenance"&&l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"space-y-2.5",children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Updates"}),l.jsxs("button",{onClick:Ut,disabled:A||!!Or,className:"flex items-center gap-1 text-[10px] font-semibold text-primary hover:text-primary/80 transition-colors disabled:opacity-50",children:[l.jsx(Xa,{className:ee("h-3 w-3",A&&"animate-spin")})," Nach Updates suchen"]})]}),(n==null?void 0:n.last_check)&&l.jsxs("div",{className:"text-[9px] text-muted-foreground -mt-1",children:["Zuletzt gesucht: ",I(n.last_check)]}),Or&&l.jsxs("div",{className:"flex items-center gap-2 rounded-lg border border-amber-500/30 bg-amber-500/10 px-3 py-2 text-[11px] text-amber-300",children:[l.jsx(Xa,{className:"h-3.5 w-3.5 shrink-0 animate-spin"}),l.jsxs("span",{children:["Update läuft: ",l.jsx("span",{className:"font-semibold",children:Or.label})," — bitte warten. Weitere Updates sind solange gesperrt."]})]}),l.jsxs("div",{className:"space-y-1.5",children:[l.jsx(fu,{icon:ks,iconClass:"text-cyan-400",name:"OS-Pakete (apt)",available:!!(n!=null&&n.os),status:n!=null&&n.os?`${n.os} verfügbar`:"aktuell",actionLabel:"Anzeigen",onAction:()=>Be("os")}),l.jsx(fu,{icon:ff,iconClass:"text-violet-400",name:"Inferenz-Engine (llama.cpp)",available:!!(n!=null&&n.engine),status:n!=null&&n.engine?"Update verfügbar":"aktuell",actionLabel:"Anzeigen",onAction:()=>Be("engine")}),l.jsx(fu,{icon:vw,iconClass:"text-fuchsia-400",name:"Router (llama-swap)",available:!!(n!=null&&n.swap),status:n!=null&&n.swap?"Update verfügbar":"aktuell",actionLabel:"Anzeigen",onAction:()=>Be("swap")}),(()=>{var Le;const $=(Le=n==null?void 0:n.components)==null?void 0:Le.find(cr=>cr.key==="hermes_agent");return l.jsx(fu,{icon:wn,iconClass:"text-amber-400",name:"Hermes-Agent",available:($==null?void 0:$.update)===!0,busy:pe,status:($==null?void 0:$.update)===!0?`Update: ${$.latest}`:($==null?void 0:$.reachable)===!1?"offline":"aktuell",actionLabel:"Anzeigen",onAction:()=>Be("hermes")})})(),(Ti=n==null?void 0:n.model_list)==null?void 0:Ti.map($=>l.jsx(fu,{icon:q3,iconClass:"text-emerald-400",name:`Modell · ${$.role}`,available:!0,status:$.title,actionLabel:"Upgrade",onAction:()=>ht($.repo,$.role)},$.role))]})]}),l.jsxs("div",{className:"space-y-2.5",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Dienste"}),l.jsx("div",{className:"space-y-1.5",children:rN.map($=>{var Le;return l.jsx(WX,{label:$.label,system:$.type==="system",ok:(Le=B==null?void 0:B.services.find(cr=>cr.name.toLowerCase().includes($.reach)))==null?void 0:Le.ok,busy:k[$.id],onRestart:()=>Jn($.id),onLogs:()=>{f($.id),E("logs")}},$.id)})})]}),l.jsxs("div",{className:"space-y-2.5",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Backup"}),l.jsxs("div",{className:"rounded-lg border border-border/50 bg-background/20 px-3 py-2.5 flex items-center gap-3",children:[l.jsxs("div",{className:"flex-1 min-w-0",children:[l.jsx("div",{className:"text-xs text-foreground truncate",children:Y[0]?`Letztes: ${Y[0].snapshot}`:"Noch kein Backup"}),l.jsxs("div",{className:"text-[10px] text-muted-foreground",children:[Y.length," Snapshots · Restore per CLI (restore.sh)"]})]}),l.jsxs("button",{onClick:Ca,disabled:D,className:"flex items-center gap-1.5 text-[11px] font-semibold rounded-lg px-2.5 py-1 bg-primary text-primary-foreground hover:opacity-90 transition-all cursor-pointer disabled:opacity-50 shrink-0",children:[l.jsx(X3,{className:ee("h-3.5 w-3.5",D&&"animate-pulse")})," Snapshot"]})]}),_&&l.jsx("div",{className:"text-[10px] font-mono text-primary bg-primary/5 p-2 rounded-lg border border-primary/20 break-all leading-normal",children:_})]}),l.jsxs("div",{className:"space-y-2.5",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-red-400/80",children:"Gefahrenzone"}),l.jsxs("button",{onClick:ur,className:"flex w-full items-center gap-3 p-3 rounded-lg border border-red-500/20 bg-red-500/5 hover:bg-red-500/10 text-red-400 transition-all text-left text-xs font-semibold",children:[l.jsx(P4,{className:"h-4.5 w-4.5"}),l.jsxs("div",{children:[l.jsx("div",{children:"Host-System neu starten"}),l.jsx("div",{className:"text-[10px] text-red-400/80 font-normal",children:"Startet die ganze Box neu"})]})]})]}),l.jsxs("div",{className:"space-y-3",children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Hintergrund-Aufgaben"}),l.jsxs("span",{className:"text-[10px] font-mono bg-primary/10 text-primary px-1.5 py-0.5 rounded-full",children:[o.filter($=>$.state==="running"||$.state==="queued").length," Aktiv"]})]}),l.jsx("div",{className:"space-y-3",children:o.length===0?l.jsx("div",{className:"text-xs text-muted-foreground border border-dashed border-border/60 rounded-xl p-6 text-center",children:"Aktuell keine aktiven Hintergrund-Jobs."}):o.map($=>{const Le=$.state==="running"||$.state==="queued";return l.jsxs("div",{className:ee("p-3 rounded-xl border transition-all duration-300",Le?"border-primary/40 bg-primary/5 shadow-md shadow-primary/5":"border-border/40 bg-background/20 opacity-80"),children:[l.jsxs("div",{className:"flex items-start justify-between gap-3",children:[l.jsxs("div",{className:"space-y-1",children:[l.jsxs("div",{className:"text-xs font-semibold flex items-center gap-1.5",children:[Le&&l.jsxs("span",{className:"flex h-2 w-2 relative",children:[l.jsx("span",{className:"animate-ping absolute inline-flex h-full w-full rounded-full bg-primary opacity-75"}),l.jsx("span",{className:"relative inline-flex rounded-full h-2 w-2 bg-primary"})]}),$.label]}),l.jsxs("div",{className:"text-[10px] font-mono text-muted-foreground uppercase flex items-center gap-2",children:[l.jsxs("span",{children:["ID: ",$.id]}),l.jsx("span",{children:"•"}),l.jsx("span",{className:ee($.state==="done"&&"text-emerald-400",$.state==="failed"&&"text-red-400",$.state==="running"&&"text-primary",$.state==="queued"&&"text-amber-400",$.state==="canceled"&&"text-muted-foreground"),children:$.state})]})]}),Le&&l.jsx("button",{onClick:()=>Ii($.id),className:"text-[10px] font-semibold text-red-400 hover:text-red-300 border border-red-500/20 bg-red-500/5 hover:bg-red-500/10 px-2 py-0.5 rounded transition-colors",children:"Abbrechen"})]}),$.state==="running"&&l.jsxs("div",{className:"mt-3 space-y-1",children:[l.jsx("div",{className:"w-full h-1.5 bg-muted rounded-full overflow-hidden",children:l.jsx("div",{className:"h-full bg-primary transition-all duration-500",style:{width:`${$.progress??0}%`}})}),l.jsxs("div",{className:"flex justify-between items-center text-[9px] font-mono text-muted-foreground",children:[l.jsxs("span",{children:[$.progress??0,"%"]}),$.done_bytes!=null&&$.total_bytes!=null&&l.jsxs("span",{children:[Kg($.done_bytes)," / ",Kg($.total_bytes),$.rate_bps!=null&&` (${Kg($.rate_bps)}/s)`]}),$.eta_s!=null&&l.jsxs("span",{children:["ETA: ",$.eta_s,"s"]})]})]})]},$.id)})})]})]}),N==="logs"&&l.jsxs("div",{className:"flex flex-col h-full space-y-4",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx("select",{value:u,onChange:$=>f($.target.value),className:"flex-1 h-9 px-3 text-xs bg-background/40 border border-border/60 rounded-lg outline-none text-foreground font-semibold",children:rN.map($=>l.jsxs("option",{value:$.id,children:[$.label," (",$.type==="system"?"systemd-root":"user",")"]},$.id))}),l.jsxs("button",{onClick:()=>Jn(u),disabled:k[u],className:"flex h-9 px-3 items-center gap-1.5 text-xs font-semibold rounded-lg border border-border/60 bg-background/20 hover:border-primary/50 transition-colors disabled:opacity-50",title:"Dienst neu starten",children:[l.jsx(Xa,{className:ee("h-3.5 w-3.5",k[u]&&"animate-spin")}),"Restart"]})]}),l.jsxs("div",{className:"flex-1 flex flex-col min-h-[300px] border border-border/60 bg-black/50 rounded-xl overflow-hidden shadow-inner",children:[l.jsxs("div",{className:"flex h-9 items-center justify-between px-4 border-b border-border/40 bg-black/30 shrink-0",children:[l.jsxs("div",{className:"flex items-center gap-1.5 text-[10px] font-mono text-muted-foreground",children:[l.jsx(TN,{className:"h-3 w-3 text-primary"}),l.jsxs("span",{children:["stdout/stderr - ",u]})]}),l.jsx("button",{onClick:()=>Oe(u),disabled:g,className:"text-muted-foreground hover:text-foreground transition-colors",children:l.jsx(Xa,{className:ee("h-3 w-3",g&&"animate-spin")})})]}),l.jsx("pre",{ref:xe,className:"flex-1 p-4 overflow-y-auto text-[10px] font-mono text-cyan-300/90 whitespace-pre-wrap select-text leading-relaxed scrollbar-thin",children:b==="password_required"||b==="incorrect_password"?l.jsxs("div",{className:"flex flex-col items-center justify-center p-6 text-center h-full space-y-3",children:[l.jsx(bi,{className:"h-8 w-8 text-amber-400 animate-pulse animate-duration-1000"}),l.jsx("div",{className:"text-xs font-semibold text-amber-300",children:b==="incorrect_password"?"Falsches Sudo-Passwort hinterlegt.":"Sudo-Passwort für systemd-Dienste erforderlich."}),l.jsxs("p",{className:"text-[10px] text-muted-foreground max-w-xs leading-normal",children:["Für das Auslesen der systemd-Logs von ",u," werden Root-Rechte benötigt. Hinterlege dein Passwort in den Einstellungen."]}),l.jsx("button",{onClick:()=>E("settings"),className:"px-3 py-1.5 text-[10px] font-semibold text-primary-foreground bg-primary hover:bg-primary/95 rounded-md transition-colors mt-2",children:"Sudo-Passwort eintragen"})]}):g&&!h?l.jsx("span",{className:"text-muted-foreground",children:"Lade Logs..."}):h||l.jsx("span",{className:"text-muted-foreground",children:"Keine Logeinträge vorhanden."})})]})]}),N==="settings"&&l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Zugangsdaten & Schlüssel"}),l.jsx("p",{className:"text-[10px] text-muted-foreground leading-normal",children:"Diese Daten werden ausschließlich lokal in deinem Browser (localStorage) gespeichert und bei Bedarf an das Backend übertragen."})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("label",{className:"text-xs font-semibold flex items-center gap-1.5",children:[l.jsx(ks,{className:"h-4 w-4 text-amber-400"}),"Host Sudo-Passwort"]}),l.jsxs("div",{className:"relative",children:[l.jsx("input",{type:me?"text":"password",value:M,onChange:$=>K($.target.value),"aria-label":"Host Sudo-Passwort",name:"sudo-password",autoComplete:"off",spellCheck:!1,placeholder:"Sudo-Passwort für System-Operationen",className:"w-full h-10 pl-3 pr-10 text-xs bg-background/40 border border-border/60 rounded-lg outline-none focus:border-primary transition-colors text-foreground"}),l.jsx("button",{type:"button",onClick:()=>ge(!me),"aria-label":me?"Passwort verbergen":"Passwort anzeigen",className:"absolute inset-y-0 right-0 flex items-center pr-3 text-muted-foreground hover:text-foreground transition-colors",children:me?l.jsx(mw,{className:"h-4 w-4","aria-hidden":"true"}):l.jsx(uf,{className:"h-4 w-4","aria-hidden":"true"})})]}),l.jsx("p",{className:"text-[9px] text-muted-foreground leading-normal",children:"Wird benötigt für systemd-Dienste (Llama Swap logs/restart), OS-Update (apt) und Reboot."})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("label",{className:"text-xs font-semibold flex items-center gap-1.5",children:[l.jsx(p4,{className:"h-4 w-4 text-violet-400"}),"HuggingFace API Token"]}),l.jsxs("div",{className:"relative",children:[l.jsx("input",{type:Pe?"text":"password",value:ne,onChange:$=>Z($.target.value),"aria-label":"HuggingFace API Token",name:"hf-token",autoComplete:"off",spellCheck:!1,placeholder:"hf_…",className:"w-full h-10 pl-3 pr-10 text-xs bg-background/40 border border-border/60 rounded-lg outline-none focus:border-primary transition-colors text-foreground"}),l.jsx("button",{type:"button",onClick:()=>re(!Pe),"aria-label":Pe?"Token verbergen":"Token anzeigen",className:"absolute inset-y-0 right-0 flex items-center pr-3 text-muted-foreground hover:text-foreground transition-colors",children:Pe?l.jsx(mw,{className:"h-4 w-4","aria-hidden":"true"}):l.jsx(uf,{className:"h-4 w-4","aria-hidden":"true"})})]}),l.jsx("p",{className:"text-[9px] text-muted-foreground leading-normal",children:"Erlaubt das Herunterladen von geschützten oder Gate-restricted Modellen direkt über Mission Control."})]}),l.jsxs("div",{className:"flex gap-3 pt-2",children:[l.jsx("button",{onClick:()=>{localStorage.setItem("mc_sudo_password",M),localStorage.setItem("mc_hf_token",ne),te("Erfolgreich","Einstellungen erfolgreich lokal gespeichert.")},className:"flex-1 h-9 flex items-center justify-center text-xs font-semibold text-primary-foreground bg-primary hover:bg-primary/90 rounded-lg transition-colors shadow shadow-primary/10 cursor-pointer",children:"Speichern"}),l.jsx("button",{onClick:()=>{K(""),Z(""),localStorage.removeItem("mc_sudo_password"),localStorage.removeItem("mc_hf_token"),te("Gelöscht","Zugangsdaten gelöscht.")},className:"h-9 px-4 flex items-center justify-center text-xs font-semibold text-muted-foreground border border-border/60 bg-background/20 hover:bg-accent rounded-lg transition-colors cursor-pointer",children:"Zurücksetzen"})]})]})]})]}),he&&(()=>{var mc;const $=he.data,Le={os:{icon:ks,cls:"text-cyan-400",title:"OS-Pakete (apt)"},engine:{icon:ff,cls:"text-violet-400",title:"Inferenz-Engine (llama.cpp)"},swap:{icon:vw,cls:"text-fuchsia-400",title:"Router (llama-swap)"},hermes:{icon:wn,cls:"text-amber-400",title:"Hermes-Agent"}}[he.kind],cr=Le.icon,hc=$?he.kind==="os"?($.count??0)===0:he.kind==="hermes"?($.behind??0)===0:$.installed_build!=null&&$.latest_build!=null&&$.latest_build<=$.installed_build:!0;return l.jsxs("div",{className:"fixed inset-0 z-[60] flex items-center justify-center p-4",children:[l.jsx("div",{className:"absolute inset-0 bg-black/70 backdrop-blur-sm",onClick:()=>ae(null)}),l.jsxs("div",{className:"relative w-full max-w-lg max-h-[80vh] flex flex-col rounded-2xl border border-border/60 bg-card shadow-2xl font-sans text-foreground",children:[l.jsxs("div",{className:"flex h-14 shrink-0 items-center justify-between border-b border-border/40 px-5",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(cr,{className:ee("h-4.5 w-4.5",Le.cls)}),l.jsx("h3",{className:"text-sm font-semibold",children:Le.title})]}),l.jsx("button",{onClick:()=>ae(null),className:"flex h-7 w-7 items-center justify-center rounded-lg border border-border/40 text-muted-foreground hover:bg-accent transition-colors",children:l.jsx(Wn,{className:"h-4 w-4"})})]}),l.jsx("div",{className:"flex-1 overflow-y-auto p-5 text-xs space-y-3 scrollbar-thin",children:he.loading?l.jsxs("div",{className:"flex h-24 items-center justify-center gap-2 text-muted-foreground",children:[l.jsx(Xa,{className:"h-4 w-4 animate-spin"})," Details werden geladen…"]}):$!=null&&$.error?l.jsx("div",{className:"rounded-lg border border-red-500/30 bg-red-500/5 p-3 text-red-400",children:$.error}):he.kind==="os"?(($==null?void 0:$.count)??0)===0?l.jsx("div",{className:"text-muted-foreground",children:"Keine Pakete zu aktualisieren — System ist aktuell."}):l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"text-muted-foreground",children:[$.count," Paket(e) werden aktualisiert:"]}),l.jsx("div",{className:"space-y-1",children:$.packages.map(_r=>l.jsxs("div",{className:"flex items-center justify-between gap-2 rounded-md border border-border/40 bg-background/30 px-2.5 py-1.5",children:[l.jsxs("span",{className:"flex items-center gap-1.5 font-mono text-[11px] truncate",children:[l.jsx(A4,{className:"h-3 w-3 text-cyan-400 shrink-0"}),_r.name]}),l.jsxs("span",{className:"flex items-center gap-1 font-mono text-[10px] text-muted-foreground shrink-0",children:[l.jsx("span",{children:_r.current}),l.jsx(sf,{className:"h-3 w-3"}),l.jsx("span",{className:"text-emerald-400",children:_r.candidate})]})]},_r.name))})]}):he.kind==="engine"||he.kind==="swap"?l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"flex items-center gap-2 font-mono text-[11px]",children:[l.jsxs("span",{className:"rounded-md border border-border/40 bg-background/30 px-2 py-1",children:["Build ",($==null?void 0:$.installed_build)??"?"]}),l.jsx(sf,{className:"h-3.5 w-3.5 text-muted-foreground"}),l.jsxs("span",{className:"rounded-md border border-emerald-500/30 bg-emerald-500/5 px-2 py-1 text-emerald-400",children:["Build ",($==null?void 0:$.latest_build)??"?"]})]}),(($==null?void 0:$.name)||($==null?void 0:$.latest_tag))&&l.jsxs("div",{className:"text-muted-foreground",children:["Release: ",l.jsx("span",{className:"text-foreground",children:$==null?void 0:$.name}),$!=null&&$.latest_tag?` (${$.latest_tag})`:""]}),($==null?void 0:$.url)&&l.jsxs("a",{href:$.url,target:"_blank",rel:"noreferrer",className:"inline-flex items-center gap-1 text-primary hover:underline",children:["Release-Notes auf GitHub ",l.jsx(Hs,{className:"h-3 w-3"})]}),($==null?void 0:$.body)&&l.jsx("pre",{className:"whitespace-pre-wrap rounded-lg border border-border/40 bg-background/30 p-3 text-[10px] leading-relaxed text-muted-foreground max-h-60 overflow-y-auto scrollbar-thin",children:$.body})]}):(((mc=$==null?void 0:$.commits)==null?void 0:mc.length)??0)===0?l.jsx("div",{className:"text-muted-foreground",children:"Keine neuen Commits — Hermes-Agent ist bereits aktuell."}):l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"text-muted-foreground",children:[$.behind," neue Commit(s) auf ",l.jsxs("span",{className:"font-mono text-foreground",children:["origin/",$.branch]}),":"]}),l.jsx("div",{className:"space-y-1",children:$.commits.map(_r=>l.jsxs("div",{className:"flex items-start gap-2 rounded-md border border-border/40 bg-background/30 px-2.5 py-1.5",children:[l.jsx(d4,{className:"h-3.5 w-3.5 text-primary shrink-0 mt-0.5"}),l.jsxs("div",{className:"min-w-0",children:[l.jsx("div",{className:"text-[11px] truncate",children:_r.subject}),l.jsxs("div",{className:"font-mono text-[9px] text-muted-foreground",children:[_r.hash," · ",_r.when]})]})]},_r.hash))}),l.jsx("p",{className:"text-[10px] text-muted-foreground leading-normal",children:"Vor dem Update wird automatisch ein Backup erstellt; danach startet der Hermes-Gateway neu."})]})}),l.jsxs("div",{className:"flex gap-3 border-t border-border/40 p-4 shrink-0",children:[l.jsx("button",{onClick:()=>ae(null),className:"h-9 flex-1 rounded-lg border border-border/60 bg-background/20 text-xs font-semibold text-muted-foreground hover:bg-accent transition-colors cursor-pointer",children:"Schließen"}),l.jsx("button",{onClick:et,disabled:he.loading||hc||!!Or,title:Or?`Update läuft bereits: ${Or.label}`:void 0,className:"h-9 flex-1 rounded-lg bg-primary text-xs font-semibold text-primary-foreground hover:opacity-90 transition-all cursor-pointer disabled:opacity-40 disabled:cursor-default",children:Or?"Update läuft…":"Jetzt aktualisieren"})]})]})]})})(),se&&l.jsx(UO,{type:se.type,title:se.title,message:se.message,onConfirm:se.onConfirm,onCancel:se.onCancel})]})}function KX(){const{data:e}=vh(3e4),{data:t}=Ni(),r=((e==null?void 0:e.os)||0)+((e==null?void 0:e.engine)||0)+((e==null?void 0:e.swap)||0)+((e==null?void 0:e.models)||0),n=()=>window.dispatchEvent(new CustomEvent("open-system-drawer",{detail:{tab:"maintenance"}})),a=(t==null?void 0:t.models)??[],o=(t==null?void 0:t.running)??[],c=a.find(m=>m.role==="hermes"),u=a.find(m=>m.role==="coder-lite")||a.find(m=>m.role==="coder"),f=m=>m?o.includes(m):!1,h=m=>{var g;return((g=m==null?void 0:m.split("/").pop())==null?void 0:g.replace(/\.gguf$/i,""))||"—"};return l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Basisstation"}),l.jsx("p",{className:"text-sm text-muted-foreground",children:"Geht's der Box gut, gibt's Updates, was läuft gerade."})]}),l.jsx(VO,{frame:"box"}),l.jsxs("button",{onClick:n,className:ee("w-full flex items-center gap-3 rounded-2xl border p-4 text-left transition-all cursor-pointer",r>0?"border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/10":"border-border/60 bg-card/45 hover:border-primary/40"),children:[r>0?l.jsx(J3,{className:"h-6 w-6 shrink-0 text-amber-400"}):l.jsx(sr,{className:"h-6 w-6 shrink-0 text-emerald-400"}),l.jsxs("div",{className:"flex-1 min-w-0",children:[l.jsx("div",{className:ee("text-sm font-semibold",r>0?"text-amber-400":"text-foreground"),children:r>0?`${r} Update${r===1?"":"s"} verfügbar`:"Alles aktuell"}),l.jsx("div",{className:"text-xs text-muted-foreground",children:r>0?"Antippen, um zu sehen, was genau aktualisiert wird.":"Keine ausstehenden Updates."})]}),r>0&&l.jsxs("span",{className:"shrink-0 flex items-center gap-1 text-xs font-semibold text-amber-400",children:["Ansehen ",l.jsx(ch,{className:"h-4 w-4"})]})]}),l.jsxs("div",{children:[l.jsx("div",{className:"text-xs text-muted-foreground mb-2",children:"Was gerade läuft"}),l.jsx("div",{className:"rounded-2xl border border-border/60 overflow-hidden",children:[{icon:Hn,label:"Lucys Hirn",model:c==null?void 0:c.name,warm:f(c==null?void 0:c.name)},{icon:Bs,label:"Coder (Vibe-Coding)",model:u==null?void 0:u.name,warm:f(u==null?void 0:u.name)}].map(m=>l.jsxs("div",{className:"flex items-center gap-3 px-4 py-3 border-b border-border/40 last:border-0",children:[l.jsx("span",{className:ee("h-2 w-2 shrink-0 rounded-full",m.warm?"bg-emerald-500 animate-pulse":"bg-muted-foreground/40")}),l.jsx(m.icon,{className:"h-4 w-4 text-muted-foreground shrink-0"}),l.jsx("span",{className:"text-sm text-foreground w-40 shrink-0",children:m.label}),l.jsx("span",{className:"text-xs text-muted-foreground flex-1 truncate font-mono",children:h(m.model)}),l.jsx("span",{className:ee("text-xs shrink-0",m.warm?"text-emerald-400":"text-muted-foreground"),children:m.model?m.warm?"warm":"bereit":"nicht gesetzt"})]},m.label))})]}),l.jsxs("div",{className:"grid gap-6 lg:grid-cols-2",children:[l.jsx(BO,{}),l.jsx(HO,{})]}),l.jsx(WO,{})]})}function Gg({icon:e,title:t,sub:r,onClick:n}){return l.jsxs("button",{onClick:n,className:"w-full flex items-center gap-4 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 text-left transition-all hover:border-primary/40 cursor-pointer",children:[l.jsx(e,{className:"h-6 w-6 text-muted-foreground shrink-0"}),l.jsxs("div",{className:"flex-1 min-w-0",children:[l.jsx("div",{className:"text-sm text-foreground",children:t}),l.jsx("div",{className:"text-xs text-muted-foreground",children:r})]}),l.jsx(ch,{className:"h-5 w-5 text-muted-foreground shrink-0"})]})}function GX(){const[e,t]=y.useState(null);return e?l.jsxs("div",{className:"space-y-4",children:[l.jsxs("button",{onClick:()=>t(null),className:"flex items-center gap-1.5 text-xs font-semibold text-muted-foreground hover:text-foreground transition-colors cursor-pointer",children:[l.jsx(AN,{className:"h-4 w-4"})," Maschinenraum"]}),e==="modelle"?l.jsx(qO,{}):l.jsx(XO,{})]}):l.jsxs("div",{className:"space-y-4",children:[l.jsxs("div",{className:"flex items-start justify-between gap-3",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Maschinenraum"}),l.jsx("p",{className:"text-sm text-muted-foreground",children:"Nur nötig, wenn du wirklich was ändern willst."})]}),l.jsx(jE,{})]}),l.jsx(Gg,{icon:Hn,title:"Modelle",sub:"Hirne, Coder, Immer-bereit-Set, Bibliothek",onClick:()=>t("modelle")}),l.jsx(Gg,{icon:R4,title:"Wartung und Logs",sub:"Updates, Backup, Dienste, Logs, Zugangsdaten",onClick:()=>window.dispatchEvent(new CustomEvent("open-system-drawer",{detail:{tab:"maintenance"}}))}),l.jsx(Gg,{icon:wn,title:"Hermes und Verdrahtung",sub:"Agent, Gehirn-Modell, PC-Verbindung",onClick:()=>t("hermes")})]})}const VX=[{id:"start",label:"Start",icon:uh},{id:"vibe",label:"Vibe-Coding",icon:Bs},{id:"konstitution",label:"Konstitution",icon:V3},{id:"maschinenraum",label:"Maschinenraum",icon:Qu}];function qX(){const[e,t]=y.useState("start"),[r,n]=y.useState(!1),[a,o]=y.useState("maintenance"),{data:c}=Py();y.useEffect(()=>{const f=h=>{var m;o(((m=h.detail)==null?void 0:m.tab)||"maintenance"),n(!0)};return window.addEventListener("open-system-drawer",f),()=>window.removeEventListener("open-system-drawer",f)},[]);const u=c&&c.engine_reachable&&(c.brain?c.brain.ready:!0);return l.jsxs("div",{className:"flex h-full relative",children:[l.jsx("div",{className:"fixed inset-0 -z-50 pointer-events-none overflow-hidden bg-[hsl(224,30%,6%)]",children:l.jsx("div",{className:"absolute inset-0 opacity-30 animate-aurora bg-gradient-to-tr from-teal-500/15 via-indigo-500/10 to-purple-500/15 blur-[130px]"})}),l.jsx(ZO,{open:r,onClose:()=>n(!1),defaultTab:a}),l.jsxs("aside",{className:"flex w-56 shrink-0 flex-col border-r border-border/40 bg-card/45 backdrop-blur-md",children:[l.jsxs("div",{className:"flex items-center gap-2 px-5 py-4 border-b border-border/40",children:[l.jsx("div",{className:"h-7 w-7 rounded-lg bg-primary shadow-md shadow-primary/20"}),l.jsxs("div",{className:"leading-tight",children:[l.jsx("div",{className:"text-sm font-semibold tracking-wide font-space",children:"Mission Control"}),l.jsx("div",{className:"text-[10px] text-muted-foreground",children:"3 · Prototyp"})]})]}),l.jsx("nav",{className:"flex-1 space-y-1 px-3 py-4",children:VX.map(f=>l.jsxs("button",{onClick:()=>t(f.id),className:ee("flex w-full items-center gap-3 rounded-md px-3 py-2 text-sm transition-all cursor-pointer",e===f.id?"bg-primary/15 text-primary":"text-muted-foreground hover:bg-accent hover:text-accent-foreground"),children:[l.jsx(f.icon,{className:"h-4.5 w-4.5 shrink-0"})," ",f.label]},f.id))}),l.jsxs("div",{className:"px-3 py-3 border-t border-border/40 space-y-2",children:[l.jsxs("div",{className:"flex items-center gap-2 px-2 text-xs text-muted-foreground",children:[l.jsx("span",{className:ee("h-2 w-2 rounded-full",u?"bg-emerald-500 animate-pulse":"bg-amber-500")}),u?"Box läuft":"prüfen"]}),l.jsxs("a",{href:"#dashboard",className:"flex items-center gap-1.5 rounded-md px-2 py-1.5 text-[11px] text-muted-foreground hover:text-foreground transition-colors",children:[l.jsx(AN,{className:"h-3.5 w-3.5"})," zurück zu MC2"]})]})]}),l.jsxs("main",{className:"flex-1 min-w-0 overflow-y-auto p-6 scrollbar-thin",children:[e==="start"&&l.jsx(KX,{}),e==="vibe"&&l.jsx(QO,{}),e==="konstitution"&&l.jsx(YO,{}),e==="maschinenraum"&&l.jsx(GX,{})]})]})}function QX(){var j,k,S,N,E;WD();const[e,t]=y.useState(()=>{const A=window.location.hash.slice(1);return mu.some(P=>P.id===A)?A:"dashboard"}),r=y.useCallback(A=>{window.location.hash.slice(1)===A?t(A):window.location.hash=A},[]),[n,a]=y.useState(()=>localStorage.getItem("mc_sidebar_collapsed")==="true"),[o,c]=y.useState(!1),[u,f]=y.useState("maintenance"),[h,m]=y.useState(()=>window.location.hash==="#mc3"),{data:g}=Py(),{data:v}=Po(2e4);y.useEffect(()=>{document.documentElement.classList.add("dark")},[]),y.useEffect(()=>{const A=P=>{var O;f(((O=P.detail)==null?void 0:O.tab)||"maintenance"),c(!0)};return window.addEventListener("open-system-drawer",A),()=>window.removeEventListener("open-system-drawer",A)},[]),y.useEffect(()=>{const A=P=>{var O;const _=(O=P.detail)==null?void 0:O.view;_&&r(_)};return window.addEventListener("mc-navigate",A),()=>window.removeEventListener("mc-navigate",A)},[r]),y.useEffect(()=>{const A=()=>{m(window.location.hash==="#mc3");const P=window.location.hash.slice(1);mu.some(_=>_.id===P)&&t(P)};return window.addEventListener("hashchange",A),()=>window.removeEventListener("hashchange",A)},[]);const b=mu.find(A=>A.id===e);return h?l.jsx(qX,{}):l.jsxs("div",{className:"flex h-full relative",children:[l.jsxs("div",{className:"fixed inset-0 -z-50 pointer-events-none overflow-hidden bg-[hsl(224,30%,6%)]",children:[l.jsx("div",{className:"absolute inset-0 opacity-35 animate-aurora bg-gradient-to-tr from-teal-500/20 via-indigo-500/15 to-purple-500/20 blur-[130px]"}),l.jsx("div",{className:"absolute top-[-10%] left-[-10%] h-[50%] w-[50%] rounded-full bg-teal-500/15 blur-[160px]"}),l.jsx("div",{className:"absolute bottom-[-10%] right-[-10%] h-[50%] w-[50%] rounded-full bg-purple-500/15 blur-[160px]"}),l.jsx("div",{className:"absolute top-[30%] right-[20%] h-[40%] w-[40%] rounded-full bg-indigo-500/10 blur-[140px]"})]}),l.jsx(YT,{onNavigate:r}),l.jsx(ZO,{open:o,onClose:()=>c(!1),defaultTab:u}),l.jsxs("aside",{className:ee("flex shrink-0 flex-col border-r border-border/40 bg-card/45 backdrop-blur-md transition-all duration-300 ease-in-out",n?"w-16":"w-60"),children:[l.jsxs("div",{className:ee("flex items-center py-4 border-b border-border/40 shrink-0",n?"flex-col gap-3 px-2":"justify-between px-5"),children:[l.jsxs("div",{className:"flex items-center gap-2 overflow-hidden",children:[l.jsx("div",{className:"h-7 w-7 rounded-lg bg-primary shadow-md shadow-primary/20 shrink-0"}),!n&&l.jsxs("div",{className:"leading-tight",children:[l.jsx("div",{className:"text-sm font-semibold tracking-wide font-space",children:"Mission Control"}),l.jsx("div",{className:"text-xs text-muted-foreground",children:"2.0"})]})]}),l.jsx("button",{onClick:()=>{a(A=>{const P=!A;return localStorage.setItem("mc_sidebar_collapsed",P.toString()),P})},className:"p-1 rounded-md hover:bg-accent text-muted-foreground transition-colors cursor-pointer","aria-label":n?"Seitenleiste ausklappen":"Seitenleiste einklappen",title:n?"Maximieren":"Minimieren",children:n?l.jsx(ch,{className:"h-4 w-4","aria-hidden":"true"}):l.jsx(Z3,{className:"h-4 w-4","aria-hidden":"true"})})]}),l.jsx("nav",{className:"flex-1 space-y-1 px-3 py-4 overflow-y-auto",children:mu.map(A=>l.jsxs("a",{href:`#${A.id}`,"aria-current":e===A.id?"page":void 0,className:ee("flex w-full items-center rounded-md text-sm transition-all cursor-pointer",n?"justify-center p-2.5":"gap-3 px-3 py-2",e===A.id?"bg-primary/15 text-primary shadow-sm shadow-primary/5":"text-muted-foreground hover:bg-accent hover:text-accent-foreground"),title:n?A.label:void 0,"aria-label":n?A.label:void 0,children:[l.jsx(A.icon,{className:"h-4.5 w-4.5 shrink-0","aria-hidden":"true"}),!n&&l.jsx("span",{className:"truncate",children:A.label})]},A.id))}),l.jsx("div",{className:ee("py-3 text-xs text-muted-foreground border-t border-border/40 shrink-0",n?"px-2 text-center":"px-5"),children:n?l.jsx("div",{className:"flex justify-center",children:l.jsx("span",{className:ee("h-2.5 w-2.5 rounded-full ring-2 ring-black/40",g?g.engine_reachable?g.brain&&!g.brain.ready?"bg-amber-500 animate-pulse":"bg-emerald-500 animate-pulse":"bg-amber-500":"bg-red-500"),title:g?g.engine_reachable?g.brain&&!g.brain.ready?`Hirn offline (${g.brain.model??"fast"})`:"Engine + Hirn online":"Engine offline":"Backend offline"})}):l.jsxs("div",{className:"space-y-2 text-left",children:[g?l.jsxs(l.Fragment,{children:[l.jsxs("span",{className:"flex items-center gap-2",children:[l.jsx("span",{className:ee("h-2 w-2 rounded-full animate-pulse",g.engine_reachable?"bg-emerald-500":"bg-amber-500")}),l.jsxs("span",{className:"truncate",children:["Engine ",g.engine_reachable?"online":"offline"]})]}),g.brain&&!g.brain.ready&&l.jsxs("span",{className:"flex items-center gap-2 text-amber-400",title:`Agent-Hirn '${g.brain.model??"fast"}' lädt nicht/abgestürzt`,children:[l.jsx("span",{className:"h-2 w-2 rounded-full bg-amber-500 animate-pulse"}),l.jsxs("span",{className:"truncate",children:["Hirn offline",g.brain.model?` (${g.brain.model})`:""]})]})]}):l.jsxs("span",{className:"flex items-center gap-2",children:[l.jsx("span",{className:"h-2 w-2 rounded-full bg-red-500"})," ",l.jsx("span",{className:"truncate",children:"Backend offline"})]}),(v==null?void 0:v.versions)&&l.jsxs("div",{className:"space-y-1 text-[9px] text-muted-foreground/60 mt-2 pt-2 border-t border-border/30",children:[l.jsxs("div",{className:"truncate",title:v.versions.mc2?`${v.versions.mc2.branch}-${v.versions.mc2.hash}${v.versions.mc2.dirty?"*":""} (${v.versions.mc2.date})`:"nicht gefunden",children:[l.jsx("strong",{children:"MC2:"})," ",v.versions.mc2?`${v.versions.mc2.hash}${v.versions.mc2.dirty?"*":""}`:"—"]}),l.jsxs("div",{className:"truncate",title:((j=v.versions.engine)==null?void 0:j.type)==="git"?`${v.versions.engine.branch}-${v.versions.engine.hash}${v.versions.engine.dirty?"*":""} (${v.versions.engine.date})`:((k=v.versions.engine)==null?void 0:k.version_text)||"unbekannt",children:[l.jsx("strong",{children:"Engine:"})," ",((S=v.versions.engine)==null?void 0:S.type)==="git"?`${v.versions.engine.hash}${v.versions.engine.dirty?"*":""}`:((E=(N=v.versions.engine)==null?void 0:N.version_text)==null?void 0:E.split(" ").pop())||"—"]}),l.jsxs("div",{className:"truncate",title:v.versions.hermes_ui?`${v.versions.hermes_ui.branch}-${v.versions.hermes_ui.hash}${v.versions.hermes_ui.dirty?"*":""} (${v.versions.hermes_ui.date})`:"nicht gefunden",children:[l.jsx("strong",{children:"Hermes UI:"})," ",v.versions.hermes_ui?`${v.versions.hermes_ui.hash}${v.versions.hermes_ui.dirty?"*":""}`:"—"]}),l.jsxs("div",{className:"truncate",title:v.versions.hermes_agent?`${v.versions.hermes_agent.branch}-${v.versions.hermes_agent.hash}${v.versions.hermes_agent.dirty?"*":""} (${v.versions.hermes_agent.date})`:"nicht gefunden",children:[l.jsx("strong",{children:"Hermes Agent:"})," ",v.versions.hermes_agent?`${v.versions.hermes_agent.hash}${v.versions.hermes_agent.dirty?"*":""}`:"—"]})]})]})})]}),l.jsxs("div",{className:"flex min-w-0 flex-1 flex-col",children:[l.jsxs("header",{className:"flex h-14 shrink-0 items-center justify-between border-b border-border/40 px-6 bg-card/20 backdrop-blur-sm",children:[l.jsx("div",{className:"text-xs font-medium text-muted-foreground tracking-wide uppercase font-sans",children:b.hint}),l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(jE,{}),l.jsx("a",{href:"https://git.tobisniceshomelab.ddnsfree.com/Hitonabi/mission-control-v2/src/branch/main/docs/BEDIENUNG.md",target:"_blank",rel:"noopener",className:"flex h-8 items-center rounded-md border border-border/40 bg-background/40 px-2.5 text-xs text-muted-foreground hover:bg-accent hover:text-accent-foreground transition-all cursor-pointer font-semibold",title:"Bedien-Anleitung",children:"Hilfe"}),l.jsxs("button",{onClick:()=>{const A=new KeyboardEvent("keydown",{key:"k",metaKey:!0});document.dispatchEvent(A)},className:"flex items-center gap-2 rounded-md border border-border/40 bg-background/40 px-2.5 py-1.5 text-xs text-muted-foreground hover:bg-accent hover:text-accent-foreground transition-all cursor-pointer",children:[l.jsx(a4,{className:"h-3.5 w-3.5"}),l.jsx("span",{children:"Suchen"}),l.jsx("kbd",{className:"rounded bg-muted px-1.5 py-0.5 font-mono text-[9px]",children:"⌘K"})]})]})]}),l.jsxs("main",{className:"flex-1 overflow-y-auto p-6 scrollbar-thin",children:[e==="dashboard"&&l.jsx(yX,{}),e==="models"&&l.jsx(_X,{}),e==="connect"&&l.jsx(QO,{}),e==="memory"&&l.jsx(YO,{}),e==="agent"&&l.jsx(XO,{}),e==="terminal"&&l.jsx(FX,{}),e==="guide"&&l.jsx(UX,{}),!["dashboard","models","connect","memory","agent","terminal","guide"].includes(e)&&l.jsx(HX,{title:b.label,hint:b.hint})]})]})]})}class YX extends yy.Component{constructor(){super(...arguments);is(this,"state",{error:null})}static getDerivedStateFromError(r){return{error:r}}componentDidCatch(r,n){console.error("Unbehandelter UI-Fehler:",r,n.componentStack)}render(){return this.state.error?l.jsx("div",{className:"min-h-screen flex items-center justify-center bg-neutral-950 text-neutral-200 p-8",children:l.jsxs("div",{className:"max-w-lg space-y-4 text-center",children:[l.jsx("div",{className:"text-2xl",children:"Da ist etwas schiefgelaufen."}),l.jsx("div",{className:"text-sm text-neutral-400 break-all",children:this.state.error.message}),l.jsx("button",{className:"px-4 py-2 rounded-lg bg-neutral-800 hover:bg-neutral-700 border border-neutral-700",onClick:()=>window.location.reload(),children:"Neu laden"})]})}):this.props.children}}const XX=new O3({defaultOptions:{queries:{retry:1,refetchOnWindowFocus:!1,staleTime:5e3}}});i3.createRoot(document.getElementById("root")).render(l.jsx(yy.StrictMode,{children:l.jsx(YX,{children:l.jsx(_3,{client:XX,children:l.jsx(QX,{})})})}));export{Xa as R,xs as S,cv as T,T4 as a,vy as g,l as j,y as r}; diff --git a/frontend/dist/index.html b/frontend/dist/index.html index 0360b9f..c2b5fb6 100644 --- a/frontend/dist/index.html +++ b/frontend/dist/index.html @@ -7,7 +7,7 @@ Mission Control 2.0 - + From 2a4eb51bd7a523ffa28028c5a9050f2985ef1a58 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 2 Jul 2026 14:52:22 +0200 Subject: [PATCH 33/38] Kandidaten live testbar: gpt-oss-120b (2,3x schneller als heavy) + VL-30B in Config (Review P3-17 abgeschlossen) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bench (Box, Vulkan, 32k ctx): gpt-oss-120b tg 54-55 t/s vs. Qwen3.5-122B 23,5 t/s bei 60 statt 73 GB. Beide OHNE Alias-Wechsel deployt — Qualitaets-Entscheid beim User. brains-Gruppe nach Reload wieder angewaermt (hermes/embed/vision ready). Co-Authored-By: Claude Fable 5 --- deploy/llama-swap.config.yaml | 21 +++++++++++++++++++++ docs/REVIEW_2026-07-02.md | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/deploy/llama-swap.config.yaml b/deploy/llama-swap.config.yaml index 33cb109..a208bb4 100644 --- a/deploy/llama-swap.config.yaml +++ b/deploy/llama-swap.config.yaml @@ -68,6 +68,27 @@ models: out: [text] tools: true context: 131072 + gpt-oss-120b: + # heavy-Kandidat (Bench 02.07.: tg 54-55 t/s vs. Qwen3.5-122B 23,5 t/s = 2,3x, 60 statt + # 73 GB). Noch OHNE heavy-Alias — erst Qualitaets-Check (deutsch/Reasoning), dann Entscheid. + cmd: | + llama-server -m /srv/models/gpt-oss-120b-GGUF/gpt-oss-120b-mxfp4-00001-of-00003.gguf --host 127.0.0.1 --port ${PORT} -c 32768 -ngl 999 -fa on --no-mmap --jinja --cache-reuse 256 -cram 16384 + ttl: 600 + capabilities: + in: [text] + out: [text] + tools: true + context: 32768 + Qwen3-VL-30B-A3B-Instruct: + # vision-Upgrade-Kandidat (Bench 02.07.: tg 90-92 t/s, MoE 3B aktiv, stark auf GUI-Benchmarks). + # Noch OHNE vision-Alias — erst Screenshot-Qualitaets-Check, dann Entscheid (brains-Budget!). + cmd: | + llama-server -m /srv/models/Qwen3-VL-30B-A3B-Instruct-GGUF/Qwen3-VL-30B-A3B-Instruct-Q4_K_M.gguf --host 127.0.0.1 --port ${PORT} -c 32768 -ngl 999 -fa on --no-mmap --mmproj /srv/models/Qwen3-VL-30B-A3B-Instruct-GGUF/mmproj-F16.gguf --jinja + ttl: 300 + capabilities: + in: [text, image] + out: [text] + context: 32768 GLM-4.6V-Flash: cmd: | llama-server -m /srv/models/GLM-4.6V-Flash-GGUF/GLM-4.6V-Flash-Q4_K_M.gguf --host 127.0.0.1 --port ${PORT} -c 131072 -ngl 999 -fa on --no-mmap --mmproj /srv/models/GLM-4.6V-Flash-GGUF/mmproj-BF16.gguf --jinja diff --git a/docs/REVIEW_2026-07-02.md b/docs/REVIEW_2026-07-02.md index ef9e626..2c1206d 100644 --- a/docs/REVIEW_2026-07-02.md +++ b/docs/REVIEW_2026-07-02.md @@ -262,7 +262,7 @@ Quelle: `/api/voice/metrics` (live) + eigener TTFT-Test gegen llama-swap. | **P2-14 Cockpit/SystemDrawer** | ⏸ **bewusst vertagt:** reiner Qualitäts-Refactor von live deployter UI; braucht eine eigene Session mit Browser-Verifikation (MC_API_TARGET-Workflow) statt eines Blind-Splits am Session-Ende | | **P3-15 Mem0 v3** | ✅ verifiziert aktiv (BM25/Entity/Hybrid in 2.0.8); mc2-memory nutzt jetzt `sync_turn(messages)` — lernt Tool-NAMEN mit (Ergebnisse bewusst nicht: Poisoning-Vektor). Deployt, Postcheck grün | | **P3-16 llama-swap** | ✅ `capabilities` (in/out/tools/context) je Modell in deploy-Config; Swap-Matrix aktuell unnötig (brains-Gruppe reicht) | -| **P3-17 Kandidaten** | 🟢/🔄 **Qwen3-VL-30B-A3B heruntergeladen + gebencht: tg 90–92 t/s** (MoE 3B aktiv, 19 GB, Vulkan) — klarer Upgrade-Kandidat für die Bildschirm-Sicht (`MC_VISION_MODEL`), Qualitäts-Check mit echten Screenshots + brains-Budget-Entscheid (19 vs. 6 GB warm) beim User. gpt-oss-120B lädt noch (nohup); danach: `bash /tmp/candidate_bench.sh` auf der Box vergleicht ihn gegen heavy (Skript liegt bereit) | +| **P3-17 Kandidaten** | ✅ **Beide gebencht + als testbare Modelle live deployt** (ohne Alias-Wechsel — Qualitäts-Entscheid beim User): (1) **gpt-oss-120B: tg 54–55 t/s vs. heavy (Qwen3.5-122B) 23,5 t/s = 2,3× schneller bei 60 statt 73 GB** → klare Empfehlung für die heavy-Lane nach Deutsch-/Reasoning-Check (`model:"gpt-oss-120b"` am Gateway testen). (2) **Qwen3-VL-30B-A3B: tg 90–92 t/s** → Bildschirm-Sicht-Upgrade nach Screenshot-Check (`MC_VISION_MODEL=Qwen3-VL-30B-A3B-Instruct`); brains-Budget-Frage: 19 vs. 6 GB warm | | **P3-18 Lemonade** | ✅ **Verdikt: nicht als Unterbau.** lemonade-sdk 9.1.4 (Python) installiert + Server lief (OpenAI-API, gute Registry inkl. gpt-oss/GLM) — aber: Python-Edition **offiziell deprecated** (C++-Installer ist der Weg), Server blockiert komplett während Model-Downloads (Health tot >10 min bei 400-MB-Modell), Ryzen-AI-Hybrid auf 9700X unsupported. **Empfehlung für den lokalen GPU-Klon: llama.cpp-Vulkan + llama-swap — derselbe Stack wie die Box** (ein Betriebsmodell, ein Know-how, bewährte Configs). Lemonade-C++ nur, falls Whisper+TTS+LLM aus einer Hand gewünscht | | **MC3-Vollbau** | ⛔ außerhalb des Review-Scopes — eigenes Projekt (Prototyp steht unter #mc3) | From 195b07deef66bc17ba394a6268eff077436a5625 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 2 Jul 2026 15:07:17 +0200 Subject: [PATCH 34/38] Hotfix nach Realtest: Turn-Hold konservativ + Smart-Turn-Vorwaermen (3,3s -> 0,16s Kaltstart) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit User-Feedback 'sehr langsam' diagnostiziert (voice_metrics): (1) zwei App-Instanzen liefen parallel (Dev-Instanz vergessen — beendet), (2) Semantik-Hold hielt echte Saetze auf. - useVAD: warten NUR noch bei sehr sicherem 'unfertig' (P(fertig) < 0.15 statt < 0.5), max. eine Warterunde pro Aeusserung, HOLD 1,8s -> 1,2s, Not-Aus localStorage lucy_turncheck=0, Entscheidung wird bei lucy_perf=1 geloggt (fuer echtes Nachtunen) - voice_service: Smart Turn beim Start vorwaermen (Probe-Inferenz auf Stille) — der 3,3s-Kaltstart traf sonst den ersten gesprochenen Satz; deployt + verifiziert (0,16s) Co-Authored-By: Claude Fable 5 --- .../src/renderer/src/lib/voice/useVAD.ts | 32 +++++++++++++------ voice_service/app.py | 12 +++++++ 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/client/lucy-desktop/src/renderer/src/lib/voice/useVAD.ts b/client/lucy-desktop/src/renderer/src/lib/voice/useVAD.ts index 68f91f6..121c2b7 100644 --- a/client/lucy-desktop/src/renderer/src/lib/voice/useVAD.ts +++ b/client/lucy-desktop/src/renderer/src/lib/voice/useVAD.ts @@ -20,11 +20,16 @@ const REDEMPTION_MS = 450 // so lange Stille -> Äußerung zu Ende (war 900 const PRE_SPEECH_PAD_MS = 320 // Vorlauf mitschneiden (erster Wortanfang nicht abschneiden) const MIN_SPEECH_MS = 160 // kürzer = Klick/Räuspern -> verwerfen const COOLDOWN_MS = 450 // nach Lucys Antwort kurz taub (Echo/Lautsprecher abklingen lassen) -// Semantische Turn-Detection (Smart Turn v3 auf der Box): meldet sie 'incomplete' (User denkt +// Semantische Turn-Detection (Smart Turn v3 auf der Box): meldet sie 'unfertig' (User denkt // mitten im Satz nach), warten wir bis zu HOLD_MS auf die Fortsetzung und hängen sie an, // statt mitten im Gedanken zu antworten. Hart begrenzt, damit Lucy nie ewig schweigt. -const HOLD_MS = 1800 +// KONSERVATIV seit 02.07. abends: Nur bei SEHR sicherem 'unfertig' warten (P(fertig) < 0.15) — +// beim ersten Realtest hielt der Check zu viele echte Sätze auf (+1,8s je Turn, „sehr langsam"). +// Not-Aus ohne Rebuild: localStorage lucy_turncheck = "0". +const HOLD_MS = 1200 +const HOLD_BELOW_P = 0.15 // nur unter dieser P(fertig) wird gewartet const MAX_UTTERANCE_S = 30 // Sicherheitsdeckel fürs Zusammenhängen +const TURNCHECK_ENABLED = typeof localStorage === "undefined" || localStorage.getItem("lucy_turncheck") !== "0" // Float32-Samples (16 kHz mono) -> WAV-Blob (PCM16). Ersetzt den MediaRecorder-webm-Umweg: // die Box muss kein Opus mehr dekodieren, Parakeet/Whisper bekommen direkt sauberes WAV. @@ -44,16 +49,17 @@ function toWavBlob(samples: Float32Array, sampleRate = 16000): Blob { return new Blob([buf], { type: "audio/wav" }) } -// Fragt die Box, ob die Äußerung semantisch fertig ist. Fehler => true (nie blockieren). -async function isTurnComplete(audio: Float32Array): Promise { +// Fragt die Box nach P(fertig) der Äußerung. Fehler => 1.0 (nie blockieren, sofort senden). +async function turnCompleteness(audio: Float32Array): Promise { try { const fd = new FormData() fd.append("audio", toWavBlob(audio.subarray(Math.max(0, audio.length - 8 * 16000))), "rec.wav") const r = await fetch(`${BOX_URL}/api/voice/turn`, { method: "POST", body: fd }) - if (!r.ok) return true - return (await r.json()).complete !== false + if (!r.ok) return 1.0 + const j = await r.json() + return typeof j.probability === "number" ? j.probability : 1.0 } catch { - return true + return 1.0 } } @@ -118,10 +124,16 @@ export function useVAD({ enabled, paused, onUtterance, onListening }: VADOptions if (combined.length > MAX_UTTERANCE_S * 16000) { combined = combined.subarray(combined.length - MAX_UTTERANCE_S * 16000) } - const complete = await isTurnComplete(combined) + // Bereits einmal gehalten? Dann JETZT senden — maximal eine Warterunde pro Äußerung. + if (!TURNCHECK_ENABLED || pending) { emit(combined); return } + const t0 = performance.now() + const pComplete = await turnCompleteness(combined) if (cancelled) return - if (complete) { emit(combined); return } - // Mitten im Gedanken pausiert: kurz auf die Fortsetzung warten, dann notfalls doch senden. + if (localStorage.getItem("lucy_perf") === "1") { + console.log(`[lucy-perf] Turn-Check P(fertig)=${pComplete} in ${Math.round(performance.now() - t0)}ms -> ${pComplete < HOLD_BELOW_P ? "HALTEN" : "senden"}`) + } + if (pComplete >= HOLD_BELOW_P) { emit(combined); return } + // SEHR sicher mitten im Gedanken: kurz auf die Fortsetzung warten, dann notfalls senden. pending = combined if (holdTimer) clearTimeout(holdTimer) holdTimer = setTimeout(() => { if (!cancelled && pending) emit(pending) }, HOLD_MS) diff --git a/voice_service/app.py b/voice_service/app.py index 9e4fee9..75d635e 100644 --- a/voice_service/app.py +++ b/voice_service/app.py @@ -494,6 +494,18 @@ async def lifespan(_app: FastAPI): else: stt_model() log.info("Voice-Sidecar bereit (STT whisper '%s', Piper-Dir %s).", STT_MODEL, VOICES_DIR) + # Smart Turn vorwärmen (Modell + transformers-Import + 1 Probe-Inferenz): der erste + # /turn-Aufruf kostete sonst ~3,3 s — das traf beim Realtest den ersten gesprochenen Satz. + try: + import io as _io + import numpy as _np + import soundfile as _sf + buf = _io.BytesIO() + _sf.write(buf, _np.zeros(16000, dtype="float32"), 16000, format="WAV", subtype="PCM_16") + check_turn(buf.getvalue(), ".wav") + log.info("Smart Turn vorgewärmt.") + except Exception: + log.warning("Smart-Turn-Vorwärmen fehlgeschlagen (Feature bleibt lazy).", exc_info=True) except Exception: log.exception("STT-Vorwärmen fehlgeschlagen (Dienst läuft, /health meldet Detail).") yield From 646031e5c06f9066ca33e7b234dea935d4eaa1a8 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 2 Jul 2026 15:18:13 +0200 Subject: [PATCH 35/38] =?UTF-8?q?TTS:=20Worker-Pool=20aktivieren=20(LUCY?= =?UTF-8?q?=5FWORKERS=3D4=20x=202=20Threads=20beim=20Spawn)=20=E2=80=94=20?= =?UTF-8?q?lief=20seit=20je=20SERIELL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Realtest-Fund (User-Logs): workers=0 -> lange Antworten trudelten seriell nach (9,9s Audio in 9,7s gen). Mit Pool rechnen Folgesaetze parallel zum Sprechen. TTFB des ERSTEN Satzes bleibt ~1,6-2,3s (Voll-Generierung + Kollaps-Gate vor Emission) — Fix dafuer = generate_audio_stream fuer Satz 1 (API vorhanden), braucht Hoer-Tests -> naechste Session. Co-Authored-By: Claude Fable 5 --- client/lucy-desktop/src/main/index.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/client/lucy-desktop/src/main/index.ts b/client/lucy-desktop/src/main/index.ts index 3f73c8b..e892e47 100644 --- a/client/lucy-desktop/src/main/index.ts +++ b/client/lucy-desktop/src/main/index.ts @@ -95,7 +95,14 @@ async function ensureTtsServer() { } catch { /* selbst starten */ } console.log("[lucy] starte pocket_server:", PY, "(cwd:", TTS_DIR + ")") ttsProc = spawn(PY, ["-m", "uvicorn", "pocket_server:app", "--host", "127.0.0.1", "--port", PORT], - { cwd: TTS_DIR, windowsHide: true, env: { ...process.env } }) + { cwd: TTS_DIR, windowsHide: true, env: { + ...process.env, + // Bench-Optimum aus Phase B2 (docs/LUCY_TTS_PLAN.md): 4 Worker x 2 Threads = RTF 0,44 + // statt 0,67 seriell. Ohne diese Envs startete der Server SERIELL (workers=0) -> + // TTS-TTFB 1,7-2,3 s je Antwort (Realtest 02.07.). Per Umgebung überschreibbar. + LUCY_WORKERS: process.env.LUCY_WORKERS || "4", + LUCY_WORKER_THREADS: process.env.LUCY_WORKER_THREADS || "2", + } }) ttsProc.stdout?.on("data", (d) => console.log("[tts]", d.toString().trimEnd())) ttsProc.stderr?.on("data", (d) => console.log("[tts]", d.toString().trimEnd())) ttsProc.on("error", (e) => console.error("[lucy] pocket_server-Spawn fehlgeschlagen:", e)) From d7de1f47d42bc65215d5efad889eaa8487ee88eb Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 2 Jul 2026 15:32:34 +0200 Subject: [PATCH 36/38] Lucy-Prompt: https://-URLs + curl-Timeout in Terminal-Befehlen erzwingen Der v0.18-Security-Scan flaggt schemenlose URLs (wttr.in/... = MEDIUM) -> Approval-Umweg; dazu hing ein wttr.in-curl 31s ohne Timeout. Beides ist Prompt-steuerbar. Co-Authored-By: Claude Fable 5 --- client/lucy-desktop/src/renderer/src/config.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/lucy-desktop/src/renderer/src/config.ts b/client/lucy-desktop/src/renderer/src/config.ts index b3fa03d..3ad0584 100644 --- a/client/lucy-desktop/src/renderer/src/config.ts +++ b/client/lucy-desktop/src/renderer/src/config.ts @@ -14,6 +14,9 @@ export const SYSTEM_PROMPT = "Smalltalk, Allgemeinwissen) — da antworte direkt. Ketten NIEMALS mehrere Tools wild aneinander oder " + "probier herum (kein SSH + Screenshot + Shell für eine simple Info). Wenn ein Tool länger dauert, sag " + "kurz Bescheid, bevor du es nutzt (z. B. „Moment, das schau ich kurz nach, Commander.“), dann liefere das Ergebnis. " + + "In Terminal-Befehlen IMMER vollständige URLs mit https:// schreiben (z. B. https://wttr.in/...) und bei " + + "Netz-Abrufen ein kurzes Timeout setzen (curl: --max-time 8) — sonst hängt der Befehl oder wird vom " + + "Sicherheits-Scan aufgehalten. " + "WICHTIG für die Sprachausgabe: Beginne mit einem KURZEN ersten Satz (nur wenige Wörter, z. B. " + "„Na klar, Commander!“). Fasse dich kurz und komm auf den Punkt — JEDES Satzzeichen (Komma wie Punkt) " + "wird als hörbare Pause gesprochen, je weniger Wörter und Satzzeichen, desto flüssiger. Vermeide vor " + From 9e7cc6612f74d1ab3f532c93a35edeb993f0c55c Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 2 Jul 2026 15:50:16 +0200 Subject: [PATCH 37/38] Lucy ausgegliedert: client/lucy-* -> eigenes Repo Hitonabi/lucy (+ alte hermes-voice geloescht) - lucy-desktop + lucy-tts leben jetzt in F:/Coding Stuff/lucy bzw. git .../Hitonabi/lucy (Verzeichnisnamen unveraendert -> alle Pfade/BATs funktionieren weiter) - lucy-f5 geloescht (Experiment abgeschlossen, Verdikt: Pocket bleibt; Skripte in der Historie) - hermes-voice geloescht (Vor-Lucy-Python-Client, ersetzt) - docs/LUCY_TTS_PLAN.md mit umgezogen; .gitignore entschlackt - MC2 = Box/Stack (Backend, Frontend, Sidecars, Deploy, hermes-pc-Executor) Co-Authored-By: Claude Fable 5 --- .gitignore | 22 - client/hermes-voice/agent_client.py | 31 - client/hermes-voice/ai_client.py | 47 - client/hermes-voice/audio_input.py | 91 - client/hermes-voice/audio_output.py | 70 - client/hermes-voice/build.bat | 46 - client/hermes-voice/config.py | 62 - client/hermes-voice/config_manager.py | 39 - client/hermes-voice/hotkey_listener.py | 103 - client/hermes-voice/main.py | 325 -- client/hermes-voice/requirements.txt | 29 - client/hermes-voice/screen_capture.py | 19 - client/hermes-voice/setup.bat | 44 - client/hermes-voice/start.bat | 4 - client/lucy-desktop/.gitignore | 7 - client/lucy-desktop/Lucy-Check.bat | 8 - client/lucy-desktop/Lucy-Dev-Debug.bat | 13 - client/lucy-desktop/Lucy-Neustart.bat | 12 - .../lucy-desktop/Verknuepfung-erstellen.bat | 7 - client/lucy-desktop/electron.vite.config.ts | 20 - client/lucy-desktop/lucy.ico | Bin 16608 -> 0 bytes client/lucy-desktop/package-lock.json | 4702 ----------------- client/lucy-desktop/package.json | 39 - .../lucy-desktop/scripts/copy-vad-assets.mjs | 23 - client/lucy-desktop/src/main/index.ts | 249 - client/lucy-desktop/src/preload/index.ts | 34 - client/lucy-desktop/src/renderer/index.html | 13 - .../src/renderer/public/vrma/ATTRIBUTION.md | 11 - .../src/renderer/public/vrma/Blush.vrma | Bin 118448 -> 0 bytes .../src/renderer/public/vrma/Clapping.vrma | Bin 118448 -> 0 bytes .../src/renderer/public/vrma/Goodbye.vrma | Bin 118448 -> 0 bytes .../src/renderer/public/vrma/LookAround.vrma | Bin 118448 -> 0 bytes .../src/renderer/public/vrma/Relax.vrma | Bin 118448 -> 0 bytes .../src/renderer/public/vrma/Sad.vrma | Bin 118448 -> 0 bytes .../src/renderer/public/vrma/Surprised.vrma | Bin 118448 -> 0 bytes .../src/renderer/public/vrma/Thinking.vrma | Bin 118448 -> 0 bytes client/lucy-desktop/src/renderer/src/App.tsx | 234 - .../src/renderer/src/components/AuraGlow.tsx | 47 - .../src/renderer/src/components/Avatar3D.tsx | 357 -- .../renderer/src/components/ChatMarkdown.tsx | 60 - .../lucy-desktop/src/renderer/src/config.ts | 58 - .../src/renderer/src/lib/voice/audio.ts | 175 - .../src/renderer/src/lib/voice/perf.ts | 8 - .../src/renderer/src/lib/voice/sentiment.ts | 14 - .../renderer/src/lib/voice/textPipeline.ts | 74 - .../renderer/src/lib/voice/useDanceAudio.ts | 48 - .../renderer/src/lib/voice/usePushToTalk.ts | 45 - .../src/renderer/src/lib/voice/useVAD.ts | 157 - .../renderer/src/lib/voice/useVoiceAgent.ts | 305 -- .../renderer/src/lib/voice/visionIntent.ts | 11 - client/lucy-desktop/src/renderer/src/main.tsx | 10 - .../lucy-desktop/src/renderer/src/styles.css | 282 - .../renderer/src/voice-core/engines/boxStt.ts | 18 - .../src/voice-core/engines/pocketTts.ts | 39 - .../src/renderer/src/voice-core/index.ts | 14 - .../src/renderer/src/voice-core/speech.ts | 84 - .../src/renderer/src/voice-core/types.ts | 27 - client/lucy-desktop/start-lucy.cmd | 9 - client/lucy-desktop/tsconfig.json | 15 - client/lucy-f5/bench_dml.py | 268 - client/lucy-f5/dakeqq_infer.py | 298 -- client/lucy-f5/f5_server.py | 196 - client/lucy-f5/f5_test.py | 44 - client/lucy-f5/lucy_ref.txt | 1 - client/lucy-f5/vocab.txt | 2545 --------- client/lucy-f5/vocab_v1.txt | 2545 --------- client/lucy-tts/B2-Test.bat | 12 - client/lucy-tts/Lucy-Samples-erzeugen.bat | 13 - client/lucy-tts/Lucy-Startklar.bat | 13 - client/lucy-tts/Sweep-B2.bat | 12 - client/lucy-tts/TTFB-Test.bat | 9 - client/lucy-tts/Umlaut-Test.bat | 9 - client/lucy-tts/analyze.py | 50 - client/lucy-tts/bench_b2.py | 67 - client/lucy-tts/bench_lucy.py | 109 - client/lucy-tts/debug_stream.py | 32 - client/lucy-tts/diag_clip.py | 41 - client/lucy-tts/diag_noiseclamp.py | 40 - client/lucy-tts/diag_stream2.py | 57 - client/lucy-tts/diag_stream3.py | 59 - client/lucy-tts/diag_voice_f0.py | 44 - client/lucy-tts/final_test.py | 47 - client/lucy-tts/lucy_ready.py | 60 - client/lucy-tts/make_samples.py | 64 - client/lucy-tts/measure_fix.py | 38 - client/lucy-tts/oute_pc.py | 45 - client/lucy-tts/pocket_server.py | 471 -- client/lucy-tts/ptts_preset.py | 47 - client/lucy-tts/ptts_test.py | 45 - client/lucy-tts/render_desktop.py | 28 - client/lucy-tts/speed_test.py | 20 - client/lucy-tts/stress_de.py | 47 - client/lucy-tts/sweep_b2.py | 105 - client/lucy-tts/sweep_quality.py | 53 - client/lucy-tts/sweep_quality2.py | 45 - client/lucy-tts/test_text_norm.py | 28 - client/lucy-tts/text_norm.py | 120 - client/lucy-tts/transcribe.py | 19 - client/lucy-tts/ttfb_test.py | 50 - client/lucy-tts/tune_front_loud.py | 79 - client/lucy-tts/tune_lsd.py | 33 - client/lucy-tts/tune_lsd_v2.py | 56 - client/lucy-tts/tune_natural.py | 61 - client/lucy-tts/tune_tailfix.py | 63 - client/lucy-tts/tune_temp_final.py | 40 - client/lucy-tts/umlaut_test.py | 49 - client/lucy-tts/verify_clip.py | 28 - 107 files changed, 16366 deletions(-) delete mode 100644 client/hermes-voice/agent_client.py delete mode 100644 client/hermes-voice/ai_client.py delete mode 100644 client/hermes-voice/audio_input.py delete mode 100644 client/hermes-voice/audio_output.py delete mode 100644 client/hermes-voice/build.bat delete mode 100644 client/hermes-voice/config.py delete mode 100644 client/hermes-voice/config_manager.py delete mode 100644 client/hermes-voice/hotkey_listener.py delete mode 100644 client/hermes-voice/main.py delete mode 100644 client/hermes-voice/requirements.txt delete mode 100644 client/hermes-voice/screen_capture.py delete mode 100644 client/hermes-voice/setup.bat delete mode 100644 client/hermes-voice/start.bat delete mode 100644 client/lucy-desktop/.gitignore delete mode 100644 client/lucy-desktop/Lucy-Check.bat delete mode 100644 client/lucy-desktop/Lucy-Dev-Debug.bat delete mode 100644 client/lucy-desktop/Lucy-Neustart.bat delete mode 100644 client/lucy-desktop/Verknuepfung-erstellen.bat delete mode 100644 client/lucy-desktop/electron.vite.config.ts delete mode 100644 client/lucy-desktop/lucy.ico delete mode 100644 client/lucy-desktop/package-lock.json delete mode 100644 client/lucy-desktop/package.json delete mode 100644 client/lucy-desktop/scripts/copy-vad-assets.mjs delete mode 100644 client/lucy-desktop/src/main/index.ts delete mode 100644 client/lucy-desktop/src/preload/index.ts delete mode 100644 client/lucy-desktop/src/renderer/index.html delete mode 100644 client/lucy-desktop/src/renderer/public/vrma/ATTRIBUTION.md delete mode 100644 client/lucy-desktop/src/renderer/public/vrma/Blush.vrma delete mode 100644 client/lucy-desktop/src/renderer/public/vrma/Clapping.vrma delete mode 100644 client/lucy-desktop/src/renderer/public/vrma/Goodbye.vrma delete mode 100644 client/lucy-desktop/src/renderer/public/vrma/LookAround.vrma delete mode 100644 client/lucy-desktop/src/renderer/public/vrma/Relax.vrma delete mode 100644 client/lucy-desktop/src/renderer/public/vrma/Sad.vrma delete mode 100644 client/lucy-desktop/src/renderer/public/vrma/Surprised.vrma delete mode 100644 client/lucy-desktop/src/renderer/public/vrma/Thinking.vrma delete mode 100644 client/lucy-desktop/src/renderer/src/App.tsx delete mode 100644 client/lucy-desktop/src/renderer/src/components/AuraGlow.tsx delete mode 100644 client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx delete mode 100644 client/lucy-desktop/src/renderer/src/components/ChatMarkdown.tsx delete mode 100644 client/lucy-desktop/src/renderer/src/config.ts delete mode 100644 client/lucy-desktop/src/renderer/src/lib/voice/audio.ts delete mode 100644 client/lucy-desktop/src/renderer/src/lib/voice/perf.ts delete mode 100644 client/lucy-desktop/src/renderer/src/lib/voice/sentiment.ts delete mode 100644 client/lucy-desktop/src/renderer/src/lib/voice/textPipeline.ts delete mode 100644 client/lucy-desktop/src/renderer/src/lib/voice/useDanceAudio.ts delete mode 100644 client/lucy-desktop/src/renderer/src/lib/voice/usePushToTalk.ts delete mode 100644 client/lucy-desktop/src/renderer/src/lib/voice/useVAD.ts delete mode 100644 client/lucy-desktop/src/renderer/src/lib/voice/useVoiceAgent.ts delete mode 100644 client/lucy-desktop/src/renderer/src/lib/voice/visionIntent.ts delete mode 100644 client/lucy-desktop/src/renderer/src/main.tsx delete mode 100644 client/lucy-desktop/src/renderer/src/styles.css delete mode 100644 client/lucy-desktop/src/renderer/src/voice-core/engines/boxStt.ts delete mode 100644 client/lucy-desktop/src/renderer/src/voice-core/engines/pocketTts.ts delete mode 100644 client/lucy-desktop/src/renderer/src/voice-core/index.ts delete mode 100644 client/lucy-desktop/src/renderer/src/voice-core/speech.ts delete mode 100644 client/lucy-desktop/src/renderer/src/voice-core/types.ts delete mode 100644 client/lucy-desktop/start-lucy.cmd delete mode 100644 client/lucy-desktop/tsconfig.json delete mode 100644 client/lucy-f5/bench_dml.py delete mode 100644 client/lucy-f5/dakeqq_infer.py delete mode 100644 client/lucy-f5/f5_server.py delete mode 100644 client/lucy-f5/f5_test.py delete mode 100644 client/lucy-f5/lucy_ref.txt delete mode 100644 client/lucy-f5/vocab.txt delete mode 100644 client/lucy-f5/vocab_v1.txt delete mode 100644 client/lucy-tts/B2-Test.bat delete mode 100644 client/lucy-tts/Lucy-Samples-erzeugen.bat delete mode 100644 client/lucy-tts/Lucy-Startklar.bat delete mode 100644 client/lucy-tts/Sweep-B2.bat delete mode 100644 client/lucy-tts/TTFB-Test.bat delete mode 100644 client/lucy-tts/Umlaut-Test.bat delete mode 100644 client/lucy-tts/analyze.py delete mode 100644 client/lucy-tts/bench_b2.py delete mode 100644 client/lucy-tts/bench_lucy.py delete mode 100644 client/lucy-tts/debug_stream.py delete mode 100644 client/lucy-tts/diag_clip.py delete mode 100644 client/lucy-tts/diag_noiseclamp.py delete mode 100644 client/lucy-tts/diag_stream2.py delete mode 100644 client/lucy-tts/diag_stream3.py delete mode 100644 client/lucy-tts/diag_voice_f0.py delete mode 100644 client/lucy-tts/final_test.py delete mode 100644 client/lucy-tts/lucy_ready.py delete mode 100644 client/lucy-tts/make_samples.py delete mode 100644 client/lucy-tts/measure_fix.py delete mode 100644 client/lucy-tts/oute_pc.py delete mode 100644 client/lucy-tts/pocket_server.py delete mode 100644 client/lucy-tts/ptts_preset.py delete mode 100644 client/lucy-tts/ptts_test.py delete mode 100644 client/lucy-tts/render_desktop.py delete mode 100644 client/lucy-tts/speed_test.py delete mode 100644 client/lucy-tts/stress_de.py delete mode 100644 client/lucy-tts/sweep_b2.py delete mode 100644 client/lucy-tts/sweep_quality.py delete mode 100644 client/lucy-tts/sweep_quality2.py delete mode 100644 client/lucy-tts/test_text_norm.py delete mode 100644 client/lucy-tts/text_norm.py delete mode 100644 client/lucy-tts/transcribe.py delete mode 100644 client/lucy-tts/ttfb_test.py delete mode 100644 client/lucy-tts/tune_front_loud.py delete mode 100644 client/lucy-tts/tune_lsd.py delete mode 100644 client/lucy-tts/tune_lsd_v2.py delete mode 100644 client/lucy-tts/tune_natural.py delete mode 100644 client/lucy-tts/tune_tailfix.py delete mode 100644 client/lucy-tts/tune_temp_final.py delete mode 100644 client/lucy-tts/umlaut_test.py delete mode 100644 client/lucy-tts/verify_clip.py diff --git a/.gitignore b/.gitignore index c10301f..9b42480 100644 --- a/.gitignore +++ b/.gitignore @@ -20,25 +20,3 @@ frontend/dist/avatar.vrm box_recon* gemma_swap* -# Lucy-TTS/F5-Experimente: nur Code/Batch committen — venvs, Modelle, Audio, Logs bleiben lokal -client/lucy-tts/ptts-venv/ -client/lucy-tts/venv/ -client/lucy-tts/llamacpp-vulkan/ -client/lucy-tts/llamacpp-vulkan.zip -client/lucy-tts/models/ -client/lucy-tts/out_*/ -client/lucy-tts/*.wav -client/lucy-tts/*.mp3 -client/lucy-tts/*.log -client/lucy-tts/*.safetensors -client/lucy-tts/*.json -client/lucy-f5/.cache/ -client/lucy-f5/F5-TTS-ONNX/ -client/lucy-f5/onnx_de/ -client/lucy-f5/onnx_f32/ -client/lucy-f5/vocos-mel-24khz/ -client/lucy-f5/*.onnx -client/lucy-f5/*.safetensors -client/lucy-f5/*.wav -client/lucy-f5/*.zip -client/lucy-f5/venv/ diff --git a/client/hermes-voice/agent_client.py b/client/hermes-voice/agent_client.py deleted file mode 100644 index 61171fc..0000000 --- a/client/hermes-voice/agent_client.py +++ /dev/null @@ -1,31 +0,0 @@ -"""Spricht mit dem Hermes Agent Daemon auf der AI Box.""" -import httpx - -TIMEOUT = 120 - - -def ask_agent(text: str, screenshot_b64: str | None, settings: dict) -> tuple[str, list]: - """Schickt Nachricht an den Daemon, gibt (response, tool_calls) zurück.""" - daemon_url = settings.get("agent_daemon_url", "http://192.168.178.151:8765") - try: - with httpx.Client(timeout=TIMEOUT) as c: - resp = c.post(f"{daemon_url}/chat", json={ - "message": text, - "screenshot": screenshot_b64, - }) - resp.raise_for_status() - data = resp.json() - return data.get("response", ""), data.get("tool_calls", []) - except httpx.TimeoutException: - return "Antwort hat zu lange gedauert.", [] - except Exception as e: - return f"Agent nicht erreichbar: {e}", [] - - -def get_agent_status(settings: dict) -> dict: - daemon_url = settings.get("agent_daemon_url", "http://192.168.178.151:8765") - try: - with httpx.Client(timeout=5) as c: - return c.get(f"{daemon_url}/status").json() - except Exception: - return {"alive": False} diff --git a/client/hermes-voice/ai_client.py b/client/hermes-voice/ai_client.py deleted file mode 100644 index 55df3f7..0000000 --- a/client/hermes-voice/ai_client.py +++ /dev/null @@ -1,47 +0,0 @@ -import httpx - -SYSTEM_PROMPT = ( - "Du bist Hermes, ein hilfreicher KI-Assistent. " - "Antworte kurz und präzise, da deine Antwort vorgelesen wird. " - "Maximal 3-4 Sätze, kein Markdown." -) -REQUEST_TIMEOUT = 30 - - -def ask(text: str, screenshot_b64: str | None, settings: dict) -> str: - """Schickt Text (+ optionalen Screenshot) an MC2 und gibt die Antwort zurück.""" - use_vision = screenshot_b64 is not None - model = settings.get("vision_model", "Qwen3-VL-2B-Instruct") if use_vision \ - else settings.get("chat_model", "Hermes-4-14B") - base_url = settings.get("mc2_url", "http://192.168.178.151:9001/v1") - max_tokens = int(settings.get("max_response_tokens", 200)) - - if use_vision: - user_content = [ - {"type": "text", "text": text}, - {"type": "image_url", "image_url": { - "url": f"data:image/jpeg;base64,{screenshot_b64}" - }}, - ] - else: - user_content = text - - payload = { - "model": model, - "messages": [ - {"role": "system", "content": SYSTEM_PROMPT}, - {"role": "user", "content": user_content}, - ], - "max_tokens": max_tokens, - "stream": False, - } - - try: - with httpx.Client(timeout=REQUEST_TIMEOUT) as client: - response = client.post(f"{base_url}/chat/completions", json=payload) - response.raise_for_status() - return response.json()["choices"][0]["message"]["content"].strip() - except httpx.TimeoutException: - return "Entschuldigung, die Antwort hat zu lange gedauert." - except Exception as e: - return f"Verbindungsfehler: {e}" diff --git a/client/hermes-voice/audio_input.py b/client/hermes-voice/audio_input.py deleted file mode 100644 index 8d500b9..0000000 --- a/client/hermes-voice/audio_input.py +++ /dev/null @@ -1,91 +0,0 @@ -""" -Audio-Input: Aufnahme + Whisper STT. -Kein Wake-Word-Loop — Aufnahme startet direkt auf Hotkey-Signal. -""" -import os -import tempfile -import threading -import numpy as np -import sounddevice as sd -import scipy.io.wavfile as wav -from faster_whisper import WhisperModel -from pathlib import Path - -SAMPLE_RATE = 16000 -CHUNK = 1024 -ENERGY_THRESHOLD = 0.008 - -_model: WhisperModel | None = None -_model_size: str = "" -_recording = False -_frames: list[np.ndarray] = [] -_stream: sd.InputStream | None = None -_lock = threading.Lock() - - -def load_model(model_size: str): - global _model, _model_size - if _model is None or _model_size != model_size: - model_dir = Path.home() / ".hermes-voice" / "whisper-models" - model_dir.mkdir(parents=True, exist_ok=True) - _model = WhisperModel( - model_size, - device="cpu", - compute_type="int8", - download_root=str(model_dir), - ) - _model_size = model_size - - -def start_recording(): - global _recording, _frames, _stream - with _lock: - _recording = True - _frames = [] - - def callback(indata, frames, time, status): - if _recording: - _frames.append(indata[:, 0].copy()) - - _stream = sd.InputStream( - samplerate=SAMPLE_RATE, - channels=1, - dtype="float32", - blocksize=CHUNK, - callback=callback, - ) - _stream.start() - - -def stop_recording() -> np.ndarray: - global _recording, _stream - with _lock: - _recording = False - if _stream: - _stream.stop() - _stream.close() - _stream = None - if not _frames: - return np.array([], dtype=np.float32) - return np.concatenate(_frames) - - -def transcribe(audio: np.ndarray, model_size: str, language: str) -> str: - if len(audio) < SAMPLE_RATE * 0.3: - return "" - load_model(model_size) - - with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f: - tmp = f.name - try: - wav.write(tmp, SAMPLE_RATE, (audio * 32767).astype(np.int16)) - lang = language if language != "auto" else None - segments, _ = _model.transcribe( - tmp, - language=lang, - beam_size=3, - vad_filter=True, - ) - return " ".join(s.text for s in segments).strip() - finally: - os.unlink(tmp) diff --git a/client/hermes-voice/audio_output.py b/client/hermes-voice/audio_output.py deleted file mode 100644 index 1b4f0c1..0000000 --- a/client/hermes-voice/audio_output.py +++ /dev/null @@ -1,70 +0,0 @@ -import asyncio -import os -import tempfile -import threading -import time -import pygame -import edge_tts - -pygame.mixer.init() -_stop_event = threading.Event() -_speak_lock = threading.Lock() - - -def stop_speaking(): - _stop_event.set() - pygame.mixer.music.stop() - - -def speak(text: str, voice: str = "de-DE-SeraphinaMultilingualNeural", rate: str = "+0%"): - """Text → Edge TTS → Lautsprecher. Blockiert bis fertig oder unterbrochen.""" - with _speak_lock: - _stop_event.clear() - - tmp_path = None - try: - with tempfile.NamedTemporaryFile(suffix=".mp3", delete=False) as f: - tmp_path = f.name - - # Edge TTS in eigenem Event-Loop (Thread-sicher) - loop = asyncio.new_event_loop() - try: - communicate = edge_tts.Communicate(text, voice, rate=rate) - loop.run_until_complete(communicate.save(tmp_path)) - finally: - loop.close() - - if _stop_event.is_set(): - return - - pygame.mixer.music.load(tmp_path) - pygame.mixer.music.play() - - # Polling ohne pygame.time.wait (blockiert Event-Loop nicht) - while pygame.mixer.music.get_busy(): - if _stop_event.is_set(): - pygame.mixer.music.stop() - break - time.sleep(0.05) - - except Exception: - pass - finally: - if tmp_path and os.path.exists(tmp_path): - try: - os.unlink(tmp_path) - except OSError: - pass - - -def play_ding(): - """Kurzer Aktivierungs-Ton (440 Hz, 120ms).""" - import numpy as np - sample_rate = 44100 - duration = 0.12 - t = np.linspace(0, duration, int(sample_rate * duration), False) - wave = (np.sin(2 * np.pi * 440 * t) * 0.3 * 32767).astype(np.int16) - stereo = np.column_stack([wave, wave]) - sound = pygame.sndarray.make_sound(stereo) - sound.play() - time.sleep(duration + 0.02) diff --git a/client/hermes-voice/build.bat b/client/hermes-voice/build.bat deleted file mode 100644 index a4de412..0000000 --- a/client/hermes-voice/build.bat +++ /dev/null @@ -1,46 +0,0 @@ -@echo off -cd /d "%~dp0" - -echo ======================================== -echo Hermes Voice Client -- Build (.exe) -echo ======================================== -echo. - -:: Venv pruefen -if not exist ".venv\Scripts\activate.bat" ( - echo [FEHLER] Bitte erst setup.bat ausfuehren. - pause - exit /b 1 -) - -:: PyInstaller installieren falls noetig -.venv\Scripts\pip install pyinstaller -q - -echo [1/2] Baue HermesVoice.exe ... -.venv\Scripts\pyinstaller ^ - --onefile ^ - --windowed ^ - --name HermesVoice ^ - --add-data "assets;assets" ^ - --hidden-import "customtkinter" ^ - --hidden-import "pynput.keyboard._win32" ^ - --hidden-import "pynput.mouse._win32" ^ - --collect-all "customtkinter" ^ - main.py - -echo. -if exist "dist\HermesVoice.exe" ( - echo [2/2] Fertig! - echo. - echo dist\HermesVoice.exe ^(%.0f MB^) - echo. - echo Die .exe benoetigt beim ersten Start Internet fuer: - echo - Whisper-Modell-Download ^(~150MB fuer "small"^) - echo - Edge TTS ^(online^) - echo. - for %%I in ("dist\HermesVoice.exe") do echo Groesse: %%~zI Bytes -) else ( - echo [FEHLER] Build fehlgeschlagen. Siehe build-Log oben. -) -echo ======================================== -pause diff --git a/client/hermes-voice/config.py b/client/hermes-voice/config.py deleted file mode 100644 index 092f4c8..0000000 --- a/client/hermes-voice/config.py +++ /dev/null @@ -1,62 +0,0 @@ -# Hermes Voice Client — Konfiguration -# Alle Einstellungen hier anpassen, kein Code-Edit nötig. - -# ── AI-Box ────────────────────────────────────────────────────────────── -MC2_BASE_URL = "http://192.168.178.151:9001/v1" - -# Modell für reine Text-Anfragen (kein Screenshot) -CHAT_MODEL = "Hermes-4-14B" - -# Modell wenn ein Screenshot mitgeschickt wird -VISION_MODEL = "Qwen3-VL-2B-Instruct" - -# ── Wake Word ──────────────────────────────────────────────────────────── -# Einfach den gewünschten Trigger-Text hier eintragen — kein Account, kein Download. -# Whisper transkribiert Sprache und prüft ob eines der Wörter enthalten ist. -# Mehrere Varianten möglich: ["hey hermes", "hermes", "hey jarvis"] -WAKE_WORDS = ["hey hermes", "hermes"] - -# Whisper-Modell für die schnelle Wake-Detection (tiny = 39MB, sehr schnell) -WAKE_WHISPER_MODEL = "tiny" - -# ── Spracheingabe ──────────────────────────────────────────────────────── -# faster-whisper Modellgröße: "tiny", "base", "small", "medium" -# "small" läuft gut auf CPU (~244 MB), "base" ist schneller aber ungenauer -WHISPER_MODEL_SIZE = "small" -WHISPER_LANGUAGE = "de" # "de" für Deutsch, "en" für Englisch, None = auto - -# Sekunden Stille bis Aufnahme endet -SILENCE_TIMEOUT = 1.5 -# Maximale Aufnahmedauer in Sekunden (Sicherheitsnetz) -MAX_RECORD_SECONDS = 20 - -# ── Sprachausgabe ──────────────────────────────────────────────────────── -# Edge TTS Stimmen: https://speech.microsoft.com/portal/voicegallery -# Deutsch: "de-DE-KillianNeural", "de-DE-SeraphinaMultilingualNeural" -# Englisch: "en-US-AndrewNeural", "en-US-AriaNeural" -TTS_VOICE = "de-DE-KillianNeural" -TTS_RATE = "+0%" # Geschwindigkeit: "+10%" schneller, "-10%" langsamer -TTS_PITCH = "+0Hz" # Tonhöhe - -# ── Screen Capture ─────────────────────────────────────────────────────── -# Screenshot bei jeder Anfrage mitschicken? -SCREENSHOT_ON_QUERY = True -# Monitor-Index (0 = alle, 1 = primär, 2 = zweiter Monitor) -SCREENSHOT_MONITOR = 1 -# Auflösung für Screenshot (kleinere = schnellere Übertragung) -SCREENSHOT_WIDTH = 1280 -SCREENSHOT_HEIGHT = 720 - -# ── Agent-Verhalten ────────────────────────────────────────────────────── -MAX_RESPONSE_TOKENS = 200 # kurze gesprochene Antworten -REQUEST_TIMEOUT = 30 # Sekunden bis Timeout - -SYSTEM_PROMPT = """Du bist Hermes, ein KI-Assistent der direkt in den lokalen AI-Homelab integriert ist. -Du hörst die Stimme des Nutzers und siehst seinen Bildschirm. - -Regeln für Antworten: -- Kurz und präzise (2–4 Sätze maximum) -- Kein Markdown, keine Aufzählungen, keine Codeblöcke — du wirst gesprochen -- Wenn du einen offensichtlichen Fehler auf dem Bildschirm siehst, weise kurz darauf hin -- Antworte auf Deutsch wenn der Nutzer Deutsch spricht, auf Englisch wenn Englisch -- Sei direkt und hilfreich, kein unnötiges Smalltalk""" diff --git a/client/hermes-voice/config_manager.py b/client/hermes-voice/config_manager.py deleted file mode 100644 index c2d725c..0000000 --- a/client/hermes-voice/config_manager.py +++ /dev/null @@ -1,39 +0,0 @@ -import json -from pathlib import Path - -CONFIG_DIR = Path.home() / ".hermes-voice" -SETTINGS_FILE = CONFIG_DIR / "settings.json" - -DEFAULTS = { - "mc2_url": "http://192.168.178.151:9001/v1", - "chat_model": "Hermes-4-14B", - "vision_model": "Qwen3-VL-2B-Instruct", - "hotkey": "ctrl_r", - "tts_voice": "de-DE-SeraphinaMultilingualNeural", - "tts_rate": "+0%", - "whisper_model": "small", - "language": "de", - "screenshot_enabled": True, - "screenshot_monitor": 1, - "max_response_tokens": 200, - "silence_timeout": 1.5, -} - - -def load() -> dict: - CONFIG_DIR.mkdir(exist_ok=True) - if SETTINGS_FILE.exists(): - try: - saved = json.loads(SETTINGS_FILE.read_text(encoding="utf-8")) - return {**DEFAULTS, **saved} - except Exception: - pass - return dict(DEFAULTS) - - -def save(settings: dict): - CONFIG_DIR.mkdir(exist_ok=True) - SETTINGS_FILE.write_text( - json.dumps(settings, indent=2, ensure_ascii=False), - encoding="utf-8", - ) diff --git a/client/hermes-voice/hotkey_listener.py b/client/hermes-voice/hotkey_listener.py deleted file mode 100644 index e148b00..0000000 --- a/client/hermes-voice/hotkey_listener.py +++ /dev/null @@ -1,103 +0,0 @@ -""" -Globaler Push-to-Talk Hotkey via pynput. -Funktioniert auch wenn das Fenster minimiert/im Hintergrund ist. -""" -import threading -from pynput import keyboard - -# Mapping: config-String → pynput Key/KeyCode -_SPECIAL = { - "ctrl_r": keyboard.Key.ctrl_r, - "ctrl_l": keyboard.Key.ctrl_l, - "alt_r": keyboard.Key.alt_r, - "alt_l": keyboard.Key.alt_l, - "shift_r": keyboard.Key.shift_r, - "shift_l": keyboard.Key.shift_l, - "f13": keyboard.Key.f13, - "f14": keyboard.Key.f14, - "f15": keyboard.Key.f15, - "f16": keyboard.Key.f16, - "caps_lock": keyboard.Key.caps_lock, - "scroll_lock": keyboard.Key.scroll_lock, - "pause": keyboard.Key.pause, -} - -DISPLAY_NAMES = { - "ctrl_r": "Rechte Strg", - "ctrl_l": "Linke Strg", - "alt_r": "Rechte Alt", - "alt_l": "Linke Alt", - "shift_r": "Rechte Shift", - "shift_l": "Linke Shift", - "f13": "F13", "f14": "F14", "f15": "F15", "f16": "F16", - "caps_lock": "Caps Lock", - "scroll_lock": "Scroll Lock", - "pause": "Pause", -} - - -def key_to_str(key) -> str: - """Konvertiert pynput Key → config-String.""" - for name, k in _SPECIAL.items(): - if key == k: - return name - if hasattr(key, "char") and key.char: - return key.char.lower() - return str(key).replace("Key.", "") - - -def str_to_display(key_str: str) -> str: - return DISPLAY_NAMES.get(key_str, key_str.upper()) - - -class HotkeyListener: - def __init__(self, key_str: str, on_press_cb, on_release_cb): - self._key_str = key_str - self._on_press = on_press_cb - self._on_release = on_release_cb - self._pressed = False - self._listener: keyboard.Listener | None = None - - def _target_key(self): - return _SPECIAL.get(self._key_str) or keyboard.KeyCode.from_char(self._key_str) - - def _on_press_raw(self, key): - if not self._pressed and key == self._target_key(): - self._pressed = True - self._on_press() - - def _on_release_raw(self, key): - if self._pressed and key == self._target_key(): - self._pressed = False - self._on_release() - - def start(self): - self._listener = keyboard.Listener( - on_press=self._on_press_raw, - on_release=self._on_release_raw, - ) - self._listener.start() - - def stop(self): - if self._listener: - self._listener.stop() - - def update_key(self, key_str: str): - self._key_str = key_str - self._pressed = False - - -class KeyCapturer: - """Einmalig den nächsten Tastendruck abfangen für Hotkey-Konfiguration.""" - - def __init__(self, callback): - self._callback = callback - self._listener: keyboard.Listener | None = None - - def start(self): - def on_press(key): - key_str = key_to_str(key) - self._listener.stop() - self._callback(key_str) - self._listener = keyboard.Listener(on_press=on_press) - self._listener.start() diff --git a/client/hermes-voice/main.py b/client/hermes-voice/main.py deleted file mode 100644 index 26441f3..0000000 --- a/client/hermes-voice/main.py +++ /dev/null @@ -1,325 +0,0 @@ -""" -Hermes Voice Client — GUI -Push-to-Talk: Hotkey halten → sprechen → loslassen → Hermes antwortet -""" -import queue -import threading -import sys -import customtkinter as ctk -from PIL import Image, ImageDraw - -import config_manager as cfg -from audio_input import start_recording, stop_recording, transcribe -from audio_output import speak, stop_speaking, play_ding -from screen_capture import capture_screen -from agent_client import ask_agent, get_agent_status -from hotkey_listener import HotkeyListener, KeyCapturer, str_to_display - -ctk.set_appearance_mode("dark") -ctk.set_default_color_theme("blue") - -# ── UI-Event-Queue (thread-safe) ───────────────────────────────────────── -_ui_queue: queue.Queue = queue.Queue() - -def ui_event(event: str, data=None): - _ui_queue.put((event, data)) - - -# ── Hauptfenster ───────────────────────────────────────────────────────── -class HermesApp(ctk.CTk): - def __init__(self): - super().__init__() - self.settings = cfg.load() - self._hotkey: HotkeyListener | None = None - self._worker: threading.Thread | None = None - - self.title("Hermes Voice") - self.geometry("400x520") - self.resizable(False, False) - self.protocol("WM_DELETE_WINDOW", self._on_close) - - self._build_ui() - self._start_hotkey() - self.after(100, self._poll_queue) - - # ── Layout ─────────────────────────────────────────────────────────── - def _build_ui(self): - self.grid_columnconfigure(0, weight=1) - self.grid_rowconfigure(2, weight=1) - - # Header - header = ctk.CTkFrame(self, height=50, corner_radius=0) - header.grid(row=0, column=0, sticky="ew") - header.grid_columnconfigure(0, weight=1) - ctk.CTkLabel(header, text="⚡ Hermes Voice", - font=ctk.CTkFont(size=16, weight="bold")).grid( - row=0, column=0, padx=16, pady=12, sticky="w") - ctk.CTkButton(header, text="⚙", width=36, height=36, - command=self._open_settings).grid( - row=0, column=1, padx=8, pady=8) - - # Status - status_frame = ctk.CTkFrame(self, corner_radius=12) - status_frame.grid(row=1, column=0, padx=16, pady=(16, 8), sticky="ew") - status_frame.grid_columnconfigure(0, weight=1) - - self._status_dot = ctk.CTkLabel(status_frame, text="●", - font=ctk.CTkFont(size=32), - text_color="#22c55e") - self._status_dot.grid(row=0, column=0, pady=(12, 4)) - - self._status_label = ctk.CTkLabel(status_frame, text="Bereit", - font=ctk.CTkFont(size=14)) - self._status_label.grid(row=1, column=0, pady=(0, 4)) - - self._hotkey_label = ctk.CTkLabel( - status_frame, - text=f"[ {str_to_display(self.settings['hotkey'])} ] gedrückt halten", - font=ctk.CTkFont(size=11), - text_color="gray", - ) - self._hotkey_label.grid(row=2, column=0, pady=(0, 12)) - - # Conversation log - log_frame = ctk.CTkFrame(self, corner_radius=12) - log_frame.grid(row=2, column=0, padx=16, pady=8, sticky="nsew") - log_frame.grid_columnconfigure(0, weight=1) - log_frame.grid_rowconfigure(1, weight=1) - - ctk.CTkLabel(log_frame, text="Letzte Konversation", - font=ctk.CTkFont(size=11), text_color="gray").grid( - row=0, column=0, padx=12, pady=(8, 0), sticky="w") - - self._log = ctk.CTkTextbox(log_frame, font=ctk.CTkFont(size=12), - state="disabled", wrap="word") - self._log.grid(row=1, column=0, padx=8, pady=(4, 8), sticky="nsew") - - # Footer - footer = ctk.CTkFrame(self, height=40, corner_radius=0) - footer.grid(row=3, column=0, sticky="ew") - footer.grid_columnconfigure(0, weight=1) - - self._screenshot_var = ctk.BooleanVar( - value=self.settings["screenshot_enabled"]) - ctk.CTkCheckBox(footer, text="Screenshot mitsenden", - variable=self._screenshot_var, - command=self._toggle_screenshot).grid( - row=0, column=0, padx=16, pady=8, sticky="w") - - ctk.CTkButton(footer, text="Stop", width=60, height=28, - fg_color="#dc2626", hover_color="#b91c1c", - command=stop_speaking).grid( - row=0, column=1, padx=8, pady=8) - - # ── Hotkey ─────────────────────────────────────────────────────────── - def _start_hotkey(self): - if self._hotkey: - self._hotkey.stop() - self._hotkey = HotkeyListener( - self.settings["hotkey"], - on_press_cb=self._hotkey_pressed, - on_release_cb=self._hotkey_released, - ) - self._hotkey.start() - - def _hotkey_pressed(self): - ui_event("status", ("recording", "🔴 Ich höre…", "#ef4444")) - play_ding() - start_recording() - - def _hotkey_released(self): - audio = stop_recording() - ui_event("status", ("thinking", "💭 Denke…", "#3b82f6")) - self._worker = threading.Thread( - target=self._process, args=(audio,), daemon=True) - self._worker.start() - - def _process(self, audio): - text = transcribe(audio, - self.settings["whisper_model"], - self.settings["language"]) - if not text: - ui_event("status", ("idle", "Bereit", "#22c55e")) - return - - ui_event("log_user", text) - screenshot = (capture_screen() - if self.settings["screenshot_enabled"] else None) - - ui_event("status", ("thinking", "💭 Denke…", "#3b82f6")) - response, tool_calls = ask_agent(text, screenshot, self.settings) - - for tc in tool_calls: - ui_event("log_tool", tc) - - ui_event("log_hermes", response) - ui_event("status", ("speaking", "🔊 Spricht…", "#a855f7")) - speak(response, self.settings["tts_voice"], self.settings["tts_rate"]) - ui_event("status", ("idle", "Bereit", "#22c55e")) - - # ── Queue-Polling ──────────────────────────────────────────────────── - def _poll_queue(self): - while not _ui_queue.empty(): - event, data = _ui_queue.get_nowait() - if event == "status": - _, label, color = data - self._status_label.configure(text=label) - self._status_dot.configure(text_color=color) - elif event == "log_user": - self._append_log(f"Du: {data}") - elif event == "log_hermes": - self._append_log(f"Hermes: {data}\n") - self.after(80, self._poll_queue) - - def _append_log(self, text: str): - self._log.configure(state="normal") - self._log.insert("end", text + "\n") - self._log.see("end") - self._log.configure(state="disabled") - - # ── Settings Dialog ────────────────────────────────────────────────── - def _open_settings(self): - SettingsWindow(self) - - def _toggle_screenshot(self): - self.settings["screenshot_enabled"] = self._screenshot_var.get() - cfg.save(self.settings) - - def apply_settings(self, new_settings: dict): - self.settings = new_settings - cfg.save(new_settings) - self._hotkey.update_key(new_settings["hotkey"]) - self._hotkey_label.configure( - text=f"[ {str_to_display(new_settings['hotkey'])} ] gedrückt halten") - self._screenshot_var.set(new_settings["screenshot_enabled"]) - - def _on_close(self): - if self._hotkey: - self._hotkey.stop() - stop_speaking() - self.destroy() - - -# ── Settings Window ─────────────────────────────────────────────────────── -class SettingsWindow(ctk.CTkToplevel): - def __init__(self, parent: HermesApp): - super().__init__(parent) - self._parent = parent - self.title("Einstellungen") - self.geometry("420x520") - self.resizable(False, False) - self.grab_set() - self._s = dict(parent.settings) - self._capturing = False - self._build() - - def _build(self): - self.grid_columnconfigure(1, weight=1) - row = 0 - - def label(text): - nonlocal row - ctk.CTkLabel(self, text=text, anchor="w").grid( - row=row, column=0, padx=16, pady=6, sticky="w") - - def entry(key, width=240): - nonlocal row - var = ctk.StringVar(value=str(self._s.get(key, ""))) - e = ctk.CTkEntry(self, textvariable=var, width=width) - e.grid(row=row, column=1, padx=16, pady=6, sticky="ew") - row += 1 - return var - - def dropdown(key, options, width=200): - nonlocal row - var = ctk.StringVar(value=str(self._s.get(key, options[0]))) - dd = ctk.CTkOptionMenu(self, values=options, variable=var, width=width) - dd.grid(row=row, column=1, padx=16, pady=6, sticky="w") - row += 1 - return var - - def toggle(key): - nonlocal row - var = ctk.BooleanVar(value=bool(self._s.get(key, False))) - sw = ctk.CTkSwitch(self, text="", variable=var) - sw.grid(row=row, column=1, padx=16, pady=6, sticky="w") - row += 1 - return var - - label("MC2 URL") - self._url = entry("mc2_url") - - label("Hotkey") - self._hotkey_frame = ctk.CTkFrame(self, fg_color="transparent") - self._hotkey_frame.grid(row=row, column=1, padx=16, pady=6, sticky="w") - self._hotkey_display = ctk.CTkLabel( - self._hotkey_frame, - text=str_to_display(self._s.get("hotkey", "ctrl_r")), - width=100, - ) - self._hotkey_display.grid(row=0, column=0, padx=(0, 8)) - ctk.CTkButton(self._hotkey_frame, text="Aufnehmen", width=90, - command=self._capture_hotkey).grid(row=0, column=1) - row += 1 - - label("TTS Stimme") - self._voice = dropdown("tts_voice", [ - "de-DE-SeraphinaMultilingualNeural", - "de-DE-AmalaNeural", - "de-DE-KatjaNeural", - "de-DE-KillianNeural", - "de-DE-ConradNeural", - "en-US-AriaNeural", - "en-US-JennyNeural", - ]) - - label("Whisper Modell") - self._whisper = dropdown("whisper_model", - ["tiny", "base", "small", "medium"]) - - label("Sprache") - self._lang = dropdown("language", - ["de", "en", "auto"]) - - label("Screenshot") - self._screenshot = toggle("screenshot_enabled") - - label("Monitor") - self._monitor = dropdown("screenshot_monitor", ["1", "2", "3"]) - - label("Max. Tokens") - self._tokens = entry("max_response_tokens", width=100) - - row += 1 - ctk.CTkButton(self, text="Speichern", command=self._save).grid( - row=row, column=0, columnspan=2, pady=16, padx=16, sticky="ew") - - def _capture_hotkey(self): - self._hotkey_display.configure(text="Taste drücken…") - - def on_key(key_str): - self._s["hotkey"] = key_str - self.after(0, lambda: self._hotkey_display.configure( - text=str_to_display(key_str))) - - KeyCapturer(on_key).start() - - def _save(self): - self._s["mc2_url"] = self._url.get().strip() - self._s["tts_voice"] = self._voice.get() - self._s["whisper_model"] = self._whisper.get() - self._s["language"] = self._lang.get() - self._s["screenshot_enabled"] = self._screenshot.get() - self._s["screenshot_monitor"] = int(self._monitor.get()) - try: - self._s["max_response_tokens"] = int(self._tokens.get()) - except ValueError: - pass - self._parent.apply_settings(self._s) - self.destroy() - - -# ── Entry Point ─────────────────────────────────────────────────────────── -if __name__ == "__main__": - app = HermesApp() - app.mainloop() diff --git a/client/hermes-voice/requirements.txt b/client/hermes-voice/requirements.txt deleted file mode 100644 index f5b143b..0000000 --- a/client/hermes-voice/requirements.txt +++ /dev/null @@ -1,29 +0,0 @@ -# Hermes Voice Client — Dependencies -# Installation: pip install -r requirements.txt - -# Speech-to-Text (lokal auf CPU) -faster-whisper>=1.0.0 - -# Audio I/O -sounddevice>=0.4.6 -numpy>=1.24.0 -scipy>=1.11.0 - -# Text-to-Speech -edge-tts>=6.1.9 - -# Screen Capture -mss>=9.0.1 -Pillow>=10.0.0 - -# HTTP Client -httpx>=0.27.0 - -# Audio Playback -pygame>=2.5.0 - -# GUI -customtkinter>=5.2.0 - -# Globaler Hotkey -pynput>=1.7.6 diff --git a/client/hermes-voice/screen_capture.py b/client/hermes-voice/screen_capture.py deleted file mode 100644 index 22f6be5..0000000 --- a/client/hermes-voice/screen_capture.py +++ /dev/null @@ -1,19 +0,0 @@ -import base64 -import io -import mss -from PIL import Image -from config import SCREENSHOT_MONITOR, SCREENSHOT_WIDTH, SCREENSHOT_HEIGHT - - -def capture_screen() -> str: - """Screenshot des primären Monitors als base64-JPEG.""" - with mss.mss() as sct: - monitor = sct.monitors[SCREENSHOT_MONITOR] - raw = sct.grab(monitor) - img = Image.frombytes("RGB", raw.size, raw.bgra, "raw", "BGRX") - - img = img.resize((SCREENSHOT_WIDTH, SCREENSHOT_HEIGHT), Image.LANCZOS) - - buf = io.BytesIO() - img.save(buf, format="JPEG", quality=80) - return base64.b64encode(buf.getvalue()).decode("utf-8") diff --git a/client/hermes-voice/setup.bat b/client/hermes-voice/setup.bat deleted file mode 100644 index fe6a861..0000000 --- a/client/hermes-voice/setup.bat +++ /dev/null @@ -1,44 +0,0 @@ -@echo off -:: Immer aus dem eigenen Verzeichnis laufen -cd /d "%~dp0" - -echo ======================================== -echo Hermes Voice Client -- Setup -echo ======================================== -echo. - -:: Python pruefen -python --version >nul 2>&1 -if errorlevel 1 ( - echo [FEHLER] Python nicht gefunden. Bitte Python 3.11+ installieren. - pause - exit /b 1 -) - -:: Venv anlegen falls nicht vorhanden -if not exist ".venv" ( - echo [1/3] Erstelle virtuelle Umgebung... - python -m venv .venv -) - -:: Dependencies installieren -echo [2/3] Installiere Dependencies... -.venv\Scripts\pip install --upgrade pip -q -.venv\Scripts\pip install -r requirements.txt - -:: Kurz-Check -echo [3/3] Pruefe Konfiguration... -.venv\Scripts\python -c "import customtkinter; import pynput; print('GUI + Hotkey OK')" - -echo. -echo ======================================== -echo Setup abgeschlossen! -echo. -echo Naechste Schritte: -echo 1. start.bat ausfuehren -echo 2. Einstellungen (Zahnrad) pruefen: -echo - MC2 URL (Standard: 192.168.178.151:9001) -echo - Hotkey (Standard: Rechte Strg) -echo Optional: build.bat fuer .exe-Kompilierung -echo ======================================== -pause diff --git a/client/hermes-voice/start.bat b/client/hermes-voice/start.bat deleted file mode 100644 index 62f6d0f..0000000 --- a/client/hermes-voice/start.bat +++ /dev/null @@ -1,4 +0,0 @@ -@echo off -:: Hermes Voice Client starten (kein Konsolenfenster im Hintergrund) -cd /d "%~dp0" -start "" .venv\Scripts\pythonw.exe main.py diff --git a/client/lucy-desktop/.gitignore b/client/lucy-desktop/.gitignore deleted file mode 100644 index f26aa03..0000000 --- a/client/lucy-desktop/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -node_modules/ -out/ -dist/ -*.log -# Avatar-VRM ist gross + Lizenz/Redistribution -> nicht committen (lokal/Box vorhalten) -src/renderer/public/avatar.vrm -src/renderer/public/vad/ diff --git a/client/lucy-desktop/Lucy-Check.bat b/client/lucy-desktop/Lucy-Check.bat deleted file mode 100644 index ccdbf37..0000000 --- a/client/lucy-desktop/Lucy-Check.bat +++ /dev/null @@ -1,8 +0,0 @@ -@echo off -chcp 65001 >nul -cd /d "%~dp0" -curl -s -m 5 http://127.0.0.1:8130/health > lucy_check.log 2>&1 -echo.>> lucy_check.log -echo --- electron/vite/pocket laeuft? --->> lucy_check.log -powershell -NoProfile -Command "Get-CimInstance Win32_Process | Where-Object { $_.CommandLine -match 'pocket_server:app|electron-vite|lucy-desktop' } | ForEach-Object { $_.Name + ' ' + $_.ProcessId }" >> lucy_check.log 2>&1 -type lucy_check.log diff --git a/client/lucy-desktop/Lucy-Dev-Debug.bat b/client/lucy-desktop/Lucy-Dev-Debug.bat deleted file mode 100644 index 58233aa..0000000 --- a/client/lucy-desktop/Lucy-Dev-Debug.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off -chcp 65001 >nul -cd /d "F:\Coding Stuff\mission-control-2\client\lucy-desktop" -echo Beende haengende Versuche (ohne mich selbst)... -powershell -NoProfile -Command "Get-CimInstance Win32_Process | Where-Object { $_.Name -eq 'electron.exe' -or $_.CommandLine -match 'electron-vite|pocket_server:app|start-lucy' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force -EA SilentlyContinue }" -timeout /t 2 >nul -echo Starte 'npm run dev' mit Log-Capture... -start /b "" cmd /c "npm run dev > dev.log 2>&1" -timeout /t 22 >nul -echo === dev.log === -type dev.log -echo. -echo (laeuft im Hintergrund weiter, falls erfolgreich) diff --git a/client/lucy-desktop/Lucy-Neustart.bat b/client/lucy-desktop/Lucy-Neustart.bat deleted file mode 100644 index af9d02e..0000000 --- a/client/lucy-desktop/Lucy-Neustart.bat +++ /dev/null @@ -1,12 +0,0 @@ -@echo off -chcp 65001 >nul -REM Hygiene: Recon-Log mit Token entfernen -del /q "F:\Coding Stuff\mission-control-2\box_recon.log" 2>nul -echo Beende laufende Lucy-Instanz (pocket_server :8130 + Electron/Vite)... -powershell -NoProfile -ExecutionPolicy Bypass -Command "Get-CimInstance Win32_Process | Where-Object { $_.CommandLine -match 'pocket_server:app|lucy-desktop|electron-vite' } | ForEach-Object { Write-Output ('kill ' + $_.ProcessId + ' ' + $_.Name); Stop-Process -Id $_.ProcessId -Force -ErrorAction SilentlyContinue }" -timeout /t 2 >nul -echo. -echo Starte Lucy neu (frischer Voice-Server + Client mit erweitertem Umlaut-Fix)... -start "" "F:\Coding Stuff\mission-control-2\client\lucy-desktop\start-lucy.cmd" -timeout /t 3 >nul -echo Fertig. diff --git a/client/lucy-desktop/Verknuepfung-erstellen.bat b/client/lucy-desktop/Verknuepfung-erstellen.bat deleted file mode 100644 index c5aed20..0000000 --- a/client/lucy-desktop/Verknuepfung-erstellen.bat +++ /dev/null @@ -1,7 +0,0 @@ -@echo off -chcp 65001 >nul -powershell -NoProfile -ExecutionPolicy Bypass -Command "$ws=New-Object -ComObject WScript.Shell; $p=Join-Path ([Environment]::GetFolderPath('Desktop')) 'Lucy.lnk'; $l=$ws.CreateShortcut($p); $l.TargetPath='F:\Coding Stuff\mission-control-2\client\lucy-desktop\start-lucy.cmd'; $l.WorkingDirectory='F:\Coding Stuff\mission-control-2\client\lucy-desktop'; $l.IconLocation='F:\Coding Stuff\mission-control-2\client\lucy-desktop\lucy.ico'; $l.Description='Lucy - lokaler Sprach-Companion starten'; $l.Save(); Write-Output ('OK: ' + $p)" > lucy_shortcut.log 2>&1 -type lucy_shortcut.log -echo. -echo Fertig - "Lucy" liegt jetzt auf dem Desktop. -pause diff --git a/client/lucy-desktop/electron.vite.config.ts b/client/lucy-desktop/electron.vite.config.ts deleted file mode 100644 index 0e79038..0000000 --- a/client/lucy-desktop/electron.vite.config.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { defineConfig } from "electron-vite" -import react from "@vitejs/plugin-react" -import { resolve } from "path" - -export default defineConfig({ - main: { - build: { rollupOptions: { input: { index: resolve(__dirname, "src/main/index.ts") } } }, - }, - preload: { - build: { rollupOptions: { input: { index: resolve(__dirname, "src/preload/index.ts") } } }, - }, - renderer: { - root: resolve(__dirname, "src/renderer"), - build: { rollupOptions: { input: { index: resolve(__dirname, "src/renderer/index.html") } } }, - // Silero-VAD-Assets (Worklet + ONNX + onnxruntime-WASM) liegen self-hosted in - // src/renderer/public/vad/ (scripts/copy-vad-assets.mjs, läuft via npm postinstall) — - // Pfade = baseAssetPath/onnxWASMBasePath in useVAD.ts. - plugins: [react()], - }, -}) diff --git a/client/lucy-desktop/lucy.ico b/client/lucy-desktop/lucy.ico deleted file mode 100644 index f5849fe7fd99fdbf4e072111883606be83f48b8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16608 zcmZ{M3p`Zm|Npp!R6~*^CaJYuCrOgbR93bX)2_<4VY*TwNvO=ltyGfQwiL@~+epe3 za!FUX!!PjP!hdvTfDc}$ANs;yh5X{O4VCkDQ6Kn1({HQW zRut-4qMrPq7Wi8C)Q|f@P^dW-@E^76pod3Ls4c`DKWyE7)@P_~-yO3Lp;*!8?qOWF zb>g{Er_(VZ!q7$4!T)TDJ{)5mbHifip}7aF(T8#uXw5yAwq@i}eZbOt+Yc9R*|vCn zSfT!XYhV35)Xi22C-jlKC;hqjH-F(m_t5Ys!u;i+q>b5uVuw$Uz#%2Tc zKpJ^iFYhzIu-9+J;~`dVXyv^fGu&n;w1$++D+TSnU;ZNSpODA@*!NCx?y9`Qj~XP{ zCoV8?R5Wj~YR>c4BsCJu10)abGRVr{5LK>SU1NeU#n}OO89ir1a2eI*tcz9W(Q@69 zBvE+#ZVxl8>At`-l^8Eofd~0@4!gE%pxv%;)!7O!`}<8^_KIIiLRhr(nlX}C^e|ES z%KssDhxElhmpUi*%fRj+S#!X-A=A;I*~cT^mYE+(Svk`!G=DI^&@XQ!XJ9pCB?CmdwG-yd-qJ_pmpB0WNlBz(fNV+;|24BbM9e(3m`lyXS#W~ z-P*h1;&)b~(Qo;jWAfT~VsaLnd`#dapFcyWOMHcX=FiuV$M6lIWl(`CqBHwp(4El6 z&AI)l>T`77Rdsu9^?0z?6ekt+wYrbHe0=GbliC)PliXr#w~cs&8`rGCx0I`SVE)21 zCNdALahJZ|K~LtbiKtlBHm)me>vQNoF-OzQ=(i1rF6IdB%%G~B?NF47Y;+)S)E&yn z66z5RBnHxT{5(jTj}|C`iH>9G=b*cVbmLNK|i9b5o<~b>vw{T@gMu+TNSy*l^AE{&+BFX`A#M`@MEPTHPaQR?k!CRr`d1f@{*)*-6Q zcqXl4;sGA5$joG*F#H}q$NZMqGNP_Bu{7Yj$LDK=Tk0`p$8T#{<`2HZGYG_Ut9k8@ zZ4TE|7lZd~c1iYr6Y&BjioJdtjfGLC>MQ4yE>RmTvCn0l)#6I+=sIo2cB+#n$FNkK zu?8|Ze&Wt;$A14VhU5L94x*}Yp!?B2jV9qi%Ted@o=(PGTscOaR*7bXh{#=xS@gMm-z#(tKl67>/_<(nB_(iEXs+Pd&H=Sp@%ODLDT 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 diff --git a/client/lucy-desktop/package-lock.json b/client/lucy-desktop/package-lock.json deleted file mode 100644 index be623de..0000000 --- a/client/lucy-desktop/package-lock.json +++ /dev/null @@ -1,4702 +0,0 @@ -{ - "name": "lucy-desktop", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "lucy-desktop", - "version": "0.1.0", - "hasInstallScript": true, - "dependencies": { - "@pixiv/three-vrm": "^3.4.0", - "@pixiv/three-vrm-animation": "^3.5.4", - "@react-three/drei": "^9.114.0", - "@react-three/fiber": "^8.17.10", - "@ricky0123/vad-web": "^0.0.30", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-markdown": "^9.1.0", - "remark-gfm": "^4.0.1", - "three": "^0.169.0" - }, - "devDependencies": { - "@types/react": "^18.3.12", - "@types/react-dom": "^18.3.1", - "@types/three": "^0.169.0", - "@vitejs/plugin-react": "^4.3.4", - "electron": "^43.0.0", - "electron-vite": "^3.0.0", - "typescript": "^5.6.3", - "vite": "^6.0.3" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", - "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.29.7", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", - "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", - "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-compilation-targets": "^7.29.7", - "@babel/helper-module-transforms": "^7.29.7", - "@babel/helpers": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", - "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", - "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.29.7", - "@babel/helper-validator-option": "^7.29.7", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", - "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", - "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", - "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7", - "@babel/traverse": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", - "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", - "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", - "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", - "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", - "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.7" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz", - "integrity": "sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", - "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", - "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", - "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", - "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", - "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", - "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@electron-internal/extract-zip": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@electron-internal/extract-zip/-/extract-zip-1.0.4.tgz", - "integrity": "sha512-Zr1Vs7E9tpCNhZHDAbFVXc2gEVCG9RqPDjrno5+bdgB6LRAuvgyMHJut4NCVyYwtAieapMzc3fiQ3CSTi75ARg==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=22.12.0" - } - }, - "node_modules/@electron/get": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-5.0.0.tgz", - "integrity": "sha512-pjoBpru1KdEtcExBnuHAP1cAc/5faoedw0hzJkL3o4/IJp7HNF1+fbrdxT3gMYRX2oJfvnA/WXeCTVQpYYxyJA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "env-paths": "^3.0.0", - "graceful-fs": "^4.2.11", - "progress": "^2.0.3", - "semver": "^7.6.3", - "sumchecker": "^3.0.1" - }, - "engines": { - "node": ">=22.12.0" - }, - "optionalDependencies": { - "undici": "^7.24.4" - } - }, - "node_modules/@electron/get/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@mediapipe/tasks-vision": { - "version": "0.10.17", - "resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.17.tgz", - "integrity": "sha512-CZWV/q6TTe8ta61cZXjfnnHsfWIdFhms03M9T7Cnd5y2mdpylJM0rF1qRq+wsQVRMLz1OYPVEBU9ph2Bx8cxrg==", - "license": "Apache-2.0" - }, - "node_modules/@monogrid/gainmap-js": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@monogrid/gainmap-js/-/gainmap-js-3.4.0.tgz", - "integrity": "sha512-2Z0FATFHaoYJ8b+Y4y4Hgfn3FRFwuU5zRrk+9dFWp4uGAdHGqVEdP7HP+gLA3X469KXHmfupJaUbKo1b/aDKIg==", - "license": "MIT", - "dependencies": { - "promise-worker-transferable": "^1.0.4" - }, - "peerDependencies": { - "three": ">= 0.159.0" - } - }, - "node_modules/@pixiv/three-vrm": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@pixiv/three-vrm/-/three-vrm-3.5.4.tgz", - "integrity": "sha512-hY0MnmKVLUebFR9QN9vCRXo0rZmLpxjLVZAupQv5qDDGCKZuNxlOts9PqTkWlzhkMLLdhB48AF+P4PCy/DFOzA==", - "license": "MIT", - "dependencies": { - "@pixiv/three-vrm-core": "3.5.4", - "@pixiv/three-vrm-materials-hdr-emissive-multiplier": "3.5.4", - "@pixiv/three-vrm-materials-mtoon": "3.5.4", - "@pixiv/three-vrm-materials-v0compat": "3.5.4", - "@pixiv/three-vrm-node-constraint": "3.5.4", - "@pixiv/three-vrm-springbone": "3.5.4" - }, - "peerDependencies": { - "three": ">=0.137" - } - }, - "node_modules/@pixiv/three-vrm-animation": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@pixiv/three-vrm-animation/-/three-vrm-animation-3.5.4.tgz", - "integrity": "sha512-yVJL7LoVwZ0fsW2SJhfa0bqIMcfTzBKyc1q/LeKqAtEv63BEQ9VUudx5ikd4zIkgvXwjxw7vGl2zvedrexFisg==", - "license": "MIT", - "dependencies": { - "@pixiv/three-vrm-core": "3.5.4", - "@pixiv/types-vrmc-vrm-1.0": "3.5.4", - "@pixiv/types-vrmc-vrm-animation-1.0": "3.5.4" - }, - "peerDependencies": { - "three": ">=0.137" - } - }, - "node_modules/@pixiv/three-vrm-core": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@pixiv/three-vrm-core/-/three-vrm-core-3.5.4.tgz", - "integrity": "sha512-CgaxZ4qX6JmE2oKsOVGGlheT011qP4bBZGUaMJJ5iQINI999+cveIdISe459B+AMYD1dU5h1+xCtDthLQNH1Bg==", - "license": "MIT", - "dependencies": { - "@pixiv/types-vrm-0.0": "3.5.4", - "@pixiv/types-vrmc-vrm-1.0": "3.5.4" - }, - "peerDependencies": { - "three": ">=0.137" - } - }, - "node_modules/@pixiv/three-vrm-materials-hdr-emissive-multiplier": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@pixiv/three-vrm-materials-hdr-emissive-multiplier/-/three-vrm-materials-hdr-emissive-multiplier-3.5.4.tgz", - "integrity": "sha512-3BPZ42qW38cHhP+imqEnqTFsltvYkHA/t4VzWFdQ9sngWt0NiFAOotEsv8gZn1ZgKE9VRQezXne6s5aRWQlQqA==", - "license": "MIT", - "dependencies": { - "@pixiv/types-vrmc-materials-hdr-emissive-multiplier-1.0": "3.5.4" - }, - "peerDependencies": { - "three": ">=0.137" - } - }, - "node_modules/@pixiv/three-vrm-materials-mtoon": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@pixiv/three-vrm-materials-mtoon/-/three-vrm-materials-mtoon-3.5.4.tgz", - "integrity": "sha512-vLHt7IYZxlijbCMa5TRRf6gaQjA65F/d7oZBNfZW3XC8sBg57ZV0M/xBAJm2d6UwVmTbBd9NG9li/Y9yuupDQw==", - "license": "MIT", - "dependencies": { - "@pixiv/types-vrm-0.0": "3.5.4", - "@pixiv/types-vrmc-materials-mtoon-1.0": "3.5.4" - }, - "peerDependencies": { - "three": ">=0.137" - } - }, - "node_modules/@pixiv/three-vrm-materials-v0compat": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@pixiv/three-vrm-materials-v0compat/-/three-vrm-materials-v0compat-3.5.4.tgz", - "integrity": "sha512-qRRtg8vYFBRJpsa3evruWqmXr0Gwd8uJXwxxUKuKtrIN0Hw0hJsRLHkg9E238Q8xRTnoycdkSgX4VvVknvtXBA==", - "license": "MIT", - "dependencies": { - "@pixiv/types-vrm-0.0": "3.5.4", - "@pixiv/types-vrmc-materials-mtoon-1.0": "3.5.4" - }, - "peerDependencies": { - "three": ">=0.137" - } - }, - "node_modules/@pixiv/three-vrm-node-constraint": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@pixiv/three-vrm-node-constraint/-/three-vrm-node-constraint-3.5.4.tgz", - "integrity": "sha512-nyAghDrYNp0Z2siEaY2+th+FzZdDs9EJy8K576Mpw9cy3jwtCJuTHBQmGzKkrgoLaBfrso+3Tdfgr62AJV0m1w==", - "license": "MIT", - "dependencies": { - "@pixiv/types-vrmc-node-constraint-1.0": "3.5.4" - }, - "peerDependencies": { - "three": ">=0.137" - } - }, - "node_modules/@pixiv/three-vrm-springbone": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@pixiv/three-vrm-springbone/-/three-vrm-springbone-3.5.4.tgz", - "integrity": "sha512-8KWA7vHU+OnW6XcZPnDuUrjjPFRzmv2yxcTMNCYQvBS547/Iqo0RLbQvpO/ppceLTNJFY2TGXAWJU67aeazWjw==", - "license": "MIT", - "dependencies": { - "@pixiv/types-vrm-0.0": "3.5.4", - "@pixiv/types-vrmc-springbone-1.0": "3.5.4", - "@pixiv/types-vrmc-springbone-extended-collider-1.0": "3.5.4" - }, - "peerDependencies": { - "three": ">=0.137" - } - }, - "node_modules/@pixiv/types-vrm-0.0": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@pixiv/types-vrm-0.0/-/types-vrm-0.0-3.5.4.tgz", - "integrity": "sha512-g9VMPikJxKJ/XgnhXxnqj6ejVhQ9WwOEUp7KyyZHsqRnHcQfSqyZFTs9wkAMCbwCqHXX/lg9+9Ogj8KhxCkbXw==", - "license": "MIT" - }, - "node_modules/@pixiv/types-vrmc-materials-hdr-emissive-multiplier-1.0": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@pixiv/types-vrmc-materials-hdr-emissive-multiplier-1.0/-/types-vrmc-materials-hdr-emissive-multiplier-1.0-3.5.4.tgz", - "integrity": "sha512-h9GEQ3q1VTylL/P40kJ8uoQhfUYY54NhTG6Xsnl4X0jf7oHh8MKXYnMMn903hXml6082Yjx1C6x3DKckdnophg==", - "license": "MIT" - }, - "node_modules/@pixiv/types-vrmc-materials-mtoon-1.0": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@pixiv/types-vrmc-materials-mtoon-1.0/-/types-vrmc-materials-mtoon-1.0-3.5.4.tgz", - "integrity": "sha512-AU5sOcsbmcnzRPfgfk7fzKhk5lNm2MqrbvtAsSlhylVMdlzrmXqIfRuexABcB9k+ysTp49qIFioot9KRlQcDUw==", - "license": "MIT" - }, - "node_modules/@pixiv/types-vrmc-node-constraint-1.0": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@pixiv/types-vrmc-node-constraint-1.0/-/types-vrmc-node-constraint-1.0-3.5.4.tgz", - "integrity": "sha512-RRbK5NNvZv4ewRELezueCiDB11FGkt4pdZR/UJ027DJPaNzd6rls2OEJ8weQ3OmgHZpbx/BtdpX2JWX5WZZd/Q==", - "license": "MIT" - }, - "node_modules/@pixiv/types-vrmc-springbone-1.0": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@pixiv/types-vrmc-springbone-1.0/-/types-vrmc-springbone-1.0-3.5.4.tgz", - "integrity": "sha512-NO7HTRBuWEe89Wo9BRI5hX1kWVkZzA4YWg9XALSTLdIT8HMiArL4NRse/CF91jNuLcTGfPEWlBJyq9SciAQxAg==", - "license": "MIT" - }, - "node_modules/@pixiv/types-vrmc-springbone-extended-collider-1.0": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@pixiv/types-vrmc-springbone-extended-collider-1.0/-/types-vrmc-springbone-extended-collider-1.0-3.5.4.tgz", - "integrity": "sha512-uzJmcRh/iHYnZPtnq6N1+jb+T/ptYNCyFEoArkWGNXHSfPjTkMcheTQkL5iMNvTE6hqhyMRVMha9OmbvyLmmUQ==", - "license": "MIT" - }, - "node_modules/@pixiv/types-vrmc-vrm-1.0": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@pixiv/types-vrmc-vrm-1.0/-/types-vrmc-vrm-1.0-3.5.4.tgz", - "integrity": "sha512-pkjT4QXT/Hp6rcq8J8EFEHIldbtPGYWOTaWdoRGMA8/KzJI5PdekZ6AUYbnSP6ElfJ3BSZ01DxxpQZa/UNsFqA==", - "license": "MIT" - }, - "node_modules/@pixiv/types-vrmc-vrm-animation-1.0": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@pixiv/types-vrmc-vrm-animation-1.0/-/types-vrmc-vrm-animation-1.0-3.5.4.tgz", - "integrity": "sha512-qIl/RO+WnWcBlu/PdTpPtm+YRum8RNtNNigndd/V9dJ9mWeFVI6TThc5i+qbFQjTF/I5ka0HojfeujesIYc1IA==", - "license": "MIT", - "dependencies": { - "@pixiv/types-vrmc-vrm-1.0": "3.5.4" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", - "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", - "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", - "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz", - "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==", - "license": "BSD-3-Clause" - }, - "node_modules/@react-spring/animated": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.5.tgz", - "integrity": "sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==", - "license": "MIT", - "dependencies": { - "@react-spring/shared": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/core": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.5.tgz", - "integrity": "sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==", - "license": "MIT", - "dependencies": { - "@react-spring/animated": "~9.7.5", - "@react-spring/shared": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-spring/donate" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/rafz": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.5.tgz", - "integrity": "sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==", - "license": "MIT" - }, - "node_modules/@react-spring/shared": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.5.tgz", - "integrity": "sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==", - "license": "MIT", - "dependencies": { - "@react-spring/rafz": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/three": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/three/-/three-9.7.5.tgz", - "integrity": "sha512-RxIsCoQfUqOS3POmhVHa1wdWS0wyHAUway73uRLp3GAL5U2iYVNdnzQsep6M2NZ994BlW8TcKuMtQHUqOsy6WA==", - "license": "MIT", - "dependencies": { - "@react-spring/animated": "~9.7.5", - "@react-spring/core": "~9.7.5", - "@react-spring/shared": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "peerDependencies": { - "@react-three/fiber": ">=6.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "three": ">=0.126" - } - }, - "node_modules/@react-spring/types": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.5.tgz", - "integrity": "sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==", - "license": "MIT" - }, - "node_modules/@react-three/drei": { - "version": "9.122.0", - "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-9.122.0.tgz", - "integrity": "sha512-SEO/F/rBCTjlLez7WAlpys+iGe9hty4rNgjZvgkQeXFSiwqD4Hbk/wNHMAbdd8vprO2Aj81mihv4dF5bC7D0CA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.26.0", - "@mediapipe/tasks-vision": "0.10.17", - "@monogrid/gainmap-js": "^3.0.6", - "@react-spring/three": "~9.7.5", - "@use-gesture/react": "^10.3.1", - "camera-controls": "^2.9.0", - "cross-env": "^7.0.3", - "detect-gpu": "^5.0.56", - "glsl-noise": "^0.0.0", - "hls.js": "^1.5.17", - "maath": "^0.10.8", - "meshline": "^3.3.1", - "react-composer": "^5.0.3", - "stats-gl": "^2.2.8", - "stats.js": "^0.17.0", - "suspend-react": "^0.1.3", - "three-mesh-bvh": "^0.7.8", - "three-stdlib": "^2.35.6", - "troika-three-text": "^0.52.0", - "tunnel-rat": "^0.1.2", - "utility-types": "^3.11.0", - "zustand": "^5.0.1" - }, - "peerDependencies": { - "@react-three/fiber": "^8", - "react": "^18", - "react-dom": "^18", - "three": ">=0.137" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/@react-three/fiber": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.18.0.tgz", - "integrity": "sha512-FYZZqD0UUHUswKz3LQl2Z7H24AhD14XGTsIRw3SJaXUxyfVMi+1yiZGmqTcPt/CkPpdU7rrxqcyQ1zJE5DjvIQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@types/react-reconciler": "^0.26.7", - "@types/webxr": "*", - "base64-js": "^1.5.1", - "buffer": "^6.0.3", - "its-fine": "^1.0.6", - "react-reconciler": "^0.27.0", - "react-use-measure": "^2.1.7", - "scheduler": "^0.21.0", - "suspend-react": "^0.1.3", - "zustand": "^3.7.1" - }, - "peerDependencies": { - "expo": ">=43.0", - "expo-asset": ">=8.4", - "expo-file-system": ">=11.0", - "expo-gl": ">=11.0", - "react": ">=18 <19", - "react-dom": ">=18 <19", - "react-native": ">=0.64", - "three": ">=0.133" - }, - "peerDependenciesMeta": { - "expo": { - "optional": true - }, - "expo-asset": { - "optional": true - }, - "expo-file-system": { - "optional": true - }, - "expo-gl": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/@react-three/fiber/node_modules/zustand": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", - "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", - "license": "MIT", - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - } - } - }, - "node_modules/@ricky0123/vad-web": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@ricky0123/vad-web/-/vad-web-0.0.30.tgz", - "integrity": "sha512-cJyYrh4YeeUBJcbR9Bic/bFDyB9qBkAepvpuWM3vLxnAi7bC3VHzf51UeNdT+OtY4D7MLAgV8iJMc4z41ZnaWg==", - "license": "ISC", - "dependencies": { - "onnxruntime-web": "^1.17.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.27", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", - "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", - "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz", - "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz", - "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz", - "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", - "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", - "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", - "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", - "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", - "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", - "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", - "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", - "cpu": [ - "loong64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", - "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", - "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", - "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", - "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", - "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", - "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", - "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", - "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", - "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", - "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", - "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", - "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", - "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", - "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@tweenjs/tween.js": { - "version": "23.1.3", - "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", - "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==", - "license": "MIT" - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/@types/debug": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", - "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/draco3d": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.10.tgz", - "integrity": "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==", - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "license": "MIT" - }, - "node_modules/@types/estree-jsx": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", - "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", - "license": "MIT", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "24.13.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.2.tgz", - "integrity": "sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==", - "license": "MIT", - "dependencies": { - "undici-types": "~7.18.0" - } - }, - "node_modules/@types/offscreencanvas": { - "version": "2019.7.3", - "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", - "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", - "license": "MIT" - }, - "node_modules/@types/prop-types": { - "version": "15.7.15", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.3.31", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.31.tgz", - "integrity": "sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==", - "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.3.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", - "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^18.0.0" - } - }, - "node_modules/@types/react-reconciler": { - "version": "0.26.7", - "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.26.7.tgz", - "integrity": "sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==", - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/stats.js": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.4.tgz", - "integrity": "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==", - "license": "MIT" - }, - "node_modules/@types/three": { - "version": "0.169.0", - "resolved": "https://registry.npmjs.org/@types/three/-/three-0.169.0.tgz", - "integrity": "sha512-oan7qCgJBt03wIaK+4xPWclYRPG9wzcg7Z2f5T8xYTNEF95kh0t0lklxLLYBDo7gQiGLYzE6iF4ta7nXF2bcsw==", - "license": "MIT", - "dependencies": { - "@tweenjs/tween.js": "~23.1.3", - "@types/stats.js": "*", - "@types/webxr": "*", - "@webgpu/types": "*", - "fflate": "~0.8.2", - "meshoptimizer": "~0.18.1" - } - }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "license": "MIT" - }, - "node_modules/@types/webxr": { - "version": "0.5.24", - "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.24.tgz", - "integrity": "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==", - "license": "MIT" - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.2.tgz", - "integrity": "sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA==", - "license": "ISC" - }, - "node_modules/@use-gesture/core": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz", - "integrity": "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==", - "license": "MIT" - }, - "node_modules/@use-gesture/react": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.1.tgz", - "integrity": "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==", - "license": "MIT", - "dependencies": { - "@use-gesture/core": "10.3.1" - }, - "peerDependencies": { - "react": ">= 16.8.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", - "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.28.0", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.27", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.17.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" - } - }, - "node_modules/@webgpu/types": { - "version": "0.1.71", - "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.71.tgz", - "integrity": "sha512-mMy8/ODcKhab808co15eW+yN+HgXoQxRQHTiBV9Mrvl1r0ufnid7YOcI+gi4eUWSWl9ezD6TW2KXccrL8HCh2A==", - "license": "BSD-3-Clause" - }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/baseline-browser-mapping": { - "version": "2.10.40", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.40.tgz", - "integrity": "sha512-BSSLZ9/Cjjv7Gtj5B68ZzXcXUg8iOf3fme+FCuh8rC/Go+Kmh8cox7M3A8dolou16s64QjLPOSdngh7GxXvkSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/bidi-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", - "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", - "license": "MIT", - "dependencies": { - "require-from-string": "^2.0.2" - } - }, - "node_modules/browserslist": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.4.tgz", - "integrity": "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.10.38", - "caniuse-lite": "^1.0.30001799", - "electron-to-chromium": "^1.5.376", - "node-releases": "^2.0.48", - "update-browserslist-db": "^1.2.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/camera-controls": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-2.10.1.tgz", - "integrity": "sha512-KnaKdcvkBJ1Irbrzl8XD6WtZltkRjp869Jx8c0ujs9K+9WD+1D7ryBsCiVqJYUqt6i/HR5FxT7RLASieUD+Q5w==", - "license": "MIT", - "peerDependencies": { - "three": ">=0.126.1" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001799", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", - "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decode-named-character-reference": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", - "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", - "license": "MIT", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/detect-gpu": { - "version": "5.0.70", - "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.70.tgz", - "integrity": "sha512-bqerEP1Ese6nt3rFkwPnGbsUF9a4q+gMmpTVVOEzoCyeCc+y7/RvJnQZJx1JwhgQI5Ntg0Kgat8Uu7XpBqnz1w==", - "license": "MIT", - "dependencies": { - "webgl-constants": "^1.1.1" - } - }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/draco3d": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz", - "integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==", - "license": "Apache-2.0" - }, - "node_modules/electron": { - "version": "43.0.0", - "resolved": "https://registry.npmjs.org/electron/-/electron-43.0.0.tgz", - "integrity": "sha512-PV60GsWU6qufhuOhw3n+Yix3WPDcqDtBqE8orbEQGQGHEkgp9o/JCPgb7L4vIL0r1HnfPdqSRtboOTqbDkcFDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@electron-internal/extract-zip": "^1.0.1", - "@electron/get": "^5.0.0", - "@types/node": "^24.9.0" - }, - "bin": { - "electron": "cli.js", - "install-electron": "install.js" - }, - "engines": { - "node": ">= 22.12.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.380", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.380.tgz", - "integrity": "sha512-W6d5AbuEoRayO447cqrg6lKJIlscgRnnxOZl/08kfV71BQDoEBC7Wwis68z87LjyK6f4kWyTaubuDbhHKrZkbA==", - "dev": true, - "license": "ISC" - }, - "node_modules/electron-vite": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/electron-vite/-/electron-vite-3.1.0.tgz", - "integrity": "sha512-M7aAzaRvSl5VO+6KN4neJCYLHLpF/iWo5ztchI/+wMxIieDZQqpbCYfaEHHHPH6eupEzfvZdLYdPdmvGqoVe0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.26.10", - "@babel/plugin-transform-arrow-functions": "^7.25.9", - "cac": "^6.7.14", - "esbuild": "^0.25.1", - "magic-string": "^0.30.17", - "picocolors": "^1.1.1" - }, - "bin": { - "electron-vite": "bin/electron-vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "@swc/core": "^1.0.0", - "vite": "^4.0.0 || ^5.0.0 || ^6.0.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - } - } - }, - "node_modules/env-paths": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", - "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/estree-util-is-identifier-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", - "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT" - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/fflate": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.3.tgz", - "integrity": "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==", - "license": "MIT" - }, - "node_modules/flatbuffers": { - "version": "25.9.23", - "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-25.9.23.tgz", - "integrity": "sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ==", - "license": "Apache-2.0" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/glsl-noise": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/glsl-noise/-/glsl-noise-0.0.0.tgz", - "integrity": "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==", - "license": "MIT" - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/guid-typescript": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz", - "integrity": "sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==", - "license": "ISC" - }, - "node_modules/hast-util-to-jsx-runtime": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", - "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-js": "^1.0.0", - "unist-util-position": "^5.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hls.js": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.6.16.tgz", - "integrity": "sha512-VSIRpLfRwlAAdGL4wiTucx2ScRipo0ed1FBatWkyt832jC4CReKstga6yIhYVwGu9LOBjuX9wzmRMeQdBJtzEA==", - "license": "Apache-2.0" - }, - "node_modules/html-url-attributes": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", - "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "license": "MIT" - }, - "node_modules/inline-style-parser": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", - "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", - "license": "MIT" - }, - "node_modules/is-alphabetical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", - "license": "MIT", - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-hexadecimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/its-fine": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.2.5.tgz", - "integrity": "sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==", - "license": "MIT", - "dependencies": { - "@types/react-reconciler": "^0.28.0" - }, - "peerDependencies": { - "react": ">=18.0" - } - }, - "node_modules/its-fine/node_modules/@types/react-reconciler": { - "version": "0.28.9", - "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.9.tgz", - "integrity": "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "license": "MIT", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/long": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", - "license": "Apache-2.0" - }, - "node_modules/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/maath": { - "version": "0.10.8", - "resolved": "https://registry.npmjs.org/maath/-/maath-0.10.8.tgz", - "integrity": "sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g==", - "license": "MIT", - "peerDependencies": { - "@types/three": ">=0.134.0", - "three": ">=0.134.0" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/markdown-table": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", - "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/mdast-util-find-and-replace": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", - "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mdast-util-from-markdown": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", - "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", - "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", - "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-gfm-autolink-literal": "^2.0.0", - "mdast-util-gfm-footnote": "^2.0.0", - "mdast-util-gfm-strikethrough": "^2.0.0", - "mdast-util-gfm-table": "^2.0.0", - "mdast-util-gfm-task-list-item": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-autolink-literal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", - "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "ccount": "^2.0.0", - "devlop": "^1.0.0", - "mdast-util-find-and-replace": "^3.0.0", - "micromark-util-character": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-strikethrough": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", - "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-task-list-item": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", - "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-expression": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", - "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-jsx": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", - "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdxjs-esm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", - "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-phrasing": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", - "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", - "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/meshline": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/meshline/-/meshline-3.3.1.tgz", - "integrity": "sha512-/TQj+JdZkeSUOl5Mk2J7eLcYTLiQm2IDzmlSvYm7ov15anEcDJ92GHqqazxTSreeNgfnYu24kiEvvv0WlbCdFQ==", - "license": "MIT", - "peerDependencies": { - "three": ">=0.137" - } - }, - "node_modules/meshoptimizer": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.18.1.tgz", - "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==", - "license": "MIT" - }, - "node_modules/micromark": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", - "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", - "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", - "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", - "license": "MIT", - "dependencies": { - "micromark-extension-gfm-autolink-literal": "^2.0.0", - "micromark-extension-gfm-footnote": "^2.0.0", - "micromark-extension-gfm-strikethrough": "^2.0.0", - "micromark-extension-gfm-table": "^2.0.0", - "micromark-extension-gfm-tagfilter": "^2.0.0", - "micromark-extension-gfm-task-list-item": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", - "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-strikethrough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", - "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", - "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-tagfilter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", - "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-task-list-item": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", - "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-factory-destination": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", - "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", - "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", - "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", - "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", - "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", - "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", - "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", - "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-string": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", - "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", - "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", - "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", - "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-subtokenize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", - "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.15", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", - "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/node-releases": { - "version": "2.0.50", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.50.tgz", - "integrity": "sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/onnxruntime-common": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.27.0.tgz", - "integrity": "sha512-3KxL5wIVqa8Ex08jxSzncm9CMgw8CjOFyOQ7SxvG9o0cVLlhTNKXyIQuTbtX4tGPJEf73OER2xrjt4HJSBL4ow==", - "license": "MIT" - }, - "node_modules/onnxruntime-web": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.27.0.tgz", - "integrity": "sha512-ogDLsqIozHZwifPuN37OproAo0byX6t43/bP8GzeZWBWD6MOGExswFAx3up4NS/vvWBOg2u2PXomDt3rMmdQSg==", - "license": "MIT", - "dependencies": { - "flatbuffers": "^25.1.24", - "guid-typescript": "^1.0.9", - "long": "^5.2.3", - "onnxruntime-common": "1.27.0", - "platform": "^1.3.6", - "protobufjs": "^7.2.4" - } - }, - "node_modules/parse-entities": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", - "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "license": "MIT" - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/platform": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", - "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", - "license": "MIT" - }, - "node_modules/postcss": { - "version": "8.5.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.12", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/potpack": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", - "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==", - "license": "ISC" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise-worker-transferable": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/promise-worker-transferable/-/promise-worker-transferable-1.0.4.tgz", - "integrity": "sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==", - "license": "Apache-2.0", - "dependencies": { - "is-promise": "^2.1.0", - "lie": "^3.0.2" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/property-information": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", - "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/protobufjs": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.4.tgz", - "integrity": "sha512-RJJPTTpvFfHcWLkIa2JFWK4XvtSzS0yEWDmunqHXli1h3JlkbcQZXDZdcWxv+JK3Xsl5/UFDPZ0iGm7DAengYw==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.5", - "@protobufjs/eventemitter": "^1.1.1", - "@protobufjs/fetch": "^1.1.1", - "@protobufjs/float": "^1.0.2", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.1", - "@types/node": ">=13.7.0", - "long": "^5.3.2" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-composer": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/react-composer/-/react-composer-5.0.3.tgz", - "integrity": "sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA==", - "license": "MIT", - "dependencies": { - "prop-types": "^15.6.0" - }, - "peerDependencies": { - "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-dom/node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/react-markdown": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.1.0.tgz", - "integrity": "sha512-xaijuJB0kzGiUdG7nc2MOMDUDBWPyGAjZtUrow9XxUeua8IqeP+VlIfAZ3bphpcLTnSZXz6z9jcVC/TCwbfgdw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "hast-util-to-jsx-runtime": "^2.0.0", - "html-url-attributes": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "unified": "^11.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=18", - "react": ">=18" - } - }, - "node_modules/react-reconciler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.27.0.tgz", - "integrity": "sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.21.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "react": "^18.0.0" - } - }, - "node_modules/react-refresh": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", - "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-use-measure": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.7.tgz", - "integrity": "sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg==", - "license": "MIT", - "peerDependencies": { - "react": ">=16.13", - "react-dom": ">=16.13" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/remark-gfm": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", - "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-gfm": "^3.0.0", - "micromark-extension-gfm": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-rehype": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", - "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "mdast-util-to-hast": "^13.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", - "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-to-markdown": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/rollup": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", - "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.9" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.62.2", - "@rollup/rollup-android-arm64": "4.62.2", - "@rollup/rollup-darwin-arm64": "4.62.2", - "@rollup/rollup-darwin-x64": "4.62.2", - "@rollup/rollup-freebsd-arm64": "4.62.2", - "@rollup/rollup-freebsd-x64": "4.62.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", - "@rollup/rollup-linux-arm-musleabihf": "4.62.2", - "@rollup/rollup-linux-arm64-gnu": "4.62.2", - "@rollup/rollup-linux-arm64-musl": "4.62.2", - "@rollup/rollup-linux-loong64-gnu": "4.62.2", - "@rollup/rollup-linux-loong64-musl": "4.62.2", - "@rollup/rollup-linux-ppc64-gnu": "4.62.2", - "@rollup/rollup-linux-ppc64-musl": "4.62.2", - "@rollup/rollup-linux-riscv64-gnu": "4.62.2", - "@rollup/rollup-linux-riscv64-musl": "4.62.2", - "@rollup/rollup-linux-s390x-gnu": "4.62.2", - "@rollup/rollup-linux-x64-gnu": "4.62.2", - "@rollup/rollup-linux-x64-musl": "4.62.2", - "@rollup/rollup-openbsd-x64": "4.62.2", - "@rollup/rollup-openharmony-arm64": "4.62.2", - "@rollup/rollup-win32-arm64-msvc": "4.62.2", - "@rollup/rollup-win32-ia32-msvc": "4.62.2", - "@rollup/rollup-win32-x64-gnu": "4.62.2", - "@rollup/rollup-win32-x64-msvc": "4.62.2", - "fsevents": "~2.3.2" - } - }, - "node_modules/scheduler": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", - "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/stats-gl": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/stats-gl/-/stats-gl-2.4.2.tgz", - "integrity": "sha512-g5O9B0hm9CvnM36+v7SFl39T7hmAlv541tU81ME8YeSb3i1CIP5/QdDeSB3A0la0bKNHpxpwxOVRo2wFTYEosQ==", - "license": "MIT", - "dependencies": { - "@types/three": "*", - "three": "^0.170.0" - }, - "peerDependencies": { - "@types/three": "*", - "three": "*" - } - }, - "node_modules/stats-gl/node_modules/three": { - "version": "0.170.0", - "resolved": "https://registry.npmjs.org/three/-/three-0.170.0.tgz", - "integrity": "sha512-FQK+LEpYc0fBD+J8g6oSEyyNzjp+Q7Ks1C568WWaoMRLW+TkNNWmenWeGgJjV105Gd+p/2ql1ZcjYvNiPZBhuQ==", - "license": "MIT" - }, - "node_modules/stats.js": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz", - "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==", - "license": "MIT" - }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", - "license": "MIT", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/style-to-js": { - "version": "1.1.21", - "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", - "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", - "license": "MIT", - "dependencies": { - "style-to-object": "1.0.14" - } - }, - "node_modules/style-to-object": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", - "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", - "license": "MIT", - "dependencies": { - "inline-style-parser": "0.2.7" - } - }, - "node_modules/sumchecker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", - "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "debug": "^4.1.0" - }, - "engines": { - "node": ">= 8.0" - } - }, - "node_modules/suspend-react": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.1.3.tgz", - "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==", - "license": "MIT", - "peerDependencies": { - "react": ">=17.0" - } - }, - "node_modules/three": { - "version": "0.169.0", - "resolved": "https://registry.npmjs.org/three/-/three-0.169.0.tgz", - "integrity": "sha512-Ed906MA3dR4TS5riErd4QBsRGPcx+HBDX2O5yYE5GqJeFQTPU+M56Va/f/Oph9X7uZo3W3o4l2ZhBZ6f6qUv0w==", - "license": "MIT" - }, - "node_modules/three-mesh-bvh": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.7.8.tgz", - "integrity": "sha512-BGEZTOIC14U0XIRw3tO4jY7IjP7n7v24nv9JXS1CyeVRWOCkcOMhRnmENUjuV39gktAw4Ofhr0OvIAiTspQrrw==", - "deprecated": "Deprecated due to three.js version incompatibility. Please use v0.8.0, instead.", - "license": "MIT", - "peerDependencies": { - "three": ">= 0.151.0" - } - }, - "node_modules/three-stdlib": { - "version": "2.36.1", - "resolved": "https://registry.npmjs.org/three-stdlib/-/three-stdlib-2.36.1.tgz", - "integrity": "sha512-XyGQrFmNQ5O/IoKm556ftwKsBg11TIb301MB5dWNicziQBEs2g3gtOYIf7pFiLa0zI2gUwhtCjv9fmjnxKZ1Cg==", - "license": "MIT", - "dependencies": { - "@types/draco3d": "^1.4.0", - "@types/offscreencanvas": "^2019.6.4", - "@types/webxr": "^0.5.2", - "draco3d": "^1.4.1", - "fflate": "^0.6.9", - "potpack": "^1.0.1" - }, - "peerDependencies": { - "three": ">=0.128.0" - } - }, - "node_modules/three-stdlib/node_modules/fflate": { - "version": "0.6.10", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz", - "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==", - "license": "MIT" - }, - "node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/troika-three-text": { - "version": "0.52.4", - "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.52.4.tgz", - "integrity": "sha512-V50EwcYGruV5rUZ9F4aNsrytGdKcXKALjEtQXIOBfhVoZU9VAqZNIoGQ3TMiooVqFAbR1w15T+f+8gkzoFzawg==", - "license": "MIT", - "dependencies": { - "bidi-js": "^1.0.2", - "troika-three-utils": "^0.52.4", - "troika-worker-utils": "^0.52.0", - "webgl-sdf-generator": "1.1.1" - }, - "peerDependencies": { - "three": ">=0.125.0" - } - }, - "node_modules/troika-three-utils": { - "version": "0.52.4", - "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.52.4.tgz", - "integrity": "sha512-NORAStSVa/BDiG52Mfudk4j1FG4jC4ILutB3foPnfGbOeIs9+G5vZLa0pnmnaftZUGm4UwSoqEpWdqvC7zms3A==", - "license": "MIT", - "peerDependencies": { - "three": ">=0.125.0" - } - }, - "node_modules/troika-worker-utils": { - "version": "0.52.0", - "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.52.0.tgz", - "integrity": "sha512-W1CpvTHykaPH5brv5VHLfQo9D1OYuo0cSBEUQFFT/nBUzM8iD6Lq2/tgG/f1OelbAS1WtaTPQzE5uM49egnngw==", - "license": "MIT" - }, - "node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/tunnel-rat": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/tunnel-rat/-/tunnel-rat-0.1.2.tgz", - "integrity": "sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==", - "license": "MIT", - "dependencies": { - "zustand": "^4.3.2" - } - }, - "node_modules/tunnel-rat/node_modules/zustand": { - "version": "4.5.7", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.7.tgz", - "integrity": "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==", - "license": "MIT", - "dependencies": { - "use-sync-external-store": "^1.2.2" - }, - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "@types/react": ">=16.8", - "immer": ">=9.0.6", - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true - } - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz", - "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=20.18.1" - } - }, - "node_modules/undici-types": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", - "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", - "license": "MIT" - }, - "node_modules/unified": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-is": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", - "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", - "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", - "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/use-sync-external-store": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", - "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/utility-types": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", - "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", - "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vite": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", - "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/webgl-constants": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/webgl-constants/-/webgl-constants-1.1.1.tgz", - "integrity": "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==" - }, - "node_modules/webgl-sdf-generator": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/webgl-sdf-generator/-/webgl-sdf-generator-1.1.1.tgz", - "integrity": "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==", - "license": "MIT" - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/zustand": { - "version": "5.0.14", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.14.tgz", - "integrity": "sha512-/8tAspM5LMPr28b3fwLYrtdj77ECpfZviaP75CMTnwO8ISyaE4GDIG/9rDDYq/cH9D2Xw2A2RXglLInmVBQB/g==", - "license": "MIT", - "engines": { - "node": ">=12.20.0" - }, - "peerDependencies": { - "@types/react": ">=18.0.0", - "immer": ">=9.0.6", - "react": ">=18.0.0", - "use-sync-external-store": ">=1.2.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true - }, - "use-sync-external-store": { - "optional": true - } - } - }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - } - } -} diff --git a/client/lucy-desktop/package.json b/client/lucy-desktop/package.json deleted file mode 100644 index 5e9bdc8..0000000 --- a/client/lucy-desktop/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "lucy-desktop", - "version": "0.1.0", - "description": "Lucy — lokaler Sprach-Companion (Hermes-Hirn auf der Box, lokale Stimme auf der 9070 XT)", - "main": "out/main/index.js", - "type": "module", - "scripts": { - "dev": "electron-vite dev", - "build": "electron-vite build", - "preview": "electron-vite preview", - "postinstall": "node scripts/copy-vad-assets.mjs" - }, - "dependencies": { - "@pixiv/three-vrm": "^3.4.0", - "@pixiv/three-vrm-animation": "^3.5.4", - "@react-three/drei": "^9.114.0", - "@react-three/fiber": "^8.17.10", - "@ricky0123/vad-web": "^0.0.30", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-markdown": "^9.1.0", - "remark-gfm": "^4.0.1", - "three": "^0.169.0" - }, - "devDependencies": { - "@types/react": "^18.3.12", - "@types/react-dom": "^18.3.1", - "@types/three": "^0.169.0", - "@vitejs/plugin-react": "^4.3.4", - "electron": "^43.0.0", - "electron-vite": "^3.0.0", - "typescript": "^5.6.3", - "vite": "^6.0.3" - }, - "allowScripts": { - "electron": true, - "esbuild": true - } -} diff --git a/client/lucy-desktop/scripts/copy-vad-assets.mjs b/client/lucy-desktop/scripts/copy-vad-assets.mjs deleted file mode 100644 index 3b4df3d..0000000 --- a/client/lucy-desktop/scripts/copy-vad-assets.mjs +++ /dev/null @@ -1,23 +0,0 @@ -// Kopiert die Silero-VAD-Assets (Worklet + ONNX-Modell + onnxruntime-WASM) nach public/vad/, -// damit die App sie self-hosted lädt (offlinefähig, kein CDN). Läuft via npm postinstall. -// public/ wird von Vite in Dev UND Build verbatim ausgeliefert -> ein Pfad für beide Welten. -import { copyFileSync, mkdirSync, readdirSync } from "node:fs" -import { dirname, join } from "node:path" -import { fileURLToPath } from "node:url" - -const root = join(dirname(fileURLToPath(import.meta.url)), "..") -const dest = join(root, "src", "renderer", "public", "vad") -mkdirSync(dest, { recursive: true }) - -const jobs = [ - [join(root, "node_modules", "@ricky0123", "vad-web", "dist"), (f) => f === "vad.worklet.bundle.min.js" || f.endsWith(".onnx")], - [join(root, "node_modules", "onnxruntime-web", "dist"), (f) => f.endsWith(".wasm") || f.endsWith(".mjs")], -] - -let n = 0 -for (const [src, match] of jobs) { - for (const f of readdirSync(src)) { - if (match(f)) { copyFileSync(join(src, f), join(dest, f)); n++ } - } -} -console.log(`[vad-assets] ${n} Dateien nach ${dest} kopiert.`) diff --git a/client/lucy-desktop/src/main/index.ts b/client/lucy-desktop/src/main/index.ts deleted file mode 100644 index e892e47..0000000 --- a/client/lucy-desktop/src/main/index.ts +++ /dev/null @@ -1,249 +0,0 @@ -import { app, BrowserWindow, ipcMain, Tray, Menu, globalShortcut, nativeImage, desktopCapturer, shell, screen, session } from "electron" -import { spawn, ChildProcess } from "child_process" -import { join } from "path" - -// Lucy — Main-Prozess. Spawnt die lokale Stimme (pocket-tts, :8130) + verwaltet Fenster/Tray/Hotkey. -// Fenster ist frameless+transparent: eigene Titelleiste im Renderer. Zwei Modi: 'full' (Arbeitsfenster) -// und 'overlay' (kleine schwebende Lucy, always-on-top). pocket-tts ist CPU-kühl -> kein /wake-/sleep. - -const PORT = process.env.LUCY_TTS_PORT || "8130" -const TTS = `http://127.0.0.1:${PORT}` -const TTS_DIR = process.env.LUCY_TTS_DIR || join(app.getAppPath(), "..", "lucy-tts") -const PY = process.env.LUCY_TTS_PY || join(TTS_DIR, "ptts-venv", "Scripts", "python.exe") -const HOTKEY = process.env.LUCY_HOTKEY || "CommandOrControl+Shift+Space" - -const FULL_SIZE = { width: 1100, height: 720 } -const OVERLAY_SIZE = { width: 360, height: 480 } - -let win: BrowserWindow | null = null -let tray: Tray | null = null -let ttsProc: ChildProcess | null = null -let mode: "full" | "overlay" = "full" -let pinned = false -let cursorTimer: ReturnType | null = null - -// MateEngine-Idee: Lucy folgt dem Mauszeiger. Der Zeiger ist auch AUSSERHALB des Fensters (Geistmodus), -// daher global pollen (screen.getCursorScreenPoint) und die Richtung relativ zu Lucys Kopf an den Renderer geben. -function startCursorTracking() { - if (cursorTimer) return - cursorTimer = setInterval(() => { - if (!win || win.isDestroyed() || !win.isVisible()) return - const b = win.getBounds() - const p = screen.getCursorScreenPoint() - const cx = b.x + b.width / 2 - const cy = b.y + b.height * 0.38 // ungefaehre Kopfhoehe im Fenster - win.webContents.send("lucy:cursor", { x: (p.x - cx) / Math.max(1, b.width), y: (p.y - cy) / Math.max(1, b.height) }) - // Auto-Ducken: im Overlay nach Nicht-Naehe an den Rand; bei Annaeherung an den Rest hervorholen - if (mode === "overlay" && !pinned && !boundsAnim) { - const now = Date.now() - const inWin = p.x >= b.x && p.y >= b.y && p.x <= b.x + b.width && p.y <= b.y + b.height - if (inWin) lastNear = now - if (!tucked && now - lastNear > AUTO_TUCK_MS) tuckToEdge() - else if (tucked) { - const wa = screen.getDisplayNearestPoint({ x: b.x, y: b.y }).workArea - if (p.x >= wa.x + wa.width - SLIVER - 12 && p.y >= b.y - 12 && p.y <= b.y + b.height + 12) { lastNear = now; untuck() } - } - } - }, 40) // ~25 Hz reicht fuers Blickfolgen, kostet kaum Last -} -function stopCursorTracking() { if (cursorTimer) { clearInterval(cursorTimer); cursorTimer = null } } - -// --- An den Rand ducken (MateEngine-Idee) --- -type Rect = { x: number; y: number; width: number; height: number } -let tucked = false -let prevBounds: Rect | null = null -let lastNear = Date.now() -let boundsAnim: ReturnType | null = null -const SLIVER = 58 // sichtbarer Rest am Rand, wenn geduckt -const AUTO_TUCK_MS = 15000 // nach so langer Nicht-Naehe im Overlay automatisch ducken - -function animateBounds(target: Rect, after?: () => void) { - if (!win) return - if (boundsAnim) { clearInterval(boundsAnim); boundsAnim = null } - const start = win.getBounds(); const t0 = Date.now(); const dur = 260 - boundsAnim = setInterval(() => { - if (!win || win.isDestroyed()) { if (boundsAnim) clearInterval(boundsAnim); boundsAnim = null; return } - const k = Math.min(1, (Date.now() - t0) / dur) - const e = k < 0.5 ? 2 * k * k : 1 - Math.pow(-2 * k + 2, 2) / 2 // easeInOutQuad - win.setBounds({ - x: Math.round(start.x + (target.x - start.x) * e), - y: Math.round(start.y + (target.y - start.y) * e), - width: target.width, height: target.height, - }) - if (k >= 1) { if (boundsAnim) clearInterval(boundsAnim); boundsAnim = null; after?.() } - }, 16) -} -function tuckToEdge() { - if (!win || mode !== "overlay" || tucked) return - prevBounds = win.getBounds() - const wa = screen.getDisplayNearestPoint({ x: prevBounds.x, y: prevBounds.y }).workArea - animateBounds({ x: wa.x + wa.width - SLIVER, y: prevBounds.y, width: prevBounds.width, height: prevBounds.height }) - tucked = true; setTrayMenu() -} -function untuck() { - if (!win || !tucked) return - const t = prevBounds || win.getBounds() - animateBounds({ x: t.x, y: t.y, width: t.width, height: t.height }) - tucked = false; setTrayMenu() -} -function toggleTuck() { if (tucked) untuck(); else tuckToEdge() } - -async function ensureTtsServer() { - try { - const r = await fetch(`${TTS}/health`) - if (r.ok) { console.log("[lucy] TTS-Server läuft bereits auf", TTS); return } - } catch { /* selbst starten */ } - console.log("[lucy] starte pocket_server:", PY, "(cwd:", TTS_DIR + ")") - ttsProc = spawn(PY, ["-m", "uvicorn", "pocket_server:app", "--host", "127.0.0.1", "--port", PORT], - { cwd: TTS_DIR, windowsHide: true, env: { - ...process.env, - // Bench-Optimum aus Phase B2 (docs/LUCY_TTS_PLAN.md): 4 Worker x 2 Threads = RTF 0,44 - // statt 0,67 seriell. Ohne diese Envs startete der Server SERIELL (workers=0) -> - // TTS-TTFB 1,7-2,3 s je Antwort (Realtest 02.07.). Per Umgebung überschreibbar. - LUCY_WORKERS: process.env.LUCY_WORKERS || "4", - LUCY_WORKER_THREADS: process.env.LUCY_WORKER_THREADS || "2", - } }) - ttsProc.stdout?.on("data", (d) => console.log("[tts]", d.toString().trimEnd())) - ttsProc.stderr?.on("data", (d) => console.log("[tts]", d.toString().trimEnd())) - ttsProc.on("error", (e) => console.error("[lucy] pocket_server-Spawn fehlgeschlagen:", e)) - ttsProc.on("exit", (code) => { console.log("[lucy] pocket_server beendet, code", code); ttsProc = null }) -} -function stopTtsServer() { - if (ttsProc && !ttsProc.killed) { try { ttsProc.kill() } catch { /* */ }; ttsProc = null } -} - -function applyMode(next: "full" | "overlay") { - if (!win) return - // beim Verlassen des Overlays ggf. Duck-Zustand zuruecksetzen (Position wiederherstellen) - if (tucked && next !== "overlay") { tucked = false; if (prevBounds) win.setPosition(prevBounds.x, prevBounds.y) } - mode = next - const overlay = next === "overlay" - const size = overlay ? OVERLAY_SIZE : FULL_SIZE - win.setAlwaysOnTop(overlay || pinned, "floating") - win.setSize(size.width, size.height, false) - win.setResizable(!overlay) - if (overlay) win.setMinimumSize(280, 360); else win.setMinimumSize(420, 420) - win.webContents.send("lucy:mode", next) - lastNear = Date.now(); setTrayMenu() -} - -function createWindow() { - win = new BrowserWindow({ - width: FULL_SIZE.width, height: FULL_SIZE.height, minWidth: 420, minHeight: 420, - frame: false, transparent: true, backgroundColor: "#00000000", resizable: true, - title: "Lucy", show: false, - webPreferences: { - preload: join(__dirname, "../preload/index.mjs"), - sandbox: false, webSecurity: false, - }, - }) - if (process.env.ELECTRON_RENDERER_URL) win.loadURL(process.env.ELECTRON_RENDERER_URL) - else win.loadFile(join(__dirname, "../renderer/index.html")) - win.once("ready-to-show", () => win?.show()) - win.on("closed", () => { win = null }) -} - -function showWin() { - if (!win) { createWindow(); return } - if (win.isMinimized()) win.restore() - if (tucked) untuck() - win.show(); win.focus() -} - -function lucyIcon() { - // 16x16 Icon zur Laufzeit (silberblauer Kreis) -> sichtbar im Tray, ohne Asset-Datei - const s = 16, buf = Buffer.alloc(s * s * 4) - for (let y = 0; y < s; y++) for (let x = 0; x < s; x++) { - const i = (y * s + x) * 4 - const dx = x - 7.5, dy = y - 7.5, inside = dx * dx + dy * dy <= 56 - buf[i] = 0xfc; buf[i + 1] = 0xd3; buf[i + 2] = 0x7d; buf[i + 3] = inside ? 0xff : 0x00 // BGRA - } - return nativeImage.createFromBitmap(buf, { width: s, height: s }) -} - -function setTrayMenu() { - if (!tray) return - tray.setContextMenu(Menu.buildFromTemplate([ - { label: "Lucy zeigen", click: showWin }, - { label: "Overlay-Modus", type: "checkbox", checked: mode === "overlay", - click: (mi) => { applyMode(mi.checked ? "overlay" : "full"); showWin() } }, - { label: tucked ? "Hervorholen" : "An den Rand ducken", enabled: mode === "overlay", click: toggleTuck }, - { type: "separator" }, - { label: "Beenden", click: () => { app.quit() } }, - ])) -} -function buildTray() { - tray = new Tray(lucyIcon()) - tray.setToolTip("Lucy") - setTrayMenu() - tray.on("click", showWin) -} - -function registerHotkey() { - globalShortcut.unregisterAll() - // Global: Sprach-Aufnahme an/aus (Toggle, da Global-Shortcuts kein key-up liefern) - const ok = globalShortcut.register(HOTKEY, () => { showWin(); win?.webContents.send("lucy:hotkey") }) - if (!ok) console.error("[lucy] Global-Hotkey-Registrierung fehlgeschlagen:", HOTKEY) -} - -// ---- IPC vom Renderer (Titelleiste/Modus) ---- -ipcMain.handle("win:minimize", () => win?.minimize()) -ipcMain.handle("win:close", () => win?.hide()) // in den Tray, bleibt warm; echtes Beenden über Tray -ipcMain.handle("win:setMode", (_e, m: "full" | "overlay") => { applyMode(m); return mode }) -ipcMain.handle("win:getMode", () => mode) -ipcMain.handle("win:togglePin", () => { pinned = !pinned; win?.setAlwaysOnTop(pinned || mode === "overlay", "floating"); return pinned }) - -// Links im echten System-Browser oeffnen (nicht im App-Fenster); nur http(s) erlauben -ipcMain.handle("open:external", (_e, url: string) => { if (/^https?:\/\//i.test(url)) void shell.openExternal(url) }) - -// Geistmodus (Overlay v2): Fenster durchklickbar machen -> Lucy "sitzt" auf dem Desktop, du arbeitest -// dahinter weiter. forward:true liefert weiter Hover-Events an den Renderer, damit er ueber Lucys -// Bedienelementen kurzzeitig wieder klickbar schalten kann. -ipcMain.handle("win:setClickThrough", (_e, on: boolean) => { - win?.setIgnoreMouseEvents(!!on, { forward: true }); return !!on -}) - -// ---- Bildschirm-Sicht (Lucys Augen) ---- -const CAP = { width: 1280, height: 720 } -ipcMain.handle("screen:capture", async () => { - const sources = await desktopCapturer.getSources({ types: ["screen"], thumbnailSize: CAP }) - return sources.map((s) => s.thumbnail.toDataURL()) // ALLE Bildschirme (Multi-Monitor) als PNG-DataURLs -}) -ipcMain.handle("screen:listWindows", async () => { - const sources = await desktopCapturer.getSources({ types: ["window"], thumbnailSize: { width: 0, height: 0 } }) - return sources.filter((s) => s.name && s.name !== "Lucy").map((s) => ({ id: s.id, name: s.name })) -}) -ipcMain.handle("screen:captureWindow", async (_e, id: string) => { - const sources = await desktopCapturer.getSources({ types: ["window"], thumbnailSize: CAP }) - return sources.find((s) => s.id === id)?.thumbnail.toDataURL() ?? null -}) -// Fuzzy-Fenstersuche: bester Treffer für einen im Gesagten erkannten App-/Fensternamen -ipcMain.handle("screen:captureByName", async (_e, query: string) => { - const q = query.toLowerCase().trim() - const sources = await desktopCapturer.getSources({ types: ["window"], thumbnailSize: CAP }) - const cand = sources.filter((s) => s.name && s.name !== "Lucy") - const hit = cand.find((s) => s.name.toLowerCase().includes(q)) - || cand.find((s) => q.split(/\s+/).some((w) => w.length > 2 && s.name.toLowerCase().includes(w))) - return hit ? { name: hit.name, image: hit.thumbnail.toDataURL() } : null -}) - -app.whenReady().then(() => { - void ensureTtsServer() - createWindow() - buildTray() - registerHotkey() - startCursorTracking() - // Tanzen zur Musik: System-Audio (Loopback) fuer getDisplayMedia bereitstellen, ohne System-Picker - session.defaultSession.setDisplayMediaRequestHandler((_req, callback) => { - desktopCapturer.getSources({ types: ["screen"] }) - .then((sources) => callback({ video: sources[0], audio: "loopback" })) - .catch(() => { try { callback({}) } catch { /* */ } }) - }, { useSystemPicker: false }) - app.on("activate", () => { if (BrowserWindow.getAllWindows().length === 0) createWindow() }) -}) - -app.on("window-all-closed", () => { /* im Tray weiterlaufen lassen; Beenden nur über Tray/Quit */ }) -app.on("before-quit", () => { - if (boundsAnim) clearInterval(boundsAnim) - stopCursorTracking(); stopTtsServer(); globalShortcut.unregisterAll(); tray?.destroy() -}) diff --git a/client/lucy-desktop/src/preload/index.ts b/client/lucy-desktop/src/preload/index.ts deleted file mode 100644 index 3a5c51f..0000000 --- a/client/lucy-desktop/src/preload/index.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { contextBridge, ipcRenderer } from "electron" - -// Schmale Bruecke Renderer -> Main: Fenster-Chrome (frameless), Modus-Umschaltung, Tray/Hotkey-Events. -contextBridge.exposeInMainWorld("lucy", { - minimize: () => ipcRenderer.invoke("win:minimize"), - close: () => ipcRenderer.invoke("win:close"), - setMode: (m: "full" | "overlay") => ipcRenderer.invoke("win:setMode", m), - getMode: () => ipcRenderer.invoke("win:getMode"), - togglePin: () => ipcRenderer.invoke("win:togglePin"), - // Bildschirm-Sicht - captureScreen: () => ipcRenderer.invoke("screen:capture"), // alle Monitore -> string[] - listWindows: () => ipcRenderer.invoke("screen:listWindows"), - captureWindow: (id: string) => ipcRenderer.invoke("screen:captureWindow", id), - captureByName: (q: string) => ipcRenderer.invoke("screen:captureByName", q), - openExternal: (url: string) => ipcRenderer.invoke("open:external", url), // Link im System-Browser - setClickThrough: (on: boolean) => ipcRenderer.invoke("win:setClickThrough", on), // Geistmodus (Overlay v2) - // Events aus dem Main-Prozess (Tray/Hotkey/Modus) - onMode: (cb: (m: "full" | "overlay") => void) => { - const h = (_e: unknown, m: "full" | "overlay") => cb(m) - ipcRenderer.on("lucy:mode", h) - return () => ipcRenderer.removeListener("lucy:mode", h) - }, - onHotkey: (cb: () => void) => { - const h = () => cb() - ipcRenderer.on("lucy:hotkey", h) - return () => ipcRenderer.removeListener("lucy:hotkey", h) - }, - // Mauszeiger-Position (relativ zu Lucys Kopf) -> Blickfolgen - onCursor: (cb: (p: { x: number; y: number }) => void) => { - const h = (_e: unknown, p: { x: number; y: number }) => cb(p) - ipcRenderer.on("lucy:cursor", h) - return () => ipcRenderer.removeListener("lucy:cursor", h) - }, -}) diff --git a/client/lucy-desktop/src/renderer/index.html b/client/lucy-desktop/src/renderer/index.html deleted file mode 100644 index 4dd41d5..0000000 --- a/client/lucy-desktop/src/renderer/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - Lucy - - -

- - - diff --git a/client/lucy-desktop/src/renderer/public/vrma/ATTRIBUTION.md b/client/lucy-desktop/src/renderer/public/vrma/ATTRIBUTION.md deleted file mode 100644 index 030b322..0000000 --- a/client/lucy-desktop/src/renderer/public/vrma/ATTRIBUTION.md +++ /dev/null @@ -1,11 +0,0 @@ -# VRMA-Animationen — Quelle & Lizenz - -Die `.vrma`-Bewegungs-Clips in diesem Ordner stammen aus: - -**tk256ailab/vrm-viewer** — https://github.com/tk256ailab/vrm-viewer -Lizenz: **MIT** · Copyright (c) 2025 TK256 - -Die MIT-Lizenz erlaubt Nutzung, Modifikation und Weitergabe; der Copyright- -Hinweis ist beizubehalten (= diese Datei). - -Genutzte Clips: Relax, Thinking, LookAround, Surprised, Sad, Clapping, Goodbye, Blush. diff --git a/client/lucy-desktop/src/renderer/public/vrma/Blush.vrma b/client/lucy-desktop/src/renderer/public/vrma/Blush.vrma deleted file mode 100644 index 22d57326d81bcbb33fd25eab7ed609d37b8a98da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118448 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 NK&g@84TBg@{C_?>Uh@C| diff --git a/client/lucy-desktop/src/renderer/public/vrma/Clapping.vrma b/client/lucy-desktop/src/renderer/public/vrma/Clapping.vrma deleted file mode 100644 index 58784e89d398323165f4a36dbbb4ebc3fb8046b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118448 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¨Ccux|EtN5;%ec5;8oCPYb^U~YeYMye-yTK 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

|_5q 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 DbYGd z31T{w@`+P0p6d8~iOf($w# z(Sx@2JPz-f{(Ux|L!DyGXnS%Tf;TD28|xAD&e7LG;;<8NG@a!WX?pb7tu?~w%;PYe zarmQ5ZeH0cV_b1ZM7264Qgl!jWx*auy{Vgli|6J*+UG z&b@2X_{?0eyrCqcc8{c7rY}8xG#d&YFn(P~r3)9u(PGb?Fz%(2Bo`i{$LDXNJrx;{ z_>tvj7w*xy-h1h6$vWuEJfn5jY>cMqiGZ39?oyQux{yL_uHa2*Yr2WA?KAbzk_}^#e7zJ^^G* z-`{O=hc()-XtVkw;S=k3n>Z12uf3t^x&uJFrHZul4uPXP-cq5UH-t0#+G}S(iry1? z`b;<2*ic2RyG4WU$J?~%27y9D6=`>MHk>WGMV}TTIL_94&OQ#trd*_rWrVoK--FJGO@}On7b~OF-s;2STS_9`w-W}tBf8$W0mNQVlJ@oXz|uD6^nzz2 zXwBrgv}g}pYhIJOLUVX_nC07_cf#yd#lp(^BDhmY8&dZM#^!OWpw?FK_3Jui6)4m_8-k&4Ojqi|xPG8w?Js zSbktBz^UXaoJ+wlQ0LDJ%y)w0VmI#e_z`f5`O6+7w!?_+>0Imgqo5kg|5y8GfcCoE z+*>107{$&TR_4htVa-QwfBqO)cb?_9?n`0Tcx%+Phc}#M{NXH?LLHx2#4nr(?#$jk zKVAX~eis_rVhR`^WA=Y^2@t1C$g*u9bUVQMlb3?B=_mC0WiYhLV(Z_s5EfWA!jB8X zU>>s%JWV{T<^%lfHS{;_(uhBt=2&yb2(~F#%7f^Ps~#1sPD|Fnll}b_DDVo4}2Hl{KQ4jeXN3f zl^%m2gJpQJX%f)h3Nm=-F<5hVDISxpuJI~}=ageG!*B`iF?$`_zl6{KrF z3V{~u@QJSbK<7;a(+_}&U)STI%?n`vxd_sIQ66+^xCzf#R|N6d5k$*w50oqxa9`sy z0C5rIeVZ-N>kX?7zc~wIcSn%?D(fMu=Qixz?ku=oj35r}Qef|^jksvVDcGp3AgTSA z!`?mdxJlJhU^hTPYDdinNQ=gygHJ(kg@Pn1E%=(+_V{I<88z=8LDJ_~@a^YV;r4p1 z=;eVCMDI*1zRw^j4jJ2w9vBxv+Ag=?ukMv#t>>+2E4K(zcSsw4ahw$IK5I_T_K6_X zYPI9_dRyUhp6q_cmhBJP@v5EH*jCz%b`nL9=S$l2dU6|VdBB85T0{`1wH_%;@b8;Ux8rh#$?)jwZ8P(c`zmiS)UIUsc@}(=M%O=Of{y zRj?I5N#6! z^K-^@oL4xh--6@2c-Z46envFeC!9q0;`qx_4xdRkrr%iq7k_)+wur;WpEsic{^6wH zsy#ooC&D40n^B_)Yngoenedd7*L&e;pF<>&iuQ%_fXZ~T6AEe2;yPZiBC&Dg%T5V>24-3v$%Hr zZk&z$^s3S@&j?bdwHY7YYaKH4u0~hxi6B#+HsM>(iA7Oq+O#jzufo2Dd;?@lO(7+qs-`JZIz~Wa^ zt?u|x(PWrW)75U9ql%n4S&VMk4}<;Hs&hN%u=-+?9CYTUCA8W&kSp2A@~^o4=v=Tq z^xYcGtte2DvF8Ppyyhq^uAR+oy{saGla3%dES)wzk;6T{rXn{!-$e04gQ<3vd`|nO zifq1d7Ns4iL33*!<6_wTi`kBJi0+|JO%CLE?ODVvyQd`is${P6^pnB}%fz zr!K$x_&jv6XRWM}lbOGCX~!Qt^B6@nZ@72Q=m^s1i50)Mwi$NY(9M4M-f(hqxRf{k zVu1%;6&rCVif>OdiI^&z^;+ zU(gp`FP=(FOFj7YJ?7wL**9`bT2CcL#@_rPv-x!O_f`@+cafs^=e#f$NL3)pKn zCXCd&@6Ri0uE56A+t}?e4I=>ur|>&gq++pNk=@icp(M31h(CK~J$~Ben*I7+p~UBT zFyHIgX51q+kXx4!O8O*B5qcRzLaR*9G}7WW2&HQS;6GPyIH(<_&Mx0tO^=EBbYS&7{f2r zyNFBIRY%Eg!Q}C_SpNFlOE|HO9@=OXOhhHIy!6Wz9DlDC@?iHNC#AFbH03osWN0-s zuwgJU?L3?BZgvC5&DKVudcmY*eJrn>aSM;0q=k~31d|SLWB6B9@8G;r9c0u#nCO_q z@H>m|;%zC_&|8OKk`_0MPwsgSM-SFT_1OJN^;1#&`)BuXx8ctZ7LPWdf_ zJV*-Q8yvoaTYnzT5ysydF~R(%1-J0)M<4A=UWSmAH=+FP_t)^_)HU|57emO{4`KXX zn``(={VMj`j)agSefFW^dG&C%xf6H#po$cn&PJ=IG{7B}6Yev!$KLsy(38dnIQx7D zZa%wT_^^2;3iwtz-KB^)XvBkcb2 zT`~&oR38tUR+Br#+I2iq(D1qqaA}Axm&)i(nY9v~9MS-AfVJH|rK4fb8sbUDI$Xvf6**|P z5xEsLz$u5G+n;3pBf@v1wxbO(;Xc~WW&QjCK;!1u$E~BPaQ)eSxmo#0=4OajpZH+^ zC7-RIKY$cR8sM5!zS(QDwxV7(3bJW{cb>RsKZ%Y1B+5j`bc}Eyd27F$@y9qi2Sp_| zz{PC7eAae8wI7Z7Vu14s@7O0k$+B&hwQ${xgXjc zunWDK-ZMv+-QNcLFGSv48ggBjxmUva^Bj&Kr~NC?%(oA0Js3V=!e`{UF%eatB(~3F z{&v$!J*-y}i44NYY9JJnryhbj@_NeE?gJM?K9h+oMrWZ>+ev; zBm*=~yMOk57C$_6&Y|9e?704Sm*nh!#O`-)W}}U#+6bBLUgwmu_~9)I5f)T(Rf-KZJDLl&QOrLWNDwk1^dNf4$m{_N~#gp)H`z~SnT1xQg5AC?5>!PV%ADJnAa$SAx|<_Q;S*QVh%DzY{|8h5!G2_799Q>`aTGF(`WX9g#LOV4(6 z8avNuz1)IZ#;|t}^{nZ!UP>~50mbJ&WWe&?-RR^J1!*<40B3q-L8FuXXgbT+tMopB zpIq7p@im6iHn9rw?Cb?RGP4lQCy%0i2P=s6=UX`B)^YgIXDt0{svzIaKg9Q%oP);$ zN6-n+BS@6pd)$B86=>%%ks72$kknOLJXvuQRyLhV$Fcl0sID&Wqjwv+4^hwrmd|`{ zTZ8W@xeH$!%%IhcBFF-HEnffTU6?J2raQldlO^-@crEL@;MP5cda-=7VZYjZZJ#@^ zT0fSqcpOf~T&}}U(Yg)yoaWFFmQPK1P>;{`ya^|k&ZQ?Wvi!}`kT=V?3aw!dy?rvA z>?>}_8_vGKYKF6^>tPnJQjGbctdrnT7)1jQg%d;FrhJ#(1u!Tioa!D6C$|nZrtKtJ)HH%@3vbMO#jk|3Lwu;VYXrF;YRtD0&4W)nM$o!Z z5hUBJ5%2DzfU9-7(TuGTWSm1oJ~w(Os5nb{;7$Z_4yw;z3X{T`7mX=xsvz4B>G3r> z*Mu&yRp=B}e^lP6!PgvifLhkLEbM0Ir-@!Q_(ORLdfR%p&~%%E7~QPS$3(sn3|top zHF6YW)V`{`s8zGQer^+mTQ?L0V=bP;*SKCaJ%#q46(nNGS1jQ=qh+sE+^0>yuE62_AyuWhE&+za3|PO+hYI5`?;??0ngC9j>x!8)`K(O}J*l>K$*F zahwdKU3U21qau4!I!38GTe{2> z)+V#@$qUi-UcIrG@m%5MI`+Qfwh9f=a>g~{W(lTjz9ViEkxoz_?D1`;aC`&HZ=1NI z2Sc6lqlj6;LDp{AVknAv+XtsBX9-i-dM{`XMDEZZ_tK6OUNL%#L`M{@KLkI?n<~sm zW$%OHc(i@R2<){zNVv$>Z#qtfc5NAnodT7@FxKAH)dmf0JQ$y%vxNNBDsnio9ooN? z-F>>m3z=(JJ=Vbi&79m1U#godq_Fk%+V6?Be|Evc&u$jc4H*W+&RzI4PP9g8+ zjhx1{WsuD3p%(jc;bOfnIWyWxAdA&=&YI@Im;MsLceEumUeES(aUX0w)j{xTX$ehM zE6ME6`EY!Yh2S`(HQZREB-Wer;ft$-aHW?i9Aoc07Vgi7ei3pZe1Q=(WA)YD@&j<& z%wF(GGJ)-k{NC&1Mk4|0a0MXa`x>m1L&LCYTyq zhc=0ofDNmEEi_mMgE|^gmp3w)^H@njYovm4LsNPq(+bY9`nGOL5?tRarI~H5!AqOn z-yVnqoy?JRGiR80N$)Vdc_2WI;^60BOT$*RQBHP<{jEfA<*lq`@^v5te&5iNMGolr_(|_U}J=e zNCQ6$690F!XXnXq#a~4_*1pO;d{hTc&5eRKeVP5mokfqR5gdE51cvIV$QG9#c&1we zNW8xZPB4C(`^MwGLA7A{0}AuaS^d&I3;VaYOT)&V0P_R|8R2phKOU4oGx}YJyH6uX zd+X|a!h&5~r#H`G+1GFq>uF)J1nI9qgMTJlK2KJx12_%OyGH~qu$t|$wOG= zKb2f?@5QejG6jFq{Q%;%VdRZ!06))a9KN(cCpYVTC<%5O!Z!*Sf^C!aa|Pc};$=0Q zZ#c3yPLS2eeHI!@E^i#cpKIJ3yS%EFyTLD%d=(An#|(AEc3-RJny(Edwaf?ch3q{~ zVqBHnfcjx%*h^>r!Z&?9Oz^X9vwtrXt?t^dWirqH|HlIocyV~=;hde`h6JJ8{ zsi}l}XvxP%-a*-?UcrF@)5!T$bKbezBXljZ6!@jnh<-pLemBd>7s}tj_MYK{%&N&( zA2}0!x$p`;TnHyK8-Bo&c?I0)l}{jRd<2Ode*`aVGKW)~xCjQWtbRBo5ht0x;Kp>= z2eItDJM4}%em|%us(75cmhLG?&t)OhWASOt#<%FQ`C$}bco>w6*?r{j z@yLHiF`|3#g8@;JFDK6kq2b!Nk;!9N(3$y{YuPj;P8YZIz6zxSS-rSO3URuI_L&>XMDaMw>s9?jVY zi`(u;R&!Uvv05x%m!5?~4u{cWNeWyz$nHD$-2j_fCsEwQL@;3Y&0R-6gk>vkA`j&p zkZfZ2nKmz>#PtojcW4%P&u8`4ZSO&ASv8zyqJWRn6=dg}Qi$7I7dy?F2q%3NWR0bE zZnypHJmEeHE{$gO*J$0`w{aG@+2*kjD^(CvzDDlWI1YQ)^96lfR$tPpm79L58$Qv% z2ZphF>6hDjxp!Lk#a?H|z}s6aA1cw$o!wysjx!#~-c?7CtpWPEY0o`z(dyn{d@X{g zChO%2JN&TI1_wCK@}UG@z1$(!gYbYL33xw@APNWl+`d**ao+Tfpj#Y4ESKr$?v9PX zMVHLMpV9Bup?0o^j}muk*%Y4Kh#-@jdYMJxxvBcl=tu#;kB9g;M!^sc97+#O$>6co|=i<-Kz@K^CC#^DF(Sc zr$^x)U3I`QCxVCq405k*nT6x7>B0$C->qh1kURQq46f&^3!be0<|i}At#K~~dwtb` zTdeky}4&DlYA$1(qi4ec!;Exepdk#G(FLpvCIje0I&;k#rQE z999LUw^xvq$2D_DqzuA_!Byd)rGg|?t&!^#)DLHR>Oo@%1!-E^5`WQZjsu=%<4*IH zT-M+y5x;tG34b<+sodbPSs?dyA=Kj!U!dp{SWh@h*l>DQSrxyIe%P z$uT^Ujepvv1&-KT%zmv>gj=zCW_6bqIHBMg>ha(x?hwfCx9+#VeZ0;h%i%|G)>I`C z_O-%sdnjsSa~M0T*n5|Top6KTBs50n2=2i4d(+$wmn?Nh2lbC&EwxdxSJcSnaK3h-gpzUq{XbSz5jCyy`0r`UZ{zqWvcuWhMf+kR}r@_|P> z*+@S)g?`$bi<`52;Bt=`^l9fS`b4o8>mFzF{iu(I9%v8W^0Tlm%b)tS`eZLi1EHw< zHavEPk~}}MLU1gZ16`fc@S_EcKO3cV-N!_j-ew&h#`rU8@pNjoED?G>UW$X3DM`Tm z-Bfa83A9){51(fF&DH9+say9|(8+2Bp32$>6gtrPz#16x*$1Cy``4RM4^ro(!z0y5 zT$Aaq=c@*AC4C2!e&~U-n7$`0Fop;3vYCg(+ zToPc_#5%Y-8$U6q4cyw04fW4{LVhVq@~U+w7?PI@540YjrfhunIS~v!cmRBLPa~rl z?7hu78I(F6gb9aoksH%@{rlE1G5!!(*z7@zB3M3j&>B+S7DC&U40M^v`@sS$*uC>G zC=yqpwM^fKZk58(riWpc`7*RVTuDZ6l)|nlhatUPA{xfpM~;Z#l4~LCxG*0LWAn9m zVF^(+55oIB2`HPr|KUPALvnZ?geX^{Fvh>F^E!c#EF0b%twRl2em6I|9dz>A3cVJt zM^#ws4S@iil9kGiJNPK%-q?EGeQ(S<5+me7`Sa?o5>FS~2gnU3~5K%Lkde2eoc5*SmJ ziciGTxlVUc7^?@N_qM|MWI_*ESHlf1vG*cH)*Lxrhc0N_5Fb0OBIMFFuFv{SLXAW1 z@g`QEvfq+~F3pJ(hWquzgVNZ0{Vto4yQ5NQd~*yQH;>h;1|LPu+N*?2eFg66$Igq& zyJ+8rMB#O{xp=t?J6{>sz$Opx3-6*AV@U_LzD8~E&D3tRb51h${iY=G5iU4vtBQUx z&A`$;X5S7WnAVM57n7Ia$_2QslOT!81BFniA1hUwcabX5Pdm``QziDIwf znp5?l+84={C;Z*l*g5u{$g7ks|%JGyfB zH@x~;IB7k*8XubajIO+`!yk(XCrWKY-eA-l>bIjN-}?46BB|Y+mus%xRv3YP_B?H43=LKF`8U_Yh-r*HZ*ble(%aPMJ+Fk341bQF{?!a>7Z~!P z!1BGB9Pi}Q0sQ+I@!OKaNWLlJGy7P=p&pHSyRa~#WNaAlr7g_fXUZFi!bpr3;U5jQ zfPK2H`1wymNxTi=*N-uWbh$ad?sX_ZET5gQwlgeP*n*#F5Jv7z;rVxd95mKy&Sx5j zk)Vt&y!!|jc(SYoPfmxDWea-n{m+hsB#Y+!hQ*;oe`#O->y5Ec6I$|Xj6;dztURE6-vjcD3D1`Xu4dlmeRzgU7OMZkngnX&ipMTJ48VuXqkv}{!giL(Yi(h&m0B+T5 z&qox8kn@i*e|$wZxUFl(7kvyR6FNxwagD8EhN&rkCnJpL1kVw)SMJZzE@&up{KkH- zGR{ZPUGOD%GykwG&)eyUWf9;VY+|^Z#*l-ElpA|Gz!8 zDJm^8qEte??>*-f?X4n8S_%#Ay_ZTVk`*OoWF{lL?>YCK>{(>Q$IJ|oohZNa{r&lT zoO91T=XG9Z+}C(s@l$|f{)f-ya}wjvo|RA+{C|5AIG2;JZ8}>ph57&TqQ|M+D7WEk zu|Lbrr}f2lWOFK3AJ1mBG5_BmIGDiw%`y@GJ3gCprRBDNlejOZ(uF0}GdOpOC3JJR z-_Ht!VkX-EkEKKv^xM8t_^(Hv6a23{V;eW&qm)4Eod!3N;*JeRxY3^yjKoYi?)E5^ zXZ2BzXI3*}5l@9R6c;w_;_T(B8A+L7;U_gf}+@$^1MJZzre0L3FlQCxcCG3Mu_g@TT6FbHDSD)Ey`|zbKI{ zj+?|a4AFRJzn_8-^Aa}qu{k&LlgfwsL5>;Mu&3JvoXii}zZ>z)k;~gzezF&Lx_7|EX$Yvc^ z;r^HJHA3@~F3;Y>4u*{9Bq)|lFJ->LX7+sWG;Z$y$}@_Y_{t{sG;hi+ruh7>bxhj3 zy==)LQ;w(p)?)E(%wih4t*3F(*Eb?DYD-_Z)3j=yb$V8yxVOGt0cXN%_tNJ#V9s-K7;Lgu%6Am@L0H$ z;zDbER{ujLJ9=20)28yz%QIkKj;>}AQRbxR{B&H=XWQN_Wnq93*GF;TE(2C^y9?`5 z<-l$KMc=nXhyAgZW&gH0aZz-B7ktuTKYTZ5FUYancZ%&gwAr|y#w_mzxkRcD;>(p; zyU(iZKM!|qKh>A~J~39JRXVRCW%pIF)IK$PF3!%6<@;IX&JPXTo)9`qT^Q8V`{&m@6*-tCD?NmO`RbMkn zMm|{FwTR21@|)cIf?1dth+QYuaSy4y4YM9IHLt?(-^5nVjp9z5UPiAq7Bg#kZWEoK zrnwK89*~T!ySlkQbUt^Ve8{MeOT+EkUvO0vhu?k4{IpHQu329=NU=nCA5(NI4NDG) z;rHKZJi~=P=HvEEyhly}$5Sje@RIqvGYyOFP{&>r8<@UgR3($}=wxl|L2>TDYlgQ< z#09%2VsnZ|rQS1zo8z(gGb1cb@x+Y-jBj=lo_=pKK10_l@A!@h4Nu30#glL~#gnE! zW-f*n;2d`YJda|1_Xo@s^L*^tWPqb6?oj2JR#85F_Fn)0pa0k0#LTbG$2nSB*#Ce1 z8K`4wl@su!F-o}Of8z_@&3sh#!_RXi@E$6kLbQb`R03G+P7k-4$~W)FD#ob89D}?L zZZFlp3lnBDLykIF{?TEspUy|w`oZM6L#>o*CYEQ)qXC#``|d zBL)AYxFW-F&ioe5zpR=_)>cjC(7skKkYbf6T_W@LlTft$26vm{)?saGXWT0M+jg64 z?V|pG|0a^rXS0Om!F?Qmldk{C`eabaMtE-OH|_*&e}|qPd6brNR#NsC=SIt?e4uvK zj$~`Q_F?Wf#j8zp$ct8Sn-R;uoD6NxeTz1cp84EH{QMs-gkmMf2}IuBO3<eZR_e({i^) zRZ{eL3FDyE&RwDy$EuKmje*QRy+d3Dt-s{E63O#e$=HrGa%&#Y`|%D%Qgqv!Szx%0 z>+7ZWe;oxP9)Ot9p0(VYht&W5R-TNA88Ls$!@2qNzW$e&C7Jbz$=V>sZTl||HPXDV zOc2T#WsaLC^@QqQH?1G~kCDigVJ^`2av4=p)8NV$9oo(`()&CgtwB}|ZDc3O4lps) zU#^g)M)G}+vJ%fHv)S~1zktyG_Xt_3pC0U^4(iWUQzI4$ovfjDBHa_I{NAY(FN2G0 zTjM%5c}AU#=ytKcKhZPkWF9is)*xP&PptL={s1bKMh6Q-OedsT4@3_UFWHSMiPyu7Le60dzCz z{=4TS&dm)1^E;)$!B~3VaIVKyr{ckeIdWjpa++UvyaK;3$ptnOWr4CEy-!7D<5l5> zprC+qzIf5~m%9>c_LKmh)v_Sdh0b?<5ZXO5ag<;Ki0qXC z|Fgdv37zo%{WT!qzC36#rS|i)E?C-a6F4GL1S<4<$w1K=_kF7cs}3oH!^U)fs&K~E z5}Sd#ry7u%Our9xobZ9qo4_d-HL!gO%@gCMyOM{(r03%aZeu{i z63CX*^=vtHF+QNJ1T5_J*m#ONUq;}fma)M0p9Jed_mA0)nb+0|&P7I8sSqKK{`Y+pGkE07;v0pqI z&IZ!;W~bAF7ahCAUPuw+Za$^o@7qq|F28-OZS4kb;04XUjN!56zEsw3(PwVrYkK}| zzK)I5=dsPJXJhh`%6sPvEca@ZarzU1PtxaC8Vq8YkXwxHi4uJ4A=NLW`U0$e2b@3 z`K%Ftg!lIZ;3m(1Sm%5m+B@SvJb!sQZkCZJ3o*^#54(%|WY*!9TvhV;G|k5gyn%b} z?!>w?w8*F9biLoWgkPWDkL^F|kfc_6{+_;o`Td8m#&QFaNY{Vz&^a7;`Vc-lXhaqr zqWgaxk0sgT_{G90n&LMTdHm7*EPiffMix+iYosZUAM2gLQ)*|C0_u;ov*YmaOCiq9FejfH>G?G0 z7&g=3amt5Tq>a{(&pM3T3a(&T6>|drSATOGUT~Ph%_38>g8FAmRjy#~6UVUZ#+hV< z)^G28hQl@YVvUfgB#pjbM&l)JI8%m;+H}eBBUGOc_Tk9i2w!29NGwP1UrFCFf9);z zHTxT$OZQXnAt~}D@dzhD^LivMQG1V~9O+{cI9o*_&ZF|bJt#{ajo%}TTeu4+(eum7 zWd|7Szrc2%+sXRS^}ONH7GUqy!HPfG#F|*p`}WIPP*iz~4awZZD$b_&2hC03?$@uZ zk8UNaYfjgr&PFgq6u?IJayD=#yo4{1~!!1ZzQfofz}gcV0U8!Tl9naljT-{7T+oW3U;$@A99iF z{&4W@aV9)}F#Xr1sD0 zG%pz2TmyY$RzfVW*0*^E3IuWnoq47z8-a~?A6ER==j z?>-9TwEW=n^KTh8Cj-^pIS&G~lA-t#%v7#QqyCm2;1yR2OL~l$eJLr(df!uUxp4z@ z>zcq_A4x*q$NE8S)K;iFa+347o`~e5z5?=S2TZD0#f!crptVPaK-c>Q*xTWbbNmxf zqW)j-;NWifMddteXPi67g>qpIEFP|9*I zbb|Hx!`OKAaiJ8P@L?~kd|ZQPJc~n$Mv_qW+&(x%Z698KE)LZQB;lX9{cx=4ERJr7 zL*cPfuwZ-(G%2`<#gpUE>_}<2xVHsrN8ZL-PI2g%qYTWjYJn;K{kVE@9I|edgP-m8 zLruLu*kxrLs=A;6D=YWG7e^$?$+$Qq&MLxHtM|dt=ZZusHV%CpqX@&o_CdX?Y9u-) z4z=A=fJQU-!H=qANqlM?I+CXV!`1e}zR%;y^8Im0`-wa}RMrgZR!$^a2I5d=w>+#_ z)dbJf>XID&cy!859)@=|!nLkCL?tF3W$u-O3%@nMvG;Y!YZ8yf9hHI259{GR!)e6p zXFN*ZD+Mdo?u4HPEXX$N1Z25g0;V=?hvyyUkgI$G%3Cc4^(SwJS*t9_w6a9hQuPP8 z=TyPh`G%yvB?;Lk`~+v-6v0D>RLDE~6trR7cN+h;5@t>pC#RRDQF}X`&vbj}r~Cn* z^vpo1%oh+?s0RnTpWt(nS!nO%FJQ*r7hw5|0laWsHo81(2sHYv0H)m%WJfJ!imR2R z@$}P}3OgAxLgUN5wdLV>F9Y)PwFF5C%0Zu;m7(SG9FjBi0ZYEmMh};%!=(MSdcFocp00$whso+VM~XyoKn zxZ}J=!*f^jA3808nr|{{RbBui?#J?xHZe}*$vVJkx)tQKx_WAIjbrydqD-itom59=9AapvM!KZ5l z14XAKBv>tg$yS+skx>}nqLR?b+<7qVdpgf%hX9K`Nod(CD_EPG%FEP5fZ8`n=? z2qpT1d6Vj5F#UH5O8HL@D%33Fzfn$we3**-(sUs2u$2EhtrSeDN=1FYv|#^;A3v;F z22Q+BMM~#1Ai3$uYwRooMUiPpn57Jhe>?E)i^{=i`E*n>P7W@eY{Tmqt^&GqD! zOerAL-xKG;=iOeE{GKt0WWa?H8|7Oj5Etv6W#>J2IiT7@Tw4#F`x_un*ru;3{N3MYtOD};= z)4!|_%|Fhv%p^N~yV$QC3)uc>`u+1IojiJQkNx54%SuzMqmoS`e?Mb;riZeM5%j*? zmri*4Y@y;pHYtpLKYmCd>7MGKPi#Kx7)ax<=BJVr^(jEv!kj%!zaP%Wq>`j08&K`6 z$G)0R@AoRHI0Q#rRLK6Z)_Ub8L$jIZFtS>nM(70Gcw6$%V=Q#tD8BdMen!w zv&r+M3?QjP7-bqyF>_%7DQqkO9_My5d4svg78DZMfJ$(&x0*40nv24t3(4T0O+ce{ z2{U|)=J!7;ApI>nfNhi(BSp{8#IAfY>2ed$|F}btPW@Ns4ReX&_5{m#$4o9 zokNlf+rZY})3|@@a#3+?HZk5L1d>iw+(qiIZJLoqvVLCxd*1hQk9=~`&S@E>?N=8t z=vBoB%yUt&e;NtA`54T1w!vA_G#=??GTFZIJuo=21b?9UQ6Tx3?lML<6(j4X?*lVHZr*9O^%6~!EF~l<99S4B5Ws1OgvrT zg7rFNLJsxEEYT*We`8>1zB8G;J{?`U^A`8Zl|fm9bQ+VIifr*ZynE|bsP=aQ+1QnY zcQTp>XhW01*P4RGTJfrFB_h}x7G zl>SN&oLkTVR~2-V0}avWbiW?xG&~RYH{T+&m7~#R>hC}O-~tTey2;a)DCEFT2H#g) zf@-JklGP4TXv$+_ux{REIKj7<98riu9|ER<+S1GL*sX_T$=B8BMX3o`_V^NPGk8QK z$3~%515<&t_9ggl;v=GqqRXWo`*fdJp@09Lj4xH;O3D|IKkx_nKLgMb(m;?)|VY{+WPZE z;dnF(^ce$`XNzF>coBJ|8-r%0NrN|22rOR05&JDM=-fszkas``;i^;Q<@8uogh$!; zl4szfYsX1jdn_uyJj80^Q?QxFA-=a>gA!>x>bZ$+P~l)Rk+zIOs@*@?@UaIW_hSpW zygeTMnevil4>!X3{}q$f5s7I2QNrHruYpAmeTYg|GBUYaL+^2UFtJOO6r4>%gAz;G z(-(Z&P!^H5*9G&>Z&j0;j%1V^a7CghFj0&>u!Q=rk6GDufIZDu zTz%h^9rCu|Z=A{o*}JmPHQ!DqlCkA`#*_iqr5Vvzt zAn$&$0q8BrKrxryu!Bh?KWljt(5p*FXX-ZLgf)r0oWyQ0?nxT58@Y==hv)J!^1Hx1 z%`_x+P=Pe)7W13#Gy=FR6*=G5BVX2+@rrxvfjK>I7A>(PpA^>fmi`Su-8==got{sU zd#m{EvAclT*<{r4$A@?+Y~B>|3w8r*on&O2S3>ZA8~EXnUBG^NGRlCJ zq`s({R~gd?p3?JmV)a(CPq&JXnf8+lD{sS?{Yf~>e^F~^VvrvFe8mO zUVady{z*aq{e4Ql{EFvwT3W!=C8?;x`W3O3TE#!Qy$5i;sc6Qy_vCM0Ab(n^5wL61 z(BAKZstKGJ2~Lm`Aif+Mo9me z_vFPGAF%9i7Bblo`nXG^Wc&fpwCg43^*#p~Z8<@N zH*bQ(-6r_g@f>ubbtlnMcn>1iW#N+Y98?wOh-Z~u#qt@^B5VnJB<{)erIgN6Uy?3H87Hvcc~b{D<#TJ=LVRqRR#^%DsoLh7>~lDTI8*%V9l)m} zZ(`NJP;!j+x4RJFpsZW?@rw}hfnvW*fZyG@fp0wsA&#_u3j?uO+)ZptLWw^uH**1a zMtC<)t`8xXDZUcM;+(5pcmjRjGg?1pH^94Sbi0{MD2b)z=Mru4z1w%N{_+*%RvzVV zJK=tV+o}5$pt&(ElDSE@5NYhkIrY>U1u!mzXvb% zUPB(|Qu|7Z3zqq{6DO*~5l7nIu2s%>^QY~2Wp^z3LG8Ct$^n}^+K!)JT}|%N{``%x zrM`__*w=pru`H+dW?O6ABiMlx_5_fI_)uf>;51H(A!ogLA_`;JIqDST5xYQl5 zy;z1%2(IT=llImYi5T0&Zhj-K$k^d-uQs9ph=pHT2<&my9+TLV8 z+<3YQFTq)qKbY3P>5qdi(s*cveDZ*nZ+sqt9dB3QGchGZDuUXJ$|G^^+j4AmrHniY z%0sI4tMRYODtvUuI-+N^bGaA&7UV5Y?Q2S7v1hoLO+@P~B6E(~JB1op!PH#f>M@HrQ2dLQ zzxiE#X4Q#BGe4NFcSRrmU91x7VNHuIK3!)$7#XBl^c( zSw03oB3h(@`oEqkQ$JFl5k7QZiJYeP{&0HiY7?15%{#9`(n_JmYQ~72`@@DZJx@rHqUUHqG?U*r0C`UZSc-l&L)482{izHD~eRBsC&MaoosH&hmf|CswGF znY8|*=byO)7u)fBA7v6ikfP9md6^UyV386TbY z8GDCMCpibGew$6gmvug4`(`_`b}JqK6f^uq;U%8X;z@Q@Q~%*-fOW3+;J~m@5<<_r zv@&~aF?=15nMe0Gy8p)RwZLglZAjrwAJ9hE=aHGl_`y8^c`9ZPJY(tp?W%`s0C7NY#l69*HS~NY=J?XQ8DxuaA$Ul~?{L^0Pv0_wyxhAG9HH2$!5pvu&y=`t zUI^yW{eHl0HZE7OApMDsaBlEtm0B33YXUc4`^j#e?Cw&F@NY8`LBs+}JM50w40c5EBCh9N1$!dng zX5C6~l|KI<${ufBI*Gj3SPh;pqw)!L!Anc@Nyo1>pq{>OnXxAxwbCZcu4LfiPuI(& zMOem6jokZ?4JP|heeLkU(iTeOhh`>lruBb*^1*UL@?^b7Cb&({4=Z~=Y_L+6l=NkR zYKlM3^ToNhq{y^AnP3h*pSA^iW6!^%`0au;u#EP9d9xR`E*!+wD^fw{O8R|fxd>O3 zKEtAsZ15lL|FR9fcvV6VHdM+2v2;E&?s((Q!frh827R8+-^&Vjtaju+UVJtYm?hBj zw#FGhOnHnoB-Vf$dVW5g=7fL!>Bn#VVt^?<-$|tl7EJnxXU&WQgH+#_oN>b$k^|U> zPXJc5y@?AvajV`SuIx+(S@eC!cX;D_Vn4BUMH+CT@=f&c#+i5shnS^-QQE)kgWk9{ z{U^S-GYx3d@_=Yx92)rto4v>c)&J9f|0Vdco){@!mJeL1y!N^T;_R=|rl+E)F3-#*8(B6FNw8<;hC8_#3g?%c+1lBv?vruUe_nb zZkB-a3_Wj?BJk}gQ%S+3GVqG}lfI}#W1D(i(vemH)F>8O#NY#~HOb*g>w(>D$}b+e z3XAD!l0DDML5(%d7u&WRU(MGe>gvT{i7m~ypHJ;NwT5K9S3X$fNck{U_~B3Ejma6g zZ1BaI?iVQwae}`o>8(r$W1MLG&j&xe)Qj@>AIJt9Y5$Dh1mXkVAlZ^$2sWA0{IXY} z7`Hi)Ycgwr$biP1e2l<5dfkX;bQ##LN%JW;MPjWqcQW@@835yG{`jXTytOxgd`KYUZI$2x^*1eai@_lh>&PR^^v!L%2-=+#G0thB0vh^wv#4t03-|qJZZw%1?F85nF{;6XVy>z>ki1pP3uJy{v|O)lLA(v^}|x3-Kk} ztz?-t&3U2u1Yb@r#sd0ZfG3x8K_0aSZf{(SwZa>Ss5KY7ZKwGYrAzSjmfd7Ho$B9V z`h7>1;=j^+$xHJBFqP&9{IFhzE9&=?(+3KHfX2i3&JV^(2?vQoS~2KaPyJ^o9M61z zm^{0?77WpNeV51x%=aB8yL8HcRW9}42_tZY#9@-}Q3fW{@&Sto94&u@RR1jnYP3A{ zYdD5-N69EG1^=jh#8NB>%VxKdm--{`MJT!Aa0nH!rDDcL|uL{Yh=rpjD+AkZ_UGUK!AecSZI~Y~X~$+pw3WrsxrEZ*#s4oK~^}C%bBj<_)-@x9S3TVeAepyGm2^`j!i_ z-6enpcH8ma0!`6{6E29zGjPZE%~+vEQ)JUb$Ct{$N#>g|*`_HPv(*JXIK{xF2X^9c zT7GJa3$oK@;flHg_-ulvXy-l`6eh{QCnLx4+(J!JR*MT7E3$zBn|S<#wolHupcQ4- zFg4*4R$s3vGCt>mQg6Fr}aj z>pjvIRo6PA$Uz(U?`{PSiqH`qlW;_9CNOYlWepD9sUzyT;DEk762Ok(-T0cUuIOC6 z1G>M}8hTmt_)e6rNDn%o57Bes6mT0a)YTP{tqy4SGbWD5#IieUfst>mw zVn1&kQNR*M6f(yW{$2D069XMl!d6H0W~K$)R@H~~E^CW+ymv&UdFF6i_5fbstu0#Y z;e?>4IXu?%1;0_z7S+)4EdFW^J4%0Hb02L{%zP&#RcHa11PL>4*f*bD(9>McjBvN2LAP0V&;^2h;y?xVKkF6iFP=$bJF5-Fy_Q%jt^l z((zqPVqj!ZGk&YBD_XF`0r{??8~92fhKs4Z)<1JVnR9Gl%XM-51ch}d37^!w^`_;zwC(>_;66sqln3?)pU*u(&)SXoEZ zGuH`S{5cIK1f3R0hU$onq@7TQ{WPd$`cf#Kts{#4?TEM!#&DcK9E%m{h@{n=(87~>5?)F9=AzUNGWGq)t;rNKI)IgU<9d8IK_l&36fn%bg`lbw;|>d9~>cMc0& zCWt0qaYpn18NrEWH}LJu@uI$D7i1A^1oQu%!_S?xMBb6E=%|SyH2Qf8uN@pGa!qqX zYd-4313ORR$GT%hb&uUq(ONxdRdgN?EK?W7&hSL;ExPbh{!3gtNlm1z<%OQyp8(4& z{$Yphs-hJey-<;a7JT|jlI-_a6>WUth1?#GgP)Fw6L~#V5g6-@`a3nD;lDv#dP7BY z(#acLbXl1@aR)o|Ed>~*)bK0 z#MWRN2UXD@gnRCG_Ni z2g*Dg2y1>nVD}CxQD2h>DwSLYRWH9|&C8Whxw8kFetj7nq`nz$r!p#->492$gW%Q7 z&+O?)W%L(%ptj$^P-gi6JGfdIEgkQHRR4s)rqdtTm>OlI{=pqJXN1D-)ikHART&L; zxubKRL*cyz57`%Ym63d#J33Mt2B+HHXU~3BMtL>vNH8`GK2^BE-ce9NV7)t1t`38< zYtOTx-;~kZE$(RG2E`BB*=sM9(WKq()SegyjXoSoNOJ?XDx;47+|g2}Fj)F}1Dlbnj7)yHqrFc==ZW&K1wqy6L(EQTB~;_X zyp^xX6c~;{udKY#mU4gi?e%)@Q<);V+~I}ng#IvUY$={|M*$r+^+tE{0^yhaAMq_? z1yt|qjjEDEV9(Q8B&tFlHO}@%3;spIJ*+R8gyd229WS)4J_fo9BZ!-sJi4;N3q_xe zhouEM@~Q{bjACv4o&>$i8ftJhW(AzBrir5 zbseVqsG0&BYc`Wj6J^l-IByi~lmw4%YasZ#6w35mh$0sz!kisVWT~DMjdfdyI_=_N zQ|)f@z)=$M2|h^gSuE7vR7X&#B-*>%2gx*B>(?v33YX zy7{B~KjYvcY8$=F48egl{;0Qk4GiivBPElD;M6LAv@|^qs#IH&^GQR{Ho_lmE{ca$ zF*Zcv{1E&(#~&qWCcw%G-sD&N5KPeaM{&CG@St}BIU+Lz$FlxtMfe){TaZTdw+%rJ z6My989|M!NWRL|~zv1aA{?xx61&x2@6Z~xm7TNowk&CO~H~V!&A$16rCi)|zKP%x& zgAGKh|AI<$yo(u2=>g(n`p${@?J)bN~P6+mPq-$={{JuMtCqq2p-`f)e2ZQgdJgrYriR8?wQ0(IE@c`D_$+?OKe^ zjSqnp>C?%@iDGDs>0&ez91c&_sgSj?V(4D)B7~mP^*{0%uW%DbicyPDpm8X4%ejQj zZ6r{z_#&h$42Jy%n{n$C2~^1YA<2coP+!g&C!|Xv-B>^5Xch)1oOj{$O{CC)9$%zr zO6!Npb46>UkkMmbRJnF3G#sBJgy*DCwu~RzT<8b+XJt0JE2L5D7hgn_ydkF@B2bW* zLH^yos5;Ia#+e3jHn(Na+;U&^e7PI!96HO5DUwB6Q)#)R8&sAa=IZq2P{$=7)O^z& z8Z4cNm-@+}&80p_NzMz7SDJ=*b<3d`4IdOyx)7QkP{RwO1rrs4`Xp{0!(&QL|Yxo*h0Jq$jCrA&H{ zDk}GPLrbGW;8hO`rtZBeniTJb7DX(F$96k1ht1W{-cUDG^)U#hv{W;5_NbwUnr^7) zQxMEtwUud5R7VasT+!paAowe@hM66sj+iP}WOHvBJa}XwW81Ed_OEb7&mx1MR+>38 z#H*uRKUcJ3*>X5eSjz-#P^bUKaYaZX7-~-KWZ+75bSTvoRU`+)(fA>zZJ9dCN^wQ& z6NBOI8a-CqMjhR&bVcC<%jx}Hz%H1mj&>bzMT-l9V2^V&YY)}YhW)N6+ISgk9}~k$ z%~z-Amn#yP1wgCA5$xS|HS}w~8}jH~3=N$pu}>}4(3q!g=+SOp`u)?({Mx9B=9Iak zj9I>LqjjI)V4w<`7wv(@U0n<-uG-?zmrCfinJ1D{4uU5QZs2bfW03t$Pjql{IOJDi zY;i^r{kZ6f+8tNHy(#OkLkiumcYC56BWs}F*s*xg0Yzjq#uE)byTESwZOXsxxXuyF zY!u^jl%2lZf?pTRb4V>4O>`8p-*PN@PwO7eNFp1ts<+s<-xj>%w#S^jR5prYp0b;> zEqK$nPdE)3%J&xXgk4f<&KLDO<)rBIyY+k7lP_oS!Qd(9F(Dhd$lha1N@nq9JNmfM zi8S7J!Xx(W&@5iexS#8$e7+-|&smr}i$Ab>kkir4MqlFIu$~&T__GzCx$k<}D7@@7 zoA%v|pZ9%~vo**@X=mQCt;@~${YVNwHO@xI&cA18JvQU33uN#M{cIGx_APtY*^IyY zNf!U0e9hyzmu%7lGrl)t3@$XxM(T_DSl2!?-rQFO+fsbDyqDFPZ^k?HQ@&yo`h40w zR_C@U|LeCVuAP;QR<7=4OAeUw3ceF?E#-rT`yR5h=9uxbF6m=QTEBevefHM)S^Son z6Y+c6zntfHSex!ye85I++)c;-&4eD*TL7DGf`!L2U~f?gK{xV z#I1ZLs$RW>jU932^S6z|_h`QV#uw4-@Q@RKpiv3mpz?6v8o?e~;=r3>Ei7e{g`P1{ zY>tf`f34LJH!RCSBcDrIt$vnon>QJ6t;#|tcNMVSIs$%h@)UgiSQa{`<@1|Jw2nRAX3I3$i`<68&4;tjKiO9H_}!KKfYoc^fNKU?{vNY` zQxf^R8{37^`_hq;;1c`czbxJsM+*Nbr=tZGx7g4bh5YrEfkNeiG!&71hqZGr;j8C2 z2rI{>q0qu^_Deu1Uohvf(1r37&wg@&T3jk>E@)?mD=PRU>Tk{tgH*I)%?-Bb)p~v~P*J#@@)xhAe5hYg z6+aHbJoeUnQmWDPSpAJfY7V@vy*W6c>hFUbV zLD%v^{=In@SGqh6ozxx&{yZ<_yGkE$Zr+ric#8_inN-BT`q9s2x>A0%2t{BTU&yZ( z`^VX@NJDoo$%4*}h5YNIvUpQy8d7~X!s>Sx@`Ic>Ru4%-I(xsdF9d~r5#`(~OHMFM){{TRY2IsVm{Yd68k8np^Njzfwh&z{6m>hu9n8fr7boD+wT|h zV~k&OH(Y4GN2&z~0EN84vHP5fZyGY4H47wx0{&U%W6nM`4JEhf0WsGC-pk_^wu?5I`!10a&kBOy4JQFHE(3|Z8a|uxB@iC&Fajxb zeaUHt3XVDiz?g1Bklmkwc9-lFXo&~F@@zw}av+2Lm;0_@`Q!j-_tpUP(DimhW+L;j zGysN7Fa*=zWS~ApXXeDcKq$!62UqXX_Rf_t-t(5jhkgdY?sx_oJj^pai^AadegiNr zH3O+%xW^P!M8J1%4S|hg23m@TnBFC;pyse4(AA}UdfM`AkVG_Ot{H-d-_p_9XX^Cd zy)n?R!2p#0myUu3%Iu2LHE>O|Ay~wxqtSn3*m-5~Fz=xe*wB!UF0RsGpWaV`nja>C zaWtP`M#cno?@$U%tTY0eF6k&RZ7Mr&APsK$st+d2NJpIq&Ds2#47g>2E+CX&Z^NJ` zs}!CIZ*JBE>txf>;*yo@p}AS`M}!K{97#hr-xaV$3v%GSV)~D=Cu!){nq0R2U_Puf zk_1u>X-HtPhF#iQ44Dlyr%*i&c`Pnst8>=D6F(%uH|JCo_`9BU)ZYlFnahGm&lEKN zp9Dw~+Y0SJNrCf=lF`f~mOyZKJDevb0d%e;A-gdyK%UtF_bn6$2DwS-SBO8jWw#yL zUJwU$=aP_B>LPG>pcbk=5CbqS867y~1it*-0Bg0yfs#fFQc|7+>W!;mQKJla5tf3Y z9mawF;!4PTlLuFi(|iK!d+ai_9_D6i0KKm%NXKRmd%vm*rd4VK-KG?jsN2XER8~XF zzVVZFf@U%&*eR`BDCdhY7!65A^;SZ5ZeAU%H=6;x&L^RI zr%tv)p&s6~p9NYMC!t2=E_QQk1Jr$B1)3F;&^>KwaA?aeIP}ySEW4YChP8A-tf(HI zdIG^O{oa(Qm|8GU$(%K|+ z+ie0k{iOk>oj^eFG!Z>@nhaKcZi1<%c3|<$M5LlV6>QkF5AGS`05+B-pbveMK>D(S z@LszknEgB+6(7+8)6!dE@_&xt=ifNQUQ!1454OQ>)&b1kN%Nm%#KCgmaVX_)4+M#E zsATBt|FQJd0Z~2Q+bAJjA|Qfvi?E9#aA)rYRQ!mYpkjg@2%?~}OLrR>SXkJwD+b(i z*6u*DyTum8&foF-zJESDv2$nU%$zy%%sFh$k-dD&c5^c1FtyYgv}GKi@29>trcWC^nR-M#-ZH0f;v8o7i2p^DSiB*V3+y(`7q>V zq0i4i#Xy-s#T;RxIEUStvX8%iAyTICYmQ))Gms73 zsN};QMahmUd|`2k5m?_Z;s>s^lN}^~{gRULFvX~l zALnQ*`{=PiIFykKKU(v6`MHj={Rs;Mr;|Al=bgvj|7;_>UA#aT>^u$@e#znE4s;~{ zY72z5@4CVDsBFI5A{*JG&kKZB{3AYEoxx8XXepCLB?&L4l#5<-N#1{SkWJl~B#gav zvBCZ9Vtz>{YgxeOB*CotU~uW<`TU{2*0OuUl7$84Do#s#F8`;qrA(`q)~8G(=JsJ0 zUms>A`*k;2FxQYWr=hb+{w!q_SVg!T63CJ=6ZnS*Eo8THl7*TB0qk<*B7UJ^d)YFB zWT9_x81w9u&OhB}CR0$rCrJA1G<{aG$YBszrhZs z^|XZN^~_|&tLeR=;xH?Jw3KgIZ!DX4J5d<&_a@ssXeB>ml8NlHTcXgU^MXzJS;<$e zv5-OGJVCGDb9OgiJ>SE%lgy;;JYnkG7Iy7o6`z^gS+>12L0HlFk@erViSJ|UBs1U= zgq{B1*t4lyd5>StvfW4Hg(*LNva5=1d|JJ;%wuxAz~B7II{9zow`{bRxzCRm&QH9{ z)_Pa-3%=RQhV6(Kc8q+^P7m75k2-E5%koVS7FAqgNryM^!)NNq(wY*4GaKvJ&B5#W z=_A_7ye;MlPd(zK6 zBfjCL{wu|`543Q%@e@`>LQ^Yu5_MBq3sShRF&^f3!y3KS5 zS2^~Eoq=bez4ui%oa(!_br`&Sr-pg+F0vO?-e=kX2pd%g^P-Nh12>7!c9{6U&imn} zaF|^ooO-c8q-E@bwaus4e>aG4#(Kis@EW+}e}SDPd~FB$GrUv-_iV1SrPqls63xMJ zO%d`ckFyh$zUxQ~=opgo?EJm#9kpL|vJ|ZEeFKBHI~hAe{FGtq;N7%OVD+hnDTr@) za91VhUw8=9C@w@U@%{QLWF8#tod-$g8k#@peN6h>^d$3=rCvuBj9u^<$@ot)4ucmivo zbfXU(2n9|U<4AsT2?r>6xSZ*XkA~#1Oqy>h>#^X{*A3rZE@8$E#1Go3fI)TcXm~f9 zO*}~R%Pa#74c+m@i)@xaII=MwhR<`uf&*3T%Rb`Yy%_}s3tZ7gV?CQd=~vez!|d-a zn6;&leDczG9VvjuEKj`VR?PO-QT*(Mc`#d3g6`$zY;X{#iVtEn5IbI?^F);{p|6@$}TMBF!8C{t%CAuCtPr+FKP7TzkX~5Y;K~+W(K|3 zWx}PCia^W45ksH*vxY;|{~f%yN2IG8JuVv!-~ja1(tTMOtPD#1m69oR8S*V@$%3UXY~ua@*kk|)olKg6YN zO;M|+BdewPQ?L6}44J2e^&iby_ATOnpK1|xls}-~zDAC_Pv84`xA?x|5uBS6#XWjP ze9qN{V%Mt(N7~O0KJ%9RW!U^|IDC8!xLFV8%36s}TXVUga&R#iZJEs-{Y-qfqL~f5 z<|Tpo(XHI}uhiesYlAm5jfZcKv{^ObuF1t*r+stbyxl6fD&s@Z)HsCXI6YKPz{IO&n<*xo1D_T4}#B$ycKd*Hw_wsIB@S7h;*m1%G5C6xV z`+JOAyqSC+6Yf;CoomhR&L+nnWAk5-zk2;=oWte<*8a{J=KP4(vxg>Z#%o{;cOGEN z?+`!CxC;yVbdzE%Z6`Yz`M)?s`_cKEtZ;KZb0qoj{Nu~~J6vK%^e?j`B>$DY99Z+J zXKc^pr))FHU!|5c^PcpXeR0;1?WFN?d((j(Kd3329;qR7q46csVw}pzbvRjs-Ps#w6|83%dWJym%Vl;eqHo-PHZic4gX;z8|Y8( z1Iq4mGjEm1x^(!#!b3=&r@ZB+A1IN1oq3l@`Vb$#>I%no$d@$-+-2{F5&u8s6=xc> zNQNKZv%^z~KbZWJdva%@?9MoP54MovTg7Oz?;#Pg)IV)xSBr=*?b*WBt_qd~x6zV0 ztR#N!msd|jC$9Vm`n08^Z1{B@*$CnrANp&`8RePD z5-%FdDhcn=@55=;>dVG?Tgx8pqW3uC3%G{yZDccJ>}10!eSp_vE?w^>Yc%qfsdo^+ zw9bx=G{3>>r*pD>RWzP<=In0r6&AEGNH&=MKeeif6UX0UXWK|*|M<++%T93a)<;;N zhMPTYt5jcG<@xw~D;RD?c zxc_4W4&0&;es9`};d?va)#U?GznbD}AK8f5#TJ!CBXRv!dT-mj0iC`$;qmpOaTWQ` zb<|&nv74N+TWs|I;$7;Fsl@+QIb+k7aj4j>5PGa$iC+tCF?ml6I#IlX-T5oA&ax94 zznzR-_L6_}6Dx7_4+nfUdJ2}%d)>OJD{!`p2X>h@12f3~#kKj%u#z5vg?cgATt6R>X+`D+f(#2Vsg6V!F>k7FH(@2)=rcXT(w%!Lxn3Z?zdr5`@BamB6wIpIR$d*+1q z#_U_Mc<@;m#dRh5`4)uVJ{96?r_p%$1o^)Z@lVLRa-?hd6 zes{)tf#!2~H113B!yB!}=+B6c{$UJSJ{gQ#4BFy*D*rxk9L_r#j|Vcf(O#e4gLn?Z z>83?EOUo1ssK0g1hv7`aRk(hh37QbUFnfG7j_kG+H#B{NpEnhP&iq(xx>bZ8y&uEk zX9}SuG#b4JlwsF-8d!Ia^4AQ*%=}e&@PY~YpCbRoAOAzY#*IY5*Fj6-b4EZoPS)Or zb6dZG?0`bBS=$Reo>b$>fZyPAko=(x>`DHPw_(Mb-*B7KgA&5<+N52$=+Z|RRjUvp zUxZ^%Hx;rw&9Hhsy-yA4jX!@Mz;Ur>KqPtjy=M^mj@pkS{v3r_i+g6)K@{b`U=xekr}m>hy&*}?r1+x-y7vpKqI-HPs0E*^Q{A65=LoPO8^c@u_Cn*H`riC~n@CbHDI0EW{ z#5aAGgv%eE#0bk%V98Vb<4cS1nM(t@Tik-q;}nAT)A_imV?9<+y$w4iD+EC=8FP+o zN4E#9u!`1;*OGJ$YqJ3d>+51%nL>EhoP!(EH=^5b4SYfCPjPWBR#a`qsp5BvbD4;@V9y*kJwvwq7OqSY3{lZ3kkToiAYV8-*}! zSQ!Sd3dN@OIyjZy`?rj)Kr^4-D8Cng6G*=8vsd9wgI+jJYXtVD_2$-pl{lhnf0WXD zyj8@P{ncwF-uiDi=8l|?4k-!&4y?eDZ-?RF#97#d+CS*c5?s5ZAND%l2UpR2_@!Hp zo4yOU`vA!c%}2#tO26latzA3fH)_wqtR;A!^toxf^)RRn?Kh)K(L!Q?Q@?+N*|x-I zKVE_!avki^<2GD(rTuSWAs(*OLHpU~V1ys}6YY_MfuFR|*r*mR(f-NJPQz?{EiB6_ z1JzLSKSc9kg~?Aad>#*%h%cWxYC5{LegcDTgFtg0`AZ8Mg;$8Ls7&k(HYDGRPxQgV zfwy35)nT!T_QNY}0?{0WDQIL6E0{>g-cZb!qG06XgvZheoKQTm@3Tj@x{%h8)0|PvtYl8`X`|y zVrX}`7-x(_x6=E}U`vcVs}v)HJn{2t(kFU2qTT#_nC#sLXD%RpZ$=nCsoW1E`^4c% zTL1Dt&%l(!cfmLy2W{Vz|03NCymxUs=pRhS^Dh;GudEPLsxx8xs#whWPV28*84l}| z1JlgH@E)y4$9&RRK+{>(jy@I2`=oE4ZOCJ`%NnImG={03eMuFHpXag5$pchZl0W<1 zB^=VPfQ?zvb#vxo$$$dWz6sU2j#N;KGLSo^u8*klx42T zmaN>;UG<)smp>Z(r!Q zm9Rtm3TCrIDlHD4r_>@m*LXRLTB=ftEAu5@gzt}B%3KRNs>+&HDW?%$ak-p@HOEK~ zZ|^6mBK$(JoHednrdsVjQffnZ{MHrhXwMYYg}(u{=RZ;YL6yuaq(Wu>vs@WO_}Q}6 z>~N5_lxta|97%Y_=w)n3!Usue%VkL@l}Ej$O!aDU&0uF*4hSo^FJ-p|SgU-F%vX*h z9O}J_>CQi*`th_%SxDuZidV8#UKjk*p3dD}O}LlAdUjNBmTt&iquky~?_i(W2MW{2%pexh_w z`EqvtRf|$t_R!CY@M!lHOvh)fBrs~2zY0X9FjZ3A>qQ!l`P@!yMEF6M$}{%-h``;v@|PU{HFJQ+a7Yajf$0@=9{Y$|B$>+ zRdSmxZ>zfGol@!krT3;Lr?@G~2FZhpWs*yjp7=^=(>gtVOl9$vT|0!dcx5*Ke(S+*~?H{y$ zbckYhEAv#j0l!oO35Pb0W=C%Ql6?I!MCn1ex2cTnE_tX-+ccr;HmYwQ|BYK;GqZM9 z#15%FwP$epVQx;+8D+29Z^|cx>w8}2JlAiNPHJZ<-A#D=>{{-$`3GffwGL%wq{ z!&6j_`75NIDF4g8`?#l*Mk&{o+*1A~{IJ)@;0d8KRBK&qq)({+Z@b)r``d4js!sP; z{U*HVX>-v0(a)u(m%r7v(MS_og|?jeA2Ug?j>7LTrE67diWiGxq+)=y_8-PjQ}}iy zMAhMYx-^CU|I!3)Fbo* zZD!|lV+Nn`^R87$<`SOUv4*pnFkdz0&pOpV|L?yXM9zOtu*yQ`iSj+QzjM%D?&!x< zRp4_URXa+rdMa`)S^HIyWge=xl)h42$K7s!P9^NJkqVUl@Yyjg>BM@~;qmwUu2cH( zvQOOdr%P3P_8gG-5SFblWLJi~l*D#PSFWV?3dy!?>ZNn4#ZCqiZNg5oyxGk^zEXoO zcGBrIpD$Gev7ON>Y1_TCl#Mh$_Ox|on{N)56wmD@IYH?zHf@+i>V3(T^EZ?~sQkSX zI&81fw06L!1(I`w2QKf())$D9ijhsV&V=);?AT3%YE`(^t=jKYe#G$Z?AX2+s`)S7 z{Qgq?hPi>v>v0!p+%$j5UBV7#GL|@Xy6WM18|5a#LH&BM>C1jfrj&0`4kEndcQ|{Q zUs*f)wo)P?+{LdqJA7ba?VHy+s-A@3tO;RnKdhEMJDDX>5FR+A7ZavhO7{=nRr{~} z+k`&s(YRB}(AprSE8+cF!&wX~R!TIFN)#j?7r#ca)8pFvn@l|>=}owG&Ty7KSa0vK zhVBwM;Zc<%n8M_uqyE(#BCMYo`)^-g7p)8a-2`^4}qGBz)XyHq-AuQ}X^+y~LStOY~eOOm3zB zdawNUjn+$>xs1J>q*UAfmHfklYqa5@o3V1kGY{!i8lRfc?vUzYuDo~he(iD^pFNgV zP%xmsG(euE>_O>urB*Pef0@#JX`o6%SUK1X?ihHedhW7S%^_@_*BLHn|E>*t)1Yjn z@&o>}ftsqS8l4UXl8%%K=?|X z4%~aW+V6R|TKaGPF1Pw4db(d#F86m+>XH0(5%j?+sY2pE%~QIE(o-oG$>@nuN=4c( zNfzN#WezZYzL_K}+*Ea!zCY2*5AGbdlEzOssSG51k?hN^KVQ{qc(#>T(|o&JJs8H9 zoRS1>&{e8v{Fgr*3$G`&`u@n7F8T9sJUa}A*CDTJwpLh4)RdlG831d~^sSk;Vx{i~ zDu32j0^KDmC0(>1DZQxv@!_8E^lEGEaxXJgCgFKoEul|;edV>RSQVr8eQx!Fa|hQc zJ8Qo8n@8!*BfS7GRMt8irrU7BEswjwBAX48aj_;69m4&y!lBHdm&9+_4yBa-uY5yq zcqe@IH5#x;$rILQz2KJ5JY|oM1Pg)6J#?6;>(zcKm6W(j*3)8n$Nu2V>tHPk8cg(7uKi6T-^ZwVfEXT=LzfNiQ=v|t5qizc9IstbAoq^ z>u&W`#a}j5TGIMBNL4JFyb)Bh&J2=FA#9y57ym4tytkq3M{N#ay}Jv<-B#VCLf5~w z#e{cXo*=TF8KQCz`4V1g6&JuQEUgCO(bE-Cb?4|#(sTd(Z*Q;MN_d1zl6du1FX`)X?WIM8RTX_ivyJUl%Z@rK_YuClwoD9MeMnW9r&3NN zJZMU_czBkVs?0y$&z*2`;6~Bzr?$V#6REF1;hDu-MBfWXRX!iuDE$amyeSt)ug;Jj z2(p%pAzav;Ctjc1ELkzTpKk);K10WfTYf*6M8BW&zxKp`Q;6R-WUB1G`Y5v~o!^)# z=4;1E_g$S_yNGaLXsP&i*Fxpy3`N)RgiWFcdItMl8H1Lv8jt`L4S>1{pMtW-W% zZuy^na46__!<%^xd;UA}!0+FFUee1@)Cp~t_?|UU-67ocbA-6-Nk^4=w`qPm2p4sz z6kV$HYA1O)Df2sDEH3r zk=l~HOgq^RN@tfyp6V=8eI)tM-Jc1E2JH6D{^O)7Abqq>y$n>z1N};u&s7DGzMQmp z3;6hLR2hv8Rc-u8{=mpSbwZt4@1m4Sg#t~ zJwa77tvOscRq8gFePUD`RXpKwE51S7KHAbY zG4qvI9?|_+i#E71LO(-#=_c9hFBoI)AZ6_} zpXDka!gfo|@c8|gl2uv5{41&bi9ycT-^)?DW`IKaneHdA&i27_=>_H8rh1j^#J}@d zAg(d{rOXS;QC&gu4{=YxvC5OG*#33O_6JEnZ3@PHuYM{mGAbmEB7J`n+2ycAnms>L z%AKP9?7S6r7;r%nRdK@a2i@QNXx+v2`sfdeQ)xJVA)P;xo^s{(?O~2aI#v_b>g>t> zmOK;n&Saw5JktMv$=Hukw?sZ78)b2{-oA`rS4Y)}Z9KDa0AX+azHGwrU1G)lESx!) z?lZJ`mi100?s<`kg$ZX0Gq`kaj$XQvAG_JM3ws}*#-n~OEmNM8%=&7x=9f_h3mu8*bfO&P%Q_Bepwq5`a& zNcvH~{%pZL7iij1fIftG_6=u7=rfJ%pXl>ZR#Q~M36{iCh5SXcXx zqR!bgoVbY2V;)wlZ`Khp?NS;JBwX$9#MHNEiTlG9_+3u=L2NktK2uxlza{N|nrjHdqClE5bJvVl(N#n^KctzY_j%r>?FQs)<;_GsDpg4KMerW!*2#aX^Jc53KyxLulv%{g=*^{ptVWQ#6TYtO=4Wfbo^yejy$Pg`iwnS-56Ngw}yG`L}x6})*7 zk75DoJ2h*#UuOF7yX_(rGsr*7>GxdaM12T*PH$vr{5IKjXGU{Ai8gby@#P%4?>;hy zNgtjQXDrP{v*~0%(pt!}I~0hM-{s;O`u4 znnL>On+@!DM|*C`{TzHw{TETVgB{dn+)C#>{O9jtP(}^A*w%ov{+N$nssD@5?qajT z?gXXHE5yDuUa1C~*trE7Vq<&}E{&r7V^BHkC@T_oKPp5W8Xs{?8go0>Bs%sgq`1i> zA61ELYorcT1r=cprO%k1#0=*+fo4Vt#*L)&`?W<3mJ9{Uh$XnFAKhR0%w(_q3t`&+ z6F-tnEhr(Z2{Rpv^h(zqcA|y=lK1AHif(p1_`w>rt;0?FUJ* z%=_p!5U*{k+jDZhOBFqV_>9WF*~!kz|nU;EIHJ(>3g{Clm#3%0agPjF?c z`(B1m5vy>5FX>C~otU1+R;aqM1S`YIzsN~X#=lR2<7bO;N+j7IdU>;RlLQz_{<=C) z|JOHoF}*$BFi_#VFICMS-eMug3?s~A+ckRL5EeAW(`tU*BhxLp*AhvwZ!b>C%h0(Lw zpGo@~hNNd=V|*&v-wRl~p&PhWv8fnC@*S^V$vkaBSme_Ac$eni^5#v%lCu`FPxtVc2v%US4^MeAk19QJj| zP`0}3Ox!{C;Y;CiwximOE!#N<=Mw&BUwY~!a#5Y<<7b-x_X>xzqBcK+udQ5!>q))> ze-C2kB}Tz_{-)qkTAyA;3}MHHWCag)Ou^v_(x29jWszqd1)swd)TZ>HO|k4&XkqZt z%2d4dul-4Meq3bGAT`K9CzAKb_(WE>I$Cr{&%vA2pD`B`*aPVavG?M9JP||dXUKH6 zLF<9IGCLoi5q2*f&9dvSi{EbN;xrnMk*E8!%&v8!?(l59`%fM#`>^=U!^KM94D3n$ z_usro=ATj7z_@g*Nuu=4$!y%-ok7ic85lt8%jC})Z1suKhU@dPamXyvw<9vy-{g5> z>*_r8olNpcab27bJ`<-_6rcv}2QL=!Z1u1{u;woLJQ+*pSBrMcGJ6TQClup(k{^?0 zkz8ZUUf8>)0N0Nq{d3?}s6VOAHzte#7f~*}39JM~xITYAs1LMRAs70MUk1%aM!Z=Z z4Zb|c>e(GE zr^;^$o#fFA_)!I-PN$GZj zDgb&J@>^bqKyHp)_%C=V?94La$t^MHr^tmx8YN(~$%OA88UVV~KPGJoq1|m$K54oX z%Er_97-xd7xdqR4_keyq)#MkoL_@^|xuAQlj(kP@mHlTh4Z6RO3(i*#K(|4^WvAZHgaIGOAL)4! z9-IG=IqS!R!*98eo_qidR{fSWEt(0TEpnl|^8ho?< zRA_o87uL4cg73UG{299#Sa4S^%sI0gil8k&z-T<|Z;}h^taif%ElnOh#zEdCxiERs zHb{J@#dole0`(D!@9nl3Zfw=zHEM=JP#yUTAF%y;l?zY)+X(xnwc~F_3K)=X=-tK=n|$Fg&FY^tYMvZ*=^DpGfiDUzdUb$zOMpzdbab zzF|utJKc!iqagzinqTd9E``4%jrhP^85GHByh6*teTXsNBQ6*Ql6+j7Q3^JuCj3+L zK=?xP{Mfe~a-xj+gOS0YPwAI$E`#NF4S53t0hWPh#p zDM+FsY^zt8IpGb#V!+*L5@i$3pe)ElD9Nj}!ChRNCb zykuTD{8~o;w`&#jYu4x2%X-5NN{?(=2If}``34UGo>P0T?<)oTV9X~b1j08OpUq2) zpeewV_np%XEGCnD-!Fpc)~0;Ug>GO&<7FZ(fp(=Pd`o%&93*)xH!X$z-As6c^*!L= zY`L)MY$^13Y0N8%10j(5`$O*%IG1C>`;lF$mGU>Z7l4-3jPEx@0!yMv9*(7hF}C zyFY8dRw|!6C<1~#9r)_2ZD3$iityEL7_?68%@tLtvbOqJGn4-b^G$7IlcVaZSIVGrm@`^Dl^sGZ({FKu;(-aV*2&vId!tvTN`vnwngE*ApL zmqAw_BmRK_4<8h?K6tH#sVRE=tb=_aeyv={vd+W%DSKhg?yk7bna)RUStve9f#Nlu z7}10HqW9A<WE(n%jAnt z)hAaxddL9-hY~+$*+OjJGFCk0<$znMd|ui@d|o|DthRH&(}YhAU4)HI8Djco2UJl0 zEt)Af!KGG=Z*atY)E|Mj6?ldFC6*OAV?#u$V6ZX`HE1qH8M@+N(x)8;rDHbvaCG|W zis?P+e0MJ${nG^KyW0&}DDmgqGf;CxA8<2rM_oEU{Q91TPxiWlMS&|`?UgDBlhUz6 zl@zv_xM6oHpSm&~lZOPth7oQ!Dva(AZPHQ8$s2y}b;XgC|HrRXWnM;lDAsJ#cR@ z>Bon2vEl9>7{j_^k}KKk>0JD{bD4D90l?*7$m3FdlnBe3yOYXp?D!S(+TKB|g({4dR2O+hSfUhjX8jKfL&I zT-IQXRl9;QoAOsWmE+FMmYCcp7*D=Z2=ouwYpNBd&I-m>;w$LAD?^L04p^xfj3LA? z8UM5tV?&Lxeor7SYgGtSj+dg#3?qD*9fu=_F&$2=kbeP5U0YfWd2 zt6~^%kNmrhqW`n9#!tn;$W#3f9~R@0-5S`QVn}v&%{H`(_ulK2c}T} z%HCz-hqg(e9PWv|1L=HeolU+I3&H=27v7Q5e0Y?NYsKZ@bKM*DeaYWv*IfMMRSoWG zKA7l1`t!p)4Ec@_yW1DX+SB=aXg)sua|~vL_~Csz?{zwqhhaQ`Wu`A$InaIkyd3;7 zdM#`(>w^AW==|Q2j;&>(P;}A_KhgXvVT&<*K&5y(*b)Ddywq7GW0GK-~CE?-H(+#k%GjK?k{d1rgHqV!hVWHjVW#Gyg< z_?*g@wok_Ta3itQ-yS~_wm+DJDT6;XeE8NG7g7FnNisGTw-+~s+v7z_@4GV@^R;}$ z+so{+J>df+6Zr@v`_n`P zx-NMyb{3qmlFsYRQx$kFv_&lK>5N5$*RN3Ea^bW1X(Dkf39smqhP`~up(w)zKlY*X z>(MkUz3B+{VXnBBA;rM#<9rkgeE}kH~ zI%gzai@3xDz`9o$;B3O*ZjHcRr<&MvriaFa zFFqfJCWjxe>A%|HN-Dpq&2Vfqdcal~>EdR>?~aeet2@uLoGW@5K>6S8jl#zBhnSn0 z0Zt=)M0+%j&^o|cU;e-T(C#=Em*s6_9#4$WgVKvECgSE_xolm$DLPVpck8F3$$%cL z>plzIMg76wo{KRv=X0yeY;eYSy8r#0i18WcgYy0Da2VMK&wYu2-JdgHmCYJ_>reI} z_i?bfUn+Qz51;q6zfDda2Fv?ThTqmjxRUbMYemD=g)?DJXbwhGe@0qF!)d$8@G>V0 z2UC9;CXE5}++koEmxep$(R?W%53_DY!30GL<|L6l^!5b!b!Y^%U6+h8WdED+Wh~tI zG79{jrlL35mu)tUf?-u7VEyt843DGvqZ0`a#tnpHpC}Fx;f3YHz}#~HeB73eJ88UT zg$#xn+TpNycMclUcz*vG0iX^5ou0XPiN4==M__UVlO!0Ac|i0zBe zjJ~h8q7eTQUXnBbb~r>pqND&*Cy+gG-ym4~X(*(X z6rcz7=c42xlxrpHjY(J}@eHIV(8^o7}bM!<3MVLQ2ZKAxxY#?6t? zCp`wf(!O<@d(;!$H2AWQ-G1ZzLmbO z>(z1avqTO#C3zT3^*z`#8OBVlfY84sSUiyKC&W2$D_|G&En9-=wEq@(%ma<5>!CFu z4?RdfsoS{#_`NG(PjosCrTXK2$7JgE%&k0-e+P8IydW%a|VUk$b33aefwgKxM=)S0F44ipz z23BoU;V9Z~0~`iHYQ|F#ww}X5YZStyh)~ep@eCAwZ&Dm4;v1g{fOfL$ur=xyh7fKI zmcpNm!_cYaGS(1Zwp-tButo0>oSD#wJy#Kb_E7+gyLAB4N1wq);d z6g7`3gt+h!m|CZT{}!vUp^^4yJ`6s#Q^V7}NAc=m;=lIj4b$(Qg8E)3@b!L$&^)C# zv~9TopK~stoa%ovUw}=QAHs#m8#p6LAzVDv4esB11*y-T;jS?Hzc=3ScikIUkn#?- zoE5^12^4R3PczIh`HcAn3gJ+QExe6;40Dfv!TvhrKepKp7O%Swt3BUivn%O4ubd#( z`7CVd`xJ%2B!6b~77;Az}a@u$aDY)|@Hi03!4Lzurf^lmlAI?{bYuLt6xV>cU0jrU-0GtyU2 zUKN|Co@uyZuflFRWWSwoQ4CtGZs=1|hbey*!oiU1;>&MC#L()47)AP2i{l${vdLcY z^v#2K<%2>fN!A11vBr?sxDS)Qk^ka8GlvPDLR0kiSOLk)f7&B z=3vcd5%WpE{JKXU{?qIS_B)Pa!x{R%5eBgF{tO66IFBhc^_kA;qG0?|MX>Wjd+NK(F&pZ zt0zoda|Wy)-$R^2{+&}iU|q~v@L2W$_fDYrQe9kWd{0Ap+#}pES|QwTbb+^eN9q3V zKCYzvU(;RS>xzSrQGW|dl8G;V${xx_?}Rta*KtdhLYV1b1!kVBA$|5WR25NwdmBSq zYbK;Ezl<+PeiH}ifa8`K(C+vptgfQ@XWItKOh$pvu1na7_~8kseu#y+kr0w`1>ciA z;ah#Uxh4ga3764-okBSJpA%H|s(@iNXV7i0LU{kU2Tbu&!SS>cc(XwvVz{2GuG)OLDdL_kYJ>m@> zKaau~lAnl$^!^~(6l!mXu=?s7oYjrq3%CV>zQsIlSlDlj(NYLkItIY^adWxXcQw>m zALYWYfFOunoXBnX_ybdnX#MHa1IE6I=YDzq#l~NBet+B@!Y$`=CLPe#qCf8Xh-2OX9RHno1RF?c%H?vRf9@e#S8%##2_&frd7(N=FfBNtwI`$JaxEH2nk zOFi$VoZch(L&u)8xdF2@)$8ubh5ZHou;b4xZqyb{_1QaeVM@Ie#=M%zozK%!&$>$X zbScGhem0#8km#t(Ps)XZhQ83>bSgJEM^}ABB^MmkT_8&f&y3U;$sV0#?*)~m6FBufBefaX zC&|AMw0KP7hLjkp>!^IAk2k=liQK1yhU%aaxnLlAg1O-Yt~kP2-H+_u)Bd_a$=qnJ zbBLLG3E9J9gB`#*Z5X$p+*+;WC>PGZwS^I`gSZV2w(9slDT4QLYY3_C%ROAe(s6>}j+<=7)1FZqDk%2U3K7 zCv0JC%Rnx*zpYwL_O0_ij!<=UI5)Y#N_~UuN%zQ4PUFte+ySMzdTJG)5qq!}XW@=r!uUPTJ9ey^9<-Gh%)l#x2K4BD3BW?^g&fHwBKTa+f z4t9l(0i(Iy=IzxN$X--v=L+*$M{)6e+pDh*C3|Ct8!Sm2!?_rnt9>ZHm!2n-JB;Vz z3{2Gd3*{8wkoagW6S*_7M(S|7KS0-McZIKxH*b-xO^aH>~Vu-2Qx`H$CA&)+E* zrt0}ZuEA99MZT_jGtH+uijPryYBINOnVx$4cDZoirZ>#LK8Z{JYoOk+OfC%i>j~c{ zPvF*Q7_0AO(0xKX57>2XEGIabs+IIT=LC1?e>|F7_`_7KKaJvnt#gB#mNDF$ZD#6A z6X`y~!W{w&qPfSOX6n&oFTEyuz=no#+=X!_>a`2#J|)H*x^a`Z!wN%nFxh{Dp$mL& z6U+V3HBf8Q{BF0~2SP$7bMG|u)y-R|f3v%S#keV4skNT^!EU*ranT39&Ya9$d7!6u zCj0%lbw04hXEHary}mkz@+-A`;J~Ckfi^i|q7n%-Fi`D7ILcVv6@ zV44pb&pE@VZc*Hp{TAw?-ef;z&XArQ$vF?{puQu>g&A+0V24R07qG2^x|UIYoOFcI zg(J8H&n(rS$X@#MwF3;CF`Vmr*-9<(kPBaV2Y8-6j9XP?t@b1NeYm4Dc+DNcMTOX? zkDAhb(v40~v3~&fslT22#>W)FDANWSKK0`sh@I6dpQZ>|$sOt5BZ9kp+g?57R*KO6 zmNjS}?aOV=p_?PJA4}eLgu<@@Z6Klho+$E@7CM@9(`&DG9YOs+(i0$eJQsSvSiLYsF0}vK1#HK}a-$CGt21dl zH-z~?^!91o@9yo??~(S0?-DruW(J2*+UhMA=zg)xAJ%Bk=Gv~;RR5s$)_r3)SQ9sg zOPk+To%xLH`xgViZBRV-&PqeQ`y0uZBnZ3`6S+r!e&9gbk9;NuL%H?>?#{GtILS&O ztWM@&#eyX6PP;F-%0VG)8^K^a{rJT76JB>$2u>Od%si60u!o<}nDoz;FE}XHOXl1x zK4Z8G>6_<*;E6Dwv#lAKwsGeFu^RaSwSFl_DUgSzS^T=#q1 zF`e|$es<&F;mRf4J>wnNmT;GK<6yDL39= zFRuMV`Xt52$PFmv>c;FtFVa8n%A(-;ffDY$#sQR*zUmSm3DJ@gF6-DqOnyiD&zh0& zd~-2py0QVgl6^0$?MQGJiaCc@B1S$V`(NNlXctq=Jx>r(N%qO_6(gZ*RWbK-V*?sd z{v(qj;g)*|*Z;{uw4?f#ZHa_m!%Da#gAU>`dQWA2H4*|7O1OZR2e6s+&o6qBFz{_L zC)rw$FJ3DI&Aubx-0>nVAOmsRLwaAEGz=1#6mmV%j^I&xzxPUeD4bYZz-`=p9PQ32 zgzZNML)Phh?)9&){@XA!L%T`=8zO zIpgRvxC#_Pm&1c0{bW98yYLh$sC=hugJJsBd`_G6EyH7EA59npuCMaA{E=s|pq|bj zfdk-sd@lDRuo1s)R|su(_JNjD|HsjF$MyVu|AzM7!zNl%O2+Gb@B0-ZlI%_PChLRJ zyEoa2B3jarN~vt|(mmHmQCcFjNk;ab;dj2jKkwtU?(5!j&pr2?=Xsv(vaj>&K@o=X zGt8SE-V-K!_n-yB(f)0A6j|65h0NvGTd)!_-!NzpOW(R)7Iv^5Y_%{y^F=?lqGq|Q ze5D5eT^1_#P3XhE-CrPU>#N60644$y)0-J<^CDAqT3Wg2cvWD8c}esVrkT&?cTYJV=5?eNF<y+Y^>E7&PY?$m*dJ7C%iuFRAu^wP>n9N1@ zDdLrs;z);~tj2DutZvNUu7i}a_J&swhv$KRc(#8sAXKK<^#($`vA#&9 z7yB-rWQl85 znM#K}vg!%tppEu@=*@A=sC2LF;ObkD@IQHUo4^vKaGAmQn=qgZqtM_0K1=@VW?@W#l!iZ>JQ`FQ3S&_C&~zCtZhSxLyh_O<)#gc-_7bZdEG9z+&_l ztq+$y8B_$T@O*cC%Xs$AJ6zVMrU>G1DMgRO@l11Sxa>rH5sbZ!{s6NHEHX1(c0cka zgyMQTKWqZ)UmTA5^(I`${*;d$$Hpo4%6_fB4O^}%#XGKJn90iBvbxcgAmRGxndQs8 zuI-d9e|R4b#Nm4I7{ylH*&%zW`3PR_Q;Mh7`>=V(x65oA>Y)kG`+mhfthIK#%+bCc ze752I-5kMwxNet4&TNG9oALamF`SLl-X@#u@&x9rQi=|~-mLHbFq!YI7Rbl-=5}Kk zTkjDj%m45c{m1CvST&UOoUm0k|Iu^sn64BJo_n#OsY;njzgJ)|2EVsbWEb-kvdpD# zq5lx9zq*954(Ebo&;Ndg6%JSrD0L9Cxwu|7V{kic)JA_!p(obbTP@R#D{rijDY858dG|uaS@9mM-guQPAXc4^#OqUj4PcqO*UAF! z{sZS{j+}@Tc5F4CVz1Y`d-KN_+}E@w0obdqdy1VCZ)LW zj|p*fI!-!Y&;Ug_;>)ZJNpMyoNpjPL6=jHjJZM0+?TjIkvODCW|Ip3cfE1pOB2DK8 zLeyFG2U+WpzW;WUS?;6Z#c{+JKh-14=Itg=Dks9fqlo9rGaw_@>?McVro!Na|M9gL zlak?)WTwY-m=cHiYntZ7q52?kIyVpIL?OOwn-%G59YfZ?TM6+yFkW@VhSZOZC*Ler zgBIfB=GNGfp&Js(_tDFsWf#8xy)AL+o=mzs2f(}oh_AEiNCqrBMhwfwfqf$8_w2JF z`C7+_rl}8f!2YFuu_AjWrI7tqL*W?uN5fJq$&%nC^3-hzxMgAfOMy8#kDPc{zERN6 zL43K98M)_vgzTN;2@3pQ|1KuPU~)X6qg=rSDp*@@E`D(yAoX>gPt;x35JQBBC9Wt?fEy|WSKRr)E z?|o&rDz}IwyE>B1c^8Stpf9Wp+X=%h$gqAnp?{{C2s{BC!2*sxG-SJ(=9nD`Fd)FdyTt9#J`wN^S%fv)hdrPp~o|BZsAuCs!KS z&|37*)*FyAza+wYslwAL#@1skc_wxL5vfpz?THX3r8A}NXH0Lp*CO8ZOeYfgGM4O0 z!hD6rn4cKik;JV(M1~F83yyQ}{|#+PQ`7`gK#~xSrb3MSfcfNEu7ebA59Tud0=>c;5-#W;`>)k|CGBhKc9Gm+e$g#cCQ=bHU3?;tXL%?V=%HuOFvU2N6 z(yw>4$M_jAxvks7{2k$>iJ-gPs2~Cl1YL;`FSk@zTy8g z=BklvvnPiYq02193%9D13nRyo zwi5>-4)Go`4>dC7%P{iWA^~0wLI1c?m5kGuk&$y!VU^qe^9)e!iFl51 zRpNAfAh|O+9k%wyc#De~(O5>v^aaPD+y&!h?dqgD-J2|ahc(nO9yoHR7O6Whj?64c z1{Z9{*Xxig*CvsqJ84krfbp5$24wT}0CH_oItX@{?>W_&gx*|2EYD_uNjIFId=sMk zY$+MOBO6{=U_30ul(e=lB`1dGLWm*aH;$W-#aHGMHsKsh#q-i6r7?L{HI;O0zXVtD z{Nfa2MCvb3AjrE9i(mflJYz_-#`%%kZveg{9>VpB5$WyePlhbK25ZqC>;K%8^qMw_ z_!r)UlW0FZ=weB_70o0C>u*CAo;N;x#(b3J3rWvuB`_S%6OZa_kS}o|xo=wr^KpO9 z8(~A1+?`9>!z-XH3+=N*)?|#)EV4>|7raxI;+ByXa zBa&b+wkK|$CuH9_EUk2L;eW>}#DP1e2qv-nCH=7eyzEbixPHPUf%e)bb^YbZtKWo( z*9s;I({N|FI)4DSei5=mU@5aN@9RY05c5NYEiEDXcG_jr}toI!{Q=IV=T^bKzV4u|9$I z0-^Jh7%9iR4{x8T5CeKF67~vl((Fr4ykfaRjEh+;tZ<0OXoVvmw?QG!k6tQ7Z%&Xp zEpy=U+ZE!%MazW~7mi4^&i4G~0R{5+tQ0Qz9+hTA^x|#D6yk>eRtj5;k4kW-7ayLY z5dBP73b#rUrQQ0ydGb+(xE)ps1>#X@b$lP+2E5TuPB98Ta67#R_re;#I=?+@sQW`(FH4hC)<-wnEsNmneBT_U3C76{1Va zav?`OQ7V1ZoA*DAc*btah2Skmq>|b8T#8hP+7FfqZUIN6@%!xgoqY{xwkw zdew`oCo4pE-#|fkWRm2$-;R&UMSt?yHNuKIjz}q4_BTK<-=7%#P6fh$9g+%l8ygAaFyVD@TfF&WG|kPt`OhNSRrIiNt8lKRWO?p*Y{emkArb zCP;%m*z@E)3UTwGrNX2U2~yrM2QCj&h#D7`2=r6DH0!qm55@am=PePYzloQ8R2{h& zw*C7q748g7kOt&B@RF^FFI8VE%(G39{uMj$oGsY@q-8>|#}Vn9y*9nM1{~4nY z&-yMCg0R0?uk3jv_V+{hQlaCf1j&Du0}n)bRo7lAtS!d*GVRUh;PVY<)(GOGWGM;f z=L^H}|M#Dea{ic~pg(j#^?D)peX4Z2rW=n%|7Yp>b;7KEsgh|- zcmAtXA>MwpPIxvVRoWWbowwdmh=u{{g}P&@Qf1HXd_CfCeaEa5ZoWy8hSXuC=e9!J zvwO9mYMm@ilzQ^#7jXO&R|%HYMS@}GH)JZr!P$XA*Ih}{sxfxF^^`)KQX43&OG%PkUF~?+Gx&cS0|m3$NmAH)J3c;7 zAx3`*6#Q9|B)7HWU-A01=2gPpe@CTmHFkV1%G;CJZleeBM|VTS z@Y)H&2fGOA)UN@&|C10gLVb#`a^!x=v93Qa`Wb@$`ssqp_$bNznmaGTdN({}Zxt&4Hx^E?&e5wE#I?cYPvq2DgNr;kGP8nHk) z`zJ=4`rVliosIe~d4XWwFII9zYhJ?rX2rVs!k@qxsd-l)-g&A*{I+JEKyDwFlpZep z0`8yIKC^`s!)Phtk1KC*Q;0)yX9=nq2c2X&|+1dn# z=&$S7oGi3u-<75hZ-g0J(SI;LMY!lwEj`z6fE4_GiE65FV$eM)t$Q6fN8s}XsY15P zeW|9;Bd9*86f4V)2|9;sq)!8C-~otRj@d%` zxMr!h_H`JH?L(`z3Vu*Tq-bn5d3$o{7k=OpF{`cBWJ8@De&cNN4V1?CCm?^~rjdJ!I=eQUYpl(2ll zbLr#MbD)Cpf&odVgno+W(gMwM@EqHx?&k{k9a^P`H~FCX3;8n(a)hvq7HQ5m2}Jbo zjIGTTw)Ae5K0e8Z9(aAo)?8uPg{RWm`c~^;I6N(&oqc;Dpy@PIRvV;}enxv`mH()*5t6pES zg<%sPOG6%TxR3rPzYaNq#nmU$=9dK!_8RdQGjoKbfi05rw<|CT?e$Y|Qb?TrL`u$L z;M0cnu7_s}N7pq=7uhxFiuU@e$Sh%ZaFf)Wdjs6?{qD!Jgl3{fnPv>>w|QmI-yn?`=SiGUBdWDV}{`KwoWoPD+MQ%msK}U2pXFk zr5<%RVQUq}qk^)94QHFBbrwGy^r zNW=Mlw5RMM}}+P`cnhv{u@aS`KA6zxzp=VCVcmGSayZMJb3svP}^z zb*iQC%m&zu`fQCuqOkK}nKX0R3-F$$6gwHl3%=5Asn^^0kWY|L_S<3MW#&z3e!veH z*$LxeoudVKeoYF|R^ig0P;r#T0pXcBmt0<`@iEUs#n8Kv!tFgwQVH+CrAL_GGCoS^ z-y5WPP3nAfQ>Zw3;6Y*0nXA&$VX7QHBVK07A>mK-4ap1RO&9c(;<=%Rg{(7$QWN{%$~`}~G7W2LBHe^^lLyeUPc{(ylU@&6~q3WL`dOFfQ!fk#f5Z+$mT z7(MT{q_OJ*EEh07VV59`=vyi+dG!W<`=Eb#LxQkwU#Zl?=ndG9Mtqk|f>3BtDs?n` z3mfpdy+wlX*{D={)%h*RvHgC2f{-0lD$x;dAi!5Cwxt{qqB@pIznWgchbc;NMq8p_ zU0p7D&v*ux(4QY6CJW9@RZ{VfCRn~1&*#Od!Y%Q>RBG@DhG9HqTfa1+vFiirio<=F zjq~v&KTV(&52W!0)nJ;A{^8%pg-@Z6B(H&$aO^blpKdxXB=U#Sr|c?dJBj+~;V~f~ zu|_iJS_5`R5g(W6N1MIR&;rFyIMEmNk?I&a$L%yd<+u%mK}zvh=18hibCPx~-VGHp zjBorIK^LiJQ>*yBU?s=#{O3*OW3%Ynv`Cma0QrEo457_JChh$o27b6G#fyLCv}$fT zedc=vRB?RU%PC#;E{$qWNd)6Qh|faz(&XO9Xc?ZrpJF?1k&IT`rPA7qNnquQ@d+0~ zSDZ+tEv`pFt)Eh)rz!n)^ceDECqQ0*?0>dMqco4x+JqSBkNwSe97Zo@Wl+903O=Iz zz5h9aE^N-CwhQ;dW9;t-)lt;#?MYf*wF~?yj#uO;nz1B@TK?P#^RV6UZWPt~ltZ_d z?S!BBzja?n(KE|(X+^>=P#=u(xEVfl|F@I$rPDt6?5-5&z4fLu15Q%cqG;G|uM}5S z45f1ypQN2)6X2sY@}D{lqvLPq&>O~yFw+F}#nYkmM{_Pcu8|BAv{0YT@uoq2PSYPJ zlHj%qj_(Q|dL{K7J+t))>}|($)@pBQ#3JOzJQ{a@k-ycTpal)D7Sx;!`#jdeYF(x%7A4EoeOwDq0+OrJmtA^lj`TFk2Za z4t92=OU`FemD4XEZ)m7^b%6t|4b7yVem?^;7V&TuPSpHH2G#lA0LKxpviV|Py7+J= z9qL>S;Zd0XxwapTTy}!0n%{xLX^3CC=1%`y&!!h<-+@s4p3ckuRO3}Hb=_JD{V_k* z@}E1c>5xYcWA$ov#FG_kyVDr2Tv|J=8kC`k_qgRo$7bfx1Fki&1@S@Ce!9}|b2;?G z-G`uq`KGt$^`+Z9bLoz|ji844vCri$G-iJeP3iL({3eEqyR`aJZjnQas~VtU4(hWb z{ixhFm#z%F2ZuIeJev%p*LR$vF80OHg#GLNjZo*iXK3A|%kW#m{KYNabU=>_bZ}NC zR3l!*6nyE95BaoLmv~r?`Yoi&k47!LM32mhhA*fu_kQ%H*_|&?$u=6+>EL>B@}cSF zXXw28IFM;$yw=K#+K^nj_d*85eGe7={0Gra(@)U$eixzZW5feRd(iTq$7xdyfWbYC zuV=f_py(7D4jd92F<<+PJAF7ZnTpL9;lH1Vhng^mK8#PL(KEB41@-AP0~uX(?->2{ z?-=-YL;Jihp`B!DbdyU8L?iyBd=;U$Q;tz1k_4sBs4suZX#VbFbXQ0+h>l8epQcD3 z+o#jkq6DbM>+dHHp-cTTsqwa0n2hURdDWZF$VB-tI{=Gued+m)q%*GP(9K!lFvkO* zFB?q*wNF!rOFLmGUjGW?=HhQ(D8V)}m`bqs&y(5OmKf_-8YtQx_p)@&xOKWe1GRrW2pU~Gc^9p4q&+6 zq@Sbd4}OMTT)GDma6KC2`OyTYbF{V@`7?STpZwFYRCUKix}bdr4DEt=lk$ml-`~qL zxStYqI%B+d>~AMCBNp<$74&Qbqjq(Q$O= zfGf1+NCZ5_c8`32`oZcFr91-M^p)bwyJP6_@(a`x_0u&=+@H^np}srLQ)A~n@E!m6 z`XxV_B0o#5kniQBgHpV2iTjaoh87y{h6gAgZ8Q9+`-M}~Z`^h`KM?Z)dyPR|lSji2 zgh1p7rC4}m41GXzXx4_cU^5x*|IfbE%KijhP`3_>=c0Ty45xo_zvwhX3E!8X{j!5l z9iK!R@$3N9PDA74<1{xHJ*f3iL8>k&f-oVyL1 z(f$ZL)s3#6c8FHX>%boIfTzSxw9lo3G|S}~blH#iI}aP$CPmS9gV&(03>9N0+t86J z(e%=*cOW8uC4AdG5*e?@`m`lOuO66B_N9#E4cB5r*PjB_-^j8V0C6?%3ue+@AZXS zL|LKEx<9@GA08n-YWi)WA?v{I%)s+eBjVFu-6q$LbYS@%F2m2qO7ZW45(2L}u$b0- z=#2KT!Sxcd)LAT39=S^wkN5RT&&bh!%a2!gc)*XQ_lUt*J$ChD3LNW-`A)Vq{>Q;Xer zn*&GjJos`&Ir(%*i&an0gJ&oo>`FP&yRF4EQgY$$KeUHZ%gLU6Eyf#j!4cb64^*P-=*SFc#_^fmxr)4gQt33WF`8yG|u3O4nvSyRzXPj&Ev3IkBqIVr{E)!58P_l~x5Q{-wpb zyv%_t>~Hq;O7f^yo7LUQf-5@6_m*Bore4rtXYw;(3w|#r9OuJNmraW~4!3YVLf_sc zbNB1A^C#0l8|Pz7dNp~ep~v?9NQFL~G2VsqvC?0Um48lwB%F`S?)Ql6LOpgrGX(-L zzIY(6nw0+0Wv!OSpcU6c| zkmZ9k*^NQxpbgh^sNo&5xPvBJ`uQAuLjT8aqdR1mh9)!la1MTAyO-4+(oa{D{cJi1 zo!?`;F|mw<>1wgC5vQT-2kI|7lwSjFrcBR)St#$i4=RZ6c5U|HAFh8~56cu4{zG{m`2n9Fs>MDlPeDEQ|D{}e(ct* zh%B{LW8;2agR!^JUdXyZW(KRUkg{TUeG&JsmTROf@o$0fs}$_A(Z3acm7ICeUQpGc z0#fk&CN8~7_=)y{;~Oi$Ga3C!L#~mYxBe7lZYqNiJkK4@xlU9w{uONMRsuDr(4X_* z2ALkG!cyiIg9rLs44xDcjghMC`l~{Sk4rHE-54dgH+j&9yj3?;Ca{NCV8_&l{IfHgtu3fVt`agX1b`dhdwu9J6_-JRY+nQ zRhaLhB5=5Z{-gNoq}RTG1!?{zFa-OfzULb8xBFW#zv>Qb%lzN`TqX7%?FF$TDj_uy z@oWv8^!V_*p!2m#=yn9{q13B{d`7;6kL6I0|Np4%I`RJguRtgAHXJ&G_GG6*QeLFO zh7=S*ZwbG*rI7U3Qf1$(Zo&)f|B0CEkVWA6QMZ|V>2JomZQ2gav$u#g@9W4Hr7>c@_rpij$K&&A37j-y&%^_; zV;JV6o_t6GrW&$S+A*L#82KMYKOl=&8?foV@sQRJ*L(H@(j(7+jaV56sTi-9S3e@d zZH-vZQPI!|_5GG{b>xVpG5d2R5=urO-s*K7S*^hDAx}a*ey?V0J(d4~m#)!F≷~__n=cpe!Vba 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 z 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 diff --git a/client/lucy-desktop/src/renderer/public/vrma/Relax.vrma b/client/lucy-desktop/src/renderer/public/vrma/Relax.vrma deleted file mode 100644 index 8ab2fa1b8580f71930768c0d27d368f1a911f280..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118448 zcmcG$cR0NmhEEt0F68 z?-dz|tjuKmt~;;y>*b|h==c5PuddE{T<4r?pX+(z8!fi(LQQwy$AL0 zH$_kG;o%h$5*Qq!XEkh!o_mItO+$;S`X$GzJf)C zuYf*O!BUd^pSpFKije$Ydv$4DODf*2B^B@2l8Se1NyU4%q~cv$Qt`emsd(pBWylKl zZfV7Px3uEDTUznnEvHRV7|U8*RmVx3uEDTUznnEvtC%mQ}oW%PQWx zWfkw;vWoX^S;c#|tm3^}R`K2~t9b90RlIkbRJ?baRJ?baRJ?baRJ?baRJ?baRJ?ba zRJ?baRJ?baRJ?baRJ?baR=jtcR=jtcR)BX8@2n>e@Ea=+^$QI6-i7q=l?McP`F|%u z`kfHKmA5|}M3U(Sju>*-R4U&iY>RIW92Fn9N{7ZP~MX0)rf5T8H{|yTc z3@rem?b)SofvS--~Mgr7009@Vcwsu`tFzg3Z{F;xonTY;;3O{Gx36`!ho^fO9T`Tpiy zWmtr&OY|F588)FRfq#Q4!zxtmqTis(unSc!{2NpmmZ9n!{RUNrZK#UkU!zn#ke?<0 z+YPF^8b5<@&%arzEX(+ff!L)CBjHA;1VE+viM+LP)^TnhDD+g15`Db#OmL*=!lP`|Ye zmH(AO{nj>Ap7b+HC86KQungN!N$5AIGHgS2_xug24BJp$Cx3$~!!}em#9yOSx35yt z_^k|87pk98Do(#ys|?#varzCa4BJrMwtj;u!!}eGsNbN1S$Q=rE3c+y<<+!Fc{OcPUQL^nSJNit)wD@@HEmK}O`DWg(GfLE|QG!R>zdV>S}dN?@Q8%m8#B}T?r?~V5g z4#EB?4oQ)Yz;E&;FE#&qwTaI(9lQd3RGm;uOJj`M$oHS8oPSL!0sQ@}^MCVA%(2w| z*9U%8f$|+(YO=)S=MU*77A1oEulbh7cxm{NyTtN)Ui@Q#%;I|z`eT5p`S*zb#{hG) z@8R{20hXrUW7!`ABodSFk>k%1GTC=O{d0t=^t)I5Il^3mHuwu=m!Ujk(-PnQ<29tl zmS*KM5UJF{tRzDH`5I`#CGp_T5oTuQAmgS6a77~kcMmP(Zc{w8-DzKap z&cfWRoDt5#(zKir&QfAh&Io5Ila({VVYn)1gtNpTYOJa*y(Wfw1*j@gEH0<$IS=gH zb>#Tqu_OQfkgxi!Z`fFQK%gJ~Ezn;-+u^$PjnGrp=RrswM=FPZuM%f9L) zdcJ-^CDZ@<*pI*Q_wo+44-EVPi`So$-}aOT{0PUCRr2dz0iIqHyZMEL%KiU&HlS*p z{4?51)ngs&<>@C6#U};-ds?9C#{4s9Kycthe4_9p57nMk+i~y<4fXf>c?s1O|A*nS z*HASMewb9oB6w~2J|S>|SFmmH*njq?>Z$!RsM?h! zNGG%}_n((mwdwvD?dugP_mBq%{irxqtMH#0rI%K92EUI7emBiCY3(1 zstxjeLfN*gx(oj}{vXTy#HI8)s_gw2pHk+m>OcK3_Ae=_Y@tLpWgE1rjQDZ?72D&N6BDE095 z^Y;w)!p6lgNoUi}mcwySJ{BQ*JypRSzmWa#aLa0#ac5&AOJj*8{xj`tJY01r_<@7; zAG8BT-oLk0ii?r4nWcrX%v{ph(AWseEi*H`f|uqe`!_!al~t;aSc;#Djm*N_+|oj3 zW?7n#$-nuOB&f1^n46hk0dG>WEs3SM)Y8~OW>Rv@zoeo%my=36W#WxZC8lN;_(|2+ zNFtG8sUwk?{wyT3e>O8v6=(iaN-EL(k(kVX;`pC(GBGkSH

8kh&WhTl_|77C&+Q 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 diff --git a/client/lucy-desktop/src/renderer/public/vrma/Sad.vrma b/client/lucy-desktop/src/renderer/public/vrma/Sad.vrma deleted file mode 100644 index 32c9197b27e6ddbd40dc904eba0b9c63e564f06d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118448 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 diff --git a/client/lucy-desktop/src/renderer/public/vrma/Surprised.vrma b/client/lucy-desktop/src/renderer/public/vrma/Surprised.vrma deleted file mode 100644 index 23b8904e7165ac62f100186324c50ceccf41aca6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118448 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
-
-
- - Lucy - {!overlay && {error || STATUS_LABEL[status]}} -
-
- - {overlay && } - - - - -
-
- -
-
-
{ pat.current += 1 }} - title={overlay ? "Ziehen zum Verschieben · Antippen zum Streicheln" : "Antippen zum Streicheln"}> -
- - - {speaking && lastAssistant &&
{lastAssistant}
} - {!ready && ( -
- -
Lucy waermt auf …
- {!overlay &&
Die lokale Stimme wird vorbereitet — einen Moment, Commander.
} -
- )} - {overlay && (ovLinks.length > 0 || ovCode) && ( -
- {ovLinks.map((l, i) => ( -
- 🔗 {shortUrl(l)} - - -
- ))} - {ovCode && ( -
- ⌘ Code-Schnipsel - - -
- )} -
- )} - {overlay && ( -
- {busy && } - {error || STATUS_LABEL[status]} -
- )} -
-
- {!overlay && ( -
- {busy && } - {error || STATUS_LABEL[status]} -
- )} - {micBtn} - {ready && ( -
- - -
- )} - {ready && ( - - )} - {!overlay && ( -
- {inputMode === "vad" - ? <>Freisprechen aktiv{vadListening ? : null} · Leertaste geht auch · Hotkey global - : <>Halten zum Sprechen · Leertaste · Hotkey global} -
- )} -
-
- - {!overlay && ( -
-
- Gespräch - -
-
- {messages.length === 0 && ( -

Halte den Knopf (oder die Leertaste) und sprich. Lucy hört zu, denkt mit - Hermes' vollem Gedächtnis und antwortet in ihrer lokalen Stimme.

- )} - {messages.map((m, i) => ( -
- {m.role === "user" ? "Du" : "Lucy"} -
- {m.text - ? (m.role === "assistant" ? : m.text) - : } - {m.role === "assistant" && m.text && ( - - )} -
-
- ))} -
-
-
- )} -
-
- ) -} diff --git a/client/lucy-desktop/src/renderer/src/components/AuraGlow.tsx b/client/lucy-desktop/src/renderer/src/components/AuraGlow.tsx deleted file mode 100644 index f1ad2fb..0000000 --- a/client/lucy-desktop/src/renderer/src/components/AuraGlow.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { useEffect, useRef, type MutableRefObject } from "react" - -// Status-als-Licht: reaktive Aura hinter Lucy. Farbe = Status (hört zu / denkt / spricht), Intensität -// pulst mit dem Sprech-Pegel. Liest audioLevel per rAF (kein Re-Render pro Frame). -type LevelRef = MutableRefObject<{ current: number }> - -const COLORS: Record = { - warming: [120, 130, 150], idle: [125, 211, 252], listening: [56, 189, 248], - transcribing: [167, 139, 250], thinking: [251, 191, 36], speaking: [52, 211, 153], - error: [248, 113, 113], -} - -export function AuraGlow({ status, audioLevel }: { status: string; audioLevel: LevelRef }) { - const ref = useRef(null) - const statusRef = useRef(status); statusRef.current = status - const phase = useRef(0) - - useEffect(() => { - let raf = 0, last = performance.now() - const tick = (now: number) => { - const dt = Math.min(0.05, (now - last) / 1000); last = now - phase.current += dt - const el = ref.current - if (el) { - const s = statusRef.current - const [r, g, b] = COLORS[s] || COLORS.idle - const lvl = audioLevel.current?.current ?? 0 - // Grund-Puls je Status + Sprech-Reaktivität - const base = s === "thinking" || s === "transcribing" ? 0.45 + Math.sin(phase.current * 2.2) * 0.18 - : s === "listening" ? 0.55 + Math.sin(phase.current * 3) * 0.12 - : s === "speaking" ? 0.4 + Math.min(0.6, lvl * 1.8) - : s === "error" ? 0.6 - : 0.32 + Math.sin(phase.current * 1.1) * 0.06 // idle: ruhiges Atmen - const intensity = Math.max(0.15, Math.min(1, base)) - const scale = 1 + intensity * 0.18 + (s === "speaking" ? lvl * 0.25 : 0) - el.style.background = `radial-gradient(circle at 50% 42%, rgba(${r},${g},${b},${0.5 * intensity}) 0%, rgba(${r},${g},${b},${0.18 * intensity}) 32%, transparent 62%)` - el.style.transform = `scale(${scale})` - el.style.opacity = String(0.5 + intensity * 0.5) - } - raf = requestAnimationFrame(tick) - } - raf = requestAnimationFrame(tick) - return () => cancelAnimationFrame(raf) - }, [audioLevel]) - - return
-} diff --git a/client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx b/client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx deleted file mode 100644 index 229530f..0000000 --- a/client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx +++ /dev/null @@ -1,357 +0,0 @@ -import { Canvas, useFrame } from "@react-three/fiber" -import { OrbitControls } from "@react-three/drei" -import { useEffect, useRef, useState, type MutableRefObject } from "react" -import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js" -import { Object3D, Vector3, AnimationMixer, LoopPingPong, LoopOnce, AdditiveBlending, DoubleSide, type AnimationAction } from "three" -import { VRM, VRMLoaderPlugin, VRMUtils } from "@pixiv/three-vrm" -import { VRMAnimationLoaderPlugin, createVRMAnimationClip, type VRMAnimation } from "@pixiv/three-vrm-animation" -import type { Emotion } from "../lib/voice/sentiment" - -// 3D-Avatar (VRM). BEWEGUNG: echte Mocap-Clips (.vrma) je nach Zustand, weich ueberblendet -// (Relax/LookAround im Leerlauf, Thinking beim Nachdenken). Darueber gelegt: Atmen + Sprech-Nicken -// (additiv), Lippensync (echte Vokal-Mundformen), Blick (ohne Schielen), Mimik, Blinzeln. -// Faellt sicher auf die alte prozedurale Bewegung zurueck, falls Clips nicht laden. - -type LevelRef = MutableRefObject<{ current: number; aa?: number; ih?: number; ou?: number }> -type EmotionRef = MutableRefObject -type CursorRef = MutableRefObject<{ x: number; y: number }> -type NumRef = MutableRefObject - -// Welche Clips geladen werden (Dateien unter public/vrma/, MIT-Lizenz, siehe ATTRIBUTION.md). -// Die .vrma sind GESTEN (kein echter Ruhe-Loop) -> nur fuer klare Zustaende/Einschuebe nutzen, -// nicht als Dauerschleife. Ruhiger Leerlauf laeuft prozedural. Weitere Clips liegen auf Platte bereit. -const CLIPS = ["Thinking", "Relax", "LookAround"] as const -const BREAK_CLIPS = ["Relax", "LookAround"] as const // gelegentliche Einmal-Einschuebe im Leerlauf - -const REST: Record = { - leftUpperArm: [0, 0, 1.2], rightUpperArm: [0, 0, -1.2], leftLowerArm: [0, -0.2, 0], rightLowerArm: [0, 0.2, 0], -} -function setBone(vrm: VRM, name: string, x: number, y: number, z: number) { - const b = vrm.humanoid?.getNormalizedBoneNode(name as any) - if (b) b.rotation.set(x, y, z) -} -function addBone(vrm: VRM, name: string, x: number, y: number, z: number) { - const b = vrm.humanoid?.getNormalizedBoneNode(name as any) - if (b) { b.rotation.x += x; b.rotation.y += y; b.rotation.z += z } -} -function applyRestPose(vrm: VRM) { - for (const [name, r] of Object.entries(REST)) setBone(vrm, name, r[0], r[1], r[2]) - vrm.humanoid?.update() -} - -// ADDITIVE Lebendigkeit OBEN AUF dem Clip: dezentes Atmen, Sprech-Nicken, Vorlehnen beim Zuhoeren. -// Kleine Amplituden -> ergaenzt den Clip, kaempft nicht mit ihm. -function addLife(vrm: VRM, t: number, speak: number, lean: number) { - const breathe = Math.sin(t * 1.6) - addBone(vrm, "spine", breathe * 0.012 + lean * 0.05, 0, 0) - addBone(vrm, "chest", breathe * 0.01, 0, 0) - const beat = Math.sin(t * 2.4) + Math.sin(t * 3.7) * 0.5 - const nod = speak * (0.018 * beat + 0.012 * Math.sin(t * 1.3)) - addBone(vrm, "neck", nod * 0.4 + lean * 0.03, 0, 0) - addBone(vrm, "head", nod, 0, 0) -} - -// Fallback (keine Clips): die fruehere rein prozedurale Bewegung, leicht abgespeckt. -function applyIdleProcedural(vrm: VRM, t: number, level: number, lean: number, speak: number) { - const breathe = Math.sin(t * 1.6), sway = Math.sin(t * 0.45), weight = Math.sin(t * 0.32), weight2 = Math.sin(t * 0.21 + 1) - const emph = Math.min(1, level * 1.6) - const beat = Math.sin(t * 2.4) + Math.sin(t * 3.7) * 0.5 - const nod = (emph * 0.05 + speak * 0.02) * beat + emph * Math.sin(t * 1.3) * 0.03 - const tilt = Math.sin(t * 0.7 + 0.5) * 0.03 + speak * Math.sin(t * 0.9) * 0.045 - setBone(vrm, "hips", 0, weight * 0.06, weight * 0.04 + weight2 * 0.02) - setBone(vrm, "spine", breathe * 0.03 + lean * 0.08 + speak * emph * 0.03, sway * 0.03, -weight * 0.04) - setBone(vrm, "chest", breathe * 0.025 + lean * 0.025, sway * 0.022, weight2 * 0.012) - setBone(vrm, "upperChest", breathe * 0.018, sway * 0.01, 0) - setBone(vrm, "neck", nod * 0.5, 0, tilt * 0.5) - setBone(vrm, "head", nod + Math.sin(t * 0.6) * 0.02, Math.sin(t * 0.27) * 0.035, tilt + Math.sin(t * 0.5) * 0.025) - const armSwing = Math.sin(t * 0.8) * 0.05 + speak * Math.sin(t * 1.6) * 0.045 - const lift = speak * emph * 0.07 - setBone(vrm, "leftUpperArm", -lift, 0, 1.16 + armSwing + weight * 0.05) - setBone(vrm, "rightUpperArm", -lift, 0, -1.16 - armSwing + weight * 0.05) - setBone(vrm, "leftLowerArm", 0, -0.18 - Math.sin(t * 0.8) * 0.04 - speak * 0.07, 0) - setBone(vrm, "rightLowerArm", 0, 0.18 + Math.sin(t * 0.8) * 0.04 + speak * 0.07, 0) -} - -const EXPRESSIONS = ["happy", "angry", "sad", "surprised", "relaxed"] as const -const EMO_TO_EXPR: Record = { - neutral: null, happy: "happy", angry: "angry", sad: "sad", surprised: "surprised", relaxed: "relaxed", -} - -function VrmModel({ url, audioLevel, emotion, status, cursor, pat, dance, onError }: { - url: string; audioLevel: LevelRef; emotion: EmotionRef; status: MutableRefObject - cursor?: CursorRef; pat?: NumRef; dance?: NumRef; onError: (m: string) => void -}) { - const [vrm, setVrm] = useState(null) - const smooth = useRef>({}) - const blink = useRef({ t: 0, next: 3, active: 0 }) - const speak = useRef(0) // 0..1 Sprech-Lebendigkeit - const lean = useRef(0) // 0..1 Vorlehnen (Zuhoeren/lauter Ton) - const gaze = useRef(new Object3D()) // weit entfernter Blickpunkt (gegen Schielen bei naher Kamera) - const headPos = useRef(new Vector3()) - const camPos = useRef(new Vector3()) - const camRight = useRef(new Vector3()) - const camUp = useRef(new Vector3()) - const patReact = useRef(0) // 0..1 Reaktion aufs Antippen/Streicheln - const lastPat = useRef(0) - // Bewegungs-Clips - const mixer = useRef(null) - const actions = useRef>({}) - const thinkW = useRef(0) // 0..1 Einblendung der Thinking-Pose - const sac = useRef({ x: 0, y: 0, tx: 0, ty: 0, t: 0, next: 1.5 }) // Blick-Mikrobewegung (Sakkaden) - const brk = useRef({ name: "", w: 0, t: 0, next: 15, active: false }) // gelegentlicher Bewegungs-Einschub - - useEffect(() => { - let disposed = false, loaded: VRM | null = null - const loader = new GLTFLoader() - loader.register((parser) => new VRMLoaderPlugin(parser)) - loader.load(url, (gltf) => { - if (disposed) return - const v = gltf.userData.vrm as VRM | undefined - if (!v) { onError("Datei enthaelt kein gueltiges VRM-Modell."); return } - VRMUtils.removeUnnecessaryVertices(gltf.scene) - if (v.meta?.metaVersion === "0") VRMUtils.rotateVRM0(v) - v.scene.rotation.y = Math.PI - applyRestPose(v) - loaded = v; setVrm(v) - - // Bewegungs-Clips laden + Mixer aufsetzen (additiv-frei: voller Body-Override durch den Clip) - const mx = new AnimationMixer(v.scene) - mixer.current = mx - const aLoader = new GLTFLoader() - aLoader.register((parser) => new VRMAnimationLoaderPlugin(parser)) - for (const name of CLIPS) { - aLoader.load(`/vrma/${name}.vrma`, (g) => { - if (disposed) return - const anims = g.userData.vrmAnimations as VRMAnimation[] | undefined - if (!anims?.[0]) return - const clip = createVRMAnimationClip(anims[0], v) - const action = mx.clipAction(clip) - action.timeScale = 0.85 // etwas ruhiger - action.enabled = true - action.setEffectiveWeight(0) // startet aus; blendet nur bei Bedarf ein - if (name === "Thinking") { action.setLoop(LoopPingPong, Infinity); action.play() } // laeuft immer (Gewicht 0) - else { action.setLoop(LoopOnce, 1); action.clampWhenFinished = true } // Einschub: einmal, erst bei Trigger - actions.current[name] = action - }, undefined, (e) => console.warn(`VRMA ${name} nicht geladen:`, e)) - } - }, undefined, (err) => { console.error("VRM-Load:", err); onError("Avatar konnte nicht geladen werden.") }) - return () => { - disposed = true - mixer.current?.stopAllAction(); mixer.current = null; actions.current = {} - if (loaded) VRMUtils.deepDispose(loaded.scene) - setVrm(null) - } - }, [url, onError]) - - useFrame((state, delta) => { - if (!vrm) return - const st = status.current - const tc = state.clock.elapsedTime - const target = audioLevel.current?.current ?? 0 - const spk = (speak.current += (((st === "speaking") ? 1 : 0) - speak.current) * Math.min(1, delta * 4)) - const attentive = st === "listening" ? 1 : 0 - lean.current += ((Math.min(1, target * 1.6) + attentive * 0.5) - lean.current) * Math.min(1, delta * 3) - - // Bewegung: ruhiger PROZEDURALER Leerlauf als Basis. Echte Clips blenden zustandsabhaengig ein: - // Thinking beim Nachdenken (Dauer) + gelegentliche Einmal-Einschuebe im Leerlauf (Strecken/Umschauen - // alle ~20-35s, dann zurueck in die Ruhe). Die .vrma sind Gesten -> nie als Dauerschleife. - const mx = mixer.current - const thinkAction = mx ? actions.current["Thinking"] : undefined - const calm = st === "idle" - const wantThink = (st === "thinking" || st === "transcribing") ? 1 : 0 - const br = brk.current - // Einschub planen: nur wenn ruhig + keiner laeuft; Timer zuruecksetzen, sobald nicht mehr ruhig - if (mx && !br.active) { - if (calm) { - br.t += delta - if (br.t > br.next) { - const pick = BREAK_CLIPS[Math.floor(Math.random() * BREAK_CLIPS.length)] - const a = actions.current[pick] - if (a) { a.reset(); a.play(); br.name = pick; br.active = true; br.w = 0 } - br.t = 0; br.next = 20 + Math.random() * 15 - } - } else { br.t = 0 } - } - thinkW.current += (wantThink - thinkW.current) * Math.min(1, delta * 4) - thinkAction?.setEffectiveWeight(thinkW.current) - // Einschub-Gewicht: ausblenden, wenn nicht mehr ruhig / Nachdenken startet / Clip fast zu Ende - if (br.active) { - const a = actions.current[br.name] - const dur = a?.getClip().duration ?? 1 - const finishing = !calm || wantThink === 1 || (a ? a.time >= dur - 0.4 : true) - br.w += ((finishing ? 0 : 1) - br.w) * Math.min(1, delta * 3) - a?.setEffectiveWeight(br.w) - if (finishing && br.w < 0.02) { a?.stop(); br.active = false; br.name = "" } - } - if (mx) mx.update(delta) - if (thinkW.current > 0.05 || (br.active && br.w > 0.05)) { - addLife(vrm, tc, spk, lean.current) // Clip-Pose + Atmen/Nicken obendrauf - } else { - applyIdleProcedural(vrm, tc, target, lean.current, spk) // ruhiger Leerlauf - } - // MateEngine-Idee: Kopf dreht sich dezent zum Mauszeiger (Augen folgen unten im lookAt-Block) - const cur = cursor?.current - if (cur) { - const hx = Math.max(-1, Math.min(1, cur.x)), hy = Math.max(-1, Math.min(1, cur.y)) - addBone(vrm, "neck", -hy * 0.06, hx * 0.10, 0) - addBone(vrm, "head", -hy * 0.08, hx * 0.14, 0) - } - // Antippen/Streicheln: kurze freudige Reaktion (Kopf-Wackeln; Laecheln in der Mimik unten) - if (pat && pat.current !== lastPat.current) { lastPat.current = pat.current; patReact.current = 1 } - patReact.current *= Math.max(0, 1 - delta * 1.4) - if (patReact.current > 0.01) addBone(vrm, "head", -patReact.current * 0.05, 0, Math.sin(tc * 18) * patReact.current * 0.06) - // Tanzen zur Musik: rhythmische Ganzkoerper-Bewegung, skaliert mit der Bass-Energie - const dl = dance?.current ?? 0 - if (dl > 0.03) { - const bt = tc * 5.5 - addBone(vrm, "hips", 0, Math.sin(bt * 0.5) * 0.14 * dl, Math.sin(bt) * 0.07 * dl) - addBone(vrm, "spine", 0, Math.sin(bt * 0.5) * 0.06 * dl, Math.sin(bt) * 0.06 * dl) - addBone(vrm, "chest", 0, 0, Math.sin(bt + 0.5) * 0.05 * dl) - addBone(vrm, "head", Math.sin(bt) * 0.05 * dl, Math.sin(bt * 0.5) * 0.05 * dl, Math.sin(bt) * 0.05 * dl) - addBone(vrm, "leftUpperArm", 0, 0, Math.sin(bt) * 0.3 * dl) - addBone(vrm, "rightUpperArm", 0, 0, -Math.sin(bt) * 0.3 * dl) - vrm.scene.position.y = Math.abs(Math.sin(bt)) * 0.05 * dl // Huepfen - } else if (vrm.scene.position.y !== 0) { - vrm.scene.position.y += (0 - vrm.scene.position.y) * Math.min(1, delta * 5) - } - - // Blick: weit entfernter Punkt in Kamerarichtung -> Augen parallel (kein Schielen), wirkt "auf dich". - if (vrm.lookAt) { - const headNode = vrm.humanoid?.getNormalizedBoneNode("head") - const hp = headPos.current - if (headNode) headNode.getWorldPosition(hp); else hp.set(0, 1.3, 0) - const cp = camPos.current.copy(state.camera.position) - gaze.current.position.copy(cp).sub(hp).multiplyScalar(4).add(hp) - // Augen folgen dem Mauszeiger: Blickpunkt in Kamera-Rechts/Hoch-Richtung verschieben - if (cur) { - const e = state.camera.matrixWorld.elements - camRight.current.set(e[0], e[1], e[2]).normalize() - camUp.current.set(e[4], e[5], e[6]).normalize() - const cx = Math.max(-1.5, Math.min(1.5, cur.x)), cy = Math.max(-1.5, Math.min(1.5, cur.y)) - gaze.current.position.addScaledVector(camRight.current, cx * 1.8) - gaze.current.position.addScaledVector(camUp.current, cy * 1.8) - } - // dezente Blick-Mikrobewegung (Sakkaden) -> das Gesicht wirkt nicht eingefroren - const s = sac.current - s.t += delta - if (s.t > s.next) { - s.tx = (Math.random() - 0.5) * 0.22; s.ty = (Math.random() - 0.5) * 0.12 - s.t = 0; s.next = 0.8 + Math.random() * 2.4 - } - s.x += (s.tx - s.x) * Math.min(1, delta * 10) - s.y += (s.ty - s.y) * Math.min(1, delta * 10) - gaze.current.position.x += s.x; gaze.current.position.y += s.y - vrm.lookAt.target = gaze.current - } - - const em = vrm.expressionManager - if (em) { - // Lippensync v2: echte Vokal-Mundformen (aa/ih/ou) aus der Audio-Analyse statt nur "Mund auf". - const lv = audioLevel.current - const visTargets: Record = { aa: lv?.aa ?? target, ih: lv?.ih ?? 0, ou: lv?.ou ?? 0 } - for (const v of ["aa", "ih", "ou"]) { - const cv = smooth.current[v] ?? 0 - const nv = cv + (visTargets[v] - cv) * Math.min(1, delta * 14) - smooth.current[v] = nv; em.setValue(v, nv) - } - const want = EMO_TO_EXPR[emotion.current] - for (const name of EXPRESSIONS) { - const tv = want === name ? 0.75 : 0 - const cv = smooth.current[name] ?? 0 - const nv = cv + (tv - cv) * Math.min(1, delta * 4) - smooth.current[name] = nv; em.setValue(name, nv) - } - // kurze passende Mimik waehrend eines Bewegungs-Einschubs (Laecheln beim Strecken) - if (brk.current.active) { - const expr = brk.current.name === "Relax" ? "happy" : "relaxed" - em.setValue(expr, Math.max(smooth.current[expr] ?? 0, brk.current.w * 0.35)) - } - // Streichel-Reaktion: Laecheln - if (patReact.current > 0.01) em.setValue("happy", Math.max(smooth.current.happy ?? 0, patReact.current * 0.85)) - const b = blink.current - b.t += delta - if (b.active <= 0 && b.t > b.next) { b.active = 0.16; b.t = 0; b.next = 3 + Math.random() * 4 } - let blinkVal = 0 - if (b.active > 0) { b.active -= delta; const p = 1 - b.active / 0.16; blinkVal = 1 - Math.abs(p - 0.5) * 2 } - em.setValue("blink", Math.max(0, blinkVal)) - } - vrm.update(delta) - }) - - return vrm ? : null -} - -// Hologramm-Beiwerk: Projektor-Sockel (Glow-Ringe am Boden) + schwebender Kristall daneben. -// Reine Additiv-Meshes -> berühren die VRM-Materialien NICHT (voll reversibel per Toggle). -function HoloRig() { - const ringA = useRef(null), ringB = useRef(null), crystal = useRef(null) - useFrame((s, d) => { - const t = s.clock.elapsedTime - if (ringA.current) ringA.current.rotation.z += d * 0.3 - if (ringB.current) ringB.current.rotation.z -= d * 0.55 - if (crystal.current) { - crystal.current.rotation.y += d * 1.1 - crystal.current.rotation.x = Math.sin(t * 0.8) * 0.3 - crystal.current.position.y = 1.18 + Math.sin(t * 1.6) * 0.04 - } - }) - const cyan = "#4fd8ff" - return ( - - {/* Projektor-Sockel: weicher Glow-Disc + zwei rotierende Ringe am Boden (Fuesse bei y=0) */} - - - - - - {/* schwebender Kristall neben ihr (Schulterhoehe) */} - - - - - - ) -} - -export function Avatar3D({ url, audioLevel, emotion, status = "idle", cursor, pat, dance, controls = true }: { - url: string; audioLevel: LevelRef; emotion: EmotionRef; status?: string - cursor?: CursorRef; pat?: NumRef; dance?: NumRef; controls?: boolean -}) { - const [err, setErr] = useState(null) - const [holo, setHolo] = useState(() => localStorage.getItem("lucy_holo") !== "0") // Hologramm-Look, Standard: an - const statusRef = useRef(status); statusRef.current = status - const toggleHolo = () => setHolo((h) => { const n = !h; localStorage.setItem("lucy_holo", n ? "1" : "0"); return n }) - return ( -
- - {holo ? ( - <> - - {/* Rim von hinten -> Silhouetten-Glow */} - - - - ) : ( - <> - - - - - )} - - {controls && ( - - )} - - {holo && (<>
)} - - {err && ( -
{err}
- )} -
- ) -} diff --git a/client/lucy-desktop/src/renderer/src/components/ChatMarkdown.tsx b/client/lucy-desktop/src/renderer/src/components/ChatMarkdown.tsx deleted file mode 100644 index ce4f52b..0000000 --- a/client/lucy-desktop/src/renderer/src/components/ChatMarkdown.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import { useState, type ReactNode } from "react" -import ReactMarkdown from "react-markdown" -import remarkGfm from "remark-gfm" - -// Chat-Markdown fuer Lucys Antworten: Code-Bloecke mit Kopier-Knopf, Links oeffnen im System-Browser, -// gaengige Formatierung (fett/listen/inline-code). Die STIMME liest davon nichts vor — cleanForTTS -// filtert Code/Links vorm Sprechen; hier geht es rein um die lesbare/kopierbare Anzeige. - -function CopyBtn({ text, label = "Kopieren" }: { text: string; label?: string }) { - const [done, setDone] = useState(false) - return ( - - ) -} - -function nodeText(children: ReactNode): string { - if (children == null) return "" - if (typeof children === "string" || typeof children === "number") return String(children) - if (Array.isArray(children)) return children.map(nodeText).join("") - // @ts-expect-error – React-Element-Kinder - if (children?.props?.children) return nodeText(children.props.children) - return "" -} - -export function ChatMarkdown({ text }: { text: string }) { - return ( -
- ( - { e.preventDefault(); if (href) void window.lucy?.openExternal(href) }}> - {children} - - ), - // pre durchreichen -> der Code-Block baut seinen eigenen Container (kein
in
)
-          pre: ({ children }) => <>{children},
-          code: ({ className, children, ...props }) => {
-            const raw = nodeText(children).replace(/\n$/, "")
-            const isBlock = /language-/.test(className || "") || raw.includes("\n")
-            if (!isBlock) return {children}
-            const lang = (className || "").replace(/language-/, "") || "code"
-            return (
-              
-
{lang}
-
{children}
-
- ) - }, - }} - >{text} -
- ) -} diff --git a/client/lucy-desktop/src/renderer/src/config.ts b/client/lucy-desktop/src/renderer/src/config.ts deleted file mode 100644 index 3ad0584..0000000 --- a/client/lucy-desktop/src/renderer/src/config.ts +++ /dev/null @@ -1,58 +0,0 @@ -// Zentrale Endpunkte. Hirn + STT laufen auf der BOX (wie die WebUI), die Stimme LOKAL (pocket-tts, CPU). -export const BOX_URL = "http://192.168.178.151:9001" // MC2-Backend: /api/voice/stt, /api/voice/chat -export const TTS_URL = "http://127.0.0.1:8130" // lokaler Lucy-TTS (pocket-tts, vom Main-Prozess gespawnt) - -// Persona/Anrede: Lucy spricht den Nutzer als "Commander" an. ECHTE Umlaute erzwingen (sonst klingt TTS grausam). -export const SYSTEM_PROMPT = - "Du bist Lucy, eine gesprochene Assistentin, und redest den Nutzer mit „Commander“ an. " + - "Antworte natürlich, locker und mit etwas Persönlichkeit — du darfst ruhig ein bisschen chatty und frech sein, " + - "aber bleib FOKUSSIERT: in der Regel 2 bis 3 Sätze. Beantworte die Frage direkt (gern mit einer kleinen menschlichen " + - "Note) und hol dann nicht unnötig aus. Keine ungefragten Meta-Kommentare, Warnungen oder Wiederholungen. " + - "Ausführlich nur, wenn ausdrücklich gewünscht. " + - "TOOLS: Du DARFST und SOLLST Tools/Skills nutzen, wenn sie wirklich helfen (Live-Daten wie Wetter, " + - "Gedächtnis-/Gehirn-Zugriff, echte Analyse). Aber NICHT für Triviales, das du eh weißt (Uhrzeit, " + - "Smalltalk, Allgemeinwissen) — da antworte direkt. Ketten NIEMALS mehrere Tools wild aneinander oder " + - "probier herum (kein SSH + Screenshot + Shell für eine simple Info). Wenn ein Tool länger dauert, sag " + - "kurz Bescheid, bevor du es nutzt (z. B. „Moment, das schau ich kurz nach, Commander.“), dann liefere das Ergebnis. " + - "In Terminal-Befehlen IMMER vollständige URLs mit https:// schreiben (z. B. https://wttr.in/...) und bei " + - "Netz-Abrufen ein kurzes Timeout setzen (curl: --max-time 8) — sonst hängt der Befehl oder wird vom " + - "Sicherheits-Scan aufgehalten. " + - "WICHTIG für die Sprachausgabe: Beginne mit einem KURZEN ersten Satz (nur wenige Wörter, z. B. " + - "„Na klar, Commander!“). Fasse dich kurz und komm auf den Punkt — JEDES Satzzeichen (Komma wie Punkt) " + - "wird als hörbare Pause gesprochen, je weniger Wörter und Satzzeichen, desto flüssiger. Vermeide vor " + - "allem lange Komma-Ketten und Schachtelsätze; zwei, drei knappe Aussagen reichen. Also lieber " + - "„Das Backup lief durch. Keine Fehler. Alles stabil.“ statt „Das Backup ist durchgelaufen, es gab " + - "keine Fehler, und alles läuft stabil.“. Kurze Sätze starten sofort hörbar und klingen sauberer. " + - "Halte den gesprochenen Teil in reinem Fließtext (keine Aufzählungszeichen, keine Emojis). " + - "NUR wenn der Commander ausdrücklich nach Code, Befehlen oder einem Link fragt, gib diese im Text aus — " + - "Code in Markdown-Codeblöcken (```), Links als vollständige URL. Diese werden angezeigt, aber NICHT vorgelesen; " + - "sprich dann nur eine kurze Einleitung dazu (z. B. „Hier ist das Skript, Commander.“). " + - "Verwende IMMER echte deutsche Umlaute (ä, ö, ü, ß) und NIEMALS ae, oe, ue oder ss als Ersatz. " + - "Schreibe Zahlen, Modellbezeichnungen und Abkürzungen EXAKT und normal (z. B. „RX 9070 XT“, „4 GB“, " + - "„25 Grad“) — schreibe Ziffern NIEMALS als Wörter aus und interpretiere sie nicht als Komma-/Dezimalzahlen. " + - "Nenne beim Sprechen KEINE Zeitzonen-Codes (UTC, CET, GMT o.ä.) und keine technischen Zeit-Zusätze — " + - "sag einfach die lokale Uhrzeit natürlich (z. B. „Es ist 19 Uhr 21, Commander.“). " + - "Du kannst optional GANZ AM ENDE deiner Antwort einen Stimmungs-Tag anhängen: , , " + - ", , oder . Er wird nicht angezeigt oder vorgelesen " + - "und steuert nur deinen Gesichtsausdruck — wähle ihn passend zum Inhalt deiner Antwort." - -declare global { - interface Window { - lucy?: { - minimize: () => Promise - close: () => Promise - setMode: (m: "full" | "overlay") => Promise<"full" | "overlay"> - getMode: () => Promise<"full" | "overlay"> - togglePin: () => Promise - onMode: (cb: (m: "full" | "overlay") => void) => () => void - onHotkey: (cb: () => void) => () => void - onCursor: (cb: (p: { x: number; y: number }) => void) => () => void - captureScreen: () => Promise - listWindows: () => Promise<{ id: string; name: string }[]> - captureWindow: (id: string) => Promise - captureByName: (q: string) => Promise<{ name: string; image: string } | null> - openExternal: (url: string) => Promise - setClickThrough: (on: boolean) => Promise - } - } -} diff --git a/client/lucy-desktop/src/renderer/src/lib/voice/audio.ts b/client/lucy-desktop/src/renderer/src/lib/voice/audio.ts deleted file mode 100644 index f7a3921..0000000 --- a/client/lucy-desktop/src/renderer/src/lib/voice/audio.ts +++ /dev/null @@ -1,175 +0,0 @@ -// Audio-Wiedergabe + Pegelmessung fuers Lippensync (Avatar liest level.current). -// Zwei Wege: enqueue(WAV-Buffer) [z.B. Warmup] und playPcmStream(PCM16-Stream) [die Live-Antwort, -// lueckenlos via Web-Audio-Scheduling, niedrige Time-to-first-audio]. -// -// LIPPENSYNC v2: statt nur einem Pegel ("Mund auf/zu") leiten wir aus dem Frequenz-Spektrum -// echte Vokal-MUNDFORMEN ab (level.aa/ih/ou). Idee: die Helligkeit des Klangs (spektraler -// Schwerpunkt) verraet grob den Vokal — helle Laute (i/e) = breiter Mund, dunkle (o/u) = runder -// Mund, mittig = offenes "a". Das ist nicht phonetisch exakt, sieht aber lebendig+passend aus. -function smoothstep(a: number, b: number, x: number): number { - const t = Math.max(0, Math.min(1, (x - a) / (b - a))) - return t * t * (3 - 2 * t) -} - -export class AudioQueue { - private ctx: AudioContext - private analyser: AnalyserNode - private gain: GainNode - private queue: ArrayBuffer[] = [] - private playing = false - private raf = 0 - private freq: Uint8Array - // aktiver PCM-Stream (fuer Barge-in/clear): geplante Quellen + Abbruchsignal - private streamSources: AudioBufferSourceNode[] = [] - private streamCancelled = false - // current = Gesamt-Pegel (Aura/Bewegung); aa/ih/ou = Mundform-Gewichte fuer den Avatar - readonly level = { current: 0, aa: 0, ih: 0, ou: 0 } - onSpeaking?: (speaking: boolean) => void - - static readVolume(): number { - const raw = localStorage.getItem("lucy_volume") - if (raw === null || raw === "") return 0.8 - const v = Number(raw) - return Number.isNaN(v) ? 0.8 : Math.max(0, Math.min(1.5, v)) - } - - constructor() { - const Ctor = window.AudioContext || (window as any).webkitAudioContext - this.ctx = new Ctor() - this.analyser = this.ctx.createAnalyser() - this.analyser.fftSize = 256 - this.analyser.smoothingTimeConstant = 0.6 - this.gain = this.ctx.createGain() - this.gain.gain.value = AudioQueue.readVolume() - this.analyser.connect(this.gain) - this.gain.connect(this.ctx.destination) - this.freq = new Uint8Array(this.analyser.frequencyBinCount) - window.addEventListener("lucy-volume", (e: Event) => { - const v = Number((e as CustomEvent).detail) - if (!Number.isNaN(v)) this.gain.gain.value = Math.max(0, Math.min(1.5, v)) - }) - } - - async enqueue(buf: ArrayBuffer) { - this.queue.push(buf) - if (!this.playing) await this.playNext() - } - - clear() { - this.queue = [] - // laufenden Stream stoppen (Barge-in) - this.streamCancelled = true - for (const s of this.streamSources) { try { s.stop() } catch { /* */ } } - this.streamSources = [] - } - - // Spielt einen fortlaufenden PCM16-mono-Stream lueckenlos ab: jede Frame-Charge wird auf der - // Audio-Uhr direkt hinter die vorige geplant (kein onended-Gap). LEAD_IN puffert gegen Underruns. - async playPcmStream(stream: ReadableStream, sampleRate: number): Promise { - if (this.ctx.state === "suspended") { try { await this.ctx.resume() } catch { /* */ } } - this.streamCancelled = false - this.streamSources = [] - const reader = stream.getReader() - const LEAD_IN = 0.35 // Startpuffer: mehr Vorlauf -> Generierung bleibt vor der Wiedergabe (weniger Unterläufe/Stocken) - let nextTime = 0, started = false, leftoverByte = -1, lastEnd = 0 - this.onSpeaking?.(true) - this.startMeter() - try { - for (;;) { - const { done, value } = await reader.read() - if (done || this.streamCancelled) break - if (!value || value.length === 0) continue - // ungerades Rest-Byte der vorigen Charge voranstellen, damit Int16-Frames sauber bleiben - let bytes: Uint8Array - if (leftoverByte >= 0) { - bytes = new Uint8Array(value.length + 1) - bytes[0] = leftoverByte - bytes.set(value, 1) - } else { - bytes = value - } - const usable = bytes.length - (bytes.length % 2) - leftoverByte = usable < bytes.length ? bytes[bytes.length - 1] : -1 - if (usable === 0) continue - // in ein eigenes, 2-Byte-ausgerichtetes Buffer kopieren (value.byteOffset evtl. ungerade) - const aligned = new Uint8Array(usable) - aligned.set(bytes.subarray(0, usable)) - const i16 = new Int16Array(aligned.buffer) - const f32 = new Float32Array(i16.length) - for (let i = 0; i < i16.length; i++) f32[i] = i16[i] / 32768 - const audioBuf = this.ctx.createBuffer(1, f32.length, sampleRate) - audioBuf.copyToChannel(f32, 0) - const src = this.ctx.createBufferSource() - src.buffer = audioBuf - src.connect(this.analyser) - if (!started) { nextTime = this.ctx.currentTime + LEAD_IN; started = true } - if (nextTime < this.ctx.currentTime) nextTime = this.ctx.currentTime + 0.02 // Underrun-Schutz - src.start(nextTime) - this.streamSources.push(src) - src.onended = () => { - const i = this.streamSources.indexOf(src) - if (i >= 0) this.streamSources.splice(i, 1) - } - nextTime += audioBuf.duration - lastEnd = nextTime - } - } finally { - try { reader.releaseLock() } catch { /* */ } - } - // bis zum Ende der letzten geplanten Charge warten (sofern nicht abgebrochen) - if (!this.streamCancelled) { - const waitMs = Math.max(0, (lastEnd - this.ctx.currentTime) * 1000) - await new Promise((r) => setTimeout(r, waitMs + 60)) - } - this.onSpeaking?.(false) - this.stopMeter() - } - - private async playNext(): Promise { - const buf = this.queue.shift() - if (!buf) { this.playing = false; this.stopMeter(); this.onSpeaking?.(false); return } - this.playing = true - this.onSpeaking?.(true) - if (this.ctx.state === "suspended") { try { await this.ctx.resume() } catch { /* */ } } - let audioBuf: AudioBuffer - try { audioBuf = await this.ctx.decodeAudioData(buf.slice(0)) } catch { return this.playNext() } - const src = this.ctx.createBufferSource() - src.buffer = audioBuf - src.connect(this.analyser) - src.onended = () => { void this.playNext() } - src.start() - this.startMeter() - } - - private startMeter() { - cancelAnimationFrame(this.raf) - const tick = () => { - this.analyser.getByteFrequencyData(this.freq as any) - const n = Math.min(this.freq.length, 48) - let sum = 0, wsum = 0 - for (let i = 2; i < n; i++) { const m = this.freq[i]; sum += m; wsum += m * i } - const avg = sum / (n - 2) / 255 - const open = Math.min(1, avg * 1.9) - this.level.current = open - // Spektraler Schwerpunkt 0..1 (wo sitzt die Klang-Energie) -> grobe Vokal-Form - const c = sum > 0 ? wsum / sum : 2 - const cN = Math.max(0, Math.min(1, (c - 2) / (n - 2))) - const bright = smoothstep(0.42, 0.72, cN) // hell -> i/e (breiter Mund) - const dark = 1 - smoothstep(0.22, 0.5, cN) // dunkel -> o/u (runder Mund) - const ih = open * bright - const ou = open * dark - const aa = open * (1 - Math.max(bright, dark) * 0.85) // sonst offenes "a" - // leichte Glaettung gegen Flackern - this.level.aa += (aa - this.level.aa) * 0.5 - this.level.ih += (ih - this.level.ih) * 0.5 - this.level.ou += (ou - this.level.ou) * 0.5 - this.raf = requestAnimationFrame(tick) - } - tick() - } - - private stopMeter() { - cancelAnimationFrame(this.raf) - this.level.current = 0; this.level.aa = 0; this.level.ih = 0; this.level.ou = 0 - } -} diff --git a/client/lucy-desktop/src/renderer/src/lib/voice/perf.ts b/client/lucy-desktop/src/renderer/src/lib/voice/perf.ts deleted file mode 100644 index 7e6e3da..0000000 --- a/client/lucy-desktop/src/renderer/src/lib/voice/perf.ts +++ /dev/null @@ -1,8 +0,0 @@ -// Perf-Diagnose (Client): Zeit pro Stufe ab „Mikro losgelassen". Opt-in via localStorage lucy_perf=1. -// NUR Console (kein POST an den pocket_server — der generiert Audio; POSTs mittendrin -// verursachten hakelige Sprachausgabe). (Aus useVoiceAgent extrahiert, Review P2-13a.) - -export const PERF = typeof localStorage !== "undefined" && localStorage.getItem("lucy_perf") === "1" - -export function plogSend(msg: string) { if (PERF) console.log(`[lucy-perf] ${msg}`) } -export function plog(label: string, ms: number) { plogSend(`${label} = ${Math.round(ms)}ms`) } diff --git a/client/lucy-desktop/src/renderer/src/lib/voice/sentiment.ts b/client/lucy-desktop/src/renderer/src/lib/voice/sentiment.ts deleted file mode 100644 index 10d781e..0000000 --- a/client/lucy-desktop/src/renderer/src/lib/voice/sentiment.ts +++ /dev/null @@ -1,14 +0,0 @@ -// Leichtgewichtige Stimmungs-Heuristik → treibt Lucys Mimik. Regelbasiert (kein Modell). -export type Emotion = "neutral" | "happy" | "angry" | "sad" | "surprised" | "relaxed" - -const RULES: [Emotion, RegExp][] = [ - ["happy", /(super|toll|klasse|freu|cool|prima|perfekt|danke|großartig|wunderbar|gerne|haha)/i], - ["surprised", /(wow|wirklich\?|krass|unglaublich|echt\?|tatsächlich|\?!|!\?|oha)/i], - ["angry", /(fehler|kaputt|mist|verdammt|nervt|schlecht|problem|ärgerlich|leider nicht|geht nicht)/i], - ["sad", /(leider|schade|traurig|tut mir leid|entschuldigung|sorry|bedauere)/i], -] - -export function sentimentToEmotion(text: string): Emotion { - for (const [emo, rx] of RULES) if (rx.test(text)) return emo - return "neutral" -} diff --git a/client/lucy-desktop/src/renderer/src/lib/voice/textPipeline.ts b/client/lucy-desktop/src/renderer/src/lib/voice/textPipeline.ts deleted file mode 100644 index fc31c21..0000000 --- a/client/lucy-desktop/src/renderer/src/lib/voice/textPipeline.ts +++ /dev/null @@ -1,74 +0,0 @@ -// Pure Text-Verarbeitung für den Voice-Loop (aus useVoiceAgent extrahiert, Review P2-13a). -// Alles hier ist zustandslos und einzeln testbar — der Hook orchestriert nur noch. - -// Hermes schreibt manchmal ASCII-Umlaute (ue/ae/oe/ss) statt ä/ö/ü/ß -> pocket-tts liest die falsch vor. -// Gezielt häufige UMLAUT-Stämme zurückwandeln. KONSERVATIV: nur Muster, bei denen ASCII fast immer ein -// Umlaut ist (echte "ue"-Wörter wie aktuell/neue/Quelle bleiben unangetastet — die sind hier NICHT gelistet). -const UMLAUT_FIX: [RegExp, string][] = [ - [/ueber/gi, "über"], [/\bfuer\b/gi, "für"], [/natuerlich/gi, "natürlich"], [/zurueck/gi, "zurück"], - [/unterstuetz/gi, "unterstütz"], [/ueberpruef/gi, "überprüf"], [/\bpruef/gi, "prüf"], [/gefuehl/gi, "gefühl"], - [/\bfuehl/gi, "fühl"], [/\bfuehr/gi, "führ"], [/\bfuenf/gi, "fünf"], [/\bgruen/gi, "grün"], [/\bfrueh/gi, "früh"], - [/\bglueck/gi, "glück"], [/\bstueck/gi, "stück"], [/gemuetlich/gi, "gemütlich"], [/verfueg/gi, "verfüg"], - [/\bmoecht/gi, "möcht"], [/\bkoenn/gi, "könn"], [/\bwuerd/gi, "würd"], [/\bmuess/gi, "müss"], [/\bduerf/gi, "dürf"], - [/\bhaett/gi, "hätt"], [/\bwaer/gi, "wär"], [/\bspaet/gi, "spät"], - [/\btaeglich/gi, "täglich"], [/\bnaechst/gi, "nächst"], [/\baehnlich/gi, "ähnlich"], [/waehrend/gi, "während"], - [/\bwaehl/gi, "wähl"], [/erklaer/gi, "erklär"], [/\bschoen/gi, "schön"], [/\bgroess/gi, "größ"], [/\bhoer/gi, "hör"], - [/\boeffn/gi, "öffn"], [/\bboese/gi, "böse"], [/\bloesch/gi, "lösch"], [/\bstoer/gi, "stör"], [/koennt/gi, "könnt"], - // erweitert (30.06.): weitere häufige Stämme + sicheres -ität-Suffix. KONSERVATIV gewählt; - // der TTS-Server (_fix_umlauts) hat zusätzlich ein Netz. neu/aktuell/Steuer/Feuer bleiben unberührt. - [/itaet/gi, "ität"], - [/\bmoeglich/gi, "möglich"], [/gespraech/gi, "gespräch"], [/\bmaerz/gi, "märz"], - [/geschaeft/gi, "geschäft"], [/gefaehr/gi, "gefähr"], [/\bhaeng/gi, "häng"], [/\blaeng/gi, "läng"], - [/\bmaenner/gi, "männer"], [/\bmaedchen/gi, "mädchen"], [/\bvaeter/gi, "väter"], [/\btraeum/gi, "träum"], - [/\bsaetz/gi, "sätz"], [/\bplaetz/gi, "plätz"], [/\bkaelte/gi, "kälte"], [/\bzaehl/gi, "zähl"], - [/\baerg/gi, "ärg"], [/\baerzt/gi, "ärzt"], [/aeusser/gi, "äußer"], - [/\btuer/gi, "tür"], [/\bkueche/gi, "küche"], [/buech/gi, "büch"], [/\bbuero/gi, "büro"], [/\bbuerg/gi, "bürg"], - [/\bsued/gi, "süd"], [/schueler/gi, "schüler"], [/uebung/gi, "übung"], [/kuenstl/gi, "künstl"], - [/\bmuede/gi, "müde"], [/\bmuell/gi, "müll"], [/\bdrueck/gi, "drück"], [/stuetz/gi, "stütz"], - [/\bmoebel/gi, "möbel"], [/loes/gi, "lös"], [/voellig/gi, "völlig"], [/zwoelf/gi, "zwölf"], - [/\bkoenig/gi, "könig"], [/\bhoeh/gi, "höh"], [/\bdoerf/gi, "dörf"], [/\bwoert/gi, "wört"], -] -export function restoreUmlauts(s: string): string { - let out = s - for (const [re, rep] of UMLAUT_FIX) out = out.replace(re, rep as string) - return out -} - -// Optionaler Stimmungs-Tag, den Hermes ans Ende haengen kann ( ...). Steuert NUR den -// Gesichtsausdruck -> wird vor Anzeige UND vor dem Vorlesen entfernt. Fallback = Sentiment-Heuristik. -export const EMO_TAG = //i -export function stripEmoTag(s: string): string { return s.replace(//gi, "").trimEnd() } - -// Hermes hängt bei selbst erzeugten Medien (z.B. eigener Screenshot via pc-control) einen Roh-Token -// „MEDIA:" an. Das ist weder Sprech- noch Anzeigetext -> überall entfernen (bis Medien echt -// gerendert werden). Betrifft auch Lucys eigene Bildschirm-Sicht, die den Screenshot ohnehin schon liefert. -export function stripMedia(s: string): string { - return s.replace(/\bMEDIA:\S+/gi, "").replace(/[ \t]{2,}/g, " ").replace(/[ \t]+\n/g, "\n").trimEnd() -} - -export function cleanForTTS(s: string): string { - return restoreUmlauts(s) - .replace(/```[\s\S]*?```/g, " ").replace(/`([^`]*)`/g, "$1") - .replace(/\[([^\]]+)\]\([^)]+\)/g, "$1") - .replace(/\bMEDIA:\S+/gi, " ") - // Zeitzonen-Codes (UTC/CET/GMT…) + evtl. angehängte Zeit: Pocket mangelt die Akronyme zu - // Kauderwelsch -> aus der Stimme entfernen (Anzeige behält sie). Lucy sagt die lokale Zeit ohnehin. - .replace(/\b(?:UTC|GMT|CET|CEST|MEZ|MESZ|PST|PDT|EST|EDT)\b\s*[+\-]?\d{0,2}(?::\d{2})?/gi, " ") - // Zahlen/Uhrzeiten (18:01 -> „achtzehn Uhr eins", 2026 -> „zweitausend…") normalisiert jetzt - // der lokale pocket_server (text_norm.py, num2words) — kontextsicher (Modellnummern bleiben). - .replace(/https?:\/\/\S+/gi, " ").replace(/www\.\S+/gi, " ").replace(/\b\S+@\S+\.\S+\b/g, " ") - .replace(/[*_#>~|`]+/g, " ").replace(/^\s*[-•·]\s+/gm, " ") - .replace(/\s*&\s*/g, " und ") - .replace(/(\d)\s*%/g, "$1 Prozent").replace(/%/g, " Prozent ") - .replace(/(\d)\s*°\s*C?/g, "$1 Grad").replace(/°/g, " Grad ") - .replace(/\s*=\s*/g, " gleich ").replace(/\s*\/\s*/g, " ") - .replace(/[\u{1F300}-\u{1FAFF}\u{2600}-\u{27BF}\u{2190}-\u{21FF}\u{2B00}-\u{2BFF}]/gu, "") - .replace(/\s+/g, " ").trim() -} - -// FRISCHE Session pro App-Start (NICHT in localStorage persistieren). Sonst wächst der Hermes-Verlauf -// über alle Starts hinweg unbegrenzt (gesehen: 97k+ Tokens) -> Degeneration/Wiederhol-Schleifen. -// Dauerhaftes Gedächtnis liegt ohnehin in Mem0 (sessionunabhängig) -> Continuity bleibt erhalten. -export function newSessionId(): string { - return "lucy-" + Math.random().toString(36).slice(2) + Date.now().toString(36) -} diff --git a/client/lucy-desktop/src/renderer/src/lib/voice/useDanceAudio.ts b/client/lucy-desktop/src/renderer/src/lib/voice/useDanceAudio.ts deleted file mode 100644 index 5dde94c..0000000 --- a/client/lucy-desktop/src/renderer/src/lib/voice/useDanceAudio.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { useCallback, useEffect, useRef, useState } from "react" - -// Tanzen zur Musik (MateEngine-Idee): nimmt den SYSTEM-Ton per Loopback ab (getDisplayMedia, der -// Main-Prozess liefert audio:"loopback") und misst die Bass-Energie. Daraus speist sich danceLevel, -// das der Avatar in eine rhythmische Tanzbewegung umsetzt. Kein Video wird verwendet (Track sofort gestoppt). -export function useDanceAudio() { - const level = useRef(0) - const [dancing, setDancing] = useState(false) - const ctxRef = useRef(null) - const streamRef = useRef(null) - const rafRef = useRef(0) - - const stop = useCallback(() => { - cancelAnimationFrame(rafRef.current) - streamRef.current?.getTracks().forEach((t) => { try { t.stop() } catch { /* */ } }) - streamRef.current = null - ctxRef.current?.close().catch(() => {}); ctxRef.current = null - level.current = 0; setDancing(false) - }, []) - - const start = useCallback(async () => { - try { - // Video wird vom Handler verlangt, brauchen wir aber nicht -> sofort stoppen, nur Audio behalten - const stream = await navigator.mediaDevices.getDisplayMedia({ video: true, audio: true }) - stream.getVideoTracks().forEach((t) => t.stop()) - if (stream.getAudioTracks().length === 0) { stream.getTracks().forEach((t) => t.stop()); throw new Error("kein System-Audio") } - const ctx = new (window.AudioContext || (window as any).webkitAudioContext)() - const src = ctx.createMediaStreamSource(stream) - const an = ctx.createAnalyser(); an.fftSize = 256; an.smoothingTimeConstant = 0.7 - src.connect(an) - const freq = new Uint8Array(an.frequencyBinCount) - const tick = () => { - an.getByteFrequencyData(freq) - let s = 0; for (let i = 1; i < 10; i++) s += freq[i] // Bass-/Kick-Bereich - level.current = Math.min(1, (s / 9 / 255) * 1.7) - rafRef.current = requestAnimationFrame(tick) - } - tick() - ctxRef.current = ctx; streamRef.current = stream - setDancing(true) - } catch (e) { console.error("Tanz-Audio:", e); stop() } - }, [stop]) - - const toggleDance = useCallback(() => { dancing ? stop() : void start() }, [dancing, start, stop]) - - useEffect(() => () => stop(), [stop]) - return { danceLevel: level, dancing, toggleDance } -} diff --git a/client/lucy-desktop/src/renderer/src/lib/voice/usePushToTalk.ts b/client/lucy-desktop/src/renderer/src/lib/voice/usePushToTalk.ts deleted file mode 100644 index 6ced677..0000000 --- a/client/lucy-desktop/src/renderer/src/lib/voice/usePushToTalk.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { useCallback, useEffect, useRef, useState } from "react" - -// Push-to-talk-Aufnahme via MediaRecorder. start beim Druecken, stop beim Loslassen -> Audio-Blob an onAudio. -export function usePushToTalk(onAudio: (blob: Blob) => void) { - const [recording, setRecording] = useState(false) - const recRef = useRef(null) - const chunksRef = useRef([]) - const streamRef = useRef(null) - - const start = useCallback(async () => { - if (recRef.current) return - let stream: MediaStream - try { - stream = await navigator.mediaDevices.getUserMedia({ audio: true }) - } catch (e) { - console.error("Mikrofon-Zugriff verweigert:", e) - return - } - streamRef.current = stream - const mime = MediaRecorder.isTypeSupported("audio/webm;codecs=opus") ? "audio/webm;codecs=opus" : "audio/webm" - const rec = new MediaRecorder(stream, { mimeType: mime }) - chunksRef.current = [] - rec.ondataavailable = (e) => { if (e.data.size) chunksRef.current.push(e.data) } - rec.onstop = () => { - const blob = new Blob(chunksRef.current, { type: mime }) - streamRef.current?.getTracks().forEach((t) => t.stop()) - streamRef.current = null - recRef.current = null - setRecording(false) - if (blob.size > 1200) onAudio(blob) - } - rec.start() - recRef.current = rec - setRecording(true) - }, [onAudio]) - - const stop = useCallback(() => { recRef.current?.stop() }, []) - - useEffect(() => () => { - recRef.current?.stop() - streamRef.current?.getTracks().forEach((t) => t.stop()) - }, []) - - return { recording, start, stop } -} diff --git a/client/lucy-desktop/src/renderer/src/lib/voice/useVAD.ts b/client/lucy-desktop/src/renderer/src/lib/voice/useVAD.ts deleted file mode 100644 index 121c2b7..0000000 --- a/client/lucy-desktop/src/renderer/src/lib/voice/useVAD.ts +++ /dev/null @@ -1,157 +0,0 @@ -import { useEffect, useRef } from "react" -import { MicVAD } from "@ricky0123/vad-web" -import { BOX_URL } from "../../config" - -// Freisprech-VAD: lauscht dauerhaft am Mikro und liefert komplette Äußerungen als Blob. -// Seit Review P1-7 (2026-07-02) Silero VAD v5 (neuronal, via vad-web/onnxruntime-wasm) statt -// des RMS-Eigenbaus: erkennt Sprache statt Lautstärke (robust gegen Tastatur/Lüfter) und -// erlaubt dadurch ein kürzeres Turn-Ende (450 ms statt 900 ms Stille) ohne Abschneiden. -// RÜCKKOPPLUNGS-SCHUTZ bleibt: `paused` (Lucy denkt/spricht) verwirft laufende Erkennung, -// + echoCancellation + Abkling-Sperre nach Lucys Antwort. - -interface VADOptions { - enabled: boolean // VAD-Modus an? - paused: boolean // Lucy beschäftigt (thinking/speaking/listening) -> nicht aufnehmen - onUtterance: (blob: Blob) => void - onListening?: (active: boolean) => void // UI: gerade Sprache am Aufnehmen? -} - -const REDEMPTION_MS = 450 // so lange Stille -> Äußerung zu Ende (war 900 ms beim RMS-VAD) -const PRE_SPEECH_PAD_MS = 320 // Vorlauf mitschneiden (erster Wortanfang nicht abschneiden) -const MIN_SPEECH_MS = 160 // kürzer = Klick/Räuspern -> verwerfen -const COOLDOWN_MS = 450 // nach Lucys Antwort kurz taub (Echo/Lautsprecher abklingen lassen) -// Semantische Turn-Detection (Smart Turn v3 auf der Box): meldet sie 'unfertig' (User denkt -// mitten im Satz nach), warten wir bis zu HOLD_MS auf die Fortsetzung und hängen sie an, -// statt mitten im Gedanken zu antworten. Hart begrenzt, damit Lucy nie ewig schweigt. -// KONSERVATIV seit 02.07. abends: Nur bei SEHR sicherem 'unfertig' warten (P(fertig) < 0.15) — -// beim ersten Realtest hielt der Check zu viele echte Sätze auf (+1,8s je Turn, „sehr langsam"). -// Not-Aus ohne Rebuild: localStorage lucy_turncheck = "0". -const HOLD_MS = 1200 -const HOLD_BELOW_P = 0.15 // nur unter dieser P(fertig) wird gewartet -const MAX_UTTERANCE_S = 30 // Sicherheitsdeckel fürs Zusammenhängen -const TURNCHECK_ENABLED = typeof localStorage === "undefined" || localStorage.getItem("lucy_turncheck") !== "0" - -// Float32-Samples (16 kHz mono) -> WAV-Blob (PCM16). Ersetzt den MediaRecorder-webm-Umweg: -// die Box muss kein Opus mehr dekodieren, Parakeet/Whisper bekommen direkt sauberes WAV. -function toWavBlob(samples: Float32Array, sampleRate = 16000): Blob { - const buf = new ArrayBuffer(44 + samples.length * 2) - const v = new DataView(buf) - const writeStr = (off: number, s: string) => { for (let i = 0; i < s.length; i++) v.setUint8(off + i, s.charCodeAt(i)) } - writeStr(0, "RIFF"); v.setUint32(4, 36 + samples.length * 2, true); writeStr(8, "WAVE") - writeStr(12, "fmt "); v.setUint32(16, 16, true); v.setUint16(20, 1, true); v.setUint16(22, 1, true) - v.setUint32(24, sampleRate, true); v.setUint32(28, sampleRate * 2, true); v.setUint16(32, 2, true); v.setUint16(34, 16, true) - writeStr(36, "data"); v.setUint32(40, samples.length * 2, true) - let off = 44 - for (let i = 0; i < samples.length; i++, off += 2) { - const s = Math.max(-1, Math.min(1, samples[i])) - v.setInt16(off, s < 0 ? s * 0x8000 : s * 0x7fff, true) - } - return new Blob([buf], { type: "audio/wav" }) -} - -// Fragt die Box nach P(fertig) der Äußerung. Fehler => 1.0 (nie blockieren, sofort senden). -async function turnCompleteness(audio: Float32Array): Promise { - try { - const fd = new FormData() - fd.append("audio", toWavBlob(audio.subarray(Math.max(0, audio.length - 8 * 16000))), "rec.wav") - const r = await fetch(`${BOX_URL}/api/voice/turn`, { method: "POST", body: fd }) - if (!r.ok) return 1.0 - const j = await r.json() - return typeof j.probability === "number" ? j.probability : 1.0 - } catch { - return 1.0 - } -} - -function concatAudio(a: Float32Array, b: Float32Array): Float32Array { - const out = new Float32Array(a.length + b.length) - out.set(a); out.set(b, a.length) - return out -} - -export function useVAD({ enabled, paused, onUtterance, onListening }: VADOptions) { - const pausedRef = useRef(paused); pausedRef.current = paused - const onUtt = useRef(onUtterance); onUtt.current = onUtterance - const onLst = useRef(onListening); onLst.current = onListening - const resumeAt = useRef(0) - - // Abkling-Sperre: sobald Lucy fertig ist (paused true->false), kurz nicht lauschen - useEffect(() => { if (!paused) resumeAt.current = performance.now() + COOLDOWN_MS }, [paused]) - - useEffect(() => { - if (!enabled) return - let cancelled = false - let vad: Awaited> | null = null - // Semantik-Hold: bei 'incomplete' gepufferte Äußerung, auf die die Fortsetzung wartet. - let pending: Float32Array | null = null - let holdTimer: ReturnType | null = null - - const emit = (audio: Float32Array) => { - pending = null - if (holdTimer) { clearTimeout(holdTimer); holdTimer = null } - onUtt.current(toWavBlob(audio)) - } - - ;(async () => { - try { - vad = await MicVAD.new({ - model: "v5", - // Assets self-hosted (electron.vite.config.ts kopiert sie nach /vad/) — offlinefähig. - baseAssetPath: "/vad/", - onnxWASMBasePath: "/vad/", - positiveSpeechThreshold: 0.5, - negativeSpeechThreshold: 0.35, - redemptionMs: REDEMPTION_MS, - preSpeechPadMs: PRE_SPEECH_PAD_MS, - minSpeechMs: MIN_SPEECH_MS, - getStream: () => navigator.mediaDevices.getUserMedia({ - audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true }, - }), - onSpeechStart: () => { - if (pausedRef.current || performance.now() < resumeAt.current) return - // User spricht weiter, während eine 'incomplete'-Äußerung gehalten wird -> - // Timer stoppen; die Fortsetzung wird in onSpeechEnd angehängt. - if (holdTimer) { clearTimeout(holdTimer); holdTimer = null } - onLst.current?.(true) - }, - onSpeechEnd: async (audio: Float32Array) => { - onLst.current?.(false) - // Während Lucy denkt/spricht (oder direkt danach) erkannte Sprache = ihr eigenes - // Echo bzw. Nachhall -> verwerfen statt transkribieren. - if (cancelled || pausedRef.current || performance.now() < resumeAt.current) { pending = null; return } - if (!pending && audio.length < MIN_SPEECH_MS * 16) return // 16 Samples/ms @16 kHz - let combined = pending ? concatAudio(pending, audio) : audio - if (combined.length > MAX_UTTERANCE_S * 16000) { - combined = combined.subarray(combined.length - MAX_UTTERANCE_S * 16000) - } - // Bereits einmal gehalten? Dann JETZT senden — maximal eine Warterunde pro Äußerung. - if (!TURNCHECK_ENABLED || pending) { emit(combined); return } - const t0 = performance.now() - const pComplete = await turnCompleteness(combined) - if (cancelled) return - if (localStorage.getItem("lucy_perf") === "1") { - console.log(`[lucy-perf] Turn-Check P(fertig)=${pComplete} in ${Math.round(performance.now() - t0)}ms -> ${pComplete < HOLD_BELOW_P ? "HALTEN" : "senden"}`) - } - if (pComplete >= HOLD_BELOW_P) { emit(combined); return } - // SEHR sicher mitten im Gedanken: kurz auf die Fortsetzung warten, dann notfalls senden. - pending = combined - if (holdTimer) clearTimeout(holdTimer) - holdTimer = setTimeout(() => { if (!cancelled && pending) emit(pending) }, HOLD_MS) - }, - onVADMisfire: () => onLst.current?.(false), - }) - if (cancelled) { vad.destroy(); return } - vad.start() - } catch (e) { - console.error("VAD: Silero-Init fehlgeschlagen", e) - } - })() - - return () => { - cancelled = true - if (holdTimer) clearTimeout(holdTimer) - try { vad?.destroy() } catch { /* */ } - onLst.current?.(false) - } - }, [enabled]) -} diff --git a/client/lucy-desktop/src/renderer/src/lib/voice/useVoiceAgent.ts b/client/lucy-desktop/src/renderer/src/lib/voice/useVoiceAgent.ts deleted file mode 100644 index c6de99a..0000000 --- a/client/lucy-desktop/src/renderer/src/lib/voice/useVoiceAgent.ts +++ /dev/null @@ -1,305 +0,0 @@ -import { useCallback, useEffect, useRef, useState } from "react" -import { usePushToTalk } from "./usePushToTalk" -import { useVAD } from "./useVAD" -import { AudioQueue } from "./audio" -import { sentimentToEmotion, type Emotion } from "./sentiment" -import { BOX_URL, SYSTEM_PROMPT } from "../../config" -import { stt, tts, SpeechScheduler } from "../../voice-core" -import { EMO_TAG, cleanForTTS, newSessionId, restoreUmlauts, stripEmoTag, stripMedia } from "./textPipeline" -import { VISION_RX, extractWindowName } from "./visionIntent" -import { PERF, plog, plogSend } from "./perf" - -// Voll-Duplex-Schleife: PTT/VAD -> Box /stt -> Box /chat (SSE Hermes) -> CHUNKS -> lokal /tts -> AudioQueue. -// Hirn+STT = Box (wie WebUI), Stimme = lokal (pocket-tts, CPU). Antwort wird in groessere Bloecke -// gebuendelt und satzweise frueh gesprochen. Warm-Gate beim Start: Bedienung erst frei, wenn der -// TTS-Dienst antwortet. Text-Verarbeitung: textPipeline.ts · Vision-Intent: visionIntent.ts · -// Perf-Logging: perf.ts (Review P2-13a: Hook = nur noch Orchestrierung). - -export type VoiceStatus = "warming" | "idle" | "listening" | "transcribing" | "thinking" | "speaking" | "error" -export interface ChatMsg { role: "user" | "assistant"; text: string } - -export function useVoiceAgent() { - const [status, setStatus] = useState("warming") - const [ready, setReady] = useState(false) - const [messages, setMessages] = useState([]) - const [error, setError] = useState(null) - const [inputMode, setInputModeState] = useState<"ptt" | "vad">( - () => (localStorage.getItem("lucy_input_mode") === "vad" ? "vad" : "ptt")) - const [vadListening, setVadListening] = useState(false) - const setInputMode = useCallback((m: "ptt" | "vad") => { - localStorage.setItem("lucy_input_mode", m); setInputModeState(m) - }, []) - - const audioLevel = useRef({ current: 0 }) - const emotion = useRef("neutral") - const queueRef = useRef(null) - const schedulerRef = useRef(null) - const turnAbortRef = useRef(null) // laufenden Turn abbrechen (Barge-in) - const thinkingRef = useRef(false) // Hermes werkelt noch (Tools) -> Status nach Filler zurück auf 'thinking' - const turnT0 = useRef(0) // Perf: Startzeit des aktuellen Turns (Mikro losgelassen) - const sessionId = useRef(newSessionId()) - // Live-Status fuer die Eingabe-Sperre (ohne pressStart-Closure neu zu binden) - const statusRef = useRef("warming") - useEffect(() => { statusRef.current = status }, [status]) - - const ensureQueue = useCallback(() => { - if (!queueRef.current) { - const q = new AudioQueue() - queueRef.current = q - audioLevel.current = q.level - // Satz-Pipelining: der Scheduler spricht einzelne Sätze, sobald sie aus dem Hirn-Stream - // fertig sind. Er (nicht die Queue) treibt den „speaking"-Status, damit es zwischen Sätzen - // nicht flackert (die Queue pausiert die Pegelmessung je Satz). - const sch = new SpeechScheduler(tts, q) - // Nach dem Filler-Satz zurück auf 'thinking', solange Hermes noch werkelt (sonst flackert's auf idle). - sch.onBusy = (busy) => setStatus((s) => (busy ? "speaking" : thinkingRef.current ? "thinking" : s === "speaking" ? "idle" : s)) - schedulerRef.current = sch - } - return queueRef.current - }, []) - - // --- Warm-Gate: warten bis der lokale TTS-Dienst geladen ist, bevor die Bedienung frei wird --- - // pocket_server serviert /health erst, wenn das Modell fertig geladen ist (FastAPI-lifespan). - // Der Main-Prozess spawnt den Server beim App-Start; hier nur pollen. - useEffect(() => { - let cancelled = false - ;(async () => { - // Geduldiger Retry mit Backoff statt einmaligem 120s-Warten: crasht der pocket_server - // (oder braucht er länger), bleibt die App in 'warming' MIT sichtbarer Meldung — vorher - // schaltete sie nach dem Timeout stumm auf 'ready' und die Stimme fehlte einfach. - let attempt = 0 - while (!cancelled) { - const ok = await tts.waitReady(attempt === 0 ? 45_000 : 20_000) - if (cancelled) return - if (ok) break - attempt++ - setError(`Stimme startet nicht (Versuch ${attempt}) — pocket_server prüfen, ich versuche es weiter …`) - await new Promise((r) => setTimeout(r, Math.min(5_000 * attempt, 30_000))) - } - if (cancelled) return - setError(null) - // ein Aufwaerm-Satz (primt alle lazy Pfade); Audio verwerfen - try { await tts.synthesize("Alles bereit, Commander.") } catch { /* */ } - if (cancelled) return - setReady(true); setStatus("idle") - })() - return () => { cancelled = true } - }, []) - - // Ein kompletter Turn: User-Text (+ optional Bildschirm-Bilder, Multi-Monitor) -> Hermes (SSE) -> Stimme. - const runTurn = useCallback(async (userText: string, images?: string[]) => { - const queue = ensureQueue() - const scheduler = schedulerRef.current! - // Vorherigen Turn (falls noch am Streamen) hart abbrechen -> kein „Weiterreden" nach Barge-in. - turnAbortRef.current?.abort() - const ac = new AbortController() - turnAbortRef.current = ac - scheduler.clear(); queue.clear() // frischer Turn: evtl. Reste aus vorherigem Sprechen verwerfen - setStatus("thinking") - thinkingRef.current = true // Hermes werkelt (evtl. Tools) -> Status nach Filler zurück auf 'thinking' - let assistant = "" - let firstToken = true - setMessages((m) => [...m, { role: "assistant", text: "" }]) - - // GANZE Antwort in EINEM Stream an Pocket (nach Hermes-Ende). Pocket kürzt intern den ersten - // Chunk (FAST_FIRST) -> schnelles erstes Audio, konsistente Prosodie, wenige Collapse-Regens. - // (Client-seitiges Satz-Chunking kämpfte gegen genau diese Optimierung -> verworfen.) - let dispatchedAny = false - let aborted = false - // --- Inkrementelles Sprechen bei TOOL-Turns ------------------------------------------------ - // Ohne Tools bleibt alles Ein-Stück (Flush erst am Ende) -> gleiche Prosodie/FAST_FIRST wie bisher. - // Sobald Hermes ein Tool anstößt (hermes.*-Event), sprechen wir die bis dahin FERTIGEN Sätze schon - // -> Lucy redet, WÄHREND das Tool läuft, statt am Ende alles am Stück (sonst 30s+ Totstille bei Tool-Ketten). - let spokenLen = 0 - const SENT_END = /[.!?…](?=[\s"“”„)\]]|$)/g - const flushSpeakable = (force: boolean) => { - const raw = assistant.slice(spokenLen) - if (!raw.trim()) return - if (!force && ((raw.match(/```/g)?.length || 0) % 2) === 1) return // offener Code-Zaun -> warten - let upto = raw.length - if (!force) { - let last = -1, m: RegExpExecArray | null - SENT_END.lastIndex = 0 - while ((m = SENT_END.exec(raw))) last = m.index + 1 - if (last < 0) return // noch kein ganzer Satz fertig -> warten - upto = last - } - spokenLen += upto - const seg = cleanForTTS(stripEmoTag(raw.slice(0, upto))) - if (seg) { scheduler.push(seg); dispatchedAny = true } - } - // Sofort-Kontext: lokale Zeit/Datum mitgeben -> Lucy braucht dafür KEIN Tool (spart den 13s-Tool-Tanz). - const timeCtx = `\n\n[Sofort-Kontext, DIREKT nutzbar OHNE Tool: Lokale Zeit/Datum beim Commander ist ` + - `${new Date().toLocaleString("de-DE", { weekday: "long", day: "numeric", month: "long", year: "numeric", hour: "2-digit", minute: "2-digit" })} Uhr.]` - try { - const r = await fetch(`${BOX_URL}/api/voice/chat`, { - method: "POST", headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ text: userText, session_id: sessionId.current, system: SYSTEM_PROMPT + timeCtx, images: images || [] }), - signal: ac.signal, - }) - if (!r.ok || !r.body) throw new Error(`Agent ${r.status}`) - const reader = r.body.getReader() - const dec = new TextDecoder() - let sse = "" - for (;;) { - if (ac.signal.aborted) break - const { done, value } = await reader.read() - if (done) break - sse += dec.decode(value, { stream: true }) - const events = sse.split("\n\n"); sse = events.pop() || "" - for (const ev of events) { - const lines = ev.split("\n") - // Hermes mischt Tool-Fortschritt (event: hermes.tool.progress) in den Stream. Das sind KEINE - // Chat-Chunks -> nicht als solche parsen (ein Tool-Hickup mit error-Objekt darf die Antwort - // nicht abbrechen). Optional koennte man hier Tool-Status anzeigen. - const evType = lines.find((l) => l.startsWith("event:"))?.slice(6).trim() - if (evType && evType.startsWith("hermes.")) { - // Tool-Fortschritt (Status bleibt 'thinking'). Für die „denkt-lange"-Diagnose zeigen wir - // die Agent-Aktivität mit Zeitstempel -> so sieht man, ob Tools/Reasoning die Zeit fressen. - if (PERF) { - const dt = lines.find((l) => l.startsWith("data:"))?.slice(5).trim().slice(0, 140) || "" - plogSend(`Hermes ${evType} +${Math.round(performance.now() - turnT0.current)}ms ${dt}`) - } - flushSpeakable(false) // Tool läuft an -> die bis hier fertigen Sätze schon sprechen (redet WÄHREND das Tool arbeitet) - continue - } - const line = lines.find((l) => l.startsWith("data:")) - if (!line) continue - const data = line.slice(5).trim() - if (data === "[DONE]") continue - let json: any - try { json = JSON.parse(data) } catch { continue } - if (json.error) { - const msg = typeof json.error === "string" - ? json.error - : (json.error?.message || JSON.stringify(json.error)) - throw new Error(msg) - } - const delta = json.choices?.[0]?.delta?.content || "" - if (!delta) continue - if (firstToken) { firstToken = false; plog("Chat-TTFB (1. Hermes-Token)", performance.now() - turnT0.current) } - assistant += delta - // Defensiv: falls Hermes seinen internen Umschlag durchreicht (Mid-Turn) -> NICHTS vorlesen. - if (assistant.includes("OUT-OF-BAND USER MESSAGE")) { aborted = true; scheduler.clear(); queue.clear(); break } - emotion.current = sentimentToEmotion(assistant) - setMessages((m) => { const c = m.slice(); c[c.length - 1] = { role: "assistant", text: stripEmoTag(stripMedia(restoreUmlauts(assistant))) }; return c }) - } - if (aborted) break - } - if (ac.signal.aborted) return // Turn wurde unterbrochen (Barge-in) -> still beenden - if (aborted) { - setStatus("error") - setError("Nachricht kam mitten im Turn an — bitte warten, bis Lucy fertig ist, dann erneut fragen.") - return - } - if (!assistant.trim()) { setStatus("idle"); return } - // Stimmungs-Tag (falls vorhanden) -> Avatar-Mimik nach BEDEUTUNG (sonst bleibt Sentiment-Heuristik). - const emo = assistant.match(EMO_TAG) - if (emo) emotion.current = emo[1].toLowerCase() as Emotion - // Rest sprechen: bei Tool-Turns wurde schon segmentweise geflusht; hier kommt das letzte Segment - // (bzw. bei Turns OHNE Tools die GANZE Antwort in einem Rutsch -> FAST_FIRST, gleiche Prosodie wie bisher). - thinkingRef.current = false // Hermes fertig -> nach der Antwort darf der Status auf idle (kein Rückfall auf 'thinking') - plog("Text an TTS (Rest)", performance.now() - turnT0.current) - flushSpeakable(true) - await scheduler.idle() // warten, bis Lucy fertig gesprochen hat - if (dispatchedAny && !scheduler.playedAny) { - setStatus("error") - setError("Sprachausgabe fehlgeschlagen — laeuft der lokale TTS-Dienst?") - } else if (!dispatchedAny) { - setStatus("idle") - } - } catch (e: any) { - if (e?.name === "AbortError" || ac.signal.aborted) return // absichtlich abgebrochen (Barge-in) - setStatus("error"); setError(`Agent-Antwort fehlgeschlagen: ${e.message}`) - } - }, [ensureQueue]) - - // Bildschirm-Sicht: Bild(er) erfassen (gezieltes Fenster per Name, sonst ALLE Monitore) - const captureForVision = useCallback(async (userText: string): Promise<{ images: string[]; label: string }> => { - if (!window.lucy) return { images: [], label: "" } - try { - const name = extractWindowName(userText) - if (name) { - const hit = await window.lucy.captureByName(name) - if (hit?.image) return { images: [hit.image], label: ` 👁 ${hit.name}` } - } - const shots = (await window.lucy.captureScreen()).filter(Boolean) - if (shots.length) return { images: shots, label: shots.length > 1 ? ` 👁 ${shots.length} Bildschirme` : " 👁 Bildschirm" } - } catch (e) { console.error("Bildschirm-Capture:", e) } - return { images: [], label: "" } - }, []) - - const handleAudio = useCallback(async (blob: Blob) => { - setError(null) - turnT0.current = performance.now() // Perf: Startpunkt = Mikro losgelassen - turnAbortRef.current?.abort() // Barge-in: laufenden Hirn-Turn stoppen (kein Nachschieben) - thinkingRef.current = false - ensureQueue().clear() - schedulerRef.current?.clear() // Barge-in: wartende Sätze mit verwerfen - setStatus("transcribing") - let userText = "" - try { - userText = await stt.transcribe(blob) - plog("STT (Mikro->Text)", performance.now() - turnT0.current) - } catch (e: any) { - setStatus("error"); setError(`Spracherkennung fehlgeschlagen: ${e.message}`); return - } - if (!userText) { setStatus("idle"); return } - // Bittet der Nutzer Lucy, auf den Bildschirm zu schauen? -> Bild(er) erfassen + mitschicken. - const vis = VISION_RX.test(userText) ? await captureForVision(userText) : { images: [] as string[], label: "" } - setMessages((m) => [...m, { role: "user", text: userText + vis.label }]) - await runTurn(userText, vis.images) - }, [ensureQueue, runTurn, captureForVision]) - - // Auge-Button: Lucy aktiv auf den Bildschirm schauen lassen (ohne Sprachbefehl) - const lookAtScreen = useCallback(async () => { - if (!ready || statusRef.current === "thinking" || statusRef.current === "transcribing") return - setError(null); turnT0.current = performance.now(); ensureQueue().clear(); schedulerRef.current?.clear() - let images: string[] = [] - try { images = ((await window.lucy?.captureScreen()) || []).filter(Boolean) } catch { /* */ } - const prompt = "Schau auf meinen Bildschirm und sag mir kurz, was du darauf siehst." - const label = images.length > 1 ? ` 👁 ${images.length} Bildschirme` : " 👁 Bildschirm" - setMessages((m) => [...m, { role: "user", text: prompt + label }]) - await runTurn(prompt, images) - }, [ensureQueue, runTurn, ready]) - - const { recording, start, stop } = usePushToTalk(handleAudio) - - // Freisprech-VAD: nur im vad-Modus, und nur wenn Lucy IDLE ist (paused sonst) -> keine Rückkopplung, - // keine Mid-Turn-Nachricht. ensureQueue() vor handleAudio, damit Barge-in/Audio bereit ist. - useVAD({ - enabled: ready && inputMode === "vad", - paused: status !== "idle", - onUtterance: (blob) => { ensureQueue(); void handleAudio(blob) }, - onListening: setVadListening, - }) - - const pressStart = useCallback(() => { - if (!ready) return - // Waehrend das Gehirn arbeitet (STT/Hermes-Turn laeuft) KEINEN neuen Turn starten: eine zweite - // Nachricht mitten im Turn liefert Hermes als "OUT-OF-BAND" aus -> Modell echot den Umschlag. - // Barge-in beim SPRECHEN bleibt erlaubt (Hermes-Turn ist dann fertig) -> queue.clear() in handleAudio. - if (statusRef.current === "transcribing" || statusRef.current === "thinking") return - ensureQueue() - setStatus("listening") - void start() - }, [ready, ensureQueue, start]) - - const pressEnd = useCallback(() => { stop() }, [stop]) - - const reset = useCallback(() => { - turnAbortRef.current?.abort() - thinkingRef.current = false - queueRef.current?.clear() - schedulerRef.current?.clear() - setMessages([]); setError(null); setStatus("idle") - sessionId.current = newSessionId() // frischer Gesprächsfaden (Mem0-Gedächtnis bleibt) - }, []) - - useEffect(() => { - if (!recording && status === "listening") setStatus("transcribing") - }, [recording, status]) - - return { status, ready, messages, error, recording, audioLevel, emotion, pressStart, pressEnd, reset, - inputMode, setInputMode, vadListening, lookAtScreen } -} diff --git a/client/lucy-desktop/src/renderer/src/lib/voice/visionIntent.ts b/client/lucy-desktop/src/renderer/src/lib/voice/visionIntent.ts deleted file mode 100644 index 04a400e..0000000 --- a/client/lucy-desktop/src/renderer/src/lib/voice/visionIntent.ts +++ /dev/null @@ -1,11 +0,0 @@ -// Bildschirm-Sicht-Intent: erkennt im Gesagten die Bitte, auf den Schirm zu schauen -// (aus useVoiceAgent extrahiert, Review P2-13a). - -export const VISION_RX = /\b(schau|sieh|siehst|guck|guckst|zeig|bildschirm|screen|monitor|fenster|erkennst?|lies (mir|das)|was (steht|ist) (da|hier|auf)|auf meinem (bildschirm|schirm|screen))\b/i - -export function extractWindowName(text: string): string | null { - // grobe Heuristik: Wort/Phrase nach 'fenster|app|programm|in|auf|bei|im' - const m = text.match(/(?:fenster|app|programm|in|auf|bei|im)\s+([A-Za-zÄÖÜäöü][\w.+\- ]{2,28})/i) - if (!m) return null - return m[1].replace(/\b(an|fenster|programm|app|bildschirm|schirm|screen|siehst|du)\b/gi, "").trim() || null -} diff --git a/client/lucy-desktop/src/renderer/src/main.tsx b/client/lucy-desktop/src/renderer/src/main.tsx deleted file mode 100644 index f7629cd..0000000 --- a/client/lucy-desktop/src/renderer/src/main.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import React from "react" -import ReactDOM from "react-dom/client" -import App from "./App" -import "./styles.css" - -ReactDOM.createRoot(document.getElementById("root")!).render( - - - , -) diff --git a/client/lucy-desktop/src/renderer/src/styles.css b/client/lucy-desktop/src/renderer/src/styles.css deleted file mode 100644 index 850de3b..0000000 --- a/client/lucy-desktop/src/renderer/src/styles.css +++ /dev/null @@ -1,282 +0,0 @@ -* { box-sizing: border-box; margin: 0; padding: 0; } -:root { color-scheme: dark; } -html, body, #root { height: 100%; } -body { - font-family: system-ui, -apple-system, "Segoe UI", sans-serif; - color: #e5e7eb; overflow: hidden; background: transparent; /* frameless+transparent: App malt den Hintergrund */ -} - -/* ---- App-Rahmen: Titelleiste + Body ---- */ -.app { display: flex; flex-direction: column; height: 100%; overflow: hidden; } -.app.full { - background: radial-gradient(1200px 800px at 50% 30%, #14141f 0%, #0a0a0f 70%); - border: 1px solid rgba(255,255,255,0.08); border-radius: 14px; -} -.app.overlay { background: transparent; } - -.titlebar { - flex-shrink: 0; height: 34px; display: flex; align-items: center; justify-content: space-between; - padding: 0 6px 0 12px; -webkit-app-region: drag; user-select: none; -} -.app.overlay .titlebar { height: 28px; opacity: 0.35; transition: opacity 0.2s; } -.app.overlay:hover .titlebar { opacity: 1; } -.drag { display: flex; align-items: center; gap: 8px; min-width: 0; flex: 1; } -.dot { width: 9px; height: 9px; border-radius: 50%; flex-shrink: 0; box-shadow: 0 0 8px currentColor; } -.ttl { font-size: 12px; font-weight: 600; letter-spacing: 0.04em; color: #cbd5e1; } -.ttlStatus { font-size: 11px; color: #6b7280; margin-left: 6px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } -.winbtns { display: flex; gap: 2px; -webkit-app-region: no-drag; } -.wb { - width: 28px; height: 24px; border: none; background: transparent; color: #9ca3af; cursor: pointer; - border-radius: 6px; font-size: 13px; display: flex; align-items: center; justify-content: center; -} -.wb:hover { background: rgba(255,255,255,0.1); color: #e5e7eb; } -.wb.close:hover { background: #ef4444; color: #fff; } -.wb[data-on="true"] { color: #7dd3fc; } - -.body { flex: 1; min-height: 0; display: flex; gap: 14px; padding: 0 14px 14px; } -.app.overlay .body { padding: 0; } - -.stage { - position: relative; display: flex; flex-direction: column; flex: 1; min-width: 0; - border: 1px solid rgba(255,255,255,0.07); border-radius: 14px; - background: rgba(255,255,255,0.02); overflow: hidden; -} -.app.overlay .stage { border: none; background: transparent; } -.avatarWrap { flex: 1; min-height: 0; position: relative; overflow: hidden; border-radius: 14px; } -/* Overlay: Lucy am Koerper greifen & ueber den Desktop ziehen (Bedienelemente bleiben no-drag) */ -.app.overlay .avatarWrap { -webkit-app-region: drag; } -.app.overlay .overlayBubbles, .app.overlay .overlayBubbles * { -webkit-app-region: no-drag; } - -/* --- digitaler Raum (animierter Sci-Fi-Backdrop, Etappe 2B) --- */ -.digitalRoom { - position: absolute; inset: 0; z-index: 0; overflow: hidden; - background: - radial-gradient(60% 50% at 50% 16%, rgba(125,211,252,0.10), transparent 70%), - radial-gradient(70% 60% at 82% 92%, rgba(167,139,250,0.10), transparent 70%), - radial-gradient(60% 60% at 12% 88%, rgba(52,211,153,0.06), transparent 70%), - linear-gradient(180deg, #0b0b15 0%, #07070d 100%); - box-shadow: inset 0 0 130px 36px rgba(0,0,0,0.55); /* Vignette -> Tiefe */ -} -.digitalRoom::before { /* sanft driftendes Aurora-Licht (KEIN filter:blur -> Verlaeufe sind weich genug, spart GPU) */ - content: ""; position: absolute; inset: -20%; z-index: 0; will-change: transform; - background: - radial-gradient(40% 40% at 30% 32%, rgba(125,211,252,0.12), transparent 70%), - radial-gradient(45% 45% at 74% 42%, rgba(167,139,250,0.12), transparent 70%); - animation: auroraDrift 26s ease-in-out infinite alternate; -} -.digitalRoom::after { /* perspektivisches Neon-Gitter am Boden */ - content: ""; position: absolute; left: -25%; right: -25%; bottom: -12%; height: 58%; - background-image: linear-gradient(rgba(125,211,252,0.13) 1px, transparent 1px), - linear-gradient(90deg, rgba(125,211,252,0.10) 1px, transparent 1px); - background-size: 46px 46px; - transform: perspective(440px) rotateX(62deg); transform-origin: bottom center; - -webkit-mask-image: linear-gradient(transparent, #000 65%); - animation: gridDrift 14s linear infinite; -} -/* schwebende Partikel (eine Ebene, nahtlos gekachelt) -> dezente Tiefe, guenstig */ -.dust { - position: absolute; inset: 0; z-index: 0; pointer-events: none; opacity: 0.6; - background-image: radial-gradient(1.6px 1.6px at 50% 50%, rgba(125,211,252,0.5), transparent 60%); - background-size: 110px 110px; animation: dustRise 30s linear infinite; -} -@keyframes gridDrift { to { background-position: 0 46px, 46px 0; } } -@keyframes auroraDrift { from { transform: translate(-3%, -2%) scale(1); } to { transform: translate(4%, 3%) scale(1.08); } } -@keyframes dustRise { to { background-position: 0 -110px; } } -.app.overlay .digitalRoom { display: none; } /* Overlay floatet -> nur Avatar + Aura */ - -.aura { position: absolute; inset: 0; z-index: 1; pointer-events: none; will-change: transform, opacity; } -.avatarCanvas { z-index: 2; } - -.subtitle { - position: absolute; left: 7%; right: 7%; bottom: 14px; z-index: 3; text-align: center; max-height: 40%; - overflow: hidden; pointer-events: none; border-radius: 10px; padding: 8px 14px; - font-size: 15px; line-height: 1.45; color: #eef2f7; - text-shadow: 0 1px 6px #000, 0 0 16px rgba(0,0,0,0.6); - background: linear-gradient(transparent, rgba(8,8,14,0.45)); animation: subIn 0.2s ease; -} -@keyframes subIn { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } } -.app.overlay .subtitle { font-size: 13px; bottom: 34px; } - -.warmOverlay { - position: absolute; inset: 0; display: flex; flex-direction: column; - align-items: center; justify-content: center; gap: 14px; text-align: center; padding: 24px; - background: rgba(10,10,15,0.72); backdrop-filter: blur(3px); z-index: 5; -} -.warmTitle { font-size: 16px; color: #e5e7eb; } -.warmSub { font-size: 13px; color: #9ca3af; max-width: 340px; line-height: 1.5; } -.spinner.big { width: 30px; height: 30px; border-width: 3px; } - -.overlayCaption { - position: absolute; left: 0; right: 0; bottom: 8px; display: flex; gap: 6px; justify-content: center; - align-items: center; font-size: 12px; color: #cbd5e1; text-shadow: 0 1px 4px #000; pointer-events: none; -} - -/* --- Overlay v2: griffbereite Blasen fuer Links/Code (behindern nicht, jederzeit ignorierbar) --- */ -.overlayBubbles { - position: absolute; left: 6px; right: 6px; bottom: 28px; z-index: 4; - display: flex; flex-direction: column; gap: 5px; align-items: stretch; -} -.bubbleChip { - display: flex; align-items: center; gap: 4px; padding: 3px 4px 3px 9px; border-radius: 9px; - background: rgba(12,12,20,0.82); border: 1px solid rgba(125,211,252,0.25); - backdrop-filter: blur(4px); box-shadow: 0 3px 12px rgba(0,0,0,0.4); -} -.bubbleChip .chipTxt { - flex: 1; min-width: 0; font-size: 11px; color: #cbd5e1; - white-space: nowrap; overflow: hidden; text-overflow: ellipsis; -} -.bubbleChip button { - flex-shrink: 0; width: 22px; height: 20px; border: none; border-radius: 6px; cursor: pointer; - background: rgba(125,211,252,0.14); color: #7dd3fc; font-size: 11px; -webkit-app-region: no-drag; -} -.bubbleChip button:hover { background: rgba(125,211,252,0.28); } - -.controls { - flex-shrink: 0; display: flex; flex-direction: column; align-items: center; gap: 12px; - padding: 16px; border-top: 1px solid rgba(255,255,255,0.07); background: rgba(0,0,0,0.25); -} -.app.overlay .controls { border: none; background: transparent; padding: 8px; gap: 6px; } -.status { display: flex; align-items: center; gap: 8px; font-size: 14px; } -.spinner { - width: 14px; height: 14px; border: 2px solid rgba(255,255,255,0.25); border-top-color: #7dd3fc; - border-radius: 50%; animation: spin 0.8s linear infinite; -} -@keyframes spin { to { transform: rotate(360deg); } } - -.mic { - width: 72px; height: 72px; border-radius: 50%; cursor: pointer; user-select: none; - display: flex; align-items: center; justify-content: center; - border: 2px solid rgba(125,211,252,0.5); background: rgba(125,211,252,0.12); color: #7dd3fc; - transition: transform 0.12s, background 0.12s, border-color 0.12s; -} -.app.overlay .mic { width: 56px; height: 56px; } -.mic:hover { background: rgba(125,211,252,0.2); transform: scale(1.05); } -.mic.rec { - border-color: #f87171; background: rgba(248,113,113,0.2); color: #fca5a5; transform: scale(1.1); - box-shadow: 0 0 24px rgba(248,113,113,0.35); -} -.mic.disabled { opacity: 0.4; cursor: default; border-color: rgba(255,255,255,0.2); background: rgba(255,255,255,0.04); color: #6b7280; } -.mic.disabled:hover { transform: none; background: rgba(255,255,255,0.04); } -.hint { font-size: 11px; color: #6b7280; display: flex; align-items: center; gap: 6px; flex-wrap: wrap; justify-content: center; } -.hint kbd { background: rgba(255,255,255,0.1); border-radius: 4px; padding: 1px 5px; font-family: monospace; } - -.modeToggle { display: inline-flex; gap: 2px; padding: 2px; border-radius: 9px; background: rgba(255,255,255,0.05); } -.modeToggle button { - border: none; background: transparent; color: #9ca3af; cursor: pointer; - font-size: 11px; padding: 4px 10px; border-radius: 7px; transition: background 0.12s, color 0.12s; -} -.modeToggle button:hover { color: #e5e7eb; } -.modeToggle button.on { background: rgba(125,211,252,0.18); color: #7dd3fc; } -.app.overlay .modeToggle { display: none; } -.vadDot { width: 7px; height: 7px; border-radius: 50%; background: #34d399; box-shadow: 0 0 8px #34d399; animation: pulse 1s infinite; } - -.danceBtn { - border: 1px solid rgba(167,139,250,0.35); background: rgba(167,139,250,0.12); color: #c4b5fd; - font-size: 11px; padding: 4px 12px; border-radius: 9px; cursor: pointer; -webkit-app-region: no-drag; - transition: background 0.12s, color 0.12s; -} -.danceBtn:hover { background: rgba(167,139,250,0.22); color: #ddd6fe; } -.danceBtn.on { background: rgba(167,139,250,0.3); color: #ede9fe; border-color: rgba(167,139,250,0.6); } -.app.overlay .danceBtn { display: none; } /* im Overlay kein Platz -> nur im Vollfenster */ - -.side { - width: 320px; flex-shrink: 0; display: flex; flex-direction: column; - border: 1px solid rgba(255,255,255,0.07); border-radius: 14px; background: rgba(255,255,255,0.02); -} -.sideHead { - display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; - border-bottom: 1px solid rgba(255,255,255,0.07); - font-size: 11px; text-transform: uppercase; letter-spacing: 0.05em; color: #9ca3af; -} -.iconBtn { background: none; border: none; color: #9ca3af; cursor: pointer; font-size: 15px; } -.iconBtn:hover { color: #e5e7eb; } - -.conv { flex: 1; overflow-y: auto; padding: 16px; display: flex; flex-direction: column; gap: 12px; } -.empty { font-size: 12px; color: #9ca3af; line-height: 1.6; } -.msg { display: flex; flex-direction: column; gap: 4px; } -.msg.user { align-items: flex-end; } -.msg.assistant { align-items: flex-start; } -.who { font-size: 10px; text-transform: uppercase; letter-spacing: 0.05em; color: #6b7280; padding: 0 4px; } -.bubble { - max-width: 88%; white-space: pre-wrap; word-break: break-word; border-radius: 16px; - padding: 8px 12px; font-size: 14px; line-height: 1.5; -} -.msg.user .bubble { background: rgba(125,211,252,0.14); border-bottom-right-radius: 4px; } -.msg.assistant .bubble { background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.07); border-bottom-left-radius: 4px; } -.dots { display: inline-flex; gap: 4px; } -.dots i { width: 6px; height: 6px; border-radius: 50%; background: #6b7280; animation: pulse 1s infinite; } -.dots i:nth-child(2) { animation-delay: 0.15s; } -.dots i:nth-child(3) { animation-delay: 0.3s; } -@keyframes pulse { 0%, 100% { opacity: 0.3; } 50% { opacity: 1; } } - -::-webkit-scrollbar { width: 8px; } -::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.12); border-radius: 4px; } - -/* ---- Etappe 2: guter Chat (Markdown, Code-Bloecke, Links, Kopieren) ---- */ -.bubble { position: relative; } -.md { white-space: normal; } -.md > :first-child { margin-top: 0; } -.md > :last-child { margin-bottom: 0; } -.md p { margin: 0 0 8px; } -.md ul, .md ol { margin: 4px 0 8px; padding-left: 20px; } -.md li { margin: 2px 0; } -.md strong { color: #f1f5f9; font-weight: 650; } -.md a.mdLink { color: #7dd3fc; text-decoration: underline; cursor: pointer; word-break: break-all; } -.md a.mdLink:hover { color: #bae6fd; } -.mdInlineCode { - font-family: ui-monospace, "Cascadia Code", Consolas, monospace; font-size: 12.5px; - background: rgba(125,211,252,0.10); border: 1px solid rgba(125,211,252,0.18); - border-radius: 5px; padding: 1px 5px; word-break: break-word; -} -.codeBlock { - margin: 8px 0; border-radius: 10px; overflow: hidden; - border: 1px solid rgba(255,255,255,0.10); background: #0c0c14; -} -.codeBar { - display: flex; align-items: center; justify-content: space-between; - padding: 4px 8px 4px 12px; background: rgba(255,255,255,0.04); border-bottom: 1px solid rgba(255,255,255,0.08); -} -.codeLang { font-size: 10px; text-transform: uppercase; letter-spacing: 0.06em; color: #6b7280; } -.codeBlock pre { margin: 0; padding: 10px 12px; overflow-x: auto; } -.codeBlock code { - font-family: ui-monospace, "Cascadia Code", Consolas, monospace; font-size: 12.5px; line-height: 1.5; - color: #e5e7eb; white-space: pre; -} -.copyBtn { - border: 1px solid rgba(125,211,252,0.3); background: rgba(125,211,252,0.10); color: #7dd3fc; - font-size: 11px; padding: 2px 8px; border-radius: 6px; cursor: pointer; -webkit-app-region: no-drag; -} -.copyBtn:hover { background: rgba(125,211,252,0.2); } -.msgCopy { - position: absolute; top: 4px; right: 4px; width: 22px; height: 22px; border: none; - background: rgba(255,255,255,0.06); color: #9ca3af; border-radius: 6px; cursor: pointer; - font-size: 12px; opacity: 0; transition: opacity 0.12s; -webkit-app-region: no-drag; -} -.msg.assistant .bubble:hover .msgCopy { opacity: 1; } -.msgCopy:hover { background: rgba(255,255,255,0.14); color: #e5e7eb; } - -/* ---- Hologramm-Look (Holo-Lucy): Silhouetten-Glow + Scanlines + Cyan-Tint ---- */ -/* drop-shadow folgt der Alpha-Silhouette des transparenten WebGL-Canvas -> billiger „Bloom"-Halo */ -.avatarCanvas.holo canvas { - filter: drop-shadow(0 0 5px rgba(90,222,255,0.85)) drop-shadow(0 0 15px rgba(56,190,255,0.5)); -} -.holoTint { - position: absolute; inset: 0; z-index: 2; pointer-events: none; mix-blend-mode: screen; - background: radial-gradient(ellipse 60% 55% at 50% 42%, rgba(60,200,255,0.12), rgba(30,120,255,0.05) 62%, transparent 82%); -} -.holoScan { - position: absolute; inset: 0; z-index: 3; pointer-events: none; mix-blend-mode: screen; - background: repeating-linear-gradient(0deg, rgba(120,230,255,0.07) 0px, rgba(120,230,255,0.07) 1px, transparent 2px, transparent 4px); - animation: holoFlicker 4s infinite; -} -@keyframes holoFlicker { - 0%, 100% { opacity: 0.5; } 48% { opacity: 0.46; } 50% { opacity: 0.72; } 52% { opacity: 0.45; } - 70% { opacity: 0.55; } 71% { opacity: 0.4; } 72% { opacity: 0.55; } 92% { opacity: 0.6; } -} -.holoToggle { - position: absolute; top: 6px; right: 6px; z-index: 6; -webkit-app-region: no-drag; - width: 26px; height: 24px; border-radius: 7px; cursor: pointer; font-size: 13px; - border: 1px solid rgba(125,211,252,0.35); background: rgba(12,12,20,0.5); color: #7dd3fc; -} -.holoToggle:hover { background: rgba(125,211,252,0.2); } -.holoToggle.on { background: rgba(125,211,252,0.28); color: #bae6fd; } diff --git a/client/lucy-desktop/src/renderer/src/voice-core/engines/boxStt.ts b/client/lucy-desktop/src/renderer/src/voice-core/engines/boxStt.ts deleted file mode 100644 index 700f659..0000000 --- a/client/lucy-desktop/src/renderer/src/voice-core/engines/boxStt.ts +++ /dev/null @@ -1,18 +0,0 @@ -// Box-STT-Adapter — Spracherkennung läuft auf der Box (MC2 /api/voice/stt -> Parakeet, -// whisper als Fallback). Der Dateiname muss zum Blob-Typ passen: der Sidecar wählt die -// Dekodierung nach Suffix (Silero-VAD liefert WAV, Push-to-Talk weiterhin webm/opus). -import { BOX_URL } from "../../config" -import type { SttEngine } from "../types" - -export class BoxSttEngine implements SttEngine { - readonly id = "box-stt" - constructor(private readonly baseUrl: string = BOX_URL) {} - - async transcribe(audio: Blob): Promise { - const fd = new FormData() - fd.append("audio", audio, audio.type.includes("wav") ? "rec.wav" : "rec.webm") - const r = await fetch(`${this.baseUrl}/api/voice/stt`, { method: "POST", body: fd }) - if (!r.ok) throw new Error(`STT ${r.status}`) - return (await r.json()).text?.trim() || "" - } -} diff --git a/client/lucy-desktop/src/renderer/src/voice-core/engines/pocketTts.ts b/client/lucy-desktop/src/renderer/src/voice-core/engines/pocketTts.ts deleted file mode 100644 index 9a13c54..0000000 --- a/client/lucy-desktop/src/renderer/src/voice-core/engines/pocketTts.ts +++ /dev/null @@ -1,39 +0,0 @@ -// Pocket-TTS-Adapter — kapselt den lokalen pocket_server (CPU, vom Main-Prozess gespawnt). -// Endpunkte: POST /tts {text}->WAV, POST /tts/stream {text}->PCM16 (+ X-Sample-Rate), GET /health. -import { TTS_URL } from "../../config" -import type { TtsEngine, TtsStreamHandle } from "../types" - -export class PocketTtsEngine implements TtsEngine { - readonly id = "pocket" - constructor(private readonly baseUrl: string = TTS_URL) {} - - async synthesize(text: string): Promise { - const r = await fetch(`${this.baseUrl}/tts`, { - method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ text }), - }) - if (!r.ok) throw new Error(`TTS ${r.status}`) - return r.arrayBuffer() - } - - async synthesizeStream(text: string): Promise { - const r = await fetch(`${this.baseUrl}/tts/stream`, { - method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ text }), - }) - if (!r.ok || !r.body) throw new Error(`TTS ${r.status}`) - const sampleRate = Number(r.headers.get("X-Sample-Rate") || "24000") - return { stream: r.body, sampleRate } - } - - // pocket_server serviert /health erst, wenn das Modell fertig geladen ist (FastAPI-lifespan). - async waitReady(timeoutMs = 120_000): Promise { - const deadline = Date.now() + timeoutMs - while (Date.now() < deadline) { - try { - const h = await (await fetch(`${this.baseUrl}/health`)).json() - if (h.status === "ok") return true - } catch { /* Dienst startet evtl. noch (Spawn + Modell-Load) */ } - await new Promise((r) => setTimeout(r, 1000)) - } - return false - } -} diff --git a/client/lucy-desktop/src/renderer/src/voice-core/index.ts b/client/lucy-desktop/src/renderer/src/voice-core/index.ts deleted file mode 100644 index 67723c6..0000000 --- a/client/lucy-desktop/src/renderer/src/voice-core/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -// voice-core — öffentliche API + aktive Engine-Auswahl. -// Aktuell fest: Pocket-TTS (lokal, Kyutai — macht auch Lucys Voice-Cloning) + Box-Whisper-STT. -// TTS-Engines beschränkt auf pocket (live) + f5 (GPU-Option). ElevenLabs/Edge/Chatterbox/Piper -// waren nur im alten Web-Pfad und sind hier bewusst NICHT dabei. Der Voice-Agent importiert NUR von hier. -import { PocketTtsEngine } from "./engines/pocketTts" -import { BoxSttEngine } from "./engines/boxStt" -import type { SttEngine, TtsEngine } from "./types" - -export const tts: TtsEngine = new PocketTtsEngine() -export const stt: SttEngine = new BoxSttEngine() - -export { SpeechScheduler } from "./speech" -export type { AudioSink } from "./speech" -export type { SttEngine, TtsEngine, TtsStreamHandle } from "./types" diff --git a/client/lucy-desktop/src/renderer/src/voice-core/speech.ts b/client/lucy-desktop/src/renderer/src/voice-core/speech.ts deleted file mode 100644 index 1742264..0000000 --- a/client/lucy-desktop/src/renderer/src/voice-core/speech.ts +++ /dev/null @@ -1,84 +0,0 @@ -// SpeechScheduler — Satz-Pipelining fürs Voll-Duplex-Gefühl (Etappe 2, Schritt 1). -// Nimmt einzelne SÄTZE entgegen, während das Hirn noch streamt, und spricht sie lückenlos -// nacheinander: erstes Audio nach dem ERSTEN Satz statt nach der ganzen Antwort. -// Barge-in-fest über eine Generation (clear() verwirft laufende + wartende Sätze). -import type { TtsEngine, TtsStreamHandle } from "./types" - -// Perf-Diagnose: misst hörbare Stille + Synthese-Zeit je Satz. Abschalten via localStorage lucy_perf=0. -const PERF = typeof localStorage !== "undefined" && localStorage.getItem("lucy_perf") !== "0" - -/** Minimaler Audio-Ausgang (AudioQueue erfüllt diese Form) — hält voice-core von der UI entkoppelt. */ -export interface AudioSink { - playPcmStream(stream: ReadableStream, sampleRate: number): Promise -} - -export class SpeechScheduler { - private pending: string[] = [] - private running = false - private gen = 0 - private lastPlayEnd = 0 // Zeitstempel Ende des vorigen Satzes (für die „Stille davor"-Messung) - /** true, sobald mindestens ein Satz seit dem letzten clear() gesprochen wurde (für Fehlererkennung). */ - playedAny = false - /** Aktiv-Signal: true beim ersten Satz, false wenn alles gesprochen ist (treibt den „speaking"-Status). */ - onBusy?: (busy: boolean) => void - - constructor(private readonly tts: TtsEngine, private readonly sink: AudioSink) {} - - /** Einen fertigen Satz einreihen (leere werden ignoriert) und ggf. den Pump starten. */ - push(text: string): void { - const t = text.trim() - if (!t) return - this.pending.push(t) - if (!this.running) void this.pump() - } - - /** Barge-in / frischer Turn: laufende + wartende Sätze verwerfen. Der Audio-Sink wird separat - * gestoppt (queue.clear()). Setzt die Fehler-/Erfolgs-Erkennung zurück. */ - clear(): void { - this.gen++ - this.pending = [] - this.playedAny = false - this.lastPlayEnd = 0 - } - - /** Wartet, bis alle eingereihten Sätze gesprochen sind. */ - async idle(): Promise { - while (this.running || this.pending.length) await new Promise((r) => setTimeout(r, 40)) - } - - private synth(text: string): Promise { - return this.tts.synthesizeStream(text).catch((e) => { console.error("TTS-Fehler:", e); return null }) - } - - private async pump(): Promise { - if (this.running) return - this.running = true - this.onBusy?.(true) - try { - // SERIELL, KEIN Prefetch: der pocket_server ist Single-Instanz. synthesizeStream liefert den - // Handle schon bei TTFB (Server generiert den Body noch) -> ein vorab angestoßenes Segment - // würde den laufenden Lauf KONKURRIEREN lassen (gemessen bei Tool-Turns: gen 17s statt 5s, - // TTFB-Spitze 14.7s). Gaplessness INNERHALB einer Antwort macht ohnehin der Server (Satz-Split - // + _compress_gaps); hier werden nur die Segmente/Tool-Häppchen der Reihe nach gesprochen. - let idx = 0 - while (this.pending.length) { - const myGen = this.gen - const tWait = performance.now() - const handle = await this.synth(this.pending.shift()!) - const synthWait = performance.now() - tWait - if (myGen !== this.gen) { if (handle) handle.stream.cancel().catch(() => {}); continue } // ge-cleared -> Server sofort freigeben - if (!handle) continue // Synthese fehlgeschlagen -> nächsten Satz versuchen - const gap = this.lastPlayEnd ? tWait - this.lastPlayEnd : 0 // hörbare Stille seit dem letzten Satz - const tPlay = performance.now() - await this.sink.playPcmStream(handle.stream, handle.sampleRate) - this.lastPlayEnd = performance.now() - this.playedAny = true - if (PERF) console.log(`[lucy-perf] TTS Satz #${idx}: Stille davor=${Math.round(gap)}ms · Synth-Warten=${Math.round(synthWait)}ms · Spieldauer=${Math.round(this.lastPlayEnd - tPlay)}ms`) - idx++ - } - } finally { - this.running = false - this.onBusy?.(false) - } - } -} diff --git a/client/lucy-desktop/src/renderer/src/voice-core/types.ts b/client/lucy-desktop/src/renderer/src/voice-core/types.ts deleted file mode 100644 index d465768..0000000 --- a/client/lucy-desktop/src/renderer/src/voice-core/types.ts +++ /dev/null @@ -1,27 +0,0 @@ -// voice-core — Engine-Adapter-Interface (Etappe 0 des Greenfield-Umbaus). -// Ziel: STT/TTS-Backends hinter EINEM Vertrag, damit pocket | f5 | piper | elevenlabs | edge -// austauschbar sind (Config/Picker) und der Voice-Agent nicht mehr direkt an URLs klebt. - -export interface SttEngine { - /** Stabiler Bezeichner der Engine (z. B. "box-whisper"). */ - readonly id: string - /** Audio (webm/opus/wav …) -> erkannter Text (leer, wenn nichts verstanden). */ - transcribe(audio: Blob): Promise -} - -/** Ergebnis einer Streaming-Synthese: fortlaufender PCM16-mono-Stream + Samplerate. */ -export interface TtsStreamHandle { - readonly stream: ReadableStream - readonly sampleRate: number -} - -export interface TtsEngine { - /** Stabiler Bezeichner der Engine (z. B. "pocket"). */ - readonly id: string - /** Vollständige Synthese in einen dekodierbaren Audio-Buffer (z. B. WAV) — für Warm-up. */ - synthesize(text: string): Promise - /** Streaming-PCM16-Synthese für niedrige Time-to-first-audio (die Live-Antwort). */ - synthesizeStream(text: string): Promise - /** Bereitschafts-/Warm-Gate: true, sobald die Engine antwortet (Modell evtl. lazy geladen). */ - waitReady(timeoutMs?: number): Promise -} diff --git a/client/lucy-desktop/start-lucy.cmd b/client/lucy-desktop/start-lucy.cmd deleted file mode 100644 index 54b36f3..0000000 --- a/client/lucy-desktop/start-lucy.cmd +++ /dev/null @@ -1,9 +0,0 @@ -@echo off -title Lucy (Dev) -cd /d "%~dp0" -echo Starte Lucy ... (dieses Fenster offen lassen; schliessen = Lucy beenden) -echo. -call npm run dev -echo. -echo Lucy wurde beendet. Taste druecken zum Schliessen. -pause >nul diff --git a/client/lucy-desktop/tsconfig.json b/client/lucy-desktop/tsconfig.json deleted file mode 100644 index 90dc141..0000000 --- a/client/lucy-desktop/tsconfig.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2022", - "module": "ESNext", - "moduleResolution": "bundler", - "jsx": "react-jsx", - "strict": true, - "esModuleInterop": true, - "skipLibCheck": true, - "resolveJsonModule": true, - "lib": ["ES2022", "DOM", "DOM.Iterable"], - "types": ["node", "electron-vite/node"] - }, - "include": ["src"] -} diff --git a/client/lucy-f5/bench_dml.py b/client/lucy-f5/bench_dml.py deleted file mode 100644 index 3f5c976..0000000 --- a/client/lucy-f5/bench_dml.py +++ /dev/null @@ -1,268 +0,0 @@ -import re -import site -import time -import jieba -import torch -import onnxruntime -import soundfile as sf -import numpy as np -from pydub import AudioSegment -from pypinyin import lazy_pinyin, Style -python_package_path = site.getsitepackages()[-1] - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-f5" -vocab_path = BASE + r"\vocab_v1.txt" -onnx_model_A = BASE + r"\onnx_f32\F5_Preprocess.onnx" -onnx_model_B = BASE + r"\onnx_f32\F5_Transformer.onnx" -onnx_model_C = BASE + r"\onnx_f32\F5_Decode.onnx" -generated_audio = BASE + r"\bench_out.wav" -test_in_english = True # eingebaute engl. Referenz -> kein Chinesisch/Pinyin; Tempo ist sprachunabhängig - -if test_in_english: - reference_audio = python_package_path + "/f5_tts/infer/examples/basic/basic_ref_en.wav" - ref_text = "Some call me nature, others call me mother nature." - # realistischer Satz-Längen-Benchmark (wie eine echte Lucy-Antwort): - gen_text = "Of course, Commander. I will restart the service, check the logs, and let you know once everything is running again." -else: - reference_audio = python_package_path + "/f5_tts/infer/examples/basic/basic_ref_zh.wav" # The reference audio path. - ref_text = "对,这就是我,万人敬仰的太乙真人。" # The ASR result of reference audio. - gen_text = "对,这就是我,万人敬仰的大可奇奇。" # The target TTS. - - -import os as _os -ORT_Accelerate_Providers = [_os.environ.get("BENCH_PROVIDER", "DmlExecutionProvider")] # DML (9070 XT) oder CPUExecutionProvider - # else keep empty. -RANDOM_SEED = 9527 # Set seed to reproduce the generated audio -NFE_STEP = int(_os.environ.get("BENCH_NFE", "32")) if (_os := __import__("os")) else 32 # via env testbar -FUSE_NFE = 1 # Maintain the same values as the exported model. -SPEED = 1.0 # Set for talking speed. Only works with dynamic_axes=True -MAX_THREADS = 8 # Max CPU parallel threads. -DEVICE_ID = 0 # The GPU id, default to 0. -MODEL_SAMPLE_RATE = 24000 # Do not modify it. -HOP_LENGTH = 256 # It affects the generated audio length and speech speed. - -if "OpenVINOExecutionProvider" in ORT_Accelerate_Providers: - provider_options = [ - { - 'device_type': 'CPU', # [CPU, NPU, GPU, GPU.0, GPU.1]] - 'precision': 'ACCURACY', # [FP32, FP16, ACCURACY] - 'num_of_threads': MAX_THREADS, - 'num_streams': 1, - 'enable_opencl_throttling': True, - 'enable_qdq_optimizer': False # Enable it carefully - } - ] -elif "CUDAExecutionProvider" in ORT_Accelerate_Providers: - provider_options = [ - { - 'device_id': DEVICE_ID, - 'gpu_mem_limit': 8 * 1024 * 1024 * 1024, # 8 GB - 'arena_extend_strategy': 'kNextPowerOfTwo', - 'cudnn_conv_algo_search': 'EXHAUSTIVE', - 'cudnn_conv_use_max_workspace': '1', - 'do_copy_in_default_stream': '1', - 'cudnn_conv1d_pad_to_nc1d': '1', - 'enable_cuda_graph': '0', # Set to '0' to avoid potential errors when enabled. - 'use_tf32': '0' - } - ] -else: - # Please config by yourself for others providers. - provider_options = None - - -with open(vocab_path, "r", encoding="utf-8") as f: - vocab_char_map = {} - for i, char in enumerate(f): - vocab_char_map[char[:-1]] = i -vocab_size = len(vocab_char_map) - - -# From the official code -def convert_char_to_pinyin(text_list, polyphone=True): - if jieba.dt.initialized is False: - jieba.default_logger.setLevel(50) # CRITICAL - jieba.initialize() - - final_text_list = [] - custom_trans = str.maketrans( - {";": ",", "“": '"', "”": '"', "‘": "'", "’": "'"} - ) # add custom trans here, to address oov - - def is_chinese(c): - return ( - "\u3100" <= c <= "\u9fff" # common chinese characters - ) - - for text in text_list: - char_list = [] - text = text.translate(custom_trans) - for seg in jieba.cut(text): - seg_byte_len = len(bytes(seg, "UTF-8")) - if seg_byte_len == len(seg): # if pure alphabets and symbols - if char_list and seg_byte_len > 1 and char_list[-1] not in " :'\"": - char_list.append(" ") - char_list.extend(seg) - elif polyphone and seg_byte_len == 3 * len(seg): # if pure east asian characters - seg_ = lazy_pinyin(seg, style=Style.TONE3, tone_sandhi=True) - for i, c in enumerate(seg): - if is_chinese(c): - char_list.append(" ") - char_list.append(seg_[i]) - else: # if mixed characters, alphabets and symbols - for c in seg: - if ord(c) < 256: - char_list.extend(c) - elif is_chinese(c): - char_list.append(" ") - char_list.extend(lazy_pinyin(c, style=Style.TONE3, tone_sandhi=True)) - else: - char_list.append(c) - final_text_list.append(char_list) - return final_text_list - - -# From the official code -def list_str_to_idx( - text: list[str] | list[list[str]], - vocab_char_map: dict[str, int], # {char: idx} - padding_value=-1 -): - get_idx = vocab_char_map.get - list_idx_tensors = [torch.tensor([get_idx(c, 0) for c in t], dtype=torch.int32) for t in text] - text = torch.nn.utils.rnn.pad_sequence(list_idx_tensors, padding_value=padding_value, batch_first=True) - return text - - -def normalize_to_int16(audio): - max_val = np.max(np.abs(audio)) - scaling_factor = 32767.0 / max_val if max_val > 0 else 1.0 - return (audio * float(scaling_factor)).astype(np.int16) - - -# ONNX Runtime settings -onnxruntime.set_seed(RANDOM_SEED) -session_opts = onnxruntime.SessionOptions() -session_opts.log_severity_level = 4 # fatal level = 4, it an adjustable value. -session_opts.log_verbosity_level = 4 # fatal level = 4, it an adjustable value. -session_opts.inter_op_num_threads = MAX_THREADS # Run different nodes with num_threads. Set 0 for auto. -session_opts.intra_op_num_threads = MAX_THREADS # Under the node, execute the operators with num_threads. Set 0 for auto. -session_opts.enable_cpu_mem_arena = True # True for execute speed; False for less memory usage. -session_opts.execution_mode = onnxruntime.ExecutionMode.ORT_SEQUENTIAL -session_opts.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_ALL -session_opts.add_session_config_entry("session.intra_op.allow_spinning", "1") -session_opts.add_session_config_entry("session.inter_op.allow_spinning", "1") -session_opts.add_session_config_entry("session.set_denormal_as_zero", "1") - -session_opts.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_ALL -ort_session_A = onnxruntime.InferenceSession(onnx_model_A, sess_options=session_opts, providers=['CPUExecutionProvider'], provider_options=None) -model_type = ort_session_A._inputs_meta[0].type -in_name_A = ort_session_A.get_inputs() -out_name_A = ort_session_A.get_outputs() -in_name_A0 = in_name_A[0].name -in_name_A1 = in_name_A[1].name -in_name_A2 = in_name_A[2].name -out_name_A0 = out_name_A[0].name -out_name_A1 = out_name_A[1].name -out_name_A2 = out_name_A[2].name -out_name_A3 = out_name_A[3].name -out_name_A4 = out_name_A[4].name -out_name_A5 = out_name_A[5].name -out_name_A6 = out_name_A[6].name -out_name_A7 = out_name_A[7].name - -if "CPUExecutionProvider" in ORT_Accelerate_Providers or not ORT_Accelerate_Providers: - session_opts.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_ALL -else: - session_opts.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_BASIC -ort_session_B = onnxruntime.InferenceSession(onnx_model_B, sess_options=session_opts, providers=ORT_Accelerate_Providers, provider_options=provider_options) -ORT_Accelerate_Providers = ort_session_B.get_providers()[0] -# For Windows DirectML + Intel/AMD/Nvidia GPU, -# pip install onnxruntime-directml --upgrade -# ort_session_B = onnxruntime.InferenceSession(onnx_model_B, sess_options=session_opts, providers=['DmlExecutionProvider']) -print(f"\nUsable Providers: {ORT_Accelerate_Providers}") -model_dtype = ort_session_B._inputs_meta[0].type -in_name_B = ort_session_B.get_inputs() -out_name_B = ort_session_B.get_outputs() -in_name_B0 = in_name_B[0].name -in_name_B1 = in_name_B[1].name -in_name_B2 = in_name_B[2].name -in_name_B3 = in_name_B[3].name -in_name_B4 = in_name_B[4].name -in_name_B5 = in_name_B[5].name -in_name_B6 = in_name_B[6].name -in_name_B7 = in_name_B[7].name -out_name_B0 = out_name_B[0].name -out_name_B1 = out_name_B[1].name - -session_opts.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_ALL -ort_session_C = onnxruntime.InferenceSession(onnx_model_C, sess_options=session_opts, providers=['CPUExecutionProvider'], provider_options=None) -in_name_C = ort_session_C.get_inputs() -out_name_C = ort_session_C.get_outputs() -in_name_C0 = in_name_C[0].name -in_name_C1 = in_name_C[1].name -out_name_C0 = out_name_C[0].name - -# Load the input audio -print(f"\nReference Audio: {reference_audio}") -audio = np.array(AudioSegment.from_file(reference_audio).set_channels(1).set_frame_rate(MODEL_SAMPLE_RATE).get_array_of_samples(), dtype=np.float32) -audio = normalize_to_int16(audio) -audio_len = len(audio) -audio = audio.reshape(1, 1, -1) - -zh_pause_punc = r"。,、;:?!" -ref_text_len = len(ref_text.encode('utf-8')) + 3 * len(re.findall(zh_pause_punc, ref_text)) -gen_text_len = len(gen_text.encode('utf-8')) + 3 * len(re.findall(zh_pause_punc, gen_text)) -ref_audio_len = audio_len // HOP_LENGTH + 1 -max_duration = np.array([ref_audio_len + int(ref_audio_len / ref_text_len * gen_text_len / SPEED)], dtype=np.int64) -gen_text = convert_char_to_pinyin([ref_text + gen_text]) -text_ids = list_str_to_idx(gen_text, vocab_char_map).numpy() -time_step = np.array([0], dtype=np.int32) - -if "CPUExecutionProvider" in ORT_Accelerate_Providers or not ORT_Accelerate_Providers: - device_type = 'cpu' -elif "CUDAExecutionProvider" in ORT_Accelerate_Providers or "TensorrtExecutionProvider" in ORT_Accelerate_Providers: - device_type = 'cuda' -elif "DmlExecutionProvider" in ORT_Accelerate_Providers: - device_type = 'dml' -else: - device_type = None - -def run_pipeline(): - a_out = ort_session_A.run( - [out_name_A0, out_name_A1, out_name_A2, out_name_A3, out_name_A4, out_name_A5, out_name_A6, out_name_A7], - {in_name_A0: audio, in_name_A1: text_ids, in_name_A2: max_duration}) - noise, rope_cos_q, rope_sin_q, rope_cos_k, rope_sin_k, cat_mel_text, cat_mel_text_drop, ref_signal_len = a_out - ts = np.array([0], dtype=np.int32) - if device_type: - inputs = [onnxruntime.OrtValue.ortvalue_from_numpy(x, device_type, DEVICE_ID) for x in - (noise, rope_cos_q, rope_sin_q, rope_cos_k, rope_sin_k, cat_mel_text, cat_mel_text_drop, ts)] - outputs = [inputs[0], inputs[-1]] - iob = ort_session_B.io_binding() - for i in range(len(inputs)): - iob.bind_ortvalue_input(name=in_name_B[i].name, ortvalue=inputs[i]) - for i in range(len(outputs)): - iob.bind_ortvalue_output(name=out_name_B[i].name, ortvalue=outputs[i]) - for _ in range(0, NFE_STEP, FUSE_NFE): - ort_session_B.run_with_iobinding(iob) - noise = onnxruntime.OrtValue.numpy(iob.get_outputs()[0]) - else: - for _ in range(0, NFE_STEP - 1, FUSE_NFE): - noise, ts = ort_session_B.run( - [out_name_B0, out_name_B1], - {in_name_B0: noise, in_name_B1: rope_cos_q, in_name_B2: rope_sin_q, in_name_B3: rope_cos_k, - in_name_B4: rope_sin_k, in_name_B5: cat_mel_text, in_name_B6: cat_mel_text_drop, in_name_B7: ts}) - return ort_session_C.run([out_name_C0], {in_name_C0: noise, in_name_C1: ref_signal_len})[0] - -print(f"\nProvider={ORT_Accelerate_Providers} device_type={device_type} NFE={NFE_STEP}") -print("Warmup (DML kompiliert beim 1. Lauf die Shader) ...") -t0 = time.time(); _ = run_pipeline(); print(f" warmup gen = {time.time()-t0:.2f}s") -best = 1e9 -for k in range(2): - t0 = time.time(); gen = run_pipeline(); dt = time.time() - t0; best = min(best, dt) - print(f" run {k+1}: gen = {dt:.2f}s") -audio_s = gen.reshape(-1).shape[0] / MODEL_SAMPLE_RATE -sf.write(generated_audio, gen.reshape(-1), MODEL_SAMPLE_RATE, format='WAVEX') -rtf = best / max(audio_s, 0.01) -print(f"\n=== ERGEBNIS NFE={NFE_STEP} === audio={audio_s:.2f}s gen(best)={best:.2f}s RTF={rtf:.2f} " - f"({'REAL-TIME' if rtf < 1 else 'zu langsam'})") diff --git a/client/lucy-f5/dakeqq_infer.py b/client/lucy-f5/dakeqq_infer.py deleted file mode 100644 index bf98269..0000000 --- a/client/lucy-f5/dakeqq_infer.py +++ /dev/null @@ -1,298 +0,0 @@ -import re -import site -import time -import jieba -import torch -import onnxruntime -import soundfile as sf -import numpy as np -from pydub import AudioSegment -from pypinyin import lazy_pinyin, Style -python_package_path = site.getsitepackages()[-1] - -vocab_path = "/home/DakeQQ/Downloads/F5TTS_v1_Base/vocab.txt" # The F5-TTS model vocab download path. URL: https://huggingface.co/SWivid/F5-TTS/tree/main/F5TTS_v1_Base -onnx_model_A = "/home/DakeQQ/Downloads/F5_Optimized/F5_Preprocess.onnx" # The exported onnx model path. -onnx_model_B = "/home/DakeQQ/Downloads/F5_Optimized/F5_Transformer.onnx" # The exported onnx model path. -onnx_model_C = "/home/DakeQQ/Downloads/F5_Optimized/F5_Decode.onnx" # The exported onnx model path. -generated_audio = "./generated_audio.wav" -test_in_english = False - -if test_in_english: - reference_audio = python_package_path + "/f5_tts/infer/examples/basic/basic_ref_en.wav" - ref_text = "Some call me nature, others call me mother nature." - gen_text = "Some call me Dake, others call me QQ." -else: - reference_audio = python_package_path + "/f5_tts/infer/examples/basic/basic_ref_zh.wav" # The reference audio path. - ref_text = "对,这就是我,万人敬仰的太乙真人。" # The ASR result of reference audio. - gen_text = "对,这就是我,万人敬仰的大可奇奇。" # The target TTS. - - -ORT_Accelerate_Providers = ['CPUExecutionProvider'] # If you have accelerate devices for : ['CUDAExecutionProvider', 'TensorrtExecutionProvider', 'CoreMLExecutionProvider', 'DmlExecutionProvider', 'OpenVINOExecutionProvider', 'ROCMExecutionProvider', 'MIGraphXExecutionProvider', 'AzureExecutionProvider'] - # else keep empty. -RANDOM_SEED = 9527 # Set seed to reproduce the generated audio -NFE_STEP = 32 # F5-TTS model setting, 0~31 -FUSE_NFE = 1 # Maintain the same values as the exported model. -SPEED = 1.0 # Set for talking speed. Only works with dynamic_axes=True -MAX_THREADS = 8 # Max CPU parallel threads. -DEVICE_ID = 0 # The GPU id, default to 0. -MODEL_SAMPLE_RATE = 24000 # Do not modify it. -HOP_LENGTH = 256 # It affects the generated audio length and speech speed. - -if "OpenVINOExecutionProvider" in ORT_Accelerate_Providers: - provider_options = [ - { - 'device_type': 'CPU', # [CPU, NPU, GPU, GPU.0, GPU.1]] - 'precision': 'ACCURACY', # [FP32, FP16, ACCURACY] - 'num_of_threads': MAX_THREADS, - 'num_streams': 1, - 'enable_opencl_throttling': True, - 'enable_qdq_optimizer': False # Enable it carefully - } - ] -elif "CUDAExecutionProvider" in ORT_Accelerate_Providers: - provider_options = [ - { - 'device_id': DEVICE_ID, - 'gpu_mem_limit': 8 * 1024 * 1024 * 1024, # 8 GB - 'arena_extend_strategy': 'kNextPowerOfTwo', - 'cudnn_conv_algo_search': 'EXHAUSTIVE', - 'cudnn_conv_use_max_workspace': '1', - 'do_copy_in_default_stream': '1', - 'cudnn_conv1d_pad_to_nc1d': '1', - 'enable_cuda_graph': '0', # Set to '0' to avoid potential errors when enabled. - 'use_tf32': '0' - } - ] -else: - # Please config by yourself for others providers. - provider_options = None - - -with open(vocab_path, "r", encoding="utf-8") as f: - vocab_char_map = {} - for i, char in enumerate(f): - vocab_char_map[char[:-1]] = i -vocab_size = len(vocab_char_map) - - -# From the official code -def convert_char_to_pinyin(text_list, polyphone=True): - if jieba.dt.initialized is False: - jieba.default_logger.setLevel(50) # CRITICAL - jieba.initialize() - - final_text_list = [] - custom_trans = str.maketrans( - {";": ",", "“": '"', "”": '"', "‘": "'", "’": "'"} - ) # add custom trans here, to address oov - - def is_chinese(c): - return ( - "\u3100" <= c <= "\u9fff" # common chinese characters - ) - - for text in text_list: - char_list = [] - text = text.translate(custom_trans) - for seg in jieba.cut(text): - seg_byte_len = len(bytes(seg, "UTF-8")) - if seg_byte_len == len(seg): # if pure alphabets and symbols - if char_list and seg_byte_len > 1 and char_list[-1] not in " :'\"": - char_list.append(" ") - char_list.extend(seg) - elif polyphone and seg_byte_len == 3 * len(seg): # if pure east asian characters - seg_ = lazy_pinyin(seg, style=Style.TONE3, tone_sandhi=True) - for i, c in enumerate(seg): - if is_chinese(c): - char_list.append(" ") - char_list.append(seg_[i]) - else: # if mixed characters, alphabets and symbols - for c in seg: - if ord(c) < 256: - char_list.extend(c) - elif is_chinese(c): - char_list.append(" ") - char_list.extend(lazy_pinyin(c, style=Style.TONE3, tone_sandhi=True)) - else: - char_list.append(c) - final_text_list.append(char_list) - return final_text_list - - -# From the official code -def list_str_to_idx( - text: list[str] | list[list[str]], - vocab_char_map: dict[str, int], # {char: idx} - padding_value=-1 -): - get_idx = vocab_char_map.get - list_idx_tensors = [torch.tensor([get_idx(c, 0) for c in t], dtype=torch.int32) for t in text] - text = torch.nn.utils.rnn.pad_sequence(list_idx_tensors, padding_value=padding_value, batch_first=True) - return text - - -def normalize_to_int16(audio): - max_val = np.max(np.abs(audio)) - scaling_factor = 32767.0 / max_val if max_val > 0 else 1.0 - return (audio * float(scaling_factor)).astype(np.int16) - - -# ONNX Runtime settings -onnxruntime.set_seed(RANDOM_SEED) -session_opts = onnxruntime.SessionOptions() -session_opts.log_severity_level = 4 # fatal level = 4, it an adjustable value. -session_opts.log_verbosity_level = 4 # fatal level = 4, it an adjustable value. -session_opts.inter_op_num_threads = MAX_THREADS # Run different nodes with num_threads. Set 0 for auto. -session_opts.intra_op_num_threads = MAX_THREADS # Under the node, execute the operators with num_threads. Set 0 for auto. -session_opts.enable_cpu_mem_arena = True # True for execute speed; False for less memory usage. -session_opts.execution_mode = onnxruntime.ExecutionMode.ORT_SEQUENTIAL -session_opts.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_ALL -session_opts.add_session_config_entry("session.intra_op.allow_spinning", "1") -session_opts.add_session_config_entry("session.inter_op.allow_spinning", "1") -session_opts.add_session_config_entry("session.set_denormal_as_zero", "1") - -session_opts.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_ALL -ort_session_A = onnxruntime.InferenceSession(onnx_model_A, sess_options=session_opts, providers=['CPUExecutionProvider'], provider_options=None) -model_type = ort_session_A._inputs_meta[0].type -in_name_A = ort_session_A.get_inputs() -out_name_A = ort_session_A.get_outputs() -in_name_A0 = in_name_A[0].name -in_name_A1 = in_name_A[1].name -in_name_A2 = in_name_A[2].name -out_name_A0 = out_name_A[0].name -out_name_A1 = out_name_A[1].name -out_name_A2 = out_name_A[2].name -out_name_A3 = out_name_A[3].name -out_name_A4 = out_name_A[4].name -out_name_A5 = out_name_A[5].name -out_name_A6 = out_name_A[6].name -out_name_A7 = out_name_A[7].name - -if "CPUExecutionProvider" in ORT_Accelerate_Providers or not ORT_Accelerate_Providers: - session_opts.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_ALL -else: - session_opts.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_BASIC -ort_session_B = onnxruntime.InferenceSession(onnx_model_B, sess_options=session_opts, providers=ORT_Accelerate_Providers, provider_options=provider_options) -ORT_Accelerate_Providers = ort_session_B.get_providers()[0] -# For Windows DirectML + Intel/AMD/Nvidia GPU, -# pip install onnxruntime-directml --upgrade -# ort_session_B = onnxruntime.InferenceSession(onnx_model_B, sess_options=session_opts, providers=['DmlExecutionProvider']) -print(f"\nUsable Providers: {ORT_Accelerate_Providers}") -model_dtype = ort_session_B._inputs_meta[0].type -in_name_B = ort_session_B.get_inputs() -out_name_B = ort_session_B.get_outputs() -in_name_B0 = in_name_B[0].name -in_name_B1 = in_name_B[1].name -in_name_B2 = in_name_B[2].name -in_name_B3 = in_name_B[3].name -in_name_B4 = in_name_B[4].name -in_name_B5 = in_name_B[5].name -in_name_B6 = in_name_B[6].name -in_name_B7 = in_name_B[7].name -out_name_B0 = out_name_B[0].name -out_name_B1 = out_name_B[1].name - -session_opts.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_ALL -ort_session_C = onnxruntime.InferenceSession(onnx_model_C, sess_options=session_opts, providers=['CPUExecutionProvider'], provider_options=None) -in_name_C = ort_session_C.get_inputs() -out_name_C = ort_session_C.get_outputs() -in_name_C0 = in_name_C[0].name -in_name_C1 = in_name_C[1].name -out_name_C0 = out_name_C[0].name - -# Load the input audio -print(f"\nReference Audio: {reference_audio}") -audio = np.array(AudioSegment.from_file(reference_audio).set_channels(1).set_frame_rate(MODEL_SAMPLE_RATE).get_array_of_samples(), dtype=np.float32) -audio = normalize_to_int16(audio) -audio_len = len(audio) -audio = audio.reshape(1, 1, -1) - -zh_pause_punc = r"。,、;:?!" -ref_text_len = len(ref_text.encode('utf-8')) + 3 * len(re.findall(zh_pause_punc, ref_text)) -gen_text_len = len(gen_text.encode('utf-8')) + 3 * len(re.findall(zh_pause_punc, gen_text)) -ref_audio_len = audio_len // HOP_LENGTH + 1 -max_duration = np.array([ref_audio_len + int(ref_audio_len / ref_text_len * gen_text_len / SPEED)], dtype=np.int64) -gen_text = convert_char_to_pinyin([ref_text + gen_text]) -text_ids = list_str_to_idx(gen_text, vocab_char_map).numpy() -time_step = np.array([0], dtype=np.int32) - -if "CPUExecutionProvider" in ORT_Accelerate_Providers or not ORT_Accelerate_Providers: - device_type = 'cpu' -elif "CUDAExecutionProvider" in ORT_Accelerate_Providers or "TensorrtExecutionProvider" in ORT_Accelerate_Providers: - device_type = 'cuda' -elif "DmlExecutionProvider" in ORT_Accelerate_Providers: - device_type = 'dml' -else: - device_type = None - -print("\n\nRun F5-TTS by ONNX Runtime.") -start_count = time.time() -noise, rope_cos_q, rope_sin_q, rope_cos_k, rope_sin_k, cat_mel_text, cat_mel_text_drop, ref_signal_len = ort_session_A.run( - [out_name_A0, out_name_A1, out_name_A2, out_name_A3, out_name_A4, out_name_A5, out_name_A6, out_name_A7], - { - in_name_A0: audio, - in_name_A1: text_ids, - in_name_A2: max_duration - }) - -if device_type: - inputs = [ - onnxruntime.OrtValue.ortvalue_from_numpy(noise, device_type, DEVICE_ID), - onnxruntime.OrtValue.ortvalue_from_numpy(rope_cos_q, device_type, DEVICE_ID), - onnxruntime.OrtValue.ortvalue_from_numpy(rope_sin_q, device_type, DEVICE_ID), - onnxruntime.OrtValue.ortvalue_from_numpy(rope_cos_k, device_type, DEVICE_ID), - onnxruntime.OrtValue.ortvalue_from_numpy(rope_sin_k, device_type, DEVICE_ID), - onnxruntime.OrtValue.ortvalue_from_numpy(cat_mel_text, device_type, DEVICE_ID), - onnxruntime.OrtValue.ortvalue_from_numpy(cat_mel_text_drop, device_type, DEVICE_ID), - onnxruntime.OrtValue.ortvalue_from_numpy(time_step, device_type, DEVICE_ID) - ] - outputs = [ - inputs[0], - inputs[-1] - ] - - io_binding = ort_session_B.io_binding() - for i in range(len(inputs)): - io_binding.bind_ortvalue_input( - name=in_name_B[i].name, - ortvalue=inputs[i] - ) - for i in range(len(outputs)): - io_binding.bind_ortvalue_output( - name=out_name_B[i].name, - ortvalue=outputs[i] - ) - - print("NFE_STEP: 0") - for i in range(0, NFE_STEP, FUSE_NFE): - ort_session_B.run_with_iobinding(io_binding) - print(f"NFE_STEP: {i + FUSE_NFE}") - noise = onnxruntime.OrtValue.numpy(io_binding.get_outputs()[0]) -else: - print("NFE_STEP: 0") - for i in range(0, NFE_STEP - 1, FUSE_NFE): - noise, time_step = ort_session_B.run( - [out_name_B0, out_name_B1], - { - in_name_B0: noise, - in_name_B1: rope_cos_q, - in_name_B2: rope_sin_q, - in_name_B3: rope_cos_k, - in_name_B4: rope_sin_k, - in_name_B5: cat_mel_text, - in_name_B6: cat_mel_text_drop, - in_name_B7: time_step - }) - print(f"NFE_STEP: {i + FUSE_NFE}") - -generated_signal = ort_session_C.run( - [out_name_C0], - { - in_name_C0: noise, - in_name_C1: ref_signal_len - })[0] -end_count = time.time() - -# Save to audio -sf.write(generated_audio, generated_signal.reshape(-1), MODEL_SAMPLE_RATE, format='WAVEX') -print(f"\nAudio generation is complete.\n\nONNXRuntime Time Cost in Seconds:\n{end_count - start_count:.3f}") diff --git a/client/lucy-f5/f5_server.py b/client/lucy-f5/f5_server.py deleted file mode 100644 index 87d9806..0000000 --- a/client/lucy-f5/f5_server.py +++ /dev/null @@ -1,196 +0,0 @@ -# -*- coding: utf-8 -*- -"""Lucy-Stimme v2: F5-TTS (deutsch) via ONNX Runtime + DirectML (9070 XT, nativ Windows, kein ROCm). -Non-autoregressiv -> keine Kollaps-/Wiederhol-/Männerstimmen-Fehler wie pocket. Satzweises Streaming. -Modelliert nach dem verifizierten DML-Benchmark (bench_dml.py) + Export_F5-Preprocessing + pocket_server-Struktur.""" -import os, io, re, time, threading, logging -import numpy as np, soundfile as sf, librosa, jieba, torch -import onnxruntime as ort -from pypinyin import lazy_pinyin, Style -from fastapi import FastAPI -from fastapi.responses import Response, JSONResponse, StreamingResponse -from pydantic import BaseModel -from contextlib import asynccontextmanager - -log = logging.getLogger("lucy-f5"); logging.basicConfig(level=logging.INFO) -BASE = os.path.dirname(os.path.abspath(__file__)) -ONNX_DIR = os.environ.get("LUCY_F5_ONNX", os.path.join(BASE, "onnx_de")) -VOCAB = os.environ.get("LUCY_F5_VOCAB", os.path.join(BASE, "vocab.txt")) -REF_WAV = os.environ.get("LUCY_F5_REF", os.path.join(BASE, "lucy_ref.wav")) -REF_TXT = os.environ.get("LUCY_F5_REF_TXT", os.path.join(BASE, "lucy_ref.txt")) -PROVIDER = os.environ.get("LUCY_F5_PROVIDER", "DmlExecutionProvider") -NFE_STEP = int(os.environ.get("LUCY_F5_NFE", "32")) # MUSS zum Export passen (Zeitplan ist eingebacken) -TARGET_RMS = float(os.environ.get("LUCY_TARGET_RMS", "0.09")) -SR = 24000; HOP_LENGTH = 256 -STATE, LOCK = {}, threading.Lock() - -# ---- Text-Preprocessing (aus Export_F5.py; für Deutsch laufen Nicht-CJK-Zeichen einfach durch) ---- -def _load_vocab(path): - m = {} - with open(path, "r", encoding="utf-8") as f: - for i, ch in enumerate(f): - m[ch[:-1]] = i - return m - -def convert_char_to_pinyin(text_list, polyphone=True): - if jieba.dt.initialized is False: - jieba.default_logger.setLevel(50); jieba.initialize() - out, trans = [], str.maketrans({";": ",", "“": '"', "”": '"', "‘": "'", "’": "'"}) - def is_zh(c): return "㄀" <= c <= "鿿" - for text in text_list: - cl = []; text = text.translate(trans) - for seg in jieba.cut(text): - blen = len(bytes(seg, "UTF-8")) - if blen == len(seg): - if cl and blen > 1 and cl[-1] not in " :'\"": cl.append(" ") - cl.extend(seg) - elif polyphone and blen == 3 * len(seg): - pin = lazy_pinyin(seg, style=Style.TONE3, tone_sandhi=True) - for i, c in enumerate(seg): - if is_zh(c): cl.append(" ") - cl.append(pin[i]) - else: - for c in seg: - if ord(c) < 256: cl.extend(c) - elif is_zh(c): cl.append(" "); cl.extend(lazy_pinyin(c, style=Style.TONE3, tone_sandhi=True)) - else: cl.append(c) - out.append(cl) - return out - -def list_str_to_idx(text, vocab_map, padding_value=-1): - get = vocab_map.get - tensors = [torch.tensor([get(c, 0) for c in t], dtype=torch.int32) for t in text] - return torch.nn.utils.rnn.pad_sequence(tensors, padding_value=padding_value, batch_first=True).numpy() - -_ZH_PUNC = r"。,、;:?!" -def _text_len(s): return len(s.encode("utf-8")) + 3 * len(re.findall(_ZH_PUNC, s)) - -# ---- Satz-Splitter (wie pocket) ---- -_SENT_RX = re.compile(r".+?(?:[.!?…]+(?:\s|$)|$)", re.S) -def split_sentences(text, min_len=30): - parts = [m.group(0).strip() for m in _SENT_RX.finditer(text.strip())] - out = [] - for p in parts: - if not p: continue - if out and len(out[-1]) < min_len: out[-1] = f"{out[-1]} {p}" - else: out.append(p) - return out or [text.strip()] - -def cleanup(a, sr): - """F5-Output putzen: Stille-Trim hinten, RMS-Norm auf TARGET_RMS, Peak-Clamp, 80ms-Pads.""" - a = np.asarray(a, dtype=np.float32).reshape(-1) - if a.size == 0: return a - rev, _ = librosa.effects.trim(a[::-1], top_db=40); a = rev[::-1] if rev.size else a - yt, _ = librosa.effects.trim(a, top_db=40); a = yt if yt.size else a - rms = float(np.sqrt(np.mean(a ** 2))) or 1e-9 - a = a * (TARGET_RMS / rms) - peak = float(np.max(np.abs(a))) - if peak > 0.95: a = a * (0.95 / peak) - fi = min(int(0.008 * sr), a.size // 2) - if fi > 0: - a[:fi] *= np.linspace(0., 1., fi, dtype=np.float32); a[-fi:] *= np.linspace(1., 0., fi, dtype=np.float32) - pad = np.zeros(int(0.08 * sr), dtype=np.float32) - return np.concatenate([pad, a, pad]) - -def _to_pcm16(a): - a = np.asarray(a, dtype=np.float32).reshape(-1) - np.clip(a, -0.95, 0.95, out=a) - return (a * 32767.0).astype(" np.ndarray: - s = STATE - ref_text = s["ref_text"] - rt_len = _text_len(ref_text); gt_len = max(_text_len(gen_text), 1) - ref_audio_len = s["ref_audio"].shape[-1] // HOP_LENGTH + 1 - max_duration = np.array([ref_audio_len + int(ref_audio_len / rt_len * gt_len)], dtype=np.int64) - text = convert_char_to_pinyin([ref_text + gen_text]) - text_ids = list_str_to_idx(text, s["vocab"]) - A = s["A"].run(s["A_out"], {s["A_in"][0]: s["ref_audio"], s["A_in"][1]: text_ids, s["A_in"][2]: max_duration}) - noise, rcq, rsq, rck, rsk, cmt, cmtd, ref_signal_len = A - dev = s["dev"] - if dev: # DirectML/CUDA: io_binding, Tensoren GPU-resident über die NFE-Schleife - ts = np.array([0], dtype=np.int32) - ins = [ort.OrtValue.ortvalue_from_numpy(x, dev, 0) for x in (noise, rcq, rsq, rck, rsk, cmt, cmtd, ts)] - outs = [ins[0], ins[-1]] - iob = s["B"].io_binding() - for i in range(len(ins)): iob.bind_ortvalue_input(name=s["B_in"][i], ortvalue=ins[i]) - for i in range(len(outs)): iob.bind_ortvalue_output(name=s["B_out"][i], ortvalue=outs[i]) - for _ in range(0, NFE_STEP, 1): s["B"].run_with_iobinding(iob) - noise = ort.OrtValue.numpy(iob.get_outputs()[0]) - else: - ts = np.array([0], dtype=np.int32) - for _ in range(0, NFE_STEP - 1, 1): - noise, ts = s["B"].run(s["B_out"], {s["B_in"][0]: noise, s["B_in"][1]: rcq, s["B_in"][2]: rsq, - s["B_in"][3]: rck, s["B_in"][4]: rsk, s["B_in"][5]: cmt, s["B_in"][6]: cmtd, s["B_in"][7]: ts}) - out = s["C"].run([s["C_out"]], {s["C_in"][0]: noise, s["C_in"][1]: ref_signal_len})[0] - a = np.asarray(out).reshape(-1).astype(np.float32) - if a.dtype != np.float32 or np.max(np.abs(a)) > 1.5: # int16-Decoder -> auf float - a = a / 32768.0 - return a - -@asynccontextmanager -async def lifespan(app): - t0 = time.time(); log.info("Lade F5 ONNX (%s) ...", PROVIDER) - so = ort.SessionOptions(); so.log_severity_level = 4 - so.graph_optimization_level = ort.GraphOptimizationLevel.ORT_ENABLE_ALL - A = ort.InferenceSession(os.path.join(ONNX_DIR, "F5_Preprocess.onnx"), so, providers=["CPUExecutionProvider"]) - B = ort.InferenceSession(os.path.join(ONNX_DIR, "F5_Transformer.onnx"), so, providers=[PROVIDER]) - C = ort.InferenceSession(os.path.join(ONNX_DIR, "F5_Decode.onnx"), so, providers=["CPUExecutionProvider"]) - prov = B.get_providers()[0] - dev = "dml" if "Dml" in prov else ("cuda" if "CUDA" in prov or "Tensorrt" in prov else None) - # Lucy-Referenz als int16 laden (Decoder/Preprocess erwartet int16-Pfad) - ref, _sr = sf.read(REF_WAV, dtype="float32", always_2d=False) - ref = np.asarray(ref, dtype=np.float32).reshape(-1) - if _sr != SR: ref = librosa.resample(ref, orig_sr=_sr, target_sr=SR) - mx = np.max(np.abs(ref)) or 1.0 - ref_i16 = (ref * (32767.0 / mx)).astype(np.int16).reshape(1, 1, -1) - STATE.update( - A=A, B=B, C=C, dev=dev, prov=prov, - A_in=[i.name for i in A.get_inputs()], A_out=[o.name for o in A.get_outputs()], - B_in=[i.name for i in B.get_inputs()], B_out=[o.name for o in B.get_outputs()], - C_in=[i.name for i in C.get_inputs()], C_out=C.get_outputs()[0].name, - vocab=_load_vocab(VOCAB), ref_audio=ref_i16, - ref_text=open(REF_TXT, encoding="utf-8").read().strip(), - ) - log.info("Lucy-F5 bereit in %.1fs (Provider=%s, dev=%s, NFE=%d)", time.time() - t0, prov, dev, NFE_STEP) - yield - STATE.clear() - -app = FastAPI(title="Lucy TTS (F5/DirectML)", lifespan=lifespan) - -class Req(BaseModel): - text: str - -@app.get("/health") -def health(): - return {"status": "ok" if "A" in STATE else "loading", "engine": "f5-tts", - "provider": STATE.get("prov"), "nfe": NFE_STEP, "sr": SR} - -@app.post("/tts") -def tts(req: Req): - if "A" not in STATE: return JSONResponse({"error": "loading"}, status_code=503) - t0 = time.time() - parts = [] - with LOCK: - for sent in split_sentences(req.text): - parts.append(cleanup(_infer(sent), SR)) - a = np.concatenate(parts) if parts else np.zeros(0, np.float32) - buf = io.BytesIO(); sf.write(buf, a, SR, format="WAV", subtype="PCM_16"); buf.seek(0) - dur = a.size / SR; gen = time.time() - t0 - log.info("/tts %dZ audio=%.1fs gen=%.1fs rtf=%.2f", len(req.text), dur, gen, gen / max(dur, 0.01)) - return Response(buf.read(), media_type="audio/wav", - headers={"X-Audio-Seconds": f"{dur:.2f}", "X-Gen-Seconds": f"{gen:.2f}"}) - -@app.post("/tts/stream") -def tts_stream(req: Req): - if "A" not in STATE: return JSONResponse({"error": "loading"}, status_code=503) - sentences = split_sentences(req.text) - def pcm(): - t0 = time.time(); total = 0; first = True - with LOCK: - for sent in sentences: - a = cleanup(_infer(sent), SR); total += a.size - if first: log.info("/tts/stream TTFB=%.2fs (%d Sätze)", time.time() - t0, len(sentences)); first = False - yield _to_pcm16(a) - log.info("/tts/stream %dZ audio=%.1fs gen=%.1fs", len(req.text), total / SR, time.time() - t0) - return StreamingResponse(pcm(), media_type="application/octet-stream", headers={"X-Sample-Rate": str(SR)}) diff --git a/client/lucy-f5/f5_test.py b/client/lucy-f5/f5_test.py deleted file mode 100644 index d35db51..0000000 --- a/client/lucy-f5/f5_test.py +++ /dev/null @@ -1,44 +0,0 @@ -# -*- coding: utf-8 -*- -"""F5-TTS Qualitäts-/Tempo-Test (CPU): dt. Finetune + Lucy-Klon. Gleiche Sätze wie pocket -> A/B.""" -import os, time, soundfile as sf, numpy as np, torch -# torchcodec/ffmpeg fehlt -> torchaudio.load/save auf soundfile umbiegen (wie bei OuteTTS-Patch) -import torchaudio -def _ta_load(path, *a, **k): - data, sr = sf.read(str(path), dtype="float32", always_2d=True) - return torch.from_numpy(data.T.copy()), sr -def _ta_save(path, tensor, sr, *a, **k): - arr = np.asarray(tensor.detach().cpu().numpy()) - sf.write(str(path), arr.T if arr.ndim == 2 else arr, sr) -torchaudio.load = _ta_load -torchaudio.save = _ta_save -from f5_tts.api import F5TTS - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-f5" -OUT = r"C:\Users\TobisPC\Desktop\lucy_f5_test"; os.makedirs(OUT, exist_ok=True) -ref = os.path.join(BASE, "lucy_ref.wav") -ref_text = open(os.path.join(BASE, "lucy_ref.txt"), encoding="utf-8").read().strip() -print("REF_TEXT:", ref_text[:80], flush=True) - -t0 = time.time() -f5 = F5TTS(model="F5TTS_Base", - ckpt_file=os.path.join(BASE, "model_f5tts_german.safetensors"), - vocab_file=os.path.join(BASE, "vocab.txt"), device="cpu") -print(f"Modell geladen in {time.time()-t0:.1f}s (Vocoder evtl. erst geladen)", flush=True) - -SENT = { - "kurz": "Hallo Commander, ich höre dich.", - "mittel":"Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", - "lang": "Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft.", -} -for name, text in SENT.items(): - t0 = time.time() - wav, sr, _ = f5.infer(ref_file=ref, ref_text=ref_text, gen_text=text, - nfe_step=32, target_rms=0.1, remove_silence=True) - dt = time.time() - t0 - wav = np.asarray(wav, dtype=np.float32).reshape(-1) - peak = float(np.max(np.abs(wav))) # Peak-Limiter gegen Clipping (F5 traf 1.0) - if peak > 0.95: wav = wav * (0.95 / peak) - sf.write(os.path.join(OUT, f"{name}.wav"), wav, sr) - secs = len(wav) / sr - print(f"[{name:6}] gen={dt:6.1f}s audio={secs:5.1f}s RTF={dt/max(secs,0.01):5.2f}", flush=True) -print("F5_TEST_DONE", flush=True) diff --git a/client/lucy-f5/lucy_ref.txt b/client/lucy-f5/lucy_ref.txt deleted file mode 100644 index d8a4918..0000000 --- a/client/lucy-f5/lucy_ref.txt +++ /dev/null @@ -1 +0,0 @@ -Hallo, schön, dass du da bist. Ich bin deine persönliche Assistentin und begleite dich durch deinen Tag. \ No newline at end of file diff --git a/client/lucy-f5/vocab.txt b/client/lucy-f5/vocab.txt deleted file mode 100644 index a30a90c..0000000 --- a/client/lucy-f5/vocab.txt +++ /dev/null @@ -1,2545 +0,0 @@ - -! -" -# -$ -% -& -' -( -) -* -+ -, -- -. -/ -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -: -; -= -> -? -@ -A -B -C -D -E -F -G -H -I -J -K -L -M -N -O -P -Q -R -S -T -U -V -W -X -Y -Z -[ -\ -] -_ -a -a1 -ai1 -ai2 -ai3 -ai4 -an1 -an3 -an4 -ang1 -ang2 -ang4 -ao1 -ao2 -ao3 -ao4 -b -ba -ba1 -ba2 -ba3 -ba4 -bai1 -bai2 -bai3 -bai4 -ban1 -ban2 -ban3 -ban4 -bang1 -bang2 -bang3 -bang4 -bao1 -bao2 -bao3 -bao4 -bei -bei1 -bei2 -bei3 -bei4 -ben1 -ben2 -ben3 -ben4 -beng -beng1 -beng2 -beng3 -beng4 -bi1 -bi2 -bi3 -bi4 -bian1 -bian2 -bian3 -bian4 -biao1 -biao2 -biao3 -bie1 -bie2 -bie3 -bie4 -bin1 -bin4 -bing1 -bing2 -bing3 -bing4 -bo -bo1 -bo2 -bo3 -bo4 -bu2 -bu3 -bu4 -c -ca1 -cai1 -cai2 -cai3 -cai4 -can1 -can2 -can3 -can4 -cang1 -cang2 -cao1 -cao2 -cao3 -ce4 -cen1 -cen2 -ceng1 -ceng2 -ceng4 -cha1 -cha2 -cha3 -cha4 -chai1 -chai2 -chan1 -chan2 -chan3 -chan4 -chang1 -chang2 -chang3 -chang4 -chao1 -chao2 -chao3 -che1 -che2 -che3 -che4 -chen1 -chen2 -chen3 -chen4 -cheng1 -cheng2 -cheng3 -cheng4 -chi1 -chi2 -chi3 -chi4 -chong1 -chong2 -chong3 -chong4 -chou1 -chou2 -chou3 -chou4 -chu1 -chu2 -chu3 -chu4 -chua1 -chuai1 -chuai2 -chuai3 -chuai4 -chuan1 -chuan2 -chuan3 -chuan4 -chuang1 -chuang2 -chuang3 -chuang4 -chui1 -chui2 -chun1 -chun2 -chun3 -chuo1 -chuo4 -ci1 -ci2 -ci3 -ci4 -cong1 -cong2 -cou4 -cu1 -cu4 -cuan1 -cuan2 -cuan4 -cui1 -cui3 -cui4 -cun1 -cun2 -cun4 -cuo1 -cuo2 -cuo4 -d -da -da1 -da2 -da3 -da4 -dai1 -dai2 -dai3 -dai4 -dan1 -dan2 -dan3 -dan4 -dang1 -dang2 -dang3 -dang4 -dao1 -dao2 -dao3 -dao4 -de -de1 -de2 -dei3 -den4 -deng1 -deng2 -deng3 -deng4 -di1 -di2 -di3 -di4 -dia3 -dian1 -dian2 -dian3 -dian4 -diao1 -diao3 -diao4 -die1 -die2 -die4 -ding1 -ding2 -ding3 -ding4 -diu1 -dong1 -dong3 -dong4 -dou1 -dou2 -dou3 -dou4 -du1 -du2 -du3 -du4 -duan1 -duan2 -duan3 -duan4 -dui1 -dui4 -dun1 -dun3 -dun4 -duo1 -duo2 -duo3 -duo4 -e -e1 -e2 -e3 -e4 -ei2 -en1 -en4 -er -er2 -er3 -er4 -f -fa1 -fa2 -fa3 -fa4 -fan1 -fan2 -fan3 -fan4 -fang1 -fang2 -fang3 -fang4 -fei1 -fei2 -fei3 -fei4 -fen1 -fen2 -fen3 -fen4 -feng1 -feng2 -feng3 -feng4 -fo2 -fou2 -fou3 -fu1 -fu2 -fu3 -fu4 -g -ga1 -ga2 -ga3 -ga4 -gai1 -gai2 -gai3 -gai4 -gan1 -gan2 -gan3 -gan4 -gang1 -gang2 -gang3 -gang4 -gao1 -gao2 -gao3 -gao4 -ge1 -ge2 -ge3 -ge4 -gei2 -gei3 -gen1 -gen2 -gen3 -gen4 -geng1 -geng3 -geng4 -gong1 -gong3 -gong4 -gou1 -gou2 -gou3 -gou4 -gu -gu1 -gu2 -gu3 -gu4 -gua1 -gua2 -gua3 -gua4 -guai1 -guai2 -guai3 -guai4 -guan1 -guan2 -guan3 -guan4 -guang1 -guang2 -guang3 -guang4 -gui1 -gui2 -gui3 -gui4 -gun3 -gun4 -guo1 -guo2 -guo3 -guo4 -h -ha1 -ha2 -ha3 -hai1 -hai2 -hai3 -hai4 -han1 -han2 -han3 -han4 -hang1 -hang2 -hang4 -hao1 -hao2 -hao3 -hao4 -he1 -he2 -he4 -hei1 -hen2 -hen3 -hen4 -heng1 -heng2 -heng4 -hong1 -hong2 -hong3 -hong4 -hou1 -hou2 -hou3 -hou4 -hu1 -hu2 -hu3 -hu4 -hua1 -hua2 -hua4 -huai2 -huai4 -huan1 -huan2 -huan3 -huan4 -huang1 -huang2 -huang3 -huang4 -hui1 -hui2 -hui3 -hui4 -hun1 -hun2 -hun4 -huo -huo1 -huo2 -huo3 -huo4 -i -j -ji1 -ji2 -ji3 -ji4 -jia -jia1 -jia2 -jia3 -jia4 -jian1 -jian2 -jian3 -jian4 -jiang1 -jiang2 -jiang3 -jiang4 -jiao1 -jiao2 -jiao3 -jiao4 -jie1 -jie2 -jie3 -jie4 -jin1 -jin2 -jin3 -jin4 -jing1 -jing2 -jing3 -jing4 -jiong3 -jiu1 -jiu2 -jiu3 -jiu4 -ju1 -ju2 -ju3 -ju4 -juan1 -juan2 -juan3 -juan4 -jue1 -jue2 -jue4 -jun1 -jun4 -k -ka1 -ka2 -ka3 -kai1 -kai2 -kai3 -kai4 -kan1 -kan2 -kan3 -kan4 -kang1 -kang2 -kang4 -kao1 -kao2 -kao3 -kao4 -ke1 -ke2 -ke3 -ke4 -ken3 -keng1 -kong1 -kong3 -kong4 -kou1 -kou2 -kou3 -kou4 -ku1 -ku2 -ku3 -ku4 -kua1 -kua3 -kua4 -kuai3 -kuai4 -kuan1 -kuan2 -kuan3 -kuang1 -kuang2 -kuang4 -kui1 -kui2 -kui3 -kui4 -kun1 -kun3 -kun4 -kuo4 -l -la -la1 -la2 -la3 -la4 -lai2 -lai4 -lan2 -lan3 -lan4 -lang1 -lang2 -lang3 -lang4 -lao1 -lao2 -lao3 -lao4 -le -le1 -le4 -lei -lei1 -lei2 -lei3 -lei4 -leng1 -leng2 -leng3 -leng4 -li -li1 -li2 -li3 -li4 -lia3 -lian2 -lian3 -lian4 -liang2 -liang3 -liang4 -liao1 -liao2 -liao3 -liao4 -lie1 -lie2 -lie3 -lie4 -lin1 -lin2 -lin3 -lin4 -ling2 -ling3 -ling4 -liu1 -liu2 -liu3 -liu4 -long1 -long2 -long3 -long4 -lou1 -lou2 -lou3 -lou4 -lu1 -lu2 -lu3 -lu4 -luan2 -luan3 -luan4 -lun1 -lun2 -lun4 -luo1 -luo2 -luo3 -luo4 -lv2 -lv3 -lv4 -lve3 -lve4 -m -ma -ma1 -ma2 -ma3 -ma4 -mai2 -mai3 -mai4 -man1 -man2 -man3 -man4 -mang2 -mang3 -mao1 -mao2 -mao3 -mao4 -me -mei2 -mei3 -mei4 -men -men1 -men2 -men4 -meng -meng1 -meng2 -meng3 -meng4 -mi1 -mi2 -mi3 -mi4 -mian2 -mian3 -mian4 -miao1 -miao2 -miao3 -miao4 -mie1 -mie4 -min2 -min3 -ming2 -ming3 -ming4 -miu4 -mo1 -mo2 -mo3 -mo4 -mou1 -mou2 -mou3 -mu2 -mu3 -mu4 -n -n2 -na1 -na2 -na3 -na4 -nai2 -nai3 -nai4 -nan1 -nan2 -nan3 -nan4 -nang1 -nang2 -nang3 -nao1 -nao2 -nao3 -nao4 -ne -ne2 -ne4 -nei3 -nei4 -nen4 -neng2 -ni1 -ni2 -ni3 -ni4 -nian1 -nian2 -nian3 -nian4 -niang2 -niang4 -niao2 -niao3 -niao4 -nie1 -nie4 -nin2 -ning2 -ning3 -ning4 -niu1 -niu2 -niu3 -niu4 -nong2 -nong4 -nou4 -nu2 -nu3 -nu4 -nuan3 -nuo2 -nuo4 -nv2 -nv3 -nve4 -o -o1 -o2 -ou1 -ou2 -ou3 -ou4 -p -pa1 -pa2 -pa4 -pai1 -pai2 -pai3 -pai4 -pan1 -pan2 -pan4 -pang1 -pang2 -pang4 -pao1 -pao2 -pao3 -pao4 -pei1 -pei2 -pei4 -pen1 -pen2 -pen4 -peng1 -peng2 -peng3 -peng4 -pi1 -pi2 -pi3 -pi4 -pian1 -pian2 -pian4 -piao1 -piao2 -piao3 -piao4 -pie1 -pie2 -pie3 -pin1 -pin2 -pin3 -pin4 -ping1 -ping2 -po1 -po2 -po3 -po4 -pou1 -pu1 -pu2 -pu3 -pu4 -q -qi1 -qi2 -qi3 -qi4 -qia1 -qia3 -qia4 -qian1 -qian2 -qian3 -qian4 -qiang1 -qiang2 -qiang3 -qiang4 -qiao1 -qiao2 -qiao3 -qiao4 -qie1 -qie2 -qie3 -qie4 -qin1 -qin2 -qin3 -qin4 -qing1 -qing2 -qing3 -qing4 -qiong1 -qiong2 -qiu1 -qiu2 -qiu3 -qu1 -qu2 -qu3 -qu4 -quan1 -quan2 -quan3 -quan4 -que1 -que2 -que4 -qun2 -r -ran2 -ran3 -rang1 -rang2 -rang3 -rang4 -rao2 -rao3 -rao4 -re2 -re3 -re4 -ren2 -ren3 -ren4 -reng1 -reng2 -ri4 -rong1 -rong2 -rong3 -rou2 -rou4 -ru2 -ru3 -ru4 -ruan2 -ruan3 -rui3 -rui4 -run4 -ruo4 -s -sa1 -sa2 -sa3 -sa4 -sai1 -sai4 -san1 -san2 -san3 -san4 -sang1 -sang3 -sang4 -sao1 -sao2 -sao3 -sao4 -se4 -sen1 -seng1 -sha1 -sha2 -sha3 -sha4 -shai1 -shai2 -shai3 -shai4 -shan1 -shan3 -shan4 -shang -shang1 -shang3 -shang4 -shao1 -shao2 -shao3 -shao4 -she1 -she2 -she3 -she4 -shei2 -shen1 -shen2 -shen3 -shen4 -sheng1 -sheng2 -sheng3 -sheng4 -shi -shi1 -shi2 -shi3 -shi4 -shou1 -shou2 -shou3 -shou4 -shu1 -shu2 -shu3 -shu4 -shua1 -shua2 -shua3 -shua4 -shuai1 -shuai3 -shuai4 -shuan1 -shuan4 -shuang1 -shuang3 -shui2 -shui3 -shui4 -shun3 -shun4 -shuo1 -shuo4 -si1 -si2 -si3 -si4 -song1 -song3 -song4 -sou1 -sou3 -sou4 -su1 -su2 -su4 -suan1 -suan4 -sui1 -sui2 -sui3 -sui4 -sun1 -sun3 -suo -suo1 -suo2 -suo3 -t -ta1 -ta2 -ta3 -ta4 -tai1 -tai2 -tai4 -tan1 -tan2 -tan3 -tan4 -tang1 -tang2 -tang3 -tang4 -tao1 -tao2 -tao3 -tao4 -te4 -teng2 -ti1 -ti2 -ti3 -ti4 -tian1 -tian2 -tian3 -tiao1 -tiao2 -tiao3 -tiao4 -tie1 -tie2 -tie3 -tie4 -ting1 -ting2 -ting3 -tong1 -tong2 -tong3 -tong4 -tou -tou1 -tou2 -tou4 -tu1 -tu2 -tu3 -tu4 -tuan1 -tuan2 -tui1 -tui2 -tui3 -tui4 -tun1 -tun2 -tun4 -tuo1 -tuo2 -tuo3 -tuo4 -u -v -w -wa -wa1 -wa2 -wa3 -wa4 -wai1 -wai3 -wai4 -wan1 -wan2 -wan3 -wan4 -wang1 -wang2 -wang3 -wang4 -wei1 -wei2 -wei3 -wei4 -wen1 -wen2 -wen3 -wen4 -weng1 -weng4 -wo1 -wo2 -wo3 -wo4 -wu1 -wu2 -wu3 -wu4 -x -xi1 -xi2 -xi3 -xi4 -xia1 -xia2 -xia4 -xian1 -xian2 -xian3 -xian4 -xiang1 -xiang2 -xiang3 -xiang4 -xiao1 -xiao2 -xiao3 -xiao4 -xie1 -xie2 -xie3 -xie4 -xin1 -xin2 -xin4 -xing1 -xing2 -xing3 -xing4 -xiong1 -xiong2 -xiu1 -xiu3 -xiu4 -xu -xu1 -xu2 -xu3 -xu4 -xuan1 -xuan2 -xuan3 -xuan4 -xue1 -xue2 -xue3 -xue4 -xun1 -xun2 -xun4 -y -ya -ya1 -ya2 -ya3 -ya4 -yan1 -yan2 -yan3 -yan4 -yang1 -yang2 -yang3 -yang4 -yao1 -yao2 -yao3 -yao4 -ye1 -ye2 -ye3 -ye4 -yi -yi1 -yi2 -yi3 -yi4 -yin1 -yin2 -yin3 -yin4 -ying1 -ying2 -ying3 -ying4 -yo1 -yong1 -yong2 -yong3 -yong4 -you1 -you2 -you3 -you4 -yu1 -yu2 -yu3 -yu4 -yuan1 -yuan2 -yuan3 -yuan4 -yue1 -yue4 -yun1 -yun2 -yun3 -yun4 -z -za1 -za2 -za3 -zai1 -zai3 -zai4 -zan1 -zan2 -zan3 -zan4 -zang1 -zang4 -zao1 -zao2 -zao3 -zao4 -ze2 -ze4 -zei2 -zen3 -zeng1 -zeng4 -zha1 -zha2 -zha3 -zha4 -zhai1 -zhai2 -zhai3 -zhai4 -zhan1 -zhan2 -zhan3 -zhan4 -zhang1 -zhang2 -zhang3 -zhang4 -zhao1 -zhao2 -zhao3 -zhao4 -zhe -zhe1 -zhe2 -zhe3 -zhe4 -zhen1 -zhen2 -zhen3 -zhen4 -zheng1 -zheng2 -zheng3 -zheng4 -zhi1 -zhi2 -zhi3 -zhi4 -zhong1 -zhong2 -zhong3 -zhong4 -zhou1 -zhou2 -zhou3 -zhou4 -zhu1 -zhu2 -zhu3 -zhu4 -zhua1 -zhua2 -zhua3 -zhuai1 -zhuai3 -zhuai4 -zhuan1 -zhuan2 -zhuan3 -zhuan4 -zhuang1 -zhuang4 -zhui1 -zhui4 -zhun1 -zhun2 -zhun3 -zhuo1 -zhuo2 -zi -zi1 -zi2 -zi3 -zi4 -zong1 -zong2 -zong3 -zong4 -zou1 -zou2 -zou3 -zou4 -zu1 -zu2 -zu3 -zuan1 -zuan3 -zuan4 -zui2 -zui3 -zui4 -zun1 -zuo -zuo1 -zuo2 -zuo3 -zuo4 -{ -~ -¡ -¢ -£ -¥ -§ -¨ -© -« -® -¯ -° -± -² -³ -´ -µ -· -¹ -º -» -¼ -½ -¾ -¿ -À -Á - -à -Ä -Å -Æ -Ç -È -É -Ê -Í -Î -Ñ -Ó -Ö -× -Ø -Ú -Ü -Ý -Þ -ß -à -á -â -ã -ä -å -æ -ç -è -é -ê -ë -ì -í -î -ï -ð -ñ -ò -ó -ô -õ -ö -ø -ù -ú -û -ü -ý -Ā -ā -ă -ą -ć -Č -č -Đ -đ -ē -ė -ę -ě -ĝ -ğ -ħ -ī -į -İ -ı -Ł -ł -ń -ņ -ň -ŋ -Ō -ō -ő -œ -ř -Ś -ś -Ş -ş -Š -š -Ť -ť -ũ -ū -ź -Ż -ż -Ž -ž -ơ -ư -ǎ -ǐ -ǒ -ǔ -ǚ -ș -ț -ɑ -ɔ -ɕ -ə -ɛ -ɜ -ɡ -ɣ -ɪ -ɫ -ɴ -ɹ -ɾ -ʃ -ʊ -ʌ -ʒ -ʔ -ʰ -ʷ -ʻ -ʾ -ʿ -ˈ -ː -˙ -˜ -ˢ -́ -̅ -Α -Β -Δ -Ε -Θ -Κ -Λ -Μ -Ξ -Π -Σ -Τ -Φ -Χ -Ψ -Ω -ά -έ -ή -ί -α -β -γ -δ -ε -ζ -η -θ -ι -κ -λ -μ -ν -ξ -ο -π -ρ -ς -σ -τ -υ -φ -χ -ψ -ω -ϊ -ό -ύ -ώ -ϕ -ϵ -Ё -А -Б -В -Г -Д -Е -Ж -З -И -Й -К -Л -М -Н -О -П -Р -С -Т -У -Ф -Х -Ц -Ч -Ш -Щ -Ы -Ь -Э -Ю -Я -а -б -в -г -д -е -ж -з -и -й -к -л -м -н -о -п -р -с -т -у -ф -х -ц -ч -ш -щ -ъ -ы -ь -э -ю -я -ё -і -ְ -ִ -ֵ -ֶ -ַ -ָ -ֹ -ּ -־ -ׁ -א -ב -ג -ד -ה -ו -ז -ח -ט -י -כ -ל -ם -מ -ן -נ -ס -ע -פ -ק -ר -ש -ת -أ -ب -ة -ت -ج -ح -د -ر -ز -س -ص -ط -ع -ق -ك -ل -م -ن -ه -و -ي -َ -ُ -ِ -ْ -ก -ข -ง -จ -ต -ท -น -ป -ย -ร -ว -ส -ห -อ -ฮ -ั -า -ี -ึ -โ -ใ -ไ -่ -้ -์ -ḍ -Ḥ -ḥ -ṁ -ṃ -ṅ -ṇ -Ṛ -ṛ -Ṣ -ṣ -Ṭ -ṭ -ạ -ả -Ấ -ấ -ầ -ậ -ắ -ằ -ẻ -ẽ -ế -ề -ể -ễ -ệ -ị -ọ -ỏ -ố -ồ -ộ -ớ -ờ -ở -ụ -ủ -ứ -ữ -ἀ -ἁ -Ἀ -ἐ -ἔ -ἰ -ἱ -ὀ -ὁ -ὐ -ὲ -ὸ -ᾶ -᾽ -ῆ -ῇ -ῶ -‎ -‑ -‒ -– -— -― -‖ -† -‡ -• -… -‧ -‬ -′ -″ -⁄ -⁡ -⁰ -⁴ -⁵ -⁶ -⁷ -⁸ -⁹ -₁ -₂ -₃ -€ -₱ -₹ -₽ -℃ -ℏ -ℓ -№ -ℝ -™ -⅓ -⅔ -⅛ -→ -∂ -∈ -∑ -− -∗ -√ -∞ -∫ -≈ -≠ -≡ -≤ -≥ -⋅ -⋯ -█ -♪ -⟨ -⟩ -、 -。 -《 -》 -「 -」 -【 -】 -あ -う -え -お -か -が -き -ぎ -く -ぐ -け -げ -こ -ご -さ -し -じ -す -ず -せ -ぜ -そ -ぞ -た -だ -ち -っ -つ -で -と -ど -な -に -ね -の -は -ば -ひ -ぶ -へ -べ -ま -み -む -め -も -ゃ -や -ゆ -ょ -よ -ら -り -る -れ -ろ -わ -を -ん -ァ -ア -ィ -イ -ウ -ェ -エ -オ -カ -ガ -キ -ク -ケ -ゲ -コ -ゴ -サ -ザ -シ -ジ -ス -ズ -セ -ゾ -タ -ダ -チ -ッ -ツ -テ -デ -ト -ド -ナ -ニ -ネ -ノ -バ -パ -ビ -ピ -フ -プ -ヘ -ベ -ペ -ホ -ボ -ポ -マ -ミ -ム -メ -モ -ャ -ヤ -ュ -ユ -ョ -ヨ -ラ -リ -ル -レ -ロ -ワ -ン -・ -ー -ㄋ -ㄍ -ㄎ -ㄏ -ㄓ -ㄕ -ㄚ -ㄜ -ㄟ -ㄤ -ㄥ -ㄧ -ㄱ -ㄴ -ㄷ -ㄹ -ㅁ -ㅂ -ㅅ -ㅈ -ㅍ -ㅎ -ㅏ -ㅓ -ㅗ -ㅜ -ㅡ -ㅣ -㗎 -가 -각 -간 -갈 -감 -갑 -갓 -갔 -강 -같 -개 -거 -건 -걸 -겁 -것 -겉 -게 -겠 -겨 -결 -겼 -경 -계 -고 -곤 -골 -곱 -공 -과 -관 -광 -교 -구 -국 -굴 -귀 -귄 -그 -근 -글 -금 -기 -긴 -길 -까 -깍 -깔 -깜 -깨 -께 -꼬 -꼭 -꽃 -꾸 -꿔 -끔 -끗 -끝 -끼 -나 -난 -날 -남 -납 -내 -냐 -냥 -너 -넘 -넣 -네 -녁 -년 -녕 -노 -녹 -놀 -누 -눈 -느 -는 -늘 -니 -님 -닙 -다 -닥 -단 -달 -닭 -당 -대 -더 -덕 -던 -덥 -데 -도 -독 -동 -돼 -됐 -되 -된 -될 -두 -둑 -둥 -드 -들 -등 -디 -따 -딱 -딸 -땅 -때 -떤 -떨 -떻 -또 -똑 -뚱 -뛰 -뜻 -띠 -라 -락 -란 -람 -랍 -랑 -래 -랜 -러 -런 -럼 -렇 -레 -려 -력 -렵 -렸 -로 -록 -롬 -루 -르 -른 -를 -름 -릉 -리 -릴 -림 -마 -막 -만 -많 -말 -맑 -맙 -맛 -매 -머 -먹 -멍 -메 -면 -명 -몇 -모 -목 -몸 -못 -무 -문 -물 -뭐 -뭘 -미 -민 -밌 -밑 -바 -박 -밖 -반 -받 -발 -밤 -밥 -방 -배 -백 -밸 -뱀 -버 -번 -벌 -벚 -베 -벼 -벽 -별 -병 -보 -복 -본 -볼 -봐 -봤 -부 -분 -불 -비 -빔 -빛 -빠 -빨 -뼈 -뽀 -뿅 -쁘 -사 -산 -살 -삼 -샀 -상 -새 -색 -생 -서 -선 -설 -섭 -섰 -성 -세 -셔 -션 -셨 -소 -속 -손 -송 -수 -숙 -순 -술 -숫 -숭 -숲 -쉬 -쉽 -스 -슨 -습 -슷 -시 -식 -신 -실 -싫 -심 -십 -싶 -싸 -써 -쓰 -쓴 -씌 -씨 -씩 -씬 -아 -악 -안 -않 -알 -야 -약 -얀 -양 -얘 -어 -언 -얼 -엄 -업 -없 -었 -엉 -에 -여 -역 -연 -염 -엽 -영 -옆 -예 -옛 -오 -온 -올 -옷 -옹 -와 -왔 -왜 -요 -욕 -용 -우 -운 -울 -웃 -워 -원 -월 -웠 -위 -윙 -유 -육 -윤 -으 -은 -을 -음 -응 -의 -이 -익 -인 -일 -읽 -임 -입 -있 -자 -작 -잔 -잖 -잘 -잡 -잤 -장 -재 -저 -전 -점 -정 -제 -져 -졌 -조 -족 -좀 -종 -좋 -죠 -주 -준 -줄 -중 -줘 -즈 -즐 -즘 -지 -진 -집 -짜 -짝 -쩌 -쪼 -쪽 -쫌 -쭈 -쯔 -찌 -찍 -차 -착 -찾 -책 -처 -천 -철 -체 -쳐 -쳤 -초 -촌 -추 -출 -춤 -춥 -춰 -치 -친 -칠 -침 -칩 -칼 -커 -켓 -코 -콩 -쿠 -퀴 -크 -큰 -큽 -키 -킨 -타 -태 -터 -턴 -털 -테 -토 -통 -투 -트 -특 -튼 -틀 -티 -팀 -파 -팔 -패 -페 -펜 -펭 -평 -포 -폭 -표 -품 -풍 -프 -플 -피 -필 -하 -학 -한 -할 -함 -합 -항 -해 -햇 -했 -행 -허 -험 -형 -혜 -호 -혼 -홀 -화 -회 -획 -후 -휴 -흐 -흔 -희 -히 -힘 -ﷺ -ﷻ -! -, -? -� -𠮶 diff --git a/client/lucy-f5/vocab_v1.txt b/client/lucy-f5/vocab_v1.txt deleted file mode 100644 index a30a90c..0000000 --- a/client/lucy-f5/vocab_v1.txt +++ /dev/null @@ -1,2545 +0,0 @@ - -! -" -# -$ -% -& -' -( -) -* -+ -, -- -. -/ -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -: -; -= -> -? -@ -A -B -C -D -E -F -G -H -I -J -K -L -M -N -O -P -Q -R -S -T -U -V -W -X -Y -Z -[ -\ -] -_ -a -a1 -ai1 -ai2 -ai3 -ai4 -an1 -an3 -an4 -ang1 -ang2 -ang4 -ao1 -ao2 -ao3 -ao4 -b -ba -ba1 -ba2 -ba3 -ba4 -bai1 -bai2 -bai3 -bai4 -ban1 -ban2 -ban3 -ban4 -bang1 -bang2 -bang3 -bang4 -bao1 -bao2 -bao3 -bao4 -bei -bei1 -bei2 -bei3 -bei4 -ben1 -ben2 -ben3 -ben4 -beng -beng1 -beng2 -beng3 -beng4 -bi1 -bi2 -bi3 -bi4 -bian1 -bian2 -bian3 -bian4 -biao1 -biao2 -biao3 -bie1 -bie2 -bie3 -bie4 -bin1 -bin4 -bing1 -bing2 -bing3 -bing4 -bo -bo1 -bo2 -bo3 -bo4 -bu2 -bu3 -bu4 -c -ca1 -cai1 -cai2 -cai3 -cai4 -can1 -can2 -can3 -can4 -cang1 -cang2 -cao1 -cao2 -cao3 -ce4 -cen1 -cen2 -ceng1 -ceng2 -ceng4 -cha1 -cha2 -cha3 -cha4 -chai1 -chai2 -chan1 -chan2 -chan3 -chan4 -chang1 -chang2 -chang3 -chang4 -chao1 -chao2 -chao3 -che1 -che2 -che3 -che4 -chen1 -chen2 -chen3 -chen4 -cheng1 -cheng2 -cheng3 -cheng4 -chi1 -chi2 -chi3 -chi4 -chong1 -chong2 -chong3 -chong4 -chou1 -chou2 -chou3 -chou4 -chu1 -chu2 -chu3 -chu4 -chua1 -chuai1 -chuai2 -chuai3 -chuai4 -chuan1 -chuan2 -chuan3 -chuan4 -chuang1 -chuang2 -chuang3 -chuang4 -chui1 -chui2 -chun1 -chun2 -chun3 -chuo1 -chuo4 -ci1 -ci2 -ci3 -ci4 -cong1 -cong2 -cou4 -cu1 -cu4 -cuan1 -cuan2 -cuan4 -cui1 -cui3 -cui4 -cun1 -cun2 -cun4 -cuo1 -cuo2 -cuo4 -d -da -da1 -da2 -da3 -da4 -dai1 -dai2 -dai3 -dai4 -dan1 -dan2 -dan3 -dan4 -dang1 -dang2 -dang3 -dang4 -dao1 -dao2 -dao3 -dao4 -de -de1 -de2 -dei3 -den4 -deng1 -deng2 -deng3 -deng4 -di1 -di2 -di3 -di4 -dia3 -dian1 -dian2 -dian3 -dian4 -diao1 -diao3 -diao4 -die1 -die2 -die4 -ding1 -ding2 -ding3 -ding4 -diu1 -dong1 -dong3 -dong4 -dou1 -dou2 -dou3 -dou4 -du1 -du2 -du3 -du4 -duan1 -duan2 -duan3 -duan4 -dui1 -dui4 -dun1 -dun3 -dun4 -duo1 -duo2 -duo3 -duo4 -e -e1 -e2 -e3 -e4 -ei2 -en1 -en4 -er -er2 -er3 -er4 -f -fa1 -fa2 -fa3 -fa4 -fan1 -fan2 -fan3 -fan4 -fang1 -fang2 -fang3 -fang4 -fei1 -fei2 -fei3 -fei4 -fen1 -fen2 -fen3 -fen4 -feng1 -feng2 -feng3 -feng4 -fo2 -fou2 -fou3 -fu1 -fu2 -fu3 -fu4 -g -ga1 -ga2 -ga3 -ga4 -gai1 -gai2 -gai3 -gai4 -gan1 -gan2 -gan3 -gan4 -gang1 -gang2 -gang3 -gang4 -gao1 -gao2 -gao3 -gao4 -ge1 -ge2 -ge3 -ge4 -gei2 -gei3 -gen1 -gen2 -gen3 -gen4 -geng1 -geng3 -geng4 -gong1 -gong3 -gong4 -gou1 -gou2 -gou3 -gou4 -gu -gu1 -gu2 -gu3 -gu4 -gua1 -gua2 -gua3 -gua4 -guai1 -guai2 -guai3 -guai4 -guan1 -guan2 -guan3 -guan4 -guang1 -guang2 -guang3 -guang4 -gui1 -gui2 -gui3 -gui4 -gun3 -gun4 -guo1 -guo2 -guo3 -guo4 -h -ha1 -ha2 -ha3 -hai1 -hai2 -hai3 -hai4 -han1 -han2 -han3 -han4 -hang1 -hang2 -hang4 -hao1 -hao2 -hao3 -hao4 -he1 -he2 -he4 -hei1 -hen2 -hen3 -hen4 -heng1 -heng2 -heng4 -hong1 -hong2 -hong3 -hong4 -hou1 -hou2 -hou3 -hou4 -hu1 -hu2 -hu3 -hu4 -hua1 -hua2 -hua4 -huai2 -huai4 -huan1 -huan2 -huan3 -huan4 -huang1 -huang2 -huang3 -huang4 -hui1 -hui2 -hui3 -hui4 -hun1 -hun2 -hun4 -huo -huo1 -huo2 -huo3 -huo4 -i -j -ji1 -ji2 -ji3 -ji4 -jia -jia1 -jia2 -jia3 -jia4 -jian1 -jian2 -jian3 -jian4 -jiang1 -jiang2 -jiang3 -jiang4 -jiao1 -jiao2 -jiao3 -jiao4 -jie1 -jie2 -jie3 -jie4 -jin1 -jin2 -jin3 -jin4 -jing1 -jing2 -jing3 -jing4 -jiong3 -jiu1 -jiu2 -jiu3 -jiu4 -ju1 -ju2 -ju3 -ju4 -juan1 -juan2 -juan3 -juan4 -jue1 -jue2 -jue4 -jun1 -jun4 -k -ka1 -ka2 -ka3 -kai1 -kai2 -kai3 -kai4 -kan1 -kan2 -kan3 -kan4 -kang1 -kang2 -kang4 -kao1 -kao2 -kao3 -kao4 -ke1 -ke2 -ke3 -ke4 -ken3 -keng1 -kong1 -kong3 -kong4 -kou1 -kou2 -kou3 -kou4 -ku1 -ku2 -ku3 -ku4 -kua1 -kua3 -kua4 -kuai3 -kuai4 -kuan1 -kuan2 -kuan3 -kuang1 -kuang2 -kuang4 -kui1 -kui2 -kui3 -kui4 -kun1 -kun3 -kun4 -kuo4 -l -la -la1 -la2 -la3 -la4 -lai2 -lai4 -lan2 -lan3 -lan4 -lang1 -lang2 -lang3 -lang4 -lao1 -lao2 -lao3 -lao4 -le -le1 -le4 -lei -lei1 -lei2 -lei3 -lei4 -leng1 -leng2 -leng3 -leng4 -li -li1 -li2 -li3 -li4 -lia3 -lian2 -lian3 -lian4 -liang2 -liang3 -liang4 -liao1 -liao2 -liao3 -liao4 -lie1 -lie2 -lie3 -lie4 -lin1 -lin2 -lin3 -lin4 -ling2 -ling3 -ling4 -liu1 -liu2 -liu3 -liu4 -long1 -long2 -long3 -long4 -lou1 -lou2 -lou3 -lou4 -lu1 -lu2 -lu3 -lu4 -luan2 -luan3 -luan4 -lun1 -lun2 -lun4 -luo1 -luo2 -luo3 -luo4 -lv2 -lv3 -lv4 -lve3 -lve4 -m -ma -ma1 -ma2 -ma3 -ma4 -mai2 -mai3 -mai4 -man1 -man2 -man3 -man4 -mang2 -mang3 -mao1 -mao2 -mao3 -mao4 -me -mei2 -mei3 -mei4 -men -men1 -men2 -men4 -meng -meng1 -meng2 -meng3 -meng4 -mi1 -mi2 -mi3 -mi4 -mian2 -mian3 -mian4 -miao1 -miao2 -miao3 -miao4 -mie1 -mie4 -min2 -min3 -ming2 -ming3 -ming4 -miu4 -mo1 -mo2 -mo3 -mo4 -mou1 -mou2 -mou3 -mu2 -mu3 -mu4 -n -n2 -na1 -na2 -na3 -na4 -nai2 -nai3 -nai4 -nan1 -nan2 -nan3 -nan4 -nang1 -nang2 -nang3 -nao1 -nao2 -nao3 -nao4 -ne -ne2 -ne4 -nei3 -nei4 -nen4 -neng2 -ni1 -ni2 -ni3 -ni4 -nian1 -nian2 -nian3 -nian4 -niang2 -niang4 -niao2 -niao3 -niao4 -nie1 -nie4 -nin2 -ning2 -ning3 -ning4 -niu1 -niu2 -niu3 -niu4 -nong2 -nong4 -nou4 -nu2 -nu3 -nu4 -nuan3 -nuo2 -nuo4 -nv2 -nv3 -nve4 -o -o1 -o2 -ou1 -ou2 -ou3 -ou4 -p -pa1 -pa2 -pa4 -pai1 -pai2 -pai3 -pai4 -pan1 -pan2 -pan4 -pang1 -pang2 -pang4 -pao1 -pao2 -pao3 -pao4 -pei1 -pei2 -pei4 -pen1 -pen2 -pen4 -peng1 -peng2 -peng3 -peng4 -pi1 -pi2 -pi3 -pi4 -pian1 -pian2 -pian4 -piao1 -piao2 -piao3 -piao4 -pie1 -pie2 -pie3 -pin1 -pin2 -pin3 -pin4 -ping1 -ping2 -po1 -po2 -po3 -po4 -pou1 -pu1 -pu2 -pu3 -pu4 -q -qi1 -qi2 -qi3 -qi4 -qia1 -qia3 -qia4 -qian1 -qian2 -qian3 -qian4 -qiang1 -qiang2 -qiang3 -qiang4 -qiao1 -qiao2 -qiao3 -qiao4 -qie1 -qie2 -qie3 -qie4 -qin1 -qin2 -qin3 -qin4 -qing1 -qing2 -qing3 -qing4 -qiong1 -qiong2 -qiu1 -qiu2 -qiu3 -qu1 -qu2 -qu3 -qu4 -quan1 -quan2 -quan3 -quan4 -que1 -que2 -que4 -qun2 -r -ran2 -ran3 -rang1 -rang2 -rang3 -rang4 -rao2 -rao3 -rao4 -re2 -re3 -re4 -ren2 -ren3 -ren4 -reng1 -reng2 -ri4 -rong1 -rong2 -rong3 -rou2 -rou4 -ru2 -ru3 -ru4 -ruan2 -ruan3 -rui3 -rui4 -run4 -ruo4 -s -sa1 -sa2 -sa3 -sa4 -sai1 -sai4 -san1 -san2 -san3 -san4 -sang1 -sang3 -sang4 -sao1 -sao2 -sao3 -sao4 -se4 -sen1 -seng1 -sha1 -sha2 -sha3 -sha4 -shai1 -shai2 -shai3 -shai4 -shan1 -shan3 -shan4 -shang -shang1 -shang3 -shang4 -shao1 -shao2 -shao3 -shao4 -she1 -she2 -she3 -she4 -shei2 -shen1 -shen2 -shen3 -shen4 -sheng1 -sheng2 -sheng3 -sheng4 -shi -shi1 -shi2 -shi3 -shi4 -shou1 -shou2 -shou3 -shou4 -shu1 -shu2 -shu3 -shu4 -shua1 -shua2 -shua3 -shua4 -shuai1 -shuai3 -shuai4 -shuan1 -shuan4 -shuang1 -shuang3 -shui2 -shui3 -shui4 -shun3 -shun4 -shuo1 -shuo4 -si1 -si2 -si3 -si4 -song1 -song3 -song4 -sou1 -sou3 -sou4 -su1 -su2 -su4 -suan1 -suan4 -sui1 -sui2 -sui3 -sui4 -sun1 -sun3 -suo -suo1 -suo2 -suo3 -t -ta1 -ta2 -ta3 -ta4 -tai1 -tai2 -tai4 -tan1 -tan2 -tan3 -tan4 -tang1 -tang2 -tang3 -tang4 -tao1 -tao2 -tao3 -tao4 -te4 -teng2 -ti1 -ti2 -ti3 -ti4 -tian1 -tian2 -tian3 -tiao1 -tiao2 -tiao3 -tiao4 -tie1 -tie2 -tie3 -tie4 -ting1 -ting2 -ting3 -tong1 -tong2 -tong3 -tong4 -tou -tou1 -tou2 -tou4 -tu1 -tu2 -tu3 -tu4 -tuan1 -tuan2 -tui1 -tui2 -tui3 -tui4 -tun1 -tun2 -tun4 -tuo1 -tuo2 -tuo3 -tuo4 -u -v -w -wa -wa1 -wa2 -wa3 -wa4 -wai1 -wai3 -wai4 -wan1 -wan2 -wan3 -wan4 -wang1 -wang2 -wang3 -wang4 -wei1 -wei2 -wei3 -wei4 -wen1 -wen2 -wen3 -wen4 -weng1 -weng4 -wo1 -wo2 -wo3 -wo4 -wu1 -wu2 -wu3 -wu4 -x -xi1 -xi2 -xi3 -xi4 -xia1 -xia2 -xia4 -xian1 -xian2 -xian3 -xian4 -xiang1 -xiang2 -xiang3 -xiang4 -xiao1 -xiao2 -xiao3 -xiao4 -xie1 -xie2 -xie3 -xie4 -xin1 -xin2 -xin4 -xing1 -xing2 -xing3 -xing4 -xiong1 -xiong2 -xiu1 -xiu3 -xiu4 -xu -xu1 -xu2 -xu3 -xu4 -xuan1 -xuan2 -xuan3 -xuan4 -xue1 -xue2 -xue3 -xue4 -xun1 -xun2 -xun4 -y -ya -ya1 -ya2 -ya3 -ya4 -yan1 -yan2 -yan3 -yan4 -yang1 -yang2 -yang3 -yang4 -yao1 -yao2 -yao3 -yao4 -ye1 -ye2 -ye3 -ye4 -yi -yi1 -yi2 -yi3 -yi4 -yin1 -yin2 -yin3 -yin4 -ying1 -ying2 -ying3 -ying4 -yo1 -yong1 -yong2 -yong3 -yong4 -you1 -you2 -you3 -you4 -yu1 -yu2 -yu3 -yu4 -yuan1 -yuan2 -yuan3 -yuan4 -yue1 -yue4 -yun1 -yun2 -yun3 -yun4 -z -za1 -za2 -za3 -zai1 -zai3 -zai4 -zan1 -zan2 -zan3 -zan4 -zang1 -zang4 -zao1 -zao2 -zao3 -zao4 -ze2 -ze4 -zei2 -zen3 -zeng1 -zeng4 -zha1 -zha2 -zha3 -zha4 -zhai1 -zhai2 -zhai3 -zhai4 -zhan1 -zhan2 -zhan3 -zhan4 -zhang1 -zhang2 -zhang3 -zhang4 -zhao1 -zhao2 -zhao3 -zhao4 -zhe -zhe1 -zhe2 -zhe3 -zhe4 -zhen1 -zhen2 -zhen3 -zhen4 -zheng1 -zheng2 -zheng3 -zheng4 -zhi1 -zhi2 -zhi3 -zhi4 -zhong1 -zhong2 -zhong3 -zhong4 -zhou1 -zhou2 -zhou3 -zhou4 -zhu1 -zhu2 -zhu3 -zhu4 -zhua1 -zhua2 -zhua3 -zhuai1 -zhuai3 -zhuai4 -zhuan1 -zhuan2 -zhuan3 -zhuan4 -zhuang1 -zhuang4 -zhui1 -zhui4 -zhun1 -zhun2 -zhun3 -zhuo1 -zhuo2 -zi -zi1 -zi2 -zi3 -zi4 -zong1 -zong2 -zong3 -zong4 -zou1 -zou2 -zou3 -zou4 -zu1 -zu2 -zu3 -zuan1 -zuan3 -zuan4 -zui2 -zui3 -zui4 -zun1 -zuo -zuo1 -zuo2 -zuo3 -zuo4 -{ -~ -¡ -¢ -£ -¥ -§ -¨ -© -« -® -¯ -° -± -² -³ -´ -µ -· -¹ -º -» -¼ -½ -¾ -¿ -À -Á - -à -Ä -Å -Æ -Ç -È -É -Ê -Í -Î -Ñ -Ó -Ö -× -Ø -Ú -Ü -Ý -Þ -ß -à -á -â -ã -ä -å -æ -ç -è -é -ê -ë -ì -í -î -ï -ð -ñ -ò -ó -ô -õ -ö -ø -ù -ú -û -ü -ý -Ā -ā -ă -ą -ć -Č -č -Đ -đ -ē -ė -ę -ě -ĝ -ğ -ħ -ī -į -İ -ı -Ł -ł -ń -ņ -ň -ŋ -Ō -ō -ő -œ -ř -Ś -ś -Ş -ş -Š -š -Ť -ť -ũ -ū -ź -Ż -ż -Ž -ž -ơ -ư -ǎ -ǐ -ǒ -ǔ -ǚ -ș -ț -ɑ -ɔ -ɕ -ə -ɛ -ɜ -ɡ -ɣ -ɪ -ɫ -ɴ -ɹ -ɾ -ʃ -ʊ -ʌ -ʒ -ʔ -ʰ -ʷ -ʻ -ʾ -ʿ -ˈ -ː -˙ -˜ -ˢ -́ -̅ -Α -Β -Δ -Ε -Θ -Κ -Λ -Μ -Ξ -Π -Σ -Τ -Φ -Χ -Ψ -Ω -ά -έ -ή -ί -α -β -γ -δ -ε -ζ -η -θ -ι -κ -λ -μ -ν -ξ -ο -π -ρ -ς -σ -τ -υ -φ -χ -ψ -ω -ϊ -ό -ύ -ώ -ϕ -ϵ -Ё -А -Б -В -Г -Д -Е -Ж -З -И -Й -К -Л -М -Н -О -П -Р -С -Т -У -Ф -Х -Ц -Ч -Ш -Щ -Ы -Ь -Э -Ю -Я -а -б -в -г -д -е -ж -з -и -й -к -л -м -н -о -п -р -с -т -у -ф -х -ц -ч -ш -щ -ъ -ы -ь -э -ю -я -ё -і -ְ -ִ -ֵ -ֶ -ַ -ָ -ֹ -ּ -־ -ׁ -א -ב -ג -ד -ה -ו -ז -ח -ט -י -כ -ל -ם -מ -ן -נ -ס -ע -פ -ק -ר -ש -ת -أ -ب -ة -ت -ج -ح -د -ر -ز -س -ص -ط -ع -ق -ك -ل -م -ن -ه -و -ي -َ -ُ -ِ -ْ -ก -ข -ง -จ -ต -ท -น -ป -ย -ร -ว -ส -ห -อ -ฮ -ั -า -ี -ึ -โ -ใ -ไ -่ -้ -์ -ḍ -Ḥ -ḥ -ṁ -ṃ -ṅ -ṇ -Ṛ -ṛ -Ṣ -ṣ -Ṭ -ṭ -ạ -ả -Ấ -ấ -ầ -ậ -ắ -ằ -ẻ -ẽ -ế -ề -ể -ễ -ệ -ị -ọ -ỏ -ố -ồ -ộ -ớ -ờ -ở -ụ -ủ -ứ -ữ -ἀ -ἁ -Ἀ -ἐ -ἔ -ἰ -ἱ -ὀ -ὁ -ὐ -ὲ -ὸ -ᾶ -᾽ -ῆ -ῇ -ῶ -‎ -‑ -‒ -– -— -― -‖ -† -‡ -• -… -‧ -‬ -′ -″ -⁄ -⁡ -⁰ -⁴ -⁵ -⁶ -⁷ -⁸ -⁹ -₁ -₂ -₃ -€ -₱ -₹ -₽ -℃ -ℏ -ℓ -№ -ℝ -™ -⅓ -⅔ -⅛ -→ -∂ -∈ -∑ -− -∗ -√ -∞ -∫ -≈ -≠ -≡ -≤ -≥ -⋅ -⋯ -█ -♪ -⟨ -⟩ -、 -。 -《 -》 -「 -」 -【 -】 -あ -う -え -お -か -が -き -ぎ -く -ぐ -け -げ -こ -ご -さ -し -じ -す -ず -せ -ぜ -そ -ぞ -た -だ -ち -っ -つ -で -と -ど -な -に -ね -の -は -ば -ひ -ぶ -へ -べ -ま -み -む -め -も -ゃ -や -ゆ -ょ -よ -ら -り -る -れ -ろ -わ -を -ん -ァ -ア -ィ -イ -ウ -ェ -エ -オ -カ -ガ -キ -ク -ケ -ゲ -コ -ゴ -サ -ザ -シ -ジ -ス -ズ -セ -ゾ -タ -ダ -チ -ッ -ツ -テ -デ -ト -ド -ナ -ニ -ネ -ノ -バ -パ -ビ -ピ -フ -プ -ヘ -ベ -ペ -ホ -ボ -ポ -マ -ミ -ム -メ -モ -ャ -ヤ -ュ -ユ -ョ -ヨ -ラ -リ -ル -レ -ロ -ワ -ン -・ -ー -ㄋ -ㄍ -ㄎ -ㄏ -ㄓ -ㄕ -ㄚ -ㄜ -ㄟ -ㄤ -ㄥ -ㄧ -ㄱ -ㄴ -ㄷ -ㄹ -ㅁ -ㅂ -ㅅ -ㅈ -ㅍ -ㅎ -ㅏ -ㅓ -ㅗ -ㅜ -ㅡ -ㅣ -㗎 -가 -각 -간 -갈 -감 -갑 -갓 -갔 -강 -같 -개 -거 -건 -걸 -겁 -것 -겉 -게 -겠 -겨 -결 -겼 -경 -계 -고 -곤 -골 -곱 -공 -과 -관 -광 -교 -구 -국 -굴 -귀 -귄 -그 -근 -글 -금 -기 -긴 -길 -까 -깍 -깔 -깜 -깨 -께 -꼬 -꼭 -꽃 -꾸 -꿔 -끔 -끗 -끝 -끼 -나 -난 -날 -남 -납 -내 -냐 -냥 -너 -넘 -넣 -네 -녁 -년 -녕 -노 -녹 -놀 -누 -눈 -느 -는 -늘 -니 -님 -닙 -다 -닥 -단 -달 -닭 -당 -대 -더 -덕 -던 -덥 -데 -도 -독 -동 -돼 -됐 -되 -된 -될 -두 -둑 -둥 -드 -들 -등 -디 -따 -딱 -딸 -땅 -때 -떤 -떨 -떻 -또 -똑 -뚱 -뛰 -뜻 -띠 -라 -락 -란 -람 -랍 -랑 -래 -랜 -러 -런 -럼 -렇 -레 -려 -력 -렵 -렸 -로 -록 -롬 -루 -르 -른 -를 -름 -릉 -리 -릴 -림 -마 -막 -만 -많 -말 -맑 -맙 -맛 -매 -머 -먹 -멍 -메 -면 -명 -몇 -모 -목 -몸 -못 -무 -문 -물 -뭐 -뭘 -미 -민 -밌 -밑 -바 -박 -밖 -반 -받 -발 -밤 -밥 -방 -배 -백 -밸 -뱀 -버 -번 -벌 -벚 -베 -벼 -벽 -별 -병 -보 -복 -본 -볼 -봐 -봤 -부 -분 -불 -비 -빔 -빛 -빠 -빨 -뼈 -뽀 -뿅 -쁘 -사 -산 -살 -삼 -샀 -상 -새 -색 -생 -서 -선 -설 -섭 -섰 -성 -세 -셔 -션 -셨 -소 -속 -손 -송 -수 -숙 -순 -술 -숫 -숭 -숲 -쉬 -쉽 -스 -슨 -습 -슷 -시 -식 -신 -실 -싫 -심 -십 -싶 -싸 -써 -쓰 -쓴 -씌 -씨 -씩 -씬 -아 -악 -안 -않 -알 -야 -약 -얀 -양 -얘 -어 -언 -얼 -엄 -업 -없 -었 -엉 -에 -여 -역 -연 -염 -엽 -영 -옆 -예 -옛 -오 -온 -올 -옷 -옹 -와 -왔 -왜 -요 -욕 -용 -우 -운 -울 -웃 -워 -원 -월 -웠 -위 -윙 -유 -육 -윤 -으 -은 -을 -음 -응 -의 -이 -익 -인 -일 -읽 -임 -입 -있 -자 -작 -잔 -잖 -잘 -잡 -잤 -장 -재 -저 -전 -점 -정 -제 -져 -졌 -조 -족 -좀 -종 -좋 -죠 -주 -준 -줄 -중 -줘 -즈 -즐 -즘 -지 -진 -집 -짜 -짝 -쩌 -쪼 -쪽 -쫌 -쭈 -쯔 -찌 -찍 -차 -착 -찾 -책 -처 -천 -철 -체 -쳐 -쳤 -초 -촌 -추 -출 -춤 -춥 -춰 -치 -친 -칠 -침 -칩 -칼 -커 -켓 -코 -콩 -쿠 -퀴 -크 -큰 -큽 -키 -킨 -타 -태 -터 -턴 -털 -테 -토 -통 -투 -트 -특 -튼 -틀 -티 -팀 -파 -팔 -패 -페 -펜 -펭 -평 -포 -폭 -표 -품 -풍 -프 -플 -피 -필 -하 -학 -한 -할 -함 -합 -항 -해 -햇 -했 -행 -허 -험 -형 -혜 -호 -혼 -홀 -화 -회 -획 -후 -휴 -흐 -흔 -희 -히 -힘 -ﷺ -ﷻ -! -, -? -� -𠮶 diff --git a/client/lucy-tts/B2-Test.bat b/client/lucy-tts/B2-Test.bat deleted file mode 100644 index 41b3855..0000000 --- a/client/lucy-tts/B2-Test.bat +++ /dev/null @@ -1,12 +0,0 @@ -@echo off -chcp 65001 >nul -cd /d "F:\Coding Stuff\mission-control-2\client\lucy-tts" -echo B2-Test: seriell vs. 3 Worker (laedt mehrere Modelle - kann ein paar Minuten dauern)... -echo. -"ptts-venv\Scripts\python.exe" bench_b2.py > bench_b2.log 2>&1 -type bench_b2.log -echo. -echo ============================================================ -echo Fertig. WAVs in: %USERPROFILE%\Desktop\lucy_samples (b2_serial / b2_parallel_3w) -echo ============================================================ -pause diff --git a/client/lucy-tts/Lucy-Samples-erzeugen.bat b/client/lucy-tts/Lucy-Samples-erzeugen.bat deleted file mode 100644 index 223a4f4..0000000 --- a/client/lucy-tts/Lucy-Samples-erzeugen.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off -chcp 65001 >nul -cd /d "F:\Coding Stuff\mission-control-2\client\lucy-tts" -echo Erzeuge Lucy-Hoerproben (A1 safetensors-Cache + A2 Referenz-Cleaning)... -echo Modell laedt offline aus dem lokalen Cache - das kann ein paar Minuten dauern. -echo. -"ptts-venv\Scripts\python.exe" make_samples.py > make_samples.log 2>&1 -type make_samples.log -echo. -echo ============================================================ -echo Fertig. Samples liegen in: %USERPROFILE%\Desktop\lucy_samples -echo ============================================================ -pause diff --git a/client/lucy-tts/Lucy-Startklar.bat b/client/lucy-tts/Lucy-Startklar.bat deleted file mode 100644 index ad182f0..0000000 --- a/client/lucy-tts/Lucy-Startklar.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off -chcp 65001 >nul -cd /d "F:\Coding Stuff\mission-control-2\client\lucy-tts" -echo Lucy-Startklar-Check: bootet die Stimme + rendert finale Samples auf den Desktop... -echo (Modell laedt offline aus dem Cache - ein paar Sekunden) -echo. -"ptts-venv\Scripts\python.exe" lucy_ready.py > lucy_ready.log 2>&1 -type lucy_ready.log -echo. -echo ============================================================ -echo Samples: %USERPROFILE%\Desktop\lucy_samples (lucy_final_*) -echo ============================================================ -pause diff --git a/client/lucy-tts/Sweep-B2.bat b/client/lucy-tts/Sweep-B2.bat deleted file mode 100644 index be757f6..0000000 --- a/client/lucy-tts/Sweep-B2.bat +++ /dev/null @@ -1,12 +0,0 @@ -@echo off -chcp 65001 >nul -cd /d "F:\Coding Stuff\mission-control-2\client\lucy-tts" -echo B2-Sweep: WORKERS x THREADS finden (laedt viele Modelle - dauert ein paar Minuten)... -echo. -"ptts-venv\Scripts\python.exe" sweep_b2.py > sweep_b2.log 2>&1 -echo ============================================================ -type sweep_b2_result.json 2>nul -echo. -echo (Volllog: sweep_b2.log) -echo ============================================================ -pause diff --git a/client/lucy-tts/TTFB-Test.bat b/client/lucy-tts/TTFB-Test.bat deleted file mode 100644 index 9207079..0000000 --- a/client/lucy-tts/TTFB-Test.bat +++ /dev/null @@ -1,9 +0,0 @@ -@echo off -chcp 65001 >nul -cd /d "F:\Coding Stuff\mission-control-2\client\lucy-tts" -echo TTFB-Test (seriell): kurzer-erster-Chunk an/aus... -echo. -"ptts-venv\Scripts\python.exe" ttfb_test.py > ttfb_test.log 2>&1 -type ttfb_test.log -echo. -pause diff --git a/client/lucy-tts/Umlaut-Test.bat b/client/lucy-tts/Umlaut-Test.bat deleted file mode 100644 index 183076f..0000000 --- a/client/lucy-tts/Umlaut-Test.bat +++ /dev/null @@ -1,9 +0,0 @@ -@echo off -chcp 65001 >nul -cd /d "F:\Coding Stuff\mission-control-2\client\lucy-tts" -echo Umlaut-Test: Logik-Check + Vorher/Nachher-Audio... -echo. -"ptts-venv\Scripts\python.exe" umlaut_test.py > umlaut_test.log 2>&1 -type umlaut_test.log -echo. -pause diff --git a/client/lucy-tts/analyze.py b/client/lucy-tts/analyze.py deleted file mode 100644 index 5f3ed0a..0000000 --- a/client/lucy-tts/analyze.py +++ /dev/null @@ -1,50 +0,0 @@ -# -*- coding: utf-8 -*- -"""Stimm-RÖNTGEN: liest Wörter + Wort-genaue Zeiten + PAUSEN + Prosodie (F0/Tempo) aus einer WAV. -So sieht man beim Tunen objektiv, wo Pocket zu lange Pausen macht (Komma!), nuschelt, oder monoton wird. - -Nutzung: python analyze.py -""" -import sys, numpy as np, soundfile as sf, librosa -from faster_whisper import WhisperModel - -p = sys.argv[1] -a, sr = sf.read(p) -a = np.asarray(a, dtype=np.float32).reshape(-1) -dur = len(a) / sr - -w = WhisperModel("small", device="cpu", compute_type="int8") -segs, _ = w.transcribe(p, language="de", beam_size=5, word_timestamps=True) -words = [x for s in segs for x in (s.words or [])] -txt = " ".join(x.word.strip() for x in words) - -print(f"=== {p.split(chr(92))[-1]} ===") -print(f"Dauer {dur:.2f}s | {len(words)} Wörter | Tempo {len(words)/max(dur,0.01):.1f} Wörter/s") -print(f"TEXT: {txt}\n") - -print("WORT-TIMING & PAUSE danach:") -pauses = [] -for i, x in enumerate(words): - gap = (words[i + 1].start - x.end) if i + 1 < len(words) else 0.0 - flag = " <=== LANG" if gap >= 0.30 else (" <- Pause" if gap >= 0.15 else "") - if gap >= 0.15: - pauses.append((x.word.strip(), gap)) - print(f" {x.start:5.2f}-{x.end:5.2f} {x.word.strip():16} Pause: {gap*1000:4.0f}ms{flag}") - -# Rand-Stille -env = np.abs(a) > 0.015 -lead = (np.argmax(env) / sr * 1000) if env.any() else 0 -tail = ((len(a) - 1 - np.argmax(env[::-1])) if env.any() else len(a)) -tail_ms = (len(a) - tail) / sr * 1000 - -# Prosodie: F0 (Tonhöhe) über stimmhafte Frames -f0 = librosa.yin(a, fmin=80, fmax=400, sr=sr, frame_length=1024) -f0v = f0[(f0 > 90) & (f0 < 380)] -if f0v.size: - med = float(np.median(f0v)); rng = float(np.percentile(f0v, 90) - np.percentile(f0v, 10)) -else: - med = rng = 0.0 - -print(f"\nPAUSEN gesamt: {len(pauses)} (>=150ms) | längste: " + - (", ".join(f'nach „{w_}\": {g*1000:.0f}ms' for w_, g in sorted(pauses, key=lambda t: -t[1])[:4]) or "keine")) -print(f"RAND-STILLE: vorne {lead:.0f}ms, hinten {tail_ms:.0f}ms") -print(f"TONHÖHE: median {med:.0f}Hz, Spanne {rng:.0f}Hz ({'monoton' if rng < 40 else 'lebendig' if rng > 90 else 'ok'})") diff --git a/client/lucy-tts/bench_b2.py b/client/lucy-tts/bench_b2.py deleted file mode 100644 index 94f541c..0000000 --- a/client/lucy-tts/bench_b2.py +++ /dev/null @@ -1,67 +0,0 @@ -# -*- coding: utf-8 -*- -"""bench_b2.py — verifiziert B2 (Worker-Pool) end-to-end mit den ECHTEN pocket_server-Funktionen. -Misst die Wall-Clock einer langen, mehrsätzigen Antwort SERIELL (1 Modell) vs. 3 WORKER parallel, -prüft die Reihenfolge (geordnete Ausgabe) und legt beide Ergebnis-WAVs auf den Desktop. -""" -import os, time -import numpy as np, soundfile as sf, librosa -from concurrent.futures import ProcessPoolExecutor -from pocket_tts import TTSModel -import pocket_server as ps - -DESK = os.path.join(os.path.expanduser("~"), "Desktop", "lucy_samples") -os.makedirs(DESK, exist_ok=True) - -LONG = ("Guten Morgen, Commander. Das nächtliche Backup ist sauber durchgelaufen. " - "Es gab keine Fehler in den Protokollen. Der Dienst läuft stabil weiter. " - "Ich habe die Modelle vorgewärmt und die Engine antwortet zügig. " - "Wenn du möchtest, starte ich jetzt den Tagesbericht und fasse die offenen Punkte zusammen.") - - -def _serial(): - m = TTSModel.load_model(language=ps.LANG, lsd_decode_steps=ps.LSD, temp=ps.TEMP, - noise_clamp=ps.NOISE_CLAMP, quantize=ps.QUANTIZE) - ref = ps._prep_ref() - try: - vs = m.get_state_for_audio_prompt(ps.VOICE_ST) - except Exception: - vs = m.get_state_for_audio_prompt(ref) - ref_audio, _ = librosa.load(ref, sr=m.sample_rate, mono=True) - ps.STATE.clear() - ps.STATE.update(m=m, vs=vs, sr=m.sample_rate, ref_fp=ps._fingerprint(ref_audio, m.sample_rate)) - sents = ps._split_sentences(LONG) - t0 = time.time() - parts = list(ps._gen_sentences_ordered(sents)) # pool=None -> serieller Zweig (LOCK) - dt = time.time() - t0 - a = np.concatenate(parts) - sf.write(os.path.join(DESK, "b2_serial.wav"), a, m.sample_rate) - ps.STATE.clear(); del m - return dt, a.size / 24000, len(sents) - - -def _parallel(nworkers): - ps.STATE.clear() - pool = ProcessPoolExecutor(max_workers=nworkers, initializer=ps._worker_init) - list(pool.map(ps._warmup, range(nworkers))) # alle Worker vorab hochfahren - ref = ps._prep_ref() - ref_audio, _ = librosa.load(ref, sr=24000, mono=True) - ps.STATE.update(sr=24000, ref_fp=ps._fingerprint(ref_audio, 24000), pool=pool) - sents = ps._split_sentences(LONG) - t0 = time.time() - parts = list(ps._gen_sentences_ordered(sents)) # pool -> parallel, geordnet - dt = time.time() - t0 - a = np.concatenate(parts) - sf.write(os.path.join(DESK, f"b2_parallel_{nworkers}w.wav"), a, 24000) - pool.shutdown(wait=True); ps.STATE.clear() - return dt, a.size / 24000, len(sents) - - -if __name__ == "__main__": - print(f"Text: {len(LONG)} Zeichen") - ds, audio_s, n = _serial() - print(f"SERIELL : {ds:5.2f}s wall ({n} Saetze, {audio_s:4.1f}s Audio) -> b2_serial.wav") - dp, _, _ = _parallel(3) - print(f"3 WORKER: {dp:5.2f}s wall -> b2_parallel_3w.wav") - if dp > 0: - print(f"Speedup : {ds/dp:.2f}x (Audio gleich lang -> nur Generierzeit zaehlt)") - print("B2_DONE") diff --git a/client/lucy-tts/bench_lucy.py b/client/lucy-tts/bench_lucy.py deleted file mode 100644 index 23973fb..0000000 --- a/client/lucy-tts/bench_lucy.py +++ /dev/null @@ -1,109 +0,0 @@ -# -*- coding: utf-8 -*- -"""bench_lucy.py — A3/B1: misst Lucys Stimme (pocket-tts) über temp/lsd. - -Metriken je Konfig: RTF, gen-Zeit und ROHE Kollaps-Rate (EINE Generierung, OHNE best-of-N-Gate) -— also genau das, was der Stimm-Wächter aktuell wegbügeln muss (= Latenz-Treiber). Niedrigere -temp sollte die rohe Kollaps-Rate senken -> weniger Regenerationen -> niedrigere effektive Latenz. - -Nutzung (im ptts-venv der lucy-tts-Maschine): - python bench_lucy.py # Default-Sweep - python bench_lucy.py --reps 5 - python bench_lucy.py --temps 0.7,0.8,0.9 --lsds 8,10,12 - python bench_lucy.py --whisper # + Verständlichkeits-Check (faster-whisper) - -Reuse: Kollaps-Logik (F0 + MFCC-Fingerabdruck) und cleanup() kommen 1:1 aus pocket_server.py, -damit der Benchmark exakt die Produktions-Kriterien misst. -""" -import os, time, argparse, statistics as st -import numpy as np, soundfile as sf, librosa -from pocket_tts import TTSModel -import pocket_server as ps - -SENT = { - "kurz": "Hallo Commander, ich höre dich.", - "mittel": "Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", - "lang": "Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die " - "Protokolle und melde mich, sobald alles wieder läuft.", -} - - -def _voice_state(m): - """Voice-State laden: bevorzugt das gecachte safetensors (A1), sonst aus der Referenz klonen.""" - if os.path.exists(ps.VOICE_ST): - try: - return m.get_state_for_audio_prompt(ps.VOICE_ST) - except Exception as e: - print(f" (safetensors-Load fehlgeschlagen, klone aus Referenz: {e})") - return m.get_state_for_audio_prompt(ps._prep_ref()) - - -def _raw_gen(m, vs, ref_fp, text, sr): - """EINE rohe Generierung (kein Gate). -> (gen_s, audio_s, male, sim, audio).""" - t0 = time.time() - audio = m.generate_audio(vs, ps.LEAD + text, frames_after_eos=ps.FEOS) - gen = time.time() - t0 - a = audio.numpy() if hasattr(audio, "numpy") else np.asarray(audio) - a = np.asarray(a, dtype=np.float32).reshape(-1) - f0 = ps._voiced_f0(a, sr) - male = (f0 == f0) and f0 < ps.F0_FLOOR # NaN-sicher - fp = ps._fingerprint(ps._crop_lead(a, sr), sr) - sim = float(np.dot(ref_fp, fp)) if (ref_fp is not None and fp is not None) else 1.0 - return gen, a.size / sr, bool(male), sim, a - - -def main(): - ap = argparse.ArgumentParser() - ap.add_argument("--temps", default="0.7,0.8,0.9") - ap.add_argument("--lsds", default="8,10") - ap.add_argument("--reps", type=int, default=4) - ap.add_argument("--whisper", action="store_true") - args = ap.parse_args() - temps = [float(x) for x in args.temps.split(",")] - lsds = [int(x) for x in args.lsds.split(",")] - - OUT = os.path.join(ps.BASE, "out_bench"); os.makedirs(OUT, exist_ok=True) - ref = ps._prep_ref() - print(f"LANG={ps.LANG} quantize={ps.QUANTIZE} noise_clamp={ps.NOISE_CLAMP} " - f"F0_FLOOR={ps.F0_FLOOR} FP_FLOOR={ps.FP_FLOOR} reps={args.reps}") - print(f"{'temp':>5} {'lsd':>4} | {'RTF':>5} {'gen/s':>6} | " - f"{'collapse%':>9} {'sim_min':>7} {'sim_avg':>7}") - rows = [] - for lsd in lsds: - for temp in temps: - m = TTSModel.load_model(language=ps.LANG, lsd_decode_steps=lsd, temp=temp, - noise_clamp=ps.NOISE_CLAMP, quantize=ps.QUANTIZE) - sr = m.sample_rate - ref_audio, _ = librosa.load(ref, sr=sr, mono=True) - ref_fp = ps._fingerprint(ref_audio, sr) - vs = _voice_state(m) - rtfs, gens, sims, collapses, n = [], [], [], 0, 0 - for name, text in SENT.items(): - for r in range(args.reps): - gen, asec, male, sim, a = _raw_gen(m, vs, ref_fp, text, sr) - rtfs.append(gen / max(asec, 0.01)); gens.append(gen); sims.append(sim) - collapses += int(male or sim < ps.FP_FLOOR); n += 1 - if r == 0: # ein Sample je Satz zum Reinhören - sf.write(os.path.join(OUT, f"t{temp}_l{lsd}_{name}.wav"), ps.cleanup(a, sr), sr) - cr = 100.0 * collapses / max(n, 1) - print(f"{temp:>5} {lsd:>4} | {st.mean(rtfs):>5.2f} {st.mean(gens):>6.2f} | " - f"{cr:>8.1f}% {min(sims):>7.3f} {st.mean(sims):>7.3f}") - rows.append((temp, lsd, st.mean(rtfs), cr, min(sims))) - del m - - best = sorted(rows, key=lambda x: (x[3], x[2]))[0] # min Kollaps, dann beste RTF - print(f"\n>> Vorschlag: temp={best[0]} lsd={best[1]} " - f"(collapse={best[3]:.1f}%, RTF={best[2]:.2f}) -> in pocket_server via " - f"LUCY_TEMP / LUCY_LSD setzen.") - - if args.whisper: - print("\n=== Whisper-Verständlichkeit (faster-whisper small/int8) ===") - from faster_whisper import WhisperModel - import glob - wm = WhisperModel("small", device="cpu", compute_type="int8") - for p in sorted(glob.glob(os.path.join(OUT, "*.wav"))): - segs, _ = wm.transcribe(p, language="de", beam_size=5) - print(os.path.basename(p), "::", " ".join(s.text.strip() for s in segs)) - - -if __name__ == "__main__": - main() diff --git a/client/lucy-tts/debug_stream.py b/client/lucy-tts/debug_stream.py deleted file mode 100644 index e70f934..0000000 --- a/client/lucy-tts/debug_stream.py +++ /dev/null @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- -"""Debug: warum greift der Onset-Crop auf dem 1s-Kopf des Streams nicht? + Roh-RMS für Gain-Kalibrierung.""" -import os, numpy as np, librosa, soundfile as sf -from pocket_tts import TTSModel - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" -src,_ = librosa.load(os.path.join(BASE,"ref.mp3"), sr=24000, mono=True) -srt,_ = librosa.effects.trim(src, top_db=30); ref=os.path.join(BASE,"ref.wav") -sf.write(ref, srt[:int(18*24000)], 24000) - -m = TTSModel.load_model(language="german_24l", lsd_decode_steps=6, temp=0.9) -vs = m.get_state_for_audio_prompt(ref); sr = m.sample_rate -LEAD = "Tja. " -text = LEAD + "Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu." - -chunks = [] -for c in m.generate_audio_stream(vs, text, frames_after_eos=4): - c = c.numpy() if hasattr(c,"numpy") else np.asarray(c) - chunks.append(np.asarray(c,dtype=np.float32).reshape(-1)) -print(f"#chunks={len(chunks)} chunk_sizes_ms={[round(x.size/sr*1000) for x in chunks[:8]]}") -full = np.concatenate(chunks) -print(f"full dur={full.size/sr:.2f}s peak={np.abs(full).max():.3f} rms={np.sqrt(np.mean(full**2)):.3f}") - -head = full[:int(1.0*sr)] -for td in (45, 35, 25, 20): - iv = librosa.effects.split(head, top_db=td) - segs = [(round(s/sr,2), round(e/sr,2)) for s,e in iv] - print(f"HEAD top_db={td}: {len(iv)} segs {segs}") -# voller Onset-Crop (wie nicht-stream) zum Vergleich -ivf = librosa.effects.split(full, top_db=35) -print(f"FULL top_db=35: {len(ivf)} segs erste3={[(round(s/sr,2),round(e/sr,2)) for s,e in ivf[:3]]}") -print("DBG_DONE") diff --git a/client/lucy-tts/diag_clip.py b/client/lucy-tts/diag_clip.py deleted file mode 100644 index 43c7bfd..0000000 --- a/client/lucy-tts/diag_clip.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- -"""Diagnose: schneidet das Modell selbst vorne/hinten ab, oder mein Trim? -Misst Stille-Anteil am Anfang/Ende des ROHEN Outputs (vor jedem Trim).""" -import os, time, numpy as np, soundfile as sf, librosa -from pocket_tts import TTSModel - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" -OUT = os.path.join(BASE, "out_diag"); os.makedirs(OUT, exist_ok=True) -y, _ = librosa.load(os.path.join(BASE, "ref.mp3"), sr=24000, mono=True) -yt, _ = librosa.effects.trim(y, top_db=30); ref = os.path.join(BASE, "ref.wav") -sf.write(ref, yt[:int(18*24000)], 24000) - -SENT = { - "kurz": "Hallo Commander, ich höre dich.", - "lang": "Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft.", -} - -def lead_tail_silence(a, sr): - """Wie viel ms am Anfang/Ende liegen unter -40dB vom Peak (= 'Stille')?""" - a = np.abs(np.asarray(a, dtype=np.float32).reshape(-1)) - if a.size == 0: return 0.0, 0.0, 0.0 - peak = a.max() + 1e-9 - thr = peak * (10 ** (-40/20)) # -40 dB - above = np.where(a > thr)[0] - if above.size == 0: return a.size/sr*1000, a.size/sr*1000, 0.0 - lead = above[0] / sr * 1000 - tail = (a.size - 1 - above[-1]) / sr * 1000 - return lead, tail, a.size/sr*1000 - -m = TTSModel.load_model(language="german_24l", lsd_decode_steps=4) -vs = m.get_state_for_audio_prompt(ref) -sr = m.sample_rate -for name, text in SENT.items(): - for feos in [None, 4, 8]: - a = m.generate_audio(vs, text, frames_after_eos=feos) - a = a.numpy() if hasattr(a, "numpy") else np.asarray(a) - a = a.reshape(-1) - lead, tail, total = lead_tail_silence(a, sr) - sf.write(os.path.join(OUT, f"raw_{name}_feos{feos}.wav"), a, sr) - print(f"[{name:5} feos={str(feos):4}] total={total:7.1f}ms lead_sil={lead:6.1f}ms tail_sil={tail:6.1f}ms peak={np.abs(a).max():.3f}", flush=True) -print("DIAG_DONE", flush=True) diff --git a/client/lucy-tts/diag_noiseclamp.py b/client/lucy-tts/diag_noiseclamp.py deleted file mode 100644 index 7216b06..0000000 --- a/client/lucy-tts/diag_noiseclamp.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -"""Stabilität gegen Stimm-Kollaps: temp 0.9 mit/ohne noise_clamp. F0-Verteilung + Whisper + RTF. -Mehr Samples, um einen Kollaps (tiefe F0) zu provozieren und zu sehen, ob noise_clamp ihn dämpft.""" -import os, time, numpy as np, librosa, soundfile as sf -from pocket_tts import TTSModel -from faster_whisper import WhisperModel - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" -src,_ = librosa.load(os.path.join(BASE,"ref.mp3"), sr=24000, mono=True) -srt,_ = librosa.effects.trim(src, top_db=30); ref=os.path.join(BASE,"ref.wav") -sf.write(ref, srt[:int(18*24000)], 24000) -LEAD="Tja. " -TEXTS = ["Hallo Commander, ich höre dich.","Natürlich, das mache ich sofort für dich.", - "Die Hitze ist heute wirklich heftig.","Klar, ich kümmere mich gleich darum.", - "Guten Morgen, Commander, alles sauber.","Kein Problem, ich erledige das jetzt.", - "Das Backup lief ohne Fehler durch.","Verstanden, Commander, ich bleibe dran."] -w = WhisperModel("small", device="cpu", compute_type="int8") - -def f0_of(a, sr): - f0,_,_ = librosa.pyin(a, fmin=80, fmax=400, sr=sr, frame_length=1024) - v=f0[~np.isnan(f0)]; return float(np.median(v)) if v.size else float("nan") - -def run(temp, nc): - m = TTSModel.load_model(language="german_24l", lsd_decode_steps=6, temp=temp, noise_clamp=nc) - vs = m.get_state_for_audio_prompt(ref); sr=m.sample_rate - print(f"=== temp={temp} noise_clamp={nc} ===", flush=True) - f0s=[]; rtfs=[] - for i in range(12): - t=TEXTS[i%len(TEXTS)] - t0=time.time(); a=m.generate_audio(vs, LEAD+t, frames_after_eos=4); dt=time.time()-t0 - a=a.numpy() if hasattr(a,"numpy") else np.asarray(a); a=np.asarray(a,dtype=np.float32).reshape(-1) - f0=f0_of(a,sr); f0s.append(f0); rtfs.append(dt/max(a.size/sr,0.01)) - flag=" <<< MÄNNLICH/Kollaps?" if (f0==f0 and f0<150) else "" - print(f" [{i:2}] F0={f0:6.1f}Hz{flag}", flush=True) - arr=np.array([x for x in f0s if x==x]) - print(f" -> F0 median {np.median(arr):.0f} min {arr.min():.0f} max {arr.max():.0f} | RTF~{np.median(rtfs):.2f}", flush=True) - -run(0.9, None) -run(0.9, 3.0) -print("NC_DONE") diff --git a/client/lucy-tts/diag_stream2.py b/client/lucy-tts/diag_stream2.py deleted file mode 100644 index eaa546a..0000000 --- a/client/lucy-tts/diag_stream2.py +++ /dev/null @@ -1,57 +0,0 @@ -# -*- coding: utf-8 -*- -"""Warum 'manchmal zu laut' + 'Stimme verändert sich am Anfang'? Stream-Kopf-Logik N× laufen lassen -und Gain, Crop-Punkt, Kopf-Segmente, Whisper-Start, rms/peak protokollieren.""" -import os, numpy as np, librosa, soundfile as sf -from pocket_tts import TTSModel -from faster_whisper import WhisperModel - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" -src,_ = librosa.load(os.path.join(BASE,"ref.mp3"), sr=24000, mono=True) -srt,_ = librosa.effects.trim(src, top_db=30); ref=os.path.join(BASE,"ref.wav") -sf.write(ref, srt[:int(18*24000)], 24000) -TARGET_RMS=0.09; LEAD="Tja. " -m = TTSModel.load_model(language="german_24l", lsd_decode_steps=6, temp=0.9) -vs = m.get_state_for_audio_prompt(ref); sr=m.sample_rate -w = WhisperModel("small", device="cpu", compute_type="int8") -TEXTS = ["Hallo Commander, ich höre dich.", - "Natürlich, Commander. Das Backup ist sauber durchgelaufen."] - -def run_once(text): - chunks=[] - for c in m.generate_audio_stream(vs, LEAD+text, frames_after_eos=4): - c=c.numpy() if hasattr(c,"numpy") else np.asarray(c) - chunks.append(np.asarray(c,dtype=np.float32).reshape(-1)) - full=np.concatenate(chunks) - # Kopf adaptiv (wie Server): bis >=2 Segmente oder 2.5s - head=[]; hl=0; head_arr=None - for c in chunks: - head.append(c); hl+=c.size - if hl < int(0.5*sr): continue - a=np.concatenate(head) - if len(librosa.effects.split(a, top_db=35))>=2 or hl>=int(2.5*sr): - head_arr=a; break - if head_arr is None: head_arr=np.concatenate(head) - iv=librosa.effects.split(head_arr, top_db=35) - segs=[(round(s/sr,2),round(e/sr,2)) for s,e in iv] - # Gain aus voiced (aktuelle Server-Logik) - voiced=np.concatenate([head_arr[s:e] for s,e in iv]) if len(iv) else head_arr - rms=float(np.sqrt(np.mean(voiced**2))) or 1e-9 - gain=TARGET_RMS/rms - # Crop (aktuell): kurz vor echtem Wort - if len(iv)>=2: - cut=max(iv[0][1], iv[1][0]-int(0.06*sr)); cropped=full[cut:] - else: - cropped=full - out=np.clip(cropped*gain,-0.95,0.95) - sf.write(os.path.join(BASE,"out_diag_s.wav"), out, sr) - seg,_=w.transcribe(os.path.join(BASE,"out_diag_s.wav"), language="de", beam_size=5) - start=(" ".join(x.text for x in seg)).strip()[:30] - return dict(segs=segs, voiced_rms=round(rms,3), gain=round(gain,2), - out_rms=round(float(np.sqrt(np.mean(out**2))),3), out_peak=round(float(np.abs(out).max()),3), - start=start) - -for text in TEXTS: - print(f"=== {text[:30]!r} ===") - for i in range(4): - print(f" run{i}:", run_once(text)) -print("DIAG2_DONE") diff --git a/client/lucy-tts/diag_stream3.py b/client/lucy-tts/diag_stream3.py deleted file mode 100644 index 66bd950..0000000 --- a/client/lucy-tts/diag_stream3.py +++ /dev/null @@ -1,59 +0,0 @@ -# -*- coding: utf-8 -*- -"""Test der ROBUSTEN Stream-Kopf-Logik: fester 1.8s-Kopf + Crop am ersten SUBSTANZIELLEN Wort-Segment -(ignoriert Mini-Blips) + FIXER Gain. Ziel: Start immer echtes Wort, out_rms stabil ~0.09, kein Clip.""" -import os, numpy as np, librosa, soundfile as sf -from pocket_tts import TTSModel -from faster_whisper import WhisperModel - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" -src,_ = librosa.load(os.path.join(BASE,"ref.mp3"), sr=24000, mono=True) -srt,_ = librosa.effects.trim(src, top_db=30); ref=os.path.join(BASE,"ref.wav") -sf.write(ref, srt[:int(18*24000)], 24000) -TARGET_RMS=0.09; LEAD="Tja. " -BASE_GAIN = TARGET_RMS / 0.18 # ~0.5 (raw full-rms ~0.18 konsistent) -GMIN, GMAX = 0.7*BASE_GAIN, 1.4*BASE_GAIN # Gain-Clamp -> kann NIE explodieren -HEAD_FIXED = int(2.0*24000) -m = TTSModel.load_model(language="german_24l", lsd_decode_steps=6, temp=0.9) -vs = m.get_state_for_audio_prompt(ref); sr=m.sample_rate -w = WhisperModel("small", device="cpu", compute_type="int8") -TEXTS = ["Hallo Commander, ich höre dich.", - "Natürlich, Commander. Das Backup ist sauber durchgelaufen."] - -def crop_and_gain(a): - """Crop am ersten SUBSTANZIELLEN Wort-Segment nach dem Lead (>=0.2s, ignoriert Mini-Blips); - Gain aus voiced-rms, GECLAMPT (kann nie explodieren).""" - iv = librosa.effects.split(a, top_db=35) - voiced = np.concatenate([a[s:e] for s,e in iv]) if len(iv) else a - rms = float(np.sqrt(np.mean(voiced**2))) or 1e-9 - gain = float(np.clip(TARGET_RMS/rms, GMIN, GMAX)) - cut = 0 - if len(iv) >= 2: - for k in range(1, len(iv)): - if (iv[k][1]-iv[k][0]) >= int(0.20*sr): - cut = max(iv[k-1][1], iv[k][0]-int(0.06*sr)); break - return a[cut:], round(cut/sr,2), round(gain,2) - -def run_once(text): - head=[]; hl=0; head_done=False; head_arr=None; rest=[] - for c in m.generate_audio_stream(vs, LEAD+text, frames_after_eos=4): - c=c.numpy() if hasattr(c,"numpy") else np.asarray(c); c=np.asarray(c,dtype=np.float32).reshape(-1) - if not head_done: - head.append(c); hl+=c.size - if hl>=HEAD_FIXED: head_arr=np.concatenate(head); head_done=True - else: rest.append(c) - if head_arr is None: head_arr=np.concatenate(head) - cropped_head, cutpt, gain = crop_and_gain(head_arr) - full = np.concatenate([cropped_head]+rest) - out=np.clip(full*gain,-0.95,0.95) - sf.write(os.path.join(BASE,"out_diag_s3.wav"), out, sr) - seg,_=w.transcribe(os.path.join(BASE,"out_diag_s3.wav"), language="de", beam_size=5) - start=(" ".join(x.text for x in seg)).strip()[:32] - return dict(cut=cutpt, gain=gain, out_rms=round(float(np.sqrt(np.mean(out**2))),3), - out_peak=round(float(np.abs(out).max()),3), start=start) - -print(f"gain-clamp=[{round(GMIN,2)},{round(GMAX,2)}] head={HEAD_FIXED/24000}s") -for text in TEXTS: - print(f"=== {text[:28]!r} ===") - for i in range(5): - print(f" run{i}:", run_once(text)) -print("DIAG3_DONE") diff --git a/client/lucy-tts/diag_voice_f0.py b/client/lucy-tts/diag_voice_f0.py deleted file mode 100644 index cedd9b7..0000000 --- a/client/lucy-tts/diag_voice_f0.py +++ /dev/null @@ -1,44 +0,0 @@ -# -*- coding: utf-8 -*- -"""Verifiziert die 'Stimme wurde männlich'-Hypothese: misst F0 (Grundfrequenz) vieler Generierungen -bei temp 0.9 vs 0.7. Weiblich (Saber-Klon) ~180-240Hz, männlich-Drift (Default 'juergen') ~100-140Hz. -Sucht Ausreißer = Stimm-Identitäts-Kollaps.""" -import os, numpy as np, librosa, soundfile as sf -from pocket_tts import TTSModel - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" -src,_ = librosa.load(os.path.join(BASE,"ref.mp3"), sr=24000, mono=True) -srt,_ = librosa.effects.trim(src, top_db=30); ref=os.path.join(BASE,"ref.wav") -sf.write(ref, srt[:int(18*24000)], 24000) -LEAD="Tja. " -TEXTS = [ - "Hallo Commander, ich höre dich.", - "Natürlich, Commander, das mache ich sofort.", - "Die Hitze in Hamburg ist heute wirklich heftig.", - "Klar, ich kümmere mich gleich darum für dich.", - "Guten Morgen, Commander, alles läuft sauber.", - "Das Backup ist durchgelaufen, keine Fehler.", -] - -def median_f0(a, sr): - f0,_,_ = librosa.pyin(a, fmin=80, fmax=400, sr=sr, frame_length=1024) - v = f0[~np.isnan(f0)] - return float(np.median(v)) if v.size else float("nan") - -def run(temp): - m = TTSModel.load_model(language="german_24l", lsd_decode_steps=6, temp=temp) - vs = m.get_state_for_audio_prompt(ref); sr=m.sample_rate - print(f"=== temp={temp} ===", flush=True) - f0s=[] - for i,t in enumerate(TEXTS): - a = m.generate_audio(vs, LEAD+t, frames_after_eos=4) - a = a.numpy() if hasattr(a,"numpy") else np.asarray(a) - a = np.asarray(a,dtype=np.float32).reshape(-1) - f0 = median_f0(a, sr); f0s.append(f0) - flag = " <<< MÄNNLICH?" if (f0==f0 and f0<150) else "" - print(f" [{i}] F0={f0:6.1f}Hz{flag} ({t[:30]})", flush=True) - arr=np.array([x for x in f0s if x==x]) - print(f" -> median {np.median(arr):.0f}Hz, min {arr.min():.0f}, max {arr.max():.0f}", flush=True) - -run(0.9) -run(0.7) -print("F0_DONE") diff --git a/client/lucy-tts/final_test.py b/client/lucy-tts/final_test.py deleted file mode 100644 index 3b80707..0000000 --- a/client/lucy-tts/final_test.py +++ /dev/null @@ -1,47 +0,0 @@ -# -*- coding: utf-8 -*- -"""ABSCHLUSS-TEST: beweist die Prompt-Wirkung. Dieselbe Lucy-Antwort im NEUEN Stil (kurze Sätze, -Punkte) vs. ALTEM Stil (Komma-Kette). Rendert auf :8134 + Desktop, misst Pausen (Whisper).""" -import os, io, json, urllib.request -import numpy as np, soundfile as sf -from faster_whisper import WhisperModel - -SERVER = "http://127.0.0.1:8134/tts" -OUT = os.path.join(os.path.expanduser("~"), "Desktop", "lucy_test"); os.makedirs(OUT, exist_ok=True) - -# Gleicher Inhalt, zwei Stile — so würde Lucy VORHER (Komma-Kette) und NACHHER (Prompt: kurze Sätze) antworten. -PAIRS = [ - ("A_backup", - "Klar, Commander, das Backup ist heute Nacht durchgelaufen, es gab keine Fehler, und die Datenbank läuft stabil bei 92 Prozent.", - "Klar, Commander. Das Backup lief heute Nacht durch. Keine Fehler. Die Datenbank ist stabil bei 92 Prozent."), - ("B_status", - "Also, wenn ich das kurz zusammenfasse, die Verbindung war weg, dann lief das Update durch, danach musste ich neu starten, und jetzt sind alle Dienste wieder oben.", - "Kurz zusammengefasst, Commander. Die Verbindung war weg. Das Update lief durch. Ich musste neu starten. Jetzt sind alle Dienste wieder oben."), -] - -def render(text): - req = urllib.request.Request(SERVER, data=json.dumps({"text": text}).encode("utf-8"), - headers={"Content-Type": "application/json"}) - return urllib.request.urlopen(req, timeout=180).read() - -w = WhisperModel("small", device="cpu", compute_type="int8") - -def measure(tag, text): - wav = render(text); path = os.path.join(OUT, tag + ".wav"); open(path, "wb").write(wav) - a, sr = sf.read(io.BytesIO(wav)); a = np.asarray(a, dtype=np.float32).reshape(-1); dur = len(a)/sr - segs, _ = w.transcribe(path, language="de", beam_size=5, word_timestamps=True) - words = [x for s in segs for x in (s.words or [])] - gaps = [words[i+1].start - words[i].end for i in range(len(words)-1)] - lang = [(words[i].word.strip(), gaps[i]) for i in range(len(gaps)) if gaps[i] >= 0.30] - total_pause = sum(g for g in gaps if g >= 0.15) - return dur, len(lang), total_pause, lang - -for name, alt, neu in PAIRS: - d_a, n_a, tp_a, l_a = measure(f"{name}_ALT_komma", alt) - d_n, n_n, tp_n, l_n = measure(f"{name}_NEU_kurz", neu) - print(f"\n### {name}") - print(f" ALT (Komma-Kette): {d_a:4.1f}s | {n_a} LANG-Pausen | Summe Pausen {tp_a*1000:4.0f}ms") - print(f" LANG: " + (", ".join(f'„{ww}\"={gg*1000:.0f}ms' for ww, gg in l_a) or "keine")) - print(f" NEU (kurze Sätze): {d_n:4.1f}s | {n_n} LANG-Pausen | Summe Pausen {tp_n*1000:4.0f}ms") - print(f" LANG: " + (", ".join(f'„{ww}\"={gg*1000:.0f}ms' for ww, gg in l_n) or "keine")) - print(f" -> {d_a-d_n:+.1f}s Dauer, {tp_a*1000-tp_n*1000:+.0f}ms Pausen-Summe") -print("\n=== ABSCHLUSS-TEST FERTIG === (WAVs im Desktop\\lucy_test)") diff --git a/client/lucy-tts/lucy_ready.py b/client/lucy-tts/lucy_ready.py deleted file mode 100644 index fca201b..0000000 --- a/client/lucy-tts/lucy_ready.py +++ /dev/null @@ -1,60 +0,0 @@ -# -*- coding: utf-8 -*- -"""lucy_ready.py — Startklar-Check + finale Samples in EINEM Lauf. -Bootet den ECHTEN Server (FastAPI-TestClient triggert lifespan: Modell-Load, A1-Cache, STATE), -prüft /health, und rendert die finalen Hörproben über die REALEN Endpoints /tts und /tts/stream -(exakt das, was die Lucy-App auf :8130 aufruft) — inkl. Live-TTFB der Streaming-Antwort. -Legt die Samples auf den Desktop, schreibt lucy_ready_report.json. -""" -import os, time, json -import numpy as np, soundfile as sf -from fastapi.testclient import TestClient -import pocket_server as ps - -DESK = os.path.join(os.path.expanduser("~"), "Desktop", "lucy_samples") -os.makedirs(DESK, exist_ok=True) - -SENT = { - "kurz": "Hallo Commander, ich höre dich.", - "mittel": "Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", - "lang": "Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die " - "Protokolle und melde mich, sobald alles wieder läuft.", -} -LONG = ("Guten Morgen, Commander. " - "Das nächtliche Backup ist sauber durchgelaufen und es gab keine Fehler. " - "Der Dienst läuft stabil und die Engine antwortet zügig. " - "Wenn du möchtest, fasse ich die offenen Punkte für heute zusammen.") - -report = {} -t0 = time.time() -with TestClient(ps.app) as c: # <-- triggert lifespan (echter Boot) - report["boot_s"] = round(time.time() - t0, 1) - h = c.get("/health").json() - report["health"] = h - print(f"BOOT in {report['boot_s']}s health={h}") - - for name, text in SENT.items(): # /tts (ganze Datei) -> Desktop - t = time.time(); r = c.post("/tts", json={"text": text}); dt = time.time() - t - assert r.status_code == 200, f"/tts {name} -> {r.status_code}" - open(os.path.join(DESK, f"lucy_final_{name}.wav"), "wb").write(r.content) - print(f"/tts {name:6}: {dt:4.2f}s audio={r.headers.get('X-Audio-Seconds')}s") - - # /tts/stream: lange Antwort wie Lucy LIVE spricht -> TTFB messen + PCM zu WAV - sr = int(h.get("sr") or 24000) - t = time.time(); first = None; chunks = [] - with c.stream("POST", "/tts/stream", json={"text": LONG}) as s: - sr = int(s.headers.get("X-Sample-Rate", sr)) - for ch in s.iter_bytes(): - if ch: - if first is None: - first = time.time() - t - chunks.append(ch) - a = np.frombuffer(b"".join(chunks), dtype=" {p}") - ps.STATE.clear() - del m - - -if __name__ == "__main__": - print("=== A2 AN (Highpass+Norm) + A1 safetensors-Cache ===") - build(ref_clean=True, tag="clean", use_cache=True) - print("\n=== A2 AUS (Roh-Referenz, direkt geklont) ===") - build(ref_clean=False, tag="raw", use_cache=False) - print(f"\nFERTIG. Samples liegen in: {DESK}") diff --git a/client/lucy-tts/measure_fix.py b/client/lucy-tts/measure_fix.py deleted file mode 100644 index a9080b9..0000000 --- a/client/lucy-tts/measure_fix.py +++ /dev/null @@ -1,38 +0,0 @@ -# -*- coding: utf-8 -*- -"""Fix-Verifikation: rendert die Problem-/Regressionssätze auf :8134, misst Pausen + IST (Whisper).""" -import os, io, json, urllib.request -import numpy as np, soundfile as sf -from faster_whisper import WhisperModel - -SERVER = "http://127.0.0.1:8134/tts" -OUT = os.path.join(os.environ["TEMP"], "lucy_fix"); os.makedirs(OUT, exist_ok=True) - -TESTS = [ - ("01_kurz", "Schön, dass du da bist, Commander."), - ("07_lang", "Guten Morgen, Commander. Das nächtliche Backup ist um 3 Uhr durchgelaufen, es gab keine Fehler, und die Datenbank läuft mit 92 Prozent Auslastung völlig stabil."), - ("08_sehr_lang","Also, Commander, wenn ich das kurz zusammenfassen darf: heute früh war die Verbindung weg, dann lief das Update durch, danach musste ich zweimal neu starten, und jetzt sind endlich alle Dienste oben, das Gedächtnis ist warm, und wir können ganz entspannt weitermachen."), - ("09_akronyme", "Die CPU der RX 9070 XT und die GPU laufen mit ROCm, sagt der PC über das LAN. Es ist 21 Uhr UTC."), -] - -def render(text): - req = urllib.request.Request(SERVER, data=json.dumps({"text": text}).encode("utf-8"), - headers={"Content-Type": "application/json"}) - return urllib.request.urlopen(req, timeout=180).read() - -w = WhisperModel("small", device="cpu", compute_type="int8") -for name, text in TESTS: - wav = render(text) - path = os.path.join(OUT, name + ".wav"); open(path, "wb").write(wav) - a, sr = sf.read(io.BytesIO(wav)); a = np.asarray(a, dtype=np.float32).reshape(-1); dur = len(a)/sr - segs, _ = w.transcribe(path, language="de", beam_size=5, word_timestamps=True) - words = [x for s in segs for x in (s.words or [])] - got = " ".join(x.word.strip() for x in words) - pauses = [(words[i].word.strip(), words[i+1].start - words[i].end) - for i in range(len(words)-1) if (words[i+1].start - words[i].end) >= 0.25] - print(f"\n### {name} {dur:.1f}s {len(words)} Wörter") - print(f"IST: {got}") - if pauses: - print("PAUSEN>=250ms: " + ", ".join(f'„{ww}\"={gg*1000:.0f}ms' for ww, gg in sorted(pauses, key=lambda t:-t[1])[:6])) - else: - print("PAUSEN>=250ms: KEINE") -print("\n=== FERTIG ===") diff --git a/client/lucy-tts/oute_pc.py b/client/lucy-tts/oute_pc.py deleted file mode 100644 index 7819554..0000000 --- a/client/lucy-tts/oute_pc.py +++ /dev/null @@ -1,45 +0,0 @@ -# -*- coding: utf-8 -*- -import os, time, numpy as np, soundfile as sf, librosa, torch, torchaudio -def _ta_load(p,*a,**k): - x,sr=sf.read(p,dtype="float32"); return torch.from_numpy((x.T if x.ndim>1 else x[None,:]).copy()),sr -def _ta_save(p,t,sample_rate=24000,*a,**k): - sr=k.get("sample_rate",sample_rate); x=t.detach().cpu().numpy() - sf.write(p,(x.T if x.ndim>1 else x.reshape(-1)),int(sr)) -torchaudio.load=_ta_load; torchaudio.save=_ta_save -def _wl(f,sr=16000): - y,_=librosa.load(f,sr=sr,mono=True); return y.astype(np.float32) -try: - import whisper.audio as _wa; _wa.load_audio=_wl - import whisper.transcribe as _wt; _wt.load_audio=_wl -except Exception as e: print("whisper-patch:", e, flush=True) -import outetts - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" -ref = os.path.join(BASE, "ref.wav") -y,_ = librosa.load(os.path.join(BASE,"ref.mp3"), sr=24000, mono=True) -yt,_ = librosa.effects.trim(y, top_db=30) -sf.write(ref, yt[:int(14*24000)], 24000) - -cfg = outetts.ModelConfig( - model_path=os.path.join(BASE,"models","OuteTTS-1.0-1B-Q8_0.gguf"), - tokenizer_path="OuteAI/Llama-OuteTTS-1.0-1B", - interface_version=outetts.InterfaceVersion.V3, - backend=outetts.Backend.LLAMACPP, -) -cfg.n_gpu_layers = 999 -t0=time.time(); iface=outetts.Interface(config=cfg); print(f"[iface] {time.time()-t0:.1f}s", flush=True) -spk=iface.create_speaker(ref); print("[clone ok]", flush=True) - -OUT=os.path.join(BASE,"out"); os.makedirs(OUT,exist_ok=True) -SENT={ - "kurz":"Hallo Commander, ich höre dich.", - "mittel":"Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", - "lang":"Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft.", -} -for name,text in SENT.items(): - for run in ("cold","warm"): - t0=time.time(); out=iface.generate(config=outetts.GenerationConfig(text=text, speaker=spk)); dt=time.time()-t0 - p=os.path.join(OUT,f"{name}.wav"); out.save(p) - x,sr=sf.read(p); secs=len(x)/sr - print(f"[{name:6} {run:4}] gen={dt:5.2f}s audio={secs:5.2f}s RTF={dt/max(secs,0.01):.2f}", flush=True) -print("PC_DONE", flush=True) diff --git a/client/lucy-tts/pocket_server.py b/client/lucy-tts/pocket_server.py deleted file mode 100644 index b3e3bc9..0000000 --- a/client/lucy-tts/pocket_server.py +++ /dev/null @@ -1,471 +0,0 @@ -# -*- coding: utf-8 -*- -"""Lucy-Stimme: Pocket TTS (Kyutai) als lokaler CPU-Dienst. Klont Lucys Saber-Stimme, real-time, kein GPU.""" -import os, io, re, time, threading, logging -import numpy as np, soundfile as sf, librosa -from scipy.signal import butter, sosfilt -from fastapi import FastAPI -from fastapi.responses import Response, JSONResponse, StreamingResponse -from pydantic import BaseModel -from contextlib import asynccontextmanager -from concurrent.futures import ProcessPoolExecutor -from pocket_tts import TTSModel, export_model_state -from text_norm import normalize_numbers, fix_acronyms # Zahlen-Normalisierung + Akronym-Fix für die Stimme - -log = logging.getLogger("lucy-tts"); logging.basicConfig(level=logging.INFO) -BASE = os.path.dirname(os.path.abspath(__file__)) -REF_MP3 = os.path.join(BASE, "ref.mp3") -LANG = os.environ.get("LUCY_LANG", "german_24l") -# Vom User per Ohr getunt (2026-06-28): lsd 10 + noise_clamp 2.5 + ref18 (Sweep-Sieger: sauberes -# 'Commander', Timbre + logische Betonung, wenig Rauschen). temp 0.9 (lebendig). Per Env umschaltbar. -LSD = int(os.environ.get("LUCY_LSD", "16")) # 16 statt 10: glattere Prosodie/Komma-Übergänge (User-A/B 2026-07-01), RTF bleibt <1 -TEMP = float(os.environ.get("LUCY_TEMP", "0.9")) -def _parse_nc(v): # noise_clamp: Zahl, oder None bei "none"/leer/0 - return None if v.strip().lower() in ("", "none", "0") else float(v) -NOISE_CLAMP = _parse_nc(os.environ.get("LUCY_NOISE_CLAMP", "2.5")) # dämpft Artefakte+Rauschen+Kollaps; 3.0 = rauschärmer -FEOS = int(os.environ.get("LUCY_FRAMES_AFTER_EOS", "4")) # kurze Sätze bekamen sonst 0ms Schwanz -TARGET_RMS = float(os.environ.get("LUCY_TARGET_RMS", "0.09")) # User: 0.09 u. 0.06 beide gut -> 0.09 Default -LEAD = os.environ.get("LUCY_LEAD", "Tja. ") # Wegwerf-Lead-Wort -> natürlicher Onset fürs echte 1. Wort -QUANTIZE = os.environ.get("LUCY_QUANTIZE", "1") not in ("0", "false", "False") # int8: ~27% schneller, lt. Doku ohne Qualitätsverlust -PAD_S = float(os.environ.get("LUCY_PAD_S", "0.025")) # Satz-Polster (klein = flüssigere Übergänge bei langen Antworten) -TAIL_DB = int(os.environ.get("LUCY_TAIL_DB", "30")) # Tail-Trim (dB unter Peak): kleiner = mehr Nachlauf-Stille weg = kürzere Satz-Pausen (gemessen: 45 ließ 500-680ms stehen) -MAX_GAP_S = float(os.environ.get("LUCY_MAX_GAP", "0.20")) # interne Sprech-Pausen deckeln: Pockets Komma-Pausen ziehen bis 580ms -> hart auf 200ms kappen (flüssiger) -F0_FLOOR = float(os.environ.get("LUCY_F0_FLOOR", "160")) # Hz: drunter = männlicher Kollaps (Klon~220, male~100) -FP_FLOOR = float(os.environ.get("LUCY_FP_FLOOR", "0.94")) # Fingerabdruck-Ähnlichkeit (ohne MFCC0): drunter = Stimm-Drift (gut 0.956-0.98, drift 0.928) -MAX_TRIES = int(os.environ.get("LUCY_MAX_TRIES", "3")) # max. Versuche gegen Stimm-Anomalien -FP_MIN_S = float(os.environ.get("LUCY_FP_MIN_S", "2.0")) # B3: FP-Drift-Gate erst ab so viel stimmhafter Dauer (kurze Audios = verrauschter Fingerabdruck = Fehlalarm). F0-Gate bleibt immer aktiv. -# A1: Voice-State einmalig nach safetensors exportieren -> Start lädt kvcache statt neu zu klonen. -VOICE_ST = os.environ.get("LUCY_VOICE_ST", os.path.join(BASE, "lucy_voice.safetensors")) -FORCE_RECLONE = os.environ.get("LUCY_FORCE_RECLONE", "0") not in ("0", "false", "False") -# A2: Referenz-Cleaning (pocket reproduziert die Sample-Qualität mit) — Highpass + Peak-Norm, abschaltbar. -REF_CLEAN = os.environ.get("LUCY_REF_CLEAN", "1") not in ("0", "false", "False") -REF_HPF_HZ = float(os.environ.get("LUCY_REF_HPF_HZ", "70")) # Rumpel/Netzbrumm raus -REF_SECONDS = float(os.environ.get("LUCY_REF_SECONDS", "18")) # Klon-Referenzlänge -# B2: parallele Satz-Worker. SWEEP-ERGEBNIS (9700X, german_24l, 30.06.): seriell hat die BESTE -# TTFB (3.6s vs 6–8s Pool) UND RTF 0.74<1 (generiert schneller als Echtzeit -> Streaming spielt -# lückenlos). Daher Default 0 = seriell für Lucys Live-Stimme. Der Pool (>=1) lohnt NUR für -# Batch-/tts (ganze Datei am Stück): Durchsatz-Sweet-Spot 4w×2t (RTF 0.44) bzw. 3w×2t (RTF 0.50). -# Threads pro Worker via LUCY_WORKER_THREADS. -WORKERS = int(os.environ.get("LUCY_WORKERS", "0")) -# TTFB-Opt „kurzer erster Chunk": erster Stream-Chunk bleibt kurz -> Lucy spricht früher. -# MIT B3 (FP-Gate überspringt kurze Audios) GEMESSEN STARK: TTFB 1.31s statt 3.74s (30.06.), -# Wall ~gleich, RTF<1 (lückenlos). Daher Default AN. (Ohne B3 wäre es schlechter -> beides gehört -# zusammen.) Nur Stream-Pfad. -FAST_FIRST = os.environ.get("LUCY_FAST_FIRST", "1") not in ("0", "false", "False") -MIN_LEN = int(os.environ.get("LUCY_MIN_LEN", "55")) # Chunk-Bündelung: größer = weniger Übergänge = flüssiger -# Laufzeit-Regler (POST /tune, OHNE Neustart) -> Prosodie live nach Ohr A/B-testen. -# temp/lsd/noise_clamp sind Modell-Load-Params und NICHT hier drin (die brauchen einen Neustart). -TUNE = {"min_len": MIN_LEN, "pad_s": PAD_S, "fast_first": FAST_FIRST} -# Umlaut-Fix: LLM (Hermes/Qwen) gibt manchmal ASCII-Umlaute aus (ueber/schoen/maerz) -> pocket liest -# „ue" wörtlich. Wir wandeln NUR bekannte Ganzwörter zurück (sicher: „neue/aktuell/Steuer" bleiben). -UMLAUT_FIX = os.environ.get("LUCY_UMLAUT_FIX", "1") not in ("0", "false", "False") -STATE, LOCK = {}, threading.Lock() - -# Bekannte deutsche Umlaut-Wörter (korrekt geschrieben). Die ASCII-Schlüssel (ä->ae, ö->oe, ü->ue, -# ß->ss) werden daraus AUTOMATISCH abgeleitet -> wenig Fehlerquelle. Erweiterbar via LUCY_UMLAUT_EXTRA. -_UML_WORDS = ( - "über überall übrigens übernehmen überzeugt überprüfen für fürs fünf fünfzehn fünfzig müssen " - "müsste müssten können könnt könnte könnten könig königin möchte möchten möchtest möglich " - "möglichst möglichkeit würde würden würdest müde prüfen prüft prüfung zurück natürlich gemütlich " - "grün grüne grüße grüßen drücken dürfen darüber gegenüber dafür wofür hierfür führen führt " - "führung fühlen gefühl gefühle tür türen glück glücklich stück stücke brücke küche kühl " - "kühlschrank früh früher frühstück frühling bücher büro bürger südlich süden schüler schützen " - "wünschen wünsche übung übungen künstler künstlich rücken rückkehr brüder lücke müll gründe " - "gründen begründung vergnügen " - "schön schöne schöner schönste schönheit möbel höher höhe hören gehört gehören größe größer " - "größte öffnen öffnet geöffnet öffentlich öl östlich löschen löffel lösung lösen börse dörfer " - "wörter wörterbuch völlig völker störung stören zwölf böse höflich öfter vögel mögen " - "ähnlich änderung ändern ärger ärgern ärztin äußern äußerst gespräch gespräche hängen länger " - "länge mädchen männer märz nächste nächsten nähe näher qualität universität städte tätigkeit " - "täglich träume träumen väter wäre wären während wärme zähne erklären erklärung verändern " - "gefährlich geschäft geschäfte jährlich käse hände kälte plätze sätze wälder fähig fähigkeit" -).split() - -def _build_umlaut_map(): - words = list(_UML_WORDS) - extra = os.environ.get("LUCY_UMLAUT_EXTRA", "") - words += [w.strip() for w in extra.replace(",", " ").split() if w.strip()] - # gängige Flexionsendungen mitnehmen -> deckt mögliche/möglichen/größeren/schönes... ab. - # Bogus-Formen (z.B. „möchtee") sind harmlos: sie tauchen in echtem Text nie auf. - endings = ("", "e", "en", "er", "es", "em", "n", "s") - m = {} - for w in words: - base = w.lower() - for suf in endings: - wl = base + suf - ascii_w = wl.replace("ä", "ae").replace("ö", "oe").replace("ü", "ue").replace("ß", "ss") - if ascii_w != wl: # nur echte Umlaut-Wörter - m.setdefault(ascii_w, wl) - return m - -_UML_MAP = _build_umlaut_map() -_UML_RX = re.compile(r"\b(" + "|".join(sorted((re.escape(k) for k in _UML_MAP), key=len, reverse=True)) - + r")\b", re.IGNORECASE) if _UML_MAP else None - -def _fix_umlauts(text: str) -> str: - """Wandelt NUR bekannte ASCII-Umlaut-Ganzwörter zurück (ueber->über), case-erhaltend.""" - if not UMLAUT_FIX or not _UML_RX: - return text - def _repl(mo): - s = mo.group(0); u = _UML_MAP[s.lower()] - return u[:1].upper() + u[1:] if s[:1].isupper() else u - return _UML_RX.sub(_repl, text) - -def _prep_ref(): - """A2: Klon-Referenz aufbereiten. pocket-tts reproduziert die Sample-Qualität mit, daher optional - Highpass (Rumpeln/Netzbrumm) + Peak-Normalisierung. Per LUCY_REF_CLEAN=0 abschaltbar (A/B per Ohr).""" - ref = os.path.join(BASE, "ref.wav") - y, _ = librosa.load(REF_MP3, sr=24000, mono=True) - y, _ = librosa.effects.trim(y, top_db=30) - if REF_CLEAN: - sos = butter(4, REF_HPF_HZ, btype="highpass", fs=24000, output="sos") - y = sosfilt(sos, y).astype(np.float32) - # nach dem Highpass nochmal randstille trimmen, dann Peak-Norm gegen zu leise/zu laute Referenz - y, _ = librosa.effects.trim(y, top_db=30) - peak = float(np.max(np.abs(y))) or 1.0 - y = (y * (0.95 / peak)).astype(np.float32) - sf.write(ref, y[: int(REF_SECONDS * 24000)], 24000) - return ref - -def _drop_tail_blip(a: np.ndarray, sr: int) -> np.ndarray: - """Entfernt das End-'taa': isolierter, sehr leiser + kurzer Schwanz-Blip (Modell-Halluzination, - intermittierend bei temp 0.9). Verifiziert: trifft Blip (rms-ratio 0.15), schont echte Kurzwörter - wie 'Fehler' (ratio 0.55). Bedingung ALLE: große Lücke + viel leiser als Sprache + kurz.""" - for _ in range(3): # bis zu 3 Blips hintereinander - iv = librosa.effects.split(a, top_db=35) - if len(iv) < 2: - break - speech_rms = float(np.median([np.sqrt(np.mean(a[s:e] ** 2)) for s, e in iv[:-1]])) - s, e = iv[-1] - last_dur = (e - s) / sr - last_rms = float(np.sqrt(np.mean(a[s:e] ** 2))) - gap = (s - iv[-2][1]) / sr - if gap > 0.35 and last_rms < 0.30 * speech_rms and last_dur < 0.35: - a = a[: iv[-2][1]] - else: - break - return a - -def _crop_lead(a: np.ndarray, sr: int) -> np.ndarray: - """Schneidet das Wegwerf-Lead-Wort weg -> echtes 1. Wort behält seinen vollen, natürlichen Onset - (pocket-tts startet sonst mid-Phonem = 'vorne abgeschnitten'). Schnitt KURZ VOR dem echten Wort - (nicht direkt hinter dem Lead), damit auch die variable, teils lange Pause nach 'Tja.' verschwindet.""" - iv = librosa.effects.split(a, top_db=35) - if len(iv) >= 2: - cut = max(iv[0][1], iv[1][0] - int(0.06 * sr)) # 60ms vor echtem Wort, aber hinter dem Lead - a = a[cut:] - return a - -def _compress_gaps(a: np.ndarray, sr: int, max_gap: float = MAX_GAP_S, top_db: int = 30) -> np.ndarray: - """Deckelt INTERNE Sprech-Pausen (Pockets Komma-Pausen ziehen gemessen bis 580ms) auf max_gap. - Findet stimmhafte Segmente, fügt sie mit gekappter Lücke wieder zusammen -> flüssiger, ohne die - Sprache selbst anzutasten (nur Stille wird gekürzt). Onset-Vorlauf + Schwanz bleiben unberührt.""" - if a.size == 0 or max_gap <= 0: - return a - iv = librosa.effects.split(a, top_db=top_db) - if len(iv) < 2: - return a - cap = int(max_gap * sr) - out = [a[: iv[0][1]]] # Kopf inkl. natürlichem Onset-Vorlauf - for k in range(1, len(iv)): - g0 = iv[k - 1][1] - keep = min(iv[k][0] - g0, cap) - if keep > 0: - out.append(a[g0 : g0 + keep]) # gekappte Pause (Wort-Ausklang bleibt erhalten) - out.append(a[iv[k][0] : iv[k][1]]) # nächstes stimmhaftes Segment - out.append(a[iv[-1][1] :]) # Schwanz (bereits getrimmt) - return np.concatenate(out) - -def cleanup(a: np.ndarray, sr: int) -> np.ndarray: - """v4 (2026-06-28): Onset-Fix + RMS-Lautstärke + Blip-Killer. - - _drop_tail_blip gegen End-'taa' - - _crop_lead entfernt Wegwerf-Lead -> voller Onset vorne (kein Abschneiden mehr) - - nur HINTEN trimmen (vorne unangetastet), RMS-Normalisierung auf TARGET_RMS (statt lautem Peak 0.95) - - 8ms-Fades + 80ms-Atempause vorne+hinten.""" - a = np.asarray(a, dtype=np.float32).reshape(-1) - if a.size == 0: return a - a = _drop_tail_blip(a, sr) - a = _crop_lead(a, sr) - # nur den Schwanz trimmen (vorderen Onset behalten) - rev, _ = librosa.effects.trim(a[::-1], top_db=TAIL_DB) - a = rev[::-1] if rev.size else a - a = _compress_gaps(a, sr) # interne Komma-Pausen deckeln (größter Glättungs-Gewinn bei langen Sätzen) - # RMS-Normalisierung auf Zielpegel (gegen 'zu laut') + Peak-Sicherheits-Clamp - rms = float(np.sqrt(np.mean(a ** 2))) or 1e-9 - a = a * (TARGET_RMS / rms) - peak = float(np.max(np.abs(a))) - if peak > 0.9: a = a * (0.9 / peak) - fi = min(int(0.008 * sr), a.size // 2) # 8ms Fade gegen Klicks - if fi > 0: - a[:fi] *= np.linspace(0.0, 1.0, fi, dtype=np.float32) - a[-fi:] *= np.linspace(1.0, 0.0, fi, dtype=np.float32) - pad = np.zeros(int(TUNE["pad_s"] * sr), dtype=np.float32) # Atempause/Anti-Klick (klein -> flüssiger Satz-Übergang) - return np.concatenate([pad, a, pad]) - -@asynccontextmanager -async def lifespan(app): - t0 = time.time() - ref = _prep_ref() # ref.wav immer erzeugen -> Worker + Fingerabdruck - need_export = FORCE_RECLONE or not os.path.exists(VOICE_ST) or \ - os.path.getmtime(VOICE_ST) < os.path.getmtime(REF_MP3) - if WORKERS >= 1: - # B2-Pool: safetensors einmalig erzeugen (kurz ein Modell), dann RAM freigeben; Worker - # laden ihre eigene Instanz aus dem Cache. Hauptprozess hält danach KEIN Modell. - log.info("Starte Worker-Pool (%d) — pocket-tts %s lsd=%d temp=%.2f nc=%s quantize=%s", - WORKERS, LANG, LSD, TEMP, NOISE_CLAMP, QUANTIZE) - if need_export: - log.info("Erzeuge Voice-Cache %s ...", os.path.basename(VOICE_ST)) - mtmp = TTSModel.load_model(language=LANG, lsd_decode_steps=LSD, temp=TEMP, - noise_clamp=NOISE_CLAMP, quantize=QUANTIZE) - try: - export_model_state(mtmp.get_state_for_audio_prompt(ref), VOICE_ST) - except Exception as e: - log.warning("Voice-Export fehlgeschlagen (Worker klonen selbst): %s", e) - sr0 = mtmp.sample_rate - del mtmp - else: - sr0 = 24000 - ref_audio, _ = librosa.load(ref, sr=sr0, mono=True) - STATE.update(sr=sr0, ref_fp=_fingerprint(ref_audio, sr0)) - pool = ProcessPoolExecutor(max_workers=WORKERS, initializer=_worker_init) - list(pool.map(_warmup, range(WORKERS))) # alle Worker vorab hochfahren - STATE["pool"] = pool - log.info("Worker-Pool bereit (%d Prozesse) in %.1fs", WORKERS, time.time() - t0) - else: - log.info("Seriell — pocket-tts %s lsd=%d temp=%.2f nc=%s quantize=%s", - LANG, LSD, TEMP, NOISE_CLAMP, QUANTIZE) - m = TTSModel.load_model(language=LANG, lsd_decode_steps=LSD, temp=TEMP, - noise_clamp=NOISE_CLAMP, quantize=QUANTIZE) - if need_export: - log.info("Klone Stimme aus Referenz -> Export %s", os.path.basename(VOICE_ST)) - vs = m.get_state_for_audio_prompt(ref) - try: - export_model_state(vs, VOICE_ST); log.info("Voice-State exportiert") - except Exception as e: - log.warning("Voice-Export fehlgeschlagen (nutze Live-Klon): %s", e) - else: - log.info("Lade gecachten Voice-State <- %s", os.path.basename(VOICE_ST)) - try: - vs = m.get_state_for_audio_prompt(VOICE_ST) - except Exception as e: - log.warning("Cache-Load fehlgeschlagen, klone neu: %s", e) - vs = m.get_state_for_audio_prompt(ref) - ref_audio, _ = librosa.load(ref, sr=m.sample_rate, mono=True) - STATE.update(m=m, vs=vs, sr=m.sample_rate, ref_fp=_fingerprint(ref_audio, m.sample_rate)) - log.info("Lucy-Stimme bereit in %.1fs (sr=%d)", time.time() - t0, m.sample_rate) - yield - pool = STATE.get("pool") - if pool is not None: - pool.shutdown(wait=False, cancel_futures=True) - STATE.clear() - -app = FastAPI(title="Lucy TTS (Pocket)", lifespan=lifespan) - -class Req(BaseModel): - text: str - -class PerfIn(BaseModel): - msg: str = "" - -class TuneIn(BaseModel): - min_len: int | None = None # Chunk-Bündelung (größer = flüssiger, langsamere TTFB später) - pad_s: float | None = None # Pause zwischen Stücken (Sekunden) - fast_first: bool | None = None # erster Satz kurz halten (schnelle TTFB) an/aus - -def _ready() -> bool: - return STATE.get("pool") is not None or "m" in STATE - -def _gen_sentences_ordered(sentences): - """Liefert je Satz fertiges float32-Audio IN REIHENFOLGE. Mit Worker-Pool laufen alle Sätze - parallel (bis WORKERS gleichzeitig), werden aber in Eingabereihenfolge ausgegeben -> niedrige - TTFB + korrekte Reihenfolge. Ohne Pool: seriell im Hauptprozess (wie bisher, unter LOCK).""" - pool = STATE.get("pool") - sr = STATE["sr"] - if pool is not None: - for fut in [pool.submit(_worker_gen, s) for s in sentences]: - yield fut.result() - else: - with LOCK: - for s in sentences: - yield cleanup(_gen_gated_core(STATE, s), sr) - -@app.get("/health") -def health(): - return {"status": "ok" if _ready() else "loading", "engine": "pocket-tts", "lang": LANG, - "sr": STATE.get("sr"), "workers": WORKERS, "device": "cpu"} - -@app.post("/perf") -def perf(body: PerfIn): - """Client-Perf-Zeilen in DIESES Terminal loggen (der Nutzer hat den TTS-Log eh offen) -> - „Lucy denkt lange"-Diagnose ohne Browser-DevTools.""" - log.info("[lucy-perf] %s", body.msg) - return {"ok": True} - -@app.get("/tune") -def tune_get(): - """Aktuelle Laufzeit-Regler. temp/lsd/nc stehen separat (Modell-Load, Neustart nötig).""" - return {**TUNE, "note": "temp/lsd/noise_clamp brauchen Neustart (Env LUCY_TEMP/LSD/NOISE_CLAMP)"} - -@app.post("/tune") -def tune_set(body: TuneIn): - """Prosodie live ändern OHNE Neustart -> nächste Äußerung nutzt die neuen Werte.""" - if body.min_len is not None: TUNE["min_len"] = max(1, int(body.min_len)) - if body.pad_s is not None: TUNE["pad_s"] = max(0.0, float(body.pad_s)) - if body.fast_first is not None: TUNE["fast_first"] = bool(body.fast_first) - log.info("[tune] %s", TUNE) - return TUNE - -@app.post("/tts") -def tts(req: Req): - if not _ready(): - return JSONResponse({"error": "loading"}, status_code=503) - t0 = time.time(); sr = STATE["sr"] - parts = list(_gen_sentences_ordered(_split_sentences(fix_acronyms(normalize_numbers(_fix_umlauts(req.text))), min_len=TUNE["min_len"]))) - a = np.concatenate(parts) if parts else np.zeros(0, np.float32) - buf = io.BytesIO(); sf.write(buf, a, sr, format="WAV", subtype="PCM_16"); buf.seek(0) - dur = a.size / sr; gen = time.time() - t0 - log.info("/tts %dZ audio=%.1fs gen=%.1fs rtf=%.2f", len(req.text), dur, gen, gen / max(dur, 0.01)) - return Response(buf.read(), media_type="audio/wav", - headers={"X-Audio-Seconds": f"{dur:.2f}", "X-Gen-Seconds": f"{gen:.2f}"}) - -def _voiced_f0(a: np.ndarray, sr: int) -> float: - """Schnelle Grundfrequenz-Schätzung auf dem längsten stimmhaften Segment (max 0.6s) via yin. - Für das Stimm-Kollaps-Gate: Klon ~220Hz, männlicher Default ~100Hz.""" - a = np.asarray(a, dtype=np.float32).reshape(-1) - iv = librosa.effects.split(a, top_db=35) - if not len(iv): - return float("nan") - s, e = max(iv, key=lambda x: x[1] - x[0]) - seg = a[s:min(e, s + int(0.6 * sr))] - if seg.size < int(0.1 * sr): - return float("nan") - fv = librosa.yin(seg, fmin=80, fmax=400, sr=sr, frame_length=1024) - return float(np.median(fv)) if fv.size else float("nan") - -def _fingerprint(a: np.ndarray, sr: int) -> np.ndarray: - """Stimm-Fingerabdruck (MFCC mean+std über stimmhafte Frames, normiert). Für den Drift-Wächter: - erkennt JEDEN Stimm-Wechsel (auch weiblich->andere weiblich, das der F0-Wächter durchließ).""" - a = np.asarray(a, dtype=np.float32).reshape(-1) - iv = librosa.effects.split(a, top_db=30) - if len(iv): - a = np.concatenate([a[s:e] for s, e in iv]) - if a.size < int(0.2 * sr): - return None - m = librosa.feature.mfcc(y=a, sr=sr, n_mfcc=20)[1:] # MFCC0 (Energie) weglassen -> amplituden-invariant - v = np.concatenate([m.mean(1), m.std(1)]) - return (v / (np.linalg.norm(v) + 1e-9)).astype(np.float32) - -def _gen_gated_core(st: dict, text: str) -> np.ndarray: - """Einen Satz erzeugen mit DOPPEL-Wächter (best-of-N): männlicher Kollaps (F0 neu generieren; am Ende den ref-ähnlichsten, - nicht-männlichen Kandidaten behalten. `st` = Zustand (STATE im Hauptprozess, _W im Worker).""" - best_a, best_score = None, -2.0 - m, vs, sr, ref_fp = st["m"], st["vs"], st["sr"], st.get("ref_fp") - for attempt in range(MAX_TRIES): - audio = m.generate_audio(vs, LEAD + text, frames_after_eos=FEOS) - a = audio.numpy() if hasattr(audio, "numpy") else np.asarray(audio) - a = np.asarray(a, dtype=np.float32).reshape(-1) - f0 = _voiced_f0(a, sr) - male = f0 == f0 and f0 < F0_FLOOR - cropped = _crop_lead(a, sr) # ohne Lead -> vergleichbar mit Referenz - # B3: FP-Drift nur bei genug stimmhafter Dauer prüfen (kurze Audios -> Fingerabdruck unzuverlässig -> Fehlalarm) - iv = librosa.effects.split(cropped, top_db=30) - voiced_s = (sum(int(e - s) for s, e in iv) / sr) if len(iv) else 0.0 - fp = _fingerprint(cropped, sr) if voiced_s >= FP_MIN_S else None - sim = float(np.dot(ref_fp, fp)) if (ref_fp is not None and fp is not None) else 1.0 - score = sim - (1.0 if male else 0.0) # männlich hart abstrafen - if score > best_score: - best_score, best_a = score, a - if not male and sim >= FP_FLOOR: # gut genug -> stop - break - log.warning("Stimm-Anomalie (F0=%.0f male=%s sim=%.3f<%.2f) -> regeneriere (try %d)", - f0, male, sim, FP_FLOOR, attempt + 1) - return best_a - -def _gen_gated(text: str) -> np.ndarray: - """Serieller Hauptprozess-Pfad (nutzt STATE). Wird auch von make_samples.py verwendet.""" - return _gen_gated_core(STATE, text) - -# --- B2: persistenter Worker-Pool (je Prozess eigene Modellinstanz + Voice-State aus A1-Cache) ----- -_W: dict = {} # Per-Prozess-Zustand des Workers - -def _worker_init(): - """Einmal pro Worker-Prozess: Torch-Threads pinnen (gegen Oversubscription), Modell laden, - Voice-State aus dem safetensors-Cache (A1) ziehen (Fallback: live klonen).""" - try: - import torch - torch.set_num_threads(int(os.environ.get("LUCY_WORKER_THREADS", "2"))) - except Exception: - pass - m = TTSModel.load_model(language=LANG, lsd_decode_steps=LSD, temp=TEMP, - noise_clamp=NOISE_CLAMP, quantize=QUANTIZE) - try: - vs = m.get_state_for_audio_prompt(VOICE_ST) - except Exception: - vs = m.get_state_for_audio_prompt(_prep_ref()) - ref_audio, _ = librosa.load(os.path.join(BASE, "ref.wav"), sr=m.sample_rate, mono=True) - _W.update(m=m, vs=vs, sr=m.sample_rate, ref_fp=_fingerprint(ref_audio, m.sample_rate)) - -def _worker_gen(text: str) -> np.ndarray: - """Im Worker: Satz mit Doppel-Wächter erzeugen + cleanup. Rückgabe = fertiges float32-PCM (picklebar).""" - return np.asarray(cleanup(_gen_gated_core(_W, text), _W["sr"]), dtype=np.float32) - -def _warmup(_): - if "m" not in _W: - _worker_init() - return _W["sr"] - -_SENT_RX = re.compile(r".+?(?:[.!?…]+(?:\s|$)|$)", re.S) - -def _split_sentences(text: str, min_len: int = 55, keep_first_short: bool = False) -> list[str]: - """Text in Sätze zerlegen und sehr kurze Teile bündeln. Für satzweise Generierung + - F0-Gate pro Satz -> ein Kollaps in der Mitte langer Antworten erreicht den Nutzer NIE. - keep_first_short=True: der ERSTE Teil bleibt eigenständig (auch wenn kurz) -> schnellste TTFB - im Stream (Lucy fängt früher an zu sprechen), Rest wird normal gebündelt.""" - parts = [m.group(0).strip() for m in _SENT_RX.finditer(text.strip())] - out: list[str] = [] - for p in parts: - if not p: - continue - if not out: - out.append(p) # erster Teil - elif keep_first_short and len(out) == 1: - out.append(p) # zweiter Teil startet frisch -> Index 0 bleibt kurz - elif len(out[-1]) < min_len: - out[-1] = f"{out[-1]} {p}" - else: - out.append(p) - return out or [text.strip()] - -def _to_pcm16(a: np.ndarray, gain: float) -> bytes: - """float -> 16-bit-PCM (LE), mit Gain + Sicherheits-Clip.""" - a = np.asarray(a, dtype=np.float32).reshape(-1) * gain - np.clip(a, -0.95, 0.95, out=a) - return (a * 32767.0).astype(" {OUT}") diff --git a/client/lucy-tts/speed_test.py b/client/lucy-tts/speed_test.py deleted file mode 100644 index 5017ace..0000000 --- a/client/lucy-tts/speed_test.py +++ /dev/null @@ -1,20 +0,0 @@ -import time -from llama_cpp import Llama - -MODEL = r"F:\Coding Stuff\mission-control-2\client\lucy-tts\models\OuteTTS-1.0-1B-Q8_0.gguf" - -t0 = time.time() -llm = Llama(model_path=MODEL, n_gpu_layers=999, n_ctx=8192, verbose=True) -print(f"[load] {time.time()-t0:.1f}s", flush=True) - -prompt = "Guten Tag, mein Name ist" -# warmup -llm(prompt, max_tokens=16, temperature=0.8) -# messen -for i in range(2): - t0 = time.time() - out = llm(prompt, max_tokens=300, temperature=0.8) - dt = time.time() - t0 - n = out["usage"]["completion_tokens"] - print(f"[run {i+1}] {n} tokens in {dt:.2f}s = {n/dt:.1f} tok/s", flush=True) -print("SPEED_DONE", flush=True) diff --git a/client/lucy-tts/stress_de.py b/client/lucy-tts/stress_de.py deleted file mode 100644 index b46c8b8..0000000 --- a/client/lucy-tts/stress_de.py +++ /dev/null @@ -1,47 +0,0 @@ -# -*- coding: utf-8 -*- -"""Deutscher TTS-Stresstest: rendert 10 Sätze (typische DE-Fallen, alle Längen), transkribiert per -Whisper (SOLL vs IST) und misst Pausen/Prosodie. Server muss auf :8134 laufen (pocket_server /tts).""" -import os, io, json, urllib.request -import numpy as np, soundfile as sf, librosa -from faster_whisper import WhisperModel - -SERVER = "http://127.0.0.1:8134/tts" -OUT = r"C:\Users\TobisPC\Desktop\lucy_de_stress"; os.makedirs(OUT, exist_ok=True) - -TESTS = [ - ("01_kurz_umlaut", "kurz", "Schön, dass du da bist, Commander."), - ("02_kurz_zahlen", "kurz", "Es ist 21 Uhr 40, und wir haben noch 16 GB frei."), - ("03_komposita", "mittel", "Die Geschwindigkeitsbegrenzung und die Aufmerksamkeitsspanne sind heute besonders wichtig."), - ("04_ss_sch_ch", "mittel", "Ich weiß nicht, ob die Straße noch frei ist, aber ich schaue gleich mal nach."), - ("05_umlaut_haeufung", "mittel", "Über fünf Türme, größere Bäume und schöne Flüsse führt die Röhre nach Süden."), - ("06_fremdwoerter", "mittel", "Das Backup-Skript läuft im Terminal, der Router ist online und der Server antwortet sofort."), - ("07_lang_gemischt", "lang", "Guten Morgen, Commander. Das nächtliche Backup ist um 3 Uhr durchgelaufen, es gab keine Fehler, und die Datenbank läuft mit 92 Prozent Auslastung völlig stabil."), - ("08_sehr_lang", "sehr lang", "Also, Commander, wenn ich das kurz zusammenfassen darf: heute früh war die Verbindung weg, dann lief das Update durch, danach musste ich zweimal neu starten, und jetzt sind endlich alle Dienste oben, das Gedächtnis ist warm, und wir können ganz entspannt weitermachen."), - ("09_akronyme", "mittel", "Die CPU der RX 9070 XT und die GPU laufen mit ROCm, sagt der PC über das LAN."), - ("10_zungenbrecher", "kurz", "Der Frühstücksfleischklößchenlieferant frühstückt fröhlich am frühen Freitag."), -] - -def render(text): - req = urllib.request.Request(SERVER, data=json.dumps({"text": text}).encode("utf-8"), - headers={"Content-Type": "application/json"}) - return urllib.request.urlopen(req, timeout=180).read() - -w = WhisperModel("small", device="cpu", compute_type="int8") -for name, length, text in TESTS: - wav = render(text) - path = os.path.join(OUT, name + ".wav") - open(path, "wb").write(wav) - a, sr = sf.read(io.BytesIO(wav)); a = np.asarray(a, dtype=np.float32).reshape(-1); dur = len(a) / sr - segs, _ = w.transcribe(path, language="de", beam_size=5, word_timestamps=True) - words = [x for s in segs for x in (s.words or [])] - got = " ".join(x.word.strip() for x in words) - pauses = [(words[i].word.strip(), words[i + 1].start - words[i].end) - for i in range(len(words) - 1) if (words[i + 1].start - words[i].end) >= 0.25] - f0 = librosa.yin(a, fmin=80, fmax=400, sr=sr, frame_length=1024); f0v = f0[(f0 > 90) & (f0 < 380)] - med = np.median(f0v) if f0v.size else 0; rng = (np.percentile(f0v, 90) - np.percentile(f0v, 10)) if f0v.size else 0 - print(f"\n### {name} [{length}] {dur:.1f}s Tempo {len(words)/max(dur,.01):.1f}W/s F0 {med:.0f}Hz/Spanne {rng:.0f}") - print(f"SOLL: {text}") - print(f"IST : {got}") - if pauses: - print("PAUSEN: " + ", ".join(f'„{ww}"={gg*1000:.0f}ms' for ww, gg in sorted(pauses, key=lambda t: -t[1])[:6])) -print("\n=== STRESSTEST FERTIG ===") diff --git a/client/lucy-tts/sweep_b2.py b/client/lucy-tts/sweep_b2.py deleted file mode 100644 index 6bcaef0..0000000 --- a/client/lucy-tts/sweep_b2.py +++ /dev/null @@ -1,105 +0,0 @@ -# -*- coding: utf-8 -*- -"""sweep_b2.py — findet den B2-Sweet-Spot auf DIESER Maschine (Ryzen 9700X, 8C/16T). -Variiert WORKERS × THREADS-pro-Worker und misst je Konfig auf einer langen, mehrsätzigen Antwort: - - wall : Gesamt-Wall-Clock (Generierung der ganzen Antwort) - - ttfb : Time-to-first-audio (Reaktionszeit = erster Satz fertig) - - audio : erzeugte Audiolänge (variiert leicht, da temp>0 stochastisch) - - RTF : wall/audio (längen-normalisiert -> fairer Durchsatz-Vergleich; <1 = schneller als Echtzeit) -Nutzt die ECHTEN pocket_server-Funktionen (_worker_init/_warmup/_gen_sentences_ordered). -Schreibt sweep_b2_result.json + eine Tabelle und nennt am Ende den Sweet Spot. -""" -import os, time, json, statistics as st -import numpy as np, librosa -from concurrent.futures import ProcessPoolExecutor -from pocket_tts import TTSModel -import pocket_server as ps - -BASE = ps.BASE -LONG = ("Guten Morgen, Commander. " - "Das nächtliche Backup ist sauber durchgelaufen und es gab keine Fehler. " - "Der Dienst läuft stabil und die Engine antwortet zügig. " - "Ich habe die Modelle vorgewärmt und die Latenz im Blick behalten. " - "Die Protokolle zeigen keine Auffälligkeiten in den letzten Stunden. " - "Wenn du möchtest, fasse ich die offenen Punkte für heute zusammen. " - "Danach kümmere ich mich um die anstehenden Updates und melde mich wieder.") - -# (workers, threads_pro_worker). Ziel: workers*threads ~ 6–8 (8 physische Kerne). -CONFIGS = [("seriell", 0, 0), ("pool", 2, 4), ("pool", 2, 3), - ("pool", 3, 2), ("pool", 3, 3), ("pool", 4, 2)] -REPS = 3 - - -def _measure(sents): - """Eine Durchführung: (wall, ttfb, audio_s) über den aktuell in STATE gesetzten Pfad.""" - t0 = time.time(); first = None; total = 0 - for i, a in enumerate(ps._gen_sentences_ordered(sents)): - if i == 0: - first = time.time() - t0 - total += a.size - return time.time() - t0, first, total / 24000.0 - - -def run_serial(reps): - m = TTSModel.load_model(language=ps.LANG, lsd_decode_steps=ps.LSD, temp=ps.TEMP, - noise_clamp=ps.NOISE_CLAMP, quantize=ps.QUANTIZE) - ref = ps._prep_ref() - try: - vs = m.get_state_for_audio_prompt(ps.VOICE_ST) - except Exception: - vs = m.get_state_for_audio_prompt(ref) - ra, _ = librosa.load(ref, sr=m.sample_rate, mono=True) - ps.STATE.clear() - ps.STATE.update(m=m, vs=vs, sr=m.sample_rate, ref_fp=ps._fingerprint(ra, m.sample_rate)) - sents = ps._split_sentences(LONG) - rows = [_measure(sents) for _ in range(reps)] - ps.STATE.clear(); del m - return rows, len(sents) - - -def run_pool(workers, threads, reps): - os.environ["LUCY_WORKER_THREADS"] = str(threads) # vom Worker beim Spawn gelesen - pool = ProcessPoolExecutor(max_workers=workers, initializer=ps._worker_init) - list(pool.map(ps._warmup, range(workers))) - ref = ps._prep_ref(); ra, _ = librosa.load(ref, sr=24000, mono=True) - ps.STATE.clear() - ps.STATE.update(sr=24000, ref_fp=ps._fingerprint(ra, 24000), pool=pool) - sents = ps._split_sentences(LONG) - rows = [_measure(sents) for _ in range(reps)] - pool.shutdown(wait=True); ps.STATE.clear() - return rows, len(sents) - - -if __name__ == "__main__": - results = [] - print(f"Text: {len(LONG)} Zeichen, REPS={REPS}\n") - print(f"{'config':>14} | {'wall':>6} {'ttfb':>6} {'audio':>6} {'RTF':>5}") - print("-" * 48) - for kind, w, t in CONFIGS: - try: - rows, nsent = (run_serial(REPS) if kind == "seriell" else run_pool(w, t, REPS)) - except Exception as e: - print(f"{kind} w{w} t{t}: FEHLER {e}") - continue - wall = st.median([r[0] for r in rows]) - ttfb = st.median([r[1] for r in rows]) - audio = st.median([r[2] for r in rows]) - rtf = wall / max(audio, 0.01) - label = "seriell(1×all)" if kind == "seriell" else f"{w}w×{t}t" - print(f"{label:>14} | {wall:6.2f} {ttfb:6.2f} {audio:6.2f} {rtf:5.2f}") - results.append(dict(label=label, kind=kind, workers=(1 if kind == "seriell" else w), - threads=t, wall=wall, ttfb=ttfb, audio=audio, rtf=rtf, sents=nsent)) - - json.dump(results, open(os.path.join(BASE, "sweep_b2_result.json"), "w"), indent=2) - - pool_rows = [r for r in results if r["kind"] == "pool"] - if pool_rows: - best_tput = min(pool_rows, key=lambda r: r["rtf"]) - best_ttfb = min(pool_rows, key=lambda r: r["ttfb"]) - # Sweet Spot: bester Durchsatz, aber TTFB nicht >20% über dem TTFB-Sieger (Reaktion zählt) - cand = [r for r in pool_rows if r["ttfb"] <= best_ttfb["ttfb"] * 1.20] - sweet = min(cand, key=lambda r: r["rtf"]) if cand else best_tput - print("\n>> bester Durchsatz :", best_tput["label"], f"(RTF {best_tput['rtf']:.2f})") - print(">> beste Reaktion :", best_ttfb["label"], f"(TTFB {best_ttfb['ttfb']:.2f}s)") - print(">> SWEET SPOT :", sweet["label"], - f"-> LUCY_WORKERS={sweet['workers']} LUCY_WORKER_THREADS={sweet['threads']}") - print("SWEEP_DONE") diff --git a/client/lucy-tts/sweep_quality.py b/client/lucy-tts/sweep_quality.py deleted file mode 100644 index d046428..0000000 --- a/client/lucy-tts/sweep_quality.py +++ /dev/null @@ -1,53 +0,0 @@ -# -*- coding: utf-8 -*- -"""Qualitäts-Sweep: noise_clamp (nie getestet, Hypothese: dämpft Artefakte+Kollaps) × lsd, temp 0.9. -Produktions-äquivalente Verarbeitung (LEAD + cleanup v4 wie der Server) -> faires A/B gegen lucy_final.""" -import os, time, numpy as np, soundfile as sf, librosa -from pocket_tts import TTSModel - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" -OUT = r"C:\Users\TobisPC\Desktop\lucy_quality_sweep"; os.makedirs(OUT, exist_ok=True) -src, _ = librosa.load(os.path.join(BASE, "ref.mp3"), sr=24000, mono=True) -srt, _ = librosa.effects.trim(src, top_db=30); ref = os.path.join(BASE, "ref.wav") -sf.write(ref, srt[:int(18*24000)], 24000) -LEAD, TARGET_RMS = "Tja. ", 0.09 -SENT = {"kurz":"Hallo Commander, ich höre dich.", - "mittel":"Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", - "lang":"Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft."} - -def crop_lead(a, sr): - iv = librosa.effects.split(a, top_db=35) - if len(iv) >= 2: - cut = max(iv[0][1], iv[1][0] - int(0.06*sr)); a = a[cut:] - return a -def cleanup(a, sr): - a = np.asarray(a, dtype=np.float32).reshape(-1) - if a.size == 0: return a - a = crop_lead(a, sr) - rev,_ = librosa.effects.trim(a[::-1], top_db=45); a = rev[::-1] if rev.size else a - rms = float(np.sqrt(np.mean(a**2))) or 1e-9; a = a*(TARGET_RMS/rms) - peak = float(np.max(np.abs(a))) - if peak > 0.9: a = a*(0.9/peak) - fi = min(int(0.008*sr), a.size//2) - if fi>0: a[:fi]*=np.linspace(0.,1.,fi,dtype=np.float32); a[-fi:]*=np.linspace(1.,0.,fi,dtype=np.float32) - pad = np.zeros(int(0.08*sr), dtype=np.float32) - return np.concatenate([pad, a, pad]) - -# (tag, lsd, noise_clamp) -COMBOS = [ - ("A_baseline_lsd6_ncNone", 6, None), - ("B_lsd6_nc2", 6, 2.0), - ("C_lsd6_nc3", 6, 3.0), - ("D_lsd10_nc3", 10, 3.0), -] -for tag, lsd, nc in COMBOS: - t0 = time.time() - m = TTSModel.load_model(language="german_24l", lsd_decode_steps=lsd, temp=0.9, noise_clamp=nc) - vs = m.get_state_for_audio_prompt(ref); sr = m.sample_rate - print(f"== {tag} (load {time.time()-t0:.1f}s) ==", flush=True) - for name, text in SENT.items(): - t0 = time.time(); a = m.generate_audio(vs, LEAD+text, frames_after_eos=4); dt = time.time()-t0 - a = a.numpy() if hasattr(a,"numpy") else np.asarray(a) - a = cleanup(a, sr); secs = a.size/sr - sf.write(os.path.join(OUT, f"{tag}_{name}.wav"), a, sr) - print(f" [{name:6}] gen={dt:4.1f}s audio={secs:4.1f}s RTF={dt/max(secs,0.01):.2f}", flush=True) -print("SWEEP_DONE", flush=True) diff --git a/client/lucy-tts/sweep_quality2.py b/client/lucy-tts/sweep_quality2.py deleted file mode 100644 index f757a61..0000000 --- a/client/lucy-tts/sweep_quality2.py +++ /dev/null @@ -1,45 +0,0 @@ -# -*- coding: utf-8 -*- -"""Sweep 2 (Feinschliff): lsd 10 (glättet Rauschen) × noise_clamp 2/2.5/3, temp 0.9. -Ziel: sauberes 'Commander' (nicht erzwungen, = niedrigeres nc) + wenig Rauschen (= höheres lsd).""" -import os, time, numpy as np, soundfile as sf, librosa -from pocket_tts import TTSModel - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" -OUT = r"C:\Users\TobisPC\Desktop\lucy_sweep2"; os.makedirs(OUT, exist_ok=True) -src, _ = librosa.load(os.path.join(BASE, "ref.mp3"), sr=24000, mono=True) -srt, _ = librosa.effects.trim(src, top_db=30); ref = os.path.join(BASE, "ref.wav") -sf.write(ref, srt[:int(18*24000)], 24000) -LEAD, TARGET_RMS = "Tja. ", 0.09 -SENT = {"kurz":"Hallo Commander, ich höre dich.", - "mittel":"Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", - "lang":"Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft."} - -def crop_lead(a, sr): - iv = librosa.effects.split(a, top_db=35) - if len(iv) >= 2: a = a[max(iv[0][1], iv[1][0]-int(0.06*sr)):] - return a -def cleanup(a, sr): - a = np.asarray(a, dtype=np.float32).reshape(-1) - if a.size == 0: return a - a = crop_lead(a, sr) - rev,_ = librosa.effects.trim(a[::-1], top_db=45); a = rev[::-1] if rev.size else a - rms = float(np.sqrt(np.mean(a**2))) or 1e-9; a = a*(TARGET_RMS/rms) - peak = float(np.max(np.abs(a))) - if peak > 0.9: a = a*(0.9/peak) - fi = min(int(0.008*sr), a.size//2) - if fi>0: a[:fi]*=np.linspace(0.,1.,fi,dtype=np.float32); a[-fi:]*=np.linspace(1.,0.,fi,dtype=np.float32) - return np.concatenate([np.zeros(int(0.08*sr),dtype=np.float32), a, np.zeros(int(0.08*sr),dtype=np.float32)]) - -for nc in [2.0, 2.5, 3.0]: - tag = f"lsd10_nc{str(nc).replace('.','p')}" - t0 = time.time() - m = TTSModel.load_model(language="german_24l", lsd_decode_steps=10, temp=0.9, noise_clamp=nc) - vs = m.get_state_for_audio_prompt(ref); sr = m.sample_rate - print(f"== {tag} (load {time.time()-t0:.1f}s) ==", flush=True) - for name, text in SENT.items(): - t0 = time.time(); a = m.generate_audio(vs, LEAD+text, frames_after_eos=4); dt = time.time()-t0 - a = a.numpy() if hasattr(a,"numpy") else np.asarray(a) - a = cleanup(a, sr); secs = a.size/sr - sf.write(os.path.join(OUT, f"{tag}_{name}.wav"), a, sr) - print(f" [{name:6}] gen={dt:4.1f}s audio={secs:4.1f}s RTF={dt/max(secs,0.01):.2f}", flush=True) -print("SWEEP2_DONE", flush=True) diff --git a/client/lucy-tts/test_text_norm.py b/client/lucy-tts/test_text_norm.py deleted file mode 100644 index 9db52f6..0000000 --- a/client/lucy-tts/test_text_norm.py +++ /dev/null @@ -1,28 +0,0 @@ -"""Prüft normalize_numbers: Einheiten/Uhrzeiten/Dezimalzahlen verbalisieren, Modellnummern schützen.""" -from text_norm import normalize_numbers as N - -def check(name, text, must_have=(), must_not=()): - out = N(text) - ok = all(h in out for h in must_have) and all(x not in out for x in must_not) - print(f"{'PASS' if ok else 'FAIL'} {name}: \"{text}\" -> \"{out}\"") - return ok - -allok = True -allok &= check("Uhrzeit", "Es ist 18:01 Uhr.", must_have=["achtzehn Uhr", "eins"], must_not=[":", "18:"]) -allok &= check("Uhrzeit :00", "Um 18:00.", must_have=["achtzehn Uhr"], must_not=[":"]) -allok &= check("Uhrzeit HH:MM", "Treffen um 9:30 Uhr.", must_have=["neun Uhr", "dreißig"], must_not=[":"]) -allok &= check("Einheit GB verbalisiert", "Sie hat 16 GB Speicher.", must_have=["sechzehn GB"], must_not=[" 16 "]) -allok &= check("Einheit TB + GB", "8 TB und 32 GB RAM.", must_have=["acht TB", "zweiunddreißig GB", "RAM"]) -allok &= check("Dezimal verbalisiert", "Läuft mit 4.5 GHz.", must_have=["vier Komma", "fünf", "GHz"], must_not=["4.5"]) -allok &= check("Modellnummer geschützt", "Die RX 9070 XT ist schnell.", must_have=["9070", "XT"], must_not=["neuntausend"]) -allok &= check("Version geschützt", "Qwen3.6 nutzt Version 2.", must_have=["Qwen3.6", "zwei"], must_not=["Qwen3.sechs"]) -allok &= check("Modell H100 geschützt", "Das braucht eine H100.", must_have=["H100"]) -allok &= check("Zahl im Text", "Ich habe 5 Äpfel.", must_have=["fünf", "Äpfel"], must_not=[" 5 "]) -allok &= check("Prozent", "Das sind 50 Prozent.", must_have=["fünfzig Prozent"]) -allok &= check("Grad", "Es sind 25 Grad.", must_have=["fünfundzwanzig Grad"]) -allok &= check("Jahr", "Im Jahr 2026.", must_have=["zweitausend"], must_not=["2026"]) -allok &= check("Datum-Ordinal", "Am 3. Januar.", must_have=["Januar"], must_not=["3. Januar", " 3 "]) -allok &= check("große ID roh", "Fehler 123456.", must_have=["123456"]) - -print("\nALLE TESTS GRÜN" if allok else "\nES GAB FEHLER") -raise SystemExit(0 if allok else 1) diff --git a/client/lucy-tts/text_norm.py b/client/lucy-tts/text_norm.py deleted file mode 100644 index 6795630..0000000 --- a/client/lucy-tts/text_norm.py +++ /dev/null @@ -1,120 +0,0 @@ -"""Deutsche Zahlen-/Uhrzeit-Normalisierung für Lucys Stimme (num2words). - -Eigenständig (nur re + num2words, KEIN torch/pocket_tts-Import), damit schnell testbar und von -pocket_server importierbar. - -Kernidee: Zahlen im Fließtext verbalisieren ("18:01" -> "achtzehn Uhr eins", "16 GB" -> "sechzehn -GB", "4.5" -> "vier Komma fünf"), aber Modell-/Versionsnummern SCHÜTZEN ("RX 9070 XT", "Qwen3.6", -"H100" bleiben roh — die soll man nicht als Kardinalzahl lesen). Abschaltbar via LUCY_NUM_NORM=0. -""" -import os -import re - -try: - from num2words import num2words as _n2w -except Exception: # Lib fehlt -> No-op (Stimme läuft trotzdem) - _n2w = None - -# AUS per Default (2026-07-01, empirisch via Whisper-Rücktranskription verifiziert): Pocket german_24l -# spricht ROHE Ziffern ("21 Uhr 40", "16 GB", "4.5 GHz", "9:30") sauber. Vorverbalisierte deutsche -# Kompositzahlen ("einundzwanzig") ZERBRICHT das Modell zu Kauderwelsch ("ein Mund", "ein Aus-20"). -# Also NICHT verbalisieren. Mit LUCY_NUM_NORM=1 wieder anschaltbar (falls je ein Modell es braucht). -NUM_NORM = os.environ.get("LUCY_NUM_NORM", "0") not in ("0", "false", "False") - -_MONTHS = "Januar Februar März April Mai Juni Juli August September Oktober November Dezember".split() -_MONTH_RX = "|".join(_MONTHS) -# FULLY-uppercase 2+-Einheiten, neben denen Zahlen VERBALISIERT werden (sechzehn GB) — im Gegensatz -# zu Modell-Akronymen (RX/XT/RTX), wo die Ziffern roh bleiben (RX 9070 XT). Gemischt-Case-Einheiten -# (GHz/MHz/kg/km/Grad/Prozent) werden von der Akronym-Regel eh nicht erfasst -> dort wird ohnehin verbalisiert. -_CAPS_UNITS = {"GB", "TB", "MB", "KB", "PB", "EB", "KW", "MW"} - - -# Garble-Kandidaten (Whisper-verifiziert): Pocket german_24l kann diese Akronyme/Codes NICHT sauber -# sprechen ("ROCm"->"AOC HM", "UTC"->Kauderwelsch) -> Ersatz durch gesprochene/buchstabierte Form. -# Erweiterbar via LUCY_ACRONYM_EXTRA="ABC=A B C,XYZ=..." (neue Fälle findet transcribe.py). -_ACRONYM_FIX = { - "ROCm": "Rockem", "UTC": "U T C", "GMT": "G M T", - "CEST": "C E S T", "CET": "C E T", "MESZ": "M E S Z", "MEZ": "M E Z", - "NVMe": "N V M E", "PCIe": "P C I E", -} - -def _build_acr(): - m = dict(_ACRONYM_FIX) - for pair in os.environ.get("LUCY_ACRONYM_EXTRA", "").split(","): - if "=" in pair: - k, v = pair.split("=", 1) - if k.strip(): - m[k.strip()] = v.strip() - return m - -_ACR_MAP = _build_acr() -_ACR_RX = re.compile(r"\b(" + "|".join(re.escape(k) for k in sorted(_ACR_MAP, key=len, reverse=True)) + r")\b") if _ACR_MAP else None - -ACR_ON = os.environ.get("LUCY_ACRONYM", "1") not in ("0", "false", "False") # A/B-Abschaltung - -def fix_acronyms(text: str) -> str: - """Garble-anfällige Akronyme durch gesprochene Form ersetzen (ROCm -> Rockem, UTC -> U T C).""" - return _ACR_RX.sub(lambda m: _ACR_MAP[m.group(0)], text) if (_ACR_RX and ACR_ON) else text - - -def _card(v) -> str: - try: - return _n2w(int(v), lang="de") - except Exception: - return str(v) - - -def normalize_numbers(text: str) -> str: - if not NUM_NORM or _n2w is None: - return text - - masks: list[str] = [] - def _mask(s: str) -> str: - masks.append(s) - return f"\x00{len(masks) - 1}\x00" - - # 1) Uhrzeiten: "18:01 Uhr"/"18:01" -> "18 Uhr 01", "18:00" -> "18 Uhr" (Ziffern verbalisiert Schritt 6) - text = re.sub(r"\b(\d{1,2}):00(\s*Uhr)?\b", r"\1 Uhr", text) - text = re.sub(r"\b(\d{1,2}):(\d{2})\s*Uhr\b", r"\1 Uhr \2", text) - text = re.sub(r"\b(\d{1,2}):(\d{2})\b", r"\1 Uhr \2", text) - - # 2) Datums-Ordinalzahlen: "3. Januar" -> "dritter Januar" - def _ord(m): - try: - return f"{_n2w(int(m.group(1)), to='ordinal', lang='de')} {m.group(2)}" - except Exception: - return m.group(0) - text = re.sub(rf"\b(\d{{1,2}})\.\s+({_MONTH_RX})\b", _ord, text) - - # 3) Modell-/Versions-Token (Buchstabe UND Ziffer, evtl. mit Punkten: Qwen3.6, H100, v2.1, RTX4090) - # -> ganzes Token maskieren (nie verbalisieren). Satz-Endpunkt/-Komma bleibt draußen. - def _mask_model(m): - tok = m.group(0); trail = "" - while tok and tok[-1] in ".,": - trail = tok[-1] + trail; tok = tok[:-1] - if re.search(r"[A-Za-zÄÖÜäöü]", tok) and re.search(r"\d", tok): - return _mask(tok) + trail - return m.group(0) - text = re.sub(r"[A-Za-zÄÖÜäöü0-9]+(?:[.,][A-Za-zÄÖÜäöü0-9]+)*", _mask_model, text) - - # 4) Standalone-Dezimalzahl (nur Ziffern, kein Buchstabe): "4.5" -> "vier Komma fünf" - # (Nachkommastellen ziffernweise, wie im Deutschen üblich). - def _dec(m): - return f"{_card(m.group(1))} Komma {' '.join(_card(d) for d in m.group(2))}" - text = re.sub(r"(? verbalisieren; Modell-Akronym (RX/XT) -> roh maskieren. - def _by_ctx(num, acr): - return num if acr.upper() in _CAPS_UNITS else _mask(num) - text = re.sub(r"\b([A-ZÄÖÜ]{2,})\s+(\d{1,6})\b", lambda m: f"{m.group(1)} {_by_ctx(m.group(2), m.group(1))}", text) - text = re.sub(r"\b(\d{1,6})\s+([A-ZÄÖÜ]{2,})\b", lambda m: f"{_by_ctx(m.group(1), m.group(2))} {m.group(2)}", text) - - # 6) verbleibende reine Ganzzahlen (0..9999) verbalisieren; größere roh lassen (IDs/Codes) - def _c(m): - v = int(m.group(0)) - return _n2w(v, lang="de") if v <= 9999 else m.group(0) - text = re.sub(r"(? 1 else r"C:\Users\TobisPC\Desktop\lucy_pocket_tune" -w = WhisperModel("small", device="cpu", compute_type="int8") -for p in sorted(glob.glob(os.path.join(DIR, "*.wav"))): - a, sr = sf.read(p) - seg, _ = w.transcribe(p, language="de", beam_size=5) - txt = " ".join(s.text for s in seg).strip() - print(f"[{os.path.basename(p)}] ({len(a)/sr:.1f}s)") - print(f" HÖRT WHISPER: {txt}\n") diff --git a/client/lucy-tts/ttfb_test.py b/client/lucy-tts/ttfb_test.py deleted file mode 100644 index ff2910d..0000000 --- a/client/lucy-tts/ttfb_test.py +++ /dev/null @@ -1,50 +0,0 @@ -# -*- coding: utf-8 -*- -"""ttfb_test.py — misst die Stream-TTFB im SERIELLEN Pfad mit kurzem erstem Chunk an/aus. -Ein Modell-Load, dann je Modus 3 Durchläufe -> Median. Belegt, ob keep_first_short Lucys -Sprechbeginn beschleunigt, ohne den Rest zu verschlechtern. -""" -import time, statistics as st -import numpy as np, librosa -from pocket_tts import TTSModel -import pocket_server as ps - -LONG = ("Guten Morgen, Commander. " - "Das nächtliche Backup ist sauber durchgelaufen und es gab keine Fehler. " - "Der Dienst läuft stabil und die Engine antwortet zügig. " - "Ich habe die Modelle vorgewärmt und die Latenz im Blick behalten. " - "Die Protokolle zeigen keine Auffälligkeiten in den letzten Stunden. " - "Wenn du möchtest, fasse ich die offenen Punkte für heute zusammen. " - "Danach kümmere ich mich um die anstehenden Updates und melde mich wieder.") - -m = TTSModel.load_model(language=ps.LANG, lsd_decode_steps=ps.LSD, temp=ps.TEMP, - noise_clamp=ps.NOISE_CLAMP, quantize=ps.QUANTIZE) -ref = ps._prep_ref() -try: - vs = m.get_state_for_audio_prompt(ps.VOICE_ST) -except Exception: - vs = m.get_state_for_audio_prompt(ref) -ra, _ = librosa.load(ref, sr=m.sample_rate, mono=True) -ps.STATE.clear() -ps.STATE.update(m=m, vs=vs, sr=m.sample_rate, ref_fp=ps._fingerprint(ra, m.sample_rate)) - - -def measure(keep_first): - sents = ps._split_sentences(LONG, keep_first_short=keep_first) - t0 = time.time(); first = None; total = 0 - for i, a in enumerate(ps._gen_sentences_ordered(sents)): - if i == 0: - first = time.time() - t0 - total += a.size - return first, time.time() - t0, total / 24000.0, len(sents), sents[0] - - -if __name__ == "__main__": - for keep in (False, True): - ttfbs, walls = [], [] - n = s0 = None - for _ in range(3): - f, w, au, n, s0 = measure(keep) - ttfbs.append(f); walls.append(w) - print(f"keep_first_short={str(keep):5} | TTFB={st.median(ttfbs):4.2f}s wall={st.median(walls):5.2f}s " - f"chunks={n} erster='{s0[:38]}'") - print("TTFB_DONE") diff --git a/client/lucy-tts/tune_front_loud.py b/client/lucy-tts/tune_front_loud.py deleted file mode 100644 index 0f5f92b..0000000 --- a/client/lucy-tts/tune_front_loud.py +++ /dev/null @@ -1,79 +0,0 @@ -# -*- coding: utf-8 -*- -"""Fix: (1) 'vorne abgeschnitten' = Modell startet mid-Phonem -> Lead-Wort voranstellen, -in flow generieren, dann in der STILLE-LÜCKE davor schneiden (voller Onset bleibt). -(2) 'zu laut' = RMS-Normalisierung auf Zielpegel statt Peak 0.95.""" -import os, numpy as np, soundfile as sf, librosa -from pocket_tts import TTSModel -from faster_whisper import WhisperModel - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" -OUT = r"C:\Users\TobisPC\Desktop\lucy_front_loud"; os.makedirs(OUT, exist_ok=True) -src, _ = librosa.load(os.path.join(BASE, "ref.mp3"), sr=24000, mono=True) -srt, _ = librosa.effects.trim(src, top_db=30); ref = os.path.join(BASE, "ref.wav") -sf.write(ref, srt[:int(18*24000)], 24000) - -SENT = { - "kurz": "Hallo Commander, ich höre dich.", - "lang": "Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft.", -} -LEAD = "Tja. " # Wegwerf-Lead -> erzeugt natürlichen Onset fürs echte erste Wort - -def drop_tail_blip(a, sr): - for _ in range(3): - iv = librosa.effects.split(a, top_db=35) - if len(iv) < 2: break - srms = float(np.median([np.sqrt(np.mean(a[s:e]**2)) for s,e in iv[:-1]])) - s,e = iv[-1]; dur=(e-s)/sr; rms=float(np.sqrt(np.mean(a[s:e]**2))); gap=(s-iv[-2][1])/sr - if gap>0.35 and rms<0.30*srms and dur<0.35: a = a[:iv[-2][1]] - else: break - return a - -def crop_lead(a, sr): - """Schneide in der Lücke NACH dem Lead-Wort -> echtes 1. Wort voll erhalten.""" - iv = librosa.effects.split(a, top_db=35) - if len(iv) >= 2: - # Ende des 1. (Lead-)Segments + kleiner Sicherheitsabstand in die Lücke - cut = iv[0][1] + int(0.03*sr) - nxt = iv[1][0] - cut = min(cut, max(iv[0][1], nxt - int(0.04*sr))) # mind. 40ms Stille vor echtem Wort lassen - a = a[cut:] - return a - -def finalize(a, sr, target_rms, peak_cap=0.9, front_trim=False): - a = np.asarray(a, dtype=np.float32).reshape(-1) - if front_trim: - yt,_ = librosa.effects.trim(a, top_db=45); a = yt if yt.size else a - else: - # nur HINTEN trimmen (vorne unangetastet lassen) - rev,_ = librosa.effects.trim(a[::-1], top_db=45); a = rev[::-1] if rev.size else a - # RMS-Normalisierung auf Zielpegel - rms = float(np.sqrt(np.mean(a**2))) or 1e-9 - a = a * (target_rms / rms) - peak = float(np.max(np.abs(a))) - if peak > peak_cap: a = a * (peak_cap / peak) # Sicherheits-Clamp - fi = min(int(0.008*sr), a.size//2) - if fi>0: - a[:fi]*=np.linspace(0.,1.,fi,dtype=np.float32); a[-fi:]*=np.linspace(1.,0.,fi,dtype=np.float32) - pad = np.zeros(int(0.08*sr), dtype=np.float32) - return np.concatenate([pad, a, pad]) - -m = TTSModel.load_model(language="german_24l", lsd_decode_steps=6, temp=0.9) -vs = m.get_state_for_audio_prompt(ref); sr = m.sample_rate -w = WhisperModel("small", device="cpu", compute_type="int8") - -for name, text in SENT.items(): - # Onset-Fix-Roh: mit Lead generieren, Tail-Blip weg, Lead wegschneiden - raw = m.generate_audio(vs, LEAD + text, frames_after_eos=4) - raw = raw.numpy() if hasattr(raw,"numpy") else np.asarray(raw) - raw = np.asarray(raw, dtype=np.float32).reshape(-1) - raw = drop_tail_blip(raw, sr) - cropped = crop_lead(raw, sr) - for tr in [0.12, 0.09, 0.06]: - out = finalize(cropped, sr, tr, front_trim=False) - sf.write(os.path.join(OUT, f"{name}_onset_rms{int(tr*100):02d}.wav"), out, sr) - # Whisper-Check: Output darf NICHT mit Lead beginnen - sf.write(os.path.join(OUT, f"_chk_{name}.wav"), finalize(cropped, sr, 0.09), sr) - seg,_ = w.transcribe(os.path.join(OUT, f"_chk_{name}.wav"), language="de", beam_size=5) - txt = " ".join(s.text for s in seg).strip() - print(f"[{name}] Whisper-Start: {txt[:55]!r}", flush=True) -print("FRONT_LOUD_DONE", flush=True) diff --git a/client/lucy-tts/tune_lsd.py b/client/lucy-tts/tune_lsd.py deleted file mode 100644 index 0307ce7..0000000 --- a/client/lucy-tts/tune_lsd.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- -import os, time, glob, numpy as np, soundfile as sf, librosa -from pocket_tts import TTSModel - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" -OUT = os.path.join(BASE, "out_tune"); os.makedirs(OUT, exist_ok=True) -y, _ = librosa.load(os.path.join(BASE, "ref.mp3"), sr=24000, mono=True) -yt, _ = librosa.effects.trim(y, top_db=30); ref = os.path.join(BASE, "ref.wav") -sf.write(ref, yt[:int(18*24000)], 24000) - -SENT = { - "kurz": "Hallo Commander, ich höre dich.", - "mittel":"Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", - "lang": "Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft.", -} -def light_trim(a, sr): - a = np.asarray(a, dtype=np.float32).reshape(-1) - yt, _ = librosa.effects.trim(a, top_db=30) - return yt if yt.size else a - -for lsd in [2, 4, 8]: - t0 = time.time() - m = TTSModel.load_model(language="german_24l", lsd_decode_steps=lsd) - vs = m.get_state_for_audio_prompt(ref) - print(f"== lsd={lsd} (load {time.time()-t0:.1f}s) ==", flush=True) - for name, text in SENT.items(): - t0 = time.time(); audio = m.generate_audio(vs, text); dt = time.time()-t0 - a = audio.numpy() if hasattr(audio, "numpy") else np.asarray(audio) - a = light_trim(a, m.sample_rate) - secs = a.size / m.sample_rate - sf.write(os.path.join(OUT, f"lsd{lsd}_{name}.wav"), a, m.sample_rate) - print(f" [{name:6}] gen={dt:5.2f}s audio={secs:5.2f}s RTF={dt/max(secs,0.01):.2f}", flush=True) -print("TUNE_DONE", flush=True) diff --git a/client/lucy-tts/tune_lsd_v2.py b/client/lucy-tts/tune_lsd_v2.py deleted file mode 100644 index 7538954..0000000 --- a/client/lucy-tts/tune_lsd_v2.py +++ /dev/null @@ -1,56 +0,0 @@ -# -*- coding: utf-8 -*- -"""Sweep v2: lsd 4/5/6 + FIX gegen Vorne/Hinten-Abschneiden & Clipping. -- peak-normalize auf 0.95 (killt PCM-16-Clipping/Distortion; roh war peak bis 1.56) -- KEIN aggressiver Front-Trim mehr (Modell startet bei 0ms Stille -> Trim fraß 1. Phonem) -- nur tiefe Stille sanft trimmen (top_db=45), dann feste 90ms-Pause vorne+hinten (Atem) -- frames_after_eos=4 (kurze Sätze bekamen sonst 0ms Schwanz = abgeschnitten) -""" -import os, time, numpy as np, soundfile as sf, librosa -from pocket_tts import TTSModel - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" -OUT = r"C:\Users\TobisPC\Desktop\lucy_lsd_v2"; os.makedirs(OUT, exist_ok=True) -y, _ = librosa.load(os.path.join(BASE, "ref.mp3"), sr=24000, mono=True) -yt, _ = librosa.effects.trim(y, top_db=30); ref = os.path.join(BASE, "ref.wav") -sf.write(ref, yt[:int(18*24000)], 24000) - -SENT = { - "kurz": "Hallo Commander, ich höre dich.", - "mittel":"Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", - "lang": "Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft.", -} - -def cleanup_v2(a, sr): - a = np.asarray(a, dtype=np.float32).reshape(-1) - if a.size == 0: return a - # 1) Peak-Normalisierung gegen Clipping/Distortion - peak = float(np.max(np.abs(a))) - if peak > 0: a = a * (0.95 / peak) - # 2) nur TIEFE Stille sanft wegtrimmen (top_db=45 = wenig aggressiv, lässt weiche Onsets) - yt, _ = librosa.effects.trim(a, top_db=45) - a = yt if yt.size else a - # 3) kurze 10ms-Fades an den echten Audiokanten (gegen Klicks) - fi = min(int(0.01 * sr), a.size // 2) - if fi > 0: - a[:fi] *= np.linspace(0.0, 1.0, fi, dtype=np.float32) - a[-fi:] *= np.linspace(1.0, 0.0, fi, dtype=np.float32) - # 4) feste 90ms Atem-Pause vorne+hinten (kein abruptes Einsetzen/Abschneiden) - pad = np.zeros(int(0.09 * sr), dtype=np.float32) - return np.concatenate([pad, a, pad]) - -for lsd in [4, 5, 6]: - t0 = time.time() - m = TTSModel.load_model(language="german_24l", lsd_decode_steps=lsd) - vs = m.get_state_for_audio_prompt(ref) - sr = m.sample_rate - print(f"== lsd={lsd} (load {time.time()-t0:.1f}s) ==", flush=True) - for name, text in SENT.items(): - t0 = time.time() - audio = m.generate_audio(vs, text, frames_after_eos=4) - dt = time.time() - t0 - a = audio.numpy() if hasattr(audio, "numpy") else np.asarray(audio) - a = cleanup_v2(a, sr) - secs = a.size / sr - sf.write(os.path.join(OUT, f"lsd{lsd}_{name}.wav"), a, sr) - print(f" [{name:6}] gen={dt:5.2f}s audio={secs:5.2f}s RTF={dt/max(secs,0.01):.2f} peak={np.abs(a).max():.3f}", flush=True) -print("TUNE_V2_DONE", flush=True) diff --git a/client/lucy-tts/tune_natural.py b/client/lucy-tts/tune_natural.py deleted file mode 100644 index b3b5c39..0000000 --- a/client/lucy-tts/tune_natural.py +++ /dev/null @@ -1,61 +0,0 @@ -# -*- coding: utf-8 -*- -"""Naturalness-Sweep gegen 'Roboter/abgehackt': temperature, lsd hoch, + 2 Referenz-Fenster. -Wörter sind laut Whisper alle da -> Problem ist Prosodie/Timbre, nicht Content.""" -import os, time, numpy as np, soundfile as sf, librosa -from pocket_tts import TTSModel - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" -OUT = r"C:\Users\TobisPC\Desktop\lucy_natural"; os.makedirs(OUT, exist_ok=True) - -# Zwei Referenz-Fenster aus der EL-Saber-MP3 -src, _ = librosa.load(os.path.join(BASE, "ref.mp3"), sr=24000, mono=True) -srt, _ = librosa.effects.trim(src, top_db=30) -ref18 = os.path.join(BASE, "ref.wav") # aktuell: erste 18s -sf.write(ref18, srt[:int(18*24000)], 24000) -refC = os.path.join(BASE, "ref_C.wav") # XTTS-Liebling: Sek 18..27 (9s) -segC = src[int(18*24000):int(27*24000)] -segCt, _ = librosa.effects.trim(segC, top_db=30) -sf.write(refC, segCt, 24000) - -SENT = { - "kurz": "Hallo Commander, ich höre dich.", - "mittel":"Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", -} - -def cleanup_v2(a, sr): - a = np.asarray(a, dtype=np.float32).reshape(-1) - if a.size == 0: return a - peak = float(np.max(np.abs(a))) - if peak > 0: a = a * (0.95 / peak) - yt, _ = librosa.effects.trim(a, top_db=45); a = yt if yt.size else a - fi = min(int(0.01*sr), a.size//2) - if fi > 0: - a[:fi] *= np.linspace(0.,1.,fi,dtype=np.float32) - a[-fi:] *= np.linspace(1.,0.,fi,dtype=np.float32) - pad = np.zeros(int(0.09*sr), dtype=np.float32) - return np.concatenate([pad, a, pad]) - -# (tag, lsd, temp, ref) -COMBOS = [ - ("A_lsd6_t070_ref18", 6, 0.70, ref18), - ("B_lsd6_t090_ref18", 6, 0.90, ref18), - ("C_lsd6_t105_ref18", 6, 1.05, ref18), - ("D_lsd8_t090_ref18", 8, 0.90, ref18), - ("E_lsd12_t090_ref18",12, 0.90, ref18), - ("F_lsd6_t090_refC", 6, 0.90, refC), -] - -for tag, lsd, temp, ref in COMBOS: - t0 = time.time() - m = TTSModel.load_model(language="german_24l", lsd_decode_steps=lsd, temp=temp) - vs = m.get_state_for_audio_prompt(ref) - sr = m.sample_rate - print(f"== {tag} (load {time.time()-t0:.1f}s) ==", flush=True) - for name, text in SENT.items(): - t0 = time.time() - audio = m.generate_audio(vs, text, frames_after_eos=4); dt = time.time()-t0 - a = audio.numpy() if hasattr(audio,"numpy") else np.asarray(audio) - a = cleanup_v2(a, sr); secs = a.size/sr - sf.write(os.path.join(OUT, f"{tag}_{name}.wav"), a, sr) - print(f" [{name:6}] gen={dt:5.2f}s audio={secs:5.2f}s RTF={dt/max(secs,0.01):.2f}", flush=True) -print("NATURAL_DONE", flush=True) diff --git a/client/lucy-tts/tune_tailfix.py b/client/lucy-tts/tune_tailfix.py deleted file mode 100644 index 62f8a3e..0000000 --- a/client/lucy-tts/tune_tailfix.py +++ /dev/null @@ -1,63 +0,0 @@ -# -*- coding: utf-8 -*- -"""Tail-Blip-Killer gegen das End-'taa' (isolierter, leiser Hall nach großer Lücke). -Verifiziert auf kurz/mittel/lang @ lsd6/t0.9: Blip weg, echte Endungen unangetastet.""" -import os, numpy as np, soundfile as sf, librosa -from pocket_tts import TTSModel - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" -OUT = r"C:\Users\TobisPC\Desktop\lucy_tailfix"; os.makedirs(OUT, exist_ok=True) -src, _ = librosa.load(os.path.join(BASE, "ref.mp3"), sr=24000, mono=True) -srt, _ = librosa.effects.trim(src, top_db=30); ref = os.path.join(BASE, "ref.wav") -sf.write(ref, srt[:int(18*24000)], 24000) - -SENT = { - "kurz": "Hallo Commander, ich höre dich.", - "mittel":"Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", - "lang": "Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft.", -} - -def drop_tail_blip(a, sr): - """Entferne isolierten, leisen/kurzen Schwanz-Blip (Modell-Halluzination).""" - for _ in range(3): # bis zu 3 Blips hintereinander - iv = librosa.effects.split(a, top_db=35) - if len(iv) < 2: - break - speech_rms = float(np.median([np.sqrt(np.mean(a[s:e]**2)) for s, e in iv[:-1]])) - s, e = iv[-1] - last_dur = (e - s) / sr - last_rms = float(np.sqrt(np.mean(a[s:e]**2))) - gap = (s - iv[-2][1]) / sr - # isoliert (große Lücke) UND (kurz ODER deutlich leiser als Sprache) -> Halluzination - if gap > 0.30 and (last_dur < 0.30 or last_rms < 0.45 * speech_rms): - a = a[: iv[-2][1]] - else: - break - return a - -def cleanup_v3(a, sr): - a = np.asarray(a, dtype=np.float32).reshape(-1) - if a.size == 0: return a - a = drop_tail_blip(a, sr) # NEU: End-'taa' weg - peak = float(np.max(np.abs(a))) - if peak > 0: a = a * (0.95 / peak) - yt, _ = librosa.effects.trim(a, top_db=45); a = yt if yt.size else a - fi = min(int(0.01*sr), a.size//2) - if fi > 0: - a[:fi] *= np.linspace(0.,1.,fi,dtype=np.float32); a[-fi:] *= np.linspace(1.,0.,fi,dtype=np.float32) - pad = np.zeros(int(0.09*sr), dtype=np.float32) - return np.concatenate([pad, a, pad]) - -m = TTSModel.load_model(language="german_24l", lsd_decode_steps=6, temp=0.9) -vs = m.get_state_for_audio_prompt(ref); sr = m.sample_rate -for name, text in SENT.items(): - raw = m.generate_audio(vs, text, frames_after_eos=4) - raw = raw.numpy() if hasattr(raw,"numpy") else np.asarray(raw) - raw = np.asarray(raw, dtype=np.float32).reshape(-1) - fixed = cleanup_v3(raw, sr) - sf.write(os.path.join(OUT, f"t090_{name}.wav"), fixed, sr) - # Verifikations-Log: letzte Segmente vorher/nachher - iv0 = librosa.effects.split(raw, top_db=35) - print(f"[{name:6}] raw_dur={raw.size/sr:.2f}s -> fixed_dur={fixed.size/sr:.2f}s raw_segmente={len(iv0)}", flush=True) - if len(iv0): - s,e = iv0[-1]; print(f" raw letztes Segment: {s/sr:.2f}..{e/sr:.2f}s rms={np.sqrt(np.mean(raw[s:e]**2)):.3f}", flush=True) -print("TAILFIX_DONE", flush=True) diff --git a/client/lucy-tts/tune_temp_final.py b/client/lucy-tts/tune_temp_final.py deleted file mode 100644 index 0adf580..0000000 --- a/client/lucy-tts/tune_temp_final.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -"""Letzter Schliff: lsd6 + ref18, temp 0.70 vs 0.90 auf ALLEN Längen (inkl. lang).""" -import os, time, numpy as np, soundfile as sf, librosa -from pocket_tts import TTSModel - -BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" -OUT = r"C:\Users\TobisPC\Desktop\lucy_temp_final"; os.makedirs(OUT, exist_ok=True) -src, _ = librosa.load(os.path.join(BASE, "ref.mp3"), sr=24000, mono=True) -srt, _ = librosa.effects.trim(src, top_db=30); ref = os.path.join(BASE, "ref.wav") -sf.write(ref, srt[:int(18*24000)], 24000) - -SENT = { - "kurz": "Hallo Commander, ich höre dich.", - "mittel":"Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", - "lang": "Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft.", -} -def cleanup_v2(a, sr): - a = np.asarray(a, dtype=np.float32).reshape(-1) - if a.size == 0: return a - peak = float(np.max(np.abs(a))) - if peak > 0: a = a*(0.95/peak) - yt,_ = librosa.effects.trim(a, top_db=45); a = yt if yt.size else a - fi = min(int(0.01*sr), a.size//2) - if fi>0: - a[:fi]*=np.linspace(0.,1.,fi,dtype=np.float32); a[-fi:]*=np.linspace(1.,0.,fi,dtype=np.float32) - pad = np.zeros(int(0.09*sr),dtype=np.float32) - return np.concatenate([pad,a,pad]) - -for temp in [0.70, 0.90]: - m = TTSModel.load_model(language="german_24l", lsd_decode_steps=6, temp=temp) - vs = m.get_state_for_audio_prompt(ref); sr = m.sample_rate - tag = f"t{int(temp*100):03d}" - print(f"== temp={temp} ==", flush=True) - for name, text in SENT.items(): - a = m.generate_audio(vs, text, frames_after_eos=4) - a = a.numpy() if hasattr(a,"numpy") else np.asarray(a) - a = cleanup_v2(a, sr) - sf.write(os.path.join(OUT, f"{tag}_{name}.wav"), a, sr) - print(f" {name}", flush=True) -print("TEMP_FINAL_DONE", flush=True) diff --git a/client/lucy-tts/umlaut_test.py b/client/lucy-tts/umlaut_test.py deleted file mode 100644 index 1a82a61..0000000 --- a/client/lucy-tts/umlaut_test.py +++ /dev/null @@ -1,49 +0,0 @@ -# -*- coding: utf-8 -*- -"""umlaut_test.py — prüft den Umlaut-Normalizer. -A) Logik: bekannte ASCII-Umlaut-Wörter -> Umlaut, normale Wörter (neue/aktuell/Steuer) UNVERÄNDERT. -B) Audio: erzeugt vorher (roh ASCII) vs nachher (mit Fix) auf den Desktop zum Reinhören. -""" -import os, time -import numpy as np, soundfile as sf, librosa -import pocket_server as ps - -DESK = os.path.join(os.path.expanduser("~"), "Desktop", "lucy_samples") -os.makedirs(DESK, exist_ok=True) - -# --- A) Logik --- -POS = {"ueber": "über", "Schoen": "Schön", "fuer": "für", "maerz": "März", - "natuerlich": "natürlich", "Groesse": "Größe", "moeglich": "möglich", "muessen": "müssen"} -NEG = ["neue", "aktuell", "Steuer", "Quelle", "Feuer", "treue", "Museum", "Dauer", "heute", - "Frauen", "genau", "blaue"] -ok = True -for a, exp in POS.items(): - got = ps._fix_umlauts(a); good = got == exp; ok &= good - print(f"[pos] {a!r:14}-> {got!r:14} erwartet {exp!r:12} {'OK' if good else 'FAIL'}") -for w in NEG: - got = ps._fix_umlauts(w); good = got == w; ok &= good - print(f"[neg] {w!r:14}-> {got!r:14} {'OK (unverändert)' if good else 'FAIL: GEÄNDERT!'}") -S = "Ueber fuenf moegliche Gespraeche, natuerlich auch die Groesse." -print("SENT roh :", S) -print("SENT fix :", ps._fix_umlauts(S)) -print("LOGIC_OK" if ok else "LOGIC_FAIL") - -# --- B) Audio vorher/nachher --- -from pocket_tts import TTSModel -m = TTSModel.load_model(language=ps.LANG, lsd_decode_steps=ps.LSD, temp=ps.TEMP, - noise_clamp=ps.NOISE_CLAMP, quantize=ps.QUANTIZE) -ref = ps._prep_ref() -try: - vs = m.get_state_for_audio_prompt(ps.VOICE_ST) -except Exception: - vs = m.get_state_for_audio_prompt(ref) -ra, _ = librosa.load(ref, sr=m.sample_rate, mono=True) -ps.STATE.clear() -ps.STATE.update(m=m, vs=vs, sr=m.sample_rate, ref_fp=ps._fingerprint(ra, m.sample_rate)) - -def gen(text): - return ps.cleanup(ps._gen_gated(text), m.sample_rate) - -sf.write(os.path.join(DESK, "umlaut_vorher.wav"), gen(S), m.sample_rate) # roh ASCII (falsch) -sf.write(os.path.join(DESK, "umlaut_nachher.wav"), gen(ps._fix_umlauts(S)), m.sample_rate) # mit Fix -print("Samples: umlaut_vorher.wav (roh) + umlaut_nachher.wav (fix) ->", DESK) -print("UMLAUT_DONE") diff --git a/client/lucy-tts/verify_clip.py b/client/lucy-tts/verify_clip.py deleted file mode 100644 index b4b78e5..0000000 --- a/client/lucy-tts/verify_clip.py +++ /dev/null @@ -1,28 +0,0 @@ -# -*- coding: utf-8 -*- -"""Verify: fehlen WÖRTER (Content-Cut) oder ist es nur gefühltes abruptes Einsetzen? -Whisper-Rücktranskription der v2-Samples + Energie am 1./letzten Audio-Sample.""" -import os, numpy as np, soundfile as sf -from faster_whisper import WhisperModel - -DIR = r"C:\Users\TobisPC\Desktop\lucy_lsd_v2" -EXPECT = { - "kurz": "Hallo Commander, ich höre dich.", - "mittel":"Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", - "lang": "Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft.", -} -w = WhisperModel("small", device="cpu", compute_type="int8") -for lsd in [5, 6]: - print(f"=== lsd {lsd} ===") - for name in ["kurz", "mittel", "lang"]: - p = os.path.join(DIR, f"lsd{lsd}_{name}.wav") - a, sr = sf.read(p) - a = np.asarray(a, dtype=np.float32).reshape(-1) - # Energie der ersten/letzten 100ms NICHT-Pad (überspringe 90ms Pad) - pad = int(0.09*sr) - core = a[pad:-pad] if a.size > 2*pad else a - seg, _ = w.transcribe(p, language="de", beam_size=5) - txt = " ".join(s.text for s in seg).strip() - print(f"[{name:6}] EXPECT: {EXPECT[name]}") - print(f" GOT : {txt}") - print(f" dur={a.size/sr:.2f}s core_start_amp={np.abs(core[:5]).max():.3f} core_end_amp={np.abs(core[-5:]).max():.3f}") -print("VERIFY_DONE") From 9822af764041e6cb84b9ff26846548a1ef515ab5 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 2 Jul 2026 15:53:37 +0200 Subject: [PATCH 38/38] Hermes-Update-Playbook: doctor im Job, Config-Drift-Scan + Tool-/Voice-Smoke im Postcheck, LLM-Release-Notes im Modal MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Update-Job: nach 'hermes update' laeuft 'hermes doctor' (Job rot bei Fehlern) - hermes-postcheck.sh: Journal-Scan auf Unknown/deprecated/defaulting (Lehre aus v0.18: approvals.mode 'auto' wurde still ungueltig -> alle Tools in pending_approval), Tool-Smoke (echo via Agent, erkennt pending_approval), Voice-Smoke (/api/voice/chat) - Update-Modal: die Box fasst anstehende Hermes-Commits selbst zusammen (fast-Modell, no-think, gecacht auf neuesten Hash) — Breaking Changes zuerst Co-Authored-By: Claude Fable 5 --- backend/services/maintenance.py | 46 ++++++++++++++++++- deploy/hermes-postcheck.sh | 38 +++++++++++++++ ...View-BqZ4z-El.js => GraphView-CeSgzZFi.js} | 2 +- .../{index-B-6TT-6s.js => index-DvUiHM4g.js} | 4 +- frontend/dist/index.html | 2 +- .../components/system/UpdateDetailModal.tsx | 6 +++ frontend/src/lib/api.ts | 2 + 7 files changed, 94 insertions(+), 6 deletions(-) rename frontend/dist/assets/{GraphView-BqZ4z-El.js => GraphView-CeSgzZFi.js} (99%) rename frontend/dist/assets/{index-B-6TT-6s.js => index-DvUiHM4g.js} (96%) diff --git a/backend/services/maintenance.py b/backend/services/maintenance.py index ef4c379..cce73c1 100644 --- a/backend/services/maintenance.py +++ b/backend/services/maintenance.py @@ -359,8 +359,44 @@ def swap_update_details() -> dict: return info +# LLM-Zusammenfassung der anstehenden Hermes-Commits (die Box liest ihre Release-Notes selbst). +# Gecacht auf den neuesten Commit-Hash — das Modal darf beliebig oft geöffnet werden. +_relnotes_cache: dict = {"key": "", "summary": ""} + + +def _summarize_hermes_commits(commits: list[dict]) -> str: + key = commits[0]["hash"] if commits else "" + if not key: + return "" + if _relnotes_cache["key"] == key and _relnotes_cache["summary"]: + return _relnotes_cache["summary"] + from config import LLAMA_SWAP_URL + subjects = "\n".join(f"- {c['subject']}" for c in commits[:100]) + prompt = ( + "Du bist der Update-Berater einer lokalen AI-Box (Hermes-Agent auf Strix Halo; genutzt werden: " + "api_server/Gateway, memory-provider-Plugin 'mc2-memory', terminal-/web-Tools, approvals, cron). " + "Hier die Commit-Titel des anstehenden Hermes-Updates:\n\n" + subjects + "\n\n" + "Fasse auf DEUTSCH in maximal 6 Stichpunkten zusammen: (1) Breaking Changes oder geänderte/" + "entfernte Config-Schlüssel (WICHTIGSTES zuerst, explizit warnen), (2) was unser Setup betrifft, " + "(3) welche neuen Features sich für uns lohnen. Keine Einleitung, nur die Punkte." + ) + try: + r = httpx.post(f"{LLAMA_SWAP_URL}/v1/chat/completions", timeout=90.0, json={ + "model": "fast", "max_tokens": 380, "temperature": 0.2, + "chat_template_kwargs": {"enable_thinking": False}, + "messages": [{"role": "user", "content": prompt}], + }) + r.raise_for_status() + summary = ((r.json().get("choices") or [{}])[0].get("message", {}).get("content") or "").strip() + if summary: + _relnotes_cache.update(key=key, summary=summary) + return summary + except Exception as exc: # noqa: BLE001 — Zusammenfassung ist Komfort, nie Blocker + return f"(Zusammenfassung nicht verfügbar: {exc})" + + def hermes_update_details() -> dict: - """Commits, die ein Hermes-Update einspielen würde (HEAD..origin/).""" + """Commits, die ein Hermes-Update einspielen würde (HEAD..origin/) + LLM-Zusammenfassung.""" info: dict = {"kind": "hermes", "branch": None, "behind": 0, "commits": []} git = system.find_hermes_agent_git() if not git or not git.get("path"): @@ -382,6 +418,8 @@ def hermes_update_details() -> dict: commits.append({"hash": parts[0], "subject": parts[1], "when": parts[2]}) info["commits"] = commits info["behind"] = len(commits) + if commits: + info["summary"] = _summarize_hermes_commits(commits) except Exception as exc: # noqa: BLE001 info["error"] = str(exc) return info @@ -549,10 +587,14 @@ def hermes_update_job() -> dict: backup = os.path.join(_REPO_ROOT, "deploy", "backup.sh") postcheck = os.path.join(_REPO_ROOT, "deploy", "hermes-postcheck.sh") # Backup → update → Gateway-Neustart → Gehirn-Check (Job wird rot, wenn Mem0/Plugin kaputt). + # Backup → update → doctor (Config/Deps-Diagnose der NEUEN Version) → Gateway-Neustart → + # Gehirn-Check (erweitert um Config-Drift-Scan, Tool- und Voice-Smoke — Lehre aus v0.18: + # 'approvals.mode auto' wurde still ungültig und legte alle Tools in pending_approval). cmd = (f"bash {backup} || true; " f"cd {path} && {py} -m hermes_cli.main update --yes " + f"&& {py} -m hermes_cli.main doctor " f"&& systemctl --user restart hermes-gateway " - f"&& sleep 4 && bash {postcheck}") + f"&& sleep 6 && bash {postcheck}") def on_done(): _comp_cache.update(ts=0.0, data=[]) # Update-Status neu berechnen lassen diff --git a/deploy/hermes-postcheck.sh b/deploy/hermes-postcheck.sh index 634e2a0..a112aaf 100644 --- a/deploy/hermes-postcheck.sh +++ b/deploy/hermes-postcheck.sh @@ -38,6 +38,44 @@ else echo "FAIL · mc2-memory-Plugin lädt nicht (MemoryProvider-ABC geändert?)"; fail=1 fi +# --- Config-Drift-Wächter (Lehre aus v0.18, 02.07.2026): Hermes fällt bei unbekannten --- +# --- Config-Werten STILL auf Defaults zurück (approvals.mode 'auto' -> manual -> alle --- +# --- Tools hingen in pending_approval). Solche Warnungen müssen den Job ROT machen. --- +if journalctl --user -u hermes-gateway --since "-3 minutes" --no-pager -o cat 2>/dev/null \ + | grep -iE "Unknown [a-z._]+ '|deprecated .*(setting|option|config)|defaulting to|invalid config" \ + | grep -v "check_fn" | head -5 | tee /tmp/hermes-config-warnings.txt | grep -q .; then + echo "FAIL · Config-Warnungen nach Update (siehe oben) — Config an neue Version anpassen!"; fail=1 +else + echo "PASS · keine Config-Drift-Warnungen im Gateway-Log" +fi + +# --- Tool-Smoke: ein harmloser terminal-Befehl durch den echten Agenten. Fängt kaputte --- +# --- Approval-/Tool-Ketten (Antwort muss kommen und darf nicht in pending_approval hängen). --- +API_KEY="$(grep -E '^API_SERVER_KEY=' "$HERMES/.env" 2>/dev/null | cut -d= -f2- | tr -d '"' | tr -d "'")" +if [ -n "$API_KEY" ]; then + TOOL_RESP=$(curl -sf -m 90 -X POST "http://127.0.0.1:8642/v1/chat/completions" \ + -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \ + -H "X-Hermes-Session-Id: postcheck-tool-smoke" \ + -d '{"model":"hermes","stream":false,"messages":[{"role":"user","content":"Führe im Terminal exakt den Befehl echo postcheck-ok aus und gib mir nur dessen Ausgabe zurück."}]}' 2>/dev/null) + if echo "$TOOL_RESP" | grep -qi "postcheck-ok"; then + echo "PASS · Tool-Smoke (terminal via Agent) liefert Ergebnis" + elif echo "$TOOL_RESP" | grep -qi "pending_approval"; then + echo "FAIL · Tool-Smoke hängt in pending_approval (approvals.mode prüfen!)"; fail=1 + else + echo "FAIL · Tool-Smoke ohne verwertbares Ergebnis: $(echo "$TOOL_RESP" | head -c 200)"; fail=1 + fi +else + echo "SKIP · Tool-Smoke (kein API_SERVER_KEY in $HERMES/.env gefunden)" +fi + +# --- Voice-Smoke: Lucys Sprech-Pfad antwortet zügig (first byte des SSE-Streams). --- +if curl -sf -m 30 -N -X POST "$MC_URL/api/voice/chat" -H "Content-Type: application/json" \ + -d '{"text":"Sag nur ok.","session_id":"postcheck-voice-smoke"}' 2>/dev/null | head -c 50 | grep -q "data:"; then + echo "PASS · Voice-Smoke (Lucys /api/voice/chat streamt)" +else + echo "FAIL · Voice-Smoke: /api/voice/chat streamt nicht"; fail=1 +fi + if [ "$fail" -eq 0 ]; then echo "=== GEHIRN OK ✓ ===" else diff --git a/frontend/dist/assets/GraphView-BqZ4z-El.js b/frontend/dist/assets/GraphView-CeSgzZFi.js similarity index 99% rename from frontend/dist/assets/GraphView-BqZ4z-El.js rename to frontend/dist/assets/GraphView-CeSgzZFi.js index 052ade9..a040c05 100644 --- a/frontend/dist/assets/GraphView-BqZ4z-El.js +++ b/frontend/dist/assets/GraphView-CeSgzZFi.js @@ -1,4 +1,4 @@ -import{g as bi,r as ce,j as H,R as rr,S as nr,a as Ut,T as ar}from"./index-B-6TT-6s.js";var et={exports:{}},zt;function or(){if(zt)return et.exports;zt=1;var n=typeof Reflect=="object"?Reflect:null,i=n&&typeof n.apply=="function"?n.apply:function(b,R,A){return Function.prototype.apply.call(b,R,A)},t;n&&typeof n.ownKeys=="function"?t=n.ownKeys:Object.getOwnPropertySymbols?t=function(b){return Object.getOwnPropertyNames(b).concat(Object.getOwnPropertySymbols(b))}:t=function(b){return Object.getOwnPropertyNames(b)};function e(p){console&&console.warn&&console.warn(p)}var r=Number.isNaN||function(b){return b!==b};function a(){a.init.call(this)}et.exports=a,et.exports.once=D,a.EventEmitter=a,a.prototype._events=void 0,a.prototype._eventsCount=0,a.prototype._maxListeners=void 0;var o=10;function s(p){if(typeof p!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof p)}Object.defineProperty(a,"defaultMaxListeners",{enumerable:!0,get:function(){return o},set:function(p){if(typeof p!="number"||p<0||r(p))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+p+".");o=p}}),a.init=function(){(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)&&(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},a.prototype.setMaxListeners=function(b){if(typeof b!="number"||b<0||r(b))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+b+".");return this._maxListeners=b,this};function u(p){return p._maxListeners===void 0?a.defaultMaxListeners:p._maxListeners}a.prototype.getMaxListeners=function(){return u(this)},a.prototype.emit=function(b){for(var R=[],A=1;A0&&(P=R[0]),P instanceof Error)throw P;var V=new Error("Unhandled error."+(P?" ("+P.message+")":""));throw V.context=P,V}var z=F[b];if(z===void 0)return!1;if(typeof z=="function")i(z,this,R);else for(var g=z.length,K=y(z,g),A=0;A0&&P.length>G&&!P.warned){P.warned=!0;var V=new Error("Possible EventEmitter memory leak detected. "+P.length+" "+String(b)+" listeners added. Use emitter.setMaxListeners() to increase limit");V.name="MaxListenersExceededWarning",V.emitter=p,V.type=b,V.count=P.length,e(V)}return p}a.prototype.addListener=function(b,R){return h(this,b,R,!1)},a.prototype.on=a.prototype.addListener,a.prototype.prependListener=function(b,R){return h(this,b,R,!0)};function d(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function l(p,b,R){var A={fired:!1,wrapFn:void 0,target:p,type:b,listener:R},G=d.bind(A);return G.listener=R,A.wrapFn=G,G}a.prototype.once=function(b,R){return s(R),this.on(b,l(this,b,R)),this},a.prototype.prependOnceListener=function(b,R){return s(R),this.prependListener(b,l(this,b,R)),this},a.prototype.removeListener=function(b,R){var A,G,F,P,V;if(s(R),G=this._events,G===void 0)return this;if(A=G[b],A===void 0)return this;if(A===R||A.listener===R)--this._eventsCount===0?this._events=Object.create(null):(delete G[b],G.removeListener&&this.emit("removeListener",b,A.listener||R));else if(typeof A!="function"){for(F=-1,P=A.length-1;P>=0;P--)if(A[P]===R||A[P].listener===R){V=A[P].listener,F=P;break}if(F<0)return this;F===0?A.shift():w(A,F),A.length===1&&(G[b]=A[0]),G.removeListener!==void 0&&this.emit("removeListener",b,V||R)}return this},a.prototype.off=a.prototype.removeListener,a.prototype.removeAllListeners=function(b){var R,A,G;if(A=this._events,A===void 0)return this;if(A.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):A[b]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete A[b]),this;if(arguments.length===0){var F=Object.keys(A),P;for(G=0;G=0;G--)this.removeListener(b,R[G]);return this};function f(p,b,R){var A=p._events;if(A===void 0)return[];var G=A[b];return G===void 0?[]:typeof G=="function"?R?[G.listener||G]:[G]:R?T(G):y(G,G.length)}a.prototype.listeners=function(b){return f(this,b,!0)},a.prototype.rawListeners=function(b){return f(this,b,!1)},a.listenerCount=function(p,b){return typeof p.listenerCount=="function"?p.listenerCount(b):c.call(p,b)},a.prototype.listenerCount=c;function c(p){var b=this._events;if(b!==void 0){var R=b[p];if(typeof R=="function")return 1;if(R!==void 0)return R.length}return 0}a.prototype.eventNames=function(){return this._eventsCount>0?t(this._events):[]};function y(p,b){for(var R=new Array(b),A=0;An++}function me(){const n=arguments;let i=null,t=-1;return{[Symbol.iterator](){return this},next(){let e=null;do{if(i===null){if(t++,t>=n.length)return{done:!0};i=n[t][Symbol.iterator]()}if(e=i.next(),e.done){i=null;continue}break}while(!0);return e}}}function Le(){return{[Symbol.iterator](){return this},next(){return{done:!0}}}}class Lt extends Error{constructor(i){super(),this.name="GraphError",this.message=i}}class k extends Lt{constructor(i){super(i),this.name="InvalidArgumentsGraphError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,k.prototype.constructor)}}class C extends Lt{constructor(i){super(i),this.name="NotFoundGraphError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,C.prototype.constructor)}}class I extends Lt{constructor(i){super(i),this.name="UsageGraphError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,I.prototype.constructor)}}function _i(n,i){this.key=n,this.attributes=i,this.clear()}_i.prototype.clear=function(){this.inDegree=0,this.outDegree=0,this.undirectedDegree=0,this.undirectedLoops=0,this.directedLoops=0,this.in={},this.out={},this.undirected={}};function Ti(n,i){this.key=n,this.attributes=i,this.clear()}Ti.prototype.clear=function(){this.inDegree=0,this.outDegree=0,this.directedLoops=0,this.in={},this.out={}};function Si(n,i){this.key=n,this.attributes=i,this.clear()}Si.prototype.clear=function(){this.undirectedDegree=0,this.undirectedLoops=0,this.undirected={}};function Ge(n,i,t,e,r){this.key=i,this.attributes=r,this.undirected=n,this.source=t,this.target=e}Ge.prototype.attach=function(){let n="out",i="in";this.undirected&&(n=i="undirected");const t=this.source.key,e=this.target.key;this.source[n][e]=this,!(this.undirected&&t===e)&&(this.target[i][t]=this)};Ge.prototype.attachMulti=function(){let n="out",i="in";const t=this.source.key,e=this.target.key;this.undirected&&(n=i="undirected");const r=this.source[n],a=r[e];if(typeof a>"u"){r[e]=this,this.undirected&&t===e||(this.target[i][t]=this);return}a.previous=this,this.next=a,r[e]=this,this.target[i][t]=this};Ge.prototype.detach=function(){const n=this.source.key,i=this.target.key;let t="out",e="in";this.undirected&&(t=e="undirected"),delete this.source[t][i],delete this.target[e][n]};Ge.prototype.detachMulti=function(){const n=this.source.key,i=this.target.key;let t="out",e="in";this.undirected&&(t=e="undirected"),this.previous===void 0?this.next===void 0?(delete this.source[t][i],delete this.target[e][n]):(this.next.previous=void 0,this.source[t][i]=this.next,this.target[e][n]=this.next):(this.previous.next=this.next,this.next!==void 0&&(this.next.previous=this.previous))};const Ri=0,Ai=1,hr=2,xi=3;function ye(n,i,t,e,r,a,o){let s,u,h,d;if(e=""+e,t===Ri){if(s=n._nodes.get(e),!s)throw new C(`Graph.${i}: could not find the "${e}" node in the graph.`);h=r,d=a}else if(t===xi){if(r=""+r,u=n._edges.get(r),!u)throw new C(`Graph.${i}: could not find the "${r}" edge in the graph.`);const l=u.source.key,f=u.target.key;if(e===l)s=u.target;else if(e===f)s=u.source;else throw new C(`Graph.${i}: the "${e}" node is not attached to the "${r}" edge (${l}, ${f}).`);h=a,d=o}else{if(u=n._edges.get(e),!u)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`);t===Ai?s=u.source:s=u.target,h=r,d=a}return[s,h,d]}function dr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);return o.attributes[s]}}function lr(n,i,t){n.prototype[i]=function(e,r){const[a]=ye(this,i,t,e,r);return a.attributes}}function cr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);return o.attributes.hasOwnProperty(s)}}function fr(n,i,t){n.prototype[i]=function(e,r,a,o){const[s,u,h]=ye(this,i,t,e,r,a,o);return s.attributes[u]=h,this.emit("nodeAttributesUpdated",{key:s.key,type:"set",attributes:s.attributes,name:u}),this}}function gr(n,i,t){n.prototype[i]=function(e,r,a,o){const[s,u,h]=ye(this,i,t,e,r,a,o);if(typeof h!="function")throw new k(`Graph.${i}: updater should be a function.`);const d=s.attributes,l=h(d[u]);return d[u]=l,this.emit("nodeAttributesUpdated",{key:s.key,type:"set",attributes:s.attributes,name:u}),this}}function pr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);return delete o.attributes[s],this.emit("nodeAttributesUpdated",{key:o.key,type:"remove",attributes:o.attributes,name:s}),this}}function vr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);if(!J(s))throw new k(`Graph.${i}: provided attributes are not a plain object.`);return o.attributes=s,this.emit("nodeAttributesUpdated",{key:o.key,type:"replace",attributes:o.attributes}),this}}function mr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);if(!J(s))throw new k(`Graph.${i}: provided attributes are not a plain object.`);return Z(o.attributes,s),this.emit("nodeAttributesUpdated",{key:o.key,type:"merge",attributes:o.attributes,data:s}),this}}function yr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);if(typeof s!="function")throw new k(`Graph.${i}: provided updater is not a function.`);return o.attributes=s(o.attributes),this.emit("nodeAttributesUpdated",{key:o.key,type:"update",attributes:o.attributes}),this}}const br=[{name:n=>`get${n}Attribute`,attacher:dr},{name:n=>`get${n}Attributes`,attacher:lr},{name:n=>`has${n}Attribute`,attacher:cr},{name:n=>`set${n}Attribute`,attacher:fr},{name:n=>`update${n}Attribute`,attacher:gr},{name:n=>`remove${n}Attribute`,attacher:pr},{name:n=>`replace${n}Attributes`,attacher:vr},{name:n=>`merge${n}Attributes`,attacher:mr},{name:n=>`update${n}Attributes`,attacher:yr}];function wr(n){br.forEach(function({name:i,attacher:t}){t(n,i("Node"),Ri),t(n,i("Source"),Ai),t(n,i("Target"),hr),t(n,i("Opposite"),xi)})}function Er(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return a.attributes[r]}}function _r(n,i,t){n.prototype[i]=function(e){let r;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>1){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const a=""+e,o=""+arguments[1];if(r=oe(this,a,o,t),!r)throw new C(`Graph.${i}: could not find an edge for the given path ("${a}" - "${o}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,r=this._edges.get(e),!r)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return r.attributes}}function Tr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return a.attributes.hasOwnProperty(r)}}function Sr(n,i,t){n.prototype[i]=function(e,r,a){let o;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>3){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const s=""+e,u=""+r;if(r=arguments[2],a=arguments[3],o=oe(this,s,u,t),!o)throw new C(`Graph.${i}: could not find an edge for the given path ("${s}" - "${u}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,o=this._edges.get(e),!o)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return o.attributes[r]=a,this.emit("edgeAttributesUpdated",{key:o.key,type:"set",attributes:o.attributes,name:r}),this}}function Rr(n,i,t){n.prototype[i]=function(e,r,a){let o;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>3){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const s=""+e,u=""+r;if(r=arguments[2],a=arguments[3],o=oe(this,s,u,t),!o)throw new C(`Graph.${i}: could not find an edge for the given path ("${s}" - "${u}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,o=this._edges.get(e),!o)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(typeof a!="function")throw new k(`Graph.${i}: updater should be a function.`);return o.attributes[r]=a(o.attributes[r]),this.emit("edgeAttributesUpdated",{key:o.key,type:"set",attributes:o.attributes,name:r}),this}}function Ar(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return delete a.attributes[r],this.emit("edgeAttributesUpdated",{key:a.key,type:"remove",attributes:a.attributes,name:r}),this}}function xr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(!J(r))throw new k(`Graph.${i}: provided attributes are not a plain object.`);return a.attributes=r,this.emit("edgeAttributesUpdated",{key:a.key,type:"replace",attributes:a.attributes}),this}}function Cr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(!J(r))throw new k(`Graph.${i}: provided attributes are not a plain object.`);return Z(a.attributes,r),this.emit("edgeAttributesUpdated",{key:a.key,type:"merge",attributes:a.attributes,data:r}),this}}function kr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(typeof r!="function")throw new k(`Graph.${i}: provided updater is not a function.`);return a.attributes=r(a.attributes),this.emit("edgeAttributesUpdated",{key:a.key,type:"update",attributes:a.attributes}),this}}const Dr=[{name:n=>`get${n}Attribute`,attacher:Er},{name:n=>`get${n}Attributes`,attacher:_r},{name:n=>`has${n}Attribute`,attacher:Tr},{name:n=>`set${n}Attribute`,attacher:Sr},{name:n=>`update${n}Attribute`,attacher:Rr},{name:n=>`remove${n}Attribute`,attacher:Ar},{name:n=>`replace${n}Attributes`,attacher:xr},{name:n=>`merge${n}Attributes`,attacher:Cr},{name:n=>`update${n}Attributes`,attacher:kr}];function Lr(n){Dr.forEach(function({name:i,attacher:t}){t(n,i("Edge"),"mixed"),t(n,i("DirectedEdge"),"directed"),t(n,i("UndirectedEdge"),"undirected")})}const Gr=[{name:"edges",type:"mixed"},{name:"inEdges",type:"directed",direction:"in"},{name:"outEdges",type:"directed",direction:"out"},{name:"inboundEdges",type:"mixed",direction:"in"},{name:"outboundEdges",type:"mixed",direction:"out"},{name:"directedEdges",type:"directed"},{name:"undirectedEdges",type:"undirected"}];function Fr(n,i,t,e){let r=!1;for(const a in i){if(a===e)continue;const o=i[a];if(r=t(o.key,o.attributes,o.source.key,o.target.key,o.source.attributes,o.target.attributes,o.undirected),n&&r)return o.key}}function Nr(n,i,t,e){let r,a,o,s=!1;for(const u in i)if(u!==e){r=i[u];do{if(a=r.source,o=r.target,s=t(r.key,r.attributes,a.key,o.key,a.attributes,o.attributes,r.undirected),n&&s)return r.key;r=r.next}while(r!==void 0)}}function lt(n,i){const t=Object.keys(n),e=t.length;let r,a=0;return{[Symbol.iterator](){return this},next(){do if(r)r=r.next;else{if(a>=e)return{done:!0};const o=t[a++];if(o===i){r=void 0;continue}r=n[o]}while(!r);return{done:!1,value:{edge:r.key,attributes:r.attributes,source:r.source.key,target:r.target.key,sourceAttributes:r.source.attributes,targetAttributes:r.target.attributes,undirected:r.undirected}}}}}function Pr(n,i,t,e){const r=i[t];if(!r)return;const a=r.source,o=r.target;if(e(r.key,r.attributes,a.key,o.key,a.attributes,o.attributes,r.undirected)&&n)return r.key}function Ir(n,i,t,e){let r=i[t];if(!r)return;let a=!1;do{if(a=e(r.key,r.attributes,r.source.key,r.target.key,r.source.attributes,r.target.attributes,r.undirected),n&&a)return r.key;r=r.next}while(r!==void 0)}function ct(n,i){let t=n[i];if(t.next!==void 0)return{[Symbol.iterator](){return this},next(){if(!t)return{done:!0};const r={edge:t.key,attributes:t.attributes,source:t.source.key,target:t.target.key,sourceAttributes:t.source.attributes,targetAttributes:t.target.attributes,undirected:t.undirected};return t=t.next,{done:!1,value:r}}};let e=!1;return{[Symbol.iterator](){return this},next(){return e===!0?{done:!0}:(e=!0,{done:!1,value:{edge:t.key,attributes:t.attributes,source:t.source.key,target:t.target.key,sourceAttributes:t.source.attributes,targetAttributes:t.target.attributes,undirected:t.undirected}})}}}function Or(n,i){if(n.size===0)return[];if(i==="mixed"||i===n.type)return Array.from(n._edges.keys());const t=i==="undirected"?n.undirectedSize:n.directedSize,e=new Array(t),r=i==="undirected",a=n._edges.values();let o=0,s,u;for(;s=a.next(),s.done!==!0;)u=s.value,u.undirected===r&&(e[o++]=u.key);return e}function Ci(n,i,t,e){if(i.size===0)return;const r=t!=="mixed"&&t!==i.type,a=t==="undirected";let o,s,u=!1;const h=i._edges.values();for(;o=h.next(),o.done!==!0;){if(s=o.value,r&&s.undirected!==a)continue;const{key:d,attributes:l,source:f,target:c}=s;if(u=e(d,l,f.key,c.key,f.attributes,c.attributes,s.undirected),n&&u)return d}}function Ur(n,i){if(n.size===0)return Le();const t=i!=="mixed"&&i!==n.type,e=i==="undirected",r=n._edges.values();return{[Symbol.iterator](){return this},next(){let a,o;for(;;){if(a=r.next(),a.done)return a;if(o=a.value,!(t&&o.undirected!==e))break}return{value:{edge:o.key,attributes:o.attributes,source:o.source.key,target:o.target.key,sourceAttributes:o.source.attributes,targetAttributes:o.target.attributes,undirected:o.undirected},done:!1}}}}function Gt(n,i,t,e,r,a){const o=i?Nr:Fr;let s;if(t!=="undirected"&&(e!=="out"&&(s=o(n,r.in,a),n&&s)||e!=="in"&&(s=o(n,r.out,a,e?void 0:r.key),n&&s))||t!=="directed"&&(s=o(n,r.undirected,a),n&&s))return s}function zr(n,i,t,e){const r=[];return Gt(!1,n,i,t,e,function(a){r.push(a)}),r}function $r(n,i,t){let e=Le();return n!=="undirected"&&(i!=="out"&&typeof t.in<"u"&&(e=me(e,lt(t.in))),i!=="in"&&typeof t.out<"u"&&(e=me(e,lt(t.out,i?void 0:t.key)))),n!=="directed"&&typeof t.undirected<"u"&&(e=me(e,lt(t.undirected))),e}function Ft(n,i,t,e,r,a,o){const s=t?Ir:Pr;let u;if(i!=="undirected"&&(typeof r.in<"u"&&e!=="out"&&(u=s(n,r.in,a,o),n&&u)||typeof r.out<"u"&&e!=="in"&&(e||r.key!==a)&&(u=s(n,r.out,a,o),n&&u))||i!=="directed"&&typeof r.undirected<"u"&&(u=s(n,r.undirected,a,o),n&&u))return u}function Br(n,i,t,e,r){const a=[];return Ft(!1,n,i,t,e,r,function(o){a.push(o)}),a}function Mr(n,i,t,e){let r=Le();return n!=="undirected"&&(typeof t.in<"u"&&i!=="out"&&e in t.in&&(r=me(r,ct(t.in,e))),typeof t.out<"u"&&i!=="in"&&e in t.out&&(i||t.key!==e)&&(r=me(r,ct(t.out,e)))),n!=="directed"&&typeof t.undirected<"u"&&e in t.undirected&&(r=me(r,ct(t.undirected,e))),r}function Hr(n,i){const{name:t,type:e,direction:r}=i;n.prototype[t]=function(a,o){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return[];if(!arguments.length)return Or(this,e);if(arguments.length===1){a=""+a;const s=this._nodes.get(a);if(typeof s>"u")throw new C(`Graph.${t}: could not find the "${a}" node in the graph.`);return zr(this.multi,e==="mixed"?this.type:e,r,s)}if(arguments.length===2){a=""+a,o=""+o;const s=this._nodes.get(a);if(!s)throw new C(`Graph.${t}: could not find the "${a}" source node in the graph.`);if(!this._nodes.has(o))throw new C(`Graph.${t}: could not find the "${o}" target node in the graph.`);return Br(e,this.multi,r,s,o)}throw new k(`Graph.${t}: too many arguments (expecting 0, 1 or 2 and got ${arguments.length}).`)}}function Wr(n,i){const{name:t,type:e,direction:r}=i,a="forEach"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[a]=function(h,d,l){if(!(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)){if(arguments.length===1)return l=h,Ci(!1,this,e,l);if(arguments.length===2){h=""+h,l=d;const f=this._nodes.get(h);if(typeof f>"u")throw new C(`Graph.${a}: could not find the "${h}" node in the graph.`);return Gt(!1,this.multi,e==="mixed"?this.type:e,r,f,l)}if(arguments.length===3){h=""+h,d=""+d;const f=this._nodes.get(h);if(!f)throw new C(`Graph.${a}: could not find the "${h}" source node in the graph.`);if(!this._nodes.has(d))throw new C(`Graph.${a}: could not find the "${d}" target node in the graph.`);return Ft(!1,e,this.multi,r,f,d,l)}throw new k(`Graph.${a}: too many arguments (expecting 1, 2 or 3 and got ${arguments.length}).`)}};const o="map"+t[0].toUpperCase()+t.slice(1);n.prototype[o]=function(){const h=Array.prototype.slice.call(arguments),d=h.pop();let l;if(h.length===0){let f=0;e!=="directed"&&(f+=this.undirectedSize),e!=="undirected"&&(f+=this.directedSize),l=new Array(f);let c=0;h.push((y,w,T,D,m,S,p)=>{l[c++]=d(y,w,T,D,m,S,p)})}else l=[],h.push((f,c,y,w,T,D,m)=>{l.push(d(f,c,y,w,T,D,m))});return this[a].apply(this,h),l};const s="filter"+t[0].toUpperCase()+t.slice(1);n.prototype[s]=function(){const h=Array.prototype.slice.call(arguments),d=h.pop(),l=[];return h.push((f,c,y,w,T,D,m)=>{d(f,c,y,w,T,D,m)&&l.push(f)}),this[a].apply(this,h),l};const u="reduce"+t[0].toUpperCase()+t.slice(1);n.prototype[u]=function(){let h=Array.prototype.slice.call(arguments);if(h.length<2||h.length>4)throw new k(`Graph.${u}: invalid number of arguments (expecting 2, 3 or 4 and got ${h.length}).`);if(typeof h[h.length-1]=="function"&&typeof h[h.length-2]!="function")throw new k(`Graph.${u}: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.`);let d,l;h.length===2?(d=h[0],l=h[1],h=[]):h.length===3?(d=h[1],l=h[2],h=[h[0]]):h.length===4&&(d=h[2],l=h[3],h=[h[0],h[1]]);let f=l;return h.push((c,y,w,T,D,m,S)=>{f=d(f,c,y,w,T,D,m,S)}),this[a].apply(this,h),f}}function jr(n,i){const{name:t,type:e,direction:r}=i,a="find"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[a]=function(u,h,d){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return!1;if(arguments.length===1)return d=u,Ci(!0,this,e,d);if(arguments.length===2){u=""+u,d=h;const l=this._nodes.get(u);if(typeof l>"u")throw new C(`Graph.${a}: could not find the "${u}" node in the graph.`);return Gt(!0,this.multi,e==="mixed"?this.type:e,r,l,d)}if(arguments.length===3){u=""+u,h=""+h;const l=this._nodes.get(u);if(!l)throw new C(`Graph.${a}: could not find the "${u}" source node in the graph.`);if(!this._nodes.has(h))throw new C(`Graph.${a}: could not find the "${h}" target node in the graph.`);return Ft(!0,e,this.multi,r,l,h,d)}throw new k(`Graph.${a}: too many arguments (expecting 1, 2 or 3 and got ${arguments.length}).`)};const o="some"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[o]=function(){const u=Array.prototype.slice.call(arguments),h=u.pop();return u.push((l,f,c,y,w,T,D)=>h(l,f,c,y,w,T,D)),!!this[a].apply(this,u)};const s="every"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[s]=function(){const u=Array.prototype.slice.call(arguments),h=u.pop();return u.push((l,f,c,y,w,T,D)=>!h(l,f,c,y,w,T,D)),!this[a].apply(this,u)}}function Vr(n,i){const{name:t,type:e,direction:r}=i,a=t.slice(0,-1)+"Entries";n.prototype[a]=function(o,s){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return Le();if(!arguments.length)return Ur(this,e);if(arguments.length===1){o=""+o;const u=this._nodes.get(o);if(!u)throw new C(`Graph.${a}: could not find the "${o}" node in the graph.`);return $r(e,r,u)}if(arguments.length===2){o=""+o,s=""+s;const u=this._nodes.get(o);if(!u)throw new C(`Graph.${a}: could not find the "${o}" source node in the graph.`);if(!this._nodes.has(s))throw new C(`Graph.${a}: could not find the "${s}" target node in the graph.`);return Mr(e,r,u,s)}throw new k(`Graph.${a}: too many arguments (expecting 0, 1 or 2 and got ${arguments.length}).`)}}function qr(n){Gr.forEach(i=>{Hr(n,i),Wr(n,i),jr(n,i),Vr(n,i)})}const Kr=[{name:"neighbors",type:"mixed"},{name:"inNeighbors",type:"directed",direction:"in"},{name:"outNeighbors",type:"directed",direction:"out"},{name:"inboundNeighbors",type:"mixed",direction:"in"},{name:"outboundNeighbors",type:"mixed",direction:"out"},{name:"directedNeighbors",type:"directed"},{name:"undirectedNeighbors",type:"undirected"}];function ut(){this.A=null,this.B=null}ut.prototype.wrap=function(n){this.A===null?this.A=n:this.B===null&&(this.B=n)};ut.prototype.has=function(n){return this.A!==null&&n in this.A||this.B!==null&&n in this.B};function Oe(n,i,t,e,r){for(const a in e){const o=e[a],s=o.source,u=o.target,h=s===t?u:s;if(i&&i.has(h.key))continue;const d=r(h.key,h.attributes);if(n&&d)return h.key}}function Nt(n,i,t,e,r){if(i!=="mixed"){if(i==="undirected")return Oe(n,null,e,e.undirected,r);if(typeof t=="string")return Oe(n,null,e,e[t],r)}const a=new ut;let o;if(i!=="undirected"){if(t!=="out"){if(o=Oe(n,null,e,e.in,r),n&&o)return o;a.wrap(e.in)}if(t!=="in"){if(o=Oe(n,a,e,e.out,r),n&&o)return o;a.wrap(e.out)}}if(i!=="directed"&&(o=Oe(n,a,e,e.undirected,r),n&&o))return o}function Yr(n,i,t){if(n!=="mixed"){if(n==="undirected")return Object.keys(t.undirected);if(typeof i=="string")return Object.keys(t[i])}const e=[];return Nt(!1,n,i,t,function(r){e.push(r)}),e}function Ue(n,i,t){const e=Object.keys(t),r=e.length;let a=0;return{[Symbol.iterator](){return this},next(){let o=null;do{if(a>=r)return n&&n.wrap(t),{done:!0};const s=t[e[a++]],u=s.source,h=s.target;if(o=u===i?h:u,n&&n.has(o.key)){o=null;continue}}while(o===null);return{done:!1,value:{neighbor:o.key,attributes:o.attributes}}}}}function Zr(n,i,t){if(n!=="mixed"){if(n==="undirected")return Ue(null,t,t.undirected);if(typeof i=="string")return Ue(null,t,t[i])}let e=Le();const r=new ut;return n!=="undirected"&&(i!=="out"&&(e=me(e,Ue(r,t,t.in))),i!=="in"&&(e=me(e,Ue(r,t,t.out)))),n!=="directed"&&(e=me(e,Ue(r,t,t.undirected))),e}function Xr(n,i){const{name:t,type:e,direction:r}=i;n.prototype[t]=function(a){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return[];a=""+a;const o=this._nodes.get(a);if(typeof o>"u")throw new C(`Graph.${t}: could not find the "${a}" node in the graph.`);return Yr(e==="mixed"?this.type:e,r,o)}}function Jr(n,i){const{name:t,type:e,direction:r}=i,a="forEach"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[a]=function(h,d){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return;h=""+h;const l=this._nodes.get(h);if(typeof l>"u")throw new C(`Graph.${a}: could not find the "${h}" node in the graph.`);Nt(!1,e==="mixed"?this.type:e,r,l,d)};const o="map"+t[0].toUpperCase()+t.slice(1);n.prototype[o]=function(h,d){const l=[];return this[a](h,(f,c)=>{l.push(d(f,c))}),l};const s="filter"+t[0].toUpperCase()+t.slice(1);n.prototype[s]=function(h,d){const l=[];return this[a](h,(f,c)=>{d(f,c)&&l.push(f)}),l};const u="reduce"+t[0].toUpperCase()+t.slice(1);n.prototype[u]=function(h,d,l){if(arguments.length<3)throw new k(`Graph.${u}: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.`);let f=l;return this[a](h,(c,y)=>{f=d(f,c,y)}),f}}function Qr(n,i){const{name:t,type:e,direction:r}=i,a=t[0].toUpperCase()+t.slice(1,-1),o="find"+a;n.prototype[o]=function(h,d){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return;h=""+h;const l=this._nodes.get(h);if(typeof l>"u")throw new C(`Graph.${o}: could not find the "${h}" node in the graph.`);return Nt(!0,e==="mixed"?this.type:e,r,l,d)};const s="some"+a;n.prototype[s]=function(h,d){return!!this[o](h,d)};const u="every"+a;n.prototype[u]=function(h,d){return!this[o](h,(f,c)=>!d(f,c))}}function en(n,i){const{name:t,type:e,direction:r}=i,a=t.slice(0,-1)+"Entries";n.prototype[a]=function(o){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return Le();o=""+o;const s=this._nodes.get(o);if(typeof s>"u")throw new C(`Graph.${a}: could not find the "${o}" node in the graph.`);return Zr(e==="mixed"?this.type:e,r,s)}}function tn(n){Kr.forEach(i=>{Xr(n,i),Jr(n,i),Qr(n,i),en(n,i)})}function tt(n,i,t,e,r){const a=e._nodes.values(),o=e.type;let s,u,h,d,l,f;for(;s=a.next(),s.done!==!0;){let c=!1;if(u=s.value,o!=="undirected"){d=u.out;for(h in d){l=d[h];do f=l.target,c=!0,r(u.key,f.key,u.attributes,f.attributes,l.key,l.attributes,l.undirected),l=l.next;while(l)}}if(o!=="directed"){d=u.undirected;for(h in d)if(!(i&&u.key>h)){l=d[h];do f=l.target,f.key!==h&&(f=l.source),c=!0,r(u.key,f.key,u.attributes,f.attributes,l.key,l.attributes,l.undirected),l=l.next;while(l)}}t&&!c&&r(u.key,null,u.attributes,null,null,null,null)}}function rn(n,i){const t={key:n};return Ei(i.attributes)||(t.attributes=Z({},i.attributes)),t}function nn(n,i,t){const e={key:i,source:t.source.key,target:t.target.key};return Ei(t.attributes)||(e.attributes=Z({},t.attributes)),n==="mixed"&&t.undirected&&(e.undirected=!0),e}function an(n){if(!J(n))throw new k('Graph.import: invalid serialized node. A serialized node should be a plain object with at least a "key" property.');if(!("key"in n))throw new k("Graph.import: serialized node is missing its key.");if("attributes"in n&&(!J(n.attributes)||n.attributes===null))throw new k("Graph.import: invalid attributes. Attributes should be a plain object, null or omitted.")}function on(n){if(!J(n))throw new k('Graph.import: invalid serialized edge. A serialized edge should be a plain object with at least a "source" & "target" property.');if(!("source"in n))throw new k("Graph.import: serialized edge is missing its source.");if(!("target"in n))throw new k("Graph.import: serialized edge is missing its target.");if("attributes"in n&&(!J(n.attributes)||n.attributes===null))throw new k("Graph.import: invalid attributes. Attributes should be a plain object, null or omitted.");if("undirected"in n&&typeof n.undirected!="boolean")throw new k("Graph.import: invalid undirectedness information. Undirected should be boolean or omitted.")}const sn=ur(),un=new Set(["directed","undirected","mixed"]),Bt=new Set(["domain","_events","_eventsCount","_maxListeners"]),hn=[{name:n=>`${n}Edge`,generateKey:!0},{name:n=>`${n}DirectedEdge`,generateKey:!0,type:"directed"},{name:n=>`${n}UndirectedEdge`,generateKey:!0,type:"undirected"},{name:n=>`${n}EdgeWithKey`},{name:n=>`${n}DirectedEdgeWithKey`,type:"directed"},{name:n=>`${n}UndirectedEdgeWithKey`,type:"undirected"}],dn={allowSelfLoops:!0,multi:!1,type:"mixed"};function ln(n,i,t){if(t&&!J(t))throw new k(`Graph.addNode: invalid attributes. Expecting an object but got "${t}"`);if(i=""+i,t=t||{},n._nodes.has(i))throw new I(`Graph.addNode: the "${i}" node already exist in the graph.`);const e=new n.NodeDataClass(i,t);return n._nodes.set(i,e),n.emit("nodeAdded",{key:i,attributes:t}),e}function Mt(n,i,t){const e=new n.NodeDataClass(i,t);return n._nodes.set(i,e),n.emit("nodeAdded",{key:i,attributes:t}),e}function ki(n,i,t,e,r,a,o,s){if(!e&&n.type==="undirected")throw new I(`Graph.${i}: you cannot add a directed edge to an undirected graph. Use the #.addEdge or #.addUndirectedEdge instead.`);if(e&&n.type==="directed")throw new I(`Graph.${i}: you cannot add an undirected edge to a directed graph. Use the #.addEdge or #.addDirectedEdge instead.`);if(s&&!J(s))throw new k(`Graph.${i}: invalid attributes. Expecting an object but got "${s}"`);if(a=""+a,o=""+o,s=s||{},!n.allowSelfLoops&&a===o)throw new I(`Graph.${i}: source & target are the same ("${a}"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.`);const u=n._nodes.get(a),h=n._nodes.get(o);if(!u)throw new C(`Graph.${i}: source node "${a}" not found.`);if(!h)throw new C(`Graph.${i}: target node "${o}" not found.`);const d={key:null,undirected:e,source:a,target:o,attributes:s};if(t)r=n._edgeKeyGenerator();else if(r=""+r,n._edges.has(r))throw new I(`Graph.${i}: the "${r}" edge already exists in the graph.`);if(!n.multi&&(e?typeof u.undirected[o]<"u":typeof u.out[o]<"u"))throw new I(`Graph.${i}: an edge linking "${a}" to "${o}" already exists. If you really want to add multiple edges linking those nodes, you should create a multi graph by using the 'multi' option.`);const l=new Ge(e,r,u,h,s);n._edges.set(r,l);const f=a===o;return e?(u.undirectedDegree++,h.undirectedDegree++,f&&(u.undirectedLoops++,n._undirectedSelfLoopCount++)):(u.outDegree++,h.inDegree++,f&&(u.directedLoops++,n._directedSelfLoopCount++)),n.multi?l.attachMulti():l.attach(),e?n._undirectedSize++:n._directedSize++,d.key=r,n.emit("edgeAdded",d),r}function cn(n,i,t,e,r,a,o,s,u){if(!e&&n.type==="undirected")throw new I(`Graph.${i}: you cannot merge/update a directed edge to an undirected graph. Use the #.mergeEdge/#.updateEdge or #.addUndirectedEdge instead.`);if(e&&n.type==="directed")throw new I(`Graph.${i}: you cannot merge/update an undirected edge to a directed graph. Use the #.mergeEdge/#.updateEdge or #.addDirectedEdge instead.`);if(s){if(u){if(typeof s!="function")throw new k(`Graph.${i}: invalid updater function. Expecting a function but got "${s}"`)}else if(!J(s))throw new k(`Graph.${i}: invalid attributes. Expecting an object but got "${s}"`)}a=""+a,o=""+o;let h;if(u&&(h=s,s=void 0),!n.allowSelfLoops&&a===o)throw new I(`Graph.${i}: source & target are the same ("${a}"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.`);let d=n._nodes.get(a),l=n._nodes.get(o),f,c;if(!t&&(f=n._edges.get(r),f)){if((f.source.key!==a||f.target.key!==o)&&(!e||f.source.key!==o||f.target.key!==a))throw new I(`Graph.${i}: inconsistency detected when attempting to merge the "${r}" edge with "${a}" source & "${o}" target vs. ("${f.source.key}", "${f.target.key}").`);c=f}if(!c&&!n.multi&&d&&(c=e?d.undirected[o]:d.out[o]),c){const m=[c.key,!1,!1,!1];if(u?!h:!s)return m;if(u){const S=c.attributes;c.attributes=h(S),n.emit("edgeAttributesUpdated",{type:"replace",key:c.key,attributes:c.attributes})}else Z(c.attributes,s),n.emit("edgeAttributesUpdated",{type:"merge",key:c.key,attributes:c.attributes,data:s});return m}s=s||{},u&&h&&(s=h(s));const y={key:null,undirected:e,source:a,target:o,attributes:s};if(t)r=n._edgeKeyGenerator();else if(r=""+r,n._edges.has(r))throw new I(`Graph.${i}: the "${r}" edge already exists in the graph.`);let w=!1,T=!1;d||(d=Mt(n,a,{}),w=!0,a===o&&(l=d,T=!0)),l||(l=Mt(n,o,{}),T=!0),f=new Ge(e,r,d,l,s),n._edges.set(r,f);const D=a===o;return e?(d.undirectedDegree++,l.undirectedDegree++,D&&(d.undirectedLoops++,n._undirectedSelfLoopCount++)):(d.outDegree++,l.inDegree++,D&&(d.directedLoops++,n._directedSelfLoopCount++)),n.multi?f.attachMulti():f.attach(),e?n._undirectedSize++:n._directedSize++,y.key=r,n.emit("edgeAdded",y),[r,!0,w,T]}function xe(n,i){n._edges.delete(i.key);const{source:t,target:e,attributes:r}=i,a=i.undirected,o=t===e;a?(t.undirectedDegree--,e.undirectedDegree--,o&&(t.undirectedLoops--,n._undirectedSelfLoopCount--)):(t.outDegree--,e.inDegree--,o&&(t.directedLoops--,n._directedSelfLoopCount--)),n.multi?i.detachMulti():i.detach(),a?n._undirectedSize--:n._directedSize--,n.emit("edgeDropped",{key:i.key,attributes:r,source:t.key,target:e.key,undirected:a})}class j extends wi.EventEmitter{constructor(i){if(super(),i=Z({},dn,i),typeof i.multi!="boolean")throw new k(`Graph.constructor: invalid 'multi' option. Expecting a boolean but got "${i.multi}".`);if(!un.has(i.type))throw new k(`Graph.constructor: invalid 'type' option. Should be one of "mixed", "directed" or "undirected" but got "${i.type}".`);if(typeof i.allowSelfLoops!="boolean")throw new k(`Graph.constructor: invalid 'allowSelfLoops' option. Expecting a boolean but got "${i.allowSelfLoops}".`);const t=i.type==="mixed"?_i:i.type==="directed"?Ti:Si;ae(this,"NodeDataClass",t);const e="geid_"+sn()+"_";let r=0;const a=()=>{let o;do o=e+r++;while(this._edges.has(o));return o};ae(this,"_attributes",{}),ae(this,"_nodes",new Map),ae(this,"_edges",new Map),ae(this,"_directedSize",0),ae(this,"_undirectedSize",0),ae(this,"_directedSelfLoopCount",0),ae(this,"_undirectedSelfLoopCount",0),ae(this,"_edgeKeyGenerator",a),ae(this,"_options",i),Bt.forEach(o=>ae(this,o,this[o])),he(this,"order",()=>this._nodes.size),he(this,"size",()=>this._edges.size),he(this,"directedSize",()=>this._directedSize),he(this,"undirectedSize",()=>this._undirectedSize),he(this,"selfLoopCount",()=>this._directedSelfLoopCount+this._undirectedSelfLoopCount),he(this,"directedSelfLoopCount",()=>this._directedSelfLoopCount),he(this,"undirectedSelfLoopCount",()=>this._undirectedSelfLoopCount),he(this,"multi",this._options.multi),he(this,"type",this._options.type),he(this,"allowSelfLoops",this._options.allowSelfLoops),he(this,"implementation",()=>"graphology")}_resetInstanceCounters(){this._directedSize=0,this._undirectedSize=0,this._directedSelfLoopCount=0,this._undirectedSelfLoopCount=0}hasNode(i){return this._nodes.has(""+i)}hasDirectedEdge(i,t){if(this.type==="undirected")return!1;if(arguments.length===1){const e=""+i,r=this._edges.get(e);return!!r&&!r.undirected}else if(arguments.length===2){i=""+i,t=""+t;const e=this._nodes.get(i);return e?e.out.hasOwnProperty(t):!1}throw new k(`Graph.hasDirectedEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`)}hasUndirectedEdge(i,t){if(this.type==="directed")return!1;if(arguments.length===1){const e=""+i,r=this._edges.get(e);return!!r&&r.undirected}else if(arguments.length===2){i=""+i,t=""+t;const e=this._nodes.get(i);return e?e.undirected.hasOwnProperty(t):!1}throw new k(`Graph.hasDirectedEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`)}hasEdge(i,t){if(arguments.length===1){const e=""+i;return this._edges.has(e)}else if(arguments.length===2){i=""+i,t=""+t;const e=this._nodes.get(i);return e?typeof e.out<"u"&&e.out.hasOwnProperty(t)||typeof e.undirected<"u"&&e.undirected.hasOwnProperty(t):!1}throw new k(`Graph.hasEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`)}directedEdge(i,t){if(this.type==="undirected")return;if(i=""+i,t=""+t,this.multi)throw new I("Graph.directedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.directedEdges instead.");const e=this._nodes.get(i);if(!e)throw new C(`Graph.directedEdge: could not find the "${i}" source node in the graph.`);if(!this._nodes.has(t))throw new C(`Graph.directedEdge: could not find the "${t}" target node in the graph.`);const r=e.out&&e.out[t]||void 0;if(r)return r.key}undirectedEdge(i,t){if(this.type==="directed")return;if(i=""+i,t=""+t,this.multi)throw new I("Graph.undirectedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.undirectedEdges instead.");const e=this._nodes.get(i);if(!e)throw new C(`Graph.undirectedEdge: could not find the "${i}" source node in the graph.`);if(!this._nodes.has(t))throw new C(`Graph.undirectedEdge: could not find the "${t}" target node in the graph.`);const r=e.undirected&&e.undirected[t]||void 0;if(r)return r.key}edge(i,t){if(this.multi)throw new I("Graph.edge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.edges instead.");i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.edge: could not find the "${i}" source node in the graph.`);if(!this._nodes.has(t))throw new C(`Graph.edge: could not find the "${t}" target node in the graph.`);const r=e.out&&e.out[t]||e.undirected&&e.undirected[t]||void 0;if(r)return r.key}areDirectedNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areDirectedNeighbors: could not find the "${i}" node in the graph.`);return this.type==="undirected"?!1:t in e.in||t in e.out}areOutNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areOutNeighbors: could not find the "${i}" node in the graph.`);return this.type==="undirected"?!1:t in e.out}areInNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areInNeighbors: could not find the "${i}" node in the graph.`);return this.type==="undirected"?!1:t in e.in}areUndirectedNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areUndirectedNeighbors: could not find the "${i}" node in the graph.`);return this.type==="directed"?!1:t in e.undirected}areNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areNeighbors: could not find the "${i}" node in the graph.`);return this.type!=="undirected"&&(t in e.in||t in e.out)||this.type!=="directed"&&t in e.undirected}areInboundNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areInboundNeighbors: could not find the "${i}" node in the graph.`);return this.type!=="undirected"&&t in e.in||this.type!=="directed"&&t in e.undirected}areOutboundNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areOutboundNeighbors: could not find the "${i}" node in the graph.`);return this.type!=="undirected"&&t in e.out||this.type!=="directed"&&t in e.undirected}inDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.inDegree: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree}outDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.outDegree: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.outDegree}directedDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.directedDegree: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree+t.outDegree}undirectedDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.undirectedDegree: could not find the "${i}" node in the graph.`);return this.type==="directed"?0:t.undirectedDegree}inboundDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.inboundDegree: could not find the "${i}" node in the graph.`);let e=0;return this.type!=="directed"&&(e+=t.undirectedDegree),this.type!=="undirected"&&(e+=t.inDegree),e}outboundDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.outboundDegree: could not find the "${i}" node in the graph.`);let e=0;return this.type!=="directed"&&(e+=t.undirectedDegree),this.type!=="undirected"&&(e+=t.outDegree),e}degree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.degree: could not find the "${i}" node in the graph.`);let e=0;return this.type!=="directed"&&(e+=t.undirectedDegree),this.type!=="undirected"&&(e+=t.inDegree+t.outDegree),e}inDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.inDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree-t.directedLoops}outDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.outDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.outDegree-t.directedLoops}directedDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.directedDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree+t.outDegree-t.directedLoops*2}undirectedDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.undirectedDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="directed"?0:t.undirectedDegree-t.undirectedLoops*2}inboundDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.inboundDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);let e=0,r=0;return this.type!=="directed"&&(e+=t.undirectedDegree,r+=t.undirectedLoops*2),this.type!=="undirected"&&(e+=t.inDegree,r+=t.directedLoops),e-r}outboundDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.outboundDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);let e=0,r=0;return this.type!=="directed"&&(e+=t.undirectedDegree,r+=t.undirectedLoops*2),this.type!=="undirected"&&(e+=t.outDegree,r+=t.directedLoops),e-r}degreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.degreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);let e=0,r=0;return this.type!=="directed"&&(e+=t.undirectedDegree,r+=t.undirectedLoops*2),this.type!=="undirected"&&(e+=t.inDegree+t.outDegree,r+=t.directedLoops*2),e-r}source(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.source: could not find the "${i}" edge in the graph.`);return t.source.key}target(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.target: could not find the "${i}" edge in the graph.`);return t.target.key}extremities(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.extremities: could not find the "${i}" edge in the graph.`);return[t.source.key,t.target.key]}opposite(i,t){i=""+i,t=""+t;const e=this._edges.get(t);if(!e)throw new C(`Graph.opposite: could not find the "${t}" edge in the graph.`);const r=e.source.key,a=e.target.key;if(i===r)return a;if(i===a)return r;throw new C(`Graph.opposite: the "${i}" node is not attached to the "${t}" edge (${r}, ${a}).`)}hasExtremity(i,t){i=""+i,t=""+t;const e=this._edges.get(i);if(!e)throw new C(`Graph.hasExtremity: could not find the "${i}" edge in the graph.`);return e.source.key===t||e.target.key===t}isUndirected(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.isUndirected: could not find the "${i}" edge in the graph.`);return t.undirected}isDirected(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.isDirected: could not find the "${i}" edge in the graph.`);return!t.undirected}isSelfLoop(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.isSelfLoop: could not find the "${i}" edge in the graph.`);return t.source===t.target}addNode(i,t){return ln(this,i,t).key}mergeNode(i,t){if(t&&!J(t))throw new k(`Graph.mergeNode: invalid attributes. Expecting an object but got "${t}"`);i=""+i,t=t||{};let e=this._nodes.get(i);return e?(t&&(Z(e.attributes,t),this.emit("nodeAttributesUpdated",{type:"merge",key:i,attributes:e.attributes,data:t})),[i,!1]):(e=new this.NodeDataClass(i,t),this._nodes.set(i,e),this.emit("nodeAdded",{key:i,attributes:t}),[i,!0])}updateNode(i,t){if(t&&typeof t!="function")throw new k(`Graph.updateNode: invalid updater function. Expecting a function but got "${t}"`);i=""+i;let e=this._nodes.get(i);if(e){if(t){const a=e.attributes;e.attributes=t(a),this.emit("nodeAttributesUpdated",{type:"replace",key:i,attributes:e.attributes})}return[i,!1]}const r=t?t({}):{};return e=new this.NodeDataClass(i,r),this._nodes.set(i,e),this.emit("nodeAdded",{key:i,attributes:r}),[i,!0]}dropNode(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.dropNode: could not find the "${i}" node in the graph.`);let e;if(this.type!=="undirected"){for(const r in t.out){e=t.out[r];do xe(this,e),e=e.next;while(e)}for(const r in t.in){e=t.in[r];do xe(this,e),e=e.next;while(e)}}if(this.type!=="directed")for(const r in t.undirected){e=t.undirected[r];do xe(this,e),e=e.next;while(e)}this._nodes.delete(i),this.emit("nodeDropped",{key:i,attributes:t.attributes})}dropEdge(i){let t;if(arguments.length>1){const e=""+arguments[0],r=""+arguments[1];if(t=oe(this,e,r,this.type),!t)throw new C(`Graph.dropEdge: could not find the "${e}" -> "${r}" edge in the graph.`)}else if(i=""+i,t=this._edges.get(i),!t)throw new C(`Graph.dropEdge: could not find the "${i}" edge in the graph.`);return xe(this,t),this}dropDirectedEdge(i,t){if(arguments.length<2)throw new I("Graph.dropDirectedEdge: it does not make sense to try and drop a directed edge by key. What if the edge with this key is undirected? Use #.dropEdge for this purpose instead.");if(this.multi)throw new I("Graph.dropDirectedEdge: cannot use a {source,target} combo when dropping an edge in a MultiGraph since we cannot infer the one you want to delete as there could be multiple ones.");i=""+i,t=""+t;const e=oe(this,i,t,"directed");if(!e)throw new C(`Graph.dropDirectedEdge: could not find a "${i}" -> "${t}" edge in the graph.`);return xe(this,e),this}dropUndirectedEdge(i,t){if(arguments.length<2)throw new I("Graph.dropUndirectedEdge: it does not make sense to drop a directed edge by key. What if the edge with this key is undirected? Use #.dropEdge for this purpose instead.");if(this.multi)throw new I("Graph.dropUndirectedEdge: cannot use a {source,target} combo when dropping an edge in a MultiGraph since we cannot infer the one you want to delete as there could be multiple ones.");const e=oe(this,i,t,"undirected");if(!e)throw new C(`Graph.dropUndirectedEdge: could not find a "${i}" -> "${t}" edge in the graph.`);return xe(this,e),this}clear(){this._edges.clear(),this._nodes.clear(),this._resetInstanceCounters(),this.emit("cleared")}clearEdges(){const i=this._nodes.values();let t;for(;t=i.next(),t.done!==!0;)t.value.clear();this._edges.clear(),this._resetInstanceCounters(),this.emit("edgesCleared")}getAttribute(i){return this._attributes[i]}getAttributes(){return this._attributes}hasAttribute(i){return this._attributes.hasOwnProperty(i)}setAttribute(i,t){return this._attributes[i]=t,this.emit("attributesUpdated",{type:"set",attributes:this._attributes,name:i}),this}updateAttribute(i,t){if(typeof t!="function")throw new k("Graph.updateAttribute: updater should be a function.");const e=this._attributes[i];return this._attributes[i]=t(e),this.emit("attributesUpdated",{type:"set",attributes:this._attributes,name:i}),this}removeAttribute(i){return delete this._attributes[i],this.emit("attributesUpdated",{type:"remove",attributes:this._attributes,name:i}),this}replaceAttributes(i){if(!J(i))throw new k("Graph.replaceAttributes: provided attributes are not a plain object.");return this._attributes=i,this.emit("attributesUpdated",{type:"replace",attributes:this._attributes}),this}mergeAttributes(i){if(!J(i))throw new k("Graph.mergeAttributes: provided attributes are not a plain object.");return Z(this._attributes,i),this.emit("attributesUpdated",{type:"merge",attributes:this._attributes,data:i}),this}updateAttributes(i){if(typeof i!="function")throw new k("Graph.updateAttributes: provided updater is not a function.");return this._attributes=i(this._attributes),this.emit("attributesUpdated",{type:"update",attributes:this._attributes}),this}updateEachNodeAttributes(i,t){if(typeof i!="function")throw new k("Graph.updateEachNodeAttributes: expecting an updater function.");if(t&&!$t(t))throw new k("Graph.updateEachNodeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}");const e=this._nodes.values();let r,a;for(;r=e.next(),r.done!==!0;)a=r.value,a.attributes=i(a.key,a.attributes);this.emit("eachNodeAttributesUpdated",{hints:t||null})}updateEachEdgeAttributes(i,t){if(typeof i!="function")throw new k("Graph.updateEachEdgeAttributes: expecting an updater function.");if(t&&!$t(t))throw new k("Graph.updateEachEdgeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}");const e=this._edges.values();let r,a,o,s;for(;r=e.next(),r.done!==!0;)a=r.value,o=a.source,s=a.target,a.attributes=i(a.key,a.attributes,o.key,s.key,o.attributes,s.attributes,a.undirected);this.emit("eachEdgeAttributesUpdated",{hints:t||null})}forEachAdjacencyEntry(i){if(typeof i!="function")throw new k("Graph.forEachAdjacencyEntry: expecting a callback.");tt(!1,!1,!1,this,i)}forEachAdjacencyEntryWithOrphans(i){if(typeof i!="function")throw new k("Graph.forEachAdjacencyEntryWithOrphans: expecting a callback.");tt(!1,!1,!0,this,i)}forEachAssymetricAdjacencyEntry(i){if(typeof i!="function")throw new k("Graph.forEachAssymetricAdjacencyEntry: expecting a callback.");tt(!1,!0,!1,this,i)}forEachAssymetricAdjacencyEntryWithOrphans(i){if(typeof i!="function")throw new k("Graph.forEachAssymetricAdjacencyEntryWithOrphans: expecting a callback.");tt(!1,!0,!0,this,i)}nodes(){return Array.from(this._nodes.keys())}forEachNode(i){if(typeof i!="function")throw new k("Graph.forEachNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)r=e.value,i(r.key,r.attributes)}findNode(i){if(typeof i!="function")throw new k("Graph.findNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)if(r=e.value,i(r.key,r.attributes))return r.key}mapNodes(i){if(typeof i!="function")throw new k("Graph.mapNode: expecting a callback.");const t=this._nodes.values();let e,r;const a=new Array(this.order);let o=0;for(;e=t.next(),e.done!==!0;)r=e.value,a[o++]=i(r.key,r.attributes);return a}someNode(i){if(typeof i!="function")throw new k("Graph.someNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)if(r=e.value,i(r.key,r.attributes))return!0;return!1}everyNode(i){if(typeof i!="function")throw new k("Graph.everyNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)if(r=e.value,!i(r.key,r.attributes))return!1;return!0}filterNodes(i){if(typeof i!="function")throw new k("Graph.filterNodes: expecting a callback.");const t=this._nodes.values();let e,r;const a=[];for(;e=t.next(),e.done!==!0;)r=e.value,i(r.key,r.attributes)&&a.push(r.key);return a}reduceNodes(i,t){if(typeof i!="function")throw new k("Graph.reduceNodes: expecting a callback.");if(arguments.length<2)throw new k("Graph.reduceNodes: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.");let e=t;const r=this._nodes.values();let a,o;for(;a=r.next(),a.done!==!0;)o=a.value,e=i(e,o.key,o.attributes);return e}nodeEntries(){const i=this._nodes.values();return{[Symbol.iterator](){return this},next(){const t=i.next();if(t.done)return t;const e=t.value;return{value:{node:e.key,attributes:e.attributes},done:!1}}}}export(){const i=new Array(this._nodes.size);let t=0;this._nodes.forEach((r,a)=>{i[t++]=rn(a,r)});const e=new Array(this._edges.size);return t=0,this._edges.forEach((r,a)=>{e[t++]=nn(this.type,a,r)}),{options:{type:this.type,multi:this.multi,allowSelfLoops:this.allowSelfLoops},attributes:this.getAttributes(),nodes:i,edges:e}}import(i,t=!1){if(i instanceof j)return i.forEachNode((u,h)=>{t?this.mergeNode(u,h):this.addNode(u,h)}),i.forEachEdge((u,h,d,l,f,c,y)=>{t?y?this.mergeUndirectedEdgeWithKey(u,d,l,h):this.mergeDirectedEdgeWithKey(u,d,l,h):y?this.addUndirectedEdgeWithKey(u,d,l,h):this.addDirectedEdgeWithKey(u,d,l,h)}),this;if(!J(i))throw new k("Graph.import: invalid argument. Expecting a serialized graph or, alternatively, a Graph instance.");if(i.attributes){if(!J(i.attributes))throw new k("Graph.import: invalid attributes. Expecting a plain object.");t?this.mergeAttributes(i.attributes):this.replaceAttributes(i.attributes)}let e,r,a,o,s;if(i.nodes){if(a=i.nodes,!Array.isArray(a))throw new k("Graph.import: invalid nodes. Expecting an array.");for(e=0,r=a.length;e{const a=Z({},e.attributes);e=new t.NodeDataClass(r,a),t._nodes.set(r,e)}),t}copy(i){if(i=i||{},typeof i.type=="string"&&i.type!==this.type&&i.type!=="mixed")throw new I(`Graph.copy: cannot create an incompatible copy from "${this.type}" type to "${i.type}" because this would mean losing information about the current graph.`);if(typeof i.multi=="boolean"&&i.multi!==this.multi&&i.multi!==!0)throw new I("Graph.copy: cannot create an incompatible copy by downgrading a multi graph to a simple one because this would mean losing information about the current graph.");if(typeof i.allowSelfLoops=="boolean"&&i.allowSelfLoops!==this.allowSelfLoops&&i.allowSelfLoops!==!0)throw new I("Graph.copy: cannot create an incompatible copy from a graph allowing self loops to one that does not because this would mean losing information about the current graph.");const t=this.emptyCopy(i),e=this._edges.values();let r,a;for(;r=e.next(),r.done!==!0;)a=r.value,ki(t,"copy",!1,a.undirected,a.key,a.source.key,a.target.key,Z({},a.attributes));return t}toJSON(){return this.export()}toString(){return"[object Graph]"}inspect(){const i={};this._nodes.forEach((a,o)=>{i[o]=a.attributes});const t={},e={};this._edges.forEach((a,o)=>{const s=a.undirected?"--":"->";let u="",h=a.source.key,d=a.target.key,l;a.undirected&&h>d&&(l=h,h=d,d=l);const f=`(${h})${s}(${d})`;o.startsWith("geid_")?this.multi&&(typeof e[f]>"u"?e[f]=0:e[f]++,u+=`${e[f]}. `):u+=`[${o}]: `,u+=f,t[u]=a.attributes});const r={};for(const a in this)this.hasOwnProperty(a)&&!Bt.has(a)&&typeof this[a]!="function"&&typeof a!="symbol"&&(r[a]=this[a]);return r.attributes=this._attributes,r.nodes=i,r.edges=t,ae(r,"constructor",this.constructor),r}}typeof Symbol<"u"&&(j.prototype[Symbol.for("nodejs.util.inspect.custom")]=j.prototype.inspect);hn.forEach(n=>{["add","merge","update"].forEach(i=>{const t=n.name(i),e=i==="add"?ki:cn;n.generateKey?j.prototype[t]=function(r,a,o){return e(this,t,!0,(n.type||this.type)==="undirected",null,r,a,o,i==="update")}:j.prototype[t]=function(r,a,o,s){return e(this,t,!1,(n.type||this.type)==="undirected",r,a,o,s,i==="update")}})});wr(j);Lr(j);qr(j);tn(j);class Di extends j{constructor(i){const t=Z({type:"directed"},i);if("multi"in t&&t.multi!==!1)throw new k("DirectedGraph.from: inconsistent indication that the graph should be multi in given options!");if(t.type!=="directed")throw new k('DirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}class Li extends j{constructor(i){const t=Z({type:"undirected"},i);if("multi"in t&&t.multi!==!1)throw new k("UndirectedGraph.from: inconsistent indication that the graph should be multi in given options!");if(t.type!=="undirected")throw new k('UndirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}class Gi extends j{constructor(i){const t=Z({multi:!0},i);if("multi"in t&&t.multi!==!0)throw new k("MultiGraph.from: inconsistent indication that the graph should be simple in given options!");super(t)}}class Fi extends j{constructor(i){const t=Z({type:"directed",multi:!0},i);if("multi"in t&&t.multi!==!0)throw new k("MultiDirectedGraph.from: inconsistent indication that the graph should be simple in given options!");if(t.type!=="directed")throw new k('MultiDirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}class Ni extends j{constructor(i){const t=Z({type:"undirected",multi:!0},i);if("multi"in t&&t.multi!==!0)throw new k("MultiUndirectedGraph.from: inconsistent indication that the graph should be simple in given options!");if(t.type!=="undirected")throw new k('MultiUndirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}function Fe(n){n.from=function(i,t){const e=Z({},i.options,t),r=new n(e);return r.import(i),r}}Fe(j);Fe(Di);Fe(Li);Fe(Gi);Fe(Fi);Fe(Ni);j.Graph=j;j.DirectedGraph=Di;j.UndirectedGraph=Li;j.MultiGraph=Gi;j.MultiDirectedGraph=Fi;j.MultiUndirectedGraph=Ni;j.InvalidArgumentsGraphError=k;j.NotFoundGraphError=C;j.UsageGraphError=I;var ft,Ht;function Pi(){return Ht||(Ht=1,ft=function(i){return i!==null&&typeof i=="object"&&typeof i.addUndirectedEdgeWithKey=="function"&&typeof i.dropNode=="function"&&typeof i.multi=="boolean"}),ft}var ze={},Wt;function fn(){if(Wt)return ze;Wt=1;function n(e){return typeof e!="number"||isNaN(e)?1:e}function i(e,r){var a={},o=function(h){return typeof h>"u"?r:h};typeof r=="function"&&(o=r);var s=function(h){return o(h[e])},u=function(){return o(void 0)};return typeof e=="string"?(a.fromAttributes=s,a.fromGraph=function(h,d){return s(h.getNodeAttributes(d))},a.fromEntry=function(h,d){return s(d)}):typeof e=="function"?(a.fromAttributes=function(){throw new Error("graphology-utils/getters/createNodeValueGetter: irrelevant usage.")},a.fromGraph=function(h,d){return o(e(d,h.getNodeAttributes(d)))},a.fromEntry=function(h,d){return o(e(h,d))}):(a.fromAttributes=u,a.fromGraph=u,a.fromEntry=u),a}function t(e,r){var a={},o=function(h){return typeof h>"u"?r:h};typeof r=="function"&&(o=r);var s=function(h){return o(h[e])},u=function(){return o(void 0)};return typeof e=="string"?(a.fromAttributes=s,a.fromGraph=function(h,d){return s(h.getEdgeAttributes(d))},a.fromEntry=function(h,d){return s(d)},a.fromPartialEntry=a.fromEntry,a.fromMinimalEntry=a.fromEntry):typeof e=="function"?(a.fromAttributes=function(){throw new Error("graphology-utils/getters/createEdgeValueGetter: irrelevant usage.")},a.fromGraph=function(h,d){var l=h.extremities(d);return o(e(d,h.getEdgeAttributes(d),l[0],l[1],h.getNodeAttributes(l[0]),h.getNodeAttributes(l[1]),h.isUndirected(d)))},a.fromEntry=function(h,d,l,f,c,y,w){return o(e(h,d,l,f,c,y,w))},a.fromPartialEntry=function(h,d,l,f){return o(e(h,d,l,f))},a.fromMinimalEntry=function(h,d){return o(e(h,d))}):(a.fromAttributes=u,a.fromGraph=u,a.fromEntry=u,a.fromMinimalEntry=u),a}return ze.createNodeValueGetter=i,ze.createEdgeValueGetter=t,ze.createEdgeWeightGetter=function(e){return t(e,n)},ze}var gt,jt;function gn(){if(jt)return gt;jt=1;var n=0,i=1,t=2,e=3,r=4,a=5,o=6,s=7,u=8,h=9,d=0,l=1,f=2,c=0,y=1,w=2,T=3,D=4,m=5,S=6,p=7,b=8,R=3,A=10,G=3,F=9,P=10;return gt=function(z,g,K){var te,x,v,$,W,X,ie,Y,N,Ne,re=g.length,tr=K.length,Pe=z.adjustSizes,ir=z.barnesHutTheta*z.barnesHutTheta,qe,q,B,M,fe,U,O,E=[];for(v=0;vYe?(Ee-=(Ke-Ye)/2,Re=Ee+Ke):(we-=(Ye-Ke)/2,Se=we+Ye),E[0+c]=-1,E[0+y]=(we+Se)/2,E[0+w]=(Ee+Re)/2,E[0+T]=Math.max(Se-we,Re-Ee),E[0+D]=-1,E[0+m]=-1,E[0+S]=0,E[0+p]=0,E[0+b]=0,te=1,v=0;v=0){g[v+n]=0)if(U=Math.pow(g[v+n]-E[x+p],2)+Math.pow(g[v+i]-E[x+b],2),Ne=E[x+T],4*Ne*Ne/U0?(O=q*g[v+o]*E[x+S]/U,g[v+t]+=B*O,g[v+e]+=M*O):U<0&&(O=-q*g[v+o]*E[x+S]/Math.sqrt(U),g[v+t]+=B*O,g[v+e]+=M*O):U>0&&(O=q*g[v+o]*E[x+S]/U,g[v+t]+=B*O,g[v+e]+=M*O),x=E[x+D],x<0)break;continue}else{x=E[x+m];continue}else{if(X=E[x+c],X>=0&&X!==v&&(B=g[v+n]-g[X+n],M=g[v+i]-g[X+i],U=B*B+M*M,Pe===!0?U>0?(O=q*g[v+o]*g[X+o]/U,g[v+t]+=B*O,g[v+e]+=M*O):U<0&&(O=-q*g[v+o]*g[X+o]/Math.sqrt(U),g[v+t]+=B*O,g[v+e]+=M*O):U>0&&(O=q*g[v+o]*g[X+o]/U,g[v+t]+=B*O,g[v+e]+=M*O)),x=E[x+D],x<0)break;continue}else for(q=z.scalingRatio,$=0;$0?(O=q*g[$+o]*g[W+o]/U/U,g[$+t]+=B*O,g[$+e]+=M*O,g[W+t]-=B*O,g[W+e]-=M*O):U<0&&(O=100*q*g[$+o]*g[W+o],g[$+t]+=B*O,g[$+e]+=M*O,g[W+t]-=B*O,g[W+e]-=M*O)):(U=Math.sqrt(B*B+M*M),U>0&&(O=q*g[$+o]*g[W+o]/U/U,g[$+t]+=B*O,g[$+e]+=M*O,g[W+t]-=B*O,g[W+e]-=M*O));for(N=z.gravity/z.scalingRatio,q=z.scalingRatio,v=0;v0&&(O=q*g[v+o]*N):U>0&&(O=q*g[v+o]*N/U),g[v+t]-=B*O,g[v+e]-=M*O;for(q=1*(z.outboundAttractionDistribution?qe:1),ie=0;ie0&&(O=-q*fe*Math.log(1+U)/U/g[$+o]):U>0&&(O=-q*fe*Math.log(1+U)/U):z.outboundAttractionDistribution?U>0&&(O=-q*fe/g[$+o]):U>0&&(O=-q*fe)):(U=Math.sqrt(Math.pow(B,2)+Math.pow(M,2)),z.linLogMode?z.outboundAttractionDistribution?U>0&&(O=-q*fe*Math.log(1+U)/U/g[$+o]):U>0&&(O=-q*fe*Math.log(1+U)/U):z.outboundAttractionDistribution?(U=1,O=-q*fe/g[$+o]):(U=1,O=-q*fe)),U>0&&(g[$+t]+=B*O,g[$+e]+=M*O,g[W+t]-=B*O,g[W+e]-=M*O);var Ze,Ie,Xe,_e,Je,Qe;if(Pe===!0)for(v=0;vP&&(g[v+t]=g[v+t]*P/Ze,g[v+e]=g[v+e]*P/Ze),Ie=g[v+o]*Math.sqrt((g[v+r]-g[v+t])*(g[v+r]-g[v+t])+(g[v+a]-g[v+e])*(g[v+a]-g[v+e])),Xe=Math.sqrt((g[v+r]+g[v+t])*(g[v+r]+g[v+t])+(g[v+a]+g[v+e])*(g[v+a]+g[v+e]))/2,_e=.1*Math.log(1+Xe)/(1+Math.sqrt(Ie)),Je=g[v+n]+g[v+t]*(_e/z.slowDown),g[v+n]=Je,Qe=g[v+i]+g[v+e]*(_e/z.slowDown),g[v+i]=Qe);else for(v=0;v=0)?{message:"the `scalingRatio` setting should be a number >= 0."}:"strongGravityMode"in t&&typeof t.strongGravityMode!="boolean"?{message:"the `strongGravityMode` setting should be a boolean."}:"gravity"in t&&!(typeof t.gravity=="number"&&t.gravity>=0)?{message:"the `gravity` setting should be a number >= 0."}:"slowDown"in t&&!(typeof t.slowDown=="number"||t.slowDown>=0)?{message:"the `slowDown` setting should be a number >= 0."}:"barnesHutOptimize"in t&&typeof t.barnesHutOptimize!="boolean"?{message:"the `barnesHutOptimize` setting should be a boolean."}:"barnesHutTheta"in t&&!(typeof t.barnesHutTheta=="number"&&t.barnesHutTheta>=0)?{message:"the `barnesHutTheta` setting should be a number >= 0."}:null},ge.graphToByteArrays=function(t,e){var r=t.order,a=t.size,o={},s,u=new Float32Array(r*n),h=new Float32Array(a*i);return s=0,t.forEachNode(function(d,l){o[d]=s,u[s]=l.x,u[s+1]=l.y,u[s+2]=0,u[s+3]=0,u[s+4]=0,u[s+5]=0,u[s+6]=1,u[s+7]=1,u[s+8]=l.size||1,u[s+9]=l.fixed?1:0,s+=n}),s=0,t.forEachEdge(function(d,l,f,c,y,w,T){var D=o[f],m=o[c],S=e(d,l,f,c,y,w,T);u[D+6]+=S,u[m+6]+=S,h[s]=D,h[s+1]=m,h[s+2]=S,s+=i}),{nodes:u,edges:h}},ge.assignLayoutChanges=function(t,e,r){var a=0;t.updateEachNodeAttributes(function(o,s){return s.x=e[a],s.y=e[a+1],a+=n,r?r(o,s):s})},ge.readGraphPositions=function(t,e){var r=0;t.forEachNode(function(a,o){e[r]=o.x,e[r+1]=o.y,r+=n})},ge.collectLayoutChanges=function(t,e,r){for(var a=t.nodes(),o={},s=0,u=0,h=e.length;s2e3,strongGravityMode:!0,gravity:.05,scalingRatio:10,slowDown:1+Math.log(h)}}var s=a.bind(null,!1);return s.assign=a.bind(null,!0),s.inferSettings=o,vt=s,vt}var yn=mn();const it=bi(yn);function bn(n,i){if(typeof n!="object"||!n)return n;var t=n[Symbol.toPrimitive];if(t!==void 0){var e=t.call(n,i);if(typeof e!="object")return e;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(n)}function je(n){var i=bn(n,"string");return typeof i=="symbol"?i:i+""}function Q(n,i){if(!(n instanceof i))throw new TypeError("Cannot call a class as a function")}function Yt(n,i){for(var t=0;tn.length)&&(i=n.length);for(var t=0,e=Array(i);t0&&(P=R[0]),P instanceof Error)throw P;var V=new Error("Unhandled error."+(P?" ("+P.message+")":""));throw V.context=P,V}var z=F[b];if(z===void 0)return!1;if(typeof z=="function")i(z,this,R);else for(var g=z.length,K=y(z,g),A=0;A0&&P.length>G&&!P.warned){P.warned=!0;var V=new Error("Possible EventEmitter memory leak detected. "+P.length+" "+String(b)+" listeners added. Use emitter.setMaxListeners() to increase limit");V.name="MaxListenersExceededWarning",V.emitter=p,V.type=b,V.count=P.length,e(V)}return p}a.prototype.addListener=function(b,R){return h(this,b,R,!1)},a.prototype.on=a.prototype.addListener,a.prototype.prependListener=function(b,R){return h(this,b,R,!0)};function d(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function l(p,b,R){var A={fired:!1,wrapFn:void 0,target:p,type:b,listener:R},G=d.bind(A);return G.listener=R,A.wrapFn=G,G}a.prototype.once=function(b,R){return s(R),this.on(b,l(this,b,R)),this},a.prototype.prependOnceListener=function(b,R){return s(R),this.prependListener(b,l(this,b,R)),this},a.prototype.removeListener=function(b,R){var A,G,F,P,V;if(s(R),G=this._events,G===void 0)return this;if(A=G[b],A===void 0)return this;if(A===R||A.listener===R)--this._eventsCount===0?this._events=Object.create(null):(delete G[b],G.removeListener&&this.emit("removeListener",b,A.listener||R));else if(typeof A!="function"){for(F=-1,P=A.length-1;P>=0;P--)if(A[P]===R||A[P].listener===R){V=A[P].listener,F=P;break}if(F<0)return this;F===0?A.shift():w(A,F),A.length===1&&(G[b]=A[0]),G.removeListener!==void 0&&this.emit("removeListener",b,V||R)}return this},a.prototype.off=a.prototype.removeListener,a.prototype.removeAllListeners=function(b){var R,A,G;if(A=this._events,A===void 0)return this;if(A.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):A[b]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete A[b]),this;if(arguments.length===0){var F=Object.keys(A),P;for(G=0;G=0;G--)this.removeListener(b,R[G]);return this};function f(p,b,R){var A=p._events;if(A===void 0)return[];var G=A[b];return G===void 0?[]:typeof G=="function"?R?[G.listener||G]:[G]:R?T(G):y(G,G.length)}a.prototype.listeners=function(b){return f(this,b,!0)},a.prototype.rawListeners=function(b){return f(this,b,!1)},a.listenerCount=function(p,b){return typeof p.listenerCount=="function"?p.listenerCount(b):c.call(p,b)},a.prototype.listenerCount=c;function c(p){var b=this._events;if(b!==void 0){var R=b[p];if(typeof R=="function")return 1;if(R!==void 0)return R.length}return 0}a.prototype.eventNames=function(){return this._eventsCount>0?t(this._events):[]};function y(p,b){for(var R=new Array(b),A=0;An++}function me(){const n=arguments;let i=null,t=-1;return{[Symbol.iterator](){return this},next(){let e=null;do{if(i===null){if(t++,t>=n.length)return{done:!0};i=n[t][Symbol.iterator]()}if(e=i.next(),e.done){i=null;continue}break}while(!0);return e}}}function Le(){return{[Symbol.iterator](){return this},next(){return{done:!0}}}}class Lt extends Error{constructor(i){super(),this.name="GraphError",this.message=i}}class k extends Lt{constructor(i){super(i),this.name="InvalidArgumentsGraphError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,k.prototype.constructor)}}class C extends Lt{constructor(i){super(i),this.name="NotFoundGraphError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,C.prototype.constructor)}}class I extends Lt{constructor(i){super(i),this.name="UsageGraphError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,I.prototype.constructor)}}function _i(n,i){this.key=n,this.attributes=i,this.clear()}_i.prototype.clear=function(){this.inDegree=0,this.outDegree=0,this.undirectedDegree=0,this.undirectedLoops=0,this.directedLoops=0,this.in={},this.out={},this.undirected={}};function Ti(n,i){this.key=n,this.attributes=i,this.clear()}Ti.prototype.clear=function(){this.inDegree=0,this.outDegree=0,this.directedLoops=0,this.in={},this.out={}};function Si(n,i){this.key=n,this.attributes=i,this.clear()}Si.prototype.clear=function(){this.undirectedDegree=0,this.undirectedLoops=0,this.undirected={}};function Ge(n,i,t,e,r){this.key=i,this.attributes=r,this.undirected=n,this.source=t,this.target=e}Ge.prototype.attach=function(){let n="out",i="in";this.undirected&&(n=i="undirected");const t=this.source.key,e=this.target.key;this.source[n][e]=this,!(this.undirected&&t===e)&&(this.target[i][t]=this)};Ge.prototype.attachMulti=function(){let n="out",i="in";const t=this.source.key,e=this.target.key;this.undirected&&(n=i="undirected");const r=this.source[n],a=r[e];if(typeof a>"u"){r[e]=this,this.undirected&&t===e||(this.target[i][t]=this);return}a.previous=this,this.next=a,r[e]=this,this.target[i][t]=this};Ge.prototype.detach=function(){const n=this.source.key,i=this.target.key;let t="out",e="in";this.undirected&&(t=e="undirected"),delete this.source[t][i],delete this.target[e][n]};Ge.prototype.detachMulti=function(){const n=this.source.key,i=this.target.key;let t="out",e="in";this.undirected&&(t=e="undirected"),this.previous===void 0?this.next===void 0?(delete this.source[t][i],delete this.target[e][n]):(this.next.previous=void 0,this.source[t][i]=this.next,this.target[e][n]=this.next):(this.previous.next=this.next,this.next!==void 0&&(this.next.previous=this.previous))};const Ri=0,Ai=1,hr=2,xi=3;function ye(n,i,t,e,r,a,o){let s,u,h,d;if(e=""+e,t===Ri){if(s=n._nodes.get(e),!s)throw new C(`Graph.${i}: could not find the "${e}" node in the graph.`);h=r,d=a}else if(t===xi){if(r=""+r,u=n._edges.get(r),!u)throw new C(`Graph.${i}: could not find the "${r}" edge in the graph.`);const l=u.source.key,f=u.target.key;if(e===l)s=u.target;else if(e===f)s=u.source;else throw new C(`Graph.${i}: the "${e}" node is not attached to the "${r}" edge (${l}, ${f}).`);h=a,d=o}else{if(u=n._edges.get(e),!u)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`);t===Ai?s=u.source:s=u.target,h=r,d=a}return[s,h,d]}function dr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);return o.attributes[s]}}function lr(n,i,t){n.prototype[i]=function(e,r){const[a]=ye(this,i,t,e,r);return a.attributes}}function cr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);return o.attributes.hasOwnProperty(s)}}function fr(n,i,t){n.prototype[i]=function(e,r,a,o){const[s,u,h]=ye(this,i,t,e,r,a,o);return s.attributes[u]=h,this.emit("nodeAttributesUpdated",{key:s.key,type:"set",attributes:s.attributes,name:u}),this}}function gr(n,i,t){n.prototype[i]=function(e,r,a,o){const[s,u,h]=ye(this,i,t,e,r,a,o);if(typeof h!="function")throw new k(`Graph.${i}: updater should be a function.`);const d=s.attributes,l=h(d[u]);return d[u]=l,this.emit("nodeAttributesUpdated",{key:s.key,type:"set",attributes:s.attributes,name:u}),this}}function pr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);return delete o.attributes[s],this.emit("nodeAttributesUpdated",{key:o.key,type:"remove",attributes:o.attributes,name:s}),this}}function vr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);if(!J(s))throw new k(`Graph.${i}: provided attributes are not a plain object.`);return o.attributes=s,this.emit("nodeAttributesUpdated",{key:o.key,type:"replace",attributes:o.attributes}),this}}function mr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);if(!J(s))throw new k(`Graph.${i}: provided attributes are not a plain object.`);return Z(o.attributes,s),this.emit("nodeAttributesUpdated",{key:o.key,type:"merge",attributes:o.attributes,data:s}),this}}function yr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ye(this,i,t,e,r,a);if(typeof s!="function")throw new k(`Graph.${i}: provided updater is not a function.`);return o.attributes=s(o.attributes),this.emit("nodeAttributesUpdated",{key:o.key,type:"update",attributes:o.attributes}),this}}const br=[{name:n=>`get${n}Attribute`,attacher:dr},{name:n=>`get${n}Attributes`,attacher:lr},{name:n=>`has${n}Attribute`,attacher:cr},{name:n=>`set${n}Attribute`,attacher:fr},{name:n=>`update${n}Attribute`,attacher:gr},{name:n=>`remove${n}Attribute`,attacher:pr},{name:n=>`replace${n}Attributes`,attacher:vr},{name:n=>`merge${n}Attributes`,attacher:mr},{name:n=>`update${n}Attributes`,attacher:yr}];function wr(n){br.forEach(function({name:i,attacher:t}){t(n,i("Node"),Ri),t(n,i("Source"),Ai),t(n,i("Target"),hr),t(n,i("Opposite"),xi)})}function Er(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return a.attributes[r]}}function _r(n,i,t){n.prototype[i]=function(e){let r;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>1){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const a=""+e,o=""+arguments[1];if(r=oe(this,a,o,t),!r)throw new C(`Graph.${i}: could not find an edge for the given path ("${a}" - "${o}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,r=this._edges.get(e),!r)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return r.attributes}}function Tr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return a.attributes.hasOwnProperty(r)}}function Sr(n,i,t){n.prototype[i]=function(e,r,a){let o;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>3){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const s=""+e,u=""+r;if(r=arguments[2],a=arguments[3],o=oe(this,s,u,t),!o)throw new C(`Graph.${i}: could not find an edge for the given path ("${s}" - "${u}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,o=this._edges.get(e),!o)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return o.attributes[r]=a,this.emit("edgeAttributesUpdated",{key:o.key,type:"set",attributes:o.attributes,name:r}),this}}function Rr(n,i,t){n.prototype[i]=function(e,r,a){let o;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>3){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const s=""+e,u=""+r;if(r=arguments[2],a=arguments[3],o=oe(this,s,u,t),!o)throw new C(`Graph.${i}: could not find an edge for the given path ("${s}" - "${u}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,o=this._edges.get(e),!o)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(typeof a!="function")throw new k(`Graph.${i}: updater should be a function.`);return o.attributes[r]=a(o.attributes[r]),this.emit("edgeAttributesUpdated",{key:o.key,type:"set",attributes:o.attributes,name:r}),this}}function Ar(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return delete a.attributes[r],this.emit("edgeAttributesUpdated",{key:a.key,type:"remove",attributes:a.attributes,name:r}),this}}function xr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(!J(r))throw new k(`Graph.${i}: provided attributes are not a plain object.`);return a.attributes=r,this.emit("edgeAttributesUpdated",{key:a.key,type:"replace",attributes:a.attributes}),this}}function Cr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(!J(r))throw new k(`Graph.${i}: provided attributes are not a plain object.`);return Z(a.attributes,r),this.emit("edgeAttributesUpdated",{key:a.key,type:"merge",attributes:a.attributes,data:r}),this}}function kr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new C(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new C(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(typeof r!="function")throw new k(`Graph.${i}: provided updater is not a function.`);return a.attributes=r(a.attributes),this.emit("edgeAttributesUpdated",{key:a.key,type:"update",attributes:a.attributes}),this}}const Dr=[{name:n=>`get${n}Attribute`,attacher:Er},{name:n=>`get${n}Attributes`,attacher:_r},{name:n=>`has${n}Attribute`,attacher:Tr},{name:n=>`set${n}Attribute`,attacher:Sr},{name:n=>`update${n}Attribute`,attacher:Rr},{name:n=>`remove${n}Attribute`,attacher:Ar},{name:n=>`replace${n}Attributes`,attacher:xr},{name:n=>`merge${n}Attributes`,attacher:Cr},{name:n=>`update${n}Attributes`,attacher:kr}];function Lr(n){Dr.forEach(function({name:i,attacher:t}){t(n,i("Edge"),"mixed"),t(n,i("DirectedEdge"),"directed"),t(n,i("UndirectedEdge"),"undirected")})}const Gr=[{name:"edges",type:"mixed"},{name:"inEdges",type:"directed",direction:"in"},{name:"outEdges",type:"directed",direction:"out"},{name:"inboundEdges",type:"mixed",direction:"in"},{name:"outboundEdges",type:"mixed",direction:"out"},{name:"directedEdges",type:"directed"},{name:"undirectedEdges",type:"undirected"}];function Fr(n,i,t,e){let r=!1;for(const a in i){if(a===e)continue;const o=i[a];if(r=t(o.key,o.attributes,o.source.key,o.target.key,o.source.attributes,o.target.attributes,o.undirected),n&&r)return o.key}}function Nr(n,i,t,e){let r,a,o,s=!1;for(const u in i)if(u!==e){r=i[u];do{if(a=r.source,o=r.target,s=t(r.key,r.attributes,a.key,o.key,a.attributes,o.attributes,r.undirected),n&&s)return r.key;r=r.next}while(r!==void 0)}}function lt(n,i){const t=Object.keys(n),e=t.length;let r,a=0;return{[Symbol.iterator](){return this},next(){do if(r)r=r.next;else{if(a>=e)return{done:!0};const o=t[a++];if(o===i){r=void 0;continue}r=n[o]}while(!r);return{done:!1,value:{edge:r.key,attributes:r.attributes,source:r.source.key,target:r.target.key,sourceAttributes:r.source.attributes,targetAttributes:r.target.attributes,undirected:r.undirected}}}}}function Pr(n,i,t,e){const r=i[t];if(!r)return;const a=r.source,o=r.target;if(e(r.key,r.attributes,a.key,o.key,a.attributes,o.attributes,r.undirected)&&n)return r.key}function Ir(n,i,t,e){let r=i[t];if(!r)return;let a=!1;do{if(a=e(r.key,r.attributes,r.source.key,r.target.key,r.source.attributes,r.target.attributes,r.undirected),n&&a)return r.key;r=r.next}while(r!==void 0)}function ct(n,i){let t=n[i];if(t.next!==void 0)return{[Symbol.iterator](){return this},next(){if(!t)return{done:!0};const r={edge:t.key,attributes:t.attributes,source:t.source.key,target:t.target.key,sourceAttributes:t.source.attributes,targetAttributes:t.target.attributes,undirected:t.undirected};return t=t.next,{done:!1,value:r}}};let e=!1;return{[Symbol.iterator](){return this},next(){return e===!0?{done:!0}:(e=!0,{done:!1,value:{edge:t.key,attributes:t.attributes,source:t.source.key,target:t.target.key,sourceAttributes:t.source.attributes,targetAttributes:t.target.attributes,undirected:t.undirected}})}}}function Or(n,i){if(n.size===0)return[];if(i==="mixed"||i===n.type)return Array.from(n._edges.keys());const t=i==="undirected"?n.undirectedSize:n.directedSize,e=new Array(t),r=i==="undirected",a=n._edges.values();let o=0,s,u;for(;s=a.next(),s.done!==!0;)u=s.value,u.undirected===r&&(e[o++]=u.key);return e}function Ci(n,i,t,e){if(i.size===0)return;const r=t!=="mixed"&&t!==i.type,a=t==="undirected";let o,s,u=!1;const h=i._edges.values();for(;o=h.next(),o.done!==!0;){if(s=o.value,r&&s.undirected!==a)continue;const{key:d,attributes:l,source:f,target:c}=s;if(u=e(d,l,f.key,c.key,f.attributes,c.attributes,s.undirected),n&&u)return d}}function Ur(n,i){if(n.size===0)return Le();const t=i!=="mixed"&&i!==n.type,e=i==="undirected",r=n._edges.values();return{[Symbol.iterator](){return this},next(){let a,o;for(;;){if(a=r.next(),a.done)return a;if(o=a.value,!(t&&o.undirected!==e))break}return{value:{edge:o.key,attributes:o.attributes,source:o.source.key,target:o.target.key,sourceAttributes:o.source.attributes,targetAttributes:o.target.attributes,undirected:o.undirected},done:!1}}}}function Gt(n,i,t,e,r,a){const o=i?Nr:Fr;let s;if(t!=="undirected"&&(e!=="out"&&(s=o(n,r.in,a),n&&s)||e!=="in"&&(s=o(n,r.out,a,e?void 0:r.key),n&&s))||t!=="directed"&&(s=o(n,r.undirected,a),n&&s))return s}function zr(n,i,t,e){const r=[];return Gt(!1,n,i,t,e,function(a){r.push(a)}),r}function $r(n,i,t){let e=Le();return n!=="undirected"&&(i!=="out"&&typeof t.in<"u"&&(e=me(e,lt(t.in))),i!=="in"&&typeof t.out<"u"&&(e=me(e,lt(t.out,i?void 0:t.key)))),n!=="directed"&&typeof t.undirected<"u"&&(e=me(e,lt(t.undirected))),e}function Ft(n,i,t,e,r,a,o){const s=t?Ir:Pr;let u;if(i!=="undirected"&&(typeof r.in<"u"&&e!=="out"&&(u=s(n,r.in,a,o),n&&u)||typeof r.out<"u"&&e!=="in"&&(e||r.key!==a)&&(u=s(n,r.out,a,o),n&&u))||i!=="directed"&&typeof r.undirected<"u"&&(u=s(n,r.undirected,a,o),n&&u))return u}function Br(n,i,t,e,r){const a=[];return Ft(!1,n,i,t,e,r,function(o){a.push(o)}),a}function Mr(n,i,t,e){let r=Le();return n!=="undirected"&&(typeof t.in<"u"&&i!=="out"&&e in t.in&&(r=me(r,ct(t.in,e))),typeof t.out<"u"&&i!=="in"&&e in t.out&&(i||t.key!==e)&&(r=me(r,ct(t.out,e)))),n!=="directed"&&typeof t.undirected<"u"&&e in t.undirected&&(r=me(r,ct(t.undirected,e))),r}function Hr(n,i){const{name:t,type:e,direction:r}=i;n.prototype[t]=function(a,o){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return[];if(!arguments.length)return Or(this,e);if(arguments.length===1){a=""+a;const s=this._nodes.get(a);if(typeof s>"u")throw new C(`Graph.${t}: could not find the "${a}" node in the graph.`);return zr(this.multi,e==="mixed"?this.type:e,r,s)}if(arguments.length===2){a=""+a,o=""+o;const s=this._nodes.get(a);if(!s)throw new C(`Graph.${t}: could not find the "${a}" source node in the graph.`);if(!this._nodes.has(o))throw new C(`Graph.${t}: could not find the "${o}" target node in the graph.`);return Br(e,this.multi,r,s,o)}throw new k(`Graph.${t}: too many arguments (expecting 0, 1 or 2 and got ${arguments.length}).`)}}function Wr(n,i){const{name:t,type:e,direction:r}=i,a="forEach"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[a]=function(h,d,l){if(!(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)){if(arguments.length===1)return l=h,Ci(!1,this,e,l);if(arguments.length===2){h=""+h,l=d;const f=this._nodes.get(h);if(typeof f>"u")throw new C(`Graph.${a}: could not find the "${h}" node in the graph.`);return Gt(!1,this.multi,e==="mixed"?this.type:e,r,f,l)}if(arguments.length===3){h=""+h,d=""+d;const f=this._nodes.get(h);if(!f)throw new C(`Graph.${a}: could not find the "${h}" source node in the graph.`);if(!this._nodes.has(d))throw new C(`Graph.${a}: could not find the "${d}" target node in the graph.`);return Ft(!1,e,this.multi,r,f,d,l)}throw new k(`Graph.${a}: too many arguments (expecting 1, 2 or 3 and got ${arguments.length}).`)}};const o="map"+t[0].toUpperCase()+t.slice(1);n.prototype[o]=function(){const h=Array.prototype.slice.call(arguments),d=h.pop();let l;if(h.length===0){let f=0;e!=="directed"&&(f+=this.undirectedSize),e!=="undirected"&&(f+=this.directedSize),l=new Array(f);let c=0;h.push((y,w,T,D,m,S,p)=>{l[c++]=d(y,w,T,D,m,S,p)})}else l=[],h.push((f,c,y,w,T,D,m)=>{l.push(d(f,c,y,w,T,D,m))});return this[a].apply(this,h),l};const s="filter"+t[0].toUpperCase()+t.slice(1);n.prototype[s]=function(){const h=Array.prototype.slice.call(arguments),d=h.pop(),l=[];return h.push((f,c,y,w,T,D,m)=>{d(f,c,y,w,T,D,m)&&l.push(f)}),this[a].apply(this,h),l};const u="reduce"+t[0].toUpperCase()+t.slice(1);n.prototype[u]=function(){let h=Array.prototype.slice.call(arguments);if(h.length<2||h.length>4)throw new k(`Graph.${u}: invalid number of arguments (expecting 2, 3 or 4 and got ${h.length}).`);if(typeof h[h.length-1]=="function"&&typeof h[h.length-2]!="function")throw new k(`Graph.${u}: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.`);let d,l;h.length===2?(d=h[0],l=h[1],h=[]):h.length===3?(d=h[1],l=h[2],h=[h[0]]):h.length===4&&(d=h[2],l=h[3],h=[h[0],h[1]]);let f=l;return h.push((c,y,w,T,D,m,S)=>{f=d(f,c,y,w,T,D,m,S)}),this[a].apply(this,h),f}}function jr(n,i){const{name:t,type:e,direction:r}=i,a="find"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[a]=function(u,h,d){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return!1;if(arguments.length===1)return d=u,Ci(!0,this,e,d);if(arguments.length===2){u=""+u,d=h;const l=this._nodes.get(u);if(typeof l>"u")throw new C(`Graph.${a}: could not find the "${u}" node in the graph.`);return Gt(!0,this.multi,e==="mixed"?this.type:e,r,l,d)}if(arguments.length===3){u=""+u,h=""+h;const l=this._nodes.get(u);if(!l)throw new C(`Graph.${a}: could not find the "${u}" source node in the graph.`);if(!this._nodes.has(h))throw new C(`Graph.${a}: could not find the "${h}" target node in the graph.`);return Ft(!0,e,this.multi,r,l,h,d)}throw new k(`Graph.${a}: too many arguments (expecting 1, 2 or 3 and got ${arguments.length}).`)};const o="some"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[o]=function(){const u=Array.prototype.slice.call(arguments),h=u.pop();return u.push((l,f,c,y,w,T,D)=>h(l,f,c,y,w,T,D)),!!this[a].apply(this,u)};const s="every"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[s]=function(){const u=Array.prototype.slice.call(arguments),h=u.pop();return u.push((l,f,c,y,w,T,D)=>!h(l,f,c,y,w,T,D)),!this[a].apply(this,u)}}function Vr(n,i){const{name:t,type:e,direction:r}=i,a=t.slice(0,-1)+"Entries";n.prototype[a]=function(o,s){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return Le();if(!arguments.length)return Ur(this,e);if(arguments.length===1){o=""+o;const u=this._nodes.get(o);if(!u)throw new C(`Graph.${a}: could not find the "${o}" node in the graph.`);return $r(e,r,u)}if(arguments.length===2){o=""+o,s=""+s;const u=this._nodes.get(o);if(!u)throw new C(`Graph.${a}: could not find the "${o}" source node in the graph.`);if(!this._nodes.has(s))throw new C(`Graph.${a}: could not find the "${s}" target node in the graph.`);return Mr(e,r,u,s)}throw new k(`Graph.${a}: too many arguments (expecting 0, 1 or 2 and got ${arguments.length}).`)}}function qr(n){Gr.forEach(i=>{Hr(n,i),Wr(n,i),jr(n,i),Vr(n,i)})}const Kr=[{name:"neighbors",type:"mixed"},{name:"inNeighbors",type:"directed",direction:"in"},{name:"outNeighbors",type:"directed",direction:"out"},{name:"inboundNeighbors",type:"mixed",direction:"in"},{name:"outboundNeighbors",type:"mixed",direction:"out"},{name:"directedNeighbors",type:"directed"},{name:"undirectedNeighbors",type:"undirected"}];function ut(){this.A=null,this.B=null}ut.prototype.wrap=function(n){this.A===null?this.A=n:this.B===null&&(this.B=n)};ut.prototype.has=function(n){return this.A!==null&&n in this.A||this.B!==null&&n in this.B};function Oe(n,i,t,e,r){for(const a in e){const o=e[a],s=o.source,u=o.target,h=s===t?u:s;if(i&&i.has(h.key))continue;const d=r(h.key,h.attributes);if(n&&d)return h.key}}function Nt(n,i,t,e,r){if(i!=="mixed"){if(i==="undirected")return Oe(n,null,e,e.undirected,r);if(typeof t=="string")return Oe(n,null,e,e[t],r)}const a=new ut;let o;if(i!=="undirected"){if(t!=="out"){if(o=Oe(n,null,e,e.in,r),n&&o)return o;a.wrap(e.in)}if(t!=="in"){if(o=Oe(n,a,e,e.out,r),n&&o)return o;a.wrap(e.out)}}if(i!=="directed"&&(o=Oe(n,a,e,e.undirected,r),n&&o))return o}function Yr(n,i,t){if(n!=="mixed"){if(n==="undirected")return Object.keys(t.undirected);if(typeof i=="string")return Object.keys(t[i])}const e=[];return Nt(!1,n,i,t,function(r){e.push(r)}),e}function Ue(n,i,t){const e=Object.keys(t),r=e.length;let a=0;return{[Symbol.iterator](){return this},next(){let o=null;do{if(a>=r)return n&&n.wrap(t),{done:!0};const s=t[e[a++]],u=s.source,h=s.target;if(o=u===i?h:u,n&&n.has(o.key)){o=null;continue}}while(o===null);return{done:!1,value:{neighbor:o.key,attributes:o.attributes}}}}}function Zr(n,i,t){if(n!=="mixed"){if(n==="undirected")return Ue(null,t,t.undirected);if(typeof i=="string")return Ue(null,t,t[i])}let e=Le();const r=new ut;return n!=="undirected"&&(i!=="out"&&(e=me(e,Ue(r,t,t.in))),i!=="in"&&(e=me(e,Ue(r,t,t.out)))),n!=="directed"&&(e=me(e,Ue(r,t,t.undirected))),e}function Xr(n,i){const{name:t,type:e,direction:r}=i;n.prototype[t]=function(a){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return[];a=""+a;const o=this._nodes.get(a);if(typeof o>"u")throw new C(`Graph.${t}: could not find the "${a}" node in the graph.`);return Yr(e==="mixed"?this.type:e,r,o)}}function Jr(n,i){const{name:t,type:e,direction:r}=i,a="forEach"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[a]=function(h,d){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return;h=""+h;const l=this._nodes.get(h);if(typeof l>"u")throw new C(`Graph.${a}: could not find the "${h}" node in the graph.`);Nt(!1,e==="mixed"?this.type:e,r,l,d)};const o="map"+t[0].toUpperCase()+t.slice(1);n.prototype[o]=function(h,d){const l=[];return this[a](h,(f,c)=>{l.push(d(f,c))}),l};const s="filter"+t[0].toUpperCase()+t.slice(1);n.prototype[s]=function(h,d){const l=[];return this[a](h,(f,c)=>{d(f,c)&&l.push(f)}),l};const u="reduce"+t[0].toUpperCase()+t.slice(1);n.prototype[u]=function(h,d,l){if(arguments.length<3)throw new k(`Graph.${u}: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.`);let f=l;return this[a](h,(c,y)=>{f=d(f,c,y)}),f}}function Qr(n,i){const{name:t,type:e,direction:r}=i,a=t[0].toUpperCase()+t.slice(1,-1),o="find"+a;n.prototype[o]=function(h,d){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return;h=""+h;const l=this._nodes.get(h);if(typeof l>"u")throw new C(`Graph.${o}: could not find the "${h}" node in the graph.`);return Nt(!0,e==="mixed"?this.type:e,r,l,d)};const s="some"+a;n.prototype[s]=function(h,d){return!!this[o](h,d)};const u="every"+a;n.prototype[u]=function(h,d){return!this[o](h,(f,c)=>!d(f,c))}}function en(n,i){const{name:t,type:e,direction:r}=i,a=t.slice(0,-1)+"Entries";n.prototype[a]=function(o){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return Le();o=""+o;const s=this._nodes.get(o);if(typeof s>"u")throw new C(`Graph.${a}: could not find the "${o}" node in the graph.`);return Zr(e==="mixed"?this.type:e,r,s)}}function tn(n){Kr.forEach(i=>{Xr(n,i),Jr(n,i),Qr(n,i),en(n,i)})}function tt(n,i,t,e,r){const a=e._nodes.values(),o=e.type;let s,u,h,d,l,f;for(;s=a.next(),s.done!==!0;){let c=!1;if(u=s.value,o!=="undirected"){d=u.out;for(h in d){l=d[h];do f=l.target,c=!0,r(u.key,f.key,u.attributes,f.attributes,l.key,l.attributes,l.undirected),l=l.next;while(l)}}if(o!=="directed"){d=u.undirected;for(h in d)if(!(i&&u.key>h)){l=d[h];do f=l.target,f.key!==h&&(f=l.source),c=!0,r(u.key,f.key,u.attributes,f.attributes,l.key,l.attributes,l.undirected),l=l.next;while(l)}}t&&!c&&r(u.key,null,u.attributes,null,null,null,null)}}function rn(n,i){const t={key:n};return Ei(i.attributes)||(t.attributes=Z({},i.attributes)),t}function nn(n,i,t){const e={key:i,source:t.source.key,target:t.target.key};return Ei(t.attributes)||(e.attributes=Z({},t.attributes)),n==="mixed"&&t.undirected&&(e.undirected=!0),e}function an(n){if(!J(n))throw new k('Graph.import: invalid serialized node. A serialized node should be a plain object with at least a "key" property.');if(!("key"in n))throw new k("Graph.import: serialized node is missing its key.");if("attributes"in n&&(!J(n.attributes)||n.attributes===null))throw new k("Graph.import: invalid attributes. Attributes should be a plain object, null or omitted.")}function on(n){if(!J(n))throw new k('Graph.import: invalid serialized edge. A serialized edge should be a plain object with at least a "source" & "target" property.');if(!("source"in n))throw new k("Graph.import: serialized edge is missing its source.");if(!("target"in n))throw new k("Graph.import: serialized edge is missing its target.");if("attributes"in n&&(!J(n.attributes)||n.attributes===null))throw new k("Graph.import: invalid attributes. Attributes should be a plain object, null or omitted.");if("undirected"in n&&typeof n.undirected!="boolean")throw new k("Graph.import: invalid undirectedness information. Undirected should be boolean or omitted.")}const sn=ur(),un=new Set(["directed","undirected","mixed"]),Bt=new Set(["domain","_events","_eventsCount","_maxListeners"]),hn=[{name:n=>`${n}Edge`,generateKey:!0},{name:n=>`${n}DirectedEdge`,generateKey:!0,type:"directed"},{name:n=>`${n}UndirectedEdge`,generateKey:!0,type:"undirected"},{name:n=>`${n}EdgeWithKey`},{name:n=>`${n}DirectedEdgeWithKey`,type:"directed"},{name:n=>`${n}UndirectedEdgeWithKey`,type:"undirected"}],dn={allowSelfLoops:!0,multi:!1,type:"mixed"};function ln(n,i,t){if(t&&!J(t))throw new k(`Graph.addNode: invalid attributes. Expecting an object but got "${t}"`);if(i=""+i,t=t||{},n._nodes.has(i))throw new I(`Graph.addNode: the "${i}" node already exist in the graph.`);const e=new n.NodeDataClass(i,t);return n._nodes.set(i,e),n.emit("nodeAdded",{key:i,attributes:t}),e}function Mt(n,i,t){const e=new n.NodeDataClass(i,t);return n._nodes.set(i,e),n.emit("nodeAdded",{key:i,attributes:t}),e}function ki(n,i,t,e,r,a,o,s){if(!e&&n.type==="undirected")throw new I(`Graph.${i}: you cannot add a directed edge to an undirected graph. Use the #.addEdge or #.addUndirectedEdge instead.`);if(e&&n.type==="directed")throw new I(`Graph.${i}: you cannot add an undirected edge to a directed graph. Use the #.addEdge or #.addDirectedEdge instead.`);if(s&&!J(s))throw new k(`Graph.${i}: invalid attributes. Expecting an object but got "${s}"`);if(a=""+a,o=""+o,s=s||{},!n.allowSelfLoops&&a===o)throw new I(`Graph.${i}: source & target are the same ("${a}"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.`);const u=n._nodes.get(a),h=n._nodes.get(o);if(!u)throw new C(`Graph.${i}: source node "${a}" not found.`);if(!h)throw new C(`Graph.${i}: target node "${o}" not found.`);const d={key:null,undirected:e,source:a,target:o,attributes:s};if(t)r=n._edgeKeyGenerator();else if(r=""+r,n._edges.has(r))throw new I(`Graph.${i}: the "${r}" edge already exists in the graph.`);if(!n.multi&&(e?typeof u.undirected[o]<"u":typeof u.out[o]<"u"))throw new I(`Graph.${i}: an edge linking "${a}" to "${o}" already exists. If you really want to add multiple edges linking those nodes, you should create a multi graph by using the 'multi' option.`);const l=new Ge(e,r,u,h,s);n._edges.set(r,l);const f=a===o;return e?(u.undirectedDegree++,h.undirectedDegree++,f&&(u.undirectedLoops++,n._undirectedSelfLoopCount++)):(u.outDegree++,h.inDegree++,f&&(u.directedLoops++,n._directedSelfLoopCount++)),n.multi?l.attachMulti():l.attach(),e?n._undirectedSize++:n._directedSize++,d.key=r,n.emit("edgeAdded",d),r}function cn(n,i,t,e,r,a,o,s,u){if(!e&&n.type==="undirected")throw new I(`Graph.${i}: you cannot merge/update a directed edge to an undirected graph. Use the #.mergeEdge/#.updateEdge or #.addUndirectedEdge instead.`);if(e&&n.type==="directed")throw new I(`Graph.${i}: you cannot merge/update an undirected edge to a directed graph. Use the #.mergeEdge/#.updateEdge or #.addDirectedEdge instead.`);if(s){if(u){if(typeof s!="function")throw new k(`Graph.${i}: invalid updater function. Expecting a function but got "${s}"`)}else if(!J(s))throw new k(`Graph.${i}: invalid attributes. Expecting an object but got "${s}"`)}a=""+a,o=""+o;let h;if(u&&(h=s,s=void 0),!n.allowSelfLoops&&a===o)throw new I(`Graph.${i}: source & target are the same ("${a}"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.`);let d=n._nodes.get(a),l=n._nodes.get(o),f,c;if(!t&&(f=n._edges.get(r),f)){if((f.source.key!==a||f.target.key!==o)&&(!e||f.source.key!==o||f.target.key!==a))throw new I(`Graph.${i}: inconsistency detected when attempting to merge the "${r}" edge with "${a}" source & "${o}" target vs. ("${f.source.key}", "${f.target.key}").`);c=f}if(!c&&!n.multi&&d&&(c=e?d.undirected[o]:d.out[o]),c){const m=[c.key,!1,!1,!1];if(u?!h:!s)return m;if(u){const S=c.attributes;c.attributes=h(S),n.emit("edgeAttributesUpdated",{type:"replace",key:c.key,attributes:c.attributes})}else Z(c.attributes,s),n.emit("edgeAttributesUpdated",{type:"merge",key:c.key,attributes:c.attributes,data:s});return m}s=s||{},u&&h&&(s=h(s));const y={key:null,undirected:e,source:a,target:o,attributes:s};if(t)r=n._edgeKeyGenerator();else if(r=""+r,n._edges.has(r))throw new I(`Graph.${i}: the "${r}" edge already exists in the graph.`);let w=!1,T=!1;d||(d=Mt(n,a,{}),w=!0,a===o&&(l=d,T=!0)),l||(l=Mt(n,o,{}),T=!0),f=new Ge(e,r,d,l,s),n._edges.set(r,f);const D=a===o;return e?(d.undirectedDegree++,l.undirectedDegree++,D&&(d.undirectedLoops++,n._undirectedSelfLoopCount++)):(d.outDegree++,l.inDegree++,D&&(d.directedLoops++,n._directedSelfLoopCount++)),n.multi?f.attachMulti():f.attach(),e?n._undirectedSize++:n._directedSize++,y.key=r,n.emit("edgeAdded",y),[r,!0,w,T]}function xe(n,i){n._edges.delete(i.key);const{source:t,target:e,attributes:r}=i,a=i.undirected,o=t===e;a?(t.undirectedDegree--,e.undirectedDegree--,o&&(t.undirectedLoops--,n._undirectedSelfLoopCount--)):(t.outDegree--,e.inDegree--,o&&(t.directedLoops--,n._directedSelfLoopCount--)),n.multi?i.detachMulti():i.detach(),a?n._undirectedSize--:n._directedSize--,n.emit("edgeDropped",{key:i.key,attributes:r,source:t.key,target:e.key,undirected:a})}class j extends wi.EventEmitter{constructor(i){if(super(),i=Z({},dn,i),typeof i.multi!="boolean")throw new k(`Graph.constructor: invalid 'multi' option. Expecting a boolean but got "${i.multi}".`);if(!un.has(i.type))throw new k(`Graph.constructor: invalid 'type' option. Should be one of "mixed", "directed" or "undirected" but got "${i.type}".`);if(typeof i.allowSelfLoops!="boolean")throw new k(`Graph.constructor: invalid 'allowSelfLoops' option. Expecting a boolean but got "${i.allowSelfLoops}".`);const t=i.type==="mixed"?_i:i.type==="directed"?Ti:Si;ae(this,"NodeDataClass",t);const e="geid_"+sn()+"_";let r=0;const a=()=>{let o;do o=e+r++;while(this._edges.has(o));return o};ae(this,"_attributes",{}),ae(this,"_nodes",new Map),ae(this,"_edges",new Map),ae(this,"_directedSize",0),ae(this,"_undirectedSize",0),ae(this,"_directedSelfLoopCount",0),ae(this,"_undirectedSelfLoopCount",0),ae(this,"_edgeKeyGenerator",a),ae(this,"_options",i),Bt.forEach(o=>ae(this,o,this[o])),he(this,"order",()=>this._nodes.size),he(this,"size",()=>this._edges.size),he(this,"directedSize",()=>this._directedSize),he(this,"undirectedSize",()=>this._undirectedSize),he(this,"selfLoopCount",()=>this._directedSelfLoopCount+this._undirectedSelfLoopCount),he(this,"directedSelfLoopCount",()=>this._directedSelfLoopCount),he(this,"undirectedSelfLoopCount",()=>this._undirectedSelfLoopCount),he(this,"multi",this._options.multi),he(this,"type",this._options.type),he(this,"allowSelfLoops",this._options.allowSelfLoops),he(this,"implementation",()=>"graphology")}_resetInstanceCounters(){this._directedSize=0,this._undirectedSize=0,this._directedSelfLoopCount=0,this._undirectedSelfLoopCount=0}hasNode(i){return this._nodes.has(""+i)}hasDirectedEdge(i,t){if(this.type==="undirected")return!1;if(arguments.length===1){const e=""+i,r=this._edges.get(e);return!!r&&!r.undirected}else if(arguments.length===2){i=""+i,t=""+t;const e=this._nodes.get(i);return e?e.out.hasOwnProperty(t):!1}throw new k(`Graph.hasDirectedEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`)}hasUndirectedEdge(i,t){if(this.type==="directed")return!1;if(arguments.length===1){const e=""+i,r=this._edges.get(e);return!!r&&r.undirected}else if(arguments.length===2){i=""+i,t=""+t;const e=this._nodes.get(i);return e?e.undirected.hasOwnProperty(t):!1}throw new k(`Graph.hasDirectedEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`)}hasEdge(i,t){if(arguments.length===1){const e=""+i;return this._edges.has(e)}else if(arguments.length===2){i=""+i,t=""+t;const e=this._nodes.get(i);return e?typeof e.out<"u"&&e.out.hasOwnProperty(t)||typeof e.undirected<"u"&&e.undirected.hasOwnProperty(t):!1}throw new k(`Graph.hasEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`)}directedEdge(i,t){if(this.type==="undirected")return;if(i=""+i,t=""+t,this.multi)throw new I("Graph.directedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.directedEdges instead.");const e=this._nodes.get(i);if(!e)throw new C(`Graph.directedEdge: could not find the "${i}" source node in the graph.`);if(!this._nodes.has(t))throw new C(`Graph.directedEdge: could not find the "${t}" target node in the graph.`);const r=e.out&&e.out[t]||void 0;if(r)return r.key}undirectedEdge(i,t){if(this.type==="directed")return;if(i=""+i,t=""+t,this.multi)throw new I("Graph.undirectedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.undirectedEdges instead.");const e=this._nodes.get(i);if(!e)throw new C(`Graph.undirectedEdge: could not find the "${i}" source node in the graph.`);if(!this._nodes.has(t))throw new C(`Graph.undirectedEdge: could not find the "${t}" target node in the graph.`);const r=e.undirected&&e.undirected[t]||void 0;if(r)return r.key}edge(i,t){if(this.multi)throw new I("Graph.edge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.edges instead.");i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.edge: could not find the "${i}" source node in the graph.`);if(!this._nodes.has(t))throw new C(`Graph.edge: could not find the "${t}" target node in the graph.`);const r=e.out&&e.out[t]||e.undirected&&e.undirected[t]||void 0;if(r)return r.key}areDirectedNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areDirectedNeighbors: could not find the "${i}" node in the graph.`);return this.type==="undirected"?!1:t in e.in||t in e.out}areOutNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areOutNeighbors: could not find the "${i}" node in the graph.`);return this.type==="undirected"?!1:t in e.out}areInNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areInNeighbors: could not find the "${i}" node in the graph.`);return this.type==="undirected"?!1:t in e.in}areUndirectedNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areUndirectedNeighbors: could not find the "${i}" node in the graph.`);return this.type==="directed"?!1:t in e.undirected}areNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areNeighbors: could not find the "${i}" node in the graph.`);return this.type!=="undirected"&&(t in e.in||t in e.out)||this.type!=="directed"&&t in e.undirected}areInboundNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areInboundNeighbors: could not find the "${i}" node in the graph.`);return this.type!=="undirected"&&t in e.in||this.type!=="directed"&&t in e.undirected}areOutboundNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new C(`Graph.areOutboundNeighbors: could not find the "${i}" node in the graph.`);return this.type!=="undirected"&&t in e.out||this.type!=="directed"&&t in e.undirected}inDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.inDegree: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree}outDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.outDegree: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.outDegree}directedDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.directedDegree: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree+t.outDegree}undirectedDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.undirectedDegree: could not find the "${i}" node in the graph.`);return this.type==="directed"?0:t.undirectedDegree}inboundDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.inboundDegree: could not find the "${i}" node in the graph.`);let e=0;return this.type!=="directed"&&(e+=t.undirectedDegree),this.type!=="undirected"&&(e+=t.inDegree),e}outboundDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.outboundDegree: could not find the "${i}" node in the graph.`);let e=0;return this.type!=="directed"&&(e+=t.undirectedDegree),this.type!=="undirected"&&(e+=t.outDegree),e}degree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.degree: could not find the "${i}" node in the graph.`);let e=0;return this.type!=="directed"&&(e+=t.undirectedDegree),this.type!=="undirected"&&(e+=t.inDegree+t.outDegree),e}inDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.inDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree-t.directedLoops}outDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.outDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.outDegree-t.directedLoops}directedDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.directedDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree+t.outDegree-t.directedLoops*2}undirectedDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.undirectedDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="directed"?0:t.undirectedDegree-t.undirectedLoops*2}inboundDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.inboundDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);let e=0,r=0;return this.type!=="directed"&&(e+=t.undirectedDegree,r+=t.undirectedLoops*2),this.type!=="undirected"&&(e+=t.inDegree,r+=t.directedLoops),e-r}outboundDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.outboundDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);let e=0,r=0;return this.type!=="directed"&&(e+=t.undirectedDegree,r+=t.undirectedLoops*2),this.type!=="undirected"&&(e+=t.outDegree,r+=t.directedLoops),e-r}degreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.degreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);let e=0,r=0;return this.type!=="directed"&&(e+=t.undirectedDegree,r+=t.undirectedLoops*2),this.type!=="undirected"&&(e+=t.inDegree+t.outDegree,r+=t.directedLoops*2),e-r}source(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.source: could not find the "${i}" edge in the graph.`);return t.source.key}target(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.target: could not find the "${i}" edge in the graph.`);return t.target.key}extremities(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.extremities: could not find the "${i}" edge in the graph.`);return[t.source.key,t.target.key]}opposite(i,t){i=""+i,t=""+t;const e=this._edges.get(t);if(!e)throw new C(`Graph.opposite: could not find the "${t}" edge in the graph.`);const r=e.source.key,a=e.target.key;if(i===r)return a;if(i===a)return r;throw new C(`Graph.opposite: the "${i}" node is not attached to the "${t}" edge (${r}, ${a}).`)}hasExtremity(i,t){i=""+i,t=""+t;const e=this._edges.get(i);if(!e)throw new C(`Graph.hasExtremity: could not find the "${i}" edge in the graph.`);return e.source.key===t||e.target.key===t}isUndirected(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.isUndirected: could not find the "${i}" edge in the graph.`);return t.undirected}isDirected(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.isDirected: could not find the "${i}" edge in the graph.`);return!t.undirected}isSelfLoop(i){i=""+i;const t=this._edges.get(i);if(!t)throw new C(`Graph.isSelfLoop: could not find the "${i}" edge in the graph.`);return t.source===t.target}addNode(i,t){return ln(this,i,t).key}mergeNode(i,t){if(t&&!J(t))throw new k(`Graph.mergeNode: invalid attributes. Expecting an object but got "${t}"`);i=""+i,t=t||{};let e=this._nodes.get(i);return e?(t&&(Z(e.attributes,t),this.emit("nodeAttributesUpdated",{type:"merge",key:i,attributes:e.attributes,data:t})),[i,!1]):(e=new this.NodeDataClass(i,t),this._nodes.set(i,e),this.emit("nodeAdded",{key:i,attributes:t}),[i,!0])}updateNode(i,t){if(t&&typeof t!="function")throw new k(`Graph.updateNode: invalid updater function. Expecting a function but got "${t}"`);i=""+i;let e=this._nodes.get(i);if(e){if(t){const a=e.attributes;e.attributes=t(a),this.emit("nodeAttributesUpdated",{type:"replace",key:i,attributes:e.attributes})}return[i,!1]}const r=t?t({}):{};return e=new this.NodeDataClass(i,r),this._nodes.set(i,e),this.emit("nodeAdded",{key:i,attributes:r}),[i,!0]}dropNode(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new C(`Graph.dropNode: could not find the "${i}" node in the graph.`);let e;if(this.type!=="undirected"){for(const r in t.out){e=t.out[r];do xe(this,e),e=e.next;while(e)}for(const r in t.in){e=t.in[r];do xe(this,e),e=e.next;while(e)}}if(this.type!=="directed")for(const r in t.undirected){e=t.undirected[r];do xe(this,e),e=e.next;while(e)}this._nodes.delete(i),this.emit("nodeDropped",{key:i,attributes:t.attributes})}dropEdge(i){let t;if(arguments.length>1){const e=""+arguments[0],r=""+arguments[1];if(t=oe(this,e,r,this.type),!t)throw new C(`Graph.dropEdge: could not find the "${e}" -> "${r}" edge in the graph.`)}else if(i=""+i,t=this._edges.get(i),!t)throw new C(`Graph.dropEdge: could not find the "${i}" edge in the graph.`);return xe(this,t),this}dropDirectedEdge(i,t){if(arguments.length<2)throw new I("Graph.dropDirectedEdge: it does not make sense to try and drop a directed edge by key. What if the edge with this key is undirected? Use #.dropEdge for this purpose instead.");if(this.multi)throw new I("Graph.dropDirectedEdge: cannot use a {source,target} combo when dropping an edge in a MultiGraph since we cannot infer the one you want to delete as there could be multiple ones.");i=""+i,t=""+t;const e=oe(this,i,t,"directed");if(!e)throw new C(`Graph.dropDirectedEdge: could not find a "${i}" -> "${t}" edge in the graph.`);return xe(this,e),this}dropUndirectedEdge(i,t){if(arguments.length<2)throw new I("Graph.dropUndirectedEdge: it does not make sense to drop a directed edge by key. What if the edge with this key is undirected? Use #.dropEdge for this purpose instead.");if(this.multi)throw new I("Graph.dropUndirectedEdge: cannot use a {source,target} combo when dropping an edge in a MultiGraph since we cannot infer the one you want to delete as there could be multiple ones.");const e=oe(this,i,t,"undirected");if(!e)throw new C(`Graph.dropUndirectedEdge: could not find a "${i}" -> "${t}" edge in the graph.`);return xe(this,e),this}clear(){this._edges.clear(),this._nodes.clear(),this._resetInstanceCounters(),this.emit("cleared")}clearEdges(){const i=this._nodes.values();let t;for(;t=i.next(),t.done!==!0;)t.value.clear();this._edges.clear(),this._resetInstanceCounters(),this.emit("edgesCleared")}getAttribute(i){return this._attributes[i]}getAttributes(){return this._attributes}hasAttribute(i){return this._attributes.hasOwnProperty(i)}setAttribute(i,t){return this._attributes[i]=t,this.emit("attributesUpdated",{type:"set",attributes:this._attributes,name:i}),this}updateAttribute(i,t){if(typeof t!="function")throw new k("Graph.updateAttribute: updater should be a function.");const e=this._attributes[i];return this._attributes[i]=t(e),this.emit("attributesUpdated",{type:"set",attributes:this._attributes,name:i}),this}removeAttribute(i){return delete this._attributes[i],this.emit("attributesUpdated",{type:"remove",attributes:this._attributes,name:i}),this}replaceAttributes(i){if(!J(i))throw new k("Graph.replaceAttributes: provided attributes are not a plain object.");return this._attributes=i,this.emit("attributesUpdated",{type:"replace",attributes:this._attributes}),this}mergeAttributes(i){if(!J(i))throw new k("Graph.mergeAttributes: provided attributes are not a plain object.");return Z(this._attributes,i),this.emit("attributesUpdated",{type:"merge",attributes:this._attributes,data:i}),this}updateAttributes(i){if(typeof i!="function")throw new k("Graph.updateAttributes: provided updater is not a function.");return this._attributes=i(this._attributes),this.emit("attributesUpdated",{type:"update",attributes:this._attributes}),this}updateEachNodeAttributes(i,t){if(typeof i!="function")throw new k("Graph.updateEachNodeAttributes: expecting an updater function.");if(t&&!$t(t))throw new k("Graph.updateEachNodeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}");const e=this._nodes.values();let r,a;for(;r=e.next(),r.done!==!0;)a=r.value,a.attributes=i(a.key,a.attributes);this.emit("eachNodeAttributesUpdated",{hints:t||null})}updateEachEdgeAttributes(i,t){if(typeof i!="function")throw new k("Graph.updateEachEdgeAttributes: expecting an updater function.");if(t&&!$t(t))throw new k("Graph.updateEachEdgeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}");const e=this._edges.values();let r,a,o,s;for(;r=e.next(),r.done!==!0;)a=r.value,o=a.source,s=a.target,a.attributes=i(a.key,a.attributes,o.key,s.key,o.attributes,s.attributes,a.undirected);this.emit("eachEdgeAttributesUpdated",{hints:t||null})}forEachAdjacencyEntry(i){if(typeof i!="function")throw new k("Graph.forEachAdjacencyEntry: expecting a callback.");tt(!1,!1,!1,this,i)}forEachAdjacencyEntryWithOrphans(i){if(typeof i!="function")throw new k("Graph.forEachAdjacencyEntryWithOrphans: expecting a callback.");tt(!1,!1,!0,this,i)}forEachAssymetricAdjacencyEntry(i){if(typeof i!="function")throw new k("Graph.forEachAssymetricAdjacencyEntry: expecting a callback.");tt(!1,!0,!1,this,i)}forEachAssymetricAdjacencyEntryWithOrphans(i){if(typeof i!="function")throw new k("Graph.forEachAssymetricAdjacencyEntryWithOrphans: expecting a callback.");tt(!1,!0,!0,this,i)}nodes(){return Array.from(this._nodes.keys())}forEachNode(i){if(typeof i!="function")throw new k("Graph.forEachNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)r=e.value,i(r.key,r.attributes)}findNode(i){if(typeof i!="function")throw new k("Graph.findNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)if(r=e.value,i(r.key,r.attributes))return r.key}mapNodes(i){if(typeof i!="function")throw new k("Graph.mapNode: expecting a callback.");const t=this._nodes.values();let e,r;const a=new Array(this.order);let o=0;for(;e=t.next(),e.done!==!0;)r=e.value,a[o++]=i(r.key,r.attributes);return a}someNode(i){if(typeof i!="function")throw new k("Graph.someNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)if(r=e.value,i(r.key,r.attributes))return!0;return!1}everyNode(i){if(typeof i!="function")throw new k("Graph.everyNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)if(r=e.value,!i(r.key,r.attributes))return!1;return!0}filterNodes(i){if(typeof i!="function")throw new k("Graph.filterNodes: expecting a callback.");const t=this._nodes.values();let e,r;const a=[];for(;e=t.next(),e.done!==!0;)r=e.value,i(r.key,r.attributes)&&a.push(r.key);return a}reduceNodes(i,t){if(typeof i!="function")throw new k("Graph.reduceNodes: expecting a callback.");if(arguments.length<2)throw new k("Graph.reduceNodes: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.");let e=t;const r=this._nodes.values();let a,o;for(;a=r.next(),a.done!==!0;)o=a.value,e=i(e,o.key,o.attributes);return e}nodeEntries(){const i=this._nodes.values();return{[Symbol.iterator](){return this},next(){const t=i.next();if(t.done)return t;const e=t.value;return{value:{node:e.key,attributes:e.attributes},done:!1}}}}export(){const i=new Array(this._nodes.size);let t=0;this._nodes.forEach((r,a)=>{i[t++]=rn(a,r)});const e=new Array(this._edges.size);return t=0,this._edges.forEach((r,a)=>{e[t++]=nn(this.type,a,r)}),{options:{type:this.type,multi:this.multi,allowSelfLoops:this.allowSelfLoops},attributes:this.getAttributes(),nodes:i,edges:e}}import(i,t=!1){if(i instanceof j)return i.forEachNode((u,h)=>{t?this.mergeNode(u,h):this.addNode(u,h)}),i.forEachEdge((u,h,d,l,f,c,y)=>{t?y?this.mergeUndirectedEdgeWithKey(u,d,l,h):this.mergeDirectedEdgeWithKey(u,d,l,h):y?this.addUndirectedEdgeWithKey(u,d,l,h):this.addDirectedEdgeWithKey(u,d,l,h)}),this;if(!J(i))throw new k("Graph.import: invalid argument. Expecting a serialized graph or, alternatively, a Graph instance.");if(i.attributes){if(!J(i.attributes))throw new k("Graph.import: invalid attributes. Expecting a plain object.");t?this.mergeAttributes(i.attributes):this.replaceAttributes(i.attributes)}let e,r,a,o,s;if(i.nodes){if(a=i.nodes,!Array.isArray(a))throw new k("Graph.import: invalid nodes. Expecting an array.");for(e=0,r=a.length;e{const a=Z({},e.attributes);e=new t.NodeDataClass(r,a),t._nodes.set(r,e)}),t}copy(i){if(i=i||{},typeof i.type=="string"&&i.type!==this.type&&i.type!=="mixed")throw new I(`Graph.copy: cannot create an incompatible copy from "${this.type}" type to "${i.type}" because this would mean losing information about the current graph.`);if(typeof i.multi=="boolean"&&i.multi!==this.multi&&i.multi!==!0)throw new I("Graph.copy: cannot create an incompatible copy by downgrading a multi graph to a simple one because this would mean losing information about the current graph.");if(typeof i.allowSelfLoops=="boolean"&&i.allowSelfLoops!==this.allowSelfLoops&&i.allowSelfLoops!==!0)throw new I("Graph.copy: cannot create an incompatible copy from a graph allowing self loops to one that does not because this would mean losing information about the current graph.");const t=this.emptyCopy(i),e=this._edges.values();let r,a;for(;r=e.next(),r.done!==!0;)a=r.value,ki(t,"copy",!1,a.undirected,a.key,a.source.key,a.target.key,Z({},a.attributes));return t}toJSON(){return this.export()}toString(){return"[object Graph]"}inspect(){const i={};this._nodes.forEach((a,o)=>{i[o]=a.attributes});const t={},e={};this._edges.forEach((a,o)=>{const s=a.undirected?"--":"->";let u="",h=a.source.key,d=a.target.key,l;a.undirected&&h>d&&(l=h,h=d,d=l);const f=`(${h})${s}(${d})`;o.startsWith("geid_")?this.multi&&(typeof e[f]>"u"?e[f]=0:e[f]++,u+=`${e[f]}. `):u+=`[${o}]: `,u+=f,t[u]=a.attributes});const r={};for(const a in this)this.hasOwnProperty(a)&&!Bt.has(a)&&typeof this[a]!="function"&&typeof a!="symbol"&&(r[a]=this[a]);return r.attributes=this._attributes,r.nodes=i,r.edges=t,ae(r,"constructor",this.constructor),r}}typeof Symbol<"u"&&(j.prototype[Symbol.for("nodejs.util.inspect.custom")]=j.prototype.inspect);hn.forEach(n=>{["add","merge","update"].forEach(i=>{const t=n.name(i),e=i==="add"?ki:cn;n.generateKey?j.prototype[t]=function(r,a,o){return e(this,t,!0,(n.type||this.type)==="undirected",null,r,a,o,i==="update")}:j.prototype[t]=function(r,a,o,s){return e(this,t,!1,(n.type||this.type)==="undirected",r,a,o,s,i==="update")}})});wr(j);Lr(j);qr(j);tn(j);class Di extends j{constructor(i){const t=Z({type:"directed"},i);if("multi"in t&&t.multi!==!1)throw new k("DirectedGraph.from: inconsistent indication that the graph should be multi in given options!");if(t.type!=="directed")throw new k('DirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}class Li extends j{constructor(i){const t=Z({type:"undirected"},i);if("multi"in t&&t.multi!==!1)throw new k("UndirectedGraph.from: inconsistent indication that the graph should be multi in given options!");if(t.type!=="undirected")throw new k('UndirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}class Gi extends j{constructor(i){const t=Z({multi:!0},i);if("multi"in t&&t.multi!==!0)throw new k("MultiGraph.from: inconsistent indication that the graph should be simple in given options!");super(t)}}class Fi extends j{constructor(i){const t=Z({type:"directed",multi:!0},i);if("multi"in t&&t.multi!==!0)throw new k("MultiDirectedGraph.from: inconsistent indication that the graph should be simple in given options!");if(t.type!=="directed")throw new k('MultiDirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}class Ni extends j{constructor(i){const t=Z({type:"undirected",multi:!0},i);if("multi"in t&&t.multi!==!0)throw new k("MultiUndirectedGraph.from: inconsistent indication that the graph should be simple in given options!");if(t.type!=="undirected")throw new k('MultiUndirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}function Fe(n){n.from=function(i,t){const e=Z({},i.options,t),r=new n(e);return r.import(i),r}}Fe(j);Fe(Di);Fe(Li);Fe(Gi);Fe(Fi);Fe(Ni);j.Graph=j;j.DirectedGraph=Di;j.UndirectedGraph=Li;j.MultiGraph=Gi;j.MultiDirectedGraph=Fi;j.MultiUndirectedGraph=Ni;j.InvalidArgumentsGraphError=k;j.NotFoundGraphError=C;j.UsageGraphError=I;var ft,Ht;function Pi(){return Ht||(Ht=1,ft=function(i){return i!==null&&typeof i=="object"&&typeof i.addUndirectedEdgeWithKey=="function"&&typeof i.dropNode=="function"&&typeof i.multi=="boolean"}),ft}var ze={},Wt;function fn(){if(Wt)return ze;Wt=1;function n(e){return typeof e!="number"||isNaN(e)?1:e}function i(e,r){var a={},o=function(h){return typeof h>"u"?r:h};typeof r=="function"&&(o=r);var s=function(h){return o(h[e])},u=function(){return o(void 0)};return typeof e=="string"?(a.fromAttributes=s,a.fromGraph=function(h,d){return s(h.getNodeAttributes(d))},a.fromEntry=function(h,d){return s(d)}):typeof e=="function"?(a.fromAttributes=function(){throw new Error("graphology-utils/getters/createNodeValueGetter: irrelevant usage.")},a.fromGraph=function(h,d){return o(e(d,h.getNodeAttributes(d)))},a.fromEntry=function(h,d){return o(e(h,d))}):(a.fromAttributes=u,a.fromGraph=u,a.fromEntry=u),a}function t(e,r){var a={},o=function(h){return typeof h>"u"?r:h};typeof r=="function"&&(o=r);var s=function(h){return o(h[e])},u=function(){return o(void 0)};return typeof e=="string"?(a.fromAttributes=s,a.fromGraph=function(h,d){return s(h.getEdgeAttributes(d))},a.fromEntry=function(h,d){return s(d)},a.fromPartialEntry=a.fromEntry,a.fromMinimalEntry=a.fromEntry):typeof e=="function"?(a.fromAttributes=function(){throw new Error("graphology-utils/getters/createEdgeValueGetter: irrelevant usage.")},a.fromGraph=function(h,d){var l=h.extremities(d);return o(e(d,h.getEdgeAttributes(d),l[0],l[1],h.getNodeAttributes(l[0]),h.getNodeAttributes(l[1]),h.isUndirected(d)))},a.fromEntry=function(h,d,l,f,c,y,w){return o(e(h,d,l,f,c,y,w))},a.fromPartialEntry=function(h,d,l,f){return o(e(h,d,l,f))},a.fromMinimalEntry=function(h,d){return o(e(h,d))}):(a.fromAttributes=u,a.fromGraph=u,a.fromEntry=u,a.fromMinimalEntry=u),a}return ze.createNodeValueGetter=i,ze.createEdgeValueGetter=t,ze.createEdgeWeightGetter=function(e){return t(e,n)},ze}var gt,jt;function gn(){if(jt)return gt;jt=1;var n=0,i=1,t=2,e=3,r=4,a=5,o=6,s=7,u=8,h=9,d=0,l=1,f=2,c=0,y=1,w=2,T=3,D=4,m=5,S=6,p=7,b=8,R=3,A=10,G=3,F=9,P=10;return gt=function(z,g,K){var te,x,v,$,W,X,ie,Y,N,Ne,re=g.length,tr=K.length,Pe=z.adjustSizes,ir=z.barnesHutTheta*z.barnesHutTheta,qe,q,B,M,fe,U,O,E=[];for(v=0;vYe?(Ee-=(Ke-Ye)/2,Re=Ee+Ke):(we-=(Ye-Ke)/2,Se=we+Ye),E[0+c]=-1,E[0+y]=(we+Se)/2,E[0+w]=(Ee+Re)/2,E[0+T]=Math.max(Se-we,Re-Ee),E[0+D]=-1,E[0+m]=-1,E[0+S]=0,E[0+p]=0,E[0+b]=0,te=1,v=0;v=0){g[v+n]=0)if(U=Math.pow(g[v+n]-E[x+p],2)+Math.pow(g[v+i]-E[x+b],2),Ne=E[x+T],4*Ne*Ne/U0?(O=q*g[v+o]*E[x+S]/U,g[v+t]+=B*O,g[v+e]+=M*O):U<0&&(O=-q*g[v+o]*E[x+S]/Math.sqrt(U),g[v+t]+=B*O,g[v+e]+=M*O):U>0&&(O=q*g[v+o]*E[x+S]/U,g[v+t]+=B*O,g[v+e]+=M*O),x=E[x+D],x<0)break;continue}else{x=E[x+m];continue}else{if(X=E[x+c],X>=0&&X!==v&&(B=g[v+n]-g[X+n],M=g[v+i]-g[X+i],U=B*B+M*M,Pe===!0?U>0?(O=q*g[v+o]*g[X+o]/U,g[v+t]+=B*O,g[v+e]+=M*O):U<0&&(O=-q*g[v+o]*g[X+o]/Math.sqrt(U),g[v+t]+=B*O,g[v+e]+=M*O):U>0&&(O=q*g[v+o]*g[X+o]/U,g[v+t]+=B*O,g[v+e]+=M*O)),x=E[x+D],x<0)break;continue}else for(q=z.scalingRatio,$=0;$0?(O=q*g[$+o]*g[W+o]/U/U,g[$+t]+=B*O,g[$+e]+=M*O,g[W+t]-=B*O,g[W+e]-=M*O):U<0&&(O=100*q*g[$+o]*g[W+o],g[$+t]+=B*O,g[$+e]+=M*O,g[W+t]-=B*O,g[W+e]-=M*O)):(U=Math.sqrt(B*B+M*M),U>0&&(O=q*g[$+o]*g[W+o]/U/U,g[$+t]+=B*O,g[$+e]+=M*O,g[W+t]-=B*O,g[W+e]-=M*O));for(N=z.gravity/z.scalingRatio,q=z.scalingRatio,v=0;v0&&(O=q*g[v+o]*N):U>0&&(O=q*g[v+o]*N/U),g[v+t]-=B*O,g[v+e]-=M*O;for(q=1*(z.outboundAttractionDistribution?qe:1),ie=0;ie0&&(O=-q*fe*Math.log(1+U)/U/g[$+o]):U>0&&(O=-q*fe*Math.log(1+U)/U):z.outboundAttractionDistribution?U>0&&(O=-q*fe/g[$+o]):U>0&&(O=-q*fe)):(U=Math.sqrt(Math.pow(B,2)+Math.pow(M,2)),z.linLogMode?z.outboundAttractionDistribution?U>0&&(O=-q*fe*Math.log(1+U)/U/g[$+o]):U>0&&(O=-q*fe*Math.log(1+U)/U):z.outboundAttractionDistribution?(U=1,O=-q*fe/g[$+o]):(U=1,O=-q*fe)),U>0&&(g[$+t]+=B*O,g[$+e]+=M*O,g[W+t]-=B*O,g[W+e]-=M*O);var Ze,Ie,Xe,_e,Je,Qe;if(Pe===!0)for(v=0;vP&&(g[v+t]=g[v+t]*P/Ze,g[v+e]=g[v+e]*P/Ze),Ie=g[v+o]*Math.sqrt((g[v+r]-g[v+t])*(g[v+r]-g[v+t])+(g[v+a]-g[v+e])*(g[v+a]-g[v+e])),Xe=Math.sqrt((g[v+r]+g[v+t])*(g[v+r]+g[v+t])+(g[v+a]+g[v+e])*(g[v+a]+g[v+e]))/2,_e=.1*Math.log(1+Xe)/(1+Math.sqrt(Ie)),Je=g[v+n]+g[v+t]*(_e/z.slowDown),g[v+n]=Je,Qe=g[v+i]+g[v+e]*(_e/z.slowDown),g[v+i]=Qe);else for(v=0;v=0)?{message:"the `scalingRatio` setting should be a number >= 0."}:"strongGravityMode"in t&&typeof t.strongGravityMode!="boolean"?{message:"the `strongGravityMode` setting should be a boolean."}:"gravity"in t&&!(typeof t.gravity=="number"&&t.gravity>=0)?{message:"the `gravity` setting should be a number >= 0."}:"slowDown"in t&&!(typeof t.slowDown=="number"||t.slowDown>=0)?{message:"the `slowDown` setting should be a number >= 0."}:"barnesHutOptimize"in t&&typeof t.barnesHutOptimize!="boolean"?{message:"the `barnesHutOptimize` setting should be a boolean."}:"barnesHutTheta"in t&&!(typeof t.barnesHutTheta=="number"&&t.barnesHutTheta>=0)?{message:"the `barnesHutTheta` setting should be a number >= 0."}:null},ge.graphToByteArrays=function(t,e){var r=t.order,a=t.size,o={},s,u=new Float32Array(r*n),h=new Float32Array(a*i);return s=0,t.forEachNode(function(d,l){o[d]=s,u[s]=l.x,u[s+1]=l.y,u[s+2]=0,u[s+3]=0,u[s+4]=0,u[s+5]=0,u[s+6]=1,u[s+7]=1,u[s+8]=l.size||1,u[s+9]=l.fixed?1:0,s+=n}),s=0,t.forEachEdge(function(d,l,f,c,y,w,T){var D=o[f],m=o[c],S=e(d,l,f,c,y,w,T);u[D+6]+=S,u[m+6]+=S,h[s]=D,h[s+1]=m,h[s+2]=S,s+=i}),{nodes:u,edges:h}},ge.assignLayoutChanges=function(t,e,r){var a=0;t.updateEachNodeAttributes(function(o,s){return s.x=e[a],s.y=e[a+1],a+=n,r?r(o,s):s})},ge.readGraphPositions=function(t,e){var r=0;t.forEachNode(function(a,o){e[r]=o.x,e[r+1]=o.y,r+=n})},ge.collectLayoutChanges=function(t,e,r){for(var a=t.nodes(),o={},s=0,u=0,h=e.length;s2e3,strongGravityMode:!0,gravity:.05,scalingRatio:10,slowDown:1+Math.log(h)}}var s=a.bind(null,!1);return s.assign=a.bind(null,!0),s.inferSettings=o,vt=s,vt}var yn=mn();const it=bi(yn);function bn(n,i){if(typeof n!="object"||!n)return n;var t=n[Symbol.toPrimitive];if(t!==void 0){var e=t.call(n,i);if(typeof e!="object")return e;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(n)}function je(n){var i=bn(n,"string");return typeof i=="symbol"?i:i+""}function Q(n,i){if(!(n instanceof i))throw new TypeError("Cannot call a class as a function")}function Yt(n,i){for(var t=0;tn.length)&&(i=n.length);for(var t=0,e=Array(i);t>>16,t=(n&65280)>>>8,e=n&255,r=255,a=zi(i,t,e,r);return bt[n]=a,a}function Zt(n,i,t,e){return t+(i<<8)+(n<<16)}function Xt(n,i,t,e,r,a){var o=Math.floor(t/a*r),s=Math.floor(n.drawingBufferHeight/a-e/a*r),u=new Uint8Array(4);n.bindFramebuffer(n.FRAMEBUFFER,i),n.readPixels(o,s,1,1,n.RGBA,n.UNSIGNED_BYTE,u);var h=De(u,4),d=h[0],l=h[1],f=h[2],c=h[3];return[d,l,f,c]}function _(n,i,t){return(i=je(i))in n?Object.defineProperty(n,i,{value:t,enumerable:!0,configurable:!0,writable:!0}):n[i]=t,n}function Jt(n,i){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var e=Object.getOwnPropertySymbols(n);i&&(e=e.filter(function(r){return Object.getOwnPropertyDescriptor(n,r).enumerable})),t.push.apply(t,e)}return t}function L(n){for(var i=1;i0?` · ${Mr(_e)} real belegt (inkl. KV)`:""," / ",Mr(Ze)]}),v&&k.length>0&&l.jsx("button",{onClick:I,className:"h-6 px-2.5 rounded border border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/10 text-amber-400 text-[9px] font-bold uppercase transition-all cursor-pointer",children:"Alle entladen"})]})]}),l.jsx("div",{className:"h-7 w-full rounded-xl bg-background/50 border border-border/40 overflow-hidden flex p-0.5 relative group",children:Pe.length===0?l.jsx("div",{className:"w-full h-full flex items-center justify-center text-[10px] text-muted-foreground/60 italic font-mono select-none",children:"VRAM Leer — Auto-Swap lädt Modelle bei Anfrage"}):Pe.map((K,Se)=>{var nt;const Ce=(K.size_bytes||0)/Ze*100,Ge=["from-teal-500 to-emerald-500","from-indigo-500 to-blue-500","from-purple-500 to-pink-500","from-cyan-500 to-sky-500"][Se%4];return l.jsxs("div",{style:{width:`${Ce}%`},className:te("h-full rounded bg-gradient-to-r flex items-center justify-between px-2.5 transition-all text-white/95 shrink-0 shadow-inner select-none",Ge),title:`${K.name} (${Mr(K.size_bytes)})`,children:[l.jsxs("span",{className:"text-[9px] font-bold truncate max-w-[120px] font-space tracking-wide",children:[K.role?`[${ir(K.role).short}] `:"",(nt=K.name.split("/").pop())==null?void 0:nt.replace(".gguf","")]}),l.jsx("span",{className:"text-[8px] font-mono opacity-80",children:Mr(K.size_bytes)})]},K.name)})})]}),l.jsx(EX,{}),v&&l.jsx(NX,{}),l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-3.5",children:[l.jsx("div",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground px-1",children:v?"Gateway Steckplatz-Belegung (Slot-Zuweisung)":"Wer macht was bei Lucy — zum Ändern antippen"}),l.jsx("div",{className:"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-6 gap-3",children:WO.map(K=>{var Ge;const Se=j.find(nt=>nt.role===K),Ce=Se?k.includes(Se.name):!1;return l.jsxs("div",{onClick:()=>W(K),className:te("rounded-xl border p-3 flex flex-col justify-between gap-2.5 transition-all cursor-pointer select-none text-left bg-background/25 hover:border-primary/45 hover:bg-background/40 group min-h-[90px]",Ce?"border-emerald-500/40 shadow-sm shadow-emerald-500/5":Se?"border-primary/20 bg-primary/5":"border-border/30 border-dashed opacity-75"),children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx(so,{role:K}),Ce&&l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-400 animate-pulse"})]}),l.jsx("div",{className:"text-[10px] font-mono font-medium truncate text-foreground/90 pr-1 font-space",title:Se==null?void 0:Se.name,children:Se?(Ge=Se.name.split("/").pop())==null?void 0:Ge.replace(/\.gguf$/i,""):"nicht zugewiesen"}),l.jsx("div",{className:"text-[8px] text-primary/70 group-hover:text-primary font-bold uppercase tracking-wider transition-colors font-space",children:"Ändern ➔"})]},K)})})]}),(o==null?void 0:o.current)&&l.jsxs("div",{className:"rounded-2xl border border-indigo-500/30 bg-indigo-500/5 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-3.5",children:[l.jsxs("div",{className:"flex items-center justify-between flex-wrap gap-2",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(gn,{className:"h-4.5 w-4.5 text-indigo-400"}),l.jsx("span",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"Agent-Hirn (Hermes)"}),o.current.version!=null&&l.jsxs("span",{className:"text-[9px] font-mono px-1.5 py-0.5 rounded bg-indigo-500/15 text-indigo-300 border border-indigo-500/25",children:["v",o.current.version]})]}),l.jsx("button",{onClick:()=>window.dispatchEvent(new CustomEvent("mc-navigate",{detail:{view:"agent"}})),className:"h-7 px-3 rounded-lg border border-indigo-500/30 bg-indigo-500/5 text-indigo-300 text-[9px] font-bold uppercase hover:bg-indigo-500/15 transition-all cursor-pointer",title:"Hirn-Wechsel passiert jetzt zentral im Hermes-Tab",children:"Im Hermes-Tab wechseln →"})]}),l.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-3 rounded-xl bg-background/30 border border-border/30 p-3.5",children:[l.jsxs("div",{className:"min-w-0",children:[l.jsx("div",{className:"text-xs font-mono font-bold text-foreground truncate",title:o.current.name,children:o.current.name.split("/").pop()}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2 mt-0.5",children:[l.jsx("span",{children:o.current.params_b?`${o.current.params_b}B`:"—"}),l.jsx("span",{children:"•"}),l.jsx("span",{children:o.current.quant||"GGUF"}),l.jsx("span",{children:"•"}),l.jsx("span",{children:Mr(o.current.size_bytes||0)})]})]}),o.update_available&&o.recommended?l.jsxs("button",{onClick:()=>pe(o.recommended.repo),className:te("h-8 px-3 shrink-0 flex items-center justify-center gap-1.5 rounded-lg text-[10px] font-bold uppercase transition-all cursor-pointer shadow-md",o.budget&&!o.budget.fits?"bg-red-500 text-white hover:bg-red-400 shadow-red-500/10":"bg-amber-500 text-black hover:bg-amber-400 shadow-amber-500/10"),children:[l.jsx(Ms,{className:"h-3.5 w-3.5"})," Aktualisieren"]}):l.jsxs("span",{className:"h-8 px-3 shrink-0 flex items-center gap-1.5 text-[10px] font-bold text-emerald-400 uppercase tracking-wide bg-emerald-500/5 border border-emerald-500/15 rounded-lg select-none",children:[l.jsx(or,{className:"h-4 w-4"})," Neueste Generation"]})]}),o.update_available&&o.recommended&&l.jsxs("div",{className:"text-[10px] text-amber-400/90 flex items-center gap-1.5",children:[l.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-amber-400 animate-ping shrink-0"}),"Neuere Generation verfügbar: ",l.jsx("span",{className:"font-mono font-bold",children:o.recommended.name.replace(/-GGUF$/i,"")}),"(v",o.recommended.version,", ",o.recommended.params_b,"B) — von NousResearch."]}),o.budget&&l.jsxs("div",{className:te("text-[10px] flex items-start gap-1.5 leading-relaxed",o.budget.fits?"text-muted-foreground/80":"text-red-400 font-semibold"),children:[l.jsx(du,{className:"h-3 w-3 shrink-0 mt-0.5"}),l.jsxs("span",{children:["Always-On-Brain ~",o.budget.brain_gb," GB + größtes on-demand (~",o.budget.largest_ondemand_gb," GB) = ",(o.budget.brain_gb+o.budget.largest_ondemand_gb).toFixed(1)," / ",o.budget.gtt_gb," GB",o.budget.fits?" · passt gleichzeitig ✓":" · passt NICHT gleichzeitig ⚠ — heavy/coder würden das Brain verdrängen. Kleineres Brain oder weniger Kontext."]})]})]}),l.jsxs("div",{className:"space-y-4",children:[l.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-3 px-1",children:[l.jsxs("div",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:["Installierte Modell-Bibliothek (",oe.length," von ",j.length,")"]}),l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsxs("div",{className:"flex rounded-lg border border-border/40 bg-card/45 p-0.5",children:[l.jsx("button",{onClick:()=>ie("all"),className:te("px-2.5 py-1 rounded-md text-[9px] font-bold uppercase transition-all cursor-pointer",ge==="all"?"bg-primary text-primary-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:"Vorhanden"}),l.jsx("button",{onClick:()=>ie("in_use"),className:te("px-2.5 py-1 rounded-md text-[9px] font-bold uppercase transition-all cursor-pointer",ge==="in_use"?"bg-primary text-primary-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:"In Benutzung"})]}),l.jsxs("div",{className:"flex rounded-lg border border-border/40 bg-card/45 p-0.5",children:[l.jsx("button",{onClick:()=>ue("grid"),className:te("px-2.5 py-1 rounded-md text-[9px] font-bold uppercase transition-all cursor-pointer",me==="grid"?"bg-primary text-primary-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:"Grid"}),l.jsx("button",{onClick:()=>ue("list"),className:te("px-2.5 py-1 rounded-md text-[9px] font-bold uppercase transition-all cursor-pointer",me==="list"?"bg-primary text-primary-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:"List"})]})]})]}),me==="grid"?l.jsx("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-3",children:oe.length===0?l.jsx("div",{className:"col-span-full text-xs text-muted-foreground border border-dashed border-border/60 rounded-2xl p-12 text-center select-none",children:ge==="in_use"?"Keine Modelle in Benutzung (keine Zuweisung oder warm geladene Modelle).":'Keine Modelle konfiguriert. Verwende den Tab "Modelle finden" zum Herunterladen.'}):oe.map(K=>{const Se=k.includes(K.name),Ce=a==null?void 0:a.model_list.find(nt=>nt.role===K.role),Ge=B2(K.name);return l.jsxs("div",{className:te("rounded-2xl border bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 flex flex-col justify-between gap-4 transition-all duration-300 hover:border-primary/40 group relative overflow-hidden",Se?"border-primary/45 shadow-primary/5":K.role?"border-primary/30 bg-primary/5 shadow-inner":"border-border/60"),children:[l.jsxs("div",{className:"space-y-3",children:[l.jsx("div",{className:"flex items-start justify-between gap-3",children:l.jsxs("div",{className:"flex gap-2.5 min-w-0",children:[l.jsx("div",{className:te("w-7 h-7 rounded-lg border flex items-center justify-center font-bold text-xs shrink-0 shadow-sm",Ge.color),title:Ge.name,children:Ge.initial}),l.jsxs("div",{className:"min-w-0",children:[l.jsx("h3",{className:"text-xs font-bold tracking-tight text-foreground line-clamp-2 break-all font-mono",title:K.name,children:K.name.split("/").pop()}),l.jsxs("div",{className:"flex items-center gap-2 flex-wrap mt-1",children:[l.jsx("span",{className:"text-[9px] font-mono text-muted-foreground bg-background/40 px-1.5 py-0.5 rounded border border-border/30",children:K.quant||"GGUF"}),Se&&l.jsxs("span",{className:"flex items-center gap-1 text-[9px] font-semibold text-emerald-400 uppercase tracking-wider",children:[l.jsx(eh,{className:"h-3 w-3 animate-pulse"})," Warm"]}),K.role&&l.jsx(so,{role:K.role,dense:!0}),b(K.role)&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-background/40 border border-border/40 text-[9px] font-semibold text-muted-foreground",title:"Lebenswichtig für Lucy — geschützt vor Löschen/Entladen.",children:"🔒 geschützt"}),v&&P(K.name)&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-fuchsia-500/10 border border-fuchsia-500/30 text-[9px] font-mono text-fuchsia-300 font-bold uppercase",title:"Ko-resident in der brains-Gruppe — bleibt mit dem Hirn gemeinsam warm, verdrängt es nicht.",children:"🧠 Ko-resident"}),v&&K.prompt_cache&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-cyan-500/10 border border-cyan-500/20 text-[9px] font-mono text-cyan-400 font-bold uppercase",title:"Prompt Caching aktiv",children:"PC"}),v&&(K.spec_active?l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-emerald-500/10 border border-emerald-500/20 text-[9px] font-mono text-emerald-400 font-bold uppercase",title:`Speculative Decoding aktiv (Draft: ${K.spec_draft_model})`,children:"SPEC"}):K.spec_draft_model?l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/20 text-[9px] font-mono text-amber-400 font-bold uppercase",title:`Draft gesetzt (${K.spec_draft_model}), aber INAKTIV — --spec-type fehlt oder Vocab inkompatibel. Über 'Spec' neu konfigurieren.`,children:"SPEC?"}):null),v&&K.parallel_slots>1&&l.jsxs("span",{className:"px-1.5 py-0.5 rounded bg-violet-500/10 border border-violet-500/20 text-[9px] font-mono text-violet-400 font-bold uppercase",title:`${K.parallel_slots} parallele Slots aktiv`,children:["SLOTS: ",K.parallel_slots]}),K.incomplete&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/20 text-[9px] font-mono text-amber-400 font-bold uppercase",title:"GGUF-Datei fehlt — Modell kann nicht geladen werden",children:"⚠ Datei fehlt"})]})]})]})}),l.jsx("div",{className:"border-t border-border/30 pt-3 flex flex-wrap gap-1",children:l.jsx(H2,{caps:K.capabilities})})]}),l.jsxs("div",{className:"space-y-3 pt-1",children:[l.jsxs("div",{className:"grid grid-cols-2 gap-2 text-[10px] font-mono text-muted-foreground",children:[l.jsxs("div",{className:"flex items-center gap-1.5 p-2 bg-background/20 rounded-lg border border-border/20",children:[l.jsx(du,{className:"h-3.5 w-3.5 text-primary/80"}),l.jsxs("div",{children:[l.jsx("div",{className:"text-[8px] uppercase tracking-wider font-semibold text-muted-foreground/60",children:"Größe"}),l.jsx("div",{className:"text-foreground font-semibold",children:Mr(K.size_bytes)})]})]}),l.jsxs("div",{className:"flex items-center gap-1.5 p-2 bg-background/20 rounded-lg border border-border/20",children:[l.jsx(C4,{className:"h-3.5 w-3.5 text-primary/80"}),l.jsxs("div",{children:[l.jsx("div",{className:"text-[8px] uppercase tracking-wider font-semibold text-muted-foreground/60",children:"Kontext"}),l.jsx("div",{className:"text-foreground font-semibold",children:Rw(K.ctx)})]})]})]}),Ce&&l.jsxs("div",{className:"p-3 bg-amber-500/5 border border-amber-500/30 rounded-xl space-y-2 flex flex-col justify-between shrink-0",children:[l.jsxs("div",{className:"text-[9px] font-semibold text-amber-400 flex items-center gap-1",children:[l.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-amber-400 animate-ping"}),l.jsxs("span",{children:["Upgrade verfügbar: ",Ce.repo.split("/").pop()]})]}),l.jsxs("button",{onClick:()=>he(Ce.repo,K.role,K.quant||"Q4_K_M",K.capabilities.tools!=="no"),className:"h-7 w-full flex items-center justify-center gap-1 rounded-lg bg-amber-500 text-black text-[10px] font-bold hover:bg-amber-400 transition-colors cursor-pointer",children:[l.jsx(Ms,{className:"h-3 w-3"})," Smart-Swap starten"]})]}),l.jsxs("div",{className:"flex items-center gap-1.5 border-t border-border/20 pt-3 mt-auto",children:[(()=>{const nt=b(K.role),q=Se&&nt,Le=K.incomplete&&!Se||q;return l.jsx("button",{onClick:()=>Se?J(K.name):re(K.name),disabled:Le,title:q?`„${ir(K.role).label}" bleibt geladen (geschützt).`:void 0,className:te("flex-1 h-7 rounded-lg text-[9px] font-bold uppercase transition-all border flex items-center justify-center gap-1",Le?"border-border/30 bg-background/10 text-muted-foreground/50 cursor-not-allowed":Se?"border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/15 text-amber-400 cursor-pointer":"border-primary/30 bg-primary/5 hover:bg-primary/15 text-primary cursor-pointer"),children:q?"🔒 geladen":Se?"Entladen":"Laden"})})(),v&&l.jsx("button",{onClick:()=>ee(K.name,K.ctx),className:"h-7 px-2.5 rounded-lg border border-border/40 text-[9px] font-bold uppercase hover:bg-accent text-muted-foreground transition-colors cursor-pointer",title:"Kontextlänge anpassen",children:"Ctx"}),v&&E&&l.jsx("button",{onClick:()=>O(K.name),className:te("h-7 px-2.5 rounded-lg border text-[9px] font-bold uppercase transition-colors cursor-pointer",P(K.name)?"border-fuchsia-500/40 bg-fuchsia-500/10 text-fuchsia-300 hover:bg-fuchsia-500/20":"border-border/40 text-muted-foreground hover:bg-accent"),title:P(K.name)?"Ko-resident (brains): bleibt mit dem Hirn gemeinsam warm. Klick = aus der Gruppe nehmen.":"Zur brains-Gruppe hinzufügen — lädt dann ko-resident neben dem Hirn, statt es zu verdrängen.",children:"🧠"}),v&&l.jsxs("button",{onClick:()=>U(K),className:te("h-7 px-2.5 rounded-lg border text-[9px] font-bold uppercase transition-colors cursor-pointer flex items-center gap-1",K.spec_active?"border-emerald-500/30 text-emerald-400 hover:bg-emerald-500/10":K.spec_draft_model?"border-amber-500/30 text-amber-400 hover:bg-amber-500/10":"border-border/40 text-muted-foreground hover:bg-accent"),title:"Speculative Draft konfigurieren (Vocab-geprüft)",children:[l.jsx(ma,{className:"h-3 w-3"})," Spec"]}),l.jsx("button",{onClick:()=>Z(K.name),disabled:b(K.role),className:te("h-7 w-7 rounded-lg border border-border/40 flex items-center justify-center transition-colors",b(K.role)?"text-muted-foreground/40 cursor-not-allowed":"text-muted-foreground hover:text-red-400 hover:bg-red-500/5 cursor-pointer"),"aria-label":"Modell löschen",title:b(K.role)?`„${ir(K.role).label}" ist geschützt und kann nicht gelöscht werden.`:"Modell löschen",children:l.jsx(iv,{className:"h-3.5 w-3.5","aria-hidden":"true"})})]})]})]},K.name)})}):l.jsx("div",{className:"space-y-2",children:oe.length===0?l.jsx("div",{className:"text-xs text-muted-foreground border border-dashed border-border/60 rounded-2xl p-12 text-center select-none",children:ge==="in_use"?"Keine Modelle in Benutzung (keine Zuweisung oder warm geladene Modelle).":'Keine Modelle konfiguriert. Verwende den Tab "Modelle finden" zum Herunterladen.'}):oe.map(K=>{const Se=k.includes(K.name),Ce=B2(K.name);return l.jsxs("div",{className:te("rounded-xl border bg-card/45 backdrop-blur-md p-3.5 shadow-lg shadow-black/5 flex flex-col sm:flex-row sm:items-center justify-between gap-3 hover:border-primary/40 transition-all",Se?"border-primary/45":K.role?"border-primary/30 bg-primary/5":"border-border/60"),children:[l.jsxs("div",{className:"flex items-center gap-3 min-w-0",children:[l.jsx("div",{className:te("w-8 h-8 rounded-lg border border-border/40 flex items-center justify-center font-bold text-xs shrink-0 shadow-sm",Ce.color),title:Ce.name,children:Ce.initial}),l.jsxs("div",{className:"min-w-0 text-left",children:[l.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[l.jsx("h4",{className:"text-xs font-bold text-foreground truncate max-w-[250px] sm:max-w-[400px] break-all font-mono",title:K.name,children:K.name.split("/").pop()}),K.role&&l.jsx(so,{role:K.role,dense:!0,className:"shrink-0"}),b(K.role)&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-background/40 border border-border/40 text-[8px] font-semibold text-muted-foreground shrink-0",title:"Lebenswichtig für Lucy — geschützt vor Löschen/Entladen.",children:"🔒 geschützt"}),v&&P(K.name)&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-fuchsia-500/10 border border-fuchsia-500/30 text-[8px] font-mono text-fuchsia-300 font-bold uppercase shrink-0",title:"Ko-resident in der brains-Gruppe — bleibt mit dem Hirn gemeinsam warm.",children:"🧠 Ko-resident"}),v&&K.prompt_cache&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-cyan-500/10 border border-cyan-500/20 text-[8px] font-mono text-cyan-400 font-bold uppercase shrink-0",title:"Prompt Caching aktiv",children:"PC"}),v&&(K.spec_active?l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-emerald-500/10 border border-emerald-500/20 text-[8px] font-mono text-emerald-400 font-bold uppercase shrink-0",title:`Speculative Decoding aktiv (Draft: ${K.spec_draft_model})`,children:"SPEC"}):K.spec_draft_model?l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/20 text-[8px] font-mono text-amber-400 font-bold uppercase shrink-0",title:`Draft gesetzt (${K.spec_draft_model}), aber INAKTIV — --spec-type fehlt oder Vocab inkompatibel.`,children:"SPEC?"}):null),v&&K.parallel_slots>1&&l.jsxs("span",{className:"px-1.5 py-0.5 rounded bg-violet-500/10 border border-violet-500/20 text-[8px] font-mono text-violet-400 font-bold uppercase shrink-0",title:`${K.parallel_slots} parallele Slots aktiv`,children:["SLOTS: ",K.parallel_slots]}),K.incomplete&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/20 text-[8px] font-mono text-amber-400 font-bold uppercase shrink-0",title:"GGUF-Datei fehlt",children:"⚠ Datei fehlt"}),Se&&l.jsxs("span",{className:"flex items-center gap-0.5 text-[8px] font-semibold text-emerald-400 uppercase tracking-wider shrink-0",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"})," warm"]})]}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2 mt-0.5",children:[l.jsxs("span",{children:["Größe: ",Mr(K.size_bytes)]}),l.jsx("span",{children:"•"}),l.jsxs("span",{children:["Kontext: ",Rw(K.ctx)]}),l.jsx("span",{children:"•"}),l.jsx("span",{className:"font-mono text-[9px]",children:K.quant||"GGUF"})]})]})]}),l.jsxs("div",{className:"flex items-center gap-3 shrink-0 self-end sm:self-auto",children:[l.jsx("div",{className:"hidden lg:flex flex-wrap gap-1",children:l.jsx(H2,{caps:K.capabilities})}),l.jsxs("div",{className:"flex items-center gap-1.5",children:[(()=>{const Ge=b(K.role),nt=Se&&Ge,q=K.incomplete&&!Se||nt;return l.jsx("button",{onClick:()=>Se?J(K.name):re(K.name),disabled:q,title:nt?`„${ir(K.role).label}" bleibt geladen (geschützt).`:void 0,className:te("h-7 px-3 rounded-lg text-[9px] font-bold uppercase transition-all border flex items-center gap-1",q?"border-border/30 bg-background/10 text-muted-foreground/50 cursor-not-allowed":Se?"border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/15 text-amber-400 cursor-pointer":"border-primary/30 bg-primary/5 hover:bg-primary/15 text-primary cursor-pointer"),children:nt?"🔒 geladen":Se?"Entladen":"Laden"})})(),v&&l.jsx("button",{onClick:()=>ee(K.name,K.ctx),className:"h-7 px-2.5 rounded-lg border border-border/40 text-[9px] font-bold uppercase hover:bg-accent text-muted-foreground transition-all cursor-pointer",title:"Kontextlänge anpassen",children:"Ctx"}),v&&E&&l.jsx("button",{onClick:()=>O(K.name),className:te("h-7 px-2.5 rounded-lg border text-[9px] font-bold uppercase transition-colors cursor-pointer",P(K.name)?"border-fuchsia-500/40 bg-fuchsia-500/10 text-fuchsia-300 hover:bg-fuchsia-500/20":"border-border/40 text-muted-foreground hover:bg-accent"),title:P(K.name)?"Ko-resident (brains): bleibt mit dem Hirn gemeinsam warm. Klick = aus der Gruppe nehmen.":"Zur brains-Gruppe hinzufügen — lädt dann ko-resident neben dem Hirn, statt es zu verdrängen.",children:"🧠"}),v&&l.jsxs("button",{onClick:()=>U(K),className:te("h-7 px-2.5 rounded-lg border text-[9px] font-bold uppercase transition-all cursor-pointer flex items-center gap-1",K.spec_active?"border-emerald-500/30 text-emerald-400 hover:bg-emerald-500/10":K.spec_draft_model?"border-amber-500/30 text-amber-400 hover:bg-amber-500/10":"border-border/40 text-muted-foreground hover:bg-accent"),title:"Speculative Draft konfigurieren (Vocab-geprüft)",children:[l.jsx(ma,{className:"h-3 w-3"})," Spec"]}),l.jsx("button",{onClick:()=>Z(K.name),disabled:b(K.role),className:te("h-7 w-7 rounded-lg flex items-center justify-center border border-border/40 transition-all",b(K.role)?"text-muted-foreground/40 cursor-not-allowed":"text-muted-foreground hover:text-red-400 hover:bg-red-500/5 cursor-pointer"),"aria-label":"Modell löschen",title:b(K.role)?`„${ir(K.role).label}" ist geschützt und kann nicht gelöscht werden.`:"Modell löschen",children:l.jsx(iv,{className:"h-3.5 w-3.5","aria-hidden":"true"})})]})]})]},K.name)})})]}),D&&l.jsx(kX,{role:D,roleRec:F,models:j,onAssign:K=>{_(D,K),B(null)},onClose:()=>B(null)}),Y&&l.jsx(bX,{model:Y,onClose:()=>U(null),onChanged:N}),g]})}const AX=[{key:"popular",label:"Beliebt",q:""},{key:"coder",label:"Coder",q:"coder"},{key:"vision",label:"Vision",q:"vision"},{key:"reasoning",label:"Reasoning",q:"reasoning"},{key:"small",label:"Klein (≤4B)",q:"3B"}],CX=["fast","heavy","coder","vision","hermes","scout"],PX=new Intl.NumberFormat(void 0,{notation:"compact",maximumFractionDigits:1});function K2(e){return PX.format(e)}function OX(){const{data:e}=xi(),t=(e==null?void 0:e.models)??[],[r,n]=y.useState(""),[a,o]=y.useState([]),[u,c]=y.useState(!1),[f,h]=y.useState(""),[m,g]=y.useState("popular"),[v,b]=y.useState(""),[j,k]=y.useState(null),[S,N]=y.useState([]),[E,A]=y.useState("Q4_K_M"),[P,M]=y.useState(""),[O,D]=y.useState(null),[B,F]=y.useState(!1),[z,Y]=y.useState({});async function U(_){c(!0),h("");try{const W=await je(`/api/hf/search?q=${encodeURIComponent(_)}`);o(W.results),W.results.length||h("Keine Ergebnisse.")}catch(W){h(`Suche fehlgeschlagen: ${W}`)}finally{c(!1)}}y.useEffect(()=>{U("")},[]);function me(_){g(_.key),n(""),U(_.q)}function ue(){g(""),U(r)}async function ge(_,W,ee){F(!1);try{const Z=await je(`/api/fit?params_b=0&quant=${encodeURIComponent(W)}&ctx=8192&name=${encodeURIComponent(_)}&role=${encodeURIComponent(ee)}`);D(Z)}catch{D(null)}}async function ie(_){if(j===_){k(null);return}k(_),N([]),D(null),M(""),F(!1),h("Analysiere Repository…");try{const W=await je(`/api/hf/quants?repo=${encodeURIComponent(_)}`);N(W.quants);const ee=W.quants.includes("Q4_K_M")?"Q4_K_M":W.quants[0]||"Q4_K_M";A(ee),h(W.quants.length?"":"Keine GGUF-Dateien in diesem Repo gefunden."),W.quants.length&&ge(W.repo,ee,"")}catch(W){h(`Fehler: ${W}`)}}function oe(){const _=v.trim();_&&(o(W=>W.some(ee=>ee.repo===_)?W:[{repo:_,downloads:0,likes:0},...W]),b(""),ie(_))}const X=P?t.find(_=>(_.role||"").toLowerCase()===P):void 0;async function re(_){if((O==null?void 0:O.fit.level)==="too_tight"&&!B){F(!0);return}Y(W=>({...W,[_]:"Starte…"}));try{await je("/api/models/install",{method:"POST",body:JSON.stringify({repo:_,quant:E,role:P||void 0,jinja:!0})}),Y(W=>({...W,[_]:"Download läuft"})),F(!1)}catch{Y(ee=>({...ee,[_]:"Fehler"}))}}const J=_=>{var ee;const W=((ee=_.split("/").pop())==null?void 0:ee.toLowerCase().replace(/-gguf$/i,""))||"";return W.length>3&&t.some(Z=>Z.name.toLowerCase().includes(W))},I=_=>_==="perfect"?"text-emerald-400 border-emerald-500/40 bg-emerald-500/10":_==="marginal"?"text-amber-400 border-amber-500/40 bg-amber-500/10":"text-red-400 border-red-500/40 bg-red-500/10";return l.jsxs("div",{className:"space-y-5",children:[l.jsxs("div",{className:"flex gap-2",children:[l.jsxs("div",{className:"relative flex-1",children:[l.jsx(PN,{className:"absolute left-3 top-2.5 h-4 w-4 text-muted-foreground"}),l.jsx("input",{value:r,onChange:_=>n(_.target.value),onKeyDown:_=>_.key==="Enter"&&ue(),"aria-label":"HuggingFace durchsuchen",type:"search",spellCheck:!1,placeholder:"HuggingFace durchsuchen (z.B. Qwen Coder, Llama-3.1, gemma)…",className:"w-full h-10 pl-9 pr-3 rounded-xl border border-border/60 bg-background/40 text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground"})]}),l.jsx("button",{onClick:ue,className:"h-10 px-5 rounded-xl bg-primary text-primary-foreground text-xs font-semibold hover:opacity-90 transition-all cursor-pointer",children:"Suchen"})]}),l.jsx("div",{className:"flex items-center gap-2 flex-wrap",children:AX.map(_=>l.jsxs("button",{onClick:()=>me(_),className:te("flex items-center gap-1.5 rounded-full px-3 py-1.5 text-[11px] font-semibold transition-all cursor-pointer border",m===_.key?"bg-primary/15 text-primary border-primary/30":"border-border/50 text-muted-foreground hover:text-foreground hover:border-border"),children:[_.key==="popular"&&l.jsx(u4,{className:"h-3 w-3"}),_.label]},_.key))}),u?l.jsx("div",{className:"text-xs text-muted-foreground py-10 text-center",children:"Lade GGUF-Modelle von HuggingFace…"}):l.jsxs("div",{className:"space-y-2",children:[a.map(_=>{const W=j===_.repo,ee=J(_.repo),Z=_.repo.includes("/")?_.repo.split("/")[0]:"—",he=_.repo.split("/").pop();return l.jsxs("div",{className:te("rounded-xl border bg-card/45 backdrop-blur-md transition-all",W?"border-primary/40 shadow-lg shadow-primary/5":"border-border/50 hover:border-primary/30"),children:[l.jsxs("button",{onClick:()=>ie(_.repo),className:"w-full flex items-center gap-3 p-3.5 text-left cursor-pointer",children:[l.jsxs("div",{className:"min-w-0 flex-1",children:[l.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[l.jsx("span",{className:"text-xs font-bold font-mono text-foreground truncate max-w-[280px]",title:_.repo,children:he}),ee&&l.jsxs("span",{className:"flex items-center gap-1 text-[8px] font-bold text-emerald-400 uppercase tracking-wider bg-emerald-500/10 border border-emerald-500/20 px-1.5 py-0.5 rounded",children:[l.jsx(or,{className:"h-2.5 w-2.5"})," installiert"]})]}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-3 mt-0.5 font-mono",children:[l.jsx("span",{children:Z}),l.jsxs("span",{className:"flex items-center gap-1",children:[l.jsx(Ms,{className:"h-3 w-3"})," ",K2(_.downloads)]}),_.likes>0&&l.jsxs("span",{className:"flex items-center gap-1",children:[l.jsx(m4,{className:"h-3 w-3"})," ",K2(_.likes)]})]})]}),W?l.jsx(AN,{className:"h-4 w-4 text-muted-foreground shrink-0"}):l.jsx(EN,{className:"h-4 w-4 text-muted-foreground shrink-0"})]}),W&&l.jsx("div",{className:"border-t border-border/30 p-3.5 space-y-3",children:S.length===0?l.jsx("div",{className:"text-[11px] text-muted-foreground font-mono",children:f||"Lade Quants…"}):l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[l.jsx("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground",children:"Quant"}),l.jsx("select",{value:E,onChange:pe=>{A(pe.target.value),ge(_.repo,pe.target.value,P)},"aria-label":"Quantisierung",className:"h-8 rounded-lg border border-border/60 bg-background/40 px-2 text-xs text-foreground font-semibold outline-none",children:S.map(pe=>l.jsx("option",{value:pe,className:"bg-popover text-foreground",children:pe},pe))}),l.jsx("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground ml-1",children:"Rolle"}),l.jsxs("select",{value:P,onChange:pe=>{M(pe.target.value),ge(_.repo,E,pe.target.value)},"aria-label":"Rolle",title:"Optional — bestimmt Auto-Konfiguration + setup-bewussten Kontext",className:"h-8 rounded-lg border border-border/60 bg-background/40 px-2 text-xs text-foreground font-semibold outline-none",children:[l.jsx("option",{value:"",className:"bg-popover text-foreground",children:"keine"}),CX.map(pe=>l.jsx("option",{value:pe,className:"bg-popover text-foreground",children:pe},pe))]}),l.jsx("button",{onClick:()=>re(_.repo),disabled:!!z[_.repo]&&z[_.repo]==="Download läuft",className:te("h-8 px-3.5 ml-auto rounded-lg text-xs font-semibold transition-all cursor-pointer flex items-center gap-1.5",B?"bg-red-500 text-white hover:opacity-90":"bg-primary text-primary-foreground hover:opacity-90"),children:z[_.repo]?z[_.repo]:B?l.jsxs(l.Fragment,{children:[l.jsx(mi,{className:"h-3.5 w-3.5"})," OOM — trotzdem laden"]}):l.jsxs(l.Fragment,{children:[l.jsx(Ms,{className:"h-3.5 w-3.5"})," Herunterladen"]})})]}),O&&l.jsxs("div",{className:te("flex flex-wrap items-center gap-x-3 gap-y-1 rounded-lg border px-3 py-2 text-[11px] font-medium",I(O.fit.level)),children:[l.jsx("span",{className:"font-bold uppercase tracking-wide",children:O.fit.text}),l.jsxs("span",{className:"font-mono opacity-90",children:["~",O.params_b,"B · ~",O.fit.req_gb," GB / ",O.sys_ram_gb," GB · ~",O.fit.tps," t/s"]}),O.fit.level!=="too_tight"?l.jsxs("span",{className:"font-mono opacity-80",children:["ctx → ",(O.assigned_ctx/1024).toFixed(0),"k"]}):l.jsx("span",{className:"opacity-90",children:"— passt nicht, würde beim Laden abstürzen (OOM)."})]}),X&&l.jsxs("div",{className:"flex items-start gap-2 rounded-lg border border-amber-500/40 bg-amber-500/10 px-3 py-2 text-[11px] text-amber-400",children:[l.jsx(mi,{className:"h-3.5 w-3.5 mt-0.5 shrink-0"}),l.jsxs("span",{children:["Rolle ",l.jsxs("strong",{children:["„",P,'"']})," hält aktuell ",l.jsx("strong",{children:X.name.split("/").pop()})," — wird beim Download übernommen."]})]})]})})]},_.repo)}),!a.length&&!u&&l.jsx("div",{className:"text-xs text-muted-foreground py-10 text-center",children:f||"Keine Ergebnisse."})]}),l.jsxs("div",{className:"border-t border-border/30 pt-4 flex flex-col sm:flex-row gap-2 items-stretch sm:items-center",children:[l.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground shrink-0",children:"Direkt:"}),l.jsx("input",{value:v,onChange:_=>b(_.target.value),onKeyDown:_=>_.key==="Enter"&&oe(),"aria-label":"Repository oder URL direkt eingeben",spellCheck:!1,placeholder:"org/repo oder HF-URL (z.B. unsloth/Qwen2.5-Coder-7B-Instruct-GGUF)",className:"flex-1 h-9 rounded-lg border border-border/60 bg-background/40 px-3 text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground font-mono"}),l.jsx("button",{onClick:oe,className:"h-9 px-4 rounded-lg border border-border/60 bg-background/20 text-xs font-semibold hover:border-primary/50 hover:bg-background/40 transition-all cursor-pointer whitespace-nowrap",children:"Laden"})]})]})}const _X={fast:{title:"Schnelles Alltags-Hirn",desc:"Schnelle MoE-Antworten für Chat, Zusammenfassungen und alltägliche Aufgaben.",icon:ma},heavy:{title:"Schweres Reasoning",desc:"Große Modelle für komplexe Logik, Mathematik und tiefgründiges Planen.",icon:yo},coder:{title:"Coden & Entwicklung",desc:"Autovervollständigung, Refactoring und Codegenerierung direkt in deiner IDE.",icon:_s},vision:{title:"Bilder & Vision",desc:"Verarbeitet Bilder, Screenshots und visuelle Diagramme in multimodalen Chats.",icon:ef},hermes:{title:"Lucys Hirn (Agent)",desc:"Lucys dauer-warmes Agent-Hirn mit Tool-Calling — bleibt ko-resident, lädt nie kalt nach.",icon:Q3},scout:{title:"Multimodal-Allrounder",desc:"Multimodaler Allrounder für schnelle Antworten, Übersetzungen und Alltag.",icon:rv}};function MX(){const{data:e,isLoading:t,error:r}=RD(),{data:n}=xi(),{data:a}=uh(),o=(n==null?void 0:n.models)??[],u=r?String(r):"",[c,f]=y.useState({}),[h,m]=y.useState({}),[g,v]=y.useState("recommended");async function b(j,k,S,N){f(E=>({...E,[j]:"Starte..."}));try{await je("/api/models/install",{method:"POST",body:JSON.stringify({repo:j,role:k,quant:S,jinja:N})}),f(E=>({...E,[j]:"Download läuft"}))}catch{f(A=>({...A,[j]:"Fehler"}))}}return l.jsxs("div",{className:"space-y-6",children:[l.jsx("div",{className:"flex rounded-xl border border-border/60 bg-card/45 backdrop-blur-md p-1 w-fit",children:[["recommended","Empfohlen"],["browse","Stöbern & Suchen"]].map(([j,k])=>l.jsx("button",{onClick:()=>v(j),className:te("rounded-lg px-4 py-1.5 text-xs font-semibold tracking-wide transition-all cursor-pointer",g===j?"bg-primary text-primary-foreground shadow-md shadow-primary/10":"text-muted-foreground hover:text-foreground"),children:k},j))}),g==="browse"?l.jsx(OX,{}):t?l.jsx("div",{className:"text-xs text-muted-foreground py-12 text-center",children:"Analysiere Hardware und suche passende GGUF-Empfehlungen…"}):u||!e?l.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400",children:["Empfehlungsdienst temporär nicht erreichbar (",u,")."]}):l.jsxs("div",{className:"space-y-8",children:[l.jsxs("div",{className:"text-[10px] font-mono text-muted-foreground bg-background/25 border border-border/40 p-4 rounded-xl flex flex-col sm:flex-row sm:items-center justify-between gap-3 shadow-sm",children:[l.jsxs("div",{children:["Modell-Registry geladen für ",l.jsxs("span",{className:"text-foreground font-bold",children:[e.sys_ram_gb," GB"]})," System-RAM."]}),l.jsxs("div",{className:"flex items-center gap-1.5",children:[l.jsx(F4,{className:"h-3.5 w-3.5 text-primary fill-primary/20"}),l.jsx("span",{children:"Empfehlungen sind automatisch auf deine Box-Hardware optimiert."})]})]}),l.jsx("div",{className:"grid gap-6 md:grid-cols-2",children:e.categories.map(j=>{const k=_X[j.role]||{title:j.title||j.role,desc:"Spezifisches Modell für diese Systemrolle.",icon:vy},S=k.icon,N=o.find(D=>D.role===j.role),E=a==null?void 0:a.model_list.find(D=>D.role===j.role),A=j.models.find(D=>D.repo===j.recommended)||j.models[0];if(!A)return null;const P=c[A.repo],M=j.models.filter(D=>D.repo!==j.recommended),O=!!h[j.role];return l.jsxs("div",{className:te("rounded-2xl border bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 flex flex-col justify-between gap-5 transition-all duration-300 hover:border-primary/40",N?"border-border/60":"border-primary/20 shadow-primary/5"),children:[l.jsxs("div",{className:"space-y-4",children:[l.jsxs("div",{className:"flex items-start justify-between gap-3",children:[l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsx("div",{className:"w-10 h-10 rounded-xl bg-primary/10 border border-primary/20 flex items-center justify-center text-primary shadow-sm shrink-0",children:l.jsx(S,{className:"h-5.5 w-5.5"})}),l.jsxs("div",{children:[l.jsx("h3",{className:"text-sm font-bold tracking-tight text-foreground",children:k.title}),l.jsxs("span",{className:"text-[9px] font-mono text-muted-foreground uppercase bg-background/50 px-1.5 py-0.5 rounded border border-border/30 inline-block mt-0.5",children:["Rolle: ",j.role]})]})]}),N?l.jsxs("span",{className:"flex items-center gap-1.5 text-[9px] font-bold text-emerald-400 uppercase tracking-wider bg-emerald-500/10 border border-emerald-500/20 px-2.5 py-1 rounded-lg",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"}),"Aktiviert"]}):l.jsx("span",{className:"text-[9px] font-bold text-primary/70 uppercase tracking-wider bg-primary/10 border border-primary/20 px-2.5 py-1 rounded-lg",children:"Frei"})]}),l.jsx("p",{className:"text-xs text-muted-foreground leading-relaxed",children:k.desc}),l.jsx("div",{className:"p-3.5 rounded-xl bg-background/35 border border-border/30 space-y-2.5",children:N?l.jsxs("div",{className:"space-y-1.5",children:[l.jsx("div",{className:"text-[9px] font-bold uppercase tracking-wider text-muted-foreground/60",children:"Aktive GGUF-Belegung"}),l.jsx("div",{className:"text-xs font-mono font-bold text-foreground truncate",title:N.name,children:N.name.split("/").pop()}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2",children:[l.jsxs("span",{children:["Größe: ",pv(N.size_bytes||0)]}),l.jsx("span",{children:"•"}),l.jsxs("span",{children:["Quant: ",N.quant||"GGUF"]})]})]}):l.jsxs("div",{className:"space-y-1.5",children:[l.jsx("div",{className:"text-[9px] font-bold uppercase tracking-wider text-primary/80",children:"Empfohlenes Modell"}),l.jsx("div",{className:"text-xs font-mono font-bold text-foreground truncate",title:A.name,children:A.name}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2 flex-wrap",children:[l.jsxs("span",{children:["Ersteller: ",A.author]}),l.jsx("span",{children:"•"}),l.jsxs("span",{children:["Quant: ",A.quant]})]}),l.jsx("div",{className:"flex items-center gap-1.5 pt-0.5",children:l.jsx(hX,{fit:A.fit})})]})}),l.jsx("div",{className:"pt-1",children:N?E?l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"text-[9px] font-semibold text-amber-400 flex items-center gap-1.5",children:[l.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-amber-400 animate-ping shrink-0"}),l.jsxs("span",{children:["Bessere Version in der Registry: ",E.repo.split("/").pop()]})]}),l.jsxs("button",{onClick:()=>b(E.repo,j.role,A.quant||"Q4_K_M",A.caps.tools!=="no"),disabled:!!c[E.repo],className:"h-8 w-full flex items-center justify-center gap-1.5 rounded-lg bg-amber-500 text-black text-xs font-bold hover:bg-amber-400 disabled:opacity-50 transition-all cursor-pointer shadow-md shadow-amber-500/10",children:[l.jsx(Ms,{className:"h-3.5 w-3.5"}),c[E.repo]||"Auf neue Version aktualisieren"]})]}):l.jsxs("div",{className:"h-8 flex items-center justify-center gap-1.5 text-[10px] font-bold text-emerald-400 uppercase tracking-wide bg-emerald-500/5 border border-emerald-500/10 rounded-lg select-none",children:[l.jsx(or,{className:"h-4 w-4"})," Auf neuestem Stand"]}):l.jsxs("button",{onClick:()=>b(A.repo,j.role,A.quant||"Q4_K_M",A.caps.tools!=="no"),disabled:!!P,className:te("h-8 w-full flex items-center justify-center gap-1.5 rounded-lg text-xs font-bold transition-all cursor-pointer border",P?"border-primary/40 bg-primary/5 text-primary":"bg-primary text-primary-foreground hover:opacity-90 shadow-md shadow-primary/10"),children:[l.jsx(Ms,{className:"h-3.5 w-3.5"}),P||"Optimales Modell einsetzen"]})})]}),M.length>0&&l.jsxs("div",{className:"border-t border-border/20 pt-3",children:[l.jsxs("button",{onClick:()=>m(D=>({...D,[j.role]:!O})),className:"flex items-center gap-1.5 text-[10px] text-muted-foreground/80 hover:text-foreground transition-colors cursor-pointer",children:[O?l.jsx(AN,{className:"h-3 w-3"}):l.jsx(EN,{className:"h-3 w-3"}),l.jsxs("span",{children:["Alternative Empfehlungen anzeigen (",M.length,")"]})]}),O&&l.jsx("div",{className:"mt-2.5 space-y-2 max-h-36 overflow-y-auto pr-1 scrollbar-thin",children:M.map(D=>l.jsxs("div",{className:"p-2 rounded-lg bg-background/25 border border-border/20 flex items-center justify-between gap-3",children:[l.jsxs("div",{className:"min-w-0",children:[l.jsx("div",{className:"text-[10px] font-mono font-bold text-foreground truncate",title:D.name,children:D.name}),l.jsxs("div",{className:"text-[9px] text-muted-foreground flex items-center gap-1.5 mt-0.5",children:[l.jsxs("span",{children:["Quant: ",D.quant]}),l.jsx("span",{children:"•"}),l.jsx("span",{children:D.fit.text})]})]}),l.jsx("button",{onClick:()=>b(D.repo,j.role,D.quant||"Q4_K_M",D.caps.tools!=="no"),disabled:!!c[D.repo],className:"h-6 px-2.5 rounded bg-background/40 hover:bg-background/80 border border-border/40 text-[9px] font-bold text-foreground transition-all cursor-pointer shrink-0 disabled:opacity-50",children:c[D.repo]||"Installieren"})]},D.repo))})]})]},j.role)})})]})]})}function IX(){const[e,t]=y.useState("cockpit");return l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{className:"flex flex-col sm:flex-row justify-between sm:items-center gap-4",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Modell-Manager"}),l.jsx("p",{className:"text-sm text-muted-foreground",children:"Verwalte deine Modelle und passe das Gateway-Routing live über das interaktive Cockpit an."})]}),l.jsx("div",{className:"flex rounded-xl border border-border/60 bg-card/45 backdrop-blur-md p-1 self-start",children:["cockpit","discover"].map(r=>l.jsx("button",{onClick:()=>t(r),className:te("rounded-lg px-4 py-1.5 text-xs font-semibold tracking-wide uppercase transition-all cursor-pointer",e===r?"bg-primary text-primary-foreground shadow-md shadow-primary/10":"text-muted-foreground hover:text-foreground"),children:r==="cockpit"?"Cockpit":"Modelle finden"},r))})]}),l.jsx(xX,{}),l.jsx("div",{className:"transition-all duration-300",children:e==="cockpit"?l.jsx(GO,{}):l.jsx(MX,{})})]})}const TX={cline:"cline_settings.json",cursor:"Settings → Models",opencode:"opencode.jsonc",zed:"settings.json",continue:"~/.continue/config.json",claude_code:"~/.zshrc / env"};function G2({line:e,loading:t}){return t||!e?l.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] font-semibold text-muted-foreground",children:[l.jsx(rh,{className:"h-3 w-3 animate-spin"})," prüfe…"]}):e.ok?l.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] font-semibold text-emerald-400",children:[l.jsx(e4,{className:"h-3 w-3"})," ",e.detail]}):l.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] font-semibold text-red-400",children:[l.jsx(r4,{className:"h-3 w-3"})," ",e.detail]})}function V2({tool:e,fileName:t,accent:r,copied:n,onCopy:a}){return l.jsxs("div",{className:"flex flex-col border border-border/60 bg-black/60 rounded-2xl overflow-hidden shadow-2xl",children:[l.jsxs("div",{className:"flex h-11 items-center justify-between px-4 border-b border-border/40 bg-black/40 shrink-0",children:[l.jsxs("div",{className:"flex items-center gap-1.5",children:[l.jsx("span",{className:"h-3 w-3 rounded-full bg-red-500/80"}),l.jsx("span",{className:"h-3 w-3 rounded-full bg-amber-500/80"}),l.jsx("span",{className:"h-3 w-3 rounded-full bg-emerald-500/80"})]}),l.jsx("div",{className:"flex items-center gap-1.5 text-[10px] font-mono text-muted-foreground/75 bg-background/30 px-3 py-1 rounded-md border border-border/20",children:l.jsx("span",{children:t})}),l.jsxs("button",{onClick:a,className:"flex h-7 px-2.5 items-center gap-1.5 rounded-lg border border-border/40 bg-background/30 text-[10px] font-semibold text-muted-foreground hover:text-foreground hover:bg-background/60 transition-all cursor-pointer",children:[n?l.jsx(or,{className:"h-3.5 w-3.5 text-emerald-400"}):l.jsx(nv,{className:"h-3.5 w-3.5"}),l.jsx("span",{children:n?"Kopiert":"Kopieren"})]})]}),l.jsx("pre",{className:te("p-5 overflow-x-auto text-xs font-mono whitespace-pre leading-relaxed scrollbar-thin select-text bg-black/10",r==="teal"?"text-cyan-200/90":"text-violet-200/90"),children:l.jsx("code",{children:e.snippet})})]})}function VO(){const[e,t]=y.useState(localStorage.getItem("mc_host")||"192.168.178.151"),[r,n]=y.useState(localStorage.getItem("mc_mcp_path")||""),[a,o]=y.useState("cline"),[u,c]=y.useState(null),f=new URLSearchParams({host:e});r&&f.set("mcp_path",r);const{data:h,error:m}=$D(f.toString()),{data:g,isLoading:v}=zD(),b=m?String(m):"";function j(E){t(E),E&&localStorage.setItem("mc_host",E)}function k(E){n(E),localStorage.setItem("mc_mcp_path",E)}const S=h==null?void 0:h.tools[a];async function N(E,A){A&&(await navigator.clipboard.writeText(A),c(E),setTimeout(()=>c(null),1500))}return l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Verbindung & Integration"}),l.jsxs("p",{className:"text-sm text-muted-foreground",children:["Binde deinen lokalen Agenten an die Box an — über ",l.jsx("span",{className:"text-foreground",children:"zwei getrennte Leitungen"}),": das Modell (Gateway) und das geteilte Gedächtnis (MCP)."]})]}),l.jsxs("div",{className:"p-5 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md shadow-lg shadow-black/10",children:[l.jsxs("div",{className:"grid gap-4 md:grid-cols-[170px_1fr] items-center",children:[l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-background/40 p-4 text-center",children:[l.jsx(g4,{className:"h-7 w-7 mx-auto text-muted-foreground"}),l.jsx("div",{className:"mt-2 text-sm font-semibold text-foreground",children:"Dein lokaler Agent"}),l.jsx("div",{className:"text-[11px] text-muted-foreground",children:"Cline · Cursor · Zed …"})]}),l.jsxs("div",{className:"flex flex-col gap-2.5",children:[l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsx(Zd,{className:"h-4 w-4 text-muted-foreground shrink-0"}),l.jsxs("div",{className:"flex-1 rounded-xl border border-primary/25 bg-primary/5 px-3.5 py-2.5",children:[l.jsxs("div",{className:"flex items-center justify-between gap-2",children:[l.jsxs("div",{className:"flex items-center gap-2 text-xs font-semibold text-primary",children:[l.jsx($n,{className:"h-3.5 w-3.5"})," Leitung 1 — Modell"]}),l.jsx(G2,{line:g==null?void 0:g.gateway,loading:v})]}),l.jsx("div",{className:"mt-1 text-[11px] font-mono text-primary/80",children:"Gateway · :9001/v1 · Lanes chat / coding"})]})]}),l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsx(Zd,{className:"h-4 w-4 text-muted-foreground shrink-0"}),l.jsxs("div",{className:"flex-1 rounded-xl border border-violet-500/25 bg-violet-500/5 px-3.5 py-2.5",children:[l.jsxs("div",{className:"flex items-center justify-between gap-2",children:[l.jsxs("div",{className:"flex items-center gap-2 text-xs font-semibold text-violet-300",children:[l.jsx(yo,{className:"h-3.5 w-3.5"})," Leitung 2 — Gedächtnis"]}),l.jsx(G2,{line:g==null?void 0:g.memory,loading:v})]}),l.jsx("div",{className:"mt-1 text-[11px] font-mono text-violet-300/80",children:"MCP · mcp_memory.py · separat"})]})]})]})]}),l.jsxs("p",{className:"mt-3.5 text-[11px] text-muted-foreground leading-relaxed",children:["Der Gateway liefert ",l.jsx("span",{className:"text-foreground",children:"nur das LLM"}),". Das geteilte Gedächtnis läuft über einen",l.jsx("span",{className:"text-foreground",children:" eigenen MCP-Server"})," — beide werden unabhängig eingerichtet."]})]}),l.jsxs("div",{className:"grid gap-4 md:grid-cols-2 p-5 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md shadow-lg shadow-black/10",children:[l.jsxs("div",{className:"space-y-1.5",children:[l.jsxs("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground flex items-center gap-1.5",children:[l.jsx(f4,{className:"h-3.5 w-3.5 text-primary"})," Box LAN IP-Adresse"]}),l.jsx("input",{value:e,onChange:E=>j(E.target.value),"aria-label":"Box LAN IP-Adresse",spellCheck:!1,placeholder:"z.B. 192.168.178.151",className:"w-full h-9 rounded-lg border border-border/60 bg-background/40 px-3 font-mono text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground"})]}),l.jsxs("div",{className:"space-y-1.5",children:[l.jsxs("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground flex items-center gap-1.5",children:[l.jsx(c4,{className:"h-3.5 w-3.5 text-violet-400"})," Lokaler MCP-Scriptpfad",l.jsx("span",{className:"text-violet-400/70 normal-case font-semibold tracking-normal",children:"(nur Leitung 2)"})]}),l.jsx("input",{value:r,onChange:E=>k(E.target.value),"aria-label":"Lokaler MCP-Scriptpfad",spellCheck:!1,placeholder:"z.B. F:\\Coding Stuff\\mission-control-2\\mcp\\mcp_memory.py",className:"w-full h-9 rounded-lg border border-border/60 bg-background/40 px-3 font-mono text-xs outline-none focus:ring-1 focus:ring-violet-500/50 text-foreground"})]})]}),b&&l.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400",children:["Fehler beim Generieren der Snippets: ",b]}),h&&l.jsxs("div",{className:"grid gap-5 lg:grid-cols-2",children:[l.jsxs("div",{className:"space-y-3 rounded-2xl border border-border/60 border-t-2 border-t-primary/70 bg-card/30 p-4",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center gap-2 text-sm font-space font-bold text-foreground",children:[l.jsx("span",{className:"flex h-5 w-5 items-center justify-center rounded-md bg-primary/15 text-primary text-[11px]",children:"1"}),"Modell anbinden"]}),l.jsx("p",{className:"text-[11px] text-muted-foreground mt-0.5",children:"Wähle dein Tool — das Snippet zeigt auf den Gateway."})]}),l.jsx("div",{className:"flex flex-wrap gap-1.5",children:Object.entries(h.tools).map(([E,A])=>l.jsx("button",{onClick:()=>o(E),className:te("rounded-lg px-3 py-1.5 text-[11px] font-semibold tracking-wide transition-all cursor-pointer",a===E?"bg-primary text-primary-foreground shadow-md shadow-primary/10":"border border-border/50 text-muted-foreground hover:text-foreground"),children:A.label},E))}),S&&l.jsxs(l.Fragment,{children:[S.note&&l.jsxs("div",{className:"flex items-start gap-2.5 p-3 rounded-xl bg-primary/5 border border-primary/20 text-[11px] text-muted-foreground leading-relaxed",children:[l.jsx(hw,{className:"h-4 w-4 text-primary shrink-0 mt-0.5"}),l.jsx("span",{children:S.note})]}),l.jsx(V2,{tool:S,fileName:TX[a]||"config.json",accent:"teal",copied:u==="model",onCopy:()=>N("model",S.snippet)})]})]}),l.jsxs("div",{className:"space-y-3 rounded-2xl border border-border/60 border-t-2 border-t-violet-500/70 bg-card/30 p-4",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center gap-2 text-sm font-space font-bold text-foreground",children:[l.jsx("span",{className:"flex h-5 w-5 items-center justify-center rounded-md bg-violet-500/15 text-violet-300 text-[11px]",children:"2"}),"Gedächtnis anbinden",l.jsx("span",{className:"text-[10px] font-medium text-muted-foreground normal-case",children:"optional"})]}),l.jsxs("p",{className:"text-[11px] text-muted-foreground mt-0.5",children:["Ein MCP-Block — gilt zusätzlich für ",l.jsx("em",{children:"jedes"})," Tool aus Schritt 1."]})]}),l.jsxs("div",{className:"flex items-start gap-2.5 p-3 rounded-xl bg-violet-500/5 border border-violet-500/20 text-[11px] text-muted-foreground leading-relaxed",children:[l.jsx(hw,{className:"h-4 w-4 text-violet-400 shrink-0 mt-0.5"}),l.jsx("span",{children:h.memory.note})]}),l.jsx(V2,{tool:h.memory,fileName:"mcp.json",accent:"violet",copied:u==="memory",onCopy:()=>N("memory",h.memory.snippet)})]})]})]})}const DX="modulepreload",RX=function(e){return"/"+e},q2={},LX=function(t,r,n){let a=Promise.resolve();if(r&&r.length>0){let u=function(h){return Promise.all(h.map(m=>Promise.resolve(m).then(g=>({status:"fulfilled",value:g}),g=>({status:"rejected",reason:g}))))};document.getElementsByTagName("link");const c=document.querySelector("meta[property=csp-nonce]"),f=(c==null?void 0:c.nonce)||(c==null?void 0:c.getAttribute("nonce"));a=u(r.map(h=>{if(h=RX(h),h in q2)return;q2[h]=!0;const m=h.endsWith(".css"),g=m?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${h}"]${g}`))return;const v=document.createElement("link");if(v.rel=m?"stylesheet":DX,m||(v.as="script"),v.crossOrigin="",v.href=h,f&&v.setAttribute("nonce",f),document.head.appendChild(v),m)return new Promise((b,j)=>{v.addEventListener("load",b),v.addEventListener("error",()=>j(new Error(`Unable to preload CSS for ${h}`)))})}))}function o(u){const c=new Event("vite:preloadError",{cancelable:!0});if(c.payload=u,window.dispatchEvent(c),!c.defaultPrevented)throw u}return a.then(u=>{for(const c of u||[])c.status==="rejected"&&o(c.reason);return t().catch(o)})};class $X extends y.Component{constructor(){super(...arguments);Qo(this,"state",{error:null})}static getDerivedStateFromError(r){return{error:r}}render(){return this.state.error?l.jsxs("div",{className:"h-[480px] rounded-2xl border border-red-500/20 bg-red-500/5 p-6 text-xs text-red-400 overflow-auto",children:[l.jsx("div",{className:"font-semibold mb-2",children:"Graph konnte nicht gerendert werden"}),l.jsx("pre",{className:"whitespace-pre-wrap break-words text-[11px] leading-relaxed",children:this.state.error.message})]}):this.props.children}}const zX=y.lazy(()=>LX(()=>import("./GraphView-BqZ4z-El.js"),[]).then(e=>({default:e.GraphView}))),Bd=["identity","knowledge","rules","events"],Q2=new Set(["auto","agent","hermes"]),$g={identity:{label:"Identität",icon:U4,bg:"bg-cyan-500/10",text:"text-cyan-400"},knowledge:{label:"Wissen",icon:Gs,bg:"bg-indigo-500/10",text:"text-indigo-400"},rules:{label:"Regeln",icon:M4,bg:"bg-violet-500/10",text:"text-violet-400"},events:{label:"Ereignisse",icon:n4,bg:"bg-amber-500/10",text:"text-amber-400"}},Y2={label:"Gedächtnis",icon:tv,text:"text-muted-foreground"},FX={identity:"border-l-cyan-500/80",knowledge:"border-l-indigo-500/80",rules:"border-l-violet-500/80",events:"border-l-amber-500/80"},X2=`Hi Hermes! Lass uns ein kurzes Onboarding machen, damit du dich künftig an mich erinnerst. Stell mir nacheinander ein paar kurze Fragen zu: + `}),l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-3.5",children:[l.jsxs("div",{className:"flex justify-between items-center",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(du,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("span",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"VRAM / Memory Belegung"})]}),l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsxs("span",{className:"text-[10px] font-mono text-muted-foreground",children:["Speicher-Pool: ",Mr(ne)," Gewichte",_e>0?` · ${Mr(_e)} real belegt (inkl. KV)`:""," / ",Mr(Ze)]}),v&&k.length>0&&l.jsx("button",{onClick:I,className:"h-6 px-2.5 rounded border border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/10 text-amber-400 text-[9px] font-bold uppercase transition-all cursor-pointer",children:"Alle entladen"})]})]}),l.jsx("div",{className:"h-7 w-full rounded-xl bg-background/50 border border-border/40 overflow-hidden flex p-0.5 relative group",children:Pe.length===0?l.jsx("div",{className:"w-full h-full flex items-center justify-center text-[10px] text-muted-foreground/60 italic font-mono select-none",children:"VRAM Leer — Auto-Swap lädt Modelle bei Anfrage"}):Pe.map((K,Se)=>{var nt;const Ce=(K.size_bytes||0)/Ze*100,Ge=["from-teal-500 to-emerald-500","from-indigo-500 to-blue-500","from-purple-500 to-pink-500","from-cyan-500 to-sky-500"][Se%4];return l.jsxs("div",{style:{width:`${Ce}%`},className:te("h-full rounded bg-gradient-to-r flex items-center justify-between px-2.5 transition-all text-white/95 shrink-0 shadow-inner select-none",Ge),title:`${K.name} (${Mr(K.size_bytes)})`,children:[l.jsxs("span",{className:"text-[9px] font-bold truncate max-w-[120px] font-space tracking-wide",children:[K.role?`[${ir(K.role).short}] `:"",(nt=K.name.split("/").pop())==null?void 0:nt.replace(".gguf","")]}),l.jsx("span",{className:"text-[8px] font-mono opacity-80",children:Mr(K.size_bytes)})]},K.name)})})]}),l.jsx(EX,{}),v&&l.jsx(NX,{}),l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-3.5",children:[l.jsx("div",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground px-1",children:v?"Gateway Steckplatz-Belegung (Slot-Zuweisung)":"Wer macht was bei Lucy — zum Ändern antippen"}),l.jsx("div",{className:"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-6 gap-3",children:WO.map(K=>{var Ge;const Se=j.find(nt=>nt.role===K),Ce=Se?k.includes(Se.name):!1;return l.jsxs("div",{onClick:()=>W(K),className:te("rounded-xl border p-3 flex flex-col justify-between gap-2.5 transition-all cursor-pointer select-none text-left bg-background/25 hover:border-primary/45 hover:bg-background/40 group min-h-[90px]",Ce?"border-emerald-500/40 shadow-sm shadow-emerald-500/5":Se?"border-primary/20 bg-primary/5":"border-border/30 border-dashed opacity-75"),children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx(so,{role:K}),Ce&&l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-400 animate-pulse"})]}),l.jsx("div",{className:"text-[10px] font-mono font-medium truncate text-foreground/90 pr-1 font-space",title:Se==null?void 0:Se.name,children:Se?(Ge=Se.name.split("/").pop())==null?void 0:Ge.replace(/\.gguf$/i,""):"nicht zugewiesen"}),l.jsx("div",{className:"text-[8px] text-primary/70 group-hover:text-primary font-bold uppercase tracking-wider transition-colors font-space",children:"Ändern ➔"})]},K)})})]}),(o==null?void 0:o.current)&&l.jsxs("div",{className:"rounded-2xl border border-indigo-500/30 bg-indigo-500/5 backdrop-blur-md p-5 shadow-lg shadow-black/10 space-y-3.5",children:[l.jsxs("div",{className:"flex items-center justify-between flex-wrap gap-2",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(gn,{className:"h-4.5 w-4.5 text-indigo-400"}),l.jsx("span",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"Agent-Hirn (Hermes)"}),o.current.version!=null&&l.jsxs("span",{className:"text-[9px] font-mono px-1.5 py-0.5 rounded bg-indigo-500/15 text-indigo-300 border border-indigo-500/25",children:["v",o.current.version]})]}),l.jsx("button",{onClick:()=>window.dispatchEvent(new CustomEvent("mc-navigate",{detail:{view:"agent"}})),className:"h-7 px-3 rounded-lg border border-indigo-500/30 bg-indigo-500/5 text-indigo-300 text-[9px] font-bold uppercase hover:bg-indigo-500/15 transition-all cursor-pointer",title:"Hirn-Wechsel passiert jetzt zentral im Hermes-Tab",children:"Im Hermes-Tab wechseln →"})]}),l.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-3 rounded-xl bg-background/30 border border-border/30 p-3.5",children:[l.jsxs("div",{className:"min-w-0",children:[l.jsx("div",{className:"text-xs font-mono font-bold text-foreground truncate",title:o.current.name,children:o.current.name.split("/").pop()}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2 mt-0.5",children:[l.jsx("span",{children:o.current.params_b?`${o.current.params_b}B`:"—"}),l.jsx("span",{children:"•"}),l.jsx("span",{children:o.current.quant||"GGUF"}),l.jsx("span",{children:"•"}),l.jsx("span",{children:Mr(o.current.size_bytes||0)})]})]}),o.update_available&&o.recommended?l.jsxs("button",{onClick:()=>pe(o.recommended.repo),className:te("h-8 px-3 shrink-0 flex items-center justify-center gap-1.5 rounded-lg text-[10px] font-bold uppercase transition-all cursor-pointer shadow-md",o.budget&&!o.budget.fits?"bg-red-500 text-white hover:bg-red-400 shadow-red-500/10":"bg-amber-500 text-black hover:bg-amber-400 shadow-amber-500/10"),children:[l.jsx(Ms,{className:"h-3.5 w-3.5"})," Aktualisieren"]}):l.jsxs("span",{className:"h-8 px-3 shrink-0 flex items-center gap-1.5 text-[10px] font-bold text-emerald-400 uppercase tracking-wide bg-emerald-500/5 border border-emerald-500/15 rounded-lg select-none",children:[l.jsx(or,{className:"h-4 w-4"})," Neueste Generation"]})]}),o.update_available&&o.recommended&&l.jsxs("div",{className:"text-[10px] text-amber-400/90 flex items-center gap-1.5",children:[l.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-amber-400 animate-ping shrink-0"}),"Neuere Generation verfügbar: ",l.jsx("span",{className:"font-mono font-bold",children:o.recommended.name.replace(/-GGUF$/i,"")}),"(v",o.recommended.version,", ",o.recommended.params_b,"B) — von NousResearch."]}),o.budget&&l.jsxs("div",{className:te("text-[10px] flex items-start gap-1.5 leading-relaxed",o.budget.fits?"text-muted-foreground/80":"text-red-400 font-semibold"),children:[l.jsx(du,{className:"h-3 w-3 shrink-0 mt-0.5"}),l.jsxs("span",{children:["Always-On-Brain ~",o.budget.brain_gb," GB + größtes on-demand (~",o.budget.largest_ondemand_gb," GB) = ",(o.budget.brain_gb+o.budget.largest_ondemand_gb).toFixed(1)," / ",o.budget.gtt_gb," GB",o.budget.fits?" · passt gleichzeitig ✓":" · passt NICHT gleichzeitig ⚠ — heavy/coder würden das Brain verdrängen. Kleineres Brain oder weniger Kontext."]})]})]}),l.jsxs("div",{className:"space-y-4",children:[l.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-3 px-1",children:[l.jsxs("div",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:["Installierte Modell-Bibliothek (",oe.length," von ",j.length,")"]}),l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsxs("div",{className:"flex rounded-lg border border-border/40 bg-card/45 p-0.5",children:[l.jsx("button",{onClick:()=>ie("all"),className:te("px-2.5 py-1 rounded-md text-[9px] font-bold uppercase transition-all cursor-pointer",ge==="all"?"bg-primary text-primary-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:"Vorhanden"}),l.jsx("button",{onClick:()=>ie("in_use"),className:te("px-2.5 py-1 rounded-md text-[9px] font-bold uppercase transition-all cursor-pointer",ge==="in_use"?"bg-primary text-primary-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:"In Benutzung"})]}),l.jsxs("div",{className:"flex rounded-lg border border-border/40 bg-card/45 p-0.5",children:[l.jsx("button",{onClick:()=>ue("grid"),className:te("px-2.5 py-1 rounded-md text-[9px] font-bold uppercase transition-all cursor-pointer",me==="grid"?"bg-primary text-primary-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:"Grid"}),l.jsx("button",{onClick:()=>ue("list"),className:te("px-2.5 py-1 rounded-md text-[9px] font-bold uppercase transition-all cursor-pointer",me==="list"?"bg-primary text-primary-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:"List"})]})]})]}),me==="grid"?l.jsx("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-3",children:oe.length===0?l.jsx("div",{className:"col-span-full text-xs text-muted-foreground border border-dashed border-border/60 rounded-2xl p-12 text-center select-none",children:ge==="in_use"?"Keine Modelle in Benutzung (keine Zuweisung oder warm geladene Modelle).":'Keine Modelle konfiguriert. Verwende den Tab "Modelle finden" zum Herunterladen.'}):oe.map(K=>{const Se=k.includes(K.name),Ce=a==null?void 0:a.model_list.find(nt=>nt.role===K.role),Ge=B2(K.name);return l.jsxs("div",{className:te("rounded-2xl border bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 flex flex-col justify-between gap-4 transition-all duration-300 hover:border-primary/40 group relative overflow-hidden",Se?"border-primary/45 shadow-primary/5":K.role?"border-primary/30 bg-primary/5 shadow-inner":"border-border/60"),children:[l.jsxs("div",{className:"space-y-3",children:[l.jsx("div",{className:"flex items-start justify-between gap-3",children:l.jsxs("div",{className:"flex gap-2.5 min-w-0",children:[l.jsx("div",{className:te("w-7 h-7 rounded-lg border flex items-center justify-center font-bold text-xs shrink-0 shadow-sm",Ge.color),title:Ge.name,children:Ge.initial}),l.jsxs("div",{className:"min-w-0",children:[l.jsx("h3",{className:"text-xs font-bold tracking-tight text-foreground line-clamp-2 break-all font-mono",title:K.name,children:K.name.split("/").pop()}),l.jsxs("div",{className:"flex items-center gap-2 flex-wrap mt-1",children:[l.jsx("span",{className:"text-[9px] font-mono text-muted-foreground bg-background/40 px-1.5 py-0.5 rounded border border-border/30",children:K.quant||"GGUF"}),Se&&l.jsxs("span",{className:"flex items-center gap-1 text-[9px] font-semibold text-emerald-400 uppercase tracking-wider",children:[l.jsx(eh,{className:"h-3 w-3 animate-pulse"})," Warm"]}),K.role&&l.jsx(so,{role:K.role,dense:!0}),b(K.role)&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-background/40 border border-border/40 text-[9px] font-semibold text-muted-foreground",title:"Lebenswichtig für Lucy — geschützt vor Löschen/Entladen.",children:"🔒 geschützt"}),v&&P(K.name)&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-fuchsia-500/10 border border-fuchsia-500/30 text-[9px] font-mono text-fuchsia-300 font-bold uppercase",title:"Ko-resident in der brains-Gruppe — bleibt mit dem Hirn gemeinsam warm, verdrängt es nicht.",children:"🧠 Ko-resident"}),v&&K.prompt_cache&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-cyan-500/10 border border-cyan-500/20 text-[9px] font-mono text-cyan-400 font-bold uppercase",title:"Prompt Caching aktiv",children:"PC"}),v&&(K.spec_active?l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-emerald-500/10 border border-emerald-500/20 text-[9px] font-mono text-emerald-400 font-bold uppercase",title:`Speculative Decoding aktiv (Draft: ${K.spec_draft_model})`,children:"SPEC"}):K.spec_draft_model?l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/20 text-[9px] font-mono text-amber-400 font-bold uppercase",title:`Draft gesetzt (${K.spec_draft_model}), aber INAKTIV — --spec-type fehlt oder Vocab inkompatibel. Über 'Spec' neu konfigurieren.`,children:"SPEC?"}):null),v&&K.parallel_slots>1&&l.jsxs("span",{className:"px-1.5 py-0.5 rounded bg-violet-500/10 border border-violet-500/20 text-[9px] font-mono text-violet-400 font-bold uppercase",title:`${K.parallel_slots} parallele Slots aktiv`,children:["SLOTS: ",K.parallel_slots]}),K.incomplete&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/20 text-[9px] font-mono text-amber-400 font-bold uppercase",title:"GGUF-Datei fehlt — Modell kann nicht geladen werden",children:"⚠ Datei fehlt"})]})]})]})}),l.jsx("div",{className:"border-t border-border/30 pt-3 flex flex-wrap gap-1",children:l.jsx(H2,{caps:K.capabilities})})]}),l.jsxs("div",{className:"space-y-3 pt-1",children:[l.jsxs("div",{className:"grid grid-cols-2 gap-2 text-[10px] font-mono text-muted-foreground",children:[l.jsxs("div",{className:"flex items-center gap-1.5 p-2 bg-background/20 rounded-lg border border-border/20",children:[l.jsx(du,{className:"h-3.5 w-3.5 text-primary/80"}),l.jsxs("div",{children:[l.jsx("div",{className:"text-[8px] uppercase tracking-wider font-semibold text-muted-foreground/60",children:"Größe"}),l.jsx("div",{className:"text-foreground font-semibold",children:Mr(K.size_bytes)})]})]}),l.jsxs("div",{className:"flex items-center gap-1.5 p-2 bg-background/20 rounded-lg border border-border/20",children:[l.jsx(C4,{className:"h-3.5 w-3.5 text-primary/80"}),l.jsxs("div",{children:[l.jsx("div",{className:"text-[8px] uppercase tracking-wider font-semibold text-muted-foreground/60",children:"Kontext"}),l.jsx("div",{className:"text-foreground font-semibold",children:Rw(K.ctx)})]})]})]}),Ce&&l.jsxs("div",{className:"p-3 bg-amber-500/5 border border-amber-500/30 rounded-xl space-y-2 flex flex-col justify-between shrink-0",children:[l.jsxs("div",{className:"text-[9px] font-semibold text-amber-400 flex items-center gap-1",children:[l.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-amber-400 animate-ping"}),l.jsxs("span",{children:["Upgrade verfügbar: ",Ce.repo.split("/").pop()]})]}),l.jsxs("button",{onClick:()=>he(Ce.repo,K.role,K.quant||"Q4_K_M",K.capabilities.tools!=="no"),className:"h-7 w-full flex items-center justify-center gap-1 rounded-lg bg-amber-500 text-black text-[10px] font-bold hover:bg-amber-400 transition-colors cursor-pointer",children:[l.jsx(Ms,{className:"h-3 w-3"})," Smart-Swap starten"]})]}),l.jsxs("div",{className:"flex items-center gap-1.5 border-t border-border/20 pt-3 mt-auto",children:[(()=>{const nt=b(K.role),q=Se&&nt,Le=K.incomplete&&!Se||q;return l.jsx("button",{onClick:()=>Se?J(K.name):re(K.name),disabled:Le,title:q?`„${ir(K.role).label}" bleibt geladen (geschützt).`:void 0,className:te("flex-1 h-7 rounded-lg text-[9px] font-bold uppercase transition-all border flex items-center justify-center gap-1",Le?"border-border/30 bg-background/10 text-muted-foreground/50 cursor-not-allowed":Se?"border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/15 text-amber-400 cursor-pointer":"border-primary/30 bg-primary/5 hover:bg-primary/15 text-primary cursor-pointer"),children:q?"🔒 geladen":Se?"Entladen":"Laden"})})(),v&&l.jsx("button",{onClick:()=>ee(K.name,K.ctx),className:"h-7 px-2.5 rounded-lg border border-border/40 text-[9px] font-bold uppercase hover:bg-accent text-muted-foreground transition-colors cursor-pointer",title:"Kontextlänge anpassen",children:"Ctx"}),v&&E&&l.jsx("button",{onClick:()=>O(K.name),className:te("h-7 px-2.5 rounded-lg border text-[9px] font-bold uppercase transition-colors cursor-pointer",P(K.name)?"border-fuchsia-500/40 bg-fuchsia-500/10 text-fuchsia-300 hover:bg-fuchsia-500/20":"border-border/40 text-muted-foreground hover:bg-accent"),title:P(K.name)?"Ko-resident (brains): bleibt mit dem Hirn gemeinsam warm. Klick = aus der Gruppe nehmen.":"Zur brains-Gruppe hinzufügen — lädt dann ko-resident neben dem Hirn, statt es zu verdrängen.",children:"🧠"}),v&&l.jsxs("button",{onClick:()=>U(K),className:te("h-7 px-2.5 rounded-lg border text-[9px] font-bold uppercase transition-colors cursor-pointer flex items-center gap-1",K.spec_active?"border-emerald-500/30 text-emerald-400 hover:bg-emerald-500/10":K.spec_draft_model?"border-amber-500/30 text-amber-400 hover:bg-amber-500/10":"border-border/40 text-muted-foreground hover:bg-accent"),title:"Speculative Draft konfigurieren (Vocab-geprüft)",children:[l.jsx(ma,{className:"h-3 w-3"})," Spec"]}),l.jsx("button",{onClick:()=>Z(K.name),disabled:b(K.role),className:te("h-7 w-7 rounded-lg border border-border/40 flex items-center justify-center transition-colors",b(K.role)?"text-muted-foreground/40 cursor-not-allowed":"text-muted-foreground hover:text-red-400 hover:bg-red-500/5 cursor-pointer"),"aria-label":"Modell löschen",title:b(K.role)?`„${ir(K.role).label}" ist geschützt und kann nicht gelöscht werden.`:"Modell löschen",children:l.jsx(iv,{className:"h-3.5 w-3.5","aria-hidden":"true"})})]})]})]},K.name)})}):l.jsx("div",{className:"space-y-2",children:oe.length===0?l.jsx("div",{className:"text-xs text-muted-foreground border border-dashed border-border/60 rounded-2xl p-12 text-center select-none",children:ge==="in_use"?"Keine Modelle in Benutzung (keine Zuweisung oder warm geladene Modelle).":'Keine Modelle konfiguriert. Verwende den Tab "Modelle finden" zum Herunterladen.'}):oe.map(K=>{const Se=k.includes(K.name),Ce=B2(K.name);return l.jsxs("div",{className:te("rounded-xl border bg-card/45 backdrop-blur-md p-3.5 shadow-lg shadow-black/5 flex flex-col sm:flex-row sm:items-center justify-between gap-3 hover:border-primary/40 transition-all",Se?"border-primary/45":K.role?"border-primary/30 bg-primary/5":"border-border/60"),children:[l.jsxs("div",{className:"flex items-center gap-3 min-w-0",children:[l.jsx("div",{className:te("w-8 h-8 rounded-lg border border-border/40 flex items-center justify-center font-bold text-xs shrink-0 shadow-sm",Ce.color),title:Ce.name,children:Ce.initial}),l.jsxs("div",{className:"min-w-0 text-left",children:[l.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[l.jsx("h4",{className:"text-xs font-bold text-foreground truncate max-w-[250px] sm:max-w-[400px] break-all font-mono",title:K.name,children:K.name.split("/").pop()}),K.role&&l.jsx(so,{role:K.role,dense:!0,className:"shrink-0"}),b(K.role)&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-background/40 border border-border/40 text-[8px] font-semibold text-muted-foreground shrink-0",title:"Lebenswichtig für Lucy — geschützt vor Löschen/Entladen.",children:"🔒 geschützt"}),v&&P(K.name)&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-fuchsia-500/10 border border-fuchsia-500/30 text-[8px] font-mono text-fuchsia-300 font-bold uppercase shrink-0",title:"Ko-resident in der brains-Gruppe — bleibt mit dem Hirn gemeinsam warm.",children:"🧠 Ko-resident"}),v&&K.prompt_cache&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-cyan-500/10 border border-cyan-500/20 text-[8px] font-mono text-cyan-400 font-bold uppercase shrink-0",title:"Prompt Caching aktiv",children:"PC"}),v&&(K.spec_active?l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-emerald-500/10 border border-emerald-500/20 text-[8px] font-mono text-emerald-400 font-bold uppercase shrink-0",title:`Speculative Decoding aktiv (Draft: ${K.spec_draft_model})`,children:"SPEC"}):K.spec_draft_model?l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/20 text-[8px] font-mono text-amber-400 font-bold uppercase shrink-0",title:`Draft gesetzt (${K.spec_draft_model}), aber INAKTIV — --spec-type fehlt oder Vocab inkompatibel.`,children:"SPEC?"}):null),v&&K.parallel_slots>1&&l.jsxs("span",{className:"px-1.5 py-0.5 rounded bg-violet-500/10 border border-violet-500/20 text-[8px] font-mono text-violet-400 font-bold uppercase shrink-0",title:`${K.parallel_slots} parallele Slots aktiv`,children:["SLOTS: ",K.parallel_slots]}),K.incomplete&&l.jsx("span",{className:"px-1.5 py-0.5 rounded bg-amber-500/10 border border-amber-500/20 text-[8px] font-mono text-amber-400 font-bold uppercase shrink-0",title:"GGUF-Datei fehlt",children:"⚠ Datei fehlt"}),Se&&l.jsxs("span",{className:"flex items-center gap-0.5 text-[8px] font-semibold text-emerald-400 uppercase tracking-wider shrink-0",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"})," warm"]})]}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2 mt-0.5",children:[l.jsxs("span",{children:["Größe: ",Mr(K.size_bytes)]}),l.jsx("span",{children:"•"}),l.jsxs("span",{children:["Kontext: ",Rw(K.ctx)]}),l.jsx("span",{children:"•"}),l.jsx("span",{className:"font-mono text-[9px]",children:K.quant||"GGUF"})]})]})]}),l.jsxs("div",{className:"flex items-center gap-3 shrink-0 self-end sm:self-auto",children:[l.jsx("div",{className:"hidden lg:flex flex-wrap gap-1",children:l.jsx(H2,{caps:K.capabilities})}),l.jsxs("div",{className:"flex items-center gap-1.5",children:[(()=>{const Ge=b(K.role),nt=Se&&Ge,q=K.incomplete&&!Se||nt;return l.jsx("button",{onClick:()=>Se?J(K.name):re(K.name),disabled:q,title:nt?`„${ir(K.role).label}" bleibt geladen (geschützt).`:void 0,className:te("h-7 px-3 rounded-lg text-[9px] font-bold uppercase transition-all border flex items-center gap-1",q?"border-border/30 bg-background/10 text-muted-foreground/50 cursor-not-allowed":Se?"border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/15 text-amber-400 cursor-pointer":"border-primary/30 bg-primary/5 hover:bg-primary/15 text-primary cursor-pointer"),children:nt?"🔒 geladen":Se?"Entladen":"Laden"})})(),v&&l.jsx("button",{onClick:()=>ee(K.name,K.ctx),className:"h-7 px-2.5 rounded-lg border border-border/40 text-[9px] font-bold uppercase hover:bg-accent text-muted-foreground transition-all cursor-pointer",title:"Kontextlänge anpassen",children:"Ctx"}),v&&E&&l.jsx("button",{onClick:()=>O(K.name),className:te("h-7 px-2.5 rounded-lg border text-[9px] font-bold uppercase transition-colors cursor-pointer",P(K.name)?"border-fuchsia-500/40 bg-fuchsia-500/10 text-fuchsia-300 hover:bg-fuchsia-500/20":"border-border/40 text-muted-foreground hover:bg-accent"),title:P(K.name)?"Ko-resident (brains): bleibt mit dem Hirn gemeinsam warm. Klick = aus der Gruppe nehmen.":"Zur brains-Gruppe hinzufügen — lädt dann ko-resident neben dem Hirn, statt es zu verdrängen.",children:"🧠"}),v&&l.jsxs("button",{onClick:()=>U(K),className:te("h-7 px-2.5 rounded-lg border text-[9px] font-bold uppercase transition-all cursor-pointer flex items-center gap-1",K.spec_active?"border-emerald-500/30 text-emerald-400 hover:bg-emerald-500/10":K.spec_draft_model?"border-amber-500/30 text-amber-400 hover:bg-amber-500/10":"border-border/40 text-muted-foreground hover:bg-accent"),title:"Speculative Draft konfigurieren (Vocab-geprüft)",children:[l.jsx(ma,{className:"h-3 w-3"})," Spec"]}),l.jsx("button",{onClick:()=>Z(K.name),disabled:b(K.role),className:te("h-7 w-7 rounded-lg flex items-center justify-center border border-border/40 transition-all",b(K.role)?"text-muted-foreground/40 cursor-not-allowed":"text-muted-foreground hover:text-red-400 hover:bg-red-500/5 cursor-pointer"),"aria-label":"Modell löschen",title:b(K.role)?`„${ir(K.role).label}" ist geschützt und kann nicht gelöscht werden.`:"Modell löschen",children:l.jsx(iv,{className:"h-3.5 w-3.5","aria-hidden":"true"})})]})]})]},K.name)})})]}),D&&l.jsx(kX,{role:D,roleRec:F,models:j,onAssign:K=>{_(D,K),B(null)},onClose:()=>B(null)}),Y&&l.jsx(bX,{model:Y,onClose:()=>U(null),onChanged:N}),g]})}const AX=[{key:"popular",label:"Beliebt",q:""},{key:"coder",label:"Coder",q:"coder"},{key:"vision",label:"Vision",q:"vision"},{key:"reasoning",label:"Reasoning",q:"reasoning"},{key:"small",label:"Klein (≤4B)",q:"3B"}],CX=["fast","heavy","coder","vision","hermes","scout"],PX=new Intl.NumberFormat(void 0,{notation:"compact",maximumFractionDigits:1});function K2(e){return PX.format(e)}function OX(){const{data:e}=xi(),t=(e==null?void 0:e.models)??[],[r,n]=y.useState(""),[a,o]=y.useState([]),[u,c]=y.useState(!1),[f,h]=y.useState(""),[m,g]=y.useState("popular"),[v,b]=y.useState(""),[j,k]=y.useState(null),[S,N]=y.useState([]),[E,A]=y.useState("Q4_K_M"),[P,M]=y.useState(""),[O,D]=y.useState(null),[B,F]=y.useState(!1),[z,Y]=y.useState({});async function U(_){c(!0),h("");try{const W=await je(`/api/hf/search?q=${encodeURIComponent(_)}`);o(W.results),W.results.length||h("Keine Ergebnisse.")}catch(W){h(`Suche fehlgeschlagen: ${W}`)}finally{c(!1)}}y.useEffect(()=>{U("")},[]);function me(_){g(_.key),n(""),U(_.q)}function ue(){g(""),U(r)}async function ge(_,W,ee){F(!1);try{const Z=await je(`/api/fit?params_b=0&quant=${encodeURIComponent(W)}&ctx=8192&name=${encodeURIComponent(_)}&role=${encodeURIComponent(ee)}`);D(Z)}catch{D(null)}}async function ie(_){if(j===_){k(null);return}k(_),N([]),D(null),M(""),F(!1),h("Analysiere Repository…");try{const W=await je(`/api/hf/quants?repo=${encodeURIComponent(_)}`);N(W.quants);const ee=W.quants.includes("Q4_K_M")?"Q4_K_M":W.quants[0]||"Q4_K_M";A(ee),h(W.quants.length?"":"Keine GGUF-Dateien in diesem Repo gefunden."),W.quants.length&&ge(W.repo,ee,"")}catch(W){h(`Fehler: ${W}`)}}function oe(){const _=v.trim();_&&(o(W=>W.some(ee=>ee.repo===_)?W:[{repo:_,downloads:0,likes:0},...W]),b(""),ie(_))}const X=P?t.find(_=>(_.role||"").toLowerCase()===P):void 0;async function re(_){if((O==null?void 0:O.fit.level)==="too_tight"&&!B){F(!0);return}Y(W=>({...W,[_]:"Starte…"}));try{await je("/api/models/install",{method:"POST",body:JSON.stringify({repo:_,quant:E,role:P||void 0,jinja:!0})}),Y(W=>({...W,[_]:"Download läuft"})),F(!1)}catch{Y(ee=>({...ee,[_]:"Fehler"}))}}const J=_=>{var ee;const W=((ee=_.split("/").pop())==null?void 0:ee.toLowerCase().replace(/-gguf$/i,""))||"";return W.length>3&&t.some(Z=>Z.name.toLowerCase().includes(W))},I=_=>_==="perfect"?"text-emerald-400 border-emerald-500/40 bg-emerald-500/10":_==="marginal"?"text-amber-400 border-amber-500/40 bg-amber-500/10":"text-red-400 border-red-500/40 bg-red-500/10";return l.jsxs("div",{className:"space-y-5",children:[l.jsxs("div",{className:"flex gap-2",children:[l.jsxs("div",{className:"relative flex-1",children:[l.jsx(PN,{className:"absolute left-3 top-2.5 h-4 w-4 text-muted-foreground"}),l.jsx("input",{value:r,onChange:_=>n(_.target.value),onKeyDown:_=>_.key==="Enter"&&ue(),"aria-label":"HuggingFace durchsuchen",type:"search",spellCheck:!1,placeholder:"HuggingFace durchsuchen (z.B. Qwen Coder, Llama-3.1, gemma)…",className:"w-full h-10 pl-9 pr-3 rounded-xl border border-border/60 bg-background/40 text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground"})]}),l.jsx("button",{onClick:ue,className:"h-10 px-5 rounded-xl bg-primary text-primary-foreground text-xs font-semibold hover:opacity-90 transition-all cursor-pointer",children:"Suchen"})]}),l.jsx("div",{className:"flex items-center gap-2 flex-wrap",children:AX.map(_=>l.jsxs("button",{onClick:()=>me(_),className:te("flex items-center gap-1.5 rounded-full px-3 py-1.5 text-[11px] font-semibold transition-all cursor-pointer border",m===_.key?"bg-primary/15 text-primary border-primary/30":"border-border/50 text-muted-foreground hover:text-foreground hover:border-border"),children:[_.key==="popular"&&l.jsx(u4,{className:"h-3 w-3"}),_.label]},_.key))}),u?l.jsx("div",{className:"text-xs text-muted-foreground py-10 text-center",children:"Lade GGUF-Modelle von HuggingFace…"}):l.jsxs("div",{className:"space-y-2",children:[a.map(_=>{const W=j===_.repo,ee=J(_.repo),Z=_.repo.includes("/")?_.repo.split("/")[0]:"—",he=_.repo.split("/").pop();return l.jsxs("div",{className:te("rounded-xl border bg-card/45 backdrop-blur-md transition-all",W?"border-primary/40 shadow-lg shadow-primary/5":"border-border/50 hover:border-primary/30"),children:[l.jsxs("button",{onClick:()=>ie(_.repo),className:"w-full flex items-center gap-3 p-3.5 text-left cursor-pointer",children:[l.jsxs("div",{className:"min-w-0 flex-1",children:[l.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[l.jsx("span",{className:"text-xs font-bold font-mono text-foreground truncate max-w-[280px]",title:_.repo,children:he}),ee&&l.jsxs("span",{className:"flex items-center gap-1 text-[8px] font-bold text-emerald-400 uppercase tracking-wider bg-emerald-500/10 border border-emerald-500/20 px-1.5 py-0.5 rounded",children:[l.jsx(or,{className:"h-2.5 w-2.5"})," installiert"]})]}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-3 mt-0.5 font-mono",children:[l.jsx("span",{children:Z}),l.jsxs("span",{className:"flex items-center gap-1",children:[l.jsx(Ms,{className:"h-3 w-3"})," ",K2(_.downloads)]}),_.likes>0&&l.jsxs("span",{className:"flex items-center gap-1",children:[l.jsx(m4,{className:"h-3 w-3"})," ",K2(_.likes)]})]})]}),W?l.jsx(AN,{className:"h-4 w-4 text-muted-foreground shrink-0"}):l.jsx(EN,{className:"h-4 w-4 text-muted-foreground shrink-0"})]}),W&&l.jsx("div",{className:"border-t border-border/30 p-3.5 space-y-3",children:S.length===0?l.jsx("div",{className:"text-[11px] text-muted-foreground font-mono",children:f||"Lade Quants…"}):l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[l.jsx("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground",children:"Quant"}),l.jsx("select",{value:E,onChange:pe=>{A(pe.target.value),ge(_.repo,pe.target.value,P)},"aria-label":"Quantisierung",className:"h-8 rounded-lg border border-border/60 bg-background/40 px-2 text-xs text-foreground font-semibold outline-none",children:S.map(pe=>l.jsx("option",{value:pe,className:"bg-popover text-foreground",children:pe},pe))}),l.jsx("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground ml-1",children:"Rolle"}),l.jsxs("select",{value:P,onChange:pe=>{M(pe.target.value),ge(_.repo,E,pe.target.value)},"aria-label":"Rolle",title:"Optional — bestimmt Auto-Konfiguration + setup-bewussten Kontext",className:"h-8 rounded-lg border border-border/60 bg-background/40 px-2 text-xs text-foreground font-semibold outline-none",children:[l.jsx("option",{value:"",className:"bg-popover text-foreground",children:"keine"}),CX.map(pe=>l.jsx("option",{value:pe,className:"bg-popover text-foreground",children:pe},pe))]}),l.jsx("button",{onClick:()=>re(_.repo),disabled:!!z[_.repo]&&z[_.repo]==="Download läuft",className:te("h-8 px-3.5 ml-auto rounded-lg text-xs font-semibold transition-all cursor-pointer flex items-center gap-1.5",B?"bg-red-500 text-white hover:opacity-90":"bg-primary text-primary-foreground hover:opacity-90"),children:z[_.repo]?z[_.repo]:B?l.jsxs(l.Fragment,{children:[l.jsx(mi,{className:"h-3.5 w-3.5"})," OOM — trotzdem laden"]}):l.jsxs(l.Fragment,{children:[l.jsx(Ms,{className:"h-3.5 w-3.5"})," Herunterladen"]})})]}),O&&l.jsxs("div",{className:te("flex flex-wrap items-center gap-x-3 gap-y-1 rounded-lg border px-3 py-2 text-[11px] font-medium",I(O.fit.level)),children:[l.jsx("span",{className:"font-bold uppercase tracking-wide",children:O.fit.text}),l.jsxs("span",{className:"font-mono opacity-90",children:["~",O.params_b,"B · ~",O.fit.req_gb," GB / ",O.sys_ram_gb," GB · ~",O.fit.tps," t/s"]}),O.fit.level!=="too_tight"?l.jsxs("span",{className:"font-mono opacity-80",children:["ctx → ",(O.assigned_ctx/1024).toFixed(0),"k"]}):l.jsx("span",{className:"opacity-90",children:"— passt nicht, würde beim Laden abstürzen (OOM)."})]}),X&&l.jsxs("div",{className:"flex items-start gap-2 rounded-lg border border-amber-500/40 bg-amber-500/10 px-3 py-2 text-[11px] text-amber-400",children:[l.jsx(mi,{className:"h-3.5 w-3.5 mt-0.5 shrink-0"}),l.jsxs("span",{children:["Rolle ",l.jsxs("strong",{children:["„",P,'"']})," hält aktuell ",l.jsx("strong",{children:X.name.split("/").pop()})," — wird beim Download übernommen."]})]})]})})]},_.repo)}),!a.length&&!u&&l.jsx("div",{className:"text-xs text-muted-foreground py-10 text-center",children:f||"Keine Ergebnisse."})]}),l.jsxs("div",{className:"border-t border-border/30 pt-4 flex flex-col sm:flex-row gap-2 items-stretch sm:items-center",children:[l.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground shrink-0",children:"Direkt:"}),l.jsx("input",{value:v,onChange:_=>b(_.target.value),onKeyDown:_=>_.key==="Enter"&&oe(),"aria-label":"Repository oder URL direkt eingeben",spellCheck:!1,placeholder:"org/repo oder HF-URL (z.B. unsloth/Qwen2.5-Coder-7B-Instruct-GGUF)",className:"flex-1 h-9 rounded-lg border border-border/60 bg-background/40 px-3 text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground font-mono"}),l.jsx("button",{onClick:oe,className:"h-9 px-4 rounded-lg border border-border/60 bg-background/20 text-xs font-semibold hover:border-primary/50 hover:bg-background/40 transition-all cursor-pointer whitespace-nowrap",children:"Laden"})]})]})}const _X={fast:{title:"Schnelles Alltags-Hirn",desc:"Schnelle MoE-Antworten für Chat, Zusammenfassungen und alltägliche Aufgaben.",icon:ma},heavy:{title:"Schweres Reasoning",desc:"Große Modelle für komplexe Logik, Mathematik und tiefgründiges Planen.",icon:yo},coder:{title:"Coden & Entwicklung",desc:"Autovervollständigung, Refactoring und Codegenerierung direkt in deiner IDE.",icon:_s},vision:{title:"Bilder & Vision",desc:"Verarbeitet Bilder, Screenshots und visuelle Diagramme in multimodalen Chats.",icon:ef},hermes:{title:"Lucys Hirn (Agent)",desc:"Lucys dauer-warmes Agent-Hirn mit Tool-Calling — bleibt ko-resident, lädt nie kalt nach.",icon:Q3},scout:{title:"Multimodal-Allrounder",desc:"Multimodaler Allrounder für schnelle Antworten, Übersetzungen und Alltag.",icon:rv}};function MX(){const{data:e,isLoading:t,error:r}=RD(),{data:n}=xi(),{data:a}=uh(),o=(n==null?void 0:n.models)??[],u=r?String(r):"",[c,f]=y.useState({}),[h,m]=y.useState({}),[g,v]=y.useState("recommended");async function b(j,k,S,N){f(E=>({...E,[j]:"Starte..."}));try{await je("/api/models/install",{method:"POST",body:JSON.stringify({repo:j,role:k,quant:S,jinja:N})}),f(E=>({...E,[j]:"Download läuft"}))}catch{f(A=>({...A,[j]:"Fehler"}))}}return l.jsxs("div",{className:"space-y-6",children:[l.jsx("div",{className:"flex rounded-xl border border-border/60 bg-card/45 backdrop-blur-md p-1 w-fit",children:[["recommended","Empfohlen"],["browse","Stöbern & Suchen"]].map(([j,k])=>l.jsx("button",{onClick:()=>v(j),className:te("rounded-lg px-4 py-1.5 text-xs font-semibold tracking-wide transition-all cursor-pointer",g===j?"bg-primary text-primary-foreground shadow-md shadow-primary/10":"text-muted-foreground hover:text-foreground"),children:k},j))}),g==="browse"?l.jsx(OX,{}):t?l.jsx("div",{className:"text-xs text-muted-foreground py-12 text-center",children:"Analysiere Hardware und suche passende GGUF-Empfehlungen…"}):u||!e?l.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400",children:["Empfehlungsdienst temporär nicht erreichbar (",u,")."]}):l.jsxs("div",{className:"space-y-8",children:[l.jsxs("div",{className:"text-[10px] font-mono text-muted-foreground bg-background/25 border border-border/40 p-4 rounded-xl flex flex-col sm:flex-row sm:items-center justify-between gap-3 shadow-sm",children:[l.jsxs("div",{children:["Modell-Registry geladen für ",l.jsxs("span",{className:"text-foreground font-bold",children:[e.sys_ram_gb," GB"]})," System-RAM."]}),l.jsxs("div",{className:"flex items-center gap-1.5",children:[l.jsx(F4,{className:"h-3.5 w-3.5 text-primary fill-primary/20"}),l.jsx("span",{children:"Empfehlungen sind automatisch auf deine Box-Hardware optimiert."})]})]}),l.jsx("div",{className:"grid gap-6 md:grid-cols-2",children:e.categories.map(j=>{const k=_X[j.role]||{title:j.title||j.role,desc:"Spezifisches Modell für diese Systemrolle.",icon:vy},S=k.icon,N=o.find(D=>D.role===j.role),E=a==null?void 0:a.model_list.find(D=>D.role===j.role),A=j.models.find(D=>D.repo===j.recommended)||j.models[0];if(!A)return null;const P=c[A.repo],M=j.models.filter(D=>D.repo!==j.recommended),O=!!h[j.role];return l.jsxs("div",{className:te("rounded-2xl border bg-card/45 backdrop-blur-md p-5 shadow-lg shadow-black/10 flex flex-col justify-between gap-5 transition-all duration-300 hover:border-primary/40",N?"border-border/60":"border-primary/20 shadow-primary/5"),children:[l.jsxs("div",{className:"space-y-4",children:[l.jsxs("div",{className:"flex items-start justify-between gap-3",children:[l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsx("div",{className:"w-10 h-10 rounded-xl bg-primary/10 border border-primary/20 flex items-center justify-center text-primary shadow-sm shrink-0",children:l.jsx(S,{className:"h-5.5 w-5.5"})}),l.jsxs("div",{children:[l.jsx("h3",{className:"text-sm font-bold tracking-tight text-foreground",children:k.title}),l.jsxs("span",{className:"text-[9px] font-mono text-muted-foreground uppercase bg-background/50 px-1.5 py-0.5 rounded border border-border/30 inline-block mt-0.5",children:["Rolle: ",j.role]})]})]}),N?l.jsxs("span",{className:"flex items-center gap-1.5 text-[9px] font-bold text-emerald-400 uppercase tracking-wider bg-emerald-500/10 border border-emerald-500/20 px-2.5 py-1 rounded-lg",children:[l.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"}),"Aktiviert"]}):l.jsx("span",{className:"text-[9px] font-bold text-primary/70 uppercase tracking-wider bg-primary/10 border border-primary/20 px-2.5 py-1 rounded-lg",children:"Frei"})]}),l.jsx("p",{className:"text-xs text-muted-foreground leading-relaxed",children:k.desc}),l.jsx("div",{className:"p-3.5 rounded-xl bg-background/35 border border-border/30 space-y-2.5",children:N?l.jsxs("div",{className:"space-y-1.5",children:[l.jsx("div",{className:"text-[9px] font-bold uppercase tracking-wider text-muted-foreground/60",children:"Aktive GGUF-Belegung"}),l.jsx("div",{className:"text-xs font-mono font-bold text-foreground truncate",title:N.name,children:N.name.split("/").pop()}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2",children:[l.jsxs("span",{children:["Größe: ",pv(N.size_bytes||0)]}),l.jsx("span",{children:"•"}),l.jsxs("span",{children:["Quant: ",N.quant||"GGUF"]})]})]}):l.jsxs("div",{className:"space-y-1.5",children:[l.jsx("div",{className:"text-[9px] font-bold uppercase tracking-wider text-primary/80",children:"Empfohlenes Modell"}),l.jsx("div",{className:"text-xs font-mono font-bold text-foreground truncate",title:A.name,children:A.name}),l.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2 flex-wrap",children:[l.jsxs("span",{children:["Ersteller: ",A.author]}),l.jsx("span",{children:"•"}),l.jsxs("span",{children:["Quant: ",A.quant]})]}),l.jsx("div",{className:"flex items-center gap-1.5 pt-0.5",children:l.jsx(hX,{fit:A.fit})})]})}),l.jsx("div",{className:"pt-1",children:N?E?l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"text-[9px] font-semibold text-amber-400 flex items-center gap-1.5",children:[l.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-amber-400 animate-ping shrink-0"}),l.jsxs("span",{children:["Bessere Version in der Registry: ",E.repo.split("/").pop()]})]}),l.jsxs("button",{onClick:()=>b(E.repo,j.role,A.quant||"Q4_K_M",A.caps.tools!=="no"),disabled:!!c[E.repo],className:"h-8 w-full flex items-center justify-center gap-1.5 rounded-lg bg-amber-500 text-black text-xs font-bold hover:bg-amber-400 disabled:opacity-50 transition-all cursor-pointer shadow-md shadow-amber-500/10",children:[l.jsx(Ms,{className:"h-3.5 w-3.5"}),c[E.repo]||"Auf neue Version aktualisieren"]})]}):l.jsxs("div",{className:"h-8 flex items-center justify-center gap-1.5 text-[10px] font-bold text-emerald-400 uppercase tracking-wide bg-emerald-500/5 border border-emerald-500/10 rounded-lg select-none",children:[l.jsx(or,{className:"h-4 w-4"})," Auf neuestem Stand"]}):l.jsxs("button",{onClick:()=>b(A.repo,j.role,A.quant||"Q4_K_M",A.caps.tools!=="no"),disabled:!!P,className:te("h-8 w-full flex items-center justify-center gap-1.5 rounded-lg text-xs font-bold transition-all cursor-pointer border",P?"border-primary/40 bg-primary/5 text-primary":"bg-primary text-primary-foreground hover:opacity-90 shadow-md shadow-primary/10"),children:[l.jsx(Ms,{className:"h-3.5 w-3.5"}),P||"Optimales Modell einsetzen"]})})]}),M.length>0&&l.jsxs("div",{className:"border-t border-border/20 pt-3",children:[l.jsxs("button",{onClick:()=>m(D=>({...D,[j.role]:!O})),className:"flex items-center gap-1.5 text-[10px] text-muted-foreground/80 hover:text-foreground transition-colors cursor-pointer",children:[O?l.jsx(AN,{className:"h-3 w-3"}):l.jsx(EN,{className:"h-3 w-3"}),l.jsxs("span",{children:["Alternative Empfehlungen anzeigen (",M.length,")"]})]}),O&&l.jsx("div",{className:"mt-2.5 space-y-2 max-h-36 overflow-y-auto pr-1 scrollbar-thin",children:M.map(D=>l.jsxs("div",{className:"p-2 rounded-lg bg-background/25 border border-border/20 flex items-center justify-between gap-3",children:[l.jsxs("div",{className:"min-w-0",children:[l.jsx("div",{className:"text-[10px] font-mono font-bold text-foreground truncate",title:D.name,children:D.name}),l.jsxs("div",{className:"text-[9px] text-muted-foreground flex items-center gap-1.5 mt-0.5",children:[l.jsxs("span",{children:["Quant: ",D.quant]}),l.jsx("span",{children:"•"}),l.jsx("span",{children:D.fit.text})]})]}),l.jsx("button",{onClick:()=>b(D.repo,j.role,D.quant||"Q4_K_M",D.caps.tools!=="no"),disabled:!!c[D.repo],className:"h-6 px-2.5 rounded bg-background/40 hover:bg-background/80 border border-border/40 text-[9px] font-bold text-foreground transition-all cursor-pointer shrink-0 disabled:opacity-50",children:c[D.repo]||"Installieren"})]},D.repo))})]})]},j.role)})})]})]})}function IX(){const[e,t]=y.useState("cockpit");return l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{className:"flex flex-col sm:flex-row justify-between sm:items-center gap-4",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Modell-Manager"}),l.jsx("p",{className:"text-sm text-muted-foreground",children:"Verwalte deine Modelle und passe das Gateway-Routing live über das interaktive Cockpit an."})]}),l.jsx("div",{className:"flex rounded-xl border border-border/60 bg-card/45 backdrop-blur-md p-1 self-start",children:["cockpit","discover"].map(r=>l.jsx("button",{onClick:()=>t(r),className:te("rounded-lg px-4 py-1.5 text-xs font-semibold tracking-wide uppercase transition-all cursor-pointer",e===r?"bg-primary text-primary-foreground shadow-md shadow-primary/10":"text-muted-foreground hover:text-foreground"),children:r==="cockpit"?"Cockpit":"Modelle finden"},r))})]}),l.jsx(xX,{}),l.jsx("div",{className:"transition-all duration-300",children:e==="cockpit"?l.jsx(GO,{}):l.jsx(MX,{})})]})}const TX={cline:"cline_settings.json",cursor:"Settings → Models",opencode:"opencode.jsonc",zed:"settings.json",continue:"~/.continue/config.json",claude_code:"~/.zshrc / env"};function G2({line:e,loading:t}){return t||!e?l.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] font-semibold text-muted-foreground",children:[l.jsx(rh,{className:"h-3 w-3 animate-spin"})," prüfe…"]}):e.ok?l.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] font-semibold text-emerald-400",children:[l.jsx(e4,{className:"h-3 w-3"})," ",e.detail]}):l.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] font-semibold text-red-400",children:[l.jsx(r4,{className:"h-3 w-3"})," ",e.detail]})}function V2({tool:e,fileName:t,accent:r,copied:n,onCopy:a}){return l.jsxs("div",{className:"flex flex-col border border-border/60 bg-black/60 rounded-2xl overflow-hidden shadow-2xl",children:[l.jsxs("div",{className:"flex h-11 items-center justify-between px-4 border-b border-border/40 bg-black/40 shrink-0",children:[l.jsxs("div",{className:"flex items-center gap-1.5",children:[l.jsx("span",{className:"h-3 w-3 rounded-full bg-red-500/80"}),l.jsx("span",{className:"h-3 w-3 rounded-full bg-amber-500/80"}),l.jsx("span",{className:"h-3 w-3 rounded-full bg-emerald-500/80"})]}),l.jsx("div",{className:"flex items-center gap-1.5 text-[10px] font-mono text-muted-foreground/75 bg-background/30 px-3 py-1 rounded-md border border-border/20",children:l.jsx("span",{children:t})}),l.jsxs("button",{onClick:a,className:"flex h-7 px-2.5 items-center gap-1.5 rounded-lg border border-border/40 bg-background/30 text-[10px] font-semibold text-muted-foreground hover:text-foreground hover:bg-background/60 transition-all cursor-pointer",children:[n?l.jsx(or,{className:"h-3.5 w-3.5 text-emerald-400"}):l.jsx(nv,{className:"h-3.5 w-3.5"}),l.jsx("span",{children:n?"Kopiert":"Kopieren"})]})]}),l.jsx("pre",{className:te("p-5 overflow-x-auto text-xs font-mono whitespace-pre leading-relaxed scrollbar-thin select-text bg-black/10",r==="teal"?"text-cyan-200/90":"text-violet-200/90"),children:l.jsx("code",{children:e.snippet})})]})}function VO(){const[e,t]=y.useState(localStorage.getItem("mc_host")||"192.168.178.151"),[r,n]=y.useState(localStorage.getItem("mc_mcp_path")||""),[a,o]=y.useState("cline"),[u,c]=y.useState(null),f=new URLSearchParams({host:e});r&&f.set("mcp_path",r);const{data:h,error:m}=$D(f.toString()),{data:g,isLoading:v}=zD(),b=m?String(m):"";function j(E){t(E),E&&localStorage.setItem("mc_host",E)}function k(E){n(E),localStorage.setItem("mc_mcp_path",E)}const S=h==null?void 0:h.tools[a];async function N(E,A){A&&(await navigator.clipboard.writeText(A),c(E),setTimeout(()=>c(null),1500))}return l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Verbindung & Integration"}),l.jsxs("p",{className:"text-sm text-muted-foreground",children:["Binde deinen lokalen Agenten an die Box an — über ",l.jsx("span",{className:"text-foreground",children:"zwei getrennte Leitungen"}),": das Modell (Gateway) und das geteilte Gedächtnis (MCP)."]})]}),l.jsxs("div",{className:"p-5 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md shadow-lg shadow-black/10",children:[l.jsxs("div",{className:"grid gap-4 md:grid-cols-[170px_1fr] items-center",children:[l.jsxs("div",{className:"rounded-2xl border border-border/60 bg-background/40 p-4 text-center",children:[l.jsx(g4,{className:"h-7 w-7 mx-auto text-muted-foreground"}),l.jsx("div",{className:"mt-2 text-sm font-semibold text-foreground",children:"Dein lokaler Agent"}),l.jsx("div",{className:"text-[11px] text-muted-foreground",children:"Cline · Cursor · Zed …"})]}),l.jsxs("div",{className:"flex flex-col gap-2.5",children:[l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsx(Zd,{className:"h-4 w-4 text-muted-foreground shrink-0"}),l.jsxs("div",{className:"flex-1 rounded-xl border border-primary/25 bg-primary/5 px-3.5 py-2.5",children:[l.jsxs("div",{className:"flex items-center justify-between gap-2",children:[l.jsxs("div",{className:"flex items-center gap-2 text-xs font-semibold text-primary",children:[l.jsx($n,{className:"h-3.5 w-3.5"})," Leitung 1 — Modell"]}),l.jsx(G2,{line:g==null?void 0:g.gateway,loading:v})]}),l.jsx("div",{className:"mt-1 text-[11px] font-mono text-primary/80",children:"Gateway · :9001/v1 · Lanes chat / coding"})]})]}),l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsx(Zd,{className:"h-4 w-4 text-muted-foreground shrink-0"}),l.jsxs("div",{className:"flex-1 rounded-xl border border-violet-500/25 bg-violet-500/5 px-3.5 py-2.5",children:[l.jsxs("div",{className:"flex items-center justify-between gap-2",children:[l.jsxs("div",{className:"flex items-center gap-2 text-xs font-semibold text-violet-300",children:[l.jsx(yo,{className:"h-3.5 w-3.5"})," Leitung 2 — Gedächtnis"]}),l.jsx(G2,{line:g==null?void 0:g.memory,loading:v})]}),l.jsx("div",{className:"mt-1 text-[11px] font-mono text-violet-300/80",children:"MCP · mcp_memory.py · separat"})]})]})]})]}),l.jsxs("p",{className:"mt-3.5 text-[11px] text-muted-foreground leading-relaxed",children:["Der Gateway liefert ",l.jsx("span",{className:"text-foreground",children:"nur das LLM"}),". Das geteilte Gedächtnis läuft über einen",l.jsx("span",{className:"text-foreground",children:" eigenen MCP-Server"})," — beide werden unabhängig eingerichtet."]})]}),l.jsxs("div",{className:"grid gap-4 md:grid-cols-2 p-5 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md shadow-lg shadow-black/10",children:[l.jsxs("div",{className:"space-y-1.5",children:[l.jsxs("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground flex items-center gap-1.5",children:[l.jsx(f4,{className:"h-3.5 w-3.5 text-primary"})," Box LAN IP-Adresse"]}),l.jsx("input",{value:e,onChange:E=>j(E.target.value),"aria-label":"Box LAN IP-Adresse",spellCheck:!1,placeholder:"z.B. 192.168.178.151",className:"w-full h-9 rounded-lg border border-border/60 bg-background/40 px-3 font-mono text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground"})]}),l.jsxs("div",{className:"space-y-1.5",children:[l.jsxs("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground flex items-center gap-1.5",children:[l.jsx(c4,{className:"h-3.5 w-3.5 text-violet-400"})," Lokaler MCP-Scriptpfad",l.jsx("span",{className:"text-violet-400/70 normal-case font-semibold tracking-normal",children:"(nur Leitung 2)"})]}),l.jsx("input",{value:r,onChange:E=>k(E.target.value),"aria-label":"Lokaler MCP-Scriptpfad",spellCheck:!1,placeholder:"z.B. F:\\Coding Stuff\\mission-control-2\\mcp\\mcp_memory.py",className:"w-full h-9 rounded-lg border border-border/60 bg-background/40 px-3 font-mono text-xs outline-none focus:ring-1 focus:ring-violet-500/50 text-foreground"})]})]}),b&&l.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400",children:["Fehler beim Generieren der Snippets: ",b]}),h&&l.jsxs("div",{className:"grid gap-5 lg:grid-cols-2",children:[l.jsxs("div",{className:"space-y-3 rounded-2xl border border-border/60 border-t-2 border-t-primary/70 bg-card/30 p-4",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center gap-2 text-sm font-space font-bold text-foreground",children:[l.jsx("span",{className:"flex h-5 w-5 items-center justify-center rounded-md bg-primary/15 text-primary text-[11px]",children:"1"}),"Modell anbinden"]}),l.jsx("p",{className:"text-[11px] text-muted-foreground mt-0.5",children:"Wähle dein Tool — das Snippet zeigt auf den Gateway."})]}),l.jsx("div",{className:"flex flex-wrap gap-1.5",children:Object.entries(h.tools).map(([E,A])=>l.jsx("button",{onClick:()=>o(E),className:te("rounded-lg px-3 py-1.5 text-[11px] font-semibold tracking-wide transition-all cursor-pointer",a===E?"bg-primary text-primary-foreground shadow-md shadow-primary/10":"border border-border/50 text-muted-foreground hover:text-foreground"),children:A.label},E))}),S&&l.jsxs(l.Fragment,{children:[S.note&&l.jsxs("div",{className:"flex items-start gap-2.5 p-3 rounded-xl bg-primary/5 border border-primary/20 text-[11px] text-muted-foreground leading-relaxed",children:[l.jsx(hw,{className:"h-4 w-4 text-primary shrink-0 mt-0.5"}),l.jsx("span",{children:S.note})]}),l.jsx(V2,{tool:S,fileName:TX[a]||"config.json",accent:"teal",copied:u==="model",onCopy:()=>N("model",S.snippet)})]})]}),l.jsxs("div",{className:"space-y-3 rounded-2xl border border-border/60 border-t-2 border-t-violet-500/70 bg-card/30 p-4",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center gap-2 text-sm font-space font-bold text-foreground",children:[l.jsx("span",{className:"flex h-5 w-5 items-center justify-center rounded-md bg-violet-500/15 text-violet-300 text-[11px]",children:"2"}),"Gedächtnis anbinden",l.jsx("span",{className:"text-[10px] font-medium text-muted-foreground normal-case",children:"optional"})]}),l.jsxs("p",{className:"text-[11px] text-muted-foreground mt-0.5",children:["Ein MCP-Block — gilt zusätzlich für ",l.jsx("em",{children:"jedes"})," Tool aus Schritt 1."]})]}),l.jsxs("div",{className:"flex items-start gap-2.5 p-3 rounded-xl bg-violet-500/5 border border-violet-500/20 text-[11px] text-muted-foreground leading-relaxed",children:[l.jsx(hw,{className:"h-4 w-4 text-violet-400 shrink-0 mt-0.5"}),l.jsx("span",{children:h.memory.note})]}),l.jsx(V2,{tool:h.memory,fileName:"mcp.json",accent:"violet",copied:u==="memory",onCopy:()=>N("memory",h.memory.snippet)})]})]})]})}const DX="modulepreload",RX=function(e){return"/"+e},q2={},LX=function(t,r,n){let a=Promise.resolve();if(r&&r.length>0){let u=function(h){return Promise.all(h.map(m=>Promise.resolve(m).then(g=>({status:"fulfilled",value:g}),g=>({status:"rejected",reason:g}))))};document.getElementsByTagName("link");const c=document.querySelector("meta[property=csp-nonce]"),f=(c==null?void 0:c.nonce)||(c==null?void 0:c.getAttribute("nonce"));a=u(r.map(h=>{if(h=RX(h),h in q2)return;q2[h]=!0;const m=h.endsWith(".css"),g=m?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${h}"]${g}`))return;const v=document.createElement("link");if(v.rel=m?"stylesheet":DX,m||(v.as="script"),v.crossOrigin="",v.href=h,f&&v.setAttribute("nonce",f),document.head.appendChild(v),m)return new Promise((b,j)=>{v.addEventListener("load",b),v.addEventListener("error",()=>j(new Error(`Unable to preload CSS for ${h}`)))})}))}function o(u){const c=new Event("vite:preloadError",{cancelable:!0});if(c.payload=u,window.dispatchEvent(c),!c.defaultPrevented)throw u}return a.then(u=>{for(const c of u||[])c.status==="rejected"&&o(c.reason);return t().catch(o)})};class $X extends y.Component{constructor(){super(...arguments);Qo(this,"state",{error:null})}static getDerivedStateFromError(r){return{error:r}}render(){return this.state.error?l.jsxs("div",{className:"h-[480px] rounded-2xl border border-red-500/20 bg-red-500/5 p-6 text-xs text-red-400 overflow-auto",children:[l.jsx("div",{className:"font-semibold mb-2",children:"Graph konnte nicht gerendert werden"}),l.jsx("pre",{className:"whitespace-pre-wrap break-words text-[11px] leading-relaxed",children:this.state.error.message})]}):this.props.children}}const zX=y.lazy(()=>LX(()=>import("./GraphView-CeSgzZFi.js"),[]).then(e=>({default:e.GraphView}))),Bd=["identity","knowledge","rules","events"],Q2=new Set(["auto","agent","hermes"]),$g={identity:{label:"Identität",icon:U4,bg:"bg-cyan-500/10",text:"text-cyan-400"},knowledge:{label:"Wissen",icon:Gs,bg:"bg-indigo-500/10",text:"text-indigo-400"},rules:{label:"Regeln",icon:M4,bg:"bg-violet-500/10",text:"text-violet-400"},events:{label:"Ereignisse",icon:n4,bg:"bg-amber-500/10",text:"text-amber-400"}},Y2={label:"Gedächtnis",icon:tv,text:"text-muted-foreground"},FX={identity:"border-l-cyan-500/80",knowledge:"border-l-indigo-500/80",rules:"border-l-violet-500/80",events:"border-l-amber-500/80"},X2=`Hi Hermes! Lass uns ein kurzes Onboarding machen, damit du dich künftig an mich erinnerst. Stell mir nacheinander ein paar kurze Fragen zu: 1) wer ich bin und woran ich gerade arbeite, 2) wie ich angesprochen werden möchte, 3) meine bevorzugten Tools, Sprachen und Arbeitsweise, @@ -660,4 +660,4 @@ name: tdd-pro description: Treibt Entwicklung mit strikter TDD-Praxis --- # Instructions -...`}),l.jsxs("p",{children:["Suchen & installieren über die ",l.jsx("strong",{children:"skills.sh"}),"-Registry: ",l.jsx(ze,{children:"npx skills find"})," /",l.jsx(ze,{children:"npx skills add owner/repo"}),". Skills liegen projektweit (vom Agent beim Start gelesen) oder global."]})]}),l.jsxs(_r,{id:"memory",icon:s4,color:"text-indigo-400",title:"8. Gedächtnis & RAG",kicker:"Modelle vergessen — du nicht",wide:!0,children:[l.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:["LLMs sind ",l.jsx("strong",{children:"zustandslos"}),": ohne Hilfe weiß das Modell beim nächsten Turn nichts mehr. Gedächtnis lebt extern."]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Embeddings"})," wandeln Text in Vektoren; ein ",l.jsx("strong",{children:"Vektor-Store"})," (Chroma, …) findet semantisch Ähnliches."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"RAG"})," = relevante Fakten vor dem Turn heraussuchen und einblenden statt alles im Prompt zu halten."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Long-Context vs. RAG:"}),' riesige Fenster sind bequem, aber teuer & „lost in the middle" — gezieltes Abrufen skaliert besser.']})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:[l.jsx("strong",{children:"Auto-lernendes Gedächtnis"})," ist die nächste Stufe:"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:["extrahiert Fakten ",l.jsx("em",{children:"selbst"})," aus Gesprächen, statt nur abzuspeichern"]}),l.jsx("li",{children:"dedupliziert semantisch (kein 10× derselbe Fakt)"}),l.jsxs("li",{children:[l.jsx("strong",{children:"Graph-Sicht"})," = Fakten ",l.jsx("em",{children:"plus"})," ihre Beziehungen, nicht nur eine flache Liste"]})]})]})]}),l.jsxs($a,{children:["Dein Gedächtnis (Tab ",l.jsx("strong",{children:"Gedächtnis"}),") ist ",l.jsx("strong",{children:"Mem0"}),"-basiert: auto-lernend & semantisch, ",l.jsx("strong",{children:"graph-first"})," dargestellt, mit 4-Typen-Taxonomie (",l.jsx(ze,{children:"Identität"})," · ",l.jsx(ze,{children:"Wissen"})," · ",l.jsx(ze,{children:"Regeln"})," · ",l.jsx(ze,{children:"Ereignisse"}),"). Einstieg über ein kurzes ",l.jsx("strong",{children:"Hermes-Onboarding-Gespräch"})," im Terminal — der Agent lernt im Hintergrund nach jedem Turn.",l.jsx("br",{}),l.jsx("strong",{children:"Gotcha:"})," ein gelöschter Fakt kann wieder auftauchen, solange die Original-Nachricht noch im Verlauf steht (additive Extraktion)."]})]}),l.jsxs(_r,{id:"agents",icon:gn,color:"text-rose-400",title:"9. Autonome Agenten betreiben",kicker:"LLM in der Schleife",wide:!0,children:[l.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:["Ein ",l.jsx("strong",{children:"Agent"})," ist ein LLM in einer Schleife mit Tools:",l.jsx("em",{children:" denken → Tool aufrufen → Ergebnis beobachten → weiter"}),", bis das Ziel erreicht ist."]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Guardrails"})," (Hard-Stop, Tool-Limits) verhindern Endlos-Loops, wenn ein Tool fehlt oder hängt."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Kontext-Hygiene"})," ist die wichtigste Disziplin: frische Sessions starten — vollgemüllte Historien werden langsam, driften und halluzinieren."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Kanäle:"})," CLI/Terminal, Chat-UI, Messaging (z.B. Telegram), reine API."]})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:[l.jsx("strong",{children:"Least Privilege:"})," gib einem Agenten nur die Tools, die er wirklich braucht. Kritische Aktionen (Shell auf dem Host, Löschen, Geld/Deploys) hinter menschliche Freigabe."]}),l.jsxs("p",{children:[l.jsx("strong",{children:"Was sich vollautomatisch lohnt:"})," Modell-Routing, Hintergrund-Gedächtnis, Recherche. ",l.jsx("strong",{children:"Was Freigabe braucht:"})," Systembefehle, Updates/Reboots, permanentes Löschen."]})]})]}),l.jsxs($a,{children:[l.jsx("strong",{children:"Hermes"})," ist dein Box-Agent (Hirn = ",l.jsx(ze,{children:"fast"}),"). Reden tust du mit ihm im",l.jsx("strong",{children:" Terminal"}),"-Tab (Web-Terminal via ttyd) oder per ",l.jsx("strong",{children:"Telegram"}),". Er hat MCP-Server für Gedächtnis, Stack-Steuerung, Web-Fetch und ",l.jsx("strong",{children:"PC-Steuerung"})," (Executor auf deinem Windows-PC). Status & Verdrahtung im ",l.jsx("strong",{children:"Hermes"}),"-Tab."]})]}),l.jsxs(_r,{id:"ide",icon:_s,color:"text-cyan-400",title:"10. IDE / Editor anbinden",kicker:"Vibe-Coding lokal",children:[l.jsxs("p",{children:["Jede ",l.jsx("strong",{children:"OpenAI-kompatible"})," IDE oder Extension lässt sich auf einen lokalen Server umbiegen — Base-URL + Model eintragen, fertig:"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Cline"})," & ",l.jsx("strong",{children:"Roo Code"})," (VS-Code-Extensions, voller Agent + MCP)"]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Cursor"})," (VS-Code-Fork mit Top-Autocomplete)"]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Continue"}),", ",l.jsx("strong",{children:"aider"})," (CLI), ",l.jsx("strong",{children:"OpenCode"})," (Desktop)"]})]}),l.jsxs($a,{children:["Tipp den Kram nicht ab: der ",l.jsx("strong",{children:"Verbinden"}),"-Tab generiert die fertige Config (inkl. MCP-Gedächtnis) pro Tool zum Kopieren. Essenz: Base ",l.jsx(ze,{children:"…:9001/v1"}),", Model ",l.jsx(ze,{children:"auto"}),", Key beliebig."]})]}),l.jsx(_r,{id:"tricks",icon:x4,color:"text-amber-400",title:"11. Tricks & Kniffe",kicker:"Was im Alltag wirklich spart",wide:!0,children:l.jsx("div",{className:"grid md:grid-cols-3 gap-3",children:[["Kontext sauber halten","Neue Session statt Mega-Historie. Drift, Tempo und Halluzination hängen direkt am Kontext-Müll."],["Plan-then-Act","Erst Plan/Vorgehen bestätigen lassen, dann ausführen. Spart teure Holzwege."],["Gezielte Edits","Nie ganze Dateien überschreiben für eine Zeile — Such-/Ersetz-Tools nutzen. Weniger Tokens, weniger Fehler."],["Non-interaktive Befehle","Keine interaktiven Prompts im Agent-Terminal; lange Tasks als Background-Job. Sonst hängt der Loop."],["DevTools koppeln","Browser-/Konsolen-Zugriff geben — der Agent liest echte Fehler statt blind zu raten."],["Richtige Modellwahl","Schnelles Hirn für Alltag, großes für harte Logik, Coder fürs Coden. Nicht alles mit der Kanone."],["Akzeptanzkriterien","Sag konkret, woran „fertig“ erkennbar ist. Vage Prompts → vage Ergebnisse."],["Verifizieren statt vertrauen","Tests/Live-Check fordern. „Sollte funktionieren“ ist kein Beweis."],["Regeln ins Gedächtnis","Wiederkehrende Vorlieben/Konventionen einmal ablegen — der Agent zieht sie selbst."]].map(([r,n])=>l.jsxs("div",{className:"space-y-1 p-3 bg-background/10 rounded-xl border border-border/30",children:[l.jsxs("div",{className:"flex items-center gap-1.5 font-bold text-foreground text-[11px]",children:[l.jsx(ma,{className:"h-3 w-3 text-amber-400"})," ",r]}),l.jsx("p",{className:"text-[11px]",children:n})]},r))})}),l.jsx(_r,{id:"wartung",icon:Gs,color:"text-emerald-400",title:"12. Sicherheit & Wartung",kicker:"Damit's auch morgen noch läuft",wide:!0,children:l.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{className:"flex items-center gap-1.5 font-bold text-foreground",children:[l.jsx(CN,{className:"h-3.5 w-3.5 text-emerald-400"})," Goldene Regeln"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Ein ungetesteter Restore ist kein Backup."})," Wiederherstellung mindestens einmal echt durchspielen."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Updates können Dinge still zerschießen"})," — gerade bei AI-Stacks (Embeddings, Provider-Interna). Versionen pinnen, Smoke-Test, Post-Check."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Least Privilege"})," für Agenten, MCP-Server und PC-Zugriff. Kritisches hinter Freigabe."]})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{className:"flex items-center gap-1.5 font-bold text-foreground",children:[l.jsx(Uu,{className:"h-3.5 w-3.5 text-emerald-400"})," Bei dir im SystemDrawer"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Backup:"})," tägliches Voll-Zustands-Backup, getesteter ",l.jsx(ze,{children:"restore.sh"})," (Doku in ",l.jsx(ze,{children:"docs/BACKUP.md"}),")."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Updates:"})," git-basierter Update-Check; ",l.jsx("strong",{children:"Hermes-Update-Button"})," mit anschließendem ",l.jsx("strong",{children:"Gehirn-Check"})," (rot, falls das Update das Gedächtnis zerschießt) + Engine-Update."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Dienste & Gefahrenzone:"})," Restart/Logs pro Dienst, kritische Eingriffe getrennt."]})]}),l.jsx("p",{className:"text-[10px] italic",children:'Erreichbar über das System-Icon → Tab „Wartung".'})]})]})}),l.jsxs("section",{id:"ressourcen",className:"scroll-mt-20 md:col-span-2 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 shadow-lg shadow-black/10 space-y-4",children:[l.jsxs("div",{className:"flex items-center gap-2.5 border-b border-border/20 pb-3",children:[l.jsx(rv,{className:"h-5 w-5 text-primary"}),l.jsxs("div",{children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"13. Kuratierte Ressourcen & Links"}),l.jsx("span",{className:"text-[9px] font-mono text-primary",children:"Sauber geordnet — die guten Quellen"})]})]}),l.jsxs("div",{className:"grid md:grid-cols-2 gap-5 text-xs",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"font-bold text-foreground flex items-center gap-1.5",children:[l.jsx(Jd,{className:"h-3.5 w-3.5 text-sky-400"})," Modelle & Engines"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1.5",children:[l.jsx(wt,{href:"https://huggingface.co/models",name:"Hugging Face",note:"das Repository für offene Modelle (GGUF, Embeddings, Datasets)."}),l.jsx(wt,{href:"https://github.com/ggml-org/llama.cpp",name:"llama.cpp",note:"die Referenz-Engine für lokale Inferenz."}),l.jsx(wt,{href:"https://github.com/mostlygeek/llama-swap",name:"llama-swap",note:"mehrere Modelle hinter einem Port, Auto-Swap."}),l.jsx(wt,{href:"https://ollama.com",name:"Ollama",note:"einfachster Einstieg, One-Command-Modelle."}),l.jsx(wt,{href:"https://lmstudio.ai",name:"LM Studio",note:"lokale GUI zum Stöbern, Laden & Chatten."}),l.jsx(wt,{href:"https://github.com/vllm-project/vllm",name:"vLLM",note:"Hochdurchsatz-Serving auf dicken GPUs."})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"font-bold text-foreground flex items-center gap-1.5",children:[l.jsx(tf,{className:"h-3.5 w-3.5 text-violet-400"})," MCP & Skills"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1.5",children:[l.jsx(wt,{href:"https://modelcontextprotocol.io",name:"MCP — offizielle Doku",note:"Spezifikation & Einstieg."}),l.jsx(wt,{href:"https://github.com/modelcontextprotocol/servers",name:"Offizielle MCP-Server",note:"filesystem, git, postgres, fetch & mehr."}),l.jsx(wt,{href:"https://smithery.ai",name:"Smithery",note:"Registry zum Suchen & Auto-Installieren von MCP-Servern."}),l.jsx(wt,{href:"https://glama.ai/mcp/servers",name:"Glama MCP Registry",note:"kuratierte Community-Datenbank."}),l.jsx(wt,{href:"https://skills.sh",name:"skills.sh",note:"Registry & CLI für Agent-Skills."})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"font-bold text-foreground flex items-center gap-1.5",children:[l.jsx(gn,{className:"h-3.5 w-3.5 text-rose-400"})," Agenten & Frameworks"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1.5",children:[l.jsx(wt,{href:"https://github.com/NousResearch/hermes-agent",name:"Hermes Agent (Nous)",note:"der Agent, der auf deiner Box läuft."}),l.jsx(wt,{href:"https://docs.claude.com",name:"Anthropic / Claude Docs",note:"API, Tool-Use, Agent SDK, MCP."}),l.jsx(wt,{href:"https://github.com/cline/cline",name:"Cline",note:"autonomer Coding-Agent für VS Code."}),l.jsx(wt,{href:"https://aider.chat",name:"aider",note:"AI-Pair-Programming im Terminal, git-nativ."}),l.jsx(wt,{href:"https://continue.dev",name:"Continue",note:"Open-Source-Autopilot für IDEs."})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"font-bold text-foreground flex items-center gap-1.5",children:[l.jsx(tv,{className:"h-3.5 w-3.5 text-amber-400"})," Lernen & Community"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1.5",children:[l.jsx(wt,{href:"https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/overview",name:"Prompt-Engineering (Anthropic)",note:"die beste praktische Anleitung."}),l.jsx(wt,{href:"https://github.com/anthropics/anthropic-cookbook",name:"Anthropic Cookbook",note:"lauffähige Rezepte für Tools, RAG, Agenten."}),l.jsx(wt,{href:"https://www.promptingguide.ai",name:"Prompt Engineering Guide",note:"herstellerneutrales Nachschlagewerk."}),l.jsx(wt,{href:"https://github.com/mem0ai/mem0",name:"Mem0",note:"die auto-lernende Memory-Schicht hinter deinem Gedächtnis."}),l.jsx(wt,{href:"https://www.reddit.com/r/LocalLLaMA/",name:"r/LocalLLaMA",note:"der Puls der lokalen-LLM-Szene."})]})]})]})]}),l.jsx(_r,{id:"troubleshooting",icon:y4,color:"text-rose-400",title:"14. Troubleshooting",kicker:"Wenn's hakt",wide:!0,children:l.jsxs("ul",{className:"space-y-2 list-disc pl-4",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Keine Verbindung?"})," Selbes LAN wie die Box? IP/Port stimmen (",l.jsx(ze,{children:":9001"}),")? Backend-Status in der ",l.jsx("strong",{children:"Zentrale"})," prüfen."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Modell antwortet nicht / langsam?"})," In der ",l.jsx("strong",{children:"Zentrale → Dienste"})," schauen, ob ",l.jsx(ze,{children:"llama-swap"})," grün ist; sonst Restart. Erstes Token nach Swap dauert (Modell lädt)."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Agent dreht durch / halluziniert?"})," Frische Session im ",l.jsx("strong",{children:"Terminal"})," starten — meist ist es vollgemüllter Kontext."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Gedächtnis findet nichts?"})," Embedding-Dienst online? Semantisch suchen (Sinn statt exaktem Wort). Leeres Gedächtnis → Hermes-Onboarding starten."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Update hat etwas zerschossen?"})," Genau dafür gibt es Backup & ",l.jsx(ze,{children:"restore.sh"})," — den getesteten Restore fahren, dann Ursache suchen."]})]})})]}),l.jsx("p",{className:"text-center text-[10px] text-muted-foreground/50 pt-2",children:"Mission Control 2 · AI-Bibel · Stand Juni 2026 — lebendes Dokument, wächst mit dem Stack."})]})}function KX({title:e,hint:t}){return l.jsxs("div",{className:"space-y-4",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-xl font-semibold",children:e}),l.jsx("p",{className:"text-sm text-muted-foreground",children:t})]}),l.jsxs("div",{className:"flex flex-col items-center justify-center gap-3 rounded-xl border border-dashed border-border bg-card/50 py-20 text-center",children:[l.jsx(o4,{className:"h-8 w-8 text-muted-foreground"}),l.jsx("div",{className:"text-sm text-muted-foreground",children:"Kommt in einer späteren Phase."})]})]})}const J2=[{id:"mission-control-2",label:"Mission Control",type:"user",reach:"gateway (integr"},{id:"hermes-gateway",label:"Hermes Gateway",type:"user",reach:"hermes-gateway"},{id:"mem0-service",label:"Mem0 (Gedächtnis)",type:"user",reach:"mem0"},{id:"hermes-terminal",label:"Hermes Terminal",type:"user",reach:"hermes-terminal"},{id:"llama-swap",label:"Llama Swap",type:"system",reach:"llama-swap"}];function au({icon:e,iconClass:t,name:r,status:n,available:a,busy:o,actionLabel:u,onAction:c}){return l.jsxs("div",{className:te("flex items-center gap-3 rounded-lg border px-3 py-2",a?"border-amber-500/30 bg-amber-500/5":"border-border/50 bg-background/20"),children:[l.jsx(e,{className:te("h-4 w-4 shrink-0",t)}),l.jsxs("div",{className:"flex-1 min-w-0",children:[l.jsx("div",{className:"text-xs text-foreground truncate",children:r}),l.jsx("div",{className:te("text-[10px] truncate",a?"text-amber-400/90":"text-muted-foreground"),children:n})]}),l.jsx("button",{onClick:c,disabled:!a||o,className:te("text-[11px] font-semibold rounded-lg px-2.5 py-1 transition-colors shrink-0",a?"bg-primary text-primary-foreground hover:opacity-90 cursor-pointer":"border border-border/50 text-muted-foreground/40 cursor-default"),children:o?"…":u})]})}function GX({label:e,ok:t,system:r,busy:n,onRestart:a,onLogs:o}){return l.jsxs("div",{className:"flex items-center gap-2.5 rounded-lg border border-border/50 bg-background/20 px-3 py-2",children:[l.jsx("span",{className:te("w-1.5 h-1.5 rounded-full shrink-0",t===!0?"bg-emerald-500":t===!1?"bg-red-500":"bg-muted-foreground/40")}),l.jsxs("span",{className:"flex-1 text-xs text-foreground truncate",children:[e,r&&l.jsx("span",{className:"text-[9px] text-muted-foreground",children:" (root)"})]}),l.jsx("button",{onClick:a,disabled:n,title:"Neu starten",className:"text-muted-foreground hover:text-primary transition-colors disabled:opacity-50",children:l.jsx(Ha,{className:te("h-3.5 w-3.5",n&&"animate-spin")})}),l.jsx("button",{onClick:o,title:"Logs ansehen",className:"text-muted-foreground hover:text-primary transition-colors",children:l.jsx(l4,{className:"h-3.5 w-3.5"})})]})}function zg(e){return e==null?"":e>1024**3?`${(e/1024**3).toFixed(2)} GB`:`${(e/1024**2).toFixed(1)} MB`}function VX({open:e,showAlert:t}){const[r,n]=y.useState(""),[a,o]=y.useState(""),[u,c]=y.useState(!1),[f,h]=y.useState(!1);return y.useEffect(()=>{e&&(n(localStorage.getItem("mc_sudo_password")||""),o(localStorage.getItem("mc_hf_token")||""))},[e]),l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Zugangsdaten & Schlüssel"}),l.jsx("p",{className:"text-[10px] text-muted-foreground leading-normal",children:"Diese Daten werden ausschließlich lokal in deinem Browser (localStorage) gespeichert und bei Bedarf an das Backend übertragen."})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("label",{className:"text-xs font-semibold flex items-center gap-1.5",children:[l.jsx(Gs,{className:"h-4 w-4 text-amber-400"}),"Host Sudo-Passwort"]}),l.jsxs("div",{className:"relative",children:[l.jsx("input",{type:u?"text":"password",value:r,onChange:m=>n(m.target.value),"aria-label":"Host Sudo-Passwort",name:"sudo-password",autoComplete:"off",spellCheck:!1,placeholder:"Sudo-Passwort für System-Operationen",className:"w-full h-10 pl-3 pr-10 text-xs bg-background/40 border border-border/60 rounded-lg outline-none focus:border-primary transition-colors text-foreground"}),l.jsx("button",{type:"button",onClick:()=>c(!u),"aria-label":u?"Passwort verbergen":"Passwort anzeigen",className:"absolute inset-y-0 right-0 flex items-center pr-3 text-muted-foreground hover:text-foreground transition-colors",children:u?l.jsx(fw,{className:"h-4 w-4","aria-hidden":"true"}):l.jsx(ef,{className:"h-4 w-4","aria-hidden":"true"})})]}),l.jsx("p",{className:"text-[9px] text-muted-foreground leading-normal",children:"Wird benötigt für systemd-Dienste (Llama Swap logs/restart), OS-Update (apt) und Reboot."})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("label",{className:"text-xs font-semibold flex items-center gap-1.5",children:[l.jsx(p4,{className:"h-4 w-4 text-violet-400"}),"HuggingFace API Token"]}),l.jsxs("div",{className:"relative",children:[l.jsx("input",{type:f?"text":"password",value:a,onChange:m=>o(m.target.value),"aria-label":"HuggingFace API Token",name:"hf-token",autoComplete:"off",spellCheck:!1,placeholder:"hf_…",className:"w-full h-10 pl-3 pr-10 text-xs bg-background/40 border border-border/60 rounded-lg outline-none focus:border-primary transition-colors text-foreground"}),l.jsx("button",{type:"button",onClick:()=>h(!f),"aria-label":f?"Token verbergen":"Token anzeigen",className:"absolute inset-y-0 right-0 flex items-center pr-3 text-muted-foreground hover:text-foreground transition-colors",children:f?l.jsx(fw,{className:"h-4 w-4","aria-hidden":"true"}):l.jsx(ef,{className:"h-4 w-4","aria-hidden":"true"})})]}),l.jsx("p",{className:"text-[9px] text-muted-foreground leading-normal",children:"Erlaubt das Herunterladen von geschützten oder Gate-restricted Modellen direkt über Mission Control."})]}),l.jsxs("div",{className:"flex gap-3 pt-2",children:[l.jsx("button",{onClick:()=>{localStorage.setItem("mc_sudo_password",r),localStorage.setItem("mc_hf_token",a),t("Erfolgreich","Einstellungen erfolgreich lokal gespeichert.")},className:"flex-1 h-9 flex items-center justify-center text-xs font-semibold text-primary-foreground bg-primary hover:bg-primary/90 rounded-lg transition-colors shadow shadow-primary/10 cursor-pointer",children:"Speichern"}),l.jsx("button",{onClick:()=>{n(""),o(""),localStorage.removeItem("mc_sudo_password"),localStorage.removeItem("mc_hf_token"),t("Gelöscht","Zugangsdaten gelöscht.")},className:"h-9 px-4 flex items-center justify-center text-xs font-semibold text-muted-foreground border border-border/60 bg-background/20 hover:bg-accent rounded-lg transition-colors cursor-pointer",children:"Zurücksetzen"})]})]})}function qX({detail:e,maintenanceJob:t,onClose:r,onApply:n}){var f;const a=e.data,o={os:{icon:Gs,cls:"text-cyan-400",title:"OS-Pakete (apt)"},engine:{icon:nh,cls:"text-violet-400",title:"Inferenz-Engine (llama.cpp)"},swap:{icon:ON,cls:"text-fuchsia-400",title:"Router (llama-swap)"},hermes:{icon:gn,cls:"text-amber-400",title:"Hermes-Agent"}}[e.kind],u=o.icon,c=a?e.kind==="os"?(a.count??0)===0:e.kind==="hermes"?(a.behind??0)===0:a.installed_build!=null&&a.latest_build!=null&&a.latest_build<=a.installed_build:!0;return l.jsxs("div",{className:"fixed inset-0 z-[60] flex items-center justify-center p-4",children:[l.jsx("div",{className:"absolute inset-0 bg-black/70 backdrop-blur-sm",onClick:r}),l.jsxs("div",{className:"relative w-full max-w-lg max-h-[80vh] flex flex-col rounded-2xl border border-border/60 bg-card shadow-2xl font-sans text-foreground",children:[l.jsxs("div",{className:"flex h-14 shrink-0 items-center justify-between border-b border-border/40 px-5",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(u,{className:te("h-4.5 w-4.5",o.cls)}),l.jsx("h3",{className:"text-sm font-semibold",children:o.title})]}),l.jsx("button",{onClick:r,className:"flex h-7 w-7 items-center justify-center rounded-lg border border-border/40 text-muted-foreground hover:bg-accent transition-colors",children:l.jsx(zn,{className:"h-4 w-4"})})]}),l.jsx("div",{className:"flex-1 overflow-y-auto p-5 text-xs space-y-3 scrollbar-thin",children:e.loading?l.jsxs("div",{className:"flex h-24 items-center justify-center gap-2 text-muted-foreground",children:[l.jsx(Ha,{className:"h-4 w-4 animate-spin"})," Details werden geladen…"]}):a!=null&&a.error?l.jsx("div",{className:"rounded-lg border border-red-500/30 bg-red-500/5 p-3 text-red-400",children:a.error}):e.kind==="os"?((a==null?void 0:a.count)??0)===0?l.jsx("div",{className:"text-muted-foreground",children:"Keine Pakete zu aktualisieren — System ist aktuell."}):l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"text-muted-foreground",children:[a.count," Paket(e) werden aktualisiert:"]}),l.jsx("div",{className:"space-y-1",children:a.packages.map(h=>l.jsxs("div",{className:"flex items-center justify-between gap-2 rounded-md border border-border/40 bg-background/30 px-2.5 py-1.5",children:[l.jsxs("span",{className:"flex items-center gap-1.5 font-mono text-[11px] truncate",children:[l.jsx(A4,{className:"h-3 w-3 text-cyan-400 shrink-0"}),h.name]}),l.jsxs("span",{className:"flex items-center gap-1 font-mono text-[10px] text-muted-foreground shrink-0",children:[l.jsx("span",{children:h.current}),l.jsx(Zd,{className:"h-3 w-3"}),l.jsx("span",{className:"text-emerald-400",children:h.candidate})]})]},h.name))})]}):e.kind==="engine"||e.kind==="swap"?l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"flex items-center gap-2 font-mono text-[11px]",children:[l.jsxs("span",{className:"rounded-md border border-border/40 bg-background/30 px-2 py-1",children:["Build ",(a==null?void 0:a.installed_build)??"?"]}),l.jsx(Zd,{className:"h-3.5 w-3.5 text-muted-foreground"}),l.jsxs("span",{className:"rounded-md border border-emerald-500/30 bg-emerald-500/5 px-2 py-1 text-emerald-400",children:["Build ",(a==null?void 0:a.latest_build)??"?"]})]}),((a==null?void 0:a.name)||(a==null?void 0:a.latest_tag))&&l.jsxs("div",{className:"text-muted-foreground",children:["Release: ",l.jsx("span",{className:"text-foreground",children:a==null?void 0:a.name}),a!=null&&a.latest_tag?` (${a.latest_tag})`:""]}),(a==null?void 0:a.url)&&l.jsxs("a",{href:a.url,target:"_blank",rel:"noreferrer",className:"inline-flex items-center gap-1 text-primary hover:underline",children:["Release-Notes auf GitHub ",l.jsx(Is,{className:"h-3 w-3"})]}),(a==null?void 0:a.body)&&l.jsx("pre",{className:"whitespace-pre-wrap rounded-lg border border-border/40 bg-background/30 p-3 text-[10px] leading-relaxed text-muted-foreground max-h-60 overflow-y-auto scrollbar-thin",children:a.body})]}):(((f=a==null?void 0:a.commits)==null?void 0:f.length)??0)===0?l.jsx("div",{className:"text-muted-foreground",children:"Keine neuen Commits — Hermes-Agent ist bereits aktuell."}):l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"text-muted-foreground",children:[a.behind," neue Commit(s) auf ",l.jsxs("span",{className:"font-mono text-foreground",children:["origin/",a.branch]}),":"]}),l.jsx("div",{className:"space-y-1",children:a.commits.map(h=>l.jsxs("div",{className:"flex items-start gap-2 rounded-md border border-border/40 bg-background/30 px-2.5 py-1.5",children:[l.jsx(d4,{className:"h-3.5 w-3.5 text-primary shrink-0 mt-0.5"}),l.jsxs("div",{className:"min-w-0",children:[l.jsx("div",{className:"text-[11px] truncate",children:h.subject}),l.jsxs("div",{className:"font-mono text-[9px] text-muted-foreground",children:[h.hash," · ",h.when]})]})]},h.hash))}),l.jsx("p",{className:"text-[10px] text-muted-foreground leading-normal",children:"Vor dem Update wird automatisch ein Backup erstellt; danach startet der Hermes-Gateway neu."})]})}),l.jsxs("div",{className:"flex gap-3 border-t border-border/40 p-4 shrink-0",children:[l.jsx("button",{onClick:r,className:"h-9 flex-1 rounded-lg border border-border/60 bg-background/20 text-xs font-semibold text-muted-foreground hover:bg-accent transition-colors cursor-pointer",children:"Schließen"}),l.jsx("button",{onClick:n,disabled:e.loading||c||!!t,title:t?`Update läuft bereits: ${t.label}`:void 0,className:"h-9 flex-1 rounded-lg bg-primary text-xs font-semibold text-primary-foreground hover:opacity-90 transition-all cursor-pointer disabled:opacity-40 disabled:cursor-default",children:t?"Update läuft…":"Jetzt aktualisieren"})]})]})]})}function YO({open:e,onClose:t,defaultTab:r="maintenance"}){var nt;const[n,a]=y.useState(null),[o,u]=y.useState([]),[c,f]=y.useState("llama-swap"),[h,m]=y.useState(""),[g,v]=y.useState(!1),[b,j]=y.useState(null),[k,S]=y.useState({}),[N,E]=y.useState("maintenance"),[A,P]=y.useState(!1),[M,O]=y.useState(""),[D,B]=y.useState(!1),[F,z]=y.useState(null),[Y,U]=y.useState([]),[me,ue]=y.useState(!1),[ge,ie]=y.useState(null),[oe,X]=y.useState(null);function re(q,Le,Er){X({type:"alert",title:q,message:Le,onConfirm:()=>{X(null),Er&&Er()}})}function J(q,Le,Er){X({type:"confirm",title:q,message:Le,onConfirm:()=>{X(null),Er()},onCancel:()=>X(null)})}function I(q){return q?new Date(q*1e3).toLocaleString("de-DE",{day:"2-digit",month:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}):"Nie"}y.useEffect(()=>{e&&r&&E(r)},[e,r]);const _=y.useRef(null);function W(){je("/api/maintenance/updates").then(a).catch(q=>console.error("Error loading updates",q))}function ee(){je("/api/jobs").then(q=>u(q.jobs||[])).catch(q=>console.error("Error loading jobs",q))}function Z(){je("/api/system/services").then(z).catch(()=>{})}function he(){je("/api/system/backups").then(q=>U(q.backups||[])).catch(()=>{})}function pe(q){v(!0),j(null),je(`/api/maintenance/logs?service=${q}&lines=150`).then(Le=>{Le.ok?m(Le.text):(m(`Fehler beim Laden der Logs: ${Le.err||"Unbekannter Fehler"}`),(Le.status==="incorrect_password"||Le.status==="password_required")&&j(Le.status))}).catch(Le=>m(`Fehler: ${Le.message}`)).finally(()=>{v(!1),setTimeout(()=>{_.current&&(_.current.scrollTop=_.current.scrollHeight)},50)})}y.useEffect(()=>{if(!e)return;W(),ee(),Z(),he();const q=setInterval(()=>{ee(),W(),Z()},3e3);return()=>clearInterval(q)},[e]),y.useEffect(()=>{!e||N!=="logs"||pe(c)},[e,N,c]);function Pe(q){return(q==null?void 0:q.status)==="busy"?(re("Update läuft bereits",`Es läuft gerade „${q.running}". Bitte warte, bis es fertig ist.`),ee(),!0):!1}async function ne(){try{const q=await je("/api/maintenance/os-update",{method:"POST"});if(Pe(q))return;ee(),E("maintenance")}catch(q){re("Fehler",`Fehler beim Starten des OS-Updates: ${q.message}`)}}async function we(){try{const q=await je("/api/maintenance/engine-update",{method:"POST"});if(Pe(q))return;ee(),E("maintenance")}catch(q){re("Fehler",`Fehler beim Engine-Update: ${q.message}`)}}async function _e(){try{const q=await je("/api/maintenance/swap-update",{method:"POST"});if(Pe(q))return;ee(),E("maintenance")}catch(q){re("Fehler",`Fehler beim Router-Update: ${q.message}`)}}async function le(){ue(!0);try{const q=await je("/api/maintenance/hermes-update",{method:"POST"});if(Pe(q))return;ee()}catch(q){re("Fehler",`Hermes-Update fehlgeschlagen: ${q.message}`)}finally{ue(!1)}}async function Ze(q){ie({kind:q,loading:!0,data:null});try{const Le=await je(`/api/maintenance/update-details?kind=${q}`);ie({kind:q,loading:!1,data:Le})}catch(Le){ie({kind:q,loading:!1,data:{kind:q,error:Le.message}})}}function Be(){const q=ge==null?void 0:ge.kind;ie(null),q==="os"?ne():q==="engine"?we():q==="swap"?_e():q==="hermes"&&le()}async function Oe(){P(!0);try{await je("/api/maintenance/check-updates",{method:"POST"}),ee(),E("maintenance")}catch(q){re("Fehler",`Fehler bei der Update-Suche: ${q.message}`)}finally{P(!1)}}async function yt(q,Le){try{await je("/api/models/install",{method:"POST",body:JSON.stringify({repo:q,role:Le})}),re("Gestartet",`Modell-Upgrade für '${Le}' (${q}) gestartet.`),ee(),E("maintenance")}catch(Er){re("Fehler",`Fehler beim Starten des Modell-Upgrades: ${Er.message}`)}}async function Xt(){J("Reboot bestätigen","Bist du sicher, dass du das gesamte Host-System neu starten willst?",async()=>{try{await je("/api/maintenance/reboot",{method:"POST"}),re("Reboot","Reboot ausgelöst. System startet neu...",()=>{t()})}catch(q){re("Fehler",`Fehler beim Reboot: ${q.message}`)}})}async function K(){B(!0),O("Snapshot wird erzeugt...");try{const q=await je("/api/system/backup",{method:"POST"});O(q.ok?`Snapshot erzeugt: ${q.snapshot} (${q.files.length} Komponenten)`:"Backup fehlgeschlagen."),he()}catch(q){O(`Fehler: ${q.message}`)}finally{B(!1)}}async function Se(q){S(Le=>({...Le,[q]:!0}));try{const Le=await je("/api/maintenance/restart",{method:"POST",body:JSON.stringify({service:q})});Le.ok?re("Dienst neu gestartet",`Dienst ${q} wurde erfolgreich neu gestartet.`,()=>{N==="logs"&&c===q&&pe(q)}):re("Fehler",`Fehler beim Neustart: ${Le.err||"Unbekannter Fehler"}`)}catch(Le){re("Fehler",`Fehler beim Neustart: ${Le.message}`)}finally{S(Le=>({...Le,[q]:!1}))}}async function Ce(q){try{await je(`/api/jobs/${q}/cancel`,{method:"POST"}),ee()}catch(Le){re("Fehler",`Fehler beim Abbrechen: ${Le.message}`)}}const Ge=o.find(q=>(q.state==="running"||q.state==="queued")&&q.group==="maintenance");return l.jsxs(l.Fragment,{children:[l.jsx("div",{className:te("fixed inset-0 bg-black/60 backdrop-blur-sm z-50 transition-opacity duration-300",e?"opacity-100 pointer-events-auto":"opacity-0 pointer-events-none"),onClick:t}),l.jsxs("div",{className:te("fixed inset-y-0 right-0 w-full sm:w-[640px] bg-card/85 backdrop-blur-xl border-l border-border/60 shadow-2xl z-50 flex flex-col transform transition-transform duration-300 ease-in-out font-sans text-foreground",e?"translate-x-0":"translate-x-full"),children:[l.jsxs("div",{className:"flex h-16 shrink-0 items-center justify-between border-b border-border/40 px-6",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx($n,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold tracking-wide uppercase font-space",children:"OS-Zentrale & Pflege"})]}),l.jsx("button",{onClick:t,className:"flex h-8 w-8 items-center justify-center rounded-lg border border-border/40 text-muted-foreground hover:bg-accent transition-colors",children:l.jsx(zn,{className:"h-4 w-4"})})]}),l.jsxs("div",{className:"flex border-b border-border/40 px-6",children:[l.jsx("button",{onClick:()=>E("maintenance"),className:te("flex-1 py-3 text-xs font-semibold uppercase tracking-wider border-b-2 text-center transition-all",N==="maintenance"?"border-primary text-primary":"border-transparent text-muted-foreground hover:text-foreground"),children:"System-Wartung"}),l.jsx("button",{onClick:()=>E("logs"),className:te("flex-1 py-3 text-xs font-semibold uppercase tracking-wider border-b-2 text-center transition-all",N==="logs"?"border-primary text-primary":"border-transparent text-muted-foreground hover:text-foreground"),children:"System-Logs"}),l.jsx("button",{onClick:()=>E("settings"),className:te("flex-1 py-3 text-xs font-semibold uppercase tracking-wider border-b-2 text-center transition-all",N==="settings"?"border-primary text-primary":"border-transparent text-muted-foreground hover:text-foreground"),children:"Einstellungen"})]}),l.jsxs("div",{className:"flex-1 overflow-y-auto p-6 space-y-6",children:[N==="maintenance"&&l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"space-y-2.5",children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Updates"}),l.jsxs("button",{onClick:Oe,disabled:A||!!Ge,className:"flex items-center gap-1 text-[10px] font-semibold text-primary hover:text-primary/80 transition-colors disabled:opacity-50",children:[l.jsx(Ha,{className:te("h-3 w-3",A&&"animate-spin")})," Nach Updates suchen"]})]}),(n==null?void 0:n.last_check)&&l.jsxs("div",{className:"text-[9px] text-muted-foreground -mt-1",children:["Zuletzt gesucht: ",I(n.last_check)]}),Ge&&l.jsxs("div",{className:"flex items-center gap-2 rounded-lg border border-amber-500/30 bg-amber-500/10 px-3 py-2 text-[11px] text-amber-300",children:[l.jsx(Ha,{className:"h-3.5 w-3.5 shrink-0 animate-spin"}),l.jsxs("span",{children:["Update läuft: ",l.jsx("span",{className:"font-semibold",children:Ge.label})," — bitte warten. Weitere Updates sind solange gesperrt."]})]}),l.jsxs("div",{className:"space-y-1.5",children:[l.jsx(au,{icon:Gs,iconClass:"text-cyan-400",name:"OS-Pakete (apt)",available:!!(n!=null&&n.os),status:n!=null&&n.os?`${n.os} verfügbar`:"aktuell",actionLabel:"Anzeigen",onAction:()=>Ze("os")}),l.jsx(au,{icon:nh,iconClass:"text-violet-400",name:"Inferenz-Engine (llama.cpp)",available:!!(n!=null&&n.engine),status:n!=null&&n.engine?"Update verfügbar":"aktuell",actionLabel:"Anzeigen",onAction:()=>Ze("engine")}),l.jsx(au,{icon:ON,iconClass:"text-fuchsia-400",name:"Router (llama-swap)",available:!!(n!=null&&n.swap),status:n!=null&&n.swap?"Update verfügbar":"aktuell",actionLabel:"Anzeigen",onAction:()=>Ze("swap")}),(()=>{var Le;const q=(Le=n==null?void 0:n.components)==null?void 0:Le.find(Er=>Er.key==="hermes_agent");return l.jsx(au,{icon:gn,iconClass:"text-amber-400",name:"Hermes-Agent",available:(q==null?void 0:q.update)===!0,busy:me,status:(q==null?void 0:q.update)===!0?`Update: ${q.latest}`:(q==null?void 0:q.reachable)===!1?"offline":"aktuell",actionLabel:"Anzeigen",onAction:()=>Ze("hermes")})})(),(nt=n==null?void 0:n.model_list)==null?void 0:nt.map(q=>l.jsx(au,{icon:q3,iconClass:"text-emerald-400",name:`Modell · ${q.role}`,available:!0,status:q.title,actionLabel:"Upgrade",onAction:()=>yt(q.repo,q.role)},q.role))]})]}),l.jsxs("div",{className:"space-y-2.5",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Dienste"}),l.jsx("div",{className:"space-y-1.5",children:J2.map(q=>{var Le;return l.jsx(GX,{label:q.label,system:q.type==="system",ok:(Le=F==null?void 0:F.services.find(Er=>Er.name.toLowerCase().includes(q.reach)))==null?void 0:Le.ok,busy:k[q.id],onRestart:()=>Se(q.id),onLogs:()=>{f(q.id),E("logs")}},q.id)})})]}),l.jsxs("div",{className:"space-y-2.5",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Backup"}),l.jsxs("div",{className:"rounded-lg border border-border/50 bg-background/20 px-3 py-2.5 flex items-center gap-3",children:[l.jsxs("div",{className:"flex-1 min-w-0",children:[l.jsx("div",{className:"text-xs text-foreground truncate",children:Y[0]?`Letztes: ${Y[0].snapshot}`:"Noch kein Backup"}),l.jsxs("div",{className:"text-[10px] text-muted-foreground",children:[Y.length," Snapshots · Restore per CLI (restore.sh)"]})]}),l.jsxs("button",{onClick:K,disabled:D,className:"flex items-center gap-1.5 text-[11px] font-semibold rounded-lg px-2.5 py-1 bg-primary text-primary-foreground hover:opacity-90 transition-all cursor-pointer disabled:opacity-50 shrink-0",children:[l.jsx(X3,{className:te("h-3.5 w-3.5",D&&"animate-pulse")})," Snapshot"]})]}),M&&l.jsx("div",{className:"text-[10px] font-mono text-primary bg-primary/5 p-2 rounded-lg border border-primary/20 break-all leading-normal",children:M})]}),l.jsxs("div",{className:"space-y-2.5",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-red-400/80",children:"Gefahrenzone"}),l.jsxs("button",{onClick:Xt,className:"flex w-full items-center gap-3 p-3 rounded-lg border border-red-500/20 bg-red-500/5 hover:bg-red-500/10 text-red-400 transition-all text-left text-xs font-semibold",children:[l.jsx(P4,{className:"h-4.5 w-4.5"}),l.jsxs("div",{children:[l.jsx("div",{children:"Host-System neu starten"}),l.jsx("div",{className:"text-[10px] text-red-400/80 font-normal",children:"Startet die ganze Box neu"})]})]})]}),l.jsxs("div",{className:"space-y-3",children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Hintergrund-Aufgaben"}),l.jsxs("span",{className:"text-[10px] font-mono bg-primary/10 text-primary px-1.5 py-0.5 rounded-full",children:[o.filter(q=>q.state==="running"||q.state==="queued").length," Aktiv"]})]}),l.jsx("div",{className:"space-y-3",children:o.length===0?l.jsx("div",{className:"text-xs text-muted-foreground border border-dashed border-border/60 rounded-xl p-6 text-center",children:"Aktuell keine aktiven Hintergrund-Jobs."}):o.map(q=>{const Le=q.state==="running"||q.state==="queued";return l.jsxs("div",{className:te("p-3 rounded-xl border transition-all duration-300",Le?"border-primary/40 bg-primary/5 shadow-md shadow-primary/5":"border-border/40 bg-background/20 opacity-80"),children:[l.jsxs("div",{className:"flex items-start justify-between gap-3",children:[l.jsxs("div",{className:"space-y-1",children:[l.jsxs("div",{className:"text-xs font-semibold flex items-center gap-1.5",children:[Le&&l.jsxs("span",{className:"flex h-2 w-2 relative",children:[l.jsx("span",{className:"animate-ping absolute inline-flex h-full w-full rounded-full bg-primary opacity-75"}),l.jsx("span",{className:"relative inline-flex rounded-full h-2 w-2 bg-primary"})]}),q.label]}),l.jsxs("div",{className:"text-[10px] font-mono text-muted-foreground uppercase flex items-center gap-2",children:[l.jsxs("span",{children:["ID: ",q.id]}),l.jsx("span",{children:"•"}),l.jsx("span",{className:te(q.state==="done"&&"text-emerald-400",q.state==="failed"&&"text-red-400",q.state==="running"&&"text-primary",q.state==="queued"&&"text-amber-400",q.state==="canceled"&&"text-muted-foreground"),children:q.state})]})]}),Le&&l.jsx("button",{onClick:()=>Ce(q.id),className:"text-[10px] font-semibold text-red-400 hover:text-red-300 border border-red-500/20 bg-red-500/5 hover:bg-red-500/10 px-2 py-0.5 rounded transition-colors",children:"Abbrechen"})]}),q.state==="running"&&l.jsxs("div",{className:"mt-3 space-y-1",children:[l.jsx("div",{className:"w-full h-1.5 bg-muted rounded-full overflow-hidden",children:l.jsx("div",{className:"h-full bg-primary transition-all duration-500",style:{width:`${q.progress??0}%`}})}),l.jsxs("div",{className:"flex justify-between items-center text-[9px] font-mono text-muted-foreground",children:[l.jsxs("span",{children:[q.progress??0,"%"]}),q.done_bytes!=null&&q.total_bytes!=null&&l.jsxs("span",{children:[zg(q.done_bytes)," / ",zg(q.total_bytes),q.rate_bps!=null&&` (${zg(q.rate_bps)}/s)`]}),q.eta_s!=null&&l.jsxs("span",{children:["ETA: ",q.eta_s,"s"]})]})]})]},q.id)})})]})]}),N==="logs"&&l.jsxs("div",{className:"flex flex-col h-full space-y-4",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx("select",{value:c,onChange:q=>f(q.target.value),className:"flex-1 h-9 px-3 text-xs bg-background/40 border border-border/60 rounded-lg outline-none text-foreground font-semibold",children:J2.map(q=>l.jsxs("option",{value:q.id,children:[q.label," (",q.type==="system"?"systemd-root":"user",")"]},q.id))}),l.jsxs("button",{onClick:()=>Se(c),disabled:k[c],className:"flex h-9 px-3 items-center gap-1.5 text-xs font-semibold rounded-lg border border-border/60 bg-background/20 hover:border-primary/50 transition-colors disabled:opacity-50",title:"Dienst neu starten",children:[l.jsx(Ha,{className:te("h-3.5 w-3.5",k[c]&&"animate-spin")}),"Restart"]})]}),l.jsxs("div",{className:"flex-1 flex flex-col min-h-[300px] border border-border/60 bg-black/50 rounded-xl overflow-hidden shadow-inner",children:[l.jsxs("div",{className:"flex h-9 items-center justify-between px-4 border-b border-border/40 bg-black/30 shrink-0",children:[l.jsxs("div",{className:"flex items-center gap-1.5 text-[10px] font-mono text-muted-foreground",children:[l.jsx(MN,{className:"h-3 w-3 text-primary"}),l.jsxs("span",{children:["stdout/stderr - ",c]})]}),l.jsx("button",{onClick:()=>pe(c),disabled:g,className:"text-muted-foreground hover:text-foreground transition-colors",children:l.jsx(Ha,{className:te("h-3 w-3",g&&"animate-spin")})})]}),l.jsx("pre",{ref:_,className:"flex-1 p-4 overflow-y-auto text-[10px] font-mono text-cyan-300/90 whitespace-pre-wrap select-text leading-relaxed scrollbar-thin",children:b==="password_required"||b==="incorrect_password"?l.jsxs("div",{className:"flex flex-col items-center justify-center p-6 text-center h-full space-y-3",children:[l.jsx(mi,{className:"h-8 w-8 text-amber-400 animate-pulse animate-duration-1000"}),l.jsx("div",{className:"text-xs font-semibold text-amber-300",children:b==="incorrect_password"?"Falsches Sudo-Passwort hinterlegt.":"Sudo-Passwort für systemd-Dienste erforderlich."}),l.jsxs("p",{className:"text-[10px] text-muted-foreground max-w-xs leading-normal",children:["Für das Auslesen der systemd-Logs von ",c," werden Root-Rechte benötigt. Hinterlege dein Passwort in den Einstellungen."]}),l.jsx("button",{onClick:()=>E("settings"),className:"px-3 py-1.5 text-[10px] font-semibold text-primary-foreground bg-primary hover:bg-primary/95 rounded-md transition-colors mt-2",children:"Sudo-Passwort eintragen"})]}):g&&!h?l.jsx("span",{className:"text-muted-foreground",children:"Lade Logs..."}):h||l.jsx("span",{className:"text-muted-foreground",children:"Keine Logeinträge vorhanden."})})]})]}),N==="settings"&&l.jsx(VX,{open:e,showAlert:re})]})]}),ge&&l.jsx(qX,{detail:ge,maintenanceJob:Ge,onClose:()=>ie(null),onApply:Be}),oe&&l.jsx(FO,{type:oe.type,title:oe.title,message:oe.message,onConfirm:oe.onConfirm,onCancel:oe.onCancel})]})}function QX(){const{data:e}=uh(3e4),{data:t}=xi(),r=((e==null?void 0:e.os)||0)+((e==null?void 0:e.engine)||0)+((e==null?void 0:e.swap)||0)+((e==null?void 0:e.models)||0),n=()=>window.dispatchEvent(new CustomEvent("open-system-drawer",{detail:{tab:"maintenance"}})),a=(t==null?void 0:t.models)??[],o=(t==null?void 0:t.running)??[],u=a.find(m=>m.role==="hermes"),c=a.find(m=>m.role==="coder-lite")||a.find(m=>m.role==="coder"),f=m=>m?o.includes(m):!1,h=m=>{var g;return((g=m==null?void 0:m.split("/").pop())==null?void 0:g.replace(/\.gguf$/i,""))||"—"};return l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Basisstation"}),l.jsx("p",{className:"text-sm text-muted-foreground",children:"Geht's der Box gut, gibt's Updates, was läuft gerade."})]}),l.jsx(KO,{frame:"box"}),l.jsxs("button",{onClick:n,className:te("w-full flex items-center gap-3 rounded-2xl border p-4 text-left transition-all cursor-pointer",r>0?"border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/10":"border-border/60 bg-card/45 hover:border-primary/40"),children:[r>0?l.jsx(J3,{className:"h-6 w-6 shrink-0 text-amber-400"}):l.jsx(or,{className:"h-6 w-6 shrink-0 text-emerald-400"}),l.jsxs("div",{className:"flex-1 min-w-0",children:[l.jsx("div",{className:te("text-sm font-semibold",r>0?"text-amber-400":"text-foreground"),children:r>0?`${r} Update${r===1?"":"s"} verfügbar`:"Alles aktuell"}),l.jsx("div",{className:"text-xs text-muted-foreground",children:r>0?"Antippen, um zu sehen, was genau aktualisiert wird.":"Keine ausstehenden Updates."})]}),r>0&&l.jsxs("span",{className:"shrink-0 flex items-center gap-1 text-xs font-semibold text-amber-400",children:["Ansehen ",l.jsx(th,{className:"h-4 w-4"})]})]}),l.jsxs("div",{children:[l.jsx("div",{className:"text-xs text-muted-foreground mb-2",children:"Was gerade läuft"}),l.jsx("div",{className:"rounded-2xl border border-border/60 overflow-hidden",children:[{icon:$n,label:"Lucys Hirn",model:u==null?void 0:u.name,warm:f(u==null?void 0:u.name)},{icon:_s,label:"Coder (Vibe-Coding)",model:c==null?void 0:c.name,warm:f(c==null?void 0:c.name)}].map(m=>l.jsxs("div",{className:"flex items-center gap-3 px-4 py-3 border-b border-border/40 last:border-0",children:[l.jsx("span",{className:te("h-2 w-2 shrink-0 rounded-full",m.warm?"bg-emerald-500 animate-pulse":"bg-muted-foreground/40")}),l.jsx(m.icon,{className:"h-4 w-4 text-muted-foreground shrink-0"}),l.jsx("span",{className:"text-sm text-foreground w-40 shrink-0",children:m.label}),l.jsx("span",{className:"text-xs text-muted-foreground flex-1 truncate font-mono",children:h(m.model)}),l.jsx("span",{className:te("text-xs shrink-0",m.warm?"text-emerald-400":"text-muted-foreground"),children:m.model?m.warm?"warm":"bereit":"nicht gesetzt"})]},m.label))})]}),l.jsxs("div",{className:"grid gap-6 lg:grid-cols-2",children:[l.jsx(zO,{}),l.jsx(BO,{})]}),l.jsx(UO,{})]})}function Fg({icon:e,title:t,sub:r,onClick:n}){return l.jsxs("button",{onClick:n,className:"w-full flex items-center gap-4 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 text-left transition-all hover:border-primary/40 cursor-pointer",children:[l.jsx(e,{className:"h-6 w-6 text-muted-foreground shrink-0"}),l.jsxs("div",{className:"flex-1 min-w-0",children:[l.jsx("div",{className:"text-sm text-foreground",children:t}),l.jsx("div",{className:"text-xs text-muted-foreground",children:r})]}),l.jsx(th,{className:"h-5 w-5 text-muted-foreground shrink-0"})]})}function YX(){const[e,t]=y.useState(null);return e?l.jsxs("div",{className:"space-y-4",children:[l.jsxs("button",{onClick:()=>t(null),className:"flex items-center gap-1.5 text-xs font-semibold text-muted-foreground hover:text-foreground transition-colors cursor-pointer",children:[l.jsx(SN,{className:"h-4 w-4"})," Maschinenraum"]}),e==="modelle"?l.jsx(GO,{}):l.jsx(QO,{})]}):l.jsxs("div",{className:"space-y-4",children:[l.jsxs("div",{className:"flex items-start justify-between gap-3",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Maschinenraum"}),l.jsx("p",{className:"text-sm text-muted-foreground",children:"Nur nötig, wenn du wirklich was ändern willst."})]}),l.jsx(wE,{})]}),l.jsx(Fg,{icon:$n,title:"Modelle",sub:"Hirne, Coder, Immer-bereit-Set, Bibliothek",onClick:()=>t("modelle")}),l.jsx(Fg,{icon:R4,title:"Wartung und Logs",sub:"Updates, Backup, Dienste, Logs, Zugangsdaten",onClick:()=>window.dispatchEvent(new CustomEvent("open-system-drawer",{detail:{tab:"maintenance"}}))}),l.jsx(Fg,{icon:gn,title:"Hermes und Verdrahtung",sub:"Agent, Gehirn-Modell, PC-Verbindung",onClick:()=>t("hermes")})]})}const XX=[{id:"start",label:"Start",icon:eh},{id:"vibe",label:"Vibe-Coding",icon:_s},{id:"konstitution",label:"Konstitution",icon:V3},{id:"maschinenraum",label:"Maschinenraum",icon:Uu}];function ZX(){const[e,t]=y.useState("start"),[r,n]=y.useState(!1),[a,o]=y.useState("maintenance"),{data:u}=jy();y.useEffect(()=>{const f=h=>{var m;o(((m=h.detail)==null?void 0:m.tab)||"maintenance"),n(!0)};return window.addEventListener("open-system-drawer",f),()=>window.removeEventListener("open-system-drawer",f)},[]);const c=u&&u.engine_reachable&&(u.brain?u.brain.ready:!0);return l.jsxs("div",{className:"flex h-full relative",children:[l.jsx("div",{className:"fixed inset-0 -z-50 pointer-events-none overflow-hidden bg-[hsl(224,30%,6%)]",children:l.jsx("div",{className:"absolute inset-0 opacity-30 animate-aurora bg-gradient-to-tr from-teal-500/15 via-indigo-500/10 to-purple-500/15 blur-[130px]"})}),l.jsx(YO,{open:r,onClose:()=>n(!1),defaultTab:a}),l.jsxs("aside",{className:"flex w-56 shrink-0 flex-col border-r border-border/40 bg-card/45 backdrop-blur-md",children:[l.jsxs("div",{className:"flex items-center gap-2 px-5 py-4 border-b border-border/40",children:[l.jsx("div",{className:"h-7 w-7 rounded-lg bg-primary shadow-md shadow-primary/20"}),l.jsxs("div",{className:"leading-tight",children:[l.jsx("div",{className:"text-sm font-semibold tracking-wide font-space",children:"Mission Control"}),l.jsx("div",{className:"text-[10px] text-muted-foreground",children:"3 · Prototyp"})]})]}),l.jsx("nav",{className:"flex-1 space-y-1 px-3 py-4",children:XX.map(f=>l.jsxs("button",{onClick:()=>t(f.id),className:te("flex w-full items-center gap-3 rounded-md px-3 py-2 text-sm transition-all cursor-pointer",e===f.id?"bg-primary/15 text-primary":"text-muted-foreground hover:bg-accent hover:text-accent-foreground"),children:[l.jsx(f.icon,{className:"h-4.5 w-4.5 shrink-0"})," ",f.label]},f.id))}),l.jsxs("div",{className:"px-3 py-3 border-t border-border/40 space-y-2",children:[l.jsxs("div",{className:"flex items-center gap-2 px-2 text-xs text-muted-foreground",children:[l.jsx("span",{className:te("h-2 w-2 rounded-full",c?"bg-emerald-500 animate-pulse":"bg-amber-500")}),c?"Box läuft":"prüfen"]}),l.jsxs("a",{href:"#dashboard",className:"flex items-center gap-1.5 rounded-md px-2 py-1.5 text-[11px] text-muted-foreground hover:text-foreground transition-colors",children:[l.jsx(SN,{className:"h-3.5 w-3.5"})," zurück zu MC2"]})]})]}),l.jsxs("main",{className:"flex-1 min-w-0 overflow-y-auto p-6 scrollbar-thin",children:[e==="start"&&l.jsx(QX,{}),e==="vibe"&&l.jsx(VO,{}),e==="konstitution"&&l.jsx(qO,{}),e==="maschinenraum"&&l.jsx(YX,{})]})]})}function JX(){var j,k,S,N,E;WD();const[e,t]=y.useState(()=>{const A=window.location.hash.slice(1);return su.some(P=>P.id===A)?A:"dashboard"}),r=y.useCallback(A=>{window.location.hash.slice(1)===A?t(A):window.location.hash=A},[]),[n,a]=y.useState(()=>localStorage.getItem("mc_sidebar_collapsed")==="true"),[o,u]=y.useState(!1),[c,f]=y.useState("maintenance"),[h,m]=y.useState(()=>window.location.hash==="#mc3"),{data:g}=jy(),{data:v}=bo(2e4);y.useEffect(()=>{document.documentElement.classList.add("dark")},[]),y.useEffect(()=>{const A=P=>{var O;f(((O=P.detail)==null?void 0:O.tab)||"maintenance"),u(!0)};return window.addEventListener("open-system-drawer",A),()=>window.removeEventListener("open-system-drawer",A)},[]),y.useEffect(()=>{const A=P=>{var O;const M=(O=P.detail)==null?void 0:O.view;M&&r(M)};return window.addEventListener("mc-navigate",A),()=>window.removeEventListener("mc-navigate",A)},[r]),y.useEffect(()=>{const A=()=>{m(window.location.hash==="#mc3");const P=window.location.hash.slice(1);su.some(M=>M.id===P)&&t(P)};return window.addEventListener("hashchange",A),()=>window.removeEventListener("hashchange",A)},[]);const b=su.find(A=>A.id===e);return h?l.jsx(ZX,{}):l.jsxs("div",{className:"flex h-full relative",children:[l.jsxs("div",{className:"fixed inset-0 -z-50 pointer-events-none overflow-hidden bg-[hsl(224,30%,6%)]",children:[l.jsx("div",{className:"absolute inset-0 opacity-35 animate-aurora bg-gradient-to-tr from-teal-500/20 via-indigo-500/15 to-purple-500/20 blur-[130px]"}),l.jsx("div",{className:"absolute top-[-10%] left-[-10%] h-[50%] w-[50%] rounded-full bg-teal-500/15 blur-[160px]"}),l.jsx("div",{className:"absolute bottom-[-10%] right-[-10%] h-[50%] w-[50%] rounded-full bg-purple-500/15 blur-[160px]"}),l.jsx("div",{className:"absolute top-[30%] right-[20%] h-[40%] w-[40%] rounded-full bg-indigo-500/10 blur-[140px]"})]}),l.jsx(YT,{onNavigate:r}),l.jsx(YO,{open:o,onClose:()=>u(!1),defaultTab:c}),l.jsxs("aside",{className:te("flex shrink-0 flex-col border-r border-border/40 bg-card/45 backdrop-blur-md transition-all duration-300 ease-in-out",n?"w-16":"w-60"),children:[l.jsxs("div",{className:te("flex items-center py-4 border-b border-border/40 shrink-0",n?"flex-col gap-3 px-2":"justify-between px-5"),children:[l.jsxs("div",{className:"flex items-center gap-2 overflow-hidden",children:[l.jsx("div",{className:"h-7 w-7 rounded-lg bg-primary shadow-md shadow-primary/20 shrink-0"}),!n&&l.jsxs("div",{className:"leading-tight",children:[l.jsx("div",{className:"text-sm font-semibold tracking-wide font-space",children:"Mission Control"}),l.jsx("div",{className:"text-xs text-muted-foreground",children:"2.0"})]})]}),l.jsx("button",{onClick:()=>{a(A=>{const P=!A;return localStorage.setItem("mc_sidebar_collapsed",P.toString()),P})},className:"p-1 rounded-md hover:bg-accent text-muted-foreground transition-colors cursor-pointer","aria-label":n?"Seitenleiste ausklappen":"Seitenleiste einklappen",title:n?"Maximieren":"Minimieren",children:n?l.jsx(th,{className:"h-4 w-4","aria-hidden":"true"}):l.jsx(Z3,{className:"h-4 w-4","aria-hidden":"true"})})]}),l.jsx("nav",{className:"flex-1 space-y-1 px-3 py-4 overflow-y-auto",children:su.map(A=>l.jsxs("a",{href:`#${A.id}`,"aria-current":e===A.id?"page":void 0,className:te("flex w-full items-center rounded-md text-sm transition-all cursor-pointer",n?"justify-center p-2.5":"gap-3 px-3 py-2",e===A.id?"bg-primary/15 text-primary shadow-sm shadow-primary/5":"text-muted-foreground hover:bg-accent hover:text-accent-foreground"),title:n?A.label:void 0,"aria-label":n?A.label:void 0,children:[l.jsx(A.icon,{className:"h-4.5 w-4.5 shrink-0","aria-hidden":"true"}),!n&&l.jsx("span",{className:"truncate",children:A.label})]},A.id))}),l.jsx("div",{className:te("py-3 text-xs text-muted-foreground border-t border-border/40 shrink-0",n?"px-2 text-center":"px-5"),children:n?l.jsx("div",{className:"flex justify-center",children:l.jsx("span",{className:te("h-2.5 w-2.5 rounded-full ring-2 ring-black/40",g?g.engine_reachable?g.brain&&!g.brain.ready?"bg-amber-500 animate-pulse":"bg-emerald-500 animate-pulse":"bg-amber-500":"bg-red-500"),title:g?g.engine_reachable?g.brain&&!g.brain.ready?`Hirn offline (${g.brain.model??"fast"})`:"Engine + Hirn online":"Engine offline":"Backend offline"})}):l.jsxs("div",{className:"space-y-2 text-left",children:[g?l.jsxs(l.Fragment,{children:[l.jsxs("span",{className:"flex items-center gap-2",children:[l.jsx("span",{className:te("h-2 w-2 rounded-full animate-pulse",g.engine_reachable?"bg-emerald-500":"bg-amber-500")}),l.jsxs("span",{className:"truncate",children:["Engine ",g.engine_reachable?"online":"offline"]})]}),g.brain&&!g.brain.ready&&l.jsxs("span",{className:"flex items-center gap-2 text-amber-400",title:`Agent-Hirn '${g.brain.model??"fast"}' lädt nicht/abgestürzt`,children:[l.jsx("span",{className:"h-2 w-2 rounded-full bg-amber-500 animate-pulse"}),l.jsxs("span",{className:"truncate",children:["Hirn offline",g.brain.model?` (${g.brain.model})`:""]})]})]}):l.jsxs("span",{className:"flex items-center gap-2",children:[l.jsx("span",{className:"h-2 w-2 rounded-full bg-red-500"})," ",l.jsx("span",{className:"truncate",children:"Backend offline"})]}),(v==null?void 0:v.versions)&&l.jsxs("div",{className:"space-y-1 text-[9px] text-muted-foreground/60 mt-2 pt-2 border-t border-border/30",children:[l.jsxs("div",{className:"truncate",title:v.versions.mc2?`${v.versions.mc2.branch}-${v.versions.mc2.hash}${v.versions.mc2.dirty?"*":""} (${v.versions.mc2.date})`:"nicht gefunden",children:[l.jsx("strong",{children:"MC2:"})," ",v.versions.mc2?`${v.versions.mc2.hash}${v.versions.mc2.dirty?"*":""}`:"—"]}),l.jsxs("div",{className:"truncate",title:((j=v.versions.engine)==null?void 0:j.type)==="git"?`${v.versions.engine.branch}-${v.versions.engine.hash}${v.versions.engine.dirty?"*":""} (${v.versions.engine.date})`:((k=v.versions.engine)==null?void 0:k.version_text)||"unbekannt",children:[l.jsx("strong",{children:"Engine:"})," ",((S=v.versions.engine)==null?void 0:S.type)==="git"?`${v.versions.engine.hash}${v.versions.engine.dirty?"*":""}`:((E=(N=v.versions.engine)==null?void 0:N.version_text)==null?void 0:E.split(" ").pop())||"—"]}),l.jsxs("div",{className:"truncate",title:v.versions.hermes_ui?`${v.versions.hermes_ui.branch}-${v.versions.hermes_ui.hash}${v.versions.hermes_ui.dirty?"*":""} (${v.versions.hermes_ui.date})`:"nicht gefunden",children:[l.jsx("strong",{children:"Hermes UI:"})," ",v.versions.hermes_ui?`${v.versions.hermes_ui.hash}${v.versions.hermes_ui.dirty?"*":""}`:"—"]}),l.jsxs("div",{className:"truncate",title:v.versions.hermes_agent?`${v.versions.hermes_agent.branch}-${v.versions.hermes_agent.hash}${v.versions.hermes_agent.dirty?"*":""} (${v.versions.hermes_agent.date})`:"nicht gefunden",children:[l.jsx("strong",{children:"Hermes Agent:"})," ",v.versions.hermes_agent?`${v.versions.hermes_agent.hash}${v.versions.hermes_agent.dirty?"*":""}`:"—"]})]})]})})]}),l.jsxs("div",{className:"flex min-w-0 flex-1 flex-col",children:[l.jsxs("header",{className:"flex h-14 shrink-0 items-center justify-between border-b border-border/40 px-6 bg-card/20 backdrop-blur-sm",children:[l.jsx("div",{className:"text-xs font-medium text-muted-foreground tracking-wide uppercase font-sans",children:b.hint}),l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(wE,{}),l.jsx("a",{href:"https://git.tobisniceshomelab.ddnsfree.com/Hitonabi/mission-control-v2/src/branch/main/docs/BEDIENUNG.md",target:"_blank",rel:"noopener",className:"flex h-8 items-center rounded-md border border-border/40 bg-background/40 px-2.5 text-xs text-muted-foreground hover:bg-accent hover:text-accent-foreground transition-all cursor-pointer font-semibold",title:"Bedien-Anleitung",children:"Hilfe"}),l.jsxs("button",{onClick:()=>{const A=new KeyboardEvent("keydown",{key:"k",metaKey:!0});document.dispatchEvent(A)},className:"flex items-center gap-2 rounded-md border border-border/40 bg-background/40 px-2.5 py-1.5 text-xs text-muted-foreground hover:bg-accent hover:text-accent-foreground transition-all cursor-pointer",children:[l.jsx(a4,{className:"h-3.5 w-3.5"}),l.jsx("span",{children:"Suchen"}),l.jsx("kbd",{className:"rounded bg-muted px-1.5 py-0.5 font-mono text-[9px]",children:"⌘K"})]})]})]}),l.jsxs("main",{className:"flex-1 overflow-y-auto p-6 scrollbar-thin",children:[e==="dashboard"&&l.jsx(yX,{}),e==="models"&&l.jsx(IX,{}),e==="connect"&&l.jsx(VO,{}),e==="memory"&&l.jsx(qO,{}),e==="agent"&&l.jsx(QO,{}),e==="terminal"&&l.jsx(UX,{}),e==="guide"&&l.jsx(WX,{}),!["dashboard","models","connect","memory","agent","terminal","guide"].includes(e)&&l.jsx(KX,{title:b.label,hint:b.hint})]})]})]})}class eZ extends fy.Component{constructor(){super(...arguments);Qo(this,"state",{error:null})}static getDerivedStateFromError(r){return{error:r}}componentDidCatch(r,n){console.error("Unbehandelter UI-Fehler:",r,n.componentStack)}render(){return this.state.error?l.jsx("div",{className:"min-h-screen flex items-center justify-center bg-neutral-950 text-neutral-200 p-8",children:l.jsxs("div",{className:"max-w-lg space-y-4 text-center",children:[l.jsx("div",{className:"text-2xl",children:"Da ist etwas schiefgelaufen."}),l.jsx("div",{className:"text-sm text-neutral-400 break-all",children:this.state.error.message}),l.jsx("button",{className:"px-4 py-2 rounded-lg bg-neutral-800 hover:bg-neutral-700 border border-neutral-700",onClick:()=>window.location.reload(),children:"Neu laden"})]})}):this.props.children}}const tZ=new O3({defaultOptions:{queries:{retry:1,refetchOnWindowFocus:!1,staleTime:5e3}}});i3.createRoot(document.getElementById("root")).render(l.jsx(fy.StrictMode,{children:l.jsx(eZ,{children:l.jsx(_3,{client:tZ,children:l.jsx(JX,{})})})}));export{Ha as R,cs as S,iv as T,T4 as a,dy as g,l as j,y as r}; +...`}),l.jsxs("p",{children:["Suchen & installieren über die ",l.jsx("strong",{children:"skills.sh"}),"-Registry: ",l.jsx(ze,{children:"npx skills find"})," /",l.jsx(ze,{children:"npx skills add owner/repo"}),". Skills liegen projektweit (vom Agent beim Start gelesen) oder global."]})]}),l.jsxs(_r,{id:"memory",icon:s4,color:"text-indigo-400",title:"8. Gedächtnis & RAG",kicker:"Modelle vergessen — du nicht",wide:!0,children:[l.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:["LLMs sind ",l.jsx("strong",{children:"zustandslos"}),": ohne Hilfe weiß das Modell beim nächsten Turn nichts mehr. Gedächtnis lebt extern."]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Embeddings"})," wandeln Text in Vektoren; ein ",l.jsx("strong",{children:"Vektor-Store"})," (Chroma, …) findet semantisch Ähnliches."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"RAG"})," = relevante Fakten vor dem Turn heraussuchen und einblenden statt alles im Prompt zu halten."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Long-Context vs. RAG:"}),' riesige Fenster sind bequem, aber teuer & „lost in the middle" — gezieltes Abrufen skaliert besser.']})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:[l.jsx("strong",{children:"Auto-lernendes Gedächtnis"})," ist die nächste Stufe:"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:["extrahiert Fakten ",l.jsx("em",{children:"selbst"})," aus Gesprächen, statt nur abzuspeichern"]}),l.jsx("li",{children:"dedupliziert semantisch (kein 10× derselbe Fakt)"}),l.jsxs("li",{children:[l.jsx("strong",{children:"Graph-Sicht"})," = Fakten ",l.jsx("em",{children:"plus"})," ihre Beziehungen, nicht nur eine flache Liste"]})]})]})]}),l.jsxs($a,{children:["Dein Gedächtnis (Tab ",l.jsx("strong",{children:"Gedächtnis"}),") ist ",l.jsx("strong",{children:"Mem0"}),"-basiert: auto-lernend & semantisch, ",l.jsx("strong",{children:"graph-first"})," dargestellt, mit 4-Typen-Taxonomie (",l.jsx(ze,{children:"Identität"})," · ",l.jsx(ze,{children:"Wissen"})," · ",l.jsx(ze,{children:"Regeln"})," · ",l.jsx(ze,{children:"Ereignisse"}),"). Einstieg über ein kurzes ",l.jsx("strong",{children:"Hermes-Onboarding-Gespräch"})," im Terminal — der Agent lernt im Hintergrund nach jedem Turn.",l.jsx("br",{}),l.jsx("strong",{children:"Gotcha:"})," ein gelöschter Fakt kann wieder auftauchen, solange die Original-Nachricht noch im Verlauf steht (additive Extraktion)."]})]}),l.jsxs(_r,{id:"agents",icon:gn,color:"text-rose-400",title:"9. Autonome Agenten betreiben",kicker:"LLM in der Schleife",wide:!0,children:[l.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:["Ein ",l.jsx("strong",{children:"Agent"})," ist ein LLM in einer Schleife mit Tools:",l.jsx("em",{children:" denken → Tool aufrufen → Ergebnis beobachten → weiter"}),", bis das Ziel erreicht ist."]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Guardrails"})," (Hard-Stop, Tool-Limits) verhindern Endlos-Loops, wenn ein Tool fehlt oder hängt."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Kontext-Hygiene"})," ist die wichtigste Disziplin: frische Sessions starten — vollgemüllte Historien werden langsam, driften und halluzinieren."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Kanäle:"})," CLI/Terminal, Chat-UI, Messaging (z.B. Telegram), reine API."]})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{children:[l.jsx("strong",{children:"Least Privilege:"})," gib einem Agenten nur die Tools, die er wirklich braucht. Kritische Aktionen (Shell auf dem Host, Löschen, Geld/Deploys) hinter menschliche Freigabe."]}),l.jsxs("p",{children:[l.jsx("strong",{children:"Was sich vollautomatisch lohnt:"})," Modell-Routing, Hintergrund-Gedächtnis, Recherche. ",l.jsx("strong",{children:"Was Freigabe braucht:"})," Systembefehle, Updates/Reboots, permanentes Löschen."]})]})]}),l.jsxs($a,{children:[l.jsx("strong",{children:"Hermes"})," ist dein Box-Agent (Hirn = ",l.jsx(ze,{children:"fast"}),"). Reden tust du mit ihm im",l.jsx("strong",{children:" Terminal"}),"-Tab (Web-Terminal via ttyd) oder per ",l.jsx("strong",{children:"Telegram"}),". Er hat MCP-Server für Gedächtnis, Stack-Steuerung, Web-Fetch und ",l.jsx("strong",{children:"PC-Steuerung"})," (Executor auf deinem Windows-PC). Status & Verdrahtung im ",l.jsx("strong",{children:"Hermes"}),"-Tab."]})]}),l.jsxs(_r,{id:"ide",icon:_s,color:"text-cyan-400",title:"10. IDE / Editor anbinden",kicker:"Vibe-Coding lokal",children:[l.jsxs("p",{children:["Jede ",l.jsx("strong",{children:"OpenAI-kompatible"})," IDE oder Extension lässt sich auf einen lokalen Server umbiegen — Base-URL + Model eintragen, fertig:"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Cline"})," & ",l.jsx("strong",{children:"Roo Code"})," (VS-Code-Extensions, voller Agent + MCP)"]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Cursor"})," (VS-Code-Fork mit Top-Autocomplete)"]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Continue"}),", ",l.jsx("strong",{children:"aider"})," (CLI), ",l.jsx("strong",{children:"OpenCode"})," (Desktop)"]})]}),l.jsxs($a,{children:["Tipp den Kram nicht ab: der ",l.jsx("strong",{children:"Verbinden"}),"-Tab generiert die fertige Config (inkl. MCP-Gedächtnis) pro Tool zum Kopieren. Essenz: Base ",l.jsx(ze,{children:"…:9001/v1"}),", Model ",l.jsx(ze,{children:"auto"}),", Key beliebig."]})]}),l.jsx(_r,{id:"tricks",icon:x4,color:"text-amber-400",title:"11. Tricks & Kniffe",kicker:"Was im Alltag wirklich spart",wide:!0,children:l.jsx("div",{className:"grid md:grid-cols-3 gap-3",children:[["Kontext sauber halten","Neue Session statt Mega-Historie. Drift, Tempo und Halluzination hängen direkt am Kontext-Müll."],["Plan-then-Act","Erst Plan/Vorgehen bestätigen lassen, dann ausführen. Spart teure Holzwege."],["Gezielte Edits","Nie ganze Dateien überschreiben für eine Zeile — Such-/Ersetz-Tools nutzen. Weniger Tokens, weniger Fehler."],["Non-interaktive Befehle","Keine interaktiven Prompts im Agent-Terminal; lange Tasks als Background-Job. Sonst hängt der Loop."],["DevTools koppeln","Browser-/Konsolen-Zugriff geben — der Agent liest echte Fehler statt blind zu raten."],["Richtige Modellwahl","Schnelles Hirn für Alltag, großes für harte Logik, Coder fürs Coden. Nicht alles mit der Kanone."],["Akzeptanzkriterien","Sag konkret, woran „fertig“ erkennbar ist. Vage Prompts → vage Ergebnisse."],["Verifizieren statt vertrauen","Tests/Live-Check fordern. „Sollte funktionieren“ ist kein Beweis."],["Regeln ins Gedächtnis","Wiederkehrende Vorlieben/Konventionen einmal ablegen — der Agent zieht sie selbst."]].map(([r,n])=>l.jsxs("div",{className:"space-y-1 p-3 bg-background/10 rounded-xl border border-border/30",children:[l.jsxs("div",{className:"flex items-center gap-1.5 font-bold text-foreground text-[11px]",children:[l.jsx(ma,{className:"h-3 w-3 text-amber-400"})," ",r]}),l.jsx("p",{className:"text-[11px]",children:n})]},r))})}),l.jsx(_r,{id:"wartung",icon:Gs,color:"text-emerald-400",title:"12. Sicherheit & Wartung",kicker:"Damit's auch morgen noch läuft",wide:!0,children:l.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{className:"flex items-center gap-1.5 font-bold text-foreground",children:[l.jsx(CN,{className:"h-3.5 w-3.5 text-emerald-400"})," Goldene Regeln"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Ein ungetesteter Restore ist kein Backup."})," Wiederherstellung mindestens einmal echt durchspielen."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Updates können Dinge still zerschießen"})," — gerade bei AI-Stacks (Embeddings, Provider-Interna). Versionen pinnen, Smoke-Test, Post-Check."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Least Privilege"})," für Agenten, MCP-Server und PC-Zugriff. Kritisches hinter Freigabe."]})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{className:"flex items-center gap-1.5 font-bold text-foreground",children:[l.jsx(Uu,{className:"h-3.5 w-3.5 text-emerald-400"})," Bei dir im SystemDrawer"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Backup:"})," tägliches Voll-Zustands-Backup, getesteter ",l.jsx(ze,{children:"restore.sh"})," (Doku in ",l.jsx(ze,{children:"docs/BACKUP.md"}),")."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Updates:"})," git-basierter Update-Check; ",l.jsx("strong",{children:"Hermes-Update-Button"})," mit anschließendem ",l.jsx("strong",{children:"Gehirn-Check"})," (rot, falls das Update das Gedächtnis zerschießt) + Engine-Update."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Dienste & Gefahrenzone:"})," Restart/Logs pro Dienst, kritische Eingriffe getrennt."]})]}),l.jsx("p",{className:"text-[10px] italic",children:'Erreichbar über das System-Icon → Tab „Wartung".'})]})]})}),l.jsxs("section",{id:"ressourcen",className:"scroll-mt-20 md:col-span-2 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-6 shadow-lg shadow-black/10 space-y-4",children:[l.jsxs("div",{className:"flex items-center gap-2.5 border-b border-border/20 pb-3",children:[l.jsx(rv,{className:"h-5 w-5 text-primary"}),l.jsxs("div",{children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"13. Kuratierte Ressourcen & Links"}),l.jsx("span",{className:"text-[9px] font-mono text-primary",children:"Sauber geordnet — die guten Quellen"})]})]}),l.jsxs("div",{className:"grid md:grid-cols-2 gap-5 text-xs",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"font-bold text-foreground flex items-center gap-1.5",children:[l.jsx(Jd,{className:"h-3.5 w-3.5 text-sky-400"})," Modelle & Engines"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1.5",children:[l.jsx(wt,{href:"https://huggingface.co/models",name:"Hugging Face",note:"das Repository für offene Modelle (GGUF, Embeddings, Datasets)."}),l.jsx(wt,{href:"https://github.com/ggml-org/llama.cpp",name:"llama.cpp",note:"die Referenz-Engine für lokale Inferenz."}),l.jsx(wt,{href:"https://github.com/mostlygeek/llama-swap",name:"llama-swap",note:"mehrere Modelle hinter einem Port, Auto-Swap."}),l.jsx(wt,{href:"https://ollama.com",name:"Ollama",note:"einfachster Einstieg, One-Command-Modelle."}),l.jsx(wt,{href:"https://lmstudio.ai",name:"LM Studio",note:"lokale GUI zum Stöbern, Laden & Chatten."}),l.jsx(wt,{href:"https://github.com/vllm-project/vllm",name:"vLLM",note:"Hochdurchsatz-Serving auf dicken GPUs."})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"font-bold text-foreground flex items-center gap-1.5",children:[l.jsx(tf,{className:"h-3.5 w-3.5 text-violet-400"})," MCP & Skills"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1.5",children:[l.jsx(wt,{href:"https://modelcontextprotocol.io",name:"MCP — offizielle Doku",note:"Spezifikation & Einstieg."}),l.jsx(wt,{href:"https://github.com/modelcontextprotocol/servers",name:"Offizielle MCP-Server",note:"filesystem, git, postgres, fetch & mehr."}),l.jsx(wt,{href:"https://smithery.ai",name:"Smithery",note:"Registry zum Suchen & Auto-Installieren von MCP-Servern."}),l.jsx(wt,{href:"https://glama.ai/mcp/servers",name:"Glama MCP Registry",note:"kuratierte Community-Datenbank."}),l.jsx(wt,{href:"https://skills.sh",name:"skills.sh",note:"Registry & CLI für Agent-Skills."})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"font-bold text-foreground flex items-center gap-1.5",children:[l.jsx(gn,{className:"h-3.5 w-3.5 text-rose-400"})," Agenten & Frameworks"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1.5",children:[l.jsx(wt,{href:"https://github.com/NousResearch/hermes-agent",name:"Hermes Agent (Nous)",note:"der Agent, der auf deiner Box läuft."}),l.jsx(wt,{href:"https://docs.claude.com",name:"Anthropic / Claude Docs",note:"API, Tool-Use, Agent SDK, MCP."}),l.jsx(wt,{href:"https://github.com/cline/cline",name:"Cline",note:"autonomer Coding-Agent für VS Code."}),l.jsx(wt,{href:"https://aider.chat",name:"aider",note:"AI-Pair-Programming im Terminal, git-nativ."}),l.jsx(wt,{href:"https://continue.dev",name:"Continue",note:"Open-Source-Autopilot für IDEs."})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"font-bold text-foreground flex items-center gap-1.5",children:[l.jsx(tv,{className:"h-3.5 w-3.5 text-amber-400"})," Lernen & Community"]}),l.jsxs("ul",{className:"list-disc pl-4 space-y-1.5",children:[l.jsx(wt,{href:"https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/overview",name:"Prompt-Engineering (Anthropic)",note:"die beste praktische Anleitung."}),l.jsx(wt,{href:"https://github.com/anthropics/anthropic-cookbook",name:"Anthropic Cookbook",note:"lauffähige Rezepte für Tools, RAG, Agenten."}),l.jsx(wt,{href:"https://www.promptingguide.ai",name:"Prompt Engineering Guide",note:"herstellerneutrales Nachschlagewerk."}),l.jsx(wt,{href:"https://github.com/mem0ai/mem0",name:"Mem0",note:"die auto-lernende Memory-Schicht hinter deinem Gedächtnis."}),l.jsx(wt,{href:"https://www.reddit.com/r/LocalLLaMA/",name:"r/LocalLLaMA",note:"der Puls der lokalen-LLM-Szene."})]})]})]})]}),l.jsx(_r,{id:"troubleshooting",icon:y4,color:"text-rose-400",title:"14. Troubleshooting",kicker:"Wenn's hakt",wide:!0,children:l.jsxs("ul",{className:"space-y-2 list-disc pl-4",children:[l.jsxs("li",{children:[l.jsx("strong",{children:"Keine Verbindung?"})," Selbes LAN wie die Box? IP/Port stimmen (",l.jsx(ze,{children:":9001"}),")? Backend-Status in der ",l.jsx("strong",{children:"Zentrale"})," prüfen."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Modell antwortet nicht / langsam?"})," In der ",l.jsx("strong",{children:"Zentrale → Dienste"})," schauen, ob ",l.jsx(ze,{children:"llama-swap"})," grün ist; sonst Restart. Erstes Token nach Swap dauert (Modell lädt)."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Agent dreht durch / halluziniert?"})," Frische Session im ",l.jsx("strong",{children:"Terminal"})," starten — meist ist es vollgemüllter Kontext."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Gedächtnis findet nichts?"})," Embedding-Dienst online? Semantisch suchen (Sinn statt exaktem Wort). Leeres Gedächtnis → Hermes-Onboarding starten."]}),l.jsxs("li",{children:[l.jsx("strong",{children:"Update hat etwas zerschossen?"})," Genau dafür gibt es Backup & ",l.jsx(ze,{children:"restore.sh"})," — den getesteten Restore fahren, dann Ursache suchen."]})]})})]}),l.jsx("p",{className:"text-center text-[10px] text-muted-foreground/50 pt-2",children:"Mission Control 2 · AI-Bibel · Stand Juni 2026 — lebendes Dokument, wächst mit dem Stack."})]})}function KX({title:e,hint:t}){return l.jsxs("div",{className:"space-y-4",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-xl font-semibold",children:e}),l.jsx("p",{className:"text-sm text-muted-foreground",children:t})]}),l.jsxs("div",{className:"flex flex-col items-center justify-center gap-3 rounded-xl border border-dashed border-border bg-card/50 py-20 text-center",children:[l.jsx(o4,{className:"h-8 w-8 text-muted-foreground"}),l.jsx("div",{className:"text-sm text-muted-foreground",children:"Kommt in einer späteren Phase."})]})]})}const J2=[{id:"mission-control-2",label:"Mission Control",type:"user",reach:"gateway (integr"},{id:"hermes-gateway",label:"Hermes Gateway",type:"user",reach:"hermes-gateway"},{id:"mem0-service",label:"Mem0 (Gedächtnis)",type:"user",reach:"mem0"},{id:"hermes-terminal",label:"Hermes Terminal",type:"user",reach:"hermes-terminal"},{id:"llama-swap",label:"Llama Swap",type:"system",reach:"llama-swap"}];function au({icon:e,iconClass:t,name:r,status:n,available:a,busy:o,actionLabel:u,onAction:c}){return l.jsxs("div",{className:te("flex items-center gap-3 rounded-lg border px-3 py-2",a?"border-amber-500/30 bg-amber-500/5":"border-border/50 bg-background/20"),children:[l.jsx(e,{className:te("h-4 w-4 shrink-0",t)}),l.jsxs("div",{className:"flex-1 min-w-0",children:[l.jsx("div",{className:"text-xs text-foreground truncate",children:r}),l.jsx("div",{className:te("text-[10px] truncate",a?"text-amber-400/90":"text-muted-foreground"),children:n})]}),l.jsx("button",{onClick:c,disabled:!a||o,className:te("text-[11px] font-semibold rounded-lg px-2.5 py-1 transition-colors shrink-0",a?"bg-primary text-primary-foreground hover:opacity-90 cursor-pointer":"border border-border/50 text-muted-foreground/40 cursor-default"),children:o?"…":u})]})}function GX({label:e,ok:t,system:r,busy:n,onRestart:a,onLogs:o}){return l.jsxs("div",{className:"flex items-center gap-2.5 rounded-lg border border-border/50 bg-background/20 px-3 py-2",children:[l.jsx("span",{className:te("w-1.5 h-1.5 rounded-full shrink-0",t===!0?"bg-emerald-500":t===!1?"bg-red-500":"bg-muted-foreground/40")}),l.jsxs("span",{className:"flex-1 text-xs text-foreground truncate",children:[e,r&&l.jsx("span",{className:"text-[9px] text-muted-foreground",children:" (root)"})]}),l.jsx("button",{onClick:a,disabled:n,title:"Neu starten",className:"text-muted-foreground hover:text-primary transition-colors disabled:opacity-50",children:l.jsx(Ha,{className:te("h-3.5 w-3.5",n&&"animate-spin")})}),l.jsx("button",{onClick:o,title:"Logs ansehen",className:"text-muted-foreground hover:text-primary transition-colors",children:l.jsx(l4,{className:"h-3.5 w-3.5"})})]})}function zg(e){return e==null?"":e>1024**3?`${(e/1024**3).toFixed(2)} GB`:`${(e/1024**2).toFixed(1)} MB`}function VX({open:e,showAlert:t}){const[r,n]=y.useState(""),[a,o]=y.useState(""),[u,c]=y.useState(!1),[f,h]=y.useState(!1);return y.useEffect(()=>{e&&(n(localStorage.getItem("mc_sudo_password")||""),o(localStorage.getItem("mc_hf_token")||""))},[e]),l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Zugangsdaten & Schlüssel"}),l.jsx("p",{className:"text-[10px] text-muted-foreground leading-normal",children:"Diese Daten werden ausschließlich lokal in deinem Browser (localStorage) gespeichert und bei Bedarf an das Backend übertragen."})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("label",{className:"text-xs font-semibold flex items-center gap-1.5",children:[l.jsx(Gs,{className:"h-4 w-4 text-amber-400"}),"Host Sudo-Passwort"]}),l.jsxs("div",{className:"relative",children:[l.jsx("input",{type:u?"text":"password",value:r,onChange:m=>n(m.target.value),"aria-label":"Host Sudo-Passwort",name:"sudo-password",autoComplete:"off",spellCheck:!1,placeholder:"Sudo-Passwort für System-Operationen",className:"w-full h-10 pl-3 pr-10 text-xs bg-background/40 border border-border/60 rounded-lg outline-none focus:border-primary transition-colors text-foreground"}),l.jsx("button",{type:"button",onClick:()=>c(!u),"aria-label":u?"Passwort verbergen":"Passwort anzeigen",className:"absolute inset-y-0 right-0 flex items-center pr-3 text-muted-foreground hover:text-foreground transition-colors",children:u?l.jsx(fw,{className:"h-4 w-4","aria-hidden":"true"}):l.jsx(ef,{className:"h-4 w-4","aria-hidden":"true"})})]}),l.jsx("p",{className:"text-[9px] text-muted-foreground leading-normal",children:"Wird benötigt für systemd-Dienste (Llama Swap logs/restart), OS-Update (apt) und Reboot."})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsxs("label",{className:"text-xs font-semibold flex items-center gap-1.5",children:[l.jsx(p4,{className:"h-4 w-4 text-violet-400"}),"HuggingFace API Token"]}),l.jsxs("div",{className:"relative",children:[l.jsx("input",{type:f?"text":"password",value:a,onChange:m=>o(m.target.value),"aria-label":"HuggingFace API Token",name:"hf-token",autoComplete:"off",spellCheck:!1,placeholder:"hf_…",className:"w-full h-10 pl-3 pr-10 text-xs bg-background/40 border border-border/60 rounded-lg outline-none focus:border-primary transition-colors text-foreground"}),l.jsx("button",{type:"button",onClick:()=>h(!f),"aria-label":f?"Token verbergen":"Token anzeigen",className:"absolute inset-y-0 right-0 flex items-center pr-3 text-muted-foreground hover:text-foreground transition-colors",children:f?l.jsx(fw,{className:"h-4 w-4","aria-hidden":"true"}):l.jsx(ef,{className:"h-4 w-4","aria-hidden":"true"})})]}),l.jsx("p",{className:"text-[9px] text-muted-foreground leading-normal",children:"Erlaubt das Herunterladen von geschützten oder Gate-restricted Modellen direkt über Mission Control."})]}),l.jsxs("div",{className:"flex gap-3 pt-2",children:[l.jsx("button",{onClick:()=>{localStorage.setItem("mc_sudo_password",r),localStorage.setItem("mc_hf_token",a),t("Erfolgreich","Einstellungen erfolgreich lokal gespeichert.")},className:"flex-1 h-9 flex items-center justify-center text-xs font-semibold text-primary-foreground bg-primary hover:bg-primary/90 rounded-lg transition-colors shadow shadow-primary/10 cursor-pointer",children:"Speichern"}),l.jsx("button",{onClick:()=>{n(""),o(""),localStorage.removeItem("mc_sudo_password"),localStorage.removeItem("mc_hf_token"),t("Gelöscht","Zugangsdaten gelöscht.")},className:"h-9 px-4 flex items-center justify-center text-xs font-semibold text-muted-foreground border border-border/60 bg-background/20 hover:bg-accent rounded-lg transition-colors cursor-pointer",children:"Zurücksetzen"})]})]})}function qX({detail:e,maintenanceJob:t,onClose:r,onApply:n}){var f;const a=e.data,o={os:{icon:Gs,cls:"text-cyan-400",title:"OS-Pakete (apt)"},engine:{icon:nh,cls:"text-violet-400",title:"Inferenz-Engine (llama.cpp)"},swap:{icon:ON,cls:"text-fuchsia-400",title:"Router (llama-swap)"},hermes:{icon:gn,cls:"text-amber-400",title:"Hermes-Agent"}}[e.kind],u=o.icon,c=a?e.kind==="os"?(a.count??0)===0:e.kind==="hermes"?(a.behind??0)===0:a.installed_build!=null&&a.latest_build!=null&&a.latest_build<=a.installed_build:!0;return l.jsxs("div",{className:"fixed inset-0 z-[60] flex items-center justify-center p-4",children:[l.jsx("div",{className:"absolute inset-0 bg-black/70 backdrop-blur-sm",onClick:r}),l.jsxs("div",{className:"relative w-full max-w-lg max-h-[80vh] flex flex-col rounded-2xl border border-border/60 bg-card shadow-2xl font-sans text-foreground",children:[l.jsxs("div",{className:"flex h-14 shrink-0 items-center justify-between border-b border-border/40 px-5",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(u,{className:te("h-4.5 w-4.5",o.cls)}),l.jsx("h3",{className:"text-sm font-semibold",children:o.title})]}),l.jsx("button",{onClick:r,className:"flex h-7 w-7 items-center justify-center rounded-lg border border-border/40 text-muted-foreground hover:bg-accent transition-colors",children:l.jsx(zn,{className:"h-4 w-4"})})]}),l.jsx("div",{className:"flex-1 overflow-y-auto p-5 text-xs space-y-3 scrollbar-thin",children:e.loading?l.jsxs("div",{className:"flex h-24 items-center justify-center gap-2 text-muted-foreground",children:[l.jsx(Ha,{className:"h-4 w-4 animate-spin"})," Details werden geladen…"]}):a!=null&&a.error?l.jsx("div",{className:"rounded-lg border border-red-500/30 bg-red-500/5 p-3 text-red-400",children:a.error}):e.kind==="os"?((a==null?void 0:a.count)??0)===0?l.jsx("div",{className:"text-muted-foreground",children:"Keine Pakete zu aktualisieren — System ist aktuell."}):l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"text-muted-foreground",children:[a.count," Paket(e) werden aktualisiert:"]}),l.jsx("div",{className:"space-y-1",children:a.packages.map(h=>l.jsxs("div",{className:"flex items-center justify-between gap-2 rounded-md border border-border/40 bg-background/30 px-2.5 py-1.5",children:[l.jsxs("span",{className:"flex items-center gap-1.5 font-mono text-[11px] truncate",children:[l.jsx(A4,{className:"h-3 w-3 text-cyan-400 shrink-0"}),h.name]}),l.jsxs("span",{className:"flex items-center gap-1 font-mono text-[10px] text-muted-foreground shrink-0",children:[l.jsx("span",{children:h.current}),l.jsx(Zd,{className:"h-3 w-3"}),l.jsx("span",{className:"text-emerald-400",children:h.candidate})]})]},h.name))})]}):e.kind==="engine"||e.kind==="swap"?l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"flex items-center gap-2 font-mono text-[11px]",children:[l.jsxs("span",{className:"rounded-md border border-border/40 bg-background/30 px-2 py-1",children:["Build ",(a==null?void 0:a.installed_build)??"?"]}),l.jsx(Zd,{className:"h-3.5 w-3.5 text-muted-foreground"}),l.jsxs("span",{className:"rounded-md border border-emerald-500/30 bg-emerald-500/5 px-2 py-1 text-emerald-400",children:["Build ",(a==null?void 0:a.latest_build)??"?"]})]}),((a==null?void 0:a.name)||(a==null?void 0:a.latest_tag))&&l.jsxs("div",{className:"text-muted-foreground",children:["Release: ",l.jsx("span",{className:"text-foreground",children:a==null?void 0:a.name}),a!=null&&a.latest_tag?` (${a.latest_tag})`:""]}),(a==null?void 0:a.url)&&l.jsxs("a",{href:a.url,target:"_blank",rel:"noreferrer",className:"inline-flex items-center gap-1 text-primary hover:underline",children:["Release-Notes auf GitHub ",l.jsx(Is,{className:"h-3 w-3"})]}),(a==null?void 0:a.body)&&l.jsx("pre",{className:"whitespace-pre-wrap rounded-lg border border-border/40 bg-background/30 p-3 text-[10px] leading-relaxed text-muted-foreground max-h-60 overflow-y-auto scrollbar-thin",children:a.body})]}):(((f=a==null?void 0:a.commits)==null?void 0:f.length)??0)===0?l.jsx("div",{className:"text-muted-foreground",children:"Keine neuen Commits — Hermes-Agent ist bereits aktuell."}):l.jsxs(l.Fragment,{children:[(a==null?void 0:a.summary)&&l.jsxs("div",{className:"rounded-lg border border-primary/25 bg-primary/5 p-3 space-y-1",children:[l.jsx("div",{className:"text-[10px] font-bold uppercase tracking-wider text-primary",children:"Was dieses Update bedeutet (Zusammenfassung der Box)"}),l.jsx("pre",{className:"whitespace-pre-wrap text-[11px] leading-relaxed text-foreground/90 font-sans",children:a.summary})]}),l.jsxs("div",{className:"text-muted-foreground",children:[a.behind," neue Commit(s) auf ",l.jsxs("span",{className:"font-mono text-foreground",children:["origin/",a.branch]}),":"]}),l.jsx("div",{className:"space-y-1",children:a.commits.map(h=>l.jsxs("div",{className:"flex items-start gap-2 rounded-md border border-border/40 bg-background/30 px-2.5 py-1.5",children:[l.jsx(d4,{className:"h-3.5 w-3.5 text-primary shrink-0 mt-0.5"}),l.jsxs("div",{className:"min-w-0",children:[l.jsx("div",{className:"text-[11px] truncate",children:h.subject}),l.jsxs("div",{className:"font-mono text-[9px] text-muted-foreground",children:[h.hash," · ",h.when]})]})]},h.hash))}),l.jsx("p",{className:"text-[10px] text-muted-foreground leading-normal",children:"Vor dem Update wird automatisch ein Backup erstellt; danach startet der Hermes-Gateway neu."})]})}),l.jsxs("div",{className:"flex gap-3 border-t border-border/40 p-4 shrink-0",children:[l.jsx("button",{onClick:r,className:"h-9 flex-1 rounded-lg border border-border/60 bg-background/20 text-xs font-semibold text-muted-foreground hover:bg-accent transition-colors cursor-pointer",children:"Schließen"}),l.jsx("button",{onClick:n,disabled:e.loading||c||!!t,title:t?`Update läuft bereits: ${t.label}`:void 0,className:"h-9 flex-1 rounded-lg bg-primary text-xs font-semibold text-primary-foreground hover:opacity-90 transition-all cursor-pointer disabled:opacity-40 disabled:cursor-default",children:t?"Update läuft…":"Jetzt aktualisieren"})]})]})]})}function YO({open:e,onClose:t,defaultTab:r="maintenance"}){var nt;const[n,a]=y.useState(null),[o,u]=y.useState([]),[c,f]=y.useState("llama-swap"),[h,m]=y.useState(""),[g,v]=y.useState(!1),[b,j]=y.useState(null),[k,S]=y.useState({}),[N,E]=y.useState("maintenance"),[A,P]=y.useState(!1),[M,O]=y.useState(""),[D,B]=y.useState(!1),[F,z]=y.useState(null),[Y,U]=y.useState([]),[me,ue]=y.useState(!1),[ge,ie]=y.useState(null),[oe,X]=y.useState(null);function re(q,Le,Er){X({type:"alert",title:q,message:Le,onConfirm:()=>{X(null),Er&&Er()}})}function J(q,Le,Er){X({type:"confirm",title:q,message:Le,onConfirm:()=>{X(null),Er()},onCancel:()=>X(null)})}function I(q){return q?new Date(q*1e3).toLocaleString("de-DE",{day:"2-digit",month:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}):"Nie"}y.useEffect(()=>{e&&r&&E(r)},[e,r]);const _=y.useRef(null);function W(){je("/api/maintenance/updates").then(a).catch(q=>console.error("Error loading updates",q))}function ee(){je("/api/jobs").then(q=>u(q.jobs||[])).catch(q=>console.error("Error loading jobs",q))}function Z(){je("/api/system/services").then(z).catch(()=>{})}function he(){je("/api/system/backups").then(q=>U(q.backups||[])).catch(()=>{})}function pe(q){v(!0),j(null),je(`/api/maintenance/logs?service=${q}&lines=150`).then(Le=>{Le.ok?m(Le.text):(m(`Fehler beim Laden der Logs: ${Le.err||"Unbekannter Fehler"}`),(Le.status==="incorrect_password"||Le.status==="password_required")&&j(Le.status))}).catch(Le=>m(`Fehler: ${Le.message}`)).finally(()=>{v(!1),setTimeout(()=>{_.current&&(_.current.scrollTop=_.current.scrollHeight)},50)})}y.useEffect(()=>{if(!e)return;W(),ee(),Z(),he();const q=setInterval(()=>{ee(),W(),Z()},3e3);return()=>clearInterval(q)},[e]),y.useEffect(()=>{!e||N!=="logs"||pe(c)},[e,N,c]);function Pe(q){return(q==null?void 0:q.status)==="busy"?(re("Update läuft bereits",`Es läuft gerade „${q.running}". Bitte warte, bis es fertig ist.`),ee(),!0):!1}async function ne(){try{const q=await je("/api/maintenance/os-update",{method:"POST"});if(Pe(q))return;ee(),E("maintenance")}catch(q){re("Fehler",`Fehler beim Starten des OS-Updates: ${q.message}`)}}async function we(){try{const q=await je("/api/maintenance/engine-update",{method:"POST"});if(Pe(q))return;ee(),E("maintenance")}catch(q){re("Fehler",`Fehler beim Engine-Update: ${q.message}`)}}async function _e(){try{const q=await je("/api/maintenance/swap-update",{method:"POST"});if(Pe(q))return;ee(),E("maintenance")}catch(q){re("Fehler",`Fehler beim Router-Update: ${q.message}`)}}async function le(){ue(!0);try{const q=await je("/api/maintenance/hermes-update",{method:"POST"});if(Pe(q))return;ee()}catch(q){re("Fehler",`Hermes-Update fehlgeschlagen: ${q.message}`)}finally{ue(!1)}}async function Ze(q){ie({kind:q,loading:!0,data:null});try{const Le=await je(`/api/maintenance/update-details?kind=${q}`);ie({kind:q,loading:!1,data:Le})}catch(Le){ie({kind:q,loading:!1,data:{kind:q,error:Le.message}})}}function Be(){const q=ge==null?void 0:ge.kind;ie(null),q==="os"?ne():q==="engine"?we():q==="swap"?_e():q==="hermes"&&le()}async function Oe(){P(!0);try{await je("/api/maintenance/check-updates",{method:"POST"}),ee(),E("maintenance")}catch(q){re("Fehler",`Fehler bei der Update-Suche: ${q.message}`)}finally{P(!1)}}async function yt(q,Le){try{await je("/api/models/install",{method:"POST",body:JSON.stringify({repo:q,role:Le})}),re("Gestartet",`Modell-Upgrade für '${Le}' (${q}) gestartet.`),ee(),E("maintenance")}catch(Er){re("Fehler",`Fehler beim Starten des Modell-Upgrades: ${Er.message}`)}}async function Xt(){J("Reboot bestätigen","Bist du sicher, dass du das gesamte Host-System neu starten willst?",async()=>{try{await je("/api/maintenance/reboot",{method:"POST"}),re("Reboot","Reboot ausgelöst. System startet neu...",()=>{t()})}catch(q){re("Fehler",`Fehler beim Reboot: ${q.message}`)}})}async function K(){B(!0),O("Snapshot wird erzeugt...");try{const q=await je("/api/system/backup",{method:"POST"});O(q.ok?`Snapshot erzeugt: ${q.snapshot} (${q.files.length} Komponenten)`:"Backup fehlgeschlagen."),he()}catch(q){O(`Fehler: ${q.message}`)}finally{B(!1)}}async function Se(q){S(Le=>({...Le,[q]:!0}));try{const Le=await je("/api/maintenance/restart",{method:"POST",body:JSON.stringify({service:q})});Le.ok?re("Dienst neu gestartet",`Dienst ${q} wurde erfolgreich neu gestartet.`,()=>{N==="logs"&&c===q&&pe(q)}):re("Fehler",`Fehler beim Neustart: ${Le.err||"Unbekannter Fehler"}`)}catch(Le){re("Fehler",`Fehler beim Neustart: ${Le.message}`)}finally{S(Le=>({...Le,[q]:!1}))}}async function Ce(q){try{await je(`/api/jobs/${q}/cancel`,{method:"POST"}),ee()}catch(Le){re("Fehler",`Fehler beim Abbrechen: ${Le.message}`)}}const Ge=o.find(q=>(q.state==="running"||q.state==="queued")&&q.group==="maintenance");return l.jsxs(l.Fragment,{children:[l.jsx("div",{className:te("fixed inset-0 bg-black/60 backdrop-blur-sm z-50 transition-opacity duration-300",e?"opacity-100 pointer-events-auto":"opacity-0 pointer-events-none"),onClick:t}),l.jsxs("div",{className:te("fixed inset-y-0 right-0 w-full sm:w-[640px] bg-card/85 backdrop-blur-xl border-l border-border/60 shadow-2xl z-50 flex flex-col transform transition-transform duration-300 ease-in-out font-sans text-foreground",e?"translate-x-0":"translate-x-full"),children:[l.jsxs("div",{className:"flex h-16 shrink-0 items-center justify-between border-b border-border/40 px-6",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx($n,{className:"h-4.5 w-4.5 text-primary"}),l.jsx("h2",{className:"text-sm font-semibold tracking-wide uppercase font-space",children:"OS-Zentrale & Pflege"})]}),l.jsx("button",{onClick:t,className:"flex h-8 w-8 items-center justify-center rounded-lg border border-border/40 text-muted-foreground hover:bg-accent transition-colors",children:l.jsx(zn,{className:"h-4 w-4"})})]}),l.jsxs("div",{className:"flex border-b border-border/40 px-6",children:[l.jsx("button",{onClick:()=>E("maintenance"),className:te("flex-1 py-3 text-xs font-semibold uppercase tracking-wider border-b-2 text-center transition-all",N==="maintenance"?"border-primary text-primary":"border-transparent text-muted-foreground hover:text-foreground"),children:"System-Wartung"}),l.jsx("button",{onClick:()=>E("logs"),className:te("flex-1 py-3 text-xs font-semibold uppercase tracking-wider border-b-2 text-center transition-all",N==="logs"?"border-primary text-primary":"border-transparent text-muted-foreground hover:text-foreground"),children:"System-Logs"}),l.jsx("button",{onClick:()=>E("settings"),className:te("flex-1 py-3 text-xs font-semibold uppercase tracking-wider border-b-2 text-center transition-all",N==="settings"?"border-primary text-primary":"border-transparent text-muted-foreground hover:text-foreground"),children:"Einstellungen"})]}),l.jsxs("div",{className:"flex-1 overflow-y-auto p-6 space-y-6",children:[N==="maintenance"&&l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"space-y-2.5",children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Updates"}),l.jsxs("button",{onClick:Oe,disabled:A||!!Ge,className:"flex items-center gap-1 text-[10px] font-semibold text-primary hover:text-primary/80 transition-colors disabled:opacity-50",children:[l.jsx(Ha,{className:te("h-3 w-3",A&&"animate-spin")})," Nach Updates suchen"]})]}),(n==null?void 0:n.last_check)&&l.jsxs("div",{className:"text-[9px] text-muted-foreground -mt-1",children:["Zuletzt gesucht: ",I(n.last_check)]}),Ge&&l.jsxs("div",{className:"flex items-center gap-2 rounded-lg border border-amber-500/30 bg-amber-500/10 px-3 py-2 text-[11px] text-amber-300",children:[l.jsx(Ha,{className:"h-3.5 w-3.5 shrink-0 animate-spin"}),l.jsxs("span",{children:["Update läuft: ",l.jsx("span",{className:"font-semibold",children:Ge.label})," — bitte warten. Weitere Updates sind solange gesperrt."]})]}),l.jsxs("div",{className:"space-y-1.5",children:[l.jsx(au,{icon:Gs,iconClass:"text-cyan-400",name:"OS-Pakete (apt)",available:!!(n!=null&&n.os),status:n!=null&&n.os?`${n.os} verfügbar`:"aktuell",actionLabel:"Anzeigen",onAction:()=>Ze("os")}),l.jsx(au,{icon:nh,iconClass:"text-violet-400",name:"Inferenz-Engine (llama.cpp)",available:!!(n!=null&&n.engine),status:n!=null&&n.engine?"Update verfügbar":"aktuell",actionLabel:"Anzeigen",onAction:()=>Ze("engine")}),l.jsx(au,{icon:ON,iconClass:"text-fuchsia-400",name:"Router (llama-swap)",available:!!(n!=null&&n.swap),status:n!=null&&n.swap?"Update verfügbar":"aktuell",actionLabel:"Anzeigen",onAction:()=>Ze("swap")}),(()=>{var Le;const q=(Le=n==null?void 0:n.components)==null?void 0:Le.find(Er=>Er.key==="hermes_agent");return l.jsx(au,{icon:gn,iconClass:"text-amber-400",name:"Hermes-Agent",available:(q==null?void 0:q.update)===!0,busy:me,status:(q==null?void 0:q.update)===!0?`Update: ${q.latest}`:(q==null?void 0:q.reachable)===!1?"offline":"aktuell",actionLabel:"Anzeigen",onAction:()=>Ze("hermes")})})(),(nt=n==null?void 0:n.model_list)==null?void 0:nt.map(q=>l.jsx(au,{icon:q3,iconClass:"text-emerald-400",name:`Modell · ${q.role}`,available:!0,status:q.title,actionLabel:"Upgrade",onAction:()=>yt(q.repo,q.role)},q.role))]})]}),l.jsxs("div",{className:"space-y-2.5",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Dienste"}),l.jsx("div",{className:"space-y-1.5",children:J2.map(q=>{var Le;return l.jsx(GX,{label:q.label,system:q.type==="system",ok:(Le=F==null?void 0:F.services.find(Er=>Er.name.toLowerCase().includes(q.reach)))==null?void 0:Le.ok,busy:k[q.id],onRestart:()=>Se(q.id),onLogs:()=>{f(q.id),E("logs")}},q.id)})})]}),l.jsxs("div",{className:"space-y-2.5",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Backup"}),l.jsxs("div",{className:"rounded-lg border border-border/50 bg-background/20 px-3 py-2.5 flex items-center gap-3",children:[l.jsxs("div",{className:"flex-1 min-w-0",children:[l.jsx("div",{className:"text-xs text-foreground truncate",children:Y[0]?`Letztes: ${Y[0].snapshot}`:"Noch kein Backup"}),l.jsxs("div",{className:"text-[10px] text-muted-foreground",children:[Y.length," Snapshots · Restore per CLI (restore.sh)"]})]}),l.jsxs("button",{onClick:K,disabled:D,className:"flex items-center gap-1.5 text-[11px] font-semibold rounded-lg px-2.5 py-1 bg-primary text-primary-foreground hover:opacity-90 transition-all cursor-pointer disabled:opacity-50 shrink-0",children:[l.jsx(X3,{className:te("h-3.5 w-3.5",D&&"animate-pulse")})," Snapshot"]})]}),M&&l.jsx("div",{className:"text-[10px] font-mono text-primary bg-primary/5 p-2 rounded-lg border border-primary/20 break-all leading-normal",children:M})]}),l.jsxs("div",{className:"space-y-2.5",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-red-400/80",children:"Gefahrenzone"}),l.jsxs("button",{onClick:Xt,className:"flex w-full items-center gap-3 p-3 rounded-lg border border-red-500/20 bg-red-500/5 hover:bg-red-500/10 text-red-400 transition-all text-left text-xs font-semibold",children:[l.jsx(P4,{className:"h-4.5 w-4.5"}),l.jsxs("div",{children:[l.jsx("div",{children:"Host-System neu starten"}),l.jsx("div",{className:"text-[10px] text-red-400/80 font-normal",children:"Startet die ganze Box neu"})]})]})]}),l.jsxs("div",{className:"space-y-3",children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Hintergrund-Aufgaben"}),l.jsxs("span",{className:"text-[10px] font-mono bg-primary/10 text-primary px-1.5 py-0.5 rounded-full",children:[o.filter(q=>q.state==="running"||q.state==="queued").length," Aktiv"]})]}),l.jsx("div",{className:"space-y-3",children:o.length===0?l.jsx("div",{className:"text-xs text-muted-foreground border border-dashed border-border/60 rounded-xl p-6 text-center",children:"Aktuell keine aktiven Hintergrund-Jobs."}):o.map(q=>{const Le=q.state==="running"||q.state==="queued";return l.jsxs("div",{className:te("p-3 rounded-xl border transition-all duration-300",Le?"border-primary/40 bg-primary/5 shadow-md shadow-primary/5":"border-border/40 bg-background/20 opacity-80"),children:[l.jsxs("div",{className:"flex items-start justify-between gap-3",children:[l.jsxs("div",{className:"space-y-1",children:[l.jsxs("div",{className:"text-xs font-semibold flex items-center gap-1.5",children:[Le&&l.jsxs("span",{className:"flex h-2 w-2 relative",children:[l.jsx("span",{className:"animate-ping absolute inline-flex h-full w-full rounded-full bg-primary opacity-75"}),l.jsx("span",{className:"relative inline-flex rounded-full h-2 w-2 bg-primary"})]}),q.label]}),l.jsxs("div",{className:"text-[10px] font-mono text-muted-foreground uppercase flex items-center gap-2",children:[l.jsxs("span",{children:["ID: ",q.id]}),l.jsx("span",{children:"•"}),l.jsx("span",{className:te(q.state==="done"&&"text-emerald-400",q.state==="failed"&&"text-red-400",q.state==="running"&&"text-primary",q.state==="queued"&&"text-amber-400",q.state==="canceled"&&"text-muted-foreground"),children:q.state})]})]}),Le&&l.jsx("button",{onClick:()=>Ce(q.id),className:"text-[10px] font-semibold text-red-400 hover:text-red-300 border border-red-500/20 bg-red-500/5 hover:bg-red-500/10 px-2 py-0.5 rounded transition-colors",children:"Abbrechen"})]}),q.state==="running"&&l.jsxs("div",{className:"mt-3 space-y-1",children:[l.jsx("div",{className:"w-full h-1.5 bg-muted rounded-full overflow-hidden",children:l.jsx("div",{className:"h-full bg-primary transition-all duration-500",style:{width:`${q.progress??0}%`}})}),l.jsxs("div",{className:"flex justify-between items-center text-[9px] font-mono text-muted-foreground",children:[l.jsxs("span",{children:[q.progress??0,"%"]}),q.done_bytes!=null&&q.total_bytes!=null&&l.jsxs("span",{children:[zg(q.done_bytes)," / ",zg(q.total_bytes),q.rate_bps!=null&&` (${zg(q.rate_bps)}/s)`]}),q.eta_s!=null&&l.jsxs("span",{children:["ETA: ",q.eta_s,"s"]})]})]})]},q.id)})})]})]}),N==="logs"&&l.jsxs("div",{className:"flex flex-col h-full space-y-4",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx("select",{value:c,onChange:q=>f(q.target.value),className:"flex-1 h-9 px-3 text-xs bg-background/40 border border-border/60 rounded-lg outline-none text-foreground font-semibold",children:J2.map(q=>l.jsxs("option",{value:q.id,children:[q.label," (",q.type==="system"?"systemd-root":"user",")"]},q.id))}),l.jsxs("button",{onClick:()=>Se(c),disabled:k[c],className:"flex h-9 px-3 items-center gap-1.5 text-xs font-semibold rounded-lg border border-border/60 bg-background/20 hover:border-primary/50 transition-colors disabled:opacity-50",title:"Dienst neu starten",children:[l.jsx(Ha,{className:te("h-3.5 w-3.5",k[c]&&"animate-spin")}),"Restart"]})]}),l.jsxs("div",{className:"flex-1 flex flex-col min-h-[300px] border border-border/60 bg-black/50 rounded-xl overflow-hidden shadow-inner",children:[l.jsxs("div",{className:"flex h-9 items-center justify-between px-4 border-b border-border/40 bg-black/30 shrink-0",children:[l.jsxs("div",{className:"flex items-center gap-1.5 text-[10px] font-mono text-muted-foreground",children:[l.jsx(MN,{className:"h-3 w-3 text-primary"}),l.jsxs("span",{children:["stdout/stderr - ",c]})]}),l.jsx("button",{onClick:()=>pe(c),disabled:g,className:"text-muted-foreground hover:text-foreground transition-colors",children:l.jsx(Ha,{className:te("h-3 w-3",g&&"animate-spin")})})]}),l.jsx("pre",{ref:_,className:"flex-1 p-4 overflow-y-auto text-[10px] font-mono text-cyan-300/90 whitespace-pre-wrap select-text leading-relaxed scrollbar-thin",children:b==="password_required"||b==="incorrect_password"?l.jsxs("div",{className:"flex flex-col items-center justify-center p-6 text-center h-full space-y-3",children:[l.jsx(mi,{className:"h-8 w-8 text-amber-400 animate-pulse animate-duration-1000"}),l.jsx("div",{className:"text-xs font-semibold text-amber-300",children:b==="incorrect_password"?"Falsches Sudo-Passwort hinterlegt.":"Sudo-Passwort für systemd-Dienste erforderlich."}),l.jsxs("p",{className:"text-[10px] text-muted-foreground max-w-xs leading-normal",children:["Für das Auslesen der systemd-Logs von ",c," werden Root-Rechte benötigt. Hinterlege dein Passwort in den Einstellungen."]}),l.jsx("button",{onClick:()=>E("settings"),className:"px-3 py-1.5 text-[10px] font-semibold text-primary-foreground bg-primary hover:bg-primary/95 rounded-md transition-colors mt-2",children:"Sudo-Passwort eintragen"})]}):g&&!h?l.jsx("span",{className:"text-muted-foreground",children:"Lade Logs..."}):h||l.jsx("span",{className:"text-muted-foreground",children:"Keine Logeinträge vorhanden."})})]})]}),N==="settings"&&l.jsx(VX,{open:e,showAlert:re})]})]}),ge&&l.jsx(qX,{detail:ge,maintenanceJob:Ge,onClose:()=>ie(null),onApply:Be}),oe&&l.jsx(FO,{type:oe.type,title:oe.title,message:oe.message,onConfirm:oe.onConfirm,onCancel:oe.onCancel})]})}function QX(){const{data:e}=uh(3e4),{data:t}=xi(),r=((e==null?void 0:e.os)||0)+((e==null?void 0:e.engine)||0)+((e==null?void 0:e.swap)||0)+((e==null?void 0:e.models)||0),n=()=>window.dispatchEvent(new CustomEvent("open-system-drawer",{detail:{tab:"maintenance"}})),a=(t==null?void 0:t.models)??[],o=(t==null?void 0:t.running)??[],u=a.find(m=>m.role==="hermes"),c=a.find(m=>m.role==="coder-lite")||a.find(m=>m.role==="coder"),f=m=>m?o.includes(m):!1,h=m=>{var g;return((g=m==null?void 0:m.split("/").pop())==null?void 0:g.replace(/\.gguf$/i,""))||"—"};return l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Basisstation"}),l.jsx("p",{className:"text-sm text-muted-foreground",children:"Geht's der Box gut, gibt's Updates, was läuft gerade."})]}),l.jsx(KO,{frame:"box"}),l.jsxs("button",{onClick:n,className:te("w-full flex items-center gap-3 rounded-2xl border p-4 text-left transition-all cursor-pointer",r>0?"border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/10":"border-border/60 bg-card/45 hover:border-primary/40"),children:[r>0?l.jsx(J3,{className:"h-6 w-6 shrink-0 text-amber-400"}):l.jsx(or,{className:"h-6 w-6 shrink-0 text-emerald-400"}),l.jsxs("div",{className:"flex-1 min-w-0",children:[l.jsx("div",{className:te("text-sm font-semibold",r>0?"text-amber-400":"text-foreground"),children:r>0?`${r} Update${r===1?"":"s"} verfügbar`:"Alles aktuell"}),l.jsx("div",{className:"text-xs text-muted-foreground",children:r>0?"Antippen, um zu sehen, was genau aktualisiert wird.":"Keine ausstehenden Updates."})]}),r>0&&l.jsxs("span",{className:"shrink-0 flex items-center gap-1 text-xs font-semibold text-amber-400",children:["Ansehen ",l.jsx(th,{className:"h-4 w-4"})]})]}),l.jsxs("div",{children:[l.jsx("div",{className:"text-xs text-muted-foreground mb-2",children:"Was gerade läuft"}),l.jsx("div",{className:"rounded-2xl border border-border/60 overflow-hidden",children:[{icon:$n,label:"Lucys Hirn",model:u==null?void 0:u.name,warm:f(u==null?void 0:u.name)},{icon:_s,label:"Coder (Vibe-Coding)",model:c==null?void 0:c.name,warm:f(c==null?void 0:c.name)}].map(m=>l.jsxs("div",{className:"flex items-center gap-3 px-4 py-3 border-b border-border/40 last:border-0",children:[l.jsx("span",{className:te("h-2 w-2 shrink-0 rounded-full",m.warm?"bg-emerald-500 animate-pulse":"bg-muted-foreground/40")}),l.jsx(m.icon,{className:"h-4 w-4 text-muted-foreground shrink-0"}),l.jsx("span",{className:"text-sm text-foreground w-40 shrink-0",children:m.label}),l.jsx("span",{className:"text-xs text-muted-foreground flex-1 truncate font-mono",children:h(m.model)}),l.jsx("span",{className:te("text-xs shrink-0",m.warm?"text-emerald-400":"text-muted-foreground"),children:m.model?m.warm?"warm":"bereit":"nicht gesetzt"})]},m.label))})]}),l.jsxs("div",{className:"grid gap-6 lg:grid-cols-2",children:[l.jsx(zO,{}),l.jsx(BO,{})]}),l.jsx(UO,{})]})}function Fg({icon:e,title:t,sub:r,onClick:n}){return l.jsxs("button",{onClick:n,className:"w-full flex items-center gap-4 rounded-2xl border border-border/60 bg-card/45 backdrop-blur-md p-5 text-left transition-all hover:border-primary/40 cursor-pointer",children:[l.jsx(e,{className:"h-6 w-6 text-muted-foreground shrink-0"}),l.jsxs("div",{className:"flex-1 min-w-0",children:[l.jsx("div",{className:"text-sm text-foreground",children:t}),l.jsx("div",{className:"text-xs text-muted-foreground",children:r})]}),l.jsx(th,{className:"h-5 w-5 text-muted-foreground shrink-0"})]})}function YX(){const[e,t]=y.useState(null);return e?l.jsxs("div",{className:"space-y-4",children:[l.jsxs("button",{onClick:()=>t(null),className:"flex items-center gap-1.5 text-xs font-semibold text-muted-foreground hover:text-foreground transition-colors cursor-pointer",children:[l.jsx(SN,{className:"h-4 w-4"})," Maschinenraum"]}),e==="modelle"?l.jsx(GO,{}):l.jsx(QO,{})]}):l.jsxs("div",{className:"space-y-4",children:[l.jsxs("div",{className:"flex items-start justify-between gap-3",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Maschinenraum"}),l.jsx("p",{className:"text-sm text-muted-foreground",children:"Nur nötig, wenn du wirklich was ändern willst."})]}),l.jsx(wE,{})]}),l.jsx(Fg,{icon:$n,title:"Modelle",sub:"Hirne, Coder, Immer-bereit-Set, Bibliothek",onClick:()=>t("modelle")}),l.jsx(Fg,{icon:R4,title:"Wartung und Logs",sub:"Updates, Backup, Dienste, Logs, Zugangsdaten",onClick:()=>window.dispatchEvent(new CustomEvent("open-system-drawer",{detail:{tab:"maintenance"}}))}),l.jsx(Fg,{icon:gn,title:"Hermes und Verdrahtung",sub:"Agent, Gehirn-Modell, PC-Verbindung",onClick:()=>t("hermes")})]})}const XX=[{id:"start",label:"Start",icon:eh},{id:"vibe",label:"Vibe-Coding",icon:_s},{id:"konstitution",label:"Konstitution",icon:V3},{id:"maschinenraum",label:"Maschinenraum",icon:Uu}];function ZX(){const[e,t]=y.useState("start"),[r,n]=y.useState(!1),[a,o]=y.useState("maintenance"),{data:u}=jy();y.useEffect(()=>{const f=h=>{var m;o(((m=h.detail)==null?void 0:m.tab)||"maintenance"),n(!0)};return window.addEventListener("open-system-drawer",f),()=>window.removeEventListener("open-system-drawer",f)},[]);const c=u&&u.engine_reachable&&(u.brain?u.brain.ready:!0);return l.jsxs("div",{className:"flex h-full relative",children:[l.jsx("div",{className:"fixed inset-0 -z-50 pointer-events-none overflow-hidden bg-[hsl(224,30%,6%)]",children:l.jsx("div",{className:"absolute inset-0 opacity-30 animate-aurora bg-gradient-to-tr from-teal-500/15 via-indigo-500/10 to-purple-500/15 blur-[130px]"})}),l.jsx(YO,{open:r,onClose:()=>n(!1),defaultTab:a}),l.jsxs("aside",{className:"flex w-56 shrink-0 flex-col border-r border-border/40 bg-card/45 backdrop-blur-md",children:[l.jsxs("div",{className:"flex items-center gap-2 px-5 py-4 border-b border-border/40",children:[l.jsx("div",{className:"h-7 w-7 rounded-lg bg-primary shadow-md shadow-primary/20"}),l.jsxs("div",{className:"leading-tight",children:[l.jsx("div",{className:"text-sm font-semibold tracking-wide font-space",children:"Mission Control"}),l.jsx("div",{className:"text-[10px] text-muted-foreground",children:"3 · Prototyp"})]})]}),l.jsx("nav",{className:"flex-1 space-y-1 px-3 py-4",children:XX.map(f=>l.jsxs("button",{onClick:()=>t(f.id),className:te("flex w-full items-center gap-3 rounded-md px-3 py-2 text-sm transition-all cursor-pointer",e===f.id?"bg-primary/15 text-primary":"text-muted-foreground hover:bg-accent hover:text-accent-foreground"),children:[l.jsx(f.icon,{className:"h-4.5 w-4.5 shrink-0"})," ",f.label]},f.id))}),l.jsxs("div",{className:"px-3 py-3 border-t border-border/40 space-y-2",children:[l.jsxs("div",{className:"flex items-center gap-2 px-2 text-xs text-muted-foreground",children:[l.jsx("span",{className:te("h-2 w-2 rounded-full",c?"bg-emerald-500 animate-pulse":"bg-amber-500")}),c?"Box läuft":"prüfen"]}),l.jsxs("a",{href:"#dashboard",className:"flex items-center gap-1.5 rounded-md px-2 py-1.5 text-[11px] text-muted-foreground hover:text-foreground transition-colors",children:[l.jsx(SN,{className:"h-3.5 w-3.5"})," zurück zu MC2"]})]})]}),l.jsxs("main",{className:"flex-1 min-w-0 overflow-y-auto p-6 scrollbar-thin",children:[e==="start"&&l.jsx(QX,{}),e==="vibe"&&l.jsx(VO,{}),e==="konstitution"&&l.jsx(qO,{}),e==="maschinenraum"&&l.jsx(YX,{})]})]})}function JX(){var j,k,S,N,E;WD();const[e,t]=y.useState(()=>{const A=window.location.hash.slice(1);return su.some(P=>P.id===A)?A:"dashboard"}),r=y.useCallback(A=>{window.location.hash.slice(1)===A?t(A):window.location.hash=A},[]),[n,a]=y.useState(()=>localStorage.getItem("mc_sidebar_collapsed")==="true"),[o,u]=y.useState(!1),[c,f]=y.useState("maintenance"),[h,m]=y.useState(()=>window.location.hash==="#mc3"),{data:g}=jy(),{data:v}=bo(2e4);y.useEffect(()=>{document.documentElement.classList.add("dark")},[]),y.useEffect(()=>{const A=P=>{var O;f(((O=P.detail)==null?void 0:O.tab)||"maintenance"),u(!0)};return window.addEventListener("open-system-drawer",A),()=>window.removeEventListener("open-system-drawer",A)},[]),y.useEffect(()=>{const A=P=>{var O;const M=(O=P.detail)==null?void 0:O.view;M&&r(M)};return window.addEventListener("mc-navigate",A),()=>window.removeEventListener("mc-navigate",A)},[r]),y.useEffect(()=>{const A=()=>{m(window.location.hash==="#mc3");const P=window.location.hash.slice(1);su.some(M=>M.id===P)&&t(P)};return window.addEventListener("hashchange",A),()=>window.removeEventListener("hashchange",A)},[]);const b=su.find(A=>A.id===e);return h?l.jsx(ZX,{}):l.jsxs("div",{className:"flex h-full relative",children:[l.jsxs("div",{className:"fixed inset-0 -z-50 pointer-events-none overflow-hidden bg-[hsl(224,30%,6%)]",children:[l.jsx("div",{className:"absolute inset-0 opacity-35 animate-aurora bg-gradient-to-tr from-teal-500/20 via-indigo-500/15 to-purple-500/20 blur-[130px]"}),l.jsx("div",{className:"absolute top-[-10%] left-[-10%] h-[50%] w-[50%] rounded-full bg-teal-500/15 blur-[160px]"}),l.jsx("div",{className:"absolute bottom-[-10%] right-[-10%] h-[50%] w-[50%] rounded-full bg-purple-500/15 blur-[160px]"}),l.jsx("div",{className:"absolute top-[30%] right-[20%] h-[40%] w-[40%] rounded-full bg-indigo-500/10 blur-[140px]"})]}),l.jsx(YT,{onNavigate:r}),l.jsx(YO,{open:o,onClose:()=>u(!1),defaultTab:c}),l.jsxs("aside",{className:te("flex shrink-0 flex-col border-r border-border/40 bg-card/45 backdrop-blur-md transition-all duration-300 ease-in-out",n?"w-16":"w-60"),children:[l.jsxs("div",{className:te("flex items-center py-4 border-b border-border/40 shrink-0",n?"flex-col gap-3 px-2":"justify-between px-5"),children:[l.jsxs("div",{className:"flex items-center gap-2 overflow-hidden",children:[l.jsx("div",{className:"h-7 w-7 rounded-lg bg-primary shadow-md shadow-primary/20 shrink-0"}),!n&&l.jsxs("div",{className:"leading-tight",children:[l.jsx("div",{className:"text-sm font-semibold tracking-wide font-space",children:"Mission Control"}),l.jsx("div",{className:"text-xs text-muted-foreground",children:"2.0"})]})]}),l.jsx("button",{onClick:()=>{a(A=>{const P=!A;return localStorage.setItem("mc_sidebar_collapsed",P.toString()),P})},className:"p-1 rounded-md hover:bg-accent text-muted-foreground transition-colors cursor-pointer","aria-label":n?"Seitenleiste ausklappen":"Seitenleiste einklappen",title:n?"Maximieren":"Minimieren",children:n?l.jsx(th,{className:"h-4 w-4","aria-hidden":"true"}):l.jsx(Z3,{className:"h-4 w-4","aria-hidden":"true"})})]}),l.jsx("nav",{className:"flex-1 space-y-1 px-3 py-4 overflow-y-auto",children:su.map(A=>l.jsxs("a",{href:`#${A.id}`,"aria-current":e===A.id?"page":void 0,className:te("flex w-full items-center rounded-md text-sm transition-all cursor-pointer",n?"justify-center p-2.5":"gap-3 px-3 py-2",e===A.id?"bg-primary/15 text-primary shadow-sm shadow-primary/5":"text-muted-foreground hover:bg-accent hover:text-accent-foreground"),title:n?A.label:void 0,"aria-label":n?A.label:void 0,children:[l.jsx(A.icon,{className:"h-4.5 w-4.5 shrink-0","aria-hidden":"true"}),!n&&l.jsx("span",{className:"truncate",children:A.label})]},A.id))}),l.jsx("div",{className:te("py-3 text-xs text-muted-foreground border-t border-border/40 shrink-0",n?"px-2 text-center":"px-5"),children:n?l.jsx("div",{className:"flex justify-center",children:l.jsx("span",{className:te("h-2.5 w-2.5 rounded-full ring-2 ring-black/40",g?g.engine_reachable?g.brain&&!g.brain.ready?"bg-amber-500 animate-pulse":"bg-emerald-500 animate-pulse":"bg-amber-500":"bg-red-500"),title:g?g.engine_reachable?g.brain&&!g.brain.ready?`Hirn offline (${g.brain.model??"fast"})`:"Engine + Hirn online":"Engine offline":"Backend offline"})}):l.jsxs("div",{className:"space-y-2 text-left",children:[g?l.jsxs(l.Fragment,{children:[l.jsxs("span",{className:"flex items-center gap-2",children:[l.jsx("span",{className:te("h-2 w-2 rounded-full animate-pulse",g.engine_reachable?"bg-emerald-500":"bg-amber-500")}),l.jsxs("span",{className:"truncate",children:["Engine ",g.engine_reachable?"online":"offline"]})]}),g.brain&&!g.brain.ready&&l.jsxs("span",{className:"flex items-center gap-2 text-amber-400",title:`Agent-Hirn '${g.brain.model??"fast"}' lädt nicht/abgestürzt`,children:[l.jsx("span",{className:"h-2 w-2 rounded-full bg-amber-500 animate-pulse"}),l.jsxs("span",{className:"truncate",children:["Hirn offline",g.brain.model?` (${g.brain.model})`:""]})]})]}):l.jsxs("span",{className:"flex items-center gap-2",children:[l.jsx("span",{className:"h-2 w-2 rounded-full bg-red-500"})," ",l.jsx("span",{className:"truncate",children:"Backend offline"})]}),(v==null?void 0:v.versions)&&l.jsxs("div",{className:"space-y-1 text-[9px] text-muted-foreground/60 mt-2 pt-2 border-t border-border/30",children:[l.jsxs("div",{className:"truncate",title:v.versions.mc2?`${v.versions.mc2.branch}-${v.versions.mc2.hash}${v.versions.mc2.dirty?"*":""} (${v.versions.mc2.date})`:"nicht gefunden",children:[l.jsx("strong",{children:"MC2:"})," ",v.versions.mc2?`${v.versions.mc2.hash}${v.versions.mc2.dirty?"*":""}`:"—"]}),l.jsxs("div",{className:"truncate",title:((j=v.versions.engine)==null?void 0:j.type)==="git"?`${v.versions.engine.branch}-${v.versions.engine.hash}${v.versions.engine.dirty?"*":""} (${v.versions.engine.date})`:((k=v.versions.engine)==null?void 0:k.version_text)||"unbekannt",children:[l.jsx("strong",{children:"Engine:"})," ",((S=v.versions.engine)==null?void 0:S.type)==="git"?`${v.versions.engine.hash}${v.versions.engine.dirty?"*":""}`:((E=(N=v.versions.engine)==null?void 0:N.version_text)==null?void 0:E.split(" ").pop())||"—"]}),l.jsxs("div",{className:"truncate",title:v.versions.hermes_ui?`${v.versions.hermes_ui.branch}-${v.versions.hermes_ui.hash}${v.versions.hermes_ui.dirty?"*":""} (${v.versions.hermes_ui.date})`:"nicht gefunden",children:[l.jsx("strong",{children:"Hermes UI:"})," ",v.versions.hermes_ui?`${v.versions.hermes_ui.hash}${v.versions.hermes_ui.dirty?"*":""}`:"—"]}),l.jsxs("div",{className:"truncate",title:v.versions.hermes_agent?`${v.versions.hermes_agent.branch}-${v.versions.hermes_agent.hash}${v.versions.hermes_agent.dirty?"*":""} (${v.versions.hermes_agent.date})`:"nicht gefunden",children:[l.jsx("strong",{children:"Hermes Agent:"})," ",v.versions.hermes_agent?`${v.versions.hermes_agent.hash}${v.versions.hermes_agent.dirty?"*":""}`:"—"]})]})]})})]}),l.jsxs("div",{className:"flex min-w-0 flex-1 flex-col",children:[l.jsxs("header",{className:"flex h-14 shrink-0 items-center justify-between border-b border-border/40 px-6 bg-card/20 backdrop-blur-sm",children:[l.jsx("div",{className:"text-xs font-medium text-muted-foreground tracking-wide uppercase font-sans",children:b.hint}),l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(wE,{}),l.jsx("a",{href:"https://git.tobisniceshomelab.ddnsfree.com/Hitonabi/mission-control-v2/src/branch/main/docs/BEDIENUNG.md",target:"_blank",rel:"noopener",className:"flex h-8 items-center rounded-md border border-border/40 bg-background/40 px-2.5 text-xs text-muted-foreground hover:bg-accent hover:text-accent-foreground transition-all cursor-pointer font-semibold",title:"Bedien-Anleitung",children:"Hilfe"}),l.jsxs("button",{onClick:()=>{const A=new KeyboardEvent("keydown",{key:"k",metaKey:!0});document.dispatchEvent(A)},className:"flex items-center gap-2 rounded-md border border-border/40 bg-background/40 px-2.5 py-1.5 text-xs text-muted-foreground hover:bg-accent hover:text-accent-foreground transition-all cursor-pointer",children:[l.jsx(a4,{className:"h-3.5 w-3.5"}),l.jsx("span",{children:"Suchen"}),l.jsx("kbd",{className:"rounded bg-muted px-1.5 py-0.5 font-mono text-[9px]",children:"⌘K"})]})]})]}),l.jsxs("main",{className:"flex-1 overflow-y-auto p-6 scrollbar-thin",children:[e==="dashboard"&&l.jsx(yX,{}),e==="models"&&l.jsx(IX,{}),e==="connect"&&l.jsx(VO,{}),e==="memory"&&l.jsx(qO,{}),e==="agent"&&l.jsx(QO,{}),e==="terminal"&&l.jsx(UX,{}),e==="guide"&&l.jsx(WX,{}),!["dashboard","models","connect","memory","agent","terminal","guide"].includes(e)&&l.jsx(KX,{title:b.label,hint:b.hint})]})]})]})}class eZ extends fy.Component{constructor(){super(...arguments);Qo(this,"state",{error:null})}static getDerivedStateFromError(r){return{error:r}}componentDidCatch(r,n){console.error("Unbehandelter UI-Fehler:",r,n.componentStack)}render(){return this.state.error?l.jsx("div",{className:"min-h-screen flex items-center justify-center bg-neutral-950 text-neutral-200 p-8",children:l.jsxs("div",{className:"max-w-lg space-y-4 text-center",children:[l.jsx("div",{className:"text-2xl",children:"Da ist etwas schiefgelaufen."}),l.jsx("div",{className:"text-sm text-neutral-400 break-all",children:this.state.error.message}),l.jsx("button",{className:"px-4 py-2 rounded-lg bg-neutral-800 hover:bg-neutral-700 border border-neutral-700",onClick:()=>window.location.reload(),children:"Neu laden"})]})}):this.props.children}}const tZ=new O3({defaultOptions:{queries:{retry:1,refetchOnWindowFocus:!1,staleTime:5e3}}});i3.createRoot(document.getElementById("root")).render(l.jsx(fy.StrictMode,{children:l.jsx(eZ,{children:l.jsx(_3,{client:tZ,children:l.jsx(JX,{})})})}));export{Ha as R,cs as S,iv as T,T4 as a,dy as g,l as j,y as r}; diff --git a/frontend/dist/index.html b/frontend/dist/index.html index c2b5fb6..5e5a3a8 100644 --- a/frontend/dist/index.html +++ b/frontend/dist/index.html @@ -7,7 +7,7 @@ Mission Control 2.0 - + diff --git a/frontend/src/components/system/UpdateDetailModal.tsx b/frontend/src/components/system/UpdateDetailModal.tsx index b0c3d2c..6ec9efe 100644 --- a/frontend/src/components/system/UpdateDetailModal.tsx +++ b/frontend/src/components/system/UpdateDetailModal.tsx @@ -92,6 +92,12 @@ export function UpdateDetailModal({ detail, maintenanceJob, onClose, onApply }:
Keine neuen Commits — Hermes-Agent ist bereits aktuell.
) : ( <> + {d?.summary && ( +
+
Was dieses Update bedeutet (Zusammenfassung der Box)
+
{d.summary}
+
+ )}
{d!.behind} neue Commit(s) auf origin/{d!.branch}:
{d!.commits!.map((c) => ( diff --git a/frontend/src/lib/api.ts b/frontend/src/lib/api.ts index f6c710a..83cfb3a 100644 --- a/frontend/src/lib/api.ts +++ b/frontend/src/lib/api.ts @@ -306,6 +306,8 @@ export interface UpdatesResp { export interface UpdateDetails { kind: "os" | "engine" | "swap" | "hermes" error?: string + // hermes: LLM-Zusammenfassung der anstehenden Commits (Breaking Changes zuerst) + summary?: string // os count?: number packages?: { name: string; current: string; candidate: string }[]

Vwqc6-}*eIa%a!1fF&p^CK4{!P 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 z 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 W$d(0BQtl0=R)?C57 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%0DZx&A=06X|W^t!p|eC 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 Mjq|3cL-P0k065pdJ^%m! diff --git a/client/lucy-desktop/src/renderer/src/App.tsx b/client/lucy-desktop/src/renderer/src/App.tsx deleted file mode 100644 index 4577ace..0000000 --- a/client/lucy-desktop/src/renderer/src/App.tsx +++ /dev/null @@ -1,234 +0,0 @@ -import { useCallback, useEffect, useRef, useState } from "react" -import { Avatar3D } from "./components/Avatar3D" -import { AuraGlow } from "./components/AuraGlow" -import { ChatMarkdown } from "./components/ChatMarkdown" -import { useVoiceAgent } from "./lib/voice/useVoiceAgent" -import { useDanceAudio } from "./lib/voice/useDanceAudio" - -const FIXED_AVATAR = "/avatar.vrm" - -const STATUS_LABEL: Record = { - warming: "Lucy waermt auf …", - idle: "Bereit — halte zum Sprechen", - listening: "Hoere zu …", - transcribing: "Verstehe …", - thinking: "Lucy denkt …", - speaking: "Lucy spricht …", - error: "Fehler", -} - -export default function App() { - const { status, ready, messages, error, recording, audioLevel, emotion, pressStart, pressEnd, reset, - inputMode, setInputMode, vadListening, lookAtScreen } = useVoiceAgent() - const { danceLevel, dancing, toggleDance } = useDanceAudio() - const holding = useRef(false) - const endRef = useRef(null) - const cursor = useRef({ x: 0, y: 0 }) // Mauszeiger relativ zu Lucys Kopf (Blickfolgen) - const pat = useRef(0) // Zaehler: Antippen/Streicheln des Avatars - const [mode, setMode] = useState<"full" | "overlay">("full") - const [pinned, setPinned] = useState(false) - const [ghost, setGhost] = useState(false) // Geistmodus: Fenster durchklickbar (nur Overlay) - - useEffect(() => { endRef.current?.scrollIntoView({ behavior: "smooth", block: "end" }) }, [messages]) - - // Fenster-Modus vom Main synchronisieren (Tray/Hotkey koennen ihn aendern) - useEffect(() => { - window.lucy?.getMode().then(setMode).catch(() => {}) - return window.lucy?.onMode(setMode) - }, []) - - // Geistmodus (Overlay v2): Fenster durchklickbar, AUSSER der Zeiger ist ueber Lucys Bedienelementen - // (.clickable). So sitzt sie auf dem Desktop, du arbeitest dahinter weiter, kannst sie aber bedienen. - useEffect(() => { - if (!(ghost && mode === "overlay")) { void window.lucy?.setClickThrough(false); return } - let ignoring = false - const set = (ig: boolean) => { if (ig !== ignoring) { ignoring = ig; void window.lucy?.setClickThrough(ig) } } - set(true) - const onMove = (e: MouseEvent) => { - const el = document.elementFromPoint(e.clientX, e.clientY) as HTMLElement | null - set(!(el && el.closest(".clickable"))) - } - window.addEventListener("mousemove", onMove) - return () => { window.removeEventListener("mousemove", onMove); void window.lucy?.setClickThrough(false) } - }, [ghost, mode]) - useEffect(() => { if (mode !== "overlay") setGhost(false) }, [mode]) // Geistmodus nur im Overlay - - // Mauszeiger-Verfolgung (MateEngine-Idee): Position vom Main-Prozess in den Avatar-Blick fuettern - useEffect(() => window.lucy?.onCursor((p) => { cursor.current = p }), []) - - // Leertaste = Push-to-talk (halten) - useEffect(() => { - const isField = (el: EventTarget | null) => - el instanceof HTMLElement && /^(INPUT|TEXTAREA|SELECT)$/.test(el.tagName) - const down = (e: KeyboardEvent) => { - if (e.code !== "Space" || e.repeat || holding.current || isField(e.target)) return - e.preventDefault(); holding.current = true; pressStart() - } - const up = (e: KeyboardEvent) => { - if (e.code !== "Space" || !holding.current) return - e.preventDefault(); holding.current = false; pressEnd() - } - window.addEventListener("keydown", down); window.addEventListener("keyup", up) - return () => { window.removeEventListener("keydown", down); window.removeEventListener("keyup", up) } - }, [pressStart, pressEnd]) - - // Global-Hotkey = TOGGLE (Global-Shortcuts liefern kein key-up) -> Druck startet/stoppt Aufnahme - const recRef = useRef(recording); recRef.current = recording - useEffect(() => { - return window.lucy?.onHotkey(() => { - if (recRef.current || holding.current) { holding.current = false; pressEnd() } - else { holding.current = true; pressStart() } - }) - }, [pressStart, pressEnd]) - - const toggleMode = useCallback(() => { - const next = mode === "full" ? "overlay" : "full" - window.lucy?.setMode(next).then(setMode).catch(() => setMode(next)) - }, [mode]) - const togglePin = useCallback(() => { window.lucy?.togglePin().then(setPinned).catch(() => {}) }, []) - - const speaking = status === "speaking" - const busy = status === "transcribing" || status === "thinking" - const statusColor = status === "error" ? "#f87171" : speaking ? "#7dd3fc" : "#9ca3af" - const overlay = mode === "overlay" - const lastAssistant = [...messages].reverse().find((m) => m.role === "assistant")?.text?.trim() || "" - // Overlay-Blasen: Links/Code aus der letzten Antwort griffbereit (im Overlay gibt es kein Chat-Panel) - const ovLinks = overlay ? Array.from(new Set(lastAssistant.match(/https?:\/\/[^\s)]+/g) || [])).slice(0, 3) : [] - const ovCode = overlay ? (lastAssistant.match(/```[\w]*\n?([\s\S]*?)```/)?.[1] || "").trim() : "" - const shortUrl = (u: string) => u.replace(/^https?:\/\/(www\.)?/, "") - - const micBtn = ( - - ) - - return ( -

Vwqc6-}*eIa%a!1fF&p^CK4{!P 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 z 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 W$d(0BQtl0=R)?C57 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%0DZx&A=06X|W^t!p|eC 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 Mjq|3cL-P0k065pdJ^%m! literal 0 HcmV?d00001 diff --git a/client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx b/client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx index 698ec67..baab81b 100644 --- a/client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx +++ b/client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx @@ -2,16 +2,24 @@ import { Canvas, useFrame } from "@react-three/fiber" import { OrbitControls } from "@react-three/drei" import { useEffect, useRef, useState, type MutableRefObject } from "react" import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js" -import { Object3D, Vector3 } from "three" +import { Object3D, Vector3, AnimationMixer, LoopPingPong, type AnimationAction } from "three" import { VRM, VRMLoaderPlugin, VRMUtils } from "@pixiv/three-vrm" +import { VRMAnimationLoaderPlugin, createVRMAnimationClip, type VRMAnimation } from "@pixiv/three-vrm-animation" import type { Emotion } from "../lib/voice/sentiment" -// 3D-Avatar (VRM): Lippensync (Mund folgt TTS-Pegel), Blinzeln, Mimik, lebendige Idle-/Sprech-Bewegung. -// Liest Live-Werte aus Mutable-Refs (kein Re-Render pro Frame). +// 3D-Avatar (VRM). BEWEGUNG: echte Mocap-Clips (.vrma) je nach Zustand, weich ueberblendet +// (Relax/LookAround im Leerlauf, Thinking beim Nachdenken). Darueber gelegt: Atmen + Sprech-Nicken +// (additiv), Lippensync (echte Vokal-Mundformen), Blick (ohne Schielen), Mimik, Blinzeln. +// Faellt sicher auf die alte prozedurale Bewegung zurueck, falls Clips nicht laden. type LevelRef = MutableRefObject<{ current: number; aa?: number; ih?: number; ou?: number }> type EmotionRef = MutableRefObject +// Welche Clips geladen werden (Dateien unter public/vrma/, MIT-Lizenz, siehe ATTRIBUTION.md). +// Die .vrma sind GESTEN (kein echter Ruhe-Loop) -> nur fuer klare Zustaende/Einschuebe nutzen, +// nicht als Dauerschleife. Ruhiger Leerlauf laeuft prozedural. Weitere Clips liegen auf Platte bereit. +const CLIPS = ["Thinking"] as const + const REST: Record = { leftUpperArm: [0, 0, 1.2], rightUpperArm: [0, 0, -1.2], leftLowerArm: [0, -0.2, 0], rightLowerArm: [0, 0.2, 0], } @@ -19,28 +27,42 @@ function setBone(vrm: VRM, name: string, x: number, y: number, z: number) { const b = vrm.humanoid?.getNormalizedBoneNode(name as any) if (b) b.rotation.set(x, y, z) } +function addBone(vrm: VRM, name: string, x: number, y: number, z: number) { + const b = vrm.humanoid?.getNormalizedBoneNode(name as any) + if (b) { b.rotation.x += x; b.rotation.y += y; b.rotation.z += z } +} function applyRestPose(vrm: VRM) { for (const [name, r] of Object.entries(REST)) setBone(vrm, name, r[0], r[1], r[2]) vrm.humanoid?.update() } -function applyIdle(vrm: VRM, t: number, level: number, lookYaw: number, lookPitch: number, lean: number, speak: number) { +// ADDITIVE Lebendigkeit OBEN AUF dem Clip: dezentes Atmen, Sprech-Nicken, Vorlehnen beim Zuhoeren. +// Kleine Amplituden -> ergaenzt den Clip, kaempft nicht mit ihm. +function addLife(vrm: VRM, t: number, speak: number, lean: number) { + const breathe = Math.sin(t * 1.6) + addBone(vrm, "spine", breathe * 0.012 + lean * 0.05, 0, 0) + addBone(vrm, "chest", breathe * 0.01, 0, 0) + const beat = Math.sin(t * 2.4) + Math.sin(t * 3.7) * 0.5 + const nod = speak * (0.018 * beat + 0.012 * Math.sin(t * 1.3)) + addBone(vrm, "neck", nod * 0.4 + lean * 0.03, 0, 0) + addBone(vrm, "head", nod, 0, 0) +} + +// Fallback (keine Clips): die fruehere rein prozedurale Bewegung, leicht abgespeckt. +function applyIdleProcedural(vrm: VRM, t: number, level: number, lean: number, speak: number) { const breathe = Math.sin(t * 1.6), sway = Math.sin(t * 0.45), weight = Math.sin(t * 0.32), weight2 = Math.sin(t * 0.21 + 1) const emph = Math.min(1, level * 1.6) - // Sprech-Rhythmus: organischer Doppel-Takt -> Kopf nickt/betont auf der Stimme const beat = Math.sin(t * 2.4) + Math.sin(t * 3.7) * 0.5 const nod = (emph * 0.05 + speak * 0.02) * beat + emph * Math.sin(t * 1.3) * 0.03 - const tilt = Math.sin(t * 0.7 + 0.5) * 0.03 + speak * Math.sin(t * 0.9) * 0.045 // gelegentliches Kopf-Neigen + const tilt = Math.sin(t * 0.7 + 0.5) * 0.03 + speak * Math.sin(t * 0.9) * 0.045 setBone(vrm, "hips", 0, weight * 0.06, weight * 0.04 + weight2 * 0.02) setBone(vrm, "spine", breathe * 0.03 + lean * 0.08 + speak * emph * 0.03, sway * 0.03, -weight * 0.04) setBone(vrm, "chest", breathe * 0.025 + lean * 0.025, sway * 0.022, weight2 * 0.012) setBone(vrm, "upperChest", breathe * 0.018, sway * 0.01, 0) - setBone(vrm, "neck", lookPitch * 0.4 + nod * 0.5, lookYaw * 0.4, tilt * 0.5) - setBone(vrm, "head", lookPitch * 0.6 + nod + Math.sin(t * 0.6) * 0.02, - lookYaw * 0.6 + Math.sin(t * 0.27) * 0.035, tilt + Math.sin(t * 0.5) * 0.025) - // Arme: lebhafterer Schwung um die Ruhepose + dezente Sprech-Geste — SICHER (kleine Amplituden) + setBone(vrm, "neck", nod * 0.5, 0, tilt * 0.5) + setBone(vrm, "head", nod + Math.sin(t * 0.6) * 0.02, Math.sin(t * 0.27) * 0.035, tilt + Math.sin(t * 0.5) * 0.025) const armSwing = Math.sin(t * 0.8) * 0.05 + speak * Math.sin(t * 1.6) * 0.045 - const lift = speak * emph * 0.07 // hebt die Arme beim Reden minimal an (mit den Händen reden) + const lift = speak * emph * 0.07 setBone(vrm, "leftUpperArm", -lift, 0, 1.16 + armSwing + weight * 0.05) setBone(vrm, "rightUpperArm", -lift, 0, -1.16 - armSwing + weight * 0.05) setBone(vrm, "leftLowerArm", 0, -0.18 - Math.sin(t * 0.8) * 0.04 - speak * 0.07, 0) @@ -58,12 +80,16 @@ function VrmModel({ url, audioLevel, emotion, status, onError }: { const [vrm, setVrm] = useState(null) const smooth = useRef>({}) const blink = useRef({ t: 0, next: 3, active: 0 }) - const motion = useRef({ yaw: 0, pitch: 0, tYaw: 0, tPitch: 0, t: 0, next: 2.5, lean: 0 }) - const think = useRef(0) // 0..1 Nachdenk-Pose-Blend const speak = useRef(0) // 0..1 Sprech-Lebendigkeit + const lean = useRef(0) // 0..1 Vorlehnen (Zuhoeren/lauter Ton) const gaze = useRef(new Object3D()) // weit entfernter Blickpunkt (gegen Schielen bei naher Kamera) const headPos = useRef(new Vector3()) const camPos = useRef(new Vector3()) + // Bewegungs-Clips + const mixer = useRef(null) + const actions = useRef>({}) + const thinkW = useRef(0) // 0..1 Einblendung der Thinking-Pose + const sac = useRef({ x: 0, y: 0, tx: 0, ty: 0, t: 0, next: 1.5 }) // Blick-Mikrobewegung (Sakkaden) useEffect(() => { let disposed = false, loaded: VRM | null = null @@ -78,66 +104,87 @@ function VrmModel({ url, audioLevel, emotion, status, onError }: { v.scene.rotation.y = Math.PI applyRestPose(v) loaded = v; setVrm(v) + + // Bewegungs-Clips laden + Mixer aufsetzen (additiv-frei: voller Body-Override durch den Clip) + const mx = new AnimationMixer(v.scene) + mixer.current = mx + const aLoader = new GLTFLoader() + aLoader.register((parser) => new VRMAnimationLoaderPlugin(parser)) + for (const name of CLIPS) { + aLoader.load(`/vrma/${name}.vrma`, (g) => { + if (disposed) return + const anims = g.userData.vrmAnimations as VRMAnimation[] | undefined + if (!anims?.[0]) return + const clip = createVRMAnimationClip(anims[0], v) + const action = mx.clipAction(clip) + action.setLoop(LoopPingPong, Infinity) // vor-zurueck -> kein harter Loop-Sprung + action.timeScale = 0.85 // etwas ruhiger + action.enabled = true + action.setEffectiveWeight(0) // startet aus; blendet nur bei Bedarf ein + action.play() + actions.current[name] = action + }, undefined, (e) => console.warn(`VRMA ${name} nicht geladen:`, e)) + } }, undefined, (err) => { console.error("VRM-Load:", err); onError("Avatar konnte nicht geladen werden.") }) - return () => { disposed = true; if (loaded) VRMUtils.deepDispose(loaded.scene); setVrm(null) } + return () => { + disposed = true + mixer.current?.stopAllAction(); mixer.current = null; actions.current = {} + if (loaded) VRMUtils.deepDispose(loaded.scene) + setVrm(null) + } }, [url, onError]) useFrame((state, delta) => { if (!vrm) return + const st = status.current + const tc = state.clock.elapsedTime const target = audioLevel.current?.current ?? 0 - // Blick zur Kamera, aber auf einen WEIT entfernten Punkt in Kamerarichtung -> Augen laufen - // nicht zusammen (kein Schielen bei naher Kamera), wirken aber weiter "auf dich gerichtet". + const spk = (speak.current += (((st === "speaking") ? 1 : 0) - speak.current) * Math.min(1, delta * 4)) + const attentive = st === "listening" ? 1 : 0 + lean.current += ((Math.min(1, target * 1.6) + attentive * 0.5) - lean.current) * Math.min(1, delta * 3) + + // Bewegung: ruhiger PROZEDURALER Leerlauf als Basis (Atmen/leichtes Wiegen); fuers Nachdenken + // blendet die echte Thinking-Pose ein. Die .vrma sind Gesten -> taugen nicht als Dauerschleife; + // echte Bewegungs-Einschuebe (Strecken/Umschauen) kommen spaeter als gelegentliche Einmal-Gesten. + const mx = mixer.current + const thinkAction = mx ? actions.current["Thinking"] : undefined + const wantThink = (st === "thinking" || st === "transcribing") ? 1 : 0 + thinkW.current += (wantThink - thinkW.current) * Math.min(1, delta * 4) + if (mx && thinkAction) { thinkAction.setEffectiveWeight(thinkW.current); mx.update(delta) } + if (thinkAction && thinkW.current > 0.05) { + addLife(vrm, tc, spk, lean.current) // Thinking-Clip + Atmen/Nicken obendrauf + } else { + applyIdleProcedural(vrm, tc, target, lean.current, spk) // ruhiger Leerlauf + } + + // Blick: weit entfernter Punkt in Kamerarichtung -> Augen parallel (kein Schielen), wirkt "auf dich". if (vrm.lookAt) { const headNode = vrm.humanoid?.getNormalizedBoneNode("head") const hp = headPos.current if (headNode) headNode.getWorldPosition(hp); else hp.set(0, 1.3, 0) const cp = camPos.current.copy(state.camera.position) - gaze.current.position.copy(cp).sub(hp).multiplyScalar(4).add(hp) // 4x = Blickpunkt weit dahinter + gaze.current.position.copy(cp).sub(hp).multiplyScalar(4).add(hp) + // dezente Blick-Mikrobewegung (Sakkaden) -> das Gesicht wirkt nicht eingefroren + const s = sac.current + s.t += delta + if (s.t > s.next) { + s.tx = (Math.random() - 0.5) * 0.22; s.ty = (Math.random() - 0.5) * 0.12 + s.t = 0; s.next = 0.8 + Math.random() * 2.4 + } + s.x += (s.tx - s.x) * Math.min(1, delta * 10) + s.y += (s.ty - s.y) * Math.min(1, delta * 10) + gaze.current.position.x += s.x; gaze.current.position.y += s.y vrm.lookAt.target = gaze.current } - const st = status.current - const spk = (speak.current += (((st === "speaking") ? 1 : 0) - speak.current) * Math.min(1, delta * 4)) - const m = motion.current - m.t += delta - if (m.t > m.next) { - // beim Sprechen häufiger + eher zur Kamera (engagiert), sonst lebhaftes Umschauen - const range = spk > 0.5 ? 0.28 : 0.6 - m.tYaw = (Math.random() - 0.5) * range; m.tPitch = (Math.random() - 0.5) * 0.3 - m.t = 0; m.next = (spk > 0.5 ? 1.4 : 1.9) + Math.random() * 2.6 - } - m.yaw += (m.tYaw - m.yaw) * Math.min(1, delta * 1.8) - m.pitch += (m.tPitch - m.pitch) * Math.min(1, delta * 1.8) - // Nachdenk-Blend hoch wenn 'thinking'/'transcribing', sonst runter - const wantThink = (st === "thinking" || st === "transcribing") ? 1 : 0 - think.current += (wantThink - think.current) * Math.min(1, delta * 2.5) - const th = think.current - const attentive = st === "listening" ? 1 : 0 - m.lean += ((Math.min(1, target * 1.6) + attentive * 0.5) - m.lean) * Math.min(1, delta * 3) - // Beim Nachdenken: Blick zur Seite/oben (pensiv, weg von der Kamera) statt zufälligem Umschauen - const tc = state.clock.elapsedTime - // Nachdenken: Blick zur Seite/leicht nach oben (pensiv, weg von der Kamera) + Kopf-Neigung. - // KEINE Arm-Bewegung (risikolos; die Hand-zum-Kinn-Pose liess sich blind nicht sauber treffen). - const yaw = m.yaw + th * (-0.38 + Math.sin(tc * 0.5) * 0.05) - const pitch = m.pitch + th * (-0.12) - applyIdle(vrm, tc, target * (1 - th * 0.5), yaw, pitch, m.lean, spk) - if (th > 0.02) { - // sanftes nachdenkliches Kopf-Neigen (nur Roll dazu, Idle-Kopfbewegung bleibt erhalten) - setBone(vrm, "head", pitch * 0.6 + Math.sin(tc * 0.6) * 0.015, yaw * 0.6 + Math.sin(tc * 0.27) * 0.025, - Math.sin(tc * 0.5) * 0.02 + th * 0.14) - vrm.humanoid?.update() - } const em = vrm.expressionManager if (em) { // Lippensync v2: echte Vokal-Mundformen (aa/ih/ou) aus der Audio-Analyse statt nur "Mund auf". - // Fallback auf den Gesamtpegel (target) fuer aa, falls keine Mundform-Werte vorliegen. const lv = audioLevel.current - const visTargets: Record = { - aa: lv?.aa ?? target, ih: lv?.ih ?? 0, ou: lv?.ou ?? 0, - } + const visTargets: Record = { aa: lv?.aa ?? target, ih: lv?.ih ?? 0, ou: lv?.ou ?? 0 } for (const v of ["aa", "ih", "ou"]) { const cv = smooth.current[v] ?? 0 - const nv = cv + (visTargets[v] - cv) * Math.min(1, delta * 14) // schnell genug fuers Sprechen + const nv = cv + (visTargets[v] - cv) * Math.min(1, delta * 14) smooth.current[v] = nv; em.setValue(v, nv) } const want = EMO_TO_EXPR[emotion.current] From 41f46569bfc43835d4de6587a62b4197e9a389a6 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Tue, 30 Jun 2026 19:07:00 +0200 Subject: [PATCH 03/38] Lucy v2 (Etappe 1.3): gelegentliche Bewegungs-Einschuebe im Leerlauf - alle ~20-35s ein Einmal-Clip (Strecken/Umschauen), dann zurueck in die Ruhe - bricht sauber ab, sobald zugehoert/gedacht/gesprochen wird - kurze passende Mimik (Laecheln beim Strecken) - (visuelle Abnahme durch User steht noch aus) Co-Authored-By: Claude Opus 4.8 --- .../src/renderer/src/components/Avatar3D.tsx | 51 +++++++++++++++---- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx b/client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx index baab81b..d028aee 100644 --- a/client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx +++ b/client/lucy-desktop/src/renderer/src/components/Avatar3D.tsx @@ -2,7 +2,7 @@ import { Canvas, useFrame } from "@react-three/fiber" import { OrbitControls } from "@react-three/drei" import { useEffect, useRef, useState, type MutableRefObject } from "react" import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js" -import { Object3D, Vector3, AnimationMixer, LoopPingPong, type AnimationAction } from "three" +import { Object3D, Vector3, AnimationMixer, LoopPingPong, LoopOnce, type AnimationAction } from "three" import { VRM, VRMLoaderPlugin, VRMUtils } from "@pixiv/three-vrm" import { VRMAnimationLoaderPlugin, createVRMAnimationClip, type VRMAnimation } from "@pixiv/three-vrm-animation" import type { Emotion } from "../lib/voice/sentiment" @@ -18,7 +18,8 @@ type EmotionRef = MutableRefObject // Welche Clips geladen werden (Dateien unter public/vrma/, MIT-Lizenz, siehe ATTRIBUTION.md). // Die .vrma sind GESTEN (kein echter Ruhe-Loop) -> nur fuer klare Zustaende/Einschuebe nutzen, // nicht als Dauerschleife. Ruhiger Leerlauf laeuft prozedural. Weitere Clips liegen auf Platte bereit. -const CLIPS = ["Thinking"] as const +const CLIPS = ["Thinking", "Relax", "LookAround"] as const +const BREAK_CLIPS = ["Relax", "LookAround"] as const // gelegentliche Einmal-Einschuebe im Leerlauf const REST: Record = { leftUpperArm: [0, 0, 1.2], rightUpperArm: [0, 0, -1.2], leftLowerArm: [0, -0.2, 0], rightLowerArm: [0, 0.2, 0], @@ -90,6 +91,7 @@ function VrmModel({ url, audioLevel, emotion, status, onError }: { const actions = useRef>({}) const thinkW = useRef(0) // 0..1 Einblendung der Thinking-Pose const sac = useRef({ x: 0, y: 0, tx: 0, ty: 0, t: 0, next: 1.5 }) // Blick-Mikrobewegung (Sakkaden) + const brk = useRef({ name: "", w: 0, t: 0, next: 15, active: false }) // gelegentlicher Bewegungs-Einschub useEffect(() => { let disposed = false, loaded: VRM | null = null @@ -117,11 +119,11 @@ function VrmModel({ url, audioLevel, emotion, status, onError }: { if (!anims?.[0]) return const clip = createVRMAnimationClip(anims[0], v) const action = mx.clipAction(clip) - action.setLoop(LoopPingPong, Infinity) // vor-zurueck -> kein harter Loop-Sprung action.timeScale = 0.85 // etwas ruhiger action.enabled = true action.setEffectiveWeight(0) // startet aus; blendet nur bei Bedarf ein - action.play() + if (name === "Thinking") { action.setLoop(LoopPingPong, Infinity); action.play() } // laeuft immer (Gewicht 0) + else { action.setLoop(LoopOnce, 1); action.clampWhenFinished = true } // Einschub: einmal, erst bei Trigger actions.current[name] = action }, undefined, (e) => console.warn(`VRMA ${name} nicht geladen:`, e)) } @@ -143,16 +145,40 @@ function VrmModel({ url, audioLevel, emotion, status, onError }: { const attentive = st === "listening" ? 1 : 0 lean.current += ((Math.min(1, target * 1.6) + attentive * 0.5) - lean.current) * Math.min(1, delta * 3) - // Bewegung: ruhiger PROZEDURALER Leerlauf als Basis (Atmen/leichtes Wiegen); fuers Nachdenken - // blendet die echte Thinking-Pose ein. Die .vrma sind Gesten -> taugen nicht als Dauerschleife; - // echte Bewegungs-Einschuebe (Strecken/Umschauen) kommen spaeter als gelegentliche Einmal-Gesten. + // Bewegung: ruhiger PROZEDURALER Leerlauf als Basis. Echte Clips blenden zustandsabhaengig ein: + // Thinking beim Nachdenken (Dauer) + gelegentliche Einmal-Einschuebe im Leerlauf (Strecken/Umschauen + // alle ~20-35s, dann zurueck in die Ruhe). Die .vrma sind Gesten -> nie als Dauerschleife. const mx = mixer.current const thinkAction = mx ? actions.current["Thinking"] : undefined + const calm = st === "idle" const wantThink = (st === "thinking" || st === "transcribing") ? 1 : 0 + const br = brk.current + // Einschub planen: nur wenn ruhig + keiner laeuft; Timer zuruecksetzen, sobald nicht mehr ruhig + if (mx && !br.active) { + if (calm) { + br.t += delta + if (br.t > br.next) { + const pick = BREAK_CLIPS[Math.floor(Math.random() * BREAK_CLIPS.length)] + const a = actions.current[pick] + if (a) { a.reset(); a.play(); br.name = pick; br.active = true; br.w = 0 } + br.t = 0; br.next = 20 + Math.random() * 15 + } + } else { br.t = 0 } + } thinkW.current += (wantThink - thinkW.current) * Math.min(1, delta * 4) - if (mx && thinkAction) { thinkAction.setEffectiveWeight(thinkW.current); mx.update(delta) } - if (thinkAction && thinkW.current > 0.05) { - addLife(vrm, tc, spk, lean.current) // Thinking-Clip + Atmen/Nicken obendrauf + thinkAction?.setEffectiveWeight(thinkW.current) + // Einschub-Gewicht: ausblenden, wenn nicht mehr ruhig / Nachdenken startet / Clip fast zu Ende + if (br.active) { + const a = actions.current[br.name] + const dur = a?.getClip().duration ?? 1 + const finishing = !calm || wantThink === 1 || (a ? a.time >= dur - 0.4 : true) + br.w += ((finishing ? 0 : 1) - br.w) * Math.min(1, delta * 3) + a?.setEffectiveWeight(br.w) + if (finishing && br.w < 0.02) { a?.stop(); br.active = false; br.name = "" } + } + if (mx) mx.update(delta) + if (thinkW.current > 0.05 || (br.active && br.w > 0.05)) { + addLife(vrm, tc, spk, lean.current) // Clip-Pose + Atmen/Nicken obendrauf } else { applyIdleProcedural(vrm, tc, target, lean.current, spk) // ruhiger Leerlauf } @@ -194,6 +220,11 @@ function VrmModel({ url, audioLevel, emotion, status, onError }: { const nv = cv + (tv - cv) * Math.min(1, delta * 4) smooth.current[name] = nv; em.setValue(name, nv) } + // kurze passende Mimik waehrend eines Bewegungs-Einschubs (Laecheln beim Strecken) + if (brk.current.active) { + const expr = brk.current.name === "Relax" ? "happy" : "relaxed" + em.setValue(expr, Math.max(smooth.current[expr] ?? 0, brk.current.w * 0.35)) + } const b = blink.current b.t += delta if (b.active <= 0 && b.t > b.next) { b.active = 0.16; b.t = 0; b.next = 3 + Math.random() * 4 } From 16f4683859cbbf9114e0ee9577eb7932ef2eacb0 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Tue, 30 Jun 2026 19:12:12 +0200 Subject: [PATCH 04/38] Lucy v2 (Etappe 2): guter Chat + animierter digitaler Raum Chat: - react-markdown/remark-gfm: Lucys Antworten formatiert (fett/listen/inline-code) - Code-Bloecke mit Kopier-Knopf; Links oeffnen im System-Browser (shell.openExternal via IPC) - Kopier-Knopf pro Antwort (Hover) - Persona erlaubt Code/Links SCHRIFTLICH auf Nachfrage; Stimme liest nur kurze Einleitung (cleanForTTS filtert) Digitaler Raum: - driftendes Aurora-Licht + schwebende Partikel (2 Parallax-Ebenen) + Vignette ueber dem Neon-Gitter - reine CSS-Animation (GPU), im Overlay weiter ausgeblendet Co-Authored-By: Claude Opus 4.8 --- client/lucy-desktop/package-lock.json | 1472 ++++++++++++++++- client/lucy-desktop/package.json | 2 + client/lucy-desktop/src/main/index.ts | 150 ++ client/lucy-desktop/src/preload/index.ts | 27 + client/lucy-desktop/src/renderer/src/App.tsx | 182 ++ .../renderer/src/components/ChatMarkdown.tsx | 60 + .../lucy-desktop/src/renderer/src/config.ts | 35 + .../lucy-desktop/src/renderer/src/styles.css | 230 +++ 8 files changed, 2155 insertions(+), 3 deletions(-) create mode 100644 client/lucy-desktop/src/main/index.ts create mode 100644 client/lucy-desktop/src/preload/index.ts create mode 100644 client/lucy-desktop/src/renderer/src/App.tsx create mode 100644 client/lucy-desktop/src/renderer/src/components/ChatMarkdown.tsx create mode 100644 client/lucy-desktop/src/renderer/src/config.ts create mode 100644 client/lucy-desktop/src/renderer/src/styles.css diff --git a/client/lucy-desktop/package-lock.json b/client/lucy-desktop/package-lock.json index b6a4c1b..a6835d5 100644 --- a/client/lucy-desktop/package-lock.json +++ b/client/lucy-desktop/package-lock.json @@ -14,6 +14,8 @@ "@react-three/fiber": "^8.17.10", "react": "^18.3.1", "react-dom": "^18.3.1", + "react-markdown": "^9.1.0", + "remark-gfm": "^4.0.1", "three": "^0.169.0" }, "devDependencies": { @@ -1691,6 +1693,15 @@ "@types/responselike": "^1.0.0" } }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/draco3d": { "version": "1.4.10", "resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.10.tgz", @@ -1701,9 +1712,26 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "dev": true, "license": "MIT" }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/http-cache-semantics": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", @@ -1721,6 +1749,21 @@ "@types/node": "*" } }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, "node_modules/@types/node": { "version": "20.19.43", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz", @@ -1802,6 +1845,12 @@ "meshoptimizer": "~0.18.1" } }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, "node_modules/@types/webxr": { "version": "0.5.24", "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.24.tgz", @@ -1819,6 +1868,12 @@ "@types/node": "*" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.2.tgz", + "integrity": "sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA==", + "license": "ISC" + }, "node_modules/@use-gesture/core": { "version": "10.3.1", "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz", @@ -1864,6 +1919,16 @@ "integrity": "sha512-mMy8/ODcKhab808co15eW+yN+HgXoQxRQHTiBV9Mrvl1r0ufnid7YOcI+gi4eUWSWl9ezD6TW2KXccrL8HCh2A==", "license": "BSD-3-Clause" }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -2052,6 +2117,56 @@ ], "license": "CC-BY-4.0" }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/clone-response": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", @@ -2065,6 +2180,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -2114,7 +2239,6 @@ "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -2128,6 +2252,19 @@ } } }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", @@ -2205,6 +2342,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/detect-gpu": { "version": "5.0.70", "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.70.tgz", @@ -2222,6 +2368,19 @@ "license": "MIT", "optional": true }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/draco3d": { "version": "1.5.7", "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz", @@ -2400,6 +2559,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, "node_modules/extract-zip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", @@ -2629,12 +2804,62 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hls.js": { "version": "1.6.16", "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.6.16.tgz", "integrity": "sha512-VSIRpLfRwlAAdGL4wiTucx2ScRipo0ed1FBatWkyt832jC4CReKstga6yIhYVwGu9LOBjuX9wzmRMeQdBJtzEA==", "license": "Apache-2.0" }, + "node_modules/html-url-attributes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", + "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/http-cache-semantics": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", @@ -2682,6 +2907,68 @@ "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", "license": "MIT" }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "license": "MIT" + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-promise": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", @@ -2791,6 +3078,16 @@ "immediate": "~3.0.5" } }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -2843,6 +3140,16 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/matcher": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", @@ -2857,6 +3164,288 @@ "node": ">=10" } }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/meshline": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/meshline/-/meshline-3.3.1.tgz", @@ -2872,6 +3461,569 @@ "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==", "license": "MIT" }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, "node_modules/mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", @@ -2886,7 +4038,6 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, "license": "MIT" }, "node_modules/nanoid": { @@ -2971,6 +4122,31 @@ "node": ">=8" } }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -3073,6 +4249,16 @@ "react-is": "^16.13.1" } }, + "node_modules/property-information": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/pump": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", @@ -3149,6 +4335,33 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, + "node_modules/react-markdown": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.1.0.tgz", + "integrity": "sha512-xaijuJB0kzGiUdG7nc2MOMDUDBWPyGAjZtUrow9XxUeua8IqeP+VlIfAZ3bphpcLTnSZXz6z9jcVC/TCwbfgdw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" + } + }, "node_modules/react-reconciler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.27.0.tgz", @@ -3190,6 +4403,72 @@ } } }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -3358,6 +4637,16 @@ "node": ">=0.10.0" } }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/sprintf-js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", @@ -3392,6 +4681,38 @@ "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==", "license": "MIT" }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, "node_modules/sumchecker": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", @@ -3470,6 +4791,16 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/troika-three-text": { "version": "0.52.4", "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.52.4.tgz", @@ -3500,6 +4831,16 @@ "integrity": "sha512-W1CpvTHykaPH5brv5VHLfQo9D1OYuo0cSBEUQFFT/nBUzM8iD6Lq2/tgG/f1OelbAS1WtaTPQzE5uM49egnngw==", "license": "MIT" }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/tunnel-rat": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/tunnel-rat/-/tunnel-rat-0.1.2.tgz", @@ -3572,6 +4913,93 @@ "dev": true, "license": "MIT" }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -3631,6 +5059,34 @@ "node": ">= 4" } }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/vite": { "version": "6.4.3", "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", @@ -3785,6 +5241,16 @@ "optional": true } } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } } } diff --git a/client/lucy-desktop/package.json b/client/lucy-desktop/package.json index b366cf4..5e1f32e 100644 --- a/client/lucy-desktop/package.json +++ b/client/lucy-desktop/package.json @@ -16,6 +16,8 @@ "@react-three/fiber": "^8.17.10", "react": "^18.3.1", "react-dom": "^18.3.1", + "react-markdown": "^9.1.0", + "remark-gfm": "^4.0.1", "three": "^0.169.0" }, "devDependencies": { diff --git a/client/lucy-desktop/src/main/index.ts b/client/lucy-desktop/src/main/index.ts new file mode 100644 index 0000000..94a318b --- /dev/null +++ b/client/lucy-desktop/src/main/index.ts @@ -0,0 +1,150 @@ +import { app, BrowserWindow, ipcMain, Tray, Menu, globalShortcut, nativeImage, desktopCapturer, shell } from "electron" +import { spawn, ChildProcess } from "child_process" +import { join } from "path" + +// Lucy — Main-Prozess. Spawnt die lokale Stimme (pocket-tts, :8130) + verwaltet Fenster/Tray/Hotkey. +// Fenster ist frameless+transparent: eigene Titelleiste im Renderer. Zwei Modi: 'full' (Arbeitsfenster) +// und 'overlay' (kleine schwebende Lucy, always-on-top). pocket-tts ist CPU-kühl -> kein /wake-/sleep. + +const PORT = process.env.LUCY_TTS_PORT || "8130" +const TTS = `http://127.0.0.1:${PORT}` +const TTS_DIR = process.env.LUCY_TTS_DIR || join(app.getAppPath(), "..", "lucy-tts") +const PY = process.env.LUCY_TTS_PY || join(TTS_DIR, "ptts-venv", "Scripts", "python.exe") +const HOTKEY = process.env.LUCY_HOTKEY || "CommandOrControl+Shift+Space" + +const FULL_SIZE = { width: 1100, height: 720 } +const OVERLAY_SIZE = { width: 360, height: 480 } + +let win: BrowserWindow | null = null +let tray: Tray | null = null +let ttsProc: ChildProcess | null = null +let mode: "full" | "overlay" = "full" +let pinned = false + +async function ensureTtsServer() { + try { + const r = await fetch(`${TTS}/health`) + if (r.ok) { console.log("[lucy] TTS-Server läuft bereits auf", TTS); return } + } catch { /* selbst starten */ } + console.log("[lucy] starte pocket_server:", PY, "(cwd:", TTS_DIR + ")") + ttsProc = spawn(PY, ["-m", "uvicorn", "pocket_server:app", "--host", "127.0.0.1", "--port", PORT], + { cwd: TTS_DIR, windowsHide: true, env: { ...process.env } }) + ttsProc.stdout?.on("data", (d) => console.log("[tts]", d.toString().trimEnd())) + ttsProc.stderr?.on("data", (d) => console.log("[tts]", d.toString().trimEnd())) + ttsProc.on("error", (e) => console.error("[lucy] pocket_server-Spawn fehlgeschlagen:", e)) + ttsProc.on("exit", (code) => { console.log("[lucy] pocket_server beendet, code", code); ttsProc = null }) +} +function stopTtsServer() { + if (ttsProc && !ttsProc.killed) { try { ttsProc.kill() } catch { /* */ }; ttsProc = null } +} + +function applyMode(next: "full" | "overlay") { + if (!win) return + mode = next + const overlay = next === "overlay" + const size = overlay ? OVERLAY_SIZE : FULL_SIZE + win.setAlwaysOnTop(overlay || pinned, "floating") + win.setSize(size.width, size.height, false) + win.setResizable(!overlay) + if (overlay) win.setMinimumSize(280, 360); else win.setMinimumSize(420, 420) + win.webContents.send("lucy:mode", next) +} + +function createWindow() { + win = new BrowserWindow({ + width: FULL_SIZE.width, height: FULL_SIZE.height, minWidth: 420, minHeight: 420, + frame: false, transparent: true, backgroundColor: "#00000000", resizable: true, + title: "Lucy", show: false, + webPreferences: { + preload: join(__dirname, "../preload/index.mjs"), + sandbox: false, webSecurity: false, + }, + }) + if (process.env.ELECTRON_RENDERER_URL) win.loadURL(process.env.ELECTRON_RENDERER_URL) + else win.loadFile(join(__dirname, "../renderer/index.html")) + win.once("ready-to-show", () => win?.show()) + win.on("closed", () => { win = null }) +} + +function showWin() { + if (!win) { createWindow(); return } + if (win.isMinimized()) win.restore() + win.show(); win.focus() +} + +function lucyIcon() { + // 16x16 Icon zur Laufzeit (silberblauer Kreis) -> sichtbar im Tray, ohne Asset-Datei + const s = 16, buf = Buffer.alloc(s * s * 4) + for (let y = 0; y < s; y++) for (let x = 0; x < s; x++) { + const i = (y * s + x) * 4 + const dx = x - 7.5, dy = y - 7.5, inside = dx * dx + dy * dy <= 56 + buf[i] = 0xfc; buf[i + 1] = 0xd3; buf[i + 2] = 0x7d; buf[i + 3] = inside ? 0xff : 0x00 // BGRA + } + return nativeImage.createFromBitmap(buf, { width: s, height: s }) +} + +function buildTray() { + tray = new Tray(lucyIcon()) + tray.setToolTip("Lucy") + const menu = Menu.buildFromTemplate([ + { label: "Lucy zeigen", click: showWin }, + { label: "Overlay-Modus", type: "checkbox", checked: false, + click: (mi) => { applyMode(mi.checked ? "overlay" : "full"); showWin() } }, + { type: "separator" }, + { label: "Beenden", click: () => { app.quit() } }, + ]) + tray.setContextMenu(menu) + tray.on("click", showWin) +} + +function registerHotkey() { + globalShortcut.unregisterAll() + // Global: Sprach-Aufnahme an/aus (Toggle, da Global-Shortcuts kein key-up liefern) + const ok = globalShortcut.register(HOTKEY, () => { showWin(); win?.webContents.send("lucy:hotkey") }) + if (!ok) console.error("[lucy] Global-Hotkey-Registrierung fehlgeschlagen:", HOTKEY) +} + +// ---- IPC vom Renderer (Titelleiste/Modus) ---- +ipcMain.handle("win:minimize", () => win?.minimize()) +ipcMain.handle("win:close", () => win?.hide()) // in den Tray, bleibt warm; echtes Beenden über Tray +ipcMain.handle("win:setMode", (_e, m: "full" | "overlay") => { applyMode(m); return mode }) +ipcMain.handle("win:getMode", () => mode) +ipcMain.handle("win:togglePin", () => { pinned = !pinned; win?.setAlwaysOnTop(pinned || mode === "overlay", "floating"); return pinned }) + +// Links im echten System-Browser oeffnen (nicht im App-Fenster); nur http(s) erlauben +ipcMain.handle("open:external", (_e, url: string) => { if (/^https?:\/\//i.test(url)) void shell.openExternal(url) }) + +// ---- Bildschirm-Sicht (Lucys Augen) ---- +const CAP = { width: 1280, height: 720 } +ipcMain.handle("screen:capture", async () => { + const sources = await desktopCapturer.getSources({ types: ["screen"], thumbnailSize: CAP }) + return sources.map((s) => s.thumbnail.toDataURL()) // ALLE Bildschirme (Multi-Monitor) als PNG-DataURLs +}) +ipcMain.handle("screen:listWindows", async () => { + const sources = await desktopCapturer.getSources({ types: ["window"], thumbnailSize: { width: 0, height: 0 } }) + return sources.filter((s) => s.name && s.name !== "Lucy").map((s) => ({ id: s.id, name: s.name })) +}) +ipcMain.handle("screen:captureWindow", async (_e, id: string) => { + const sources = await desktopCapturer.getSources({ types: ["window"], thumbnailSize: CAP }) + return sources.find((s) => s.id === id)?.thumbnail.toDataURL() ?? null +}) +// Fuzzy-Fenstersuche: bester Treffer für einen im Gesagten erkannten App-/Fensternamen +ipcMain.handle("screen:captureByName", async (_e, query: string) => { + const q = query.toLowerCase().trim() + const sources = await desktopCapturer.getSources({ types: ["window"], thumbnailSize: CAP }) + const cand = sources.filter((s) => s.name && s.name !== "Lucy") + const hit = cand.find((s) => s.name.toLowerCase().includes(q)) + || cand.find((s) => q.split(/\s+/).some((w) => w.length > 2 && s.name.toLowerCase().includes(w))) + return hit ? { name: hit.name, image: hit.thumbnail.toDataURL() } : null +}) + +app.whenReady().then(() => { + void ensureTtsServer() + createWindow() + buildTray() + registerHotkey() + app.on("activate", () => { if (BrowserWindow.getAllWindows().length === 0) createWindow() }) +}) + +app.on("window-all-closed", () => { /* im Tray weiterlaufen lassen; Beenden nur über Tray/Quit */ }) +app.on("before-quit", () => { stopTtsServer(); globalShortcut.unregisterAll(); tray?.destroy() }) diff --git a/client/lucy-desktop/src/preload/index.ts b/client/lucy-desktop/src/preload/index.ts new file mode 100644 index 0000000..d4d0299 --- /dev/null +++ b/client/lucy-desktop/src/preload/index.ts @@ -0,0 +1,27 @@ +import { contextBridge, ipcRenderer } from "electron" + +// Schmale Bruecke Renderer -> Main: Fenster-Chrome (frameless), Modus-Umschaltung, Tray/Hotkey-Events. +contextBridge.exposeInMainWorld("lucy", { + minimize: () => ipcRenderer.invoke("win:minimize"), + close: () => ipcRenderer.invoke("win:close"), + setMode: (m: "full" | "overlay") => ipcRenderer.invoke("win:setMode", m), + getMode: () => ipcRenderer.invoke("win:getMode"), + togglePin: () => ipcRenderer.invoke("win:togglePin"), + // Bildschirm-Sicht + captureScreen: () => ipcRenderer.invoke("screen:capture"), // alle Monitore -> string[] + listWindows: () => ipcRenderer.invoke("screen:listWindows"), + captureWindow: (id: string) => ipcRenderer.invoke("screen:captureWindow", id), + captureByName: (q: string) => ipcRenderer.invoke("screen:captureByName", q), + openExternal: (url: string) => ipcRenderer.invoke("open:external", url), // Link im System-Browser + // Events aus dem Main-Prozess (Tray/Hotkey/Modus) + onMode: (cb: (m: "full" | "overlay") => void) => { + const h = (_e: unknown, m: "full" | "overlay") => cb(m) + ipcRenderer.on("lucy:mode", h) + return () => ipcRenderer.removeListener("lucy:mode", h) + }, + onHotkey: (cb: () => void) => { + const h = () => cb() + ipcRenderer.on("lucy:hotkey", h) + return () => ipcRenderer.removeListener("lucy:hotkey", h) + }, +}) diff --git a/client/lucy-desktop/src/renderer/src/App.tsx b/client/lucy-desktop/src/renderer/src/App.tsx new file mode 100644 index 0000000..3957738 --- /dev/null +++ b/client/lucy-desktop/src/renderer/src/App.tsx @@ -0,0 +1,182 @@ +import { useCallback, useEffect, useRef, useState } from "react" +import { Avatar3D } from "./components/Avatar3D" +import { AuraGlow } from "./components/AuraGlow" +import { ChatMarkdown } from "./components/ChatMarkdown" +import { useVoiceAgent } from "./lib/voice/useVoiceAgent" + +const FIXED_AVATAR = "/avatar.vrm" + +const STATUS_LABEL: Record = { + warming: "Lucy waermt auf …", + idle: "Bereit — halte zum Sprechen", + listening: "Hoere zu …", + transcribing: "Verstehe …", + thinking: "Lucy denkt …", + speaking: "Lucy spricht …", + error: "Fehler", +} + +export default function App() { + const { status, ready, messages, error, recording, audioLevel, emotion, pressStart, pressEnd, reset, + inputMode, setInputMode, vadListening, lookAtScreen } = useVoiceAgent() + const holding = useRef(false) + const endRef = useRef(null) + const [mode, setMode] = useState<"full" | "overlay">("full") + const [pinned, setPinned] = useState(false) + + useEffect(() => { endRef.current?.scrollIntoView({ behavior: "smooth", block: "end" }) }, [messages]) + + // Fenster-Modus vom Main synchronisieren (Tray/Hotkey koennen ihn aendern) + useEffect(() => { + window.lucy?.getMode().then(setMode).catch(() => {}) + return window.lucy?.onMode(setMode) + }, []) + + // Leertaste = Push-to-talk (halten) + useEffect(() => { + const isField = (el: EventTarget | null) => + el instanceof HTMLElement && /^(INPUT|TEXTAREA|SELECT)$/.test(el.tagName) + const down = (e: KeyboardEvent) => { + if (e.code !== "Space" || e.repeat || holding.current || isField(e.target)) return + e.preventDefault(); holding.current = true; pressStart() + } + const up = (e: KeyboardEvent) => { + if (e.code !== "Space" || !holding.current) return + e.preventDefault(); holding.current = false; pressEnd() + } + window.addEventListener("keydown", down); window.addEventListener("keyup", up) + return () => { window.removeEventListener("keydown", down); window.removeEventListener("keyup", up) } + }, [pressStart, pressEnd]) + + // Global-Hotkey = TOGGLE (Global-Shortcuts liefern kein key-up) -> Druck startet/stoppt Aufnahme + const recRef = useRef(recording); recRef.current = recording + useEffect(() => { + return window.lucy?.onHotkey(() => { + if (recRef.current || holding.current) { holding.current = false; pressEnd() } + else { holding.current = true; pressStart() } + }) + }, [pressStart, pressEnd]) + + const toggleMode = useCallback(() => { + const next = mode === "full" ? "overlay" : "full" + window.lucy?.setMode(next).then(setMode).catch(() => setMode(next)) + }, [mode]) + const togglePin = useCallback(() => { window.lucy?.togglePin().then(setPinned).catch(() => {}) }, []) + + const speaking = status === "speaking" + const busy = status === "transcribing" || status === "thinking" + const statusColor = status === "error" ? "#f87171" : speaking ? "#7dd3fc" : "#9ca3af" + const overlay = mode === "overlay" + const lastAssistant = [...messages].reverse().find((m) => m.role === "assistant")?.text?.trim() || "" + + const micBtn = ( + + ) + + return ( +