@cboxdk/cbox-ui 0.9.0 → 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/context/cbox-id.tsx","../src/layout/app-content.tsx","../src/layout/app-shell.tsx","../src/context/localization.tsx","../src/components/app-icon.tsx","../src/layout/cbox-brand.tsx","../src/layout/cbox-app-sidebar.tsx","../src/layout/cbox-mobile-nav-drawer.tsx","../src/components/app-switcher.tsx","../src/primitives/empty-state.tsx","../src/primitives/status-pill.tsx","../src/surfaces/surface-modal.tsx","../src/surfaces/inbox-surface.tsx","../src/surfaces/surface-state.tsx","../src/components/notifications-bell.tsx","../src/components/search-trigger.tsx","../src/components/user-menu.tsx","../src/layout/cbox-app-shell.tsx","../src/primitives/context-bar.tsx","../src/layout/cbox-org-context-bar.tsx","../src/components/org-switcher.tsx","../src/layout/top-bar.tsx","../src/components/app-launcher.tsx","../src/components/app-catalog.tsx","../src/primitives/combobox.tsx","../src/primitives/data-panel.tsx","../src/primitives/heading.tsx","../src/primitives/key-value.tsx","../src/primitives/page-header.tsx","../src/primitives/page-shell.tsx","../src/primitives/page-tabs.tsx","../src/primitives/row-link.tsx","../src/primitives/stat-tile.tsx","../src/utils/url-state.ts","../src/layout/cbox-workspace-shell.tsx","../src/charts/sparkline.tsx"],"names":["jsx","createContext","useContext","jsxs","useState","useEffect","useMemo","Fragment","useRef","X","useCallback","SearchIcon","initials","Chevron","deriveInitials","AppRow","buildOrgUrl","Lock","useId","id","Check","Plus","DefaultLink","toneStyles","Menu","PanelLeftOpen","PanelLeftClose"],"mappings":"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","file":"index.js","sourcesContent":["import {\n createContext,\n useContext,\n type ReactNode,\n} from 'react';\n\n/**\n * Identity contract every Cbox-family app must populate.\n *\n * Shape mirrors what the future `@cboxdk/cbox-id-client` SDK returns\n * from id's `/api/v1/me` endpoint plus a small set of platform-level\n * URLs that each app needs to construct deep-links into id.\n *\n * In the id app itself, populate this from Inertia shared props\n * (id IS the source of truth — no API call needed).\n *\n * In cortex / atlas / track / future apps, populate from the\n * id-client SDK — typically once per session, then refreshed when\n * the user switches org or updates their profile.\n *\n * Components in this package read from the context but never write —\n * mutations always round-trip through id's API via the id-client.\n */\n\nexport type CboxAppKey = string;\n\nexport type CboxUser = {\n /** Cbox ID's user id: numeric in id itself, a prefixed string (`usr_…`) in the apps that mirror it. */\n id: number | string;\n name: string;\n email: string;\n avatar_url?: string | null;\n /** ISO 639-1 (e.g. \"en\", \"da\"). Used by formatters that want a locale. */\n locale?: string | null;\n /** IANA tz identifier (e.g. \"Europe/Copenhagen\"). */\n timezone?: string | null;\n};\n\nexport type CboxOrganization = {\n /** Cbox ID's organization id: numeric in id itself, a prefixed string (`org_…`) in the apps that mirror it. */\n id: number | string;\n slug: string;\n name: string;\n /**\n * Role of the current user within this org as resolved by id.\n * Apps should honour this for permission gating in the chrome\n * (eg \"Manage team\" link is hidden for members).\n */\n role?: 'owner' | 'admin' | 'member' | string;\n};\n\nexport type CboxAppLink = {\n /** Stable key — e.g. \"id\", \"cortex\", \"atlas\", \"track\". */\n key: CboxAppKey;\n /** Display name as shown in the launcher. */\n name: string;\n /** Absolute URL the launcher tile links to. */\n url: string;\n /**\n * Short tagline shown under the name. Keep to ~5–8 words —\n * the launcher truncates after one line.\n */\n description?: string;\n /**\n * One-letter monogram fallback when no icon is provided.\n * Defaults to the first letter of `name`.\n */\n monogram?: string;\n /** Cbox ID's catalog `icon_url`: the app's icon for light surfaces (`https:` only). */\n iconUrl?: string | null;\n /** Cbox ID's catalog `icon_dark_url`: the app's icon for dark surfaces. */\n iconDarkUrl?: string | null;\n /**\n * Accent colour for the monogram tile (and current-app highlight).\n * Hex string or any CSS colour the browser accepts. Falls back to\n * the neutral chip when missing.\n */\n accentColor?: string;\n /** Tag the user's currently-active app so the launcher highlights it. */\n current?: boolean;\n /**\n * Whether the current org has access to this app. Defaults to\n * `true` so existing payloads render unchanged. `false` renders\n * the tile as locked: greyed out, no nav, and (if the host app\n * passes `onLockedAppClick`) opens an upgrade affordance.\n */\n entitled?: boolean;\n /**\n * Mark the app as not-yet-released. Renders as a disabled tile\n * with a \"soon\" badge — distinct from `entitled: false` which\n * implies \"available, but not in your plan\".\n */\n comingSoon?: boolean;\n};\n\nexport type CboxNotificationPreviewItem = {\n id: string;\n title: string;\n body?: string | null;\n severity: 'info' | 'warning' | 'critical';\n /** ISO-8601 timestamp from the notifications service. */\n createdAt: string;\n /** Null when the user hasn't opened the notification yet. */\n readAt?: string | null;\n /** Optional deep-link — typically into the app that originated\n * the notification (id/billing/invoice/123, webhooks/deliveries/x).\n * Null when the notification is informational with no follow-up. */\n ctaUrl?: string | null;\n ctaLabel?: string | null;\n};\n\nexport type CboxNotificationsState = {\n unreadCount: number;\n /**\n * \"See all\" target — typically the central notifications service\n * inbox (notifications.cbox.systems/inbox). The bell's POPOVER\n * shows the preview items inline; only this URL navigates the\n * user out of the current app.\n */\n inboxUrl: string;\n /**\n * Last 5 items (mixed read/unread) for the bell-popover preview.\n * Empty when the host hasn't fetched a preview yet — the bell\n * still renders the badge from `unreadCount`. Falsy on\n * pre-auth pages where the chrome shouldn't render the bell at all.\n */\n previewItems?: CboxNotificationPreviewItem[];\n /**\n * Endpoint pattern for marking a single notification read. The\n * popover POSTs to `markReadUrl.replace('{id}', notification.id)`\n * — a host-local route that forwards to the service via M2M.\n */\n markReadUrl?: string;\n};\n\nexport type CboxIdContextValue = {\n user: CboxUser;\n /**\n * Org the current app context is scoped to. Null on user-only\n * surfaces (eg the id account-settings landing page).\n */\n currentOrganization: CboxOrganization | null;\n /**\n * All orgs the user belongs to — feeds the org switcher.\n * Should be small (≤ a few dozen). For users in many orgs,\n * the switcher swaps in a search field.\n */\n organizations: CboxOrganization[];\n /**\n * Sister apps in the Cbox family the user can launch into.\n * Static-ish — doesn't need to refresh per request.\n */\n apps: CboxAppLink[];\n /**\n * Deep-links into id used by chrome controls. Each app\n * constructs these via the id-client SDK; the package\n * doesn't hardcode URLs because id may live on different\n * hosts in dev / staging / prod.\n */\n urls: {\n /** Base of the id app — for the \"manage account\" link. */\n idBaseUrl: string;\n /** Absolute URL of the user's id profile page. */\n accountUrl: string;\n /** Absolute URL of the current org's settings page in id. */\n orgSettingsUrl: string | null;\n /** POST endpoint that signs the user out. */\n signOutUrl: string;\n /**\n * POST endpoint in id that switches the user's active org.\n * Used by OrgSwitcher as a fallback when `onSwitchOrganization`\n * is not provided — covers apps that can't do a pure URL swap.\n */\n switchOrgUrl?: string;\n };\n /**\n * Notification feed state, or null/undefined when the user has no\n * inbox configured. id's wire shape sets `null` explicitly; the\n * type accepts both shapes so apps can pass the payload straight\n * through without a null→undefined adapter.\n */\n notifications?: CboxNotificationsState | null;\n /**\n * True when the host app's cached payload is known to be out of\n * date — id has emitted a domain event (membership/role/sub\n * change) since the cache was populated. Apps should refetch\n * via the SDK before rendering anything that depends on the\n * cached membership / entitlement state. Soft-TTL covers the\n * case where the event was missed.\n *\n * Default: false (treated as fresh).\n */\n stale?: boolean;\n /**\n * Called when the user picks a different org from the switcher.\n * Apps own this — typically a same-app URL navigation that\n * swaps the slug in the current path (`/org/{slug}/...`). The\n * server validates membership at the destination via\n * EnsureOrganizationMembership, so this is a pure URL change with\n * no mutable state to update.\n */\n onSwitchOrganization?: (org: CboxOrganization) => void;\n};\n\nconst CboxIdContext = createContext<CboxIdContextValue | null>(null);\n\nexport function CboxIdProvider({\n value,\n children,\n}: {\n value: CboxIdContextValue;\n children: ReactNode;\n}) {\n return <CboxIdContext.Provider value={value}>{children}</CboxIdContext.Provider>;\n}\n\nexport function useCboxId(): CboxIdContextValue {\n const ctx = useContext(CboxIdContext);\n if (ctx === null) {\n throw new Error(\n '@cboxdk/cbox-ui: useCboxId() must be called inside <CboxIdProvider>. ' +\n 'Wrap your app root and populate it from the id-client SDK (or, ' +\n 'in id itself, from Inertia shared props).',\n );\n }\n return ctx;\n}\n\n/**\n * Soft variant — returns null instead of throwing. Useful for\n * components that gracefully degrade on auth-pre pages.\n */\nexport function useCboxIdOptional(): CboxIdContextValue | null {\n return useContext(CboxIdContext);\n}\n","import type { ComponentProps, ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\ntype Props = ComponentProps<'main'> & {\n children: ReactNode;\n};\n\n/**\n * Scrolling main column inside an <AppShell>. Wears the soft blue-\n * tinted gradient canvas so every Cbox app sits on the same\n * background.\n */\nexport function AppContent({ children, className, ...props }: Props) {\n return (\n <main\n {...props}\n className={cn(\n 'canvas-gradient relative flex h-svh flex-1 flex-col overflow-y-auto',\n className,\n )}\n >\n {children}\n </main>\n );\n}\n","import type { ReactNode } from 'react';\n\n/**\n * Top-level chrome. Hosts the desktop sidebar (left) and the\n * scrollable content column (right) side-by-side. Fits the full\n * viewport height; only the content column scrolls.\n *\n * Pair with <AppContent> inside. Per-app sidebars compose alongside\n * — cbox-ui doesn't ship one because the nav items are app-specific.\n */\nexport function AppShell({ children }: { children: ReactNode }) {\n return (\n <div className=\"flex h-svh w-full bg-canvas text-foreground\">\n {children}\n </div>\n );\n}\n","import { createContext, useContext, useMemo, type ReactNode } from 'react';\n\nexport type CboxTranslationValues = Record<string, string | number>;\nexport type CboxTranslator = (message: string, values?: CboxTranslationValues) => string;\n\n/** Hosts own catalogs; the shared components never guess a person's language. */\nconst Localization = createContext<{ locale: string; t: CboxTranslator; formatDate: (value: string) => string }>({\n locale: 'en',\n t: interpolate,\n formatDate: (value) => new Date(value).toLocaleString(),\n});\n\nexport function interpolate(message: string, values: CboxTranslationValues = {}): string {\n return message.replace(/\\{([a-zA-Z][a-zA-Z0-9_]*)\\}/g, (match, key: string) =>\n Object.prototype.hasOwnProperty.call(values, key) ? String(values[key]) : match,\n );\n}\n\n/** Optional and additive: without a provider existing consumers retain English. */\nexport function CboxLocalizationProvider({ locale, translate, formatDate = defaultDate, children }: {\n locale: string;\n translate: CboxTranslator;\n formatDate?: (value: string) => string;\n children: ReactNode;\n}) {\n const value = useMemo(() => ({ locale, t: translate, formatDate }), [locale, translate, formatDate]);\n return <Localization.Provider value={value}>{children}</Localization.Provider>;\n}\n\nexport function useCboxLocalization() {\n return useContext(Localization);\n}\n\nfunction defaultDate(value: string): string {\n return new Date(value).toLocaleString();\n}\n","import { useState, useSyncExternalStore, type ReactNode } from 'react';\nimport { cn } from '../utils/cn';\nimport { initials, readKnownAppCatalog, secureIconUrl, subscribeKnownAppCatalog, type CboxKnownApp } from '../app-switcher/catalog';\n\n/**\n * Every Cbox app's icon comes from Cbox ID's catalog: one light and one dark upload per app\n * (`icon_url`, `icon_dark_url`). There is no local copy of the marks in this package or in an\n * app. The last catalog the browser saw is kept here so an app's own mark and the switcher\n * paint at once on the next page; the live answer replaces it when it arrives.\n */\nexport type { CboxKnownApp } from '../app-switcher/catalog';\nexport { readKnownAppCatalog, rememberAppCatalog, secureIconUrl } from '../app-switcher/catalog';\n\nconst EMPTY: CboxKnownApp[] = [];\n\n/** The last catalog this browser kept; empty on the server and before the first answer. */\nexport function useKnownAppCatalog(): CboxKnownApp[] {\n return useSyncExternalStore(subscribeKnownAppCatalog, readKnownAppCatalog, () => EMPTY);\n}\n\nexport type CboxAppIconProps = {\n /** The app's name; its first two letters stand in when it has no icon. */\n name: string;\n /** Catalog `icon_url`: the icon for light surfaces (or the only one). */\n iconUrl?: string | null;\n /** Catalog `icon_dark_url`: the icon for dark surfaces. */\n iconDarkUrl?: string | null;\n /** Size and shape of the icon box, e.g. `h-6 w-6`. */\n className?: string;\n /** Rendered instead of initials when the app has no usable icon. */\n fallback?: ReactNode;\n};\n\n/**\n * One app's icon from the catalog. With both uploads it renders two images and the token\n * stylesheet shows the one for the current theme (`.dark` or `[data-theme=\"dark\"]` on the\n * root, the same switch the tokens use). Without an icon, or when it fails to load, it shows\n * the app's initials.\n */\nexport function CboxAppIcon({ name, iconUrl, iconDarkUrl, className = 'h-6 w-6', fallback }: CboxAppIconProps) {\n const light = secureIconUrl(iconUrl);\n const dark = secureIconUrl(iconDarkUrl);\n const [failed, setFailed] = useState<string | null>(null);\n const key = `${light ?? ''}|${dark ?? ''}`;\n if (light === null || failed === key) {\n if (fallback !== undefined) return <>{fallback}</>;\n return <span aria-hidden className={cn('grid shrink-0 place-items-center rounded bg-secondary text-[11px] font-semibold text-foreground', className)}>{initials(name)}</span>;\n }\n const lost = () => setFailed(key);\n\n return (\n <span aria-hidden className={cn('cbx-app-icon-box inline-flex shrink-0 items-center justify-center', className)}>\n <img src={light} alt=\"\" decoding=\"async\" onError={lost} className={cn('cbx-app-icon', dark === null ? 'cbx-app-icon-single' : 'cbx-app-icon-light', 'h-full w-full')} />\n {dark !== null && <img src={dark} alt=\"\" decoding=\"async\" onError={lost} className=\"cbx-app-icon cbx-app-icon-dark h-full w-full\" />}\n </span>\n );\n}\n\nexport type CboxServiceMarkProps = {\n /** The app key in Cbox ID's catalog (`signals`, `infra`, …). */\n appKey: string;\n /** Size of the mark. Default `h-6 w-6`. */\n className?: string;\n /** Shown while the catalog has not told this browser the app's icon yet. Default nothing. */\n fallback?: ReactNode;\n};\n\n/** An app's own mark (its rail or brand icon), read from the catalog this browser last kept. */\nexport function CboxServiceMark({ appKey, className = 'h-6 w-6', fallback = null }: CboxServiceMarkProps) {\n const app = useKnownAppCatalog().find(entry => entry.key === appKey);\n if (app === undefined || app.icon_url === null) return <>{fallback}</>;\n\n return <CboxAppIcon name={app.name} iconUrl={app.icon_url} iconDarkUrl={app.icon_dark_url} className={className} fallback={fallback ?? undefined} />;\n}\n","import type { ComponentProps } from 'react';\nimport { cn } from '../utils/cn';\nimport { CboxServiceMark } from '../components/app-icon';\n\nexport type CboxBrandProps = {\n /**\n * App key — drives the small mono submark beside the wordmark.\n * Convention: lowercase single word matching the `cbox_apps.key`\n * row in id (`notifications`, `webhooks`, `id`, `cortex`, …).\n */\n appKey: string;\n /**\n * Override the submark text. Defaults to `appKey`. Hide it\n * entirely with `submark={null}`.\n */\n submark?: string | null;\n /** Asset base path. Default `/brand` — apps drop the standard\n * png set (`cbox-icon.png`, `cbox-logo.png`, plus `@2x` retina)\n * into `public/brand/` and they Just Work. */\n assetBase?: string;\n /** Tone of the wordmark. `dark` on light surfaces (default),\n * `light` on dark / coloured surfaces. */\n tone?: 'dark' | 'light';\n /** Collapsed mode renders only the square icon — used in the\n * collapsed-sidebar state. The icon is the app's own icon from\n * Cbox ID's catalog (light and dark) once this browser has seen\n * the catalog, and the Cbox icon until then. */\n collapsed?: boolean;\n className?: string;\n};\n\n/**\n * Canonical Cbox brand mark. Every app wears this — the only\n * variable bit is the `appKey` submark beside the wordmark\n * (\"notifications\", \"webhooks\", …).\n *\n * No app should ship its own brand component. If a product needs\n * a materially different mark, that's a cbox-ui PR (extend this\n * component), not a per-app fork.\n */\nexport function CboxBrand({\n appKey,\n submark,\n assetBase = '/brand',\n tone = 'dark',\n collapsed = false,\n className,\n}: CboxBrandProps) {\n if (collapsed) {\n const cboxIcon = (\n <img\n src={`${assetBase}/cbox-icon.png`}\n srcSet={`${assetBase}/cbox-icon.png 1x, ${assetBase}/cbox-icon@2x.png 2x`}\n alt=\"Cbox\"\n width={36}\n height={36}\n className={cn('h-9 w-9 rounded-md', className)}\n />\n );\n\n return <CboxServiceMark appKey={appKey} className={cn('h-9 w-9', className)} fallback={cboxIcon} />;\n }\n\n const wordmark =\n tone === 'light'\n ? `${assetBase}/cbox-logo-white.png`\n : `${assetBase}/cbox-logo.png`;\n const wordmarkRetina =\n tone === 'light'\n ? `${assetBase}/cbox-logo-white@2x.png`\n : `${assetBase}/cbox-logo@2x.png`;\n\n const submarkText = submark === undefined ? appKey : submark;\n\n return (\n <div\n className={cn('inline-flex items-center gap-2', className)}\n aria-label={`Cbox · ${appKey}`}\n >\n <img\n src={wordmark}\n srcSet={`${wordmark} 1x, ${wordmarkRetina} 2x`}\n alt=\"Cbox\"\n height={22}\n className=\"h-[22px] w-auto select-none\"\n draggable={false}\n />\n {submarkText !== null && submarkText !== '' ? (\n <span\n className={cn(\n 'text-[13px] font-semibold whitespace-nowrap',\n tone === 'light'\n ? 'text-white/60'\n : 'text-muted-foreground/80',\n )}\n >\n · {submarkText}\n </span>\n ) : null}\n </div>\n );\n}\n\n/**\n * Re-export shape kept in case a host app needs to pass\n * additional <img> attrs (`loading`, `fetchPriority`, …).\n */\nexport type CboxBrandImageProps = ComponentProps<'img'>;\n","import { useCboxLocalization } from '../context/localization';\nimport type { ComponentType, ReactNode } from 'react';\nimport { CboxBrand } from './cbox-brand';\nimport { cn } from '../utils/cn';\n\nexport type CboxNavItem = {\n label: string;\n /**\n * Absolute path the host's router can navigate to. Apps that\n * scope nav by org slug should compose the path themselves\n * (`/org/${slug}/endpoints`) before passing it in — cbox-ui\n * stays unaware of routing conventions.\n */\n href: string;\n icon: ComponentType<{ className?: string; strokeWidth?: number }>;\n /** Highlight the row for child routes too (`/endpoints/123`\n * matches the `Endpoints` row when this is true). */\n matchPrefix?: boolean;\n};\n\nexport type CboxNavSection = {\n label: string;\n items: CboxNavItem[];\n};\n\n/**\n * Generic Link contract — apps inject their own (Inertia's `Link`,\n * Wouter, React Router, plain `<a>`). cbox-ui doesn't depend on\n * any router so the same chrome works everywhere.\n */\nexport type LinkComponent = ComponentType<{\n href: string;\n prefetch?: boolean;\n children: ReactNode;\n className?: string;\n title?: string;\n 'aria-label'?: string;\n /** Set on the link of the page the person is on. */\n 'aria-current'?: 'page';\n}>;\n\nexport type CboxAppSidebarProps = {\n /** App key for the brand submark (and aria labels). */\n appKey: string;\n /** Optional override for the submark — defaults to `appKey`. */\n brandSubmark?: string | null;\n /** Where brand assets live. Default `/brand`. */\n assetBase?: string;\n /** Where the brand row links to (typically the app's home). */\n brandHref?: string;\n\n /** Nav sections — top to bottom. */\n sections: CboxNavSection[];\n /** Active path — used to highlight the current row. */\n currentPath: string;\n\n /** Apps inject their router's Link primitive. */\n LinkComponent: LinkComponent;\n\n /** Persisted \"is the desktop sidebar collapsed?\" state. */\n collapsed?: boolean;\n\n className?: string;\n};\n\n/**\n * Standard Cbox sidebar. Every app wears this — the only variable\n * bits are `sections` (per-app nav) and `appKey` (drives the brand\n * submark).\n *\n * Hidden below `lg` — apps render a separate mobile drawer that\n * shares the same `sections` config.\n *\n * No app should ship its own sidebar component. The chrome is the\n * shape; nav items are the data.\n */\nexport function CboxAppSidebar({\n appKey,\n brandSubmark,\n assetBase,\n brandHref = '/',\n sections,\n currentPath,\n LinkComponent,\n collapsed = false,\n className,\n}: CboxAppSidebarProps) {\n const { t } = useCboxLocalization();\n return (\n <aside\n data-slot=\"cbox-app-sidebar\"\n data-collapsed={collapsed ? 'true' : 'false'}\n className={cn(\n 'hidden h-svh shrink-0 flex-col border-r border-sidebar-border bg-sidebar transition-[width] duration-150 ease-out lg:flex',\n collapsed ? 'w-[60px]' : 'w-[240px]',\n className,\n )}\n >\n <LinkComponent\n href={brandHref}\n aria-label={t(\"Home\")}\n className={cn(\n 'flex h-14 shrink-0 items-center border-b border-sidebar-border/70',\n collapsed ? 'justify-center px-0' : 'px-4',\n )}\n >\n <CboxBrand\n appKey={appKey}\n submark={brandSubmark}\n assetBase={assetBase}\n collapsed={collapsed}\n />\n </LinkComponent>\n\n <nav\n className={cn(\n 'flex-1 overflow-y-auto pt-5 pb-3',\n collapsed ? 'space-y-3 px-2' : 'space-y-5 px-3',\n )}\n >\n {sections.map((section) => (\n <div key={section.label} className=\"space-y-1\">\n {collapsed ? null : (\n <p className=\"text-eyebrow px-3 pb-1\">\n {section.label}\n </p>\n )}\n <ul className=\"space-y-0.5\">\n {section.items.map((item) => {\n const active = item.matchPrefix === true\n ? currentPath === item.href ||\n currentPath.startsWith(item.href + '/')\n : currentPath === item.href;\n const Icon = item.icon;\n\n return (\n <li key={item.label}>\n <LinkComponent\n href={item.href}\n prefetch\n aria-label={\n collapsed\n ? item.label\n : undefined\n }\n title={\n collapsed\n ? item.label\n : undefined\n }\n className={cn(\n collapsed\n ? 'group mx-auto flex h-9 w-9 items-center justify-center rounded-md transition-colors'\n : 'group flex items-center gap-2.5 rounded-md px-3 py-1.5 text-[13px] transition-colors',\n active\n ? 'bg-sidebar-accent font-semibold text-sidebar-accent-foreground'\n : 'text-sidebar-foreground/80 hover:bg-sidebar-accent hover:text-foreground',\n )}\n >\n <Icon\n className={cn(\n 'h-4 w-4 shrink-0',\n active\n ? 'text-foreground'\n : 'text-sidebar-muted',\n )}\n strokeWidth={1.7}\n />\n {collapsed ? null : (\n <span className=\"flex-1 truncate\">\n {item.label}\n </span>\n )}\n </LinkComponent>\n </li>\n );\n })}\n </ul>\n </div>\n ))}\n </nav>\n </aside>\n );\n}\n","import { useCboxLocalization } from '../context/localization';\nimport { X } from 'lucide-react';\nimport { useEffect } from 'react';\nimport { CboxBrand } from './cbox-brand';\nimport type {\n CboxNavSection,\n LinkComponent,\n} from './cbox-app-sidebar';\nimport { cn } from '../utils/cn';\n\nexport type CboxMobileNavDrawerProps = {\n open: boolean;\n onClose: () => void;\n appKey: string;\n brandSubmark?: string | null;\n assetBase?: string;\n brandHref?: string;\n sections: CboxNavSection[];\n currentPath: string;\n LinkComponent: LinkComponent;\n};\n\n/**\n * Mobile-only slide-in sidebar. Hidden on `lg` and up — there the\n * desktop `CboxAppSidebar` is always visible. Shares the same\n * `sections` shape as the desktop sidebar so apps don't have to\n * maintain two nav configs.\n *\n * State (open/close) lives in `CboxAppShell` so it can wire the\n * hamburger button + auto-close on `currentPath` change. The drawer\n * itself just renders; it doesn't track anything.\n *\n * Closes on: Escape, scrim click, navigation (parent unsets `open`\n * when `currentPath` changes). Locks body scroll while open so the\n * page underneath doesn't scroll on touch.\n */\nexport function CboxMobileNavDrawer({\n open,\n onClose,\n appKey,\n brandSubmark,\n assetBase,\n brandHref = '/',\n sections,\n currentPath,\n LinkComponent,\n}: CboxMobileNavDrawerProps) {\n const { t } = useCboxLocalization();\n useEffect(() => {\n if (!open) {\n return;\n }\n\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\n }\n };\n document.addEventListener('keydown', onKey);\n\n const prevOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n\n return () => {\n document.removeEventListener('keydown', onKey);\n document.body.style.overflow = prevOverflow;\n };\n }, [open, onClose]);\n\n return (\n <div\n className={cn(\n 'fixed inset-0 z-40 lg:hidden',\n open ? '' : 'pointer-events-none',\n )}\n aria-hidden={open ? 'false' : 'true'}\n >\n <div\n onClick={onClose}\n className={cn(\n 'absolute inset-0 bg-black/40 transition-opacity duration-200',\n open ? 'opacity-100' : 'opacity-0',\n )}\n />\n <aside\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={t(\"Navigation\")}\n className={cn(\n 'absolute inset-y-0 left-0 flex w-[280px] max-w-[80vw] flex-col border-r border-sidebar-border bg-sidebar shadow-xl transition-transform duration-200 ease-out',\n open ? 'translate-x-0' : '-translate-x-full',\n )}\n >\n <div className=\"flex h-14 shrink-0 items-center justify-between gap-2 border-b border-sidebar-border/70 px-4\">\n <LinkComponent\n href={brandHref}\n aria-label={t(\"Home\")}\n className=\"flex items-center\"\n >\n <CboxBrand\n appKey={appKey}\n submark={brandSubmark}\n assetBase={assetBase}\n collapsed={false}\n />\n </LinkComponent>\n <button\n type=\"button\"\n onClick={onClose}\n aria-label={t(\"Close navigation\")}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-secondary hover:text-foreground\"\n >\n <X className=\"h-4 w-4\" strokeWidth={1.8} />\n </button>\n </div>\n <nav className=\"flex-1 space-y-5 overflow-y-auto px-3 pt-5 pb-3\">\n {sections.map((section) => (\n <div key={section.label} className=\"space-y-1\">\n <p className=\"text-eyebrow px-3 pb-1\">\n {section.label}\n </p>\n <ul className=\"space-y-0.5\">\n {section.items.map((item) => {\n const active =\n item.matchPrefix === true\n ? currentPath === item.href ||\n currentPath.startsWith(\n item.href + '/',\n )\n : currentPath === item.href;\n const Icon = item.icon;\n\n return (\n <li key={item.label}>\n <LinkComponent\n href={item.href}\n prefetch\n className={cn(\n 'group flex items-center gap-2.5 rounded-md px-3 py-2 text-[14px] transition-colors',\n active\n ? 'bg-sidebar-accent font-semibold text-sidebar-accent-foreground'\n : 'text-sidebar-foreground/80 hover:bg-sidebar-accent hover:text-foreground',\n )}\n >\n <Icon\n className={cn(\n 'h-4 w-4 shrink-0',\n active\n ? 'text-foreground'\n : 'text-sidebar-muted',\n )}\n strokeWidth={1.7}\n />\n <span className=\"flex-1 truncate\">\n {item.label}\n </span>\n </LinkComponent>\n </li>\n );\n })}\n </ul>\n </div>\n ))}\n </nav>\n </aside>\n </div>\n );\n}\n","import { useCboxLocalization } from '../context/localization';\nimport {\n useEffect,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { useCboxIdOptional, type CboxAppLink } from '../context/cbox-id';\nimport { cn } from '../utils/cn';\nimport { CboxAppIcon, secureIconUrl } from './app-icon';\n\ntype AppSwitcherProps = {\n className?: string;\n /**\n * Called when the user clicks an app they're not entitled to. Use\n * this to open an upgrade flow / Stripe checkout / Intercom message.\n * If unset, locked rows fall through to a static \"Add to plan\"\n * affordance — the click is a no-op so we never silently ship the\n * user to a broken paywall.\n */\n onLockedAppClick?: (app: CboxAppLink) => void;\n};\n\n/**\n * Left-cluster app picker — the dropdown button that sits beside OrgSwitcher.\n *\n * Shows the current app's monogram + name as the trigger so both context\n * dimensions (which app, which org) are immediately visible in the left\n * cluster without needing to open anything.\n *\n * The dropdown preserves the full AppLauncher row richness: monogram tile\n * with per-app accent, name, description, and entitlement badges. Entitled\n * apps are grouped first; locked / coming-soon land in an \"Available\" section.\n *\n * Includes typeahead — auto-focus on open, filters name/description/key as\n * the user types, arrow-key navigation, Enter to activate, Escape to close.\n *\n * Soft-reads via useCboxIdOptional — renders null when no provider is\n * mounted above (admin shells, pre-auth pages).\n */\nexport function AppSwitcher({ className, onLockedAppClick }: AppSwitcherProps) {\n const { t } = useCboxLocalization();\n const cboxId = useCboxIdOptional();\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [activeIndex, setActiveIndex] = useState(0);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const searchRef = useRef<HTMLInputElement | null>(null);\n\n // Reset transient state every time the dropdown opens so we don't\n // leak the previous session's query/highlight into a fresh open.\n useEffect(() => {\n if (open) {\n setQuery('');\n setActiveIndex(0);\n // Focus on next tick — the input isn't mounted on the same\n // frame that flips `open=true`. requestAnimationFrame is the\n // simplest cross-browser way to wait for that mount.\n const id = requestAnimationFrame(() => searchRef.current?.focus());\n return () => cancelAnimationFrame(id);\n }\n }, [open]);\n\n // Click-outside + Escape — mirrors every other Cbox top-bar control.\n useEffect(() => {\n if (!open) {\n return;\n }\n\n function onPointerDown(event: PointerEvent): void {\n if (\n containerRef.current !== null &&\n !containerRef.current.contains(event.target as Node)\n ) {\n setOpen(false);\n }\n }\n\n function onKey(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n setOpen(false);\n }\n }\n\n window.addEventListener('pointerdown', onPointerDown);\n window.addEventListener('keydown', onKey);\n\n return () => {\n window.removeEventListener('pointerdown', onPointerDown);\n window.removeEventListener('keydown', onKey);\n };\n }, [open]);\n\n // No provider, or nothing to show — render nothing. The chrome stays clean.\n if (cboxId === null || cboxId.apps.length === 0) {\n return null;\n }\n\n const apps = cboxId.apps;\n const orgSlug = cboxId.currentOrganization?.slug;\n\n // The host/current app — used to build the trigger label.\n const currentApp = apps.find((a) => a.current === true) ?? null;\n\n // Filter + partition together so the activeIndex below maps cleanly\n // onto the rendered order: entitled rows first, then locked rows.\n const { entitled, locked, navigableHrefs } = useMemo(() => {\n const q = query.trim().toLowerCase();\n const matches = (app: CboxAppLink) => {\n if (q === '') {\n return true;\n }\n return (\n app.name.toLowerCase().includes(q) ||\n app.key.toLowerCase().includes(q) ||\n (app.description?.toLowerCase().includes(q) ?? false)\n );\n };\n\n const entitledList: CboxAppLink[] = [];\n const lockedList: CboxAppLink[] = [];\n for (const app of apps) {\n if (!matches(app)) {\n continue;\n }\n const isEntitled = app.entitled !== false && app.comingSoon !== true;\n (isEntitled ? entitledList : lockedList).push(app);\n }\n\n // Flat list of navigable hrefs in render order — used by Enter on\n // the search input to \"activate\" the highlighted row. Coming-soon\n // rows are skipped (they're not actionable).\n const navigable: Array<{ app: CboxAppLink; isLocked: boolean }> = [];\n for (const app of entitledList) {\n if (app.current !== true) {\n navigable.push({ app, isLocked: false });\n }\n }\n for (const app of lockedList) {\n if (app.comingSoon !== true) {\n navigable.push({ app, isLocked: true });\n }\n }\n\n return {\n entitled: entitledList,\n locked: lockedList,\n navigableHrefs: navigable,\n };\n }, [apps, query]);\n\n const totalMatches = entitled.length + locked.length;\n\n // Clamp activeIndex into the navigable range whenever the filter changes\n // so a query that shrinks the list doesn't leave the highlight pointing\n // past the end.\n useEffect(() => {\n if (activeIndex >= navigableHrefs.length) {\n setActiveIndex(0);\n }\n }, [navigableHrefs.length, activeIndex]);\n\n const triggerMonogram =\n currentApp?.monogram ?? currentApp?.name.slice(0, 1).toUpperCase() ?? '⬛';\n const triggerName = currentApp?.name ?? t('Apps');\n const triggerAccent = currentApp?.accentColor;\n\n function onSearchKeyDown(event: ReactKeyboardEvent<HTMLInputElement>): void {\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n if (navigableHrefs.length === 0) {\n return;\n }\n setActiveIndex((i) => (i + 1) % navigableHrefs.length);\n return;\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n if (navigableHrefs.length === 0) {\n return;\n }\n setActiveIndex((i) => (i - 1 + navigableHrefs.length) % navigableHrefs.length);\n return;\n }\n if (event.key === 'Enter') {\n event.preventDefault();\n const target = navigableHrefs[activeIndex];\n if (target === undefined) {\n return;\n }\n if (target.isLocked) {\n onLockedAppClick?.(target.app);\n setOpen(false);\n return;\n }\n const href =\n orgSlug !== undefined && target.app.current !== true\n ? buildOrgUrl(target.app.url, orgSlug)\n : target.app.url;\n window.location.href = href;\n setOpen(false);\n }\n }\n\n return (\n <div ref={containerRef} className={cn('relative', className)}>\n <button\n type=\"button\"\n aria-haspopup=\"true\"\n aria-expanded={open}\n onClick={() => setOpen((v) => !v)}\n className=\"flex items-center gap-2 rounded-md border border-border bg-card px-2.5 py-1.5 text-sm font-medium text-foreground hover:bg-secondary\"\n >\n {/* Monogram chip matching the AppLauncher tile style */}\n <span\n style={\n triggerAccent !== undefined && secureIconUrl(currentApp?.iconUrl) === null\n ? {\n backgroundColor: triggerAccent,\n color: '#fff',\n borderColor: triggerAccent,\n }\n : undefined\n }\n className=\"flex h-5 w-5 shrink-0 items-center justify-center rounded-sm border border-border bg-secondary text-[10px] font-bold\"\n >\n {currentApp ? (\n <CboxAppIcon name={currentApp.name} iconUrl={currentApp.iconUrl} iconDarkUrl={currentApp.iconDarkUrl} className=\"h-3.5 w-3.5\" fallback={<>{triggerMonogram}</>} />\n ) : (\n triggerMonogram\n )}\n </span>\n <span className=\"max-w-[140px] truncate\">{triggerName}</span>\n <Chevron />\n </button>\n\n {open ? (\n <div\n role=\"dialog\"\n aria-label={t(\"Switch app\")}\n // 22rem wide — enough for monogram + name + description in one line\n // without wrapping. Clamps to viewport-minus-gutter on narrow screens.\n className=\"absolute left-0 top-full z-50 mt-1 w-[min(22rem,calc(100vw-1.5rem))] overflow-hidden rounded-lg border border-border bg-popover shadow-lg\"\n >\n <div className=\"border-b border-border/70 px-3 pt-2.5 pb-1.5\">\n <p className=\"text-mono text-[10px] font-semibold tracking-[0.18em] text-muted-foreground uppercase\">\n {t(\"Switch app\")}</p>\n </div>\n\n <div className=\"border-b border-border/70 px-2 py-1.5\">\n <div className=\"flex items-center gap-2 rounded-md px-2 py-1 focus-within:bg-secondary\">\n <SearchIcon />\n <input\n ref={searchRef}\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={onSearchKeyDown}\n placeholder={t(\"Filter apps…\")}\n aria-label={t(\"Filter apps\")}\n autoComplete=\"off\"\n spellCheck={false}\n className=\"w-full bg-transparent text-sm text-foreground placeholder:text-muted-foreground/60 focus:outline-none\"\n />\n </div>\n </div>\n\n <div className=\"max-h-[60vh] overflow-y-auto py-1\">\n {totalMatches === 0 ? (\n <p className=\"px-3 py-6 text-center text-[12px] text-muted-foreground\">\n {t('No apps match “{query}”', {query})}\n </p>\n ) : null}\n\n {entitled.length > 0 ? (\n <ul className=\"space-y-0.5 p-1\">\n {entitled.map((app) => {\n const navIndex = findNavIndex(navigableHrefs, app);\n return (\n <AppRow\n key={app.key}\n app={app}\n orgSlug={orgSlug}\n highlighted={navIndex === activeIndex}\n onMouseEnter={() => {\n if (navIndex !== -1) {\n setActiveIndex(navIndex);\n }\n }}\n onLockedAppClick={onLockedAppClick}\n onNavigate={() => setOpen(false)}\n />\n );\n })}\n </ul>\n ) : null}\n\n {locked.length > 0 ? (\n <>\n {entitled.length > 0 ? (\n <div className=\"my-1 border-t border-border/50\" />\n ) : null}\n <p className=\"text-mono px-3 py-1.5 text-[10px] font-semibold tracking-[0.18em] text-muted-foreground/70 uppercase\">\n {t(\"Available\")}</p>\n <ul className=\"space-y-0.5 p-1 pt-0\">\n {locked.map((app) => {\n const navIndex = findNavIndex(navigableHrefs, app);\n return (\n <AppRow\n key={app.key}\n app={app}\n orgSlug={orgSlug}\n highlighted={navIndex === activeIndex}\n onMouseEnter={() => {\n if (navIndex !== -1) {\n setActiveIndex(navIndex);\n }\n }}\n onLockedAppClick={onLockedAppClick}\n onNavigate={() => setOpen(false)}\n />\n );\n })}\n </ul>\n </>\n ) : null}\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction findNavIndex(\n navigable: Array<{ app: CboxAppLink; isLocked: boolean }>,\n app: CboxAppLink,\n): number {\n return navigable.findIndex((n) => n.app.key === app.key);\n}\n\ntype AppRowProps = {\n app: CboxAppLink;\n orgSlug: string | undefined;\n highlighted: boolean;\n onMouseEnter: () => void;\n onLockedAppClick: AppSwitcherProps['onLockedAppClick'];\n onNavigate: () => void;\n};\n\nfunction AppRow({\n app,\n orgSlug,\n highlighted,\n onMouseEnter,\n onLockedAppClick,\n onNavigate,\n}: AppRowProps): ReactNode {\n const { t } = useCboxLocalization();\n const isComingSoon = app.comingSoon === true;\n const isLocked = app.entitled === false || isComingSoon;\n\n const monogram = app.monogram ?? app.name.slice(0, 1).toUpperCase();\n const accent = app.accentColor;\n const tileStyle =\n accent !== undefined && secureIconUrl(app.iconUrl) === null\n ? { backgroundColor: accent, color: '#fff', borderColor: accent }\n : undefined;\n\n // Land directly on `<app>/org/<slug>` — same convention as AppLauncher.\n // Skip the URL transform for the current app: the user is already there.\n const href =\n orgSlug !== undefined && app.current !== true\n ? buildOrgUrl(app.url, orgSlug)\n : app.url;\n\n const tile = (\n <div\n style={tileStyle}\n className={cn(\n 'flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-card text-[13px] font-semibold text-foreground',\n app.current && 'ring-2 ring-accent-edge ring-offset-1 ring-offset-popover',\n isLocked && 'opacity-60 grayscale',\n )}\n >\n <CboxAppIcon name={app.name} iconUrl={app.iconUrl} iconDarkUrl={app.iconDarkUrl} className=\"h-5 w-5\" fallback={<span>{monogram}</span>} />\n </div>\n );\n\n const body = (\n <div className=\"flex min-w-0 flex-1 flex-col leading-tight\">\n <div className=\"flex items-center gap-2\">\n <span\n className={cn(\n 'truncate text-sm font-medium text-foreground',\n isLocked && 'text-muted-foreground',\n )}\n >\n {app.name}\n </span>\n {app.current ? (\n <span className=\"text-mono shrink-0 rounded-sm border border-accent-edge/40 bg-accent-soft px-1 text-[9px] font-semibold tracking-[0.14em] text-accent uppercase\">\n {t(\"current\")}</span>\n ) : null}\n </div>\n {app.description ? (\n <span\n className={cn(\n 'truncate text-[11px]',\n isLocked ? 'text-muted-foreground/70' : 'text-muted-foreground',\n )}\n >\n {app.description}\n </span>\n ) : null}\n </div>\n );\n\n const trailing = isComingSoon ? (\n <span className=\"text-mono shrink-0 rounded-sm border border-border bg-secondary px-1.5 py-0.5 text-[9px] font-semibold tracking-[0.14em] text-muted-foreground uppercase\">\n {t(\"soon\")}</span>\n ) : isLocked ? (\n <span className=\"flex shrink-0 items-center gap-1 text-[10px] font-medium text-muted-foreground\">\n <Lock />\n {t(\"Add\")}</span>\n ) : null;\n\n if (isComingSoon) {\n return (\n <li>\n <div\n aria-disabled\n className=\"flex w-full cursor-not-allowed items-center gap-3 rounded-md px-2.5 py-2\"\n title={t('{name} — coming soon', {name: app.name})}\n >\n {tile}\n {body}\n {trailing}\n </div>\n </li>\n );\n }\n\n if (isLocked) {\n return (\n <li>\n <button\n type=\"button\"\n onMouseEnter={onMouseEnter}\n onClick={() => {\n onLockedAppClick?.(app);\n onNavigate();\n }}\n className={cn(\n 'group flex w-full items-center gap-3 rounded-md px-2.5 py-2 text-left transition-colors',\n highlighted && 'bg-secondary',\n onLockedAppClick !== undefined\n ? 'hover:bg-secondary'\n : 'cursor-default',\n )}\n title={t('Add {name} to your plan', {name: app.name})}\n >\n {tile}\n {body}\n {trailing}\n </button>\n </li>\n );\n }\n\n // Current app: render as a div (no navigation needed — user is already here).\n if (app.current === true) {\n return (\n <li>\n <div\n onMouseEnter={onMouseEnter}\n className=\"flex w-full items-center gap-3 rounded-md bg-accent-soft px-2.5 py-2\"\n >\n {tile}\n {body}\n {trailing}\n </div>\n </li>\n );\n }\n\n return (\n <li>\n <a\n href={href}\n onMouseEnter={onMouseEnter}\n onClick={onNavigate}\n className={cn(\n 'group flex w-full items-center gap-3 rounded-md px-2.5 py-2 transition-colors hover:bg-secondary',\n highlighted && 'bg-secondary',\n )}\n >\n {tile}\n {body}\n {trailing}\n </a>\n </li>\n );\n}\n\nfunction buildOrgUrl(url: string, orgSlug: string): string {\n if (url === '' || orgSlug === '') {\n return url;\n }\n try {\n const u = new URL(url);\n u.pathname = `/org/${encodeURIComponent(orgSlug)}`;\n return u.toString();\n } catch {\n return `${url.replace(/\\/$/, '')}/org/${encodeURIComponent(orgSlug)}`;\n }\n}\n\nfunction Chevron(): ReactNode {\n return (\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden\n >\n <path\n d=\"M2 4l3 3 3-3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction SearchIcon(): ReactNode {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className=\"shrink-0 text-muted-foreground\"\n >\n <circle cx=\"5.25\" cy=\"5.25\" r=\"3.25\" />\n <path d=\"M8 8l2 2\" />\n </svg>\n );\n}\n\nfunction Lock(): ReactNode {\n return (\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n >\n <rect x=\"2.5\" y=\"5\" width=\"7\" height=\"5\" rx=\"1\" />\n <path d=\"M4 5V3.5a2 2 0 1 1 4 0V5\" />\n </svg>\n );\n}\n","import type { LucideIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\ntype EmptyStateProps = {\n icon?: LucideIcon;\n title: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n className?: string;\n};\n\n/**\n * Centered empty state with an optional icon block, title, body\n * lede, and a single CTA slot.\n */\nexport function EmptyState({\n icon: Icon,\n title,\n description,\n action,\n className,\n}: EmptyStateProps) {\n return (\n <div\n className={cn(\n 'flex flex-col items-center justify-center gap-3 px-6 py-12 text-center',\n className,\n )}\n >\n {Icon ? (\n <div className=\"flex h-10 w-10 items-center justify-center rounded-md bg-secondary text-muted-foreground\">\n <Icon className=\"h-4 w-4\" strokeWidth={1.6} />\n </div>\n ) : null}\n <div className=\"space-y-1\">\n <h3 className=\"text-base font-semibold text-foreground\">\n {title}\n </h3>\n {description ? (\n <p className=\"max-w-sm text-sm text-muted-foreground\">\n {description}\n </p>\n ) : null}\n </div>\n {action ? <div className=\"pt-1\">{action}</div> : null}\n </div>\n );\n}\n","import { cn } from '../utils/cn';\n\ntype Tone =\n | 'neutral'\n | 'info'\n | 'success'\n | 'warning'\n | 'destructive'\n | 'muted';\n\nconst toneStyles: Record<Tone, string> = {\n neutral: 'border-border bg-secondary text-secondary-foreground',\n info: 'border-info/20 bg-info-soft text-info',\n success: 'border-success/20 bg-success-soft text-success',\n warning: 'border-warning/20 bg-warning-soft text-warning',\n destructive: 'border-destructive/20 bg-destructive-soft text-destructive',\n muted: 'border-border bg-card text-muted-foreground',\n};\n\nconst dotStyles: Record<Tone, string> = {\n neutral: 'bg-muted-foreground',\n info: 'bg-info',\n success: 'bg-success',\n warning: 'bg-warning',\n destructive: 'bg-destructive',\n muted: 'bg-muted-foreground/60',\n};\n\ntype StatusPillProps = {\n children: React.ReactNode;\n tone?: Tone;\n className?: string;\n /** Show a small dot before the label for \"live status\" feel. */\n dot?: boolean;\n};\n\n/**\n * Compact pill for plan tier, role, status, etc. Rounded-full like\n * Cortex's \"Running\"/\"Production\" tags. Sized for tabular density,\n * not editorial impact.\n */\nexport function StatusPill({\n children,\n tone = 'neutral',\n className,\n dot = false,\n}: StatusPillProps) {\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full border px-2 py-0.5 text-[11px] leading-none font-medium',\n toneStyles[tone],\n className,\n )}\n >\n {dot ? (\n <span\n className={cn('h-1.5 w-1.5 rounded-full', dotStyles[tone])}\n />\n ) : null}\n {children}\n </span>\n );\n}\n","import { useCboxLocalization } from '../context/localization';\nimport { X } from 'lucide-react';\nimport {\n useCallback,\n useEffect,\n useRef,\n type ReactNode,\n} from 'react';\nimport { cn } from '../utils/cn';\n\ntype Props = {\n open: boolean;\n onClose: () => void;\n /** Title rendered in the modal header. */\n title: ReactNode;\n /** Optional eyebrow above the title. */\n eyebrow?: ReactNode;\n /** Right-side header slot — typically a small action cluster\n * (filters, \"open in new tab\", search input). */\n headerActions?: ReactNode;\n /** Optional bottom bar — e.g. \"showing 50 of 312\" + pagination. */\n footer?: ReactNode;\n /** Modal width. Default `wide` (~960px) suits inbox-style lists.\n * `spotlight` is the search-modal width, narrower + top-aligned. */\n size?: 'wide' | 'spotlight';\n children: ReactNode;\n};\n\n/**\n * Cbox cross-app surface modal. Identical chrome across every\n * surface — only `title`, `headerActions`, `children`, `footer`\n * vary. Surfaces compose this; hosts never instantiate it\n * directly.\n *\n * Behaviour:\n * - ESC key dismisses\n * - click on the backdrop dismisses\n * - focus is trapped inside the dialog while open\n * - body scroll locks while open (page underneath stays put)\n * - first focusable element inside auto-focuses on open\n *\n * The modal mounts a sibling portal-style div that's a direct\n * child of `<body>` (via fixed positioning + z-index) so it\n * escapes any positioned ancestor in the host page tree.\n */\nexport function SurfaceModal({\n open,\n onClose,\n title,\n eyebrow,\n headerActions,\n footer,\n size = 'wide',\n children,\n}: Props) {\n const { t } = useCboxLocalization();\n const dialogRef = useRef<HTMLDivElement | null>(null);\n const previousFocusRef = useRef<HTMLElement | null>(null);\n\n // Lock body scroll while open. Restore the page's previous\n // scrollbar gutter to avoid layout shift.\n useEffect(() => {\n if (!open) return;\n const original = document.body.style.overflow;\n const gutter = window.innerWidth - document.documentElement.clientWidth;\n document.body.style.overflow = 'hidden';\n if (gutter > 0) {\n document.body.style.paddingRight = `${gutter}px`;\n }\n return () => {\n document.body.style.overflow = original;\n document.body.style.paddingRight = '';\n };\n }, [open]);\n\n // ESC dismiss + focus trap.\n useEffect(() => {\n if (!open) return;\n previousFocusRef.current = document.activeElement as HTMLElement | null;\n\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n onClose();\n return;\n }\n if (e.key === 'Tab' && dialogRef.current !== null) {\n const focusable = dialogRef.current.querySelectorAll<HTMLElement>(\n 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])',\n );\n if (focusable.length === 0) return;\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n if (first === undefined || last === undefined) return;\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n }\n };\n document.addEventListener('keydown', onKey);\n\n // Auto-focus the first focusable element so keyboard users\n // land inside the dialog without an extra Tab.\n const id = window.setTimeout(() => {\n const focusable = dialogRef.current?.querySelector<HTMLElement>(\n 'input, button, [tabindex]:not([tabindex=\"-1\"])',\n );\n focusable?.focus();\n }, 50);\n\n return () => {\n document.removeEventListener('keydown', onKey);\n window.clearTimeout(id);\n previousFocusRef.current?.focus?.();\n };\n }, [open, onClose]);\n\n const onBackdrop = useCallback(\n (e: React.MouseEvent) => {\n if (e.target === e.currentTarget) onClose();\n },\n [onClose],\n );\n\n if (!open) return null;\n\n return (\n <div\n role=\"presentation\"\n onMouseDown={onBackdrop}\n className={cn(\n 'fixed inset-0 z-50 flex animate-in fade-in duration-150',\n size === 'spotlight'\n ? 'items-start justify-center pt-[10vh]'\n : 'items-center justify-center px-4 py-[5vh]',\n 'bg-foreground/40 backdrop-blur-sm',\n )}\n >\n <div\n ref={dialogRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={typeof title === 'string' ? title : undefined}\n className={cn(\n 'flex max-h-full w-full flex-col overflow-hidden rounded-lg border border-border bg-background text-foreground shadow-2xl',\n 'animate-in zoom-in-95 slide-in-from-bottom-2 duration-150',\n size === 'spotlight'\n ? 'max-w-[640px]'\n : 'max-w-[960px]',\n )}\n >\n <header className=\"flex shrink-0 items-start gap-3 border-b border-border/70 bg-background/80 px-5 py-4 backdrop-blur-md\">\n <div className=\"min-w-0 flex-1\">\n {eyebrow !== undefined ? (\n <p className=\"text-mono text-[10px] font-semibold tracking-[0.18em] uppercase text-muted-foreground\">\n {eyebrow}\n </p>\n ) : null}\n <h2 className=\"text-base font-semibold tracking-tight text-foreground\">\n {title}\n </h2>\n </div>\n {headerActions !== undefined ? (\n <div className=\"flex shrink-0 items-center gap-2\">\n {headerActions}\n </div>\n ) : null}\n <button\n type=\"button\"\n onClick={onClose}\n className=\"ml-1 inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-secondary hover:text-foreground\"\n aria-label={t(\"Close\")}\n >\n <X className=\"h-4 w-4\" strokeWidth={1.8} />\n </button>\n </header>\n\n <div className=\"flex-1 overflow-y-auto\">{children}</div>\n\n {footer !== undefined ? (\n <footer className=\"flex shrink-0 items-center justify-between gap-3 border-t border-border/70 bg-background/80 px-5 py-3 text-xs text-muted-foreground backdrop-blur-md\">\n {footer}\n </footer>\n ) : null}\n </div>\n </div>\n );\n}\n","import { useCboxLocalization } from '../context/localization';\nimport { useEffect, useState } from 'react';\nimport { useCboxIdOptional } from '../context/cbox-id';\nimport { EmptyState } from '../primitives/empty-state';\nimport { StatusPill } from '../primitives/status-pill';\nimport { useTransport } from './surface-state';\nimport { SurfaceModal } from './surface-modal';\nimport type { Transport } from './types';\n\ntype InboxItem = {\n id: string;\n event_type: string;\n severity: 'info' | 'warning' | 'critical';\n data: Record<string, unknown> | null;\n subject_type: string | null;\n subject_id: string | null;\n created_at: string;\n read_at: string | null;\n};\n\ntype Inbox = {\n recipient: { external_id: string; display_name: string | null } | null;\n items: InboxItem[];\n unread_count: number;\n};\n\ntype Props = {\n open: boolean;\n onClose: () => void;\n};\n\nconst TONES: Record<\n InboxItem['severity'],\n 'info' | 'warning' | 'destructive'\n> = {\n info: 'info',\n warning: 'warning',\n critical: 'destructive',\n};\n\n/**\n * Full inbox modal — opened from the bell popover's \"See all\"\n * affordance. Renders inline over the host page so the user\n * never leaves their app context to read or manage notifications.\n *\n * Data flows:\n * - Initial load: GET /api/v1/recipients/{id_user_id}/inbox via\n * transport.getToken('notifications')\n * - Mark-read: POST /api/v1/recipients/{id}/notifications/{nid}/read\n * (optimistic; reverts on failure)\n * - Realtime hooks land in a follow-up session\n * (notifications.user.{id}.created topic)\n */\nexport function InboxSurface({ open, onClose }: Props) {\n const { t, formatDate } = useCboxLocalization();\n const transport = useTransport();\n const cboxId = useCboxIdOptional();\n const [inbox, setInbox] = useState<Inbox | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [filter, setFilter] = useState<'all' | 'unread'>('all');\n\n const userId = cboxId?.user.id ?? null;\n const baseUrl = transport.urls.notifications ?? null;\n\n useEffect(() => {\n if (!open || userId === null || baseUrl === null) return;\n let cancelled = false;\n const load = async () => {\n setLoading(true);\n setError(null);\n try {\n const headers = await authHeaders(transport, 'notifications');\n const response = await fetch(\n `${baseUrl}/api/v1/recipients/${userId}/inbox?limit=100`,\n { headers, credentials: 'include' },\n );\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n const body = (await response.json()) as Inbox;\n if (!cancelled) setInbox(body);\n } catch (e) {\n if (!cancelled) {\n setError(e instanceof Error ? e.message : t('Load failed'));\n }\n } finally {\n if (!cancelled) setLoading(false);\n }\n };\n void load();\n return () => {\n cancelled = true;\n };\n }, [open, userId, baseUrl, transport]);\n\n const markRead = async (id: string) => {\n if (inbox === null || userId === null || baseUrl === null) return;\n // Optimistic\n const prev = inbox;\n setInbox({\n ...inbox,\n items: inbox.items.map((it) =>\n it.id === id\n ? { ...it, read_at: new Date().toISOString() }\n : it,\n ),\n unread_count: Math.max(0, inbox.unread_count - 1),\n });\n try {\n const headers = await authHeaders(transport, 'notifications');\n const csrf = transport.csrfToken?.();\n if (csrf !== undefined && csrf !== '') {\n headers['X-CSRF-TOKEN'] = csrf;\n headers['X-Requested-With'] = 'XMLHttpRequest';\n }\n const response = await fetch(\n `${baseUrl}/api/v1/recipients/${userId}/notifications/${id}/read`,\n {\n method: 'POST',\n headers,\n credentials: 'include',\n },\n );\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n } catch {\n setInbox(prev);\n }\n };\n\n const items = inbox?.items ?? [];\n const filtered =\n filter === 'unread' ? items.filter((i) => i.read_at === null) : items;\n\n const unread = inbox?.unread_count ?? 0;\n\n return (\n <SurfaceModal\n open={open}\n onClose={onClose}\n eyebrow={t(\"Notifications\")}\n title={\n unread > 0 ? t('Inbox · {count} unread', {count: unread}) : t('Inbox · all caught up')\n }\n headerActions={\n <div className=\"flex items-center gap-2\">\n <FilterTab\n active={filter === 'all'}\n onClick={() => setFilter('all')}\n >\n {t(\"All\")}</FilterTab>\n <FilterTab\n active={filter === 'unread'}\n onClick={() => setFilter('unread')}\n >\n {t(\"Unread\")}</FilterTab>\n </div>\n }\n footer={\n inbox !== null && baseUrl !== null ? (\n <>\n <span>\n {t('Showing {shown} of {total}.', {shown: filtered.length, total: items.length})}\n </span>\n <a\n href={`${baseUrl}/inbox`}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"font-medium text-foreground hover:underline\"\n >\n {t(\"Open in new tab ↗\")}</a>\n </>\n ) : (\n <span>—</span>\n )\n }\n >\n {error !== null ? (\n <div className=\"px-5 py-8 text-center\">\n <p className=\"text-sm font-medium text-destructive\">\n {t(\"Couldn't load inbox\")}</p>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {error}\n </p>\n </div>\n ) : loading && inbox === null ? (\n <div className=\"px-5 py-12 text-center text-sm text-muted-foreground\">\n {t(\"Loading…\")}</div>\n ) : filtered.length === 0 ? (\n <div className=\"px-5 py-12\">\n <EmptyState\n title={\n filter === 'unread'\n ? t('No unread notifications')\n : t('No notifications yet')\n }\n description={t(\"When a Cbox app sends you something — invitation accepted, billing event, security alert — it lands here.\")}\n />\n </div>\n ) : (\n <ul className=\"divide-y divide-border/70\">\n {filtered.map((item) => {\n const data = (item.data ?? {}) as Record<\n string,\n string | undefined\n >;\n const ctaUrl = data.cta_url;\n const InnerWrapper = ({\n children,\n }: {\n children: React.ReactNode;\n }) =>\n ctaUrl !== undefined && ctaUrl !== '' ? (\n <a\n href={ctaUrl}\n className=\"block transition-colors hover:bg-secondary/40\"\n >\n {children}\n </a>\n ) : (\n <div>{children}</div>\n );\n\n return (\n <li\n key={item.id}\n className={\n item.read_at === null\n ? 'bg-secondary/20'\n : ''\n }\n >\n <InnerWrapper>\n <div className=\"flex items-start gap-3 px-5 py-3\">\n <StatusPill\n tone={TONES[item.severity]}\n dot\n >\n {item.severity}\n </StatusPill>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-foreground\">\n {data.title ??\n item.event_type}\n </p>\n {(data.body ?? '') !== '' ? (\n <p className=\"mt-0.5 line-clamp-2 text-xs text-muted-foreground\">\n {data.body}\n </p>\n ) : null}\n <p className=\"text-mono mt-1 text-[10px] text-muted-foreground\">\n {item.event_type}\n {' · '}\n {formatDate(item.created_at)}\n </p>\n </div>\n {item.read_at === null ? (\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n void markRead(item.id);\n }}\n className=\"shrink-0 rounded-md border border-border bg-card px-2 py-1 text-xs font-medium text-foreground transition-colors hover:border-border-strong\"\n aria-label={t(\"Mark as read\")}\n >\n {t(\"Mark read\")}</button>\n ) : null}\n </div>\n </InnerWrapper>\n </li>\n );\n })}\n </ul>\n )}\n </SurfaceModal>\n );\n}\n\n/**\n * Build request headers for a transport call. If the host's\n * `getToken` returns a non-empty bearer, it's attached. If it\n * returns an empty string, the surface assumes same-origin cookie\n * auth — the host is proxying the request through its own session.\n *\n * Either model is supported because hosts pick their security\n * trade-off: same-origin proxy keeps M2M tokens server-side; direct\n * CORS to notifications.cbox.systems is faster but exposes the\n * audience-bound bearer to the page.\n */\nasync function authHeaders(\n transport: Transport,\n audience: string,\n): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n Accept: 'application/json',\n };\n try {\n const { token } = await transport.getToken(audience);\n if (token !== '') {\n headers.Authorization = `Bearer ${token}`;\n }\n } catch {\n // Empty token / failure → fall back to cookie auth.\n }\n return headers;\n}\n\nfunction FilterTab({\n active,\n onClick,\n children,\n}: {\n active: boolean;\n onClick: () => void;\n children: React.ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={\n active\n ? 'rounded-md bg-secondary px-2 py-1 text-xs font-medium text-foreground'\n : 'rounded-md px-2 py-1 text-xs font-medium text-muted-foreground hover:bg-secondary/60 hover:text-foreground'\n }\n aria-pressed={active}\n >\n {children}\n </button>\n );\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState,\n type ReactNode,\n} from 'react';\nimport { InboxSurface } from './inbox-surface';\nimport type {\n CboxSurfacesProps,\n SurfaceArgs,\n SurfaceController,\n SurfaceId,\n Transport,\n} from './types';\n\nconst TransportContext = createContext<Transport | null>(null);\nconst SurfaceContext = createContext<SurfaceController | null>(null);\n\n/**\n * Mount the cbox-ui surface runtime once per app, alongside the\n * page tree. The host's chrome (bell, search trigger) reads\n * `useCboxSurfaces()` to open surfaces; cbox-ui renders the\n * active one as a modal/drawer over the page.\n *\n * Exactly one CboxSurfaces should be in the tree — typically right\n * inside CboxAppShell. Multiple instances would race their state\n * machines.\n */\nexport function CboxSurfaces({\n transport,\n surfaces,\n config,\n children,\n}: CboxSurfacesProps) {\n void config; // reserved for per-surface customisation; unused in v1\n const enabled = useMemo(() => new Set(surfaces), [surfaces]);\n const [active, setActive] = useState<{\n id: SurfaceId;\n args?: SurfaceArgs[SurfaceId];\n } | null>(null);\n\n const open = useCallback(\n <K extends SurfaceId>(id: K, args?: SurfaceArgs[K]) => {\n if (!enabled.has(id)) {\n console.warn(\n `[cbox-ui] surface \"${id}\" is not enabled in this host. Add it to <CboxSurfaces surfaces={[…]}>.`,\n );\n return;\n }\n setActive({ id, args });\n },\n [enabled],\n );\n\n const close = useCallback(() => setActive(null), []);\n\n const controller = useMemo<SurfaceController>(\n () => ({\n activeSurface: active?.id ?? null,\n open,\n close,\n }),\n [active, open, close],\n );\n\n return (\n <TransportContext.Provider value={transport}>\n <SurfaceContext.Provider value={controller}>\n {children}\n\n {/*\n * Active surface renders as a sibling of the page\n * tree. Each surface owns its own portal-style fixed\n * positioning so it escapes any positioned ancestor.\n * Only one surface is mounted at a time.\n */}\n <InboxSurface\n open={active?.id === 'inbox'}\n onClose={close}\n />\n {/* Search / activity / help surfaces will render here\n * as additional `<Surface open={…} onClose={…} />`\n * lines once shipped. They're additive — adding a\n * new surface doesn't change anything in hosts. */}\n </SurfaceContext.Provider>\n </TransportContext.Provider>\n );\n}\n\n/**\n * Imperative API for triggering surfaces from anywhere in the\n * host page. The bell-popover's \"See all\" calls\n * `useCboxSurfaces().open('inbox')` instead of navigating.\n */\nexport function useCboxSurfaces(): SurfaceController {\n const ctx = useContext(SurfaceContext);\n if (ctx === null) {\n throw new Error(\n '[cbox-ui] useCboxSurfaces must be used inside <CboxSurfaces>. Did the host forget to mount it?',\n );\n }\n return ctx;\n}\n\n/**\n * Optional variant — returns `null` when no `<CboxSurfaces>` host is\n * mounted. Chrome controls (bell, search trigger) use this to\n * degrade gracefully to cross-app navigation when the host hasn't\n * opted into the surface runtime yet.\n */\nexport function useCboxSurfacesOptional(): SurfaceController | null {\n return useContext(SurfaceContext);\n}\n\n/**\n * Read-only access to the host-supplied transport. Internal —\n * surface implementations call this; host code shouldn't need it.\n */\nexport function useTransport(): Transport {\n const t = useContext(TransportContext);\n if (t === null) {\n throw new Error(\n '[cbox-ui] useTransport must be used inside <CboxSurfaces>.',\n );\n }\n return t;\n}\n","import { useCboxLocalization } from '../context/localization';\nimport { useEffect, useRef, useState, type ReactNode } from 'react';\nimport { useCboxIdOptional } from '../context/cbox-id';\nimport type { CboxNotificationPreviewItem } from '../context/cbox-id';\nimport { useCboxSurfacesOptional } from '../surfaces/surface-state';\nimport { cn } from '../utils/cn';\n\n/**\n * Bell with unread-count badge + popover preview. Click opens a\n * dropdown with the last 5 items inline (no navigation), each with\n * an inline mark-read action and an optional deep-link to the page\n * that originated the notification. \"See all\" at the bottom links\n * to the central notifications service inbox — the only navigation\n * away from the host app.\n *\n * Pattern matches Linear / GitHub / Stripe: glance + mark-read\n * without leaving context; cross-app jump only when the user\n * explicitly wants the full list.\n *\n * Renders nothing if the context is missing or notifications\n * aren't configured (eg pre-auth pages).\n */\nexport function NotificationsBell({ className }: { className?: string }) {\n const { t, formatDate } = useCboxLocalization();\n const ctx = useCboxIdOptional();\n const surfaces = useCboxSurfacesOptional();\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n if (!open) return;\n const onDocClick = (e: MouseEvent) => {\n const target = e.target;\n if (\n target instanceof Node &&\n ref.current !== null &&\n !ref.current.contains(target)\n ) {\n setOpen(false);\n }\n };\n const onEsc = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false);\n };\n document.addEventListener('mousedown', onDocClick);\n document.addEventListener('keydown', onEsc);\n return () => {\n document.removeEventListener('mousedown', onDocClick);\n document.removeEventListener('keydown', onEsc);\n };\n }, [open]);\n\n // Render the bell even when notifications aren't wired up (null/undefined)\n // so the chrome is visually identical across all apps. The button is\n // inert (no popover opens) when there's no data.\n const notificationsData = ctx === null ? null : (ctx.notifications ?? null);\n\n if (ctx === null) {\n return null;\n }\n\n // Render a static bell icon when there's no notifications data yet.\n if (notificationsData === null) {\n return (\n <div className={cn('relative', className)}>\n <button\n type=\"button\"\n aria-label={t(\"Notifications\")}\n disabled\n className=\"relative flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground opacity-60 cursor-default\"\n >\n <Bell />\n </button>\n </div>\n );\n }\n\n const { unreadCount, inboxUrl, previewItems, markReadUrl } =\n notificationsData;\n const display = unreadCount > 99 ? '99+' : unreadCount.toString();\n\n return (\n <div ref={ref} className={cn('relative', className)}>\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n aria-label={\n unreadCount > 0\n ? t('{count} unread notifications', {count: unreadCount})\n : t('Notifications')\n }\n aria-expanded={open}\n aria-haspopup=\"menu\"\n className=\"relative flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-secondary hover:text-foreground data-[open=true]:bg-secondary data-[open=true]:text-foreground\"\n data-open={open ? 'true' : 'false'}\n >\n <Bell />\n {unreadCount > 0 ? (\n <span className=\"absolute -right-0.5 -top-0.5 flex min-w-[16px] items-center justify-center rounded-full bg-destructive px-1 text-[9px] font-semibold leading-4 text-destructive-foreground\">\n {display}\n </span>\n ) : null}\n </button>\n\n {open ? (\n <div\n role=\"menu\"\n className=\"absolute right-0 z-30 mt-2 w-[360px] origin-top-right rounded-md border border-border bg-popover text-popover-foreground shadow-lg\"\n >\n <header className=\"flex items-center justify-between border-b border-border/70 px-3 py-2\">\n <span className=\"text-mono text-[10px] font-semibold tracking-[0.18em] uppercase text-muted-foreground\">\n {t(\"Notifications\")}</span>\n {unreadCount > 0 ? (\n <span className=\"text-mono text-[10px] tabular-nums text-muted-foreground\">\n {t('{count} unread', {count: unreadCount})}</span>\n ) : null}\n </header>\n\n <div className=\"max-h-[420px] overflow-y-auto\">\n {previewItems === undefined ||\n previewItems.length === 0 ? (\n <div className=\"px-3 py-8 text-center\">\n <p className=\"text-sm font-medium text-foreground\">\n {t(\"All caught up\")}</p>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {t(\"No recent notifications.\")}</p>\n </div>\n ) : (\n <ul className=\"divide-y divide-border/70\">\n {previewItems.map((item) => (\n <PreviewRow\n key={item.id}\n item={item}\n markReadUrl={markReadUrl}\n onMarkedRead={() => setOpen(false)}\n />\n ))}\n </ul>\n )}\n </div>\n\n {surfaces !== null ? (\n <button\n type=\"button\"\n onClick={() => {\n setOpen(false);\n surfaces.open('inbox');\n }}\n className=\"flex w-full items-center justify-center border-t border-border/70 px-3 py-2 text-xs font-medium text-foreground transition-colors hover:bg-secondary\"\n >\n {t(\"See all notifications →\")}</button>\n ) : (\n <a\n href={inboxUrl}\n className=\"flex items-center justify-center border-t border-border/70 px-3 py-2 text-xs font-medium text-foreground transition-colors hover:bg-secondary\"\n >\n {t(\"See all notifications →\")}</a>\n )}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction PreviewRow({\n item,\n markReadUrl,\n onMarkedRead,\n}: {\n item: CboxNotificationPreviewItem;\n markReadUrl?: string;\n onMarkedRead: () => void;\n}) {\n const { t, formatDate } = useCboxLocalization();\n const tone =\n item.severity === 'critical'\n ? 'bg-destructive'\n : item.severity === 'warning'\n ? 'bg-warning'\n : 'bg-info';\n\n const ts = (() => {\n try {\n return formatDate(item.createdAt);\n } catch {\n return item.createdAt;\n }\n })();\n\n const markRead = async (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (markReadUrl === undefined || markReadUrl === '') return;\n const url = markReadUrl.replace('{id}', item.id);\n const csrf =\n document\n .querySelector<HTMLMetaElement>('meta[name=\"csrf-token\"]')\n ?.content ?? '';\n try {\n await fetch(url, {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'X-CSRF-TOKEN': csrf,\n 'X-Requested-With': 'XMLHttpRequest',\n },\n });\n } catch {\n // Non-fatal — the user can re-open the dropdown.\n }\n onMarkedRead();\n };\n\n const Wrapper = ({ children }: { children: ReactNode }) =>\n item.ctaUrl !== null && item.ctaUrl !== undefined && item.ctaUrl !== ''\n ? (\n <a\n href={item.ctaUrl}\n className=\"block transition-colors hover:bg-secondary/50\"\n >\n {children}\n </a>\n )\n : <div>{children}</div>;\n\n return (\n <li className={item.readAt === null ? 'bg-secondary/20' : ''}>\n <Wrapper>\n <div className=\"flex items-start gap-2 px-3 py-2.5\">\n <span\n aria-hidden\n className={cn(\n 'mt-1.5 h-1.5 w-1.5 shrink-0 rounded-full',\n tone,\n )}\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-[13px] font-medium text-foreground\">\n {item.title}\n </p>\n {item.body !== undefined && item.body !== null && item.body !== '' ? (\n <p className=\"mt-0.5 line-clamp-2 text-xs text-muted-foreground\">\n {item.body}\n </p>\n ) : null}\n <p className=\"text-mono mt-1 text-[10px] text-muted-foreground\">\n {ts}\n </p>\n </div>\n {item.readAt === null ? (\n <button\n type=\"button\"\n onClick={markRead}\n className=\"shrink-0 rounded-md px-2 py-1 text-[10px] font-medium text-muted-foreground transition-colors hover:bg-secondary hover:text-foreground\"\n aria-label={t(\"Mark as read\")}\n title={t(\"Mark as read\")}\n >\n ✓\n </button>\n ) : null}\n </div>\n </Wrapper>\n </li>\n );\n}\n\nfunction Bell(): ReactNode {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden\n >\n <path\n d=\"M4 6.5a4 4 0 1 1 8 0v2.4l1.2 2H2.8l1.2-2V6.5z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M6.5 12.5a1.5 1.5 0 0 0 3 0\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n","import { useCboxLocalization } from '../context/localization';\nimport { useEffect, useState } from 'react';\nimport { cn } from '../utils/cn';\n\ntype Props = {\n /** Click handler — typically dispatches the app's command-palette\n * open shortcut. Apps that don't have a palette yet pass a no-op\n * so the chrome stays visually consistent across the suite. */\n onOpen?: () => void;\n className?: string;\n label?: string;\n};\n\n/**\n * Topbar Search trigger — a visual-only command-palette button.\n *\n * Hosted in cbox-ui because every Cbox app's chrome must show the\n * same search affordance in the same spot, with the same width and\n * the same shortcut hint. Drift across apps means users see layout\n * shifts when tabbing between id / webhooks / cortex; that's a UX\n * tax we don't want to charge them.\n *\n * The actual palette stays per-app (commands differ); this primitive\n * just renders the trigger and dispatches `onOpen`.\n */\nexport function SearchTrigger({ onOpen, className, label }: Props) {\n const { t } = useCboxLocalization();\n const [shortcut, setShortcut] = useState('⌘K');\n useEffect(() => {\n if (typeof navigator === 'undefined') return;\n setShortcut(/Mac/.test(navigator.platform) ? '⌘K' : 'Ctrl K');\n }, []);\n\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n className={cn(\n 'hidden h-8 w-[180px] items-center gap-2 rounded-md border border-border bg-card pr-1.5 pl-2.5 text-xs text-muted-foreground transition-colors hover:border-border-strong hover:text-foreground sm:inline-flex',\n className,\n )}\n aria-label={t(\"Open command palette\")}\n >\n <SearchIcon />\n <span className=\"flex-1 text-left\">{label ?? t('Search')}</span>\n <kbd className=\"text-mono ml-1 rounded-sm border border-border bg-secondary px-1 py-0.5 text-[10px] font-medium tracking-tight text-muted-foreground\">\n {shortcut}\n </kbd>\n </button>\n );\n}\n\nfunction SearchIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n >\n <circle cx=\"11\" cy=\"11\" r=\"7\" />\n <path d=\"m21 21-4.3-4.3\" />\n </svg>\n );\n}\n","import { useCboxLocalization } from '../context/localization';\nimport { useState, type ReactNode } from 'react';\nimport { useCboxId } from '../context/cbox-id';\nimport type { LinkComponent } from '../layout/cbox-app-sidebar';\nimport { cn } from '../utils/cn';\n\ntype Props = {\n /**\n * App-specific menu items rendered above the standard\n * \"Manage account\" / \"Sign out\" set. Use sparingly — the goal\n * is consistency across apps.\n */\n extras?: ReactNode;\n placement?: 'bottom-end' | 'top-start';\n className?: string;\n /**\n * The router's link for the account and organization rows, when they are pages of this\n * app (an Inertia `Link` keeps the visit client-side). Default: a plain anchor, which is\n * right when the rows deep-link into Cbox ID on another origin.\n */\n LinkComponent?: LinkComponent;\n};\n\nconst Anchor: LinkComponent = ({ href, className, children }) => <a href={href} className={className}>{children}</a>;\n\n/**\n * User-menu dropdown. Always exposes:\n * - Manage account ↗ (deep-link into id)\n * - Team & billing ↗ (deep-link into id, current org scope)\n * - Sign out\n *\n * The arrows signal cross-app navigation — id is canonical.\n */\nexport function UserMenu({ extras, className, placement = 'bottom-end', LinkComponent: Link = Anchor }: Props) {\n const { t } = useCboxLocalization();\n const { user, currentOrganization, urls } = useCboxId();\n const [open, setOpen] = useState(false);\n\n const initials = user.name\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((n) => n[0]?.toUpperCase() ?? '')\n .join('');\n\n return (\n <div className={cn('relative', className)} onKeyDown={event => { if (event.key === \"Escape\") setOpen(false); }} onBlur={event => { if (!event.currentTarget.contains(event.relatedTarget)) setOpen(false); }}>\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n className=\"flex h-9 items-center gap-2 rounded-md px-1.5 hover:bg-secondary\"\n aria-label={t(\"Open user menu\")}\n aria-expanded={open}\n onKeyDown={event => { if (event.key === \"Escape\") setOpen(false); }}\n >\n {user.avatar_url ? (\n <img\n src={user.avatar_url}\n alt=\"\"\n className=\"h-7 w-7 rounded-full object-cover\"\n />\n ) : (\n <span className=\"flex h-7 w-7 items-center justify-center rounded-full bg-accent-soft text-[11px] font-semibold text-foreground\">\n {initials || '?'}\n </span>\n )}\n </button>\n {open ? (\n <div className={cn(\"absolute z-50 w-64 rounded-lg border border-border bg-popover p-1 shadow-md\", placement === \"top-start\" ? \"bottom-full left-0 mb-2\" : \"right-0 top-full mt-1\")}>\n <div className=\"px-2 py-2\">\n <p className=\"truncate text-sm font-medium text-foreground\">\n {user.name}\n </p>\n <p className=\"truncate text-xs text-muted-foreground\">\n {user.email}\n </p>\n </div>\n {extras ? (\n <>\n <div className=\"my-1 border-t border-border\" />\n {extras}\n </>\n ) : null}\n <div className=\"my-1 border-t border-border\" />\n <Link\n href={urls.accountUrl}\n className=\"flex items-center justify-between rounded-sm px-2 py-1.5 text-sm hover:bg-secondary\"\n >\n <span>{t(\"Manage account\")}</span>\n <CrossAppArrow />\n </Link>\n {urls.orgSettingsUrl && currentOrganization ? (\n <Link\n href={urls.orgSettingsUrl}\n className=\"flex items-center justify-between rounded-sm px-2 py-1.5 text-sm hover:bg-secondary\"\n >\n <span className=\"truncate\">\n {t(\"Team & billing\")}<span className=\"text-muted-foreground\"> · {currentOrganization.name}</span>\n </span>\n <CrossAppArrow />\n </Link>\n ) : null}\n <div className=\"my-1 border-t border-border\" />\n <form action={urls.signOutUrl} method=\"POST\">\n <SignOutCsrf />\n <button\n type=\"submit\"\n className=\"flex w-full items-center rounded-sm px-2 py-1.5 text-left text-sm hover:bg-secondary\"\n >\n {t(\"Sign out\")}</button>\n </form>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction CrossAppArrow(): ReactNode {\n return (\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n aria-hidden\n >\n <path\n d=\"M3 7l4-4M3 3h4v4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction SignOutCsrf(): ReactNode {\n if (typeof document === 'undefined') return null;\n const csrf = document\n .querySelector<HTMLMetaElement>('meta[name=\"csrf-token\"]')\n ?.content;\n if (!csrf) return null;\n return <input type=\"hidden\" name=\"_token\" value={csrf} />;\n}\n","import { useCboxLocalization } from '../context/localization';\nimport { Menu, PanelLeftClose, PanelLeftOpen } from 'lucide-react';\nimport { useEffect, useState, type ReactNode } from 'react';\nimport { AppContent } from './app-content';\nimport { AppShell } from './app-shell';\nimport {\n CboxAppSidebar,\n type CboxNavSection,\n type LinkComponent,\n} from './cbox-app-sidebar';\nimport { CboxMobileNavDrawer } from './cbox-mobile-nav-drawer';\nimport { AppSwitcher } from '../components/app-switcher';\nimport { NotificationsBell } from '../components/notifications-bell';\nimport { SearchTrigger } from '../components/search-trigger';\nimport { UserMenu } from '../components/user-menu';\n\nexport type CboxAppShellProps = {\n /** App key — drives the brand submark + aria labels. */\n appKey: string;\n /** Override the submark text (defaults to appKey). */\n brandSubmark?: string | null;\n /** Asset base for brand pngs. Default `/brand`. */\n assetBase?: string;\n /** Brand row href (typically the app's home). */\n brandHref?: string;\n\n /** Sidebar nav config. */\n sections: CboxNavSection[];\n /** Active path — used by both sidebar (highlight) and topbar\n * (sidebar-collapse toggle aria state). */\n currentPath: string;\n /** Apps inject their router's Link primitive. */\n LinkComponent: LinkComponent;\n\n /** Persisted \"sidebar collapsed?\" state — owned by the host\n * (the cookie hook lives there). */\n sidebarCollapsed?: boolean;\n /** Click handler for the topbar collapse toggle. Hide the\n * toggle entirely by omitting this prop. */\n onToggleSidebar?: () => void;\n\n /**\n * Topbar centre slot — typically the org switcher / context\n * bar. Apps that aren't org-scoped (notifications, account\n * pages) leave this off.\n */\n topbarCentre?: ReactNode;\n\n /**\n * Handler to open the in-app command palette / search UI.\n * Always rendered — when omitted the trigger is a no-op so the\n * chrome stays visually identical across all apps regardless of\n * whether a palette has been wired up yet.\n */\n onSearchOpen?: () => void;\n\n /**\n * Override the right cluster on the topbar. Default:\n * `[<SearchTrigger>?] <AppLauncher /> <NotificationsBell /> <UserMenu />`.\n * Override only when an app needs a completely different mix.\n */\n topbarRightCluster?: ReactNode;\n\n children: ReactNode;\n};\n\n/**\n * Top-level Cbox application shell. Composes sidebar + topbar +\n * content into the single chrome shape every Cbox app wears.\n *\n * Apps reduce to ~30 lines of layout: define nav, render\n * `<CboxAppShell>{children}</CboxAppShell>`. No app should\n * compose `<AppShell>`/`<AppContent>`/sidebar/topbar manually —\n * drift is the whole reason this component exists.\n */\nexport function CboxAppShell({\n appKey,\n brandSubmark,\n assetBase,\n brandHref,\n sections,\n currentPath,\n LinkComponent,\n sidebarCollapsed = false,\n onToggleSidebar,\n topbarCentre,\n onSearchOpen,\n topbarRightCluster,\n children,\n}: CboxAppShellProps) {\n const { t } = useCboxLocalization();\n const ToggleIcon = sidebarCollapsed ? PanelLeftOpen : PanelLeftClose;\n const [mobileNavOpen, setMobileNavOpen] = useState(false);\n\n // Auto-close the mobile drawer on route change so the in-app\n // navigation feels native — apps don't need to wire this.\n useEffect(() => {\n setMobileNavOpen(false);\n }, [currentPath]);\n\n return (\n <AppShell>\n <CboxAppSidebar\n appKey={appKey}\n brandSubmark={brandSubmark}\n assetBase={assetBase}\n brandHref={brandHref}\n sections={sections}\n currentPath={currentPath}\n LinkComponent={LinkComponent}\n collapsed={sidebarCollapsed}\n />\n <CboxMobileNavDrawer\n open={mobileNavOpen}\n onClose={() => setMobileNavOpen(false)}\n appKey={appKey}\n brandSubmark={brandSubmark}\n assetBase={assetBase}\n brandHref={brandHref}\n sections={sections}\n currentPath={currentPath}\n LinkComponent={LinkComponent}\n />\n <AppContent>\n <header className=\"sticky top-0 z-20 flex h-14 shrink-0 items-center justify-between gap-3 border-b border-border/70 bg-background/80 px-4 backdrop-blur-md\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => setMobileNavOpen(true)}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-secondary hover:text-foreground lg:hidden\"\n aria-label={t(\"Open navigation\")}\n title={t(\"Open navigation\")}\n >\n <Menu className=\"h-4 w-4\" strokeWidth={1.8} />\n </button>\n {onToggleSidebar !== undefined ? (\n <button\n type=\"button\"\n onClick={onToggleSidebar}\n className=\"hidden h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-secondary hover:text-foreground lg:inline-flex\"\n aria-label={\n sidebarCollapsed\n ? t('Expand sidebar')\n : t('Collapse sidebar')\n }\n title={\n sidebarCollapsed\n ? t('Expand sidebar')\n : t('Collapse sidebar')\n }\n >\n <ToggleIcon\n className=\"h-4 w-4\"\n strokeWidth={1.8}\n />\n </button>\n ) : null}\n <AppSwitcher />\n {topbarCentre !== undefined ? topbarCentre : null}\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n {topbarRightCluster !== undefined ? (\n topbarRightCluster\n ) : (\n <>\n <SearchTrigger onOpen={onSearchOpen ?? (() => {})} />\n <NotificationsBell />\n <UserMenu />\n </>\n )}\n </div>\n </header>\n {children}\n </AppContent>\n </AppShell>\n );\n}\n","import { useCboxLocalization } from '../context/localization';\nimport {\n useEffect,\n useId,\n useRef,\n useState,\n type ComponentType,\n type ReactNode,\n} from 'react';\nimport { cn } from '../utils/cn';\n\n/**\n * ContextBar — the topbar breadcrumb-style context selector. One\n * crumb per level of context (org / project / environment / branch /\n * deployment). Each crumb renders as a chip (avatar + label +\n * chevron) and opens a dropdown with the items at that level plus\n * an optional \"+ New X\" footer.\n *\n * The pattern is the cloud-platform default — Vercel, Render, Forge,\n * GitHub, Stripe, Cortex all use it. Topbar carries identity and\n * context; sidebar carries navigation. The two never overlap.\n *\n * URL-driven by default — clicking a dropdown item navigates via the\n * supplied `LinkComponent`. Apps that need a non-navigational select\n * (post a form, mutate session state) pass `onSelect` instead.\n *\n * Separator between crumbs is a muted slash — same as Forge / Cortex.\n */\n\nexport type ContextAvatar = {\n /** 1–2 character monogram. Defaults to first letter of the label. */\n initials?: string;\n /**\n * Hex / CSS colour applied as the avatar's bg. Falls back to the\n * neutral chip when missing. Per-item override of the default.\n */\n accent?: string;\n /** Optional avatar image URL — overrides initials when set. */\n src?: string;\n};\n\nexport type ContextItem = {\n /** Stable identity for the item (slug, id). */\n id: string;\n /** Primary display label. */\n label: string;\n /** Optional secondary line — slug, role, env name. Mono-tracked. */\n secondary?: string;\n /** Avatar specification. Same shape as the crumb's own avatar. */\n avatar?: ContextAvatar;\n /** Navigation target — clicking the item navigates here. */\n href?: string;\n /** Mark the item as the active selection (gets a check on the right). */\n current?: boolean;\n /**\n * Optional href to a settings page for this item. When set, a\n * cogwheel button appears on the right of the row on hover/focus\n * — clicking it navigates straight to settings without going\n * through the item's normal selection. Cortex-style shortcut.\n */\n settingsHref?: string;\n /**\n * Aria-label for the optional settings cogwheel. Defaults to\n * `Settings for <label>`. Override when the label alone isn't\n * enough context (eg multiple items with the same name).\n */\n settingsAriaLabel?: string;\n};\n\nexport type ContextCrumb = {\n /** Stable identity for the crumb (used as React key). */\n id: string;\n /** The chip's visible label — typically the active item's name. */\n label: string;\n /** The chip's avatar — typically the active item's avatar. */\n avatar?: ContextAvatar;\n /** Items shown in the dropdown. Empty array = chip with no menu. */\n items: ContextItem[];\n /**\n * Optional footer link below the items — typically \"+ New X\" or\n * \"Manage Y\". Renders with a + icon and an accent text colour.\n */\n footerLink?: {\n label: string;\n href: string;\n };\n /**\n * Override per-item navigation. When set, item clicks call this\n * with the item's id instead of navigating to `item.href`. Useful\n * for posting a form (eg an org switcher that POSTs to a server-side\n * endpoint).\n */\n onSelect?: (itemId: string) => void;\n /** Optional aria-label for the chip's button (defaults to \"Switch <label>\"). */\n ariaLabel?: string;\n};\n\ntype LinkComp = ComponentType<{\n href: string;\n prefetch?: boolean;\n className?: string;\n children: ReactNode;\n}>;\n\ntype Props = {\n crumbs: ContextCrumb[];\n /**\n * The framework's link component. Inertia consumers pass the\n * Inertia Link; TanStack Router consumers pass their typed Link.\n * Plain `<a>` is the fallback.\n */\n LinkComponent?: LinkComp;\n className?: string;\n};\n\nconst DefaultLink: LinkComp = ({ href, className, children }) => (\n <a href={href} className={className}>\n {children}\n </a>\n);\n\nexport function ContextBar({\n crumbs,\n LinkComponent = DefaultLink,\n className,\n}: Props) {\n const { t } = useCboxLocalization();\n if (crumbs.length === 0) {\n return null;\n }\n\n return (\n <nav\n data-component=\"context-bar\"\n aria-label={t(\"Context\")}\n // No `overflow-x-auto` on the nav — it would clip the\n // dropdown panel that opens below each chip. If we need\n // horizontal scroll for 5+ crumbs later (cortex with\n // org/project/env/branch/region), the dropdown moves to a\n // portal so the nav can clip without affecting popovers.\n className={cn('flex min-w-0 items-center gap-1', className)}\n >\n {crumbs.map((crumb, index) => (\n <div\n key={crumb.id}\n className=\"flex min-w-0 items-center gap-1\"\n >\n {index > 0 ? <Separator /> : null}\n <ContextCrumbChip\n crumb={crumb}\n LinkComponent={LinkComponent}\n />\n </div>\n ))}\n </nav>\n );\n}\n\nfunction Separator() {\n return (\n <span\n aria-hidden\n className=\"text-mono shrink-0 text-[14px] font-light text-muted-foreground/50 select-none\"\n >\n /\n </span>\n );\n}\n\nfunction ContextCrumbChip({\n crumb,\n LinkComponent,\n}: {\n crumb: ContextCrumb;\n LinkComponent: LinkComp;\n}) {\n const { t } = useCboxLocalization();\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement | null>(null);\n const listId = useId();\n\n // Click-outside + Escape close.\n useEffect(() => {\n if (! open) return;\n\n function onPointerDown(event: PointerEvent): void {\n if (\n ref.current !== null &&\n ! ref.current.contains(event.target as Node)\n ) {\n setOpen(false);\n }\n }\n\n function onKey(event: KeyboardEvent): void {\n if (event.key === 'Escape') setOpen(false);\n }\n\n window.addEventListener('pointerdown', onPointerDown);\n window.addEventListener('keydown', onKey);\n\n return () => {\n window.removeEventListener('pointerdown', onPointerDown);\n window.removeEventListener('keydown', onKey);\n };\n }, [open]);\n\n const hasMenu = crumb.items.length > 0 || crumb.footerLink !== undefined;\n\n return (\n <div ref={ref} className=\"relative min-w-0\">\n <button\n type=\"button\"\n onClick={() => setOpen((v) => ! v)}\n aria-expanded={hasMenu ? open : undefined}\n aria-haspopup={hasMenu ? 'listbox' : undefined}\n aria-controls={hasMenu ? listId : undefined}\n aria-label={crumb.ariaLabel ?? t('Switch {name}', {name: crumb.label})}\n disabled={! hasMenu}\n className={cn(\n 'flex h-8 min-w-0 items-center gap-2 rounded-md border border-transparent px-2 text-[13px] text-foreground transition-colors',\n hasMenu &&\n 'hover:border-border hover:bg-secondary/60 focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none',\n open && 'border-border bg-secondary/60',\n )}\n >\n {crumb.avatar !== undefined ? (\n <ContextAvatarChip\n avatar={crumb.avatar}\n fallbackLabel={crumb.label}\n size=\"sm\"\n />\n ) : null}\n <span className=\"truncate font-semibold\">{crumb.label}</span>\n {hasMenu ? <Chevron open={open} /> : null}\n </button>\n\n {open && hasMenu ? (\n <div\n id={listId}\n role=\"listbox\"\n aria-label={crumb.ariaLabel ?? crumb.label}\n className=\"absolute left-0 top-full z-30 mt-1 w-64 overflow-hidden rounded-md border border-border bg-popover shadow-lg\"\n >\n {crumb.items.length > 0 ? (\n <ul className=\"max-h-72 overflow-y-auto py-1\">\n {crumb.items.map((item) => (\n <ContextItemRow\n key={item.id}\n item={item}\n onSelect={crumb.onSelect}\n LinkComponent={LinkComponent}\n onAfterClick={() => setOpen(false)}\n />\n ))}\n </ul>\n ) : null}\n\n {crumb.footerLink !== undefined ? (\n <>\n {crumb.items.length > 0 ? (\n <div className=\"border-t border-border/60\" />\n ) : null}\n <div\n // Close the dropdown when the footer\n // link is clicked. SPA navigations\n // don't unmount this menu (it's a\n // sibling subtree), so without this\n // the dropdown stays open on the next\n // page.\n onClickCapture={() => setOpen(false)}\n >\n <LinkComponent\n href={crumb.footerLink.href}\n prefetch\n className=\"flex items-center gap-2 px-3 py-2.5 text-[13px] font-medium text-info transition-colors hover:bg-info-soft\"\n >\n <Plus />\n <span>{crumb.footerLink.label}</span>\n </LinkComponent>\n </div>\n </>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction ContextItemRow({\n item,\n onSelect,\n LinkComponent,\n onAfterClick,\n}: {\n item: ContextItem;\n onSelect: ContextCrumb['onSelect'];\n LinkComponent: LinkComp;\n onAfterClick: () => void;\n}) {\n const { t } = useCboxLocalization();\n const body = (\n <div className=\"flex w-full min-w-0 items-center gap-2.5 px-2.5 py-2\">\n {item.avatar !== undefined ? (\n <ContextAvatarChip\n avatar={item.avatar}\n fallbackLabel={item.label}\n size=\"md\"\n />\n ) : null}\n <div className=\"flex min-w-0 flex-1 flex-col leading-tight\">\n <span className=\"truncate text-[13px] font-medium text-foreground\">\n {item.label}\n </span>\n {item.secondary !== undefined ? (\n <span className=\"text-mono truncate text-[10px] text-muted-foreground\">\n {item.secondary}\n </span>\n ) : null}\n </div>\n {item.current === true && item.settingsHref === undefined ? (\n <Check />\n ) : null}\n </div>\n );\n\n const baseClassName = cn(\n 'group/item block w-full rounded-sm transition-colors',\n item.current === true\n ? 'bg-accent-soft hover:bg-accent-soft/80'\n : 'hover:bg-secondary',\n );\n\n // The settings cogwheel sits at the right of the row. It's a\n // separate Link / button — clicking it should NOT trigger the\n // item's main selection. We render it as a sibling of the body\n // and stop click propagation on the cogwheel itself.\n const settingsCog =\n item.settingsHref !== undefined ? (\n <LinkComponent\n href={item.settingsHref}\n prefetch\n className=\"invisible absolute right-1 top-1/2 inline-flex h-7 w-7 -translate-y-1/2 items-center justify-center rounded-sm text-muted-foreground transition-colors group-hover/item:visible hover:bg-card hover:text-foreground focus-visible:visible focus-visible:bg-card focus-visible:text-foreground focus-visible:outline-none\"\n >\n <span\n aria-label={\n item.settingsAriaLabel ?? t('Settings for {name}', {name: item.label})\n }\n onClickCapture={(event) => {\n event.stopPropagation();\n onAfterClick();\n }}\n className=\"contents\"\n >\n <SettingsIcon />\n </span>\n </LinkComponent>\n ) : null;\n\n if (onSelect !== undefined) {\n return (\n <li className=\"relative\">\n <button\n type=\"button\"\n onClick={() => {\n onSelect(item.id);\n onAfterClick();\n }}\n className={cn(baseClassName, 'text-left')}\n >\n {body}\n </button>\n {settingsCog}\n </li>\n );\n }\n\n if (item.href !== undefined) {\n return (\n <li className=\"relative\">\n <LinkComponent\n href={item.href}\n prefetch\n className={baseClassName}\n >\n {body}\n </LinkComponent>\n {settingsCog}\n </li>\n );\n }\n\n return (\n <li className=\"relative\">\n <div className={baseClassName}>{body}</div>\n {settingsCog}\n </li>\n );\n}\n\nfunction SettingsIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n >\n <circle cx=\"7\" cy=\"7\" r=\"2\" />\n <path d=\"M11.66 8.42a.79.79 0 0 0 .16.86l.03.03a.96.96 0 1 1-1.36 1.36l-.03-.03a.79.79 0 0 0-.86-.16.79.79 0 0 0-.48.72v.08a.96.96 0 1 1-1.92 0v-.04a.79.79 0 0 0-.52-.72.79.79 0 0 0-.86.16l-.03.03a.96.96 0 1 1-1.36-1.36l.03-.03a.79.79 0 0 0 .16-.86.79.79 0 0 0-.72-.48h-.08a.96.96 0 1 1 0-1.92h.04a.79.79 0 0 0 .72-.52.79.79 0 0 0-.16-.86l-.03-.03a.96.96 0 1 1 1.36-1.36l.03.03a.79.79 0 0 0 .86.16h.04a.79.79 0 0 0 .48-.72v-.08a.96.96 0 1 1 1.92 0v.04a.79.79 0 0 0 .48.72.79.79 0 0 0 .86-.16l.03-.03a.96.96 0 1 1 1.36 1.36l-.03.03a.79.79 0 0 0-.16.86v.04a.79.79 0 0 0 .72.48h.08a.96.96 0 1 1 0 1.92h-.04a.79.79 0 0 0-.72.48Z\" />\n </svg>\n );\n}\n\nexport function ContextAvatarChip({\n avatar,\n fallbackLabel,\n size = 'md',\n}: {\n avatar: ContextAvatar;\n fallbackLabel: string;\n size?: 'sm' | 'md';\n}) {\n const initials =\n avatar.initials ?? deriveInitials(fallbackLabel);\n const sizeClass =\n size === 'sm' ? 'h-[26px] w-[26px] text-[10px]' : 'h-7 w-7 text-[11px]';\n const style =\n avatar.src === undefined && avatar.accent !== undefined\n ? {\n backgroundColor: avatar.accent,\n color: '#fff',\n }\n : undefined;\n\n if (avatar.src !== undefined) {\n return (\n <img\n src={avatar.src}\n alt=\"\"\n className={cn(\n 'shrink-0 rounded-sm bg-secondary object-cover',\n sizeClass,\n )}\n loading=\"lazy\"\n />\n );\n }\n\n return (\n <span\n style={style}\n className={cn(\n 'flex shrink-0 items-center justify-center rounded-sm font-semibold tracking-tight',\n avatar.accent === undefined && 'bg-info-soft text-info',\n sizeClass,\n )}\n >\n {initials}\n </span>\n );\n}\n\nfunction deriveInitials(label: string): string {\n const parts = label.trim().split(/\\s+/);\n if (parts.length >= 2) {\n return ((parts[0]?.[0] ?? '') + (parts[1]?.[0] ?? '')).toUpperCase();\n }\n return (label.slice(0, 2) || '?').toUpperCase();\n}\n\nfunction Chevron({ open }: { open: boolean }) {\n return (\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={cn(\n 'shrink-0 text-muted-foreground transition-transform duration-150',\n open && 'rotate-180',\n )}\n aria-hidden\n >\n <path d=\"m2.5 4 2.5 2.5L7.5 4\" />\n </svg>\n );\n}\n\nfunction Check() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"shrink-0 text-accent\"\n aria-hidden\n >\n <path d=\"m3 7.5 2.5 2.5L11 4.5\" />\n </svg>\n );\n}\n\nfunction Plus() {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"shrink-0\"\n aria-hidden\n >\n <path d=\"M6 2v8M2 6h8\" />\n </svg>\n );\n}\n","import { useCboxLocalization } from '../context/localization';\nimport { useCboxIdOptional } from '../context/cbox-id';\nimport { ContextBar, type ContextItem } from '../primitives/context-bar';\nimport type { LinkComponent } from './cbox-app-sidebar';\n\nexport type CboxOrgContextBarProps = {\n /**\n * Apps inject their router's Link primitive — used for the\n * crumb's brand-side anchor. The dropdown's onSelect calls\n * `onNavigate(href)` so apps can either `router.visit(href)`\n * (Inertia) or `<Link>`-style navigate.\n */\n LinkComponent: LinkComponent;\n\n /**\n * Called when the user picks a different org from the dropdown.\n * Receives an absolute path with the slug substituted in. Apps\n * trigger their router.\n *\n * Path-rewrite rule (Cbox suite convention):\n * /org/<old-slug>/foo/bar → /org/<new-slug>/foo/bar\n * /something-else → /org/<new-slug>\n *\n * Apps that aren't org-scoped (notifications) typically don't\n * render this component at all — but if they do, switching\n * lands on the new org's `/org/<slug>` root and lets the host\n * sort the rest out.\n */\n onNavigate: (href: string) => void;\n};\n\n/**\n * Standard Cbox topbar org switcher. One crumb, one dropdown,\n * URL-driven (no POST, no session pin). Mirrors id's pattern 1:1\n * so the chrome reads identically across the suite — that's the\n * whole reason it's here, not in each app.\n *\n * Apps render this in the `topbarCentre` slot of `CboxAppShell`.\n * Hides itself when there's no current org (eg pre-auth, or\n * non-org-scoped surfaces).\n */\nexport function CboxOrgContextBar({\n LinkComponent,\n onNavigate,\n}: CboxOrgContextBarProps) {\n const { t } = useCboxLocalization();\n const cboxId = useCboxIdOptional();\n\n if (cboxId === null) {\n return null;\n }\n\n const { currentOrganization, organizations, urls } = cboxId;\n const activeOrg = currentOrganization ?? organizations[0] ?? null;\n\n if (activeOrg === null) {\n return null;\n }\n\n const idBase = urls.idBaseUrl.replace(/\\/$/, '');\n\n const items: ContextItem[] = organizations.map((org) => ({\n id: org.slug,\n label: org.name,\n avatar: { initials: deriveInitials(org.name) },\n current: org.slug === activeOrg.slug,\n // Cogwheel shortcut → id's org-settings page. Cross-app\n // deep link; id handles the auth and rendering.\n settingsHref: `${idBase}/org/${org.slug}/settings`,\n settingsAriaLabel: t('Settings for {name}', {name: org.name}),\n }));\n\n const onSelect = (slug: string) => {\n const org = organizations.find((o) => o.slug === slug);\n if (org === undefined) return;\n\n const path = typeof window !== 'undefined' ? window.location.pathname : '/';\n const next = path.startsWith('/org/')\n ? path.replace(/^\\/org\\/[^/]+/, `/org/${org.slug}`)\n : `/org/${org.slug}`;\n const search =\n typeof window !== 'undefined' ? window.location.search : '';\n\n onNavigate(next + search);\n };\n\n return (\n <ContextBar\n LinkComponent={LinkComponent}\n crumbs={[\n {\n id: 'org',\n label: activeOrg.name,\n avatar: { initials: deriveInitials(activeOrg.name) },\n items,\n onSelect,\n footerLink: {\n label: t('Manage organizations'),\n href: `${idBase}/settings/organizations`,\n },\n ariaLabel: t('Switch organization'),\n },\n ]}\n />\n );\n}\n\nfunction deriveInitials(label: string): string {\n const parts = label.trim().split(/\\s+/);\n if (parts.length >= 2) {\n return ((parts[0]?.[0] ?? '') + (parts[1]?.[0] ?? '')).toUpperCase();\n }\n\n return (label.slice(0, 2) || '?').toUpperCase();\n}\n","import { useCboxLocalization } from '../context/localization';\nimport {\n useEffect,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { useCboxId, type CboxOrganization } from '../context/cbox-id';\nimport { cn } from '../utils/cn';\n\ntype Props = {\n /**\n * Optional renderer override for the trigger so apps can match\n * their topbar style (filled button vs ghost vs icon-only).\n */\n Trigger?: ComponentType<{\n organization: CboxOrganization | null;\n onClick: () => void;\n open: boolean;\n }>;\n className?: string;\n};\n\n/**\n * Dropdown that surfaces the user's orgs and dispatches the picked\n * one through `onSwitchOrganization`. Reads everything else from\n * CboxIdProvider so the same component works in id, cortex, atlas —\n * no per-app data wiring.\n *\n * Includes typeahead — auto-focus on open, filters by name as the\n * user types, arrow-key navigation, Enter to switch, Escape to close.\n */\nexport function OrgSwitcher({ Trigger = DefaultTrigger, className }: Props) {\n const { t } = useCboxLocalization();\n const { currentOrganization, organizations, onSwitchOrganization } = useCboxId();\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [activeIndex, setActiveIndex] = useState(0);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const searchRef = useRef<HTMLInputElement | null>(null);\n\n // Reset transient state every open. requestAnimationFrame waits\n // for the input to mount before focusing it.\n useEffect(() => {\n if (open) {\n setQuery('');\n setActiveIndex(0);\n const id = requestAnimationFrame(() => searchRef.current?.focus());\n return () => cancelAnimationFrame(id);\n }\n }, [open]);\n\n // Click-outside + Escape. Matches AppSwitcher / every other Cbox\n // top-bar control.\n useEffect(() => {\n if (!open) {\n return;\n }\n\n function onPointerDown(event: PointerEvent): void {\n if (\n containerRef.current !== null &&\n !containerRef.current.contains(event.target as Node)\n ) {\n setOpen(false);\n }\n }\n\n function onKey(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n setOpen(false);\n }\n }\n\n window.addEventListener('pointerdown', onPointerDown);\n window.addEventListener('keydown', onKey);\n\n return () => {\n window.removeEventListener('pointerdown', onPointerDown);\n window.removeEventListener('keydown', onKey);\n };\n }, [open]);\n\n const filtered = useMemo(() => {\n const q = query.trim().toLowerCase();\n if (q === '') {\n return organizations;\n }\n return organizations.filter(\n (org) =>\n org.name.toLowerCase().includes(q) ||\n org.slug.toLowerCase().includes(q),\n );\n }, [organizations, query]);\n\n // Clamp activeIndex when the filter shrinks the list.\n useEffect(() => {\n if (activeIndex >= filtered.length) {\n setActiveIndex(0);\n }\n }, [filtered.length, activeIndex]);\n\n const onPick = (org: CboxOrganization) => {\n setOpen(false);\n if (onSwitchOrganization) {\n onSwitchOrganization(org);\n return;\n }\n // No fallback. Org switching is a URL navigation — apps own\n // the destination path because it's per-app (id has /dashboard,\n // webhooks has /endpoints, etc.). Failing loud here is better\n // than silently doing nothing.\n if (typeof console !== 'undefined') {\n console.warn(\n '[cbox-ui] OrgSwitcher: no onSwitchOrganization handler provided. Apps must wire one (router.visit) — there is no server endpoint to fall back to.',\n );\n }\n };\n\n function onSearchKeyDown(event: ReactKeyboardEvent<HTMLInputElement>): void {\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n if (filtered.length === 0) {\n return;\n }\n setActiveIndex((i) => (i + 1) % filtered.length);\n return;\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n if (filtered.length === 0) {\n return;\n }\n setActiveIndex((i) => (i - 1 + filtered.length) % filtered.length);\n return;\n }\n if (event.key === 'Enter') {\n event.preventDefault();\n const target = filtered[activeIndex];\n if (target !== undefined) {\n onPick(target);\n }\n }\n }\n\n return (\n <div ref={containerRef} className={cn('relative', className)}>\n <Trigger\n organization={currentOrganization}\n onClick={() => setOpen((v) => !v)}\n open={open}\n />\n {open ? (\n <div\n role=\"dialog\"\n aria-label={t(\"Switch organization\")}\n className=\"absolute left-0 top-full z-50 mt-1 w-64 overflow-hidden rounded-md border border-border bg-popover shadow-md\"\n >\n <div className=\"border-b border-border/70 px-3 pt-2 pb-1\">\n <p className=\"text-mono text-[10px] font-semibold tracking-[0.18em] text-muted-foreground uppercase\">\n {t(\"Switch organization\")}</p>\n </div>\n\n <div className=\"border-b border-border/70 px-2 py-1.5\">\n <div className=\"flex items-center gap-2 rounded-md px-2 py-1 focus-within:bg-secondary\">\n <SearchIcon />\n <input\n ref={searchRef}\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={onSearchKeyDown}\n placeholder={t(\"Filter…\")}\n aria-label={t(\"Filter organizations\")}\n autoComplete=\"off\"\n spellCheck={false}\n className=\"w-full bg-transparent text-sm text-foreground placeholder:text-muted-foreground/60 focus:outline-none\"\n />\n </div>\n </div>\n\n <div className=\"max-h-[50vh] overflow-y-auto p-1\">\n {filtered.length === 0 ? (\n <p className=\"px-3 py-6 text-center text-[12px] text-muted-foreground\">\n {t('No organizations match “{query}”', {query})}\n </p>\n ) : (\n <ul className=\"space-y-0.5\">\n {filtered.map((org, index) => {\n const active = currentOrganization?.id === org.id;\n const highlighted = index === activeIndex;\n return (\n <li key={org.id}>\n <button\n type=\"button\"\n onMouseEnter={() => setActiveIndex(index)}\n onClick={() => onPick(org)}\n className={cn(\n 'flex w-full items-center justify-between rounded-sm px-2 py-1.5 text-left text-sm transition-colors',\n active\n ? 'bg-accent-soft text-foreground'\n : highlighted\n ? 'bg-secondary'\n : 'hover:bg-secondary',\n )}\n >\n <span className=\"truncate\">{org.name}</span>\n {active ? (\n <span className=\"text-mono text-[10px] text-muted-foreground\">\n {t(\"current\")}</span>\n ) : null}\n </button>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\nconst DefaultTrigger: ComponentType<{\n organization: CboxOrganization | null;\n onClick: () => void;\n open: boolean;\n}> = ({ organization, onClick }) => (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"flex items-center gap-2 rounded-md border border-border bg-card px-3 py-1.5 text-sm font-medium text-foreground hover:bg-secondary\"\n >\n <span className=\"truncate max-w-[180px]\">\n {organization?.name ?? 'Pick an organization'}\n </span>\n <Chevron />\n </button>\n);\n\nfunction Chevron(): ReactNode {\n return (\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden\n >\n <path\n d=\"M2 4l3 3 3-3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction SearchIcon(): ReactNode {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className=\"shrink-0 text-muted-foreground\"\n >\n <circle cx=\"5.25\" cy=\"5.25\" r=\"3.25\" />\n <path d=\"M8 8l2 2\" />\n </svg>\n );\n}\n","import type { ReactNode } from 'react';\nimport { AppSwitcher } from '../components/app-switcher';\nimport { NotificationsBell } from '../components/notifications-bell';\nimport { OrgSwitcher } from '../components/org-switcher';\nimport { UserMenu } from '../components/user-menu';\nimport { cn } from '../utils/cn';\n\ntype Props = {\n /**\n * App branding rendered on the left — typically a small logo +\n * the app name. Rendered inside a fixed-height bar so keep it\n * visually compact (24-32px tall content).\n */\n brand: ReactNode;\n /** Anything between brand and the right cluster — search, breadcrumbs, etc. */\n centre?: ReactNode;\n /**\n * Override slots if an app needs a different control mix in the\n * right cluster. Default: AppLauncher → NotificationsBell → UserMenu.\n */\n rightCluster?: ReactNode;\n /**\n * Whether to show the org switcher next to the brand. Hide on\n * non-org-scoped surfaces (eg id account-settings).\n */\n showOrgSwitcher?: boolean;\n className?: string;\n};\n\n/**\n * Standard Cbox top bar. Same shell across every app — keeps cross-app\n * navigation (launcher, account, notifications) muscle-memory-stable.\n */\nexport function TopBar({\n brand,\n centre,\n rightCluster,\n showOrgSwitcher = true,\n className,\n}: Props) {\n return (\n <header\n className={cn(\n 'flex h-14 shrink-0 items-center gap-3 border-b border-border bg-background px-4',\n className,\n )}\n >\n <div className=\"flex items-center gap-3\">\n {brand}\n <AppSwitcher />\n {showOrgSwitcher ? <OrgSwitcher /> : null}\n </div>\n <div className=\"min-w-0 flex-1\">{centre}</div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {rightCluster ?? (\n <>\n <NotificationsBell />\n <UserMenu />\n </>\n )}\n </div>\n </header>\n );\n}\n","import { useCboxLocalization } from '../context/localization';\nimport { useEffect, useRef, useState, type ReactNode } from 'react';\nimport { useCboxIdOptional, type CboxAppLink } from '../context/cbox-id';\nimport { cn } from '../utils/cn';\nimport { CboxAppIcon, secureIconUrl } from './app-icon';\n\ntype AppLauncherProps = {\n className?: string;\n /**\n * Called when the user clicks an app they're not entitled to. Use\n * this to open an upgrade flow / Stripe checkout / Intercom message.\n * If unset, locked tiles fall through to a static \"Add to plan\"\n * affordance — the click is a no-op so we never silently ship the\n * user to a broken paywall.\n */\n onLockedAppClick?: (app: CboxAppLink) => void;\n};\n\n/**\n * Cross-app launcher — the 9-dot button in the top bar.\n *\n * Renders the Cbox suite as a vertical list with status per app:\n * - entitled apps → full-colour tile, click navigates with ?org=<slug>\n * - locked apps → greyed out + lock badge, opens upgrade flow if the\n * host app provides one (otherwise inert click)\n * - coming-soon → greyed out + \"soon\" badge, never clickable\n * - the current app → highlighted ring on its monogram tile\n *\n * Row layout (vs. the old 3-col grid) gives us room for descriptions\n * and status badges, which makes the entitlement signal readable at a\n * glance instead of needing a tooltip.\n */\nexport function AppLauncher({ className, onLockedAppClick }: AppLauncherProps) {\n const { t } = useCboxLocalization();\n // Soft-read: if a layout above us forgot to mount <CboxIdProvider>\n // (e.g. an admin shell that doesn't expose cross-app context yet),\n // render nothing instead of crashing the chrome. Throwing here used\n // to take the whole top bar down for any single missing-provider\n // bug downstream.\n const cboxId = useCboxIdOptional();\n const [open, setOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n // Click-outside + Escape close. Mirrors the standard popover\n // contract every other Cbox top-bar control follows.\n useEffect(() => {\n if (! open) {\n return;\n }\n\n function onPointerDown(event: PointerEvent): void {\n if (\n containerRef.current !== null &&\n ! containerRef.current.contains(event.target as Node)\n ) {\n setOpen(false);\n }\n }\n\n function onKey(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n setOpen(false);\n }\n }\n\n window.addEventListener('pointerdown', onPointerDown);\n window.addEventListener('keydown', onKey);\n\n return () => {\n window.removeEventListener('pointerdown', onPointerDown);\n window.removeEventListener('keydown', onKey);\n };\n }, [open]);\n\n // No provider above us, or no apps to render — just don't show the\n // launcher button at all. The chrome stays clean.\n if (cboxId === null || cboxId.apps.length === 0) {\n return null;\n }\n\n const apps = cboxId.apps;\n\n // Carry the active org slug across apps so users don't have to\n // re-pick after switching. The destination URL embeds the slug\n // directly (`<app>/org/<slug>`) — every Cbox app exposes a\n // canonical `GET /org/{slug}` route that redirects to its own\n // default landing sub-page. URL is the source of truth.\n const orgSlug = cboxId.currentOrganization?.slug;\n\n // Split entitled vs. locked so the \"available\" set lands at the\n // top of the list and the upgrade-able set sits in its own section\n // below. Coming-soon apps go with the locked set — they share the\n // \"not actionable now\" visual treatment.\n const entitled: CboxAppLink[] = [];\n const locked: CboxAppLink[] = [];\n for (const app of apps) {\n const isEntitled = app.entitled !== false && app.comingSoon !== true;\n (isEntitled ? entitled : locked).push(app);\n }\n\n return (\n <div ref={containerRef} className={cn('relative', className)}>\n <button\n type=\"button\"\n aria-label={t(\"Open app launcher\")}\n aria-expanded={open}\n onClick={() => setOpen((v) => !v)}\n className={cn(\n 'flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-secondary hover:text-foreground',\n open && 'bg-secondary text-foreground',\n )}\n >\n <Grid />\n </button>\n {open ? (\n <div\n role=\"dialog\"\n aria-label={t(\"Cbox app launcher\")}\n // Cap width at viewport-minus-gutter on narrow\n // screens so the panel stays inside the visible\n // area on mobile (390px viewport, 320px panel\n // would overflow). `right-0` anchors at the\n // launcher button.\n className=\"absolute right-0 top-full z-50 mt-1.5 w-[min(20rem,calc(100vw-1.5rem))] overflow-hidden rounded-lg border border-border bg-popover shadow-lg\"\n >\n <div className=\"border-b border-border/70 px-3 py-2.5\">\n <p className=\"text-mono text-[10px] font-semibold tracking-[0.18em] text-muted-foreground uppercase\">\n {t(\"Cbox suite\")}</p>\n </div>\n\n <div className=\"max-h-[60vh] overflow-y-auto py-1\">\n {entitled.length > 0 ? (\n <ul className=\"space-y-0.5 p-1\">\n {entitled.map((app) => (\n <AppRow\n key={app.key}\n app={app}\n orgSlug={orgSlug}\n onLockedAppClick={onLockedAppClick}\n />\n ))}\n </ul>\n ) : null}\n\n {locked.length > 0 ? (\n <>\n {entitled.length > 0 ? (\n <div className=\"my-1 border-t border-border/50\" />\n ) : null}\n <p className=\"text-mono px-3 py-1.5 text-[10px] font-semibold tracking-[0.18em] text-muted-foreground/70 uppercase\">\n {t(\"Available\")}</p>\n <ul className=\"space-y-0.5 p-1 pt-0\">\n {locked.map((app) => (\n <AppRow\n key={app.key}\n app={app}\n orgSlug={orgSlug}\n onLockedAppClick={onLockedAppClick}\n />\n ))}\n </ul>\n </>\n ) : null}\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\ntype AppRowProps = {\n app: CboxAppLink;\n orgSlug: string | undefined;\n onLockedAppClick: AppLauncherProps['onLockedAppClick'];\n};\n\nfunction AppRow({ app, orgSlug, onLockedAppClick }: AppRowProps): ReactNode {\n const { t } = useCboxLocalization();\n const isComingSoon = app.comingSoon === true;\n const isLocked = app.entitled === false || isComingSoon;\n\n const monogram = app.monogram ?? app.name.slice(0, 1).toUpperCase();\n const accent = app.accentColor;\n // Apply the per-app accent colour to the monogram chip so each\n // app keeps its visual identity. Skip when an iconUrl is set —\n // the icon supplies its own colour.\n const tileStyle =\n accent !== undefined && secureIconUrl(app.iconUrl) === null\n ? { backgroundColor: accent, color: '#fff', borderColor: accent }\n : undefined;\n\n // Land directly on `<app>/org/<slug>` so the destination URL is\n // canonical from the first hop — no `?org=` query, no extra\n // redirect. Each Cbox app's `/org/{slug}` route picks its default\n // landing within that org. Skip on the current-app tile (the\n // user is already there).\n const href =\n orgSlug !== undefined && app.current !== true\n ? buildOrgUrl(app.url, orgSlug)\n : app.url;\n\n const tile = (\n <div\n style={tileStyle}\n className={cn(\n 'flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-card text-[13px] font-semibold text-foreground',\n app.current && 'ring-2 ring-accent-edge ring-offset-1 ring-offset-popover',\n isLocked && 'opacity-60 grayscale',\n )}\n >\n <CboxAppIcon name={app.name} iconUrl={app.iconUrl} iconDarkUrl={app.iconDarkUrl} className=\"h-5 w-5\" fallback={<span>{monogram}</span>} />\n </div>\n );\n\n const body = (\n <div className=\"flex min-w-0 flex-1 flex-col leading-tight\">\n <div className=\"flex items-center gap-2\">\n <span\n className={cn(\n 'truncate text-sm font-medium text-foreground',\n isLocked && 'text-muted-foreground',\n )}\n >\n {app.name}\n </span>\n {app.current ? (\n <span className=\"text-mono shrink-0 rounded-sm border border-accent-edge/40 bg-accent-soft px-1 text-[9px] font-semibold tracking-[0.14em] text-accent uppercase\">\n {t(\"current\")}</span>\n ) : null}\n </div>\n {app.description ? (\n <span\n className={cn(\n 'truncate text-[11px]',\n isLocked\n ? 'text-muted-foreground/70'\n : 'text-muted-foreground',\n )}\n >\n {app.description}\n </span>\n ) : null}\n </div>\n );\n\n const trailing = isComingSoon ? (\n <span className=\"text-mono shrink-0 rounded-sm border border-border bg-secondary px-1.5 py-0.5 text-[9px] font-semibold tracking-[0.14em] text-muted-foreground uppercase\">\n {t(\"soon\")}</span>\n ) : isLocked ? (\n <span className=\"flex shrink-0 items-center gap-1 text-[10px] font-medium text-muted-foreground\">\n <Lock />\n {t(\"Add\")}</span>\n ) : null;\n\n if (isComingSoon) {\n return (\n <li>\n <div\n aria-disabled\n className=\"flex w-full cursor-not-allowed items-center gap-3 rounded-md px-2.5 py-2\"\n title={t('{name} — coming soon', {name: app.name})}\n >\n {tile}\n {body}\n {trailing}\n </div>\n </li>\n );\n }\n\n if (isLocked) {\n return (\n <li>\n <button\n type=\"button\"\n onClick={() => onLockedAppClick?.(app)}\n className={cn(\n 'group flex w-full items-center gap-3 rounded-md px-2.5 py-2 text-left transition-colors',\n onLockedAppClick !== undefined\n ? 'hover:bg-secondary'\n : 'cursor-default',\n )}\n title={t('Add {name} to your plan', {name: app.name})}\n >\n {tile}\n {body}\n {trailing}\n </button>\n </li>\n );\n }\n\n return (\n <li>\n <a\n href={href}\n className={cn(\n 'group flex w-full items-center gap-3 rounded-md px-2.5 py-2 transition-colors hover:bg-secondary',\n app.current && 'bg-accent-soft hover:bg-accent-soft',\n )}\n >\n {tile}\n {body}\n {trailing}\n </a>\n </li>\n );\n}\n\nfunction buildOrgUrl(url: string, orgSlug: string): string {\n if (url === '' || orgSlug === '') {\n return url;\n }\n try {\n // URL constructor strips trailing slash on origin assembly,\n // preserving any existing path/query/fragment from the app's\n // configured base. We override the path to `/org/<slug>` so\n // every app lands on its canonical org-scoped entry point.\n const u = new URL(url);\n u.pathname = `/org/${encodeURIComponent(orgSlug)}`;\n return u.toString();\n } catch {\n return `${url.replace(/\\/$/, '')}/org/${encodeURIComponent(orgSlug)}`;\n }\n}\n\nfunction Grid(): ReactNode {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" aria-hidden>\n {[1, 8, 15].flatMap((y) =>\n [1, 8, 15].map((x) => (\n <rect\n key={`${x}-${y}`}\n x={x}\n y={y}\n width=\"2.5\"\n height=\"2.5\"\n rx=\"0.6\"\n fill=\"currentColor\"\n />\n )),\n )}\n </svg>\n );\n}\n\nfunction Lock(): ReactNode {\n return (\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n >\n <rect x=\"2.5\" y=\"5\" width=\"7\" height=\"5\" rx=\"1\" />\n <path d=\"M4 5V3.5a2 2 0 1 1 4 0V5\" />\n </svg>\n );\n}\n","import { createElement } from 'react';\nimport { useCboxLocalization } from '../context/localization';\nimport { defineCboxAppSwitcher } from '../app-switcher/elements';\nimport type { CboxThemeMode } from '../app-switcher/theme';\n\nexport {\n authorizeHref,\n parseAppCatalog,\n signInTarget,\n type CboxAppCatalogState,\n type CboxCatalogApp,\n} from '../app-switcher/catalog';\n\ndefineCboxAppSwitcher();\n\nexport type CboxAppCatalogProps = {\n /**\n * Same-origin URL the host serves the person's app catalog from (a proxy of Cbox ID's\n * catalog, authorized for the signed-in person). `null` renders the control disabled, so the\n * chrome keeps its shape on pages without an organization.\n */\n endpoint: string | null;\n /** The app key of this app; its tile is marked current. */\n currentAppKey: string;\n /**\n * How the theme is read. Default `auto`: `.dark`/`[data-theme]` on the root, else the\n * system scheme. `class` for a host whose tokens only turn dark under `.dark`.\n */\n theme?: CboxThemeMode;\n className?: string;\n};\n\n/**\n * The Switch-app control. It renders `<cbox-app-switcher>` from `@cboxdk/cbox-ui/app-switcher`,\n * the same element every Blade app uses, so React and Blade apps draw one identical control:\n * the live catalog from the host's endpoint, Cbox ID's light and dark icons, a quiet retry when\n * the catalog cannot be loaded, and straight to sign-in when the host answers `401 { signin_url }`.\n */\nexport function CboxAppCatalog({ endpoint, currentAppKey, theme, className }: CboxAppCatalogProps) {\n const { t } = useCboxLocalization();\n const labels = JSON.stringify({\n title: t('Switch app'),\n loading: t('Loading apps…'),\n empty: t('No apps available'),\n unavailable: t('Apps could not be loaded.'),\n });\n\n return createElement('cbox-app-switcher', {\n endpoint: endpoint ?? '',\n current: currentAppKey,\n labels,\n theme,\n className,\n });\n}\n","import { useCboxLocalization } from '../context/localization';\nimport {\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { cn } from '../utils/cn';\n\n/**\n * Combobox — the canonical select replacement for the Cbox suite.\n *\n * **Native `<select>` is forbidden.** It can't host avatars, can't\n * be searched, can't be styled into the design system, and on mobile\n * it pops the OS picker which breaks the visual contract. Combobox\n * solves all of that with a single primitive:\n *\n * - Type-ahead filter on the search input (case-insensitive,\n * matches label + secondary).\n * - Keyboard contract: ArrowDown / ArrowUp move highlight, Enter\n * selects, Escape closes, Home/End jump to bounds, Tab exits.\n * - Optional avatar per option, optional secondary line.\n * - Optional grouped sections with mono-tracked headers.\n * - Optional footer link (eg \"+ New environment\").\n * - Empty-state copy when the filter excludes everything.\n *\n * Two modes:\n * - Value mode (default): `value` + `onChange` — Combobox manages\n * selection state, host treats it like a controlled input.\n * - Navigation mode: items carry `href` and `LinkComponent` is\n * supplied — clicking an item is a Link visit, not a state mutation.\n *\n * Both modes are URL/router-friendly. Value mode is for filter\n * controls; navigation mode is for context switchers (the Combobox\n * inside a ContextBar crumb is exactly this).\n */\n\nexport type ComboboxOption = {\n /** Stable key. Used as React key and for active-state matching. */\n value: string;\n /** Visible label — primary line. */\n label: string;\n /** Optional secondary line — slug, role, environment, hint. */\n secondary?: string;\n /** Optional leading icon (lucide-style — h-3.5 w-3.5). */\n icon?: ComponentType<{ className?: string; strokeWidth?: number }>;\n /**\n * Optional avatar — image src OR `{initials,accent}` chip. When\n * the option carries an avatar, the trigger renders one too if\n * the option is the active selection.\n */\n avatar?: ComboboxAvatar;\n /** Disable selection of this option. */\n disabled?: boolean;\n /**\n * Hidden text added to the searchable haystack. Useful for\n * synonyms (\"United States\" should match \"USA\", \"us\"). Not\n * displayed.\n */\n keywords?: string[];\n /**\n * Optional href for navigation mode. When set + LinkComponent is\n * supplied, clicking the option navigates instead of mutating\n * value state.\n */\n href?: string;\n};\n\nexport type ComboboxGroup = {\n /** Group heading — uppercase mono-tracked. Empty string hides the heading. */\n label: string;\n options: ComboboxOption[];\n};\n\nexport type ComboboxAvatar = {\n initials?: string;\n accent?: string;\n src?: string;\n};\n\ntype LinkComp = ComponentType<{\n href: string;\n prefetch?: boolean;\n className?: string;\n children: ReactNode;\n}>;\n\ntype CommonProps = {\n /** Options or grouped options. Pass an array of either shape. */\n items: ComboboxOption[] | ComboboxGroup[];\n /** Placeholder shown in the trigger when no value is selected. */\n placeholder?: string;\n /** Search input placeholder. */\n searchPlaceholder?: string;\n /** Empty-state copy when the filter matches nothing. */\n emptyText?: string;\n /** Optional footer link below the option list (\"+ New X\"). */\n footerLink?: {\n label: string;\n href: string;\n };\n /** Disable the entire combobox (greyed-out trigger). */\n disabled?: boolean;\n /** Required-field marker on the trigger. */\n required?: boolean;\n /** Aria-label for the trigger. */\n ariaLabel?: string;\n /** Trigger className override. Doesn't change padding/height. */\n triggerClassName?: string;\n /** Dropdown panel className override. */\n panelClassName?: string;\n /** Width policy for the trigger. Defaults to `auto` (intrinsic). */\n triggerWidth?: 'auto' | 'full';\n /**\n * Framework Link adapter for navigation-mode items + footer link.\n * If unset, navigation falls back to plain `<a>`.\n */\n LinkComponent?: LinkComp;\n /** ID for the trigger button (associate with a <Label htmlFor>). */\n id?: string;\n /** className for the outer wrapper. */\n className?: string;\n};\n\ntype ValueModeProps = CommonProps & {\n /** Selected value or `null` when nothing is selected. */\n value: string | null;\n /** Called with the option's `value` when the user picks one. */\n onChange: (value: string) => void;\n};\n\ntype NavModeProps = CommonProps & {\n /** Active value for highlight purposes. Optional in nav mode. */\n value?: string | null;\n /**\n * Omitted in nav mode. Items must carry `href`, and a\n * LinkComponent must be supplied for SPA navigation.\n */\n onChange?: never;\n};\n\nexport type ComboboxProps = ValueModeProps | NavModeProps;\n\nexport function Combobox(props: ComboboxProps) {\n const { t } = useCboxLocalization();\n const {\n items,\n placeholder = t('Select…'),\n searchPlaceholder = t('Search…'),\n emptyText = t('Nothing matches.'),\n footerLink,\n disabled = false,\n required = false,\n ariaLabel,\n triggerClassName,\n panelClassName,\n triggerWidth = 'auto',\n LinkComponent,\n id: idProp,\n className,\n value,\n } = props;\n\n const groups = useMemo(() => normaliseGroups(items), [items]);\n const flatOptions = useMemo(\n () => groups.flatMap((g) => g.options),\n [groups],\n );\n const activeOption = useMemo(\n () => (value !== null && value !== undefined\n ? flatOptions.find((opt) => opt.value === value)\n : null),\n [flatOptions, value],\n );\n\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [highlightIndex, setHighlightIndex] = useState(-1);\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const listRef = useRef<HTMLUListElement | null>(null);\n const reactId = useId();\n const id = idProp ?? reactId;\n const listId = `${id}-listbox`;\n\n // Filtered groups (preserves group structure for headings).\n const filteredGroups = useMemo(\n () => filterGroups(groups, query),\n [groups, query],\n );\n const filteredFlat = useMemo(\n () => filteredGroups.flatMap((g) => g.options),\n [filteredGroups],\n );\n\n // Reset highlight when filter changes — first non-disabled option.\n useEffect(() => {\n if (! open) return;\n const firstEnabled = filteredFlat.findIndex(\n (opt) => opt.disabled !== true,\n );\n setHighlightIndex(firstEnabled);\n }, [filteredFlat, open]);\n\n // Auto-focus the search input when the menu opens.\n useEffect(() => {\n if (open) {\n // Run on the next tick so the input is mounted.\n const id = window.setTimeout(() => inputRef.current?.focus(), 0);\n return () => window.clearTimeout(id);\n }\n setQuery('');\n\n return undefined;\n }, [open]);\n\n // Click-outside close.\n useEffect(() => {\n if (! open) return;\n\n function onPointerDown(event: PointerEvent): void {\n if (\n containerRef.current !== null &&\n ! containerRef.current.contains(event.target as Node)\n ) {\n setOpen(false);\n }\n }\n\n window.addEventListener('pointerdown', onPointerDown);\n return () => window.removeEventListener('pointerdown', onPointerDown);\n }, [open]);\n\n const onSelectOption = useCallback(\n (opt: ComboboxOption) => {\n if (opt.disabled === true) return;\n\n if (\n opt.href !== undefined &&\n LinkComponent !== undefined &&\n props.onChange === undefined\n ) {\n // Navigation mode — Link handles it; just close.\n setOpen(false);\n return;\n }\n\n if (props.onChange !== undefined) {\n props.onChange(opt.value);\n }\n setOpen(false);\n },\n [LinkComponent, props],\n );\n\n const onKeyDown = useCallback(\n (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n setHighlightIndex((current) =>\n nextEnabledIndex(filteredFlat, current, 1),\n );\n return;\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n setHighlightIndex((current) =>\n nextEnabledIndex(filteredFlat, current, -1),\n );\n return;\n }\n if (event.key === 'Home') {\n event.preventDefault();\n setHighlightIndex(\n filteredFlat.findIndex((o) => o.disabled !== true),\n );\n return;\n }\n if (event.key === 'End') {\n event.preventDefault();\n let last = -1;\n for (let i = 0; i < filteredFlat.length; i++) {\n const opt = filteredFlat[i];\n if (opt !== undefined && opt.disabled !== true) {\n last = i;\n }\n }\n setHighlightIndex(last);\n return;\n }\n if (event.key === 'Enter') {\n if (highlightIndex >= 0) {\n event.preventDefault();\n const opt = filteredFlat[highlightIndex];\n if (opt !== undefined) {\n onSelectOption(opt);\n }\n }\n return;\n }\n if (event.key === 'Escape') {\n event.preventDefault();\n setOpen(false);\n return;\n }\n if (event.key === 'Tab') {\n setOpen(false);\n return;\n }\n },\n [filteredFlat, highlightIndex, onSelectOption],\n );\n\n return (\n <div\n ref={containerRef}\n className={cn('relative', triggerWidth === 'full' && 'w-full', className)}\n >\n <button\n id={id}\n type=\"button\"\n role=\"combobox\"\n disabled={disabled}\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-controls={listId}\n aria-required={required}\n aria-label={ariaLabel}\n onClick={() => setOpen((v) => ! v)}\n className={cn(\n 'flex h-9 items-center gap-2 rounded-md border border-input bg-card px-3 text-left text-[13px] text-foreground transition-colors',\n triggerWidth === 'full' && 'w-full',\n 'hover:border-border-strong focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none',\n open && 'border-border-strong ring-2 ring-ring/30',\n disabled && 'cursor-not-allowed opacity-60',\n triggerClassName,\n )}\n >\n {activeOption?.avatar !== undefined ? (\n <ComboboxAvatarChip\n avatar={activeOption.avatar}\n fallbackLabel={activeOption.label}\n />\n ) : activeOption?.icon !== undefined ? (\n <activeOption.icon\n className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\"\n strokeWidth={1.7}\n />\n ) : null}\n <span\n className={cn(\n 'flex-1 truncate',\n activeOption === null || activeOption === undefined\n ? 'text-muted-foreground'\n : '',\n )}\n >\n {activeOption !== null && activeOption !== undefined\n ? activeOption.label\n : placeholder}\n </span>\n <Chevron open={open} />\n </button>\n\n {open ? (\n <div\n className={cn(\n 'absolute left-0 right-0 top-full z-30 mt-1 overflow-hidden rounded-md border border-border bg-popover shadow-lg',\n panelClassName,\n )}\n >\n <div className=\"border-b border-border/60 px-2 py-2\">\n <div className=\"relative\">\n <SearchIcon />\n <input\n ref={inputRef}\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={onKeyDown}\n placeholder={searchPlaceholder}\n className=\"h-8 w-full rounded-sm border-0 bg-transparent pl-7 pr-2 text-[13px] outline-none placeholder:text-muted-foreground/70\"\n aria-controls={listId}\n aria-autocomplete=\"list\"\n aria-activedescendant={\n highlightIndex >= 0\n ? `${listId}-${highlightIndex}`\n : undefined\n }\n />\n </div>\n </div>\n\n <ul\n id={listId}\n ref={listRef}\n role=\"listbox\"\n className=\"max-h-72 overflow-y-auto py-1\"\n >\n {filteredFlat.length === 0 ? (\n <li className=\"px-3 py-6 text-center text-[13px] text-muted-foreground\">\n {emptyText}\n </li>\n ) : (\n filteredGroups.map((group, groupIndex) => (\n <ComboboxGroupRows\n key={group.label || `group-${groupIndex}`}\n group={group}\n flatOptions={filteredFlat}\n listId={listId}\n highlightIndex={highlightIndex}\n activeValue={value ?? null}\n LinkComponent={LinkComponent}\n onSelect={onSelectOption}\n onHover={(idx) => setHighlightIndex(idx)}\n />\n ))\n )}\n </ul>\n\n {footerLink !== undefined ? (\n <FooterLink\n label={footerLink.label}\n href={footerLink.href}\n LinkComponent={LinkComponent}\n onAfterClick={() => setOpen(false)}\n />\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction ComboboxGroupRows({\n group,\n flatOptions,\n listId,\n highlightIndex,\n activeValue,\n LinkComponent,\n onSelect,\n onHover,\n}: {\n group: ComboboxGroup;\n flatOptions: ComboboxOption[];\n listId: string;\n highlightIndex: number;\n activeValue: string | null;\n LinkComponent: LinkComp | undefined;\n onSelect: (opt: ComboboxOption) => void;\n onHover: (idx: number) => void;\n}) {\n if (group.options.length === 0) return null;\n\n return (\n <>\n {group.label !== '' ? (\n <li\n role=\"presentation\"\n className=\"text-mono px-3 pt-2 pb-1 text-[10px] font-semibold tracking-[0.18em] text-muted-foreground/70 uppercase\"\n >\n {group.label}\n </li>\n ) : null}\n {group.options.map((opt) => {\n const flatIndex = flatOptions.indexOf(opt);\n const isHighlighted = flatIndex === highlightIndex;\n const isActive = opt.value === activeValue;\n const inner = (\n <div className=\"flex w-full min-w-0 items-center gap-2.5 px-2.5 py-2\">\n {opt.avatar !== undefined ? (\n <ComboboxAvatarChip\n avatar={opt.avatar}\n fallbackLabel={opt.label}\n />\n ) : opt.icon !== undefined ? (\n <opt.icon\n className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\"\n strokeWidth={1.7}\n />\n ) : null}\n <div className=\"flex min-w-0 flex-1 flex-col leading-tight\">\n <span className=\"truncate text-[13px] font-medium text-foreground\">\n {opt.label}\n </span>\n {opt.secondary !== undefined ? (\n <span className=\"text-mono truncate text-[10px] text-muted-foreground\">\n {opt.secondary}\n </span>\n ) : null}\n </div>\n {isActive ? <Check /> : null}\n </div>\n );\n\n const className = cn(\n 'group block w-full rounded-sm transition-colors text-left',\n opt.disabled === true && 'cursor-not-allowed opacity-50',\n isHighlighted && opt.disabled !== true && 'bg-secondary',\n isActive && 'bg-accent-soft hover:bg-accent-soft/80',\n );\n\n if (\n opt.href !== undefined &&\n LinkComponent !== undefined\n ) {\n return (\n <li\n key={opt.value}\n id={`${listId}-${flatIndex}`}\n role=\"option\"\n aria-selected={isActive}\n aria-disabled={opt.disabled === true}\n onMouseEnter={() => onHover(flatIndex)}\n >\n <LinkComponent\n href={opt.href}\n prefetch\n className={className}\n >\n {inner}\n </LinkComponent>\n </li>\n );\n }\n\n return (\n <li\n key={opt.value}\n id={`${listId}-${flatIndex}`}\n role=\"option\"\n aria-selected={isActive}\n aria-disabled={opt.disabled === true}\n onMouseEnter={() => onHover(flatIndex)}\n >\n <button\n type=\"button\"\n disabled={opt.disabled === true}\n onClick={() => onSelect(opt)}\n className={className}\n >\n {inner}\n </button>\n </li>\n );\n })}\n </>\n );\n}\n\nfunction FooterLink({\n label,\n href,\n LinkComponent,\n onAfterClick,\n}: {\n label: string;\n href: string;\n LinkComponent: LinkComp | undefined;\n onAfterClick: () => void;\n}) {\n const className =\n 'flex items-center gap-2 border-t border-border/60 px-3 py-2.5 text-[13px] font-medium text-info transition-colors hover:bg-info-soft';\n\n if (LinkComponent !== undefined) {\n return (\n <LinkComponent\n href={href}\n prefetch\n className={className}\n >\n <Plus />\n <span>{label}</span>\n </LinkComponent>\n );\n }\n\n return (\n <a\n href={href}\n className={className}\n onClick={onAfterClick}\n >\n <Plus />\n <span>{label}</span>\n </a>\n );\n}\n\nfunction ComboboxAvatarChip({\n avatar,\n fallbackLabel,\n}: {\n avatar: ComboboxAvatar;\n fallbackLabel: string;\n}) {\n const initials = avatar.initials ?? deriveInitials(fallbackLabel);\n const style =\n avatar.src === undefined && avatar.accent !== undefined\n ? { backgroundColor: avatar.accent, color: '#fff' }\n : undefined;\n\n if (avatar.src !== undefined) {\n return (\n <img\n src={avatar.src}\n alt=\"\"\n className=\"h-5 w-5 shrink-0 rounded-sm bg-secondary object-cover\"\n loading=\"lazy\"\n />\n );\n }\n\n return (\n <span\n style={style}\n className={cn(\n 'flex h-5 w-5 shrink-0 items-center justify-center rounded-sm text-[9px] font-semibold tracking-tight',\n avatar.accent === undefined && 'bg-info-soft text-info',\n )}\n >\n {initials}\n </span>\n );\n}\n\nfunction deriveInitials(label: string): string {\n const parts = label.trim().split(/\\s+/);\n if (parts.length >= 2) {\n return ((parts[0]?.[0] ?? '') + (parts[1]?.[0] ?? '')).toUpperCase();\n }\n return (label.slice(0, 2) || '?').toUpperCase();\n}\n\nfunction normaliseGroups(\n items: ComboboxOption[] | ComboboxGroup[],\n): ComboboxGroup[] {\n if (items.length === 0) return [];\n const first = items[0];\n if (first !== undefined && 'options' in first) {\n return items as ComboboxGroup[];\n }\n return [{ label: '', options: items as ComboboxOption[] }];\n}\n\nfunction filterGroups(\n groups: ComboboxGroup[],\n query: string,\n): ComboboxGroup[] {\n const q = query.trim().toLowerCase();\n if (q === '') return groups;\n\n return groups\n .map((group) => ({\n label: group.label,\n options: group.options.filter((opt) => matchesQuery(opt, q)),\n }))\n .filter((group) => group.options.length > 0);\n}\n\nfunction matchesQuery(option: ComboboxOption, q: string): boolean {\n const haystack = [\n option.label,\n option.secondary ?? '',\n ...(option.keywords ?? []),\n ]\n .join(' ')\n .toLowerCase();\n\n return haystack.includes(q);\n}\n\nfunction nextEnabledIndex(\n options: ComboboxOption[],\n current: number,\n direction: 1 | -1,\n): number {\n const total = options.length;\n if (total === 0) return -1;\n\n let i = current;\n for (let step = 0; step < total; step++) {\n i = (i + direction + total) % total;\n const opt = options[i];\n if (opt !== undefined && opt.disabled !== true) {\n return i;\n }\n }\n return -1;\n}\n\nfunction Chevron({ open }: { open: boolean }) {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\n 'shrink-0 text-muted-foreground transition-transform duration-150',\n open && 'rotate-180',\n )}\n >\n <path d=\"m3.5 5.5 3.5 3.5 3.5-3.5\" />\n </svg>\n );\n}\n\nfunction Check() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"shrink-0 text-accent\"\n aria-hidden\n >\n <path d=\"m3 7.5 2.5 2.5L11 4.5\" />\n </svg>\n );\n}\n\nfunction Plus() {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"shrink-0\"\n aria-hidden\n >\n <path d=\"M6 2v8M2 6h8\" />\n </svg>\n );\n}\n\nfunction SearchIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"pointer-events-none absolute left-1.5 top-1/2 -translate-y-1/2 text-muted-foreground\"\n aria-hidden\n >\n <circle cx=\"6\" cy=\"6\" r=\"4.25\" />\n <path d=\"m11.5 11.5-2.5-2.5\" />\n </svg>\n );\n}\n","import type { ComponentProps, ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\n/**\n * Generic panel container — soft border, card surface, subtle shadow.\n * The default building block for every section on a page.\n */\nexport function DataPanel({\n className,\n children,\n ...rest\n}: ComponentProps<'section'>) {\n return (\n <section\n className={cn(\n 'rounded-lg border border-border bg-card text-card-foreground shadow-[0_1px_2px_rgb(0_0_0/0.04),0_4px_12px_rgb(0_0_0/0.03)]',\n className,\n )}\n {...rest}\n >\n {children}\n </section>\n );\n}\n\ntype SectionHeaderProps = {\n title: ReactNode;\n description?: ReactNode;\n actions?: ReactNode;\n className?: string;\n};\n\n/**\n * Section header that sits inside a DataPanel. Title in semibold sans,\n * optional muted lead, right-aligned actions slot.\n */\nexport function SectionHeader({\n title,\n description,\n actions,\n className,\n}: SectionHeaderProps) {\n return (\n <header\n className={cn(\n 'flex flex-col gap-3 border-b border-border px-5 py-4 sm:flex-row sm:items-center sm:justify-between',\n className,\n )}\n >\n <div className=\"space-y-1\">\n <h2 className=\"text-[15px] leading-none font-semibold text-foreground\">\n {title}\n </h2>\n {description ? (\n <p className=\"text-sm text-muted-foreground\">\n {description}\n </p>\n ) : null}\n </div>\n {actions ? (\n <div className=\"flex shrink-0 items-center gap-2\">\n {actions}\n </div>\n ) : null}\n </header>\n );\n}\n\n/**\n * Vertically padded content body for a DataPanel.\n */\nexport function PanelBody({\n className,\n children,\n ...rest\n}: ComponentProps<'div'>) {\n return (\n <div className={cn('px-5 py-4', className)} {...rest}>\n {children}\n </div>\n );\n}\n","export default function Heading({\n title,\n description,\n variant = 'default',\n}: {\n title: string;\n description?: string;\n variant?: 'default' | 'small';\n}) {\n return (\n <header className={variant === 'small' ? '' : 'mb-8 space-y-0.5'}>\n <h2\n className={\n variant === 'small'\n ? 'mb-0.5 text-base font-medium'\n : 'text-xl font-semibold tracking-tight'\n }\n >\n {title}\n </h2>\n {description && (\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n </header>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\ntype KeyValueProps = {\n label: string;\n children: ReactNode;\n /** Render the value in monospace. Default true — most values are technical. */\n mono?: boolean;\n className?: string;\n};\n\n/**\n * Two-column read-only field row. Label in mono caps, value in mono\n * by default (for slugs/IDs/dates) — pass `mono={false}` for prose.\n */\nexport function KeyValue({\n label,\n children,\n mono = true,\n className,\n}: KeyValueProps) {\n return (\n <div\n className={cn(\n 'grid grid-cols-[140px_1fr] items-baseline gap-x-6 border-b border-border py-3 last:border-b-0',\n className,\n )}\n >\n <dt className=\"text-eyebrow text-muted-foreground\">{label}</dt>\n <dd\n className={cn(\n 'text-sm break-all text-foreground',\n mono && 'text-mono text-[13px]',\n )}\n >\n {children}\n </dd>\n </div>\n );\n}\n\nexport function KeyValueList({\n children,\n className,\n}: {\n children: ReactNode;\n className?: string;\n}) {\n return <dl className={cn('px-6', className)}>{children}</dl>;\n}\n","import type { ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\ntype Props = {\n title: ReactNode;\n /**\n * Tiny uppercase lead-in above the title (sections, breadcrumb-light\n * disambiguation). Shown in mono-tracking caps so it reads as\n * meta, not as a competing heading.\n */\n eyebrow?: ReactNode;\n description?: ReactNode;\n actions?: ReactNode;\n className?: string;\n};\n\n/**\n * Title block at the top of every page. Big bold title, optional mono\n * eyebrow lead-in, muted lead, optional right-aligned actions slot.\n * Cortex-style — no italics, no brackets — so it carries across many\n * sibling apps cleanly.\n */\nexport function PageHeader({\n title,\n eyebrow,\n description,\n actions,\n className,\n}: Props) {\n return (\n <header\n className={cn(\n 'flex flex-col gap-3 sm:flex-row sm:items-end sm:justify-between',\n className,\n )}\n >\n <div className=\"space-y-1.5\">\n {eyebrow !== undefined ? (\n <p className=\"text-mono text-[10px] font-semibold tracking-[0.18em] text-muted-foreground uppercase\">\n {eyebrow}\n </p>\n ) : null}\n <h1 className=\"text-2xl leading-tight font-semibold tracking-tight text-foreground\">\n {title}\n </h1>\n {description ? (\n <p className=\"text-sm text-muted-foreground\">\n {description}\n </p>\n ) : null}\n </div>\n {actions ? (\n <div className=\"flex shrink-0 flex-wrap items-center gap-2\">\n {actions}\n </div>\n ) : null}\n </header>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\n/**\n * Width policy for `<PageShell>` — the single horizontal-rhythm\n * primitive every Cbox-family app shares. Pick the policy that\n * matches the page's content density:\n *\n * comfortable max-w-6xl (~1152px) — the default. Reading-friendly\n * column for prose-heavy pages: profile, security,\n * billing forms, audit row detail.\n * wide max-w-7xl (~1280px) — for tables / lists / member\n * rosters where horizontal real estate matters more\n * than reading line length. Audit log, member roster,\n * plan comparison.\n * full no max-width, only the standard horizontal padding —\n * for canvas-heavy pages (flow diagrams, dashboards)\n * where every pixel of viewport should be usable. Use\n * sparingly: raw width without column rules feels\n * chaotic on monitors past 1600px.\n * bleed no max-width AND no horizontal padding. Strict edge\n * -to-edge for content that draws its own padding (a\n * flow canvas with its own pan/zoom region, a fullscreen\n * iframe, an embedded preview environment).\n */\nexport type PageWidth = 'comfortable' | 'wide' | 'full' | 'bleed';\n\nconst widthClass: Record<PageWidth, string> = {\n comfortable: 'max-w-6xl px-6 py-8 lg:px-10 lg:py-10',\n wide: 'max-w-7xl px-6 py-8 lg:px-10 lg:py-10',\n full: 'max-w-none px-6 py-8 lg:px-10 lg:py-10',\n bleed: 'max-w-none p-0',\n};\n\ntype Props = {\n children: ReactNode;\n width?: PageWidth;\n className?: string;\n};\n\n/**\n * The page-level container. Picks one of four width policies (see\n * PageWidth) and applies the canonical Cbox padding / vertical\n * rhythm. Every authenticated page in every Cbox app composes\n * through this — directly via `<PageShell>` or, more usually, via\n * the per-app `<Page>` wrapper that combines PageShell + PageHeader\n * + PageTabs.\n *\n * Width policy is the only knob exposed here. Padding, max-width,\n * gutter, vertical spacing between blocks — those are baked in so\n * the eye never has to track horizontal jitter between sibling\n * pages.\n */\nexport function PageShell({\n children,\n width = 'comfortable',\n className,\n}: Props) {\n return (\n <div\n className={cn(\n 'mx-auto w-full space-y-6',\n widthClass[width],\n className,\n )}\n >\n {children}\n </div>\n );\n}\n","import { useCboxLocalization } from '../context/localization';\nimport {\n useEffect,\n useId,\n useRef,\n useState,\n type ComponentType,\n type ReactNode,\n} from 'react';\nimport { cn } from '../utils/cn';\n\n/**\n * Section navigation: every \"tab\" is a real page with its own URL.\n * No internal active-state, no callbacks — the host's router is the\n * source of truth. This is what makes deep links and hard refreshes\n * lossless: paste any URL, the right tab is active and the right\n * panel renders, with no client-side coordination required.\n *\n * Layout:\n * ≥ sm horizontal underline strip + optional `actions` slot to\n * the right; sticky just under the TopBar with a hairline\n * border-bottom and a backdrop-blur for the scroll-into\n * effect.\n * < sm dropdown showing the active tab + chevron; opens a panel\n * with the full list. Actions reflow below the trigger.\n *\n * The same primitive runs the section nav across every Cbox app. It\n * lives here so that the visual contract is single-sourced — there's\n * no way for a feature page to invent its own slightly-different tab\n * strip.\n */\n\nexport type PageTabSpec = {\n /** Display label. Truncates inline if it overflows the strip. */\n label: string;\n /** Absolute or app-relative href. The host router renders this. */\n href: string;\n /**\n * Optional leading icon. Constrained to the icon shape we use\n * everywhere — this is how cbox-ui keeps icon weights aligned\n * across primitives without depending on `lucide-react`.\n */\n icon?: ComponentType<{ className?: string; strokeWidth?: number }>;\n /**\n * Optional badge — a count, status pill, or \"new\" indicator. Use\n * sparingly; one badge in a row is signal, three is noise.\n */\n badge?: ReactNode;\n /**\n * Numeric count rendered inline. Convenience for the common\n * \"Members 12\" pattern; mutually exclusive with `badge` (badge\n * wins if both are set).\n */\n count?: number;\n /**\n * Match the current path by prefix. Use for hub pages whose\n * nested routes should still highlight the parent tab — e.g.\n * `/org/<slug>/members` highlights when on\n * `/org/<slug>/members/<id>`.\n */\n matchPrefix?: boolean;\n};\n\nexport type PageTabsProps = {\n items: PageTabSpec[];\n /** Current pathname, host-supplied. Drives active-state matching. */\n currentPath: string;\n /**\n * The framework's link component. Inertia consumers pass the\n * Inertia `Link`; TanStack Router consumers pass their typed\n * `Link`; plain anchors are the fallback. We never invent\n * navigation here.\n */\n LinkComponent?: ComponentType<{\n href: string;\n prefetch?: boolean;\n className?: string;\n children: ReactNode;\n 'aria-current'?: 'page' | undefined;\n }>;\n /**\n * Right-aligned slot on desktop, reflowed under the dropdown on\n * mobile. Use for primary section actions (Invite, Add token,\n * Export…) that belong to the section as a whole rather than the\n * specific tab. The slot is always reserved on desktop so pages\n * with and without actions keep identical row geometry — no\n * layout shift between sibling tabs.\n */\n actions?: ReactNode;\n className?: string;\n};\n\nconst DefaultLink: ComponentType<{\n href: string;\n className?: string;\n children: ReactNode;\n 'aria-current'?: 'page' | undefined;\n}> = ({ href, className, children, 'aria-current': ariaCurrent }) => (\n <a href={href} className={className} aria-current={ariaCurrent}>\n {children}\n </a>\n);\n\nexport function PageTabs({\n items,\n currentPath,\n LinkComponent = DefaultLink,\n actions,\n className,\n}: PageTabsProps) {\n const activeHref = resolveActiveHref(items, currentPath);\n\n return (\n <div\n data-component=\"page-tabs\"\n className={cn(\n // Card-style chrome — same border, radius, bg as DataPanel\n // so the tab strip reads as a peer of the content panels\n // beneath it instead of floating on the page background.\n // Width matches PageShell content; no sticky positioning.\n 'rounded-lg border border-border bg-card',\n className,\n )}\n >\n {/* Desktop: strip + actions on the same baseline. The strip's\n active underline anchors the visual baseline of the row;\n the actions slot is always rendered (even when empty) so\n pages with and without actions stay byte-identical in\n width and content alignment. */}\n <div className=\"hidden items-end gap-3 px-3 sm:flex\">\n <DesktopStrip\n items={items}\n activeHref={activeHref}\n LinkComponent={LinkComponent}\n />\n <div className=\"flex min-h-12 shrink-0 items-center gap-2\">\n {actions}\n </div>\n </div>\n\n {/* Mobile: dropdown + actions stacked underneath. */}\n <div className=\"flex flex-col gap-2 p-3 sm:hidden\">\n <MobileDropdown\n items={items}\n activeHref={activeHref}\n LinkComponent={LinkComponent}\n />\n {actions !== undefined ? (\n <div className=\"flex flex-wrap items-center gap-2\">\n {actions}\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n\ntype StripProps = {\n items: PageTabSpec[];\n activeHref: string | null;\n LinkComponent: NonNullable<PageTabsProps['LinkComponent']>;\n};\n\nfunction DesktopStrip({ items, activeHref, LinkComponent }: StripProps) {\n const { t } = useCboxLocalization();\n return (\n <nav\n // Pill-style tabs inside the card chrome read clearly as\n // switching controls: active gets a filled chip + ring,\n // inactive sits in plain text with a hover fill. The whole\n // strip is centered vertically inside the row so the actions\n // slot on the right shares the same baseline.\n className=\"flex min-h-12 flex-1 items-center gap-1 overflow-x-auto overflow-y-hidden py-1.5\"\n role=\"tablist\"\n aria-label={t(\"Section navigation\")}\n >\n {items.map((item) => {\n const Icon = item.icon;\n const active = item.href === activeHref;\n\n return (\n <LinkComponent\n key={item.href}\n href={item.href}\n prefetch\n aria-current={active ? 'page' : undefined}\n className={cn(\n 'inline-flex items-center gap-2 rounded-md px-2.5 py-1.5 text-[13px] whitespace-nowrap transition-colors',\n active\n ? 'bg-secondary font-semibold text-foreground shadow-sm ring-1 ring-border-strong/60'\n : 'text-muted-foreground hover:bg-secondary/60 hover:text-foreground',\n )}\n >\n {Icon !== undefined ? (\n <Icon\n className={cn(\n 'h-3.5 w-3.5 shrink-0',\n active\n ? 'text-foreground'\n : 'text-muted-foreground',\n )}\n strokeWidth={1.7}\n />\n ) : null}\n <span>{item.label}</span>\n <ItemTrailing item={item} active={active} />\n </LinkComponent>\n );\n })}\n </nav>\n );\n}\n\nfunction MobileDropdown({ items, activeHref, LinkComponent }: StripProps) {\n const { t } = useCboxLocalization();\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement | null>(null);\n const listId = useId();\n\n const active = items.find((item) => item.href === activeHref) ?? items[0];\n\n // Click-outside + Escape close. Same popover contract every other\n // cbox-ui dropdown follows so it feels native to users navigating\n // by keyboard.\n useEffect(() => {\n if (! open) return;\n\n function onPointerDown(event: PointerEvent): void {\n if (\n ref.current !== null &&\n ! ref.current.contains(event.target as Node)\n ) {\n setOpen(false);\n }\n }\n\n function onKey(event: KeyboardEvent): void {\n if (event.key === 'Escape') setOpen(false);\n }\n\n window.addEventListener('pointerdown', onPointerDown);\n window.addEventListener('keydown', onKey);\n\n return () => {\n window.removeEventListener('pointerdown', onPointerDown);\n window.removeEventListener('keydown', onKey);\n };\n }, [open]);\n\n if (active === undefined) {\n return null;\n }\n\n const ActiveIcon = active.icon;\n\n return (\n <div ref={ref} className=\"relative\">\n <button\n type=\"button\"\n onClick={() => setOpen((v) => ! v)}\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-controls={listId}\n className={cn(\n 'flex w-full min-h-11 items-center justify-between gap-2 rounded-md border border-border bg-card px-3 text-left text-[13px] font-medium text-foreground transition-colors hover:border-border-strong',\n open && 'border-border-strong ring-2 ring-ring/30',\n )}\n >\n <span className=\"flex min-w-0 items-center gap-2\">\n {ActiveIcon !== undefined ? (\n <ActiveIcon\n className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\"\n strokeWidth={1.7}\n />\n ) : null}\n <span className=\"truncate\">{active.label}</span>\n <ItemTrailing item={active} active />\n </span>\n <Chevron open={open} />\n </button>\n\n {open ? (\n <ul\n id={listId}\n role=\"listbox\"\n aria-label={t(\"Section navigation\")}\n className=\"absolute left-0 right-0 top-full z-30 mt-1 overflow-hidden rounded-md border border-border bg-popover shadow-lg\"\n >\n {items.map((item) => {\n const Icon = item.icon;\n const isActive = item.href === activeHref;\n\n return (\n <li key={item.href}>\n <LinkComponent\n href={item.href}\n prefetch\n aria-current={isActive ? 'page' : undefined}\n className={cn(\n 'flex w-full items-center gap-2 px-3 py-2.5 text-[13px] transition-colors',\n isActive\n ? 'bg-accent-soft font-semibold text-foreground'\n : 'text-muted-foreground hover:bg-secondary hover:text-foreground',\n )}\n >\n {Icon !== undefined ? (\n <Icon\n className={cn(\n 'h-3.5 w-3.5 shrink-0',\n isActive\n ? 'text-foreground'\n : 'text-muted-foreground',\n )}\n strokeWidth={1.7}\n />\n ) : null}\n <span className=\"flex-1 truncate\">\n {item.label}\n </span>\n <ItemTrailing\n item={item}\n active={isActive}\n />\n </LinkComponent>\n </li>\n );\n })}\n </ul>\n ) : null}\n </div>\n );\n}\n\nfunction ItemTrailing({\n item,\n active,\n}: {\n item: PageTabSpec;\n active: boolean;\n}): ReactNode {\n if (item.badge !== undefined) {\n return <span className=\"ml-1 shrink-0\">{item.badge}</span>;\n }\n\n if (item.count !== undefined) {\n return (\n <span\n className={cn(\n 'ml-1 shrink-0 rounded-sm border px-1 text-[10px] font-semibold tracking-tight tabular-nums',\n active\n ? 'border-border-strong bg-secondary text-foreground'\n : 'border-border bg-secondary/60 text-muted-foreground',\n )}\n >\n {item.count}\n </span>\n );\n }\n\n return null;\n}\n\nfunction Chevron({ open }: { open: boolean }): ReactNode {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={cn(\n 'shrink-0 text-muted-foreground transition-transform duration-150',\n open && 'rotate-180',\n )}\n aria-hidden\n >\n <path d=\"m3.5 5.5 3.5 3.5 3.5-3.5\" />\n </svg>\n );\n}\n\n/**\n * Strip query string and hash from a URL/href so active-state matching\n * compares paths only. Tab hrefs may carry `?org=<slug>` or other\n * adapter-injected params (id's withOrgContext, cortex's org pinning,\n * etc.); the user's current URL doesn't include those when the page\n * mounted via a path-only navigation. Without this strip, `/foo` and\n * `/foo?org=cbox` are not equal and no tab lights up.\n */\nfunction pathOnly(href: string): string {\n const queryIndex = href.indexOf('?');\n const hashIndex = href.indexOf('#');\n let end = href.length;\n if (queryIndex !== -1) end = Math.min(end, queryIndex);\n if (hashIndex !== -1) end = Math.min(end, hashIndex);\n\n return href.slice(0, end);\n}\n\n/**\n * Active-state resolver — picks the longest-matching href so a more\n * specific child wins over its parent. Without this rule, both\n * `/security` and `/security/passkeys` would match when the user is\n * on Passkeys and we'd light up two tabs.\n *\n * Matches paths only (query / hash stripped) so tab hrefs that carry\n * adapter-injected params still resolve.\n */\nfunction resolveActiveHref(\n items: PageTabSpec[],\n currentPath: string,\n): string | null {\n const current = pathOnly(currentPath);\n\n const candidates = items\n .map((item) => {\n const itemPath = pathOnly(item.href);\n const matched =\n item.matchPrefix === true\n ? current === itemPath ||\n current.startsWith(itemPath + '/')\n : current === itemPath;\n\n return matched ? item.href : null;\n })\n .filter((href): href is string => href !== null);\n\n if (candidates.length === 0) return null;\n\n return candidates.reduce((longest, href) =>\n href.length > longest.length ? href : longest,\n );\n}\n","import type { ComponentType, ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\n/**\n * A clickable list row — replaces the \"name on left + Manage button on\n * right\" pattern with a row that's clickable as a single Link, with a\n * visible hover state and a focus ring. Trailing content (badges,\n * action buttons) sits in the `trailing` slot, which renders alongside\n * the body but stops click-propagation on any nested interactive\n * control so action buttons there don't trigger row navigation.\n *\n * <RowLink href={editOrg(slug).url} LinkComponent={Link}>\n * <Avatar />\n * <div>\n * <p>Cbox Systems</p>\n * <p className=\"text-mono\">cbox-systems</p>\n * </div>\n * </RowLink>\n *\n * With trailing actions:\n *\n * <RowLink href={...} trailing={<StatusPill>owner</StatusPill>}>\n *\n * Hit target: the entire row. The Link wraps all content directly so\n * every pixel inside the row is clickable, including the trailing\n * area's whitespace. Interactive controls inside `trailing` (buttons,\n * inputs, anchors, role=\"button\") auto-stop the click via the\n * onClickCapture handler — no per-button stopPropagation boilerplate.\n */\n\nexport type RowLinkProps = {\n /** Destination URL — clicking anywhere on the row navigates here. */\n href: string;\n /** Row body. Compose freely; common pattern is avatar + text block. */\n children: ReactNode;\n /**\n * Right-aligned slot. Status pills, action buttons, kebab menus.\n * Interactive controls inside this slot auto-stop the row click\n * via DOM-traversal (button/a/input/select/textarea/[role=button]\n * /[data-stop-row-click]). No manual stopPropagation needed.\n */\n trailing?: ReactNode;\n /**\n * The framework's link component. Inertia consumers pass the\n * Inertia `Link`; TanStack Router consumers pass their typed\n * `Link`. Plain `<a>` is the fallback.\n */\n LinkComponent?: ComponentType<{\n href: string;\n prefetch?: boolean;\n className?: string;\n children: ReactNode;\n }>;\n /** Highlight as the active row (the user's current selection). */\n active?: boolean;\n /** Additional classes for the row container. */\n className?: string;\n};\n\nconst DefaultLink: ComponentType<{\n href: string;\n className?: string;\n children: ReactNode;\n}> = ({ href, className, children }) => (\n <a href={href} className={className}>\n {children}\n </a>\n);\n\nexport function RowLink({\n href,\n children,\n trailing,\n LinkComponent = DefaultLink,\n active = false,\n className,\n}: RowLinkProps) {\n return (\n <LinkComponent\n href={href}\n prefetch\n // The Link IS the row. Wrapping everything in the Link\n // means every pixel inside is clickable — no fiddly\n // overlay positioning or stretched-link hacks.\n className={cn(\n 'group flex w-full items-center gap-4 px-5 py-3.5 transition-colors focus-visible:bg-secondary/60 focus-visible:outline-none',\n active\n ? 'bg-accent-soft hover:bg-accent-soft/80'\n : 'hover:bg-secondary/60',\n className,\n )}\n >\n <span\n data-component=\"row-link\"\n data-active={active ? 'true' : undefined}\n // Body content. Captures clicks on `trailing`'s\n // interactive controls so they don't bubble up to the\n // Link and trigger the row navigation. The \"click\" on\n // a button inside trailing fires the button's handler\n // and stops there.\n onClickCapture={(event) => {\n const target = event.target as HTMLElement;\n if (\n target.closest(\n 'button, a, input, select, textarea, [role=\"button\"], [data-stop-row-click]',\n ) !== null &&\n target.closest('[data-row-body]') === null\n ) {\n event.stopPropagation();\n }\n }}\n className=\"flex w-full items-center gap-4\"\n >\n <span\n data-row-body\n className=\"flex min-w-0 flex-1 items-center gap-4\"\n >\n {children}\n </span>\n {trailing !== undefined ? (\n <span className=\"flex shrink-0 items-center gap-2\">\n {trailing}\n </span>\n ) : null}\n </span>\n </LinkComponent>\n );\n}\n","import type { LucideIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\ntype Tone = 'info' | 'success' | 'warning' | 'destructive' | 'neutral';\n\nconst toneStyles: Record<Tone, { bg: string; fg: string }> = {\n info: { bg: 'bg-info-soft', fg: 'text-info' },\n success: { bg: 'bg-success-soft', fg: 'text-success' },\n warning: { bg: 'bg-warning-soft', fg: 'text-warning' },\n destructive: { bg: 'bg-destructive-soft', fg: 'text-destructive' },\n neutral: { bg: 'bg-secondary', fg: 'text-foreground' },\n};\n\ntype StatTileProps = {\n label: string;\n value: ReactNode;\n /** Small caption under the value. */\n suffix?: ReactNode;\n icon: LucideIcon;\n tone?: Tone;\n className?: string;\n};\n\n/**\n * Cortex-style metric tile. Coloured square icon block on the left,\n * label + value on the right, optional caption below the value.\n */\nexport function StatTile({\n label,\n value,\n suffix,\n icon: Icon,\n tone = 'info',\n className,\n}: StatTileProps) {\n const styles = toneStyles[tone];\n\n return (\n <div\n className={cn(\n 'flex items-center gap-3 rounded-lg border border-border bg-card p-4 shadow-[0_1px_2px_rgba(0,0,0,0.02)] transition-colors hover:border-border-strong',\n className,\n )}\n >\n <div\n className={cn(\n 'flex h-10 w-10 shrink-0 items-center justify-center rounded-md',\n styles.bg,\n )}\n >\n <Icon className={cn('h-5 w-5', styles.fg)} strokeWidth={1.8} />\n </div>\n <div className=\"min-w-0 flex-1 space-y-0.5\">\n <p className=\"tabular text-2xl leading-none font-semibold tracking-tight text-foreground\">\n {value}\n </p>\n <p className=\"truncate text-xs text-muted-foreground\">\n {label}\n </p>\n {suffix ? (\n <p className=\"text-mono truncate text-[10px] text-muted-foreground/80\">\n {suffix}\n </p>\n ) : null}\n </div>\n </div>\n );\n}\n","/**\n * URL-as-state — typed query-string parsing and serialization.\n *\n * The contract: anything that should survive a hard refresh, deep\n * link, or paste-share lives in the URL, not in React state. Tabs,\n * filters, search terms, pagination, sort order — every one of those\n * is a navigation, not a UI mutation. This module provides the typed\n * parsers and serializers; per-app adapters wire them to the host\n * router (Inertia's `router.get`, TanStack Router's `navigate`, etc.)\n * and shape the `[state, update]` ergonomics on top.\n *\n * Why not URLSearchParams directly? Because raw query strings throw\n * away types and have no notion of defaults. The schema declares both\n * once, and `buildUrlSearch` automatically elides values that match\n * their default so the URL stays human-readable. `?role=all&page=1`\n * collapses to `''` when `all` and `1` are the defaults. Going from\n * `state -> URL -> state` always round-trips.\n */\n\n/**\n * A single field in a URL schema. Encapsulates the three operations\n * that make typed URL state work:\n * - `parse(raw)` — string|null from the query string → typed value\n * - `serialize(v)` — typed value → string|null (null = drop the key)\n * - `isDefault(v)` — does this value equal the field's default? If\n * so, `buildUrlSearch` elides it to keep URLs short.\n */\nexport type UrlField<T> = {\n parse: (raw: string | null) => T;\n serialize: (value: T) => string | null;\n isDefault: (value: T) => boolean;\n};\n\n// `UrlField<unknown>` would block assignment from concrete fields\n// (variance: T appears in both contravariant and covariant positions).\n// `UrlField<any>` is the standard escape hatch; safety lives in\n// `InferUrlState` which keeps the value-side fully typed.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type UrlSchema = Record<string, UrlField<any>>;\n\n/**\n * Map a UrlSchema to its inferred state shape — `urlString('')` →\n * `string`, `urlEnum(['a', 'b'], 'a')` → `'a' | 'b'`, etc.\n */\nexport type InferUrlState<S extends UrlSchema> = {\n [K in keyof S]: S[K] extends UrlField<infer T> ? T : never;\n};\n\n/**\n * String field. The empty string is the conventional \"absent\" value\n * — it's what an HTML input gives you when the user clears it — so\n * we treat `'' === default` as \"drop the param\" by default. Pass an\n * explicit non-empty default if you genuinely want to persist `''`.\n */\nexport function urlString(defaultValue: string = ''): UrlField<string> {\n return {\n parse: (raw) => raw ?? defaultValue,\n serialize: (value) => value,\n isDefault: (value) => value === defaultValue,\n };\n}\n\n/**\n * Integer field with optional clamping. Non-numeric input falls back\n * to the default rather than NaN; out-of-range input clamps to the\n * boundary. Both behaviours are belt-and-braces against URL tampering.\n */\nexport function urlNumber(\n defaultValue: number,\n options: { min?: number; max?: number } = {},\n): UrlField<number> {\n const clamp = (n: number): number => {\n if (options.min !== undefined && n < options.min) return options.min;\n if (options.max !== undefined && n > options.max) return options.max;\n\n return n;\n };\n\n return {\n parse: (raw) => {\n if (raw === null) return defaultValue;\n const parsed = Number.parseInt(raw, 10);\n if (Number.isNaN(parsed)) return defaultValue;\n\n return clamp(parsed);\n },\n serialize: (value) => String(value),\n isDefault: (value) => value === defaultValue,\n };\n}\n\n/**\n * Enum field — restrict to a fixed set of strings. Unknown values\n * fall back to the default rather than poisoning typed downstream\n * code with arbitrary user input. The `as const` on the values array\n * is what lets TS narrow the field type to the union.\n */\nexport function urlEnum<T extends string>(\n values: readonly T[],\n defaultValue: T,\n): UrlField<T> {\n const allowed = new Set<string>(values);\n\n return {\n parse: (raw) =>\n raw !== null && allowed.has(raw) ? (raw as T) : defaultValue,\n serialize: (value) => value,\n isDefault: (value) => value === defaultValue,\n };\n}\n\n/**\n * Boolean field. Only the literal string `'true'` parses to true so\n * we don't accidentally interpret `?flag=0` or `?flag=false` as truthy.\n */\nexport function urlBoolean(defaultValue: boolean = false): UrlField<boolean> {\n return {\n parse: (raw) => (raw === null ? defaultValue : raw === 'true'),\n serialize: (value) => (value ? 'true' : 'false'),\n isDefault: (value) => value === defaultValue,\n };\n}\n\n/**\n * Array-of-strings field — comma-joined in the URL. Useful for\n * multi-select filters (`?tags=foo,bar,baz`). Empty arrays drop the\n * param. Per-item parsing isn't customisable on purpose; if you need\n * a typed array of enums or numbers, build a thin wrapper.\n */\nexport function urlStringArray(\n defaultValue: readonly string[] = [],\n): UrlField<string[]> {\n const defaultKey = [...defaultValue].sort().join(',');\n\n return {\n parse: (raw) => {\n if (raw === null || raw === '') return [...defaultValue];\n\n return raw.split(',').filter((item) => item !== '');\n },\n serialize: (value) => (value.length === 0 ? null : value.join(',')),\n isDefault: (value) => [...value].sort().join(',') === defaultKey,\n };\n}\n\n/**\n * Convenience: declare a schema. Pure passthrough — exists to give\n * call sites a single, named import that reads like a definition\n * rather than a bare object literal.\n */\nexport function defineUrlSchema<S extends UrlSchema>(schema: S): S {\n return schema;\n}\n\n/**\n * Parse a query string into a typed state object. Accepts both\n * leading-`?` and bare forms. Unknown keys are silently dropped —\n * the schema is the closed allow-list, which keeps server- and\n * client-readable surface area bounded.\n */\nexport function parseUrlSearch<S extends UrlSchema>(\n search: string,\n schema: S,\n): InferUrlState<S> {\n const normalised = search.startsWith('?') ? search.slice(1) : search;\n const params = new URLSearchParams(normalised);\n const state = {} as InferUrlState<S>;\n\n for (const key of Object.keys(schema)) {\n const field = schema[key];\n if (field === undefined) continue;\n (state as Record<string, unknown>)[key] = field.parse(params.get(key));\n }\n\n return state;\n}\n\n/**\n * Serialize a typed state back to a query string. Default-valued\n * fields are elided so URLs stay short and bookmarks stay portable\n * across schema changes (a URL with `?page=1` keeps working when\n * `page` later stops being serialised because it's the default).\n *\n * Returns the serialised query without a leading `?`. The host\n * adapter is responsible for prepending or stitching it onto a path.\n */\nexport function buildUrlSearch<S extends UrlSchema>(\n state: InferUrlState<S>,\n schema: S,\n): string {\n const params = new URLSearchParams();\n\n for (const key of Object.keys(schema)) {\n const field = schema[key];\n if (field === undefined) continue;\n const value = (state as Record<string, unknown>)[key];\n\n if (field.isDefault(value)) continue;\n\n const serialized = field.serialize(value);\n if (serialized !== null) {\n params.set(key, serialized);\n }\n }\n\n return params.toString();\n}\n","import { useCallback, useEffect, useRef, useState, type ReactNode } from 'react';\nimport { Menu, Pin, PinOff, PanelLeftClose, PanelLeftOpen, X } from 'lucide-react';\nimport { CboxBrand } from './cbox-brand';\nimport type { CboxNavItem, LinkComponent } from './cbox-app-sidebar';\nimport { useCboxLocalization } from '../context/localization';\n\nexport type CboxNavArea = CboxNavItem & { items?: CboxNavItem[] };\nexport type CboxWorkspaceShellProps = {\n appKey: string;\n brandSubmark: string;\n areas: CboxNavArea[];\n currentPath: string;\n LinkComponent: LinkComponent;\n context: ReactNode;\n tools: ReactNode;\n account: ReactNode;\n children: ReactNode;\n /** Where the brand row links. Default `/`. */\n brandHref?: string;\n /** `id` of the `<main>` landmark, so a host's skip link can target it. Default `main-content`. */\n mainId?: string;\n /**\n * Rail pinned open. Pass `pinned` + `onPinnedChange` to control it (the host persists the\n * preference, in a cookie or Cbox ID), or `defaultPinned` to seed the shell's own state.\n */\n pinned?: boolean;\n defaultPinned?: boolean;\n onPinnedChange?: (pinned: boolean) => void;\n /** Contextual subnav collapsed to its strip. Controlled and uncontrolled as `pinned`. */\n collapsed?: boolean;\n defaultCollapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n};\n\n/**\n * How well `href` matches `path`: the href's length when the path is the href or beneath it,\n * -1 otherwise. `/` matches only itself, so a home item never claims every page.\n */\nexport function navMatchLength(path: string, href: string): number {\n if (href === '/') {\n return path === '/' ? 1 : -1;\n }\n\n return path === href || path.startsWith(href + '/') ? href.length : -1;\n}\n\n/** The item whose href is the most specific match for `path`, or undefined. */\nexport function activeNavItem<T extends CboxNavItem>(path: string, items: readonly T[]): T | undefined {\n let best: T | undefined;\n let length = -1;\n for (const item of items) {\n const match = navMatchLength(path, item.href);\n if (match > length) {\n best = item;\n length = match;\n }\n }\n\n return best;\n}\n\n/**\n * The area `path` is in: the one holding the most specific match among its own href and its\n * items' hrefs. A first-match would put every page beneath an area at `/` (an overview, a\n * dashboard) under that area and never show another area's subnav.\n */\nexport function activeNavArea<T extends CboxNavArea>(path: string, areas: readonly T[]): T | undefined {\n let best: T | undefined;\n let length = -1;\n for (const area of areas) {\n const candidates = [area.href, ...(area.items ?? []).map(item => item.href)];\n const match = Math.max(...candidates.map(href => navMatchLength(path, href)));\n if (match > length) {\n best = area;\n length = match;\n }\n }\n\n return best;\n}\n\nfunction useControllable(value: boolean | undefined, fallback: boolean, onChange: ((next: boolean) => void) | undefined): [boolean, (next: boolean | ((current: boolean) => boolean)) => void] {\n const [own, setOwn] = useState(fallback);\n const current = value ?? own;\n const ref = useRef(current);\n ref.current = current;\n const set = useCallback((next: boolean | ((current: boolean) => boolean)) => {\n const resolved = typeof next === 'function' ? next(ref.current) : next;\n if (value === undefined) setOwn(resolved);\n onChange?.(resolved);\n }, [value, onChange]);\n\n return [current, set];\n}\n\n/** Two-tier workspace navigation. Route ownership and preference persistence stay with the host. */\nexport function CboxWorkspaceShell({ appKey, brandSubmark, areas, currentPath, LinkComponent: Link, context, tools, account, children, brandHref = '/', mainId = 'main-content', pinned: pinnedProp, defaultPinned = false, onPinnedChange, collapsed: collapsedProp, defaultCollapsed = false, onCollapsedChange }: CboxWorkspaceShellProps) {\n const { t } = useCboxLocalization();\n const [pinned, setPinned] = useControllable(pinnedProp, defaultPinned, onPinnedChange);\n const [collapsed, setCollapsed] = useControllable(collapsedProp, defaultCollapsed, onCollapsedChange);\n const [expanded, setExpanded] = useState(false);\n const [mobile, setMobile] = useState(false);\n const dialog = useRef<HTMLDialogElement>(null);\n const path = currentPath.split(/[?#]/)[0] ?? '/';\n const area = activeNavArea(path, areas);\n const subnav = area?.items && area.items.length > 1 ? area : undefined;\n useEffect(() => { setMobile(false); }, [currentPath]);\n useEffect(() => {\n const el = dialog.current;\n if (mobile && el && !el.open) el.showModal();\n if (!mobile && el?.open) el.close();\n }, [mobile]);\n useEffect(() => {\n const key = (event: KeyboardEvent) => {\n if ((event.metaKey || event.ctrlKey) && event.key === '.') {\n event.preventDefault(); setCollapsed(value => !value);\n }\n };\n addEventListener('keydown', key);\n return () => removeEventListener('keydown', key);\n }, [setCollapsed]);\n const open = pinned || expanded;\n const links = (items: CboxNavItem[]) => {\n const active = activeNavItem(path, items);\n return items.map(item => <Link key={item.href} href={item.href} className={`cbx-workspace-link ${item === active ? 'is-active' : ''}`} aria-label={item.label} aria-current={item === active ? 'page' : undefined}><item.icon className=\"h-4 w-4 shrink-0\" strokeWidth={1.7} /><span>{item.label}</span></Link>);\n };\n return <div className=\"cbx-workspace\">\n <div className=\"cbx-rail-slot\" data-pinned={pinned}>\n <aside className=\"cbx-rail\" data-open={open} onMouseEnter={() => setExpanded(true)} onMouseLeave={() => setExpanded(false)} onFocusCapture={() => setExpanded(true)} onBlurCapture={event => { if (!event.currentTarget.contains(event.relatedTarget)) setExpanded(false); }}>\n <div className=\"cbx-rail-brand\"><Link href={brandHref} aria-label={t('Home')}><span className=\"dark:hidden\"><CboxBrand appKey={appKey} submark={brandSubmark} collapsed={!open} /></span><span className=\"hidden dark:block\"><CboxBrand appKey={appKey} submark={brandSubmark} collapsed={!open} tone=\"light\" /></span></Link>{open && <button type=\"button\" onClick={() => setPinned(value => !value)} aria-label={t(pinned ? 'Unpin navigation' : 'Pin navigation')} aria-pressed={pinned}>{pinned ? <PinOff size={16} /> : <Pin size={16} />}</button>}</div>\n <nav aria-label={brandSubmark}>{areas.map(item => <Link key={item.href} href={item.href} aria-label={item.label} aria-current={area === item ? 'page' : undefined} title={open ? undefined : item.label} className={`cbx-workspace-link ${area === item ? 'is-active' : ''}`}><item.icon className=\"h-4 w-4 shrink-0\" strokeWidth={1.7} />{open && <span>{item.label}</span>}</Link>)}</nav>\n <div className=\"cbx-rail-account\">{account}</div>\n </aside>\n </div>\n <div className=\"cbx-workspace-column\">\n <header className=\"cbx-workspace-header\"><button className=\"cbx-mobile-trigger\" type=\"button\" onClick={() => setMobile(true)} aria-label={t('Open navigation')}><Menu size={18} /></button><div className=\"cbx-workspace-context\">{context}</div><div className=\"cbx-workspace-tools\">{tools}</div></header>\n <div className=\"cbx-workspace-body\">\n {subnav && <aside className=\"cbx-subnav\" data-collapsed={collapsed}>{collapsed ? <button className=\"cbx-subnav-strip\" type=\"button\" onClick={() => setCollapsed(false)} aria-label={t('Expand sidebar')}><PanelLeftOpen size={16} /><span>{subnav.label}</span></button> : <><div className=\"cbx-subnav-header\"><strong>{subnav.label}</strong><button type=\"button\" onClick={() => setCollapsed(true)} aria-label={t('Collapse sidebar')} title=\"⌘.\"><PanelLeftClose size={16} /></button></div><nav aria-label={subnav.label}>{links(subnav.items ?? [])}</nav></>}</aside>}\n <main id={mainId} className=\"canvas-gradient cbx-workspace-main\">{children}</main>\n </div>\n </div>\n <dialog ref={dialog} className=\"cbx-workspace-mobile\" onClose={() => setMobile(false)} onClick={event => { if (event.target === event.currentTarget) setMobile(false); }}><div className=\"cbx-subnav-header\"><strong>{brandSubmark}</strong><button type=\"button\" onClick={() => setMobile(false)} aria-label={t('Close navigation')}><X size={18} /></button></div><nav aria-label={t('Navigation')}>{areas.map(item => <section key={item.href}>{links([item])}{item.items && <div className=\"pl-4\">{links(item.items)}</div>}</section>)}</nav><div className=\"cbx-rail-account\">{account}</div></dialog>\n </div>;\n}\n","/** The chart tokens in order, for series that set their own colour. */\nexport const CHART_PALETTE = ['var(--chart-1)', 'var(--chart-2)', 'var(--chart-3)', 'var(--chart-4)', 'var(--chart-5)'];\n\n/** A row's shape over the window, small: a line with a faint area, zero at the bottom. Decorative. */\nexport function Sparkline({ values, color = 'var(--chart-1)', width = 90, height = 20 }: { values: number[]; color?: string; width?: number; height?: number }) {\n if (values.length === 0) {\n return null;\n }\n\n const clean = values.map((value) => (Number.isFinite(value) ? value : 0));\n const max = Math.max(1e-9, ...clean);\n const points = clean.map((value, index) => [(index / Math.max(1, clean.length - 1)) * (width - 2) + 1, height - 1 - (value / max) * (height - 3)] as const);\n const d = points.map(([px, py], index) => `${index === 0 ? 'M' : 'L'}${px.toFixed(1)} ${py.toFixed(1)}`).join('');\n\n return (\n <svg width={width} height={height} viewBox={`0 0 ${width} ${height}`} aria-hidden=\"true\">\n <path d={`${d}L${width - 1} ${height}L1 ${height}Z`} fill={color} opacity={0.14} />\n <path d={d} fill=\"none\" stroke={color} strokeWidth={1.5} strokeLinejoin=\"round\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/context/cbox-id.tsx","../src/context/localization.tsx","../src/components/app-icon.tsx","../src/shell/context.tsx","../src/shell/media.ts","../src/shell/popover.tsx","../src/shell/option-list.tsx","../src/shell/account-menu.tsx","../src/shell/app-grid.tsx","../src/shell/data.ts","../src/shell/use-list.ts","../src/shell/context-menus.tsx","../src/shell/help-store.ts","../src/shell/help.tsx","../src/shell/icons.tsx","../src/shell/nav-pages.tsx","../src/shell/mobile.tsx","../src/shell/palette.tsx","../src/shell/shell.tsx","../src/layout/app-content.tsx","../src/layout/app-shell.tsx","../src/layout/cbox-brand.tsx","../src/components/app-catalog.tsx","../src/primitives/combobox.tsx","../src/primitives/data-panel.tsx","../src/primitives/empty-state.tsx","../src/primitives/heading.tsx","../src/primitives/key-value.tsx","../src/primitives/page-header.tsx","../src/primitives/page-shell.tsx","../src/primitives/page-tabs.tsx","../src/primitives/row-link.tsx","../src/primitives/stat-tile.tsx","../src/primitives/status-pill.tsx","../src/surfaces/surface-modal.tsx","../src/surfaces/inbox-surface.tsx","../src/surfaces/surface-state.tsx","../src/utils/url-state.ts","../src/charts/sparkline.tsx"],"names":["createContext","jsx","useContext","useSyncExternalStore","useState","useRef","useMemo","useEffect","jsxs","Fragment","ArrowUpRight","rows","query","kept","useCallback","useId","Search","Check","ChevronRight","script","useLayoutEffect","ArrowLeft","UserRound","BookOpen","Globe","LifeBuoy","MessageSquare","Settings","Sparkles","Users","Lock","X","LayoutGrid","Bell","q","FileText","Building2","Zap","createElement","id","Plus","initials","Chevron","DefaultLink","toneStyles","TONES"],"mappings":";;;;;;;;AA4MA,IAAM,aAAA,GAAgB,cAAyC,IAAI,CAAA;AAE5D,SAAS,cAAA,CAAe;AAAA,EAC3B,KAAA;AAAA,EACA;AACJ,CAAA,EAGG;AACC,EAAA,uBAAO,GAAA,CAAC,aAAA,CAAc,QAAA,EAAd,EAAuB,OAAe,QAAA,EAAS,CAAA;AAC3D;AAEO,SAAS,SAAA,GAAgC;AAC5C,EAAA,MAAM,GAAA,GAAM,WAAW,aAAa,CAAA;AACpC,EAAA,IAAI,QAAQ,IAAA,EAAM;AACd,IAAA,MAAM,IAAI,KAAA;AAAA,MACN;AAAA,KAGJ;AAAA,EACJ;AACA,EAAA,OAAO,GAAA;AACX;AAMO,SAAS,iBAAA,GAA+C;AAC3D,EAAA,OAAO,WAAW,aAAa,CAAA;AACnC;ACpOA,IAAM,eAAeA,aAAAA,CAA4F;AAAA,EAC7G,MAAA,EAAQ,IAAA;AAAA,EACR,CAAA,EAAG,WAAA;AAAA,EACH,YAAY,CAAC,KAAA,KAAU,IAAI,IAAA,CAAK,KAAK,EAAE,cAAA;AAC3C,CAAC,CAAA;AAEM,SAAS,WAAA,CAAY,OAAA,EAAiB,MAAA,GAAgC,EAAC,EAAW;AACrF,EAAA,OAAO,OAAA,CAAQ,OAAA;AAAA,IAAQ,8BAAA;AAAA,IAAgC,CAAC,KAAA,EAAO,GAAA,KAC3D,MAAA,CAAO,UAAU,cAAA,CAAe,IAAA,CAAK,MAAA,EAAQ,GAAG,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,GAAG,CAAC,CAAA,GAAI;AAAA,GAC9E;AACJ;AAGO,SAAS,yBAAyB,EAAE,MAAA,EAAQ,WAAW,UAAA,GAAa,WAAA,EAAa,UAAS,EAK9F;AACC,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,SAAA,EAAW,UAAA,EAAW,CAAA,EAAI,CAAC,MAAA,EAAQ,SAAA,EAAW,UAAU,CAAC,CAAA;AACnG,EAAA,uBAAOC,GAAAA,CAAC,YAAA,CAAa,QAAA,EAAb,EAAsB,OAAe,QAAA,EAAS,CAAA;AAC1D;AAEO,SAAS,mBAAA,GAAsB;AAClC,EAAA,OAAOC,WAAW,YAAY,CAAA;AAClC;AAEA,SAAS,YAAY,KAAA,EAAuB;AACxC,EAAA,OAAO,IAAI,IAAA,CAAK,KAAK,CAAA,CAAE,cAAA,EAAe;AAC1C;ACtBA,IAAM,QAAwB,EAAC;AAGxB,SAAS,kBAAA,GAAqC;AACjD,EAAA,OAAO,oBAAA,CAAqB,wBAAA,EAA0B,mBAAA,EAAqB,MAAM,KAAK,CAAA;AAC1F;AAqBO,SAAS,WAAA,CAAY,EAAE,IAAA,EAAM,OAAA,EAAS,aAAa,SAAA,GAAY,SAAA,EAAW,UAAS,EAAqB;AAC3G,EAAA,MAAM,KAAA,GAAQ,cAAc,OAAO,CAAA;AACnC,EAAA,MAAM,IAAA,GAAO,cAAc,WAAW,CAAA;AACtC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAwB,IAAI,CAAA;AACxD,EAAA,MAAM,MAAM,CAAA,EAAG,KAAA,IAAS,EAAE,CAAA,CAAA,EAAI,QAAQ,EAAE,CAAA,CAAA;AACxC,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,MAAA,KAAW,GAAA,EAAK;AAClC,IAAA,IAAI,aAAa,MAAA,EAAW,uBAAOD,GAAAA,CAAA,YAAG,QAAA,EAAA,QAAA,EAAS,CAAA;AAC/C,IAAA,uBAAOA,GAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAW,IAAA,EAAC,SAAA,EAAW,EAAA,CAAG,iGAAA,EAAmG,SAAS,CAAA,EAAI,QAAA,EAAA,QAAA,CAAS,IAAI,CAAA,EAAE,CAAA;AAAA,EAC1K;AACA,EAAA,MAAM,IAAA,GAAO,MAAM,SAAA,CAAU,GAAG,CAAA;AAEhC,EAAA,uBACI,IAAA,CAAC,UAAK,aAAA,EAAW,IAAA,EAAC,WAAW,EAAA,CAAG,mEAAA,EAAqE,SAAS,CAAA,EAC1G,QAAA,EAAA;AAAA,oBAAAA,IAAC,KAAA,EAAA,EAAI,GAAA,EAAK,OAAO,GAAA,EAAI,EAAA,EAAG,UAAS,OAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,GAAG,cAAA,EAAgB,IAAA,KAAS,OAAO,qBAAA,GAAwB,oBAAA,EAAsB,eAAe,CAAA,EAAG,CAAA;AAAA,IACrK,IAAA,KAAS,IAAA,oBAAQA,GAAAA,CAAC,SAAI,GAAA,EAAK,IAAA,EAAM,GAAA,EAAI,EAAA,EAAG,QAAA,EAAS,OAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,WAAU,8CAAA,EAA+C;AAAA,GAAA,EACtI,CAAA;AAER;AAYO,SAAS,gBAAgB,EAAE,MAAA,EAAQ,YAAY,SAAA,EAAW,QAAA,GAAW,MAAK,EAAyB;AACtG,EAAA,MAAM,MAAM,kBAAA,EAAmB,CAAE,KAAK,CAAA,KAAA,KAAS,KAAA,CAAM,QAAQ,MAAM,CAAA;AACnE,EAAA,IAAI,GAAA,KAAQ,UAAa,GAAA,CAAI,QAAA,KAAa,MAAM,uBAAOA,GAAAA,CAAA,QAAA,EAAA,EAAG,QAAA,EAAA,QAAA,EAAS,CAAA;AAEnE,EAAA,uBAAOA,GAAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAM,IAAI,IAAA,EAAM,OAAA,EAAS,GAAA,CAAI,QAAA,EAAU,aAAa,GAAA,CAAI,aAAA,EAAe,SAAA,EAAsB,QAAA,EAAU,YAAY,MAAA,EAAW,CAAA;AACtJ;AChCO,IAAM,YAAA,GAAeD,cAA+B,IAAI,CAAA;AAExD,SAAS,QAAA,GAAqB;AACjC,EAAA,MAAM,GAAA,GAAME,WAAW,YAAY,CAAA;AACnC,EAAA,IAAI,GAAA,KAAQ,IAAA,EAAM,MAAM,IAAI,MAAM,4DAA4D,CAAA;AAC9F,EAAA,OAAO,GAAA;AACX;AAGO,SAAS,YAAA,GAA4E;AACxF,EAAA,MAAM,GAAA,GAAMA,WAAW,YAAY,CAAA;AACnC,EAAA,OAAO,GAAA,KAAQ,IAAA,GAAO,IAAA,GAAO,EAAE,UAAA,EAAY,GAAA,CAAI,UAAA,EAAY,WAAA,EAAa,GAAA,CAAI,WAAA,EAAa,GAAA,EAAK,GAAA,CAAI,GAAA,EAAI;AAC1G;AClDO,IAAM,eAAA,GAAkB,oCAAA;AAExB,IAAM,WAAA,GAAc,qBAAA;AAEpB,IAAM,MAAA,GAAS,oBAAA;AAEtB,SAAS,MAAM,KAAA,EAAsC;AACjD,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,MAAA,CAAO,UAAA,KAAe,YAAY,OAAO,IAAA;AACrF,EAAA,OAAO,MAAA,CAAO,WAAW,KAAK,CAAA;AAClC;AAEO,SAAS,QAAQ,KAAA,EAAwB;AAC5C,EAAA,OAAO,KAAA,CAAM,KAAK,CAAA,EAAG,OAAA,IAAW,KAAA;AACpC;AAGO,SAAS,YAAA,GAAwB;AACpC,EAAA,OAAO,QAAQ,eAAe,CAAA;AAClC;AAGO,SAAS,QAAA,CAAS,KAAA,EAAe,QAAA,GAAW,KAAA,EAAgB;AAC/D,EAAA,OAAOC,oBAAAA;AAAA,IACH,CAAA,MAAA,KAAU;AACN,MAAA,MAAM,IAAA,GAAO,MAAM,KAAK,CAAA;AACxB,MAAA,IAAI,IAAA,KAAS,IAAA,EAAM,OAAO,MAAM,MAAA;AAChC,MAAA,IAAA,CAAK,gBAAA,GAAmB,UAAU,MAAM,CAAA;AACxC,MAAA,OAAO,MAAM,IAAA,CAAK,mBAAA,GAAsB,QAAA,EAAU,MAAM,CAAA;AAAA,IAC5D,CAAA;AAAA,IACA,MAAM,KAAA,CAAM,KAAK,CAAA,EAAG,OAAA,IAAW,QAAA;AAAA,IAC/B,MAAM;AAAA,GACV;AACJ;AC/BA,IAAM,GAAA,GAAM,CAAA;AACZ,IAAM,MAAA,GAAS,CAAA;AAIf,SAAS,KAAA,CAAM,MAAA,EAAiB,IAAA,EAAyB,SAAA,EAAgC;AACrF,EAAA,MAAM,QAAQ,MAAA,CAAO,UAAA;AACrB,EAAA,MAAM,SAAS,MAAA,CAAO,WAAA;AACtB,EAAA,IAAI,OAAO,SAAA,KAAc,YAAA,GAAe,OAAO,KAAA,GAAQ,IAAA,CAAK,QAAQ,MAAA,CAAO,IAAA;AAC3E,EAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,GAAQ,MAAM,CAAC,CAAA;AACnE,EAAA,IAAI,cAAc,WAAA,EAAa;AAC3B,IAAA,MAAM,MAAA,GAAS,MAAA,GAAS,MAAA,CAAO,GAAA,GAAM,GAAA;AACrC,IAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAW,IAAA,CAAK,IAAI,GAAA,EAAK,MAAA,GAAS,MAAA,GAAS,MAAM,CAAA,EAAE;AAAA,EAC9E;AACA,EAAA,MAAM,GAAA,GAAM,OAAO,MAAA,GAAS,GAAA;AAC5B,EAAA,OAAO,EAAE,GAAA,EAAK,IAAA,EAAM,SAAA,EAAW,IAAA,CAAK,IAAI,GAAA,EAAK,MAAA,GAAS,GAAA,GAAM,MAAM,CAAA,EAAE;AACxE;AAOO,SAAS,OAAA,CAAQ;AAAA,EACpB,IAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA,GAAY,cAAA;AAAA,EACZ,OAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA;AACJ,CAAA,EAQG;AACC,EAAA,MAAM,OAAA,GAAU,OAAuB,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIC,SAA0B,IAAI,CAAA;AAE9D,EAAA,eAAA,CAAgB,MAAM;AAClB,IAAA,IAAI,CAAC,IAAA,EAAM;AACP,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA;AAAA,IACJ;AACA,IAAA,MAAM,SAAS,MAAM;AACjB,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,OAAA,EAAS,qBAAA,EAAsB;AAClD,MAAA,MAAM,KAAK,OAAA,CAAQ,OAAA;AACnB,MAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,EAAA,KAAO,IAAA,EAAM;AACtC,MAAA,WAAA,CAAY,KAAA,CAAM,KAAK,EAAE,KAAA,EAAO,GAAG,WAAA,EAAY,EAAG,SAAS,CAAC,CAAA;AAAA,IAChE,CAAA;AACA,IAAA,MAAA,EAAO;AACP,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,MAAM,CAAA;AACxC,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,MAAM,CAAA;AAAA,EAC5D,CAAA,EAAG,CAAC,IAAA,EAAM,MAAA,EAAQ,SAAS,CAAC,CAAA;AAE5B,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,IAAA,GAAO,CAAC,KAAA,KAAwB;AAClC,MAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,MAAA,IAAI,WAAW,IAAA,EAAM;AACrB,MAAA,IAAI,OAAA,CAAQ,SAAS,QAAA,CAAS,MAAM,KAAK,MAAA,CAAO,OAAA,EAAS,QAAA,CAAS,MAAM,CAAA,EAAG;AAC3E,MAAA,OAAA,CAAQ,SAAS,CAAA;AAAA,IACrB,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAA,EAAe,IAAA,EAAM,IAAI,CAAA;AACnD,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,aAAA,EAAe,MAAM,IAAI,CAAA;AAAA,EACvE,CAAA,EAAG,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAO,CAAC,CAAA;AAE1B,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,MAAM,KAAA,GAAuB,QAAA,KAAa,IAAA,GACpC,EAAE,QAAA,EAAU,OAAA,EAAS,GAAA,EAAK,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,UAAA,EAAY,QAAA,EAAS,GAC3D,EAAE,QAAA,EAAU,OAAA,EAAS,GAAA,EAAK,QAAA,CAAS,GAAA,EAAK,MAAA,EAAQ,QAAA,CAAS,MAAA,EAAQ,IAAA,EAAM,QAAA,CAAS,IAAA,EAAM,SAAA,EAAW,QAAA,CAAS,SAAA,EAAU;AAE1H,EAAA,uBACIH,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,GAAA,EAAK,OAAA;AAAA,MACL,SAAA,EAAW,CAAA,YAAA,EAAe,SAAA,IAAa,EAAE,CAAA,CAAA;AAAA,MACzC,KAAA;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAY,KAAA;AAAA,MACZ,WAAW,CAAA,KAAA,KAAS;AAChB,QAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,QAAA,IAAY,CAAC,MAAM,gBAAA,EAAkB;AACnD,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,UAAA,OAAA,CAAQ,QAAQ,CAAA;AAChB,UAAA,MAAA,CAAO,SAAS,KAAA,EAAM;AAAA,QAC1B;AACA,QAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,KAAA,IAAS,CAAC,MAAM,gBAAA,EAAkB;AAGhD,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,OAAA,CAAQ,KAAK,CAAA;AACb,UAAA,MAAA,CAAO,SAAS,KAAA,EAAM;AAAA,QAC1B;AAAA,MACJ,CAAA;AAAA,MAEC;AAAA;AAAA,GACL;AAER;AAGO,SAAS,OAAA,CAAQ,OAAuE,SAAA,EAAqC;AAChI,EAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,KAAA,IAAS,SAAA,KAAc,IAAA,EAAM;AAC/C,EAAA,MAAM,YAAY,KAAA,CAAM,IAAA;AAAA,IACpB,SAAA,CAAU,iBAA8B,mHAAmH;AAAA,GAC/J,CAAE,MAAA,CAAO,CAAA,EAAA,KAAM,CAAC,EAAA,CAAG,YAAA,CAAa,QAAQ,CAAA,IAAK,EAAA,CAAG,YAAA,CAAa,aAAa,CAAA,KAAM,MAAM,CAAA;AACtF,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AACxB,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA;AAAA,EACJ;AACA,EAAA,MAAM,KAAA,GAAQ,UAAU,CAAC,CAAA;AACzB,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,SAAA,CAAU,MAAA,GAAS,CAAC,CAAA;AAC3C,EAAA,MAAM,SAAS,QAAA,CAAS,aAAA;AACxB,EAAA,IAAI,KAAA,CAAM,aAAa,MAAA,KAAW,KAAA,IAAS,CAAC,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI;AACrE,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EACf,CAAA,MAAA,IAAW,CAAC,KAAA,CAAM,QAAA,KAAa,MAAA,KAAW,QAAQ,CAAC,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI;AAC5E,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,KAAA,CAAM,KAAA,EAAM;AAAA,EAChB;AACJ;AAMO,SAAS,aAAa,EAAA,EAAkB;AAC3C,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,cAAA,CAAe,EAAE,CAAA;AACzC,EAAA,IAAI,WAAW,IAAA,EAAM;AAGrB,EAAA,IAAI,IAAA,GAAO,MAAA,CAAO,OAAA,CAAqB,kBAAkB,CAAA;AACzD,EAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,aAAA,EAAe,SAAA,CAAU,QAAA,CAAS,UAAU,CAAA,SAAU,IAAA,CAAK,aAAA;AAC/H,EAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,CAAK,YAAA,IAAgB,KAAK,YAAA,EAAc;AAC7D,EAAA,MAAM,GAAA,GAAM,KAAK,qBAAA,EAAsB;AACvC,EAAA,MAAM,IAAA,GAAO,OAAO,qBAAA,EAAsB;AAC1C,EAAA,IAAI,IAAA,CAAK,MAAM,GAAA,CAAI,GAAA,OAAU,SAAA,IAAa,GAAA,CAAI,GAAA,GAAM,IAAA,CAAK,GAAA,GAAM,CAAA;AAAA,OAAA,IACtD,IAAA,CAAK,SAAS,GAAA,CAAI,MAAA,OAAa,SAAA,IAAa,IAAA,CAAK,MAAA,GAAS,GAAA,CAAI,MAAA,GAAS,CAAA;AACpF;ACzIO,SAAS,aAAA,CAAc,OAAmC,SAAA,EAAqC;AAClG,EAAA,IAAI,cAAc,IAAA,EAAM;AACxB,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,iBAA8B,0CAA0C,CAAC,CAAA,CAAE,MAAA,CAAO,CAAA,EAAA,KAAM,CAAC,EAAA,CAAG,OAAA,CAAQ,UAAU,CAAC,CAAA;AAClJ,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACxB,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,aAA4B,CAAA;AACjE,EAAA,MAAM,OAAA,GAAW,QAAA,CAAS,aAAA,EAAsC,OAAA,CAAQ,gBAAgB,CAAA,KAAM,IAAA;AAC9F,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,QAAQ,MAAM,GAAA;AAAK,IACf,KAAK,WAAA;AACD,MAAA,IAAA,GAAO,KAAA,GAAQ,CAAA,GAAI,CAAA,GAAA,CAAK,KAAA,GAAQ,KAAK,KAAA,CAAM,MAAA;AAC3C,MAAA,IAAI,OAAA,EAAS;AAET,QAAA,MAAM,KAAA,GAAS,QAAA,CAAS,aAAA,CAA8B,OAAA,CAAQ,gBAAgB,CAAA;AAC9E,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,SAAA,CAAU,CAAC,IAAA,EAAM,CAAA,KAAM,CAAA,GAAI,KAAA,IAAS,CAAC,KAAA,CAAM,QAAA,CAAS,IAAI,CAAC,CAAA;AAC7E,QAAA,IAAA,GAAO,KAAA,IAAS,IAAI,KAAA,GAAQ,CAAA;AAAA,MAChC;AACA,MAAA;AAAA,IACJ,KAAK,SAAA;AACD,MAAA,IAAA,GAAO,KAAA,IAAS,CAAA,GAAI,KAAA,CAAM,MAAA,GAAS,IAAI,KAAA,GAAQ,CAAA;AAC/C,MAAA,IAAI,OAAA,EAAS;AACT,QAAA,MAAM,KAAA,GAAS,QAAA,CAAS,aAAA,CAA8B,OAAA,CAAQ,gBAAgB,CAAA;AAC9E,QAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,CAAC,MAAM,CAAA,KAAO,CAAA,GAAI,SAAS,CAAC,KAAA,CAAM,SAAS,IAAI,CAAA,GAAI,IAAI,EAAG,CAAA,CAAE,OAAO,CAAA,CAAA,KAAK,CAAA,IAAK,CAAC,CAAA,CAAE,GAAA,EAAI;AAC7G,QAAA,IAAA,GAAO,MAAA,IAAU,MAAM,MAAA,GAAS,CAAA;AAAA,MACpC;AACA,MAAA;AAAA,IACJ,KAAK,YAAA;AACD,MAAA,IAAI,OAAA,SAAgB,IAAA,CAAK,GAAA,CAAI,MAAM,MAAA,GAAS,CAAA,EAAG,QAAQ,CAAC,CAAA;AACxD,MAAA;AAAA,IACJ,KAAK,WAAA;AACD,MAAA,IAAI,SAAS,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAC,CAAA;AACzC,MAAA;AAAA,IACJ,KAAK,MAAA;AACD,MAAA,IAAA,GAAO,CAAA;AACP,MAAA;AAAA,IACJ,KAAK,KAAA;AACD,MAAA,IAAA,GAAO,MAAM,MAAA,GAAS,CAAA;AACtB,MAAA;AAAA;AAER,EAAA,IAAI,QAAQ,CAAA,EAAG;AACX,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,KAAA,CAAM,IAAI,EAAG,KAAA,EAAM;AAAA,EACvB;AACJ;AAMO,SAAS,UAAA,CAAW,EAAE,KAAA,EAAO,OAAA,EAAS,SAAS,MAAA,EAAQ,SAAA,GAAY,MAAK,EAAqH;AAChM,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,QAAA,EAAS;AACvB,EAAA,MAAM,CAAC,CAAA,EAAG,IAAI,CAAA,GAAIG,SAAS,EAAE,CAAA;AAC7B,EAAA,MAAM,KAAK,KAAA,EAAM;AACjB,EAAA,MAAM,KAAA,GAAQC,OAAyB,IAAI,CAAA;AAC3C,EAAA,MAAM,KAAA,GAAQC,QAAQ,MAAM;AACxB,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,IAAA,EAAK,CAAE,WAAA,EAAY;AACpC,IAAA,OAAO,WAAW,EAAA,GAAK,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAA,MAAA,KAAU,OAAO,KAAA,CAAM,WAAA,GAAc,QAAA,CAAS,MAAM,KAAK,MAAA,CAAO,IAAA,CAAK,aAAY,CAAE,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,EACvJ,CAAA,EAAG,CAAC,OAAA,EAAS,CAAC,CAAC,CAAA;AACf,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIF,QAAAA,CAAS,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,CAAQ,UAAU,CAAA,MAAA,KAAU,MAAA,CAAO,IAAA,KAAS,OAAO,CAAC,CAAC,CAAA;AAE5G,EAAAG,UAAU,MAAM;AACZ,IAAA,IAAI,SAAA,IAAa,YAAA,EAAa,EAAG,KAAA,CAAM,SAAS,KAAA,EAAM;AAAA,EAC1D,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AACd,EAAAA,UAAU,MAAM;AACZ,IAAA,IAAI,CAAA,KAAM,EAAA,EAAI,SAAA,CAAU,CAAC,CAAA;AAAA,EAC7B,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA;AACN,EAAAA,UAAU,MAAM;AACZ,IAAA,YAAA,CAAa,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,MAAA,EAAQ,EAAE,CAAC,CAAA;AAEf,EAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAAyB;AACxC,IAAA,MAAM,IAAA,GAAO,MAAM,MAAA,GAAS,CAAA;AAC5B,IAAA,IAAI,KAAA,CAAM,QAAQ,WAAA,EAAa;AAC3B,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,SAAA,CAAU,CAAA,KAAA,KAAU,KAAA,IAAS,IAAA,GAAO,CAAA,GAAI,QAAQ,CAAE,CAAA;AAAA,IACtD,CAAA,MAAA,IAAW,KAAA,CAAM,GAAA,KAAQ,SAAA,EAAW;AAChC,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,SAAA,CAAU,CAAA,KAAA,KAAU,KAAA,IAAS,CAAA,GAAI,IAAA,GAAO,QAAQ,CAAE,CAAA;AAAA,IACtD,CAAA,MAAA,IAAW,KAAA,CAAM,GAAA,KAAQ,MAAA,IAAU,MAAM,EAAA,EAAI;AACzC,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,SAAA,CAAU,CAAC,CAAA;AAAA,IACf,CAAA,MAAA,IAAW,KAAA,CAAM,GAAA,KAAQ,KAAA,IAAS,MAAM,EAAA,EAAI;AACxC,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,SAAA,CAAU,IAAI,CAAA;AAAA,IAClB,CAAA,MAAA,IAAW,KAAA,CAAM,GAAA,KAAQ,OAAA,EAAS;AAC9B,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,MAAM,MAAA,GAAS,MAAM,MAAM,CAAA;AAC3B,MAAA,IAAI,MAAA,KAAW,MAAA,EAAW,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAAA,IAChD;AAAA,EACJ,CAAA;AAEA,EAAA,uBACIC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAW,SAAA,EACtB,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACX,QAAA,EAAA;AAAA,sBAAAP,IAAC,MAAA,EAAA,EAAO,IAAA,EAAM,IAAI,WAAA,EAAa,GAAA,EAAK,eAAW,IAAA,EAAC,CAAA;AAAA,sBAChDA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACG,GAAA,EAAK,KAAA;AAAA,UACL,IAAA,EAAK,QAAA;AAAA,UACL,IAAA,EAAK,UAAA;AAAA,UACL,eAAA,EAAc,MAAA;AAAA,UACd,eAAA,EAAe,GAAG,EAAE,CAAA,KAAA,CAAA;AAAA,UACpB,uBAAA,EAAuB,MAAM,MAAM,CAAA,KAAM,SAAY,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,GAAK,MAAA;AAAA,UACzE,YAAA,EAAY,EAAE,iBAAA,EAAmB,EAAE,QAAQ,KAAA,CAAM,WAAA,IAAe,CAAA;AAAA,UAChE,WAAA,EAAa,EAAE,cAAS,CAAA;AAAA,UACxB,KAAA,EAAO,CAAA;AAAA,UACP,QAAA,EAAU,CAAA,KAAA,KAAS,IAAA,CAAK,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,UAC1C,YAAA,EAAa;AAAA;AAAA;AACjB,KAAA,EACJ,CAAA;AAAA,oBACAO,IAAAA,CAAC,KAAA,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,EAAE,CAAA,KAAA,CAAA,EAAS,IAAA,EAAK,SAAA,EAAU,YAAA,EAAY,KAAA,EAAO,SAAA,EAAU,wBAAA,EAC9D,QAAA,EAAA;AAAA,MAAA,KAAA,CAAM,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,qBAChBP,GAAAA,CAAC,KAAA,EAAA,EAAsB,WAAW,CAAA,QAAA,EAAW,KAAA,KAAU,SAAS,WAAA,GAAc,EAAE,IAAI,YAAA,EAAc,MAAM,UAAU,KAAK,CAAA,EACnH,QAAA,kBAAAO,IAAAA,CAAC,KAAA,EAAA,EAAI,EAAA,EAAI,GAAG,EAAE,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,EAAI,IAAA,EAAK,UAAS,eAAA,EAAe,KAAA,KAAU,QAAQ,cAAA,EAAc,MAAA,CAAO,SAAS,OAAA,GAAU,MAAA,GAAS,QAAW,SAAA,EAAU,cAAA,EAAe,SAAS,MAAM,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,EAC5L,QAAA,EAAA;AAAA,wBAAAP,GAAAA,CAAC,UAAK,SAAA,EAAU,cAAA,EAAe,OAAO,MAAA,CAAO,KAAA,EAAQ,iBAAO,KAAA,EAAM,CAAA;AAAA,QACjE,MAAA,CAAO,IAAA,KAAS,OAAA,oBAAWA,IAAC,KAAA,EAAA,EAAM,SAAA,EAAU,eAAA,EAAgB,IAAA,EAAM,IAAI,WAAA,EAAa,CAAA,EAAG,YAAA,EAAY,CAAA,CAAE,SAAS,CAAA,EAAG;AAAA,OAAA,EACrH,CAAA,EAAA,EAJM,MAAA,CAAO,IAKjB,CACH,CAAA;AAAA,MACA,MAAM,MAAA,KAAW,CAAA,oBAAKA,GAAAA,CAAC,SAAI,SAAA,EAAU,eAAA,EAAiB,QAAA,EAAA,CAAA,CAAE,sCAAA,EAA8B,EAAE,KAAA,EAAO,CAAA,CAAE,IAAA,EAAK,EAAG,CAAA,EAAE;AAAA,KAAA,EAChH;AAAA,GAAA,EACJ,CAAA;AAER;AC9HA,IAAM,iBAAA,GAAmC;AAAA,EACrC,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,SAAA,EAAU;AAAA,EAC/B,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,OAAA;AACzB,CAAA;AAEA,IAAM,eAAA,GAAiC;AAAA,EACnC,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,0BAAA,EAA2B;AAAA,EACnD,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,yBAAA,EAA0B;AAAA,EAClD,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,iBAAA,EAAkB;AAAA,EAC1C,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,uBAAA,EAAwB;AAAA,EAChD,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,mBAAA,EAAoB;AAAA,EAC5C,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,yBAAA;AAC5B,CAAA;AAEA,IAAM,cAAA,GAAiB,CAAC,KAAA,EAAO,mBAAA,EAAqB,eAAA,EAAiB,iBAAiB,kBAAA,EAAoB,aAAA,EAAe,kBAAA,EAAoB,qBAAA,EAAuB,YAAY,CAAA;AAEhL,SAAS,SAAA,GAA2B;AAChC,EAAA,MAAM,YAAa,IAAA,CAAsE,iBAAA;AACzF,EAAA,MAAM,QAAQ,OAAO,SAAA,KAAc,UAAA,GAAa,SAAA,CAAU,UAAU,CAAA,GAAI,cAAA;AACxE,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAA,IAAA,MAAS,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA,EAAE,CAAE,CAAA;AAC7E;AAEO,SAAS,MAAA,CAAO,EAAE,IAAA,GAAO,EAAA,EAAG,EAAsB;AACrD,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,QAAA,EAAS;AAC3B,EAAA,MAAM,EAAE,QAAO,GAAI,KAAA;AACnB,EAAA,uBACIA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EAAa,KAAA,EAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAK,EAAG,eAAY,MAAA,EAC1E,QAAA,EAAA,MAAA,CAAO,SAAA,KAAc,MAAA,mBAAYA,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,OAAO,SAAA,EAAW,GAAA,EAAI,EAAA,EAAG,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,CAAA,GAAK,OAAO,QAAA,EAChH,CAAA;AAER;AASO,SAAS,WAAA,CAAY,EAAE,MAAA,GAAS,KAAA,EAAO,QAAO,EAA8C;AAC/F,EAAA,MAAM,EAAE,KAAA,EAAO,CAAA,EAAG,aAAa,aAAA,EAAe,QAAA,KAAa,QAAA,EAAS;AACpE,EAAA,MAAM,EAAE,QAAO,GAAI,KAAA;AACnB,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,IAAW,EAAC;AAClC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIG,SAAe,MAAM,CAAA;AAC7C,EAAA,MAAM,IAAA,GAAOC,OAAuB,IAAI,CAAA;AAExC,EAAA,MAAM,GAAA,GAAM,SAAS,CAAA,GAAI,EAAA;AACzB,EAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,iBAAA;AACvC,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,eAAA;AACnC,EAAA,MAAM,KAAA,GAAQC,OAAAA,CAAQ,MAAO,IAAA,KAAS,UAAA,GAAa,SAAA,EAAU,GAAI,EAAC,EAAI,CAAC,IAAI,CAAC,CAAA;AAE5E,EAAAC,UAAU,MAAM;AACZ,IAAA,IAAI,IAAA,KAAS,UAAU,MAAA,EAAQ;AAE/B,IAAA,IAAA,CAAK,OAAA,EAAS,aAAA,CAA2B,mBAAmB,CAAA,EAAG,KAAA,EAAM;AAAA,EACzE,CAAA,EAAG,CAAC,IAAA,EAAM,MAAM,CAAC,CAAA;AAEjB,EAAA,MAAM,KAAA,GAAQ,CAAC,OAAA,EAAwB,IAAA,EAA0B,QAAA,KAAqB,OAAA,CAAQ,IAAA,CAAK,CAAA,MAAA,KAAU,MAAA,CAAO,IAAA,KAAS,IAAI,CAAA,EAAG,SAAS,IAAA,IAAQ,QAAA;AACrJ,EAAA,MAAM,IAAA,mBACFC,IAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,iCAAA,EAAkC,OAAA,EAAS,MAAM,OAAA,CAAQ,MAAM,CAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAP,IAAC,SAAA,EAAA,EAAU,IAAA,EAAM,IAAI,WAAA,EAAa,GAAA,EAAK,eAAW,IAAA,EAAC,CAAA;AAAA,oBACnDA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,cAAA,EAAgB,QAAA,EAAA,CAAA,CAAE,SAAS,CAAA,EAAE;AAAA,GAAA,EACjD,CAAA;AAEJ,EAAA,MAAM,IAAA,GAAO,CAAqD,GAAA,KAAW,CAAC,IAAA,KAAiB;AAC3F,IAAA,aAAA,CAAc,KAAK,IAAI,CAAA;AACvB,IAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,EAClB,CAAA;AAEA,EAAA,IAAI,SAAS,UAAA,EAAY,uBAAOO,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2BAAA,EAA6B,QAAA,EAAA;AAAA,IAAA,IAAA;AAAA,oBAAKP,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,EAAE,UAAU,CAAA,EAAG,OAAA,EAAS,SAAA,EAAW,SAAS,WAAA,CAAY,MAAA,EAAQ,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA,EAAG;AAAA,GAAA,EAAE,CAAA;AAC9L,EAAA,IAAI,SAAS,QAAA,EAAU,uBAAOO,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2BAAA,EAA6B,QAAA,EAAA;AAAA,IAAA,IAAA;AAAA,oBAAKP,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,EAAE,iBAAiB,CAAA,EAAG,OAAA,EAAS,OAAA,EAAS,SAAS,WAAA,CAAY,cAAA,EAAgB,MAAA,EAAQ,IAAA,CAAK,gBAAgB,CAAA,EAAG;AAAA,GAAA,EAAE,CAAA;AACjN,EAAA,IAAI,SAAS,UAAA,EAAY,uBAAOO,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2BAAA,EAA6B,QAAA,EAAA;AAAA,IAAA,IAAA;AAAA,oBAAKP,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,EAAE,WAAW,CAAA,EAAG,OAAA,EAAS,KAAA,EAAO,SAAS,WAAA,CAAY,QAAA,EAAU,MAAA,EAAQ,IAAA,CAAK,UAAU,CAAA,EAAG;AAAA,GAAA,EAAE,CAAA;AAE/L,EAAA,MAAM,MAAA,GAAwE;AAAA,IAC1E,EAAE,OAAO,QAAA,EAAU,KAAA,EAAO,EAAE,QAAQ,CAAA,EAAG,MAAM,OAAA,EAAQ;AAAA,IACrD,EAAE,OAAO,OAAA,EAAS,KAAA,EAAO,EAAE,OAAO,CAAA,EAAG,MAAM,GAAA,EAAI;AAAA,IAC/C,EAAE,OAAO,MAAA,EAAQ,KAAA,EAAO,EAAE,MAAM,CAAA,EAAG,MAAM,IAAA;AAAK,GAClD;AAEA,EAAA,uBACIO,KAAC,KAAA,EAAA,EAAI,GAAA,EAAK,MAAM,SAAA,EAAW,CAAA,0BAAA,EAA6B,MAAA,GAAS,WAAA,GAAc,EAAE,CAAA,CAAA,EAAI,MAAK,MAAA,EAAO,YAAA,EAAY,CAAA,CAAE,SAAS,CAAA,EAAG,SAAA,EAAW,WAAS,aAAA,CAAc,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA,EAC5K,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACX,QAAA,EAAA;AAAA,sBAAAP,GAAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAM,EAAA,EAAI,CAAA;AAAA,sBAClBO,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACX,QAAA,EAAA;AAAA,wBAAAP,GAAAA,CAAC,UAAK,SAAA,EAAU,+BAAA,EAAgC,OAAO,MAAA,CAAO,IAAA,EAAO,iBAAO,IAAA,EAAK,CAAA;AAAA,wBACjFA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gCAAgC,QAAA,EAAA,OAAA,CAAQ,YAAA,IAAgB,CAAA,CAAE,wBAAwB,CAAA,EAAE;AAAA,OAAA,EACxG;AAAA,KAAA,EACJ,CAAA;AAAA,oBACAO,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EAAW,MAAK,MAAA,EAC1B,QAAA,EAAA;AAAA,MAAA,OAAA,CAAQ,UAAA,KAAe,MAAA,oBACpBA,IAAAA,CAAC,OAAE,IAAA,EAAK,UAAA,EAAW,QAAA,EAAU,GAAA,EAAK,WAAU,wBAAA,EAAyB,IAAA,EAAM,OAAA,CAAQ,UAAA,EAAY,SAAS,MAAA,EACpG,QAAA,EAAA;AAAA,wBAAAP,IAAC,SAAA,EAAA,EAAU,IAAA,EAAM,IAAI,WAAA,EAAa,GAAA,EAAK,eAAW,IAAA,EAAC,CAAA;AAAA,wBACnDA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,cAAA,EAAgB,QAAA,EAAA,CAAA,CAAE,sBAAsB,CAAA,EAAE,CAAA;AAAA,wBAC1DA,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,eAAA,EAAgB,MAAM,EAAA,EAAI,WAAA,EAAa,GAAA,EAAK,aAAA,EAAW,IAAA,EAAC;AAAA,OAAA,EACpF,CAAA;AAAA,sBAEJO,IAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAA,EAAW,UAAU,GAAA,EAAK,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,0BAAyB,eAAA,EAAc,SAAA,EAAU,SAAS,MAAM,OAAA,CAAQ,UAAU,CAAA,EAC7I,QAAA,EAAA;AAAA,wBAAAP,IAAC,KAAA,EAAA,EAAM,IAAA,EAAM,IAAI,WAAA,EAAa,GAAA,EAAK,eAAW,IAAA,EAAC,CAAA;AAAA,wBAC/CA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,cAAA,EAAgB,QAAA,EAAA,CAAA,CAAE,UAAU,CAAA,EAAE,CAAA;AAAA,wBAC9CA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EAA8B,gBAAM,SAAA,EAAW,WAAA,CAAY,MAAA,EAAQ,SAAS,CAAA,EAAE,CAAA;AAAA,wBAC9FA,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,eAAA,EAAgB,MAAM,EAAA,EAAI,WAAA,EAAa,GAAA,EAAK,aAAA,EAAW,IAAA,EAAC;AAAA,OAAA,EACpF,CAAA;AAAA,sBACAO,IAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAA,EAAW,UAAU,GAAA,EAAK,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,0BAAyB,eAAA,EAAc,SAAA,EAAU,SAAS,MAAM,OAAA,CAAQ,QAAQ,CAAA,EAC3I,QAAA,EAAA;AAAA,wBAAAP,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAmB,eAAY,MAAA,EAAO,CAAA;AAAA,wBACtDA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,cAAA,EAAgB,QAAA,EAAA,CAAA,CAAE,iBAAiB,CAAA,EAAE,CAAA;AAAA,wBACrDA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EAA8B,QAAA,EAAA,KAAA,CAAM,OAAA,EAAS,WAAA,CAAY,cAAA,EAAgB,CAAA,CAAE,WAAW,CAAC,CAAA,EAAE,CAAA;AAAA,wBACzGA,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,eAAA,EAAgB,MAAM,EAAA,EAAI,WAAA,EAAa,GAAA,EAAK,aAAA,EAAW,IAAA,EAAC;AAAA,OAAA,EACpF,CAAA;AAAA,sBACAO,IAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAA,EAAW,UAAU,GAAA,EAAK,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,0BAAyB,eAAA,EAAc,SAAA,EAAU,SAAS,MAAM,OAAA,CAAQ,UAAU,CAAA,EAC7I,QAAA,EAAA;AAAA,wBAAAP,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAmB,eAAY,MAAA,EAAO,CAAA;AAAA,wBACtDA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,cAAA,EAAgB,QAAA,EAAA,CAAA,CAAE,WAAW,CAAA,EAAE,CAAA;AAAA,wBAC/CA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EAA+B,QAAA,EAAA,CAAA,WAAA,CAAY,QAAA,IAAY,CAAA,CAAE,WAAW,CAAA,EAAG,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA,EAAE,CAAA;AAAA,wBAC1GA,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,eAAA,EAAgB,MAAM,EAAA,EAAI,WAAA,EAAa,GAAA,EAAK,aAAA,EAAW,IAAA,EAAC;AAAA,OAAA,EACpF,CAAA;AAAA,sBACAO,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAY,MAAK,OAAA,EAAQ,YAAA,EAAY,CAAA,CAAE,OAAO,CAAA,EACzD,QAAA,EAAA;AAAA,wBAAAP,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EAAmB,QAAA,EAAA,CAAA,CAAE,OAAO,CAAA,EAAE,CAAA;AAAA,wBAC9CA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBACV,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,2BACRO,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEG,IAAA,EAAK,QAAA;AAAA,YACL,IAAA,EAAK,eAAA;AAAA,YACL,QAAA,EAAU,GAAA;AAAA,YACV,cAAA,EAAc,WAAA,CAAY,KAAA,KAAU,KAAA,CAAM,KAAA;AAAA,YAC1C,SAAA,EAAW,WAAA,CAAY,KAAA,KAAU,KAAA,CAAM,QAAQ,OAAA,GAAU,EAAA;AAAA,YACzD,OAAA,EAAS,MAAM,aAAA,CAAc,OAAA,EAAS,MAAM,KAAK,CAAA;AAAA,YAEjD,QAAA,EAAA;AAAA,8BAAAP,GAAAA,CAAC,MAAM,IAAA,EAAN,EAAW,MAAM,EAAA,EAAI,WAAA,EAAa,GAAA,EAAK,aAAA,EAAW,IAAA,EAAC,CAAA;AAAA,cACnD,KAAA,CAAM;AAAA;AAAA,WAAA;AAAA,UATF,KAAA,CAAM;AAAA,SAWlB,CAAA,EACL;AAAA,OAAA,EACJ;AAAA,KAAA,EACJ,CAAA;AAAA,IAAA,CACE,OAAA,CAAQ,gBAAA,KAAqB,MAAA,IAAa,OAAA,CAAQ,UAAA,KAAe,MAAA,qBAC/DO,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EAAyB,IAAA,EAAK,MAAA,EAGxC,QAAA,EAAA;AAAA,MAAA,OAAA,CAAQ,gBAAA,KAAqB,MAAA,oBAC1BA,IAAAA,CAAC,OAAE,IAAA,EAAK,UAAA,EAAW,QAAA,EAAU,GAAA,EAAK,WAAU,wBAAA,EAAyB,IAAA,EAAM,OAAA,CAAQ,gBAAA,EAAkB,SAAS,MAAA,EAC1G,QAAA,EAAA;AAAA,wBAAAP,IAAC,KAAA,EAAA,EAAM,IAAA,EAAM,IAAI,WAAA,EAAa,GAAA,EAAK,eAAW,IAAA,EAAC,CAAA;AAAA,wBAC/CA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,cAAA,EAAgB,QAAA,EAAA,CAAA,CAAE,gBAAgB,CAAA,EAAE;AAAA,OAAA,EACxD,CAAA;AAAA,MAEH,OAAA,CAAQ,UAAA,KAAe,MAAA,oBACpBO,KAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAA,EAAW,QAAA,EAAU,KAAK,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,wBAAA,EAAyB,SAAS,MAAM;AAAE,QAAA,MAAA,IAAS;AAAG,QAAA,QAAA,CAAS,QAAQ,UAAA,EAAa,EAAE,QAAQ,OAAA,CAAQ,aAAA,IAAiB,QAAQ,CAAA;AAAA,MAAG,CAAA,EAC7L,QAAA,EAAA;AAAA,wBAAAP,IAAC,MAAA,EAAA,EAAO,IAAA,EAAM,IAAI,WAAA,EAAa,GAAA,EAAK,eAAW,IAAA,EAAC,CAAA;AAAA,wBAChDA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,cAAA,EAAgB,QAAA,EAAA,CAAA,CAAE,UAAU,CAAA,EAAE;AAAA,OAAA,EAClD;AAAA,KAAA,EAER;AAAA,GAAA,EAER,CAAA;AAER;AC1IO,IAAM,QAAA,GAA6C;AAAA,EACtD,EAAA,EAAI,GAAA;AAAA,EACJ,OAAA,EAAS,GAAA;AAAA,EACT,MAAA,EAAQ,EAAA;AAAA,EACR,SAAA,EAAW,GAAA;AAAA,EACX,IAAA,EAAM,EAAA;AAAA,EACN,KAAA,EAAO,GAAA;AAAA,EACP,KAAA,EAAO,GAAA;AAAA,EACP,MAAA,EAAQ,GAAA;AAAA,EACR,SAAA,EAAW,GAAA;AAAA,EACX,KAAA,EAAO,GAAA;AAAA,EACP,GAAA,EAAK,EAAA;AAAA,EACL,OAAA,EAAS,CAAA;AAAA,EACT,MAAA,EAAQ,GAAA;AAAA,EACR,OAAA,EAAS;AACb;AAGO,SAAS,MAAA,CAAO,KAAa,KAAA,EAAyB;AACzD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG,OAAA,CAAS,KAAA,GAAQ,GAAA,GAAO,GAAA,IAAO,GAAA;AACxF,EAAA,MAAM,KAAA,GAAQ,SAAS,GAAG,CAAA;AAC1B,EAAA,IAAI,KAAA,KAAU,QAAW,OAAO,KAAA;AAChC,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,IAAA,GAAA,CAAQ,IAAA,GAAO,KAAK,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA,IAAK,GAAA;AAClE,EAAA,OAAO,IAAA;AACX;AAaO,SAAS,iBAAA,CAAkB,EAAA,EAAa,IAAA,EAAe,IAAA,EAAgF;AAC1I,EAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,EAAA,EAAI,IAAI,CAAA;AACrC,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,iBAAA,EAAmB,OAAO,EAAE,MAAA,EAAQ,iBAAA,EAAmB,IAAA,EAAM,IAAA,KAAS,MAAA,GAAY,IAAA,GAAO,YAAA,CAAa,IAAA,EAAM,IAAI,CAAA,EAAE;AACtI,EAAA,IAAI,CAAC,EAAA,IAAM,OAAO,IAAA,KAAS,QAAA,IAAY,SAAS,IAAA,IAAQ,CAAC,KAAA,CAAM,OAAA,CAAS,KAA4B,IAAI,CAAA,EAAG,OAAO,EAAE,QAAQ,aAAA,EAAc;AAC1I,EAAA,MAAM,OAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,KAAA,IAAU,KAA6B,IAAA,EAAM;AACpD,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AACjD,IAAA,MAAM,GAAA,GAAM,KAAA;AACZ,IAAA,IAAI,OAAO,GAAA,CAAI,GAAA,KAAQ,YAAY,OAAO,GAAA,CAAI,SAAS,QAAA,EAAU;AACjE,IAAA,MAAM,cAAA,GAAiB,IAAI,eAAA,KAAoB,KAAA;AAC/C,IAAA,MAAM,MAAA,GAAS,OAAO,GAAA,CAAI,UAAA,KAAe,QAAA,IAAY,eAAA,CAAgB,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA,GAAI,GAAA,CAAI,UAAA,GAAa,IAAA;AAC7G,IAAA,MAAM,SAAA,GAAY,OAAO,GAAA,CAAI,aAAA,KAAkB,QAAA,IAAY,eAAA,CAAgB,IAAA,CAAK,GAAA,CAAI,aAAa,CAAA,GAAI,GAAA,CAAI,aAAA,GAAgB,IAAA;AACzH,IAAA,MAAM,GAAA,GAAM,cAAA,GAAiB,MAAA,GAAS,SAAA,IAAa,MAAA;AACnD,IAAA,IAAI,QAAQ,IAAA,EAAM;AAClB,IAAA,MAAM,OAAA,GAAU,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,GAAW,GAAA,CAAI,OAAA,GAAU,OAAO,GAAA,CAAI,WAAA,KAAgB,QAAA,GAAW,GAAA,CAAI,WAAA,GAAc,IAAA;AACxH,IAAA,IAAA,CAAK,IAAA,CAAK;AAAA,MACN,KAAK,GAAA,CAAI,GAAA;AAAA,MACT,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,OAAA;AAAA,MACA,GAAA,EAAK,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,IAAI,GAAG,CAAA;AAAA,MAC5B,OAAA,EAAS,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA;AAAA,MACnC,WAAA,EAAa,aAAA,CAAc,GAAA,CAAI,aAAa,CAAA;AAAA,MAC5C,GAAA;AAAA,MACA;AAAA,KACH,CAAA;AAAA,EACL;AACA,EAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAK;AACnC;AAEA,IAAI,IAAA,GAAwE,IAAA;AAGrE,SAAS,eAAA,CAAgB,KAAa,OAAA,EAAmD;AAC5F,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIG,QAAAA,CAA4B,MAAO,IAAA,KAAS,IAAA,IAAQ,IAAA,CAAK,GAAA,KAAQ,MAAM,IAAA,CAAK,KAAA,GAAQ,EAAE,MAAA,EAAQ,WAAY,CAAA;AACpI,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,CAAC,CAAA;AACxC,EAAAG,UAAU,MAAM;AAEZ,IAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,CAAK,GAAA,KAAQ,GAAA,IAAO,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,GAAA,EAAI,IAAK,OAAA,KAAY,CAAA,EAAG;AAC/E,MAAA,QAAA,CAAS,KAAK,KAAK,CAAA;AACnB,MAAA;AAAA,IACJ;AACA,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,IAAI,IAAA,KAAS,QAAQ,IAAA,CAAK,GAAA,KAAQ,KAAK,QAAA,CAAS,EAAE,MAAA,EAAQ,SAAA,EAAW,CAAA;AACrE,IAAA,KAAA,CAAM,KAAK,EAAE,WAAA,EAAa,aAAA,EAAe,OAAA,EAAS,EAAE,MAAA,EAAQ,kBAAA,EAAmB,EAAG,MAAA,EAAQ,WAAW,MAAA,EAAQ,CAAA,CACxG,IAAA,CAAK,OAAM,QAAA,KAAY;AACpB,MAAA,IAAI,IAAA,GAAgB,IAAA;AACpB,MAAA,IAAI;AACA,QAAA,IAAA,GAAO,MAAM,SAAS,IAAA,EAAK;AAAA,MAC/B,CAAA,CAAA,MAAQ;AACJ,QAAA,IAAA,GAAO,IAAA;AAAA,MACX;AACA,MAAA,MAAM,OAAO,iBAAA,CAAkB,QAAA,CAAS,EAAA,EAAI,IAAA,EAAM,OAAO,QAAQ,CAAA;AACjE,MAAA,MAAM,OAAA,GAAU,OAAQ,IAAA,EAAsC,aAAA,KAAkB,WAAW,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAI,IAAA,CAAmC,aAAa,CAAC,CAAA,GAAI,EAAA;AAC1K,MAAA,IAAI,IAAA,CAAK,WAAW,OAAA,EAAS;AACzB,QAAA,IAAA,GAAO,EAAE,KAAK,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA,GAAU,GAAA,EAAK;AAC9D,QAAA,kBAAA,CAAmB,IAAA,CAAK,KAAK,GAAA,CAAI,CAAA,GAAA,MAAQ,EAAE,GAAA,EAAK,GAAA,CAAI,KAAK,IAAA,EAAM,GAAA,CAAI,MAAM,UAAA,EAAY,GAAA,CAAI,KAAK,QAAA,EAAU,GAAA,CAAI,SAAS,aAAA,EAAe,GAAA,CAAI,WAAA,EAAY,CAAE,CAAC,CAAA;AAAA,MAC3J;AACA,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACjB,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAmB;AACvB,MAAA,IAAK,OAA6B,IAAA,KAAS,YAAA,WAAuB,EAAE,MAAA,EAAQ,eAAe,CAAA;AAAA,IAC/F,CAAC,CAAA;AACL,IAAA,OAAO,MAAM,WAAW,KAAA,EAAM;AAAA,EAClC,CAAA,EAAG,CAAC,GAAA,EAAK,OAAA,EAAS,OAAO,CAAC,CAAA;AAC1B,EAAA,OAAO,CAAC,KAAA,EAAO,WAAA,CAAY,MAAM,UAAA,CAAW,CAAA,KAAA,KAAS,KAAA,GAAQ,CAAC,CAAA,EAAG,EAAE,CAAC,CAAA;AACxE;AAEO,SAAS,OAAA,CAAQ,EAAE,GAAA,EAAK,OAAA,EAAQ,EAAwC;AAC3E,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIH,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,QAAQ,EAAE,WAAA,EAAa,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,EAAE;AAC7C,EAAA,uBACII,IAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACG,MAAM,GAAA,CAAI,GAAA;AAAA,MACV,SAAA,EAAW,WAAW,OAAA,GAAU,YAAA,GAAe,EAAE,CAAA,CAAA,EAAI,GAAA,CAAI,cAAA,GAAiB,EAAA,GAAK,cAAc,CAAA,CAAA;AAAA,MAC7F,cAAA,EAAc,UAAU,MAAA,GAAS,MAAA;AAAA,MACjC,YAAU,GAAA,CAAI,GAAA;AAAA,MAEd,QAAA,EAAA;AAAA,wBAAAP,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAe,OAAc,aAAA,EAAY,MAAA,EACpD,QAAA,EAAA,GAAA,CAAI,OAAA,KAAY,QAAQ,CAAC,MAAA,mBACtBO,IAAAA,CAAAC,UAAA,EACI,QAAA,EAAA;AAAA,0BAAAR,IAAC,KAAA,EAAA,EAAI,GAAA,EAAK,GAAA,CAAI,OAAA,EAAS,KAAI,EAAA,EAAG,SAAA,EAAW,GAAA,CAAI,WAAA,KAAgB,OAAO,oBAAA,GAAuB,EAAA,EAAI,SAAS,MAAM,SAAA,CAAU,IAAI,CAAA,EAAG,CAAA;AAAA,UAC9H,IAAI,WAAA,KAAgB,IAAA,oBAAQA,GAAAA,CAAC,SAAI,GAAA,EAAK,GAAA,CAAI,WAAA,EAAa,GAAA,EAAI,IAAG,SAAA,EAAU,mBAAA,EAAoB,SAAS,MAAM,SAAA,CAAU,IAAI,CAAA,EAAG;AAAA,SAAA,EACjI,CAAA,GAEA,SAAS,GAAA,CAAI,IAAA,CAAK,QAAQ,gBAAA,EAAkB,EAAE,CAAC,CAAA,EAEvD,CAAA;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EAA4B,KAAA,EAAO,GAAA,CAAI,IAAA,EAAO,QAAA,EAAA,GAAA,CAAI,IAAA,CAAK,OAAA,CAAQ,eAAA,EAAiB,EAAE,CAAA,EAAE,CAAA;AAAA,QACnG,GAAA,CAAI,OAAA,KAAY,IAAA,oBAAQA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAAA,EAA+B,KAAA,EAAO,GAAA,CAAI,OAAA,EAAU,QAAA,EAAA,GAAA,CAAI,OAAA,EAAQ;AAAA;AAAA;AAAA,GAC7G;AAER;AAMA,SAAS,QAAA,CAAS,OAAmC,SAAA,EAAqC;AACtF,EAAA,IAAI,cAAc,IAAA,EAAM;AACxB,EAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,gBAAA,CAA8B,UAAU,CAAC,CAAA;AAC5E,EAAA,MAAM,GAAA,GAAM,SAAA,CAAU,aAAA,CAA2B,eAAe,CAAA;AAChE,EAAA,MAAM,QAAQ,GAAA,KAAQ,IAAA,GAAO,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAA;AACnD,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,aAA4B,CAAA;AACjE,EAAA,IAAI,KAAA,GAAQ,CAAA,IAAK,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AACrC,EAAA,MAAM,KAAA,GAAQ,GAAA,KAAQ,IAAA,IAAQ,KAAA,KAAU,KAAA,CAAM,MAAA;AAC9C,EAAA,MAAM,KAAA,GAAgC,EAAE,UAAA,EAAY,CAAA,EAAG,WAAW,EAAA,EAAI,SAAA,EAAW,CAAA,EAAG,OAAA,EAAS,EAAA,EAAG;AAChG,EAAA,IAAI,IAAA,GAAO,KAAA;AACX,EAAA,IAAI,KAAA,EAAO;AACP,IAAA,IAAI,KAAA,CAAM,QAAQ,SAAA,IAAa,KAAA,CAAM,QAAQ,WAAA,EAAa,IAAA,GAAO,MAAM,MAAA,GAAS,CAAA;AAAA,SAAA,IACvE,KAAA,CAAM,GAAA,KAAQ,MAAA,EAAQ,IAAA,GAAO,CAAA;AAAA,SAAA,IAC7B,KAAA,CAAM,QAAQ,KAAA,IAAS,KAAA,CAAM,QAAQ,WAAA,IAAe,KAAA,CAAM,GAAA,KAAQ,YAAA,EAAc,IAAA,GAAO,KAAA;AAAA,SAC3F;AAAA,EACT,CAAA,MAAA,IAAW,KAAA,CAAM,GAAA,KAAQ,WAAA,IAAe,KAAA,GAAQ,CAAA,GAAI,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,GAAA,KAAQ,IAAA,EAAM,IAAA,GAAO,KAAA,CAAM,MAAA;AAAA,OAAA,IAC1F,KAAA,CAAM,GAAA,KAAQ,YAAA,IAAgB,KAAA,KAAU,KAAA,CAAM,SAAS,CAAA,IAAK,GAAA,KAAQ,IAAA,EAAM,IAAA,GAAO,KAAA,CAAM,MAAA;AAAA,OAAA,IACvF,MAAM,GAAA,IAAO,KAAA,EAAO,IAAA,GAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA,EAAG,KAAA,GAAQ,MAAM,KAAA,CAAM,GAAG,CAAE,CAAC,CAAA;AAAA,OAAA,IAC5F,KAAA,CAAM,GAAA,KAAQ,MAAA,EAAQ,IAAA,GAAO,CAAA;AAAA,OAAA,IAC7B,KAAA,CAAM,GAAA,KAAQ,KAAA,EAAO,IAAA,GAAO,MAAM,MAAA,GAAS,CAAA;AAAA,OAC/C;AACL,EAAA,KAAA,CAAM,cAAA,EAAe;AACrB,EAAA,KAAA,CAAM,KAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC,GAAG,KAAA,EAAM;AACpC;AAMO,SAAS,OAAA,CAAQ,EAAE,SAAA,GAAY,IAAA,EAAK,EAA4B;AACnE,EAAA,MAAM,EAAE,KAAA,EAAO,CAAA,EAAE,GAAI,QAAA,EAAS;AAC9B,EAAA,MAAM,CAAC,OAAO,KAAK,CAAA,GAAI,gBAAgB,KAAA,CAAM,IAAA,CAAK,YAAY,IAAI,CAAA;AAClE,EAAA,MAAM,GAAA,GAAMI,OAAuB,IAAI,CAAA;AACvC,EAAA,MAAM,eAAe,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAG,OAAA,CAAQ,IAAA;AAEtD,EAAAE,UAAU,MAAM;AACZ,IAAA,IAAI,CAAC,SAAA,IAAa,KAAA,CAAM,MAAA,KAAW,OAAA,EAAS;AAC5C,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,OAAA,EAAS,gBAAA,CAA8B,UAAU,CAAA;AACnE,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,OAAA,EAAS,aAAA,CAA2B,qBAAqB,CAAA;AAC7E,IAAA,CAAC,OAAA,IAAW,KAAA,GAAQ,CAAC,CAAA,GAAI,KAAA,EAAM;AAAA,EACnC,CAAA,EAAG,CAAC,KAAA,CAAM,MAAA,EAAQ,SAAS,CAAC,CAAA;AAE5B,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,KAAW,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,CAAA,GAAA,KAAO,GAAA,CAAI,cAAc,CAAA,GAAI,EAAC;AACxF,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,KAAW,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,CAAA,GAAA,KAAO,CAAC,GAAA,CAAI,cAAc,CAAA,GAAI,EAAC;AAEzF,EAAA,uBACIC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EAAyB,GAAA,EAAK,GAAA,EAAK,SAAA,EAAW,CAAA,KAAA,KAAS,QAAA,CAAS,KAAA,EAAO,GAAA,CAAI,OAAO,CAAA,EAC5F,QAAA,EAAA;AAAA,IAAA,KAAA,CAAM,MAAA,KAAW,SAAA,oBAAaP,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,eAAA,EAAgB,WAAA,EAAU,QAAA,EAAU,QAAA,EAAA,CAAA,CAAE,oBAAe,CAAA,EAAE,CAAA;AAAA,IAClG,KAAA,CAAM,WAAW,aAAA,oBACdO,KAAC,GAAA,EAAA,EAAE,SAAA,EAAU,eAAA,EAAgB,IAAA,EAAK,OAAA,EAC7B,QAAA,EAAA;AAAA,MAAA,CAAA,CAAE,2BAA2B,CAAA;AAAA,MAAE,GAAA;AAAA,sBAACP,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,UAAA,EAAW,OAAA,EAAS,KAAA,EAAQ,QAAA,EAAA,CAAA,CAAE,WAAW,CAAA,EAAE;AAAA,KAAA,EAChH,CAAA;AAAA,IAEH,KAAA,CAAM,WAAW,iBAAA,oBACdO,KAAC,GAAA,EAAA,EAAE,SAAA,EAAU,eAAA,EAAgB,IAAA,EAAK,OAAA,EAC7B,QAAA,EAAA;AAAA,MAAA,CAAA,CAAE,iCAAiC,CAAA;AAAA,MAAE,GAAA;AAAA,MAAE,KAAA,CAAM,IAAA,KAAS,IAAA,oBAAQP,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,UAAA,EAAW,IAAA,EAAM,KAAA,CAAM,IAAA,EAAO,QAAA,EAAA,CAAA,CAAE,SAAS,CAAA,EAAE;AAAA,KAAA,EAC3H,CAAA;AAAA,IAEH,MAAM,MAAA,KAAW,OAAA,oBACdO,IAAAA,CAAAC,UAAA,EACI,QAAA,EAAA;AAAA,sBAAAD,IAAAA,CAAC,SAAA,EAAA,EAAQ,YAAA,EAAY,YAAA,KAAiB,MAAA,GAAY,CAAA,CAAE,mBAAA,EAAqB,EAAE,YAAA,EAAc,CAAA,GAAI,CAAA,CAAE,WAAW,CAAA,EACtG,QAAA,EAAA;AAAA,wBAAAP,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kBAAA,EAAoB,2BAAiB,MAAA,GAAY,CAAA,CAAE,mBAAA,EAAqB,EAAE,YAAA,EAAc,CAAA,GAAI,CAAA,CAAE,WAAW,CAAA,EAAE,CAAA;AAAA,wBACzHA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YACV,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,yBAAOA,GAAAA,CAAC,WAAsB,GAAA,EAAU,OAAA,EAAS,IAAI,GAAA,KAAQ,KAAA,CAAM,IAAI,GAAA,EAAA,EAAlD,GAAA,CAAI,GAAmD,CAAE,CAAA,EAC5F,CAAA;AAAA,QACC,IAAA,CAAK,MAAA,KAAW,CAAA,oBAAKA,GAAAA,CAAC,OAAE,SAAA,EAAU,eAAA,EAAiB,QAAA,EAAA,CAAA,CAAE,mBAAmB,CAAA,EAAE;AAAA,OAAA,EAC/E,CAAA;AAAA,MACC,IAAA,CAAK,SAAS,CAAA,oBACXO,KAAC,SAAA,EAAA,EAAQ,YAAA,EAAY,CAAA,CAAE,gBAAgB,CAAA,EACnC,QAAA,EAAA;AAAA,wBAAAP,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kBAAA,EAAoB,QAAA,EAAA,CAAA,CAAE,gBAAgB,CAAA,EAAE,CAAA;AAAA,wBACtDA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACV,eAAK,GAAA,CAAI,CAAA,GAAA,qBAAOA,GAAAA,CAAC,WAAsB,GAAA,EAAU,OAAA,EAAS,SAA5B,GAAA,CAAI,GAA+B,CAAE,CAAA,EACxE;AAAA,OAAA,EACJ;AAAA,KAAA,EAER,CAAA;AAAA,oBAEJA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,eAAA,EACX,QAAA,kBAAAO,KAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qCAAA,EAAsC,IAAA,EAAM,MAAM,IAAA,CAAK,WAAA,IAAe,mBAAmB,MAAA,EAAO,QAAA,EAAS,KAAI,UAAA,EACtH,QAAA,EAAA;AAAA,sBAAAP,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAgB,QAAA,EAAA,CAAA,CAAE,cAAc,CAAA,EAAE,CAAA;AAAA,sBAClDA,GAAAA,CAACS,YAAAA,EAAA,EAAa,SAAA,EAAU,eAAA,EAAgB,IAAA,EAAM,EAAA,EAAI,WAAA,EAAa,GAAA,EAAK,aAAA,EAAW,IAAA,EAAC;AAAA,KAAA,EACpF,CAAA,EACJ;AAAA,GAAA,EACJ,CAAA;AAER;AAGO,SAAS,kBAAA,GAA2B;AACvC,EAAA,IAAA,GAAO,IAAA;AACX;;;AC9OA,IAAM,KAAA,GAAgC,CAAC,YAAA,EAAc,SAAA,EAAW,SAAS,CAAA;AAGlE,SAAS,WAAW,IAAA,EAAsB;AAC7C,EAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA,CAAE,OAAO,OAAO,CAAA;AACrD,EAAA,MAAM,OAAA,GAAU,MAAM,MAAA,GAAS,CAAA,GAAA,CAAK,MAAM,CAAC,CAAA,CAAG,CAAC,CAAA,IAAK,EAAA,KAAO,MAAM,CAAC,CAAA,CAAG,CAAC,CAAA,IAAK,EAAA,CAAA,GAAM,KAAK,IAAA,EAAK,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACvG,EAAA,OAAO,OAAA,CAAQ,aAAY,IAAK,GAAA;AACpC;AAEA,SAAS,OAAO,KAAA,EAAoC;AAChD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,MAAM,OAAO,IAAA;AACxD,EAAA,MAAM,GAAA,GAAM,KAAA;AACZ,EAAA,MAAM,EAAA,GAAK,OAAO,GAAA,CAAI,EAAA,KAAO,QAAA,IAAY,OAAO,GAAA,CAAI,EAAA,KAAO,QAAA,GAAW,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,GAAI,IAAA;AACvF,EAAA,IAAI,OAAO,IAAA,IAAQ,OAAO,GAAA,CAAI,IAAA,KAAS,UAAU,OAAO,IAAA;AACxD,EAAA,MAAM,IAAA,GAAoB,EAAE,EAAA,EAAI,IAAA,EAAM,IAAI,IAAA,EAAK;AAC/C,EAAA,IAAI,OAAO,IAAI,QAAA,KAAa,QAAA,IAAY,IAAI,QAAA,KAAa,EAAA,EAAI,IAAA,CAAK,QAAA,GAAW,GAAA,CAAI,QAAA;AACjF,EAAA,IAAI,OAAO,GAAA,CAAI,IAAA,KAAS,QAAA,IAAa,KAAA,CAA4B,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,EAAG,IAAA,CAAK,IAAA,GAAO,GAAA,CAAI,IAAA;AACrG,EAAA,IAAI,OAAO,IAAI,KAAA,KAAU,QAAA,IAAY,IAAI,KAAA,KAAU,EAAA,EAAI,IAAA,CAAK,KAAA,GAAQ,GAAA,CAAI,KAAA;AACxE,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,QAAA,IAAY,GAAA,CAAI,SAAA;AACjC,EAAA,IAAI,OAAO,IAAA,KAAS,SAAA,EAAW,IAAA,CAAK,QAAA,GAAW,IAAA;AAC/C,EAAA,OAAO,IAAA;AACX;AAMO,SAAS,cAAc,IAAA,EAAyB;AACnD,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,IAAI,IAAI,EAAE,IAAA,EAAM,IAAA,EAAK,GAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,IAAA,GAAQ,OAAmC,EAAC;AACzI,EAAA,MAAMC,KAAAA,GAAO,MAAM,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,GAAI,QAAA,CAAS,OAAO,EAAC;AAC7D,EAAA,MAAM,KAAA,GAAQA,MAAK,GAAA,CAAI,MAAM,EAAE,MAAA,CAAO,CAAC,IAAA,KAA8B,IAAA,KAAS,IAAI,CAAA;AAClF,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,WAAA,IAAe,QAAA,CAAS,UAAA;AAChD,EAAA,MAAM,aAAa,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,KAAK,MAAA,GAAS,IAAA;AAC1E,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,QAAA,IAAY,QAAA,CAAS,OAAA;AAC3C,EAAA,OAAO,EAAE,OAAO,OAAA,EAAA,CAAU,IAAA,KAAS,QAAQ,IAAA,KAAS,MAAA,KAAc,UAAA,KAAe,IAAA,EAAM,UAAA,EAAW;AACtG;AAMO,SAAS,QAAQ,GAAA,EAAkC;AACtD,EAAA,OAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,oBAAA,CAAqB,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAA,GAAI,GAAA,CAAI,IAAA,EAAK,GAAI,MAAA;AAC3F;AAGO,SAAS,SAAA,CAAU,KAAa,MAAA,EAA2D;AAC9F,EAAA,MAAM,CAAC,IAAA,EAAM,IAAA,GAAO,EAAE,CAAA,GAAI,GAAA,CAAI,MAAM,GAAG,CAAA;AACvC,EAAA,MAAM,CAAC,IAAA,EAAMC,MAAAA,GAAQ,EAAE,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AACzC,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgBA,MAAK,CAAA;AACxC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC/C,IAAA,IAAI,KAAA,KAAU,UAAa,KAAA,KAAU,IAAA,IAAQ,UAAU,EAAA,EAAI,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,EACpF;AACA,EAAA,MAAM,EAAA,GAAK,OAAO,QAAA,EAAS;AAC3B,EAAA,OAAO,IAAA,IAAQ,KAAK,CAAA,CAAA,EAAI,EAAE,KAAK,EAAA,CAAA,IAAO,IAAA,GAAO,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,GAAK,EAAA,CAAA;AAC9D;AAGO,SAAS,YAAA,CAAa,OAA0C,EAAA,EAA2B;AAC9F,EAAA,IAAI,MAAM,WAAA,KAAgB,MAAA,IAAa,KAAA,CAAM,WAAA,KAAgB,IAAI,OAAO,IAAA;AACxE,EAAA,OAAO,KAAA,CAAM,YAAY,KAAA,CAAM,MAAM,EAAE,IAAA,CAAK,kBAAA,CAAmB,EAAE,CAAC,CAAA;AACtE;AAEO,SAAS,SAAS,KAAA,EAA4D;AACjF,EAAA,OAAO,KAAA,CAAM,WAAA,IAAe,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,CAAA,CAAA;AAC9C;AAMO,SAAS,cAAA,CAAe,cAAsC,WAAA,EAA0D;AAC3H,EAAA,IAAI,gBAAgB,MAAA,EAAW;AAC3B,IAAA,MAAM,MAAA,GAAS,WAAA,CAAY,IAAA,EAAK,CAAE,WAAA,EAAY;AAC9C,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,IAAA,CAAK,CAAA,GAAA,KAAO,GAAA,CAAI,KAAK,IAAA,EAAK,CAAE,WAAA,EAAY,KAAM,MAAM,CAAA;AAC9E,IAAA,IAAI,IAAA,KAAS,QAAW,OAAO,IAAA;AAAA,EACnC;AACA,EAAA,OAAO,aAAa,CAAC,CAAA;AACzB;AAOO,SAAS,aAAA,CAAc,MAAA,EAAiC,MAAA,EAAgC,QAAA,EAA0C;AACrI,EAAA,MAAM,UAAkC,EAAC;AACzC,EAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,GAAG,OAAO,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,KAAW,OAAO,KAAA,CAAM,GAAG,MAAM,MAAA,GAAY,KAAA,GAAQ,EAAG,CAAC,CAAA;AAC5G,EAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,EAAO,KAAA,KAAU;AAC7B,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AAC3B,IAAA,IAAI,EAAA,KAAO,MAAA,EAAW,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,GAAI,EAAA;AAAA,SAAA,IAClC,QAAQ,OAAA,EAAS,OAAA,CAAQ,MAAM,GAAG,CAAA,GAAI,MAAM,OAAA,CAAQ,EAAA;AAAA,EACjE,CAAC,CAAA;AACD,EAAA,OAAA,CAAQ,SAAA,GAAY,QAAA;AACpB,EAAA,OAAO,OAAA;AACX;AAEA,SAAS,OAAO,IAAA,EAA6B;AACzC,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,IAAA;AAC5C,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,CAAE,IAAA,CAAK,CAAA,IAAA,KAAQ,IAAA,CAAK,UAAA,CAAW,CAAA,EAAG,IAAI,GAAG,CAAC,CAAA;AAClF,EAAA,OAAO,KAAA,KAAU,SAAY,IAAA,GAAO,kBAAA,CAAmB,MAAM,KAAA,CAAM,IAAA,CAAK,MAAA,GAAS,CAAC,CAAC,CAAA;AACvF;AAEA,SAAS,SAAA,GAA2B;AAChC,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,IAAA;AAC5C,EAAA,OAAO,QAAA,CAAS,aAAA,CAA+B,yBAAyB,CAAA,EAAG,OAAA,IAAW,IAAA;AAC1F;AAGA,eAAsB,WAAA,CAAyB,GAAA,EAAa,IAAA,GAAkE,EAAC,EAAe;AAC1I,EAAA,MAAM,OAAA,GAAkC,EAAE,MAAA,EAAQ,kBAAA,EAAoB,oBAAoB,gBAAA,EAAiB;AAC3G,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,cAAc,CAAA,GAAI,kBAAA;AACvD,EAAA,MAAM,IAAA,GAAO,OAAO,YAAY,CAAA;AAChC,EAAA,MAAM,OAAO,SAAA,EAAU;AACvB,EAAA,IAAI,IAAA,KAAS,IAAA,EAAM,OAAA,CAAQ,cAAc,CAAA,GAAI,IAAA;AAAA,OAAA,IACpC,IAAA,KAAS,IAAA,EAAM,OAAA,CAAQ,cAAc,CAAA,GAAI,IAAA;AAClD,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,IAC9B,MAAA,EAAQ,KAAK,MAAA,IAAU,KAAA;AAAA,IACvB,WAAA,EAAa,aAAA;AAAA,IACb,OAAA;AAAA,IACA,IAAA,EAAM,KAAK,IAAA,KAAS,MAAA,GAAY,SAAY,IAAA,CAAK,SAAA,CAAU,KAAK,IAAI,CAAA;AAAA,IACpE,QAAQ,IAAA,CAAK;AAAA,GAChB,CAAA;AACD,EAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,EAAA,IAAI,IAAA,GAAgB,IAAA;AACpB,EAAA,IAAI;AACA,IAAA,IAAA,GAAO,IAAA,KAAS,EAAA,GAAK,IAAA,GAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EAC/C,CAAA,CAAA,MAAQ;AACJ,IAAA,IAAA,GAAO,IAAA;AAAA,EACX;AACA,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI,MAAM,IAAI,iBAAA,CAAkB,QAAA,CAAS,QAAQ,IAAI,CAAA;AACnE,EAAA,OAAO,IAAA;AACX;AAEO,IAAM,iBAAA,GAAN,cAAgC,KAAA,CAAM;AAAA,EACzC,WAAA,CAAqB,QAAyB,IAAA,EAAe;AACzD,IAAA,KAAA,CAAM,CAAA,oBAAA,EAAuB,MAAM,CAAA,CAAE,CAAA;AADpB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAyB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAE9C;AAAA,EAFqB,MAAA;AAAA,EAAyB,IAAA;AAAA;AAAA,EAK9C,IAAI,MAAA,GAAwB;AACxB,IAAA,MAAM,IAAA,GAAO,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,IAAY,KAAK,IAAA,KAAS,IAAA,GAAQ,IAAA,CAAK,IAAA,GAAmC,EAAC;AAC7G,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,IAAA,EAAM;AAC/C,MAAA,KAAA,MAAW,QAAA,IAAY,MAAA,CAAO,MAAA,CAAO,MAAiC,CAAA,EAAG;AACrE,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,IAAK,OAAO,QAAA,CAAS,CAAC,CAAA,KAAM,QAAA,EAAU,OAAO,QAAA,CAAS,CAAC,CAAA;AACjF,QAAA,IAAI,OAAO,QAAA,KAAa,QAAA,EAAU,OAAO,QAAA;AAAA,MAC7C;AAAA,IACJ;AACA,IAAA,IAAI,OAAO,IAAA,CAAK,MAAA,KAAW,QAAA,SAAiB,IAAA,CAAK,MAAA;AACjD,IAAA,IAAI,OAAO,IAAA,CAAK,OAAA,KAAY,QAAA,SAAiB,IAAA,CAAK,OAAA;AAClD,IAAA,OAAO,IAAA;AAAA,EACX;AACJ,CAAA;AAGA,eAAsB,UAAA,CAAW,SAAA,EAAmB,IAAA,EAAc,MAAA,EAA8D;AAC5H,EAAA,MAAM,IAAA,GAA+B,EAAE,IAAA,EAAK;AAC5C,EAAA,IAAI,MAAA,KAAW,MAAA,EAAW,IAAA,CAAK,MAAA,GAAS,MAAA;AACxC,EAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAqC,SAAA,EAAW,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAA;AAC7F,EAAA,MAAM,KAAK,MAAA,EAAQ,EAAA;AACnB,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,MAAA,EAAQ,UAAA,IAAc,QAAQ,WAAW,CAAA;AACpE,EAAA,IAAK,OAAO,EAAA,KAAO,QAAA,IAAY,OAAO,EAAA,KAAO,QAAA,IAAa,eAAe,MAAA,EAAW;AAChF,IAAA,MAAM,IAAI,iBAAA,CAAkB,GAAA,EAAK,EAAE,OAAA,EAAS,mCAAmC,CAAA;AAAA,EACnF;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,MAAA,CAAO,EAAE,GAAG,UAAA,EAAW;AACxC;AAMO,IAAM,eAAA,GAAiC,CAAC,GAAA,EAAK,OAAA,GAAU,EAAC,KAAM;AACjE,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAA,CAAQ,GAAG,MAAM,MAAA,EAAW;AACjE,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAChB,IAAA,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,QAAA,EAAU,UAAU,CAAA;AACrC,IAAA;AAAA,EACJ;AACA,EAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,IAAU,KAAA,MAAW,KAAA,EAAO;AACrC,IAAA,MAAA,CAAO,QAAA,CAAS,OAAO,GAAG,CAAA;AAC1B,IAAA;AAAA,EACJ;AACA,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC1C,EAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,EAAA,IAAA,CAAK,MAAA,GAAS,GAAA;AACd,EAAA,IAAA,CAAK,MAAM,OAAA,GAAU,MAAA;AACrB,EAAA,MAAM,SAAkC,EAAE,GAAI,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG;AAClE,EAAA,MAAM,QAAQ,SAAA,EAAU;AACxB,EAAA,IAAI,KAAA,KAAU,IAAA,EAAM,MAAA,CAAO,MAAA,GAAS,KAAA;AACpC,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAChD,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,IAAA,KAAA,CAAM,IAAA,GAAO,QAAA;AACb,IAAA,KAAA,CAAM,IAAA,GAAO,IAAA;AACb,IAAA,KAAA,CAAM,KAAA,GAAQ,OAAO,KAAK,CAAA;AAC1B,IAAA,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,EACrB;AACA,EAAA,QAAA,CAAS,IAAA,CAAK,OAAO,IAAI,CAAA;AACzB,EAAA,IAAA,CAAK,MAAA,EAAO;AAChB,CAAA;AAGO,SAAS,eAAA,GAA0B;AACtC,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,GAAA;AAC1C,EAAA,OAAO,OAAO,QAAA,CAAS,QAAA,GAAW,OAAO,QAAA,CAAS,MAAA,GAAS,OAAO,QAAA,CAAS,IAAA;AAC/E;ACjNO,IAAM,WAAA,GAAc,GAAA;AAC3B,IAAM,SAAA,GAAY,EAAA;AAYlB,SAAS,SAAS,GAAA,EAAiC;AAC/C,EAAA,OAAO,aAAa,IAAA,CAAK,GAAG,CAAA,GAAI,MAAA,GAAY,OAAO,SAAS,CAAA;AAChE;AAGA,IAAMC,KAAAA,uBAAW,GAAA,EAAmF;AAG7F,SAAS,WAAA,GAAoB;AAChC,EAAAA,MAAK,KAAA,EAAM;AACX,EAAA,SAAA,GAAY,IAAA;AAChB;AAGA,IAAI,SAAA,GAA2B,IAAA;AAOxB,SAAS,WAAW,KAAA,EAAwB;AAC/C,EAAA,IAAI,SAAA,KAAc,OAAO,OAAO,KAAA;AAChC,EAAA,MAAM,UAAU,SAAA,KAAc,IAAA;AAC9B,EAAAA,MAAK,KAAA,EAAM;AACX,EAAA,SAAA,GAAY,KAAA;AACZ,EAAA,OAAO,OAAA;AACX;AAMO,SAAS,cAAA,CAAe,KAAyB,EAAE,CAAA,GAAI,IAAI,MAAA,EAAQ,OAAA,GAAU,MAAK,EAAkE;AACvJ,EAAA,MAAM,CAACD,MAAAA,EAAO,QAAQ,CAAA,GAAIR,SAAS,CAAC,CAAA;AACpC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,QAAAA,CAAgJ;AAAA,IACtK,GAAA,EAAK,EAAA;AAAA,IACL,OAAO,EAAC;AAAA,IACR,MAAA,EAAQ,SAAA;AAAA,IACR,OAAA,EAAS,KAAA;AAAA,IACT,UAAA,EAAY,IAAA;AAAA,IACZ,WAAA,EAAa;AAAA,GAChB,CAAA;AACD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,CAAC,CAAA;AACxC,EAAA,MAAM,KAAA,GAAQC,OAA+B,IAAI,CAAA;AAEjD,EAAAE,UAAU,MAAM;AACZ,IAAA,IAAI,MAAMK,MAAAA,EAAO;AACjB,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,QAAA,CAAS,CAAC,GAAG,WAAW,CAAA;AACvD,IAAA,OAAO,MAAM,aAAa,KAAK,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,CAAA,EAAGA,MAAK,CAAC,CAAA;AAEb,EAAA,MAAM,MAAM,GAAA,KAAQ,MAAA,GAAY,EAAA,GAAK,SAAA,CAAU,KAAK,EAAE,CAAA,EAAGA,MAAAA,CAAM,IAAA,IAAQ,MAAA,EAAQ,KAAA,EAAO,QAAA,CAAS,GAAG,GAAG,CAAA;AAErG,EAAAL,UAAU,MAAM;AACZ,IAAA,IAAI,CAAC,OAAA,IAAW,GAAA,KAAQ,MAAA,EAAW;AACnC,IAAA,MAAM,GAAA,GAAMM,KAAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AACxB,IAAA,IAAI,QAAQ,MAAA,EAAW;AACnB,MAAA,QAAA,CAAS,EAAE,GAAA,EAAK,KAAA,EAAO,GAAA,CAAI,OAAO,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,GAAA,CAAI,SAAS,UAAA,EAAY,GAAA,CAAI,UAAA,EAAY,WAAA,EAAa,OAAO,CAAA;AACzH,MAAA;AAAA,IACJ;AACA,IAAA,KAAA,CAAM,SAAS,KAAA,EAAM;AACrB,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,KAAA,CAAM,OAAA,GAAU,UAAA;AAChB,IAAA,QAAA,CAAS,CAAA,OAAA,MAAY,EAAE,GAAG,OAAA,EAAS,KAAK,MAAA,EAAQ,SAAA,EAAW,WAAA,EAAa,KAAA,EAAM,CAAE,CAAA;AAChF,IAAA,WAAA,CAAY,GAAA,EAAK,EAAE,MAAA,EAAQ,UAAA,CAAW,QAAQ,CAAA,CACzC,KAAK,CAAA,IAAA,KAAQ;AACV,MAAA,MAAM,IAAA,GAAO,cAAc,IAAI,CAAA;AAC/B,MAAA,IAAID,MAAAA,CAAM,MAAK,KAAM,EAAA,EAAIC,KAAAA,CAAK,GAAA,CAAI,KAAK,IAAI,CAAA;AAC3C,MAAA,QAAA,CAAS,EAAE,GAAA,EAAK,KAAA,EAAO,IAAA,CAAK,OAAO,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,IAAA,CAAK,SAAS,UAAA,EAAY,IAAA,CAAK,UAAA,EAAY,WAAA,EAAa,OAAO,CAAA;AAAA,IAChI,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAmB;AACvB,MAAA,IAAK,KAAA,EAA6B,SAAS,YAAA,EAAc;AACzD,MAAA,QAAA,CAAS,CAAA,OAAA,MAAY,EAAE,GAAG,OAAA,EAAS,KAAK,MAAA,EAAQ,OAAA,EAAS,WAAA,EAAa,KAAA,EAAM,CAAE,CAAA;AAAA,IAClF,CAAC,CAAA;AACL,IAAA,OAAO,MAAM,WAAW,KAAA,EAAM;AAAA,EAClC,GAAG,CAAC,OAAA,EAAS,KAAK,GAAA,EAAKD,MAAAA,EAAO,OAAO,CAAC,CAAA;AAEtC,EAAA,MAAM,QAAA,GAAWE,YAAY,MAAM;AAC/B,IAAA,QAAA,CAAS,CAAA,OAAA,KAAW;AAChB,MAAA,IAAI,CAAC,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,WAAA,IAAe,QAAQ,UAAA,KAAe,IAAA,IAAQ,GAAA,KAAQ,MAAA,EAAW,OAAO,OAAA;AACxG,MAAA,MAAM,SAAS,OAAA,CAAQ,UAAA;AACvB,MAAA,WAAA,CAAY,SAAA,CAAU,QAAQ,GAAA,EAAK,EAAE,QAAQ,CAAC,CAAA,CACzC,IAAA,CAAK,CAAA,IAAA,KAAQ;AACV,QAAA,MAAM,IAAA,GAAO,cAAc,IAAI,CAAA;AAC/B,QAAA,QAAA,CAAS,CAAA,GAAA,KAAO;AACZ,UAAA,IAAI,GAAA,CAAI,GAAA,KAAQ,OAAA,CAAQ,GAAA,EAAK,OAAO,GAAA;AACpC,UAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,GAAA,CAAI,OAAO,GAAG,IAAA,CAAK,MAAM,MAAA,CAAO,CAAA,IAAA,KAAQ,CAAC,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA,IAAA,KAAQ,IAAA,CAAK,OAAO,IAAA,CAAK,EAAE,CAAC,CAAC,CAAA;AACvG,UAAA,IAAIF,OAAM,IAAA,EAAK,KAAM,EAAA,EAAIC,MAAK,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,EAAE,OAAO,OAAA,EAAS,IAAA,CAAK,SAAS,UAAA,EAAY,IAAA,CAAK,YAAY,CAAA;AACxG,UAAA,OAAO,EAAE,GAAG,GAAA,EAAK,KAAA,EAAO,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,UAAA,EAAY,IAAA,CAAK,UAAA,EAAY,WAAA,EAAa,KAAA,EAAM;AAAA,QACnG,CAAC,CAAA;AAAA,MACL,CAAC,CAAA,CACA,KAAA,CAAM,MAAM,QAAA,CAAS,CAAA,GAAA,MAAQ,EAAE,GAAG,GAAA,EAAK,WAAA,EAAa,KAAA,EAAM,CAAE,CAAC,CAAA;AAClE,MAAA,OAAO,EAAE,GAAG,OAAA,EAAS,WAAA,EAAa,IAAA,EAAK;AAAA,IAC3C,CAAC,CAAA;AAAA,EACL,CAAA,EAAG,CAAC,GAAA,EAAKD,MAAK,CAAC,CAAA;AAEf,EAAA,MAAM,KAAA,GAAQE,YAAY,MAAM;AAC5B,IAAAD,KAAAA,CAAK,OAAO,GAAG,CAAA;AACf,IAAA,UAAA,CAAW,CAAA,KAAA,KAAS,QAAQ,CAAC,CAAA;AAAA,EACjC,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAER,EAAA,MAAM,OAAA,GAAU,MAAM,GAAA,KAAQ,GAAA;AAE9B,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,GAAA,KAAQ,EAAA,IAAM,IAAI,GAAA,CAAI,KAAA,CAAM,GAAA,EAAK,UAAU,CAAA,CAAE,YAAA,CAAa,GAAA,CAAI,QAAQ,OAAO,MAAA,IAAU,IAAA,CAAA;AAChH,EAAA,OAAO;AAAA,IACH,KAAA,EAAO,OAAA,IAAW,UAAA,GAAa,KAAA,CAAM,QAAQ,EAAC;AAAA,IAC9C,MAAA,EAAQ,OAAA,GAAU,KAAA,CAAM,MAAA,GAAS,SAAA;AAAA,IACjC,OAAA,EAAS,WAAW,KAAA,CAAM,OAAA;AAAA,IAC1B,WAAA,EAAa,WAAW,KAAA,CAAM,WAAA;AAAA,IAC9B,QAAA;AAAA,IACA;AAAA,GACJ;AACJ;AAGA,eAAsB,SAAA,CAAU,KAAa,MAAA,EAAyC;AAClF,EAAA,MAAM,GAAA,GAAM,UAAU,GAAA,EAAK,EAAE,QAAQ,KAAA,EAAO,QAAA,CAAS,GAAG,CAAA,EAAG,CAAA;AAC3D,EAAA,MAAM,GAAA,GAAMA,KAAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AACxB,EAAA,IAAI,GAAA,KAAQ,MAAA,EAAW,OAAO,GAAA,CAAI,KAAA;AAClC,EAAA,MAAM,IAAA,GAAO,aAAA,CAAc,MAAM,WAAA,CAAY,GAAG,CAAC,CAAA;AACjD,EAAAA,KAAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA;AAClB,EAAA,OAAO,IAAA,CAAK,KAAA;AAChB;AClIO,SAAS,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,GAAO,QAAO,EAA8E;AACrH,EAAA,uBAAOZ,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,qBAAqB,IAAI,CAAA,CAAA,EAAI,aAAA,EAAY,MAAA,EAAQ,QAAA,EAAA,IAAA,CAAK,QAAA,IAAY,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA,EAAE,CAAA;AACpH;AAGO,SAAS,UAAA,CAAW,EAAE,IAAA,EAAK,EAA2B;AACzD,EAAA,uBAAOA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,qBAAqB,IAAA,IAAQ,SAAS,CAAA,CAAA,EAAI,aAAA,EAAY,MAAA,EAAO,CAAA;AACzF;AAGO,SAAS,mBAAmB,KAAA,EAA8B;AAC7D,EAAA,OAAO,MAAM,GAAA,KAAQ,aAAA;AACzB;AA2CO,SAAS,SAAA,CAAU,EAAE,KAAA,EAAO,MAAA,EAAQ,WAAW,OAAA,EAAS,OAAA,GAAU,MAAM,UAAA,GAAa,IAAA,EAAM,YAAY,KAAA,EAAO,OAAA,GAAU,OAAO,WAAA,EAAa,MAAA,EAAQ,WAAW,YAAA,EAAc,WAAA,EAAa,MAAA,EAAQ,SAAA,EAAU,EAAc;AAC7N,EAAA,MAAM,EAAE,CAAA,EAAG,IAAA,EAAM,QAAA,KAAa,QAAA,EAAS;AACvC,EAAA,MAAM,CAAC,CAAA,EAAG,IAAI,CAAA,GAAIG,SAAS,EAAE,CAAA;AAC7B,EAAA,MAAM,CAAC,MAAA,EAAQ,YAAY,CAAA,GAAIA,SAAS,EAAE,CAAA;AAE1C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,SAAA,GAAYU,WAAAA,CAAY,CAAC,IAAA,KAA+C;AAC1E,IAAA,OAAA,CAAQ,KAAK,CAAA;AACb,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,EACrB,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIV,SAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,OAAO,cAAA,CAAe,KAAA,CAAM,SAAS,EAAE,CAAA,EAAG,QAAQ,CAAA;AACxD,EAAA,MAAM,KAAKW,KAAAA,EAAM;AACjB,EAAA,MAAM,KAAA,GAAQV,OAAyB,IAAI,CAAA;AAC3C,EAAA,MAAM,GAAA,GAAMA,OAAuB,IAAI,CAAA;AACvC,EAAA,MAAM,YAAA,GAAeA,OAA0B,IAAI,CAAA;AACnD,EAAA,MAAM,MAAA,GAAS,SAAS,KAAK,CAAA;AAC7B,EAAA,MAAM,WAAA,GAAc,mBAAmB,KAAK,CAAA;AAE5C,EAAA,MAAM,OAAA,GAAoB,KAAK,KAAA,CAAM,GAAA,CAAI,WAAS,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAK,CAAE,CAAA;AAClF,EAAA,IAAI,KAAK,OAAA,EAAS,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,QAAQ,CAAA;AAG/C,EAAAE,UAAU,MAAM;AACZ,IAAA,IAAI,IAAA,CAAK,WAAW,OAAA,EAAS;AAC7B,IAAA,SAAA,CAAU,CAAA,QAAA,KAAY;AAClB,MAAA,IAAI,YAAY,CAAA,IAAK,QAAA,GAAW,QAAQ,MAAA,IAAU,CAAA,KAAM,IAAI,OAAO,QAAA;AACnE,MAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,IAAA,KAAQ,IAAA,CAAK,OAAO,SAAS,CAAA;AAClE,MAAA,OAAO,CAAA,KAAM,MAAM,OAAA,IAAW,CAAA,GAAI,UAAU,OAAA,CAAQ,MAAA,GAAS,IAAI,CAAA,GAAI,EAAA;AAAA,IACzE,CAAC,CAAA;AAAA,EACL,CAAA,EAAG,CAAC,IAAA,CAAK,MAAA,EAAQ,KAAK,KAAA,EAAO,CAAA,EAAG,SAAS,CAAC,CAAA;AAE1C,EAAAA,UAAU,MAAM;AACZ,IAAA,IAAI,aAAa,UAAA,IAAc,YAAA,EAAa,EAAG,KAAA,CAAM,SAAS,KAAA,EAAM;AAAA,EACxE,CAAA,EAAG,CAAC,SAAA,EAAW,UAAU,CAAC,CAAA;AAE1B,EAAA,MAAM,SAAA,GAAYO,YAAY,MAAM;AAChC,IAAA,IAAI,UAAA,EAAY,KAAA,CAAM,OAAA,EAAS,KAAA,EAAM;AAAA,SAChC,GAAA,CAAI,SAAS,KAAA,EAAM;AACxB,IAAA,SAAA,CAAU,WAAU,KAAA,GAAQ,CAAA,IAAK,QAAQ,MAAA,GAAS,CAAA,GAAI,IAAI,KAAM,CAAA;AAAA,EACpE,CAAA,EAAG,CAAC,UAAA,EAAY,OAAA,CAAQ,MAAM,CAAC,CAAA;AAC/B,EAAA,mBAAA,CAAoB,MAAA,EAAQ,OAAO,EAAE,KAAA,EAAO,WAAU,CAAA,EAAI,CAAC,SAAS,CAAC,CAAA;AAErE,EAAA,MAAM,WAAW,CAAC,KAAA,KAAkB,CAAA,EAAG,EAAE,WAAW,KAAK,CAAA,CAAA;AACzD,EAAA,MAAM,KAAA,GAAQ,GAAG,EAAE,CAAA,IAAA,CAAA;AACnB,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,SAAA,KAAc,MAAA,IAAa,WAAA,KAAgB,MAAA;AAEnE,EAAA,MAAM,cAAc,MAAO,OAAA,GAAU,QAAA,CAAS,cAAA,CAAe,KAAK,CAAA,GAAI,IAAA;AACtE,EAAA,MAAM,eAAe,MAAO,SAAA,IAAa,CAAC,QAAA,GAAW,aAAa,OAAA,GAAU,IAAA;AAC5E,EAAAP,UAAU,MAAM;AACZ,IAAA,IAAI,SAAS,CAAA,EAAG;AAChB,IAAA,YAAA,CAAa,QAAA,CAAS,MAAM,CAAC,CAAA;AAC7B,IAAA,MAAM,MAAA,GAAS,QAAQ,MAAM,CAAA;AAC7B,IAAA,IAAI,MAAA,EAAQ,IAAA,KAAS,MAAA,EAAQ,SAAA,GAAY,OAAO,IAAI,CAAA;AAAA,EACxD,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,MAAM,MAAA,GAAS,CAAC,MAAA,KAA+B;AAC3C,IAAA,IAAI,WAAW,MAAA,EAAW;AAC1B,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,MAAA,EAAQ,IAAA,CAAK,QAAA,EAAS;AAAA,SACrC,MAAA,CAAO,OAAO,IAAI,CAAA;AAAA,EAC3B,CAAA;AAGA,EAAA,MAAM,SAAA,GAAY,CAAC,EAAA,KAAyB;AACxC,IAAA,SAAA,EAAU;AACV,IAAA,SAAA,CAAU,OAAA,CAAQ,WAAW,CAAA,GAAI,EAAA,GAAK,OAAO,OAAA,GAAU,CAAA,GAAI,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AAAA,EACjF,CAAA;AAGA,EAAA,MAAM,eAAA,GAAkB,CAAC,KAAA,EAAsB,MAAA,KAA6B;AACxE,IAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,WAAA,IAAe,KAAA,CAAM,QAAQ,SAAA,EAAW;AAC1D,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,MAAMI,KAAAA,GAAO,QAAQ,MAAA,GAAS,CAAA;AAC9B,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,KAAQ,WAAA;AAC3B,IAAA,MAAM,OAA0B,EAAC;AACjC,IAAA,MAAM,MAAM,WAAA,EAAY;AACxB,IAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,IAAA,IAAI,QAAQ,IAAA,EAAM,IAAA,CAAK,KAAK,MAAM,GAAA,CAAI,OAAO,CAAA;AAC7C,IAAA,IAAIA,KAAAA,OAAW,IAAA,CAAK,MAAM,UAAU,IAAA,GAAO,OAAA,GAAU,MAAM,CAAC,CAAA;AAC5D,IAAA,IAAI,WAAW,IAAA,EAAM,IAAA,CAAK,KAAK,MAAM,MAAA,CAAO,OAAO,CAAA;AACnD,IAAA,MAAM,IAAA,GAAO,MAAA,KAAW,KAAA,GAAQ,CAAA,GAAI,KAAK,MAAA,GAAS,CAAA;AAClD,IAAA,MAAM,QAAQ,IAAA,IAAQ,IAAA,GAAO,IAAI,EAAA,CAAA,GAAM,IAAA,CAAK,UAAU,IAAA,CAAK,MAAA;AAC3D,IAAA,IAAA,CAAK,IAAI,CAAA,IAAI;AAAA,EACjB,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAAyB;AACxC,IAAA,IAAI,MAAM,MAAA,YAAkB,WAAA,IAAe,MAAM,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,EAAG;AAChF,IAAA,IAAI,MAAM,MAAA,YAAkB,WAAA,IAAe,MAAM,MAAA,CAAO,OAAA,CAAQ,oBAAoB,CAAA,EAAG;AACvF,IAAA,MAAM,IAAA,GAAO,QAAQ,MAAA,GAAS,CAAA;AAC9B,IAAA,QAAQ,MAAM,GAAA;AAAK,MACf,KAAK,WAAA,EAAa;AACd,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,QAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,MAAA,IAAU,IAAA,EAAM;AACnC,UAAA,MAAA,CAAO,KAAA,EAAM;AACb,UAAA;AAAA,QACJ;AACA,QAAA,SAAA,CAAU,CAAA,KAAA,KAAU,KAAA,IAAS,IAAA,GAAO,CAAA,GAAI,QAAQ,CAAE,CAAA;AAClD,QAAA;AAAA,MACJ;AAAA,MACA,KAAK,SAAA,EAAW;AACZ,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,MAAM,MAAM,WAAA,EAAY;AACxB,QAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,MAAA,IAAU,CAAA,EAAG;AAC7B,UAAA,GAAA,CAAI,KAAA,EAAM;AACV,UAAA;AAAA,QACJ;AACA,QAAA,SAAA,CAAU,CAAA,KAAA,KAAU,KAAA,IAAS,CAAA,GAAI,IAAA,GAAO,QAAQ,CAAE,CAAA;AAClD,QAAA;AAAA,MACJ;AAAA,MACA,KAAK,MAAA;AACD,QAAA,IAAI,CAAC,UAAA,IAAc,CAAA,KAAM,EAAA,EAAI;AACzB,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,SAAA,CAAU,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,CAAA,GAAI,EAAE,CAAA;AAAA,QACzC;AACA,QAAA;AAAA,MACJ,KAAK,KAAA;AACD,QAAA,IAAI,CAAC,UAAA,IAAc,CAAA,KAAM,EAAA,EAAI;AACzB,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,SAAA,CAAU,IAAI,CAAA;AAAA,QAClB;AACA,QAAA;AAAA,MACJ,KAAK,OAAA,EAAS;AACV,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,MAAM,MAAA,GAAS,QAAQ,MAAM,CAAA;AAC7B,QAAA,MAAM,QAAA,GAAW,QAAQ,IAAA,KAAS,MAAA,GAAS,aAAa,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,GAAI,IAAA;AACjF,QAAA,IAAI,IAAA,IAAQ,QAAA,KAAa,IAAA,EAAM,QAAA,CAAS,QAAQ,CAAA;AAAA,oBACpC,MAAM,CAAA;AAClB,QAAA;AAAA,MACJ;AAAA,MACA,KAAK,YAAA,EAAc;AACf,QAAA,IAAI,UAAA,IAAc,MAAM,OAAA,KAAY,IAAA,IAAQ,MAAM,OAAA,CAAQ,cAAA,KAAmB,EAAE,MAAA,EAAQ;AACvF,QAAA,MAAM,MAAA,GAAS,QAAQ,MAAM,CAAA;AAC7B,QAAA,IAAI,CAAC,IAAA,IAAQ,MAAA,EAAQ,IAAA,KAAS,MAAA,IAAU,YAAA,CAAa,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,KAAM,IAAA,EAAM;AAClF,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,UAAA;AAAA,QACJ;AACA,QAAA,IAAI,gBAAe,EAAG;AAClB,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,QACjB;AACA,QAAA;AAAA,MACJ;AAAA,MACA,KAAK,WAAA;AACD,QAAA,IAAI,IAAA,EAAM;AACN,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,OAAA,CAAQ,KAAK,CAAA;AACb,UAAA;AAAA,QACJ;AACA,QAAA,IAAI,gBAAgB,MAAA,KAAc,CAAC,cAAc,KAAA,CAAM,OAAA,EAAS,mBAAmB,CAAA,CAAA,EAAI;AACnF,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,WAAA,EAAY;AAAA,QAChB;AACA,QAAA;AAAA;AACR,EACJ,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,GAAG,EAAE,CAAA,QAAA,CAAA;AACvB,EAAA,MAAM,QAAA,GAAW,MAAA,IAAU,CAAA,IAAK,MAAA,GAAS,QAAQ,MAAA,GAAU,IAAA,GAAO,CAAA,EAAG,QAAA,CAAS,MAAM,CAAC,CAAA,SAAA,CAAA,GAAc,QAAA,CAAS,MAAM,CAAA,GAAK,MAAA;AAEvH,EAAA,uBACIH,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,YAAY,SAAA,IAAa,EAAE,IAAI,SAAA,EAC1C,QAAA,EAAA;AAAA,IAAA,UAAA,oBACGA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACX,QAAA,EAAA;AAAA,sBAAAP,GAAAA,CAACe,QAAA,EAAO,IAAA,EAAM,IAAI,WAAA,EAAa,GAAA,EAAK,eAAW,IAAA,EAAC,CAAA;AAAA,sBAChDf,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACG,GAAA,EAAK,KAAA;AAAA,UACL,IAAA,EAAK,QAAA;AAAA,UACL,IAAA,EAAK,UAAA;AAAA,UACL,eAAA,EAAc,MAAA;AAAA,UACd,eAAA,EAAe,SAAA;AAAA,UACf,uBAAA,EAAuB,QAAA;AAAA,UACvB,mBAAA,EAAkB,MAAA;AAAA,UAClB,YAAA,EAAY,EAAE,iBAAA,EAAmB,EAAE,QAAQ,MAAA,CAAO,WAAA,IAAe,CAAA;AAAA,UACjE,WAAA,EAAa,EAAE,uBAAA,EAAoB,EAAE,QAAQ,MAAA,CAAO,WAAA,IAAe,CAAA;AAAA,UACnE,KAAA,EAAO,CAAA;AAAA,UACP,QAAA,EAAU,CAAA,KAAA,KAAS,IAAA,CAAK,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,UAC1C,YAAA,EAAa,KAAA;AAAA,UACb,UAAA,EAAY;AAAA;AAAA;AAChB,KAAA,EACJ,CAAA;AAAA,oBAEJO,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACX,QAAA,EAAA;AAAA,sBAAAP,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAe,KAAA,EAAO,SAAU,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,MACvD,OAAA,oBACGA,GAAAA,CAAC,IAAA,EAAA,EAAK,MAAM,KAAA,CAAM,MAAA,EAAQ,EAAA,EAAI,KAAA,EAAO,SAAA,EAAU,cAAA,EAAe,UAAU,EAAA,EAAI,kBAAA,EAAiB,KAAA,EAAM,SAAA,EAAW,CAAA,KAAA,KAAS,eAAA,CAAgB,OAAO,KAAK,CAAA,EAC9I,QAAA,EAAA,CAAA,CAAE,UAAU,CAAA,EACjB;AAAA,KAAA,EAER,CAAA;AAAA,oBACAO,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,SAAA,EAAU,UAAA;AAAA,QACV,UAAU,CAAA,KAAA,KAAS;AACf,UAAA,MAAM,KAAK,KAAA,CAAM,aAAA;AACjB,UAAA,IAAI,EAAA,CAAG,eAAe,EAAA,CAAG,SAAA,GAAY,GAAG,YAAA,GAAe,EAAA,OAAS,QAAA,EAAS;AAAA,QAC7E,CAAA;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAP,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACG,GAAA,EAAK,GAAA;AAAA,cACL,EAAA,EAAI,SAAA;AAAA,cACJ,IAAA,EAAK,SAAA;AAAA,cACL,YAAA,EAAY,OAAA;AAAA,cACZ,QAAA,EAAU,aAAa,EAAA,GAAK,CAAA;AAAA,cAC5B,uBAAA,EAAuB,aAAa,MAAA,GAAY,QAAA;AAAA,cAChD,SAAA,EAAU,aAAA;AAAA,cAEb,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,KAAU;AAC5B,gBAAA,IAAI,MAAA,CAAO,SAAS,MAAA,EAAQ;AACxB,kBAAA,uBACIA,IAAC,KAAA,EAAA,EAAe,EAAA,EAAI,SAAS,KAAK,CAAA,EAAG,MAAK,QAAA,EAAS,eAAA,EAAe,UAAU,MAAA,IAAU,CAAC,MAAM,SAAA,EAAW,CAAA,qBAAA,EAAwB,UAAU,MAAA,GAAS,WAAA,GAAc,EAAE,CAAA,CAAA,EAAI,YAAA,EAAc,MAAM,SAAA,CAAU,KAAK,GAAG,OAAA,EAAS,MAAM,KAAK,QAAA,EAAS,EACtO,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,cAAA,EAAgB,QAAA,EAAA,IAAA,CAAK,cAAc,CAAA,CAAE,eAAU,IAAI,CAAA,CAAE,WAAW,CAAA,EAAE,CAAA,EAAA,EAD7E,MAET,CAAA;AAAA,gBAER;AACA,gBAAA,MAAM,EAAE,MAAK,GAAI,MAAA;AACjB,gBAAA,MAAM,OAAA,GAAU,KAAK,EAAA,KAAO,SAAA;AAC5B,gBAAA,MAAM,QAAA,GAAW,YAAA,CAAa,KAAA,EAAO,IAAA,CAAK,EAAE,CAAA;AAC5C,gBAAA,uBACIO,IAAAA,CAAC,KAAA,EAAA,EAAkB,WAAW,CAAA,QAAA,EAAW,KAAA,KAAU,SAAS,WAAA,GAAc,EAAE,CAAA,CAAA,EAAI,OAAA,GAAU,eAAe,EAAE,CAAA,CAAA,EAAI,cAAc,MAAM,SAAA,CAAU,KAAK,CAAA,EAC9I,QAAA,EAAA;AAAA,kCAAAA,IAAAA,CAAC,SAAI,EAAA,EAAI,QAAA,CAAS,KAAK,CAAA,EAAG,IAAA,EAAK,QAAA,EAAS,eAAA,EAAe,KAAA,KAAU,MAAA,IAAU,CAAC,IAAA,EAAM,cAAA,EAAc,OAAA,GAAU,MAAA,GAAS,MAAA,EAAW,SAAA,EAAU,gBAAe,OAAA,EAAS,MAAM,MAAA,CAAO,IAAI,CAAA,EAC5K,QAAA,EAAA;AAAA,oBAAA,WAAA,mBAAcP,GAAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA,mBAAKA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAY,CAAA;AAAA,oCACnEA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAe,KAAA,EAAO,IAAA,CAAK,IAAA,EAAO,QAAA,EAAA,IAAA,CAAK,IAAA,EAAK,CAAA;AAAA,oBAC3D,IAAA,CAAK,UAAU,MAAA,oBAAaA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAiB,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM,CAAA;AAAA,oBACxE,OAAA,oBAAWA,GAAAA,CAACgB,KAAAA,EAAA,EAAM,SAAA,EAAU,eAAA,EAAgB,IAAA,EAAM,EAAA,EAAI,WAAA,EAAa,CAAA,EAAG,YAAA,EAAY,CAAA,CAAE,SAAS,CAAA,EAAG;AAAA,mBAAA,EACrG,CAAA;AAAA,kBACC,QAAA,KAAa,wBACVhB,GAAAA;AAAA,oBAAC,IAAA;AAAA,oBAAA;AAAA,sBACG,IAAA,EAAM,QAAA;AAAA,sBACN,EAAA,EAAI,CAAA,EAAG,QAAA,CAAS,KAAK,CAAC,CAAA,SAAA,CAAA;AAAA,sBACtB,IAAA,EAAK,QAAA;AAAA,sBACL,eAAA,EAAe,UAAU,MAAA,IAAU,IAAA;AAAA,sBACnC,kBAAA,EAAkB,SAAS,KAAK,CAAA;AAAA,sBAChC,WAAW,CAAA,aAAA,EAAgB,KAAA,KAAU,MAAA,IAAU,IAAA,GAAO,cAAc,EAAE,CAAA,CAAA;AAAA,sBACtE,QAAA,EAAU,EAAA;AAAA,sBACV,YAAA,EAAY,EAAE,UAAU,CAAA;AAAA,sBACxB,OAAO,CAAA,CAAE,qBAAA,EAAuB,EAAE,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA;AAAA,sBAEnD,QAAA,kBAAAA,IAAC,QAAA,EAAA,EAAS,IAAA,EAAM,IAAI,WAAA,EAAa,GAAA,EAAK,eAAW,IAAA,EAAC;AAAA;AAAA,mBACtD;AAAA,kBAEH,OAAA,oBAAWA,GAAAA,CAACiB,YAAAA,EAAA,EAAa,SAAA,EAAU,iBAAA,EAAkB,IAAA,EAAM,EAAA,EAAI,WAAA,EAAa,GAAA,EAAK,aAAA,EAAW,IAAA,EAAC;AAAA,iBAAA,EAAA,EAtBxF,KAAK,EAuBf,CAAA;AAAA,cAER,CAAC;AAAA;AAAA,WACD;AAAA,0BACAjB,GAAAA,CAAC,UAAA,EAAA,EAAW,MAAA,EAAQ,KAAK,MAAA,EAAQ,KAAA,EAAO,OAAA,CAAQ,MAAA,KAAW,GAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAgB,OAAA,EAAS,KAAK,KAAA,EAAO;AAAA;AAAA;AAAA,KACjH;AAAA,IACC,SAAA,oBACGA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,eAAA,EACV,QAAA,EAAA,QAAA,mBACGA,GAAAA,CAAC,gBAAa,KAAA,EAAc,MAAA,EAAgB,KAAA,EAAO,WAAA,EAAa,UAAU,MAAM;AAAE,MAAA,WAAA,CAAY,KAAK,CAAA;AAAG,MAAA,SAAA,EAAU;AAAA,IAAG,CAAA,EAAG,oBAEtHO,IAAAA,CAAC,YAAO,GAAA,EAAK,YAAA,EAAc,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,wBAAA,EAAyB,oBAAiB,QAAA,EAAS,OAAA,EAAS,MAAM,WAAA,CAAY,IAAI,CAAA,EAAG,WAAW,CAAA,KAAA,KAAS,eAAA,CAAgB,KAAA,EAAO,QAAQ,CAAA,EACvL,QAAA,EAAA;AAAA,sBAAAP,IAAC,IAAA,EAAA,EAAK,IAAA,EAAM,IAAI,WAAA,EAAa,GAAA,EAAK,eAAW,IAAA,EAAC,CAAA;AAAA,sBAC9CA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAgB,QAAA,EAAA,WAAA,EAAY;AAAA,KAAA,EAChD,CAAA,EAER;AAAA,GAAA,EAER,CAAA;AAER;AAEA,SAAS,UAAA,CAAW,EAAE,MAAA,EAAQ,KAAA,EAAO,OAAAW,MAAAA,EAAO,MAAA,EAAQ,SAAQ,EAAkH;AAC1K,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,QAAA,EAAS;AACvB,EAAA,IAAI,WAAW,OAAA,EAAS;AACpB,IAAA,uBACIJ,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EAAgB,MAAK,OAAA,EAC/B,QAAA,EAAA;AAAA,MAAA,CAAA,CAAE,+BAAA,EAAiC,EAAE,MAAA,EAAQ,MAAA,EAAQ,CAAA;AAAA,MAAG,GAAA;AAAA,sBACzDP,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,UAAA,EAAW,OAAA,EAAS,OAAA,EAAU,QAAA,EAAA,CAAA,CAAE,WAAW,CAAA,EAAE;AAAA,KAAA,EACjF,CAAA;AAAA,EAER;AACA,EAAA,IAAI,MAAA,KAAW,SAAA,IAAa,KAAA,EAAO,uBAAOA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EAAgB,WAAA,EAAU,QAAA,EAAU,QAAA,EAAA,CAAA,CAAE,eAAU,CAAA,EAAE,CAAA;AAC3G,EAAA,IAAI,MAAA,KAAW,WAAW,KAAA,EAAO;AAC7B,IAAA,uBAAOA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EAAgB,WAAA,EAAU,QAAA,EAAU,QAAA,EAAAW,MAAAA,CAAM,IAAA,EAAK,KAAM,EAAA,GAAK,CAAA,CAAE,kBAAA,EAAoB,EAAE,MAAA,EAAQ,MAAA,CAAO,WAAA,EAAY,EAAG,CAAA,GAAI,CAAA,CAAE,sCAAA,EAA8B,EAAE,KAAA,EAAOA,MAAAA,CAAM,IAAA,EAAK,EAAG,CAAA,EAAE,CAAA;AAAA,EACvM;AACA,EAAA,OAAO,IAAA;AACX;AAMO,SAAS,aAAa,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,UAAS,EAAkF;AAC5I,EAAA,MAAM,EAAE,CAAA,EAAG,QAAA,EAAS,GAAI,QAAA,EAAS;AACjC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIR,SAAS,EAAE,CAAA;AACnC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,KAAA,GAAQC,OAAyB,IAAI,CAAA;AAC3C,EAAA,MAAM,UAAUU,KAAAA,EAAM;AAEtB,EAAAR,UAAU,MAAM;AACZ,IAAA,KAAA,CAAM,SAAS,KAAA,EAAM;AAAA,EACzB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,SAAS,YAAY;AACvB,IAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,EAAK;AACxB,IAAA,IAAI,KAAA,KAAU,EAAA,IAAM,IAAA,IAAQ,KAAA,CAAM,cAAc,MAAA,EAAW;AAC3D,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACA,MAAA,MAAM,UAAU,MAAM,UAAA,CAAW,KAAA,CAAM,SAAA,EAAW,OAAO,MAAM,CAAA;AAC/D,MAAA,WAAA,EAAY;AACZ,MAAA,QAAA,CAAS,QAAQ,UAAU,CAAA;AAAA,IAC/B,SAAS,OAAA,EAAS;AACd,MAAA,OAAA,CAAQ,KAAK,CAAA;AACb,MAAA,QAAA,CAAS,OAAA,YAAmB,qBAAqB,OAAA,CAAQ,MAAA,KAAW,OAAO,OAAA,CAAQ,MAAA,GAAS,CAAA,CAAE,qCAAqC,CAAC,CAAA;AAAA,IACxI;AAAA,EACJ,CAAA;AAEA,EAAA,uBACIC,IAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACG,SAAA,EAAU,YAAA;AAAA,MACV,UAAU,CAAA,KAAA,KAAS;AACf,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,KAAK,MAAA,EAAO;AAAA,MAChB,CAAA;AAAA,MACA,WAAW,CAAA,KAAA,KAAS;AAChB,QAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AACxB,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,UAAA,QAAA,EAAS;AAAA,QACb;AACA,QAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,KAAA,EAAO,KAAA,CAAM,eAAA,EAAgB;AAAA,MACnD,CAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAP,GAAAA,CAAC,WAAM,SAAA,EAAU,kBAAA,EAAmB,SAAS,CAAA,EAAG,OAAO,SAAU,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,wBACvEO,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACX,QAAA,EAAA;AAAA,0BAAAP,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACG,GAAA,EAAK,KAAA;AAAA,cACL,EAAA,EAAI,GAAG,OAAO,CAAA,KAAA,CAAA;AAAA,cACd,SAAA,EAAU,WAAA;AAAA,cACV,KAAA,EAAO,IAAA;AAAA,cACP,QAAA,EAAU,CAAA,KAAA,KAAS,OAAA,CAAQ,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,cAC7C,WAAA,EAAa,EAAE,MAAM,CAAA;AAAA,cACrB,gBAAc,KAAA,KAAU,IAAA;AAAA,cACxB,kBAAA,EAAkB,KAAA,KAAU,IAAA,GAAO,OAAA,GAAU,MAAA;AAAA,cAC7C,QAAA,EAAU,IAAA;AAAA,cACV,YAAA,EAAa;AAAA;AAAA,WACjB;AAAA,0BACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,SAAA,EAAU,iCAAgC,QAAA,EAAU,IAAA,IAAQ,KAAK,IAAA,EAAK,KAAM,IAC7F,QAAA,EAAA,IAAA,GAAO,CAAA,CAAE,gBAAW,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EACvC;AAAA,SAAA,EACJ,CAAA;AAAA,QACC,KAAA,KAAU,IAAA,oBAAQA,GAAAA,CAAC,GAAA,EAAA,EAAE,EAAA,EAAI,OAAA,EAAS,SAAA,EAAU,kBAAA,EAAmB,IAAA,EAAK,OAAA,EAAS,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,GACxF;AAER;AAMA,eAAsB,sBAAA,CAAuB,KAAA,EAAqB,KAAA,EAAiC,IAAA,EAAmB,QAAA,EAAmE;AACrL,EAAA,IAAI,UAAU,MAAA,EAAW;AACrB,IAAA,QAAA,CAAS,EAAE,CAAC,KAAA,CAAM,GAAG,GAAG,IAAA,CAAK,IAAI,CAAA;AACjC,IAAA;AAAA,EACJ;AACA,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI;AACA,IAAA,WAAA,GAAc,cAAA,CAAe,MAAM,SAAA,CAAU,KAAA,CAAM,OAAA,EAAS,KAAK,EAAE,CAAA,EAAG,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA;AAAA,EAC5F,CAAA,CAAA,MAAQ;AACJ,IAAA,WAAA,GAAc,MAAA;AAAA,EAClB;AACA,EAAA,QAAA,CAAS,WAAA,KAAgB,SAAY,EAAE,CAAC,MAAM,GAAG,GAAG,IAAA,CAAK,EAAA,EAAG,GAAI,EAAE,CAAC,KAAA,CAAM,GAAG,GAAG,IAAA,CAAK,EAAA,EAAI,CAAC,MAAM,GAAG,GAAG,WAAA,CAAY,EAAA,EAAI,CAAA;AACzH;AAGO,SAAS,gBAAA,CAAiB,EAAE,KAAA,EAAM,EAA4B;AACjE,EAAA,MAAM,EAAE,CAAA,EAAG,QAAA,EAAS,GAAI,QAAA,EAAS;AACjC,EAAA,uBACIA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBACX,QAAA,kBAAAA,GAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACG,KAAA;AAAA,MACA,SAAA,EAAW,MAAM,OAAA,CAAQ,EAAA;AAAA,MACzB,OAAA,EAAS,SAAS,KAAK,CAAA;AAAA,MACvB,SAAA,EAAS,IAAA;AAAA,MACT,WAAA,EAAa,EAAE,aAAA,EAAe,EAAE,OAAO,KAAA,CAAM,KAAA,CAAM,WAAA,EAAY,EAAG,CAAA;AAAA,MAClE,MAAA,EAAQ,CAAA,IAAA,KAAQ,QAAA,CAAS,EAAE,CAAC,MAAM,GAAG,GAAG,IAAA,CAAK,EAAA,EAAI;AAAA;AAAA,GACrD,EACJ,CAAA;AAER;AASO,SAAS,WAAA,CAAY,EAAE,MAAA,EAAQ,MAAA,EAAO,EAAgD;AACzF,EAAA,MAAM,EAAE,CAAA,EAAG,QAAA,EAAS,GAAI,QAAA,EAAS;AACjC,EAAA,MAAM,CAAC,KAAA,EAAO,KAAK,CAAA,GAAI,MAAA;AACvB,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIG,QAAAA,CAAsB,MAAM,OAAO,CAAA;AACjE,EAAA,MAAM,IAAA,GAAOC,OAAmB,IAAI,CAAA;AACpC,EAAA,MAAM,KAAA,GAAQA,OAAmB,IAAI,CAAA;AAErC,EAAA,IAAI,UAAU,MAAA,EAAW;AACrB,IAAA,uBACIJ,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BACX,QAAA,kBAAAA,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACG,KAAA,EAAO,KAAA;AAAA,QACP,MAAA;AAAA,QACA,SAAA,EAAW,MAAM,OAAA,CAAQ,EAAA;AAAA,QACzB,OAAA,EAAS,SAAS,KAAK,CAAA;AAAA,QACvB,SAAA,EAAS,IAAA;AAAA,QACT,WAAA,EAAa,EAAE,aAAA,EAAe,EAAE,OAAO,KAAA,CAAM,KAAA,CAAM,WAAA,EAAY,EAAG,CAAA;AAAA,QAClE,MAAA,EAAQ,CAAA,IAAA,KAAQ,QAAA,CAAS,EAAE,CAAC,MAAM,GAAG,GAAG,IAAA,CAAK,EAAA,EAAI;AAAA;AAAA,KACrD,EACJ,CAAA;AAAA,EAER;AAEA,EAAA,MAAM,YAAY,CAAC,IAAA,KAAsB,uBAAuB,KAAA,EAAO,KAAA,EAAO,MAAM,QAAQ,CAAA;AAE5F,EAAA,uBACIO,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACX,QAAA,EAAA;AAAA,oBAAAP,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACG,MAAA,EAAQ,IAAA;AAAA,QACR,KAAA,EAAO,KAAA;AAAA,QACP,MAAA;AAAA,QACA,SAAA,EAAW,MAAM,OAAA,CAAQ,EAAA;AAAA,QACzB,OAAA,EAAS,SAAS,KAAK,CAAA;AAAA,QACvB,SAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAO,IAAA;AAAA,QACP,WAAA,EAAa,EAAE,aAAA,EAAe,EAAE,OAAO,KAAA,CAAM,KAAA,CAAM,WAAA,EAAY,EAAG,CAAA;AAAA,QAClE,MAAA,EAAQ,CAAA,IAAA,KAAQ,KAAK,SAAA,CAAU,IAAI,CAAA;AAAA,QACnC,SAAA,EAAW,UAAA;AAAA,QACX,cAAc,MAAM;AAChB,UAAA,KAAA,CAAM,SAAS,KAAA,EAAM;AACrB,UAAA,OAAO,IAAA;AAAA,QACX;AAAA;AAAA,KACJ;AAAA,oBACAA,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QAEG,MAAA,EAAQ,KAAA;AAAA,QACR,SAAA,EAAU,gBAAA;AAAA,QACV,KAAA,EAAO,KAAA;AAAA,QACP,QAAQ,OAAA,CAAQ,EAAA;AAAA,QAChB,SAAA,EAAW,QAAQ,EAAA,KAAO,KAAA,CAAM,QAAQ,EAAA,GAAK,KAAA,CAAM,QAAQ,EAAA,GAAK,MAAA;AAAA,QAChE,OAAA,EAAS,CAAA,CAAE,oBAAA,EAAsB,EAAE,MAAA,EAAQ,QAAA,CAAS,KAAK,CAAA,EAAG,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,CAAA;AAAA,QAChF,OAAA,EAAS,KAAA;AAAA,QACT,UAAA,EAAY,KAAA;AAAA,QACZ,WAAA,EAAa,CAAA,CAAE,uBAAA,EAAyB,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,WAAA,EAAY,EAAG,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,CAAA;AAAA,QAChG,QAAQ,CAAA,IAAA,KAAQ,QAAA,CAAS,EAAE,CAAC,MAAM,GAAG,GAAG,OAAA,CAAQ,EAAA,EAAI,CAAC,KAAA,CAAM,GAAG,GAAG,IAAA,CAAK,IAAI,CAAA;AAAA,QAC1E,WAAA,EAAa,MAAM,IAAA,CAAK,OAAA,EAAS,KAAA;AAAM,OAAA;AAAA,MAXlC,OAAA,CAAQ;AAAA;AAYjB,GAAA,EACJ,CAAA;AAER;AAGO,SAAS,YAAA,CAAa,EAAE,MAAA,EAAO,EAA0C;AAC5E,EAAA,MAAM,CAAC,KAAA,EAAO,KAAK,CAAA,GAAI,MAAA;AACvB,EAAA,MAAM,kBAAA,GAAqB,mBAAmB,KAAK,CAAA;AACnD,EAAA,uBACIO,IAAAA,CAAAC,QAAAA,EAAA,EACK,QAAA,EAAA;AAAA,IAAA,kBAAA,mBAAqBR,GAAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAM,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,CAAA,mBAAKA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,MAAM,OAAA,EAAS,CAAA;AAAA,oBAC5FA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAmB,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAO,QAAA,EAAA,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAK,CAAA;AAAA,IACjF,KAAA,KAAU,MAAA,oBACPO,IAAAA,CAAAC,UAAA,EACI,QAAA,EAAA;AAAA,sBAAAR,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EAAkB,aAAA,EAAY,QAAO,QAAA,EAAA,MAAA,EAAC,CAAA;AAAA,sBACtDO,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EACZ,QAAA,EAAA;AAAA,wBAAAP,GAAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAM,KAAA,CAAM,QAAQ,IAAA,EAAM,CAAA;AAAA,wBACtCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAmB,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAO,QAAA,EAAA,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAK;AAAA,OAAA,EACtF;AAAA,KAAA,EACJ;AAAA,GAAA,EAER,CAAA;AAER;;;AC/eO,IAAM,kBAAA,GAAgC;AAAA,EACzC,IAAA,EAAM,KAAA;AAAA,EACN,OAAA,EAAS,IAAA;AAAA,EACT,KAAA,EAAO,EAAA;AAAA,EACP,SAAA,EAAW,CAAA;AAAA,EACX,SAAS,EAAC;AAAA,EACV,aAAA,EAAe,MAAA;AAAA,EACf,eAAA,EAAiB,IAAA;AAAA,EACjB,MAAA,EAAQ,KAAA;AAAA,EACR,QAAA,EAAU,KAAA;AAAA,EACV,UAAA,EAAY;AAChB,CAAA;AAGO,SAAS,WAAA,CAAY,OAA6C,MAAA,EAA0B;AAC/F,EAAA,OAAO,KAAA,CAAM,IAAA,KAAS,MAAA,IAAU,CAAC,KAAA,CAAM,QAAA,CAAA;AAC3C;AAEO,SAAS,eAAA,CAAgB,OAAA,GAA8B,EAAC,EAAc;AACzE,EAAA,IAAI,KAAA,GAAmB,EAAE,GAAG,kBAAA,EAAoB,GAAG,OAAA,EAAQ;AAC3D,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAgB;AACtC,EAAA,OAAO;AAAA,IACH,KAAK,MAAM,KAAA;AAAA,IACX,IAAI,KAAA,EAAO;AACP,MAAA,MAAM,OAAO,OAAO,KAAA,KAAU,UAAA,GAAa,KAAA,CAAM,KAAK,CAAA,GAAI,KAAA;AAC1D,MAAA,KAAA,GAAQ,EAAE,GAAG,KAAA,EAAO,GAAG,IAAA,EAAK;AAC5B,MAAA,SAAA,CAAU,OAAA,CAAQ,CAAA,QAAA,KAAY,QAAA,EAAU,CAAA;AAAA,IAC5C,CAAA;AAAA,IACA,UAAU,QAAA,EAAU;AAChB,MAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AACtB,MAAA,OAAO,MAAM,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAA;AAAA,IAC1C;AAAA,GACJ;AACJ;AAEA,IAAI,YAAA,GAAiC,IAAA;AAM9B,SAAS,eAAA,GAA6B;AACzC,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,eAAA,EAAgB;AAC1D,EAAA,YAAA,KAAiB,eAAA,EAAgB;AACjC,EAAA,OAAO,YAAA;AACX;AAEO,SAAS,aAAa,IAAA,EAAgC;AACzD,EAAA,MAAMU,QAAO,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA,GAAO,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,IAAA,IAAQ,MAAM,OAAA,CAAS,IAAA,CAA4B,IAAI,CAAA,GAAK,IAAA,CAA6B,OAAO,EAAC;AAChL,EAAA,OAAOA,KAAAA,CAAK,OAAA,CAAQ,CAAC,KAAA,KAAmB;AACpC,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,SAAa,EAAC;AACzD,IAAA,MAAM,GAAA,GAAM,KAAA;AACZ,IAAA,IAAK,OAAO,GAAA,CAAI,EAAA,KAAO,QAAA,IAAY,OAAO,GAAA,CAAI,EAAA,KAAO,QAAA,IAAa,OAAO,GAAA,CAAI,KAAA,KAAU,QAAA,SAAiB,EAAC;AACzG,IAAA,MAAM,MAAA,GAAwB;AAAA,MAC1B,EAAA,EAAI,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAAA,MACjB,IAAA,EAAM,GAAA,CAAI,IAAA,KAAS,MAAA,GAAS,MAAA,GAAS,QAAA;AAAA,MACrC,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,MAAA,EAAQ,GAAA,CAAI,MAAA,KAAW,IAAA,IAAQ,GAAA,CAAI,IAAA,KAAS,KAAA,IAAU,GAAA,CAAI,OAAA,KAAY,IAAA,IAAQ,GAAA,CAAI,MAAA,KAAW;AAAA,KACjG;AACA,IAAA,IAAI,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,EAAU,MAAA,CAAO,UAAU,GAAA,CAAI,OAAA;AAC1D,IAAA,MAAM,EAAA,GAAK,GAAA,CAAI,EAAA,IAAM,GAAA,CAAI,cAAc,GAAA,CAAI,UAAA;AAC3C,IAAA,IAAI,OAAO,EAAA,KAAO,QAAA,EAAU,MAAA,CAAO,EAAA,GAAK,EAAA;AACxC,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAC3B,IAAA,IAAI,GAAA,KAAQ,MAAA,EAAW,MAAA,CAAO,GAAA,GAAM,GAAA;AACpC,IAAA,OAAO,CAAC,MAAM,CAAA;AAAA,EAClB,CAAC,CAAA;AACL;AAEO,SAAS,cAAc,IAAA,EAA8B;AACxD,EAAA,MAAMA,QAAO,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA,GAAO,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,IAAA,IAAQ,MAAM,OAAA,CAAS,IAAA,CAA4B,IAAI,CAAA,GAAK,IAAA,CAA6B,OAAO,EAAC;AAChL,EAAA,OAAOA,KAAAA,CAAK,OAAA,CAAQ,CAAC,KAAA,KAAmB;AACpC,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,SAAa,EAAC;AACzD,IAAA,MAAM,GAAA,GAAM,KAAA;AACZ,IAAA,IAAK,OAAO,GAAA,CAAI,EAAA,KAAO,QAAA,IAAY,OAAO,GAAA,CAAI,EAAA,KAAO,QAAA,IAAa,OAAO,GAAA,CAAI,KAAA,KAAU,QAAA,SAAiB,EAAC;AACzG,IAAA,MAAM,OAAA,GAAuB,EAAE,EAAA,EAAI,MAAA,CAAO,IAAI,EAAE,CAAA,EAAG,KAAA,EAAO,GAAA,CAAI,KAAA,EAAM;AACpE,IAAA,IAAI,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,EAAU,OAAA,CAAQ,UAAU,GAAA,CAAI,OAAA;AAC3D,IAAA,IAAI,OAAO,GAAA,CAAI,IAAA,KAAS,QAAA,EAAU,OAAA,CAAQ,OAAO,GAAA,CAAI,IAAA;AACrD,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAC3B,IAAA,IAAI,GAAA,KAAQ,MAAA,EAAW,OAAA,CAAQ,GAAA,GAAM,GAAA;AACrC,IAAA,IAAI,OAAO,GAAA,CAAI,MAAA,KAAW,QAAA,EAAU,OAAA,CAAQ,SAAS,GAAA,CAAI,MAAA;AACzD,IAAA,OAAO,CAAC,OAAO,CAAA;AAAA,EACnB,CAAC,CAAA;AACL;ACnHO,IAAM,sBAAA,GAAyB,0BAAA;AACtC,IAAM,WAAA,GAAc,cAAA;AAEb,SAAS,YAAA,CAAgB,OAAkB,MAAA,EAAoC;AAClF,EAAA,OAAOR,oBAAAA,CAAqB,KAAA,CAAM,SAAA,EAAW,MAAM,OAAO,KAAA,CAAM,GAAA,EAAK,CAAA,EAAG,MAAM,MAAA,CAAO,KAAA,CAAM,GAAA,EAAK,CAAC,CAAA;AACrG;AAKO,SAAS,aAAa,KAAA,EAAsB;AAC/C,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,CAAA,KAAA,KAAS,MAAM,OAAA,CAAQ,IAAI,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AAC3E;AAEO,SAAS,WAAW,KAAA,EAA0B;AACjD,EAAA,MAAM,MAAA,GAAqB,EAAE,OAAA,EAAS,YAAA,CAAa,KAAK,CAAA,EAAE;AAC1D,EAAA,IAAI,MAAM,IAAA,EAAM,KAAA,KAAU,QAAW,MAAA,CAAO,KAAA,GAAQ,MAAM,IAAA,CAAK,KAAA;AAC/D,EAAA,IAAI,MAAM,IAAA,EAAM,KAAA,KAAU,QAAW,MAAA,CAAO,KAAA,GAAQ,MAAM,IAAA,CAAK,KAAA;AAC/D,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,MAAA,CAAO,GAAA,GAAM,OAAO,QAAA,CAAS,QAAA;AAChE,EAAA,OAAO,MAAA;AACX;AAUA,SAAS,aAAa,GAAA,EAAmB;AACrC,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,IAAe,eAAe,GAAA,CAAI,WAAW,MAAM,MAAA,EAAW;AACtF,EAAA,IAAI,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,CAAE,IAAA,CAAK,CAAAgB,OAAAA,KAAUA,OAAAA,CAAO,YAAA,CAAa,KAAK,CAAA,KAAM,GAAG,CAAA,EAAG;AACrF,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,EAAA,MAAA,CAAO,GAAA,GAAM,GAAA;AACb,EAAA,MAAA,CAAO,KAAA,GAAQ,IAAA;AACf,EAAA,QAAA,CAAS,IAAA,CAAK,OAAO,MAAM,CAAA;AAC/B;AAGA,SAAS,gBAAA,CAAiB,IAAA,EAA0B,SAAA,GAAY,GAAA,EAAsC;AAClG,EAAA,OAAO,IAAI,QAAQ,CAAA,OAAA,KAAW;AAC1B,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,IAAA,MAAM,UAAU,MAAM;AAClB,MAAA,MAAM,OAAA,GAAU,IAAA,EAAM,aAAA,CAA8B,WAAW,CAAA,IAAK,IAAA;AACpE,MAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,OAAO,OAAA,CAAQ,SAAS,UAAA,EAAY;AACxD,QAAA,OAAA,CAAQ,OAAO,CAAA;AACf,QAAA;AAAA,MACJ;AACA,MAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA,IAAW,SAAA,EAAW;AACnC,QAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,QAAA;AAAA,MACJ;AACA,MAAA,UAAA,CAAW,SAAS,GAAG,CAAA;AAAA,IAC3B,CAAA;AACA,IAAA,OAAA,EAAQ;AAAA,EACZ,CAAC,CAAA;AACL;AAOO,SAAS,UAAA,CAAW,EAAE,MAAA,EAAO,EAAwB;AACxD,EAAA,MAAM,EAAE,OAAO,CAAA,EAAG,IAAA,EAAM,OAAO,UAAA,EAAY,QAAA,EAAU,WAAA,EAAY,GAAI,QAAA,EAAS;AAC9E,EAAA,MAAM,aAAa,YAAA,CAAa,WAAA,CAAY,kBAAkB,WAAA,CAAY,MAAA,EAAQ,YAAY,QAAQ,CAAA;AACtG,EAAA,MAAM,OAAO,YAAA,CAAa,KAAA,EAAO,WAAS,WAAA,CAAY,KAAA,EAAO,MAAM,CAAC,CAAA;AACpE,EAAA,MAAM,WAAW,YAAA,CAAa,KAAA,EAAO,WAAS,KAAA,CAAM,IAAA,IAAQ,MAAM,QAAQ,CAAA;AAC1E,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,KAAA,EAAO,CAAA,KAAA,KAAS,MAAM,OAAO,CAAA;AAC1D,EAAA,MAAMP,MAAAA,GAAQ,YAAA,CAAa,KAAA,EAAO,CAAA,KAAA,KAAS,MAAM,KAAK,CAAA;AACtD,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,KAAA,EAAO,CAAA,KAAA,KAAS,MAAM,OAAO,CAAA;AAC1D,EAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,KAAA,EAAO,CAAA,KAAA,KAAS,MAAM,aAAa,CAAA;AACtE,EAAA,MAAM,eAAA,GAAkB,YAAA,CAAa,KAAA,EAAO,CAAA,KAAA,KAAS,MAAM,eAAe,CAAA;AAC1E,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIR,QAAAA,CAA2G,EAAE,KAAA,EAAO,MAAA,EAAW,KAAA,EAAO,EAAC,EAAG,MAAA,EAAQ,WAAW,CAAA;AAC7L,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAkG,IAAI,CAAA;AACpI,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,MAAA,GAASC,OAAuB,IAAI,CAAA;AAC1C,EAAA,MAAM,IAAA,GAAOA,OAAuB,IAAI,CAAA;AACxC,EAAA,MAAM,QAAA,GAAWA,OAAuB,IAAI,CAAA;AAC5C,EAAA,MAAM,WAAA,GAAcA,OAAyB,IAAI,CAAA;AACjD,EAAA,MAAM,MAAA,GAASA,OAA2B,IAAI,CAAA;AAC9C,EAAA,MAAM,EAAE,MAAK,GAAI,KAAA;AACjB,EAAA,MAAM,SAAS,IAAA,CAAK,SAAA;AAKpB,EAAA,MAAM,aAAa,IAAA,CAAK,OAAA,IAAW,KAAK,UAAA,KAAe,MAAA,GAAY,GAAG,IAAA,CAAK,UAAU,CAAA,CAAA,EAAI,KAAA,CAAM,QAAQ,MAAA,CAAO,CAAC,GAAG,OAAA,CAAQ,EAAA,IAAM,EAAE,CAAA,CAAA,GAAK,IAAA;AACvI,EAAA,MAAM,WAAA,GAAcS,YAAY,MAAM;AAClC,IAAA,IAAI,UAAA,KAAe,IAAA,IAAQ,IAAA,CAAK,UAAA,KAAe,MAAA,EAAW;AAC1D,IAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,GAAA,GAAM,UAAA,KAAe,UAAA;AACjD,IAAA,KAAA,CAAM,GAAA,CAAI,EAAE,aAAA,EAAe,SAAA,EAAW,YAAY,CAAA;AAClD,IAAA,WAAA,CAAY,IAAA,CAAK,UAAU,CAAA,CACtB,IAAA,CAAK,CAAA,MAAA,KAAU;AACZ,MAAA,IAAI,OAAA,EAAQ,EAAG,KAAA,CAAM,GAAA,CAAI,EAAE,OAAA,EAAS,YAAA,CAAa,MAAM,CAAA,EAAG,aAAA,EAAe,OAAA,EAAS,CAAA;AAAA,IACtF,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AACT,MAAA,IAAI,SAAQ,EAAG,KAAA,CAAM,IAAI,EAAE,aAAA,EAAe,eAAe,CAAA;AAAA,IAC7D,CAAC,CAAA;AAAA,EACT,GAAG,CAAC,UAAA,EAAY,IAAA,CAAK,UAAA,EAAY,KAAK,CAAC,CAAA;AACvC,EAAAP,UAAU,MAAM;AACZ,IAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,EAAI;AACxB,IAAA,IAAI,KAAA,CAAM,eAAe,UAAA,EAAY;AACjC,MAAA,KAAA,CAAM,GAAA,CAAI,EAAE,OAAA,EAAS,IAAI,aAAA,EAAe,MAAA,EAAQ,YAAY,CAAA;AAC5D,MAAA,WAAA,EAAY;AAAA,IAChB,CAAA,MAAA,IAAW,KAAA,CAAM,aAAA,KAAkB,MAAA,EAAQ,WAAA,EAAY;AAAA,EAC3D,CAAA,EAAG,CAAC,UAAA,EAAY,WAAA,EAAa,KAAK,CAAC,CAAA;AACnC,EAAAA,UAAU,MAAM;AACZ,IAAA,IAAI,QAAQ,KAAA,CAAM,GAAA,EAAI,CAAE,aAAA,KAAkB,WAAW,WAAA,EAAY;AAAA,EACrE,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAGT,EAAAA,UAAU,MAAM;AACZ,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,CAAK,OAAA,IAAW,KAAK,WAAA,KAAgB,MAAA,IAAa,IAAA,CAAK,KAAA,KAAU,MAAA,EAAW;AAC1F,IAAA,IAAI,SAAS,KAAA,KAAU,IAAA,CAAK,KAAA,IAAS,QAAA,CAAS,WAAW,OAAA,EAAS;AAClE,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,WAAA,CAAY,EAAE,OAAO,IAAA,CAAK,KAAA,EAAO,OAAO,EAAC,EAAG,MAAA,EAAQ,SAAA,EAAW,CAAA;AAC/D,IAAA,WAAA,CAAY,KAAK,WAAA,CAAY,KAAA,CAAM,SAAS,CAAA,CAAE,KAAK,kBAAA,CAAmB,IAAA,CAAK,KAAK,CAAC,GAAG,EAAE,MAAA,EAAQ,WAAW,MAAA,EAAQ,EAC5G,IAAA,CAAK,CAAA,MAAA,KAAU,WAAA,CAAY,EAAE,OAAO,IAAA,CAAK,KAAA,EAAO,OAAO,aAAA,CAAc,MAAM,EAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,EAAG,QAAQ,OAAA,EAAS,CAAC,CAAA,CAC5G,KAAA,CAAM,CAAC,KAAA,KAAmB;AACvB,MAAA,IAAK,KAAA,EAA6B,IAAA,KAAS,YAAA,EAAc,WAAA,CAAY,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,EAAC,EAAG,MAAA,EAAQ,eAAe,CAAA;AAAA,IAChI,CAAC,CAAA;AACL,IAAA,OAAO,MAAM,WAAW,KAAA,EAAM;AAAA,EAClC,CAAA,EAAG,CAAC,IAAA,EAAM,IAAA,CAAK,SAAS,IAAA,CAAK,WAAA,EAAa,IAAA,CAAK,KAAK,CAAC,CAAA;AAGrD,EAAAA,UAAU,MAAM;AACZ,IAAA,MAAM,CAAA,GAAIK,OAAM,IAAA,EAAK;AACrB,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,KAAK,SAAA,KAAc,MAAA,IAAa,MAAM,EAAA,EAAI;AAC3D,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA;AAAA,IACJ;AACA,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC3B,MAAA,UAAA,CAAW,CAAA,OAAA,MAAY,EAAE,CAAA,EAAG,KAAA,EAAO,OAAA,EAAS,SAAS,EAAC,EAAG,MAAA,EAAQ,SAAA,EAAU,CAAE,CAAA;AAC7E,MAAA,WAAA,CAAY,SAAA,CAAU,IAAA,CAAK,SAAA,EAAY,EAAE,GAAG,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,CAAA,EAAG,EAAE,MAAA,EAAQ,UAAA,CAAW,QAAQ,CAAA,CAC1F,IAAA,CAAK,CAAA,MAAA,KAAU,UAAA,CAAW,EAAE,CAAA,EAAG,KAAA,EAAO,cAAc,MAAM,CAAA,EAAG,MAAA,EAAQ,OAAA,EAAS,CAAC,CAAA,CAC/E,KAAA,CAAM,CAAC,KAAA,KAAmB;AACvB,QAAA,IAAK,KAAA,EAA6B,IAAA,KAAS,YAAA,EAAc,UAAA,CAAW,EAAE,CAAA,EAAG,KAAA,EAAO,EAAC,EAAG,MAAA,EAAQ,aAAA,EAAe,CAAA;AAAA,MAC/G,CAAC,CAAA;AAAA,IACT,GAAG,WAAW,CAAA;AACd,IAAA,OAAO,MAAM;AACT,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,UAAA,CAAW,KAAA,EAAM;AAAA,IACrB,CAAA;AAAA,EACJ,CAAA,EAAG,CAACA,MAAAA,EAAO,IAAA,CAAK,SAAS,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,KAAK,CAAC,CAAA;AAGpD,EAAAL,UAAU,MAAM;AACZ,IAAA,IAAI,IAAA,IAAQ,KAAK,OAAA,IAAW,IAAA,CAAK,eAAe,MAAA,EAAW,YAAA,CAAa,IAAA,CAAK,SAAA,IAAa,sBAAsB,CAAA;AAAA,EACpH,CAAA,EAAG,CAAC,IAAA,EAAM,IAAA,CAAK,SAAS,IAAA,CAAK,UAAA,EAAY,IAAA,CAAK,SAAS,CAAC,CAAA;AAGxD,EAAA,MAAM,MAAA,GAAS,WAAW,KAAK,CAAA;AAC/B,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AACxC,EAAAA,UAAU,MAAM;AACZ,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,OAAA,EAAS,aAAA,CAA8B,WAAW,CAAA;AAC3E,IAAA,IAAI,OAAA,KAAY,QAAQ,OAAA,KAAY,MAAA,UAAmB,MAAA,GAAS,IAAA,CAAK,MAAM,UAAU,CAAA;AAAA,EACzF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,MAAM,QAAA,GAAWO,WAAAA;AAAA,IACb,OAAO,GAAA,EAAc,QAAA,GAAW,KAAA,KAAU;AACtC,MAAA,cAAA,CAAe,KAAK,CAAA;AACpB,MAAA,IAAI,IAAA,CAAK,eAAe,MAAA,EAAW;AAC/B,QAAA,cAAA,CAAe,IAAI,CAAA;AACnB,QAAA;AAAA,MACJ;AACA,MAAA,YAAA,CAAa,IAAA,CAAK,aAAa,sBAAsB,CAAA;AACrD,MAAA,MAAM,OAAA,GAAU,MAAM,gBAAA,CAAiB,QAAA,CAAS,OAAO,CAAA;AACvD,MAAA,IAAI,YAAY,IAAA,EAAM;AAClB,QAAA,cAAA,CAAe,IAAI,CAAA;AACnB,QAAA;AAAA,MACJ;AACA,MAAA,OAAA,CAAQ,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AACtC,MAAA,IAAI,YAAY,OAAO,OAAA,CAAQ,aAAa,UAAA,EAAY,KAAK,QAAQ,QAAA,EAAS;AAAA,WAAA,IACrE,GAAA,KAAQ,MAAA,IAAa,GAAA,KAAQ,EAAA,IAAM,OAAO,OAAA,CAAQ,GAAA,KAAQ,UAAA,EAAY,KAAK,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,QAAQ,MAAM,CAAA;AAAA,WAC9G,KAAK,QAAQ,IAAA,IAAO;AAAA,IAC7B,CAAA;AAAA,IACA,CAAC,IAAA,CAAK,UAAA,EAAY,IAAA,CAAK,WAAW,UAAU;AAAA,GAChD;AAEA,EAAAP,UAAU,MAAM;AACZ,IAAA,IAAI,eAAA,KAAoB,IAAA,IAAQ,CAAC,IAAA,EAAM;AACvC,IAAA,KAAA,CAAM,GAAA,CAAI,EAAE,eAAA,EAAiB,IAAA,EAAM,CAAA;AACnC,IAAA,WAAA,CAAY,eAAe,CAAA;AAC3B,IAAA,KAAK,SAAS,eAAe,CAAA;AAAA,EACjC,GAAG,CAAC,eAAA,EAAiB,IAAA,EAAM,QAAA,EAAU,KAAK,CAAC,CAAA;AAG3C,EAAAa,gBAAgB,MAAM;AAClB,IAAA,IAAI,IAAA,IAAQ,KAAK,OAAA,KAAY,IAAA,OAAW,OAAA,CAAQ,SAAA,GAAY,KAAA,CAAM,GAAA,EAAI,CAAE,SAAA;AAAA,EAC5E,CAAA,EAAG,CAAC,IAAA,EAAM,OAAA,EAAS,KAAK,CAAC,CAAA;AAKzB,EAAA,MAAM,OAAA,GAAUf,OAAO,IAAI,CAAA;AAC3B,EAAAE,UAAU,MAAM;AACZ,IAAA,MAAM,MAAA,GAAS,IAAA,IAAQ,CAAC,OAAA,CAAQ,OAAA;AAChC,IAAA,MAAM,MAAA,GAAS,CAAC,IAAA,IAAQ,OAAA,CAAQ,OAAA;AAChC,IAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAClB,IAAA,IAAI,MAAA,EAAQ;AACR,MAAA,MAAM,SAAS,QAAA,CAAS,aAAA;AACxB,MAAA,IAAI,MAAA,KAAW,QAAQ,MAAA,KAAW,QAAA,CAAS,QAAQ,MAAA,CAAO,OAAA,EAAS,QAAA,CAAS,MAAM,CAAA,EAAG;AACjF,QAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAS,WAAA,GAAc,OAAO,OAAA,GAAU,QAAA,CAAS,cAA2B,uCAAuC,CAAA;AACvI,QAAA,IAAA,EAAM,KAAA,EAAM;AAAA,MAChB;AACA,MAAA,MAAA,CAAO,OAAA,GAAU,IAAA;AACjB,MAAA;AAAA,IACJ;AACA,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAI,MAAA,EAAQ;AACR,MAAA,MAAM,SAAS,QAAA,CAAS,aAAA;AACxB,MAAA,MAAA,CAAO,OAAA,GAAU,MAAA,YAAkB,WAAA,IAAe,MAAA,KAAW,QAAA,CAAS,IAAA,IAAQ,CAAC,MAAA,CAAO,OAAA,EAAS,QAAA,CAAS,MAAM,CAAA,GAAI,MAAA,GAAS,IAAA;AAAA,IAC/H;AACA,IAAA,IAAI,MAAA,IAAU,YAAA,EAAa,IAAK,KAAA,CAAM,GAAA,GAAM,OAAA,KAAY,IAAA,EAAM,WAAA,CAAY,OAAA,EAAS,KAAA,EAAM;AAAA,SAAA,IAChF,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,OAAA,EAAS,QAAA,CAAS,QAAA,CAAS,aAAa,CAAA,EAAG,MAAA,CAAO,OAAA,EAAS,KAAA,EAAM;AAAA,EACjG,CAAA,EAAG,CAAC,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAC,CAAA;AAExB,EAAA,MAAM,QAAA,GAAW,CAAC,MAAA,KAA0B;AACxC,IAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AACpB,IAAA,KAAA,CAAM,GAAA,CAAI,YAAU,EAAE,OAAA,EAAS,MAAM,OAAA,CAAQ,GAAA,CAAI,UAAS,IAAA,CAAK,EAAA,KAAO,OAAO,EAAA,GAAK,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,OAAM,GAAI,IAAK,GAAE,CAAE,CAAA;AACxH,IAAA,IAAI,IAAA,CAAK,UAAA,KAAe,MAAA,EAAW,WAAA,CAAY,CAAA,EAAG,KAAK,UAAA,CAAW,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,CAAA,EAAI,mBAAmB,MAAA,CAAO,EAAE,CAAC,CAAA,KAAA,CAAA,EAAS,EAAE,MAAA,EAAQ,QAAQ,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,EAC3K,CAAA;AACA,EAAA,MAAM,UAAA,GAAa,CAAC,MAAA,KAA0B;AAC1C,IAAA,QAAA,CAAS,MAAM,CAAA;AACf,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,MAAA,EAAQ,KAAK,QAAA,EAAS;AAAA,SAAA,IACjC,MAAA,CAAO,QAAQ,MAAA,EAAW,QAAA,CAAS,OAAO,GAAA,EAAK,EAAE,MAAA,EAAQ,IAAA,EAAM,CAAA;AAAA,SAAA,IAC/D,WAAW,MAAA,EAAW,QAAA,CAAS,QAAQ,EAAE,MAAA,EAAQ,MAAM,CAAA;AAAA,EACpE,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,CAAO,CAAA,MAAA,KAAU,OAAO,MAAM,CAAA;AACrD,EAAA,MAAM,WAAA,GAAc,CAAC,IAAA,CAAK,OAAA,IAAW,aAAA,KAAkB,iBAAiB,QAAA,CAAS,MAAA,KAAW,aAAA,IAAiB,OAAA,EAAS,MAAA,KAAW,aAAA;AACjI,EAAA,MAAM,KAAA,GAAQ,aAAa,KAAK,CAAA;AAEhC,EAAA,MAAM,MAAA,GAAS,CAAC,KAAA,KAAqB;AACjC,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,KAAK,QAAA,CAAS,QAAA,CAAS,IAAA,EAAM,CAAA;AAAA,EACjC,CAAA;AAEA,EAAA,uBACIC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,GAAA,EAAK,MAAA;AAAA,MACL,EAAA,EAAG,UAAA;AAAA,MACH,SAAA,EAAW,CAAA,SAAA,EAAY,MAAA,GAAS,WAAA,GAAc,YAAY,CAAA,CAAA;AAAA,MAC1D,QAAQ,CAAC,IAAA;AAAA,MACT,eAAA,EAAe,WAAW,MAAA,GAAS,MAAA;AAAA,MACnC,YAAA,EAAY,EAAE,MAAM,CAAA;AAAA,MACpB,IAAA,EAAM,SAAS,eAAA,GAAkB,QAAA;AAAA,MACjC,YAAA,EAAY,SAAS,MAAA,GAAY,IAAA;AAAA,MACjC,QAAA,EAAU,EAAA;AAAA,MACV,WAAW,CAAA,KAAA,KAAS;AAChB,QAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,QAAA,IAAY,CAAC,MAAM,gBAAA,EAAkB;AACnD,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,UAAA,CAAW,KAAK,CAAA;AAAA,QACpB;AACA,QAAA,IAAI,CAAC,MAAA,EAAQ,OAAA,CAAQ,KAAA,EAAO,OAAO,OAAO,CAAA;AAAA,MAC9C,CAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACV,QAAA,EAAA;AAAA,UAAA,OAAA,KAAY,uBACTP,GAAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,WAAU,iBAAA,EAAkB,OAAA,EAAS,MAAM,KAAA,CAAM,GAAA,CAAI,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA,EAAG,YAAA,EAAY,EAAE,cAAc,CAAA,EACvH,0BAAAA,GAAAA,CAACoB,SAAAA,EAAA,EAAU,IAAA,EAAM,EAAA,EAAI,aAAa,GAAA,EAAK,aAAA,EAAW,MAAC,CAAA,EACvD,CAAA,mBAEApB,GAAAA,CAAC,QAAA,EAAA,EAAS,WAAU,eAAA,EAAgB,IAAA,EAAM,IAAI,WAAA,EAAa,GAAA,EAAK,eAAW,IAAA,EAAC,CAAA;AAAA,0BAEhFA,GAAAA,CAAC,IAAA,EAAA,EAAG,WAAU,gBAAA,EAAkB,QAAA,EAAA,CAAA,CAAE,MAAM,CAAA,EAAE,CAAA;AAAA,UACzC,MAAA,KAAW,MAAA,oBACRA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iBAAA,EAAkB,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAO,QAAA,EAAS,GAAA,EAAI,YAAW,YAAA,EAAY,CAAA,CAAE,qCAAqC,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,gBAAgB,CAAA,EACvJ,0BAAAA,GAAAA,CAACS,YAAAA,EAAA,EAAa,IAAA,EAAM,EAAA,EAAI,WAAA,EAAa,GAAA,EAAK,aAAA,EAAW,MAAC,CAAA,EAC1D,CAAA;AAAA,0BAEJT,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,WAAU,iBAAA,EAAkB,OAAA,EAAS,MAAM,UAAA,CAAW,KAAK,CAAA,EAAG,cAAY,CAAA,CAAE,YAAY,CAAA,EAC1G,QAAA,kBAAAA,GAAAA,CAAC,CAAA,EAAA,EAAE,IAAA,EAAM,EAAA,EAAI,WAAA,EAAa,GAAA,EAAK,aAAA,EAAW,IAAA,EAAC,CAAA,EAC/C;AAAA,SAAA,EACJ,CAAA;AAAA,wBACAO,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,eAAA,EACT,QAAA,EAAA;AAAA,0BAAAP,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAA,CAAA,CAAE,cAAc,CAAA,EAAE,CAAA;AAAA,0BACzDO,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAe,OAAO,CAAC,KAAA,CAAM,IAAA,EAAM,KAAA,EAAO,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,QAAK,CAAA,EACtF,QAAA,EAAA;AAAA,YAAA,KAAA,CAAM,IAAA,EAAM,UAAU,MAAA,oBAAaP,IAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,KAAA,CAAM,KAAK,KAAA,EAAM,CAAA;AAAA,YAC7D,KAAA,CAAM,IAAA,EAAM,KAAA,KAAU,MAAA,IAAa,UAAU,EAAA,IAAM,QAAA;AAAA,YACnD;AAAA,WAAA,EACL;AAAA,SAAA,EACJ,CAAA;AAAA,wBACAO,IAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,IAAA,EAAM,WAAU,eAAA,EAAgB,QAAA,EAAU,CAAA,KAAA,KAAS,KAAA,CAAM,IAAI,EAAE,SAAA,EAAW,MAAM,aAAA,CAAc,SAAA,EAAW,CAAA,EAC9G,QAAA,EAAA;AAAA,UAAA,OAAA,KAAY,IAAA,mBACTA,IAAAA,CAAC,SAAA,EAAA,EAAQ,WAAU,kBAAA,EACf,QAAA,EAAA;AAAA,4BAAAP,GAAAA,CAAC,IAAA,EAAA,EAAI,QAAA,EAAA,OAAA,CAAQ,KAAA,EAAM,CAAA;AAAA,YAAA,CACjB,OAAA,CAAQ,QAAQ,OAAA,CAAQ,OAAA,IAAW,IAAI,KAAA,CAAM,QAAQ,EAAE,MAAA,CAAO,OAAO,EAAE,GAAA,CAAI,CAAC,WAAW,KAAA,qBAAUA,IAAC,GAAA,EAAA,EAAe,QAAA,EAAA,SAAA,EAAA,EAAR,KAAkB,CAAI,CAAA;AAAA,YAChI,OAAA,CAAQ,GAAA,KAAQ,MAAA,oBACbO,KAAC,GAAA,EAAA,EAAE,SAAA,EAAU,UAAA,EAAW,IAAA,EAAM,OAAA,CAAQ,GAAA,EAAK,MAAA,EAAO,QAAA,EAAS,KAAI,UAAA,EAC1D,QAAA,EAAA;AAAA,cAAA,CAAA,CAAE,uBAAuB,CAAA;AAAA,cAAE,GAAA;AAAA,8BAACP,IAACS,YAAAA,EAAA,EAAa,MAAM,EAAA,EAAI,WAAA,EAAa,GAAA,EAAK,aAAA,EAAW,IAAA,EAAC;AAAA,aAAA,EACvF;AAAA,WAAA,EAER,CAAA,mBAEAF,IAAAA,CAAAC,QAAAA,EAAA,EACK,QAAA,EAAA;AAAA,YAAA,WAAA,oBACGD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EAAkB,MAAK,QAAA,EAClC,QAAA,EAAA;AAAA,8BAAAP,IAAC,WAAA,EAAA,EAAY,IAAA,EAAM,IAAI,WAAA,EAAa,GAAA,EAAK,eAAW,IAAA,EAAC,CAAA;AAAA,8BACrDA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,IAAA,CAAK,OAAA,GAAU,EAAE,sEAAsE,CAAA,GAAI,CAAA,CAAE,iCAAiC,CAAA,EAAE,CAAA;AAAA,cACtI,IAAA,CAAK,OAAA,oBAAWA,GAAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,SAAA,EAAU,UAAA,EAAW,OAAA,EAAS,MAAM;AAAE,gBAAA,WAAA,EAAY;AAAG,gBAAA,WAAA,CAAY,CAAA,OAAA,MAAY,EAAE,GAAG,OAAA,EAAS,QAAQ,SAAA,EAAW,KAAA,EAAO,QAAU,CAAE,CAAA;AAAA,cAAG,CAAA,EAAI,QAAA,EAAA,CAAA,CAAE,WAAW,CAAA,EAAE;AAAA,aAAA,EAClM,CAAA;AAAA,YAEH,MAAA,CAAO,MAAA,GAAS,CAAA,IAAK,OAAA,CAAQ,MAAA,GAAS,CAAA,mBACnCO,IAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,kBAAA,EAAmB,iBAAA,EAAgB,kBAAA,EAClD,QAAA,EAAA;AAAA,8BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACX,QAAA,EAAA;AAAA,gCAAAP,IAAC,MAAA,EAAA,EAAK,EAAA,EAAG,kBAAA,EAAoB,QAAA,EAAA,CAAA,CAAE,iBAAiB,CAAA,EAAE,CAAA;AAAA,gBACjD,OAAO,MAAA,GAAS,CAAA,oBAAKA,GAAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,SAAA,EAAU,cAAA,EAAe,OAAA,EAAS,MAAM,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAI,QAAA,EAAA,CAAA,CAAE,eAAe,CAAA,EAAE;AAAA,eAAA,EACtI,CAAA;AAAA,8BACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,UAAA,EAAW,IAAA,EAAK,MAAA,EACzB,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,MAAA,qBACTA,GAAAA,CAAC,IAAA,EAAA,EACG,QAAA,kBAAAO,IAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAW,CAAA,WAAA,EAAc,MAAA,CAAO,MAAA,GAAS,WAAA,GAAc,EAAE,CAAA,CAAA,EAAI,OAAA,EAAS,MAAM,UAAA,CAAW,MAAM,CAAA,EAC9G,QAAA,EAAA;AAAA,gBAAA,MAAA,CAAO,IAAA,KAAS,yBAASP,GAAAA,CAAC,iBAAc,IAAA,EAAM,EAAA,EAAI,aAAa,GAAA,EAAK,aAAA,EAAW,MAAC,CAAA,mBAAKA,IAAC,MAAA,EAAA,EAAO,IAAA,EAAM,IAAI,WAAA,EAAa,GAAA,EAAK,eAAW,IAAA,EAAC,CAAA;AAAA,gCACtIO,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EACZ,QAAA,EAAA;AAAA,kCAAAP,GAAAA,CAAC,UAAK,SAAA,EAAU,+BAAA,EAAgC,OAAO,MAAA,CAAO,KAAA,EAAQ,iBAAO,KAAA,EAAM,CAAA;AAAA,kBAClF,MAAA,CAAO,YAAY,MAAA,oBAAaA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EAAsB,QAAA,EAAA,MAAA,CAAO,OAAA,EAAQ;AAAA,iBAAA,EAC1F,CAAA;AAAA,gCACAO,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EACX,QAAA,EAAA;AAAA,kBAAA,MAAA,CAAO,EAAA,KAAO,MAAA,oBAAaP,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,MAAA,CAAO,EAAA,EAAK,QAAA,EAAA,UAAA,CAAW,MAAA,CAAO,EAAE,CAAA,EAAE,CAAA;AAAA,kBAC7E,MAAA,CAAO,MAAA,oBAAUA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,gBAAA,EAAiB,YAAA,EAAY,CAAA,CAAE,QAAQ,CAAA,EAAG;AAAA,iBAAA,EAChF;AAAA,eAAA,EACJ,CAAA,EAAA,EAXK,MAAA,CAAO,EAYhB,CACH,CAAA,EACL;AAAA,aAAA,EACJ,CAAA,GACA,IAAA;AAAA,4BACJO,KAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,oBAAmB,YAAA,EAAY,CAAA,CAAE,gCAAgC,CAAA,EAChF,QAAA,EAAA;AAAA,8BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACX,QAAA,EAAA;AAAA,gCAAAP,GAAAA,CAACe,QAAA,EAAO,IAAA,EAAM,IAAI,WAAA,EAAa,GAAA,EAAK,eAAW,IAAA,EAAC,CAAA;AAAA,gCAChDf,GAAAA;AAAA,kBAAC,OAAA;AAAA,kBAAA;AAAA,oBACG,GAAA,EAAK,WAAA;AAAA,oBACL,IAAA,EAAK,QAAA;AAAA,oBACL,KAAA,EAAOW,MAAAA;AAAA,oBACP,QAAA,EAAU,WAAS,KAAA,CAAM,GAAA,CAAI,EAAE,KAAA,EAAO,KAAA,CAAM,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,oBAC1D,WAAA,EAAa,EAAE,gCAAgC,CAAA;AAAA,oBAC/C,YAAA,EAAY,EAAE,gCAAgC,CAAA;AAAA,oBAC9C,QAAA,EAAU,CAAC,IAAA,CAAK,OAAA,IAAW,KAAK,SAAA,KAAc;AAAA;AAAA;AAClD,eAAA,EACJ,CAAA;AAAA,cACC,OAAA,KAAY,IAAA,oBACTJ,IAAAA,CAAC,IAAA,EAAA,EAAG,WAAU,UAAA,EAAW,IAAA,EAAK,MAAA,EAAO,WAAA,EAAU,QAAA,EAC1C,QAAA,EAAA;AAAA,gBAAA,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,CAAA,IAAA,qBACfP,IAAC,IAAA,EAAA,EAAiB,QAAA,kBAAAA,GAAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,IAAA,EAAM,CAAA,EAAA,EAApC,IAAA,CAAK,EAAiC,CAClD,CAAA;AAAA,gBACA,QAAQ,MAAA,KAAW,OAAA,IAAW,QAAQ,KAAA,CAAM,MAAA,KAAW,qBAAKA,GAAAA,CAAC,QAAG,SAAA,EAAU,eAAA,EAAiB,YAAE,sCAAA,EAA8B,EAAE,OAAO,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAE,CAAA;AAAA,gBACjJ,OAAA,CAAQ,MAAA,KAAW,SAAA,IAAa,OAAA,CAAQ,MAAM,MAAA,KAAW,CAAA,oBAAKA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,eAAA,EAAiB,QAAA,EAAA,CAAA,CAAE,iBAAY,CAAA,EAAE;AAAA,eAAA,EAClH;AAAA,aAAA,EAER,CAAA;AAAA,YACC,IAAA,CAAK,KAAA,KAAU,MAAA,IAAa,QAAA,CAAS,KAAA,CAAM,MAAA,GAAS,CAAA,oBACjDO,IAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,kBAAA,EAAmB,mBAAgB,gBAAA,EAClD,QAAA,EAAA;AAAA,8BAAAP,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EAAmB,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,gBAAA,EAAkB,QAAA,EAAA,CAAA,CAAE,eAAe,CAAA,EAAE,CAAA,EAAO,CAAA;AAAA,8BACvFA,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,YAAW,IAAA,EAAK,MAAA,EACzB,QAAA,EAAA,QAAA,CAAS,KAAA,CAAM,GAAA,CAAI,CAAA,IAAA,qBAAQA,GAAAA,CAAC,IAAA,EAAA,EAAiB,QAAA,kBAAAA,GAAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,MAAM,CAAA,EAAA,EAApC,IAAA,CAAK,EAAiC,CAAK,CAAA,EACpF;AAAA,aAAA,EACJ,CAAA;AAAA,4BAEJO,IAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,kBAAA,EAAmB,mBAAgB,cAAA,EAClD,QAAA,EAAA;AAAA,8BAAAP,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EAAmB,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,cAAA,EAAgB,QAAA,EAAA,CAAA,CAAE,UAAU,CAAA,EAAE,CAAA,EAAO,CAAA;AAAA,8BAChFO,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,UAAU,MAAA,EAChC,QAAA,EAAA;AAAA,gCAAAP,GAAAA;AAAA,kBAAC,UAAA;AAAA,kBAAA;AAAA,oBACG,SAAA,EAAU,WAAA;AAAA,oBACV,IAAA,EAAM,CAAA;AAAA,oBACN,KAAA,EAAO,QAAA;AAAA,oBACP,QAAA,EAAU,CAAA,KAAA,KAAS,WAAA,CAAY,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,oBACjD,WAAA,EAAa,EAAE,2BAAsB,CAAA;AAAA,oBACrC,YAAA,EAAY,EAAE,UAAU,CAAA;AAAA,oBACxB,QAAA,EAAU,CAAC,IAAA,CAAK,OAAA,IAAW,KAAK,UAAA,KAAe,MAAA;AAAA,oBAC/C,WAAW,CAAA,KAAA,KAAS;AAChB,sBAAA,IAAI,KAAA,CAAM,QAAQ,OAAA,KAAY,KAAA,CAAM,WAAW,KAAA,CAAM,OAAA,CAAA,SAAiB,KAAK,CAAA;AAAA,oBAC/E;AAAA;AAAA,iBACJ;AAAA,gCACAO,IAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAU,CAAC,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,eAAe,MAAA,EAC3G,QAAA,EAAA;AAAA,kCAAAP,IAAC,QAAA,EAAA,EAAS,IAAA,EAAM,IAAI,WAAA,EAAa,GAAA,EAAK,eAAW,IAAA,EAAC,CAAA;AAAA,kBAAE,GAAA;AAAA,kBAAE,EAAE,KAAK;AAAA,iBAAA,EACjE;AAAA,eAAA,EACJ,CAAA;AAAA,cACC,WAAA,oBAAeA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oBAAmB,IAAA,EAAK,OAAA,EAAS,QAAA,EAAA,CAAA,CAAE,qEAAqE,CAAA,EAAE;AAAA,aAAA,EAC3I;AAAA,WAAA,EACJ,CAAA;AAAA,UAKH,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,UAAA,KAAe,MAAA,oBACjCA,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,QAAA,EAAU,SAAA,EAAU,eAAA,EAAgB,WAAA,EAAW,YAAY,IAAA,GAAO,SAAA,GAAY,MAAA,EACnF,QAAA,EAAA,aAAA,CAAc,WAAA,EAAa,EAAE,aAAA,EAAe,IAAA,CAAK,UAAA,EAAY,MAAA,EAAQ,UAAA,EAAY,CAAA,EACtF;AAAA,SAAA,EAER,CAAA;AAAA,wBACAO,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACX,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,WAAU,wBAAA,EAAyB,OAAA,EAAS,MAAM,KAAK,QAAA,CAAS,EAAE,mCAAmC,CAAA,EAAG,IAAI,CAAA,EAAG,QAAA,EAAU,CAAC,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,UAAA,KAAe,MAAA,EAChL,QAAA,EAAA;AAAA,4BAAAP,GAAAA,CAACqB,WAAA,EAAU,IAAA,EAAM,IAAI,WAAA,EAAa,GAAA,EAAK,eAAW,IAAA,EAAC,CAAA;AAAA,4BACnDrB,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,cAAA,EAAgB,QAAA,EAAA,CAAA,CAAE,kBAAkB,CAAA,EAAE;AAAA,WAAA,EAC1D,CAAA;AAAA,UACC,MAAA,KAAW,MAAA,oBACRO,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wBAAA,EAAyB,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAO,QAAA,EAAS,GAAA,EAAI,UAAA,EACpE,QAAA,EAAA;AAAA,4BAAAP,IAAC,QAAA,EAAA,EAAS,IAAA,EAAM,IAAI,WAAA,EAAa,GAAA,EAAK,eAAW,IAAA,EAAC,CAAA;AAAA,4BAClDA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,cAAA,EAAgB,QAAA,EAAA,CAAA,CAAE,gBAAgB,CAAA,EAAE,CAAA;AAAA,4BACpDA,GAAAA,CAACS,YAAAA,EAAA,EAAa,SAAA,EAAU,eAAA,EAAgB,IAAA,EAAM,EAAA,EAAI,WAAA,EAAa,GAAA,EAAK,aAAA,EAAW,IAAA,EAAC;AAAA,WAAA,EACpF;AAAA,SAAA,EAER;AAAA;AAAA;AAAA,GACJ;AAER;AAGO,SAAS,YAAA,CAAa,QAA4B,QAAA,EAAuD;AAC5G,EAAA,MAAM,MAAA,GAASJ,QAAQ,MAAM;AACzB,IAAA,MAAM,OAAA,GAAsC,EAAE,GAAA,EAAK,SAAA,EAAW,OAAO,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAU;AACjH,IAAA,IAAI;AACA,MAAA,OAAO,IAAI,KAAK,cAAA,CAAe,MAAA,EAAQ,EAAE,GAAG,OAAA,EAAS,UAAU,CAAA;AAAA,IACnE,CAAA,CAAA,MAAQ;AACJ,MAAA,OAAO,IAAI,IAAA,CAAK,cAAA,CAAe,MAAA,EAAW,OAAO,CAAA;AAAA,IACrD;AAAA,EACJ,CAAA,EAAG,CAAC,MAAA,EAAQ,QAAQ,CAAC,CAAA;AACrB,EAAA,OAAOQ,WAAAA,CAAY,CAAC,GAAA,KAAgB;AAChC,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,GAAG,CAAA;AACzB,IAAA,OAAO,MAAA,CAAO,MAAM,IAAA,CAAK,OAAA,EAAS,CAAA,GAAI,GAAA,GAAM,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAAA,EAClE,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AACf;AAEA,SAAS,UAAA,CAAW,EAAE,OAAA,EAAQ,EAA6B;AACvD,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,QAAA,EAAS;AACjC,EAAA,uBACIN,IAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,YAAA,EAAa,OAAA,EAAS,MAAM,WAAA,CAAY,OAAO,CAAA,EAC3E,QAAA,EAAA;AAAA,oBAAAP,IAAC,QAAA,EAAA,EAAS,IAAA,EAAM,IAAI,WAAA,EAAa,GAAA,EAAK,eAAW,IAAA,EAAC,CAAA;AAAA,oBAClDO,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EACZ,QAAA,EAAA;AAAA,sBAAAP,GAAAA,CAAC,UAAK,SAAA,EAAU,+BAAA,EAAgC,OAAO,OAAA,CAAQ,KAAA,EAAQ,kBAAQ,KAAA,EAAM,CAAA;AAAA,MACpF,OAAA,CAAQ,YAAY,MAAA,oBAAaA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EAAsB,QAAA,EAAA,OAAA,CAAQ,OAAA,EAAQ;AAAA,KAAA,EAC5F;AAAA,GAAA,EACJ,CAAA;AAER;ACzYO,IAAM,WAAA,GAAmD;AAAA,EAC5D,QAAA,EAAU,QAAA;AAAA,EACV,WAAA,EAAa,SAAA;AAAA,EACb,IAAA,EAAM,IAAA;AAAA,EACN,WAAA,EAAasB,QAAAA;AAAA,EACb,KAAA,EAAO,KAAA;AAAA,EACP,SAAA,EAAW,SAAA;AAAA,EACX,QAAA,EAAU,SAAA;AAAA,EACV,QAAA,EAAU,QAAA;AAAA,EACV,KAAA,EAAO,KAAA;AAAA,EACP,KAAA,EAAO,KAAA;AAAA,EACP,IAAA,EAAM,IAAA;AAAA,EACN,aAAA,EAAe,UAAA;AAAA,EACf,QAAA,EAAU,QAAA;AAAA,EACV,WAAA,EAAa,QAAA;AAAA,EACb,MAAA,EAAQ,MAAA;AAAA,EACR,YAAA,EAAc,SAAA;AAAA,EACd,KAAA,EAAOC,KAAAA;AAAA,EACP,YAAA,EAAc,SAAA;AAAA,EACd,IAAA,EAAM,IAAA;AAAA,EACN,KAAA,EAAO,KAAA;AAAA,EACP,GAAA,EAAK,GAAA;AAAA,EACL,kBAAA,EAAoB,eAAA;AAAA,EACpB,aAAA,EAAe,UAAA;AAAA,EACf,MAAA,EAAQ,MAAA;AAAA,EACR,WAAA,EAAaC,QAAAA;AAAA,EACb,IAAA,EAAM,IAAA;AAAA,EACN,IAAA,EAAM,IAAA;AAAA,EACN,IAAA,EAAM,IAAA;AAAA,EACN,gBAAA,EAAkBC,aAAAA;AAAA,EAClB,OAAA,EAAS,OAAA;AAAA,EACT,OAAA,EAAS,OAAA;AAAA,EACT,OAAA,EAAS,OAAA;AAAA,EACT,IAAA,EAAM,IAAA;AAAA,EACN,OAAA,EAAS,OAAA;AAAA,EACT,MAAA,EAAQ,MAAA;AAAA,EACR,MAAA,EAAQV,MAAAA;AAAA,EACR,IAAA,EAAM,IAAA;AAAA,EACN,MAAA,EAAQ,MAAA;AAAA,EACR,QAAA,EAAUW,QAAAA;AAAA,EACV,MAAA,EAAQ,MAAA;AAAA,EACR,cAAA,EAAgB,WAAA;AAAA,EAChB,QAAA,EAAUC,QAAAA;AAAA,EACV,GAAA,EAAK,GAAA;AAAA,EACL,KAAA,EAAO,KAAA;AAAA,EACP,KAAA,EAAOC,KAAAA;AAAA,EACP,MAAA,EAAQ,MAAA;AAAA,EACR,OAAA,EAAS,OAAA;AAAA,EACT,GAAA,EAAK;AACT;AAGO,SAAS,WAAA,CAAY,IAAA,EAA0B,KAAA,GAA6C,EAAC,EAAc;AAC9G,EAAA,IAAI,IAAA,KAAS,QAAW,OAAO,MAAA;AAC/B,EAAA,OAAO,KAAA,CAAM,IAAI,CAAA,IAAK,WAAA,CAAY,IAAI,CAAA,IAAK,MAAA;AAC/C;ACzGO,SAAS,OAAO,KAAA,EAAgD;AACnE,EAAA,OAAO,KAAA,CAAM,GAAA,IAAO,KAAA,CAAM,IAAA,IAAQ,GAAA;AACtC;AAQO,SAAS,WAAW,KAAA,EAA2C;AAClE,EAAA,MAAM,IAAA,uBAAW,GAAA,EAA0B;AAC3C,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACtB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,KAAU,MAAA,IAAa,IAAA,CAAK,UAAU,EAAA,GAAK,EAAA,GAAK,CAAA,EAAA,EAAK,IAAA,CAAK,KAAK,CAAA,CAAA;AAChF,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAG,KAAK,EAAE,KAAA,EAAO,GAAA,KAAQ,EAAA,GAAK,MAAA,GAAY,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,EAAC,EAAE;AACrF,IAAA,GAAA,CAAI,KAAA,CAAM,KAAK,IAAI,CAAA;AACnB,IAAA,IAAA,CAAK,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,EACrB;AACA,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,CAAA;AACnC;AAGO,SAAS,YAAA,CAAa,EAAE,IAAA,EAAK,EAAsB;AACtD,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,QAAA,EAAS;AACvB,EAAA,uBACIrB,IAAAA,CAAAC,QAAAA,EAAA,EACK,QAAA,EAAA;AAAA,IAAA,IAAA,CAAK,MAAA,KAAW,IAAA,oBACbD,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,cAAA,EAAe,KAAA,EAAO,CAAA,CAAE,kBAAkB,CAAA,EACtD,QAAA,EAAA;AAAA,sBAAAP,GAAAA,CAAC6B,MAAA,EAAK,IAAA,EAAM,IAAI,WAAA,EAAa,GAAA,EAAK,eAAW,IAAA,EAAC,CAAA;AAAA,sBAC9C7B,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,aAAA,EAAe,QAAA,EAAA,CAAA,CAAE,UAAU,CAAA,EAAE;AAAA,KAAA,EACjD,CAAA;AAAA,IAEH,KAAK,MAAA,KAAW,IAAA,IAAQ,KAAK,KAAA,KAAU,MAAA,IAAa,KAAK,KAAA,GAAQ,CAAA,oBAAKA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,eAAA,EAAiB,QAAA,EAAA,IAAA,CAAK,QAAQ,GAAA,GAAM,MAAA,GAAS,KAAK,KAAA,EAAM;AAAA,GAAA,EACnJ,CAAA;AAER;AAMO,SAAS,WAAA,CAAY,EAAE,KAAA,EAAO,UAAA,EAAW,EAA4E;AACxH,EAAA,MAAM,KAAKc,KAAAA,EAAM;AACjB,EAAA,MAAM,IAAA,GAAO,WAAW,KAAK,CAAA;AAC7B,EAAA,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAA,KAAO,GAAA,CAAI,UAAU,MAAS,CAAA,EAAG,uBAAOd,IAAAQ,QAAAA,EAAA,EAAG,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA,EAAE,CAAA;AAChF,EAAA,uBACIR,GAAAA,CAAAQ,QAAAA,EAAA,EACK,QAAA,EAAA,IAAA,CAAK,GAAA;AAAA,IAAI,CAAC,GAAA,EAAK,KAAA,KACZ,GAAA,CAAI,UAAU,MAAA,mBACVR,GAAAA,CAAC,KAAA,EAAA,EAAyB,SAAA,EAAU,aAAA,EAAe,QAAA,EAAA,GAAA,CAAI,KAAA,CAAM,IAAI,UAAU,CAAA,EAAA,EAAjE,CAAA,IAAA,EAAO,KAAK,CAAA,CAAuD,CAAA,mBAE7EO,IAAAA,CAAC,SAAyB,IAAA,EAAK,OAAA,EAAQ,iBAAA,EAAiB,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,EAAI,WAAU,aAAA,EAChF,QAAA,EAAA;AAAA,sBAAAP,GAAAA,CAAC,KAAA,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,EAAI,SAAA,EAAU,eAAA,EAAiB,QAAA,EAAA,GAAA,CAAI,KAAA,EAAM,CAAA;AAAA,MAC/D,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,UAAU;AAAA,KAAA,EAAA,EAFnB,CAAA,IAAA,EAAO,KAAK,CAAA,CAGtB;AAAA,GAER,EACJ,CAAA;AAER;AClDO,SAAS,MAAM,EAAE,KAAA,EAAO,MAAM,OAAA,EAAS,QAAA,EAAU,MAAK,EAA2G;AACpK,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,QAAA,EAAS;AACvB,EAAA,MAAM,KAAA,GAAQI,OAAuB,IAAI,CAAA;AACzC,EAAA,MAAM,SAASA,MAAAA,CAAuB,OAAO,aAAa,WAAA,GAAc,QAAA,CAAS,gBAAgB,IAAI,CAAA;AACrG,EAAAE,UAAU,MAAM;AACZ,IAAA,KAAA,CAAM,SAAS,KAAA,EAAM;AACrB,IAAA,MAAM,OAAO,MAAA,CAAO,OAAA;AACpB,IAAA,OAAO,MAAM;AACT,MAAA,IAAI,IAAA,YAAgB,WAAA,EAAa,IAAA,CAAK,KAAA,EAAM;AAAA,IAChD,CAAA;AAAA,EACJ,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,uBACIN,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EAAiC,eAAe,CAAA,KAAA,KAAS;AAAE,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,KAAA,CAAM,aAAA,EAAe,OAAA,EAAQ;AAAA,EAAG,GAC3H,QAAA,kBAAAO,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,GAAA,EAAK,KAAA;AAAA,MACL,SAAA,EAAW,uBAAuB,IAAI,CAAA,CAAA;AAAA,MACtC,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAW,MAAA;AAAA,MACX,YAAA,EAAY,KAAA;AAAA,MACZ,QAAA,EAAU,EAAA;AAAA,MACV,WAAW,CAAA,KAAA,KAAS;AAChB,QAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,QAAA,IAAY,CAAC,MAAM,gBAAA,EAAkB;AACnD,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,OAAA,EAAQ;AAAA,QACZ;AACA,QAAA,OAAA,CAAQ,KAAA,EAAO,MAAM,OAAO,CAAA;AAAA,MAChC,CAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACV,QAAA,EAAA;AAAA,UAAA,IAAA,oBAAQP,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,mBAAmB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,0BACpDA,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,iBAAA,EAAkB,OAAA,EAAS,OAAA,EAAS,YAAA,EAAY,CAAA,CAAE,OAAO,CAAA,EACrF,QAAA,kBAAAA,GAAAA,CAAC8B,CAAAA,EAAA,EAAE,IAAA,EAAM,IAAI,WAAA,EAAa,GAAA,EAAK,aAAA,EAAW,IAAA,EAAC,CAAA,EAC/C;AAAA,SAAA,EACJ,CAAA;AAAA,wBACA9B,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAkB,QAAA,EAAS;AAAA;AAAA;AAAA,GAC9C,EACJ,CAAA;AAER;AAGO,SAAS,QAAA,CAAS,EAAE,OAAA,EAAQ,EAA4B;AAC3D,EAAA,MAAM,EAAE,KAAA,EAAO,CAAA,EAAG,IAAA,EAAM,KAAA,KAAU,QAAA,EAAS;AAC3C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIG,SAAyB,KAAK,CAAA;AACtD,EAAA,IAAI,SAAS,MAAA,EAAQ;AACjB,IAAA,uBACIH,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,KAAA,EAAO,EAAE,YAAY,CAAA;AAAA,QACrB,IAAA,EAAK,MAAA;AAAA,QACL,OAAA;AAAA,QACA,IAAA,kBACIO,IAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,iCAAA,EAAkC,OAAA,EAAS,MAAM,OAAA,CAAQ,KAAK,CAAA,EAC1F,QAAA,EAAA;AAAA,0BAAAP,GAAAA,CAACoB,WAAA,EAAU,IAAA,EAAM,IAAI,WAAA,EAAa,GAAA,EAAK,eAAW,IAAA,EAAC,CAAA;AAAA,0BACnDpB,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,cAAA,EAAgB,QAAA,EAAA,CAAA,CAAE,YAAY,CAAA,EAAE;AAAA,SAAA,EACpD,CAAA;AAAA,QAGJ,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAW,KAAA,EAAO;AAAA;AAAA,KAC/B;AAAA,EAER;AACA,EAAA,uBACIO,KAAC,KAAA,EAAA,EAAM,KAAA,EAAO,MAAM,GAAA,CAAI,IAAA,EAAM,IAAA,EAAK,MAAA,EAAO,OAAA,EACtC,QAAA,EAAA;AAAA,oBAAAP,GAAAA,CAAC,KAAA,EAAA,EAAI,YAAA,EAAY,CAAA,CAAE,YAAY,CAAA,EAAG,SAAA,EAAU,UAAA,EACvC,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAA,IAAA,KAAQ;AACzB,MAAA,MAAM,IAAA,GAAO,WAAA,CAAY,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AACzC,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,KAAQ,KAAA,CAAM,GAAA,CAAI,UAAA;AAC1C,MAAA,uBACIO,IAAAA,CAAC,KAAA,EAAA,EAAmB,SAAA,EAAU,gBAAA,EAC1B,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,MAAA,CAAO,IAAI,CAAA,EAAG,SAAA,EAAW,CAAA,uBAAA,EAA0B,UAAA,GAAA,CAAe,IAAA,CAAK,KAAA,IAAS,IAAI,MAAA,GAAS,CAAA,GAAI,SAAA,GAAY,YAAA,GAAgB,EAAE,CAAA,CAAA,EAAI,cAAA,EAAc,UAAA,IAAA,CAAe,IAAA,CAAK,KAAA,IAAS,EAAC,EAAG,MAAA,IAAU,CAAA,GAAI,MAAA,GAAS,MAAA,EAAW,SAAS,OAAA,EACrO,QAAA,EAAA;AAAA,0BAAAP,IAAC,IAAA,EAAA,EAAK,IAAA,EAAM,IAAI,WAAA,EAAa,GAAA,EAAK,eAAW,IAAA,EAAC,CAAA;AAAA,0BAC9CA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAgB,eAAK,KAAA,EAAM;AAAA,SAAA,EAC/C,CAAA;AAAA,QAAA,CACE,IAAA,CAAK,KAAA,IAAS,EAAC,EAAG,MAAA,GAAS,CAAA,oBACzBA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACX,QAAA,kBAAAA,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACG,KAAA,EAAO,IAAA,CAAK,KAAA,IAAS,EAAC;AAAA,YACtB,YAAY,CAAA,IAAA,KAAQ;AAChB,cAAA,MAAM,EAAA,GAAK,UAAA,IAAc,IAAA,CAAK,GAAA,KAAQ,MAAM,GAAA,CAAI,UAAA;AAChD,cAAA,uBACIO,IAAAA,CAAC,IAAA,EAAA,EAAoB,IAAA,EAAM,MAAA,CAAO,IAAI,CAAA,EAAG,SAAA,EAAW,CAAA,uBAAA,EAA0B,EAAA,GAAK,YAAA,GAAe,EAAE,IAAI,IAAA,CAAK,MAAA,KAAW,IAAA,GAAO,WAAA,GAAc,EAAE,CAAA,CAAA,EAAI,cAAA,EAAc,EAAA,GAAK,MAAA,GAAS,MAAA,EAAW,aAAA,EAAa,IAAA,CAAK,MAAA,KAAW,IAAA,GAAO,MAAA,GAAS,MAAA,EAAW,SAAS,OAAA,EACvP,QAAA,EAAA;AAAA,gCAAAP,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAgB,eAAK,KAAA,EAAM,CAAA;AAAA,gCAC3CA,GAAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAY;AAAA,eAAA,EAAA,EAFnB,KAAK,GAGhB,CAAA;AAAA,YAER;AAAA;AAAA,SACJ,EACJ;AAAA,OAAA,EAAA,EAnBE,KAAK,GAqBf,CAAA;AAAA,IAER,CAAC,CAAA,EACL,CAAA;AAAA,oBACAO,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACX,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,0BAAyB,OAAA,EAAS,MAAM,OAAA,CAAQ,MAAM,CAAA,EAClF,QAAA,EAAA;AAAA,wBAAAP,GAAAA,CAAC+B,YAAA,EAAW,IAAA,EAAM,IAAI,WAAA,EAAa,GAAA,EAAK,eAAW,IAAA,EAAC,CAAA;AAAA,wBACpD/B,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,cAAA,EAAgB,QAAA,EAAA,CAAA,CAAE,YAAY,CAAA,EAAE;AAAA,OAAA,EACpD,CAAA;AAAA,MACC,KAAA,CAAM,aAAA,CAAc,OAAA,oBACjBO,IAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,KAAA,CAAM,aAAA,CAAc,GAAA,EAAK,SAAA,EAAU,wBAAA,EAAyB,SAAS,OAAA,EAC7E,QAAA,EAAA;AAAA,wBAAAP,GAAAA,CAACgC,MAAA,EAAK,IAAA,EAAM,IAAI,WAAA,EAAa,GAAA,EAAK,eAAW,IAAA,EAAC,CAAA;AAAA,wBAC9ChC,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,cAAA,EAAgB,QAAA,EAAA,CAAA,CAAE,eAAe,CAAA,EAAE,CAAA;AAAA,QAClD,KAAA,CAAM,aAAA,CAAc,MAAA,GAAS,CAAA,oBAAKA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAA,KAAA,CAAM,aAAA,CAAc,MAAA,EAAO;AAAA,OAAA,EACzG;AAAA,KAAA,EAER,CAAA;AAAA,oBACAA,GAAAA,CAAC,WAAA,EAAA,EAAY,MAAA,EAAM,IAAA,EAAC,QAAQ,OAAA,EAAS;AAAA,GAAA,EACzC,CAAA;AAER;AAGO,SAAS,YAAA,CAAa,EAAE,OAAA,EAAQ,EAA4B;AAC/D,EAAA,MAAM,EAAE,KAAA,EAAO,CAAA,EAAG,QAAA,KAAa,QAAA,EAAS;AACxC,EAAA,MAAM,CAAC,YAAA,EAAc,KAAA,EAAO,KAAK,CAAA,GAAI,MAAM,OAAA,CAAQ,MAAA;AACnD,EAAA,uBACIO,KAAC,KAAA,EAAA,EAAM,KAAA,EAAO,EAAE,eAAe,CAAA,EAAG,IAAA,EAAK,QAAA,EAAS,OAAA,EAC3C,QAAA,EAAA;AAAA,IAAA,YAAA,KAAiB,MAAA,oBACdP,GAAAA,CAAC,SAAA,EAAA,EAAQ,WAAU,iBAAA,EAAkB,YAAA,EAAY,YAAA,CAAa,KAAA,EAC1D,QAAA,kBAAAA,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACG,KAAA,EAAO,YAAA;AAAA,QACP,SAAA,EAAW,aAAa,OAAA,CAAQ,EAAA;AAAA,QAChC,OAAA,EAAS,SAAS,YAAY,CAAA;AAAA,QAC9B,WAAA,EAAa,EAAE,aAAA,EAAe,EAAE,OAAO,YAAA,CAAa,KAAA,CAAM,WAAA,EAAY,EAAG,CAAA;AAAA,QACzE,MAAA,EAAQ,CAAA,IAAA,KAAQ,QAAA,CAAS,EAAE,CAAC,aAAa,GAAG,GAAG,IAAA,CAAK,EAAA,EAAI;AAAA;AAAA,KAC5D,EACJ,CAAA;AAAA,IAEH,KAAA,KAAU,MAAA,oBACPA,GAAAA,CAAC,SAAA,EAAA,EAAQ,WAAU,iBAAA,EAAkB,YAAA,EAAY,KAAA,CAAM,KAAA,EACnD,QAAA,kBAAAA,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACG,KAAA,EAAO,KAAA;AAAA,QACP,MAAA,EAAQ,cAAc,OAAA,CAAQ,EAAA;AAAA,QAC9B,SAAA,EAAW,MAAM,OAAA,CAAQ,EAAA;AAAA,QACzB,OAAA,EAAS,SAAS,KAAK,CAAA;AAAA,QACvB,WAAA,EAAa,EAAE,aAAA,EAAe,EAAE,OAAO,KAAA,CAAM,KAAA,CAAM,WAAA,EAAY,EAAG,CAAA;AAAA,QAClE,QAAQ,CAAA,IAAA,KAAQ,KAAK,uBAAuB,KAAA,EAAO,KAAA,EAAO,MAAM,QAAQ;AAAA;AAAA,KAC5E,EACJ,CAAA;AAAA,IAEH,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,MAAA,oBAC9BA,GAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,iBAAA,EAAkB,YAAA,EAAY,KAAA,CAAM,KAAA,EACnD,QAAA,kBAAAA,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACG,KAAA,EAAO,KAAA;AAAA,QACP,MAAA,EAAQ,MAAM,OAAA,CAAQ,EAAA;AAAA,QACtB,SAAA,EAAW,MAAM,OAAA,CAAQ,EAAA;AAAA,QACzB,OAAA,EAAS,CAAA,CAAE,oBAAA,EAAsB,EAAE,MAAA,EAAQ,QAAA,CAAS,KAAK,CAAA,EAAG,IAAA,EAAM,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,CAAA;AAAA,QACtF,WAAA,EAAa,CAAA,CAAE,uBAAA,EAAyB,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,WAAA,EAAY,EAAG,IAAA,EAAM,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AAAA,QACtG,QAAQ,CAAA,IAAA,KAAQ,QAAA,CAAS,EAAE,CAAC,MAAM,GAAG,GAAG,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAC,KAAA,CAAM,GAAG,GAAG,IAAA,CAAK,IAAI;AAAA;AAAA,KACpF,EACJ;AAAA,GAAA,EAER,CAAA;AAER;AC7JO,IAAM,WAAA,GAAc,CAAA;AAiBpB,SAAS,UAAA,CAAW,MAAcW,MAAAA,EAAuB;AAC5D,EAAA,MAAM,QAAA,GAAW,KAAK,WAAA,EAAY;AAClC,EAAA,MAAM,KAAA,GAAQA,MAAAA,CAAM,WAAA,EAAY,CAAE,IAAA,GAAO,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AACpE,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AAC/B,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACtB,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA;AAChC,IAAA,IAAI,EAAA,GAAK,GAAG,OAAO,CAAA;AACnB,IAAA,KAAA,IAAS,EAAA,KAAO,IAAI,CAAA,GAAI,QAAA,CAAS,KAAK,CAAC,CAAA,KAAM,MAAM,CAAA,GAAI,CAAA;AAAA,EAC3D;AACA,EAAA,OAAO,KAAA;AACX;AAEA,SAAS,UAAA,CAAW,KAAA,EAAcA,MAAAA,EAAe,IAAA,EAA8C,WAAA,EAAoC;AAC/H,EAAA,MAAM,UAA+F,EAAC;AACtG,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,GAAA,CAAI,KAAA,EAAO;AAChC,IAAA,MAAM,OAAA,GAAU,OAAO,IAAI,CAAA;AAC3B,IAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,EAAA,EAAI,CAAA,KAAA,EAAQ,KAAK,GAAG,CAAA,CAAA,EAAI,KAAA,EAAO,IAAA,CAAK,OAAO,GAAA,EAAK,OAAA,EAAS,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA;AACzF,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,IAAS,EAAC,EAAG;AACjC,MAAA,MAAM,GAAA,GAAM,OAAO,IAAI,CAAA;AACvB,MAAA,IAAI,QAAQ,OAAA,EAAS;AAErB,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,KAAW,IAAA,GAAO,CAAA,EAAG,KAAK,KAAK,CAAA,MAAA,EAAM,WAAW,CAAA,CAAA,GAAK,IAAA,CAAK,KAAA;AAChF,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,EAAA,EAAI,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,GAAG,CAAA,CAAA,EAAI,KAAA,EAAO,IAAA,CAAK,OAAO,QAAA,EAAU,GAAA,EAAK,IAAA,EAAM,IAAA,CAAK,MAAA,KAAW,IAAA,GAAO,SAAU,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,IAAA,EAAO,CAAA;AAAA,IACzJ;AAAA,EACJ;AACA,EAAA,OAAO,QACF,GAAA,CAAI,CAAA,KAAA,MAAU,EAAE,KAAA,EAAO,KAAA,EAAO,WAAW,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,CAAA,EAAI,MAAM,QAAA,IAAY,EAAE,IAAIA,MAAK,CAAA,GAAI,CAAA,CAC5F,MAAA,CAAO,CAAC,EAAE,OAAM,KAAM,KAAA,GAAQ,CAAC,CAAA,CAC/B,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA,CAChC,IAAI,CAAC,EAAE,OAAM,KAAM;AAChB,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,KAAA,CAAM,IAAI,CAAA;AACnC,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,CAAM,EAAA,EAAI,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,QAAA,EAAU,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,KAAA,CAAM,KAAK,IAAA,kBAAMX,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EAAI,WAAA,EAAa,GAAA,EAAK,eAAW,IAAA,EAAC,CAAA,EAAI,GAAA,EAAK,CAAC,MAAA,KAAoB,IAAA,CAAK,KAAA,CAAM,GAAA,EAAK,MAAM,CAAA,EAAE;AAAA,EACpM,CAAC,CAAA;AACT;AAMA,SAAS,IAAA,CAAK,MAAe,KAAA,EAAgD;AACzE,EAAA,IAAI,IAAA,GAAgB,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA,GAAO,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,IAAA,GAAQ,IAAA,CAA4B,IAAA,GAAO,IAAA;AACjI,EAAA,IAAI,IAAA,KAAS,UAAa,KAAA,KAAU,MAAA,IAAa,OAAO,IAAA,KAAS,QAAA,IAAY,SAAS,IAAA,EAAM;AACxF,IAAA,MAAM,SAAU,IAAA,CAA8B,MAAA;AAC9C,IAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAI,OAAO,IAAA,CAAK,CAAC,CAAA,KAAgC,OAAO,MAAM,QAAA,IAAY,CAAA,KAAM,QAAS,CAAA,CAAwB,GAAA,KAAQ,KAAK,CAAA,GAAI,MAAA;AACpK,IAAA,IAAA,GAAO,KAAA,EAAO,KAAA;AAAA,EAClB;AACA,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,KAAK,MAAA,CAAO,CAAC,GAAA,KAAwC,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,IAAI,IAAI,EAAC;AAClI;AAOO,SAAS,cAAA,CAAe,EAAE,OAAA,EAAQ,EAA4B;AACjE,EAAA,MAAM,EAAE,OAAO,CAAA,EAAG,QAAA,EAAU,UAAU,WAAA,EAAa,GAAA,KAAQ,QAAA,EAAS;AACpE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIG,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAACQ,MAAAA,EAAO,QAAQ,CAAA,GAAIR,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,QAAAA,CAAuD,EAAE,CAAA;AACrF,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAiC,IAAI,CAAA;AAGrE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAC9D,EAAA,MAAM,KAAA,GAAQC,OAAyB,IAAI,CAAA;AAC3C,EAAA,MAAM,MAAA,GAASA,OAAuB,IAAI,CAAA;AAC1C,EAAA,MAAM,KAAKU,KAAAA,EAAM;AACjB,EAAA,MAAM,SAASV,MAAAA,CAAuB,OAAO,aAAa,WAAA,GAAc,QAAA,CAAS,gBAAgB,IAAI,CAAA;AAErG,EAAAE,UAAU,MAAM;AACZ,IAAA,IAAI,YAAA,EAAa,EAAG,KAAA,CAAM,OAAA,EAAS,KAAA,EAAM;AAAA,SACpC,MAAA,CAAO,SAAS,KAAA,EAAM;AAC3B,IAAA,MAAM,OAAO,MAAA,CAAO,OAAA;AACpB,IAAA,OAAO,MAAM;AACT,MAAA,IAAI,IAAA,YAAgB,WAAA,EAAa,IAAA,CAAK,KAAA,EAAM;AAAA,IAChD,CAAA;AAAA,EACJ,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAA,UAAU,MAAM;AACZ,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,QAAA,CAAS,KAAK,GAAG,WAAW,CAAA;AAC3D,IAAA,OAAO,MAAM,aAAa,KAAK,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAGV,EAAA,MAAM,IAAA,GAAO,CAAC,GAAA,EAAa,MAAA,KAAoB;AAC3C,IAAA,IAAI,CAAC,QAAQ,OAAA,EAAQ;AACrB,IAAA,QAAA,CAAS,GAAA,EAAK,EAAE,MAAA,EAAQ,CAAA;AAAA,EAC5B,CAAA;AAGA,EAAAA,UAAU,MAAM;AACZ,IAAA,MAAM2B,EAAAA,GAAItB,OAAM,IAAA,EAAK;AACrB,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,GAAA,GAAM,CAAC,GAAA,EAAsB,IAAA,KAAuC;AACtE,MAAA,SAAA,CAAU,cAAY,EAAE,GAAG,SAAS,CAAC,GAAG,GAAG,EAAE,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAO,QAAQ,GAAG,CAAA,EAAG,SAAS,EAAC,IAAI,CAAE,CAAA;AACrG,MAAA,IAAA,EAAK,CACA,KAAK,CAAA,KAAA,KAAS;AACX,QAAA,IAAI,CAAC,UAAA,CAAW,MAAA,CAAO,OAAA,EAAS,SAAA,CAAU,cAAY,EAAE,GAAG,OAAA,EAAS,CAAC,GAAG,GAAG,EAAE,QAAQ,OAAA,EAAS,KAAA,IAAQ,CAAE,CAAA;AAAA,MAC5G,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AACT,QAAA,IAAI,CAAC,UAAA,CAAW,MAAA,CAAO,SAAS,SAAA,CAAU,CAAA,OAAA,MAAY,EAAE,GAAG,OAAA,EAAS,CAAC,GAAG,GAAG,EAAE,MAAA,EAAQ,OAAA,EAAS,OAAO,EAAC,IAAI,CAAE,CAAA;AAAA,MAChH,CAAC,CAAA;AAAA,IACT,CAAA;AACA,IAAA,MAAM,SAAS,UAAA,CAAW,MAAA;AAC1B,IAAA,IAAIsB,OAAM,EAAA,EAAI;AACV,MAAA,SAAA,CAAU,EAAE,CAAA;AACZ,MAAA,OAAO,MAAM,WAAW,KAAA,EAAM;AAAA,IAClC;AACA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAA,KAAc,MAAA,EAAW;AACvC,MAAA,GAAA;AAAA,QAAI,SAAA;AAAA,QAAW,YACX,KAAK,MAAM,WAAA,CAAY,UAAU,KAAA,CAAM,OAAA,CAAQ,SAAA,EAAY,EAAE,CAAA,EAAAA,EAAAA,EAAG,OAAO,SAAA,EAAW,GAAG,EAAE,MAAA,EAAQ,CAAA,EAAG,SAAS,CAAA,CAAE,OAAA,CAAQ,CAAA,GAAA,KAAO;AACxH,UAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAC3B,UAAA,IAAI,OAAO,GAAA,CAAI,KAAA,KAAU,YAAY,GAAA,KAAQ,MAAA,SAAkB,EAAC;AAChE,UAAA,OAAO,CAAC,EAAE,EAAA,EAAI,UAAU,MAAA,CAAO,GAAA,CAAI,MAAM,GAAG,CAAC,IAAI,KAAA,EAAO,GAAA,CAAI,OAAO,QAAA,EAAU,OAAO,IAAI,QAAA,KAAa,QAAA,GAAW,IAAI,QAAA,GAAW,MAAA,EAAW,IAAA,EAAM,GAAA,EAAK,sBAAMjC,GAAAA,CAACkC,UAAA,EAAS,IAAA,EAAM,IAAI,WAAA,EAAa,GAAA,EAAK,eAAW,IAAA,EAAC,CAAA,EAAI,KAAK,CAAC,MAAA,KAAoB,KAAK,GAAA,EAAK,MAAM,GAAG,CAAA;AAAA,QAClQ,CAAC;AAAA,OACL;AAAA,IACJ;AACA,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA;AAC3C,IAAA,GAAA,CAAI,QAAQ,YAAY;AACpB,MAAA,MAAM,QAAuC,EAAC;AAG9C,MAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,YAAY,MAAA,IAAa,KAAA,CAAM,QAAQ,SAAA,KAAc,MAAA;AACnF,MAAA,IAAI,OAAA,EAAS;AACT,QAAA,KAAA,CAAM,IAAA;AAAA,UACF,WAAA,CAAY,SAAA,CAAU,KAAA,CAAM,OAAA,CAAQ,WAAY,EAAE,CAAA,EAAAD,EAAAA,EAAG,KAAA,EAAO,QAAQ,CAAA,EAAG,EAAE,MAAA,EAAQ,CAAA,CAAE,IAAA;AAAA,YAAK,UACpF,IAAA,CAAK,IAAA,EAAM,MAAM,CAAA,CAAE,QAAQ,CAAA,GAAA,KAAO;AAC9B,cAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAC3B,cAAA,IAAI,OAAO,GAAA,CAAI,KAAA,KAAU,YAAY,GAAA,KAAQ,MAAA,SAAkB,EAAC;AAChE,cAAA,OAAO,CAAC,EAAE,EAAA,EAAI,QAAQ,MAAA,CAAO,GAAA,CAAI,MAAM,GAAG,CAAC,IAAI,KAAA,EAAO,GAAA,CAAI,OAAO,QAAA,EAAU,OAAO,IAAI,QAAA,KAAa,QAAA,GAAW,IAAI,QAAA,GAAW,MAAA,EAAW,IAAA,EAAM,GAAA,EAAK,sBAAMjC,GAAAA,CAACmC,WAAA,EAAU,IAAA,EAAM,IAAI,WAAA,EAAa,GAAA,EAAK,eAAW,IAAA,EAAC,CAAA,EAAI,KAAK,CAAC,MAAA,KAAoB,KAAK,GAAA,EAAK,MAAM,GAAG,CAAA;AAAA,YACjQ,CAAC;AAAA;AACL,SACJ;AAAA,MACJ;AACA,MAAA,IAAI,YAAA,KAAiB,MAAA,IAAa,CAAC,OAAA,EAAS;AACxC,QAAA,KAAA,CAAM,IAAA;AAAA,UACF,WAAA,CAAY,SAAA,CAAU,YAAA,CAAa,OAAA,EAAS,EAAE,CAAA,EAAAF,EAAAA,EAAG,KAAA,EAAO,GAAA,EAAK,CAAA,EAAG,EAAE,MAAA,EAAQ,CAAA,CAAE,IAAA;AAAA,YAAK,CAAA,IAAA,KAC7E,IAAA,CAAK,IAAI,CAAA,CAAE,QAAQ,CAAA,GAAA,KAAO;AACtB,cAAA,IAAK,OAAO,GAAA,CAAI,EAAA,KAAO,QAAA,IAAY,OAAO,GAAA,CAAI,EAAA,KAAO,QAAA,IAAa,OAAO,GAAA,CAAI,IAAA,KAAS,QAAA,SAAiB,EAAC;AACxG,cAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAC3B,cAAA,OAAO,CAAC,EAAE,EAAA,EAAI,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,EAAI,KAAA,EAAO,GAAA,CAAI,IAAA,EAAM,QAAA,EAAU,YAAA,CAAa,KAAA,EAAO,IAAA,kBAAMjC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAAyB,aAAA,EAAY,MAAA,EAAQ,QAAA,EAAA,OAAO,GAAA,CAAI,aAAa,QAAA,GAAW,GAAA,CAAI,QAAA,GAAW,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,EAAE,CAAA,EAAS,KAAK,MAAM;AAAE,gBAAA,OAAA,EAAQ;AAAG,gBAAA,QAAA,CAAS,EAAE,CAAC,YAAA,CAAa,GAAG,GAAG,OAAO,CAAA;AAAA,cAAG,GAAG,CAAA;AAAA,YACxS,CAAC;AAAA;AACL,SACJ;AAAA,MACJ;AACA,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAA,KAAY,MAAA,EAAW;AACrC,QAAA,KAAA,CAAM,IAAA;AAAA,UACF,WAAA,CAAY,SAAA,CAAU,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA,EAAAiC,EAAAA,EAAG,CAAA,EAAG,EAAE,MAAA,EAAQ,CAAA,CAAE,IAAA;AAAA,YAAK,CAAA,IAAA,KAClE,IAAA,CAAK,IAAI,CAAA,CAAE,QAAQ,CAAA,GAAA,KAAO;AACtB,cAAA,IAAI,OAAO,GAAA,CAAI,KAAA,KAAU,QAAA,SAAiB,EAAC;AAC3C,cAAA,MAAM,MAAA,GAAS,OAAO,GAAA,CAAI,MAAA,KAAW,YAAY,GAAA,CAAI,MAAA,KAAW,IAAA,GAAQ,GAAA,CAAI,MAAA,GAAoC,IAAA;AAChH,cAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAC3B,cAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,GAAA,KAAQ,MAAA,SAAkB,EAAC;AAClD,cAAA,OAAO,CAAC,EAAE,EAAA,EAAI,QAAQ,GAAA,CAAI,KAAK,IAAI,MAAA,CAAO,GAAA,CAAI,QAAA,IAAY,EAAE,CAAC,CAAA,CAAA,EAAI,KAAA,EAAO,IAAI,KAAA,EAAO,QAAA,EAAU,OAAO,GAAA,CAAI,QAAA,KAAa,QAAA,GAAW,GAAA,CAAI,WAAW,MAAA,EAAW,IAAA,EAAM,KAAK,IAAA,kBAAMjC,IAACmC,SAAAA,EAAA,EAAU,IAAA,EAAM,EAAA,EAAI,aAAa,GAAA,EAAK,aAAA,EAAW,MAAC,CAAA,EAAI,GAAA,EAAK,CAAC,MAAA,KAAoB;AAAE,gBAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,CAAC,MAAA,EAAQ;AAAE,kBAAA,OAAA,EAAQ;AAAG,kBAAA,QAAA,CAAS,MAAM,CAAA;AAAA,gBAAG,CAAA,MAAA,IAAW,GAAA,KAAQ,MAAA,EAAW,IAAA,CAAK,KAAK,MAAM,CAAA;AAAA,cAAG,GAAG,CAAA;AAAA,YACrX,CAAC;AAAA;AACL,SACJ;AAAA,MACJ;AACA,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,UAAA,CAAW,KAAK,CAAA;AAC9C,MAAA,IAAI,OAAA,CAAQ,KAAA,CAAM,CAAA,MAAA,KAAU,MAAA,CAAO,MAAA,KAAW,UAAU,CAAA,IAAK,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,MAAM,IAAI,MAAM,aAAa,CAAA;AAC9G,MAAA,OAAO,OAAA,CAAQ,QAAQ,CAAA,MAAA,KAAW,MAAA,CAAO,WAAW,WAAA,GAAc,MAAA,CAAO,KAAA,GAAQ,EAAG,CAAA;AAAA,IACxF,CAAC,CAAA;AACD,IAAA,IAAI,MAAM,IAAA,CAAK,OAAA,IAAW,KAAA,CAAM,IAAA,CAAK,cAAc,MAAA,EAAW;AAC1D,MAAA,GAAA;AAAA,QAAI,MAAA;AAAA,QAAQ,YACR,aAAA,CAAc,MAAM,WAAA,CAAY,SAAA,CAAU,MAAM,IAAA,CAAK,SAAA,EAAY,EAAE,CAAA,EAAAF,EAAAA,EAAG,KAAA,EAAO,MAAM,IAAA,CAAK,KAAA,EAAO,CAAA,EAAG,EAAE,MAAA,EAAQ,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,OAAA,MAA0B;AAAA,UAC1I,EAAA,EAAI,CAAA,IAAA,EAAO,OAAA,CAAQ,EAAE,CAAA,CAAA;AAAA,UACrB,OAAO,OAAA,CAAQ,KAAA;AAAA,UACf,UAAU,OAAA,CAAQ,OAAA;AAAA,UAClB,MAAM,OAAA,CAAQ,GAAA;AAAA,UACd,IAAA,kBAAMjC,GAAAA,CAACsB,QAAAA,EAAA,EAAS,MAAM,EAAA,EAAI,WAAA,EAAa,GAAA,EAAK,aAAA,EAAW,IAAA,EAAC,CAAA;AAAA,UACxD,GAAA,EAAK,CAAC,MAAA,KAAoB;AACtB,YAAA,IAAI,MAAA,IAAU,OAAA,CAAQ,GAAA,KAAQ,MAAA,EAAW;AACrC,cAAA,QAAA,CAAS,OAAA,CAAQ,GAAA,EAAK,EAAE,MAAA,EAAQ,MAAM,CAAA;AACtC,cAAA;AAAA,YACJ;AACA,YAAA,OAAA,EAAQ;AACR,YAAA,WAAA,CAAY,OAAO,CAAA;AAAA,UACvB;AAAA,SACJ,CAAE;AAAA,OACN;AAAA,IACJ;AACA,IAAA,OAAO,MAAM,WAAW,KAAA,EAAM;AAAA,EAClC,CAAA,EAAG,CAACX,MAAAA,EAAO,KAAK,CAAC,CAAA;AAEjB,EAAA,MAAM,CAAA,GAAI,MAAM,IAAA,EAAK;AACrB,EAAA,MAAM,KAAA,GAAQN,OAAAA,CAAQ,MAAM,UAAA,CAAW,OAAO,CAAA,EAAG,IAAA,EAAM,CAAA,CAAE,QAAQ,CAAC,CAAA,EAAG,CAAC,KAAA,EAAO,CAAA,EAAG,CAAC,CAAC,CAAA;AAClF,EAAA,MAAM,OAAA,GAAUA,OAAAA;AAAA,IACZ,MACI,KAAA,CAAM,OAAA,CAAQ,OAAA,CACT,MAAA,CAAO,YAAU,UAAA,CAAW,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,CAAA,EAAA,CAAK,MAAA,CAAO,YAAY,EAAC,EAAG,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,GAAI,CAAC,CAAA,CAC1F,GAAA,CAAI,CAAA,MAAA,KAAU;AACX,MAAA,MAAM,OAAO,MAAA,CAAO,IAAA,KAAS,SAAY,WAAA,CAAY,MAAA,CAAO,IAAI,CAAA,GAAI+B,GAAAA;AACpE,MAAA,OAAO;AAAA,QACH,EAAA,EAAI,CAAA,OAAA,EAAU,MAAA,CAAO,EAAE,CAAA,CAAA;AAAA,QACvB,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,IAAA,EAAM,MAAA,CAAO,MAAA,KAAW,MAAA,GAAS,SAAY,MAAA,CAAO,GAAA;AAAA,QACpD,IAAA,kBAAMpC,GAAAA,CAAC,IAAA,EAAA,EAAK,MAAM,EAAA,EAAI,WAAA,EAAa,GAAA,EAAK,aAAA,EAAW,IAAA,EAAC,CAAA;AAAA,QACpD,GAAA,EAAK,CAAC,MAAA,KAAoB;AACtB,UAAA,IAAI,CAAC,QAAQ,OAAA,EAAQ;AACrB,UAAA,QAAA,CAAS,MAAA,CAAO,GAAA,EAAK,EAAE,MAAA,EAAQ,MAAA,CAAO,MAAA,IAAU,KAAA,EAAO,MAAA,EAAQ,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,MAAA,EAAQ,CAAA;AAAA,QACvG;AAAA,OACJ;AAAA,IACJ,CAAC,CAAA;AAAA,IACT,CAAC,OAAO,CAAC;AAAA,GACb;AAEA,EAAA,MAAM,QAAA,GAA8E;AAAA,IAChF,EAAE,GAAA,EAAK,OAAA,EAAkB,KAAA,EAAO,CAAA,CAAE,OAAO,CAAA,EAAG,KAAA,EAAO,EAAE,MAAA,EAAQ,OAAA,EAAkB,KAAA,EAAO,OAAM,EAAE;AAAA,IAC9F,EAAE,GAAA,EAAK,SAAA,EAAoB,KAAA,EAAO,CAAA,CAAE,SAAS,CAAA,EAAG,KAAA,EAAO,MAAA,CAAO,OAAA,IAAW,EAAE,MAAA,EAAQ,MAAA,EAAiB,KAAA,EAAO,IAAG,EAAE;AAAA,IAChH,EAAE,GAAA,EAAK,SAAA,EAAoB,KAAA,EAAO,CAAA,CAAE,SAAS,CAAA,EAAG,KAAA,EAAO,EAAE,MAAA,EAAQ,OAAA,EAAkB,KAAA,EAAO,SAAQ,EAAE;AAAA,IACpG,EAAE,GAAA,EAAK,MAAA,EAAiB,KAAA,EAAO,CAAA,CAAE,OAAO,CAAA,EAAG,KAAA,EAAO,MAAA,CAAO,IAAA,IAAQ,EAAE,MAAA,EAAQ,MAAA,EAAiB,KAAA,EAAO,IAAG,EAAE;AAAA,IACxG,EAAE,GAAA,EAAK,MAAA,EAAiB,KAAA,EAAO,CAAA,CAAE,eAAe,CAAA,EAAG,KAAA,EAAO,MAAA,CAAO,IAAA,IAAQ,EAAE,MAAA,EAAQ,MAAA,EAAiB,KAAA,EAAO,IAAG;AAAE,GACpH;AACA,EAAA,IAAI,MAAM,EAAA,EAAI;AACV,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACV,GAAA,EAAK,KAAA;AAAA,MACL,KAAA,EAAO,EAAE,UAAU,CAAA;AAAA,MACnB,KAAA,EAAO;AAAA,QACH,MAAA,EAAQ,OAAA;AAAA,QACR,KAAA,EAAO,CAAC,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,CAAE,+BAAA,EAAuB,EAAE,KAAA,EAAO,CAAA,EAAG,GAAG,QAAA,EAAU,CAAA,CAAE,iBAAiB,CAAA,EAAG,IAAA,kBAAMA,GAAAA,CAAC2B,QAAAA,EAAA,EAAS,IAAA,EAAM,EAAA,EAAI,WAAA,EAAa,GAAA,EAAK,aAAA,EAAW,IAAA,EAAC,CAAA,EAAI,KAAK,MAAM;AAAE,UAAA,OAAA,EAAQ;AAAG,UAAA,GAAA,CAAI,CAAC,CAAA;AAAA,QAAG,GAAG;AAAA;AACvM,KACH,CAAA;AAAA,EACL;AAIA,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,GAAA,CAAI,CAAA,OAAA,KAAW;AACrC,IAAA,MAAM,GAAA,GAAM,aAAa,OAAA,CAAQ,GAAA;AACjC,IAAA,MAAM,KAAA,GAAQ,GAAA,GAAM,OAAA,CAAQ,KAAA,CAAM,KAAA,GAAQ,QAAQ,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,WAAW,CAAA;AAClF,IAAA,MAAM,QAAQ,OAAA,CAAQ,MAAA;AACtB,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAA,IAAA,KAAQ,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,OAAA,CAAQ,GAAA,EAAK,CAAC,CAAA;AAC9E,IAAA,MAAM,OAAO,CAAC,GAAA,IAAO,OAAA,CAAQ,KAAA,CAAM,MAAM,MAAA,GAAS,WAAA;AAClD,IAAA,IAAI,MAAM,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,EAAO,OAAO,OAAA,CAAQ,GAAA,EAAK,KAAA,EAAO,CAAA,CAAE,uBAAuB,EAAE,KAAA,EAAO,QAAQ,KAAA,EAAO,GAAG,CAAA;AACrH,IAAA,OAAO,EAAE,GAAG,OAAA,EAAS,KAAA,EAAO,OAAO,KAAA,CAAM,MAAA,IAAU,IAAA,GAAO,CAAA,GAAI,CAAA,CAAA,EAAG;AAAA,EACrE,CAAC,CAAA;AAED,EAAA,MAAM,QAAQ,CAAC,MAAA,KAA4B,MAAA,CAAO,IAAA,KAAS,SAAS,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,OAAO,IAAA,CAAK,EAAE,CAAA,CAAA,GAAK,CAAA,IAAA,EAAO,OAAO,KAAK,CAAA,CAAA;AAC7H,EAAA,MAAM,KAAA,GAAQ,SAAA,KAAc,IAAA,GAAO,EAAA,GAAK,OAAA,CAAQ,UAAU,CAAA,MAAA,KAAU,KAAA,CAAM,MAAM,CAAA,KAAM,SAAS,CAAA;AAC/F,EAAA,MAAM,MAAA,GAAS,KAAA,IAAS,CAAA,GAAI,KAAA,GAAQ,CAAA;AACpC,EAAA,MAAM,SAAA,GAAY,CAAC,IAAA,KAA+C;AAC9D,IAAA,MAAM,QAAQ,OAAO,IAAA,KAAS,UAAA,GAAa,IAAA,CAAK,MAAM,CAAA,GAAI,IAAA;AAC1D,IAAA,MAAM,MAAA,GAAS,QAAQ,KAAK,CAAA;AAC5B,IAAA,YAAA,CAAa,MAAA,KAAW,MAAA,GAAY,IAAA,GAAO,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,EAC5D,CAAA;AAEA,EAAArB,UAAU,MAAM;AACZ,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,EACrB,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA;AAEN,EAAA,MAAM,QAAA,GAAW,QAAQ,CAAC,CAAA,KAAM,SAAY,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA;AACnE,EAAAA,UAAU,MAAM;AACZ,IAAA,IAAI,SAAA,KAAc,IAAA,IAAQ,QAAA,KAAa,IAAA,eAAmB,QAAQ,CAAA;AAAA,EACtE,CAAA,EAAG,CAAC,SAAA,EAAW,QAAQ,CAAC,CAAA;AACxB,EAAAA,UAAU,MAAM;AACZ,IAAA,YAAA,CAAa,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,MAAA,EAAQ,EAAE,CAAC,CAAA;AAEf,EAAA,MAAM,MAAA,GAAS,CAAC,MAAA,EAA4B,MAAA,KAAoB;AAC5D,IAAA,IAAI,WAAW,MAAA,EAAW;AAC1B,IAAA,IAAI,MAAA,CAAO,SAAS,KAAA,EAAO;AACvB,MAAA,WAAA,CAAY,OAAO,KAAK,CAAA;AACxB,MAAA;AAAA,IACJ;AACA,IAAA,IAAI,MAAA,IAAU,MAAA,CAAO,IAAA,CAAK,IAAA,KAAS,MAAA,EAAW;AAC9C,IAAA,MAAA,CAAO,IAAA,CAAK,IAAI,MAAM,CAAA;AAAA,EAC1B,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAAyC;AACxD,IAAA,MAAM,IAAA,GAAO,QAAQ,MAAA,GAAS,CAAA;AAC9B,IAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AACxB,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,MAAA,OAAA,EAAQ;AAAA,IACZ,CAAA,MAAA,IAAW,KAAA,CAAM,GAAA,KAAQ,WAAA,EAAa;AAClC,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,SAAA,CAAU,CAAA,KAAA,KAAU,KAAA,IAAS,IAAA,GAAO,CAAA,GAAI,QAAQ,CAAE,CAAA;AAAA,IACtD,CAAA,MAAA,IAAW,KAAA,CAAM,GAAA,KAAQ,SAAA,EAAW;AAChC,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,SAAA,CAAU,CAAA,KAAA,KAAU,KAAA,IAAS,CAAA,GAAI,IAAA,GAAO,QAAQ,CAAE,CAAA;AAAA,IACtD,CAAA,MAAA,IAAW,KAAA,CAAM,GAAA,KAAQ,OAAA,EAAS;AAC9B,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,MAAA,CAAO,QAAQ,MAAM,CAAA,EAAG,KAAA,CAAM,OAAA,IAAW,MAAM,OAAO,CAAA;AAAA,IAC1D,CAAA,MAAO;AACH,MAAA,OAAA,CAAQ,KAAA,EAAO,OAAO,OAAO,CAAA;AAAA,IACjC;AAAA,EACJ,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,QAAQ,MAAM,CAAA;AACnC,EAAA,uBACIN,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EAAmC,eAAe,CAAA,KAAA,KAAS;AAAE,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,KAAA,CAAM,aAAA,EAAe,OAAA,EAAQ;AAAA,EAAG,GAC7H,QAAA,kBAAAO,IAAAA,CAAC,SAAI,GAAA,EAAK,MAAA,EAAQ,WAAU,aAAA,EAAc,IAAA,EAAK,QAAA,EAAS,YAAA,EAAW,QAAO,YAAA,EAAY,CAAA,CAAE,QAAQ,CAAA,EAAG,QAAA,EAAU,IAAI,SAAA,EAC7G,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACX,QAAA,EAAA;AAAA,sBAAAP,GAAAA,CAACe,QAAA,EAAO,IAAA,EAAM,IAAI,WAAA,EAAa,GAAA,EAAK,eAAW,IAAA,EAAC,CAAA;AAAA,sBAChDf,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACG,GAAA,EAAK,KAAA;AAAA,UACL,IAAA,EAAK,QAAA;AAAA,UACL,IAAA,EAAK,UAAA;AAAA,UACL,eAAA,EAAc,MAAA;AAAA,UACd,eAAA,EAAe,GAAG,EAAE,CAAA,KAAA,CAAA;AAAA,UACpB,yBAAuB,YAAA,KAAiB,MAAA,GAAY,GAAG,EAAE,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,GAAK,MAAA;AAAA,UACxE,mBAAA,EAAkB,MAAA;AAAA,UAClB,YAAA,EAAY,KAAA,CAAM,OAAA,CAAQ,WAAA,IAAe,EAAE,qBAAgB,CAAA;AAAA,UAC3D,WAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,WAAA,IAAe,EAAE,qBAAgB,CAAA;AAAA,UAC5D,KAAA,EAAO,KAAA;AAAA,UACP,QAAA,EAAU,CAAA,KAAA,KAAS,QAAA,CAAS,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,UAC9C,YAAA,EAAa,KAAA;AAAA,UACb,UAAA,EAAY;AAAA;AAAA,OAChB;AAAA,sBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAU,QAAA,EAAA,KAAA,EAAG;AAAA,KAAA,EAChC,CAAA;AAAA,oBACAO,IAAAA,CAAC,KAAA,EAAA,EAAI,EAAA,EAAI,GAAG,EAAE,CAAA,KAAA,CAAA,EAAS,IAAA,EAAK,SAAA,EAAU,YAAA,EAAY,CAAA,CAAE,SAAS,CAAA,EAAG,WAAU,kBAAA,EACrE,QAAA,EAAA;AAAA,MAAA,QAAA,CAAS,IAAI,CAAA,OAAA,KAAW;AACrB,QAAA,MAAM,OAAA,GAAU,QAAQ,KAAA,CAAM,MAAA,KAAW,aAAa,OAAA,CAAQ,KAAA,CAAM,MAAM,MAAA,KAAW,CAAA;AACrF,QAAA,IAAI,OAAA,CAAQ,KAAA,KAAU,CAAA,IAAK,CAAC,SAAS,OAAO,IAAA;AAC5C,QAAA,uBACIA,IAAAA,CAAC,KAAA,EAAA,EAAsB,IAAA,EAAK,OAAA,EAAQ,iBAAA,EAAiB,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,OAAA,CAAQ,GAAG,CAAA,CAAA,EAAI,WAAU,mBAAA,EACnF,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,OAAA,CAAQ,GAAG,CAAA,CAAA,EAAI,SAAA,EAAU,kBAAA,EAAmB,IAAA,EAAK,cAAA,EAC/D,QAAA,EAAA;AAAA,4BAAAP,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,OAAA,CAAQ,KAAA,EAAM,CAAA;AAAA,YACpB,OAAA,CAAQ,KAAA,CAAM,MAAA,KAAW,SAAA,oBAAaA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAmB,aAAA,EAAY,MAAA,EAAO;AAAA,WAAA,EACjG,CAAA;AAAA,UACC,OAAA,oBAAWA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAgB,WAAA,EAAU,QAAA,EAAU,QAAA,EAAA,CAAA,CAAE,iBAAY,CAAA,EAAE,CAAA;AAAA,UAC9E,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,OAAA,CAAQ,KAAA,GAAQ,OAAA,CAAQ,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,MAAA,EAAQ,MAAA,KAAW;AACjF,YAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,GAAQ,MAAA;AAC9B,YAAA,MAAM,KAAK,KAAA,KAAU,MAAA;AACrB,YAAA,uBACIA,GAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBAEG,EAAA,EAAI,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAAA,gBAClB,IAAA,EAAK,QAAA;AAAA,gBACL,eAAA,EAAe,EAAA;AAAA,gBACf,SAAA,EAAW,CAAA,QAAA,EAAW,EAAA,GAAK,WAAA,GAAc,EAAE,IAAI,MAAA,CAAO,IAAA,KAAS,KAAA,GAAQ,cAAA,GAAiB,EAAE,CAAA,CAAA;AAAA,gBAC1F,WAAA,EAAa,MAAM,SAAA,CAAU,KAAK,CAAA;AAAA,gBAClC,SAAS,CAAA,KAAA,KAAS,MAAA,CAAO,QAAQ,KAAA,CAAM,OAAA,IAAW,MAAM,OAAO,CAAA;AAAA,gBAE9D,iBAAO,IAAA,KAAS,MAAA,mBACbO,IAAAA,CAAAC,UAAA,EACI,QAAA,EAAA;AAAA,kCAAAR,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAgB,QAAA,EAAA,MAAA,CAAO,KAAK,IAAA,EAAK,CAAA;AAAA,kCACjDA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAe,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,KAAA,EAAQ,QAAA,EAAA,MAAA,CAAO,IAAA,CAAK,KAAA,EAAM,CAAA;AAAA,kBAC3E,MAAA,CAAO,IAAA,CAAK,QAAA,KAAa,MAAA,oBAAaA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EAA8B,QAAA,EAAA,MAAA,CAAO,IAAA,CAAK,QAAA,EAAS,CAAA;AAAA,kBACzG,EAAA,oBAAMA,GAAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,eAAA,EAAgB,IAAA,EAAM,EAAA,EAAI,WAAA,EAAa,GAAA,EAAK,aAAA,EAAW,IAAA,EAAC;AAAA,iBAAA,EAC7F,CAAA,mBAEAO,IAAAA,CAAAC,QAAAA,EAAA,EACI,QAAA,EAAA;AAAA,kCAAAR,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAe,QAAA,kBAAAA,GAAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAM,EAAA,EAAI,WAAA,EAAa,GAAA,EAAK,aAAA,EAAW,MAAC,CAAA,EAAE,CAAA;AAAA,kCACrFA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAgB,iBAAO,KAAA,EAAM;AAAA,iBAAA,EACjD;AAAA,eAAA;AAAA,cAnBC,MAAA,CAAO,SAAS,MAAA,GAAS,MAAA,CAAO,KAAK,EAAA,GAAK,CAAA,IAAA,EAAO,OAAO,KAAK,CAAA;AAAA,aAqBtE;AAAA,UAER,CAAC;AAAA,SAAA,EAAA,EAlCK,QAAQ,GAmClB,CAAA;AAAA,MAER,CAAC,CAAA;AAAA,MACA,QAAQ,MAAA,KAAW,CAAA,IAAK,CAAA,KAAM,EAAA,oBAAMA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EAAiB,YAAE,sCAAA,EAA8B,EAAE,KAAA,EAAO,CAAA,EAAG,CAAA,EAAE;AAAA,KAAA,EACvH,CAAA;AAAA,oBACAO,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EAAmB,eAAY,MAAA,EAC1C,QAAA,EAAA;AAAA,sBAAAA,KAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,wBAAAP,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,wBAAMA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAU,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,QAAM,GAAA;AAAA,QAAE,EAAE,MAAM;AAAA,OAAA,EAAE,CAAA;AAAA,sBAClFO,KAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,wBAAAP,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,QAAM,GAAA;AAAA,QAAE,EAAE,MAAM;AAAA,OAAA,EAAE,CAAA;AAAA,sBAClDO,KAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,wBAAAP,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,QAAA,EAAA,cAAA,EAAE,CAAA;AAAA,QAAM,GAAA;AAAA,QAAE,EAAE,SAAS;AAAA,OAAA,EAAE;AAAA,KAAA,EAC1D;AAAA,GAAA,EACJ,CAAA,EACJ,CAAA;AAER;AC3VA,IAAM,SAAA,GAAgC,CAAC,EAAE,IAAA,EAAM,UAAU,GAAG,KAAA,EAAM,qBAAwFA,GAAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAa,GAAG,OAAQ,QAAA,EAAS,CAAA;AAE9L,SAAS,WAAA,CAAY,KAAa,KAAA,EAAsB;AACpD,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,EAAA,MAAM,IAAA,GAAO,CAAA,WAAA,EAAc,GAAA,CAAI,OAAA,CAAQ,QAAA,EAAU,CAAA,MAAA,KAAU,CAAA,CAAA,EAAI,MAAA,CAAO,WAAA,EAAa,CAAA,CAAE,CAAC,CAAA,CAAA;AACtF,EAAA,QAAA,CAAS,MAAA,GAAS,GAAG,IAAI,CAAA,CAAA,EAAI,mBAAmB,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA,wCAAA,CAAA;AAClE;AAOO,SAAS,WAAW,KAAA,EAAyB;AAChD,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,EAAA,MAAM,IAAA,GAAO,KAAA,KAAU,MAAA,IAAW,KAAA,KAAU,QAAA,IAAY,OAAO,MAAA,CAAO,UAAA,KAAe,UAAA,IAAc,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA,CAAE,OAAA;AACrJ,EAAA,MAAM,OAAO,QAAA,CAAS,eAAA;AACtB,EAAA,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,MAAA,EAAQ,IAAI,CAAA;AAClC,EAAA,IAAA,CAAK,OAAA,CAAQ,KAAA,GAAQ,IAAA,GAAO,MAAA,GAAS,OAAA;AACrC,EAAA,IAAA,CAAK,QAAQ,eAAA,GAAkB,KAAA;AAC/B,EAAA,IAAA,CAAK,KAAA,CAAM,WAAA,GAAc,IAAA,GAAO,MAAA,GAAS,OAAA;AAC7C;AAMO,SAAS,gBAAgB,KAAA,EAA2B;AACvD,EAAA,MAAM,IAAA,GAAO,KAAA,KAAU,MAAA,IAAU,KAAA,KAAU,UAAU,KAAA,GAAQ,QAAA;AAC7D,EAAA,OAAO,sBAAsB,IAAI,CAAA,6QAAA,CAAA;AACrC;AAEA,SAAS,QAAA,GAAoB;AACzB,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIG,SAAS,IAAI,CAAA;AACnC,EAAAG,UAAU,MAAM;AACZ,IAAA,MAAA,CAAO,mBAAmB,IAAA,CAAK,SAAA,CAAU,QAAA,IAAY,SAAA,CAAU,SAAS,CAAC,CAAA;AAAA,EAC7E,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,OAAO,GAAA;AACX;AAUO,SAAS,UAAU,EAAE,KAAA,EAAO,QAAA,EAAU,QAAA,GAAW,iBAAiB,aAAA,GAAgB,SAAA,EAAW,KAAA,GAAQ,IAAI,kBAAA,EAAoB,SAAA,EAAW,iBAAiB,QAAA,EAAU,MAAA,GAAS,gBAAe,EAAmB;AACjN,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,mBAAA,EAAoB;AAClC,EAAA,MAAM,CAAC,KAAK,CAAA,GAAIH,SAAS,MAAM,SAAA,IAAa,iBAAiB,CAAA;AAC7D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,QAAAA,CAA2B,MAAM,WAAW,CAAA;AAClF,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAuB,IAAI,CAAA;AAIzD,EAAA,IAAI,CAAC,KAAA,CAAM,GAAA,GAAM,MAAA,EAAQ,KAAA,CAAM,IAAI,EAAE,IAAA,EAAM,KAAA,CAAM,WAAA,CAAY,UAAU,QAAA,EAAU,KAAA,CAAM,YAAY,QAAA,EAAU,MAAA,EAAQ,MAAM,CAAA;AAG3H,EAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,WAAW,CAAA;AAC1D,EAAAG,UAAU,MAAM;AACZ,IAAA,cAAA,CAAe,IAAA,CAAK,KAAA,CAAM,iBAAiB,CAAqB,CAAA;AAAA,EACpE,CAAA,EAAG,CAAC,iBAAiB,CAAC,CAAA;AAEtB,EAAA,MAAM,aAAA,GAAgBO,WAAAA;AAAA,IAClB,CAAC,KAAK,KAAA,KAAU;AACZ,MAAA,cAAA,CAAe,CAAA,OAAA,MAAY,EAAE,GAAG,OAAA,EAAS,CAAC,GAAG,GAAG,OAAM,CAAE,CAAA;AACxD,MAAA,IAAI,GAAA,KAAQ,OAAA,EAAS,UAAA,CAAW,KAAmB,CAAA;AACnD,MAAA,IAAI,kBAAA,KAAuB,MAAA,EAAW,kBAAA,CAAmB,GAAA,EAAK,KAAK,CAAA;AAAA,WAC9D,WAAA,CAAY,KAAK,KAAK,CAAA;AAAA,IAC/B,CAAA;AAAA,IACA,CAAC,kBAAkB;AAAA,GACvB;AAEA,EAAA,MAAM,UAAA,GAAaA,WAAAA;AAAA,IACf,CAAC,IAAA,KAAmB;AAChB,MAAA,MAAM,IAAA,GAAO,QAAQ,CAAC,WAAA,CAAY,MAAM,GAAA,EAAI,EAAG,OAAA,CAAQ,WAAW,CAAC,CAAA;AACnE,MAAA,KAAA,CAAM,IAAI,EAAE,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,OAAO,CAAA;AACzC,MAAA,aAAA,CAAc,YAAY,IAAI,CAAA;AAAA,IAClC,CAAA;AAAA,IACA,CAAC,OAAO,aAAa;AAAA,GACzB;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,MAAA;AAC7B,EAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,SAAA;AAGhC,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,CAAA,KAAA,KAAS,GAAG,KAAA,CAAM,GAAG,CAAA,CAAA,EAAI,KAAA,CAAM,OAAA,CAAQ,EAAE,CAAA,CAAE,CAAA,CAAE,KAAK,GAAG,CAAA;AAC9E,EAAA,IAAI,UAAA,CAAW,KAAK,CAAA,EAAG,kBAAA,EAAmB;AAC1C,EAAA,MAAM,GAAA,GAAMR,OAAAA;AAAA,IACR,OAAO;AAAA,MACH,KAAA;AAAA,MACA,CAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAA,EAAM,aAAA;AAAA,MACN,KAAA;AAAA,MACA,WAAA;AAAA,MACA,aAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA,IAAA,EAAM,KAAA;AAAA,MACN,UAAA;AAAA,MACA,aAAa,CAAA,OAAA,KAAW;AACpB,QAAA,KAAA,CAAM,IAAI,EAAE,OAAA,EAAS,MAAM,IAAA,EAAM,QAAA,EAAU,OAAO,CAAA;AAClD,QAAA,aAAA,CAAc,YAAY,IAAI,CAAA;AAAA,MAClC,CAAA;AAAA,MACA,KAAK,CAAA,QAAA,KAAY;AACb,QAAA,KAAA,CAAM,GAAA,CAAI,EAAE,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,OAAO,OAAA,EAAS,IAAA,EAAM,eAAA,EAAiB,QAAA,EAAU,CAAA;AACnF,QAAA,aAAA,CAAc,YAAY,IAAI,CAAA;AAAA,MAClC,CAAA;AAAA,MACA,UAAU,CAAA,MAAA,KAAU;AAChB,QAAA,UAAA,CAAW,IAAI,CAAA;AACf,QAAA,QAAA,CAAS,SAAA,EAAW,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,aAAA,CAAc,MAAA,EAAQ,MAAA,EAAQ,eAAA,EAAiB,CAAA,EAAG,CAAA;AAAA,MAClG;AAAA,KACJ,CAAA;AAAA,IACA,CAAC,KAAA,EAAO,CAAA,EAAG,QAAA,EAAU,aAAA,EAAe,KAAA,EAAO,WAAA,EAAa,aAAA,EAAe,OAAA,EAAS,KAAA,EAAO,UAAA,EAAY,MAAA,EAAQ,SAAS;AAAA,GACxH;AAEA,EAAA,MAAM,cAAA,GAAiBD,OAAO,WAAW,CAAA;AACzC,EAAA,cAAA,CAAe,OAAA,GAAU,WAAA;AAGzB,EAAAE,UAAU,MAAM;AACZ,IAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAyB;AACtC,MAAA,IAAI,EAAE,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,OAAA,CAAA,IAAY,MAAM,MAAA,EAAQ;AACvD,MAAA,IAAI,KAAA,CAAM,GAAA,CAAI,WAAA,EAAY,KAAM,GAAA,EAAK;AACjC,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,UAAA,CAAW,CAAA,OAAA,KAAY,OAAA,KAAY,SAAA,GAAY,IAAA,GAAO,SAAU,CAAA;AAAA,MACpE,CAAA,MAAA,IAAW,KAAA,CAAM,GAAA,KAAQ,GAAA,EAAK;AAC1B,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,aAAA,CAAc,iBAAA,EAAmB,EAAE,cAAA,CAAe,OAAA,CAAQ,mBAAmB,KAAA,CAAM,CAAA;AAAA,MACvF;AAAA,IACJ,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,OAAO,CAAA;AAC1C,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,OAAO,CAAA;AAAA,EAC9D,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAGlB,EAAA,MAAM,IAAA,GAAO,CAAA,EAAG,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA,CAAA,EAAI,KAAA,CAAM,GAAA,CAAI,UAAA,IAAc,EAAE,CAAA,CAAA,EAAI,KAAA,CAAM,IAAA,EAAM,SAAS,EAAE,CAAA,CAAA;AAC7F,EAAAA,UAAU,MAAM;AACZ,IAAA,UAAA,CAAW,CAAA,OAAA,KAAY,OAAA,KAAY,SAAA,GAAY,OAAA,GAAU,IAAK,CAAA;AAAA,EAClE,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,WAAA,EAAa,IAAI,CAAA;AACzC,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,MAAA,EAAQ,KAAK,CAAA;AACrC,EAAA,MAAM,WAAW,MAAA,CAAO,IAAA,CAAK,WAAS,KAAA,CAAM,OAAA,CAAQ,aAAa,IAAI,CAAA;AACrE,EAAA,MAAM,WAAW,YAAA,CAAa,KAAA,EAAO,WAAS,WAAA,CAAY,KAAA,EAAO,MAAM,CAAC,CAAA;AACxE,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,KAAW,MAAA,KAAc,KAAA,CAAM,OAAO,IAAA,KAAS,SAAA,IAAa,QAAA,CAAA,GAAY,KAAA,CAAM,MAAA,GAAS,MAAA;AAE5G,EAAA,uBACIN,GAAAA,CAAC,YAAA,CAAa,QAAA,EAAb,EAAsB,KAAA,EAAO,GAAA,EAC1B,QAAA,kBAAAO,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAY,kBAAgB,QAAA,EACvC,QAAA,EAAA;AAAA,oBAAAP,GAAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACG,SAAA,EAAU,eAAA;AAAA,QACV,IAAA,EAAM,IAAI,MAAM,CAAA,CAAA;AAAA,QAChB,SAAS,CAAA,KAAA,KAAS;AACd,UAAA,MAAM,IAAA,GAAO,QAAA,CAAS,cAAA,CAAe,MAAM,CAAA;AAC3C,UAAA,IAAI,SAAS,IAAA,EAAM;AACnB,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,IAAA,CAAK,KAAA,EAAM;AACX,UAAA,IAAA,CAAK,cAAA,GAAiB,EAAE,KAAA,EAAO,OAAA,EAAS,CAAA;AAAA,QAC5C,CAAA;AAAA,QAEC,YAAE,iBAAiB;AAAA;AAAA,KACxB;AAAA,oBACAA,GAAAA,CAAC,IAAA,EAAA,EAAK,cAAA,EAAgC,CAAA;AAAA,oBACtCO,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACX,QAAA,EAAA;AAAA,sBAAAP,GAAAA,CAAC,UAAO,MAAA,EAAgB,CAAA;AAAA,MACvB,MAAA,KAAW,MAAA,oBACRO,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,sBAAA,EAAyB,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,IAAA,EAAK,QAAA,EACzD,QAAA,EAAA;AAAA,wBAAAP,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EAAmB,iBAAO,IAAA,EAAK,CAAA;AAAA,QAC9C,MAAA,CAAO,MAAA,KAAW,MAAA,oBAAaA,IAAC,aAAA,EAAA,EAAc,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,EAAG,SAAA,EAAU,mBAAA,EAAqB,QAAA,EAAA,MAAA,CAAO,OAAO,KAAA,EAAM;AAAA,OAAA,EACnI,CAAA;AAAA,sBAEJO,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACX,QAAA,EAAA;AAAA,wBAAAP,IAAC,MAAA,EAAA,EAAO,CAAA;AAAA,wBACRA,IAAC,MAAA,EAAA,EAAK,EAAA,EAAI,QAAQ,QAAA,EAAU,EAAA,EAAI,SAAA,EAAU,gCAAA,EAAkC,QAAA,EAAS;AAAA,OAAA,EACzF;AAAA,KAAA,EACJ,CAAA;AAAA,oBACAA,GAAAA,CAAC,UAAA,EAAA,EAAW,MAAA,EAAgB,CAAA;AAAA,IAC3B,OAAA,KAAY,6BAAaA,GAAAA,CAAC,kBAAe,OAAA,EAAS,MAAM,UAAA,CAAW,IAAI,CAAA,EAAG,CAAA;AAAA,IAC1E,OAAA,KAAY,+BAAeA,GAAAA,CAAC,YAAS,OAAA,EAAS,MAAM,UAAA,CAAW,IAAI,CAAA,EAAG,CAAA;AAAA,IACtE,OAAA,KAAY,mCAAmBA,GAAAA,CAAC,gBAAa,OAAA,EAAS,MAAM,UAAA,CAAW,IAAI,CAAA,EAAG;AAAA,GAAA,EACnF,CAAA,EACJ,CAAA;AAER;AAEA,SAAS,OAAA,GAAU;AACf,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,QAAA,EAAS;AAC3B,EAAA,MAAM,KAAA,GAAQ,oBAAmB,CAAE,IAAA,CAAK,SAAO,GAAA,CAAI,GAAA,KAAQ,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AACxE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIG,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,KAAA,GAAQ,EAAE,WAAA,EAAa,MAAA,CAAO,OAAO,KAAA,CAAM,GAAA,CAAI,GAAG,CAAC,CAAA,EAAE;AAC3D,EAAA,IAAI,KAAA,EAAO,QAAA,IAAY,CAAC,MAAA,EAAQ;AAC5B,IAAA,uBACII,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAe,eAAY,MAAA,EACvC,QAAA,EAAA;AAAA,sBAAAP,IAAC,KAAA,EAAA,EAAI,GAAA,EAAK,KAAA,CAAM,QAAA,EAAU,KAAI,EAAA,EAAG,SAAA,EAAW,KAAA,CAAM,aAAA,GAAgB,uBAAuB,EAAA,EAAI,OAAA,EAAS,MAAM,SAAA,CAAU,IAAI,CAAA,EAAG,CAAA;AAAA,MAC5H,MAAM,aAAA,oBAAiBA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAK,KAAA,CAAM,aAAA,EAAe,GAAA,EAAI,EAAA,EAAG,WAAU,mBAAA,EAAoB,OAAA,EAAS,MAAM,SAAA,CAAU,IAAI,CAAA,EAAG;AAAA,KAAA,EAChI,CAAA;AAAA,EAER;AACA,EAAA,uBAAOA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EAA4B,OAAc,aAAA,EAAY,MAAA,EAAQ,QAAA,EAAA,QAAA,CAAS,KAAA,CAAM,IAAI,IAAA,CAAK,OAAA,CAAQ,gBAAA,EAAkB,EAAE,CAAC,CAAA,EAAE,CAAA;AAChJ;AAEA,SAAS,IAAA,CAAK,EAAE,cAAA,EAAe,EAA+B;AAC1D,EAAA,MAAM,EAAE,KAAA,EAAO,CAAA,EAAG,IAAA,EAAM,KAAA,EAAO,aAAa,aAAA,EAAe,OAAA,EAAS,UAAA,EAAW,GAAI,QAAA,EAAS;AAC5F,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIG,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,OAAA,GAAUC,OAA0B,IAAI,CAAA;AAC9C,EAAA,MAAM,SAAS,WAAA,CAAY,UAAA;AAC3B,EAAA,MAAM,IAAA,GAAO,MAAA,IAAU,OAAA,IAAW,OAAA,KAAY,SAAA;AAC9C,EAAA,MAAM,OAAO,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,OAAA,CAAQ,kBAAkB,EAAE,CAAA;AACxD,EAAA,uBACIG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EAAgB,eAAa,MAAA,EACxC,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACG,SAAA,EAAU,UAAA;AAAA,QACV,WAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAY,EAAE,iBAAiB,CAAA;AAAA,QAC/B,YAAA,EAAc,MAAM,UAAA,CAAW,IAAI,CAAA;AAAA,QACnC,YAAA,EAAc,MAAM,UAAA,CAAW,KAAK,CAAA;AAAA,QACpC,cAAA,EAAgB,MAAM,UAAA,CAAW,IAAI,CAAA;AAAA,QACrC,eAAe,CAAA,KAAA,KAAS;AACpB,UAAA,IAAI,CAAC,MAAM,aAAA,CAAc,QAAA,CAAS,MAAM,aAA4B,CAAA,aAAc,KAAK,CAAA;AAAA,QAC3F,CAAA;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EACX,QAAA,EAAA;AAAA,4BAAAA,KAAC,IAAA,EAAA,EAAK,IAAA,EAAM,KAAA,CAAM,GAAA,CAAI,SAAS,SAAA,EAAU,eAAA,EAAgB,YAAA,EAAY,CAAA,CAAE,cAAc,EAAE,GAAA,EAAK,MAAM,GAAA,CAAI,IAAA,EAAM,CAAA,EACxG,QAAA,EAAA;AAAA,8BAAAP,IAAC,OAAA,EAAA,EAAQ,CAAA;AAAA,8BACTO,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAiB,eAAY,MAAA,EACzC,QAAA,EAAA;AAAA,gCAAAP,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EAAkC,GAAA,EAAK,GAAG,cAAc,CAAA,cAAA,CAAA,EAAkB,MAAA,EAAQ,CAAA,EAAG,cAAc,CAAA,mBAAA,EAAsB,cAAc,wBAAwB,GAAA,EAAI,EAAA,EAAG,QAAQ,EAAA,EAAI,CAAA;AAAA,gCACjMA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gCAAA,EAAiC,GAAA,EAAK,GAAG,cAAc,CAAA,oBAAA,CAAA,EAAwB,MAAA,EAAQ,CAAA,EAAG,cAAc,CAAA,yBAAA,EAA4B,cAAc,8BAA8B,GAAA,EAAI,EAAA,EAAG,QAAQ,EAAA,EAAI,CAAA;AAAA,gCAClNA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAgB,QAAA,EAAA,IAAA,EAAK;AAAA,eAAA,EACzC;AAAA,aAAA,EACJ,CAAA;AAAA,4BACAA,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,8BAAA,EAA+B,OAAA,EAAS,MAAM,aAAA,CAAc,YAAA,EAAc,CAAC,MAAM,CAAA,EAAG,cAAY,MAAA,GAAS,CAAA,CAAE,kBAAkB,CAAA,GAAI,CAAA,CAAE,gBAAgB,CAAA,EAAG,cAAA,EAAc,MAAA,EAAQ,UAAU,IAAA,GAAO,CAAA,GAAI,IAC5N,QAAA,EAAA,MAAA,mBAASA,IAAC,MAAA,EAAA,EAAO,IAAA,EAAM,EAAA,EAAI,WAAA,EAAa,GAAA,EAAK,aAAA,EAAW,MAAC,CAAA,mBAAKA,IAAC,GAAA,EAAA,EAAI,IAAA,EAAM,IAAI,WAAA,EAAa,GAAA,EAAK,aAAA,EAAW,IAAA,EAAC,CAAA,EAChH;AAAA,WAAA,EACJ,CAAA;AAAA,0BACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EAAe,YAAA,EAAY,IAAA,EACrC,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAA,IAAA,KAAQ;AACzB,YAAA,MAAM,IAAA,GAAO,WAAA,CAAY,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AACzC,YAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,KAAQ,KAAA,CAAM,GAAA,CAAI,UAAA;AACtC,YAAA,uBACIO,IAAAA,CAAC,IAAA,EAAA,EAAoB,IAAA,EAAM,MAAA,CAAO,IAAI,CAAA,EAAG,SAAA,EAAW,CAAA,cAAA,EAAiB,MAAA,GAAS,WAAA,GAAc,EAAE,IAAI,cAAA,EAAc,MAAA,GAAS,MAAA,GAAS,MAAA,EAAW,KAAA,EAAO,IAAA,GAAO,SAAY,IAAA,CAAK,KAAA,EAAO,YAAA,EAAY,IAAA,CAAK,KAAA,EAChM,QAAA,EAAA;AAAA,8BAAAP,IAAC,IAAA,EAAA,EAAK,IAAA,EAAM,IAAI,WAAA,EAAa,GAAA,EAAK,eAAW,IAAA,EAAC,CAAA;AAAA,8BAC9CA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAkB,eAAK,KAAA,EAAM;AAAA,aAAA,EAAA,EAFtC,KAAK,GAGhB,CAAA;AAAA,UAER,CAAC,CAAA,EACL,CAAA;AAAA,0BACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBACX,QAAA,kBAAAO,IAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACG,GAAA,EAAK,OAAA;AAAA,cACL,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAW,CAAA,iBAAA,EAAoB,OAAA,KAAY,SAAA,GAAY,YAAY,EAAE,CAAA,CAAA;AAAA,cACrE,eAAA,EAAc,MAAA;AAAA,cACd,iBAAe,OAAA,KAAY,SAAA;AAAA,cAC3B,YAAA,EAAY,EAAE,yBAAyB,CAAA;AAAA,cACvC,SAAS,MAAM,UAAA,CAAW,OAAA,KAAY,SAAA,GAAY,OAAO,SAAS,CAAA;AAAA,cAElE,QAAA,EAAA;AAAA,gCAAAP,IAAC,MAAA,EAAA,EAAO,CAAA;AAAA,gCACRO,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EACZ,QAAA,EAAA;AAAA,kCAAAP,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EAA8B,QAAA,EAAA,KAAA,CAAM,OAAO,IAAA,EAAK,CAAA;AAAA,kCAChEA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,2BAAA,EAA6B,QAAA,EAAA,CAAA,CAAE,yBAAyB,CAAA,EAAE;AAAA,iBAAA,EAC9E;AAAA;AAAA;AAAA,WACJ,EACJ;AAAA;AAAA;AAAA,KACJ;AAAA,oBACAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAM,OAAA,KAAY,SAAA,EAAW,MAAA,EAAQ,OAAA,EAAS,SAAA,EAAU,WAAA,EAAY,KAAA,EAAO,CAAA,CAAE,SAAS,CAAA,EAAG,OAAA,EAAS,MAAM,UAAA,CAAW,IAAI,CAAA,EAC5H,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,MAAA,EAAQ,MAAM,UAAA,CAAW,IAAI,CAAA,EAAG,CAAA,EACjD;AAAA,GAAA,EACJ,CAAA;AAER;AAEA,SAAS,MAAA,GAAS;AACd,EAAA,MAAM,EAAE,KAAA,EAAO,CAAA,EAAG,MAAM,WAAA,EAAa,aAAA,KAAkB,QAAA,EAAS;AAChE,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,UAAQ,IAAA,CAAK,GAAA,KAAQ,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA;AAC3E,EAAA,MAAM,KAAA,GAAQ,IAAA,EAAM,KAAA,IAAS,EAAC;AAC9B,EAAA,IAAI,IAAA,KAAS,MAAA,IAAa,KAAA,CAAM,MAAA,GAAS,GAAG,OAAO,IAAA;AACnD,EAAA,MAAM,SAAA,GAAY,YAAY,eAAA,IAAmB,KAAA;AACjD,EAAA,IAAI,SAAA,EAAW;AACX,IAAA,uBACIA,GAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,cAAa,gBAAA,EAAe,MAAA,EAAO,YAAA,EAAY,IAAA,CAAK,KAAA,EACjE,QAAA,kBAAAO,IAAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,SAAA,EAAU,kBAAA,EAAmB,OAAA,EAAS,MAAM,aAAA,CAAc,iBAAA,EAAmB,KAAK,GAAG,YAAA,EAAY,CAAA,CAAE,eAAA,EAAiB,EAAE,MAAM,IAAA,CAAK,KAAA,EAAO,CAAA,EAAG,OAAM,SAAA,EACnK,QAAA,EAAA;AAAA,sBAAAP,IAAC,aAAA,EAAA,EAAc,IAAA,EAAM,IAAI,WAAA,EAAa,GAAA,EAAK,eAAW,IAAA,EAAC,CAAA;AAAA,sBACvDA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM;AAAA,KAAA,EACtB,CAAA,EACJ,CAAA;AAAA,EAER;AACA,EAAA,uBACIO,IAAAA,CAAC,OAAA,EAAA,EAAM,WAAU,YAAA,EAAa,YAAA,EAAY,KAAK,KAAA,EAC3C,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACX,QAAA,EAAA;AAAA,sBAAAP,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,cAAA,EAAgB,eAAK,KAAA,EAAM,CAAA;AAAA,sBAC7CA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,iBAAA,EAAkB,OAAA,EAAS,MAAM,aAAA,CAAc,iBAAA,EAAmB,IAAI,CAAA,EAAG,cAAY,CAAA,CAAE,iBAAA,EAAmB,EAAE,IAAA,EAAM,IAAA,CAAK,KAAA,EAAO,CAAA,EAAG,OAAM,SAAA,EACnK,QAAA,kBAAAA,GAAAA,CAAC,cAAA,EAAA,EAAe,MAAM,EAAA,EAAI,WAAA,EAAa,GAAA,EAAK,aAAA,EAAW,MAAC,CAAA,EAC5D;AAAA,KAAA,EACJ,CAAA;AAAA,oBACAA,IAAC,KAAA,EAAA,EAAI,YAAA,EAAY,KAAK,KAAA,EAAO,SAAA,EAAU,mBACnC,QAAA,kBAAAA,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACG,KAAA;AAAA,QACA,YAAY,CAAA,IAAA,KAAQ;AAChB,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,KAAQ,KAAA,CAAM,GAAA,CAAI,UAAA;AACtC,UAAA,uBACIO,IAAAA,CAAC,IAAA,EAAA,EAAoB,IAAA,EAAM,MAAA,CAAO,IAAI,CAAA,EAAG,SAAA,EAAW,CAAA,gBAAA,EAAmB,MAAA,GAAS,WAAA,GAAc,EAAE,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,KAAW,IAAA,GAAO,WAAA,GAAc,EAAE,CAAA,CAAA,EAAI,cAAA,EAAc,MAAA,GAAS,MAAA,GAAS,MAAA,EAAW,aAAA,EAAa,IAAA,CAAK,MAAA,KAAW,IAAA,GAAO,MAAA,GAAS,MAAA,EACnO,QAAA,EAAA;AAAA,4BAAAP,GAAAA,CAAC,UAAK,SAAA,EAAU,cAAA,EAAe,OAAO,IAAA,CAAK,KAAA,EAAQ,eAAK,KAAA,EAAM,CAAA;AAAA,4BAC9DA,GAAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAY;AAAA,WAAA,EAAA,EAFnB,KAAK,GAGhB,CAAA;AAAA,QAER;AAAA;AAAA,KACJ,EACJ;AAAA,GAAA,EACJ,CAAA;AAER;AAEA,SAAS,MAAA,CAAO,EAAE,MAAA,EAAO,EAAwB;AAC7C,EAAA,MAAM,EAAE,OAAO,CAAA,EAAG,OAAA,EAAS,YAAY,IAAA,EAAM,UAAA,EAAY,IAAA,EAAK,GAAI,QAAA,EAAS;AAC3E,EAAA,MAAM,MAAM,QAAA,EAAS;AACrB,EAAA,MAAM,GAAA,GAAMI,OAA0B,IAAI,CAAA;AAC1C,EAAA,MAAM,MAAA,GAASA,OAA0B,IAAI,CAAA;AAC7C,EAAA,MAAM,IAAA,GAAOA,OAA0B,IAAI,CAAA;AAC3C,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,WAAA,EAAa,IAAI,CAAA;AACzC,EAAA,MAAM,WAAW,YAAA,CAAa,IAAA,EAAM,WAAS,WAAA,CAAY,KAAA,EAAO,MAAM,CAAC,CAAA;AACvE,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,IAAA,EAAM,CAAA,KAAA,KAAS,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,CAAA,MAAA,KAAU,MAAA,CAAO,MAAM,CAAA,CAAE,MAAM,CAAA;AAC/F,EAAA,MAAM,CAAC,YAAA,EAAc,GAAG,IAAI,CAAA,GAAI,MAAM,OAAA,CAAQ,MAAA;AAC9C,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,CAAA,KAAA,KAAS,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AAC9E,EAAA,MAAM,KAAA,GAAQS,YAAY,MAAM,UAAA,CAAW,IAAI,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAE9D,EAAA,uBACIN,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,YAAA,EACd,QAAA,EAAA;AAAA,oBAAAP,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,iCAAA,EAAkC,OAAA,EAAS,MAAM,UAAA,CAAW,WAAW,CAAA,EAAG,YAAA,EAAY,CAAA,CAAE,iBAAiB,CAAA,EAAG,eAAA,EAAc,QAAA,EACtJ,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EAAI,WAAA,EAAa,GAAA,EAAK,aAAA,EAAW,IAAA,EAAC,CAAA,EAClD,CAAA;AAAA,IACC,iBAAiB,MAAA,oBACdO,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8BAAA,EACX,QAAA,EAAA;AAAA,sBAAAA,KAAC,QAAA,EAAA,EAAO,GAAA,EAAK,GAAA,EAAK,IAAA,EAAK,UAAS,SAAA,EAAW,CAAA,YAAA,EAAe,OAAA,KAAY,KAAA,GAAQ,YAAY,EAAE,CAAA,CAAA,EAAI,iBAAc,QAAA,EAAS,eAAA,EAAe,YAAY,KAAA,EAAO,YAAA,EAAY,CAAA,CAAE,iBAAA,EAAmB,EAAE,KAAA,EAAO,YAAA,CAAa,KAAA,EAAO,IAAA,EAAM,aAAa,OAAA,CAAQ,IAAA,EAAM,CAAA,EAAG,SAAS,MAAM,UAAA,CAAW,YAAY,KAAA,GAAQ,IAAA,GAAO,KAAK,CAAA,EACjT,QAAA,EAAA;AAAA,wBAAAP,IAAC,IAAA,EAAA,EAAK,IAAA,EAAM,YAAA,CAAa,OAAA,EAAS,MAAK,OAAA,EAAQ,CAAA;AAAA,wBAC/CA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAmB,KAAA,EAAO,YAAA,CAAa,OAAA,CAAQ,IAAA,EAAO,QAAA,EAAA,YAAA,CAAa,OAAA,CAAQ,IAAA,EAAK,CAAA;AAAA,wBAChGA,GAAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,qBAAA,EAAsB,MAAM,EAAA,EAAI,WAAA,EAAa,GAAA,EAAK,aAAA,EAAW,IAAA,EAAC;AAAA,OAAA,EAC5F,CAAA;AAAA,MACC,CAAC,0BACEA,GAAAA,CAAC,WAAQ,IAAA,EAAM,OAAA,KAAY,OAAO,MAAA,EAAQ,GAAA,EAAK,OAAO,YAAA,CAAa,KAAA,EAAO,SAAS,KAAA,EAC/E,QAAA,kBAAAA,IAAC,gBAAA,EAAA,EAAiB,KAAA,EAAO,cAAc,CAAA,EAC3C,CAAA;AAAA,MAEH,KAAK,MAAA,GAAS,CAAA,oBACXO,IAAAA,CAAAC,UAAA,EACI,QAAA,EAAA;AAAA,wBAAAR,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAgB,aAAA,EAAY,QAAO,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,wBACpDO,KAAC,QAAA,EAAA,EAAO,GAAA,EAAK,QAAQ,IAAA,EAAK,QAAA,EAAS,WAAW,CAAA,YAAA,EAAe,OAAA,KAAY,YAAY,SAAA,GAAY,EAAE,IAAI,eAAA,EAAc,QAAA,EAAS,iBAAe,OAAA,KAAY,SAAA,EAAW,YAAA,EAAY,IAAA,CAAK,GAAA,CAAI,CAAA,KAAA,KAAS,EAAE,iBAAA,EAAmB,EAAE,OAAO,KAAA,CAAM,KAAA,EAAO,MAAM,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAC,EAAE,IAAA,CAAK,IAAI,GAAG,OAAA,EAAS,MAAM,WAAW,OAAA,KAAY,SAAA,GAAY,IAAA,GAAO,SAAS,CAAA,EACpV,QAAA,EAAA;AAAA,0BAAAP,GAAAA,CAAC,YAAA,EAAA,EAAa,MAAA,EAAQ,IAAA,EAAM,CAAA;AAAA,0BAC5BA,GAAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,qBAAA,EAAsB,MAAM,EAAA,EAAI,WAAA,EAAa,GAAA,EAAK,aAAA,EAAW,IAAA,EAAC;AAAA,SAAA,EAC5F,CAAA;AAAA,QACC,CAAC,MAAA,oBACEA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAM,OAAA,KAAY,SAAA,EAAW,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,IAAA,CAAK,IAAI,CAAA,KAAA,KAAS,KAAA,CAAM,KAAK,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA,EAAG,OAAA,EAAS,OAC9G,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,YAAA,CAAa,OAAA,CAAQ,IAAI,CAAA,EAChE;AAAA,OAAA,EAER;AAAA,KAAA,EAER,CAAA;AAAA,IAEH,YAAA,KAAiB,0BACdO,IAAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,gDAAA,EAAiD,OAAA,EAAS,MAAM,WAAW,eAAe,CAAA,EAAG,iBAAc,QAAA,EAAS,YAAA,EAAY,EAAE,wBAAA,EAA0B,EAAE,KAAA,EAAO,CAAA,EACjM,QAAA,EAAA;AAAA,sBAAAP,IAAC,IAAA,EAAA,EAAK,IAAA,EAAM,YAAA,CAAa,OAAA,EAAS,MAAK,OAAA,EAAQ,CAAA;AAAA,sBAC/CA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAoB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBAC1CA,GAAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,qBAAA,EAAsB,MAAM,EAAA,EAAI,WAAA,EAAa,GAAA,EAAK,aAAA,EAAW,IAAA,EAAC;AAAA,KAAA,EAC5F,CAAA;AAAA,oBAEJO,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACX,QAAA,EAAA;AAAA,sBAAAA,KAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,mBAAA,EAAoB,SAAS,MAAM,UAAA,CAAW,SAAS,CAAA,EAAG,cAAY,CAAA,CAAE,qBAAgB,GAAG,mBAAA,EAAmB,GAAA,GAAM,WAAW,WAAA,EAC3J,QAAA,EAAA;AAAA,wBAAAP,GAAAA,CAACe,QAAA,EAAO,IAAA,EAAM,IAAI,WAAA,EAAa,GAAA,EAAK,eAAW,IAAA,EAAC,CAAA;AAAA,wBAChDf,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,kBAAA,EAAoB,QAAA,EAAA,CAAA,CAAE,qBAAgB,CAAA,EAAE,CAAA;AAAA,wBACxDA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,SAAA,EAAW,QAAA,EAAA,GAAA,GAAM,YAAO,QAAA,EAAS;AAAA,OAAA,EACpD,CAAA;AAAA,sBACAO,IAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAW,CAAA,SAAA,EAAY,QAAA,GAAW,OAAA,GAAU,EAAE,CAAA,CAAA,EAAI,OAAA,EAAS,MAAM,UAAA,EAAW,EAAG,cAAA,EAAc,QAAA,EAAU,eAAA,EAAc,UAAA,EAAW,YAAA,EAAY,MAAA,GAAS,IAAI,CAAA,CAAE,sBAAA,EAAwB,EAAE,KAAA,EAAO,MAAA,EAAQ,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAClO,QAAA,EAAA;AAAA,wBAAAP,IAAC,UAAA,EAAA,EAAW,IAAA,EAAM,IAAI,WAAA,EAAa,GAAA,EAAK,eAAW,IAAA,EAAC,CAAA;AAAA,wBACpDA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,gBAAA,EAAkB,QAAA,EAAA,CAAA,CAAE,MAAM,CAAA,EAAE,CAAA;AAAA,QAC3C,MAAA,GAAS,qBAAKA,GAAAA,CAAC,UAAK,SAAA,EAAU,WAAA,EAAY,aAAA,EAAY,MAAA,EAAQ,QAAA,EAAA,MAAA,EAAO;AAAA,OAAA,EAC1E,CAAA;AAAA,MACC,KAAA,CAAM,aAAA,CAAc,OAAA,oBACjBO,IAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,KAAA,CAAM,aAAA,CAAc,GAAA,EAAK,SAAA,EAAU,yCAAA,EAA0C,YAAA,EAAY,KAAA,CAAM,aAAA,CAAc,MAAA,GAAS,CAAA,GAAI,CAAA,CAAE,+BAAA,EAAiC,EAAE,KAAA,EAAO,KAAA,CAAM,aAAA,CAAc,MAAA,EAAQ,CAAA,GAAI,CAAA,CAAE,eAAe,CAAA,EAC/N,QAAA,EAAA;AAAA,wBAAAP,GAAAA,CAACgC,MAAA,EAAK,IAAA,EAAM,IAAI,WAAA,EAAa,GAAA,EAAK,eAAW,IAAA,EAAC,CAAA;AAAA,QAC7C,KAAA,CAAM,aAAA,CAAc,MAAA,GAAS,CAAA,oBAAKhC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAA,EAAY,aAAA,EAAY,MAAA,EAAQ,QAAA,EAAA,KAAA,CAAM,cAAc,MAAA,EAAO;AAAA,OAAA,EAClH,CAAA;AAAA,sBAEJA,IAAC,QAAA,EAAA,EAAO,GAAA,EAAK,MAAM,IAAA,EAAK,QAAA,EAAS,WAAW,CAAA,wCAAA,EAA2C,OAAA,KAAY,SAAS,OAAA,GAAU,EAAE,IAAI,OAAA,EAAS,MAAM,WAAW,OAAA,KAAY,MAAA,GAAS,OAAO,MAAM,CAAA,EAAG,iBAAc,QAAA,EAAS,eAAA,EAAe,YAAY,MAAA,EAAQ,YAAA,EAAY,EAAE,YAAY,CAAA,EAAG,OAAO,CAAA,CAAE,YAAY,GACnS,QAAA,kBAAAA,GAAAA,CAAC+B,YAAA,EAAW,IAAA,EAAM,IAAI,WAAA,EAAa,GAAA,EAAK,aAAA,EAAW,IAAA,EAAC,CAAA,EACxD,CAAA;AAAA,MACC,CAAC,0BACE/B,GAAAA,CAAC,WAAQ,IAAA,EAAM,OAAA,KAAY,QAAQ,MAAA,EAAQ,IAAA,EAAM,WAAU,YAAA,EAAa,KAAA,EAAO,EAAE,YAAY,CAAA,EAAG,SAAS,KAAA,EACrG,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,CAAA,EACb;AAAA,KAAA,EAER;AAAA,GAAA,EACJ,CAAA;AAER;AC/aO,SAAS,WAAW,EAAE,QAAA,EAAU,SAAA,EAAW,GAAG,OAAM,EAAU;AACjE,EAAA,uBACIA,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACI,GAAG,KAAA;AAAA,MACJ,SAAA,EAAW,EAAA;AAAA,QACP,qEAAA;AAAA,QACA;AAAA,OACJ;AAAA,MAEC;AAAA;AAAA,GACL;AAER;ACdO,SAAS,QAAA,CAAS,EAAE,QAAA,EAAS,EAA4B;AAC5D,EAAA,uBACIA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CACV,QAAA,EACL,CAAA;AAER;ACwBO,SAAS,SAAA,CAAU;AAAA,EACtB,MAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA,GAAY,QAAA;AAAA,EACZ,IAAA,GAAO,MAAA;AAAA,EACP,SAAA,GAAY,KAAA;AAAA,EACZ;AACJ,CAAA,EAAmB;AACf,EAAA,IAAI,SAAA,EAAW;AACX,IAAA,MAAM,2BACFA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,GAAA,EAAK,GAAG,SAAS,CAAA,cAAA,CAAA;AAAA,QACjB,MAAA,EAAQ,CAAA,EAAG,SAAS,CAAA,mBAAA,EAAsB,SAAS,CAAA,oBAAA,CAAA;AAAA,QACnD,GAAA,EAAI,MAAA;AAAA,QACJ,KAAA,EAAO,EAAA;AAAA,QACP,MAAA,EAAQ,EAAA;AAAA,QACR,SAAA,EAAW,EAAA,CAAG,oBAAA,EAAsB,SAAS;AAAA;AAAA,KACjD;AAGJ,IAAA,uBAAOA,GAAAA,CAAC,eAAA,EAAA,EAAgB,MAAA,EAAgB,SAAA,EAAW,GAAG,SAAA,EAAW,SAAS,CAAA,EAAG,QAAA,EAAU,QAAA,EAAU,CAAA;AAAA,EACrG;AAEA,EAAA,MAAM,WACF,IAAA,KAAS,OAAA,GACH,GAAG,SAAS,CAAA,oBAAA,CAAA,GACZ,GAAG,SAAS,CAAA,cAAA,CAAA;AACtB,EAAA,MAAM,iBACF,IAAA,KAAS,OAAA,GACH,GAAG,SAAS,CAAA,uBAAA,CAAA,GACZ,GAAG,SAAS,CAAA,iBAAA,CAAA;AAEtB,EAAA,MAAM,WAAA,GAAc,OAAA,KAAY,MAAA,GAAY,MAAA,GAAS,OAAA;AAErD,EAAA,uBACIO,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,SAAA,EAAW,EAAA,CAAG,gCAAA,EAAkC,SAAS,CAAA;AAAA,MACzD,YAAA,EAAY,aAAU,MAAM,CAAA,CAAA;AAAA,MAE5B,QAAA,EAAA;AAAA,wBAAAP,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACG,GAAA,EAAK,QAAA;AAAA,YACL,MAAA,EAAQ,CAAA,EAAG,QAAQ,CAAA,KAAA,EAAQ,cAAc,CAAA,GAAA,CAAA;AAAA,YACzC,GAAA,EAAI,MAAA;AAAA,YACJ,MAAA,EAAQ,EAAA;AAAA,YACR,SAAA,EAAU,6BAAA;AAAA,YACV,SAAA,EAAW;AAAA;AAAA,SACf;AAAA,QACC,WAAA,KAAgB,IAAA,IAAQ,WAAA,KAAgB,EAAA,mBACrCO,IAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACG,SAAA,EAAW,EAAA;AAAA,cACP,6CAAA;AAAA,cACA,IAAA,KAAS,UACH,eAAA,GACA;AAAA,aACV;AAAA,YACH,QAAA,EAAA;AAAA,cAAA,OAAA;AAAA,cACM;AAAA;AAAA;AAAA,SACP,GACA;AAAA;AAAA;AAAA,GACR;AAER;ACxFA,qBAAA,EAAsB;AAyBf,SAAS,eAAe,EAAE,QAAA,EAAU,aAAA,EAAe,KAAA,EAAO,WAAU,EAAwB;AAC/F,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,mBAAA,EAAoB;AAClC,EAAA,MAAM,MAAA,GAAS,KAAK,SAAA,CAAU;AAAA,IAC1B,KAAA,EAAO,EAAE,YAAY,CAAA;AAAA,IACrB,OAAA,EAAS,EAAE,oBAAe,CAAA;AAAA,IAC1B,KAAA,EAAO,EAAE,mBAAmB,CAAA;AAAA,IAC5B,WAAA,EAAa,EAAE,2BAA2B;AAAA,GAC7C,CAAA;AAED,EAAA,OAAO8B,cAAc,mBAAA,EAAqB;AAAA,IACtC,UAAU,QAAA,IAAY,EAAA;AAAA,IACtB,OAAA,EAAS,aAAA;AAAA,IACT,MAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACH,CAAA;AACL;AC8FO,SAAS,SAAS,KAAA,EAAsB;AAC3C,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,mBAAA,EAAoB;AAClC,EAAA,MAAM;AAAA,IACF,KAAA;AAAA,IACA,WAAA,GAAc,EAAE,cAAS,CAAA;AAAA,IACzB,iBAAA,GAAoB,EAAE,cAAS,CAAA;AAAA,IAC/B,SAAA,GAAY,EAAE,kBAAkB,CAAA;AAAA,IAChC,UAAA;AAAA,IACA,QAAA,GAAW,KAAA;AAAA,IACX,QAAA,GAAW,KAAA;AAAA,IACX,SAAA;AAAA,IACA,gBAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA,GAAe,MAAA;AAAA,IACf,aAAA;AAAA,IACA,EAAA,EAAI,MAAA;AAAA,IACJ,SAAA;AAAA,IACA;AAAA,GACJ,GAAI,KAAA;AAEJ,EAAA,MAAM,MAAA,GAAShC,QAAQ,MAAM,eAAA,CAAgB,KAAK,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAC5D,EAAA,MAAM,WAAA,GAAcA,OAAAA;AAAA,IAChB,MAAM,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AAAA,IACrC,CAAC,MAAM;AAAA,GACX;AACA,EAAA,MAAM,YAAA,GAAeA,OAAAA;AAAA,IACjB,MAAO,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,GAC7B,WAAA,CAAY,IAAA,CAAK,CAAC,GAAA,KAAQ,GAAA,CAAI,KAAA,KAAU,KAAK,CAAA,GAC7C,IAAA;AAAA,IACN,CAAC,aAAa,KAAK;AAAA,GACvB;AAEA,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIF,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAACQ,MAAAA,EAAO,QAAQ,CAAA,GAAIR,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,SAAS,EAAE,CAAA;AAEvD,EAAA,MAAM,YAAA,GAAeC,OAA8B,IAAI,CAAA;AACvD,EAAA,MAAM,QAAA,GAAWA,OAAgC,IAAI,CAAA;AACrD,EAAA,MAAM,OAAA,GAAUA,OAAgC,IAAI,CAAA;AACpD,EAAA,MAAM,UAAUU,KAAAA,EAAM;AACtB,EAAA,MAAM,KAAK,MAAA,IAAU,OAAA;AACrB,EAAA,MAAM,MAAA,GAAS,GAAG,EAAE,CAAA,QAAA,CAAA;AAGpB,EAAA,MAAM,cAAA,GAAiBT,OAAAA;AAAA,IACnB,MAAM,YAAA,CAAa,MAAA,EAAQM,MAAK,CAAA;AAAA,IAChC,CAAC,QAAQA,MAAK;AAAA,GAClB;AACA,EAAA,MAAM,YAAA,GAAeN,OAAAA;AAAA,IACjB,MAAM,cAAA,CAAe,OAAA,CAAQ,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AAAA,IAC7C,CAAC,cAAc;AAAA,GACnB;AAGA,EAAAC,UAAU,MAAM;AACZ,IAAA,IAAI,CAAE,IAAA,EAAM;AACZ,IAAA,MAAM,eAAe,YAAA,CAAa,SAAA;AAAA,MAC9B,CAAC,GAAA,KAAQ,GAAA,CAAI,QAAA,KAAa;AAAA,KAC9B;AACA,IAAA,iBAAA,CAAkB,YAAY,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,YAAA,EAAc,IAAI,CAAC,CAAA;AAGvB,EAAAA,UAAU,MAAM;AACZ,IAAA,IAAI,IAAA,EAAM;AAEN,MAAA,MAAMgC,GAAAA,GAAK,OAAO,UAAA,CAAW,MAAM,SAAS,OAAA,EAAS,KAAA,IAAS,CAAC,CAAA;AAC/D,MAAA,OAAO,MAAM,MAAA,CAAO,YAAA,CAAaA,GAAE,CAAA;AAAA,IACvC;AACA,IAAA,QAAA,CAAS,EAAE,CAAA;AAEX,IAAA,OAAO,MAAA;AAAA,EACX,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAGT,EAAAhC,UAAU,MAAM;AACZ,IAAA,IAAI,CAAE,IAAA,EAAM;AAEZ,IAAA,SAAS,cAAc,KAAA,EAA2B;AAC9C,MAAA,IACI,YAAA,CAAa,YAAY,IAAA,IACzB,CAAE,aAAa,OAAA,CAAQ,QAAA,CAAS,KAAA,CAAM,MAAc,CAAA,EACtD;AACE,QAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,MACjB;AAAA,IACJ;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,eAAe,aAAa,CAAA;AACpD,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,aAAA,EAAe,aAAa,CAAA;AAAA,EACxE,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,cAAA,GAAiBO,WAAAA;AAAA,IACnB,CAAC,GAAA,KAAwB;AACrB,MAAA,IAAI,GAAA,CAAI,aAAa,IAAA,EAAM;AAE3B,MAAA,IACI,IAAI,IAAA,KAAS,MAAA,IACb,kBAAkB,MAAA,IAClB,KAAA,CAAM,aAAa,MAAA,EACrB;AAEE,QAAA,OAAA,CAAQ,KAAK,CAAA;AACb,QAAA;AAAA,MACJ;AAEA,MAAA,IAAI,KAAA,CAAM,aAAa,MAAA,EAAW;AAC9B,QAAA,KAAA,CAAM,QAAA,CAAS,IAAI,KAAK,CAAA;AAAA,MAC5B;AACA,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACjB,CAAA;AAAA,IACA,CAAC,eAAe,KAAK;AAAA,GACzB;AAEA,EAAA,MAAM,SAAA,GAAYA,WAAAA;AAAA,IACd,CAAC,KAAA,KAA2C;AACxC,MAAA,IAAI,KAAA,CAAM,QAAQ,WAAA,EAAa;AAC3B,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,iBAAA;AAAA,UAAkB,CAAC,OAAA,KACf,gBAAA,CAAiB,YAAA,EAAc,SAAS,CAAC;AAAA,SAC7C;AACA,QAAA;AAAA,MACJ;AACA,MAAA,IAAI,KAAA,CAAM,QAAQ,SAAA,EAAW;AACzB,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,iBAAA;AAAA,UAAkB,CAAC,OAAA,KACf,gBAAA,CAAiB,YAAA,EAAc,SAAS,EAAE;AAAA,SAC9C;AACA,QAAA;AAAA,MACJ;AACA,MAAA,IAAI,KAAA,CAAM,QAAQ,MAAA,EAAQ;AACtB,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,iBAAA;AAAA,UACI,aAAa,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,IAAI;AAAA,SACrD;AACA,QAAA;AAAA,MACJ;AACA,MAAA,IAAI,KAAA,CAAM,QAAQ,KAAA,EAAO;AACrB,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,IAAI,IAAA,GAAO,EAAA;AACX,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AAC1C,UAAA,MAAM,GAAA,GAAM,aAAa,CAAC,CAAA;AAC1B,UAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,GAAA,CAAI,QAAA,KAAa,IAAA,EAAM;AAC5C,YAAA,IAAA,GAAO,CAAA;AAAA,UACX;AAAA,QACJ;AACA,QAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,QAAA;AAAA,MACJ;AACA,MAAA,IAAI,KAAA,CAAM,QAAQ,OAAA,EAAS;AACvB,QAAA,IAAI,kBAAkB,CAAA,EAAG;AACrB,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,MAAM,GAAA,GAAM,aAAa,cAAc,CAAA;AACvC,UAAA,IAAI,QAAQ,MAAA,EAAW;AACnB,YAAA,cAAA,CAAe,GAAG,CAAA;AAAA,UACtB;AAAA,QACJ;AACA,QAAA;AAAA,MACJ;AACA,MAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AACxB,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,OAAA,CAAQ,KAAK,CAAA;AACb,QAAA;AAAA,MACJ;AACA,MAAA,IAAI,KAAA,CAAM,QAAQ,KAAA,EAAO;AACrB,QAAA,OAAA,CAAQ,KAAK,CAAA;AACb,QAAA;AAAA,MACJ;AAAA,IACJ,CAAA;AAAA,IACA,CAAC,YAAA,EAAc,cAAA,EAAgB,cAAc;AAAA,GACjD;AAEA,EAAA,uBACIN,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,GAAA,EAAK,YAAA;AAAA,MACL,WAAW,EAAA,CAAG,UAAA,EAAY,YAAA,KAAiB,MAAA,IAAU,UAAU,SAAS,CAAA;AAAA,MAExE,QAAA,EAAA;AAAA,wBAAAA,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACG,EAAA;AAAA,YACA,IAAA,EAAK,QAAA;AAAA,YACL,IAAA,EAAK,UAAA;AAAA,YACL,QAAA;AAAA,YACA,eAAA,EAAe,IAAA;AAAA,YACf,eAAA,EAAc,SAAA;AAAA,YACd,eAAA,EAAe,MAAA;AAAA,YACf,eAAA,EAAe,QAAA;AAAA,YACf,YAAA,EAAY,SAAA;AAAA,YACZ,SAAS,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAE,CAAC,CAAA;AAAA,YACjC,SAAA,EAAW,EAAA;AAAA,cACP,iIAAA;AAAA,cACA,iBAAiB,MAAA,IAAU,QAAA;AAAA,cAC3B,oGAAA;AAAA,cACA,IAAA,IAAQ,0CAAA;AAAA,cACR,QAAA,IAAY,+BAAA;AAAA,cACZ;AAAA,aACJ;AAAA,YAEC,QAAA,EAAA;AAAA,cAAA,YAAA,EAAc,MAAA,KAAW,yBACtBP,GAAAA;AAAA,gBAAC,kBAAA;AAAA,gBAAA;AAAA,kBACG,QAAQ,YAAA,CAAa,MAAA;AAAA,kBACrB,eAAe,YAAA,CAAa;AAAA;AAAA,eAChC,GACA,YAAA,EAAc,IAAA,KAAS,MAAA,mBACvBA,GAAAA;AAAA,gBAAC,YAAA,CAAa,IAAA;AAAA,gBAAb;AAAA,kBACG,SAAA,EAAU,4CAAA;AAAA,kBACV,WAAA,EAAa;AAAA;AAAA,eACjB,GACA,IAAA;AAAA,8BACJA,GAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACG,SAAA,EAAW,EAAA;AAAA,oBACP,iBAAA;AAAA,oBACA,YAAA,KAAiB,IAAA,IAAQ,YAAA,KAAiB,MAAA,GACpC,uBAAA,GACA;AAAA,mBACV;AAAA,kBAEC,QAAA,EAAA,YAAA,KAAiB,IAAA,IAAQ,YAAA,KAAiB,MAAA,GACrC,aAAa,KAAA,GACb;AAAA;AAAA,eACV;AAAA,8BACAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAY;AAAA;AAAA;AAAA,SACzB;AAAA,QAEC,uBACGO,IAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACG,SAAA,EAAW,EAAA;AAAA,cACP,iHAAA;AAAA,cACA;AAAA,aACJ;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAP,GAAAA,CAAC,SAAI,SAAA,EAAU,qCAAA,EACX,0BAAAO,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,UAAA,EACX,QAAA,EAAA;AAAA,gCAAAP,IAAC,UAAA,EAAA,EAAW,CAAA;AAAA,gCACZA,GAAAA;AAAA,kBAAC,OAAA;AAAA,kBAAA;AAAA,oBACG,GAAA,EAAK,QAAA;AAAA,oBACL,IAAA,EAAK,MAAA;AAAA,oBACL,KAAA,EAAOW,MAAAA;AAAA,oBACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,oBACxC,SAAA;AAAA,oBACA,WAAA,EAAa,iBAAA;AAAA,oBACb,SAAA,EAAU,uHAAA;AAAA,oBACV,eAAA,EAAe,MAAA;AAAA,oBACf,mBAAA,EAAkB,MAAA;AAAA,oBAClB,yBACI,cAAA,IAAkB,CAAA,GACZ,GAAG,MAAM,CAAA,CAAA,EAAI,cAAc,CAAA,CAAA,GAC3B;AAAA;AAAA;AAEd,eAAA,EACJ,CAAA,EACJ,CAAA;AAAA,8BAEAX,GAAAA;AAAA,gBAAC,IAAA;AAAA,gBAAA;AAAA,kBACG,EAAA,EAAI,MAAA;AAAA,kBACJ,GAAA,EAAK,OAAA;AAAA,kBACL,IAAA,EAAK,SAAA;AAAA,kBACL,SAAA,EAAU,+BAAA;AAAA,kBAET,QAAA,EAAA,YAAA,CAAa,MAAA,KAAW,CAAA,mBACrBA,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yDAAA,EACT,QAAA,EAAA,SAAA,EACL,IAEA,cAAA,CAAe,GAAA,CAAI,CAAC,KAAA,EAAO,+BACvBA,GAAAA;AAAA,oBAAC,iBAAA;AAAA,oBAAA;AAAA,sBAEG,KAAA;AAAA,sBACA,WAAA,EAAa,YAAA;AAAA,sBACb,MAAA;AAAA,sBACA,cAAA;AAAA,sBACA,aAAa,KAAA,IAAS,IAAA;AAAA,sBACtB,aAAA;AAAA,sBACA,QAAA,EAAU,cAAA;AAAA,sBACV,OAAA,EAAS,CAAC,GAAA,KAAQ,iBAAA,CAAkB,GAAG;AAAA,qBAAA;AAAA,oBARlC,KAAA,CAAM,KAAA,IAAS,CAAA,MAAA,EAAS,UAAU,CAAA;AAAA,mBAU9C;AAAA;AAAA,eAET;AAAA,cAEC,UAAA,KAAe,yBACZA,GAAAA;AAAA,gBAAC,UAAA;AAAA,gBAAA;AAAA,kBACG,OAAO,UAAA,CAAW,KAAA;AAAA,kBAClB,MAAM,UAAA,CAAW,IAAA;AAAA,kBACjB,aAAA;AAAA,kBACA,YAAA,EAAc,MAAM,OAAA,CAAQ,KAAK;AAAA;AAAA,eACrC,GACA;AAAA;AAAA;AAAA,SACR,GACA;AAAA;AAAA;AAAA,GACR;AAER;AAEA,SAAS,iBAAA,CAAkB;AAAA,EACvB,KAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA;AACJ,CAAA,EASG;AACC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEvC,EAAA,uBACIO,IAAAA,CAAAC,QAAAA,EAAA,EACK,QAAA,EAAA;AAAA,IAAA,KAAA,CAAM,KAAA,KAAU,qBACbR,GAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACG,IAAA,EAAK,cAAA;AAAA,QACL,SAAA,EAAU,yGAAA;AAAA,QAET,QAAA,EAAA,KAAA,CAAM;AAAA;AAAA,KACX,GACA,IAAA;AAAA,IACH,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ;AACxB,MAAA,MAAM,SAAA,GAAY,WAAA,CAAY,OAAA,CAAQ,GAAG,CAAA;AACzC,MAAA,MAAM,gBAAgB,SAAA,KAAc,cAAA;AACpC,MAAA,MAAM,QAAA,GAAW,IAAI,KAAA,KAAU,WAAA;AAC/B,MAAA,MAAM,KAAA,mBACFO,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sDAAA,EACV,QAAA,EAAA;AAAA,QAAA,GAAA,CAAI,MAAA,KAAW,yBACZP,GAAAA;AAAA,UAAC,kBAAA;AAAA,UAAA;AAAA,YACG,QAAQ,GAAA,CAAI,MAAA;AAAA,YACZ,eAAe,GAAA,CAAI;AAAA;AAAA,SACvB,GACA,GAAA,CAAI,IAAA,KAAS,MAAA,mBACbA,GAAAA;AAAA,UAAC,GAAA,CAAI,IAAA;AAAA,UAAJ;AAAA,YACG,SAAA,EAAU,4CAAA;AAAA,YACV,WAAA,EAAa;AAAA;AAAA,SACjB,GACA,IAAA;AAAA,wBACJO,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAAA,EACX,QAAA,EAAA;AAAA,0BAAAP,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kDAAA,EACX,cAAI,KAAA,EACT,CAAA;AAAA,UACC,GAAA,CAAI,SAAA,KAAc,MAAA,mBACfA,GAAAA,CAAC,UAAK,SAAA,EAAU,sDAAA,EACX,QAAA,EAAA,GAAA,CAAI,SAAA,EACT,CAAA,GACA;AAAA,SAAA,EACR,CAAA;AAAA,QACC,QAAA,mBAAWA,GAAAA,CAACgB,MAAAA,EAAA,EAAM,CAAA,GAAK;AAAA,OAAA,EAC5B,CAAA;AAGJ,MAAA,MAAM,SAAA,GAAY,EAAA;AAAA,QACd,2DAAA;AAAA,QACA,GAAA,CAAI,aAAa,IAAA,IAAQ,+BAAA;AAAA,QACzB,aAAA,IAAiB,GAAA,CAAI,QAAA,KAAa,IAAA,IAAQ,cAAA;AAAA,QAC1C,QAAA,IAAY;AAAA,OAChB;AAEA,MAAA,IACI,GAAA,CAAI,IAAA,KAAS,MAAA,IACb,aAAA,KAAkB,MAAA,EACpB;AACE,QAAA,uBACIhB,GAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YAEG,EAAA,EAAI,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAAA,YAC1B,IAAA,EAAK,QAAA;AAAA,YACL,eAAA,EAAe,QAAA;AAAA,YACf,eAAA,EAAe,IAAI,QAAA,KAAa,IAAA;AAAA,YAChC,YAAA,EAAc,MAAM,OAAA,CAAQ,SAAS,CAAA;AAAA,YAErC,QAAA,kBAAAA,GAAAA;AAAA,cAAC,aAAA;AAAA,cAAA;AAAA,gBACG,MAAM,GAAA,CAAI,IAAA;AAAA,gBACV,QAAA,EAAQ,IAAA;AAAA,gBACR,SAAA;AAAA,gBAEC,QAAA,EAAA;AAAA;AAAA;AACL,WAAA;AAAA,UAbK,GAAA,CAAI;AAAA,SAcb;AAAA,MAER;AAEA,MAAA,uBACIA,GAAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UAEG,EAAA,EAAI,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAAA,UAC1B,IAAA,EAAK,QAAA;AAAA,UACL,eAAA,EAAe,QAAA;AAAA,UACf,eAAA,EAAe,IAAI,QAAA,KAAa,IAAA;AAAA,UAChC,YAAA,EAAc,MAAM,OAAA,CAAQ,SAAS,CAAA;AAAA,UAErC,QAAA,kBAAAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACG,IAAA,EAAK,QAAA;AAAA,cACL,QAAA,EAAU,IAAI,QAAA,KAAa,IAAA;AAAA,cAC3B,OAAA,EAAS,MAAM,QAAA,CAAS,GAAG,CAAA;AAAA,cAC3B,SAAA;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA;AACL,SAAA;AAAA,QAdK,GAAA,CAAI;AAAA,OAeb;AAAA,IAER,CAAC;AAAA,GAAA,EACL,CAAA;AAER;AAEA,SAAS,UAAA,CAAW;AAAA,EAChB,KAAA;AAAA,EACA,IAAA;AAAA,EACA,aAAA;AAAA,EACA;AACJ,CAAA,EAKG;AACC,EAAA,MAAM,SAAA,GACF,sIAAA;AAEJ,EAAA,IAAI,kBAAkB,MAAA,EAAW;AAC7B,IAAA,uBACIO,IAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACG,IAAA;AAAA,QACA,QAAA,EAAQ,IAAA;AAAA,QACR,SAAA;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAP,GAAAA,CAACuC,OAAA,EAAK,CAAA;AAAA,0BACNvC,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,KACjB;AAAA,EAER;AAEA,EAAA,uBACIO,IAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACG,IAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA,EAAS,YAAA;AAAA,MAET,QAAA,EAAA;AAAA,wBAAAP,GAAAA,CAACuC,OAAA,EAAK,CAAA;AAAA,wBACNvC,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,GACjB;AAER;AAEA,SAAS,kBAAA,CAAmB;AAAA,EACxB,MAAA;AAAA,EACA;AACJ,CAAA,EAGG;AACC,EAAA,MAAMwC,SAAAA,GAAW,MAAA,CAAO,QAAA,IAAY,cAAA,CAAe,aAAa,CAAA;AAChE,EAAA,MAAM,KAAA,GACF,MAAA,CAAO,GAAA,KAAQ,MAAA,IAAa,MAAA,CAAO,MAAA,KAAW,MAAA,GACxC,EAAE,eAAA,EAAiB,MAAA,CAAO,MAAA,EAAQ,KAAA,EAAO,QAAO,GAChD,MAAA;AAEV,EAAA,IAAI,MAAA,CAAO,QAAQ,MAAA,EAAW;AAC1B,IAAA,uBACIxC,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,KAAK,MAAA,CAAO,GAAA;AAAA,QACZ,GAAA,EAAI,EAAA;AAAA,QACJ,SAAA,EAAU,uDAAA;AAAA,QACV,OAAA,EAAQ;AAAA;AAAA,KACZ;AAAA,EAER;AAEA,EAAA,uBACIA,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACG,KAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACP,sGAAA;AAAA,QACA,MAAA,CAAO,WAAW,MAAA,IAAa;AAAA,OACnC;AAAA,MAEC,QAAA,EAAAwC;AAAA;AAAA,GACL;AAER;AAEA,SAAS,eAAe,KAAA,EAAuB;AAC3C,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA;AACtC,EAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACnB,IAAA,OAAA,CAAA,CAAS,KAAA,CAAM,CAAC,CAAA,GAAI,CAAC,CAAA,IAAK,EAAA,KAAO,KAAA,CAAM,CAAC,CAAA,GAAI,CAAC,CAAA,IAAK,EAAA,CAAA,EAAK,WAAA,EAAY;AAAA,EACvE;AACA,EAAA,OAAA,CAAQ,MAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,IAAK,KAAK,WAAA,EAAY;AAClD;AAEA,SAAS,gBACL,KAAA,EACe;AACf,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAChC,EAAA,MAAM,KAAA,GAAQ,MAAM,CAAC,CAAA;AACrB,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,SAAA,IAAa,KAAA,EAAO;AAC3C,IAAA,OAAO,KAAA;AAAA,EACX;AACA,EAAA,OAAO,CAAC,EAAE,KAAA,EAAO,EAAA,EAAI,OAAA,EAAS,OAA2B,CAAA;AAC7D;AAEA,SAAS,YAAA,CACL,QACA7B,MAAAA,EACe;AACf,EAAA,MAAM,CAAA,GAAIA,MAAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AACnC,EAAA,IAAI,CAAA,KAAM,IAAI,OAAO,MAAA;AAErB,EAAA,OAAO,MAAA,CACF,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,IACb,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,OAAA,EAAS,MAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,KAAQ,YAAA,CAAa,GAAA,EAAK,CAAC,CAAC;AAAA,GAC/D,CAAE,EACD,MAAA,CAAO,CAAC,UAAU,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAC,CAAA;AACnD;AAEA,SAAS,YAAA,CAAa,QAAwB,CAAA,EAAoB;AAC9D,EAAA,MAAM,QAAA,GAAW;AAAA,IACb,MAAA,CAAO,KAAA;AAAA,IACP,OAAO,SAAA,IAAa,EAAA;AAAA,IACpB,GAAI,MAAA,CAAO,QAAA,IAAY;AAAC,GAC5B,CACK,IAAA,CAAK,GAAG,CAAA,CACR,WAAA,EAAY;AAEjB,EAAA,OAAO,QAAA,CAAS,SAAS,CAAC,CAAA;AAC9B;AAEA,SAAS,gBAAA,CACL,OAAA,EACA,OAAA,EACA,SAAA,EACM;AACN,EAAA,MAAM,QAAQ,OAAA,CAAQ,MAAA;AACtB,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,EAAA;AAExB,EAAA,IAAI,CAAA,GAAI,OAAA;AACR,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,KAAA,EAAO,IAAA,EAAA,EAAQ;AACrC,IAAA,CAAA,GAAA,CAAK,CAAA,GAAI,YAAY,KAAA,IAAS,KAAA;AAC9B,IAAA,MAAM,GAAA,GAAM,QAAQ,CAAC,CAAA;AACrB,IAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,GAAA,CAAI,QAAA,KAAa,IAAA,EAAM;AAC5C,MAAA,OAAO,CAAA;AAAA,IACX;AAAA,EACJ;AACA,EAAA,OAAO,EAAA;AACX;AAEA,SAAS,OAAA,CAAQ,EAAE,IAAA,EAAK,EAAsB;AAC1C,EAAA,uBACIX,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACf,aAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAW,EAAA;AAAA,QACP,kEAAA;AAAA,QACA,IAAA,IAAQ;AAAA,OACZ;AAAA,MAEA,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0BAAA,EAA2B;AAAA;AAAA,GACvC;AAER;AAEA,SAASgB,MAAAA,GAAQ;AACb,EAAA,uBACIhB,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACf,SAAA,EAAU,sBAAA;AAAA,MACV,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,uBAAA,EAAwB;AAAA;AAAA,GACpC;AAER;AAEA,SAASuC,KAAAA,GAAO;AACZ,EAAA,uBACIvC,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACf,SAAA,EAAU,UAAA;AAAA,MACV,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,cAAA,EAAe;AAAA;AAAA,GAC3B;AAER;AAEA,SAAS,UAAA,GAAa;AAClB,EAAA,uBACIO,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACf,SAAA,EAAU,sFAAA;AAAA,MACV,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAP,IAAC,QAAA,EAAA,EAAO,EAAA,EAAG,KAAI,EAAA,EAAG,GAAA,EAAI,GAAE,MAAA,EAAO,CAAA;AAAA,wBAC/BA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,oBAAA,EAAqB;AAAA;AAAA;AAAA,GACjC;AAER;ACjwBO,SAAS,SAAA,CAAU;AAAA,EACtB,SAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACP,CAAA,EAA8B;AAC1B,EAAA,uBACIA,GAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACG,SAAA,EAAW,EAAA;AAAA,QACP,4HAAA;AAAA,QACA;AAAA,OACJ;AAAA,MACC,GAAG,IAAA;AAAA,MAEH;AAAA;AAAA,GACL;AAER;AAaO,SAAS,aAAA,CAAc;AAAA,EAC1B,KAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA;AACJ,CAAA,EAAuB;AACnB,EAAA,uBACIO,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACG,SAAA,EAAW,EAAA;AAAA,QACP,qGAAA;AAAA,QACA;AAAA,OACJ;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACX,QAAA,EAAA;AAAA,0BAAAP,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,wDAAA,EACT,QAAA,EAAA,KAAA,EACL,CAAA;AAAA,UACC,8BACGA,GAAAA,CAAC,OAAE,SAAA,EAAU,+BAAA,EACR,uBACL,CAAA,GACA;AAAA,SAAA,EACR,CAAA;AAAA,QACC,0BACGA,GAAAA,CAAC,SAAI,SAAA,EAAU,kCAAA,EACV,mBACL,CAAA,GACA;AAAA;AAAA;AAAA,GACR;AAER;AAKO,SAAS,SAAA,CAAU;AAAA,EACtB,SAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACP,CAAA,EAA0B;AACtB,EAAA,uBACIA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,aAAa,SAAS,CAAA,EAAI,GAAG,IAAA,EAC3C,QAAA,EACL,CAAA;AAER;ACjEO,SAAS,UAAA,CAAW;AAAA,EACvB,IAAA,EAAM,IAAA;AAAA,EACN,KAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA;AACJ,CAAA,EAAoB;AAChB,EAAA,uBACIO,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,SAAA,EAAW,EAAA;AAAA,QACP,wEAAA;AAAA,QACA;AAAA,OACJ;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,IAAA,mBACGP,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0FAAA,EACX,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,WAAA,EAAa,GAAA,EAAK,GAChD,CAAA,GACA,IAAA;AAAA,wBACJO,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACX,QAAA,EAAA;AAAA,0BAAAP,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yCAAA,EACT,QAAA,EAAA,KAAA,EACL,CAAA;AAAA,UACC,8BACGA,GAAAA,CAAC,OAAE,SAAA,EAAU,wCAAA,EACR,uBACL,CAAA,GACA;AAAA,SAAA,EACR,CAAA;AAAA,QACC,yBAASA,GAAAA,CAAC,SAAI,SAAA,EAAU,MAAA,EAAQ,kBAAO,CAAA,GAAS;AAAA;AAAA;AAAA,GACrD;AAER;AChDe,SAAR,OAAA,CAAyB;AAAA,EAC5B,KAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA,GAAU;AACd,CAAA,EAIG;AACC,EAAA,uBACIO,IAAAA,CAAC,QAAA,EAAA,EAAO,WAAW,OAAA,KAAY,OAAA,GAAU,KAAK,kBAAA,EAC1C,QAAA,EAAA;AAAA,oBAAAP,GAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACG,SAAA,EACI,OAAA,KAAY,OAAA,GACN,8BAAA,GACA,sCAAA;AAAA,QAGT,QAAA,EAAA;AAAA;AAAA,KACL;AAAA,IACC,+BACGA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAiC,QAAA,EAAA,WAAA,EAAY;AAAA,GAAA,EAElE,CAAA;AAER;ACVO,SAAS,QAAA,CAAS;AAAA,EACrB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP;AACJ,CAAA,EAAkB;AACd,EAAA,uBACIO,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,SAAA,EAAW,EAAA;AAAA,QACP,+FAAA;AAAA,QACA;AAAA,OACJ;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAP,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,oCAAA,EAAsC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,wBAC1DA,GAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACG,SAAA,EAAW,EAAA;AAAA,cACP,mCAAA;AAAA,cACA,IAAA,IAAQ;AAAA,aACZ;AAAA,YAEC;AAAA;AAAA;AACL;AAAA;AAAA,GACJ;AAER;AAEO,SAAS,YAAA,CAAa;AAAA,EACzB,QAAA;AAAA,EACA;AACJ,CAAA,EAGG;AACC,EAAA,uBAAOA,IAAC,IAAA,EAAA,EAAG,SAAA,EAAW,GAAG,MAAA,EAAQ,SAAS,GAAI,QAAA,EAAS,CAAA;AAC3D;AClBO,SAAS,UAAA,CAAW;AAAA,EACvB,KAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA,GAAO,KAAA;AAAA,EACP;AACJ,CAAA,EAAU;AACN,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,mBAAA,EAAoB;AAClC,EAAA,MAAM,YAAY,YAAA,EAAa;AAC/B,EAAA,uBACIO,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACG,SAAA,EAAW,EAAA;AAAA,QACP,iEAAA;AAAA,QACA;AAAA,OACJ;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACV,QAAA,EAAA;AAAA,UAAA,OAAA,KAAY,yBACTP,GAAAA,CAAC,OAAE,SAAA,EAAU,uFAAA,EACR,mBACL,CAAA,GACA,IAAA;AAAA,0BACJO,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACX,QAAA,EAAA;AAAA,4BAAAP,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qEAAA,EACT,QAAA,EAAA,KAAA,EACL,CAAA;AAAA,YACC,IAAA,IAAQ,SAAA,KAAc,IAAA,mBACnBA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACG,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,MAAM,SAAA,CAAU,UAAA,EAAW;AAAA,gBACpC,YAAA,EAAY,EAAE,oBAAoB,CAAA;AAAA,gBAClC,eAAA,EAAc,UAAA;AAAA,gBACd,SAAA,EAAU,4LAAA;AAAA,gBAGV,QAAA,kBAAAA,GAAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACG,aAAA,EAAY,MAAA;AAAA,oBACZ,SAAA,EAAU,uLAAA;AAAA,oBACb,QAAA,EAAA;AAAA;AAAA;AAED;AAAA,aACJ,GACA;AAAA,WAAA,EACR,CAAA;AAAA,UACC,8BACGA,GAAAA,CAAC,OAAE,SAAA,EAAU,+BAAA,EACR,uBACL,CAAA,GACA;AAAA,SAAA,EACR,CAAA;AAAA,QACC,0BACGA,GAAAA,CAAC,SAAI,SAAA,EAAU,4CAAA,EACV,mBACL,CAAA,GACA;AAAA;AAAA;AAAA,GACR;AAER;AC9DA,IAAM,UAAA,GAAwC;AAAA,EAC1C,WAAA,EAAa,uCAAA;AAAA,EACb,IAAA,EAAM,uCAAA;AAAA,EACN,IAAA,EAAM,wCAAA;AAAA,EACN,KAAA,EAAO;AACX,CAAA;AAqBO,SAAS,SAAA,CAAU;AAAA,EACtB,QAAA;AAAA,EACA,KAAA,GAAQ,aAAA;AAAA,EACR;AACJ,CAAA,EAAU;AACN,EAAA,uBACIA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,SAAA,EAAW,EAAA;AAAA,QACP,0BAAA;AAAA,QACA,WAAW,KAAK,CAAA;AAAA,QAChB;AAAA,OACJ;AAAA,MAEC;AAAA;AAAA,GACL;AAER;ACuBA,IAAM,cAKD,CAAC,EAAE,IAAA,EAAM,SAAA,EAAW,UAAU,cAAA,EAAgB,WAAA,EAAY,qBAC3DA,IAAC,GAAA,EAAA,EAAE,IAAA,EAAY,SAAA,EAAsB,cAAA,EAAc,aAC9C,QAAA,EACL,CAAA;AAGG,SAAS,QAAA,CAAS;AAAA,EACrB,KAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA,GAAgB,WAAA;AAAA,EAChB,OAAA;AAAA,EACA;AACJ,CAAA,EAAkB;AACd,EAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,KAAA,EAAO,WAAW,CAAA;AAEvD,EAAA,uBACIO,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,gBAAA,EAAe,WAAA;AAAA,MACf,SAAA,EAAW,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAKP,yCAAA;AAAA,QACA;AAAA,OACJ;AAAA,MAOA,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EACX,QAAA,EAAA;AAAA,0BAAAP,GAAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACG,KAAA;AAAA,cACA,UAAA;AAAA,cACA;AAAA;AAAA,WACJ;AAAA,0BACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CACV,QAAA,EAAA,OAAA,EACL;AAAA,SAAA,EACJ,CAAA;AAAA,wBAGAO,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACX,QAAA,EAAA;AAAA,0BAAAP,GAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACG,KAAA;AAAA,cACA,UAAA;AAAA,cACA;AAAA;AAAA,WACJ;AAAA,UACC,OAAA,KAAY,yBACTA,GAAAA,CAAC,SAAI,SAAA,EAAU,mCAAA,EACV,mBACL,CAAA,GACA;AAAA,SAAA,EACR;AAAA;AAAA;AAAA,GACJ;AAER;AAQA,SAAS,YAAA,CAAa,EAAE,KAAA,EAAO,UAAA,EAAY,eAAc,EAAe;AACpE,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,mBAAA,EAAoB;AAClC,EAAA,uBACIA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MAMG,SAAA,EAAU,kFAAA;AAAA,MACV,IAAA,EAAK,SAAA;AAAA,MACL,YAAA,EAAY,EAAE,oBAAoB,CAAA;AAAA,MAEjC,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACjB,QAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,QAAA,MAAM,MAAA,GAAS,KAAK,IAAA,KAAS,UAAA;AAE7B,QAAA,uBACIO,IAAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YAEG,MAAM,IAAA,CAAK,IAAA;AAAA,YACX,QAAA,EAAQ,IAAA;AAAA,YACR,cAAA,EAAc,SAAS,MAAA,GAAS,MAAA;AAAA,YAChC,SAAA,EAAW,EAAA;AAAA,cACP,yGAAA;AAAA,cACA,SACM,mFAAA,GACA;AAAA,aACV;AAAA,YAEC,QAAA,EAAA;AAAA,cAAA,IAAA,KAAS,yBACNP,GAAAA;AAAA,gBAAC,IAAA;AAAA,gBAAA;AAAA,kBACG,SAAA,EAAW,EAAA;AAAA,oBACP,sBAAA;AAAA,oBACA,SACM,iBAAA,GACA;AAAA,mBACV;AAAA,kBACA,WAAA,EAAa;AAAA;AAAA,eACjB,GACA,IAAA;AAAA,8BACJA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM,CAAA;AAAA,8BAClBA,GAAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAY,MAAA,EAAgB;AAAA;AAAA,WAAA;AAAA,UAvBrC,IAAA,CAAK;AAAA,SAwBd;AAAA,MAER,CAAC;AAAA;AAAA,GACL;AAER;AAEA,SAAS,cAAA,CAAe,EAAE,KAAA,EAAO,UAAA,EAAY,eAAc,EAAe;AACtE,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,mBAAA,EAAoB;AAClC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIG,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,GAAA,GAAMC,OAA8B,IAAI,CAAA;AAC9C,EAAA,MAAM,SAASU,KAAAA,EAAM;AAErB,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS,KAAK,IAAA,KAAS,UAAU,CAAA,IAAK,KAAA,CAAM,CAAC,CAAA;AAKxE,EAAAR,UAAU,MAAM;AACZ,IAAA,IAAI,CAAE,IAAA,EAAM;AAEZ,IAAA,SAAS,cAAc,KAAA,EAA2B;AAC9C,MAAA,IACI,GAAA,CAAI,YAAY,IAAA,IAChB,CAAE,IAAI,OAAA,CAAQ,QAAA,CAAS,KAAA,CAAM,MAAc,CAAA,EAC7C;AACE,QAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,MACjB;AAAA,IACJ;AAEA,IAAA,SAAS,MAAM,KAAA,EAA4B;AACvC,MAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,QAAA,EAAU,OAAA,CAAQ,KAAK,CAAA;AAAA,IAC7C;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,eAAe,aAAa,CAAA;AACpD,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAExC,IAAA,OAAO,MAAM;AACT,MAAA,MAAA,CAAO,mBAAA,CAAoB,eAAe,aAAa,CAAA;AACvD,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAAA,IAC/C,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,IAAI,WAAW,MAAA,EAAW;AACtB,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,MAAM,aAAa,MAAA,CAAO,IAAA;AAE1B,EAAA,uBACIC,IAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,WAAU,UAAA,EACrB,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACG,IAAA,EAAK,QAAA;AAAA,QACL,SAAS,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAE,CAAC,CAAA;AAAA,QACjC,eAAA,EAAe,IAAA;AAAA,QACf,eAAA,EAAc,SAAA;AAAA,QACd,eAAA,EAAe,MAAA;AAAA,QACf,SAAA,EAAW,EAAA;AAAA,UACP,qMAAA;AAAA,UACA,IAAA,IAAQ;AAAA,SACZ;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iCAAA,EACX,QAAA,EAAA;AAAA,YAAA,UAAA,KAAe,yBACZP,GAAAA;AAAA,cAAC,UAAA;AAAA,cAAA;AAAA,gBACG,SAAA,EAAU,4CAAA;AAAA,gBACV,WAAA,EAAa;AAAA;AAAA,aACjB,GACA,IAAA;AAAA,4BACJA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,iBAAO,KAAA,EAAM,CAAA;AAAA,4BACzCA,GAAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAM,MAAA,EAAQ,QAAM,IAAA,EAAC;AAAA,WAAA,EACvC,CAAA;AAAA,0BACAA,GAAAA,CAACyC,QAAAA,EAAA,EAAQ,IAAA,EAAY;AAAA;AAAA;AAAA,KACzB;AAAA,IAEC,uBACGzC,GAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACG,EAAA,EAAI,MAAA;AAAA,QACJ,IAAA,EAAK,SAAA;AAAA,QACL,YAAA,EAAY,EAAE,oBAAoB,CAAA;AAAA,QAClC,SAAA,EAAU,iHAAA;AAAA,QAET,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACjB,UAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,UAAA,MAAM,QAAA,GAAW,KAAK,IAAA,KAAS,UAAA;AAE/B,UAAA,uBACIA,GAAAA,CAAC,IAAA,EAAA,EACG,QAAA,kBAAAO,IAAAA;AAAA,YAAC,aAAA;AAAA,YAAA;AAAA,cACG,MAAM,IAAA,CAAK,IAAA;AAAA,cACX,QAAA,EAAQ,IAAA;AAAA,cACR,cAAA,EAAc,WAAW,MAAA,GAAS,MAAA;AAAA,cAClC,SAAA,EAAW,EAAA;AAAA,gBACP,0EAAA;AAAA,gBACA,WACM,8CAAA,GACA;AAAA,eACV;AAAA,cAEC,QAAA,EAAA;AAAA,gBAAA,IAAA,KAAS,yBACNP,GAAAA;AAAA,kBAAC,IAAA;AAAA,kBAAA;AAAA,oBACG,SAAA,EAAW,EAAA;AAAA,sBACP,sBAAA;AAAA,sBACA,WACM,iBAAA,GACA;AAAA,qBACV;AAAA,oBACA,WAAA,EAAa;AAAA;AAAA,iBACjB,GACA,IAAA;AAAA,gCACJA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EACX,eAAK,KAAA,EACV,CAAA;AAAA,gCACAA,GAAAA;AAAA,kBAAC,YAAA;AAAA,kBAAA;AAAA,oBACG,IAAA;AAAA,oBACA,MAAA,EAAQ;AAAA;AAAA;AACZ;AAAA;AAAA,WACJ,EAAA,EA9BK,KAAK,IA+Bd,CAAA;AAAA,QAER,CAAC;AAAA;AAAA,KACL,GACA;AAAA,GAAA,EACR,CAAA;AAER;AAEA,SAAS,YAAA,CAAa;AAAA,EAClB,IAAA;AAAA,EACA;AACJ,CAAA,EAGc;AACV,EAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAW;AAC1B,IAAA,uBAAOA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAiB,eAAK,KAAA,EAAM,CAAA;AAAA,EACvD;AAEA,EAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAW;AAC1B,IAAA,uBACIA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACG,SAAA,EAAW,EAAA;AAAA,UACP,4FAAA;AAAA,UACA,SACM,mDAAA,GACA;AAAA,SACV;AAAA,QAEC,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA,KACV;AAAA,EAER;AAEA,EAAA,OAAO,IAAA;AACX;AAEA,SAASyC,QAAAA,CAAQ,EAAE,IAAA,EAAK,EAAiC;AACrD,EAAA,uBACIzC,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACf,SAAA,EAAW,EAAA;AAAA,QACP,kEAAA;AAAA,QACA,IAAA,IAAQ;AAAA,OACZ;AAAA,MACA,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0BAAA,EAA2B;AAAA;AAAA,GACvC;AAER;AAUA,SAAS,SAAS,IAAA,EAAsB;AACpC,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AACnC,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAClC,EAAA,IAAI,MAAM,IAAA,CAAK,MAAA;AACf,EAAA,IAAI,eAAe,EAAA,EAAI,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,KAAK,UAAU,CAAA;AACrD,EAAA,IAAI,cAAc,EAAA,EAAI,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,KAAK,SAAS,CAAA;AAEnD,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAC5B;AAWA,SAAS,iBAAA,CACL,OACA,WAAA,EACa;AACb,EAAA,MAAM,OAAA,GAAU,SAAS,WAAW,CAAA;AAEpC,EAAA,MAAM,UAAA,GAAa,KAAA,CACd,GAAA,CAAI,CAAC,IAAA,KAAS;AACX,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AACnC,IAAA,MAAM,OAAA,GACF,IAAA,CAAK,WAAA,KAAgB,IAAA,GACf,OAAA,KAAY,QAAA,IACZ,OAAA,CAAQ,UAAA,CAAW,QAAA,GAAW,GAAG,CAAA,GACjC,OAAA,KAAY,QAAA;AAEtB,IAAA,OAAO,OAAA,GAAU,KAAK,IAAA,GAAO,IAAA;AAAA,EACjC,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,IAAA,KAAyB,SAAS,IAAI,CAAA;AAEnD,EAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEpC,EAAA,OAAO,UAAA,CAAW,MAAA;AAAA,IAAO,CAAC,OAAA,EAAS,IAAA,KAC/B,KAAK,MAAA,GAAS,OAAA,CAAQ,SAAS,IAAA,GAAO;AAAA,GAC1C;AACJ;ACxXA,IAAM0C,YAAAA,GAID,CAAC,EAAE,IAAA,EAAM,SAAA,EAAW,QAAA,EAAS,qBAC9B1C,GAAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAY,SAAA,EACV,QAAA,EACL,CAAA;AAGG,SAAS,OAAA,CAAQ;AAAA,EACpB,IAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA,GAAgB0C,YAAAA;AAAA,EAChB,MAAA,GAAS,KAAA;AAAA,EACT;AACJ,CAAA,EAAiB;AACb,EAAA,uBACI1C,GAAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACG,IAAA;AAAA,MACA,QAAA,EAAQ,IAAA;AAAA,MAIR,SAAA,EAAW,EAAA;AAAA,QACP,6HAAA;AAAA,QACA,SACM,wCAAA,GACA,uBAAA;AAAA,QACN;AAAA,OACJ;AAAA,MAEA,QAAA,kBAAAO,IAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACG,gBAAA,EAAe,UAAA;AAAA,UACf,aAAA,EAAa,SAAS,MAAA,GAAS,MAAA;AAAA,UAM/B,cAAA,EAAgB,CAAC,KAAA,KAAU;AACvB,YAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,YAAA,IACI,MAAA,CAAO,OAAA;AAAA,cACH;AAAA,kBACE,IAAA,IACN,MAAA,CAAO,OAAA,CAAQ,iBAAiB,MAAM,IAAA,EACxC;AACE,cAAA,KAAA,CAAM,eAAA,EAAgB;AAAA,YAC1B;AAAA,UACJ,CAAA;AAAA,UACA,SAAA,EAAU,gCAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAP,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACG,eAAA,EAAa,IAAA;AAAA,gBACb,SAAA,EAAU,wCAAA;AAAA,gBAET;AAAA;AAAA,aACL;AAAA,YACC,QAAA,KAAa,yBACVA,GAAAA,CAAC,UAAK,SAAA,EAAU,kCAAA,EACX,oBACL,CAAA,GACA;AAAA;AAAA;AAAA;AACR;AAAA,GACJ;AAER;ACzHA,IAAM,UAAA,GAAuD;AAAA,EACzD,IAAA,EAAM,EAAE,EAAA,EAAI,cAAA,EAAgB,IAAI,WAAA,EAAY;AAAA,EAC5C,OAAA,EAAS,EAAE,EAAA,EAAI,iBAAA,EAAmB,IAAI,cAAA,EAAe;AAAA,EACrD,OAAA,EAAS,EAAE,EAAA,EAAI,iBAAA,EAAmB,IAAI,cAAA,EAAe;AAAA,EACrD,WAAA,EAAa,EAAE,EAAA,EAAI,qBAAA,EAAuB,IAAI,kBAAA,EAAmB;AAAA,EACjE,OAAA,EAAS,EAAE,EAAA,EAAI,cAAA,EAAgB,IAAI,iBAAA;AACvC,CAAA;AAgBO,SAAS,QAAA,CAAS;AAAA,EACrB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA,EAAM,IAAA;AAAA,EACN,IAAA,GAAO,MAAA;AAAA,EACP;AACJ,CAAA,EAAkB;AACd,EAAA,MAAM,MAAA,GAAS,WAAW,IAAI,CAAA;AAE9B,EAAA,uBACIO,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,SAAA,EAAW,EAAA;AAAA,QACP,sJAAA;AAAA,QACA;AAAA,OACJ;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAP,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACG,SAAA,EAAW,EAAA;AAAA,cACP,gEAAA;AAAA,cACA,MAAA,CAAO;AAAA,aACX;AAAA,YAEA,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAW,EAAA,CAAG,WAAW,MAAA,CAAO,EAAE,CAAA,EAAG,WAAA,EAAa,GAAA,EAAK;AAAA;AAAA,SACjE;AAAA,wBACAO,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACX,QAAA,EAAA;AAAA,0BAAAP,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4EAAA,EACR,QAAA,EAAA,KAAA,EACL,CAAA;AAAA,0BACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0CACR,QAAA,EAAA,KAAA,EACL,CAAA;AAAA,UACC,yBACGA,GAAAA,CAAC,OAAE,SAAA,EAAU,yDAAA,EACR,kBACL,CAAA,GACA;AAAA,SAAA,EACR;AAAA;AAAA;AAAA,GACJ;AAER;AC1DA,IAAM2C,WAAAA,GAAmC;AAAA,EACrC,OAAA,EAAS,sDAAA;AAAA,EACT,IAAA,EAAM,uCAAA;AAAA,EACN,OAAA,EAAS,gDAAA;AAAA,EACT,OAAA,EAAS,gDAAA;AAAA,EACT,WAAA,EAAa,4DAAA;AAAA,EACb,KAAA,EAAO;AACX,CAAA;AAEA,IAAM,SAAA,GAAkC;AAAA,EACpC,OAAA,EAAS,qBAAA;AAAA,EACT,IAAA,EAAM,SAAA;AAAA,EACN,OAAA,EAAS,YAAA;AAAA,EACT,OAAA,EAAS,YAAA;AAAA,EACT,WAAA,EAAa,gBAAA;AAAA,EACb,KAAA,EAAO;AACX,CAAA;AAeO,SAAS,UAAA,CAAW;AAAA,EACvB,QAAA;AAAA,EACA,IAAA,GAAO,SAAA;AAAA,EACP,SAAA;AAAA,EACA,GAAA,GAAM;AACV,CAAA,EAAoB;AAChB,EAAA,uBACIpC,IAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACG,SAAA,EAAW,EAAA;AAAA,QACP,uGAAA;AAAA,QACAoC,YAAW,IAAI,CAAA;AAAA,QACf;AAAA,OACJ;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,GAAA,mBACG3C,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACG,SAAA,EAAW,EAAA,CAAG,0BAAA,EAA4B,SAAA,CAAU,IAAI,CAAC;AAAA;AAAA,SAC7D,GACA,IAAA;AAAA,QACH;AAAA;AAAA;AAAA,GACL;AAER;AClBO,SAAS,YAAA,CAAa;AAAA,EACzB,IAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA,GAAO,MAAA;AAAA,EACP;AACJ,CAAA,EAAU;AACN,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,mBAAA,EAAoB;AAClC,EAAA,MAAM,SAAA,GAAYI,OAA8B,IAAI,CAAA;AACpD,EAAA,MAAM,gBAAA,GAAmBA,OAA2B,IAAI,CAAA;AAIxD,EAAAE,UAAU,MAAM;AACZ,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,QAAA;AACrC,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,UAAA,GAAa,QAAA,CAAS,eAAA,CAAgB,WAAA;AAC5D,IAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,QAAA;AAC/B,IAAA,IAAI,SAAS,CAAA,EAAG;AACZ,MAAA,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,CAAA,EAAG,MAAM,CAAA,EAAA,CAAA;AAAA,IAChD;AACA,IAAA,OAAO,MAAM;AACT,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,QAAA;AAC/B,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,YAAA,GAAe,EAAA;AAAA,IACvC,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAGT,EAAAA,UAAU,MAAM;AACZ,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,gBAAA,CAAiB,UAAU,QAAA,CAAS,aAAA;AAEpC,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAChC,MAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACpB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,OAAA,EAAQ;AACR,QAAA;AAAA,MACJ;AACA,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,KAAA,IAAS,SAAA,CAAU,YAAY,IAAA,EAAM;AAC/C,QAAA,MAAM,SAAA,GAAY,UAAU,OAAA,CAAQ,gBAAA;AAAA,UAChC;AAAA,SACJ;AACA,QAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC5B,QAAA,MAAM,KAAA,GAAQ,UAAU,CAAC,CAAA;AACzB,QAAA,MAAM,IAAA,GAAO,SAAA,CAAU,SAAA,CAAU,MAAA,GAAS,CAAC,CAAA;AAC3C,QAAA,IAAI,KAAA,KAAU,MAAA,IAAa,IAAA,KAAS,MAAA,EAAW;AAC/C,QAAA,IAAI,CAAA,CAAE,QAAA,IAAY,QAAA,CAAS,aAAA,KAAkB,KAAA,EAAO;AAChD,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,IAAA,CAAK,KAAA,EAAM;AAAA,QACf,WAAW,CAAC,CAAA,CAAE,QAAA,IAAY,QAAA,CAAS,kBAAkB,IAAA,EAAM;AACvD,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,KAAA,CAAM,KAAA,EAAM;AAAA,QAChB;AAAA,MACJ;AAAA,IACJ,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAI1C,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,UAAA,CAAW,MAAM;AAC/B,MAAA,MAAM,SAAA,GAAY,UAAU,OAAA,EAAS,aAAA;AAAA,QACjC;AAAA,OACJ;AACA,MAAA,SAAA,EAAW,KAAA,EAAM;AAAA,IACrB,GAAG,EAAE,CAAA;AAEL,IAAA,OAAO,MAAM;AACT,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAC7C,MAAA,MAAA,CAAO,aAAa,EAAE,CAAA;AACtB,MAAA,gBAAA,CAAiB,SAAS,KAAA,IAAQ;AAAA,IACtC,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,IAAA,EAAM,OAAO,CAAC,CAAA;AAElB,EAAA,MAAM,UAAA,GAAaO,WAAAA;AAAA,IACf,CAAC,CAAA,KAAwB;AACrB,MAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,aAAA,EAAe,OAAA,EAAQ;AAAA,IAC9C,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACZ;AAEA,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,uBACIb,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,IAAA,EAAK,cAAA;AAAA,MACL,WAAA,EAAa,UAAA;AAAA,MACb,SAAA,EAAW,EAAA;AAAA,QACP,yDAAA;AAAA,QACA,IAAA,KAAS,cACH,sCAAA,GACA,2CAAA;AAAA,QACN;AAAA,OACJ;AAAA,MAEA,QAAA,kBAAAO,IAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACG,GAAA,EAAK,SAAA;AAAA,UACL,IAAA,EAAK,QAAA;AAAA,UACL,YAAA,EAAW,MAAA;AAAA,UACX,YAAA,EAAY,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,MAAA;AAAA,UAChD,SAAA,EAAW,EAAA;AAAA,YACP,0HAAA;AAAA,YACA,2DAAA;AAAA,YACA,IAAA,KAAS,cACH,eAAA,GACA;AAAA,WACV;AAAA,UAEA,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,uGAAA,EACd,QAAA,EAAA;AAAA,8BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACV,QAAA,EAAA;AAAA,gBAAA,OAAA,KAAY,yBACTP,GAAAA,CAAC,OAAE,SAAA,EAAU,uFAAA,EACR,mBACL,CAAA,GACA,IAAA;AAAA,gCACJA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,0DACT,QAAA,EAAA,KAAA,EACL;AAAA,eAAA,EACJ,CAAA;AAAA,cACC,aAAA,KAAkB,yBACfA,GAAAA,CAAC,SAAI,SAAA,EAAU,kCAAA,EACV,yBACL,CAAA,GACA,IAAA;AAAA,8BACJA,GAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACG,IAAA,EAAK,QAAA;AAAA,kBACL,OAAA,EAAS,OAAA;AAAA,kBACT,SAAA,EAAU,2JAAA;AAAA,kBACV,YAAA,EAAY,EAAE,OAAO,CAAA;AAAA,kBAErB,0BAAAA,GAAAA,CAAC8B,CAAAA,EAAA,EAAE,SAAA,EAAU,SAAA,EAAU,aAAa,GAAA,EAAK;AAAA;AAAA;AAC7C,aAAA,EACJ,CAAA;AAAA,4BAEA9B,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAA0B,QAAA,EAAS,CAAA;AAAA,YAEjD,MAAA,KAAW,yBACRA,GAAAA,CAAC,YAAO,SAAA,EAAU,sJAAA,EACb,kBACL,CAAA,GACA;AAAA;AAAA;AAAA;AACR;AAAA,GACJ;AAER;AChKA,IAAM4C,MAAAA,GAGF;AAAA,EACA,IAAA,EAAM,MAAA;AAAA,EACN,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU;AACd,CAAA;AAeO,SAAS,YAAA,CAAa,EAAE,IAAA,EAAM,OAAA,EAAQ,EAAU;AACnD,EAAA,MAAM,EAAE,CAAA,EAAG,UAAA,EAAW,GAAI,mBAAA,EAAoB;AAC9C,EAAA,MAAM,YAAY,YAAA,EAAa;AAC/B,EAAA,MAAM,SAAS,iBAAA,EAAkB;AACjC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIzC,SAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAA2B,KAAK,CAAA;AAE5D,EAAA,MAAM,MAAA,GAAS,MAAA,EAAQ,IAAA,CAAK,EAAA,IAAM,IAAA;AAClC,EAAA,MAAM,OAAA,GAAU,SAAA,CAAU,IAAA,CAAK,aAAA,IAAiB,IAAA;AAEhD,EAAAG,UAAU,MAAM;AACZ,IAAA,IAAI,CAAC,IAAA,IAAQ,MAAA,KAAW,IAAA,IAAQ,YAAY,IAAA,EAAM;AAClD,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,MAAM,OAAO,YAAY;AACrB,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,IAAI;AACA,QAAA,MAAM,OAAA,GAAU,MAAM,WAAA,CAAY,SAAA,EAAW,eAAe,CAAA;AAC5D,QAAA,MAAM,WAAW,MAAM,KAAA;AAAA,UACnB,CAAA,EAAG,OAAO,CAAA,mBAAA,EAAsB,MAAM,CAAA,gBAAA,CAAA;AAAA,UACtC,EAAE,OAAA,EAAS,WAAA,EAAa,SAAA;AAAU,SACtC;AACA,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AACd,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,QAC7C;AACA,QAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,QAAA,IAAI,CAAC,SAAA,EAAW,QAAA,CAAS,IAAI,CAAA;AAAA,MACjC,SAAS,CAAA,EAAG;AACR,QAAA,IAAI,CAAC,SAAA,EAAW;AACZ,UAAA,QAAA,CAAS,aAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,CAAA,CAAE,aAAa,CAAC,CAAA;AAAA,QAC9D;AAAA,MACJ,CAAA,SAAE;AACE,QAAA,IAAI,CAAC,SAAA,EAAW,UAAA,CAAW,KAAK,CAAA;AAAA,MACpC;AAAA,IACJ,CAAA;AACA,IAAA,KAAK,IAAA,EAAK;AACV,IAAA,OAAO,MAAM;AACT,MAAA,SAAA,GAAY,IAAA;AAAA,IAChB,CAAA;AAAA,EACJ,GAAG,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,SAAS,CAAC,CAAA;AAErC,EAAA,MAAM,QAAA,GAAW,OAAO,EAAA,KAAe;AACnC,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,MAAA,KAAW,IAAA,IAAQ,YAAY,IAAA,EAAM;AAE3D,IAAA,MAAM,IAAA,GAAO,KAAA;AACb,IAAA,QAAA,CAAS;AAAA,MACL,GAAG,KAAA;AAAA,MACH,KAAA,EAAO,MAAM,KAAA,CAAM,GAAA;AAAA,QAAI,CAAC,EAAA,KACpB,EAAA,CAAG,EAAA,KAAO,KACJ,EAAE,GAAG,EAAA,EAAI,OAAA,EAAA,iBAAS,IAAI,IAAA,EAAK,EAAE,WAAA,IAAc,GAC3C;AAAA,OACV;AAAA,MACA,cAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,CAAM,eAAe,CAAC;AAAA,KACnD,CAAA;AACD,IAAA,IAAI;AACA,MAAA,MAAM,OAAA,GAAU,MAAM,WAAA,CAAY,SAAA,EAAW,eAAe,CAAA;AAC5D,MAAA,MAAM,IAAA,GAAO,UAAU,SAAA,IAAY;AACnC,MAAA,IAAI,IAAA,KAAS,KAAA,CAAA,IAAa,IAAA,KAAS,EAAA,EAAI;AACnC,QAAA,OAAA,CAAQ,cAAc,CAAA,GAAI,IAAA;AAC1B,QAAA,OAAA,CAAQ,kBAAkB,CAAA,GAAI,gBAAA;AAAA,MAClC;AACA,MAAA,MAAM,WAAW,MAAM,KAAA;AAAA,QACnB,CAAA,EAAG,OAAO,CAAA,mBAAA,EAAsB,MAAM,kBAAkB,EAAE,CAAA,KAAA,CAAA;AAAA,QAC1D;AAAA,UACI,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA;AAAA,UACA,WAAA,EAAa;AAAA;AACjB,OACJ;AACA,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AACd,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,MAC7C;AAAA,IACJ,CAAA,CAAA,MAAQ;AACJ,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACjB;AAAA,EACJ,CAAA;AAEA,EAAA,MAAM,KAAA,GAAQ,KAAA,EAAO,KAAA,IAAS,EAAC;AAC/B,EAAA,MAAM,QAAA,GACF,MAAA,KAAW,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,KAAY,IAAI,CAAA,GAAI,KAAA;AAEpE,EAAA,MAAM,MAAA,GAAS,OAAO,YAAA,IAAgB,CAAA;AAEtC,EAAA,uBACIN,GAAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACG,IAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA,EAAS,EAAE,eAAe,CAAA;AAAA,MAC1B,KAAA,EACI,MAAA,GAAS,CAAA,GAAI,CAAA,CAAE,2BAAA,EAA0B,EAAC,KAAA,EAAO,MAAA,EAAO,CAAA,GAAI,CAAA,CAAE,0BAAuB,CAAA;AAAA,MAEzF,aAAA,kBACIO,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACX,QAAA,EAAA;AAAA,wBAAAP,GAAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACG,QAAQ,MAAA,KAAW,KAAA;AAAA,YACnB,OAAA,EAAS,MAAM,SAAA,CAAU,KAAK,CAAA;AAAA,YAE7B,YAAE,KAAK;AAAA;AAAA,SAAE;AAAA,wBACdA,GAAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACG,QAAQ,MAAA,KAAW,QAAA;AAAA,YACnB,OAAA,EAAS,MAAM,SAAA,CAAU,QAAQ,CAAA;AAAA,YAEhC,YAAE,QAAQ;AAAA;AAAA;AAAE,OAAA,EACrB,CAAA;AAAA,MAEJ,MAAA,EACI,UAAU,IAAA,IAAQ,OAAA,KAAY,uBAC1BO,IAAAA,CAAAC,UAAA,EACI,QAAA,EAAA;AAAA,wBAAAR,GAAAA,CAAC,MAAA,EAAA,EACI,QAAA,EAAA,CAAA,CAAE,6BAAA,EAA+B,EAAC,KAAA,EAAO,QAAA,CAAS,MAAA,EAAQ,KAAA,EAAO,KAAA,CAAM,MAAA,EAAO,CAAA,EACnF,CAAA;AAAA,wBACAA,GAAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACG,IAAA,EAAM,GAAG,OAAO,CAAA,MAAA,CAAA;AAAA,YAChB,MAAA,EAAO,QAAA;AAAA,YACP,GAAA,EAAI,YAAA;AAAA,YACJ,SAAA,EAAU,6CAAA;AAAA,YAET,YAAE,wBAAmB;AAAA;AAAA;AAAE,OAAA,EAChC,CAAA,mBAEAA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,MAId,oBAAU,IAAA,mBACPO,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uBAAA,EACX,QAAA,EAAA;AAAA,wBAAAP,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAA,EACR,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAAE,CAAA;AAAA,wBAC9BA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCACR,QAAA,EAAA,KAAA,EACL;AAAA,OAAA,EACJ,CAAA,GACA,WAAW,KAAA,KAAU,IAAA,mBACrBA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sDAAA,EACV,QAAA,EAAA,CAAA,CAAE,eAAU,CAAA,EAAE,CAAA,GACnB,SAAS,MAAA,KAAW,CAAA,mBACpBA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACX,QAAA,kBAAAA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACG,OACI,MAAA,KAAW,QAAA,GACL,EAAE,yBAAyB,CAAA,GAC3B,EAAE,sBAAsB,CAAA;AAAA,UAElC,WAAA,EAAa,EAAE,qHAA2G;AAAA;AAAA,OAC9H,EACJ,CAAA,mBAEAA,GAAAA,CAAC,IAAA,EAAA,EAAG,WAAU,2BAAA,EACT,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,IAAA,KAAS;AACpB,QAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,IAAQ,EAAC;AAI5B,QAAA,MAAM,SAAS,IAAA,CAAK,OAAA;AACpB,QAAA,MAAM,eAAe,CAAC;AAAA,UAClB;AAAA,SACJ,KAGI,MAAA,KAAW,MAAA,IAAa,MAAA,KAAW,qBAC/BA,GAAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACG,IAAA,EAAM,MAAA;AAAA,YACN,SAAA,EAAU,+CAAA;AAAA,YAET;AAAA;AAAA,SACL,mBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAK,QAAA,EAAS,CAAA;AAGvB,QAAA,uBACIA,GAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YAEG,SAAA,EACI,IAAA,CAAK,OAAA,KAAY,IAAA,GACX,iBAAA,GACA,EAAA;AAAA,YAGV,0BAAAA,GAAAA,CAAC,YAAA,EAAA,EACG,0BAAAO,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kCAAA,EACX,QAAA,EAAA;AAAA,8BAAAP,GAAAA;AAAA,gBAAC,UAAA;AAAA,gBAAA;AAAA,kBACG,IAAA,EAAM4C,MAAAA,CAAM,IAAA,CAAK,QAAQ,CAAA;AAAA,kBACzB,GAAA,EAAG,IAAA;AAAA,kBAEF,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA,eACV;AAAA,8BACArC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACX,QAAA,EAAA;AAAA,gCAAAP,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,gDACR,QAAA,EAAA,IAAA,CAAK,KAAA,IACF,KAAK,UAAA,EACb,CAAA;AAAA,gBAAA,CACE,IAAA,CAAK,IAAA,IAAQ,EAAA,MAAQ,EAAA,mBACnBA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mDAAA,EACR,QAAA,EAAA,IAAA,CAAK,IAAA,EACV,CAAA,GACA,IAAA;AAAA,gCACJO,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kDAAA,EACR,QAAA,EAAA;AAAA,kBAAA,IAAA,CAAK,UAAA;AAAA,kBACL,QAAA;AAAA,kBACA,UAAA,CAAW,KAAK,UAAU;AAAA,iBAAA,EAC/B;AAAA,eAAA,EACJ,CAAA;AAAA,cACC,IAAA,CAAK,OAAA,KAAY,IAAA,mBACdP,GAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACG,IAAA,EAAK,QAAA;AAAA,kBACL,OAAA,EAAS,CAAC,CAAA,KAAM;AACZ,oBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,oBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,oBAAA,KAAK,QAAA,CAAS,KAAK,EAAE,CAAA;AAAA,kBACzB,CAAA;AAAA,kBACA,SAAA,EAAU,6IAAA;AAAA,kBACV,YAAA,EAAY,EAAE,cAAc,CAAA;AAAA,kBAE3B,YAAE,WAAW;AAAA;AAAA,eAAE,GACpB;AAAA,aAAA,EACR,CAAA,EACJ;AAAA,WAAA;AAAA,UA7CK,IAAA,CAAK;AAAA,SA8Cd;AAAA,MAER,CAAC,CAAA,EACL;AAAA;AAAA,GAER;AAER;AAaA,eAAe,WAAA,CACX,WACA,QAAA,EAC+B;AAC/B,EAAA,MAAM,OAAA,GAAkC;AAAA,IACpC,MAAA,EAAQ;AAAA,GACZ;AACA,EAAA,IAAI;AACA,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,SAAA,CAAU,SAAS,QAAQ,CAAA;AACnD,IAAA,IAAI,UAAU,EAAA,EAAI;AACd,MAAA,OAAA,CAAQ,aAAA,GAAgB,UAAU,KAAK,CAAA,CAAA;AAAA,IAC3C;AAAA,EACJ,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,OAAA;AACX;AAEA,SAAS,SAAA,CAAU;AAAA,EACf,MAAA;AAAA,EACA,OAAA;AAAA,EACA;AACJ,CAAA,EAIG;AACC,EAAA,uBACIA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACG,IAAA,EAAK,QAAA;AAAA,MACL,OAAA;AAAA,MACA,SAAA,EACI,SACM,uEAAA,GACA,4GAAA;AAAA,MAEV,cAAA,EAAc,MAAA;AAAA,MAEb;AAAA;AAAA,GACL;AAER;AC7TA,IAAM,gBAAA,GAAmBD,cAAgC,IAAI,CAAA;AAC7D,IAAM,cAAA,GAAiBA,cAAwC,IAAI,CAAA;AAY5D,SAAS,YAAA,CAAa;AAAA,EACzB,SAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACJ,CAAA,EAAsB;AAElB,EAAA,MAAM,OAAA,GAAUM,QAAQ,MAAM,IAAI,IAAI,QAAQ,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAC3D,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIF,SAGlB,IAAI,CAAA;AAEd,EAAA,MAAM,IAAA,GAAOU,WAAAA;AAAA,IACT,CAAsB,IAAO,IAAA,KAA0B;AACnD,MAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,EAAG;AAClB,QAAA,OAAA,CAAQ,IAAA;AAAA,UACJ,sBAAsB,EAAE,CAAA,4EAAA;AAAA,SAC5B;AACA,QAAA;AAAA,MACJ;AACA,MAAA,SAAA,CAAU,EAAE,EAAA,EAAI,IAAA,EAAM,CAAA;AAAA,IAC1B,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACZ;AAEA,EAAA,MAAM,QAAQA,WAAAA,CAAY,MAAM,UAAU,IAAI,CAAA,EAAG,EAAE,CAAA;AAEnD,EAAA,MAAM,UAAA,GAAaR,OAAAA;AAAA,IACf,OAAO;AAAA,MACH,aAAA,EAAe,QAAQ,EAAA,IAAM,IAAA;AAAA,MAC7B,IAAA;AAAA,MACA;AAAA,KACJ,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,IAAA,EAAM,KAAK;AAAA,GACxB;AAEA,EAAA,uBACIL,GAAAA,CAAC,gBAAA,CAAiB,QAAA,EAAjB,EAA0B,KAAA,EAAO,SAAA,EAC9B,QAAA,kBAAAO,IAAAA,CAAC,cAAA,CAAe,QAAA,EAAf,EAAwB,OAAO,UAAA,EAC3B,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,oBAQDP,GAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACG,IAAA,EAAM,QAAQ,EAAA,KAAO,OAAA;AAAA,QACrB,OAAA,EAAS;AAAA;AAAA;AACb,GAAA,EACJ,CAAA,EACJ,CAAA;AAER;AAOO,SAAS,eAAA,GAAqC;AACjD,EAAA,MAAM,GAAA,GAAMC,WAAW,cAAc,CAAA;AACrC,EAAA,IAAI,QAAQ,IAAA,EAAM;AACd,IAAA,MAAM,IAAI,KAAA;AAAA,MACN;AAAA,KACJ;AAAA,EACJ;AACA,EAAA,OAAO,GAAA;AACX;AAQO,SAAS,uBAAA,GAAoD;AAChE,EAAA,OAAOA,WAAW,cAAc,CAAA;AACpC;AAMO,SAAS,YAAA,GAA0B;AACtC,EAAA,MAAM,CAAA,GAAIA,WAAW,gBAAgB,CAAA;AACrC,EAAA,IAAI,MAAM,IAAA,EAAM;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACN;AAAA,KACJ;AAAA,EACJ;AACA,EAAA,OAAO,CAAA;AACX;;;ACtEO,SAAS,SAAA,CAAU,eAAuB,EAAA,EAAsB;AACnE,EAAA,OAAO;AAAA,IACH,KAAA,EAAO,CAAC,GAAA,KAAQ,GAAA,IAAO,YAAA;AAAA,IACvB,SAAA,EAAW,CAAC,KAAA,KAAU,KAAA;AAAA,IACtB,SAAA,EAAW,CAAC,KAAA,KAAU,KAAA,KAAU;AAAA,GACpC;AACJ;AAOO,SAAS,SAAA,CACZ,YAAA,EACA,OAAA,GAA0C,EAAC,EAC3B;AAChB,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAsB;AACjC,IAAA,IAAI,QAAQ,GAAA,KAAQ,MAAA,IAAa,IAAI,OAAA,CAAQ,GAAA,SAAY,OAAA,CAAQ,GAAA;AACjE,IAAA,IAAI,QAAQ,GAAA,KAAQ,MAAA,IAAa,IAAI,OAAA,CAAQ,GAAA,SAAY,OAAA,CAAQ,GAAA;AAEjE,IAAA,OAAO,CAAA;AAAA,EACX,CAAA;AAEA,EAAA,OAAO;AAAA,IACH,KAAA,EAAO,CAAC,GAAA,KAAQ;AACZ,MAAA,IAAI,GAAA,KAAQ,MAAM,OAAO,YAAA;AACzB,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,GAAA,EAAK,EAAE,CAAA;AACtC,MAAA,IAAI,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAG,OAAO,YAAA;AAEjC,MAAA,OAAO,MAAM,MAAM,CAAA;AAAA,IACvB,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,KAAA,KAAU,MAAA,CAAO,KAAK,CAAA;AAAA,IAClC,SAAA,EAAW,CAAC,KAAA,KAAU,KAAA,KAAU;AAAA,GACpC;AACJ;AAQO,SAAS,OAAA,CACZ,QACA,YAAA,EACW;AACX,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAY,MAAM,CAAA;AAEtC,EAAA,OAAO;AAAA,IACH,KAAA,EAAO,CAAC,GAAA,KACJ,GAAA,KAAQ,QAAQ,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,GAAK,GAAA,GAAY,YAAA;AAAA,IACpD,SAAA,EAAW,CAAC,KAAA,KAAU,KAAA;AAAA,IACtB,SAAA,EAAW,CAAC,KAAA,KAAU,KAAA,KAAU;AAAA,GACpC;AACJ;AAMO,SAAS,UAAA,CAAW,eAAwB,KAAA,EAA0B;AACzE,EAAA,OAAO;AAAA,IACH,OAAO,CAAC,GAAA,KAAS,GAAA,KAAQ,IAAA,GAAO,eAAe,GAAA,KAAQ,MAAA;AAAA,IACvD,SAAA,EAAW,CAAC,KAAA,KAAW,KAAA,GAAQ,MAAA,GAAS,OAAA;AAAA,IACxC,SAAA,EAAW,CAAC,KAAA,KAAU,KAAA,KAAU;AAAA,GACpC;AACJ;AAQO,SAAS,cAAA,CACZ,YAAA,GAAkC,EAAC,EACjB;AAClB,EAAA,MAAM,UAAA,GAAa,CAAC,GAAG,YAAY,EAAE,IAAA,EAAK,CAAE,KAAK,GAAG,CAAA;AAEpD,EAAA,OAAO;AAAA,IACH,KAAA,EAAO,CAAC,GAAA,KAAQ;AACZ,MAAA,IAAI,QAAQ,IAAA,IAAQ,GAAA,KAAQ,IAAI,OAAO,CAAC,GAAG,YAAY,CAAA;AAEvD,MAAA,OAAO,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,OAAO,CAAC,IAAA,KAAS,SAAS,EAAE,CAAA;AAAA,IACtD,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,KAAA,KAAW,KAAA,CAAM,WAAW,CAAA,GAAI,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAAA,IACjE,SAAA,EAAW,CAAC,KAAA,KAAU,CAAC,GAAG,KAAK,CAAA,CAAE,IAAA,EAAK,CAAE,IAAA,CAAK,GAAG,CAAA,KAAM;AAAA,GAC1D;AACJ;AAOO,SAAS,gBAAqC,MAAA,EAAc;AAC/D,EAAA,OAAO,MAAA;AACX;AAQO,SAAS,cAAA,CACZ,QACA,MAAA,EACgB;AAChB,EAAA,MAAM,UAAA,GAAa,OAAO,UAAA,CAAW,GAAG,IAAI,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,GAAI,MAAA;AAC9D,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,UAAU,CAAA;AAC7C,EAAA,MAAM,QAAQ,EAAC;AAEf,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AACnC,IAAA,MAAM,KAAA,GAAQ,OAAO,GAAG,CAAA;AACxB,IAAA,IAAI,UAAU,MAAA,EAAW;AACzB,IAAC,KAAA,CAAkC,GAAG,CAAA,GAAI,KAAA,CAAM,MAAM,MAAA,CAAO,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,EACzE;AAEA,EAAA,OAAO,KAAA;AACX;AAWO,SAAS,cAAA,CACZ,OACA,MAAA,EACM;AACN,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AAEnC,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AACnC,IAAA,MAAM,KAAA,GAAQ,OAAO,GAAG,CAAA;AACxB,IAAA,IAAI,UAAU,MAAA,EAAW;AACzB,IAAA,MAAM,KAAA,GAAS,MAAkC,GAAG,CAAA;AAEpD,IAAA,IAAI,KAAA,CAAM,SAAA,CAAU,KAAK,CAAA,EAAG;AAE5B,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,SAAA,CAAU,KAAK,CAAA;AACxC,IAAA,IAAI,eAAe,IAAA,EAAM;AACrB,MAAA,MAAA,CAAO,GAAA,CAAI,KAAK,UAAU,CAAA;AAAA,IAC9B;AAAA,EACJ;AAEA,EAAA,OAAO,OAAO,QAAA,EAAS;AAC3B;AC7MO,IAAM,gBAAgB,CAAC,gBAAA,EAAkB,gBAAA,EAAkB,gBAAA,EAAkB,kBAAkB,gBAAgB;AAG/G,SAAS,SAAA,CAAU,EAAE,MAAA,EAAQ,KAAA,GAAQ,kBAAkB,KAAA,GAAQ,EAAA,EAAI,MAAA,GAAS,EAAA,EAAG,EAA0E;AAC5J,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACrB,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAW,OAAO,QAAA,CAAS,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAE,CAAA;AACxE,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,GAAG,KAAK,CAAA;AACnC,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,CAAC,KAAA,EAAO,UAAU,CAAE,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,CAAM,SAAS,CAAC,CAAA,IAAM,KAAA,GAAQ,CAAA,CAAA,GAAK,CAAA,EAAG,MAAA,GAAS,IAAK,KAAA,GAAQ,GAAA,IAAQ,MAAA,GAAS,CAAA,CAAE,CAAU,CAAA;AAC1J,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,KAAA,KAAU,CAAA,EAAG,KAAA,KAAU,CAAA,GAAI,GAAA,GAAM,GAAG,CAAA,EAAG,EAAA,CAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAEhH,EAAA,uBACIM,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAc,MAAA,EAAgB,OAAA,EAAS,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,EAAI,aAAA,EAAY,MAAA,EAC9E,QAAA,EAAA;AAAA,oBAAAP,IAAC,MAAA,EAAA,EAAK,CAAA,EAAG,CAAA,EAAG,CAAC,IAAI,KAAA,GAAQ,CAAC,CAAA,CAAA,EAAI,MAAM,MAAM,MAAM,CAAA,CAAA,CAAA,EAAK,IAAA,EAAM,KAAA,EAAO,SAAS,IAAA,EAAM,CAAA;AAAA,oBACjFA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAM,IAAA,EAAK,MAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,WAAA,EAAa,GAAA,EAAK,cAAA,EAAe,OAAA,EAAQ,eAAc,OAAA,EAAQ;AAAA,GAAA,EAC1G,CAAA;AAER","file":"index.js","sourcesContent":["import {\n createContext,\n useContext,\n type ReactNode,\n} from 'react';\n\n/**\n * Identity contract every Cbox-family app must populate.\n *\n * Shape mirrors what the future `@cboxdk/cbox-id-client` SDK returns\n * from id's `/api/v1/me` endpoint plus a small set of platform-level\n * URLs that each app needs to construct deep-links into id.\n *\n * In the id app itself, populate this from Inertia shared props\n * (id IS the source of truth — no API call needed).\n *\n * In cortex / atlas / track / future apps, populate from the\n * id-client SDK — typically once per session, then refreshed when\n * the user switches org or updates their profile.\n *\n * Components in this package read from the context but never write —\n * mutations always round-trip through id's API via the id-client.\n */\n\nexport type CboxAppKey = string;\n\nexport type CboxUser = {\n /** Cbox ID's user id: numeric in id itself, a prefixed string (`usr_…`) in the apps that mirror it. */\n id: number | string;\n name: string;\n email: string;\n avatar_url?: string | null;\n /** ISO 639-1 (e.g. \"en\", \"da\"). Used by formatters that want a locale. */\n locale?: string | null;\n /** IANA tz identifier (e.g. \"Europe/Copenhagen\"). */\n timezone?: string | null;\n};\n\nexport type CboxOrganization = {\n /** Cbox ID's organization id: numeric in id itself, a prefixed string (`org_…`) in the apps that mirror it. */\n id: number | string;\n slug: string;\n name: string;\n /**\n * Role of the current user within this org as resolved by id.\n * Apps should honour this for permission gating in the chrome\n * (eg \"Manage team\" link is hidden for members).\n */\n role?: 'owner' | 'admin' | 'member' | string;\n};\n\nexport type CboxAppLink = {\n /** Stable key — e.g. \"id\", \"cortex\", \"atlas\", \"track\". */\n key: CboxAppKey;\n /** Display name as shown in the launcher. */\n name: string;\n /** Absolute URL the launcher tile links to. */\n url: string;\n /**\n * Short tagline shown under the name. Keep to ~5–8 words —\n * the launcher truncates after one line.\n */\n description?: string;\n /**\n * One-letter monogram fallback when no icon is provided.\n * Defaults to the first letter of `name`.\n */\n monogram?: string;\n /** Cbox ID's catalog `icon_url`: the app's icon for light surfaces (`https:` only). */\n iconUrl?: string | null;\n /** Cbox ID's catalog `icon_dark_url`: the app's icon for dark surfaces. */\n iconDarkUrl?: string | null;\n /**\n * Accent colour for the monogram tile (and current-app highlight).\n * Hex string or any CSS colour the browser accepts. Falls back to\n * the neutral chip when missing.\n */\n accentColor?: string;\n /** Tag the user's currently-active app so the launcher highlights it. */\n current?: boolean;\n /**\n * Whether the current org has access to this app. Defaults to\n * `true` so existing payloads render unchanged. `false` renders\n * the tile as locked: greyed out, no nav, and (if the host app\n * passes `onLockedAppClick`) opens an upgrade affordance.\n */\n entitled?: boolean;\n /**\n * Mark the app as not-yet-released. Renders as a disabled tile\n * with a \"soon\" badge — distinct from `entitled: false` which\n * implies \"available, but not in your plan\".\n */\n comingSoon?: boolean;\n};\n\nexport type CboxNotificationPreviewItem = {\n id: string;\n title: string;\n body?: string | null;\n severity: 'info' | 'warning' | 'critical';\n /** ISO-8601 timestamp from the notifications service. */\n createdAt: string;\n /** Null when the user hasn't opened the notification yet. */\n readAt?: string | null;\n /** Optional deep-link — typically into the app that originated\n * the notification (id/billing/invoice/123, webhooks/deliveries/x).\n * Null when the notification is informational with no follow-up. */\n ctaUrl?: string | null;\n ctaLabel?: string | null;\n};\n\nexport type CboxNotificationsState = {\n unreadCount: number;\n /**\n * \"See all\" target — typically the central notifications service\n * inbox (notifications.cbox.systems/inbox). The bell's POPOVER\n * shows the preview items inline; only this URL navigates the\n * user out of the current app.\n */\n inboxUrl: string;\n /**\n * Last 5 items (mixed read/unread) for the bell-popover preview.\n * Empty when the host hasn't fetched a preview yet — the bell\n * still renders the badge from `unreadCount`. Falsy on\n * pre-auth pages where the chrome shouldn't render the bell at all.\n */\n previewItems?: CboxNotificationPreviewItem[];\n /**\n * Endpoint pattern for marking a single notification read. The\n * popover POSTs to `markReadUrl.replace('{id}', notification.id)`\n * — a host-local route that forwards to the service via M2M.\n */\n markReadUrl?: string;\n};\n\nexport type CboxIdContextValue = {\n user: CboxUser;\n /**\n * Org the current app context is scoped to. Null on user-only\n * surfaces (eg the id account-settings landing page).\n */\n currentOrganization: CboxOrganization | null;\n /**\n * All orgs the user belongs to — feeds the org switcher.\n * Should be small (≤ a few dozen). For users in many orgs,\n * the switcher swaps in a search field.\n */\n organizations: CboxOrganization[];\n /**\n * Sister apps in the Cbox family the user can launch into.\n * Static-ish — doesn't need to refresh per request.\n */\n apps: CboxAppLink[];\n /**\n * Deep-links into id used by chrome controls. Each app\n * constructs these via the id-client SDK; the package\n * doesn't hardcode URLs because id may live on different\n * hosts in dev / staging / prod.\n */\n urls: {\n /** Base of the id app — for the \"manage account\" link. */\n idBaseUrl: string;\n /** Absolute URL of the user's id profile page. */\n accountUrl: string;\n /** Absolute URL of the current org's settings page in id. */\n orgSettingsUrl: string | null;\n /** POST endpoint that signs the user out. */\n signOutUrl: string;\n /**\n * POST endpoint in id that switches the user's active org.\n * Used by OrgSwitcher as a fallback when `onSwitchOrganization`\n * is not provided — covers apps that can't do a pure URL swap.\n */\n switchOrgUrl?: string;\n };\n /**\n * Notification feed state, or null/undefined when the user has no\n * inbox configured. id's wire shape sets `null` explicitly; the\n * type accepts both shapes so apps can pass the payload straight\n * through without a null→undefined adapter.\n */\n notifications?: CboxNotificationsState | null;\n /**\n * True when the host app's cached payload is known to be out of\n * date — id has emitted a domain event (membership/role/sub\n * change) since the cache was populated. Apps should refetch\n * via the SDK before rendering anything that depends on the\n * cached membership / entitlement state. Soft-TTL covers the\n * case where the event was missed.\n *\n * Default: false (treated as fresh).\n */\n stale?: boolean;\n /**\n * Called when the user picks a different org from the switcher.\n * Apps own this — typically a same-app URL navigation that\n * swaps the slug in the current path (`/org/{slug}/...`). The\n * server validates membership at the destination via\n * EnsureOrganizationMembership, so this is a pure URL change with\n * no mutable state to update.\n */\n onSwitchOrganization?: (org: CboxOrganization) => void;\n};\n\nconst CboxIdContext = createContext<CboxIdContextValue | null>(null);\n\nexport function CboxIdProvider({\n value,\n children,\n}: {\n value: CboxIdContextValue;\n children: ReactNode;\n}) {\n return <CboxIdContext.Provider value={value}>{children}</CboxIdContext.Provider>;\n}\n\nexport function useCboxId(): CboxIdContextValue {\n const ctx = useContext(CboxIdContext);\n if (ctx === null) {\n throw new Error(\n '@cboxdk/cbox-ui: useCboxId() must be called inside <CboxIdProvider>. ' +\n 'Wrap your app root and populate it from the id-client SDK (or, ' +\n 'in id itself, from Inertia shared props).',\n );\n }\n return ctx;\n}\n\n/**\n * Soft variant — returns null instead of throwing. Useful for\n * components that gracefully degrade on auth-pre pages.\n */\nexport function useCboxIdOptional(): CboxIdContextValue | null {\n return useContext(CboxIdContext);\n}\n","import { createContext, useContext, useMemo, type ReactNode } from 'react';\n\nexport type CboxTranslationValues = Record<string, string | number>;\nexport type CboxTranslator = (message: string, values?: CboxTranslationValues) => string;\n\n/** Hosts own catalogs; the shared components never guess a person's language. */\nconst Localization = createContext<{ locale: string; t: CboxTranslator; formatDate: (value: string) => string }>({\n locale: 'en',\n t: interpolate,\n formatDate: (value) => new Date(value).toLocaleString(),\n});\n\nexport function interpolate(message: string, values: CboxTranslationValues = {}): string {\n return message.replace(/\\{([a-zA-Z][a-zA-Z0-9_]*)\\}/g, (match, key: string) =>\n Object.prototype.hasOwnProperty.call(values, key) ? String(values[key]) : match,\n );\n}\n\n/** Optional and additive: without a provider existing consumers retain English. */\nexport function CboxLocalizationProvider({ locale, translate, formatDate = defaultDate, children }: {\n locale: string;\n translate: CboxTranslator;\n formatDate?: (value: string) => string;\n children: ReactNode;\n}) {\n const value = useMemo(() => ({ locale, t: translate, formatDate }), [locale, translate, formatDate]);\n return <Localization.Provider value={value}>{children}</Localization.Provider>;\n}\n\nexport function useCboxLocalization() {\n return useContext(Localization);\n}\n\nfunction defaultDate(value: string): string {\n return new Date(value).toLocaleString();\n}\n","import { useState, useSyncExternalStore, type ReactNode } from 'react';\nimport { cn } from '../utils/cn';\nimport { initials, readKnownAppCatalog, secureIconUrl, subscribeKnownAppCatalog, type CboxKnownApp } from '../app-switcher/catalog';\n\n/**\n * Every Cbox app's icon comes from Cbox ID's catalog: one light and one dark upload per app\n * (`icon_url`, `icon_dark_url`). There is no local copy of the marks in this package or in an\n * app. The last catalog the browser saw is kept here so an app's own mark and the switcher\n * paint at once on the next page; the live answer replaces it when it arrives.\n */\nexport type { CboxKnownApp } from '../app-switcher/catalog';\nexport { readKnownAppCatalog, rememberAppCatalog, secureIconUrl } from '../app-switcher/catalog';\n\nconst EMPTY: CboxKnownApp[] = [];\n\n/** The last catalog this browser kept; empty on the server and before the first answer. */\nexport function useKnownAppCatalog(): CboxKnownApp[] {\n return useSyncExternalStore(subscribeKnownAppCatalog, readKnownAppCatalog, () => EMPTY);\n}\n\nexport type CboxAppIconProps = {\n /** The app's name; its first two letters stand in when it has no icon. */\n name: string;\n /** Catalog `icon_url`: the icon for light surfaces (or the only one). */\n iconUrl?: string | null;\n /** Catalog `icon_dark_url`: the icon for dark surfaces. */\n iconDarkUrl?: string | null;\n /** Size and shape of the icon box, e.g. `h-6 w-6`. */\n className?: string;\n /** Rendered instead of initials when the app has no usable icon. */\n fallback?: ReactNode;\n};\n\n/**\n * One app's icon from the catalog. With both uploads it renders two images and the token\n * stylesheet shows the one for the current theme (`.dark` or `[data-theme=\"dark\"]` on the\n * root, the same switch the tokens use). Without an icon, or when it fails to load, it shows\n * the app's initials.\n */\nexport function CboxAppIcon({ name, iconUrl, iconDarkUrl, className = 'h-6 w-6', fallback }: CboxAppIconProps) {\n const light = secureIconUrl(iconUrl);\n const dark = secureIconUrl(iconDarkUrl);\n const [failed, setFailed] = useState<string | null>(null);\n const key = `${light ?? ''}|${dark ?? ''}`;\n if (light === null || failed === key) {\n if (fallback !== undefined) return <>{fallback}</>;\n return <span aria-hidden className={cn('grid shrink-0 place-items-center rounded bg-secondary text-[11px] font-semibold text-foreground', className)}>{initials(name)}</span>;\n }\n const lost = () => setFailed(key);\n\n return (\n <span aria-hidden className={cn('cbx-app-icon-box inline-flex shrink-0 items-center justify-center', className)}>\n <img src={light} alt=\"\" decoding=\"async\" onError={lost} className={cn('cbx-app-icon', dark === null ? 'cbx-app-icon-single' : 'cbx-app-icon-light', 'h-full w-full')} />\n {dark !== null && <img src={dark} alt=\"\" decoding=\"async\" onError={lost} className=\"cbx-app-icon cbx-app-icon-dark h-full w-full\" />}\n </span>\n );\n}\n\nexport type CboxServiceMarkProps = {\n /** The app key in Cbox ID's catalog (`signals`, `infra`, …). */\n appKey: string;\n /** Size of the mark. Default `h-6 w-6`. */\n className?: string;\n /** Shown while the catalog has not told this browser the app's icon yet. Default nothing. */\n fallback?: ReactNode;\n};\n\n/** An app's own mark (its rail or brand icon), read from the catalog this browser last kept. */\nexport function CboxServiceMark({ appKey, className = 'h-6 w-6', fallback = null }: CboxServiceMarkProps) {\n const app = useKnownAppCatalog().find(entry => entry.key === appKey);\n if (app === undefined || app.icon_url === null) return <>{fallback}</>;\n\n return <CboxAppIcon name={app.name} iconUrl={app.icon_url} iconDarkUrl={app.icon_dark_url} className={className} fallback={fallback ?? undefined} />;\n}\n","import { createContext, useContext, type AnchorHTMLAttributes, type ComponentType, type ReactNode } from 'react';\nimport type { CboxTranslator } from '../context/localization';\nimport type { HelpArticle, HelpStore } from './help-store';\nimport type { ShellIcon } from './icons';\nimport type { Shell, ShellNavigate, ShellPreferenceChange, ShellPreferences } from './types';\n\n/** A client-side link (Inertia's `Link`). Receives `href`, `className`, `children` and ARIA props. */\nexport type ShellLinkComponent = ComponentType<AnchorHTMLAttributes<HTMLAnchorElement> & { href: string; children?: ReactNode }>;\n\n/** Which overlay is open. Only one at a time, so two menus never stack. */\nexport type ShellOverlay =\n | 'org'\n | 'context'\n | 'apps'\n | 'account'\n | 'palette'\n | 'nav-sheet'\n | 'context-sheet'\n | null;\n\nexport type ShellApi = {\n shell: Shell;\n t: CboxTranslator;\n navigate: ShellNavigate;\n Link: ShellLinkComponent;\n icons: Readonly<Record<string, ShellIcon>>;\n preferences: ShellPreferences;\n setPreference: ShellPreferenceChange;\n overlay: ShellOverlay;\n setOverlay: (overlay: ShellOverlay) => void;\n help: HelpStore;\n /** Open or close Help. */\n toggleHelp: (open?: boolean) => void;\n /** Open Help on an article. */\n openArticle: (article: HelpArticle) => void;\n /** Open Help and send a question to the chat with the page as context. */\n ask: (question: string) => void;\n /** Switch context: `chosen` maps level keys to ids. */\n switchTo: (chosen: Record<string, string>) => void;\n};\n\nexport const ShellContext = createContext<ShellApi | null>(null);\n\nexport function useShell(): ShellApi {\n const api = useContext(ShellContext);\n if (api === null) throw new Error('[cbox-ui] Shell parts must be rendered inside <CboxShell>.');\n return api;\n}\n\n/** Help for a page's own `?` button, or `null` outside the shell. */\nexport function useShellHelp(): Pick<ShellApi, 'toggleHelp' | 'openArticle' | 'ask'> | null {\n const api = useContext(ShellContext);\n return api === null ? null : { toggleHelp: api.toggleHelp, openArticle: api.openArticle, ask: api.ask };\n}\n","import { useSyncExternalStore } from 'react';\n\n/** Fine pointer and hover: a desktop. Only there does a search field take focus by itself (§4.5). */\nexport const DESKTOP_POINTER = '(hover: hover) and (pointer: fine)';\n/** Help docks beside the page from here; below it is a full-screen overlay (§4.4). */\nexport const HELP_DOCKED = '(min-width: 1280px)';\n/** The phone layout (§4.5). */\nexport const MOBILE = '(max-width: 767px)';\n\nfunction query(media: string): MediaQueryList | null {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return null;\n return window.matchMedia(media);\n}\n\nexport function matches(media: string): boolean {\n return query(media)?.matches ?? false;\n}\n\n/** Whether a search field may focus itself: never on touch. */\nexport function canAutofocus(): boolean {\n return matches(DESKTOP_POINTER);\n}\n\n/** A live media query. `fallback` is what the server and the first client render assume. */\nexport function useMedia(media: string, fallback = false): boolean {\n return useSyncExternalStore(\n change => {\n const list = query(media);\n if (list === null) return () => undefined;\n list.addEventListener?.('change', change);\n return () => list.removeEventListener?.('change', change);\n },\n () => query(media)?.matches ?? fallback,\n () => fallback,\n );\n}\n","import { useEffect, useLayoutEffect, useRef, useState, type CSSProperties, type ReactNode, type RefObject } from 'react';\n\nexport type Placement = 'bottom-start' | 'bottom-end' | 'top-start';\n\nconst GAP = 6;\nconst MARGIN = 8;\n\ntype Position = { top?: number; bottom?: number; left: number; maxHeight: number };\n\nfunction place(anchor: DOMRect, size: { width: number }, placement: Placement): Position {\n const width = window.innerWidth;\n const height = window.innerHeight;\n let left = placement === 'bottom-end' ? anchor.right - size.width : anchor.left;\n left = Math.max(MARGIN, Math.min(left, width - size.width - MARGIN));\n if (placement === 'top-start') {\n const bottom = height - anchor.top + GAP;\n return { bottom, left, maxHeight: Math.max(160, height - bottom - MARGIN) };\n }\n const top = anchor.bottom + GAP;\n return { top, left, maxHeight: Math.max(160, height - top - MARGIN) };\n}\n\n/**\n * A menu surface anchored to its trigger. It is positioned `fixed` from the trigger's box before\n * the first paint (no jump, never clipped by a scrolling parent), closes on a pointer down outside\n * it and on Escape, and hands focus back to the trigger when it closes from the keyboard.\n */\nexport function Popover({\n open,\n anchor,\n placement = 'bottom-start',\n onClose,\n className,\n label,\n children,\n}: {\n open: boolean;\n anchor: RefObject<HTMLElement | null>;\n placement?: Placement;\n onClose: (reason: 'escape' | 'outside' | 'tab') => void;\n className?: string;\n label: string;\n children: ReactNode;\n}) {\n const surface = useRef<HTMLDivElement>(null);\n const [position, setPosition] = useState<Position | null>(null);\n\n useLayoutEffect(() => {\n if (!open) {\n setPosition(null);\n return;\n }\n const update = () => {\n const box = anchor.current?.getBoundingClientRect();\n const el = surface.current;\n if (box === undefined || el === null) return;\n setPosition(place(box, { width: el.offsetWidth }, placement));\n };\n update();\n window.addEventListener('resize', update);\n return () => window.removeEventListener('resize', update);\n }, [open, anchor, placement]);\n\n useEffect(() => {\n if (!open) return;\n const down = (event: PointerEvent) => {\n const target = event.target as Node | null;\n if (target === null) return;\n if (surface.current?.contains(target) || anchor.current?.contains(target)) return;\n onClose('outside');\n };\n document.addEventListener('pointerdown', down, true);\n return () => document.removeEventListener('pointerdown', down, true);\n }, [open, anchor, onClose]);\n\n if (!open) return null;\n\n const style: CSSProperties = position === null\n ? { position: 'fixed', top: 0, left: 0, visibility: 'hidden' }\n : { position: 'fixed', top: position.top, bottom: position.bottom, left: position.left, maxHeight: position.maxHeight };\n\n return (\n <div\n ref={surface}\n className={`cbx-popover ${className ?? ''}`}\n style={style}\n role=\"dialog\"\n aria-label={label}\n onKeyDown={event => {\n if (event.key === 'Escape' && !event.defaultPrevented) {\n event.preventDefault();\n event.stopPropagation();\n onClose('escape');\n anchor.current?.focus();\n }\n if (event.key === 'Tab' && !event.defaultPrevented) {\n // Tab leaves the menu: it closes and the trigger has focus, so the next Tab\n // goes on through the header.\n event.preventDefault();\n onClose('tab');\n anchor.current?.focus();\n }\n }}\n >\n {children}\n </div>\n );\n}\n\n/** Keep Tab inside `container` while it is modal (mobile sheets, the Help overlay, the palette). */\nexport function trapTab(event: { key: string; shiftKey: boolean; preventDefault: () => void }, container: HTMLElement | null): void {\n if (event.key !== 'Tab' || container === null) return;\n const focusable = Array.from(\n container.querySelectorAll<HTMLElement>('a[href], button:not([disabled]), input:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'),\n ).filter(el => !el.hasAttribute('hidden') && el.getAttribute('aria-hidden') !== 'true');\n if (focusable.length === 0) {\n event.preventDefault();\n return;\n }\n const first = focusable[0]!;\n const last = focusable[focusable.length - 1]!;\n const active = document.activeElement;\n if (event.shiftKey && (active === first || !container.contains(active))) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && (active === last || !container.contains(active))) {\n event.preventDefault();\n first.focus();\n }\n}\n\n/**\n * Scroll `id`'s element into view inside its own scrolling list only. `scrollIntoView` would also\n * scroll every parent (a sheet, the page), which makes a menu jump when it opens.\n */\nexport function revealInList(id: string): void {\n if (typeof document === 'undefined') return;\n const option = document.getElementById(id);\n if (option === null) return;\n // The scroller is the listbox itself, or the `.cbx-list` around it (a pane keeps its status\n // notes outside the listbox, inside the same scroller).\n let list = option.closest<HTMLElement>('[role=\"listbox\"]');\n if (list !== null && list.scrollHeight <= list.clientHeight && list.parentElement?.classList.contains('cbx-list')) list = list.parentElement;\n if (list === null || list.scrollHeight <= list.clientHeight) return;\n const box = list.getBoundingClientRect();\n const item = option.getBoundingClientRect();\n if (item.top < box.top) list.scrollTop -= box.top - item.top + 8;\n else if (item.bottom > box.bottom) list.scrollTop += item.bottom - box.bottom + 8;\n}\n","import { Check, Search } from 'lucide-react';\nimport { useEffect, useId, useMemo, useRef, useState, type KeyboardEvent } from 'react';\nimport { canAutofocus } from './media';\nimport { revealInList } from './popover';\nimport { useShell } from './context';\nimport type { ShellOption } from './types';\n\n/**\n * Roving focus for a `role=\"menu\"`: ↑↓ (and ←→ inside a `role=\"group\"` row) move between the\n * items, Home and End jump. The items are the menu's `menuitem`, `menuitemradio` and links.\n */\nexport function rovingKeyDown(event: KeyboardEvent<HTMLElement>, container: HTMLElement | null): void {\n if (container === null) return;\n const items = Array.from(container.querySelectorAll<HTMLElement>('[role=\"menuitem\"],[role=\"menuitemradio\"]')).filter(el => !el.closest('[hidden]'));\n if (items.length === 0) return;\n const index = items.indexOf(document.activeElement as HTMLElement);\n const inGroup = (document.activeElement as HTMLElement | null)?.closest('[role=\"group\"]') !== null;\n let next = -1;\n switch (event.key) {\n case 'ArrowDown':\n next = index < 0 ? 0 : (index + 1) % items.length;\n if (inGroup) {\n // Leave the segmented row downwards in one step.\n const group = (document.activeElement as HTMLElement).closest('[role=\"group\"]')!;\n const after = items.findIndex((item, i) => i > index && !group.contains(item));\n next = after >= 0 ? after : 0;\n }\n break;\n case 'ArrowUp':\n next = index <= 0 ? items.length - 1 : index - 1;\n if (inGroup) {\n const group = (document.activeElement as HTMLElement).closest('[role=\"group\"]')!;\n const before = items.map((item, i) => (i < index && !group.contains(item) ? i : -1)).filter(i => i >= 0).pop();\n next = before ?? items.length - 1;\n }\n break;\n case 'ArrowRight':\n if (inGroup) next = Math.min(items.length - 1, index + 1);\n break;\n case 'ArrowLeft':\n if (inGroup) next = Math.max(0, index - 1);\n break;\n case 'Home':\n next = 0;\n break;\n case 'End':\n next = items.length - 1;\n break;\n }\n if (next >= 0) {\n event.preventDefault();\n items[next]!.focus();\n }\n}\n\n/**\n * A searchable list of choices (language, regional format, time zone): the same search, row\n * density and keys as the context menus.\n */\nexport function OptionList({ label, options, current, onPick, autoFocus = true }: { label: string; options: ShellOption[]; current?: string; onPick: (code: string) => void; autoFocus?: boolean }) {\n const { t } = useShell();\n const [q, setQ] = useState('');\n const id = useId();\n const input = useRef<HTMLInputElement>(null);\n const shown = useMemo(() => {\n const needle = q.trim().toLowerCase();\n return needle === '' ? options : options.filter(option => option.label.toLowerCase().includes(needle) || option.code.toLowerCase().includes(needle));\n }, [options, q]);\n const [active, setActive] = useState(() => Math.max(0, options.findIndex(option => option.code === current)));\n\n useEffect(() => {\n if (autoFocus && canAutofocus()) input.current?.focus();\n }, [autoFocus]);\n useEffect(() => {\n if (q !== '') setActive(0);\n }, [q]);\n useEffect(() => {\n revealInList(`${id}-${active}`);\n }, [active, id]);\n\n const onKeyDown = (event: KeyboardEvent) => {\n const last = shown.length - 1;\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n setActive(index => (index >= last ? 0 : index + 1));\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n setActive(index => (index <= 0 ? last : index - 1));\n } else if (event.key === 'Home' && q === '') {\n event.preventDefault();\n setActive(0);\n } else if (event.key === 'End' && q === '') {\n event.preventDefault();\n setActive(last);\n } else if (event.key === 'Enter') {\n event.preventDefault();\n const option = shown[active];\n if (option !== undefined) onPick(option.code);\n }\n };\n\n return (\n <div className=\"cbx-pane\" onKeyDown={onKeyDown}>\n <div className=\"cbx-pane-search\">\n <Search size={16} strokeWidth={1.8} aria-hidden />\n <input\n ref={input}\n type=\"search\"\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={`${id}-list`}\n aria-activedescendant={shown[active] !== undefined ? `${id}-${active}` : undefined}\n aria-label={t('Search {things}', { things: label.toLowerCase() })}\n placeholder={t('Search…')}\n value={q}\n onChange={event => setQ(event.target.value)}\n autoComplete=\"off\"\n />\n </div>\n <div id={`${id}-list`} role=\"listbox\" aria-label={label} className=\"cbx-list cbx-list-tall\">\n {shown.map((option, index) => (\n <div key={option.code} className={`cbx-row ${index === active ? 'is-active' : ''}`} onMouseEnter={() => setActive(index)}>\n <div id={`${id}-${index}`} role=\"option\" aria-selected={index === active} aria-current={option.code === current ? 'true' : undefined} className=\"cbx-row-main\" onClick={() => onPick(option.code)}>\n <span className=\"cbx-row-name\" title={option.label}>{option.label}</span>\n {option.code === current && <Check className=\"cbx-row-check\" size={16} strokeWidth={2} aria-label={t('Current')} />}\n </div>\n </div>\n ))}\n {shown.length === 0 && <div className=\"cbx-list-note\">{t('Nothing matches “{query}”.', { query: q.trim() })}</div>}\n </div>\n </div>\n );\n}\n","import { ArrowLeft, ArrowUpRight, ChevronRight, Globe, LogOut, Monitor, Moon, Sun, UserRound, Users } from 'lucide-react';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { useShell } from './context';\nimport { OptionList, rovingKeyDown } from './option-list';\nimport type { ShellOption, ShellTheme } from './types';\n\nconst DEFAULT_LANGUAGES: ShellOption[] = [\n { code: 'en', label: 'English' },\n { code: 'da', label: 'Dansk' },\n];\n\nconst DEFAULT_FORMATS: ShellOption[] = [\n { code: 'en-GB', label: 'English (United Kingdom)' },\n { code: 'en-US', label: 'English (United States)' },\n { code: 'da-DK', label: 'Dansk (Danmark)' },\n { code: 'de-DE', label: 'Deutsch (Deutschland)' },\n { code: 'sv-SE', label: 'Svenska (Sverige)' },\n { code: 'nb-NO', label: 'Norsk bokmål (Norge)' },\n];\n\nconst FALLBACK_ZONES = ['UTC', 'Europe/Copenhagen', 'Europe/London', 'Europe/Berlin', 'Europe/Stockholm', 'Europe/Oslo', 'America/New_York', 'America/Los_Angeles', 'Asia/Tokyo'];\n\nfunction timeZones(): ShellOption[] {\n const supported = (Intl as unknown as { supportedValuesOf?: (key: string) => string[] }).supportedValuesOf;\n const zones = typeof supported === 'function' ? supported('timeZone') : FALLBACK_ZONES;\n return zones.map(zone => ({ code: zone, label: zone.replace(/_/g, ' ') }));\n}\n\nexport function Avatar({ size = 30 }: { size?: number }) {\n const { shell } = useShell();\n const { person } = shell;\n return (\n <span className=\"cbx-avatar\" style={{ width: size, height: size }} aria-hidden=\"true\">\n {person.avatarUrl !== undefined ? <img src={person.avatarUrl} alt=\"\" width={size} height={size} /> : person.initials}\n </span>\n );\n}\n\ntype View = 'main' | 'language' | 'format' | 'timeZone';\n\n/**\n * The account menu (§10): who is signed in, Profile and security in Cbox ID, language, regional\n * format and time zone (Cbox ID's shared preferences), theme, Switch account and Sign out.\n * `inline` renders it as a section of the mobile navigation sheet.\n */\nexport function AccountMenu({ inline = false, onDone }: { inline?: boolean; onDone?: () => void }) {\n const { shell, t, preferences, setPreference, navigate } = useShell();\n const { person } = shell;\n const account = shell.account ?? {};\n const [view, setView] = useState<View>('main');\n const menu = useRef<HTMLDivElement>(null);\n // In the mobile sheet the items are ordinary tab stops; as a popover they rove.\n const tab = inline ? 0 : -1;\n const languages = account.languages ?? DEFAULT_LANGUAGES;\n const formats = account.formats ?? DEFAULT_FORMATS;\n const zones = useMemo(() => (view === 'timeZone' ? timeZones() : []), [view]);\n\n useEffect(() => {\n if (view !== 'main' || inline) return;\n // The first item takes focus: it is a menu, not a text field, so no keyboard comes up on touch.\n menu.current?.querySelector<HTMLElement>('[role=\"menuitem\"]')?.focus();\n }, [view, inline]);\n\n const label = (options: ShellOption[], code: string | undefined, fallback: string) => options.find(option => option.code === code)?.label ?? code ?? fallback;\n const back = (\n <button type=\"button\" className=\"cbx-row cbx-row-action cbx-back\" onClick={() => setView('main')}>\n <ArrowLeft size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{t('Account')}</span>\n </button>\n );\n const pick = <K extends 'locale' | 'regionalFormat' | 'timeZone'>(key: K) => (code: string) => {\n setPreference(key, code);\n setView('main');\n };\n\n if (view === 'language') return <div className=\"cbx-menu cbx-menu-account\">{back}<OptionList label={t('Language')} options={languages} current={preferences.locale} onPick={pick('locale')} /></div>;\n if (view === 'format') return <div className=\"cbx-menu cbx-menu-account\">{back}<OptionList label={t('Regional format')} options={formats} current={preferences.regionalFormat} onPick={pick('regionalFormat')} /></div>;\n if (view === 'timeZone') return <div className=\"cbx-menu cbx-menu-account\">{back}<OptionList label={t('Time zone')} options={zones} current={preferences.timeZone} onPick={pick('timeZone')} /></div>;\n\n const themes: Array<{ value: ShellTheme; label: string; icon: typeof Sun }> = [\n { value: 'system', label: t('System'), icon: Monitor },\n { value: 'light', label: t('Light'), icon: Sun },\n { value: 'dark', label: t('Dark'), icon: Moon },\n ];\n\n return (\n <div ref={menu} className={`cbx-menu cbx-menu-account ${inline ? 'is-inline' : ''}`} role=\"menu\" aria-label={t('Account')} onKeyDown={event => rovingKeyDown(event, menu.current)}>\n <div className=\"cbx-account-head\">\n <Avatar size={36} />\n <div className=\"cbx-account-who\">\n <span className=\"cbx-account-name cbx-truncate\" title={person.name}>{person.name}</span>\n <span className=\"cbx-account-sub cbx-truncate\">{account.signedInWith ?? t('Signed in with Cbox ID')}</span>\n </div>\n </div>\n <div className=\"cbx-list\" role=\"none\">\n {account.profileUrl !== undefined && (\n <a role=\"menuitem\" tabIndex={tab} className=\"cbx-row cbx-row-action\" href={account.profileUrl} onClick={onDone}>\n <UserRound size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{t('Profile and security')}</span>\n <ArrowUpRight className=\"cbx-row-trail\" size={14} strokeWidth={1.8} aria-hidden />\n </a>\n )}\n <button role=\"menuitem\" tabIndex={tab} type=\"button\" className=\"cbx-row cbx-row-action\" aria-haspopup=\"listbox\" onClick={() => setView('language')}>\n <Globe size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{t('Language')}</span>\n <span className=\"cbx-row-value cbx-truncate\">{label(languages, preferences.locale, 'English')}</span>\n <ChevronRight className=\"cbx-row-trail\" size={16} strokeWidth={1.8} aria-hidden />\n </button>\n <button role=\"menuitem\" tabIndex={tab} type=\"button\" className=\"cbx-row cbx-row-action\" aria-haspopup=\"listbox\" onClick={() => setView('format')}>\n <span className=\"cbx-row-icon-gap\" aria-hidden=\"true\" />\n <span className=\"cbx-row-name\">{t('Regional format')}</span>\n <span className=\"cbx-row-value cbx-truncate\">{label(formats, preferences.regionalFormat, t('Automatic'))}</span>\n <ChevronRight className=\"cbx-row-trail\" size={16} strokeWidth={1.8} aria-hidden />\n </button>\n <button role=\"menuitem\" tabIndex={tab} type=\"button\" className=\"cbx-row cbx-row-action\" aria-haspopup=\"listbox\" onClick={() => setView('timeZone')}>\n <span className=\"cbx-row-icon-gap\" aria-hidden=\"true\" />\n <span className=\"cbx-row-name\">{t('Time zone')}</span>\n <span className=\"cbx-row-value cbx-truncate\">{(preferences.timeZone ?? t('Automatic')).replace(/_/g, ' ')}</span>\n <ChevronRight className=\"cbx-row-trail\" size={16} strokeWidth={1.8} aria-hidden />\n </button>\n <div className=\"cbx-theme\" role=\"group\" aria-label={t('Theme')}>\n <span className=\"cbx-theme-label\">{t('Theme')}</span>\n <div className=\"cbx-segmented\">\n {themes.map(theme => (\n <button\n key={theme.value}\n type=\"button\"\n role=\"menuitemradio\"\n tabIndex={tab}\n aria-checked={preferences.theme === theme.value}\n className={preferences.theme === theme.value ? 'is-on' : ''}\n onClick={() => setPreference('theme', theme.value)}\n >\n <theme.icon size={14} strokeWidth={1.8} aria-hidden />\n {theme.label}\n </button>\n ))}\n </div>\n </div>\n </div>\n {(account.switchAccountUrl !== undefined || account.signOutUrl !== undefined) && (\n <div className=\"cbx-list cbx-list-foot\" role=\"none\">\n {/* A plain link, so it is a full page load: switching account goes through Cbox ID,\n which an Inertia visit could not follow cross-origin. */}\n {account.switchAccountUrl !== undefined && (\n <a role=\"menuitem\" tabIndex={tab} className=\"cbx-row cbx-row-action\" href={account.switchAccountUrl} onClick={onDone}>\n <Users size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{t('Switch account')}</span>\n </a>\n )}\n {account.signOutUrl !== undefined && (\n <button role=\"menuitem\" tabIndex={tab} type=\"button\" className=\"cbx-row cbx-row-action\" onClick={() => { onDone?.(); navigate(account.signOutUrl!, { method: account.signOutMethod ?? 'post' }); }}>\n <LogOut size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{t('Sign out')}</span>\n </button>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { ArrowUpRight } from 'lucide-react';\nimport { useCallback, useEffect, useRef, useState, type KeyboardEvent } from 'react';\nimport { initials, parseAppCatalog, rememberAppCatalog, secureIconUrl, signInTarget } from '../app-switcher/catalog';\nimport { useShell } from './context';\n\n/** One app in the grid (§9). */\nexport type ShellApp = {\n key: string;\n name: string;\n /** One line: \"Identity and sign-in\". */\n purpose: string | null;\n /** Fixed per-app hue (0–360); the tile is drawn in it, in light and dark. */\n hue: number;\n iconUrl: string | null;\n iconDarkUrl: string | null;\n /** Where the tile goes: the app, or its admission page when the organization lacks it. */\n url: string;\n /** The organization has this app. False: \"More from Cbox\", dimmed. */\n inOrganization: boolean;\n};\n\n/** Each app's fixed hue when the catalog sends none. */\nexport const APP_HUES: Readonly<Record<string, number>> = {\n id: 258,\n billing: 145,\n engage: 25,\n telemetry: 300,\n work: 70,\n brain: 330,\n infra: 200,\n status: 160,\n assistant: 280,\n sites: 110,\n tax: 45,\n signals: 0,\n stache: 230,\n domains: 185,\n};\n\n/** A stable hue for an unknown key, so its tile keeps its colour between pages. */\nexport function hueFor(key: string, given?: unknown): number {\n if (typeof given === 'number' && Number.isFinite(given)) return ((given % 360) + 360) % 360;\n const known = APP_HUES[key];\n if (known !== undefined) return known;\n let hash = 0;\n for (const char of key) hash = (hash * 31 + char.charCodeAt(0)) % 360;\n return hash;\n}\n\nexport type ShellCatalogState =\n | { status: 'loading' }\n | { status: 'ready'; apps: ShellApp[] }\n | { status: 'signin_required'; href: string | null }\n | { status: 'unavailable' };\n\n/**\n * The catalog answer, with the shell's additions (§9.3): `in_organization` (default true),\n * `admission_url` for apps the organization does not have, `purpose` (falls back to\n * `description`) and `hue`. Only http(s) links are kept.\n */\nexport function parseShellCatalog(ok: boolean, body: unknown, here?: { origin: string; pathname: string; search: string }): ShellCatalogState {\n const base = parseAppCatalog(ok, body);\n if (base.status === 'signin_required') return { status: 'signin_required', href: here === undefined ? null : signInTarget(base, here) };\n if (!ok || typeof body !== 'object' || body === null || !Array.isArray((body as { apps?: unknown }).apps)) return { status: 'unavailable' };\n const apps: ShellApp[] = [];\n for (const entry of (body as { apps: unknown[] }).apps) {\n if (typeof entry !== 'object' || entry === null) continue;\n const app = entry as Record<string, unknown>;\n if (typeof app.key !== 'string' || typeof app.name !== 'string') continue;\n const inOrganization = app.in_organization !== false;\n const launch = typeof app.launch_url === 'string' && /^https?:\\/\\//i.test(app.launch_url) ? app.launch_url : null;\n const admission = typeof app.admission_url === 'string' && /^https?:\\/\\//i.test(app.admission_url) ? app.admission_url : null;\n const url = inOrganization ? launch : admission ?? launch;\n if (url === null) continue;\n const purpose = typeof app.purpose === 'string' ? app.purpose : typeof app.description === 'string' ? app.description : null;\n apps.push({\n key: app.key,\n name: app.name,\n purpose,\n hue: hueFor(app.key, app.hue),\n iconUrl: secureIconUrl(app.icon_url),\n iconDarkUrl: secureIconUrl(app.icon_dark_url),\n url,\n inOrganization,\n });\n }\n return { status: 'ready', apps };\n}\n\nlet kept: { url: string; state: ShellCatalogState; until: number } | null = null;\n\n/** The catalog, loaded when the grid first opens and kept for its `refresh_after`. */\nexport function useShellCatalog(url: string, enabled: boolean): [ShellCatalogState, () => void] {\n const [state, setState] = useState<ShellCatalogState>(() => (kept !== null && kept.url === url ? kept.state : { status: 'loading' }));\n const [attempt, setAttempt] = useState(0);\n useEffect(() => {\n if (!enabled) return;\n if (kept !== null && kept.url === url && kept.until > Date.now() && attempt === 0) {\n setState(kept.state);\n return;\n }\n const controller = new AbortController();\n if (kept === null || kept.url !== url) setState({ status: 'loading' });\n fetch(url, { credentials: 'same-origin', headers: { Accept: 'application/json' }, signal: controller.signal })\n .then(async response => {\n let body: unknown = null;\n try {\n body = await response.json();\n } catch {\n body = null;\n }\n const next = parseShellCatalog(response.ok, body, window.location);\n const refresh = typeof (body as { refresh_after?: unknown })?.refresh_after === 'number' ? Math.min(60, Math.max(1, (body as { refresh_after: number }).refresh_after)) : 60;\n if (next.status === 'ready') {\n kept = { url, state: next, until: Date.now() + refresh * 1000 };\n rememberAppCatalog(next.apps.map(app => ({ key: app.key, name: app.name, launch_url: app.url, icon_url: app.iconUrl, icon_dark_url: app.iconDarkUrl })));\n }\n setState(next);\n })\n .catch((error: unknown) => {\n if ((error as { name?: string })?.name !== 'AbortError') setState({ status: 'unavailable' });\n });\n return () => controller.abort();\n }, [url, enabled, attempt]);\n return [state, useCallback(() => setAttempt(value => value + 1), [])];\n}\n\nexport function AppTile({ app, current }: { app: ShellApp; current: boolean }) {\n const [failed, setFailed] = useState(false);\n const style = { '--cbx-hue': String(app.hue) } as Record<string, string>;\n return (\n <a\n href={app.url}\n className={`cbx-app ${current ? 'is-current' : ''} ${app.inOrganization ? '' : 'is-elsewhere'}`}\n aria-current={current ? 'page' : undefined}\n data-app={app.key}\n >\n <span className=\"cbx-app-tile\" style={style} aria-hidden=\"true\">\n {app.iconUrl !== null && !failed ? (\n <>\n <img src={app.iconUrl} alt=\"\" className={app.iconDarkUrl !== null ? 'cbx-app-icon-light' : ''} onError={() => setFailed(true)} />\n {app.iconDarkUrl !== null && <img src={app.iconDarkUrl} alt=\"\" className=\"cbx-app-icon-dark\" onError={() => setFailed(true)} />}\n </>\n ) : (\n initials(app.name.replace(/^Cbox\\s*·?\\s*/i, ''))\n )}\n </span>\n <span className=\"cbx-app-name cbx-truncate\" title={app.name}>{app.name.replace(/^Cbox\\s*·\\s*/i, '')}</span>\n {app.purpose !== null && <span className=\"cbx-app-purpose cbx-truncate\" title={app.purpose}>{app.purpose}</span>}\n </a>\n );\n}\n\n/**\n * Arrow keys across the 3-column grid; Home and End jump. \"All products\" is the last stop: ↓\n * from the bottom row and End reach it, ↑ from it goes back to the last tile.\n */\nfunction gridKeys(event: KeyboardEvent<HTMLElement>, container: HTMLElement | null): void {\n if (container === null) return;\n const tiles = Array.from(container.querySelectorAll<HTMLElement>('.cbx-app'));\n const all = container.querySelector<HTMLElement>('.cbx-apps-all');\n const stops = all === null ? tiles : [...tiles, all];\n const index = stops.indexOf(document.activeElement as HTMLElement);\n if (index < 0 || stops.length === 0) return;\n const onAll = all !== null && index === tiles.length;\n const moves: Record<string, number> = { ArrowRight: 1, ArrowLeft: -1, ArrowDown: 3, ArrowUp: -3 };\n let next = index;\n if (onAll) {\n if (event.key === 'ArrowUp' || event.key === 'ArrowLeft') next = tiles.length - 1;\n else if (event.key === 'Home') next = 0;\n else if (event.key === 'End' || event.key === 'ArrowDown' || event.key === 'ArrowRight') next = index;\n else return;\n } else if (event.key === 'ArrowDown' && index + 3 > tiles.length - 1 && all !== null) next = tiles.length;\n else if (event.key === 'ArrowRight' && index === tiles.length - 1 && all !== null) next = tiles.length;\n else if (event.key in moves) next = Math.max(0, Math.min(tiles.length - 1, index + moves[event.key]!));\n else if (event.key === 'Home') next = 0;\n else if (event.key === 'End') next = stops.length - 1;\n else return;\n event.preventDefault();\n stops[Math.max(0, next)]?.focus();\n}\n\n/**\n * The app grid (§9): \"In {organization}\" with the current app marked, \"More from Cbox\" dimmed\n * (each opens that app's admission page in the same organization), and \"All products ↗\".\n */\nexport function AppGrid({ autoFocus = true }: { autoFocus?: boolean }) {\n const { shell, t } = useShell();\n const [state, retry] = useShellCatalog(shell.apps.catalogUrl, true);\n const box = useRef<HTMLDivElement>(null);\n const organization = shell.context.levels[0]?.current.name;\n\n useEffect(() => {\n if (!autoFocus || state.status !== 'ready') return;\n const tiles = box.current?.querySelectorAll<HTMLElement>('.cbx-app');\n const current = box.current?.querySelector<HTMLElement>('.cbx-app.is-current');\n (current ?? tiles?.[0])?.focus();\n }, [state.status, autoFocus]);\n\n const mine = state.status === 'ready' ? state.apps.filter(app => app.inOrganization) : [];\n const more = state.status === 'ready' ? state.apps.filter(app => !app.inOrganization) : [];\n\n return (\n <div className=\"cbx-menu cbx-menu-apps\" ref={box} onKeyDown={event => gridKeys(event, box.current)}>\n {state.status === 'loading' && <p className=\"cbx-list-note\" aria-live=\"polite\">{t('Loading apps…')}</p>}\n {state.status === 'unavailable' && (\n <p className=\"cbx-list-note\" role=\"alert\">\n {t('Apps could not be loaded.')} <button type=\"button\" className=\"cbx-link\" onClick={retry}>{t('Try again')}</button>\n </p>\n )}\n {state.status === 'signin_required' && (\n <p className=\"cbx-list-note\" role=\"alert\">\n {t('Sign in again to see your apps.')} {state.href !== null && <a className=\"cbx-link\" href={state.href}>{t('Sign in')}</a>}\n </p>\n )}\n {state.status === 'ready' && (\n <>\n <section aria-label={organization !== undefined ? t('In {organization}', { organization }) : t('Your apps')}>\n <h3 className=\"cbx-pane-heading\">{organization !== undefined ? t('In {organization}', { organization }) : t('Your apps')}</h3>\n <div className=\"cbx-apps\">\n {mine.map(app => <AppTile key={app.key} app={app} current={app.key === shell.app.key} />)}\n </div>\n {mine.length === 0 && <p className=\"cbx-list-note\">{t('No apps available')}</p>}\n </section>\n {more.length > 0 && (\n <section aria-label={t('More from Cbox')}>\n <h3 className=\"cbx-pane-heading\">{t('More from Cbox')}</h3>\n <div className=\"cbx-apps\">\n {more.map(app => <AppTile key={app.key} app={app} current={false} />)}\n </div>\n </section>\n )}\n </>\n )}\n <div className=\"cbx-pane-foot\">\n <a className=\"cbx-row cbx-row-action cbx-apps-all\" href={shell.apps.productsUrl ?? 'https://cbox.dk'} target=\"_blank\" rel=\"noopener\">\n <span className=\"cbx-row-name\">{t('All products')}</span>\n <ArrowUpRight className=\"cbx-row-trail\" size={14} strokeWidth={1.8} aria-hidden />\n </a>\n </div>\n </div>\n );\n}\n\n/** Forget the kept catalog (tests, sign-out). */\nexport function forgetShellCatalog(): void {\n kept = null;\n}\n","import type { ContextItem, ContextLevel, ContextTone, ShellNavigate } from './types';\n\n/**\n * The shell's few network shapes and the pure rules around them: list pages, inline create,\n * the switch payload and settings links. Everything here is same-origin and JSON.\n */\n\nexport type ListPage = { items: ContextItem[]; hasMore: boolean; nextCursor: string | null };\n\nconst TONES: readonly ContextTone[] = ['production', 'sandbox', 'neutral'];\n\n/** First letters of the first two words, for a chip. */\nexport function initialsOf(name: string): string {\n const words = name.trim().split(/\\s+/).filter(Boolean);\n const letters = words.length > 1 ? (words[0]![0] ?? '') + (words[1]![0] ?? '') : name.trim().slice(0, 2);\n return letters.toUpperCase() || '?';\n}\n\nfunction toItem(value: unknown): ContextItem | null {\n if (typeof value !== 'object' || value === null) return null;\n const row = value as Record<string, unknown>;\n const id = typeof row.id === 'string' || typeof row.id === 'number' ? String(row.id) : null;\n if (id === null || typeof row.name !== 'string') return null;\n const item: ContextItem = { id, name: row.name };\n if (typeof row.initials === 'string' && row.initials !== '') item.initials = row.initials;\n if (typeof row.tone === 'string' && (TONES as readonly string[]).includes(row.tone)) item.tone = row.tone as ContextTone;\n if (typeof row.label === 'string' && row.label !== '') item.label = row.label;\n const test = row.testData ?? row.test_data;\n if (typeof test === 'boolean') item.testData = test;\n return item;\n}\n\n/**\n * A list answer. The URL standard's envelope (`{ object: 'list', data, has_more, next_cursor }`)\n * and a bare array are both accepted; rows without an id and a name are dropped.\n */\nexport function parseListPage(body: unknown): ListPage {\n const envelope = Array.isArray(body) ? { data: body } : typeof body === 'object' && body !== null ? (body as Record<string, unknown>) : {};\n const rows = Array.isArray(envelope.data) ? envelope.data : [];\n const items = rows.map(toItem).filter((item): item is ContextItem => item !== null);\n const cursor = envelope.next_cursor ?? envelope.nextCursor;\n const nextCursor = typeof cursor === 'string' && cursor !== '' ? cursor : null;\n const more = envelope.has_more ?? envelope.hasMore;\n return { items, hasMore: (more === true || more === undefined) && nextCursor !== null, nextCursor };\n}\n\n/**\n * A server-supplied link the shell may follow: http(s) or a same-origin path. Anything else\n * (`javascript:`, `data:`) is dropped, so a bad answer from a proxy can never run script.\n */\nexport function safeUrl(url: unknown): string | undefined {\n return typeof url === 'string' && /^(https?:\\/\\/|\\/)/i.test(url.trim()) ? url.trim() : undefined;\n}\n\n/** `url` with query parameters added; empty values are left out. Works for relative URLs. */\nexport function withQuery(url: string, params: Record<string, string | undefined | null>): string {\n const [path, hash = ''] = url.split('#') as [string, string?];\n const [base, query = ''] = path.split('?') as [string, string?];\n const search = new URLSearchParams(query);\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null && value !== '') search.set(key, value);\n }\n const qs = search.toString();\n return base + (qs ? `?${qs}` : '') + (hash ? `#${hash}` : '');\n}\n\n/** The settings link of one item, from the level's URL template. Null when the level has none. */\nexport function settingsHref(level: Pick<ContextLevel, 'settingsUrl'>, id: string): string | null {\n if (level.settingsUrl === undefined || level.settingsUrl === '') return null;\n return level.settingsUrl.split('{id}').join(encodeURIComponent(id));\n}\n\nexport function pluralOf(level: Pick<ContextLevel, 'label' | 'labelPlural'>): string {\n return level.labelPlural ?? `${level.label}s`;\n}\n\n/**\n * Which environment a project click lands on (§5.4): the one with the current environment's\n * name when the project has it, else its first. Undefined when the project has none.\n */\nexport function environmentFor(environments: readonly ContextItem[], currentName: string | undefined): ContextItem | undefined {\n if (currentName !== undefined) {\n const wanted = currentName.trim().toLowerCase();\n const same = environments.find(env => env.name.trim().toLowerCase() === wanted);\n if (same !== undefined) return same;\n }\n return environments[0];\n}\n\n/**\n * The switch payload (§5.6): every level above the chosen one keeps its current id, the chosen\n * levels get theirs, and levels below are left to the server (it lands on the last used one).\n * `return_to` is where the person is, so the server can stay on the same page.\n */\nexport function switchPayload(levels: readonly ContextLevel[], chosen: Record<string, string>, returnTo: string): Record<string, string> {\n const payload: Record<string, string> = {};\n const deepest = Math.max(-1, ...levels.map((level, index) => (chosen[level.key] !== undefined ? index : -1)));\n levels.forEach((level, index) => {\n const id = chosen[level.key];\n if (id !== undefined) payload[level.key] = id;\n else if (index < deepest) payload[level.key] = level.current.id;\n });\n payload.return_to = returnTo;\n return payload;\n}\n\nfunction cookie(name: string): string | null {\n if (typeof document === 'undefined') return null;\n const match = document.cookie.split('; ').find(part => part.startsWith(`${name}=`));\n return match === undefined ? null : decodeURIComponent(match.slice(name.length + 1));\n}\n\nfunction csrfToken(): string | null {\n if (typeof document === 'undefined') return null;\n return document.querySelector<HTMLMetaElement>('meta[name=\"csrf-token\"]')?.content ?? null;\n}\n\n/** Same-origin JSON with Laravel's CSRF headers. Throws `ShellRequestError` on a non-2xx. */\nexport async function requestJson<T = unknown>(url: string, init: { method?: string; body?: unknown; signal?: AbortSignal } = {}): Promise<T> {\n const headers: Record<string, string> = { Accept: 'application/json', 'X-Requested-With': 'XMLHttpRequest' };\n if (init.body !== undefined) headers['Content-Type'] = 'application/json';\n const xsrf = cookie('XSRF-TOKEN');\n const csrf = csrfToken();\n if (xsrf !== null) headers['X-XSRF-TOKEN'] = xsrf;\n else if (csrf !== null) headers['X-CSRF-TOKEN'] = csrf;\n const response = await fetch(url, {\n method: init.method ?? 'GET',\n credentials: 'same-origin',\n headers,\n body: init.body === undefined ? undefined : JSON.stringify(init.body),\n signal: init.signal,\n });\n const text = await response.text();\n let body: unknown = null;\n try {\n body = text === '' ? null : JSON.parse(text);\n } catch {\n body = null;\n }\n if (!response.ok) throw new ShellRequestError(response.status, body);\n return body as T;\n}\n\nexport class ShellRequestError extends Error {\n constructor(readonly status: number, readonly body: unknown) {\n super(`Request failed with ${status}`);\n }\n\n /** The first validation message (RFC 9457 `errors`, or Laravel's `errors`/`message`). */\n get detail(): string | null {\n const body = typeof this.body === 'object' && this.body !== null ? (this.body as Record<string, unknown>) : {};\n const errors = body.errors;\n if (typeof errors === 'object' && errors !== null) {\n for (const messages of Object.values(errors as Record<string, unknown>)) {\n if (Array.isArray(messages) && typeof messages[0] === 'string') return messages[0];\n if (typeof messages === 'string') return messages;\n }\n }\n if (typeof body.detail === 'string') return body.detail;\n if (typeof body.message === 'string') return body.message;\n return null;\n }\n}\n\n/** Inline create (§5.7): `POST createUrl { name, parent? }` → the details page to land on. */\nexport async function createItem(createUrl: string, name: string, parent?: string): Promise<{ id: string; detailsUrl: string }> {\n const body: Record<string, string> = { name };\n if (parent !== undefined) body.parent = parent;\n const answer = await requestJson<Record<string, unknown>>(createUrl, { method: 'POST', body });\n const id = answer?.id;\n const detailsUrl = safeUrl(answer?.detailsUrl ?? answer?.details_url);\n if ((typeof id !== 'string' && typeof id !== 'number') || detailsUrl === undefined) {\n throw new ShellRequestError(500, { message: 'The answer had no details page.' });\n }\n return { id: String(id), detailsUrl };\n}\n\n/**\n * The default navigation when the host passes none: a GET is a page load, a POST a real form\n * submit with Laravel's `_token`, so the server's redirect is followed like any form.\n */\nexport const defaultNavigate: ShellNavigate = (url, options = {}) => {\n if (typeof window === 'undefined' || safeUrl(url) === undefined) return;\n if (options.newTab) {\n window.open(url, '_blank', 'noopener');\n return;\n }\n if ((options.method ?? 'get') === 'get') {\n window.location.assign(url);\n return;\n }\n const form = document.createElement('form');\n form.method = 'POST';\n form.action = url;\n form.style.display = 'none';\n const fields: Record<string, unknown> = { ...(options.data ?? {}) };\n const token = csrfToken();\n if (token !== null) fields._token = token;\n for (const [name, value] of Object.entries(fields)) {\n const input = document.createElement('input');\n input.type = 'hidden';\n input.name = name;\n input.value = String(value);\n form.append(input);\n }\n document.body.append(form);\n form.submit();\n};\n\n/** Where the person is: path, query and hash. */\nexport function currentLocation(): string {\n if (typeof window === 'undefined') return '/';\n return window.location.pathname + window.location.search + window.location.hash;\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { parseListPage, requestJson, withQuery } from './data';\nimport type { ContextItem } from './types';\n\nexport const DEBOUNCE_MS = 120;\nconst PAGE_SIZE = 25;\n\nexport type ListState = {\n items: ContextItem[];\n status: 'loading' | 'ready' | 'error';\n hasMore: boolean;\n loadingMore: boolean;\n loadMore: () => void;\n retry: () => void;\n};\n\n/** The page size, unless the app's list URL already names one. */\nfunction pageSize(url: string): string | undefined {\n return /[?&]limit=/.test(url) ? undefined : String(PAGE_SIZE);\n}\n\n/** Answers kept for this page, so hovering back to a project shows its environments at once. */\nconst kept = new Map<string, { items: ContextItem[]; hasMore: boolean; nextCursor: string | null }>();\n\n/** Forget kept answers (after a create, on a context switch, and between tests). */\nexport function forgetLists(): void {\n kept.clear();\n keptScope = null;\n}\n\n/** The context the kept answers belong to: every level's current id. */\nlet keptScope: string | null = null;\n\n/**\n * Tie the kept answers to a context. When the person has switched (an Inertia visit keeps this\n * module alive), answers from the previous context are dropped, even when an app's list URL is\n * not scoped by organization in its path. Returns true when something was dropped.\n */\nexport function scopeLists(scope: string): boolean {\n if (keptScope === scope) return false;\n const changed = keptScope !== null;\n kept.clear();\n keptScope = scope;\n return changed;\n}\n\n/**\n * A level's list, loaded lazily (§11.2): only while `enabled`, searched with `?q=` (debounced),\n * scoped with `?parent=`, paged with `?cursor=`. An empty search is kept for the page's lifetime.\n */\nexport function useContextList(url: string | undefined, { q = '', parent, enabled = true }: { q?: string; parent?: string; enabled?: boolean }): ListState {\n const [query, setQuery] = useState(q);\n const [state, setState] = useState<{ key: string; items: ContextItem[]; status: ListState['status']; hasMore: boolean; nextCursor: string | null; loadingMore: boolean }>({\n key: '',\n items: [],\n status: 'loading',\n hasMore: false,\n nextCursor: null,\n loadingMore: false,\n });\n const [attempt, setAttempt] = useState(0);\n const abort = useRef<AbortController | null>(null);\n\n useEffect(() => {\n if (q === query) return;\n const timer = setTimeout(() => setQuery(q), DEBOUNCE_MS);\n return () => clearTimeout(timer);\n }, [q, query]);\n\n const key = url === undefined ? '' : withQuery(url, { q: query.trim(), parent, limit: pageSize(url) });\n\n useEffect(() => {\n if (!enabled || url === undefined) return;\n const hit = kept.get(key);\n if (hit !== undefined) {\n setState({ key, items: hit.items, status: 'ready', hasMore: hit.hasMore, nextCursor: hit.nextCursor, loadingMore: false });\n return;\n }\n abort.current?.abort();\n const controller = new AbortController();\n abort.current = controller;\n setState(current => ({ ...current, key, status: 'loading', loadingMore: false }));\n requestJson(key, { signal: controller.signal })\n .then(body => {\n const page = parseListPage(body);\n if (query.trim() === '') kept.set(key, page);\n setState({ key, items: page.items, status: 'ready', hasMore: page.hasMore, nextCursor: page.nextCursor, loadingMore: false });\n })\n .catch((error: unknown) => {\n if ((error as { name?: string })?.name === 'AbortError') return;\n setState(current => ({ ...current, key, status: 'error', loadingMore: false }));\n });\n return () => controller.abort();\n }, [enabled, url, key, query, attempt]);\n\n const loadMore = useCallback(() => {\n setState(current => {\n if (!current.hasMore || current.loadingMore || current.nextCursor === null || url === undefined) return current;\n const cursor = current.nextCursor;\n requestJson(withQuery(current.key, { cursor }))\n .then(body => {\n const page = parseListPage(body);\n setState(now => {\n if (now.key !== current.key) return now;\n const items = [...now.items, ...page.items.filter(item => !now.items.some(have => have.id === item.id))];\n if (query.trim() === '') kept.set(now.key, { items, hasMore: page.hasMore, nextCursor: page.nextCursor });\n return { ...now, items, hasMore: page.hasMore, nextCursor: page.nextCursor, loadingMore: false };\n });\n })\n .catch(() => setState(now => ({ ...now, loadingMore: false })));\n return { ...current, loadingMore: true };\n });\n }, [url, query]);\n\n const retry = useCallback(() => {\n kept.delete(key);\n setAttempt(value => value + 1);\n }, [key]);\n\n const settled = state.key === key;\n // While a new search loads, the last answer stays (nothing jumps); a new parent starts empty.\n const sameParent = state.key !== '' && new URL(state.key, 'http://x').searchParams.get('parent') === (parent ?? null);\n return {\n items: settled || sameParent ? state.items : [],\n status: settled ? state.status : 'loading',\n hasMore: settled && state.hasMore,\n loadingMore: settled && state.loadingMore,\n loadMore,\n retry,\n };\n}\n\n/** Load a list once, outside a component (a project click needs its environments). */\nexport async function fetchList(url: string, parent?: string): Promise<ContextItem[]> {\n const key = withQuery(url, { parent, limit: pageSize(url) });\n const hit = kept.get(key);\n if (hit !== undefined) return hit.items;\n const page = parseListPage(await requestJson(key));\n kept.set(key, page);\n return page.items;\n}\n","import { Check, ChevronRight, Plus, Search, Settings } from 'lucide-react';\nimport { useCallback, useEffect, useId, useImperativeHandle, useRef, useState, type KeyboardEvent, type ReactNode, type Ref } from 'react';\nimport { createItem, environmentFor, initialsOf, pluralOf, settingsHref, ShellRequestError } from './data';\nimport { canAutofocus } from './media';\nimport { revealInList } from './popover';\nimport { useShell } from './context';\nimport { fetchList, forgetLists, useContextList } from './use-list';\nimport type { ContextItem, ContextLevel, ContextTone } from './types';\n\n/** The initials chip of an organization, project or site. */\nexport function Chip({ item, tone = 'soft' }: { item: Pick<ContextItem, 'name' | 'initials'>; tone?: 'solid' | 'soft' }) {\n return <span className={`cbx-chip cbx-chip-${tone}`} aria-hidden=\"true\">{item.initials ?? initialsOf(item.name)}</span>;\n}\n\n/** The coloured square of an environment (§5.4): production green, sandbox amber, neutral grey. */\nexport function ToneSquare({ tone }: { tone?: ContextTone }) {\n return <span className={`cbx-tone cbx-tone-${tone ?? 'neutral'}`} aria-hidden=\"true\" />;\n}\n\n/** True for the third level, whose rows carry a tone square instead of a chip. */\nexport function isEnvironmentLevel(level: ContextLevel): boolean {\n return level.key === 'environment';\n}\n\nexport type PaneHandle = { focus: () => void };\n\ntype PaneProps = {\n level: ContextLevel;\n /** Id of the item one level up, for `?parent=` and inline create. */\n parent?: string;\n /** The item marked with a check. */\n currentId?: string;\n heading: string;\n /** Show \"View all\". */\n viewAll?: boolean;\n /** A search field heads the pane. */\n searchable?: boolean;\n /** Take focus when the pane mounts (only on a desktop pointer). */\n autoFocus?: boolean;\n /** Rows show a chevron: the pane previews the next level. */\n chevron?: boolean;\n createLabel?: string;\n onPick: (item: ContextItem) => void;\n /** Hover or keyboard focus on a row, without switching anything. */\n onPreview?: (item: ContextItem) => void;\n /** → on a row. Return true when it was handled. */\n onArrowRight?: () => boolean;\n onArrowLeft?: () => void;\n handle?: Ref<PaneHandle>;\n /** Where the pane hands focus when it has no search (the cascade's right pane). */\n className?: string;\n};\n\ntype Option = { kind: 'item'; item: ContextItem } | { kind: 'more' };\n\n/**\n * One pane of a context menu: search, heading with View all, the lazily loaded rows, and\n * \"New …\". Keyboard: ↑↓ Home End move, Enter picks, → and ← cross panes, Esc closes (the\n * popover), Tab leaves. Focus stays in the search field and the active row is announced with\n * `aria-activedescendant`. A row's gear is an option of its own (named \"Settings\", described\n * by the row): → makes it active, ← goes back, Enter opens the settings page; in the cascade a\n * second → crosses to the environments. The pane's own actions sit on the same ring: ↓ past the last row\n * focuses \"New …\", ↑ above the first row focuses \"View all\", and ↑↓ from there go back into\n * the rows, so both work without a mouse (§12.2).\n */\nexport function LevelPane({ level, parent, currentId, heading, viewAll = true, searchable = true, autoFocus = false, chevron = false, createLabel, onPick, onPreview, onArrowRight, onArrowLeft, handle, className }: PaneProps) {\n const { t, Link, navigate } = useShell();\n const [q, setQ] = useState('');\n const [active, setActiveRow] = useState(-1);\n // → on a row with settings makes its gear the active option; any other move leaves it.\n const [gear, setGear] = useState(false);\n const setActive = useCallback((next: number | ((index: number) => number)) => {\n setGear(false);\n setActiveRow(next);\n }, []);\n const [creating, setCreating] = useState(false);\n const list = useContextList(level.listUrl, { q, parent });\n const id = useId();\n const input = useRef<HTMLInputElement>(null);\n const box = useRef<HTMLDivElement>(null);\n const createButton = useRef<HTMLButtonElement>(null);\n const plural = pluralOf(level);\n const environment = isEnvironmentLevel(level);\n\n const options: Option[] = list.items.map(item => ({ kind: 'item' as const, item }));\n if (list.hasMore) options.push({ kind: 'more' });\n\n // The current item is active when the rows arrive; a new search starts at the top.\n useEffect(() => {\n if (list.status !== 'ready') return;\n setActive(previous => {\n if (previous >= 0 && previous < options.length && q === '') return previous;\n const current = list.items.findIndex(item => item.id === currentId);\n return q === '' && current >= 0 ? current : options.length > 0 ? 0 : -1;\n });\n }, [list.status, list.items, q, currentId]);\n\n useEffect(() => {\n if (autoFocus && searchable && canAutofocus()) input.current?.focus();\n }, [autoFocus, searchable]);\n\n const focusSelf = useCallback(() => {\n if (searchable) input.current?.focus();\n else box.current?.focus();\n setActive(index => (index < 0 && options.length > 0 ? 0 : index));\n }, [searchable, options.length]);\n useImperativeHandle(handle, () => ({ focus: focusSelf }), [focusSelf]);\n\n const optionId = (index: number) => `${id}-option-${index}`;\n const allId = `${id}-all`;\n const canCreate = level.createUrl !== undefined && createLabel !== undefined;\n /** The pane's actions in ring order: View all above the rows, New … below them. */\n const viewAllLink = () => (viewAll ? document.getElementById(allId) : null);\n const createAction = () => (canCreate && !creating ? createButton.current : null);\n useEffect(() => {\n if (active < 0) return;\n revealInList(optionId(active));\n const option = options[active];\n if (option?.kind === 'item') onPreview?.(option.item);\n }, [active]);\n\n const choose = (option: Option | undefined) => {\n if (option === undefined) return;\n if (option.kind === 'more') list.loadMore();\n else onPick(option.item);\n };\n\n /** Back into the rows from an action, on the first or the last row. */\n const enterRows = (at: 'first' | 'last') => {\n focusSelf();\n setActive(options.length === 0 ? -1 : at === 'first' ? 0 : options.length - 1);\n };\n\n /** ↑↓ on View all or New …: the ring is View all, the rows, New …, and round again. */\n const onActionKeyDown = (event: KeyboardEvent, action: 'all' | 'create') => {\n if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp') return;\n event.preventDefault();\n const rows = options.length > 0;\n const down = event.key === 'ArrowDown';\n const ring: Array<() => void> = [];\n const top = viewAllLink();\n const bottom = createAction();\n if (top !== null) ring.push(() => top.focus());\n if (rows) ring.push(() => enterRows(down ? 'first' : 'last'));\n if (bottom !== null) ring.push(() => bottom.focus());\n const here = action === 'all' ? 0 : ring.length - 1;\n const next = (here + (down ? 1 : -1) + ring.length) % ring.length;\n ring[next]?.();\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.target instanceof HTMLElement && event.target.closest('.cbx-create')) return;\n if (event.target instanceof HTMLElement && event.target.closest('[data-pane-action]')) return;\n const last = options.length - 1;\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n const bottom = createAction();\n if (bottom !== null && active >= last) {\n bottom.focus();\n break;\n }\n setActive(index => (index >= last ? 0 : index + 1));\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n const top = viewAllLink();\n if (top !== null && active <= 0) {\n top.focus();\n break;\n }\n setActive(index => (index <= 0 ? last : index - 1));\n break;\n }\n case 'Home':\n if (!searchable || q === '') {\n event.preventDefault();\n setActive(options.length > 0 ? 0 : -1);\n }\n break;\n case 'End':\n if (!searchable || q === '') {\n event.preventDefault();\n setActive(last);\n }\n break;\n case 'Enter': {\n event.preventDefault();\n const option = options[active];\n const settings = option?.kind === 'item' ? settingsHref(level, option.item.id) : null;\n if (gear && settings !== null) navigate(settings);\n else choose(option);\n break;\n }\n case 'ArrowRight': {\n if (searchable && input.current !== null && input.current.selectionStart !== q.length) break;\n const option = options[active];\n if (!gear && option?.kind === 'item' && settingsHref(level, option.item.id) !== null) {\n event.preventDefault();\n setGear(true);\n break;\n }\n if (onArrowRight?.()) {\n event.preventDefault();\n setGear(false);\n }\n break;\n }\n case 'ArrowLeft':\n if (gear) {\n event.preventDefault();\n setGear(false);\n break;\n }\n if (onArrowLeft !== undefined && (!searchable || input.current?.selectionStart === 0)) {\n event.preventDefault();\n onArrowLeft();\n }\n break;\n }\n };\n\n const listboxId = `${id}-listbox`;\n const activeId = active >= 0 && active < options.length ? (gear ? `${optionId(active)}-settings` : optionId(active)) : undefined;\n\n return (\n <div className={`cbx-pane ${className ?? ''}`} onKeyDown={onKeyDown}>\n {searchable && (\n <div className=\"cbx-pane-search\">\n <Search size={16} strokeWidth={1.8} aria-hidden />\n <input\n ref={input}\n type=\"search\"\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={listboxId}\n aria-activedescendant={activeId}\n aria-autocomplete=\"list\"\n aria-label={t('Search {things}', { things: plural.toLowerCase() })}\n placeholder={t('Search {things}…', { things: plural.toLowerCase() })}\n value={q}\n onChange={event => setQ(event.target.value)}\n autoComplete=\"off\"\n spellCheck={false}\n />\n </div>\n )}\n <div className=\"cbx-pane-heading\">\n <span className=\"cbx-truncate\" title={heading}>{heading}</span>\n {viewAll && (\n <Link href={level.allUrl} id={allId} className=\"cbx-pane-all\" tabIndex={-1} data-pane-action=\"all\" onKeyDown={event => onActionKeyDown(event, 'all')}>\n {t('View all')}\n </Link>\n )}\n </div>\n <div\n className=\"cbx-list\"\n onScroll={event => {\n const el = event.currentTarget;\n if (el.scrollHeight - el.scrollTop - el.clientHeight < 48) list.loadMore();\n }}\n >\n <div\n ref={box}\n id={listboxId}\n role=\"listbox\"\n aria-label={heading}\n tabIndex={searchable ? -1 : 0}\n aria-activedescendant={searchable ? undefined : activeId}\n className=\"cbx-listbox\"\n >\n {options.map((option, index) => {\n if (option.kind === 'more') {\n return (\n <div key=\"more\" id={optionId(index)} role=\"option\" aria-selected={index === active && !gear} className={`cbx-row cbx-row-more ${index === active ? 'is-active' : ''}`} onMouseEnter={() => setActive(index)} onClick={() => list.loadMore()}>\n <span className=\"cbx-row-name\">{list.loadingMore ? t('Loading…') : t('Show more')}</span>\n </div>\n );\n }\n const { item } = option;\n const current = item.id === currentId;\n const settings = settingsHref(level, item.id);\n return (\n <div key={item.id} className={`cbx-row ${index === active ? 'is-active' : ''} ${current ? 'is-current' : ''}`} onMouseEnter={() => setActive(index)}>\n <div id={optionId(index)} role=\"option\" aria-selected={index === active && !gear} aria-current={current ? 'true' : undefined} className=\"cbx-row-main\" onClick={() => onPick(item)}>\n {environment ? <ToneSquare tone={item.tone} /> : <Chip item={item} />}\n <span className=\"cbx-row-name\" title={item.name}>{item.name}</span>\n {item.label !== undefined && <span className=\"cbx-row-label\">{item.label}</span>}\n {current && <Check className=\"cbx-row-check\" size={16} strokeWidth={2} aria-label={t('Current')} />}\n </div>\n {settings !== null && (\n <Link\n href={settings}\n id={`${optionId(index)}-settings`}\n role=\"option\"\n aria-selected={index === active && gear}\n aria-describedby={optionId(index)}\n className={`cbx-row-gear ${index === active && gear ? 'is-active' : ''}`}\n tabIndex={-1}\n aria-label={t('Settings')}\n title={t('Settings for {name}', { name: item.name })}\n >\n <Settings size={15} strokeWidth={1.8} aria-hidden />\n </Link>\n )}\n {chevron && <ChevronRight className=\"cbx-row-chevron\" size={16} strokeWidth={1.8} aria-hidden />}\n </div>\n );\n })}\n </div>\n <ListStatus status={list.status} empty={options.length === 0} query={q} plural={plural} onRetry={list.retry} />\n </div>\n {canCreate && (\n <div className=\"cbx-pane-foot\">\n {creating ? (\n <InlineCreate level={level} parent={parent} label={createLabel} onCancel={() => { setCreating(false); focusSelf(); }} />\n ) : (\n <button ref={createButton} type=\"button\" className=\"cbx-row cbx-row-action\" data-pane-action=\"create\" onClick={() => setCreating(true)} onKeyDown={event => onActionKeyDown(event, 'create')}>\n <Plus size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{createLabel}</span>\n </button>\n )}\n </div>\n )}\n </div>\n );\n}\n\nfunction ListStatus({ status, empty, query, plural, onRetry }: { status: 'loading' | 'ready' | 'error'; empty: boolean; query: string; plural: string; onRetry: () => void }) {\n const { t } = useShell();\n if (status === 'error') {\n return (\n <div className=\"cbx-list-note\" role=\"alert\">\n {t('{things} could not be loaded.', { things: plural })}{' '}\n <button type=\"button\" className=\"cbx-link\" onClick={onRetry}>{t('Try again')}</button>\n </div>\n );\n }\n if (status === 'loading' && empty) return <div className=\"cbx-list-note\" aria-live=\"polite\">{t('Loading…')}</div>;\n if (status === 'ready' && empty) {\n return <div className=\"cbx-list-note\" aria-live=\"polite\">{query.trim() === '' ? t('No {things} yet.', { things: plural.toLowerCase() }) : t('Nothing matches “{query}”.', { query: query.trim() })}</div>;\n }\n return null;\n}\n\n/**\n * \"New …\" (§5.7): a name, inline. Create makes it, and the person lands on its details page\n * where the rest is set up. Never a dead end: a refusal shows its reason under the field.\n */\nexport function InlineCreate({ level, parent, label, onCancel }: { level: ContextLevel; parent?: string; label: string; onCancel: () => void }) {\n const { t, navigate } = useShell();\n const [name, setName] = useState('');\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const field = useRef<HTMLInputElement>(null);\n const errorId = useId();\n\n useEffect(() => {\n field.current?.focus();\n }, []);\n\n const submit = async () => {\n const value = name.trim();\n if (value === '' || busy || level.createUrl === undefined) return;\n setBusy(true);\n setError(null);\n try {\n const created = await createItem(level.createUrl, value, parent);\n forgetLists();\n navigate(created.detailsUrl);\n } catch (failure) {\n setBusy(false);\n setError(failure instanceof ShellRequestError && failure.detail !== null ? failure.detail : t('It could not be created. Try again.'));\n }\n };\n\n return (\n <form\n className=\"cbx-create\"\n onSubmit={event => {\n event.preventDefault();\n void submit();\n }}\n onKeyDown={event => {\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n onCancel();\n }\n if (event.key === 'Tab') event.stopPropagation();\n }}\n >\n <label className=\"cbx-create-label\" htmlFor={`${errorId}-name`}>{label}</label>\n <div className=\"cbx-create-row\">\n <input\n ref={field}\n id={`${errorId}-name`}\n className=\"cbx-input\"\n value={name}\n onChange={event => setName(event.target.value)}\n placeholder={t('Name')}\n aria-invalid={error !== null}\n aria-describedby={error !== null ? errorId : undefined}\n disabled={busy}\n autoComplete=\"off\"\n />\n <button type=\"submit\" className=\"cbx-button cbx-button-primary\" disabled={busy || name.trim() === ''}>\n {busy ? t('Creating…') : t('Create')}\n </button>\n </div>\n {error !== null && <p id={errorId} className=\"cbx-create-error\" role=\"alert\">{error}</p>}\n </form>\n );\n}\n\n/**\n * A project click (§5.4): switch to it and keep the environment of the same name when it has\n * one, else its first. Its environments come from the kept list, or are loaded first.\n */\nexport async function pickKeepingEnvironment(outer: ContextLevel, inner: ContextLevel | undefined, item: ContextItem, switchTo: (chosen: Record<string, string>) => void): Promise<void> {\n if (inner === undefined) {\n switchTo({ [outer.key]: item.id });\n return;\n }\n let environment: ContextItem | undefined;\n try {\n environment = environmentFor(await fetchList(inner.listUrl, item.id), inner.current.name);\n } catch {\n environment = undefined;\n }\n switchTo(environment === undefined ? { [outer.key]: item.id } : { [outer.key]: item.id, [inner.key]: environment.id });\n}\n\n/** The organization menu (§5.3). */\nexport function OrganizationMenu({ level }: { level: ContextLevel }) {\n const { t, switchTo } = useShell();\n return (\n <div className=\"cbx-menu cbx-menu-org\">\n <LevelPane\n level={level}\n currentId={level.current.id}\n heading={pluralOf(level)}\n autoFocus\n createLabel={t('New {thing}', { thing: level.label.toLowerCase() })}\n onPick={item => switchTo({ [level.key]: item.id })}\n />\n </div>\n );\n}\n\n/**\n * The second trigger's menu (§5.4). With two levels it is the cascade: hovering or focusing a\n * project previews its environments on the right without switching; an environment switches\n * both; a project keeps the environment of the same name, else its first. With one level it\n * is a single pane. `parent` is the organization's id: every level below the first is listed\n * with `?parent=`, so an answer can never belong to another organization.\n */\nexport function CascadeMenu({ levels, parent }: { levels: ContextLevel[]; parent?: string }) {\n const { t, switchTo } = useShell();\n const [outer, inner] = levels as [ContextLevel, ContextLevel | undefined];\n const [preview, setPreview] = useState<ContextItem>(outer.current);\n const left = useRef<PaneHandle>(null);\n const right = useRef<PaneHandle>(null);\n\n if (inner === undefined) {\n return (\n <div className=\"cbx-menu cbx-menu-single\">\n <LevelPane\n level={outer}\n parent={parent}\n currentId={outer.current.id}\n heading={pluralOf(outer)}\n autoFocus\n createLabel={t('New {thing}', { thing: outer.label.toLowerCase() })}\n onPick={item => switchTo({ [outer.key]: item.id })}\n />\n </div>\n );\n }\n\n const pickOuter = (item: ContextItem) => pickKeepingEnvironment(outer, inner, item, switchTo);\n\n return (\n <div className=\"cbx-menu cbx-menu-cascade\">\n <LevelPane\n handle={left}\n level={outer}\n parent={parent}\n currentId={outer.current.id}\n heading={pluralOf(outer)}\n autoFocus\n chevron\n createLabel={t('New {thing}', { thing: outer.label.toLowerCase() })}\n onPick={item => void pickOuter(item)}\n onPreview={setPreview}\n onArrowRight={() => {\n right.current?.focus();\n return true;\n }}\n />\n <LevelPane\n key={preview.id}\n handle={right}\n className=\"cbx-pane-inner\"\n level={inner}\n parent={preview.id}\n currentId={preview.id === outer.current.id ? inner.current.id : undefined}\n heading={t('{things} in {name}', { things: pluralOf(inner), name: preview.name })}\n viewAll={false}\n searchable={false}\n createLabel={t('New {thing} in {name}', { thing: inner.label.toLowerCase(), name: preview.name })}\n onPick={item => switchTo({ [outer.key]: preview.id, [inner.key]: item.id })}\n onArrowLeft={() => left.current?.focus()}\n />\n </div>\n );\n}\n\n/** The trigger text of the second trigger: `Webshop · ■ Production`. */\nexport function CascadeLabel({ levels }: { levels: ContextLevel[] }): ReactNode {\n const [outer, inner] = levels as [ContextLevel, ContextLevel | undefined];\n const outerIsEnvironment = isEnvironmentLevel(outer);\n return (\n <>\n {outerIsEnvironment ? <ToneSquare tone={outer.current.tone} /> : <Chip item={outer.current} />}\n <span className=\"cbx-trigger-text\" title={outer.current.name}>{outer.current.name}</span>\n {inner !== undefined && (\n <>\n <span className=\"cbx-trigger-dot\" aria-hidden=\"true\">·</span>\n <span className=\"cbx-trigger-env\">\n <ToneSquare tone={inner.current.tone} />\n <span className=\"cbx-trigger-text\" title={inner.current.name}>{inner.current.name}</span>\n </span>\n </>\n )}\n </>\n );\n}\n","/**\n * Help's state lives outside React (§7.1): open or closed, what it shows, the search, the scroll\n * position and the support updates survive an Inertia visit and even a remount of the shell,\n * like a browser side panel. The conversation itself lives in the `<cbox-support>` element, which\n * survives as long as the shell sits in the host's persistent layout.\n */\n\nimport { safeUrl } from './data';\n\nexport type HelpArticle = { id: string; title: string; excerpt?: string; body?: string; url?: string; source?: string };\n\nexport type SupportUpdate = { id: string; kind: 'ticket' | 'chat'; title: string; excerpt?: string; at?: string; unread: boolean; url?: string };\n\nexport type HelpStatus = 'idle' | 'loading' | 'ready' | 'unavailable';\n\nexport type HelpState = {\n open: boolean;\n /** The article shown instead of the home view, or null. */\n article: HelpArticle | null;\n query: string;\n scrollTop: number;\n updates: SupportUpdate[];\n updatesStatus: HelpStatus;\n /** A question waiting for the chat to be ready (\"Ask Cbox: …\" from the palette). */\n pendingQuestion: string | null;\n /** Whether `open` was taken from the person's saved preference yet. */\n seeded: boolean;\n /**\n * `open` came from the saved preference, not from the person on this page. Help left open\n * shows docked from 1280px; below that it waits until the person opens it, so a phone or a\n * narrow window never lands under the full-screen overlay.\n */\n restored: boolean;\n /** Which list the support updates came from (URL and organization), so a switch reloads them. */\n updatesKey: string | null;\n};\n\nexport type HelpStore = {\n get(): HelpState;\n set(patch: Partial<HelpState> | ((state: HelpState) => Partial<HelpState>)): void;\n subscribe(listener: () => void): () => void;\n};\n\nexport const INITIAL_HELP_STATE: HelpState = {\n open: false,\n article: null,\n query: '',\n scrollTop: 0,\n updates: [],\n updatesStatus: 'idle',\n pendingQuestion: null,\n seeded: false,\n restored: false,\n updatesKey: null,\n};\n\n/** Whether Help is on screen: open, and either docked or opened by the person on this page. */\nexport function helpVisible(state: Pick<HelpState, 'open' | 'restored'>, docked: boolean): boolean {\n return state.open && (docked || !state.restored);\n}\n\nexport function createHelpStore(initial: Partial<HelpState> = {}): HelpStore {\n let state: HelpState = { ...INITIAL_HELP_STATE, ...initial };\n const listeners = new Set<() => void>();\n return {\n get: () => state,\n set(patch) {\n const next = typeof patch === 'function' ? patch(state) : patch;\n state = { ...state, ...next };\n listeners.forEach(listener => listener());\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n };\n}\n\nlet browserStore: HelpStore | null = null;\n\n/**\n * The page's one store. On the server every render gets a fresh one, so two people's requests\n * never share Help state.\n */\nexport function sharedHelpStore(): HelpStore {\n if (typeof window === 'undefined') return createHelpStore();\n browserStore ??= createHelpStore();\n return browserStore;\n}\n\nexport function parseUpdates(body: unknown): SupportUpdate[] {\n const rows = Array.isArray(body) ? body : typeof body === 'object' && body !== null && Array.isArray((body as { data?: unknown }).data) ? (body as { data: unknown[] }).data : [];\n return rows.flatMap((value: unknown) => {\n if (typeof value !== 'object' || value === null) return [];\n const row = value as Record<string, unknown>;\n if ((typeof row.id !== 'string' && typeof row.id !== 'number') || typeof row.title !== 'string') return [];\n const update: SupportUpdate = {\n id: String(row.id),\n kind: row.kind === 'chat' ? 'chat' : 'ticket',\n title: row.title,\n unread: row.unread === true || row.read === false || (row.read_at === null && row.unread !== false),\n };\n if (typeof row.excerpt === 'string') update.excerpt = row.excerpt;\n const at = row.at ?? row.updated_at ?? row.created_at;\n if (typeof at === 'string') update.at = at;\n const url = safeUrl(row.url);\n if (url !== undefined) update.url = url;\n return [update];\n });\n}\n\nexport function parseArticles(body: unknown): HelpArticle[] {\n const rows = Array.isArray(body) ? body : typeof body === 'object' && body !== null && Array.isArray((body as { data?: unknown }).data) ? (body as { data: unknown[] }).data : [];\n return rows.flatMap((value: unknown) => {\n if (typeof value !== 'object' || value === null) return [];\n const row = value as Record<string, unknown>;\n if ((typeof row.id !== 'string' && typeof row.id !== 'number') || typeof row.title !== 'string') return [];\n const article: HelpArticle = { id: String(row.id), title: row.title };\n if (typeof row.excerpt === 'string') article.excerpt = row.excerpt;\n if (typeof row.body === 'string') article.body = row.body;\n const url = safeUrl(row.url);\n if (url !== undefined) article.url = url;\n if (typeof row.source === 'string') article.source = row.source;\n return [article];\n });\n}\n","import { ArrowLeft, ArrowUpRight, BookOpen, CircleAlert, LifeBuoy, MessageSquare, Search, Sparkles, Ticket, UserRound, X } from 'lucide-react';\nimport { createElement, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore, type FormEvent } from 'react';\nimport { requestJson, withQuery } from './data';\nimport { helpVisible, parseArticles, parseUpdates, type HelpArticle, type HelpState, type HelpStore, type SupportUpdate } from './help-store';\nimport { useShell } from './context';\nimport { canAutofocus } from './media';\nimport { trapTab } from './popover';\nimport { DEBOUNCE_MS } from './use-list';\nimport type { Shell } from './types';\n\nexport const DEFAULT_SUPPORT_SCRIPT = '/ai-assistant/support.js';\nconst SUPPORT_TAG = 'cbox-support';\n\nexport function useHelpState<T>(store: HelpStore, select: (state: HelpState) => T): T {\n return useSyncExternalStore(store.subscribe, () => select(store.get()), () => select(store.get()));\n}\n\n/** The page intent the chat is given (§7.2.4): route, title and context. */\nexport type PageIntent = { route?: string; title?: string; context: string; url?: string };\n\nexport function contextTrail(shell: Shell): string {\n return shell.context.levels.map(level => level.current.name).join(' / ');\n}\n\nexport function pageIntent(shell: Shell): PageIntent {\n const intent: PageIntent = { context: contextTrail(shell) };\n if (shell.page?.route !== undefined) intent.route = shell.page.route;\n if (shell.page?.title !== undefined) intent.title = shell.page.title;\n if (typeof window !== 'undefined') intent.url = window.location.pathname;\n return intent;\n}\n\n/** The Assistant SDK's element, with the methods a newer SDK may add. */\ntype SupportElement = HTMLElement & {\n open?: () => unknown;\n ask?: (question: string, intent?: PageIntent) => unknown;\n handover?: () => unknown;\n intent?: PageIntent;\n};\n\nfunction ensureScript(src: string): void {\n if (typeof document === 'undefined' || customElements.get(SUPPORT_TAG) !== undefined) return;\n if (Array.from(document.scripts).some(script => script.getAttribute('src') === src)) return;\n const script = document.createElement('script');\n script.src = src;\n script.defer = true;\n document.head.append(script);\n}\n\n/** Wait for the SDK's element to be defined and in place, up to `timeoutMs`. */\nfunction whenSupportReady(host: HTMLElement | null, timeoutMs = 6000): Promise<SupportElement | null> {\n return new Promise(resolve => {\n const started = Date.now();\n const attempt = () => {\n const element = host?.querySelector<SupportElement>(SUPPORT_TAG) ?? null;\n if (element !== null && typeof element.open === 'function') {\n resolve(element);\n return;\n }\n if (Date.now() - started >= timeoutMs) {\n resolve(null);\n return;\n }\n setTimeout(attempt, 150);\n };\n attempt();\n });\n}\n\n/**\n * The Help column (§7): support updates, docs search, articles for this page, Ask Cbox and a way\n * to a person. Docked beside the page from 1280px, a full-screen dialog below. It is always\n * mounted while the shell is, so its state and the conversation survive page changes.\n */\nexport function HelpColumn({ docked }: { docked: boolean }) {\n const { shell, t, help: store, toggleHelp, navigate, preferences } = useShell();\n const formatDate = useShortDate(preferences.regionalFormat ?? preferences.locale, preferences.timeZone);\n const open = useHelpState(store, state => helpVisible(state, docked));\n const restored = useHelpState(store, state => state.open && state.restored);\n const article = useHelpState(store, state => state.article);\n const query = useHelpState(store, state => state.query);\n const updates = useHelpState(store, state => state.updates);\n const updatesStatus = useHelpState(store, state => state.updatesStatus);\n const pendingQuestion = useHelpState(store, state => state.pendingQuestion);\n const [articles, setArticles] = useState<{ topic: string | undefined; items: HelpArticle[]; status: 'loading' | 'ready' | 'unavailable' }>({ topic: undefined, items: [], status: 'loading' });\n const [results, setResults] = useState<{ q: string; items: HelpArticle[]; status: 'loading' | 'ready' | 'unavailable' } | null>(null);\n const [question, setQuestion] = useState('');\n const [chatProblem, setChatProblem] = useState(false);\n const column = useRef<HTMLDivElement>(null);\n const body = useRef<HTMLDivElement>(null);\n const chatHost = useRef<HTMLDivElement>(null);\n const searchField = useRef<HTMLInputElement>(null);\n const opener = useRef<HTMLElement | null>(null);\n const { help } = shell;\n const portal = help.portalUrl;\n\n // Support updates are per person per organization (§7.3). They feed the button's count, so\n // they load after the first paint, open or not, and again when the URL or organization\n // changes: the store outlives Inertia visits, so an org switch must not keep the old count.\n const updatesKey = help.enabled && help.updatesUrl !== undefined ? `${help.updatesUrl}|${shell.context.levels[0]?.current.id ?? ''}` : null;\n const loadUpdates = useCallback(() => {\n if (updatesKey === null || help.updatesUrl === undefined) return;\n const current = () => store.get().updatesKey === updatesKey;\n store.set({ updatesStatus: 'loading', updatesKey });\n requestJson(help.updatesUrl)\n .then(answer => {\n if (current()) store.set({ updates: parseUpdates(answer), updatesStatus: 'ready' });\n })\n .catch(() => {\n if (current()) store.set({ updatesStatus: 'unavailable' });\n });\n }, [updatesKey, help.updatesUrl, store]);\n useEffect(() => {\n const state = store.get();\n if (state.updatesKey !== updatesKey) {\n store.set({ updates: [], updatesStatus: 'idle', updatesKey });\n loadUpdates();\n } else if (state.updatesStatus === 'idle') loadUpdates();\n }, [updatesKey, loadUpdates, store]);\n useEffect(() => {\n if (open && store.get().updatesStatus !== 'loading') loadUpdates();\n }, [open]);\n\n // Articles for this page's topic.\n useEffect(() => {\n if (!open || !help.enabled || help.articlesUrl === undefined || help.topic === undefined) return;\n if (articles.topic === help.topic && articles.status === 'ready') return;\n const controller = new AbortController();\n setArticles({ topic: help.topic, items: [], status: 'loading' });\n requestJson(help.articlesUrl.split('{topic}').join(encodeURIComponent(help.topic)), { signal: controller.signal })\n .then(answer => setArticles({ topic: help.topic, items: parseArticles(answer).slice(0, 3), status: 'ready' }))\n .catch((error: unknown) => {\n if ((error as { name?: string })?.name !== 'AbortError') setArticles({ topic: help.topic, items: [], status: 'unavailable' });\n });\n return () => controller.abort();\n }, [open, help.enabled, help.articlesUrl, help.topic]);\n\n // Docs search, debounced like the palette.\n useEffect(() => {\n const q = query.trim();\n if (!help.enabled || help.searchUrl === undefined || q === '') {\n setResults(null);\n return;\n }\n const controller = new AbortController();\n const timer = setTimeout(() => {\n setResults(current => ({ q, items: current?.items ?? [], status: 'loading' }));\n requestJson(withQuery(help.searchUrl!, { q, topic: help.topic }), { signal: controller.signal })\n .then(answer => setResults({ q, items: parseArticles(answer), status: 'ready' }))\n .catch((error: unknown) => {\n if ((error as { name?: string })?.name !== 'AbortError') setResults({ q, items: [], status: 'unavailable' });\n });\n }, DEBOUNCE_MS);\n return () => {\n clearTimeout(timer);\n controller.abort();\n };\n }, [query, help.enabled, help.searchUrl, help.topic]);\n\n // The SDK script loads once Help is first opened: never before the page has painted.\n useEffect(() => {\n if (open && help.enabled && help.sessionUrl !== undefined) ensureScript(help.scriptUrl ?? DEFAULT_SUPPORT_SCRIPT);\n }, [open, help.enabled, help.sessionUrl, help.scriptUrl]);\n\n // The page intent follows navigation.\n const intent = pageIntent(shell);\n const intentJson = JSON.stringify(intent);\n useEffect(() => {\n const element = chatHost.current?.querySelector<SupportElement>(SUPPORT_TAG);\n if (element !== null && element !== undefined) element.intent = JSON.parse(intentJson) as PageIntent;\n }, [intentJson]);\n\n const openChat = useCallback(\n async (ask?: string, handover = false) => {\n setChatProblem(false);\n if (help.sessionUrl === undefined) {\n setChatProblem(true);\n return;\n }\n ensureScript(help.scriptUrl ?? DEFAULT_SUPPORT_SCRIPT);\n const element = await whenSupportReady(chatHost.current);\n if (element === null) {\n setChatProblem(true);\n return;\n }\n element.intent = JSON.parse(intentJson) as PageIntent;\n if (handover && typeof element.handover === 'function') void element.handover();\n else if (ask !== undefined && ask !== '' && typeof element.ask === 'function') void element.ask(ask, element.intent);\n else void element.open?.();\n },\n [help.sessionUrl, help.scriptUrl, intentJson],\n );\n\n useEffect(() => {\n if (pendingQuestion === null || !open) return;\n store.set({ pendingQuestion: null });\n setQuestion(pendingQuestion);\n void openChat(pendingQuestion);\n }, [pendingQuestion, open, openChat, store]);\n\n // Scroll position survives page changes.\n useLayoutEffect(() => {\n if (open && body.current !== null) body.current.scrollTop = store.get().scrollTop;\n }, [open, article, store]);\n\n // When the person opens Help, its search takes focus on a desktop. Help that was simply left\n // open never takes focus on a page load, unless it is the modal overlay, which must hold it.\n // When it closes, focus goes back to what opened it (the Help button or a page's `?`).\n const wasOpen = useRef(open);\n useEffect(() => {\n const opened = open && !wasOpen.current;\n const closed = !open && wasOpen.current;\n wasOpen.current = open;\n if (closed) {\n const active = document.activeElement;\n if (active === null || active === document.body || column.current?.contains(active)) {\n const back = opener.current?.isConnected ? opener.current : document.querySelector<HTMLElement>('.cbx-tools [aria-controls=\"cbx-help\"]');\n back?.focus();\n }\n opener.current = null;\n return;\n }\n if (!open) return;\n if (opened) {\n const active = document.activeElement;\n opener.current = active instanceof HTMLElement && active !== document.body && !column.current?.contains(active) ? active : null;\n }\n if (opened && canAutofocus() && store.get().article === null) searchField.current?.focus();\n else if (!docked && !column.current?.contains(document.activeElement)) column.current?.focus();\n }, [open, docked, store]);\n\n const markRead = (update: SupportUpdate) => {\n if (!update.unread) return;\n store.set(state => ({ updates: state.updates.map(item => (item.id === update.id ? { ...item, unread: false } : item)) }));\n if (help.updatesUrl !== undefined) requestJson(`${help.updatesUrl.replace(/\\/$/, '')}/${encodeURIComponent(update.id)}/read`, { method: 'POST' }).catch(() => undefined);\n };\n const openUpdate = (update: SupportUpdate) => {\n markRead(update);\n if (update.kind === 'chat') void openChat();\n else if (update.url !== undefined) navigate(update.url, { newTab: true });\n else if (portal !== undefined) navigate(portal, { newTab: true });\n };\n\n const unread = updates.filter(update => update.unread);\n const unavailable = !help.enabled || updatesStatus === 'unavailable' || articles.status === 'unavailable' || results?.status === 'unavailable';\n const trail = contextTrail(shell);\n\n const submit = (event: FormEvent) => {\n event.preventDefault();\n void openChat(question.trim());\n };\n\n return (\n <div\n ref={column}\n id=\"cbx-help\"\n className={`cbx-help ${docked ? 'is-docked' : 'is-overlay'}`}\n hidden={!open}\n data-restored={restored ? 'true' : undefined}\n aria-label={t('Help')}\n role={docked ? 'complementary' : 'dialog'}\n aria-modal={docked ? undefined : true}\n tabIndex={-1}\n onKeyDown={event => {\n if (event.key === 'Escape' && !event.defaultPrevented) {\n event.preventDefault();\n toggleHelp(false);\n }\n if (!docked) trapTab(event, column.current);\n }}\n >\n <div className=\"cbx-help-head\">\n {article !== null ? (\n <button type=\"button\" className=\"cbx-icon-button\" onClick={() => store.set({ article: null })} aria-label={t('Back to Help')}>\n <ArrowLeft size={18} strokeWidth={1.8} aria-hidden />\n </button>\n ) : (\n <LifeBuoy className=\"cbx-help-mark\" size={18} strokeWidth={1.8} aria-hidden />\n )}\n <h2 className=\"cbx-help-title\">{t('Help')}</h2>\n {portal !== undefined && (\n <a className=\"cbx-icon-button\" href={portal} target=\"_blank\" rel=\"noopener\" aria-label={t('Support portal (opens in a new tab)')} title={t('Support portal')}>\n <ArrowUpRight size={18} strokeWidth={1.8} aria-hidden />\n </a>\n )}\n <button type=\"button\" className=\"cbx-icon-button\" onClick={() => toggleHelp(false)} aria-label={t('Close Help')}>\n <X size={18} strokeWidth={1.8} aria-hidden />\n </button>\n </div>\n <p className=\"cbx-help-page\">\n <span className=\"cbx-help-page-label\">{t('On this page')}</span>\n <span className=\"cbx-truncate\" title={[shell.page?.title, trail].filter(Boolean).join(' · ')}>\n {shell.page?.title !== undefined && <strong>{shell.page.title}</strong>}\n {shell.page?.title !== undefined && trail !== '' && ' · '}\n {trail}\n </span>\n </p>\n <div ref={body} className=\"cbx-help-body\" onScroll={event => store.set({ scrollTop: event.currentTarget.scrollTop })}>\n {article !== null ? (\n <article className=\"cbx-help-article\">\n <h3>{article.title}</h3>\n {(article.body ?? article.excerpt ?? '').split(/\\n{2,}/).filter(Boolean).map((paragraph, index) => <p key={index}>{paragraph}</p>)}\n {article.url !== undefined && (\n <a className=\"cbx-link\" href={article.url} target=\"_blank\" rel=\"noopener\">\n {t('Open the full article')} <ArrowUpRight size={14} strokeWidth={1.8} aria-hidden />\n </a>\n )}\n </article>\n ) : (\n <>\n {unavailable && (\n <div className=\"cbx-help-notice\" role=\"status\">\n <CircleAlert size={16} strokeWidth={1.8} aria-hidden />\n <span>{help.enabled ? t('Help is not available right now. The rest of the app works as usual.') : t('Help is not available here yet.')}</span>\n {help.enabled && <button type=\"button\" className=\"cbx-link\" onClick={() => { loadUpdates(); setArticles(current => ({ ...current, status: 'loading', topic: undefined })); }}>{t('Try again')}</button>}\n </div>\n )}\n {unread.length > 0 || updates.length > 0 ? (\n <section className=\"cbx-help-section\" aria-labelledby=\"cbx-help-updates\">\n <div className=\"cbx-pane-heading\">\n <span id=\"cbx-help-updates\">{t('Support updates')}</span>\n {unread.length > 0 && <button type=\"button\" className=\"cbx-pane-all\" onClick={() => unread.forEach(markRead)}>{t('Mark all read')}</button>}\n </div>\n <ul className=\"cbx-list\" role=\"list\">\n {updates.map(update => (\n <li key={update.id}>\n <button type=\"button\" className={`cbx-update ${update.unread ? 'is-unread' : ''}`} onClick={() => openUpdate(update)}>\n {update.kind === 'chat' ? <MessageSquare size={16} strokeWidth={1.8} aria-hidden /> : <Ticket size={16} strokeWidth={1.8} aria-hidden />}\n <span className=\"cbx-update-text\">\n <span className=\"cbx-update-title cbx-truncate\" title={update.title}>{update.title}</span>\n {update.excerpt !== undefined && <span className=\"cbx-update-excerpt\">{update.excerpt}</span>}\n </span>\n <span className=\"cbx-update-meta\">\n {update.at !== undefined && <time dateTime={update.at}>{formatDate(update.at)}</time>}\n {update.unread && <span className=\"cbx-unread-dot\" aria-label={t('Unread')} />}\n </span>\n </button>\n </li>\n ))}\n </ul>\n </section>\n ) : null}\n <section className=\"cbx-help-section\" aria-label={t('Search docs and knowledge base')}>\n <div className=\"cbx-help-search\">\n <Search size={16} strokeWidth={1.8} aria-hidden />\n <input\n ref={searchField}\n type=\"search\"\n value={query}\n onChange={event => store.set({ query: event.target.value })}\n placeholder={t('Search docs and knowledge base')}\n aria-label={t('Search docs and knowledge base')}\n disabled={!help.enabled || help.searchUrl === undefined}\n />\n </div>\n {results !== null && (\n <ul className=\"cbx-list\" role=\"list\" aria-live=\"polite\">\n {results.items.map(item => (\n <li key={item.id}><ArticleRow article={item} /></li>\n ))}\n {results.status === 'ready' && results.items.length === 0 && <li className=\"cbx-list-note\">{t('Nothing matches “{query}”.', { query: results.q })}</li>}\n {results.status === 'loading' && results.items.length === 0 && <li className=\"cbx-list-note\">{t('Searching…')}</li>}\n </ul>\n )}\n </section>\n {help.topic !== undefined && articles.items.length > 0 && (\n <section className=\"cbx-help-section\" aria-labelledby=\"cbx-help-topic\">\n <div className=\"cbx-pane-heading\"><span id=\"cbx-help-topic\">{t('For this page')}</span></div>\n <ul className=\"cbx-list\" role=\"list\">\n {articles.items.map(item => <li key={item.id}><ArticleRow article={item} /></li>)}\n </ul>\n </section>\n )}\n <section className=\"cbx-help-section\" aria-labelledby=\"cbx-help-ask\">\n <div className=\"cbx-pane-heading\"><span id=\"cbx-help-ask\">{t('Ask Cbox')}</span></div>\n <form className=\"cbx-ask\" onSubmit={submit}>\n <textarea\n className=\"cbx-input\"\n rows={3}\n value={question}\n onChange={event => setQuestion(event.target.value)}\n placeholder={t('Ask about this page…')}\n aria-label={t('Ask Cbox')}\n disabled={!help.enabled || help.sessionUrl === undefined}\n onKeyDown={event => {\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) submit(event);\n }}\n />\n <button type=\"submit\" className=\"cbx-button cbx-button-primary\" disabled={!help.enabled || help.sessionUrl === undefined}>\n <Sparkles size={15} strokeWidth={1.8} aria-hidden /> {t('Ask')}\n </button>\n </form>\n {chatProblem && <p className=\"cbx-create-error\" role=\"alert\">{t('The chat could not be opened. Try again, or use the support portal.')}</p>}\n </section>\n </>\n )}\n {/* The chat element sits outside the home/article switch, so opening an article\n (from the palette, \"For this page\" or a search) never unmounts it and the\n conversation survives (§7.1). */}\n {help.enabled && help.sessionUrl !== undefined && (\n <div ref={chatHost} className=\"cbx-chat-host\" data-view={article !== null ? 'article' : 'home'}>\n {createElement(SUPPORT_TAG, { 'session-url': help.sessionUrl, intent: intentJson })}\n </div>\n )}\n </div>\n <div className=\"cbx-help-foot\">\n <button type=\"button\" className=\"cbx-row cbx-row-action\" onClick={() => void openChat(t('I would like to talk to a person.'), true)} disabled={!help.enabled || help.sessionUrl === undefined}>\n <UserRound size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{t('Talk to a person')}</span>\n </button>\n {portal !== undefined && (\n <a className=\"cbx-row cbx-row-action\" href={portal} target=\"_blank\" rel=\"noopener\">\n <BookOpen size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{t('Support portal')}</span>\n <ArrowUpRight className=\"cbx-row-trail\" size={14} strokeWidth={1.8} aria-hidden />\n </a>\n )}\n </div>\n </div>\n );\n}\n\n/** \"10 Nov, 10:12\" in the person's regional format and time zone (Cbox ID's preferences). */\nexport function useShortDate(locale: string | undefined, timeZone: string | undefined): (iso: string) => string {\n const format = useMemo(() => {\n const options: Intl.DateTimeFormatOptions = { day: 'numeric', month: 'short', hour: '2-digit', minute: '2-digit' };\n try {\n return new Intl.DateTimeFormat(locale, { ...options, timeZone });\n } catch {\n return new Intl.DateTimeFormat(undefined, options);\n }\n }, [locale, timeZone]);\n return useCallback((iso: string) => {\n const date = new Date(iso);\n return Number.isNaN(date.getTime()) ? iso : format.format(date);\n }, [format]);\n}\n\nfunction ArticleRow({ article }: { article: HelpArticle }) {\n const { openArticle } = useShell();\n return (\n <button type=\"button\" className=\"cbx-update\" onClick={() => openArticle(article)}>\n <BookOpen size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-update-text\">\n <span className=\"cbx-update-title cbx-truncate\" title={article.title}>{article.title}</span>\n {article.excerpt !== undefined && <span className=\"cbx-update-excerpt\">{article.excerpt}</span>}\n </span>\n </button>\n );\n}\n","import type { ComponentType } from 'react';\nimport {\n Activity,\n BarChart3,\n Bell,\n BookOpen,\n Boxes,\n Briefcase,\n Building2,\n Calendar,\n Circle,\n Clock,\n Cloud,\n Code,\n CreditCard,\n Database,\n FileText,\n Folder,\n GitBranch,\n Globe,\n HardDrive,\n Home,\n Inbox,\n Key,\n LayoutDashboard,\n LayoutGrid,\n Layers,\n LifeBuoy,\n List,\n Lock,\n Mail,\n MessageSquare,\n Network,\n Package,\n Percent,\n Plug,\n Receipt,\n Rocket,\n Search,\n Send,\n Server,\n Settings,\n Shield,\n ShieldCheck,\n Sparkles,\n Tag,\n Timer,\n Users,\n Wallet,\n Webhook,\n Zap,\n} from 'lucide-react';\n\nexport type ShellIcon = ComponentType<{ size?: number; strokeWidth?: number; className?: string; 'aria-hidden'?: boolean }>;\n\n/** Lucide names an app can use for areas, pages and actions without shipping its own map. */\nexport const SHELL_ICONS: Readonly<Record<string, ShellIcon>> = {\n activity: Activity,\n 'bar-chart': BarChart3,\n bell: Bell,\n 'book-open': BookOpen,\n boxes: Boxes,\n briefcase: Briefcase,\n building: Building2,\n calendar: Calendar,\n clock: Clock,\n cloud: Cloud,\n code: Code,\n 'credit-card': CreditCard,\n database: Database,\n 'file-text': FileText,\n folder: Folder,\n 'git-branch': GitBranch,\n globe: Globe,\n 'hard-drive': HardDrive,\n home: Home,\n inbox: Inbox,\n key: Key,\n 'layout-dashboard': LayoutDashboard,\n 'layout-grid': LayoutGrid,\n layers: Layers,\n 'life-buoy': LifeBuoy,\n list: List,\n lock: Lock,\n mail: Mail,\n 'message-square': MessageSquare,\n network: Network,\n package: Package,\n percent: Percent,\n plug: Plug,\n receipt: Receipt,\n rocket: Rocket,\n search: Search,\n send: Send,\n server: Server,\n settings: Settings,\n shield: Shield,\n 'shield-check': ShieldCheck,\n sparkles: Sparkles,\n tag: Tag,\n timer: Timer,\n users: Users,\n wallet: Wallet,\n webhook: Webhook,\n zap: Zap,\n};\n\n/** The icon for a name: the host's map first, then the built-in one, then a plain circle. */\nexport function resolveIcon(name: string | undefined, extra: Readonly<Record<string, ShellIcon>> = {}): ShellIcon {\n if (name === undefined) return Circle;\n return extra[name] ?? SHELL_ICONS[name] ?? Circle;\n}\n","import { Lock } from 'lucide-react';\nimport { useId, type ReactNode } from 'react';\nimport { useShell } from './context';\nimport type { NavPage } from './types';\n\n/** A nav entry's URL: `url`, or `href` as laravel-console-kit 0.2 sends it. */\nexport function navUrl(entry: { url?: string; href?: string }): string {\n return entry.url ?? entry.href ?? '#';\n}\n\nexport type NavPageGroup = { group?: string; pages: NavPage[] };\n\n/**\n * An area's pages in runs under their group heading. Pages of one group are kept together,\n * in the order each group first appears; pages without a group form a run of their own.\n */\nexport function groupPages(pages: readonly NavPage[]): NavPageGroup[] {\n const runs = new Map<string, NavPageGroup>();\n for (const page of pages) {\n const key = page.group === undefined || page.group === '' ? '' : `g:${page.group}`;\n const run = runs.get(key) ?? { group: key === '' ? undefined : page.group, pages: [] };\n run.pages.push(page);\n runs.set(key, run);\n }\n return Array.from(runs.values());\n}\n\n/** The marks after a nav page's label: a lock (with \"(locked)\" for screen readers) and the count. */\nexport function NavPageMarks({ page }: { page: NavPage }) {\n const { t } = useShell();\n return (\n <>\n {page.locked === true && (\n <span className=\"cbx-nav-lock\" title={t('Not in your plan')}>\n <Lock size={13} strokeWidth={1.9} aria-hidden />\n <span className=\"cbx-sr-only\">{t('(locked)')}</span>\n </span>\n )}\n {page.locked !== true && page.count !== undefined && page.count > 0 && <span className=\"cbx-nav-count\">{page.count > 999 ? '999+' : page.count}</span>}\n </>\n );\n}\n\n/**\n * An area's pages, under their group headings when they have any. `renderPage` draws one link;\n * each group is an ARIA group named by its heading.\n */\nexport function NavPageList({ pages, renderPage }: { pages: readonly NavPage[]; renderPage: (page: NavPage) => ReactNode }) {\n const id = useId();\n const runs = groupPages(pages);\n if (runs.every(run => run.group === undefined)) return <>{pages.map(renderPage)}</>;\n return (\n <>\n {runs.map((run, index) =>\n run.group === undefined ? (\n <div key={`run-${index}`} className=\"cbx-nav-run\">{run.pages.map(renderPage)}</div>\n ) : (\n <div key={`run-${index}`} role=\"group\" aria-labelledby={`${id}-${index}`} className=\"cbx-nav-run\">\n <div id={`${id}-${index}`} className=\"cbx-nav-group\">{run.group}</div>\n {run.pages.map(renderPage)}\n </div>\n ),\n )}\n </>\n );\n}\n","import { ArrowLeft, Bell, LayoutGrid, X } from 'lucide-react';\nimport { useEffect, useRef, useState, type ReactNode } from 'react';\nimport { AccountMenu } from './account-menu';\nimport { AppGrid } from './app-grid';\nimport { LevelPane, pickKeepingEnvironment } from './context-menus';\nimport { useShell } from './context';\nimport { pluralOf } from './data';\nimport { resolveIcon } from './icons';\nimport { NavPageList, NavPageMarks, navUrl } from './nav-pages';\nimport { trapTab } from './popover';\n\n/**\n * A modal sheet for the phone layout (§4.5): it traps focus, closes on Escape and on the scrim,\n * and gives focus back to what opened it.\n */\nexport function Sheet({ label, side, onClose, children, head }: { label: string; side: 'left' | 'bottom'; onClose: () => void; children: ReactNode; head?: ReactNode }) {\n const { t } = useShell();\n const panel = useRef<HTMLDivElement>(null);\n const opener = useRef<Element | null>(typeof document !== 'undefined' ? document.activeElement : null);\n useEffect(() => {\n panel.current?.focus();\n const back = opener.current;\n return () => {\n if (back instanceof HTMLElement) back.focus();\n };\n }, []);\n return (\n <div className=\"cbx-overlay cbx-sheet-backdrop\" onPointerDown={event => { if (event.target === event.currentTarget) onClose(); }}>\n <div\n ref={panel}\n className={`cbx-sheet cbx-sheet-${side}`}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={label}\n tabIndex={-1}\n onKeyDown={event => {\n if (event.key === 'Escape' && !event.defaultPrevented) {\n event.preventDefault();\n onClose();\n }\n trapTab(event, panel.current);\n }}\n >\n <div className=\"cbx-sheet-head\">\n {head ?? <strong className=\"cbx-sheet-title\">{label}</strong>}\n <button type=\"button\" className=\"cbx-icon-button\" onClick={onClose} aria-label={t('Close')}>\n <X size={18} strokeWidth={1.8} aria-hidden />\n </button>\n </div>\n <div className=\"cbx-sheet-body\">{children}</div>\n </div>\n </div>\n );\n}\n\n/** ☰: areas with their pages, Switch app, notifications when the app has them, and the account. */\nexport function NavSheet({ onClose }: { onClose: () => void }) {\n const { shell, t, Link, icons } = useShell();\n const [view, setView] = useState<'nav' | 'apps'>('nav');\n if (view === 'apps') {\n return (\n <Sheet\n label={t('Switch app')}\n side=\"left\"\n onClose={onClose}\n head={\n <button type=\"button\" className=\"cbx-row cbx-row-action cbx-back\" onClick={() => setView('nav')}>\n <ArrowLeft size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{t('Switch app')}</span>\n </button>\n }\n >\n <AppGrid autoFocus={false} />\n </Sheet>\n );\n }\n return (\n <Sheet label={shell.app.name} side=\"left\" onClose={onClose}>\n <nav aria-label={t('Navigation')} className=\"cbx-list\">\n {shell.nav.areas.map(area => {\n const Icon = resolveIcon(area.icon, icons);\n const activeArea = area.key === shell.nav.activeArea;\n return (\n <div key={area.key} className=\"cbx-sheet-area\">\n <Link href={navUrl(area)} className={`cbx-row cbx-row-action ${activeArea ? ((area.pages ?? []).length > 1 ? 'is-open' : 'is-current') : ''}`} aria-current={activeArea && (area.pages ?? []).length <= 1 ? 'page' : undefined} onClick={onClose}>\n <Icon size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{area.label}</span>\n </Link>\n {(area.pages ?? []).length > 1 && (\n <div className=\"cbx-sheet-pages\">\n <NavPageList\n pages={area.pages ?? []}\n renderPage={page => {\n const on = activeArea && page.key === shell.nav.activePage;\n return (\n <Link key={page.key} href={navUrl(page)} className={`cbx-row cbx-row-action ${on ? 'is-current' : ''} ${page.locked === true ? 'is-locked' : ''}`} aria-current={on ? 'page' : undefined} data-locked={page.locked === true ? 'true' : undefined} onClick={onClose}>\n <span className=\"cbx-row-name\">{page.label}</span>\n <NavPageMarks page={page} />\n </Link>\n );\n }}\n />\n </div>\n )}\n </div>\n );\n })}\n </nav>\n <div className=\"cbx-list cbx-list-foot\">\n <button type=\"button\" className=\"cbx-row cbx-row-action\" onClick={() => setView('apps')}>\n <LayoutGrid size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{t('Switch app')}</span>\n </button>\n {shell.notifications.enabled && (\n <Link href={shell.notifications.url} className=\"cbx-row cbx-row-action\" onClick={onClose}>\n <Bell size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{t('Notifications')}</span>\n {shell.notifications.unread > 0 && <span className=\"cbx-count is-inline\">{shell.notifications.unread}</span>}\n </Link>\n )}\n </div>\n <AccountMenu inline onDone={onClose} />\n </Sheet>\n );\n}\n\n/** The one context button's sheet: every level stacked, each with search and \"New …\" (§4.5). */\nexport function ContextSheet({ onClose }: { onClose: () => void }) {\n const { shell, t, switchTo } = useShell();\n const [organization, outer, inner] = shell.context.levels;\n return (\n <Sheet label={t('Where you are')} side=\"bottom\" onClose={onClose}>\n {organization !== undefined && (\n <section className=\"cbx-sheet-level\" aria-label={organization.label}>\n <LevelPane\n level={organization}\n currentId={organization.current.id}\n heading={pluralOf(organization)}\n createLabel={t('New {thing}', { thing: organization.label.toLowerCase() })}\n onPick={item => switchTo({ [organization.key]: item.id })}\n />\n </section>\n )}\n {outer !== undefined && (\n <section className=\"cbx-sheet-level\" aria-label={outer.label}>\n <LevelPane\n level={outer}\n parent={organization?.current.id}\n currentId={outer.current.id}\n heading={pluralOf(outer)}\n createLabel={t('New {thing}', { thing: outer.label.toLowerCase() })}\n onPick={item => void pickKeepingEnvironment(outer, inner, item, switchTo)}\n />\n </section>\n )}\n {outer !== undefined && inner !== undefined && (\n <section className=\"cbx-sheet-level\" aria-label={inner.label}>\n <LevelPane\n level={inner}\n parent={outer.current.id}\n currentId={inner.current.id}\n heading={t('{things} in {name}', { things: pluralOf(inner), name: outer.current.name })}\n createLabel={t('New {thing} in {name}', { thing: inner.label.toLowerCase(), name: outer.current.name })}\n onPick={item => switchTo({ [outer.key]: outer.current.id, [inner.key]: item.id })}\n />\n </section>\n )}\n </Sheet>\n );\n}\n","import { ArrowRight, BookOpen, Building2, CornerDownLeft, FileText, Search, Sparkles, Zap } from 'lucide-react';\nimport { useEffect, useId, useMemo, useRef, useState, type KeyboardEvent, type ReactNode } from 'react';\nimport { initialsOf, requestJson, safeUrl, withQuery } from './data';\nimport { parseArticles, type HelpArticle } from './help-store';\nimport { resolveIcon } from './icons';\nimport { navUrl } from './nav-pages';\nimport { canAutofocus } from './media';\nimport { revealInList, trapTab } from './popover';\nimport { useShell } from './context';\nimport { DEBOUNCE_MS } from './use-list';\nimport type { Shell } from './types';\n\nexport const GROUP_LIMIT = 5;\n\nexport type PaletteGroupKey = 'pages' | 'records' | 'actions' | 'goto' | 'docs' | 'ask';\n\n/** One result. `run` does what Enter does; `href` is what ⌘Enter opens in a new tab. */\nexport type PaletteItem = {\n id: string;\n title: string;\n subtitle?: string;\n icon?: ReactNode;\n href?: string;\n run: (newTab: boolean) => void;\n};\n\ntype GroupState = { status: 'idle' | 'loading' | 'ready' | 'error'; items: PaletteItem[] };\n\n/** Matches `query` against words: every term must be found. Ranks prefix matches first. */\nexport function matchScore(text: string, query: string): number {\n const haystack = text.toLowerCase();\n const terms = query.toLowerCase().trim().split(/\\s+/).filter(Boolean);\n if (terms.length === 0) return 1;\n let score = 0;\n for (const term of terms) {\n const at = haystack.indexOf(term);\n if (at < 0) return 0;\n score += at === 0 ? 3 : haystack[at - 1] === ' ' ? 2 : 1;\n }\n return score;\n}\n\nfunction localPages(shell: Shell, query: string, open: (url: string, newTab: boolean) => void, lockedLabel: string): PaletteItem[] {\n const entries: Array<{ id: string; title: string; subtitle?: string; url: string; icon?: string }> = [];\n for (const area of shell.nav.areas) {\n const areaUrl = navUrl(area);\n entries.push({ id: `area:${area.key}`, title: area.label, url: areaUrl, icon: area.icon });\n for (const page of area.pages ?? []) {\n const url = navUrl(page);\n if (url === areaUrl) continue;\n // A locked page is still found, and says so: it leads to the upgrade prompt.\n const subtitle = page.locked === true ? `${area.label} · ${lockedLabel}` : area.label;\n entries.push({ id: `page:${area.key}:${page.key}`, title: page.label, subtitle, url, icon: page.locked === true ? 'lock' : (page.icon ?? area.icon) });\n }\n }\n return entries\n .map(entry => ({ entry, score: matchScore(`${entry.title} ${entry.subtitle ?? ''}`, query) }))\n .filter(({ score }) => score > 0)\n .sort((a, b) => b.score - a.score)\n .map(({ entry }) => {\n const Icon = resolveIcon(entry.icon);\n return { id: entry.id, title: entry.title, subtitle: entry.subtitle, href: entry.url, icon: <Icon size={16} strokeWidth={1.8} aria-hidden />, run: (newTab: boolean) => open(entry.url, newTab) };\n });\n}\n\n/**\n * The rows of a list answer: a bare array, `{data: [...]}` (a context list), or console-kit's\n * search answer `{groups: [{key, items}]}`, of which `group`'s items.\n */\nfunction rows(body: unknown, group?: string): Array<Record<string, unknown>> {\n let data: unknown = Array.isArray(body) ? body : typeof body === 'object' && body !== null ? (body as { data?: unknown }).data : null;\n if (data === undefined && group !== undefined && typeof body === 'object' && body !== null) {\n const groups = (body as { groups?: unknown }).groups;\n const match = Array.isArray(groups) ? groups.find((g): g is { items?: unknown } => typeof g === 'object' && g !== null && (g as { key?: unknown }).key === group) : undefined;\n data = match?.items;\n }\n return Array.isArray(data) ? data.filter((row): row is Record<string, unknown> => typeof row === 'object' && row !== null) : [];\n}\n\n/**\n * ⌘K (§6): Pages, Records, Actions, Go to, Docs and Ask Cbox, in that order. Typing is\n * debounced 120 ms; the server groups load in parallel, each on its own, so a slow group never\n * holds up the others. ↑↓ move, Enter opens, ⌘Enter opens in a new tab, Esc closes.\n */\nexport function CommandPalette({ onClose }: { onClose: () => void }) {\n const { shell, t, navigate, switchTo, openArticle, ask } = useShell();\n const [input, setInput] = useState('');\n const [query, setQuery] = useState('');\n const [groups, setGroups] = useState<Partial<Record<PaletteGroupKey, GroupState>>>({});\n const [expanded, setExpanded] = useState<PaletteGroupKey | null>(null);\n // The active row is held by its id, not its place: a slow group arriving above it must not\n // move the highlight onto another result under a fast Enter (§12.1, nothing jumps).\n const [activeKey, setActiveKey] = useState<string | null>(null);\n const field = useRef<HTMLInputElement>(null);\n const dialog = useRef<HTMLDivElement>(null);\n const id = useId();\n const opener = useRef<Element | null>(typeof document !== 'undefined' ? document.activeElement : null);\n\n useEffect(() => {\n if (canAutofocus()) field.current?.focus();\n else dialog.current?.focus();\n const back = opener.current;\n return () => {\n if (back instanceof HTMLElement) back.focus();\n };\n }, []);\n\n useEffect(() => {\n const timer = setTimeout(() => setQuery(input), DEBOUNCE_MS);\n return () => clearTimeout(timer);\n }, [input]);\n\n // A new tab leaves the palette open, so the person can open several results.\n const open = (url: string, newTab: boolean) => {\n if (!newTab) onClose();\n navigate(url, { newTab });\n };\n\n // Server groups: each starts on its own and fills in when it answers.\n useEffect(() => {\n const q = query.trim();\n const controller = new AbortController();\n const run = (key: PaletteGroupKey, load: () => Promise<PaletteItem[]>) => {\n setGroups(current => ({ ...current, [key]: { status: 'loading', items: current[key]?.items ?? [] } }));\n load()\n .then(items => {\n if (!controller.signal.aborted) setGroups(current => ({ ...current, [key]: { status: 'ready', items } }));\n })\n .catch(() => {\n if (!controller.signal.aborted) setGroups(current => ({ ...current, [key]: { status: 'error', items: [] } }));\n });\n };\n const signal = controller.signal;\n if (q === '') {\n setGroups({});\n return () => controller.abort();\n }\n if (shell.palette.searchUrl !== undefined) {\n run('records', async () =>\n rows(await requestJson(withQuery(shell.palette.searchUrl!, { q, group: 'records' }), { signal }), 'records').flatMap(row => {\n const url = safeUrl(row.url);\n if (typeof row.title !== 'string' || url === undefined) return [];\n return [{ id: `record:${String(row.id ?? url)}`, title: row.title, subtitle: typeof row.subtitle === 'string' ? row.subtitle : undefined, href: url, icon: <FileText size={16} strokeWidth={1.8} aria-hidden />, run: (newTab: boolean) => open(url, newTab) }];\n }),\n );\n }\n const organization = shell.context.levels[0];\n run('goto', async () => {\n const loads: Array<Promise<PaletteItem[]>> = [];\n // console-kit answers \"Go to\" (organizations, and level 2 and 2 · 3 across them) from\n // its search endpoint; a host without one lists the organizations itself.\n const kitGoto = shell.palette.gotoUrl === undefined && shell.palette.searchUrl !== undefined;\n if (kitGoto) {\n loads.push(\n requestJson(withQuery(shell.palette.searchUrl!, { q, group: 'goto' }), { signal }).then(body =>\n rows(body, 'goto').flatMap(row => {\n const url = safeUrl(row.url);\n if (typeof row.title !== 'string' || url === undefined) return [];\n return [{ id: `goto:${String(row.id ?? url)}`, title: row.title, subtitle: typeof row.subtitle === 'string' ? row.subtitle : undefined, href: url, icon: <Building2 size={16} strokeWidth={1.8} aria-hidden />, run: (newTab: boolean) => open(url, newTab) }];\n }),\n ),\n );\n }\n if (organization !== undefined && !kitGoto) {\n loads.push(\n requestJson(withQuery(organization.listUrl, { q, limit: '5' }), { signal }).then(body =>\n rows(body).flatMap(row => {\n if ((typeof row.id !== 'string' && typeof row.id !== 'number') || typeof row.name !== 'string') return [];\n const orgId = String(row.id);\n return [{ id: `org:${orgId}`, title: row.name, subtitle: organization.label, icon: <span className=\"cbx-chip cbx-chip-soft\" aria-hidden=\"true\">{typeof row.initials === 'string' ? row.initials : initialsOf(row.name)}</span>, run: () => { onClose(); switchTo({ [organization.key]: orgId }); } }];\n }),\n ),\n );\n }\n if (shell.palette.gotoUrl !== undefined) {\n loads.push(\n requestJson(withQuery(shell.palette.gotoUrl, { q }), { signal }).then(body =>\n rows(body).flatMap(row => {\n if (typeof row.title !== 'string') return [];\n const levels = typeof row.levels === 'object' && row.levels !== null ? (row.levels as Record<string, string>) : null;\n const url = safeUrl(row.url);\n if (levels === null && url === undefined) return [];\n return [{ id: `goto:${row.title}:${String(row.subtitle ?? '')}`, title: row.title, subtitle: typeof row.subtitle === 'string' ? row.subtitle : undefined, href: url, icon: <Building2 size={16} strokeWidth={1.8} aria-hidden />, run: (newTab: boolean) => { if (levels !== null && !newTab) { onClose(); switchTo(levels); } else if (url !== undefined) open(url, newTab); } }];\n }),\n ),\n );\n }\n const settled = await Promise.allSettled(loads);\n if (settled.every(result => result.status === 'rejected') && settled.length > 0) throw new Error('unavailable');\n return settled.flatMap(result => (result.status === 'fulfilled' ? result.value : []));\n });\n if (shell.help.enabled && shell.help.searchUrl !== undefined) {\n run('docs', async () =>\n parseArticles(await requestJson(withQuery(shell.help.searchUrl!, { q, topic: shell.help.topic }), { signal })).map((article: HelpArticle) => ({\n id: `doc:${article.id}`,\n title: article.title,\n subtitle: article.excerpt,\n href: article.url,\n icon: <BookOpen size={16} strokeWidth={1.8} aria-hidden />,\n run: (newTab: boolean) => {\n if (newTab && article.url !== undefined) {\n navigate(article.url, { newTab: true });\n return;\n }\n onClose();\n openArticle(article);\n },\n })),\n );\n }\n return () => controller.abort();\n }, [query, shell]);\n\n const q = input.trim();\n const pages = useMemo(() => localPages(shell, q, open, t('Locked')), [shell, q, t]);\n const actions = useMemo<PaletteItem[]>(\n () =>\n shell.palette.actions\n .filter(action => matchScore(`${action.label} ${(action.keywords ?? []).join(' ')}`, q) > 0)\n .map(action => {\n const Icon = action.icon !== undefined ? resolveIcon(action.icon) : Zap;\n return {\n id: `action:${action.id}`,\n title: action.label,\n href: action.method === 'post' ? undefined : action.url,\n icon: <Icon size={16} strokeWidth={1.8} aria-hidden />,\n run: (newTab: boolean) => {\n if (!newTab) onClose();\n navigate(action.url, { method: action.method ?? 'get', newTab: newTab && action.method !== 'post' });\n },\n };\n }),\n [shell, q],\n );\n\n const sections: Array<{ key: PaletteGroupKey; label: string; state: GroupState }> = [\n { key: 'pages' as const, label: t('Pages'), state: { status: 'ready' as const, items: pages } },\n { key: 'records' as const, label: t('Records'), state: groups.records ?? { status: 'idle' as const, items: [] } },\n { key: 'actions' as const, label: t('Actions'), state: { status: 'ready' as const, items: actions } },\n { key: 'goto' as const, label: t('Go to'), state: groups.goto ?? { status: 'idle' as const, items: [] } },\n { key: 'docs' as const, label: t('Docs and help'), state: groups.docs ?? { status: 'idle' as const, items: [] } },\n ];\n if (q !== '') {\n sections.push({\n key: 'ask',\n label: t('Ask Cbox'),\n state: {\n status: 'ready',\n items: [{ id: 'ask', title: t('Ask Cbox: “{query}”', { query: q }), subtitle: t('About this page'), icon: <Sparkles size={16} strokeWidth={1.8} aria-hidden />, run: () => { onClose(); ask(q); } }],\n },\n });\n }\n\n // Flatten into options, with \"Show all in {group}\" after five.\n type Option = { kind: 'item'; item: PaletteItem; group: PaletteGroupKey } | { kind: 'all'; group: PaletteGroupKey; label: string };\n const options: Option[] = [];\n const rendered = sections.map(section => {\n const all = expanded === section.key;\n const items = all ? section.state.items : section.state.items.slice(0, GROUP_LIMIT);\n const start = options.length;\n items.forEach(item => options.push({ kind: 'item', item, group: section.key }));\n const more = !all && section.state.items.length > GROUP_LIMIT;\n if (more) options.push({ kind: 'all', group: section.key, label: t('Show all in {group}', { group: section.label }) });\n return { ...section, start, count: items.length + (more ? 1 : 0) };\n });\n\n const keyOf = (option: Option): string => (option.kind === 'item' ? `${option.group}:${option.item.id}` : `all:${option.group}`);\n const found = activeKey === null ? -1 : options.findIndex(option => keyOf(option) === activeKey);\n const active = found >= 0 ? found : 0;\n const setActive = (next: number | ((index: number) => number)) => {\n const index = typeof next === 'function' ? next(active) : next;\n const option = options[index];\n setActiveKey(option === undefined ? null : keyOf(option));\n };\n\n useEffect(() => {\n setActiveKey(null);\n }, [q]);\n // Pin the first result once there is one, so a group arriving above does not take its place.\n const firstKey = options[0] === undefined ? null : keyOf(options[0]);\n useEffect(() => {\n if (activeKey === null && firstKey !== null) setActiveKey(firstKey);\n }, [activeKey, firstKey]);\n useEffect(() => {\n revealInList(`${id}-${active}`);\n }, [active, id]);\n\n const choose = (option: Option | undefined, newTab: boolean) => {\n if (option === undefined) return;\n if (option.kind === 'all') {\n setExpanded(option.group);\n return;\n }\n if (newTab && option.item.href === undefined) return;\n option.item.run(newTab);\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const last = options.length - 1;\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n onClose();\n } else if (event.key === 'ArrowDown') {\n event.preventDefault();\n setActive(index => (index >= last ? 0 : index + 1));\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n setActive(index => (index <= 0 ? last : index - 1));\n } else if (event.key === 'Enter') {\n event.preventDefault();\n choose(options[active], event.metaKey || event.ctrlKey);\n } else {\n trapTab(event, dialog.current);\n }\n };\n\n const activeOption = options[active];\n return (\n <div className=\"cbx-overlay cbx-palette-backdrop\" onPointerDown={event => { if (event.target === event.currentTarget) onClose(); }}>\n <div ref={dialog} className=\"cbx-palette\" role=\"dialog\" aria-modal=\"true\" aria-label={t('Search')} tabIndex={-1} onKeyDown={onKeyDown}>\n <div className=\"cbx-palette-search\">\n <Search size={18} strokeWidth={1.8} aria-hidden />\n <input\n ref={field}\n type=\"search\"\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={`${id}-list`}\n aria-activedescendant={activeOption !== undefined ? `${id}-${active}` : undefined}\n aria-autocomplete=\"list\"\n aria-label={shell.palette.placeholder ?? t('Search or ask…')}\n placeholder={shell.palette.placeholder ?? t('Search or ask…')}\n value={input}\n onChange={event => setInput(event.target.value)}\n autoComplete=\"off\"\n spellCheck={false}\n />\n <kbd className=\"cbx-kbd\">Esc</kbd>\n </div>\n <div id={`${id}-list`} role=\"listbox\" aria-label={t('Results')} className=\"cbx-palette-list\">\n {rendered.map(section => {\n const loading = section.state.status === 'loading' && section.state.items.length === 0;\n if (section.count === 0 && !loading) return null;\n return (\n <div key={section.key} role=\"group\" aria-labelledby={`${id}-${section.key}`} className=\"cbx-palette-group\">\n <div id={`${id}-${section.key}`} className=\"cbx-pane-heading\" role=\"presentation\">\n <span>{section.label}</span>\n {section.state.status === 'loading' && <span className=\"cbx-palette-busy\" aria-hidden=\"true\" />}\n </div>\n {loading && <div className=\"cbx-list-note\" aria-live=\"polite\">{t('Searching…')}</div>}\n {options.slice(section.start, section.start + section.count).map((option, offset) => {\n const index = section.start + offset;\n const on = index === active;\n return (\n <div\n key={option.kind === 'item' ? option.item.id : `all:${option.group}`}\n id={`${id}-${index}`}\n role=\"option\"\n aria-selected={on}\n className={`cbx-row ${on ? 'is-active' : ''} ${option.kind === 'all' ? 'cbx-row-more' : ''}`}\n onMouseMove={() => setActive(index)}\n onClick={event => choose(option, event.metaKey || event.ctrlKey)}\n >\n {option.kind === 'item' ? (\n <>\n <span className=\"cbx-row-icon\">{option.item.icon}</span>\n <span className=\"cbx-row-name\" title={option.item.title}>{option.item.title}</span>\n {option.item.subtitle !== undefined && <span className=\"cbx-row-label cbx-truncate\">{option.item.subtitle}</span>}\n {on && <CornerDownLeft className=\"cbx-row-trail\" size={14} strokeWidth={1.8} aria-hidden />}\n </>\n ) : (\n <>\n <span className=\"cbx-row-icon\"><ArrowRight size={16} strokeWidth={1.8} aria-hidden /></span>\n <span className=\"cbx-row-name\">{option.label}</span>\n </>\n )}\n </div>\n );\n })}\n </div>\n );\n })}\n {options.length === 0 && q !== '' && <div className=\"cbx-list-note\">{t('Nothing matches “{query}”.', { query: q })}</div>}\n </div>\n <div className=\"cbx-palette-foot\" aria-hidden=\"true\">\n <span><kbd className=\"cbx-kbd\">↑</kbd><kbd className=\"cbx-kbd\">↓</kbd> {t('move')}</span>\n <span><kbd className=\"cbx-kbd\">↵</kbd> {t('open')}</span>\n <span><kbd className=\"cbx-kbd\">⌘↵</kbd> {t('new tab')}</span>\n </div>\n </div>\n </div>\n );\n}\n","import { Bell, ChevronsUpDown, CircleHelp, LayoutGrid, Menu, PanelLeftClose, PanelLeftOpen, Pin, PinOff, Search } from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useRef, useState, type AnchorHTMLAttributes, type ReactNode } from 'react';\nimport { useCboxLocalization } from '../context/localization';\nimport { useKnownAppCatalog } from '../components/app-icon';\nimport { AccountMenu, Avatar } from './account-menu';\nimport { AppGrid, forgetShellCatalog, hueFor } from './app-grid';\nimport { CascadeLabel, Chip, CascadeMenu, OrganizationMenu } from './context-menus';\nimport { ShellContext, useShell, type ShellApi, type ShellLinkComponent, type ShellOverlay } from './context';\nimport { initials } from '../app-switcher/catalog';\nimport { currentLocation, defaultNavigate, switchPayload } from './data';\nimport { HelpColumn, useHelpState } from './help';\nimport { helpVisible, sharedHelpStore, type HelpStore } from './help-store';\nimport { resolveIcon, type ShellIcon } from './icons';\nimport { HELP_DOCKED, MOBILE, matches, useMedia } from './media';\nimport { ContextSheet, NavSheet } from './mobile';\nimport { NavPageList, NavPageMarks, navUrl } from './nav-pages';\nimport { CommandPalette } from './palette';\nimport { Popover } from './popover';\nimport { scopeLists } from './use-list';\nimport type { Shell, ShellNavigate, ShellPreferenceChange, ShellPreferences, ShellTheme } from './types';\n\nexport type CboxShellProps = {\n /** The shared `shell` prop. */\n shell: Shell;\n /** The page. */\n children: ReactNode;\n /** How to move the person. Inertia: `(url, o) => router.visit(url, { method: o?.method, data: o?.data })`, plus `window.open` for `newTab`. Default: page loads and form posts. */\n navigate?: ShellNavigate;\n /** Client-side link for nav and settings links (Inertia's `Link`). Default `<a>`. */\n LinkComponent?: ShellLinkComponent;\n /** Extra icons by name, on top of the built-in Lucide set. */\n icons?: Readonly<Record<string, ShellIcon>>;\n /**\n * Called when the person changes a preference, for the host to persist (a cookie read before\n * first paint, and Cbox ID's preferences for theme, language, format and time zone). Without\n * it the shell writes a `cbox_shell_<key>` cookie.\n */\n onPreferenceChange?: ShellPreferenceChange;\n /** Help's state store. Default: one per page, so it outlives the shell's own remounts. */\n helpStore?: HelpStore;\n /** Where the Cbox wordmark is served. Default `/brand`. */\n brandAssetBase?: string;\n /** `id` of the `<main>` landmark, which the shell's \"Skip to content\" link targets. Default `main-content`. */\n mainId?: string;\n};\n\nconst PlainLink: ShellLinkComponent = ({ href, children, ...props }: AnchorHTMLAttributes<HTMLAnchorElement> & { href: string; children?: ReactNode }) => <a href={href} {...props}>{children}</a>;\n\nfunction writeCookie(key: string, value: unknown): void {\n if (typeof document === 'undefined') return;\n const name = `cbox_shell_${key.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`)}`;\n document.cookie = `${name}=${encodeURIComponent(String(value))}; path=/; max-age=31536000; SameSite=Lax`;\n}\n\n/**\n * Apply a theme choice to the document the way the tokens read it: `.dark` and `data-theme` on\n * the root, with `system` following the device. The saved choice stays `system`; the device's\n * scheme is never written back (cbox-design, shared preferences).\n */\nexport function applyTheme(theme: ShellTheme): void {\n if (typeof document === 'undefined') return;\n const dark = theme === 'dark' || (theme === 'system' && typeof window.matchMedia === 'function' && window.matchMedia('(prefers-color-scheme: dark)').matches);\n const root = document.documentElement;\n root.classList.toggle('dark', dark);\n root.dataset.theme = dark ? 'dark' : 'light';\n root.dataset.themePreference = theme;\n root.style.colorScheme = dark ? 'dark' : 'light';\n}\n\n/**\n * The inline script a host puts in `<head>` so the theme is right before the first paint\n * (§12.1). `theme` is the person's saved choice from the `shell` prop.\n */\nexport function themeBootScript(theme: ShellTheme): string {\n const safe = theme === 'dark' || theme === 'light' ? theme : 'system';\n return `(function(){var t='${safe}';var d=t==='dark'||(t==='system'&&window.matchMedia&&matchMedia('(prefers-color-scheme: dark)').matches);var r=document.documentElement;r.classList.toggle('dark',d);r.dataset.theme=d?'dark':'light';r.dataset.themePreference=t;r.style.colorScheme=d?'dark':'light';})();`;\n}\n\nfunction useIsMac(): boolean {\n const [mac, setMac] = useState(true);\n useEffect(() => {\n setMac(/Mac|iPhone|iPad/i.test(navigator.platform || navigator.userAgent));\n }, []);\n return mac;\n}\n\n/**\n * The one shell for every Cbox app (spec 2026-11-10 shell v1): rail with the account at the\n * bottom, subnav, header with the context selectors, Search, Help, the bell when the app has a\n * source, Switch app; the ⌘K palette; the Help column; and the phone layout.\n *\n * Render it in the host's persistent layout (Inertia `Page.layout`), so the rail, Help and the\n * chat survive page visits; only `shell` and `children` change.\n */\nexport function CboxShell({ shell, children, navigate = defaultNavigate, LinkComponent = PlainLink, icons = {}, onPreferenceChange, helpStore, brandAssetBase = '/brand', mainId = 'main-content' }: CboxShellProps) {\n const { t } = useCboxLocalization();\n const [store] = useState(() => helpStore ?? sharedHelpStore());\n const [preferences, setPreferences] = useState<ShellPreferences>(shell.preferences);\n const [overlay, setOverlay] = useState<ShellOverlay>(null);\n\n // Help starts as the person left it, once per page; later visits keep the live state. Left\n // open, it shows docked from 1280px; below that it waits for the person (see `restored`).\n if (!store.get().seeded) store.set({ open: shell.preferences.helpOpen, restored: shell.preferences.helpOpen, seeded: true });\n\n // A new `shell` prop from the server wins for the preferences it carries.\n const serverPreferences = JSON.stringify(shell.preferences);\n useEffect(() => {\n setPreferences(JSON.parse(serverPreferences) as ShellPreferences);\n }, [serverPreferences]);\n\n const setPreference = useCallback<ShellPreferenceChange>(\n (key, value) => {\n setPreferences(current => ({ ...current, [key]: value }));\n if (key === 'theme') applyTheme(value as ShellTheme);\n if (onPreferenceChange !== undefined) onPreferenceChange(key, value);\n else writeCookie(key, value);\n },\n [onPreferenceChange],\n );\n\n const toggleHelp = useCallback(\n (open?: boolean) => {\n const next = open ?? !helpVisible(store.get(), matches(HELP_DOCKED));\n store.set({ open: next, restored: false });\n setPreference('helpOpen', next);\n },\n [store, setPreference],\n );\n\n const levels = shell.context.levels;\n const switchUrl = shell.context.switchUrl;\n\n // Lists and the app catalog kept from another context are never shown in this one.\n const scope = levels.map(level => `${level.key}:${level.current.id}`).join('|');\n if (scopeLists(scope)) forgetShellCatalog();\n const api = useMemo<ShellApi>(\n () => ({\n shell,\n t,\n navigate,\n Link: LinkComponent,\n icons,\n preferences,\n setPreference,\n overlay,\n setOverlay,\n help: store,\n toggleHelp,\n openArticle: article => {\n store.set({ article, open: true, restored: false });\n setPreference('helpOpen', true);\n },\n ask: question => {\n store.set({ open: true, restored: false, article: null, pendingQuestion: question });\n setPreference('helpOpen', true);\n },\n switchTo: chosen => {\n setOverlay(null);\n navigate(switchUrl, { method: 'post', data: switchPayload(levels, chosen, currentLocation()) });\n },\n }),\n [shell, t, navigate, LinkComponent, icons, preferences, setPreference, overlay, store, toggleHelp, levels, switchUrl],\n );\n\n const preferencesRef = useRef(preferences);\n preferencesRef.current = preferences;\n\n // ⌘K / Ctrl+K anywhere; ⌘. collapses the subnav.\n useEffect(() => {\n const keydown = (event: KeyboardEvent) => {\n if (!(event.metaKey || event.ctrlKey) || event.altKey) return;\n if (event.key.toLowerCase() === 'k') {\n event.preventDefault();\n setOverlay(current => (current === 'palette' ? null : 'palette'));\n } else if (event.key === '.') {\n event.preventDefault();\n setPreference('subnavCollapsed', !(preferencesRef.current.subnavCollapsed ?? false));\n }\n };\n window.addEventListener('keydown', keydown);\n return () => window.removeEventListener('keydown', keydown);\n }, [setPreference]);\n\n // A visit closes any open menu.\n const page = `${shell.nav.activeArea}|${shell.nav.activePage ?? ''}|${shell.page?.title ?? ''}`;\n useEffect(() => {\n setOverlay(current => (current === 'palette' ? current : null));\n }, [page]);\n\n const docked = useMedia(HELP_DOCKED, true);\n const mobile = useMedia(MOBILE, false);\n const testData = levels.some(level => level.current.testData === true);\n const helpOpen = useHelpState(store, state => helpVisible(state, docked));\n const banner = shell.banner !== undefined && (shell.banner.kind !== 'sandbox' || testData) ? shell.banner : undefined;\n\n return (\n <ShellContext.Provider value={api}>\n <div className=\"cbx-shell\" data-help-open={helpOpen}>\n <a\n className=\"cbx-skip-link\"\n href={`#${mainId}`}\n onClick={event => {\n const main = document.getElementById(mainId);\n if (main === null) return;\n event.preventDefault();\n main.focus();\n main.scrollIntoView?.({ block: 'start' });\n }}\n >\n {t('Skip to content')}\n </a>\n <Rail brandAssetBase={brandAssetBase} />\n <div className=\"cbx-shell-column\">\n <Header mobile={mobile} />\n {banner !== undefined && (\n <div className={`cbx-banner cbx-banner-${banner.kind}`} role=\"status\">\n <span className=\"cbx-banner-text\">{banner.text}</span>\n {banner.action !== undefined && <LinkComponent href={navUrl(banner.action)} className=\"cbx-banner-action\">{banner.action.label}</LinkComponent>}\n </div>\n )}\n <div className=\"cbx-shell-body\">\n <Subnav />\n <main id={mainId} tabIndex={-1} className=\"cbx-shell-main canvas-gradient\">{children}</main>\n </div>\n </div>\n <HelpColumn docked={docked} />\n {overlay === 'palette' && <CommandPalette onClose={() => setOverlay(null)} />}\n {overlay === 'nav-sheet' && <NavSheet onClose={() => setOverlay(null)} />}\n {overlay === 'context-sheet' && <ContextSheet onClose={() => setOverlay(null)} />}\n </div>\n </ShellContext.Provider>\n );\n}\n\nfunction AppMark() {\n const { shell } = useShell();\n const known = useKnownAppCatalog().find(app => app.key === shell.app.key);\n const [failed, setFailed] = useState(false);\n const style = { '--cbx-hue': String(hueFor(shell.app.key)) } as Record<string, string>;\n if (known?.icon_url && !failed) {\n return (\n <span className=\"cbx-app-mark\" aria-hidden=\"true\">\n <img src={known.icon_url} alt=\"\" className={known.icon_dark_url ? 'cbx-app-icon-light' : ''} onError={() => setFailed(true)} />\n {known.icon_dark_url && <img src={known.icon_dark_url} alt=\"\" className=\"cbx-app-icon-dark\" onError={() => setFailed(true)} />}\n </span>\n );\n }\n return <span className=\"cbx-app-mark cbx-app-tile\" style={style} aria-hidden=\"true\">{initials(shell.app.name.replace(/^Cbox\\s*·?\\s*/i, ''))}</span>;\n}\n\nfunction Rail({ brandAssetBase }: { brandAssetBase: string }) {\n const { shell, t, Link, icons, preferences, setPreference, overlay, setOverlay } = useShell();\n const [hovered, setHovered] = useState(false);\n const account = useRef<HTMLButtonElement>(null);\n const pinned = preferences.railPinned;\n const open = pinned || hovered || overlay === 'account';\n const name = shell.app.name.replace(/^Cbox\\s*·?\\s*/i, '');\n return (\n <div className=\"cbx-rail-slot\" data-pinned={pinned}>\n <aside\n className=\"cbx-rail\"\n data-open={open}\n aria-label={t('Main navigation')}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onFocusCapture={() => setHovered(true)}\n onBlurCapture={event => {\n if (!event.currentTarget.contains(event.relatedTarget as Node | null)) setHovered(false);\n }}\n >\n <div className=\"cbx-rail-top\">\n <Link href={shell.app.homeUrl} className=\"cbx-rail-home\" aria-label={t('{app} home', { app: shell.app.name })}>\n <AppMark />\n <span className=\"cbx-rail-brand\" aria-hidden=\"true\">\n <img className=\"cbx-wordmark cbx-wordmark-light\" src={`${brandAssetBase}/cbox-logo.png`} srcSet={`${brandAssetBase}/cbox-logo.png 1x, ${brandAssetBase}/cbox-logo@2x.png 2x`} alt=\"\" height={19} />\n <img className=\"cbx-wordmark cbx-wordmark-dark\" src={`${brandAssetBase}/cbox-logo-white.png`} srcSet={`${brandAssetBase}/cbox-logo-white.png 1x, ${brandAssetBase}/cbox-logo-white@2x.png 2x`} alt=\"\" height={19} />\n <span className=\"cbx-rail-app\">{name}</span>\n </span>\n </Link>\n <button type=\"button\" className=\"cbx-icon-button cbx-rail-pin\" onClick={() => setPreference('railPinned', !pinned)} aria-label={pinned ? t('Unpin navigation') : t('Pin navigation')} aria-pressed={pinned} tabIndex={open ? 0 : -1}>\n {pinned ? <PinOff size={16} strokeWidth={1.8} aria-hidden /> : <Pin size={16} strokeWidth={1.8} aria-hidden />}\n </button>\n </div>\n <nav className=\"cbx-rail-nav\" aria-label={name}>\n {shell.nav.areas.map(area => {\n const Icon = resolveIcon(area.icon, icons);\n const active = area.key === shell.nav.activeArea;\n return (\n <Link key={area.key} href={navUrl(area)} className={`cbx-rail-link ${active ? 'is-active' : ''}`} aria-current={active ? 'page' : undefined} title={open ? undefined : area.label} aria-label={area.label}>\n <Icon size={18} strokeWidth={1.7} aria-hidden />\n <span className=\"cbx-rail-label\">{area.label}</span>\n </Link>\n );\n })}\n </nav>\n <div className=\"cbx-rail-foot\">\n <button\n ref={account}\n type=\"button\"\n className={`cbx-rail-account ${overlay === 'account' ? 'is-open' : ''}`}\n aria-haspopup=\"menu\"\n aria-expanded={overlay === 'account'}\n aria-label={t('Account and preferences')}\n onClick={() => setOverlay(overlay === 'account' ? null : 'account')}\n >\n <Avatar />\n <span className=\"cbx-rail-who\">\n <span className=\"cbx-rail-name cbx-truncate\">{shell.person.name}</span>\n <span className=\"cbx-rail-sub cbx-truncate\">{t('Account and preferences')}</span>\n </span>\n </button>\n </div>\n </aside>\n <Popover open={overlay === 'account'} anchor={account} placement=\"top-start\" label={t('Account')} onClose={() => setOverlay(null)}>\n <AccountMenu onDone={() => setOverlay(null)} />\n </Popover>\n </div>\n );\n}\n\nfunction Subnav() {\n const { shell, t, Link, preferences, setPreference } = useShell();\n const area = shell.nav.areas.find(item => item.key === shell.nav.activeArea);\n const pages = area?.pages ?? [];\n if (area === undefined || pages.length < 2) return null;\n const collapsed = preferences.subnavCollapsed ?? false;\n if (collapsed) {\n return (\n <aside className=\"cbx-subnav\" data-collapsed=\"true\" aria-label={area.label}>\n <button type=\"button\" className=\"cbx-subnav-strip\" onClick={() => setPreference('subnavCollapsed', false)} aria-label={t('Expand {area}', { area: area.label })} title=\"⌘.\">\n <PanelLeftOpen size={16} strokeWidth={1.8} aria-hidden />\n <span>{area.label}</span>\n </button>\n </aside>\n );\n }\n return (\n <aside className=\"cbx-subnav\" aria-label={area.label}>\n <div className=\"cbx-subnav-head\">\n <strong className=\"cbx-truncate\">{area.label}</strong>\n <button type=\"button\" className=\"cbx-icon-button\" onClick={() => setPreference('subnavCollapsed', true)} aria-label={t('Collapse {area}', { area: area.label })} title=\"⌘.\">\n <PanelLeftClose size={16} strokeWidth={1.8} aria-hidden />\n </button>\n </div>\n <nav aria-label={area.label} className=\"cbx-subnav-list\">\n <NavPageList\n pages={pages}\n renderPage={page => {\n const active = page.key === shell.nav.activePage;\n return (\n <Link key={page.key} href={navUrl(page)} className={`cbx-subnav-link ${active ? 'is-active' : ''} ${page.locked === true ? 'is-locked' : ''}`} aria-current={active ? 'page' : undefined} data-locked={page.locked === true ? 'true' : undefined}>\n <span className=\"cbx-truncate\" title={page.label}>{page.label}</span>\n <NavPageMarks page={page} />\n </Link>\n );\n }}\n />\n </nav>\n </aside>\n );\n}\n\nfunction Header({ mobile }: { mobile: boolean }) {\n const { shell, t, overlay, setOverlay, help, toggleHelp, Link } = useShell();\n const mac = useIsMac();\n const org = useRef<HTMLButtonElement>(null);\n const second = useRef<HTMLButtonElement>(null);\n const apps = useRef<HTMLButtonElement>(null);\n const docked = useMedia(HELP_DOCKED, true);\n const helpOpen = useHelpState(help, state => helpVisible(state, docked));\n const unread = useHelpState(help, state => state.updates.filter(update => update.unread).length);\n const [organization, ...rest] = shell.context.levels;\n const trail = shell.context.levels.map(level => level.current.name).join(' / ');\n const close = useCallback(() => setOverlay(null), [setOverlay]);\n\n return (\n <header className=\"cbx-header\">\n <button type=\"button\" className=\"cbx-icon-button cbx-only-mobile\" onClick={() => setOverlay('nav-sheet')} aria-label={t('Open navigation')} aria-haspopup=\"dialog\">\n <Menu size={20} strokeWidth={1.8} aria-hidden />\n </button>\n {organization !== undefined && (\n <div className=\"cbx-context cbx-only-desktop\">\n <button ref={org} type=\"button\" className={`cbx-trigger ${overlay === 'org' ? 'is-open' : ''}`} aria-haspopup=\"dialog\" aria-expanded={overlay === 'org'} aria-label={t('{level}: {name}', { level: organization.label, name: organization.current.name })} onClick={() => setOverlay(overlay === 'org' ? null : 'org')}>\n <Chip item={organization.current} tone=\"solid\" />\n <span className=\"cbx-trigger-text\" title={organization.current.name}>{organization.current.name}</span>\n <ChevronsUpDown className=\"cbx-trigger-chevron\" size={14} strokeWidth={1.8} aria-hidden />\n </button>\n {!mobile && (\n <Popover open={overlay === 'org'} anchor={org} label={organization.label} onClose={close}>\n <OrganizationMenu level={organization} />\n </Popover>\n )}\n {rest.length > 0 && (\n <>\n <span className=\"cbx-separator\" aria-hidden=\"true\">/</span>\n <button ref={second} type=\"button\" className={`cbx-trigger ${overlay === 'context' ? 'is-open' : ''}`} aria-haspopup=\"dialog\" aria-expanded={overlay === 'context'} aria-label={rest.map(level => t('{level}: {name}', { level: level.label, name: level.current.name })).join(', ')} onClick={() => setOverlay(overlay === 'context' ? null : 'context')}>\n <CascadeLabel levels={rest} />\n <ChevronsUpDown className=\"cbx-trigger-chevron\" size={14} strokeWidth={1.8} aria-hidden />\n </button>\n {!mobile && (\n <Popover open={overlay === 'context'} anchor={second} label={rest.map(level => level.label).join(' / ')} onClose={close}>\n <CascadeMenu levels={rest} parent={organization.current.id} />\n </Popover>\n )}\n </>\n )}\n </div>\n )}\n {organization !== undefined && (\n <button type=\"button\" className=\"cbx-trigger cbx-context-mobile cbx-only-mobile\" onClick={() => setOverlay('context-sheet')} aria-haspopup=\"dialog\" aria-label={t('Where you are: {trail}', { trail })}>\n <Chip item={organization.current} tone=\"solid\" />\n <span className=\"cbx-trigger-text\">{trail}</span>\n <ChevronsUpDown className=\"cbx-trigger-chevron\" size={14} strokeWidth={1.8} aria-hidden />\n </button>\n )}\n <div className=\"cbx-tools\">\n <button type=\"button\" className=\"cbx-search-button\" onClick={() => setOverlay('palette')} aria-label={t('Search or ask…')} aria-keyshortcuts={mac ? 'Meta+K' : 'Control+K'}>\n <Search size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-search-label\">{t('Search or ask…')}</span>\n <kbd className=\"cbx-kbd\">{mac ? '⌘K' : 'Ctrl K'}</kbd>\n </button>\n <button type=\"button\" className={`cbx-tool ${helpOpen ? 'is-on' : ''}`} onClick={() => toggleHelp()} aria-pressed={helpOpen} aria-controls=\"cbx-help\" aria-label={unread > 0 ? t('Help, {count} unread', { count: unread }) : t('Help')}>\n <CircleHelp size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-tool-label\">{t('Help')}</span>\n {unread > 0 && <span className=\"cbx-count\" aria-hidden=\"true\">{unread}</span>}\n </button>\n {shell.notifications.enabled && (\n <Link href={shell.notifications.url} className=\"cbx-tool cbx-tool-icon cbx-only-desktop\" aria-label={shell.notifications.unread > 0 ? t('Notifications, {count} unread', { count: shell.notifications.unread }) : t('Notifications')}>\n <Bell size={16} strokeWidth={1.8} aria-hidden />\n {shell.notifications.unread > 0 && <span className=\"cbx-count\" aria-hidden=\"true\">{shell.notifications.unread}</span>}\n </Link>\n )}\n <button ref={apps} type=\"button\" className={`cbx-tool cbx-tool-icon cbx-only-desktop ${overlay === 'apps' ? 'is-on' : ''}`} onClick={() => setOverlay(overlay === 'apps' ? null : 'apps')} aria-haspopup=\"dialog\" aria-expanded={overlay === 'apps'} aria-label={t('Switch app')} title={t('Switch app')}>\n <LayoutGrid size={16} strokeWidth={1.8} aria-hidden />\n </button>\n {!mobile && (\n <Popover open={overlay === 'apps'} anchor={apps} placement=\"bottom-end\" label={t('Switch app')} onClose={close}>\n <AppGrid />\n </Popover>\n )}\n </div>\n </header>\n );\n}\n","import type { ComponentProps, ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\ntype Props = ComponentProps<'main'> & {\n children: ReactNode;\n};\n\n/**\n * Scrolling main column inside an <AppShell>. Wears the soft blue-\n * tinted gradient canvas so every Cbox app sits on the same\n * background.\n */\nexport function AppContent({ children, className, ...props }: Props) {\n return (\n <main\n {...props}\n className={cn(\n 'canvas-gradient relative flex h-svh flex-1 flex-col overflow-y-auto',\n className,\n )}\n >\n {children}\n </main>\n );\n}\n","import type { ReactNode } from 'react';\n\n/**\n * Top-level chrome. Hosts the desktop sidebar (left) and the\n * scrollable content column (right) side-by-side. Fits the full\n * viewport height; only the content column scrolls.\n *\n * Pair with <AppContent> inside. Per-app sidebars compose alongside\n * — cbox-ui doesn't ship one because the nav items are app-specific.\n */\nexport function AppShell({ children }: { children: ReactNode }) {\n return (\n <div className=\"flex h-svh w-full bg-canvas text-foreground\">\n {children}\n </div>\n );\n}\n","import type { ComponentProps } from 'react';\nimport { cn } from '../utils/cn';\nimport { CboxServiceMark } from '../components/app-icon';\n\nexport type CboxBrandProps = {\n /**\n * App key — drives the small mono submark beside the wordmark.\n * Convention: lowercase single word matching the `cbox_apps.key`\n * row in id (`notifications`, `webhooks`, `id`, `cortex`, …).\n */\n appKey: string;\n /**\n * Override the submark text. Defaults to `appKey`. Hide it\n * entirely with `submark={null}`.\n */\n submark?: string | null;\n /** Asset base path. Default `/brand` — apps drop the standard\n * png set (`cbox-icon.png`, `cbox-logo.png`, plus `@2x` retina)\n * into `public/brand/` and they Just Work. */\n assetBase?: string;\n /** Tone of the wordmark. `dark` on light surfaces (default),\n * `light` on dark / coloured surfaces. */\n tone?: 'dark' | 'light';\n /** Collapsed mode renders only the square icon — used in the\n * collapsed-sidebar state. The icon is the app's own icon from\n * Cbox ID's catalog (light and dark) once this browser has seen\n * the catalog, and the Cbox icon until then. */\n collapsed?: boolean;\n className?: string;\n};\n\n/**\n * Canonical Cbox brand mark. Every app wears this — the only\n * variable bit is the `appKey` submark beside the wordmark\n * (\"notifications\", \"webhooks\", …).\n *\n * No app should ship its own brand component. If a product needs\n * a materially different mark, that's a cbox-ui PR (extend this\n * component), not a per-app fork.\n */\nexport function CboxBrand({\n appKey,\n submark,\n assetBase = '/brand',\n tone = 'dark',\n collapsed = false,\n className,\n}: CboxBrandProps) {\n if (collapsed) {\n const cboxIcon = (\n <img\n src={`${assetBase}/cbox-icon.png`}\n srcSet={`${assetBase}/cbox-icon.png 1x, ${assetBase}/cbox-icon@2x.png 2x`}\n alt=\"Cbox\"\n width={36}\n height={36}\n className={cn('h-9 w-9 rounded-md', className)}\n />\n );\n\n return <CboxServiceMark appKey={appKey} className={cn('h-9 w-9', className)} fallback={cboxIcon} />;\n }\n\n const wordmark =\n tone === 'light'\n ? `${assetBase}/cbox-logo-white.png`\n : `${assetBase}/cbox-logo.png`;\n const wordmarkRetina =\n tone === 'light'\n ? `${assetBase}/cbox-logo-white@2x.png`\n : `${assetBase}/cbox-logo@2x.png`;\n\n const submarkText = submark === undefined ? appKey : submark;\n\n return (\n <div\n className={cn('inline-flex items-center gap-2', className)}\n aria-label={`Cbox · ${appKey}`}\n >\n <img\n src={wordmark}\n srcSet={`${wordmark} 1x, ${wordmarkRetina} 2x`}\n alt=\"Cbox\"\n height={22}\n className=\"h-[22px] w-auto select-none\"\n draggable={false}\n />\n {submarkText !== null && submarkText !== '' ? (\n <span\n className={cn(\n 'text-[13px] font-semibold whitespace-nowrap',\n tone === 'light'\n ? 'text-white/60'\n : 'text-muted-foreground/80',\n )}\n >\n · {submarkText}\n </span>\n ) : null}\n </div>\n );\n}\n\n/**\n * Re-export shape kept in case a host app needs to pass\n * additional <img> attrs (`loading`, `fetchPriority`, …).\n */\nexport type CboxBrandImageProps = ComponentProps<'img'>;\n","import { createElement } from 'react';\nimport { useCboxLocalization } from '../context/localization';\nimport { defineCboxAppSwitcher } from '../app-switcher/elements';\nimport type { CboxThemeMode } from '../app-switcher/theme';\n\nexport {\n authorizeHref,\n parseAppCatalog,\n signInTarget,\n type CboxAppCatalogState,\n type CboxCatalogApp,\n} from '../app-switcher/catalog';\n\ndefineCboxAppSwitcher();\n\nexport type CboxAppCatalogProps = {\n /**\n * Same-origin URL the host serves the person's app catalog from (a proxy of Cbox ID's\n * catalog, authorized for the signed-in person). `null` renders the control disabled, so the\n * chrome keeps its shape on pages without an organization.\n */\n endpoint: string | null;\n /** The app key of this app; its tile is marked current. */\n currentAppKey: string;\n /**\n * How the theme is read. Default `auto`: `.dark`/`[data-theme]` on the root, else the\n * system scheme. `class` for a host whose tokens only turn dark under `.dark`.\n */\n theme?: CboxThemeMode;\n className?: string;\n};\n\n/**\n * The Switch-app control. It renders `<cbox-app-switcher>` from `@cboxdk/cbox-ui/app-switcher`,\n * the same element every Blade app uses, so React and Blade apps draw one identical control:\n * the live catalog from the host's endpoint, Cbox ID's light and dark icons, a quiet retry when\n * the catalog cannot be loaded, and straight to sign-in when the host answers `401 { signin_url }`.\n */\nexport function CboxAppCatalog({ endpoint, currentAppKey, theme, className }: CboxAppCatalogProps) {\n const { t } = useCboxLocalization();\n const labels = JSON.stringify({\n title: t('Switch app'),\n loading: t('Loading apps…'),\n empty: t('No apps available'),\n unavailable: t('Apps could not be loaded.'),\n });\n\n return createElement('cbox-app-switcher', {\n endpoint: endpoint ?? '',\n current: currentAppKey,\n labels,\n theme,\n className,\n });\n}\n","import { useCboxLocalization } from '../context/localization';\nimport {\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { cn } from '../utils/cn';\n\n/**\n * Combobox — the canonical select replacement for the Cbox suite.\n *\n * **Native `<select>` is forbidden.** It can't host avatars, can't\n * be searched, can't be styled into the design system, and on mobile\n * it pops the OS picker which breaks the visual contract. Combobox\n * solves all of that with a single primitive:\n *\n * - Type-ahead filter on the search input (case-insensitive,\n * matches label + secondary).\n * - Keyboard contract: ArrowDown / ArrowUp move highlight, Enter\n * selects, Escape closes, Home/End jump to bounds, Tab exits.\n * - Optional avatar per option, optional secondary line.\n * - Optional grouped sections with mono-tracked headers.\n * - Optional footer link (eg \"+ New environment\").\n * - Empty-state copy when the filter excludes everything.\n *\n * Two modes:\n * - Value mode (default): `value` + `onChange` — Combobox manages\n * selection state, host treats it like a controlled input.\n * - Navigation mode: items carry `href` and `LinkComponent` is\n * supplied — clicking an item is a Link visit, not a state mutation.\n *\n * Both modes are URL/router-friendly. Value mode is for filter\n * controls; navigation mode is for context switchers (the Combobox\n * inside a ContextBar crumb is exactly this).\n */\n\nexport type ComboboxOption = {\n /** Stable key. Used as React key and for active-state matching. */\n value: string;\n /** Visible label — primary line. */\n label: string;\n /** Optional secondary line — slug, role, environment, hint. */\n secondary?: string;\n /** Optional leading icon (lucide-style — h-3.5 w-3.5). */\n icon?: ComponentType<{ className?: string; strokeWidth?: number }>;\n /**\n * Optional avatar — image src OR `{initials,accent}` chip. When\n * the option carries an avatar, the trigger renders one too if\n * the option is the active selection.\n */\n avatar?: ComboboxAvatar;\n /** Disable selection of this option. */\n disabled?: boolean;\n /**\n * Hidden text added to the searchable haystack. Useful for\n * synonyms (\"United States\" should match \"USA\", \"us\"). Not\n * displayed.\n */\n keywords?: string[];\n /**\n * Optional href for navigation mode. When set + LinkComponent is\n * supplied, clicking the option navigates instead of mutating\n * value state.\n */\n href?: string;\n};\n\nexport type ComboboxGroup = {\n /** Group heading — uppercase mono-tracked. Empty string hides the heading. */\n label: string;\n options: ComboboxOption[];\n};\n\nexport type ComboboxAvatar = {\n initials?: string;\n accent?: string;\n src?: string;\n};\n\ntype LinkComp = ComponentType<{\n href: string;\n prefetch?: boolean;\n className?: string;\n children: ReactNode;\n}>;\n\ntype CommonProps = {\n /** Options or grouped options. Pass an array of either shape. */\n items: ComboboxOption[] | ComboboxGroup[];\n /** Placeholder shown in the trigger when no value is selected. */\n placeholder?: string;\n /** Search input placeholder. */\n searchPlaceholder?: string;\n /** Empty-state copy when the filter matches nothing. */\n emptyText?: string;\n /** Optional footer link below the option list (\"+ New X\"). */\n footerLink?: {\n label: string;\n href: string;\n };\n /** Disable the entire combobox (greyed-out trigger). */\n disabled?: boolean;\n /** Required-field marker on the trigger. */\n required?: boolean;\n /** Aria-label for the trigger. */\n ariaLabel?: string;\n /** Trigger className override. Doesn't change padding/height. */\n triggerClassName?: string;\n /** Dropdown panel className override. */\n panelClassName?: string;\n /** Width policy for the trigger. Defaults to `auto` (intrinsic). */\n triggerWidth?: 'auto' | 'full';\n /**\n * Framework Link adapter for navigation-mode items + footer link.\n * If unset, navigation falls back to plain `<a>`.\n */\n LinkComponent?: LinkComp;\n /** ID for the trigger button (associate with a <Label htmlFor>). */\n id?: string;\n /** className for the outer wrapper. */\n className?: string;\n};\n\ntype ValueModeProps = CommonProps & {\n /** Selected value or `null` when nothing is selected. */\n value: string | null;\n /** Called with the option's `value` when the user picks one. */\n onChange: (value: string) => void;\n};\n\ntype NavModeProps = CommonProps & {\n /** Active value for highlight purposes. Optional in nav mode. */\n value?: string | null;\n /**\n * Omitted in nav mode. Items must carry `href`, and a\n * LinkComponent must be supplied for SPA navigation.\n */\n onChange?: never;\n};\n\nexport type ComboboxProps = ValueModeProps | NavModeProps;\n\nexport function Combobox(props: ComboboxProps) {\n const { t } = useCboxLocalization();\n const {\n items,\n placeholder = t('Select…'),\n searchPlaceholder = t('Search…'),\n emptyText = t('Nothing matches.'),\n footerLink,\n disabled = false,\n required = false,\n ariaLabel,\n triggerClassName,\n panelClassName,\n triggerWidth = 'auto',\n LinkComponent,\n id: idProp,\n className,\n value,\n } = props;\n\n const groups = useMemo(() => normaliseGroups(items), [items]);\n const flatOptions = useMemo(\n () => groups.flatMap((g) => g.options),\n [groups],\n );\n const activeOption = useMemo(\n () => (value !== null && value !== undefined\n ? flatOptions.find((opt) => opt.value === value)\n : null),\n [flatOptions, value],\n );\n\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [highlightIndex, setHighlightIndex] = useState(-1);\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const listRef = useRef<HTMLUListElement | null>(null);\n const reactId = useId();\n const id = idProp ?? reactId;\n const listId = `${id}-listbox`;\n\n // Filtered groups (preserves group structure for headings).\n const filteredGroups = useMemo(\n () => filterGroups(groups, query),\n [groups, query],\n );\n const filteredFlat = useMemo(\n () => filteredGroups.flatMap((g) => g.options),\n [filteredGroups],\n );\n\n // Reset highlight when filter changes — first non-disabled option.\n useEffect(() => {\n if (! open) return;\n const firstEnabled = filteredFlat.findIndex(\n (opt) => opt.disabled !== true,\n );\n setHighlightIndex(firstEnabled);\n }, [filteredFlat, open]);\n\n // Auto-focus the search input when the menu opens.\n useEffect(() => {\n if (open) {\n // Run on the next tick so the input is mounted.\n const id = window.setTimeout(() => inputRef.current?.focus(), 0);\n return () => window.clearTimeout(id);\n }\n setQuery('');\n\n return undefined;\n }, [open]);\n\n // Click-outside close.\n useEffect(() => {\n if (! open) return;\n\n function onPointerDown(event: PointerEvent): void {\n if (\n containerRef.current !== null &&\n ! containerRef.current.contains(event.target as Node)\n ) {\n setOpen(false);\n }\n }\n\n window.addEventListener('pointerdown', onPointerDown);\n return () => window.removeEventListener('pointerdown', onPointerDown);\n }, [open]);\n\n const onSelectOption = useCallback(\n (opt: ComboboxOption) => {\n if (opt.disabled === true) return;\n\n if (\n opt.href !== undefined &&\n LinkComponent !== undefined &&\n props.onChange === undefined\n ) {\n // Navigation mode — Link handles it; just close.\n setOpen(false);\n return;\n }\n\n if (props.onChange !== undefined) {\n props.onChange(opt.value);\n }\n setOpen(false);\n },\n [LinkComponent, props],\n );\n\n const onKeyDown = useCallback(\n (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n setHighlightIndex((current) =>\n nextEnabledIndex(filteredFlat, current, 1),\n );\n return;\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n setHighlightIndex((current) =>\n nextEnabledIndex(filteredFlat, current, -1),\n );\n return;\n }\n if (event.key === 'Home') {\n event.preventDefault();\n setHighlightIndex(\n filteredFlat.findIndex((o) => o.disabled !== true),\n );\n return;\n }\n if (event.key === 'End') {\n event.preventDefault();\n let last = -1;\n for (let i = 0; i < filteredFlat.length; i++) {\n const opt = filteredFlat[i];\n if (opt !== undefined && opt.disabled !== true) {\n last = i;\n }\n }\n setHighlightIndex(last);\n return;\n }\n if (event.key === 'Enter') {\n if (highlightIndex >= 0) {\n event.preventDefault();\n const opt = filteredFlat[highlightIndex];\n if (opt !== undefined) {\n onSelectOption(opt);\n }\n }\n return;\n }\n if (event.key === 'Escape') {\n event.preventDefault();\n setOpen(false);\n return;\n }\n if (event.key === 'Tab') {\n setOpen(false);\n return;\n }\n },\n [filteredFlat, highlightIndex, onSelectOption],\n );\n\n return (\n <div\n ref={containerRef}\n className={cn('relative', triggerWidth === 'full' && 'w-full', className)}\n >\n <button\n id={id}\n type=\"button\"\n role=\"combobox\"\n disabled={disabled}\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-controls={listId}\n aria-required={required}\n aria-label={ariaLabel}\n onClick={() => setOpen((v) => ! v)}\n className={cn(\n 'flex h-9 items-center gap-2 rounded-md border border-input bg-card px-3 text-left text-[13px] text-foreground transition-colors',\n triggerWidth === 'full' && 'w-full',\n 'hover:border-border-strong focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none',\n open && 'border-border-strong ring-2 ring-ring/30',\n disabled && 'cursor-not-allowed opacity-60',\n triggerClassName,\n )}\n >\n {activeOption?.avatar !== undefined ? (\n <ComboboxAvatarChip\n avatar={activeOption.avatar}\n fallbackLabel={activeOption.label}\n />\n ) : activeOption?.icon !== undefined ? (\n <activeOption.icon\n className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\"\n strokeWidth={1.7}\n />\n ) : null}\n <span\n className={cn(\n 'flex-1 truncate',\n activeOption === null || activeOption === undefined\n ? 'text-muted-foreground'\n : '',\n )}\n >\n {activeOption !== null && activeOption !== undefined\n ? activeOption.label\n : placeholder}\n </span>\n <Chevron open={open} />\n </button>\n\n {open ? (\n <div\n className={cn(\n 'absolute left-0 right-0 top-full z-30 mt-1 overflow-hidden rounded-md border border-border bg-popover shadow-lg',\n panelClassName,\n )}\n >\n <div className=\"border-b border-border/60 px-2 py-2\">\n <div className=\"relative\">\n <SearchIcon />\n <input\n ref={inputRef}\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={onKeyDown}\n placeholder={searchPlaceholder}\n className=\"h-8 w-full rounded-sm border-0 bg-transparent pl-7 pr-2 text-[13px] outline-none placeholder:text-muted-foreground/70\"\n aria-controls={listId}\n aria-autocomplete=\"list\"\n aria-activedescendant={\n highlightIndex >= 0\n ? `${listId}-${highlightIndex}`\n : undefined\n }\n />\n </div>\n </div>\n\n <ul\n id={listId}\n ref={listRef}\n role=\"listbox\"\n className=\"max-h-72 overflow-y-auto py-1\"\n >\n {filteredFlat.length === 0 ? (\n <li className=\"px-3 py-6 text-center text-[13px] text-muted-foreground\">\n {emptyText}\n </li>\n ) : (\n filteredGroups.map((group, groupIndex) => (\n <ComboboxGroupRows\n key={group.label || `group-${groupIndex}`}\n group={group}\n flatOptions={filteredFlat}\n listId={listId}\n highlightIndex={highlightIndex}\n activeValue={value ?? null}\n LinkComponent={LinkComponent}\n onSelect={onSelectOption}\n onHover={(idx) => setHighlightIndex(idx)}\n />\n ))\n )}\n </ul>\n\n {footerLink !== undefined ? (\n <FooterLink\n label={footerLink.label}\n href={footerLink.href}\n LinkComponent={LinkComponent}\n onAfterClick={() => setOpen(false)}\n />\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction ComboboxGroupRows({\n group,\n flatOptions,\n listId,\n highlightIndex,\n activeValue,\n LinkComponent,\n onSelect,\n onHover,\n}: {\n group: ComboboxGroup;\n flatOptions: ComboboxOption[];\n listId: string;\n highlightIndex: number;\n activeValue: string | null;\n LinkComponent: LinkComp | undefined;\n onSelect: (opt: ComboboxOption) => void;\n onHover: (idx: number) => void;\n}) {\n if (group.options.length === 0) return null;\n\n return (\n <>\n {group.label !== '' ? (\n <li\n role=\"presentation\"\n className=\"text-mono px-3 pt-2 pb-1 text-[10px] font-semibold tracking-[0.18em] text-muted-foreground/70 uppercase\"\n >\n {group.label}\n </li>\n ) : null}\n {group.options.map((opt) => {\n const flatIndex = flatOptions.indexOf(opt);\n const isHighlighted = flatIndex === highlightIndex;\n const isActive = opt.value === activeValue;\n const inner = (\n <div className=\"flex w-full min-w-0 items-center gap-2.5 px-2.5 py-2\">\n {opt.avatar !== undefined ? (\n <ComboboxAvatarChip\n avatar={opt.avatar}\n fallbackLabel={opt.label}\n />\n ) : opt.icon !== undefined ? (\n <opt.icon\n className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\"\n strokeWidth={1.7}\n />\n ) : null}\n <div className=\"flex min-w-0 flex-1 flex-col leading-tight\">\n <span className=\"truncate text-[13px] font-medium text-foreground\">\n {opt.label}\n </span>\n {opt.secondary !== undefined ? (\n <span className=\"text-mono truncate text-[10px] text-muted-foreground\">\n {opt.secondary}\n </span>\n ) : null}\n </div>\n {isActive ? <Check /> : null}\n </div>\n );\n\n const className = cn(\n 'group block w-full rounded-sm transition-colors text-left',\n opt.disabled === true && 'cursor-not-allowed opacity-50',\n isHighlighted && opt.disabled !== true && 'bg-secondary',\n isActive && 'bg-accent-soft hover:bg-accent-soft/80',\n );\n\n if (\n opt.href !== undefined &&\n LinkComponent !== undefined\n ) {\n return (\n <li\n key={opt.value}\n id={`${listId}-${flatIndex}`}\n role=\"option\"\n aria-selected={isActive}\n aria-disabled={opt.disabled === true}\n onMouseEnter={() => onHover(flatIndex)}\n >\n <LinkComponent\n href={opt.href}\n prefetch\n className={className}\n >\n {inner}\n </LinkComponent>\n </li>\n );\n }\n\n return (\n <li\n key={opt.value}\n id={`${listId}-${flatIndex}`}\n role=\"option\"\n aria-selected={isActive}\n aria-disabled={opt.disabled === true}\n onMouseEnter={() => onHover(flatIndex)}\n >\n <button\n type=\"button\"\n disabled={opt.disabled === true}\n onClick={() => onSelect(opt)}\n className={className}\n >\n {inner}\n </button>\n </li>\n );\n })}\n </>\n );\n}\n\nfunction FooterLink({\n label,\n href,\n LinkComponent,\n onAfterClick,\n}: {\n label: string;\n href: string;\n LinkComponent: LinkComp | undefined;\n onAfterClick: () => void;\n}) {\n const className =\n 'flex items-center gap-2 border-t border-border/60 px-3 py-2.5 text-[13px] font-medium text-info transition-colors hover:bg-info-soft';\n\n if (LinkComponent !== undefined) {\n return (\n <LinkComponent\n href={href}\n prefetch\n className={className}\n >\n <Plus />\n <span>{label}</span>\n </LinkComponent>\n );\n }\n\n return (\n <a\n href={href}\n className={className}\n onClick={onAfterClick}\n >\n <Plus />\n <span>{label}</span>\n </a>\n );\n}\n\nfunction ComboboxAvatarChip({\n avatar,\n fallbackLabel,\n}: {\n avatar: ComboboxAvatar;\n fallbackLabel: string;\n}) {\n const initials = avatar.initials ?? deriveInitials(fallbackLabel);\n const style =\n avatar.src === undefined && avatar.accent !== undefined\n ? { backgroundColor: avatar.accent, color: '#fff' }\n : undefined;\n\n if (avatar.src !== undefined) {\n return (\n <img\n src={avatar.src}\n alt=\"\"\n className=\"h-5 w-5 shrink-0 rounded-sm bg-secondary object-cover\"\n loading=\"lazy\"\n />\n );\n }\n\n return (\n <span\n style={style}\n className={cn(\n 'flex h-5 w-5 shrink-0 items-center justify-center rounded-sm text-[9px] font-semibold tracking-tight',\n avatar.accent === undefined && 'bg-info-soft text-info',\n )}\n >\n {initials}\n </span>\n );\n}\n\nfunction deriveInitials(label: string): string {\n const parts = label.trim().split(/\\s+/);\n if (parts.length >= 2) {\n return ((parts[0]?.[0] ?? '') + (parts[1]?.[0] ?? '')).toUpperCase();\n }\n return (label.slice(0, 2) || '?').toUpperCase();\n}\n\nfunction normaliseGroups(\n items: ComboboxOption[] | ComboboxGroup[],\n): ComboboxGroup[] {\n if (items.length === 0) return [];\n const first = items[0];\n if (first !== undefined && 'options' in first) {\n return items as ComboboxGroup[];\n }\n return [{ label: '', options: items as ComboboxOption[] }];\n}\n\nfunction filterGroups(\n groups: ComboboxGroup[],\n query: string,\n): ComboboxGroup[] {\n const q = query.trim().toLowerCase();\n if (q === '') return groups;\n\n return groups\n .map((group) => ({\n label: group.label,\n options: group.options.filter((opt) => matchesQuery(opt, q)),\n }))\n .filter((group) => group.options.length > 0);\n}\n\nfunction matchesQuery(option: ComboboxOption, q: string): boolean {\n const haystack = [\n option.label,\n option.secondary ?? '',\n ...(option.keywords ?? []),\n ]\n .join(' ')\n .toLowerCase();\n\n return haystack.includes(q);\n}\n\nfunction nextEnabledIndex(\n options: ComboboxOption[],\n current: number,\n direction: 1 | -1,\n): number {\n const total = options.length;\n if (total === 0) return -1;\n\n let i = current;\n for (let step = 0; step < total; step++) {\n i = (i + direction + total) % total;\n const opt = options[i];\n if (opt !== undefined && opt.disabled !== true) {\n return i;\n }\n }\n return -1;\n}\n\nfunction Chevron({ open }: { open: boolean }) {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\n 'shrink-0 text-muted-foreground transition-transform duration-150',\n open && 'rotate-180',\n )}\n >\n <path d=\"m3.5 5.5 3.5 3.5 3.5-3.5\" />\n </svg>\n );\n}\n\nfunction Check() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"shrink-0 text-accent\"\n aria-hidden\n >\n <path d=\"m3 7.5 2.5 2.5L11 4.5\" />\n </svg>\n );\n}\n\nfunction Plus() {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"shrink-0\"\n aria-hidden\n >\n <path d=\"M6 2v8M2 6h8\" />\n </svg>\n );\n}\n\nfunction SearchIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"pointer-events-none absolute left-1.5 top-1/2 -translate-y-1/2 text-muted-foreground\"\n aria-hidden\n >\n <circle cx=\"6\" cy=\"6\" r=\"4.25\" />\n <path d=\"m11.5 11.5-2.5-2.5\" />\n </svg>\n );\n}\n","import type { ComponentProps, ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\n/**\n * Generic panel container — soft border, card surface, subtle shadow.\n * The default building block for every section on a page.\n */\nexport function DataPanel({\n className,\n children,\n ...rest\n}: ComponentProps<'section'>) {\n return (\n <section\n className={cn(\n 'rounded-lg border border-border bg-card text-card-foreground shadow-[0_1px_2px_rgb(0_0_0/0.04),0_4px_12px_rgb(0_0_0/0.03)]',\n className,\n )}\n {...rest}\n >\n {children}\n </section>\n );\n}\n\ntype SectionHeaderProps = {\n title: ReactNode;\n description?: ReactNode;\n actions?: ReactNode;\n className?: string;\n};\n\n/**\n * Section header that sits inside a DataPanel. Title in semibold sans,\n * optional muted lead, right-aligned actions slot.\n */\nexport function SectionHeader({\n title,\n description,\n actions,\n className,\n}: SectionHeaderProps) {\n return (\n <header\n className={cn(\n 'flex flex-col gap-3 border-b border-border px-5 py-4 sm:flex-row sm:items-center sm:justify-between',\n className,\n )}\n >\n <div className=\"space-y-1\">\n <h2 className=\"text-[15px] leading-none font-semibold text-foreground\">\n {title}\n </h2>\n {description ? (\n <p className=\"text-sm text-muted-foreground\">\n {description}\n </p>\n ) : null}\n </div>\n {actions ? (\n <div className=\"flex shrink-0 items-center gap-2\">\n {actions}\n </div>\n ) : null}\n </header>\n );\n}\n\n/**\n * Vertically padded content body for a DataPanel.\n */\nexport function PanelBody({\n className,\n children,\n ...rest\n}: ComponentProps<'div'>) {\n return (\n <div className={cn('px-5 py-4', className)} {...rest}>\n {children}\n </div>\n );\n}\n","import type { LucideIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\ntype EmptyStateProps = {\n icon?: LucideIcon;\n title: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n className?: string;\n};\n\n/**\n * Centered empty state with an optional icon block, title, body\n * lede, and a single CTA slot.\n */\nexport function EmptyState({\n icon: Icon,\n title,\n description,\n action,\n className,\n}: EmptyStateProps) {\n return (\n <div\n className={cn(\n 'flex flex-col items-center justify-center gap-3 px-6 py-12 text-center',\n className,\n )}\n >\n {Icon ? (\n <div className=\"flex h-10 w-10 items-center justify-center rounded-md bg-secondary text-muted-foreground\">\n <Icon className=\"h-4 w-4\" strokeWidth={1.6} />\n </div>\n ) : null}\n <div className=\"space-y-1\">\n <h3 className=\"text-base font-semibold text-foreground\">\n {title}\n </h3>\n {description ? (\n <p className=\"max-w-sm text-sm text-muted-foreground\">\n {description}\n </p>\n ) : null}\n </div>\n {action ? <div className=\"pt-1\">{action}</div> : null}\n </div>\n );\n}\n","export default function Heading({\n title,\n description,\n variant = 'default',\n}: {\n title: string;\n description?: string;\n variant?: 'default' | 'small';\n}) {\n return (\n <header className={variant === 'small' ? '' : 'mb-8 space-y-0.5'}>\n <h2\n className={\n variant === 'small'\n ? 'mb-0.5 text-base font-medium'\n : 'text-xl font-semibold tracking-tight'\n }\n >\n {title}\n </h2>\n {description && (\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n </header>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\ntype KeyValueProps = {\n label: string;\n children: ReactNode;\n /** Render the value in monospace. Default true — most values are technical. */\n mono?: boolean;\n className?: string;\n};\n\n/**\n * Two-column read-only field row. Label in mono caps, value in mono\n * by default (for slugs/IDs/dates) — pass `mono={false}` for prose.\n */\nexport function KeyValue({\n label,\n children,\n mono = true,\n className,\n}: KeyValueProps) {\n return (\n <div\n className={cn(\n 'grid grid-cols-[140px_1fr] items-baseline gap-x-6 border-b border-border py-3 last:border-b-0',\n className,\n )}\n >\n <dt className=\"text-eyebrow text-muted-foreground\">{label}</dt>\n <dd\n className={cn(\n 'text-sm break-all text-foreground',\n mono && 'text-mono text-[13px]',\n )}\n >\n {children}\n </dd>\n </div>\n );\n}\n\nexport function KeyValueList({\n children,\n className,\n}: {\n children: ReactNode;\n className?: string;\n}) {\n return <dl className={cn('px-6', className)}>{children}</dl>;\n}\n","import type { ReactNode } from 'react';\nimport { useCboxLocalization } from '../context/localization';\nimport { useShellHelp } from '../shell/context';\nimport { cn } from '../utils/cn';\n\ntype Props = {\n title: ReactNode;\n /**\n * Tiny uppercase lead-in above the title (sections, breadcrumb-light\n * disambiguation). Shown in mono-tracking caps so it reads as\n * meta, not as a competing heading.\n */\n eyebrow?: ReactNode;\n description?: ReactNode;\n actions?: ReactNode;\n /**\n * Show the `?` beside the title that toggles the shell's Help column (spec §7.1). The page's\n * help topic travels in `shell.help.topic`, set on the server per route (console-kit's\n * `helpTopic`), so Help knows the topic on the first paint and for pages without a header.\n * Ignored outside `CboxShell`.\n */\n help?: boolean;\n className?: string;\n};\n\n/**\n * Title block at the top of every page. Big bold title, optional mono\n * eyebrow lead-in, muted lead, optional right-aligned actions slot.\n * Cortex-style — no italics, no brackets — so it carries across many\n * sibling apps cleanly.\n */\nexport function PageHeader({\n title,\n eyebrow,\n description,\n actions,\n help = false,\n className,\n}: Props) {\n const { t } = useCboxLocalization();\n const shellHelp = useShellHelp();\n return (\n <header\n className={cn(\n 'flex flex-col gap-3 sm:flex-row sm:items-end sm:justify-between',\n className,\n )}\n >\n <div className=\"space-y-1.5\">\n {eyebrow !== undefined ? (\n <p className=\"text-mono text-[10px] font-semibold tracking-[0.18em] text-muted-foreground uppercase\">\n {eyebrow}\n </p>\n ) : null}\n <div className=\"flex items-center gap-2\">\n <h1 className=\"text-2xl leading-tight font-semibold tracking-tight text-foreground\">\n {title}\n </h1>\n {help && shellHelp !== null ? (\n <button\n type=\"button\"\n onClick={() => shellHelp.toggleHelp()}\n aria-label={t('Help for this page')}\n aria-controls=\"cbx-help\"\n className=\"group inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-full focus-visible:outline-2 focus-visible:outline-ring [@media(pointer:coarse)]:h-11 [@media(pointer:coarse)]:w-11\"\n >\n {/* The ring stays small beside the title; the hit area is 32px, 44px on touch (§12.2). */}\n <span\n aria-hidden=\"true\"\n className=\"inline-flex h-6 w-6 items-center justify-center rounded-full border border-border text-xs font-semibold text-muted-foreground group-hover:border-accent-edge group-hover:text-primary\"\n >\n ?\n </span>\n </button>\n ) : null}\n </div>\n {description ? (\n <p className=\"text-sm text-muted-foreground\">\n {description}\n </p>\n ) : null}\n </div>\n {actions ? (\n <div className=\"flex shrink-0 flex-wrap items-center gap-2\">\n {actions}\n </div>\n ) : null}\n </header>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\n/**\n * Width policy for `<PageShell>` — the single horizontal-rhythm\n * primitive every Cbox-family app shares. Pick the policy that\n * matches the page's content density:\n *\n * comfortable max-w-6xl (~1152px) — the default. Reading-friendly\n * column for prose-heavy pages: profile, security,\n * billing forms, audit row detail.\n * wide max-w-7xl (~1280px) — for tables / lists / member\n * rosters where horizontal real estate matters more\n * than reading line length. Audit log, member roster,\n * plan comparison.\n * full no max-width, only the standard horizontal padding —\n * for canvas-heavy pages (flow diagrams, dashboards)\n * where every pixel of viewport should be usable. Use\n * sparingly: raw width without column rules feels\n * chaotic on monitors past 1600px.\n * bleed no max-width AND no horizontal padding. Strict edge\n * -to-edge for content that draws its own padding (a\n * flow canvas with its own pan/zoom region, a fullscreen\n * iframe, an embedded preview environment).\n */\nexport type PageWidth = 'comfortable' | 'wide' | 'full' | 'bleed';\n\nconst widthClass: Record<PageWidth, string> = {\n comfortable: 'max-w-6xl px-6 py-8 lg:px-10 lg:py-10',\n wide: 'max-w-7xl px-6 py-8 lg:px-10 lg:py-10',\n full: 'max-w-none px-6 py-8 lg:px-10 lg:py-10',\n bleed: 'max-w-none p-0',\n};\n\ntype Props = {\n children: ReactNode;\n width?: PageWidth;\n className?: string;\n};\n\n/**\n * The page-level container. Picks one of four width policies (see\n * PageWidth) and applies the canonical Cbox padding / vertical\n * rhythm. Every authenticated page in every Cbox app composes\n * through this — directly via `<PageShell>` or, more usually, via\n * the per-app `<Page>` wrapper that combines PageShell + PageHeader\n * + PageTabs.\n *\n * Width policy is the only knob exposed here. Padding, max-width,\n * gutter, vertical spacing between blocks — those are baked in so\n * the eye never has to track horizontal jitter between sibling\n * pages.\n */\nexport function PageShell({\n children,\n width = 'comfortable',\n className,\n}: Props) {\n return (\n <div\n className={cn(\n 'mx-auto w-full space-y-6',\n widthClass[width],\n className,\n )}\n >\n {children}\n </div>\n );\n}\n","import { useCboxLocalization } from '../context/localization';\nimport {\n useEffect,\n useId,\n useRef,\n useState,\n type ComponentType,\n type ReactNode,\n} from 'react';\nimport { cn } from '../utils/cn';\n\n/**\n * Section navigation: every \"tab\" is a real page with its own URL.\n * No internal active-state, no callbacks — the host's router is the\n * source of truth. This is what makes deep links and hard refreshes\n * lossless: paste any URL, the right tab is active and the right\n * panel renders, with no client-side coordination required.\n *\n * Layout:\n * ≥ sm horizontal underline strip + optional `actions` slot to\n * the right; sticky just under the TopBar with a hairline\n * border-bottom and a backdrop-blur for the scroll-into\n * effect.\n * < sm dropdown showing the active tab + chevron; opens a panel\n * with the full list. Actions reflow below the trigger.\n *\n * The same primitive runs the section nav across every Cbox app. It\n * lives here so that the visual contract is single-sourced — there's\n * no way for a feature page to invent its own slightly-different tab\n * strip.\n */\n\nexport type PageTabSpec = {\n /** Display label. Truncates inline if it overflows the strip. */\n label: string;\n /** Absolute or app-relative href. The host router renders this. */\n href: string;\n /**\n * Optional leading icon. Constrained to the icon shape we use\n * everywhere — this is how cbox-ui keeps icon weights aligned\n * across primitives without depending on `lucide-react`.\n */\n icon?: ComponentType<{ className?: string; strokeWidth?: number }>;\n /**\n * Optional badge — a count, status pill, or \"new\" indicator. Use\n * sparingly; one badge in a row is signal, three is noise.\n */\n badge?: ReactNode;\n /**\n * Numeric count rendered inline. Convenience for the common\n * \"Members 12\" pattern; mutually exclusive with `badge` (badge\n * wins if both are set).\n */\n count?: number;\n /**\n * Match the current path by prefix. Use for hub pages whose\n * nested routes should still highlight the parent tab — e.g.\n * `/org/<slug>/members` highlights when on\n * `/org/<slug>/members/<id>`.\n */\n matchPrefix?: boolean;\n};\n\nexport type PageTabsProps = {\n items: PageTabSpec[];\n /** Current pathname, host-supplied. Drives active-state matching. */\n currentPath: string;\n /**\n * The framework's link component. Inertia consumers pass the\n * Inertia `Link`; TanStack Router consumers pass their typed\n * `Link`; plain anchors are the fallback. We never invent\n * navigation here.\n */\n LinkComponent?: ComponentType<{\n href: string;\n prefetch?: boolean;\n className?: string;\n children: ReactNode;\n 'aria-current'?: 'page' | undefined;\n }>;\n /**\n * Right-aligned slot on desktop, reflowed under the dropdown on\n * mobile. Use for primary section actions (Invite, Add token,\n * Export…) that belong to the section as a whole rather than the\n * specific tab. The slot is always reserved on desktop so pages\n * with and without actions keep identical row geometry — no\n * layout shift between sibling tabs.\n */\n actions?: ReactNode;\n className?: string;\n};\n\nconst DefaultLink: ComponentType<{\n href: string;\n className?: string;\n children: ReactNode;\n 'aria-current'?: 'page' | undefined;\n}> = ({ href, className, children, 'aria-current': ariaCurrent }) => (\n <a href={href} className={className} aria-current={ariaCurrent}>\n {children}\n </a>\n);\n\nexport function PageTabs({\n items,\n currentPath,\n LinkComponent = DefaultLink,\n actions,\n className,\n}: PageTabsProps) {\n const activeHref = resolveActiveHref(items, currentPath);\n\n return (\n <div\n data-component=\"page-tabs\"\n className={cn(\n // Card-style chrome — same border, radius, bg as DataPanel\n // so the tab strip reads as a peer of the content panels\n // beneath it instead of floating on the page background.\n // Width matches PageShell content; no sticky positioning.\n 'rounded-lg border border-border bg-card',\n className,\n )}\n >\n {/* Desktop: strip + actions on the same baseline. The strip's\n active underline anchors the visual baseline of the row;\n the actions slot is always rendered (even when empty) so\n pages with and without actions stay byte-identical in\n width and content alignment. */}\n <div className=\"hidden items-end gap-3 px-3 sm:flex\">\n <DesktopStrip\n items={items}\n activeHref={activeHref}\n LinkComponent={LinkComponent}\n />\n <div className=\"flex min-h-12 shrink-0 items-center gap-2\">\n {actions}\n </div>\n </div>\n\n {/* Mobile: dropdown + actions stacked underneath. */}\n <div className=\"flex flex-col gap-2 p-3 sm:hidden\">\n <MobileDropdown\n items={items}\n activeHref={activeHref}\n LinkComponent={LinkComponent}\n />\n {actions !== undefined ? (\n <div className=\"flex flex-wrap items-center gap-2\">\n {actions}\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n\ntype StripProps = {\n items: PageTabSpec[];\n activeHref: string | null;\n LinkComponent: NonNullable<PageTabsProps['LinkComponent']>;\n};\n\nfunction DesktopStrip({ items, activeHref, LinkComponent }: StripProps) {\n const { t } = useCboxLocalization();\n return (\n <nav\n // Pill-style tabs inside the card chrome read clearly as\n // switching controls: active gets a filled chip + ring,\n // inactive sits in plain text with a hover fill. The whole\n // strip is centered vertically inside the row so the actions\n // slot on the right shares the same baseline.\n className=\"flex min-h-12 flex-1 items-center gap-1 overflow-x-auto overflow-y-hidden py-1.5\"\n role=\"tablist\"\n aria-label={t(\"Section navigation\")}\n >\n {items.map((item) => {\n const Icon = item.icon;\n const active = item.href === activeHref;\n\n return (\n <LinkComponent\n key={item.href}\n href={item.href}\n prefetch\n aria-current={active ? 'page' : undefined}\n className={cn(\n 'inline-flex items-center gap-2 rounded-md px-2.5 py-1.5 text-[13px] whitespace-nowrap transition-colors',\n active\n ? 'bg-secondary font-semibold text-foreground shadow-sm ring-1 ring-border-strong/60'\n : 'text-muted-foreground hover:bg-secondary/60 hover:text-foreground',\n )}\n >\n {Icon !== undefined ? (\n <Icon\n className={cn(\n 'h-3.5 w-3.5 shrink-0',\n active\n ? 'text-foreground'\n : 'text-muted-foreground',\n )}\n strokeWidth={1.7}\n />\n ) : null}\n <span>{item.label}</span>\n <ItemTrailing item={item} active={active} />\n </LinkComponent>\n );\n })}\n </nav>\n );\n}\n\nfunction MobileDropdown({ items, activeHref, LinkComponent }: StripProps) {\n const { t } = useCboxLocalization();\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement | null>(null);\n const listId = useId();\n\n const active = items.find((item) => item.href === activeHref) ?? items[0];\n\n // Click-outside + Escape close. Same popover contract every other\n // cbox-ui dropdown follows so it feels native to users navigating\n // by keyboard.\n useEffect(() => {\n if (! open) return;\n\n function onPointerDown(event: PointerEvent): void {\n if (\n ref.current !== null &&\n ! ref.current.contains(event.target as Node)\n ) {\n setOpen(false);\n }\n }\n\n function onKey(event: KeyboardEvent): void {\n if (event.key === 'Escape') setOpen(false);\n }\n\n window.addEventListener('pointerdown', onPointerDown);\n window.addEventListener('keydown', onKey);\n\n return () => {\n window.removeEventListener('pointerdown', onPointerDown);\n window.removeEventListener('keydown', onKey);\n };\n }, [open]);\n\n if (active === undefined) {\n return null;\n }\n\n const ActiveIcon = active.icon;\n\n return (\n <div ref={ref} className=\"relative\">\n <button\n type=\"button\"\n onClick={() => setOpen((v) => ! v)}\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-controls={listId}\n className={cn(\n 'flex w-full min-h-11 items-center justify-between gap-2 rounded-md border border-border bg-card px-3 text-left text-[13px] font-medium text-foreground transition-colors hover:border-border-strong',\n open && 'border-border-strong ring-2 ring-ring/30',\n )}\n >\n <span className=\"flex min-w-0 items-center gap-2\">\n {ActiveIcon !== undefined ? (\n <ActiveIcon\n className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\"\n strokeWidth={1.7}\n />\n ) : null}\n <span className=\"truncate\">{active.label}</span>\n <ItemTrailing item={active} active />\n </span>\n <Chevron open={open} />\n </button>\n\n {open ? (\n <ul\n id={listId}\n role=\"listbox\"\n aria-label={t(\"Section navigation\")}\n className=\"absolute left-0 right-0 top-full z-30 mt-1 overflow-hidden rounded-md border border-border bg-popover shadow-lg\"\n >\n {items.map((item) => {\n const Icon = item.icon;\n const isActive = item.href === activeHref;\n\n return (\n <li key={item.href}>\n <LinkComponent\n href={item.href}\n prefetch\n aria-current={isActive ? 'page' : undefined}\n className={cn(\n 'flex w-full items-center gap-2 px-3 py-2.5 text-[13px] transition-colors',\n isActive\n ? 'bg-accent-soft font-semibold text-foreground'\n : 'text-muted-foreground hover:bg-secondary hover:text-foreground',\n )}\n >\n {Icon !== undefined ? (\n <Icon\n className={cn(\n 'h-3.5 w-3.5 shrink-0',\n isActive\n ? 'text-foreground'\n : 'text-muted-foreground',\n )}\n strokeWidth={1.7}\n />\n ) : null}\n <span className=\"flex-1 truncate\">\n {item.label}\n </span>\n <ItemTrailing\n item={item}\n active={isActive}\n />\n </LinkComponent>\n </li>\n );\n })}\n </ul>\n ) : null}\n </div>\n );\n}\n\nfunction ItemTrailing({\n item,\n active,\n}: {\n item: PageTabSpec;\n active: boolean;\n}): ReactNode {\n if (item.badge !== undefined) {\n return <span className=\"ml-1 shrink-0\">{item.badge}</span>;\n }\n\n if (item.count !== undefined) {\n return (\n <span\n className={cn(\n 'ml-1 shrink-0 rounded-sm border px-1 text-[10px] font-semibold tracking-tight tabular-nums',\n active\n ? 'border-border-strong bg-secondary text-foreground'\n : 'border-border bg-secondary/60 text-muted-foreground',\n )}\n >\n {item.count}\n </span>\n );\n }\n\n return null;\n}\n\nfunction Chevron({ open }: { open: boolean }): ReactNode {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={cn(\n 'shrink-0 text-muted-foreground transition-transform duration-150',\n open && 'rotate-180',\n )}\n aria-hidden\n >\n <path d=\"m3.5 5.5 3.5 3.5 3.5-3.5\" />\n </svg>\n );\n}\n\n/**\n * Strip query string and hash from a URL/href so active-state matching\n * compares paths only. Tab hrefs may carry `?org=<slug>` or other\n * adapter-injected params (id's withOrgContext, cortex's org pinning,\n * etc.); the user's current URL doesn't include those when the page\n * mounted via a path-only navigation. Without this strip, `/foo` and\n * `/foo?org=cbox` are not equal and no tab lights up.\n */\nfunction pathOnly(href: string): string {\n const queryIndex = href.indexOf('?');\n const hashIndex = href.indexOf('#');\n let end = href.length;\n if (queryIndex !== -1) end = Math.min(end, queryIndex);\n if (hashIndex !== -1) end = Math.min(end, hashIndex);\n\n return href.slice(0, end);\n}\n\n/**\n * Active-state resolver — picks the longest-matching href so a more\n * specific child wins over its parent. Without this rule, both\n * `/security` and `/security/passkeys` would match when the user is\n * on Passkeys and we'd light up two tabs.\n *\n * Matches paths only (query / hash stripped) so tab hrefs that carry\n * adapter-injected params still resolve.\n */\nfunction resolveActiveHref(\n items: PageTabSpec[],\n currentPath: string,\n): string | null {\n const current = pathOnly(currentPath);\n\n const candidates = items\n .map((item) => {\n const itemPath = pathOnly(item.href);\n const matched =\n item.matchPrefix === true\n ? current === itemPath ||\n current.startsWith(itemPath + '/')\n : current === itemPath;\n\n return matched ? item.href : null;\n })\n .filter((href): href is string => href !== null);\n\n if (candidates.length === 0) return null;\n\n return candidates.reduce((longest, href) =>\n href.length > longest.length ? href : longest,\n );\n}\n","import type { ComponentType, ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\n/**\n * A clickable list row — replaces the \"name on left + Manage button on\n * right\" pattern with a row that's clickable as a single Link, with a\n * visible hover state and a focus ring. Trailing content (badges,\n * action buttons) sits in the `trailing` slot, which renders alongside\n * the body but stops click-propagation on any nested interactive\n * control so action buttons there don't trigger row navigation.\n *\n * <RowLink href={editOrg(slug).url} LinkComponent={Link}>\n * <Avatar />\n * <div>\n * <p>Cbox Systems</p>\n * <p className=\"text-mono\">cbox-systems</p>\n * </div>\n * </RowLink>\n *\n * With trailing actions:\n *\n * <RowLink href={...} trailing={<StatusPill>owner</StatusPill>}>\n *\n * Hit target: the entire row. The Link wraps all content directly so\n * every pixel inside the row is clickable, including the trailing\n * area's whitespace. Interactive controls inside `trailing` (buttons,\n * inputs, anchors, role=\"button\") auto-stop the click via the\n * onClickCapture handler — no per-button stopPropagation boilerplate.\n */\n\nexport type RowLinkProps = {\n /** Destination URL — clicking anywhere on the row navigates here. */\n href: string;\n /** Row body. Compose freely; common pattern is avatar + text block. */\n children: ReactNode;\n /**\n * Right-aligned slot. Status pills, action buttons, kebab menus.\n * Interactive controls inside this slot auto-stop the row click\n * via DOM-traversal (button/a/input/select/textarea/[role=button]\n * /[data-stop-row-click]). No manual stopPropagation needed.\n */\n trailing?: ReactNode;\n /**\n * The framework's link component. Inertia consumers pass the\n * Inertia `Link`; TanStack Router consumers pass their typed\n * `Link`. Plain `<a>` is the fallback.\n */\n LinkComponent?: ComponentType<{\n href: string;\n prefetch?: boolean;\n className?: string;\n children: ReactNode;\n }>;\n /** Highlight as the active row (the user's current selection). */\n active?: boolean;\n /** Additional classes for the row container. */\n className?: string;\n};\n\nconst DefaultLink: ComponentType<{\n href: string;\n className?: string;\n children: ReactNode;\n}> = ({ href, className, children }) => (\n <a href={href} className={className}>\n {children}\n </a>\n);\n\nexport function RowLink({\n href,\n children,\n trailing,\n LinkComponent = DefaultLink,\n active = false,\n className,\n}: RowLinkProps) {\n return (\n <LinkComponent\n href={href}\n prefetch\n // The Link IS the row. Wrapping everything in the Link\n // means every pixel inside is clickable — no fiddly\n // overlay positioning or stretched-link hacks.\n className={cn(\n 'group flex w-full items-center gap-4 px-5 py-3.5 transition-colors focus-visible:bg-secondary/60 focus-visible:outline-none',\n active\n ? 'bg-accent-soft hover:bg-accent-soft/80'\n : 'hover:bg-secondary/60',\n className,\n )}\n >\n <span\n data-component=\"row-link\"\n data-active={active ? 'true' : undefined}\n // Body content. Captures clicks on `trailing`'s\n // interactive controls so they don't bubble up to the\n // Link and trigger the row navigation. The \"click\" on\n // a button inside trailing fires the button's handler\n // and stops there.\n onClickCapture={(event) => {\n const target = event.target as HTMLElement;\n if (\n target.closest(\n 'button, a, input, select, textarea, [role=\"button\"], [data-stop-row-click]',\n ) !== null &&\n target.closest('[data-row-body]') === null\n ) {\n event.stopPropagation();\n }\n }}\n className=\"flex w-full items-center gap-4\"\n >\n <span\n data-row-body\n className=\"flex min-w-0 flex-1 items-center gap-4\"\n >\n {children}\n </span>\n {trailing !== undefined ? (\n <span className=\"flex shrink-0 items-center gap-2\">\n {trailing}\n </span>\n ) : null}\n </span>\n </LinkComponent>\n );\n}\n","import type { LucideIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\ntype Tone = 'info' | 'success' | 'warning' | 'destructive' | 'neutral';\n\nconst toneStyles: Record<Tone, { bg: string; fg: string }> = {\n info: { bg: 'bg-info-soft', fg: 'text-info' },\n success: { bg: 'bg-success-soft', fg: 'text-success' },\n warning: { bg: 'bg-warning-soft', fg: 'text-warning' },\n destructive: { bg: 'bg-destructive-soft', fg: 'text-destructive' },\n neutral: { bg: 'bg-secondary', fg: 'text-foreground' },\n};\n\ntype StatTileProps = {\n label: string;\n value: ReactNode;\n /** Small caption under the value. */\n suffix?: ReactNode;\n icon: LucideIcon;\n tone?: Tone;\n className?: string;\n};\n\n/**\n * Cortex-style metric tile. Coloured square icon block on the left,\n * label + value on the right, optional caption below the value.\n */\nexport function StatTile({\n label,\n value,\n suffix,\n icon: Icon,\n tone = 'info',\n className,\n}: StatTileProps) {\n const styles = toneStyles[tone];\n\n return (\n <div\n className={cn(\n 'flex items-center gap-3 rounded-lg border border-border bg-card p-4 shadow-[0_1px_2px_rgba(0,0,0,0.02)] transition-colors hover:border-border-strong',\n className,\n )}\n >\n <div\n className={cn(\n 'flex h-10 w-10 shrink-0 items-center justify-center rounded-md',\n styles.bg,\n )}\n >\n <Icon className={cn('h-5 w-5', styles.fg)} strokeWidth={1.8} />\n </div>\n <div className=\"min-w-0 flex-1 space-y-0.5\">\n <p className=\"tabular text-2xl leading-none font-semibold tracking-tight text-foreground\">\n {value}\n </p>\n <p className=\"truncate text-xs text-muted-foreground\">\n {label}\n </p>\n {suffix ? (\n <p className=\"text-mono truncate text-[10px] text-muted-foreground/80\">\n {suffix}\n </p>\n ) : null}\n </div>\n </div>\n );\n}\n","import { cn } from '../utils/cn';\n\ntype Tone =\n | 'neutral'\n | 'info'\n | 'success'\n | 'warning'\n | 'destructive'\n | 'muted';\n\nconst toneStyles: Record<Tone, string> = {\n neutral: 'border-border bg-secondary text-secondary-foreground',\n info: 'border-info/20 bg-info-soft text-info',\n success: 'border-success/20 bg-success-soft text-success',\n warning: 'border-warning/20 bg-warning-soft text-warning',\n destructive: 'border-destructive/20 bg-destructive-soft text-destructive',\n muted: 'border-border bg-card text-muted-foreground',\n};\n\nconst dotStyles: Record<Tone, string> = {\n neutral: 'bg-muted-foreground',\n info: 'bg-info',\n success: 'bg-success',\n warning: 'bg-warning',\n destructive: 'bg-destructive',\n muted: 'bg-muted-foreground/60',\n};\n\ntype StatusPillProps = {\n children: React.ReactNode;\n tone?: Tone;\n className?: string;\n /** Show a small dot before the label for \"live status\" feel. */\n dot?: boolean;\n};\n\n/**\n * Compact pill for plan tier, role, status, etc. Rounded-full like\n * Cortex's \"Running\"/\"Production\" tags. Sized for tabular density,\n * not editorial impact.\n */\nexport function StatusPill({\n children,\n tone = 'neutral',\n className,\n dot = false,\n}: StatusPillProps) {\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full border px-2 py-0.5 text-[11px] leading-none font-medium',\n toneStyles[tone],\n className,\n )}\n >\n {dot ? (\n <span\n className={cn('h-1.5 w-1.5 rounded-full', dotStyles[tone])}\n />\n ) : null}\n {children}\n </span>\n );\n}\n","import { useCboxLocalization } from '../context/localization';\nimport { X } from 'lucide-react';\nimport {\n useCallback,\n useEffect,\n useRef,\n type ReactNode,\n} from 'react';\nimport { cn } from '../utils/cn';\n\ntype Props = {\n open: boolean;\n onClose: () => void;\n /** Title rendered in the modal header. */\n title: ReactNode;\n /** Optional eyebrow above the title. */\n eyebrow?: ReactNode;\n /** Right-side header slot — typically a small action cluster\n * (filters, \"open in new tab\", search input). */\n headerActions?: ReactNode;\n /** Optional bottom bar — e.g. \"showing 50 of 312\" + pagination. */\n footer?: ReactNode;\n /** Modal width. Default `wide` (~960px) suits inbox-style lists.\n * `spotlight` is the search-modal width, narrower + top-aligned. */\n size?: 'wide' | 'spotlight';\n children: ReactNode;\n};\n\n/**\n * Cbox cross-app surface modal. Identical chrome across every\n * surface — only `title`, `headerActions`, `children`, `footer`\n * vary. Surfaces compose this; hosts never instantiate it\n * directly.\n *\n * Behaviour:\n * - ESC key dismisses\n * - click on the backdrop dismisses\n * - focus is trapped inside the dialog while open\n * - body scroll locks while open (page underneath stays put)\n * - first focusable element inside auto-focuses on open\n *\n * The modal mounts a sibling portal-style div that's a direct\n * child of `<body>` (via fixed positioning + z-index) so it\n * escapes any positioned ancestor in the host page tree.\n */\nexport function SurfaceModal({\n open,\n onClose,\n title,\n eyebrow,\n headerActions,\n footer,\n size = 'wide',\n children,\n}: Props) {\n const { t } = useCboxLocalization();\n const dialogRef = useRef<HTMLDivElement | null>(null);\n const previousFocusRef = useRef<HTMLElement | null>(null);\n\n // Lock body scroll while open. Restore the page's previous\n // scrollbar gutter to avoid layout shift.\n useEffect(() => {\n if (!open) return;\n const original = document.body.style.overflow;\n const gutter = window.innerWidth - document.documentElement.clientWidth;\n document.body.style.overflow = 'hidden';\n if (gutter > 0) {\n document.body.style.paddingRight = `${gutter}px`;\n }\n return () => {\n document.body.style.overflow = original;\n document.body.style.paddingRight = '';\n };\n }, [open]);\n\n // ESC dismiss + focus trap.\n useEffect(() => {\n if (!open) return;\n previousFocusRef.current = document.activeElement as HTMLElement | null;\n\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n onClose();\n return;\n }\n if (e.key === 'Tab' && dialogRef.current !== null) {\n const focusable = dialogRef.current.querySelectorAll<HTMLElement>(\n 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])',\n );\n if (focusable.length === 0) return;\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n if (first === undefined || last === undefined) return;\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n }\n };\n document.addEventListener('keydown', onKey);\n\n // Auto-focus the first focusable element so keyboard users\n // land inside the dialog without an extra Tab.\n const id = window.setTimeout(() => {\n const focusable = dialogRef.current?.querySelector<HTMLElement>(\n 'input, button, [tabindex]:not([tabindex=\"-1\"])',\n );\n focusable?.focus();\n }, 50);\n\n return () => {\n document.removeEventListener('keydown', onKey);\n window.clearTimeout(id);\n previousFocusRef.current?.focus?.();\n };\n }, [open, onClose]);\n\n const onBackdrop = useCallback(\n (e: React.MouseEvent) => {\n if (e.target === e.currentTarget) onClose();\n },\n [onClose],\n );\n\n if (!open) return null;\n\n return (\n <div\n role=\"presentation\"\n onMouseDown={onBackdrop}\n className={cn(\n 'fixed inset-0 z-50 flex animate-in fade-in duration-150',\n size === 'spotlight'\n ? 'items-start justify-center pt-[10vh]'\n : 'items-center justify-center px-4 py-[5vh]',\n 'bg-foreground/40 backdrop-blur-sm',\n )}\n >\n <div\n ref={dialogRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={typeof title === 'string' ? title : undefined}\n className={cn(\n 'flex max-h-full w-full flex-col overflow-hidden rounded-lg border border-border bg-background text-foreground shadow-2xl',\n 'animate-in zoom-in-95 slide-in-from-bottom-2 duration-150',\n size === 'spotlight'\n ? 'max-w-[640px]'\n : 'max-w-[960px]',\n )}\n >\n <header className=\"flex shrink-0 items-start gap-3 border-b border-border/70 bg-background/80 px-5 py-4 backdrop-blur-md\">\n <div className=\"min-w-0 flex-1\">\n {eyebrow !== undefined ? (\n <p className=\"text-mono text-[10px] font-semibold tracking-[0.18em] uppercase text-muted-foreground\">\n {eyebrow}\n </p>\n ) : null}\n <h2 className=\"text-base font-semibold tracking-tight text-foreground\">\n {title}\n </h2>\n </div>\n {headerActions !== undefined ? (\n <div className=\"flex shrink-0 items-center gap-2\">\n {headerActions}\n </div>\n ) : null}\n <button\n type=\"button\"\n onClick={onClose}\n className=\"ml-1 inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-secondary hover:text-foreground\"\n aria-label={t(\"Close\")}\n >\n <X className=\"h-4 w-4\" strokeWidth={1.8} />\n </button>\n </header>\n\n <div className=\"flex-1 overflow-y-auto\">{children}</div>\n\n {footer !== undefined ? (\n <footer className=\"flex shrink-0 items-center justify-between gap-3 border-t border-border/70 bg-background/80 px-5 py-3 text-xs text-muted-foreground backdrop-blur-md\">\n {footer}\n </footer>\n ) : null}\n </div>\n </div>\n );\n}\n","import { useCboxLocalization } from '../context/localization';\nimport { useEffect, useState } from 'react';\nimport { useCboxIdOptional } from '../context/cbox-id';\nimport { EmptyState } from '../primitives/empty-state';\nimport { StatusPill } from '../primitives/status-pill';\nimport { useTransport } from './surface-state';\nimport { SurfaceModal } from './surface-modal';\nimport type { Transport } from './types';\n\ntype InboxItem = {\n id: string;\n event_type: string;\n severity: 'info' | 'warning' | 'critical';\n data: Record<string, unknown> | null;\n subject_type: string | null;\n subject_id: string | null;\n created_at: string;\n read_at: string | null;\n};\n\ntype Inbox = {\n recipient: { external_id: string; display_name: string | null } | null;\n items: InboxItem[];\n unread_count: number;\n};\n\ntype Props = {\n open: boolean;\n onClose: () => void;\n};\n\nconst TONES: Record<\n InboxItem['severity'],\n 'info' | 'warning' | 'destructive'\n> = {\n info: 'info',\n warning: 'warning',\n critical: 'destructive',\n};\n\n/**\n * Full inbox modal — opened from the bell popover's \"See all\"\n * affordance. Renders inline over the host page so the user\n * never leaves their app context to read or manage notifications.\n *\n * Data flows:\n * - Initial load: GET /api/v1/recipients/{id_user_id}/inbox via\n * transport.getToken('notifications')\n * - Mark-read: POST /api/v1/recipients/{id}/notifications/{nid}/read\n * (optimistic; reverts on failure)\n * - Realtime hooks land in a follow-up session\n * (notifications.user.{id}.created topic)\n */\nexport function InboxSurface({ open, onClose }: Props) {\n const { t, formatDate } = useCboxLocalization();\n const transport = useTransport();\n const cboxId = useCboxIdOptional();\n const [inbox, setInbox] = useState<Inbox | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [filter, setFilter] = useState<'all' | 'unread'>('all');\n\n const userId = cboxId?.user.id ?? null;\n const baseUrl = transport.urls.notifications ?? null;\n\n useEffect(() => {\n if (!open || userId === null || baseUrl === null) return;\n let cancelled = false;\n const load = async () => {\n setLoading(true);\n setError(null);\n try {\n const headers = await authHeaders(transport, 'notifications');\n const response = await fetch(\n `${baseUrl}/api/v1/recipients/${userId}/inbox?limit=100`,\n { headers, credentials: 'include' },\n );\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n const body = (await response.json()) as Inbox;\n if (!cancelled) setInbox(body);\n } catch (e) {\n if (!cancelled) {\n setError(e instanceof Error ? e.message : t('Load failed'));\n }\n } finally {\n if (!cancelled) setLoading(false);\n }\n };\n void load();\n return () => {\n cancelled = true;\n };\n }, [open, userId, baseUrl, transport]);\n\n const markRead = async (id: string) => {\n if (inbox === null || userId === null || baseUrl === null) return;\n // Optimistic\n const prev = inbox;\n setInbox({\n ...inbox,\n items: inbox.items.map((it) =>\n it.id === id\n ? { ...it, read_at: new Date().toISOString() }\n : it,\n ),\n unread_count: Math.max(0, inbox.unread_count - 1),\n });\n try {\n const headers = await authHeaders(transport, 'notifications');\n const csrf = transport.csrfToken?.();\n if (csrf !== undefined && csrf !== '') {\n headers['X-CSRF-TOKEN'] = csrf;\n headers['X-Requested-With'] = 'XMLHttpRequest';\n }\n const response = await fetch(\n `${baseUrl}/api/v1/recipients/${userId}/notifications/${id}/read`,\n {\n method: 'POST',\n headers,\n credentials: 'include',\n },\n );\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n } catch {\n setInbox(prev);\n }\n };\n\n const items = inbox?.items ?? [];\n const filtered =\n filter === 'unread' ? items.filter((i) => i.read_at === null) : items;\n\n const unread = inbox?.unread_count ?? 0;\n\n return (\n <SurfaceModal\n open={open}\n onClose={onClose}\n eyebrow={t(\"Notifications\")}\n title={\n unread > 0 ? t('Inbox · {count} unread', {count: unread}) : t('Inbox · all caught up')\n }\n headerActions={\n <div className=\"flex items-center gap-2\">\n <FilterTab\n active={filter === 'all'}\n onClick={() => setFilter('all')}\n >\n {t(\"All\")}</FilterTab>\n <FilterTab\n active={filter === 'unread'}\n onClick={() => setFilter('unread')}\n >\n {t(\"Unread\")}</FilterTab>\n </div>\n }\n footer={\n inbox !== null && baseUrl !== null ? (\n <>\n <span>\n {t('Showing {shown} of {total}.', {shown: filtered.length, total: items.length})}\n </span>\n <a\n href={`${baseUrl}/inbox`}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"font-medium text-foreground hover:underline\"\n >\n {t(\"Open in new tab ↗\")}</a>\n </>\n ) : (\n <span>—</span>\n )\n }\n >\n {error !== null ? (\n <div className=\"px-5 py-8 text-center\">\n <p className=\"text-sm font-medium text-destructive\">\n {t(\"Couldn't load inbox\")}</p>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {error}\n </p>\n </div>\n ) : loading && inbox === null ? (\n <div className=\"px-5 py-12 text-center text-sm text-muted-foreground\">\n {t(\"Loading…\")}</div>\n ) : filtered.length === 0 ? (\n <div className=\"px-5 py-12\">\n <EmptyState\n title={\n filter === 'unread'\n ? t('No unread notifications')\n : t('No notifications yet')\n }\n description={t(\"When a Cbox app sends you something — invitation accepted, billing event, security alert — it lands here.\")}\n />\n </div>\n ) : (\n <ul className=\"divide-y divide-border/70\">\n {filtered.map((item) => {\n const data = (item.data ?? {}) as Record<\n string,\n string | undefined\n >;\n const ctaUrl = data.cta_url;\n const InnerWrapper = ({\n children,\n }: {\n children: React.ReactNode;\n }) =>\n ctaUrl !== undefined && ctaUrl !== '' ? (\n <a\n href={ctaUrl}\n className=\"block transition-colors hover:bg-secondary/40\"\n >\n {children}\n </a>\n ) : (\n <div>{children}</div>\n );\n\n return (\n <li\n key={item.id}\n className={\n item.read_at === null\n ? 'bg-secondary/20'\n : ''\n }\n >\n <InnerWrapper>\n <div className=\"flex items-start gap-3 px-5 py-3\">\n <StatusPill\n tone={TONES[item.severity]}\n dot\n >\n {item.severity}\n </StatusPill>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-foreground\">\n {data.title ??\n item.event_type}\n </p>\n {(data.body ?? '') !== '' ? (\n <p className=\"mt-0.5 line-clamp-2 text-xs text-muted-foreground\">\n {data.body}\n </p>\n ) : null}\n <p className=\"text-mono mt-1 text-[10px] text-muted-foreground\">\n {item.event_type}\n {' · '}\n {formatDate(item.created_at)}\n </p>\n </div>\n {item.read_at === null ? (\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n void markRead(item.id);\n }}\n className=\"shrink-0 rounded-md border border-border bg-card px-2 py-1 text-xs font-medium text-foreground transition-colors hover:border-border-strong\"\n aria-label={t(\"Mark as read\")}\n >\n {t(\"Mark read\")}</button>\n ) : null}\n </div>\n </InnerWrapper>\n </li>\n );\n })}\n </ul>\n )}\n </SurfaceModal>\n );\n}\n\n/**\n * Build request headers for a transport call. If the host's\n * `getToken` returns a non-empty bearer, it's attached. If it\n * returns an empty string, the surface assumes same-origin cookie\n * auth — the host is proxying the request through its own session.\n *\n * Either model is supported because hosts pick their security\n * trade-off: same-origin proxy keeps M2M tokens server-side; direct\n * CORS to notifications.cbox.systems is faster but exposes the\n * audience-bound bearer to the page.\n */\nasync function authHeaders(\n transport: Transport,\n audience: string,\n): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n Accept: 'application/json',\n };\n try {\n const { token } = await transport.getToken(audience);\n if (token !== '') {\n headers.Authorization = `Bearer ${token}`;\n }\n } catch {\n // Empty token / failure → fall back to cookie auth.\n }\n return headers;\n}\n\nfunction FilterTab({\n active,\n onClick,\n children,\n}: {\n active: boolean;\n onClick: () => void;\n children: React.ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={\n active\n ? 'rounded-md bg-secondary px-2 py-1 text-xs font-medium text-foreground'\n : 'rounded-md px-2 py-1 text-xs font-medium text-muted-foreground hover:bg-secondary/60 hover:text-foreground'\n }\n aria-pressed={active}\n >\n {children}\n </button>\n );\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState,\n type ReactNode,\n} from 'react';\nimport { InboxSurface } from './inbox-surface';\nimport type {\n CboxSurfacesProps,\n SurfaceArgs,\n SurfaceController,\n SurfaceId,\n Transport,\n} from './types';\n\nconst TransportContext = createContext<Transport | null>(null);\nconst SurfaceContext = createContext<SurfaceController | null>(null);\n\n/**\n * Mount the cbox-ui surface runtime once per app, alongside the\n * page tree. The host's chrome (the bell) reads\n * `useCboxSurfaces()` to open surfaces; cbox-ui renders the\n * active one as a modal/drawer over the page.\n *\n * Exactly one CboxSurfaces should be in the tree — typically right\n * inside CboxAppShell. Multiple instances would race their state\n * machines.\n */\nexport function CboxSurfaces({\n transport,\n surfaces,\n config,\n children,\n}: CboxSurfacesProps) {\n void config; // reserved for per-surface customisation; unused in v1\n const enabled = useMemo(() => new Set(surfaces), [surfaces]);\n const [active, setActive] = useState<{\n id: SurfaceId;\n args?: SurfaceArgs[SurfaceId];\n } | null>(null);\n\n const open = useCallback(\n <K extends SurfaceId>(id: K, args?: SurfaceArgs[K]) => {\n if (!enabled.has(id)) {\n console.warn(\n `[cbox-ui] surface \"${id}\" is not enabled in this host. Add it to <CboxSurfaces surfaces={[…]}>.`,\n );\n return;\n }\n setActive({ id, args });\n },\n [enabled],\n );\n\n const close = useCallback(() => setActive(null), []);\n\n const controller = useMemo<SurfaceController>(\n () => ({\n activeSurface: active?.id ?? null,\n open,\n close,\n }),\n [active, open, close],\n );\n\n return (\n <TransportContext.Provider value={transport}>\n <SurfaceContext.Provider value={controller}>\n {children}\n\n {/*\n * Active surface renders as a sibling of the page\n * tree. Each surface owns its own portal-style fixed\n * positioning so it escapes any positioned ancestor.\n * Only one surface is mounted at a time.\n */}\n <InboxSurface\n open={active?.id === 'inbox'}\n onClose={close}\n />\n </SurfaceContext.Provider>\n </TransportContext.Provider>\n );\n}\n\n/**\n * Imperative API for triggering surfaces from anywhere in the\n * host page. The bell-popover's \"See all\" calls\n * `useCboxSurfaces().open('inbox')` instead of navigating.\n */\nexport function useCboxSurfaces(): SurfaceController {\n const ctx = useContext(SurfaceContext);\n if (ctx === null) {\n throw new Error(\n '[cbox-ui] useCboxSurfaces must be used inside <CboxSurfaces>. Did the host forget to mount it?',\n );\n }\n return ctx;\n}\n\n/**\n * Optional variant — returns `null` when no `<CboxSurfaces>` host is\n * mounted. Chrome controls (the bell) use this to\n * degrade gracefully to cross-app navigation when the host hasn't\n * opted into the surface runtime yet.\n */\nexport function useCboxSurfacesOptional(): SurfaceController | null {\n return useContext(SurfaceContext);\n}\n\n/**\n * Read-only access to the host-supplied transport. Internal —\n * surface implementations call this; host code shouldn't need it.\n */\nexport function useTransport(): Transport {\n const t = useContext(TransportContext);\n if (t === null) {\n throw new Error(\n '[cbox-ui] useTransport must be used inside <CboxSurfaces>.',\n );\n }\n return t;\n}\n","/**\n * URL-as-state — typed query-string parsing and serialization.\n *\n * The contract: anything that should survive a hard refresh, deep\n * link, or paste-share lives in the URL, not in React state. Tabs,\n * filters, search terms, pagination, sort order — every one of those\n * is a navigation, not a UI mutation. This module provides the typed\n * parsers and serializers; per-app adapters wire them to the host\n * router (Inertia's `router.get`, TanStack Router's `navigate`, etc.)\n * and shape the `[state, update]` ergonomics on top.\n *\n * Why not URLSearchParams directly? Because raw query strings throw\n * away types and have no notion of defaults. The schema declares both\n * once, and `buildUrlSearch` automatically elides values that match\n * their default so the URL stays human-readable. `?role=all&page=1`\n * collapses to `''` when `all` and `1` are the defaults. Going from\n * `state -> URL -> state` always round-trips.\n */\n\n/**\n * A single field in a URL schema. Encapsulates the three operations\n * that make typed URL state work:\n * - `parse(raw)` — string|null from the query string → typed value\n * - `serialize(v)` — typed value → string|null (null = drop the key)\n * - `isDefault(v)` — does this value equal the field's default? If\n * so, `buildUrlSearch` elides it to keep URLs short.\n */\nexport type UrlField<T> = {\n parse: (raw: string | null) => T;\n serialize: (value: T) => string | null;\n isDefault: (value: T) => boolean;\n};\n\n// `UrlField<unknown>` would block assignment from concrete fields\n// (variance: T appears in both contravariant and covariant positions).\n// `UrlField<any>` is the standard escape hatch; safety lives in\n// `InferUrlState` which keeps the value-side fully typed.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type UrlSchema = Record<string, UrlField<any>>;\n\n/**\n * Map a UrlSchema to its inferred state shape — `urlString('')` →\n * `string`, `urlEnum(['a', 'b'], 'a')` → `'a' | 'b'`, etc.\n */\nexport type InferUrlState<S extends UrlSchema> = {\n [K in keyof S]: S[K] extends UrlField<infer T> ? T : never;\n};\n\n/**\n * String field. The empty string is the conventional \"absent\" value\n * — it's what an HTML input gives you when the user clears it — so\n * we treat `'' === default` as \"drop the param\" by default. Pass an\n * explicit non-empty default if you genuinely want to persist `''`.\n */\nexport function urlString(defaultValue: string = ''): UrlField<string> {\n return {\n parse: (raw) => raw ?? defaultValue,\n serialize: (value) => value,\n isDefault: (value) => value === defaultValue,\n };\n}\n\n/**\n * Integer field with optional clamping. Non-numeric input falls back\n * to the default rather than NaN; out-of-range input clamps to the\n * boundary. Both behaviours are belt-and-braces against URL tampering.\n */\nexport function urlNumber(\n defaultValue: number,\n options: { min?: number; max?: number } = {},\n): UrlField<number> {\n const clamp = (n: number): number => {\n if (options.min !== undefined && n < options.min) return options.min;\n if (options.max !== undefined && n > options.max) return options.max;\n\n return n;\n };\n\n return {\n parse: (raw) => {\n if (raw === null) return defaultValue;\n const parsed = Number.parseInt(raw, 10);\n if (Number.isNaN(parsed)) return defaultValue;\n\n return clamp(parsed);\n },\n serialize: (value) => String(value),\n isDefault: (value) => value === defaultValue,\n };\n}\n\n/**\n * Enum field — restrict to a fixed set of strings. Unknown values\n * fall back to the default rather than poisoning typed downstream\n * code with arbitrary user input. The `as const` on the values array\n * is what lets TS narrow the field type to the union.\n */\nexport function urlEnum<T extends string>(\n values: readonly T[],\n defaultValue: T,\n): UrlField<T> {\n const allowed = new Set<string>(values);\n\n return {\n parse: (raw) =>\n raw !== null && allowed.has(raw) ? (raw as T) : defaultValue,\n serialize: (value) => value,\n isDefault: (value) => value === defaultValue,\n };\n}\n\n/**\n * Boolean field. Only the literal string `'true'` parses to true so\n * we don't accidentally interpret `?flag=0` or `?flag=false` as truthy.\n */\nexport function urlBoolean(defaultValue: boolean = false): UrlField<boolean> {\n return {\n parse: (raw) => (raw === null ? defaultValue : raw === 'true'),\n serialize: (value) => (value ? 'true' : 'false'),\n isDefault: (value) => value === defaultValue,\n };\n}\n\n/**\n * Array-of-strings field — comma-joined in the URL. Useful for\n * multi-select filters (`?tags=foo,bar,baz`). Empty arrays drop the\n * param. Per-item parsing isn't customisable on purpose; if you need\n * a typed array of enums or numbers, build a thin wrapper.\n */\nexport function urlStringArray(\n defaultValue: readonly string[] = [],\n): UrlField<string[]> {\n const defaultKey = [...defaultValue].sort().join(',');\n\n return {\n parse: (raw) => {\n if (raw === null || raw === '') return [...defaultValue];\n\n return raw.split(',').filter((item) => item !== '');\n },\n serialize: (value) => (value.length === 0 ? null : value.join(',')),\n isDefault: (value) => [...value].sort().join(',') === defaultKey,\n };\n}\n\n/**\n * Convenience: declare a schema. Pure passthrough — exists to give\n * call sites a single, named import that reads like a definition\n * rather than a bare object literal.\n */\nexport function defineUrlSchema<S extends UrlSchema>(schema: S): S {\n return schema;\n}\n\n/**\n * Parse a query string into a typed state object. Accepts both\n * leading-`?` and bare forms. Unknown keys are silently dropped —\n * the schema is the closed allow-list, which keeps server- and\n * client-readable surface area bounded.\n */\nexport function parseUrlSearch<S extends UrlSchema>(\n search: string,\n schema: S,\n): InferUrlState<S> {\n const normalised = search.startsWith('?') ? search.slice(1) : search;\n const params = new URLSearchParams(normalised);\n const state = {} as InferUrlState<S>;\n\n for (const key of Object.keys(schema)) {\n const field = schema[key];\n if (field === undefined) continue;\n (state as Record<string, unknown>)[key] = field.parse(params.get(key));\n }\n\n return state;\n}\n\n/**\n * Serialize a typed state back to a query string. Default-valued\n * fields are elided so URLs stay short and bookmarks stay portable\n * across schema changes (a URL with `?page=1` keeps working when\n * `page` later stops being serialised because it's the default).\n *\n * Returns the serialised query without a leading `?`. The host\n * adapter is responsible for prepending or stitching it onto a path.\n */\nexport function buildUrlSearch<S extends UrlSchema>(\n state: InferUrlState<S>,\n schema: S,\n): string {\n const params = new URLSearchParams();\n\n for (const key of Object.keys(schema)) {\n const field = schema[key];\n if (field === undefined) continue;\n const value = (state as Record<string, unknown>)[key];\n\n if (field.isDefault(value)) continue;\n\n const serialized = field.serialize(value);\n if (serialized !== null) {\n params.set(key, serialized);\n }\n }\n\n return params.toString();\n}\n","/** The chart tokens in order, for series that set their own colour. */\nexport const CHART_PALETTE = ['var(--chart-1)', 'var(--chart-2)', 'var(--chart-3)', 'var(--chart-4)', 'var(--chart-5)'];\n\n/** A row's shape over the window, small: a line with a faint area, zero at the bottom. Decorative. */\nexport function Sparkline({ values, color = 'var(--chart-1)', width = 90, height = 20 }: { values: number[]; color?: string; width?: number; height?: number }) {\n if (values.length === 0) {\n return null;\n }\n\n const clean = values.map((value) => (Number.isFinite(value) ? value : 0));\n const max = Math.max(1e-9, ...clean);\n const points = clean.map((value, index) => [(index / Math.max(1, clean.length - 1)) * (width - 2) + 1, height - 1 - (value / max) * (height - 3)] as const);\n const d = points.map(([px, py], index) => `${index === 0 ? 'M' : 'L'}${px.toFixed(1)} ${py.toFixed(1)}`).join('');\n\n return (\n <svg width={width} height={height} viewBox={`0 0 ${width} ${height}`} aria-hidden=\"true\">\n <path d={`${d}L${width - 1} ${height}L1 ${height}Z`} fill={color} opacity={0.14} />\n <path d={d} fill=\"none\" stroke={color} strokeWidth={1.5} strokeLinejoin=\"round\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n"]}