@unctad-ai/voice-agent-ui 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/VoiceSettingsView.tsx","../src/contexts/VoiceSettingsContext.tsx"],"sourcesContent":["import { motion } from 'motion/react';\nimport {\n ArrowLeft,\n RotateCcw,\n Volume2,\n Gauge,\n AudioLines,\n Sparkles,\n Mic,\n Timer,\n MessageSquare,\n Activity,\n EyeOff,\n Info,\n Ear,\n Clock,\n Zap,\n Minimize2,\n Signal,\n} from 'lucide-react';\nimport { useVoiceSettings } from '../contexts/VoiceSettingsContext';\nimport { VAD, useSiteConfig } from '@unctad-ai/voice-agent-core';\n\ninterface VoiceSettingsViewProps {\n onBack: () => void;\n onVolumeChange?: (v: number) => void;\n}\n\nfunction expressivenessLabel(v: number): string {\n if (v <= 0.15) return 'Low';\n if (v <= 0.4) return 'Medium';\n return 'High';\n}\n\nfunction speechThresholdLabel(v: number): string {\n if (v >= 0.75) return 'Strict';\n if (v >= 0.5) return 'Balanced';\n return 'Sensitive';\n}\n\nfunction bargeInLabel(v: number): string {\n if (v >= 0.8) return 'Hard';\n if (v >= 0.6) return 'Normal';\n return 'Easy';\n}\n\n/** Slider setting row */\nfunction SliderSetting({\n icon,\n label,\n value,\n displayValue,\n min,\n max,\n step,\n onChange,\n}: {\n icon: React.ReactNode;\n label: string;\n value: number;\n displayValue: string;\n min: number;\n max: number;\n step: number;\n onChange: (v: number) => void;\n}) {\n return (\n <div className=\"py-3 space-y-2.5\">\n <div className=\"flex items-center gap-3\">\n {icon}\n <span className=\"flex-1 text-sm font-medium text-neutral-900\">{label}</span>\n <span className=\"text-xs font-medium tabular-nums\" style={{ color: 'var(--voice-settings-accent, #DB2129)' }}>{displayValue}</span>\n </div>\n <input\n type=\"range\"\n value={value}\n min={min}\n max={max}\n step={step}\n onChange={(e) => onChange(Number(e.target.value))}\n className=\"w-full\"\n style={{ accentColor: 'var(--voice-settings-accent, #DB2129)' }}\n />\n </div>\n );\n}\n\n/** Toggle setting row */\nfunction ToggleSetting({\n icon,\n label,\n description,\n checked,\n onChange,\n}: {\n icon: React.ReactNode;\n label: string;\n description: string;\n checked: boolean;\n onChange: (v: boolean) => void;\n}) {\n return (\n <label className=\"py-3 flex items-center gap-3 cursor-pointer\">\n {icon}\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm font-medium text-neutral-900\">{label}</div>\n <div className=\"text-xs text-neutral-500\">{description}</div>\n </div>\n <button\n role=\"switch\"\n aria-checked={checked}\n onClick={() => onChange(!checked)}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n width: 44,\n height: 24,\n borderRadius: 9999,\n backgroundColor: checked ? 'var(--voice-settings-accent, #DB2129)' : '#d1d5db',\n border: 'none',\n padding: 0,\n cursor: 'pointer',\n transition: 'background-color 0.2s',\n flexShrink: 0,\n }}\n >\n <span\n style={{\n display: 'inline-block',\n width: 20,\n height: 20,\n borderRadius: 9999,\n backgroundColor: '#fff',\n boxShadow: '0 1px 3px rgba(0,0,0,0.2)',\n transition: 'transform 0.2s',\n transform: checked ? 'translateX(22px)' : 'translateX(2px)',\n }}\n />\n </button>\n </label>\n );\n}\n\n/** Select setting row */\nfunction SelectSetting({\n icon,\n label,\n value,\n onChange,\n options,\n}: {\n icon: React.ReactNode;\n label: string;\n value: string;\n onChange: (v: string) => void;\n options: { value: string; label: string }[];\n}) {\n return (\n <div className=\"py-3 flex items-center gap-3\">\n {icon}\n <span className=\"flex-1 text-sm font-medium text-neutral-900\">{label}</span>\n <select\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onMouseEnter={(e) => {\n e.currentTarget.style.borderColor = '#d1d5db';\n e.currentTarget.style.backgroundColor = '#f3f4f6';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.borderColor = '#e5e7eb';\n e.currentTarget.style.backgroundColor = '#f9fafb';\n }}\n onFocus={(e) => { e.currentTarget.style.borderColor = '#9ca3af'; }}\n onBlur={(e) => { e.currentTarget.style.borderColor = '#e5e7eb'; }}\n style={{\n height: 32,\n fontSize: 12,\n fontWeight: 500,\n color: '#374151',\n borderRadius: 9999,\n border: '1px solid #e5e7eb',\n backgroundColor: '#f9fafb',\n paddingLeft: 12,\n paddingRight: 28,\n outline: 'none',\n WebkitAppearance: 'none',\n appearance: 'none',\n cursor: 'pointer',\n transition: 'border-color 0.15s, background-color 0.15s',\n backgroundImage: `url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23999' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E\")`,\n backgroundRepeat: 'no-repeat',\n backgroundPosition: 'right 8px center',\n }}\n >\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n );\n}\n\nexport default function VoiceSettingsView({ onBack, onVolumeChange }: VoiceSettingsViewProps) {\n const { settings, updateSetting, resetSettings } = useVoiceSettings();\n const { colors } = useSiteConfig();\n const iconClass = 'w-4 h-4 shrink-0';\n const iconStyle = { color: colors.primary };\n\n return (\n <motion.div\n initial={{ opacity: 0, x: 20 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: 20 }}\n transition={{ duration: 0.2, ease: [0.22, 1, 0.36, 1] }}\n className=\"voice-settings absolute inset-0 flex flex-col z-10\"\n style={{ borderRadius: 'inherit', backgroundColor: '#f9fafb', '--voice-settings-accent': colors.primary } as React.CSSProperties}\n >\n {/* Header */}\n <div\n className=\"flex items-center gap-2.5 shrink-0 px-4\"\n style={{ height: 56, borderBottom: '1px solid #e5e7eb' }}\n >\n <button\n onClick={onBack}\n className=\"w-8 h-8 rounded-full flex items-center justify-center cursor-pointer transition-colors\"\n style={{ color: '#6b7280' }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLElement).style.color = '#111827';\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLElement).style.color = '#6b7280';\n }}\n aria-label=\"Back to conversation\"\n >\n <ArrowLeft className=\"w-4 h-4\" />\n </button>\n <span className=\"flex-1 text-sm font-semibold\" style={{ color: '#111827' }}>\n Settings\n </span>\n <button\n onClick={resetSettings}\n className=\"w-8 h-8 rounded-full flex items-center justify-center cursor-pointer transition-colors\"\n style={{ color: '#9ca3af' }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLElement).style.color = colors.primary;\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLElement).style.color = '#9ca3af';\n }}\n aria-label=\"Reset all settings\"\n title=\"Reset to defaults\"\n >\n <RotateCcw className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n\n {/* Scrollable content */}\n <div className=\"flex-1 min-h-0 overflow-y-auto\">\n {/* Voice Input */}\n <SettingsSection title=\"Voice Input\">\n <ToggleSetting\n icon={<Mic className={iconClass} style={iconStyle} />}\n label=\"Auto-listen\"\n description=\"Start mic when panel opens\"\n checked={settings.autoListen}\n onChange={(v) => updateSetting('autoListen', v)}\n />\n <Divider />\n <SelectSetting\n icon={<Timer className={iconClass} style={iconStyle} />}\n label=\"Idle timeout\"\n value={String(settings.idleTimeoutMs)}\n onChange={(v) => updateSetting('idleTimeoutMs', Number(v))}\n options={[\n { value: '30000', label: '30s' },\n { value: '60000', label: '1 min' },\n { value: '120000', label: '2 min' },\n { value: '300000', label: '5 min' },\n ]}\n />\n <Divider />\n <SliderSetting\n icon={<Ear className={iconClass} style={iconStyle} />}\n label=\"Speech threshold\"\n value={settings.speechThreshold * 100}\n displayValue={speechThresholdLabel(settings.speechThreshold)}\n min={30}\n max={90}\n step={5}\n onChange={(v) => updateSetting('speechThreshold', v / 100)}\n />\n <Divider />\n <SelectSetting\n icon={<Clock className={iconClass} style={iconStyle} />}\n label=\"Pause tolerance\"\n value={String(settings.pauseToleranceMs)}\n onChange={(v) => updateSetting('pauseToleranceMs', Number(v))}\n options={[\n { value: '400', label: 'Fast' },\n { value: '600', label: 'Default' },\n { value: '800', label: 'Relaxed' },\n { value: '1000', label: 'Patient' },\n ]}\n />\n <Divider />\n <SliderSetting\n icon={<Zap className={iconClass} style={iconStyle} />}\n label=\"Barge-in threshold\"\n value={settings.bargeInThreshold * 100}\n displayValue={bargeInLabel(settings.bargeInThreshold)}\n min={40}\n max={90}\n step={5}\n onChange={(v) => updateSetting('bargeInThreshold', v / 100)}\n />\n <Divider />\n <SelectSetting\n icon={<Minimize2 className={iconClass} style={iconStyle} />}\n label=\"Auto-collapse\"\n value={String(settings.panelCollapseTimeoutMs)}\n onChange={(v) => updateSetting('panelCollapseTimeoutMs', Number(v))}\n options={[\n { value: '120000', label: '2 min' },\n { value: '300000', label: '5 min' },\n { value: '600000', label: '10 min' },\n { value: '0', label: 'Never' },\n ]}\n />\n </SettingsSection>\n\n {/* Voice Output */}\n <SettingsSection title=\"Voice Output\">\n <ToggleSetting\n icon={<AudioLines className={iconClass} style={iconStyle} />}\n label=\"Text-to-speech\"\n description=\"Speak responses aloud\"\n checked={settings.ttsEnabled}\n onChange={(v) => updateSetting('ttsEnabled', v)}\n />\n <Divider />\n <SliderSetting\n icon={<Volume2 className={iconClass} style={iconStyle} />}\n label=\"Volume\"\n value={settings.volume * 100}\n displayValue={`${Math.round(settings.volume * 100)}%`}\n min={0}\n max={100}\n step={1}\n onChange={(v) => {\n updateSetting('volume', v / 100);\n onVolumeChange?.(v / 100);\n }}\n />\n <Divider />\n <SliderSetting\n icon={<Gauge className={iconClass} style={iconStyle} />}\n label=\"Speed\"\n value={settings.playbackSpeed * 100}\n displayValue={`${settings.playbackSpeed.toFixed(2)}x`}\n min={75}\n max={150}\n step={5}\n onChange={(v) => updateSetting('playbackSpeed', v / 100)}\n />\n <Divider />\n <SliderSetting\n icon={<Sparkles className={iconClass} style={iconStyle} />}\n label=\"Expressiveness\"\n value={settings.expressiveness * 100}\n displayValue={expressivenessLabel(settings.expressiveness)}\n min={10}\n max={60}\n step={5}\n onChange={(v) => updateSetting('expressiveness', v / 100)}\n />\n <Divider />\n <SelectSetting\n icon={<MessageSquare className={iconClass} style={iconStyle} />}\n label=\"Response length\"\n value={String(settings.responseLength)}\n onChange={(v) => updateSetting('responseLength', Number(v))}\n options={[\n { value: '30', label: 'Brief' },\n { value: '60', label: 'Normal' },\n { value: '100', label: 'Detailed' },\n ]}\n />\n </SettingsSection>\n\n {/* Developer */}\n <SettingsSection title=\"Developer\">\n <ToggleSetting\n icon={<Activity className={iconClass} style={iconStyle} />}\n label=\"Pipeline metrics\"\n description=\"Show STT / LLM / TTS timings\"\n checked={settings.showPipelineMetrics}\n onChange={(v) => updateSetting('showPipelineMetrics', v)}\n />\n <Divider />\n <SelectSetting\n icon={<EyeOff className={iconClass} style={iconStyle} />}\n label=\"Auto-hide metrics\"\n value={String(settings.pipelineMetricsAutoHideMs)}\n onChange={(v) => updateSetting('pipelineMetricsAutoHideMs', Number(v))}\n options={[\n { value: '5000', label: '5s' },\n { value: '8000', label: '8s' },\n { value: '15000', label: '15s' },\n { value: '0', label: 'Never' },\n ]}\n />\n <Divider />\n <SelectSetting\n icon={<Mic className={iconClass} style={iconStyle} />}\n label=\"STT timeout\"\n value={String(settings.sttTimeoutMs)}\n onChange={(v) => updateSetting('sttTimeoutMs', Number(v))}\n options={[\n { value: '10000', label: '10s' },\n { value: '15000', label: '15s' },\n { value: '30000', label: '30s' },\n ]}\n />\n <Divider />\n <SelectSetting\n icon={<AudioLines className={iconClass} style={iconStyle} />}\n label=\"TTS timeout\"\n value={String(settings.ttsTimeoutMs)}\n onChange={(v) => updateSetting('ttsTimeoutMs', Number(v))}\n options={[\n { value: '30000', label: '30s' },\n { value: '55000', label: '55s' },\n { value: '90000', label: '90s' },\n ]}\n />\n <Divider />\n <SelectSetting\n icon={<Sparkles className={iconClass} style={iconStyle} />}\n label=\"LLM timeout\"\n value={String(settings.llmTimeoutMs)}\n onChange={(v) => updateSetting('llmTimeoutMs', Number(v))}\n options={[\n { value: '10000', label: '10s' },\n { value: '20000', label: '20s' },\n { value: '30000', label: '30s' },\n { value: '60000', label: '60s' },\n ]}\n />\n <Divider />\n <SelectSetting\n icon={<Signal className={iconClass} style={iconStyle} />}\n label=\"Min audio level\"\n value={String(settings.minAudioRms)}\n onChange={(v) => updateSetting('minAudioRms', Number(v))}\n options={[\n { value: '0.01', label: 'Sensitive' },\n { value: '0.02', label: 'Default' },\n { value: '0.035', label: 'Moderate' },\n { value: '0.05', label: 'Strict' },\n ]}\n />\n </SettingsSection>\n\n {/* Info */}\n <SettingsSection title=\"Info\" last>\n <div className=\"py-3 flex items-start gap-3\">\n <Info className={iconClass} style={{ ...iconStyle, marginTop: 2 }} />\n <div className=\"space-y-1 text-xs text-neutral-500\">\n <div>\n VAD Threshold:{' '}\n <span className=\"font-medium text-neutral-700\">{VAD.positiveSpeechThreshold}</span>\n </div>\n </div>\n </div>\n </SettingsSection>\n </div>\n </motion.div>\n );\n}\n\nfunction SettingsSection({\n title,\n children,\n last,\n}: {\n title: string;\n children: React.ReactNode;\n last?: boolean;\n}) {\n return (\n <div style={{ borderBottom: last ? 'none' : '1px solid #e5e7eb' }}>\n <div\n className=\"px-4 pt-4 pb-1 text-[11px] font-semibold uppercase tracking-wider\"\n style={{ color: '#9ca3af' }}\n >\n {title}\n </div>\n <div className=\"px-4\">{children}</div>\n </div>\n );\n}\n\nfunction Divider() {\n return <div style={{ height: 1, backgroundColor: '#f3f4f6' }} />;\n}\n","import { createContext, useContext, useState, useRef, useCallback, type ReactNode } from 'react';\nimport {\n DEFAULT_VOLUME,\n DEFAULT_PLAYBACK_SPEED,\n DEFAULT_TTS_ENABLED,\n DEFAULT_AUTO_LISTEN,\n DEFAULT_IDLE_TIMEOUT_MS,\n DEFAULT_EXPRESSIVENESS,\n DEFAULT_RESPONSE_LENGTH,\n DEFAULT_SHOW_PIPELINE_METRICS,\n DEFAULT_PIPELINE_METRICS_AUTO_HIDE_MS,\n DEFAULT_SPEECH_THRESHOLD,\n DEFAULT_PAUSE_TOLERANCE_MS,\n DEFAULT_BARGE_IN_THRESHOLD,\n DEFAULT_PANEL_COLLAPSE_TIMEOUT_MS,\n DEFAULT_STT_TIMEOUT_MS,\n DEFAULT_TTS_TIMEOUT_MS,\n DEFAULT_LLM_TIMEOUT_MS,\n DEFAULT_MIN_AUDIO_RMS,\n} from '@unctad-ai/voice-agent-core';\n\nexport interface VoiceSettings {\n volume: number;\n playbackSpeed: number;\n ttsEnabled: boolean;\n autoListen: boolean;\n idleTimeoutMs: number;\n expressiveness: number;\n responseLength: number;\n showPipelineMetrics: boolean;\n pipelineMetricsAutoHideMs: number;\n speechThreshold: number;\n pauseToleranceMs: number;\n bargeInThreshold: number;\n panelCollapseTimeoutMs: number;\n sttTimeoutMs: number;\n ttsTimeoutMs: number;\n llmTimeoutMs: number;\n minAudioRms: number;\n}\n\nconst DEFAULTS: VoiceSettings = {\n volume: DEFAULT_VOLUME,\n playbackSpeed: DEFAULT_PLAYBACK_SPEED,\n ttsEnabled: DEFAULT_TTS_ENABLED,\n autoListen: DEFAULT_AUTO_LISTEN,\n idleTimeoutMs: DEFAULT_IDLE_TIMEOUT_MS,\n expressiveness: DEFAULT_EXPRESSIVENESS,\n responseLength: DEFAULT_RESPONSE_LENGTH,\n showPipelineMetrics: DEFAULT_SHOW_PIPELINE_METRICS,\n pipelineMetricsAutoHideMs: DEFAULT_PIPELINE_METRICS_AUTO_HIDE_MS,\n speechThreshold: DEFAULT_SPEECH_THRESHOLD,\n pauseToleranceMs: DEFAULT_PAUSE_TOLERANCE_MS,\n bargeInThreshold: DEFAULT_BARGE_IN_THRESHOLD,\n panelCollapseTimeoutMs: DEFAULT_PANEL_COLLAPSE_TIMEOUT_MS,\n sttTimeoutMs: DEFAULT_STT_TIMEOUT_MS,\n ttsTimeoutMs: DEFAULT_TTS_TIMEOUT_MS,\n llmTimeoutMs: DEFAULT_LLM_TIMEOUT_MS,\n minAudioRms: DEFAULT_MIN_AUDIO_RMS,\n};\n\nconst STORAGE_KEY = 'voice-settings';\n\nfunction loadSettings(): VoiceSettings {\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (!raw) return { ...DEFAULTS };\n const parsed = JSON.parse(raw);\n // Merge with defaults to handle missing keys from older versions\n return { ...DEFAULTS, ...parsed };\n } catch {\n return { ...DEFAULTS };\n }\n}\n\nfunction persistSettings(settings: VoiceSettings) {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(settings));\n } catch {\n // localStorage full or unavailable — silently skip\n }\n}\n\ninterface VoiceSettingsContextType {\n settings: VoiceSettings;\n volumeRef: React.RefObject<number>;\n speedRef: React.RefObject<number>;\n updateSetting: <K extends keyof VoiceSettings>(key: K, value: VoiceSettings[K]) => void;\n resetSettings: () => void;\n}\n\nconst VoiceSettingsContext = createContext<VoiceSettingsContextType | undefined>(undefined);\n\nexport function VoiceSettingsProvider({ children }: { children: ReactNode }) {\n const [settings, setSettings] = useState<VoiceSettings>(loadSettings);\n\n // Refs for hot-path audio — avoids re-renders on volume/speed drag\n const volumeRef = useRef(settings.volume);\n const speedRef = useRef(settings.playbackSpeed);\n\n const updateSetting = useCallback(\n <K extends keyof VoiceSettings>(key: K, value: VoiceSettings[K]) => {\n setSettings((prev) => {\n const next = { ...prev, [key]: value };\n persistSettings(next);\n // Keep refs in sync\n if (key === 'volume') volumeRef.current = value as number;\n if (key === 'playbackSpeed') speedRef.current = value as number;\n return next;\n });\n },\n []\n );\n\n const resetSettings = useCallback(() => {\n const defaults = { ...DEFAULTS };\n setSettings(defaults);\n persistSettings(defaults);\n volumeRef.current = defaults.volume;\n speedRef.current = defaults.playbackSpeed;\n }, []);\n\n return (\n <VoiceSettingsContext.Provider\n value={{ settings, volumeRef, speedRef, updateSetting, resetSettings }}\n >\n {children}\n </VoiceSettingsContext.Provider>\n );\n}\n\n/**\n * Access voice settings. Returns defaults if Provider is absent\n * (needed for error boundary paths where the tree may be partial).\n */\nexport function useVoiceSettings(): VoiceSettingsContextType {\n const context = useContext(VoiceSettingsContext);\n if (context) return context;\n\n // Fallback — return static defaults (no persistence, no-op updates)\n return {\n settings: DEFAULTS,\n volumeRef: { current: DEFAULTS.volume },\n speedRef: { current: DEFAULTS.playbackSpeed },\n updateSetting: () => {},\n resetSettings: () => {},\n };\n}\n"],"mappings":";AAAA,SAAS,cAAc;AACvB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACnBP,SAAS,eAAe,YAAY,UAAU,QAAQ,mBAAmC;AACzF;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAwGH;AAlFJ,IAAM,WAA0B;AAAA,EAC9B,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,qBAAqB;AAAA,EACrB,2BAA2B;AAAA,EAC3B,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,wBAAwB;AAAA,EACxB,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,aAAa;AACf;AAEA,IAAM,cAAc;AAEpB,SAAS,eAA8B;AACrC,MAAI;AACF,UAAM,MAAM,aAAa,QAAQ,WAAW;AAC5C,QAAI,CAAC,IAAK,QAAO,EAAE,GAAG,SAAS;AAC/B,UAAM,SAAS,KAAK,MAAM,GAAG;AAE7B,WAAO,EAAE,GAAG,UAAU,GAAG,OAAO;AAAA,EAClC,QAAQ;AACN,WAAO,EAAE,GAAG,SAAS;AAAA,EACvB;AACF;AAEA,SAAS,gBAAgB,UAAyB;AAChD,MAAI;AACF,iBAAa,QAAQ,aAAa,KAAK,UAAU,QAAQ,CAAC;AAAA,EAC5D,QAAQ;AAAA,EAER;AACF;AAUA,IAAM,uBAAuB,cAAoD,MAAS;AAEnF,SAAS,sBAAsB,EAAE,SAAS,GAA4B;AAC3E,QAAM,CAAC,UAAU,WAAW,IAAI,SAAwB,YAAY;AAGpE,QAAM,YAAY,OAAO,SAAS,MAAM;AACxC,QAAM,WAAW,OAAO,SAAS,aAAa;AAE9C,QAAM,gBAAgB;AAAA,IACpB,CAAgC,KAAQ,UAA4B;AAClE,kBAAY,CAAC,SAAS;AACpB,cAAM,OAAO,EAAE,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM;AACrC,wBAAgB,IAAI;AAEpB,YAAI,QAAQ,SAAU,WAAU,UAAU;AAC1C,YAAI,QAAQ,gBAAiB,UAAS,UAAU;AAChD,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,gBAAgB,YAAY,MAAM;AACtC,UAAM,WAAW,EAAE,GAAG,SAAS;AAC/B,gBAAY,QAAQ;AACpB,oBAAgB,QAAQ;AACxB,cAAU,UAAU,SAAS;AAC7B,aAAS,UAAU,SAAS;AAAA,EAC9B,GAAG,CAAC,CAAC;AAEL,SACE;AAAA,IAAC,qBAAqB;AAAA,IAArB;AAAA,MACC,OAAO,EAAE,UAAU,WAAW,UAAU,eAAe,cAAc;AAAA,MAEpE;AAAA;AAAA,EACH;AAEJ;AAMO,SAAS,mBAA6C;AAC3D,QAAM,UAAU,WAAW,oBAAoB;AAC/C,MAAI,QAAS,QAAO;AAGpB,SAAO;AAAA,IACL,UAAU;AAAA,IACV,WAAW,EAAE,SAAS,SAAS,OAAO;AAAA,IACtC,UAAU,EAAE,SAAS,SAAS,cAAc;AAAA,IAC5C,eAAe,MAAM;AAAA,IAAC;AAAA,IACtB,eAAe,MAAM;AAAA,IAAC;AAAA,EACxB;AACF;;;AD9HA,SAAS,KAAK,qBAAqB;AA+C7B,SAEE,OAAAA,MAFF;AAxCN,SAAS,oBAAoB,GAAmB;AAC9C,MAAI,KAAK,KAAM,QAAO;AACtB,MAAI,KAAK,IAAK,QAAO;AACrB,SAAO;AACT;AAEA,SAAS,qBAAqB,GAAmB;AAC/C,MAAI,KAAK,KAAM,QAAO;AACtB,MAAI,KAAK,IAAK,QAAO;AACrB,SAAO;AACT;AAEA,SAAS,aAAa,GAAmB;AACvC,MAAI,KAAK,IAAK,QAAO;AACrB,MAAI,KAAK,IAAK,QAAO;AACrB,SAAO;AACT;AAGA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GASG;AACD,SACE,qBAAC,SAAI,WAAU,oBACb;AAAA,yBAAC,SAAI,WAAU,2BACZ;AAAA;AAAA,MACD,gBAAAA,KAAC,UAAK,WAAU,+CAA+C,iBAAM;AAAA,MACrE,gBAAAA,KAAC,UAAK,WAAU,oCAAmC,OAAO,EAAE,OAAO,wCAAwC,GAAI,wBAAa;AAAA,OAC9H;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU,CAAC,MAAM,SAAS,OAAO,EAAE,OAAO,KAAK,CAAC;AAAA,QAChD,WAAU;AAAA,QACV,OAAO,EAAE,aAAa,wCAAwC;AAAA;AAAA,IAChE;AAAA,KACF;AAEJ;AAGA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,SACE,qBAAC,WAAM,WAAU,+CACd;AAAA;AAAA,IACD,qBAAC,SAAI,WAAU,kBACb;AAAA,sBAAAA,KAAC,SAAI,WAAU,wCAAwC,iBAAM;AAAA,MAC7D,gBAAAA,KAAC,SAAI,WAAU,4BAA4B,uBAAY;AAAA,OACzD;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,gBAAc;AAAA,QACd,SAAS,MAAM,SAAS,CAAC,OAAO;AAAA,QAChC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,iBAAiB,UAAU,0CAA0C;AAAA,UACrE,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,YAAY;AAAA,QACd;AAAA,QAEA,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,iBAAiB;AAAA,cACjB,WAAW;AAAA,cACX,YAAY;AAAA,cACZ,WAAW,UAAU,qBAAqB;AAAA,YAC5C;AAAA;AAAA,QACF;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAGA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,SACE,qBAAC,SAAI,WAAU,gCACZ;AAAA;AAAA,IACD,gBAAAA,KAAC,UAAK,WAAU,+CAA+C,iBAAM;AAAA,IACrE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,QACxC,cAAc,CAAC,MAAM;AACnB,YAAE,cAAc,MAAM,cAAc;AACpC,YAAE,cAAc,MAAM,kBAAkB;AAAA,QAC1C;AAAA,QACA,cAAc,CAAC,MAAM;AACnB,YAAE,cAAc,MAAM,cAAc;AACpC,YAAE,cAAc,MAAM,kBAAkB;AAAA,QAC1C;AAAA,QACA,SAAS,CAAC,MAAM;AAAE,YAAE,cAAc,MAAM,cAAc;AAAA,QAAW;AAAA,QACjE,QAAQ,CAAC,MAAM;AAAE,YAAE,cAAc,MAAM,cAAc;AAAA,QAAW;AAAA,QAChE,OAAO;AAAA,UACL,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,cAAc;AAAA,UACd,QAAQ;AAAA,UACR,iBAAiB;AAAA,UACjB,aAAa;AAAA,UACb,cAAc;AAAA,UACd,SAAS;AAAA,UACT,kBAAkB;AAAA,UAClB,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,iBAAiB;AAAA,UACjB,kBAAkB;AAAA,UAClB,oBAAoB;AAAA,QACtB;AAAA,QAEC,kBAAQ,IAAI,CAAC,QACZ,gBAAAA,KAAC,YAAuB,OAAO,IAAI,OAChC,cAAI,SADM,IAAI,KAEjB,CACD;AAAA;AAAA,IACH;AAAA,KACF;AAEJ;AAEe,SAAR,kBAAmC,EAAE,QAAQ,eAAe,GAA2B;AAC5F,QAAM,EAAE,UAAU,eAAe,cAAc,IAAI,iBAAiB;AACpE,QAAM,EAAE,OAAO,IAAI,cAAc;AACjC,QAAM,YAAY;AAClB,QAAM,YAAY,EAAE,OAAO,OAAO,QAAQ;AAE1C,SACE;AAAA,IAAC,OAAO;AAAA,IAAP;AAAA,MACC,SAAS,EAAE,SAAS,GAAG,GAAG,GAAG;AAAA,MAC7B,SAAS,EAAE,SAAS,GAAG,GAAG,EAAE;AAAA,MAC5B,MAAM,EAAE,SAAS,GAAG,GAAG,GAAG;AAAA,MAC1B,YAAY,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE;AAAA,MACtD,WAAU;AAAA,MACV,OAAO,EAAE,cAAc,WAAW,iBAAiB,WAAW,2BAA2B,OAAO,QAAQ;AAAA,MAGxG;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,QAAQ,IAAI,cAAc,oBAAoB;AAAA,YAEvD;AAAA,8BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS;AAAA,kBACT,WAAU;AAAA,kBACV,OAAO,EAAE,OAAO,UAAU;AAAA,kBAC1B,cAAc,CAAC,MAAM;AACnB,oBAAC,EAAE,cAA8B,MAAM,QAAQ;AAAA,kBACjD;AAAA,kBACA,cAAc,CAAC,MAAM;AACnB,oBAAC,EAAE,cAA8B,MAAM,QAAQ;AAAA,kBACjD;AAAA,kBACA,cAAW;AAAA,kBAEX,0BAAAA,KAAC,aAAU,WAAU,WAAU;AAAA;AAAA,cACjC;AAAA,cACA,gBAAAA,KAAC,UAAK,WAAU,gCAA+B,OAAO,EAAE,OAAO,UAAU,GAAG,sBAE5E;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS;AAAA,kBACT,WAAU;AAAA,kBACV,OAAO,EAAE,OAAO,UAAU;AAAA,kBAC1B,cAAc,CAAC,MAAM;AACnB,oBAAC,EAAE,cAA8B,MAAM,QAAQ,OAAO;AAAA,kBACxD;AAAA,kBACA,cAAc,CAAC,MAAM;AACnB,oBAAC,EAAE,cAA8B,MAAM,QAAQ;AAAA,kBACjD;AAAA,kBACA,cAAW;AAAA,kBACX,OAAM;AAAA,kBAEN,0BAAAA,KAAC,aAAU,WAAU,eAAc;AAAA;AAAA,cACrC;AAAA;AAAA;AAAA,QACF;AAAA,QAGA,qBAAC,SAAI,WAAU,kCAEb;AAAA,+BAAC,mBAAgB,OAAM,eACrB;AAAA,4BAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM,gBAAAA,KAAC,OAAI,WAAW,WAAW,OAAO,WAAW;AAAA,gBACnD,OAAM;AAAA,gBACN,aAAY;AAAA,gBACZ,SAAS,SAAS;AAAA,gBAClB,UAAU,CAAC,MAAM,cAAc,cAAc,CAAC;AAAA;AAAA,YAChD;AAAA,YACA,gBAAAA,KAAC,WAAQ;AAAA,YACT,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM,gBAAAA,KAAC,SAAM,WAAW,WAAW,OAAO,WAAW;AAAA,gBACrD,OAAM;AAAA,gBACN,OAAO,OAAO,SAAS,aAAa;AAAA,gBACpC,UAAU,CAAC,MAAM,cAAc,iBAAiB,OAAO,CAAC,CAAC;AAAA,gBACzD,SAAS;AAAA,kBACP,EAAE,OAAO,SAAS,OAAO,MAAM;AAAA,kBAC/B,EAAE,OAAO,SAAS,OAAO,QAAQ;AAAA,kBACjC,EAAE,OAAO,UAAU,OAAO,QAAQ;AAAA,kBAClC,EAAE,OAAO,UAAU,OAAO,QAAQ;AAAA,gBACpC;AAAA;AAAA,YACF;AAAA,YACA,gBAAAA,KAAC,WAAQ;AAAA,YACT,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM,gBAAAA,KAAC,OAAI,WAAW,WAAW,OAAO,WAAW;AAAA,gBACnD,OAAM;AAAA,gBACN,OAAO,SAAS,kBAAkB;AAAA,gBAClC,cAAc,qBAAqB,SAAS,eAAe;AAAA,gBAC3D,KAAK;AAAA,gBACL,KAAK;AAAA,gBACL,MAAM;AAAA,gBACN,UAAU,CAAC,MAAM,cAAc,mBAAmB,IAAI,GAAG;AAAA;AAAA,YAC3D;AAAA,YACA,gBAAAA,KAAC,WAAQ;AAAA,YACT,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM,gBAAAA,KAAC,SAAM,WAAW,WAAW,OAAO,WAAW;AAAA,gBACrD,OAAM;AAAA,gBACN,OAAO,OAAO,SAAS,gBAAgB;AAAA,gBACvC,UAAU,CAAC,MAAM,cAAc,oBAAoB,OAAO,CAAC,CAAC;AAAA,gBAC5D,SAAS;AAAA,kBACP,EAAE,OAAO,OAAO,OAAO,OAAO;AAAA,kBAC9B,EAAE,OAAO,OAAO,OAAO,UAAU;AAAA,kBACjC,EAAE,OAAO,OAAO,OAAO,UAAU;AAAA,kBACjC,EAAE,OAAO,QAAQ,OAAO,UAAU;AAAA,gBACpC;AAAA;AAAA,YACF;AAAA,YACA,gBAAAA,KAAC,WAAQ;AAAA,YACT,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM,gBAAAA,KAAC,OAAI,WAAW,WAAW,OAAO,WAAW;AAAA,gBACnD,OAAM;AAAA,gBACN,OAAO,SAAS,mBAAmB;AAAA,gBACnC,cAAc,aAAa,SAAS,gBAAgB;AAAA,gBACpD,KAAK;AAAA,gBACL,KAAK;AAAA,gBACL,MAAM;AAAA,gBACN,UAAU,CAAC,MAAM,cAAc,oBAAoB,IAAI,GAAG;AAAA;AAAA,YAC5D;AAAA,YACA,gBAAAA,KAAC,WAAQ;AAAA,YACT,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM,gBAAAA,KAAC,aAAU,WAAW,WAAW,OAAO,WAAW;AAAA,gBACzD,OAAM;AAAA,gBACN,OAAO,OAAO,SAAS,sBAAsB;AAAA,gBAC7C,UAAU,CAAC,MAAM,cAAc,0BAA0B,OAAO,CAAC,CAAC;AAAA,gBAClE,SAAS;AAAA,kBACP,EAAE,OAAO,UAAU,OAAO,QAAQ;AAAA,kBAClC,EAAE,OAAO,UAAU,OAAO,QAAQ;AAAA,kBAClC,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,kBACnC,EAAE,OAAO,KAAK,OAAO,QAAQ;AAAA,gBAC/B;AAAA;AAAA,YACF;AAAA,aACF;AAAA,UAGA,qBAAC,mBAAgB,OAAM,gBACrB;AAAA,4BAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM,gBAAAA,KAAC,cAAW,WAAW,WAAW,OAAO,WAAW;AAAA,gBAC1D,OAAM;AAAA,gBACN,aAAY;AAAA,gBACZ,SAAS,SAAS;AAAA,gBAClB,UAAU,CAAC,MAAM,cAAc,cAAc,CAAC;AAAA;AAAA,YAChD;AAAA,YACA,gBAAAA,KAAC,WAAQ;AAAA,YACT,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM,gBAAAA,KAAC,WAAQ,WAAW,WAAW,OAAO,WAAW;AAAA,gBACvD,OAAM;AAAA,gBACN,OAAO,SAAS,SAAS;AAAA,gBACzB,cAAc,GAAG,KAAK,MAAM,SAAS,SAAS,GAAG,CAAC;AAAA,gBAClD,KAAK;AAAA,gBACL,KAAK;AAAA,gBACL,MAAM;AAAA,gBACN,UAAU,CAAC,MAAM;AACf,gCAAc,UAAU,IAAI,GAAG;AAC/B,mCAAiB,IAAI,GAAG;AAAA,gBAC1B;AAAA;AAAA,YACF;AAAA,YACA,gBAAAA,KAAC,WAAQ;AAAA,YACT,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM,gBAAAA,KAAC,SAAM,WAAW,WAAW,OAAO,WAAW;AAAA,gBACrD,OAAM;AAAA,gBACN,OAAO,SAAS,gBAAgB;AAAA,gBAChC,cAAc,GAAG,SAAS,cAAc,QAAQ,CAAC,CAAC;AAAA,gBAClD,KAAK;AAAA,gBACL,KAAK;AAAA,gBACL,MAAM;AAAA,gBACN,UAAU,CAAC,MAAM,cAAc,iBAAiB,IAAI,GAAG;AAAA;AAAA,YACzD;AAAA,YACA,gBAAAA,KAAC,WAAQ;AAAA,YACT,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM,gBAAAA,KAAC,YAAS,WAAW,WAAW,OAAO,WAAW;AAAA,gBACxD,OAAM;AAAA,gBACN,OAAO,SAAS,iBAAiB;AAAA,gBACjC,cAAc,oBAAoB,SAAS,cAAc;AAAA,gBACzD,KAAK;AAAA,gBACL,KAAK;AAAA,gBACL,MAAM;AAAA,gBACN,UAAU,CAAC,MAAM,cAAc,kBAAkB,IAAI,GAAG;AAAA;AAAA,YAC1D;AAAA,YACA,gBAAAA,KAAC,WAAQ;AAAA,YACT,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM,gBAAAA,KAAC,iBAAc,WAAW,WAAW,OAAO,WAAW;AAAA,gBAC7D,OAAM;AAAA,gBACN,OAAO,OAAO,SAAS,cAAc;AAAA,gBACrC,UAAU,CAAC,MAAM,cAAc,kBAAkB,OAAO,CAAC,CAAC;AAAA,gBAC1D,SAAS;AAAA,kBACP,EAAE,OAAO,MAAM,OAAO,QAAQ;AAAA,kBAC9B,EAAE,OAAO,MAAM,OAAO,SAAS;AAAA,kBAC/B,EAAE,OAAO,OAAO,OAAO,WAAW;AAAA,gBACpC;AAAA;AAAA,YACF;AAAA,aACF;AAAA,UAGA,qBAAC,mBAAgB,OAAM,aACrB;AAAA,4BAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM,gBAAAA,KAAC,YAAS,WAAW,WAAW,OAAO,WAAW;AAAA,gBACxD,OAAM;AAAA,gBACN,aAAY;AAAA,gBACZ,SAAS,SAAS;AAAA,gBAClB,UAAU,CAAC,MAAM,cAAc,uBAAuB,CAAC;AAAA;AAAA,YACzD;AAAA,YACA,gBAAAA,KAAC,WAAQ;AAAA,YACT,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM,gBAAAA,KAAC,UAAO,WAAW,WAAW,OAAO,WAAW;AAAA,gBACtD,OAAM;AAAA,gBACN,OAAO,OAAO,SAAS,yBAAyB;AAAA,gBAChD,UAAU,CAAC,MAAM,cAAc,6BAA6B,OAAO,CAAC,CAAC;AAAA,gBACrE,SAAS;AAAA,kBACP,EAAE,OAAO,QAAQ,OAAO,KAAK;AAAA,kBAC7B,EAAE,OAAO,QAAQ,OAAO,KAAK;AAAA,kBAC7B,EAAE,OAAO,SAAS,OAAO,MAAM;AAAA,kBAC/B,EAAE,OAAO,KAAK,OAAO,QAAQ;AAAA,gBAC/B;AAAA;AAAA,YACF;AAAA,YACA,gBAAAA,KAAC,WAAQ;AAAA,YACT,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM,gBAAAA,KAAC,OAAI,WAAW,WAAW,OAAO,WAAW;AAAA,gBACnD,OAAM;AAAA,gBACN,OAAO,OAAO,SAAS,YAAY;AAAA,gBACnC,UAAU,CAAC,MAAM,cAAc,gBAAgB,OAAO,CAAC,CAAC;AAAA,gBACxD,SAAS;AAAA,kBACP,EAAE,OAAO,SAAS,OAAO,MAAM;AAAA,kBAC/B,EAAE,OAAO,SAAS,OAAO,MAAM;AAAA,kBAC/B,EAAE,OAAO,SAAS,OAAO,MAAM;AAAA,gBACjC;AAAA;AAAA,YACF;AAAA,YACA,gBAAAA,KAAC,WAAQ;AAAA,YACT,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM,gBAAAA,KAAC,cAAW,WAAW,WAAW,OAAO,WAAW;AAAA,gBAC1D,OAAM;AAAA,gBACN,OAAO,OAAO,SAAS,YAAY;AAAA,gBACnC,UAAU,CAAC,MAAM,cAAc,gBAAgB,OAAO,CAAC,CAAC;AAAA,gBACxD,SAAS;AAAA,kBACP,EAAE,OAAO,SAAS,OAAO,MAAM;AAAA,kBAC/B,EAAE,OAAO,SAAS,OAAO,MAAM;AAAA,kBAC/B,EAAE,OAAO,SAAS,OAAO,MAAM;AAAA,gBACjC;AAAA;AAAA,YACF;AAAA,YACA,gBAAAA,KAAC,WAAQ;AAAA,YACT,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM,gBAAAA,KAAC,YAAS,WAAW,WAAW,OAAO,WAAW;AAAA,gBACxD,OAAM;AAAA,gBACN,OAAO,OAAO,SAAS,YAAY;AAAA,gBACnC,UAAU,CAAC,MAAM,cAAc,gBAAgB,OAAO,CAAC,CAAC;AAAA,gBACxD,SAAS;AAAA,kBACP,EAAE,OAAO,SAAS,OAAO,MAAM;AAAA,kBAC/B,EAAE,OAAO,SAAS,OAAO,MAAM;AAAA,kBAC/B,EAAE,OAAO,SAAS,OAAO,MAAM;AAAA,kBAC/B,EAAE,OAAO,SAAS,OAAO,MAAM;AAAA,gBACjC;AAAA;AAAA,YACF;AAAA,YACA,gBAAAA,KAAC,WAAQ;AAAA,YACT,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM,gBAAAA,KAAC,UAAO,WAAW,WAAW,OAAO,WAAW;AAAA,gBACtD,OAAM;AAAA,gBACN,OAAO,OAAO,SAAS,WAAW;AAAA,gBAClC,UAAU,CAAC,MAAM,cAAc,eAAe,OAAO,CAAC,CAAC;AAAA,gBACvD,SAAS;AAAA,kBACP,EAAE,OAAO,QAAQ,OAAO,YAAY;AAAA,kBACpC,EAAE,OAAO,QAAQ,OAAO,UAAU;AAAA,kBAClC,EAAE,OAAO,SAAS,OAAO,WAAW;AAAA,kBACpC,EAAE,OAAO,QAAQ,OAAO,SAAS;AAAA,gBACnC;AAAA;AAAA,YACF;AAAA,aACF;AAAA,UAGA,gBAAAA,KAAC,mBAAgB,OAAM,QAAO,MAAI,MAChC,+BAAC,SAAI,WAAU,+BACb;AAAA,4BAAAA,KAAC,QAAK,WAAW,WAAW,OAAO,EAAE,GAAG,WAAW,WAAW,EAAE,GAAG;AAAA,YACnE,gBAAAA,KAAC,SAAI,WAAU,sCACb,+BAAC,SAAI;AAAA;AAAA,cACY;AAAA,cACf,gBAAAA,KAAC,UAAK,WAAU,gCAAgC,cAAI,yBAAwB;AAAA,eAC9E,GACF;AAAA,aACF,GACF;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SACE,qBAAC,SAAI,OAAO,EAAE,cAAc,OAAO,SAAS,oBAAoB,GAC9D;AAAA,oBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO,EAAE,OAAO,UAAU;AAAA,QAEzB;AAAA;AAAA,IACH;AAAA,IACA,gBAAAA,KAAC,SAAI,WAAU,QAAQ,UAAS;AAAA,KAClC;AAEJ;AAEA,SAAS,UAAU;AACjB,SAAO,gBAAAA,KAAC,SAAI,OAAO,EAAE,QAAQ,GAAG,iBAAiB,UAAU,GAAG;AAChE;","names":["jsx"]}