@burtson-labs/bandit-engine 2.0.159 → 2.0.161

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.
Files changed (54) hide show
  1. package/README.md +94 -76
  2. package/dist/{aiProviderStore-ZQ5VVVKQ.mjs → aiProviderStore-BNZGM6QU.mjs} +2 -2
  3. package/dist/chat-3JAV77HO.mjs +16 -0
  4. package/dist/chat-provider.js +197 -113
  5. package/dist/chat-provider.js.map +1 -1
  6. package/dist/chat-provider.mjs +6 -6
  7. package/dist/{chunk-GWQRTUKF.mjs → chunk-B3HAQC6F.mjs} +2 -2
  8. package/dist/chunk-B3HAQC6F.mjs.map +1 -0
  9. package/dist/{chunk-GZDJNVAS.mjs → chunk-EOMOOMUC.mjs} +1826 -3264
  10. package/dist/chunk-EOMOOMUC.mjs.map +1 -0
  11. package/dist/{chunk-2X3ZTDUW.mjs → chunk-FSRMNQRN.mjs} +62 -61
  12. package/dist/chunk-FSRMNQRN.mjs.map +1 -0
  13. package/dist/{chunk-ZW3YNAD7.mjs → chunk-MIDYEQOS.mjs} +5 -5
  14. package/dist/{chunk-ZW3YNAD7.mjs.map → chunk-MIDYEQOS.mjs.map} +1 -1
  15. package/dist/chunk-PFKKGJAQ.mjs +390 -0
  16. package/dist/chunk-PFKKGJAQ.mjs.map +1 -0
  17. package/dist/{chunk-R45DM35B.mjs → chunk-QPXG4A5C.mjs} +6 -6
  18. package/dist/chunk-QPXG4A5C.mjs.map +1 -0
  19. package/dist/{chunk-B2TJZM4Z.mjs → chunk-QXITTH2X.mjs} +3 -3
  20. package/dist/{chunk-F5JS4W2K.mjs → chunk-TTAORNWI.mjs} +1573 -1333
  21. package/dist/chunk-TTAORNWI.mjs.map +1 -0
  22. package/dist/{chunk-ZOCXFQID.mjs → chunk-WQEBTH2R.mjs} +7 -2
  23. package/dist/{chunk-ZOCXFQID.mjs.map → chunk-WQEBTH2R.mjs.map} +1 -1
  24. package/dist/{chunk-TCW753JI.mjs → chunk-X65A3NED.mjs} +6 -6
  25. package/dist/{chunk-7HC6ONWM.mjs → chunk-XC7HDKFW.mjs} +3860 -4477
  26. package/dist/chunk-XC7HDKFW.mjs.map +1 -0
  27. package/dist/index.d.mts +85 -2
  28. package/dist/index.d.ts +85 -2
  29. package/dist/index.js +8290 -9998
  30. package/dist/index.js.map +1 -1
  31. package/dist/index.mjs +24 -15
  32. package/dist/index.mjs.map +1 -1
  33. package/dist/management/management.js +7870 -9587
  34. package/dist/management/management.js.map +1 -1
  35. package/dist/management/management.mjs +9 -9
  36. package/dist/modals/chat-modal/chat-modal.js +1664 -3305
  37. package/dist/modals/chat-modal/chat-modal.js.map +1 -1
  38. package/dist/modals/chat-modal/chat-modal.mjs +5 -5
  39. package/dist/{modelStore-KBUW3XAV.mjs → modelStore-FGUGOWTL.mjs} +2 -2
  40. package/package.json +9 -5
  41. package/dist/chat-HM563VOV.mjs +0 -16
  42. package/dist/chunk-2X3ZTDUW.mjs.map +0 -1
  43. package/dist/chunk-7HC6ONWM.mjs.map +0 -1
  44. package/dist/chunk-F5JS4W2K.mjs.map +0 -1
  45. package/dist/chunk-GWQRTUKF.mjs.map +0 -1
  46. package/dist/chunk-GZDJNVAS.mjs.map +0 -1
  47. package/dist/chunk-IS2LWSBZ.mjs +0 -311
  48. package/dist/chunk-IS2LWSBZ.mjs.map +0 -1
  49. package/dist/chunk-R45DM35B.mjs.map +0 -1
  50. /package/dist/{aiProviderStore-ZQ5VVVKQ.mjs.map → aiProviderStore-BNZGM6QU.mjs.map} +0 -0
  51. /package/dist/{chat-HM563VOV.mjs.map → chat-3JAV77HO.mjs.map} +0 -0
  52. /package/dist/{chunk-B2TJZM4Z.mjs.map → chunk-QXITTH2X.mjs.map} +0 -0
  53. /package/dist/{chunk-TCW753JI.mjs.map → chunk-X65A3NED.mjs.map} +0 -0
  54. /package/dist/{modelStore-KBUW3XAV.mjs.map → modelStore-FGUGOWTL.mjs.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/chat/chat-tokens.tsx","../../../node_modules/@burtson-labs/ui/src/tokens.ts","../src/store/canvasStore.ts","../src/icons/index.tsx","../src/services/tts/voiceService.ts","../src/services/tts/ttsSanitizer.ts","../src/services/tts/streaming-tts.ts","../src/services/tts/tts-client.ts","../src/store/voiceStore.ts","../src/hooks/useTTS.ts","../src/modals/chat-modal/ai-response-text-field.tsx","../src/shared/DocumentCard.tsx","../src/modals/knowlege/knowledge-file-modal.tsx","../src/utils/lowlight.ts","../src/utils/markdownRendering.tsx","../src/utils/openFileLink.ts","../src/modals/chat-modal/ai-response-action-bar.tsx","../src/components/feedback/FeedbackModal.tsx","../../bandit-themes/src/createBanditTheme.ts","../../../node_modules/@burtson-labs/ui/src/mui/index.ts","../../bandit-themes/src/semantic.ts","../../bandit-themes/src/skins.ts","../../bandit-themes/src/tenant.ts","../../bandit-themes/src/registry.ts","../../bandit-themes/src/provider.tsx","../../bandit-themes/src/TenantPreview.tsx","../src/hooks/useNotificationService.ts","../src/chat/memory-modal.tsx"],"sourcesContent":["/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n*/\n\n// Presentation helpers for the chat surfaces. Chat reads what a thing IS\n// (composer, control, attachment, conversation, status) from\n// `theme.palette.bandit`, never which colour it happened to borrow: the send\n// button used to take its colour from the file-chip token, and the live mic\n// from the error colour.\n\nimport React from \"react\";\nimport { Box, IconButton, type IconButtonProps } from \"@mui/material\";\nimport { alpha, type Theme } from \"@mui/material/styles\";\nimport type { BanditSemantics } from \"@burtson-labs/bandit-themes\";\nimport { dark as kitDark, fontMono, light as kitLight } from \"@burtson-labs/ui/tokens\";\nimport {\n type Icon,\n Archive,\n Braces,\n File,\n FileCode,\n FileImage,\n FilePdf,\n FileText,\n Sheet,\n} from \"@burtson-labs/icons/react\";\n\n/**\n * The Bandit semantics for the current theme. Themes from\n * `createBanditTheme` (every built-in skin and tenant) carry them; an\n * embedder that hands the engine its own MUI theme gets a faithful\n * derivation from the legacy `palette.chat` shape instead of a crash.\n */\nexport function chatTokens(theme: Theme): BanditSemantics {\n const own = (theme.palette as { bandit?: BanditSemantics }).bandit;\n if (own) return own;\n const p = theme.palette;\n const chat = (p as { chat?: Record<string, unknown> }).chat as\n | { shell?: string; input?: string; badge?: string; badgeHover?: string; file?: string; fileText?: string; caption?: string }\n | undefined;\n const bg = chat?.shell ?? p.background.default;\n const fg = chat?.fileText ?? p.text.primary;\n const muted = chat?.badge ?? p.action.hover;\n const border = p.divider;\n // A foreign theme has no recording colour; take the kit's rather than\n // borrowing error (a live mic is not a failure).\n const kit = p.mode === \"dark\" ? kitDark : kitLight;\n return {\n surface: {\n base: bg,\n raised: chat?.input ?? p.background.paper,\n subtle: chat?.file ?? p.background.paper,\n interactive: muted,\n interactiveHover: chat?.badgeHover ?? p.action.selected,\n overlay: p.background.paper,\n terminal: p.grey[900],\n terminalForeground: p.grey[100],\n },\n composer: {\n surface: chat?.input ?? p.background.paper,\n border,\n borderFocus: p.primary.main,\n foreground: fg,\n placeholder: p.text.secondary,\n },\n control: {\n surface: muted,\n surfaceHover: chat?.badgeHover ?? p.action.selected,\n foreground: fg,\n foregroundMuted: p.text.secondary,\n primarySurface: p.primary.main,\n primaryForeground: p.primary.contrastText,\n },\n attachment: { surface: chat?.file ?? muted, border, foreground: fg, icon: p.text.secondary },\n conversation: {\n user: { surface: muted, foreground: fg, border },\n assistant: { surface: \"transparent\", foreground: fg, border: \"transparent\" },\n border,\n divider: border,\n meta: chat?.caption ?? p.text.secondary,\n code: { surface: p.grey[900], foreground: p.grey[100] },\n },\n agent: { active: p.primary.main, idle: p.text.secondary, surface: alpha(p.primary.main, 0.12) },\n engine: { accent: p.primary.main, surface: alpha(p.primary.main, 0.12) },\n tool: { surface: muted, border, foreground: fg },\n knowledge: { accent: p.info.main, surface: alpha(p.info.main, 0.1) },\n workspace: { surface: p.background.paper, border },\n status: {\n recording: kit.recording,\n transcribing: p.info.main,\n thinking: p.primary.main,\n streaming: p.primary.main,\n syncing: p.info.main,\n temporary: p.warning.main,\n degraded: p.warning.main,\n disconnected: p.text.secondary,\n available: p.success.main,\n premium: p.primary.main,\n locked: p.text.secondary,\n info: p.info.main,\n success: p.success.main,\n warning: p.warning.main,\n error: p.error.main,\n },\n };\n}\n\n\nconst CODE_EXT = new Set([\"js\", \"jsx\", \"ts\", \"tsx\", \"py\", \"java\", \"c\", \"cpp\", \"cs\", \"go\", \"rb\", \"rs\", \"php\", \"sh\", \"sql\", \"html\", \"css\"]);\n\n/** The Burtson icon for a file, by extension. */\nexport function fileIconFor(filename: string): Icon {\n const ext = filename.split(\".\").pop()?.toLowerCase() ?? \"\";\n if (ext === \"json\" || ext === \"yaml\" || ext === \"yml\" || ext === \"toml\") return Braces;\n if (ext === \"pdf\") return FilePdf;\n if ([\"png\", \"jpg\", \"jpeg\", \"gif\", \"webp\", \"svg\", \"heic\"].includes(ext)) return FileImage;\n if ([\"csv\", \"xlsx\", \"xls\", \"tsv\"].includes(ext)) return Sheet;\n if ([\"zip\", \"gz\", \"tar\", \"7z\", \"rar\"].includes(ext)) return Archive;\n if (CODE_EXT.has(ext)) return FileCode;\n if ([\"md\", \"txt\", \"docx\", \"doc\", \"rtf\"].includes(ext)) return FileText;\n return File;\n}\n\n/** The code/metadata font from the Burtson tokens (JetBrains Mono). */\nexport const monoFont = fontMono;\n\n/** \"TS\", \"PDF\", \"MD\"… a small label beside the icon. Empty when the name has no extension. */\nexport function fileExtensionLabel(filename: string): string {\n const parts = filename.split(\".\");\n return parts.length > 1 ? (parts.pop() ?? \"\").slice(0, 4).toUpperCase() : \"\";\n}\n\nexport interface ComposerControlProps extends Omit<IconButtonProps, \"color\"> {\n /** Size of the visible circle. The hit area is never smaller than 44px on touch. */\n visualSize: number;\n /** Hit-area size on a pointer device. */\n hitSize?: number;\n surface: string;\n surfaceHover: string;\n foreground: string;\n /** A ring drawn around the circle (e.g. while recording). */\n ring?: string;\n}\n\n/**\n * A round composer control whose visible circle can stay small while the\n * touch target is 44px (WCAG 2.5.5 / Apple HIG). The hover and pressed\n * treatment sits on the circle, so the larger hit area stays invisible.\n */\nexport const ComposerControl = React.forwardRef<HTMLButtonElement, ComposerControlProps>(\n function ComposerControl(\n { visualSize, hitSize, surface, surfaceHover, foreground, ring, children, sx, ...rest },\n ref,\n ) {\n const hit = Math.max(hitSize ?? visualSize, visualSize);\n return (\n <IconButton\n ref={ref}\n {...rest}\n disableRipple\n sx={[\n (t) => ({\n width: hit,\n height: hit,\n p: 0,\n borderRadius: \"50%\",\n color: foreground,\n bgcolor: \"transparent\",\n \"@media (pointer: coarse)\": { width: Math.max(hit, 44), height: Math.max(hit, 44) },\n \"& .bandit-control-circle\": {\n width: visualSize,\n height: visualSize,\n borderRadius: \"50%\",\n display: \"grid\",\n placeItems: \"center\",\n bgcolor: surface,\n boxShadow: ring ? `0 0 0 2px ${ring}` : \"none\",\n transition: t.transitions.create([\"background-color\", \"box-shadow\"], {\n duration: t.transitions.duration.shorter,\n }),\n },\n \"&:hover\": { bgcolor: \"transparent\" },\n \"&:hover .bandit-control-circle\": { bgcolor: surfaceHover },\n \"&.Mui-focusVisible .bandit-control-circle\": {\n boxShadow: `0 0 0 2px ${t.palette.background.default}, 0 0 0 4px ${\n (t.palette as { bandit?: BanditSemantics }).bandit?.composer.borderFocus ?? t.palette.primary.main\n }`,\n },\n \"&.Mui-disabled\": { opacity: 0.5 },\n }),\n ...(Array.isArray(sx) ? sx : sx ? [sx] : []),\n ]}\n >\n <Box component=\"span\" className=\"bandit-control-circle\" aria-hidden={false}>\n {children}\n </Box>\n </IconButton>\n );\n },\n);\n\n/** App bar colours from the semantics (the old `palette.chat.appBar`). */\nexport function appBarTokens(theme: Theme) {\n const s = chatTokens(theme);\n return {\n background: s.surface.base,\n border: s.conversation.border,\n icon: s.control.foreground,\n iconHover: s.surface.interactive,\n menuBackground: s.surface.overlay,\n menuText: s.control.foreground,\n };\n}\n\n/** Suggestion chips (the old `palette.chat.suggestion`). */\nexport function suggestionTokens(theme: Theme) {\n const s = chatTokens(theme);\n return {\n background: s.surface.subtle,\n text: s.conversation.assistant.foreground,\n border: s.conversation.border,\n hoverBackground: s.surface.interactive,\n hoverBorder: theme.palette.divider,\n };\n}\n\n/** Message colours the response view reads. */\nexport function responseTokens(theme: Theme) {\n const s = chatTokens(theme);\n return {\n aiText: s.conversation.assistant.foreground,\n userBubble: s.conversation.user.surface,\n memoryText: s.status.success,\n };\n}\n","/**\n * Burtson UI design tokens. This file is the single source for colour, radius,\n * shadow and type: `scripts/theme.mjs` writes src/styles/theme.css from it, and the\n * MUI adapter (`@burtson-labs/ui/mui`) builds its palette from it, so Tailwind\n * apps and MUI apps render the same brand.\n *\n * Burtson's design language: technical, quiet, precise. Purple (`brand`) is a\n * signal colour for selection, focus, primary actions and small accents, not a\n * panel fill. Dark is a first-class palette, not an inversion of light. The\n * base colour names stay registry-compatible, so source copied into an app\n * keeps working.\n */\n\nexport type ColorToken =\n | 'background'\n | 'foreground'\n | 'surface'\n | 'surface-raised'\n | 'surface-muted'\n | 'card'\n | 'card-foreground'\n | 'popover'\n | 'popover-foreground'\n | 'primary'\n | 'primary-foreground'\n | 'secondary'\n | 'secondary-foreground'\n | 'muted'\n | 'muted-foreground'\n | 'accent'\n | 'accent-foreground'\n | 'destructive'\n | 'destructive-foreground'\n | 'success'\n | 'success-foreground'\n | 'warning'\n | 'warning-foreground'\n | 'info'\n | 'info-foreground'\n | 'recording'\n | 'recording-foreground'\n | 'border'\n | 'border-strong'\n | 'input'\n | 'ring'\n | 'brand'\n | 'brand-hover'\n | 'brand-soft'\n | 'brand-soft-foreground'\n | 'code'\n | 'code-foreground';\n\nexport type Palette = Record<ColorToken, string>;\n\n/** Burtson Labs purple. Use as signal, not wallpaper. */\nexport const brand = '#a60ee5';\n\nexport const light: Palette = {\n background: '#fbfafc',\n foreground: '#17131c',\n surface: '#ffffff',\n 'surface-raised': '#ffffff',\n 'surface-muted': '#f7f4f9',\n card: '#ffffff',\n 'card-foreground': '#17131c',\n popover: '#ffffff',\n 'popover-foreground': '#17131c',\n primary: '#8f0bc7',\n 'primary-foreground': '#ffffff',\n secondary: '#f1edf4',\n 'secondary-foreground': '#29212f',\n muted: '#f4f1f6',\n 'muted-foreground': '#6c6472',\n accent: '#f3e7fb',\n 'accent-foreground': '#561071',\n destructive: '#c92d3f',\n 'destructive-foreground': '#ffffff',\n success: '#0e7a56',\n 'success-foreground': '#ffffff',\n warning: '#9b5c08',\n 'warning-foreground': '#ffffff',\n info: '#2563eb',\n 'info-foreground': '#ffffff',\n // Live microphone capture. Red by convention, but its own token: recording\n // is a state, not an error, and apps can retint it without touching errors.\n recording: '#d6293e',\n 'recording-foreground': '#ffffff',\n border: '#e5dfe8',\n 'border-strong': '#cfc5d5',\n input: '#d8cfdd',\n ring: '#a60ee5',\n brand: '#a60ee5',\n 'brand-hover': '#8f0bc7',\n 'brand-soft': '#f5e8fc',\n 'brand-soft-foreground': '#5b1476',\n code: '#18141d',\n 'code-foreground': '#f5f0f7',\n};\n\nexport const dark: Palette = {\n background: '#0d0d12',\n foreground: '#f2eef5',\n surface: '#121218',\n 'surface-raised': '#18171f',\n 'surface-muted': '#17151c',\n card: '#14131a',\n 'card-foreground': '#f2eef5',\n popover: '#18171f',\n 'popover-foreground': '#f2eef5',\n primary: '#8f0bc7',\n 'primary-foreground': '#ffffff',\n secondary: '#211e28',\n 'secondary-foreground': '#e7e0eb',\n muted: '#1b1921',\n 'muted-foreground': '#a49ca9',\n accent: '#291734',\n 'accent-foreground': '#efd7fa',\n destructive: '#ef5b65',\n 'destructive-foreground': '#1b090b',\n success: '#36c58d',\n 'success-foreground': '#07160f',\n warning: '#f3b24c',\n 'warning-foreground': '#201304',\n info: '#6ea8ff',\n 'info-foreground': '#071226',\n recording: '#f2616d',\n 'recording-foreground': '#1b090b',\n border: '#2a2732',\n 'border-strong': '#403a49',\n input: '#34303d',\n ring: '#c65ef1',\n brand: '#c65ef1',\n 'brand-hover': '#d384f3',\n 'brand-soft': '#291734',\n 'brand-soft-foreground': '#efd7fa',\n code: '#09090d',\n 'code-foreground': '#f5f0f7',\n};\n\nexport const radius = {\n xs: '0.375rem',\n sm: '0.5rem',\n md: '0.625rem',\n lg: '0.75rem',\n xl: '1rem',\n full: '9999px',\n} as const;\n\nexport const shadow = {\n xs: '0 1px 2px rgb(10 8 14 / 0.05)',\n sm: '0 1px 3px rgb(10 8 14 / 0.08), 0 1px 2px rgb(10 8 14 / 0.05)',\n md: '0 10px 30px rgb(10 8 14 / 0.10), 0 2px 8px rgb(10 8 14 / 0.06)',\n focus: '0 0 0 3px color-mix(in srgb, var(--ring) 22%, transparent)',\n} as const;\n\nexport const fontSans =\n 'Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif';\nexport const fontMono =\n '\"JetBrains Mono\", \"SFMono-Regular\", Consolas, \"Liberation Mono\", monospace';\n\n/**\n * Motion. Surfaces enter from where they come from: popovers and menus slide a\n * few pixels from their trigger side (--bl-tx/--bl-ty, set per side by the\n * component), dialogs zoom slightly, sheets glide in with a drawer ease, and\n * everything leaves faster than it arrived. prefers-reduced-motion turns all\n * of it off (theme.css).\n */\nexport const motion = {\n animations: {\n in: 'bl-in 200ms cubic-bezier(0.16, 1, 0.3, 1)',\n out: 'bl-out 140ms cubic-bezier(0.4, 0, 1, 1) forwards',\n 'fade-in': 'bl-fade-in 200ms ease-out',\n 'fade-out': 'bl-fade-out 150ms ease-in forwards',\n 'sheet-in': 'bl-sheet-in 340ms cubic-bezier(0.32, 0.72, 0, 1)',\n 'sheet-out': 'bl-sheet-out 220ms cubic-bezier(0.4, 0, 1, 1) forwards',\n 'accordion-down': 'bl-accordion-down 200ms cubic-bezier(0.16, 1, 0.3, 1)',\n 'accordion-up': 'bl-accordion-up 160ms ease-out',\n 'collapsible-down': 'bl-collapsible-down 200ms cubic-bezier(0.16, 1, 0.3, 1)',\n 'collapsible-up': 'bl-collapsible-up 160ms ease-out',\n },\n keyframes: {\n 'bl-in': {\n from: {\n opacity: '0',\n transform: 'translate3d(var(--bl-tx, 0), var(--bl-ty, 0), 0) scale(var(--bl-scale, 0.96))',\n },\n },\n 'bl-out': {\n to: {\n opacity: '0',\n transform: 'translate3d(var(--bl-tx, 0), var(--bl-ty, 0), 0) scale(var(--bl-scale, 0.96))',\n },\n },\n 'bl-fade-in': { from: { opacity: '0' } },\n 'bl-fade-out': { to: { opacity: '0' } },\n 'bl-sheet-in': {\n from: { transform: 'translate3d(var(--bl-sheet-x, 100%), var(--bl-sheet-y, 0), 0)' },\n },\n 'bl-sheet-out': {\n to: { transform: 'translate3d(var(--bl-sheet-x, 100%), var(--bl-sheet-y, 0), 0)' },\n },\n 'bl-accordion-down': {\n from: { height: '0' },\n to: { height: 'var(--radix-accordion-content-height)' },\n },\n 'bl-accordion-up': {\n from: { height: 'var(--radix-accordion-content-height)' },\n to: { height: '0' },\n },\n 'bl-collapsible-down': {\n from: { height: '0' },\n to: { height: 'var(--radix-collapsible-content-height)' },\n },\n 'bl-collapsible-up': {\n from: { height: 'var(--radix-collapsible-content-height)' },\n to: { height: '0' },\n },\n },\n} as const;\n\n/**\n * Motion timing for code that animates outside CSS (MUI transitions, JS\n * animation). Things leave faster than they arrive; `emphasis` is for\n * surfaces that change the layout (drawers, dialogs, expanding panels).\n */\nexport const duration = { fast: 120, standard: 180, emphasis: 240, exit: 140 } as const;\nexport const easing = {\n standard: 'cubic-bezier(0.2, 0, 0, 1)',\n emphasized: 'cubic-bezier(0.16, 1, 0.3, 1)',\n exit: 'cubic-bezier(0.4, 0, 1, 1)',\n} as const;\n\n/** Named elevation levels over the shadow scale: 0 flat, 1 resting control, 2 card, 3 floating. */\nexport const elevation = { 0: 'none', 1: shadow.xs, 2: shadow.sm, 3: shadow.md } as const;\n\n// ─── Accent ────────────────────────────────────────────────────────────────\n\nexport type AccentTokens = Pick<\n Palette,\n | 'primary'\n | 'primary-foreground'\n | 'brand'\n | 'brand-hover'\n | 'brand-soft'\n | 'brand-soft-foreground'\n | 'accent'\n | 'accent-foreground'\n | 'ring'\n>;\n\ntype Rgb = [number, number, number];\n\nfunction parseHex(hex: string): Rgb {\n const h = hex.replace('#', '').trim();\n const full = h.length === 3 ? [...h].map((c) => c + c).join('') : h.slice(0, 6);\n if (!/^[0-9a-f]{6}$/i.test(full)) throw new Error(`Not a hex colour: ${hex}`);\n return [0, 2, 4].map((i) => parseInt(full.slice(i, i + 2), 16)) as Rgb;\n}\n\nconst toHex = (rgb: Rgb) =>\n '#' +\n rgb\n .map((v) =>\n Math.round(Math.max(0, Math.min(255, v)))\n .toString(16)\n .padStart(2, '0'),\n )\n .join('');\n\n/** Mix `a` toward `b` by `t` (0 = a, 1 = b), in sRGB. */\nexport function mix(a: string, b: string, t: number): string {\n const x = parseHex(a);\n const y = parseHex(b);\n return toHex([0, 1, 2].map((i) => x[i]! + (y[i]! - x[i]!) * t) as Rgb);\n}\n\nfunction luminance(hex: string): number {\n const c = parseHex(hex).map((v) => {\n const s = v / 255;\n return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;\n });\n return 0.2126 * c[0]! + 0.7152 * c[1]! + 0.0722 * c[2]!;\n}\n\n/** WCAG contrast ratio between two hex colours. */\nexport function contrast(a: string, b: string): number {\n const [hi, lo] = [luminance(a), luminance(b)].sort((m, n) => n - m) as [number, number];\n return (hi + 0.05) / (lo + 0.05);\n}\n\n/** Step `color` toward `target` until it reaches `ratio` against `against`. */\nfunction ensureContrast(color: string, against: string, ratio: number, target: string): string {\n let c = color;\n for (let i = 0; i < 20 && contrast(c, against) < ratio; i++) c = mix(c, target, 0.1);\n return c;\n}\n\n/**\n * Brand tokens for any accent colour, kept legible: the primary fill always\n * carries its foreground at 4.5:1, and the brand colour used for links, focus\n * and selected text reads at 4.5:1 on the page background. Tenants and skins\n * choose an accent; they never choose the contrast.\n */\nexport function accentTokens(accent: string, mode: 'light' | 'dark'): AccentTokens {\n const p = mode === 'dark' ? dark : light;\n const white = '#ffffff';\n // A dark foreground on light fills (yellow, cyan) instead of forcing white.\n // White text on the fill whenever darkening the accent a little gets there\n // (purples, blues, greens, reds: the usual brand colours, which read as the\n // brand when they carry white). Dark text only for genuinely light accents\n // such as yellow or pale cyan, where white would need the colour ruined.\n const onFill = contrast(accent, white) >= 2.6 ? white : '#111111';\n const primary =\n onFill === white\n ? ensureContrast(accent, white, 4.5, '#000000')\n : ensureContrast(accent, '#111111', 4.5, white);\n const brand =\n mode === 'dark'\n ? ensureContrast(mix(accent, white, 0.12), p.background, 4.5, white)\n : ensureContrast(accent, p.background, 4.5, '#000000');\n const brandHover = mode === 'dark' ? mix(brand, white, 0.18) : mix(brand, '#000000', 0.14);\n const soft = mode === 'dark' ? mix(p.background, accent, 0.16) : mix(white, accent, 0.1);\n const softFg = mode === 'dark' ? mix(accent, white, 0.72) : mix(accent, '#000000', 0.55);\n return {\n primary,\n 'primary-foreground': onFill,\n brand,\n 'brand-hover': brandHover,\n 'brand-soft': soft,\n 'brand-soft-foreground': ensureContrast(softFg, soft, 4.5, mode === 'dark' ? white : '#000000'),\n accent: soft,\n 'accent-foreground': ensureContrast(softFg, soft, 4.5, mode === 'dark' ? white : '#000000'),\n ring: brand,\n };\n}\n\nexport const tokens = {\n brand,\n light,\n dark,\n radius,\n shadow,\n elevation,\n motion,\n duration,\n easing,\n fontSans,\n fontMono,\n} as const;\nexport default tokens;\n","import { create } from \"zustand\";\n\n/**\n * The Canvas: a side-by-side editable document/code surface. The chat can drop\n * a generated answer into it (\"Open in canvas\"), the user edits it live, and it\n * can be copied or downloaded. Kept deliberately small — a single source of\n * truth that both the chat (entry points) and the CanvasPanel (UI) read from.\n */\ninterface CanvasState {\n open: boolean;\n title: string;\n content: string;\n /** Set when the canvas holds code (e.g. \"ts\", \"py\") so the editor uses a mono font. */\n language?: string;\n openCanvas: (args: { content: string; title?: string; language?: string }) => void;\n setContent: (content: string) => void;\n setTitle: (title: string) => void;\n close: () => void;\n}\n\nexport const useCanvasStore = create<CanvasState>((set) => ({\n open: false,\n title: \"\",\n content: \"\",\n language: undefined,\n openCanvas: ({ content, title, language }) =>\n set({ open: true, content, title: title?.trim() || \"Untitled\", language }),\n setContent: (content) => set({ content }),\n setTitle: (title) => set({ title }),\n close: () => set({ open: false }),\n}));\n","/*\n Engine icons. Every icon is a Burtson Icons MUI SvgIcon\n (@burtson-labs/icons/mui/<name>), so `fontSize`, `color`, `sx`, `htmlColor`\n and `titleAccess` work exactly as they do with @mui/icons-material. The\n export names are the Material names the engine has always used, so a call\n site reads the same whichever set drew the glyph. Add an icon here rather\n than importing a package path from a component; the per-icon entries keep\n the bundle to the icons actually used.\n*/\n\nexport { AlertCircle as ErrorOutlineIcon, AlertCircle as ErrorIcon } from \"@burtson-labs/icons/mui/alert-circle\";\nexport { AlertTriangle as WarningIcon, AlertTriangle as TriangleAlertIcon } from \"@burtson-labs/icons/mui/alert-triangle\";\nexport { Archive as ArchiveIcon } from \"@burtson-labs/icons/mui/archive\";\nexport { ArrowDown as ArrowDownwardIcon } from \"@burtson-labs/icons/mui/arrow-down\";\nexport { ArrowUp as ArrowUpwardIcon } from \"@burtson-labs/icons/mui/arrow-up\";\nexport { BookOpen as MenuBookIcon } from \"@burtson-labs/icons/mui/book-open\";\nexport { BookOpenText as AutoStoriesIcon } from \"@burtson-labs/icons/mui/book-open-text\";\nexport { Braces as DataObjectIcon } from \"@burtson-labs/icons/mui/braces\";\nexport { BrushCleaning as CleaningServicesIcon } from \"@burtson-labs/icons/mui/brush-cleaning\";\nexport { Check as CheckIcon } from \"@burtson-labs/icons/mui/check\";\nexport { CheckCircle as CheckCircleIcon } from \"@burtson-labs/icons/mui/check-circle\";\nexport { ChevronDown as ExpandMoreIcon } from \"@burtson-labs/icons/mui/chevron-down\";\nexport { ChevronLeft as ChevronLeftIcon } from \"@burtson-labs/icons/mui/chevron-left\";\nexport { ChevronUp as ExpandLessIcon } from \"@burtson-labs/icons/mui/chevron-up\";\nexport { Cloud as CloudIcon } from \"@burtson-labs/icons/mui/cloud\";\nexport { CloudCheck as CloudDoneIcon } from \"@burtson-labs/icons/mui/cloud-check\";\nexport { CloudOff as CloudOffIcon } from \"@burtson-labs/icons/mui/cloud-off\";\nexport { CloudSync as CloudSyncIcon } from \"@burtson-labs/icons/mui/cloud-sync\";\nexport { Code as CodeIcon } from \"@burtson-labs/icons/mui/code\";\nexport { Copy as ContentCopyIcon } from \"@burtson-labs/icons/mui/copy\";\nexport { Database as StorageIcon } from \"@burtson-labs/icons/mui/database\";\nexport { Download as DownloadIcon } from \"@burtson-labs/icons/mui/download\";\nexport { EarOff as HearingDisabledIcon } from \"@burtson-labs/icons/mui/ear-off\";\nexport { Edit as EditIcon } from \"@burtson-labs/icons/mui/edit\";\nexport { EditSquare as ComposeIcon } from \"@burtson-labs/icons/mui/edit-square\";\nexport { Eye as PreviewIcon, Eye as VisibilityIcon } from \"@burtson-labs/icons/mui/eye\";\nexport { FilePdf as PictureAsPdfIcon } from \"@burtson-labs/icons/mui/file-pdf\";\nexport { FileText as DescriptionIcon, FileText as ArticleIcon } from \"@burtson-labs/icons/mui/file-text\";\nexport { FileUp as FileUploadIcon, FileUp as UploadFileIcon } from \"@burtson-labs/icons/mui/file-up\";\nexport { Folder as FolderIcon } from \"@burtson-labs/icons/mui/folder\";\nexport { FolderOpen as FolderOpenIcon } from \"@burtson-labs/icons/mui/folder-open\";\nexport { Ghost as GhostIcon } from \"@burtson-labs/icons/mui/ghost\";\nexport { Globe as PublicIcon } from \"@burtson-labs/icons/mui/globe\";\nexport { Grip as DragIndicatorIcon } from \"@burtson-labs/icons/mui/grip\";\nexport { History as HistoryIcon } from \"@burtson-labs/icons/mui/history\";\nexport { Home as HomeIcon } from \"@burtson-labs/icons/mui/home\";\nexport { Info as InfoIcon, Info as InfoOutlinedIcon } from \"@burtson-labs/icons/mui/info\";\nexport { LayoutGrid as ViewModuleIcon, LayoutGrid as ViewModuleOutlinedIcon } from \"@burtson-labs/icons/mui/layout-grid\";\nexport { Link as LinkIcon } from \"@burtson-labs/icons/mui/link\";\nexport { List as ViewListIcon } from \"@burtson-labs/icons/mui/list\";\nexport { Lock as LockIcon } from \"@burtson-labs/icons/mui/lock\";\nexport { Maximize as FullscreenIcon } from \"@burtson-labs/icons/mui/maximize\";\nexport { MemoryLayers as PsychologyIcon, MemoryLayers as MemoryIcon } from \"@burtson-labs/icons/mui/memory-layers\";\nexport { MessageSquare as FeedbackIcon, MessageSquare as ChatIcon } from \"@burtson-labs/icons/mui/message-square\";\nexport { Mic as RecordVoiceOverIcon, Mic as MicIcon } from \"@burtson-labs/icons/mui/mic\";\nexport { Minimize as FullscreenExitIcon } from \"@burtson-labs/icons/mui/minimize\";\nexport { Minus as MinimizeIcon } from \"@burtson-labs/icons/mui/minus\";\nexport { NotebookPen as NotesIcon, NotebookPen as NotesIconOutlined, NotebookPen as EditNoteOutlinedIcon } from \"@burtson-labs/icons/mui/notebook-pen\";\nexport { Palette as BrushIcon } from \"@burtson-labs/icons/mui/palette\";\nexport { PanelLeft as PanelLeftIcon } from \"@burtson-labs/icons/mui/panel-left\";\nexport { Pin as PushPinIcon } from \"@burtson-labs/icons/mui/pin\";\nexport { PinOff as PushPinOutlinedIcon } from \"@burtson-labs/icons/mui/pin-off\";\nexport { Play as PlayArrowIcon, Play as PlayArrowRoundedIcon } from \"@burtson-labs/icons/mui/play\";\nexport { Plus as AddIcon } from \"@burtson-labs/icons/mui/plus\";\nexport { PlusCircle as AddCircleIcon } from \"@burtson-labs/icons/mui/plus-circle\";\nexport { RectangleHorizontal as Crop169Icon } from \"@burtson-labs/icons/mui/rectangle-horizontal\";\nexport { RectangleVertical as CropPortraitIcon } from \"@burtson-labs/icons/mui/rectangle-vertical\";\nexport { Refresh as SyncIcon, Refresh as RefreshIcon } from \"@burtson-labs/icons/mui/refresh\";\nexport { Rocket as RocketLaunchOutlinedIcon } from \"@burtson-labs/icons/mui/rocket\";\nexport { RotateCcw as RotateLeftIcon, RotateCcw as RestoreIcon } from \"@burtson-labs/icons/mui/rotate-ccw\";\nexport { RotateCw as RotateRightIcon } from \"@burtson-labs/icons/mui/rotate-cw\";\nexport { Save as SaveIcon } from \"@burtson-labs/icons/mui/save\";\nexport { ScanFace as FaceRetouchingNaturalIcon } from \"@burtson-labs/icons/mui/scan-face\";\nexport { Search as SearchIcon } from \"@burtson-labs/icons/mui/search\";\nexport { Send as SendIcon } from \"@burtson-labs/icons/mui/send\";\nexport { Settings as SettingsIcon } from \"@burtson-labs/icons/mui/settings\";\nexport { ShieldProof as HealthAndSafetyIcon } from \"@burtson-labs/icons/mui/shield-proof\";\nexport { Sliders as TuneIcon } from \"@burtson-labs/icons/mui/sliders\";\nexport { Sparkles as AutoAwesomeIcon } from \"@burtson-labs/icons/mui/sparkles\";\nexport { Square as StopIcon, Square as CropSquareIcon } from \"@burtson-labs/icons/mui/square\";\nexport { Trash as DeleteIcon } from \"@burtson-labs/icons/mui/trash\";\nexport { Type as TextFieldsIcon } from \"@burtson-labs/icons/mui/type\";\nexport { Upload as UploadIcon, Upload as PublishIcon } from \"@burtson-labs/icons/mui/upload\";\nexport { User as PersonIcon } from \"@burtson-labs/icons/mui/user\";\nexport { UserCog as ManageAccountsOutlinedIcon } from \"@burtson-labs/icons/mui/user-cog\";\nexport { Users as GroupIcon } from \"@burtson-labs/icons/mui/users\";\nexport { Waveform as GraphicEqIcon } from \"@burtson-labs/icons/mui/waveform\";\nexport { Wifi as SignalWifi2BarIcon, Wifi as SignalWifiStatusbar4BarIcon, Wifi as WifiIcon } from \"@burtson-labs/icons/mui/wifi\";\nexport { WifiOff as WifiOffIcon } from \"@burtson-labs/icons/mui/wifi-off\";\nexport { Wrench as BuildIcon } from \"@burtson-labs/icons/mui/wrench\";\nexport { X as CloseIcon } from \"@burtson-labs/icons/mui/x\";\nexport { ZoomIn as ZoomInIcon } from \"@burtson-labs/icons/mui/zoom-in\";\nexport { ZoomOut as ZoomOutIcon } from \"@burtson-labs/icons/mui/zoom-out\";\n\nexport type { MuiIcon, MuiIconProps } from \"@burtson-labs/icons/mui\";\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-4407-C60D14\nconst __banditFingerprint_tts_voiceServicets = 'BL-FP-A717E5-B818';\nconst __auditTrail_tts_voiceServicets = 'BL-AU-MGOIKVW0-637Y';\n// File: voiceService.ts | Path: src/services/tts/voiceService.ts | Hash: 4407b818\n\nimport { usePackageSettingsStore } from '../../store/packageSettingsStore';\nimport { authenticationService } from '../auth/authenticationService';\nimport { debugLogger } from '../logging/debugLogger';\n\nexport interface VoiceModelsResponse {\n models: string[];\n defaultModel: string;\n fallbackModel: string;\n}\n\nexport class VoiceService {\n private static instance: VoiceService;\n private cachedModels: VoiceModelsResponse | null = null;\n private cacheTimestamp: number = 0;\n private readonly CACHE_DURATION = 5 * 60 * 1000; // 5 minutes\n\n private constructor() {}\n\n public static getInstance(): VoiceService {\n if (!VoiceService.instance) {\n VoiceService.instance = new VoiceService();\n }\n return VoiceService.instance;\n }\n\n private getGatewayApiUrl(): string {\n return usePackageSettingsStore.getState().settings?.gatewayApiUrl || '';\n }\n\n private isValid(data: unknown): data is VoiceModelsResponse {\n if (typeof data !== 'object' || data === null) {\n return false;\n }\n\n const record = data as Record<string, unknown>;\n return Array.isArray(record.models) &&\n record.models.every((item) => typeof item === 'string') &&\n typeof record.defaultModel === 'string' &&\n typeof record.fallbackModel === 'string';\n }\n\n private isCacheValid(): boolean {\n return this.cachedModels !== null && \n (Date.now() - this.cacheTimestamp) < this.CACHE_DURATION;\n }\n\n public async fetchAvailableVoices(): Promise<VoiceModelsResponse> {\n // Return cached data if valid\n if (this.isCacheValid()) {\n debugLogger.debug('Returning cached voice models');\n return this.cachedModels!;\n }\n\n const gatewayUrl = this.getGatewayApiUrl();\n if (!gatewayUrl) {\n debugLogger.error('Gateway API URL not configured');\n throw new Error('Gateway API URL not configured');\n }\n\n // Check if we have a valid JWT token before making the request\n const token = authenticationService.getToken();\n if (!token) {\n debugLogger.warn('No JWT token available - skipping voice models fetch');\n const emptyModels: VoiceModelsResponse = {\n models: [],\n defaultModel: \"\",\n fallbackModel: \"\"\n };\n return emptyModels;\n }\n\n // Validate token is not expired\n if (authenticationService.isTokenExpired(token)) {\n debugLogger.warn('JWT token is expired - skipping voice models fetch');\n const emptyModels: VoiceModelsResponse = {\n models: [],\n defaultModel: \"\",\n fallbackModel: \"\"\n };\n return emptyModels;\n }\n\n try {\n debugLogger.debug('Fetching voice models from gateway API...');\n \n const response = await fetch(`${gatewayUrl}/tts/available-models`, {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json'\n }\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch voice models: ${response.status}`);\n }\n\n const data = await response.json();\n \n if (!this.isValid(data)) {\n throw new Error('Invalid voice models response format');\n }\n\n // Cache the response\n this.cachedModels = data;\n this.cacheTimestamp = Date.now();\n\n debugLogger.debug('Voice models fetched successfully', data);\n return data;\n\n } catch (error) {\n debugLogger.error('Error fetching voice models:', { error: error instanceof Error ? error.message : String(error) });\n \n const emptyModels: VoiceModelsResponse = {\n models: [],\n defaultModel: \"\",\n fallbackModel: \"\"\n };\n\n debugLogger.warn('Voice service unavailable - no models available');\n return emptyModels;\n }\n }\n\n public clearCache(): void {\n this.cachedModels = null;\n this.cacheTimestamp = 0;\n debugLogger.debug('Voice models cache cleared');\n }\n}\n\nexport const voiceService = VoiceService.getInstance();\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-DB79-A74813\nconst __banditFingerprint_tts_ttsSanitizerts = 'BL-FP-EBEA84-E4AB';\nconst __auditTrail_tts_ttsSanitizerts = 'BL-AU-MGOIKVW0-B1P2';\n// File: ttsSanitizer.ts | Path: src/services/tts/ttsSanitizer.ts | Hash: db79e4ab\n\nexport const stripHtmlTags = (text: string): string =>\n text.replace(/<[^>]*>/g, '');\n\nexport const stripMarkdown = (text: string): string =>\n text.replace(/[*_~`]+/g, '');\n\nexport const stripEmojis = (text: string): string =>\n text.replace(/[\\p{Emoji_Presentation}\\p{Extended_Pictographic}]/gu, '');\n\nexport const simplifyLinks = (text: string): string =>\n text.replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, '$1');\n\nexport const stripListBullets = (text: string): string =>\n text.replace(/^\\s*[*\\-]\\s+/gm, '');\n\nexport const normalizeWhitespace = (text: string): string =>\n text.replace(/\\s{2,}/g, ' ').trim();\n\nexport const sanitizeForTTS = (text: string): string => {\n return normalizeWhitespace(\n stripListBullets(\n stripEmojis(\n stripMarkdown(\n simplifyLinks(\n stripHtmlTags(text)\n )\n )\n )\n )\n );\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-95DD-07F17E\nconst __banditFingerprint_tts_streamingttsts = 'BL-FP-81BC0B-12CA';\nconst __auditTrail_tts_streamingttsts = 'BL-AU-MGOIKVW0-6I17';\n// File: streaming-tts.ts | Path: src/services/tts/streaming-tts.ts | Hash: 95dd12ca\n\nimport { Observable, BehaviorSubject, Subject } from 'rxjs';\nimport type { Subscriber } from 'rxjs';\nimport { debugLogger } from '../logging/debugLogger';\nimport { usePackageSettingsStore } from '../../store/packageSettingsStore';\nimport { getOrAppendAuthHeader } from './tts-client';\n\nexport enum TTSState {\n IDLE = 'IDLE',\n LOADING = 'LOADING',\n PLAYING = 'PLAYING',\n PAUSED = 'PAUSED',\n ERROR = 'ERROR'\n}\n\nexport interface TTSProgress {\n currentTime: number;\n duration: number;\n percentage: number;\n buffered: number;\n state: TTSState;\n}\n\nexport interface TTSOptions {\n useStreaming?: boolean;\n useRealtime?: boolean;\n onStateChange?: (state: TTSState) => void;\n onProgress?: (progress: TTSProgress) => void;\n}\n\n/**\n * Streaming TTS client with playback controls\n */\nexport class StreamingTTSClient {\n private static instance: StreamingTTSClient;\n \n private audio: HTMLAudioElement | null = null;\n private objectUrl: string | null = null;\n private controller: AbortController | null = null;\n \n // Store event handler references for proper cleanup\n private audioHandlers = new Map<string, EventListener>();\n \n // State management\n private stateSubject = new BehaviorSubject<TTSState>(TTSState.IDLE);\n private progressSubject = new Subject<TTSProgress>();\n \n private constructor() {}\n \n public static getInstance(): StreamingTTSClient {\n if (!StreamingTTSClient.instance) {\n StreamingTTSClient.instance = new StreamingTTSClient();\n }\n return StreamingTTSClient.instance;\n }\n \n /**\n * Get current state\n */\n public getCurrentState(): TTSState {\n return this.stateSubject.value;\n }\n \n /**\n * Get state changes as observable\n */\n public getStateChanges(): Observable<TTSState> {\n return this.stateSubject.asObservable();\n }\n \n /**\n * Get progress updates as observable\n */\n public getProgress(): Observable<TTSProgress> {\n return this.progressSubject.asObservable();\n }\n \n /**\n * Speak text with simple streaming\n */\n public speakStream(text: string, voice: string, options: TTSOptions = {}): Observable<void> {\n return new Observable<void>((subscriber) => {\n this.performSimpleStreaming(text, voice, options, subscriber);\n });\n }\n \n /**\n * Simple streaming implementation - no queues, just direct playback\n */\n private async performSimpleStreaming(\n text: string,\n voice: string,\n options: TTSOptions,\n subscriber: Subscriber<void>\n ): Promise<void> {\n try {\n // Clean up any previous audio completely\n this.cleanup();\n \n // Brief delay to ensure cleanup is complete\n await new Promise(resolve => setTimeout(resolve, 10));\n \n // Set loading state\n this.setState(TTSState.LOADING);\n \n const gatewayUrl = usePackageSettingsStore.getState().settings?.gatewayApiUrl;\n if (!gatewayUrl) {\n throw new Error('Gateway API URL not configured');\n }\n \n // Create abort controller for this request\n this.controller = new AbortController();\n \n // Make the TTS request\n const response = await fetch(`${gatewayUrl}/tts`, {\n method: 'POST',\n headers: {\n ...getOrAppendAuthHeader(),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n Text: text,\n ModelName: voice\n }),\n signal: this.controller.signal\n });\n \n // Check if request was aborted\n if (this.controller.signal.aborted) {\n subscriber.complete();\n return;\n }\n \n if (!response.ok) {\n throw new Error(`TTS request failed: ${response.status} ${response.statusText}`);\n }\n \n // Get the audio blob\n const audioBlob = await response.blob();\n \n // Check if request was aborted after blob download\n if (this.controller.signal.aborted) {\n subscriber.complete();\n return;\n }\n \n if (!audioBlob || audioBlob.size === 0) {\n throw new Error('Received empty audio response');\n }\n \n // Create object URL and audio element\n this.objectUrl = URL.createObjectURL(audioBlob);\n this.audio = new Audio(this.objectUrl);\n \n // Set up audio element\n this.audio.autoplay = false;\n this.audio.preload = 'auto';\n \n // Set up event listeners\n this.setupAudioListeners(subscriber, options);\n \n // Check one more time if we were stopped before starting to load\n if (this.controller.signal.aborted) {\n this.cleanup();\n subscriber.complete();\n return;\n }\n \n // Start loading the audio\n this.audio.load();\n \n } catch (error) {\n // Handle abort errors gracefully\n if (error instanceof Error && error.name === 'AbortError') {\n this.setState(TTSState.IDLE);\n subscriber.complete();\n return;\n }\n \n debugLogger.error('TTS streaming failed:', { error: error instanceof Error ? error.message : String(error) });\n this.setState(TTSState.ERROR);\n subscriber.error(error);\n }\n }\n \n /**\n * Set up audio event listeners\n */\n private setupAudioListeners(subscriber: Subscriber<void>, options: TTSOptions): void {\n if (!this.audio) return;\n \n // Clear any existing handlers\n this.audioHandlers.clear();\n \n // When audio can start playing\n const canPlayThroughHandler = () => {\n // Check if we were stopped during loading\n if (!this.audio || this.getCurrentState() !== TTSState.LOADING || (this.controller && this.controller.signal.aborted)) {\n return;\n }\n \n this.setState(TTSState.PLAYING);\n this.audio.play().catch((error) => {\n debugLogger.error('Failed to start audio playback:', error);\n this.setState(TTSState.ERROR);\n subscriber.error(error);\n });\n };\n \n // When audio starts playing\n const playHandler = () => {\n this.setState(TTSState.PLAYING);\n subscriber.next();\n };\n \n // When audio is paused\n const pauseHandler = () => {\n if (this.getCurrentState() !== TTSState.IDLE) {\n this.setState(TTSState.PAUSED);\n }\n };\n \n // When audio ends\n const endedHandler = () => {\n this.setState(TTSState.IDLE);\n \n // Clear handlers to prevent memory leaks\n this.clearAudioHandlers();\n \n subscriber.complete();\n };\n \n // Progress updates\n const timeUpdateHandler = () => {\n if (this.audio && this.audio.duration) {\n const buffered = this.audio.buffered.length > 0 ? this.audio.buffered.end(0) : 0;\n const progress: TTSProgress = {\n currentTime: this.audio.currentTime,\n duration: this.audio.duration,\n percentage: (this.audio.currentTime / this.audio.duration) * 100,\n buffered,\n state: this.getCurrentState()\n };\n this.progressSubject.next(progress);\n if (options.onProgress) {\n options.onProgress(progress);\n }\n }\n };\n \n // Error handling\n const errorHandler = (event: Event) => {\n debugLogger.error('Audio playback error:', event);\n this.setState(TTSState.ERROR);\n subscriber.error(new Error('Audio playback failed'));\n };\n \n // Store handler references for cleanup\n this.audioHandlers.set('canplaythrough', canPlayThroughHandler);\n this.audioHandlers.set('play', playHandler);\n this.audioHandlers.set('pause', pauseHandler);\n this.audioHandlers.set('ended', endedHandler);\n this.audioHandlers.set('timeupdate', timeUpdateHandler);\n this.audioHandlers.set('error', errorHandler);\n \n // Add event listeners\n this.audio.addEventListener('canplaythrough', canPlayThroughHandler);\n this.audio.addEventListener('play', playHandler);\n this.audio.addEventListener('pause', pauseHandler);\n this.audio.addEventListener('ended', endedHandler);\n this.audio.addEventListener('timeupdate', timeUpdateHandler);\n this.audio.addEventListener('error', errorHandler);\n }\n \n /**\n * Stop playback\n */\n public stop(): void {\n // Abort any ongoing fetch request\n if (this.controller) {\n this.controller.abort();\n this.controller = null;\n }\n \n // Stop and reset audio\n if (this.audio) {\n this.audio.pause();\n this.audio.currentTime = 0;\n \n // Remove all event listeners to prevent any further callbacks\n this.audio.onloadstart = null;\n this.audio.oncanplaythrough = null;\n this.audio.onplay = null;\n this.audio.onpause = null;\n this.audio.onended = null;\n this.audio.ontimeupdate = null;\n this.audio.onerror = null;\n }\n \n // Set to IDLE state first, then cleanup\n this.setState(TTSState.IDLE);\n this.cleanup();\n }\n \n /**\n * Pause playback\n */\n public pause(): void {\n if (this.audio && this.getCurrentState() === TTSState.PLAYING) {\n this.audio.pause();\n this.setState(TTSState.PAUSED);\n }\n }\n \n /**\n * Resume playback\n */\n public resume(): void {\n if (this.audio && this.getCurrentState() === TTSState.PAUSED) {\n this.audio.play().catch((error) => {\n debugLogger.error('Failed to resume audio:', error);\n this.setState(TTSState.ERROR);\n });\n this.setState(TTSState.PLAYING);\n }\n }\n \n /**\n * Set state and notify observers\n */\n private setState(state: TTSState): void {\n this.stateSubject.next(state);\n }\n \n /**\n * Reset the TTS client completely - useful for model changes\n */\n public reset(): void {\n // Stop everything first\n this.stop();\n \n // Force reset all internal state\n this.audio = null;\n this.objectUrl = null;\n this.controller = null;\n \n // Reset state subjects\n this.stateSubject.next(TTSState.IDLE);\n }\n\n /**\n * Clear only the audio event handlers\n */\n private clearAudioHandlers(): void {\n if (this.audio) {\n // Remove all event listeners using stored handler references\n for (const [eventType, handler] of this.audioHandlers) {\n this.audio.removeEventListener(eventType, handler);\n }\n }\n this.audioHandlers.clear();\n }\n\n /**\n * Clean up resources\n */\n private cleanup(): void {\n if (this.audio) {\n // Remove all event listeners using stored handler references\n this.clearAudioHandlers();\n \n // Stop and reset audio\n try {\n this.audio.pause();\n this.audio.currentTime = 0;\n this.audio.src = '';\n this.audio.load();\n } catch (error) {\n // Ignore cleanup errors\n }\n \n this.audio = null;\n }\n \n if (this.objectUrl) {\n URL.revokeObjectURL(this.objectUrl);\n this.objectUrl = null;\n }\n \n if (this.controller) {\n this.controller.abort();\n this.controller = null;\n }\n }\n}\n\n// Export singleton instance\nexport const getStreamingTTSClient = (): StreamingTTSClient => {\n return StreamingTTSClient.getInstance();\n};\n\n// Convenience functions\nexport const speakStream = (text: string, voice: string, options?: TTSOptions): Observable<void> => {\n return getStreamingTTSClient().speakStream(text, voice, options);\n};\n\nexport const stopTTS = (): void => {\n getStreamingTTSClient().stop();\n};\n\nexport const resetTTS = (): void => {\n getStreamingTTSClient().reset();\n};\n\nexport const pauseTTS = (): void => {\n getStreamingTTSClient().pause();\n};\n\nexport const resumeTTS = (): void => {\n getStreamingTTSClient().resume();\n};\n\nexport const getTTSState = (): TTSState => {\n return getStreamingTTSClient().getCurrentState();\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-4A41-987E60\nconst __banditFingerprint_tts_ttsclientts = 'BL-FP-80ED0B-94B2';\nconst __auditTrail_tts_ttsclientts = 'BL-AU-MGOIKVW0-9HOM';\n// File: tts-client.ts | Path: src/services/tts/tts-client.ts | Hash: 4a4194b2\n\nimport { Observable, Subscription } from 'rxjs';\nimport { authenticationService } from \"../auth/authenticationService\";\nimport { useVoiceStore } from '../../store/voiceStore';\nimport { sanitizeForTTS } from './ttsSanitizer';\nimport { usePackageSettingsStore } from '../../store/packageSettingsStore';\nimport { debugLogger } from '../logging/debugLogger';\n\nconst getGatewayApiUrl = () => usePackageSettingsStore.getState().settings?.gatewayApiUrl || '';\n\n/**\n * An observable that emits when the generated audio has begun playing. \n * @param text The text to be spoken\n * @param voice The voice to be used (will fallback to default if not available)\n * @returns An observable that emits when the audio has started playing\n */\nexport const speak = (text: string, voice: string) => {\n if (!text) {\n debugLogger.warn(\"No text provided to TTS\");\n return new Observable<void>((subscriber) => {\n subscriber.complete();\n });\n }\n\n const voiceState = useVoiceStore.getState();\n const availableVoices = voiceState.availableVoices;\n \n // Check if voice service is available\n if (!voiceState.isServiceAvailable || availableVoices.length === 0) {\n debugLogger.warn(\"TTS service unavailable - no voices configured\");\n return new Observable<void>((subscriber) => {\n subscriber.error(new Error('TTS service unavailable'));\n });\n }\n \n // Validate voice selection\n if (availableVoices.indexOf(voice) === -1) {\n if (voiceState.fallbackVoice && availableVoices.indexOf(voiceState.fallbackVoice) !== -1) {\n debugLogger.warn(`Voice model ${voice} is not available. Defaulting to '${voiceState.fallbackVoice}'`);\n voice = voiceState.fallbackVoice;\n } else {\n debugLogger.warn(`Voice model ${voice} is not available and no fallback configured`);\n return new Observable<void>((subscriber) => {\n subscriber.error(new Error(`Voice ${voice} not available`));\n });\n }\n }\n return new Observable<void>((subscriber) => {\n const controller = new AbortController();\n const signal = controller.signal;\n\n let audio: HTMLAudioElement | null = null;\n let objectUrl: string | null = null;\n\n const handleAudio = async (response: Response) => {\n if (!response.ok) throw new Error('Failed to fetch TTS');\n const blob = await response.blob();\n objectUrl = URL.createObjectURL(blob);\n audio = new Audio(objectUrl);\n audio.play();\n audio.onended = () => subscriber.complete();\n audio.onerror = (e) => subscriber.error(e);\n subscriber.next();\n };\n\n const handleError = (err: Error) => {\n if (signal.aborted) {\n subscriber.complete();\n } else {\n subscriber.error(err);\n }\n };\n\n // Use gateway API for all TTS requests\n debugLogger.debug('Fetching TTS from gateway API...');\n \n const gatewayUrl = getGatewayApiUrl();\n if (!gatewayUrl) {\n debugLogger.error('Gateway API URL not configured');\n subscriber.error(new Error('TTS service not configured'));\n return;\n }\n\n const requestBody = {\n Text: sanitizeForTTS(text),\n ModelName: voice\n };\n\n const ttsRequest: RequestInit = {\n method: 'POST',\n headers: {\n ...getOrAppendAuthHeader(),\n 'Content-Type': 'application/json'\n },\n mode: 'cors',\n body: JSON.stringify(requestBody),\n signal,\n };\n\n fetch(`${gatewayUrl}/tts`, ttsRequest)\n .then(handleAudio)\n .catch(handleError);\n\n const teardown = () => {\n controller.abort();\n if (audio) {\n audio.pause();\n audio.src = '';\n audio = null;\n }\n if (objectUrl) {\n URL.revokeObjectURL(objectUrl);\n objectUrl = null;\n }\n };\n\n return new Subscription(() => teardown());\n });\n};\n\nexport const getOrAppendAuthHeader = (existing: Record<string, string> = {}) => {\n const token = authenticationService.getToken();\n if (token) {\n existing[\"Authorization\"] = `Bearer ${token}`;\n return existing;\n }\n debugLogger.warn(\"No token found, using empty string for Authorization header\");\n existing[\"Authorization\"] = \"\";\n\n return existing;\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-6EA5-62113F\nconst __banditFingerprint_store_voiceStorets = 'BL-FP-BD24FF-7D8B';\nconst __auditTrail_store_voiceStorets = 'BL-AU-MGOIKVW6-SCLC';\n// File: voiceStore.ts | Path: src/store/voiceStore.ts | Hash: 6ea57d8b\n\nimport { create } from \"zustand\";\nimport { voiceService, VoiceModelsResponse } from \"../services/tts/voiceService\";\nimport { debugLogger } from \"../services/logging/debugLogger\";\nimport { stopTTS } from \"../services/tts/streaming-tts\";\n\n// Auto-initialize voice loading when store is created\nlet autoInitialized = false;\n\nexport interface VoiceState {\n availableVoices: string[];\n selectedVoice: string;\n defaultVoice: string;\n fallbackVoice: string;\n isLoading: boolean;\n isServiceAvailable: boolean;\n initialized: boolean;\n setSelectedVoice: (voice: string) => void;\n loadVoicesFromAPI: () => Promise<void>;\n refreshVoices: () => Promise<void>;\n forceInitialize: () => Promise<void>;\n}\n\nexport const useVoiceStore = create<VoiceState>((set, get) => ({\n availableVoices: [],\n selectedVoice: \"\",\n defaultVoice: \"\", \n fallbackVoice: \"\",\n isLoading: false,\n isServiceAvailable: false,\n initialized: false,\n \n setSelectedVoice: (voice) => {\n const currentVoice = get().selectedVoice;\n debugLogger.debug('Setting selected voice', { \n previousVoice: currentVoice, \n newVoice: voice,\n isChange: currentVoice !== voice\n });\n \n // If voice is actually changing, immediately stop current TTS\n if (currentVoice && currentVoice !== voice) {\n debugLogger.debug('🔄 Voice changing in store - stopping TTS immediately', {\n from: currentVoice,\n to: voice\n });\n stopTTS();\n }\n \n set({ selectedVoice: voice });\n },\n \n loadVoicesFromAPI: async () => {\n const state = get();\n if (state.isLoading) return; // Prevent concurrent requests\n \n set({ isLoading: true, initialized: true });\n \n try {\n const voiceData: VoiceModelsResponse = await voiceService.fetchAvailableVoices();\n \n const hasVoices = voiceData.models.length > 0;\n let finalSelectedVoice = state.selectedVoice;\n \n if (hasVoices) {\n // Validate and set selected voice\n if (finalSelectedVoice && voiceData.models.includes(finalSelectedVoice)) {\n // Keep current selection if it's still available\n } else {\n finalSelectedVoice = voiceData.defaultModel;\n }\n \n set({\n isServiceAvailable: true,\n availableVoices: voiceData.models,\n defaultVoice: voiceData.defaultModel,\n fallbackVoice: voiceData.fallbackModel,\n selectedVoice: finalSelectedVoice,\n isLoading: false\n });\n } else {\n set({\n isServiceAvailable: false,\n isLoading: false\n });\n }\n } catch (error) {\n debugLogger.error('Failed to load voice models', { \n error: error instanceof Error ? error.message : String(error)\n });\n set({\n isServiceAvailable: false,\n isLoading: false\n });\n }\n },\n \n refreshVoices: async () => {\n const currentSelection = get().selectedVoice;\n voiceService.clearCache();\n await get().loadVoicesFromAPI();\n // Restore selection if it's still valid\n const { availableVoices } = get();\n if (currentSelection && availableVoices.includes(currentSelection)) {\n set({ selectedVoice: currentSelection });\n }\n },\n \n forceInitialize: async () => {\n const state = get();\n if (!state.initialized || state.availableVoices.length === 0) {\n debugLogger.debug('Force initializing voice store...');\n await state.loadVoicesFromAPI();\n }\n }\n}));\n\n// Trigger auto-initialization with a slight delay to ensure package settings are ready\nif (!autoInitialized) {\n autoInitialized = true;\n setTimeout(() => {\n debugLogger.debug('Auto-initializing voice store...');\n useVoiceStore.getState().forceInitialize().catch((error) => {\n debugLogger.warn('Auto-initialization failed:', error);\n });\n }, 1000); // 1 second delay to ensure gateway URL is available\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-3660-755F00\nconst __banditFingerprint_hooks_useTTSts = 'BL-FP-2B6BB1-5F41';\nconst __auditTrail_hooks_useTTSts = 'BL-AU-MGOIKVVF-ZUAN';\n// File: useTTS.ts | Path: src/hooks/useTTS.ts | Hash: 36605f41\n\nimport { useState, useEffect, useCallback, useRef, useMemo } from 'react';\nimport { Subscription } from 'rxjs';\nimport { \n getStreamingTTSClient, \n TTSState, \n TTSProgress, \n TTSOptions,\n stopTTS\n} from '../services/tts/streaming-tts';\n\n// Re-export types for convenience\nexport type { TTSState, TTSProgress, TTSOptions };\nimport { useVoiceStore } from '../store/voiceStore';\nimport { usePreferencesStore } from '../store/preferencesStore';\nimport { usePackageSettingsStore } from '../store/packageSettingsStore';\nimport { useModelStore } from '../store/modelStore';\nimport { debugLogger } from '../services/logging/debugLogger';\n\nexport interface UseTTSReturn {\n // State\n isPlaying: boolean;\n isPaused: boolean;\n isLoading: boolean;\n error: string | null;\n progress: TTSProgress | null;\n state: TTSState;\n \n // Actions\n speak: (text: string, options?: TTSOptions) => Promise<void>;\n stop: () => void;\n pause: () => void;\n resume: () => void;\n forcePlay: () => Promise<void>;\n \n // Utilities\n isAvailable: boolean;\n currentVoice: string;\n}\n\n/**\n * React hook for TTS with streaming support and playback controls\n */\nexport const useTTS = (): UseTTSReturn => {\n const [state, setState] = useState<TTSState>(TTSState.IDLE);\n const [progress, setProgress] = useState<TTSProgress | null>(null);\n const [error, setError] = useState<string | null>(null);\n \n // Store references\n const progressSubscriptionRef = useRef<Subscription | null>(null);\n const stateSubscriptionRef = useRef<Subscription | null>(null);\n const speakSubscriptionRef = useRef<Subscription | null>(null);\n const previousVoiceRef = useRef<string | null>(null);\n const previousModelRef = useRef<string | null>(null);\n const requestIdRef = useRef<number>(0); // Track request IDs to prevent out-of-order audio\n \n // Store hooks\n const { selectedVoice, isServiceAvailable } = useVoiceStore();\n const { preferences } = usePreferencesStore();\n const { settings: packageSettings } = usePackageSettingsStore();\n const { selectedModel } = useModelStore();\n \n // Check if TTS is available\n const isAvailable = !!(packageSettings?.gatewayApiUrl && preferences.ttsEnabled && isServiceAvailable);\n \n // Get TTS client\n const ttsClient = useMemo(() => getStreamingTTSClient(), []);\n\n // Set up subscriptions for state and progress updates\n useEffect(() => {\n // Clean up existing subscriptions\n if (progressSubscriptionRef.current) {\n progressSubscriptionRef.current.unsubscribe();\n }\n if (stateSubscriptionRef.current) {\n stateSubscriptionRef.current.unsubscribe();\n }\n\n // Subscribe to progress updates\n progressSubscriptionRef.current = ttsClient.getProgress().subscribe({\n next: (newProgress: TTSProgress) => {\n setProgress(newProgress);\n },\n error: (err: unknown) => {\n debugLogger.error('TTS progress subscription error', { error: err });\n }\n });\n\n // Subscribe to state changes\n stateSubscriptionRef.current = ttsClient.getStateChanges().subscribe({\n next: (newState: TTSState) => {\n setState(newState);\n \n // Clear error when state changes away from error\n if (newState !== TTSState.ERROR && error) {\n setError(null);\n }\n },\n error: (err: unknown) => {\n debugLogger.error('TTS state subscription error', { error: err });\n }\n });\n\n // Cleanup on unmount\n return () => {\n if (progressSubscriptionRef.current) {\n progressSubscriptionRef.current.unsubscribe();\n }\n if (stateSubscriptionRef.current) {\n stateSubscriptionRef.current.unsubscribe();\n }\n };\n }, [error, ttsClient]);\n\n // Handle voice and model changes - stop current playback when they change\n useEffect(() => {\n // Check if this is an actual voice or model change (not initial mount)\n const isVoiceChange = previousVoiceRef.current !== null && \n previousVoiceRef.current !== selectedVoice;\n const isModelChange = previousModelRef.current !== null && \n previousModelRef.current !== selectedModel;\n \n // If voice or model changed, stop current playback\n if (isVoiceChange || isModelChange) {\n // Invalidate current request to prevent any delayed audio\n requestIdRef.current++;\n \n // Clear any active subscription immediately\n if (speakSubscriptionRef.current) {\n speakSubscriptionRef.current.unsubscribe();\n speakSubscriptionRef.current = null;\n }\n \n // For model changes, do a complete reset to clear any bad state\n if (isModelChange) {\n ttsClient.reset();\n } else {\n // For voice changes, just stop\n ttsClient.stop();\n }\n \n setState(TTSState.IDLE);\n setError(null);\n \n // Update references immediately to prevent re-triggering\n previousVoiceRef.current = selectedVoice;\n previousModelRef.current = selectedModel;\n \n return; // Exit early to prevent double update\n }\n \n // Update the references for non-change cases\n if (previousVoiceRef.current === null) {\n previousVoiceRef.current = selectedVoice;\n }\n if (previousModelRef.current === null) {\n previousModelRef.current = selectedModel;\n }\n }, [selectedVoice, selectedModel, ttsClient]);\n\n // Speak function\n const speak = useCallback(async (text: string, options: TTSOptions = {}): Promise<void> => {\n if (!isAvailable) {\n const errorMsg = 'TTS service is not available';\n setError(errorMsg);\n throw new Error(errorMsg);\n }\n\n if (!text?.trim()) {\n const errorMsg = 'No text provided';\n setError(errorMsg);\n throw new Error(errorMsg);\n }\n\n try {\n setError(null);\n \n // Stop any current playback\n ttsClient.stop();\n \n // Also update previous voice and model references immediately\n previousVoiceRef.current = selectedVoice;\n previousModelRef.current = selectedModel;\n \n // Get the most current voice from store to avoid timing issues\n const currentVoice = useVoiceStore.getState().selectedVoice;\n const voiceToUse = currentVoice || selectedVoice;\n if (!voiceToUse) {\n throw new Error('No voice selected');\n }\n \n if (speakSubscriptionRef.current) {\n speakSubscriptionRef.current.unsubscribe();\n speakSubscriptionRef.current = null;\n \n // Add a small delay to ensure the previous audio is completely stopped\n await new Promise(resolve => setTimeout(resolve, 50));\n }\n\n // Generate a unique request ID to ensure we only play the latest request\n const currentRequestId = ++requestIdRef.current;\n\n // Set loading state immediately\n setState(TTSState.LOADING);\n\n // Enable simple streaming\n const ttsOptions: TTSOptions = {\n useStreaming: true,\n useRealtime: true,\n ...options,\n onStateChange: (newState: TTSState) => {\n setState(newState);\n if (options.onStateChange) {\n options.onStateChange(newState);\n }\n },\n onProgress: (newProgress: TTSProgress) => {\n setProgress(newProgress);\n if (options.onProgress) {\n options.onProgress(newProgress);\n }\n }\n };\n\n debugLogger.debug('Starting TTS streaming');\n\n // Start speaking with simple streaming\n speakSubscriptionRef.current = ttsClient.speakStream(text, voiceToUse, ttsOptions).subscribe({\n next: () => {\n // Only process if this is still the latest request\n if (currentRequestId === requestIdRef.current) {\n // Audio started playing successfully\n }\n },\n error: (err: unknown) => {\n // Only process errors for the latest request\n if (currentRequestId === requestIdRef.current) {\n const errorMessage = err instanceof Error && err.message ? err.message : 'TTS playback failed';\n debugLogger.error('TTS playback failed', { error: err });\n setError(errorMessage);\n setState(TTSState.ERROR);\n }\n },\n complete: () => {\n // Only process completion for the latest request\n if (currentRequestId === requestIdRef.current) {\n setState(TTSState.IDLE);\n }\n }\n });\n\n } catch (err: unknown) {\n const errorMsg = err instanceof Error && err.message ? err.message : 'TTS failed to start';\n setError(errorMsg);\n setState(TTSState.ERROR);\n throw err instanceof Error ? err : new Error(errorMsg);\n }\n }, [isAvailable, selectedVoice, selectedModel, ttsClient]);\n\n // Stop function\n const stop = useCallback(() => {\n const currentRequestId = requestIdRef.current;\n \n // IMMEDIATELY update the hook state to IDLE for instant UI feedback\n setState(TTSState.IDLE);\n \n // Invalidate the current request to prevent any delayed audio\n requestIdRef.current++;\n \n // Unsubscribe and clear the subscription\n if (speakSubscriptionRef.current) {\n speakSubscriptionRef.current.unsubscribe();\n speakSubscriptionRef.current = null;\n }\n \n // Call the client stop method\n ttsClient.stop();\n \n // Clear any errors\n setError(null);\n }, [ttsClient]);\n\n // Pause function\n const pause = useCallback(() => {\n ttsClient.pause();\n }, [ttsClient]);\n\n // Resume function\n const resume = useCallback(() => {\n ttsClient.resume();\n }, [ttsClient]);\n\n // Force play function (simplified)\n const forcePlay = useCallback(async (): Promise<void> => {\n try {\n // For simple streaming, we don't need complex force play logic\n // The audio element should handle autoplay restrictions automatically\n if (ttsClient.getCurrentState() === TTSState.PAUSED) {\n ttsClient.resume();\n }\n } catch (err: unknown) {\n const errorMsg = err instanceof Error && err.message ? err.message : 'Failed to force play audio';\n setError(errorMsg);\n throw err instanceof Error ? err : new Error(errorMsg);\n }\n }, [ttsClient]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (speakSubscriptionRef.current) {\n speakSubscriptionRef.current.unsubscribe();\n }\n if (progressSubscriptionRef.current) {\n progressSubscriptionRef.current.unsubscribe();\n }\n if (stateSubscriptionRef.current) {\n stateSubscriptionRef.current.unsubscribe();\n }\n };\n }, []);\n\n // Stop any playback when TTS becomes unavailable\n useEffect(() => {\n if (!isAvailable && (state === TTSState.PLAYING || state === TTSState.LOADING)) {\n stop();\n }\n }, [isAvailable, state, stop]);\n\n return {\n // State\n isPlaying: state === TTSState.PLAYING,\n isPaused: state === TTSState.PAUSED,\n isLoading: state === TTSState.LOADING,\n error,\n progress,\n state,\n \n // Actions\n speak,\n stop,\n pause,\n resume,\n forcePlay,\n \n // Utilities\n isAvailable,\n currentVoice: selectedVoice\n };\n};\n\n/**\n * Global TTS controls hook - useful for global stop functionality\n */\nexport const useGlobalTTS = () => {\n const stopAll = useCallback(() => {\n stopTTS();\n }, []);\n\n return {\n stopAll\n };\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-02BB-817687\nconst __banditFingerprint_chatmodal_airesponsetextfieldtsx = 'BL-FP-5F1C0D-1D01';\nconst __auditTrail_chatmodal_airesponsetextfieldtsx = 'BL-AU-MGOIKVVM-OZSJ';\n// File: ai-response-text-field.tsx | Path: src/modals/chat-modal/ai-response-text-field.tsx | Hash: 02bb1d01\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport DocumentCard from \"../../shared/DocumentCard\";\nimport KnowledgeFileModal from \"../../modals/knowlege/knowledge-file-modal\";\nimport { KnowledgeDoc } from \"../../store/knowledgeStore\";\nimport { useKnowledgeStore } from \"../../chat/hooks/useKnowledgeStore\";\nimport { useTheme, alpha } from \"@mui/material/styles\";\nimport type { Theme } from \"@mui/material/styles\";\nimport ReactMarkdown, { type Components as ReactMarkdownComponents, type ExtraProps as ReactMarkdownExtraProps } from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport rehypeRaw from \"rehype-raw\";\nimport rehypeSanitize from \"rehype-sanitize\";\nimport { debugLogger } from \"../../services/logging/debugLogger\";\nimport {\n Avatar,\n Box,\n IconButton,\n Modal,\n Tooltip,\n Typography,\n Table,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n Paper,\n} from \"@mui/material\";\nimport type { Element, Text, Root } from \"hast\";\nimport { getHighlightTree } from \"../../utils/lowlight\";\nimport { MarkdownImage, markdownSanitizeSchema, renderLowlightChildren } from \"../../utils/markdownRendering\";\nimport { CheckIcon, CloseIcon, ContentCopyIcon } from \"../../icons\";\nimport { maybeHandleFileLinkClick } from \"../../utils/openFileLink\";\nconst brainIcon = \"https://cdn.burtson.ai/images/brain-icon.png\";\n\nimport AiResponseActionsBar from \"./ai-response-action-bar\";\nimport { chatTokens, responseTokens } from \"../../chat/chat-tokens\";\n\ninterface AIResponseTextFieldProps {\n question: string;\n response: string | React.ReactNode;\n responseText?: string; // raw markdown/text used for actions bar (feedback/tts/copy)\n images?: string[];\n backgroundColor?: string;\n memoryUpdated?: boolean;\n sourceFiles?: SourceFileInput[];\n isMobile?: boolean;\n cancelled?: boolean;\n /** Hide the actions bar until the message is hovered (older responses). */\n revealActionsOnHover?: boolean;\n}\n\nconst normalizeTables = (markdown: string): string => {\n const lines = markdown.split(\"\\n\");\n const output: string[] = [];\n let inTable = false;\n let tableRows: string[][] = [];\n\n const flushTable = () => {\n if (tableRows.length === 0) return;\n\n const maxCols = Math.max(...tableRows.map((r) => r.length));\n const padded = tableRows.map((row) => {\n return [...row, ...Array(maxCols - row.length).fill(\"\")];\n });\n\n const header = padded[0];\n const separator = Array(maxCols).fill(\"---\");\n\n output.push(\"| \" + header.join(\" | \") + \" |\");\n output.push(\"| \" + separator.join(\" | \") + \" |\");\n for (let i = 1; i < padded.length; i++) {\n const row = padded[i];\n // Skip rows that are just separators (all dashes)\n if (row.every((cell) => /^-+$/.test(cell))) continue;\n output.push(\"| \" + row.join(\" | \") + \" |\");\n }\n\n tableRows = [];\n inTable = false;\n };\n\n for (const line of lines) {\n if (/^\\s*\\|.*\\|\\s*$/.test(line)) {\n inTable = true;\n const cells = line\n .trim()\n .slice(1, -1)\n .split(\"|\")\n .map((c) => c.trim());\n tableRows.push(cells);\n } else {\n if (inTable) flushTable();\n output.push(line);\n }\n }\n\n flushTable();\n return output.join(\"\\n\");\n};\n\ntype ChatResponsePalette = {\n codeBackground?: string;\n codeText?: string;\n aiBackground?: string;\n aiText?: string;\n aiBorder?: string;\n};\n\ntype VectorResultLike = {\n id?: string;\n fileId?: string;\n _id?: string;\n [key: string]: unknown;\n};\n\ntype KnowledgeDocCandidate = Partial<KnowledgeDoc> & {\n fileId?: string;\n _id?: string;\n filename?: string;\n uploadedAt?: string | Date;\n createdAt?: string | Date;\n mimeType?: string;\n content?: string | null;\n rawData?: string;\n embedding?: unknown;\n size?: number;\n uploadedBy?: string;\n userId?: string;\n userEmail?: string;\n bucket?: string;\n key?: string;\n s3Url?: string;\n teamSid?: string;\n contentSource?: \"team\" | \"user\";\n isUserContent?: boolean;\n isTeamContent?: boolean;\n _vectorResult?: VectorResultLike | null;\n metadata?: VectorResultLike | null;\n chunks?: string[];\n [key: string]: unknown;\n};\n\ntype SourceFileInput = KnowledgeDocCandidate;\n\n// `inline` is kept optional for older react-markdown callers; version 10 no\n// longer passes it.\ntype MarkdownComponentProps<Tag extends keyof JSX.IntrinsicElements> =\n React.ComponentPropsWithoutRef<Tag> & ReactMarkdownExtraProps & { inline?: boolean };\n\nconst isNonEmptyString = (value: unknown): value is string =>\n typeof value === \"string\" && value.trim().length > 0;\n\nconst toDateSafe = (value: unknown): Date | undefined => {\n if (value instanceof Date && !Number.isNaN(value.getTime())) {\n return value;\n }\n if (typeof value === \"string\" && value.trim()) {\n const parsed = new Date(value);\n if (!Number.isNaN(parsed.getTime())) {\n return parsed;\n }\n }\n return undefined;\n};\n\nconst toNumberArray = (value: unknown): number[] | undefined => {\n if (!Array.isArray(value)) {\n return undefined;\n }\n const numbers = value.filter((item): item is number => typeof item === \"number\" && Number.isFinite(item));\n return numbers.length ? numbers : undefined;\n};\n\ninterface MarkdownCodeBlockProps extends React.HTMLAttributes<HTMLElement> {\n inline?: boolean;\n className?: string;\n children: React.ReactNode;\n theme: Theme;\n chatResponse?: ChatResponsePalette;\n}\n\nconst MarkdownCodeBlock: React.FC<MarkdownCodeBlockProps> = ({\n inline,\n className,\n children,\n theme,\n chatResponse,\n ...props\n}) => {\n const match = /language-([\\w-]+)/.exec(className || \"\");\n const requestedLanguage = match?.[1]?.toLowerCase() || \"\";\n const codeText = String(children).replace(/\\n$/, \"\");\n const isProbablyBlock = codeText.includes(\"\\n\") || Boolean(requestedLanguage);\n\n const [copied, setCopied] = useState(false);\n const handleCopy = () => {\n navigator.clipboard.writeText(codeText);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n const highlightTree = useMemo<Root | null>(\n () =>\n isProbablyBlock ? getHighlightTree(codeText, requestedLanguage) : null,\n [codeText, requestedLanguage, isProbablyBlock]\n );\n const highlightedNodes = useMemo(\n () =>\n isProbablyBlock\n ? renderLowlightChildren(\n (highlightTree?.children || []).filter((node): node is Element | Text => {\n if (!node) {\n return false;\n }\n return node.type === \"element\" || node.type === \"text\";\n }),\n `hl-${requestedLanguage || \"auto\"}`\n )\n : [],\n [highlightTree, requestedLanguage, isProbablyBlock]\n );\n\n const resolvedLanguage = (\n requestedLanguage ||\n highlightTree?.data?.language ||\n \"code\"\n ).toString();\n const languageLabel = resolvedLanguage.toUpperCase();\n const languageClass = resolvedLanguage.toLowerCase();\n\n const highlightColors =\n theme.palette.mode === \"dark\"\n ? {\n background: chatResponse?.codeBackground || \"#0f172a\",\n text: chatResponse?.codeText || \"#e2e8f0\",\n keyword: \"#c792ea\",\n string: \"#7fdbca\",\n number: \"#f78c6c\",\n comment: \"#64748b\",\n function: \"#82aaff\",\n variable: \"#f07178\",\n }\n : {\n background: chatResponse?.codeBackground || \"#f4f6ff\",\n text: chatResponse?.codeText || \"#1e293b\",\n keyword: \"#7c3aed\",\n string: \"#0f766e\",\n number: \"#b45309\",\n comment: \"#6b7280\",\n function: \"#2563eb\",\n variable: \"#d97706\",\n };\n\n if (!isProbablyBlock) {\n return (\n <code\n style={{\n borderRadius: \"4px\",\n fontSize: \"0.9em\",\n fontFamily:\n \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace\",\n }}\n {...props}\n >\n {children}\n </code>\n );\n }\n\n return (\n <Box\n sx={{\n borderRadius: \"4px\",\n overflow: \"auto\",\n my: \"0.5rem\",\n px: 0,\n py: 0,\n mt: 1,\n mb: 0.5,\n fontSize: \"0.9rem\",\n position: \"relative\",\n fontFamily:\n \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace\",\n width: \"100%\",\n maxWidth: \"100%\",\n }}\n >\n <Box\n sx={{\n px: 2,\n py: 1,\n bgcolor:\n chatResponse?.aiBackground ||\n (theme.palette.mode === \"dark\"\n ? alpha(theme.palette.common.white, 0.04)\n : alpha(theme.palette.text.primary, 0.04)),\n color: chatResponse?.aiText || theme.palette.text.secondary,\n fontSize: \"0.75rem\",\n borderBottom: `1px solid ${\n chatResponse?.aiBorder || alpha(theme.palette.text.primary, 0.1)\n }`,\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n fontFamily: \"inherit\",\n }}\n >\n <span>{languageLabel}</span>\n <Tooltip title={copied ? \"Copied!\" : \"Copy\"} arrow>\n <IconButton\n size=\"small\"\n onClick={handleCopy}\n sx={{\n color: copied\n ? theme.palette.success.main\n : theme.palette.text.secondary,\n \"&:hover\": { color: theme.palette.text.primary },\n padding: \"4px\",\n }}\n >\n {copied ? <CheckIcon fontSize=\"small\" /> : <ContentCopyIcon fontSize=\"small\" />}\n </IconButton>\n </Tooltip>\n </Box>\n <Box\n sx={{\n overflowX: \"auto\",\n maxWidth: \"100%\",\n \"& .hljs\": {\n display: \"block\",\n overflowX: \"auto\",\n padding: \"16px\",\n margin: 0,\n backgroundColor: highlightColors.background,\n color: highlightColors.text,\n fontSize: \"0.9rem\",\n },\n \"& .hljs-comment, & .hljs-quote\": {\n color: highlightColors.comment,\n fontStyle: \"italic\",\n },\n \"& .hljs-keyword, & .hljs-selector-tag, & .hljs-literal, & .hljs-built_in\": {\n color: highlightColors.keyword,\n },\n \"& .hljs-string, & .hljs-doctag, & .hljs-template-tag, & .hljs-attr\": {\n color: highlightColors.string,\n },\n \"& .hljs-number, & .hljs-symbol, & .hljs-bullet, & .hljs-meta\": {\n color: highlightColors.number,\n },\n \"& .hljs-title, & .hljs-section, & .hljs-selector-id, & .hljs-function\": {\n color: highlightColors.function,\n },\n \"& .hljs-variable, & .hljs-params, & .hljs-property\": {\n color: highlightColors.variable,\n },\n }}\n >\n <pre className={`hljs language-${languageClass}`} {...props}>\n <code className=\"hljs\">{highlightedNodes}</code>\n </pre>\n </Box>\n </Box>\n );\n};\n\nconst AIResponseTextField: React.FC<AIResponseTextFieldProps> = ({\n question,\n response,\n responseText,\n backgroundColor,\n images,\n memoryUpdated,\n sourceFiles,\n isMobile = false,\n cancelled = false,\n revealActionsOnHover = false,\n}) => {\n // Warn if response is not a string, to help debug [object Object] issues\n useEffect(() => {\n if (typeof response !== \"string\" && !React.isValidElement(response)) {\n debugLogger.warn(\"⚠️ AIResponseTextField received a non-string, non-ReactElement response:\", { response });\n }\n }, [response]);\n const [openImage, setOpenImage] = useState<string | null>(null);\n const [showMemoryUpdated, setShowMemoryUpdated] = useState(memoryUpdated ?? false);\n const [openDoc, setOpenDoc] = useState<KnowledgeDoc | null>(null);\n const { isVectorDocument } = useKnowledgeStore();\n\n // Convert API response format to KnowledgeDoc format (same as KnowledgeTab)\n const normalizeSourceFiles = useCallback((files: SourceFileInput[]): KnowledgeDoc[] => {\n return files\n .map((file) => {\n const vectorResult = file._vectorResult ?? undefined;\n const metadata = file.metadata ?? undefined;\n\n const candidateId =\n [\n file.id,\n file.fileId,\n file._id,\n vectorResult?.id,\n vectorResult?.fileId,\n vectorResult?._id,\n metadata?.id,\n metadata?.fileId,\n metadata?._id,\n ].find(isNonEmptyString) ?? null;\n\n if (!candidateId) {\n debugLogger.error(\"Missing document identifier in AI response file\", {\n file,\n availableProperties: Object.keys(file),\n vectorResultProperties: vectorResult ? Object.keys(vectorResult) : undefined,\n });\n return null;\n }\n\n const resolvedId = candidateId;\n const filename =\n (isNonEmptyString(file.name) && file.name) ||\n (isNonEmptyString(file.filename) && file.filename) ||\n \"Unknown Document\";\n const timestamp = file.uploadedAt ?? file.createdAt;\n const addedDate = toDateSafe(timestamp) ?? new Date();\n const mimeType =\n (isNonEmptyString(file.mimeType) && file.mimeType) ||\n (isNonEmptyString(file.type) && file.type) ||\n \"application/pdf\";\n const contentValue = typeof file.content === \"string\" ? file.content : \"\";\n const hasInlineContent = contentValue.trim().length > 0;\n const looksLikeMongoId = /^[0-9a-f]{24}$/i.test(resolvedId);\n const isFromVectorDB =\n Boolean(file._vectorResult) ||\n isNonEmptyString(file.s3Url) ||\n (looksLikeMongoId && !hasInlineContent);\n\n debugLogger.debug(\"Normalizing AI response source file\", {\n docId: resolvedId,\n filename,\n isFromVectorDB,\n hasContent: hasInlineContent,\n });\n\n const embedding = toNumberArray(file.embedding) ?? [];\n const rawData = typeof file.rawData === \"string\" ? file.rawData : undefined;\n const size = typeof file.size === \"number\" && Number.isFinite(file.size) ? file.size : 0;\n const uploadedBy =\n (isNonEmptyString(file.uploadedBy) && file.uploadedBy) ||\n (isNonEmptyString(file.userId) && file.userId) ||\n \"\";\n const userEmail = (isNonEmptyString(file.userEmail) && file.userEmail) || \"\";\n const bucket = (isNonEmptyString(file.bucket) && file.bucket) || \"\";\n const key = (isNonEmptyString(file.key) && file.key) || resolvedId;\n const teamSid = (isNonEmptyString(file.teamSid) && file.teamSid) || undefined;\n const explicitContentSource =\n file.contentSource === \"team\" || file.contentSource === \"user\" ? file.contentSource : undefined;\n const contentSource = explicitContentSource ?? (teamSid ? \"team\" : \"user\");\n const isTeamContent = file.isTeamContent ?? contentSource === \"team\";\n const isUserContent = file.isUserContent ?? contentSource === \"user\";\n const resolvedS3Url =\n (isNonEmptyString(file.s3Url) && file.s3Url) ||\n (isFromVectorDB ? resolvedId : undefined);\n\n const normalizedDoc: KnowledgeDoc = {\n id: resolvedId,\n name: filename,\n content: isFromVectorDB ? \"\" : contentValue,\n rawData,\n type: mimeType,\n addedDate,\n embedding,\n size,\n uploadedBy,\n userEmail,\n bucket,\n key,\n isUserContent,\n isTeamContent,\n contentSource,\n teamSid,\n mimeType,\n originalFileName: filename,\n s3Url: resolvedS3Url,\n };\n\n return normalizedDoc;\n })\n .filter((doc): doc is KnowledgeDoc => doc !== null);\n }, []);\n\n // Normalize the source files\n const normalizedSourceFiles = useMemo(\n () => (sourceFiles ? normalizeSourceFiles(sourceFiles) : []),\n [sourceFiles, normalizeSourceFiles]\n );\n\n const sourceCacheRef = useRef<KnowledgeDoc[]>([]);\n\n const displaySourceFiles = useMemo(() => {\n if (normalizedSourceFiles.length > 0) {\n sourceCacheRef.current = normalizedSourceFiles;\n return normalizedSourceFiles;\n }\n\n if (sourceFiles === undefined) {\n return sourceCacheRef.current;\n }\n\n sourceCacheRef.current = [];\n return [];\n }, [normalizedSourceFiles, sourceFiles]);\n\n const sourcesMarkdownList = displaySourceFiles.map((doc, index) => `- ${index + 1}. ${doc.name}`);\n\n // Debug logging\n useEffect(() => {\n if (sourceFiles && sourceFiles.length > 0) {\n debugLogger.debug(\"AI response source files normalization\", {\n sourceFileCount: sourceFiles.length,\n normalizedFileCount: normalizedSourceFiles.length,\n });\n }\n }, [sourceFiles, normalizedSourceFiles]);\n\n useEffect(() => {\n if (!memoryUpdated) return;\n setShowMemoryUpdated(true);\n const timeout = setTimeout(() => setShowMemoryUpdated(false), 3000);\n return () => clearTimeout(timeout);\n }, [memoryUpdated]);\n\n const theme = useTheme();\n const chatResponse = responseTokens(theme);\n \n // Choose syntax highlighting theme based on current theme mode\n\n const sanitizeMarkdown = (raw: string): string => {\n // Strip start/end of turn tags, including malformed or alternate versions\n let sanitized = raw.replace(/<[/]?start_of_turn>|<[/]?end[_]?of[_]?turn>/gi, \"\");\n\n // 1) Unwrap any stray <div class=\"MuiBox-root\"> wrappers\n sanitized = sanitized\n .replace(/<div class=\"MuiBox-root[^\"]*\"[^>]*>([\\s\\S]*?)<\\/div>/g, (_, inner) =>\n inner.trim()\n )\n .replace(/<div[^>]*>\\s*<\\/div>/g, \"\");\n\n // Collapse newline before colon or comma into inline punctuation\n sanitized = sanitized.replace(/\\r?\\n\\s*:\\s*/g, \": \");\n sanitized = sanitized.replace(/\\r?\\n\\s*,\\s*/g, \", \");\n\n // 2) Normalize all pipe‑tables in one go\n sanitized = normalizeTables(sanitized);\n\n return sanitized;\n };\n\n const enrichedMarkdown = useMemo(() => {\n if (typeof response !== \"string\") {\n return null;\n }\n\n const sanitized = sanitizeMarkdown(response);\n\n if (!sourcesMarkdownList.length) {\n return sanitized;\n }\n\n if (/\\*\\*Sources?\\*\\*/i.test(sanitized)) {\n return sanitized;\n }\n\n return `${sanitized}\\n\\n**Sources**\\n${sourcesMarkdownList.join(\"\\n\")}`;\n }, [response, sourcesMarkdownList]);\n\n const components: ReactMarkdownComponents = {\n img: MarkdownImage,\n mark({ children, node: _node, className, style, ...markProps }: MarkdownComponentProps<\"mark\">) {\n const contentText = React.Children.toArray(children)\n .map((child) => (typeof child === \"string\" ? child : \"\"))\n .join(\"\")\n .trim();\n\n return (\n <Box\n component=\"span\"\n className={className}\n style={style}\n {...markProps}\n sx={{\n display: \"inline-block\",\n backgroundColor: chatTokens(theme).surface.interactive,\n color: chatTokens(theme).conversation.assistant.foreground,\n px: 1,\n py: 0.25,\n borderRadius: \"4px\",\n fontWeight: 500,\n fontSize: \"0.95rem\",\n lineHeight: 1.4,\n whiteSpace: \"normal\",\n width: \"fit-content\",\n maxWidth: \"100%\",\n }}\n >\n {contentText}\n </Box>\n );\n },\n code({ inline, className, children, node: _node, ...codeProps }: MarkdownComponentProps<\"code\">) {\n return (\n <MarkdownCodeBlock\n inline={inline}\n className={className}\n {...codeProps}\n theme={theme}\n chatResponse={chatResponse}\n >\n {children}\n </MarkdownCodeBlock>\n );\n },\n a({ href, children, node: _node, style, ...anchorProps }: MarkdownComponentProps<\"a\">) {\n return (\n <a\n href={href}\n {...anchorProps}\n style={{\n color: theme.palette.primary.main,\n textDecoration: \"underline\",\n ...(style ?? {}),\n }}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={(e) => maybeHandleFileLinkClick(e, href)}\n >\n {children}\n </a>\n );\n },\n em({ children, node: _node, className, style, ...emProps }: MarkdownComponentProps<\"em\">) {\n // Check for Bandit's weird <em><div class=\"MuiBox-root\">CODE</div></em>\n const onlyChild =\n Array.isArray(children) && children.length === 1 ? children[0] : null;\n\n if (\n onlyChild &&\n typeof onlyChild === \"object\" &&\n onlyChild.type === \"div\" &&\n onlyChild.props?.className?.includes(\"MuiBox-root\")\n ) {\n const inner = onlyChild.props.children;\n\n // Optional: skip rendering if it's literally the word \"CODE\"\n if (typeof inner === \"string\" && inner.trim().toUpperCase() === \"CODE\") {\n return null;\n }\n\n // Otherwise render nicely\n return (\n <Box\n sx={{\n fontFamily: \"monospace\",\n fontSize: \"0.9rem\",\n backgroundColor: theme.palette.background.default,\n color: theme.palette.text.primary,\n padding: \"12px 16px\",\n borderRadius: \"4px\",\n border: `1px solid ${theme.palette.divider}`,\n my: 1,\n display: \"inline-block\",\n }}\n >\n {inner}\n </Box>\n );\n }\n\n return (\n <em className={className} style={style} {...emProps}>\n {children}\n </em>\n );\n },\n ol({ children, node: _node, style, ...orderedListProps }: MarkdownComponentProps<\"ol\">) {\n const childArray = React.Children.toArray(children);\n const cleanedChildren: React.ReactNode[] = [];\n\n for (let i = 0; i < childArray.length; i++) {\n const item = childArray[i];\n\n // Remove raw colon-only text lines\n if (typeof item === \"string\" && item.trim() === \":\") {\n continue;\n }\n\n // If colon-prefixed string explanation\n if (typeof item === \"string\" && item.trim().startsWith(\":\")) {\n cleanedChildren.push(\n <Typography\n key={`ol-expl-${i}`}\n sx={{\n fontSize: \"0.875rem\",\n color: chatTokens(theme).conversation.meta,\n fontStyle: \"italic\",\n mt: 0.5,\n ml: 2,\n }}\n >\n {item.replace(/^:\\s*/, \"\")}\n </Typography>\n );\n } else {\n cleanedChildren.push(item);\n }\n }\n\n return (\n <ol\n {...orderedListProps}\n style={{\n paddingLeft: 24,\n marginLeft: 16,\n listStyleType: \"decimal\",\n ...(style ?? {}),\n }}\n >\n {cleanedChildren}\n </ol>\n );\n },\n\n ul({ children, node: _node, style, ...unorderedListProps }: MarkdownComponentProps<\"ul\">) {\n return (\n <ul\n {...unorderedListProps}\n style={{\n paddingLeft: \"1.5rem\",\n marginTop: \"0.5rem\",\n marginBottom: \"0.25rem\",\n listStyle: \"disc\",\n ...(style ?? {}),\n }}\n >\n {React.Children.toArray(children).filter((child) => {\n if (typeof child === \"string\" && child.trim() === \":\") return false;\n return true;\n })}\n </ul>\n );\n },\n li({ children, node: _node, style, ...listItemProps }: MarkdownComponentProps<\"li\">) {\n const childArray = React.Children.toArray(children);\n // New logic: If first child is <strong> whose text ends with a colon, and rest is inline/plain\n if (\n childArray.length >= 2 &&\n React.isValidElement(childArray[0]) &&\n childArray[0].type === \"strong\"\n ) {\n // Extract label text from <strong>\n let labelText = \"\";\n const strongChild = childArray[0];\n if (typeof strongChild.props.children === \"string\") {\n labelText = strongChild.props.children;\n } else if (Array.isArray(strongChild.props.children)) {\n labelText = strongChild.props.children.join(\"\");\n }\n // Replace [object Object] with \"Item\"\n if (labelText?.includes(\"[object Object]\")) {\n labelText = \"Item\";\n }\n if (typeof labelText === \"string\" && labelText.trim().endsWith(\":\")) {\n // Check if all rest are inline/plain (no Box)\n const rest = childArray.slice(1);\n const isAllInline = rest.every(\n (el) =>\n typeof el === \"string\" ||\n (React.isValidElement(el) &&\n // allow inline tags, but not <Box>\n el.type !== Box)\n );\n if (isAllInline) {\n // Remove trailing colon from label for rendering\n const displayLabel = labelText.replace(/:\\s*$/, \"\");\n return (\n <li\n style={{\n marginBottom: \"0.5rem\",\n lineHeight: 1.4,\n whiteSpace: \"pre-wrap\",\n ...(style ?? {}),\n }}\n {...listItemProps}\n >\n <strong>{displayLabel}:</strong>\n {rest.length > 0 && <> {rest}</>}\n </li>\n );\n }\n }\n }\n // Special-case: <strong>Label:</strong> followed by a Box description\n if (\n childArray.length === 2 &&\n React.isValidElement(childArray[0]) &&\n childArray[0].type === \"strong\" &&\n React.isValidElement(childArray[1]) &&\n childArray[1].type === Box\n ) {\n const label = childArray[0].props.children;\n const desc = childArray[1].props.children;\n return (\n <li\n style={{ marginBottom: \"0.5rem\", lineHeight: 1.4, whiteSpace: \"pre-wrap\" }}\n {...listItemProps}\n >\n <span>\n <strong>{label}</strong> {desc}\n </span>\n </li>\n );\n }\n const contentArray = childArray;\n const filtered: React.ReactNode[] = [];\n\n for (let i = 0; i < contentArray.length; i++) {\n const item = contentArray[i];\n\n if (typeof item === \"string\" && item.trim() === \":\") continue;\n\n // Safer merge: use prev variable and check before merge\n if (i > 0 && typeof item === \"string\" && item.trim().startsWith(\":\")) {\n const prev = contentArray[i - 1];\n if (React.isValidElement(prev) && prev.type === \"strong\") {\n const desc = item.replace(/^:\\s*/, \"\");\n const prevKey = React.isValidElement(prev) && prev.key != null ? prev.key : `li-strong-${i}`;\n filtered.pop();\n filtered.push(\n <span key={`li-merge-${prevKey}`}>\n {prev}\n {\": \"}\n {desc}\n </span>\n );\n continue;\n }\n }\n filtered.push(item);\n }\n\n return (\n <li\n {...listItemProps}\n style={{\n marginBottom: \"0.5rem\",\n lineHeight: 1.4,\n whiteSpace: \"pre-wrap\",\n ...(style ?? {}),\n }}\n >\n {filtered}\n </li>\n );\n },\n table({ children, node: _node, className, style, ...tableProps }: MarkdownComponentProps<\"table\">) {\n return (\n <TableContainer\n component={Paper}\n className={className}\n style={style}\n sx={{ my: 2, bgcolor: theme.palette.background.paper }}\n >\n <Table size=\"small\" {...tableProps}>\n {children}\n </Table>\n </TableContainer>\n );\n },\n thead({ children, node: _node, ...tableHeadProps }: MarkdownComponentProps<\"thead\">) {\n return <TableHead {...tableHeadProps}>{children}</TableHead>;\n },\n tbody({ children, node: _node, ...tableBodyProps }: MarkdownComponentProps<\"tbody\">) {\n const rows = React.Children.toArray(children).filter((row: React.ReactNode) => {\n // Keep non-React elements\n if (!React.isValidElement(row)) return true;\n // Extract cell elements for this row\n const cells = React.Children.toArray(row.props.children);\n // Filter out rows where every cell is a string of hyphens\n return !cells.every(\n (cell) =>\n React.isValidElement(cell) &&\n typeof cell.props.children === \"string\" &&\n /^-+$/.test(cell.props.children.trim())\n );\n });\n return <TableBody {...tableBodyProps}>{rows}</TableBody>;\n },\n tr({ children, node: _node, ...tableRowProps }: MarkdownComponentProps<\"tr\">) {\n return <TableRow {...tableRowProps}>{children}</TableRow>;\n },\n th({ children, node: _node, align, ...tableCellProps }: MarkdownComponentProps<\"th\">) {\n return (\n <TableCell\n {...tableCellProps}\n align={align === \"char\" ? undefined : align}\n sx={{\n fontWeight: \"bold\",\n color: theme.palette.text.primary,\n bgcolor: theme.palette.action.hover,\n textAlign: \"left\",\n padding: \"8px 12px\",\n whiteSpace: \"nowrap\",\n }}\n >\n {children}\n </TableCell>\n );\n },\n td({ children, node: _node, align, ...tableCellProps }: MarkdownComponentProps<\"td\">) {\n return (\n <TableCell\n {...tableCellProps}\n align={align === \"char\" ? undefined : align}\n sx={{\n color: theme.palette.text.primary,\n fontSize: \"0.875rem\",\n padding: \"8px 12px\",\n verticalAlign: \"top\",\n }}\n >\n {children}\n </TableCell>\n );\n },\n p({ children, node: _node, className, style, ...paragraphProps }: MarkdownComponentProps<\"p\">) {\n // Flatten children and detect block-level elements\n const flattened = React.Children.toArray(children).flat();\n const hasBlock = flattened.some(\n (child) =>\n typeof child === \"object\" &&\n child !== null &&\n \"type\" in child &&\n typeof child.type === \"string\" &&\n [\"div\", \"Box\", \"section\", \"ul\", \"ol\", \"table\"].includes(child.type)\n );\n // If a block element is present, render without wrapping\n if (hasBlock) {\n return <>{flattened}</>;\n }\n // Otherwise wrap inline text in a div\n return (\n <Box component=\"div\" sx={{ margin: \"0.25rem 0\" }}>\n <Typography\n component=\"div\"\n variant=\"body2\"\n className={className}\n style={style}\n sx={{ color: theme.palette.text.primary, lineHeight: 1.6, display: \"inline\" }}\n {...paragraphProps}\n >\n {flattened}\n </Typography>\n </Box>\n );\n },\n };\n\n return (\n <>\n <Box\n sx={{\n width: '100%',\n maxWidth: '100%',\n flexGrow: 1,\n alignSelf: 'stretch',\n display: 'flex',\n flexDirection: 'column',\n color: chatResponse.aiText || theme.palette.text.primary,\n px: isMobile ? 0.5 : 2,\n py: 1,\n userSelect: \"text\",\n \"&:hover .ai-response-actions\": { opacity: 1 },\n }}\n >\n {/* User message — compact bubble, right-aligned (Claude-style) */}\n <Box sx={{ display: \"flex\", justifyContent: \"flex-end\", mb: 2.5 }}>\n <Box sx={{ maxWidth: { xs: \"100%\", sm: \"85%\" }, minWidth: 0 }}>\n <Box\n sx={{\n bgcolor: chatResponse.userBubble || alpha(theme.palette.common.white, 0.07),\n borderRadius: \"18px\",\n px: 2,\n py: 1.25,\n wordBreak: \"break-word\",\n whiteSpace: \"pre-wrap\",\n overflowWrap: \"break-word\",\n }}\n >\n <Typography\n sx={{\n color: theme.palette.text.primary,\n lineHeight: 1.5,\n wordBreak: \"break-word\",\n whiteSpace: \"pre-wrap\",\n }}\n >\n {question}\n </Typography>\n </Box>\n {/* Images, if any */}\n {images && images.length > 0 && (\n <Box sx={{ display: \"flex\", gap: 1, mt: 1, flexWrap: \"wrap\", justifyContent: \"flex-end\" }}>\n {images.map((img, i) => (\n <Avatar\n key={i}\n src={img}\n variant=\"rounded\"\n onClick={() => setOpenImage(img)}\n sx={{\n width: 96,\n height: 96,\n borderRadius: 2,\n border: `1px solid ${alpha(theme.palette.text.primary, 0.25)}`,\n cursor: \"pointer\",\n \"&:hover\": { boxShadow: `0 0 0 2px ${theme.palette.primary.main}` },\n }}\n />\n ))}\n </Box>\n )}\n </Box>\n </Box>\n\n {/* AI response — raw text on the chat background (Claude-style: no avatar, label, or bubble) */}\n <Box sx={{ position: \"relative\", width: \"100%\", maxWidth: { xs: \"100%\", sm: \"768px\" } }}>\n {cancelled && (\n <Box\n sx={{\n position: \"absolute\",\n top: -22,\n left: 0,\n display: \"flex\",\n alignItems: \"center\",\n gap: 1,\n zIndex: 1,\n }}\n >\n <Typography variant=\"caption\" sx={{ fontStyle: \"italic\", opacity: 0.85 }}>\n Cancelled by you\n </Typography>\n </Box>\n )}\n {showMemoryUpdated && (\n <Box\n sx={{\n position: \"absolute\",\n top: -22,\n right: 0,\n display: \"flex\",\n alignItems: \"center\",\n gap: 1,\n animation: \"fadeOut 0.3s ease-in 2.7s forwards\",\n zIndex: 1,\n }}\n >\n <img src={brainIcon} alt=\"Memory\" style={{ width: 16, height: 16 }} />\n <Typography\n variant=\"caption\"\n sx={{ color: chatResponse.memoryText, fontStyle: \"italic\" }}\n >\n Bandit added to memory\n </Typography>\n </Box>\n )}\n <Box sx={{ width: '100%', maxWidth: '100%' }}>\n {typeof response === \"string\" ? (\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[rehypeRaw, [rehypeSanitize, markdownSanitizeSchema]]}\n components={components}\n >\n {enrichedMarkdown ?? sanitizeMarkdown(response)}\n </ReactMarkdown>\n ) : React.isValidElement(response) ? (\n response\n ) : (\n <Typography color=\"error\">⚠️ Invalid AI response</Typography>\n )}\n </Box>\n </Box>\n {/* Actions bar at the bottom. Only the latest response keeps it\n always visible — older ones reveal it on hover (desktop) so the\n transcript stays clean, ChatGPT-style. */}\n {!!(responseText || (typeof response === \"string\" && response)) && (\n <Box\n className=\"ai-response-actions\"\n sx={\n revealActionsOnHover\n ? {\n opacity: 0,\n transition: \"opacity 0.15s ease\",\n \"&:focus-within\": { opacity: 1 },\n }\n : undefined\n }\n >\n <AiResponseActionsBar text={(responseText || (response as string)) as string} />\n </Box>\n )}\n {displaySourceFiles && displaySourceFiles.length > 0 && (\n <Box sx={{ mt: 1.5, display: \"flex\", gap: 2, flexWrap: \"wrap\", justifyContent: \"flex-start\" }}>\n {displaySourceFiles.map((doc, idx) => {\n debugLogger.debug(\"Rendering DocumentCard in AI response\", {\n index: idx,\n id: doc.id,\n name: doc.name,\n });\n return (\n <DocumentCard \n key={idx} \n doc={doc} \n onView={() => setOpenDoc(doc)}\n variant=\"mini\"\n isHistoricalReference={true}\n allowErrorStates={true}\n />\n );\n })}\n </Box>\n )}\n </Box>\n\n {/* Fullscreen image preview modal */}\n <Modal open={!!openImage} onClose={() => setOpenImage(null)}>\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100vh\",\n bgcolor: \"rgba(0, 0, 0, 0.9)\",\n p: 2,\n position: \"relative\",\n }}\n >\n <IconButton\n onClick={() => setOpenImage(null)}\n sx={{\n position: \"absolute\",\n top: 16,\n right: 16,\n color: \"#fff\",\n bgcolor: \"rgba(0,0,0,0.6)\",\n \"&:hover\": {\n bgcolor: \"rgba(255,255,255,0.2)\",\n },\n }}\n >\n <CloseIcon />\n </IconButton>\n <Box\n component=\"img\"\n src={openImage || \"\"}\n alt=\"Full-size\"\n sx={{\n maxHeight: \"90vh\",\n maxWidth: \"90vw\",\n borderRadius: 2,\n boxShadow: 24,\n cursor: \"zoom-out\",\n }}\n onClick={() => setOpenImage(null)}\n />\n </Box>\n </Modal>\n <KnowledgeFileModal \n open={!!openDoc} \n onClose={() => setOpenDoc(null)} \n doc={openDoc} \n isVectorDocument={openDoc ? (() => {\n const isVector = isVectorDocument(openDoc);\n debugLogger.debug(\"Knowledge file modal open request\", {\n documentId: openDoc.id,\n name: openDoc.name,\n isVector,\n });\n return isVector;\n })() : false}\n />\n </>\n );\n};\n\nexport default AIResponseTextField;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-AC9A-B43BC2\nconst __banditFingerprint_shared_DocumentCardtsx = 'BL-FP-3F514D-0451';\nconst __auditTrail_shared_DocumentCardtsx = 'BL-AU-MGOIKVW1-S428';\n// File: DocumentCard.tsx | Path: src/shared/DocumentCard.tsx | Hash: ac9a0451\n\nimport React, { useState, useEffect } from \"react\";\nimport {\n Box,\n Typography,\n Tooltip,\n Card,\n CardContent,\n Checkbox,\n IconButton,\n} from \"@mui/material\";\nimport { debugLogger } from \"../services/logging/debugLogger\";\nimport { KnowledgeDoc } from \"../store/knowledgeStore\";\nimport { useKnowledgeStore } from \"../chat/hooks/useKnowledgeStore\";\nimport { useVectorStore } from \"../hooks/useVectorStore\";\nimport { alpha, useTheme } from \"@mui/material/styles\";\nimport {\n ArticleIcon,\n CloudOffIcon,\n CodeIcon,\n DataObjectIcon,\n DeleteIcon,\n DescriptionIcon,\n DownloadIcon,\n ErrorOutlineIcon,\n InfoIcon,\n PictureAsPdfIcon,\n SearchIcon,\n} from \"../icons\";\n\ninterface DocumentCardProps {\n doc: KnowledgeDoc;\n onView: () => void;\n onDelete?: (id: string) => void;\n onSelect?: (id: string) => void;\n isSelected?: boolean;\n isDeleting?: boolean; // For deletion animation\n variant?: 'mini' | 'full'; // Mini for chat responses, full for knowledge tab\n showSelection?: boolean;\n showDelete?: boolean;\n showPreview?: boolean;\n // New props for handling error states\n isHistoricalReference?: boolean; // True when this card is from a past conversation\n allowErrorStates?: boolean; // Whether to show error states instead of hiding the card\n}\n\ntype FileTypeInfo = {\n icon: React.ElementType;\n category: string;\n language?: string;\n};\n\n// File type detection: icon + category + language label. The icon is drawn\n// in a neutral tone; the type is spelled out in the metadata line instead.\nconst getFileTypeInfo = (filename: string): FileTypeInfo => {\n const ext = filename.split('.').pop()?.toLowerCase() || '';\n\n const languageMap: Record<string, FileTypeInfo> = {\n // Documents\n 'pdf': { icon: PictureAsPdfIcon, category: 'Document', language: 'PDF' },\n 'doc': { icon: ArticleIcon, category: 'Document', language: 'Word' },\n 'docx': { icon: ArticleIcon, category: 'Document', language: 'Word' },\n 'odt': { icon: ArticleIcon, category: 'Document' },\n 'rtf': { icon: ArticleIcon, category: 'Document' },\n\n // Text files\n 'txt': { icon: DescriptionIcon, category: 'Text' },\n 'md': { icon: DescriptionIcon, category: 'Text', language: 'Markdown' },\n 'markdown': { icon: DescriptionIcon, category: 'Text', language: 'Markdown' },\n\n // Programming languages\n 'js': { icon: CodeIcon, category: 'Code', language: 'JavaScript' },\n 'jsx': { icon: CodeIcon, category: 'Code', language: 'React' },\n 'ts': { icon: CodeIcon, category: 'Code', language: 'TypeScript' },\n 'tsx': { icon: CodeIcon, category: 'Code', language: 'React TS' },\n 'py': { icon: CodeIcon, category: 'Code', language: 'Python' },\n 'java': { icon: CodeIcon, category: 'Code', language: 'Java' },\n 'c': { icon: CodeIcon, category: 'Code', language: 'C' },\n 'cpp': { icon: CodeIcon, category: 'Code', language: 'C++' },\n 'cs': { icon: CodeIcon, category: 'Code', language: 'C#' },\n 'go': { icon: CodeIcon, category: 'Code', language: 'Go' },\n 'rs': { icon: CodeIcon, category: 'Code', language: 'Rust' },\n 'php': { icon: CodeIcon, category: 'Code', language: 'PHP' },\n 'rb': { icon: CodeIcon, category: 'Code', language: 'Ruby' },\n 'kt': { icon: CodeIcon, category: 'Code', language: 'Kotlin' },\n 'swift': { icon: CodeIcon, category: 'Code', language: 'Swift' },\n\n // Data files\n 'json': { icon: DataObjectIcon, category: 'Data', language: 'JSON' },\n 'xml': { icon: DataObjectIcon, category: 'Data', language: 'XML' },\n 'yaml': { icon: DataObjectIcon, category: 'Data', language: 'YAML' },\n 'yml': { icon: DataObjectIcon, category: 'Data', language: 'YAML' },\n 'csv': { icon: DataObjectIcon, category: 'Data', language: 'CSV' },\n };\n\n return languageMap[ext] || { icon: DescriptionIcon, category: 'File' };\n};\n\n// Where the document lives: local browser storage or the vector store.\nconst getSourceLabel = (doc: KnowledgeDoc, shouldUseVector: boolean): string => {\n if (shouldUseVector && doc.s3Url) {\n return doc.isTeamContent ? 'Team cloud' : 'Cloud';\n }\n return 'Local';\n};\n\n// Format file size utility\nconst formatFileSize = (bytes: number): string => {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i];\n};\n\nconst DocumentCard: React.FC<DocumentCardProps> = ({\n doc,\n onView,\n onDelete,\n onSelect,\n isSelected = false,\n isDeleting = false,\n variant = 'mini',\n showSelection = false,\n showDelete = false,\n showPreview = true,\n isHistoricalReference = false,\n allowErrorStates = true,\n}) => {\n const theme = useTheme();\n const { isVectorDocument } = useKnowledgeStore();\n const { downloadVectorFile, isVectorEnabled } = useVectorStore();\n const [documentState, setDocumentState] = useState<'available' | 'unavailable' | 'access-changed' | 'checking'>('checking');\n const [errorMessage, setErrorMessage] = useState<string>('');\n\n // Check document availability and access status\n useEffect(() => {\n const checkDocumentStatus = async () => {\n try {\n const isVector = isVectorDocument(doc);\n \n // Case 1: Vector document but vector access is now disabled\n if (isVector && !isVectorEnabled) {\n setDocumentState('access-changed');\n setErrorMessage('Vector database access disabled. Document not accessible.');\n return;\n }\n \n // Case 2: Vector document - try to verify it exists\n if (isVector) {\n try {\n // Attempt to get file blob to verify existence\n const fileId = doc.s3Url || doc.id;\n // Note: We don't actually fetch here to avoid performance issues,\n // but this is where we could add a lightweight existence check\n setDocumentState('available');\n } catch (error) {\n setDocumentState('unavailable');\n setErrorMessage('Document no longer exists in cloud storage.');\n }\n }\n // Case 3: Local document - check if it has content or rawData\n else {\n if (!doc.content && !doc.rawData) {\n setDocumentState('unavailable');\n setErrorMessage('Document content not available.');\n } else {\n setDocumentState('available');\n }\n }\n } catch (error) {\n setDocumentState('unavailable');\n setErrorMessage('Unable to verify document status.');\n }\n };\n\n if (isHistoricalReference) {\n checkDocumentStatus();\n } else {\n setDocumentState('available');\n }\n }, [doc, isHistoricalReference, isVectorEnabled, isVectorDocument]);\n \n const fileInfo = getFileTypeInfo(doc.name);\n const IconComponent = fileInfo.icon;\n const shouldUseVector = isVectorEnabled;\n const sourceLabel = getSourceLabel(doc, shouldUseVector);\n const isAvailable = documentState === 'available';\n const metaLine = [\n sourceLabel,\n fileInfo.language ?? fileInfo.category,\n formatFileSize((doc.content?.length || 0) * 2),\n ].join(' · ');\n\n // Don't render if document is unavailable and error states are not allowed\n if (documentState === 'unavailable' && !allowErrorStates) {\n return null;\n }\n\n const handleDownload = async (e: React.MouseEvent) => {\n e.stopPropagation();\n \n // Prevent download if document is not available\n if (documentState !== 'available') {\n debugLogger.warn('Cannot download document - not available', { documentState, documentId: doc.id });\n return;\n }\n \n try {\n const isVector = isVectorDocument(doc);\n debugLogger.debug('Document download initiated', { name: doc.name, isVector });\n \n if (isVector) {\n const fileId = doc.s3Url || doc.id;\n debugLogger.debug('Downloading vector document', { fileId, name: doc.name });\n await downloadVectorFile(fileId, doc.name);\n } else {\n if (doc.rawData) {\n debugLogger.debug('Downloading local document from raw data', { name: doc.name });\n const binaryString = atob(doc.rawData);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n const mimeType = doc.type || doc.mimeType || 'application/octet-stream';\n const blob = new Blob([bytes], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = doc.name;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n } else {\n debugLogger.debug('Downloading local document from content fallback', { name: doc.name });\n const content = doc.content || '';\n const mimeType = doc.type || doc.mimeType || 'text/plain';\n const blob = new Blob([content], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = doc.name;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n }\n }\n } catch (error) {\n debugLogger.error('DocumentCard download failed', { error, documentId: doc.id, name: doc.name });\n }\n };\n\n const handleCardClick = (e: React.MouseEvent) => {\n // Prevent interaction if document is not available\n if (documentState !== 'available') {\n e.stopPropagation();\n return;\n }\n \n if (e.ctrlKey || e.metaKey) {\n onSelect?.(doc.id);\n } else {\n onView();\n }\n };\n\n // Dim the card while its status is unknown or it can't be opened.\n const getErrorStateStyles = () => {\n if (isAvailable) return {};\n return {\n opacity: 0.6,\n pointerEvents: documentState === 'checking' ? 'none' : 'auto',\n } as const;\n };\n\n // Small status icon in the corner when the document can't be opened.\n const renderErrorOverlay = () => {\n if (isAvailable || documentState === 'checking') return null;\n\n const ErrorIcon = documentState === 'access-changed' ? CloudOffIcon : ErrorOutlineIcon;\n\n return (\n <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 2 }}>\n <Tooltip title={errorMessage} arrow>\n <ErrorIcon sx={{ fontSize: variant === 'mini' ? 16 : 20, color: 'error.main' }} />\n </Tooltip>\n </Box>\n );\n };\n\n const selectedSurface = alpha(theme.palette.primary.main, 0.06);\n const previewSurface = theme.palette.bandit?.surface.subtle ?? theme.palette.action.hover;\n // 44px touch targets on phones, compact on larger screens.\n const iconButtonSx = { width: { xs: 44, sm: 32 }, height: { xs: 44, sm: 32 } };\n\n if (variant === 'mini') {\n return (\n <Card\n variant=\"outlined\"\n sx={{\n position: \"relative\",\n p: 1.5,\n borderColor: isSelected ? \"primary.main\" : \"divider\",\n bgcolor: isSelected ? selectedSurface : \"background.paper\",\n width: 180,\n maxWidth: \"100%\",\n textAlign: \"center\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n minHeight: 150,\n cursor: isAvailable ? \"pointer\" : \"not-allowed\",\n transition: theme.transitions.create([\"border-color\", \"background-color\"]),\n '&:hover': isAvailable ? {\n borderColor: \"text.secondary\",\n } : {},\n ...getErrorStateStyles(),\n }}\n onClick={handleCardClick}\n >\n {renderErrorOverlay()}\n\n <Box sx={{ display: \"flex\", alignItems: \"center\", justifyContent: \"center\", mb: 1 }}>\n <IconComponent sx={{ fontSize: 28, color: \"text.secondary\" }} />\n </Box>\n\n <Tooltip title={doc.name} arrow>\n <Typography\n variant=\"body2\"\n sx={{\n display: \"block\",\n color: \"text.primary\",\n fontWeight: 500,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n width: \"100%\",\n }}\n >\n {doc.name}\n </Typography>\n </Tooltip>\n\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n sx={{ display: \"block\", width: \"100%\", mb: 1, whiteSpace: \"nowrap\", overflow: \"hidden\", textOverflow: \"ellipsis\" }}\n >\n {sourceLabel} · {fileInfo.category}\n </Typography>\n\n <Box sx={{ display: \"flex\", gap: 0.5 }}>\n <Tooltip title={isAvailable ? \"View\" : \"Document not available\"}>\n <span>\n <IconButton\n size=\"small\"\n aria-label={`View ${doc.name}`}\n disabled={!isAvailable}\n sx={iconButtonSx}\n onClick={(e) => {\n e.stopPropagation();\n if (isAvailable) onView();\n }}\n >\n <SearchIcon fontSize=\"small\" />\n </IconButton>\n </span>\n </Tooltip>\n <Tooltip title={isAvailable ? \"Download\" : errorMessage}>\n <span>\n <IconButton\n size=\"small\"\n aria-label={`Download ${doc.name}`}\n disabled={!isAvailable}\n sx={iconButtonSx}\n onClick={handleDownload}\n >\n <DownloadIcon fontSize=\"small\" />\n </IconButton>\n </span>\n </Tooltip>\n </Box>\n </Card>\n );\n }\n\n // Full variant for Knowledge Tab\n return (\n <Card\n variant=\"outlined\"\n sx={{\n position: \"relative\",\n minWidth: 0,\n height: \"100%\",\n cursor: isAvailable ? \"pointer\" : \"not-allowed\",\n transition: theme.transitions.create([\"border-color\", \"background-color\", \"opacity\", \"transform\"]),\n borderColor: isSelected ? \"primary.main\" : \"divider\",\n bgcolor: isSelected ? selectedSurface : \"background.paper\",\n \"&:hover\": isAvailable ? { borderColor: isSelected ? \"primary.main\" : \"text.secondary\" } : {},\n display: \"flex\",\n flexDirection: \"column\",\n opacity: isDeleting ? 0.4 : 1,\n transform: isDeleting ? \"scale(0.95)\" : \"none\",\n ...getErrorStateStyles(),\n }}\n onClick={handleCardClick}\n >\n {renderErrorOverlay()}\n\n <CardContent\n sx={{\n p: 1.5,\n \"&:last-child\": { pb: 1 },\n flex: 1,\n display: \"flex\",\n flexDirection: \"column\",\n minWidth: 0,\n }}\n >\n {/* File type icon and selection */}\n <Box sx={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", mb: 1, minHeight: 32 }}>\n <IconComponent sx={{ fontSize: 20, color: \"text.secondary\", flexShrink: 0 }} />\n {showSelection && (\n <Checkbox\n size=\"small\"\n checked={isSelected}\n slotProps={{ input: { \"aria-label\": `Select ${doc.name}` } }}\n onClick={(e) => e.stopPropagation()}\n onChange={() => onSelect?.(doc.id)}\n sx={{ ...iconButtonSx, mr: -0.75 }}\n />\n )}\n </Box>\n\n {/* Document preview */}\n {showPreview && (\n <Box\n sx={{\n mb: 1.5,\n px: 1,\n py: 0.75,\n bgcolor: previewSurface,\n overflow: \"hidden\",\n height: 64,\n }}\n >\n {doc.content && doc.content.length > 0 ? (\n <Typography\n variant=\"caption\"\n sx={{\n display: \"-webkit-box\",\n WebkitLineClamp: 3,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\",\n color: \"text.secondary\",\n lineHeight: 1.4,\n wordBreak: \"break-word\",\n }}\n >\n {doc.content.substring(0, 100)}...\n </Typography>\n ) : (\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.75, height: \"100%\", color: \"text.disabled\" }}>\n <InfoIcon sx={{ fontSize: 14 }} />\n <Typography variant=\"caption\" color=\"text.disabled\">\n No preview available\n </Typography>\n </Box>\n )}\n </Box>\n )}\n\n {/* Document name and metadata */}\n <Tooltip title={doc.name} arrow>\n <Typography\n variant=\"body2\"\n sx={{\n fontWeight: 600,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n color: \"text.primary\",\n }}\n >\n {doc.name}\n </Typography>\n </Tooltip>\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n sx={{ display: \"block\", whiteSpace: \"nowrap\", overflow: \"hidden\", textOverflow: \"ellipsis\" }}\n >\n {metaLine}\n </Typography>\n\n {/* Error message for full variant */}\n {!isAvailable && documentState !== \"checking\" && (\n <Typography variant=\"caption\" color=\"warning.main\" sx={{ display: \"block\", mt: 0.5 }}>\n {errorMessage}\n </Typography>\n )}\n\n {/* Actions */}\n <Box sx={{ mt: \"auto\", pt: 1, display: \"flex\", justifyContent: \"flex-end\", alignItems: \"center\", gap: 0.25, mr: -0.75 }}>\n <Tooltip title={isAvailable ? \"Download\" : \"Unavailable\"}>\n <span>\n <IconButton\n size=\"small\"\n aria-label={`Download ${doc.name}`}\n disabled={!isAvailable}\n onClick={handleDownload}\n sx={{ ...iconButtonSx, color: \"text.secondary\" }}\n >\n <DownloadIcon fontSize=\"small\" />\n </IconButton>\n </span>\n </Tooltip>\n {showDelete && (\n <Tooltip title=\"Delete\">\n <IconButton\n size=\"small\"\n color=\"error\"\n aria-label={`Delete ${doc.name}`}\n onClick={(e) => {\n e.stopPropagation();\n onDelete?.(doc.id);\n }}\n sx={iconButtonSx}\n >\n <DeleteIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n </Box>\n </CardContent>\n </Card>\n );\n};\n\nexport default DocumentCard;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-C410-8CA568\nconst __banditFingerprint_knowlege_knowledgefilemodaltsx = 'BL-FP-823E15-0B23';\nconst __auditTrail_knowlege_knowledgefilemodaltsx = 'BL-AU-MGOIKVVO-T646';\n// File: knowledge-file-modal.tsx | Path: src/modals/knowlege/knowledge-file-modal.tsx | Hash: c4100b23\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n Dialog,\n AppBar,\n Toolbar,\n IconButton,\n Typography,\n Box,\n CircularProgress,\n Alert,\n Button,\n Paper,\n ToggleButton,\n ToggleButtonGroup,\n Tooltip,\n useTheme,\n useMediaQuery,\n} from \"@mui/material\";\nimport { KnowledgeDoc } from \"../../store/knowledgeStore\";\nimport { useVectorStore } from \"../../hooks/useVectorStore\";\nimport { usePackageSettingsStore } from \"../../store/packageSettingsStore\";\nimport * as pdfjsLib from \"pdfjs-dist/legacy/build/pdf.mjs\";\nimport type { Root, Element, Text } from \"hast\";\nimport { getHighlightTree } from \"../../utils/lowlight\";\nimport { renderLowlightChildren } from \"../../utils/markdownRendering\";\nimport { debugLogger } from \"../../services/logging/debugLogger\";\nimport type { PDFDocumentProxy } from \"pdfjs-dist/types/src/display/api\";\nimport {\n ArticleIcon,\n CloseIcon,\n CodeIcon,\n DataObjectIcon,\n DescriptionIcon,\n DownloadIcon,\n PictureAsPdfIcon,\n TextFieldsIcon,\n ZoomInIcon,\n ZoomOutIcon,\n} from \"../../icons\";\n\ntype FileTypeInfo = {\n icon: React.ElementType;\n color: string;\n category: string;\n language?: string;\n};\n\nconst getFileTypeInfo = (filename: string): FileTypeInfo => {\n const ext = filename.split('.').pop()?.toLowerCase() || '';\n \n const languageMap: Record<string, FileTypeInfo> = {\n // Documents\n 'pdf': { icon: PictureAsPdfIcon, color: '#d32f2f', category: 'Document' },\n 'doc': { icon: ArticleIcon, color: '#1976d2', category: 'Document' },\n 'docx': { icon: ArticleIcon, color: '#1976d2', category: 'Document' },\n 'odt': { icon: ArticleIcon, color: '#1976d2', category: 'Document' },\n 'rtf': { icon: ArticleIcon, color: '#1976d2', category: 'Document' },\n \n // Text files\n 'txt': { icon: DescriptionIcon, color: '#388e3c', category: 'Text' },\n 'md': { icon: DescriptionIcon, color: '#388e3c', category: 'Text', language: 'Markdown' },\n 'markdown': { icon: DescriptionIcon, color: '#388e3c', category: 'Text', language: 'Markdown' },\n \n // Web languages\n 'js': { icon: CodeIcon, color: '#f7df1e', category: 'Code', language: 'JavaScript' },\n 'jsx': { icon: CodeIcon, color: '#61dafb', category: 'Code', language: 'JavaScript' },\n 'ts': { icon: CodeIcon, color: '#3178c6', category: 'Code', language: 'TypeScript' },\n 'tsx': { icon: CodeIcon, color: '#61dafb', category: 'Code', language: 'TypeScript' },\n 'html': { icon: CodeIcon, color: '#e34f26', category: 'Code', language: 'HTML' },\n 'css': { icon: CodeIcon, color: '#1572b6', category: 'Code', language: 'CSS' },\n 'scss': { icon: CodeIcon, color: '#cf649a', category: 'Code', language: 'SCSS' },\n 'sass': { icon: CodeIcon, color: '#cf649a', category: 'Code', language: 'Sass' },\n 'php': { icon: CodeIcon, color: '#777bb4', category: 'Code', language: 'PHP' },\n \n // Systems languages\n 'c': { icon: CodeIcon, color: '#a8b9cc', category: 'Code', language: 'C' },\n 'cpp': { icon: CodeIcon, color: '#f34b7d', category: 'Code', language: 'C++' },\n 'cs': { icon: CodeIcon, color: '#239120', category: 'Code', language: 'C#' },\n 'java': { icon: CodeIcon, color: '#ed8b00', category: 'Code', language: 'Java' },\n 'py': { icon: CodeIcon, color: '#3776ab', category: 'Code', language: 'Python' },\n 'go': { icon: CodeIcon, color: '#00add8', category: 'Code', language: 'Go' },\n 'rs': { icon: CodeIcon, color: '#ce422b', category: 'Code', language: 'Rust' },\n 'kt': { icon: CodeIcon, color: '#7f52ff', category: 'Code', language: 'Kotlin' },\n 'swift': { icon: CodeIcon, color: '#fa7343', category: 'Code', language: 'Swift' },\n 'scala': { icon: CodeIcon, color: '#dc322f', category: 'Code', language: 'Scala' },\n 'rb': { icon: CodeIcon, color: '#cc342d', category: 'Code', language: 'Ruby' },\n \n // Scripts\n 'sh': { icon: CodeIcon, color: '#4eaa25', category: 'Code', language: 'Shell' },\n 'bash': { icon: CodeIcon, color: '#4eaa25', category: 'Code', language: 'Bash' },\n 'bat': { icon: CodeIcon, color: '#c1f12e', category: 'Code', language: 'Batch' },\n 'ps1': { icon: CodeIcon, color: '#012456', category: 'Code', language: 'PowerShell' },\n \n // Data formats\n 'json': { icon: DataObjectIcon, color: '#f7df1e', category: 'Data', language: 'JSON' },\n 'xml': { icon: DataObjectIcon, color: '#ff6600', category: 'Data', language: 'XML' },\n 'yaml': { icon: DataObjectIcon, color: '#cb171e', category: 'Data', language: 'YAML' },\n 'yml': { icon: DataObjectIcon, color: '#cb171e', category: 'Data', language: 'YAML' },\n 'csv': { icon: DataObjectIcon, color: '#217346', category: 'Data', language: 'CSV' },\n };\n \n return languageMap[ext] || { icon: DescriptionIcon, color: '#666', category: 'Other' };\n};\n\nconst isPDF = (filename: string): boolean => filename.toLowerCase().endsWith('.pdf');\n\nconst LANGUAGE_MAP: Record<string, string> = {\n // Web technologies\n 'js': 'javascript',\n 'jsx': 'jsx',\n 'ts': 'typescript',\n 'tsx': 'tsx',\n 'html': 'html',\n 'htm': 'html',\n 'css': 'css',\n 'scss': 'scss',\n 'sass': 'sass',\n 'less': 'less',\n\n // Data formats\n 'json': 'json',\n 'xml': 'xml',\n 'yaml': 'yaml',\n 'yml': 'yaml',\n 'csv': 'csv',\n\n // Systems programming\n 'c': 'c',\n 'cpp': 'cpp',\n 'cxx': 'cpp',\n 'cc': 'cpp',\n 'h': 'c',\n 'hpp': 'cpp',\n 'cs': 'csharp',\n 'java': 'java',\n 'py': 'python',\n 'go': 'go',\n 'rs': 'rust',\n 'kt': 'kotlin',\n 'swift': 'swift',\n 'scala': 'scala',\n 'rb': 'ruby',\n 'php': 'php',\n\n // Scripting\n 'sh': 'bash',\n 'bash': 'bash',\n 'zsh': 'bash',\n 'fish': 'bash',\n 'bat': 'batch',\n 'cmd': 'batch',\n 'ps1': 'powershell',\n\n // Markup and documentation\n 'md': 'markdown',\n 'markdown': 'markdown',\n 'tex': 'latex',\n 'sql': 'sql',\n\n // Configuration\n 'ini': 'ini',\n 'conf': 'ini',\n 'config': 'ini',\n 'toml': 'toml',\n 'dockerfile': 'docker',\n\n // Other\n 'r': 'r',\n 'matlab': 'matlab',\n 'm': 'matlab',\n 'lua': 'lua',\n 'perl': 'perl',\n 'pl': 'perl',\n};\n\nconst getLanguageFromFilename = (filename: string): string => {\n const ext = filename.toLowerCase().split('.').pop() || '';\n return LANGUAGE_MAP[ext] || 'text';\n};\n\nconst isCodeFile = (filename: string): boolean => getLanguageFromFilename(filename) !== 'text';\n\nconst formatJsonContent = (content: string): string => {\n try {\n const parsed = JSON.parse(content);\n return JSON.stringify(parsed, null, 2);\n } catch {\n return content;\n }\n};\n\nconst getFormattedContent = (content: string, filename: string): string => {\n const ext = filename.toLowerCase().split('.').pop() || '';\n\n if (ext === 'json') {\n return formatJsonContent(content);\n }\n\n return content;\n};\n\ninterface Props {\n open: boolean;\n onClose: () => void;\n doc: KnowledgeDoc | null;\n isVectorDocument?: boolean;\n}\n\nconst KnowledgeFileModal: React.FC<Props> = ({ open, onClose, doc, isVectorDocument = false }) => {\n const [fullContent, setFullContent] = useState<string>('');\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [pdfDocument, setPdfDocument] = useState<PDFDocumentProxy | null>(null);\n const [currentPage, setCurrentPage] = useState(1);\n const [totalPages, setTotalPages] = useState(0);\n const [pdfScale, setPdfScale] = useState(1.2);\n const [pdfCanvases, setPdfCanvases] = useState<HTMLCanvasElement[]>([]);\n const [viewMode, setViewMode] = useState<'formatted' | 'raw'>('formatted');\n const zoomTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const { downloadVectorFile, getFileBlob } = useVectorStore();\n const packageSettings = usePackageSettingsStore();\n const theme = useTheme();\n const isMobile = useMediaQuery(theme.breakpoints.down('md'));\n\n\n const isDarkTheme = theme.palette.mode === 'dark';\n\n useEffect(() => {\n if (typeof window !== 'undefined') {\n \n pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdn.burtson.ai/scripts/pdf.worker.js';\n }\n }, [])\n useEffect(() => {\n return () => {\n if (zoomTimeoutRef.current) {\n clearTimeout(zoomTimeoutRef.current);\n }\n };\n }, []);\n\n const baseContent = fullContent || doc?.content || '';\n const filename = doc?.name || '';\n const formattedContent = useMemo(\n () => getFormattedContent(baseContent, filename),\n [baseContent, filename]\n );\n\n const highlightLanguage = useMemo(() => {\n if (!filename || !isCodeFile(filename)) {\n return \"\";\n }\n return getLanguageFromFilename(filename).toLowerCase();\n }, [filename]);\n\n const highlightTree = useMemo<Root | null>(() => {\n if (!highlightLanguage) {\n return null;\n }\n return getHighlightTree(formattedContent, highlightLanguage);\n }, [formattedContent, highlightLanguage]);\n\n const highlightedNodes = useMemo(() => {\n if (!highlightTree) {\n return [] as React.ReactNode[];\n }\n\n const highlightChildren = (highlightTree.children || []).filter((node): node is Element | Text => {\n return node.type === \"element\" || node.type === \"text\";\n });\n\n return renderLowlightChildren(\n highlightChildren,\n `hl-doc-${highlightLanguage || \"auto\"}`\n );\n }, [highlightTree, highlightLanguage]);\n\n const resolvedHighlightLanguage = useMemo(() => {\n const data = highlightTree?.data;\n if (data && typeof data === \"object\" && data !== null && \"language\" in data) {\n const languageValue = (data as { language?: unknown }).language;\n if (typeof languageValue === \"string\") {\n return languageValue.toLowerCase();\n }\n }\n return highlightLanguage;\n }, [highlightTree, highlightLanguage]);\n\n const renderPdfPage = async (pdf: PDFDocumentProxy, pageNumber: number, scale: number = 1.2): Promise<HTMLCanvasElement> => {\n const page = await pdf.getPage(pageNumber);\n const viewport = page.getViewport({ scale });\n \n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n if (!context) {\n throw new Error('Unable to obtain 2D context for PDF rendering');\n }\n canvas.height = viewport.height;\n canvas.width = viewport.width;\n\n const renderContext = {\n canvasContext: context,\n viewport: viewport\n };\n\n await page.render(renderContext).promise;\n return canvas;\n };\n\n const loadPdfDocument = useCallback(async (arrayBuffer: ArrayBuffer) => {\n try {\n const pdf = await pdfjsLib.getDocument({ data: arrayBuffer }).promise;\n setPdfDocument(pdf);\n setTotalPages(pdf.numPages);\n setCurrentPage(1);\n\n // Render all pages\n const canvases: HTMLCanvasElement[] = [];\n for (let i = 1; i <= pdf.numPages; i++) {\n const canvas = await renderPdfPage(pdf, i, pdfScale);\n canvases.push(canvas);\n }\n setPdfCanvases(canvases);\n } catch (err) {\n debugLogger.error(\"Failed to load PDF\", { error: err });\n throw err;\n }\n }, [pdfScale]);\n\n // Helper function to create blob from local file rawData\n const createLocalFileBlob = (doc: KnowledgeDoc): Blob => {\n if (!doc.rawData) {\n throw new Error('No raw data available for local file');\n }\n \n const binaryString = atob(doc.rawData);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n const mimeType = doc.type || doc.mimeType || 'application/octet-stream';\n return new Blob([bytes], { type: mimeType });\n };\n\n const loadPdfFromDataUrl = async (dataUrl: string) => {\n try {\n setLoading(true);\n setError(null);\n \n const response = await fetch(dataUrl);\n const arrayBuffer = await response.arrayBuffer();\n await loadPdfDocument(arrayBuffer);\n } catch (err) {\n debugLogger.error('Failed to load PDF from data URL', { error: err });\n setError('Failed to load PDF preview');\n } finally {\n setLoading(false);\n }\n };\n\n const loadFullContent = useCallback(async () => {\n if (!doc) return;\n \n setLoading(true);\n setError(null);\n \n try {\n if (isPDF(doc.name)) {\n // For PDF files, get the binary data and render it\n const fileBlob = await getFileBlob(doc.id);\n const arrayBuffer = await fileBlob.arrayBuffer();\n await loadPdfDocument(arrayBuffer);\n } else {\n // For text files, get the text content\n const fileBlob = await getFileBlob(doc.id);\n const content = await fileBlob.text();\n setFullContent(content);\n }\n } catch (err) {\n debugLogger.error('Failed to load full file content', { error: err });\n if (isPDF(doc.name)) {\n setError('Failed to load PDF. The file may be corrupted or too large.');\n } else {\n setError('Failed to load full file content. Showing preview instead.');\n setFullContent(doc.content || '');\n }\n } finally {\n setLoading(false);\n }\n }, [doc, getFileBlob, loadPdfDocument]);\n\n useEffect(() => {\n if (open && doc && isVectorDocument) {\n loadFullContent();\n } else if (open && doc) {\n if (isPDF(doc.name)) {\n if (doc.rawData) {\n try {\n const blob = createLocalFileBlob(doc);\n const arrayBuffer = blob.arrayBuffer();\n arrayBuffer.then(loadPdfDocument).catch(err => {\n debugLogger.error(\"Failed to load local PDF\", { error: err });\n setError('Failed to load PDF preview');\n });\n } catch (err) {\n debugLogger.error(\"Failed to create blob from local PDF data\", { error: err });\n setError('PDF preview not available for this document');\n }\n } else {\n setError('PDF preview not available for this document');\n }\n } else {\n setFullContent(doc.content || '');\n }\n }\n \n if (!open) {\n setPdfDocument(null);\n setPdfCanvases([]);\n setCurrentPage(1);\n setTotalPages(0);\n setPdfScale(1.2);\n setFullContent('');\n setError(null);\n setViewMode('formatted');\n }\n }, [open, doc, isVectorDocument, loadFullContent, loadPdfDocument]);\n\n const handleZoomIn = async () => {\n // Clear any existing timeout\n if (zoomTimeoutRef.current) {\n clearTimeout(zoomTimeoutRef.current);\n }\n \n const newScale = Math.min(pdfScale + 0.25, 3.0);\n setPdfScale(newScale);\n \n // Debounce the actual re-rendering to prevent rapid successive calls\n zoomTimeoutRef.current = setTimeout(async () => {\n if (pdfDocument) {\n setLoading(true);\n try {\n const canvases: HTMLCanvasElement[] = [];\n for (let i = 1; i <= pdfDocument.numPages; i++) {\n const canvas = await renderPdfPage(pdfDocument, i, newScale);\n canvases.push(canvas);\n }\n setPdfCanvases(canvases);\n } catch (error) {\n debugLogger.error('Zoom in failed', { error });\n // Revert to previous scale on error\n setPdfScale(pdfScale);\n } finally {\n setLoading(false);\n }\n }\n }, 300); // 300ms debounce\n };\n\n const handleZoomOut = async () => {\n if (zoomTimeoutRef.current) {\n clearTimeout(zoomTimeoutRef.current);\n }\n \n const newScale = Math.max(pdfScale - 0.25, 0.5);\n setPdfScale(newScale);\n \n zoomTimeoutRef.current = setTimeout(async () => {\n if (pdfDocument) {\n setLoading(true);\n try {\n const canvases: HTMLCanvasElement[] = [];\n for (let i = 1; i <= pdfDocument.numPages; i++) {\n const canvas = await renderPdfPage(pdfDocument, i, newScale);\n canvases.push(canvas);\n }\n setPdfCanvases(canvases);\n } catch (error) {\n debugLogger.error('Zoom out failed', { error });\n setPdfScale(pdfScale);\n } finally {\n setLoading(false);\n }\n }\n }, 300);\n };\n\n const handleDownload = async () => {\n if (!doc || !isVectorDocument) return;\n \n try {\n await downloadVectorFile(doc.id, doc.name);\n } catch (err) {\n debugLogger.error('Vector document download failed', { error: err, docId: doc.id });\n }\n };\n return (\n <Dialog fullScreen open={open} onClose={onClose}>\n <AppBar sx={{ position: \"relative\" }}>\n <Toolbar>\n {/* Document info section with badge and title */}\n <Box sx={{ display: 'flex', alignItems: 'center', flex: 1, minWidth: 0 }}>\n {/* Document type badge */}\n {doc && (\n <Box sx={{ mr: 1, flexShrink: 0 }}>\n {(() => {\n const fileInfo = getFileTypeInfo(doc.name);\n const IconComponent = fileInfo.icon;\n return (\n <Tooltip title={`${fileInfo.category} file`} placement=\"bottom\">\n <Box \n sx={{ \n display: 'flex', \n alignItems: 'center', \n bgcolor: fileInfo.color, \n color: 'white', \n borderRadius: 1, \n px: 1, \n py: 0.25,\n fontSize: '0.75rem',\n fontWeight: 'bold'\n }}\n >\n <IconComponent sx={{ fontSize: '1rem', mr: 0.5 }} />\n {fileInfo.language || fileInfo.category}\n </Box>\n </Tooltip>\n );\n })()}\n </Box>\n )}\n \n {/* Title with responsive truncation */}\n <Tooltip title={doc?.name || ''} placement=\"bottom-start\">\n <Typography \n sx={{ \n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n // Responsive max width for title truncation\n maxWidth: {\n xs: '120px', // Mobile: very short for small screens (reduced to account for badge)\n sm: '180px', // Small tablet: short (reduced)\n md: '280px', // Medium: medium length (reduced)\n lg: '380px', // Large: longer (reduced)\n xl: '480px' // Extra large: longest (reduced)\n },\n cursor: 'help' // Indicate tooltip is available\n }} \n variant=\"h6\"\n >\n {doc?.name}\n </Typography>\n </Tooltip>\n \n {/* Additional file info - only show page count for PDFs */}\n <Box sx={{ display: 'flex', alignItems: 'center', flexShrink: 0, ml: 1 }}>\n {isPDF(doc?.name || '') && totalPages > 0 && (\n <Typography component=\"span\" variant=\"body2\" sx={{ opacity: 0.8 }}>\n ({totalPages} page{totalPages > 1 ? 's' : ''})\n </Typography>\n )}\n </Box>\n </Box>\n \n {/* Toolbar actions section */}\n <Box sx={{ display: 'flex', alignItems: 'center', flexShrink: 0, gap: 1 }}>\n {/* Code View Toggle for non-PDF files */}\n {!isPDF(doc?.name || '') && isCodeFile(doc?.name || '') && (\n <ToggleButtonGroup\n value={viewMode}\n exclusive\n onChange={(e, newMode) => newMode && setViewMode(newMode)}\n size=\"small\"\n >\n <ToggleButton value=\"formatted\" sx={{ color: 'inherit' }}>\n <CodeIcon sx={{ mr: 1, fontSize: '1rem' }} />\n Formatted\n </ToggleButton>\n <ToggleButton value=\"raw\" sx={{ color: 'inherit' }}>\n <TextFieldsIcon sx={{ mr: 1, fontSize: '1rem' }} />\n Raw\n </ToggleButton>\n </ToggleButtonGroup>\n )}\n \n {/* PDF Navigation Controls - Hidden on mobile */}\n {isPDF(doc?.name || '') && pdfDocument && !isMobile && (\n <>\n <Button \n color=\"inherit\" \n startIcon={<ZoomOutIcon />}\n onClick={handleZoomOut}\n disabled={pdfScale <= 0.5}\n size=\"small\"\n >\n Zoom Out\n </Button>\n <Typography variant=\"body2\" sx={{ color: 'inherit', mx: 1 }}>\n {Math.round(pdfScale * 100)}%\n </Typography>\n <Button \n color=\"inherit\" \n startIcon={<ZoomInIcon />}\n onClick={handleZoomIn}\n disabled={pdfScale >= 3.0}\n size=\"small\"\n >\n Zoom In\n </Button>\n </>\n )}\n \n {/* Download and Close buttons */}\n {isVectorDocument && (\n <IconButton edge=\"end\" color=\"inherit\" onClick={handleDownload}>\n <DownloadIcon />\n </IconButton>\n )}\n <IconButton edge=\"end\" color=\"inherit\" onClick={onClose}>\n <CloseIcon />\n </IconButton>\n </Box>\n </Toolbar>\n </AppBar>\n <Box sx={{ p: 3, bgcolor: \"background.default\", height: \"100%\", overflowY: \"auto\" }}>\n {loading && (\n <Box sx={{ display: 'flex', justifyContent: 'center', alignItems: 'center', height: '50vh' }}>\n <CircularProgress />\n <Typography sx={{ ml: 2 }}>\n {isPDF(doc?.name || '') ? 'Loading PDF document...' : 'Loading full file content...'}\n </Typography>\n </Box>\n )}\n \n {error && (\n <Alert severity=\"warning\" sx={{ mb: 2 }}>\n {error}\n </Alert>\n )}\n \n {!loading && isPDF(doc?.name || '') && pdfCanvases.length > 0 && (\n <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 2 }}>\n {pdfCanvases.map((canvas, index) => (\n <Paper \n key={index} \n elevation={3} \n sx={{ \n p: 2, \n mb: 2,\n maxWidth: '100%',\n overflow: 'auto',\n // Custom scrollbar styling for PDF viewer\n '&::-webkit-scrollbar': {\n width: '8px',\n height: '8px',\n },\n '&::-webkit-scrollbar-track': {\n background: isDarkTheme ? '#2d2d2d' : '#f5f5f5',\n borderRadius: '4px',\n },\n '&::-webkit-scrollbar-thumb': {\n background: isDarkTheme ? '#555' : '#c1c1c1',\n borderRadius: '4px',\n '&:hover': {\n background: isDarkTheme ? '#666' : '#a1a1a1',\n },\n },\n '&::-webkit-scrollbar-corner': {\n background: isDarkTheme ? '#2d2d2d' : '#f5f5f5',\n },\n // Firefox scrollbar support\n scrollbarWidth: 'thin',\n scrollbarColor: isDarkTheme ? '#555 #2d2d2d' : '#c1c1c1 #f5f5f5',\n }}\n >\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ mb: 1, display: 'block' }}>\n Page {index + 1} of {totalPages}\n </Typography>\n <Box\n ref={(el: HTMLDivElement | null) => {\n if (el && canvas) {\n el.innerHTML = '';\n el.appendChild(canvas);\n }\n }}\n sx={{\n '& canvas': {\n display: 'block',\n maxWidth: '100%',\n height: 'auto',\n border: '1px solid',\n borderColor: 'divider',\n }\n }}\n />\n </Paper>\n ))}\n </Box>\n )}\n \n {!loading && !isPDF(doc?.name || '') && (\n <Box>\n {isCodeFile(doc?.name || '') && viewMode === 'formatted' ? (\n <Box>\n {/* Language indicator */}\n <Box sx={{ mb: 2, display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Syntax highlighted as <strong>{getLanguageFromFilename(doc?.name || '').toUpperCase()}</strong>\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {(fullContent || doc?.content || '').split('\\n').length} lines\n </Typography>\n </Box>\n \n <Paper \n elevation={1} \n sx={{ \n overflow: 'auto',\n maxHeight: { xs: 'calc(100vh - 320px)', sm: 'calc(100vh - 280px)' },\n border: '1px solid',\n borderColor: 'divider',\n // Custom scrollbar styling to match theme\n '&::-webkit-scrollbar': {\n width: { xs: '8px', sm: '12px' },\n height: { xs: '8px', sm: '12px' },\n },\n '&::-webkit-scrollbar-track': {\n backgroundColor: isDarkTheme ? '#2d2d2d' : '#f5f5f5',\n borderRadius: '6px',\n },\n '&::-webkit-scrollbar-thumb': {\n backgroundColor: isDarkTheme ? '#555' : '#c1c1c1',\n borderRadius: '6px',\n border: isDarkTheme ? '2px solid #2d2d2d' : '2px solid #f5f5f5',\n '&:hover': {\n backgroundColor: isDarkTheme ? '#777' : '#a8a8a8',\n },\n },\n '&::-webkit-scrollbar-corner': {\n backgroundColor: isDarkTheme ? '#2d2d2d' : '#f5f5f5',\n },\n // Firefox scrollbar styling\n scrollbarWidth: 'thin',\n scrollbarColor: isDarkTheme ? '#555 #2d2d2d' : '#c1c1c1 #f5f5f5',\n '& pre': {\n margin: 0,\n padding: { xs: '12px !important', sm: '16px !important' },\n borderRadius: '8px',\n fontSize: { xs: '12px', sm: '14px' },\n lineHeight: 1.5,\n // Better mobile text handling\n wordBreak: 'break-word',\n overflowWrap: 'anywhere',\n }\n }}\n >\n <Box\n sx={{\n '& .hljs': {\n display: 'block',\n padding: { xs: '12px', sm: '16px' },\n margin: 0,\n fontSize: { xs: '12px', sm: '14px' },\n lineHeight: 1.55,\n backgroundColor: isDarkTheme ? '#0f172a' : '#f5f6ff',\n color: isDarkTheme ? '#e2e8f0' : '#1e293b',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n overflowWrap: 'anywhere',\n },\n '& .hljs-comment, & .hljs-quote': {\n color: isDarkTheme ? '#64748b' : '#64748b',\n fontStyle: 'italic',\n },\n '& .hljs-keyword, & .hljs-selector-tag, & .hljs-literal, & .hljs-built_in': {\n color: isDarkTheme ? '#c792ea' : '#7c3aed',\n },\n '& .hljs-string, & .hljs-doctag, & .hljs-template-tag, & .hljs-attr': {\n color: isDarkTheme ? '#7fdbca' : '#0f766e',\n },\n '& .hljs-number, & .hljs-symbol, & .hljs-bullet, & .hljs-meta': {\n color: isDarkTheme ? '#f78c6c' : '#b45309',\n },\n '& .hljs-title, & .hljs-section, & .hljs-selector-id, & .hljs-function': {\n color: isDarkTheme ? '#82aaff' : '#2563eb',\n },\n '& .hljs-variable, & .hljs-params, & .hljs-property': {\n color: isDarkTheme ? '#f07178' : '#d97706',\n },\n }}\n >\n <pre className={`hljs language-${resolvedHighlightLanguage || 'text'}`}>\n <code className=\"hljs\">\n {highlightedNodes.length > 0 ? highlightedNodes : formattedContent}\n </code>\n </pre>\n </Box>\n </Paper>\n </Box>\n ) : (\n <Typography\n component=\"pre\"\n variant=\"body2\"\n sx={{\n whiteSpace: \"pre-wrap\",\n fontFamily: \"monospace\",\n color: \"text.primary\",\n lineHeight: 1.5,\n bgcolor: 'background.paper',\n p: 2,\n borderRadius: 1,\n border: '1px solid',\n borderColor: 'divider',\n overflow: 'auto',\n maxHeight: 'calc(100vh - 200px)',\n }}\n >\n {fullContent || doc?.content}\n </Typography>\n )}\n </Box>\n )}\n \n {!loading && isPDF(doc?.name || '') && pdfCanvases.length === 0 && !error && (\n <Box sx={{ textAlign: 'center', py: 4 }}>\n <Typography variant=\"h6\" color=\"text.secondary\" gutterBottom>\n PDF Preview Not Available\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n This PDF file cannot be previewed. You can download it to view the full content.\n </Typography>\n {isVectorDocument && (\n <Button \n variant=\"contained\" \n startIcon={<DownloadIcon />}\n onClick={handleDownload}\n sx={{ mt: 2 }}\n >\n Download PDF\n </Button>\n )}\n </Box>\n )}\n </Box>\n </Dialog>\n );\n};\n\nexport default KnowledgeFileModal;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-B487-385EFF\nconst __banditFingerprint_utils_lowlightts = 'BL-FP-1A7DC2-C4E1';\nconst __auditTrail_utils_lowlightts = 'BL-AU-MGOIKVWA-DTLK';\n// File: lowlight.ts | Path: src/utils/lowlight.ts | Hash: b487c4e1\n\nimport { createLowlight } from 'lowlight';\n\nimport javascript from 'highlight.js/lib/languages/javascript';\nimport typescript from 'highlight.js/lib/languages/typescript';\nimport json from 'highlight.js/lib/languages/json';\nimport bash from 'highlight.js/lib/languages/bash';\nimport shell from 'highlight.js/lib/languages/shell';\nimport yaml from 'highlight.js/lib/languages/yaml';\nimport python from 'highlight.js/lib/languages/python';\nimport css from 'highlight.js/lib/languages/css';\nimport xml from 'highlight.js/lib/languages/xml';\nimport markdown from 'highlight.js/lib/languages/markdown';\nimport sql from 'highlight.js/lib/languages/sql';\nimport java from 'highlight.js/lib/languages/java';\nimport csharp from 'highlight.js/lib/languages/csharp';\nimport cpp from 'highlight.js/lib/languages/cpp';\nimport go from 'highlight.js/lib/languages/go';\nimport rust from 'highlight.js/lib/languages/rust';\nimport kotlin from 'highlight.js/lib/languages/kotlin';\nimport swift from 'highlight.js/lib/languages/swift';\nimport scala from 'highlight.js/lib/languages/scala';\nimport ruby from 'highlight.js/lib/languages/ruby';\nimport php from 'highlight.js/lib/languages/php';\nimport powershell from 'highlight.js/lib/languages/powershell';\n\nconst lowlight = createLowlight();\n\ntype LowlightInstance = ReturnType<typeof createLowlight>;\ntype LowlightLanguage = Parameters<LowlightInstance['register']>[1];\n\nconst asLanguage = (language: unknown): LowlightLanguage =>\n language as LowlightLanguage;\n\nconst registrations: Record<string, LowlightLanguage> = {\n javascript: asLanguage(javascript),\n js: asLanguage(javascript),\n jsx: asLanguage(javascript),\n typescript: asLanguage(typescript),\n ts: asLanguage(typescript),\n tsx: asLanguage(typescript),\n json: asLanguage(json),\n bash: asLanguage(bash),\n shell: asLanguage(shell),\n sh: asLanguage(shell),\n yaml: asLanguage(yaml),\n yml: asLanguage(yaml),\n python: asLanguage(python),\n py: asLanguage(python),\n css: asLanguage(css),\n html: asLanguage(xml),\n xml: asLanguage(xml),\n markdown: asLanguage(markdown),\n md: asLanguage(markdown),\n sql: asLanguage(sql),\n java: asLanguage(java),\n csharp: asLanguage(csharp),\n cs: asLanguage(csharp),\n cpp: asLanguage(cpp),\n c: asLanguage(cpp),\n h: asLanguage(cpp),\n go: asLanguage(go),\n rust: asLanguage(rust),\n rs: asLanguage(rust),\n kotlin: asLanguage(kotlin),\n kt: asLanguage(kotlin),\n swift: asLanguage(swift),\n scala: asLanguage(scala),\n ruby: asLanguage(ruby),\n rb: asLanguage(ruby),\n php: asLanguage(php),\n powershell: asLanguage(powershell),\n ps1: asLanguage(powershell),\n};\n\nObject.entries(registrations).forEach(([name, language]) => {\n if (!lowlight.listLanguages().includes(name)) {\n lowlight.register(name, language);\n }\n});\n\nexport function getHighlightTree(code: string, language?: string) {\n const lang = language?.toLowerCase();\n if (lang && lowlight.listLanguages().includes(lang)) {\n return lowlight.highlight(lang, code);\n }\n return lowlight.highlightAuto(code);\n}\n\nexport { lowlight };\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-27B9-B757B8\nconst __banditFingerprint_utils_markdownRenderingtsx = 'BL-FP-CD0811-8EE4';\nconst __auditTrail_utils_markdownRenderingtsx = 'BL-AU-MGOIKVWA-MS82';\n// File: markdownRendering.tsx | Path: src/utils/markdownRendering.tsx | Hash: 27b98ee4\n\nimport React from \"react\";\nimport { Box } from \"@mui/material\";\nimport type { Element, Text } from \"hast\";\nimport { defaultSchema } from \"rehype-sanitize\";\n\nexport const markdownSanitizeSchema = (() => {\n // Copy without JSON: a JSON round-trip turns the default schema's RegExp\n // values (code: [\"className\", /^language-./]) into {}, and that emptied\n // entry then strips every language class, so fenced code lost its language\n // and fell back to auto-detection (a ```ts block labelled \"CSHARP\").\n const schema: typeof defaultSchema & Record<string, unknown> = {\n ...defaultSchema,\n attributes: Object.fromEntries(\n Object.entries(defaultSchema.attributes ?? {}).map(([tag, attrs]) => [tag, [...attrs]]),\n ),\n };\n schema.tagNames = Array.from(\n new Set([...(schema.tagNames || []), \"span\", \"sup\", \"sub\"])\n );\n schema.attributes = {\n ...(schema.attributes || {}),\n \"*\": Array.from(\n new Set([...(schema.attributes?.[\"*\"] || []), \"className\", \"id\", \"data*\"])\n ),\n span: Array.from(\n new Set([\n ...(schema.attributes?.span || []),\n \"className\",\n \"data-bl-delay\",\n \"data*\",\n \"id\",\n ])\n ),\n code: Array.from(\n new Set([\n ...(schema.attributes?.code || []),\n \"className\",\n \"data-language\",\n \"data*\",\n \"id\",\n ])\n ),\n pre: Array.from(\n new Set([...(schema.attributes?.pre || []), \"className\", \"data*\", \"id\"])\n ),\n sup: Array.from(\n new Set([...(schema.attributes?.sup || []), \"className\", \"data*\", \"id\"])\n ),\n a: Array.from(\n new Set([...(schema.attributes?.a || []), \"className\", \"data*\", \"id\"])\n ),\n };\n schema.clobberPrefix = \"bl\";\n schema.allowComments = false;\n schema.strip = [\"script\", \"style\"];\n return schema;\n})();\n\n/**\n * Chat-bubble image: capped so a generated 1024px+ PNG never dominates the\n * thread, with an explicit save action. Gateway-generated images are served\n * with an attachment disposition, so the same URL that renders inline\n * downloads when opened through the anchor; other images open in a new tab.\n * Rendered inside a paragraph, so the wrapper stays a (block) span.\n */\nexport const MarkdownImage: React.FC<React.ComponentPropsWithoutRef<\"img\">> = ({ src, alt }) => {\n if (!src) return null;\n return (\n <Box component=\"span\" sx={{ display: \"block\", my: 1 }}>\n <Box\n component=\"img\"\n src={src}\n alt={alt || \"Image\"}\n loading=\"lazy\"\n sx={{\n display: \"block\",\n maxWidth: \"min(480px, 100%)\",\n maxHeight: 420,\n width: \"auto\",\n height: \"auto\",\n borderRadius: 2,\n border: \"1px solid\",\n borderColor: \"divider\",\n }}\n />\n <Box\n component=\"a\"\n href={src}\n download\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n sx={{\n display: \"inline-block\",\n mt: 0.5,\n fontSize: 13,\n fontWeight: 600,\n color: \"primary.main\",\n textDecoration: \"none\",\n \"&:hover\": { textDecoration: \"underline\" },\n }}\n >\n Save image\n </Box>\n </Box>\n );\n};\n\nexport const renderLowlightChildren = (\n nodes: Array<Element | Text>,\n keyPrefix: string\n): React.ReactNode[] =>\n nodes.map((node, index) => {\n if (node.type === \"text\") {\n return node.value;\n }\n\n if (node.type === \"element\") {\n const key = `${keyPrefix}-${index}`;\n const { tagName, properties = {}, children = [] } = node;\n const reactProps: Record<string, unknown> = { key };\n\n Object.entries(properties).forEach(([propKey, value]) => {\n if (propKey === \"className\" && Array.isArray(value)) {\n reactProps.className = value.join(\" \");\n } else if (value !== null && value !== undefined) {\n reactProps[propKey] = value;\n }\n });\n\n return React.createElement(\n tagName,\n reactProps,\n renderLowlightChildren(children as Array<Element | Text>, key)\n );\n }\n\n return null;\n });\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n*/\n\nimport { debugLogger } from \"../services/logging/debugLogger\";\n\n/**\n * Standalone iOS PWAs have no download manager, so tapping a file link\n * (the create_file S3 URLs) dead-ends. Instead: fetch the file and hand it\n * to the native share sheet (\"Save to Files\", AirDrop, Mail…), which is a\n * better mobile flow than a browser download anyway. Browser tabs keep the\n * normal target=_blank download behavior.\n */\n\nconst FILE_EXT_RE = /\\.(docx|pptx|xlsx|csv|json|md|txt|html|xml|ya?ml|pdf|zip)(?:[?#]|$)/i;\n\nconst isStandalonePwa = (): boolean =>\n typeof window !== \"undefined\" &&\n (window.matchMedia?.(\"(display-mode: standalone)\").matches ||\n (window.navigator as Navigator & { standalone?: boolean }).standalone === true);\n\nexport const isFileLink = (href: string | undefined): boolean =>\n Boolean(href && FILE_EXT_RE.test(href));\n\n/**\n * Attach to a file link's onClick. Returns without touching the event unless\n * we're in a standalone PWA looking at a file link — the anchor's own\n * target=_blank handles every other case.\n */\nexport const maybeHandleFileLinkClick = (\n event: { preventDefault: () => void },\n href: string | undefined\n): void => {\n if (!href || !isStandalonePwa() || !isFileLink(href)) return;\n event.preventDefault();\n\n void (async () => {\n try {\n const res = await fetch(href);\n if (!res.ok) throw new Error(`fetch ${res.status}`);\n const blob = await res.blob();\n const rawName = new URL(href, window.location.href).pathname.split(\"/\").pop() || \"download\";\n const name = decodeURIComponent(rawName);\n const file = new File([blob], name, {\n type: blob.type || \"application/octet-stream\",\n });\n const nav = navigator as Navigator & {\n canShare?: (data: { files: File[] }) => boolean;\n share?: (data: { files: File[]; title?: string }) => Promise<void>;\n };\n if (nav.canShare?.({ files: [file] }) && nav.share) {\n await nav.share({ files: [file], title: name });\n return;\n }\n // No file-share support: navigate to an object URL — the webview's\n // Quick Look previews Office docs and PDFs.\n window.location.href = URL.createObjectURL(blob);\n } catch (error) {\n debugLogger.warn(\"openFileLink: share flow failed, falling back\", {\n error: error instanceof Error ? error.message : String(error),\n });\n // AbortError = the user closed the share sheet — nothing to do.\n if ((error as { name?: string })?.name === \"AbortError\") return;\n window.open(href, \"_blank\", \"noopener\");\n }\n })();\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-39FF-8FD178\nconst __banditFingerprint_chatmodal_airesponseactionbartsx = 'BL-FP-F5CD26-176D';\nconst __auditTrail_chatmodal_airesponseactionbartsx = 'BL-AU-MGOIKVVL-8RC1';\n// File: ai-response-action-bar.tsx | Path: src/modals/chat-modal/ai-response-action-bar.tsx | Hash: 39ff176d\n\nimport { useState, useEffect } from \"react\";\nimport { useVoiceStore } from \"../../store/voiceStore\";\nimport { usePreferencesStore } from \"../../store/preferencesStore\";\nimport { usePackageSettingsStore } from \"../../store/packageSettingsStore\";\nimport { useCanvasStore } from \"../../store/canvasStore\";\nimport { useTTS } from \"../../hooks/useTTS\";\nimport { Box, CircularProgress, IconButton, Tooltip } from \"@mui/material\";\nimport { Check as CheckIcon, ThumbsUp as ThumbUpIcon, ThumbsDown as ThumbDownIcon, Copy as ContentCopyIcon, Megaphone as CampaignOutlined, Megaphone as CampaignRounded, Square as StopIcon, Pause as PauseIcon, Play as PlayArrowIcon, PanelRight as CanvasIcon } from \"@burtson-labs/icons/react\";\nimport { debugLogger } from \"../../services/logging/debugLogger\";\nimport type { SxProps, Theme } from \"@mui/material/styles\";\nimport { chatTokens } from \"../../chat/chat-tokens\";\n\n// One look for every response action: muted until hovered; a pressed\n// feedback button takes the selection colour (a dislike is a choice, not an\n// error).\nconst actionSx: SxProps<Theme> = (theme) => {\n const t = chatTokens(theme);\n return {\n color: t.control.foregroundMuted,\n \"&:hover\": { color: t.control.foreground, bgcolor: t.surface.interactive },\n \"&[aria-pressed='true']\": { color: theme.palette.primary.main },\n \"&.Mui-disabled\": { color: t.control.foregroundMuted, opacity: 0.5 },\n };\n};\nimport { authenticationService } from \"../../services/auth/authenticationService\";\n\nconst AiResponseActionsBar: React.FC<{ text: string }> = ({ text }) => {\n const [copied, setCopied] = useState(false);\n const openCanvas = useCanvasStore((s) => s.openCanvas);\n const openInCanvas = () => {\n const plain = text || \"\";\n // Title from the first heading, else the first non-empty line, truncated.\n const firstHeading = plain.match(/^#{1,3}\\s+(.+)$/m)?.[1];\n const firstLine = plain.split(\"\\n\").map((l) => l.trim()).find(Boolean) || \"\";\n const rawTitle = (firstHeading || firstLine).replace(/[#*_>]/g, \"\").replace(/\\s+/g, \" \").trim();\n const title = rawTitle.length > 60 ? `${rawTitle.slice(0, 57)}…` : rawTitle || \"Untitled\";\n openCanvas({ content: plain, title });\n };\n const [feedback, setFeedback] = useState<\"like\" | \"dislike\" | null>(null);\n \n const {\n isPlaying,\n isPaused,\n isLoading,\n error: ttsError,\n speak: ttsSpeak,\n stop: ttsStop,\n pause: ttsPause,\n resume: ttsResume,\n isAvailable: isTTSAvailable\n } = useTTS();\n\n const { availableVoices, loadVoicesFromAPI, initialized } = useVoiceStore();\n const { preferences } = usePreferencesStore();\n const { settings: packageSettings } = usePackageSettingsStore();\n\n // Load voices when component mounts if none are available\n useEffect(() => {\n const isAuthenticated = authenticationService.isAuthenticated();\n const token = authenticationService.getToken();\n \n if (!initialized || availableVoices.length === 0) {\n if (token && isAuthenticated) {\n debugLogger.debug('AI Action Bar: Voices not initialized or unavailable, attempting to load from API');\n loadVoicesFromAPI();\n } else {\n debugLogger.debug('AI Action Bar: No valid JWT token available - skipping voice loading');\n }\n }\n }, [initialized, availableVoices.length, loadVoicesFromAPI]);\n\n // Show TTS error if any\n useEffect(() => {\n if (ttsError) {\n debugLogger.error('TTS Error in action bar:', { error: ttsError });\n }\n }, [ttsError]);\n\n const handleCopy = () => {\n // Remove HTML tags\n let plainText = text.replace(/<\\/?[^>]+(>|$)/g, \"\");\n\n // Remove Markdown syntax\n plainText = plainText\n .replace(/`{1,3}[\\s\\S]*?`{1,3}/g, \"\") // inline and block code\n .replace(/!\\[.*?\\]\\(.*?\\)/g, \"\") // images\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, \"$1\") // links\n .replace(/[*_~`>#-]/g, \"\") // emphasis, headings, etc.\n .replace(/^\\s*\\d+\\s*[:.]?\\s*$/gm, \"\") // numbered list items like \"1. :\" or \"2:\"\n .replace(/^\\s*[:.]+\\s*$/gm, \"\") // lines with just colons or periods\n .replace(/:+(?=\\s|$)/g, \"\") // trailing colons\n .replace(/\\n{3,}/g, \"\\n\\n\"); // limit excessive line breaks\n\n plainText = plainText.trim();\n\n navigator.clipboard.writeText(plainText);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n const handleTTSClick = async () => {\n try {\n if (!isTTSAvailable) {\n return;\n }\n\n if (isPaused) {\n // If paused, resume\n ttsResume();\n } else if (!isPlaying) {\n // If idle or error, start playing with streaming\n // Clean the text first - remove HTML tags and Markdown syntax\n let cleanText = text.replace(/<\\/?[^>]+(>|$)/g, \"\");\n\n // Remove Markdown syntax\n cleanText = cleanText\n .replace(/`{1,3}[\\s\\S]*?`{1,3}/g, \"\") // inline and block code\n .replace(/!\\[.*?\\]\\(.*?\\)/g, \"\") // images\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, \"$1\") // links\n .replace(/[*_~`>#-]/g, \"\") // emphasis, headings, etc.\n .replace(/^\\s*\\d+\\s*[:.]?\\s*$/gm, \"\") // numbered list items like \"1. :\" or \"2:\"\n .replace(/^\\s*[:.]+\\s*$/gm, \"\") // lines with just colons or periods\n .replace(/:+(?=\\s|$)/g, \"\") // trailing colons\n .replace(/\\n{3,}/g, \"\\n\\n\"); // limit excessive line breaks\n\n cleanText = cleanText.trim();\n\n if (!cleanText) {\n return;\n }\n\n await ttsSpeak(cleanText, { \n useStreaming: true, // Enable streaming for faster response\n useRealtime: true // Use real-time streaming for immediate playback\n });\n }\n // Note: If already playing, do nothing (pause and stop have their own buttons)\n } catch (error) {\n debugLogger.error('TTS playback failed:', { \n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n });\n }\n };\n\n const handleFeedback = (type: \"like\" | \"dislike\") => {\n setFeedback(type);\n // Example: memoryEnhancer.addMemory(`User ${type === \"like\" ? \"liked\" : \"disliked\"} this response`);\n };\n\n return (\n <Box sx={{ mt: 2, display: \"flex\", gap: 2, alignItems: \"center\", flexWrap: \"wrap\" }}>\n <Tooltip title={copied ? \"Copied!\" : \"Copy entire response\"}>\n <IconButton\n onClick={handleCopy}\n size=\"small\"\n aria-label={copied ? \"Copied\" : \"Copy response\"}\n sx={actionSx}\n >\n {copied ? <CheckIcon size={18} /> : <ContentCopyIcon size={18} />}\n </IconButton>\n </Tooltip>\n\n <Tooltip title=\"Open in canvas — edit & export\">\n <IconButton\n onClick={openInCanvas}\n size=\"small\"\n aria-label=\"Open in canvas\"\n sx={actionSx}\n >\n <CanvasIcon size={18} />\n </IconButton>\n </Tooltip>\n\n {isTTSAvailable && ( \n <>\n {/* Main TTS Button - Play/Resume */}\n <Tooltip\n title={\n !isTTSAvailable ? \"TTS not available - check configuration\" :\n isLoading ? \"Loading audio...\" :\n isPaused ? \"Resume playback\" :\n isPlaying ? \"Playing audio...\" :\n \"Play response with voice\"\n }\n >\n <IconButton\n onClick={handleTTSClick}\n size=\"small\"\n disabled={isLoading}\n aria-label={isPaused ? \"Resume playback\" : isPlaying ? \"Playing\" : \"Read aloud\"}\n sx={actionSx}\n >\n {isLoading ? (\n <CircularProgress size={18} />\n ) : isPaused ? (\n <PlayArrowIcon size={18} />\n ) : !isPlaying ? (\n <CampaignOutlined size={18} />\n ) : (\n <Box component=\"span\" sx={(t) => ({ display: \"inline-flex\", color: chatTokens(t).status.streaming })}><CampaignRounded size={18} /></Box>\n )}\n </IconButton>\n </Tooltip>\n\n {/* Pause Button - Only show when playing */}\n {isPlaying && (\n <Tooltip title=\"Pause playback\">\n <IconButton\n onClick={() => ttsPause()}\n size=\"small\"\n aria-label=\"Pause playback\"\n sx={actionSx}\n >\n <PauseIcon size={18} />\n </IconButton>\n </Tooltip>\n )}\n\n {/* Stop Button - Show when playing or paused */}\n {(isPlaying || isPaused) && (\n <Tooltip title=\"Stop playback\">\n <IconButton\n onClick={() => ttsStop()}\n size=\"small\"\n aria-label=\"Stop playback\"\n sx={actionSx}\n >\n <StopIcon size={18} />\n </IconButton>\n </Tooltip>\n )}\n </>\n )}\n\n <Tooltip title=\"Like this response\">\n <IconButton\n onClick={() => handleFeedback(\"like\")}\n size=\"small\"\n aria-label=\"Like this response\"\n aria-pressed={feedback === \"like\"}\n sx={actionSx}\n >\n <ThumbUpIcon size={18} />\n </IconButton>\n </Tooltip>\n\n <Tooltip title=\"Dislike this response\">\n <IconButton\n onClick={() => handleFeedback(\"dislike\")}\n size=\"small\"\n aria-label=\"Dislike this response\"\n aria-pressed={feedback === \"dislike\"}\n sx={actionSx}\n >\n <ThumbDownIcon size={18} />\n </IconButton>\n </Tooltip>\n </Box>\n );\n};\n\nexport default AiResponseActionsBar;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-4406-DFAD47\nconst __banditFingerprint_feedback_FeedbackModaltsx = 'BL-FP-226BC1-E25A';\nconst __auditTrail_feedback_FeedbackModaltsx = 'BL-AU-MGOIKVVA-WQG3';\n// File: FeedbackModal.tsx | Path: src/components/feedback/FeedbackModal.tsx | Hash: 4406e25a\n\nimport React, { useState, useCallback, useRef } from 'react';\nimport { GlobalStyles } from '@mui/material';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Button,\n TextField,\n FormControl,\n InputLabel,\n Select,\n MenuItem,\n Box,\n Typography,\n IconButton,\n Chip,\n Alert,\n Paper,\n Avatar,\n CircularProgress,\n Fade,\n Slider,\n Stack,\n useMediaQuery,\n Snackbar,\n} from '@mui/material';\nimport { X as CloseIcon, Bug as BugReportIcon, Lightbulb as LightbulbIcon, TrendingUp as TrendingUpIcon, HelpCircle as HelpIcon, MessageSquare as MessageIcon, Camera as PhotoCameraIcon, Paperclip as AttachFileIcon, Trash as DeleteIcon, Mail as MailIcon } from '@burtson-labs/icons/react';\nimport { \n FeedbackRequest, \n FeedbackResponse,\n FeedbackCategories, \n FeedbackPriorities \n} from '../../services/gateway/feedback.interfaces';\nimport { useModelStore } from '../../store/modelStore';\nimport { useConversationStore } from '../../store/conversationStore';\nimport { usePackageSettingsStore } from '../../store/packageSettingsStore';\nimport { GatewayService } from '../../services/gateway/gateway.service';\nimport { authenticationService } from '../../services/auth/authenticationService';\nimport { useTheme, alpha } from '@mui/material/styles';\n\nexport interface FeedbackModalProps {\n open: boolean;\n onClose: () => void;\n feedbackEmail?: string;\n}\n\nconst feedbackCategories: FeedbackCategories = {\n bug: {\n label: 'Bug Report',\n description: \"Something isn't working as expected\",\n icon: 'BugReport',\n color: '#f44336',\n },\n feature: {\n label: 'Feature Request',\n description: 'Suggest a new feature or enhancement',\n icon: 'Lightbulb',\n color: '#2196f3',\n },\n improvement: {\n label: 'Improvement',\n description: 'Suggest improvements to existing features',\n icon: 'TrendingUp',\n color: '#ff9800',\n },\n question: {\n label: 'Question',\n description: 'Ask a question about usage or functionality',\n icon: 'Help',\n color: '#9c27b0',\n },\n other: {\n label: 'Other',\n description: 'General feedback or other topics',\n icon: 'Message',\n color: '#607d8b',\n },\n};\n\nconst feedbackPriorities: FeedbackPriorities = {\n low: {\n label: 'Low',\n description: 'Minor issue, can wait',\n color: '#4caf50',\n },\n medium: {\n label: 'Medium',\n description: 'Normal priority',\n color: '#ff9800',\n },\n high: {\n label: 'High',\n description: 'Important, needs attention soon',\n color: '#f44336',\n },\n critical: {\n label: 'Critical',\n description: 'Urgent, blocks usage',\n color: '#d32f2f',\n },\n};\n\nconst iconMap = {\n BugReport: BugReportIcon,\n Lightbulb: LightbulbIcon,\n TrendingUp: TrendingUpIcon,\n Help: HelpIcon,\n Message: MessageIcon,\n};\n\nexport const FeedbackModal: React.FC<FeedbackModalProps> = ({\n open,\n onClose,\n feedbackEmail,\n}) => {\n const theme = useTheme();\n const isMobile = useMediaQuery(theme.breakpoints.down('sm'));\n const fileInputRef = useRef<HTMLInputElement>(null);\n \n // Store state\n const { selectedModel } = useModelStore();\n const { conversations } = useConversationStore();\n const { settings } = usePackageSettingsStore();\n \n // Form state\n const [formData, setFormData] = useState<Partial<FeedbackRequest>>({\n title: '',\n description: '',\n category: 'bug',\n priority: 'medium',\n contactEmail: '',\n images: [],\n attachments: [],\n annoyanceLevel: 3, // 1-5 scale, 3 = neutral\n });\n \n const [isSubmitting, setIsSubmitting] = useState(false);\n const [submitStatus, setSubmitStatus] = useState<'idle' | 'success' | 'error'>('idle');\n const [errorMessage, setErrorMessage] = useState('');\n const [snackbarOpen, setSnackbarOpen] = useState(false);\n const [snackbarMessage, setSnackbarMessage] = useState('');\n const [confirmDialogOpen, setConfirmDialogOpen] = useState(false);\n const touchStartYRef = useRef<number | null>(null);\n const touchLatestYRef = useRef<number | null>(null);\n\n // Get browser info\n const getBrowserInfo = useCallback(() => {\n const ua = navigator.userAgent;\n let browserName = 'Unknown';\n let browserVersion = 'Unknown';\n \n if (ua.includes('Chrome')) {\n browserName = 'Chrome';\n browserVersion = ua.match(/Chrome\\/([0-9.]+)/)?.[1] || 'Unknown';\n } else if (ua.includes('Firefox')) {\n browserName = 'Firefox';\n browserVersion = ua.match(/Firefox\\/([0-9.]+)/)?.[1] || 'Unknown';\n } else if (ua.includes('Safari')) {\n browserName = 'Safari';\n browserVersion = ua.match(/Version\\/([0-9.]+)/)?.[1] || 'Unknown';\n }\n \n return {\n name: browserName,\n version: browserVersion,\n platform: navigator.platform,\n };\n }, []);\n\n // Handle form changes\n const handleInputChange = (field: keyof FeedbackRequest) => (\n event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement> | { target: { value: unknown } }\n ) => {\n setFormData(prev => ({\n ...prev,\n [field]: event.target.value,\n }));\n };\n\n // Handle file uploads\n const handleFileUpload = (event: React.ChangeEvent<HTMLInputElement>) => {\n const files = event.target.files;\n if (!files || files.length === 0) return;\n\n const file = files[0]; // Only take the first file\n if (file.type.startsWith('image/')) {\n // Handle single image only - replace existing if present\n const reader = new FileReader();\n reader.onload = (e) => {\n const base64 = e.target?.result as string;\n setFormData(prev => ({\n ...prev,\n images: [base64], // Only keep one image\n }));\n };\n reader.readAsDataURL(file);\n } else {\n // Show error for non-image files\n setSnackbarMessage('❌ Please select an image file only (JPG, PNG, GIF)');\n setSnackbarOpen(true);\n }\n \n // Reset file input\n if (event.target) {\n event.target.value = '';\n }\n };\n\n // Remove image (single image)\n const removeImage = () => {\n setFormData(prev => ({\n ...prev,\n images: [],\n }));\n };\n\n // Copy image to clipboard\n const copyImageToClipboard = async () => {\n if (!formData.images?.[0]) return;\n \n try {\n // Convert base64 to blob\n const base64Data = formData.images[0].split(',')[1];\n const byteCharacters = atob(base64Data);\n const byteNumbers = new Array(byteCharacters.length);\n for (let i = 0; i < byteCharacters.length; i++) {\n byteNumbers[i] = byteCharacters.charCodeAt(i);\n }\n const byteArray = new Uint8Array(byteNumbers);\n const blob = new Blob([byteArray], { type: 'image/png' });\n \n // Copy to clipboard\n await navigator.clipboard.write([\n new ClipboardItem({\n 'image/png': blob,\n }),\n ]);\n \n setSnackbarMessage('📎 Image copied to clipboard! Paste it in your email.');\n setSnackbarOpen(true);\n } catch (error) {\n console.error('Failed to copy image to clipboard:', error);\n setSnackbarMessage('❌ Failed to copy image. Please attach manually.');\n setSnackbarOpen(true);\n }\n };\n\n const handleHeaderTouchStart = (event: React.TouchEvent<HTMLDivElement>) => {\n if (!isMobile) return;\n const touch = event.touches[0];\n touchStartYRef.current = touch.clientY;\n touchLatestYRef.current = touch.clientY;\n };\n\n const handleHeaderTouchMove = (event: React.TouchEvent<HTMLDivElement>) => {\n if (!isMobile) return;\n if (touchStartYRef.current === null) return;\n touchLatestYRef.current = event.touches[0].clientY;\n };\n\n const handleHeaderTouchEnd = () => {\n if (!isMobile) return;\n if (touchStartYRef.current === null || touchLatestYRef.current === null) {\n touchStartYRef.current = null;\n touchLatestYRef.current = null;\n return;\n }\n\n const delta = touchLatestYRef.current - touchStartYRef.current;\n touchStartYRef.current = null;\n touchLatestYRef.current = null;\n\n if (delta > 80) {\n handleClose();\n }\n };\n\n // Remove attachment\n const removeAttachment = (index: number) => {\n setFormData(prev => ({\n ...prev,\n attachments: prev.attachments?.filter((_, i) => i !== index) || [],\n }));\n };\n\n // Generate session info\n const getSessionInfo = useCallback(() => {\n const currentConversation = conversations[0]; // Get current conversation\n return {\n currentModel: selectedModel,\n currentProvider: 'Bandit AI',\n conversationId: currentConversation?.id || 'N/A',\n timestamp: new Date().toISOString(),\n };\n }, [selectedModel, conversations]);\n\n // Handle submit\n const handleSubmit = async () => {\n if (!formData.title?.trim() || !formData.description?.trim()) {\n setErrorMessage('Please fill in both title and description');\n return;\n }\n\n // Show confirmation dialog if there's an image\n if (formData.images && formData.images.length > 0) {\n setConfirmDialogOpen(true);\n return;\n }\n\n // If no image, proceed directly\n await performSubmit();\n };\n\n // Perform the actual submission\n const performSubmit = async () => {\n setIsSubmitting(true);\n setErrorMessage('');\n setConfirmDialogOpen(false);\n\n try {\n // Create gateway service instance\n const gatewayUrl = settings?.gatewayApiUrl;\n if (!gatewayUrl) {\n throw new Error('Gateway API URL not configured');\n }\n\n const gatewayService = new GatewayService(\n gatewayUrl,\n () => authenticationService.getToken(),\n feedbackEmail || settings?.feedbackEmail\n );\n\n // Prepare complete feedback request\n const feedbackRequest: FeedbackRequest = {\n title: formData.title!,\n description: formData.description!,\n category: formData.category ?? 'bug',\n priority: formData.priority ?? 'medium',\n annoyanceLevel: formData.annoyanceLevel,\n images: formData.images,\n attachments: formData.attachments,\n contactEmail: formData.contactEmail,\n userAgent: navigator.userAgent,\n browserInfo: getBrowserInfo(),\n sessionInfo: getSessionInfo(),\n };\n\n // Submit feedback using gateway service\n gatewayService.submitFeedback(feedbackRequest).subscribe({\n next: async (response: FeedbackResponse) => {\n // Copy image to clipboard if present\n if (formData.images && formData.images.length > 0) {\n await copyImageToClipboard();\n }\n \n if (response?.mailtoUrl) {\n // Open mailto URL if provided (fallback case)\n window.location.href = response.mailtoUrl;\n }\n \n setSubmitStatus('success');\n \n // Close modal after a short delay\n setTimeout(() => {\n handleClose();\n }, 2000);\n },\n error: (subscribeError: unknown) => {\n console.error('Failed to submit feedback:', subscribeError);\n setErrorMessage('Failed to submit feedback. Please try again.');\n setSubmitStatus('error');\n setIsSubmitting(false);\n },\n complete: () => {\n setIsSubmitting(false);\n }\n });\n \n } catch (error) {\n console.error('Failed to initialize feedback:', error);\n setErrorMessage('Failed to initialize feedback system. Please try again.');\n setSubmitStatus('error');\n setIsSubmitting(false);\n }\n };\n\n // Handle close with reset\n const handleClose = () => {\n setFormData({\n title: '',\n description: '',\n category: 'bug',\n priority: 'medium',\n contactEmail: '',\n images: [],\n attachments: [],\n annoyanceLevel: 3,\n });\n setSubmitStatus('idle');\n setErrorMessage('');\n setSnackbarOpen(false);\n setSnackbarMessage('');\n setConfirmDialogOpen(false);\n onClose();\n };\n\n const selectedCategory = feedbackCategories[formData.category as keyof FeedbackCategories];\n const selectedPriority = feedbackPriorities[formData.priority as keyof FeedbackPriorities];\n const IconComponent = iconMap[selectedCategory?.icon as keyof typeof iconMap] || MessageIcon;\n\n const isValid = !!formData.title?.trim() && !!formData.description?.trim();\n\n return (\n <>\n {/* Global or component-scoped scrollbar styles */}\n <GlobalStyles styles={{\n '::-webkit-scrollbar': {\n width: '8px',\n },\n '::-webkit-scrollbar-track': {\n background: 'transparent',\n },\n '::-webkit-scrollbar-thumb': {\n backgroundColor: '#444',\n borderRadius: '4px',\n border: '1px solid #222',\n },\n }} />\n <Dialog\n open={open}\n onClose={handleClose}\n maxWidth=\"md\"\n fullWidth\n fullScreen={isMobile}\n TransitionComponent={Fade}\n scroll=\"paper\"\n PaperProps={{\n sx: {\n borderRadius: isMobile ? 0 : 3,\n bgcolor: theme.palette.background.paper,\n backgroundImage: theme.palette.mode === 'dark'\n ? 'linear-gradient(145deg, rgba(255,255,255,0.02) 0%, rgba(255,255,255,0.01) 100%)'\n : 'linear-gradient(145deg, rgba(255,255,255,0.8) 0%, rgba(255,255,255,0.4) 100%)',\n backdropFilter: 'blur(20px)',\n border: `1px solid ${theme.palette.mode === 'dark' ? 'rgba(255,255,255,0.1)' : 'rgba(0,0,0,0.05)'}`,\n boxShadow: theme.palette.mode === 'dark'\n ? '0 32px 120px rgba(0,0,0,0.8), 0 0 0 1px rgba(255,255,255,0.05)'\n : '0 32px 120px rgba(0,0,0,0.15), 0 0 0 1px rgba(0,0,0,0.02)',\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column',\n // Size to the (now condensed) content instead of pinning to the\n // full viewport — a mostly-empty full-height sheet looked broken.\n height: isMobile ? '100dvh' : 'auto',\n maxHeight: isMobile ? '100dvh' : '90vh',\n margin: isMobile ? 0 : 'auto',\n position: 'relative',\n },\n }}\n BackdropProps={{\n sx: {\n bgcolor: theme.palette.mode === 'dark'\n ? 'rgba(0, 0, 0, 0.7)'\n : 'rgba(0, 0, 0, 0.4)',\n backdropFilter: 'blur(8px)',\n },\n }}\n sx={{\n '& .MuiDialog-container': {\n alignItems: 'center',\n justifyContent: 'center',\n },\n }}\n >\n {/* Custom DialogTitle for header */}\n <DialogTitle\n onTouchStart={handleHeaderTouchStart}\n onTouchMove={handleHeaderTouchMove}\n onTouchEnd={handleHeaderTouchEnd}\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: isMobile ? 1.25 : 1.5,\n pr: { xs: 2, sm: 3 },\n pl: { xs: 2, sm: 3 },\n pt: { xs: isMobile ? 1.5 : 3, sm: 3 },\n pb: { xs: 1.5, sm: 2 },\n touchAction: 'pan-y',\n }}\n >\n {isMobile && (\n <Box\n sx={{\n width: 56,\n height: 6,\n borderRadius: 999,\n bgcolor: alpha(theme.palette.text.primary, 0.18),\n alignSelf: 'center',\n mb: 1,\n }}\n />\n )}\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 1.5,\n width: '100%',\n }}\n >\n <Stack spacing={0.5} sx={{ minWidth: 0 }}>\n <Typography variant=\"h6\" fontWeight=\"bold\" noWrap>Send Feedback</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" noWrap>Help us improve Bandit AI</Typography>\n </Stack>\n <IconButton onClick={handleClose} size=\"small\"><CloseIcon /></IconButton>\n </Box>\n </DialogTitle>\n <DialogContent\n sx={{\n p: { xs: 1.5, sm: 3 },\n maxHeight: 'calc(100dvh - 80px)',\n overflowY: 'auto',\n backgroundColor: 'background.default',\n scrollbarGutter: 'stable',\n }}\n >\n\n {/* Modal Content Below */}\n {submitStatus === 'success' && (\n <Alert \n severity=\"success\" \n sx={{ \n mb: 2,\n '& .MuiAlert-icon': {\n color: theme.palette.success.main,\n },\n background: theme.palette.mode === 'dark' \n ? 'linear-gradient(135deg, rgba(76,175,80,0.1) 0%, rgba(46,125,50,0.1) 100%)'\n : 'linear-gradient(135deg, rgba(76,175,80,0.05) 0%, rgba(46,125,50,0.05) 100%)',\n border: `1px solid ${theme.palette.success.main}30`,\n borderRadius: 2,\n }}\n >\n <Typography variant=\"body2\" sx={{ fontWeight: 600 }}>\n Feedback submitted successfully!\n </Typography>\n <Typography variant=\"caption\" display=\"block\" sx={{ mt: 0.5, opacity: 0.9 }}>\n {formData.images && formData.images.length > 0\n ? \"Your email client should open with the feedback details. The image has been copied to your clipboard - paste it in the email!\"\n : (formData.attachments && formData.attachments.length > 0)\n ? \"Your email client should open with the feedback details. Please manually attach your files to the email.\"\n : \"Your email client should open with the feedback details.\"\n }\n </Typography>\n </Alert>\n )}\n\n {errorMessage && (\n <Alert \n severity=\"error\" \n sx={{ \n mb: 2,\n '& .MuiAlert-icon': {\n color: theme.palette.error.main,\n },\n background: theme.palette.mode === 'dark' \n ? 'linear-gradient(135deg, rgba(244,67,54,0.1) 0%, rgba(211,47,47,0.1) 100%)'\n : 'linear-gradient(135deg, rgba(244,67,54,0.05) 0%, rgba(211,47,47,0.05) 100%)',\n border: `1px solid ${theme.palette.error.main}30`,\n borderRadius: 2,\n }}\n >\n {errorMessage}\n </Alert>\n )}\n\n <Box\n sx={{\n display: 'grid',\n gridTemplateRows: 'auto auto auto auto',\n rowGap: '16px',\n columnGap: '0px',\n width: '100%',\n // Headroom for the first field's floating label — MUI zeroes\n // DialogContent's top padding after a DialogTitle, which clipped\n // the \"Title\" label under the header.\n pt: 1.5,\n }}\n >\n {/* Feedback Details */}\n <Box\n sx={{\n display: 'grid',\n gridTemplateColumns: { xs: '1fr', sm: '1fr 1fr' },\n gridTemplateRows: 'auto auto auto',\n gap: '16px',\n mb: 0,\n }}\n >\n {/* Title - full width */}\n <TextField\n fullWidth\n label=\"Title\"\n value={formData.title}\n onChange={handleInputChange('title')}\n placeholder=\"Brief summary of your feedback\"\n required\n size=\"medium\"\n InputLabelProps={{ shrink: true }}\n sx={{\n minHeight: 48,\n gridColumn: '1 / -1',\n '& .MuiInputBase-root': {\n minHeight: 48,\n },\n '& .MuiOutlinedInput-root': {\n borderRadius: 2,\n transition: 'all 0.2s ease',\n '&:hover': {\n transform: 'translateY(-1px)',\n boxShadow: theme.palette.mode === 'dark'\n ? '0 4px 12px rgba(0,0,0,0.3)'\n : '0 4px 12px rgba(0,0,0,0.1)',\n },\n '&.Mui-focused': {\n transform: 'translateY(-1px)',\n boxShadow: theme.palette.mode === 'dark'\n ? '0 6px 16px rgba(0,0,0,0.4)'\n : '0 6px 16px rgba(0,0,0,0.15)',\n },\n },\n }}\n />\n {/* Category */}\n <FormControl\n fullWidth\n size=\"medium\"\n sx={{\n minHeight: 48,\n '& .MuiInputBase-root': {\n minHeight: 48,\n },\n '& .MuiOutlinedInput-root': {\n borderRadius: 2,\n transition: 'all 0.2s ease',\n '&:hover': {\n transform: 'translateY(-1px)',\n boxShadow: theme.palette.mode === 'dark'\n ? '0 4px 12px rgba(0,0,0,0.3)'\n : '0 4px 12px rgba(0,0,0,0.1)',\n },\n '&.Mui-focused': {\n transform: 'translateY(-1px)',\n boxShadow: theme.palette.mode === 'dark'\n ? '0 6px 16px rgba(0,0,0,0.4)'\n : '0 6px 16px rgba(0,0,0,0.15)',\n },\n },\n }}\n >\n <InputLabel shrink id=\"category-label\">Category</InputLabel>\n <Select\n labelId=\"category-label\"\n id=\"category\"\n value={formData.category}\n label=\"Category\"\n onChange={handleInputChange('category')}\n >\n {Object.entries(feedbackCategories).map(([key, category]) => {\n const Icon = iconMap[category.icon as keyof typeof iconMap];\n return (\n <MenuItem key={key} value={key}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1.5 }}>\n <Icon size={20} color={category.color} />\n <Box>\n <Typography variant=\"body2\" sx={{ fontWeight: 500 }}>{category.label}</Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {category.description}\n </Typography>\n </Box>\n </Box>\n </MenuItem>\n );\n })}\n </Select>\n </FormControl>\n {/* Priority */}\n <FormControl\n fullWidth\n size=\"medium\"\n sx={{\n minHeight: 48,\n '& .MuiInputBase-root': {\n minHeight: 48,\n },\n '& .MuiOutlinedInput-root': {\n borderRadius: 2,\n transition: 'all 0.2s ease',\n '&:hover': {\n transform: 'translateY(-1px)',\n boxShadow: theme.palette.mode === 'dark'\n ? '0 4px 12px rgba(0,0,0,0.3)'\n : '0 4px 12px rgba(0,0,0,0.1)',\n },\n '&.Mui-focused': {\n transform: 'translateY(-1px)',\n boxShadow: theme.palette.mode === 'dark'\n ? '0 6px 16px rgba(0,0,0,0.4)'\n : '0 6px 16px rgba(0,0,0,0.15)',\n },\n },\n }}\n >\n <InputLabel shrink id=\"priority-label\">Priority</InputLabel>\n <Select\n labelId=\"priority-label\"\n id=\"priority\"\n value={formData.priority}\n label=\"Priority\"\n onChange={handleInputChange('priority')}\n >\n {Object.entries(feedbackPriorities).map(([key, priority]) => (\n <MenuItem key={key} value={key}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1.5 }}>\n <Box\n sx={{\n width: 12,\n height: 12,\n borderRadius: '50%',\n bgcolor: priority.color,\n boxShadow: `0 0 0 2px ${priority.color}20`,\n }}\n />\n <Box>\n <Typography variant=\"body2\" sx={{ fontWeight: 500 }}>{priority.label}</Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {priority.description}\n </Typography>\n </Box>\n </Box>\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n {/* Description - full width, tall */}\n <TextField\n fullWidth\n multiline\n rows={3}\n label=\"Description\"\n value={formData.description}\n onChange={handleInputChange('description')}\n placeholder=\"Please provide detailed information about your feedback...\"\n required\n size=\"medium\"\n InputLabelProps={{ shrink: true }}\n sx={{\n minHeight: 48,\n gridColumn: '1 / -1',\n '& .MuiInputBase-root': {\n minHeight: 48,\n alignItems: 'flex-start',\n py: 1.5,\n },\n '& .MuiOutlinedInput-root': {\n borderRadius: 2,\n transition: 'all 0.2s ease',\n '&:hover': {\n transform: 'translateY(-1px)',\n boxShadow: theme.palette.mode === 'dark'\n ? '0 4px 12px rgba(0,0,0,0.3)'\n : '0 4px 12px rgba(0,0,0,0.1)',\n },\n '&.Mui-focused': {\n transform: 'translateY(-1px)',\n boxShadow: theme.palette.mode === 'dark'\n ? '0 6px 16px rgba(0,0,0,0.4)'\n : '0 6px 16px rgba(0,0,0,0.15)',\n },\n },\n }}\n />\n </Box>\n {/* Impact Assessment & Attachments - side by side, visually aligned */}\n <Box\n className=\"feedback-section-row\"\n sx={{\n display: 'flex',\n flexWrap: 'wrap',\n gap: '24px',\n alignItems: 'stretch',\n width: '100%',\n // Responsive stacking for mobile\n flexDirection: { xs: 'column', md: 'row' },\n }}\n >\n {/* Impact — one compact row, no card chrome */}\n <Box\n className=\"impact-section\"\n sx={{ flex: 1, minWidth: 260, display: 'flex', flexDirection: 'column' }}\n >\n <Typography variant=\"body2\" sx={{ fontWeight: 600, mb: 0.5 }}>\n How annoying is this?{' '}\n {['😊', '😐', '🙄', '😠', '🤬'][(formData.annoyanceLevel ?? 3) - 1]}{' '}\n ({formData.annoyanceLevel ?? 3}/5)\n </Typography>\n <Box sx={{ px: 1 }}>\n <Slider\n size=\"small\"\n value={formData.annoyanceLevel}\n onChange={(_, value) => setFormData(prev => ({ ...prev, annoyanceLevel: value as number }))}\n min={1}\n max={5}\n step={1}\n marks\n sx={{\n '& .MuiSlider-track': {\n background: `linear-gradient(90deg, ${theme.palette.success.main}, ${theme.palette.warning.main}, ${theme.palette.error.main})`,\n border: 'none',\n },\n '& .MuiSlider-thumb': {\n background: `linear-gradient(135deg, ${theme.palette.warning.main}, ${theme.palette.warning.dark})`,\n },\n }}\n />\n </Box>\n </Box>\n {/* Attachments */}\n <Box\n className=\"attachments-upload-card attachments-section\"\n sx={{\n flex: 1,\n minWidth: 300,\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n p: 0,\n }}\n >\n <div style={{ display: 'flex', flexDirection: 'column' }}>\n <Box onClick={() => fileInputRef.current?.click()}>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n style={{ display: 'none' }}\n onChange={handleFileUpload}\n />\n {/* Compact attach affordance — the old full-height dashed\n dropzone dominated the sheet on mobile. */}\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n px: 1.5,\n py: 1,\n border: '1px dashed',\n borderColor: (theme) => theme.palette.divider,\n borderRadius: 2,\n cursor: 'pointer',\n color: theme.palette.text.secondary,\n '&:hover': { borderColor: theme.palette.primary.main, color: theme.palette.primary.main },\n }}\n >\n <AttachFileIcon size={18} />\n <Typography variant=\"body2\" sx={{ fontWeight: 500 }}>\n Attach an image\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ ml: 'auto' }}>\n JPG/PNG/GIF · 10MB\n </Typography>\n </Box>\n {/* Attachment Reminder - positioned at bottom */}\n {((formData.images && formData.images.length > 0) || (formData.attachments && formData.attachments.length > 0)) && (\n <Alert\n severity=\"info\"\n sx={{\n mt: 'auto',\n textAlign: 'left',\n fontSize: '0.75rem',\n py: 0.5,\n background: theme.palette.mode === 'dark'\n ? 'linear-gradient(135deg, rgba(33,150,243,0.1) 0%, rgba(25,118,210,0.1) 100%)'\n : 'linear-gradient(135deg, rgba(33,150,243,0.05) 0%, rgba(25,118,210,0.05) 100%)',\n border: `1px solid ${theme.palette.info.main}30`,\n '& .MuiAlert-icon': {\n color: theme.palette.info.main,\n fontSize: '0.875rem',\n },\n '& .MuiAlert-message': {\n fontSize: '0.75rem',\n },\n }}\n >\n <Typography variant=\"caption\" sx={{ fontWeight: 600, display: 'block' }}>\n {formData.images && formData.images.length > 0 \n ? '📎 Image will be copied to clipboard - paste in email!'\n : '📎 Files ready for email attachment'\n }\n </Typography>\n </Alert>\n )}\n </Box>\n </div>\n {/* Display uploaded image (single) */}\n {formData.images && formData.images.length > 0 && (\n <Box sx={{ mt: 2 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 1.5 }}>\n <PhotoCameraIcon size={16} />\n <Typography variant=\"subtitle2\" sx={{ fontWeight: 600 }}>\n Attached Image\n </Typography>\n </Box>\n <Box sx={{ display: 'flex', gap: 1.5 }}>\n <Box\n sx={{\n position: 'relative',\n borderRadius: 1.5,\n overflow: 'hidden',\n boxShadow: theme.palette.mode === 'dark'\n ? '0 2px 8px rgba(0,0,0,0.3)'\n : '0 2px 8px rgba(0,0,0,0.1)',\n transition: 'all 0.2s ease',\n '&:hover': {\n transform: 'scale(1.05)',\n boxShadow: theme.palette.mode === 'dark'\n ? '0 4px 16px rgba(0,0,0,0.4)'\n : '0 4px 16px rgba(0,0,0,0.15)',\n },\n }}\n >\n <img\n src={formData.images[0]}\n alt=\"Attachment\"\n style={{\n width: 120,\n height: 120,\n objectFit: 'cover',\n display: 'block',\n }}\n />\n <IconButton\n size=\"small\"\n onClick={removeImage}\n sx={{\n position: 'absolute',\n top: 4,\n right: 4,\n bgcolor: 'rgba(244,67,54,0.9)',\n color: 'white',\n width: 24,\n height: 24,\n '&:hover': {\n bgcolor: 'rgba(244,67,54,1)',\n transform: 'scale(1.1)',\n },\n }}\n >\n <DeleteIcon size={14} />\n </IconButton>\n </Box>\n <Box sx={{ flex: 1, display: 'flex', flexDirection: 'column', justifyContent: 'center' }}>\n <Button\n variant=\"outlined\"\n size=\"small\"\n onClick={copyImageToClipboard}\n startIcon={<AttachFileIcon />}\n sx={{\n mb: 1,\n borderColor: theme.palette.primary.main + '50',\n color: theme.palette.primary.main,\n '&:hover': {\n borderColor: theme.palette.primary.main,\n bgcolor: theme.palette.primary.main + '10',\n },\n }}\n >\n Copy to Clipboard\n </Button>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ textAlign: 'center' }}>\n Image will be copied when you submit\n </Typography>\n </Box>\n </Box>\n </Box>\n )}\n {/* Display other attachments */}\n {formData.attachments && formData.attachments.length > 0 && (\n <Box sx={{ mt: 2 }}>\n <Typography variant=\"subtitle2\" gutterBottom>\n Attached Files ({formData.attachments.length})\n </Typography>\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 1 }}>\n {formData.attachments.map((attachment, index) => (\n <Chip\n key={index}\n label={attachment.name}\n onDelete={() => removeAttachment(index)}\n deleteIcon={<DeleteIcon />}\n variant=\"outlined\"\n sx={{ maxWidth: 200 }}\n />\n ))}\n </Box>\n </Box>\n )}\n </Box>\n </Box>\n </Box>\n </DialogContent>\n\n {/* DialogActions sticky footer with single full-width Send Feedback button */}\n <DialogActions\n sx={{\n position: 'sticky',\n bottom: 0,\n zIndex: 10,\n px: { xs: 2, sm: 3 },\n py: 1.5,\n backgroundColor: 'background.paper',\n borderTop: '1px solid',\n borderColor: 'divider',\n justifyContent: 'center',\n }}\n >\n <Button\n fullWidth\n startIcon={<MailIcon />}\n disabled={!isValid}\n onClick={handleSubmit}\n variant=\"contained\"\n >\n Send Feedback\n </Button>\n </DialogActions>\n </Dialog>\n \n {/* Snackbar for clipboard feedback */}\n <Snackbar\n open={snackbarOpen}\n autoHideDuration={4000}\n onClose={() => setSnackbarOpen(false)}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}\n sx={{\n '& .MuiSnackbarContent-root': {\n background: theme.palette.mode === 'dark'\n ? 'linear-gradient(135deg, rgba(76,175,80,0.15) 0%, rgba(46,125,50,0.15) 100%)'\n : 'linear-gradient(135deg, rgba(76,175,80,0.1) 0%, rgba(46,125,50,0.1) 100%)',\n color: theme.palette.text.primary,\n fontSize: '0.9rem',\n fontWeight: 500,\n borderRadius: 2,\n border: `1px solid ${theme.palette.success.main}30`,\n backdropFilter: 'blur(10px)',\n },\n }}\n message={snackbarMessage}\n />\n \n {/* Confirmation Dialog for Image Submission */}\n <Dialog\n open={confirmDialogOpen}\n onClose={() => setConfirmDialogOpen(false)}\n maxWidth=\"sm\"\n fullWidth\n PaperProps={{\n sx: {\n borderRadius: 3,\n bgcolor: theme.palette.background.paper,\n backgroundImage: theme.palette.mode === 'dark' \n ? 'linear-gradient(145deg, rgba(255,255,255,0.02) 0%, rgba(255,255,255,0.01) 100%)'\n : 'linear-gradient(145deg, rgba(255,255,255,0.8) 0%, rgba(255,255,255,0.4) 100%)',\n backdropFilter: 'blur(20px)',\n border: `1px solid ${theme.palette.mode === 'dark' ? 'rgba(255,255,255,0.1)' : 'rgba(0,0,0,0.05)'}`,\n boxShadow: theme.palette.mode === 'dark' \n ? '0 16px 60px rgba(0,0,0,0.6)' \n : '0 16px 60px rgba(0,0,0,0.15)',\n },\n }}\n >\n <DialogTitle sx={{ \n pb: 1,\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n }}>\n <Avatar\n sx={{\n bgcolor: theme.palette.info.main + '20',\n color: theme.palette.info.main,\n width: 40,\n height: 40,\n }}\n >\n <PhotoCameraIcon />\n </Avatar>\n <Box>\n <Typography variant=\"h6\" sx={{ fontWeight: 600 }}>\n Ready to Submit with Image\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n Here's what will happen when you submit\n </Typography>\n </Box>\n </DialogTitle>\n \n <DialogContent sx={{ pt: 1 }}>\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>\n <Paper\n variant=\"outlined\"\n sx={{\n p: 3,\n borderRadius: 2,\n background: theme.palette.mode === 'dark'\n ? 'linear-gradient(135deg, rgba(33,150,243,0.05) 0%, rgba(25,118,210,0.05) 100%)'\n : 'linear-gradient(135deg, rgba(33,150,243,0.03) 0%, rgba(25,118,210,0.03) 100%)',\n border: `1px solid ${theme.palette.info.main}20`,\n }}\n >\n <Typography variant=\"subtitle1\" sx={{ fontWeight: 600, mb: 2, display: 'flex', alignItems: 'center', gap: 1 }}>\n <Box sx={{ \n bgcolor: theme.palette.info.main + '20', \n color: theme.palette.info.main,\n borderRadius: '50%',\n width: 24,\n height: 24,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '12px',\n fontWeight: 'bold'\n }}>\n 1\n </Box>\n Your image will be copied to clipboard\n </Typography>\n <Typography variant=\"subtitle1\" sx={{ fontWeight: 600, mb: 2, display: 'flex', alignItems: 'center', gap: 1 }}>\n <Box sx={{ \n bgcolor: theme.palette.info.main + '20', \n color: theme.palette.info.main,\n borderRadius: '50%',\n width: 24,\n height: 24,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '12px',\n fontWeight: 'bold'\n }}>\n 2\n </Box>\n Your email client will open\n </Typography>\n <Typography variant=\"subtitle1\" sx={{ fontWeight: 600, mb: 1, display: 'flex', alignItems: 'center', gap: 1 }}>\n <Box sx={{ \n bgcolor: theme.palette.info.main + '20', \n color: theme.palette.info.main,\n borderRadius: '50%',\n width: 24,\n height: 24,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '12px',\n fontWeight: 'bold'\n }}>\n 3\n </Box>\n Paste the image with Ctrl+V (or Cmd+V)\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ ml: 4, fontStyle: 'italic' }}>\n The email will have a clear spot where you should paste\n </Typography>\n </Paper>\n \n <Alert severity=\"info\" sx={{ \n background: 'transparent',\n border: `1px solid ${theme.palette.info.main}30`,\n }}>\n <Typography variant=\"body2\">\n <strong>💡 Tip:</strong> Make sure to paste the image before sending your email!\n </Typography>\n </Alert>\n </Box>\n </DialogContent>\n \n <DialogActions sx={{ p: 2.5, pt: 1 }}>\n <Button \n onClick={() => setConfirmDialogOpen(false)}\n sx={{ color: theme.palette.text.secondary }}\n >\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n onClick={performSubmit}\n disabled={isSubmitting}\n startIcon={isSubmitting ? <CircularProgress size={16} /> : <MailIcon />}\n sx={{\n background: `linear-gradient(135deg, ${theme.palette.primary.main} 0%, ${theme.palette.primary.dark} 100%)`,\n '&:hover': {\n background: `linear-gradient(135deg, ${theme.palette.primary.dark} 0%, ${theme.palette.primary.main} 100%)`,\n },\n }}\n >\n {isSubmitting ? 'Submitting...' : 'Got it, Submit Now'}\n </Button>\n </DialogActions>\n </Dialog>\n </>\n );\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n*/\n\nimport { createTheme, type Theme, type ThemeOptions } from '@mui/material/styles';\nimport { burtsonPalette, burtsonThemeOptions } from '@burtson-labs/ui/mui';\nimport { contrast, mix } from '@burtson-labs/ui/tokens';\n\nimport {\n deriveSemantics,\n legacyChatPalette,\n type BanditSemantics,\n type LegacyChatPalette,\n} from './semantic';\nimport { type BanditSkin, type BanditSkinId, skins } from './skins';\nimport type { BanditTokens as Palette } from './tokenTypes';\n\nexport type BanditMode = 'light' | 'dark';\nexport type BanditDensity = 'comfortable' | 'compact';\n\n/** The legacy status scale some screens read as `palette.status`. */\nexport interface StatusScale {\n info: string;\n available: string;\n locked: string;\n premium: string;\n error: string;\n}\n\n/**\n * What a tenant may change. Deliberately small: accent, name and logo. Error,\n * success, focus, destructive, spacing and component structure stay the\n * kit's, and the accent is contrast-corrected like any other.\n */\nexport interface BanditTenantBranding {\n accent?: string;\n name?: string;\n logoUrl?: string;\n}\n\nexport interface BanditThemeConfig {\n mode?: BanditMode;\n /** A skin id ('bandit', 'ocean', …) or a skin object. Default 'bandit'. */\n skin?: BanditSkinId | BanditSkin;\n /** Overrides the skin's accent for both modes. */\n accent?: string;\n /** `compact` for Management and other dense admin screens. */\n density?: BanditDensity;\n tenant?: BanditTenantBranding;\n}\n\nexport interface BanditThemeInfo {\n mode: BanditMode;\n skin: string;\n density: BanditDensity;\n accent: string;\n tenant?: BanditTenantBranding;\n /** The full Burtson UI token set this theme was built from. */\n tokens: Palette;\n semantics: BanditSemantics;\n /** CSS custom properties that make Burtson UI components match this theme. */\n cssVars: Record<string, string>;\n}\n\ndeclare module '@mui/material/styles' {\n interface Palette {\n /**\n * @deprecated Read `palette.bandit` (composer, control, attachment,\n * conversation, surface). Nothing in Bandit reads `palette.chat` any more;\n * it is still derived from the semantics because embedders of the\n * published engine and themes may read it. Remove in the next major.\n */\n chat: LegacyChatPalette;\n status: StatusScale;\n bandit: BanditSemantics;\n }\n interface PaletteOptions {\n /** @deprecated See `Palette.chat`. */\n chat?: Partial<LegacyChatPalette>;\n status?: Partial<StatusScale>;\n bandit?: BanditSemantics;\n }\n interface Theme {\n bandit: BanditThemeInfo;\n }\n interface ThemeOptions {\n bandit?: BanditThemeInfo;\n }\n}\n\nfunction resolveSkin(skin: BanditThemeConfig['skin']): BanditSkin {\n if (!skin) return skins.bandit;\n if (typeof skin === 'string') return skins[skin] ?? skins.bandit;\n return skin;\n}\n\n/** Tint the neutral surfaces toward the skin's hue; foregrounds and states stay put. */\nfunction tintedSurfaces(skin: BanditSkin, mode: BanditMode, base: Palette): Partial<Palette> {\n if (!skin.tint) return {};\n const t = skin.tintStrength?.[mode] ?? 0.08;\n const keys = [\n 'background',\n 'surface',\n 'surface-raised',\n 'surface-muted',\n 'card',\n 'popover',\n 'muted',\n 'secondary',\n ] as const;\n const out: Partial<Palette> = {};\n for (const k of keys) out[k] = mix(base[k], skin.tint, t);\n out.border = mix(base.border, skin.tint, t * 1.4);\n out['border-strong'] = mix(base['border-strong'], skin.tint, t * 1.4);\n out.input = mix(base.input, skin.tint, t * 1.4);\n return out;\n}\n\n/** Map the Burtson UI token set to CSS variables (the names theme.css uses). */\nexport function tokensToCssVars(tokens: Palette): Record<string, string> {\n const vars: Record<string, string> = {};\n for (const [k, v] of Object.entries(tokens)) vars[`--${k}`] = v;\n return vars;\n}\n\n/**\n * The Bandit theme factory. Everything visual comes from Burtson UI: the\n * token palette (optionally accent-shifted and tinted by a skin), the MUI\n * adapter's component shapes and states, then Bandit's product semantics.\n *\n * createBanditTheme({ mode: 'dark' })\n * createBanditTheme({ mode: 'light', skin: 'ocean', density: 'compact' })\n * createBanditTheme({ mode: 'dark', tenant: { accent: '#0f766e', name: 'Acme' } })\n */\nexport function createBanditTheme(\n config: BanditThemeConfig = {},\n ...overrides: ThemeOptions[]\n): Theme {\n const mode = config.mode ?? 'dark';\n const density = config.density ?? 'comfortable';\n const skin = resolveSkin(config.skin);\n const accent = config.tenant?.accent ?? config.accent ?? skin.accent[mode];\n const neutral = burtsonPalette({ mode });\n const surfaces = tintedSurfaces(skin, mode, neutral);\n const shifted = burtsonPalette({ mode, accent, palette: surfaces });\n // The accent was fitted against the kit's own background; a tinted skin\n // moves the background, so text tones are re-checked against it.\n const toward = mode === 'dark' ? '#ffffff' : '#000000';\n const legible = (c: string, ratio = 4.5) => {\n let out = c;\n for (let i = 0; i < 20 && contrast(out, shifted.background) < ratio; i++) out = mix(out, toward, 0.08);\n return out;\n };\n const tokens: Palette = {\n ...shifted,\n brand: legible(shifted.brand),\n ring: legible(shifted.ring),\n 'muted-foreground': legible(shifted['muted-foreground']),\n };\n const semantics = deriveSemantics(tokens, mode);\n const cssVars = tokensToCssVars(tokens);\n\n const base = burtsonThemeOptions({ mode, accent, density, palette: tokens });\n const bandit: BanditThemeInfo = {\n mode,\n skin: skin.id,\n density,\n accent,\n tenant: config.tenant,\n tokens,\n semantics,\n cssVars,\n };\n\n return createTheme(\n base,\n {\n palette: {\n chat: legacyChatPalette(semantics, tokens),\n status: {\n info: semantics.status.info,\n available: semantics.status.available,\n locked: semantics.status.locked,\n premium: semantics.status.premium,\n error: semantics.status.error,\n },\n bandit: semantics,\n },\n bandit,\n // Primary used as TEXT (text and outlined buttons, icon buttons, tabs,\n // links, color=\"primary\" type, outlined chips) reads the kit's `brand`\n // token, which is fitted to 4.5:1 on the background. primary.main is a\n // fill colour: on dark surfaces it measures under 4:1 as text.\n components: {\n MuiButton: {\n variants: [\n { props: { variant: 'text', color: 'primary' }, style: { color: tokens.brand } },\n { props: { variant: 'outlined', color: 'primary' }, style: { color: tokens.brand } },\n ],\n },\n MuiIconButton: { variants: [{ props: { color: 'primary' }, style: { color: tokens.brand } }] },\n MuiTab: { styleOverrides: { textColorPrimary: { '&.Mui-selected': { color: tokens.brand } } } },\n MuiLink: { styleOverrides: { root: { color: tokens.brand } } },\n MuiTypography: { variants: [{ props: { color: 'primary' }, style: { color: tokens.brand } }] },\n MuiChip: {\n variants: [{ props: { variant: 'outlined', color: 'primary' }, style: { color: tokens.brand } }],\n },\n },\n },\n ...overrides,\n );\n}\n","/**\n * The Burtson palette for MUI apps, so a screen built with MUI and one built\n * with Burtson UI components look like the same product.\n *\n * import { ThemeProvider } from '@mui/material/styles';\n * import { createBurtsonTheme } from '@burtson-labs/ui/mui';\n * <ThemeProvider theme={createBurtsonTheme('dark')}>…</ThemeProvider>\n * <ThemeProvider theme={createBurtsonTheme({ mode: 'dark', accent: '#2563eb', density: 'compact' })}>\n *\n * MUI is an adapter here: every colour, radius, shadow and timing comes from\n * the Burtson tokens, and the component overrides give MUI controls the same\n * shape and states as the Burtson components (focus ring, radius per role,\n * no uppercase buttons, quiet borders instead of heavy shadows).\n */\nimport { createTheme, type Shadows, type Theme, type ThemeOptions } from '@mui/material/styles';\n\nimport {\n accentTokens,\n contrast,\n dark,\n duration,\n easing,\n fontMono,\n fontSans,\n light,\n type Palette,\n radius,\n shadow,\n} from '../tokens';\n\nexport type BurtsonMode = 'light' | 'dark';\nexport type BurtsonDensity = 'comfortable' | 'compact';\n\nexport interface BurtsonThemeConfig {\n mode?: BurtsonMode;\n /** Any hex colour; primary, brand, soft and ring tones are derived with contrast kept. */\n accent?: string;\n /** `compact` for admin and data-dense screens: smaller controls, dense lists and tables. */\n density?: BurtsonDensity;\n /** Replace individual palette tokens (a product skin's tinted surfaces). */\n palette?: Partial<Palette>;\n}\n\nconst px = (rem: string) => Math.round(parseFloat(rem) * 16);\n\n/** The full token palette for a config: base mode, accent-derived brand tones, then explicit overrides. */\nexport function burtsonPalette(config: BurtsonThemeConfig = {}): Palette {\n const mode = config.mode ?? 'dark';\n const base = mode === 'dark' ? dark : light;\n return {\n ...base,\n ...(config.accent ? accentTokens(config.accent, mode) : {}),\n ...config.palette,\n };\n}\n\nfunction shadows(): Shadows {\n // MUI indexes elevation 0–24; the Burtson scale has three real levels.\n const levels = ['none', shadow.xs, shadow.xs, shadow.sm, shadow.sm, shadow.sm];\n return Array.from({ length: 25 }, (_, i) => levels[i] ?? shadow.md) as Shadows;\n}\n\n/** Theme options only, for apps that deep-merge their own overrides first. */\nexport function burtsonThemeOptions(\n modeOrConfig: BurtsonMode | BurtsonThemeConfig = 'dark',\n): ThemeOptions {\n const config = typeof modeOrConfig === 'string' ? { mode: modeOrConfig } : modeOrConfig;\n const mode = config.mode ?? 'dark';\n const compact = config.density === 'compact';\n const p = burtsonPalette(config);\n const focusRing = `0 0 0 3px color-mix(in srgb, ${p.ring} 24%, transparent)`;\n return {\n palette: {\n mode,\n primary: { main: p.primary, contrastText: p['primary-foreground'] },\n // Secondary fills use the brand text tone, which is light in dark mode;\n // their text is whichever of white or the page background reads.\n secondary: {\n main: p.brand,\n contrastText: contrast(p.brand, '#ffffff') >= 4.5 ? '#ffffff' : p.background,\n },\n info: { main: p.info, contrastText: p['info-foreground'] },\n error: { main: p.destructive, contrastText: p['destructive-foreground'] },\n warning: { main: p.warning, contrastText: p['warning-foreground'] },\n success: { main: p.success, contrastText: p['success-foreground'] },\n background: { default: p.background, paper: p.surface },\n text: { primary: p.foreground, secondary: p['muted-foreground'] },\n divider: p.border,\n action: { hover: p.muted, selected: p['brand-soft'], focus: p['brand-soft'] },\n },\n shape: { borderRadius: px(radius.md) },\n shadows: shadows(),\n typography: {\n fontFamily: fontSans,\n fontSize: compact ? 13 : 14,\n button: { textTransform: 'none', fontWeight: 600, letterSpacing: '-0.01em' },\n h1: { fontWeight: 700, letterSpacing: '-0.03em' },\n h2: { fontWeight: 700, letterSpacing: '-0.025em' },\n h3: { fontWeight: 650, letterSpacing: '-0.02em' },\n h4: { fontWeight: 650, letterSpacing: '-0.015em' },\n h5: { fontWeight: 600 },\n h6: { fontWeight: 600 },\n overline: { fontWeight: 600, letterSpacing: '0.08em' },\n },\n transitions: {\n duration: {\n shortest: duration.fast,\n shorter: duration.fast,\n short: duration.standard,\n standard: duration.standard,\n complex: duration.emphasis,\n enteringScreen: duration.emphasis,\n leavingScreen: duration.exit,\n },\n easing: {\n easeInOut: easing.standard,\n easeOut: easing.emphasized,\n easeIn: easing.exit,\n sharp: easing.standard,\n },\n },\n components: {\n MuiCssBaseline: {\n styleOverrides: {\n 'code, kbd, pre, samp': { fontFamily: fontMono },\n '@media (prefers-reduced-motion: reduce)': {\n '*, ::before, ::after': {\n animationDuration: '1ms !important',\n transitionDuration: '1ms !important',\n },\n },\n },\n },\n MuiButtonBase: { defaultProps: { disableRipple: true } },\n MuiButton: {\n defaultProps: { disableElevation: true, size: compact ? 'small' : 'medium' },\n styleOverrides: {\n root: {\n borderRadius: radius.md,\n '&:focus-visible': {\n boxShadow: focusRing,\n outline: `2px solid ${p.ring}`,\n outlineOffset: 2,\n },\n },\n outlined: { borderColor: p['border-strong'] },\n },\n },\n MuiIconButton: {\n defaultProps: { size: compact ? 'small' : 'medium' },\n styleOverrides: {\n root: {\n borderRadius: radius.md,\n '&:focus-visible': { outline: `2px solid ${p.ring}`, outlineOffset: 2 },\n },\n },\n },\n MuiPaper: {\n styleOverrides: {\n root: { backgroundImage: 'none' },\n outlined: { borderColor: p.border },\n rounded: { borderRadius: radius.lg },\n },\n },\n MuiCard: {\n defaultProps: { variant: 'outlined' },\n styleOverrides: {\n root: { borderRadius: radius.lg, backgroundColor: p.card, borderColor: p.border },\n },\n },\n MuiDialog: {\n styleOverrides: {\n paper: { borderRadius: radius.xl, border: `1px solid ${p.border}`, boxShadow: shadow.md },\n },\n },\n MuiMenu: {\n styleOverrides: {\n paper: {\n borderRadius: radius.lg,\n border: `1px solid ${p['border-strong']}`,\n boxShadow: shadow.md,\n },\n list: { paddingTop: 4, paddingBottom: 4 },\n },\n },\n MuiPopover: {\n styleOverrides: { paper: { borderRadius: radius.lg, border: `1px solid ${p.border}` } },\n },\n MuiChip: {\n defaultProps: { size: 'small' },\n styleOverrides: { root: { borderRadius: radius.full, fontWeight: 500 } },\n },\n MuiTabs: {\n styleOverrides: { indicator: { backgroundColor: p.brand, height: 2 } },\n },\n MuiTab: {\n styleOverrides: {\n root: {\n textTransform: 'none',\n fontWeight: 500,\n minHeight: compact ? 36 : 44,\n '&.Mui-selected': { color: p.foreground },\n },\n },\n },\n MuiOutlinedInput: {\n styleOverrides: {\n root: {\n borderRadius: radius.md,\n backgroundColor: p.surface,\n '& .MuiOutlinedInput-notchedOutline': { borderColor: p.input },\n '&:hover .MuiOutlinedInput-notchedOutline': { borderColor: p['border-strong'] },\n // Same focus as the Tailwind fields: a 2px ring-coloured edge inside\n // the radius, no outer halo that a scroll container could clip.\n '&.Mui-focused .MuiOutlinedInput-notchedOutline': {\n borderColor: p.ring,\n borderWidth: 2,\n },\n '&.Mui-error .MuiOutlinedInput-notchedOutline': { borderColor: p.destructive },\n },\n },\n },\n // Menu, Select and Autocomplete rows: inset 4px in a 12px surface, 8px\n // radius, a quiet secondary fill for the active row (as MenuItem and\n // SelectItem in the Tailwind kit).\n MuiMenuItem: {\n styleOverrides: {\n root: {\n margin: '0 4px',\n borderRadius: radius.sm,\n '&.Mui-focusVisible, &:hover': { backgroundColor: p.secondary },\n '&.Mui-selected': { backgroundColor: 'transparent', fontWeight: 600 },\n '&.Mui-selected.Mui-focusVisible, &.Mui-selected:hover': {\n backgroundColor: p.secondary,\n },\n },\n },\n },\n MuiAutocomplete: {\n styleOverrides: {\n paper: { borderRadius: radius.lg, border: `1px solid ${p['border-strong']}` },\n listbox: {\n padding: 4,\n '& .MuiAutocomplete-option': {\n borderRadius: radius.sm,\n '&.Mui-focused, &.Mui-focusVisible': { backgroundColor: p.secondary },\n '&[aria-selected=\"true\"]': { backgroundColor: 'transparent', fontWeight: 600 },\n '&[aria-selected=\"true\"].Mui-focused': { backgroundColor: p.secondary },\n },\n },\n },\n },\n MuiTextField: { defaultProps: { size: compact ? 'small' : 'medium' } },\n MuiAlert: { styleOverrides: { root: { borderRadius: radius.md } } },\n MuiTooltip: {\n styleOverrides: {\n tooltip: {\n backgroundColor: p.code,\n color: p['code-foreground'],\n fontSize: 12,\n borderRadius: radius.sm,\n },\n },\n },\n MuiSwitch: {\n styleOverrides: {\n switchBase: {\n '&.Mui-checked + .MuiSwitch-track': { backgroundColor: p.brand, opacity: 1 },\n },\n track: { backgroundColor: p['border-strong'], opacity: 1 },\n },\n },\n MuiList: { defaultProps: { dense: compact } },\n MuiTable: { defaultProps: { size: compact ? 'small' : 'medium' } },\n MuiToolbar: { defaultProps: { variant: compact ? 'dense' : 'regular' } },\n MuiDivider: { styleOverrides: { root: { borderColor: p.border } } },\n },\n };\n}\n\n/**\n * `createBurtsonTheme('dark')` or `createBurtsonTheme({ mode, accent, density })`,\n * then any MUI overrides, merged in order.\n */\nexport function createBurtsonTheme(\n modeOrConfig: BurtsonMode | BurtsonThemeConfig = 'dark',\n ...overrides: ThemeOptions[]\n): Theme {\n return createTheme(burtsonThemeOptions(modeOrConfig), ...overrides);\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n*/\n\nimport { mix } from '@burtson-labs/ui/tokens';\n\nimport type { BanditTokens as Palette } from './tokenTypes';\n\n/**\n * Bandit product semantics, derived from the Burtson UI tokens. Components\n * name what a thing IS (the composer, an assistant message, a recording\n * state), never which colour it happened to borrow (\"chat.fileIcon\" for a\n * send button). Tenants and skins change the tokens; these follow.\n */\nexport interface BanditSemantics {\n /** Surface levels, lowest to highest. */\n surface: {\n base: string;\n raised: string;\n subtle: string;\n interactive: string;\n interactiveHover: string;\n overlay: string;\n terminal: string;\n terminalForeground: string;\n };\n composer: {\n surface: string;\n border: string;\n borderFocus: string;\n foreground: string;\n placeholder: string;\n };\n /** Small round controls: send, attach, mic, menu. */\n control: {\n surface: string;\n surfaceHover: string;\n foreground: string;\n foregroundMuted: string;\n /** The one control that should stand out (send). */\n primarySurface: string;\n primaryForeground: string;\n };\n attachment: { surface: string; border: string; foreground: string; icon: string };\n conversation: {\n user: { surface: string; foreground: string; border: string };\n assistant: { surface: string; foreground: string; border: string };\n border: string;\n divider: string;\n meta: string;\n code: { surface: string; foreground: string };\n };\n agent: { active: string; idle: string; surface: string };\n engine: { accent: string; surface: string };\n tool: { surface: string; border: string; foreground: string };\n knowledge: { accent: string; surface: string };\n workspace: { surface: string; border: string };\n /** States. Recording is its own state, not an error. */\n status: {\n recording: string;\n transcribing: string;\n thinking: string;\n streaming: string;\n syncing: string;\n temporary: string;\n degraded: string;\n disconnected: string;\n available: string;\n premium: string;\n locked: string;\n info: string;\n success: string;\n warning: string;\n error: string;\n };\n}\n\nexport function deriveSemantics(p: Palette, mode: 'light' | 'dark'): BanditSemantics {\n const dark = mode === 'dark';\n const raised = p['surface-raised'];\n return {\n surface: {\n base: p.background,\n raised,\n subtle: p['surface-muted'],\n interactive: p.muted,\n interactiveHover: mix(p.muted, p.foreground, dark ? 0.08 : 0.05),\n overlay: p.popover,\n terminal: p.code,\n terminalForeground: p['code-foreground'],\n },\n composer: {\n surface: dark ? raised : p.surface,\n border: p.border,\n borderFocus: p.ring,\n foreground: p.foreground,\n placeholder: p['muted-foreground'],\n },\n control: {\n surface: p.muted,\n surfaceHover: mix(p.muted, p.foreground, dark ? 0.1 : 0.06),\n foreground: p.foreground,\n foregroundMuted: p['muted-foreground'],\n primarySurface: p.primary,\n primaryForeground: p['primary-foreground'],\n },\n attachment: {\n surface: p['surface-muted'],\n border: p.border,\n foreground: p.foreground,\n icon: p['muted-foreground'],\n },\n conversation: {\n user: { surface: p.muted, foreground: p.foreground, border: p.border },\n assistant: { surface: 'transparent', foreground: p.foreground, border: 'transparent' },\n border: p.border,\n divider: p.border,\n meta: p['muted-foreground'],\n code: { surface: p.code, foreground: p['code-foreground'] },\n },\n agent: { active: p.brand, idle: p['muted-foreground'], surface: p['brand-soft'] },\n engine: { accent: p.brand, surface: p['brand-soft'] },\n tool: { surface: p['surface-muted'], border: p.border, foreground: p.foreground },\n knowledge: { accent: p.info, surface: mix(p.background, p.info, dark ? 0.12 : 0.07) },\n workspace: { surface: p.surface, border: p.border },\n status: {\n recording: p.recording,\n transcribing: p.info,\n thinking: p.brand,\n streaming: p.brand,\n syncing: p.info,\n temporary: p.warning,\n degraded: p.warning,\n disconnected: p['muted-foreground'],\n available: p.success,\n premium: p.brand,\n locked: p['muted-foreground'],\n info: p.info,\n success: p.success,\n warning: p.warning,\n error: p.destructive,\n },\n };\n}\n\n/**\n * The legacy `palette.chat` shape, derived from the semantics.\n *\n * @deprecated Bandit itself no longer reads `palette.chat`; it stays as an\n * alias for embedders of the published packages that do. Read\n * `palette.bandit` instead. Remove in the next major.\n */\nexport function legacyChatPalette(s: BanditSemantics, p: Palette) {\n return {\n shell: s.surface.base,\n input: s.composer.surface,\n badge: s.control.surface,\n badgeHover: s.control.surfaceHover,\n file: s.attachment.surface,\n fileIcon: s.control.surfaceHover,\n fileText: s.attachment.foreground,\n caption: s.conversation.meta,\n suggestion: {\n background: s.surface.subtle,\n text: p.foreground,\n border: p.border,\n hoverBackground: s.surface.interactive,\n hoverBorder: p['border-strong'],\n },\n appBar: {\n background: s.surface.base,\n border: p.border,\n icon: p.foreground,\n iconHover: s.surface.interactive,\n menuBackground: s.surface.overlay,\n menuText: p.foreground,\n },\n response: {\n userBackground: s.conversation.user.surface,\n userText: p.foreground,\n userBorder: s.conversation.user.border,\n userBubble: s.conversation.user.surface,\n userAvatarBackground: 'transparent',\n modelLabel: s.conversation.meta,\n border: s.conversation.border,\n aiBackground: s.surface.subtle,\n aiText: s.conversation.assistant.foreground,\n aiBorder: p.border,\n aiBubble: s.surface.subtle,\n memoryText: s.status.success,\n divider: s.conversation.divider,\n containerBackground: s.surface.base,\n codeBackground: s.conversation.code.surface,\n codeText: s.conversation.code.foreground,\n },\n };\n}\n\nexport type LegacyChatPalette = ReturnType<typeof legacyChatPalette>;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n*/\n\n/**\n * Bandit skins. A skin is a parameter set, not a separate theme: every skin\n * inherits the same spacing, type, radii, density, focus, motion, component\n * shapes and semantic state colours from Burtson UI, and varies only its\n * accent and a light tint of the neutral surfaces.\n *\n * The accent is the brand signal (primary action, selection, focus, links);\n * `createBanditTheme` derives its fills and text tones with contrast kept,\n * so a skin cannot make a button or a link unreadable.\n */\nexport interface BanditSkin {\n id: string;\n label: string;\n /** Accent per mode. One colour is fine; the mode's tones are derived from it. */\n accent: { light: string; dark: string };\n /** A hue mixed lightly into backgrounds, surfaces and borders; omit for neutral. */\n tint?: string;\n /** How much tint, per mode (0–0.2 is the useful range). */\n tintStrength?: { light: number; dark: number };\n}\n\nconst soft = { light: 0.05, dark: 0.1 };\n\n/** Burtson purple: the Bandit default. Purple is a signal, not wallpaper. */\nexport const BANDIT_ACCENT = '#a60ee5';\n\nexport const skins = {\n bandit: { id: 'bandit', label: 'Bandit', accent: { light: BANDIT_ACCENT, dark: '#c65ef1' } },\n neutral: { id: 'neutral', label: 'Neutral', accent: { light: '#2563eb', dark: '#4d90fe' } },\n corporate: {\n id: 'corporate',\n label: 'Corporate',\n accent: { light: '#1d4ed8', dark: '#3b82f6' },\n tint: '#1e3a5f',\n tintStrength: soft,\n },\n cyber: { id: 'cyber', label: 'Cyber', accent: { light: '#c026d3', dark: '#e879f9' } },\n dawn: {\n id: 'dawn',\n label: 'Dawn',\n accent: { light: '#c2410c', dark: '#f4a261' },\n tint: '#7c4a2d',\n tintStrength: soft,\n },\n forest: {\n id: 'forest',\n label: 'Forest',\n accent: { light: '#2e7d32', dark: '#4caf50' },\n tint: '#1f5130',\n tintStrength: { light: 0.06, dark: 0.14 },\n },\n mist: {\n id: 'mist',\n label: 'Mist',\n accent: { light: '#4f5bd5', dark: '#8c9eff' },\n tint: '#3b4a7a',\n tintStrength: soft,\n },\n neon: { id: 'neon', label: 'Neon', accent: { light: '#db2777', dark: '#ff4fa3' } },\n ocean: {\n id: 'ocean',\n label: 'Ocean',\n accent: { light: '#0e7490', dark: '#22c3dc' },\n tint: '#0b3b5c',\n tintStrength: { light: 0.06, dark: 0.16 },\n },\n sage: {\n id: 'sage',\n label: 'Sage',\n accent: { light: '#3f8a4f', dark: '#66bb6a' },\n tint: '#2f4a38',\n tintStrength: soft,\n },\n stone: {\n id: 'stone',\n label: 'Stone',\n accent: { light: '#57534e', dark: '#d6d3d1' },\n tint: '#57534e',\n tintStrength: { light: 0.06, dark: 0.06 },\n },\n sunset: {\n id: 'sunset',\n label: 'Sunset',\n accent: { light: '#c2410c', dark: '#ff8a3d' },\n tint: '#6b3417',\n tintStrength: { light: 0.05, dark: 0.14 },\n },\n volcanic: {\n id: 'volcanic',\n label: 'Volcanic',\n accent: { light: '#c62828', dark: '#ef5350' },\n tint: '#4a1512',\n tintStrength: { light: 0.03, dark: 0.08 },\n },\n} satisfies Record<string, BanditSkin>;\n\nexport type BanditSkinId = keyof typeof skins;\n\n/**\n * Legacy registry keys (\"ocean-dark\") map to a skin and mode. The historical\n * key for the cyber skin is \"cyber\"; \"cyberPunk\" is kept as an alias.\n */\nexport function parseThemeKey(key: string): { skin: BanditSkinId; mode: 'light' | 'dark' } {\n const m = /^([a-z]+?)(?:Punk)?-(dark|light)$/i.exec(key);\n const skin = (m?.[1]?.toLowerCase() ?? 'bandit') as BanditSkinId;\n return { skin: skin in skins ? skin : 'bandit', mode: m?.[2] === 'light' ? 'light' : 'dark' };\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n*/\n\nimport type { Theme } from '@mui/material/styles';\n\nimport { createBanditTheme, type BanditDensity, type BanditMode, type BanditTenantBranding } from './createBanditTheme';\nimport { type BanditSkinId, skins } from './skins';\n\n/**\n * Tenant branding as a theme key.\n *\n * Every place that stores a Bandit theme stores one string (\"ocean-dark\").\n * A tenant accent rides in the same string, \"tenant-0f766e-dark\", so the\n * stores, exports and the engine's theme lookups need no second field, and\n * every lookup builds it through createBanditTheme({ tenant }), which corrects\n * the accent for contrast. Older readers that don't know the form fall back to\n * the Bandit theme instead of breaking.\n */\nconst TENANT_KEY = /^tenant-([0-9a-f]{6})-(dark|light)$/i;\nconst SKIN_KEY = /^([a-z]+?)(?:Punk)?-(dark|light)$/i;\nconst HEX = /^#[0-9a-f]{6}$/i;\n\n/** A six-digit hex colour (#RRGGBB): the only accent form a tenant can set. */\nexport const isTenantAccent = (value: string): boolean => HEX.test(value.trim());\n\nexport interface BrandingThemeChoice {\n mode: BanditMode;\n /** The skin (surface tint and default accent). A tenant accent uses the Bandit skin. */\n skin: BanditSkinId;\n /** A tenant's own accent (#rrggbb), when they chose one instead of a skin. */\n accent?: string;\n}\n\n/** Reads any stored theme key: a skin (\"ocean-light\"), a tenant accent, or junk (Bandit dark). */\nexport function parseBrandingTheme(key: string | null | undefined): BrandingThemeChoice {\n const value = (key ?? '').trim();\n const tenant = TENANT_KEY.exec(value);\n if (tenant) {\n return { skin: 'bandit', mode: tenant[2]!.toLowerCase() === 'light' ? 'light' : 'dark', accent: `#${tenant[1]!.toLowerCase()}` };\n }\n const m = SKIN_KEY.exec(value);\n const skin = (m?.[1]?.toLowerCase() ?? 'bandit') as BanditSkinId;\n return { skin: skin in skins ? skin : 'bandit', mode: m?.[2]?.toLowerCase() === 'light' ? 'light' : 'dark' };\n}\n\n/** The key to store for a choice. A valid accent wins over the skin. */\nexport function brandingThemeKey(choice: BrandingThemeChoice): string {\n if (choice.accent && isTenantAccent(choice.accent)) {\n return `tenant-${choice.accent.trim().slice(1).toLowerCase()}-${choice.mode}`;\n }\n return `${choice.skin in skins ? choice.skin : 'bandit'}-${choice.mode}`;\n}\n\n/** True for keys this module writes for a tenant accent. */\nexport const isTenantThemeKey = (key: string): boolean => TENANT_KEY.test(key);\n\n/**\n * The theme for a stored key, through createBanditTheme only. Name and logo\n * travel on `theme.bandit.tenant` for hosts that show them.\n */\nexport function createBrandingTheme(\n key: string | null | undefined,\n options: { density?: BanditDensity; name?: string; logoUrl?: string } = {},\n): Theme {\n const { skin, mode, accent } = parseBrandingTheme(key);\n const tenant: BanditTenantBranding | undefined = accent\n ? { accent, name: options.name || undefined, logoUrl: options.logoUrl || undefined }\n : undefined;\n return createBanditTheme({ skin, mode, density: options.density, tenant });\n}\n\n/** \"Ocean · Light\", or \"Custom <hex> · Dark\" for a tenant accent. */\nexport function describeBrandingTheme(key: string | null | undefined): string {\n const { skin, mode, accent } = parseBrandingTheme(key);\n const modeLabel = mode === 'light' ? 'Light' : 'Dark';\n return accent ? `Custom ${accent} · ${modeLabel}` : `${skins[skin].label} · ${modeLabel}`;\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n*/\n\nimport type { Theme } from '@mui/material/styles';\n\nimport { createBanditTheme, type StatusScale } from './createBanditTheme';\nimport { type BanditSkinId, skins } from './skins';\nimport { createBrandingTheme, isTenantThemeKey } from './tenant';\n\n/**\n * The registry the engine and Management have always used (\"ocean-dark\" →\n * Theme), now generated from the skins so every entry is the same system.\n * Keys, names and shapes are unchanged for existing consumers.\n */\nconst REGISTRY_SKINS: BanditSkinId[] = [\n 'bandit',\n 'corporate',\n 'neutral',\n 'cyber',\n 'dawn',\n 'mist',\n 'sage',\n 'stone',\n 'ocean',\n 'neon',\n 'forest',\n 'sunset',\n 'volcanic',\n];\n\ntype ThemeRegistry = Record<string, Theme>;\n\nconst skinThemes: ThemeRegistry = {};\nfor (const id of REGISTRY_SKINS) {\n for (const mode of ['dark', 'light'] as const) {\n skinThemes[`${id}-${mode}`] = createBanditTheme({ skin: id, mode });\n }\n}\n\n/**\n * The registry also answers tenant keys (\"tenant-0f766e-dark\"), built on first\n * use through createBanditTheme({ tenant }) and cached. They are not listed:\n * Object.keys(themeMap) is still the 26 skin themes, so pickers are unchanged,\n * and every existing `themeMap[key]` lookup (the chat, the chat modal) shows a\n * tenant's saved accent without code of its own.\n */\nconst tenantThemes = new Map<string, Theme>();\nconst themeMap: ThemeRegistry = new Proxy(skinThemes, {\n get(target, prop, receiver) {\n if (typeof prop === 'string' && !(prop in target) && isTenantThemeKey(prop)) {\n const key = prop.toLowerCase();\n let theme = tenantThemes.get(key);\n if (!theme) {\n theme = createBrandingTheme(key);\n tenantThemes.set(key, theme);\n }\n return theme;\n }\n return Reflect.get(target, prop, receiver);\n },\n});\n\nexport default themeMap;\nexport { themeMap };\n\nexport const predefinedThemes: Record<string, Theme & { name: string }> = Object.fromEntries(\n Object.entries(skinThemes).map(([name, theme]) => [name, { name, ...theme }]),\n);\n\n/** Skin ids in registry order, for pickers. */\nexport const themeSkinIds = REGISTRY_SKINS;\nexport const themeSkinLabel = (id: BanditSkinId) => skins[id].label;\n\n// Named exports kept for existing imports (`import { oceanDarkTheme } …`).\nexport const banditDarkTheme = skinThemes['bandit-dark']!;\nexport const banditLightTheme = skinThemes['bandit-light']!;\nexport const corporateDarkTheme = skinThemes['corporate-dark']!;\nexport const corporateLightTheme = skinThemes['corporate-light']!;\nexport const neutralDarkTheme = skinThemes['neutral-dark']!;\nexport const neutralLightTheme = skinThemes['neutral-light']!;\nexport const cyberPunkDarkTheme = skinThemes['cyber-dark']!;\nexport const cyberPunkLightTheme = skinThemes['cyber-light']!;\nexport const dawnDarkTheme = skinThemes['dawn-dark']!;\nexport const dawnLightTheme = skinThemes['dawn-light']!;\nexport const mistDarkTheme = skinThemes['mist-dark']!;\nexport const mistLightTheme = skinThemes['mist-light']!;\nexport const sageDarkTheme = skinThemes['sage-dark']!;\nexport const sageLightTheme = skinThemes['sage-light']!;\nexport const stoneDarkTheme = skinThemes['stone-dark']!;\nexport const stoneLightTheme = skinThemes['stone-light']!;\nexport const oceanDarkTheme = skinThemes['ocean-dark']!;\nexport const oceanLightTheme = skinThemes['ocean-light']!;\nexport const neonDarkTheme = skinThemes['neon-dark']!;\nexport const neonLightTheme = skinThemes['neon-light']!;\nexport const forestDarkTheme = skinThemes['forest-dark']!;\nexport const forestLightTheme = skinThemes['forest-light']!;\nexport const sunsetDarkTheme = skinThemes['sunset-dark']!;\nexport const sunsetLightTheme = skinThemes['sunset-light']!;\nexport const volcanicDarkTheme = skinThemes['volcanic-dark']!;\nexport const volcanicLightTheme = skinThemes['volcanic-light']!;\n\n/** The status scale of a theme (every Bandit theme carries one). */\nexport const statusColors = (theme: Theme): StatusScale => theme.palette.status;\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n*/\n\nimport { ThemeProvider, type Theme } from '@mui/material/styles';\nimport * as React from 'react';\n\nimport { createBanditTheme, type BanditThemeConfig } from './createBanditTheme';\n\nexport interface BanditThemeProviderProps {\n /** A theme from createBanditTheme, or the config to build one. */\n theme?: Theme;\n config?: BanditThemeConfig;\n /**\n * Where Burtson UI components read their colours from.\n * `document` (the host app): variables and the dark/light class go on <html>.\n * `element` (an embedded engine): they go on a wrapper, so the host page is untouched.\n */\n scope?: 'document' | 'element';\n className?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n}\n\n/**\n * One provider for both component systems: MUI gets the Bandit theme, and\n * Burtson UI components get the same tokens as CSS variables. Without it an\n * MUI button and a Burtson button on the same screen could disagree about\n * the accent, the surfaces or the mode.\n */\nexport function BanditThemeProvider({\n theme,\n config,\n scope = 'document',\n className,\n style,\n children,\n}: BanditThemeProviderProps) {\n const resolved = React.useMemo(() => theme ?? createBanditTheme(config), [theme, config]);\n const { cssVars, mode } = resolved.bandit;\n\n React.useLayoutEffect(() => {\n if (scope !== 'document' || typeof document === 'undefined') return;\n const root = document.documentElement;\n const previous = new Map<string, string>();\n for (const [k, v] of Object.entries(cssVars)) {\n previous.set(k, root.style.getPropertyValue(k));\n root.style.setProperty(k, v);\n }\n const hadDark = root.classList.contains('dark');\n const hadLight = root.classList.contains('light');\n const previousScheme = root.style.colorScheme;\n root.classList.toggle('dark', mode === 'dark');\n root.classList.toggle('light', mode === 'light');\n root.style.colorScheme = mode;\n return () => {\n for (const [k, v] of previous) {\n if (v) root.style.setProperty(k, v);\n else root.style.removeProperty(k);\n }\n // A nested document-scope provider (Management over the site) hands the\n // mode back too, not only the variables.\n root.classList.toggle('dark', hadDark);\n root.classList.toggle('light', hadLight);\n root.style.colorScheme = previousScheme;\n };\n }, [scope, cssVars, mode]);\n\n if (scope === 'element') {\n return (\n <ThemeProvider theme={resolved}>\n <div\n className={[mode === 'dark' ? 'dark' : 'light', className].filter(Boolean).join(' ')}\n data-bandit-theme={resolved.bandit.skin}\n style={{ ...(cssVars as React.CSSProperties), colorScheme: mode, ...style }}\n >\n {children}\n </div>\n </ThemeProvider>\n );\n }\n return <ThemeProvider theme={resolved}>{children}</ThemeProvider>;\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n*/\n\nimport Avatar from '@mui/material/Avatar';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Paper from '@mui/material/Paper';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport { useTheme } from '@mui/material/styles';\nimport * as React from 'react';\n\nimport { createBanditTheme, type BanditDensity, type BanditMode } from './createBanditTheme';\nimport { BanditThemeProvider } from './provider';\nimport type { BanditSkinId } from './skins';\n\nexport interface TenantPreviewProps {\n /** The tenant's accent (#rrggbb). Omit to preview a skin's own accent. */\n accent?: string;\n skin?: BanditSkinId;\n name: string;\n tagline?: string;\n logoUrl?: string;\n /** Which modes to show. Default both, the page's own mode first. */\n modes?: BanditMode[];\n density?: BanditDensity;\n /** Heading above the panes; null hides it. */\n title?: React.ReactNode;\n /**\n * What sits under the header in each pane. Default: a primary action and a\n * link, the two places the accent shows most.\n */\n renderBody?: (mode: BanditMode) => React.ReactNode;\n}\n\n/**\n * The tenant's branding rendered through createBanditTheme in light and dark,\n * so the owner sees the contrast-corrected result their team will get. One\n * implementation for every host: create-workspace, the account branding page\n * and the engine's Branding section. MUI only, so the engine can ship it\n * without Burtson UI CSS; each pane is its own element-scoped theme.\n */\nexport function TenantPreview({\n accent,\n skin,\n name,\n tagline,\n logoUrl,\n modes,\n density = 'compact',\n title = 'Preview',\n renderBody,\n}: TenantPreviewProps) {\n const pageMode = useTheme().palette.mode as BanditMode;\n const shown = modes ?? (pageMode === 'light' ? ['light', 'dark'] : ['dark', 'light']);\n return (\n <Stack spacing={1.5} role=\"group\" aria-label=\"Branding preview\">\n {title !== null && (\n <Typography component=\"h3\" variant=\"subtitle2\" sx={{ fontWeight: 600 }}>\n {title}\n </Typography>\n )}\n <Box\n sx={{\n display: 'grid',\n gap: 1.5,\n gridTemplateColumns: shown.length > 1 ? { xs: '1fr', md: 'repeat(2, minmax(0, 1fr))' } : '1fr',\n }}\n >\n {shown.map((mode) => (\n <PreviewPane\n key={mode}\n mode={mode}\n accent={accent}\n skin={skin}\n name={name}\n tagline={tagline}\n logoUrl={logoUrl}\n density={density}\n renderBody={renderBody}\n />\n ))}\n </Box>\n </Stack>\n );\n}\n\nfunction PreviewPane({\n mode,\n accent,\n skin,\n name,\n tagline,\n logoUrl,\n density,\n renderBody,\n}: Omit<TenantPreviewProps, 'modes' | 'title'> & { mode: BanditMode }) {\n const theme = React.useMemo(\n () =>\n createBanditTheme({\n mode,\n skin,\n density,\n tenant: accent ? { accent, name, logoUrl: logoUrl || undefined } : undefined,\n }),\n [mode, skin, density, accent, name, logoUrl],\n );\n // createBanditTheme may move the fill (primary) and the text tone (brand)\n // to keep 4.5:1; say so when either moved away from what the owner picked.\n const { primary, brand } = theme.bandit.tokens;\n const adjusted = Boolean(accent) && [primary, brand].some((c) => c.toLowerCase() !== accent!.toLowerCase());\n const label = name.trim() || 'Your workspace';\n return (\n <BanditThemeProvider theme={theme} scope=\"element\">\n <Paper\n variant=\"outlined\"\n sx={{ p: 2, bgcolor: 'background.default', color: 'text.primary', minWidth: 0, height: '100%' }}\n >\n <Stack direction=\"row\" spacing={1.25} alignItems=\"center\" sx={{ minWidth: 0 }}>\n {logoUrl ? (\n <Box component=\"img\" src={logoUrl} alt=\"\" sx={{ width: 28, height: 28, objectFit: 'contain', flexShrink: 0 }} />\n ) : (\n <Avatar\n aria-hidden\n sx={{ width: 28, height: 28, fontSize: 13, fontWeight: 600, bgcolor: 'primary.main', color: 'primary.contrastText' }}\n >\n {label.charAt(0).toUpperCase()}\n </Avatar>\n )}\n <Typography sx={{ fontWeight: 600, minWidth: 0, flex: 1, overflowWrap: 'anywhere' }}>{label}</Typography>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ textTransform: 'capitalize', flexShrink: 0 }}>\n {mode}\n </Typography>\n </Stack>\n {tagline ? (\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mt: 0.5 }}>\n {tagline}\n </Typography>\n ) : null}\n {renderBody ? (\n <Box sx={{ mt: 2 }}>{renderBody(mode)}</Box>\n ) : (\n <Stack direction=\"row\" spacing={1.5} alignItems=\"center\" sx={{ mt: 2 }}>\n <Button variant=\"contained\" size=\"small\" tabIndex={-1}>\n New chat\n </Button>\n <Typography\n variant=\"body2\"\n sx={(t) => ({ color: t.bandit.tokens.brand, textDecoration: 'underline', textUnderlineOffset: 3 })}\n >\n Shared knowledge\n </Typography>\n </Stack>\n )}\n {adjusted && (\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', mt: 1.5 }}>\n Adjusted in {mode} mode to keep text readable.\n </Typography>\n )}\n </Paper>\n </BanditThemeProvider>\n );\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-3604-B82856\nconst __banditFingerprint_hooks_useNotificationServicets = 'BL-FP-2EDB4B-6C09';\nconst __auditTrail_hooks_useNotificationServicets = 'BL-AU-MGOIKVVF-JFD2';\n// File: useNotificationService.ts | Path: src/hooks/useNotificationService.ts | Hash: 36046c09\n\nimport { useEffect } from 'react';\nimport { useNotification } from '../shared/components/NotificationProvider';\nimport { notificationService } from '../services/notification/notificationService';\n\n/**\n * Hook to initialize and use the notification service\n * This should be called once near the root of your component tree\n */\nexport const useNotificationService = () => {\n const notificationContext = useNotification();\n\n useEffect(() => {\n // Initialize the global notification service with the context\n notificationService.setContext(notificationContext);\n }, [notificationContext]);\n\n return {\n ...notificationContext,\n // Also expose the service methods for direct use\n handleHttpError: notificationService.handleHttpError.bind(notificationService),\n handleNetworkError: notificationService.handleNetworkError.bind(notificationService),\n handleValidationError: notificationService.handleValidationError.bind(notificationService),\n };\n};\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-E2F1-C79818\nconst __banditFingerprint_chat_memorymodaltsx = 'BL-FP-F532AD-BDE7';\nconst __auditTrail_chat_memorymodaltsx = 'BL-AU-MGOIKVV3-DWCK';\n// File: memory-modal.tsx | Path: src/chat/memory-modal.tsx | Hash: e2f1bde7\n\nimport React, { useState, useEffect } from \"react\";\nimport { useTheme, alpha, keyframes } from \"@mui/material/styles\";\nimport {\n Box,\n Typography,\n Modal,\n SwipeableDrawer,\n IconButton,\n TextField,\n Button,\n List,\n ListItem,\n Divider,\n Tabs,\n Tab,\n Tooltip,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Avatar,\n Radio,\n RadioGroup,\n FormControlLabel,\n FormControl,\n useMediaQuery,\n} from \"@mui/material\";\nimport { useMemoryStore } from \"../store/memoryStore\";\nimport { useVectorStore } from \"../hooks/useVectorStore\";\nimport type { VectorMemory } from \"../services/vectorDatabase/vectorDatabaseService\";\nimport { useConversationSyncStore } from \"../store/conversationSyncStore\";\nimport { debugLogger } from \"../services/logging/debugLogger\";\nimport {\n CloudSyncIcon,\n CloseIcon,\n DeleteIcon,\n PushPinIcon,\n PushPinOutlinedIcon,\n WarningIcon,\n} from \"../icons\";\nimport { appBarTokens, chatTokens } from \"./chat-tokens\";\n\ninterface MemoryModalProps {\n open: boolean;\n onClose: () => void;\n}\n\n\ntype ImportResultDetails = {\n totalMemories: number;\n successCount: number;\n failureCount: number;\n duration?: string;\n warnings?: string[];\n};\n\ntype ImportResult = {\n success: boolean;\n message?: string;\n details?: ImportResultDetails;\n};\n\ntype ImportProgress = {\n isImporting: boolean;\n progress: string;\n result?: ImportResult;\n};\n\n/**\n * Bandit Memory Modal\n *\n * - Displays user and auto memories.\n * - Supports editing, pinning, deleting, and adding new memories.\n * - Memory-aware layout adapts to mobile virtual keyboards.\n * - Shows pinned memory token budget in real-time.\n */\nconst MemoryModal: React.FC<MemoryModalProps> = ({ open, onClose }) => {\n const { entries, addMemory, togglePinMemory, removeMemory, clearMemories, hydrate, _hasHydrated } = useMemoryStore();\n const isAdvancedVectorFeaturesEnabled = useConversationSyncStore(\n (state) => state.isAdvancedVectorFeaturesEnabled\n );\n const { \n isVectorEnabled, \n addMemory: addVectorMemory, \n batchCreateMemories,\n batchCreateMemoriesAdvanced,\n batchImportMemories,\n getUserMemories: getVectorMemories,\n deleteMemory: deleteVectorMemory,\n updateMemory: updateVectorMemory\n } = useVectorStore();\n \n // Check if vector should be used for memories\n const shouldUseVectorForMemories = isVectorEnabled && isAdvancedVectorFeaturesEnabled;\n \n // Debug preferences on modal open\n useEffect(() => {\n if (open) {\n debugLogger.memoryDebug(\"Memory modal opened\", {\n isVectorEnabled,\n isAdvancedVectorFeaturesEnabled,\n shouldUseVectorForMemories,\n });\n }\n }, [open, isVectorEnabled, isAdvancedVectorFeaturesEnabled, shouldUseVectorForMemories]);\n \n const [newMemory, setNewMemory] = useState(\"\");\n const [selectedTab, setSelectedTab] = useState<\"auto\" | \"user\">(\"user\"); // Always default to user\n const [editingId, setEditingId] = useState<string | null>(null);\n const [editedContent, setEditedContent] = useState(\"\");\n const [multiSelectMode, setMultiSelectMode] = useState(false);\n const [selectedIds, setSelectedIds] = useState<string[]>([]);\n const [confirmOpen, setConfirmOpen] = useState(false);\n const [clearAllOpen, setClearAllOpen] = useState(false);\n const [clearOption, setClearOption] = useState<\"user\" | \"auto\" | \"both\">(\"both\");\n const [vectorMemories, setVectorMemories] = useState<VectorMemory[]>([]);\n const [bulkImportOpen, setBulkImportOpen] = useState(false);\n const [importProgress, setImportProgress] = useState<ImportProgress>({\n isImporting: false,\n progress: \"\",\n });\n\n const theme = useTheme();\n const isMobileView = useMediaQuery(theme.breakpoints.down(\"sm\"));\n \n // Define pulse animation\n const pulse = keyframes`\n 0% {\n opacity: 1;\n transform: scale(1);\n }\n 50% {\n opacity: 0.7;\n transform: scale(1.1);\n }\n 100% {\n opacity: 1;\n transform: scale(1);\n }\n `;\n\n // Define shimmer animation\n const shimmer = keyframes`\n 0% {\n left: -100%;\n }\n 100% {\n left: 100%;\n }\n `;\n\n const chat = chatTokens(theme);\n const shell = chat.surface.base;\n const input = chat.composer.surface;\n const fileText = chat.attachment.foreground;\n const appBar = appBarTokens(theme);\n const badge = chat.control.surface;\n const badgeHover = chat.control.surfaceHover;\n\n const handleAdd = async () => {\n if (newMemory.trim()) {\n if (shouldUseVectorForMemories) {\n try {\n await addVectorMemory(newMemory.trim());\n // Refresh vector memories list\n const memories = await getVectorMemories();\n setVectorMemories((memories ?? []) as VectorMemory[]);\n } catch (error) {\n debugLogger.error(\"Failed to add vector memory\", { error });\n // Fallback to local store\n await addMemory(newMemory.trim(), [], \"user\");\n }\n } else {\n await addMemory(newMemory.trim(), [], \"user\");\n }\n setNewMemory(\"\");\n }\n };\n\n // Load vector memories when modal opens and vector is enabled\n useEffect(() => {\n if (open && shouldUseVectorForMemories) {\n const loadVectorMemories = async () => {\n try {\n const memories = await getVectorMemories();\n debugLogger.memoryDebug(\"Vector memories loaded\", {\n count: memories?.length || 0,\n isArray: Array.isArray(memories),\n });\n setVectorMemories((memories ?? []) as VectorMemory[]);\n } catch (error) {\n debugLogger.error(\"Failed to load vector memories\", { error });\n setVectorMemories([]);\n }\n };\n loadVectorMemories();\n }\n }, [open, shouldUseVectorForMemories, getVectorMemories]);\n\n // Load local memories when modal opens and vector is disabled\n useEffect(() => {\n if (open && !shouldUseVectorForMemories) {\n const loadLocalMemories = async () => {\n try {\n await hydrate();\n } catch (error) {\n debugLogger.error(\"Failed to load local memories\", { error });\n }\n };\n loadLocalMemories();\n }\n }, [open, shouldUseVectorForMemories, hydrate]);\n\n // Also hydrate on initial mount to ensure memories are always loaded\n useEffect(() => {\n if (!shouldUseVectorForMemories && !_hasHydrated) {\n const initialHydrate = async () => {\n try {\n await hydrate();\n } catch (error) {\n debugLogger.error(\"Failed to perform initial hydration\", { error });\n }\n };\n initialHydrate();\n }\n }, [shouldUseVectorForMemories, _hasHydrated, hydrate]);\n\n const handleMultiDelete = async () => {\n if (selectedIds.length === 0) return;\n \n // Use the working single delete function in a loop\n let successCount = 0;\n let errorCount = 0;\n \n for (const id of selectedIds) {\n try {\n await handleDeleteMemory(id);\n successCount++;\n \n // Add a small delay to avoid overwhelming the API\n await new Promise(resolve => setTimeout(resolve, 100));\n } catch (error) {\n debugLogger.error(\"Failed to delete memory during bulk delete\", { id, error });\n errorCount++;\n }\n }\n \n setSelectedIds([]);\n setMultiSelectMode(false);\n setConfirmOpen(false);\n };\n\n const handleMultiPin = async (pinned: boolean) => {\n debugLogger.memoryDebug(\"Multi-pin requested\", {\n count: selectedIds.length,\n pinned,\n });\n\n if (selectedIds.length === 0) {\n debugLogger.warn(\"No memories selected for pinning\");\n return;\n }\n \n if (shouldUseVectorForMemories) {\n // For vector memories, loop through each ID and update pin status\n let successCount = 0;\n let errorCount = 0;\n \n for (const id of selectedIds) {\n try {\n const result = await updateVectorMemory(id, { pinned });\n if (result && result.success) {\n successCount++;\n } else {\n debugLogger.error(\"Failed to update vector memory pin status\", {\n id,\n error: result?.error || \"Unknown error\",\n });\n errorCount++;\n }\n } catch (error) {\n debugLogger.error(\"Exception updating vector memory pin status\", { id, error });\n errorCount++;\n }\n }\n \n debugLogger.memoryDebug(\"Vector pin update summary\", {\n successCount,\n errorCount,\n });\n \n // Refresh vector memories list\n try {\n const memories = await getVectorMemories();\n setVectorMemories((memories ?? []) as VectorMemory[]);\n } catch (error) {\n debugLogger.error(\"Failed to refresh vector memories after pin update\", { error });\n }\n } else {\n // Local store pin toggle\n try {\n let successCount = 0;\n \n for (const id of selectedIds) {\n const currentEntries = useMemoryStore.getState().entries;\n const memory = currentEntries.find(entry => entry.id === id);\n \n if (memory) {\n if (memory.pinned !== pinned) {\n togglePinMemory(id);\n successCount++;\n } else {\n debugLogger.memoryDebug(\"Memory already at desired pin status\", { id, pinned });\n }\n } else {\n debugLogger.warn(\"Memory not found in local store during pin update\", { id });\n }\n }\n \n debugLogger.memoryDebug(\"Local pin update summary\", { successCount });\n } catch (error) {\n debugLogger.error(\"Failed to update local pin status\", { error });\n }\n }\n \n setSelectedIds([]);\n setMultiSelectMode(false);\n };\n\n const handleDeleteMemory = async (memoryId: string) => {\n if (shouldUseVectorForMemories) {\n try {\n const result = await deleteVectorMemory(memoryId);\n \n if (result && result.success) {\n // Refresh vector memories list\n const memories = await getVectorMemories();\n setVectorMemories((memories ?? []) as VectorMemory[]);\n } else {\n throw new Error(result?.error || 'Delete operation failed');\n }\n } catch (error) {\n debugLogger.error(\"Failed to delete vector memory\", { error });\n // Don't fallback to local store for vector memories, just throw the error\n throw error;\n }\n } else {\n removeMemory(memoryId);\n }\n };\n\n const toggleSelection = (id: string) => {\n setSelectedIds((prev) =>\n prev.includes(id) ? prev.filter((x) => x !== id) : [...prev, id]\n );\n };\n\n const handleBulkImport = async () => {\n if (!batchCreateMemoriesAdvanced) {\n debugLogger.error(\"Advanced batch import not available\");\n return;\n }\n\n setImportProgress({ isImporting: true, progress: 'Preparing import...' });\n \n try {\n // Get all memories from IndexedDB\n await hydrate();\n const indexedDBMemories = entries;\n\n if (indexedDBMemories.length === 0) {\n setImportProgress({ \n isImporting: false, \n progress: 'No memories found to import',\n result: { success: false, message: 'No memories found in local storage' }\n });\n return;\n }\n\n // Convert IndexedDB format to vector format\n const memoriesToImport = indexedDBMemories.map(entry => ({\n content: entry.content,\n title: `Imported Memory - ${new Date(entry.timestamp).toLocaleDateString()}`,\n tags: entry.tags || []\n }));\n\n // Use advanced batch import with progress reporting\n const result = await batchCreateMemoriesAdvanced(memoriesToImport, {\n mode: 'append',\n clearExisting: false,\n chunkSize: 25, // Smaller chunks for better progress reporting\n validateContent: true,\n onProgress: (current: number, total: number, message: string) => {\n setImportProgress({ \n isImporting: true, \n progress: `${message} (${current}/${total})`\n });\n }\n });\n \n setImportProgress({ \n isImporting: false, \n progress: 'Import completed!',\n result: {\n success: result.success,\n message: result.message,\n details: {\n totalMemories: result.totalMemories,\n successCount: result.successCount,\n failureCount: result.failureCount,\n warnings: result.warnings,\n duration: `${(result.duration / 1000).toFixed(1)}s`\n }\n }\n });\n\n if (result.success) {\n // Refresh vector memories list\n const memories = await getVectorMemories();\n setVectorMemories((memories ?? []) as VectorMemory[]);\n \n // Auto-close dialog after success\n setTimeout(() => {\n setBulkImportOpen(false);\n setImportProgress({ isImporting: false, progress: '' });\n }, 3000);\n }\n } catch (error) {\n debugLogger.error(\"Bulk import failed\", { error });\n setImportProgress({ \n isImporting: false, \n progress: `Import failed: ${error instanceof Error ? error.message : String(error)}` \n });\n }\n };\n\n const getMemoriesForDisplay = () => {\n if (shouldUseVectorForMemories) {\n // Transform vector memories to match local memory structure, preserving the source field from API\n const transformedMemories = vectorMemories.map(vectorMemory => ({\n ...vectorMemory,\n // Preserve the source field from API response, but default to 'auto' for backwards compatibility\n // Most vector memories are automatically created by the system\n source: vectorMemory.source || \"auto\", // Default to 'auto' since most vector memories are system-generated\n pinned: vectorMemory.pinned || false, // Use API pinned or default to false\n timestamp: vectorMemory.uploadedAt ? new Date(vectorMemory.uploadedAt).getTime() : Date.now(),\n tags: vectorMemory.tags || []\n }));\n \n // Filter by selected tab (user or auto)\n const result = transformedMemories.filter(memory => memory.source === selectedTab);\n debugLogger.memoryDebug(\"Vector memories filtered for display\", {\n selectedTab,\n vectorMemoriesCount: vectorMemories.length,\n resultCount: result.length,\n });\n return result;\n } else {\n // Local store memories\n const result = entries.filter((entry) => entry.source === selectedTab);\n return result;\n }\n };\n\n const getUserMemoryCount = () => {\n if (shouldUseVectorForMemories) {\n return vectorMemories.filter(memory => (memory.source || \"auto\") === \"user\").length;\n } else {\n return entries.filter(e => e.source === \"user\").length;\n }\n };\n\n const getAutoMemoryCount = () => {\n if (shouldUseVectorForMemories) {\n return vectorMemories.filter(memory => (memory.source || \"auto\") === \"auto\").length;\n } else {\n return entries.filter(e => e.source === \"auto\").length;\n }\n };\n\n const handleClearAll = async () => {\n if (shouldUseVectorForMemories) {\n // For vector memories, we need to clear based on the selected option\n try {\n let memoriesToDelete = [];\n \n if (clearOption === \"user\") {\n memoriesToDelete = vectorMemories.filter(memory => (memory.source || \"auto\") === \"user\");\n } else if (clearOption === \"auto\") {\n memoriesToDelete = vectorMemories.filter(memory => (memory.source || \"auto\") === \"auto\");\n } else { // both\n memoriesToDelete = vectorMemories;\n }\n \n let successCount = 0;\n let errorCount = 0;\n \n for (const memory of memoriesToDelete) {\n try {\n const result = await deleteVectorMemory(memory.id);\n \n if (result && result.success) {\n successCount++;\n } else {\n errorCount++;\n debugLogger.error(\"Vector memory deletion failed\", {\n id: memory.id,\n error: result?.error || \"No result returned\",\n });\n }\n } catch (error) {\n errorCount++;\n debugLogger.error(\"Exception deleting vector memory\", { id: memory.id, error });\n }\n \n // Add a small delay to avoid overwhelming the API\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n \n // Refresh vector memories list\n const memories = await getVectorMemories();\n setVectorMemories((memories ?? []) as VectorMemory[]);\n } catch (error) {\n debugLogger.error(\"Exception during vector clear-all operation\", { error });\n }\n } else {\n // Local store clearing\n try {\n if (clearOption === \"both\") {\n await clearMemories();\n } else {\n // Clear specific type\n const entriesToKeep = entries.filter(entry => entry.source !== clearOption);\n useMemoryStore.setState({ entries: entriesToKeep });\n }\n } catch (error) {\n debugLogger.error(\"Failed to clear local memories\", { error });\n }\n }\n setClearAllOpen(false);\n };\n\n const filteredMemories = getMemoriesForDisplay();\n\n const sheet = (\n <Box\n sx={{\n width: \"100%\",\n maxWidth: isMobileView ? \"100%\" : 800,\n maxHeight: isMobileView ? \"min(720px, 82vh)\" : \"90vh\",\n height: isMobileView ? \"100%\" : \"auto\",\n bgcolor: isMobileView ? theme.palette.background.paper : shell,\n color: theme.palette.text.primary,\n display: \"flex\",\n flexDirection: \"column\",\n borderRadius: isMobileView ? \"22px 22px 0 0\" : 3,\n overflow: \"hidden\",\n boxShadow: isMobileView ? \"none\" : `0 20px 60px ${alpha(theme.palette.common.black, 0.3)}`,\n border: isMobileView ? \"none\" : `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n zIndex: 2000, // Ensure it's on top\n }}\n >\n {isMobileView && (\n <Box\n sx={{\n height: 6,\n width: 56,\n borderRadius: 999,\n bgcolor: alpha(theme.palette.text.primary, 0.18),\n alignSelf: \"center\",\n mt: 1.25,\n mb: 0.75,\n }}\n />\n )}\n\n {/* Header */}\n <Box\n sx={{\n flexShrink: 0,\n px: isMobileView ? 1.5 : 2,\n py: isMobileView ? 1.25 : 2,\n borderBottom: `1px solid ${appBar.border}`,\n display: \"flex\",\n flexDirection: \"column\",\n gap: isMobileView ? 0.9 : 1.25,\n }}\n >\n <Box\n sx={{\n width: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: isMobileView ? 0.75 : 1.25,\n flexWrap: \"wrap\",\n }}\n >\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.75 }}>\n <Typography variant=\"h6\" sx={{ fontWeight: 600 }}>\n Memory\n </Typography>\n {shouldUseVectorForMemories && (\n <Tooltip title=\"Memories stay in your private knowledge space for faster, more accurate answers.\">\n <Typography\n variant=\"caption\"\n sx={{\n color: theme.palette.primary.main,\n bgcolor: alpha(theme.palette.primary.main, 0.1),\n px: 1,\n py: 0.25,\n borderRadius: 1,\n fontSize: \"0.7rem\",\n fontWeight: 600,\n textTransform: \"uppercase\",\n cursor: \"help\",\n }}\n >\n Synced\n </Typography>\n </Tooltip>\n )}\n </Box>\n\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n gap: isMobileView ? 0.5 : 1,\n flexWrap: \"wrap\",\n }}\n >\n {multiSelectMode ? (\n <>\n <Typography variant=\"caption\" sx={{ color: theme.palette.text.secondary, mr: 0.5 }}>\n {selectedIds.length} selected\n </Typography>\n <Button\n variant=\"outlined\"\n size=\"small\"\n onClick={() => {\n setMultiSelectMode(false);\n setSelectedIds([]);\n }}\n sx={{ textTransform: \"none\", borderRadius: 2, fontSize: \"0.75rem\" }}\n >\n Cancel\n </Button>\n {selectedIds.length > 0 && (\n <>\n <Button\n variant=\"outlined\"\n size=\"small\"\n color=\"secondary\"\n onClick={() => handleMultiPin(true)}\n sx={{ textTransform: \"none\", borderRadius: 2, fontSize: \"0.75rem\" }}\n >\n Pin ({selectedIds.length})\n </Button>\n <Button\n variant=\"outlined\"\n size=\"small\"\n onClick={() => handleMultiPin(false)}\n sx={{ textTransform: \"none\", borderRadius: 2, fontSize: \"0.75rem\" }}\n >\n Unpin ({selectedIds.length})\n </Button>\n <Button\n variant=\"contained\"\n size=\"small\"\n color=\"error\"\n onClick={() => setConfirmOpen(true)}\n sx={{ textTransform: \"none\", borderRadius: 2, fontSize: \"0.75rem\" }}\n >\n Delete ({selectedIds.length})\n </Button>\n </>\n )}\n </>\n ) : (\n filteredMemories.length > 0 && (\n <>\n <Button\n variant=\"outlined\"\n size=\"small\"\n onClick={() => setClearAllOpen(true)}\n sx={{ textTransform: \"none\", borderRadius: 2, fontSize: \"0.75rem\" }}\n >\n Clear All\n </Button>\n {isVectorEnabled && entries.length > 0 && (\n <Button\n variant=\"outlined\"\n size=\"small\"\n color=\"primary\"\n onClick={() => setBulkImportOpen(true)}\n startIcon={<CloudSyncIcon />}\n sx={{ textTransform: \"none\", borderRadius: 2, fontSize: \"0.75rem\" }}\n >\n Import to workspace\n </Button>\n )}\n <Button\n variant=\"outlined\"\n size=\"small\"\n color=\"error\"\n onClick={() => {\n setMultiSelectMode(true);\n setSelectedIds([]);\n }}\n sx={{ textTransform: \"none\", borderRadius: 2, fontSize: \"0.75rem\" }}\n >\n Select\n </Button>\n </>\n )\n )}\n\n {!multiSelectMode && isMobileView && (\n <Button\n variant=\"contained\"\n size=\"small\"\n onClick={handleAdd}\n disabled={!newMemory.trim()}\n sx={{\n textTransform: \"none\",\n borderRadius: 2,\n fontWeight: 600,\n minWidth: 88,\n }}\n >\n Save\n </Button>\n )}\n\n <IconButton\n onClick={onClose}\n sx={{\n color: appBar.icon,\n '&:hover': { bgcolor: alpha(theme.palette.text.primary, 0.08) },\n borderRadius: 2,\n }}\n size=\"small\"\n >\n <CloseIcon fontSize=\"small\" />\n </IconButton>\n </Box>\n </Box>\n\n <Box\n sx={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: 0.5,\n color: theme.palette.text.secondary,\n }}\n >\n <Typography\n variant=\"caption\"\n sx={{\n color: theme.palette.text.secondary,\n borderRadius: 1,\n px: 0.75,\n py: 0.25,\n bgcolor: alpha(theme.palette.text.secondary, 0.1),\n textTransform: \"uppercase\",\n letterSpacing: 0.6,\n }}\n >\n {shouldUseVectorForMemories ? \"Cloud memory\" : \"Local memory\"}\n </Typography>\n {filteredMemories.length > 0 && (\n <Typography\n variant=\"caption\"\n sx={{\n color: theme.palette.text.secondary,\n borderRadius: 1,\n px: 0.75,\n py: 0.25,\n bgcolor: alpha(theme.palette.text.secondary, 0.1),\n textTransform: \"uppercase\",\n letterSpacing: 0.6,\n }}\n >\n {filteredMemories.length} {selectedTab}\n </Typography>\n )}\n </Box>\n </Box>\n {/* Vector Mode Indicator */}\n {shouldUseVectorForMemories && (\n <Box sx={{\n flexShrink: 0,\n mx: isMobileView ? 1.5 : 2,\n mt: 1,\n p: 1.5,\n background: `linear-gradient(135deg, ${alpha(theme.palette.primary.main, 0.08)}, ${alpha(theme.palette.secondary.main, 0.05)})`,\n border: `1px solid ${alpha(theme.palette.primary.main, 0.2)}`,\n borderRadius: 2,\n display: \"flex\",\n alignItems: \"center\",\n gap: 1.5,\n position: \"relative\",\n overflow: \"hidden\"\n }}>\n {/* Animated background shimmer */}\n <Box sx={{\n position: \"absolute\",\n top: 0,\n left: \"-100%\",\n width: \"100%\",\n height: \"100%\",\n background: `linear-gradient(90deg, transparent, ${alpha(theme.palette.primary.main, 0.1)}, transparent)`,\n animation: `${shimmer} 3s infinite`\n }} />\n <Box sx={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n bgcolor: theme.palette.primary.main,\n animation: `${pulse} 2s infinite`,\n zIndex: 1\n }} />\n <Typography variant=\"body2\" sx={{ \n color: theme.palette.primary.main,\n fontSize: \"0.8rem\",\n fontWeight: 500,\n zIndex: 1\n }}>\n Cloud memory · synced to your account\n </Typography>\n </Box>\n )}\n\n {/* Info + Tabs */}\n <Box sx={{ flexShrink: 0 }}>\n <Box sx={{ px: isMobileView ? 1.5 : 2, py: isMobileView ? 1.25 : 1.5 }}>\n <Typography\n variant=\"body2\"\n sx={{ color: theme.palette.text.secondary, fontSize: \"0.85rem\", textAlign: isMobileView ? \"left\" : \"center\" }}\n >\n {shouldUseVectorForMemories ? (\n \"Synced to your account for quick recall.\"\n ) : (\n \"Private and local. You decide what's remembered.\"\n )}\n </Typography>\n </Box>\n <Tabs\n value={selectedTab}\n onChange={(_, val) => setSelectedTab(val)}\n textColor=\"inherit\"\n indicatorColor=\"secondary\"\n centered={!isMobileView}\n variant={isMobileView ? \"fullWidth\" : \"standard\"}\n sx={{ \n bgcolor: alpha(input, isMobileView ? 0.65 : 0.5),\n borderTop: isMobileView ? `1px solid ${alpha(theme.palette.divider, 0.15)}` : undefined,\n borderBottom: `1px solid ${alpha(theme.palette.divider, 0.15)}`,\n \"& .MuiTab-root\": {\n textTransform: \"none\",\n fontWeight: 500,\n minHeight: isMobileView ? 44 : 48,\n paddingInline: isMobileView ? 1 : 1.5,\n }\n }}\n >\n <Tab \n label={\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1 }}>\n User\n {getUserMemoryCount() > 0 && (\n <Typography variant=\"caption\" sx={{\n bgcolor: alpha(theme.palette.primary.main, 0.2),\n color: theme.palette.primary.main,\n px: 0.75,\n py: 0.25,\n borderRadius: 1,\n fontSize: \"0.65rem\",\n fontWeight: 600,\n }}>\n {getUserMemoryCount()}\n </Typography>\n )}\n </Box>\n } \n value=\"user\" \n />\n <Tab \n label={\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1 }}>\n Auto\n {getAutoMemoryCount() > 0 && (\n <Typography variant=\"caption\" sx={{\n bgcolor: alpha(theme.palette.secondary.main, 0.2),\n color: theme.palette.secondary.main,\n px: 0.75,\n py: 0.25,\n borderRadius: 1,\n fontSize: \"0.65rem\",\n fontWeight: 600,\n }}>\n {getAutoMemoryCount()}\n </Typography>\n )}\n </Box>\n } \n value=\"auto\" \n />\n </Tabs>\n </Box>\n\n {/* Scrollable Memory List */}\n <Box\n sx={{\n flexGrow: 1,\n overflowY: \"auto\",\n px: isMobileView ? 1.5 : 2,\n py: isMobileView ? 1 : 1,\n }}\n >\n {filteredMemories.length === 0 ? (\n <Box sx={{ \n display: \"flex\", \n flexDirection: \"column\", \n alignItems: \"center\", \n justifyContent: \"center\",\n height: \"200px\",\n textAlign: \"center\"\n }}>\n <Typography variant=\"h6\" sx={{ \n color: theme.palette.text.secondary, \n mb: 1,\n fontSize: \"1.1rem\"\n }}>\n No {selectedTab} memories yet\n </Typography>\n <Typography variant=\"body2\" sx={{ \n color: alpha(theme.palette.text.secondary, 0.7),\n maxWidth: 280\n }}>\n {selectedTab === \"user\" \n ? shouldUseVectorForMemories \n ? \"Start by adding something you'd like me to remember. Your memories will be kept in a private workspace for quick recall.\"\n : \"Start by adding something you'd like me to remember about you or your preferences.\"\n : shouldUseVectorForMemories\n ? \"Auto memories are created automatically based on our conversations and kept in your private workspace for better answers.\"\n : \"Auto memories are created automatically based on our conversations.\"\n }\n </Typography>\n </Box>\n ) : (\n filteredMemories.map((memory, memoryIndex) => {\n const isSelected = selectedIds.includes(memory.id);\n return (\n <React.Fragment key={memory.id}>\n <List sx={{ listStyle: \"none\", pl: 0, m: 0 }}>\n <ListItem\n onClick={() => multiSelectMode && toggleSelection(memory.id)}\n sx={{\n px: 0,\n py: 1.5,\n display: \"flex\",\n justifyContent: \"space-between\",\n gap: 1.5,\n alignItems: \"flex-start\",\n bgcolor: isSelected ? alpha(theme.palette.error.main, 0.1) : undefined,\n borderRadius: isSelected ? 2 : 0,\n cursor: multiSelectMode ? \"pointer\" : undefined,\n border: isSelected ? `2px solid ${alpha(theme.palette.error.main, 0.3)}` : \"2px solid transparent\",\n transition: \"all 0.2s ease\",\n \"&:hover\": {\n bgcolor: multiSelectMode ? alpha(theme.palette.error.main, 0.05) : alpha(theme.palette.text.primary, 0.02),\n }\n }}\n >\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"flex-start\",\n flexGrow: 1,\n gap: 1.5,\n }}\n >\n <Avatar\n src=\"https://cdn.burtson.ai/images/brain-icon.png\"\n alt=\"Memory\"\n sx={{\n width: 36,\n height: 36,\n mt: 0.2,\n bgcolor: theme.palette.mode === \"light\" ? \"#f5f5f5\" : theme.palette.background.paper,\n border: isVectorEnabled \n ? `2px solid ${alpha(theme.palette.primary.main, 0.4)}` \n : `1px solid ${theme.palette.divider}`,\n position: \"relative\"\n }}\n >\n {isVectorEnabled && (\n <Box sx={{\n position: \"absolute\",\n top: -2,\n right: -2,\n width: 12,\n height: 12,\n borderRadius: \"50%\",\n bgcolor: theme.palette.primary.main,\n border: `2px solid ${theme.palette.background.paper}`,\n fontSize: \"6px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"white\"\n }}>\n ⚡\n </Box>\n )}\n </Avatar>\n {editingId === memory.id ? (\n <TextField\n fullWidth\n multiline\n autoFocus\n value={editedContent}\n onChange={(e) => setEditedContent(e.target.value)}\n onBlur={() => {\n if (\n editedContent.trim() &&\n editedContent !== memory.content\n ) {\n useMemoryStore.setState((state) => ({\n entries: state.entries.map((entry) =>\n entry.id === memory.id\n ? { ...entry, content: editedContent }\n : entry\n ),\n }));\n }\n setEditingId(null);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n setEditingId(null);\n setEditedContent('');\n } else if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.currentTarget.blur();\n }\n }}\n sx={{\n \"& .MuiInputBase-root\": { \n color: theme.palette.text.primary,\n bgcolor: input,\n borderRadius: 3,\n },\n \"& .MuiOutlinedInput-root\": {\n borderRadius: 3,\n \"& fieldset\": {\n borderRadius: 3,\n },\n \"&:hover fieldset\": {\n borderRadius: 3,\n },\n \"&.Mui-focused fieldset\": {\n borderRadius: 3,\n },\n },\n }}\n helperText=\"Press Cmd/Ctrl+Enter to save, Escape to cancel\"\n />\n ) : (\n <Box sx={{ flex: 1 }}>\n <Typography\n sx={{\n cursor: (!multiSelectMode && !shouldUseVectorForMemories) ? \"pointer\" : \"default\",\n wordBreak: \"break-word\",\n color: memory.pinned ? \"secondary.main\" : theme.palette.text.primary,\n fontWeight: memory.pinned ? 500 : 400,\n lineHeight: 1.4,\n \"&:hover\": (!multiSelectMode && !shouldUseVectorForMemories) ? {\n color: memory.pinned ? \"secondary.dark\" : \"primary.main\"\n } : undefined\n }}\n onClick={() => {\n if (!multiSelectMode && !shouldUseVectorForMemories) {\n setEditingId(memory.id);\n setEditedContent(memory.content);\n }\n }}\n >\n {memory.content}\n </Typography>\n {memory.pinned && (\n <Typography variant=\"caption\" sx={{\n color: alpha(theme.palette.secondary.main, 0.7),\n fontStyle: \"italic\",\n mt: 0.5,\n display: \"block\"\n }}>\n Pinned\n </Typography>\n )}\n </Box>\n )}\n </Box>\n {!multiSelectMode && (\n <Box sx={{ display: \"flex\", gap: 0.5, mt: 0.5 }}>\n <Tooltip title={memory.pinned ? \"Unpin memory\" : \"Pin memory\"}>\n <IconButton\n onClick={async () => {\n if (shouldUseVectorForMemories) {\n try {\n // Toggle pin status using vector update API\n const result = await updateVectorMemory(memory.id, { pinned: !memory.pinned });\n if (result.success) {\n // Refresh vector memories list to show updated pin status\n const memories = await getVectorMemories();\n setVectorMemories((memories ?? []) as VectorMemory[]);\n } else {\n debugLogger.error(\"Failed to update vector memory pin status\", {\n id: memory.id,\n error: result.error,\n });\n }\n } catch (error) {\n debugLogger.error(\"Error updating vector memory pin status\", {\n id: memory.id,\n error,\n });\n }\n } else {\n togglePinMemory(memory.id);\n }\n }}\n sx={{ \n color: memory.pinned ? \"secondary.main\" : alpha(theme.palette.text.secondary, 0.7),\n \"&:hover\": { \n bgcolor: alpha(memory.pinned ? theme.palette.secondary.main : theme.palette.text.secondary, 0.1)\n }\n }}\n size=\"small\"\n >\n {memory.pinned ? (\n <PushPinIcon fontSize=\"small\" />\n ) : (\n <PushPinOutlinedIcon fontSize=\"small\" />\n )}\n </IconButton>\n </Tooltip>\n <Tooltip title=\"Delete memory\">\n <IconButton\n onClick={async () => await handleDeleteMemory(memory.id)}\n sx={{ \n color: alpha(theme.palette.text.secondary, 0.7),\n \"&:hover\": { \n bgcolor: alpha(theme.palette.error.main, 0.1),\n color: theme.palette.error.main\n }\n }}\n size=\"small\"\n >\n <DeleteIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n </Box>\n )}\n </ListItem>\n </List>\n {memoryIndex < filteredMemories.length - 1 && (\n <Divider sx={{ bgcolor: alpha(appBar.border, 0.5), my: 0.5 }} />\n )}\n </React.Fragment>\n );\n })\n )}\n </Box>\n\n {/* Multi Delete Confirm Bar */}\n {multiSelectMode && (\n <Box\n sx={{\n p: isMobileView ? 1.5 : 2,\n borderTop: `1px solid ${appBar.border}`,\n bgcolor: alpha(theme.palette.error.main, 0.05),\n borderBottom: selectedIds.length > 0 ? `2px solid ${alpha(theme.palette.error.main, 0.2)}` : undefined,\n }}\n >\n {selectedIds.length === 0 ? (\n <Typography variant=\"body2\" sx={{ \n textAlign: \"center\", \n color: theme.palette.text.secondary,\n fontStyle: \"italic\"\n }}>\n Tap memories to select them for deletion\n </Typography>\n ) : (\n <Box sx={{ display: \"flex\", gap: 1, alignItems: \"center\" }}>\n <Button\n variant=\"outlined\"\n onClick={() => {\n setSelectedIds(filteredMemories.map(m => m.id));\n }}\n sx={{ \n textTransform: \"none\",\n borderRadius: 2,\n fontSize: \"0.8rem\",\n minWidth: \"auto\",\n }}\n >\n Select All\n </Button>\n <Button\n fullWidth\n variant=\"contained\"\n color=\"error\"\n onClick={() => setConfirmOpen(true)}\n sx={{ borderRadius: 2 }}\n >\n Delete Selected ({selectedIds.length})\n </Button>\n </Box>\n )}\n </Box>\n )}\n\n {/* Footer */}\n <Box\n sx={{\n flexShrink: 0,\n p: isMobileView ? 1.5 : 2,\n borderTop: `1px solid ${appBar.border}`,\n bgcolor: isMobileView ? theme.palette.background.paper : shell,\n pb: `calc(env(safe-area-inset-bottom, 0px) + 8px)`,\n }}\n >\n <TextField\n fullWidth\n size=\"small\"\n value={newMemory}\n onChange={(e) => setNewMemory(e.target.value)}\n placeholder={shouldUseVectorForMemories \n ? `Add a new ${selectedTab} memory to your workspace...` \n : `Add a new ${selectedTab} memory...`\n }\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey && newMemory.trim()) {\n e.preventDefault();\n handleAdd();\n }\n }}\n sx={{\n \"& .MuiInputBase-root\": { \n color: theme.palette.text.primary,\n bgcolor: alpha(input, 0.3), // Use semi-transparent background\n borderRadius: 3, // More rounded for modern look\n },\n \"& .MuiOutlinedInput-root\": {\n borderRadius: 3, // Ensure outline variant is also rounded\n bgcolor: \"transparent\", // Remove background from outline variant\n \"& fieldset\": {\n borderRadius: 3, // Ensure fieldset border is rounded\n borderColor: alpha(theme.palette.divider, 0.3),\n },\n \"&:hover fieldset\": {\n borderRadius: 3, // Maintain rounded corners on hover\n borderColor: alpha(theme.palette.primary.main, 0.5),\n },\n \"&.Mui-focused fieldset\": {\n borderRadius: 3, // Maintain rounded corners when focused\n borderColor: theme.palette.primary.main,\n },\n },\n mb: 1.5,\n }}\n InputProps={{\n endAdornment: newMemory.trim() && (\n <Typography variant=\"caption\" sx={{ \n color: alpha(theme.palette.text.secondary, 0.7),\n fontSize: \"0.7rem\",\n whiteSpace: \"nowrap\"\n }}>\n Press Enter\n </Typography>\n )\n }}\n />\n {!isMobileView && (\n <Button\n fullWidth\n variant=\"contained\"\n onClick={handleAdd}\n disabled={!newMemory.trim()}\n sx={{ \n borderRadius: 2, \n py: 1.25,\n textTransform: \"none\",\n fontWeight: 600,\n }}\n >\n Save\n </Button>\n )}\n </Box>\n\n {/* Confirm Delete Modal */}\n <Dialog \n open={confirmOpen} \n onClose={() => setConfirmOpen(false)}\n sx={{\n zIndex: 2100, // Higher than main modal (2000)\n }}\n PaperProps={{\n sx: { borderRadius: 3, minWidth: 320 }\n }}\n >\n <DialogTitle sx={{ pb: 1 }}>\n Delete {selectedIds.length} {selectedIds.length === 1 ? 'Memory' : 'Memories'}?\n </DialogTitle>\n <DialogContent>\n <Typography variant=\"body2\" sx={{ color: theme.palette.text.secondary }}>\n This will permanently remove the selected memory entries. This action cannot be undone.\n </Typography>\n </DialogContent>\n <DialogActions sx={{ p: 3, pt: 1 }}>\n <Button \n onClick={() => setConfirmOpen(false)}\n sx={{ textTransform: \"none\", borderRadius: 3 }}\n >\n Cancel\n </Button>\n <Button \n onClick={handleMultiDelete} \n color=\"error\"\n variant=\"contained\"\n sx={{ textTransform: \"none\", borderRadius: 3 }}\n >\n Delete ({selectedIds.length})\n </Button>\n </DialogActions>\n </Dialog>\n {/* Clear All Dialog */}\n <Dialog \n open={clearAllOpen} \n onClose={() => setClearAllOpen(false)}\n sx={{\n zIndex: 2100, // Higher than main modal (2000)\n }}\n PaperProps={{\n sx: { borderRadius: 3, minWidth: 320 }\n }}\n >\n <DialogTitle sx={{ pb: 1, fontWeight: 600 }}>\n Clear Memories\n </DialogTitle>\n <DialogContent sx={{ pb: 2 }}>\n <Typography variant=\"body2\" sx={{ mb: 3, color: theme.palette.text.secondary }}>\n This will permanently remove selected memory types. Choose which ones to clear:\n </Typography>\n <FormControl component=\"fieldset\">\n <RadioGroup\n value={clearOption}\n onChange={(e) => setClearOption(e.target.value as \"user\" | \"auto\" | \"both\")}\n >\n <FormControlLabel \n value=\"user\" \n control={<Radio />} \n label={\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1 }}>\n <Typography>User Memories</Typography>\n <Typography variant=\"caption\" sx={{\n bgcolor: alpha(theme.palette.primary.main, 0.1),\n color: theme.palette.primary.main,\n px: 1,\n py: 0.25,\n borderRadius: 1,\n fontWeight: 600,\n }}>\n {getUserMemoryCount()}\n </Typography>\n </Box>\n }\n />\n <FormControlLabel \n value=\"auto\" \n control={<Radio />} \n label={\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1 }}>\n <Typography>Auto Memories</Typography>\n <Typography variant=\"caption\" sx={{\n bgcolor: alpha(theme.palette.secondary.main, 0.1),\n color: theme.palette.secondary.main,\n px: 1,\n py: 0.25,\n borderRadius: 1,\n fontWeight: 600,\n }}>\n {getAutoMemoryCount()}\n </Typography>\n </Box>\n }\n />\n <FormControlLabel \n value=\"both\" \n control={<Radio />} \n label={\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1 }}>\n <Typography>Both Types</Typography>\n <Typography variant=\"caption\" sx={{\n bgcolor: alpha(theme.palette.error.main, 0.1),\n color: theme.palette.error.main,\n px: 1,\n py: 0.25,\n borderRadius: 1,\n fontWeight: 600,\n }}>\n {entries.length}\n </Typography>\n </Box>\n }\n />\n </RadioGroup>\n </FormControl>\n </DialogContent>\n <DialogActions sx={{ p: 3, pt: 1 }}>\n <Button \n onClick={() => setClearAllOpen(false)}\n sx={{ textTransform: \"none\", borderRadius: 3 }}\n >\n Cancel\n </Button>\n <Button\n color=\"error\"\n variant=\"contained\"\n onClick={handleClearAll}\n sx={{ textTransform: \"none\", borderRadius: 3 }}\n >\n Clear {clearOption === \"both\" ? \"All\" : clearOption} Memories\n </Button>\n </DialogActions>\n </Dialog>\n\n {/* Bulk Import Dialog */}\n <Dialog \n open={bulkImportOpen} \n onClose={() => setBulkImportOpen(false)}\n maxWidth=\"sm\"\n fullWidth\n PaperProps={{\n sx: { borderRadius: 3 }\n }}\n >\n <DialogTitle sx={{ \n fontWeight: 600, \n pb: 1,\n display: 'flex',\n alignItems: 'center',\n gap: 1\n }}>\n <CloudSyncIcon color=\"primary\" />\n Import Memories to Secure Workspace\n </DialogTitle>\n <DialogContent sx={{ py: 2 }}>\n {!importProgress.isImporting ? (\n <Box>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 2 }}>\n This will import all your local memories ({entries.length} memories) to your secure workspace for faster, more reliable answers.\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 2 }}>\n • Memories will be added to your synced workspace\n • Local memories will remain unchanged\n • You can switch between synced and local storage anytime\n </Typography>\n <Typography variant=\"body2\" color=\"primary\" sx={{ fontWeight: 500 }}>\n Ready to import {entries.length} memories?\n </Typography>\n </Box>\n ) : (\n <Box sx={{ textAlign: 'center', py: 2 }}>\n <CloudSyncIcon \n sx={{ \n fontSize: 48, \n color: 'primary.main',\n mb: 2,\n animation: `${pulse} 2s ease-in-out infinite`\n }} \n />\n <Typography variant=\"body1\" sx={{ mb: 1 }}>\n {importProgress.progress}\n </Typography>\n {importProgress.result && (\n <>\n <Typography \n variant=\"body2\" \n color={importProgress.result.success ? 'success.main' : 'error.main'}\n sx={{ mt: 1, mb: 2 }}\n >\n {importProgress.result.message}\n </Typography>\n {importProgress.result.details && (\n <Box sx={{ \n textAlign: 'left', \n backgroundColor: 'background.paper',\n border: 1,\n borderColor: 'divider',\n borderRadius: 1,\n p: 2,\n mt: 2\n }}>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', mb: 1 }}>\n Import Details:\n </Typography>\n <Typography variant=\"body2\" sx={{ mb: 0.5 }}>\n • Total: {importProgress.result.details.totalMemories} memories\n </Typography>\n <Typography variant=\"body2\" sx={{ mb: 0.5 }}>\n • Success: {importProgress.result.details.successCount}\n </Typography>\n <Typography variant=\"body2\" sx={{ mb: 0.5 }}>\n • Failed: {importProgress.result.details.failureCount}\n </Typography>\n <Typography variant=\"body2\" sx={{ mb: 0.5 }}>\n • Duration: {importProgress.result.details.duration}\n </Typography>\n {importProgress.result.details.warnings && importProgress.result.details.warnings.length > 0 && (\n <Typography variant=\"body2\" color=\"warning.main\" sx={{ mt: 1, display: \"flex\", alignItems: \"center\", gap: 0.5 }}>\n <WarningIcon fontSize=\"inherit\" aria-hidden /> {importProgress.result.details.warnings.join(', ')}\n </Typography>\n )}\n </Box>\n )}\n </>\n )}\n </Box>\n )}\n </DialogContent>\n <DialogActions sx={{ p: 3, pt: 1 }}>\n <Button \n onClick={() => {\n setBulkImportOpen(false);\n setImportProgress({ isImporting: false, progress: '' });\n }}\n disabled={importProgress.isImporting}\n sx={{ textTransform: \"none\", borderRadius: 3 }}\n >\n {importProgress.isImporting ? 'Importing...' : 'Cancel'}\n </Button>\n {!importProgress.isImporting && !importProgress.result && (\n <Button\n color=\"primary\"\n variant=\"contained\"\n onClick={handleBulkImport}\n startIcon={<CloudSyncIcon />}\n sx={{ textTransform: \"none\", borderRadius: 3 }}\n >\n Import {entries.length} Memories\n </Button>\n )}\n </DialogActions>\n </Dialog>\n </Box>\n );\n\n if (isMobileView) {\n return (\n <SwipeableDrawer\n anchor=\"bottom\"\n open={open}\n onClose={onClose}\n onOpen={() => {}}\n disableSwipeToOpen\n ModalProps={{ keepMounted: true }}\n // Must sit above the mobile conversations modal (a MUI Modal at z-index\n // 1300) — the Drawer default of 1200 opened this sheet *behind* it,\n // which read as \"memory doesn't open\" in the PWA.\n sx={{ zIndex: 2000 }}\n PaperProps={{\n sx: {\n height: 'min(720px, 82vh)',\n borderRadius: '22px 22px 0 0',\n overflow: 'hidden',\n bgcolor: theme.palette.background.paper,\n display: 'flex',\n justifyContent: 'center',\n },\n }}\n >\n {sheet}\n </SwipeableDrawer>\n );\n }\n\n return (\n <Modal \n open={open} \n onClose={onClose}\n sx={{\n zIndex: 2000, // Higher than drawer (1400) and other modals (1500)\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n p: 2,\n }}\n >\n {sheet}\n </Modal>\n );\n};\n\nexport default MemoryModal;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAWA,OAAO,WAAW;AAClB,SAAS,KAAK,kBAAwC;AACtD,SAAS,aAAyB;;;AC4ClC,IAAa,QAAiB;EAC5B,YAAY;EACZ,YAAY;EACZ,SAAS;EACT,kBAAkB;EAClB,iBAAiB;EACjB,MAAM;EACN,mBAAmB;EACnB,SAAS;EACT,sBAAsB;EACtB,SAAS;EACT,sBAAsB;EACtB,WAAW;EACX,wBAAwB;EACxB,OAAO;EACP,oBAAoB;EACpB,QAAQ;EACR,qBAAqB;EACrB,aAAa;EACb,0BAA0B;EAC1B,SAAS;EACT,sBAAsB;EACtB,SAAS;EACT,sBAAsB;EACtB,MAAM;EACN,mBAAmB;EAGnB,WAAW;EACX,wBAAwB;EACxB,QAAQ;EACR,iBAAiB;EACjB,OAAO;EACP,MAAM;EACN,OAAO;EACP,eAAe;EACf,cAAc;EACd,yBAAyB;EACzB,MAAM;EACN,mBAAmB;AACrB;AAEA,IAAa,OAAgB;EAC3B,YAAY;EACZ,YAAY;EACZ,SAAS;EACT,kBAAkB;EAClB,iBAAiB;EACjB,MAAM;EACN,mBAAmB;EACnB,SAAS;EACT,sBAAsB;EACtB,SAAS;EACT,sBAAsB;EACtB,WAAW;EACX,wBAAwB;EACxB,OAAO;EACP,oBAAoB;EACpB,QAAQ;EACR,qBAAqB;EACrB,aAAa;EACb,0BAA0B;EAC1B,SAAS;EACT,sBAAsB;EACtB,SAAS;EACT,sBAAsB;EACtB,MAAM;EACN,mBAAmB;EACnB,WAAW;EACX,wBAAwB;EACxB,QAAQ;EACR,iBAAiB;EACjB,OAAO;EACP,MAAM;EACN,OAAO;EACP,eAAe;EACf,cAAc;EACd,yBAAyB;EACzB,MAAM;EACN,mBAAmB;AACrB;AAEA,IAAa,SAAS;EACpB,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,MAAM;AACR;AAEA,IAAa,SAAS;EACpB,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,OAAO;AACT;AAEA,IAAa,WACX;AACF,IAAa,WACX;AAmEF,IAAa,WAAW;EAAE,MAAM;EAAK,UAAU;EAAK,UAAU;EAAK,MAAM;AAAI;AAC7E,IAAa,SAAS;EACpB,UAAU;EACV,YAAY;EACZ,MAAM;AACR;AAGA,IAAa,YAAY;EAAE,GAAG;EAAQ,GAAG,OAAO;EAAI,GAAG,OAAO;EAAI,GAAG,OAAO;AAAG;AAmB/E,SAAS,SAAS,KAAkB;AAClC,QAAM,IAAI,IAAI,QAAQ,KAAK,EAAE,EAAE,KAAK;AACpC,QAAM,OAAO,EAAE,WAAW,IAAI,CAAC,GAAG,CAAC,EAAE,IAAA,CAAK,MAAM,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC;AAC9E,MAAI,CAAC,iBAAiB,KAAK,IAAI,EAAG,OAAM,IAAI,MAAM,qBAAqB,GAAA,EAAK;AAC5E,SAAO;IAAC;IAAG;IAAG;EAAC,EAAE,IAAA,CAAK,MAAM,SAAS,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAChE;AAEA,IAAM,QAAA,CAAS,QACb,MACA,IACG,IAAA,CAAK,MACJ,KAAK,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,EACrC,SAAS,EAAE,EACX,SAAS,GAAG,GAAG,CACpB,EACC,KAAK,EAAE;AAGZ,SAAgB,IAAI,GAAW,GAAW,GAAmB;AAC3D,QAAM,IAAI,SAAS,CAAC;AACpB,QAAM,IAAI,SAAS,CAAC;AACpB,SAAO,MAAM;IAAC;IAAG;IAAG;EAAC,EAAE,IAAA,CAAK,MAAM,EAAE,CAAA,KAAO,EAAE,CAAA,IAAM,EAAE,CAAA,KAAO,CAAC,CAAQ;AACvE;AAEA,SAAS,UAAU,KAAqB;AACtC,QAAM,IAAI,SAAS,GAAG,EAAE,IAAA,CAAK,MAAM;AACjC,UAAM,IAAI,IAAI;AACd,WAAO,KAAK,UAAU,IAAI,UAAU,IAAI,SAAS,UAAU;EAC7D,CAAC;AACD,SAAO,SAAS,EAAE,CAAA,IAAM,SAAS,EAAE,CAAA,IAAM,SAAS,EAAE,CAAA;AACtD;AAGA,SAAgB,SAAS,GAAW,GAAmB;AACrD,QAAM,CAAC,IAAI,EAAA,IAAM,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,KAAA,CAAM,GAAG,MAAM,IAAI,CAAC;AAClE,UAAQ,KAAK,SAAS,KAAK;AAC7B;AAGA,SAAS,eAAe,OAAe,SAAiB,OAAe,QAAwB;AAC7F,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,OAAO,IAAI,OAAO,IAAK,KAAI,IAAI,GAAG,QAAQ,GAAG;AACnF,SAAO;AACT;AAQA,SAAgB,aAAa,QAAgB,MAAsC;AACjF,QAAM,IAAI,SAAS,SAAS,OAAO;AACnC,QAAM,QAAQ;AAMd,QAAM,SAAS,SAAS,QAAQ,KAAK,KAAK,MAAM,QAAQ;AACxD,QAAM,UACJ,WAAW,QACP,eAAe,QAAQ,OAAO,KAAK,SAAS,IAC5C,eAAe,QAAQ,WAAW,KAAK,KAAK;AAClD,QAAM,QACJ,SAAS,SACL,eAAe,IAAI,QAAQ,OAAO,IAAI,GAAG,EAAE,YAAY,KAAK,KAAK,IACjE,eAAe,QAAQ,EAAE,YAAY,KAAK,SAAS;AACzD,QAAM,aAAa,SAAS,SAAS,IAAI,OAAO,OAAO,IAAI,IAAI,IAAI,OAAO,WAAW,IAAI;AACzF,QAAMA,QAAO,SAAS,SAAS,IAAI,EAAE,YAAY,QAAQ,IAAI,IAAI,IAAI,OAAO,QAAQ,GAAG;AACvF,QAAM,SAAS,SAAS,SAAS,IAAI,QAAQ,OAAO,IAAI,IAAI,IAAI,QAAQ,WAAW,IAAI;AACvF,SAAO;IACL;IACA,sBAAsB;IACtB;IACA,eAAe;IACf,cAAcA;IACd,yBAAyB,eAAe,QAAQA,OAAM,KAAK,SAAS,SAAS,QAAQ,SAAS;IAC9F,QAAQA;IACR,qBAAqB,eAAe,QAAQA,OAAM,KAAK,SAAS,SAAS,QAAQ,SAAS;IAC1F,MAAM;EACR;AACF;;;AD9TA;AAAA,EAEE;AAAA,EACA;AAAA,EACA,QAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAwKC;AAhKD,SAAS,WAAW,OAA+B;AACxD,QAAM,MAAO,MAAM,QAAyC;AAC5D,MAAI,IAAK,QAAO;AAChB,QAAM,IAAI,MAAM;AAChB,QAAM,OAAQ,EAAyC;AAGvD,QAAM,KAAK,MAAM,SAAS,EAAE,WAAW;AACvC,QAAM,KAAK,MAAM,YAAY,EAAE,KAAK;AACpC,QAAM,QAAQ,MAAM,SAAS,EAAE,OAAO;AACtC,QAAM,SAAS,EAAE;AAGjB,QAAM,MAAM,EAAE,SAAS,SAAS,OAAU;AAC1C,SAAO;AAAA,IACL,SAAS;AAAA,MACP,MAAM;AAAA,MACN,QAAQ,MAAM,SAAS,EAAE,WAAW;AAAA,MACpC,QAAQ,MAAM,QAAQ,EAAE,WAAW;AAAA,MACnC,aAAa;AAAA,MACb,kBAAkB,MAAM,cAAc,EAAE,OAAO;AAAA,MAC/C,SAAS,EAAE,WAAW;AAAA,MACtB,UAAU,EAAE,KAAK,GAAG;AAAA,MACpB,oBAAoB,EAAE,KAAK,GAAG;AAAA,IAChC;AAAA,IACA,UAAU;AAAA,MACR,SAAS,MAAM,SAAS,EAAE,WAAW;AAAA,MACrC;AAAA,MACA,aAAa,EAAE,QAAQ;AAAA,MACvB,YAAY;AAAA,MACZ,aAAa,EAAE,KAAK;AAAA,IACtB;AAAA,IACA,SAAS;AAAA,MACP,SAAS;AAAA,MACT,cAAc,MAAM,cAAc,EAAE,OAAO;AAAA,MAC3C,YAAY;AAAA,MACZ,iBAAiB,EAAE,KAAK;AAAA,MACxB,gBAAgB,EAAE,QAAQ;AAAA,MAC1B,mBAAmB,EAAE,QAAQ;AAAA,IAC/B;AAAA,IACA,YAAY,EAAE,SAAS,MAAM,QAAQ,OAAO,QAAQ,YAAY,IAAI,MAAM,EAAE,KAAK,UAAU;AAAA,IAC3F,cAAc;AAAA,MACZ,MAAM,EAAE,SAAS,OAAO,YAAY,IAAI,OAAO;AAAA,MAC/C,WAAW,EAAE,SAAS,eAAe,YAAY,IAAI,QAAQ,cAAc;AAAA,MAC3E;AAAA,MACA,SAAS;AAAA,MACT,MAAM,MAAM,WAAW,EAAE,KAAK;AAAA,MAC9B,MAAM,EAAE,SAAS,EAAE,KAAK,GAAG,GAAG,YAAY,EAAE,KAAK,GAAG,EAAE;AAAA,IACxD;AAAA,IACA,OAAO,EAAE,QAAQ,EAAE,QAAQ,MAAM,MAAM,EAAE,KAAK,WAAW,SAAS,MAAM,EAAE,QAAQ,MAAM,IAAI,EAAE;AAAA,IAC9F,QAAQ,EAAE,QAAQ,EAAE,QAAQ,MAAM,SAAS,MAAM,EAAE,QAAQ,MAAM,IAAI,EAAE;AAAA,IACvE,MAAM,EAAE,SAAS,OAAO,QAAQ,YAAY,GAAG;AAAA,IAC/C,WAAW,EAAE,QAAQ,EAAE,KAAK,MAAM,SAAS,MAAM,EAAE,KAAK,MAAM,GAAG,EAAE;AAAA,IACnE,WAAW,EAAE,SAAS,EAAE,WAAW,OAAO,OAAO;AAAA,IACjD,QAAQ;AAAA,MACN,WAAW,IAAI;AAAA,MACf,cAAc,EAAE,KAAK;AAAA,MACrB,UAAU,EAAE,QAAQ;AAAA,MACpB,WAAW,EAAE,QAAQ;AAAA,MACrB,SAAS,EAAE,KAAK;AAAA,MAChB,WAAW,EAAE,QAAQ;AAAA,MACrB,UAAU,EAAE,QAAQ;AAAA,MACpB,cAAc,EAAE,KAAK;AAAA,MACrB,WAAW,EAAE,QAAQ;AAAA,MACrB,SAAS,EAAE,QAAQ;AAAA,MACnB,QAAQ,EAAE,KAAK;AAAA,MACf,MAAM,EAAE,KAAK;AAAA,MACb,SAAS,EAAE,QAAQ;AAAA,MACnB,SAAS,EAAE,QAAQ;AAAA,MACnB,OAAO,EAAE,MAAM;AAAA,IACjB;AAAA,EACF;AACF;AAGA,IAAM,WAAW,oBAAI,IAAI,CAAC,MAAM,OAAO,MAAM,OAAO,MAAM,QAAQ,KAAK,OAAO,MAAM,MAAM,MAAM,MAAM,OAAO,MAAM,OAAO,QAAQ,KAAK,CAAC;AAGjI,SAAS,YAAY,UAAwB;AAClD,QAAM,MAAM,SAAS,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY,KAAK;AACxD,MAAI,QAAQ,UAAU,QAAQ,UAAU,QAAQ,SAAS,QAAQ,OAAQ,QAAO;AAChF,MAAI,QAAQ,MAAO,QAAO;AAC1B,MAAI,CAAC,OAAO,OAAO,QAAQ,OAAO,QAAQ,OAAO,MAAM,EAAE,SAAS,GAAG,EAAG,QAAO;AAC/E,MAAI,CAAC,OAAO,QAAQ,OAAO,KAAK,EAAE,SAAS,GAAG,EAAG,QAAO;AACxD,MAAI,CAAC,OAAO,MAAM,OAAO,MAAM,KAAK,EAAE,SAAS,GAAG,EAAG,QAAO;AAC5D,MAAI,SAAS,IAAI,GAAG,EAAG,QAAO;AAC9B,MAAI,CAAC,MAAM,OAAO,QAAQ,OAAO,KAAK,EAAE,SAAS,GAAG,EAAG,QAAO;AAC9D,SAAOA;AACT;AAGO,IAAM,WAAW;AAGjB,SAAS,mBAAmB,UAA0B;AAC3D,QAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,SAAO,MAAM,SAAS,KAAK,MAAM,IAAI,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,YAAY,IAAI;AAC5E;AAmBO,IAAM,kBAAkB,MAAM;AAAA,EACnC,SAASC,iBACP,EAAE,YAAY,SAAS,SAAS,cAAc,YAAY,MAAM,UAAU,IAAI,GAAG,KAAK,GACtF,KACA;AACA,UAAM,MAAM,KAAK,IAAI,WAAW,YAAY,UAAU;AACtD,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACC,GAAG;AAAA,QACJ,eAAa;AAAA,QACb,IAAI;AAAA,UACF,CAAC,OAAO;AAAA,YACN,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,GAAG;AAAA,YACH,cAAc;AAAA,YACd,OAAO;AAAA,YACP,SAAS;AAAA,YACT,4BAA4B,EAAE,OAAO,KAAK,IAAI,KAAK,EAAE,GAAG,QAAQ,KAAK,IAAI,KAAK,EAAE,EAAE;AAAA,YAClF,4BAA4B;AAAA,cAC1B,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,SAAS;AAAA,cACT,WAAW,OAAO,aAAa,IAAI,KAAK;AAAA,cACxC,YAAY,EAAE,YAAY,OAAO,CAAC,oBAAoB,YAAY,GAAG;AAAA,gBACnE,UAAU,EAAE,YAAY,SAAS;AAAA,cACnC,CAAC;AAAA,YACH;AAAA,YACA,WAAW,EAAE,SAAS,cAAc;AAAA,YACpC,kCAAkC,EAAE,SAAS,aAAa;AAAA,YAC1D,6CAA6C;AAAA,cAC3C,WAAW,aAAa,EAAE,QAAQ,WAAW,OAAO,eACjD,EAAE,QAAyC,QAAQ,SAAS,eAAe,EAAE,QAAQ,QAAQ,IAChG;AAAA,YACF;AAAA,YACA,kBAAkB,EAAE,SAAS,IAAI;AAAA,UACnC;AAAA,UACA,GAAI,MAAM,QAAQ,EAAE,IAAI,KAAK,KAAK,CAAC,EAAE,IAAI,CAAC;AAAA,QAC5C;AAAA,QAEA,8BAAC,OAAI,WAAU,QAAO,WAAU,yBAAwB,eAAa,OAClE,UACH;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAGO,SAAS,aAAa,OAAc;AACzC,QAAM,IAAI,WAAW,KAAK;AAC1B,SAAO;AAAA,IACL,YAAY,EAAE,QAAQ;AAAA,IACtB,QAAQ,EAAE,aAAa;AAAA,IACvB,MAAM,EAAE,QAAQ;AAAA,IAChB,WAAW,EAAE,QAAQ;AAAA,IACrB,gBAAgB,EAAE,QAAQ;AAAA,IAC1B,UAAU,EAAE,QAAQ;AAAA,EACtB;AACF;AAGO,SAAS,iBAAiB,OAAc;AAC7C,QAAM,IAAI,WAAW,KAAK;AAC1B,SAAO;AAAA,IACL,YAAY,EAAE,QAAQ;AAAA,IACtB,MAAM,EAAE,aAAa,UAAU;AAAA,IAC/B,QAAQ,EAAE,aAAa;AAAA,IACvB,iBAAiB,EAAE,QAAQ;AAAA,IAC3B,aAAa,MAAM,QAAQ;AAAA,EAC7B;AACF;AAGO,SAAS,eAAe,OAAc;AAC3C,QAAM,IAAI,WAAW,KAAK;AAC1B,SAAO;AAAA,IACL,QAAQ,EAAE,aAAa,UAAU;AAAA,IACjC,YAAY,EAAE,aAAa,KAAK;AAAA,IAChC,YAAY,EAAE,OAAO;AAAA,EACvB;AACF;;;AE3OA,SAAS,cAAc;AAoBhB,IAAM,iBAAiB,OAAoB,CAAC,SAAS;AAAA,EAC1D,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,YAAY,CAAC,EAAE,SAAS,OAAO,SAAS,MACtC,IAAI,EAAE,MAAM,MAAM,SAAS,OAAO,OAAO,KAAK,KAAK,YAAY,SAAS,CAAC;AAAA,EAC3E,YAAY,CAAC,YAAY,IAAI,EAAE,QAAQ,CAAC;AAAA,EACxC,UAAU,CAAC,UAAU,IAAI,EAAE,MAAM,CAAC;AAAA,EAClC,OAAO,MAAM,IAAI,EAAE,MAAM,MAAM,CAAC;AAClC,EAAE;;;ACpBF,SAAwB,aAAiC,eAAfC,oBAAgC;AAC1E,SAA0B,eAA8B,iBAAjBC,sBAA0C;AACjF,SAAoB,WAAXC,gBAA8B;AACvC,SAAsB,iBAAyB;AAC/C,SAAoB,eAAuB;AAC3C,SAAqB,gBAAoB;AACzC,SAAyB,oBAAuB;AAChD,SAAmB,UAAVC,eAAgC;AACzC,SAA0B,qBAA4B;AACtD,SAAkB,aAAiB;AACnC,SAAwB,mBAAuB;AAC/C,SAAwB,mBAAsB;AAC9C,SAAwB,mBAAuB;AAC/C,SAAsB,iBAAsB;AAC5C,SAAkB,aAAiB;AACnC,SAAuB,kBAAqB;AAC5C,SAAqB,gBAAoB;AACzC,SAAsB,iBAAqB;AAC3C,SAAiB,YAAgB;AACjC,SAAiB,YAAuB;AACxC,SAAqB,gBAAmB;AACxC,SAAqB,gBAAoB;AACzC,SAAmB,cAA2B;AAC9C,SAAiB,YAAgB;AACjC,SAAuB,kBAAmB;AAC1C,SAAgB,KAAoB,OAAPC,YAA6B;AAC1D,SAAoB,WAAXC,gBAAmC;AAC5C,SAAqB,YAAZC,WAAyC,YAAZA,iBAA+B;AACrE,SAAmB,QAA0B,UAAVC,eAAgC;AACnE,SAAmB,cAAkB;AACrC,SAAuB,kBAAsB;AAC7C,SAAkB,aAAiB;AACnC,SAAkB,aAAkB;AACpC,SAAiB,YAAyB;AAC1C,SAAoB,eAAmB;AACvC,SAAiB,YAAgB;AACjC,SAAiB,MAAkB,QAARC,aAAgC;AAC3D,SAAuB,YAA8B,cAAdC,mBAA4C;AACnF,SAAiB,YAAgB;AACjC,SAAiB,YAAoB;AACrC,SAAiB,YAAgB;AACjC,SAAqB,gBAAsB;AAC3C,SAAyB,cAAgC,gBAAhBC,qBAAkC;AAC3E,SAA0B,eAA+B,iBAAjBC,sBAAiC;AACzE,SAAgB,KAA4B,OAAPC,YAAsB;AAC3D,SAAqB,gBAA0B;AAC/C,SAAkB,aAAoB;AACtC,SAAwB,aAA0B,eAAfC,cAAiD,eAAfA,oBAA2C;AAChH,SAAoB,eAAiB;AACrC,SAAsB,iBAAqB;AAC3C,SAAgB,WAAmB;AACnC,SAAmB,cAA2B;AAC9C,SAAiB,MAAuB,QAARC,aAAoC;AACpE,SAAiB,YAAe;AAChC,SAAuB,kBAAqB;AAC5C,SAAgC,2BAAmB;AACnD,SAA8B,yBAAwB;AACtD,SAAoB,SAAqB,WAAXC,gBAA8B;AAC5D,SAAmB,cAAgC;AACnD,SAAsB,WAA6B,aAAbC,kBAAgC;AACtE,SAAqB,gBAAuB;AAC5C,SAAiB,YAAgB;AACjC,SAAqB,gBAAiC;AACtD,SAAmB,cAAkB;AACrC,SAAiB,YAAgB;AACjC,SAAqB,gBAAoB;AACzC,SAAwB,mBAA2B;AACnD,SAAoB,eAAgB;AACpC,SAAqB,gBAAuB;AAC5C,SAAmB,QAAoB,UAAVC,eAAgC;AAC7D,SAAkB,aAAkB;AACpC,SAAiB,YAAsB;AACvC,SAAmB,QAAsB,UAAVC,eAA6B;AAC5D,SAAiB,YAAkB;AACnC,SAAoB,eAAkC;AACtD,SAAkB,aAAiB;AACnC,SAAqB,gBAAqB;AAC1C,SAAiB,MAA4B,QAARC,OAA6C,QAARA,aAAwB;AAClG,SAAoB,eAAmB;AACvC,SAAmB,cAAiB;AACpC,SAAc,SAAiB;AAC/B,SAAmB,cAAkB;AACrC,SAAoB,eAAmB;;;AChEhC,IAAM,eAAN,MAAM,cAAa;AAAA,EACxB,OAAe;AAAA,EACP,eAA2C;AAAA,EAC3C,iBAAyB;AAAA,EAChB,iBAAiB,IAAI,KAAK;AAAA;AAAA,EAEnC,cAAc;AAAA,EAAC;AAAA,EAEvB,OAAc,cAA4B;AACxC,QAAI,CAAC,cAAa,UAAU;AAC1B,oBAAa,WAAW,IAAI,cAAa;AAAA,IAC3C;AACA,WAAO,cAAa;AAAA,EACtB;AAAA,EAEQ,mBAA2B;AACjC,WAAO,wBAAwB,SAAS,EAAE,UAAU,iBAAiB;AAAA,EACvE;AAAA,EAEQ,QAAQ,MAA4C;AAC1D,QAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C,aAAO;AAAA,IACT;AAEA,UAAM,SAAS;AACf,WAAO,MAAM,QAAQ,OAAO,MAAM,KAChC,OAAO,OAAO,MAAM,CAAC,SAAS,OAAO,SAAS,QAAQ,KACtD,OAAO,OAAO,iBAAiB,YAC/B,OAAO,OAAO,kBAAkB;AAAA,EACpC;AAAA,EAEQ,eAAwB;AAC9B,WAAO,KAAK,iBAAiB,QACrB,KAAK,IAAI,IAAI,KAAK,iBAAkB,KAAK;AAAA,EACnD;AAAA,EAEA,MAAa,uBAAqD;AAEhE,QAAI,KAAK,aAAa,GAAG;AACvB,kBAAY,MAAM,+BAA+B;AACjD,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,aAAa,KAAK,iBAAiB;AACzC,QAAI,CAAC,YAAY;AACf,kBAAY,MAAM,gCAAgC;AAClD,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAGA,UAAM,QAAQ,sBAAsB,SAAS;AAC7C,QAAI,CAAC,OAAO;AACV,kBAAY,KAAK,sDAAsD;AACvE,YAAM,cAAmC;AAAA,QACvC,QAAQ,CAAC;AAAA,QACT,cAAc;AAAA,QACd,eAAe;AAAA,MACjB;AACA,aAAO;AAAA,IACT;AAGA,QAAI,sBAAsB,eAAe,KAAK,GAAG;AAC/C,kBAAY,KAAK,oDAAoD;AACrE,YAAM,cAAmC;AAAA,QACvC,QAAQ,CAAC;AAAA,QACT,cAAc;AAAA,QACd,eAAe;AAAA,MACjB;AACA,aAAO;AAAA,IACT;AAEA,QAAI;AACF,kBAAY,MAAM,2CAA2C;AAE7D,YAAM,WAAW,MAAM,MAAM,GAAG,UAAU,yBAAyB;AAAA,QACjE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,iBAAiB,UAAU,KAAK;AAAA,UAChC,gBAAgB;AAAA,QAClB;AAAA,MACF,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,IAAI,MAAM,iCAAiC,SAAS,MAAM,EAAE;AAAA,MACpE;AAEA,YAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,UAAI,CAAC,KAAK,QAAQ,IAAI,GAAG;AACvB,cAAM,IAAI,MAAM,sCAAsC;AAAA,MACxD;AAGA,WAAK,eAAe;AACpB,WAAK,iBAAiB,KAAK,IAAI;AAE/B,kBAAY,MAAM,qCAAqC,IAAI;AAC3D,aAAO;AAAA,IAET,SAAS,OAAO;AACd,kBAAY,MAAM,gCAAgC,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,CAAC;AAEnH,YAAM,cAAmC;AAAA,QACvC,QAAQ,CAAC;AAAA,QACT,cAAc;AAAA,QACd,eAAe;AAAA,MACjB;AAEA,kBAAY,KAAK,iDAAiD;AAClE,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEO,aAAmB;AACxB,SAAK,eAAe;AACpB,SAAK,iBAAiB;AACtB,gBAAY,MAAM,4BAA4B;AAAA,EAChD;AACF;AAEO,IAAM,eAAe,aAAa,YAAY;;;ACnI9C,IAAM,gBAAgB,CAAC,SAC1B,KAAK,QAAQ,YAAY,EAAE;AAExB,IAAM,gBAAgB,CAAC,SAC1B,KAAK,QAAQ,YAAY,EAAE;AAExB,IAAM,cAAc,CAAC,SACxB,KAAK,QAAQ,uDAAuD,EAAE;AAEnE,IAAM,gBAAgB,CAAC,SAC1B,KAAK,QAAQ,0BAA0B,IAAI;AAExC,IAAM,mBAAmB,CAAC,SAC7B,KAAK,QAAQ,kBAAkB,EAAE;AAE9B,IAAM,sBAAsB,CAAC,SAChC,KAAK,QAAQ,WAAW,GAAG,EAAE,KAAK;AAE/B,IAAM,iBAAiB,CAAC,SAAyB;AACpD,SAAO;AAAA,IACH;AAAA,MACI;AAAA,QACI;AAAA,UACI;AAAA,YACI,cAAc,IAAI;AAAA,UACtB;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AACJ;;;AC9BA,SAAS,cAAAC,aAAY,iBAAiB,eAAe;;;ACArD,SAAS,YAAY,oBAAoB;;;ACAzC,SAAS,UAAAC,eAAc;AAMvB,IAAI,kBAAkB;AAgBf,IAAM,gBAAgBC,QAAmB,CAAC,KAAK,SAAS;AAAA,EAC3D,iBAAiB,CAAC;AAAA,EAClB,eAAe;AAAA,EACf,cAAc;AAAA,EACd,eAAe;AAAA,EACf,WAAW;AAAA,EACX,oBAAoB;AAAA,EACpB,aAAa;AAAA,EAEb,kBAAkB,CAAC,UAAU;AACzB,UAAM,eAAe,IAAI,EAAE;AAC3B,gBAAY,MAAM,0BAA0B;AAAA,MACxC,eAAe;AAAA,MACf,UAAU;AAAA,MACV,UAAU,iBAAiB;AAAA,IAC/B,CAAC;AAGD,QAAI,gBAAgB,iBAAiB,OAAO;AACxC,kBAAY,MAAM,gEAAyD;AAAA,QACvE,MAAM;AAAA,QACN,IAAI;AAAA,MACR,CAAC;AACD,cAAQ;AAAA,IACZ;AAEA,QAAI,EAAE,eAAe,MAAM,CAAC;AAAA,EAChC;AAAA,EAEA,mBAAmB,YAAY;AAC3B,UAAM,QAAQ,IAAI;AAClB,QAAI,MAAM,UAAW;AAErB,QAAI,EAAE,WAAW,MAAM,aAAa,KAAK,CAAC;AAE1C,QAAI;AACA,YAAM,YAAiC,MAAM,aAAa,qBAAqB;AAE/E,YAAM,YAAY,UAAU,OAAO,SAAS;AAC5C,UAAI,qBAAqB,MAAM;AAE/B,UAAI,WAAW;AAEX,YAAI,sBAAsB,UAAU,OAAO,SAAS,kBAAkB,GAAG;AAAA,QAEzE,OAAO;AACH,+BAAqB,UAAU;AAAA,QACnC;AAEA,YAAI;AAAA,UACA,oBAAoB;AAAA,UACpB,iBAAiB,UAAU;AAAA,UAC3B,cAAc,UAAU;AAAA,UACxB,eAAe,UAAU;AAAA,UACzB,eAAe;AAAA,UACf,WAAW;AAAA,QACf,CAAC;AAAA,MACL,OAAO;AACH,YAAI;AAAA,UACA,oBAAoB;AAAA,UACpB,WAAW;AAAA,QACf,CAAC;AAAA,MACL;AAAA,IACJ,SAAS,OAAO;AACZ,kBAAY,MAAM,+BAA+B;AAAA,QAC7C,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAChE,CAAC;AACD,UAAI;AAAA,QACA,oBAAoB;AAAA,QACpB,WAAW;AAAA,MACf,CAAC;AAAA,IACL;AAAA,EACJ;AAAA,EAEA,eAAe,YAAY;AACvB,UAAM,mBAAmB,IAAI,EAAE;AAC/B,iBAAa,WAAW;AACxB,UAAM,IAAI,EAAE,kBAAkB;AAE9B,UAAM,EAAE,gBAAgB,IAAI,IAAI;AAChC,QAAI,oBAAoB,gBAAgB,SAAS,gBAAgB,GAAG;AAChE,UAAI,EAAE,eAAe,iBAAiB,CAAC;AAAA,IAC3C;AAAA,EACJ;AAAA,EAEA,iBAAiB,YAAY;AACzB,UAAM,QAAQ,IAAI;AAClB,QAAI,CAAC,MAAM,eAAe,MAAM,gBAAgB,WAAW,GAAG;AAC1D,kBAAY,MAAM,mCAAmC;AACrD,YAAM,MAAM,kBAAkB;AAAA,IAClC;AAAA,EACJ;AACJ,EAAE;AAGF,IAAI,CAAC,iBAAiB;AAClB,oBAAkB;AAClB,aAAW,MAAM;AACb,gBAAY,MAAM,kCAAkC;AACpD,kBAAc,SAAS,EAAE,gBAAgB,EAAE,MAAM,CAAC,UAAU;AACxD,kBAAY,KAAK,+BAA+B,KAAK;AAAA,IACzD,CAAC;AAAA,EACL,GAAG,GAAI;AACX;;;ADNO,IAAM,wBAAwB,CAAC,WAAmC,CAAC,MAAM;AAC5E,QAAM,QAAQ,sBAAsB,SAAS;AAC7C,MAAI,OAAO;AACP,aAAS,eAAe,IAAI,UAAU,KAAK;AAC3C,WAAO;AAAA,EACX;AACA,cAAY,KAAK,6DAA6D;AAC9E,WAAS,eAAe,IAAI;AAE5B,SAAO;AACX;;;AD3HO,IAAK,WAAL,kBAAKC,cAAL;AACL,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,aAAU;AACV,EAAAA,UAAA,aAAU;AACV,EAAAA,UAAA,YAAS;AACT,EAAAA,UAAA,WAAQ;AALE,SAAAA;AAAA,GAAA;AA0BL,IAAM,qBAAN,MAAM,oBAAmB;AAAA,EAC9B,OAAe;AAAA,EAEP,QAAiC;AAAA,EACjC,YAA2B;AAAA,EAC3B,aAAqC;AAAA;AAAA,EAGrC,gBAAgB,oBAAI,IAA2B;AAAA;AAAA,EAG/C,eAAe,IAAI,gBAA0B,iBAAa;AAAA,EAC1D,kBAAkB,IAAI,QAAqB;AAAA,EAE3C,cAAc;AAAA,EAAC;AAAA,EAEvB,OAAc,cAAkC;AAC9C,QAAI,CAAC,oBAAmB,UAAU;AAChC,0BAAmB,WAAW,IAAI,oBAAmB;AAAA,IACvD;AACA,WAAO,oBAAmB;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKO,kBAA4B;AACjC,WAAO,KAAK,aAAa;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKO,kBAAwC;AAC7C,WAAO,KAAK,aAAa,aAAa;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKO,cAAuC;AAC5C,WAAO,KAAK,gBAAgB,aAAa;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKO,YAAY,MAAc,OAAe,UAAsB,CAAC,GAAqB;AAC1F,WAAO,IAAIC,YAAiB,CAAC,eAAe;AAC1C,WAAK,uBAAuB,MAAM,OAAO,SAAS,UAAU;AAAA,IAC9D,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,uBACZ,MACA,OACA,SACA,YACe;AACf,QAAI;AAEF,WAAK,QAAQ;AAGb,YAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,EAAE,CAAC;AAGpD,WAAK,SAAS,uBAAgB;AAE9B,YAAM,aAAa,wBAAwB,SAAS,EAAE,UAAU;AAChE,UAAI,CAAC,YAAY;AACf,cAAM,IAAI,MAAM,gCAAgC;AAAA,MAClD;AAGA,WAAK,aAAa,IAAI,gBAAgB;AAGtC,YAAM,WAAW,MAAM,MAAM,GAAG,UAAU,QAAQ;AAAA,QAChD,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,GAAG,sBAAsB;AAAA,UACzB,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB,MAAM;AAAA,UACN,WAAW;AAAA,QACb,CAAC;AAAA,QACD,QAAQ,KAAK,WAAW;AAAA,MAC1B,CAAC;AAGD,UAAI,KAAK,WAAW,OAAO,SAAS;AAClC,mBAAW,SAAS;AACpB;AAAA,MACF;AAEA,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,IAAI,MAAM,uBAAuB,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAAA,MACjF;AAGA,YAAM,YAAY,MAAM,SAAS,KAAK;AAGtC,UAAI,KAAK,WAAW,OAAO,SAAS;AAClC,mBAAW,SAAS;AACpB;AAAA,MACF;AAEA,UAAI,CAAC,aAAa,UAAU,SAAS,GAAG;AACtC,cAAM,IAAI,MAAM,+BAA+B;AAAA,MACjD;AAGA,WAAK,YAAY,IAAI,gBAAgB,SAAS;AAC9C,WAAK,QAAQ,IAAI,MAAM,KAAK,SAAS;AAGrC,WAAK,MAAM,WAAW;AACtB,WAAK,MAAM,UAAU;AAGrB,WAAK,oBAAoB,YAAY,OAAO;AAG5C,UAAI,KAAK,WAAW,OAAO,SAAS;AAClC,aAAK,QAAQ;AACb,mBAAW,SAAS;AACpB;AAAA,MACF;AAGA,WAAK,MAAM,KAAK;AAAA,IAElB,SAAS,OAAO;AAEd,UAAI,iBAAiB,SAAS,MAAM,SAAS,cAAc;AACzD,aAAK,SAAS,iBAAa;AAC3B,mBAAW,SAAS;AACpB;AAAA,MACF;AAEA,kBAAY,MAAM,yBAAyB,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,CAAC;AAC5G,WAAK,SAAS,mBAAc;AAC5B,iBAAW,MAAM,KAAK;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,YAA8B,SAA2B;AACnF,QAAI,CAAC,KAAK,MAAO;AAGjB,SAAK,cAAc,MAAM;AAGzB,UAAM,wBAAwB,MAAM;AAElC,UAAI,CAAC,KAAK,SAAS,KAAK,gBAAgB,MAAM,2BAAqB,KAAK,cAAc,KAAK,WAAW,OAAO,SAAU;AACrH;AAAA,MACF;AAEA,WAAK,SAAS,uBAAgB;AAC9B,WAAK,MAAM,KAAK,EAAE,MAAM,CAAC,UAAU;AACjC,oBAAY,MAAM,mCAAmC,KAAK;AAC1D,aAAK,SAAS,mBAAc;AAC5B,mBAAW,MAAM,KAAK;AAAA,MACxB,CAAC;AAAA,IACH;AAGA,UAAM,cAAc,MAAM;AACxB,WAAK,SAAS,uBAAgB;AAC9B,iBAAW,KAAK;AAAA,IAClB;AAGA,UAAM,eAAe,MAAM;AACzB,UAAI,KAAK,gBAAgB,MAAM,mBAAe;AAC5C,aAAK,SAAS,qBAAe;AAAA,MAC/B;AAAA,IACF;AAGA,UAAM,eAAe,MAAM;AACzB,WAAK,SAAS,iBAAa;AAG3B,WAAK,mBAAmB;AAExB,iBAAW,SAAS;AAAA,IACtB;AAGA,UAAM,oBAAoB,MAAM;AAC9B,UAAI,KAAK,SAAS,KAAK,MAAM,UAAU;AACrC,cAAM,WAAW,KAAK,MAAM,SAAS,SAAS,IAAI,KAAK,MAAM,SAAS,IAAI,CAAC,IAAI;AAC/E,cAAM,WAAwB;AAAA,UAC5B,aAAa,KAAK,MAAM;AAAA,UACxB,UAAU,KAAK,MAAM;AAAA,UACrB,YAAa,KAAK,MAAM,cAAc,KAAK,MAAM,WAAY;AAAA,UAC7D;AAAA,UACA,OAAO,KAAK,gBAAgB;AAAA,QAC9B;AACA,aAAK,gBAAgB,KAAK,QAAQ;AAClC,YAAI,QAAQ,YAAY;AACtB,kBAAQ,WAAW,QAAQ;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAGA,UAAM,eAAe,CAAC,UAAiB;AACrC,kBAAY,MAAM,yBAAyB,KAAK;AAChD,WAAK,SAAS,mBAAc;AAC5B,iBAAW,MAAM,IAAI,MAAM,uBAAuB,CAAC;AAAA,IACrD;AAGA,SAAK,cAAc,IAAI,kBAAkB,qBAAqB;AAC9D,SAAK,cAAc,IAAI,QAAQ,WAAW;AAC1C,SAAK,cAAc,IAAI,SAAS,YAAY;AAC5C,SAAK,cAAc,IAAI,SAAS,YAAY;AAC5C,SAAK,cAAc,IAAI,cAAc,iBAAiB;AACtD,SAAK,cAAc,IAAI,SAAS,YAAY;AAG5C,SAAK,MAAM,iBAAiB,kBAAkB,qBAAqB;AACnE,SAAK,MAAM,iBAAiB,QAAQ,WAAW;AAC/C,SAAK,MAAM,iBAAiB,SAAS,YAAY;AACjD,SAAK,MAAM,iBAAiB,SAAS,YAAY;AACjD,SAAK,MAAM,iBAAiB,cAAc,iBAAiB;AAC3D,SAAK,MAAM,iBAAiB,SAAS,YAAY;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKO,OAAa;AAElB,QAAI,KAAK,YAAY;AACnB,WAAK,WAAW,MAAM;AACtB,WAAK,aAAa;AAAA,IACpB;AAGA,QAAI,KAAK,OAAO;AACd,WAAK,MAAM,MAAM;AACjB,WAAK,MAAM,cAAc;AAGzB,WAAK,MAAM,cAAc;AACzB,WAAK,MAAM,mBAAmB;AAC9B,WAAK,MAAM,SAAS;AACpB,WAAK,MAAM,UAAU;AACrB,WAAK,MAAM,UAAU;AACrB,WAAK,MAAM,eAAe;AAC1B,WAAK,MAAM,UAAU;AAAA,IACvB;AAGA,SAAK,SAAS,iBAAa;AAC3B,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKO,QAAc;AACnB,QAAI,KAAK,SAAS,KAAK,gBAAgB,MAAM,yBAAkB;AAC7D,WAAK,MAAM,MAAM;AACjB,WAAK,SAAS,qBAAe;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,SAAe;AACpB,QAAI,KAAK,SAAS,KAAK,gBAAgB,MAAM,uBAAiB;AAC5D,WAAK,MAAM,KAAK,EAAE,MAAM,CAAC,UAAU;AACjC,oBAAY,MAAM,2BAA2B,KAAK;AAClD,aAAK,SAAS,mBAAc;AAAA,MAC9B,CAAC;AACD,WAAK,SAAS,uBAAgB;AAAA,IAChC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAS,OAAuB;AACtC,SAAK,aAAa,KAAK,KAAK;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKO,QAAc;AAEnB,SAAK,KAAK;AAGV,SAAK,QAAQ;AACb,SAAK,YAAY;AACjB,SAAK,aAAa;AAGlB,SAAK,aAAa,KAAK,iBAAa;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAA2B;AACjC,QAAI,KAAK,OAAO;AAEd,iBAAW,CAAC,WAAW,OAAO,KAAK,KAAK,eAAe;AACrD,aAAK,MAAM,oBAAoB,WAAW,OAAO;AAAA,MACnD;AAAA,IACF;AACA,SAAK,cAAc,MAAM;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAgB;AACtB,QAAI,KAAK,OAAO;AAEd,WAAK,mBAAmB;AAGxB,UAAI;AACF,aAAK,MAAM,MAAM;AACjB,aAAK,MAAM,cAAc;AACzB,aAAK,MAAM,MAAM;AACjB,aAAK,MAAM,KAAK;AAAA,MAClB,SAAS,OAAO;AAAA,MAEhB;AAEA,WAAK,QAAQ;AAAA,IACf;AAEA,QAAI,KAAK,WAAW;AAClB,UAAI,gBAAgB,KAAK,SAAS;AAClC,WAAK,YAAY;AAAA,IACnB;AAEA,QAAI,KAAK,YAAY;AACnB,WAAK,WAAW,MAAM;AACtB,WAAK,aAAa;AAAA,IACpB;AAAA,EACF;AACF;AAGO,IAAM,wBAAwB,MAA0B;AAC7D,SAAO,mBAAmB,YAAY;AACxC;AAGO,IAAM,cAAc,CAAC,MAAc,OAAe,YAA2C;AAClG,SAAO,sBAAsB,EAAE,YAAY,MAAM,OAAO,OAAO;AACjE;AAEO,IAAM,UAAU,MAAY;AACjC,wBAAsB,EAAE,KAAK;AAC/B;AAMO,IAAM,WAAW,MAAY;AAClC,wBAAsB,EAAE,MAAM;AAChC;AAEO,IAAM,YAAY,MAAY;AACnC,wBAAsB,EAAE,OAAO;AACjC;AAEO,IAAM,cAAc,MAAgB;AACzC,SAAO,sBAAsB,EAAE,gBAAgB;AACjD;;;AGvaA,SAAS,UAAU,WAAW,aAAa,QAAQ,eAAe;AA0C3D,IAAM,SAAS,MAAoB;AACxC,QAAM,CAAC,OAAO,QAAQ,IAAI,0BAAgC;AAC1D,QAAM,CAAC,UAAU,WAAW,IAAI,SAA6B,IAAI;AACjE,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,IAAI;AAGtD,QAAM,0BAA0B,OAA4B,IAAI;AAChE,QAAM,uBAAuB,OAA4B,IAAI;AAC7D,QAAM,uBAAuB,OAA4B,IAAI;AAC7D,QAAM,mBAAmB,OAAsB,IAAI;AACnD,QAAM,mBAAmB,OAAsB,IAAI;AACnD,QAAM,eAAe,OAAe,CAAC;AAGrC,QAAM,EAAE,eAAe,mBAAmB,IAAI,cAAc;AAC5D,QAAM,EAAE,YAAY,IAAI,oBAAoB;AAC5C,QAAM,EAAE,UAAU,gBAAgB,IAAI,wBAAwB;AAC9D,QAAM,EAAE,cAAc,IAAI,cAAc;AAGxC,QAAM,cAAc,CAAC,EAAE,iBAAiB,iBAAiB,YAAY,cAAc;AAGnF,QAAM,YAAY,QAAQ,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAG3D,YAAU,MAAM;AAEd,QAAI,wBAAwB,SAAS;AACnC,8BAAwB,QAAQ,YAAY;AAAA,IAC9C;AACA,QAAI,qBAAqB,SAAS;AAChC,2BAAqB,QAAQ,YAAY;AAAA,IAC3C;AAGA,4BAAwB,UAAU,UAAU,YAAY,EAAE,UAAU;AAAA,MAClE,MAAM,CAAC,gBAA6B;AAClC,oBAAY,WAAW;AAAA,MACzB;AAAA,MACA,OAAO,CAAC,QAAiB;AACvB,oBAAY,MAAM,mCAAmC,EAAE,OAAO,IAAI,CAAC;AAAA,MACrE;AAAA,IACF,CAAC;AAGD,yBAAqB,UAAU,UAAU,gBAAgB,EAAE,UAAU;AAAA,MACnE,MAAM,CAAC,aAAuB;AAC5B,iBAAS,QAAQ;AAGjB,YAAI,oCAA+B,OAAO;AACxC,mBAAS,IAAI;AAAA,QACf;AAAA,MACF;AAAA,MACA,OAAO,CAAC,QAAiB;AACvB,oBAAY,MAAM,gCAAgC,EAAE,OAAO,IAAI,CAAC;AAAA,MAClE;AAAA,IACF,CAAC;AAGD,WAAO,MAAM;AACX,UAAI,wBAAwB,SAAS;AACnC,gCAAwB,QAAQ,YAAY;AAAA,MAC9C;AACA,UAAI,qBAAqB,SAAS;AAChC,6BAAqB,QAAQ,YAAY;AAAA,MAC3C;AAAA,IACF;AAAA,EACF,GAAG,CAAC,OAAO,SAAS,CAAC;AAGrB,YAAU,MAAM;AAEd,UAAM,gBAAgB,iBAAiB,YAAY,QAC9B,iBAAiB,YAAY;AAClD,UAAM,gBAAgB,iBAAiB,YAAY,QAC9B,iBAAiB,YAAY;AAGlD,QAAI,iBAAiB,eAAe;AAElC,mBAAa;AAGb,UAAI,qBAAqB,SAAS;AAChC,6BAAqB,QAAQ,YAAY;AACzC,6BAAqB,UAAU;AAAA,MACjC;AAGA,UAAI,eAAe;AACjB,kBAAU,MAAM;AAAA,MAClB,OAAO;AAEL,kBAAU,KAAK;AAAA,MACjB;AAEA,gCAAsB;AACtB,eAAS,IAAI;AAGb,uBAAiB,UAAU;AAC3B,uBAAiB,UAAU;AAE3B;AAAA,IACF;AAGA,QAAI,iBAAiB,YAAY,MAAM;AACrC,uBAAiB,UAAU;AAAA,IAC7B;AACA,QAAI,iBAAiB,YAAY,MAAM;AACrC,uBAAiB,UAAU;AAAA,IAC7B;AAAA,EACF,GAAG,CAAC,eAAe,eAAe,SAAS,CAAC;AAG5C,QAAM,QAAQ,YAAY,OAAO,MAAc,UAAsB,CAAC,MAAqB;AACzF,QAAI,CAAC,aAAa;AAChB,YAAM,WAAW;AACjB,eAAS,QAAQ;AACjB,YAAM,IAAI,MAAM,QAAQ;AAAA,IAC1B;AAEA,QAAI,CAAC,MAAM,KAAK,GAAG;AACjB,YAAM,WAAW;AACjB,eAAS,QAAQ;AACjB,YAAM,IAAI,MAAM,QAAQ;AAAA,IAC1B;AAEA,QAAI;AACF,eAAS,IAAI;AAGb,gBAAU,KAAK;AAGf,uBAAiB,UAAU;AAC3B,uBAAiB,UAAU;AAG3B,YAAM,eAAe,cAAc,SAAS,EAAE;AAC9C,YAAM,aAAa,gBAAgB;AACnC,UAAI,CAAC,YAAY;AACf,cAAM,IAAI,MAAM,mBAAmB;AAAA,MACrC;AAEA,UAAI,qBAAqB,SAAS;AAChC,6BAAqB,QAAQ,YAAY;AACzC,6BAAqB,UAAU;AAG/B,cAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,EAAE,CAAC;AAAA,MACtD;AAGA,YAAM,mBAAmB,EAAE,aAAa;AAGxC,sCAAyB;AAGzB,YAAM,aAAyB;AAAA,QAC7B,cAAc;AAAA,QACd,aAAa;AAAA,QACb,GAAG;AAAA,QACH,eAAe,CAAC,aAAuB;AACrC,mBAAS,QAAQ;AACjB,cAAI,QAAQ,eAAe;AACzB,oBAAQ,cAAc,QAAQ;AAAA,UAChC;AAAA,QACF;AAAA,QACA,YAAY,CAAC,gBAA6B;AACxC,sBAAY,WAAW;AACvB,cAAI,QAAQ,YAAY;AACtB,oBAAQ,WAAW,WAAW;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AAEA,kBAAY,MAAM,wBAAwB;AAG1C,2BAAqB,UAAU,UAAU,YAAY,MAAM,YAAY,UAAU,EAAE,UAAU;AAAA,QAC3F,MAAM,MAAM;AAEV,cAAI,qBAAqB,aAAa,SAAS;AAAA,UAE/C;AAAA,QACF;AAAA,QACA,OAAO,CAAC,QAAiB;AAEvB,cAAI,qBAAqB,aAAa,SAAS;AAC7C,kBAAM,eAAe,eAAe,SAAS,IAAI,UAAU,IAAI,UAAU;AACzE,wBAAY,MAAM,uBAAuB,EAAE,OAAO,IAAI,CAAC;AACvD,qBAAS,YAAY;AACrB,wCAAuB;AAAA,UACzB;AAAA,QACF;AAAA,QACA,UAAU,MAAM;AAEd,cAAI,qBAAqB,aAAa,SAAS;AAC7C,sCAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IAEH,SAAS,KAAc;AACrB,YAAM,WAAW,eAAe,SAAS,IAAI,UAAU,IAAI,UAAU;AACrE,eAAS,QAAQ;AACjB,kCAAuB;AACvB,YAAM,eAAe,QAAQ,MAAM,IAAI,MAAM,QAAQ;AAAA,IACvD;AAAA,EACF,GAAG,CAAC,aAAa,eAAe,eAAe,SAAS,CAAC;AAGzD,QAAM,OAAO,YAAY,MAAM;AAC7B,UAAM,mBAAmB,aAAa;AAGtC,8BAAsB;AAGtB,iBAAa;AAGb,QAAI,qBAAqB,SAAS;AAChC,2BAAqB,QAAQ,YAAY;AACzC,2BAAqB,UAAU;AAAA,IACjC;AAGA,cAAU,KAAK;AAGf,aAAS,IAAI;AAAA,EACf,GAAG,CAAC,SAAS,CAAC;AAGd,QAAM,QAAQ,YAAY,MAAM;AAC9B,cAAU,MAAM;AAAA,EAClB,GAAG,CAAC,SAAS,CAAC;AAGd,QAAM,SAAS,YAAY,MAAM;AAC/B,cAAU,OAAO;AAAA,EACnB,GAAG,CAAC,SAAS,CAAC;AAGd,QAAM,YAAY,YAAY,YAA2B;AACvD,QAAI;AAGF,UAAI,UAAU,gBAAgB,6BAAuB;AACnD,kBAAU,OAAO;AAAA,MACnB;AAAA,IACF,SAAS,KAAc;AACrB,YAAM,WAAW,eAAe,SAAS,IAAI,UAAU,IAAI,UAAU;AACrE,eAAS,QAAQ;AACjB,YAAM,eAAe,QAAQ,MAAM,IAAI,MAAM,QAAQ;AAAA,IACvD;AAAA,EACF,GAAG,CAAC,SAAS,CAAC;AAGd,YAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAI,qBAAqB,SAAS;AAChC,6BAAqB,QAAQ,YAAY;AAAA,MAC3C;AACA,UAAI,wBAAwB,SAAS;AACnC,gCAAwB,QAAQ,YAAY;AAAA,MAC9C;AACA,UAAI,qBAAqB,SAAS;AAChC,6BAAqB,QAAQ,YAAY;AAAA,MAC3C;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAGL,YAAU,MAAM;AACd,QAAI,CAAC,gBAAgB,qCAA8B,oCAA6B;AAC9E,WAAK;AAAA,IACP;AAAA,EACF,GAAG,CAAC,aAAa,OAAO,IAAI,CAAC;AAE7B,SAAO;AAAA;AAAA,IAEL,WAAW;AAAA,IACX,UAAU;AAAA,IACV,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAGA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAGA;AAAA,IACA,cAAc;AAAA,EAChB;AACF;AAKO,IAAM,eAAe,MAAM;AAChC,QAAM,UAAU,YAAY,MAAM;AAChC,YAAQ;AAAA,EACV,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL;AAAA,EACF;AACF;;;ACzWA,OAAOC,UAAS,eAAAC,cAAa,aAAAC,YAAW,WAAAC,UAAS,UAAAC,SAAQ,YAAAC,iBAAgB;;;ACAzE,SAAgB,YAAAC,WAAU,aAAAC,kBAAiB;AAC3C;AAAA,EACE,OAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAAC;AAAA,OACK;AAKP,SAAS,SAAAC,QAAO,gBAAgB;AA+QtB,gBAAAC,MA4DF,YA5DE;AAxOV,IAAM,kBAAkB,CAAC,aAAmC;AAC1D,QAAM,MAAM,SAAS,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY,KAAK;AAExD,QAAM,cAA4C;AAAA;AAAA,IAEhD,OAAO,EAAE,MAAMC,UAAkB,UAAU,YAAY,UAAU,MAAM;AAAA,IACvE,OAAO,EAAE,MAAMC,WAAa,UAAU,YAAY,UAAU,OAAO;AAAA,IACnE,QAAQ,EAAE,MAAMA,WAAa,UAAU,YAAY,UAAU,OAAO;AAAA,IACpE,OAAO,EAAE,MAAMA,WAAa,UAAU,WAAW;AAAA,IACjD,OAAO,EAAE,MAAMA,WAAa,UAAU,WAAW;AAAA;AAAA,IAGjD,OAAO,EAAE,MAAMA,WAAiB,UAAU,OAAO;AAAA,IACjD,MAAM,EAAE,MAAMA,WAAiB,UAAU,QAAQ,UAAU,WAAW;AAAA,IACtE,YAAY,EAAE,MAAMA,WAAiB,UAAU,QAAQ,UAAU,WAAW;AAAA;AAAA,IAG5E,MAAM,EAAE,MAAM,MAAU,UAAU,QAAQ,UAAU,aAAa;AAAA,IACjE,OAAO,EAAE,MAAM,MAAU,UAAU,QAAQ,UAAU,QAAQ;AAAA,IAC7D,MAAM,EAAE,MAAM,MAAU,UAAU,QAAQ,UAAU,aAAa;AAAA,IACjE,OAAO,EAAE,MAAM,MAAU,UAAU,QAAQ,UAAU,WAAW;AAAA,IAChE,MAAM,EAAE,MAAM,MAAU,UAAU,QAAQ,UAAU,SAAS;AAAA,IAC7D,QAAQ,EAAE,MAAM,MAAU,UAAU,QAAQ,UAAU,OAAO;AAAA,IAC7D,KAAK,EAAE,MAAM,MAAU,UAAU,QAAQ,UAAU,IAAI;AAAA,IACvD,OAAO,EAAE,MAAM,MAAU,UAAU,QAAQ,UAAU,MAAM;AAAA,IAC3D,MAAM,EAAE,MAAM,MAAU,UAAU,QAAQ,UAAU,KAAK;AAAA,IACzD,MAAM,EAAE,MAAM,MAAU,UAAU,QAAQ,UAAU,KAAK;AAAA,IACzD,MAAM,EAAE,MAAM,MAAU,UAAU,QAAQ,UAAU,OAAO;AAAA,IAC3D,OAAO,EAAE,MAAM,MAAU,UAAU,QAAQ,UAAU,MAAM;AAAA,IAC3D,MAAM,EAAE,MAAM,MAAU,UAAU,QAAQ,UAAU,OAAO;AAAA,IAC3D,MAAM,EAAE,MAAM,MAAU,UAAU,QAAQ,UAAU,SAAS;AAAA,IAC7D,SAAS,EAAE,MAAM,MAAU,UAAU,QAAQ,UAAU,QAAQ;AAAA;AAAA,IAG/D,QAAQ,EAAE,MAAMC,SAAgB,UAAU,QAAQ,UAAU,OAAO;AAAA,IACnE,OAAO,EAAE,MAAMA,SAAgB,UAAU,QAAQ,UAAU,MAAM;AAAA,IACjE,QAAQ,EAAE,MAAMA,SAAgB,UAAU,QAAQ,UAAU,OAAO;AAAA,IACnE,OAAO,EAAE,MAAMA,SAAgB,UAAU,QAAQ,UAAU,OAAO;AAAA,IAClE,OAAO,EAAE,MAAMA,SAAgB,UAAU,QAAQ,UAAU,MAAM;AAAA,EACnE;AAEA,SAAO,YAAY,GAAG,KAAK,EAAE,MAAMD,WAAiB,UAAU,OAAO;AACvE;AAGA,IAAM,iBAAiB,CAAC,KAAmB,oBAAqC;AAC9E,MAAI,mBAAmB,IAAI,OAAO;AAChC,WAAO,IAAI,gBAAgB,eAAe;AAAA,EAC5C;AACA,SAAO;AACT;AAGA,IAAM,iBAAiB,CAAC,UAA0B;AAChD,MAAI,UAAU,EAAG,QAAO;AACxB,QAAM,IAAI;AACV,QAAM,QAAQ,CAAC,KAAK,MAAM,MAAM,IAAI;AACpC,QAAM,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC;AAClD,SAAO,YAAY,QAAQ,KAAK,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,MAAM,MAAM,CAAC;AACxE;AAEA,IAAM,eAA4C,CAAC;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,aAAa;AAAA,EACb,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,wBAAwB;AAAA,EACxB,mBAAmB;AACrB,MAAM;AACJ,QAAM,QAAQ,SAAS;AACvB,QAAM,EAAE,iBAAiB,IAAI,kBAAkB;AAC/C,QAAM,EAAE,oBAAoB,gBAAgB,IAAI,eAAe;AAC/D,QAAM,CAAC,eAAe,gBAAgB,IAAIE,UAAsE,UAAU;AAC1H,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAiB,EAAE;AAG3D,EAAAC,WAAU,MAAM;AACd,UAAM,sBAAsB,YAAY;AACtC,UAAI;AACF,cAAM,WAAW,iBAAiB,GAAG;AAGrC,YAAI,YAAY,CAAC,iBAAiB;AAChC,2BAAiB,gBAAgB;AACjC,0BAAgB,2DAA2D;AAC3E;AAAA,QACF;AAGA,YAAI,UAAU;AACZ,cAAI;AAEF,kBAAM,SAAS,IAAI,SAAS,IAAI;AAGhC,6BAAiB,WAAW;AAAA,UAC9B,SAAS,OAAO;AACd,6BAAiB,aAAa;AAC9B,4BAAgB,6CAA6C;AAAA,UAC/D;AAAA,QACF,OAEK;AACH,cAAI,CAAC,IAAI,WAAW,CAAC,IAAI,SAAS;AAChC,6BAAiB,aAAa;AAC9B,4BAAgB,iCAAiC;AAAA,UACnD,OAAO;AACL,6BAAiB,WAAW;AAAA,UAC9B;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,yBAAiB,aAAa;AAC9B,wBAAgB,mCAAmC;AAAA,MACrD;AAAA,IACF;AAEA,QAAI,uBAAuB;AACzB,0BAAoB;AAAA,IACtB,OAAO;AACL,uBAAiB,WAAW;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,KAAK,uBAAuB,iBAAiB,gBAAgB,CAAC;AAElE,QAAM,WAAW,gBAAgB,IAAI,IAAI;AACzC,QAAM,gBAAgB,SAAS;AAC/B,QAAM,kBAAkB;AACxB,QAAM,cAAc,eAAe,KAAK,eAAe;AACvD,QAAM,cAAc,kBAAkB;AACtC,QAAM,WAAW;AAAA,IACf;AAAA,IACA,SAAS,YAAY,SAAS;AAAA,IAC9B,gBAAgB,IAAI,SAAS,UAAU,KAAK,CAAC;AAAA,EAC/C,EAAE,KAAK,QAAK;AAGZ,MAAI,kBAAkB,iBAAiB,CAAC,kBAAkB;AACxD,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,OAAO,MAAwB;AACpD,MAAE,gBAAgB;AAGlB,QAAI,kBAAkB,aAAa;AACjC,kBAAY,KAAK,4CAA4C,EAAE,eAAe,YAAY,IAAI,GAAG,CAAC;AAClG;AAAA,IACF;AAEA,QAAI;AACF,YAAM,WAAW,iBAAiB,GAAG;AACrC,kBAAY,MAAM,+BAA+B,EAAE,MAAM,IAAI,MAAM,SAAS,CAAC;AAE7E,UAAI,UAAU;AACZ,cAAM,SAAS,IAAI,SAAS,IAAI;AAChC,oBAAY,MAAM,+BAA+B,EAAE,QAAQ,MAAM,IAAI,KAAK,CAAC;AAC3E,cAAM,mBAAmB,QAAQ,IAAI,IAAI;AAAA,MAC3C,OAAO;AACL,YAAI,IAAI,SAAS;AACf,sBAAY,MAAM,4CAA4C,EAAE,MAAM,IAAI,KAAK,CAAC;AAChF,gBAAM,eAAe,KAAK,IAAI,OAAO;AACrC,gBAAM,QAAQ,IAAI,WAAW,aAAa,MAAM;AAChD,mBAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC5C,kBAAM,CAAC,IAAI,aAAa,WAAW,CAAC;AAAA,UACtC;AACA,gBAAM,WAAW,IAAI,QAAQ,IAAI,YAAY;AAC7C,gBAAM,OAAO,IAAI,KAAK,CAAC,KAAK,GAAG,EAAE,MAAM,SAAS,CAAC;AACjD,gBAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,gBAAM,OAAO,SAAS,cAAc,GAAG;AACvC,eAAK,OAAO;AACZ,eAAK,WAAW,IAAI;AACpB,mBAAS,KAAK,YAAY,IAAI;AAC9B,eAAK,MAAM;AACX,mBAAS,KAAK,YAAY,IAAI;AAC9B,cAAI,gBAAgB,GAAG;AAAA,QACzB,OAAO;AACL,sBAAY,MAAM,oDAAoD,EAAE,MAAM,IAAI,KAAK,CAAC;AACxF,gBAAM,UAAU,IAAI,WAAW;AAC/B,gBAAM,WAAW,IAAI,QAAQ,IAAI,YAAY;AAC7C,gBAAM,OAAO,IAAI,KAAK,CAAC,OAAO,GAAG,EAAE,MAAM,SAAS,CAAC;AACnD,gBAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,gBAAM,OAAO,SAAS,cAAc,GAAG;AACvC,eAAK,OAAO;AACZ,eAAK,WAAW,IAAI;AACpB,mBAAS,KAAK,YAAY,IAAI;AAC9B,eAAK,MAAM;AACX,mBAAS,KAAK,YAAY,IAAI;AAC9B,cAAI,gBAAgB,GAAG;AAAA,QACzB;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,kBAAY,MAAM,gCAAgC,EAAE,OAAO,YAAY,IAAI,IAAI,MAAM,IAAI,KAAK,CAAC;AAAA,IACjG;AAAA,EACF;AAEA,QAAM,kBAAkB,CAAC,MAAwB;AAE/C,QAAI,kBAAkB,aAAa;AACjC,QAAE,gBAAgB;AAClB;AAAA,IACF;AAEA,QAAI,EAAE,WAAW,EAAE,SAAS;AAC1B,iBAAW,IAAI,EAAE;AAAA,IACnB,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAGA,QAAM,sBAAsB,MAAM;AAChC,QAAI,YAAa,QAAO,CAAC;AACzB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,eAAe,kBAAkB,aAAa,SAAS;AAAA,IACzD;AAAA,EACF;AAGA,QAAM,qBAAqB,MAAM;AAC/B,QAAI,eAAe,kBAAkB,WAAY,QAAO;AAExD,UAAM,YAAY,kBAAkB,mBAAmB,WAAe;AAEtE,WACE,gBAAAC,KAACC,MAAA,EAAI,IAAI,EAAE,UAAU,YAAY,KAAK,GAAG,OAAO,GAAG,QAAQ,EAAE,GAC3D,0BAAAD,KAAC,WAAQ,OAAO,cAAc,OAAK,MACjC,0BAAAA,KAAC,aAAU,IAAI,EAAE,UAAU,YAAY,SAAS,KAAK,IAAI,OAAO,aAAa,GAAG,GAClF,GACF;AAAA,EAEJ;AAEA,QAAM,kBAAkBE,OAAM,MAAM,QAAQ,QAAQ,MAAM,IAAI;AAC9D,QAAM,iBAAiB,MAAM,QAAQ,QAAQ,QAAQ,UAAU,MAAM,QAAQ,OAAO;AAEpF,QAAM,eAAe,EAAE,OAAO,EAAE,IAAI,IAAI,IAAI,GAAG,GAAG,QAAQ,EAAE,IAAI,IAAI,IAAI,GAAG,EAAE;AAE7E,MAAI,YAAY,QAAQ;AACtB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,IAAI;AAAA,UACF,UAAU;AAAA,UACV,GAAG;AAAA,UACH,aAAa,aAAa,iBAAiB;AAAA,UAC3C,SAAS,aAAa,kBAAkB;AAAA,UACxC,OAAO;AAAA,UACP,UAAU;AAAA,UACV,WAAW;AAAA,UACX,SAAS;AAAA,UACT,eAAe;AAAA,UACf,YAAY;AAAA,UACZ,gBAAgB;AAAA,UAChB,WAAW;AAAA,UACX,QAAQ,cAAc,YAAY;AAAA,UAClC,YAAY,MAAM,YAAY,OAAO,CAAC,gBAAgB,kBAAkB,CAAC;AAAA,UACzE,WAAW,cAAc;AAAA,YACvB,aAAa;AAAA,UACf,IAAI,CAAC;AAAA,UACL,GAAG,oBAAoB;AAAA,QACzB;AAAA,QACA,SAAS;AAAA,QAER;AAAA,6BAAmB;AAAA,UAEpB,gBAAAF,KAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,gBAAgB,UAAU,IAAI,EAAE,GAChF,0BAAAD,KAAC,iBAAc,IAAI,EAAE,UAAU,IAAI,OAAO,iBAAiB,GAAG,GAChE;AAAA,UAEA,gBAAAA,KAAC,WAAQ,OAAO,IAAI,MAAM,OAAK,MAC7B,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,IAAI;AAAA,gBACF,SAAS;AAAA,gBACT,OAAO;AAAA,gBACP,YAAY;AAAA,gBACZ,YAAY;AAAA,gBACZ,UAAU;AAAA,gBACV,cAAc;AAAA,gBACd,OAAO;AAAA,cACT;AAAA,cAEC,cAAI;AAAA;AAAA,UACP,GACF;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,OAAM;AAAA,cACN,IAAI,EAAE,SAAS,SAAS,OAAO,QAAQ,IAAI,GAAG,YAAY,UAAU,UAAU,UAAU,cAAc,WAAW;AAAA,cAEhH;AAAA;AAAA,gBAAY;AAAA,gBAAI,SAAS;AAAA;AAAA;AAAA,UAC5B;AAAA,UAEA,qBAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,KAAK,IAAI,GACnC;AAAA,4BAAAD,KAAC,WAAQ,OAAO,cAAc,SAAS,0BACrC,0BAAAA,KAAC,UACC,0BAAAA;AAAA,cAACG;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,cAAY,QAAQ,IAAI,IAAI;AAAA,gBAC5B,UAAU,CAAC;AAAA,gBACX,IAAI;AAAA,gBACJ,SAAS,CAAC,MAAM;AACd,oBAAE,gBAAgB;AAClB,sBAAI,YAAa,QAAO;AAAA,gBAC1B;AAAA,gBAEA,0BAAAH,KAAC,UAAW,UAAS,SAAQ;AAAA;AAAA,YAC/B,GACF,GACF;AAAA,YACA,gBAAAA,KAAC,WAAQ,OAAO,cAAc,aAAa,cACzC,0BAAAA,KAAC,UACC,0BAAAA;AAAA,cAACG;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,cAAY,YAAY,IAAI,IAAI;AAAA,gBAChC,UAAU,CAAC;AAAA,gBACX,IAAI;AAAA,gBACJ,SAAS;AAAA,gBAET,0BAAAH,KAAC,YAAa,UAAS,SAAQ;AAAA;AAAA,YACjC,GACF,GACF;AAAA,aACF;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AAGA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,IAAI;AAAA,QACF,UAAU;AAAA,QACV,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,QAAQ,cAAc,YAAY;AAAA,QAClC,YAAY,MAAM,YAAY,OAAO,CAAC,gBAAgB,oBAAoB,WAAW,WAAW,CAAC;AAAA,QACjG,aAAa,aAAa,iBAAiB;AAAA,QAC3C,SAAS,aAAa,kBAAkB;AAAA,QACxC,WAAW,cAAc,EAAE,aAAa,aAAa,iBAAiB,iBAAiB,IAAI,CAAC;AAAA,QAC5F,SAAS;AAAA,QACT,eAAe;AAAA,QACf,SAAS,aAAa,MAAM;AAAA,QAC5B,WAAW,aAAa,gBAAgB;AAAA,QACxC,GAAG,oBAAoB;AAAA,MACzB;AAAA,MACA,SAAS;AAAA,MAER;AAAA,2BAAmB;AAAA,QAEpB;AAAA,UAAC;AAAA;AAAA,YACC,IAAI;AAAA,cACF,GAAG;AAAA,cACH,gBAAgB,EAAE,IAAI,EAAE;AAAA,cACxB,MAAM;AAAA,cACN,SAAS;AAAA,cACT,eAAe;AAAA,cACf,UAAU;AAAA,YACZ;AAAA,YAGA;AAAA,mCAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,gBAAgB,iBAAiB,YAAY,UAAU,IAAI,GAAG,WAAW,GAAG,GACtG;AAAA,gCAAAD,KAAC,iBAAc,IAAI,EAAE,UAAU,IAAI,OAAO,kBAAkB,YAAY,EAAE,GAAG;AAAA,gBAC5E,iBACC,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS;AAAA,oBACT,WAAW,EAAE,OAAO,EAAE,cAAc,UAAU,IAAI,IAAI,GAAG,EAAE;AAAA,oBAC3D,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,oBAClC,UAAU,MAAM,WAAW,IAAI,EAAE;AAAA,oBACjC,IAAI,EAAE,GAAG,cAAc,IAAI,MAAM;AAAA;AAAA,gBACnC;AAAA,iBAEJ;AAAA,cAGC,eACC,gBAAAA;AAAA,gBAACC;AAAA,gBAAA;AAAA,kBACC,IAAI;AAAA,oBACF,IAAI;AAAA,oBACJ,IAAI;AAAA,oBACJ,IAAI;AAAA,oBACJ,SAAS;AAAA,oBACT,UAAU;AAAA,oBACV,QAAQ;AAAA,kBACV;AAAA,kBAEC,cAAI,WAAW,IAAI,QAAQ,SAAS,IACnC;AAAA,oBAAC;AAAA;AAAA,sBACC,SAAQ;AAAA,sBACR,IAAI;AAAA,wBACF,SAAS;AAAA,wBACT,iBAAiB;AAAA,wBACjB,iBAAiB;AAAA,wBACjB,UAAU;AAAA,wBACV,OAAO;AAAA,wBACP,YAAY;AAAA,wBACZ,WAAW;AAAA,sBACb;AAAA,sBAEC;AAAA,4BAAI,QAAQ,UAAU,GAAG,GAAG;AAAA,wBAAE;AAAA;AAAA;AAAA,kBACjC,IAEA,qBAACA,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,MAAM,QAAQ,QAAQ,OAAO,gBAAgB,GAClG;AAAA,oCAAAD,KAAC,QAAS,IAAI,EAAE,UAAU,GAAG,GAAG;AAAA,oBAChC,gBAAAA,KAAC,cAAW,SAAQ,WAAU,OAAM,iBAAgB,kCAEpD;AAAA,qBACF;AAAA;AAAA,cAEJ;AAAA,cAIF,gBAAAA,KAAC,WAAQ,OAAO,IAAI,MAAM,OAAK,MAC7B,0BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,IAAI;AAAA,oBACF,YAAY;AAAA,oBACZ,YAAY;AAAA,oBACZ,UAAU;AAAA,oBACV,cAAc;AAAA,oBACd,OAAO;AAAA,kBACT;AAAA,kBAEC,cAAI;AAAA;AAAA,cACP,GACF;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,OAAM;AAAA,kBACN,IAAI,EAAE,SAAS,SAAS,YAAY,UAAU,UAAU,UAAU,cAAc,WAAW;AAAA,kBAE1F;AAAA;AAAA,cACH;AAAA,cAGC,CAAC,eAAe,kBAAkB,cACjC,gBAAAA,KAAC,cAAW,SAAQ,WAAU,OAAM,gBAAe,IAAI,EAAE,SAAS,SAAS,IAAI,IAAI,GAChF,wBACH;AAAA,cAIF,qBAACC,MAAA,EAAI,IAAI,EAAE,IAAI,QAAQ,IAAI,GAAG,SAAS,QAAQ,gBAAgB,YAAY,YAAY,UAAU,KAAK,MAAM,IAAI,MAAM,GACpH;AAAA,gCAAAD,KAAC,WAAQ,OAAO,cAAc,aAAa,eACzC,0BAAAA,KAAC,UACC,0BAAAA;AAAA,kBAACG;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,cAAY,YAAY,IAAI,IAAI;AAAA,oBAChC,UAAU,CAAC;AAAA,oBACX,SAAS;AAAA,oBACT,IAAI,EAAE,GAAG,cAAc,OAAO,iBAAiB;AAAA,oBAE/C,0BAAAH,KAAC,YAAa,UAAS,SAAQ;AAAA;AAAA,gBACjC,GACF,GACF;AAAA,gBACC,cACC,gBAAAA,KAAC,WAAQ,OAAM,UACb,0BAAAA;AAAA,kBAACG;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,OAAM;AAAA,oBACN,cAAY,UAAU,IAAI,IAAI;AAAA,oBAC9B,SAAS,CAAC,MAAM;AACd,wBAAE,gBAAgB;AAClB,iCAAW,IAAI,EAAE;AAAA,oBACnB;AAAA,oBACA,IAAI;AAAA,oBAEJ,0BAAAH,KAAC,SAAW,UAAS,SAAQ;AAAA;AAAA,gBAC/B,GACF;AAAA,iBAEJ;AAAA;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,uBAAQ;;;AC7hBf,SAAgB,eAAAI,cAAa,aAAAC,YAAW,WAAAC,UAAS,UAAAC,SAAQ,YAAAC,iBAAgB;AACzE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC;AAAA,EACA,OAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAAC;AAAA,EACA,YAAAC;AAAA,EACA;AAAA,OACK;AAIP,YAAY,cAAc;;;ACrB1B,SAAS,sBAAsB;AAE/B,OAAO,gBAAgB;AACvB,OAAO,gBAAgB;AACvB,OAAO,UAAU;AACjB,OAAO,UAAU;AACjB,OAAO,WAAW;AAClB,OAAO,UAAU;AACjB,OAAO,YAAY;AACnB,OAAO,SAAS;AAChB,OAAO,SAAS;AAChB,OAAO,cAAc;AACrB,OAAO,SAAS;AAChB,OAAO,UAAU;AACjB,OAAO,YAAY;AACnB,OAAO,SAAS;AAChB,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,YAAY;AACnB,OAAO,WAAW;AAClB,OAAO,WAAW;AAClB,OAAO,UAAU;AACjB,OAAO,SAAS;AAChB,OAAO,gBAAgB;AAEvB,IAAM,WAAW,eAAe;AAKhC,IAAM,aAAa,CAAC,aAClB;AAEF,IAAM,gBAAkD;AAAA,EACtD,YAAY,WAAW,UAAU;AAAA,EACjC,IAAI,WAAW,UAAU;AAAA,EACzB,KAAK,WAAW,UAAU;AAAA,EAC1B,YAAY,WAAW,UAAU;AAAA,EACjC,IAAI,WAAW,UAAU;AAAA,EACzB,KAAK,WAAW,UAAU;AAAA,EAC1B,MAAM,WAAW,IAAI;AAAA,EACrB,MAAM,WAAW,IAAI;AAAA,EACrB,OAAO,WAAW,KAAK;AAAA,EACvB,IAAI,WAAW,KAAK;AAAA,EACpB,MAAM,WAAW,IAAI;AAAA,EACrB,KAAK,WAAW,IAAI;AAAA,EACpB,QAAQ,WAAW,MAAM;AAAA,EACzB,IAAI,WAAW,MAAM;AAAA,EACrB,KAAK,WAAW,GAAG;AAAA,EACnB,MAAM,WAAW,GAAG;AAAA,EACpB,KAAK,WAAW,GAAG;AAAA,EACnB,UAAU,WAAW,QAAQ;AAAA,EAC7B,IAAI,WAAW,QAAQ;AAAA,EACvB,KAAK,WAAW,GAAG;AAAA,EACnB,MAAM,WAAW,IAAI;AAAA,EACrB,QAAQ,WAAW,MAAM;AAAA,EACzB,IAAI,WAAW,MAAM;AAAA,EACrB,KAAK,WAAW,GAAG;AAAA,EACnB,GAAG,WAAW,GAAG;AAAA,EACjB,GAAG,WAAW,GAAG;AAAA,EACjB,IAAI,WAAW,EAAE;AAAA,EACjB,MAAM,WAAW,IAAI;AAAA,EACrB,IAAI,WAAW,IAAI;AAAA,EACnB,QAAQ,WAAW,MAAM;AAAA,EACzB,IAAI,WAAW,MAAM;AAAA,EACrB,OAAO,WAAW,KAAK;AAAA,EACvB,OAAO,WAAW,KAAK;AAAA,EACvB,MAAM,WAAW,IAAI;AAAA,EACrB,IAAI,WAAW,IAAI;AAAA,EACnB,KAAK,WAAW,GAAG;AAAA,EACnB,YAAY,WAAW,UAAU;AAAA,EACjC,KAAK,WAAW,UAAU;AAC5B;AAEA,OAAO,QAAQ,aAAa,EAAE,QAAQ,CAAC,CAAC,MAAM,QAAQ,MAAM;AAC1D,MAAI,CAAC,SAAS,cAAc,EAAE,SAAS,IAAI,GAAG;AAC5C,aAAS,SAAS,MAAM,QAAQ;AAAA,EAClC;AACF,CAAC;AAEM,SAAS,iBAAiB,MAAc,UAAmB;AAChE,QAAM,OAAO,UAAU,YAAY;AACnC,MAAI,QAAQ,SAAS,cAAc,EAAE,SAAS,IAAI,GAAG;AACnD,WAAO,SAAS,UAAU,MAAM,IAAI;AAAA,EACtC;AACA,SAAO,SAAS,cAAc,IAAI;AACpC;;;ACtFA,OAAOC,YAAW;AAClB,SAAS,OAAAC,YAAW;AAEpB,SAAS,qBAAqB;AAiE1B,SACE,OAAAC,MADF,QAAAC,aAAA;AA/DG,IAAM,0BAA0B,MAAM;AAK3C,QAAM,SAAyD;AAAA,IAC7D,GAAG;AAAA,IACH,YAAY,OAAO;AAAA,MACjB,OAAO,QAAQ,cAAc,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AAAA,IACxF;AAAA,EACF;AACA,SAAO,WAAW,MAAM;AAAA,IACtB,oBAAI,IAAI,CAAC,GAAI,OAAO,YAAY,CAAC,GAAI,QAAQ,OAAO,KAAK,CAAC;AAAA,EAC5D;AACA,SAAO,aAAa;AAAA,IAClB,GAAI,OAAO,cAAc,CAAC;AAAA,IAC1B,KAAK,MAAM;AAAA,MACT,oBAAI,IAAI,CAAC,GAAI,OAAO,aAAa,GAAG,KAAK,CAAC,GAAI,aAAa,MAAM,OAAO,CAAC;AAAA,IAC3E;AAAA,IACA,MAAM,MAAM;AAAA,MACV,oBAAI,IAAI;AAAA,QACN,GAAI,OAAO,YAAY,QAAQ,CAAC;AAAA,QAChC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,MAAM,MAAM;AAAA,MACV,oBAAI,IAAI;AAAA,QACN,GAAI,OAAO,YAAY,QAAQ,CAAC;AAAA,QAChC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,KAAK,MAAM;AAAA,MACT,oBAAI,IAAI,CAAC,GAAI,OAAO,YAAY,OAAO,CAAC,GAAI,aAAa,SAAS,IAAI,CAAC;AAAA,IACzE;AAAA,IACA,KAAK,MAAM;AAAA,MACT,oBAAI,IAAI,CAAC,GAAI,OAAO,YAAY,OAAO,CAAC,GAAI,aAAa,SAAS,IAAI,CAAC;AAAA,IACzE;AAAA,IACA,GAAG,MAAM;AAAA,MACP,oBAAI,IAAI,CAAC,GAAI,OAAO,YAAY,KAAK,CAAC,GAAI,aAAa,SAAS,IAAI,CAAC;AAAA,IACvE;AAAA,EACF;AACA,SAAO,gBAAgB;AACvB,SAAO,gBAAgB;AACvB,SAAO,QAAQ,CAAC,UAAU,OAAO;AACjC,SAAO;AACT,GAAG;AASI,IAAM,gBAAiE,CAAC,EAAE,KAAK,IAAI,MAAM;AAC9F,MAAI,CAAC,IAAK,QAAO;AACjB,SACE,gBAAAC,MAACC,MAAA,EAAI,WAAU,QAAO,IAAI,EAAE,SAAS,SAAS,IAAI,EAAE,GAClD;AAAA,oBAAAC;AAAA,MAACD;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV;AAAA,QACA,KAAK,OAAO;AAAA,QACZ,SAAQ;AAAA,QACR,IAAI;AAAA,UACF,SAAS;AAAA,UACT,UAAU;AAAA,UACV,WAAW;AAAA,UACX,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,QAAQ;AAAA,UACR,aAAa;AAAA,QACf;AAAA;AAAA,IACF;AAAA,IACA,gBAAAC;AAAA,MAACD;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,MAAM;AAAA,QACN,UAAQ;AAAA,QACR,QAAO;AAAA,QACP,KAAI;AAAA,QACJ,IAAI;AAAA,UACF,SAAS;AAAA,UACT,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,gBAAgB;AAAA,UAChB,WAAW,EAAE,gBAAgB,YAAY;AAAA,QAC3C;AAAA,QACD;AAAA;AAAA,IAED;AAAA,KACF;AAEJ;AAEO,IAAM,yBAAyB,CACpC,OACA,cAEA,MAAM,IAAI,CAAC,MAAM,UAAU;AACzB,MAAI,KAAK,SAAS,QAAQ;AACxB,WAAO,KAAK;AAAA,EACd;AAEA,MAAI,KAAK,SAAS,WAAW;AAC3B,UAAM,MAAM,GAAG,SAAS,IAAI,KAAK;AACjC,UAAM,EAAE,SAAS,aAAa,CAAC,GAAG,WAAW,CAAC,EAAE,IAAI;AACpD,UAAM,aAAsC,EAAE,IAAI;AAElD,WAAO,QAAQ,UAAU,EAAE,QAAQ,CAAC,CAAC,SAAS,KAAK,MAAM;AACvD,UAAI,YAAY,eAAe,MAAM,QAAQ,KAAK,GAAG;AACnD,mBAAW,YAAY,MAAM,KAAK,GAAG;AAAA,MACvC,WAAW,UAAU,QAAQ,UAAU,QAAW;AAChD,mBAAW,OAAO,IAAI;AAAA,MACxB;AAAA,IACF,CAAC;AAED,WAAOE,OAAM;AAAA,MACX;AAAA,MACA;AAAA,MACA,uBAAuB,UAAmC,GAAG;AAAA,IAC/D;AAAA,EACF;AAEA,SAAO;AACT,CAAC;;;AFqXmB,SA+ER,UAlEU,OAAAC,MAbF,QAAAC,aAAA;AA/ctB,IAAMC,mBAAkB,CAAC,aAAmC;AAC1D,QAAM,MAAM,SAAS,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY,KAAK;AAExD,QAAM,cAA4C;AAAA;AAAA,IAEhD,OAAO,EAAE,MAAMC,UAAkB,OAAO,WAAW,UAAU,WAAW;AAAA,IACxE,OAAO,EAAE,MAAMC,WAAa,OAAO,WAAW,UAAU,WAAW;AAAA,IACnE,QAAQ,EAAE,MAAMA,WAAa,OAAO,WAAW,UAAU,WAAW;AAAA,IACpE,OAAO,EAAE,MAAMA,WAAa,OAAO,WAAW,UAAU,WAAW;AAAA,IACnE,OAAO,EAAE,MAAMA,WAAa,OAAO,WAAW,UAAU,WAAW;AAAA;AAAA,IAGnE,OAAO,EAAE,MAAMA,WAAiB,OAAO,WAAW,UAAU,OAAO;AAAA,IACnE,MAAM,EAAE,MAAMA,WAAiB,OAAO,WAAW,UAAU,QAAQ,UAAU,WAAW;AAAA,IACxF,YAAY,EAAE,MAAMA,WAAiB,OAAO,WAAW,UAAU,QAAQ,UAAU,WAAW;AAAA;AAAA,IAG9F,MAAM,EAAE,MAAM,MAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,aAAa;AAAA,IACnF,OAAO,EAAE,MAAM,MAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,aAAa;AAAA,IACpF,MAAM,EAAE,MAAM,MAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,aAAa;AAAA,IACnF,OAAO,EAAE,MAAM,MAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,aAAa;AAAA,IACpF,QAAQ,EAAE,MAAM,MAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,OAAO;AAAA,IAC/E,OAAO,EAAE,MAAM,MAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,MAAM;AAAA,IAC7E,QAAQ,EAAE,MAAM,MAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,OAAO;AAAA,IAC/E,QAAQ,EAAE,MAAM,MAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,OAAO;AAAA,IAC/E,OAAO,EAAE,MAAM,MAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,MAAM;AAAA;AAAA,IAG7E,KAAK,EAAE,MAAM,MAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,IAAI;AAAA,IACzE,OAAO,EAAE,MAAM,MAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,MAAM;AAAA,IAC7E,MAAM,EAAE,MAAM,MAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,KAAK;AAAA,IAC3E,QAAQ,EAAE,MAAM,MAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,OAAO;AAAA,IAC/E,MAAM,EAAE,MAAM,MAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,SAAS;AAAA,IAC/E,MAAM,EAAE,MAAM,MAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,KAAK;AAAA,IAC3E,MAAM,EAAE,MAAM,MAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,OAAO;AAAA,IAC7E,MAAM,EAAE,MAAM,MAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,SAAS;AAAA,IAC/E,SAAS,EAAE,MAAM,MAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,QAAQ;AAAA,IACjF,SAAS,EAAE,MAAM,MAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,QAAQ;AAAA,IACjF,MAAM,EAAE,MAAM,MAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,OAAO;AAAA;AAAA,IAG7E,MAAM,EAAE,MAAM,MAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,QAAQ;AAAA,IAC9E,QAAQ,EAAE,MAAM,MAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,OAAO;AAAA,IAC/E,OAAO,EAAE,MAAM,MAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,QAAQ;AAAA,IAC/E,OAAO,EAAE,MAAM,MAAU,OAAO,WAAW,UAAU,QAAQ,UAAU,aAAa;AAAA;AAAA,IAGpF,QAAQ,EAAE,MAAMC,SAAgB,OAAO,WAAW,UAAU,QAAQ,UAAU,OAAO;AAAA,IACrF,OAAO,EAAE,MAAMA,SAAgB,OAAO,WAAW,UAAU,QAAQ,UAAU,MAAM;AAAA,IACnF,QAAQ,EAAE,MAAMA,SAAgB,OAAO,WAAW,UAAU,QAAQ,UAAU,OAAO;AAAA,IACrF,OAAO,EAAE,MAAMA,SAAgB,OAAO,WAAW,UAAU,QAAQ,UAAU,OAAO;AAAA,IACpF,OAAO,EAAE,MAAMA,SAAgB,OAAO,WAAW,UAAU,QAAQ,UAAU,MAAM;AAAA,EACrF;AAEA,SAAO,YAAY,GAAG,KAAK,EAAE,MAAMD,WAAiB,OAAO,QAAQ,UAAU,QAAQ;AACvF;AAEA,IAAM,QAAQ,CAAC,aAA8B,SAAS,YAAY,EAAE,SAAS,MAAM;AAEnF,IAAM,eAAuC;AAAA;AAAA,EAE3C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA;AAAA,EAGR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA;AAAA,EAGP,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO;AAAA;AAAA,EAGP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA;AAAA,EAGP,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,OAAO;AAAA;AAAA,EAGP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,cAAc;AAAA;AAAA,EAGd,KAAK;AAAA,EACL,UAAU;AAAA,EACV,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AACR;AAEA,IAAM,0BAA0B,CAAC,aAA6B;AAC5D,QAAM,MAAM,SAAS,YAAY,EAAE,MAAM,GAAG,EAAE,IAAI,KAAK;AACvD,SAAO,aAAa,GAAG,KAAK;AAC9B;AAEA,IAAM,aAAa,CAAC,aAA8B,wBAAwB,QAAQ,MAAM;AAExF,IAAM,oBAAoB,CAAC,YAA4B;AACrD,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,WAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,EACvC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,IAAM,sBAAsB,CAAC,SAAiB,aAA6B;AACzE,QAAM,MAAM,SAAS,YAAY,EAAE,MAAM,GAAG,EAAE,IAAI,KAAK;AAEvD,MAAI,QAAQ,QAAQ;AAClB,WAAO,kBAAkB,OAAO;AAAA,EAClC;AAEA,SAAO;AACT;AASA,IAAM,qBAAsC,CAAC,EAAE,MAAM,SAAS,KAAK,mBAAmB,MAAM,MAAM;AAChG,QAAM,CAAC,aAAa,cAAc,IAAIE,UAAiB,EAAE;AACzD,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AACtD,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAkC,IAAI;AAC5E,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,CAAC;AAChD,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,CAAC;AAC9C,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,GAAG;AAC5C,QAAM,CAAC,aAAa,cAAc,IAAIA,UAA8B,CAAC,CAAC;AACtE,QAAM,CAAC,UAAU,WAAW,IAAIA,UAA8B,WAAW;AACzE,QAAM,iBAAiBC,QAA8B,IAAI;AACzD,QAAM,EAAE,oBAAoB,YAAY,IAAI,eAAe;AAC3D,QAAM,kBAAkB,wBAAwB;AAChD,QAAM,QAAQC,UAAS;AACvB,QAAM,WAAW,cAAc,MAAM,YAAY,KAAK,IAAI,CAAC;AAG3D,QAAM,cAAc,MAAM,QAAQ,SAAS;AAE3C,EAAAC,WAAU,MAAM;AACd,QAAI,OAAO,WAAW,aAAa;AAEjC,MAAS,6BAAoB,YAAY;AAAA,IAC3C;AAAA,EACF,GAAG,CAAC,CAAC;AACL,EAAAA,WAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAI,eAAe,SAAS;AAC1B,qBAAa,eAAe,OAAO;AAAA,MACrC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,cAAc,eAAe,KAAK,WAAW;AACnD,QAAM,WAAW,KAAK,QAAQ;AAC9B,QAAM,mBAAmBC;AAAA,IACvB,MAAM,oBAAoB,aAAa,QAAQ;AAAA,IAC/C,CAAC,aAAa,QAAQ;AAAA,EACxB;AAEA,QAAM,oBAAoBA,SAAQ,MAAM;AACtC,QAAI,CAAC,YAAY,CAAC,WAAW,QAAQ,GAAG;AACtC,aAAO;AAAA,IACT;AACA,WAAO,wBAAwB,QAAQ,EAAE,YAAY;AAAA,EACvD,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,gBAAgBA,SAAqB,MAAM;AAC/C,QAAI,CAAC,mBAAmB;AACtB,aAAO;AAAA,IACT;AACA,WAAO,iBAAiB,kBAAkB,iBAAiB;AAAA,EAC7D,GAAG,CAAC,kBAAkB,iBAAiB,CAAC;AAExC,QAAM,mBAAmBA,SAAQ,MAAM;AACrC,QAAI,CAAC,eAAe;AAClB,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,qBAAqB,cAAc,YAAY,CAAC,GAAG,OAAO,CAAC,SAAiC;AAChG,aAAO,KAAK,SAAS,aAAa,KAAK,SAAS;AAAA,IAClD,CAAC;AAED,WAAO;AAAA,MACL;AAAA,MACA,UAAU,qBAAqB,MAAM;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,eAAe,iBAAiB,CAAC;AAErC,QAAM,4BAA4BA,SAAQ,MAAM;AAC9C,UAAM,OAAO,eAAe;AAC5B,QAAI,QAAQ,OAAO,SAAS,YAAY,SAAS,QAAQ,cAAc,MAAM;AAC3E,YAAM,gBAAiB,KAAgC;AACvD,UAAI,OAAO,kBAAkB,UAAU;AACrC,eAAO,cAAc,YAAY;AAAA,MACnC;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,eAAe,iBAAiB,CAAC;AAErC,QAAM,gBAAgB,OAAO,KAAuB,YAAoB,QAAgB,QAAoC;AAC1H,UAAM,OAAO,MAAM,IAAI,QAAQ,UAAU;AACzC,UAAM,WAAW,KAAK,YAAY,EAAE,MAAM,CAAC;AAE3C,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,UAAM,UAAU,OAAO,WAAW,IAAI;AACtC,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,+CAA+C;AAAA,IACjE;AACA,WAAO,SAAS,SAAS;AACzB,WAAO,QAAQ,SAAS;AAExB,UAAM,gBAAgB;AAAA,MACpB,eAAe;AAAA,MACf;AAAA,IACF;AAEA,UAAM,KAAK,OAAO,aAAa,EAAE;AACjC,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkBC,aAAY,OAAO,gBAA6B;AACtE,QAAI;AACF,YAAM,MAAM,MAAe,qBAAY,EAAE,MAAM,YAAY,CAAC,EAAE;AAC9D,qBAAe,GAAG;AAClB,oBAAc,IAAI,QAAQ;AAC1B,qBAAe,CAAC;AAGhB,YAAM,WAAgC,CAAC;AACvC,eAAS,IAAI,GAAG,KAAK,IAAI,UAAU,KAAK;AACtC,cAAM,SAAS,MAAM,cAAc,KAAK,GAAG,QAAQ;AACnD,iBAAS,KAAK,MAAM;AAAA,MACtB;AACA,qBAAe,QAAQ;AAAA,IACzB,SAAS,KAAK;AACZ,kBAAY,MAAM,sBAAsB,EAAE,OAAO,IAAI,CAAC;AACtD,YAAM;AAAA,IACR;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAGb,QAAM,sBAAsB,CAACC,SAA4B;AACvD,QAAI,CAACA,KAAI,SAAS;AAChB,YAAM,IAAI,MAAM,sCAAsC;AAAA,IACxD;AAEA,UAAM,eAAe,KAAKA,KAAI,OAAO;AACrC,UAAM,QAAQ,IAAI,WAAW,aAAa,MAAM;AAChD,aAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC5C,YAAM,CAAC,IAAI,aAAa,WAAW,CAAC;AAAA,IACtC;AACA,UAAM,WAAWA,KAAI,QAAQA,KAAI,YAAY;AAC7C,WAAO,IAAI,KAAK,CAAC,KAAK,GAAG,EAAE,MAAM,SAAS,CAAC;AAAA,EAC7C;AAEA,QAAM,qBAAqB,OAAO,YAAoB;AACpD,QAAI;AACF,iBAAW,IAAI;AACf,eAAS,IAAI;AAEb,YAAM,WAAW,MAAM,MAAM,OAAO;AACpC,YAAM,cAAc,MAAM,SAAS,YAAY;AAC/C,YAAM,gBAAgB,WAAW;AAAA,IACnC,SAAS,KAAK;AACZ,kBAAY,MAAM,oCAAoC,EAAE,OAAO,IAAI,CAAC;AACpE,eAAS,4BAA4B;AAAA,IACvC,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,kBAAkBD,aAAY,YAAY;AAC9C,QAAI,CAAC,IAAK;AAEV,eAAW,IAAI;AACf,aAAS,IAAI;AAEb,QAAI;AACF,UAAI,MAAM,IAAI,IAAI,GAAG;AAEnB,cAAM,WAAW,MAAM,YAAY,IAAI,EAAE;AACzC,cAAM,cAAc,MAAM,SAAS,YAAY;AAC/C,cAAM,gBAAgB,WAAW;AAAA,MACnC,OAAO;AAEL,cAAM,WAAW,MAAM,YAAY,IAAI,EAAE;AACzC,cAAM,UAAU,MAAM,SAAS,KAAK;AACpC,uBAAe,OAAO;AAAA,MACxB;AAAA,IACF,SAAS,KAAK;AACZ,kBAAY,MAAM,oCAAoC,EAAE,OAAO,IAAI,CAAC;AACpE,UAAI,MAAM,IAAI,IAAI,GAAG;AACnB,iBAAS,6DAA6D;AAAA,MACxE,OAAO;AACL,iBAAS,4DAA4D;AACrE,uBAAe,IAAI,WAAW,EAAE;AAAA,MAClC;AAAA,IACF,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,KAAK,aAAa,eAAe,CAAC;AAEtC,EAAAF,WAAU,MAAM;AACd,QAAI,QAAQ,OAAO,kBAAkB;AACnC,sBAAgB;AAAA,IAClB,WAAW,QAAQ,KAAK;AACtB,UAAI,MAAM,IAAI,IAAI,GAAG;AACnB,YAAI,IAAI,SAAS;AACf,cAAI;AACF,kBAAM,OAAO,oBAAoB,GAAG;AACpC,kBAAM,cAAc,KAAK,YAAY;AACrC,wBAAY,KAAK,eAAe,EAAE,MAAM,SAAO;AAC7C,0BAAY,MAAM,4BAA4B,EAAE,OAAO,IAAI,CAAC;AAC5D,uBAAS,4BAA4B;AAAA,YACvC,CAAC;AAAA,UACH,SAAS,KAAK;AACZ,wBAAY,MAAM,6CAA6C,EAAE,OAAO,IAAI,CAAC;AAC7E,qBAAS,6CAA6C;AAAA,UACxD;AAAA,QACF,OAAO;AACL,mBAAS,6CAA6C;AAAA,QACxD;AAAA,MACF,OAAO;AACL,uBAAe,IAAI,WAAW,EAAE;AAAA,MAClC;AAAA,IACF;AAEA,QAAI,CAAC,MAAM;AACT,qBAAe,IAAI;AACnB,qBAAe,CAAC,CAAC;AACjB,qBAAe,CAAC;AAChB,oBAAc,CAAC;AACf,kBAAY,GAAG;AACf,qBAAe,EAAE;AACjB,eAAS,IAAI;AACb,kBAAY,WAAW;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,MAAM,KAAK,kBAAkB,iBAAiB,eAAe,CAAC;AAElE,QAAM,eAAe,YAAY;AAE/B,QAAI,eAAe,SAAS;AAC1B,mBAAa,eAAe,OAAO;AAAA,IACrC;AAEA,UAAM,WAAW,KAAK,IAAI,WAAW,MAAM,CAAG;AAC9C,gBAAY,QAAQ;AAGpB,mBAAe,UAAU,WAAW,YAAY;AAC9C,UAAI,aAAa;AACf,mBAAW,IAAI;AACf,YAAI;AACF,gBAAM,WAAgC,CAAC;AACvC,mBAAS,IAAI,GAAG,KAAK,YAAY,UAAU,KAAK;AAC9C,kBAAM,SAAS,MAAM,cAAc,aAAa,GAAG,QAAQ;AAC3D,qBAAS,KAAK,MAAM;AAAA,UACtB;AACA,yBAAe,QAAQ;AAAA,QACzB,SAASI,QAAO;AACd,sBAAY,MAAM,kBAAkB,EAAE,OAAAA,OAAM,CAAC;AAE7C,sBAAY,QAAQ;AAAA,QACtB,UAAE;AACA,qBAAW,KAAK;AAAA,QAClB;AAAA,MACF;AAAA,IACF,GAAG,GAAG;AAAA,EACR;AAEA,QAAM,gBAAgB,YAAY;AAChC,QAAI,eAAe,SAAS;AAC1B,mBAAa,eAAe,OAAO;AAAA,IACrC;AAEA,UAAM,WAAW,KAAK,IAAI,WAAW,MAAM,GAAG;AAC9C,gBAAY,QAAQ;AAEpB,mBAAe,UAAU,WAAW,YAAY;AAC9C,UAAI,aAAa;AACf,mBAAW,IAAI;AACf,YAAI;AACF,gBAAM,WAAgC,CAAC;AACvC,mBAAS,IAAI,GAAG,KAAK,YAAY,UAAU,KAAK;AAC9C,kBAAM,SAAS,MAAM,cAAc,aAAa,GAAG,QAAQ;AAC3D,qBAAS,KAAK,MAAM;AAAA,UACtB;AACA,yBAAe,QAAQ;AAAA,QACzB,SAASA,QAAO;AACd,sBAAY,MAAM,mBAAmB,EAAE,OAAAA,OAAM,CAAC;AAC9C,sBAAY,QAAQ;AAAA,QACtB,UAAE;AACA,qBAAW,KAAK;AAAA,QAClB;AAAA,MACF;AAAA,IACF,GAAG,GAAG;AAAA,EACR;AAEA,QAAM,iBAAiB,YAAY;AACjC,QAAI,CAAC,OAAO,CAAC,iBAAkB;AAE/B,QAAI;AACF,YAAM,mBAAmB,IAAI,IAAI,IAAI,IAAI;AAAA,IAC3C,SAAS,KAAK;AACZ,kBAAY,MAAM,mCAAmC,EAAE,OAAO,KAAK,OAAO,IAAI,GAAG,CAAC;AAAA,IACpF;AAAA,EACF;AACA,SACE,gBAAAC,MAAC,UAAO,YAAU,MAAC,MAAY,SAC7B;AAAA,oBAAAC,KAAC,UAAO,IAAI,EAAE,UAAU,WAAW,GACjC,0BAAAD,MAAC,WAEC;AAAA,sBAAAA,MAACE,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,MAAM,GAAG,UAAU,EAAE,GAEpE;AAAA,eACC,gBAAAD,KAACC,MAAA,EAAI,IAAI,EAAE,IAAI,GAAG,YAAY,EAAE,GAC5B,iBAAM;AACN,gBAAM,WAAWd,iBAAgB,IAAI,IAAI;AACzC,gBAAM,gBAAgB,SAAS;AAC/B,iBACE,gBAAAa,KAACE,UAAA,EAAQ,OAAO,GAAG,SAAS,QAAQ,SAAS,WAAU,UACrD,0BAAAH;AAAA,YAACE;AAAA,YAAA;AAAA,cACC,IAAI;AAAA,gBACF,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,SAAS,SAAS;AAAA,gBAClB,OAAO;AAAA,gBACP,cAAc;AAAA,gBACd,IAAI;AAAA,gBACJ,IAAI;AAAA,gBACJ,UAAU;AAAA,gBACV,YAAY;AAAA,cACd;AAAA,cAEA;AAAA,gCAAAD,KAAC,iBAAc,IAAI,EAAE,UAAU,QAAQ,IAAI,IAAI,GAAG;AAAA,gBACjD,SAAS,YAAY,SAAS;AAAA;AAAA;AAAA,UACjC,GACF;AAAA,QAEJ,GAAG,GACL;AAAA,QAIF,gBAAAA,KAACE,UAAA,EAAQ,OAAO,KAAK,QAAQ,IAAI,WAAU,gBACzC,0BAAAF;AAAA,UAACG;AAAA,UAAA;AAAA,YACC,IAAI;AAAA,cACF,MAAM;AAAA,cACN,UAAU;AAAA,cACV,cAAc;AAAA,cACd,YAAY;AAAA;AAAA,cAEZ,UAAU;AAAA,gBACR,IAAI;AAAA;AAAA,gBACJ,IAAI;AAAA;AAAA,gBACJ,IAAI;AAAA;AAAA,gBACJ,IAAI;AAAA;AAAA,gBACJ,IAAI;AAAA;AAAA,cACN;AAAA,cACA,QAAQ;AAAA;AAAA,YACV;AAAA,YACA,SAAQ;AAAA,YAEP,eAAK;AAAA;AAAA,QACR,GACF;AAAA,QAGA,gBAAAH,KAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,YAAY,GAAG,IAAI,EAAE,GACpE,gBAAM,KAAK,QAAQ,EAAE,KAAK,aAAa,KACtC,gBAAAF,MAACI,aAAA,EAAW,WAAU,QAAO,SAAQ,SAAQ,IAAI,EAAE,SAAS,IAAI,GAAG;AAAA;AAAA,UAC/D;AAAA,UAAW;AAAA,UAAM,aAAa,IAAI,MAAM;AAAA,UAAG;AAAA,WAC/C,GAEJ;AAAA,SACF;AAAA,MAGA,gBAAAJ,MAACE,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,YAAY,GAAG,KAAK,EAAE,GAErE;AAAA,SAAC,MAAM,KAAK,QAAQ,EAAE,KAAK,WAAW,KAAK,QAAQ,EAAE,KACpD,gBAAAF;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,YACP,WAAS;AAAA,YACT,UAAU,CAAC,GAAG,YAAY,WAAW,YAAY,OAAO;AAAA,YACxD,MAAK;AAAA,YAEL;AAAA,8BAAAA,MAAC,gBAAa,OAAM,aAAY,IAAI,EAAE,OAAO,UAAU,GACrD;AAAA,gCAAAC,KAAC,QAAS,IAAI,EAAE,IAAI,GAAG,UAAU,OAAO,GAAG;AAAA,gBAAE;AAAA,iBAE/C;AAAA,cACA,gBAAAD,MAAC,gBAAa,OAAM,OAAM,IAAI,EAAE,OAAO,UAAU,GAC/C;AAAA,gCAAAC,KAAC,QAAe,IAAI,EAAE,IAAI,GAAG,UAAU,OAAO,GAAG;AAAA,gBAAE;AAAA,iBAErD;AAAA;AAAA;AAAA,QACF;AAAA,QAID,MAAM,KAAK,QAAQ,EAAE,KAAK,eAAe,CAAC,YACzC,gBAAAD,MAAA,YACE;AAAA,0BAAAC;AAAA,YAAC;AAAA;AAAA,cACC,OAAM;AAAA,cACN,WAAW,gBAAAA,KAAC,WAAY;AAAA,cACxB,SAAS;AAAA,cACT,UAAU,YAAY;AAAA,cACtB,MAAK;AAAA,cACN;AAAA;AAAA,UAED;AAAA,UACA,gBAAAD,MAACI,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,OAAO,WAAW,IAAI,EAAE,GACvD;AAAA,iBAAK,MAAM,WAAW,GAAG;AAAA,YAAE;AAAA,aAC9B;AAAA,UACA,gBAAAH;AAAA,YAAC;AAAA;AAAA,cACC,OAAM;AAAA,cACN,WAAW,gBAAAA,KAAC,UAAW;AAAA,cACvB,SAAS;AAAA,cACT,UAAU,YAAY;AAAA,cACtB,MAAK;AAAA,cACN;AAAA;AAAA,UAED;AAAA,WACF;AAAA,QAID,oBACC,gBAAAA,KAACI,aAAA,EAAW,MAAK,OAAM,OAAM,WAAU,SAAS,gBAC9C,0BAAAJ,KAAC,YAAa,GAChB;AAAA,QAEF,gBAAAA,KAACI,aAAA,EAAW,MAAK,OAAM,OAAM,WAAU,SAAS,SAC9C,0BAAAJ,KAAC,KAAU,GACb;AAAA,SACF;AAAA,OACF,GACF;AAAA,IACA,gBAAAD,MAACE,MAAA,EAAI,IAAI,EAAE,GAAG,GAAG,SAAS,sBAAsB,QAAQ,QAAQ,WAAW,OAAO,GAC/E;AAAA,iBACC,gBAAAF,MAACE,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,gBAAgB,UAAU,YAAY,UAAU,QAAQ,OAAO,GACzF;AAAA,wBAAAD,KAAC,oBAAiB;AAAA,QAClB,gBAAAA,KAACG,aAAA,EAAW,IAAI,EAAE,IAAI,EAAE,GACrB,gBAAM,KAAK,QAAQ,EAAE,IAAI,4BAA4B,gCACxD;AAAA,SACF;AAAA,MAGD,SACC,gBAAAH,KAAC,SAAM,UAAS,WAAU,IAAI,EAAE,IAAI,EAAE,GACnC,iBACH;AAAA,MAGD,CAAC,WAAW,MAAM,KAAK,QAAQ,EAAE,KAAK,YAAY,SAAS,KAC1D,gBAAAA,KAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,eAAe,UAAU,YAAY,UAAU,KAAK,EAAE,GAC/E,sBAAY,IAAI,CAAC,QAAQ,UACxB,gBAAAF;AAAA,QAAC;AAAA;AAAA,UAEC,WAAW;AAAA,UACX,IAAI;AAAA,YACF,GAAG;AAAA,YACH,IAAI;AAAA,YACJ,UAAU;AAAA,YACV,UAAU;AAAA;AAAA,YAEV,wBAAwB;AAAA,cACtB,OAAO;AAAA,cACP,QAAQ;AAAA,YACV;AAAA,YACA,8BAA8B;AAAA,cAC5B,YAAY,cAAc,YAAY;AAAA,cACtC,cAAc;AAAA,YAChB;AAAA,YACA,8BAA8B;AAAA,cAC5B,YAAY,cAAc,SAAS;AAAA,cACnC,cAAc;AAAA,cACd,WAAW;AAAA,gBACT,YAAY,cAAc,SAAS;AAAA,cACrC;AAAA,YACF;AAAA,YACA,+BAA+B;AAAA,cAC7B,YAAY,cAAc,YAAY;AAAA,YACxC;AAAA;AAAA,YAEA,gBAAgB;AAAA,YAChB,gBAAgB,cAAc,iBAAiB;AAAA,UACjD;AAAA,UAEA;AAAA,4BAAAA,MAACI,aAAA,EAAW,SAAQ,WAAU,OAAM,kBAAiB,IAAI,EAAE,IAAI,GAAG,SAAS,QAAQ,GAAG;AAAA;AAAA,cAC9E,QAAQ;AAAA,cAAE;AAAA,cAAK;AAAA,eACvB;AAAA,YACA,gBAAAH;AAAA,cAACC;AAAA,cAAA;AAAA,gBACC,KAAK,CAAC,OAA8B;AAClC,sBAAI,MAAM,QAAQ;AAChB,uBAAG,YAAY;AACf,uBAAG,YAAY,MAAM;AAAA,kBACvB;AAAA,gBACF;AAAA,gBACA,IAAI;AAAA,kBACF,YAAY;AAAA,oBACV,SAAS;AAAA,oBACT,UAAU;AAAA,oBACV,QAAQ;AAAA,oBACR,QAAQ;AAAA,oBACR,aAAa;AAAA,kBACf;AAAA,gBACF;AAAA;AAAA,YACF;AAAA;AAAA;AAAA,QAlDK;AAAA,MAmDP,CACD,GACH;AAAA,MAGD,CAAC,WAAW,CAAC,MAAM,KAAK,QAAQ,EAAE,KACjC,gBAAAD,KAACC,MAAA,EACE,qBAAW,KAAK,QAAQ,EAAE,KAAK,aAAa,cAC3C,gBAAAF,MAACE,MAAA,EAEC;AAAA,wBAAAF,MAACE,MAAA,EAAI,IAAI,EAAE,IAAI,GAAG,SAAS,QAAQ,gBAAgB,iBAAiB,YAAY,SAAS,GACvF;AAAA,0BAAAF,MAACI,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB;AAAA;AAAA,YAC3B,gBAAAH,KAAC,YAAQ,kCAAwB,KAAK,QAAQ,EAAE,EAAE,YAAY,GAAE;AAAA,aACxF;AAAA,UACA,gBAAAD,MAACI,aAAA,EAAW,SAAQ,WAAU,OAAM,kBAChC;AAAA,4BAAe,KAAK,WAAW,IAAI,MAAM,IAAI,EAAE;AAAA,YAAO;AAAA,aAC1D;AAAA,WACF;AAAA,QAEA,gBAAAH;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,YACX,IAAI;AAAA,cACF,UAAU;AAAA,cACV,WAAW,EAAE,IAAI,uBAAuB,IAAI,sBAAsB;AAAA,cAClE,QAAQ;AAAA,cACR,aAAa;AAAA;AAAA,cAEb,wBAAwB;AAAA,gBACtB,OAAO,EAAE,IAAI,OAAO,IAAI,OAAO;AAAA,gBAC/B,QAAQ,EAAE,IAAI,OAAO,IAAI,OAAO;AAAA,cAClC;AAAA,cACA,8BAA8B;AAAA,gBAC5B,iBAAiB,cAAc,YAAY;AAAA,gBAC3C,cAAc;AAAA,cAChB;AAAA,cACA,8BAA8B;AAAA,gBAC5B,iBAAiB,cAAc,SAAS;AAAA,gBACxC,cAAc;AAAA,gBACd,QAAQ,cAAc,sBAAsB;AAAA,gBAC5C,WAAW;AAAA,kBACT,iBAAiB,cAAc,SAAS;AAAA,gBAC1C;AAAA,cACF;AAAA,cACA,+BAA+B;AAAA,gBAC7B,iBAAiB,cAAc,YAAY;AAAA,cAC7C;AAAA;AAAA,cAEA,gBAAgB;AAAA,cAChB,gBAAgB,cAAc,iBAAiB;AAAA,cAC/C,SAAS;AAAA,gBACP,QAAQ;AAAA,gBACR,SAAS,EAAE,IAAI,mBAAmB,IAAI,kBAAkB;AAAA,gBACxD,cAAc;AAAA,gBACd,UAAU,EAAE,IAAI,QAAQ,IAAI,OAAO;AAAA,gBACnC,YAAY;AAAA;AAAA,gBAEZ,WAAW;AAAA,gBACX,cAAc;AAAA,cAChB;AAAA,YACF;AAAA,YAEA,0BAAAA;AAAA,cAACC;AAAA,cAAA;AAAA,gBACC,IAAI;AAAA,kBACF,WAAW;AAAA,oBACT,SAAS;AAAA,oBACT,SAAS,EAAE,IAAI,QAAQ,IAAI,OAAO;AAAA,oBAClC,QAAQ;AAAA,oBACR,UAAU,EAAE,IAAI,QAAQ,IAAI,OAAO;AAAA,oBACnC,YAAY;AAAA,oBACZ,iBAAiB,cAAc,YAAY;AAAA,oBAC3C,OAAO,cAAc,YAAY;AAAA,oBACjC,YAAY;AAAA,oBACZ,WAAW;AAAA,oBACX,cAAc;AAAA,kBAChB;AAAA,kBACA,kCAAkC;AAAA,oBAChC,OAAO,cAAc,YAAY;AAAA,oBACjC,WAAW;AAAA,kBACb;AAAA,kBACA,4EAA4E;AAAA,oBAC1E,OAAO,cAAc,YAAY;AAAA,kBACnC;AAAA,kBACA,sEAAsE;AAAA,oBACpE,OAAO,cAAc,YAAY;AAAA,kBACnC;AAAA,kBACA,gEAAgE;AAAA,oBAC9D,OAAO,cAAc,YAAY;AAAA,kBACnC;AAAA,kBACA,yEAAyE;AAAA,oBACvE,OAAO,cAAc,YAAY;AAAA,kBACnC;AAAA,kBACA,sDAAsD;AAAA,oBACpD,OAAO,cAAc,YAAY;AAAA,kBACnC;AAAA,gBACF;AAAA,gBAEA,0BAAAD,KAAC,SAAI,WAAW,iBAAiB,6BAA6B,MAAM,IAClE,0BAAAA,KAAC,UAAK,WAAU,QACb,2BAAiB,SAAS,IAAI,mBAAmB,kBACpD,GACF;AAAA;AAAA,YACF;AAAA;AAAA,QACF;AAAA,SACF,IAEA,gBAAAA;AAAA,QAACG;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,SAAQ;AAAA,UACR,IAAI;AAAA,YACF,YAAY;AAAA,YACZ,YAAY;AAAA,YACZ,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,SAAS;AAAA,YACT,GAAG;AAAA,YACH,cAAc;AAAA,YACd,QAAQ;AAAA,YACR,aAAa;AAAA,YACb,UAAU;AAAA,YACV,WAAW;AAAA,UACb;AAAA,UAEC,yBAAe,KAAK;AAAA;AAAA,MACvB,GAEJ;AAAA,MAGD,CAAC,WAAW,MAAM,KAAK,QAAQ,EAAE,KAAK,YAAY,WAAW,KAAK,CAAC,SAClE,gBAAAJ,MAACE,MAAA,EAAI,IAAI,EAAE,WAAW,UAAU,IAAI,EAAE,GACpC;AAAA,wBAAAD,KAACG,aAAA,EAAW,SAAQ,MAAK,OAAM,kBAAiB,cAAY,MAAC,uCAE7D;AAAA,QACA,gBAAAH,KAACG,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,8FAEnD;AAAA,QACC,oBACC,gBAAAH;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,WAAW,gBAAAA,KAAC,YAAa;AAAA,YACzB,SAAS;AAAA,YACT,IAAI,EAAE,IAAI,EAAE;AAAA,YACb;AAAA;AAAA,QAED;AAAA,SAEJ;AAAA,OAEJ;AAAA,KACF;AAEJ;AAEA,IAAO,+BAAQ;;;AF70Bf,SAAS,YAAAK,WAAU,SAAAC,cAAa;AAEhC,OAAO,mBAA+G;AACtH,OAAO,eAAe;AACtB,OAAO,eAAe;AACtB,OAAO,oBAAoB;AAE3B;AAAA,EACE;AAAA,EACA,OAAAC;AAAA,EACA,cAAAC;AAAA,EACA;AAAA,EACA,WAAAC;AAAA,EACA,cAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAAC;AAAA,OACK;;;AK7BP,IAAM,cAAc;AAEpB,IAAM,kBAAkB,MACtB,OAAO,WAAW,gBACjB,OAAO,aAAa,4BAA4B,EAAE,WAChD,OAAO,UAAmD,eAAe;AAEvE,IAAM,aAAa,CAAC,SACzB,QAAQ,QAAQ,YAAY,KAAK,IAAI,CAAC;AAOjC,IAAM,2BAA2B,CACtC,OACA,SACS;AACT,MAAI,CAAC,QAAQ,CAAC,gBAAgB,KAAK,CAAC,WAAW,IAAI,EAAG;AACtD,QAAM,eAAe;AAErB,QAAM,YAAY;AAChB,QAAI;AACF,YAAM,MAAM,MAAM,MAAM,IAAI;AAC5B,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,SAAS,IAAI,MAAM,EAAE;AAClD,YAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,YAAM,UAAU,IAAI,IAAI,MAAM,OAAO,SAAS,IAAI,EAAE,SAAS,MAAM,GAAG,EAAE,IAAI,KAAK;AACjF,YAAM,OAAO,mBAAmB,OAAO;AACvC,YAAM,OAAO,IAAI,KAAK,CAAC,IAAI,GAAG,MAAM;AAAA,QAClC,MAAM,KAAK,QAAQ;AAAA,MACrB,CAAC;AACD,YAAM,MAAM;AAIZ,UAAI,IAAI,WAAW,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,OAAO;AAClD,cAAM,IAAI,MAAM,EAAE,OAAO,CAAC,IAAI,GAAG,OAAO,KAAK,CAAC;AAC9C;AAAA,MACF;AAGA,aAAO,SAAS,OAAO,IAAI,gBAAgB,IAAI;AAAA,IACjD,SAAS,OAAO;AACd,kBAAY,KAAK,iDAAiD;AAAA,QAChE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,CAAC;AAED,UAAK,OAA6B,SAAS,aAAc;AACzD,aAAO,KAAK,MAAM,UAAU,UAAU;AAAA,IACxC;AAAA,EACF,GAAG;AACL;;;ACjDA,SAAS,YAAAC,WAAU,aAAAC,kBAAiB;AAMpC,SAAS,OAAAC,MAAK,oBAAAC,mBAAkB,cAAAC,aAAY,WAAAC,gBAAe;AAC3D,SAAS,SAAS,WAAW,YAAY,aAAa,cAAc,eAAe,QAAQ,iBAAiB,aAAa,kBAAkB,aAAa,iBAAiB,UAAU,UAAU,SAAS,WAAW,QAAQ,eAAe,cAAc,kBAAkB;AAwJpP,SAgBZ,YAAAC,WAhBY,OAAAC,MAgBZ,QAAAC,aAhBY;AAhJpB,IAAM,WAA2B,CAAC,UAAU;AAC1C,QAAM,IAAI,WAAW,KAAK;AAC1B,SAAO;AAAA,IACL,OAAO,EAAE,QAAQ;AAAA,IACjB,WAAW,EAAE,OAAO,EAAE,QAAQ,YAAY,SAAS,EAAE,QAAQ,YAAY;AAAA,IACzE,0BAA0B,EAAE,OAAO,MAAM,QAAQ,QAAQ,KAAK;AAAA,IAC9D,kBAAkB,EAAE,OAAO,EAAE,QAAQ,iBAAiB,SAAS,IAAI;AAAA,EACrE;AACF;AAGA,IAAM,uBAAmD,CAAC,EAAE,KAAK,MAAM;AACrE,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAAS,KAAK;AAC1C,QAAM,aAAa,eAAe,CAAC,MAAM,EAAE,UAAU;AACrD,QAAM,eAAe,MAAM;AACzB,UAAM,QAAQ,QAAQ;AAEtB,UAAM,eAAe,MAAM,MAAM,kBAAkB,IAAI,CAAC;AACxD,UAAM,YAAY,MAAM,MAAM,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,OAAO,KAAK;AAC1E,UAAM,YAAY,gBAAgB,WAAW,QAAQ,WAAW,EAAE,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAC9F,UAAM,QAAQ,SAAS,SAAS,KAAK,GAAG,SAAS,MAAM,GAAG,EAAE,CAAC,WAAM,YAAY;AAC/E,eAAW,EAAE,SAAS,OAAO,MAAM,CAAC;AAAA,EACtC;AACA,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAoC,IAAI;AAExE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,aAAa;AAAA,EACf,IAAI,OAAO;AAEX,QAAM,EAAE,iBAAiB,mBAAmB,YAAY,IAAI,cAAc;AAC1E,QAAM,EAAE,YAAY,IAAI,oBAAoB;AAC5C,QAAM,EAAE,UAAU,gBAAgB,IAAI,wBAAwB;AAG9D,EAAAC,WAAU,MAAM;AACd,UAAM,kBAAkB,sBAAsB,gBAAgB;AAC9D,UAAM,QAAQ,sBAAsB,SAAS;AAE7C,QAAI,CAAC,eAAe,gBAAgB,WAAW,GAAG;AAChD,UAAI,SAAS,iBAAiB;AAC5B,oBAAY,MAAM,mFAAmF;AACrG,0BAAkB;AAAA,MACpB,OAAO;AACL,oBAAY,MAAM,sEAAsE;AAAA,MAC1F;AAAA,IACF;AAAA,EACF,GAAG,CAAC,aAAa,gBAAgB,QAAQ,iBAAiB,CAAC;AAG3D,EAAAA,WAAU,MAAM;AACd,QAAI,UAAU;AACZ,kBAAY,MAAM,4BAA4B,EAAE,OAAO,SAAS,CAAC;AAAA,IACnE;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,aAAa,MAAM;AAEvB,QAAI,YAAY,KAAK,QAAQ,mBAAmB,EAAE;AAGlD,gBAAY,UACT,QAAQ,yBAAyB,EAAE,EACnC,QAAQ,oBAAoB,EAAE,EAC9B,QAAQ,0BAA0B,IAAI,EACtC,QAAQ,cAAc,EAAE,EACxB,QAAQ,yBAAyB,EAAE,EACnC,QAAQ,mBAAmB,EAAE,EAC7B,QAAQ,eAAe,EAAE,EACzB,QAAQ,WAAW,MAAM;AAE5B,gBAAY,UAAU,KAAK;AAE3B,cAAU,UAAU,UAAU,SAAS;AACvC,cAAU,IAAI;AACd,eAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,EACzC;AAEA,QAAM,iBAAiB,YAAY;AACjC,QAAI;AACF,UAAI,CAAC,gBAAgB;AACnB;AAAA,MACF;AAEA,UAAI,UAAU;AAEZ,kBAAU;AAAA,MACZ,WAAW,CAAC,WAAW;AAGrB,YAAI,YAAY,KAAK,QAAQ,mBAAmB,EAAE;AAGlD,oBAAY,UACT,QAAQ,yBAAyB,EAAE,EACnC,QAAQ,oBAAoB,EAAE,EAC9B,QAAQ,0BAA0B,IAAI,EACtC,QAAQ,cAAc,EAAE,EACxB,QAAQ,yBAAyB,EAAE,EACnC,QAAQ,mBAAmB,EAAE,EAC7B,QAAQ,eAAe,EAAE,EACzB,QAAQ,WAAW,MAAM;AAE5B,oBAAY,UAAU,KAAK;AAE3B,YAAI,CAAC,WAAW;AACd;AAAA,QACF;AAEA,cAAM,SAAS,WAAW;AAAA,UACxB,cAAc;AAAA;AAAA,UACd,aAAa;AAAA;AAAA,QACf,CAAC;AAAA,MACH;AAAA,IAEF,SAAS,OAAO;AACd,kBAAY,MAAM,wBAAwB;AAAA,QACxC,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC5D,OAAO,iBAAiB,QAAQ,MAAM,QAAQ;AAAA,MAChD,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,iBAAiB,CAAC,SAA6B;AACnD,gBAAY,IAAI;AAAA,EAElB;AAEA,SACE,gBAAAC,MAACC,MAAA,EAAI,IAAI,EAAE,IAAI,GAAG,SAAS,QAAQ,KAAK,GAAG,YAAY,UAAU,UAAU,OAAO,GAChF;AAAA,oBAAAC,KAACC,UAAA,EAAQ,OAAO,SAAS,YAAY,wBACnC,0BAAAD;AAAA,MAACE;AAAA,MAAA;AAAA,QACC,SAAS;AAAA,QACT,MAAK;AAAA,QACL,cAAY,SAAS,WAAW;AAAA,QAChC,IAAI;AAAA,QAEH,mBAAS,gBAAAF,KAAC,aAAU,MAAM,IAAI,IAAK,gBAAAA,KAAC,mBAAgB,MAAM,IAAI;AAAA;AAAA,IACjE,GACF;AAAA,IAEA,gBAAAA,KAACC,UAAA,EAAQ,OAAM,uCACb,0BAAAD;AAAA,MAACE;AAAA,MAAA;AAAA,QACC,SAAS;AAAA,QACT,MAAK;AAAA,QACL,cAAW;AAAA,QACX,IAAI;AAAA,QAEJ,0BAAAF,KAAC,cAAW,MAAM,IAAI;AAAA;AAAA,IACxB,GACF;AAAA,IAEC,kBACC,gBAAAF,MAAAK,WAAA,EAEE;AAAA,sBAAAH;AAAA,QAACC;AAAA,QAAA;AAAA,UACC,OACE,CAAC,iBAAiB,4CAClB,YAAY,qBACZ,WAAW,oBACX,YAAY,qBACZ;AAAA,UAGF,0BAAAD;AAAA,YAACE;AAAA,YAAA;AAAA,cACC,SAAS;AAAA,cACT,MAAK;AAAA,cACL,UAAU;AAAA,cACV,cAAY,WAAW,oBAAoB,YAAY,YAAY;AAAA,cACnE,IAAI;AAAA,cAEH,sBACC,gBAAAF,KAACI,mBAAA,EAAiB,MAAM,IAAI,IAC1B,WACF,gBAAAJ,KAAC,iBAAc,MAAM,IAAI,IACvB,CAAC,YACH,gBAAAA,KAAC,oBAAiB,MAAM,IAAI,IAE5B,gBAAAA,KAACD,MAAA,EAAI,WAAU,QAAO,IAAI,CAAC,OAAO,EAAE,SAAS,eAAe,OAAO,WAAW,CAAC,EAAE,OAAO,UAAU,IAAI,0BAAAC,KAAC,mBAAgB,MAAM,IAAI,GAAE;AAAA;AAAA,UAEvI;AAAA;AAAA,MACF;AAAA,MAGC,aACC,gBAAAA,KAACC,UAAA,EAAQ,OAAM,kBACb,0BAAAD;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,SAAS,MAAM,SAAS;AAAA,UACxB,MAAK;AAAA,UACL,cAAW;AAAA,UACX,IAAI;AAAA,UAEJ,0BAAAF,KAAC,aAAU,MAAM,IAAI;AAAA;AAAA,MACvB,GACF;AAAA,OAIA,aAAa,aACb,gBAAAA,KAACC,UAAA,EAAQ,OAAM,iBACb,0BAAAD;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,SAAS,MAAM,QAAQ;AAAA,UACvB,MAAK;AAAA,UACL,cAAW;AAAA,UACX,IAAI;AAAA,UAEJ,0BAAAF,KAAC,YAAS,MAAM,IAAI;AAAA;AAAA,MACtB,GACF;AAAA,OAEJ;AAAA,IAGF,gBAAAA,KAACC,UAAA,EAAQ,OAAM,sBACb,0BAAAD;AAAA,MAACE;AAAA,MAAA;AAAA,QACC,SAAS,MAAM,eAAe,MAAM;AAAA,QACpC,MAAK;AAAA,QACL,cAAW;AAAA,QACX,gBAAc,aAAa;AAAA,QAC3B,IAAI;AAAA,QAEJ,0BAAAF,KAAC,eAAY,MAAM,IAAI;AAAA;AAAA,IACzB,GACF;AAAA,IAEA,gBAAAA,KAACC,UAAA,EAAQ,OAAM,yBACb,0BAAAD;AAAA,MAACE;AAAA,MAAA;AAAA,QACC,SAAS,MAAM,eAAe,SAAS;AAAA,QACvC,MAAK;AAAA,QACL,cAAW;AAAA,QACX,gBAAc,aAAa;AAAA,QAC3B,IAAI;AAAA,QAEJ,0BAAAF,KAAC,iBAAc,MAAM,IAAI;AAAA;AAAA,IAC3B,GACF;AAAA,KACF;AAEJ;AAEA,IAAO,iCAAQ;;;ANPT,SA4hB8B,YAAAK,WA5hB9B,OAAAC,MAgCA,QAAAC,aAhCA;AA/NN,IAAM,YAAY;AAmBlB,IAAM,kBAAkB,CAACC,cAA6B;AACpD,QAAM,QAAQA,UAAS,MAAM,IAAI;AACjC,QAAM,SAAmB,CAAC;AAC1B,MAAI,UAAU;AACd,MAAI,YAAwB,CAAC;AAE7B,QAAM,aAAa,MAAM;AACvB,QAAI,UAAU,WAAW,EAAG;AAE5B,UAAM,UAAU,KAAK,IAAI,GAAG,UAAU,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;AAC1D,UAAM,SAAS,UAAU,IAAI,CAAC,QAAQ;AACpC,aAAO,CAAC,GAAG,KAAK,GAAG,MAAM,UAAU,IAAI,MAAM,EAAE,KAAK,EAAE,CAAC;AAAA,IACzD,CAAC;AAED,UAAM,SAAS,OAAO,CAAC;AACvB,UAAM,YAAY,MAAM,OAAO,EAAE,KAAK,KAAK;AAE3C,WAAO,KAAK,OAAO,OAAO,KAAK,KAAK,IAAI,IAAI;AAC5C,WAAO,KAAK,OAAO,UAAU,KAAK,KAAK,IAAI,IAAI;AAC/C,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,YAAM,MAAM,OAAO,CAAC;AAEpB,UAAI,IAAI,MAAM,CAAC,SAAS,OAAO,KAAK,IAAI,CAAC,EAAG;AAC5C,aAAO,KAAK,OAAO,IAAI,KAAK,KAAK,IAAI,IAAI;AAAA,IAC3C;AAEA,gBAAY,CAAC;AACb,cAAU;AAAA,EACZ;AAEA,aAAW,QAAQ,OAAO;AACxB,QAAI,iBAAiB,KAAK,IAAI,GAAG;AAC/B,gBAAU;AACV,YAAM,QAAQ,KACX,KAAK,EACL,MAAM,GAAG,EAAE,EACX,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AACtB,gBAAU,KAAK,KAAK;AAAA,IACtB,OAAO;AACL,UAAI,QAAS,YAAW;AACxB,aAAO,KAAK,IAAI;AAAA,IAClB;AAAA,EACF;AAEA,aAAW;AACX,SAAO,OAAO,KAAK,IAAI;AACzB;AAmDA,IAAM,mBAAmB,CAAC,UACxB,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS;AAErD,IAAM,aAAa,CAAC,UAAqC;AACvD,MAAI,iBAAiB,QAAQ,CAAC,OAAO,MAAM,MAAM,QAAQ,CAAC,GAAG;AAC3D,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,GAAG;AAC7C,UAAM,SAAS,IAAI,KAAK,KAAK;AAC7B,QAAI,CAAC,OAAO,MAAM,OAAO,QAAQ,CAAC,GAAG;AACnC,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,gBAAgB,CAAC,UAAyC;AAC9D,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,WAAO;AAAA,EACT;AACA,QAAM,UAAU,MAAM,OAAO,CAAC,SAAyB,OAAO,SAAS,YAAY,OAAO,SAAS,IAAI,CAAC;AACxG,SAAO,QAAQ,SAAS,UAAU;AACpC;AAUA,IAAM,oBAAsD,CAAC;AAAA,EAC3D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAM,QAAQ,oBAAoB,KAAK,aAAa,EAAE;AACtD,QAAM,oBAAoB,QAAQ,CAAC,GAAG,YAAY,KAAK;AACvD,QAAM,WAAW,OAAO,QAAQ,EAAE,QAAQ,OAAO,EAAE;AACnD,QAAM,kBAAkB,SAAS,SAAS,IAAI,KAAK,QAAQ,iBAAiB;AAE5E,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAAS,KAAK;AAC1C,QAAM,aAAa,MAAM;AACvB,cAAU,UAAU,UAAU,QAAQ;AACtC,cAAU,IAAI;AACd,eAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,EACzC;AAEA,QAAM,gBAAgBC;AAAA,IACpB,MACE,kBAAkB,iBAAiB,UAAU,iBAAiB,IAAI;AAAA,IACpE,CAAC,UAAU,mBAAmB,eAAe;AAAA,EAC/C;AACA,QAAM,mBAAmBA;AAAA,IACvB,MACE,kBACI;AAAA,OACG,eAAe,YAAY,CAAC,GAAG,OAAO,CAAC,SAAiC;AACvE,YAAI,CAAC,MAAM;AACT,iBAAO;AAAA,QACT;AACA,eAAO,KAAK,SAAS,aAAa,KAAK,SAAS;AAAA,MAClD,CAAC;AAAA,MACD,MAAM,qBAAqB,MAAM;AAAA,IACnC,IACA,CAAC;AAAA,IACP,CAAC,eAAe,mBAAmB,eAAe;AAAA,EACpD;AAEA,QAAM,oBACJ,qBACA,eAAe,MAAM,YACrB,QACA,SAAS;AACX,QAAM,gBAAgB,iBAAiB,YAAY;AACnD,QAAM,gBAAgB,iBAAiB,YAAY;AAEnD,QAAM,kBACJ,MAAM,QAAQ,SAAS,SACnB;AAAA,IACE,YAAY,cAAc,kBAAkB;AAAA,IAC5C,MAAM,cAAc,YAAY;AAAA,IAChC,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,EACZ,IACA;AAAA,IACE,YAAY,cAAc,kBAAkB;AAAA,IAC5C,MAAM,cAAc,YAAY;AAAA,IAChC,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAEN,MAAI,CAAC,iBAAiB;AACpB,WACE,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,cAAc;AAAA,UACd,UAAU;AAAA,UACV,YACE;AAAA,QACJ;AAAA,QACC,GAAG;AAAA,QAEH;AAAA;AAAA,IACH;AAAA,EAEJ;AAEA,SACE,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,IAAI;AAAA,QACF,cAAc;AAAA,QACd,UAAU;AAAA,QACV,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,UAAU;AAAA,QACV,UAAU;AAAA,QACV,YACE;AAAA,QACF,OAAO;AAAA,QACP,UAAU;AAAA,MACZ;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAACC;AAAA,UAAA;AAAA,YACC,IAAI;AAAA,cACF,IAAI;AAAA,cACJ,IAAI;AAAA,cACJ,SACE,cAAc,iBACb,MAAM,QAAQ,SAAS,SACpBC,OAAM,MAAM,QAAQ,OAAO,OAAO,IAAI,IACtCA,OAAM,MAAM,QAAQ,KAAK,SAAS,IAAI;AAAA,cAC5C,OAAO,cAAc,UAAU,MAAM,QAAQ,KAAK;AAAA,cAClD,UAAU;AAAA,cACV,cAAc,aACZ,cAAc,YAAYA,OAAM,MAAM,QAAQ,KAAK,SAAS,GAAG,CACjE;AAAA,cACA,SAAS;AAAA,cACT,gBAAgB;AAAA,cAChB,YAAY;AAAA,cACZ,YAAY;AAAA,YACd;AAAA,YAEA;AAAA,8BAAAH,KAAC,UAAM,yBAAc;AAAA,cACrB,gBAAAA,KAACI,UAAA,EAAQ,OAAO,SAAS,YAAY,QAAQ,OAAK,MAChD,0BAAAJ;AAAA,gBAACK;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS;AAAA,kBACT,IAAI;AAAA,oBACF,OAAO,SACH,MAAM,QAAQ,QAAQ,OACtB,MAAM,QAAQ,KAAK;AAAA,oBACvB,WAAW,EAAE,OAAO,MAAM,QAAQ,KAAK,QAAQ;AAAA,oBAC/C,SAAS;AAAA,kBACX;AAAA,kBAEC,mBAAS,gBAAAL,KAAC,SAAU,UAAS,SAAQ,IAAK,gBAAAA,KAAC,QAAgB,UAAS,SAAQ;AAAA;AAAA,cAC/E,GACF;AAAA;AAAA;AAAA,QACF;AAAA,QACA,gBAAAA;AAAA,UAACE;AAAA,UAAA;AAAA,YACC,IAAI;AAAA,cACF,WAAW;AAAA,cACX,UAAU;AAAA,cACV,WAAW;AAAA,gBACT,SAAS;AAAA,gBACT,WAAW;AAAA,gBACX,SAAS;AAAA,gBACT,QAAQ;AAAA,gBACR,iBAAiB,gBAAgB;AAAA,gBACjC,OAAO,gBAAgB;AAAA,gBACvB,UAAU;AAAA,cACZ;AAAA,cACA,kCAAkC;AAAA,gBAChC,OAAO,gBAAgB;AAAA,gBACvB,WAAW;AAAA,cACb;AAAA,cACA,4EAA4E;AAAA,gBAC1E,OAAO,gBAAgB;AAAA,cACzB;AAAA,cACA,sEAAsE;AAAA,gBACpE,OAAO,gBAAgB;AAAA,cACzB;AAAA,cACA,gEAAgE;AAAA,gBAC9D,OAAO,gBAAgB;AAAA,cACzB;AAAA,cACA,yEAAyE;AAAA,gBACvE,OAAO,gBAAgB;AAAA,cACzB;AAAA,cACA,sDAAsD;AAAA,gBACpD,OAAO,gBAAgB;AAAA,cACzB;AAAA,YACF;AAAA,YAEA,0BAAAF,KAAC,SAAI,WAAW,iBAAiB,aAAa,IAAK,GAAG,OACpD,0BAAAA,KAAC,UAAK,WAAU,QAAQ,4BAAiB,GAC3C;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAM,sBAA0D,CAAC;AAAA,EAC/D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,uBAAuB;AACzB,MAAM;AAEJ,EAAAM,WAAU,MAAM;AACd,QAAI,OAAO,aAAa,YAAY,CAACC,OAAM,eAAe,QAAQ,GAAG;AACnE,kBAAY,KAAK,sFAA4E,EAAE,SAAS,CAAC;AAAA,IAC3G;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AACb,QAAM,CAAC,WAAW,YAAY,IAAIT,UAAwB,IAAI;AAC9D,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,UAAS,iBAAiB,KAAK;AACjF,QAAM,CAAC,SAAS,UAAU,IAAIA,UAA8B,IAAI;AAChE,QAAM,EAAE,iBAAiB,IAAI,kBAAkB;AAG/C,QAAM,uBAAuBU,aAAY,CAAC,UAA6C;AACrF,WAAO,MACJ,IAAI,CAAC,SAAS;AACb,YAAM,eAAe,KAAK,iBAAiB;AAC3C,YAAM,WAAW,KAAK,YAAY;AAElC,YAAM,cACJ;AAAA,QACE,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,cAAc;AAAA,QACd,cAAc;AAAA,QACd,cAAc;AAAA,QACd,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,MACZ,EAAE,KAAK,gBAAgB,KAAK;AAE9B,UAAI,CAAC,aAAa;AAChB,oBAAY,MAAM,mDAAmD;AAAA,UACnE;AAAA,UACA,qBAAqB,OAAO,KAAK,IAAI;AAAA,UACrC,wBAAwB,eAAe,OAAO,KAAK,YAAY,IAAI;AAAA,QACrE,CAAC;AACD,eAAO;AAAA,MACT;AAEA,YAAM,aAAa;AACnB,YAAM,WACH,iBAAiB,KAAK,IAAI,KAAK,KAAK,QACpC,iBAAiB,KAAK,QAAQ,KAAK,KAAK,YACzC;AACF,YAAM,YAAY,KAAK,cAAc,KAAK;AAC1C,YAAM,YAAY,WAAW,SAAS,KAAK,oBAAI,KAAK;AACpD,YAAM,WACH,iBAAiB,KAAK,QAAQ,KAAK,KAAK,YACxC,iBAAiB,KAAK,IAAI,KAAK,KAAK,QACrC;AACF,YAAM,eAAe,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU;AACvE,YAAM,mBAAmB,aAAa,KAAK,EAAE,SAAS;AACtD,YAAM,mBAAmB,kBAAkB,KAAK,UAAU;AAC1D,YAAM,iBACJ,QAAQ,KAAK,aAAa,KAC1B,iBAAiB,KAAK,KAAK,KAC1B,oBAAoB,CAAC;AAExB,kBAAY,MAAM,uCAAuC;AAAA,QACvD,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA,YAAY;AAAA,MACd,CAAC;AAED,YAAM,YAAY,cAAc,KAAK,SAAS,KAAK,CAAC;AACpD,YAAM,UAAU,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU;AAClE,YAAM,OAAO,OAAO,KAAK,SAAS,YAAY,OAAO,SAAS,KAAK,IAAI,IAAI,KAAK,OAAO;AACvF,YAAM,aACH,iBAAiB,KAAK,UAAU,KAAK,KAAK,cAC1C,iBAAiB,KAAK,MAAM,KAAK,KAAK,UACvC;AACF,YAAM,YAAa,iBAAiB,KAAK,SAAS,KAAK,KAAK,aAAc;AAC1E,YAAM,SAAU,iBAAiB,KAAK,MAAM,KAAK,KAAK,UAAW;AACjE,YAAM,MAAO,iBAAiB,KAAK,GAAG,KAAK,KAAK,OAAQ;AACxD,YAAM,UAAW,iBAAiB,KAAK,OAAO,KAAK,KAAK,WAAY;AACpE,YAAM,wBACJ,KAAK,kBAAkB,UAAU,KAAK,kBAAkB,SAAS,KAAK,gBAAgB;AACxF,YAAM,gBAAgB,0BAA0B,UAAU,SAAS;AACnE,YAAM,gBAAgB,KAAK,iBAAiB,kBAAkB;AAC9D,YAAM,gBAAgB,KAAK,iBAAiB,kBAAkB;AAC9D,YAAM,gBACH,iBAAiB,KAAK,KAAK,KAAK,KAAK,UACrC,iBAAiB,aAAa;AAEjC,YAAM,gBAA8B;AAAA,QAClC,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS,iBAAiB,KAAK;AAAA,QAC/B;AAAA,QACA,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,kBAAkB;AAAA,QAClB,OAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT,CAAC,EACA,OAAO,CAAC,QAA6B,QAAQ,IAAI;AAAA,EACtD,GAAG,CAAC,CAAC;AAGL,QAAM,wBAAwBT;AAAA,IAC5B,MAAO,cAAc,qBAAqB,WAAW,IAAI,CAAC;AAAA,IAC1D,CAAC,aAAa,oBAAoB;AAAA,EACpC;AAEA,QAAM,iBAAiBU,QAAuB,CAAC,CAAC;AAEhD,QAAM,qBAAqBV,SAAQ,MAAM;AACvC,QAAI,sBAAsB,SAAS,GAAG;AACpC,qBAAe,UAAU;AACzB,aAAO;AAAA,IACT;AAEA,QAAI,gBAAgB,QAAW;AAC7B,aAAO,eAAe;AAAA,IACxB;AAEA,mBAAe,UAAU,CAAC;AAC1B,WAAO,CAAC;AAAA,EACV,GAAG,CAAC,uBAAuB,WAAW,CAAC;AAEvC,QAAM,sBAAsB,mBAAmB,IAAI,CAAC,KAAK,UAAU,KAAK,QAAQ,CAAC,KAAK,IAAI,IAAI,EAAE;AAGhG,EAAAO,WAAU,MAAM;AACd,QAAI,eAAe,YAAY,SAAS,GAAG;AACzC,kBAAY,MAAM,0CAA0C;AAAA,QAC1D,iBAAiB,YAAY;AAAA,QAC7B,qBAAqB,sBAAsB;AAAA,MAC7C,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,aAAa,qBAAqB,CAAC;AAEvC,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,cAAe;AACpB,yBAAqB,IAAI;AACzB,UAAM,UAAU,WAAW,MAAM,qBAAqB,KAAK,GAAG,GAAI;AAClE,WAAO,MAAM,aAAa,OAAO;AAAA,EACnC,GAAG,CAAC,aAAa,CAAC;AAElB,QAAM,QAAQI,UAAS;AACvB,QAAM,eAAe,eAAe,KAAK;AAIzC,QAAM,mBAAmB,CAAC,QAAwB;AAEhD,QAAI,YAAY,IAAI,QAAQ,iDAAiD,EAAE;AAG/E,gBAAY,UACT;AAAA,MAAQ;AAAA,MAAyD,CAAC,GAAG,UACpE,MAAM,KAAK;AAAA,IACb,EACC,QAAQ,yBAAyB,EAAE;AAGtC,gBAAY,UAAU,QAAQ,iBAAiB,IAAI;AACnD,gBAAY,UAAU,QAAQ,iBAAiB,IAAI;AAGnD,gBAAY,gBAAgB,SAAS;AAErC,WAAO;AAAA,EACT;AAEA,QAAM,mBAAmBX,SAAQ,MAAM;AACrC,QAAI,OAAO,aAAa,UAAU;AAChC,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,iBAAiB,QAAQ;AAE3C,QAAI,CAAC,oBAAoB,QAAQ;AAC/B,aAAO;AAAA,IACT;AAEA,QAAI,oBAAoB,KAAK,SAAS,GAAG;AACvC,aAAO;AAAA,IACT;AAEA,WAAO,GAAG,SAAS;AAAA;AAAA;AAAA,EAAoB,oBAAoB,KAAK,IAAI,CAAC;AAAA,EACvE,GAAG,CAAC,UAAU,mBAAmB,CAAC;AAElC,QAAM,aAAsC;AAAA,IAC1C,KAAK;AAAA,IACL,KAAK,EAAE,UAAU,MAAM,OAAO,WAAW,OAAO,GAAG,UAAU,GAAmC;AAC9F,YAAM,cAAcQ,OAAM,SAAS,QAAQ,QAAQ,EAChD,IAAI,CAAC,UAAW,OAAO,UAAU,WAAW,QAAQ,EAAG,EACvD,KAAK,EAAE,EACP,KAAK;AAER,aACE,gBAAAP;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV;AAAA,UACA;AAAA,UACC,GAAG;AAAA,UACJ,IAAI;AAAA,YACF,SAAS;AAAA,YACT,iBAAiB,WAAW,KAAK,EAAE,QAAQ;AAAA,YAC3C,OAAO,WAAW,KAAK,EAAE,aAAa,UAAU;AAAA,YAChD,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ,cAAc;AAAA,YACd,YAAY;AAAA,YACZ,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,YAAY;AAAA,YACZ,OAAO;AAAA,YACP,UAAU;AAAA,UACZ;AAAA,UAEC;AAAA;AAAA,MACH;AAAA,IAEJ;AAAA,IACA,KAAK,EAAE,QAAQ,WAAW,UAAU,MAAM,OAAO,GAAG,UAAU,GAAmC;AAC/F,aACE,gBAAAF;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACC,GAAG;AAAA,UACJ;AAAA,UACA;AAAA,UAEC;AAAA;AAAA,MACH;AAAA,IAEJ;AAAA,IACA,EAAE,EAAE,MAAM,UAAU,MAAM,OAAO,OAAO,GAAG,YAAY,GAAgC;AACrF,aACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACC,GAAG;AAAA,UACJ,OAAO;AAAA,YACL,OAAO,MAAM,QAAQ,QAAQ;AAAA,YAC7B,gBAAgB;AAAA,YAChB,GAAI,SAAS,CAAC;AAAA,UAChB;AAAA,UACA,QAAO;AAAA,UACP,KAAI;AAAA,UACJ,SAAS,CAAC,MAAM,yBAAyB,GAAG,IAAI;AAAA,UAE/C;AAAA;AAAA,MACH;AAAA,IAEJ;AAAA,IACA,GAAG,EAAE,UAAU,MAAM,OAAO,WAAW,OAAO,GAAG,QAAQ,GAAiC;AAExF,YAAM,YACJ,MAAM,QAAQ,QAAQ,KAAK,SAAS,WAAW,IAAI,SAAS,CAAC,IAAI;AAEnE,UACE,aACA,OAAO,cAAc,YACrB,UAAU,SAAS,SACnB,UAAU,OAAO,WAAW,SAAS,aAAa,GAClD;AACA,cAAM,QAAQ,UAAU,MAAM;AAG9B,YAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,YAAY,MAAM,QAAQ;AACtE,iBAAO;AAAA,QACT;AAGF,eACE,gBAAAA;AAAA,UAACE;AAAA,UAAA;AAAA,YACC,IAAI;AAAA,cACF,YAAY;AAAA,cACZ,UAAU;AAAA,cACV,iBAAiB,MAAM,QAAQ,WAAW;AAAA,cAC1C,OAAO,MAAM,QAAQ,KAAK;AAAA,cAC1B,SAAS;AAAA,cACT,cAAc;AAAA,cACd,QAAQ,aAAa,MAAM,QAAQ,OAAO;AAAA,cAC1C,IAAI;AAAA,cACJ,SAAS;AAAA,YACX;AAAA,YAEC;AAAA;AAAA,QACH;AAAA,MAEF;AAEA,aACE,gBAAAF,KAAC,QAAG,WAAsB,OAAe,GAAG,SACzC,UACH;AAAA,IAEJ;AAAA,IACA,GAAG,EAAE,UAAU,MAAM,OAAO,OAAO,GAAG,iBAAiB,GAAiC;AACtF,YAAM,aAAaO,OAAM,SAAS,QAAQ,QAAQ;AAClD,YAAM,kBAAqC,CAAC;AAE5C,eAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,cAAM,OAAO,WAAW,CAAC;AAGzB,YAAI,OAAO,SAAS,YAAY,KAAK,KAAK,MAAM,KAAK;AACnD;AAAA,QACF;AAGA,YAAI,OAAO,SAAS,YAAY,KAAK,KAAK,EAAE,WAAW,GAAG,GAAG;AAC3D,0BAAgB;AAAA,YACd,gBAAAP;AAAA,cAACW;AAAA,cAAA;AAAA,gBAEC,IAAI;AAAA,kBACF,UAAU;AAAA,kBACV,OAAO,WAAW,KAAK,EAAE,aAAa;AAAA,kBACtC,WAAW;AAAA,kBACX,IAAI;AAAA,kBACJ,IAAI;AAAA,gBACN;AAAA,gBAEC,eAAK,QAAQ,SAAS,EAAE;AAAA;AAAA,cATpB,WAAW,CAAC;AAAA,YAUnB;AAAA,UACF;AAAA,QACF,OAAO;AACL,0BAAgB,KAAK,IAAI;AAAA,QAC3B;AAAA,MACF;AAEA,aACE,gBAAAX;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ,OAAO;AAAA,YACL,aAAa;AAAA,YACb,YAAY;AAAA,YACZ,eAAe;AAAA,YACf,GAAI,SAAS,CAAC;AAAA,UAChB;AAAA,UAEC;AAAA;AAAA,MACH;AAAA,IAEJ;AAAA,IAEA,GAAG,EAAE,UAAU,MAAM,OAAO,OAAO,GAAG,mBAAmB,GAAiC;AACxF,aACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ,OAAO;AAAA,YACL,aAAa;AAAA,YACb,WAAW;AAAA,YACX,cAAc;AAAA,YACd,WAAW;AAAA,YACX,GAAI,SAAS,CAAC;AAAA,UAChB;AAAA,UAEC,UAAAO,OAAM,SAAS,QAAQ,QAAQ,EAAE,OAAO,CAAC,UAAU;AAClD,gBAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,IAAK,QAAO;AAC9D,mBAAO;AAAA,UACT,CAAC;AAAA;AAAA,MACH;AAAA,IAEJ;AAAA,IACA,GAAG,EAAE,UAAU,MAAM,OAAO,OAAO,GAAG,cAAc,GAAiC;AACnF,YAAM,aAAaA,OAAM,SAAS,QAAQ,QAAQ;AAElD,UACE,WAAW,UAAU,KACrBA,OAAM,eAAe,WAAW,CAAC,CAAC,KAClC,WAAW,CAAC,EAAE,SAAS,UACvB;AAEA,YAAI,YAAY;AAChB,cAAM,cAAc,WAAW,CAAC;AAChC,YAAI,OAAO,YAAY,MAAM,aAAa,UAAU;AAClD,sBAAY,YAAY,MAAM;AAAA,QAChC,WAAW,MAAM,QAAQ,YAAY,MAAM,QAAQ,GAAG;AACpD,sBAAY,YAAY,MAAM,SAAS,KAAK,EAAE;AAAA,QAChD;AAEA,YAAI,WAAW,SAAS,iBAAiB,GAAG;AAC1C,sBAAY;AAAA,QACd;AACA,YAAI,OAAO,cAAc,YAAY,UAAU,KAAK,EAAE,SAAS,GAAG,GAAG;AAEnE,gBAAM,OAAO,WAAW,MAAM,CAAC;AAC/B,gBAAM,cAAc,KAAK;AAAA,YACvB,CAAC,OACC,OAAO,OAAO,YACbA,OAAM,eAAe,EAAE;AAAA,YAEtB,GAAG,SAASL;AAAA,UAClB;AACA,cAAI,aAAa;AAEf,kBAAM,eAAe,UAAU,QAAQ,SAAS,EAAE;AAClD,mBACE,gBAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,cAAc;AAAA,kBACd,YAAY;AAAA,kBACZ,YAAY;AAAA,kBACZ,GAAI,SAAS,CAAC;AAAA,gBAChB;AAAA,gBACC,GAAG;AAAA,gBAEJ;AAAA,kCAAAA,MAAC,YAAQ;AAAA;AAAA,oBAAa;AAAA,qBAAC;AAAA,kBACtB,KAAK,SAAS,KAAK,gBAAAA,MAAAW,WAAA,EAAE;AAAA;AAAA,oBAAE;AAAA,qBAAK;AAAA;AAAA;AAAA,YAC/B;AAAA,UAEJ;AAAA,QACF;AAAA,MACF;AAEA,UACE,WAAW,WAAW,KACtBL,OAAM,eAAe,WAAW,CAAC,CAAC,KAClC,WAAW,CAAC,EAAE,SAAS,YACvBA,OAAM,eAAe,WAAW,CAAC,CAAC,KAClC,WAAW,CAAC,EAAE,SAASL,MACvB;AACA,cAAM,QAAQ,WAAW,CAAC,EAAE,MAAM;AAClC,cAAM,OAAO,WAAW,CAAC,EAAE,MAAM;AACjC,eACE,gBAAAF;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,EAAE,cAAc,UAAU,YAAY,KAAK,YAAY,WAAW;AAAA,YACxE,GAAG;AAAA,YAEJ,0BAAAC,MAAC,UACC;AAAA,8BAAAD,KAAC,YAAQ,iBAAM;AAAA,cAAS;AAAA,cAAE;AAAA,eAC5B;AAAA;AAAA,QACF;AAAA,MAEJ;AACA,YAAM,eAAe;AACrB,YAAM,WAA8B,CAAC;AAErC,eAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC5C,cAAM,OAAO,aAAa,CAAC;AAE3B,YAAI,OAAO,SAAS,YAAY,KAAK,KAAK,MAAM,IAAK;AAGrD,YAAI,IAAI,KAAK,OAAO,SAAS,YAAY,KAAK,KAAK,EAAE,WAAW,GAAG,GAAG;AACpE,gBAAM,OAAO,aAAa,IAAI,CAAC;AAC/B,cAAIO,OAAM,eAAe,IAAI,KAAK,KAAK,SAAS,UAAU;AACxD,kBAAM,OAAO,KAAK,QAAQ,SAAS,EAAE;AACrC,kBAAM,UAAUA,OAAM,eAAe,IAAI,KAAK,KAAK,OAAO,OAAO,KAAK,MAAM,aAAa,CAAC;AAC1F,qBAAS,IAAI;AACb,qBAAS;AAAA,cACP,gBAAAN,MAAC,UACE;AAAA;AAAA,gBACA;AAAA,gBACA;AAAA,mBAHQ,YAAY,OAAO,EAI9B;AAAA,YACF;AACA;AAAA,UACF;AAAA,QACF;AACA,iBAAS,KAAK,IAAI;AAAA,MACpB;AAEA,aACE,gBAAAD;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ,OAAO;AAAA,YACL,cAAc;AAAA,YACd,YAAY;AAAA,YACZ,YAAY;AAAA,YACZ,GAAI,SAAS,CAAC;AAAA,UAChB;AAAA,UAEC;AAAA;AAAA,MACH;AAAA,IAEJ;AAAA,IACA,MAAM,EAAE,UAAU,MAAM,OAAO,WAAW,OAAO,GAAG,WAAW,GAAoC;AACjG,aACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAWa;AAAA,UACX;AAAA,UACA;AAAA,UACA,IAAI,EAAE,IAAI,GAAG,SAAS,MAAM,QAAQ,WAAW,MAAM;AAAA,UAErD,0BAAAb,KAAC,SAAM,MAAK,SAAS,GAAG,YACrB,UACH;AAAA;AAAA,MACF;AAAA,IAEJ;AAAA,IACA,MAAM,EAAE,UAAU,MAAM,OAAO,GAAG,eAAe,GAAoC;AACnF,aAAO,gBAAAA,KAAC,aAAW,GAAG,gBAAiB,UAAS;AAAA,IAClD;AAAA,IACA,MAAM,EAAE,UAAU,MAAM,OAAO,GAAG,eAAe,GAAoC;AACnF,YAAM,OAAOO,OAAM,SAAS,QAAQ,QAAQ,EAAE,OAAO,CAAC,QAAyB;AAE7E,YAAI,CAACA,OAAM,eAAe,GAAG,EAAG,QAAO;AAEvC,cAAM,QAAQA,OAAM,SAAS,QAAQ,IAAI,MAAM,QAAQ;AAEvD,eAAO,CAAC,MAAM;AAAA,UACZ,CAAC,SACCA,OAAM,eAAe,IAAI,KACzB,OAAO,KAAK,MAAM,aAAa,YAC/B,OAAO,KAAK,KAAK,MAAM,SAAS,KAAK,CAAC;AAAA,QAC1C;AAAA,MACF,CAAC;AACD,aAAO,gBAAAP,KAAC,aAAW,GAAG,gBAAiB,gBAAK;AAAA,IAC9C;AAAA,IACA,GAAG,EAAE,UAAU,MAAM,OAAO,GAAG,cAAc,GAAiC;AAC5E,aAAO,gBAAAA,KAAC,YAAU,GAAG,eAAgB,UAAS;AAAA,IAChD;AAAA,IACA,GAAG,EAAE,UAAU,MAAM,OAAO,OAAO,GAAG,eAAe,GAAiC;AACpF,aACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ,OAAO,UAAU,SAAS,SAAY;AAAA,UACtC,IAAI;AAAA,YACF,YAAY;AAAA,YACZ,OAAO,MAAM,QAAQ,KAAK;AAAA,YAC1B,SAAS,MAAM,QAAQ,OAAO;AAAA,YAC9B,WAAW;AAAA,YACX,SAAS;AAAA,YACT,YAAY;AAAA,UACd;AAAA,UAEC;AAAA;AAAA,MACH;AAAA,IAEJ;AAAA,IACA,GAAG,EAAE,UAAU,MAAM,OAAO,OAAO,GAAG,eAAe,GAAiC;AACpF,aACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ,OAAO,UAAU,SAAS,SAAY;AAAA,UACtC,IAAI;AAAA,YACF,OAAO,MAAM,QAAQ,KAAK;AAAA,YAC1B,UAAU;AAAA,YACV,SAAS;AAAA,YACT,eAAe;AAAA,UACjB;AAAA,UAEC;AAAA;AAAA,MACH;AAAA,IAEJ;AAAA,IACA,EAAE,EAAE,UAAU,MAAM,OAAO,WAAW,OAAO,GAAG,eAAe,GAAgC;AAE7F,YAAM,YAAYO,OAAM,SAAS,QAAQ,QAAQ,EAAE,KAAK;AACxD,YAAM,WAAW,UAAU;AAAA,QACzB,CAAC,UACC,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACV,OAAO,MAAM,SAAS,YACtB,CAAC,OAAO,OAAO,WAAW,MAAM,MAAM,OAAO,EAAE,SAAS,MAAM,IAAI;AAAA,MACtE;AAEA,UAAI,UAAU;AACZ,eAAO,gBAAAP,KAAAY,WAAA,EAAG,qBAAU;AAAA,MACtB;AAEA,aACE,gBAAAZ,KAACE,MAAA,EAAI,WAAU,OAAM,IAAI,EAAE,QAAQ,YAAY,GAC7C,0BAAAF;AAAA,QAACW;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,SAAQ;AAAA,UACR;AAAA,UACA;AAAA,UACA,IAAI,EAAE,OAAO,MAAM,QAAQ,KAAK,SAAS,YAAY,KAAK,SAAS,SAAS;AAAA,UAC3E,GAAG;AAAA,UAEH;AAAA;AAAA,MACH,GACF;AAAA,IAEJ;AAAA,EACF;AAEA,SACE,gBAAAV,MAAAW,WAAA,EACE;AAAA,oBAAAX;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,IAAI;AAAA,UACF,OAAO;AAAA,UACP,UAAU;AAAA,UACV,UAAU;AAAA,UACV,WAAW;AAAA,UACX,SAAS;AAAA,UACT,eAAe;AAAA,UACf,OAAO,aAAa,UAAU,MAAM,QAAQ,KAAK;AAAA,UACjD,IAAI,WAAW,MAAM;AAAA,UACrB,IAAI;AAAA,UACJ,YAAY;AAAA,UACZ,gCAAgC,EAAE,SAAS,EAAE;AAAA,QAC/C;AAAA,QAGA;AAAA,0BAAAF,KAACE,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,gBAAgB,YAAY,IAAI,IAAI,GAC9D,0BAAAD,MAACC,MAAA,EAAI,IAAI,EAAE,UAAU,EAAE,IAAI,QAAQ,IAAI,MAAM,GAAG,UAAU,EAAE,GAC1D;AAAA,4BAAAF;AAAA,cAACE;AAAA,cAAA;AAAA,gBACC,IAAI;AAAA,kBACF,SAAS,aAAa,cAAcC,OAAM,MAAM,QAAQ,OAAO,OAAO,IAAI;AAAA,kBAC1E,cAAc;AAAA,kBACd,IAAI;AAAA,kBACJ,IAAI;AAAA,kBACJ,WAAW;AAAA,kBACX,YAAY;AAAA,kBACZ,cAAc;AAAA,gBAChB;AAAA,gBAEA,0BAAAH;AAAA,kBAACW;AAAA,kBAAA;AAAA,oBACC,IAAI;AAAA,sBACF,OAAO,MAAM,QAAQ,KAAK;AAAA,sBAC1B,YAAY;AAAA,sBACZ,WAAW;AAAA,sBACX,YAAY;AAAA,oBACd;AAAA,oBAEC;AAAA;AAAA,gBACH;AAAA;AAAA,YACF;AAAA,YAEC,UAAU,OAAO,SAAS,KACzB,gBAAAX,KAACE,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,KAAK,GAAG,IAAI,GAAG,UAAU,QAAQ,gBAAgB,WAAW,GACrF,iBAAO,IAAI,CAAC,KAAK,MAChB,gBAAAF;AAAA,cAAC;AAAA;AAAA,gBAEC,KAAK;AAAA,gBACL,SAAQ;AAAA,gBACR,SAAS,MAAM,aAAa,GAAG;AAAA,gBAC/B,IAAI;AAAA,kBACF,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,cAAc;AAAA,kBACd,QAAQ,aAAaG,OAAM,MAAM,QAAQ,KAAK,SAAS,IAAI,CAAC;AAAA,kBAC5D,QAAQ;AAAA,kBACR,WAAW,EAAE,WAAW,aAAa,MAAM,QAAQ,QAAQ,IAAI,GAAG;AAAA,gBACpE;AAAA;AAAA,cAXK;AAAA,YAYP,CACD,GACH;AAAA,aAEJ,GACF;AAAA,UAGA,gBAAAF,MAACC,MAAA,EAAI,IAAI,EAAE,UAAU,YAAY,OAAO,QAAQ,UAAU,EAAE,IAAI,QAAQ,IAAI,QAAQ,EAAE,GACnF;AAAA,yBACC,gBAAAF;AAAA,cAACE;AAAA,cAAA;AAAA,gBACC,IAAI;AAAA,kBACF,UAAU;AAAA,kBACV,KAAK;AAAA,kBACL,MAAM;AAAA,kBACN,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,KAAK;AAAA,kBACL,QAAQ;AAAA,gBACV;AAAA,gBAEA,0BAAAF,KAACW,aAAA,EAAW,SAAQ,WAAU,IAAI,EAAE,WAAW,UAAU,SAAS,KAAK,GAAG,8BAE1E;AAAA;AAAA,YACF;AAAA,YAED,qBACC,gBAAAV;AAAA,cAACC;AAAA,cAAA;AAAA,gBACC,IAAI;AAAA,kBACF,UAAU;AAAA,kBACV,KAAK;AAAA,kBACL,OAAO;AAAA,kBACP,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,KAAK;AAAA,kBACL,WAAW;AAAA,kBACX,QAAQ;AAAA,gBACV;AAAA,gBAEA;AAAA,kCAAAF,KAAC,SAAI,KAAK,WAAW,KAAI,UAAS,OAAO,EAAE,OAAO,IAAI,QAAQ,GAAG,GAAG;AAAA,kBACpE,gBAAAA;AAAA,oBAACW;AAAA,oBAAA;AAAA,sBACC,SAAQ;AAAA,sBACR,IAAI,EAAE,OAAO,aAAa,YAAY,WAAW,SAAS;AAAA,sBAC3D;AAAA;AAAA,kBAED;AAAA;AAAA;AAAA,YACF;AAAA,YAEF,gBAAAX,KAACE,MAAA,EAAI,IAAI,EAAE,OAAO,QAAQ,UAAU,OAAO,GACxC,iBAAO,aAAa,WACnB,gBAAAF;AAAA,cAAC;AAAA;AAAA,gBACC,eAAe,CAAC,SAAS;AAAA,gBACzB,eAAe,CAAC,WAAW,CAAC,gBAAgB,sBAAsB,CAAC;AAAA,gBACnE;AAAA,gBAEC,8BAAoB,iBAAiB,QAAQ;AAAA;AAAA,YAChD,IACEO,OAAM,eAAe,QAAQ,IAC/B,WAEA,gBAAAP,KAACW,aAAA,EAAW,OAAM,SAAQ,8CAAsB,GAEpD;AAAA,aACF;AAAA,UAIC,CAAC,EAAE,gBAAiB,OAAO,aAAa,YAAY,aACnD,gBAAAX;AAAA,YAACE;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,IACE,uBACI;AAAA,gBACE,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,kBAAkB,EAAE,SAAS,EAAE;AAAA,cACjC,IACA;AAAA,cAGN,0BAAAF,KAAC,kCAAqB,MAAO,gBAAiB,UAAgC;AAAA;AAAA,UAChF;AAAA,UAED,sBAAsB,mBAAmB,SAAS,KACjD,gBAAAA,KAACE,MAAA,EAAI,IAAI,EAAE,IAAI,KAAK,SAAS,QAAQ,KAAK,GAAG,UAAU,QAAQ,gBAAgB,aAAa,GACzF,6BAAmB,IAAI,CAAC,KAAK,QAAQ;AACpC,wBAAY,MAAM,yCAAyC;AAAA,cACzD,OAAO;AAAA,cACP,IAAI,IAAI;AAAA,cACR,MAAM,IAAI;AAAA,YACZ,CAAC;AACD,mBACE,gBAAAF;AAAA,cAAC;AAAA;AAAA,gBAEC;AAAA,gBACA,QAAQ,MAAM,WAAW,GAAG;AAAA,gBAC5B,SAAQ;AAAA,gBACR,uBAAuB;AAAA,gBACvB,kBAAkB;AAAA;AAAA,cALb;AAAA,YAMP;AAAA,UAEJ,CAAC,GACH;AAAA;AAAA;AAAA,IAEJ;AAAA,IAGA,gBAAAA,KAAC,SAAM,MAAM,CAAC,CAAC,WAAW,SAAS,MAAM,aAAa,IAAI,GACxD,0BAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,IAAI;AAAA,UACF,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,gBAAgB;AAAA,UAChB,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,GAAG;AAAA,UACH,UAAU;AAAA,QACZ;AAAA,QAEA;AAAA,0BAAAF;AAAA,YAACK;AAAA,YAAA;AAAA,cACC,SAAS,MAAM,aAAa,IAAI;AAAA,cAChC,IAAI;AAAA,gBACF,UAAU;AAAA,gBACV,KAAK;AAAA,gBACL,OAAO;AAAA,gBACP,OAAO;AAAA,gBACP,SAAS;AAAA,gBACT,WAAW;AAAA,kBACT,SAAS;AAAA,gBACX;AAAA,cACF;AAAA,cAEA,0BAAAL,KAAC,KAAU;AAAA;AAAA,UACb;AAAA,UACA,gBAAAA;AAAA,YAACE;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,KAAK,aAAa;AAAA,cAClB,KAAI;AAAA,cACJ,IAAI;AAAA,gBACF,WAAW;AAAA,gBACX,UAAU;AAAA,gBACV,cAAc;AAAA,gBACd,WAAW;AAAA,gBACX,QAAQ;AAAA,cACV;AAAA,cACA,SAAS,MAAM,aAAa,IAAI;AAAA;AAAA,UAClC;AAAA;AAAA;AAAA,IACF,GACF;AAAA,IACA,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,CAAC,CAAC;AAAA,QACR,SAAS,MAAM,WAAW,IAAI;AAAA,QAC9B,KAAK;AAAA,QACL,kBAAkB,WAAW,MAAM;AACjC,gBAAM,WAAW,iBAAiB,OAAO;AACzC,sBAAY,MAAM,qCAAqC;AAAA,YACrD,YAAY,QAAQ;AAAA,YACpB,MAAM,QAAQ;AAAA,YACd;AAAA,UACF,CAAC;AACD,iBAAO;AAAA,QACT,GAAG,IAAI;AAAA;AAAA,IACT;AAAA,KACF;AAEJ;AAEA,IAAO,iCAAQ;;;AOzqCf,SAAgB,YAAAc,WAAU,eAAAC,cAAa,UAAAC,eAAc;AACrD,SAAS,oBAAoB;AAC7B;AAAA,EACE,UAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAAC;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC;AAAA,EACA;AAAA,EACA,SAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC;AAAA,EACA,oBAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAAC;AAAA,EACA;AAAA,OACK;AACP,SAAS,KAAK,WAAW,OAAO,eAAe,aAAa,eAAe,cAAc,gBAAgB,cAAc,UAAU,iBAAiB,aAAa,UAAU,iBAAiB,aAAa,gBAAgB,SAAS,YAAY,QAAQ,gBAAgB;AAYpQ,SAAS,YAAAC,WAAU,SAAAC,cAAa;AAuX5B,qBAAAC,WAEE,OAAAC,MAgGM,QAAAC,aAlGR;AA/WJ,IAAM,qBAAyC;AAAA,EAC7C,KAAK;AAAA,IACH,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,SAAS;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,aAAa;AAAA,IACX,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA,IACL,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AACF;AAEA,IAAM,qBAAyC;AAAA,EAC7C,KAAK;AAAA,IACH,OAAO;AAAA,IACP,aAAa;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,aAAa;AAAA,IACb,OAAO;AAAA,EACT;AACF;AAEA,IAAM,UAAU;AAAA,EACd,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,SAAS;AACX;AAEO,IAAM,gBAA8C,CAAC;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,QAAQC,UAAS;AACvB,QAAM,WAAWC,eAAc,MAAM,YAAY,KAAK,IAAI,CAAC;AAC3D,QAAM,eAAeC,QAAyB,IAAI;AAGlD,QAAM,EAAE,cAAc,IAAI,cAAc;AACxC,QAAM,EAAE,cAAc,IAAI,qBAAqB;AAC/C,QAAM,EAAE,SAAS,IAAI,wBAAwB;AAG7C,QAAM,CAAC,UAAU,WAAW,IAAIC,UAAmC;AAAA,IACjE,OAAO;AAAA,IACP,aAAa;AAAA,IACb,UAAU;AAAA,IACV,UAAU;AAAA,IACV,cAAc;AAAA,IACd,QAAQ,CAAC;AAAA,IACT,aAAa,CAAC;AAAA,IACd,gBAAgB;AAAA;AAAA,EAClB,CAAC;AAED,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,KAAK;AACtD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAuC,MAAM;AACrF,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,EAAE;AACnD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,KAAK;AACtD,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAS,EAAE;AACzD,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,UAAS,KAAK;AAChE,QAAM,iBAAiBD,QAAsB,IAAI;AACjD,QAAM,kBAAkBA,QAAsB,IAAI;AAGlD,QAAM,iBAAiBE,aAAY,MAAM;AACvC,UAAM,KAAK,UAAU;AACrB,QAAI,cAAc;AAClB,QAAI,iBAAiB;AAErB,QAAI,GAAG,SAAS,QAAQ,GAAG;AACzB,oBAAc;AACd,uBAAiB,GAAG,MAAM,mBAAmB,IAAI,CAAC,KAAK;AAAA,IACzD,WAAW,GAAG,SAAS,SAAS,GAAG;AACjC,oBAAc;AACd,uBAAiB,GAAG,MAAM,oBAAoB,IAAI,CAAC,KAAK;AAAA,IAC1D,WAAW,GAAG,SAAS,QAAQ,GAAG;AAChC,oBAAc;AACd,uBAAiB,GAAG,MAAM,oBAAoB,IAAI,CAAC,KAAK;AAAA,IAC1D;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU,UAAU;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,CAAC;AAGL,QAAM,oBAAoB,CAAC,UAAiC,CAC1D,UACG;AACH,gBAAY,WAAS;AAAA,MACnB,GAAG;AAAA,MACH,CAAC,KAAK,GAAG,MAAM,OAAO;AAAA,IACxB,EAAE;AAAA,EACJ;AAGA,QAAM,mBAAmB,CAAC,UAA+C;AACvE,UAAM,QAAQ,MAAM,OAAO;AAC3B,QAAI,CAAC,SAAS,MAAM,WAAW,EAAG;AAElC,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,KAAK,KAAK,WAAW,QAAQ,GAAG;AAElC,YAAM,SAAS,IAAI,WAAW;AAC9B,aAAO,SAAS,CAAC,MAAM;AACrB,cAAM,SAAS,EAAE,QAAQ;AACzB,oBAAY,WAAS;AAAA,UACnB,GAAG;AAAA,UACH,QAAQ,CAAC,MAAM;AAAA;AAAA,QACjB,EAAE;AAAA,MACJ;AACA,aAAO,cAAc,IAAI;AAAA,IAC3B,OAAO;AAEL,yBAAmB,yDAAoD;AACvE,sBAAgB,IAAI;AAAA,IACtB;AAGA,QAAI,MAAM,QAAQ;AAChB,YAAM,OAAO,QAAQ;AAAA,IACvB;AAAA,EACF;AAGA,QAAM,cAAc,MAAM;AACxB,gBAAY,WAAS;AAAA,MACnB,GAAG;AAAA,MACH,QAAQ,CAAC;AAAA,IACX,EAAE;AAAA,EACJ;AAGA,QAAM,uBAAuB,YAAY;AACvC,QAAI,CAAC,SAAS,SAAS,CAAC,EAAG;AAE3B,QAAI;AAEF,YAAM,aAAa,SAAS,OAAO,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC;AAClD,YAAM,iBAAiB,KAAK,UAAU;AACtC,YAAM,cAAc,IAAI,MAAM,eAAe,MAAM;AACnD,eAAS,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK;AAC9C,oBAAY,CAAC,IAAI,eAAe,WAAW,CAAC;AAAA,MAC9C;AACA,YAAM,YAAY,IAAI,WAAW,WAAW;AAC5C,YAAM,OAAO,IAAI,KAAK,CAAC,SAAS,GAAG,EAAE,MAAM,YAAY,CAAC;AAGxD,YAAM,UAAU,UAAU,MAAM;AAAA,QAC9B,IAAI,cAAc;AAAA,UAChB,aAAa;AAAA,QACf,CAAC;AAAA,MACH,CAAC;AAED,yBAAmB,8DAAuD;AAC1E,sBAAgB,IAAI;AAAA,IACtB,SAAS,OAAO;AACd,cAAQ,MAAM,sCAAsC,KAAK;AACzD,yBAAmB,sDAAiD;AACpE,sBAAgB,IAAI;AAAA,IACtB;AAAA,EACF;AAEA,QAAM,yBAAyB,CAAC,UAA4C;AAC1E,QAAI,CAAC,SAAU;AACf,UAAM,QAAQ,MAAM,QAAQ,CAAC;AAC7B,mBAAe,UAAU,MAAM;AAC/B,oBAAgB,UAAU,MAAM;AAAA,EAClC;AAEA,QAAM,wBAAwB,CAAC,UAA4C;AACzE,QAAI,CAAC,SAAU;AACf,QAAI,eAAe,YAAY,KAAM;AACrC,oBAAgB,UAAU,MAAM,QAAQ,CAAC,EAAE;AAAA,EAC7C;AAEA,QAAM,uBAAuB,MAAM;AACjC,QAAI,CAAC,SAAU;AACf,QAAI,eAAe,YAAY,QAAQ,gBAAgB,YAAY,MAAM;AACvE,qBAAe,UAAU;AACzB,sBAAgB,UAAU;AAC1B;AAAA,IACF;AAEA,UAAM,QAAQ,gBAAgB,UAAU,eAAe;AACvD,mBAAe,UAAU;AACzB,oBAAgB,UAAU;AAE1B,QAAI,QAAQ,IAAI;AACd,kBAAY;AAAA,IACd;AAAA,EACF;AAGA,QAAM,mBAAmB,CAAC,UAAkB;AAC1C,gBAAY,WAAS;AAAA,MACnB,GAAG;AAAA,MACH,aAAa,KAAK,aAAa,OAAO,CAAC,GAAG,MAAM,MAAM,KAAK,KAAK,CAAC;AAAA,IACnE,EAAE;AAAA,EACJ;AAGA,QAAM,iBAAiBA,aAAY,MAAM;AACvC,UAAM,sBAAsB,cAAc,CAAC;AAC3C,WAAO;AAAA,MACL,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,gBAAgB,qBAAqB,MAAM;AAAA,MAC3C,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AAAA,EACF,GAAG,CAAC,eAAe,aAAa,CAAC;AAGjC,QAAM,eAAe,YAAY;AAC/B,QAAI,CAAC,SAAS,OAAO,KAAK,KAAK,CAAC,SAAS,aAAa,KAAK,GAAG;AAC5D,sBAAgB,2CAA2C;AAC3D;AAAA,IACF;AAGA,QAAI,SAAS,UAAU,SAAS,OAAO,SAAS,GAAG;AACjD,2BAAqB,IAAI;AACzB;AAAA,IACF;AAGA,UAAM,cAAc;AAAA,EACtB;AAGA,QAAM,gBAAgB,YAAY;AAChC,oBAAgB,IAAI;AACpB,oBAAgB,EAAE;AAClB,yBAAqB,KAAK;AAE1B,QAAI;AAEF,YAAM,aAAa,UAAU;AAC7B,UAAI,CAAC,YAAY;AACf,cAAM,IAAI,MAAM,gCAAgC;AAAA,MAClD;AAEA,YAAM,iBAAiB,IAAI;AAAA,QACzB;AAAA,QACA,MAAM,sBAAsB,SAAS;AAAA,QACrC,iBAAiB,UAAU;AAAA,MAC7B;AAGA,YAAM,kBAAmC;AAAA,QACvC,OAAO,SAAS;AAAA,QAChB,aAAa,SAAS;AAAA,QACtB,UAAU,SAAS,YAAY;AAAA,QAC/B,UAAU,SAAS,YAAY;AAAA,QAC/B,gBAAgB,SAAS;AAAA,QACzB,QAAQ,SAAS;AAAA,QACjB,aAAa,SAAS;AAAA,QACtB,cAAc,SAAS;AAAA,QACvB,WAAW,UAAU;AAAA,QACrB,aAAa,eAAe;AAAA,QAC5B,aAAa,eAAe;AAAA,MAC9B;AAGA,qBAAe,eAAe,eAAe,EAAE,UAAU;AAAA,QACvD,MAAM,OAAO,aAA+B;AAE1C,cAAI,SAAS,UAAU,SAAS,OAAO,SAAS,GAAG;AACjD,kBAAM,qBAAqB;AAAA,UAC7B;AAEA,cAAI,UAAU,WAAW;AAEvB,mBAAO,SAAS,OAAO,SAAS;AAAA,UAClC;AAEA,0BAAgB,SAAS;AAGzB,qBAAW,MAAM;AACf,wBAAY;AAAA,UACd,GAAG,GAAI;AAAA,QACT;AAAA,QACA,OAAO,CAAC,mBAA4B;AAClC,kBAAQ,MAAM,8BAA8B,cAAc;AAC1D,0BAAgB,8CAA8C;AAC9D,0BAAgB,OAAO;AACvB,0BAAgB,KAAK;AAAA,QACvB;AAAA,QACA,UAAU,MAAM;AACd,0BAAgB,KAAK;AAAA,QACvB;AAAA,MACF,CAAC;AAAA,IAEH,SAAS,OAAO;AACd,cAAQ,MAAM,kCAAkC,KAAK;AACrD,sBAAgB,yDAAyD;AACzE,sBAAgB,OAAO;AACvB,sBAAgB,KAAK;AAAA,IACvB;AAAA,EACF;AAGA,QAAM,cAAc,MAAM;AACxB,gBAAY;AAAA,MACV,OAAO;AAAA,MACP,aAAa;AAAA,MACb,UAAU;AAAA,MACV,UAAU;AAAA,MACV,cAAc;AAAA,MACd,QAAQ,CAAC;AAAA,MACT,aAAa,CAAC;AAAA,MACd,gBAAgB;AAAA,IAClB,CAAC;AACD,oBAAgB,MAAM;AACtB,oBAAgB,EAAE;AAClB,oBAAgB,KAAK;AACrB,uBAAmB,EAAE;AACrB,yBAAqB,KAAK;AAC1B,YAAQ;AAAA,EACV;AAEA,QAAM,mBAAmB,mBAAmB,SAAS,QAAoC;AACzF,QAAM,mBAAmB,mBAAmB,SAAS,QAAoC;AACzF,QAAM,gBAAgB,QAAQ,kBAAkB,IAA4B,KAAK;AAEjF,QAAM,UAAU,CAAC,CAAC,SAAS,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS,aAAa,KAAK;AAEzE,SACE,gBAAAC,MAAAC,WAAA,EAEE;AAAA,oBAAAC,KAAC,gBAAa,QAAQ;AAAA,MACpB,uBAAuB;AAAA,QACrB,OAAO;AAAA,MACT;AAAA,MACA,6BAA6B;AAAA,QAC3B,YAAY;AAAA,MACd;AAAA,MACA,6BAA6B;AAAA,QAC3B,iBAAiB;AAAA,QACjB,cAAc;AAAA,QACd,QAAQ;AAAA,MACV;AAAA,IACF,GAAG;AAAA,IACH,gBAAAF;AAAA,MAACG;AAAA,MAAA;AAAA,QACC;AAAA,QACA,SAAS;AAAA,QACT,UAAS;AAAA,QACT,WAAS;AAAA,QACT,YAAY;AAAA,QACZ,qBAAqB;AAAA,QACrB,QAAO;AAAA,QACP,YAAY;AAAA,UACV,IAAI;AAAA,YACF,cAAc,WAAW,IAAI;AAAA,YAC7B,SAAS,MAAM,QAAQ,WAAW;AAAA,YAClC,iBAAiB,MAAM,QAAQ,SAAS,SACpC,oFACA;AAAA,YACJ,gBAAgB;AAAA,YAChB,QAAQ,aAAa,MAAM,QAAQ,SAAS,SAAS,0BAA0B,kBAAkB;AAAA,YACjG,WAAW,MAAM,QAAQ,SAAS,SAC9B,mEACA;AAAA,YACJ,UAAU;AAAA,YACV,SAAS;AAAA,YACT,eAAe;AAAA;AAAA;AAAA,YAGf,QAAQ,WAAW,WAAW;AAAA,YAC9B,WAAW,WAAW,WAAW;AAAA,YACjC,QAAQ,WAAW,IAAI;AAAA,YACvB,UAAU;AAAA,UACZ;AAAA,QACF;AAAA,QACA,eAAe;AAAA,UACb,IAAI;AAAA,YACF,SAAS,MAAM,QAAQ,SAAS,SAC5B,uBACA;AAAA,YACJ,gBAAgB;AAAA,UAClB;AAAA,QACF;AAAA,QACA,IAAI;AAAA,UACF,0BAA0B;AAAA,YACxB,YAAY;AAAA,YACZ,gBAAgB;AAAA,UAClB;AAAA,QACF;AAAA,QAGA;AAAA,0BAAAH;AAAA,YAAC;AAAA;AAAA,cACC,cAAc;AAAA,cACd,aAAa;AAAA,cACb,YAAY;AAAA,cACZ,IAAI;AAAA,gBACF,SAAS;AAAA,gBACT,eAAe;AAAA,gBACf,KAAK,WAAW,OAAO;AAAA,gBACvB,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,gBACnB,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,gBACnB,IAAI,EAAE,IAAI,WAAW,MAAM,GAAG,IAAI,EAAE;AAAA,gBACpC,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,gBACrB,aAAa;AAAA,cACf;AAAA,cAEC;AAAA,4BACC,gBAAAE;AAAA,kBAACE;AAAA,kBAAA;AAAA,oBACC,IAAI;AAAA,sBACF,OAAO;AAAA,sBACP,QAAQ;AAAA,sBACR,cAAc;AAAA,sBACd,SAASC,OAAM,MAAM,QAAQ,KAAK,SAAS,IAAI;AAAA,sBAC/C,WAAW;AAAA,sBACX,IAAI;AAAA,oBACN;AAAA;AAAA,gBACF;AAAA,gBAEF,gBAAAL;AAAA,kBAACI;AAAA,kBAAA;AAAA,oBACC,IAAI;AAAA,sBACF,SAAS;AAAA,sBACT,YAAY;AAAA,sBACZ,gBAAgB;AAAA,sBAChB,KAAK;AAAA,sBACL,OAAO;AAAA,oBACT;AAAA,oBAEA;AAAA,sCAAAJ,MAAC,SAAM,SAAS,KAAK,IAAI,EAAE,UAAU,EAAE,GACrC;AAAA,wCAAAE,KAACI,aAAA,EAAW,SAAQ,MAAK,YAAW,QAAO,QAAM,MAAC,2BAAa;AAAA,wBAC/D,gBAAAJ,KAACI,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,QAAM,MAAC,uCAAyB;AAAA,yBACrF;AAAA,sBACA,gBAAAJ,KAACK,aAAA,EAAW,SAAS,aAAa,MAAK,SAAQ,0BAAAL,KAAC,aAAU,GAAE;AAAA;AAAA;AAAA,gBAC9D;AAAA;AAAA;AAAA,UACF;AAAA,UACA,gBAAAF;AAAA,YAAC;AAAA;AAAA,cACC,IAAI;AAAA,gBACF,GAAG,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,gBACpB,WAAW;AAAA,gBACX,WAAW;AAAA,gBACX,iBAAiB;AAAA,gBACjB,iBAAiB;AAAA,cACnB;AAAA,cAID;AAAA,iCAAiB,aAChB,gBAAAA;AAAA,kBAACQ;AAAA,kBAAA;AAAA,oBACC,UAAS;AAAA,oBACT,IAAI;AAAA,sBACF,IAAI;AAAA,sBACJ,oBAAoB;AAAA,wBAClB,OAAO,MAAM,QAAQ,QAAQ;AAAA,sBAC/B;AAAA,sBACA,YAAY,MAAM,QAAQ,SAAS,SAC/B,8EACA;AAAA,sBACJ,QAAQ,aAAa,MAAM,QAAQ,QAAQ,IAAI;AAAA,sBAC/C,cAAc;AAAA,oBAChB;AAAA,oBAEA;AAAA,sCAAAN,KAACI,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,YAAY,IAAI,GAAG,8CAErD;AAAA,sBACA,gBAAAJ,KAACI,aAAA,EAAW,SAAQ,WAAU,SAAQ,SAAQ,IAAI,EAAE,IAAI,KAAK,SAAS,IAAI,GACvE,mBAAS,UAAU,SAAS,OAAO,SAAS,IACzC,kIACC,SAAS,eAAe,SAAS,YAAY,SAAS,IACvD,6GACA,4DAEN;AAAA;AAAA;AAAA,gBACF;AAAA,gBAGD,gBACC,gBAAAJ;AAAA,kBAACM;AAAA,kBAAA;AAAA,oBACC,UAAS;AAAA,oBACT,IAAI;AAAA,sBACF,IAAI;AAAA,sBACJ,oBAAoB;AAAA,wBAClB,OAAO,MAAM,QAAQ,MAAM;AAAA,sBAC7B;AAAA,sBACA,YAAY,MAAM,QAAQ,SAAS,SAC/B,8EACA;AAAA,sBACJ,QAAQ,aAAa,MAAM,QAAQ,MAAM,IAAI;AAAA,sBAC7C,cAAc;AAAA,oBAChB;AAAA,oBAEC;AAAA;AAAA,gBACH;AAAA,gBAGA,gBAAAR;AAAA,kBAACI;AAAA,kBAAA;AAAA,oBACC,IAAI;AAAA,sBACF,SAAS;AAAA,sBACT,kBAAkB;AAAA,sBAClB,QAAQ;AAAA,sBACR,WAAW;AAAA,sBACX,OAAO;AAAA;AAAA;AAAA;AAAA,sBAIP,IAAI;AAAA,oBACN;AAAA,oBAGF;AAAA,sCAAAJ;AAAA,wBAACI;AAAA,wBAAA;AAAA,0BACC,IAAI;AAAA,4BACF,SAAS;AAAA,4BACT,qBAAqB,EAAE,IAAI,OAAO,IAAI,UAAU;AAAA,4BAChD,kBAAkB;AAAA,4BAClB,KAAK;AAAA,4BACL,IAAI;AAAA,0BACN;AAAA,0BAGA;AAAA,4CAAAF;AAAA,8BAAC;AAAA;AAAA,gCACC,WAAS;AAAA,gCACT,OAAM;AAAA,gCACN,OAAO,SAAS;AAAA,gCAChB,UAAU,kBAAkB,OAAO;AAAA,gCACnC,aAAY;AAAA,gCACZ,UAAQ;AAAA,gCACR,MAAK;AAAA,gCACL,iBAAiB,EAAE,QAAQ,KAAK;AAAA,gCAChC,IAAI;AAAA,kCACF,WAAW;AAAA,kCACX,YAAY;AAAA,kCACZ,wBAAwB;AAAA,oCACtB,WAAW;AAAA,kCACb;AAAA,kCACA,4BAA4B;AAAA,oCAC1B,cAAc;AAAA,oCACd,YAAY;AAAA,oCACZ,WAAW;AAAA,sCACT,WAAW;AAAA,sCACX,WAAW,MAAM,QAAQ,SAAS,SAC9B,+BACA;AAAA,oCACN;AAAA,oCACA,iBAAiB;AAAA,sCACf,WAAW;AAAA,sCACX,WAAW,MAAM,QAAQ,SAAS,SAC9B,+BACA;AAAA,oCACN;AAAA,kCACF;AAAA,gCACF;AAAA;AAAA,4BACF;AAAA,4BAEA,gBAAAF;AAAA,8BAAC;AAAA;AAAA,gCACC,WAAS;AAAA,gCACT,MAAK;AAAA,gCACL,IAAI;AAAA,kCACF,WAAW;AAAA,kCACX,wBAAwB;AAAA,oCACtB,WAAW;AAAA,kCACb;AAAA,kCACA,4BAA4B;AAAA,oCAC1B,cAAc;AAAA,oCACd,YAAY;AAAA,oCACZ,WAAW;AAAA,sCACT,WAAW;AAAA,sCACX,WAAW,MAAM,QAAQ,SAAS,SAC9B,+BACA;AAAA,oCACN;AAAA,oCACA,iBAAiB;AAAA,sCACf,WAAW;AAAA,sCACX,WAAW,MAAM,QAAQ,SAAS,SAC9B,+BACA;AAAA,oCACN;AAAA,kCACF;AAAA,gCACF;AAAA,gCAEA;AAAA,kDAAAE,KAAC,cAAW,QAAM,MAAC,IAAG,kBAAiB,sBAAQ;AAAA,kCAC/C,gBAAAA;AAAA,oCAAC;AAAA;AAAA,sCACC,SAAQ;AAAA,sCACR,IAAG;AAAA,sCACH,OAAO,SAAS;AAAA,sCAChB,OAAM;AAAA,sCACN,UAAU,kBAAkB,UAAU;AAAA,sCAErC,iBAAO,QAAQ,kBAAkB,EAAE,IAAI,CAAC,CAAC,KAAK,QAAQ,MAAM;AAC3D,8CAAM,OAAO,QAAQ,SAAS,IAA4B;AAC1D,+CACE,gBAAAA,KAAC,YAAmB,OAAO,KACzB,0BAAAF,MAACI,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,IAAI,GACzD;AAAA,0DAAAF,KAAC,QAAK,MAAM,IAAI,OAAO,SAAS,OAAO;AAAA,0CACvC,gBAAAF,MAACI,MAAA,EACC;AAAA,4DAAAF,KAACI,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,YAAY,IAAI,GAAI,mBAAS,OAAM;AAAA,4CACrE,gBAAAJ,KAACI,aAAA,EAAW,SAAQ,WAAU,OAAM,kBACjC,mBAAS,aACZ;AAAA,6CACF;AAAA,2CACF,KATa,GAUf;AAAA,sCAEJ,CAAC;AAAA;AAAA,kCACH;AAAA;AAAA;AAAA,4BACF;AAAA,4BAEA,gBAAAN;AAAA,8BAAC;AAAA;AAAA,gCACC,WAAS;AAAA,gCACT,MAAK;AAAA,gCACL,IAAI;AAAA,kCACF,WAAW;AAAA,kCACX,wBAAwB;AAAA,oCACtB,WAAW;AAAA,kCACb;AAAA,kCACA,4BAA4B;AAAA,oCAC1B,cAAc;AAAA,oCACd,YAAY;AAAA,oCACZ,WAAW;AAAA,sCACT,WAAW;AAAA,sCACX,WAAW,MAAM,QAAQ,SAAS,SAC9B,+BACA;AAAA,oCACN;AAAA,oCACA,iBAAiB;AAAA,sCACf,WAAW;AAAA,sCACX,WAAW,MAAM,QAAQ,SAAS,SAC9B,+BACA;AAAA,oCACN;AAAA,kCACF;AAAA,gCACF;AAAA,gCAEA;AAAA,kDAAAE,KAAC,cAAW,QAAM,MAAC,IAAG,kBAAiB,sBAAQ;AAAA,kCAC/C,gBAAAA;AAAA,oCAAC;AAAA;AAAA,sCACC,SAAQ;AAAA,sCACR,IAAG;AAAA,sCACH,OAAO,SAAS;AAAA,sCAChB,OAAM;AAAA,sCACN,UAAU,kBAAkB,UAAU;AAAA,sCAErC,iBAAO,QAAQ,kBAAkB,EAAE,IAAI,CAAC,CAAC,KAAK,QAAQ,MACrD,gBAAAA,KAAC,YAAmB,OAAO,KACzB,0BAAAF,MAACI,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,IAAI,GACzD;AAAA,wDAAAF;AAAA,0CAACE;AAAA,0CAAA;AAAA,4CACC,IAAI;AAAA,8CACF,OAAO;AAAA,8CACP,QAAQ;AAAA,8CACR,cAAc;AAAA,8CACd,SAAS,SAAS;AAAA,8CAClB,WAAW,aAAa,SAAS,KAAK;AAAA,4CACxC;AAAA;AAAA,wCACF;AAAA,wCACA,gBAAAJ,MAACI,MAAA,EACC;AAAA,0DAAAF,KAACI,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,YAAY,IAAI,GAAI,mBAAS,OAAM;AAAA,0CACrE,gBAAAJ,KAACI,aAAA,EAAW,SAAQ,WAAU,OAAM,kBACjC,mBAAS,aACZ;AAAA,2CACF;AAAA,yCACF,KAjBa,GAkBf,CACD;AAAA;AAAA,kCACH;AAAA;AAAA;AAAA,4BACF;AAAA,4BAEA,gBAAAJ;AAAA,8BAAC;AAAA;AAAA,gCACC,WAAS;AAAA,gCACT,WAAS;AAAA,gCACT,MAAM;AAAA,gCACN,OAAM;AAAA,gCACN,OAAO,SAAS;AAAA,gCAChB,UAAU,kBAAkB,aAAa;AAAA,gCACzC,aAAY;AAAA,gCACZ,UAAQ;AAAA,gCACR,MAAK;AAAA,gCACL,iBAAiB,EAAE,QAAQ,KAAK;AAAA,gCAChC,IAAI;AAAA,kCACF,WAAW;AAAA,kCACX,YAAY;AAAA,kCACZ,wBAAwB;AAAA,oCACtB,WAAW;AAAA,oCACX,YAAY;AAAA,oCACZ,IAAI;AAAA,kCACN;AAAA,kCACA,4BAA4B;AAAA,oCAC1B,cAAc;AAAA,oCACd,YAAY;AAAA,oCACZ,WAAW;AAAA,sCACT,WAAW;AAAA,sCACX,WAAW,MAAM,QAAQ,SAAS,SAC9B,+BACA;AAAA,oCACN;AAAA,oCACA,iBAAiB;AAAA,sCACf,WAAW;AAAA,sCACX,WAAW,MAAM,QAAQ,SAAS,SAC9B,+BACA;AAAA,oCACN;AAAA,kCACF;AAAA,gCACF;AAAA;AAAA,4BACF;AAAA;AAAA;AAAA,sBACF;AAAA,sBAEA,gBAAAF;AAAA,wBAACI;AAAA,wBAAA;AAAA,0BACC,WAAU;AAAA,0BACV,IAAI;AAAA,4BACF,SAAS;AAAA,4BACT,UAAU;AAAA,4BACV,KAAK;AAAA,4BACL,YAAY;AAAA,4BACZ,OAAO;AAAA;AAAA,4BAEP,eAAe,EAAE,IAAI,UAAU,IAAI,MAAM;AAAA,0BAC3C;AAAA,0BAGA;AAAA,4CAAAJ;AAAA,8BAACI;AAAA,8BAAA;AAAA,gCACC,WAAU;AAAA,gCACV,IAAI,EAAE,MAAM,GAAG,UAAU,KAAK,SAAS,QAAQ,eAAe,SAAS;AAAA,gCAEvE;AAAA,kDAAAJ,MAACM,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,YAAY,KAAK,IAAI,IAAI,GAAG;AAAA;AAAA,oCACtC;AAAA,oCACrB,CAAC,aAAM,aAAM,aAAM,aAAM,WAAI,GAAG,SAAS,kBAAkB,KAAK,CAAC;AAAA,oCAAG;AAAA,oCAAI;AAAA,oCACvE,SAAS,kBAAkB;AAAA,oCAAE;AAAA,qCACjC;AAAA,kCACA,gBAAAJ,KAACE,MAAA,EAAI,IAAI,EAAE,IAAI,EAAE,GACf,0BAAAF;AAAA,oCAAC;AAAA;AAAA,sCACC,MAAK;AAAA,sCACL,OAAO,SAAS;AAAA,sCAChB,UAAU,CAAC,GAAG,UAAU,YAAY,WAAS,EAAE,GAAG,MAAM,gBAAgB,MAAgB,EAAE;AAAA,sCAC1F,KAAK;AAAA,sCACL,KAAK;AAAA,sCACL,MAAM;AAAA,sCACN,OAAK;AAAA,sCACL,IAAI;AAAA,wCACF,sBAAsB;AAAA,0CACpB,YAAY,0BAA0B,MAAM,QAAQ,QAAQ,IAAI,KAAK,MAAM,QAAQ,QAAQ,IAAI,KAAK,MAAM,QAAQ,MAAM,IAAI;AAAA,0CAC5H,QAAQ;AAAA,wCACV;AAAA,wCACA,sBAAsB;AAAA,0CACpB,YAAY,2BAA2B,MAAM,QAAQ,QAAQ,IAAI,KAAK,MAAM,QAAQ,QAAQ,IAAI;AAAA,wCAClG;AAAA,sCACF;AAAA;AAAA,kCACF,GACF;AAAA;AAAA;AAAA,4BACF;AAAA,4BAEA,gBAAAF;AAAA,8BAACI;AAAA,8BAAA;AAAA,gCACC,WAAU;AAAA,gCACV,IAAI;AAAA,kCACF,MAAM;AAAA,kCACN,UAAU;AAAA,kCACV,SAAS;AAAA,kCACT,eAAe;AAAA,kCACf,QAAQ;AAAA,kCACR,GAAG;AAAA,gCACL;AAAA,gCAEA;AAAA,kDAAAF,KAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,SAAS,GACrD,0BAAAF,MAACI,MAAA,EAAI,SAAS,MAAM,aAAa,SAAS,MAAM,GAC9C;AAAA,oDAAAF;AAAA,sCAAC;AAAA;AAAA,wCACC,KAAK;AAAA,wCACL,MAAK;AAAA,wCACL,QAAO;AAAA,wCACP,OAAO,EAAE,SAAS,OAAO;AAAA,wCACzB,UAAU;AAAA;AAAA,oCACZ;AAAA,oCAGA,gBAAAF;AAAA,sCAACI;AAAA,sCAAA;AAAA,wCACC,IAAI;AAAA,0CACF,SAAS;AAAA,0CACT,YAAY;AAAA,0CACZ,KAAK;AAAA,0CACL,IAAI;AAAA,0CACJ,IAAI;AAAA,0CACJ,QAAQ;AAAA,0CACR,aAAa,CAACK,WAAUA,OAAM,QAAQ;AAAA,0CACtC,cAAc;AAAA,0CACd,QAAQ;AAAA,0CACR,OAAO,MAAM,QAAQ,KAAK;AAAA,0CAC1B,WAAW,EAAE,aAAa,MAAM,QAAQ,QAAQ,MAAM,OAAO,MAAM,QAAQ,QAAQ,KAAK;AAAA,wCAC1F;AAAA,wCAEA;AAAA,0DAAAP,KAAC,kBAAe,MAAM,IAAI;AAAA,0CAC1B,gBAAAA,KAACI,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,YAAY,IAAI,GAAG,6BAErD;AAAA,0CACA,gBAAAJ,KAACI,aAAA,EAAW,SAAQ,WAAU,OAAM,kBAAiB,IAAI,EAAE,IAAI,OAAO,GAAG,mCAEzE;AAAA;AAAA;AAAA,oCACF;AAAA,qCAEG,SAAS,UAAU,SAAS,OAAO,SAAS,KAAO,SAAS,eAAe,SAAS,YAAY,SAAS,MAC1G,gBAAAJ;AAAA,sCAACM;AAAA,sCAAA;AAAA,wCACC,UAAS;AAAA,wCACT,IAAI;AAAA,0CACF,IAAI;AAAA,0CACJ,WAAW;AAAA,0CACX,UAAU;AAAA,0CACV,IAAI;AAAA,0CACJ,YAAY,MAAM,QAAQ,SAAS,SAC/B,gFACA;AAAA,0CACJ,QAAQ,aAAa,MAAM,QAAQ,KAAK,IAAI;AAAA,0CAC5C,oBAAoB;AAAA,4CAClB,OAAO,MAAM,QAAQ,KAAK;AAAA,4CAC1B,UAAU;AAAA,0CACZ;AAAA,0CACA,uBAAuB;AAAA,4CACrB,UAAU;AAAA,0CACZ;AAAA,wCACF;AAAA,wCAEA,0BAAAN,KAACI,aAAA,EAAW,SAAQ,WAAU,IAAI,EAAE,YAAY,KAAK,SAAS,QAAQ,GACnE,mBAAS,UAAU,SAAS,OAAO,SAAS,IACzC,kEACA,8CAEN;AAAA;AAAA,oCACF;AAAA,qCAEJ,GACF;AAAA,kCAEC,SAAS,UAAU,SAAS,OAAO,SAAS,KAC3C,gBAAAN,MAACI,MAAA,EAAI,IAAI,EAAE,IAAI,EAAE,GACf;AAAA,oDAAAJ,MAACI,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,GAAG,IAAI,IAAI,GAChE;AAAA,sDAAAF,KAAC,mBAAgB,MAAM,IAAI;AAAA,sCAC3B,gBAAAA,KAACI,aAAA,EAAW,SAAQ,aAAY,IAAI,EAAE,YAAY,IAAI,GAAG,4BAEzD;AAAA,uCACF;AAAA,oCACA,gBAAAN,MAACI,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,KAAK,IAAI,GACnC;AAAA,sDAAAJ;AAAA,wCAACI;AAAA,wCAAA;AAAA,0CACC,IAAI;AAAA,4CACF,UAAU;AAAA,4CACV,cAAc;AAAA,4CACd,UAAU;AAAA,4CACV,WAAW,MAAM,QAAQ,SAAS,SAC9B,8BACA;AAAA,4CACJ,YAAY;AAAA,4CACZ,WAAW;AAAA,8CACT,WAAW;AAAA,8CACX,WAAW,MAAM,QAAQ,SAAS,SAC9B,+BACA;AAAA,4CACN;AAAA,0CACF;AAAA,0CAEA;AAAA,4DAAAF;AAAA,8CAAC;AAAA;AAAA,gDACC,KAAK,SAAS,OAAO,CAAC;AAAA,gDACtB,KAAI;AAAA,gDACJ,OAAO;AAAA,kDACL,OAAO;AAAA,kDACP,QAAQ;AAAA,kDACR,WAAW;AAAA,kDACX,SAAS;AAAA,gDACX;AAAA;AAAA,4CACF;AAAA,4CACA,gBAAAA;AAAA,8CAACK;AAAA,8CAAA;AAAA,gDACC,MAAK;AAAA,gDACL,SAAS;AAAA,gDACT,IAAI;AAAA,kDACF,UAAU;AAAA,kDACV,KAAK;AAAA,kDACL,OAAO;AAAA,kDACP,SAAS;AAAA,kDACT,OAAO;AAAA,kDACP,OAAO;AAAA,kDACP,QAAQ;AAAA,kDACR,WAAW;AAAA,oDACT,SAAS;AAAA,oDACT,WAAW;AAAA,kDACb;AAAA,gDACF;AAAA,gDAEA,0BAAAL,KAAC,cAAW,MAAM,IAAI;AAAA;AAAA,4CACxB;AAAA;AAAA;AAAA,sCACF;AAAA,sCACA,gBAAAF,MAACI,MAAA,EAAI,IAAI,EAAE,MAAM,GAAG,SAAS,QAAQ,eAAe,UAAU,gBAAgB,SAAS,GACrF;AAAA,wDAAAF;AAAA,0CAACQ;AAAA,0CAAA;AAAA,4CACC,SAAQ;AAAA,4CACR,MAAK;AAAA,4CACL,SAAS;AAAA,4CACT,WAAW,gBAAAR,KAAC,kBAAe;AAAA,4CAC3B,IAAI;AAAA,8CACF,IAAI;AAAA,8CACJ,aAAa,MAAM,QAAQ,QAAQ,OAAO;AAAA,8CAC1C,OAAO,MAAM,QAAQ,QAAQ;AAAA,8CAC7B,WAAW;AAAA,gDACT,aAAa,MAAM,QAAQ,QAAQ;AAAA,gDACnC,SAAS,MAAM,QAAQ,QAAQ,OAAO;AAAA,8CACxC;AAAA,4CACF;AAAA,4CACD;AAAA;AAAA,wCAED;AAAA,wCACA,gBAAAA,KAACI,aAAA,EAAW,SAAQ,WAAU,OAAM,kBAAiB,IAAI,EAAE,WAAW,SAAS,GAAG,kDAElF;AAAA,yCACF;AAAA,uCACF;AAAA,qCACF;AAAA,kCAGD,SAAS,eAAe,SAAS,YAAY,SAAS,KACrD,gBAAAN,MAACI,MAAA,EAAI,IAAI,EAAE,IAAI,EAAE,GACf;AAAA,oDAAAJ,MAACM,aAAA,EAAW,SAAQ,aAAY,cAAY,MAAC;AAAA;AAAA,sCAC1B,SAAS,YAAY;AAAA,sCAAO;AAAA,uCAC/C;AAAA,oCACA,gBAAAJ,KAACE,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,UAAU,QAAQ,KAAK,EAAE,GAClD,mBAAS,YAAY,IAAI,CAAC,YAAY,UACrC,gBAAAF;AAAA,sCAAC;AAAA;AAAA,wCAEC,OAAO,WAAW;AAAA,wCAClB,UAAU,MAAM,iBAAiB,KAAK;AAAA,wCACtC,YAAY,gBAAAA,KAAC,cAAW;AAAA,wCACxB,SAAQ;AAAA,wCACR,IAAI,EAAE,UAAU,IAAI;AAAA;AAAA,sCALf;AAAA,oCAMP,CACD,GACH;AAAA,qCACF;AAAA;AAAA;AAAA,4BAEJ;AAAA;AAAA;AAAA,sBACF;AAAA;AAAA;AAAA,gBACF;AAAA;AAAA;AAAA,UACF;AAAA,UAGE,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAI;AAAA,gBACF,UAAU;AAAA,gBACV,QAAQ;AAAA,gBACR,QAAQ;AAAA,gBACR,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,gBACnB,IAAI;AAAA,gBACJ,iBAAiB;AAAA,gBACjB,WAAW;AAAA,gBACX,aAAa;AAAA,gBACb,gBAAgB;AAAA,cAClB;AAAA,cAEA,0BAAAA;AAAA,gBAACQ;AAAA,gBAAA;AAAA,kBACC,WAAS;AAAA,kBACT,WAAW,gBAAAR,KAAC,YAAS;AAAA,kBACrB,UAAU,CAAC;AAAA,kBACX,SAAS;AAAA,kBACT,SAAQ;AAAA,kBACT;AAAA;AAAA,cAED;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IACF;AAAA,IAGA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,MAAM;AAAA,QACN,kBAAkB;AAAA,QAClB,SAAS,MAAM,gBAAgB,KAAK;AAAA,QACpC,cAAc,EAAE,UAAU,UAAU,YAAY,SAAS;AAAA,QACzD,IAAI;AAAA,UACF,8BAA8B;AAAA,YAC5B,YAAY,MAAM,QAAQ,SAAS,SAC/B,gFACA;AAAA,YACJ,OAAO,MAAM,QAAQ,KAAK;AAAA,YAC1B,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,cAAc;AAAA,YACd,QAAQ,aAAa,MAAM,QAAQ,QAAQ,IAAI;AAAA,YAC/C,gBAAgB;AAAA,UAClB;AAAA,QACF;AAAA,QACA,SAAS;AAAA;AAAA,IACX;AAAA,IAGF,gBAAAF;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,MAAM;AAAA,QACN,SAAS,MAAM,qBAAqB,KAAK;AAAA,QACzC,UAAS;AAAA,QACT,WAAS;AAAA,QACT,YAAY;AAAA,UACV,IAAI;AAAA,YACF,cAAc;AAAA,YACd,SAAS,MAAM,QAAQ,WAAW;AAAA,YAClC,iBAAiB,MAAM,QAAQ,SAAS,SACpC,oFACA;AAAA,YACJ,gBAAgB;AAAA,YAChB,QAAQ,aAAa,MAAM,QAAQ,SAAS,SAAS,0BAA0B,kBAAkB;AAAA,YACjG,WAAW,MAAM,QAAQ,SAAS,SAC9B,gCACA;AAAA,UACN;AAAA,QACF;AAAA,QAEA;AAAA,0BAAAH,MAAC,eAAY,IAAI;AAAA,YACf,IAAI;AAAA,YACJ,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,KAAK;AAAA,UACP,GACE;AAAA,4BAAAE;AAAA,cAACS;AAAA,cAAA;AAAA,gBACC,IAAI;AAAA,kBACF,SAAS,MAAM,QAAQ,KAAK,OAAO;AAAA,kBACnC,OAAO,MAAM,QAAQ,KAAK;AAAA,kBAC1B,OAAO;AAAA,kBACP,QAAQ;AAAA,gBACV;AAAA,gBAEA,0BAAAT,KAAC,mBAAgB;AAAA;AAAA,YACnB;AAAA,YACA,gBAAAF,MAACI,MAAA,EACC;AAAA,8BAAAF,KAACI,aAAA,EAAW,SAAQ,MAAK,IAAI,EAAE,YAAY,IAAI,GAAG,wCAElD;AAAA,cACA,gBAAAJ,KAACI,aAAA,EAAW,SAAQ,WAAU,OAAM,kBAAiB,qDAErD;AAAA,eACF;AAAA,aACF;AAAA,UAEA,gBAAAJ,KAAC,iBAAc,IAAI,EAAE,IAAI,EAAE,GACzB,0BAAAF,MAACI,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,EAAE,GAC1D;AAAA,4BAAAJ;AAAA,cAACY;AAAA,cAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,IAAI;AAAA,kBACF,GAAG;AAAA,kBACH,cAAc;AAAA,kBACd,YAAY,MAAM,QAAQ,SAAS,SAC/B,kFACA;AAAA,kBACJ,QAAQ,aAAa,MAAM,QAAQ,KAAK,IAAI;AAAA,gBAC9C;AAAA,gBAEA;AAAA,kCAAAZ,MAACM,aAAA,EAAW,SAAQ,aAAY,IAAI,EAAE,YAAY,KAAK,IAAI,GAAG,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GAC1G;AAAA,oCAAAJ,KAACE,MAAA,EAAI,IAAI;AAAA,sBACP,SAAS,MAAM,QAAQ,KAAK,OAAO;AAAA,sBACnC,OAAO,MAAM,QAAQ,KAAK;AAAA,sBAC1B,cAAc;AAAA,sBACd,OAAO;AAAA,sBACP,QAAQ;AAAA,sBACR,SAAS;AAAA,sBACT,YAAY;AAAA,sBACZ,gBAAgB;AAAA,sBAChB,UAAU;AAAA,sBACV,YAAY;AAAA,oBACd,GAAG,eAEH;AAAA,oBAAM;AAAA,qBAER;AAAA,kBACA,gBAAAJ,MAACM,aAAA,EAAW,SAAQ,aAAY,IAAI,EAAE,YAAY,KAAK,IAAI,GAAG,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GAC1G;AAAA,oCAAAJ,KAACE,MAAA,EAAI,IAAI;AAAA,sBACP,SAAS,MAAM,QAAQ,KAAK,OAAO;AAAA,sBACnC,OAAO,MAAM,QAAQ,KAAK;AAAA,sBAC1B,cAAc;AAAA,sBACd,OAAO;AAAA,sBACP,QAAQ;AAAA,sBACR,SAAS;AAAA,sBACT,YAAY;AAAA,sBACZ,gBAAgB;AAAA,sBAChB,UAAU;AAAA,sBACV,YAAY;AAAA,oBACd,GAAG,eAEH;AAAA,oBAAM;AAAA,qBAER;AAAA,kBACA,gBAAAJ,MAACM,aAAA,EAAW,SAAQ,aAAY,IAAI,EAAE,YAAY,KAAK,IAAI,GAAG,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GAC1G;AAAA,oCAAAJ,KAACE,MAAA,EAAI,IAAI;AAAA,sBACP,SAAS,MAAM,QAAQ,KAAK,OAAO;AAAA,sBACnC,OAAO,MAAM,QAAQ,KAAK;AAAA,sBAC1B,cAAc;AAAA,sBACd,OAAO;AAAA,sBACP,QAAQ;AAAA,sBACR,SAAS;AAAA,sBACT,YAAY;AAAA,sBACZ,gBAAgB;AAAA,sBAChB,UAAU;AAAA,sBACV,YAAY;AAAA,oBACd,GAAG,eAEH;AAAA,oBAAM;AAAA,qBAER;AAAA,kBACA,gBAAAF,KAACI,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,IAAI,EAAE,IAAI,GAAG,WAAW,SAAS,GAAG,qEAEvF;AAAA;AAAA;AAAA,YACF;AAAA,YAEA,gBAAAJ,KAACM,QAAA,EAAM,UAAS,QAAO,IAAI;AAAA,cACzB,YAAY;AAAA,cACZ,QAAQ,aAAa,MAAM,QAAQ,KAAK,IAAI;AAAA,YAC9C,GACE,0BAAAR,MAACM,aAAA,EAAW,SAAQ,SAClB;AAAA,8BAAAJ,KAAC,YAAO,4BAAO;AAAA,cAAS;AAAA,eAC1B,GACF;AAAA,aACF,GACF;AAAA,UAEA,gBAAAF,MAAC,iBAAc,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,GACjC;AAAA,4BAAAE;AAAA,cAACQ;AAAA,cAAA;AAAA,gBACC,SAAS,MAAM,qBAAqB,KAAK;AAAA,gBACzC,IAAI,EAAE,OAAO,MAAM,QAAQ,KAAK,UAAU;AAAA,gBAC3C;AAAA;AAAA,YAED;AAAA,YACA,gBAAAR;AAAA,cAACQ;AAAA,cAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,UAAU;AAAA,gBACV,WAAW,eAAe,gBAAAR,KAACW,mBAAA,EAAiB,MAAM,IAAI,IAAK,gBAAAX,KAAC,YAAS;AAAA,gBACrE,IAAI;AAAA,kBACF,YAAY,2BAA2B,MAAM,QAAQ,QAAQ,IAAI,QAAQ,MAAM,QAAQ,QAAQ,IAAI;AAAA,kBACnG,WAAW;AAAA,oBACT,YAAY,2BAA2B,MAAM,QAAQ,QAAQ,IAAI,QAAQ,MAAM,QAAQ,QAAQ,IAAI;AAAA,kBACrG;AAAA,gBACF;AAAA,gBAEC,yBAAe,kBAAkB;AAAA;AAAA,YACpC;AAAA,aACF;AAAA;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;;;AC3sCA,SAAS,eAAAY,oBAAkD;;;;ACsC3D,IAAM,KAAA,CAAM,QAAgB,KAAK,MAAM,WAAW,GAAG,IAAI,EAAE;AAG3D,SAAgB,eAAe,SAA6B,CAAC,GAAY;AACvE,QAAM,OAAO,OAAO,QAAQ;AAE5B,SAAO;IACL,GAFW,SAAS,SAAS,OAAO;IAGpC,GAAI,OAAO,SAAS,aAAa,OAAO,QAAQ,IAAI,IAAI,CAAC;IACzD,GAAG,OAAO;EACZ;AACF;AAEA,SAAS,UAAmB;AAE1B,QAAM,SAAS;IAAC;IAAQ,OAAO;IAAI,OAAO;IAAI,OAAO;IAAI,OAAO;IAAI,OAAO;EAAE;AAC7E,SAAO,MAAM,KAAK,EAAE,QAAQ,GAAG,GAAA,CAAI,GAAG,MAAM,OAAO,CAAA,KAAM,OAAO,EAAE;AACpE;AAGA,SAAgB,oBACd,eAAiD,QACnC;AACd,QAAM,SAAS,OAAO,iBAAiB,WAAW,EAAE,MAAM,aAAa,IAAI;AAC3E,QAAM,OAAO,OAAO,QAAQ;AAC5B,QAAM,UAAU,OAAO,YAAY;AACnC,QAAM,IAAI,eAAe,MAAM;AAC/B,QAAM,YAAY,gCAAgC,EAAE,IAAA;AACpD,SAAO;IACL,SAAS;MACP;MACA,SAAS;QAAE,MAAM,EAAE;QAAS,cAAc,EAAE,oBAAA;MAAsB;MAGlE,WAAW;QACT,MAAM,EAAE;QACR,cAAc,SAAS,EAAE,OAAO,SAAS,KAAK,MAAM,YAAY,EAAE;MACpE;MACA,MAAM;QAAE,MAAM,EAAE;QAAM,cAAc,EAAE,iBAAA;MAAmB;MACzD,OAAO;QAAE,MAAM,EAAE;QAAa,cAAc,EAAE,wBAAA;MAA0B;MACxE,SAAS;QAAE,MAAM,EAAE;QAAS,cAAc,EAAE,oBAAA;MAAsB;MAClE,SAAS;QAAE,MAAM,EAAE;QAAS,cAAc,EAAE,oBAAA;MAAsB;MAClE,YAAY;QAAE,SAAS,EAAE;QAAY,OAAO,EAAE;MAAQ;MACtD,MAAM;QAAE,SAAS,EAAE;QAAY,WAAW,EAAE,kBAAA;MAAoB;MAChE,SAAS,EAAE;MACX,QAAQ;QAAE,OAAO,EAAE;QAAO,UAAU,EAAE,YAAA;QAAe,OAAO,EAAE,YAAA;MAAc;IAC9E;IACA,OAAO,EAAE,cAAc,GAAG,OAAO,EAAE,EAAE;IACrC,SAAS,QAAQ;IACjB,YAAY;MACV,YAAY;MACZ,UAAU,UAAU,KAAK;MACzB,QAAQ;QAAE,eAAe;QAAQ,YAAY;QAAK,eAAe;MAAU;MAC3E,IAAI;QAAE,YAAY;QAAK,eAAe;MAAU;MAChD,IAAI;QAAE,YAAY;QAAK,eAAe;MAAW;MACjD,IAAI;QAAE,YAAY;QAAK,eAAe;MAAU;MAChD,IAAI;QAAE,YAAY;QAAK,eAAe;MAAW;MACjD,IAAI,EAAE,YAAY,IAAI;MACtB,IAAI,EAAE,YAAY,IAAI;MACtB,UAAU;QAAE,YAAY;QAAK,eAAe;MAAS;IACvD;IACA,aAAa;MACX,UAAU;QACR,UAAU,SAAS;QACnB,SAAS,SAAS;QAClB,OAAO,SAAS;QAChB,UAAU,SAAS;QACnB,SAAS,SAAS;QAClB,gBAAgB,SAAS;QACzB,eAAe,SAAS;MAC1B;MACA,QAAQ;QACN,WAAW,OAAO;QAClB,SAAS,OAAO;QAChB,QAAQ,OAAO;QACf,OAAO,OAAO;MAChB;IACF;IACA,YAAY;MACV,gBAAgB,EACd,gBAAgB;QACd,wBAAwB,EAAE,YAAY,SAAS;QAC/C,2CAA2C,EACzC,wBAAwB;UACtB,mBAAmB;UACnB,oBAAoB;QACtB,EACF;MACF,EACF;MACA,eAAe,EAAE,cAAc,EAAE,eAAe,KAAK,EAAE;MACvD,WAAW;QACT,cAAc;UAAE,kBAAkB;UAAM,MAAM,UAAU,UAAU;QAAS;QAC3E,gBAAgB;UACd,MAAM;YACJ,cAAc,OAAO;YACrB,mBAAmB;cACjB,WAAW;cACX,SAAS,aAAa,EAAE,IAAA;cACxB,eAAe;YACjB;UACF;UACA,UAAU,EAAE,aAAa,EAAE,eAAA,EAAiB;QAC9C;MACF;MACA,eAAe;QACb,cAAc,EAAE,MAAM,UAAU,UAAU,SAAS;QACnD,gBAAgB,EACd,MAAM;UACJ,cAAc,OAAO;UACrB,mBAAmB;YAAE,SAAS,aAAa,EAAE,IAAA;YAAQ,eAAe;UAAE;QACxE,EACF;MACF;MACA,UAAU,EACR,gBAAgB;QACd,MAAM,EAAE,iBAAiB,OAAO;QAChC,UAAU,EAAE,aAAa,EAAE,OAAO;QAClC,SAAS,EAAE,cAAc,OAAO,GAAG;MACrC,EACF;MACA,SAAS;QACP,cAAc,EAAE,SAAS,WAAW;QACpC,gBAAgB,EACd,MAAM;UAAE,cAAc,OAAO;UAAI,iBAAiB,EAAE;UAAM,aAAa,EAAE;QAAO,EAClF;MACF;MACA,WAAW,EACT,gBAAgB,EACd,OAAO;QAAE,cAAc,OAAO;QAAI,QAAQ,aAAa,EAAE,MAAA;QAAU,WAAW,OAAO;MAAG,EAC1F,EACF;MACA,SAAS,EACP,gBAAgB;QACd,OAAO;UACL,cAAc,OAAO;UACrB,QAAQ,aAAa,EAAE,eAAA,CAAA;UACvB,WAAW,OAAO;QACpB;QACA,MAAM;UAAE,YAAY;UAAG,eAAe;QAAE;MAC1C,EACF;MACA,YAAY,EACV,gBAAgB,EAAE,OAAO;QAAE,cAAc,OAAO;QAAI,QAAQ,aAAa,EAAE,MAAA;MAAS,EAAE,EACxF;MACA,SAAS;QACP,cAAc,EAAE,MAAM,QAAQ;QAC9B,gBAAgB,EAAE,MAAM;UAAE,cAAc,OAAO;UAAM,YAAY;QAAI,EAAE;MACzE;MACA,SAAS,EACP,gBAAgB,EAAE,WAAW;QAAE,iBAAiB,EAAE;QAAO,QAAQ;MAAE,EAAE,EACvE;MACA,QAAQ,EACN,gBAAgB,EACd,MAAM;QACJ,eAAe;QACf,YAAY;QACZ,WAAW,UAAU,KAAK;QAC1B,kBAAkB,EAAE,OAAO,EAAE,WAAW;MAC1C,EACF,EACF;MACA,kBAAkB,EAChB,gBAAgB,EACd,MAAM;QACJ,cAAc,OAAO;QACrB,iBAAiB,EAAE;QACnB,sCAAsC,EAAE,aAAa,EAAE,MAAM;QAC7D,4CAA4C,EAAE,aAAa,EAAE,eAAA,EAAiB;QAG9E,kDAAkD;UAChD,aAAa,EAAE;UACf,aAAa;QACf;QACA,gDAAgD,EAAE,aAAa,EAAE,YAAY;MAC/E,EACF,EACF;MAIA,aAAa,EACX,gBAAgB,EACd,MAAM;QACJ,QAAQ;QACR,cAAc,OAAO;QACrB,+BAA+B,EAAE,iBAAiB,EAAE,UAAU;QAC9D,kBAAkB;UAAE,iBAAiB;UAAe,YAAY;QAAI;QACpE,yDAAyD,EACvD,iBAAiB,EAAE,UACrB;MACF,EACF,EACF;MACA,iBAAiB,EACf,gBAAgB;QACd,OAAO;UAAE,cAAc,OAAO;UAAI,QAAQ,aAAa,EAAE,eAAA,CAAA;QAAmB;QAC5E,SAAS;UACP,SAAS;UACT,6BAA6B;YAC3B,cAAc,OAAO;YACrB,qCAAqC,EAAE,iBAAiB,EAAE,UAAU;YACpE,2BAA2B;cAAE,iBAAiB;cAAe,YAAY;YAAI;YAC7E,uCAAuC,EAAE,iBAAiB,EAAE,UAAU;UACxE;QACF;MACF,EACF;MACA,cAAc,EAAE,cAAc,EAAE,MAAM,UAAU,UAAU,SAAS,EAAE;MACrE,UAAU,EAAE,gBAAgB,EAAE,MAAM,EAAE,cAAc,OAAO,GAAG,EAAE,EAAE;MAClE,YAAY,EACV,gBAAgB,EACd,SAAS;QACP,iBAAiB,EAAE;QACnB,OAAO,EAAE,iBAAA;QACT,UAAU;QACV,cAAc,OAAO;MACvB,EACF,EACF;MACA,WAAW,EACT,gBAAgB;QACd,YAAY,EACV,oCAAoC;UAAE,iBAAiB,EAAE;UAAO,SAAS;QAAE,EAC7E;QACA,OAAO;UAAE,iBAAiB,EAAE,eAAA;UAAkB,SAAS;QAAE;MAC3D,EACF;MACA,SAAS,EAAE,cAAc,EAAE,OAAO,QAAQ,EAAE;MAC5C,UAAU,EAAE,cAAc,EAAE,MAAM,UAAU,UAAU,SAAS,EAAE;MACjE,YAAY,EAAE,cAAc,EAAE,SAAS,UAAU,UAAU,UAAU,EAAE;MACvE,YAAY,EAAE,gBAAgB,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE;IACpE;EACF;AACF;;;ACxMO,SAAS,gBAAgB,GAAY,MAAyC;AACnF,QAAMC,QAAO,SAAS;AACtB,QAAM,SAAS,EAAE,gBAAgB;AACjC,SAAO;AAAA,IACL,SAAS;AAAA,MACP,MAAM,EAAE;AAAA,MACR;AAAA,MACA,QAAQ,EAAE,eAAe;AAAA,MACzB,aAAa,EAAE;AAAA,MACf,kBAAkB,IAAI,EAAE,OAAO,EAAE,YAAYA,QAAO,OAAO,IAAI;AAAA,MAC/D,SAAS,EAAE;AAAA,MACX,UAAU,EAAE;AAAA,MACZ,oBAAoB,EAAE,iBAAiB;AAAA,IACzC;AAAA,IACA,UAAU;AAAA,MACR,SAASA,QAAO,SAAS,EAAE;AAAA,MAC3B,QAAQ,EAAE;AAAA,MACV,aAAa,EAAE;AAAA,MACf,YAAY,EAAE;AAAA,MACd,aAAa,EAAE,kBAAkB;AAAA,IACnC;AAAA,IACA,SAAS;AAAA,MACP,SAAS,EAAE;AAAA,MACX,cAAc,IAAI,EAAE,OAAO,EAAE,YAAYA,QAAO,MAAM,IAAI;AAAA,MAC1D,YAAY,EAAE;AAAA,MACd,iBAAiB,EAAE,kBAAkB;AAAA,MACrC,gBAAgB,EAAE;AAAA,MAClB,mBAAmB,EAAE,oBAAoB;AAAA,IAC3C;AAAA,IACA,YAAY;AAAA,MACV,SAAS,EAAE,eAAe;AAAA,MAC1B,QAAQ,EAAE;AAAA,MACV,YAAY,EAAE;AAAA,MACd,MAAM,EAAE,kBAAkB;AAAA,IAC5B;AAAA,IACA,cAAc;AAAA,MACZ,MAAM,EAAE,SAAS,EAAE,OAAO,YAAY,EAAE,YAAY,QAAQ,EAAE,OAAO;AAAA,MACrE,WAAW,EAAE,SAAS,eAAe,YAAY,EAAE,YAAY,QAAQ,cAAc;AAAA,MACrF,QAAQ,EAAE;AAAA,MACV,SAAS,EAAE;AAAA,MACX,MAAM,EAAE,kBAAkB;AAAA,MAC1B,MAAM,EAAE,SAAS,EAAE,MAAM,YAAY,EAAE,iBAAiB,EAAE;AAAA,IAC5D;AAAA,IACA,OAAO,EAAE,QAAQ,EAAE,OAAO,MAAM,EAAE,kBAAkB,GAAG,SAAS,EAAE,YAAY,EAAE;AAAA,IAChF,QAAQ,EAAE,QAAQ,EAAE,OAAO,SAAS,EAAE,YAAY,EAAE;AAAA,IACpD,MAAM,EAAE,SAAS,EAAE,eAAe,GAAG,QAAQ,EAAE,QAAQ,YAAY,EAAE,WAAW;AAAA,IAChF,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,IAAI,EAAE,YAAY,EAAE,MAAMA,QAAO,OAAO,IAAI,EAAE;AAAA,IACpF,WAAW,EAAE,SAAS,EAAE,SAAS,QAAQ,EAAE,OAAO;AAAA,IAClD,QAAQ;AAAA,MACN,WAAW,EAAE;AAAA,MACb,cAAc,EAAE;AAAA,MAChB,UAAU,EAAE;AAAA,MACZ,WAAW,EAAE;AAAA,MACb,SAAS,EAAE;AAAA,MACX,WAAW,EAAE;AAAA,MACb,UAAU,EAAE;AAAA,MACZ,cAAc,EAAE,kBAAkB;AAAA,MAClC,WAAW,EAAE;AAAA,MACb,SAAS,EAAE;AAAA,MACX,QAAQ,EAAE,kBAAkB;AAAA,MAC5B,MAAM,EAAE;AAAA,MACR,SAAS,EAAE;AAAA,MACX,SAAS,EAAE;AAAA,MACX,OAAO,EAAE;AAAA,IACX;AAAA,EACF;AACF;AASO,SAAS,kBAAkB,GAAoB,GAAY;AAChE,SAAO;AAAA,IACL,OAAO,EAAE,QAAQ;AAAA,IACjB,OAAO,EAAE,SAAS;AAAA,IAClB,OAAO,EAAE,QAAQ;AAAA,IACjB,YAAY,EAAE,QAAQ;AAAA,IACtB,MAAM,EAAE,WAAW;AAAA,IACnB,UAAU,EAAE,QAAQ;AAAA,IACpB,UAAU,EAAE,WAAW;AAAA,IACvB,SAAS,EAAE,aAAa;AAAA,IACxB,YAAY;AAAA,MACV,YAAY,EAAE,QAAQ;AAAA,MACtB,MAAM,EAAE;AAAA,MACR,QAAQ,EAAE;AAAA,MACV,iBAAiB,EAAE,QAAQ;AAAA,MAC3B,aAAa,EAAE,eAAe;AAAA,IAChC;AAAA,IACA,QAAQ;AAAA,MACN,YAAY,EAAE,QAAQ;AAAA,MACtB,QAAQ,EAAE;AAAA,MACV,MAAM,EAAE;AAAA,MACR,WAAW,EAAE,QAAQ;AAAA,MACrB,gBAAgB,EAAE,QAAQ;AAAA,MAC1B,UAAU,EAAE;AAAA,IACd;AAAA,IACA,UAAU;AAAA,MACR,gBAAgB,EAAE,aAAa,KAAK;AAAA,MACpC,UAAU,EAAE;AAAA,MACZ,YAAY,EAAE,aAAa,KAAK;AAAA,MAChC,YAAY,EAAE,aAAa,KAAK;AAAA,MAChC,sBAAsB;AAAA,MACtB,YAAY,EAAE,aAAa;AAAA,MAC3B,QAAQ,EAAE,aAAa;AAAA,MACvB,cAAc,EAAE,QAAQ;AAAA,MACxB,QAAQ,EAAE,aAAa,UAAU;AAAA,MACjC,UAAU,EAAE;AAAA,MACZ,UAAU,EAAE,QAAQ;AAAA,MACpB,YAAY,EAAE,OAAO;AAAA,MACrB,SAAS,EAAE,aAAa;AAAA,MACxB,qBAAqB,EAAE,QAAQ;AAAA,MAC/B,gBAAgB,EAAE,aAAa,KAAK;AAAA,MACpC,UAAU,EAAE,aAAa,KAAK;AAAA,IAChC;AAAA,EACF;AACF;;;AC3KA,IAAM,OAAO,EAAE,OAAO,MAAM,MAAM,IAAI;AAG/B,IAAM,gBAAgB;AAEtB,IAAM,QAAQ;AAAA,EACnB,QAAQ,EAAE,IAAI,UAAU,OAAO,UAAU,QAAQ,EAAE,OAAO,eAAe,MAAM,UAAU,EAAE;AAAA,EAC3F,SAAS,EAAE,IAAI,WAAW,OAAO,WAAW,QAAQ,EAAE,OAAO,WAAW,MAAM,UAAU,EAAE;AAAA,EAC1F,WAAW;AAAA,IACT,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ,EAAE,OAAO,WAAW,MAAM,UAAU;AAAA,IAC5C,MAAM;AAAA,IACN,cAAc;AAAA,EAChB;AAAA,EACA,OAAO,EAAE,IAAI,SAAS,OAAO,SAAS,QAAQ,EAAE,OAAO,WAAW,MAAM,UAAU,EAAE;AAAA,EACpF,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ,EAAE,OAAO,WAAW,MAAM,UAAU;AAAA,IAC5C,MAAM;AAAA,IACN,cAAc;AAAA,EAChB;AAAA,EACA,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ,EAAE,OAAO,WAAW,MAAM,UAAU;AAAA,IAC5C,MAAM;AAAA,IACN,cAAc,EAAE,OAAO,MAAM,MAAM,KAAK;AAAA,EAC1C;AAAA,EACA,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ,EAAE,OAAO,WAAW,MAAM,UAAU;AAAA,IAC5C,MAAM;AAAA,IACN,cAAc;AAAA,EAChB;AAAA,EACA,MAAM,EAAE,IAAI,QAAQ,OAAO,QAAQ,QAAQ,EAAE,OAAO,WAAW,MAAM,UAAU,EAAE;AAAA,EACjF,OAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ,EAAE,OAAO,WAAW,MAAM,UAAU;AAAA,IAC5C,MAAM;AAAA,IACN,cAAc,EAAE,OAAO,MAAM,MAAM,KAAK;AAAA,EAC1C;AAAA,EACA,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ,EAAE,OAAO,WAAW,MAAM,UAAU;AAAA,IAC5C,MAAM;AAAA,IACN,cAAc;AAAA,EAChB;AAAA,EACA,OAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ,EAAE,OAAO,WAAW,MAAM,UAAU;AAAA,IAC5C,MAAM;AAAA,IACN,cAAc,EAAE,OAAO,MAAM,MAAM,KAAK;AAAA,EAC1C;AAAA,EACA,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ,EAAE,OAAO,WAAW,MAAM,UAAU;AAAA,IAC5C,MAAM;AAAA,IACN,cAAc,EAAE,OAAO,MAAM,MAAM,KAAK;AAAA,EAC1C;AAAA,EACA,UAAU;AAAA,IACR,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ,EAAE,OAAO,WAAW,MAAM,UAAU;AAAA,IAC5C,MAAM;AAAA,IACN,cAAc,EAAE,OAAO,MAAM,MAAM,KAAK;AAAA,EAC1C;AACF;;;AHRA,SAAS,YAAY,MAA6C;AAChE,MAAI,CAAC,KAAM,QAAO,MAAM;AACxB,MAAI,OAAO,SAAS,SAAU,QAAO,MAAM,IAAI,KAAK,MAAM;AAC1D,SAAO;AACT;AAGA,SAAS,eAAe,MAAkB,MAAkB,MAAiC;AAC3F,MAAI,CAAC,KAAK,KAAM,QAAO,CAAC;AACxB,QAAM,IAAI,KAAK,eAAe,IAAI,KAAK;AACvC,QAAM,OAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,MAAwB,CAAC;AAC/B,aAAW,KAAK,KAAM,KAAI,CAAC,IAAI,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,CAAC;AACxD,MAAI,SAAS,IAAI,KAAK,QAAQ,KAAK,MAAM,IAAI,GAAG;AAChD,MAAI,eAAe,IAAI,IAAI,KAAK,eAAe,GAAG,KAAK,MAAM,IAAI,GAAG;AACpE,MAAI,QAAQ,IAAI,KAAK,OAAO,KAAK,MAAM,IAAI,GAAG;AAC9C,SAAO;AACT;AAGO,SAAS,gBAAgB,QAAyC;AACvE,QAAM,OAA+B,CAAC;AACtC,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,MAAM,EAAG,MAAK,KAAK,CAAC,EAAE,IAAI;AAC9D,SAAO;AACT;AAWO,SAAS,kBACd,SAA4B,CAAC,MAC1B,WACI;AACP,QAAM,OAAO,OAAO,QAAQ;AAC5B,QAAM,UAAU,OAAO,WAAW;AAClC,QAAM,OAAO,YAAY,OAAO,IAAI;AACpC,QAAM,SAAS,OAAO,QAAQ,UAAU,OAAO,UAAU,KAAK,OAAO,IAAI;AACzE,QAAM,UAAU,eAAe,EAAE,KAAK,CAAC;AACvC,QAAM,WAAW,eAAe,MAAM,MAAM,OAAO;AACnD,QAAM,UAAU,eAAe,EAAE,MAAM,QAAQ,SAAS,SAAS,CAAC;AAGlE,QAAM,SAAS,SAAS,SAAS,YAAY;AAC7C,QAAM,UAAU,CAAC,GAAW,QAAQ,QAAQ;AAC1C,QAAI,MAAM;AACV,aAAS,IAAI,GAAG,IAAI,MAAM,SAAS,KAAK,QAAQ,UAAU,IAAI,OAAO,IAAK,OAAM,IAAI,KAAK,QAAQ,IAAI;AACrG,WAAO;AAAA,EACT;AACA,QAAM,SAAkB;AAAA,IACtB,GAAG;AAAA,IACH,OAAO,QAAQ,QAAQ,KAAK;AAAA,IAC5B,MAAM,QAAQ,QAAQ,IAAI;AAAA,IAC1B,oBAAoB,QAAQ,QAAQ,kBAAkB,CAAC;AAAA,EACzD;AACA,QAAM,YAAY,gBAAgB,QAAQ,IAAI;AAC9C,QAAM,UAAU,gBAAgB,MAAM;AAEtC,QAAM,OAAO,oBAAoB,EAAE,MAAM,QAAQ,SAAS,SAAS,OAAO,CAAC;AAC3E,QAAM,SAA0B;AAAA,IAC9B;AAAA,IACA,MAAM,KAAK;AAAA,IACX;AAAA,IACA;AAAA,IACA,QAAQ,OAAO;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAOC;AAAA,IACL;AAAA,IACA;AAAA,MACE,SAAS;AAAA,QACP,MAAM,kBAAkB,WAAW,MAAM;AAAA,QACzC,QAAQ;AAAA,UACN,MAAM,UAAU,OAAO;AAAA,UACvB,WAAW,UAAU,OAAO;AAAA,UAC5B,QAAQ,UAAU,OAAO;AAAA,UACzB,SAAS,UAAU,OAAO;AAAA,UAC1B,OAAO,UAAU,OAAO;AAAA,QAC1B;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,MACA;AAAA;AAAA;AAAA;AAAA;AAAA,MAKA,YAAY;AAAA,QACV,WAAW;AAAA,UACT,UAAU;AAAA,YACR,EAAE,OAAO,EAAE,SAAS,QAAQ,OAAO,UAAU,GAAG,OAAO,EAAE,OAAO,OAAO,MAAM,EAAE;AAAA,YAC/E,EAAE,OAAO,EAAE,SAAS,YAAY,OAAO,UAAU,GAAG,OAAO,EAAE,OAAO,OAAO,MAAM,EAAE;AAAA,UACrF;AAAA,QACF;AAAA,QACA,eAAe,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,OAAO,UAAU,GAAG,OAAO,EAAE,OAAO,OAAO,MAAM,EAAE,CAAC,EAAE;AAAA,QAC7F,QAAQ,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,OAAO,OAAO,MAAM,EAAE,EAAE,EAAE;AAAA,QAC9F,SAAS,EAAE,gBAAgB,EAAE,MAAM,EAAE,OAAO,OAAO,MAAM,EAAE,EAAE;AAAA,QAC7D,eAAe,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,OAAO,UAAU,GAAG,OAAO,EAAE,OAAO,OAAO,MAAM,EAAE,CAAC,EAAE;AAAA,QAC7F,SAAS;AAAA,UACP,UAAU,CAAC,EAAE,OAAO,EAAE,SAAS,YAAY,OAAO,UAAU,GAAG,OAAO,EAAE,OAAO,OAAO,MAAM,EAAE,CAAC;AAAA,QACjG;AAAA,MACF;AAAA,IACF;AAAA,IACA,GAAG;AAAA,EACL;AACF;;;AIhMA,IAAM,aAAa;AACnB,IAAM,WAAW;AACjB,IAAM,MAAM;AAGL,IAAM,iBAAiB,CAAC,UAA2B,IAAI,KAAK,MAAM,KAAK,CAAC;AAWxE,SAAS,mBAAmB,KAAqD;AACtF,QAAM,SAAS,OAAO,IAAI,KAAK;AAC/B,QAAM,SAAS,WAAW,KAAK,KAAK;AACpC,MAAI,QAAQ;AACV,WAAO,EAAE,MAAM,UAAU,MAAM,OAAO,CAAC,EAAG,YAAY,MAAM,UAAU,UAAU,QAAQ,QAAQ,IAAI,OAAO,CAAC,EAAG,YAAY,CAAC,GAAG;AAAA,EACjI;AACA,QAAM,IAAI,SAAS,KAAK,KAAK;AAC7B,QAAM,OAAQ,IAAI,CAAC,GAAG,YAAY,KAAK;AACvC,SAAO,EAAE,MAAM,QAAQ,QAAQ,OAAO,UAAU,MAAM,IAAI,CAAC,GAAG,YAAY,MAAM,UAAU,UAAU,OAAO;AAC7G;AAGO,SAAS,iBAAiB,QAAqC;AACpE,MAAI,OAAO,UAAU,eAAe,OAAO,MAAM,GAAG;AAClD,WAAO,UAAU,OAAO,OAAO,KAAK,EAAE,MAAM,CAAC,EAAE,YAAY,CAAC,IAAI,OAAO,IAAI;AAAA,EAC7E;AACA,SAAO,GAAG,OAAO,QAAQ,QAAQ,OAAO,OAAO,QAAQ,IAAI,OAAO,IAAI;AACxE;AAGO,IAAM,mBAAmB,CAAC,QAAyB,WAAW,KAAK,GAAG;AAMtE,SAAS,oBACd,KACA,UAAwE,CAAC,GAClE;AACP,QAAM,EAAE,MAAM,MAAM,OAAO,IAAI,mBAAmB,GAAG;AACrD,QAAM,SAA2C,SAC7C,EAAE,QAAQ,MAAM,QAAQ,QAAQ,QAAW,SAAS,QAAQ,WAAW,OAAU,IACjF;AACJ,SAAO,kBAAkB,EAAE,MAAM,MAAM,SAAS,QAAQ,SAAS,OAAO,CAAC;AAC3E;AAGO,SAAS,sBAAsB,KAAwC;AAC5E,QAAM,EAAE,MAAM,MAAM,OAAO,IAAI,mBAAmB,GAAG;AACrD,QAAM,YAAY,SAAS,UAAU,UAAU;AAC/C,SAAO,SAAS,UAAU,MAAM,SAAM,SAAS,KAAK,GAAG,MAAM,IAAI,EAAE,KAAK,SAAM,SAAS;AACzF;;;AC9DA,IAAM,iBAAiC;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAIA,IAAM,aAA4B,CAAC;AACnC,WAAW,MAAM,gBAAgB;AAC/B,aAAW,QAAQ,CAAC,QAAQ,OAAO,GAAY;AAC7C,eAAW,GAAG,EAAE,IAAI,IAAI,EAAE,IAAI,kBAAkB,EAAE,MAAM,IAAI,KAAK,CAAC;AAAA,EACpE;AACF;AASA,IAAM,eAAe,oBAAI,IAAmB;AAC5C,IAAM,WAA0B,IAAI,MAAM,YAAY;AAAA,EACpD,IAAI,QAAQ,MAAM,UAAU;AAC1B,QAAI,OAAO,SAAS,YAAY,EAAE,QAAQ,WAAW,iBAAiB,IAAI,GAAG;AAC3E,YAAM,MAAM,KAAK,YAAY;AAC7B,UAAI,QAAQ,aAAa,IAAI,GAAG;AAChC,UAAI,CAAC,OAAO;AACV,gBAAQ,oBAAoB,GAAG;AAC/B,qBAAa,IAAI,KAAK,KAAK;AAAA,MAC7B;AACA,aAAO;AAAA,IACT;AACA,WAAO,QAAQ,IAAI,QAAQ,MAAM,QAAQ;AAAA,EAC3C;AACF,CAAC;AAED,IAAO,mBAAQ;AAGR,IAAM,mBAA6D,OAAO;AAAA,EAC/E,OAAO,QAAQ,UAAU,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;AAC9E;AAGO,IAAM,eAAe;AAIrB,IAAM,kBAAkB,WAAW,aAAa;AAChD,IAAM,mBAAmB,WAAW,cAAc;AAClD,IAAM,qBAAqB,WAAW,gBAAgB;AACtD,IAAM,sBAAsB,WAAW,iBAAiB;AACxD,IAAM,mBAAmB,WAAW,cAAc;AAClD,IAAM,oBAAoB,WAAW,eAAe;AACpD,IAAM,qBAAqB,WAAW,YAAY;AAClD,IAAM,sBAAsB,WAAW,aAAa;AACpD,IAAM,gBAAgB,WAAW,WAAW;AAC5C,IAAM,iBAAiB,WAAW,YAAY;AAC9C,IAAM,gBAAgB,WAAW,WAAW;AAC5C,IAAM,iBAAiB,WAAW,YAAY;AAC9C,IAAM,gBAAgB,WAAW,WAAW;AAC5C,IAAM,iBAAiB,WAAW,YAAY;AAC9C,IAAM,iBAAiB,WAAW,YAAY;AAC9C,IAAM,kBAAkB,WAAW,aAAa;AAChD,IAAM,iBAAiB,WAAW,YAAY;AAC9C,IAAM,kBAAkB,WAAW,aAAa;AAChD,IAAM,gBAAgB,WAAW,WAAW;AAC5C,IAAM,iBAAiB,WAAW,YAAY;AAC9C,IAAM,kBAAkB,WAAW,aAAa;AAChD,IAAM,mBAAmB,WAAW,cAAc;AAClD,IAAM,kBAAkB,WAAW,aAAa;AAChD,IAAM,mBAAmB,WAAW,cAAc;AAClD,IAAM,oBAAoB,WAAW,eAAe;AACpD,IAAM,qBAAqB,WAAW,gBAAgB;;;AChG7D,SAAS,qBAAiC;AAC1C,YAAYC,YAAW;AAkEf,gBAAAC,YAAA;AAzCD,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AACF,GAA6B;AAC3B,QAAM,WAAiB,eAAQ,MAAM,SAAS,kBAAkB,MAAM,GAAG,CAAC,OAAO,MAAM,CAAC;AACxF,QAAM,EAAE,SAAS,KAAK,IAAI,SAAS;AAEnC,EAAM,uBAAgB,MAAM;AAC1B,QAAI,UAAU,cAAc,OAAO,aAAa,YAAa;AAC7D,UAAM,OAAO,SAAS;AACtB,UAAM,WAAW,oBAAI,IAAoB;AACzC,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,OAAO,GAAG;AAC5C,eAAS,IAAI,GAAG,KAAK,MAAM,iBAAiB,CAAC,CAAC;AAC9C,WAAK,MAAM,YAAY,GAAG,CAAC;AAAA,IAC7B;AACA,UAAM,UAAU,KAAK,UAAU,SAAS,MAAM;AAC9C,UAAM,WAAW,KAAK,UAAU,SAAS,OAAO;AAChD,UAAM,iBAAiB,KAAK,MAAM;AAClC,SAAK,UAAU,OAAO,QAAQ,SAAS,MAAM;AAC7C,SAAK,UAAU,OAAO,SAAS,SAAS,OAAO;AAC/C,SAAK,MAAM,cAAc;AACzB,WAAO,MAAM;AACX,iBAAW,CAAC,GAAG,CAAC,KAAK,UAAU;AAC7B,YAAI,EAAG,MAAK,MAAM,YAAY,GAAG,CAAC;AAAA,YAC7B,MAAK,MAAM,eAAe,CAAC;AAAA,MAClC;AAGA,WAAK,UAAU,OAAO,QAAQ,OAAO;AACrC,WAAK,UAAU,OAAO,SAAS,QAAQ;AACvC,WAAK,MAAM,cAAc;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,OAAO,SAAS,IAAI,CAAC;AAEzB,MAAI,UAAU,WAAW;AACvB,WACE,gBAAAA,KAAC,iBAAc,OAAO,UACpB,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,CAAC,SAAS,SAAS,SAAS,SAAS,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,QACnF,qBAAmB,SAAS,OAAO;AAAA,QACnC,OAAO,EAAE,GAAI,SAAiC,aAAa,MAAM,GAAG,MAAM;AAAA,QAEzE;AAAA;AAAA,IACH,GACF;AAAA,EAEJ;AACA,SAAO,gBAAAA,KAAC,iBAAc,OAAO,UAAW,UAAS;AACnD;;;AC9EA,OAAOC,aAAY;AACnB,OAAOC,UAAS;AAChB,OAAOC,aAAY;AACnB,OAAOC,YAAW;AAClB,OAAOC,YAAW;AAClB,OAAOC,iBAAgB;AACvB,SAAS,YAAAC,iBAAgB;AACzB,YAAYC,YAAW;AA8CnB,SAEI,OAAAC,MAFJ,QAAAC,aAAA;AAdG,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,QAAQ;AAAA,EACR;AACF,GAAuB;AACrB,QAAM,WAAWC,UAAS,EAAE,QAAQ;AACpC,QAAM,QAAQ,UAAU,aAAa,UAAU,CAAC,SAAS,MAAM,IAAI,CAAC,QAAQ,OAAO;AACnF,SACE,gBAAAD,MAACE,QAAA,EAAM,SAAS,KAAK,MAAK,SAAQ,cAAW,oBAC1C;AAAA,cAAU,QACT,gBAAAH,KAACI,aAAA,EAAW,WAAU,MAAK,SAAQ,aAAY,IAAI,EAAE,YAAY,IAAI,GAClE,iBACH;AAAA,IAEF,gBAAAJ;AAAA,MAACK;AAAA,MAAA;AAAA,QACC,IAAI;AAAA,UACF,SAAS;AAAA,UACT,KAAK;AAAA,UACL,qBAAqB,MAAM,SAAS,IAAI,EAAE,IAAI,OAAO,IAAI,4BAA4B,IAAI;AAAA,QAC3F;AAAA,QAEC,gBAAM,IAAI,CAAC,SACV,gBAAAL;AAAA,UAAC;AAAA;AAAA,YAEC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA;AAAA,UARK;AAAA,QASP,CACD;AAAA;AAAA,IACH;AAAA,KACF;AAEJ;AAEA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuE;AACrE,QAAM,QAAc;AAAA,IAClB,MACE,kBAAkB;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,SAAS,EAAE,QAAQ,MAAM,SAAS,WAAW,OAAU,IAAI;AAAA,IACrE,CAAC;AAAA,IACH,CAAC,MAAM,MAAM,SAAS,QAAQ,MAAM,OAAO;AAAA,EAC7C;AAGA,QAAM,EAAE,SAAS,MAAM,IAAI,MAAM,OAAO;AACxC,QAAM,WAAW,QAAQ,MAAM,KAAK,CAAC,SAAS,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,YAAY,MAAM,OAAQ,YAAY,CAAC;AAC1G,QAAM,QAAQ,KAAK,KAAK,KAAK;AAC7B,SACE,gBAAAA,KAAC,uBAAoB,OAAc,OAAM,WACvC,0BAAAC;AAAA,IAACK;AAAA,IAAA;AAAA,MACC,SAAQ;AAAA,MACR,IAAI,EAAE,GAAG,GAAG,SAAS,sBAAsB,OAAO,gBAAgB,UAAU,GAAG,QAAQ,OAAO;AAAA,MAE9F;AAAA,wBAAAL,MAACE,QAAA,EAAM,WAAU,OAAM,SAAS,MAAM,YAAW,UAAS,IAAI,EAAE,UAAU,EAAE,GACzE;AAAA,oBACC,gBAAAH,KAACK,MAAA,EAAI,WAAU,OAAM,KAAK,SAAS,KAAI,IAAG,IAAI,EAAE,OAAO,IAAI,QAAQ,IAAI,WAAW,WAAW,YAAY,EAAE,GAAG,IAE9G,gBAAAL;AAAA,YAACO;AAAA,YAAA;AAAA,cACC,eAAW;AAAA,cACX,IAAI,EAAE,OAAO,IAAI,QAAQ,IAAI,UAAU,IAAI,YAAY,KAAK,SAAS,gBAAgB,OAAO,uBAAuB;AAAA,cAElH,gBAAM,OAAO,CAAC,EAAE,YAAY;AAAA;AAAA,UAC/B;AAAA,UAEF,gBAAAP,KAACI,aAAA,EAAW,IAAI,EAAE,YAAY,KAAK,UAAU,GAAG,MAAM,GAAG,cAAc,WAAW,GAAI,iBAAM;AAAA,UAC5F,gBAAAJ,KAACI,aAAA,EAAW,SAAQ,WAAU,OAAM,kBAAiB,IAAI,EAAE,eAAe,cAAc,YAAY,EAAE,GACnG,gBACH;AAAA,WACF;AAAA,QACC,UACC,gBAAAJ,KAACI,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,IAAI,EAAE,IAAI,IAAI,GAC9D,mBACH,IACE;AAAA,QACH,aACC,gBAAAJ,KAACK,MAAA,EAAI,IAAI,EAAE,IAAI,EAAE,GAAI,qBAAW,IAAI,GAAE,IAEtC,gBAAAJ,MAACE,QAAA,EAAM,WAAU,OAAM,SAAS,KAAK,YAAW,UAAS,IAAI,EAAE,IAAI,EAAE,GACnE;AAAA,0BAAAH,KAACQ,SAAA,EAAO,SAAQ,aAAY,MAAK,SAAQ,UAAU,IAAI,sBAEvD;AAAA,UACA,gBAAAR;AAAA,YAACI;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,OAAO,OAAO,gBAAgB,aAAa,qBAAqB,EAAE;AAAA,cACjG;AAAA;AAAA,UAED;AAAA,WACF;AAAA,QAED,YACC,gBAAAH,MAACG,aAAA,EAAW,SAAQ,WAAU,OAAM,kBAAiB,IAAI,EAAE,SAAS,SAAS,IAAI,IAAI,GAAG;AAAA;AAAA,UACzE;AAAA,UAAK;AAAA,WACpB;AAAA;AAAA;AAAA,EAEJ,GACF;AAEJ;;;AClJA,SAAS,aAAAK,kBAAiB;AAQnB,IAAM,yBAAyB,MAAM;AAC1C,QAAM,sBAAsB,gBAAgB;AAE5C,EAAAC,WAAU,MAAM;AAEd,wBAAoB,WAAW,mBAAmB;AAAA,EACpD,GAAG,CAAC,mBAAmB,CAAC;AAExB,SAAO;AAAA,IACL,GAAG;AAAA;AAAA,IAEH,iBAAiB,oBAAoB,gBAAgB,KAAK,mBAAmB;AAAA,IAC7E,oBAAoB,oBAAoB,mBAAmB,KAAK,mBAAmB;AAAA,IACnF,uBAAuB,oBAAoB,sBAAsB,KAAK,mBAAmB;AAAA,EAC3F;AACF;;;ACvBA,OAAOC,UAAS,YAAAC,WAAU,aAAAC,kBAAiB;AAC3C,SAAS,YAAAC,WAAU,SAAAC,QAAO,iBAAiB;AAC3C;AAAA,EACE,OAAAC;AAAA,EACA,cAAAC;AAAA,EACA,SAAAC;AAAA,EACA;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,EACA,UAAAC;AAAA,EACA,QAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,eAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,UAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAAC;AAAA,EACA,iBAAAC;AAAA,OACK;AAyhBG,SAuFU,YAAAC,WAvFV,OAAAC,OAmCE,QAAAC,aAnCF;AAveV,IAAM,cAA0C,CAAC,EAAE,MAAM,QAAQ,MAAM;AACrE,QAAM,EAAE,SAAS,WAAW,iBAAiB,cAAc,eAAe,SAAS,aAAa,IAAI,eAAe;AACnH,QAAM,kCAAkC;AAAA,IACtC,CAAC,UAAU,MAAM;AAAA,EACnB;AACA,QAAM;AAAA,IACJ;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,cAAc;AAAA,EAChB,IAAI,eAAe;AAGnB,QAAM,6BAA6B,mBAAmB;AAGtD,EAAAC,WAAU,MAAM;AACd,QAAI,MAAM;AACR,kBAAY,YAAY,uBAAuB;AAAA,QAC7C;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,MAAM,iBAAiB,iCAAiC,0BAA0B,CAAC;AAEvF,QAAM,CAAC,WAAW,YAAY,IAAIC,UAAS,EAAE;AAC7C,QAAM,CAAC,aAAa,cAAc,IAAIA,UAA0B,MAAM;AACtE,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAwB,IAAI;AAC9D,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAS,EAAE;AACrD,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAS,KAAK;AAC5D,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAmB,CAAC,CAAC;AAC3D,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,KAAK;AACpD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,KAAK;AACtD,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAmC,MAAM;AAC/E,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAyB,CAAC,CAAC;AACvE,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAS,KAAK;AAC1D,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAyB;AAAA,IACnE,aAAa;AAAA,IACb,UAAU;AAAA,EACZ,CAAC;AAED,QAAM,QAAQC,UAAS;AACvB,QAAM,eAAeC,eAAc,MAAM,YAAY,KAAK,IAAI,CAAC;AAG/D,QAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBd,QAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAShB,QAAM,OAAO,WAAW,KAAK;AAC7B,QAAMC,SAAQ,KAAK,QAAQ;AAC3B,QAAM,QAAQ,KAAK,SAAS;AAC5B,QAAM,WAAW,KAAK,WAAW;AACjC,QAAM,SAAS,aAAa,KAAK;AACjC,QAAM,QAAQ,KAAK,QAAQ;AAC3B,QAAM,aAAa,KAAK,QAAQ;AAEhC,QAAM,YAAY,YAAY;AAC5B,QAAI,UAAU,KAAK,GAAG;AACpB,UAAI,4BAA4B;AAC9B,YAAI;AACF,gBAAM,gBAAgB,UAAU,KAAK,CAAC;AAEtC,gBAAM,WAAW,MAAM,kBAAkB;AACzC,4BAAmB,YAAY,CAAC,CAAoB;AAAA,QACtD,SAAS,OAAO;AACd,sBAAY,MAAM,+BAA+B,EAAE,MAAM,CAAC;AAE1D,gBAAM,UAAU,UAAU,KAAK,GAAG,CAAC,GAAG,MAAM;AAAA,QAC9C;AAAA,MACF,OAAO;AACL,cAAM,UAAU,UAAU,KAAK,GAAG,CAAC,GAAG,MAAM;AAAA,MAC9C;AACA,mBAAa,EAAE;AAAA,IACjB;AAAA,EACF;AAGA,EAAAJ,WAAU,MAAM;AACd,QAAI,QAAQ,4BAA4B;AACtC,YAAM,qBAAqB,YAAY;AACrC,YAAI;AACF,gBAAM,WAAW,MAAM,kBAAkB;AACzC,sBAAY,YAAY,0BAA0B;AAAA,YAChD,OAAO,UAAU,UAAU;AAAA,YAC3B,SAAS,MAAM,QAAQ,QAAQ;AAAA,UACjC,CAAC;AACD,4BAAmB,YAAY,CAAC,CAAoB;AAAA,QACtD,SAAS,OAAO;AACd,sBAAY,MAAM,kCAAkC,EAAE,MAAM,CAAC;AAC7D,4BAAkB,CAAC,CAAC;AAAA,QACtB;AAAA,MACF;AACA,yBAAmB;AAAA,IACrB;AAAA,EACF,GAAG,CAAC,MAAM,4BAA4B,iBAAiB,CAAC;AAGxD,EAAAA,WAAU,MAAM;AACd,QAAI,QAAQ,CAAC,4BAA4B;AACvC,YAAM,oBAAoB,YAAY;AACpC,YAAI;AACF,gBAAM,QAAQ;AAAA,QAChB,SAAS,OAAO;AACd,sBAAY,MAAM,iCAAiC,EAAE,MAAM,CAAC;AAAA,QAC9D;AAAA,MACF;AACA,wBAAkB;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,MAAM,4BAA4B,OAAO,CAAC;AAG9C,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,8BAA8B,CAAC,cAAc;AAChD,YAAM,iBAAiB,YAAY;AACjC,YAAI;AACF,gBAAM,QAAQ;AAAA,QAChB,SAAS,OAAO;AACd,sBAAY,MAAM,uCAAuC,EAAE,MAAM,CAAC;AAAA,QACpE;AAAA,MACF;AACA,qBAAe;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,4BAA4B,cAAc,OAAO,CAAC;AAEtD,QAAM,oBAAoB,YAAY;AACpC,QAAI,YAAY,WAAW,EAAG;AAG9B,QAAI,eAAe;AACnB,QAAI,aAAa;AAEjB,eAAW,MAAM,aAAa;AAC5B,UAAI;AACF,cAAM,mBAAmB,EAAE;AAC3B;AAGA,cAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,GAAG,CAAC;AAAA,MACvD,SAAS,OAAO;AACd,oBAAY,MAAM,8CAA8C,EAAE,IAAI,MAAM,CAAC;AAC7E;AAAA,MACF;AAAA,IACF;AAEA,mBAAe,CAAC,CAAC;AACjB,uBAAmB,KAAK;AACxB,mBAAe,KAAK;AAAA,EACtB;AAEA,QAAM,iBAAiB,OAAO,WAAoB;AAChD,gBAAY,YAAY,uBAAuB;AAAA,MAC7C,OAAO,YAAY;AAAA,MACnB;AAAA,IACF,CAAC;AAED,QAAI,YAAY,WAAW,GAAG;AAC5B,kBAAY,KAAK,kCAAkC;AACnD;AAAA,IACF;AAEA,QAAI,4BAA4B;AAE9B,UAAI,eAAe;AACnB,UAAI,aAAa;AAEjB,iBAAW,MAAM,aAAa;AAC5B,YAAI;AACF,gBAAM,SAAS,MAAM,mBAAmB,IAAI,EAAE,OAAO,CAAC;AACtD,cAAI,UAAU,OAAO,SAAS;AAC5B;AAAA,UACF,OAAO;AACL,wBAAY,MAAM,6CAA6C;AAAA,cAC7D;AAAA,cACA,OAAO,QAAQ,SAAS;AAAA,YAC1B,CAAC;AACD;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AACd,sBAAY,MAAM,+CAA+C,EAAE,IAAI,MAAM,CAAC;AAC9E;AAAA,QACF;AAAA,MACF;AAEA,kBAAY,YAAY,6BAA6B;AAAA,QACnD;AAAA,QACA;AAAA,MACF,CAAC;AAGD,UAAI;AACF,cAAM,WAAW,MAAM,kBAAkB;AACzC,0BAAmB,YAAY,CAAC,CAAoB;AAAA,MACtD,SAAS,OAAO;AACd,oBAAY,MAAM,sDAAsD,EAAE,MAAM,CAAC;AAAA,MACnF;AAAA,IACF,OAAO;AAEL,UAAI;AACF,YAAI,eAAe;AAEnB,mBAAW,MAAM,aAAa;AAC5B,gBAAM,iBAAiB,eAAe,SAAS,EAAE;AACjD,gBAAM,SAAS,eAAe,KAAK,WAAS,MAAM,OAAO,EAAE;AAE3D,cAAI,QAAQ;AACV,gBAAI,OAAO,WAAW,QAAQ;AAC5B,8BAAgB,EAAE;AAClB;AAAA,YACF,OAAO;AACL,0BAAY,YAAY,wCAAwC,EAAE,IAAI,OAAO,CAAC;AAAA,YAChF;AAAA,UACF,OAAO;AACL,wBAAY,KAAK,qDAAqD,EAAE,GAAG,CAAC;AAAA,UAC9E;AAAA,QACF;AAEA,oBAAY,YAAY,4BAA4B,EAAE,aAAa,CAAC;AAAA,MACtE,SAAS,OAAO;AACd,oBAAY,MAAM,qCAAqC,EAAE,MAAM,CAAC;AAAA,MAClE;AAAA,IACF;AAEA,mBAAe,CAAC,CAAC;AACjB,uBAAmB,KAAK;AAAA,EAC1B;AAEA,QAAM,qBAAqB,OAAO,aAAqB;AACrD,QAAI,4BAA4B;AAC9B,UAAI;AACF,cAAM,SAAS,MAAM,mBAAmB,QAAQ;AAEhD,YAAI,UAAU,OAAO,SAAS;AAE5B,gBAAM,WAAW,MAAM,kBAAkB;AACzC,4BAAmB,YAAY,CAAC,CAAoB;AAAA,QACtD,OAAO;AACL,gBAAM,IAAI,MAAM,QAAQ,SAAS,yBAAyB;AAAA,QAC5D;AAAA,MACF,SAAS,OAAO;AACd,oBAAY,MAAM,kCAAkC,EAAE,MAAM,CAAC;AAE7D,cAAM;AAAA,MACR;AAAA,IACF,OAAO;AACL,mBAAa,QAAQ;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,kBAAkB,CAAC,OAAe;AACtC;AAAA,MAAe,CAAC,SACd,KAAK,SAAS,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,MAAM,EAAE,IAAI,CAAC,GAAG,MAAM,EAAE;AAAA,IACjE;AAAA,EACF;AAEA,QAAM,mBAAmB,YAAY;AACnC,QAAI,CAAC,6BAA6B;AAChC,kBAAY,MAAM,qCAAqC;AACvD;AAAA,IACF;AAEA,sBAAkB,EAAE,aAAa,MAAM,UAAU,sBAAsB,CAAC;AAExE,QAAI;AAEF,YAAM,QAAQ;AACd,YAAM,oBAAoB;AAE1B,UAAI,kBAAkB,WAAW,GAAG;AAClC,0BAAkB;AAAA,UAChB,aAAa;AAAA,UACb,UAAU;AAAA,UACV,QAAQ,EAAE,SAAS,OAAO,SAAS,qCAAqC;AAAA,QAC1E,CAAC;AACD;AAAA,MACF;AAGA,YAAM,mBAAmB,kBAAkB,IAAI,YAAU;AAAA,QACvD,SAAS,MAAM;AAAA,QACf,OAAO,qBAAqB,IAAI,KAAK,MAAM,SAAS,EAAE,mBAAmB,CAAC;AAAA,QAC1E,MAAM,MAAM,QAAQ,CAAC;AAAA,MACvB,EAAE;AAGF,YAAM,SAAS,MAAM,4BAA4B,kBAAkB;AAAA,QACjE,MAAM;AAAA,QACN,eAAe;AAAA,QACf,WAAW;AAAA;AAAA,QACX,iBAAiB;AAAA,QACjB,YAAY,CAAC,SAAiB,OAAe,YAAoB;AAC/D,4BAAkB;AAAA,YAChB,aAAa;AAAA,YACb,UAAU,GAAG,OAAO,KAAK,OAAO,IAAI,KAAK;AAAA,UAC3C,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAED,wBAAkB;AAAA,QAChB,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ;AAAA,UACN,SAAS,OAAO;AAAA,UAChB,SAAS,OAAO;AAAA,UAChB,SAAS;AAAA,YACP,eAAe,OAAO;AAAA,YACtB,cAAc,OAAO;AAAA,YACrB,cAAc,OAAO;AAAA,YACrB,UAAU,OAAO;AAAA,YACjB,UAAU,IAAI,OAAO,WAAW,KAAM,QAAQ,CAAC,CAAC;AAAA,UAClD;AAAA,QACF;AAAA,MACF,CAAC;AAED,UAAI,OAAO,SAAS;AAElB,cAAM,WAAW,MAAM,kBAAkB;AACzC,0BAAmB,YAAY,CAAC,CAAoB;AAGpD,mBAAW,MAAM;AACf,4BAAkB,KAAK;AACvB,4BAAkB,EAAE,aAAa,OAAO,UAAU,GAAG,CAAC;AAAA,QACxD,GAAG,GAAI;AAAA,MACT;AAAA,IACF,SAAS,OAAO;AACd,kBAAY,MAAM,sBAAsB,EAAE,MAAM,CAAC;AACjD,wBAAkB;AAAA,QAChB,aAAa;AAAA,QACb,UAAU,kBAAkB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MACpF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,wBAAwB,MAAM;AAClC,QAAI,4BAA4B;AAE9B,YAAM,sBAAsB,eAAe,IAAI,mBAAiB;AAAA,QAC9D,GAAG;AAAA;AAAA;AAAA,QAGH,QAAQ,aAAa,UAAU;AAAA;AAAA,QAC/B,QAAQ,aAAa,UAAU;AAAA;AAAA,QAC/B,WAAW,aAAa,aAAa,IAAI,KAAK,aAAa,UAAU,EAAE,QAAQ,IAAI,KAAK,IAAI;AAAA,QAC5F,MAAM,aAAa,QAAQ,CAAC;AAAA,MAC9B,EAAE;AAGF,YAAM,SAAS,oBAAoB,OAAO,YAAU,OAAO,WAAW,WAAW;AACjF,kBAAY,YAAY,wCAAwC;AAAA,QAC9D;AAAA,QACA,qBAAqB,eAAe;AAAA,QACpC,aAAa,OAAO;AAAA,MACtB,CAAC;AACD,aAAO;AAAA,IACT,OAAO;AAEL,YAAM,SAAS,QAAQ,OAAO,CAAC,UAAU,MAAM,WAAW,WAAW;AACrE,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,qBAAqB,MAAM;AAC/B,QAAI,4BAA4B;AAC9B,aAAO,eAAe,OAAO,aAAW,OAAO,UAAU,YAAY,MAAM,EAAE;AAAA,IAC/E,OAAO;AACL,aAAO,QAAQ,OAAO,OAAK,EAAE,WAAW,MAAM,EAAE;AAAA,IAClD;AAAA,EACF;AAEA,QAAM,qBAAqB,MAAM;AAC/B,QAAI,4BAA4B;AAC9B,aAAO,eAAe,OAAO,aAAW,OAAO,UAAU,YAAY,MAAM,EAAE;AAAA,IAC/E,OAAO;AACL,aAAO,QAAQ,OAAO,OAAK,EAAE,WAAW,MAAM,EAAE;AAAA,IAClD;AAAA,EACF;AAEA,QAAM,iBAAiB,YAAY;AACjC,QAAI,4BAA4B;AAE9B,UAAI;AACF,YAAI,mBAAmB,CAAC;AAExB,YAAI,gBAAgB,QAAQ;AAC1B,6BAAmB,eAAe,OAAO,aAAW,OAAO,UAAU,YAAY,MAAM;AAAA,QACzF,WAAW,gBAAgB,QAAQ;AACjC,6BAAmB,eAAe,OAAO,aAAW,OAAO,UAAU,YAAY,MAAM;AAAA,QACzF,OAAO;AACL,6BAAmB;AAAA,QACrB;AAEA,YAAI,eAAe;AACnB,YAAI,aAAa;AAEjB,mBAAW,UAAU,kBAAkB;AACrC,cAAI;AACF,kBAAM,SAAS,MAAM,mBAAmB,OAAO,EAAE;AAEjD,gBAAI,UAAU,OAAO,SAAS;AAC5B;AAAA,YACF,OAAO;AACL;AACA,0BAAY,MAAM,iCAAiC;AAAA,gBACjD,IAAI,OAAO;AAAA,gBACX,OAAO,QAAQ,SAAS;AAAA,cAC1B,CAAC;AAAA,YACH;AAAA,UACF,SAAS,OAAO;AACd;AACA,wBAAY,MAAM,oCAAoC,EAAE,IAAI,OAAO,IAAI,MAAM,CAAC;AAAA,UAChF;AAGA,gBAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,GAAG,CAAC;AAAA,QACvD;AAGA,cAAM,WAAW,MAAM,kBAAkB;AACzC,0BAAmB,YAAY,CAAC,CAAoB;AAAA,MACtD,SAAS,OAAO;AACd,oBAAY,MAAM,+CAA+C,EAAE,MAAM,CAAC;AAAA,MAC5E;AAAA,IACF,OAAO;AAEL,UAAI;AACF,YAAI,gBAAgB,QAAQ;AAC1B,gBAAM,cAAc;AAAA,QACtB,OAAO;AAEL,gBAAM,gBAAgB,QAAQ,OAAO,WAAS,MAAM,WAAW,WAAW;AAC1E,yBAAe,SAAS,EAAE,SAAS,cAAc,CAAC;AAAA,QACpD;AAAA,MACF,SAAS,OAAO;AACd,oBAAY,MAAM,kCAAkC,EAAE,MAAM,CAAC;AAAA,MAC/D;AAAA,IACF;AACA,oBAAgB,KAAK;AAAA,EACvB;AAEA,QAAM,mBAAmB,sBAAsB;AAE/C,QAAM,QACF,gBAAAK;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,IAAI;AAAA,QACF,OAAO;AAAA,QACP,UAAU,eAAe,SAAS;AAAA,QAClC,WAAW,eAAe,qBAAqB;AAAA,QAC/C,QAAQ,eAAe,SAAS;AAAA,QAChC,SAAS,eAAe,MAAM,QAAQ,WAAW,QAAQF;AAAA,QACzD,OAAO,MAAM,QAAQ,KAAK;AAAA,QAC1B,SAAS;AAAA,QACT,eAAe;AAAA,QACf,cAAc,eAAe,kBAAkB;AAAA,QAC/C,UAAU;AAAA,QACV,WAAW,eAAe,SAAS,eAAeG,OAAM,MAAM,QAAQ,OAAO,OAAO,GAAG,CAAC;AAAA,QACxF,QAAQ,eAAe,SAAS,aAAaA,OAAM,MAAM,QAAQ,SAAS,GAAG,CAAC;AAAA,QAC9E,QAAQ;AAAA;AAAA,MACV;AAAA,MAEC;AAAA,wBACC,gBAAAC;AAAA,UAACF;AAAA,UAAA;AAAA,YACC,IAAI;AAAA,cACF,QAAQ;AAAA,cACR,OAAO;AAAA,cACP,cAAc;AAAA,cACd,SAASC,OAAM,MAAM,QAAQ,KAAK,SAAS,IAAI;AAAA,cAC/C,WAAW;AAAA,cACX,IAAI;AAAA,cACJ,IAAI;AAAA,YACN;AAAA;AAAA,QACF;AAAA,QAIF,gBAAAF;AAAA,UAACC;AAAA,UAAA;AAAA,YACC,IAAI;AAAA,cACF,YAAY;AAAA,cACZ,IAAI,eAAe,MAAM;AAAA,cACzB,IAAI,eAAe,OAAO;AAAA,cAC1B,cAAc,aAAa,OAAO,MAAM;AAAA,cACxC,SAAS;AAAA,cACT,eAAe;AAAA,cACf,KAAK,eAAe,MAAM;AAAA,YAC5B;AAAA,YAEA;AAAA,8BAAAD;AAAA,gBAACC;AAAA,gBAAA;AAAA,kBACC,IAAI;AAAA,oBACF,OAAO;AAAA,oBACP,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,gBAAgB;AAAA,oBAChB,KAAK,eAAe,OAAO;AAAA,oBAC3B,UAAU;AAAA,kBACZ;AAAA,kBAEA;AAAA,oCAAAD,MAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,KAAK,GAC1D;AAAA,sCAAAE,MAACC,aAAA,EAAW,SAAQ,MAAK,IAAI,EAAE,YAAY,IAAI,GAAG,oBAElD;AAAA,sBACC,8BACC,gBAAAD,MAACE,UAAA,EAAQ,OAAM,oFACb,0BAAAF;AAAA,wBAACC;AAAA,wBAAA;AAAA,0BACC,SAAQ;AAAA,0BACR,IAAI;AAAA,4BACF,OAAO,MAAM,QAAQ,QAAQ;AAAA,4BAC7B,SAASF,OAAM,MAAM,QAAQ,QAAQ,MAAM,GAAG;AAAA,4BAC9C,IAAI;AAAA,4BACJ,IAAI;AAAA,4BACJ,cAAc;AAAA,4BACd,UAAU;AAAA,4BACV,YAAY;AAAA,4BACZ,eAAe;AAAA,4BACf,QAAQ;AAAA,0BACV;AAAA,0BACD;AAAA;AAAA,sBAED,GACF;AAAA,uBAEJ;AAAA,oBAEA,gBAAAF;AAAA,sBAACC;AAAA,sBAAA;AAAA,wBACC,IAAI;AAAA,0BACF,SAAS;AAAA,0BACT,YAAY;AAAA,0BACZ,gBAAgB;AAAA,0BAChB,KAAK,eAAe,MAAM;AAAA,0BAC1B,UAAU;AAAA,wBACZ;AAAA,wBAEC;AAAA,4CACC,gBAAAD,MAAAM,WAAA,EACE;AAAA,4CAAAN,MAACI,aAAA,EAAW,SAAQ,WAAU,IAAI,EAAE,OAAO,MAAM,QAAQ,KAAK,WAAW,IAAI,IAAI,GAC9E;AAAA,0CAAY;AAAA,8BAAO;AAAA,+BACtB;AAAA,4BACA,gBAAAD;AAAA,8BAACI;AAAA,8BAAA;AAAA,gCACC,SAAQ;AAAA,gCACR,MAAK;AAAA,gCACL,SAAS,MAAM;AACb,qDAAmB,KAAK;AACxB,iDAAe,CAAC,CAAC;AAAA,gCACnB;AAAA,gCACA,IAAI,EAAE,eAAe,QAAQ,cAAc,GAAG,UAAU,UAAU;AAAA,gCACnE;AAAA;AAAA,4BAED;AAAA,4BACC,YAAY,SAAS,KACpB,gBAAAP,MAAAM,WAAA,EACE;AAAA,8CAAAN;AAAA,gCAACO;AAAA,gCAAA;AAAA,kCACC,SAAQ;AAAA,kCACR,MAAK;AAAA,kCACL,OAAM;AAAA,kCACN,SAAS,MAAM,eAAe,IAAI;AAAA,kCAClC,IAAI,EAAE,eAAe,QAAQ,cAAc,GAAG,UAAU,UAAU;AAAA,kCACnE;AAAA;AAAA,oCACO,YAAY;AAAA,oCAAO;AAAA;AAAA;AAAA,8BAC3B;AAAA,8BACA,gBAAAP;AAAA,gCAACO;AAAA,gCAAA;AAAA,kCACC,SAAQ;AAAA,kCACR,MAAK;AAAA,kCACL,SAAS,MAAM,eAAe,KAAK;AAAA,kCACnC,IAAI,EAAE,eAAe,QAAQ,cAAc,GAAG,UAAU,UAAU;AAAA,kCACnE;AAAA;AAAA,oCACS,YAAY;AAAA,oCAAO;AAAA;AAAA;AAAA,8BAC7B;AAAA,8BACA,gBAAAP;AAAA,gCAACO;AAAA,gCAAA;AAAA,kCACC,SAAQ;AAAA,kCACR,MAAK;AAAA,kCACL,OAAM;AAAA,kCACN,SAAS,MAAM,eAAe,IAAI;AAAA,kCAClC,IAAI,EAAE,eAAe,QAAQ,cAAc,GAAG,UAAU,UAAU;AAAA,kCACnE;AAAA;AAAA,oCACU,YAAY;AAAA,oCAAO;AAAA;AAAA;AAAA,8BAC9B;AAAA,+BACF;AAAA,6BAEJ,IAEA,iBAAiB,SAAS,KACxB,gBAAAP,MAAAM,WAAA,EACE;AAAA,4CAAAH;AAAA,8BAACI;AAAA,8BAAA;AAAA,gCACC,SAAQ;AAAA,gCACR,MAAK;AAAA,gCACL,SAAS,MAAM,gBAAgB,IAAI;AAAA,gCACnC,IAAI,EAAE,eAAe,QAAQ,cAAc,GAAG,UAAU,UAAU;AAAA,gCACnE;AAAA;AAAA,4BAED;AAAA,4BACC,mBAAmB,QAAQ,SAAS,KACnC,gBAAAJ;AAAA,8BAACI;AAAA,8BAAA;AAAA,gCACC,SAAQ;AAAA,gCACR,MAAK;AAAA,gCACL,OAAM;AAAA,gCACN,SAAS,MAAM,kBAAkB,IAAI;AAAA,gCACrC,WAAW,gBAAAJ,MAAC,aAAc;AAAA,gCAC1B,IAAI,EAAE,eAAe,QAAQ,cAAc,GAAG,UAAU,UAAU;AAAA,gCACnE;AAAA;AAAA,4BAED;AAAA,4BAEF,gBAAAA;AAAA,8BAACI;AAAA,8BAAA;AAAA,gCACC,SAAQ;AAAA,gCACR,MAAK;AAAA,gCACL,OAAM;AAAA,gCACN,SAAS,MAAM;AACb,qDAAmB,IAAI;AACvB,iDAAe,CAAC,CAAC;AAAA,gCACnB;AAAA,gCACA,IAAI,EAAE,eAAe,QAAQ,cAAc,GAAG,UAAU,UAAU;AAAA,gCACnE;AAAA;AAAA,4BAED;AAAA,6BACF;AAAA,0BAIH,CAAC,mBAAmB,gBACnB,gBAAAJ;AAAA,4BAACI;AAAA,4BAAA;AAAA,8BACC,SAAQ;AAAA,8BACR,MAAK;AAAA,8BACL,SAAS;AAAA,8BACT,UAAU,CAAC,UAAU,KAAK;AAAA,8BAC1B,IAAI;AAAA,gCACF,eAAe;AAAA,gCACf,cAAc;AAAA,gCACd,YAAY;AAAA,gCACZ,UAAU;AAAA,8BACZ;AAAA,8BACD;AAAA;AAAA,0BAED;AAAA,0BAGF,gBAAAJ;AAAA,4BAACK;AAAA,4BAAA;AAAA,8BACC,SAAS;AAAA,8BACT,IAAI;AAAA,gCACF,OAAO,OAAO;AAAA,gCACd,WAAW,EAAE,SAASN,OAAM,MAAM,QAAQ,KAAK,SAAS,IAAI,EAAE;AAAA,gCAC9D,cAAc;AAAA,8BAChB;AAAA,8BACA,MAAK;AAAA,8BAEL,0BAAAC,MAAC,KAAU,UAAS,SAAQ;AAAA;AAAA,0BAC9B;AAAA;AAAA;AAAA,oBACF;AAAA;AAAA;AAAA,cACF;AAAA,cAEA,gBAAAH;AAAA,gBAACC;AAAA,gBAAA;AAAA,kBACC,IAAI;AAAA,oBACF,SAAS;AAAA,oBACT,UAAU;AAAA,oBACV,KAAK;AAAA,oBACL,OAAO,MAAM,QAAQ,KAAK;AAAA,kBAC5B;AAAA,kBAEA;AAAA,oCAAAE;AAAA,sBAACC;AAAA,sBAAA;AAAA,wBACC,SAAQ;AAAA,wBACR,IAAI;AAAA,0BACF,OAAO,MAAM,QAAQ,KAAK;AAAA,0BAC1B,cAAc;AAAA,0BACd,IAAI;AAAA,0BACJ,IAAI;AAAA,0BACJ,SAASF,OAAM,MAAM,QAAQ,KAAK,WAAW,GAAG;AAAA,0BAChD,eAAe;AAAA,0BACf,eAAe;AAAA,wBACjB;AAAA,wBAEC,uCAA6B,iBAAiB;AAAA;AAAA,oBACjD;AAAA,oBACC,iBAAiB,SAAS,KACzB,gBAAAF;AAAA,sBAACI;AAAA,sBAAA;AAAA,wBACC,SAAQ;AAAA,wBACR,IAAI;AAAA,0BACF,OAAO,MAAM,QAAQ,KAAK;AAAA,0BAC1B,cAAc;AAAA,0BACd,IAAI;AAAA,0BACJ,IAAI;AAAA,0BACJ,SAASF,OAAM,MAAM,QAAQ,KAAK,WAAW,GAAG;AAAA,0BAChD,eAAe;AAAA,0BACf,eAAe;AAAA,wBACjB;AAAA,wBAEC;AAAA,2CAAiB;AAAA,0BAAO;AAAA,0BAAE;AAAA;AAAA;AAAA,oBAC7B;AAAA;AAAA;AAAA,cAEJ;AAAA;AAAA;AAAA,QACF;AAAA,QAEC,8BACC,gBAAAF,MAACC,MAAA,EAAI,IAAI;AAAA,UACP,YAAY;AAAA,UACZ,IAAI,eAAe,MAAM;AAAA,UACzB,IAAI;AAAA,UACJ,GAAG;AAAA,UACH,YAAY,2BAA2BC,OAAM,MAAM,QAAQ,QAAQ,MAAM,IAAI,CAAC,KAAKA,OAAM,MAAM,QAAQ,UAAU,MAAM,IAAI,CAAC;AAAA,UAC5H,QAAQ,aAAaA,OAAM,MAAM,QAAQ,QAAQ,MAAM,GAAG,CAAC;AAAA,UAC3D,cAAc;AAAA,UACd,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,KAAK;AAAA,UACL,UAAU;AAAA,UACV,UAAU;AAAA,QACZ,GAEE;AAAA,0BAAAC,MAACF,MAAA,EAAI,IAAI;AAAA,YACP,UAAU;AAAA,YACV,KAAK;AAAA,YACL,MAAM;AAAA,YACN,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,YAAY,uCAAuCC,OAAM,MAAM,QAAQ,QAAQ,MAAM,GAAG,CAAC;AAAA,YACzF,WAAW,GAAG,OAAO;AAAA,UACvB,GAAG;AAAA,UACH,gBAAAC,MAACF,MAAA,EAAI,IAAI;AAAA,YACP,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,SAAS,MAAM,QAAQ,QAAQ;AAAA,YAC/B,WAAW,GAAG,KAAK;AAAA,YACnB,QAAQ;AAAA,UACV,GAAG;AAAA,UACH,gBAAAE,MAACC,aAAA,EAAW,SAAQ,SAAQ,IAAI;AAAA,YAC9B,OAAO,MAAM,QAAQ,QAAQ;AAAA,YAC7B,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,QAAQ;AAAA,UACV,GAAG,sDAEH;AAAA,WACF;AAAA,QAIF,gBAAAJ,MAACC,MAAA,EAAI,IAAI,EAAE,YAAY,EAAE,GACvB;AAAA,0BAAAE,MAACF,MAAA,EAAI,IAAI,EAAE,IAAI,eAAe,MAAM,GAAG,IAAI,eAAe,OAAO,IAAI,GACnE,0BAAAE;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,IAAI,EAAE,OAAO,MAAM,QAAQ,KAAK,WAAW,UAAU,WAAW,WAAW,eAAe,SAAS,SAAS;AAAA,cAE3G,uCACC,6CAEA;AAAA;AAAA,UAEJ,GACF;AAAA,UACA,gBAAAJ;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,cACP,UAAU,CAAC,GAAG,QAAQ,eAAe,GAAG;AAAA,cACxC,WAAU;AAAA,cACV,gBAAe;AAAA,cACf,UAAU,CAAC;AAAA,cACX,SAAS,eAAe,cAAc;AAAA,cACtC,IAAI;AAAA,gBACF,SAASE,OAAM,OAAO,eAAe,OAAO,GAAG;AAAA,gBAC/C,WAAW,eAAe,aAAaA,OAAM,MAAM,QAAQ,SAAS,IAAI,CAAC,KAAK;AAAA,gBAC9E,cAAc,aAAaA,OAAM,MAAM,QAAQ,SAAS,IAAI,CAAC;AAAA,gBAC7D,kBAAkB;AAAA,kBAChB,eAAe;AAAA,kBACf,YAAY;AAAA,kBACZ,WAAW,eAAe,KAAK;AAAA,kBAC/B,eAAe,eAAe,IAAI;AAAA,gBACpC;AAAA,cACF;AAAA,cAEA;AAAA,gCAAAC;AAAA,kBAAC;AAAA;AAAA,oBACC,OACE,gBAAAH,MAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GAAG;AAAA;AAAA,sBAEzD,mBAAmB,IAAI,KACtB,gBAAAE,MAACC,aAAA,EAAW,SAAQ,WAAU,IAAI;AAAA,wBAChC,SAASF,OAAM,MAAM,QAAQ,QAAQ,MAAM,GAAG;AAAA,wBAC9C,OAAO,MAAM,QAAQ,QAAQ;AAAA,wBAC7B,IAAI;AAAA,wBACJ,IAAI;AAAA,wBACJ,cAAc;AAAA,wBACd,UAAU;AAAA,wBACV,YAAY;AAAA,sBACd,GACG,6BAAmB,GACtB;AAAA,uBAEJ;AAAA,oBAEF,OAAM;AAAA;AAAA,gBACR;AAAA,gBACA,gBAAAC;AAAA,kBAAC;AAAA;AAAA,oBACC,OACE,gBAAAH,MAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GAAG;AAAA;AAAA,sBAEzD,mBAAmB,IAAI,KACtB,gBAAAE,MAACC,aAAA,EAAW,SAAQ,WAAU,IAAI;AAAA,wBAChC,SAASF,OAAM,MAAM,QAAQ,UAAU,MAAM,GAAG;AAAA,wBAChD,OAAO,MAAM,QAAQ,UAAU;AAAA,wBAC/B,IAAI;AAAA,wBACJ,IAAI;AAAA,wBACJ,cAAc;AAAA,wBACd,UAAU;AAAA,wBACV,YAAY;AAAA,sBACd,GACG,6BAAmB,GACtB;AAAA,uBAEJ;AAAA,oBAEF,OAAM;AAAA;AAAA,gBACR;AAAA;AAAA;AAAA,UACF;AAAA,WACF;AAAA,QAGA,gBAAAC;AAAA,UAACF;AAAA,UAAA;AAAA,YACC,IAAI;AAAA,cACF,UAAU;AAAA,cACV,WAAW;AAAA,cACX,IAAI,eAAe,MAAM;AAAA,cACzB,IAAI,eAAe,IAAI;AAAA,YACzB;AAAA,YAEC,2BAAiB,WAAW,IAC3B,gBAAAD,MAACC,MAAA,EAAI,IAAI;AAAA,cACP,SAAS;AAAA,cACT,eAAe;AAAA,cACf,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,QAAQ;AAAA,cACR,WAAW;AAAA,YACb,GACE;AAAA,8BAAAD,MAACI,aAAA,EAAW,SAAQ,MAAK,IAAI;AAAA,gBAC3B,OAAO,MAAM,QAAQ,KAAK;AAAA,gBAC1B,IAAI;AAAA,gBACJ,UAAU;AAAA,cACZ,GAAG;AAAA;AAAA,gBACG;AAAA,gBAAY;AAAA,iBAClB;AAAA,cACA,gBAAAD,MAACC,aAAA,EAAW,SAAQ,SAAQ,IAAI;AAAA,gBAC9B,OAAOF,OAAM,MAAM,QAAQ,KAAK,WAAW,GAAG;AAAA,gBAC9C,UAAU;AAAA,cACZ,GACG,0BAAgB,SACb,6BACE,6HACA,uFACF,6BACE,8HACA,uEAER;AAAA,eACF,IAEA,iBAAiB,IAAI,CAAC,QAAQ,gBAAgB;AAC5C,oBAAM,aAAa,YAAY,SAAS,OAAO,EAAE;AACjD,qBACE,gBAAAF,MAACS,OAAM,UAAN,EACC;AAAA,gCAAAN,MAACO,OAAA,EAAK,IAAI,EAAE,WAAW,QAAQ,IAAI,GAAG,GAAG,EAAE,GACzC,0BAAAV;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAS,MAAM,mBAAmB,gBAAgB,OAAO,EAAE;AAAA,oBAC3D,IAAI;AAAA,sBACF,IAAI;AAAA,sBACJ,IAAI;AAAA,sBACJ,SAAS;AAAA,sBACT,gBAAgB;AAAA,sBAChB,KAAK;AAAA,sBACL,YAAY;AAAA,sBACZ,SAAS,aAAaE,OAAM,MAAM,QAAQ,MAAM,MAAM,GAAG,IAAI;AAAA,sBAC7D,cAAc,aAAa,IAAI;AAAA,sBAC/B,QAAQ,kBAAkB,YAAY;AAAA,sBACtC,QAAQ,aAAa,aAAaA,OAAM,MAAM,QAAQ,MAAM,MAAM,GAAG,CAAC,KAAK;AAAA,sBAC3E,YAAY;AAAA,sBACZ,WAAW;AAAA,wBACT,SAAS,kBAAkBA,OAAM,MAAM,QAAQ,MAAM,MAAM,IAAI,IAAIA,OAAM,MAAM,QAAQ,KAAK,SAAS,IAAI;AAAA,sBAC3G;AAAA,oBACF;AAAA,oBAEA;AAAA,sCAAAF;AAAA,wBAACC;AAAA,wBAAA;AAAA,0BACC,IAAI;AAAA,4BACF,SAAS;AAAA,4BACT,YAAY;AAAA,4BACZ,UAAU;AAAA,4BACV,KAAK;AAAA,0BACP;AAAA,0BAEA;AAAA,4CAAAE;AAAA,8BAACQ;AAAA,8BAAA;AAAA,gCACC,KAAI;AAAA,gCACJ,KAAI;AAAA,gCACJ,IAAI;AAAA,kCACF,OAAO;AAAA,kCACP,QAAQ;AAAA,kCACR,IAAI;AAAA,kCACJ,SAAS,MAAM,QAAQ,SAAS,UAAU,YAAY,MAAM,QAAQ,WAAW;AAAA,kCAC/E,QAAQ,kBACJ,aAAaT,OAAM,MAAM,QAAQ,QAAQ,MAAM,GAAG,CAAC,KACnD,aAAa,MAAM,QAAQ,OAAO;AAAA,kCACtC,UAAU;AAAA,gCACZ;AAAA,gCAEC,6BACC,gBAAAC,MAACF,MAAA,EAAI,IAAI;AAAA,kCACP,UAAU;AAAA,kCACV,KAAK;AAAA,kCACL,OAAO;AAAA,kCACP,OAAO;AAAA,kCACP,QAAQ;AAAA,kCACR,cAAc;AAAA,kCACd,SAAS,MAAM,QAAQ,QAAQ;AAAA,kCAC/B,QAAQ,aAAa,MAAM,QAAQ,WAAW,KAAK;AAAA,kCACnD,UAAU;AAAA,kCACV,SAAS;AAAA,kCACT,YAAY;AAAA,kCACZ,gBAAgB;AAAA,kCAChB,OAAO;AAAA,gCACT,GAAG,oBAEH;AAAA;AAAA,4BAEJ;AAAA,4BACC,cAAc,OAAO,KACpB,gBAAAE;AAAA,8BAACS;AAAA,8BAAA;AAAA,gCACC,WAAS;AAAA,gCACT,WAAS;AAAA,gCACT,WAAS;AAAA,gCACT,OAAO;AAAA,gCACP,UAAU,CAAC,MAAM,iBAAiB,EAAE,OAAO,KAAK;AAAA,gCAChD,QAAQ,MAAM;AACZ,sCACE,cAAc,KAAK,KACnB,kBAAkB,OAAO,SACzB;AACA,mDAAe,SAAS,CAAC,WAAW;AAAA,sCAClC,SAAS,MAAM,QAAQ;AAAA,wCAAI,CAAC,UAC1B,MAAM,OAAO,OAAO,KAChB,EAAE,GAAG,OAAO,SAAS,cAAc,IACnC;AAAA,sCACN;AAAA,oCACF,EAAE;AAAA,kCACJ;AACA,+CAAa,IAAI;AAAA,gCACnB;AAAA,gCACA,WAAW,CAAC,MAAM;AAChB,sCAAI,EAAE,QAAQ,UAAU;AACtB,iDAAa,IAAI;AACjB,qDAAiB,EAAE;AAAA,kCACrB,WAAW,EAAE,QAAQ,YAAY,EAAE,WAAW,EAAE,UAAU;AACxD,sCAAE,cAAc,KAAK;AAAA,kCACvB;AAAA,gCACF;AAAA,gCACA,IAAI;AAAA,kCACF,wBAAwB;AAAA,oCACtB,OAAO,MAAM,QAAQ,KAAK;AAAA,oCAC1B,SAAS;AAAA,oCACT,cAAc;AAAA,kCAChB;AAAA,kCACA,4BAA4B;AAAA,oCAC1B,cAAc;AAAA,oCACd,cAAc;AAAA,sCACZ,cAAc;AAAA,oCAChB;AAAA,oCACA,oBAAoB;AAAA,sCAClB,cAAc;AAAA,oCAChB;AAAA,oCACA,0BAA0B;AAAA,sCACxB,cAAc;AAAA,oCAChB;AAAA,kCACF;AAAA,gCACF;AAAA,gCACA,YAAW;AAAA;AAAA,4BACb,IAEA,gBAAAZ,MAACC,MAAA,EAAI,IAAI,EAAE,MAAM,EAAE,GACjB;AAAA,8CAAAE;AAAA,gCAACC;AAAA,gCAAA;AAAA,kCACC,IAAI;AAAA,oCACF,QAAS,CAAC,mBAAmB,CAAC,6BAA8B,YAAY;AAAA,oCACxE,WAAW;AAAA,oCACX,OAAO,OAAO,SAAS,mBAAmB,MAAM,QAAQ,KAAK;AAAA,oCAC7D,YAAY,OAAO,SAAS,MAAM;AAAA,oCAClC,YAAY;AAAA,oCACZ,WAAY,CAAC,mBAAmB,CAAC,6BAA8B;AAAA,sCAC7D,OAAO,OAAO,SAAS,mBAAmB;AAAA,oCAC5C,IAAI;AAAA,kCACN;AAAA,kCACA,SAAS,MAAM;AACb,wCAAI,CAAC,mBAAmB,CAAC,4BAA4B;AACnD,mDAAa,OAAO,EAAE;AACtB,uDAAiB,OAAO,OAAO;AAAA,oCACjC;AAAA,kCACF;AAAA,kCAEC,iBAAO;AAAA;AAAA,8BACV;AAAA,8BACC,OAAO,UACN,gBAAAD,MAACC,aAAA,EAAW,SAAQ,WAAU,IAAI;AAAA,gCAChC,OAAOF,OAAM,MAAM,QAAQ,UAAU,MAAM,GAAG;AAAA,gCAC9C,WAAW;AAAA,gCACX,IAAI;AAAA,gCACJ,SAAS;AAAA,8BACX,GAAG,oBAEH;AAAA,+BAEJ;AAAA;AAAA;AAAA,sBAEJ;AAAA,sBACC,CAAC,mBACA,gBAAAF,MAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,KAAK,KAAK,IAAI,IAAI,GAC5C;AAAA,wCAAAE,MAACE,UAAA,EAAQ,OAAO,OAAO,SAAS,iBAAiB,cAC/C,0BAAAF;AAAA,0BAACK;AAAA,0BAAA;AAAA,4BACC,SAAS,YAAY;AACnB,kCAAI,4BAA4B;AAC9B,oCAAI;AAEF,wCAAM,SAAS,MAAM,mBAAmB,OAAO,IAAI,EAAE,QAAQ,CAAC,OAAO,OAAO,CAAC;AAC7E,sCAAI,OAAO,SAAS;AAElB,0CAAM,WAAW,MAAM,kBAAkB;AACzC,sDAAmB,YAAY,CAAC,CAAoB;AAAA,kCACtD,OAAO;AACL,gDAAY,MAAM,6CAA6C;AAAA,sCAC7D,IAAI,OAAO;AAAA,sCACX,OAAO,OAAO;AAAA,oCAChB,CAAC;AAAA,kCACH;AAAA,gCACF,SAAS,OAAO;AACd,8CAAY,MAAM,2CAA2C;AAAA,oCAC3D,IAAI,OAAO;AAAA,oCACX;AAAA,kCACF,CAAC;AAAA,gCACH;AAAA,8BACF,OAAO;AACL,gDAAgB,OAAO,EAAE;AAAA,8BAC3B;AAAA,4BACF;AAAA,4BACA,IAAI;AAAA,8BACF,OAAO,OAAO,SAAS,mBAAmBN,OAAM,MAAM,QAAQ,KAAK,WAAW,GAAG;AAAA,8BACjF,WAAW;AAAA,gCACT,SAASA,OAAM,OAAO,SAAS,MAAM,QAAQ,UAAU,OAAO,MAAM,QAAQ,KAAK,WAAW,GAAG;AAAA,8BACjG;AAAA,4BACF;AAAA,4BACA,MAAK;AAAA,4BAEJ,iBAAO,SACN,gBAAAC,MAAC,OAAY,UAAS,SAAQ,IAE9B,gBAAAA,MAAC,UAAoB,UAAS,SAAQ;AAAA;AAAA,wBAE1C,GACF;AAAA,wBACA,gBAAAA,MAACE,UAAA,EAAQ,OAAM,iBACb,0BAAAF;AAAA,0BAACK;AAAA,0BAAA;AAAA,4BACC,SAAS,YAAY,MAAM,mBAAmB,OAAO,EAAE;AAAA,4BACvD,IAAI;AAAA,8BACF,OAAON,OAAM,MAAM,QAAQ,KAAK,WAAW,GAAG;AAAA,8BAC9C,WAAW;AAAA,gCACT,SAASA,OAAM,MAAM,QAAQ,MAAM,MAAM,GAAG;AAAA,gCAC5C,OAAO,MAAM,QAAQ,MAAM;AAAA,8BAC7B;AAAA,4BACF;AAAA,4BACA,MAAK;AAAA,4BAEL,0BAAAC,MAAC,SAAW,UAAS,SAAQ;AAAA;AAAA,wBAC/B,GACF;AAAA,yBACF;AAAA;AAAA;AAAA,gBAEJ,GACF;AAAA,gBACC,cAAc,iBAAiB,SAAS,KACvC,gBAAAA,MAAC,WAAQ,IAAI,EAAE,SAASD,OAAM,OAAO,QAAQ,GAAG,GAAG,IAAI,IAAI,GAAG;AAAA,mBArN7C,OAAO,EAuN5B;AAAA,YAEJ,CAAC;AAAA;AAAA,QAEL;AAAA,QAGC,mBACC,gBAAAC;AAAA,UAACF;AAAA,UAAA;AAAA,YACC,IAAI;AAAA,cACF,GAAG,eAAe,MAAM;AAAA,cACxB,WAAW,aAAa,OAAO,MAAM;AAAA,cACrC,SAASC,OAAM,MAAM,QAAQ,MAAM,MAAM,IAAI;AAAA,cAC7C,cAAc,YAAY,SAAS,IAAI,aAAaA,OAAM,MAAM,QAAQ,MAAM,MAAM,GAAG,CAAC,KAAK;AAAA,YAC/F;AAAA,YAEC,sBAAY,WAAW,IACtB,gBAAAC,MAACC,aAAA,EAAW,SAAQ,SAAQ,IAAI;AAAA,cAC9B,WAAW;AAAA,cACX,OAAO,MAAM,QAAQ,KAAK;AAAA,cAC1B,WAAW;AAAA,YACb,GAAG,sDAEH,IAEA,gBAAAJ,MAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,KAAK,GAAG,YAAY,SAAS,GACvD;AAAA,8BAAAE;AAAA,gBAACI;AAAA,gBAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,SAAS,MAAM;AACb,mCAAe,iBAAiB,IAAI,OAAK,EAAE,EAAE,CAAC;AAAA,kBAChD;AAAA,kBACA,IAAI;AAAA,oBACF,eAAe;AAAA,oBACf,cAAc;AAAA,oBACd,UAAU;AAAA,oBACV,UAAU;AAAA,kBACZ;AAAA,kBACD;AAAA;AAAA,cAED;AAAA,cACA,gBAAAP;AAAA,gBAACO;AAAA,gBAAA;AAAA,kBACC,WAAS;AAAA,kBACT,SAAQ;AAAA,kBACR,OAAM;AAAA,kBACN,SAAS,MAAM,eAAe,IAAI;AAAA,kBAClC,IAAI,EAAE,cAAc,EAAE;AAAA,kBACvB;AAAA;AAAA,oBACmB,YAAY;AAAA,oBAAO;AAAA;AAAA;AAAA,cACvC;AAAA,eACF;AAAA;AAAA,QAEJ;AAAA,QAIF,gBAAAP;AAAA,UAACC;AAAA,UAAA;AAAA,YACC,IAAI;AAAA,cACF,YAAY;AAAA,cACZ,GAAG,eAAe,MAAM;AAAA,cACxB,WAAW,aAAa,OAAO,MAAM;AAAA,cACrC,SAAS,eAAe,MAAM,QAAQ,WAAW,QAAQF;AAAA,cACzD,IAAI;AAAA,YACN;AAAA,YAEA;AAAA,8BAAAI;AAAA,gBAACS;AAAA,gBAAA;AAAA,kBACC,WAAS;AAAA,kBACT,MAAK;AAAA,kBACL,OAAO;AAAA,kBACP,UAAU,CAAC,MAAM,aAAa,EAAE,OAAO,KAAK;AAAA,kBAC5C,aAAa,6BACT,aAAa,WAAW,iCACxB,aAAa,WAAW;AAAA,kBAE5B,WAAW,CAAC,MAAM;AAChB,wBAAI,EAAE,QAAQ,WAAW,CAAC,EAAE,YAAY,UAAU,KAAK,GAAG;AACxD,wBAAE,eAAe;AACjB,gCAAU;AAAA,oBACZ;AAAA,kBACF;AAAA,kBACA,IAAI;AAAA,oBACF,wBAAwB;AAAA,sBACtB,OAAO,MAAM,QAAQ,KAAK;AAAA,sBAC1B,SAASV,OAAM,OAAO,GAAG;AAAA;AAAA,sBACzB,cAAc;AAAA;AAAA,oBAChB;AAAA,oBACA,4BAA4B;AAAA,sBAC1B,cAAc;AAAA;AAAA,sBACd,SAAS;AAAA;AAAA,sBACT,cAAc;AAAA,wBACZ,cAAc;AAAA;AAAA,wBACd,aAAaA,OAAM,MAAM,QAAQ,SAAS,GAAG;AAAA,sBAC/C;AAAA,sBACA,oBAAoB;AAAA,wBAClB,cAAc;AAAA;AAAA,wBACd,aAAaA,OAAM,MAAM,QAAQ,QAAQ,MAAM,GAAG;AAAA,sBACpD;AAAA,sBACA,0BAA0B;AAAA,wBACxB,cAAc;AAAA;AAAA,wBACd,aAAa,MAAM,QAAQ,QAAQ;AAAA,sBACrC;AAAA,oBACF;AAAA,oBACA,IAAI;AAAA,kBACN;AAAA,kBACA,YAAY;AAAA,oBACV,cAAc,UAAU,KAAK,KAC3B,gBAAAC,MAACC,aAAA,EAAW,SAAQ,WAAU,IAAI;AAAA,sBAChC,OAAOF,OAAM,MAAM,QAAQ,KAAK,WAAW,GAAG;AAAA,sBAC9C,UAAU;AAAA,sBACV,YAAY;AAAA,oBACd,GAAG,yBAEH;AAAA,kBAEJ;AAAA;AAAA,cACF;AAAA,cACC,CAAC,gBACA,gBAAAC;AAAA,gBAACI;AAAA,gBAAA;AAAA,kBACC,WAAS;AAAA,kBACT,SAAQ;AAAA,kBACR,SAAS;AAAA,kBACT,UAAU,CAAC,UAAU,KAAK;AAAA,kBAC1B,IAAI;AAAA,oBACF,cAAc;AAAA,oBACd,IAAI;AAAA,oBACJ,eAAe;AAAA,oBACf,YAAY;AAAA,kBACd;AAAA,kBACD;AAAA;AAAA,cAED;AAAA;AAAA;AAAA,QAEJ;AAAA,QAGA,gBAAAP;AAAA,UAACa;AAAA,UAAA;AAAA,YACC,MAAM;AAAA,YACN,SAAS,MAAM,eAAe,KAAK;AAAA,YACnC,IAAI;AAAA,cACF,QAAQ;AAAA;AAAA,YACV;AAAA,YACA,YAAY;AAAA,cACV,IAAI,EAAE,cAAc,GAAG,UAAU,IAAI;AAAA,YACvC;AAAA,YAEA;AAAA,8BAAAb,MAACc,cAAA,EAAY,IAAI,EAAE,IAAI,EAAE,GAAG;AAAA;AAAA,gBAClB,YAAY;AAAA,gBAAO;AAAA,gBAAE,YAAY,WAAW,IAAI,WAAW;AAAA,gBAAW;AAAA,iBAChF;AAAA,cACA,gBAAAX,MAACY,gBAAA,EACC,0BAAAZ,MAACC,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,OAAO,MAAM,QAAQ,KAAK,UAAU,GAAG,qGAEzE,GACF;AAAA,cACA,gBAAAJ,MAACgB,gBAAA,EAAc,IAAI,EAAE,GAAG,GAAG,IAAI,EAAE,GAC/B;AAAA,gCAAAb;AAAA,kBAACI;AAAA,kBAAA;AAAA,oBACC,SAAS,MAAM,eAAe,KAAK;AAAA,oBACnC,IAAI,EAAE,eAAe,QAAQ,cAAc,EAAE;AAAA,oBAC9C;AAAA;AAAA,gBAED;AAAA,gBACA,gBAAAP;AAAA,kBAACO;AAAA,kBAAA;AAAA,oBACC,SAAS;AAAA,oBACT,OAAM;AAAA,oBACN,SAAQ;AAAA,oBACR,IAAI,EAAE,eAAe,QAAQ,cAAc,EAAE;AAAA,oBAC9C;AAAA;AAAA,sBACU,YAAY;AAAA,sBAAO;AAAA;AAAA;AAAA,gBAC9B;AAAA,iBACF;AAAA;AAAA;AAAA,QACF;AAAA,QAEA,gBAAAP;AAAA,UAACa;AAAA,UAAA;AAAA,YACC,MAAM;AAAA,YACN,SAAS,MAAM,gBAAgB,KAAK;AAAA,YACpC,IAAI;AAAA,cACF,QAAQ;AAAA;AAAA,YACV;AAAA,YACA,YAAY;AAAA,cACV,IAAI,EAAE,cAAc,GAAG,UAAU,IAAI;AAAA,YACvC;AAAA,YAEA;AAAA,8BAAAV,MAACW,cAAA,EAAY,IAAI,EAAE,IAAI,GAAG,YAAY,IAAI,GAAG,4BAE7C;AAAA,cACA,gBAAAd,MAACe,gBAAA,EAAc,IAAI,EAAE,IAAI,EAAE,GACzB;AAAA,gCAAAZ,MAACC,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,IAAI,GAAG,OAAO,MAAM,QAAQ,KAAK,UAAU,GAAG,6FAEhF;AAAA,gBACA,gBAAAD,MAACc,cAAA,EAAY,WAAU,YACrB,0BAAAjB;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,oBACP,UAAU,CAAC,MAAM,eAAe,EAAE,OAAO,KAAiC;AAAA,oBAE1E;AAAA,sCAAAG;AAAA,wBAAC;AAAA;AAAA,0BACC,OAAM;AAAA,0BACN,SAAS,gBAAAA,MAAC,SAAM;AAAA,0BAChB,OACE,gBAAAH,MAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GACvD;AAAA,4CAAAE,MAACC,aAAA,EAAW,2BAAa;AAAA,4BACzB,gBAAAD,MAACC,aAAA,EAAW,SAAQ,WAAU,IAAI;AAAA,8BAChC,SAASF,OAAM,MAAM,QAAQ,QAAQ,MAAM,GAAG;AAAA,8BAC9C,OAAO,MAAM,QAAQ,QAAQ;AAAA,8BAC7B,IAAI;AAAA,8BACJ,IAAI;AAAA,8BACJ,cAAc;AAAA,8BACd,YAAY;AAAA,4BACd,GACG,6BAAmB,GACtB;AAAA,6BACF;AAAA;AAAA,sBAEJ;AAAA,sBACA,gBAAAC;AAAA,wBAAC;AAAA;AAAA,0BACC,OAAM;AAAA,0BACN,SAAS,gBAAAA,MAAC,SAAM;AAAA,0BAChB,OACE,gBAAAH,MAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GACvD;AAAA,4CAAAE,MAACC,aAAA,EAAW,2BAAa;AAAA,4BACzB,gBAAAD,MAACC,aAAA,EAAW,SAAQ,WAAU,IAAI;AAAA,8BAChC,SAASF,OAAM,MAAM,QAAQ,UAAU,MAAM,GAAG;AAAA,8BAChD,OAAO,MAAM,QAAQ,UAAU;AAAA,8BAC/B,IAAI;AAAA,8BACJ,IAAI;AAAA,8BACJ,cAAc;AAAA,8BACd,YAAY;AAAA,4BACd,GACG,6BAAmB,GACtB;AAAA,6BACF;AAAA;AAAA,sBAEJ;AAAA,sBACA,gBAAAC;AAAA,wBAAC;AAAA;AAAA,0BACC,OAAM;AAAA,0BACN,SAAS,gBAAAA,MAAC,SAAM;AAAA,0BAChB,OACE,gBAAAH,MAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GACvD;AAAA,4CAAAE,MAACC,aAAA,EAAW,wBAAU;AAAA,4BACtB,gBAAAD,MAACC,aAAA,EAAW,SAAQ,WAAU,IAAI;AAAA,8BAChC,SAASF,OAAM,MAAM,QAAQ,MAAM,MAAM,GAAG;AAAA,8BAC5C,OAAO,MAAM,QAAQ,MAAM;AAAA,8BAC3B,IAAI;AAAA,8BACJ,IAAI;AAAA,8BACJ,cAAc;AAAA,8BACd,YAAY;AAAA,4BACd,GACG,kBAAQ,QACX;AAAA,6BACF;AAAA;AAAA,sBAEJ;AAAA;AAAA;AAAA,gBACF,GACF;AAAA,iBACF;AAAA,cACA,gBAAAF,MAACgB,gBAAA,EAAc,IAAI,EAAE,GAAG,GAAG,IAAI,EAAE,GAC/B;AAAA,gCAAAb;AAAA,kBAACI;AAAA,kBAAA;AAAA,oBACC,SAAS,MAAM,gBAAgB,KAAK;AAAA,oBACpC,IAAI,EAAE,eAAe,QAAQ,cAAc,EAAE;AAAA,oBAC9C;AAAA;AAAA,gBAED;AAAA,gBACA,gBAAAP;AAAA,kBAACO;AAAA,kBAAA;AAAA,oBACC,OAAM;AAAA,oBACN,SAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,IAAI,EAAE,eAAe,QAAQ,cAAc,EAAE;AAAA,oBAC9C;AAAA;AAAA,sBACQ,gBAAgB,SAAS,QAAQ;AAAA,sBAAY;AAAA;AAAA;AAAA,gBACtD;AAAA,iBACF;AAAA;AAAA;AAAA,QACF;AAAA,QAGA,gBAAAP;AAAA,UAACa;AAAA,UAAA;AAAA,YACC,MAAM;AAAA,YACN,SAAS,MAAM,kBAAkB,KAAK;AAAA,YACtC,UAAS;AAAA,YACT,WAAS;AAAA,YACT,YAAY;AAAA,cACV,IAAI,EAAE,cAAc,EAAE;AAAA,YACxB;AAAA,YAEF;AAAA,8BAAAb,MAACc,cAAA,EAAY,IAAI;AAAA,gBACf,YAAY;AAAA,gBACZ,IAAI;AAAA,gBACJ,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,KAAK;AAAA,cACP,GACE;AAAA,gCAAAX,MAAC,aAAc,OAAM,WAAU;AAAA,gBAAE;AAAA,iBAEnC;AAAA,cACA,gBAAAA,MAACY,gBAAA,EAAc,IAAI,EAAE,IAAI,EAAE,GACxB,WAAC,eAAe,cACf,gBAAAf,MAACC,MAAA,EACC;AAAA,gCAAAD,MAACI,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,IAAI,EAAE,IAAI,EAAE,GAAG;AAAA;AAAA,kBACnB,QAAQ;AAAA,kBAAO;AAAA,mBAC9D;AAAA,gBACA,gBAAAD,MAACC,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,IAAI,EAAE,IAAI,EAAE,GAAG,+KAIlE;AAAA,gBACA,gBAAAJ,MAACI,aAAA,EAAW,SAAQ,SAAQ,OAAM,WAAU,IAAI,EAAE,YAAY,IAAI,GAAG;AAAA;AAAA,kBAClD,QAAQ;AAAA,kBAAO;AAAA,mBAClC;AAAA,iBACF,IAEE,gBAAAJ,MAACC,MAAA,EAAI,IAAI,EAAE,WAAW,UAAU,IAAI,EAAE,GACpC;AAAA,gCAAAE;AAAA,kBAAC;AAAA;AAAA,oBACC,IAAI;AAAA,sBACF,UAAU;AAAA,sBACV,OAAO;AAAA,sBACP,IAAI;AAAA,sBACJ,WAAW,GAAG,KAAK;AAAA,oBACrB;AAAA;AAAA,gBACF;AAAA,gBACA,gBAAAA,MAACC,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,IAAI,EAAE,GACrC,yBAAe,UAClB;AAAA,gBACC,eAAe,UACd,gBAAAJ,MAAAM,WAAA,EACE;AAAA,kCAAAH;AAAA,oBAACC;AAAA,oBAAA;AAAA,sBACC,SAAQ;AAAA,sBACR,OAAO,eAAe,OAAO,UAAU,iBAAiB;AAAA,sBACxD,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,sBAElB,yBAAe,OAAO;AAAA;AAAA,kBACzB;AAAA,kBACC,eAAe,OAAO,WACrB,gBAAAJ,MAACC,MAAA,EAAI,IAAI;AAAA,oBACP,WAAW;AAAA,oBACX,iBAAiB;AAAA,oBACjB,QAAQ;AAAA,oBACR,aAAa;AAAA,oBACb,cAAc;AAAA,oBACd,GAAG;AAAA,oBACH,IAAI;AAAA,kBACN,GACE;AAAA,oCAAAE,MAACC,aAAA,EAAW,SAAQ,WAAU,OAAM,kBAAiB,IAAI,EAAE,SAAS,SAAS,IAAI,EAAE,GAAG,6BAEtF;AAAA,oBACA,gBAAAJ,MAACI,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,IAAI,IAAI,GAAG;AAAA;AAAA,sBACjC,eAAe,OAAO,QAAQ;AAAA,sBAAc;AAAA,uBACxD;AAAA,oBACA,gBAAAJ,MAACI,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,IAAI,IAAI,GAAG;AAAA;AAAA,sBAC/B,eAAe,OAAO,QAAQ;AAAA,uBAC5C;AAAA,oBACA,gBAAAJ,MAACI,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,IAAI,IAAI,GAAG;AAAA;AAAA,sBAChC,eAAe,OAAO,QAAQ;AAAA,uBAC3C;AAAA,oBACA,gBAAAJ,MAACI,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,IAAI,IAAI,GAAG;AAAA;AAAA,sBAC9B,eAAe,OAAO,QAAQ;AAAA,uBAC7C;AAAA,oBACC,eAAe,OAAO,QAAQ,YAAY,eAAe,OAAO,QAAQ,SAAS,SAAS,KACzF,gBAAAJ,MAACI,aAAA,EAAW,SAAQ,SAAQ,OAAM,gBAAe,IAAI,EAAE,IAAI,GAAG,SAAS,QAAQ,YAAY,UAAU,KAAK,IAAI,GAC5G;AAAA,sCAAAD,MAAC,iBAAY,UAAS,WAAU,eAAW,MAAC;AAAA,sBAAE;AAAA,sBAAE,eAAe,OAAO,QAAQ,SAAS,KAAK,IAAI;AAAA,uBAClG;AAAA,qBAEJ;AAAA,mBAEJ;AAAA,iBAEJ,GAEJ;AAAA,cACA,gBAAAH,MAACgB,gBAAA,EAAc,IAAI,EAAE,GAAG,GAAG,IAAI,EAAE,GAC/B;AAAA,gCAAAb;AAAA,kBAACI;AAAA,kBAAA;AAAA,oBACC,SAAS,MAAM;AACb,wCAAkB,KAAK;AACvB,wCAAkB,EAAE,aAAa,OAAO,UAAU,GAAG,CAAC;AAAA,oBACxD;AAAA,oBACA,UAAU,eAAe;AAAA,oBACzB,IAAI,EAAE,eAAe,QAAQ,cAAc,EAAE;AAAA,oBAE5C,yBAAe,cAAc,iBAAiB;AAAA;AAAA,gBACjD;AAAA,gBACC,CAAC,eAAe,eAAe,CAAC,eAAe,UAC9C,gBAAAP;AAAA,kBAACO;AAAA,kBAAA;AAAA,oBACC,OAAM;AAAA,oBACN,SAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,WAAW,gBAAAJ,MAAC,aAAc;AAAA,oBAC1B,IAAI,EAAE,eAAe,QAAQ,cAAc,EAAE;AAAA,oBAC9C;AAAA;AAAA,sBACS,QAAQ;AAAA,sBAAO;AAAA;AAAA;AAAA,gBACzB;AAAA,iBAEJ;AAAA;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAGJ,MAAI,cAAc;AAChB,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,QAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA,QAAQ,MAAM;AAAA,QAAC;AAAA,QACf,oBAAkB;AAAA,QAClB,YAAY,EAAE,aAAa,KAAK;AAAA,QAIhC,IAAI,EAAE,QAAQ,IAAK;AAAA,QACnB,YAAY;AAAA,UACV,IAAI;AAAA,YACF,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,SAAS,MAAM,QAAQ,WAAW;AAAA,YAClC,SAAS;AAAA,YACT,gBAAgB;AAAA,UAClB;AAAA,QACF;AAAA,QAEC;AAAA;AAAA,IACH;AAAA,EAEJ;AAEA,SACE,gBAAAA;AAAA,IAACe;AAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,IAAI;AAAA,QACF,QAAQ;AAAA;AAAA,QACR,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,GAAG;AAAA,MACL;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;AAEA,IAAO,uBAAQ;","names":["soft","File","ComposerControl","AlertCircle","AlertTriangle","Archive","Braces","Eye","FilePdf","FileText","FileUp","Info","LayoutGrid","MemoryLayers","MessageSquare","Mic","NotebookPen","Play","Refresh","RotateCcw","Square","Upload","Wifi","Observable","create","create","TTSState","Observable","React","useCallback","useEffect","useMemo","useRef","useState","useState","useEffect","Box","IconButton","alpha","jsx","FilePdf","FileText","Braces","useState","useEffect","jsx","Box","alpha","IconButton","useCallback","useEffect","useMemo","useRef","useState","IconButton","Typography","Box","Tooltip","useTheme","React","Box","jsx","jsxs","jsxs","Box","jsx","React","jsx","jsxs","getFileTypeInfo","FilePdf","FileText","Braces","useState","useRef","useTheme","useEffect","useMemo","useCallback","doc","error","jsxs","jsx","Box","Tooltip","Typography","IconButton","useTheme","alpha","Box","IconButton","Tooltip","Typography","Paper","useState","useEffect","Box","CircularProgress","IconButton","Tooltip","Fragment","jsx","jsxs","useState","useEffect","jsxs","Box","jsx","Tooltip","IconButton","Fragment","CircularProgress","Fragment","jsx","jsxs","markdown","useState","useMemo","jsx","jsxs","Box","alpha","Tooltip","IconButton","useEffect","React","useCallback","useRef","useTheme","Typography","Fragment","Paper","useState","useCallback","useRef","Dialog","Button","Box","Typography","IconButton","Alert","Paper","Avatar","CircularProgress","useMediaQuery","useTheme","alpha","Fragment","jsx","jsxs","useTheme","useMediaQuery","useRef","useState","useCallback","jsxs","Fragment","jsx","Dialog","Box","alpha","Typography","IconButton","Alert","theme","Button","Avatar","Paper","CircularProgress","createTheme","dark","createTheme","React","jsx","Avatar","Box","Button","Paper","Stack","Typography","useTheme","React","jsx","jsxs","useTheme","Stack","Typography","Box","Paper","Avatar","Button","useEffect","useEffect","React","useState","useEffect","useTheme","alpha","Box","Typography","Modal","IconButton","TextField","Button","List","Tooltip","Dialog","DialogTitle","DialogContent","DialogActions","Avatar","FormControl","useMediaQuery","Fragment","jsx","jsxs","useEffect","useState","useTheme","useMediaQuery","shell","jsxs","Box","alpha","jsx","Typography","Tooltip","Fragment","Button","IconButton","React","List","Avatar","TextField","Dialog","DialogTitle","DialogContent","DialogActions","FormControl","Modal"]}