@fayz-ai/plugin-shop 0.11.0 → 0.11.2

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/integrations/melhor-envio/labelProvider.ts","../src/views/ProductImagesTab.tsx","../src/views/ProductVariantsTab.tsx","../src/data/registry-routes.ts","../src/views/PackageSelect.tsx","../src/views/ShippingProfileSelect.tsx","../src/views/productEntity.tsx","../src/views/customerEntity.tsx","../src/views/discountEntity.tsx","../src/views/categoryEntity.tsx","../src/views/collectionEntity.tsx","../src/views/giftCardEntity.tsx","../src/views/customerGroupEntity.tsx","../src/views/customerSegmentEntity.tsx","../src/data/productDataProvider.ts","../src/data/customerDataProvider.ts","../src/data/discountDataProvider.ts","../src/data/categoryDataProvider.ts","../src/data/collectionDataProvider.ts","../src/data/giftCardDataProvider.ts","../src/data/customerGroupDataProvider.ts","../src/data/customerSegmentDataProvider.ts","../src/settings/useStoreSettings.ts","../src/settings/SettingsState.tsx","../src/settings/StoreGeneralSettings.tsx","../src/settings/payment-provider.ts","../src/settings/PaymentProviderRow.tsx","../src/settings/PaymentsSettings.tsx","../src/settings/CheckoutSettings.tsx","../src/settings/PackagesSettings.tsx","../src/settings/HandlingSettings.tsx","../src/settings/ChoiceCards.tsx","../src/settings/ShippingSettings.tsx","../src/settings/FulfillmentSettings.tsx","../src/integrations/melhor-envio/connectorDef.tsx","../src/integrations/appmax/connectorDef.tsx","../src/integrations/abacatepay/connectorDef.tsx","../src/integrations/stripe-connect/connectorDef.tsx","../src/integrations/vindi/connectorDef.tsx","../src/views/ChannelsPage.tsx","../src/views/media-links.ts","../src/views/ContentPage.tsx","../src/integrations/bling/limits.ts","../src/integrations/bling/data.ts","../src/integrations/bling/connectorDef.tsx","../src/integrations/bling/mapping.ts","../src/integrations/bling/sync.ts","../src/integrations/bling/inbound.ts","../src/analytics/cards.ts","../src/index.ts"],"names":["resolve","update","React","jsx","jsxs","IconButton","Plus","getShopProvider","adminNavigateTo","money","STATUS_TONE","STATUS_LABEL","AlertTriangle","Loader2","SettingsGroup","ToggleRow","SelectRow","useConnectors","useConnectorsPanelAvailable","openConnectorsPanel","RegistryCrudView","TextRow","ArrowRight","Fragment","ConnectorDetail","useState","useEffect","store","createConnectionStore","fayzConnectorOAuth","connectionStatus","settingsStatus","connectionSettings","METHOD_LABELS","methodsDetail","MapPin","ExternalLink","Check","X","Trash2","Button","Package","ShoppingBag","Layers"],"mappings":"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","file":"index.js","sourcesContent":["import type { ShippingLabelProvider, ShopProvider } from '@fayz-ai/shop'\n\n// The Melhor Envio implementation of the label port. It knows its own connector\n// slug and nothing else the panel needs: every screen goes through\n// resolveShippingLabelProvider, so a second carrier is a second file like this\n// one and no change anywhere else.\n\nexport const MELHOR_ENVIO_CARRIER = 'melhor-envio'\n\nexport function createMelhorEnvioLabelProvider(\n resolve: () => ShopProvider,\n): ShippingLabelProvider {\n const unsupported = () => {\n throw new Error('Este painel não sabe comprar etiquetas nesta loja.')\n }\n\n return {\n id: MELHOR_ENVIO_CARRIER,\n label: 'Melhor Envio',\n quote: async (orderId) =>\n (await resolve().quoteShippingLabel?.(orderId, MELHOR_ENVIO_CARRIER)) ?? unsupported(),\n buy: async (orderId, serviceId) =>\n (await resolve().buyShippingLabel?.(orderId, serviceId, MELHOR_ENVIO_CARRIER)) ?? unsupported(),\n print: async (orderId) =>\n (await resolve().printShippingLabel?.(orderId, MELHOR_ENVIO_CARRIER)) ?? null,\n track: async (orderId) =>\n (await resolve().trackShippingLabel?.(orderId, MELHOR_ENVIO_CARRIER)) ?? null,\n }\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport { errorMessage } from '../settings/error-message'\nimport type { Product, ProductImage, ShopProvider } from '@fayz-ai/shop'\n\n/**\n * The product's whole gallery, not just its cover.\n *\n * plg_shop_product_images has always been a collection — sort_order, is_primary\n * — but the admin only ever exposed the single `EntityImageConfig` slot on the\n * form, so a merchant could set one photo and no more, and the storefront had\n * nothing to build a carousel from. This is the missing half.\n *\n * Deliberately not drag-and-drop: ordering is done with arrows because a\n * keyboard and a screen reader can use them, and because reordering four\n * photos of a rib is not worth a drag library.\n */\nexport function ProductImagesTab({ item, getProvider }: {\n item: unknown\n getProvider: () => ShopProvider\n}) {\n const product = item as Product\n const [images, setImages] = useState<ProductImage[]>([])\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const fileRef = useRef<HTMLInputElement>(null)\n\n async function reload() {\n const fresh = await getProvider().getProduct(product.id)\n setImages(sortImages(fresh?.images ?? []))\n }\n\n useEffect(() => { void reload().catch(() => {}) }, [product.id])\n\n async function run(action: () => Promise<unknown>) {\n setBusy(true)\n setError(null)\n try {\n await action()\n await reload()\n } catch (err: unknown) {\n setError(errorMessage(err))\n } finally {\n setBusy(false)\n }\n }\n\n async function upload(files: FileList | null) {\n if (!files?.length) return\n // Sequential, not Promise.all: each upload reads the current max sort_order\n // to place itself last, and running them together makes them all read the\n // same value and land on the same position.\n await run(async () => {\n for (const file of Array.from(files)) {\n await getProvider().uploadProductImage(product.id, file)\n }\n if (fileRef.current) fileRef.current.value = ''\n })\n }\n\n function move(index: number, delta: number) {\n const target = index + delta\n if (target < 0 || target >= images.length) return\n const a = images[index]!\n const b = images[target]!\n // Swap the two positions rather than renumbering the list: fewer writes, and\n // a failure halfway leaves an order that is still coherent.\n void run(async () => {\n const update = getProvider().updateProductImage\n if (!update) throw new Error('Este provider não suporta reordenar imagens.')\n await update(a.id, { sortOrder: b.sortOrder ?? target })\n await update(b.id, { sortOrder: a.sortOrder ?? index })\n })\n }\n\n const update = getProvider().updateProductImage\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div>\n <h3 className=\"text-sm font-semibold\">Fotos do produto</h3>\n <p className=\"text-xs text-muted-foreground\">\n A primeira foto é a capa — aparece no catálogo, no carrinho e no pedido.\n As demais viram o carrossel na página do produto.\n </p>\n </div>\n <label className=\"inline-flex cursor-pointer items-center rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground transition hover:opacity-90\">\n {busy ? 'Enviando…' : 'Adicionar fotos'}\n <input\n ref={fileRef}\n type=\"file\"\n accept=\"image/*\"\n multiple\n disabled={busy}\n className=\"hidden\"\n onChange={(event) => void upload(event.target.files)}\n />\n </label>\n </div>\n\n {error && (\n <p className=\"rounded-md border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-800\">{error}</p>\n )}\n\n {images.length === 0 ? (\n <p className=\"rounded-lg border border-dashed px-4 py-10 text-center text-sm text-muted-foreground\">\n Nenhuma foto ainda. Produtos com mais de uma foto vendem melhor — mostre a\n embalagem, o produto pronto e uma referência de tamanho.\n </p>\n ) : (\n <ul className=\"fz-cards gap-3\">\n {images.map((image, index) => (\n <li key={image.id} className=\"overflow-hidden rounded-lg border\">\n <div className=\"relative aspect-square bg-muted\">\n <img src={image.url} alt={image.altText ?? ''} className=\"h-full w-full object-cover\" />\n {image.isPrimary && (\n <span className=\"absolute left-2 top-2 rounded-full bg-primary px-2 py-0.5 text-[11px] font-bold text-primary-foreground\">\n Capa\n </span>\n )}\n </div>\n <div className=\"flex items-center justify-between gap-1 px-2 py-1.5\">\n <div className=\"flex gap-1\">\n <IconButton label=\"Mover para trás\" disabled={busy || index === 0}\n onClick={() => move(index, -1)}>←</IconButton>\n <IconButton label=\"Mover para frente\" disabled={busy || index === images.length - 1}\n onClick={() => move(index, 1)}>→</IconButton>\n </div>\n <div className=\"flex gap-1\">\n {!image.isPrimary && update && (\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => void run(() => update(image.id, { isPrimary: true }))}\n className=\"rounded px-1.5 py-0.5 text-xs text-muted-foreground hover:bg-muted hover:text-foreground disabled:opacity-50\"\n >\n Usar como capa\n </button>\n )}\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => void run(() => getProvider().deleteProductImage(image.id))}\n className=\"rounded px-1.5 py-0.5 text-xs text-red-600 hover:bg-red-50 disabled:opacity-50\"\n >\n Excluir\n </button>\n </div>\n </div>\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n}\n\nfunction IconButton({ label, disabled, onClick, children }: {\n label: string\n disabled?: boolean\n onClick: () => void\n children: React.ReactNode\n}) {\n return (\n <button\n type=\"button\"\n aria-label={label}\n title={label}\n disabled={disabled}\n onClick={onClick}\n className=\"rounded border px-1.5 py-0.5 text-xs text-muted-foreground transition hover:bg-muted hover:text-foreground disabled:opacity-40\"\n >\n {children}\n </button>\n )\n}\n\n/** Cover first, then the merchant's order — the same rule the storefront uses. */\nfunction sortImages(images: ProductImage[]): ProductImage[] {\n return [...images].sort((a, b) => {\n if (a.isPrimary !== b.isPrimary) return a.isPrimary ? -1 : 1\n return (a.sortOrder ?? 0) - (b.sortOrder ?? 0)\n })\n}\n","import React from 'react'\nimport type { Product, ProductVariant, ShopProvider, VariantAxisInput, VariantMatrixRow } from '@fayz-ai/shop'\nimport {\n applyVariantMatrix, axesFromOptions, formatVariantCombination, hasOnlyDefaultVariant,\n leavesNothingSellable, MAX_VARIANT_AXES, planVariantMatrix, validateVariantAxes,\n} from '@fayz-ai/shop'\nimport { AlertTriangle, Loader2, Plus, Trash2, X } from 'lucide-react'\n\n/**\n * Variantes — os eixos de opção e a matriz que eles geram.\n *\n * A tela que faltava. As tabelas existem desde a 0028, a vitrine monta o\n * seletor a partir delas desde o M5 e o `shop_place_order` cobra por elas desde\n * a 0029 — mas nenhuma tela do admin sabia criá-las. Na prática, ou o lojista\n * chamava alguém com acesso ao banco, ou vendia P, M e G contra o mesmo\n * contador, que é exatamente o defeito que o cabeçalho da 0028 descreve.\n *\n * DUAS COISAS AQUI NÃO SÃO ESCOLHA DE TELA, e é por isso que elas moram no\n * @fayz-ai/shop e não neste arquivo:\n *\n * • A VARIANTE PADRÃO (0037). Todo produto tem uma, ela não aparece em lugar\n * nenhum, e sumir com o último eixo tem que trazê-la de volta — senão o\n * produto fica esgotado para sempre e ninguém vê erro. `applyVariantMatrix`\n * é quem sabe disso.\n * • O ESTOQUE. Desde a 0034 ele é razão, não coluna: quem digita 12 aqui não\n * escreve 12 em lugar nenhum, gera o movimento da DIFERENÇA e deixa a 0036\n * espelhar de volta. `setVariantStock` é quem sabe disso.\n */\nexport function ProductVariantsTab({ item, getProvider }: {\n item: unknown\n getProvider: () => ShopProvider\n}) {\n const product = item as Product\n const shop = getProvider()\n // Os quatro verbos que esta tela chama. Checar só um deixaria a aba abrir e\n // quebrar no primeiro clique — que é pior do que não abrir.\n const supported =\n typeof shop.getProductVariants === 'function' &&\n typeof shop.saveProductOptions === 'function' &&\n typeof shop.createProductVariant === 'function' &&\n typeof shop.updateProductVariant === 'function'\n\n const [axes, setAxes] = React.useState<VariantAxisInput[]>([])\n const [variants, setVariants] = React.useState<ProductVariant[]>([])\n const [busy, setBusy] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const [selected, setSelected] = React.useState<Set<string>>(new Set())\n const [dirty, setDirty] = React.useState(false)\n\n const reload = React.useCallback(async () => {\n // includeArchived: uma combinação removida e recolocada tem que REVIVER a\n // linha antiga — a 0028 tem UNIQUE (product_id, options) e um INSERT novo\n // bateria nela.\n const set = await getProvider().getProductVariants!(product.id, { includeArchived: true })\n setAxes(axesFromOptions(set.options))\n setVariants(set.variants)\n setSelected(new Set())\n setDirty(false)\n }, [getProvider, product.id])\n\n React.useEffect(() => {\n if (!supported) return\n void reload().catch((e) => setError(message(e)))\n }, [reload, supported])\n\n async function run(action: () => Promise<unknown>) {\n setBusy(true)\n setError(null)\n try {\n await action()\n await reload()\n } catch (e) {\n setError(message(e))\n } finally {\n setBusy(false)\n }\n }\n\n const plan = React.useMemo(() => planVariantMatrix(axes, variants), [axes, variants])\n const axisError = validateVariantAxes(axes)\n const onlyDefault = hasOnlyDefaultVariant(variants)\n const rows = plan.rows\n\n function patchAxes(next: VariantAxisInput[]) {\n setAxes(next)\n setDirty(true)\n }\n\n const save = () => run(() => applyVariantMatrix(getProvider(), product.id, axes, variants))\n\n if (!supported) {\n return <Notice>Este provedor de loja não administra variantes.</Notice>\n }\n\n return (\n <div className=\"space-y-6\">\n {/* — Eixos — */}\n <section className=\"space-y-3\">\n <header className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <h3 className=\"text-sm font-semibold\">Opções</h3>\n <p className=\"text-xs text-muted-foreground\">\n Tamanho, cor, sabor. Cada combinação vira uma variante com preço, SKU e estoque próprios\n — é assim que P e GG deixam de dividir o mesmo contador.\n </p>\n </div>\n <button\n type=\"button\"\n disabled={busy || axes.length >= MAX_VARIANT_AXES}\n onClick={() => patchAxes([...axes, { name: '', values: [] }])}\n className=\"inline-flex items-center gap-1.5 rounded-md border px-2.5 py-1.5 text-xs font-medium transition hover:bg-muted disabled:opacity-40\"\n >\n <Plus className=\"h-3.5 w-3.5\" /> Adicionar opção\n </button>\n </header>\n\n {axes.length === 0 ? (\n <p className=\"rounded-lg border border-dashed px-4 py-8 text-center text-sm text-muted-foreground\">\n Este produto é vendido de um jeito só. Adicione uma opção se ele tem tamanhos, cores ou sabores.\n </p>\n ) : (\n <ul className=\"space-y-3\">\n {axes.map((axis, index) => (\n <AxisEditor\n key={index}\n axis={axis}\n index={index}\n count={axes.length}\n disabled={busy}\n onChange={(next) => patchAxes(axes.map((a, i) => (i === index ? next : a)))}\n onMove={(delta) => {\n const target = index + delta\n if (target < 0 || target >= axes.length) return\n const next = [...axes]\n const [moved] = next.splice(index, 1)\n next.splice(target, 0, moved!)\n patchAxes(next)\n }}\n onRemove={() => patchAxes(axes.filter((_, i) => i !== index))}\n />\n ))}\n </ul>\n )}\n\n {axisError && <Notice tone=\"error\">{axisError}</Notice>}\n {!axisError && leavesNothingSellable(plan) && (\n <Notice tone=\"error\">\n Sem nenhuma opção este produto ficaria sem nada vendável — ele não tem a variante padrão\n que a plataforma cria hoje. Fale com o suporte antes de salvar.\n </Notice>\n )}\n\n {dirty && (\n <div className=\"flex flex-wrap items-center gap-3 rounded-lg border bg-muted/30 px-4 py-3\">\n <p className=\"flex-1 text-xs text-muted-foreground\">\n {describePlan(plan)}\n </p>\n <button type=\"button\" disabled={busy} onClick={() => void reload()}\n className=\"rounded-md px-3 py-1.5 text-xs text-muted-foreground hover:bg-muted disabled:opacity-40\">\n Descartar\n </button>\n <button\n type=\"button\"\n disabled={busy || Boolean(axisError)}\n onClick={save}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground disabled:opacity-50\"\n >\n {busy && <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />}\n Salvar variantes\n </button>\n </div>\n )}\n </section>\n\n {error && <Notice tone=\"error\">{error}</Notice>}\n\n {/* — Matriz — */}\n {rows.length > 0 && (\n <VariantGrid\n rows={rows}\n axes={axes}\n product={product}\n busy={busy}\n dirty={dirty}\n selected={selected}\n onSelect={setSelected}\n onSave={(variantId, patch) => run(() => getProvider().updateProductVariant!(variantId, patch))}\n onStock={(variantId, count) => run(() => getProvider().setVariantStock!(variantId, count))}\n />\n )}\n\n {rows.length === 0 && onlyDefault && (\n <p className=\"text-xs text-muted-foreground\">\n Preço, SKU e estoque deste produto continuam na aba de cadastro.\n </p>\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Eixo\n// ---------------------------------------------------------------------------\n\nfunction AxisEditor({ axis, index, count, disabled, onChange, onMove, onRemove }: {\n axis: VariantAxisInput\n index: number\n count: number\n disabled: boolean\n onChange: (next: VariantAxisInput) => void\n onMove: (delta: number) => void\n onRemove: () => void\n}) {\n const [draft, setDraft] = React.useState('')\n\n function commit(raw: string) {\n // Vírgula separa: colar \"P, M, G\" é como um lojista digita uma grade, e\n // pedir três enters para isso é atrito sem motivo.\n const values = raw.split(',').map((v) => v.trim()).filter(Boolean)\n if (values.length === 0) return\n const merged = [...axis.values]\n for (const value of values) if (!merged.includes(value)) merged.push(value)\n onChange({ ...axis, values: merged })\n setDraft('')\n }\n\n return (\n <li className=\"rounded-lg border bg-card p-3\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <input\n value={axis.name}\n disabled={disabled}\n onChange={(e) => onChange({ ...axis, name: e.target.value })}\n placeholder=\"Tamanho\"\n aria-label={`Nome da opção ${index + 1}`}\n className=\"h-8 w-40 rounded-input border border-input bg-background px-2 text-sm font-medium\"\n />\n <span className=\"flex-1\" />\n <IconButton label=\"Mover para cima\" disabled={disabled || index === 0} onClick={() => onMove(-1)}>↑</IconButton>\n <IconButton label=\"Mover para baixo\" disabled={disabled || index === count - 1} onClick={() => onMove(1)}>↓</IconButton>\n <button\n type=\"button\"\n aria-label=\"Remover opção\"\n disabled={disabled}\n onClick={onRemove}\n className=\"rounded p-1.5 text-muted-foreground transition hover:text-destructive disabled:opacity-40\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n\n <div className=\"mt-2 flex flex-wrap items-center gap-1.5\">\n {axis.values.map((value, position) => (\n <span key={value} className=\"inline-flex items-center gap-1 rounded-full bg-muted px-2.5 py-1 text-xs\">\n {value}\n <button\n type=\"button\"\n aria-label={`Remover ${value}`}\n disabled={disabled}\n onClick={() => onChange({ ...axis, values: axis.values.filter((_, i) => i !== position) })}\n className=\"text-muted-foreground hover:text-destructive disabled:opacity-40\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </span>\n ))}\n <input\n value={draft}\n disabled={disabled}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') { e.preventDefault(); commit(draft) }\n }}\n onBlur={() => commit(draft)}\n placeholder={axis.values.length === 0 ? 'P, M, G' : 'adicionar'}\n aria-label={`Valores da opção ${index + 1}`}\n className=\"h-7 min-w-28 flex-1 rounded-input border border-dashed border-input bg-transparent px-2 text-xs\"\n />\n </div>\n </li>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Matriz\n// ---------------------------------------------------------------------------\n\nconst UNITS = ['kg', 'g', 'lb']\n\nfunction VariantGrid({ rows, axes, product, busy, dirty, selected, onSelect, onSave, onStock }: {\n rows: VariantMatrixRow[]\n axes: VariantAxisInput[]\n product: Product\n busy: boolean\n dirty: boolean\n selected: Set<string>\n onSelect: (next: Set<string>) => void\n onSave: (variantId: string, patch: Record<string, unknown>) => void\n onStock: (variantId: string, count: number) => void\n}) {\n const saved = rows.filter((row) => row.variant)\n const allSelected = saved.length > 0 && saved.every((row) => selected.has(row.variant!.id))\n\n function toggle(id: string) {\n const next = new Set(selected)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n onSelect(next)\n }\n\n return (\n <section className=\"space-y-3\">\n <header>\n <h3 className=\"text-sm font-semibold\">Variantes</h3>\n <p className=\"text-xs text-muted-foreground\">\n Preço vazio herda o preço do produto — o catálogo em que todo tamanho custa igual não precisa\n repetir o número {rows.length} vezes. Medida vazia herda a do produto, do mesmo jeito.\n </p>\n </header>\n\n {dirty && (\n <Notice>\n As linhas abaixo ainda refletem o que está salvo. Salve as opções para gerar as novas combinações.\n </Notice>\n )}\n\n {selected.size > 0 && (\n <BulkBar\n count={selected.size}\n disabled={busy}\n onApply={(patch) => {\n for (const id of selected) onSave(id, patch)\n }}\n onClear={() => onSelect(new Set())}\n />\n )}\n\n <div className=\"overflow-x-auto rounded-lg border\">\n <table className=\"w-full min-w-[62rem] text-sm\">\n <thead className=\"bg-muted/40 text-left text-xs text-muted-foreground\">\n <tr>\n <th className=\"w-9 px-2 py-2\">\n <input\n type=\"checkbox\"\n aria-label=\"Selecionar todas\"\n checked={allSelected}\n disabled={busy || saved.length === 0}\n onChange={() => onSelect(allSelected ? new Set() : new Set(saved.map((r) => r.variant!.id)))}\n />\n </th>\n <th className=\"px-2 py-2 font-medium\">Variante</th>\n <th className=\"px-2 py-2 font-medium\">Preço</th>\n <th className=\"px-2 py-2 font-medium\">Comparativo</th>\n <th className=\"px-2 py-2 font-medium\">SKU</th>\n <th className=\"px-2 py-2 font-medium\">Estoque</th>\n <th className=\"px-2 py-2 font-medium\">Peso</th>\n <th className=\"px-2 py-2 font-medium\">A × L × C (cm)</th>\n <th className=\"px-2 py-2 font-medium\">Foto</th>\n <th className=\"px-2 py-2 font-medium\">Ativa</th>\n </tr>\n </thead>\n <tbody className=\"divide-y\">\n {rows.map((row) => (\n <VariantRow\n key={row.variant?.id ?? formatVariantCombination(row.options, axes)}\n row={row}\n axes={axes}\n product={product}\n busy={busy}\n checked={row.variant ? selected.has(row.variant.id) : false}\n onToggle={() => row.variant && toggle(row.variant.id)}\n onSave={onSave}\n onStock={onStock}\n />\n ))}\n </tbody>\n </table>\n </div>\n </section>\n )\n}\n\nfunction VariantRow({ row, axes, product, busy, checked, onToggle, onSave, onStock }: {\n row: VariantMatrixRow\n axes: VariantAxisInput[]\n product: Product\n busy: boolean\n checked: boolean\n onToggle: () => void\n onSave: (variantId: string, patch: Record<string, unknown>) => void\n onStock: (variantId: string, count: number) => void\n}) {\n const variant = row.variant\n const pending = !variant\n const label = formatVariantCombination(row.options, axes)\n\n // Só grava no blur, e só quando mudou: cada campo é um UPDATE e o estoque é\n // um movimento no razão — disparar a cada tecla encheria o histórico de\n // ajustes de um dígito.\n const commit = (field: string, value: unknown, previous: unknown) => {\n if (!variant || value === previous) return\n onSave(variant.id, { [field]: value })\n }\n\n return (\n <tr className={pending ? 'bg-muted/20 text-muted-foreground' : undefined}>\n <td className=\"px-2 py-1.5\">\n <input type=\"checkbox\" aria-label={`Selecionar ${label}`} checked={checked}\n disabled={busy || pending} onChange={onToggle} />\n </td>\n <td className=\"px-2 py-1.5 font-medium\">\n {label}\n {pending && <span className=\"ml-2 text-[10px] uppercase tracking-wide\">a criar</span>}\n </td>\n <td className=\"px-2 py-1.5\">\n <NumberCell value={variant?.price ?? null} disabled={busy || pending}\n placeholder={String(product.price)} onCommit={(v) => commit('price', v, variant?.price ?? null)} />\n </td>\n <td className=\"px-2 py-1.5\">\n <NumberCell value={variant?.compareAtPrice ?? null} disabled={busy || pending}\n placeholder=\"—\" onCommit={(v) => commit('compareAtPrice', v, variant?.compareAtPrice ?? null)} />\n </td>\n <td className=\"px-2 py-1.5\">\n <TextCell value={variant?.sku ?? ''} disabled={busy || pending}\n placeholder={product.sku ?? 'SKU'} onCommit={(v) => commit('sku', v || null, variant?.sku ?? null)} />\n </td>\n <td className=\"px-2 py-1.5\">\n <NumberCell\n value={variant?.inventoryCount ?? null}\n disabled={busy || pending}\n placeholder=\"0\"\n integer\n onCommit={(v) => {\n if (!variant || v == null || v === variant.inventoryCount) return\n onStock(variant.id, v)\n }}\n />\n </td>\n <td className=\"px-2 py-1.5\">\n <div className=\"flex items-center gap-1\">\n <NumberCell value={variant?.weight ?? null} disabled={busy || pending}\n placeholder={product.weight == null ? '—' : String(product.weight)} width=\"w-16\"\n onCommit={(v) => commit('weight', v, variant?.weight ?? null)} />\n <select\n value={variant?.weightUnit ?? ''}\n disabled={busy || pending}\n onChange={(e) => commit('weightUnit', e.target.value || null, variant?.weightUnit ?? null)}\n aria-label={`Unidade de peso de ${label}`}\n className=\"h-7 rounded-input border border-input bg-background px-1 text-xs\"\n >\n <option value=\"\">{product.weightUnit}</option>\n {UNITS.map((unit) => <option key={unit} value={unit}>{unit}</option>)}\n </select>\n </div>\n </td>\n <td className=\"px-2 py-1.5\">\n <div className=\"flex items-center gap-1\">\n {(['heightCm', 'widthCm', 'lengthCm'] as const).map((key) => (\n <NumberCell\n key={key}\n value={variant?.[key] ?? null}\n disabled={busy || pending}\n width=\"w-14\"\n placeholder={product[key] == null ? '—' : String(product[key])}\n onCommit={(v) => commit(key, v, variant?.[key] ?? null)}\n />\n ))}\n </div>\n </td>\n <td className=\"px-2 py-1.5\">\n <select\n value={variant?.imageId ?? ''}\n disabled={busy || pending || product.images.length === 0}\n onChange={(e) => commit('imageId', e.target.value || null, variant?.imageId ?? null)}\n aria-label={`Foto de ${label}`}\n className=\"h-7 w-24 rounded-input border border-input bg-background px-1 text-xs\"\n >\n <option value=\"\">capa</option>\n {product.images.map((image, index) => (\n <option key={image.id} value={image.id}>Foto {index + 1}</option>\n ))}\n </select>\n </td>\n <td className=\"px-2 py-1.5\">\n <input\n type=\"checkbox\"\n aria-label={`${label} ativa`}\n checked={variant?.status === 'active'}\n disabled={busy || pending}\n onChange={(e) => commit('status', e.target.checked ? 'active' : 'archived', variant?.status)}\n />\n </td>\n </tr>\n )\n}\n\n/** Preço e peso em massa — os dois que o Shopify tem, e os dois que uma grade\n * inteira costuma compartilhar. */\nfunction BulkBar({ count, disabled, onApply, onClear }: {\n count: number\n disabled: boolean\n onApply: (patch: Record<string, unknown>) => void\n onClear: () => void\n}) {\n const [price, setPrice] = React.useState('')\n const [weight, setWeight] = React.useState('')\n const [unit, setUnit] = React.useState('')\n\n return (\n <div className=\"flex flex-wrap items-center gap-2 rounded-lg border bg-muted/30 px-3 py-2 text-xs\">\n <span className=\"font-medium\">{count} selecionada{count > 1 ? 's' : ''}</span>\n <span className=\"text-muted-foreground\">·</span>\n <input value={price} onChange={(e) => setPrice(e.target.value)} placeholder=\"Preço\"\n aria-label=\"Preço para todas\" className=\"h-7 w-24 rounded-input border border-input bg-background px-2\" />\n <button type=\"button\" disabled={disabled || parseNumber(price) == null}\n onClick={() => { onApply({ price: parseNumber(price) }); setPrice('') }}\n className=\"rounded-md border px-2 py-1 font-medium hover:bg-muted disabled:opacity-40\">\n Aplicar preço\n </button>\n <span className=\"text-muted-foreground\">·</span>\n <input value={weight} onChange={(e) => setWeight(e.target.value)} placeholder=\"Peso\"\n aria-label=\"Peso para todas\" className=\"h-7 w-20 rounded-input border border-input bg-background px-2\" />\n <select value={unit} onChange={(e) => setUnit(e.target.value)} aria-label=\"Unidade para todas\"\n className=\"h-7 rounded-input border border-input bg-background px-1\">\n <option value=\"\">herdar</option>\n {UNITS.map((u) => <option key={u} value={u}>{u}</option>)}\n </select>\n <button type=\"button\" disabled={disabled || parseNumber(weight) == null}\n onClick={() => { onApply({ weight: parseNumber(weight), weightUnit: unit || null }); setWeight('') }}\n className=\"rounded-md border px-2 py-1 font-medium hover:bg-muted disabled:opacity-40\">\n Aplicar peso\n </button>\n <span className=\"flex-1\" />\n <button type=\"button\" onClick={onClear} className=\"text-muted-foreground hover:text-foreground\">\n limpar seleção\n </button>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Peças\n// ---------------------------------------------------------------------------\n\n/** '2,5' e '2.5' são a mesma medida — o lojista digita como o teclado dele manda. */\nexport function parseNumber(raw: string): number | null {\n const cleaned = raw.replace(/[^\\d,.-]/g, '').replace(',', '.')\n if (!cleaned.trim()) return null\n const n = Number(cleaned)\n return Number.isFinite(n) && n >= 0 ? n : null\n}\n\nfunction NumberCell({ value, disabled, placeholder, onCommit, width = 'w-20', integer }: {\n value: number | null\n disabled?: boolean\n placeholder?: string\n onCommit: (value: number | null) => void\n width?: string\n integer?: boolean\n}) {\n const [draft, setDraft] = React.useState(value == null ? '' : String(value))\n React.useEffect(() => { setDraft(value == null ? '' : String(value)) }, [value])\n return (\n <input\n value={draft}\n disabled={disabled}\n placeholder={placeholder}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => {\n const parsed = parseNumber(draft)\n onCommit(parsed == null ? null : integer ? Math.trunc(parsed) : parsed)\n }}\n className={`h-7 ${width} rounded-input border border-input bg-background px-2 text-xs tabular-nums`}\n />\n )\n}\n\nfunction TextCell({ value, disabled, placeholder, onCommit }: {\n value: string\n disabled?: boolean\n placeholder?: string\n onCommit: (value: string) => void\n}) {\n const [draft, setDraft] = React.useState(value)\n React.useEffect(() => { setDraft(value) }, [value])\n return (\n <input\n value={draft}\n disabled={disabled}\n placeholder={placeholder}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => onCommit(draft.trim())}\n className=\"h-7 w-28 rounded-input border border-input bg-background px-2 text-xs\"\n />\n )\n}\n\nfunction IconButton({ label, disabled, onClick, children }: {\n label: string\n disabled?: boolean\n onClick: () => void\n children: React.ReactNode\n}) {\n return (\n <button\n type=\"button\"\n aria-label={label}\n title={label}\n disabled={disabled}\n onClick={onClick}\n className=\"rounded border px-1.5 py-0.5 text-xs text-muted-foreground transition hover:bg-muted hover:text-foreground disabled:opacity-40\"\n >\n {children}\n </button>\n )\n}\n\nfunction Notice({ children, tone }: { children: React.ReactNode; tone?: 'error' }) {\n const cls = tone === 'error'\n ? 'border-destructive/30 bg-destructive/5 text-destructive'\n : 'border-border bg-muted/30 text-muted-foreground'\n return (\n <p className={`flex items-start gap-2 rounded-md border px-3 py-2 text-xs ${cls}`}>\n {tone === 'error' && <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />}\n <span>{children}</span>\n </p>\n )\n}\n\nfunction describePlan(plan: ReturnType<typeof planVariantMatrix>): string {\n const parts: string[] = []\n if (plan.create.length) parts.push(`${plan.create.length} a criar`)\n if (plan.reactivate.length) parts.push(`${plan.reactivate.length} a reativar`)\n if (plan.archive.length) parts.push(`${plan.archive.length} a arquivar`)\n if (parts.length === 0) return 'Nenhuma combinação muda.'\n // Arquivar e não excluir: a 0034 apaga o saldo junto com a variante, e o\n // estoque que sobrou é de mercadoria que o lojista ainda tem na prateleira.\n return `${parts.join(', ')}. Combinações removidas são arquivadas, nunca excluídas — o estoque delas continua no histórico.`\n}\n\nfunction message(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n","/** The Entrega settings tab id, as the manifest declares it. */\nexport const SHIPPING_SETTINGS_TAB = 'shop-shipping'\n\nexport const SHIPPING_SETTINGS_ROUTE = `/settings/${SHIPPING_SETTINGS_TAB}`\n\n/** The shell's own prefix for a registry inside a plugin settings tab. */\nconst PROPERTIES = '_properties'\n\nexport function shippingRegistryPath(registryId: string): string {\n return `${SHIPPING_SETTINGS_ROUTE}/${PROPERTIES}/${registryId}`\n}\n\n/**\n * Straight to the form of ONE record.\n *\n * A summary row that names a place and then lands on the list of places makes\n * the reader find it again, open it, and click \"editar\" — three steps to reach\n * what the row was already pointing at.\n */\nexport function shippingRecordPath(registryId: string, recordId: string, mode: 'view' | 'edit' = 'edit'): string {\n const base = `${shippingRegistryPath(registryId)}/${recordId}`\n return mode === 'edit' ? `${base}/edit` : base\n}\n\n/**\n * The registry the URL is asking for, or null for the tab's summary.\n *\n * Returns the raw id rather than validating against a list — the registry lookup\n * is the only list, and a second one here is what drifted when `zonas` was\n * renamed.\n */\nexport function shippingRegistryIdFromHash(hash?: string): string | null {\n const raw = hash ?? (typeof window === 'undefined' ? '' : window.location.hash)\n const path = raw.startsWith('#') ? raw.slice(1) : raw\n const marker = `${SHIPPING_SETTINGS_ROUTE}/${PROPERTIES}/`\n if (!path.startsWith(marker)) return null\n return path.slice(marker.length).split('/')[0] || null\n}\n","import React from 'react'\nimport { errorMessage } from '../settings/error-message'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport type { ShippingPackage, ShopProvider } from '@fayz-ai/shop'\nimport { adminNavigateTo, CrudFormPage } from '@fayz-ai/admin'\nimport { resolveDataProvider } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\nimport { Box, ChevronDown, Plus } from 'lucide-react'\nimport { Modal, ModalContent, ModalHeader, ModalTitle, ModalBody } from '@fayz-ai/ui'\nimport { packageMeasureLabel, packagesRegistry, PACKAGES_REGISTRY } from '../data/registries'\nimport { shippingRegistryPath } from '../data/registry-routes'\n\nconst PACKAGES_ROUTE = shippingRegistryPath(PACKAGES_REGISTRY)\n\n/**\n * Em que embalagem ESTE produto vai.\n *\n * A lista de embalagens da loja é a fonte (Configurações → Entrega →\n * Embalagens); aqui o produto só aponta para uma linha dela. Foi a correção do\n * founder sobre o Shopify: lá o produto se ASSOCIA a uma embalagem já\n * cadastrada, em vez de repetir altura e largura no cadastro de cada item — o\n * que ele escolhe não é uma medida, é o pacote em que a loja despacha.\n *\n * Vazio = «padrão da loja», que é um estado legítimo e o de toda loja no dia\n * seguinte à 0046. Não é «não preenchido».\n */\nexport function PackageSelect({ value, onChange, getProvider }: {\n value: string | null\n onChange: (next: string | null) => void\n getProvider?: () => ShopProvider\n}) {\n const shop = React.useMemo(() => getProvider?.() ?? getShopProvider(), [getProvider])\n const [rows, setRows] = React.useState<ShippingPackage[] | null>(null)\n const [open, setOpen] = React.useState(false)\n const [creating, setCreating] = React.useState(false)\n const ref = React.useRef<HTMLDivElement>(null)\n\n const load = React.useCallback(() => {\n if (typeof shop.listShippingPackages !== 'function') { setRows([]); return }\n void shop.listShippingPackages().then(setRows).catch(() => setRows([]))\n }, [shop])\n\n React.useEffect(load, [load])\n\n React.useEffect(() => {\n if (!open) return\n const away = (event: MouseEvent) => {\n if (ref.current && !ref.current.contains(event.target as Node)) setOpen(false)\n }\n document.addEventListener('mousedown', away)\n return () => document.removeEventListener('mousedown', away)\n }, [open])\n\n const selected = (rows ?? []).find((row) => row.id === value) ?? null\n const storeDefault = (rows ?? []).find((row) => row.isDefault) ?? null\n\n const label = selected\n ? `${selected.name} — ${packageMeasureLabel(selected)}`\n : storeDefault\n ? `Padrão da loja • ${storeDefault.name} — ${packageMeasureLabel(storeDefault)}`\n : 'Padrão da loja'\n\n return (\n <div className=\"relative\" ref={ref}>\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n className=\"flex h-9 w-full items-center gap-2 rounded-input border border-input bg-background px-3 text-left text-sm shadow-sm\"\n >\n <Box className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate\">{label}</span>\n <ChevronDown className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n </button>\n\n {open && (\n <div className=\"absolute z-30 mt-1 w-full overflow-hidden rounded-lg border bg-popover shadow-lg\">\n <button\n type=\"button\"\n onClick={() => { setOpen(false); setCreating(true) }}\n className=\"flex w-full items-center gap-2 px-3 py-2 text-left text-sm text-primary hover:bg-muted\"\n >\n <Plus className=\"h-4 w-4\" /> Adicionar embalagem\n </button>\n <div className=\"max-h-64 overflow-y-auto border-t\">\n <Option\n label=\"Padrão da loja\"\n hint={storeDefault ? packageMeasureLabel(storeDefault) : 'Nenhuma marcada — cai no piso da transportadora.'}\n active={value == null}\n onClick={() => { onChange(null); setOpen(false) }}\n />\n {(rows ?? []).map((row) => (\n <Option\n key={row.id}\n label={row.name}\n hint={packageMeasureLabel(row)}\n active={row.id === value}\n onClick={() => { onChange(row.id); setOpen(false) }}\n />\n ))}\n </div>\n <button\n type=\"button\"\n onClick={() => { setOpen(false); adminNavigateTo(PACKAGES_ROUTE) }}\n className=\"w-full border-t px-3 py-2 text-left text-xs text-muted-foreground hover:bg-muted\"\n >\n Gerenciar embalagens\n </button>\n </div>\n )}\n\n {creating && (\n <NewPackageModal\n onClose={() => setCreating(false)}\n onCreated={(id) => { setCreating(false); onChange(id); load() }}\n />\n )}\n </div>\n )\n}\n\n/**\n * Cadastrar uma caixa sem sair do produto.\n *\n * Monta o MESMO EntityDef do registry no `CrudFormPage` genérico e grava pelo\n * MESMO provider — não é um formulário paralelo com os mesmos seis campos\n * digitados de novo, que é como duas telas para uma tabela começam a discordar\n * sobre o que é obrigatório.\n */\nfunction NewPackageModal({ onClose, onCreated }: {\n onClose: () => void\n onCreated: (id: string) => void\n}) {\n const [error, setError] = React.useState<string | null>(null)\n const provider = React.useMemo(\n () => resolveDataProvider(packagesRegistry.entity as EntityDef<{ id: string }>),\n [],\n )\n\n // Pelo Modal da SDK, e não por uma caixa `fixed` solta: o formulário agora\n // mede a PRÓPRIA largura (container query), e um `fixed` dentro dele passaria\n // a cobrir só a coluna do formulário em vez da tela.\n return (\n <Modal open onOpenChange={(next) => { if (!next) onClose() }}>\n <ModalContent size=\"2xl\">\n <ModalHeader>\n <ModalTitle>Nova embalagem</ModalTitle>\n </ModalHeader>\n <ModalBody className=\"space-y-3\">\n {error && <p className=\"rounded-md border border-destructive/30 bg-destructive/5 px-3 py-2 text-xs text-destructive\">{error}</p>}\n <CrudFormPage\n entityDef={packagesRegistry.entity as EntityDef}\n mode=\"create\"\n namePlural=\"Embalagens\"\n embedded\n onCancel={onClose}\n onSubmit={async (data) => {\n try {\n const created = await provider.create(data as never)\n onCreated((created as { id: string }).id)\n } catch (e) {\n setError(errorMessage(e))\n }\n }}\n />\n </ModalBody>\n </ModalContent>\n </Modal>\n )\n}\n\nfunction Option({ label, hint, active, onClick }: {\n label: string\n hint: string\n active: boolean\n onClick: () => void\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={`flex w-full flex-col px-3 py-2 text-left hover:bg-muted ${active ? 'bg-muted/60' : ''}`}\n >\n <span className=\"text-sm\">{label}</span>\n <span className=\"text-xs text-muted-foreground\">{hint}</span>\n </button>\n )\n}\n","import React from 'react'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport type { ShippingProfile, ShopProvider } from '@fayz-ai/shop'\nimport { adminNavigateTo } from '@fayz-ai/admin'\nimport { ExternalLink } from 'lucide-react'\nimport { SHIPPING_PROFILES_REGISTRY } from '../data/registries'\nimport { shippingRegistryPath } from '../data/registry-routes'\n\n/**\n * Which zones this product ships through — it points at an existing profile, the\n * way it points at a package. Empty is the general profile, a real state, which\n * is why the empty option is named rather than blank.\n */\nexport function ShippingProfileSelect({ value, onChange, getProvider }: {\n value: string | null\n onChange: (next: string | null) => void\n getProvider?: () => ShopProvider\n}) {\n const shop = React.useMemo(() => getProvider?.() ?? getShopProvider(), [getProvider])\n const [rows, setRows] = React.useState<ShippingProfile[] | null>(null)\n\n React.useEffect(() => {\n let cancelled = false\n if (typeof shop.listShippingProfiles !== 'function') { setRows([]); return }\n void shop.listShippingProfiles()\n .then((list) => { if (!cancelled) setRows(list) })\n .catch(() => { if (!cancelled) setRows([]) })\n return () => { cancelled = true }\n }, [shop])\n\n const custom = (rows ?? []).filter((row) => !row.isDefault)\n const chosen = custom.find((row) => row.id === value) ?? null\n\n return (\n <div className=\"space-y-1.5\">\n <select\n value={value ?? ''}\n onChange={(event) => onChange(event.target.value || null)}\n disabled={rows == null}\n className=\"flex h-9 w-full rounded-input border border-input bg-background px-3 py-1.5 text-sm shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <option value=\"\">Geral — as zonas normais da loja</option>\n {custom.map((row) => (\n <option key={row.id} value={row.id}>\n {row.name}\n {row.carrierQuotes === false ? ' — só entrega própria' : ''}\n </option>\n ))}\n </select>\n\n <p className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n {chosen?.carrierQuotes === false\n ? 'Este produto não é cotado por transportadora: sai só pelas zonas do perfil.'\n : custom.length === 0\n ? 'Nenhum perfil além do geral.'\n : 'Perfil de entrega deste produto.'}\n <button\n type=\"button\"\n onClick={() => adminNavigateTo(shippingRegistryPath(SHIPPING_PROFILES_REGISTRY))}\n className=\"inline-flex items-center gap-1 text-primary hover:underline\"\n >\n {custom.length === 0 ? 'Criar um perfil' : 'Gerenciar perfis'}\n <ExternalLink className=\"h-3 w-3\" />\n </button>\n </p>\n </div>\n )\n}\n","import React from 'react'\nimport { Package } from 'lucide-react'\nimport { Thumbnail } from '@fayz-ai/ui'\nimport type { EntityDef, EntityImageConfig, FieldDef } from '@fayz-ai/core'\nimport type { Product, ShopProvider } from '@fayz-ai/shop'\nimport { ProductImagesTab } from './ProductImagesTab'\nimport { ProductVariantsTab } from './ProductVariantsTab'\nimport { PackageSelect } from './PackageSelect'\nimport { ShippingProfileSelect } from './ShippingProfileSelect'\n\n/** Tudo o que só faz sentido para algo que entra numa caixa. */\nconst physical = (values: Record<string, unknown>) => values.isPhysical !== false\n\n// ---------------------------------------------------------------------------\n// Storefront Product — the single source of truth for the shop product CRUD.\n// Drives the list columns AND the form sections via the generic CRUD scaffolding\n// (createCrudPage → CrudListView + CrudFormPage), same pattern plugin-inventory\n// uses for its ERP product.\n//\n// This is deliberately the STOREFRONT shape (what a shopper sees: name, price,\n// compare-at, images, publication status), not the ERP shape plugin-inventory\n// models (cost, margin, min/max levels). They are different products in\n// different tables — see the shop/inventory bridge note in the roadmap.\n//\n// VARIANTES vivem na aba \"Variantes\" e não aqui: os eixos e a matriz são uma\n// COLEÇÃO derivada do produto, não campos dele, do mesmo jeito que as fotos.\n// (Este cabeçalho dizia \"falta plg_shop_variants\" — as tabelas existem desde a\n// 0028 e a vitrine lê delas desde o M5; o que faltava era a tela.)\n//\n// Not modelled here because the schema has nowhere to put them yet:\n// • SEO title/description — needs columns on plg_shop_products\n// • multi-category — the column is a single category_id\n// ---------------------------------------------------------------------------\n\nconst STATUS_TONE: Record<string, string> = {\n active: 'bg-emerald-100 text-emerald-800',\n draft: 'bg-gray-100 text-gray-700',\n archived: 'bg-orange-100 text-orange-700',\n}\n\nconst STATUS_LABEL: Record<string, string> = {\n active: 'Ativo',\n draft: 'Rascunho',\n archived: 'Arquivado',\n}\n\nfunction money(value: unknown, currency = 'BRL') {\n const n = Number(value)\n if (!Number.isFinite(n)) return '—'\n return new Intl.NumberFormat('pt-BR', { style: 'currency', currency }).format(n)\n}\n\n/** `name` → `name-do-produto`, so the storefront URL is filled in for you. */\nexport function slugify(value: string): string {\n return value\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n}\n\n/**\n * Wires the form's image slot to the product's own images. `uploadProductImage`\n * has existed on the provider all along with nothing calling it — the slot was a\n * decorative square, so a product with a photo still showed an empty placeholder.\n */\nfunction productImage(getProvider: () => ShopProvider): EntityImageConfig {\n return {\n get: (row) => {\n const images = (row as Partial<Product>).images\n return images?.find((i) => i.isPrimary)?.url ?? images?.[0]?.url\n },\n upload: async (file, row) => {\n if (!row.id) throw new Error('Salve o produto antes de enviar a imagem.')\n const image = await getProvider().uploadProductImage(row.id, file)\n return image.url\n },\n accept: 'image/*',\n }\n}\n\nexport function buildShopProductEntity(\n currencyCode = 'BRL',\n getProvider?: () => ShopProvider,\n): EntityDef<Product> {\n const fields: FieldDef[] = [\n // — Geral —\n {\n key: 'name', label: 'Nome do produto', type: 'text', required: true,\n group: 'general', placeholder: 'Costela Bovina Defumada 400g',\n searchable: true, showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n <div className=\"flex items-center gap-3\">\n {/* Always the square, photo or not: a product without one used to\n render nothing and pull its name back against the rows that had\n one, so the column stopped reading as a column. */}\n <Thumbnail src={row.images?.[0]?.url} icon={Package} />\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium\">{row.name}</p>\n {row.sku && <p className=\"text-xs text-muted-foreground\">{row.sku}</p>}\n </div>\n </div>\n ),\n },\n {\n key: 'slug', label: 'URL', type: 'text', group: 'general',\n placeholder: 'gerado a partir do nome',\n hint: 'Endereço do produto na loja. Deixe em branco para gerar automaticamente.',\n showInTable: false,\n },\n {\n key: 'description', label: 'Descrição', type: 'textarea', group: 'general', span: 2,\n placeholder: 'Como é feito, como preparar, o que acompanha…',\n showInTable: false,\n },\n\n // — Preço —\n {\n key: 'price', label: 'Preço de venda', type: 'currency', required: true,\n group: 'pricing', currency: currencyCode, currencySymbol: 'R$', currencyLocale: 'pt-BR',\n showInTable: true, sortable: true,\n renderCell: (v, row: any) => (\n <div className=\"text-right\">\n <span className=\"font-medium\">{money(v, row.currency)}</span>\n {row.compareAtPrice > row.price && (\n <span className=\"ml-2 text-xs text-muted-foreground line-through\">\n {money(row.compareAtPrice, row.currency)}\n </span>\n )}\n </div>\n ),\n },\n {\n key: 'compareAtPrice', label: 'Preço comparativo', type: 'currency', group: 'pricing',\n currency: currencyCode, currencySymbol: 'R$', currencyLocale: 'pt-BR',\n hint: 'Preço \"de\" riscado. Deixe vazio se não estiver em promoção.',\n showInTable: false,\n },\n {\n key: 'discount', label: 'Desconto', type: 'computed', group: 'pricing', showInTable: false,\n compute: (vals) => {\n const price = Number(vals.price) || 0\n const compare = Number(vals.compareAtPrice) || 0\n if (compare <= 0 || price <= 0 || compare <= price) return null\n const pct = ((compare - price) / compare) * 100\n return { display: `-${pct.toFixed(0)}%`, tone: 'positive' }\n },\n },\n\n // — Estoque —\n {\n key: 'sku', label: 'SKU', type: 'text', group: 'inventory',\n placeholder: 'ART-001', searchable: true, showInTable: false,\n },\n {\n key: 'inventoryCount', label: 'Estoque', type: 'number', group: 'inventory', min: 0,\n placeholder: '0', hint: 'Chega a zero e o produto aparece como esgotado na loja.',\n showInTable: true, sortable: true,\n renderCell: (v) => {\n const n = Number(v) || 0\n return (\n <span className={`block text-right ${n === 0 ? 'font-medium text-destructive' : n <= 3 ? 'text-orange-600' : ''}`}>\n {n}\n </span>\n )\n },\n },\n\n // — Publicação —\n {\n key: 'status', label: 'Status', type: 'segmented', required: true,\n group: 'publishing', span: 2,\n options: [\n { label: 'Rascunho', value: 'draft', description: 'Só você vê. Não aparece na loja.' },\n { label: 'Ativo', value: 'active', description: 'Publicado e à venda.' },\n { label: 'Arquivado', value: 'archived', description: 'Fora da loja, histórico preservado.' },\n ],\n showInTable: true, sortable: false,\n renderCell: (v) => {\n const s = String(v ?? 'draft')\n return (\n <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium ${STATUS_TONE[s] ?? STATUS_TONE.draft}`}>\n {STATUS_LABEL[s] ?? s}\n </span>\n )\n },\n },\n {\n key: 'sortOrder', label: 'Ordem na vitrine', type: 'number', group: 'publishing',\n placeholder: '0', hint: 'Menor aparece primeiro.', showInTable: false,\n },\n\n // — Envio —\n // O desenho é o do Shopify e a ordem importa: o interruptor primeiro, e o\n // resto da seção só existe depois dele. Perguntar altura de um e-book não é\n // um campo extra inofensivo — é um convite a preencher e pagar frete de um\n // download.\n {\n key: 'isPhysical', label: 'Produto físico', type: 'boolean', group: 'shipping', span: 2,\n hint: 'Desmarque para itens digitais. Eles saem do cálculo da caixa e não entram no frete.',\n showInTable: false, defaultValue: true,\n },\n {\n // Antes da embalagem de propósito: o perfil decide POR QUAIS ZONAS o item\n // sai, e a embalagem, em que caixa. A primeira pergunta é a que muda quem\n // pode levar.\n key: 'shippingProfileId', label: 'Perfil de entrega', type: 'custom', group: 'shipping', span: 2,\n hint: 'Por quais zonas este produto sai. \"Geral\" é o de todo produto que ninguém moveu.',\n showInTable: false,\n visibleWhen: (values) => values.isPhysical !== false,\n renderInput: ({ value, onChange }) => (\n <ShippingProfileSelect\n value={(value as string | null) ?? null}\n onChange={onChange}\n getProvider={getProvider}\n />\n ),\n },\n {\n key: 'packageId', label: 'Embalagem', type: 'custom', group: 'shipping', span: 2,\n hint: 'Em que a loja despacha este produto. \"Padrão da loja\" usa a embalagem marcada em Configurações → Entrega.',\n showInTable: false,\n visibleWhen: (values) => values.isPhysical !== false,\n renderInput: ({ value, onChange }) => (\n <PackageSelect\n value={(value as string | null) ?? null}\n onChange={onChange}\n getProvider={getProvider}\n />\n ),\n },\n {\n key: 'weight', label: 'Peso', type: 'number', group: 'shipping', min: 0, placeholder: '0,4',\n hint: 'Do produto embalado. A caixa vem do cadastro acima.',\n showInTable: false, visibleWhen: (values) => values.isPhysical !== false,\n },\n {\n key: 'weightUnit', label: 'Unidade', type: 'select', group: 'shipping', showInTable: false,\n hint: 'A cotação converte. Até agora ela assumia kg.',\n options: [{ label: 'kg', value: 'kg' }, { label: 'g', value: 'g' }, { label: 'lb', value: 'lb' }],\n visibleWhen: (values) => values.isPhysical !== false,\n },\n // Em centímetros, sem seletor de unidade: a coluna é `*_cm` e a caixa da\n // loja também. Duas unidades para a mesma medida é como o peso passou\n // quatro anos sendo lido errado.\n { key: 'heightCm', label: 'Altura (cm)', type: 'number', group: 'shipping', min: 0, placeholder: '10', showInTable: false, visibleWhen: physical },\n { key: 'widthCm', label: 'Largura (cm)', type: 'number', group: 'shipping', min: 0, placeholder: '20', showInTable: false, visibleWhen: physical },\n { key: 'lengthCm', label: 'Comprimento (cm)', type: 'number', group: 'shipping', min: 0, placeholder: '30', showInTable: false, visibleWhen: physical },\n {\n // Declarado aqui para poder viajar — para a transportadora, para o motoboy\n // ou para quem embala. O que a loja FAZ com um carrinho refrigerado é uma\n // decisão dela, em Configurações → Entrega.\n //\n // `visibleWhen: physical` junto com as medidas, e pelo mesmo motivo: um\n // download não tem caixa, e não há como exigir frio de um arquivo.\n key: 'handling', label: 'Exige cuidado especial', type: 'multiselect', group: 'shipping',\n showInTable: false, visibleWhen: physical,\n hint: 'Vai junto com o pedido para quem entrega. Refrigerado ou congelado também limita como a loja pode enviar.',\n options: [\n { label: 'Refrigerado', value: 'refrigerated' },\n { label: 'Congelado', value: 'frozen' },\n { label: 'Frágil', value: 'fragile' },\n ],\n },\n ]\n\n return {\n name: 'Produto',\n namePlural: 'Produtos',\n icon: 'Package',\n displayField: 'name',\n fields,\n fieldGroups: [\n // imageSlot renders the scaffolding's image uploader alongside the group.\n { id: 'general', label: 'Informações', columns: 2, imageSlot: true },\n { id: 'pricing', label: 'Preço', description: 'O preço comparativo vira o \"de\" riscado na vitrine.', columns: 3 },\n { id: 'inventory', label: 'Estoque', columns: 2 },\n { id: 'publishing', label: 'Publicação', description: 'Controla se o produto aparece na loja.', columns: 2 },\n {\n id: 'shipping',\n label: 'Envio',\n description:\n 'Peso e medidas do produto embalado. Sem eles a transportadora é consultada com a caixa padrão da loja, e o frete cotado pode não ser o frete pago.',\n columns: 3,\n },\n ],\n facets: [{ field: 'status', allLabel: 'Todos' }],\n image: getProvider ? productImage(getProvider) : undefined,\n // The form's image slot sets the COVER; this tab manages the rest of the\n // gallery. plg_shop_product_images has always held a collection, and until\n // now nothing in the admin could add a second row to it — so the storefront\n // carousel had exactly one slide for every product in the pool.\n detailTabs: getProvider\n ? [\n {\n id: 'images',\n label: 'Fotos',\n icon: 'Image',\n component: ProductImagesTab as never,\n props: { getProvider },\n },\n {\n id: 'variants',\n label: 'Variantes',\n icon: 'Layers',\n component: ProductVariantsTab as never,\n props: { getProvider },\n },\n ]\n : undefined,\n } as EntityDef<Product>\n}\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport type { ShopCustomer } from '@fayz-ai/shop'\nimport { ClientOrdersTab, createClientOrdersProvider, adminNavigateTo } from '@fayz-ai/admin'\nimport type { ClientDocument } from '@fayz-ai/admin'\n\n// ---------------------------------------------------------------------------\n// Shop customer — same declarative contract as the product entity, so the list\n// and the form both come from createCrudPage instead of a hand-rolled table.\n//\n// ordersCount / totalSpent are read-only: they are maintained server-side by the\n// shop_refresh_customer_stats trigger on every order insert/update/delete, so\n// putting them in the form would offer an edit the database would overwrite.\n// ---------------------------------------------------------------------------\n\nfunction money(value: unknown) {\n const n = Number(value)\n if (!Number.isFinite(n)) return 'R$ 0,00'\n return new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(n)\n}\n\nexport function buildShopCustomerEntity(): EntityDef<ShopCustomer> {\n const fields: FieldDef[] = [\n // — Contato —\n {\n key: 'firstName', label: 'Nome', type: 'text', required: true,\n group: 'contact', placeholder: 'Maria', searchable: true,\n showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium\">{[row.firstName, row.lastName].filter(Boolean).join(' ')}</p>\n {row.email && <p className=\"truncate text-xs text-muted-foreground\">{row.email}</p>}\n </div>\n ),\n },\n { key: 'lastName', label: 'Sobrenome', type: 'text', group: 'contact', placeholder: 'Silva', searchable: true, showInTable: false },\n {\n key: 'email', label: 'E-mail', type: 'text', group: 'contact',\n placeholder: 'maria@exemplo.com', searchable: true,\n hint: 'É por ele que o pedido é vinculado ao cliente no checkout.',\n showInTable: false,\n },\n {\n key: 'phone', label: 'Telefone', type: 'text', group: 'contact',\n placeholder: '(21) 99999-0000', searchable: true,\n showInTable: true, sortable: false,\n renderCell: (v) => <span className=\"text-muted-foreground\">{(v as string) || '—'}</span>,\n },\n // The column, the type and the provider all carried `document` already; the\n // form was the only place it could not be typed. Which meant a store could\n // see \"cliente sem CPF/CNPJ\" on every Bling run and have nowhere to fix it.\n {\n key: 'document', label: 'CPF / CNPJ', type: 'text', group: 'contact',\n placeholder: '000.000.000-00', searchable: true,\n hint: 'Necessário para emitir nota — sem ele o cliente não sobe para o ERP.',\n showInTable: false,\n },\n\n // — Histórico (somente leitura) —\n {\n key: 'ordersCount', label: 'Pedidos', type: 'number',\n showInForm: false, showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"block text-right\">{Number(v) || 0}</span>,\n },\n {\n key: 'totalSpent', label: 'Total gasto', type: 'number',\n showInForm: false, showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"block text-right font-medium\">{money(v)}</span>,\n },\n\n // — Interno —\n {\n key: 'notes', label: 'Observações', type: 'textarea', group: 'internal', span: 2,\n placeholder: 'Preferências, restrições, combinados de entrega…',\n hint: 'Visível só no admin. O cliente nunca vê.',\n showInTable: false,\n },\n ]\n\n return {\n name: 'Cliente',\n namePlural: 'Clientes',\n icon: 'Users',\n displayField: 'firstName',\n // `person` layout brings the shared archetype tabs — including Endereços,\n // which reads the core addresses table and therefore works in every app.\n layout: 'person',\n // Without archetypeKind the shell shows every person tab, including the\n // staff-only Agenda (its visibleFor filter only runs when a kind is set).\n data: { table: 'plg_shop_customers', archetypeKind: 'customer' },\n fields,\n // The SAME tab and the SAME provider beauty-saas uses. Since the shop's\n // orders now live in public.orders with party_id set, the canonical provider\n // already returns them — a shop-specific adapter would be a second\n // implementation of \"list this person's orders\", which is how two apps end\n // up with two different answers to the same question.\n detailTabs: [{\n id: 'orders',\n label: 'Pedidos',\n icon: 'ShoppingBag',\n aliases: ['appointments', 'quotes'],\n component: ClientOrdersTab as never,\n props: {\n provider: createClientOrdersProvider(),\n currency: { code: 'BRL', locale: 'pt-BR' },\n // The one part that legitimately differs per app: where a document\n // leads. Beauty sends a booking to the agenda and an invoice to\n // receivables; a shop order goes to the order screen.\n navigator: {\n onNavigate: (doc: ClientDocument) => adminNavigateTo(`/shop/orders/${doc.id}`),\n },\n },\n }],\n fieldGroups: [\n { id: 'contact', label: 'Contato', columns: 2 },\n { id: 'internal', label: 'Notas internas', columns: 1 },\n ],\n } as EntityDef<ShopCustomer>\n}\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport type { Discount } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Discount — declarative CRUD, same contract as products and customers.\n//\n// `timesUsed` is read-only: shop_place_order increments it inside the same\n// transaction that validates the coupon, so the admin must never write it.\n//\n// `buy_x_get_y` is deliberately absent from the type options: the enum value\n// exists in the database but shop_place_order records the code and applies no\n// monetary effect (0003:116), so offering it would create coupons that silently\n// do nothing.\n// ---------------------------------------------------------------------------\n\nconst STATUS_TONE: Record<string, string> = {\n active: 'bg-emerald-100 text-emerald-800',\n draft: 'bg-gray-100 text-gray-700',\n expired: 'bg-orange-100 text-orange-700',\n disabled: 'bg-red-100 text-red-700',\n}\n\nexport function buildShopDiscountEntity(): EntityDef<Discount> {\n const fields: FieldDef[] = [\n // — Cupom —\n {\n key: 'title', label: 'Nome interno', type: 'text', required: true,\n group: 'coupon', placeholder: 'Bem-vindo 10%',\n hint: 'Só o admin vê. Serve para você identificar a campanha.',\n searchable: true, showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium\">{row.title}</p>\n {row.code && <p className=\"font-mono text-xs text-muted-foreground\">{row.code}</p>}\n </div>\n ),\n },\n {\n key: 'code', label: 'Código', type: 'text', group: 'coupon',\n placeholder: 'ARTORIUS10',\n hint: 'O que o cliente digita no carrinho. Maiúsculas e minúsculas não importam.',\n searchable: true, showInTable: false,\n },\n\n // — Regra —\n {\n key: 'type', label: 'Tipo', type: 'segmented', required: true, group: 'rule', span: 2,\n options: [\n { label: 'Percentual', value: 'percentage', description: 'Desconta uma % do subtotal.' },\n { label: 'Valor fixo', value: 'fixed_amount', description: 'Desconta um valor em reais.' },\n { label: 'Frete grátis', value: 'free_shipping', description: 'Zera o frete do pedido.' },\n ],\n showInTable: true, sortable: false,\n renderCell: (v) => {\n const labels: Record<string, string> = {\n percentage: 'Percentual', fixed_amount: 'Valor fixo', free_shipping: 'Frete grátis', buy_x_get_y: 'Leve X pague Y',\n }\n return <span className=\"text-muted-foreground\">{labels[String(v)] ?? String(v)}</span>\n },\n },\n {\n key: 'value', label: 'Valor', type: 'number', group: 'rule', min: 0,\n placeholder: '10',\n hint: 'Percentual: 10 = 10%. Valor fixo: 10 = R$ 10,00. Frete grátis ignora este campo.',\n showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n <span className=\"block text-right font-medium\">\n {row.type === 'percentage'\n ? `${row.value}%`\n : row.type === 'free_shipping'\n ? '—'\n : new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(Number(row.value) || 0)}\n </span>\n ),\n },\n\n // — Limites —\n {\n key: 'minSubtotal', label: 'Pedido mínimo', type: 'currency', group: 'limits', min: 0,\n currency: 'BRL', currencySymbol: 'R$', currencyLocale: 'pt-BR',\n placeholder: 'sem mínimo',\n hint: 'Valor mínimo do pedido para o cupom valer. Deixe vazio para não exigir mínimo.',\n showInTable: false,\n },\n {\n key: 'usageLimit', label: 'Limite de usos', type: 'number', group: 'limits', min: 0,\n placeholder: 'sem limite', hint: 'Deixe vazio para uso ilimitado.', showInTable: false,\n },\n {\n key: 'oncePerCustomer', label: 'Uma vez por cliente', type: 'boolean', group: 'limits',\n hint: 'Só vale para quem se identifica no checkout — compra como visitante não é rastreada.',\n showInTable: false,\n },\n {\n key: 'timesUsed', label: 'Usos', type: 'number',\n showInForm: false, showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n <span className=\"block text-right text-muted-foreground\">\n {row.timesUsed}{row.usageLimit ? ` / ${row.usageLimit}` : ''}\n </span>\n ),\n },\n\n // — Vigência —\n { key: 'startsAt', label: 'Início', type: 'date', group: 'schedule', showInTable: false },\n {\n key: 'endsAt', label: 'Fim', type: 'date', group: 'schedule',\n hint: 'Vazio = sem data de expiração.', showInTable: false,\n },\n {\n key: 'status', label: 'Status', type: 'segmented', required: true, group: 'schedule', span: 2,\n options: [\n { label: 'Rascunho', value: 'draft', description: 'Não aceito no carrinho.' },\n { label: 'Ativo', value: 'active', description: 'Valendo agora.' },\n { label: 'Desativado', value: 'disabled', description: 'Suspenso sem apagar o histórico.' },\n ],\n showInTable: true, sortable: false,\n renderCell: (v) => {\n const s = String(v ?? 'draft')\n return (\n <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium ${STATUS_TONE[s] ?? STATUS_TONE.draft}`}>\n {s}\n </span>\n )\n },\n },\n ]\n\n return {\n name: 'Desconto',\n namePlural: 'Descontos',\n icon: 'Tag',\n displayField: 'title',\n fields,\n fieldGroups: [\n { id: 'coupon', label: 'Cupom', columns: 2 },\n { id: 'rule', label: 'Regra', description: 'O desconto é recalculado no servidor a cada pedido.', columns: 2 },\n { id: 'limits', label: 'Limites de uso', columns: 2 },\n { id: 'schedule', label: 'Vigência', columns: 2 },\n ],\n facets: [{ field: 'status', allLabel: 'Todos' }],\n } as EntityDef<Discount>\n}\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport type { Category } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Categoria — onde o produto mora na árvore do catálogo.\n//\n// Uma categoria só, um pai só: é ela que estrutura a navegação da vitrine. Para\n// agrupar produtos de forma editorial (uma vitrine de Natal, os mais vendidos),\n// o que existe é Coleção — o produto entra em quantas quiser.\n//\n// `parentId` fica como texto e não como relação: a lista de categorias é a\n// própria tabela sendo editada, e uma relação declarativa aqui pediria um\n// segundo read-model só para se auto-referenciar.\n// ---------------------------------------------------------------------------\n\nexport function buildShopCategoryEntity(): EntityDef<Category> {\n const fields: FieldDef[] = [\n {\n key: 'name', label: 'Nome', type: 'text', required: true, group: 'basic',\n placeholder: 'Camisetas',\n searchable: true, showInTable: true, sortable: true,\n },\n {\n key: 'slug', label: 'Identificador', type: 'text', group: 'basic',\n placeholder: 'camisetas',\n hint: 'Segmento de URL na vitrine. Deixe vazio para gerar a partir do nome.',\n searchable: true, showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"font-mono text-xs text-muted-foreground\">{String(v ?? '')}</span>,\n },\n {\n key: 'parentId', label: 'Categoria pai', type: 'text', group: 'basic',\n placeholder: 'sem pai — nível principal',\n hint: 'Deixe vazio para uma categoria de primeiro nível.',\n showInTable: false,\n },\n {\n key: 'description', label: 'Descrição', type: 'textarea', group: 'basic', span: 2,\n placeholder: 'Descrição opcional',\n showInTable: false,\n },\n {\n key: 'sortOrder', label: 'Ordem', type: 'number', group: 'basic', min: 0,\n hint: 'Menor aparece primeiro na vitrine.',\n showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"block text-right text-muted-foreground\">{Number(v ?? 0)}</span>,\n },\n ]\n\n return {\n name: 'Categoria',\n namePlural: 'Categorias',\n icon: 'FolderTree',\n displayField: 'name',\n defaultSort: 'sortOrder',\n fields,\n fieldGroups: [\n { id: 'basic', label: 'Categoria', columns: 2 },\n ],\n } as EntityDef<Category>\n}\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport type { Collection } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Coleção — agrupamento de merchandising (\"Verão 2026\", \"Mais vendidos\").\n//\n// Não é categoria: a categoria diz onde o produto MORA no catálogo (um pai só,\n// estrutura a navegação); a coleção é um conjunto curado e o produto entra em\n// quantas quiser. Sair de uma coleção não muda nada sobre o que o produto é.\n//\n// `productIds` não aparece no formulário: escolher membros é um multiselect com\n// busca sobre o catálogo, que o EntityDef declarativo não expressa. A associação\n// já está pronta no provider — falta só o campo customizado. Até lá a coluna\n// mostra quantos produtos a coleção tem.\n// ---------------------------------------------------------------------------\n\nexport function buildShopCollectionEntity(): EntityDef<Collection> {\n const fields: FieldDef[] = [\n {\n key: 'title', label: 'Título', type: 'text', required: true, group: 'basic',\n placeholder: 'Verão 2026',\n searchable: true, showInTable: true, sortable: true,\n },\n {\n key: 'handle', label: 'Identificador', type: 'text', group: 'basic',\n placeholder: 'verao-2026',\n hint: 'Segmento de URL na vitrine. Deixe vazio para gerar a partir do título.',\n searchable: true, showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"font-mono text-xs text-muted-foreground\">{String(v ?? '')}</span>,\n },\n {\n key: 'description', label: 'Descrição', type: 'textarea', group: 'basic', span: 2,\n placeholder: 'Como esta coleção é apresentada na loja',\n showInTable: false,\n },\n {\n key: 'productIds', label: 'Produtos', type: 'text',\n showInForm: false, showInTable: true, sortable: false,\n renderCell: (v) => {\n const count = Array.isArray(v) ? v.length : 0\n return (\n <span className=\"block text-right text-muted-foreground\">\n {count === 1 ? '1 produto' : `${count} produtos`}\n </span>\n )\n },\n },\n {\n key: 'published', label: 'Publicada', type: 'boolean', group: 'basic',\n hint: 'Coleção despublicada some da vitrine, mas continua aqui.',\n // Rotula os dois estados para as abas do cabeçalho: \"true\"/\"false\" cru\n // seria o que o lojista leria no topo da própria lista.\n options: [\n { value: 'true', label: 'Publicadas' },\n { value: 'false', label: 'Rascunhos' },\n ],\n showInTable: true, sortable: true,\n renderCell: (v) => (\n <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium ${\n v ? 'bg-emerald-100 text-emerald-800' : 'bg-gray-100 text-gray-700'\n }`}>\n {v ? 'Publicada' : 'Rascunho'}\n </span>\n ),\n },\n {\n key: 'sortOrder', label: 'Ordem', type: 'number', group: 'basic', min: 0,\n hint: 'Menor aparece primeiro.', showInTable: false,\n },\n\n // — SEO —\n {\n key: 'seoTitle', label: 'Título da página', type: 'text', group: 'seo', span: 2,\n placeholder: 'Título exibido nos resultados de busca',\n hint: 'Vazio usa o título da coleção.',\n showInTable: false,\n },\n {\n key: 'seoDescription', label: 'Meta descrição', type: 'textarea', group: 'seo', span: 2,\n placeholder: 'Descreva esta coleção para os buscadores',\n showInTable: false,\n },\n ]\n\n return {\n name: 'Coleção',\n namePlural: 'Coleções',\n icon: 'Layers',\n displayField: 'title',\n defaultSort: 'sortOrder',\n fields,\n fieldGroups: [\n { id: 'basic', label: 'Coleção', columns: 2 },\n { id: 'seo', label: 'Busca (SEO)', description: 'Como esta coleção aparece nos resultados de busca.', columns: 2 },\n ],\n // Sem facet de \"publicada\": como booleano ele vira uma tira de abas\n // \"Todas · Sim · Não\", que não diz de QUE é o sim — e uma loja com dez\n // coleções não precisa filtrar por isso; a coluna já mostra o estado.\n\n } as EntityDef<Collection>\n}\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport type { GiftCard } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Vale-presente — dinheiro já pago que ainda não virou pedido.\n//\n// Dois saldos e não um: `initialBalance` é o valor de face, imutável (a prova\n// de quanto entrou) e `balance` é o que sobrou. Só o saldo restante apagaria o\n// valor emitido no primeiro resgate parcial — e é esse número que conciliação e\n// suporte precisam.\n//\n// `initialBalance` só existe no formulário de criação: mudar o valor de face de\n// um cartão já emitido reescreveria o histórico financeiro. Ajuste depois se\n// faz, é no saldo restante.\n// ---------------------------------------------------------------------------\n\nconst STATUS_TONE: Record<string, string> = {\n active: 'bg-emerald-100 text-emerald-800',\n redeemed: 'bg-gray-100 text-gray-700',\n expired: 'bg-orange-100 text-orange-700',\n disabled: 'bg-red-100 text-red-700',\n}\n\nconst STATUS_LABEL: Record<string, string> = {\n active: 'Ativo', redeemed: 'Resgatado', expired: 'Expirado', disabled: 'Desativado',\n}\n\nexport function buildShopGiftCardEntity(currencyCode = 'BRL'): EntityDef<GiftCard> {\n const money = (v: unknown) =>\n new Intl.NumberFormat('pt-BR', { style: 'currency', currency: currencyCode }).format(Number(v) || 0)\n\n const fields: FieldDef[] = [\n {\n key: 'code', label: 'Código', type: 'text', group: 'card', span: 2,\n placeholder: 'gerado automaticamente',\n hint: 'O que o cliente digita no checkout. Deixe vazio para gerar um código.',\n searchable: true, showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"font-mono text-xs font-medium\">{String(v ?? '')}</span>,\n },\n {\n key: 'initialBalance', label: 'Valor', type: 'currency', required: true, group: 'card', min: 0,\n currency: currencyCode, currencySymbol: 'R$', currencyLocale: 'pt-BR',\n hint: 'Valor de face do cartão. Não muda depois de emitido.',\n showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"block text-right text-muted-foreground\">{money(v)}</span>,\n },\n {\n key: 'balance', label: 'Saldo', type: 'currency', group: 'card', min: 0,\n currency: currencyCode, currencySymbol: 'R$', currencyLocale: 'pt-BR',\n hint: 'O que ainda pode ser gasto. Cai a cada resgate.',\n showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"block text-right font-medium\">{money(v)}</span>,\n },\n {\n key: 'status', label: 'Status', type: 'segmented', group: 'card', span: 2,\n options: [\n { label: 'Ativo', value: 'active', description: 'Aceito no checkout.' },\n { label: 'Desativado', value: 'disabled', description: 'Suspenso sem apagar o saldo.' },\n ],\n showInTable: true, sortable: false,\n renderCell: (v) => {\n const s = String(v ?? 'active')\n return (\n <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium ${STATUS_TONE[s] ?? STATUS_TONE.active}`}>\n {STATUS_LABEL[s] ?? s}\n </span>\n )\n },\n },\n\n // — Destinatário —\n {\n key: 'customerEmail', label: 'E-mail do destinatário', type: 'email', group: 'recipient',\n placeholder: 'opcional',\n searchable: true, showInTable: true, sortable: false,\n renderCell: (v) => <span className=\"text-muted-foreground\">{String(v ?? '—')}</span>,\n },\n {\n key: 'expiresAt', label: 'Validade', type: 'date', group: 'recipient',\n hint: 'Vazio = não expira.', showInTable: false,\n },\n {\n key: 'note', label: 'Observação', type: 'textarea', group: 'recipient', span: 2,\n placeholder: 'Só o admin vê.', showInTable: false,\n },\n ]\n\n return {\n name: 'Vale-presente',\n namePlural: 'Gift Cards',\n icon: 'CreditCard',\n displayField: 'code',\n defaultSort: 'createdAt',\n defaultSortDir: 'desc',\n fields,\n fieldGroups: [\n { id: 'card', label: 'Cartão', columns: 2 },\n { id: 'recipient', label: 'Destinatário', columns: 2 },\n ],\n facets: [{ field: 'status', allLabel: 'Todos', display: 'tabs' }],\n } as EntityDef<GiftCard>\n}\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport type { CustomerGroup } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Grupo de clientes — associação MANUAL.\n//\n// O lojista põe e tira gente; a associação é estável e não muda porque o\n// cliente comprou (ou parou de comprar). Para \"todo mundo que gastou mais de\n// X\", o que existe é Segmento — lá a associação é a própria regra.\n//\n// `customerIds` fica fora do formulário: escolher membros é um multiselect com\n// busca sobre a base de clientes, que o EntityDef declarativo não expressa. A\n// associação já está pronta no provider — falta o campo customizado.\n// ---------------------------------------------------------------------------\n\nconst SWATCH: Record<string, string> = {\n slate: 'bg-slate-200 text-slate-800',\n emerald: 'bg-emerald-100 text-emerald-800',\n amber: 'bg-amber-100 text-amber-800',\n rose: 'bg-rose-100 text-rose-800',\n violet: 'bg-violet-100 text-violet-800',\n}\n\nexport function buildShopCustomerGroupEntity(): EntityDef<CustomerGroup> {\n const fields: FieldDef[] = [\n {\n key: 'name', label: 'Nome', type: 'text', required: true, group: 'basic',\n placeholder: 'Atacado',\n searchable: true, showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium ${SWATCH[row.color] ?? SWATCH.slate}`}>\n {row.name}\n </span>\n ),\n },\n {\n key: 'color', label: 'Cor', type: 'select', group: 'basic',\n options: [\n { value: 'slate', label: 'Neutro' },\n { value: 'emerald', label: 'Verde' },\n { value: 'amber', label: 'Âmbar' },\n { value: 'rose', label: 'Rosa' },\n { value: 'violet', label: 'Violeta' },\n ],\n hint: 'Só para reconhecer o grupo de relance na lista.',\n showInTable: false,\n },\n {\n key: 'description', label: 'Descrição', type: 'textarea', group: 'basic', span: 2,\n placeholder: 'Para que serve este grupo',\n searchable: true, showInTable: true, sortable: false,\n renderCell: (v) => <span className=\"text-muted-foreground\">{String(v ?? '—')}</span>,\n },\n {\n key: 'customerIds', label: 'Clientes', type: 'text',\n showInForm: false, showInTable: true, sortable: false,\n renderCell: (v) => {\n const count = Array.isArray(v) ? v.length : 0\n return (\n <span className=\"block text-right text-muted-foreground\">\n {count === 1 ? '1 cliente' : `${count} clientes`}\n </span>\n )\n },\n },\n ]\n\n return {\n name: 'Grupo',\n namePlural: 'Grupos',\n icon: 'UsersRound',\n displayField: 'name',\n defaultSort: 'name',\n fields,\n fieldGroups: [{ id: 'basic', label: 'Grupo', columns: 2 }],\n } as EntityDef<CustomerGroup>\n}\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport type { CustomerSegment } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Segmento de clientes — uma REGRA, não uma lista.\n//\n// A associação é recalculada dos números do próprio cliente, então ninguém é\n// \"adicionado\" a um segmento e sair dele não é uma ação. Para uma lista que o\n// lojista controla à mão, o que existe é Grupo.\n//\n// Os critérios são campos explícitos e não um JSON livre: cada um é uma\n// condição que a lista de clientes sabe avaliar, então um segmento salvo sempre\n// tem associação real e conferível.\n// ---------------------------------------------------------------------------\n\n/** Legenda humana da regra — é o que a lista mostra em vez de seis colunas de\n * números soltos que ninguém lê como uma condição. */\nexport function describeSegment(s: Partial<CustomerSegment>, money: (v: number) => string): string {\n const parts: string[] = []\n if (s.minOrders != null && s.maxOrders != null) parts.push(`${s.minOrders}–${s.maxOrders} pedidos`)\n else if (s.minOrders != null) parts.push(`${s.minOrders}+ pedidos`)\n else if (s.maxOrders != null) parts.push(`até ${s.maxOrders} pedidos`)\n\n if (s.minSpent != null && s.maxSpent != null) parts.push(`gastou ${money(s.minSpent)}–${money(s.maxSpent)}`)\n else if (s.minSpent != null) parts.push(`gastou ${money(s.minSpent)}+`)\n else if (s.maxSpent != null) parts.push(`gastou até ${money(s.maxSpent)}`)\n\n if (s.joinedAfter) parts.push(`entrou após ${new Date(s.joinedAfter).toLocaleDateString('pt-BR')}`)\n if (s.joinedBefore) parts.push(`entrou antes de ${new Date(s.joinedBefore).toLocaleDateString('pt-BR')}`)\n\n return parts.length ? parts.join(' · ') : 'Todos os clientes'\n}\n\n/** The row the list actually shows: the stored rule plus how many customers\n * match it right now. `matchCount` is recomputed on every read (see the data\n * provider) — a segment's size is only true when it is derived. */\nexport type CustomerSegmentRow = CustomerSegment & { matchCount: number }\n\nexport function buildShopCustomerSegmentEntity(currencyCode = 'BRL'): EntityDef<CustomerSegmentRow> {\n const money = (v: number) =>\n new Intl.NumberFormat('pt-BR', { style: 'currency', currency: currencyCode }).format(v)\n\n const fields: FieldDef[] = [\n {\n key: 'name', label: 'Nome', type: 'text', required: true, group: 'basic', span: 2,\n placeholder: 'Clientes fiéis',\n searchable: true, showInTable: true, sortable: true,\n },\n {\n key: 'description', label: 'Descrição', type: 'textarea', group: 'basic', span: 2,\n placeholder: 'Para que serve este segmento',\n searchable: true, showInTable: false,\n },\n\n // — Regra —\n {\n key: 'minOrders', label: 'Mínimo de pedidos', type: 'number', group: 'rule', min: 0,\n placeholder: 'sem mínimo', showInTable: false,\n },\n {\n key: 'maxOrders', label: 'Máximo de pedidos', type: 'number', group: 'rule', min: 0,\n placeholder: 'sem máximo', showInTable: false,\n },\n {\n key: 'minSpent', label: 'Gasto mínimo', type: 'currency', group: 'rule', min: 0,\n currency: currencyCode, currencySymbol: 'R$', currencyLocale: 'pt-BR',\n placeholder: 'sem mínimo', showInTable: false,\n },\n {\n key: 'maxSpent', label: 'Gasto máximo', type: 'currency', group: 'rule', min: 0,\n currency: currencyCode, currencySymbol: 'R$', currencyLocale: 'pt-BR',\n placeholder: 'sem máximo', showInTable: false,\n },\n { key: 'joinedAfter', label: 'Entrou depois de', type: 'date', group: 'rule', showInTable: false },\n { key: 'joinedBefore', label: 'Entrou antes de', type: 'date', group: 'rule', showInTable: false },\n\n // Coluna derivada: a regra escrita por extenso.\n {\n key: 'minSpent_rule', label: 'Regra', type: 'text',\n showInForm: false, showInTable: true, sortable: false,\n renderCell: (_v, row: any) => (\n <span className=\"text-muted-foreground\">{describeSegment(row, money)}</span>\n ),\n },\n {\n key: 'matchCount', label: 'Clientes', type: 'number',\n showInForm: false, showInTable: true, sortable: true,\n renderCell: (v) => (\n <span className=\"block text-right font-medium\">\n {v == null ? '—' : Number(v)}\n </span>\n ),\n },\n ]\n\n return {\n name: 'Segmento',\n namePlural: 'Segmentos',\n icon: 'Filter',\n displayField: 'name',\n defaultSort: 'name',\n fields,\n fieldGroups: [\n { id: 'basic', label: 'Segmento', columns: 2 },\n {\n id: 'rule', label: 'Regra', columns: 2,\n description: 'Todos os critérios preenchidos valem juntos. Deixe vazio o que não quiser exigir.',\n },\n ],\n } as EntityDef<CustomerSegmentRow>\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type { CreateProductInput, Product, UpdateProductInput } from '@fayz-ai/shop'\nimport { slugify } from '../views/productEntity'\nimport { applyQuery, invalidateProductLists, listProductsDetailed, resolve, type ShopProviderResolver } from './shared'\n\nexport type { ShopProviderResolver }\n\n// ---------------------------------------------------------------------------\n// Bridges the generic CRUD scaffolding (DataProvider) to the shop provider, so\n// the product screens are the same createCrudPage machinery every other module\n// uses instead of a bespoke form.\n//\n// Which shop provider is injected decides whether writes work at all:\n// • createSupabaseShopProvider — authenticates as the merchant (their JWT),\n// full CRUD, subject to the tenant-member RLS policies.\n// • createFayzShopProvider — the storefront's anonymous REST client. Reads\n// work; every write throws FayzShopError 501 by design. The form surfaces\n// that message rather than pretending the save succeeded.\n// ---------------------------------------------------------------------------\n\nexport function createShopProductDataProvider(provider: ShopProviderResolver): DataProvider<Product> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<Product>> {\n const answer = await listProductsDetailed(\n provider,\n query.search ? { search: query.search } : undefined,\n )\n return {\n ...applyQuery(answer.rows, query, 'status'),\n ...(answer.cached && { cached: true }),\n ...(answer.stale && { stale: true }),\n }\n },\n\n async create(data): Promise<Product> {\n const input = data as unknown as Partial<Product>\n // The storefront URL is required by the table's UNIQUE(tenant_id, slug);\n // deriving it from the name keeps the merchant from having to know that.\n const slug = input.slug?.trim() || slugify(String(input.name ?? ''))\n const created = await resolve(provider).createProduct({\n ...(input as CreateProductInput),\n slug,\n } as CreateProductInput)\n invalidateProductLists()\n return created\n },\n\n async update(id: string, data: Partial<Product>): Promise<Product> {\n const patch = { ...data }\n if (patch.slug !== undefined && !String(patch.slug).trim()) {\n // Cleared on purpose → regenerate rather than write an empty slug.\n patch.slug = slugify(String(patch.name ?? ''))\n }\n const updated = await resolve(provider).updateProduct(id, patch as UpdateProductInput)\n invalidateProductLists()\n return updated\n },\n\n async remove(id: string): Promise<void> {\n await resolve(provider).deleteProduct(id)\n invalidateProductLists()\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type { CreateCustomerInput, ShopCustomer, UpdateCustomerInput } from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\nexport function createShopCustomerDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<ShopCustomer> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<ShopCustomer>> {\n const rows = await resolve(provider).listCustomers(\n query.search ? { search: query.search } : undefined,\n )\n return applyQuery(rows, query)\n },\n\n async create(data): Promise<ShopCustomer> {\n return resolve(provider).createCustomer(data as unknown as CreateCustomerInput)\n },\n\n async update(id: string, data: Partial<ShopCustomer>): Promise<ShopCustomer> {\n // ordersCount / totalSpent are trigger-maintained (shop_refresh_customer_stats);\n // never send them back or a stale form value would fight the database.\n const { ordersCount: _o, totalSpent: _t, ...patch } = data\n return resolve(provider).updateCustomer(id, patch as UpdateCustomerInput)\n },\n\n async remove(id: string): Promise<void> {\n await resolve(provider).deleteCustomer(id)\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type { CreateDiscountInput, Discount, UpdateDiscountInput } from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\nexport function createShopDiscountDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<Discount> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<Discount>> {\n const rows = await resolve(provider).listDiscounts()\n const term = query.search?.trim().toLowerCase()\n const filtered = term\n ? rows.filter((d) =>\n d.title.toLowerCase().includes(term) || (d.code ?? '').toLowerCase().includes(term))\n : rows\n return applyQuery(filtered, query, 'status')\n },\n\n async create(data): Promise<Discount> {\n const input = data as unknown as Partial<Discount>\n return resolve(provider).createDiscount({\n ...(input as CreateDiscountInput),\n // Codes are matched case-insensitively server-side; store them upper so\n // the admin list reads consistently.\n code: input.code ? String(input.code).trim().toUpperCase() : undefined,\n } as CreateDiscountInput)\n },\n\n async update(id: string, data: Partial<Discount>): Promise<Discount> {\n // timesUsed is incremented by shop_place_order inside the order transaction.\n const { timesUsed: _used, ...patch } = data\n if (patch.code !== undefined) {\n patch.code = patch.code ? String(patch.code).trim().toUpperCase() : null\n }\n return resolve(provider).updateDiscount(id, patch as UpdateDiscountInput)\n },\n\n async remove(id: string): Promise<void> {\n await resolve(provider).deleteDiscount(id)\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type { Category, CreateCategoryInput, UpdateCategoryInput } from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\nexport function createShopCategoryDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<Category> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<Category>> {\n const rows = await resolve(provider).listCategories()\n const term = query.search?.trim().toLowerCase()\n const filtered = term\n ? rows.filter((c) =>\n c.name.toLowerCase().includes(term) || (c.slug ?? '').toLowerCase().includes(term))\n : rows\n return applyQuery(filtered, query)\n },\n\n async create(data): Promise<Category> {\n const input = data as unknown as Partial<Category>\n return resolve(provider).createCategory({\n name: String(input.name ?? ''),\n slug: input.slug?.trim() || undefined,\n description: input.description ?? undefined,\n // The form writes '' for \"no parent\"; the column is a nullable FK, and\n // '' is not a uuid — it must go as absent, not as empty text.\n parentId: input.parentId?.trim() || undefined,\n sortOrder: input.sortOrder ?? undefined,\n } as CreateCategoryInput)\n },\n\n async update(id: string, data: Partial<Category>): Promise<Category> {\n const patch: UpdateCategoryInput = {}\n if (data.name !== undefined) patch.name = data.name\n if (data.slug !== undefined) patch.slug = data.slug?.trim() || undefined\n if (data.description !== undefined) patch.description = data.description\n if (data.parentId !== undefined) patch.parentId = data.parentId?.trim() || null\n if (data.sortOrder !== undefined) patch.sortOrder = data.sortOrder\n return resolve(provider).updateCategory(id, patch)\n },\n\n async remove(id: string): Promise<void> {\n await resolve(provider).deleteCategory(id)\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type { Collection, CreateCollectionInput, UpdateCollectionInput } from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\n/** Collections are optional on the provider contract. A provider without them\n * should read as \"no collections\", not blow up the list. */\nfunction requireCollections(p: ReturnType<typeof resolve>) {\n if (!p.listCollections) throw new Error('This store provider does not support collections')\n return p\n}\n\nexport function createShopCollectionDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<Collection> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<Collection>> {\n const p = resolve(provider)\n const rows = (await p.listCollections?.()) ?? []\n const term = query.search?.trim().toLowerCase()\n const filtered = term\n ? rows.filter((c) =>\n c.title.toLowerCase().includes(term) || (c.handle ?? '').toLowerCase().includes(term))\n : rows\n return applyQuery(filtered, query)\n },\n\n async create(data): Promise<Collection> {\n const p = requireCollections(resolve(provider))\n const input = data as unknown as Partial<Collection>\n return p.createCollection!({\n title: String(input.title ?? ''),\n handle: input.handle?.trim() || undefined,\n description: input.description ?? null,\n seoTitle: input.seoTitle ?? null,\n seoDescription: input.seoDescription ?? null,\n published: input.published ?? true,\n sortOrder: input.sortOrder ?? undefined,\n } as CreateCollectionInput)\n },\n\n async update(id: string, data: Partial<Collection>): Promise<Collection> {\n const p = requireCollections(resolve(provider))\n // productIds is not on the form (membership needs a product picker the\n // declarative EntityDef can't express), so it must never reach the patch\n // — an undefined there means \"leave the membership alone\", but a stale\n // value from the row would silently rewrite it.\n const { productIds: _members, ...patch } = data\n return p.updateCollection!(id, patch as UpdateCollectionInput)\n },\n\n async remove(id: string): Promise<void> {\n const p = requireCollections(resolve(provider))\n await p.deleteCollection!(id)\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type { GiftCard, CreateGiftCardInput, UpdateGiftCardInput } from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\nfunction requireGiftCards(p: ReturnType<typeof resolve>) {\n if (!p.listGiftCards) throw new Error('This store provider does not support gift cards')\n return p\n}\n\nexport function createShopGiftCardDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<GiftCard> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<GiftCard>> {\n const rows = (await resolve(provider).listGiftCards?.()) ?? []\n const term = query.search?.trim().toLowerCase()\n const filtered = term\n ? rows.filter((g) =>\n g.code.toLowerCase().includes(term) || (g.customerEmail ?? '').toLowerCase().includes(term))\n : rows\n return applyQuery(filtered, query, 'status')\n },\n\n async create(data): Promise<GiftCard> {\n const p = requireGiftCards(resolve(provider))\n const input = data as unknown as Partial<GiftCard>\n return p.createGiftCard!({\n code: input.code?.trim() || undefined,\n initialBalance: Number(input.initialBalance) || 0,\n status: input.status ?? 'active',\n expiresAt: input.expiresAt || null,\n customerEmail: input.customerEmail || null,\n note: input.note || null,\n } as CreateGiftCardInput)\n },\n\n async update(id: string, data: Partial<GiftCard>): Promise<GiftCard> {\n const p = requireGiftCards(resolve(provider))\n // initialBalance is the card's face value — the record of how much money\n // came in. Editing it after issue would rewrite financial history, so the\n // patch drops it and only the remaining balance is adjustable.\n const { initialBalance: _face, ...patch } = data\n return p.updateGiftCard!(id, patch as UpdateGiftCardInput)\n },\n\n async remove(id: string): Promise<void> {\n const p = requireGiftCards(resolve(provider))\n await p.deleteGiftCard!(id)\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type {\n CustomerGroup, CreateCustomerGroupInput, UpdateCustomerGroupInput,\n} from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\nfunction requireGroups(p: ReturnType<typeof resolve>) {\n if (!p.listCustomerGroups) throw new Error('This store provider does not support customer groups')\n return p\n}\n\nexport function createShopCustomerGroupDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<CustomerGroup> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<CustomerGroup>> {\n const rows = (await resolve(provider).listCustomerGroups?.()) ?? []\n const term = query.search?.trim().toLowerCase()\n const filtered = term\n ? rows.filter((g) =>\n g.name.toLowerCase().includes(term) || (g.description ?? '').toLowerCase().includes(term))\n : rows\n return applyQuery(filtered, query)\n },\n\n async create(data): Promise<CustomerGroup> {\n const p = requireGroups(resolve(provider))\n const input = data as unknown as Partial<CustomerGroup>\n return p.createCustomerGroup!({\n name: String(input.name ?? ''),\n description: input.description ?? null,\n color: input.color ?? null,\n } as CreateCustomerGroupInput)\n },\n\n async update(id: string, data: Partial<CustomerGroup>): Promise<CustomerGroup> {\n const p = requireGroups(resolve(provider))\n // customerIds is not on the form (membership needs a customer picker the\n // declarative EntityDef can't express). Passing the row's stale copy would\n // rewrite the membership on every rename; undefined leaves it alone.\n const { customerIds: _members, ...patch } = data\n return p.updateCustomerGroup!(id, patch as UpdateCustomerGroupInput)\n },\n\n async remove(id: string): Promise<void> {\n const p = requireGroups(resolve(provider))\n await p.deleteCustomerGroup!(id)\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type {\n CustomerSegment, CreateCustomerSegmentInput, UpdateCustomerSegmentInput, ShopCustomer,\n} from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\n/** A segment row plus how many customers currently match it. */\ntype SegmentRow = CustomerSegment & { matchCount: number }\n\nfunction requireSegments(p: ReturnType<typeof resolve>) {\n if (!p.listCustomerSegments) throw new Error('This store provider does not support customer segments')\n return p\n}\n\n/**\n * Does this customer satisfy the rule? All criteria AND together, and a null\n * criterion is \"don't check\", NOT zero — a segment with no bounds matches\n * everyone, which is different from one demanding at least R$0.\n */\nexport function customerMatchesSegment(c: ShopCustomer, s: CustomerSegment): boolean {\n const orders = c.ordersCount ?? 0\n const spent = c.totalSpent ?? 0\n if (s.minOrders != null && orders < s.minOrders) return false\n if (s.maxOrders != null && orders > s.maxOrders) return false\n if (s.minSpent != null && spent < s.minSpent) return false\n if (s.maxSpent != null && spent > s.maxSpent) return false\n // Compare on the calendar day: createdAt is a timestamp and the bounds are\n // dates, so a same-day signup must count as \"joined after\" that day.\n const joined = c.createdAt?.slice(0, 10)\n if (s.joinedAfter && (!joined || joined < s.joinedAfter)) return false\n if (s.joinedBefore && (!joined || joined > s.joinedBefore)) return false\n return true\n}\n\nexport function createShopCustomerSegmentDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<SegmentRow> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<SegmentRow>> {\n const p = resolve(provider)\n const rows = (await p.listCustomerSegments?.()) ?? []\n // One customer read for the whole page, then count in memory. A segment\n // is a rule, so its size is only true when it is recomputed — a stored\n // count would be a number that silently goes stale.\n const customers = rows.length ? await p.listCustomers().catch(() => [] as ShopCustomer[]) : []\n const withCounts: SegmentRow[] = rows.map((s) => ({\n ...s,\n matchCount: customers.filter((c) => customerMatchesSegment(c, s)).length,\n }))\n const term = query.search?.trim().toLowerCase()\n const filtered = term\n ? withCounts.filter((s) =>\n s.name.toLowerCase().includes(term) || (s.description ?? '').toLowerCase().includes(term))\n : withCounts\n return applyQuery(filtered, query)\n },\n\n async create(data): Promise<SegmentRow> {\n const p = requireSegments(resolve(provider))\n const input = data as unknown as Partial<CustomerSegment>\n const created = await p.createCustomerSegment!({\n name: String(input.name ?? ''),\n description: input.description ?? null,\n minOrders: input.minOrders ?? null,\n maxOrders: input.maxOrders ?? null,\n minSpent: input.minSpent ?? null,\n maxSpent: input.maxSpent ?? null,\n joinedAfter: input.joinedAfter || null,\n joinedBefore: input.joinedBefore || null,\n } as CreateCustomerSegmentInput)\n return { ...created, matchCount: 0 }\n },\n\n async update(id: string, data: Partial<SegmentRow>): Promise<SegmentRow> {\n const p = requireSegments(resolve(provider))\n // matchCount is derived, never stored — it must not reach the patch.\n const { matchCount: _count, ...patch } = data\n const updated = await p.updateCustomerSegment!(id, patch as UpdateCustomerSegmentInput)\n return { ...updated, matchCount: 0 }\n },\n\n async remove(id: string): Promise<void> {\n const p = requireSegments(resolve(provider))\n await p.deleteCustomerSegment!(id)\n },\n }\n}\n","import React from 'react'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport type { StoreSettings, UpdateStoreSettingsInput } from '@fayz-ai/shop'\nimport { resolve, type ShopProviderResolver } from '../data/shared'\nimport { errorMessage } from './error-message'\n\n// ---------------------------------------------------------------------------\n// useStoreSettings — the store's commercial policy, loaded and saved\n// ---------------------------------------------------------------------------\n// One hook behind all the Commerce settings screens, and the reason they can be\n// five screens instead of one: each renders a slice of the SAME tenant row, and\n// each save sends only the keys it touched (see storeSettingsPayload). Two\n// screens open in two tabs cannot overwrite each other's sections.\n//\n// AUTO-SAVE, no Save button. Every one of these is a single decision with an\n// immediate meaning (\"aceito boleto\"), and a form that batches ten of them\n// behind a button asks the merchant to remember which ones they changed. The\n// write is debounced so a burst of chip clicks collapses into one round trip.\n//\n// `undefined` is load-bearing throughout: it means the merchant has not decided,\n// which every reader treats as \"keep the app's own default\". A screen must\n// therefore never render `value ?? false` into the store — only into the\n// control. `defaults` exists for exactly that: it is what the UI shows while\n// nothing is chosen, and it is never written on its own.\n\nconst DEBOUNCE_MS = 400\n\nexport interface StoreSettingsHandle {\n /** Merged over `defaults`: what the controls render. */\n value: StoreSettings\n /** What is actually stored — `undefined` for anything undecided. */\n stored: StoreSettings | null\n set: (patch: UpdateStoreSettingsInput) => void\n loading: boolean\n /** True while a write is in flight or pending. Drives the \"saving…\" hint. */\n saving: boolean\n /** The provider refused the WRITE. Shown inline; the optimistic value stays\n * on screen so the merchant does not lose what they typed. */\n error: string | null\n /**\n * The provider refused the READ.\n *\n * Kept apart from `error` because the two need opposite copy and imply\n * opposite things. A failed save means \"your change did not stick\"; a failed\n * load means \"everything below is a default, not your settings\" — and showing\n * the save wording for a load failure, which is what this hook did at first,\n * tells the merchant a change was lost when they had not made one.\n */\n loadError: string | null\n /** False when the mounted provider has no store-settings support at all —\n * the screen says so instead of pretending the toggles work. */\n supported: boolean\n}\n\nexport function useStoreSettings(\n provider: ShopProviderResolver | undefined,\n defaults: StoreSettings = {},\n): StoreSettingsHandle {\n const shop = React.useMemo(\n () => (provider ? resolve(provider) : getShopProvider()),\n [provider],\n )\n const supported = typeof shop.getStoreSettings === 'function' && typeof shop.updateStoreSettings === 'function'\n\n const [stored, setStored] = React.useState<StoreSettings | null>(null)\n const [loading, setLoading] = React.useState(supported)\n const [saving, setSaving] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const [loadError, setLoadError] = React.useState<string | null>(null)\n\n React.useEffect(() => {\n if (!supported) return\n let cancelled = false\n setLoading(true)\n setLoadError(null)\n void shop\n .getStoreSettings!()\n .then((settings) => { if (!cancelled) setStored(settings) })\n .catch((e) => { if (!cancelled) setLoadError(errorMessage(e)) })\n .finally(() => { if (!cancelled) setLoading(false) })\n return () => { cancelled = true }\n }, [shop, supported])\n\n // The pending patch accumulates across the debounce window, so clicking three\n // chips sends one write with three keys rather than three writes racing to be\n // last. Kept in a ref: a re-render must not restart the timer.\n const pendingRef = React.useRef<UpdateStoreSettingsInput>({})\n const timerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n\n React.useEffect(() => () => { if (timerRef.current) clearTimeout(timerRef.current) }, [])\n\n const set = React.useCallback(\n (patch: UpdateStoreSettingsInput) => {\n // Optimistic: the control reflects the click without waiting for a server.\n setStored((current) => ({ ...(current ?? {}), ...patch }))\n if (!supported) return\n setError(null)\n setSaving(true)\n pendingRef.current = { ...pendingRef.current, ...patch }\n if (timerRef.current) clearTimeout(timerRef.current)\n timerRef.current = setTimeout(() => {\n const payload = pendingRef.current\n pendingRef.current = {}\n void shop\n .updateStoreSettings!(payload)\n // The server's answer wins over the optimistic guess — it is the row\n // that a CHECK constraint or a trigger may have had an opinion about.\n .then((saved) => setStored(saved))\n .catch((e) => setError(errorMessage(e)))\n .finally(() => setSaving(false))\n }, DEBOUNCE_MS)\n },\n [shop, supported],\n )\n\n const value = React.useMemo(() => ({ ...defaults, ...(stored ?? {}) }), [defaults, stored])\n\n return { value, stored, set, loading, saving, error, loadError, supported }\n}\n","import React from 'react'\nimport { Skeleton } from '@fayz-ai/ui'\nimport { AlertTriangle, Check, Loader2 } from 'lucide-react'\n\n/**\n * The three things every Commerce settings screen has to say, said once.\n *\n * Loading, saving and refused are not decoration on a settings screen that\n * writes to a server: without them a merchant cannot tell \"salvo\" from \"não\n * chegou\", and the whole reason these screens exist is that the previous ones\n * silently kept everything in React state. The saving/saved line is what\n * replaces the Save button the auto-save design removes.\n *\n * `supported: false` is its own case, and deliberately loud: it means the\n * mounted shop provider has no store-settings methods at all, so every control\n * below would be a toggle wired to nothing — which is exactly the bug this wave\n * fixes and must not be reintroduced silently by a bespoke provider.\n */\nexport function SettingsState({\n loading,\n saving,\n error,\n loadError,\n supported,\n children,\n}: {\n loading: boolean\n saving: boolean\n error: string | null\n /** The READ failed. Opposite copy from `error`, and shown ABOVE the controls\n * rather than below: what is on screen is defaults, not the store's settings,\n * and that has to be read before anything is clicked. */\n loadError?: string | null\n supported: boolean\n children: React.ReactNode\n}) {\n if (!supported) {\n return (\n <div className=\"rounded-lg border border-amber-500/30 bg-amber-500/5 p-4 text-sm\">\n <p className=\"flex items-center gap-2 font-medium text-amber-700 dark:text-amber-500\">\n <AlertTriangle className=\"h-4 w-4 shrink-0\" />\n Este app não guarda as configurações da loja\n </p>\n <p className=\"mt-1 text-muted-foreground\">\n O provedor de loja montado aqui não implementa <code>getStoreSettings</code>. As opções\n abaixo não seriam salvas, então não são mostradas.\n </p>\n </div>\n )\n }\n\n if (loading) {\n return (\n <div className=\"space-y-4\">\n <Skeleton className=\"h-28 w-full rounded-lg\" />\n <Skeleton className=\"h-40 w-full rounded-lg\" />\n </div>\n )\n }\n\n return (\n <div className=\"space-y-4\">\n {loadError && (\n <div className=\"rounded-lg border border-destructive/30 bg-destructive/5 p-3 text-sm\">\n <p className=\"flex items-center gap-2 font-medium text-destructive\">\n <AlertTriangle className=\"h-4 w-4 shrink-0\" />\n Não foi possível carregar as configurações da loja\n </p>\n <p className=\"mt-1 text-muted-foreground\">\n O que aparece abaixo são os valores padrão, não as suas escolhas. Recarregue a página\n antes de alterar algo — salvar agora sobrescreveria configurações que não conseguimos ler.\n </p>\n <p className=\"mt-1 text-xs text-muted-foreground\">{loadError}</p>\n </div>\n )}\n {children}\n <div className=\"flex min-h-5 items-center gap-1.5 px-1 text-xs text-muted-foreground\">\n {error ? (\n <span className=\"flex items-center gap-1.5 text-destructive\">\n <AlertTriangle className=\"h-3.5 w-3.5 shrink-0\" />\n Não foi possível salvar: {error}\n </span>\n ) : saving ? (\n <>\n <Loader2 className=\"h-3.5 w-3.5 shrink-0 animate-spin\" />\n Salvando…\n </>\n ) : (\n <>\n <Check className=\"h-3.5 w-3.5 shrink-0\" />\n As alterações são salvas automaticamente.\n </>\n )}\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport { SettingsGroup, SelectRow, ToggleRow } from '@fayz-ai/admin'\nimport type { ShopProviderResolver } from '../data/shared'\nimport { useStoreSettings } from './useStoreSettings'\nimport { SettingsState } from './SettingsState'\n\nexport interface StoreGeneralSettingsProps {\n currency?: { code?: string; locale?: string; symbol?: string }\n provider?: ShopProviderResolver\n}\n\nconst CURRENCIES = [\n { value: 'BRL', label: 'Real (R$)' },\n { value: 'USD', label: 'US Dollar ($)' },\n { value: 'EUR', label: 'Euro (€)' },\n { value: 'GBP', label: 'British Pound (£)' },\n]\n\nconst LOCALES = [\n { value: 'pt-BR', label: 'Português (Brasil)' },\n { value: 'en-US', label: 'English (US)' },\n { value: 'es-ES', label: 'Español' },\n]\n\n/**\n * Loja — moeda, formatação e as regras de catálogo.\n *\n * O `currency` que o app passa na criação do plugin é o VALOR INICIAL mostrado,\n * não o valor salvo: enquanto o lojista não escolhe, a vitrine segue com o que o\n * app declarou, e é isso que a coluna nula significa. Escolher grava.\n */\nexport function StoreGeneralSettings({ currency, provider }: StoreGeneralSettingsProps) {\n const settings = useStoreSettings(provider, {\n currency: currency?.code ?? 'BRL',\n locale: currency?.locale ?? 'pt-BR',\n showOutOfStock: true,\n requireSku: false,\n notifyNewOrder: true,\n notifyLowStock: false,\n })\n const { value, set } = settings\n\n return (\n <SettingsState {...settings}>\n <SettingsGroup title=\"Loja\" description=\"Moeda e formatação da vitrine.\">\n <SelectRow\n label=\"Moeda\"\n description=\"Moeda padrão para preços e checkout.\"\n value={value.currency ?? 'BRL'}\n options={CURRENCIES}\n onChange={(v) => set({ currency: v })}\n />\n <SelectRow\n label=\"Idioma / formato\"\n description=\"Formatação de números, preços e datas.\"\n value={value.locale ?? 'pt-BR'}\n options={LOCALES}\n onChange={(v) => set({ locale: v })}\n />\n </SettingsGroup>\n\n <SettingsGroup title=\"Catálogo\" description=\"Como os produtos aparecem e são gerenciados.\">\n <ToggleRow\n label=\"Mostrar produtos esgotados\"\n description=\"Exibir itens sem estoque na vitrine.\"\n checked={value.showOutOfStock ?? true}\n onChange={(v) => set({ showOutOfStock: v })}\n />\n <ToggleRow\n label=\"Exigir SKU\"\n description=\"Tornar o SKU obrigatório ao criar produtos.\"\n checked={value.requireSku ?? false}\n onChange={(v) => set({ requireSku: v })}\n />\n </SettingsGroup>\n\n {/* «Controlar estoque» saiu daqui. Era um interruptor local que não\n governava nada, e a decisão real — quem é dono do número, nosso livro\n ou um ERP — já existe como `stock_ownership` e é escrita pelo conector\n que assume o estoque. Dois controles para a mesma coisa é o caminho\n mais curto para eles discordarem. */}\n\n <SettingsGroup title=\"Notificações\" description=\"Avisos por e-mail da loja.\">\n <ToggleRow\n label=\"E-mail de novo pedido\"\n description=\"Notificar a equipe a cada novo pedido.\"\n checked={value.notifyNewOrder ?? true}\n onChange={(v) => set({ notifyNewOrder: v })}\n />\n <ToggleRow\n label=\"Alerta de estoque baixo\"\n description=\"Avisar quando produtos atingirem o mínimo.\"\n checked={value.notifyLowStock ?? false}\n onChange={(v) => set({ notifyLowStock: v })}\n />\n </SettingsGroup>\n </SettingsState>\n )\n}\n","/**\n * Which gateway should be charging, given what the store stored and what is\n * connected right now. Returns the slug to persist, or null for \"leave it\".\n *\n * The store must always have someone charging: a gateway just connected and\n * nobody named makes every order pending for no reason, and a named gateway\n * that went away makes the checkout promise a charge that cannot open.\n *\n * `''` is the one answer this never overrides — it is the merchant saying \"eu\n * confirmo à mão\", which is a decision. `undefined` is the absence of one.\n */\nexport function resolvePaymentProvider(\n current: string | undefined | null,\n live: readonly string[],\n): string | null {\n if (live.length === 0) return null\n if (current === '') return null\n if (current && live.includes(current)) return null\n return live[0]!\n}\n","import React from 'react'\nimport { ConnectorMark, StateChip, type UnifiedConnector } from '@fayz-ai/admin'\n\n/**\n * One payment gateway, where activating it IS choosing it.\n *\n * Shopify and Nuvemshop have no \"primary provider\" control: a provider is active\n * or it is not, and turning one on is what makes it charge. Ours were two\n * sections, so the gateway was chosen in one place and listed in another with\n * the relationship left to be guessed.\n *\n * The row body ONLY selects, and the named link beside it is the only way into\n * the connection's own screen — a row that sometimes selected and sometimes\n * opened a panel read as broken, which is what it was reported as.\n */\nexport function PaymentProviderRow({ connector, selected, onSelect, onOpen }: {\n connector: UnifiedConnector\n selected: boolean\n onSelect: (connector: UnifiedConnector) => void\n onOpen: (connector: UnifiedConnector) => void\n}) {\n const live = connector.state === 'connected'\n\n return (\n <li className={`flex items-start gap-1 transition-colors ${selected ? 'bg-primary/5' : ''}`}>\n {/* Not connected is not selectable, and the body never opens the panel:\n one row, one meaning. The link beside it is the way in. */}\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n disabled={!live}\n onClick={() => onSelect(connector)}\n className={`flex min-w-0 flex-1 items-start gap-3 p-4 text-left ${\n live ? 'hover:bg-muted/40' : 'cursor-default opacity-70'\n }`}\n >\n <span\n aria-hidden\n className={`mt-1.5 flex h-4 w-4 shrink-0 items-center justify-center rounded-full border ${\n selected ? 'border-primary' : 'border-muted-foreground/40'\n } ${live ? '' : 'opacity-30'}`}\n >\n {selected && <span className=\"h-2 w-2 rounded-full bg-primary\" />}\n </span>\n <ConnectorMark connector={connector} />\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex flex-wrap items-center gap-2\">\n <span className=\"font-medium text-foreground\">{connector.name}</span>\n <StateChip state={connector.state} />\n </span>\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">\n {selected\n ? 'Cobra os pedidos desta loja.'\n : live\n ? 'Conectado. Clique para passar a cobrança para ele.'\n : connector.description ?? 'Ainda não conectado.'}\n </span>\n </span>\n </button>\n {/* Named, not a chevron: the arrow said \"there is more here\" and the row\n already means something else now — one of the two had to say what it\n does. */}\n <button\n type=\"button\"\n onClick={() => onOpen(connector)}\n className=\"shrink-0 self-center whitespace-nowrap px-4 text-xs text-muted-foreground underline decoration-dotted underline-offset-4 hover:text-foreground\"\n >\n {live ? 'Configurar conexão' : 'Conectar'}\n </button>\n </li>\n )\n}\n\n/** The absence of a gateway, as a choice in the same list — Shopify's \"manual\n * payment methods only\". A separate section for it made it look like a setting\n * about something else. */\nexport function ManualChargeRow({ selected, onSelect }: {\n selected: boolean\n onSelect: () => void\n}) {\n return (\n <li className={selected ? 'bg-primary/5' : ''}>\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n onClick={onSelect}\n className=\"flex w-full items-start gap-3 p-4 text-left hover:bg-muted/40\"\n >\n <span\n aria-hidden\n className={`mt-1.5 flex h-4 w-4 shrink-0 items-center justify-center rounded-full border ${\n selected ? 'border-primary' : 'border-muted-foreground/40'\n }`}\n >\n {selected && <span className=\"h-2 w-2 rounded-full bg-primary\" />}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"font-medium text-foreground\">Nenhum — eu confirmo os pagamentos à mão</span>\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">\n Pix por chave, dinheiro na entrega, combinado com a loja. O pedido nasce pendente e\n espera você confirmar que o dinheiro caiu.\n </span>\n </span>\n </button>\n </li>\n )\n}\n","import React from 'react'\nimport {\n SettingsGroup, MultiSelectRow,\n useConnectors, ConnectorDetail, AddConnectorPanel, AddConnectorButton,\n openConnectorsPanel, useConnectorsPanelAvailable,\n type UnifiedConnector,\n} from '@fayz-ai/admin'\nimport type { PaymentMethodKind } from '@fayz-ai/shop'\nimport { AlertTriangle } from 'lucide-react'\nimport type { ShopProviderResolver } from '../data/shared'\nimport { useStoreSettings } from './useStoreSettings'\nimport { SettingsState } from './SettingsState'\nimport { resolvePaymentProvider } from './payment-provider'\nimport { ManualChargeRow, PaymentProviderRow } from './PaymentProviderRow'\n\nexport interface PaymentsSettingsProps {\n provider?: ShopProviderResolver\n}\n\n/**\n * Every method an order can record — the same list as the CHECK on\n * plg_shop_orders.payment_method_kind, and therefore the same list the trigger\n * from 0045 validates against. One vocabulary, three places, no drift.\n */\nconst METHODS: Array<{ value: PaymentMethodKind; label: string; hint: string }> = [\n { value: 'pix', label: 'Pix', hint: 'Chave ou QR Code' },\n { value: 'credit_card', label: 'Cartão de crédito', hint: 'Gateway ou maquininha' },\n { value: 'debit_card', label: 'Cartão de débito', hint: 'Gateway ou maquininha' },\n { value: 'boleto', label: 'Boleto', hint: 'Enviado por e-mail' },\n { value: 'cash', label: 'Dinheiro', hint: 'Na entrega ou no balcão' },\n { value: 'other', label: 'Combinar com a loja', hint: 'A loja acerta o pagamento' },\n]\n\n/**\n * Pagamentos — quem cobra e o que o comprador pode escolher.\n *\n * Duas coisas diferentes numa tela, e a distinção é o assunto:\n *\n * • QUEM COBRA é uma conexão. Já existe: os conectores de pagamento vêm do\n * manifesto do plugin, a credencial vai para o cofre e o estado é derivado\n * de plg_connections. Esta tela não reimplementa nada disso — ela FILTRA o\n * hub por `category === 'payments'` e reusa a mesma linha, a mesma marca e a\n * mesma jornada de conectar. Um cartão próprio aqui divergiria do hub na\n * primeira vez que qualquer um dos três mudasse.\n *\n * • O QUE O COMPRADOR ESCOLHE é política comercial, e muda com a estação. Fica\n * em plg_shop_settings.payment_methods, é lida pela vitrine em runtime e é\n * IMPOSTA no servidor: um pedido nomeando um método fora da lista é\n * recusado, não apenas escondido do formulário.\n *\n * Um método sem gateway ainda é legítimo — dinheiro na entrega, Pix por chave,\n * «combinar com a loja» — então nada aqui exige uma conexão para ser oferecido.\n * O que a tela faz é DIZER quando o pedido vai nascer pendente esperando o\n * lojista confirmar, em vez de deixar o lojista descobrir isso no primeiro\n * pedido.\n */\n/** The categories this screen is about — the same list its own filter uses. */\nconst PAYMENT_CATEGORIES = ['payments']\n\nexport function PaymentsSettings({ provider }: PaymentsSettingsProps) {\n const settings = useStoreSettings(provider)\n const { value, set } = settings\n const { connectors } = useConnectors({ hostPluginId: 'shop', includeGrants: false })\n const [adding, setAdding] = React.useState(false)\n const [selected, setSelected] = React.useState<UnifiedConnector | null>(null)\n const panelAvailable = useConnectorsPanelAvailable()\n\n const openJourney = React.useCallback(\n (connector: UnifiedConnector) => {\n // Same rule as the hub: the assistant's drawer owns the journey when one is\n // mounted, and the sheet is the fallback so the flow is never stranded.\n if (panelAvailable) openConnectorsPanel(connector)\n else setSelected(connector)\n },\n [panelAvailable],\n )\n\n const payment = React.useMemo(\n () => (connectors ?? []).filter((c) => c.category && PAYMENT_CATEGORIES.includes(c.category)),\n [connectors],\n )\n const live = React.useMemo(() => payment.filter((c) => c.state === 'connected'), [payment])\n\n const chosen = value.paymentMethods ?? []\n // A gateway went away (disconnected, or the app dropped the plugin) and the\n // store still names it — and there is nothing live to hand the charge to.\n const staleProvider = !!value.paymentProvider\n && !live.some((c) => c.slug === value.paymentProvider)\n && live.length === 0\n\n // Always someone charging — the rule itself is in resolvePaymentProvider, so\n // it can be argued with in a test instead of in a mounted screen.\n const movedFrom = React.useRef<string | null>(null)\n React.useEffect(() => {\n if (!settings.supported || settings.loading) return\n const next = resolvePaymentProvider(value.paymentProvider, live.map((c) => c.slug))\n if (!next) return\n // Only a REPLACEMENT is announced; adopting a gateway nobody had chosen is\n // not news.\n if (value.paymentProvider) movedFrom.current = value.paymentProvider\n set({ paymentProvider: next })\n }, [live, value.paymentProvider, settings.supported, settings.loading, set])\n\n return (\n <SettingsState {...settings}>\n <SettingsGroup\n title=\"Formas de pagamento\"\n description=\"O que o cliente pode escolher no checkout. Um pedido que chegar com outra forma é recusado pelo servidor.\"\n >\n <MultiSelectRow\n label=\"Aceito na loja\"\n description=\"Nada escolhido = a vitrine oferece o que o app declarou, como hoje.\"\n value={chosen}\n options={METHODS.map((m) => ({ value: m.value, label: m.label }))}\n onChange={(next) => set({ paymentMethods: next as PaymentMethodKind[] })}\n />\n {chosen.length > 0 && !value.paymentProvider && (\n <p className=\"flex items-start gap-2 py-3 text-xs text-muted-foreground\">\n <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n Sem um gateway cobrando, todo pedido nasce <strong className=\"font-medium\">pendente</strong> e\n espera você confirmar que o dinheiro caiu. Isso funciona — é como as lojas com Pix por\n chave e pagamento na entrega operam — mas a confirmação é sua.\n </p>\n )}\n </SettingsGroup>\n\n <div>\n <div className=\"flex items-start justify-between gap-4 px-1 pb-1 pt-4\">\n <div>\n <h3 className=\"text-sm font-semibold\">Quem cobra</h3>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n O provedor marcado é quem abre a cobrança quando o cliente finaliza a compra — só um\n cobra por vez. A credencial vai para o cofre, nunca para o banco da loja.\n </p>\n </div>\n <AddConnectorButton onClick={() => setAdding(true)} />\n </div>\n <div className=\"rounded-lg border bg-card shadow-sm\">\n {payment.length === 0 ? (\n <p className=\"p-4 text-sm text-muted-foreground\">\n Nenhum provedor de pagamento disponível para este app ainda.\n </p>\n ) : (\n <ul className=\"divide-y\" role=\"radiogroup\" aria-label=\"Quem cobra\">\n {payment.map((connector) => (\n <PaymentProviderRow\n key={connector.id}\n connector={connector}\n selected={value.paymentProvider === connector.slug}\n onSelect={(c) => { movedFrom.current = null; set({ paymentProvider: c.slug }) }}\n onOpen={openJourney}\n />\n ))}\n <ManualChargeRow\n selected={value.paymentProvider === ''}\n onSelect={() => { movedFrom.current = null; set({ paymentProvider: '' }) }}\n />\n </ul>\n )}\n </div>\n {movedFrom.current && (\n <p className=\"flex items-start gap-2 px-1 pt-2 text-xs text-muted-foreground\">\n <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0 text-amber-600\" />\n <span>\n <strong className=\"font-medium\">{movedFrom.current}</strong> não está mais conectado, então\n a cobrança passou para o provedor marcado acima. Reconecte-o para voltar.\n </span>\n </p>\n )}\n {staleProvider && (\n <p className=\"flex items-start gap-2 px-1 pt-2 text-xs text-destructive\">\n <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n A loja cobra por <strong className=\"font-medium\">{value.paymentProvider}</strong>, que não\n está conectado agora, e não há outro para assumir. Enquanto isso os pedidos nascem\n pendentes.\n </p>\n )}\n </div>\n\n <AddConnectorPanel\n open={adding}\n onOpenChange={setAdding}\n connectors={connectors}\n // The button lives under \"Provedores de pagamento\" and must offer only\n // those: it was listing the ERP and the carrier too.\n categories={PAYMENT_CATEGORIES}\n onSelect={(connector) => {\n setAdding(false)\n openJourney(connector)\n }}\n />\n <ConnectorDetail\n connector={selected}\n open={!!selected}\n onOpenChange={(open) => { if (!open) setSelected(null) }}\n />\n </SettingsState>\n )\n}\n","import React from 'react'\nimport { SettingsGroup, SelectRow, ToggleRow } from '@fayz-ai/admin'\nimport type { CheckoutFieldKey, CheckoutFieldPolicy } from '@fayz-ai/shop'\nimport type { ShopProviderResolver } from '../data/shared'\nimport { useStoreSettings } from './useStoreSettings'\nimport { SettingsState } from './SettingsState'\n\nexport interface CheckoutSettingsProps {\n provider?: ShopProviderResolver\n}\n\n/**\n * The fields the checkout form can ask for, and which of them a store may\n * actually turn off.\n *\n * `locked` is not a UI nicety — it is the delivery reality. A courier cannot\n * deliver to a street with no number and no district, and the checkout's own\n * validation refuses those today; offering a switch that promises otherwise\n * would be offering to break deliveries. The order those appear in is the order\n * of the form, so this list reads like the screen the shopper sees.\n */\nconst FIELDS: Array<{ key: CheckoutFieldKey; label: string; locked?: boolean; hint?: string }> = [\n { key: 'name', label: 'Nome completo', locked: true, hint: 'Sempre pedido — é para quem a entrega vai.' },\n { key: 'email', label: 'E-mail', locked: true, hint: 'Sempre pedido — é por onde o pedido é confirmado.' },\n { key: 'phone', label: 'Telefone', hint: 'Vai junto com o endereço — é por onde o entregador liga.' },\n // Back, now that 0050 gives it a column. Deliberately NOT locked: a store that\n // neither charges through a gateway nor issues an invoice has no use for it.\n // The checkout escalates it to required on its own when a gateway is on —\n // that is a fact about the charge, not a preference the merchant can waive.\n { key: 'document', label: 'CPF / CNPJ', hint: 'Obrigatório quando a loja cobra por gateway ou emite nota — nesse caso a vitrine já pede sozinha.' },\n { key: 'postalCode', label: 'CEP', locked: true, hint: 'Sempre pedido — é o que cota o frete.' },\n { key: 'street', label: 'Endereço', locked: true },\n { key: 'number', label: 'Número', locked: true, hint: 'Sem número o entregador não chega.' },\n { key: 'complement', label: 'Complemento' },\n { key: 'district', label: 'Bairro', locked: true },\n { key: 'city', label: 'Cidade', locked: true },\n { key: 'state', label: 'UF', locked: true },\n]\n\nconst REQUIREMENT = [\n { value: 'off', label: 'Não pedir' },\n { value: 'optional', label: 'Pedir (opcional)' },\n { value: 'required', label: 'Pedir (obrigatório)' },\n]\n\nfunction toRequirement(policy: CheckoutFieldPolicy | undefined, locked: boolean): string {\n if (locked) return 'required'\n if (policy?.visible === false) return 'off'\n return policy?.required ? 'required' : 'optional'\n}\n\nfunction fromRequirement(choice: string): CheckoutFieldPolicy {\n // 'off' writes both keys rather than only `visible`: a field nobody can see\n // cannot be required, and leaving a stale `required: true` behind is how a\n // hidden field later reappears as a blocking validation nobody can satisfy.\n if (choice === 'off') return { visible: false, required: false }\n return { visible: true, required: choice === 'required' }\n}\n\n/**\n * Checkout — quem pode comprar e o que é pedido no caminho.\n *\n * A honestidade sobre quem impõe o quê está nas descrições, e não é detalhe:\n * «compra sem cadastro» é recusada pelo SERVIDOR (trigger da 0045), então\n * desligá-la vale mesmo contra um POST direto no RPC. «Exigir e-mail\n * confirmado» e os campos do formulário são de INTERFACE — a vitrine obedece, e\n * um comprador determinado não é impedido pelo banco. Prometer imposição onde\n * ela não existe é pior do que não ter a opção.\n */\nexport function CheckoutSettings({ provider }: CheckoutSettingsProps) {\n const settings = useStoreSettings(provider, {\n guestCheckout: true,\n requireConfirmedEmail: false,\n marketingOptIn: false,\n discountsEnabled: true,\n })\n const { value, set } = settings\n const fields = value.checkoutFields ?? {}\n\n const setField = (key: CheckoutFieldKey, choice: string) =>\n set({ checkoutFields: { ...fields, [key]: fromRequirement(choice) } })\n\n return (\n <SettingsState {...settings}>\n <SettingsGroup\n title=\"Contas de cliente\"\n description=\"Se o comprador precisa de uma conta antes de finalizar.\"\n >\n <ToggleRow\n label=\"Permitir compra sem cadastro\"\n description=\"Desligado, o comprador precisa entrar ou criar conta. Esta é imposta no servidor: um pedido sem conta é recusado.\"\n checked={value.guestCheckout ?? true}\n onChange={(v) => set({ guestCheckout: v })}\n />\n <ToggleRow\n label=\"Exigir e-mail confirmado\"\n description=\"O comprador recebe um link ao se cadastrar e só finaliza depois de clicar. Vale na vitrine — confirmar e-mail é um fato da conta, não do pedido.\"\n checked={value.requireConfirmedEmail ?? false}\n onChange={(v) => set({ requireConfirmedEmail: v })}\n disabled={value.guestCheckout !== false}\n />\n {value.guestCheckout !== false && (\n <p className=\"py-3 text-xs text-muted-foreground\">\n «Exigir e-mail confirmado» só faz sentido com o cadastro obrigatório: enquanto a compra\n sem cadastro está liberada, não há conta cujo e-mail confirmar.\n </p>\n )}\n </SettingsGroup>\n\n <SettingsGroup title=\"Carrinho\" description=\"O que o comprador pode aplicar antes de pagar.\">\n <ToggleRow\n label=\"Cupons de desconto\"\n description=\"Mostrar o campo de código no carrinho e no checkout.\"\n checked={value.discountsEnabled ?? true}\n onChange={(v) => set({ discountsEnabled: v })}\n />\n </SettingsGroup>\n\n <SettingsGroup\n title=\"Consentimento de marketing\"\n description=\"Coleta de opt-in para e-mails, no padrão que a LGPD pede: marcado por quem quer, nunca por padrão.\"\n >\n <ToggleRow\n label=\"Mostrar caixa de opt-in\"\n description=\"Exibir a caixa «quero receber novidades» no checkout, desmarcada.\"\n checked={value.marketingOptIn ?? false}\n onChange={(v) => set({ marketingOptIn: v })}\n />\n </SettingsGroup>\n\n <SettingsGroup\n title=\"Campos do cliente\"\n description=\"O que o comprador vê e o que ele precisa preencher. Campos travados são os que a entrega não dispensa.\"\n >\n {FIELDS.map((field) => (\n <SelectRow\n key={field.key}\n label={field.label}\n description={field.hint}\n value={toRequirement(fields[field.key], !!field.locked)}\n options={field.locked ? [{ value: 'required', label: 'Pedir (obrigatório)' }] : REQUIREMENT}\n onChange={(choice) => setField(field.key, choice)}\n disabled={field.locked}\n />\n ))}\n </SettingsGroup>\n </SettingsState>\n )\n}\n","import React from 'react'\nimport { RegistryCrudView } from '@fayz-ai/admin'\nimport { packagesRegistry, PACKAGES_REGISTRY } from '../data/registries'\nimport { shippingRegistryPath } from '../data/registry-routes'\n\n/**\n * Embalagens — em que caixas a loja embala.\n *\n * É a metade que faltava do frete real. O produto declara o que ele É (peso e\n * medidas, na seção Envio do cadastro) e para onde ele VAI (a embalagem que\n * aponta); esta tela é o cadastro de onde essa escolha sai. Enquanto ela não\n * existia, a caixa da cotação era uma constante no código — 4×16×20cm e 300g\n * para toda loja da plataforma, que é o piso que a Correios aceita e não a\n * medida de nada que alguém vende. O frete cotado e o frete pago divergiam, e a\n * diferença saía da margem do lojista.\n *\n * A LISTA NÃO É DESTE ARQUIVO, e essa é a correção: era um CRUD escrito à mão,\n * com o seu próprio jeito de listar, criar, validar e apagar. Agora é\n * `PluginRegistryDef` + `RegistryCrudView`, o mesmo par que desenha feriados,\n * locais e categorias — uma interface a menos para o lojista aprender e umas\n * duzentas linhas a menos para manter sincronizadas com o resto do admin.\n */\nexport function PackagesSettings({ basePath = shippingRegistryPath(PACKAGES_REGISTRY) }: {\n basePath?: string\n}) {\n return (\n <div className=\"space-y-3\">\n <div className=\"px-1 pt-4\">\n <h3 className=\"text-sm font-semibold\">Embalagens</h3>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">{packagesRegistry.description}</p>\n </div>\n <RegistryCrudView registry={packagesRegistry} basePath={basePath} />\n </div>\n )\n}\n","import React from 'react'\nimport { SettingsGroup, TextRow, adminNavigateTo } from '@fayz-ai/admin'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport type { ShippingProfile } from '@fayz-ai/shop'\nimport { ArrowRight, Layers } from 'lucide-react'\nimport { resolve, type ShopProviderResolver } from '../data/shared'\nimport type { StoreSettingsHandle } from './useStoreSettings'\nimport { SHIPPING_PROFILES_REGISTRY } from '../data/registries'\nimport { shippingRegistryPath } from '../data/registry-routes'\n\nexport interface HandlingSettingsProps {\n /** The Entrega screen's own settings read, shared rather than repeated. */\n settings: StoreSettingsHandle\n provider?: ShopProviderResolver\n}\n\n/**\n * Shipping profiles, and the handling note that travels with the parcel.\n *\n * Replaces a three-way cold-chain radio: a profile answers refrigerated, fragile,\n * oversized and made-to-order with one mechanism. The note is separate because it\n * does not decide who may carry the box.\n */\nexport function HandlingSettings({ settings, provider }: HandlingSettingsProps) {\n const shop = React.useMemo(() => (provider ? resolve(provider) : getShopProvider()), [provider])\n const { value, set, loading, supported } = settings\n const [noteDraft, setNoteDraft] = React.useState<string | null>(null)\n const [profiles, setProfiles] = React.useState<ShippingProfile[] | null>(null)\n\n React.useEffect(() => {\n let cancelled = false\n void shop.listShippingProfiles?.()\n .then((list) => { if (!cancelled) setProfiles(list) })\n // Silent: a provider without profiles reads the same as a store with none.\n .catch(() => { if (!cancelled) setProfiles([]) })\n return () => { cancelled = true }\n }, [shop])\n\n if (!supported) return null\n\n const storedNote = value.handlingNote ?? ''\n // Null draft = not being edited, so a server answer cannot fight the typing.\n const note = noteDraft ?? storedNote\n const custom = (profiles ?? []).filter((p) => !p.isDefault)\n\n return (\n <div className=\"space-y-4\">\n <div className=\"px-1 pb-1 pt-4\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold\">\n <Layers className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n Produtos que vão de outro jeito\n </h3>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n Um perfil é um grupo de produtos com zonas próprias — refrigerados, frágeis, volumosos, sob\n encomenda. Um perfil com só as suas zonas e o gateway desligado é como se diz «isto não vai\n de transportadora». Produto sem perfil usa o geral, que é o de todos hoje.\n </p>\n </div>\n\n <div className=\"rounded-lg border bg-card px-5 shadow-sm\">\n <button\n type=\"button\"\n onClick={() => adminNavigateTo(shippingRegistryPath(SHIPPING_PROFILES_REGISTRY))}\n className=\"flex w-full items-center gap-3 py-3.5 text-left\"\n >\n <Layers className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-sm font-medium\">\n {profiles == null\n ? 'Carregando perfis…'\n : custom.length === 0\n ? 'Só o perfil geral'\n : `${custom.length} ${custom.length === 1 ? 'perfil' : 'perfis'} além do geral`}\n </span>\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">\n {custom.length === 0\n ? 'Todo produto entrega pelas mesmas zonas. Crie um perfil quando um grupo precisar de zonas diferentes.'\n : custom.slice(0, 3).map((p) => p.name).join(' · ')}\n {custom.length > 3 && ` e ${custom.length - 3} mais`}\n </span>\n </span>\n <ArrowRight className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n </button>\n </div>\n\n <SettingsGroup\n title=\"Recado para quem entrega\"\n description=\"Vai junto com o pedido — para você, para o motoboy, e na observação da etiqueta quando houver gateway. Não aparece para o cliente, e não decide quem pode levar.\"\n >\n <TextRow\n label=\"Instrução de manuseio\"\n description=\"Ex.: caixa térmica com gelo, entregar em até 24h.\"\n value={note}\n onChange={setNoteDraft}\n onBlurCommit={() => {\n const next = note.trim()\n if (next !== storedNote) set({ handlingNote: next })\n setNoteDraft(null)\n }}\n placeholder=\"Sem instrução\"\n disabled={loading}\n />\n </SettingsGroup>\n </div>\n )\n}\n","import React from 'react'\n\nexport interface Choice<T extends string> {\n value: T\n label: string\n description: string\n /** Optional lucide icon component, rendered before the label. */\n Icon?: React.ComponentType<{ className?: string }>\n}\n\nexport interface ChoiceCardsProps<T extends string> {\n label: string\n choices: ReadonlyArray<Choice<T>>\n value: T | undefined\n onChange: (value: T) => void\n disabled?: boolean\n}\n\n/**\n * Mutually exclusive policies with a paragraph each — a radio, not a dropdown:\n * choosing between two of these needs both on screen at once.\n */\nexport function ChoiceCards<T extends string>({\n label, choices, value, onChange, disabled,\n}: ChoiceCardsProps<T>) {\n return (\n <div className=\"space-y-2 py-3\" role=\"radiogroup\" aria-label={label}>\n {choices.map((choice) => {\n const chosen = value === choice.value\n const Icon = choice.Icon\n return (\n <button\n key={choice.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={chosen}\n disabled={disabled}\n onClick={() => onChange(choice.value)}\n className={`flex w-full items-start gap-3 rounded-lg border p-3 text-left transition-colors ${\n chosen ? 'border-primary bg-primary/5' : 'border-border hover:bg-muted/40'\n } ${disabled ? 'opacity-60' : ''}`}\n >\n <span\n aria-hidden\n className={`mt-0.5 flex h-4 w-4 shrink-0 items-center justify-center rounded-full border ${\n chosen ? 'border-primary' : 'border-muted-foreground/40'\n }`}\n >\n {chosen && <span className=\"h-2 w-2 rounded-full bg-primary\" />}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex items-center gap-2 text-sm font-medium\">\n {Icon && <Icon className=\"h-4 w-4 shrink-0 text-muted-foreground\" />}\n {choice.label}\n </span>\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">{choice.description}</span>\n </span>\n </button>\n )\n })}\n </div>\n )\n}\n","import React from 'react'\nimport {\n SettingsGroup, TextRow, RegistryCrudView,\n useConnectors, ConnectorRow, ConnectorDetail,\n openConnectorsPanel, useConnectorsPanelAvailable,\n type UnifiedConnector,\n} from '@fayz-ai/admin'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport type { ShippingSettings as ShippingSettingsRow, ShippingZone, StockLocation } from '@fayz-ai/shop'\nimport { AlertTriangle, ArrowRight, Car, Loader2, MapPin, Truck, Warehouse } from 'lucide-react'\nimport { resolve, type ShopProviderResolver } from '../data/shared'\nimport { errorMessage } from './error-message'\nimport { PackagesSettings } from './PackagesSettings'\nimport {\n buildShopRegistries, locationSummary, LOCATIONS_REGISTRY, SHIPPING_ZONES_REGISTRY,\n} from '../data/registries'\nimport { shippingRecordPath, shippingRegistryIdFromHash, shippingRegistryPath } from '../data/registry-routes'\nimport { HandlingSettings } from './HandlingSettings'\nimport { ChoiceCards } from './ChoiceCards'\nimport { useStoreSettings } from './useStoreSettings'\n\nexport interface ShippingSettingsProps {\n provider?: ShopProviderResolver\n}\n\n/** Money in, as typed: '12,50' and '12.50' are the same number to a shopkeeper. */\nfunction parseMoney(raw: string): number | null {\n const cleaned = raw.replace(/[^\\d,.-]/g, '').replace(',', '.')\n if (!cleaned.trim()) return null\n const n = Number(cleaned)\n return Number.isFinite(n) && n >= 0 ? Math.round(n * 100) / 100 : null\n}\n\nconst formatMoney = (v: number | null | undefined): string =>\n v == null ? '' : String(v).replace('.', ',')\n\ntype FreightSource = 'own' | 'gateway'\n\n/** Stored rather than inferred from \"no connection\": connecting a gateway must not\n * start quoting carriers for a store that dispatches by hand. */\nconst FREIGHT_SOURCE: ReadonlyArray<{\n value: FreightSource\n label: string\n description: string\n Icon: React.ComponentType<{ className?: string }>\n}> = [\n {\n value: 'own',\n label: 'Eu mesmo calculo e despacho',\n description:\n 'O frete sai do preço base e das suas faixas de CEP, e você despacha como quiser — carro próprio, motoboy, agência. Nenhum gateway é consultado, mesmo que exista um conectado.',\n Icon: Car,\n },\n {\n value: 'gateway',\n label: 'Perguntar a um gateway de frete',\n description:\n 'O preço e o prazo vêm da transportadora, calculados pelo CEP do comprador. Quando o gateway não responde a tempo, o checkout usa suas faixas — a compra nunca fica sem preço.',\n Icon: Truck,\n },\n]\n\n/**\n * Entrega — o preço base, as zonas e quem coleta.\n *\n * A ORDEM DE PRECEDÊNCIA é o assunto desta tela, e está escrita nela em vez de\n * só no SQL: uma ZONA que cobre o CEP ganha do preço base; o preço base é o que\n * a loja cobra para um endereço que nenhuma zona cobre. Sem isso dito, um\n * lojista que criou uma zona não entende por que o número que ele digitou aqui\n * não aparece no checkout.\n *\n * O preço base vive em public.shipping_settings desde a 0015 e, até agora, só\n * podia ser escrito por SQL à mão — a tabela existia, com RLS e leitura anônima,\n * e nenhuma tela. É este arquivo que fecha isso.\n *\n * ZONAS E EMBALAGENS SÃO CADASTROS, e desde a FAY-1407 são cadastros DAQUI. As\n * zonas moravam numa página de CRUD própria em /store/shipping, então clicar em\n * \"Zonas de entrega\" no meio de configurar a entrega jogava o lojista para fora\n * de Configurações e o trazia de volta pela seta do navegador. Agora as duas\n * abrem em `_properties/<id>` dentro desta mesma tela, pelo `RegistryCrudView`\n * genérico — o mesmo que desenha feriados e locais.\n */\n\nexport function ShippingSettings({ provider }: ShippingSettingsProps) {\n // A rota mais funda ganha: /settings/shop-shipping/_properties/zonas é a\n // mesma aba, mostrando o cadastro em vez do resumo. Sem isso a lista de zonas\n // apareceria inteira embaixo do preço base o tempo todo.\n const [registryId, setRegistryId] = React.useState(shippingRegistryIdFromHash)\n React.useEffect(() => {\n const handler = () => setRegistryId(shippingRegistryIdFromHash())\n window.addEventListener('hashchange', handler)\n return () => window.removeEventListener('hashchange', handler)\n }, [])\n\n const shop = React.useMemo(() => (provider ? resolve(provider) : getShopProvider()), [provider])\n const registries = React.useMemo(\n () => buildShopRegistries(provider ?? getShopProvider),\n [provider],\n )\n // One read of plg_shop_settings for the whole screen: both sections below are\n // slices of the same tenant row.\n const storeSettings = useStoreSettings(provider)\n const supported = typeof shop.getShippingSettings === 'function' && typeof shop.updateShippingSettings === 'function'\n\n const [row, setRow] = React.useState<ShippingSettingsRow | null>(null)\n const [zones, setZones] = React.useState<ShippingZone[] | null>(null)\n const [locations, setLocations] = React.useState<StockLocation[] | null>(null)\n const [loading, setLoading] = React.useState(supported)\n const [saving, setSaving] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const [loadError, setLoadError] = React.useState<string | null>(null)\n\n // Drafts, because these are TEXT inputs over numbers: committing on every\n // keystroke would turn '1' into a R$ 1,00 flat rate on the way to '15'. They\n // commit on blur, which is also when the parse refusal can be shown without\n // fighting the person still typing.\n const [flatDraft, setFlatDraft] = React.useState('')\n const [freeDraft, setFreeDraft] = React.useState('')\n const [flatBad, setFlatBad] = React.useState(false)\n const [freeBad, setFreeBad] = React.useState(false)\n\n const { connectors } = useConnectors({ hostPluginId: 'shop', includeGrants: false })\n const [selected, setSelected] = React.useState<UnifiedConnector | null>(null)\n const panelAvailable = useConnectorsPanelAvailable()\n const openJourney = React.useCallback(\n (connector: UnifiedConnector) => {\n if (panelAvailable) openConnectorsPanel(connector)\n else setSelected(connector)\n },\n [panelAvailable],\n )\n const carriers = React.useMemo(\n () => (connectors ?? []).filter((c) => c.category === 'logistics' || c.category === 'shipping'),\n [connectors],\n )\n // 'ready' means declared and installed, not connected.\n const carriersConnected = carriers.some((c) => c.state !== 'ready')\n\n React.useEffect(() => {\n let cancelled = false\n if (supported) {\n setLoading(true)\n void shop\n .getShippingSettings!()\n .then((settings) => {\n if (cancelled) return\n setRow(settings)\n setFlatDraft(formatMoney(settings?.flatRate ?? 0))\n setFreeDraft(formatMoney(settings?.freeAbove))\n })\n .catch((e) => { if (!cancelled) setLoadError(errorMessage(e)) })\n .finally(() => { if (!cancelled) setLoading(false) })\n }\n void shop.listShippingZones?.()\n .then((list) => { if (!cancelled) setZones(list) })\n .catch(() => { if (!cancelled) setZones([]) })\n void shop.listStockLocations?.()\n .then((list) => { if (!cancelled) setLocations(list) })\n .catch(() => { if (!cancelled) setLocations([]) })\n return () => { cancelled = true }\n }, [shop, supported])\n\n const save = React.useCallback(\n (patch: Partial<ShippingSettingsRow>) => {\n if (!supported) return\n setSaving(true)\n setError(null)\n void shop\n .updateShippingSettings!(patch)\n .then((saved) => setRow(saved))\n .catch((e) => setError(errorMessage(e)))\n .finally(() => setSaving(false))\n },\n [shop, supported],\n )\n\n const commitFlat = () => {\n const parsed = parseMoney(flatDraft)\n // Empty means zero here — \"I charge nothing\" is a decision a store makes, and\n // it is also the column's default, so there is nothing ambiguous to refuse.\n const next = flatDraft.trim() === '' ? 0 : parsed\n if (next == null) { setFlatBad(true); return }\n setFlatBad(false)\n setFlatDraft(formatMoney(next))\n if (next !== (row?.flatRate ?? 0)) save({ flatRate: next })\n }\n\n const commitFree = () => {\n // Empty is NULL, not zero: \"no threshold\" and \"free from R$ 0\" are opposite\n // policies, and a zero here would make every order's delivery free.\n if (freeDraft.trim() === '') {\n setFreeBad(false)\n if (row?.freeAbove != null) save({ freeAbove: null })\n return\n }\n const parsed = parseMoney(freeDraft)\n if (parsed == null) { setFreeBad(true); return }\n setFreeBad(false)\n setFreeDraft(formatMoney(parsed))\n if (parsed !== row?.freeAbove) save({ freeAbove: parsed })\n }\n\n // An exclusion is active and is NOT a delivery zone.\n const activeZones = (zones ?? []).filter((z) => z.active && !z.excluded)\n const excludedZones = (zones ?? []).filter((z) => z.active && z.excluded)\n // undefined = undecided, which asks the gateway if one is connected.\n const usesGateway = storeSettings.value.carrierQuotes !== false\n\n // Only active locations that dispatch: an archived warehouse and one that just\n // holds stock are both irrelevant to what the shopper is quoted.\n const dispatching = (locations ?? []).filter((l) => l.status === 'active' && l.shipsOnline !== false)\n const originCep = dispatching.find((l) => l.postalCode)?.postalCode ?? null\n\n // Looked up, never compared to a literal: a `registryId === 'zonas'` here kept\n // rendering Embalagens after the rename, with nothing visibly broken.\n const activeRegistry = registryId\n ? registries.find((candidate) => candidate.id === registryId) ?? null\n : null\n if (activeRegistry) {\n // No back button of its own: the shell draws the whole trail.\n return (\n <RegistryCrudView\n registry={activeRegistry}\n basePath={shippingRegistryPath(activeRegistry.id)}\n />\n )\n }\n\n return (\n <div className=\"space-y-4\">\n {loadError && (\n <div className=\"rounded-lg border border-destructive/30 bg-destructive/5 p-3 text-sm\">\n <p className=\"flex items-center gap-2 font-medium text-destructive\">\n <AlertTriangle className=\"h-4 w-4 shrink-0\" />\n Não foi possível carregar o preço base de entrega\n </p>\n <p className=\"mt-1 text-muted-foreground\">\n O valor abaixo é o padrão, não o da sua loja. Recarregue antes de alterá-lo — salvar\n agora sobrescreveria um preço que não conseguimos ler.\n </p>\n <p className=\"mt-1 text-xs text-muted-foreground\">{loadError}</p>\n </div>\n )}\n {!supported ? (\n <div className=\"rounded-lg border border-amber-500/30 bg-amber-500/5 p-4 text-sm\">\n <p className=\"flex items-center gap-2 font-medium text-amber-700 dark:text-amber-500\">\n <AlertTriangle className=\"h-4 w-4 shrink-0\" />\n Este app não guarda o preço base de entrega\n </p>\n <p className=\"mt-1 text-muted-foreground\">\n O provedor de loja montado aqui não implementa <code>getShippingSettings</code>.\n </p>\n </div>\n ) : (\n <SettingsGroup\n title=\"Preço base\"\n description=\"O que a loja cobra quando nenhuma zona cobre o endereço. Uma zona que cobre o CEP sempre ganha deste número.\"\n >\n <TextRow\n label=\"Frete padrão\"\n description=\"Em reais. Deixe 0 para entrega grátis.\"\n value={flatDraft}\n onChange={setFlatDraft}\n onBlurCommit={commitFlat}\n placeholder=\"0,00\"\n invalid={flatBad}\n hint={flatBad ? 'Informe um valor em reais (ex.: 19,90).' : undefined}\n disabled={loading}\n />\n <TextRow\n label=\"Frete grátis acima de\"\n description=\"Subtotal, já com desconto, a partir do qual a entrega sai de graça. Vazio = sem regra de frete grátis.\"\n value={freeDraft}\n onChange={setFreeDraft}\n onBlurCommit={commitFree}\n placeholder=\"Sem regra\"\n invalid={freeBad}\n hint={freeBad ? 'Informe um valor em reais, ou deixe vazio.' : undefined}\n disabled={loading}\n />\n </SettingsGroup>\n )}\n\n <div>\n <div className=\"px-1 pb-1 pt-4\">\n <h3 className=\"text-sm font-semibold\">De onde você despacha</h3>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n Os locais que guardam estoque e despacham pedidos. O CEP do local padrão é a origem que a\n transportadora usa para cotar o frete — é aqui que ele se cadastra, uma vez. Cada local\n pode ter o seu próprio despachante ou seguir a decisão da loja.\n </p>\n </div>\n <div className=\"rounded-lg border bg-card px-5 shadow-sm\">\n <button\n type=\"button\"\n // Named ONE place? Open it. The list is only the answer when there\n // is nothing specific to point at.\n onClick={() => {\n window.location.hash = dispatching.length === 1 && dispatching[0]\n ? shippingRecordPath(LOCATIONS_REGISTRY, dispatching[0].id)\n : shippingRegistryPath(LOCATIONS_REGISTRY)\n }}\n className=\"flex w-full items-center gap-3 py-3.5 text-left\"\n >\n <Warehouse className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-sm font-medium\">\n {locations == null\n ? 'Carregando locais…'\n : dispatching.length === 0\n ? 'Nenhum local despacha pedidos'\n : dispatching.length === 1\n ? dispatching[0]!.name\n : `${dispatching.length} locais despachando`}\n </span>\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">\n {locations == null\n ? ' '\n : dispatching.length === 0\n ? 'Cadastre o local de onde os pedidos saem.'\n : dispatching.slice(0, 2).map((l) => locationSummary(l)).join(' — ')}\n </span>\n </span>\n <ArrowRight className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n </button>\n </div>\n {/* The one failure this screen can predict: a gateway that is asked to\n quote from nowhere answers nothing, and the shopper sees the zone\n price forever without knowing why. */}\n {usesGateway && locations != null && dispatching.length > 0 && !originCep && (\n <div className=\"mt-2 flex items-start gap-2 rounded-lg border border-amber-500/30 bg-amber-500/5 p-3 text-xs\">\n <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0 text-amber-600\" />\n <span className=\"text-muted-foreground\">\n Nenhum local tem CEP de origem. Sem ele a transportadora não cota, e o checkout cai nas\n suas zonas — preencha o CEP do local padrão.\n </span>\n </div>\n )}\n </div>\n\n <div>\n <div className=\"px-1 pb-1 pt-4\">\n <h3 className=\"text-sm font-semibold\">Zonas de entrega</h3>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n Faixas de CEP com preço, prazo e frete grátis próprios. Um CEP fora de todas as zonas cai\n no preço base acima; se a loja não tiver preço base nem zona que o cubra, o checkout diz\n que não entrega ali. Uma faixa também pode ser uma recusa — «não entrego aqui» — e ela\n vence qualquer zona e qualquer gateway.\n </p>\n </div>\n <div className=\"rounded-lg border bg-card px-5 shadow-sm\">\n <button\n type=\"button\"\n onClick={() => { window.location.hash = shippingRegistryPath(SHIPPING_ZONES_REGISTRY) }}\n className=\"flex w-full items-center gap-3 py-3.5 text-left\"\n >\n <MapPin className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-sm font-medium\">\n {zones == null\n ? 'Carregando zonas…'\n : activeZones.length === 0\n ? 'Nenhuma zona ainda'\n : `${activeZones.length} ${activeZones.length === 1 ? 'zona ativa' : 'zonas ativas'}`}\n </span>\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">\n {activeZones.length === 0\n ? 'Sem zonas, toda entrega usa o preço base.'\n : activeZones.slice(0, 3).map((z) => z.name).join(' · ')}\n {activeZones.length > 3 && ` e ${activeZones.length - 3} mais`}\n {excludedZones.length > 0 && (\n <span className=\"mt-0.5 block text-red-700 dark:text-red-400\">\n {excludedZones.length === 1\n ? '1 região recusada'\n : `${excludedZones.length} regiões recusadas`}\n {' — '}\n {excludedZones.slice(0, 2).map((z) => z.name).join(' · ')}\n </span>\n )}\n </span>\n </span>\n <ArrowRight className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n </button>\n </div>\n </div>\n\n <PackagesSettings />\n\n {storeSettings.supported && (\n <div>\n <div className=\"px-1 pb-1 pt-4\">\n <h3 className=\"text-sm font-semibold\">Quem calcula o frete</h3>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n O Melhor Envio não é uma transportadora: é um gateway, uma conexão só que traz\n Correios, Jadlog, Loggi e outras. Então a escolha aqui não é qual transportadora — é\n se a loja calcula pelas próprias faixas ou se pergunta o preço a um gateway.\n </p>\n </div>\n <ChoiceCards\n label=\"Quem calcula o frete\"\n choices={FREIGHT_SOURCE}\n value={usesGateway ? 'gateway' : 'own'}\n onChange={(choice) => storeSettings.set({ carrierQuotes: choice === 'gateway' })}\n disabled={storeSettings.loading}\n />\n {/* Keeps the screen honest: with a gateway still connected the choice is\n recorded intent, not a guarantee. */}\n {!usesGateway && carriersConnected && (\n <div className=\"mt-2 flex items-start gap-2 rounded-lg border border-amber-500/30 bg-amber-500/5 p-3 text-xs\">\n <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0 text-amber-600\" />\n <span className=\"text-muted-foreground\">\n Há um gateway ainda conectado abaixo. Para garantir que nenhum preço de\n transportadora apareça no checkout, desconecte-o — a escolha acima vale para a\n vitrine, a conexão continua existindo.\n </span>\n </div>\n )}\n </div>\n )}\n\n {carriers.length > 0 && (\n <div className={usesGateway ? undefined : 'opacity-60'}>\n <div className=\"px-1 pb-1 pt-4\">\n <h3 className=\"text-sm font-semibold\">Gateway de frete</h3>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n Conectado, ele cota o frete para o CEP do comprador em vez de a loja adivinhar. O preço\n cotado é gravado no servidor e é ele que o pedido cobra — o navegador escolhe entre\n opções, nunca informa um valor. Quais transportadoras aparecem vem da conta do\n gateway, não desta lista.\n </p>\n {!carriersConnected && (\n <p className=\"mt-1 text-[10px] text-muted-foreground\">\n Nenhum conectado — a loja entrega por conta própria, pelo preço base e pelas zonas\n acima. Conectar é opcional e pode ficar para depois.\n </p>\n )}\n </div>\n <div className=\"rounded-lg border bg-card shadow-sm\">\n <ul className=\"divide-y\">\n {carriers.map((connector) => (\n <ConnectorRow key={connector.id} connector={connector} onOpen={openJourney} />\n ))}\n </ul>\n </div>\n </div>\n )}\n\n <HandlingSettings settings={storeSettings} provider={provider} />\n\n <div className=\"flex min-h-5 items-center gap-1.5 px-1 text-xs text-muted-foreground\">\n {error ? (\n <span className=\"flex items-center gap-1.5 text-destructive\">\n <AlertTriangle className=\"h-3.5 w-3.5 shrink-0\" />\n Não foi possível salvar: {error}\n </span>\n ) : saving ? (\n <>\n <Loader2 className=\"h-3.5 w-3.5 shrink-0 animate-spin\" />\n Salvando…\n </>\n ) : (\n 'As alterações são salvas ao sair do campo.'\n )}\n </div>\n\n <ConnectorDetail\n connector={selected}\n open={!!selected}\n onOpenChange={(open) => { if (!open) setSelected(null) }}\n />\n </div>\n )\n}\n","import React from 'react'\nimport { SettingsGroup } from '@fayz-ai/admin'\nimport { Info } from 'lucide-react'\nimport type { StoreSettings } from '@fayz-ai/shop'\nimport type { ShopProviderResolver } from '../data/shared'\nimport { useStoreSettings } from './useStoreSettings'\nimport { SettingsState } from './SettingsState'\nimport { ChoiceCards } from './ChoiceCards'\n\nexport interface FulfillmentSettingsProps {\n provider?: ShopProviderResolver\n}\n\ntype Policy = NonNullable<StoreSettings['autoFulfill']>\n\n/**\n * Three mutually exclusive policies with a paragraph each — a radio, not a\n * dropdown. The difference between them is a sentence long, and a dropdown shows\n * one option at a time: choosing between \"quando o pagamento cair\" and \"sempre\"\n * requires reading both, which means both have to be on screen.\n */\nconst POLICIES: ReadonlyArray<{ value: Policy; label: string; description: string }> = [\n {\n value: 'on_payment',\n label: 'Dar baixa quando o pagamento for confirmado',\n description:\n 'A remessa é criada assim que o pedido é pago — pelo gateway ou por você aqui no admin. É a opção segura: nada sai antes de o dinheiro entrar.',\n },\n {\n value: 'always',\n label: 'Dar baixa em todo pedido, automaticamente',\n description:\n 'A remessa nasce junto com o pedido, pago ou não. Para quem cobra na entrega ou separa antes de receber.',\n },\n {\n value: 'never',\n label: 'Não dar baixa automática',\n description: 'Cada remessa é criada à mão, na tela do pedido. É o padrão.',\n },\n]\n\n/**\n * Fulfillment — se a remessa nasce sozinha.\n *\n * Uma decisão só, e ela é sobre QUANDO um registro de remessa passa a existir —\n * não sobre quem entrega. `public.fulfillments` e `fulfillment_items` já existem\n * desde a 0018, com o `fulfillment_status` do pedido DERIVADO deles por trigger;\n * a política escolhida aqui é lida por um trigger da 0045 que insere a remessa\n * com os itens do pedido, exatamente como a tela do pedido faria à mão. Nada\n * aqui escreve `fulfillment_status`: ele continua derivado, que é o que o impede\n * de divergir da realidade.\n *\n * Pedidos que já existem não são afetados. A política vale para o que vem\n * depois, e isso é dito na tela: um lojista que liga a baixa automática\n * esperando ver os pedidos de ontem despacharem tem uma surpresa pior do que a\n * frase.\n */\nexport function FulfillmentSettings({ provider }: FulfillmentSettingsProps) {\n const settings = useStoreSettings(provider, { autoFulfill: 'never' })\n const { value, set } = settings\n const current: Policy = value.autoFulfill ?? 'never'\n\n return (\n <SettingsState {...settings}>\n <SettingsGroup\n title=\"Baixa automática\"\n description=\"Quando um registro de remessa é criado para um pedido novo.\"\n >\n <ChoiceCards\n label=\"Baixa automática\"\n choices={POLICIES}\n value={current}\n onChange={(autoFulfill) => set({ autoFulfill })}\n />\n </SettingsGroup>\n\n <div className=\"flex items-start gap-2 rounded-lg border bg-muted/30 p-3 text-xs text-muted-foreground\">\n <Info className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n <span>\n A remessa criada aqui nasce <strong className=\"font-medium\">pendente</strong>, com os itens\n do pedido e sem transportadora nem código de rastreio — quem despacha preenche isso na tela\n do pedido. Pedidos que já foram feitos não são afetados.\n </span>\n </div>\n </SettingsState>\n )\n}\n","// Melhor Envio as a unified ConnectorDefinition, surfaced in Loja → settings →\n// Integrações (rendered by the shared ConnectorsHub).\n//\n// The first REQUEST-plane connector: the buyer is on the page waiting for a\n// price, so it declares a latency budget and what to do when the budget is\n// spent. `onFailure: 'degrade'` is the whole point — FAY-1301 says quoting\n// freight never blocks the purchase, and the answer it degrades to is the\n// store's own shipping zones, which is what the store quoted before Melhor\n// Envio existed.\n//\n// It brings no SQL. The connection is a plg_connections row (packages/db 029);\n// the label it buys later is an effect, and effects are ordinary plg_sync_runs\n// rows claimed through plg_claim_effect (030). Quotes are neither.\nimport React, { useEffect, useState } from 'react'\nimport {\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\n\nexport const MELHOR_ENVIO_CONNECTOR_ID = 'melhor-envio'\n\n/**\n * Two and a half seconds, and the number moved because it was MEASURED.\n *\n * It said one second, \"chosen against the funnel, not against the carrier\",\n * with the claim that \"Melhor Envio answers well inside it on a good day\". The\n * first real quote refuted that: the carrier alone takes ~610ms from São Paulo\n * to Rio in the sandbox, before the credential redemption (43ms) and the two\n * database round trips the quote needs. Total ~850ms server-side on a GOOD run,\n * which the browser's own hop pushed past 1000ms — so the budget aborted every\n * real quote and the shopper saw the zone price, forever. A budget that only\n * ever fires is not a safety net, it is the feature being off.\n *\n * The funnel reasoning was still right, which is why this is 2.5s and not 10:\n * past a few seconds \"calculando\" reads as broken, and the zones answer\n * instantly. What changed is the evidence about where the line actually is.\n */\nexport const MELHOR_ENVIO_LATENCY_BUDGET_MS = 2500\n\n/**\n * Where the parcels leave from. The canonical REQUIRED-TO-OPERATE setting:\n * Melhor Envio cannot quote a single price without it, and it is still not what\n * authorizes the connection — that is the OAuth grant, which is asked for on\n * Melhor Envio's own screen and never in this form.\n *\n * It used to be a `ConnectorField`, which meant a merchant had to know which\n * warehouse they ship from before they were allowed to plug the carrier in. Now\n * the connection is made and the store reads \"conectado, falta configurar\"\n * (`plg_connections.status = 'pending'`) until a postcode is chosen — which is\n * true, and is the difference between an integration that is not ready and one\n * that is broken.\n *\n * The `pattern` is what a free-text box never had: eight digits, checked here\n * rather than discovered by the first buyer who gets no price.\n */\n// A agência de postagem NÃO mora aqui: ela é do local de despacho (Entrega ▸\n// Locais), porque uma loja com dois galpões entrega em duas agências e o\n// conector guarda uma conta, não um endereço. O seletor está no cadastro do\n// local, listando o que existe perto DELE.\nexport const MELHOR_ENVIO_SETTINGS: ConnectorSetting[] = [\n {\n key: 'originPostalCode',\n label: 'CEP de origem',\n description: 'De onde os pedidos saem. É o que a transportadora usa para calcular preço e prazo.',\n type: 'text',\n placeholder: '01310-100',\n pattern: '^\\\\d{5}-?\\\\d{3}$',\n patternHint: 'Use 8 dígitos, como 01310-100.',\n requiredToOperate: true,\n },\n]\n\nconst store = createConnectionStore(MELHOR_ENVIO_CONNECTOR_ID, {\n settings: MELHOR_ENVIO_SETTINGS,\n settingsKeys: ['services', 'extraDays'],\n})\n\nfunction MelhorEnvioExtraPanel() {\n const [connected, setConnected] = useState(false)\n const [loaded, setLoaded] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n void store\n .get()\n .then((c) => { if (!cancelled) setConnected(!!c?.active) })\n .catch(() => {})\n .finally(() => { if (!cancelled) setLoaded(true) })\n return () => { cancelled = true }\n }, [])\n\n if (!loaded || !connected) return null\n\n return (\n <div className=\"space-y-2 border-t pt-4 text-xs text-muted-foreground\">\n <p>\n A cotação acontece enquanto o cliente espera, com um limite de 1 segundo. Se a transportadora\n não responder a tempo, o checkout mostra o preço das suas faixas de CEP e a compra continua\n normalmente — o cliente nunca fica sem preço na tela.\n </p>\n <p>\n Não existe histórico de cotações aqui de propósito: cotar não movimenta nada. O que aparece no\n histórico é a compra da etiqueta, feita uma única vez por pedido.\n </p>\n </div>\n )\n}\n\nexport const melhorEnvioConnectorDef: ConnectorDefinition = {\n id: MELHOR_ENVIO_CONNECTOR_ID,\n hostPluginId: 'shop',\n name: 'Melhor Envio',\n description:\n 'Frete real no checkout: Correios e Jadlog numa integração só, com prazo e preço calculados pelo CEP do cliente.',\n icon: 'Truck',\n category: 'logistics',\n authKind: 'oauth',\n // Two planes, and they are different jobs: the quote is in the buyer's request\n // path, the label purchase and its tracking are an ordinary outbound sync.\n planes: ['request', 'sync'],\n direction: 'outbound',\n docsUrl: 'https://docs.melhorenvio.com.br',\n // A quote WRITES NOTHING — `createShippingQuoter` says so in as many words,\n // and 029_connections.sql is why: one row per quote would make plg_sync_runs\n // the largest table in the pool within weeks. So `order` is read-only here,\n // and the only write is the label, which is an effect with an idempotency key\n // (`createLabelBuyer`) because a label bought twice is money spent twice.\n permissions: [\n {\n kind: 'data',\n resource: 'order',\n actions: ['read'],\n reason:\n 'Ler o CEP de destino e o que está no carrinho para pedir o preço e o prazo à transportadora. A cotação não é guardada.',\n },\n {\n kind: 'data',\n resource: 'shipment',\n actions: ['write'],\n reason: 'Registrar a etiqueta comprada e o código de rastreio no pedido.',\n },\n ],\n latencyBudgetMs: MELHOR_ENVIO_LATENCY_BUDGET_MS,\n // The sale is never blocked by a carrier's API (FAY-1301).\n onFailure: 'degrade',\n /**\n * There is no form. Melhor Envio is OAuth, and the store authorizes on Melhor\n * Envio's own screen exactly as it does with Google Calendar.\n *\n * It got here in two wrong steps. First `fields: []` on the theory that a\n * platform-level token existed — none does, so Conectar wrote `active = true`\n * against an account nobody had linked. Then a pasted `token` password field,\n * as a stopgap to stop that lie. OAuth replaces both: the store's own account\n * is linked, per-merchant by nature (the labels are bought with THIS store's\n * balance), and no credential ever passes through this file.\n *\n * The origin postcode stays where it is — a `ConnectorSetting`, on the\n * Configurações tab. It is what the connection needs to WORK, not what\n * authorizes it, and it must never come back to the connect step.\n */\n // `melhorenvio` without the hyphen, and that is not a typo: the provider key\n // is the path Melhor Envio has registered on our app (`/redirect/melhorenvio`),\n // and changing it would mean editing the registration at their end. The\n // connector's own id keeps the hyphen.\n startOAuth: fayzConnectorOAuth(MELHOR_ENVIO_CONNECTOR_ID, { provider: 'melhorenvio' }),\n settings: MELHOR_ENVIO_SETTINGS,\n // The answer to \"o Melhor Envio é acionado em quais momentos?\". Both calls are\n // real, so both are stated plainly.\n invokedAt: [\n {\n key: 'shop.checkout.shipping_quote',\n label: 'O cliente informa o CEP e pede as opções de frete',\n touches: ['order'],\n },\n {\n key: 'shop.order.label_purchase',\n label: 'O pedido é confirmado e a etiqueta é comprada, uma única vez',\n plane: 'sync',\n trigger: 'on-write',\n touches: ['order', 'shipment'],\n },\n ],\n // Read from the row the list already batched — one request for N connectors.\n ...connectionStatus(\n MELHOR_ENVIO_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: (connection?.settings?.originPostalCode as string) ?? undefined,\n plane: 'request',\n ...settingsStatus(MELHOR_ENVIO_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n // This used to say the platform's redirect route writes `active = true`. It\n // does not, and says so itself: \"It does not touch `plg_connections` in the\n // tenant's pool. Per FAY-1388 ... the app writes its own.\" Bling shipped with\n // the same belief and looped — authorize, come back, still \"not connected\",\n // click again, forever.\n //\n // So the two halves are written by their owners: the platform files the\n // credential, and this runs on the way back to say the account is linked. No\n // values — the token is not ours to see, and nothing is configured yet.\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n ExtraPanel: MelhorEnvioExtraPanel,\n}\n","// AppMax as a unified ConnectorDefinition, surfaced in Loja → settings →\n// Integrações (rendered by the shared ConnectorsHub).\n//\n// The mirror image of Melhor Envio, and the reason `onFailure` is a field\n// instead of a habit: same plane, same budget mechanism, opposite verdict. A\n// carrier that does not answer must not stop a sale; a gateway that does not\n// answer must stop it, because an order that reads as confirmed without a\n// payment is worse than a refused checkout.\n//\n// It lives in plugin-shop rather than plugin-payments because plugin-payments\n// is provider-only — it ships no manifest and no admin surface — and because\n// the store's stack (who charges, who ships) is configured in the store's own\n// settings. commerce-stack.md §0: the admin is the control panel of the stack.\n//\n// No SQL. The connection is a plg_connections row (packages/db 029); a capture\n// is an effect claimed through plg_claim_effect (030). Opening a session is\n// neither — it is a quote by another name and files nothing.\nimport React, { useEffect, useState } from 'react'\nimport {\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\n\nexport const APPMAX_CONNECTOR_ID = 'appmax'\n\n/**\n * Six seconds. Longer than the freight budget on purpose: this one is spent\n * after the buyer pressed \"pagar\", where waiting is expected and a premature\n * refusal costs a sale that was about to happen. It is still a budget — beyond\n * it the buyer is told the payment did not go through, which is true, instead of\n * watching a spinner that resolves into a charge they already gave up on.\n */\nexport const APPMAX_LATENCY_BUDGET_MS = 6000\n\n/**\n * Which methods the storefront may offer — commercial policy, not a credential\n * and not an authorization.\n *\n * It used to be a `ConnectorField` labelled \"Formas de pagamento (pix, boleto,\n * credit_card)\": a free-text box on the connect screen, which asked a merchant\n * to decide what they accept before they were allowed to plug the gateway in,\n * and then made \"passei a aceitar boleto\" look like re-authorizing the account.\n * It is a multi-select over the three methods AppMax actually has, so the\n * misspelling that silently offered nothing is not expressible.\n *\n * Required to OPERATE and not to connect: a gateway with no method selected\n * cannot open a session, so the connection is made and reported as \"conectado,\n * falta configurar\" (`plg_connections.status = 'pending'`).\n */\nexport const APPMAX_SETTINGS: ConnectorSetting[] = [\n {\n key: 'methods',\n label: 'Formas de pagamento',\n description: 'O que o cliente pode escolher no checkout.',\n type: 'multi-select',\n options: [\n { value: 'pix', label: 'Pix' },\n { value: 'boleto', label: 'Boleto' },\n { value: 'credit_card', label: 'Cartão de crédito' },\n ],\n requiredToOperate: true,\n },\n]\n\nconst store = createConnectionStore(APPMAX_CONNECTOR_ID, {\n settings: APPMAX_SETTINGS,\n settingsKeys: ['maxInstallments', 'environment'],\n})\n\nconst METHOD_LABELS: Record<string, string> = { pix: 'Pix', boleto: 'Boleto', credit_card: 'Cartão' }\n\n/** The row's one-line summary. Tolerates the pre-split string a live row may still hold. */\nfunction methodsDetail(value: unknown): string | undefined {\n const list = Array.isArray(value) ? value : typeof value === 'string' ? value.split(',') : []\n const labels = list.map((v) => METHOD_LABELS[String(v).trim()] ?? String(v).trim()).filter(Boolean)\n return labels.length > 0 ? labels.join(', ') : undefined\n}\n\nfunction AppmaxExtraPanel() {\n const [connected, setConnected] = useState(false)\n const [loaded, setLoaded] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n void store\n .get()\n .then((c) => { if (!cancelled) setConnected(!!c?.active) })\n .catch(() => {})\n .finally(() => { if (!cancelled) setLoaded(true) })\n return () => { cancelled = true }\n }, [])\n\n if (!loaded || !connected) return null\n\n return (\n <div className=\"space-y-2 border-t pt-4 text-xs text-muted-foreground\">\n <p>\n Pix e boleto acontecem dentro da sua loja: o cliente vê o QR Code ou o código de barras sem sair\n da página. Cartão vai para a página segura da AppMax e volta com o resultado — assim nenhum\n número de cartão passa pelo seu site.\n </p>\n <p>\n O valor cobrado é sempre recalculado aqui no servidor a partir do pedido. Preço alterado no\n navegador não é aceito, e clicar duas vezes em \"pagar\" gera uma cobrança só.\n </p>\n </div>\n )\n}\n\nexport const appmaxConnectorDef: ConnectorDefinition = {\n id: APPMAX_CONNECTOR_ID,\n hostPluginId: 'shop',\n name: 'AppMax',\n description: 'Checkout de verdade: Pix, boleto e cartão parcelado, com o valor recalculado no servidor.',\n icon: 'CreditCard',\n category: 'payments',\n authKind: 'oauth',\n // The session is opened in the buyer's request path; the capture, the refund\n // and the webhook that reports them are outbound sync work.\n planes: ['request', 'sync'],\n direction: 'outbound',\n docsUrl: 'https://docs.appmax.com.br',\n // Grounded in the request plane's own code, not in an AppMax data plane —\n // there isn't one in this repo yet (see the header). `createCheckoutStarter`\n // recomputes the order total server-side before opening a session, which is a\n // read of the order and never a write of it; `createPaymentCapturer` files the\n // capture through the effect ledger, which is the write.\n permissions: [\n {\n kind: 'data',\n resource: 'order',\n actions: ['read'],\n reason:\n 'Ler o pedido para recalcular o valor no servidor antes de abrir a cobrança — o total nunca vem do navegador do cliente.',\n sensitive: true,\n },\n {\n kind: 'data',\n resource: 'payment',\n actions: ['write'],\n reason: 'Registrar aqui a cobrança aberta e a confirmação do pagamento. Dados do cartão não passam por este app.',\n sensitive: true,\n },\n ],\n latencyBudgetMs: APPMAX_LATENCY_BUDGET_MS,\n // The order does not confirm. FAY-1300.\n onFailure: 'block',\n /**\n * O lojista NÃO digita chave nenhuma — e essa é a correção.\n *\n * A tela pedia `client_id` e `client_secret` da AppMax, o que estava errado em\n * dois níveis. Primeiro porque é o par do APLICATIVO (nosso, um só para toda a\n * frota) que abre a instalação, e ele não pode passar pelo navegador de\n * lojista nenhum. Segundo porque o par da LOJA nem é mostrado ao lojista para\n * copiar: a AppMax o emite no fim da instalação e o entrega ao aplicativo.\n *\n * Foi exatamente por isso que o campo apareceu preenchido com um e-mail: não\n * havia o que colar ali, então colaram o que tinham.\n *\n * O caminho certo é o consentimento abaixo: o lojista autoriza a conta dele no\n * painel da AppMax e o par sai de lá para o cofre da plataforma sem nunca\n * passar por este pacote.\n */\n fields: [],\n /**\n * Um botão só: \"Conectar\" É o que abre o consentimento.\n *\n * Antes eram dois — um \"Abrir o painel da AppMax\" e um \"Conectar\" que apenas\n * marcava a linha. O segundo mentia: dizia conectado sem credencial atrás.\n *\n * E é consentimento de verdade, apesar do nome estranho na doc deles. O\n * círculo fecha: chamamos `/app/authorize` com o par do APLICATIVO e recebemos\n * um token; o lojista autoriza no painel da AppMax; a AppMax **devolve o\n * navegador dele** para o nosso callback com esse token na URL; e é o nosso\n * servidor que troca o token pelo par da LOJA em `/app/client/generate`.\n *\n * Ida, volta e troca no servidor — a mesma forma do Bling e do Melhor Envio.\n * Por isso passa pelo mesmo `fayzConnectorOAuth` e não por um link solto: o\n * par do aplicativo não pode sair do servidor, e o token que volta não vale\n * nada no navegador.\n */\n startOAuth: fayzConnectorOAuth(APPMAX_CONNECTOR_ID),\n settings: APPMAX_SETTINGS,\n // When the gateway is actually reached. Both are real calls, so both may be\n // stated plainly — see ConnectorPermissions for the events that may not.\n invokedAt: [\n {\n key: 'shop.checkout.session_open',\n label: 'O cliente finaliza a compra e a cobrança é aberta na AppMax (Pix, boleto ou cartão)',\n touches: ['order', 'payment'],\n },\n {\n key: 'shop.payment.capture',\n label: 'A AppMax avisa que o pagamento caiu e o pedido é liberado',\n plane: 'sync',\n trigger: 'webhook',\n touches: ['payment'],\n },\n ],\n // Read from the row the list already batched, so a screen with N connectors\n // costs one plg_connections request rather than N.\n ...connectionStatus(\n APPMAX_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: methodsDetail(connection?.settings?.methods),\n plane: 'request',\n ...settingsStatus(APPMAX_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n // Reached only AFTER the credential sink accepted the token — that ordering is\n // what makes `active = true` mean \"a credential was placed for this store\"\n // rather than \"somebody pressed a button\". The token itself never arrives\n // here: the hub splits it out before calling this.\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n ExtraPanel: AppmaxExtraPanel,\n}\n","// AbacatePay as a unified ConnectorDefinition, surfaced in Loja → settings →\n// Integrações (rendered by the shared ConnectorsHub).\n//\n// The second gateway, and the one that shows the shelf is not a special case:\n// it declares the same category, the same planes and the same `onFailure` as\n// AppMax, and differs only where the provider differs — how it authorizes.\n//\n// There is no consent screen and no app to install. AbacatePay issues API keys\n// in the merchant's own dashboard (Integrar → API Keys) and every call is\n// `Authorization: Bearer <key>`, so the connect step is a form with one box and\n// the key leaves for the platform vault instead of reaching this file.\n//\n// The same host serves dev and production — the KEY decides which. That is a\n// merchant-facing fact, not a base-URL switch, so it is said on the panel\n// rather than expressed as an `environment` setting nothing would honour.\n//\n// No SQL. The connection is a plg_connections row (packages/db 029); a capture\n// is an effect claimed through plg_claim_effect (030).\nimport React, { useEffect, useState } from 'react'\nimport {\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorField,\n type ConnectorSetting,\n} from '@fayz-ai/core'\n\nexport const ABACATEPAY_CONNECTOR_ID = 'abacatepay'\n\n/**\n * Six seconds, the same budget AppMax carries and for the same reason: it is\n * spent after the buyer pressed \"pagar\", where waiting is expected and a\n * premature refusal costs a sale that was about to happen.\n *\n * Measured, not guessed — `POST /v2/transparents/create` answered in 640–830ms\n * from São Paulo on the dev key, before credential redemption and the two\n * database round trips the checkout needs. The budget sits far above that so it\n * fires on a gateway that is actually down, never on a slow-but-alive one.\n */\nexport const ABACATEPAY_LATENCY_BUDGET_MS = 6000\n\n/**\n * The one thing that authorizes the connection.\n *\n * `type: 'password'` is what routes it to the platform's credential sink\n * (packages/admin/.../connect/credentials.ts) instead of to `saveConnection`;\n * `secret: true` states the same thing on the field itself, so the intent\n * survives a future change of input type. Either flag alone is enough — both\n * are here because a payment credential is the wrong place to be terse.\n *\n * The key is per-STORE and carries its own permissions and its own environment,\n * so nothing about it can be inferred, defaulted or shared across the fleet.\n */\nexport const ABACATEPAY_FIELDS: ConnectorField[] = [\n {\n key: 'apiKey',\n label: 'Chave de API',\n type: 'password',\n secret: true,\n placeholder: 'AbacatePay → Integrar → API Keys',\n },\n]\n\n/**\n * Which methods the storefront may offer — commercial policy, not a credential.\n *\n * The three the gateway really has, in AbacatePay's own vocabulary (uppercase),\n * because these values travel to it as `method` / `methods`: a translation\n * table between what the merchant picked and what the wire accepts is one more\n * place for a method to silently stop being offered.\n *\n * Required to OPERATE and not to connect: a gateway with no method selected\n * cannot open a charge, so the connection is made and reported as \"conectado,\n * falta configurar\" (`plg_connections.status = 'pending'`).\n */\nexport const ABACATEPAY_SETTINGS: ConnectorSetting[] = [\n {\n key: 'methods',\n label: 'Formas de pagamento',\n description: 'O que o cliente pode escolher no checkout.',\n type: 'multi-select',\n options: [\n { value: 'PIX', label: 'Pix' },\n { value: 'BOLETO', label: 'Boleto' },\n { value: 'CARD', label: 'Cartão de crédito' },\n ],\n requiredToOperate: true,\n },\n]\n\nconst store = createConnectionStore(ABACATEPAY_CONNECTOR_ID, {\n fields: ABACATEPAY_FIELDS,\n settings: ABACATEPAY_SETTINGS,\n})\n\nconst METHOD_LABELS: Record<string, string> = { PIX: 'Pix', BOLETO: 'Boleto', CARD: 'Cartão' }\n\n/** The row's one-line summary. Tolerates the pre-split string a live row may hold. */\nfunction methodsDetail(value: unknown): string | undefined {\n const list = Array.isArray(value) ? value : typeof value === 'string' ? value.split(',') : []\n const labels = list.map((v) => METHOD_LABELS[String(v).trim()] ?? String(v).trim()).filter(Boolean)\n return labels.length > 0 ? labels.join(', ') : undefined\n}\n\nfunction AbacatePayExtraPanel() {\n const [connected, setConnected] = useState(false)\n const [loaded, setLoaded] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n void store\n .get()\n .then((c) => { if (!cancelled) setConnected(!!c?.active) })\n .catch(() => {})\n .finally(() => { if (!cancelled) setLoaded(true) })\n return () => { cancelled = true }\n }, [])\n\n if (!loaded || !connected) return null\n\n return (\n <div className=\"space-y-2 border-t pt-4 text-xs text-muted-foreground\">\n <p>\n Pix e boleto acontecem dentro da sua loja: o cliente vê o QR Code ou a linha digitável sem sair\n da página. Cartão vai para a página segura da AbacatePay e volta com o resultado — assim nenhum\n número de cartão passa pelo seu site.\n </p>\n <p>\n Quem decide se a cobrança é de verdade é a chave. Uma chave de teste simula o pagamento e não\n movimenta dinheiro; a de produção cobra o cliente. É a mesma tela para as duas, então confira no\n painel da AbacatePay qual chave você colou aqui.\n </p>\n <p>\n O valor cobrado é sempre recalculado aqui no servidor a partir do pedido. Preço alterado no\n navegador não é aceito, e clicar duas vezes em \"pagar\" gera uma cobrança só.\n </p>\n </div>\n )\n}\n\nexport const abacatePayConnectorDef: ConnectorDefinition = {\n id: ABACATEPAY_CONNECTOR_ID,\n hostPluginId: 'shop',\n name: 'AbacatePay',\n description: 'Pix, boleto e cartão com uma chave só, sem contrato de adquirente e sem tirar o cliente da loja.',\n icon: 'CreditCard',\n category: 'payments',\n // One pasted key, no consent screen: AbacatePay has no OAuth and no app to\n // install, so inventing a `startOAuth` here would ship a button that could\n // never connect anything.\n authKind: 'api-key',\n // The charge is opened in the buyer's request path; the confirmation webhook\n // and the refund are outbound sync work.\n planes: ['request', 'sync'],\n direction: 'outbound',\n docsUrl: 'https://docs.abacatepay.com',\n // Where the key comes from. The connector declares the address because it is\n // a fact about THIS provider, and the doc names the path inside it\n // (Integrar → API Keys), which the field's placeholder repeats.\n providerInstall: { url: 'https://app.abacatepay.com' },\n // Grounded in what the request plane does, and padded with nothing: the total\n // is recomputed server-side from the order before the charge is opened, which\n // is a read of the order and never a write of it; the charge and its\n // confirmation are the write.\n permissions: [\n {\n kind: 'data',\n resource: 'order',\n actions: ['read'],\n reason:\n 'Ler o pedido para recalcular o valor no servidor antes de abrir a cobrança — o total nunca vem do navegador do cliente.',\n sensitive: true,\n },\n {\n kind: 'data',\n resource: 'payment',\n actions: ['write'],\n reason: 'Registrar aqui a cobrança aberta e a confirmação do pagamento. Dados do cartão não passam por este app.',\n sensitive: true,\n },\n ],\n latencyBudgetMs: ABACATEPAY_LATENCY_BUDGET_MS,\n // A gateway that does not answer must stop the sale: an order that reads as\n // confirmed without a payment is worse than a refused checkout. The opposite\n // verdict from the carrier next door, on purpose (FAY-1300/FAY-1301).\n onFailure: 'block',\n fields: ABACATEPAY_FIELDS,\n settings: ABACATEPAY_SETTINGS,\n // The two calls that exist. A refund endpoint exists too, but nothing in this\n // repo reaches it yet, and a declared moment that never arrives is a promise\n // the code cannot keep.\n invokedAt: [\n {\n key: 'shop.checkout.session_open',\n label: 'O cliente finaliza a compra e a cobrança é aberta na AbacatePay (Pix, boleto ou cartão)',\n touches: ['order', 'payment'],\n },\n {\n key: 'shop.payment.capture',\n label: 'A AbacatePay avisa que o pagamento caiu e o pedido é liberado',\n plane: 'sync',\n trigger: 'webhook',\n touches: ['payment'],\n },\n ],\n // Read from the row the list already batched, so a screen with N connectors\n // costs one plg_connections request rather than N.\n ...connectionStatus(\n ABACATEPAY_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: methodsDetail(connection?.settings?.methods),\n plane: 'request',\n ...settingsStatus(ABACATEPAY_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n // Reached only AFTER the credential sink accepted the key — that ordering is\n // what makes `active = true` mean \"a credential was placed for this store\"\n // rather than \"somebody pressed a button\". The key itself never arrives here:\n // the hub split it out before calling this, so `values` is empty.\n //\n // No `testConnection` either: the probe is handed the non-secret half, which\n // for this connector is nothing, and there is no useful call to make without\n // the key. Testing it belongs to the edge function that holds it.\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n ExtraPanel: AbacatePayExtraPanel,\n}\n","import React, { useEffect, useState } from 'react'\nimport {\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\n\nexport const STRIPE_CONNECT_CONNECTOR_ID = 'stripe-connect'\n\n/**\n * Six seconds, the same budget the other two gateways carry: it is spent after\n * the buyer pressed \"pagar\", where waiting is expected and a premature refusal\n * costs a sale that was about to happen.\n */\nexport const STRIPE_CONNECT_LATENCY_BUDGET_MS = 6000\n\n/**\n * Stripe's own vocabulary (lowercase), because these values travel to it as\n * `payment_method_types` — a translation table between what the merchant picked\n * and what the wire accepts is one more place for a method to silently stop\n * being offered.\n */\nexport const STRIPE_CONNECT_SETTINGS: ConnectorSetting[] = [\n {\n key: 'paymentMethods',\n label: 'Formas de pagamento',\n description: 'O que o cliente pode escolher no checkout.',\n type: 'multi-select',\n options: [\n { value: 'card', label: 'Cartão de crédito' },\n { value: 'pix', label: 'Pix' },\n { value: 'boleto', label: 'Boleto' },\n ],\n requiredToOperate: true,\n // Card is the one method every Stripe account can charge the moment it is\n // active; Pix and boleto in BR each need their own approval, so offering\n // them by default would promise a checkout option that may not settle.\n defaultValue: ['card'],\n },\n]\n\nconst store = createConnectionStore(STRIPE_CONNECT_CONNECTOR_ID, {\n settings: STRIPE_CONNECT_SETTINGS,\n})\n\nconst METHOD_LABELS: Record<string, string> = { card: 'Cartão', pix: 'Pix', boleto: 'Boleto' }\n\nfunction methodsDetail(value: unknown): string | undefined {\n const list = Array.isArray(value) ? value : []\n const labels = list.map((v) => METHOD_LABELS[String(v)] ?? String(v)).filter(Boolean)\n return labels.length > 0 ? labels.join(', ') : undefined\n}\n\nfunction StripeConnectExtraPanel() {\n const [connected, setConnected] = useState(false)\n const [loaded, setLoaded] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n void store\n .get()\n .then((c) => { if (!cancelled) setConnected(!!c?.active) })\n .catch(() => {})\n .finally(() => { if (!cancelled) setLoaded(true) })\n return () => { cancelled = true }\n }, [])\n\n if (!loaded) return null\n\n return (\n <div className=\"space-y-2 border-t pt-4 text-xs text-muted-foreground\">\n {connected ? (\n <>\n <p>\n A Stripe pede documentos e dados bancários antes de liberar cobranças. Se você fechou o\n cadastro no meio, a conexão fica de pé mas a loja ainda não cobra — clique em conectar de\n novo para voltar de onde parou, na mesma conta.\n </p>\n <p>\n O dinheiro cai na sua conta Stripe, não na Fayz. O que a Fayz retém é a taxa da\n plataforma, descontada na própria cobrança.\n </p>\n </>\n ) : (\n <p>\n Conectar abre o cadastro da Stripe numa aba. Você pode entrar com uma conta Stripe que já\n tenha ou criar uma na hora — em qualquer caso é sua, e é ela que recebe.\n </p>\n )}\n </div>\n )\n}\n\nexport const stripeConnectConnectorDef: ConnectorDefinition = {\n id: STRIPE_CONNECT_CONNECTOR_ID,\n // The catalogue has one Stripe row and this is not the Financeiro's `stripe`\n // connector, which is the tenant invoicing on their own account. Here Fayz is\n // the platform and the charge is opened on a connected account.\n catalogSlug: 'stripe',\n hostPluginId: 'shop',\n name: 'Stripe',\n description: 'Cartão, Pix e boleto pela Stripe. A loja recebe na conta dela e a Fayz retém a taxa na própria cobrança.',\n icon: 'CreditCard',\n category: 'payments',\n // Hosted onboarding rather than a pasted key: the merchant authorizes at\n // Stripe and nothing secret ever reaches this file.\n authKind: 'oauth',\n planes: ['request', 'sync'],\n direction: 'outbound',\n docsUrl: 'https://docs.stripe.com/connect',\n permissions: [\n {\n kind: 'data',\n resource: 'order',\n actions: ['read'],\n reason:\n 'Ler o pedido para recalcular o valor no servidor antes de abrir a cobrança — o total nunca vem do navegador do cliente.',\n sensitive: true,\n },\n {\n kind: 'data',\n resource: 'payment',\n actions: ['write'],\n reason: 'Registrar aqui a cobrança aberta e a confirmação do pagamento. Dados do cartão não passam por este app.',\n sensitive: true,\n },\n ],\n latencyBudgetMs: STRIPE_CONNECT_LATENCY_BUDGET_MS,\n // Same verdict as the other two gateways: an order that reads as confirmed\n // without a payment is worse than a refused checkout.\n onFailure: 'block',\n // OAuth-shaped: consent is the whole form, and no value is collected here.\n fields: [],\n settings: STRIPE_CONNECT_SETTINGS,\n invokedAt: [\n {\n key: 'shop.checkout.session_open',\n label: 'O cliente finaliza a compra e a cobrança é aberta na conta Stripe da loja',\n touches: ['order', 'payment'],\n },\n {\n key: 'shop.payment.capture',\n label: 'A Stripe avisa que o pagamento caiu e o pedido é liberado',\n plane: 'sync',\n trigger: 'webhook',\n touches: ['payment'],\n },\n ],\n ...connectionStatus(\n STRIPE_CONNECT_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: methodsDetail(connection?.settings?.paymentMethods),\n plane: 'request',\n ...settingsStatus(STRIPE_CONNECT_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n startOAuth: fayzConnectorOAuth(STRIPE_CONNECT_CONNECTOR_ID),\n // Reached with no values when the browser returns marked `connected`. It is\n // required even though nothing is collected here: the platform callback stores\n // the credential but deliberately never touches the pool, so this is the only\n // thing that writes the tenant's `plg_connections` row.\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: async () => { await store.disconnect() },\n ExtraPanel: StripeConnectExtraPanel,\n}\n","// Vindi as a unified ConnectorDefinition, surfaced in Loja → settings →\n// Integrações (rendered by the shared ConnectorsHub).\n//\n// The fourth gateway on the shelf, and the first whose provider name means two\n// different products. This connector is **Vindi Pagamentos** — the gateway, ex-\n// Yapay, `api.intermediador.yapay.com.br`. It is NOT Vindi Recorrência\n// (`app.vindi.com.br/api/v1`), which is subscriptions and invoices and\n// authenticates with HTTP Basic. Nothing here reaches that one.\n//\n// There is no consent screen, and that is a fact about Vindi rather than a\n// shortcut. Their `consumer_key` → CODE → `access_token` chain looks like OAuth\n// from a distance and is not: the authorize URL accepts only `consumer_key` —\n// no `redirect_uri`, no `state`, no scopes — and the instruction is literally to\n// open it in a browser and copy the CODE out of the address bar. That is the\n// account owner fetching their own credential, not a merchant authorizing a\n// platform, and our broker has nothing to sign or register against it. The path\n// that WOULD work is Vindi's Partner Accounts API, which provisions the\n// merchant's subaccount and hands the key straight to us — it needs a commercial\n// relationship with Vindi, and it is phase 2 (FAY-1416).\n//\n// Two hosts, unlike AbacatePay where one host serves both worlds and the key\n// decides. So the environment is a stored decision rather than something the\n// credential implies.\n//\n// No SQL. The connection is a plg_connections row (packages/db 029); a capture\n// is an effect claimed through plg_claim_effect (030).\nimport React, { useEffect, useState } from 'react'\nimport {\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorField,\n type ConnectorSetting,\n} from '@fayz-ai/core'\n\nexport const VINDI_CONNECTOR_ID = 'vindi'\n\n/**\n * Six seconds, the same budget the other three gateways carry: it is spent after\n * the buyer pressed \"pagar\", where waiting is expected and a premature refusal\n * costs a sale that was about to happen.\n *\n * Not measured against Vindi yet — no account exists to measure with. It is\n * copied from the two gateways that WERE measured (AbacatePay answered 640–830ms\n * from São Paulo) on the reading that a Brazilian gateway called from a Brazilian\n * pool sits in the same band. If a real sandbox says otherwise, this number moves\n * and this paragraph goes with it.\n */\nexport const VINDI_LATENCY_BUDGET_MS = 6000\n\n/**\n * The one thing that authorizes the connection.\n *\n * `type: 'password'` is what routes it to the platform's credential sink\n * (packages/admin/.../connect/credentials.ts) instead of to `saveConnection`;\n * `secret: true` states the same thing on the field itself, so the intent\n * survives a future change of input type.\n *\n * ── why there is no second field, and what it costs ─────────────────────────\n *\n * `token_account` opens a transaction and reads it back, which is the buyer's\n * whole path. It cannot CANCEL one: `PATCH /transactions/cancel` takes an\n * `access_token` and nothing else.\n *\n * Getting an access_token is not a matter of asking for one more secret. Vindi's\n * chain is consumer_key → **CODE** → access_token, the CODE is copied out of a\n * browser's address bar by the account owner \"uma vez por ambiente\", and the\n * resulting token lives 24 hours and has to be renewed daily against a refresh\n * token that would have to be written back somewhere. The platform refreshes\n * credentials for `oauth` connectors registered in its broker, and Vindi cannot\n * be one (see the file header). So the machinery does not exist, and asking a\n * merchant for a consumer pair we cannot turn into a token would be asking for a\n * secret in exchange for nothing.\n *\n * **The consequence, stated rather than hidden:** when a payment lands and the\n * order cannot be written, this connector does NOT give the money back by itself\n * — unlike the AbacatePay path, where *dinheiro recebido sem pedido tem um final\n * correto só*. `vindi-checkout-settle` marks the session failed and reports the\n * transaction id loudly; the merchant refunds in Vindi's own panel. Automatic\n * reversal is phase 2, and it arrives with the token lifecycle or not at all.\n */\nexport const VINDI_FIELDS: ConnectorField[] = [\n {\n key: 'tokenAccount',\n label: 'Token da conta',\n type: 'password',\n secret: true,\n placeholder: 'Vindi Pagamentos → Minha Conta → Token',\n },\n]\n\n/**\n * Which world the credential is valid against.\n *\n * Deliberately WITHOUT a `defaultValue`. Every other setting on this shelf can\n * afford a sensible default; this one decides whether a charge is real money or a\n * simulation, and a default here is a number nobody chose making that call. Until\n * the merchant answers, the connection reads \"conectado, falta configurar\" — which\n * is true, and is a state the column already has.\n *\n * A `select` and not a toggle: \"produção\" and \"não-sandbox\" are not the same\n * sentence to read at speed.\n */\nexport const VINDI_ENVIRONMENT_SETTING: ConnectorSetting = {\n key: 'environment',\n label: 'Ambiente',\n description: 'Sandbox simula o pagamento e não movimenta dinheiro. Produção cobra o cliente de verdade.',\n type: 'select',\n options: [\n { value: 'sandbox', label: 'Sandbox (teste)' },\n { value: 'production', label: 'Produção' },\n ],\n requiredToOperate: true,\n}\n\n/**\n * Which methods the storefront may offer — commercial policy, not a credential.\n *\n * The values are Vindi's own `payment_method_id`, as numbers-in-strings, because\n * that is what travels to it on the wire. A translation table between what the\n * merchant picked and what the API accepts is one more place for a method to\n * silently stop being offered.\n *\n * Credit card (`3`) is absent on purpose. Vindi's transparent card flow takes\n * `card_number` in the request body, which would put a PAN inside our edge\n * function — the same rule that already kept card off the AbacatePay path. Card\n * arrives through Vindi's hosted `url_payment` page, in phase 2, and offering it\n * here today would promise a checkout option nothing can open.\n */\nexport const VINDI_SETTINGS: ConnectorSetting[] = [\n VINDI_ENVIRONMENT_SETTING,\n {\n key: 'methods',\n label: 'Formas de pagamento',\n description: 'O que o cliente pode escolher no checkout.',\n type: 'multi-select',\n options: [\n { value: '27', label: 'Pix' },\n { value: '28', label: 'Bolepix (boleto com QR)' },\n { value: '6', label: 'Boleto' },\n ],\n requiredToOperate: true,\n },\n]\n\nconst store = createConnectionStore(VINDI_CONNECTOR_ID, {\n fields: VINDI_FIELDS,\n settings: VINDI_SETTINGS,\n})\n\nconst METHOD_LABELS: Record<string, string> = { '27': 'Pix', '28': 'Bolepix', '6': 'Boleto' }\nconst ENVIRONMENT_LABELS: Record<string, string> = { sandbox: 'Sandbox', production: 'Produção' }\n\n/**\n * The row's one-line summary — the environment first, because it is the one\n * mistake a merchant needs to catch from across the screen.\n */\nfunction connectionDetail(settings: Record<string, unknown> | undefined): string | undefined {\n const environment = ENVIRONMENT_LABELS[String(settings?.environment ?? '')]\n const raw = settings?.methods\n const list = Array.isArray(raw) ? raw : typeof raw === 'string' ? raw.split(',') : []\n const methods = list.map((v) => METHOD_LABELS[String(v).trim()] ?? String(v).trim()).filter(Boolean)\n\n const parts = [environment, methods.length > 0 ? methods.join(', ') : null].filter(Boolean)\n return parts.length > 0 ? parts.join(' · ') : undefined\n}\n\nfunction VindiExtraPanel() {\n const [connected, setConnected] = useState(false)\n const [loaded, setLoaded] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n void store\n .get()\n .then((c) => { if (!cancelled) setConnected(!!c?.active) })\n .catch(() => {})\n .finally(() => { if (!cancelled) setLoaded(true) })\n return () => { cancelled = true }\n }, [])\n\n if (!loaded) return null\n\n return (\n <div className=\"space-y-2 border-t pt-4 text-xs text-muted-foreground\">\n {connected ? (\n <>\n <p>\n Pix e boleto acontecem dentro da sua loja: o cliente vê o QR Code ou a linha digitável sem\n sair da página. Cartão ainda não — ele vai chegar pela página segura da Vindi, para que\n nenhum número de cartão passe pelo seu site.\n </p>\n <p>\n Sandbox e produção são contas diferentes, com tokens diferentes. Se você trocar o ambiente\n aqui, troque também as credenciais — as de teste não cobram em produção e as de produção\n não funcionam no sandbox.\n </p>\n <p>\n O valor cobrado é sempre recalculado aqui no servidor a partir do pedido. Preço alterado\n no navegador não é aceito, e clicar duas vezes em \"pagar\" gera uma cobrança só.\n </p>\n </>\n ) : (\n <p>\n O token da conta você pega no painel da Vindi Pagamentos, em Minha Conta. Confira se ele é o\n do mesmo ambiente que você vai escolher aqui — o token de sandbox não cobra em produção.\n </p>\n )}\n </div>\n )\n}\n\nexport const vindiConnectorDef: ConnectorDefinition = {\n id: VINDI_CONNECTOR_ID,\n hostPluginId: 'shop',\n name: 'Vindi',\n description: 'Pix e boleto pela Vindi. A loja recebe na conta dela, com o cliente pagando sem sair da página.',\n icon: 'CreditCard',\n // Declared rather than borrowed from the catalogue, because the catalogue row\n // is a change in another repo that has to be seeded before it exists anywhere:\n // until then `emit-connector-map` warns that `vindi` \"resolves to a slug the\n // platform catalogue does not carry\", and the shelf would render a grey plug.\n // The absolute URL on the assets bucket answers the same from any origin,\n // which a path would not — a tenant app is served from its own domain.\n logoUrl: 'https://assets.fayz.ai/connectors/vindi.png',\n category: 'payments',\n // Pasted keys, no consent screen: Vindi has no merchant-connect OAuth, so a\n // `startOAuth` here would ship a button that could never connect anything. See\n // the file header for why the flow that looks like OAuth is not one.\n authKind: 'api-key',\n // The charge is opened in the buyer's request path; the notification and the\n // refund are outbound sync work.\n planes: ['request', 'sync'],\n direction: 'outbound',\n docsUrl: 'https://developers.vindi.com.br/',\n // Where the token comes from. The consumer pair does NOT come from here — it\n // is requested from Vindi by form — which the fields' placeholders say.\n providerInstall: { url: 'https://app.vindi.com.br' },\n // Grounded in what the request plane does, and padded with nothing: the total\n // is recomputed server-side from the order before the charge is opened, which\n // is a read of the order and never a write of it; the charge and its\n // confirmation are the write.\n permissions: [\n {\n kind: 'data',\n resource: 'order',\n actions: ['read'],\n reason:\n 'Ler o pedido para recalcular o valor no servidor antes de abrir a cobrança — o total nunca vem do navegador do cliente.',\n sensitive: true,\n },\n {\n kind: 'data',\n resource: 'payment',\n actions: ['write'],\n reason: 'Registrar aqui a cobrança aberta e a confirmação do pagamento. Dados do cartão não passam por este app.',\n sensitive: true,\n },\n ],\n latencyBudgetMs: VINDI_LATENCY_BUDGET_MS,\n // A gateway that does not answer must stop the sale: an order that reads as\n // confirmed without a payment is worse than a refused checkout. Same verdict\n // as the other three gateways, opposite to the carrier next door.\n onFailure: 'block',\n fields: VINDI_FIELDS,\n settings: VINDI_SETTINGS,\n invokedAt: [\n {\n key: 'shop.checkout.session_open',\n label: 'O cliente finaliza a compra e a cobrança é aberta na Vindi (Pix ou boleto)',\n touches: ['order', 'payment'],\n },\n {\n key: 'shop.payment.capture',\n label: 'A Vindi avisa que o pagamento caiu, a cobrança é reconsultada e o pedido é liberado',\n plane: 'sync',\n trigger: 'webhook',\n touches: ['payment'],\n },\n ],\n // Read from the row the list already batched, so a screen with N connectors\n // costs one plg_connections request rather than N.\n ...connectionStatus(\n VINDI_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: connectionDetail(connection?.settings),\n plane: 'request',\n ...settingsStatus(VINDI_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n // Reached only AFTER the credential sink accepted the three keys — that\n // ordering is what makes `active = true` mean \"credentials were placed for\n // this store\" rather than \"somebody pressed a button\". They never arrive here:\n // the hub split them out before calling this, so `values` is empty.\n //\n // No `testConnection` either: the probe is handed the non-secret half, which\n // for this connector is nothing. Testing belongs to the edge function that\n // holds the credential.\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n ExtraPanel: VindiExtraPanel,\n}\n","import React from 'react'\nimport { Globe, MessageCircle, Camera, Music, ShoppingBag, MapPin, Link2, Plus, ExternalLink, Trash2, Check, X } from 'lucide-react'\nimport { Button, Input } from '@fayz-ai/ui'\nimport type { ShopProvider, SalesChannel, SalesChannelKind } from '@fayz-ai/shop'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport type { ShopProviderResolver } from './ShopPage'\n\n// ---------------------------------------------------------------------------\n// Canais de venda — the store's points of sale, Shopify-style. The online_store\n// channel points at the merchant's fayz storefront; the rest are external links\n// the merchant maintains (WhatsApp, Instagram, TikTok Shop…). Every enabled\n// channel with a URL also surfaces as an external link in the left menu (see\n// the \"Canais de venda\" nav group), so this page is where they are configured.\n// ---------------------------------------------------------------------------\n\ninterface KindMeta {\n label: string\n icon: React.ComponentType<{ className?: string }>\n hint: string\n placeholder: string\n}\n\nconst KIND_META: Record<SalesChannelKind, KindMeta> = {\n online_store: { label: 'Loja Online', icon: Globe, hint: 'Seu storefront fayz — a vitrine pública da loja.', placeholder: 'https://minhaloja.com.br/' },\n whatsapp: { label: 'WhatsApp', icon: MessageCircle, hint: 'Link direto para o WhatsApp Business.', placeholder: 'https://wa.me/5521999999999' },\n instagram: { label: 'Instagram', icon: Camera, hint: 'Perfil ou loja no Instagram.', placeholder: 'https://instagram.com/sualoja' },\n tiktok_shop: { label: 'TikTok Shop', icon: Music, hint: 'Sua vitrine no TikTok Shop.', placeholder: 'https://shop.tiktok.com/@sualoja' },\n marketplace: { label: 'Marketplace', icon: ShoppingBag, hint: 'Mercado Livre, Amazon, Shopee…', placeholder: 'https://…' },\n physical: { label: 'Loja Física', icon: MapPin, hint: 'Endereço ou ponto de venda físico.', placeholder: 'https://maps.google.com/…' },\n custom: { label: 'Outro canal', icon: Link2, hint: 'Qualquer outro ponto de venda com um link.', placeholder: 'https://…' },\n}\n\nconst ADDABLE_KINDS: SalesChannelKind[] = ['whatsapp', 'instagram', 'tiktok_shop', 'marketplace', 'physical', 'custom']\n\nfunction resolve(resolver?: ShopProviderResolver): ShopProvider {\n return typeof resolver === 'function' ? resolver() : resolver ?? getShopProvider()\n}\n\n// Let any runtime nav contributor (e.g. the app's ChannelsNav) refresh the\n// sidebar the moment channels change here, without coupling the two.\nfunction notifyChannelsChanged() {\n if (typeof window !== 'undefined') window.dispatchEvent(new Event('fayz:channels-changed'))\n}\n\nexport interface ChannelsPageProps {\n resolveProvider?: ShopProviderResolver\n}\n\nexport function ChannelsPage({ resolveProvider }: ChannelsPageProps) {\n const provider = React.useMemo(() => resolve(resolveProvider), [resolveProvider])\n const supported = typeof provider.listSalesChannels === 'function'\n\n const [channels, setChannels] = React.useState<SalesChannel[]>([])\n const [loading, setLoading] = React.useState(true)\n const [adding, setAdding] = React.useState<SalesChannelKind | null>(null)\n\n const reload = React.useCallback(async () => {\n if (!provider.listSalesChannels) { setLoading(false); return }\n setLoading(true)\n try {\n const rows = await provider.listSalesChannels()\n // Guarantee a Loja Online row exists so the storefront link is always\n // configurable — seed one on first visit if the store has none.\n if (!rows.some((c) => c.kind === 'online_store') && provider.createSalesChannel) {\n await provider.createSalesChannel({ kind: 'online_store', label: 'Loja Online', enabled: true, position: 0 })\n setChannels(await provider.listSalesChannels())\n } else {\n setChannels(rows)\n }\n } finally {\n setLoading(false)\n }\n }, [provider])\n\n React.useEffect(() => { void reload() }, [reload])\n\n const patch = async (id: string, input: Parameters<NonNullable<ShopProvider['updateSalesChannel']>>[1]) => {\n if (!provider.updateSalesChannel) return\n const updated = await provider.updateSalesChannel(id, input)\n setChannels((prev) => prev.map((c) => (c.id === id ? updated : c)))\n notifyChannelsChanged()\n }\n\n const remove = async (id: string) => {\n if (!provider.deleteSalesChannel) return\n await provider.deleteSalesChannel(id)\n setChannels((prev) => prev.filter((c) => c.id !== id))\n notifyChannelsChanged()\n }\n\n const add = async (kind: SalesChannelKind, label: string, url: string) => {\n if (!provider.createSalesChannel) return\n const created = await provider.createSalesChannel({ kind, label: label || KIND_META[kind].label, url: url || null, enabled: true, position: channels.length })\n setChannels((prev) => [...prev, created])\n setAdding(null)\n notifyChannelsChanged()\n }\n\n if (!supported) {\n return (\n <div className=\"mx-auto max-w-4xl p-6\">\n <h1 className=\"text-xl font-semibold text-foreground\">Canais de venda</h1>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n Este provedor de loja ainda não expõe canais de venda.\n </p>\n </div>\n )\n }\n\n const online = channels.find((c) => c.kind === 'online_store')\n const others = channels.filter((c) => c.kind !== 'online_store')\n\n return (\n <div className=\"mx-auto max-w-4xl p-6\">\n <div className=\"mb-6\">\n <h1 className=\"text-xl font-semibold text-foreground\">Canais de venda</h1>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n Onde sua loja vende. A Loja Online é o seu storefront fayz; os demais são links que aparecem no menu lateral.\n </p>\n </div>\n\n {loading ? (\n <p className=\"text-sm text-muted-foreground\">Carregando…</p>\n ) : (\n <div className=\"space-y-6\">\n {online && <OnlineStoreCard channel={online} onSave={(url) => patch(online.id, { url })} onToggle={(enabled) => patch(online.id, { enabled })} />}\n\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <h2 className=\"text-sm font-semibold text-foreground\">Outros canais</h2>\n </div>\n <div className=\"space-y-2\">\n {others.map((c) => (\n <ChannelRow key={c.id} channel={c} onSave={(url) => patch(c.id, { url })} onToggle={(enabled) => patch(c.id, { enabled })} onRemove={() => remove(c.id)} />\n ))}\n {others.length === 0 && (\n <p className=\"rounded-card border border-dashed border-border p-4 text-sm text-muted-foreground\">\n Nenhum canal adicional ainda. Adicione WhatsApp, Instagram, TikTok Shop e outros pontos de venda.\n </p>\n )}\n </div>\n\n {adding ? (\n <AddChannelForm kind={adding} onCancel={() => setAdding(null)} onAdd={(label, url) => add(adding, label, url)} onKind={setAdding} />\n ) : (\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {ADDABLE_KINDS.map((k) => {\n const Icon = KIND_META[k].icon\n return (\n <Button key={k} variant=\"outline\" size=\"sm\" onClick={() => setAdding(k)}>\n <Icon className=\"mr-1.5 h-3.5 w-3.5\" /> {KIND_META[k].label}\n </Button>\n )\n })}\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n )\n}\n\nfunction OnlineStoreCard({ channel, onSave, onToggle }: { channel: SalesChannel; onSave: (url: string | null) => void; onToggle: (enabled: boolean) => void }) {\n const [url, setUrl] = React.useState(channel.url ?? '')\n const dirty = (channel.url ?? '') !== url\n const meta = KIND_META.online_store\n return (\n <div className=\"rounded-card border border-border bg-card p-5\">\n <div className=\"flex items-start gap-3\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-primary/10\">\n <meta.icon className=\"h-5 w-5 text-primary\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-semibold text-foreground\">Loja Online</span>\n <span className={`rounded-full px-2 py-0.5 text-xs font-medium ${channel.enabled ? 'bg-emerald-100 text-emerald-800' : 'bg-muted text-muted-foreground'}`}>\n {channel.enabled ? 'Ativa' : 'Inativa'}\n </span>\n </div>\n <p className=\"mt-0.5 text-sm text-muted-foreground\">{meta.hint}</p>\n\n <div className=\"mt-3 flex flex-col gap-2 sm:flex-row sm:items-center\">\n <Input value={url} placeholder={meta.placeholder} onChange={(e) => setUrl(e.target.value)} className=\"flex-1\" />\n <div className=\"flex gap-2\">\n <Button size=\"sm\" disabled={!dirty} onClick={() => onSave(url.trim() || null)}>Salvar</Button>\n <Button size=\"sm\" variant=\"outline\" disabled={!channel.url} onClick={() => channel.url && window.open(channel.url, '_blank', 'noopener,noreferrer')}>\n <ExternalLink className=\"mr-1.5 h-3.5 w-3.5\" /> Ver loja\n </Button>\n </div>\n </div>\n <div className=\"mt-3\">\n <button type=\"button\" onClick={() => onToggle(!channel.enabled)} className=\"text-xs font-medium text-muted-foreground hover:text-foreground\">\n {channel.enabled ? 'Desativar canal' : 'Ativar canal'}\n </button>\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nfunction ChannelRow({ channel, onSave, onToggle, onRemove }: { channel: SalesChannel; onSave: (url: string | null) => void; onToggle: (enabled: boolean) => void; onRemove: () => void }) {\n const [url, setUrl] = React.useState(channel.url ?? '')\n const [editing, setEditing] = React.useState(false)\n const meta = KIND_META[channel.kind] ?? KIND_META.custom\n const Icon = meta.icon\n return (\n <div className=\"rounded-card border border-border bg-card p-3\">\n <div className=\"flex items-center gap-3\">\n <div className={`flex h-9 w-9 shrink-0 items-center justify-center rounded-full ${channel.enabled ? 'bg-primary/10' : 'bg-muted'}`}>\n <Icon className={`h-4 w-4 ${channel.enabled ? 'text-primary' : 'text-muted-foreground'}`} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-foreground\">{channel.label}</p>\n {editing ? (\n <Input value={url} placeholder={meta.placeholder} onChange={(e) => setUrl(e.target.value)} className=\"mt-1 h-8\" />\n ) : (\n <p className=\"truncate text-xs text-muted-foreground\">{channel.url || 'Sem link configurado'}</p>\n )}\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {editing ? (\n <>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => { onSave(url.trim() || null); setEditing(false) }}><Check className=\"h-4 w-4\" /></Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => { setUrl(channel.url ?? ''); setEditing(false) }}><X className=\"h-4 w-4\" /></Button>\n </>\n ) : (\n <>\n {channel.url && (\n <Button size=\"sm\" variant=\"ghost\" onClick={() => window.open(channel.url!, '_blank', 'noopener,noreferrer')}><ExternalLink className=\"h-4 w-4\" /></Button>\n )}\n <button type=\"button\" onClick={() => onToggle(!channel.enabled)} title={channel.enabled ? 'Desativar' : 'Ativar'} className={`rounded-full px-2 py-0.5 text-xs font-medium ${channel.enabled ? 'bg-emerald-100 text-emerald-800' : 'bg-muted text-muted-foreground'}`}>\n {channel.enabled ? 'Ativo' : 'Inativo'}\n </button>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => setEditing(true)}>Editar</Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={onRemove}><Trash2 className=\"h-4 w-4 text-red-500\" /></Button>\n </>\n )}\n </div>\n </div>\n </div>\n )\n}\n\nfunction AddChannelForm({ kind, onKind, onCancel, onAdd }: { kind: SalesChannelKind; onKind: (k: SalesChannelKind) => void; onCancel: () => void; onAdd: (label: string, url: string) => void }) {\n const meta = KIND_META[kind]\n const [label, setLabel] = React.useState(meta.label)\n const [url, setUrl] = React.useState('')\n React.useEffect(() => { setLabel(KIND_META[kind].label) }, [kind])\n return (\n <div className=\"mt-3 rounded-card border border-border bg-card p-4\">\n <div className=\"mb-3 flex flex-wrap gap-2\">\n {ADDABLE_KINDS.map((k) => {\n const Icon = KIND_META[k].icon\n return (\n <button key={k} type=\"button\" onClick={() => onKind(k)} className={`flex items-center gap-1.5 rounded-full px-3 py-1 text-xs font-medium ${k === kind ? 'bg-primary text-primary-foreground' : 'bg-muted text-muted-foreground hover:text-foreground'}`}>\n <Icon className=\"h-3.5 w-3.5\" /> {KIND_META[k].label}\n </button>\n )\n })}\n </div>\n <p className=\"mb-2 text-xs text-muted-foreground\">{meta.hint}</p>\n <div className=\"flex flex-col gap-2 sm:flex-row\">\n <Input value={label} placeholder=\"Nome do canal\" onChange={(e) => setLabel(e.target.value)} className=\"sm:w-48\" />\n <Input value={url} placeholder={meta.placeholder} onChange={(e) => setUrl(e.target.value)} className=\"flex-1\" />\n </div>\n <div className=\"mt-3 flex gap-2\">\n <Button size=\"sm\" onClick={() => onAdd(label, url)}><Plus className=\"mr-1.5 h-3.5 w-3.5\" /> Adicionar</Button>\n <Button size=\"sm\" variant=\"outline\" onClick={onCancel}>Cancelar</Button>\n </div>\n </div>\n )\n}\n","import type { MediaFile } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Os dois endereços que a biblioteca de conteúdo precisa saber montar: para\n// onde uma foto leva, e por onde ela desce. Fora do componente porque é o que\n// realmente pode quebrar sem ninguém ver — uma rota que mudou de forma, um\n// arquivo que abre em vez de baixar.\n// ---------------------------------------------------------------------------\n\n/** A tela onde a foto é gerenciada — a aba de fotos do produto, não a lista. */\nexport function recordRoute(reference: NonNullable<MediaFile['reference']>): string {\n return `#/products/${reference.id}/images`\n}\n\n/**\n * O endereço que baixa o arquivo em vez de abri-lo.\n *\n * O storage devolve o arquivo como anexo quando pedimos; o atributo `download`\n * do link sozinho é ignorado quando o arquivo vem de outro domínio — que é o\n * caso de toda foto da loja.\n */\nexport function downloadUrlOf(file: MediaFile): string {\n if (!/^https?:/i.test(file.url)) return file.url\n const separator = file.url.includes('?') ? '&' : '?'\n return `${file.url}${separator}download=${encodeURIComponent(file.name)}`\n}\n","import React from 'react'\nimport {\n ChevronLeft, ChevronRight, Download, Film, FileText, ImageOff,\n Package, RefreshCw, Sparkles, Trash2, Upload,\n} from 'lucide-react'\nimport { Button, Card, ConfirmDialog, HeaderTabs, Hint, PageHeader, toast } from '@fayz-ai/ui'\nimport type { MediaFile, ShopProvider } from '@fayz-ai/shop'\nimport { getShopProvider, productImageToMediaFile } from '@fayz-ai/shop'\nimport { downloadUrlOf, recordRoute } from './media-links'\nimport type { ShopProviderResolver } from './ShopPage'\n\n// ---------------------------------------------------------------------------\n// Conteúdo — a biblioteca de arquivos da loja.\n//\n// Não é um depósito: é onde o lojista olha as fotos do catálogo todas juntas e\n// vê quais estão ruins. Por isso cada arquivo mostra a que registro pertence e\n// leva até ele — uma parede de miniaturas anônimas mostra o problema e não dá\n// para onde ir —, e por isso abrir uma foto acontece AQUI, com voltar, baixar e\n// trocar à mão: quem veio revisar o catálogo revisa dezenas, e cada ida a outra\n// aba é uma volta que ele não faz.\n//\n// Uma foto de produto é uma linha em plg_shop_product_images (é o provider que\n// junta as duas fontes); o que o lojista sobe aqui não pertence a nada e fica na\n// biblioteca.\n// ---------------------------------------------------------------------------\n\ntype MediaTab = 'all' | 'image' | 'video'\n\nconst TABS: { value: MediaTab; label: string }[] = [\n { value: 'all', label: 'Todos' },\n { value: 'image', label: 'Imagens' },\n { value: 'video', label: 'Vídeos' },\n]\n\n/** Abaixo disso a foto estoura no zoom do storefront e no retina de um celular. */\nconst LOW_RESOLUTION_PX = 800\n\nfunction resolve(resolver?: ShopProviderResolver): ShopProvider {\n return typeof resolver === 'function' ? resolver() : resolver ?? getShopProvider()\n}\n\nfunction formatSize(bytes: number): string {\n if (!bytes) return ''\n const units = ['B', 'KB', 'MB', 'GB']\n const i = Math.min(Math.floor(Math.log(bytes) / Math.log(1024)), units.length - 1)\n return `${(bytes / 1024 ** i).toFixed(i === 0 ? 0 : 1)} ${units[i]}`\n}\n\ninterface Dimensions { width: number; height: number }\n\nexport interface ContentPageProps {\n resolveProvider?: ShopProviderResolver\n}\n\nexport function ContentPage({ resolveProvider }: ContentPageProps) {\n const provider = React.useMemo(() => resolve(resolveProvider), [resolveProvider])\n const supported = typeof provider.listMediaFiles === 'function'\n\n const [files, setFiles] = React.useState<MediaFile[] | null>(null)\n const [tab, setTab] = React.useState<MediaTab>('all')\n const [uploading, setUploading] = React.useState(false)\n const [pendingDelete, setPendingDelete] = React.useState<MediaFile | null>(null)\n const [deleting, setDeleting] = React.useState(false)\n const [replacing, setReplacing] = React.useState(false)\n // A foto aberta é guardada por id, não por objeto: a lista recarrega a cada\n // troca e um objeto guardado ficaria mostrando o arquivo antigo.\n const [openId, setOpenId] = React.useState<string | null>(null)\n // Medidas do arquivo real, lidas do <img> depois que ele carrega: o tamanho em\n // bytes não diz se a foto está pequena, e é isso que o lojista veio ver.\n const [dimensions, setDimensions] = React.useState<Record<string, Dimensions>>({})\n\n const reload = React.useCallback(async () => {\n if (!provider.listMediaFiles) { setFiles([]); return }\n try {\n setFiles(await provider.listMediaFiles())\n } catch (err) {\n console.warn('[content] failed to list media', err)\n setFiles([])\n }\n }, [provider])\n\n React.useEffect(() => { void reload() }, [reload])\n\n const measure = React.useCallback((id: string, d: Dimensions) => {\n setDimensions((prev) => prev[id] ? prev : { ...prev, [id]: d })\n }, [])\n\n const handleUpload = async (picked: FileList | null) => {\n if (!picked?.length || !provider.uploadMediaFile) return\n setUploading(true)\n try {\n // Sequential, not Promise.all: a merchant dropping twenty photos on a\n // café connection should not open twenty parallel uploads that all\n // time out together.\n for (const file of Array.from(picked)) {\n await provider.uploadMediaFile(file)\n }\n toast.success(picked.length === 1 ? 'Arquivo enviado' : `${picked.length} arquivos enviados`)\n await reload()\n } catch (err) {\n console.warn('[content] upload failed', err)\n toast.error('Não foi possível enviar o arquivo')\n } finally {\n setUploading(false)\n }\n }\n\n const handleReplace = async (file: MediaFile, picked: File) => {\n setReplacing(true)\n try {\n let nextId: string\n if (file.reference) {\n if (!provider.replaceProductImage) throw new Error('unsupported')\n const image = await provider.replaceProductImage(file.reference.attachmentId, picked)\n // A troca escreve um arquivo novo, então a identidade muda — reabrir a\n // foto pelo id antigo cairia numa tela em branco.\n nextId = productImageToMediaFile(image, file.reference.label).id\n } else {\n if (!provider.uploadMediaFile) throw new Error('unsupported')\n // Sobe primeiro, apaga depois: se a subida falhar, o lojista continua\n // com o arquivo que tinha.\n const uploaded = await provider.uploadMediaFile(picked)\n if (provider.deleteMediaFile) await provider.deleteMediaFile(file.id)\n nextId = uploaded.id\n }\n await reload()\n setOpenId(nextId)\n toast.success('Arquivo trocado')\n } catch (err) {\n console.warn('[content] replace failed', err)\n toast.error('Não foi possível trocar o arquivo')\n } finally {\n setReplacing(false)\n }\n }\n\n const confirmDelete = async () => {\n const file = pendingDelete\n if (!file) return\n setDeleting(true)\n try {\n // Uma foto de produto se apaga desanexando: a linha é o que a torna a foto\n // daquele produto, e é o provider que leva o arquivo junto. Um arquivo da\n // biblioteca não tem linha nenhuma — só o objeto.\n if (file.reference) {\n await provider.deleteProductImage(file.reference.attachmentId)\n } else if (provider.deleteMediaFile) {\n await provider.deleteMediaFile(file.id)\n }\n setFiles((prev) => prev?.filter((f) => f.id !== file.id) ?? null)\n setPendingDelete(null)\n if (openId === file.id) setOpenId(null)\n } catch (err) {\n console.warn('[content] delete failed', err)\n toast.error('Não foi possível excluir o arquivo')\n } finally {\n setDeleting(false)\n }\n }\n\n const visible = (files ?? []).filter((f) => tab === 'all' || f.kind === tab)\n const openIndex = visible.findIndex((f) => f.id === openId)\n const open = openIndex >= 0 ? visible[openIndex]! : null\n\n const canDelete = (file: MediaFile) => Boolean(file.reference) || typeof provider.deleteMediaFile === 'function'\n const canReplace = (file: MediaFile) => file.reference\n ? typeof provider.replaceProductImage === 'function'\n : typeof provider.uploadMediaFile === 'function'\n\n // A foto aberta ocupa a página inteira: a grade atrás dela seria só ruído, e\n // voltar é um clique (ou Esc).\n if (open) {\n return (\n <>\n <MediaDetail\n file={open}\n dimensions={dimensions[open.id]}\n onMeasured={(d) => measure(open.id, d)}\n position={{ index: openIndex, total: visible.length }}\n onNavigate={(delta) => setOpenId(visible[openIndex + delta]?.id ?? open.id)}\n onBack={() => setOpenId(null)}\n onReplace={canReplace(open) ? (picked) => void handleReplace(open, picked) : undefined}\n onDelete={canDelete(open) ? () => setPendingDelete(open) : undefined}\n replacing={replacing}\n />\n <DeleteConfirm\n file={pendingDelete}\n loading={deleting}\n onConfirm={() => void confirmDelete()}\n onCancel={() => setPendingDelete(null)}\n />\n </>\n )\n }\n\n const attached = visible.filter((f) => f.reference)\n const loose = visible.filter((f) => !f.reference)\n const productCount = (files ?? []).filter((f) => f.reference).length\n const caption = files === null\n ? ''\n : [\n `${files.length} ${files.length === 1 ? 'arquivo' : 'arquivos'}`,\n productCount > 0\n ? `${productCount} ${productCount === 1 ? 'de produto' : 'de produtos'}`\n : '',\n ].filter(Boolean).join(' · ')\n\n const renderGrid = (list: MediaFile[]) => (\n <div className=\"fz-cards gap-4\">\n {list.map((file) => (\n <MediaCard\n key={file.id}\n file={file}\n dimensions={dimensions[file.id]}\n onMeasured={(d) => measure(file.id, d)}\n onOpen={() => setOpenId(file.id)}\n onDelete={canDelete(file) ? () => setPendingDelete(file) : undefined}\n />\n ))}\n </div>\n )\n\n return (\n <div className=\"space-y-6\">\n {/* No <h1>: the shell's top bar already names the page. The file count\n rides with the tabs instead of under a duplicated heading. */}\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div className=\"flex items-center gap-3\">\n <HeaderTabs tabs={TABS} value={tab} onChange={setTab} aria-label=\"Arquivos\" />\n {caption && <span className=\"text-sm text-muted-foreground\">{caption}</span>}\n </div>\n {supported && provider.uploadMediaFile && (\n <UploadButton uploading={uploading} onPick={handleUpload} />\n )}\n </div>\n\n {!supported ? (\n <Card className=\"p-12 text-center\">\n <ImageOff className=\"mx-auto h-8 w-8 text-muted-foreground\" />\n <p className=\"mt-3 font-medium\">Armazenamento não configurado</p>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n A biblioteca de arquivos precisa do storage da loja, que não está disponível neste modo.\n </p>\n </Card>\n ) : files === null ? (\n <div className=\"fz-cards gap-4\">\n {Array.from({ length: 5 }).map((_, i) => (\n <Card key={i} className=\"p-3\">\n <div className=\"aspect-square animate-pulse rounded-md bg-muted\" />\n <div className=\"mt-2 h-3.5 w-2/3 animate-pulse rounded bg-muted\" />\n </Card>\n ))}\n </div>\n ) : visible.length === 0 ? (\n <Card className=\"p-12 text-center\">\n <ImageOff className=\"mx-auto h-8 w-8 text-muted-foreground\" />\n <p className=\"mt-3 font-medium\">Nenhum arquivo ainda</p>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n As fotos dos seus produtos e o que você enviar aqui aparecem nesta biblioteca.\n </p>\n </Card>\n ) : attached.length && loose.length ? (\n // Só separa quando há os dois: um título sozinho em cima de tudo é\n // barulho, e a etiqueta em cada cartão já diz de quem é a foto.\n <div className=\"space-y-8\">\n <section className=\"space-y-3\">\n <SectionTitle title=\"Fotos de produtos\" count={attached.length} />\n {renderGrid(attached)}\n </section>\n <section className=\"space-y-3\">\n <SectionTitle title=\"Biblioteca\" count={loose.length} />\n {renderGrid(loose)}\n </section>\n </div>\n ) : (\n renderGrid(visible)\n )}\n\n <DeleteConfirm\n file={pendingDelete}\n loading={deleting}\n onConfirm={() => void confirmDelete()}\n onCancel={() => setPendingDelete(null)}\n />\n </div>\n )\n}\n\nfunction DeleteConfirm({ file, loading, onConfirm, onCancel }: {\n file: MediaFile | null\n loading: boolean\n onConfirm: () => void\n onCancel: () => void\n}) {\n return (\n <ConfirmDialog\n open={file !== null}\n loading={loading}\n variant=\"destructive\"\n title={file?.reference ? 'Excluir a foto do produto?' : 'Excluir arquivo?'}\n description={file?.reference\n ? `A foto sai de \"${file.reference.label}\" e da loja imediatamente.`\n : 'O arquivo sai da biblioteca. Se ele estiver em uso em algum lugar, o endereço para de funcionar.'}\n confirmLabel=\"Excluir\"\n cancelLabel=\"Cancelar\"\n onConfirm={onConfirm}\n onCancel={onCancel}\n />\n )\n}\n\nfunction SectionTitle({ title, count }: { title: string; count: number }) {\n return (\n <h2 className=\"text-sm font-semibold\">\n {title} <span className=\"font-normal text-muted-foreground\">({count})</span>\n </h2>\n )\n}\n\nfunction UploadButton({ uploading, onPick }: {\n uploading: boolean\n onPick: (files: FileList | null) => Promise<void>\n}) {\n const inputRef = React.useRef<HTMLInputElement>(null)\n return (\n <>\n <input\n ref={inputRef}\n type=\"file\"\n multiple\n className=\"hidden\"\n onChange={(e) => {\n void onPick(e.target.files).finally(() => {\n if (inputRef.current) inputRef.current.value = ''\n })\n }}\n />\n <Button onClick={() => inputRef.current?.click()} disabled={uploading}>\n <Upload className=\"mr-2 h-4 w-4\" />\n {uploading ? 'Enviando…' : 'Enviar arquivos'}\n </Button>\n </>\n )\n}\n\n/** O ícone que representa um arquivo que não é imagem. */\nfunction KindIcon({ kind, className }: { kind: MediaFile['kind']; className: string }) {\n const Icon = kind === 'video' ? Film : FileText\n return <Icon className={className} />\n}\n\nfunction MediaCard({ file, dimensions, onMeasured, onOpen, onDelete }: {\n file: MediaFile\n dimensions?: Dimensions\n onMeasured: (d: Dimensions) => void\n onOpen: () => void\n onDelete?: () => void\n}) {\n return (\n <Card className=\"group relative overflow-hidden p-3\">\n <button\n type=\"button\"\n onClick={onOpen}\n aria-label={`Abrir ${file.name}`}\n className=\"relative flex aspect-square w-full items-center justify-center overflow-hidden rounded-md bg-muted\"\n >\n {file.kind === 'image' ? (\n <img\n src={file.url}\n alt={file.name}\n loading=\"lazy\"\n className=\"h-full w-full object-contain\"\n onLoad={(e) => {\n const img = e.currentTarget\n if (img.naturalWidth) onMeasured({ width: img.naturalWidth, height: img.naturalHeight })\n }}\n />\n ) : (\n <KindIcon kind={file.kind} className=\"h-8 w-8 text-muted-foreground\" />\n )}\n {file.reference?.isCover && (\n <span className=\"absolute left-1.5 top-1.5 rounded-full bg-primary px-2 py-0.5 text-[11px] font-bold text-primary-foreground\">\n Capa\n </span>\n )}\n </button>\n\n {onDelete && (\n <Hint label=\"Excluir\">\n <button\n type=\"button\"\n aria-label=\"Excluir\"\n onClick={onDelete}\n className=\"absolute right-4 top-4 rounded-md bg-card/90 p-1.5 text-muted-foreground opacity-0 shadow-button transition-opacity hover:text-destructive group-hover:opacity-100\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </Hint>\n )}\n\n <p className=\"mt-2 truncate text-[13px] font-medium\" title={file.name}>{file.name}</p>\n <p className=\"text-[11px] text-muted-foreground\">\n <FileMeta file={file} dimensions={dimensions} />\n </p>\n\n {isLowResolution(file, dimensions) && (\n <p className=\"mt-1 text-[11px] font-medium text-warning\">Baixa resolução</p>\n )}\n\n {file.reference ? (\n <RecordLink reference={file.reference} className=\"mt-1.5 text-[11px]\" />\n ) : (\n <p className=\"mt-1.5 text-[11px] text-muted-foreground\">Biblioteca</p>\n )}\n </Card>\n )\n}\n\n/**\n * A foto aberta, dentro de /content.\n *\n * Abrir numa aba nova mostrava o arquivo e mais nada — nem de quem é, nem como\n * trocar. Aqui a revisão inteira acontece no mesmo lugar: olhar, baixar, trocar,\n * ir para a próxima.\n */\nfunction MediaDetail({\n file, dimensions, onMeasured, position, onNavigate, onBack, onReplace, onDelete, replacing,\n}: {\n file: MediaFile\n dimensions?: Dimensions\n onMeasured: (d: Dimensions) => void\n position: { index: number; total: number }\n onNavigate: (delta: number) => void\n onBack: () => void\n onReplace?: (picked: File) => void\n onDelete?: () => void\n replacing: boolean\n}) {\n const replaceRef = React.useRef<HTMLInputElement>(null)\n\n // As setas andam pelo conjunto que está na tela: revisar trinta fotos é uma\n // tarefa de teclado. O Escape não está aqui — o PageHeader já o liga ao\n // mesmo \"voltar\" que desenha na barra.\n React.useEffect(() => {\n function onKey(e: KeyboardEvent) {\n if (e.key === 'ArrowLeft') onNavigate(-1)\n if (e.key === 'ArrowRight') onNavigate(1)\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [onNavigate])\n\n return (\n <div className=\"space-y-4\">\n {/* A seta mora na barra da shell, como em toda tela de detalhe do app:\n \"← Conteúdo / foto.jpg\". Desenhá-la aqui dentro seria o segundo\n cabeçalho que o PageHeader existe para não deixar acontecer. */}\n <PageHeader title={file.name} parentLabel=\"Conteúdo\" onBack={onBack} />\n\n {position.total > 1 && (\n <div className=\"flex items-center justify-end gap-3\">\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <button\n type=\"button\"\n aria-label=\"Arquivo anterior\"\n disabled={position.index === 0}\n onClick={() => onNavigate(-1)}\n className=\"rounded-md border p-1 transition hover:bg-muted disabled:opacity-40\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n <span className=\"px-1 tabular-nums\">{position.index + 1} de {position.total}</span>\n <button\n type=\"button\"\n aria-label=\"Próximo arquivo\"\n disabled={position.index === position.total - 1}\n onClick={() => onNavigate(1)}\n className=\"rounded-md border p-1 transition hover:bg-muted disabled:opacity-40\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n )}\n\n <div className=\"fz-split\">\n <Card className=\"flex min-h-[320px] items-center justify-center overflow-hidden bg-muted p-2\">\n {file.kind === 'image' ? (\n <img\n key={file.url}\n src={file.url}\n alt={file.name}\n className=\"max-h-[70vh] w-auto max-w-full object-contain\"\n onLoad={(e) => {\n const img = e.currentTarget\n if (img.naturalWidth) onMeasured({ width: img.naturalWidth, height: img.naturalHeight })\n }}\n />\n ) : (\n <div className=\"flex flex-col items-center gap-2 p-12 text-muted-foreground\">\n <KindIcon kind={file.kind} className=\"h-10 w-10\" />\n <span className=\"text-sm\">Pré-visualização não disponível</span>\n </div>\n )}\n </Card>\n\n <Card className=\"space-y-4 p-4\">\n <div>\n <p className=\"break-words font-medium\" title={file.name}>{file.name}</p>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n <FileMeta file={file} dimensions={dimensions} />\n </p>\n {isLowResolution(file, dimensions) && (\n <p className=\"mt-2 rounded-md bg-warning/10 px-2 py-1.5 text-xs font-medium text-warning\">\n Baixa resolução — no zoom da loja essa foto fica borrada. Troque por uma\n de pelo menos {LOW_RESOLUTION_PX}px no lado maior.\n </p>\n )}\n </div>\n\n <div>\n <p className=\"text-[11px] uppercase tracking-wide text-muted-foreground\">Onde é usada</p>\n {file.reference ? (\n <RecordLink reference={file.reference} className=\"mt-1 text-sm\" />\n ) : (\n <p className=\"mt-1 text-sm text-muted-foreground\">\n Biblioteca — este arquivo não está preso a nenhum registro.\n </p>\n )}\n {file.reference?.isCover && (\n <p className=\"mt-1 text-xs text-muted-foreground\">\n É a capa: é ela que aparece no catálogo, no carrinho e no pedido.\n </p>\n )}\n </div>\n\n <div className=\"space-y-2\">\n {/* Desligado de propósito, e visível: o lugar onde a IA vai limpar\n fundo e subir resolução é aqui, e quem está olhando uma foto\n ruim é exatamente quem precisa saber que isso está vindo. */}\n <Button disabled className=\"w-full\" title=\"Em breve\">\n <Sparkles className=\"mr-2 h-4 w-4\" />\n Melhorar com IA\n </Button>\n\n <Button asChild variant=\"outline\" className=\"w-full\">\n <a href={downloadUrlOf(file)} download={file.name}>\n <Download className=\"mr-2 h-4 w-4\" />\n Baixar\n </a>\n </Button>\n\n {onReplace && (\n <>\n <input\n ref={replaceRef}\n type=\"file\"\n accept={file.kind === 'image' ? 'image/*' : undefined}\n className=\"hidden\"\n onChange={(e) => {\n const picked = e.target.files?.[0]\n e.target.value = ''\n if (picked) onReplace(picked)\n }}\n />\n <Button\n variant=\"outline\"\n className=\"w-full\"\n disabled={replacing}\n onClick={() => replaceRef.current?.click()}\n >\n <RefreshCw className={`mr-2 h-4 w-4 ${replacing ? 'animate-spin' : ''}`} />\n {replacing ? 'Trocando…' : 'Trocar arquivo'}\n </Button>\n {file.reference && (\n <p className=\"text-[11px] text-muted-foreground\">\n A troca mantém a posição da foto na galeria do produto.\n </p>\n )}\n </>\n )}\n\n {onDelete && (\n <Button variant=\"ghost\" className=\"w-full text-destructive hover:text-destructive\" onClick={onDelete}>\n <Trash2 className=\"mr-2 h-4 w-4\" />\n Excluir\n </Button>\n )}\n </div>\n </Card>\n </div>\n </div>\n )\n}\n\nfunction RecordLink({ reference, className = '' }: {\n reference: NonNullable<MediaFile['reference']>\n /** Quem chama define o tamanho: o mesmo link serve o cartão e o painel. */\n className?: string\n}) {\n return (\n <a\n href={recordRoute(reference)}\n title={`Abrir ${reference.label}`}\n className={`flex items-center gap-1 truncate font-medium text-primary hover:underline ${className}`}\n >\n <Package className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{reference.label}</span>\n </a>\n )\n}\n\nfunction FileMeta({ file, dimensions }: { file: MediaFile; dimensions?: Dimensions }) {\n const parts = [\n file.extension,\n dimensions ? `${dimensions.width}×${dimensions.height}` : '',\n formatSize(file.size),\n ].filter(Boolean)\n return <>{parts.join(' · ')}</>\n}\n\nfunction isLowResolution(file: MediaFile, dimensions?: Dimensions): boolean {\n return file.kind === 'image' && !!dimensions\n && Math.max(dimensions.width, dimensions.height) < LOW_RESOLUTION_PX\n}\n","// ---------------------------------------------------------------------------\n// Bling's constraints. They are shape, not implementation detail.\n// ---------------------------------------------------------------------------\n// Every number here changes what the connector IS, not how it is written:\n//\n// 3 req/s, 120k/day per account, summed across every module\n// → never one request per product, which is what forces the fast `sample`\n// and the background `backfill` apart.\n// a date filter wider than one year answers 400\n// → the window is always sliced; a backfill that reaches back two years is\n// two calls, decided by the client, not one call that fails.\n// authorization_code expires in 60 seconds, and 20 calls to /oauth/token in\n// 60 seconds block the IP for an hour\n// → refresh with days of slack, never in a loop, never at the deadline.\n// the refresh token lives 30 days and rotates on use\n// → scheduled renewal is a requirement; a tenant who does not shop for a\n// month otherwise comes back disconnected.\n// a webhook must be answered 2xx within 5 seconds or Bling DISABLES the\n// configuration\n// → receive, verify, enqueue, answer. No processing on the response path.\nimport type { RateLimitBudget } from '@fayz-ai/core/connector-runtime'\n\nexport const BLING_CONNECTOR_ID = 'bling'\n\n/** Per ACCOUNT, not per tenant: `instance_key` is the Bling company. */\nexport const BLING_RATE_LIMIT: RateLimitBudget = { perSecond: 3, perDay: 120_000 }\n\n/** Widest date filter Bling accepts. Anything longer answers 400. */\nexport const BLING_MAX_WINDOW_MS = 365 * 24 * 60 * 60_000\n\n/**\n * Re-read this much before the last window's end.\n *\n * Bling stamps `dataAlteracao` at second precision, so a product changed in the\n * same second the window closed is invisible for ever without an overlap. The\n * cost is an idempotent upsert; the cost of not having it is a price that never\n * updates and nobody can explain.\n */\nexport const BLING_WINDOW_OVERLAP_MS = 10 * 60_000\n\n/** Renew the token a week early. See the /oauth/token ban above. */\nexport const BLING_TOKEN_LEAD_MS = 7 * 24 * 60 * 60_000\n\n/** Bling's page size for the list endpoints. */\nexport const BLING_PAGE_SIZE = 100\n\n/**\n * A sample is one page, and one page only.\n *\n * At 3 req/s a ten-thousand-product catalogue is close to an hour. A connect\n * screen that waits for it is a connect screen nobody finishes, so the sample\n * answers with enough to design a storefront against and the backfill finishes\n * the mirror behind it.\n */\nexport const BLING_SAMPLE_SIZE = 100\n\n/** Bling signs its webhooks HMAC-SHA256 with the app's client secret. */\nexport const BLING_SIGNATURE_HEADER = 'x-bling-signature-256'\n\n/** Bling must see a 2xx before this, or it disables the tenant's webhook. */\nexport const BLING_WEBHOOK_DEADLINE_MS = 5_000\n","// The one place that names the Bling data plane. Same split as the Kiwify and\n// Stripe connectors: the definition declares WHAT the merchant can do, this file\n// knows how the call is made — and the credential path is what moves.\nimport {\n CONNECTOR_RUNTIME_TOKEN_HEADER,\n connectorRuntimeToken,\n getSupabaseClientOptional,\n type ConnectorDelivery,\n} from '@fayz-ai/core'\nimport { getShopTenantId } from '@fayz-ai/shop'\n\n/** The edge function that holds every Bling call this connector makes. */\nexport const BLING_FUNCTION = 'bling-sync'\n\n/** What a push leg answers with. Every field is a count the merchant can check. */\nexport interface BlingPushResult {\n runId?: string\n /** What the run settled as. The toast reads this, not \"it did not throw\". */\n status?: 'success' | 'partial' | 'error'\n filed: number\n skipped?: number\n stockPending?: number\n considered: number\n failures?: number\n message: string\n}\n\nexport interface BlingPullResult {\n runId?: string\n fetched: number\n inserted: number\n updated: number\n untouched: number\n sample: boolean\n}\n\ninterface MinimalClient {\n functions: {\n invoke: (\n name: string,\n options: { body: unknown; headers?: Record<string, string> },\n ) => Promise<{ data: unknown; error: { message: string } | null }>\n }\n from: (table: string) => any\n}\n\nfunction client(): MinimalClient {\n const supabase = getSupabaseClientOptional() as MinimalClient | null\n if (!supabase) throw new Error('Sem conexão com o banco para falar com o Bling.')\n return supabase\n}\n\n/**\n * One call to the data plane, carrying the two things it cannot derive: the\n * Supabase session (the gateway checks it) and the runtime token the function\n * FORWARDS to redeem this tenant's credential. Asked for here so a missing one\n * is refused before the round trip rather than as a failed run.\n */\nasync function invoke<T>(body: Record<string, unknown>): Promise<T> {\n const tenantId = getShopTenantId()\n if (!tenantId) throw new Error('Sem loja selecionada para sincronizar com o Bling.')\n const runtimeToken = await connectorRuntimeToken({ tenantId })\n\n const { data, error } = await client().functions.invoke(BLING_FUNCTION, {\n body: { ...body, tenantId },\n headers: { [CONNECTOR_RUNTIME_TOKEN_HEADER]: runtimeToken },\n })\n if (error) throw new Error(error.message)\n return data as T\n}\n\n/** Read one product. Writes nothing anywhere — the probe, not a sync. */\nexport function testBling(): Promise<{ ok: boolean; message?: string }> {\n return invoke({ action: 'test' })\n}\n\n/** Bring the catalogue down. `sample` is the seconds-long first answer. */\nexport function pullCatalogue(mode?: 'sample' | 'full'): Promise<BlingPullResult> {\n return invoke({ action: 'pull_products', ...(mode ? { mode } : {}) })\n}\n\n/** Send the products that exist only here. They come back linked — see the def. */\nexport function pushCatalogue(): Promise<BlingPushResult> {\n return invoke({ action: 'push_products' })\n}\n\n/** Send the buyers who have ordered, as Bling contacts. */\nexport function pushCustomers(): Promise<BlingPushResult> {\n return invoke({ action: 'push_customers' })\n}\n\n/** Send every paid order not filed yet, as a pedido de venda. */\nexport function pushOrders(): Promise<BlingPushResult> {\n return invoke({ action: 'push_orders' })\n}\n\n/** Lança o saldo dos produtos já vinculados. O reparo de um estoque que não subiu. */\nexport function pushStock(): Promise<{ sent: number; considered: number; message: string }> {\n return invoke({ action: 'push_stock' })\n}\n\n/**\n * Quantos registros ainda faltam subir, por fila.\n *\n * As mesmas ausências que a função usa como fila, contadas daqui: produto sem\n * vínculo, cliente que comprou e não virou contato, pedido pago sem pedido de\n * venda. É o que deixa a linha dizer \"em dia\" em vez de oferecer um botão que\n * não enviaria nada.\n */\nasync function countRows(table: string, apply: (q: any) => any): Promise<number | null> {\n const tenantId = getShopTenantId()\n const supabase = getSupabaseClientOptional() as MinimalClient | null\n if (!tenantId || !supabase) return null\n const { count, error } = await apply(\n supabase.from(table).select('id', { count: 'exact', head: true }).eq('tenant_id', tenantId),\n )\n return error ? null : (count ?? 0)\n}\n\nexport function pendingProducts(): Promise<number | null> {\n return countRows('plg_shop_products', (q: any) => q.is('external_source', null))\n}\n\nexport async function pendingCustomers(): Promise<number | null> {\n const tenantId = getShopTenantId()\n const supabase = getSupabaseClientOptional() as MinimalClient | null\n if (!tenantId || !supabase) return null\n const { data: linked } = await supabase\n .from('plg_shop_customer_links')\n .select('customer_id')\n .eq('tenant_id', tenantId)\n .eq('source', 'bling')\n const already = new Set((linked ?? []).map((row: any) => row.customer_id))\n const { data, error } = await supabase\n .from('plg_shop_customers')\n .select('id')\n .eq('tenant_id', tenantId)\n .gt('orders_count', 0)\n if (error) return null\n return (data ?? []).filter((row: any) => !already.has(row.id)).length\n}\n\nexport async function pendingOrders(): Promise<number | null> {\n const tenantId = getShopTenantId()\n const supabase = getSupabaseClientOptional() as MinimalClient | null\n if (!tenantId || !supabase) return null\n const { data: linked } = await supabase\n .from('plg_shop_order_links')\n .select('order_id')\n .eq('tenant_id', tenantId)\n .eq('source', 'bling')\n .eq('kind', 'sales_order')\n const already = new Set((linked ?? []).map((row: any) => row.order_id))\n const { data, error } = await supabase\n .from('plg_shop_orders')\n .select('id')\n .eq('tenant_id', tenantId)\n .neq('status', 'cancelled')\n if (error) return null\n return (data ?? []).filter((row: any) => !already.has(row.id)).length\n}\n\n/**\n * Which paid orders actually reached Bling — what a run's \"12 de 20\" cannot say.\n *\n * Read from the LINK TABLE, the same fact the push queue is built on: the link\n * exists exactly when Bling returned an id, so this screen cannot claim\n * \"enviado\" about something that was not.\n */\nexport async function listOrderDeliveries(limit = 10): Promise<ConnectorDelivery[]> {\n const tenantId = getShopTenantId()\n const supabase = getSupabaseClientOptional() as MinimalClient | null\n if (!tenantId || !supabase) return []\n\n const { data: orders } = await supabase\n .from('plg_shop_orders')\n .select('id,order_number,customer_name,customer_document,paid_at,created_at')\n .eq('tenant_id', tenantId)\n .neq('status', 'cancelled')\n .order('created_at', { ascending: false })\n .limit(limit)\n\n const rows = (orders ?? []) as Array<Record<string, any>>\n if (rows.length === 0) return []\n\n const { data: filed } = await supabase\n .from('plg_shop_order_links')\n .select('order_id,external_id,external_number,synced_at')\n .eq('tenant_id', tenantId)\n .eq('source', 'bling')\n .eq('kind', 'sales_order')\n .in('order_id', rows.map((row) => row.id))\n\n const byOrder = new Map<string, Record<string, any>>(\n ((filed ?? []) as Array<Record<string, any>>).map((row) => [row.order_id, row]),\n )\n\n return rows.map((order) => {\n const link = byOrder.get(order.id)\n const name = order.order_number ? `Pedido ${order.order_number}` : 'Pedido'\n if (link) {\n return {\n subject: name,\n subjectId: order.id,\n status: 'delivered',\n externalId: link.external_number ?? link.external_id,\n at: link.synced_at ?? order.paid_at,\n detail: order.customer_name ? String(order.customer_name) : undefined,\n }\n }\n // The one refusal explainable without asking Bling — and one the merchant\n // can fix.\n if (!String(order.customer_document ?? '').trim()) {\n return {\n subject: name,\n subjectId: order.id,\n status: 'failed',\n detail: 'sem CPF/CNPJ no pedido — o Bling não emite nota sem ele',\n at: order.paid_at ?? order.created_at,\n }\n }\n return {\n subject: name,\n subjectId: order.id,\n status: 'pending',\n detail: 'na fila — sobe na próxima sincronização',\n at: order.paid_at ?? order.created_at,\n }\n })\n}\n\n/** Both directions, everything pending. What the clock runs every fifteen minutes. */\nexport function reconcile(): Promise<{\n pull: BlingPullResult\n push: Record<string, BlingPushResult | { skipped: string }>\n}> {\n return invoke({ action: 'reconcile' })\n}\n","// Bling as a unified ConnectorDefinition, surfaced in Loja → configurações →\n// Integrações (rendered by the shared ConnectorsHub).\n//\n// It ships NO SQL. The connection is a row of plg_connections and the run\n// history is plg_sync_runs, both read through createConnectionStore — which is\n// what the gate in scripts/check-connector-tables.mjs exists to keep true.\nimport type { ConnectorDefinition } from '@fayz-ai/core'\nimport { connectionRuns, connectionStatus, createConnectionStore } from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\nimport {\n BLING_CONNECTOR_ID,\n BLING_RATE_LIMIT,\n BLING_SAMPLE_SIZE,\n} from './limits'\nimport {\n listOrderDeliveries,\n pendingCustomers,\n pendingOrders,\n pendingProducts,\n pullCatalogue,\n pushCatalogue,\n pushCustomers,\n pushOrders,\n pushStock,\n reconcile,\n} from './data'\n\n/**\n * `settingsKeys` and not `fields`: none of these is asked for in a form. Bling\n * authenticates by OAuth, so the connector's own code never sees a credential —\n * the hub routes secrets to the platform, and this connection has no secret\n * field to route in the first place.\n */\nexport const blingConnectionStore = () =>\n createConnectionStore(BLING_CONNECTOR_ID, {\n settingsKeys: ['companyId', 'backfillFrom', 'stockOwner', 'source', 'pushOrdersFrom'],\n })\n\nexport const blingConnectorDef: ConnectorDefinition = {\n id: BLING_CONNECTOR_ID,\n hostPluginId: 'shop',\n name: 'Bling',\n description:\n 'Traz o catálogo e o estoque do Bling para a loja e devolve cada pedido como pedido de venda, pronto para faturar.',\n // Quando sincroniza, em português e sem jargão. É a primeira pergunta de quem\n // conecta, e ela não tinha resposta em lugar nenhum da tela.\n howItSyncs: [\n 'Ao salvar um pedido, cliente ou produto aqui, a sincronização é antecipada e sobe em até um minuto.',\n 'De hora em hora, sozinho: traz do Bling o que mudou lá e envia o que estiver pendente daqui.',\n 'A qualquer momento, no botão Sincronizar agora.',\n 'Nada sobe duas vezes: cada registro guarda o número que recebeu no Bling.',\n ],\n icon: 'Boxes',\n authKind: 'oauth',\n // The catalogue files bling under `erp`, not `ecommerce`: Bling is the back\n // office, not the storefront. It shipped as 'commerce' — a word the catalogue\n // has never used — and the badge rendered nothing at all.\n category: 'erp',\n // Both ways, and the connector says so before anyone connects: the catalogue\n // comes in, the paid order goes out.\n direction: 'inbound',\n docsUrl: 'https://developer.bling.com.br/',\n // The catalogue is a MIRROR, which is why `shop_product` is read as well as\n // written: `reconcileMirror` has to see what is here before it decides what a\n // record missing from a page means. The consent also has to name what LEAVES:\n // the initial load sends the catalogue, the buyers who have ordered, and every\n // paid order up to Bling.\n permissions: [\n {\n kind: 'data',\n resource: 'shop_product',\n actions: ['read', 'write'],\n reason:\n 'Enviar ao Bling os produtos que ainda só existem aqui, e depois trazer de lá o catálogo, o preço e o estoque — comparando com o que já está na loja para não duplicar nem apagar produto por engano.',\n },\n {\n kind: 'data',\n resource: 'shop_customer',\n actions: ['read', 'write'],\n // `write` é o vínculo, não o cliente: sem ele cada pedido cria um contato\n // novo no Bling (o defeito que 0063 fecha).\n reason:\n 'Cadastrar como contato no Bling quem já comprou, para o pedido sair com nota. Nome, e-mail, telefone e CPF/CNPJ desse cliente vão para o Bling.',\n sensitive: true,\n },\n {\n kind: 'data',\n resource: 'shop_order',\n actions: ['read', 'write'],\n // Idem: grava-se o número que o pedido ganhou lá, que é o que permite\n // reenviar sem duplicar.\n reason:\n 'Ler o pedido pago para lançá-lo no Bling como pedido de venda, e guardar aqui o número que ele recebeu lá. O conteúdo do pedido não é alterado.',\n sensitive: true,\n },\n // Os momentos em que o ERP tem algo a fazer. `order_shipped` e\n // `order_delivered` ficam de fora de propósito: o pedido de venda já está\n // no Bling e o rastreio é outra história.\n {\n kind: 'event',\n // `order_confirmation` é o \"pedido feito\" no catálogo de fatos da loja\n // (packages/shop/src/lib/emails.ts). `shop.order_created` não existe, e\n // declarar um fato que ninguém publica é o bug que já aconteceu aqui.\n resource: 'shop.order_confirmation',\n actions: ['listen'],\n reason: 'Saber que um pedido foi feito, para lançá-lo no Bling como pedido de venda.',\n },\n {\n kind: 'event',\n resource: 'shop.order_paid',\n actions: ['listen'],\n reason: 'Saber que um pedido foi pago, para mandá-lo ao Bling como pedido de venda.',\n },\n {\n kind: 'event',\n resource: 'shop.order_cancelled',\n actions: ['listen'],\n reason: 'Saber que um pedido foi cancelado, para não lançá-lo no Bling.',\n },\n {\n kind: 'event',\n resource: 'shop.customer_welcome',\n actions: ['listen'],\n reason: 'Saber que um cliente foi cadastrado, para virar contato no Bling.',\n },\n ],\n // Declared, so the scheduler owns the clock. A `sleep` inside the connector\n // could not express the daily ceiling and could not be shared between the\n // catalogue pull and the order push running at the same time.\n rateLimit: BLING_RATE_LIMIT,\n // A ten-thousand-product catalogue at 3 req/s is close to an hour, so the\n // first load has two entries: a sample that answers in seconds, and a backfill\n // that finishes behind it.\n firstLoad: { sampleSize: BLING_SAMPLE_SIZE, samplePages: 1, stream: 'products' },\n // `shop.order_paid`, with an underscore. It shipped as `shop.order.paid`,\n // which is not a key anything publishes — the shop builds its facts as\n // `shop.${def.event}` over SHOP_EMAIL_EVENTS (packages/shop/src/lib/emails.ts),\n // and `eventKeyMatches` is exact for a pattern with no trailing star. The\n // managed automation was declared against a fact that could never arrive.\n subscribesTo: ['shop.order_confirmation', 'shop.order_paid', 'shop.order_cancelled', 'shop.customer_welcome'],\n managedAutomations: [\n { eventKey: 'shop.order_paid', label: 'Enviar o pedido para o Bling como pedido de venda' },\n { eventKey: 'shop.order_confirmation', label: 'Lançar o pedido novo no Bling como pedido de venda' },\n { eventKey: 'shop.order_cancelled', label: 'Parar de enviar ao Bling um pedido que foi cancelado' },\n { eventKey: 'shop.customer_welcome', label: 'Cadastrar como contato no Bling o cliente que comprou' },\n ],\n // O que ACONTECE, e não o que está declarado. Os dois primeiros são o gatilho\n // de escrita da migration 0064: salvar um pedido antecipa o próximo tique do\n // agendador, então a fila drena em até um minuto em vez de quinze.\n invokedAt: [\n {\n key: 'shop.order.wake',\n label: 'Um pedido é salvo ou pago aqui, e a sincronização é antecipada',\n plane: 'sync',\n trigger: 'on-write',\n touches: ['shop_order'],\n },\n {\n key: 'shop.order.push',\n label: 'O pedido pago sobe como pedido de venda no Bling',\n plane: 'sync',\n trigger: 'scheduled',\n touches: ['shop_order', 'shop_customer'],\n },\n {\n key: 'shop.catalogue.pull',\n label: 'O catálogo, o preço e o estoque do Bling descem para a loja',\n plane: 'sync',\n trigger: 'scheduled',\n touches: ['shop_product'],\n },\n ],\n // Read from the row the list already batched — one request for N connectors.\n ...connectionStatus(\n BLING_CONNECTOR_ID,\n (connection) => {\n if (!connection?.active) return { connected: false }\n const company = connection.settings?.companyId\n return {\n connected: connection.status === 'connected',\n detail: company ? `Empresa ${company}` : undefined,\n plane: 'sync',\n }\n },\n { store: blingConnectionStore },\n ),\n // The whole connect step. Declaring `authKind: 'oauth'` and no `startOAuth`\n // is what rendered the Conectar button DISABLED, with nothing on screen\n // saying why — the defect this connector was reported for. Bling ignores a\n // per-request `redirect_uri` and always uses what is registered on the app,\n // so the page to come back to travels inside the platform's signed state;\n // none of that is spelled here, which is the point of the helper.\n startOAuth: fayzConnectorOAuth(BLING_CONNECTOR_ID),\n // The other half of the consent, and the reason the first live test looped:\n // the platform stores the token and the pool stores \"is it on?\", and with\n // nobody writing the second the connector answered \"not connected\" to a\n // merchant who had just authorized. Called with no values — the credential is\n // not ours to see, and there is nothing to configure yet.\n saveConnection: async () => {\n await blingConnectionStore().save({ active: true })\n },\n // Disconnect FREEZES the mirror. It does not delete: a shopkeeper who unplugs\n // Bling still has a store, and a connector that empties the catalogue on\n // disconnect is a connector nobody dares to disconnect. `disconnect()` on the\n // shared store flips `active` and clears cursors — it never touches shop data.\n disconnect: async () => { await blingConnectionStore().disconnect() },\n // The one sentence that used to hang below Bling's own history panel, said\n // where the question is actually asked. It is the only thing in that panel\n // that was neither status, nor history, nor an act.\n disconnectNote:\n 'Desconectar congela o espelho: nenhum produto é apagado e o estoque para de ser atualizado.',\n // No panel of its own. The history is `plg_sync_runs` read through the shared\n // store, and the shared surface renders it — including the \"first load brings\n // a sample\" sentence, which it derives from `firstLoad` above rather than\n // repeating the number in prose.\n ...connectionRuns(blingConnectionStore),\n // Record by record, for the automations screen: the managed automation says a\n // paid order goes to Bling, and this is what says whether it arrived.\n listDeliveries: (options) => listOrderDeliveries(options?.limit ?? 10),\n // The same seam Google Calendar uses, so the two screens are one screen with\n // two sets of words. Before this, Bling's tab was a history with nothing that\n // could put a row in it. Ordered as somebody does them on the first day.\n syncActions: [\n {\n key: 'reconcile',\n label: 'Sincronizar agora',\n direction: 'inbound',\n // The one that is right on an ordinary day; the rest fold away.\n primary: true,\n description:\n 'Traz o que mudou no Bling e envia o que está pendente daqui — catálogo novo, clientes que compraram e pedidos pagos.',\n run: async () => {\n const result = await reconcile()\n const legs = Object.values(result.push ?? {})\n .map((leg: any) => (leg?.message ? String(leg.message) : null))\n .filter(Boolean)\n return [`${result.pull?.fetched ?? 0} produto(s) lidos do Bling`, ...legs].join(' · ')\n },\n },\n {\n key: 'pull_products',\n label: 'Trazer catálogo do Bling',\n direction: 'inbound',\n description: 'Preço e estoque do Bling passam a valer aqui. Nada é apagado da loja.',\n run: async () => {\n const result = await pullCatalogue('full')\n return `${result.fetched} produto(s) lidos, ${result.inserted} criado(s), ${result.updated} atualizado(s)`\n },\n },\n {\n key: 'push_products',\n label: 'Enviar catálogo para o Bling',\n direction: 'outbound',\n description:\n 'Sobe só o que ainda não existe lá. Depois de subir, quem manda no preço e no estoque passa a ser o Bling.',\n // Confirmed: a product filed at Bling cannot be taken back from here, and\n // the ownership handover is the part a merchant must agree to knowingly.\n confirm: {\n title: 'Enviar o catálogo para o Bling?',\n body:\n 'Os produtos que só existem aqui serão criados no Bling, com o saldo atual. A partir daí o Bling passa a mandar no preço e no estoque deles, e as mudanças vêm de lá para cá.',\n cta: 'Enviar catálogo',\n },\n pending: pendingProducts,\n run: async () => {\n const result = await pushCatalogue()\n return { message: result.message, status: result.status }\n },\n },\n {\n key: 'push_stock',\n label: 'Enviar saldo do estoque',\n direction: 'outbound',\n description:\n 'Lança no Bling o saldo dos produtos já enviados. Use quando um envio disser que o saldo não foi transferido.',\n run: async () => (await pushStock()).message,\n },\n {\n key: 'push_customers',\n label: 'Enviar clientes para o Bling',\n direction: 'outbound',\n description:\n 'Cadastra como contato quem já comprou. Cliente sem CPF/CNPJ fica de fora — o Bling precisa dele para emitir a nota.',\n confirm: {\n title: 'Enviar os clientes para o Bling?',\n body:\n 'Quem já comprou nesta loja será cadastrado como contato no Bling, com nome, e-mail, telefone e CPF/CNPJ. Quem não tem documento cadastrado não é enviado.',\n cta: 'Enviar clientes',\n },\n pending: pendingCustomers,\n run: async () => {\n const result = await pushCustomers()\n return { message: result.message, status: result.status }\n },\n },\n {\n key: 'push_orders',\n label: 'Enviar pedidos',\n direction: 'outbound',\n description:\n 'Cada pedido vira um pedido de venda no Bling, pago ou não — é lá que ele vira nota. Pedido cancelado não sobe.',\n confirm: {\n title: 'Enviar os pedidos para o Bling?',\n body:\n 'Cada pedido que ainda não subiu vira um pedido de venda no Bling, pago ou não. Pedido cancelado fica de fora, e um pedido já enviado não sobe duas vezes.',\n cta: 'Enviar pedidos',\n },\n pending: pendingOrders,\n run: async () => {\n const result = await pushOrders()\n return { message: result.message, status: result.status }\n },\n },\n ],\n}\n","// Bling ↔ canonical de-para. Pure, so the field-by-field agreement the brief\n// (docs/integrations/bling-integration-brief.md §5) settles is testable without\n// a Bling account.\nimport type { BlingProduto, MirroredProduct } from './types'\n\nfunction toNumber(value: unknown): number | null {\n if (value === null || value === undefined || value === '') return null\n const n = typeof value === 'number' ? value : Number(String(value).replace(',', '.'))\n return Number.isFinite(n) ? n : null\n}\n\n/**\n * One Bling product as the mirror stores it, or null when it carries no id.\n *\n * `situacao` is Bling's own on/off ('A' = ativo). It maps to archived rather\n * than to a delete: an inactive product in Bling is still a product, and this\n * connector has no vocabulary for deletion at all — see `pullProducts`.\n */\nexport function toMirroredProduct(raw: BlingProduto | null | undefined): MirroredProduct | null {\n if (!raw || raw.id === null || raw.id === undefined || raw.id === '') return null\n return {\n externalId: String(raw.id),\n sku: raw.codigo ? String(raw.codigo) : null,\n name: String(raw.nome ?? '').trim() || `Produto ${raw.id}`,\n price: toNumber(raw.preco),\n // Bling is the source of the stock number. The store mirrors it; it does not\n // decide it. See docs/integrations/bling-integration-brief.md §3.\n inventoryCount: toNumber(raw.estoque?.saldoVirtualTotal),\n status: String(raw.situacao ?? 'A').toUpperCase() === 'A' ? 'active' : 'archived',\n imageUrl: raw.imagemURL ? String(raw.imagemURL) : null,\n // Always null in practice: Bling does not return a change date at all (see\n // BlingProduto.dataAlteracao). Kept rather than deleted because the canonical\n // shape is shared with providers that do, and the run stamps its own\n // watermark either way.\n updatedAt: raw.dataAlteracao ? String(raw.dataAlteracao) : null,\n }\n}\n","// ---------------------------------------------------------------------------\n// Bling → canonical: the pull, and why it may never cancel anything.\n// ---------------------------------------------------------------------------\n// Bling has no memory of what it told us last time. There is no syncToken and\n// no tombstone: the only way to ask \"what changed\" is a date filter this client\n// computes, which is a `window` cursor. So the completeness of every run here is\n// `additive`, and that single word is what stops the engine from archiving a\n// product whose only crime was to fall outside the range.\n//\n// Everything is transport-injected — fetch, clock, sleep and the limiter — so\n// \"3000 SKUs enter without blowing 3 req/s\" is a proof rather than an impression.\n//\n// The import is split by subpath and that is load-bearing, not tidiness: the\n// edge function in ../../functions/bling-sync runs this file under Deno, where\n// `@fayz-ai/core` pulls React and the plugin registry and cannot load at all.\n// `@fayz-ai/core/connector-runtime` is the one entry written to be loadable\n// there, and it is the one specifier the app repos' functions-sync vendors.\n// `SyncResult` stays on the barrel because a type import is erased before Deno\n// ever sees it.\nimport {\n createRateLimiter,\n paginate,\n reconcileMirror,\n serializeCursor,\n sliceWindow,\n advanceWindow,\n type Completeness,\n type Cursor,\n type MirrorRecord,\n type RateLimiter,\n} from '@fayz-ai/core/connector-runtime'\nimport type { SyncResult } from '@fayz-ai/core'\nimport {\n BLING_MAX_WINDOW_MS,\n BLING_PAGE_SIZE,\n BLING_RATE_LIMIT,\n BLING_SAMPLE_SIZE,\n BLING_WINDOW_OVERLAP_MS,\n} from './limits'\nimport { toMirroredProduct } from './mapping'\nimport type { BlingProduto, MirroredProduct } from './types'\n\n/** One page of `GET /produtos`, as the caller's transport hands it over. */\nexport interface BlingProductPage {\n items: BlingProduto[]\n /** Bling has no next-page token: a short page is the last page. */\n short?: boolean\n}\n\nexport interface BlingPageRequest {\n pagina: number\n from: string\n to: string\n limite: number\n}\n\nexport interface PullProductsOptions {\n /** Where this run resumes. Absent = the first backfill. */\n cursor?: Cursor\n /** How far back a first run reaches. */\n backfillFrom?: string\n now?: number\n fetchPage(request: BlingPageRequest): Promise<BlingProductPage>\n /** Idempotent upsert into the canonical mirror. Returns whether it wrote. */\n upsert(product: MirroredProduct): Promise<boolean>\n /** Products already mirrored for this connection, for the reconciliation below. */\n linked?: MirrorRecord[]\n limiter?: RateLimiter\n pageSize?: number\n /** Stop after this many records — the `sample` phase. */\n maxRecords?: number\n maxPages?: number\n}\n\nexport interface PullProductsResult extends SyncResult {\n completeness: Completeness\n cursor: Cursor\n /** Local ids the run did NOT see and deliberately did not touch. */\n keptOutOfRange: string[]\n products: MirroredProduct[]\n pages: number\n /** Calls actually spent, so a caller can bill them against the daily budget. */\n calls: number\n}\n\n/** The window a first run asks for: `backfillFrom` (or a year back) until now. */\nexport function firstWindow(now: number, backfillFrom?: string): Extract<Cursor, { kind: 'window' }> {\n const parsed = backfillFrom ? Date.parse(backfillFrom) : NaN\n const from = Number.isFinite(parsed) ? parsed : now - BLING_MAX_WINDOW_MS\n return {\n kind: 'window',\n from: new Date(from).toISOString(),\n to: new Date(now).toISOString(),\n overlapMs: BLING_WINDOW_OVERLAP_MS,\n }\n}\n\n/** The window this run should ask for, given what the last one left behind. */\nexport function windowFor(options: Pick<PullProductsOptions, 'cursor' | 'backfillFrom' | 'now'>): Extract<Cursor, { kind: 'window' }> {\n const now = options.now ?? Date.now()\n const previous = options.cursor\n if (previous?.kind === 'window') return advanceWindow(previous, now)\n // A delta or period cursor arriving here is a connector mix-up, not a\n // recoverable state: starting over is the only honest answer.\n return firstWindow(now, options.backfillFrom)\n}\n\n/**\n * Pull the products Bling changed inside the window.\n *\n * `completeness` is hard-coded `additive` and it is not a default anyone should\n * \"improve\": Bling structurally cannot tell us a product was deleted, because\n * the question we asked was \"what changed between these two dates\". A run that\n * returned `authoritative` here would archive every product the store did not\n * happen to touch this week.\n */\nexport async function pullProducts(options: PullProductsOptions): Promise<PullProductsResult> {\n const now = options.now ?? Date.now()\n const cursor = windowFor({ cursor: options.cursor, backfillFrom: options.backfillFrom, now })\n const limiter = options.limiter ?? createRateLimiter(BLING_RATE_LIMIT)\n const limite = options.pageSize ?? BLING_PAGE_SIZE\n const maxRecords = options.maxRecords ?? Number.POSITIVE_INFINITY\n\n // A window wider than a year is a 400 from Bling, so it is sliced BEFORE the\n // first call. Discovering the cap in production means discovering it as a\n // backfill that never ran.\n const slices = sliceWindow(cursor.from, cursor.to, BLING_MAX_WINDOW_MS)\n\n const products: MirroredProduct[] = []\n const seen = new Set<string>()\n let pages = 0\n let calls = 0\n let written = 0\n let error: string | undefined\n\n try {\n for (const slice of slices) {\n if (products.length >= maxRecords) break\n const walked = await paginate<BlingProduto, BlingPageRequest>({\n first: { pagina: 1, from: slice.from, to: slice.to, limite },\n maxPages: options.maxPages ?? 1_000,\n fetchPage: async (request) => {\n await limiter.take()\n calls += 1\n const page = await options.fetchPage(request)\n pages += 1\n const items = page.items ?? []\n // Bling has no next-page token. The page is the last one when it came\n // back short — which is also why an off-by-one here silently drops a\n // whole page, the exact failure FAY-1377 was.\n const last = page.short === true || items.length < request.limite\n const enough = products.length + items.length >= maxRecords\n return { items, next: last || enough ? null : { ...request, pagina: request.pagina + 1 } }\n },\n })\n\n for (const raw of walked.items) {\n if (products.length >= maxRecords) break\n const mapped = toMirroredProduct(raw)\n if (!mapped) continue\n seen.add(mapped.externalId)\n products.push(mapped)\n if (await options.upsert(mapped)) written += 1\n }\n }\n } catch (caught) {\n error = String((caught as Error)?.message ?? caught)\n }\n\n // The whole point. Under `additive` this returns nothing to cancel and names\n // what it refused to touch, so the refusal is visible in the run rather than\n // being an absence of behaviour.\n const reconciled = reconcileMirror({\n completeness: 'additive',\n observed: seen,\n linked: options.linked ?? [],\n })\n\n const advanced: Cursor = error ? cursor : { ...cursor }\n return {\n status: error ? 'error' : products.length >= maxRecords ? 'partial' : 'success',\n completeness: 'additive',\n fetched: products.length,\n written,\n cursor: advanced,\n keptOutOfRange: reconciled.keptOutOfRange,\n products,\n pages,\n calls,\n error,\n stats: {\n pages,\n calls,\n window_from: cursor.from,\n window_to: cursor.to,\n slices: slices.length,\n kept_out_of_range: reconciled.keptOutOfRange.length,\n cursor: serializeCursor(advanced),\n },\n }\n}\n\n/**\n * The fast half of the first load: one page, seconds, enough to design against.\n *\n * It is a different call and not a flag because it makes a different promise —\n * `partial` by construction, never a basis for deciding anything is missing.\n */\nexport function sampleProducts(\n options: Omit<PullProductsOptions, 'maxRecords' | 'maxPages'> & { sampleSize?: number },\n): Promise<PullProductsResult> {\n return pullProducts({\n ...options,\n maxRecords: options.sampleSize ?? BLING_SAMPLE_SIZE,\n maxPages: 1,\n // A sample never reconciles: it saw one page of one window and knows less\n // about absence than any other run in the system.\n linked: [],\n })\n}\n","// ---------------------------------------------------------------------------\n// The two ways Bling reaches US, and neither of them knows a tenant.\n// ---------------------------------------------------------------------------\n// 1. OAuth started at the PROVIDER. The shopkeeper authorises inside Bling's\n// extension centre, so the callback arrives with no `state` and possibly no\n// Fayz account behind it at all. The ingress presumes a tenant in the URL,\n// which is exactly the premise this breaks. The answer is a connection that\n// exists before a tenant does, keyed by the account Bling DID name, and\n// claimed at signup — this is an acquisition channel, not an edge case.\n//\n// 2. Webhooks. Bling announces an account, never a tenant, and requires a 2xx\n// within 5 seconds or it DISABLES the tenant's configuration. So the\n// response path verifies, routes and enqueues; it processes nothing.\n//\n// Both land on `provider_account_key` and its partial unique index in\n// packages/db/migrations/029_connections.sql. Pure functions, so the routing is\n// provable without a Bling account and without a secret anywhere near a fixture.\nimport { BLING_CONNECTOR_ID } from './limits'\n\n/** What the platform learned from a Bling OAuth callback. */\nexport interface BlingCallback {\n /** Present only when Fayz started the flow. Absent on the Bling-first path. */\n state?: string | null\n /** Bling's own id for the authorising account. The only stable handle we get. */\n companyId?: string | null\n}\n\nexport type CallbackRoute =\n /** Fayz started it: the state names the tenant, and the connection is theirs. */\n | { mode: 'tenant'; state: string; providerAccountKey: string | null }\n /**\n * Bling started it: park the grant against the account, claimable at signup.\n * `source` is what makes the channel measurable instead of anecdotal.\n */\n | { mode: 'orphan'; providerAccountKey: string; source: string }\n /** Nothing identifies the grant. Nothing can be done with it later either. */\n | { mode: 'reject'; reason: string }\n\n/** Where Bling-first connections are attributed from. */\nexport const BLING_MARKETPLACE_SOURCE = 'bling_marketplace'\n\n/**\n * Decide what a callback becomes. A missing `state` is NOT an error — treating\n * it as one throws away the shopkeeper who arrived from Bling's own storefront.\n */\nexport function routeCallback(callback: BlingCallback): CallbackRoute {\n const account = callback.companyId ? String(callback.companyId).trim() : ''\n if (callback.state) return { mode: 'tenant', state: callback.state, providerAccountKey: account || null }\n if (account) return { mode: 'orphan', providerAccountKey: account, source: BLING_MARKETPLACE_SOURCE }\n return { mode: 'reject', reason: 'callback carried neither state nor companyId' }\n}\n\n/** The identity an orphan connection is stored under until someone claims it. */\nexport function orphanConnection(route: Extract<CallbackRoute, { mode: 'orphan' }>) {\n return {\n connectorId: BLING_CONNECTOR_ID,\n // The Bling company is the account, so it is also the instance key: two\n // companies are two connections, not two rows fighting over one.\n instanceKey: route.providerAccountKey,\n providerAccountKey: route.providerAccountKey,\n status: 'pending' as const,\n settings: { companyId: route.providerAccountKey, source: route.source, stockOwner: 'bling' as const },\n }\n}\n\n// ---------------------------------------------------------------------------\n// Webhooks\n// ---------------------------------------------------------------------------\n\nexport interface WebhookRequest {\n /** Raw body. Signed bytes, so it is verified before it is parsed. */\n body: string\n signature: string | null\n /** The account the event belongs to, read after verification. */\n providerAccountKey?: string | null\n}\n\nexport interface AcceptWebhookOptions {\n /**\n * Constant-time HMAC-SHA256 comparison, INJECTED. No key, no crypto import and\n * no fixture in this repo ever holds one — the secret lives in the platform\n * credential store and is handed to the edge function per call.\n */\n verify(body: string, signature: string | null): Promise<boolean> | boolean\n /** Find the tenant behind the account. Backed by uq_plg_connections_account_key. */\n resolve(providerAccountKey: string): Promise<{ tenantId: string; connectionId: string } | null>\n /** Hand the work to the queue. MUST NOT be awaited on the response path. */\n enqueue(job: { tenantId: string; connectionId: string; body: string }): Promise<void> | void\n onError?(error: unknown): void\n}\n\nexport interface WebhookVerdict {\n status: number\n /** Whether work was handed to the queue and is still outstanding. */\n queued: boolean\n reason?: string\n}\n\n/**\n * Answer Bling, then let the work happen.\n *\n * The 200 is not optimism: an unverified body was already rejected and a routed\n * job is already durable. What the 200 declines to wait for is the processing —\n * because a Bling webhook that has not been answered in 5 seconds does not\n * retry, it turns the tenant's integration off, and the tenant finds out weeks\n * later as \"Bling stopped working\".\n *\n * An unroutable account still answers 200. A 4xx there would make Bling disable\n * a configuration over an account we simply have not been given yet — the\n * orphan case above, arriving by webhook instead of by callback.\n */\nexport async function acceptWebhook(request: WebhookRequest, options: AcceptWebhookOptions): Promise<WebhookVerdict> {\n let ok = false\n try {\n ok = await options.verify(request.body, request.signature)\n } catch (error) {\n options.onError?.(error)\n ok = false\n }\n // The one refusal worth making: an unsigned body is not from Bling, and\n // answering 200 to it would let anyone move a tenant's stock.\n if (!ok) return { status: 401, queued: false, reason: 'signature' }\n\n const account = request.providerAccountKey ? String(request.providerAccountKey) : ''\n if (!account) return { status: 200, queued: false, reason: 'no account in payload' }\n\n let target: { tenantId: string; connectionId: string } | null = null\n try {\n target = await options.resolve(account)\n } catch (error) {\n options.onError?.(error)\n }\n if (!target) return { status: 200, queued: false, reason: 'unclaimed account' }\n\n try {\n await options.enqueue({ ...target, body: request.body })\n } catch (error) {\n options.onError?.(error)\n // Bling does not guarantee order and will re-deliver; a 5xx is the honest\n // answer when the job did not become durable, and it does not disable the\n // configuration the way a 4xx does.\n return { status: 500, queued: false, reason: 'enqueue failed' }\n }\n\n return { status: 200, queued: true }\n}\n","import type { AnalyticsCardDef, AnalyticsFilterDef, AnalyticsMeasure } from '@fayz-ai/core'\nimport { tl } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// The retail analytics pack.\n//\n// Owned by plugin-shop because shop owns the DATA: \"sales by product\" means the\n// same thing whether the tenant is a salon or a storefront, and declaring it\n// once here beats copying it into every vertical's config. A vertical pack\n// curates this list (order, placement, labels); it does not restate it.\n//\n// Every card reads a registered read model from migration 0066 and goes through\n// the generic analytics_run engine — no card needs its own SQL. A card is at\n// the same time a tile on /analytics, a row in /analytics/reports and a full\n// report at /analytics/reports/<id>: one definition, three sizes, which is what\n// stops a headline KPI and the report behind it from disagreeing.\n// ---------------------------------------------------------------------------\n\nconst ORDERS = 'plg_shop_rep_orders'\nconst ITEMS = 'plg_shop_rep_order_items'\nconst CUSTOMERS = 'plg_shop_rep_customers'\nconst PRODUCTS = 'plg_shop_rep_products'\n\nconst CANONICAL = 'public.plg_shop_orders'\n\n// --- Categories -------------------------------------------------------------\n// The chip on every report row and the grouping on the list. Declared once:\n// typing 'Vendas' in fourteen places is how a catalogue grows two categories\n// that differ by an accent.\n\nconst CAT = {\n sales: tl('Sales', 'Vendas'),\n orders: tl('Orders', 'Pedidos'),\n products: tl('Products', 'Produtos'),\n customers: tl('Customers', 'Clientes'),\n inventory: tl('Inventory', 'Estoque'),\n fulfillment: tl('Fulfillment', 'Entrega'),\n marketing: tl('Marketing', 'Marketing'),\n}\n\n// --- Shared filters, grouped for the categorized picker ---------------------\n\nconst financialStatus: AnalyticsFilterDef = {\n key: 'financial_status',\n label: tl('Payment status', 'Situação do pagamento'),\n type: 'multiselect',\n group: tl('Finance and payments', 'Financeiro e pagamentos'),\n options: [\n { label: tl('Paid', 'Pago'), value: 'paid' },\n { label: tl('Pending', 'Pendente'), value: 'pending' },\n { label: tl('Partially paid', 'Pago parcialmente'), value: 'partially_paid' },\n { label: tl('Refunded', 'Estornado'), value: 'refunded' },\n { label: tl('Partially refunded', 'Estornado parcialmente'), value: 'partially_refunded' },\n { label: tl('Voided', 'Cancelado'), value: 'voided' },\n ],\n}\n\nconst fulfillmentStatus: AnalyticsFilterDef = {\n key: 'fulfillment_status',\n label: tl('Fulfillment status', 'Situação da entrega'),\n type: 'multiselect',\n group: tl('Fulfillment', 'Entrega'),\n options: [\n { label: tl('Fulfilled', 'Enviado'), value: 'fulfilled' },\n { label: tl('Partially fulfilled', 'Enviado parcialmente'), value: 'partially_fulfilled' },\n { label: tl('Unfulfilled', 'Não enviado'), value: 'unfulfilled' },\n ],\n}\n\nconst orderStatus: AnalyticsFilterDef = {\n key: 'status',\n label: tl('Order status', 'Situação do pedido'),\n type: 'multiselect',\n group: tl('Orders', 'Pedidos'),\n options: [\n { label: tl('Open', 'Aberto'), value: 'open' },\n { label: tl('Archived', 'Arquivado'), value: 'archived' },\n { label: tl('Cancelled', 'Cancelado'), value: 'cancelled' },\n ],\n}\n\n// The items view carries the order's payment state under a prefixed name, so\n// the same picker narrows a line-item card without a second set of options.\nconst itemFinancialStatus: AnalyticsFilterDef = {\n ...financialStatus,\n key: 'order_financial_status',\n}\n\nconst productStatus: AnalyticsFilterDef = {\n key: 'status',\n label: tl('Product status', 'Situação do produto'),\n type: 'multiselect',\n group: tl('Inventory', 'Estoque'),\n options: [\n { label: tl('Active', 'Ativo'), value: 'active' },\n { label: tl('Draft', 'Rascunho'), value: 'draft' },\n { label: tl('Archived', 'Arquivado'), value: 'archived' },\n ],\n}\n\nconst orderFilters = [financialStatus, fulfillmentStatus, orderStatus]\n\n// --- Reusable measure fragments ---------------------------------------------\n\nconst M = {\n grossSales: { key: 'gross_sales', label: tl('Gross sales', 'Vendas brutas'), agg: 'sum', format: 'currency' },\n discounts: { key: 'discounts', label: tl('Discounts', 'Descontos'), agg: 'sum', format: 'currency' },\n netSales: { key: 'net_sales', label: tl('Net sales', 'Vendas líquidas'), agg: 'sum', format: 'currency' },\n shipping: { key: 'shipping', label: tl('Shipping', 'Frete'), agg: 'sum', format: 'currency' },\n taxes: { key: 'taxes', label: tl('Taxes', 'Impostos'), agg: 'sum', format: 'currency' },\n total: { key: 'total', label: tl('Total sales', 'Vendas totais'), agg: 'sum', format: 'currency' },\n paid: { key: 'paid_total', label: tl('Collected', 'Recebido'), agg: 'sum', format: 'currency' },\n orders: { key: 'orders', label: tl('Orders', 'Pedidos'), agg: 'count', format: 'number' },\n} satisfies Record<string, AnalyticsMeasure>\n\n/** Average order value — a ratio of two real measures, never an avg of ratios. */\nconst AOV: AnalyticsMeasure = {\n key: 'aov',\n label: tl('Average order value', 'Ticket médio'),\n agg: 'ratio',\n ratioOf: ['total', 'orders'],\n format: 'currency',\n}\n\nexport function buildShopAnalyticsCards(): AnalyticsCardDef[] {\n const base = { domain: 'shop', canonicalOwner: CANONICAL, compare: true }\n\n return [\n // =======================================================================\n // Row 1 — the four numbers a merchant opens the page for\n // =======================================================================\n {\n ...base,\n id: 'shop.total-sales',\n name: tl('Total sales', 'Vendas totais'),\n description: tl(\n 'Gross sales less discounts, plus shipping and taxes. What the store billed, paid or not.',\n 'Vendas brutas menos descontos, mais frete e impostos. O que a loja faturou, pago ou não.',\n ),\n icon: 'CircleDollarSign',\n category: CAT.sales,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [M.total],\n filters: orderFilters,\n },\n viz: { type: 'kpi', spark: true },\n dashboard: { span: 1, order: 0 },\n },\n {\n // Deliberately beside Total sales and not instead of it. A store on Pix\n // bills long before it is paid, and a merchant reading only the first\n // number sees money they cannot spend.\n ...base,\n id: 'shop.collected',\n name: tl('Collected', 'Recebido'),\n description: tl(\n 'Of everything billed in the period, the part that is actually paid.',\n 'De tudo o que foi faturado no período, a parte que já está paga.',\n ),\n icon: 'Banknote',\n category: CAT.sales,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [M.paid],\n filters: orderFilters,\n },\n viz: { type: 'kpi', spark: true },\n dashboard: { span: 1, order: 1 },\n },\n {\n ...base,\n id: 'shop.orders',\n name: tl('Orders', 'Pedidos'),\n description: tl(\n 'Orders placed in the period, cancellations included.',\n 'Pedidos feitos no período, cancelados inclusive.',\n ),\n icon: 'ShoppingCart',\n category: CAT.orders,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [M.orders],\n filters: orderFilters,\n },\n viz: { type: 'kpi', spark: true },\n dashboard: { span: 1, order: 2 },\n },\n {\n ...base,\n id: 'shop.aov',\n name: tl('Average order value', 'Ticket médio'),\n description: tl(\n 'Total sales over order count — the ratio of the totals, not the average of each order.',\n 'Vendas totais sobre número de pedidos — a razão dos totais, não a média de cada pedido.',\n ),\n icon: 'Receipt',\n category: CAT.sales,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n measures: [M.total, M.orders, AOV],\n filters: orderFilters,\n },\n viz: { type: 'kpi', measures: ['aov'] },\n dashboard: { span: 1, order: 3 },\n },\n\n // =======================================================================\n // Row 2 — basket and loyalty\n // =======================================================================\n {\n ...base,\n id: 'shop.units-per-order',\n name: tl('Items per order', 'Itens por pedido'),\n description: tl(\n 'Units sold over distinct orders. Rises when cross-sell works.',\n 'Unidades vendidas sobre pedidos distintos. Sobe quando a venda casada funciona.',\n ),\n icon: 'Boxes',\n category: CAT.orders,\n grain: 'order_item',\n query: {\n source: { kind: 'view', name: ITEMS },\n measures: [\n { key: 'units', label: tl('Units', 'Unidades'), agg: 'sum', column: 'quantity', format: 'number' },\n // count_distinct and not count(*): the row here is a LINE, and\n // counting lines would make \"items per order\" always exactly 1.\n { key: 'orders', label: tl('Orders', 'Pedidos'), agg: 'count_distinct', column: 'order_id', format: 'number' },\n {\n key: 'units_per_order', label: tl('Items per order', 'Itens por pedido'),\n agg: 'ratio', ratioOf: ['units', 'orders'], format: 'number',\n },\n ],\n filters: [itemFinancialStatus],\n },\n viz: { type: 'kpi', measures: ['units_per_order'] },\n dashboard: { span: 1, order: 4 },\n },\n {\n ...base,\n id: 'shop.units-sold',\n name: tl('Units sold', 'Unidades vendidas'),\n description: tl('Total units leaving the shelf in the period.', 'Total de unidades que saíram da prateleira no período.'),\n icon: 'Package',\n category: CAT.products,\n grain: 'order_item',\n query: {\n source: { kind: 'view', name: ITEMS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [{ key: 'units', label: tl('Units', 'Unidades'), agg: 'sum', column: 'quantity', format: 'number' }],\n filters: [itemFinancialStatus],\n },\n viz: { type: 'kpi', spark: true },\n dashboard: { span: 1, order: 5 },\n },\n {\n ...base,\n id: 'shop.returning-customer-rate',\n name: tl('Returning customer rate', 'Taxa de recompra'),\n description: tl(\n 'Share of orders placed by someone who had ordered before.',\n 'Fatia dos pedidos feitos por quem já havia comprado antes.',\n ),\n icon: 'Repeat',\n category: CAT.customers,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n measures: [\n { key: 'returning', label: tl('Returning orders', 'Pedidos de quem já comprou'), agg: 'sum', column: 'is_returning', format: 'number' },\n M.orders,\n {\n key: 'returning_rate', label: tl('Returning customer rate', 'Taxa de recompra'),\n agg: 'ratio', ratioOf: ['returning', 'orders'], scale: 100, format: 'percent',\n },\n ],\n filters: orderFilters,\n },\n viz: { type: 'kpi', measures: ['returning_rate'] },\n dashboard: { span: 1, order: 6 },\n },\n {\n ...base,\n id: 'shop.cancellation-rate',\n name: tl('Cancellation rate', 'Taxa de cancelamento'),\n description: tl(\n 'Share of orders in the period that were cancelled.',\n 'Fatia dos pedidos do período que acabaram cancelados.',\n ),\n icon: 'XCircle',\n category: CAT.orders,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n measures: [\n { key: 'cancelled', label: tl('Cancelled orders', 'Pedidos cancelados'), agg: 'sum', column: 'is_cancelled', format: 'number' },\n M.orders,\n {\n key: 'cancellation_rate', label: tl('Cancellation rate', 'Taxa de cancelamento'),\n agg: 'ratio', ratioOf: ['cancelled', 'orders'], scale: 100, format: 'percent',\n },\n ],\n filters: orderFilters,\n },\n viz: { type: 'kpi', measures: ['cancellation_rate'] },\n dashboard: { span: 1, order: 7 },\n },\n\n // =======================================================================\n // Row 3 — operations and what is sitting in the warehouse\n // =======================================================================\n {\n ...base,\n id: 'shop.days-to-fulfillment',\n name: tl('Time to dispatch', 'Tempo até o envio'),\n description: tl(\n 'Average time from order placed to first shipment. Orders never shipped are excluded, not counted as zero.',\n 'Tempo médio do pedido até a primeira remessa. Pedidos que nunca saíram ficam de fora, não entram como zero.',\n ),\n icon: 'Clock',\n category: CAT.fulfillment,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n measures: [{\n key: 'hours_to_fulfillment',\n label: tl('Time to dispatch', 'Tempo até o envio'),\n agg: 'avg',\n format: 'duration',\n }],\n filters: orderFilters,\n },\n viz: { type: 'kpi' },\n dashboard: { span: 1, order: 8 },\n },\n {\n ...base,\n id: 'shop.discounts-given',\n name: tl('Discounts given', 'Descontos concedidos'),\n description: tl(\n 'What coupons and promotions cost the store in the period.',\n 'Quanto os cupons e promoções custaram à loja no período.',\n ),\n icon: 'TicketPercent',\n category: CAT.marketing,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [M.discounts],\n filters: orderFilters,\n },\n viz: { type: 'kpi', spark: true },\n dashboard: { span: 1, order: 9 },\n },\n {\n // Snapshots: what is in the warehouse now, not what was created in the\n // last 30 days. `dateColumn: null` is what stops the range picker from\n // silently answering a different question.\n ...base,\n compare: false,\n id: 'shop.inventory-value',\n name: tl('Inventory value', 'Valor do estoque'),\n description: tl(\n 'Retail value of stock currently held. A snapshot — the date range does not apply.',\n 'Valor de venda do estoque parado hoje. É uma foto — o período selecionado não se aplica.',\n ),\n icon: 'Warehouse',\n category: CAT.inventory,\n grain: 'product',\n query: {\n source: { kind: 'view', name: PRODUCTS },\n dateColumn: null,\n measures: [{ key: 'inventory_retail_value', label: tl('Inventory value', 'Valor do estoque'), agg: 'sum', format: 'currency' }],\n filters: [productStatus],\n },\n viz: { type: 'kpi' },\n dashboard: { span: 1, order: 10 },\n },\n {\n ...base,\n compare: false,\n id: 'shop.out-of-stock',\n name: tl('Out of stock', 'Sem estoque'),\n description: tl(\n 'Active products with zero inventory — sales the storefront is turning away.',\n 'Produtos ativos com estoque zerado — vendas que a loja está recusando.',\n ),\n icon: 'PackageX',\n category: CAT.inventory,\n grain: 'product',\n query: {\n source: { kind: 'view', name: PRODUCTS },\n dateColumn: null,\n measures: [{ key: 'is_out_of_stock', label: tl('Out of stock', 'Sem estoque'), agg: 'sum', format: 'number' }],\n filters: [productStatus],\n },\n viz: { type: 'kpi' },\n dashboard: { span: 1, order: 11 },\n },\n\n // =======================================================================\n // Charts — the shape behind the headline numbers\n // =======================================================================\n {\n ...base,\n id: 'shop.sales-over-time',\n name: tl('Sales over time', 'Vendas ao longo do tempo'),\n description: tl(\n 'Billed against collected, bucketed by day, week or month depending on the range.',\n 'Faturado contra recebido, agrupado por dia, semana ou mês conforme o período.',\n ),\n icon: 'TrendingUp',\n category: CAT.sales,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [M.total, M.paid],\n filters: orderFilters,\n defaultSort: 'created_at',\n defaultSortDir: 'asc',\n },\n viz: { type: 'area' },\n dashboard: { span: 2, order: 20 },\n },\n {\n ...base,\n id: 'shop.orders-over-time',\n name: tl('Orders over time', 'Pedidos ao longo do tempo'),\n description: tl('Order volume across the period.', 'Volume de pedidos ao longo do período.'),\n icon: 'Activity',\n category: CAT.orders,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [M.orders],\n filters: orderFilters,\n defaultSort: 'created_at',\n defaultSortDir: 'asc',\n },\n viz: { type: 'line' },\n dashboard: { span: 2, order: 21 },\n },\n {\n ...base,\n id: 'shop.sales-by-product',\n name: tl('Sales by product', 'Vendas por produto'),\n description: tl(\n 'Revenue per product at line-item grain, so a multi-product order counts once per line.',\n 'Receita por produto no grão da linha, então um pedido com vários produtos conta uma vez por linha.',\n ),\n icon: 'Package',\n category: CAT.products,\n grain: 'order_item',\n query: {\n source: { kind: 'view', name: ITEMS },\n dimensions: [{ key: 'product_name', label: tl('Product', 'Produto') }],\n measures: [\n { key: 'revenue', label: tl('Revenue', 'Receita'), agg: 'sum', column: 'line_total', format: 'currency' },\n { key: 'units', label: tl('Units', 'Unidades'), agg: 'sum', column: 'quantity', format: 'number' },\n ],\n filters: [itemFinancialStatus],\n defaultSort: 'revenue',\n defaultSortDir: 'desc',\n },\n viz: { type: 'breakdown', measures: ['revenue'], limit: 6 },\n dashboard: { span: 2, order: 22 },\n },\n {\n ...base,\n id: 'shop.sales-by-category',\n name: tl('Sales by category', 'Vendas por categoria'),\n description: tl('Revenue split across catalogue categories.', 'Receita dividida entre as categorias do catálogo.'),\n icon: 'FolderTree',\n category: CAT.products,\n grain: 'order_item',\n query: {\n source: { kind: 'view', name: ITEMS },\n dimensions: [{ key: 'category_name', label: tl('Category', 'Categoria') }],\n measures: [{ key: 'revenue', label: tl('Revenue', 'Receita'), agg: 'sum', column: 'line_total', format: 'currency' }],\n filters: [itemFinancialStatus],\n defaultSort: 'revenue',\n defaultSortDir: 'desc',\n },\n viz: { type: 'donut' },\n dashboard: { span: 2, order: 23 },\n },\n {\n ...base,\n id: 'shop.sales-by-payment-status',\n name: tl('Sales by payment status', 'Vendas por situação do pagamento'),\n description: tl('Where the money sits: paid, pending, refunded.', 'Onde o dinheiro está: pago, pendente, estornado.'),\n icon: 'CreditCard',\n category: CAT.sales,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'financial_status', label: tl('Payment status', 'Situação do pagamento') }],\n measures: [M.total, M.orders],\n filters: [orderStatus],\n defaultSort: 'total',\n defaultSortDir: 'desc',\n },\n viz: { type: 'breakdown', measures: ['total'] },\n dashboard: { span: 2, order: 24 },\n },\n {\n ...base,\n id: 'shop.orders-by-fulfillment-status',\n name: tl('Orders by fulfillment status', 'Pedidos por situação da entrega'),\n description: tl(\n 'How much of the period is still waiting to leave the warehouse.',\n 'Quanto do período ainda está esperando para sair do estoque.',\n ),\n icon: 'Truck',\n category: CAT.fulfillment,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'fulfillment_status', label: tl('Fulfillment status', 'Situação da entrega') }],\n measures: [M.orders, M.total],\n filters: [financialStatus, orderStatus],\n defaultSort: 'orders',\n defaultSortDir: 'desc',\n },\n viz: { type: 'breakdown', measures: ['orders'] },\n dashboard: { span: 2, order: 25 },\n },\n {\n ...base,\n id: 'shop.new-customers',\n name: tl('New customers', 'Novos clientes'),\n description: tl('Customers acquired in the period, by signup date.', 'Clientes conquistados no período, pela data de cadastro.'),\n icon: 'UserPlus',\n category: CAT.customers,\n grain: 'customer',\n query: {\n source: { kind: 'view', name: CUSTOMERS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [{ key: 'customers', label: tl('New customers', 'Novos clientes'), agg: 'count', format: 'number' }],\n defaultSort: 'created_at',\n defaultSortDir: 'asc',\n },\n viz: { type: 'bar' },\n dashboard: { span: 2, order: 26 },\n },\n {\n ...base,\n id: 'shop.aov-over-time',\n name: tl('Average order value over time', 'Ticket médio ao longo do tempo'),\n description: tl(\n 'AOV per bucket, computed as that bucket’s total over its own order count.',\n 'Ticket médio por período, calculado como o total daquele período sobre os pedidos dele.',\n ),\n icon: 'LineChart',\n category: CAT.sales,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [M.total, M.orders, AOV],\n filters: orderFilters,\n defaultSort: 'created_at',\n defaultSortDir: 'asc',\n },\n viz: { type: 'line', measures: ['aov'] },\n dashboard: { span: 2, order: 27 },\n },\n\n // =======================================================================\n // Tables on the overview\n // =======================================================================\n {\n ...base,\n id: 'shop.sales-breakdown',\n name: tl('Sales breakdown', 'Composição das vendas'),\n description: tl(\n 'The money chain: gross sales → discounts → net sales → shipping and taxes → total.',\n 'A cadeia do dinheiro: vendas brutas → descontos → vendas líquidas → frete e impostos → total.',\n ),\n icon: 'Layers',\n category: CAT.sales,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n measures: [M.grossSales, M.discounts, M.netSales, M.shipping, M.taxes, M.total, M.paid],\n filters: orderFilters,\n },\n viz: { type: 'table' },\n dashboard: { span: 2, order: 30 },\n },\n {\n ...base,\n compare: false,\n id: 'shop.low-stock',\n name: tl('Running low', 'Estoque acabando'),\n description: tl(\n 'The products closest to zero, lowest first. A snapshot — the date range does not apply.',\n 'Os produtos mais perto do zero, do menor para o maior. É uma foto — o período não se aplica.',\n ),\n icon: 'PackageMinus',\n category: CAT.inventory,\n grain: 'product',\n query: {\n source: { kind: 'view', name: PRODUCTS },\n dateColumn: null,\n dimensions: [{ key: 'product_name', label: tl('Product', 'Produto') }],\n measures: [\n { key: 'inventory_count', label: tl('On hand', 'Em estoque'), agg: 'sum', format: 'number' },\n { key: 'units_sold', label: tl('Units sold', 'Vendidos'), agg: 'sum', format: 'number' },\n ],\n // Active products only by default: a draft with no stock is not a\n // shortage, it is a product that was never put on sale.\n filters: [{ ...productStatus, defaultValue: ['active'] }],\n defaultSort: 'inventory_count',\n defaultSortDir: 'asc',\n },\n viz: { type: 'table', limit: 6 },\n dashboard: { span: 2, order: 31 },\n },\n\n // =======================================================================\n // Report-list only — the long tail, reachable from /analytics/reports\n // =======================================================================\n {\n ...base,\n id: 'shop.sales-by-discount-code',\n name: tl('Sales by discount code', 'Vendas por cupom'),\n description: tl(\n 'Which coupons are actually being used, what they brought in and what they cost.',\n 'Quais cupons estão realmente sendo usados, o que trouxeram e o que custaram.',\n ),\n icon: 'TicketCheck',\n category: CAT.marketing,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'discount_code', label: tl('Discount code', 'Cupom') }],\n measures: [M.orders, M.discounts, M.total, M.paid],\n filters: orderFilters,\n defaultSort: 'discounts',\n defaultSortDir: 'desc',\n },\n viz: { type: 'table' },\n },\n {\n ...base,\n compare: false,\n id: 'shop.sell-through',\n name: tl('Sell-through by product', 'Giro por produto'),\n description: tl(\n 'Units sold as a share of everything ever held — sold plus still on hand. A snapshot; the date range does not apply.',\n 'Unidades vendidas sobre tudo o que já se teve — vendido mais o que está em estoque. É uma foto; o período não se aplica.',\n ),\n icon: 'Percent',\n category: CAT.inventory,\n grain: 'product',\n query: {\n source: { kind: 'view', name: PRODUCTS },\n dateColumn: null,\n dimensions: [{ key: 'product_name', label: tl('Product', 'Produto') }],\n measures: [\n { key: 'units_sold', label: tl('Units sold', 'Vendidos'), agg: 'sum', format: 'number' },\n { key: 'inventory_count', label: tl('On hand', 'Em estoque'), agg: 'sum', format: 'number' },\n // The denominator is a column on the read model, not sold+on-hand\n // recomputed here: summing the two separately and dividing is the same\n // arithmetic only while no product is missing from one of them.\n { key: 'units_ever_held', label: tl('Ever held', 'Total já tido'), agg: 'sum', format: 'number' },\n {\n key: 'sell_through', label: tl('Sell-through', 'Giro'),\n agg: 'ratio', ratioOf: ['units_sold', 'units_ever_held'], scale: 100, format: 'percent',\n },\n ],\n filters: [productStatus],\n defaultSort: 'units_sold',\n defaultSortDir: 'desc',\n },\n viz: { type: 'table' },\n },\n {\n ...base,\n compare: false,\n id: 'shop.top-customers',\n name: tl('Top customers by spend', 'Melhores clientes'),\n description: tl(\n 'Lifetime spend per customer. A snapshot of the customer base, not of the period.',\n 'Gasto de vida por cliente. Uma foto da base, não do período.',\n ),\n icon: 'Users',\n category: CAT.customers,\n grain: 'customer',\n query: {\n source: { kind: 'view', name: CUSTOMERS },\n dateColumn: null,\n dimensions: [\n {\n key: 'customer_name', label: tl('Customer', 'Cliente'),\n person: { idKey: 'customer_id', kind: 'shop_customer' },\n },\n // Grouped on but never shown. It is what the name links to — and also\n // what stops two customers called \"Silva\" from being reported as one.\n { key: 'customer_id', label: tl('Customer id', 'ID do cliente'), hidden: true },\n ],\n measures: [\n { key: 'total_spent', label: tl('Total spent', 'Total gasto'), agg: 'sum', format: 'currency' },\n { key: 'orders_count', label: tl('Orders', 'Pedidos'), agg: 'sum', format: 'number' },\n { key: 'avg_order_value', label: tl('Average order', 'Ticket médio'), agg: 'avg', format: 'currency' },\n ],\n defaultSort: 'total_spent',\n defaultSortDir: 'desc',\n },\n viz: { type: 'table' },\n },\n\n // --- Detail listings: raw rows, sortable, searchable, exportable --------\n // No dimensions and no measures, which is what routes them past the\n // aggregate engine to a plain paged SELECT over the read model.\n {\n ...base,\n id: 'shop.orders-detail',\n name: tl('Order list', 'Lista de pedidos'),\n description: tl(\n 'Every order in the period with its money breakdown and both statuses.',\n 'Todos os pedidos do período com a composição do valor e as duas situações.',\n ),\n icon: 'ShoppingBag',\n category: CAT.orders,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n filters: orderFilters,\n defaultSort: 'created_at',\n defaultSortDir: 'desc',\n },\n viz: { type: 'table' },\n columns: [\n { key: 'created_at', label: tl('Date', 'Data'), type: 'date', sortable: true },\n { key: 'order_number', label: tl('Order', 'Pedido'), type: 'number', sortable: true },\n {\n key: 'customer_name', label: tl('Customer', 'Cliente'),\n type: 'person', idKey: 'customer_id', personKind: 'shop_customer',\n },\n { key: 'customer_email', label: tl('Email', 'E-mail'), type: 'email' },\n { key: 'financial_status', label: tl('Payment', 'Pagamento'), type: 'text' },\n { key: 'fulfillment_status', label: tl('Fulfillment', 'Entrega'), type: 'text' },\n { key: 'net_sales', label: tl('Net sales', 'Vendas líquidas'), type: 'currency', aggregate: 'sum', sortable: true },\n { key: 'total', label: tl('Total', 'Total'), type: 'currency', aggregate: 'sum', sortable: true },\n ],\n },\n {\n ...base,\n id: 'shop.order-items-detail',\n name: tl('Sold items', 'Itens vendidos'),\n description: tl(\n 'Every line sold, joined to its product and category.',\n 'Cada linha vendida, ligada ao seu produto e categoria.',\n ),\n icon: 'List',\n category: CAT.products,\n grain: 'order_item',\n query: {\n source: { kind: 'view', name: ITEMS },\n filters: [itemFinancialStatus],\n defaultSort: 'created_at',\n defaultSortDir: 'desc',\n },\n viz: { type: 'table' },\n columns: [\n { key: 'created_at', label: tl('Date', 'Data'), type: 'date', sortable: true },\n { key: 'order_number', label: tl('Order', 'Pedido'), type: 'number', sortable: true },\n { key: 'product_name', label: tl('Product', 'Produto'), type: 'text' },\n { key: 'sku', label: 'SKU', type: 'text' },\n { key: 'category_name', label: tl('Category', 'Categoria'), type: 'text' },\n { key: 'quantity', label: tl('Qty', 'Qtd'), type: 'number', aggregate: 'sum', sortable: true },\n { key: 'unit_price', label: tl('Unit price', 'Preço unit.'), type: 'currency' },\n { key: 'line_total', label: tl('Total', 'Total'), type: 'currency', aggregate: 'sum', sortable: true },\n ],\n },\n {\n ...base,\n compare: false,\n id: 'shop.products-detail',\n name: tl('Catalogue and stock', 'Catálogo e estoque'),\n description: tl(\n 'Every product with price, stock on hand and lifetime sales. A snapshot — the date range does not apply.',\n 'Cada produto com preço, estoque e vendas de vida. É uma foto — o período não se aplica.',\n ),\n icon: 'Boxes',\n category: CAT.inventory,\n grain: 'product',\n query: {\n source: { kind: 'view', name: PRODUCTS },\n dateColumn: null,\n filters: [productStatus],\n defaultSort: 'revenue',\n defaultSortDir: 'desc',\n },\n viz: { type: 'table' },\n columns: [\n { key: 'product_name', label: tl('Product', 'Produto'), type: 'text' },\n { key: 'sku', label: 'SKU', type: 'text' },\n { key: 'category_name', label: tl('Category', 'Categoria'), type: 'text' },\n { key: 'status', label: tl('Status', 'Situação'), type: 'text' },\n { key: 'price', label: tl('Price', 'Preço'), type: 'currency', sortable: true },\n { key: 'inventory_count', label: tl('On hand', 'Em estoque'), type: 'number', aggregate: 'sum', sortable: true },\n { key: 'units_sold', label: tl('Units sold', 'Vendidos'), type: 'number', aggregate: 'sum', sortable: true },\n { key: 'revenue', label: tl('Revenue', 'Receita'), type: 'currency', aggregate: 'sum', sortable: true },\n { key: 'inventory_retail_value', label: tl('Stock value', 'Valor em estoque'), type: 'currency', aggregate: 'sum', sortable: true },\n ],\n },\n {\n ...base,\n id: 'shop.customers-detail',\n name: tl('Customer list', 'Lista de clientes'),\n description: tl(\n 'Customers acquired in the period, with what they have spent since.',\n 'Clientes conquistados no período, com o que gastaram desde então.',\n ),\n icon: 'Users',\n category: CAT.customers,\n grain: 'customer',\n query: {\n source: { kind: 'view', name: CUSTOMERS },\n defaultSort: 'total_spent',\n defaultSortDir: 'desc',\n },\n viz: { type: 'table' },\n columns: [\n {\n key: 'customer_name', label: tl('Customer', 'Cliente'),\n type: 'person', idKey: 'customer_id', personKind: 'shop_customer',\n },\n { key: 'email', label: tl('Email', 'E-mail'), type: 'email' },\n { key: 'created_at', label: tl('Since', 'Cliente desde'), type: 'date', sortable: true },\n { key: 'orders_count', label: tl('Orders', 'Pedidos'), type: 'number', aggregate: 'sum', sortable: true },\n { key: 'total_spent', label: tl('Total spent', 'Total gasto'), type: 'currency', aggregate: 'sum', sortable: true },\n { key: 'avg_order_value', label: tl('Average order', 'Ticket médio'), type: 'currency', sortable: true },\n { key: 'last_order_at', label: tl('Last order', 'Último pedido'), type: 'date', sortable: true },\n ],\n },\n ]\n}\n","import React from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport { registerMessageDefaults } from '@fayz-ai/core'\nimport {\n setShopTenantResolver, getShopProvider, registerShippingLabelProvider,\n buildShopDomainEvents, buildShopMessageDefaults,\n} from '@fayz-ai/shop'\nimport { createMelhorEnvioLabelProvider } from './integrations/melhor-envio/labelProvider'\nimport { shopCustomerLookup } from './views/customerLookup'\nimport {\n useOrganizationStore, createCrudPage, registerEntityPath, registerPersonLookup, adminNavigateTo,\n type CrudNavTab,\n} from '@fayz-ai/admin'\nimport {\n CircleDollarSign, CreditCard, Eye, FileEdit, FolderTree, Layers, Package, PackageX,\n Repeat, ShoppingBag, Tag, TicketCheck, Users, UsersRound, UserX, Filter,\n} from 'lucide-react'\nimport { buildShopProductEntity } from './views/productEntity'\nimport { buildShopCustomerEntity } from './views/customerEntity'\nimport { buildShopDiscountEntity } from './views/discountEntity'\nimport { buildShopCategoryEntity } from './views/categoryEntity'\nimport { buildShopCollectionEntity } from './views/collectionEntity'\nimport { buildShopGiftCardEntity } from './views/giftCardEntity'\nimport { buildShopCustomerGroupEntity } from './views/customerGroupEntity'\nimport { buildShopCustomerSegmentEntity } from './views/customerSegmentEntity'\nimport { createShopProductDataProvider } from './data/productDataProvider'\nimport { createShopCustomerDataProvider } from './data/customerDataProvider'\nimport { createShopDiscountDataProvider } from './data/discountDataProvider'\nimport { createShopCategoryDataProvider } from './data/categoryDataProvider'\nimport { createShopCollectionDataProvider } from './data/collectionDataProvider'\nimport { createShopGiftCardDataProvider } from './data/giftCardDataProvider'\nimport { createShopCustomerGroupDataProvider } from './data/customerGroupDataProvider'\nimport { createShopCustomerSegmentDataProvider } from './data/customerSegmentDataProvider'\nimport type { ShopProviderResolver } from './views/ShopPage'\nimport {\n StoreGeneralSettings, PaymentsSettings, CheckoutSettings,\n ShippingSettings, FulfillmentSettings,\n} from './settings'\nimport { melhorEnvioConnectorDef } from './integrations/melhor-envio/connectorDef'\nimport { appmaxConnectorDef } from './integrations/appmax/connectorDef'\nimport { abacatePayConnectorDef } from './integrations/abacatepay/connectorDef'\nimport { stripeConnectConnectorDef } from './integrations/stripe-connect/connectorDef'\nimport { vindiConnectorDef } from './integrations/vindi/connectorDef'\nimport { ChannelsPage } from './views/ChannelsPage'\nimport { ContentPage } from './views/ContentPage'\nimport { blingConnectorDef } from './integrations/bling'\nimport { SHIPPING_ZONES_REGISTRY } from './data/registries'\nimport { shippingRegistryPath } from './data/registry-routes'\nimport { buildShopAnalyticsCards } from './analytics/cards'\n\nconst ShopPage = React.lazy(() => import('./views/ShopPage').then((m) => ({ default: m.ShopPage })))\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface ShopPluginOptions {\n navPosition?: number\n navSection?: 'main' | 'secondary' | 'settings'\n navLabel?: string\n /** Override the nav labels of the store's groups and their children. */\n sectionLabels?: Partial<Record<\n | 'products' | 'orders' | 'customers' | 'discounts' | 'shipping'\n | 'collections' | 'categories' | 'giftCards' | 'content' | 'store' | 'emails'\n | 'customerGroups' | 'customerSegments' | 'stock', string>>\n scope?: PluginScope\n verticalId?: VerticalId\n currency?: { code?: string; locale?: string; symbol?: string }\n provider?: ShopProviderResolver\n /** Heading the store's settings screens are grouped under in the settings\n * rail. Default 'Commerce'. */\n settingsGroupLabel?: string\n /**\n * Contribute the retail analytics catalogue. Default TRUE — a store that\n * cannot report on its own sales is not a store. Pass false where the host\n * app supplies its own pack, so the two do not stack.\n */\n analyticsCards?: false\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createShopPlugin(options?: ShopPluginOptions): PluginManifest {\n const curr = { code: 'BRL', locale: 'pt-BR', symbol: 'R$', ...options?.currency }\n\n // Scope fallback shop queries to the active organization. Apps can inject a\n // provider when they want SDK-owned data access instead of the global runtime.\n setShopTenantResolver(() => useOrganizationStore.getState().currentOrg?.id)\n\n // O texto sugerido para cada fato. Os FATOS em si são declarados no\n // manifesto (`events`, abaixo): é de lá que webhook e auditoria leem, sem\n // passar por nada de mensageria.\n registerMessageDefaults(buildShopMessageDefaults())\n\n // Who can issue a label. Registered, not hard-coded: the order screen resolves\n // whichever carrier the store connected and calls the same four verbs.\n registerShippingLabelProvider(createMelhorEnvioLabelProvider(() =>\n (typeof options?.provider === 'function'\n ? options.provider()\n : options?.provider ?? getShopProvider())))\n\n // Teach the shared person-path registry where a SHOP customer lives. The\n // built-in map ships veterinary defaults (customer → /registry/tutors), so\n // without this PersonLink would resolve a shop customer to the wrong module.\n // Clientes sits under Pedidos — a customer is who a store has orders with.\n registerEntityPath('shop_customer', '/orders/customers')\n\n // And where to LOAD one from. A surface that only holds an id and a name — an\n // analytics cell — can now render the same card the order screen shows,\n // without every caller having to hand it the shop provider.\n registerPersonLookup('shop_customer', shopCustomerLookup(() => resolveProvider()))\n\n type ShopSection = 'products' | 'orders' | 'customers' | 'discounts' | 'shipping'\n\n // Orders keep the bespoke ShopPage rather than a generic CRUD: an order is not\n // a CRUD record — it needs fulfilment, refunds and a line-item view.\n const pageFor = (section?: ShopSection): React.ComponentType<unknown> => {\n const Wrapped: React.ComponentType<unknown> = () =>\n React.createElement(React.Suspense, { fallback: null },\n React.createElement(\n ShopPage as React.ComponentType<{ provider?: ShopProviderResolver; section?: ShopSection }>,\n { provider: options?.provider, section },\n )\n )\n Wrapped.displayName = section ? `ShopPage:${section}` : 'ShopPageWrapper'\n return Wrapped\n }\n\n // Products, customers and discounts all get the full generic CRUD (list +\n // form + detail + delete) from their EntityDef, rather than three bespoke\n // read-only tables. Orders stay on the custom page: an order is not a CRUD\n // record — it needs fulfilment, refunds and a line-item view, which is its\n // own screen.\n const resolveProvider = () =>\n typeof options?.provider === 'function'\n ? options.provider()\n : options?.provider ?? getShopProvider()\n\n const label = (key: keyof NonNullable<ShopPluginOptions['sectionLabels']>, fallback: string) =>\n options?.sectionLabels?.[key] ?? fallback\n\n // The heading the store's five settings screens are filed under. One constant\n // so the rail groups them: the shell keys the run off equal STRINGS, and five\n // hand-typed labels group as five sections the moment one of them is retyped.\n const COMMERCE_GROUP = options?.settingsGroupLabel ?? 'Commerce'\n\n // Each settings tab is a zero-prop component the shell instantiates, so the\n // props it actually needs (provider, currency) are closed over here. Named,\n // because an anonymous arrow makes every one of the five read as the same\n // frame in a React stack trace.\n const settingsTab = (\n name: string,\n render: () => React.ReactElement,\n ): React.ComponentType<unknown> => {\n const Tab: React.ComponentType<unknown> = () => render()\n Tab.displayName = name\n return Tab\n }\n\n // The header tab strip carries the STATUS FILTER of each list (Todos / Ativo /\n // Rascunho / Arquivado), declared per entity as `facets: [{ display: 'tabs' }]`.\n //\n // It deliberately does NOT carry sibling CRUDs here: the sidebar already lists\n // Produtos · Coleções · Categorias under \"Produtos\", and repeating those three\n // as tabs would give the same navigation twice on the same screen — two\n // controls that must be kept in sync and disagree the moment one is used. The\n // CrudListView `navTabs` slot exists for lists whose siblings are NOT in the\n // menu; nothing in this plugin is in that position.\n\n const ProductsCrudPage = createCrudPage(buildShopProductEntity(curr.code, resolveProvider), {\n dataProvider: createShopProductDataProvider(resolveProvider),\n feature: 'shop',\n stats: (items, total) => [\n { id: 'total', label: 'Produtos', value: total, icon: Package },\n { id: 'active', label: 'Ativos', value: items?.filter((p) => p.status === 'active').length ?? 0, icon: Eye },\n { id: 'draft', label: 'Rascunhos', value: items?.filter((p) => p.status === 'draft').length ?? 0, icon: FileEdit },\n { id: 'out-of-stock', label: 'Sem estoque', value: items?.filter((p) => (p.inventoryCount ?? 0) <= 0).length ?? 0, icon: PackageX },\n ],\n })\n\n // Clientes / Grupos / Segmentos are three DIFFERENT CRUDs about the same\n // people, and only \"Clientes\" is in the sidebar — so here the header strip\n // carries siblings rather than a status filter, and duplicates no menu entry.\n const customerTabs = (): CrudNavTab[] => [\n { id: 'customers', label: label('customers', 'Clientes'), icon: Users,\n onSelect: () => adminNavigateTo('/orders/customers') },\n { id: 'groups', label: label('customerGroups', 'Grupos'), icon: UsersRound,\n onSelect: () => adminNavigateTo('/orders/customers/groups') },\n { id: 'segments', label: label('customerSegments', 'Segmentos'), icon: Filter,\n onSelect: () => adminNavigateTo('/orders/customers/segments') },\n ]\n\n const CustomerGroupsCrudPage = createCrudPage(buildShopCustomerGroupEntity(), {\n dataProvider: createShopCustomerGroupDataProvider(resolveProvider),\n feature: 'shop',\n navTabs: customerTabs,\n activeNavTab: 'groups',\n stats: (items, total) => [\n { id: 'total', label: 'Grupos', value: total, icon: UsersRound },\n {\n id: 'members', label: 'Clientes agrupados', icon: Users,\n // Distinct people, not the sum: someone in two groups is still one\n // customer, and a sum would report more members than the store has.\n value: new Set((items ?? []).flatMap((g) => g.customerIds ?? [])).size,\n },\n {\n id: 'empty', label: 'Grupos vazios', icon: UserX,\n value: items?.filter((g) => (g.customerIds?.length ?? 0) === 0).length ?? 0,\n },\n { id: 'segments', label: 'Segmentos', pending: 'Ver aba', icon: Filter },\n ],\n })\n\n const CustomerSegmentsCrudPage = createCrudPage(buildShopCustomerSegmentEntity(curr.code), {\n dataProvider: createShopCustomerSegmentDataProvider(resolveProvider),\n feature: 'shop',\n navTabs: customerTabs,\n activeNavTab: 'segments',\n stats: (items, total) => [\n { id: 'total', label: 'Segmentos', value: total, icon: Filter },\n {\n id: 'matched', label: 'Maior segmento', icon: Users,\n value: items?.length ? Math.max(...items.map((s) => s.matchCount ?? 0)) : 0,\n },\n {\n id: 'empty', label: 'Sem ninguém', icon: UserX,\n value: items?.filter((s) => (s.matchCount ?? 0) === 0).length ?? 0,\n },\n { id: 'groups', label: 'Grupos', pending: 'Ver aba', icon: UsersRound },\n ],\n })\n\n const CustomersCrudPage = createCrudPage(buildShopCustomerEntity(), {\n dataProvider: createShopCustomerDataProvider(resolveProvider),\n feature: 'shop',\n navTabs: customerTabs,\n activeNavTab: 'customers',\n stats: (items, total) => [\n { id: 'total', label: 'Total de clientes', value: total, icon: Users },\n { id: 'with-orders', label: 'Com pedidos', value: items?.filter((c) => (c.ordersCount ?? 0) > 0).length ?? 0, icon: ShoppingBag },\n // Não computados ainda: um zero confiante aqui seria lido como medição.\n { id: 'repeat', label: 'Taxa de recompra', pending: 'Em breve', icon: Repeat },\n { id: 'aov', label: 'Ticket médio', pending: 'Em breve', icon: CircleDollarSign },\n ],\n })\n\n const DiscountsCrudPage = createCrudPage(buildShopDiscountEntity(), {\n dataProvider: createShopDiscountDataProvider(resolveProvider),\n feature: 'shop',\n stats: (items, total) => [\n { id: 'total', label: 'Total de cupons', value: total, icon: Tag },\n { id: 'active', label: 'Ativos agora', value: items?.filter((d) => d.status === 'active').length ?? 0, icon: Eye },\n { id: 'uses', label: 'Usos', value: items?.reduce((sum, d) => sum + (d.timesUsed ?? 0), 0) ?? 0, icon: TicketCheck },\n { id: 'draft', label: 'Rascunhos', value: items?.filter((d) => d.status === 'draft').length ?? 0, icon: FileEdit },\n ],\n })\n\n // Zonas de entrega NÃO têm mais página própria: viraram registry dentro de\n // Configurações → Entrega (buildShippingZonesRegistry). O EntityDef e o\n // dataProvider continuam os mesmos — só o lugar onde a tela abre mudou, e o\n // que mudou é o que estava errado: clicar em \"Zonas\" no meio de configurar a\n // entrega tirava o lojista de Configurações.\n\n const CategoriesCrudPage = createCrudPage(buildShopCategoryEntity(), {\n dataProvider: createShopCategoryDataProvider(resolveProvider),\n feature: 'shop',\n })\n\n const CollectionsCrudPage = createCrudPage(buildShopCollectionEntity(), {\n dataProvider: createShopCollectionDataProvider(resolveProvider),\n feature: 'shop',\n stats: (items, total) => [\n { id: 'total', label: 'Coleções', value: total, icon: Layers },\n { id: 'published', label: 'Publicadas', value: items?.filter((c) => c.published).length ?? 0, icon: Eye },\n { id: 'draft', label: 'Rascunhos', value: items?.filter((c) => !c.published).length ?? 0, icon: FileEdit },\n {\n id: 'members', label: 'Produtos agrupados', icon: Package,\n value: items?.reduce((sum, c) => sum + (c.productIds?.length ?? 0), 0) ?? 0,\n },\n ],\n })\n\n const GiftCardsCrudPage = createCrudPage(buildShopGiftCardEntity(curr.code), {\n dataProvider: createShopGiftCardDataProvider(resolveProvider),\n feature: 'shop',\n stats: (items, total) => {\n const money = (v: number) =>\n new Intl.NumberFormat(curr.locale, { style: 'currency', currency: curr.code }).format(v)\n const active = items?.filter((g) => g.status === 'active') ?? []\n return [\n { id: 'total', label: 'Cartões emitidos', value: total, icon: CreditCard },\n { id: 'active', label: 'Ativos', value: active.length, icon: Eye },\n // Saldo em aberto é passivo: dinheiro já recebido que a loja ainda deve\n // em produto. É o número que a conciliação procura aqui.\n {\n id: 'outstanding', label: 'Saldo em aberto', icon: CircleDollarSign,\n value: money(active.reduce((sum, g) => sum + (g.balance ?? 0), 0)),\n },\n {\n id: 'issued', label: 'Valor emitido', icon: TicketCheck,\n value: money(items?.reduce((sum, g) => sum + (g.initialBalance ?? 0), 0) ?? 0),\n },\n ]\n },\n })\n\n const ContentPageWrapped: React.ComponentType<unknown> = () =>\n React.createElement(ContentPage, { resolveProvider: options?.provider })\n ContentPageWrapped.displayName = 'ContentPage'\n\n\n\n\n\n\n\n\n // Canais de venda — wraps the ChannelsPage with the app's shop provider.\n const ChannelsPageWrapped: React.ComponentType<unknown> = () =>\n React.createElement(ChannelsPage, { resolveProvider: options?.provider })\n ChannelsPageWrapped.displayName = 'ChannelsPage'\n\n // -------------------------------------------------------------------------\n // Nav + routes\n // -------------------------------------------------------------------------\n // Routes are top-level (/products, /orders, /discounts) rather than nested\n // under /shop, because the shell nests nav by route PREFIX and only one level\n // deep: with everything under /shop the whole store collapsed into a single\n // \"Loja\" accordion. Top-level parents give the store its real shape — Pedidos\n // with Clientes under it, Produtos with Coleções and Categorias under it.\n //\n // `indexChild: false` on a parent means the parent is a plain link with\n // children beside it; leaving it on repeats the parent as its own first child\n // (Pedidos ▸ Pedidos · Clientes), which is what a group whose index IS a\n // destination should do.\n const navSection = options?.navSection ?? 'main'\n const navPosition = options?.navPosition ?? 6\n\n type NavEntry = {\n route: string\n label: string\n icon: string\n position: number\n indexChild?: boolean\n component: React.ComponentType<unknown>\n }\n\n const NAV: NavEntry[] = [\n // Pedidos ▸ Pedidos · Clientes\n { route: '/orders', label: label('orders', 'Pedidos'), icon: 'ShoppingBag',\n position: navPosition, component: pageFor('orders') },\n { route: '/orders/customers', label: label('customers', 'Clientes'), icon: 'Users',\n position: navPosition + 0.1, component: CustomersCrudPage as React.ComponentType<unknown> },\n\n // Produtos ▸ Produtos · Coleções · Categorias\n { route: '/products', label: label('products', 'Produtos'), icon: 'Package',\n position: navPosition + 1, component: ProductsCrudPage as React.ComponentType<unknown> },\n { route: '/products/collections', label: label('collections', 'Coleções'), icon: 'Layers',\n position: navPosition + 1.1, component: CollectionsCrudPage as React.ComponentType<unknown> },\n { route: '/products/categories', label: label('categories', 'Categorias'), icon: 'FolderTree',\n position: navPosition + 1.2, component: CategoriesCrudPage as React.ComponentType<unknown> },\n\n\n // Conteúdo — a biblioteca de arquivos (sem filhos).\n { route: '/content', label: label('content', 'Conteúdo'), icon: 'Image',\n position: navPosition + 2, indexChild: false, component: ContentPageWrapped },\n\n // Descontos ▸ Descontos · Gift Cards\n { route: '/discounts', label: label('discounts', 'Descontos'), icon: 'Tag',\n position: navPosition + 3, component: DiscountsCrudPage as React.ComponentType<unknown> },\n { route: '/discounts/gift-cards', label: label('giftCards', 'Gift Cards'), icon: 'CreditCard',\n position: navPosition + 3.1, component: GiftCardsCrudPage as React.ComponentType<unknown> },\n\n ]\n\n // Reachable but not in the nav. The storefront screens hang off the \"Seu site\"\n // widget in the sidebar footer (the app points its editRoute at /store), so\n // listing them again in the menu would be the same destination twice.\n // `title` + `parentRoute` são a definição de página: a barra da shell escreve\n // o título e desenha o \"←\" a partir daqui. Sem isso, uma tela fora do menu\n // casava só com o prefixo do pai e era rotulada com o nome dele — \"Pedidos\"\n // numa tela que não é a lista de pedidos —, e cada página acabava desenhando\n // a própria seta de voltar.\n const HIDDEN_ROUTES: Array<{\n path: string\n component: React.ComponentType<unknown>\n title?: string\n parentRoute?: string\n }> = [\n { path: '/store', component: ChannelsPageWrapped, title: label('store', 'Canais de venda') },\n // Reached from the Clientes tab strip, deliberately not from the menu:\n // three sidebar entries for one destination is the duplication the tab\n // strip exists to avoid. Nesting under /orders/customers also keeps\n // \"Clientes\" highlighted in the rail while you are on them.\n // Detalhe do modelo de e-mail. Sem entrada no menu: é uma linha da lista,\n // não um destino. Ganha do curinga /emails/* por especificidade de rota.\n { path: '/orders/customers/groups', component: CustomerGroupsCrudPage as React.ComponentType<unknown>,\n title: label('customerGroups', 'Grupos'), parentRoute: '/orders/customers' },\n { path: '/orders/customers/segments', component: CustomerSegmentsCrudPage as React.ComponentType<unknown>,\n title: label('customerSegments', 'Segmentos'), parentRoute: '/orders/customers' },\n ]\n\n // Where the store used to live. These REDIRECT rather than mounting the page\n // a second time: a generated CRUD page carries ONE `__crudBasePath`, so\n // mounting the same component at two paths left it with whichever was\n // registered last — and /orders/customers/new then resolved against\n // /customers and silently rendered the list instead of the form.\n const redirectTo = (target: string): React.ComponentType<unknown> => {\n const Redirect: React.ComponentType<unknown> = () => {\n React.useEffect(() => { adminNavigateTo(target) }, [])\n return null\n }\n Redirect.displayName = `Redirect(${target})`\n return Redirect\n }\n\n const LEGACY_ROUTES: Array<{ path: string; component: React.ComponentType<unknown> }> = [\n { path: '/shop', component: redirectTo('/products') },\n { path: '/shop/products', component: redirectTo('/products') },\n { path: '/shop/orders', component: redirectTo('/orders') },\n { path: '/shop/discounts', component: redirectTo('/discounts') },\n // As duas rotas antigas das zonas apontam para onde o cadastro passou a\n // viver. Existem em favorito e em link — tirá-las daria 404 para quem já\n // sabia o caminho.\n // Os dois redirects apontavam para `_properties/zonas`, que deixou de existir\n // quando o id virou slug em inglês — um link antigo caía numa aba vazia. A\n // rota vem do mesmo lugar que a tela usa.\n { path: '/shop/shipping', component: redirectTo(shippingRegistryPath(SHIPPING_ZONES_REGISTRY)) },\n { path: '/store/shipping', component: redirectTo(shippingRegistryPath(SHIPPING_ZONES_REGISTRY)) },\n { path: '/shop/channels', component: redirectTo('/store') },\n { path: '/customers', component: redirectTo('/orders/customers') },\n // A mensageria da loja virou parte de Automações — mesmos eventos, agora ao\n // lado dos do CRM e da agenda, e com WhatsApp além do e-mail.\n { path: '/emails', component: redirectTo('/automations') },\n { path: '/emails/:event', component: redirectTo('/automations') },\n ]\n\n const READ: { feature: 'shop'; action: 'read' } = { feature: 'shop', action: 'read' }\n\n return {\n id: 'shop',\n name: options?.navLabel ?? 'Shop',\n icon: 'ShoppingBag',\n version: '1.0.0',\n scope: options?.scope ?? 'vertical',\n verticalId: options?.verticalId,\n // Storefront/commerce-operator-console surface — targets the ecommerce\n // Panel world, not a saas admin app.\n scaffolds: ['ecommerce'],\n defaultEnabled: true,\n dependencies: [],\n navigation: NAV.map((entry) => ({\n section: navSection,\n position: entry.position,\n label: entry.label,\n route: entry.route,\n icon: entry.icon,\n permission: READ,\n ...(entry.indexChild === false ? { indexChild: false as const } : {}),\n })),\n routes: [\n ...NAV.map((entry) => ({ path: entry.route, component: entry.component, permission: READ })),\n ...HIDDEN_ROUTES.map((r) => ({ ...r, permission: READ })),\n ...LEGACY_ROUTES.map((r) => ({ ...r, permission: READ })),\n ],\n widgets: [],\n // Os ~28 cards de varejo. Ficam AQUI porque quem é dono do dado é dono do\n // número: \"vendas por produto\" quer dizer a mesma coisa numa loja e num\n // salão, e o plugin de Análises só sabe desenhar — ele não sabe o que é uma\n // venda. Cada card é ao mesmo tempo um bloco do painel, uma linha da lista\n // de relatórios e um relatório inteiro, então o KPI e o relatório atrás dele\n // não têm como discordar.\n analyticsCards: options?.analyticsCards === false ? [] : buildShopAnalyticsCards(),\n // Os fatos que a loja emite. Lidos por três consumidores — automações,\n // integrações e auditoria — e agregados pelo runtime só quando o plugin\n // está ATIVO, para um módulo desligado não anunciar eventos que não vêm.\n events: buildShopDomainEvents(),\n aiTools: [\n {\n id: 'shop.list-products',\n name: 'listProducts',\n description: 'Lists products in the shop catalog.',\n icon: 'Package',\n mode: 'read' as const,\n category: 'Shop',\n parameters: {\n type: 'object' as const,\n properties: {\n search: { type: 'string' as const, description: 'Filter by name' },\n status: { type: 'string' as const, enum: ['draft', 'active', 'archived'] },\n },\n },\n suggestions: [\n { label: 'What products are available?' },\n { label: 'Which products are out of stock?' },\n ],\n },\n {\n id: 'shop.list-orders',\n name: 'listOrders',\n description: 'Lists recent shop orders.',\n icon: 'ShoppingCart',\n mode: 'read' as const,\n category: 'Shop',\n parameters: {\n type: 'object' as const,\n properties: {\n financialStatus: { type: 'string' as const, enum: ['pending', 'paid', 'refunded', 'voided'] },\n fulfillmentStatus: { type: 'string' as const, enum: ['unfulfilled', 'partially_fulfilled', 'fulfilled'] },\n },\n },\n suggestions: [\n { label: 'Show me pending orders' },\n { label: 'How many orders were paid today?' },\n ],\n },\n ],\n // A loja não é UM ajuste. Era uma aba só, «Shop», com moeda, catálogo,\n // checkout e notificações empilhados num scroll — e nenhum deles gravava\n // nada. São cinco decisões de naturezas diferentes: quem cobra, quem pode\n // comprar, quanto custa entregar, quando a remessa nasce, e como a vitrine\n // se apresenta. Cada uma é uma tela, e as cinco se agrupam sob COMMERCE\n // (`group`), que é o que a rail de configurações passou a saber desenhar.\n //\n // `id: 'shop'` fica com a tela geral: /settings/shop é uma URL que já\n // existe, em favoritos e em links, e renumerá-la para ganhar simetria de\n // nomes seria quebrar o que funciona por estética.\n settings: [\n {\n id: 'shop',\n label: label('store', 'Loja'),\n icon: 'ShoppingBag',\n group: COMMERCE_GROUP,\n component: settingsTab('StoreGeneralSettings', () =>\n React.createElement(StoreGeneralSettings, { currency: curr, provider: options?.provider })),\n order: 30,\n permission: READ,\n },\n {\n id: 'shop-payments',\n label: 'Pagamentos',\n icon: 'CreditCard',\n group: COMMERCE_GROUP,\n component: settingsTab('PaymentsSettings', () =>\n React.createElement(PaymentsSettings, { provider: options?.provider })),\n order: 31,\n permission: READ,\n },\n {\n id: 'shop-checkout',\n label: 'Checkout',\n icon: 'ShoppingCart',\n group: COMMERCE_GROUP,\n component: settingsTab('CheckoutSettings', () =>\n React.createElement(CheckoutSettings, { provider: options?.provider })),\n order: 32,\n permission: READ,\n },\n {\n id: 'shop-shipping',\n label: label('shipping', 'Entrega'),\n icon: 'Truck',\n group: COMMERCE_GROUP,\n component: settingsTab('ShippingSettings', () =>\n React.createElement(ShippingSettings, { provider: options?.provider })),\n order: 33,\n permission: READ,\n },\n {\n id: 'shop-fulfillment',\n label: 'Fulfillment',\n icon: 'PackageCheck',\n group: COMMERCE_GROUP,\n component: settingsTab('FulfillmentSettings', () =>\n React.createElement(FulfillmentSettings, { provider: options?.provider })),\n order: 34,\n permission: READ,\n },\n ],\n // The store's stack, configured where the store is configured — zero new\n // screens (commerce-stack.md §0). Melhor Envio, AppMax and AbacatePay are\n // REQUEST-plane connectors: the buyer is waiting, so each declares a latency\n // budget and, because the carrier and the gateways want opposite answers to\n // the same failure, its own `onFailure`. Bling is the SYNC-plane one —\n // nobody is waiting on it, and what it declares instead is a call budget and\n // a windowed cursor.\n //\n // Two gateways on the shelf is the point: the store picks one, and the\n // second one arriving changed no contract — only how it authorizes.\n connectors: [\n melhorEnvioConnectorDef,\n appmaxConnectorDef,\n abacatePayConnectorDef,\n stripeConnectConnectorDef,\n vindiConnectorDef,\n blingConnectorDef,\n ],\n // What having a store makes plugable — the four above plus the ones still\n // to be built. Carried over from the Fayz plugin page's \"Integra com\" row,\n // minus Nuvemshop: the platform catalogue has no row for it, and a slug the\n // directory cannot back is refused rather than shown.\n integrations: ['shopify', 'stripe', 'mercadopago'],\n }\n}\n\nexport * from './integrations/bling'\n\n// The retail pack, exported so an app can curate it — reorder the overview,\n// relabel a card, drop one — by re-declaring an id in the analytics plugin's\n// `cards`, instead of forking the plugin to change one word.\nexport { buildShopAnalyticsCards } from './analytics/cards'\n\n// Re-export shop types so consumer apps only need @fayz-ai/plugin-shop\nexport type {\n Product, Order, ShopCustomer, Discount, Category,\n CreateProductInput, UpdateProductInput, ListProductsOptions,\n CreateOrderInput, UpdateOrderInput, ListOrdersOptions,\n} from '@fayz-ai/shop'\n\n// The store's stack on the request plane. Exported so an app can offer one and\n// not the other, and so the ConnectorsHub in a bespoke admin can render them.\nexport { melhorEnvioConnectorDef, MELHOR_ENVIO_CONNECTOR_ID, MELHOR_ENVIO_LATENCY_BUDGET_MS } from './integrations/melhor-envio/connectorDef'\nexport { appmaxConnectorDef, APPMAX_CONNECTOR_ID, APPMAX_LATENCY_BUDGET_MS } from './integrations/appmax/connectorDef'\nexport { abacatePayConnectorDef, ABACATEPAY_CONNECTOR_ID, ABACATEPAY_LATENCY_BUDGET_MS } from './integrations/abacatepay/connectorDef'\nexport { stripeConnectConnectorDef, STRIPE_CONNECT_CONNECTOR_ID, STRIPE_CONNECT_LATENCY_BUDGET_MS } from './integrations/stripe-connect/connectorDef'\nexport { vindiConnectorDef, VINDI_CONNECTOR_ID, VINDI_LATENCY_BUDGET_MS } from './integrations/vindi/connectorDef'\n"]}
1
+ {"version":3,"sources":["../src/integrations/melhor-envio/labelProvider.ts","../src/views/ProductImagesTab.tsx","../src/views/ProductVariantsTab.tsx","../src/data/registry-routes.ts","../src/views/PackageSelect.tsx","../src/views/ShippingProfileSelect.tsx","../src/views/productEntity.tsx","../src/views/customerEntity.tsx","../src/views/discountEntity.tsx","../src/views/categoryEntity.tsx","../src/views/collectionEntity.tsx","../src/views/giftCardEntity.tsx","../src/views/customerGroupEntity.tsx","../src/views/customerSegmentEntity.tsx","../src/data/productDataProvider.ts","../src/data/customerDataProvider.ts","../src/data/discountDataProvider.ts","../src/data/categoryDataProvider.ts","../src/data/collectionDataProvider.ts","../src/data/giftCardDataProvider.ts","../src/data/customerGroupDataProvider.ts","../src/data/customerSegmentDataProvider.ts","../src/settings/useStoreSettings.ts","../src/settings/SettingsState.tsx","../src/settings/StoreGeneralSettings.tsx","../src/settings/payment-provider.ts","../src/settings/PaymentProviderRow.tsx","../src/settings/PaymentsSettings.tsx","../src/settings/CheckoutSettings.tsx","../src/settings/PackagesSettings.tsx","../src/settings/HandlingSettings.tsx","../src/settings/ChoiceCards.tsx","../src/settings/ShippingSettings.tsx","../src/settings/FulfillmentSettings.tsx","../src/integrations/melhor-envio/connectorDef.tsx","../src/integrations/appmax/connectorDef.tsx","../src/integrations/abacatepay/connectorDef.tsx","../src/integrations/stripe-connect/connectorDef.tsx","../src/integrations/vindi/connectorDef.tsx","../src/views/ChannelsPage.tsx","../src/views/media-links.ts","../src/views/ContentPage.tsx","../src/integrations/bling/limits.ts","../src/integrations/bling/data.ts","../src/integrations/bling/connectorDef.tsx","../src/integrations/bling/mapping.ts","../src/integrations/bling/sync.ts","../src/integrations/bling/inbound.ts","../src/analytics/cards.ts","../src/index.ts"],"names":["resolve","update","React","jsx","jsxs","IconButton","Plus","getShopProvider","adminNavigateTo","money","STATUS_TONE","STATUS_LABEL","AlertTriangle","Loader2","SettingsGroup","ToggleRow","SelectRow","useConnectors","useConnectorsPanelAvailable","openConnectorsPanel","RegistryCrudView","TextRow","ArrowRight","Fragment","ConnectorDetail","useState","useEffect","store","createConnectionStore","fayzConnectorOAuth","connectionStatus","settingsStatus","connectionSettings","METHOD_LABELS","methodsDetail","MapPin","ExternalLink","Check","X","Trash2","Button","Package","ShoppingBag","Layers"],"mappings":";;;;;;;;;;;AAOO,IAAM,oBAAA,GAAuB,cAAA;AAE7B,SAAS,+BACdA,QAAAA,EACuB;AACvB,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,MAAM,IAAI,MAAM,uDAAoD,CAAA;AAAA,EACtE,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,oBAAA;AAAA,IACJ,KAAA,EAAO,cAAA;AAAA,IACP,KAAA,EAAO,OAAO,OAAA,KACX,MAAMA,QAAAA,GAAU,kBAAA,GAAqB,OAAA,EAAS,oBAAoB,CAAA,IAAM,WAAA,EAAY;AAAA,IACvF,GAAA,EAAK,OAAO,OAAA,EAAS,SAAA,KAClB,MAAMA,QAAAA,EAAQ,CAAE,gBAAA,GAAmB,OAAA,EAAS,SAAA,EAAW,oBAAoB,CAAA,IAAM,WAAA,EAAY;AAAA,IAChG,KAAA,EAAO,OAAO,OAAA,KACX,MAAMA,UAAQ,CAAE,kBAAA,GAAqB,OAAA,EAAS,oBAAoB,CAAA,IAAM,IAAA;AAAA,IAC3E,KAAA,EAAO,OAAO,OAAA,KACX,MAAMA,UAAQ,CAAE,kBAAA,GAAqB,OAAA,EAAS,oBAAoB,CAAA,IAAM;AAAA,GAC7E;AACF;ACZO,SAAS,gBAAA,CAAiB,EAAE,IAAA,EAAM,WAAA,EAAY,EAGlD;AACD,EAAA,MAAM,OAAA,GAAU,IAAA;AAChB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,QAAA,CAAyB,EAAE,CAAA;AACvD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,OAAA,GAAU,OAAyB,IAAI,CAAA;AAE7C,EAAA,eAAe,MAAA,GAAS;AACtB,IAAA,MAAM,QAAQ,MAAM,WAAA,EAAY,CAAE,UAAA,CAAW,QAAQ,EAAE,CAAA;AACvD,IAAA,SAAA,CAAU,UAAA,CAAW,KAAA,EAAO,MAAA,IAAU,EAAE,CAAC,CAAA;AAAA,EAC3C;AAEA,EAAA,SAAA,CAAU,MAAM;AAAE,IAAA,KAAK,MAAA,EAAO,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EAAE,CAAA,EAAG,CAAC,OAAA,CAAQ,EAAE,CAAC,CAAA;AAE/D,EAAA,eAAe,IAAI,MAAA,EAAgC;AACjD,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,EAAO;AACb,MAAA,MAAM,MAAA,EAAO;AAAA,IACf,SAAS,GAAA,EAAc;AACrB,MAAA,QAAA,CAAS,YAAA,CAAa,GAAG,CAAC,CAAA;AAAA,IAC5B,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAAA,EACF;AAEA,EAAA,eAAe,OAAO,KAAA,EAAwB;AAC5C,IAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AAIpB,IAAA,MAAM,IAAI,YAAY;AACpB,MAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,EAAG;AACpC,QAAA,MAAM,WAAA,EAAY,CAAE,kBAAA,CAAmB,OAAA,CAAQ,IAAI,IAAI,CAAA;AAAA,MACzD;AACA,MAAA,IAAI,OAAA,CAAQ,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,KAAA,GAAQ,EAAA;AAAA,IAC/C,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,SAAS,IAAA,CAAK,OAAe,KAAA,EAAe;AAC1C,IAAA,MAAM,SAAS,KAAA,GAAQ,KAAA;AACvB,IAAA,IAAI,MAAA,GAAS,CAAA,IAAK,MAAA,IAAU,MAAA,CAAO,MAAA,EAAQ;AAC3C,IAAA,MAAM,CAAA,GAAI,OAAO,KAAK,CAAA;AACtB,IAAA,MAAM,CAAA,GAAI,OAAO,MAAM,CAAA;AAGvB,IAAA,KAAK,IAAI,YAAY;AACnB,MAAA,MAAMC,OAAAA,GAAS,aAAY,CAAE,kBAAA;AAC7B,MAAA,IAAI,CAACA,OAAAA,EAAQ,MAAM,IAAI,MAAM,iDAA8C,CAAA;AAC3E,MAAA,MAAMA,OAAAA,CAAO,EAAE,EAAA,EAAI,EAAE,WAAW,CAAA,CAAE,SAAA,IAAa,QAAQ,CAAA;AACvD,MAAA,MAAMA,OAAAA,CAAO,EAAE,EAAA,EAAI,EAAE,WAAW,CAAA,CAAE,SAAA,IAAa,OAAO,CAAA;AAAA,IACxD,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,MAAA,GAAS,aAAY,CAAE,kBAAA;AAE7B,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mDAAA,EACb,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,wBACtD,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,0IAAA,EAG7C;AAAA,OAAA,EACF,CAAA;AAAA,sBACA,IAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,mJAAA,EACd,QAAA,EAAA;AAAA,QAAA,IAAA,GAAO,gBAAA,GAAc,iBAAA;AAAA,wBACtB,GAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,OAAA;AAAA,YACL,IAAA,EAAK,MAAA;AAAA,YACL,MAAA,EAAO,SAAA;AAAA,YACP,QAAA,EAAQ,IAAA;AAAA,YACR,QAAA,EAAU,IAAA;AAAA,YACV,SAAA,EAAU,QAAA;AAAA,YACV,UAAU,CAAC,KAAA,KAAU,KAAK,MAAA,CAAO,KAAA,CAAM,OAAO,KAAK;AAAA;AAAA;AACrD,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,IAEC,KAAA,oBACC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6EAA6E,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IAGjG,MAAA,CAAO,WAAW,CAAA,mBACjB,GAAA,CAAC,OAAE,SAAA,EAAU,sFAAA,EAAuF,yJAGpG,CAAA,mBAEA,GAAA,CAAC,QAAG,SAAA,EAAU,gBAAA,EACX,iBAAO,GAAA,CAAI,CAAC,OAAO,KAAA,qBAClB,IAAA,CAAC,IAAA,EAAA,EAAkB,SAAA,EAAU,mCAAA,EAC3B,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iCAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,KAAK,KAAA,CAAM,GAAA,EAAK,KAAK,KAAA,CAAM,OAAA,IAAW,EAAA,EAAI,SAAA,EAAU,4BAAA,EAA6B,CAAA;AAAA,QACrF,MAAM,SAAA,oBACL,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2GAA0G,QAAA,EAAA,MAAA,EAE1H;AAAA,OAAA,EAEJ,CAAA;AAAA,sBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qDAAA,EACb,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,YAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cAAW,KAAA,EAAM,oBAAA;AAAA,cAAkB,QAAA,EAAU,QAAQ,KAAA,KAAU,CAAA;AAAA,cAC9D,OAAA,EAAS,MAAM,IAAA,CAAK,KAAA,EAAO,EAAE,CAAA;AAAA,cAAG,QAAA,EAAA;AAAA;AAAA,WAAC;AAAA,0BACnC,GAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cAAW,KAAA,EAAM,mBAAA;AAAA,cAAoB,QAAA,EAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,CAAO,MAAA,GAAS,CAAA;AAAA,cAChF,OAAA,EAAS,MAAM,IAAA,CAAK,KAAA,EAAO,CAAC,CAAA;AAAA,cAAG,QAAA,EAAA;AAAA;AAAA;AAAC,SAAA,EACpC,CAAA;AAAA,wBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACZ,QAAA,EAAA;AAAA,UAAA,CAAC,KAAA,CAAM,aAAa,MAAA,oBACnB,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,QAAA,EAAU,IAAA;AAAA,cACV,OAAA,EAAS,MAAM,KAAK,GAAA,CAAI,MAAM,MAAA,CAAO,KAAA,CAAM,EAAA,EAAI,EAAE,SAAA,EAAW,IAAA,EAAM,CAAC,CAAA;AAAA,cACnE,SAAA,EAAU,8GAAA;AAAA,cACX,QAAA,EAAA;AAAA;AAAA,WAED;AAAA,0BAEF,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,QAAA,EAAU,IAAA;AAAA,cACV,OAAA,EAAS,MAAM,KAAK,GAAA,CAAI,MAAM,aAAY,CAAE,kBAAA,CAAmB,KAAA,CAAM,EAAE,CAAC,CAAA;AAAA,cACxE,SAAA,EAAU,gFAAA;AAAA,cACX,QAAA,EAAA;AAAA;AAAA;AAED,SAAA,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EAAA,EApCO,KAAA,CAAM,EAqCf,CACD,CAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAEA,SAAS,WAAW,EAAE,KAAA,EAAO,QAAA,EAAU,OAAA,EAAS,UAAS,EAKtD;AACD,EAAA,uBACE,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAY,KAAA;AAAA,MACZ,KAAA,EAAO,KAAA;AAAA,MACP,QAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA,EAAU,gIAAA;AAAA,MAET;AAAA;AAAA,GACH;AAEJ;AAGA,SAAS,WAAW,MAAA,EAAwC;AAC1D,EAAA,OAAO,CAAC,GAAG,MAAM,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AAChC,IAAA,IAAI,EAAE,SAAA,KAAc,CAAA,CAAE,WAAW,OAAO,CAAA,CAAE,YAAY,EAAA,GAAK,CAAA;AAC3D,IAAA,OAAA,CAAQ,CAAA,CAAE,SAAA,IAAa,CAAA,KAAM,CAAA,CAAE,SAAA,IAAa,CAAA,CAAA;AAAA,EAC9C,CAAC,CAAA;AACH;AC3JO,SAAS,kBAAA,CAAmB,EAAE,IAAA,EAAM,WAAA,EAAY,EAGpD;AACD,EAAA,MAAM,OAAA,GAAU,IAAA;AAChB,EAAA,MAAM,OAAO,WAAA,EAAY;AAGzB,EAAA,MAAM,SAAA,GACJ,OAAO,IAAA,CAAK,kBAAA,KAAuB,cACnC,OAAO,IAAA,CAAK,kBAAA,KAAuB,UAAA,IACnC,OAAO,IAAA,CAAK,oBAAA,KAAyB,UAAA,IACrC,OAAO,KAAK,oBAAA,KAAyB,UAAA;AAEvC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,IAAIC,MAAAA,CAAM,QAAA,CAA6B,EAAE,CAAA;AAC7D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,IAAIA,MAAAA,CAAM,QAAA,CAA2B,EAAE,CAAA;AACnE,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,MAAAA,CAAM,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,MAAAA,CAAM,SAAwB,IAAI,CAAA;AAC5D,EAAA,MAAM,CAAC,UAAU,WAAW,CAAA,GAAIA,OAAM,QAAA,iBAAsB,IAAI,KAAK,CAAA;AACrE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,MAAAA,CAAM,SAAS,KAAK,CAAA;AAE9C,EAAA,MAAM,MAAA,GAASA,MAAAA,CAAM,WAAA,CAAY,YAAY;AAI3C,IAAA,MAAM,GAAA,GAAM,MAAM,WAAA,EAAY,CAAE,kBAAA,CAAoB,QAAQ,EAAA,EAAI,EAAE,eAAA,EAAiB,IAAA,EAAM,CAAA;AACzF,IAAA,OAAA,CAAQ,eAAA,CAAgB,GAAA,CAAI,OAAO,CAAC,CAAA;AACpC,IAAA,WAAA,CAAY,IAAI,QAAQ,CAAA;AACxB,IAAA,WAAA,iBAAY,IAAI,KAAK,CAAA;AACrB,IAAA,QAAA,CAAS,KAAK,CAAA;AAAA,EAChB,CAAA,EAAG,CAAC,WAAA,EAAa,OAAA,CAAQ,EAAE,CAAC,CAAA;AAE5B,EAAAA,MAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,KAAK,MAAA,GAAS,KAAA,CAAM,CAAC,MAAM,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAC,CAAC,CAAA;AAAA,EACjD,CAAA,EAAG,CAAC,MAAA,EAAQ,SAAS,CAAC,CAAA;AAEtB,EAAA,eAAe,IAAI,MAAA,EAAgC;AACjD,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,EAAO;AACb,MAAA,MAAM,MAAA,EAAO;AAAA,IACf,SAAS,CAAA,EAAG;AACV,MAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,IACrB,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAAOA,MAAAA,CAAM,OAAA,CAAQ,MAAM,iBAAA,CAAkB,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAC,IAAA,EAAM,QAAQ,CAAC,CAAA;AACpF,EAAA,MAAM,SAAA,GAAY,oBAAoB,IAAI,CAAA;AAC1C,EAAA,MAAM,WAAA,GAAc,sBAAsB,QAAQ,CAAA;AAClD,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAElB,EAAA,SAAS,UAAU,IAAA,EAA0B;AAC3C,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,EACf;AAEA,EAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,MAAM,kBAAA,CAAmB,WAAA,EAAY,EAAG,OAAA,CAAQ,EAAA,EAAI,IAAA,EAAM,QAAQ,CAAC,CAAA;AAE1F,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,uBAAOC,GAAAA,CAAC,MAAA,EAAA,EAAO,QAAA,EAAA,oDAAA,EAA+C,CAAA;AAAA,EAChE;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAEb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,WAAA,EACjB,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,kDAAA,EAChB,QAAA,EAAA;AAAA,wBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,cAAA,EAAM,CAAA;AAAA,0BAC5CA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAgC,QAAA,EAAA,uKAAA,EAG7C;AAAA,SAAA,EACF,CAAA;AAAA,wBACAC,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,QAAA,EAAU,IAAA,IAAQ,IAAA,CAAK,MAAA,IAAU,gBAAA;AAAA,YACjC,OAAA,EAAS,MAAM,SAAA,CAAU,CAAC,GAAG,IAAA,EAAM,EAAE,IAAA,EAAM,EAAA,EAAI,MAAA,EAAQ,EAAC,EAAG,CAAC,CAAA;AAAA,YAC5D,SAAA,EAAU,oIAAA;AAAA,YAEV,QAAA,EAAA;AAAA,8BAAAD,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,cAAE;AAAA;AAAA;AAAA;AAClC,OAAA,EACF,CAAA;AAAA,MAEC,IAAA,CAAK,WAAW,CAAA,mBACfA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uFAAsF,QAAA,EAAA,8GAAA,EAEnG,CAAA,mBAEAA,GAAAA,CAAC,IAAA,EAAA,EAAG,WAAU,WAAA,EACX,QAAA,EAAA,IAAA,CAAK,IAAI,CAAC,IAAA,EAAM,0BACfA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UAEC,IAAA;AAAA,UACA,KAAA;AAAA,UACA,OAAO,IAAA,CAAK,MAAA;AAAA,UACZ,QAAA,EAAU,IAAA;AAAA,UACV,QAAA,EAAU,CAAC,IAAA,KAAS,SAAA,CAAU,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAO,CAAA,KAAM,KAAA,GAAQ,IAAA,GAAO,CAAE,CAAC,CAAA;AAAA,UAC1E,MAAA,EAAQ,CAAC,KAAA,KAAU;AACjB,YAAA,MAAM,SAAS,KAAA,GAAQ,KAAA;AACvB,YAAA,IAAI,MAAA,GAAS,CAAA,IAAK,MAAA,IAAU,IAAA,CAAK,MAAA,EAAQ;AACzC,YAAA,MAAM,IAAA,GAAO,CAAC,GAAG,IAAI,CAAA;AACrB,YAAA,MAAM,CAAC,KAAK,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,OAAO,CAAC,CAAA;AACpC,YAAA,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,CAAA,EAAG,KAAM,CAAA;AAC7B,YAAA,SAAA,CAAU,IAAI,CAAA;AAAA,UAChB,CAAA;AAAA,UACA,QAAA,EAAU,MAAM,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,KAAM,KAAK,CAAC;AAAA,SAAA;AAAA,QAdvD;AAAA,OAgBR,CAAA,EACH,CAAA;AAAA,MAGD,6BAAaA,GAAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAK,SAAS,QAAA,EAAA,SAAA,EAAU,CAAA;AAAA,MAC7C,CAAC,SAAA,IAAa,qBAAA,CAAsB,IAAI,CAAA,oBACvCA,GAAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,QAAA,EAAA,8KAAA,EAGrB,CAAA;AAAA,MAGD,KAAA,oBACCC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2EAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAA,EACV,QAAA,EAAA,YAAA,CAAa,IAAI,CAAA,EACpB,CAAA;AAAA,wBACAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAAO,IAAA,EAAK,QAAA;AAAA,YAAS,QAAA,EAAU,IAAA;AAAA,YAAM,OAAA,EAAS,MAAM,KAAK,MAAA,EAAO;AAAA,YAC/D,SAAA,EAAU,yFAAA;AAAA,YAA0F,QAAA,EAAA;AAAA;AAAA,SAEtG;AAAA,wBACAC,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,QAAA,EAAU,IAAA,IAAQ,OAAA,CAAQ,SAAS,CAAA;AAAA,YACnC,OAAA,EAAS,IAAA;AAAA,YACT,SAAA,EAAU,oIAAA;AAAA,YAET,QAAA,EAAA;AAAA,cAAA,IAAA,oBAAQD,GAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,0BAAA,EAA2B,CAAA;AAAA,cAAG;AAAA;AAAA;AAAA;AAE5D,OAAA,EACF;AAAA,KAAA,EAEJ,CAAA;AAAA,IAEC,yBAASA,GAAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAK,SAAS,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IAGrC,IAAA,CAAK,MAAA,GAAS,CAAA,oBACbA,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,IAAA;AAAA,QACA,OAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAA;AAAA,QACA,QAAA;AAAA,QACA,QAAA,EAAU,WAAA;AAAA,QACV,MAAA,EAAQ,CAAC,SAAA,EAAW,KAAA,KAAU,GAAA,CAAI,MAAM,WAAA,EAAY,CAAE,oBAAA,CAAsB,SAAA,EAAW,KAAK,CAAC,CAAA;AAAA,QAC7F,OAAA,EAAS,CAAC,SAAA,EAAW,KAAA,KAAU,GAAA,CAAI,MAAM,WAAA,EAAY,CAAE,eAAA,CAAiB,SAAA,EAAW,KAAK,CAAC;AAAA;AAAA,KAC3F;AAAA,IAGD,IAAA,CAAK,WAAW,CAAA,IAAK,WAAA,oBACpBA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,qEAAA,EAE7C;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAMA,SAAS,UAAA,CAAW,EAAE,IAAA,EAAM,KAAA,EAAO,OAAO,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,QAAA,EAAS,EAQ5E;AACD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAID,MAAAA,CAAM,SAAS,EAAE,CAAA;AAE3C,EAAA,SAAS,OAAO,GAAA,EAAa;AAG3B,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AACjE,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACzB,IAAA,MAAM,MAAA,GAAS,CAAC,GAAG,IAAA,CAAK,MAAM,CAAA;AAC9B,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,EAAQ,IAAI,CAAC,MAAA,CAAO,SAAS,KAAK,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAC1E,IAAA,QAAA,CAAS,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,QAAQ,CAAA;AACpC,IAAA,QAAA,CAAS,EAAE,CAAA;AAAA,EACb;AAEA,EAAA,uBACEE,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,+BAAA,EACZ,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,OAAO,IAAA,CAAK,IAAA;AAAA,UACZ,QAAA;AAAA,UACA,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,CAAS,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,UAC3D,WAAA,EAAY,SAAA;AAAA,UACZ,YAAA,EAAY,CAAA,oBAAA,EAAiB,KAAA,GAAQ,CAAC,CAAA,CAAA;AAAA,UACtC,SAAA,EAAU;AAAA;AAAA,OACZ;AAAA,sBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,sBACzBA,GAAAA,CAACE,WAAAA,EAAA,EAAW,OAAM,iBAAA,EAAkB,QAAA,EAAU,QAAA,IAAY,KAAA,KAAU,GAAG,OAAA,EAAS,MAAM,MAAA,CAAO,EAAE,GAAG,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,sBACnGF,GAAAA,CAACE,WAAAA,EAAA,EAAW,KAAA,EAAM,oBAAmB,QAAA,EAAU,QAAA,IAAY,KAAA,KAAU,KAAA,GAAQ,GAAG,OAAA,EAAS,MAAM,MAAA,CAAO,CAAC,GAAG,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,sBAC3GF,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,YAAA,EAAW,qBAAA;AAAA,UACX,QAAA;AAAA,UACA,OAAA,EAAS,QAAA;AAAA,UACT,SAAA,EAAU,2FAAA;AAAA,UAEV,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA;AAC9B,KAAA,EACF,CAAA;AAAA,oBAEAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EACZ,QAAA,EAAA;AAAA,MAAA,IAAA,CAAK,MAAA,CAAO,IAAI,CAAC,KAAA,EAAO,6BACvBA,IAAAA,CAAC,MAAA,EAAA,EAAiB,SAAA,EAAU,0EAAA,EACzB,QAAA,EAAA;AAAA,QAAA,KAAA;AAAA,wBACDD,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,YAAA,EAAY,WAAW,KAAK,CAAA,CAAA;AAAA,YAC5B,QAAA;AAAA,YACA,SAAS,MAAM,QAAA,CAAS,EAAE,GAAG,MAAM,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,KAAM,QAAQ,GAAG,CAAA;AAAA,YACzF,SAAA,EAAU,kEAAA;AAAA,YAEV,QAAA,kBAAAA,GAAAA,CAAC,CAAA,EAAA,EAAE,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA;AACzB,OAAA,EAAA,EAVS,KAWX,CACD,CAAA;AAAA,sBACDA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,KAAA;AAAA,UACP,QAAA;AAAA,UACA,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACxC,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,YAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AAAE,cAAA,CAAA,CAAE,cAAA,EAAe;AAAG,cAAA,MAAA,CAAO,KAAK,CAAA;AAAA,YAAE;AAAA,UAC7D,CAAA;AAAA,UACA,MAAA,EAAQ,MAAM,MAAA,CAAO,KAAK,CAAA;AAAA,UAC1B,WAAA,EAAa,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,IAAI,SAAA,GAAY,WAAA;AAAA,UACpD,YAAA,EAAY,CAAA,uBAAA,EAAoB,KAAA,GAAQ,CAAC,CAAA,CAAA;AAAA,UACzC,SAAA,EAAU;AAAA;AAAA;AACZ,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAMA,IAAM,KAAA,GAAQ,CAAC,IAAA,EAAM,GAAA,EAAK,IAAI,CAAA;AAE9B,SAAS,WAAA,CAAY,EAAE,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,OAAA,EAAQ,EAU1F;AACD,EAAA,MAAM,QAAQ,IAAA,CAAK,MAAA,CAAO,CAAC,GAAA,KAAQ,IAAI,OAAO,CAAA;AAC9C,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,KAAA,CAAM,KAAA,CAAM,CAAC,GAAA,KAAQ,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,OAAA,CAAS,EAAE,CAAC,CAAA;AAE1F,EAAA,SAAS,OAAO,EAAA,EAAY;AAC1B,IAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,QAAQ,CAAA;AAC7B,IAAA,IAAI,KAAK,GAAA,CAAI,EAAE,CAAA,EAAG,IAAA,CAAK,OAAO,EAAE,CAAA;AAAA,SAC3B,IAAA,CAAK,IAAI,EAAE,CAAA;AAChB,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,EACf;AAEA,EAAA,uBACEC,IAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,WAAA,EACjB,QAAA,EAAA;AAAA,oBAAAA,KAAC,QAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,WAAA,EAAS,CAAA;AAAA,sBAC/CC,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA;AAAA,QAAA,qIAAA;AAAA,QAEzB,IAAA,CAAK,MAAA;AAAA,QAAO;AAAA,OAAA,EAChC;AAAA,KAAA,EACF,CAAA;AAAA,IAEC,KAAA,oBACCD,GAAAA,CAAC,MAAA,EAAA,EAAO,QAAA,EAAA,mHAAA,EAER,CAAA;AAAA,IAGD,QAAA,CAAS,IAAA,GAAO,CAAA,oBACfA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,OAAO,QAAA,CAAS,IAAA;AAAA,QAChB,QAAA,EAAU,IAAA;AAAA,QACV,OAAA,EAAS,CAAC,KAAA,KAAU;AAClB,UAAA,KAAA,MAAW,EAAA,IAAM,QAAA,EAAU,MAAA,CAAO,EAAA,EAAI,KAAK,CAAA;AAAA,QAC7C,CAAA;AAAA,QACA,OAAA,EAAS,MAAM,QAAA,iBAAS,IAAI,KAAK;AAAA;AAAA,KACnC;AAAA,oBAGFA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCACb,QAAA,kBAAAC,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,8BAAA,EACf,QAAA,EAAA;AAAA,sBAAAD,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qDAAA,EACf,QAAA,kBAAAC,KAAC,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,eAAA,EACZ,QAAA,kBAAAA,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,UAAA;AAAA,YACL,YAAA,EAAW,kBAAA;AAAA,YACX,OAAA,EAAS,WAAA;AAAA,YACT,QAAA,EAAU,IAAA,IAAQ,KAAA,CAAM,MAAA,KAAW,CAAA;AAAA,YACnC,UAAU,MAAM,QAAA,CAAS,WAAA,mBAAc,IAAI,KAAI,GAAI,IAAI,GAAA,CAAI,KAAA,CAAM,IAAI,CAAC,CAAA,KAAM,EAAE,OAAA,CAAS,EAAE,CAAC,CAAC;AAAA;AAAA,SAC7F,EACF,CAAA;AAAA,wBACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBAAwB,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,wBAC9CA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBAAwB,QAAA,EAAA,UAAA,EAAK,CAAA;AAAA,wBAC3CA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBAAwB,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,wBACjDA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBAAwB,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,wBACzCA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBAAwB,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,wBAC7CA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBAAwB,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,wBAC1CA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBAAwB,QAAA,EAAA,sBAAA,EAAc,CAAA;AAAA,wBACpDA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBAAwB,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,wBAC1CA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBAAwB,QAAA,EAAA,OAAA,EAAK;AAAA,OAAA,EAC7C,CAAA,EACF,CAAA;AAAA,sBACAA,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,YACd,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,qBACTA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UAEC,GAAA;AAAA,UACA,IAAA;AAAA,UACA,OAAA;AAAA,UACA,IAAA;AAAA,UACA,OAAA,EAAS,IAAI,OAAA,GAAU,QAAA,CAAS,IAAI,GAAA,CAAI,OAAA,CAAQ,EAAE,CAAA,GAAI,KAAA;AAAA,UACtD,UAAU,MAAM,GAAA,CAAI,WAAW,MAAA,CAAO,GAAA,CAAI,QAAQ,EAAE,CAAA;AAAA,UACpD,MAAA;AAAA,UACA;AAAA,SAAA;AAAA,QARK,IAAI,OAAA,EAAS,EAAA,IAAM,wBAAA,CAAyB,GAAA,CAAI,SAAS,IAAI;AAAA,OAUrE,CAAA,EACH;AAAA,KAAA,EACF,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,UAAA,CAAW,EAAE,GAAA,EAAK,IAAA,EAAM,OAAA,EAAS,MAAM,OAAA,EAAS,QAAA,EAAU,MAAA,EAAQ,OAAA,EAAQ,EAShF;AACD,EAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AACpB,EAAA,MAAM,UAAU,CAAC,OAAA;AACjB,EAAA,MAAM,KAAA,GAAQ,wBAAA,CAAyB,GAAA,CAAI,OAAA,EAAS,IAAI,CAAA;AAKxD,EAAA,MAAM,MAAA,GAAS,CAAC,KAAA,EAAe,KAAA,EAAgB,QAAA,KAAsB;AACnE,IAAA,IAAI,CAAC,OAAA,IAAW,KAAA,KAAU,QAAA,EAAU;AACpC,IAAA,MAAA,CAAO,QAAQ,EAAA,EAAI,EAAE,CAAC,KAAK,GAAG,OAAO,CAAA;AAAA,EACvC,CAAA;AAEA,EAAA,uBACEC,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAW,OAAA,GAAU,sCAAsC,MAAA,EAC7D,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,aAAA,EACZ,QAAA,kBAAAA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QAAM,IAAA,EAAK,UAAA;AAAA,QAAW,YAAA,EAAY,cAAc,KAAK,CAAA,CAAA;AAAA,QAAI,OAAA;AAAA,QACxD,UAAU,IAAA,IAAQ,OAAA;AAAA,QAAS,QAAA,EAAU;AAAA;AAAA,KAAU,EACnD,CAAA;AAAA,oBACAC,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBAAA,EACX,QAAA,EAAA;AAAA,MAAA,KAAA;AAAA,MACA,2BAAWD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAA2C,QAAA,EAAA,SAAA,EAAO;AAAA,KAAA,EAChF,CAAA;AAAA,oBACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,eACZ,QAAA,kBAAAA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QAAW,KAAA,EAAO,SAAS,KAAA,IAAS,IAAA;AAAA,QAAM,UAAU,IAAA,IAAQ,OAAA;AAAA,QAC3D,WAAA,EAAa,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AAAA,QAAG,QAAA,EAAU,CAAC,CAAA,KAAM,MAAA,CAAO,SAAS,CAAA,EAAG,OAAA,EAAS,SAAS,IAAI;AAAA;AAAA,KAAG,EACrG,CAAA;AAAA,oBACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,eACZ,QAAA,kBAAAA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QAAW,KAAA,EAAO,SAAS,cAAA,IAAkB,IAAA;AAAA,QAAM,UAAU,IAAA,IAAQ,OAAA;AAAA,QACpE,WAAA,EAAY,QAAA;AAAA,QAAI,QAAA,EAAU,CAAC,CAAA,KAAM,MAAA,CAAO,kBAAkB,CAAA,EAAG,OAAA,EAAS,kBAAkB,IAAI;AAAA;AAAA,KAAG,EACnG,CAAA;AAAA,oBACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,eACZ,QAAA,kBAAAA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAAS,KAAA,EAAO,SAAS,GAAA,IAAO,EAAA;AAAA,QAAI,UAAU,IAAA,IAAQ,OAAA;AAAA,QACrD,WAAA,EAAa,QAAQ,GAAA,IAAO,KAAA;AAAA,QAAO,QAAA,EAAU,CAAC,CAAA,KAAM,MAAA,CAAO,OAAO,CAAA,IAAK,IAAA,EAAM,OAAA,EAAS,GAAA,IAAO,IAAI;AAAA;AAAA,KAAG,EACxG,CAAA;AAAA,oBACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,eACZ,QAAA,kBAAAA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,SAAS,cAAA,IAAkB,IAAA;AAAA,QAClC,UAAU,IAAA,IAAQ,OAAA;AAAA,QAClB,WAAA,EAAY,GAAA;AAAA,QACZ,OAAA,EAAO,IAAA;AAAA,QACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,UAAA,IAAI,CAAC,OAAA,IAAW,CAAA,IAAK,IAAA,IAAQ,CAAA,KAAM,QAAQ,cAAA,EAAgB;AAC3D,UAAA,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,QACvB;AAAA;AAAA,KACF,EACF,CAAA;AAAA,oBACAA,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,eACZ,QAAA,kBAAAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UAAW,KAAA,EAAO,SAAS,MAAA,IAAU,IAAA;AAAA,UAAM,UAAU,IAAA,IAAQ,OAAA;AAAA,UAC5D,aAAa,OAAA,CAAQ,MAAA,IAAU,OAAO,QAAA,GAAM,MAAA,CAAO,QAAQ,MAAM,CAAA;AAAA,UAAG,KAAA,EAAM,MAAA;AAAA,UAC1E,QAAA,EAAU,CAAC,CAAA,KAAM,MAAA,CAAO,UAAU,CAAA,EAAG,OAAA,EAAS,UAAU,IAAI;AAAA;AAAA,OAAG;AAAA,sBACjEC,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,SAAS,UAAA,IAAc,EAAA;AAAA,UAC9B,UAAU,IAAA,IAAQ,OAAA;AAAA,UAClB,QAAA,EAAU,CAAC,CAAA,KAAM,MAAA,CAAO,YAAA,EAAc,CAAA,CAAE,MAAA,CAAO,KAAA,IAAS,IAAA,EAAM,OAAA,EAAS,UAAA,IAAc,IAAI,CAAA;AAAA,UACzF,YAAA,EAAY,sBAAsB,KAAK,CAAA,CAAA;AAAA,UACvC,SAAA,EAAU,kEAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,EAAA,EAAI,kBAAQ,UAAA,EAAW,CAAA;AAAA,YACpC,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBAASA,GAAAA,CAAC,QAAA,EAAA,EAAkB,KAAA,EAAO,IAAA,EAAO,QAAA,EAAA,IAAA,EAAA,EAApB,IAAyB,CAAS;AAAA;AAAA;AAAA;AACtE,KAAA,EACF,CAAA,EACF,CAAA;AAAA,oBACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,WAAU,aAAA,EACZ,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACX,QAAA,EAAA,CAAC,YAAY,SAAA,EAAW,UAAU,EAAY,GAAA,CAAI,CAAC,wBACnDA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QAEC,KAAA,EAAO,OAAA,GAAU,GAAG,CAAA,IAAK,IAAA;AAAA,QACzB,UAAU,IAAA,IAAQ,OAAA;AAAA,QAClB,KAAA,EAAM,MAAA;AAAA,QACN,WAAA,EAAa,QAAQ,GAAG,CAAA,IAAK,OAAO,QAAA,GAAM,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,QAC7D,QAAA,EAAU,CAAC,CAAA,KAAM,MAAA,CAAO,KAAK,CAAA,EAAG,OAAA,GAAU,GAAG,CAAA,IAAK,IAAI;AAAA,OAAA;AAAA,MALjD;AAAA,KAOR,GACH,CAAA,EACF,CAAA;AAAA,oBACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,eACZ,QAAA,kBAAAC,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,SAAS,OAAA,IAAW,EAAA;AAAA,QAC3B,QAAA,EAAU,IAAA,IAAQ,OAAA,IAAW,OAAA,CAAQ,OAAO,MAAA,KAAW,CAAA;AAAA,QACvD,QAAA,EAAU,CAAC,CAAA,KAAM,MAAA,CAAO,SAAA,EAAW,CAAA,CAAE,MAAA,CAAO,KAAA,IAAS,IAAA,EAAM,OAAA,EAAS,OAAA,IAAW,IAAI,CAAA;AAAA,QACnF,YAAA,EAAY,WAAW,KAAK,CAAA,CAAA;AAAA,QAC5B,SAAA,EAAU,uEAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,EAAA,EAAG,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,UACpB,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,qBAC1BC,IAAAA,CAAC,QAAA,EAAA,EAAsB,KAAA,EAAO,KAAA,CAAM,EAAA,EAAI,QAAA,EAAA;AAAA,YAAA,OAAA;AAAA,YAAM,KAAA,GAAQ;AAAA,WAAA,EAAA,EAAzC,KAAA,CAAM,EAAqC,CACzD;AAAA;AAAA;AAAA,KACH,EACF,CAAA;AAAA,oBACAD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,eACZ,QAAA,kBAAAA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,UAAA;AAAA,QACL,YAAA,EAAY,GAAG,KAAK,CAAA,MAAA,CAAA;AAAA,QACpB,OAAA,EAAS,SAAS,MAAA,KAAW,QAAA;AAAA,QAC7B,UAAU,IAAA,IAAQ,OAAA;AAAA,QAClB,QAAA,EAAU,CAAC,CAAA,KAAM,MAAA,CAAO,QAAA,EAAU,CAAA,CAAE,MAAA,CAAO,OAAA,GAAU,QAAA,GAAW,UAAA,EAAY,OAAA,EAAS,MAAM;AAAA;AAAA,KAC7F,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAIA,SAAS,QAAQ,EAAE,KAAA,EAAO,QAAA,EAAU,OAAA,EAAS,SAAQ,EAKlD;AACD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAID,MAAAA,CAAM,SAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,MAAAA,CAAM,SAAS,EAAE,CAAA;AAC7C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,MAAAA,CAAM,SAAS,EAAE,CAAA;AAEzC,EAAA,uBACEE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mFAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAe,QAAA,EAAA;AAAA,MAAA,KAAA;AAAA,MAAM,cAAA;AAAA,MAAa,KAAA,GAAQ,IAAI,GAAA,GAAM;AAAA,KAAA,EAAG,CAAA;AAAA,oBACvED,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,MAAA,EAAC,CAAA;AAAA,oBACzCA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QAAM,KAAA,EAAO,KAAA;AAAA,QAAO,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QAAG,WAAA,EAAY,UAAA;AAAA,QAC1E,YAAA,EAAW,qBAAA;AAAA,QAAmB,SAAA,EAAU;AAAA;AAAA,KAAgE;AAAA,oBAC1GA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAAO,IAAA,EAAK,QAAA;AAAA,QAAS,QAAA,EAAU,QAAA,IAAY,WAAA,CAAY,KAAK,CAAA,IAAK,IAAA;AAAA,QAChE,SAAS,MAAM;AAAE,UAAA,OAAA,CAAQ,EAAE,KAAA,EAAO,WAAA,CAAY,KAAK,GAAG,CAAA;AAAG,UAAA,QAAA,CAAS,EAAE,CAAA;AAAA,QAAE,CAAA;AAAA,QACtE,SAAA,EAAU,4EAAA;AAAA,QAA6E,QAAA,EAAA;AAAA;AAAA,KAEzF;AAAA,oBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,MAAA,EAAC,CAAA;AAAA,oBACzCA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QAAM,KAAA,EAAO,MAAA;AAAA,QAAQ,UAAU,CAAC,CAAA,KAAM,SAAA,CAAU,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QAAG,WAAA,EAAY,MAAA;AAAA,QAC5E,YAAA,EAAW,iBAAA;AAAA,QAAkB,SAAA,EAAU;AAAA;AAAA,KAAgE;AAAA,oBACzGC,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAAO,KAAA,EAAO,IAAA;AAAA,QAAM,UAAU,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QAAG,YAAA,EAAW,oBAAA;AAAA,QACxE,SAAA,EAAU,0DAAA;AAAA,QACV,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,EAAA,EAAG,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,UACtB,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,qBAAMA,GAAAA,CAAC,QAAA,EAAA,EAAe,KAAA,EAAO,CAAA,EAAI,QAAA,EAAA,CAAA,EAAA,EAAd,CAAgB,CAAS;AAAA;AAAA;AAAA,KAC1D;AAAA,oBACAA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAAO,IAAA,EAAK,QAAA;AAAA,QAAS,QAAA,EAAU,QAAA,IAAY,WAAA,CAAY,MAAM,CAAA,IAAK,IAAA;AAAA,QACjE,SAAS,MAAM;AAAE,UAAA,OAAA,CAAQ,EAAE,QAAQ,WAAA,CAAY,MAAM,GAAG,UAAA,EAAY,IAAA,IAAQ,MAAM,CAAA;AAAG,UAAA,SAAA,CAAU,EAAE,CAAA;AAAA,QAAE,CAAA;AAAA,QACnG,SAAA,EAAU,4EAAA;AAAA,QAA6E,QAAA,EAAA;AAAA;AAAA,KAEzF;AAAA,oBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,oBACzBA,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,OAAA,EAAS,OAAA,EAAS,SAAA,EAAU,6CAAA,EAA8C,QAAA,EAAA,sBAAA,EAEhG;AAAA,GAAA,EACF,CAAA;AAEJ;AAOO,SAAS,YAAY,GAAA,EAA4B;AACtD,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,WAAA,EAAa,EAAE,CAAA,CAAE,OAAA,CAAQ,KAAK,GAAG,CAAA;AAC7D,EAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,EAAK,EAAG,OAAO,IAAA;AAC5B,EAAA,MAAM,CAAA,GAAI,OAAO,OAAO,CAAA;AACxB,EAAA,OAAO,OAAO,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA,IAAK,IAAI,CAAA,GAAI,IAAA;AAC5C;AAEA,SAAS,UAAA,CAAW,EAAE,KAAA,EAAO,QAAA,EAAU,aAAa,QAAA,EAAU,KAAA,GAAQ,MAAA,EAAQ,OAAA,EAAQ,EAOnF;AACD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAID,MAAAA,CAAM,QAAA,CAAS,KAAA,IAAS,IAAA,GAAO,EAAA,GAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAC3E,EAAAA,MAAAA,CAAM,UAAU,MAAM;AAAE,IAAA,QAAA,CAAS,KAAA,IAAS,IAAA,GAAO,EAAA,GAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EAAE,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAC/E,EAAA,uBACEC,GAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,KAAA;AAAA,MACP,QAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,MACxC,QAAQ,MAAM;AACZ,QAAA,MAAM,MAAA,GAAS,YAAY,KAAK,CAAA;AAChC,QAAA,QAAA,CAAS,MAAA,IAAU,OAAO,IAAA,GAAO,OAAA,GAAU,KAAK,KAAA,CAAM,MAAM,IAAI,MAAM,CAAA;AAAA,MACxE,CAAA;AAAA,MACA,SAAA,EAAW,OAAO,KAAK,CAAA,0EAAA;AAAA;AAAA,GACzB;AAEJ;AAEA,SAAS,SAAS,EAAE,KAAA,EAAO,QAAA,EAAU,WAAA,EAAa,UAAS,EAKxD;AACD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAID,MAAAA,CAAM,SAAS,KAAK,CAAA;AAC9C,EAAAA,MAAAA,CAAM,UAAU,MAAM;AAAE,IAAA,QAAA,CAAS,KAAK,CAAA;AAAA,EAAE,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAClD,EAAA,uBACEC,GAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,KAAA;AAAA,MACP,QAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,MACxC,MAAA,EAAQ,MAAM,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA;AAAA,MACnC,SAAA,EAAU;AAAA;AAAA,GACZ;AAEJ;AAEA,SAASE,YAAW,EAAE,KAAA,EAAO,QAAA,EAAU,OAAA,EAAS,UAAS,EAKtD;AACD,EAAA,uBACEF,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAY,KAAA;AAAA,MACZ,KAAA,EAAO,KAAA;AAAA,MACP,QAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA,EAAU,gIAAA;AAAA,MAET;AAAA;AAAA,GACH;AAEJ;AAEA,SAAS,MAAA,CAAO,EAAE,QAAA,EAAU,IAAA,EAAK,EAAkD;AACjF,EAAA,MAAM,GAAA,GAAM,IAAA,KAAS,OAAA,GACjB,yDAAA,GACA,iDAAA;AACJ,EAAA,uBACEC,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAW,CAAA,2DAAA,EAA8D,GAAG,CAAA,CAAA,EAC5E,QAAA,EAAA;AAAA,IAAA,IAAA,KAAS,OAAA,oBAAWD,GAAAA,CAAC,aAAA,EAAA,EAAc,WAAU,6BAAA,EAA8B,CAAA;AAAA,oBAC5EA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAS;AAAA,GAAA,EAClB,CAAA;AAEJ;AAEA,SAAS,aAAa,IAAA,EAAoD;AACxE,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,IAAA,CAAK,OAAO,MAAA,EAAQ,KAAA,CAAM,KAAK,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,QAAA,CAAU,CAAA;AAClE,EAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAQ,KAAA,CAAM,KAAK,CAAA,EAAG,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,WAAA,CAAa,CAAA;AAC7E,EAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAQ,KAAA,CAAM,KAAK,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,WAAA,CAAa,CAAA;AACvE,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,gCAAA;AAG/B,EAAA,OAAO,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,oHAAA,CAAA;AAC5B;AAEA,SAAS,QAAQ,KAAA,EAAwB;AACvC,EAAA,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC9D;;;ACjoBO,IAAM,qBAAA,GAAwB,eAAA;AAE9B,IAAM,uBAAA,GAA0B,aAAa,qBAAqB,CAAA,CAAA;AAGzE,IAAM,UAAA,GAAa,aAAA;AAEZ,SAAS,qBAAqB,UAAA,EAA4B;AAC/D,EAAA,OAAO,CAAA,EAAG,uBAAuB,CAAA,CAAA,EAAI,UAAU,IAAI,UAAU,CAAA,CAAA;AAC/D;AASO,SAAS,kBAAA,CAAmB,UAAA,EAAoB,QAAA,EAAkB,IAAA,GAAwB,MAAA,EAAgB;AAC/G,EAAA,MAAM,OAAO,CAAA,EAAG,oBAAA,CAAqB,UAAU,CAAC,IAAI,QAAQ,CAAA,CAAA;AAC5D,EAAA,OAAO,IAAA,KAAS,MAAA,GAAS,CAAA,EAAG,IAAI,CAAA,KAAA,CAAA,GAAU,IAAA;AAC5C;AASO,SAAS,2BAA2B,IAAA,EAA8B;AACvE,EAAA,MAAM,MAAM,IAAA,KAAS,OAAO,WAAW,WAAA,GAAc,EAAA,GAAK,OAAO,QAAA,CAAS,IAAA,CAAA;AAC1E,EAAA,MAAM,IAAA,GAAO,IAAI,UAAA,CAAW,GAAG,IAAI,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,GAAI,GAAA;AAClD,EAAA,MAAM,MAAA,GAAS,CAAA,EAAG,uBAAuB,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,CAAA;AACvD,EAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,MAAM,GAAG,OAAO,IAAA;AACrC,EAAA,OAAO,IAAA,CAAK,MAAM,MAAA,CAAO,MAAM,EAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,IAAA;AACpD;ACzBA,IAAM,cAAA,GAAiB,qBAAqB,iBAAiB,CAAA;AActD,SAAS,aAAA,CAAc,EAAE,KAAA,EAAO,QAAA,EAAU,aAAY,EAI1D;AACD,EAAA,MAAM,IAAA,GAAOD,MAAAA,CAAM,OAAA,CAAQ,MAAM,WAAA,QAAmB,eAAA,EAAgB,EAAG,CAAC,WAAW,CAAC,CAAA;AACpF,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,MAAAA,CAAM,SAAmC,IAAI,CAAA;AACrE,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,MAAAA,CAAM,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,MAAAA,CAAM,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,GAAA,GAAMA,MAAAA,CAAM,MAAA,CAAuB,IAAI,CAAA;AAE7C,EAAA,MAAM,IAAA,GAAOA,MAAAA,CAAM,WAAA,CAAY,MAAM;AACnC,IAAA,IAAI,OAAO,IAAA,CAAK,oBAAA,KAAyB,UAAA,EAAY;AAAE,MAAA,OAAA,CAAQ,EAAE,CAAA;AAAG,MAAA;AAAA,IAAO;AAC3E,IAAA,KAAK,IAAA,CAAK,oBAAA,EAAqB,CAAE,IAAA,CAAK,OAAO,CAAA,CAAE,KAAA,CAAM,MAAM,OAAA,CAAQ,EAAE,CAAC,CAAA;AAAA,EACxE,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAAA,MAAAA,CAAM,SAAA,CAAU,IAAA,EAAM,CAAC,IAAI,CAAC,CAAA;AAE5B,EAAAA,MAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,IAAA,GAAO,CAAC,KAAA,KAAsB;AAClC,MAAA,IAAI,GAAA,CAAI,OAAA,IAAW,CAAC,GAAA,CAAI,OAAA,CAAQ,SAAS,KAAA,CAAM,MAAc,CAAA,EAAG,OAAA,CAAQ,KAAK,CAAA;AAAA,IAC/E,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,IAAI,CAAA;AAC3C,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,IAAI,CAAA;AAAA,EAC7D,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,QAAA,GAAA,CAAY,IAAA,IAAQ,EAAC,EAAG,IAAA,CAAK,CAAC,GAAA,KAAQ,GAAA,CAAI,EAAA,KAAO,KAAK,CAAA,IAAK,IAAA;AACjE,EAAA,MAAM,YAAA,GAAA,CAAgB,QAAQ,EAAC,EAAG,KAAK,CAAC,GAAA,KAAQ,GAAA,CAAI,SAAS,CAAA,IAAK,IAAA;AAElE,EAAA,MAAM,QAAQ,QAAA,GACV,CAAA,EAAG,SAAS,IAAI,CAAA,QAAA,EAAM,oBAAoB,QAAQ,CAAC,CAAA,CAAA,GACnD,YAAA,GACE,4BAAoB,YAAA,CAAa,IAAI,WAAM,mBAAA,CAAoB,YAAY,CAAC,CAAA,CAAA,GAC5E,mBAAA;AAEN,EAAA,uBACEE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAW,GAAA,EACxB,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAS,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,QAChC,SAAA,EAAU,qHAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EAAyC,CAAA;AAAA,0BACxDA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAA2B,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,0BACjDA,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,wCAAA,EAAyC;AAAA;AAAA;AAAA,KAClE;AAAA,IAEC,IAAA,oBACCC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kFAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAS,MAAM;AAAE,YAAA,OAAA,CAAQ,KAAK,CAAA;AAAG,YAAA,WAAA,CAAY,IAAI,CAAA;AAAA,UAAE,CAAA;AAAA,UACnD,SAAA,EAAU,wFAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAACG,IAAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,YAAE;AAAA;AAAA;AAAA,OAC9B;AAAA,sBACAF,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,mBAAA;AAAA,YACN,IAAA,EAAM,YAAA,GAAe,mBAAA,CAAoB,YAAY,CAAA,GAAI,uDAAA;AAAA,YACzD,QAAQ,KAAA,IAAS,IAAA;AAAA,YACjB,SAAS,MAAM;AAAE,cAAA,QAAA,CAAS,IAAI,CAAA;AAAG,cAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,YAAE;AAAA;AAAA,SAClD;AAAA,QAAA,CACE,QAAQ,EAAC,EAAG,GAAA,CAAI,CAAC,wBACjBA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YAEC,OAAO,GAAA,CAAI,IAAA;AAAA,YACX,IAAA,EAAM,oBAAoB,GAAG,CAAA;AAAA,YAC7B,MAAA,EAAQ,IAAI,EAAA,KAAO,KAAA;AAAA,YACnB,SAAS,MAAM;AAAE,cAAA,QAAA,CAAS,IAAI,EAAE,CAAA;AAAG,cAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,YAAE;AAAA,WAAA;AAAA,UAJ7C,GAAA,CAAI;AAAA,SAMZ;AAAA,OAAA,EACH,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAS,MAAM;AAAE,YAAA,OAAA,CAAQ,KAAK,CAAA;AAAG,YAAA,eAAA,CAAgB,cAAc,CAAA;AAAA,UAAE,CAAA;AAAA,UACjE,SAAA,EAAU,kFAAA;AAAA,UACX,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF,CAAA;AAAA,IAGD,4BACCA,GAAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,MAAM,WAAA,CAAY,KAAK,CAAA;AAAA,QAChC,SAAA,EAAW,CAAC,EAAA,KAAO;AAAE,UAAA,WAAA,CAAY,KAAK,CAAA;AAAG,UAAA,QAAA,CAAS,EAAE,CAAA;AAAG,UAAA,IAAA,EAAK;AAAA,QAAE;AAAA;AAAA;AAChE,GAAA,EAEJ,CAAA;AAEJ;AAUA,SAAS,eAAA,CAAgB,EAAE,OAAA,EAAS,SAAA,EAAU,EAG3C;AACD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAID,MAAAA,CAAM,SAAwB,IAAI,CAAA;AAC5D,EAAA,MAAM,WAAWA,MAAAA,CAAM,OAAA;AAAA,IACrB,MAAM,mBAAA,CAAoB,gBAAA,CAAiB,MAAmC,CAAA;AAAA,IAC9E;AAAC,GACH;AAKA,EAAA,uBACEC,GAAAA,CAAC,KAAA,EAAA,EAAM,MAAI,IAAA,EAAC,YAAA,EAAc,CAAC,IAAA,KAAS;AAAE,IAAA,IAAI,CAAC,MAAM,OAAA,EAAQ;AAAA,EAAE,CAAA,EACzD,QAAA,kBAAAC,IAAAA,CAAC,YAAA,EAAA,EAAa,MAAK,KAAA,EACjB,QAAA,EAAA;AAAA,oBAAAD,IAAC,WAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,UAAA,EAAA,EAAW,4BAAc,CAAA,EAC5B,CAAA;AAAA,oBACAC,IAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,WAAA,EAClB,QAAA,EAAA;AAAA,MAAA,KAAA,oBAASD,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+FAA+F,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBAC5HA,GAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,WAAW,gBAAA,CAAiB,MAAA;AAAA,UAC5B,IAAA,EAAK,QAAA;AAAA,UACL,UAAA,EAAW,YAAA;AAAA,UACX,QAAA,EAAQ,IAAA;AAAA,UACR,QAAA,EAAU,OAAA;AAAA,UACV,QAAA,EAAU,OAAO,IAAA,KAAS;AACxB,YAAA,IAAI;AACF,cAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,MAAA,CAAO,IAAa,CAAA;AACnD,cAAA,SAAA,CAAW,QAA2B,EAAE,CAAA;AAAA,YAC1C,SAAS,CAAA,EAAG;AACV,cAAA,QAAA,CAAS,YAAA,CAAa,CAAC,CAAC,CAAA;AAAA,YAC1B;AAAA,UACF;AAAA;AAAA;AACF,KAAA,EACF;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;AAEA,SAAS,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,SAAQ,EAK5C;AACD,EAAA,uBACEC,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA;AAAA,MACA,SAAA,EAAW,CAAA,wDAAA,EAA2D,MAAA,GAAS,aAAA,GAAgB,EAAE,CAAA,CAAA;AAAA,MAEjG,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAW,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,wBACjCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iCAAiC,QAAA,EAAA,IAAA,EAAK;AAAA;AAAA;AAAA,GACxD;AAEJ;AC7KO,SAAS,qBAAA,CAAsB,EAAE,KAAA,EAAO,QAAA,EAAU,aAAY,EAIlE;AACD,EAAA,MAAM,IAAA,GAAOD,MAAAA,CAAM,OAAA,CAAQ,MAAM,WAAA,QAAmBK,eAAAA,EAAgB,EAAG,CAAC,WAAW,CAAC,CAAA;AACpF,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIL,MAAAA,CAAM,SAAmC,IAAI,CAAA;AAErE,EAAAA,MAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,OAAO,IAAA,CAAK,oBAAA,KAAyB,UAAA,EAAY;AAAE,MAAA,OAAA,CAAQ,EAAE,CAAA;AAAG,MAAA;AAAA,IAAO;AAC3E,IAAA,KAAK,IAAA,CAAK,oBAAA,EAAqB,CAC5B,IAAA,CAAK,CAAC,IAAA,KAAS;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,OAAA,CAAQ,IAAI,CAAA;AAAA,IAAE,CAAC,CAAA,CAChD,KAAA,CAAM,MAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,OAAA,CAAQ,EAAE,CAAA;AAAA,IAAE,CAAC,CAAA;AAC9C,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAK,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,MAAA,GAAA,CAAU,QAAQ,EAAC,EAAG,OAAO,CAAC,GAAA,KAAQ,CAAC,GAAA,CAAI,SAAS,CAAA;AAC1D,EAAA,MAAM,MAAA,GAAS,OAAO,IAAA,CAAK,CAAC,QAAQ,GAAA,CAAI,EAAA,KAAO,KAAK,CAAA,IAAK,IAAA;AAEzD,EAAA,uBACEE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAO,KAAA,IAAS,EAAA;AAAA,QAChB,UAAU,CAAC,KAAA,KAAU,SAAS,KAAA,CAAM,MAAA,CAAO,SAAS,IAAI,CAAA;AAAA,QACxD,UAAU,IAAA,IAAQ,IAAA;AAAA,QAClB,SAAA,EAAU,uNAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,EAAA,EAAG,QAAA,EAAA,uCAAA,EAAgC,CAAA;AAAA,UAChD,MAAA,CAAO,IAAI,CAAC,GAAA,qBACXC,IAAAA,CAAC,QAAA,EAAA,EAAoB,KAAA,EAAO,GAAA,CAAI,EAAA,EAC7B,QAAA,EAAA;AAAA,YAAA,GAAA,CAAI,IAAA;AAAA,YACJ,GAAA,CAAI,aAAA,KAAkB,KAAA,GAAQ,kCAAA,GAA0B;AAAA,WAAA,EAAA,EAF9C,GAAA,CAAI,EAGjB,CACD;AAAA;AAAA;AAAA,KACH;AAAA,oBAEAA,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yDAAA,EACV,QAAA,EAAA;AAAA,MAAA,MAAA,EAAQ,kBAAkB,KAAA,GACvB,sFAAA,GACA,MAAA,CAAO,MAAA,KAAW,IAChB,iCAAA,GACA,kCAAA;AAAA,sBACNA,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,MAAMI,eAAAA,CAAgB,oBAAA,CAAqB,0BAA0B,CAAC,CAAA;AAAA,UAC/E,SAAA,EAAU,6DAAA;AAAA,UAET,QAAA,EAAA;AAAA,YAAA,MAAA,CAAO,MAAA,KAAW,IAAI,iBAAA,GAAoB,kBAAA;AAAA,4BAC3CL,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA;AAAA;AACpC,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACxDA,IAAM,QAAA,GAAW,CAAC,MAAA,KAAoC,MAAA,CAAO,UAAA,KAAe,KAAA;AAuB5E,IAAM,WAAA,GAAsC;AAAA,EAC1C,MAAA,EAAQ,iCAAA;AAAA,EACR,KAAA,EAAO,2BAAA;AAAA,EACP,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,YAAA,GAAuC;AAAA,EAC3C,MAAA,EAAQ,OAAA;AAAA,EACR,KAAA,EAAO,UAAA;AAAA,EACP,QAAA,EAAU;AACZ,CAAA;AAEA,SAAS,KAAA,CAAM,KAAA,EAAgB,QAAA,GAAW,KAAA,EAAO;AAC/C,EAAA,MAAM,CAAA,GAAI,OAAO,KAAK,CAAA;AACtB,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,GAAG,OAAO,QAAA;AAChC,EAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,EAAE,KAAA,EAAO,UAAA,EAAY,QAAA,EAAU,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA;AACjF;AAGO,SAAS,QAAQ,KAAA,EAAuB;AAC7C,EAAA,OAAO,MACJ,SAAA,CAAU,KAAK,EACf,OAAA,CAAQ,kBAAA,EAAoB,EAAE,CAAA,CAC9B,WAAA,EAAY,CACZ,IAAA,GACA,OAAA,CAAQ,aAAA,EAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,YAAY,EAAE,CAAA;AAC3B;AAOA,SAAS,aAAa,WAAA,EAAoD;AACxE,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,CAAC,GAAA,KAAQ;AACZ,MAAA,MAAM,SAAU,GAAA,CAAyB,MAAA;AACzC,MAAA,OAAO,MAAA,EAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAA,EAAG,GAAA,IAAO,MAAA,GAAS,CAAC,CAAA,EAAG,GAAA;AAAA,IAC/D,CAAA;AAAA,IACA,MAAA,EAAQ,OAAO,IAAA,EAAM,GAAA,KAAQ;AAC3B,MAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,MAAM,IAAI,MAAM,2CAA2C,CAAA;AACxE,MAAA,MAAM,QAAQ,MAAM,WAAA,GAAc,kBAAA,CAAmB,GAAA,CAAI,IAAI,IAAI,CAAA;AACjE,MAAA,OAAO,KAAA,CAAM,GAAA;AAAA,IACf,CAAA;AAAA,IACA,MAAA,EAAQ;AAAA,GACV;AACF;AAEO,SAAS,sBAAA,CACd,YAAA,GAAe,KAAA,EACf,WAAA,EACoB;AACpB,EAAA,MAAM,MAAA,GAAqB;AAAA;AAAA,IAEzB;AAAA,MACE,GAAA,EAAK,MAAA;AAAA,MAAQ,KAAA,EAAO,iBAAA;AAAA,MAAmB,IAAA,EAAM,MAAA;AAAA,MAAQ,QAAA,EAAU,IAAA;AAAA,MAC/D,KAAA,EAAO,SAAA;AAAA,MAAW,WAAA,EAAa,8BAAA;AAAA,MAC/B,UAAA,EAAY,IAAA;AAAA,MAAM,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA,MAC/C,UAAA,EAAY,CAAC,EAAA,EAAI,GAAA,qBACfC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EAIb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,aAAU,GAAA,EAAK,GAAA,CAAI,SAAS,CAAC,CAAA,EAAG,GAAA,EAAK,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,wBACrDC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EACb,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sBAAA,EAAwB,cAAI,IAAA,EAAK,CAAA;AAAA,UAC7C,GAAA,CAAI,uBAAOA,GAAAA,CAAC,OAAE,SAAA,EAAU,+BAAA,EAAiC,cAAI,GAAA,EAAI;AAAA,SAAA,EACpE;AAAA,OAAA,EACF;AAAA,KAEJ;AAAA,IACA;AAAA,MACE,GAAA,EAAK,MAAA;AAAA,MAAQ,KAAA,EAAO,KAAA;AAAA,MAAO,IAAA,EAAM,MAAA;AAAA,MAAQ,KAAA,EAAO,SAAA;AAAA,MAChD,WAAA,EAAa,yBAAA;AAAA,MACb,IAAA,EAAM,6EAAA;AAAA,MACN,WAAA,EAAa;AAAA,KACf;AAAA,IACA;AAAA,MACE,GAAA,EAAK,aAAA;AAAA,MAAe,KAAA,EAAO,iBAAA;AAAA,MAAa,IAAA,EAAM,UAAA;AAAA,MAAY,KAAA,EAAO,SAAA;AAAA,MAAW,IAAA,EAAM,CAAA;AAAA,MAClF,WAAA,EAAa,uDAAA;AAAA,MACb,WAAA,EAAa;AAAA,KACf;AAAA;AAAA,IAGA;AAAA,MACE,GAAA,EAAK,OAAA;AAAA,MAAS,KAAA,EAAO,mBAAA;AAAA,MAAkB,IAAA,EAAM,UAAA;AAAA,MAAY,QAAA,EAAU,IAAA;AAAA,MACnE,KAAA,EAAO,SAAA;AAAA,MAAW,QAAA,EAAU,YAAA;AAAA,MAAc,cAAA,EAAgB,IAAA;AAAA,MAAM,cAAA,EAAgB,OAAA;AAAA,MAChF,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA;AAAA;AAAA,MAG7B,UAAA,EAAY,CAAC,CAAA,EAAG,GAAA,qBACdC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uCAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,UAAK,SAAA,EAAU,aAAA,EAAe,gBAAM,CAAA,EAAG,GAAA,CAAI,QAAQ,CAAA,EAAE,CAAA;AAAA,QACrD,GAAA,CAAI,cAAA,GAAiB,GAAA,CAAI,KAAA,oBACxBA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAAA,EACb,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,cAAA,EAAgB,GAAA,CAAI,QAAQ,CAAA,EACzC;AAAA,OAAA,EAEJ;AAAA,KAEJ;AAAA,IACA;AAAA,MACE,GAAA,EAAK,gBAAA;AAAA,MAAkB,KAAA,EAAO,sBAAA;AAAA,MAAqB,IAAA,EAAM,UAAA;AAAA,MAAY,KAAA,EAAO,SAAA;AAAA,MAC5E,QAAA,EAAU,YAAA;AAAA,MAAc,cAAA,EAAgB,IAAA;AAAA,MAAM,cAAA,EAAgB,OAAA;AAAA,MAC9D,IAAA,EAAM,yEAAA;AAAA,MACN,WAAA,EAAa;AAAA,KACf;AAAA,IACA;AAAA,MACE,GAAA,EAAK,UAAA;AAAA,MAAY,KAAA,EAAO,UAAA;AAAA,MAAY,IAAA,EAAM,UAAA;AAAA,MAAY,KAAA,EAAO,SAAA;AAAA,MAAW,WAAA,EAAa,KAAA;AAAA,MACrF,OAAA,EAAS,CAAC,IAAA,KAAS;AACjB,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,IAAK,CAAA;AACpC,QAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,cAAc,CAAA,IAAK,CAAA;AAC/C,QAAA,IAAI,WAAW,CAAA,IAAK,KAAA,IAAS,CAAA,IAAK,OAAA,IAAW,OAAO,OAAO,IAAA;AAC3D,QAAA,MAAM,GAAA,GAAA,CAAQ,OAAA,GAAU,KAAA,IAAS,OAAA,GAAW,GAAA;AAC5C,QAAA,OAAO,EAAE,SAAS,CAAA,CAAA,EAAI,GAAA,CAAI,QAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,EAAK,IAAA,EAAM,UAAA,EAAW;AAAA,MAC5D;AAAA,KACF;AAAA;AAAA,IAGA;AAAA,MACE,GAAA,EAAK,KAAA;AAAA,MAAO,KAAA,EAAO,KAAA;AAAA,MAAO,IAAA,EAAM,MAAA;AAAA,MAAQ,KAAA,EAAO,WAAA;AAAA,MAC/C,WAAA,EAAa,SAAA;AAAA,MAAW,UAAA,EAAY,IAAA;AAAA,MAAM,WAAA,EAAa;AAAA,KACzD;AAAA,IACA;AAAA,MACE,GAAA,EAAK,gBAAA;AAAA,MAAkB,KAAA,EAAO,SAAA;AAAA,MAAW,IAAA,EAAM,QAAA;AAAA,MAAU,KAAA,EAAO,WAAA;AAAA,MAAa,GAAA,EAAK,CAAA;AAAA,MAClF,WAAA,EAAa,GAAA;AAAA,MAAK,IAAA,EAAM,yDAAA;AAAA,MACxB,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA,MAC7B,UAAA,EAAY,CAAC,CAAA,KAAM;AACjB,QAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA;AACvB,QAAA,uBACEA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,iBAAA,EAAoB,CAAA,KAAM,CAAA,GAAI,8BAAA,GAAiC,CAAA,IAAK,CAAA,GAAI,iBAAA,GAAoB,EAAE,IAC5G,QAAA,EAAA,CAAA,EACH,CAAA;AAAA,MAEJ;AAAA,KACF;AAAA;AAAA,IAGA;AAAA,MACE,GAAA,EAAK,QAAA;AAAA,MAAU,KAAA,EAAO,QAAA;AAAA,MAAU,IAAA,EAAM,WAAA;AAAA,MAAa,QAAA,EAAU,IAAA;AAAA,MAC7D,KAAA,EAAO,YAAA;AAAA,MAAc,IAAA,EAAM,CAAA;AAAA,MAC3B,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,OAAA,EAAS,aAAa,8CAAA,EAAmC;AAAA,QACrF,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,QAAA,EAAU,aAAa,yBAAA,EAAuB;AAAA,QACvE,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,UAAA,EAAY,aAAa,wCAAA;AAAsC,OAC9F;AAAA,MACA,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,KAAA;AAAA,MAC7B,UAAA,EAAY,CAAC,CAAA,KAAM;AACjB,QAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,IAAK,OAAO,CAAA;AAC7B,QAAA,uBACEA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,6EAA6E,WAAA,CAAY,CAAC,CAAA,IAAK,WAAA,CAAY,KAAK,CAAA,CAAA,EAC9H,QAAA,EAAA,YAAA,CAAa,CAAC,KAAK,CAAA,EACtB,CAAA;AAAA,MAEJ;AAAA,KACF;AAAA,IACA;AAAA,MACE,GAAA,EAAK,WAAA;AAAA,MAAa,KAAA,EAAO,kBAAA;AAAA,MAAoB,IAAA,EAAM,QAAA;AAAA,MAAU,KAAA,EAAO,YAAA;AAAA,MACpE,WAAA,EAAa,GAAA;AAAA,MAAK,IAAA,EAAM,yBAAA;AAAA,MAA2B,WAAA,EAAa;AAAA,KAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA;AAAA,MACE,GAAA,EAAK,YAAA;AAAA,MAAc,KAAA,EAAO,mBAAA;AAAA,MAAkB,IAAA,EAAM,SAAA;AAAA,MAAW,KAAA,EAAO,UAAA;AAAA,MAAY,IAAA,EAAM,CAAA;AAAA,MACtF,IAAA,EAAM,2FAAA;AAAA,MACN,WAAA,EAAa,KAAA;AAAA,MAAO,YAAA,EAAc;AAAA,KACpC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,MAIE,GAAA,EAAK,mBAAA;AAAA,MAAqB,KAAA,EAAO,mBAAA;AAAA,MAAqB,IAAA,EAAM,QAAA;AAAA,MAAU,KAAA,EAAO,UAAA;AAAA,MAAY,IAAA,EAAM,CAAA;AAAA,MAC/F,IAAA,EAAM,wFAAA;AAAA,MACN,WAAA,EAAa,KAAA;AAAA,MACb,WAAA,EAAa,CAAC,MAAA,KAAW,MAAA,CAAO,UAAA,KAAe,KAAA;AAAA,MAC/C,aAAa,CAAC,EAAE,KAAA,EAAO,QAAA,uBACrBA,GAAAA;AAAA,QAAC,qBAAA;AAAA,QAAA;AAAA,UACC,OAAQ,KAAA,IAA2B,IAAA;AAAA,UACnC,QAAA;AAAA,UACA;AAAA;AAAA;AACF,KAEJ;AAAA,IACA;AAAA,MACE,GAAA,EAAK,WAAA;AAAA,MAAa,KAAA,EAAO,WAAA;AAAA,MAAa,IAAA,EAAM,QAAA;AAAA,MAAU,KAAA,EAAO,UAAA;AAAA,MAAY,IAAA,EAAM,CAAA;AAAA,MAC/E,IAAA,EAAM,yHAAA;AAAA,MACN,WAAA,EAAa,KAAA;AAAA,MACb,WAAA,EAAa,CAAC,MAAA,KAAW,MAAA,CAAO,UAAA,KAAe,KAAA;AAAA,MAC/C,aAAa,CAAC,EAAE,KAAA,EAAO,QAAA,uBACrBA,GAAAA;AAAA,QAAC,aAAA;AAAA,QAAA;AAAA,UACC,OAAQ,KAAA,IAA2B,IAAA;AAAA,UACnC,QAAA;AAAA,UACA;AAAA;AAAA;AACF,KAEJ;AAAA,IACA;AAAA,MACE,GAAA,EAAK,QAAA;AAAA,MAAU,KAAA,EAAO,MAAA;AAAA,MAAQ,IAAA,EAAM,QAAA;AAAA,MAAU,KAAA,EAAO,UAAA;AAAA,MAAY,GAAA,EAAK,CAAA;AAAA,MAAG,WAAA,EAAa,KAAA;AAAA,MACtF,IAAA,EAAM,qDAAA;AAAA,MACN,WAAA,EAAa,KAAA;AAAA,MAAO,WAAA,EAAa,CAAC,MAAA,KAAW,MAAA,CAAO,UAAA,KAAe;AAAA,KACrE;AAAA,IACA;AAAA,MACE,GAAA,EAAK,YAAA;AAAA,MAAc,KAAA,EAAO,SAAA;AAAA,MAAW,IAAA,EAAM,QAAA;AAAA,MAAU,KAAA,EAAO,UAAA;AAAA,MAAY,WAAA,EAAa,KAAA;AAAA,MACrF,IAAA,EAAM,wDAAA;AAAA,MACN,SAAS,CAAC,EAAE,OAAO,IAAA,EAAM,KAAA,EAAO,MAAK,EAAG,EAAE,OAAO,GAAA,EAAK,KAAA,EAAO,KAAI,EAAG,EAAE,OAAO,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,MAChG,WAAA,EAAa,CAAC,MAAA,KAAW,MAAA,CAAO,UAAA,KAAe;AAAA,KACjD;AAAA;AAAA;AAAA;AAAA,IAIA,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,aAAA,EAAe,MAAM,QAAA,EAAU,KAAA,EAAO,UAAA,EAAY,GAAA,EAAK,GAAG,WAAA,EAAa,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,aAAa,QAAA,EAAS;AAAA,IACjJ,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,cAAA,EAAgB,MAAM,QAAA,EAAU,KAAA,EAAO,UAAA,EAAY,GAAA,EAAK,GAAG,WAAA,EAAa,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,aAAa,QAAA,EAAS;AAAA,IACjJ,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,kBAAA,EAAoB,MAAM,QAAA,EAAU,KAAA,EAAO,UAAA,EAAY,GAAA,EAAK,GAAG,WAAA,EAAa,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,aAAa,QAAA,EAAS;AAAA,IACtJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOE,GAAA,EAAK,UAAA;AAAA,MAAY,KAAA,EAAO,wBAAA;AAAA,MAA0B,IAAA,EAAM,aAAA;AAAA,MAAe,KAAA,EAAO,UAAA;AAAA,MAC9E,WAAA,EAAa,KAAA;AAAA,MAAO,WAAA,EAAa,QAAA;AAAA,MACjC,IAAA,EAAM,8GAAA;AAAA,MACN,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,cAAA,EAAe;AAAA,QAC9C,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,QAAA,EAAS;AAAA,QACtC,EAAE,KAAA,EAAO,WAAA,EAAU,KAAA,EAAO,SAAA;AAAU;AACtC;AACF,GACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,UAAA,EAAY,UAAA;AAAA,IACZ,IAAA,EAAM,SAAA;AAAA,IACN,YAAA,EAAc,MAAA;AAAA,IACd,MAAA;AAAA,IACA,WAAA,EAAa;AAAA;AAAA,MAEX,EAAE,IAAI,SAAA,EAAW,KAAA,EAAO,qBAAe,OAAA,EAAS,CAAA,EAAG,WAAW,IAAA,EAAK;AAAA,MACnE,EAAE,IAAI,SAAA,EAAW,KAAA,EAAO,YAAS,WAAA,EAAa,wDAAA,EAAuD,SAAS,CAAA,EAAE;AAAA,MAChH,EAAE,EAAA,EAAI,WAAA,EAAa,KAAA,EAAO,SAAA,EAAW,SAAS,CAAA,EAAE;AAAA,MAChD,EAAE,IAAI,YAAA,EAAc,KAAA,EAAO,oBAAc,WAAA,EAAa,wCAAA,EAA0C,SAAS,CAAA,EAAE;AAAA,MAC3G;AAAA,QACE,EAAA,EAAI,UAAA;AAAA,QACJ,KAAA,EAAO,OAAA;AAAA,QACP,WAAA,EACE,6JAAA;AAAA,QACF,OAAA,EAAS;AAAA;AACX,KACF;AAAA,IACA,QAAQ,CAAC,EAAE,OAAO,QAAA,EAAU,QAAA,EAAU,SAAS,CAAA;AAAA,IAC/C,KAAA,EAAO,WAAA,GAAc,YAAA,CAAa,WAAW,CAAA,GAAI,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAKjD,YAAY,WAAA,GACR;AAAA,MACE;AAAA,QACE,EAAA,EAAI,QAAA;AAAA,QACJ,KAAA,EAAO,OAAA;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,SAAA,EAAW,gBAAA;AAAA,QACX,KAAA,EAAO,EAAE,WAAA;AAAY,OACvB;AAAA,MACA;AAAA,QACE,EAAA,EAAI,UAAA;AAAA,QACJ,KAAA,EAAO,WAAA;AAAA,QACP,IAAA,EAAM,QAAA;AAAA,QACN,SAAA,EAAW,kBAAA;AAAA,QACX,KAAA,EAAO,EAAE,WAAA;AAAY;AACvB,KACF,GACA;AAAA,GACN;AACF;AC5SA,SAASM,OAAM,KAAA,EAAgB;AAC7B,EAAA,MAAM,CAAA,GAAI,OAAO,KAAK,CAAA;AACtB,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,GAAG,OAAO,SAAA;AAChC,EAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,EAAE,KAAA,EAAO,UAAA,EAAY,QAAA,EAAU,KAAA,EAAO,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA;AACxF;AAEO,SAAS,uBAAA,GAAmD;AACjE,EAAA,MAAM,MAAA,GAAqB;AAAA;AAAA,IAEzB;AAAA,MACE,GAAA,EAAK,WAAA;AAAA,MAAa,KAAA,EAAO,MAAA;AAAA,MAAQ,IAAA,EAAM,MAAA;AAAA,MAAQ,QAAA,EAAU,IAAA;AAAA,MACzD,KAAA,EAAO,SAAA;AAAA,MAAW,WAAA,EAAa,OAAA;AAAA,MAAS,UAAA,EAAY,IAAA;AAAA,MACpD,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA,MAC7B,UAAA,EAAY,CAAC,EAAA,EAAI,GAAA,qBACfL,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,SAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sBAAA,EAAwB,WAAC,GAAA,CAAI,SAAA,EAAW,GAAA,CAAI,QAAQ,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,EAAE,CAAA;AAAA,QAC5F,GAAA,CAAI,yBAASA,GAAAA,CAAC,OAAE,SAAA,EAAU,wCAAA,EAA0C,cAAI,KAAA,EAAM;AAAA,OAAA,EACjF;AAAA,KAEJ;AAAA,IACA,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,aAAa,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,WAAA,EAAa,OAAA,EAAS,UAAA,EAAY,IAAA,EAAM,aAAa,KAAA,EAAM;AAAA,IAClI;AAAA,MACE,GAAA,EAAK,OAAA;AAAA,MAAS,KAAA,EAAO,QAAA;AAAA,MAAU,IAAA,EAAM,MAAA;AAAA,MAAQ,KAAA,EAAO,SAAA;AAAA,MACpD,WAAA,EAAa,mBAAA;AAAA,MAAqB,UAAA,EAAY,IAAA;AAAA,MAC9C,IAAA,EAAM,kEAAA;AAAA,MACN,WAAA,EAAa;AAAA,KACf;AAAA,IACA;AAAA,MACE,GAAA,EAAK,OAAA;AAAA,MAAS,KAAA,EAAO,UAAA;AAAA,MAAY,IAAA,EAAM,MAAA;AAAA,MAAQ,KAAA,EAAO,SAAA;AAAA,MACtD,WAAA,EAAa,iBAAA;AAAA,MAAmB,UAAA,EAAY,IAAA;AAAA,MAC5C,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,KAAA;AAAA,MAC7B,UAAA,EAAY,CAAC,CAAA,qBAAMA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAA0B,QAAA,EAAA,CAAA,IAAgB,QAAA,EAAI;AAAA,KACnF;AAAA;AAAA;AAAA;AAAA,IAIA;AAAA,MACE,GAAA,EAAK,UAAA;AAAA,MAAY,KAAA,EAAO,YAAA;AAAA,MAAc,IAAA,EAAM,MAAA;AAAA,MAAQ,KAAA,EAAO,SAAA;AAAA,MAC3D,WAAA,EAAa,gBAAA;AAAA,MAAkB,UAAA,EAAY,IAAA;AAAA,MAC3C,IAAA,EAAM,iFAAA;AAAA,MACN,WAAA,EAAa;AAAA,KACf;AAAA;AAAA,IAGA;AAAA,MACE,GAAA,EAAK,aAAA;AAAA,MAAe,KAAA,EAAO,SAAA;AAAA,MAAW,IAAA,EAAM,QAAA;AAAA,MAC5C,UAAA,EAAY,KAAA;AAAA,MAAO,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA,MAChD,UAAA,EAAY,CAAC,CAAA,qBAAMA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAoB,QAAA,EAAA,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA,EAAE;AAAA,KACxE;AAAA,IACA;AAAA,MACE,GAAA,EAAK,YAAA;AAAA,MAAc,KAAA,EAAO,aAAA;AAAA,MAAe,IAAA,EAAM,QAAA;AAAA,MAC/C,UAAA,EAAY,KAAA;AAAA,MAAO,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA,MAChD,UAAA,EAAY,CAAC,CAAA,qBAAMA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAAA,EAAgC,QAAA,EAAAM,MAAAA,CAAM,CAAC,CAAA,EAAE;AAAA,KAC9E;AAAA;AAAA,IAGA;AAAA,MACE,GAAA,EAAK,OAAA;AAAA,MAAS,KAAA,EAAO,mBAAA;AAAA,MAAe,IAAA,EAAM,UAAA;AAAA,MAAY,KAAA,EAAO,UAAA;AAAA,MAAY,IAAA,EAAM,CAAA;AAAA,MAC/E,WAAA,EAAa,gEAAA;AAAA,MACb,IAAA,EAAM,mDAAA;AAAA,MACN,WAAA,EAAa;AAAA;AACf,GACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,UAAA,EAAY,UAAA;AAAA,IACZ,IAAA,EAAM,OAAA;AAAA,IACN,YAAA,EAAc,WAAA;AAAA;AAAA;AAAA,IAGd,MAAA,EAAQ,QAAA;AAAA;AAAA;AAAA,IAGR,IAAA,EAAM,EAAE,KAAA,EAAO,oBAAA,EAAsB,eAAe,UAAA,EAAW;AAAA,IAC/D,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,YAAY,CAAC;AAAA,MACX,EAAA,EAAI,QAAA;AAAA,MACJ,KAAA,EAAO,SAAA;AAAA,MACP,IAAA,EAAM,aAAA;AAAA,MACN,OAAA,EAAS,CAAC,cAAA,EAAgB,QAAQ,CAAA;AAAA,MAClC,SAAA,EAAW,eAAA;AAAA,MACX,KAAA,EAAO;AAAA,QACL,UAAU,0BAAA,EAA2B;AAAA,QACrC,QAAA,EAAU,EAAE,IAAA,EAAM,KAAA,EAAO,QAAQ,OAAA,EAAQ;AAAA;AAAA;AAAA;AAAA,QAIzC,SAAA,EAAW;AAAA,UACT,YAAY,CAAC,GAAA,KAAwBD,gBAAgB,CAAA,aAAA,EAAgB,GAAA,CAAI,EAAE,CAAA,CAAE;AAAA;AAC/E;AACF,KACD,CAAA;AAAA,IACD,WAAA,EAAa;AAAA,MACX,EAAE,EAAA,EAAI,SAAA,EAAW,KAAA,EAAO,SAAA,EAAW,SAAS,CAAA,EAAE;AAAA,MAC9C,EAAE,EAAA,EAAI,UAAA,EAAY,KAAA,EAAO,gBAAA,EAAkB,SAAS,CAAA;AAAE;AACxD,GACF;AACF;ACtGA,IAAME,YAAAA,GAAsC;AAAA,EAC1C,MAAA,EAAQ,iCAAA;AAAA,EACR,KAAA,EAAO,2BAAA;AAAA,EACP,OAAA,EAAS,+BAAA;AAAA,EACT,QAAA,EAAU;AACZ,CAAA;AAEO,SAAS,uBAAA,GAA+C;AAC7D,EAAA,MAAM,MAAA,GAAqB;AAAA;AAAA,IAEzB;AAAA,MACE,GAAA,EAAK,OAAA;AAAA,MAAS,KAAA,EAAO,cAAA;AAAA,MAAgB,IAAA,EAAM,MAAA;AAAA,MAAQ,QAAA,EAAU,IAAA;AAAA,MAC7D,KAAA,EAAO,QAAA;AAAA,MAAU,WAAA,EAAa,eAAA;AAAA,MAC9B,IAAA,EAAM,iEAAA;AAAA,MACN,UAAA,EAAY,IAAA;AAAA,MAAM,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA,MAC/C,UAAA,EAAY,CAAC,EAAA,EAAI,GAAA,qBACfN,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,SAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sBAAA,EAAwB,cAAI,KAAA,EAAM,CAAA;AAAA,QAC9C,GAAA,CAAI,wBAAQA,GAAAA,CAAC,OAAE,SAAA,EAAU,yCAAA,EAA2C,cAAI,IAAA,EAAK;AAAA,OAAA,EAChF;AAAA,KAEJ;AAAA,IACA;AAAA,MACE,GAAA,EAAK,MAAA;AAAA,MAAQ,KAAA,EAAO,WAAA;AAAA,MAAU,IAAA,EAAM,MAAA;AAAA,MAAQ,KAAA,EAAO,QAAA;AAAA,MACnD,WAAA,EAAa,YAAA;AAAA,MACb,IAAA,EAAM,oFAAA;AAAA,MACN,UAAA,EAAY,IAAA;AAAA,MAAM,WAAA,EAAa;AAAA,KACjC;AAAA;AAAA,IAGA;AAAA,MACE,GAAA,EAAK,MAAA;AAAA,MAAQ,KAAA,EAAO,MAAA;AAAA,MAAQ,IAAA,EAAM,WAAA;AAAA,MAAa,QAAA,EAAU,IAAA;AAAA,MAAM,KAAA,EAAO,MAAA;AAAA,MAAQ,IAAA,EAAM,CAAA;AAAA,MACpF,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,YAAA,EAAc,aAAa,6BAAA,EAA8B;AAAA,QACvF,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,cAAA,EAAgB,aAAa,6BAAA,EAA8B;AAAA,QACzF,EAAE,KAAA,EAAO,iBAAA,EAAgB,KAAA,EAAO,eAAA,EAAiB,aAAa,yBAAA;AAA0B,OAC1F;AAAA,MACA,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,KAAA;AAAA,MAC7B,UAAA,EAAY,CAAC,CAAA,KAAM;AACjB,QAAA,MAAM,MAAA,GAAiC;AAAA,UACrC,UAAA,EAAY,YAAA;AAAA,UAAc,YAAA,EAAc,YAAA;AAAA,UAAc,aAAA,EAAe,iBAAA;AAAA,UAAgB,WAAA,EAAa;AAAA,SACpG;AACA,QAAA,uBAAOA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAyB,QAAA,EAAA,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA,IAAK,MAAA,CAAO,CAAC,CAAA,EAAE,CAAA;AAAA,MACjF;AAAA,KACF;AAAA,IACA;AAAA,MACE,GAAA,EAAK,OAAA;AAAA,MAAS,KAAA,EAAO,OAAA;AAAA,MAAS,IAAA,EAAM,QAAA;AAAA,MAAU,KAAA,EAAO,MAAA;AAAA,MAAQ,GAAA,EAAK,CAAA;AAAA,MAClE,WAAA,EAAa,IAAA;AAAA,MACb,IAAA,EAAM,qFAAA;AAAA,MACN,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA,MAC7B,YAAY,CAAC,EAAA,EAAI,GAAA,qBACfA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA,GAAA,CAAI,SAAS,YAAA,GACV,CAAA,EAAG,GAAA,CAAI,KAAK,MACZ,GAAA,CAAI,IAAA,KAAS,eAAA,GACX,QAAA,GACA,IAAI,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,EAAE,OAAO,UAAA,EAAY,QAAA,EAAU,KAAA,EAAO,EAAE,MAAA,CAAO,MAAA,CAAO,IAAI,KAAK,CAAA,IAAK,CAAC,CAAA,EAC5G;AAAA,KAEJ;AAAA;AAAA,IAGA;AAAA,MACE,GAAA,EAAK,aAAA;AAAA,MAAe,KAAA,EAAO,kBAAA;AAAA,MAAiB,IAAA,EAAM,UAAA;AAAA,MAAY,KAAA,EAAO,QAAA;AAAA,MAAU,GAAA,EAAK,CAAA;AAAA,MACpF,QAAA,EAAU,KAAA;AAAA,MAAO,cAAA,EAAgB,IAAA;AAAA,MAAM,cAAA,EAAgB,OAAA;AAAA,MACvD,WAAA,EAAa,eAAA;AAAA,MACb,IAAA,EAAM,yFAAA;AAAA,MACN,WAAA,EAAa;AAAA,KACf;AAAA,IACA;AAAA,MACE,GAAA,EAAK,YAAA;AAAA,MAAc,KAAA,EAAO,gBAAA;AAAA,MAAkB,IAAA,EAAM,QAAA;AAAA,MAAU,KAAA,EAAO,QAAA;AAAA,MAAU,GAAA,EAAK,CAAA;AAAA,MAClF,WAAA,EAAa,YAAA;AAAA,MAAc,IAAA,EAAM,iCAAA;AAAA,MAAmC,WAAA,EAAa;AAAA,KACnF;AAAA,IACA;AAAA,MACE,GAAA,EAAK,iBAAA;AAAA,MAAmB,KAAA,EAAO,qBAAA;AAAA,MAAuB,IAAA,EAAM,SAAA;AAAA,MAAW,KAAA,EAAO,QAAA;AAAA,MAC9E,IAAA,EAAM,oGAAA;AAAA,MACN,WAAA,EAAa;AAAA,KACf;AAAA,IACA;AAAA,MACE,GAAA,EAAK,WAAA;AAAA,MAAa,KAAA,EAAO,MAAA;AAAA,MAAQ,IAAA,EAAM,QAAA;AAAA,MACvC,UAAA,EAAY,KAAA;AAAA,MAAO,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA,MAChD,UAAA,EAAY,CAAC,EAAA,EAAI,GAAA,qBACfC,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,wCAAA,EACb,QAAA,EAAA;AAAA,QAAA,GAAA,CAAI,SAAA;AAAA,QAAW,GAAA,CAAI,UAAA,GAAa,CAAA,GAAA,EAAM,GAAA,CAAI,UAAU,CAAA,CAAA,GAAK;AAAA,OAAA,EAC5D;AAAA,KAEJ;AAAA;AAAA,IAGA,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,WAAA,EAAU,MAAM,MAAA,EAAQ,KAAA,EAAO,UAAA,EAAY,WAAA,EAAa,KAAA,EAAM;AAAA,IACxF;AAAA,MACE,GAAA,EAAK,QAAA;AAAA,MAAU,KAAA,EAAO,KAAA;AAAA,MAAO,IAAA,EAAM,MAAA;AAAA,MAAQ,KAAA,EAAO,UAAA;AAAA,MAClD,IAAA,EAAM,sCAAA;AAAA,MAAkC,WAAA,EAAa;AAAA,KACvD;AAAA,IACA;AAAA,MACE,GAAA,EAAK,QAAA;AAAA,MAAU,KAAA,EAAO,QAAA;AAAA,MAAU,IAAA,EAAM,WAAA;AAAA,MAAa,QAAA,EAAU,IAAA;AAAA,MAAM,KAAA,EAAO,UAAA;AAAA,MAAY,IAAA,EAAM,CAAA;AAAA,MAC5F,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,OAAA,EAAS,aAAa,4BAAA,EAA0B;AAAA,QAC5E,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,QAAA,EAAU,aAAa,gBAAA,EAAiB;AAAA,QACjE,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,UAAA,EAAY,aAAa,qCAAA;AAAmC,OAC5F;AAAA,MACA,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,KAAA;AAAA,MAC7B,UAAA,EAAY,CAAC,CAAA,KAAM;AACjB,QAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,IAAK,OAAO,CAAA;AAC7B,QAAA,uBACED,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,0EAAA,EAA6EO,YAAAA,CAAY,CAAC,CAAA,IAAKA,YAAAA,CAAY,KAAK,CAAA,CAAA,EAC9H,QAAA,EAAA,CAAA,EACH,CAAA;AAAA,MAEJ;AAAA;AACF,GACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IACN,UAAA,EAAY,WAAA;AAAA,IACZ,IAAA,EAAM,KAAA;AAAA,IACN,YAAA,EAAc,OAAA;AAAA,IACd,MAAA;AAAA,IACA,WAAA,EAAa;AAAA,MACX,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,OAAA,EAAS,SAAS,CAAA,EAAE;AAAA,MAC3C,EAAE,IAAI,MAAA,EAAQ,KAAA,EAAO,SAAS,WAAA,EAAa,wDAAA,EAAuD,SAAS,CAAA,EAAE;AAAA,MAC7G,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,gBAAA,EAAkB,SAAS,CAAA,EAAE;AAAA,MACpD,EAAE,EAAA,EAAI,UAAA,EAAY,KAAA,EAAO,aAAA,EAAY,SAAS,CAAA;AAAE,KAClD;AAAA,IACA,QAAQ,CAAC,EAAE,OAAO,QAAA,EAAU,QAAA,EAAU,SAAS;AAAA,GACjD;AACF;AC/HO,SAAS,uBAAA,GAA+C;AAC7D,EAAA,MAAM,MAAA,GAAqB;AAAA,IACzB;AAAA,MACE,GAAA,EAAK,MAAA;AAAA,MAAQ,KAAA,EAAO,MAAA;AAAA,MAAQ,IAAA,EAAM,MAAA;AAAA,MAAQ,QAAA,EAAU,IAAA;AAAA,MAAM,KAAA,EAAO,OAAA;AAAA,MACjE,WAAA,EAAa,WAAA;AAAA,MACb,UAAA,EAAY,IAAA;AAAA,MAAM,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU;AAAA,KACjD;AAAA,IACA;AAAA,MACE,GAAA,EAAK,MAAA;AAAA,MAAQ,KAAA,EAAO,eAAA;AAAA,MAAiB,IAAA,EAAM,MAAA;AAAA,MAAQ,KAAA,EAAO,OAAA;AAAA,MAC1D,WAAA,EAAa,WAAA;AAAA,MACb,IAAA,EAAM,sEAAA;AAAA,MACN,UAAA,EAAY,IAAA;AAAA,MAAM,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA,MAC/C,UAAA,EAAY,CAAC,CAAA,qBAAMP,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yCAAA,EAA2C,QAAA,EAAA,MAAA,CAAO,CAAA,IAAK,EAAE,CAAA,EAAE;AAAA,KAChG;AAAA,IACA;AAAA,MACE,GAAA,EAAK,UAAA;AAAA,MAAY,KAAA,EAAO,eAAA;AAAA,MAAiB,IAAA,EAAM,MAAA;AAAA,MAAQ,KAAA,EAAO,OAAA;AAAA,MAC9D,WAAA,EAAa,mCAAA;AAAA,MACb,IAAA,EAAM,sDAAA;AAAA,MACN,WAAA,EAAa;AAAA,KACf;AAAA,IACA;AAAA,MACE,GAAA,EAAK,aAAA;AAAA,MAAe,KAAA,EAAO,iBAAA;AAAA,MAAa,IAAA,EAAM,UAAA;AAAA,MAAY,KAAA,EAAO,OAAA;AAAA,MAAS,IAAA,EAAM,CAAA;AAAA,MAChF,WAAA,EAAa,0BAAA;AAAA,MACb,WAAA,EAAa;AAAA,KACf;AAAA,IACA;AAAA,MACE,GAAA,EAAK,WAAA;AAAA,MAAa,KAAA,EAAO,OAAA;AAAA,MAAS,IAAA,EAAM,QAAA;AAAA,MAAU,KAAA,EAAO,OAAA;AAAA,MAAS,GAAA,EAAK,CAAA;AAAA,MACvE,IAAA,EAAM,oCAAA;AAAA,MACN,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA,MAC7B,UAAA,EAAY,CAAC,CAAA,qBAAMA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAA0C,QAAA,EAAA,MAAA,CAAO,CAAA,IAAK,CAAC,CAAA,EAAE;AAAA;AAC9F,GACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,WAAA;AAAA,IACN,UAAA,EAAY,YAAA;AAAA,IACZ,IAAA,EAAM,YAAA;AAAA,IACN,YAAA,EAAc,MAAA;AAAA,IACd,WAAA,EAAa,WAAA;AAAA,IACb,MAAA;AAAA,IACA,WAAA,EAAa;AAAA,MACX,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,WAAA,EAAa,SAAS,CAAA;AAAE;AAChD,GACF;AACF;AC3CO,SAAS,yBAAA,GAAmD;AACjE,EAAA,MAAM,MAAA,GAAqB;AAAA,IACzB;AAAA,MACE,GAAA,EAAK,OAAA;AAAA,MAAS,KAAA,EAAO,WAAA;AAAA,MAAU,IAAA,EAAM,MAAA;AAAA,MAAQ,QAAA,EAAU,IAAA;AAAA,MAAM,KAAA,EAAO,OAAA;AAAA,MACpE,WAAA,EAAa,eAAA;AAAA,MACb,UAAA,EAAY,IAAA;AAAA,MAAM,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU;AAAA,KACjD;AAAA,IACA;AAAA,MACE,GAAA,EAAK,QAAA;AAAA,MAAU,KAAA,EAAO,eAAA;AAAA,MAAiB,IAAA,EAAM,MAAA;AAAA,MAAQ,KAAA,EAAO,OAAA;AAAA,MAC5D,WAAA,EAAa,YAAA;AAAA,MACb,IAAA,EAAM,2EAAA;AAAA,MACN,UAAA,EAAY,IAAA;AAAA,MAAM,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA,MAC/C,UAAA,EAAY,CAAC,CAAA,qBAAMA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yCAAA,EAA2C,QAAA,EAAA,MAAA,CAAO,CAAA,IAAK,EAAE,CAAA,EAAE;AAAA,KAChG;AAAA,IACA;AAAA,MACE,GAAA,EAAK,aAAA;AAAA,MAAe,KAAA,EAAO,iBAAA;AAAA,MAAa,IAAA,EAAM,UAAA;AAAA,MAAY,KAAA,EAAO,OAAA;AAAA,MAAS,IAAA,EAAM,CAAA;AAAA,MAChF,WAAA,EAAa,kDAAA;AAAA,MACb,WAAA,EAAa;AAAA,KACf;AAAA,IACA;AAAA,MACE,GAAA,EAAK,YAAA;AAAA,MAAc,KAAA,EAAO,UAAA;AAAA,MAAY,IAAA,EAAM,MAAA;AAAA,MAC5C,UAAA,EAAY,KAAA;AAAA,MAAO,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,KAAA;AAAA,MAChD,UAAA,EAAY,CAAC,CAAA,KAAM;AACjB,QAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,GAAI,EAAE,MAAA,GAAS,CAAA;AAC5C,QAAA,uBACEA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EACb,oBAAU,CAAA,GAAI,WAAA,GAAc,CAAA,EAAG,KAAK,CAAA,SAAA,CAAA,EACvC,CAAA;AAAA,MAEJ;AAAA,KACF;AAAA,IACA;AAAA,MACE,GAAA,EAAK,WAAA;AAAA,MAAa,KAAA,EAAO,WAAA;AAAA,MAAa,IAAA,EAAM,SAAA;AAAA,MAAW,KAAA,EAAO,OAAA;AAAA,MAC9D,IAAA,EAAM,gEAAA;AAAA;AAAA;AAAA,MAGN,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,YAAA,EAAa;AAAA,QACrC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,WAAA;AAAY,OACvC;AAAA,MACA,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA,MAC7B,UAAA,EAAY,CAAC,CAAA,qBACXA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,0EAAA,EACf,CAAA,GAAI,iCAAA,GAAoC,2BAC1C,CAAA,CAAA,EACG,QAAA,EAAA,CAAA,GAAI,cAAc,UAAA,EACrB;AAAA,KAEJ;AAAA,IACA;AAAA,MACE,GAAA,EAAK,WAAA;AAAA,MAAa,KAAA,EAAO,OAAA;AAAA,MAAS,IAAA,EAAM,QAAA;AAAA,MAAU,KAAA,EAAO,OAAA;AAAA,MAAS,GAAA,EAAK,CAAA;AAAA,MACvE,IAAA,EAAM,yBAAA;AAAA,MAA2B,WAAA,EAAa;AAAA,KAChD;AAAA;AAAA,IAGA;AAAA,MACE,GAAA,EAAK,UAAA;AAAA,MAAY,KAAA,EAAO,wBAAA;AAAA,MAAoB,IAAA,EAAM,MAAA;AAAA,MAAQ,KAAA,EAAO,KAAA;AAAA,MAAO,IAAA,EAAM,CAAA;AAAA,MAC9E,WAAA,EAAa,2CAAA;AAAA,MACb,IAAA,EAAM,yCAAA;AAAA,MACN,WAAA,EAAa;AAAA,KACf;AAAA,IACA;AAAA,MACE,GAAA,EAAK,gBAAA;AAAA,MAAkB,KAAA,EAAO,sBAAA;AAAA,MAAkB,IAAA,EAAM,UAAA;AAAA,MAAY,KAAA,EAAO,KAAA;AAAA,MAAO,IAAA,EAAM,CAAA;AAAA,MACtF,WAAA,EAAa,gDAAA;AAAA,MACb,WAAA,EAAa;AAAA;AACf,GACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,eAAA;AAAA,IACN,UAAA,EAAY,gBAAA;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,YAAA,EAAc,OAAA;AAAA,IACd,WAAA,EAAa,WAAA;AAAA,IACb,MAAA;AAAA,IACA,WAAA,EAAa;AAAA,MACX,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,eAAA,EAAW,SAAS,CAAA,EAAE;AAAA,MAC5C,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,eAAe,WAAA,EAAa,0DAAA,EAAsD,SAAS,CAAA;AAAE;AACnH;AAAA;AAAA;AAAA,GAKF;AACF;ACpFA,IAAMO,YAAAA,GAAsC;AAAA,EAC1C,MAAA,EAAQ,iCAAA;AAAA,EACR,QAAA,EAAU,2BAAA;AAAA,EACV,OAAA,EAAS,+BAAA;AAAA,EACT,QAAA,EAAU;AACZ,CAAA;AAEA,IAAMC,aAAAA,GAAuC;AAAA,EAC3C,MAAA,EAAQ,OAAA;AAAA,EAAS,QAAA,EAAU,WAAA;AAAA,EAAa,OAAA,EAAS,UAAA;AAAA,EAAY,QAAA,EAAU;AACzE,CAAA;AAEO,SAAS,uBAAA,CAAwB,eAAe,KAAA,EAA4B;AACjF,EAAA,MAAMF,SAAQ,CAAC,CAAA,KACb,IAAI,IAAA,CAAK,YAAA,CAAa,SAAS,EAAE,KAAA,EAAO,UAAA,EAAY,QAAA,EAAU,cAAc,CAAA,CAAE,OAAO,MAAA,CAAO,CAAC,KAAK,CAAC,CAAA;AAErG,EAAA,MAAM,MAAA,GAAqB;AAAA,IACzB;AAAA,MACE,GAAA,EAAK,MAAA;AAAA,MAAQ,KAAA,EAAO,WAAA;AAAA,MAAU,IAAA,EAAM,MAAA;AAAA,MAAQ,KAAA,EAAO,MAAA;AAAA,MAAQ,IAAA,EAAM,CAAA;AAAA,MACjE,WAAA,EAAa,wBAAA;AAAA,MACb,IAAA,EAAM,0EAAA;AAAA,MACN,UAAA,EAAY,IAAA;AAAA,MAAM,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA,MAC/C,UAAA,EAAY,CAAC,CAAA,qBAAMN,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EAAiC,QAAA,EAAA,MAAA,CAAO,CAAA,IAAK,EAAE,CAAA,EAAE;AAAA,KACtF;AAAA,IACA;AAAA,MACE,GAAA,EAAK,gBAAA;AAAA,MAAkB,KAAA,EAAO,OAAA;AAAA,MAAS,IAAA,EAAM,UAAA;AAAA,MAAY,QAAA,EAAU,IAAA;AAAA,MAAM,KAAA,EAAO,MAAA;AAAA,MAAQ,GAAA,EAAK,CAAA;AAAA,MAC7F,QAAA,EAAU,YAAA;AAAA,MAAc,cAAA,EAAgB,IAAA;AAAA,MAAM,cAAA,EAAgB,OAAA;AAAA,MAC9D,IAAA,EAAM,4DAAA;AAAA,MACN,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA,MAC7B,UAAA,EAAY,CAAC,CAAA,qBAAMA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAA0C,QAAA,EAAAM,MAAAA,CAAM,CAAC,CAAA,EAAE;AAAA,KACxF;AAAA,IACA;AAAA,MACE,GAAA,EAAK,SAAA;AAAA,MAAW,KAAA,EAAO,OAAA;AAAA,MAAS,IAAA,EAAM,UAAA;AAAA,MAAY,KAAA,EAAO,MAAA;AAAA,MAAQ,GAAA,EAAK,CAAA;AAAA,MACtE,QAAA,EAAU,YAAA;AAAA,MAAc,cAAA,EAAgB,IAAA;AAAA,MAAM,cAAA,EAAgB,OAAA;AAAA,MAC9D,IAAA,EAAM,iDAAA;AAAA,MACN,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA,MAC7B,UAAA,EAAY,CAAC,CAAA,qBAAMN,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAAA,EAAgC,QAAA,EAAAM,MAAAA,CAAM,CAAC,CAAA,EAAE;AAAA,KAC9E;AAAA,IACA;AAAA,MACE,GAAA,EAAK,QAAA;AAAA,MAAU,KAAA,EAAO,QAAA;AAAA,MAAU,IAAA,EAAM,WAAA;AAAA,MAAa,KAAA,EAAO,MAAA;AAAA,MAAQ,IAAA,EAAM,CAAA;AAAA,MACxE,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,QAAA,EAAU,aAAa,qBAAA,EAAsB;AAAA,QACtE,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,UAAA,EAAY,aAAa,8BAAA;AAA+B,OACxF;AAAA,MACA,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,KAAA;AAAA,MAC7B,UAAA,EAAY,CAAC,CAAA,KAAM;AACjB,QAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,IAAK,QAAQ,CAAA;AAC9B,QAAA,uBACEN,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,6EAA6EO,YAAAA,CAAY,CAAC,CAAA,IAAKA,YAAAA,CAAY,MAAM,CAAA,CAAA,EAC/H,QAAA,EAAAC,aAAAA,CAAa,CAAC,KAAK,CAAA,EACtB,CAAA;AAAA,MAEJ;AAAA,KACF;AAAA;AAAA,IAGA;AAAA,MACE,GAAA,EAAK,eAAA;AAAA,MAAiB,KAAA,EAAO,2BAAA;AAAA,MAA0B,IAAA,EAAM,OAAA;AAAA,MAAS,KAAA,EAAO,WAAA;AAAA,MAC7E,WAAA,EAAa,UAAA;AAAA,MACb,UAAA,EAAY,IAAA;AAAA,MAAM,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,KAAA;AAAA,MAC/C,UAAA,EAAY,CAAC,CAAA,qBAAMR,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAyB,QAAA,EAAA,MAAA,CAAO,CAAA,IAAK,QAAG,CAAA,EAAE;AAAA,KAC/E;AAAA,IACA;AAAA,MACE,GAAA,EAAK,WAAA;AAAA,MAAa,KAAA,EAAO,UAAA;AAAA,MAAY,IAAA,EAAM,MAAA;AAAA,MAAQ,KAAA,EAAO,WAAA;AAAA,MAC1D,IAAA,EAAM,wBAAA;AAAA,MAAuB,WAAA,EAAa;AAAA,KAC5C;AAAA,IACA;AAAA,MACE,GAAA,EAAK,MAAA;AAAA,MAAQ,KAAA,EAAO,kBAAA;AAAA,MAAc,IAAA,EAAM,UAAA;AAAA,MAAY,KAAA,EAAO,WAAA;AAAA,MAAa,IAAA,EAAM,CAAA;AAAA,MAC9E,WAAA,EAAa,sBAAA;AAAA,MAAkB,WAAA,EAAa;AAAA;AAC9C,GACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,eAAA;AAAA,IACN,UAAA,EAAY,YAAA;AAAA,IACZ,IAAA,EAAM,YAAA;AAAA,IACN,YAAA,EAAc,MAAA;AAAA,IACd,WAAA,EAAa,WAAA;AAAA,IACb,cAAA,EAAgB,MAAA;AAAA,IAChB,MAAA;AAAA,IACA,WAAA,EAAa;AAAA,MACX,EAAE,EAAA,EAAI,MAAA,EAAQ,KAAA,EAAO,WAAA,EAAU,SAAS,CAAA,EAAE;AAAA,MAC1C,EAAE,EAAA,EAAI,WAAA,EAAa,KAAA,EAAO,iBAAA,EAAgB,SAAS,CAAA;AAAE,KACvD;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,KAAA,EAAO,UAAU,QAAA,EAAU,OAAA,EAAS,OAAA,EAAS,MAAA,EAAQ;AAAA,GAClE;AACF;ACtFA,IAAM,MAAA,GAAiC;AAAA,EACrC,KAAA,EAAO,6BAAA;AAAA,EACP,OAAA,EAAS,iCAAA;AAAA,EACT,KAAA,EAAO,6BAAA;AAAA,EACP,IAAA,EAAM,2BAAA;AAAA,EACN,MAAA,EAAQ;AACV,CAAA;AAEO,SAAS,4BAAA,GAAyD;AACvE,EAAA,MAAM,MAAA,GAAqB;AAAA,IACzB;AAAA,MACE,GAAA,EAAK,MAAA;AAAA,MAAQ,KAAA,EAAO,MAAA;AAAA,MAAQ,IAAA,EAAM,MAAA;AAAA,MAAQ,QAAA,EAAU,IAAA;AAAA,MAAM,KAAA,EAAO,OAAA;AAAA,MACjE,WAAA,EAAa,SAAA;AAAA,MACb,UAAA,EAAY,IAAA;AAAA,MAAM,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA,MAC/C,YAAY,CAAC,EAAA,EAAI,GAAA,qBACfA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,sEAAA,EAAyE,MAAA,CAAO,IAAI,KAAK,CAAA,IAAK,OAAO,KAAK,CAAA,CAAA,EACxH,cAAI,IAAA,EACP;AAAA,KAEJ;AAAA,IACA;AAAA,MACE,GAAA,EAAK,OAAA;AAAA,MAAS,KAAA,EAAO,KAAA;AAAA,MAAO,IAAA,EAAM,QAAA;AAAA,MAAU,KAAA,EAAO,OAAA;AAAA,MACnD,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,QAAA,EAAS;AAAA,QAClC,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,OAAA,EAAQ;AAAA,QACnC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,UAAA,EAAQ;AAAA,QACjC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,QAC/B,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,SAAA;AAAU,OACtC;AAAA,MACA,IAAA,EAAM,oDAAA;AAAA,MACN,WAAA,EAAa;AAAA,KACf;AAAA,IACA;AAAA,MACE,GAAA,EAAK,aAAA;AAAA,MAAe,KAAA,EAAO,iBAAA;AAAA,MAAa,IAAA,EAAM,UAAA;AAAA,MAAY,KAAA,EAAO,OAAA;AAAA,MAAS,IAAA,EAAM,CAAA;AAAA,MAChF,WAAA,EAAa,2BAAA;AAAA,MACb,UAAA,EAAY,IAAA;AAAA,MAAM,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,KAAA;AAAA,MAC/C,UAAA,EAAY,CAAC,CAAA,qBAAMA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAyB,QAAA,EAAA,MAAA,CAAO,CAAA,IAAK,QAAG,CAAA,EAAE;AAAA,KAC/E;AAAA,IACA;AAAA,MACE,GAAA,EAAK,aAAA;AAAA,MAAe,KAAA,EAAO,UAAA;AAAA,MAAY,IAAA,EAAM,MAAA;AAAA,MAC7C,UAAA,EAAY,KAAA;AAAA,MAAO,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,KAAA;AAAA,MAChD,UAAA,EAAY,CAAC,CAAA,KAAM;AACjB,QAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,GAAI,EAAE,MAAA,GAAS,CAAA;AAC5C,QAAA,uBACEA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EACb,oBAAU,CAAA,GAAI,WAAA,GAAc,CAAA,EAAG,KAAK,CAAA,SAAA,CAAA,EACvC,CAAA;AAAA,MAEJ;AAAA;AACF,GACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,OAAA;AAAA,IACN,UAAA,EAAY,QAAA;AAAA,IACZ,IAAA,EAAM,YAAA;AAAA,IACN,YAAA,EAAc,MAAA;AAAA,IACd,WAAA,EAAa,MAAA;AAAA,IACb,MAAA;AAAA,IACA,WAAA,EAAa,CAAC,EAAE,EAAA,EAAI,SAAS,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,CAAA,EAAG;AAAA,GAC3D;AACF;AC3DO,SAAS,eAAA,CAAgB,GAA6BM,MAAAA,EAAsC;AACjG,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,CAAA,CAAE,SAAA,IAAa,IAAA,IAAQ,CAAA,CAAE,aAAa,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,CAAA,CAAE,SAAS,CAAA,MAAA,EAAI,CAAA,CAAE,SAAS,CAAA,QAAA,CAAU,CAAA;AAAA,OAAA,IACzF,CAAA,CAAE,aAAa,IAAA,EAAM,KAAA,CAAM,KAAK,CAAA,EAAG,CAAA,CAAE,SAAS,CAAA,SAAA,CAAW,CAAA;AAAA,OAAA,IACzD,CAAA,CAAE,aAAa,IAAA,EAAM,KAAA,CAAM,KAAK,CAAA,OAAA,EAAO,CAAA,CAAE,SAAS,CAAA,QAAA,CAAU,CAAA;AAErE,EAAA,IAAI,EAAE,QAAA,IAAY,IAAA,IAAQ,EAAE,QAAA,IAAY,IAAA,QAAY,IAAA,CAAK,CAAA,OAAA,EAAUA,MAAAA,CAAM,CAAA,CAAE,QAAQ,CAAC,CAAA,MAAA,EAAIA,OAAM,CAAA,CAAE,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,OAAA,IAClG,CAAA,CAAE,QAAA,IAAY,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,UAAUA,MAAAA,CAAM,CAAA,CAAE,QAAQ,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,OAAA,IAC7D,CAAA,CAAE,QAAA,IAAY,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,iBAAcA,MAAAA,CAAM,CAAA,CAAE,QAAQ,CAAC,CAAA,CAAE,CAAA;AAEzE,EAAA,IAAI,CAAA,CAAE,WAAA,EAAa,KAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAe,IAAI,IAAA,CAAK,CAAA,CAAE,WAAW,CAAA,CAAE,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAE,CAAA;AAClG,EAAA,IAAI,CAAA,CAAE,YAAA,EAAc,KAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,IAAI,IAAA,CAAK,CAAA,CAAE,YAAY,CAAA,CAAE,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAE,CAAA;AAExG,EAAA,OAAO,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,QAAK,CAAA,GAAI,mBAAA;AAC5C;AAOO,SAAS,8BAAA,CAA+B,eAAe,KAAA,EAAsC;AAClG,EAAA,MAAMA,MAAAA,GAAQ,CAAC,CAAA,KACb,IAAI,KAAK,YAAA,CAAa,OAAA,EAAS,EAAE,KAAA,EAAO,YAAY,QAAA,EAAU,YAAA,EAAc,CAAA,CAAE,OAAO,CAAC,CAAA;AAExF,EAAA,MAAM,MAAA,GAAqB;AAAA,IACzB;AAAA,MACE,GAAA,EAAK,MAAA;AAAA,MAAQ,KAAA,EAAO,MAAA;AAAA,MAAQ,IAAA,EAAM,MAAA;AAAA,MAAQ,QAAA,EAAU,IAAA;AAAA,MAAM,KAAA,EAAO,OAAA;AAAA,MAAS,IAAA,EAAM,CAAA;AAAA,MAChF,WAAA,EAAa,mBAAA;AAAA,MACb,UAAA,EAAY,IAAA;AAAA,MAAM,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU;AAAA,KACjD;AAAA,IACA;AAAA,MACE,GAAA,EAAK,aAAA;AAAA,MAAe,KAAA,EAAO,iBAAA;AAAA,MAAa,IAAA,EAAM,UAAA;AAAA,MAAY,KAAA,EAAO,OAAA;AAAA,MAAS,IAAA,EAAM,CAAA;AAAA,MAChF,WAAA,EAAa,8BAAA;AAAA,MACb,UAAA,EAAY,IAAA;AAAA,MAAM,WAAA,EAAa;AAAA,KACjC;AAAA;AAAA,IAGA;AAAA,MACE,GAAA,EAAK,WAAA;AAAA,MAAa,KAAA,EAAO,sBAAA;AAAA,MAAqB,IAAA,EAAM,QAAA;AAAA,MAAU,KAAA,EAAO,MAAA;AAAA,MAAQ,GAAA,EAAK,CAAA;AAAA,MAClF,WAAA,EAAa,eAAA;AAAA,MAAc,WAAA,EAAa;AAAA,KAC1C;AAAA,IACA;AAAA,MACE,GAAA,EAAK,WAAA;AAAA,MAAa,KAAA,EAAO,sBAAA;AAAA,MAAqB,IAAA,EAAM,QAAA;AAAA,MAAU,KAAA,EAAO,MAAA;AAAA,MAAQ,GAAA,EAAK,CAAA;AAAA,MAClF,WAAA,EAAa,eAAA;AAAA,MAAc,WAAA,EAAa;AAAA,KAC1C;AAAA,IACA;AAAA,MACE,GAAA,EAAK,UAAA;AAAA,MAAY,KAAA,EAAO,iBAAA;AAAA,MAAgB,IAAA,EAAM,UAAA;AAAA,MAAY,KAAA,EAAO,MAAA;AAAA,MAAQ,GAAA,EAAK,CAAA;AAAA,MAC9E,QAAA,EAAU,YAAA;AAAA,MAAc,cAAA,EAAgB,IAAA;AAAA,MAAM,cAAA,EAAgB,OAAA;AAAA,MAC9D,WAAA,EAAa,eAAA;AAAA,MAAc,WAAA,EAAa;AAAA,KAC1C;AAAA,IACA;AAAA,MACE,GAAA,EAAK,UAAA;AAAA,MAAY,KAAA,EAAO,iBAAA;AAAA,MAAgB,IAAA,EAAM,UAAA;AAAA,MAAY,KAAA,EAAO,MAAA;AAAA,MAAQ,GAAA,EAAK,CAAA;AAAA,MAC9E,QAAA,EAAU,YAAA;AAAA,MAAc,cAAA,EAAgB,IAAA;AAAA,MAAM,cAAA,EAAgB,OAAA;AAAA,MAC9D,WAAA,EAAa,eAAA;AAAA,MAAc,WAAA,EAAa;AAAA,KAC1C;AAAA,IACA,EAAE,GAAA,EAAK,aAAA,EAAe,KAAA,EAAO,kBAAA,EAAoB,MAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,WAAA,EAAa,KAAA,EAAM;AAAA,IACjG,EAAE,GAAA,EAAK,cAAA,EAAgB,KAAA,EAAO,iBAAA,EAAmB,MAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,WAAA,EAAa,KAAA,EAAM;AAAA;AAAA,IAGjG;AAAA,MACE,GAAA,EAAK,eAAA;AAAA,MAAiB,KAAA,EAAO,OAAA;AAAA,MAAS,IAAA,EAAM,MAAA;AAAA,MAC5C,UAAA,EAAY,KAAA;AAAA,MAAO,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,KAAA;AAAA,MAChD,UAAA,EAAY,CAAC,EAAA,EAAI,GAAA,qBACfN,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAyB,QAAA,EAAA,eAAA,CAAgB,GAAA,EAAKM,MAAK,CAAA,EAAE;AAAA,KAEzE;AAAA,IACA;AAAA,MACE,GAAA,EAAK,YAAA;AAAA,MAAc,KAAA,EAAO,UAAA;AAAA,MAAY,IAAA,EAAM,QAAA;AAAA,MAC5C,UAAA,EAAY,KAAA;AAAA,MAAO,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA,MAChD,UAAA,EAAY,CAAC,CAAA,qBACXN,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA,CAAA,IAAK,IAAA,GAAO,QAAA,GAAM,MAAA,CAAO,CAAC,CAAA,EAC7B;AAAA;AAEJ,GACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IACN,UAAA,EAAY,WAAA;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,YAAA,EAAc,MAAA;AAAA,IACd,WAAA,EAAa,MAAA;AAAA,IACb,MAAA;AAAA,IACA,WAAA,EAAa;AAAA,MACX,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,UAAA,EAAY,SAAS,CAAA,EAAE;AAAA,MAC7C;AAAA,QACE,EAAA,EAAI,MAAA;AAAA,QAAQ,KAAA,EAAO,OAAA;AAAA,QAAS,OAAA,EAAS,CAAA;AAAA,QACrC,WAAA,EAAa;AAAA;AACf;AACF,GACF;AACF;;;AC3FO,SAAS,8BAA8B,QAAA,EAAuD;AACnG,EAAA,OAAO;AAAA,IACL,MAAM,KAAK,KAAA,EAAgD;AACzD,MAAA,MAAM,SAAS,MAAM,oBAAA;AAAA,QACnB,QAAA;AAAA,QACA,MAAM,MAAA,GAAS,EAAE,MAAA,EAAQ,KAAA,CAAM,QAAO,GAAI;AAAA,OAC5C;AACA,MAAA,OAAO;AAAA,QACL,GAAG,UAAA,CAAW,MAAA,CAAO,IAAA,EAAM,OAAO,QAAQ,CAAA;AAAA,QAC1C,GAAI,MAAA,CAAO,MAAA,IAAU,EAAE,QAAQ,IAAA,EAAK;AAAA,QACpC,GAAI,MAAA,CAAO,KAAA,IAAS,EAAE,OAAO,IAAA;AAAK,OACpC;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,OAAO,IAAA,EAAwB;AACnC,MAAA,MAAM,KAAA,GAAQ,IAAA;AAGd,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,EAAM,IAAA,EAAK,IAAK,QAAQ,MAAA,CAAO,KAAA,CAAM,IAAA,IAAQ,EAAE,CAAC,CAAA;AACnE,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,QAAQ,EAAE,aAAA,CAAc;AAAA,QACpD,GAAI,KAAA;AAAA,QACJ;AAAA,OACqB,CAAA;AACvB,MAAA,sBAAA,EAAuB;AACvB,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,EAAA,EAAY,IAAA,EAA0C;AACjE,MAAA,MAAM,KAAA,GAAQ,EAAE,GAAG,IAAA,EAAK;AACxB,MAAA,IAAI,KAAA,CAAM,SAAS,MAAA,IAAa,CAAC,OAAO,KAAA,CAAM,IAAI,CAAA,CAAE,IAAA,EAAK,EAAG;AAE1D,QAAA,KAAA,CAAM,OAAO,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,IAAA,IAAQ,EAAE,CAAC,CAAA;AAAA,MAC/C;AACA,MAAA,MAAM,UAAU,MAAM,OAAA,CAAQ,QAAQ,CAAA,CAAE,aAAA,CAAc,IAAI,KAA2B,CAAA;AACrF,MAAA,sBAAA,EAAuB;AACvB,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,MAAA,MAAM,OAAA,CAAQ,QAAQ,CAAA,CAAE,aAAA,CAAc,EAAE,CAAA;AACxC,MAAA,sBAAA,EAAuB;AAAA,IACzB;AAAA,GACF;AACF;;;AC3DO,SAAS,+BACd,QAAA,EAC4B;AAC5B,EAAA,OAAO;AAAA,IACL,MAAM,KAAK,KAAA,EAAqD;AAC9D,MAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,QAAQ,CAAA,CAAE,aAAA;AAAA,QACnC,MAAM,MAAA,GAAS,EAAE,MAAA,EAAQ,KAAA,CAAM,QAAO,GAAI;AAAA,OAC5C;AACA,MAAA,OAAO,UAAA,CAAW,MAAM,KAAK,CAAA;AAAA,IAC/B,CAAA;AAAA,IAEA,MAAM,OAAO,IAAA,EAA6B;AACxC,MAAA,OAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,cAAA,CAAe,IAAsC,CAAA;AAAA,IAChF,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,EAAA,EAAY,IAAA,EAAoD;AAG3E,MAAA,MAAM,EAAE,WAAA,EAAa,EAAA,EAAI,YAAY,EAAA,EAAI,GAAG,OAAM,GAAI,IAAA;AACtD,MAAA,OAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,cAAA,CAAe,IAAI,KAA4B,CAAA;AAAA,IAC1E,CAAA;AAAA,IAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,MAAA,MAAM,OAAA,CAAQ,QAAQ,CAAA,CAAE,cAAA,CAAe,EAAE,CAAA;AAAA,IAC3C;AAAA,GACF;AACF;;;AC1BO,SAAS,+BACd,QAAA,EACwB;AACxB,EAAA,OAAO;AAAA,IACL,MAAM,KAAK,KAAA,EAAiD;AAC1D,MAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,QAAQ,EAAE,aAAA,EAAc;AACnD,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,EAAQ,IAAA,GAAO,WAAA,EAAY;AAC9C,MAAA,MAAM,QAAA,GAAW,OACb,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KACX,CAAA,CAAE,MAAM,WAAA,EAAY,CAAE,SAAS,IAAI,CAAA,IAAA,CAAM,EAAE,IAAA,IAAQ,EAAA,EAAI,aAAY,CAAE,QAAA,CAAS,IAAI,CAAC,CAAA,GACrF,IAAA;AACJ,MAAA,OAAO,UAAA,CAAW,QAAA,EAAU,KAAA,EAAO,QAAQ,CAAA;AAAA,IAC7C,CAAA;AAAA,IAEA,MAAM,OAAO,IAAA,EAAyB;AACpC,MAAA,MAAM,KAAA,GAAQ,IAAA;AACd,MAAA,OAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,cAAA,CAAe;AAAA,QACtC,GAAI,KAAA;AAAA;AAAA;AAAA,QAGJ,IAAA,EAAM,KAAA,CAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,CAAE,IAAA,EAAK,CAAE,WAAA,EAAY,GAAI;AAAA,OACvC,CAAA;AAAA,IAC1B,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,EAAA,EAAY,IAAA,EAA4C;AAEnE,MAAA,MAAM,EAAE,SAAA,EAAW,KAAA,EAAO,GAAG,OAAM,GAAI,IAAA;AACvC,MAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAW;AAC5B,QAAA,KAAA,CAAM,IAAA,GAAO,KAAA,CAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,CAAE,IAAA,EAAK,CAAE,WAAA,EAAY,GAAI,IAAA;AAAA,MACtE;AACA,MAAA,OAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,cAAA,CAAe,IAAI,KAA4B,CAAA;AAAA,IAC1E,CAAA;AAAA,IAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,MAAA,MAAM,OAAA,CAAQ,QAAQ,CAAA,CAAE,cAAA,CAAe,EAAE,CAAA;AAAA,IAC3C;AAAA,GACF;AACF;;;ACrCO,SAAS,+BACd,QAAA,EACwB;AACxB,EAAA,OAAO;AAAA,IACL,MAAM,KAAK,KAAA,EAAiD;AAC1D,MAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,QAAQ,EAAE,cAAA,EAAe;AACpD,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,EAAQ,IAAA,GAAO,WAAA,EAAY;AAC9C,MAAA,MAAM,QAAA,GAAW,OACb,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KACX,CAAA,CAAE,KAAK,WAAA,EAAY,CAAE,SAAS,IAAI,CAAA,IAAA,CAAM,EAAE,IAAA,IAAQ,EAAA,EAAI,aAAY,CAAE,QAAA,CAAS,IAAI,CAAC,CAAA,GACpF,IAAA;AACJ,MAAA,OAAO,UAAA,CAAW,UAAU,KAAK,CAAA;AAAA,IACnC,CAAA;AAAA,IAEA,MAAM,OAAO,IAAA,EAAyB;AACpC,MAAA,MAAM,KAAA,GAAQ,IAAA;AACd,MAAA,OAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,cAAA,CAAe;AAAA,QACtC,IAAA,EAAM,MAAA,CAAO,KAAA,CAAM,IAAA,IAAQ,EAAE,CAAA;AAAA,QAC7B,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,IAAA,EAAK,IAAK,MAAA;AAAA,QAC5B,WAAA,EAAa,MAAM,WAAA,IAAe,MAAA;AAAA;AAAA;AAAA,QAGlC,QAAA,EAAU,KAAA,CAAM,QAAA,EAAU,IAAA,EAAK,IAAK,MAAA;AAAA,QACpC,SAAA,EAAW,MAAM,SAAA,IAAa;AAAA,OACR,CAAA;AAAA,IAC1B,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,EAAA,EAAY,IAAA,EAA4C;AACnE,MAAA,MAAM,QAA6B,EAAC;AACpC,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,EAAW,KAAA,CAAM,OAAO,IAAA,CAAK,IAAA;AAC/C,MAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAW,KAAA,CAAM,OAAO,IAAA,CAAK,IAAA,EAAM,MAAK,IAAK,MAAA;AAC/D,MAAA,IAAI,IAAA,CAAK,WAAA,KAAgB,MAAA,EAAW,KAAA,CAAM,cAAc,IAAA,CAAK,WAAA;AAC7D,MAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAW,KAAA,CAAM,WAAW,IAAA,CAAK,QAAA,EAAU,MAAK,IAAK,IAAA;AAC3E,MAAA,IAAI,IAAA,CAAK,SAAA,KAAc,MAAA,EAAW,KAAA,CAAM,YAAY,IAAA,CAAK,SAAA;AACzD,MAAA,OAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,cAAA,CAAe,IAAI,KAAK,CAAA;AAAA,IACnD,CAAA;AAAA,IAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,MAAA,MAAM,OAAA,CAAQ,QAAQ,CAAA,CAAE,cAAA,CAAe,EAAE,CAAA;AAAA,IAC3C;AAAA,GACF;AACF;;;ACvCA,SAAS,mBAAmB,CAAA,EAA+B;AACzD,EAAA,IAAI,CAAC,CAAA,CAAE,eAAA,EAAiB,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAC1F,EAAA,OAAO,CAAA;AACT;AAEO,SAAS,iCACd,QAAA,EAC0B;AAC1B,EAAA,OAAO;AAAA,IACL,MAAM,KAAK,KAAA,EAAmD;AAC5D,MAAA,MAAM,CAAA,GAAI,QAAQ,QAAQ,CAAA;AAC1B,MAAA,MAAM,IAAA,GAAQ,MAAM,CAAA,CAAE,eAAA,QAAwB,EAAC;AAC/C,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,EAAQ,IAAA,GAAO,WAAA,EAAY;AAC9C,MAAA,MAAM,QAAA,GAAW,OACb,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KACX,CAAA,CAAE,MAAM,WAAA,EAAY,CAAE,SAAS,IAAI,CAAA,IAAA,CAAM,EAAE,MAAA,IAAU,EAAA,EAAI,aAAY,CAAE,QAAA,CAAS,IAAI,CAAC,CAAA,GACvF,IAAA;AACJ,MAAA,OAAO,UAAA,CAAW,UAAU,KAAK,CAAA;AAAA,IACnC,CAAA;AAAA,IAEA,MAAM,OAAO,IAAA,EAA2B;AACtC,MAAA,MAAM,CAAA,GAAI,kBAAA,CAAmB,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAC9C,MAAA,MAAM,KAAA,GAAQ,IAAA;AACd,MAAA,OAAO,EAAE,gBAAA,CAAkB;AAAA,QACzB,KAAA,EAAO,MAAA,CAAO,KAAA,CAAM,KAAA,IAAS,EAAE,CAAA;AAAA,QAC/B,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,IAAA,EAAK,IAAK,MAAA;AAAA,QAChC,WAAA,EAAa,MAAM,WAAA,IAAe,IAAA;AAAA,QAClC,QAAA,EAAU,MAAM,QAAA,IAAY,IAAA;AAAA,QAC5B,cAAA,EAAgB,MAAM,cAAA,IAAkB,IAAA;AAAA,QACxC,SAAA,EAAW,MAAM,SAAA,IAAa,IAAA;AAAA,QAC9B,SAAA,EAAW,MAAM,SAAA,IAAa;AAAA,OACN,CAAA;AAAA,IAC5B,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,EAAA,EAAY,IAAA,EAAgD;AACvE,MAAA,MAAM,CAAA,GAAI,kBAAA,CAAmB,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAK9C,MAAA,MAAM,EAAE,UAAA,EAAY,QAAA,EAAU,GAAG,OAAM,GAAI,IAAA;AAC3C,MAAA,OAAO,CAAA,CAAE,gBAAA,CAAkB,EAAA,EAAI,KAA8B,CAAA;AAAA,IAC/D,CAAA;AAAA,IAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,MAAA,MAAM,CAAA,GAAI,kBAAA,CAAmB,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAC9C,MAAA,MAAM,CAAA,CAAE,iBAAkB,EAAE,CAAA;AAAA,IAC9B;AAAA,GACF;AACF;;;ACnDA,SAAS,iBAAiB,CAAA,EAA+B;AACvD,EAAA,IAAI,CAAC,CAAA,CAAE,aAAA,EAAe,MAAM,IAAI,MAAM,iDAAiD,CAAA;AACvF,EAAA,OAAO,CAAA;AACT;AAEO,SAAS,+BACd,QAAA,EACwB;AACxB,EAAA,OAAO;AAAA,IACL,MAAM,KAAK,KAAA,EAAiD;AAC1D,MAAA,MAAM,OAAQ,MAAM,OAAA,CAAQ,QAAQ,CAAA,CAAE,aAAA,QAAsB,EAAC;AAC7D,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,EAAQ,IAAA,GAAO,WAAA,EAAY;AAC9C,MAAA,MAAM,QAAA,GAAW,OACb,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KACX,CAAA,CAAE,KAAK,WAAA,EAAY,CAAE,SAAS,IAAI,CAAA,IAAA,CAAM,EAAE,aAAA,IAAiB,EAAA,EAAI,aAAY,CAAE,QAAA,CAAS,IAAI,CAAC,CAAA,GAC7F,IAAA;AACJ,MAAA,OAAO,UAAA,CAAW,QAAA,EAAU,KAAA,EAAO,QAAQ,CAAA;AAAA,IAC7C,CAAA;AAAA,IAEA,MAAM,OAAO,IAAA,EAAyB;AACpC,MAAA,MAAM,CAAA,GAAI,gBAAA,CAAiB,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAC5C,MAAA,MAAM,KAAA,GAAQ,IAAA;AACd,MAAA,OAAO,EAAE,cAAA,CAAgB;AAAA,QACvB,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,IAAA,EAAK,IAAK,MAAA;AAAA,QAC5B,cAAA,EAAgB,MAAA,CAAO,KAAA,CAAM,cAAc,CAAA,IAAK,CAAA;AAAA,QAChD,MAAA,EAAQ,MAAM,MAAA,IAAU,QAAA;AAAA,QACxB,SAAA,EAAW,MAAM,SAAA,IAAa,IAAA;AAAA,QAC9B,aAAA,EAAe,MAAM,aAAA,IAAiB,IAAA;AAAA,QACtC,IAAA,EAAM,MAAM,IAAA,IAAQ;AAAA,OACE,CAAA;AAAA,IAC1B,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,EAAA,EAAY,IAAA,EAA4C;AACnE,MAAA,MAAM,CAAA,GAAI,gBAAA,CAAiB,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAI5C,MAAA,MAAM,EAAE,cAAA,EAAgB,KAAA,EAAO,GAAG,OAAM,GAAI,IAAA;AAC5C,MAAA,OAAO,CAAA,CAAE,cAAA,CAAgB,EAAA,EAAI,KAA4B,CAAA;AAAA,IAC3D,CAAA;AAAA,IAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,MAAA,MAAM,CAAA,GAAI,gBAAA,CAAiB,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAC5C,MAAA,MAAM,CAAA,CAAE,eAAgB,EAAE,CAAA;AAAA,IAC5B;AAAA,GACF;AACF;;;AC5CA,SAAS,cAAc,CAAA,EAA+B;AACpD,EAAA,IAAI,CAAC,CAAA,CAAE,kBAAA,EAAoB,MAAM,IAAI,MAAM,sDAAsD,CAAA;AACjG,EAAA,OAAO,CAAA;AACT;AAEO,SAAS,oCACd,QAAA,EAC6B;AAC7B,EAAA,OAAO;AAAA,IACL,MAAM,KAAK,KAAA,EAAsD;AAC/D,MAAA,MAAM,OAAQ,MAAM,OAAA,CAAQ,QAAQ,CAAA,CAAE,kBAAA,QAA2B,EAAC;AAClE,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,EAAQ,IAAA,GAAO,WAAA,EAAY;AAC9C,MAAA,MAAM,QAAA,GAAW,OACb,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KACX,CAAA,CAAE,KAAK,WAAA,EAAY,CAAE,SAAS,IAAI,CAAA,IAAA,CAAM,EAAE,WAAA,IAAe,EAAA,EAAI,aAAY,CAAE,QAAA,CAAS,IAAI,CAAC,CAAA,GAC3F,IAAA;AACJ,MAAA,OAAO,UAAA,CAAW,UAAU,KAAK,CAAA;AAAA,IACnC,CAAA;AAAA,IAEA,MAAM,OAAO,IAAA,EAA8B;AACzC,MAAA,MAAM,CAAA,GAAI,aAAA,CAAc,OAAA,CAAQ,QAAQ,CAAC,CAAA;AACzC,MAAA,MAAM,KAAA,GAAQ,IAAA;AACd,MAAA,OAAO,EAAE,mBAAA,CAAqB;AAAA,QAC5B,IAAA,EAAM,MAAA,CAAO,KAAA,CAAM,IAAA,IAAQ,EAAE,CAAA;AAAA,QAC7B,WAAA,EAAa,MAAM,WAAA,IAAe,IAAA;AAAA,QAClC,KAAA,EAAO,MAAM,KAAA,IAAS;AAAA,OACK,CAAA;AAAA,IAC/B,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,EAAA,EAAY,IAAA,EAAsD;AAC7E,MAAA,MAAM,CAAA,GAAI,aAAA,CAAc,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAIzC,MAAA,MAAM,EAAE,WAAA,EAAa,QAAA,EAAU,GAAG,OAAM,GAAI,IAAA;AAC5C,MAAA,OAAO,CAAA,CAAE,mBAAA,CAAqB,EAAA,EAAI,KAAiC,CAAA;AAAA,IACrE,CAAA;AAAA,IAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,MAAA,MAAM,CAAA,GAAI,aAAA,CAAc,OAAA,CAAQ,QAAQ,CAAC,CAAA;AACzC,MAAA,MAAM,CAAA,CAAE,oBAAqB,EAAE,CAAA;AAAA,IACjC;AAAA,GACF;AACF;;;ACxCA,SAAS,gBAAgB,CAAA,EAA+B;AACtD,EAAA,IAAI,CAAC,CAAA,CAAE,oBAAA,EAAsB,MAAM,IAAI,MAAM,wDAAwD,CAAA;AACrG,EAAA,OAAO,CAAA;AACT;AAOO,SAAS,sBAAA,CAAuB,GAAiB,CAAA,EAA6B;AACnF,EAAA,MAAM,MAAA,GAAS,EAAE,WAAA,IAAe,CAAA;AAChC,EAAA,MAAM,KAAA,GAAQ,EAAE,UAAA,IAAc,CAAA;AAC9B,EAAA,IAAI,EAAE,SAAA,IAAa,IAAA,IAAQ,MAAA,GAAS,CAAA,CAAE,WAAW,OAAO,KAAA;AACxD,EAAA,IAAI,EAAE,SAAA,IAAa,IAAA,IAAQ,MAAA,GAAS,CAAA,CAAE,WAAW,OAAO,KAAA;AACxD,EAAA,IAAI,EAAE,QAAA,IAAY,IAAA,IAAQ,KAAA,GAAQ,CAAA,CAAE,UAAU,OAAO,KAAA;AACrD,EAAA,IAAI,EAAE,QAAA,IAAY,IAAA,IAAQ,KAAA,GAAQ,CAAA,CAAE,UAAU,OAAO,KAAA;AAGrD,EAAA,MAAM,MAAA,GAAS,CAAA,CAAE,SAAA,EAAW,KAAA,CAAM,GAAG,EAAE,CAAA;AACvC,EAAA,IAAI,EAAE,WAAA,KAAgB,CAAC,UAAU,MAAA,GAAS,CAAA,CAAE,cAAc,OAAO,KAAA;AACjE,EAAA,IAAI,EAAE,YAAA,KAAiB,CAAC,UAAU,MAAA,GAAS,CAAA,CAAE,eAAe,OAAO,KAAA;AACnE,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,sCACd,QAAA,EAC0B;AAC1B,EAAA,OAAO;AAAA,IACL,MAAM,KAAK,KAAA,EAAmD;AAC5D,MAAA,MAAM,CAAA,GAAI,QAAQ,QAAQ,CAAA;AAC1B,MAAA,MAAM,IAAA,GAAQ,MAAM,CAAA,CAAE,oBAAA,QAA6B,EAAC;AAIpD,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,GAAS,MAAM,CAAA,CAAE,aAAA,EAAc,CAAE,KAAA,CAAM,MAAM,EAAoB,CAAA,GAAI,EAAC;AAC7F,MAAA,MAAM,UAAA,GAA2B,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QAChD,GAAG,CAAA;AAAA,QACH,UAAA,EAAY,UAAU,MAAA,CAAO,CAAC,MAAM,sBAAA,CAAuB,CAAA,EAAG,CAAC,CAAC,CAAA,CAAE;AAAA,OACpE,CAAE,CAAA;AACF,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,EAAQ,IAAA,GAAO,WAAA,EAAY;AAC9C,MAAA,MAAM,QAAA,GAAW,OACb,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KACjB,CAAA,CAAE,KAAK,WAAA,EAAY,CAAE,SAAS,IAAI,CAAA,IAAA,CAAM,EAAE,WAAA,IAAe,EAAA,EAAI,aAAY,CAAE,QAAA,CAAS,IAAI,CAAC,CAAA,GAC3F,UAAA;AACJ,MAAA,OAAO,UAAA,CAAW,UAAU,KAAK,CAAA;AAAA,IACnC,CAAA;AAAA,IAEA,MAAM,OAAO,IAAA,EAA2B;AACtC,MAAA,MAAM,CAAA,GAAI,eAAA,CAAgB,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAC3C,MAAA,MAAM,KAAA,GAAQ,IAAA;AACd,MAAA,MAAM,OAAA,GAAU,MAAM,CAAA,CAAE,qBAAA,CAAuB;AAAA,QAC7C,IAAA,EAAM,MAAA,CAAO,KAAA,CAAM,IAAA,IAAQ,EAAE,CAAA;AAAA,QAC7B,WAAA,EAAa,MAAM,WAAA,IAAe,IAAA;AAAA,QAClC,SAAA,EAAW,MAAM,SAAA,IAAa,IAAA;AAAA,QAC9B,SAAA,EAAW,MAAM,SAAA,IAAa,IAAA;AAAA,QAC9B,QAAA,EAAU,MAAM,QAAA,IAAY,IAAA;AAAA,QAC5B,QAAA,EAAU,MAAM,QAAA,IAAY,IAAA;AAAA,QAC5B,WAAA,EAAa,MAAM,WAAA,IAAe,IAAA;AAAA,QAClC,YAAA,EAAc,MAAM,YAAA,IAAgB;AAAA,OACP,CAAA;AAC/B,MAAA,OAAO,EAAE,GAAG,OAAA,EAAS,UAAA,EAAY,CAAA,EAAE;AAAA,IACrC,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,EAAA,EAAY,IAAA,EAAgD;AACvE,MAAA,MAAM,CAAA,GAAI,eAAA,CAAgB,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAE3C,MAAA,MAAM,EAAE,UAAA,EAAY,MAAA,EAAQ,GAAG,OAAM,GAAI,IAAA;AACzC,MAAA,MAAM,OAAA,GAAU,MAAM,CAAA,CAAE,qBAAA,CAAuB,IAAI,KAAmC,CAAA;AACtF,MAAA,OAAO,EAAE,GAAG,OAAA,EAAS,UAAA,EAAY,CAAA,EAAE;AAAA,IACrC,CAAA;AAAA,IAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,MAAA,MAAM,CAAA,GAAI,eAAA,CAAgB,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAC3C,MAAA,MAAM,CAAA,CAAE,sBAAuB,EAAE,CAAA;AAAA,IACnC;AAAA,GACF;AACF;AC7DA,IAAM,WAAA,GAAc,GAAA;AA6Bb,SAAS,gBAAA,CACd,QAAA,EACA,QAAA,GAA0B,EAAC,EACN;AACrB,EAAA,MAAM,OAAOD,MAAAA,CAAM,OAAA;AAAA,IACjB,MAAO,QAAA,GAAW,OAAA,CAAQ,QAAQ,IAAIK,eAAAA,EAAgB;AAAA,IACtD,CAAC,QAAQ;AAAA,GACX;AACA,EAAA,MAAM,YAAY,OAAO,IAAA,CAAK,qBAAqB,UAAA,IAAc,OAAO,KAAK,mBAAA,KAAwB,UAAA;AAErG,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIL,MAAAA,CAAM,SAA+B,IAAI,CAAA;AACrE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,MAAAA,CAAM,SAAS,SAAS,CAAA;AACtD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,MAAAA,CAAM,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,MAAAA,CAAM,SAAwB,IAAI,CAAA;AAC5D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,MAAAA,CAAM,SAAwB,IAAI,CAAA;AAEpE,EAAAA,MAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,KAAK,IAAA,CACF,gBAAA,EAAkB,CAClB,IAAA,CAAK,CAAC,QAAA,KAAa;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,SAAA,CAAU,QAAQ,CAAA;AAAA,IAAE,CAAC,CAAA,CAC1D,KAAA,CAAM,CAAC,CAAA,KAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,YAAA,CAAa,YAAA,CAAa,CAAC,CAAC,CAAA;AAAA,IAAE,CAAC,CAAA,CAC9D,OAAA,CAAQ,MAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,UAAA,CAAW,KAAK,CAAA;AAAA,IAAE,CAAC,CAAA;AACtD,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAK,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,IAAA,EAAM,SAAS,CAAC,CAAA;AAKpB,EAAA,MAAM,UAAA,GAAaA,MAAAA,CAAM,MAAA,CAAiC,EAAE,CAAA;AAC5D,EAAA,MAAM,QAAA,GAAWA,MAAAA,CAAM,MAAA,CAA6C,IAAI,CAAA;AAExE,EAAAA,MAAAA,CAAM,SAAA,CAAU,MAAM,MAAM;AAAE,IAAA,IAAI,QAAA,CAAS,OAAA,EAAS,YAAA,CAAa,QAAA,CAAS,OAAO,CAAA;AAAA,EAAE,CAAA,EAAG,EAAE,CAAA;AAExF,EAAA,MAAM,MAAMA,MAAAA,CAAM,WAAA;AAAA,IAChB,CAAC,KAAA,KAAoC;AAEnC,MAAA,SAAA,CAAU,CAAC,aAAa,EAAE,GAAI,WAAW,EAAC,EAAI,GAAG,KAAA,EAAM,CAAE,CAAA;AACzD,MAAA,IAAI,CAAC,SAAA,EAAW;AAChB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,UAAA,CAAW,UAAU,EAAE,GAAG,UAAA,CAAW,OAAA,EAAS,GAAG,KAAA,EAAM;AACvD,MAAA,IAAI,QAAA,CAAS,OAAA,EAAS,YAAA,CAAa,QAAA,CAAS,OAAO,CAAA;AACnD,MAAA,QAAA,CAAS,OAAA,GAAU,WAAW,MAAM;AAClC,QAAA,MAAM,UAAU,UAAA,CAAW,OAAA;AAC3B,QAAA,UAAA,CAAW,UAAU,EAAC;AACtB,QAAA,KAAK,IAAA,CACF,mBAAA,CAAqB,OAAO,CAAA,CAG5B,IAAA,CAAK,CAAC,KAAA,KAAU,SAAA,CAAU,KAAK,CAAC,CAAA,CAChC,KAAA,CAAM,CAAC,CAAA,KAAM,QAAA,CAAS,YAAA,CAAa,CAAC,CAAC,CAAC,EACtC,OAAA,CAAQ,MAAM,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,MACnC,GAAG,WAAW,CAAA;AAAA,IAChB,CAAA;AAAA,IACA,CAAC,MAAM,SAAS;AAAA,GAClB;AAEA,EAAA,MAAM,KAAA,GAAQA,MAAAA,CAAM,OAAA,CAAQ,OAAO,EAAE,GAAG,QAAA,EAAU,GAAI,MAAA,IAAU,EAAC,EAAG,CAAA,EAAI,CAAC,QAAA,EAAU,MAAM,CAAC,CAAA;AAE1F,EAAA,OAAO,EAAE,OAAO,MAAA,EAAQ,GAAA,EAAK,SAAS,MAAA,EAAQ,KAAA,EAAO,WAAW,SAAA,EAAU;AAC5E;ACpGO,SAAS,aAAA,CAAc;AAAA,EAC5B,OAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAUG;AACD,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,uBACEE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kEAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wEAAA,EACX,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAACS,aAAAA,EAAA,EAAc,SAAA,EAAU,kBAAA,EAAmB,CAAA;AAAA,QAAE;AAAA,OAAA,EAEhD,CAAA;AAAA,sBACAR,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4BAAA,EAA6B,QAAA,EAAA;AAAA,QAAA,oDAAA;AAAA,wBACOD,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,QAAO;AAAA,OAAA,EAE9E;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,wBAAA,EAAyB,CAAA;AAAA,sBAC7CA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,wBAAA,EAAyB;AAAA,KAAA,EAC/C,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA;AAAA,IAAA,SAAA,oBACCA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sEAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sDAAA,EACX,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAACS,aAAAA,EAAA,EAAc,SAAA,EAAU,kBAAA,EAAmB,CAAA;AAAA,QAAE;AAAA,OAAA,EAEhD,CAAA;AAAA,sBACAT,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8BAA6B,QAAA,EAAA,4MAAA,EAG1C,CAAA;AAAA,sBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAsC,QAAA,EAAA,SAAA,EAAU;AAAA,KAAA,EAC/D,CAAA;AAAA,IAED,QAAA;AAAA,oBACDA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sEAAA,EACZ,kCACCC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAAA,EACd,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAACS,aAAAA,EAAA,EAAc,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,MAAE,iCAAA;AAAA,MACxB;AAAA,KAAA,EAC5B,CAAA,GACE,MAAA,mBACFR,IAAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAACU,OAAAA,EAAA,EAAQ,SAAA,EAAU,mCAAA,EAAoC,CAAA;AAAA,MAAE;AAAA,KAAA,EAE3D,CAAA,mBAEAT,IAAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,MAAE;AAAA,KAAA,EAE5C,CAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;ACrFA,IAAM,UAAA,GAAa;AAAA,EACjB,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,WAAA,EAAY;AAAA,EACnC,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,eAAA,EAAgB;AAAA,EACvC,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,eAAA,EAAW;AAAA,EAClC,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,sBAAA;AACzB,CAAA;AAEA,IAAM,OAAA,GAAU;AAAA,EACd,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,uBAAA,EAAqB;AAAA,EAC9C,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,cAAA,EAAe;AAAA,EACxC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,YAAA;AAC3B,CAAA;AASO,SAAS,oBAAA,CAAqB,EAAE,QAAA,EAAU,QAAA,EAAS,EAA8B;AACtF,EAAA,MAAM,QAAA,GAAW,iBAAiB,QAAA,EAAU;AAAA,IAC1C,QAAA,EAAU,UAAU,IAAA,IAAQ,KAAA;AAAA,IAC5B,MAAA,EAAQ,UAAU,MAAA,IAAU,OAAA;AAAA,IAC5B,cAAA,EAAgB,IAAA;AAAA,IAChB,UAAA,EAAY,KAAA;AAAA,IACZ,cAAA,EAAgB,IAAA;AAAA,IAChB,cAAA,EAAgB;AAAA,GACjB,CAAA;AACD,EAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAI,GAAI,QAAA;AAEvB,EAAA,uBACEC,IAAAA,CAAC,aAAA,EAAA,EAAe,GAAG,QAAA,EACjB,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAM,MAAA,EAAO,aAAY,sCAAA,EACtC,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,OAAA;AAAA,UACN,WAAA,EAAY,4CAAA;AAAA,UACZ,KAAA,EAAO,MAAM,QAAA,IAAY,KAAA;AAAA,UACzB,OAAA,EAAS,UAAA;AAAA,UACT,UAAU,CAAC,CAAA,KAAM,IAAI,EAAE,QAAA,EAAU,GAAG;AAAA;AAAA,OACtC;AAAA,sBACAA,GAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,kBAAA;AAAA,UACN,WAAA,EAAY,oDAAA;AAAA,UACZ,KAAA,EAAO,MAAM,MAAA,IAAU,OAAA;AAAA,UACvB,OAAA,EAAS,OAAA;AAAA,UACT,UAAU,CAAC,CAAA,KAAM,IAAI,EAAE,MAAA,EAAQ,GAAG;AAAA;AAAA;AACpC,KAAA,EACF,CAAA;AAAA,oBAEAC,IAAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAM,aAAA,EAAW,aAAY,iDAAA,EAC1C,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,4BAAA;AAAA,UACN,WAAA,EAAY,sCAAA;AAAA,UACZ,OAAA,EAAS,MAAM,cAAA,IAAkB,IAAA;AAAA,UACjC,UAAU,CAAC,CAAA,KAAM,IAAI,EAAE,cAAA,EAAgB,GAAG;AAAA;AAAA,OAC5C;AAAA,sBACAA,GAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,YAAA;AAAA,UACN,WAAA,EAAY,gDAAA;AAAA,UACZ,OAAA,EAAS,MAAM,UAAA,IAAc,KAAA;AAAA,UAC7B,UAAU,CAAC,CAAA,KAAM,IAAI,EAAE,UAAA,EAAY,GAAG;AAAA;AAAA;AACxC,KAAA,EACF,CAAA;AAAA,oBAQAC,IAAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAM,oBAAA,EAAe,aAAY,4BAAA,EAC9C,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,uBAAA;AAAA,UACN,WAAA,EAAY,wCAAA;AAAA,UACZ,OAAA,EAAS,MAAM,cAAA,IAAkB,IAAA;AAAA,UACjC,UAAU,CAAC,CAAA,KAAM,IAAI,EAAE,cAAA,EAAgB,GAAG;AAAA;AAAA,OAC5C;AAAA,sBACAA,GAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,yBAAA;AAAA,UACN,WAAA,EAAY,+CAAA;AAAA,UACZ,OAAA,EAAS,MAAM,cAAA,IAAkB,KAAA;AAAA,UACjC,UAAU,CAAC,CAAA,KAAM,IAAI,EAAE,cAAA,EAAgB,GAAG;AAAA;AAAA;AAC5C,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;ACvFO,SAAS,sBAAA,CACd,SACA,IAAA,EACe;AACf,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC9B,EAAA,IAAI,OAAA,KAAY,IAAI,OAAO,IAAA;AAC3B,EAAA,IAAI,OAAA,IAAW,IAAA,CAAK,QAAA,CAAS,OAAO,GAAG,OAAO,IAAA;AAC9C,EAAA,OAAO,KAAK,CAAC,CAAA;AACf;ACJO,SAAS,mBAAmB,EAAE,SAAA,EAAW,QAAA,EAAU,QAAA,EAAU,QAAO,EAKxE;AACD,EAAA,MAAM,IAAA,GAAO,UAAU,KAAA,KAAU,WAAA;AAEjC,EAAA,uBACEC,KAAC,IAAA,EAAA,EAAG,SAAA,EAAW,4CAA4C,QAAA,GAAW,cAAA,GAAiB,EAAE,CAAA,CAAA,EAGvF,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAK,OAAA;AAAA,QACL,cAAA,EAAc,QAAA;AAAA,QACd,UAAU,CAAC,IAAA;AAAA,QACX,OAAA,EAAS,MAAM,QAAA,CAAS,SAAS,CAAA;AAAA,QACjC,SAAA,EAAW,CAAA,oDAAA,EACT,IAAA,GAAO,mBAAA,GAAsB,2BAC/B,CAAA,CAAA;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAD,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,aAAA,EAAW,IAAA;AAAA,cACX,SAAA,EAAW,gFACT,QAAA,GAAW,gBAAA,GAAmB,4BAChC,CAAA,CAAA,EAAI,IAAA,GAAO,KAAK,YAAY,CAAA,CAAA;AAAA,cAE3B,QAAA,EAAA,QAAA,oBAAYA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,iCAAA,EAAkC;AAAA;AAAA,WACjE;AAAA,0BACAA,GAAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAsB,CAAA;AAAA,0BACrCC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EACd,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mCAAA,EACd,QAAA,EAAA;AAAA,8BAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6BAAA,EAA+B,oBAAU,IAAA,EAAK,CAAA;AAAA,8BAC9DA,GAAAA,CAAC,SAAA,EAAA,EAAU,KAAA,EAAO,UAAU,KAAA,EAAO;AAAA,aAAA,EACrC,CAAA;AAAA,4BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAAA,EACb,QAAA,EAAA,QAAA,GACG,8BAAA,GACA,IAAA,GACE,uDAAA,GACA,SAAA,CAAU,WAAA,IAAe,yBAAA,EACjC;AAAA,WAAA,EACF;AAAA;AAAA;AAAA,KACF;AAAA,oBAIAA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,MAAA,CAAO,SAAS,CAAA;AAAA,QAC/B,SAAA,EAAU,gJAAA;AAAA,QAET,iBAAO,uBAAA,GAAuB;AAAA;AAAA;AACjC,GAAA,EACF,CAAA;AAEJ;AAKO,SAAS,eAAA,CAAgB,EAAE,QAAA,EAAU,QAAA,EAAS,EAGlD;AACD,EAAA,uBACEA,GAAAA,CAAC,IAAA,EAAA,EAAG,WAAW,QAAA,GAAW,cAAA,GAAiB,IACzC,QAAA,kBAAAC,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,IAAA,EAAK,OAAA;AAAA,MACL,cAAA,EAAc,QAAA;AAAA,MACd,OAAA,EAAS,QAAA;AAAA,MACT,SAAA,EAAU,+DAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAD,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAW,IAAA;AAAA,YACX,SAAA,EAAW,CAAA,6EAAA,EACT,QAAA,GAAW,gBAAA,GAAmB,4BAChC,CAAA,CAAA;AAAA,YAEC,QAAA,EAAA,QAAA,oBAAYA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,iCAAA,EAAkC;AAAA;AAAA,SACjE;AAAA,wBACAC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EACd,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6BAAA,EAA8B,QAAA,EAAA,qDAAA,EAAwC,CAAA;AAAA,0BACtFA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8CAA6C,QAAA,EAAA,mIAAA,EAG7D;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF,EACF,CAAA;AAEJ;ACpFA,IAAM,OAAA,GAA4E;AAAA,EAChF,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,MAAM,kBAAA,EAAmB;AAAA,EACvD,EAAE,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,yBAAA,EAAqB,MAAM,uBAAA,EAAwB;AAAA,EAClF,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,wBAAA,EAAoB,MAAM,uBAAA,EAAwB;AAAA,EAChF,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,MAAM,oBAAA,EAAqB;AAAA,EAC/D,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,UAAA,EAAY,MAAM,4BAAA,EAA0B;AAAA,EACpE,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,qBAAA,EAAuB,MAAM,2BAAA;AACxD,CAAA;AA0BA,IAAM,kBAAA,GAAqB,CAAC,UAAU,CAAA;AAE/B,SAAS,gBAAA,CAAiB,EAAE,QAAA,EAAS,EAA0B;AACpE,EAAA,MAAM,QAAA,GAAW,iBAAiB,QAAQ,CAAA;AAC1C,EAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAI,GAAI,QAAA;AACvB,EAAA,MAAM,EAAE,YAAW,GAAI,aAAA,CAAc,EAAE,YAAA,EAAc,MAAA,EAAQ,aAAA,EAAe,KAAA,EAAO,CAAA;AACnF,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAID,MAAAA,CAAM,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,MAAAA,CAAM,SAAkC,IAAI,CAAA;AAC5E,EAAA,MAAM,iBAAiB,2BAAA,EAA4B;AAEnD,EAAA,MAAM,cAAcA,MAAAA,CAAM,WAAA;AAAA,IACxB,CAAC,SAAA,KAAgC;AAG/B,MAAA,IAAI,cAAA,sBAAoC,SAAS,CAAA;AAAA,uBAChC,SAAS,CAAA;AAAA,IAC5B,CAAA;AAAA,IACA,CAAC,cAAc;AAAA,GACjB;AAEA,EAAA,MAAM,UAAUA,MAAAA,CAAM,OAAA;AAAA,IACpB,MAAA,CAAO,UAAA,IAAc,EAAC,EAAG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,IAAY,kBAAA,CAAmB,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAC,CAAA;AAAA,IAC5F,CAAC,UAAU;AAAA,GACb;AACA,EAAA,MAAM,IAAA,GAAOA,MAAAA,CAAM,OAAA,CAAQ,MAAM,QAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,WAAW,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAE1F,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,cAAA,IAAkB,EAAC;AAGxC,EAAA,MAAM,gBAAgB,CAAC,CAAC,KAAA,CAAM,eAAA,IACzB,CAAC,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,KAAA,CAAM,eAAe,CAAA,IAClD,KAAK,MAAA,KAAW,CAAA;AAIrB,EAAA,MAAM,SAAA,GAAYA,MAAAA,CAAM,MAAA,CAAsB,IAAI,CAAA;AAClD,EAAAA,MAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,CAAC,QAAA,CAAS,SAAA,IAAa,QAAA,CAAS,OAAA,EAAS;AAC7C,IAAA,MAAM,IAAA,GAAO,sBAAA,CAAuB,KAAA,CAAM,eAAA,EAAiB,IAAA,CAAK,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AAClF,IAAA,IAAI,CAAC,IAAA,EAAM;AAGX,IAAA,IAAI,KAAA,CAAM,eAAA,EAAiB,SAAA,CAAU,OAAA,GAAU,KAAA,CAAM,eAAA;AACrD,IAAA,GAAA,CAAI,EAAE,eAAA,EAAiB,IAAA,EAAM,CAAA;AAAA,EAC/B,CAAA,EAAG,CAAC,IAAA,EAAM,KAAA,CAAM,eAAA,EAAiB,SAAS,SAAA,EAAW,QAAA,CAAS,OAAA,EAAS,GAAG,CAAC,CAAA;AAE3E,EAAA,uBACEE,IAAAA,CAAC,aAAA,EAAA,EAAe,GAAG,QAAA,EACjB,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAACU,aAAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,qBAAA;AAAA,QACN,WAAA,EAAY,8GAAA;AAAA,QAEZ,QAAA,EAAA;AAAA,0BAAAX,GAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,gBAAA;AAAA,cACN,WAAA,EAAY,qEAAA;AAAA,cACZ,KAAA,EAAO,MAAA;AAAA,cACP,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM,CAAE,CAAA;AAAA,cAChE,UAAU,CAAC,IAAA,KAAS,IAAI,EAAE,cAAA,EAAgB,MAA6B;AAAA;AAAA,WACzE;AAAA,UACC,MAAA,CAAO,MAAA,GAAS,CAAA,IAAK,CAAC,KAAA,CAAM,mCAC3BC,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,2DAAA,EACX,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAACS,aAAAA,EAAA,EAAc,SAAA,EAAU,6BAAA,EAA8B,CAAA;AAAA,YAAE,6CAAA;AAAA,4BACdT,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,eAAc,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,YAAS;AAAA,WAAA,EAG9F;AAAA;AAAA;AAAA,KAEJ;AAAA,oBAEAC,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,0BAChDA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4CAA2C,QAAA,EAAA,8KAAA,EAGxD;AAAA,SAAA,EACF,CAAA;AAAA,wBACAA,GAAAA,CAAC,kBAAA,EAAA,EAAmB,SAAS,MAAM,SAAA,CAAU,IAAI,CAAA,EAAG;AAAA,OAAA,EACtD,CAAA;AAAA,sBACAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCACZ,QAAA,EAAA,OAAA,CAAQ,MAAA,KAAW,CAAA,mBAClBA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,mCAAA,EAAoC,QAAA,EAAA,iEAAA,EAEjD,CAAA,mBAEAC,IAAAA,CAAC,IAAA,EAAA,EAAG,WAAU,UAAA,EAAW,IAAA,EAAK,YAAA,EAAa,YAAA,EAAW,YAAA,EACnD,QAAA,EAAA;AAAA,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,SAAA,qBACZD,GAAAA;AAAA,UAAC,kBAAA;AAAA,UAAA;AAAA,YAEC,SAAA;AAAA,YACA,QAAA,EAAU,KAAA,CAAM,eAAA,KAAoB,SAAA,CAAU,IAAA;AAAA,YAC9C,QAAA,EAAU,CAAC,CAAA,KAAM;AAAE,cAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AAAM,cAAA,GAAA,CAAI,EAAE,eAAA,EAAiB,CAAA,CAAE,IAAA,EAAM,CAAA;AAAA,YAAE,CAAA;AAAA,YAC9E,MAAA,EAAQ;AAAA,WAAA;AAAA,UAJH,SAAA,CAAU;AAAA,SAMlB,CAAA;AAAA,wBACDA,GAAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YACC,QAAA,EAAU,MAAM,eAAA,KAAoB,EAAA;AAAA,YACpC,UAAU,MAAM;AAAE,cAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AAAM,cAAA,GAAA,CAAI,EAAE,eAAA,EAAiB,EAAA,EAAI,CAAA;AAAA,YAAE;AAAA;AAAA;AAC3E,OAAA,EACF,CAAA,EAEJ,CAAA;AAAA,MACC,UAAU,OAAA,oBACTC,IAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,gEAAA,EACX,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAACS,aAAAA,EAAA,EAAc,SAAA,EAAU,4CAAA,EAA6C,CAAA;AAAA,wBACtER,KAAC,MAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,aAAA,EAAe,oBAAU,OAAA,EAAQ,CAAA;AAAA,UAAS;AAAA,SAAA,EAE9D;AAAA,OAAA,EACF,CAAA;AAAA,MAED,aAAA,oBACCC,IAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,2DAAA,EACX,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAACS,aAAAA,EAAA,EAAc,SAAA,EAAU,6BAAA,EAA8B,CAAA;AAAA,QAAE,mBAAA;AAAA,wBACxCT,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,aAAA,EAAe,gBAAM,eAAA,EAAgB,CAAA;AAAA,QAAS;AAAA,OAAA,EAGnF;AAAA,KAAA,EAEJ,CAAA;AAAA,oBAEAA,GAAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,MAAA;AAAA,QACN,YAAA,EAAc,SAAA;AAAA,QACd,UAAA;AAAA,QAGA,UAAA,EAAY,kBAAA;AAAA,QACZ,QAAA,EAAU,CAAC,SAAA,KAAc;AACvB,UAAA,SAAA,CAAU,KAAK,CAAA;AACf,UAAA,WAAA,CAAY,SAAS,CAAA;AAAA,QACvB;AAAA;AAAA,KACF;AAAA,oBACAA,GAAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,QAAA;AAAA,QACX,IAAA,EAAM,CAAC,CAAC,QAAA;AAAA,QACR,YAAA,EAAc,CAAC,IAAA,KAAS;AAAE,UAAA,IAAI,CAAC,IAAA,EAAM,WAAA,CAAY,IAAI,CAAA;AAAA,QAAE;AAAA;AAAA;AACzD,GAAA,EACF,CAAA;AAEJ;ACjLA,IAAM,MAAA,GAA2F;AAAA,EAC/F,EAAE,KAAK,MAAA,EAAQ,KAAA,EAAO,iBAAiB,MAAA,EAAQ,IAAA,EAAM,MAAM,oDAAA,EAA6C;AAAA,EACxG,EAAE,KAAK,OAAA,EAAS,KAAA,EAAO,UAAU,MAAA,EAAQ,IAAA,EAAM,MAAM,8DAAA,EAAoD;AAAA,EACzG,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,UAAA,EAAY,MAAM,qEAAA,EAA2D;AAAA;AAAA;AAAA;AAAA;AAAA,EAKpG,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,YAAA,EAAc,MAAM,8GAAA,EAAoG;AAAA,EAClJ,EAAE,KAAK,YAAA,EAAc,KAAA,EAAO,OAAO,MAAA,EAAQ,IAAA,EAAM,MAAM,+CAAA,EAAwC;AAAA,EAC/F,EAAE,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,aAAA,EAAY,QAAQ,IAAA,EAAK;AAAA,EACjD,EAAE,KAAK,QAAA,EAAU,KAAA,EAAO,aAAU,MAAA,EAAQ,IAAA,EAAM,MAAM,0CAAA,EAAqC;AAAA,EAC3F,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,aAAA,EAAc;AAAA,EAC1C,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,QAAA,EAAU,QAAQ,IAAA,EAAK;AAAA,EACjD,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,QAAQ,IAAA,EAAK;AAAA,EAC7C,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,IAAA,EAAM,QAAQ,IAAA;AACvC,CAAA;AAEA,IAAM,WAAA,GAAc;AAAA,EAClB,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,cAAA,EAAY;AAAA,EACnC,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,kBAAA,EAAmB;AAAA,EAC/C,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,wBAAA;AAC9B,CAAA;AAEA,SAAS,aAAA,CAAc,QAAyC,MAAA,EAAyB;AACvF,EAAA,IAAI,QAAQ,OAAO,UAAA;AACnB,EAAA,IAAI,MAAA,EAAQ,OAAA,KAAY,KAAA,EAAO,OAAO,KAAA;AACtC,EAAA,OAAO,MAAA,EAAQ,WAAW,UAAA,GAAa,UAAA;AACzC;AAEA,SAAS,gBAAgB,MAAA,EAAqC;AAI5D,EAAA,IAAI,WAAW,KAAA,EAAO,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,UAAU,KAAA,EAAM;AAC/D,EAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,QAAA,EAAU,WAAW,UAAA,EAAW;AAC1D;AAYO,SAAS,gBAAA,CAAiB,EAAE,QAAA,EAAS,EAA0B;AACpE,EAAA,MAAM,QAAA,GAAW,iBAAiB,QAAA,EAAU;AAAA,IAC1C,aAAA,EAAe,IAAA;AAAA,IACf,qBAAA,EAAuB,KAAA;AAAA,IACvB,cAAA,EAAgB,KAAA;AAAA,IAChB,gBAAA,EAAkB;AAAA,GACnB,CAAA;AACD,EAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAI,GAAI,QAAA;AACvB,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,cAAA,IAAkB,EAAC;AAExC,EAAA,MAAM,WAAW,CAAC,GAAA,EAAuB,MAAA,KACvC,GAAA,CAAI,EAAE,cAAA,EAAgB,EAAE,GAAG,MAAA,EAAQ,CAAC,GAAG,GAAG,gBAAgB,MAAM,CAAA,IAAK,CAAA;AAEvE,EAAA,uBACEC,IAAAA,CAAC,aAAA,EAAA,EAAe,GAAG,QAAA,EACjB,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAACU,aAAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,mBAAA;AAAA,QACN,WAAA,EAAY,yDAAA;AAAA,QAEZ,QAAA,EAAA;AAAA,0BAAAX,GAAAA;AAAA,YAACY,SAAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,8BAAA;AAAA,cACN,WAAA,EAAY,yHAAA;AAAA,cACZ,OAAA,EAAS,MAAM,aAAA,IAAiB,IAAA;AAAA,cAChC,UAAU,CAAC,CAAA,KAAM,IAAI,EAAE,aAAA,EAAe,GAAG;AAAA;AAAA,WAC3C;AAAA,0BACAZ,GAAAA;AAAA,YAACY,SAAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,0BAAA;AAAA,cACN,WAAA,EAAY,gKAAA;AAAA,cACZ,OAAA,EAAS,MAAM,qBAAA,IAAyB,KAAA;AAAA,cACxC,UAAU,CAAC,CAAA,KAAM,IAAI,EAAE,qBAAA,EAAuB,GAAG,CAAA;AAAA,cACjD,QAAA,EAAU,MAAM,aAAA,KAAkB;AAAA;AAAA,WACpC;AAAA,UACC,KAAA,CAAM,kBAAkB,KAAA,oBACvBZ,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAqC,QAAA,EAAA,8KAAA,EAGlD;AAAA;AAAA;AAAA,KAEJ;AAAA,oBAEAA,IAACW,aAAAA,EAAA,EAAc,OAAM,UAAA,EAAW,WAAA,EAAY,kDAC1C,QAAA,kBAAAX,GAAAA;AAAA,MAACY,SAAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,oBAAA;AAAA,QACN,WAAA,EAAY,yDAAA;AAAA,QACZ,OAAA,EAAS,MAAM,gBAAA,IAAoB,IAAA;AAAA,QACnC,UAAU,CAAC,CAAA,KAAM,IAAI,EAAE,gBAAA,EAAkB,GAAG;AAAA;AAAA,KAC9C,EACF,CAAA;AAAA,oBAEAZ,GAAAA;AAAA,MAACW,aAAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,4BAAA;AAAA,QACN,WAAA,EAAY,0GAAA;AAAA,QAEZ,QAAA,kBAAAX,GAAAA;AAAA,UAACY,SAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,yBAAA;AAAA,YACN,WAAA,EAAY,yEAAA;AAAA,YACZ,OAAA,EAAS,MAAM,cAAA,IAAkB,KAAA;AAAA,YACjC,UAAU,CAAC,CAAA,KAAM,IAAI,EAAE,cAAA,EAAgB,GAAG;AAAA;AAAA;AAC5C;AAAA,KACF;AAAA,oBAEAZ,GAAAA;AAAA,MAACW,aAAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,mBAAA;AAAA,QACN,WAAA,EAAY,iHAAA;AAAA,QAEX,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,qBACXX,GAAAA;AAAA,UAACa,SAAAA;AAAA,UAAA;AAAA,YAEC,OAAO,KAAA,CAAM,KAAA;AAAA,YACb,aAAa,KAAA,CAAM,IAAA;AAAA,YACnB,KAAA,EAAO,cAAc,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,EAAG,CAAC,CAAC,KAAA,CAAM,MAAM,CAAA;AAAA,YACtD,OAAA,EAAS,KAAA,CAAM,MAAA,GAAS,CAAC,EAAE,OAAO,UAAA,EAAY,KAAA,EAAO,wBAAA,EAAuB,CAAA,GAAI,WAAA;AAAA,YAChF,UAAU,CAAC,MAAA,KAAW,QAAA,CAAS,KAAA,CAAM,KAAK,MAAM,CAAA;AAAA,YAChD,UAAU,KAAA,CAAM;AAAA,WAAA;AAAA,UANX,KAAA,CAAM;AAAA,SAQd;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ;AC9HO,SAAS,iBAAiB,EAAE,QAAA,GAAW,oBAAA,CAAqB,iBAAiB,GAAE,EAEnF;AACD,EAAA,uBACEZ,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,sBAChDA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAA,EAAwC,2BAAiB,WAAA,EAAY;AAAA,KAAA,EACpF,CAAA;AAAA,oBAEAA,GAAAA,CAAC,gBAAA,EAAA,EAAiB,UAAU,gBAAA,EAAkB,QAAA,EAAoB,UAAQ,IAAA,EAAC;AAAA,GAAA,EAC7E,CAAA;AAEJ;ACZO,SAAS,gBAAA,CAAiB,EAAE,QAAA,EAAU,QAAA,EAAS,EAA0B;AAC9E,EAAA,MAAM,IAAA,GAAOD,MAAAA,CAAM,OAAA,CAAQ,MAAO,QAAA,GAAW,OAAA,CAAQ,QAAQ,CAAA,GAAIK,eAAAA,EAAgB,EAAI,CAAC,QAAQ,CAAC,CAAA;AAC/F,EAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAK,OAAA,EAAS,WAAU,GAAI,QAAA;AAC3C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIL,MAAAA,CAAM,SAAwB,IAAI,CAAA;AACpE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,MAAAA,CAAM,SAAmC,IAAI,CAAA;AAE7E,EAAAA,MAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,KAAK,IAAA,CAAK,oBAAA,IAAuB,CAC9B,IAAA,CAAK,CAAC,IAAA,KAAS;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,WAAA,CAAY,IAAI,CAAA;AAAA,IAAE,CAAC,CAAA,CAEpD,KAAA,CAAM,MAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,WAAA,CAAY,EAAE,CAAA;AAAA,IAAE,CAAC,CAAA;AAClD,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAK,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,IAAI,CAAC,WAAW,OAAO,IAAA;AAEvB,EAAA,MAAM,UAAA,GAAa,MAAM,YAAA,IAAgB,EAAA;AAEzC,EAAA,MAAM,OAAO,SAAA,IAAa,UAAA;AAC1B,EAAA,MAAM,MAAA,GAAA,CAAU,YAAY,EAAC,EAAG,OAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,SAAS,CAAA;AAE1D,EAAA,uBACEE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,+CAAA,EACZ,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,wCAAA,EAAyC,CAAA;AAAA,QAAE;AAAA,OAAA,EAE/D,CAAA;AAAA,sBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4CAA2C,QAAA,EAAA,oSAAA,EAIxD;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CACb,QAAA,kBAAAC,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAMI,eAAAA,CAAgB,oBAAA,CAAqB,0BAA0B,CAAC,CAAA;AAAA,QAC/E,SAAA,EAAU,iDAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAL,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,wCAAA,EAAyC,CAAA;AAAA,0BAC3DC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EACd,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAC,UAAK,SAAA,EAAU,2BAAA,EACb,sBAAY,IAAA,GACT,yBAAA,GACA,OAAO,MAAA,KAAW,CAAA,GAChB,yBACA,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,CAAA,EAAI,MAAA,CAAO,WAAW,CAAA,GAAI,QAAA,GAAW,QAAQ,CAAA,iBAAA,CAAA,EACrE,CAAA;AAAA,4BACAC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAAA,EACb,QAAA,EAAA;AAAA,cAAA,MAAA,CAAO,MAAA,KAAW,CAAA,GACf,uGAAA,GACA,MAAA,CAAO,MAAM,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CAAE,KAAK,QAAK,CAAA;AAAA,cACnD,OAAO,MAAA,GAAS,CAAA,IAAK,CAAA,GAAA,EAAM,MAAA,CAAO,SAAS,CAAC,CAAA,KAAA;AAAA,aAAA,EAC/C;AAAA,WAAA,EACF,CAAA;AAAA,0BACAD,GAAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,wCAAA,EAAyC;AAAA;AAAA;AAAA,KACjE,EACF,CAAA;AAAA,oBAEAA,GAAAA;AAAA,MAACW,aAAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,0BAAA;AAAA,QACN,WAAA,EAAY,sLAAA;AAAA,QAEZ,QAAA,kBAAAX,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,6BAAA;AAAA,YACN,WAAA,EAAY,yDAAA;AAAA,YACZ,KAAA,EAAO,IAAA;AAAA,YACP,QAAA,EAAU,YAAA;AAAA,YACV,cAAc,MAAM;AAClB,cAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,cAAA,IAAI,SAAS,UAAA,EAAY,GAAA,CAAI,EAAE,YAAA,EAAc,MAAM,CAAA;AACnD,cAAA,YAAA,CAAa,IAAI,CAAA;AAAA,YACnB,CAAA;AAAA,YACA,WAAA,EAAY,qBAAA;AAAA,YACZ,QAAA,EAAU;AAAA;AAAA;AACZ;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;ACnFO,SAAS,WAAA,CAA8B;AAAA,EAC5C,KAAA;AAAA,EAAO,OAAA;AAAA,EAAS,KAAA;AAAA,EAAO,QAAA;AAAA,EAAU;AACnC,CAAA,EAAwB;AACtB,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EAAiB,IAAA,EAAK,YAAA,EAAa,YAAA,EAAY,KAAA,EAC3D,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AACvB,IAAA,MAAM,MAAA,GAAS,UAAU,MAAA,CAAO,KAAA;AAChC,IAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,IAAA,uBACEC,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAK,OAAA;AAAA,QACL,cAAA,EAAc,MAAA;AAAA,QACd,QAAA;AAAA,QACA,OAAA,EAAS,MAAM,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA;AAAA,QACpC,SAAA,EAAW,mFACT,MAAA,GAAS,6BAAA,GAAgC,iCAC3C,CAAA,CAAA,EAAI,QAAA,GAAW,eAAe,EAAE,CAAA,CAAA;AAAA,QAEhC,QAAA,EAAA;AAAA,0BAAAD,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,aAAA,EAAW,IAAA;AAAA,cACX,SAAA,EAAW,CAAA,6EAAA,EACT,MAAA,GAAS,gBAAA,GAAmB,4BAC9B,CAAA,CAAA;AAAA,cAEC,QAAA,EAAA,MAAA,oBAAUA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,iCAAA,EAAkC;AAAA;AAAA,WAC/D;AAAA,0BACAC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EACd,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6CAAA,EACb,QAAA,EAAA;AAAA,cAAA,IAAA,oBAAQD,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAAyC,CAAA;AAAA,cACjE,MAAA,CAAO;AAAA,aAAA,EACV,CAAA;AAAA,4BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAAA,EAA8C,iBAAO,WAAA,EAAY;AAAA,WAAA,EACnF;AAAA;AAAA,OAAA;AAAA,MAxBK,MAAA,CAAO;AAAA,KAyBd;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ;ACpCA,SAAS,WAAW,GAAA,EAA4B;AAC9C,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,WAAA,EAAa,EAAE,CAAA,CAAE,OAAA,CAAQ,KAAK,GAAG,CAAA;AAC7D,EAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,EAAK,EAAG,OAAO,IAAA;AAC5B,EAAA,MAAM,CAAA,GAAI,OAAO,OAAO,CAAA;AACxB,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA,IAAK,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA,GAAI,GAAA,GAAM,IAAA;AACpE;AAEA,IAAM,WAAA,GAAc,CAAC,CAAA,KACnB,CAAA,IAAK,IAAA,GAAO,EAAA,GAAK,MAAA,CAAO,CAAC,CAAA,CAAE,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAM7C,IAAM,cAAA,GAKD;AAAA,EACH;AAAA,IACE,KAAA,EAAO,KAAA;AAAA,IACP,KAAA,EAAO,6BAAA;AAAA,IACP,WAAA,EACE,oMAAA;AAAA,IACF,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,iCAAA;AAAA,IACP,WAAA,EACE,gMAAA;AAAA,IACF,IAAA,EAAM;AAAA;AAEV,CAAA;AAuBO,SAAS,gBAAA,CAAiB,EAAE,QAAA,EAAS,EAA0B;AAIpE,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAID,MAAAA,CAAM,SAAS,0BAA0B,CAAA;AAC7E,EAAAA,MAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,MAAM,OAAA,GAAU,MAAM,aAAA,CAAc,0BAAA,EAA4B,CAAA;AAChE,IAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,OAAO,CAAA;AAC7C,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,YAAA,EAAc,OAAO,CAAA;AAAA,EAC/D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,IAAA,GAAOA,MAAAA,CAAM,OAAA,CAAQ,MAAO,QAAA,GAAW,OAAA,CAAQ,QAAQ,CAAA,GAAIK,eAAAA,EAAgB,EAAI,CAAC,QAAQ,CAAC,CAAA;AAC/F,EAAA,MAAM,aAAaL,MAAAA,CAAM,OAAA;AAAA,IACvB,MAAM,mBAAA,CAAoB,QAAA,IAAYK,eAAe,CAAA;AAAA,IACrD,CAAC,QAAQ;AAAA,GACX;AAGA,EAAA,MAAM,aAAA,GAAgB,iBAAiB,QAAQ,CAAA;AAC/C,EAAA,MAAM,YAAY,OAAO,IAAA,CAAK,wBAAwB,UAAA,IAAc,OAAO,KAAK,sBAAA,KAA2B,UAAA;AAE3G,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIL,MAAAA,CAAM,SAAqC,IAAI,CAAA;AACrE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,MAAAA,CAAM,SAAgC,IAAI,CAAA;AACpE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,MAAAA,CAAM,SAAiC,IAAI,CAAA;AAC7E,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,MAAAA,CAAM,SAAS,SAAS,CAAA;AACtD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,MAAAA,CAAM,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,MAAAA,CAAM,SAAwB,IAAI,CAAA;AAC5D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,MAAAA,CAAM,SAAwB,IAAI,CAAA;AAMpE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,MAAAA,CAAM,SAAS,EAAE,CAAA;AACnD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,MAAAA,CAAM,SAAS,EAAE,CAAA;AACnD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,MAAAA,CAAM,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,MAAAA,CAAM,SAAS,KAAK,CAAA;AAElD,EAAA,MAAM,EAAE,YAAW,GAAIe,aAAAA,CAAc,EAAE,YAAA,EAAc,MAAA,EAAQ,aAAA,EAAe,KAAA,EAAO,CAAA;AACnF,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIf,MAAAA,CAAM,SAAkC,IAAI,CAAA;AAC5E,EAAA,MAAM,iBAAiBgB,2BAAAA,EAA4B;AACnD,EAAA,MAAM,cAAchB,MAAAA,CAAM,WAAA;AAAA,IACxB,CAAC,SAAA,KAAgC;AAC/B,MAAA,IAAI,cAAA,EAAgBiB,mBAAAA,CAAoB,SAAS,CAAA;AAAA,uBAChC,SAAS,CAAA;AAAA,IAC5B,CAAA;AAAA,IACA,CAAC,cAAc;AAAA,GACjB;AACA,EAAA,MAAM,WAAWjB,MAAAA,CAAM,OAAA;AAAA,IACrB,MAAA,CAAO,UAAA,IAAc,EAAC,EAAG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,KAAa,WAAA,IAAe,CAAA,CAAE,QAAA,KAAa,UAAU,CAAA;AAAA,IAC9F,CAAC,UAAU;AAAA,GACb;AAEA,EAAA,MAAM,oBAAoB,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,OAAO,CAAA;AAElE,EAAAA,MAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,KAAK,IAAA,CACF,mBAAA,EAAqB,CACrB,IAAA,CAAK,CAAC,QAAA,KAAa;AAClB,QAAA,IAAI,SAAA,EAAW;AACf,QAAA,MAAA,CAAO,QAAQ,CAAA;AACf,QAAA,YAAA,CAAa,WAAA,CAAY,QAAA,EAAU,QAAA,IAAY,CAAC,CAAC,CAAA;AACjD,QAAA,YAAA,CAAa,WAAA,CAAY,QAAA,EAAU,SAAS,CAAC,CAAA;AAAA,MAC/C,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,CAAA,KAAM;AAAE,QAAA,IAAI,CAAC,SAAA,EAAW,YAAA,CAAa,YAAA,CAAa,CAAC,CAAC,CAAA;AAAA,MAAE,CAAC,CAAA,CAC9D,OAAA,CAAQ,MAAM;AAAE,QAAA,IAAI,CAAC,SAAA,EAAW,UAAA,CAAW,KAAK,CAAA;AAAA,MAAE,CAAC,CAAA;AAAA,IACxD;AACA,IAAA,KAAK,IAAA,CAAK,iBAAA,IAAoB,CAC3B,IAAA,CAAK,CAAC,IAAA,KAAS;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,QAAA,CAAS,IAAI,CAAA;AAAA,IAAE,CAAC,CAAA,CACjD,KAAA,CAAM,MAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,QAAA,CAAS,EAAE,CAAA;AAAA,IAAE,CAAC,CAAA;AAC/C,IAAA,KAAK,IAAA,CAAK,kBAAA,IAAqB,CAC5B,IAAA,CAAK,CAAC,IAAA,KAAS;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,YAAA,CAAa,IAAI,CAAA;AAAA,IAAE,CAAC,CAAA,CACrD,KAAA,CAAM,MAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,YAAA,CAAa,EAAE,CAAA;AAAA,IAAE,CAAC,CAAA;AACnD,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAK,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,IAAA,EAAM,SAAS,CAAC,CAAA;AAEpB,EAAA,MAAM,OAAOA,MAAAA,CAAM,WAAA;AAAA,IACjB,CAAC,KAAA,KAAwC;AACvC,MAAA,IAAI,CAAC,SAAA,EAAW;AAChB,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,KAAK,IAAA,CACF,sBAAA,CAAwB,KAAK,CAAA,CAC7B,IAAA,CAAK,CAAC,KAAA,KAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAC7B,KAAA,CAAM,CAAC,CAAA,KAAM,QAAA,CAAS,YAAA,CAAa,CAAC,CAAC,CAAC,EACtC,OAAA,CAAQ,MAAM,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,IACnC,CAAA;AAAA,IACA,CAAC,MAAM,SAAS;AAAA,GAClB;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAM,MAAA,GAAS,WAAW,SAAS,CAAA;AAGnC,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,IAAA,EAAK,KAAM,KAAK,CAAA,GAAI,MAAA;AAC3C,IAAA,IAAI,QAAQ,IAAA,EAAM;AAAE,MAAA,UAAA,CAAW,IAAI,CAAA;AAAG,MAAA;AAAA,IAAO;AAC7C,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,YAAA,CAAa,WAAA,CAAY,IAAI,CAAC,CAAA;AAC9B,IAAA,IAAI,IAAA,MAAU,KAAK,QAAA,IAAY,CAAA,CAAA,OAAS,EAAE,QAAA,EAAU,MAAM,CAAA;AAAA,EAC5D,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AAGvB,IAAA,IAAI,SAAA,CAAU,IAAA,EAAK,KAAM,EAAA,EAAI;AAC3B,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA,IAAI,KAAK,SAAA,IAAa,IAAA,OAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AACpD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,WAAW,SAAS,CAAA;AACnC,IAAA,IAAI,UAAU,IAAA,EAAM;AAAE,MAAA,UAAA,CAAW,IAAI,CAAA;AAAG,MAAA;AAAA,IAAO;AAC/C,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,YAAA,CAAa,WAAA,CAAY,MAAM,CAAC,CAAA;AAChC,IAAA,IAAI,WAAW,GAAA,EAAK,SAAA,OAAgB,EAAE,SAAA,EAAW,QAAQ,CAAA;AAAA,EAC3D,CAAA;AAGA,EAAA,MAAM,WAAA,GAAA,CAAe,KAAA,IAAS,EAAC,EAAG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,IAAU,CAAC,CAAA,CAAE,QAAQ,CAAA;AACvE,EAAA,MAAM,aAAA,GAAA,CAAiB,KAAA,IAAS,EAAC,EAAG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,QAAQ,CAAA;AAExE,EAAA,MAAM,WAAA,GAAc,aAAA,CAAc,KAAA,CAAM,aAAA,KAAkB,KAAA;AAI1D,EAAA,MAAM,WAAA,GAAA,CAAe,SAAA,IAAa,EAAC,EAAG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,QAAA,IAAY,CAAA,CAAE,WAAA,KAAgB,KAAK,CAAA;AACpG,EAAA,MAAM,SAAA,GAAY,YAAY,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,UAAU,GAAG,UAAA,IAAc,IAAA;AAIvE,EAAA,MAAM,cAAA,GAAiB,UAAA,GACnB,UAAA,CAAW,IAAA,CAAK,CAAC,cAAc,SAAA,CAAU,EAAA,KAAO,UAAU,CAAA,IAAK,IAAA,GAC/D,IAAA;AACJ,EAAA,IAAI,cAAA,EAAgB;AAElB,IAAA,uBACEC,GAAAA;AAAA,MAACiB,gBAAAA;AAAA,MAAA;AAAA,QACC,QAAA,EAAU,cAAA;AAAA,QACV,QAAA,EAAU,oBAAA,CAAqB,cAAA,CAAe,EAAE;AAAA;AAAA,KAClD;AAAA,EAEJ;AAEA,EAAA,uBACEhB,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA;AAAA,IAAA,SAAA,oBACCA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sEAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sDAAA,EACX,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAACS,aAAAA,EAAA,EAAc,SAAA,EAAU,kBAAA,EAAmB,CAAA;AAAA,QAAE;AAAA,OAAA,EAEhD,CAAA;AAAA,sBACAT,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8BAA6B,QAAA,EAAA,oKAAA,EAG1C,CAAA;AAAA,sBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAsC,QAAA,EAAA,SAAA,EAAU;AAAA,KAAA,EAC/D,CAAA;AAAA,IAED,CAAC,SAAA,mBACAC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kEAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wEAAA,EACX,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAACS,aAAAA,EAAA,EAAc,SAAA,EAAU,kBAAA,EAAmB,CAAA;AAAA,QAAE;AAAA,OAAA,EAEhD,CAAA;AAAA,sBACAR,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4BAAA,EAA6B,QAAA,EAAA;AAAA,QAAA,oDAAA;AAAA,wBACOD,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,qBAAA,EAAmB,CAAA;AAAA,QAAO;AAAA,OAAA,EACjF;AAAA,KAAA,EACF,oBAEAC,IAAAA;AAAA,MAACU,aAAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,eAAA;AAAA,QACN,WAAA,EAAY,oHAAA;AAAA,QAEZ,QAAA,EAAA;AAAA,0BAAAX,GAAAA;AAAA,YAACkB,OAAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,iBAAA;AAAA,cACN,WAAA,EAAY,2CAAA;AAAA,cACZ,KAAA,EAAO,SAAA;AAAA,cACP,QAAA,EAAU,YAAA;AAAA,cACV,YAAA,EAAc,UAAA;AAAA,cACd,WAAA,EAAY,MAAA;AAAA,cACZ,OAAA,EAAS,OAAA;AAAA,cACT,IAAA,EAAM,UAAU,yCAAA,GAA4C,MAAA;AAAA,cAC5D,QAAA,EAAU;AAAA;AAAA,WACZ;AAAA,0BACAlB,GAAAA;AAAA,YAACkB,OAAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,0BAAA;AAAA,cACN,WAAA,EAAY,iHAAA;AAAA,cACZ,KAAA,EAAO,SAAA;AAAA,cACP,QAAA,EAAU,YAAA;AAAA,cACV,YAAA,EAAc,UAAA;AAAA,cACd,WAAA,EAAY,WAAA;AAAA,cACZ,OAAA,EAAS,OAAA;AAAA,cACT,IAAA,EAAM,UAAU,4CAAA,GAA+C,MAAA;AAAA,cAC/D,QAAA,EAAU;AAAA;AAAA;AACZ;AAAA;AAAA,KACF;AAAA,oBAGFjB,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,0BAAA,EAAqB,CAAA;AAAA,wBAC3DA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4CAA2C,QAAA,EAAA,uQAAA,EAIxD;AAAA,OAAA,EACF,CAAA;AAAA,sBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CACb,QAAA,kBAAAC,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UAGL,SAAS,MAAM;AACb,YAAA,MAAA,CAAO,SAAS,IAAA,GAAO,WAAA,CAAY,MAAA,KAAW,CAAA,IAAK,YAAY,CAAC,CAAA,GAC5D,kBAAA,CAAmB,kBAAA,EAAoB,YAAY,CAAC,CAAA,CAAE,EAAE,CAAA,GACxD,qBAAqB,kBAAkB,CAAA;AAAA,UAC7C,CAAA;AAAA,UACA,SAAA,EAAU,iDAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,wCAAA,EAAyC,CAAA;AAAA,4BAC9DC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EACd,QAAA,EAAA;AAAA,8BAAAD,GAAAA,CAAC,UAAK,SAAA,EAAU,2BAAA,EACb,uBAAa,IAAA,GACV,yBAAA,GACA,YAAY,MAAA,KAAW,CAAA,GACrB,kCACA,WAAA,CAAY,MAAA,KAAW,IACrB,WAAA,CAAY,CAAC,EAAG,IAAA,GAChB,CAAA,EAAG,WAAA,CAAY,MAAM,CAAA,mBAAA,CAAA,EAC/B,CAAA;AAAA,8BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAAA,EACb,QAAA,EAAA,SAAA,IAAa,IAAA,GACV,GAAA,GACA,WAAA,CAAY,MAAA,KAAW,CAAA,GACrB,2CAAA,GACA,WAAA,CAAY,MAAM,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,eAAA,CAAgB,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,UAAK,CAAA,EACzE;AAAA,aAAA,EACF,CAAA;AAAA,4BACAA,GAAAA,CAACmB,UAAAA,EAAA,EAAW,WAAU,wCAAA,EAAyC;AAAA;AAAA;AAAA,OACjE,EACF,CAAA;AAAA,MAIC,WAAA,IAAe,SAAA,IAAa,IAAA,IAAQ,WAAA,CAAY,MAAA,GAAS,CAAA,IAAK,CAAC,SAAA,oBAC9DlB,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8FAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAACS,aAAAA,EAAA,EAAc,SAAA,EAAU,4CAAA,EAA6C,CAAA;AAAA,wBACtET,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,iJAAA,EAGxC;AAAA,OAAA,EACF;AAAA,KAAA,EAEJ,CAAA;AAAA,oBAEAC,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,wBACtDA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4CAA2C,QAAA,EAAA,8VAAA,EAKxD;AAAA,OAAA,EACF,CAAA;AAAA,sBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CACb,QAAA,kBAAAC,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAS,MAAM;AAAE,YAAA,MAAA,CAAO,QAAA,CAAS,IAAA,GAAO,oBAAA,CAAqB,uBAAuB,CAAA;AAAA,UAAE,CAAA;AAAA,UACtF,SAAA,EAAU,iDAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,wCAAA,EAAyC,CAAA;AAAA,4BAC3DC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EACd,QAAA,EAAA;AAAA,8BAAAD,GAAAA,CAAC,UAAK,SAAA,EAAU,2BAAA,EACb,mBAAS,IAAA,GACN,wBAAA,GACA,YAAY,MAAA,KAAW,CAAA,GACrB,uBACA,CAAA,EAAG,WAAA,CAAY,MAAM,CAAA,CAAA,EAAI,WAAA,CAAY,WAAW,CAAA,GAAI,YAAA,GAAe,cAAc,CAAA,CAAA,EACzF,CAAA;AAAA,8BACAC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAAA,EACb,QAAA,EAAA;AAAA,gBAAA,WAAA,CAAY,MAAA,KAAW,CAAA,GACpB,8CAAA,GACA,WAAA,CAAY,MAAM,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CAAE,KAAK,QAAK,CAAA;AAAA,gBACxD,YAAY,MAAA,GAAS,CAAA,IAAK,CAAA,GAAA,EAAM,WAAA,CAAY,SAAS,CAAC,CAAA,KAAA,CAAA;AAAA,gBACtD,cAAc,MAAA,GAAS,CAAA,oBACtBA,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,6CAAA,EACb,QAAA,EAAA;AAAA,kBAAA,aAAA,CAAc,MAAA,KAAW,CAAA,GACtB,sBAAA,GACA,CAAA,EAAG,cAAc,MAAM,CAAA,qBAAA,CAAA;AAAA,kBAC1B,UAAA;AAAA,kBACA,aAAA,CAAc,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,QAAK;AAAA,iBAAA,EAC1D;AAAA,eAAA,EAEJ;AAAA,aAAA,EACF,CAAA;AAAA,4BACAD,GAAAA,CAACmB,UAAAA,EAAA,EAAW,WAAU,wCAAA,EAAyC;AAAA;AAAA;AAAA,OACjE,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAnB,IAAC,gBAAA,EAAA,EAAiB,CAAA;AAAA,IAEjB,aAAA,CAAc,SAAA,oBACbC,IAAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,sBAAA,EAAoB,CAAA;AAAA,wBAC1DA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4CAA2C,QAAA,EAAA,wRAAA,EAIxD;AAAA,OAAA,EACF,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,sBAAA;AAAA,UACN,OAAA,EAAS,cAAA;AAAA,UACT,KAAA,EAAO,cAAc,SAAA,GAAY,KAAA;AAAA,UACjC,QAAA,EAAU,CAAC,MAAA,KAAW,aAAA,CAAc,IAAI,EAAE,aAAA,EAAe,MAAA,KAAW,SAAA,EAAW,CAAA;AAAA,UAC/E,UAAU,aAAA,CAAc;AAAA;AAAA,OAC1B;AAAA,MAGC,CAAC,WAAA,IAAe,iBAAA,oBACfC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8FAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAACS,aAAAA,EAAA,EAAc,SAAA,EAAU,4CAAA,EAA6C,CAAA;AAAA,wBACtET,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,gNAAA,EAIxC;AAAA,OAAA,EACF;AAAA,KAAA,EAEJ,CAAA;AAAA,IAGD,QAAA,CAAS,SAAS,CAAA,oBACjBC,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,WAAA,GAAc,MAAA,GAAY,YAAA,EACxC,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,wBACtDA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4CAA2C,QAAA,EAAA,6SAAA,EAKxD,CAAA;AAAA,QACC,CAAC,iBAAA,oBACAA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0CAAyC,QAAA,EAAA,uJAAA,EAGtD;AAAA,OAAA,EAEJ,CAAA;AAAA,sBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EACb,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,UAAA,EACX,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,SAAA,qBACbA,GAAAA,CAAC,YAAA,EAAA,EAAgC,SAAA,EAAsB,MAAA,EAAQ,eAA5C,SAAA,CAAU,EAA+C,CAC7E,CAAA,EACH,CAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAGFA,GAAAA,CAAC,gBAAA,EAAA,EAAiB,QAAA,EAAU,eAAe,QAAA,EAAoB,CAAA;AAAA,oBAE/DA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sEAAA,EACZ,kCACCC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAAA,EACd,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAACS,aAAAA,EAAA,EAAc,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,MAAE,iCAAA;AAAA,MACxB;AAAA,KAAA,EAC5B,CAAA,GACE,MAAA,mBACFR,IAAAA,CAAAmB,UAAA,EACE,QAAA,EAAA;AAAA,sBAAApB,GAAAA,CAACU,OAAAA,EAAA,EAAQ,SAAA,EAAU,mCAAA,EAAoC,CAAA;AAAA,MAAE;AAAA,KAAA,EAE3D,IAEA,qDAAA,EAEJ,CAAA;AAAA,oBAEAV,GAAAA;AAAA,MAACqB,eAAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,QAAA;AAAA,QACX,IAAA,EAAM,CAAC,CAAC,QAAA;AAAA,QACR,YAAA,EAAc,CAAC,IAAA,KAAS;AAAE,UAAA,IAAI,CAAC,IAAA,EAAM,WAAA,CAAY,IAAI,CAAA;AAAA,QAAE;AAAA;AAAA;AACzD,GAAA,EACF,CAAA;AAEJ;ACncA,IAAM,QAAA,GAAiF;AAAA,EACrF;AAAA,IACE,KAAA,EAAO,YAAA;AAAA,IACP,KAAA,EAAO,6CAAA;AAAA,IACP,WAAA,EACE;AAAA,GACJ;AAAA,EACA;AAAA,IACE,KAAA,EAAO,QAAA;AAAA,IACP,KAAA,EAAO,2CAAA;AAAA,IACP,WAAA,EACE;AAAA,GACJ;AAAA,EACA;AAAA,IACE,KAAA,EAAO,OAAA;AAAA,IACP,KAAA,EAAO,gCAAA;AAAA,IACP,WAAA,EAAa;AAAA;AAEjB,CAAA;AAkBO,SAAS,mBAAA,CAAoB,EAAE,QAAA,EAAS,EAA6B;AAC1E,EAAA,MAAM,WAAW,gBAAA,CAAiB,QAAA,EAAU,EAAE,WAAA,EAAa,SAAS,CAAA;AACpE,EAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAI,GAAI,QAAA;AACvB,EAAA,MAAM,OAAA,GAAkB,MAAM,WAAA,IAAe,OAAA;AAE7C,EAAA,uBACEpB,IAAAA,CAAC,aAAA,EAAA,EAAe,GAAG,QAAA,EACjB,QAAA,EAAA;AAAA,oBAAAD,GAAAA;AAAA,MAACW,aAAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,qBAAA;AAAA,QACN,WAAA,EAAY,gEAAA;AAAA,QAEZ,QAAA,kBAAAX,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,qBAAA;AAAA,YACN,OAAA,EAAS,QAAA;AAAA,YACT,KAAA,EAAO,OAAA;AAAA,YACP,UAAU,CAAC,WAAA,KAAgB,GAAA,CAAI,EAAE,aAAa;AAAA;AAAA;AAChD;AAAA,KACF;AAAA,oBAEAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wFAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,6BAAA,EAA8B,CAAA;AAAA,sBAC9CC,KAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,QAAA,8BAAA;AAAA,wBACwBD,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,eAAc,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,QAAS;AAAA,OAAA,EAG/E;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AC9DO,IAAM,yBAAA,GAA4B;AAkBlC,IAAM,8BAAA,GAAiC;AAsBvC,IAAM,qBAAA,GAA4C;AAAA,EACvD;AAAA,IACE,GAAA,EAAK,kBAAA;AAAA,IACL,KAAA,EAAO,eAAA;AAAA,IACP,WAAA,EAAa,0FAAA;AAAA,IACb,IAAA,EAAM,MAAA;AAAA,IACN,WAAA,EAAa,WAAA;AAAA,IACb,OAAA,EAAS,kBAAA;AAAA,IACT,WAAA,EAAa,mCAAA;AAAA,IACb,iBAAA,EAAmB;AAAA;AAEvB,CAAA;AAEA,IAAM,KAAA,GAAQ,sBAAsB,yBAAA,EAA2B;AAAA,EAC7D,QAAA,EAAU,qBAAA;AAAA,EACV,YAAA,EAAc,CAAC,UAAA,EAAY,WAAW;AACxC,CAAC,CAAA;AAED,SAAS,qBAAA,GAAwB;AAC/B,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIsB,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,KAAK,CAAA;AAE1C,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,KAAK,KAAA,CACF,GAAA,EAAI,CACJ,IAAA,CAAK,CAAC,CAAA,KAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,YAAA,CAAa,CAAC,CAAC,GAAG,MAAM,CAAA;AAAA,IAAE,CAAC,CAAA,CACzD,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA,CACd,OAAA,CAAQ,MAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,SAAA,CAAU,IAAI,CAAA;AAAA,IAAE,CAAC,CAAA;AACpD,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAK,CAAA;AAAA,EAClC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,SAAA,EAAW,OAAO,IAAA;AAElC,EAAA,uBACEtB,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDAAA,EACb,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,OAAE,QAAA,EAAA,qQAAA,EAIH,CAAA;AAAA,oBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,6LAAA,EAGH;AAAA,GAAA,EACF,CAAA;AAEJ;AAEO,IAAM,uBAAA,GAA+C;AAAA,EAC1D,EAAA,EAAI,yBAAA;AAAA,EACJ,YAAA,EAAc,MAAA;AAAA,EACd,IAAA,EAAM,cAAA;AAAA,EACN,WAAA,EACE,6HAAA;AAAA,EACF,IAAA,EAAM,OAAA;AAAA,EACN,QAAA,EAAU,WAAA;AAAA,EACV,QAAA,EAAU,OAAA;AAAA;AAAA;AAAA,EAGV,MAAA,EAAQ,CAAC,SAAA,EAAW,MAAM,CAAA;AAAA,EAC1B,SAAA,EAAW,UAAA;AAAA,EACX,OAAA,EAAS,iCAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,WAAA,EAAa;AAAA,IACX;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,OAAA;AAAA,MACV,OAAA,EAAS,CAAC,MAAM,CAAA;AAAA,MAChB,MAAA,EACE;AAAA,KACJ;AAAA,IACA;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,UAAA;AAAA,MACV,OAAA,EAAS,CAAC,OAAO,CAAA;AAAA,MACjB,MAAA,EAAQ;AAAA;AACV,GACF;AAAA,EACA,eAAA,EAAiB,8BAAA;AAAA;AAAA,EAEjB,SAAA,EAAW,SAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBX,YAAY,kBAAA,CAAmB,yBAAA,EAA2B,EAAE,QAAA,EAAU,eAAe,CAAA;AAAA,EACrF,QAAA,EAAU,qBAAA;AAAA;AAAA;AAAA,EAGV,SAAA,EAAW;AAAA,IACT;AAAA,MACE,GAAA,EAAK,8BAAA;AAAA,MACL,KAAA,EAAO,yDAAA;AAAA,MACP,OAAA,EAAS,CAAC,OAAO;AAAA,KACnB;AAAA,IACA;AAAA,MACE,GAAA,EAAK,2BAAA;AAAA,MACL,KAAA,EAAO,uEAAA;AAAA,MACP,KAAA,EAAO,MAAA;AAAA,MACP,OAAA,EAAS,UAAA;AAAA,MACT,OAAA,EAAS,CAAC,OAAA,EAAS,UAAU;AAAA;AAC/B,GACF;AAAA;AAAA,EAEA,GAAG,gBAAA;AAAA,IACD,yBAAA;AAAA,IACA,CAAC,UAAA,MAAgB;AAAA,MACf,SAAA,EAAW,CAAC,CAAC,UAAA,EAAY,MAAA;AAAA,MACzB,MAAA,EAAS,UAAA,EAAY,QAAA,EAAU,gBAAA,IAA+B,MAAA;AAAA,MAC9D,KAAA,EAAO,SAAA;AAAA,MACP,GAAG,cAAA,CAAe,qBAAA,EAAuB,UAAU;AAAA,KACrD,CAAA;AAAA,IACA,EAAE,KAAA,EAAO,MAAM,KAAA;AAAM,GACvB;AAAA,EACA,GAAG,mBAAmB,KAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAU3B,gBAAgB,YAAY;AAC1B,IAAA,MAAM,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,MAAM,CAAA;AAAA,EACnC,CAAA;AAAA,EACA,UAAA,EAAY,MAAM,KAAA,CAAM,UAAA,EAAW;AAAA,EACnC,UAAA,EAAY;AACd;ACzLO,IAAM,mBAAA,GAAsB;AAS5B,IAAM,wBAAA,GAA2B;AAiBjC,IAAM,eAAA,GAAsC;AAAA,EACjD;AAAA,IACE,GAAA,EAAK,SAAA;AAAA,IACL,KAAA,EAAO,qBAAA;AAAA,IACP,WAAA,EAAa,4CAAA;AAAA,IACb,IAAA,EAAM,cAAA;AAAA,IACN,OAAA,EAAS;AAAA,MACP,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,MAC7B,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,MACnC,EAAE,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,yBAAA;AAAoB,KACrD;AAAA,IACA,iBAAA,EAAmB;AAAA;AAEvB,CAAA;AAEA,IAAMwB,MAAAA,GAAQC,sBAAsB,mBAAA,EAAqB;AAAA,EACvD,QAAA,EAAU,eAAA;AAAA,EACV,YAAA,EAAc,CAAC,iBAAA,EAAmB,aAAa;AACjD,CAAC,CAAA;AAED,IAAM,gBAAwC,EAAE,GAAA,EAAK,OAAO,MAAA,EAAQ,QAAA,EAAU,aAAa,WAAA,EAAS;AAGpG,SAAS,cAAc,KAAA,EAAoC;AACzD,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,GAAG,IAAI,EAAC;AAC5F,EAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,aAAA,CAAc,OAAO,CAAC,CAAA,CAAE,MAAM,CAAA,IAAK,OAAO,CAAC,CAAA,CAAE,MAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AAClG,EAAA,OAAO,OAAO,MAAA,GAAS,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,GAAI,MAAA;AACjD;AAEA,SAAS,gBAAA,GAAmB;AAC1B,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIH,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,KAAK,CAAA;AAE1C,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,KAAKC,MAAAA,CACF,GAAA,EAAI,CACJ,IAAA,CAAK,CAAC,CAAA,KAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,YAAA,CAAa,CAAC,CAAC,GAAG,MAAM,CAAA;AAAA,IAAE,CAAC,CAAA,CACzD,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA,CACd,OAAA,CAAQ,MAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,SAAA,CAAU,IAAI,CAAA;AAAA,IAAE,CAAC,CAAA;AACpD,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAK,CAAA;AAAA,EAClC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,SAAA,EAAW,OAAO,IAAA;AAElC,EAAA,uBACEvB,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDAAA,EACb,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,OAAE,QAAA,EAAA,8PAAA,EAIH,CAAA;AAAA,oBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,4LAAA,EAGH;AAAA,GAAA,EACF,CAAA;AAEJ;AAEO,IAAM,kBAAA,GAA0C;AAAA,EACrD,EAAA,EAAI,mBAAA;AAAA,EACJ,YAAA,EAAc,MAAA;AAAA,EACd,IAAA,EAAM,QAAA;AAAA,EACN,WAAA,EAAa,8FAAA;AAAA,EACb,IAAA,EAAM,YAAA;AAAA,EACN,QAAA,EAAU,UAAA;AAAA,EACV,QAAA,EAAU,OAAA;AAAA;AAAA;AAAA,EAGV,MAAA,EAAQ,CAAC,SAAA,EAAW,MAAM,CAAA;AAAA,EAC1B,SAAA,EAAW,UAAA;AAAA,EACX,OAAA,EAAS,4BAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,WAAA,EAAa;AAAA,IACX;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,OAAA;AAAA,MACV,OAAA,EAAS,CAAC,MAAM,CAAA;AAAA,MAChB,MAAA,EACE,iIAAA;AAAA,MACF,SAAA,EAAW;AAAA,KACb;AAAA,IACA;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,SAAA;AAAA,MACV,OAAA,EAAS,CAAC,OAAO,CAAA;AAAA,MACjB,MAAA,EAAQ,wHAAA;AAAA,MACR,SAAA,EAAW;AAAA;AACb,GACF;AAAA,EACA,eAAA,EAAiB,wBAAA;AAAA;AAAA,EAEjB,SAAA,EAAW,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBX,QAAQ,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBT,UAAA,EAAY0B,mBAAmB,mBAAmB,CAAA;AAAA,EAClD,QAAA,EAAU,eAAA;AAAA;AAAA;AAAA,EAGV,SAAA,EAAW;AAAA,IACT;AAAA,MACE,GAAA,EAAK,4BAAA;AAAA,MACL,KAAA,EAAO,8FAAA;AAAA,MACP,OAAA,EAAS,CAAC,OAAA,EAAS,SAAS;AAAA,KAC9B;AAAA,IACA;AAAA,MACE,GAAA,EAAK,sBAAA;AAAA,MACL,KAAA,EAAO,8DAAA;AAAA,MACP,KAAA,EAAO,MAAA;AAAA,MACP,OAAA,EAAS,SAAA;AAAA,MACT,OAAA,EAAS,CAAC,SAAS;AAAA;AACrB,GACF;AAAA;AAAA;AAAA,EAGA,GAAGC,gBAAAA;AAAA,IACD,mBAAA;AAAA,IACA,CAAC,UAAA,MAAgB;AAAA,MACf,SAAA,EAAW,CAAC,CAAC,UAAA,EAAY,MAAA;AAAA,MACzB,MAAA,EAAQ,aAAA,CAAc,UAAA,EAAY,QAAA,EAAU,OAAO,CAAA;AAAA,MACnD,KAAA,EAAO,SAAA;AAAA,MACP,GAAGC,cAAAA,CAAe,eAAA,EAAiB,UAAU;AAAA,KAC/C,CAAA;AAAA,IACA,EAAE,KAAA,EAAO,MAAMJ,MAAAA;AAAM,GACvB;AAAA,EACA,GAAGK,mBAAmBL,MAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAK3B,gBAAgB,YAAY;AAC1B,IAAA,MAAMA,MAAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,MAAM,CAAA;AAAA,EACnC,CAAA;AAAA,EACA,UAAA,EAAY,MAAMA,MAAAA,CAAM,UAAA,EAAW;AAAA,EACnC,UAAA,EAAY;AACd;ACrMO,IAAM,uBAAA,GAA0B;AAYhC,IAAM,4BAAA,GAA+B;AAcrC,IAAM,iBAAA,GAAsC;AAAA,EACjD;AAAA,IACE,GAAA,EAAK,QAAA;AAAA,IACL,KAAA,EAAO,cAAA;AAAA,IACP,IAAA,EAAM,UAAA;AAAA,IACN,MAAA,EAAQ,IAAA;AAAA,IACR,WAAA,EAAa;AAAA;AAEjB,CAAA;AAcO,IAAM,mBAAA,GAA0C;AAAA,EACrD;AAAA,IACE,GAAA,EAAK,SAAA;AAAA,IACL,KAAA,EAAO,qBAAA;AAAA,IACP,WAAA,EAAa,4CAAA;AAAA,IACb,IAAA,EAAM,cAAA;AAAA,IACN,OAAA,EAAS;AAAA,MACP,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,MAC7B,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,MACnC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,yBAAA;AAAoB,KAC9C;AAAA,IACA,iBAAA,EAAmB;AAAA;AAEvB,CAAA;AAEA,IAAMA,MAAAA,GAAQC,sBAAsB,uBAAA,EAAyB;AAAA,EAC3D,MAAA,EAAQ,iBAAA;AAAA,EACR,QAAA,EAAU;AACZ,CAAC,CAAA;AAED,IAAMK,iBAAwC,EAAE,GAAA,EAAK,OAAO,MAAA,EAAQ,QAAA,EAAU,MAAM,WAAA,EAAS;AAG7F,SAASC,eAAc,KAAA,EAAoC;AACzD,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,GAAG,IAAI,EAAC;AAC5F,EAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAMD,cAAAA,CAAc,OAAO,CAAC,CAAA,CAAE,MAAM,CAAA,IAAK,OAAO,CAAC,CAAA,CAAE,MAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AAClG,EAAA,OAAO,OAAO,MAAA,GAAS,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,GAAI,MAAA;AACjD;AAEA,SAAS,oBAAA,GAAuB;AAC9B,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIR,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,KAAK,CAAA;AAE1C,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,KAAKC,MAAAA,CACF,GAAA,EAAI,CACJ,IAAA,CAAK,CAAC,CAAA,KAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,YAAA,CAAa,CAAC,CAAC,GAAG,MAAM,CAAA;AAAA,IAAE,CAAC,CAAA,CACzD,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA,CACd,OAAA,CAAQ,MAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,SAAA,CAAU,IAAI,CAAA;AAAA,IAAE,CAAC,CAAA;AACpD,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAK,CAAA;AAAA,EAClC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,SAAA,EAAW,OAAO,IAAA;AAElC,EAAA,uBACEvB,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDAAA,EACb,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,OAAE,QAAA,EAAA,iQAAA,EAIH,CAAA;AAAA,oBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,4QAAA,EAIH,CAAA;AAAA,oBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,4LAAA,EAGH;AAAA,GAAA,EACF,CAAA;AAEJ;AAEO,IAAM,sBAAA,GAA8C;AAAA,EACzD,EAAA,EAAI,uBAAA;AAAA,EACJ,YAAA,EAAc,MAAA;AAAA,EACd,IAAA,EAAM,YAAA;AAAA,EACN,WAAA,EAAa,wGAAA;AAAA,EACb,IAAA,EAAM,YAAA;AAAA,EACN,QAAA,EAAU,UAAA;AAAA;AAAA;AAAA;AAAA,EAIV,QAAA,EAAU,SAAA;AAAA;AAAA;AAAA,EAGV,MAAA,EAAQ,CAAC,SAAA,EAAW,MAAM,CAAA;AAAA,EAC1B,SAAA,EAAW,UAAA;AAAA,EACX,OAAA,EAAS,6BAAA;AAAA;AAAA;AAAA;AAAA,EAIT,eAAA,EAAiB,EAAE,GAAA,EAAK,4BAAA,EAA6B;AAAA;AAAA;AAAA;AAAA;AAAA,EAKrD,WAAA,EAAa;AAAA,IACX;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,OAAA;AAAA,MACV,OAAA,EAAS,CAAC,MAAM,CAAA;AAAA,MAChB,MAAA,EACE,iIAAA;AAAA,MACF,SAAA,EAAW;AAAA,KACb;AAAA,IACA;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,SAAA;AAAA,MACV,OAAA,EAAS,CAAC,OAAO,CAAA;AAAA,MACjB,MAAA,EAAQ,wHAAA;AAAA,MACR,SAAA,EAAW;AAAA;AACb,GACF;AAAA,EACA,eAAA,EAAiB,4BAAA;AAAA;AAAA;AAAA;AAAA,EAIjB,SAAA,EAAW,OAAA;AAAA,EACX,MAAA,EAAQ,iBAAA;AAAA,EACR,QAAA,EAAU,mBAAA;AAAA;AAAA;AAAA;AAAA,EAIV,SAAA,EAAW;AAAA,IACT;AAAA,MACE,GAAA,EAAK,4BAAA;AAAA,MACL,KAAA,EAAO,kGAAA;AAAA,MACP,OAAA,EAAS,CAAC,OAAA,EAAS,SAAS;AAAA,KAC9B;AAAA,IACA;AAAA,MACE,GAAA,EAAK,sBAAA;AAAA,MACL,KAAA,EAAO,kEAAA;AAAA,MACP,KAAA,EAAO,MAAA;AAAA,MACP,OAAA,EAAS,SAAA;AAAA,MACT,OAAA,EAAS,CAAC,SAAS;AAAA;AACrB,GACF;AAAA;AAAA;AAAA,EAGA,GAAG2B,gBAAAA;AAAA,IACD,uBAAA;AAAA,IACA,CAAC,UAAA,MAAgB;AAAA,MACf,SAAA,EAAW,CAAC,CAAC,UAAA,EAAY,MAAA;AAAA,MACzB,MAAA,EAAQI,cAAAA,CAAc,UAAA,EAAY,QAAA,EAAU,OAAO,CAAA;AAAA,MACnD,KAAA,EAAO,SAAA;AAAA,MACP,GAAGH,cAAAA,CAAe,mBAAA,EAAqB,UAAU;AAAA,KACnD,CAAA;AAAA,IACA,EAAE,KAAA,EAAO,MAAMJ,MAAAA;AAAM,GACvB;AAAA,EACA,GAAGK,mBAAmBL,MAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS3B,gBAAgB,YAAY;AAC1B,IAAA,MAAMA,MAAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,MAAM,CAAA;AAAA,EACnC,CAAA;AAAA,EACA,UAAA,EAAY,MAAMA,MAAAA,CAAM,UAAA,EAAW;AAAA,EACnC,UAAA,EAAY;AACd;AC9NO,IAAM,2BAAA,GAA8B;AAOpC,IAAM,gCAAA,GAAmC;AAQzC,IAAM,uBAAA,GAA8C;AAAA,EACzD;AAAA,IACE,GAAA,EAAK,gBAAA;AAAA,IACL,KAAA,EAAO,qBAAA;AAAA,IACP,WAAA,EAAa,4CAAA;AAAA,IACb,IAAA,EAAM,cAAA;AAAA,IACN,OAAA,EAAS;AAAA,MACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,yBAAA,EAAoB;AAAA,MAC5C,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,MAC7B,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA;AAAS,KACrC;AAAA,IACA,iBAAA,EAAmB,IAAA;AAAA;AAAA;AAAA;AAAA,IAInB,YAAA,EAAc,CAAC,MAAM;AAAA;AAEzB,CAAA;AAEA,IAAMA,MAAAA,GAAQC,sBAAsB,2BAAA,EAA6B;AAAA,EAC/D,QAAA,EAAU;AACZ,CAAC,CAAA;AAED,IAAMK,iBAAwC,EAAE,IAAA,EAAM,aAAU,GAAA,EAAK,KAAA,EAAO,QAAQ,QAAA,EAAS;AAE7F,SAASC,eAAc,KAAA,EAAoC;AACzD,EAAA,MAAM,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,QAAQ,EAAC;AAC7C,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAC,MAAMD,cAAAA,CAAc,MAAA,CAAO,CAAC,CAAC,KAAK,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,OAAO,OAAO,CAAA;AACpF,EAAA,OAAO,OAAO,MAAA,GAAS,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,GAAI,MAAA;AACjD;AAEA,SAAS,uBAAA,GAA0B;AACjC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIR,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,KAAK,CAAA;AAE1C,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,KAAKC,MAAAA,CACF,GAAA,EAAI,CACJ,IAAA,CAAK,CAAC,CAAA,KAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,YAAA,CAAa,CAAC,CAAC,GAAG,MAAM,CAAA;AAAA,IAAE,CAAC,CAAA,CACzD,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA,CACd,OAAA,CAAQ,MAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,SAAA,CAAU,IAAI,CAAA;AAAA,IAAE,CAAC,CAAA;AACpD,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAK,CAAA;AAAA,EAClC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,uBACExB,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yDACZ,QAAA,EAAA,SAAA,mBACCC,IAAAA,CAAAmB,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAApB,GAAAA,CAAC,OAAE,QAAA,EAAA,0PAAA,EAIH,CAAA;AAAA,oBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,4IAAA,EAGH;AAAA,GAAA,EACF,CAAA,mBAEAA,GAAAA,CAAC,GAAA,EAAA,EAAE,iMAGH,CAAA,EAEJ,CAAA;AAEJ;AAEO,IAAM,yBAAA,GAAiD;AAAA,EAC5D,EAAA,EAAI,2BAAA;AAAA;AAAA;AAAA;AAAA,EAIJ,WAAA,EAAa,QAAA;AAAA,EACb,YAAA,EAAc,MAAA;AAAA,EACd,IAAA,EAAM,QAAA;AAAA,EACN,WAAA,EAAa,sHAAA;AAAA,EACb,IAAA,EAAM,YAAA;AAAA,EACN,QAAA,EAAU,UAAA;AAAA;AAAA;AAAA,EAGV,QAAA,EAAU,OAAA;AAAA,EACV,MAAA,EAAQ,CAAC,SAAA,EAAW,MAAM,CAAA;AAAA,EAC1B,SAAA,EAAW,UAAA;AAAA,EACX,OAAA,EAAS,iCAAA;AAAA,EACT,WAAA,EAAa;AAAA,IACX;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,OAAA;AAAA,MACV,OAAA,EAAS,CAAC,MAAM,CAAA;AAAA,MAChB,MAAA,EACE,iIAAA;AAAA,MACF,SAAA,EAAW;AAAA,KACb;AAAA,IACA;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,SAAA;AAAA,MACV,OAAA,EAAS,CAAC,OAAO,CAAA;AAAA,MACjB,MAAA,EAAQ,wHAAA;AAAA,MACR,SAAA,EAAW;AAAA;AACb,GACF;AAAA,EACA,eAAA,EAAiB,gCAAA;AAAA;AAAA;AAAA,EAGjB,SAAA,EAAW,OAAA;AAAA;AAAA,EAEX,QAAQ,EAAC;AAAA,EACT,QAAA,EAAU,uBAAA;AAAA,EACV,SAAA,EAAW;AAAA,IACT;AAAA,MACE,GAAA,EAAK,4BAAA;AAAA,MACL,KAAA,EAAO,iFAAA;AAAA,MACP,OAAA,EAAS,CAAC,OAAA,EAAS,SAAS;AAAA,KAC9B;AAAA,IACA;AAAA,MACE,GAAA,EAAK,sBAAA;AAAA,MACL,KAAA,EAAO,8DAAA;AAAA,MACP,KAAA,EAAO,MAAA;AAAA,MACP,OAAA,EAAS,SAAA;AAAA,MACT,OAAA,EAAS,CAAC,SAAS;AAAA;AACrB,GACF;AAAA,EACA,GAAG2B,gBAAAA;AAAA,IACD,2BAAA;AAAA,IACA,CAAC,UAAA,MAAgB;AAAA,MACf,SAAA,EAAW,CAAC,CAAC,UAAA,EAAY,MAAA;AAAA,MACzB,MAAA,EAAQI,cAAAA,CAAc,UAAA,EAAY,QAAA,EAAU,cAAc,CAAA;AAAA,MAC1D,KAAA,EAAO,SAAA;AAAA,MACP,GAAGH,cAAAA,CAAe,uBAAA,EAAyB,UAAU;AAAA,KACvD,CAAA;AAAA,IACA,EAAE,KAAA,EAAO,MAAMJ,MAAAA;AAAM,GACvB;AAAA,EACA,GAAGK,mBAAmBL,MAAK,CAAA;AAAA,EAC3B,UAAA,EAAYE,mBAAmB,2BAA2B,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAK1D,gBAAgB,YAAY;AAC1B,IAAA,MAAMF,MAAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,MAAM,CAAA;AAAA,EACnC,CAAA;AAAA,EACA,YAAY,YAAY;AAAE,IAAA,MAAMA,OAAM,UAAA,EAAW;AAAA,EAAE,CAAA;AAAA,EACnD,UAAA,EAAY;AACd;ACxIO,IAAM,kBAAA,GAAqB;AAa3B,IAAM,uBAAA,GAA0B;AAiChC,IAAM,YAAA,GAAiC;AAAA,EAC5C;AAAA,IACE,GAAA,EAAK,cAAA;AAAA,IACL,KAAA,EAAO,gBAAA;AAAA,IACP,IAAA,EAAM,UAAA;AAAA,IACN,MAAA,EAAQ,IAAA;AAAA,IACR,WAAA,EAAa;AAAA;AAEjB,CAAA;AAcO,IAAM,yBAAA,GAA8C;AAAA,EACzD,GAAA,EAAK,aAAA;AAAA,EACL,KAAA,EAAO,UAAA;AAAA,EACP,WAAA,EAAa,oGAAA;AAAA,EACb,IAAA,EAAM,QAAA;AAAA,EACN,OAAA,EAAS;AAAA,IACP,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,iBAAA,EAAkB;AAAA,IAC7C,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,gBAAA;AAAW,GAC3C;AAAA,EACA,iBAAA,EAAmB;AACrB,CAAA;AAgBO,IAAM,cAAA,GAAqC;AAAA,EAChD,yBAAA;AAAA,EACA;AAAA,IACE,GAAA,EAAK,SAAA;AAAA,IACL,KAAA,EAAO,qBAAA;AAAA,IACP,WAAA,EAAa,4CAAA;AAAA,IACb,IAAA,EAAM,cAAA;AAAA,IACN,OAAA,EAAS;AAAA,MACP,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,KAAA,EAAM;AAAA,MAC5B,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,yBAAA,EAA0B;AAAA,MAChD,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,QAAA;AAAS,KAChC;AAAA,IACA,iBAAA,EAAmB;AAAA;AAEvB,CAAA;AAEA,IAAMA,MAAAA,GAAQC,sBAAsB,kBAAA,EAAoB;AAAA,EACtD,MAAA,EAAQ,YAAA;AAAA,EACR,QAAA,EAAU;AACZ,CAAC,CAAA;AAED,IAAMK,iBAAwC,EAAE,IAAA,EAAM,OAAO,IAAA,EAAM,SAAA,EAAW,KAAK,QAAA,EAAS;AAC5F,IAAM,kBAAA,GAA6C,EAAE,OAAA,EAAS,SAAA,EAAW,YAAY,gBAAA,EAAW;AAMhG,SAAS,iBAAiB,QAAA,EAAmE;AAC3F,EAAA,MAAM,cAAc,kBAAA,CAAmB,MAAA,CAAO,QAAA,EAAU,WAAA,IAAe,EAAE,CAAC,CAAA;AAC1E,EAAA,MAAM,MAAM,QAAA,EAAU,OAAA;AACtB,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GAAI,GAAA,GAAM,OAAO,GAAA,KAAQ,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,GAAG,IAAI,EAAC;AACpF,EAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAMA,cAAAA,CAAc,OAAO,CAAC,CAAA,CAAE,MAAM,CAAA,IAAK,OAAO,CAAC,CAAA,CAAE,MAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AAEnG,EAAA,MAAM,KAAA,GAAQ,CAAC,WAAA,EAAa,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,GAAI,IAAI,CAAA,CAAE,OAAO,OAAO,CAAA;AAC1F,EAAA,OAAO,MAAM,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,QAAK,CAAA,GAAI,MAAA;AAChD;AAEA,SAAS,eAAA,GAAkB;AACzB,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIR,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,KAAK,CAAA;AAE1C,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,KAAKC,MAAAA,CACF,GAAA,EAAI,CACJ,IAAA,CAAK,CAAC,CAAA,KAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,YAAA,CAAa,CAAC,CAAC,GAAG,MAAM,CAAA;AAAA,IAAE,CAAC,CAAA,CACzD,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA,CACd,OAAA,CAAQ,MAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,SAAA,CAAU,IAAI,CAAA;AAAA,IAAE,CAAC,CAAA;AACpD,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAK,CAAA;AAAA,EAClC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,uBACExB,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yDACZ,QAAA,EAAA,SAAA,mBACCC,IAAAA,CAAAmB,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAApB,GAAAA,CAAC,OAAE,QAAA,EAAA,8PAAA,EAIH,CAAA;AAAA,oBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,qPAAA,EAIH,CAAA;AAAA,oBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,4LAAA,EAGH;AAAA,GAAA,EACF,CAAA,mBAEAA,GAAAA,CAAC,GAAA,EAAA,EAAE,0NAGH,CAAA,EAEJ,CAAA;AAEJ;AAEO,IAAM,iBAAA,GAAyC;AAAA,EACpD,EAAA,EAAI,kBAAA;AAAA,EACJ,YAAA,EAAc,MAAA;AAAA,EACd,IAAA,EAAM,OAAA;AAAA,EACN,WAAA,EAAa,oGAAA;AAAA,EACb,IAAA,EAAM,YAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAON,OAAA,EAAS,6CAAA;AAAA,EACT,QAAA,EAAU,UAAA;AAAA;AAAA;AAAA;AAAA,EAIV,QAAA,EAAU,SAAA;AAAA;AAAA;AAAA,EAGV,MAAA,EAAQ,CAAC,SAAA,EAAW,MAAM,CAAA;AAAA,EAC1B,SAAA,EAAW,UAAA;AAAA,EACX,OAAA,EAAS,kCAAA;AAAA;AAAA;AAAA,EAGT,eAAA,EAAiB,EAAE,GAAA,EAAK,0BAAA,EAA2B;AAAA;AAAA;AAAA;AAAA;AAAA,EAKnD,WAAA,EAAa;AAAA,IACX;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,OAAA;AAAA,MACV,OAAA,EAAS,CAAC,MAAM,CAAA;AAAA,MAChB,MAAA,EACE,iIAAA;AAAA,MACF,SAAA,EAAW;AAAA,KACb;AAAA,IACA;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,SAAA;AAAA,MACV,OAAA,EAAS,CAAC,OAAO,CAAA;AAAA,MACjB,MAAA,EAAQ,wHAAA;AAAA,MACR,SAAA,EAAW;AAAA;AACb,GACF;AAAA,EACA,eAAA,EAAiB,uBAAA;AAAA;AAAA;AAAA;AAAA,EAIjB,SAAA,EAAW,OAAA;AAAA,EACX,MAAA,EAAQ,YAAA;AAAA,EACR,QAAA,EAAU,cAAA;AAAA,EACV,SAAA,EAAW;AAAA,IACT;AAAA,MACE,GAAA,EAAK,4BAAA;AAAA,MACL,KAAA,EAAO,kFAAA;AAAA,MACP,OAAA,EAAS,CAAC,OAAA,EAAS,SAAS;AAAA,KAC9B;AAAA,IACA;AAAA,MACE,GAAA,EAAK,sBAAA;AAAA,MACL,KAAA,EAAO,8FAAA;AAAA,MACP,KAAA,EAAO,MAAA;AAAA,MACP,OAAA,EAAS,SAAA;AAAA,MACT,OAAA,EAAS,CAAC,SAAS;AAAA;AACrB,GACF;AAAA;AAAA;AAAA,EAGA,GAAG2B,gBAAAA;AAAA,IACD,kBAAA;AAAA,IACA,CAAC,UAAA,MAAgB;AAAA,MACf,SAAA,EAAW,CAAC,CAAC,UAAA,EAAY,MAAA;AAAA,MACzB,MAAA,EAAQ,gBAAA,CAAiB,UAAA,EAAY,QAAQ,CAAA;AAAA,MAC7C,KAAA,EAAO,SAAA;AAAA,MACP,GAAGC,cAAAA,CAAe,cAAA,EAAgB,UAAU;AAAA,KAC9C,CAAA;AAAA,IACA,EAAE,KAAA,EAAO,MAAMJ,MAAAA;AAAM,GACvB;AAAA,EACA,GAAGK,mBAAmBL,MAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS3B,gBAAgB,YAAY;AAC1B,IAAA,MAAMA,MAAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,MAAM,CAAA;AAAA,EACnC,CAAA;AAAA,EACA,UAAA,EAAY,MAAMA,MAAAA,CAAM,UAAA,EAAW;AAAA,EACnC,UAAA,EAAY;AACd;AC9RA,IAAM,SAAA,GAAgD;AAAA,EACpD,YAAA,EAAc,EAAE,KAAA,EAAO,aAAA,EAAe,MAAM,KAAA,EAAO,IAAA,EAAM,0DAAA,EAAoD,WAAA,EAAa,2BAAA,EAA4B;AAAA,EACtJ,QAAA,EAAc,EAAE,KAAA,EAAO,UAAA,EAAe,MAAM,aAAA,EAAe,IAAA,EAAM,uCAAA,EAAyC,WAAA,EAAa,6BAAA,EAA8B;AAAA,EACrJ,SAAA,EAAc,EAAE,KAAA,EAAO,WAAA,EAAc,MAAM,MAAA,EAAQ,IAAA,EAAM,8BAAA,EAAgC,WAAA,EAAa,+BAAA,EAAgC;AAAA,EACtI,WAAA,EAAc,EAAE,KAAA,EAAO,aAAA,EAAe,MAAM,KAAA,EAAO,IAAA,EAAM,6BAAA,EAA+B,WAAA,EAAa,kCAAA,EAAmC;AAAA,EACxI,WAAA,EAAc,EAAE,KAAA,EAAO,aAAA,EAAe,MAAM,WAAA,EAAa,IAAA,EAAM,qCAAA,EAAkC,WAAA,EAAa,gBAAA,EAAY;AAAA,EAC1H,QAAA,EAAc,EAAE,KAAA,EAAO,gBAAA,EAAe,MAAMQ,MAAAA,EAAQ,IAAA,EAAM,0CAAA,EAAsC,WAAA,EAAa,gCAAA,EAA4B;AAAA,EACzI,MAAA,EAAc,EAAE,KAAA,EAAO,aAAA,EAAe,MAAM,KAAA,EAAO,IAAA,EAAM,4CAAA,EAA8C,WAAA,EAAa,gBAAA;AACtH,CAAA;AAEA,IAAM,gBAAoC,CAAC,UAAA,EAAY,aAAa,aAAA,EAAe,aAAA,EAAe,YAAY,QAAQ,CAAA;AAEtH,SAASnC,SAAQ,QAAA,EAA+C;AAC9D,EAAA,OAAO,OAAO,QAAA,KAAa,UAAA,GAAa,QAAA,EAAS,GAAI,YAAYO,eAAAA,EAAgB;AACnF;AAIA,SAAS,qBAAA,GAAwB;AAC/B,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa,MAAA,CAAO,cAAc,IAAI,KAAA,CAAM,uBAAuB,CAAC,CAAA;AAC5F;AAMO,SAAS,YAAA,CAAa,EAAE,eAAA,EAAgB,EAAsB;AACnE,EAAA,MAAM,QAAA,GAAWL,OAAM,OAAA,CAAQ,MAAMF,SAAQ,eAAe,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAChF,EAAA,MAAM,SAAA,GAAY,OAAO,QAAA,CAAS,iBAAA,KAAsB,UAAA;AAExD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,IAAIE,MAAAA,CAAM,QAAA,CAAyB,EAAE,CAAA;AACjE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,MAAAA,CAAM,SAAS,IAAI,CAAA;AACjD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,MAAAA,CAAM,SAAkC,IAAI,CAAA;AAExE,EAAA,MAAM,MAAA,GAASA,MAAAA,CAAM,WAAA,CAAY,YAAY;AAC3C,IAAA,IAAI,CAAC,SAAS,iBAAA,EAAmB;AAAE,MAAA,UAAA,CAAW,KAAK,CAAA;AAAG,MAAA;AAAA,IAAO;AAC7D,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,iBAAA,EAAkB;AAG9C,MAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,cAAc,CAAA,IAAK,QAAA,CAAS,kBAAA,EAAoB;AAC/E,QAAA,MAAM,QAAA,CAAS,kBAAA,CAAmB,EAAE,IAAA,EAAM,cAAA,EAAgB,KAAA,EAAO,aAAA,EAAe,OAAA,EAAS,IAAA,EAAM,QAAA,EAAU,CAAA,EAAG,CAAA;AAC5G,QAAA,WAAA,CAAY,MAAM,QAAA,CAAS,iBAAA,EAAmB,CAAA;AAAA,MAChD,CAAA,MAAO;AACL,QAAA,WAAA,CAAY,IAAI,CAAA;AAAA,MAClB;AAAA,IACF,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAAA,MAAAA,CAAM,UAAU,MAAM;AAAE,IAAA,KAAK,MAAA,EAAO;AAAA,EAAE,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEjD,EAAA,MAAM,KAAA,GAAQ,OAAO,EAAA,EAAY,KAAA,KAA0E;AACzG,IAAA,IAAI,CAAC,SAAS,kBAAA,EAAoB;AAClC,IAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,kBAAA,CAAmB,IAAI,KAAK,CAAA;AAC3D,IAAA,WAAA,CAAY,CAAC,IAAA,KAAS,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,EAAA,KAAO,EAAA,GAAK,OAAA,GAAU,CAAE,CAAC,CAAA;AAClE,IAAA,qBAAA,EAAsB;AAAA,EACxB,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,OAAO,EAAA,KAAe;AACnC,IAAA,IAAI,CAAC,SAAS,kBAAA,EAAoB;AAClC,IAAA,MAAM,QAAA,CAAS,mBAAmB,EAAE,CAAA;AACpC,IAAA,WAAA,CAAY,CAAC,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAC,CAAA;AACrD,IAAA,qBAAA,EAAsB;AAAA,EACxB,CAAA;AAEA,EAAA,MAAM,GAAA,GAAM,OAAO,IAAA,EAAwB,KAAA,EAAe,GAAA,KAAgB;AACxE,IAAA,IAAI,CAAC,SAAS,kBAAA,EAAoB;AAClC,IAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,kBAAA,CAAmB,EAAE,IAAA,EAAM,KAAA,EAAO,SAAS,SAAA,CAAU,IAAI,EAAE,KAAA,EAAO,GAAA,EAAK,OAAO,IAAA,EAAM,OAAA,EAAS,MAAM,QAAA,EAAU,QAAA,CAAS,QAAQ,CAAA;AAC7J,IAAA,WAAA,CAAY,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,OAAO,CAAC,CAAA;AACxC,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,qBAAA,EAAsB;AAAA,EACxB,CAAA;AAEA,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,uBACEE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uCAAA,EAAwC,QAAA,EAAA,iBAAA,EAAe,CAAA;AAAA,sBACrEA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAqC,QAAA,EAAA,8DAAA,EAElD;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,SAAS,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,cAAc,CAAA;AAC7D,EAAA,MAAM,SAAS,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,cAAc,CAAA;AAE/D,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uCAAA,EAAwC,QAAA,EAAA,iBAAA,EAAe,CAAA;AAAA,sBACrEA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAqC,QAAA,EAAA,qHAAA,EAElD;AAAA,KAAA,EACF,CAAA;AAAA,IAEC,OAAA,mBACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,kBAAA,EAAW,CAAA,mBAExDC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA;AAAA,MAAA,MAAA,oBAAUD,GAAAA,CAAC,eAAA,EAAA,EAAgB,OAAA,EAAS,MAAA,EAAQ,QAAQ,CAAC,GAAA,KAAQ,KAAA,CAAM,MAAA,CAAO,EAAA,EAAI,EAAE,KAAK,CAAA,EAAG,QAAA,EAAU,CAAC,OAAA,KAAY,KAAA,CAAM,OAAO,EAAA,EAAI,EAAE,OAAA,EAAS,CAAA,EAAG,CAAA;AAAA,sBAE/IC,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,kBAAAA,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uCAAA,EAAwC,QAAA,EAAA,eAAA,EAAa,CAAA,EACrE,CAAA;AAAA,wBACAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA;AAAA,UAAA,MAAA,CAAO,IAAI,CAAC,CAAA,qBACXD,GAAAA,CAAC,cAAsB,OAAA,EAAS,CAAA,EAAG,MAAA,EAAQ,CAAC,QAAQ,KAAA,CAAM,CAAA,CAAE,EAAA,EAAI,EAAE,KAAK,CAAA,EAAG,QAAA,EAAU,CAAC,YAAY,KAAA,CAAM,CAAA,CAAE,EAAA,EAAI,EAAE,SAAS,CAAA,EAAG,QAAA,EAAU,MAAM,OAAO,CAAA,CAAE,EAAE,CAAA,EAAA,EAArI,CAAA,CAAE,EAAsI,CAC1J,CAAA;AAAA,UACA,MAAA,CAAO,WAAW,CAAA,oBACjBA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qFAAoF,QAAA,EAAA,mGAAA,EAEjG;AAAA,SAAA,EAEJ,CAAA;AAAA,QAEC,MAAA,mBACCA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,MAAM,SAAA,CAAU,IAAI,CAAA,EAAG,KAAA,EAAO,CAAC,KAAA,EAAO,GAAA,KAAQ,GAAA,CAAI,MAAA,EAAQ,KAAA,EAAO,GAAG,CAAA,EAAG,MAAA,EAAQ,WAAW,CAAA,mBAElIA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACZ,QAAA,EAAA,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,KAAM;AACxB,UAAA,MAAM,IAAA,GAAO,SAAA,CAAU,CAAC,CAAA,CAAE,IAAA;AAC1B,UAAA,uBACEC,IAAAA,CAAC,MAAA,EAAA,EAAe,OAAA,EAAQ,SAAA,EAAU,IAAA,EAAK,IAAA,EAAK,OAAA,EAAS,MAAM,SAAA,CAAU,CAAC,CAAA,EACpE,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EAAqB,CAAA;AAAA,YAAE,GAAA;AAAA,YAAE,SAAA,CAAU,CAAC,CAAA,CAAE;AAAA,WAAA,EAAA,EAD3C,CAEb,CAAA;AAAA,QAEJ,CAAC,CAAA,EACH;AAAA,OAAA,EAEJ;AAAA,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAEA,SAAS,eAAA,CAAgB,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAS,EAA0G;AAC7J,EAAA,MAAM,CAAC,KAAK,MAAM,CAAA,GAAID,OAAM,QAAA,CAAS,OAAA,CAAQ,OAAO,EAAE,CAAA;AACtD,EAAA,MAAM,KAAA,GAAA,CAAS,OAAA,CAAQ,GAAA,IAAO,EAAA,MAAQ,GAAA;AACtC,EAAA,MAAM,OAAO,SAAA,CAAU,YAAA;AACvB,EAAA,uBACEC,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDACb,QAAA,kBAAAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gFAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,IAAA,CAAK,IAAA,EAAL,EAAU,SAAA,EAAU,sBAAA,EAAuB,CAAA,EAC9C,CAAA;AAAA,oBACAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,wBAC3DA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,6CAAA,EAAgD,OAAA,CAAQ,OAAA,GAAU,iCAAA,GAAoC,gCAAgC,CAAA,CAAA,EACpJ,QAAA,EAAA,OAAA,CAAQ,OAAA,GAAU,UAAU,SAAA,EAC/B;AAAA,OAAA,EACF,CAAA;AAAA,sBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAA,EAAwC,eAAK,IAAA,EAAK,CAAA;AAAA,sBAE/DC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sDAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,IAAC,KAAA,EAAA,EAAM,KAAA,EAAO,GAAA,EAAK,WAAA,EAAa,KAAK,WAAA,EAAa,QAAA,EAAU,CAAC,CAAA,KAAM,OAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,EAAG,WAAU,QAAA,EAAS,CAAA;AAAA,wBAC9GC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAK,IAAA,EAAK,UAAU,CAAC,KAAA,EAAO,OAAA,EAAS,MAAM,OAAO,GAAA,CAAI,IAAA,EAAK,IAAK,IAAI,GAAG,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,0BACrFC,KAAC,MAAA,EAAA,EAAO,IAAA,EAAK,MAAK,OAAA,EAAQ,SAAA,EAAU,UAAU,CAAC,OAAA,CAAQ,KAAK,OAAA,EAAS,MAAM,QAAQ,GAAA,IAAO,MAAA,CAAO,KAAK,OAAA,CAAQ,GAAA,EAAK,QAAA,EAAU,qBAAqB,CAAA,EAChJ,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAACiC,YAAAA,EAAA,EAAa,SAAA,EAAU,oBAAA,EAAqB,CAAA;AAAA,YAAE;AAAA,WAAA,EACjD;AAAA,SAAA,EACF;AAAA,OAAA,EACF,CAAA;AAAA,sBACAjC,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QACb,QAAA,kBAAAA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,OAAA,EAAS,MAAM,QAAA,CAAS,CAAC,OAAA,CAAQ,OAAO,CAAA,EAAG,SAAA,EAAU,mEACxE,QAAA,EAAA,OAAA,CAAQ,OAAA,GAAU,iBAAA,GAAoB,cAAA,EACzC,CAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;AAEA,SAAS,WAAW,EAAE,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAU,UAAS,EAAgI;AACxL,EAAA,MAAM,CAAC,KAAK,MAAM,CAAA,GAAID,OAAM,QAAA,CAAS,OAAA,CAAQ,OAAO,EAAE,CAAA;AACtD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,MAAAA,CAAM,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,OAAA,CAAQ,IAAI,KAAK,SAAA,CAAU,MAAA;AAClD,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,uBACEC,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDACb,QAAA,kBAAAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,oBAAAD,IAAC,KAAA,EAAA,EAAI,SAAA,EAAW,kEAAkE,OAAA,CAAQ,OAAA,GAAU,kBAAkB,UAAU,CAAA,CAAA,EAC9H,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,WAAW,CAAA,QAAA,EAAW,OAAA,CAAQ,UAAU,cAAA,GAAiB,uBAAuB,IAAI,CAAA,EAC5F,CAAA;AAAA,oBACAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8CAAA,EAAgD,kBAAQ,KAAA,EAAM,CAAA;AAAA,MAC1E,OAAA,mBACCA,GAAAA,CAAC,KAAA,EAAA,EAAM,KAAA,EAAO,GAAA,EAAK,WAAA,EAAa,IAAA,CAAK,WAAA,EAAa,QAAA,EAAU,CAAC,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,EAAG,SAAA,EAAU,UAAA,EAAW,CAAA,mBAEhHA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wCAAA,EAA0C,QAAA,EAAA,OAAA,CAAQ,GAAA,IAAO,sBAAA,EAAuB;AAAA,KAAA,EAEjG,CAAA;AAAA,oBACAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCACZ,QAAA,EAAA,OAAA,mBACCC,IAAAA,CAAAmB,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAApB,IAAC,MAAA,EAAA,EAAO,IAAA,EAAK,MAAK,OAAA,EAAQ,OAAA,EAAQ,SAAS,MAAM;AAAE,QAAA,MAAA,CAAO,GAAA,CAAI,IAAA,EAAK,IAAK,IAAI,CAAA;AAAG,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAAE,GAAG,QAAA,kBAAAA,GAAAA,CAACkC,OAAA,EAAM,SAAA,EAAU,WAAU,CAAA,EAAE,CAAA;AAAA,sBACjIlC,IAAC,MAAA,EAAA,EAAO,IAAA,EAAK,MAAK,OAAA,EAAQ,OAAA,EAAQ,SAAS,MAAM;AAAE,QAAA,MAAA,CAAO,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAG,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAAE,GAAG,QAAA,kBAAAA,GAAAA,CAACmC,GAAA,EAAE,SAAA,EAAU,WAAU,CAAA,EAAE;AAAA,KAAA,EAC9H,CAAA,mBAEAlC,IAAAA,CAAAmB,QAAAA,EAAA,EACG,QAAA,EAAA;AAAA,MAAA,OAAA,CAAQ,GAAA,oBACPpB,GAAAA,CAAC,MAAA,EAAA,EAAO,MAAK,IAAA,EAAK,OAAA,EAAQ,OAAA,EAAQ,OAAA,EAAS,MAAM,MAAA,CAAO,KAAK,OAAA,CAAQ,GAAA,EAAM,QAAA,EAAU,qBAAqB,CAAA,EAAG,QAAA,kBAAAA,IAACiC,YAAAA,EAAA,EAAa,SAAA,EAAU,SAAA,EAAU,CAAA,EAAE,CAAA;AAAA,sBAEnJjC,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,OAAA,EAAS,MAAM,QAAA,CAAS,CAAC,OAAA,CAAQ,OAAO,CAAA,EAAG,KAAA,EAAO,OAAA,CAAQ,OAAA,GAAU,WAAA,GAAc,QAAA,EAAU,SAAA,EAAW,CAAA,6CAAA,EAAgD,OAAA,CAAQ,OAAA,GAAU,iCAAA,GAAoC,gCAAgC,CAAA,CAAA,EAChQ,QAAA,EAAA,OAAA,CAAQ,OAAA,GAAU,OAAA,GAAU,SAAA,EAC/B,CAAA;AAAA,sBACAA,GAAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,OAAA,EAAQ,OAAA,EAAS,MAAM,UAAA,CAAW,IAAI,CAAA,EAAG,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,sBACzEA,GAAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAK,MAAK,OAAA,EAAQ,OAAA,EAAQ,OAAA,EAAS,QAAA,EAAU,0BAAAA,GAAAA,CAACoC,MAAAA,EAAA,EAAO,SAAA,EAAU,wBAAuB,CAAA,EAAE;AAAA,KAAA,EAClG,CAAA,EAEJ;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;AAEA,SAAS,eAAe,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,OAAM,EAAyI;AAC/L,EAAA,MAAM,IAAA,GAAO,UAAU,IAAI,CAAA;AAC3B,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,IAAIrC,MAAAA,CAAM,QAAA,CAAS,KAAK,KAAK,CAAA;AACnD,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIA,MAAAA,CAAM,SAAS,EAAE,CAAA;AACvC,EAAAA,MAAAA,CAAM,UAAU,MAAM;AAAE,IAAA,QAAA,CAAS,SAAA,CAAU,IAAI,CAAA,CAAE,KAAK,CAAA;AAAA,EAAE,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AACjE,EAAA,uBACEE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oDAAA,EACb,QAAA,EAAA;AAAA,oBAAAD,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BACZ,QAAA,EAAA,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,KAAM;AACxB,MAAA,MAAM,IAAA,GAAO,SAAA,CAAU,CAAC,CAAA,CAAE,IAAA;AAC1B,MAAA,uBACEC,IAAAA,CAAC,QAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,SAAS,MAAM,MAAA,CAAO,CAAC,CAAA,EAAG,WAAW,CAAA,qEAAA,EAAwE,CAAA,KAAM,IAAA,GAAO,oCAAA,GAAuC,sDAAsD,CAAA,CAAA,EACnP,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,QAAE,GAAA;AAAA,QAAE,SAAA,CAAU,CAAC,CAAA,CAAE;AAAA,OAAA,EAAA,EADpC,CAEb,CAAA;AAAA,IAEJ,CAAC,CAAA,EACH,CAAA;AAAA,oBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oCAAA,EAAsC,eAAK,IAAA,EAAK,CAAA;AAAA,oBAC7DC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAM,KAAA,EAAO,KAAA,EAAO,aAAY,eAAA,EAAgB,QAAA,EAAU,CAAC,CAAA,KAAM,SAAS,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,EAAG,WAAU,SAAA,EAAU,CAAA;AAAA,sBAChHA,GAAAA,CAAC,KAAA,EAAA,EAAM,KAAA,EAAO,GAAA,EAAK,aAAa,IAAA,CAAK,WAAA,EAAa,QAAA,EAAU,CAAC,MAAM,MAAA,CAAO,CAAA,CAAE,OAAO,KAAK,CAAA,EAAG,WAAU,QAAA,EAAS;AAAA,KAAA,EAChH,CAAA;AAAA,oBACAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,UAAO,IAAA,EAAK,IAAA,EAAK,SAAS,MAAM,KAAA,CAAM,KAAA,EAAO,GAAG,CAAA,EAAG,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAACG,IAAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EAAqB,CAAA;AAAA,QAAE;AAAA,OAAA,EAAU,CAAA;AAAA,sBACrGH,IAAC,MAAA,EAAA,EAAO,IAAA,EAAK,MAAK,OAAA,EAAQ,SAAA,EAAU,OAAA,EAAS,QAAA,EAAU,QAAA,EAAA,UAAA,EAAQ;AAAA,KAAA,EACjE;AAAA,GAAA,EACF,CAAA;AAEJ;;;ACvQO,SAAS,YAAY,SAAA,EAAwD;AAClF,EAAA,OAAO,CAAA,WAAA,EAAc,UAAU,EAAE,CAAA,OAAA,CAAA;AACnC;AASO,SAAS,cAAc,IAAA,EAAyB;AACrD,EAAA,IAAI,CAAC,WAAA,CAAY,IAAA,CAAK,KAAK,GAAG,CAAA,SAAU,IAAA,CAAK,GAAA;AAC7C,EAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,GAAG,IAAI,GAAA,GAAM,GAAA;AACjD,EAAA,OAAO,CAAA,EAAG,KAAK,GAAG,CAAA,EAAG,SAAS,CAAA,SAAA,EAAY,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AACzE;ACGA,IAAM,IAAA,GAA6C;AAAA,EACjD,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,OAAA,EAAQ;AAAA,EAC/B,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,SAAA,EAAU;AAAA,EACnC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,WAAA;AAC3B,CAAA;AAGA,IAAM,iBAAA,GAAoB,GAAA;AAE1B,SAASH,SAAQ,QAAA,EAA+C;AAC9D,EAAA,OAAO,OAAO,QAAA,KAAa,UAAA,GAAa,QAAA,EAAS,GAAI,YAAYO,eAAAA,EAAgB;AACnF;AAEA,SAAS,WAAW,KAAA,EAAuB;AACzC,EAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AACnB,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAA,EAAK,IAAA,EAAM,MAAM,IAAI,CAAA;AACpC,EAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,CAAI,KAAK,CAAA,GAAI,IAAA,CAAK,IAAI,IAAI,CAAC,CAAA,EAAG,KAAA,CAAM,SAAS,CAAC,CAAA;AACjF,EAAA,OAAO,CAAA,EAAA,CAAI,KAAA,GAAQ,IAAA,IAAQ,CAAA,EAAG,OAAA,CAAQ,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACpE;AAQO,SAAS,WAAA,CAAY,EAAE,eAAA,EAAgB,EAAqB;AACjE,EAAA,MAAM,QAAA,GAAWL,OAAM,OAAA,CAAQ,MAAMF,SAAQ,eAAe,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAChF,EAAA,MAAM,SAAA,GAAY,OAAO,QAAA,CAAS,cAAA,KAAmB,UAAA;AAErD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIE,MAAAA,CAAM,SAA6B,IAAI,CAAA;AACjE,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIA,MAAAA,CAAM,SAAmB,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,MAAAA,CAAM,SAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,MAAAA,CAAM,SAA2B,IAAI,CAAA;AAC/E,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,MAAAA,CAAM,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,MAAAA,CAAM,SAAS,KAAK,CAAA;AAGtD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,MAAAA,CAAM,SAAwB,IAAI,CAAA;AAG9D,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,IAAIA,MAAAA,CAAM,QAAA,CAAqC,EAAE,CAAA;AAEjF,EAAA,MAAM,MAAA,GAASA,MAAAA,CAAM,WAAA,CAAY,YAAY;AAC3C,IAAA,IAAI,CAAC,SAAS,cAAA,EAAgB;AAAE,MAAA,QAAA,CAAS,EAAE,CAAA;AAAG,MAAA;AAAA,IAAO;AACrD,IAAA,IAAI;AACF,MAAA,QAAA,CAAS,MAAM,QAAA,CAAS,cAAA,EAAgB,CAAA;AAAA,IAC1C,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,IAAA,CAAK,kCAAkC,GAAG,CAAA;AAClD,MAAA,QAAA,CAAS,EAAE,CAAA;AAAA,IACb;AAAA,EACF,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAAA,MAAAA,CAAM,UAAU,MAAM;AAAE,IAAA,KAAK,MAAA,EAAO;AAAA,EAAE,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEjD,EAAA,MAAM,OAAA,GAAUA,MAAAA,CAAM,WAAA,CAAY,CAAC,IAAY,CAAA,KAAkB;AAC/D,IAAA,aAAA,CAAc,CAAC,IAAA,KAAS,IAAA,CAAK,EAAE,CAAA,GAAI,IAAA,GAAO,EAAE,GAAG,IAAA,EAAM,CAAC,EAAE,GAAG,GAAG,CAAA;AAAA,EAChE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAe,OAAO,MAAA,KAA4B;AACtD,IAAA,IAAI,CAAC,MAAA,EAAQ,MAAA,IAAU,CAAC,SAAS,eAAA,EAAiB;AAClD,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,IAAI;AAIF,MAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA,EAAG;AACrC,QAAA,MAAM,QAAA,CAAS,gBAAgB,IAAI,CAAA;AAAA,MACrC;AACA,MAAA,KAAA,CAAM,OAAA,CAAQ,OAAO,MAAA,KAAW,CAAA,GAAI,oBAAoB,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,kBAAA,CAAoB,CAAA;AAC5F,MAAA,MAAM,MAAA,EAAO;AAAA,IACf,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,IAAA,CAAK,2BAA2B,GAAG,CAAA;AAC3C,MAAA,KAAA,CAAM,MAAM,yCAAmC,CAAA;AAAA,IACjD,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,OAAO,IAAA,EAAiB,MAAA,KAAiB;AAC7D,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,IAAI;AACF,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI,KAAK,SAAA,EAAW;AAClB,QAAA,IAAI,CAAC,QAAA,CAAS,mBAAA,EAAqB,MAAM,IAAI,MAAM,aAAa,CAAA;AAChE,QAAA,MAAM,QAAQ,MAAM,QAAA,CAAS,oBAAoB,IAAA,CAAK,SAAA,CAAU,cAAc,MAAM,CAAA;AAGpF,QAAA,MAAA,GAAS,uBAAA,CAAwB,KAAA,EAAO,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,CAAE,EAAA;AAAA,MAChE,CAAA,MAAO;AACL,QAAA,IAAI,CAAC,QAAA,CAAS,eAAA,EAAiB,MAAM,IAAI,MAAM,aAAa,CAAA;AAG5D,QAAA,MAAM,QAAA,GAAW,MAAM,QAAA,CAAS,eAAA,CAAgB,MAAM,CAAA;AACtD,QAAA,IAAI,SAAS,eAAA,EAAiB,MAAM,QAAA,CAAS,eAAA,CAAgB,KAAK,EAAE,CAAA;AACpE,QAAA,MAAA,GAAS,QAAA,CAAS,EAAA;AAAA,MACpB;AACA,MAAA,MAAM,MAAA,EAAO;AACb,MAAA,SAAA,CAAU,MAAM,CAAA;AAChB,MAAA,KAAA,CAAM,QAAQ,iBAAiB,CAAA;AAAA,IACjC,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,IAAA,CAAK,4BAA4B,GAAG,CAAA;AAC5C,MAAA,KAAA,CAAM,MAAM,yCAAmC,CAAA;AAAA,IACjD,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,gBAAgB,YAAY;AAChC,IAAA,MAAM,IAAA,GAAO,aAAA;AACb,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,WAAA,CAAY,IAAI,CAAA;AAChB,IAAA,IAAI;AAIF,MAAA,IAAI,KAAK,SAAA,EAAW;AAClB,QAAA,MAAM,QAAA,CAAS,kBAAA,CAAmB,IAAA,CAAK,SAAA,CAAU,YAAY,CAAA;AAAA,MAC/D,CAAA,MAAA,IAAW,SAAS,eAAA,EAAiB;AACnC,QAAA,MAAM,QAAA,CAAS,eAAA,CAAgB,IAAA,CAAK,EAAE,CAAA;AAAA,MACxC;AACA,MAAA,QAAA,CAAS,CAAC,IAAA,KAAS,IAAA,EAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,IAAA,CAAK,EAAE,CAAA,IAAK,IAAI,CAAA;AAChE,MAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,MAAA,IAAI,MAAA,KAAW,IAAA,CAAK,EAAA,EAAI,SAAA,CAAU,IAAI,CAAA;AAAA,IACxC,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,IAAA,CAAK,2BAA2B,GAAG,CAAA;AAC3C,MAAA,KAAA,CAAM,MAAM,0CAAoC,CAAA;AAAA,IAClD,CAAA,SAAE;AACA,MAAA,WAAA,CAAY,KAAK,CAAA;AAAA,IACnB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,OAAA,GAAA,CAAW,KAAA,IAAS,EAAC,EAAG,MAAA,CAAO,CAAC,CAAA,KAAM,GAAA,KAAQ,KAAA,IAAS,CAAA,CAAE,IAAA,KAAS,GAAG,CAAA;AAC3E,EAAA,MAAM,YAAY,OAAA,CAAQ,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,MAAM,CAAA;AAC1D,EAAA,MAAM,IAAA,GAAO,SAAA,IAAa,CAAA,GAAI,OAAA,CAAQ,SAAS,CAAA,GAAK,IAAA;AAEpD,EAAA,MAAM,SAAA,GAAY,CAAC,IAAA,KAAoB,OAAA,CAAQ,KAAK,SAAS,CAAA,IAAK,OAAO,QAAA,CAAS,eAAA,KAAoB,UAAA;AACtG,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,KAAoB,IAAA,CAAK,SAAA,GACzC,OAAO,QAAA,CAAS,mBAAA,KAAwB,UAAA,GACxC,OAAO,QAAA,CAAS,eAAA,KAAoB,UAAA;AAIxC,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,uBACEE,IAAAA,CAAAmB,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAApB,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAM,IAAA;AAAA,UACN,UAAA,EAAY,UAAA,CAAW,IAAA,CAAK,EAAE,CAAA;AAAA,UAC9B,YAAY,CAAC,CAAA,KAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,UACrC,UAAU,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,QAAQ,MAAA,EAAO;AAAA,UACpD,UAAA,EAAY,CAAC,KAAA,KAAU,SAAA,CAAU,OAAA,CAAQ,YAAY,KAAK,CAAA,EAAG,EAAA,IAAM,IAAA,CAAK,EAAE,CAAA;AAAA,UAC1E,MAAA,EAAQ,MAAM,SAAA,CAAU,IAAI,CAAA;AAAA,UAC5B,SAAA,EAAW,UAAA,CAAW,IAAI,CAAA,GAAI,CAAC,WAAW,KAAK,aAAA,CAAc,IAAA,EAAM,MAAM,CAAA,GAAI,MAAA;AAAA,UAC7E,UAAU,SAAA,CAAU,IAAI,IAAI,MAAM,gBAAA,CAAiB,IAAI,CAAA,GAAI,MAAA;AAAA,UAC3D;AAAA;AAAA,OACF;AAAA,sBACAA,GAAAA;AAAA,QAAC,aAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAM,aAAA;AAAA,UACN,OAAA,EAAS,QAAA;AAAA,UACT,SAAA,EAAW,MAAM,KAAK,aAAA,EAAc;AAAA,UACpC,QAAA,EAAU,MAAM,gBAAA,CAAiB,IAAI;AAAA;AAAA;AACvC,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,WAAW,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AAClD,EAAA,MAAM,QAAQ,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,SAAS,CAAA;AAChD,EAAA,MAAM,YAAA,GAAA,CAAgB,SAAS,EAAC,EAAG,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAA,CAAE,MAAA;AAC9D,EAAA,MAAM,OAAA,GAAU,KAAA,KAAU,IAAA,GACtB,EAAA,GACA;AAAA,IACE,CAAA,EAAG,MAAM,MAAM,CAAA,CAAA,EAAI,MAAM,MAAA,KAAW,CAAA,GAAI,YAAY,UAAU,CAAA,CAAA;AAAA,IAC9D,YAAA,GAAe,IACX,CAAA,EAAG,YAAY,IAAI,YAAA,KAAiB,CAAA,GAAI,YAAA,GAAe,aAAa,CAAA,CAAA,GACpE;AAAA,GACN,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,QAAK,CAAA;AAEhC,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,qBAClBA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACZ,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,qBACTA,GAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MAEC,IAAA;AAAA,MACA,UAAA,EAAY,UAAA,CAAW,IAAA,CAAK,EAAE,CAAA;AAAA,MAC9B,YAAY,CAAC,CAAA,KAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,MACrC,MAAA,EAAQ,MAAM,SAAA,CAAU,IAAA,CAAK,EAAE,CAAA;AAAA,MAC/B,UAAU,SAAA,CAAU,IAAI,IAAI,MAAM,gBAAA,CAAiB,IAAI,CAAA,GAAI;AAAA,KAAA;AAAA,IALtD,IAAA,CAAK;AAAA,GAOb,CAAA,EACH,CAAA;AAGF,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAMZ,QAAA,EAAA;AAAA,IAAA,SAAA,IAAa,QAAA,CAAS,eAAA,oBACrBD,GAAAA,CAAC,iBAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAsB,MAAA,EAAQ,YAAA,EAAc,CAAA,EAC5D,CAAA;AAAA,oBAEFA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,MAAA;AAAA,QACV,IAAA,EAAM,IAAA;AAAA,QACN,KAAA,EAAO,GAAA;AAAA,QACP,QAAA,EAAU,MAAA;AAAA,QACV,YAAA,EAAW,UAAA;AAAA,QACX,OAAA,EAAS,0BAAUA,GAAAA,CAAC,UAAK,SAAA,EAAU,+BAAA,EAAiC,mBAAQ,CAAA,GAAU;AAAA;AAAA,KACxF;AAAA,IAEC,CAAC,SAAA,mBACAC,IAAAA,CAAC,IAAA,EAAA,EAAK,WAAU,kBAAA,EACd,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,uCAAA,EAAwC,CAAA;AAAA,sBAC5DA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oBAAmB,QAAA,EAAA,kCAAA,EAA6B,CAAA;AAAA,sBAC7DA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAqC,QAAA,EAAA,mGAAA,EAElD;AAAA,KAAA,EACF,CAAA,GACE,UAAU,IAAA,mBACZA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACZ,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,QAAQ,CAAA,EAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,sBACjCC,IAAAA,CAAC,IAAA,EAAA,EAAa,SAAA,EAAU,KAAA,EACtB,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDAAA,EAAkD,CAAA;AAAA,sBACjEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDAAA,EAAkD;AAAA,KAAA,EAAA,EAFxD,CAGX,CACD,CAAA,EACH,CAAA,GACE,OAAA,CAAQ,MAAA,KAAW,CAAA,mBACrBC,IAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EACd,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,uCAAA,EAAwC,CAAA;AAAA,sBAC5DA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oBAAmB,QAAA,EAAA,sBAAA,EAAoB,CAAA;AAAA,sBACpDA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAqC,QAAA,EAAA,mFAAA,EAElD;AAAA,KAAA,EACF,CAAA,GACE,QAAA,CAAS,MAAA,IAAU,KAAA,CAAM,MAAA;AAAA;AAAA;AAAA,sBAG3BC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,WAAA,EACjB,QAAA,EAAA;AAAA,0BAAAD,IAAC,YAAA,EAAA,EAAa,KAAA,EAAM,mBAAA,EAAoB,KAAA,EAAO,SAAS,MAAA,EAAQ,CAAA;AAAA,UAC/D,WAAW,QAAQ;AAAA,SAAA,EACtB,CAAA;AAAA,wBACAC,IAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,WAAA,EACjB,QAAA,EAAA;AAAA,0BAAAD,IAAC,YAAA,EAAA,EAAa,KAAA,EAAM,YAAA,EAAa,KAAA,EAAO,MAAM,MAAA,EAAQ,CAAA;AAAA,UACrD,WAAW,KAAK;AAAA,SAAA,EACnB;AAAA,OAAA,EACF;AAAA,QAEA,WAAW,OAAO,CAAA;AAAA,oBAGpBA,GAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,aAAA;AAAA,QACN,OAAA,EAAS,QAAA;AAAA,QACT,SAAA,EAAW,MAAM,KAAK,aAAA,EAAc;AAAA,QACpC,QAAA,EAAU,MAAM,gBAAA,CAAiB,IAAI;AAAA;AAAA;AACvC,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,cAAc,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,UAAS,EAKzD;AACD,EAAA,uBACEA,GAAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,MAAM,IAAA,KAAS,IAAA;AAAA,MACf,OAAA;AAAA,MACA,OAAA,EAAQ,aAAA;AAAA,MACR,KAAA,EAAO,IAAA,EAAM,SAAA,GAAY,4BAAA,GAA+B,kBAAA;AAAA,MACxD,aAAa,IAAA,EAAM,SAAA,GACf,kBAAkB,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,0BAAA,CAAA,GACtC,qGAAA;AAAA,MACJ,YAAA,EAAa,SAAA;AAAA,MACb,WAAA,EAAY,UAAA;AAAA,MACZ,SAAA;AAAA,MACA;AAAA;AAAA,GACF;AAEJ;AAEA,SAAS,YAAA,CAAa,EAAE,KAAA,EAAO,KAAA,EAAM,EAAqC;AACxE,EAAA,uBACEC,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EACX,QAAA,EAAA;AAAA,IAAA,KAAA;AAAA,IAAM,GAAA;AAAA,oBAACA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mCAAA,EAAoC,QAAA,EAAA;AAAA,MAAA,GAAA;AAAA,MAAE,KAAA;AAAA,MAAM;AAAA,KAAA,EAAC;AAAA,GAAA,EACvE,CAAA;AAEJ;AAEA,SAAS,YAAA,CAAa,EAAE,SAAA,EAAW,MAAA,EAAO,EAGvC;AACD,EAAA,MAAM,QAAA,GAAWF,MAAAA,CAAM,MAAA,CAAyB,IAAI,CAAA;AACpD,EAAA,uBACEE,IAAAA,CAAAmB,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAApB,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAK,MAAA;AAAA,QACL,QAAA,EAAQ,IAAA;AAAA,QACR,SAAA,EAAU,QAAA;AAAA,QACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,UAAA,KAAK,OAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAAE,QAAQ,MAAM;AACxC,YAAA,IAAI,QAAA,CAAS,OAAA,EAAS,QAAA,CAAS,OAAA,CAAQ,KAAA,GAAQ,EAAA;AAAA,UACjD,CAAC,CAAA;AAAA,QACH;AAAA;AAAA,KACF;AAAA,oBACAC,IAAAA,CAACoC,MAAAA,EAAA,EAAO,OAAA,EAAS,MAAM,QAAA,CAAS,OAAA,EAAS,KAAA,EAAM,EAAG,QAAA,EAAU,SAAA,EAC1D,QAAA,EAAA;AAAA,sBAAArC,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,cAAA,EAAe,CAAA;AAAA,MAChC,YAAY,gBAAA,GAAc;AAAA,KAAA,EAC7B;AAAA,GAAA,EACF,CAAA;AAEJ;AAGA,SAAS,QAAA,CAAS,EAAE,IAAA,EAAM,SAAA,EAAU,EAAmD;AACrF,EAAA,MAAM,IAAA,GAAO,IAAA,KAAS,OAAA,GAAU,IAAA,GAAO,QAAA;AACvC,EAAA,uBAAOA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAsB,CAAA;AACrC;AAEA,SAAS,UAAU,EAAE,IAAA,EAAM,YAAY,UAAA,EAAY,MAAA,EAAQ,UAAS,EAMjE;AACD,EAAA,uBACEC,IAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,oCAAA,EACd,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAA;AAAA,QACT,YAAA,EAAY,CAAA,MAAA,EAAS,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,QAC9B,SAAA,EAAU,oGAAA;AAAA,QAET,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,IAAA,KAAS,0BACbD,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,KAAK,IAAA,CAAK,GAAA;AAAA,cACV,KAAK,IAAA,CAAK,IAAA;AAAA,cACV,OAAA,EAAQ,MAAA;AAAA,cACR,SAAA,EAAU,8BAAA;AAAA,cACV,MAAA,EAAQ,CAAC,CAAA,KAAM;AACb,gBAAA,MAAM,MAAM,CAAA,CAAE,aAAA;AACd,gBAAA,IAAI,GAAA,CAAI,YAAA,EAAc,UAAA,CAAW,EAAE,KAAA,EAAO,IAAI,YAAA,EAAc,MAAA,EAAQ,GAAA,CAAI,aAAA,EAAe,CAAA;AAAA,cACzF;AAAA;AAAA,WACF,mBAEAA,GAAAA,CAAC,QAAA,EAAA,EAAS,MAAM,IAAA,CAAK,IAAA,EAAM,WAAU,+BAAA,EAAgC,CAAA;AAAA,UAEtE,IAAA,CAAK,WAAW,OAAA,oBACfA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+GAA8G,QAAA,EAAA,MAAA,EAE9H;AAAA;AAAA;AAAA,KAEJ;AAAA,IAEC,4BACCA,GAAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,WACV,QAAA,kBAAAA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAW,SAAA;AAAA,QACX,OAAA,EAAS,QAAA;AAAA,QACT,SAAA,EAAU,oKAAA;AAAA,QAEV,QAAA,kBAAAA,GAAAA,CAACoC,MAAAA,EAAA,EAAO,WAAU,aAAA,EAAc;AAAA;AAAA,KAClC,EACF,CAAA;AAAA,oBAGFpC,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yCAAwC,KAAA,EAAO,IAAA,CAAK,IAAA,EAAO,QAAA,EAAA,IAAA,CAAK,IAAA,EAAK,CAAA;AAAA,oBAClFA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mCAAA,EACX,0BAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAY,UAAA,EAAwB,CAAA,EAChD,CAAA;AAAA,IAEC,eAAA,CAAgB,MAAM,UAAU,CAAA,oBAC/BA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,2CAAA,EAA4C,QAAA,EAAA,uBAAA,EAAe,CAAA;AAAA,IAGzE,KAAK,SAAA,mBACJA,GAAAA,CAAC,UAAA,EAAA,EAAW,WAAW,IAAA,CAAK,SAAA,EAAW,SAAA,EAAU,oBAAA,EAAqB,oBAEtEA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4CAA2C,QAAA,EAAA,YAAA,EAAU;AAAA,GAAA,EAEtE,CAAA;AAEJ;AASA,SAAS,WAAA,CAAY;AAAA,EACnB,IAAA;AAAA,EAAM,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,QAAA;AAAA,EAAU,UAAA;AAAA,EAAY,MAAA;AAAA,EAAQ,SAAA;AAAA,EAAW,QAAA;AAAA,EAAU;AACnF,CAAA,EAUG;AACD,EAAA,MAAM,UAAA,GAAaD,MAAAA,CAAM,MAAA,CAAyB,IAAI,CAAA;AAKtD,EAAAA,MAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,SAAS,MAAM,CAAA,EAAkB;AAC/B,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,WAAA,EAAa,UAAA,CAAW,EAAE,CAAA;AACxC,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,YAAA,EAAc,UAAA,CAAW,CAAC,CAAA;AAAA,IAC1C;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,KAAK,CAAA;AAAA,EAC5D,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,uBACEE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAIb,QAAA,EAAA;AAAA,oBAAAD,IAAC,UAAA,EAAA,EAAW,KAAA,EAAO,KAAK,IAAA,EAAM,WAAA,EAAY,eAAW,MAAA,EAAgB,CAAA;AAAA,IAEpE,QAAA,CAAS,KAAA,GAAQ,CAAA,oBAChBA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EACb,QAAA,kBAAAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,YAAA,EAAW,kBAAA;AAAA,UACX,QAAA,EAAU,SAAS,KAAA,KAAU,CAAA;AAAA,UAC7B,OAAA,EAAS,MAAM,UAAA,CAAW,EAAE,CAAA;AAAA,UAC5B,SAAA,EAAU,qEAAA;AAAA,UAEV,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,OACnC;AAAA,sBACAC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAA,EAAqB,QAAA,EAAA;AAAA,QAAA,QAAA,CAAS,KAAA,GAAQ,CAAA;AAAA,QAAE,MAAA;AAAA,QAAK,QAAA,CAAS;AAAA,OAAA,EAAM,CAAA;AAAA,sBAC5ED,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,YAAA,EAAW,oBAAA;AAAA,UACX,QAAA,EAAU,QAAA,CAAS,KAAA,KAAU,QAAA,CAAS,KAAA,GAAQ,CAAA;AAAA,UAC9C,OAAA,EAAS,MAAM,UAAA,CAAW,CAAC,CAAA;AAAA,UAC3B,SAAA,EAAU,qEAAA;AAAA,UAEV,QAAA,kBAAAA,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA;AACpC,KAAA,EACF,CAAA,EACF,CAAA;AAAA,oBAGFC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,IAAC,IAAA,EAAA,EAAK,SAAA,EAAU,+EACb,QAAA,EAAA,IAAA,CAAK,IAAA,KAAS,0BACbA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UAEC,KAAK,IAAA,CAAK,GAAA;AAAA,UACV,KAAK,IAAA,CAAK,IAAA;AAAA,UACV,SAAA,EAAU,+CAAA;AAAA,UACV,MAAA,EAAQ,CAAC,CAAA,KAAM;AACb,YAAA,MAAM,MAAM,CAAA,CAAE,aAAA;AACd,YAAA,IAAI,GAAA,CAAI,YAAA,EAAc,UAAA,CAAW,EAAE,KAAA,EAAO,IAAI,YAAA,EAAc,MAAA,EAAQ,GAAA,CAAI,aAAA,EAAe,CAAA;AAAA,UACzF;AAAA,SAAA;AAAA,QAPK,IAAA,CAAK;AAAA,OAQZ,mBAEAC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6DAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,IAAC,QAAA,EAAA,EAAS,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,WAAU,WAAA,EAAY,CAAA;AAAA,wBACjDA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAU,QAAA,EAAA,gDAAA,EAA+B;AAAA,OAAA,EAC3D,CAAA,EAEJ,CAAA;AAAA,sBAEAC,IAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EACd,QAAA,EAAA;AAAA,wBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,OAAE,SAAA,EAAU,yBAAA,EAA0B,OAAO,IAAA,CAAK,IAAA,EAAO,eAAK,IAAA,EAAK,CAAA;AAAA,0BACpEA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAA,EACX,0BAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAY,UAAA,EAAwB,CAAA,EAChD,CAAA;AAAA,UACC,eAAA,CAAgB,MAAM,UAAU,CAAA,oBAC/BC,IAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,4EAAA,EAA6E,QAAA,EAAA;AAAA,YAAA,oGAAA;AAAA,YAEzE,iBAAA;AAAA,YAAkB;AAAA,WAAA,EACnC;AAAA,SAAA,EAEJ,CAAA;AAAA,wBAEAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,2DAAA,EAA4D,QAAA,EAAA,iBAAA,EAAY,CAAA;AAAA,UACpF,KAAK,SAAA,mBACJA,GAAAA,CAAC,UAAA,EAAA,EAAW,WAAW,IAAA,CAAK,SAAA,EAAW,SAAA,EAAU,cAAA,EAAe,oBAEhEA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAqC,QAAA,EAAA,wEAAA,EAElD,CAAA;AAAA,UAED,IAAA,CAAK,WAAW,OAAA,oBACfA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAqC,QAAA,EAAA,4EAAA,EAElD;AAAA,SAAA,EAEJ,CAAA;AAAA,wBAEAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAIb,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAACoC,QAAA,EAAO,QAAA,EAAQ,MAAC,SAAA,EAAU,QAAA,EAAS,OAAM,UAAA,EACxC,QAAA,EAAA;AAAA,4BAAArC,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,cAAA,EAAe,CAAA;AAAA,YAAE;AAAA,WAAA,EAEvC,CAAA;AAAA,0BAEAA,GAAAA,CAACqC,MAAAA,EAAA,EAAO,OAAA,EAAO,IAAA,EAAC,SAAQ,SAAA,EAAU,SAAA,EAAU,UAC1C,QAAA,kBAAApC,IAAAA,CAAC,OAAE,IAAA,EAAM,aAAA,CAAc,IAAI,CAAA,EAAG,QAAA,EAAU,KAAK,IAAA,EAC3C,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,cAAA,EAAe,CAAA;AAAA,YAAE;AAAA,WAAA,EAEvC,CAAA,EACF,CAAA;AAAA,UAEC,SAAA,oBACCC,IAAAA,CAAAmB,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAApB,GAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,GAAA,EAAK,UAAA;AAAA,gBACL,IAAA,EAAK,MAAA;AAAA,gBACL,MAAA,EAAQ,IAAA,CAAK,IAAA,KAAS,OAAA,GAAU,SAAA,GAAY,MAAA;AAAA,gBAC5C,SAAA,EAAU,QAAA;AAAA,gBACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,kBAAA,MAAM,MAAA,GAAS,CAAA,CAAE,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA;AACjC,kBAAA,CAAA,CAAE,OAAO,KAAA,GAAQ,EAAA;AACjB,kBAAA,IAAI,MAAA,YAAkB,MAAM,CAAA;AAAA,gBAC9B;AAAA;AAAA,aACF;AAAA,4BACAC,IAAAA;AAAA,cAACoC,MAAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAQ,SAAA;AAAA,gBACR,SAAA,EAAU,QAAA;AAAA,gBACV,QAAA,EAAU,SAAA;AAAA,gBACV,OAAA,EAAS,MAAM,UAAA,CAAW,OAAA,EAAS,KAAA,EAAM;AAAA,gBAEzC,QAAA,EAAA;AAAA,kCAAArC,IAAC,SAAA,EAAA,EAAU,SAAA,EAAW,gBAAgB,SAAA,GAAY,cAAA,GAAiB,EAAE,CAAA,CAAA,EAAI,CAAA;AAAA,kBACxE,YAAY,gBAAA,GAAc;AAAA;AAAA;AAAA,aAC7B;AAAA,YACC,KAAK,SAAA,oBACJA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qCAAoC,QAAA,EAAA,kEAAA,EAEjD;AAAA,WAAA,EAEJ,CAAA;AAAA,UAGD,QAAA,oBACCC,IAAAA,CAACoC,MAAAA,EAAA,EAAO,SAAQ,OAAA,EAAQ,SAAA,EAAU,gDAAA,EAAiD,OAAA,EAAS,QAAA,EAC1F,QAAA,EAAA;AAAA,4BAAArC,GAAAA,CAACoC,MAAAA,EAAA,EAAO,SAAA,EAAU,cAAA,EAAe,CAAA;AAAA,YAAE;AAAA,WAAA,EAErC;AAAA,SAAA,EAEJ;AAAA,OAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,UAAA,CAAW,EAAE,SAAA,EAAW,SAAA,GAAY,IAAG,EAI7C;AACD,EAAA,uBACEnC,IAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,YAAY,SAAS,CAAA;AAAA,MAC3B,KAAA,EAAO,CAAA,MAAA,EAAS,SAAA,CAAU,KAAK,CAAA,CAAA;AAAA,MAC/B,SAAA,EAAW,6EAA6E,SAAS,CAAA,CAAA;AAAA,MAEjG,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAACsC,OAAAA,EAAA,EAAQ,SAAA,EAAU,kBAAA,EAAmB,CAAA;AAAA,wBACtCtC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,oBAAU,KAAA,EAAM;AAAA;AAAA;AAAA,GAC9C;AAEJ;AAEA,SAAS,QAAA,CAAS,EAAE,IAAA,EAAM,UAAA,EAAW,EAAiD;AACpF,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,IAAA,CAAK,SAAA;AAAA,IACL,aAAa,CAAA,EAAG,UAAA,CAAW,KAAK,CAAA,IAAA,EAAI,UAAA,CAAW,MAAM,CAAA,CAAA,GAAK,EAAA;AAAA,IAC1D,UAAA,CAAW,KAAK,IAAI;AAAA,GACtB,CAAE,OAAO,OAAO,CAAA;AAChB,EAAA,uBAAOA,GAAAA,CAAAoB,QAAAA,EAAA,EAAG,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,QAAK,CAAA,EAAE,CAAA;AAC9B;AAEA,SAAS,eAAA,CAAgB,MAAiB,UAAA,EAAkC;AAC1E,EAAA,OAAO,IAAA,CAAK,IAAA,KAAS,OAAA,IAAW,CAAC,CAAC,UAAA,IAC7B,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,KAAA,EAAO,UAAA,CAAW,MAAM,CAAA,GAAI,iBAAA;AACvD;;;ACjmBO,IAAM,kBAAA,GAAqB;AAG3B,IAAM,gBAAA,GAAoC,EAAE,SAAA,EAAW,CAAA,EAAG,QAAQ,IAAA;AAGlE,IAAM,mBAAA,GAAsB,GAAA,GAAM,EAAA,GAAK,EAAA,GAAK;AAU5C,IAAM,0BAA0B,EAAA,GAAK;AAGrC,IAAM,mBAAA,GAAsB,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK;AAG1C,IAAM,eAAA,GAAkB;AAUxB,IAAM,iBAAA,GAAoB;AAG1B,IAAM,sBAAA,GAAyB;AAG/B,IAAM,yBAAA,GAA4B;AChDlC,IAAM,cAAA,GAAiB,YAAA;AAkC9B,SAAS,MAAA,GAAwB;AAC/B,EAAA,MAAM,WAAW,yBAAA,EAA0B;AAC3C,EAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,oDAAiD,CAAA;AAChF,EAAA,OAAO,QAAA;AACT;AAQA,eAAe,OAAU,IAAA,EAA2C;AAClE,EAAA,MAAM,WAAW,eAAA,EAAgB;AACjC,EAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,oDAAoD,CAAA;AACnF,EAAA,MAAM,YAAA,GAAe,MAAM,qBAAA,CAAsB,EAAE,UAAU,CAAA;AAE7D,EAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,MAAA,EAAO,CAAE,SAAA,CAAU,MAAA,CAAO,cAAA,EAAgB;AAAA,IACtE,IAAA,EAAM,EAAE,GAAG,IAAA,EAAM,QAAA,EAAS;AAAA,IAC1B,OAAA,EAAS,EAAE,CAAC,8BAA8B,GAAG,YAAA;AAAa,GAC3D,CAAA;AACD,EAAA,IAAI,KAAA,EAAO,MAAM,IAAI,KAAA,CAAM,MAAM,OAAO,CAAA;AACxC,EAAA,OAAO,IAAA;AACT;AAQO,SAAS,cAAc,IAAA,EAAoD;AAChF,EAAA,OAAO,MAAA,CAAO,EAAE,MAAA,EAAQ,eAAA,EAAiB,GAAW,EAAE,IAAA,EAAK,CAAK,EAAI,CAAA;AACtE;AAGO,SAAS,aAAA,GAA0C;AACxD,EAAA,OAAO,MAAA,CAAO,EAAE,MAAA,EAAQ,eAAA,EAAiB,CAAA;AAC3C;AAGO,SAAS,aAAA,GAA0C;AACxD,EAAA,OAAO,MAAA,CAAO,EAAE,MAAA,EAAQ,gBAAA,EAAkB,CAAA;AAC5C;AAGO,SAAS,UAAA,GAAuC;AACrD,EAAA,OAAO,MAAA,CAAO,EAAE,MAAA,EAAQ,aAAA,EAAe,CAAA;AACzC;AAGO,SAAS,SAAA,GAA4E;AAC1F,EAAA,OAAO,MAAA,CAAO,EAAE,MAAA,EAAQ,YAAA,EAAc,CAAA;AACxC;AAUA,eAAe,SAAA,CAAU,OAAe,KAAA,EAAgD;AACtF,EAAA,MAAM,WAAW,eAAA,EAAgB;AACjC,EAAA,MAAM,WAAW,yBAAA,EAA0B;AAC3C,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,EAAU,OAAO,IAAA;AACnC,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAM,GAAI,MAAM,KAAA;AAAA,IAC7B,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA,CAAE,OAAO,IAAA,EAAM,EAAE,KAAA,EAAO,OAAA,EAAS,MAAM,IAAA,EAAM,CAAA,CAAE,EAAA,CAAG,aAAa,QAAQ;AAAA,GAC5F;AACA,EAAA,OAAO,KAAA,GAAQ,OAAQ,KAAA,IAAS,CAAA;AAClC;AAEO,SAAS,eAAA,GAA0C;AACxD,EAAA,OAAO,SAAA,CAAU,qBAAqB,CAAC,CAAA,KAAW,EAAE,EAAA,CAAG,iBAAA,EAAmB,IAAI,CAAC,CAAA;AACjF;AAEA,eAAsB,gBAAA,GAA2C;AAC/D,EAAA,MAAM,WAAW,eAAA,EAAgB;AACjC,EAAA,MAAM,WAAW,yBAAA,EAA0B;AAC3C,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,EAAU,OAAO,IAAA;AACnC,EAAA,MAAM,EAAE,IAAA,EAAM,MAAA,KAAW,MAAM,QAAA,CAC5B,KAAK,yBAAyB,CAAA,CAC9B,MAAA,CAAO,aAAa,EACpB,EAAA,CAAG,WAAA,EAAa,QAAQ,CAAA,CACxB,EAAA,CAAG,UAAU,OAAO,CAAA;AACvB,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAA,CAAK,MAAA,IAAU,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,KAAa,GAAA,CAAI,WAAW,CAAC,CAAA;AACzE,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,KAAU,MAAM,QAAA,CAC3B,KAAK,oBAAoB,CAAA,CACzB,MAAA,CAAO,IAAI,EACX,EAAA,CAAG,WAAA,EAAa,QAAQ,CAAA,CACxB,EAAA,CAAG,gBAAgB,CAAC,CAAA;AACvB,EAAA,IAAI,OAAO,OAAO,IAAA;AAClB,EAAA,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG,MAAA,CAAO,CAAC,GAAA,KAAa,CAAC,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,EAAE,CAAC,CAAA,CAAE,MAAA;AACjE;AAEA,eAAsB,aAAA,GAAwC;AAC5D,EAAA,MAAM,WAAW,eAAA,EAAgB;AACjC,EAAA,MAAM,WAAW,yBAAA,EAA0B;AAC3C,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,EAAU,OAAO,IAAA;AACnC,EAAA,MAAM,EAAE,MAAM,MAAA,EAAO,GAAI,MAAM,QAAA,CAC5B,IAAA,CAAK,sBAAsB,CAAA,CAC3B,MAAA,CAAO,UAAU,EACjB,EAAA,CAAG,WAAA,EAAa,QAAQ,CAAA,CACxB,EAAA,CAAG,UAAU,OAAO,CAAA,CACpB,EAAA,CAAG,MAAA,EAAQ,aAAa,CAAA;AAC3B,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAA,CAAK,MAAA,IAAU,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,KAAa,GAAA,CAAI,QAAQ,CAAC,CAAA;AACtE,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,KAAU,MAAM,QAAA,CAC3B,KAAK,iBAAiB,CAAA,CACtB,MAAA,CAAO,IAAI,EACX,EAAA,CAAG,WAAA,EAAa,QAAQ,CAAA,CACxB,GAAA,CAAI,UAAU,WAAW,CAAA;AAC5B,EAAA,IAAI,OAAO,OAAO,IAAA;AAClB,EAAA,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG,MAAA,CAAO,CAAC,GAAA,KAAa,CAAC,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,EAAE,CAAC,CAAA,CAAE,MAAA;AACjE;AASA,eAAsB,mBAAA,CAAoB,QAAQ,EAAA,EAAkC;AAClF,EAAA,MAAM,WAAW,eAAA,EAAgB;AACjC,EAAA,MAAM,WAAW,yBAAA,EAA0B;AAC3C,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,SAAiB,EAAC;AAEpC,EAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAO,GAAI,MAAM,QAAA,CAC5B,IAAA,CAAK,iBAAiB,CAAA,CACtB,MAAA,CAAO,oEAAoE,CAAA,CAC3E,EAAA,CAAG,WAAA,EAAa,QAAQ,CAAA,CACxB,GAAA,CAAI,QAAA,EAAU,WAAW,CAAA,CACzB,KAAA,CAAM,YAAA,EAAc,EAAE,SAAA,EAAW,KAAA,EAAO,CAAA,CACxC,KAAA,CAAM,KAAK,CAAA;AAEd,EAAA,MAAM,IAAA,GAAQ,UAAU,EAAC;AACzB,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAE/B,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,QAAA,CAC3B,IAAA,CAAK,sBAAsB,CAAA,CAC3B,MAAA,CAAO,gDAAgD,CAAA,CACvD,EAAA,CAAG,aAAa,QAAQ,CAAA,CACxB,EAAA,CAAG,QAAA,EAAU,OAAO,CAAA,CACpB,EAAA,CAAG,MAAA,EAAQ,aAAa,CAAA,CACxB,EAAA,CAAG,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,EAAE,CAAC,CAAA;AAE3C,EAAA,MAAM,UAAU,IAAI,GAAA;AAAA,IAAA,CAChB,KAAA,IAAS,EAAC,EAAkC,GAAA,CAAI,CAAC,QAAQ,CAAC,GAAA,CAAI,QAAA,EAAU,GAAG,CAAC;AAAA,GAChF;AAEA,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,KAAA,KAAU;AACzB,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA;AACjC,IAAA,MAAM,OAAO,KAAA,CAAM,YAAA,GAAe,CAAA,OAAA,EAAU,KAAA,CAAM,YAAY,CAAA,CAAA,GAAK,QAAA;AACnE,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,WAAW,KAAA,CAAM,EAAA;AAAA,QACjB,MAAA,EAAQ,WAAA;AAAA,QACR,UAAA,EAAY,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,WAAA;AAAA,QACzC,EAAA,EAAI,IAAA,CAAK,SAAA,IAAa,KAAA,CAAM,OAAA;AAAA,QAC5B,QAAQ,KAAA,CAAM,aAAA,GAAgB,MAAA,CAAO,KAAA,CAAM,aAAa,CAAA,GAAI;AAAA,OAC9D;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,qBAAqB,EAAE,CAAA,CAAE,MAAK,EAAG;AACjD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,WAAW,KAAA,CAAM,EAAA;AAAA,QACjB,MAAA,EAAQ,QAAA;AAAA,QACR,MAAA,EAAQ,iEAAA;AAAA,QACR,EAAA,EAAI,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM;AAAA,OAC7B;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,WAAW,KAAA,CAAM,EAAA;AAAA,MACjB,MAAA,EAAQ,SAAA;AAAA,MACR,MAAA,EAAQ,uDAAA;AAAA,MACR,EAAA,EAAI,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM;AAAA,KAC7B;AAAA,EACF,CAAC,CAAA;AACH;AAGO,SAAS,SAAA,GAGb;AACD,EAAA,OAAO,MAAA,CAAO,EAAE,MAAA,EAAQ,WAAA,EAAa,CAAA;AACvC;;;AC5MO,IAAM,oBAAA,GAAuB,MAClCK,qBAAAA,CAAsB,kBAAA,EAAoB;AAAA,EACxC,cAAc,CAAC,WAAA,EAAa,cAAA,EAAgB,YAAA,EAAc,UAAU,gBAAgB;AACtF,CAAC;AAEI,IAAM,iBAAA,GAAyC;AAAA,EACpD,EAAA,EAAI,kBAAA;AAAA,EACJ,YAAA,EAAc,MAAA;AAAA,EACd,IAAA,EAAM,OAAA;AAAA,EACN,WAAA,EACE,sHAAA;AAAA;AAAA;AAAA,EAGF,UAAA,EAAY;AAAA,IACV,iHAAA;AAAA,IACA,iGAAA;AAAA,IACA,oDAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,IAAA,EAAM,OAAA;AAAA,EACN,QAAA,EAAU,OAAA;AAAA;AAAA;AAAA;AAAA,EAIV,QAAA,EAAU,KAAA;AAAA;AAAA;AAAA,EAGV,SAAA,EAAW,SAAA;AAAA,EACX,OAAA,EAAS,iCAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,WAAA,EAAa;AAAA,IACX;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,cAAA;AAAA,MACV,OAAA,EAAS,CAAC,MAAA,EAAQ,OAAO,CAAA;AAAA,MACzB,MAAA,EACE;AAAA,KACJ;AAAA,IACA;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,eAAA;AAAA,MACV,OAAA,EAAS,CAAC,MAAA,EAAQ,OAAO,CAAA;AAAA;AAAA;AAAA,MAGzB,MAAA,EACE,uJAAA;AAAA,MACF,SAAA,EAAW;AAAA,KACb;AAAA,IACA;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,YAAA;AAAA,MACV,OAAA,EAAS,CAAC,MAAA,EAAQ,OAAO,CAAA;AAAA;AAAA;AAAA,MAGzB,MAAA,EACE,sKAAA;AAAA,MACF,SAAA,EAAW;AAAA,KACb;AAAA;AAAA;AAAA;AAAA,IAIA;AAAA,MACE,IAAA,EAAM,OAAA;AAAA;AAAA;AAAA;AAAA,MAIN,QAAA,EAAU,yBAAA;AAAA,MACV,OAAA,EAAS,CAAC,QAAQ,CAAA;AAAA,MAClB,MAAA,EAAQ;AAAA,KACV;AAAA,IACA;AAAA,MACE,IAAA,EAAM,OAAA;AAAA,MACN,QAAA,EAAU,iBAAA;AAAA,MACV,OAAA,EAAS,CAAC,QAAQ,CAAA;AAAA,MAClB,MAAA,EAAQ;AAAA,KACV;AAAA,IACA;AAAA,MACE,IAAA,EAAM,OAAA;AAAA,MACN,QAAA,EAAU,sBAAA;AAAA,MACV,OAAA,EAAS,CAAC,QAAQ,CAAA;AAAA,MAClB,MAAA,EAAQ;AAAA,KACV;AAAA,IACA;AAAA,MACE,IAAA,EAAM,OAAA;AAAA,MACN,QAAA,EAAU,uBAAA;AAAA,MACV,OAAA,EAAS,CAAC,QAAQ,CAAA;AAAA,MAClB,MAAA,EAAQ;AAAA;AACV,GACF;AAAA;AAAA;AAAA;AAAA,EAIA,SAAA,EAAW,gBAAA;AAAA;AAAA;AAAA;AAAA,EAIX,WAAW,EAAE,UAAA,EAAY,mBAAmB,WAAA,EAAa,CAAA,EAAG,QAAQ,UAAA,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM/E,YAAA,EAAc,CAAC,yBAAA,EAA2B,iBAAA,EAAmB,wBAAwB,uBAAuB,CAAA;AAAA,EAC5G,kBAAA,EAAoB;AAAA,IAClB,EAAE,QAAA,EAAU,iBAAA,EAAmB,KAAA,EAAO,mDAAA,EAAoD;AAAA,IAC1F,EAAE,QAAA,EAAU,yBAAA,EAA2B,KAAA,EAAO,uDAAA,EAAqD;AAAA,IACnG,EAAE,QAAA,EAAU,sBAAA,EAAwB,KAAA,EAAO,sDAAA,EAAuD;AAAA,IAClG,EAAE,QAAA,EAAU,uBAAA,EAAyB,KAAA,EAAO,uDAAA;AAAwD,GACtG;AAAA;AAAA;AAAA;AAAA,EAIA,SAAA,EAAW;AAAA,IACT;AAAA,MACE,GAAA,EAAK,iBAAA;AAAA,MACL,KAAA,EAAO,4EAAA;AAAA,MACP,KAAA,EAAO,MAAA;AAAA,MACP,OAAA,EAAS,UAAA;AAAA,MACT,OAAA,EAAS,CAAC,YAAY;AAAA,KACxB;AAAA,IACA;AAAA,MACE,GAAA,EAAK,iBAAA;AAAA,MACL,KAAA,EAAO,kDAAA;AAAA,MACP,KAAA,EAAO,MAAA;AAAA,MACP,OAAA,EAAS,WAAA;AAAA,MACT,OAAA,EAAS,CAAC,YAAA,EAAc,eAAe;AAAA,KACzC;AAAA,IACA;AAAA,MACE,GAAA,EAAK,qBAAA;AAAA,MACL,KAAA,EAAO,mEAAA;AAAA,MACP,KAAA,EAAO,MAAA;AAAA,MACP,OAAA,EAAS,WAAA;AAAA,MACT,OAAA,EAAS,CAAC,cAAc;AAAA;AAC1B,GACF;AAAA;AAAA,EAEA,GAAGE,gBAAAA;AAAA,IACD,kBAAA;AAAA,IACA,CAAC,UAAA,KAAe;AACd,MAAA,IAAI,CAAC,UAAA,EAAY,MAAA,EAAQ,OAAO,EAAE,WAAW,KAAA,EAAM;AACnD,MAAA,MAAM,OAAA,GAAU,WAAW,QAAA,EAAU,SAAA;AACrC,MAAA,OAAO;AAAA,QACL,SAAA,EAAW,WAAW,MAAA,KAAW,WAAA;AAAA,QACjC,MAAA,EAAQ,OAAA,GAAU,CAAA,QAAA,EAAW,OAAO,CAAA,CAAA,GAAK,MAAA;AAAA,QACzC,KAAA,EAAO;AAAA,OACT;AAAA,IACF,CAAA;AAAA,IACA,EAAE,OAAO,oBAAA;AAAqB,GAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAA,EAAYD,mBAAmB,kBAAkB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMjD,gBAAgB,YAAY;AAC1B,IAAA,MAAM,sBAAqB,CAAE,IAAA,CAAK,EAAE,MAAA,EAAQ,MAAM,CAAA;AAAA,EACpD,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,YAAY;AAAE,IAAA,MAAM,oBAAA,GAAuB,UAAA,EAAW;AAAA,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA,EAIpE,cAAA,EACE,gGAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF,GAAG,eAAe,oBAAoB,CAAA;AAAA;AAAA;AAAA,EAGtC,gBAAgB,CAAC,OAAA,KAAY,mBAAA,CAAoB,OAAA,EAAS,SAAS,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA,EAIrE,WAAA,EAAa;AAAA,IACX;AAAA,MACE,GAAA,EAAK,WAAA;AAAA,MACL,KAAA,EAAO,mBAAA;AAAA,MACP,SAAA,EAAW,SAAA;AAAA;AAAA,MAEX,OAAA,EAAS,IAAA;AAAA,MACT,WAAA,EACE,iIAAA;AAAA,MACF,KAAK,YAAY;AACf,QAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAAU;AAC/B,QAAA,MAAM,IAAA,GAAO,OAAO,MAAA,CAAO,MAAA,CAAO,QAAQ,EAAE,EACzC,GAAA,CAAI,CAAC,QAAc,GAAA,EAAK,OAAA,GAAU,OAAO,GAAA,CAAI,OAAO,IAAI,IAAK,CAAA,CAC7D,OAAO,OAAO,CAAA;AACjB,QAAA,OAAO,CAAC,CAAA,EAAG,MAAA,CAAO,IAAA,EAAM,OAAA,IAAW,CAAC,CAAA,0BAAA,CAAA,EAA8B,GAAG,IAAI,CAAA,CAAE,IAAA,CAAK,QAAK,CAAA;AAAA,MACvF;AAAA,KACF;AAAA,IACA;AAAA,MACE,GAAA,EAAK,eAAA;AAAA,MACL,KAAA,EAAO,6BAAA;AAAA,MACP,SAAA,EAAW,SAAA;AAAA,MACX,WAAA,EAAa,6EAAA;AAAA,MACb,KAAK,YAAY;AACf,QAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,MAAM,CAAA;AACzC,QAAA,OAAO,CAAA,EAAG,OAAO,OAAO,CAAA,mBAAA,EAAsB,OAAO,QAAQ,CAAA,YAAA,EAAe,OAAO,OAAO,CAAA,cAAA,CAAA;AAAA,MAC5F;AAAA,KACF;AAAA,IACA;AAAA,MACE,GAAA,EAAK,eAAA;AAAA,MACL,KAAA,EAAO,iCAAA;AAAA,MACP,SAAA,EAAW,UAAA;AAAA,MACX,WAAA,EACE,uHAAA;AAAA;AAAA;AAAA,MAGF,OAAA,EAAS;AAAA,QACP,KAAA,EAAO,oCAAA;AAAA,QACP,IAAA,EACE,sMAAA;AAAA,QACF,GAAA,EAAK;AAAA,OACP;AAAA,MACA,OAAA,EAAS,eAAA;AAAA,MACT,KAAK,YAAY;AACf,QAAA,MAAM,MAAA,GAAS,MAAM,aAAA,EAAc;AACnC,QAAA,OAAO,EAAE,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,MAC1D;AAAA,KACF;AAAA,IACA;AAAA,MACE,GAAA,EAAK,YAAA;AAAA,MACL,KAAA,EAAO,yBAAA;AAAA,MACP,SAAA,EAAW,UAAA;AAAA,MACX,WAAA,EACE,uHAAA;AAAA,MACF,GAAA,EAAK,YAAA,CAAa,MAAM,SAAA,EAAU,EAAG;AAAA,KACvC;AAAA,IACA;AAAA,MACE,GAAA,EAAK,gBAAA;AAAA,MACL,KAAA,EAAO,8BAAA;AAAA,MACP,SAAA,EAAW,UAAA;AAAA,MACX,WAAA,EACE,6HAAA;AAAA,MACF,OAAA,EAAS;AAAA,QACP,KAAA,EAAO,kCAAA;AAAA,QACP,IAAA,EACE,0KAAA;AAAA,QACF,GAAA,EAAK;AAAA,OACP;AAAA,MACA,OAAA,EAAS,gBAAA;AAAA,MACT,KAAK,YAAY;AACf,QAAA,MAAM,MAAA,GAAS,MAAM,aAAA,EAAc;AACnC,QAAA,OAAO,EAAE,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,MAC1D;AAAA,KACF;AAAA,IACA;AAAA,MACE,GAAA,EAAK,aAAA;AAAA,MACL,KAAA,EAAO,gBAAA;AAAA,MACP,SAAA,EAAW,UAAA;AAAA,MACX,WAAA,EACE,iIAAA;AAAA,MACF,OAAA,EAAS;AAAA,QACP,KAAA,EAAO,iCAAA;AAAA,QACP,IAAA,EACE,uKAAA;AAAA,QACF,GAAA,EAAK;AAAA,OACP;AAAA,MACA,OAAA,EAAS,aAAA;AAAA,MACT,KAAK,YAAY;AACf,QAAA,MAAM,MAAA,GAAS,MAAM,UAAA,EAAW;AAChC,QAAA,OAAO,EAAE,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,MAC1D;AAAA;AACF;AAEJ;;;ACrTA,SAAS,SAAS,KAAA,EAA+B;AAC/C,EAAA,IAAI,UAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAI,OAAO,IAAA;AAClE,EAAA,MAAM,CAAA,GAAI,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,CAAE,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAC,CAAA;AACpF,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,GAAI,CAAA,GAAI,IAAA;AAClC;AASO,SAAS,kBAAkB,GAAA,EAA8D;AAC9F,EAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,EAAA,KAAO,IAAA,IAAQ,GAAA,CAAI,EAAA,KAAO,MAAA,IAAa,GAAA,CAAI,EAAA,KAAO,EAAA,EAAI,OAAO,IAAA;AAC7E,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAAA,IACzB,KAAK,GAAA,CAAI,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA,GAAI,IAAA;AAAA,IACvC,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,IAAA,IAAQ,EAAE,EAAE,IAAA,EAAK,IAAK,CAAA,QAAA,EAAW,GAAA,CAAI,EAAE,CAAA,CAAA;AAAA,IACxD,KAAA,EAAO,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA;AAAA;AAAA;AAAA,IAGzB,cAAA,EAAgB,QAAA,CAAS,GAAA,CAAI,OAAA,EAAS,iBAAiB,CAAA;AAAA,IACvD,MAAA,EAAQ,OAAO,GAAA,CAAI,QAAA,IAAY,GAAG,CAAA,CAAE,WAAA,EAAY,KAAM,GAAA,GAAM,QAAA,GAAW,UAAA;AAAA,IACvE,UAAU,GAAA,CAAI,SAAA,GAAY,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA,GAAI,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAKlD,WAAW,GAAA,CAAI,aAAA,GAAgB,MAAA,CAAO,GAAA,CAAI,aAAa,CAAA,GAAI;AAAA,GAC7D;AACF;ACkDO,SAAS,WAAA,CAAY,KAAa,YAAA,EAA4D;AACnG,EAAA,MAAM,MAAA,GAAS,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA,GAAI,GAAA;AACzD,EAAA,MAAM,OAAO,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,GAAI,SAAS,GAAA,GAAM,mBAAA;AACtD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,IAAA,EAAM,IAAI,IAAA,CAAK,IAAI,EAAE,WAAA,EAAY;AAAA,IACjC,EAAA,EAAI,IAAI,IAAA,CAAK,GAAG,EAAE,WAAA,EAAY;AAAA,IAC9B,SAAA,EAAW;AAAA,GACb;AACF;AAGO,SAAS,UAAU,OAAA,EAA4G;AACpI,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,IAAO,IAAA,CAAK,GAAA,EAAI;AACpC,EAAA,MAAM,WAAW,OAAA,CAAQ,MAAA;AACzB,EAAA,IAAI,UAAU,IAAA,KAAS,QAAA,EAAU,OAAO,aAAA,CAAc,UAAU,GAAG,CAAA;AAGnE,EAAA,OAAO,WAAA,CAAY,GAAA,EAAK,OAAA,CAAQ,YAAY,CAAA;AAC9C;AAWA,eAAsB,aAAa,OAAA,EAA2D;AAC5F,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,IAAO,IAAA,CAAK,GAAA,EAAI;AACpC,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,EAAE,MAAA,EAAQ,OAAA,CAAQ,QAAQ,YAAA,EAAc,OAAA,CAAQ,YAAA,EAAc,GAAA,EAAK,CAAA;AAC5F,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,iBAAA,CAAkB,gBAAgB,CAAA;AACrE,EAAA,MAAM,MAAA,GAAS,QAAQ,QAAA,IAAY,eAAA;AACnC,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,UAAA,IAAc,MAAA,CAAO,iBAAA;AAKhD,EAAA,MAAM,SAAS,WAAA,CAAY,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,IAAI,mBAAmB,CAAA;AAEtE,EAAA,MAAM,WAA8B,EAAC;AACrC,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,KAAA;AAEJ,EAAA,IAAI;AACF,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,QAAA,CAAS,UAAU,UAAA,EAAY;AACnC,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAyC;AAAA,QAC5D,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,IAAA,EAAM,MAAM,IAAA,EAAM,EAAA,EAAI,KAAA,CAAM,EAAA,EAAI,MAAA,EAAO;AAAA,QAC3D,QAAA,EAAU,QAAQ,QAAA,IAAY,GAAA;AAAA,QAC9B,SAAA,EAAW,OAAO,OAAA,KAAY;AAC5B,UAAA,MAAM,QAAQ,IAAA,EAAK;AACnB,UAAA,KAAA,IAAS,CAAA;AACT,UAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,SAAA,CAAU,OAAO,CAAA;AAC5C,UAAA,KAAA,IAAS,CAAA;AACT,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,EAAC;AAI7B,UAAA,MAAM,OAAO,IAAA,CAAK,KAAA,KAAU,IAAA,IAAQ,KAAA,CAAM,SAAS,OAAA,CAAQ,MAAA;AAC3D,UAAA,MAAM,MAAA,GAAS,QAAA,CAAS,MAAA,GAAS,KAAA,CAAM,MAAA,IAAU,UAAA;AACjD,UAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,IAAQ,MAAA,GAAS,IAAA,GAAO,EAAE,GAAG,OAAA,EAAS,MAAA,EAAQ,OAAA,CAAQ,MAAA,GAAS,GAAE,EAAE;AAAA,QAC3F;AAAA,OACD,CAAA;AAED,MAAA,KAAA,MAAW,GAAA,IAAO,OAAO,KAAA,EAAO;AAC9B,QAAA,IAAI,QAAA,CAAS,UAAU,UAAA,EAAY;AACnC,QAAA,MAAM,MAAA,GAAS,kBAAkB,GAAG,CAAA;AACpC,QAAA,IAAI,CAAC,MAAA,EAAQ;AACb,QAAA,IAAA,CAAK,GAAA,CAAI,OAAO,UAAU,CAAA;AAC1B,QAAA,QAAA,CAAS,KAAK,MAAM,CAAA;AACpB,QAAA,IAAI,MAAM,OAAA,CAAQ,MAAA,CAAO,MAAM,GAAG,OAAA,IAAW,CAAA;AAAA,MAC/C;AAAA,IACF;AAAA,EACF,SAAS,MAAA,EAAQ;AACf,IAAA,KAAA,GAAQ,MAAA,CAAQ,MAAA,EAAkB,OAAA,IAAW,MAAM,CAAA;AAAA,EACrD;AAKA,EAAA,MAAM,aAAa,eAAA,CAAgB;AAAA,IACjC,YAAA,EAAc,UAAA;AAAA,IACd,QAAA,EAAU,IAAA;AAAA,IACV,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU;AAAC,GAC5B,CAAA;AAED,EAAA,MAAM,QAAA,GAAmB,KAAA,GAAQ,MAAA,GAAS,EAAE,GAAG,MAAA,EAAO;AACtD,EAAA,OAAO;AAAA,IACL,QAAQ,KAAA,GAAQ,OAAA,GAAU,QAAA,CAAS,MAAA,IAAU,aAAa,SAAA,GAAY,SAAA;AAAA,IACtE,YAAA,EAAc,UAAA;AAAA,IACd,SAAS,QAAA,CAAS,MAAA;AAAA,IAClB,OAAA;AAAA,IACA,MAAA,EAAQ,QAAA;AAAA,IACR,gBAAgB,UAAA,CAAW,cAAA;AAAA,IAC3B,QAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA,EAAO;AAAA,MACL,KAAA;AAAA,MACA,KAAA;AAAA,MACA,aAAa,MAAA,CAAO,IAAA;AAAA,MACpB,WAAW,MAAA,CAAO,EAAA;AAAA,MAClB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,iBAAA,EAAmB,WAAW,cAAA,CAAe,MAAA;AAAA,MAC7C,MAAA,EAAQ,gBAAgB,QAAQ;AAAA;AAClC,GACF;AACF;AAQO,SAAS,eACd,OAAA,EAC6B;AAC7B,EAAA,OAAO,YAAA,CAAa;AAAA,IAClB,GAAG,OAAA;AAAA,IACH,UAAA,EAAY,QAAQ,UAAA,IAAc,iBAAA;AAAA,IAClC,QAAA,EAAU,CAAA;AAAA;AAAA;AAAA,IAGV,QAAQ;AAAC,GACV,CAAA;AACH;;;ACpLO,IAAM,wBAAA,GAA2B;AAMjC,SAAS,cAAc,QAAA,EAAwC;AACpE,EAAA,MAAM,OAAA,GAAU,SAAS,SAAA,GAAY,MAAA,CAAO,SAAS,SAAS,CAAA,CAAE,MAAK,GAAI,EAAA;AACzE,EAAA,IAAI,QAAA,CAAS,KAAA,EAAO,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,QAAA,CAAS,KAAA,EAAO,kBAAA,EAAoB,OAAA,IAAW,IAAA,EAAK;AACxG,EAAA,IAAI,OAAA,SAAgB,EAAE,IAAA,EAAM,UAAU,kBAAA,EAAoB,OAAA,EAAS,QAAQ,wBAAA,EAAyB;AACpG,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,8CAAA,EAA+C;AAClF;AAGO,SAAS,iBAAiB,KAAA,EAAmD;AAClF,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,kBAAA;AAAA;AAAA;AAAA,IAGb,aAAa,KAAA,CAAM,kBAAA;AAAA,IACnB,oBAAoB,KAAA,CAAM,kBAAA;AAAA,IAC1B,MAAA,EAAQ,SAAA;AAAA,IACR,QAAA,EAAU,EAAE,SAAA,EAAW,KAAA,CAAM,oBAAoB,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,UAAA,EAAY,OAAA;AAAiB,GACtG;AACF;AAgDA,eAAsB,aAAA,CAAc,SAAyB,OAAA,EAAwD;AACnH,EAAA,IAAI,EAAA,GAAK,KAAA;AACT,EAAA,IAAI;AACF,IAAA,EAAA,GAAK,MAAM,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAM,QAAQ,SAAS,CAAA;AAAA,EAC3D,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,UAAU,KAAK,CAAA;AACvB,IAAA,EAAA,GAAK,KAAA;AAAA,EACP;AAGA,EAAA,IAAI,CAAC,IAAI,OAAO,EAAE,QAAQ,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,WAAA,EAAY;AAElE,EAAA,MAAM,UAAU,OAAA,CAAQ,kBAAA,GAAqB,MAAA,CAAO,OAAA,CAAQ,kBAAkB,CAAA,GAAI,EAAA;AAClF,EAAA,IAAI,CAAC,SAAS,OAAO,EAAE,QAAQ,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,uBAAA,EAAwB;AAEnF,EAAA,IAAI,MAAA,GAA4D,IAAA;AAChE,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,MAAM,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA;AAAA,EACxC,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,UAAU,KAAK,CAAA;AAAA,EACzB;AACA,EAAA,IAAI,CAAC,QAAQ,OAAO,EAAE,QAAQ,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,mBAAA,EAAoB;AAE9E,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,CAAQ,QAAQ,EAAE,GAAG,QAAQ,IAAA,EAAM,OAAA,CAAQ,MAAM,CAAA;AAAA,EACzD,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,UAAU,KAAK,CAAA;AAIvB,IAAA,OAAO,EAAE,MAAA,EAAQ,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,QAAQ,gBAAA,EAAiB;AAAA,EAChE;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAK;AACrC;AC/HA,IAAM,MAAA,GAAS,qBAAA;AACf,IAAM,KAAA,GAAQ,0BAAA;AACd,IAAM,SAAA,GAAY,wBAAA;AAClB,IAAM,QAAA,GAAW,uBAAA;AAEjB,IAAM,SAAA,GAAY,wBAAA;AAOlB,IAAM,GAAA,GAAM;AAAA,EACV,KAAA,EAAO,EAAA,CAAG,OAAA,EAAS,QAAQ,CAAA;AAAA,EAC3B,MAAA,EAAQ,EAAA,CAAG,QAAA,EAAU,SAAS,CAAA;AAAA,EAC9B,QAAA,EAAU,EAAA,CAAG,UAAA,EAAY,UAAU,CAAA;AAAA,EACnC,SAAA,EAAW,EAAA,CAAG,WAAA,EAAa,UAAU,CAAA;AAAA,EACrC,SAAA,EAAW,EAAA,CAAG,WAAA,EAAa,SAAS,CAAA;AAAA,EACpC,WAAA,EAAa,EAAA,CAAG,aAAA,EAAe,SAAS,CAAA;AAAA,EACxC,SAAA,EAAW,EAAA,CAAG,WAAA,EAAa,WAAW;AACxC,CAAA;AAIA,IAAM,eAAA,GAAsC;AAAA,EAC1C,GAAA,EAAK,kBAAA;AAAA,EACL,KAAA,EAAO,EAAA,CAAG,gBAAA,EAAkB,6BAAuB,CAAA;AAAA,EACnD,IAAA,EAAM,aAAA;AAAA,EACN,KAAA,EAAO,EAAA,CAAG,sBAAA,EAAwB,yBAAyB,CAAA;AAAA,EAC3D,OAAA,EAAS;AAAA,IACP,EAAE,KAAA,EAAO,EAAA,CAAG,QAAQ,MAAM,CAAA,EAAG,OAAO,MAAA,EAAO;AAAA,IAC3C,EAAE,KAAA,EAAO,EAAA,CAAG,WAAW,UAAU,CAAA,EAAG,OAAO,SAAA,EAAU;AAAA,IACrD,EAAE,KAAA,EAAO,EAAA,CAAG,kBAAkB,mBAAmB,CAAA,EAAG,OAAO,gBAAA,EAAiB;AAAA,IAC5E,EAAE,KAAA,EAAO,EAAA,CAAG,YAAY,WAAW,CAAA,EAAG,OAAO,UAAA,EAAW;AAAA,IACxD,EAAE,KAAA,EAAO,EAAA,CAAG,sBAAsB,wBAAwB,CAAA,EAAG,OAAO,oBAAA,EAAqB;AAAA,IACzF,EAAE,KAAA,EAAO,EAAA,CAAG,UAAU,WAAW,CAAA,EAAG,OAAO,QAAA;AAAS;AAExD,CAAA;AAEA,IAAM,iBAAA,GAAwC;AAAA,EAC5C,GAAA,EAAK,oBAAA;AAAA,EACL,KAAA,EAAO,EAAA,CAAG,oBAAA,EAAsB,2BAAqB,CAAA;AAAA,EACrD,IAAA,EAAM,aAAA;AAAA,EACN,KAAA,EAAO,EAAA,CAAG,aAAA,EAAe,SAAS,CAAA;AAAA,EAClC,OAAA,EAAS;AAAA,IACP,EAAE,KAAA,EAAO,EAAA,CAAG,aAAa,SAAS,CAAA,EAAG,OAAO,WAAA,EAAY;AAAA,IACxD,EAAE,KAAA,EAAO,EAAA,CAAG,uBAAuB,sBAAsB,CAAA,EAAG,OAAO,qBAAA,EAAsB;AAAA,IACzF,EAAE,KAAA,EAAO,EAAA,CAAG,eAAe,gBAAa,CAAA,EAAG,OAAO,aAAA;AAAc;AAEpE,CAAA;AAEA,IAAM,WAAA,GAAkC;AAAA,EACtC,GAAA,EAAK,QAAA;AAAA,EACL,KAAA,EAAO,EAAA,CAAG,cAAA,EAAgB,0BAAoB,CAAA;AAAA,EAC9C,IAAA,EAAM,aAAA;AAAA,EACN,KAAA,EAAO,EAAA,CAAG,QAAA,EAAU,SAAS,CAAA;AAAA,EAC7B,OAAA,EAAS;AAAA,IACP,EAAE,KAAA,EAAO,EAAA,CAAG,QAAQ,QAAQ,CAAA,EAAG,OAAO,MAAA,EAAO;AAAA,IAC7C,EAAE,KAAA,EAAO,EAAA,CAAG,YAAY,WAAW,CAAA,EAAG,OAAO,UAAA,EAAW;AAAA,IACxD,EAAE,KAAA,EAAO,EAAA,CAAG,aAAa,WAAW,CAAA,EAAG,OAAO,WAAA;AAAY;AAE9D,CAAA;AAIA,IAAM,mBAAA,GAA0C;AAAA,EAC9C,GAAG,eAAA;AAAA,EACH,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,aAAA,GAAoC;AAAA,EACxC,GAAA,EAAK,QAAA;AAAA,EACL,KAAA,EAAO,EAAA,CAAG,gBAAA,EAAkB,2BAAqB,CAAA;AAAA,EACjD,IAAA,EAAM,aAAA;AAAA,EACN,KAAA,EAAO,EAAA,CAAG,WAAA,EAAa,SAAS,CAAA;AAAA,EAChC,OAAA,EAAS;AAAA,IACP,EAAE,KAAA,EAAO,EAAA,CAAG,UAAU,OAAO,CAAA,EAAG,OAAO,QAAA,EAAS;AAAA,IAChD,EAAE,KAAA,EAAO,EAAA,CAAG,SAAS,UAAU,CAAA,EAAG,OAAO,OAAA,EAAQ;AAAA,IACjD,EAAE,KAAA,EAAO,EAAA,CAAG,YAAY,WAAW,CAAA,EAAG,OAAO,UAAA;AAAW;AAE5D,CAAA;AAEA,IAAM,YAAA,GAAe,CAAC,eAAA,EAAiB,iBAAA,EAAmB,WAAW,CAAA;AAIrE,IAAM,CAAA,GAAI;AAAA,EACR,UAAA,EAAY,EAAE,GAAA,EAAK,aAAA,EAAe,KAAA,EAAO,EAAA,CAAG,aAAA,EAAe,eAAe,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAW;AAAA,EAC5G,SAAA,EAAW,EAAE,GAAA,EAAK,WAAA,EAAa,KAAA,EAAO,EAAA,CAAG,WAAA,EAAa,WAAW,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAW;AAAA,EACnG,QAAA,EAAU,EAAE,GAAA,EAAK,WAAA,EAAa,KAAA,EAAO,EAAA,CAAG,WAAA,EAAa,oBAAiB,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAW;AAAA,EACxG,QAAA,EAAU,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,EAAA,CAAG,UAAA,EAAY,OAAO,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAW;AAAA,EAC5F,KAAA,EAAO,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,EAAA,CAAG,OAAA,EAAS,UAAU,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAW;AAAA,EACtF,KAAA,EAAO,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,EAAA,CAAG,aAAA,EAAe,eAAe,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAW;AAAA,EACjG,IAAA,EAAM,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,WAAA,EAAa,UAAU,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAW;AAAA,EAC9F,MAAA,EAAQ,EAAE,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,EAAA,CAAG,QAAA,EAAU,SAAS,CAAA,EAAG,GAAA,EAAK,OAAA,EAAS,MAAA,EAAQ,QAAA;AACjF,CAAA;AAGA,IAAM,GAAA,GAAwB;AAAA,EAC5B,GAAA,EAAK,KAAA;AAAA,EACL,KAAA,EAAO,EAAA,CAAG,qBAAA,EAAuB,iBAAc,CAAA;AAAA,EAC/C,GAAA,EAAK,OAAA;AAAA,EACL,OAAA,EAAS,CAAC,OAAA,EAAS,QAAQ,CAAA;AAAA,EAC3B,MAAA,EAAQ;AACV,CAAA;AAEO,SAAS,uBAAA,GAA8C;AAC5D,EAAA,MAAM,OAAO,EAAE,MAAA,EAAQ,QAAQ,cAAA,EAAgB,SAAA,EAAW,SAAS,IAAA,EAAK;AAExE,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA,IAIL;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,kBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,aAAA,EAAe,eAAe,CAAA;AAAA,MACvC,WAAA,EAAa,EAAA;AAAA,QACX,0FAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,kBAAA;AAAA,MACN,UAAU,GAAA,CAAI,KAAA;AAAA,MACd,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACrC,UAAA,EAAY,CAAC,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,MAAA,EAAQ,MAAM,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,QAC5E,QAAA,EAAU,CAAC,CAAA,CAAE,KAAK,CAAA;AAAA,QAClB,OAAA,EAAS;AAAA,OACX;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,KAAA,EAAO,OAAO,IAAA,EAAK;AAAA,MAChC,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,CAAA;AAAE,KACjC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,MAIE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,gBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,WAAA,EAAa,UAAU,CAAA;AAAA,MAChC,WAAA,EAAa,EAAA;AAAA,QACX,qEAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,UAAA;AAAA,MACN,UAAU,GAAA,CAAI,KAAA;AAAA,MACd,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACrC,UAAA,EAAY,CAAC,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,MAAA,EAAQ,MAAM,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,QAC5E,QAAA,EAAU,CAAC,CAAA,CAAE,IAAI,CAAA;AAAA,QACjB,OAAA,EAAS;AAAA,OACX;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,KAAA,EAAO,OAAO,IAAA,EAAK;AAAA,MAChC,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,CAAA;AAAE,KACjC;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,aAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,QAAA,EAAU,SAAS,CAAA;AAAA,MAC5B,WAAA,EAAa,EAAA;AAAA,QACX,sDAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,cAAA;AAAA,MACN,UAAU,GAAA,CAAI,MAAA;AAAA,MACd,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACrC,UAAA,EAAY,CAAC,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,MAAA,EAAQ,MAAM,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,QAC5E,QAAA,EAAU,CAAC,CAAA,CAAE,MAAM,CAAA;AAAA,QACnB,OAAA,EAAS;AAAA,OACX;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,KAAA,EAAO,OAAO,IAAA,EAAK;AAAA,MAChC,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,CAAA;AAAE,KACjC;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,UAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,qBAAA,EAAuB,iBAAc,CAAA;AAAA,MAC9C,WAAA,EAAa,EAAA;AAAA,QACX,6FAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,SAAA;AAAA,MACN,UAAU,GAAA,CAAI,KAAA;AAAA,MACd,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACrC,UAAU,CAAC,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,QAAQ,GAAG,CAAA;AAAA,QACjC,OAAA,EAAS;AAAA,OACX;AAAA,MACA,KAAK,EAAE,IAAA,EAAM,OAAO,QAAA,EAAU,CAAC,KAAK,CAAA,EAAE;AAAA,MACtC,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,CAAA;AAAE,KACjC;AAAA;AAAA;AAAA;AAAA,IAKA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,sBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,iBAAA,EAAmB,kBAAkB,CAAA;AAAA,MAC9C,WAAA,EAAa,EAAA;AAAA,QACX,+DAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,OAAA;AAAA,MACN,UAAU,GAAA,CAAI,MAAA;AAAA,MACd,KAAA,EAAO,YAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,KAAA,EAAM;AAAA,QACpC,QAAA,EAAU;AAAA,UACR,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,EAAA,CAAG,OAAA,EAAS,UAAU,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAY,QAAQ,QAAA,EAAS;AAAA;AAAA;AAAA,UAGjG,EAAE,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,EAAA,CAAG,QAAA,EAAU,SAAS,CAAA,EAAG,GAAA,EAAK,gBAAA,EAAkB,MAAA,EAAQ,UAAA,EAAY,QAAQ,QAAA,EAAS;AAAA,UAC7G;AAAA,YACE,GAAA,EAAK,iBAAA;AAAA,YAAmB,KAAA,EAAO,EAAA,CAAG,iBAAA,EAAmB,kBAAkB,CAAA;AAAA,YACvE,GAAA,EAAK,OAAA;AAAA,YAAS,OAAA,EAAS,CAAC,OAAA,EAAS,QAAQ,CAAA;AAAA,YAAG,MAAA,EAAQ;AAAA;AACtD,SACF;AAAA,QACA,OAAA,EAAS,CAAC,mBAAmB;AAAA,OAC/B;AAAA,MACA,KAAK,EAAE,IAAA,EAAM,OAAO,QAAA,EAAU,CAAC,iBAAiB,CAAA,EAAE;AAAA,MAClD,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,CAAA;AAAE,KACjC;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,iBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,YAAA,EAAc,mBAAmB,CAAA;AAAA,MAC1C,WAAA,EAAa,EAAA,CAAG,8CAAA,EAAgD,8DAAwD,CAAA;AAAA,MACxH,IAAA,EAAM,SAAA;AAAA,MACN,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,KAAA,EAAO,YAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,KAAA,EAAM;AAAA,QACpC,UAAA,EAAY,CAAC,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,MAAA,EAAQ,MAAM,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,QAC5E,UAAU,CAAC,EAAE,GAAA,EAAK,OAAA,EAAS,OAAO,EAAA,CAAG,OAAA,EAAS,UAAU,CAAA,EAAG,KAAK,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAY,MAAA,EAAQ,UAAU,CAAA;AAAA,QAC7G,OAAA,EAAS,CAAC,mBAAmB;AAAA,OAC/B;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,KAAA,EAAO,OAAO,IAAA,EAAK;AAAA,MAChC,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,CAAA;AAAE,KACjC;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,8BAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,yBAAA,EAA2B,kBAAkB,CAAA;AAAA,MACtD,WAAA,EAAa,EAAA;AAAA,QACX,2DAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,QAAA;AAAA,MACN,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACrC,QAAA,EAAU;AAAA,UACR,EAAE,GAAA,EAAK,WAAA,EAAa,KAAA,EAAO,EAAA,CAAG,kBAAA,EAAoB,+BAA4B,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,cAAA,EAAgB,QAAQ,QAAA,EAAS;AAAA,UACtI,CAAA,CAAE,MAAA;AAAA,UACF;AAAA,YACE,GAAA,EAAK,gBAAA;AAAA,YAAkB,KAAA,EAAO,EAAA,CAAG,yBAAA,EAA2B,kBAAkB,CAAA;AAAA,YAC9E,GAAA,EAAK,OAAA;AAAA,YAAS,OAAA,EAAS,CAAC,WAAA,EAAa,QAAQ,CAAA;AAAA,YAAG,KAAA,EAAO,GAAA;AAAA,YAAK,MAAA,EAAQ;AAAA;AACtE,SACF;AAAA,QACA,OAAA,EAAS;AAAA,OACX;AAAA,MACA,KAAK,EAAE,IAAA,EAAM,OAAO,QAAA,EAAU,CAAC,gBAAgB,CAAA,EAAE;AAAA,MACjD,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,CAAA;AAAE,KACjC;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,wBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,mBAAA,EAAqB,sBAAsB,CAAA;AAAA,MACpD,WAAA,EAAa,EAAA;AAAA,QACX,oDAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,SAAA;AAAA,MACN,UAAU,GAAA,CAAI,MAAA;AAAA,MACd,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACrC,QAAA,EAAU;AAAA,UACR,EAAE,GAAA,EAAK,WAAA,EAAa,KAAA,EAAO,EAAA,CAAG,kBAAA,EAAoB,oBAAoB,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,cAAA,EAAgB,QAAQ,QAAA,EAAS;AAAA,UAC9H,CAAA,CAAE,MAAA;AAAA,UACF;AAAA,YACE,GAAA,EAAK,mBAAA;AAAA,YAAqB,KAAA,EAAO,EAAA,CAAG,mBAAA,EAAqB,sBAAsB,CAAA;AAAA,YAC/E,GAAA,EAAK,OAAA;AAAA,YAAS,OAAA,EAAS,CAAC,WAAA,EAAa,QAAQ,CAAA;AAAA,YAAG,KAAA,EAAO,GAAA;AAAA,YAAK,MAAA,EAAQ;AAAA;AACtE,SACF;AAAA,QACA,OAAA,EAAS;AAAA,OACX;AAAA,MACA,KAAK,EAAE,IAAA,EAAM,OAAO,QAAA,EAAU,CAAC,mBAAmB,CAAA,EAAE;AAAA,MACpD,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,CAAA;AAAE,KACjC;AAAA;AAAA;AAAA;AAAA,IAKA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,0BAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,kBAAA,EAAoB,sBAAmB,CAAA;AAAA,MAChD,WAAA,EAAa,EAAA;AAAA,QACX,2GAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,OAAA;AAAA,MACN,UAAU,GAAA,CAAI,WAAA;AAAA,MACd,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACrC,UAAU,CAAC;AAAA,UACT,GAAA,EAAK,sBAAA;AAAA,UACL,KAAA,EAAO,EAAA,CAAG,kBAAA,EAAoB,sBAAmB,CAAA;AAAA,UACjD,GAAA,EAAK,KAAA;AAAA,UACL,MAAA,EAAQ;AAAA,SACT,CAAA;AAAA,QACD,OAAA,EAAS;AAAA,OACX;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,KAAA,EAAM;AAAA,MACnB,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,CAAA;AAAE,KACjC;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,sBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,iBAAA,EAAmB,sBAAsB,CAAA;AAAA,MAClD,WAAA,EAAa,EAAA;AAAA,QACX,2DAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,eAAA;AAAA,MACN,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACrC,UAAA,EAAY,CAAC,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,MAAA,EAAQ,MAAM,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,QAC5E,QAAA,EAAU,CAAC,CAAA,CAAE,SAAS,CAAA;AAAA,QACtB,OAAA,EAAS;AAAA,OACX;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,KAAA,EAAO,OAAO,IAAA,EAAK;AAAA,MAChC,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,CAAA;AAAE,KACjC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,MAIE,GAAG,IAAA;AAAA,MACH,OAAA,EAAS,KAAA;AAAA,MACT,EAAA,EAAI,sBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,iBAAA,EAAmB,kBAAkB,CAAA;AAAA,MAC9C,WAAA,EAAa,EAAA;AAAA,QACX,wFAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,WAAA;AAAA,MACN,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,KAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,QAAA,EAAS;AAAA,QACvC,UAAA,EAAY,IAAA;AAAA,QACZ,QAAA,EAAU,CAAC,EAAE,GAAA,EAAK,0BAA0B,KAAA,EAAO,EAAA,CAAG,iBAAA,EAAmB,kBAAkB,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,YAAY,CAAA;AAAA,QAC9H,OAAA,EAAS,CAAC,aAAa;AAAA,OACzB;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,KAAA,EAAM;AAAA,MACnB,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,EAAA;AAAG,KAClC;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,OAAA,EAAS,KAAA;AAAA,MACT,EAAA,EAAI,mBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,cAAA,EAAgB,aAAa,CAAA;AAAA,MACtC,WAAA,EAAa,EAAA;AAAA,QACX,kFAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,UAAA;AAAA,MACN,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,KAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,QAAA,EAAS;AAAA,QACvC,UAAA,EAAY,IAAA;AAAA,QACZ,QAAA,EAAU,CAAC,EAAE,GAAA,EAAK,mBAAmB,KAAA,EAAO,EAAA,CAAG,cAAA,EAAgB,aAAa,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AAAA,QAC7G,OAAA,EAAS,CAAC,aAAa;AAAA,OACzB;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,KAAA,EAAM;AAAA,MACnB,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,EAAA;AAAG,KAClC;AAAA;AAAA;AAAA;AAAA,IAKA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,sBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,iBAAA,EAAmB,0BAA0B,CAAA;AAAA,MACtD,WAAA,EAAa,EAAA;AAAA,QACX,kFAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,YAAA;AAAA,MACN,UAAU,GAAA,CAAI,KAAA;AAAA,MACd,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACrC,UAAA,EAAY,CAAC,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,MAAA,EAAQ,MAAM,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,QAC5E,QAAA,EAAU,CAAC,CAAA,CAAE,KAAA,EAAO,EAAE,IAAI,CAAA;AAAA,QAC1B,OAAA,EAAS,YAAA;AAAA,QACT,WAAA,EAAa,YAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,MACpB,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,EAAA;AAAG,KAClC;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,uBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,kBAAA,EAAoB,2BAA2B,CAAA;AAAA,MACxD,WAAA,EAAa,EAAA,CAAG,iCAAA,EAAmC,2CAAwC,CAAA;AAAA,MAC3F,IAAA,EAAM,UAAA;AAAA,MACN,UAAU,GAAA,CAAI,MAAA;AAAA,MACd,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACrC,UAAA,EAAY,CAAC,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,MAAA,EAAQ,MAAM,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,QAC5E,QAAA,EAAU,CAAC,CAAA,CAAE,MAAM,CAAA;AAAA,QACnB,OAAA,EAAS,YAAA;AAAA,QACT,WAAA,EAAa,YAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,MACpB,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,EAAA;AAAG,KAClC;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,uBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,kBAAA,EAAoB,oBAAoB,CAAA;AAAA,MACjD,WAAA,EAAa,EAAA;AAAA,QACX,wFAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,SAAA;AAAA,MACN,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,KAAA,EAAO,YAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,KAAA,EAAM;AAAA,QACpC,UAAA,EAAY,CAAC,EAAE,GAAA,EAAK,cAAA,EAAgB,OAAO,EAAA,CAAG,SAAA,EAAW,SAAS,CAAA,EAAG,CAAA;AAAA,QACrE,QAAA,EAAU;AAAA,UACR,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,EAAA,CAAG,SAAA,EAAW,SAAS,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,YAAA,EAAc,QAAQ,UAAA,EAAW;AAAA,UACxG,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,EAAA,CAAG,OAAA,EAAS,UAAU,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAY,QAAQ,QAAA;AAAS,SACnG;AAAA,QACA,OAAA,EAAS,CAAC,mBAAmB,CAAA;AAAA,QAC7B,WAAA,EAAa,SAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,WAAA,EAAa,UAAU,CAAC,SAAS,CAAA,EAAG,KAAA,EAAO,CAAA,EAAE;AAAA,MAC1D,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,EAAA;AAAG,KAClC;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,wBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,mBAAA,EAAqB,sBAAsB,CAAA;AAAA,MACpD,WAAA,EAAa,EAAA,CAAG,4CAAA,EAA8C,sDAAmD,CAAA;AAAA,MACjH,IAAA,EAAM,YAAA;AAAA,MACN,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,KAAA,EAAO,YAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,KAAA,EAAM;AAAA,QACpC,UAAA,EAAY,CAAC,EAAE,GAAA,EAAK,eAAA,EAAiB,OAAO,EAAA,CAAG,UAAA,EAAY,WAAW,CAAA,EAAG,CAAA;AAAA,QACzE,UAAU,CAAC,EAAE,GAAA,EAAK,SAAA,EAAW,OAAO,EAAA,CAAG,SAAA,EAAW,SAAS,CAAA,EAAG,KAAK,KAAA,EAAO,MAAA,EAAQ,YAAA,EAAc,MAAA,EAAQ,YAAY,CAAA;AAAA,QACpH,OAAA,EAAS,CAAC,mBAAmB,CAAA;AAAA,QAC7B,WAAA,EAAa,SAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,OAAA,EAAQ;AAAA,MACrB,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,EAAA;AAAG,KAClC;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,8BAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,yBAAA,EAA2B,wCAAkC,CAAA;AAAA,MACtE,WAAA,EAAa,EAAA,CAAG,gDAAA,EAAkD,qDAAkD,CAAA;AAAA,MACpH,IAAA,EAAM,YAAA;AAAA,MACN,UAAU,GAAA,CAAI,KAAA;AAAA,MACd,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACrC,UAAA,EAAY,CAAC,EAAE,GAAA,EAAK,kBAAA,EAAoB,OAAO,EAAA,CAAG,gBAAA,EAAkB,6BAAuB,CAAA,EAAG,CAAA;AAAA,QAC9F,QAAA,EAAU,CAAC,CAAA,CAAE,KAAA,EAAO,EAAE,MAAM,CAAA;AAAA,QAC5B,OAAA,EAAS,CAAC,WAAW,CAAA;AAAA,QACrB,WAAA,EAAa,OAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,KAAK,EAAE,IAAA,EAAM,aAAa,QAAA,EAAU,CAAC,OAAO,CAAA,EAAE;AAAA,MAC9C,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,EAAA;AAAG,KAClC;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,mCAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,8BAAA,EAAgC,uCAAiC,CAAA;AAAA,MAC1E,WAAA,EAAa,EAAA;AAAA,QACX,iEAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,OAAA;AAAA,MACN,UAAU,GAAA,CAAI,WAAA;AAAA,MACd,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACrC,UAAA,EAAY,CAAC,EAAE,GAAA,EAAK,oBAAA,EAAsB,OAAO,EAAA,CAAG,oBAAA,EAAsB,2BAAqB,CAAA,EAAG,CAAA;AAAA,QAClG,QAAA,EAAU,CAAC,CAAA,CAAE,MAAA,EAAQ,EAAE,KAAK,CAAA;AAAA,QAC5B,OAAA,EAAS,CAAC,eAAA,EAAiB,WAAW,CAAA;AAAA,QACtC,WAAA,EAAa,QAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,KAAK,EAAE,IAAA,EAAM,aAAa,QAAA,EAAU,CAAC,QAAQ,CAAA,EAAE;AAAA,MAC/C,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,EAAA;AAAG,KAClC;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,oBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,eAAA,EAAiB,gBAAgB,CAAA;AAAA,MAC1C,WAAA,EAAa,EAAA,CAAG,mDAAA,EAAqD,6DAA0D,CAAA;AAAA,MAC/H,IAAA,EAAM,UAAA;AAAA,MACN,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,KAAA,EAAO,UAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,SAAA,EAAU;AAAA,QACxC,UAAA,EAAY,CAAC,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,MAAA,EAAQ,MAAM,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,QAC5E,QAAA,EAAU,CAAC,EAAE,GAAA,EAAK,aAAa,KAAA,EAAO,EAAA,CAAG,eAAA,EAAiB,gBAAgB,CAAA,EAAG,GAAA,EAAK,OAAA,EAAS,MAAA,EAAQ,UAAU,CAAA;AAAA,QAC7G,WAAA,EAAa,YAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,KAAA,EAAM;AAAA,MACnB,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,EAAA;AAAG,KAClC;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,oBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,+BAAA,EAAiC,mCAAgC,CAAA;AAAA,MAC1E,WAAA,EAAa,EAAA;AAAA,QACX,gFAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,WAAA;AAAA,MACN,UAAU,GAAA,CAAI,KAAA;AAAA,MACd,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACrC,UAAA,EAAY,CAAC,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,MAAA,EAAQ,MAAM,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,QAC5E,UAAU,CAAC,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,QAAQ,GAAG,CAAA;AAAA,QACjC,OAAA,EAAS,YAAA;AAAA,QACT,WAAA,EAAa,YAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,KAAK,EAAE,IAAA,EAAM,QAAQ,QAAA,EAAU,CAAC,KAAK,CAAA,EAAE;AAAA,MACvC,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,EAAA;AAAG,KAClC;AAAA;AAAA;AAAA;AAAA,IAKA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,sBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,iBAAA,EAAmB,6BAAuB,CAAA;AAAA,MACnD,WAAA,EAAa,EAAA;AAAA,QACX,wGAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,QAAA;AAAA,MACN,UAAU,GAAA,CAAI,KAAA;AAAA,MACd,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACrC,QAAA,EAAU,CAAC,CAAA,CAAE,UAAA,EAAY,EAAE,SAAA,EAAW,CAAA,CAAE,QAAA,EAAU,CAAA,CAAE,UAAU,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,EAAE,IAAI,CAAA;AAAA,QACtF,OAAA,EAAS;AAAA,OACX;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,OAAA,EAAQ;AAAA,MACrB,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,EAAA;AAAG,KAClC;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,OAAA,EAAS,KAAA;AAAA,MACT,EAAA,EAAI,gBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,aAAA,EAAe,kBAAkB,CAAA;AAAA,MAC1C,WAAA,EAAa,EAAA;AAAA,QACX,8FAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,cAAA;AAAA,MACN,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,KAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,QAAA,EAAS;AAAA,QACvC,UAAA,EAAY,IAAA;AAAA,QACZ,UAAA,EAAY,CAAC,EAAE,GAAA,EAAK,cAAA,EAAgB,OAAO,EAAA,CAAG,SAAA,EAAW,SAAS,CAAA,EAAG,CAAA;AAAA,QACrE,QAAA,EAAU;AAAA,UACR,EAAE,GAAA,EAAK,iBAAA,EAAmB,KAAA,EAAO,EAAA,CAAG,SAAA,EAAW,YAAY,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAS;AAAA,UAC3F,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,YAAA,EAAc,UAAU,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,QAAA;AAAS,SACzF;AAAA;AAAA;AAAA,QAGA,OAAA,EAAS,CAAC,EAAE,GAAG,eAAe,YAAA,EAAc,CAAC,QAAQ,CAAA,EAAG,CAAA;AAAA,QACxD,WAAA,EAAa,iBAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,CAAA,EAAE;AAAA,MAC/B,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,EAAA;AAAG,KAClC;AAAA;AAAA;AAAA;AAAA,IAKA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,6BAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,wBAAA,EAA0B,kBAAkB,CAAA;AAAA,MACrD,WAAA,EAAa,EAAA;AAAA,QACX,iFAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,aAAA;AAAA,MACN,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACrC,UAAA,EAAY,CAAC,EAAE,GAAA,EAAK,eAAA,EAAiB,OAAO,EAAA,CAAG,eAAA,EAAiB,OAAO,CAAA,EAAG,CAAA;AAAA,QAC1E,QAAA,EAAU,CAAC,CAAA,CAAE,MAAA,EAAQ,EAAE,SAAA,EAAW,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,IAAI,CAAA;AAAA,QACjD,OAAA,EAAS,YAAA;AAAA,QACT,WAAA,EAAa,WAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,OAAA;AAAQ,KACvB;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,OAAA,EAAS,KAAA;AAAA,MACT,EAAA,EAAI,mBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,yBAAA,EAA2B,kBAAkB,CAAA;AAAA,MACtD,WAAA,EAAa,EAAA;AAAA,QACX,0HAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,SAAA;AAAA,MACN,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,KAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,QAAA,EAAS;AAAA,QACvC,UAAA,EAAY,IAAA;AAAA,QACZ,UAAA,EAAY,CAAC,EAAE,GAAA,EAAK,cAAA,EAAgB,OAAO,EAAA,CAAG,SAAA,EAAW,SAAS,CAAA,EAAG,CAAA;AAAA,QACrE,QAAA,EAAU;AAAA,UACR,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,YAAA,EAAc,UAAU,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAS;AAAA,UACvF,EAAE,GAAA,EAAK,iBAAA,EAAmB,KAAA,EAAO,EAAA,CAAG,SAAA,EAAW,YAAY,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAS;AAAA;AAAA;AAAA;AAAA,UAI3F,EAAE,GAAA,EAAK,iBAAA,EAAmB,KAAA,EAAO,EAAA,CAAG,WAAA,EAAa,kBAAe,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAS;AAAA,UAChG;AAAA,YACE,GAAA,EAAK,cAAA;AAAA,YAAgB,KAAA,EAAO,EAAA,CAAG,cAAA,EAAgB,MAAM,CAAA;AAAA,YACrD,GAAA,EAAK,OAAA;AAAA,YAAS,OAAA,EAAS,CAAC,YAAA,EAAc,iBAAiB,CAAA;AAAA,YAAG,KAAA,EAAO,GAAA;AAAA,YAAK,MAAA,EAAQ;AAAA;AAChF,SACF;AAAA,QACA,OAAA,EAAS,CAAC,aAAa,CAAA;AAAA,QACvB,WAAA,EAAa,YAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,OAAA;AAAQ,KACvB;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,OAAA,EAAS,KAAA;AAAA,MACT,EAAA,EAAI,oBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,wBAAA,EAA0B,mBAAmB,CAAA;AAAA,MACtD,WAAA,EAAa,EAAA;AAAA,QACX,kFAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,OAAA;AAAA,MACN,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,KAAA,EAAO,UAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,SAAA,EAAU;AAAA,QACxC,UAAA,EAAY,IAAA;AAAA,QACZ,UAAA,EAAY;AAAA,UACV;AAAA,YACE,GAAA,EAAK,eAAA;AAAA,YAAiB,KAAA,EAAO,EAAA,CAAG,UAAA,EAAY,SAAS,CAAA;AAAA,YACrD,MAAA,EAAQ,EAAE,KAAA,EAAO,aAAA,EAAe,MAAM,eAAA;AAAgB,WACxD;AAAA;AAAA;AAAA,UAGA,EAAE,KAAK,aAAA,EAAe,KAAA,EAAO,GAAG,aAAA,EAAe,eAAe,CAAA,EAAG,MAAA,EAAQ,IAAA;AAAK,SAChF;AAAA,QACA,QAAA,EAAU;AAAA,UACR,EAAE,GAAA,EAAK,aAAA,EAAe,KAAA,EAAO,EAAA,CAAG,aAAA,EAAe,aAAa,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAW;AAAA,UAC9F,EAAE,GAAA,EAAK,cAAA,EAAgB,KAAA,EAAO,EAAA,CAAG,QAAA,EAAU,SAAS,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAS;AAAA,UACpF,EAAE,GAAA,EAAK,iBAAA,EAAmB,KAAA,EAAO,EAAA,CAAG,eAAA,EAAiB,iBAAc,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,UAAA;AAAW,SACvG;AAAA,QACA,WAAA,EAAa,aAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,OAAA;AAAQ,KACvB;AAAA;AAAA;AAAA;AAAA,IAKA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,oBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,YAAA,EAAc,kBAAkB,CAAA;AAAA,MACzC,WAAA,EAAa,EAAA;AAAA,QACX,uEAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,aAAA;AAAA,MACN,UAAU,GAAA,CAAI,MAAA;AAAA,MACd,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACrC,OAAA,EAAS,YAAA;AAAA,QACT,WAAA,EAAa,YAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,OAAA,EAAQ;AAAA,MACrB,OAAA,EAAS;AAAA,QACP,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,MAAA,EAAQ,MAAM,CAAA,EAAG,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAK;AAAA,QAC7E,EAAE,GAAA,EAAK,cAAA,EAAgB,KAAA,EAAO,EAAA,CAAG,OAAA,EAAS,QAAQ,CAAA,EAAG,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,IAAA,EAAK;AAAA,QACpF;AAAA,UACE,GAAA,EAAK,eAAA;AAAA,UAAiB,KAAA,EAAO,EAAA,CAAG,UAAA,EAAY,SAAS,CAAA;AAAA,UACrD,IAAA,EAAM,QAAA;AAAA,UAAU,KAAA,EAAO,aAAA;AAAA,UAAe,UAAA,EAAY;AAAA,SACpD;AAAA,QACA,EAAE,KAAK,gBAAA,EAAkB,KAAA,EAAO,GAAG,OAAA,EAAS,QAAQ,CAAA,EAAG,IAAA,EAAM,OAAA,EAAQ;AAAA,QACrE,EAAE,KAAK,kBAAA,EAAoB,KAAA,EAAO,GAAG,SAAA,EAAW,WAAW,CAAA,EAAG,IAAA,EAAM,MAAA,EAAO;AAAA,QAC3E,EAAE,KAAK,oBAAA,EAAsB,KAAA,EAAO,GAAG,aAAA,EAAe,SAAS,CAAA,EAAG,IAAA,EAAM,MAAA,EAAO;AAAA,QAC/E,EAAE,GAAA,EAAK,WAAA,EAAa,KAAA,EAAO,EAAA,CAAG,WAAA,EAAa,oBAAiB,CAAA,EAAG,IAAA,EAAM,UAAA,EAAY,SAAA,EAAW,KAAA,EAAO,UAAU,IAAA,EAAK;AAAA,QAClH,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,EAAA,CAAG,OAAA,EAAS,OAAO,CAAA,EAAG,IAAA,EAAM,UAAA,EAAY,SAAA,EAAW,KAAA,EAAO,UAAU,IAAA;AAAK;AAClG,KACF;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,yBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,YAAA,EAAc,gBAAgB,CAAA;AAAA,MACvC,WAAA,EAAa,EAAA;AAAA,QACX,sDAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,MAAA;AAAA,MACN,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,KAAA,EAAO,YAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,KAAA,EAAM;AAAA,QACpC,OAAA,EAAS,CAAC,mBAAmB,CAAA;AAAA,QAC7B,WAAA,EAAa,YAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,OAAA,EAAQ;AAAA,MACrB,OAAA,EAAS;AAAA,QACP,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,MAAA,EAAQ,MAAM,CAAA,EAAG,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAK;AAAA,QAC7E,EAAE,GAAA,EAAK,cAAA,EAAgB,KAAA,EAAO,EAAA,CAAG,OAAA,EAAS,QAAQ,CAAA,EAAG,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,IAAA,EAAK;AAAA,QACpF,EAAE,KAAK,cAAA,EAAgB,KAAA,EAAO,GAAG,SAAA,EAAW,SAAS,CAAA,EAAG,IAAA,EAAM,MAAA,EAAO;AAAA,QACrE,EAAE,GAAA,EAAK,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,MAAM,MAAA,EAAO;AAAA,QACzC,EAAE,KAAK,eAAA,EAAiB,KAAA,EAAO,GAAG,UAAA,EAAY,WAAW,CAAA,EAAG,IAAA,EAAM,MAAA,EAAO;AAAA,QACzE,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,EAAA,CAAG,KAAA,EAAO,KAAK,CAAA,EAAG,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,KAAA,EAAO,UAAU,IAAA,EAAK;AAAA,QAC7F,EAAE,KAAK,YAAA,EAAc,KAAA,EAAO,GAAG,YAAA,EAAc,gBAAa,CAAA,EAAG,IAAA,EAAM,UAAA,EAAW;AAAA,QAC9E,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,OAAA,EAAS,OAAO,CAAA,EAAG,IAAA,EAAM,UAAA,EAAY,SAAA,EAAW,KAAA,EAAO,UAAU,IAAA;AAAK;AACvG,KACF;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,OAAA,EAAS,KAAA;AAAA,MACT,EAAA,EAAI,sBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,qBAAA,EAAuB,uBAAoB,CAAA;AAAA,MACpD,WAAA,EAAa,EAAA;AAAA,QACX,8GAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,OAAA;AAAA,MACN,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,KAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,QAAA,EAAS;AAAA,QACvC,UAAA,EAAY,IAAA;AAAA,QACZ,OAAA,EAAS,CAAC,aAAa,CAAA;AAAA,QACvB,WAAA,EAAa,SAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,OAAA,EAAQ;AAAA,MACrB,OAAA,EAAS;AAAA,QACP,EAAE,KAAK,cAAA,EAAgB,KAAA,EAAO,GAAG,SAAA,EAAW,SAAS,CAAA,EAAG,IAAA,EAAM,MAAA,EAAO;AAAA,QACrE,EAAE,GAAA,EAAK,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,MAAM,MAAA,EAAO;AAAA,QACzC,EAAE,KAAK,eAAA,EAAiB,KAAA,EAAO,GAAG,UAAA,EAAY,WAAW,CAAA,EAAG,IAAA,EAAM,MAAA,EAAO;AAAA,QACzE,EAAE,KAAK,QAAA,EAAU,KAAA,EAAO,GAAG,QAAA,EAAU,gBAAU,CAAA,EAAG,IAAA,EAAM,MAAA,EAAO;AAAA,QAC/D,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,EAAA,CAAG,OAAA,EAAS,UAAO,CAAA,EAAG,IAAA,EAAM,UAAA,EAAY,QAAA,EAAU,IAAA,EAAK;AAAA,QAC9E,EAAE,GAAA,EAAK,iBAAA,EAAmB,KAAA,EAAO,EAAA,CAAG,SAAA,EAAW,YAAY,CAAA,EAAG,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,KAAA,EAAO,UAAU,IAAA,EAAK;AAAA,QAC/G,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,YAAA,EAAc,UAAU,CAAA,EAAG,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,KAAA,EAAO,UAAU,IAAA,EAAK;AAAA,QAC3G,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,EAAA,CAAG,SAAA,EAAW,SAAS,CAAA,EAAG,IAAA,EAAM,UAAA,EAAY,SAAA,EAAW,KAAA,EAAO,UAAU,IAAA,EAAK;AAAA,QACtG,EAAE,GAAA,EAAK,wBAAA,EAA0B,KAAA,EAAO,EAAA,CAAG,aAAA,EAAe,kBAAkB,CAAA,EAAG,IAAA,EAAM,UAAA,EAAY,SAAA,EAAW,KAAA,EAAO,UAAU,IAAA;AAAK;AACpI,KACF;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,uBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,eAAA,EAAiB,mBAAmB,CAAA;AAAA,MAC7C,WAAA,EAAa,EAAA;AAAA,QACX,oEAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,OAAA;AAAA,MACN,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,KAAA,EAAO,UAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,SAAA,EAAU;AAAA,QACxC,WAAA,EAAa,aAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,OAAA,EAAQ;AAAA,MACrB,OAAA,EAAS;AAAA,QACP;AAAA,UACE,GAAA,EAAK,eAAA;AAAA,UAAiB,KAAA,EAAO,EAAA,CAAG,UAAA,EAAY,SAAS,CAAA;AAAA,UACrD,IAAA,EAAM,QAAA;AAAA,UAAU,KAAA,EAAO,aAAA;AAAA,UAAe,UAAA,EAAY;AAAA,SACpD;AAAA,QACA,EAAE,KAAK,OAAA,EAAS,KAAA,EAAO,GAAG,OAAA,EAAS,QAAQ,CAAA,EAAG,IAAA,EAAM,OAAA,EAAQ;AAAA,QAC5D,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,OAAA,EAAS,eAAe,CAAA,EAAG,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAK;AAAA,QACvF,EAAE,GAAA,EAAK,cAAA,EAAgB,KAAA,EAAO,EAAA,CAAG,QAAA,EAAU,SAAS,CAAA,EAAG,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,KAAA,EAAO,UAAU,IAAA,EAAK;AAAA,QACxG,EAAE,GAAA,EAAK,aAAA,EAAe,KAAA,EAAO,EAAA,CAAG,aAAA,EAAe,aAAa,CAAA,EAAG,IAAA,EAAM,UAAA,EAAY,SAAA,EAAW,KAAA,EAAO,UAAU,IAAA,EAAK;AAAA,QAClH,EAAE,GAAA,EAAK,iBAAA,EAAmB,KAAA,EAAO,EAAA,CAAG,eAAA,EAAiB,iBAAc,CAAA,EAAG,IAAA,EAAM,UAAA,EAAY,QAAA,EAAU,IAAA,EAAK;AAAA,QACvG,EAAE,GAAA,EAAK,eAAA,EAAiB,KAAA,EAAO,EAAA,CAAG,YAAA,EAAc,kBAAe,CAAA,EAAG,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,IAAA;AAAK;AACjG;AACF,GACF;AACF;;;AChyBA,IAAM,QAAA,GAAW3B,MAAAA,CAAM,IAAA,CAAK,MAAM,OAAO,wBAAkB,CAAA,CAAE,IAAA,CAAK,CAAC,OAAO,EAAE,OAAA,EAAS,CAAA,CAAE,QAAA,GAAW,CAAC,CAAA;AAkC5F,SAAS,iBAAiB,OAAA,EAA6C;AAC5E,EAAA,MAAM,IAAA,GAAO,EAAE,IAAA,EAAM,KAAA,EAAO,MAAA,EAAQ,SAAS,MAAA,EAAQ,IAAA,EAAM,GAAG,OAAA,EAAS,QAAA,EAAS;AAIhF,EAAA,qBAAA,CAAsB,MAAM,oBAAA,CAAqB,QAAA,EAAS,CAAE,YAAY,EAAE,CAAA;AAK1E,EAAA,uBAAA,CAAwB,0BAA0B,CAAA;AAIlD,EAAA,6BAAA,CAA8B,8BAAA,CAA+B,MAC1D,OAAO,OAAA,EAAS,QAAA,KAAa,UAAA,GAC1B,OAAA,CAAQ,QAAA,EAAS,GACjB,OAAA,EAAS,QAAA,IAAYK,eAAAA,EAAkB,CAAC,CAAA;AAM9C,EAAA,kBAAA,CAAmB,iBAAiB,mBAAmB,CAAA;AAKvD,EAAA,oBAAA,CAAqB,eAAA,EAAiB,kBAAA,CAAmB,MAAM,eAAA,EAAiB,CAAC,CAAA;AAMjF,EAAA,MAAM,OAAA,GAAU,CAAC,OAAA,KAAwD;AACvE,IAAA,MAAM,OAAA,GAAwC,MAC5CL,MAAAA,CAAM,aAAA;AAAA,MAAcA,MAAAA,CAAM,QAAA;AAAA,MAAU,EAAE,UAAU,IAAA,EAAK;AAAA,MACnDA,MAAAA,CAAM,aAAA;AAAA,QACJ,QAAA;AAAA,QACA,EAAE,QAAA,EAAU,OAAA,EAAS,QAAA,EAAU,OAAA;AAAQ;AACzC,KACF;AACF,IAAA,OAAA,CAAQ,WAAA,GAAwB,CAAA,SAAA,EAAY,OAAO,CAAA,CAAA,CAAK;AACxD,IAAA,OAAO,OAAA;AAAA,EACT,CAAA;AAOA,EAAA,MAAM,eAAA,GAAkB,MACtB,OAAO,OAAA,EAAS,QAAA,KAAa,UAAA,GACzB,OAAA,CAAQ,QAAA,EAAS,GACjB,OAAA,EAAS,QAAA,IAAYK,eAAAA,EAAgB;AAE3C,EAAA,MAAM,QAAQ,CAAC,GAAA,EAA4D,aACzE,OAAA,EAAS,aAAA,GAAgB,GAAG,CAAA,IAAK,QAAA;AAKnC,EAAA,MAAM,cAAA,GAAiB,SAAS,kBAAA,IAAsB,UAAA;AAMtD,EAAA,MAAM,WAAA,GAAc,CAClB,IAAA,EACA,MAAA,KACiC;AACjC,IAAA,MAAM,GAAA,GAAoC,MAAM,MAAA,EAAO;AACvD,IAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAClB,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAYA,EAAA,MAAM,mBAAmB,cAAA,CAAe,sBAAA,CAAuB,IAAA,CAAK,IAAA,EAAM,eAAe,CAAA,EAAG;AAAA,IAC1F,YAAA,EAAc,8BAA8B,eAAe,CAAA;AAAA,IAC3D,OAAA,EAAS,MAAA;AAAA,IACT,KAAA,EAAO,CAAC,KAAA,EAAO,KAAA,KAAU;AAAA,MACvB,EAAE,IAAI,OAAA,EAAS,KAAA,EAAO,YAAY,KAAA,EAAO,KAAA,EAAO,MAAMkC,OAAAA,EAAQ;AAAA,MAC9D,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,OAAO,KAAA,EAAO,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,MAAA,KAAW,QAAQ,EAAE,MAAA,IAAU,CAAA,EAAG,MAAM,GAAA,EAAI;AAAA,MAC3G,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,WAAA,EAAa,OAAO,KAAA,EAAO,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,MAAA,KAAW,OAAO,EAAE,MAAA,IAAU,CAAA,EAAG,MAAM,QAAA,EAAS;AAAA,MACjH,EAAE,EAAA,EAAI,cAAA,EAAgB,OAAO,aAAA,EAAe,KAAA,EAAO,OAAO,MAAA,CAAO,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,kBAAkB,CAAA,KAAM,CAAC,EAAE,MAAA,IAAU,CAAA,EAAG,MAAM,QAAA;AAAS;AACpI,GACD,CAAA;AAKD,EAAA,MAAM,eAAe,MAAoB;AAAA,IACvC;AAAA,MAAE,EAAA,EAAI,WAAA;AAAA,MAAa,KAAA,EAAO,KAAA,CAAM,WAAA,EAAa,UAAU,CAAA;AAAA,MAAG,IAAA,EAAM,KAAA;AAAA,MAC9D,QAAA,EAAU,MAAMjC,eAAAA,CAAgB,mBAAmB;AAAA,KAAE;AAAA,IACvD;AAAA,MAAE,EAAA,EAAI,QAAA;AAAA,MAAU,KAAA,EAAO,KAAA,CAAM,gBAAA,EAAkB,QAAQ,CAAA;AAAA,MAAG,IAAA,EAAM,UAAA;AAAA,MAC9D,QAAA,EAAU,MAAMA,eAAAA,CAAgB,0BAA0B;AAAA,KAAE;AAAA,IAC9D;AAAA,MAAE,EAAA,EAAI,UAAA;AAAA,MAAY,KAAA,EAAO,KAAA,CAAM,kBAAA,EAAoB,WAAW,CAAA;AAAA,MAAG,IAAA,EAAM,MAAA;AAAA,MACrE,QAAA,EAAU,MAAMA,eAAAA,CAAgB,4BAA4B;AAAA;AAAE,GAClE;AAEA,EAAA,MAAM,sBAAA,GAAyB,cAAA,CAAe,4BAAA,EAA6B,EAAG;AAAA,IAC5E,YAAA,EAAc,oCAAoC,eAAe,CAAA;AAAA,IACjE,OAAA,EAAS,MAAA;AAAA,IACT,OAAA,EAAS,YAAA;AAAA,IACT,YAAA,EAAc,QAAA;AAAA,IACd,KAAA,EAAO,CAAC,KAAA,EAAO,KAAA,KAAU;AAAA,MACvB,EAAE,IAAI,OAAA,EAAS,KAAA,EAAO,UAAU,KAAA,EAAO,KAAA,EAAO,MAAM,UAAA,EAAW;AAAA,MAC/D;AAAA,QACE,EAAA,EAAI,SAAA;AAAA,QAAW,KAAA,EAAO,oBAAA;AAAA,QAAsB,IAAA,EAAM,KAAA;AAAA;AAAA;AAAA,QAGlD,KAAA,EAAO,IAAI,GAAA,CAAA,CAAK,KAAA,IAAS,EAAC,EAAG,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,IAAe,EAAE,CAAC,CAAA,CAAE;AAAA,OACpE;AAAA,MACA;AAAA,QACE,EAAA,EAAI,OAAA;AAAA,QAAS,KAAA,EAAO,eAAA;AAAA,QAAiB,IAAA,EAAM,KAAA;AAAA,QAC3C,KAAA,EAAO,KAAA,EAAO,MAAA,CAAO,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,WAAA,EAAa,MAAA,IAAU,CAAA,MAAO,CAAC,CAAA,CAAE,MAAA,IAAU;AAAA,OAC5E;AAAA,MACA,EAAE,IAAI,UAAA,EAAY,KAAA,EAAO,aAAa,OAAA,EAAS,SAAA,EAAW,MAAM,MAAA;AAAO;AACzE,GACD,CAAA;AAED,EAAA,MAAM,wBAAA,GAA2B,cAAA,CAAe,8BAAA,CAA+B,IAAA,CAAK,IAAI,CAAA,EAAG;AAAA,IACzF,YAAA,EAAc,sCAAsC,eAAe,CAAA;AAAA,IACnE,OAAA,EAAS,MAAA;AAAA,IACT,OAAA,EAAS,YAAA;AAAA,IACT,YAAA,EAAc,UAAA;AAAA,IACd,KAAA,EAAO,CAAC,KAAA,EAAO,KAAA,KAAU;AAAA,MACvB,EAAE,IAAI,OAAA,EAAS,KAAA,EAAO,aAAa,KAAA,EAAO,KAAA,EAAO,MAAM,MAAA,EAAO;AAAA,MAC9D;AAAA,QACE,EAAA,EAAI,SAAA;AAAA,QAAW,KAAA,EAAO,gBAAA;AAAA,QAAkB,IAAA,EAAM,KAAA;AAAA,QAC9C,KAAA,EAAO,KAAA,EAAO,MAAA,GAAS,IAAA,CAAK,IAAI,GAAG,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,IAAc,CAAC,CAAC,CAAA,GAAI;AAAA,OAC5E;AAAA,MACA;AAAA,QACE,EAAA,EAAI,OAAA;AAAA,QAAS,KAAA,EAAO,gBAAA;AAAA,QAAe,IAAA,EAAM,KAAA;AAAA,QACzC,KAAA,EAAO,KAAA,EAAO,MAAA,CAAO,CAAC,CAAA,KAAA,CAAO,EAAE,UAAA,IAAc,CAAA,MAAO,CAAC,CAAA,CAAE,MAAA,IAAU;AAAA,OACnE;AAAA,MACA,EAAE,IAAI,QAAA,EAAU,KAAA,EAAO,UAAU,OAAA,EAAS,SAAA,EAAW,MAAM,UAAA;AAAW;AACxE,GACD,CAAA;AAED,EAAA,MAAM,iBAAA,GAAoB,cAAA,CAAe,uBAAA,EAAwB,EAAG;AAAA,IAClE,YAAA,EAAc,+BAA+B,eAAe,CAAA;AAAA,IAC5D,OAAA,EAAS,MAAA;AAAA,IACT,OAAA,EAAS,YAAA;AAAA,IACT,YAAA,EAAc,WAAA;AAAA,IACd,KAAA,EAAO,CAAC,KAAA,EAAO,KAAA,KAAU;AAAA,MACvB,EAAE,IAAI,OAAA,EAAS,KAAA,EAAO,qBAAqB,KAAA,EAAO,KAAA,EAAO,MAAM,KAAA,EAAM;AAAA,MACrE,EAAE,EAAA,EAAI,aAAA,EAAe,OAAO,aAAA,EAAe,KAAA,EAAO,OAAO,MAAA,CAAO,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,eAAe,CAAA,IAAK,CAAC,EAAE,MAAA,IAAU,CAAA,EAAG,MAAMkC,WAAAA,EAAY;AAAA;AAAA,MAEhI,EAAE,IAAI,QAAA,EAAU,KAAA,EAAO,oBAAoB,OAAA,EAAS,UAAA,EAAY,MAAM,MAAA,EAAO;AAAA,MAC7E,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,mBAAgB,OAAA,EAAS,UAAA,EAAY,MAAM,gBAAA;AAAiB;AAClF,GACD,CAAA;AAED,EAAA,MAAM,iBAAA,GAAoB,cAAA,CAAe,uBAAA,EAAwB,EAAG;AAAA,IAClE,YAAA,EAAc,+BAA+B,eAAe,CAAA;AAAA,IAC5D,OAAA,EAAS,MAAA;AAAA,IACT,KAAA,EAAO,CAAC,KAAA,EAAO,KAAA,KAAU;AAAA,MACvB,EAAE,IAAI,OAAA,EAAS,KAAA,EAAO,mBAAmB,KAAA,EAAO,KAAA,EAAO,MAAM,GAAA,EAAI;AAAA,MACjE,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,cAAA,EAAgB,OAAO,KAAA,EAAO,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,MAAA,KAAW,QAAQ,EAAE,MAAA,IAAU,CAAA,EAAG,MAAM,GAAA,EAAI;AAAA,MACjH,EAAE,EAAA,EAAI,MAAA,EAAQ,OAAO,MAAA,EAAQ,KAAA,EAAO,OAAO,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,IAAO,EAAE,SAAA,IAAa,CAAA,CAAA,EAAI,CAAC,CAAA,IAAK,CAAA,EAAG,MAAM,WAAA,EAAY;AAAA,MACnH,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,WAAA,EAAa,OAAO,KAAA,EAAO,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,MAAA,KAAW,OAAO,EAAE,MAAA,IAAU,CAAA,EAAG,MAAM,QAAA;AAAS;AACnH,GACD,CAAA;AAQD,EAAA,MAAM,kBAAA,GAAqB,cAAA,CAAe,uBAAA,EAAwB,EAAG;AAAA,IACnE,YAAA,EAAc,+BAA+B,eAAe,CAAA;AAAA,IAC5D,OAAA,EAAS;AAAA,GACV,CAAA;AAED,EAAA,MAAM,mBAAA,GAAsB,cAAA,CAAe,yBAAA,EAA0B,EAAG;AAAA,IACtE,YAAA,EAAc,iCAAiC,eAAe,CAAA;AAAA,IAC9D,OAAA,EAAS,MAAA;AAAA,IACT,KAAA,EAAO,CAAC,KAAA,EAAO,KAAA,KAAU;AAAA,MACvB,EAAE,IAAI,OAAA,EAAS,KAAA,EAAO,kBAAY,KAAA,EAAO,KAAA,EAAO,MAAMC,MAAAA,EAAO;AAAA,MAC7D,EAAE,EAAA,EAAI,WAAA,EAAa,KAAA,EAAO,YAAA,EAAc,OAAO,KAAA,EAAO,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA,CAAE,MAAA,IAAU,CAAA,EAAG,MAAM,GAAA,EAAI;AAAA,MACxG,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,WAAA,EAAa,OAAO,KAAA,EAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,SAAS,EAAE,MAAA,IAAU,CAAA,EAAG,MAAM,QAAA,EAAS;AAAA,MACzG;AAAA,QACE,EAAA,EAAI,SAAA;AAAA,QAAW,KAAA,EAAO,oBAAA;AAAA,QAAsB,IAAA,EAAMF,OAAAA;AAAA,QAClD,KAAA,EAAO,KAAA,EAAO,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,IAAO,CAAA,CAAE,UAAA,EAAY,MAAA,IAAU,CAAA,CAAA,EAAI,CAAC,CAAA,IAAK;AAAA;AAC5E;AACF,GACD,CAAA;AAED,EAAA,MAAM,iBAAA,GAAoB,cAAA,CAAe,uBAAA,CAAwB,IAAA,CAAK,IAAI,CAAA,EAAG;AAAA,IAC3E,YAAA,EAAc,+BAA+B,eAAe,CAAA;AAAA,IAC5D,OAAA,EAAS,MAAA;AAAA,IACT,KAAA,EAAO,CAAC,KAAA,EAAO,KAAA,KAAU;AACvB,MAAA,MAAMhC,SAAQ,CAAC,CAAA,KACb,IAAI,IAAA,CAAK,aAAa,IAAA,CAAK,MAAA,EAAQ,EAAE,KAAA,EAAO,YAAY,QAAA,EAAU,IAAA,CAAK,MAAM,CAAA,CAAE,OAAO,CAAC,CAAA;AACzF,MAAA,MAAM,MAAA,GAAS,OAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,QAAQ,CAAA,IAAK,EAAC;AAC/D,MAAA,OAAO;AAAA,QACL,EAAE,IAAI,OAAA,EAAS,KAAA,EAAO,uBAAoB,KAAA,EAAO,KAAA,EAAO,MAAM,UAAA,EAAW;AAAA,QACzE,EAAE,IAAI,QAAA,EAAU,KAAA,EAAO,UAAU,KAAA,EAAO,MAAA,CAAO,MAAA,EAAQ,IAAA,EAAM,GAAA,EAAI;AAAA;AAAA;AAAA,QAGjE;AAAA,UACE,EAAA,EAAI,aAAA;AAAA,UAAe,KAAA,EAAO,iBAAA;AAAA,UAAmB,IAAA,EAAM,gBAAA;AAAA,UACnD,KAAA,EAAOA,MAAAA,CAAM,MAAA,CAAO,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,IAAO,CAAA,CAAE,OAAA,IAAW,CAAA,CAAA,EAAI,CAAC,CAAC;AAAA,SACnE;AAAA,QACA;AAAA,UACE,EAAA,EAAI,QAAA;AAAA,UAAU,KAAA,EAAO,eAAA;AAAA,UAAiB,IAAA,EAAM,WAAA;AAAA,UAC5C,KAAA,EAAOA,MAAAA,CAAM,KAAA,EAAO,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,IAAO,CAAA,CAAE,cAAA,IAAkB,CAAA,CAAA,EAAI,CAAC,KAAK,CAAC;AAAA;AAC/E,OACF;AAAA,IACF;AAAA,GACD,CAAA;AAED,EAAA,MAAM,kBAAA,GAAmD,MACvDP,MAAAA,CAAM,aAAA,CAAc,aAAa,EAAE,eAAA,EAAiB,OAAA,EAAS,QAAA,EAAU,CAAA;AACzE,EAAA,kBAAA,CAAmB,WAAA,GAAc,aAAA;AAUjC,EAAA,MAAM,mBAAA,GAAoD,MACxDA,MAAAA,CAAM,aAAA,CAAc,cAAc,EAAE,eAAA,EAAiB,OAAA,EAAS,QAAA,EAAU,CAAA;AAC1E,EAAA,mBAAA,CAAoB,WAAA,GAAc,cAAA;AAelC,EAAA,MAAM,UAAA,GAAa,SAAS,UAAA,IAAc,MAAA;AAC1C,EAAA,MAAM,WAAA,GAAc,SAAS,WAAA,IAAe,CAAA;AAW5C,EAAA,MAAM,GAAA,GAAkB;AAAA;AAAA,IAEtB;AAAA,MAAE,KAAA,EAAO,SAAA;AAAA,MAAW,KAAA,EAAO,KAAA,CAAM,QAAA,EAAU,SAAS,CAAA;AAAA,MAAG,IAAA,EAAM,aAAA;AAAA,MAC3D,QAAA,EAAU,WAAA;AAAA,MAAa,SAAA,EAAW,QAAQ,QAAQ;AAAA,KAAE;AAAA,IACtD;AAAA,MAAE,KAAA,EAAO,mBAAA;AAAA,MAAqB,KAAA,EAAO,KAAA,CAAM,WAAA,EAAa,UAAU,CAAA;AAAA,MAAG,IAAA,EAAM,OAAA;AAAA,MACzE,UAAU,WAAA,GAAc,GAAA;AAAA,MAAK,SAAA,EAAW;AAAA,KAAkD;AAAA;AAAA,IAG5F;AAAA,MAAE,KAAA,EAAO,WAAA;AAAA,MAAa,KAAA,EAAO,KAAA,CAAM,UAAA,EAAY,UAAU,CAAA;AAAA,MAAG,IAAA,EAAM,SAAA;AAAA,MAChE,UAAU,WAAA,GAAc,CAAA;AAAA,MAAG,SAAA,EAAW;AAAA,KAAiD;AAAA,IACzF;AAAA,MAAE,KAAA,EAAO,uBAAA;AAAA,MAAyB,KAAA,EAAO,KAAA,CAAM,aAAA,EAAe,gBAAU,CAAA;AAAA,MAAG,IAAA,EAAM,QAAA;AAAA,MAC/E,UAAU,WAAA,GAAc,GAAA;AAAA,MAAK,SAAA,EAAW;AAAA,KAAoD;AAAA,IAC9F;AAAA,MAAE,KAAA,EAAO,sBAAA;AAAA,MAAwB,KAAA,EAAO,KAAA,CAAM,YAAA,EAAc,YAAY,CAAA;AAAA,MAAG,IAAA,EAAM,YAAA;AAAA,MAC/E,UAAU,WAAA,GAAc,GAAA;AAAA,MAAK,SAAA,EAAW;AAAA,KAAmD;AAAA;AAAA,IAI7F;AAAA,MAAE,KAAA,EAAO,UAAA;AAAA,MAAY,KAAA,EAAO,KAAA,CAAM,SAAA,EAAW,aAAU,CAAA;AAAA,MAAG,IAAA,EAAM,OAAA;AAAA,MAC9D,UAAU,WAAA,GAAc,CAAA;AAAA,MAAG,UAAA,EAAY,KAAA;AAAA,MAAO,SAAA,EAAW;AAAA,KAAmB;AAAA;AAAA,IAG9E;AAAA,MAAE,KAAA,EAAO,YAAA;AAAA,MAAc,KAAA,EAAO,KAAA,CAAM,WAAA,EAAa,WAAW,CAAA;AAAA,MAAG,IAAA,EAAM,KAAA;AAAA,MACnE,UAAU,WAAA,GAAc,CAAA;AAAA,MAAG,SAAA,EAAW;AAAA,KAAkD;AAAA,IAC1F;AAAA,MAAE,KAAA,EAAO,uBAAA;AAAA,MAAyB,KAAA,EAAO,KAAA,CAAM,WAAA,EAAa,YAAY,CAAA;AAAA,MAAG,IAAA,EAAM,YAAA;AAAA,MAC/E,UAAU,WAAA,GAAc,GAAA;AAAA,MAAK,SAAA,EAAW;AAAA;AAAkD,GAE9F;AAUA,EAAA,MAAM,aAAA,GAKD;AAAA,IACH,EAAE,MAAM,QAAA,EAAU,SAAA,EAAW,qBAAqB,KAAA,EAAO,KAAA,CAAM,OAAA,EAAS,iBAAiB,CAAA,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAO3F;AAAA,MAAE,IAAA,EAAM,0BAAA;AAAA,MAA4B,SAAA,EAAW,sBAAA;AAAA,MAC7C,KAAA,EAAO,KAAA,CAAM,gBAAA,EAAkB,QAAQ,CAAA;AAAA,MAAG,WAAA,EAAa;AAAA,KAAoB;AAAA,IAC7E;AAAA,MAAE,IAAA,EAAM,4BAAA;AAAA,MAA8B,SAAA,EAAW,wBAAA;AAAA,MAC/C,KAAA,EAAO,KAAA,CAAM,kBAAA,EAAoB,WAAW,CAAA;AAAA,MAAG,WAAA,EAAa;AAAA;AAAoB,GACpF;AAOA,EAAA,MAAM,UAAA,GAAa,CAAC,MAAA,KAAiD;AACnE,IAAA,MAAM,WAAyC,MAAM;AACnD,MAAAA,MAAAA,CAAM,UAAU,MAAM;AAAE,QAAAM,gBAAgB,MAAM,CAAA;AAAA,MAAE,CAAA,EAAG,EAAE,CAAA;AACrD,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AACA,IAAA,QAAA,CAAS,WAAA,GAAc,YAAY,MAAM,CAAA,CAAA,CAAA;AACzC,IAAA,OAAO,QAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,aAAA,GAAkF;AAAA,IACtF,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,UAAA,CAAW,WAAW,CAAA,EAAE;AAAA,IACpD,EAAE,IAAA,EAAM,gBAAA,EAAkB,SAAA,EAAW,UAAA,CAAW,WAAW,CAAA,EAAE;AAAA,IAC7D,EAAE,IAAA,EAAM,cAAA,EAAgB,SAAA,EAAW,UAAA,CAAW,SAAS,CAAA,EAAE;AAAA,IACzD,EAAE,IAAA,EAAM,iBAAA,EAAmB,SAAA,EAAW,UAAA,CAAW,YAAY,CAAA,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAO/D,EAAE,MAAM,gBAAA,EAAkB,SAAA,EAAW,WAAW,oBAAA,CAAqB,uBAAuB,CAAC,CAAA,EAAE;AAAA,IAC/F,EAAE,MAAM,iBAAA,EAAmB,SAAA,EAAW,WAAW,oBAAA,CAAqB,uBAAuB,CAAC,CAAA,EAAE;AAAA,IAChG,EAAE,IAAA,EAAM,gBAAA,EAAkB,SAAA,EAAW,UAAA,CAAW,QAAQ,CAAA,EAAE;AAAA,IAC1D,EAAE,IAAA,EAAM,YAAA,EAAc,SAAA,EAAW,UAAA,CAAW,mBAAmB,CAAA,EAAE;AAAA;AAAA;AAAA,IAGjE,EAAE,IAAA,EAAM,SAAA,EAAW,SAAA,EAAW,UAAA,CAAW,cAAc,CAAA,EAAE;AAAA,IACzD,EAAE,IAAA,EAAM,gBAAA,EAAkB,SAAA,EAAW,UAAA,CAAW,cAAc,CAAA;AAAE,GAClE;AAEA,EAAA,MAAM,IAAA,GAA4C,EAAE,OAAA,EAAS,MAAA,EAAQ,QAAQ,MAAA,EAAO;AAEpF,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,MAAA;AAAA,IACJ,IAAA,EAAM,SAAS,QAAA,IAAY,MAAA;AAAA,IAC3B,IAAA,EAAM,aAAA;AAAA,IACN,OAAA,EAAS,OAAA;AAAA,IACT,KAAA,EAAO,SAAS,KAAA,IAAS,UAAA;AAAA,IACzB,YAAY,OAAA,EAAS,UAAA;AAAA;AAAA;AAAA,IAGrB,SAAA,EAAW,CAAC,WAAW,CAAA;AAAA,IACvB,cAAA,EAAgB,IAAA;AAAA,IAChB,cAAc,EAAC;AAAA,IACf,UAAA,EAAY,GAAA,CAAI,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MAC9B,OAAA,EAAS,UAAA;AAAA,MACT,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,UAAA,EAAY,IAAA;AAAA,MACZ,GAAI,MAAM,UAAA,KAAe,KAAA,GAAQ,EAAE,UAAA,EAAY,KAAA,KAAmB;AAAC,KACrE,CAAE,CAAA;AAAA,IACF,MAAA,EAAQ;AAAA,MACN,GAAG,GAAA,CAAI,GAAA,CAAI,CAAC,WAAW,EAAE,IAAA,EAAM,KAAA,CAAM,KAAA,EAAO,SAAA,EAAW,KAAA,CAAM,SAAA,EAAW,UAAA,EAAY,MAAK,CAAE,CAAA;AAAA,MAC3F,GAAG,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,UAAA,EAAY,IAAA,EAAK,CAAE,CAAA;AAAA,MACxD,GAAG,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,UAAA,EAAY,IAAA,EAAK,CAAE;AAAA,KAC1D;AAAA,IACA,SAAS,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOV,gBAAgB,OAAA,EAAS,cAAA,KAAmB,KAAA,GAAQ,KAAK,uBAAA,EAAwB;AAAA;AAAA;AAAA;AAAA,IAIjF,QAAQ,qBAAA,EAAsB;AAAA,IAC9B,OAAA,EAAS;AAAA,MACP;AAAA,QACE,EAAA,EAAI,oBAAA;AAAA,QACJ,IAAA,EAAM,cAAA;AAAA,QACN,WAAA,EAAa,qCAAA;AAAA,QACb,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,QAAA,EAAU,MAAA;AAAA,QACV,UAAA,EAAY;AAAA,UACV,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA,YACV,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAmB,aAAa,gBAAA,EAAiB;AAAA,YACjE,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAmB,MAAM,CAAC,OAAA,EAAS,QAAA,EAAU,UAAU,CAAA;AAAE;AAC3E,SACF;AAAA,QACA,WAAA,EAAa;AAAA,UACX,EAAE,OAAO,8BAAA,EAA+B;AAAA,UACxC,EAAE,OAAO,kCAAA;AAAmC;AAC9C,OACF;AAAA,MACA;AAAA,QACE,EAAA,EAAI,kBAAA;AAAA,QACJ,IAAA,EAAM,YAAA;AAAA,QACN,WAAA,EAAa,2BAAA;AAAA,QACb,IAAA,EAAM,cAAA;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,QAAA,EAAU,MAAA;AAAA,QACV,UAAA,EAAY;AAAA,UACV,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA,YACV,eAAA,EAAiB,EAAE,IAAA,EAAM,QAAA,EAAmB,IAAA,EAAM,CAAC,SAAA,EAAW,MAAA,EAAQ,UAAA,EAAY,QAAQ,CAAA,EAAE;AAAA,YAC5F,iBAAA,EAAmB,EAAE,IAAA,EAAM,QAAA,EAAmB,MAAM,CAAC,aAAA,EAAe,qBAAA,EAAuB,WAAW,CAAA;AAAE;AAC1G,SACF;AAAA,QACA,WAAA,EAAa;AAAA,UACX,EAAE,OAAO,wBAAA,EAAyB;AAAA,UAClC,EAAE,OAAO,kCAAA;AAAmC;AAC9C;AACF,KACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWA,QAAA,EAAU;AAAA,MACR;AAAA,QACE,EAAA,EAAI,MAAA;AAAA,QACJ,KAAA,EAAO,KAAA,CAAM,OAAA,EAAS,MAAM,CAAA;AAAA,QAC5B,IAAA,EAAM,aAAA;AAAA,QACN,KAAA,EAAO,cAAA;AAAA,QACP,SAAA,EAAW,WAAA,CAAY,sBAAA,EAAwB,MAC7CN,OAAM,aAAA,CAAc,oBAAA,EAAsB,EAAE,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AAAA,QAC5F,KAAA,EAAO,EAAA;AAAA,QACP,UAAA,EAAY;AAAA,OACd;AAAA,MACA;AAAA,QACE,EAAA,EAAI,eAAA;AAAA,QACJ,KAAA,EAAO,YAAA;AAAA,QACP,IAAA,EAAM,YAAA;AAAA,QACN,KAAA,EAAO,cAAA;AAAA,QACP,SAAA,EAAW,WAAA,CAAY,kBAAA,EAAoB,MACzCA,MAAAA,CAAM,aAAA,CAAc,gBAAA,EAAkB,EAAE,QAAA,EAAU,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AAAA,QACxE,KAAA,EAAO,EAAA;AAAA,QACP,UAAA,EAAY;AAAA,OACd;AAAA,MACA;AAAA,QACE,EAAA,EAAI,eAAA;AAAA,QACJ,KAAA,EAAO,UAAA;AAAA,QACP,IAAA,EAAM,cAAA;AAAA,QACN,KAAA,EAAO,cAAA;AAAA,QACP,SAAA,EAAW,WAAA,CAAY,kBAAA,EAAoB,MACzCA,MAAAA,CAAM,aAAA,CAAc,gBAAA,EAAkB,EAAE,QAAA,EAAU,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AAAA,QACxE,KAAA,EAAO,EAAA;AAAA,QACP,UAAA,EAAY;AAAA,OACd;AAAA,MACA;AAAA,QACE,EAAA,EAAI,eAAA;AAAA,QACJ,KAAA,EAAO,KAAA,CAAM,UAAA,EAAY,SAAS,CAAA;AAAA,QAClC,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,cAAA;AAAA,QACP,SAAA,EAAW,WAAA,CAAY,kBAAA,EAAoB,MACzCA,MAAAA,CAAM,aAAA,CAAc,gBAAA,EAAkB,EAAE,QAAA,EAAU,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AAAA,QACxE,KAAA,EAAO,EAAA;AAAA,QACP,UAAA,EAAY;AAAA,OACd;AAAA,MACA;AAAA,QACE,EAAA,EAAI,kBAAA;AAAA,QACJ,KAAA,EAAO,aAAA;AAAA,QACP,IAAA,EAAM,cAAA;AAAA,QACN,KAAA,EAAO,cAAA;AAAA,QACP,SAAA,EAAW,WAAA,CAAY,qBAAA,EAAuB,MAC5CA,MAAAA,CAAM,aAAA,CAAc,mBAAA,EAAqB,EAAE,QAAA,EAAU,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AAAA,QAC3E,KAAA,EAAO,EAAA;AAAA,QACP,UAAA,EAAY;AAAA;AACd,KACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWA,UAAA,EAAY;AAAA,MACV,uBAAA;AAAA,MACA,kBAAA;AAAA,MACA,sBAAA;AAAA,MACA,yBAAA;AAAA,MACA,iBAAA;AAAA,MACA;AAAA,KACF;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,YAAA,EAAc,CAAC,SAAA,EAAW,QAAA,EAAU,aAAa;AAAA,GACnD;AACF","file":"index.js","sourcesContent":["import type { ShippingLabelProvider, ShopProvider } from '@fayz-ai/shop'\n\n// The Melhor Envio implementation of the label port. It knows its own connector\n// slug and nothing else the panel needs: every screen goes through\n// resolveShippingLabelProvider, so a second carrier is a second file like this\n// one and no change anywhere else.\n\nexport const MELHOR_ENVIO_CARRIER = 'melhor-envio'\n\nexport function createMelhorEnvioLabelProvider(\n resolve: () => ShopProvider,\n): ShippingLabelProvider {\n const unsupported = () => {\n throw new Error('Este painel não sabe comprar etiquetas nesta loja.')\n }\n\n return {\n id: MELHOR_ENVIO_CARRIER,\n label: 'Melhor Envio',\n quote: async (orderId) =>\n (await resolve().quoteShippingLabel?.(orderId, MELHOR_ENVIO_CARRIER)) ?? unsupported(),\n buy: async (orderId, serviceId) =>\n (await resolve().buyShippingLabel?.(orderId, serviceId, MELHOR_ENVIO_CARRIER)) ?? unsupported(),\n print: async (orderId) =>\n (await resolve().printShippingLabel?.(orderId, MELHOR_ENVIO_CARRIER)) ?? null,\n track: async (orderId) =>\n (await resolve().trackShippingLabel?.(orderId, MELHOR_ENVIO_CARRIER)) ?? null,\n }\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport { errorMessage } from '../settings/error-message'\nimport type { Product, ProductImage, ShopProvider } from '@fayz-ai/shop'\n\n/**\n * The product's whole gallery, not just its cover.\n *\n * plg_shop_product_images has always been a collection — sort_order, is_primary\n * — but the admin only ever exposed the single `EntityImageConfig` slot on the\n * form, so a merchant could set one photo and no more, and the storefront had\n * nothing to build a carousel from. This is the missing half.\n *\n * Deliberately not drag-and-drop: ordering is done with arrows because a\n * keyboard and a screen reader can use them, and because reordering four\n * photos of a rib is not worth a drag library.\n */\nexport function ProductImagesTab({ item, getProvider }: {\n item: unknown\n getProvider: () => ShopProvider\n}) {\n const product = item as Product\n const [images, setImages] = useState<ProductImage[]>([])\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const fileRef = useRef<HTMLInputElement>(null)\n\n async function reload() {\n const fresh = await getProvider().getProduct(product.id)\n setImages(sortImages(fresh?.images ?? []))\n }\n\n useEffect(() => { void reload().catch(() => {}) }, [product.id])\n\n async function run(action: () => Promise<unknown>) {\n setBusy(true)\n setError(null)\n try {\n await action()\n await reload()\n } catch (err: unknown) {\n setError(errorMessage(err))\n } finally {\n setBusy(false)\n }\n }\n\n async function upload(files: FileList | null) {\n if (!files?.length) return\n // Sequential, not Promise.all: each upload reads the current max sort_order\n // to place itself last, and running them together makes them all read the\n // same value and land on the same position.\n await run(async () => {\n for (const file of Array.from(files)) {\n await getProvider().uploadProductImage(product.id, file)\n }\n if (fileRef.current) fileRef.current.value = ''\n })\n }\n\n function move(index: number, delta: number) {\n const target = index + delta\n if (target < 0 || target >= images.length) return\n const a = images[index]!\n const b = images[target]!\n // Swap the two positions rather than renumbering the list: fewer writes, and\n // a failure halfway leaves an order that is still coherent.\n void run(async () => {\n const update = getProvider().updateProductImage\n if (!update) throw new Error('Este provider não suporta reordenar imagens.')\n await update(a.id, { sortOrder: b.sortOrder ?? target })\n await update(b.id, { sortOrder: a.sortOrder ?? index })\n })\n }\n\n const update = getProvider().updateProductImage\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div>\n <h3 className=\"text-sm font-semibold\">Fotos do produto</h3>\n <p className=\"text-xs text-muted-foreground\">\n A primeira foto é a capa — aparece no catálogo, no carrinho e no pedido.\n As demais viram o carrossel na página do produto.\n </p>\n </div>\n <label className=\"inline-flex cursor-pointer items-center rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground transition hover:opacity-90\">\n {busy ? 'Enviando…' : 'Adicionar fotos'}\n <input\n ref={fileRef}\n type=\"file\"\n accept=\"image/*\"\n multiple\n disabled={busy}\n className=\"hidden\"\n onChange={(event) => void upload(event.target.files)}\n />\n </label>\n </div>\n\n {error && (\n <p className=\"rounded-md border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-800\">{error}</p>\n )}\n\n {images.length === 0 ? (\n <p className=\"rounded-lg border border-dashed px-4 py-10 text-center text-sm text-muted-foreground\">\n Nenhuma foto ainda. Produtos com mais de uma foto vendem melhor — mostre a\n embalagem, o produto pronto e uma referência de tamanho.\n </p>\n ) : (\n <ul className=\"fz-cards gap-3\">\n {images.map((image, index) => (\n <li key={image.id} className=\"overflow-hidden rounded-lg border\">\n <div className=\"relative aspect-square bg-muted\">\n <img src={image.url} alt={image.altText ?? ''} className=\"h-full w-full object-cover\" />\n {image.isPrimary && (\n <span className=\"absolute left-2 top-2 rounded-full bg-primary px-2 py-0.5 text-[11px] font-bold text-primary-foreground\">\n Capa\n </span>\n )}\n </div>\n <div className=\"flex items-center justify-between gap-1 px-2 py-1.5\">\n <div className=\"flex gap-1\">\n <IconButton label=\"Mover para trás\" disabled={busy || index === 0}\n onClick={() => move(index, -1)}>←</IconButton>\n <IconButton label=\"Mover para frente\" disabled={busy || index === images.length - 1}\n onClick={() => move(index, 1)}>→</IconButton>\n </div>\n <div className=\"flex gap-1\">\n {!image.isPrimary && update && (\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => void run(() => update(image.id, { isPrimary: true }))}\n className=\"rounded px-1.5 py-0.5 text-xs text-muted-foreground hover:bg-muted hover:text-foreground disabled:opacity-50\"\n >\n Usar como capa\n </button>\n )}\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => void run(() => getProvider().deleteProductImage(image.id))}\n className=\"rounded px-1.5 py-0.5 text-xs text-red-600 hover:bg-red-50 disabled:opacity-50\"\n >\n Excluir\n </button>\n </div>\n </div>\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n}\n\nfunction IconButton({ label, disabled, onClick, children }: {\n label: string\n disabled?: boolean\n onClick: () => void\n children: React.ReactNode\n}) {\n return (\n <button\n type=\"button\"\n aria-label={label}\n title={label}\n disabled={disabled}\n onClick={onClick}\n className=\"rounded border px-1.5 py-0.5 text-xs text-muted-foreground transition hover:bg-muted hover:text-foreground disabled:opacity-40\"\n >\n {children}\n </button>\n )\n}\n\n/** Cover first, then the merchant's order — the same rule the storefront uses. */\nfunction sortImages(images: ProductImage[]): ProductImage[] {\n return [...images].sort((a, b) => {\n if (a.isPrimary !== b.isPrimary) return a.isPrimary ? -1 : 1\n return (a.sortOrder ?? 0) - (b.sortOrder ?? 0)\n })\n}\n","import React from 'react'\nimport type { Product, ProductVariant, ShopProvider, VariantAxisInput, VariantMatrixRow } from '@fayz-ai/shop'\nimport {\n applyVariantMatrix, axesFromOptions, formatVariantCombination, hasOnlyDefaultVariant,\n leavesNothingSellable, MAX_VARIANT_AXES, planVariantMatrix, validateVariantAxes,\n} from '@fayz-ai/shop'\nimport { AlertTriangle, Loader2, Plus, Trash2, X } from 'lucide-react'\n\n/**\n * Variantes — os eixos de opção e a matriz que eles geram.\n *\n * A tela que faltava. As tabelas existem desde a 0028, a vitrine monta o\n * seletor a partir delas desde o M5 e o `shop_place_order` cobra por elas desde\n * a 0029 — mas nenhuma tela do admin sabia criá-las. Na prática, ou o lojista\n * chamava alguém com acesso ao banco, ou vendia P, M e G contra o mesmo\n * contador, que é exatamente o defeito que o cabeçalho da 0028 descreve.\n *\n * DUAS COISAS AQUI NÃO SÃO ESCOLHA DE TELA, e é por isso que elas moram no\n * @fayz-ai/shop e não neste arquivo:\n *\n * • A VARIANTE PADRÃO (0037). Todo produto tem uma, ela não aparece em lugar\n * nenhum, e sumir com o último eixo tem que trazê-la de volta — senão o\n * produto fica esgotado para sempre e ninguém vê erro. `applyVariantMatrix`\n * é quem sabe disso.\n * • O ESTOQUE. Desde a 0034 ele é razão, não coluna: quem digita 12 aqui não\n * escreve 12 em lugar nenhum, gera o movimento da DIFERENÇA e deixa a 0036\n * espelhar de volta. `setVariantStock` é quem sabe disso.\n */\nexport function ProductVariantsTab({ item, getProvider }: {\n item: unknown\n getProvider: () => ShopProvider\n}) {\n const product = item as Product\n const shop = getProvider()\n // Os quatro verbos que esta tela chama. Checar só um deixaria a aba abrir e\n // quebrar no primeiro clique — que é pior do que não abrir.\n const supported =\n typeof shop.getProductVariants === 'function' &&\n typeof shop.saveProductOptions === 'function' &&\n typeof shop.createProductVariant === 'function' &&\n typeof shop.updateProductVariant === 'function'\n\n const [axes, setAxes] = React.useState<VariantAxisInput[]>([])\n const [variants, setVariants] = React.useState<ProductVariant[]>([])\n const [busy, setBusy] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const [selected, setSelected] = React.useState<Set<string>>(new Set())\n const [dirty, setDirty] = React.useState(false)\n\n const reload = React.useCallback(async () => {\n // includeArchived: uma combinação removida e recolocada tem que REVIVER a\n // linha antiga — a 0028 tem UNIQUE (product_id, options) e um INSERT novo\n // bateria nela.\n const set = await getProvider().getProductVariants!(product.id, { includeArchived: true })\n setAxes(axesFromOptions(set.options))\n setVariants(set.variants)\n setSelected(new Set())\n setDirty(false)\n }, [getProvider, product.id])\n\n React.useEffect(() => {\n if (!supported) return\n void reload().catch((e) => setError(message(e)))\n }, [reload, supported])\n\n async function run(action: () => Promise<unknown>) {\n setBusy(true)\n setError(null)\n try {\n await action()\n await reload()\n } catch (e) {\n setError(message(e))\n } finally {\n setBusy(false)\n }\n }\n\n const plan = React.useMemo(() => planVariantMatrix(axes, variants), [axes, variants])\n const axisError = validateVariantAxes(axes)\n const onlyDefault = hasOnlyDefaultVariant(variants)\n const rows = plan.rows\n\n function patchAxes(next: VariantAxisInput[]) {\n setAxes(next)\n setDirty(true)\n }\n\n const save = () => run(() => applyVariantMatrix(getProvider(), product.id, axes, variants))\n\n if (!supported) {\n return <Notice>Este provedor de loja não administra variantes.</Notice>\n }\n\n return (\n <div className=\"space-y-6\">\n {/* — Eixos — */}\n <section className=\"space-y-3\">\n <header className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <h3 className=\"text-sm font-semibold\">Opções</h3>\n <p className=\"text-xs text-muted-foreground\">\n Tamanho, cor, sabor. Cada combinação vira uma variante com preço, SKU e estoque próprios\n — é assim que P e GG deixam de dividir o mesmo contador.\n </p>\n </div>\n <button\n type=\"button\"\n disabled={busy || axes.length >= MAX_VARIANT_AXES}\n onClick={() => patchAxes([...axes, { name: '', values: [] }])}\n className=\"inline-flex items-center gap-1.5 rounded-md border px-2.5 py-1.5 text-xs font-medium transition hover:bg-muted disabled:opacity-40\"\n >\n <Plus className=\"h-3.5 w-3.5\" /> Adicionar opção\n </button>\n </header>\n\n {axes.length === 0 ? (\n <p className=\"rounded-lg border border-dashed px-4 py-8 text-center text-sm text-muted-foreground\">\n Este produto é vendido de um jeito só. Adicione uma opção se ele tem tamanhos, cores ou sabores.\n </p>\n ) : (\n <ul className=\"space-y-3\">\n {axes.map((axis, index) => (\n <AxisEditor\n key={index}\n axis={axis}\n index={index}\n count={axes.length}\n disabled={busy}\n onChange={(next) => patchAxes(axes.map((a, i) => (i === index ? next : a)))}\n onMove={(delta) => {\n const target = index + delta\n if (target < 0 || target >= axes.length) return\n const next = [...axes]\n const [moved] = next.splice(index, 1)\n next.splice(target, 0, moved!)\n patchAxes(next)\n }}\n onRemove={() => patchAxes(axes.filter((_, i) => i !== index))}\n />\n ))}\n </ul>\n )}\n\n {axisError && <Notice tone=\"error\">{axisError}</Notice>}\n {!axisError && leavesNothingSellable(plan) && (\n <Notice tone=\"error\">\n Sem nenhuma opção este produto ficaria sem nada vendável — ele não tem a variante padrão\n que a plataforma cria hoje. Fale com o suporte antes de salvar.\n </Notice>\n )}\n\n {dirty && (\n <div className=\"flex flex-wrap items-center gap-3 rounded-lg border bg-muted/30 px-4 py-3\">\n <p className=\"flex-1 text-xs text-muted-foreground\">\n {describePlan(plan)}\n </p>\n <button type=\"button\" disabled={busy} onClick={() => void reload()}\n className=\"rounded-md px-3 py-1.5 text-xs text-muted-foreground hover:bg-muted disabled:opacity-40\">\n Descartar\n </button>\n <button\n type=\"button\"\n disabled={busy || Boolean(axisError)}\n onClick={save}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground disabled:opacity-50\"\n >\n {busy && <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />}\n Salvar variantes\n </button>\n </div>\n )}\n </section>\n\n {error && <Notice tone=\"error\">{error}</Notice>}\n\n {/* — Matriz — */}\n {rows.length > 0 && (\n <VariantGrid\n rows={rows}\n axes={axes}\n product={product}\n busy={busy}\n dirty={dirty}\n selected={selected}\n onSelect={setSelected}\n onSave={(variantId, patch) => run(() => getProvider().updateProductVariant!(variantId, patch))}\n onStock={(variantId, count) => run(() => getProvider().setVariantStock!(variantId, count))}\n />\n )}\n\n {rows.length === 0 && onlyDefault && (\n <p className=\"text-xs text-muted-foreground\">\n Preço, SKU e estoque deste produto continuam na aba de cadastro.\n </p>\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Eixo\n// ---------------------------------------------------------------------------\n\nfunction AxisEditor({ axis, index, count, disabled, onChange, onMove, onRemove }: {\n axis: VariantAxisInput\n index: number\n count: number\n disabled: boolean\n onChange: (next: VariantAxisInput) => void\n onMove: (delta: number) => void\n onRemove: () => void\n}) {\n const [draft, setDraft] = React.useState('')\n\n function commit(raw: string) {\n // Vírgula separa: colar \"P, M, G\" é como um lojista digita uma grade, e\n // pedir três enters para isso é atrito sem motivo.\n const values = raw.split(',').map((v) => v.trim()).filter(Boolean)\n if (values.length === 0) return\n const merged = [...axis.values]\n for (const value of values) if (!merged.includes(value)) merged.push(value)\n onChange({ ...axis, values: merged })\n setDraft('')\n }\n\n return (\n <li className=\"rounded-lg border bg-card p-3\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <input\n value={axis.name}\n disabled={disabled}\n onChange={(e) => onChange({ ...axis, name: e.target.value })}\n placeholder=\"Tamanho\"\n aria-label={`Nome da opção ${index + 1}`}\n className=\"h-8 w-40 rounded-input border border-input bg-background px-2 text-sm font-medium\"\n />\n <span className=\"flex-1\" />\n <IconButton label=\"Mover para cima\" disabled={disabled || index === 0} onClick={() => onMove(-1)}>↑</IconButton>\n <IconButton label=\"Mover para baixo\" disabled={disabled || index === count - 1} onClick={() => onMove(1)}>↓</IconButton>\n <button\n type=\"button\"\n aria-label=\"Remover opção\"\n disabled={disabled}\n onClick={onRemove}\n className=\"rounded p-1.5 text-muted-foreground transition hover:text-destructive disabled:opacity-40\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n\n <div className=\"mt-2 flex flex-wrap items-center gap-1.5\">\n {axis.values.map((value, position) => (\n <span key={value} className=\"inline-flex items-center gap-1 rounded-full bg-muted px-2.5 py-1 text-xs\">\n {value}\n <button\n type=\"button\"\n aria-label={`Remover ${value}`}\n disabled={disabled}\n onClick={() => onChange({ ...axis, values: axis.values.filter((_, i) => i !== position) })}\n className=\"text-muted-foreground hover:text-destructive disabled:opacity-40\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </span>\n ))}\n <input\n value={draft}\n disabled={disabled}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') { e.preventDefault(); commit(draft) }\n }}\n onBlur={() => commit(draft)}\n placeholder={axis.values.length === 0 ? 'P, M, G' : 'adicionar'}\n aria-label={`Valores da opção ${index + 1}`}\n className=\"h-7 min-w-28 flex-1 rounded-input border border-dashed border-input bg-transparent px-2 text-xs\"\n />\n </div>\n </li>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Matriz\n// ---------------------------------------------------------------------------\n\nconst UNITS = ['kg', 'g', 'lb']\n\nfunction VariantGrid({ rows, axes, product, busy, dirty, selected, onSelect, onSave, onStock }: {\n rows: VariantMatrixRow[]\n axes: VariantAxisInput[]\n product: Product\n busy: boolean\n dirty: boolean\n selected: Set<string>\n onSelect: (next: Set<string>) => void\n onSave: (variantId: string, patch: Record<string, unknown>) => void\n onStock: (variantId: string, count: number) => void\n}) {\n const saved = rows.filter((row) => row.variant)\n const allSelected = saved.length > 0 && saved.every((row) => selected.has(row.variant!.id))\n\n function toggle(id: string) {\n const next = new Set(selected)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n onSelect(next)\n }\n\n return (\n <section className=\"space-y-3\">\n <header>\n <h3 className=\"text-sm font-semibold\">Variantes</h3>\n <p className=\"text-xs text-muted-foreground\">\n Preço vazio herda o preço do produto — o catálogo em que todo tamanho custa igual não precisa\n repetir o número {rows.length} vezes. Medida vazia herda a do produto, do mesmo jeito.\n </p>\n </header>\n\n {dirty && (\n <Notice>\n As linhas abaixo ainda refletem o que está salvo. Salve as opções para gerar as novas combinações.\n </Notice>\n )}\n\n {selected.size > 0 && (\n <BulkBar\n count={selected.size}\n disabled={busy}\n onApply={(patch) => {\n for (const id of selected) onSave(id, patch)\n }}\n onClear={() => onSelect(new Set())}\n />\n )}\n\n <div className=\"overflow-x-auto rounded-lg border\">\n <table className=\"w-full min-w-[62rem] text-sm\">\n <thead className=\"bg-muted/40 text-left text-xs text-muted-foreground\">\n <tr>\n <th className=\"w-9 px-2 py-2\">\n <input\n type=\"checkbox\"\n aria-label=\"Selecionar todas\"\n checked={allSelected}\n disabled={busy || saved.length === 0}\n onChange={() => onSelect(allSelected ? new Set() : new Set(saved.map((r) => r.variant!.id)))}\n />\n </th>\n <th className=\"px-2 py-2 font-medium\">Variante</th>\n <th className=\"px-2 py-2 font-medium\">Preço</th>\n <th className=\"px-2 py-2 font-medium\">Comparativo</th>\n <th className=\"px-2 py-2 font-medium\">SKU</th>\n <th className=\"px-2 py-2 font-medium\">Estoque</th>\n <th className=\"px-2 py-2 font-medium\">Peso</th>\n <th className=\"px-2 py-2 font-medium\">A × L × C (cm)</th>\n <th className=\"px-2 py-2 font-medium\">Foto</th>\n <th className=\"px-2 py-2 font-medium\">Ativa</th>\n </tr>\n </thead>\n <tbody className=\"divide-y\">\n {rows.map((row) => (\n <VariantRow\n key={row.variant?.id ?? formatVariantCombination(row.options, axes)}\n row={row}\n axes={axes}\n product={product}\n busy={busy}\n checked={row.variant ? selected.has(row.variant.id) : false}\n onToggle={() => row.variant && toggle(row.variant.id)}\n onSave={onSave}\n onStock={onStock}\n />\n ))}\n </tbody>\n </table>\n </div>\n </section>\n )\n}\n\nfunction VariantRow({ row, axes, product, busy, checked, onToggle, onSave, onStock }: {\n row: VariantMatrixRow\n axes: VariantAxisInput[]\n product: Product\n busy: boolean\n checked: boolean\n onToggle: () => void\n onSave: (variantId: string, patch: Record<string, unknown>) => void\n onStock: (variantId: string, count: number) => void\n}) {\n const variant = row.variant\n const pending = !variant\n const label = formatVariantCombination(row.options, axes)\n\n // Só grava no blur, e só quando mudou: cada campo é um UPDATE e o estoque é\n // um movimento no razão — disparar a cada tecla encheria o histórico de\n // ajustes de um dígito.\n const commit = (field: string, value: unknown, previous: unknown) => {\n if (!variant || value === previous) return\n onSave(variant.id, { [field]: value })\n }\n\n return (\n <tr className={pending ? 'bg-muted/20 text-muted-foreground' : undefined}>\n <td className=\"px-2 py-1.5\">\n <input type=\"checkbox\" aria-label={`Selecionar ${label}`} checked={checked}\n disabled={busy || pending} onChange={onToggle} />\n </td>\n <td className=\"px-2 py-1.5 font-medium\">\n {label}\n {pending && <span className=\"ml-2 text-[10px] uppercase tracking-wide\">a criar</span>}\n </td>\n <td className=\"px-2 py-1.5\">\n <NumberCell value={variant?.price ?? null} disabled={busy || pending}\n placeholder={String(product.price)} onCommit={(v) => commit('price', v, variant?.price ?? null)} />\n </td>\n <td className=\"px-2 py-1.5\">\n <NumberCell value={variant?.compareAtPrice ?? null} disabled={busy || pending}\n placeholder=\"—\" onCommit={(v) => commit('compareAtPrice', v, variant?.compareAtPrice ?? null)} />\n </td>\n <td className=\"px-2 py-1.5\">\n <TextCell value={variant?.sku ?? ''} disabled={busy || pending}\n placeholder={product.sku ?? 'SKU'} onCommit={(v) => commit('sku', v || null, variant?.sku ?? null)} />\n </td>\n <td className=\"px-2 py-1.5\">\n <NumberCell\n value={variant?.inventoryCount ?? null}\n disabled={busy || pending}\n placeholder=\"0\"\n integer\n onCommit={(v) => {\n if (!variant || v == null || v === variant.inventoryCount) return\n onStock(variant.id, v)\n }}\n />\n </td>\n <td className=\"px-2 py-1.5\">\n <div className=\"flex items-center gap-1\">\n <NumberCell value={variant?.weight ?? null} disabled={busy || pending}\n placeholder={product.weight == null ? '—' : String(product.weight)} width=\"w-16\"\n onCommit={(v) => commit('weight', v, variant?.weight ?? null)} />\n <select\n value={variant?.weightUnit ?? ''}\n disabled={busy || pending}\n onChange={(e) => commit('weightUnit', e.target.value || null, variant?.weightUnit ?? null)}\n aria-label={`Unidade de peso de ${label}`}\n className=\"h-7 rounded-input border border-input bg-background px-1 text-xs\"\n >\n <option value=\"\">{product.weightUnit}</option>\n {UNITS.map((unit) => <option key={unit} value={unit}>{unit}</option>)}\n </select>\n </div>\n </td>\n <td className=\"px-2 py-1.5\">\n <div className=\"flex items-center gap-1\">\n {(['heightCm', 'widthCm', 'lengthCm'] as const).map((key) => (\n <NumberCell\n key={key}\n value={variant?.[key] ?? null}\n disabled={busy || pending}\n width=\"w-14\"\n placeholder={product[key] == null ? '—' : String(product[key])}\n onCommit={(v) => commit(key, v, variant?.[key] ?? null)}\n />\n ))}\n </div>\n </td>\n <td className=\"px-2 py-1.5\">\n <select\n value={variant?.imageId ?? ''}\n disabled={busy || pending || product.images.length === 0}\n onChange={(e) => commit('imageId', e.target.value || null, variant?.imageId ?? null)}\n aria-label={`Foto de ${label}`}\n className=\"h-7 w-24 rounded-input border border-input bg-background px-1 text-xs\"\n >\n <option value=\"\">capa</option>\n {product.images.map((image, index) => (\n <option key={image.id} value={image.id}>Foto {index + 1}</option>\n ))}\n </select>\n </td>\n <td className=\"px-2 py-1.5\">\n <input\n type=\"checkbox\"\n aria-label={`${label} ativa`}\n checked={variant?.status === 'active'}\n disabled={busy || pending}\n onChange={(e) => commit('status', e.target.checked ? 'active' : 'archived', variant?.status)}\n />\n </td>\n </tr>\n )\n}\n\n/** Preço e peso em massa — os dois que o Shopify tem, e os dois que uma grade\n * inteira costuma compartilhar. */\nfunction BulkBar({ count, disabled, onApply, onClear }: {\n count: number\n disabled: boolean\n onApply: (patch: Record<string, unknown>) => void\n onClear: () => void\n}) {\n const [price, setPrice] = React.useState('')\n const [weight, setWeight] = React.useState('')\n const [unit, setUnit] = React.useState('')\n\n return (\n <div className=\"flex flex-wrap items-center gap-2 rounded-lg border bg-muted/30 px-3 py-2 text-xs\">\n <span className=\"font-medium\">{count} selecionada{count > 1 ? 's' : ''}</span>\n <span className=\"text-muted-foreground\">·</span>\n <input value={price} onChange={(e) => setPrice(e.target.value)} placeholder=\"Preço\"\n aria-label=\"Preço para todas\" className=\"h-7 w-24 rounded-input border border-input bg-background px-2\" />\n <button type=\"button\" disabled={disabled || parseNumber(price) == null}\n onClick={() => { onApply({ price: parseNumber(price) }); setPrice('') }}\n className=\"rounded-md border px-2 py-1 font-medium hover:bg-muted disabled:opacity-40\">\n Aplicar preço\n </button>\n <span className=\"text-muted-foreground\">·</span>\n <input value={weight} onChange={(e) => setWeight(e.target.value)} placeholder=\"Peso\"\n aria-label=\"Peso para todas\" className=\"h-7 w-20 rounded-input border border-input bg-background px-2\" />\n <select value={unit} onChange={(e) => setUnit(e.target.value)} aria-label=\"Unidade para todas\"\n className=\"h-7 rounded-input border border-input bg-background px-1\">\n <option value=\"\">herdar</option>\n {UNITS.map((u) => <option key={u} value={u}>{u}</option>)}\n </select>\n <button type=\"button\" disabled={disabled || parseNumber(weight) == null}\n onClick={() => { onApply({ weight: parseNumber(weight), weightUnit: unit || null }); setWeight('') }}\n className=\"rounded-md border px-2 py-1 font-medium hover:bg-muted disabled:opacity-40\">\n Aplicar peso\n </button>\n <span className=\"flex-1\" />\n <button type=\"button\" onClick={onClear} className=\"text-muted-foreground hover:text-foreground\">\n limpar seleção\n </button>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Peças\n// ---------------------------------------------------------------------------\n\n/** '2,5' e '2.5' são a mesma medida — o lojista digita como o teclado dele manda. */\nexport function parseNumber(raw: string): number | null {\n const cleaned = raw.replace(/[^\\d,.-]/g, '').replace(',', '.')\n if (!cleaned.trim()) return null\n const n = Number(cleaned)\n return Number.isFinite(n) && n >= 0 ? n : null\n}\n\nfunction NumberCell({ value, disabled, placeholder, onCommit, width = 'w-20', integer }: {\n value: number | null\n disabled?: boolean\n placeholder?: string\n onCommit: (value: number | null) => void\n width?: string\n integer?: boolean\n}) {\n const [draft, setDraft] = React.useState(value == null ? '' : String(value))\n React.useEffect(() => { setDraft(value == null ? '' : String(value)) }, [value])\n return (\n <input\n value={draft}\n disabled={disabled}\n placeholder={placeholder}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => {\n const parsed = parseNumber(draft)\n onCommit(parsed == null ? null : integer ? Math.trunc(parsed) : parsed)\n }}\n className={`h-7 ${width} rounded-input border border-input bg-background px-2 text-xs tabular-nums`}\n />\n )\n}\n\nfunction TextCell({ value, disabled, placeholder, onCommit }: {\n value: string\n disabled?: boolean\n placeholder?: string\n onCommit: (value: string) => void\n}) {\n const [draft, setDraft] = React.useState(value)\n React.useEffect(() => { setDraft(value) }, [value])\n return (\n <input\n value={draft}\n disabled={disabled}\n placeholder={placeholder}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => onCommit(draft.trim())}\n className=\"h-7 w-28 rounded-input border border-input bg-background px-2 text-xs\"\n />\n )\n}\n\nfunction IconButton({ label, disabled, onClick, children }: {\n label: string\n disabled?: boolean\n onClick: () => void\n children: React.ReactNode\n}) {\n return (\n <button\n type=\"button\"\n aria-label={label}\n title={label}\n disabled={disabled}\n onClick={onClick}\n className=\"rounded border px-1.5 py-0.5 text-xs text-muted-foreground transition hover:bg-muted hover:text-foreground disabled:opacity-40\"\n >\n {children}\n </button>\n )\n}\n\nfunction Notice({ children, tone }: { children: React.ReactNode; tone?: 'error' }) {\n const cls = tone === 'error'\n ? 'border-destructive/30 bg-destructive/5 text-destructive'\n : 'border-border bg-muted/30 text-muted-foreground'\n return (\n <p className={`flex items-start gap-2 rounded-md border px-3 py-2 text-xs ${cls}`}>\n {tone === 'error' && <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />}\n <span>{children}</span>\n </p>\n )\n}\n\nfunction describePlan(plan: ReturnType<typeof planVariantMatrix>): string {\n const parts: string[] = []\n if (plan.create.length) parts.push(`${plan.create.length} a criar`)\n if (plan.reactivate.length) parts.push(`${plan.reactivate.length} a reativar`)\n if (plan.archive.length) parts.push(`${plan.archive.length} a arquivar`)\n if (parts.length === 0) return 'Nenhuma combinação muda.'\n // Arquivar e não excluir: a 0034 apaga o saldo junto com a variante, e o\n // estoque que sobrou é de mercadoria que o lojista ainda tem na prateleira.\n return `${parts.join(', ')}. Combinações removidas são arquivadas, nunca excluídas — o estoque delas continua no histórico.`\n}\n\nfunction message(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n","/** The Entrega settings tab id, as the manifest declares it. */\nexport const SHIPPING_SETTINGS_TAB = 'shop-shipping'\n\nexport const SHIPPING_SETTINGS_ROUTE = `/settings/${SHIPPING_SETTINGS_TAB}`\n\n/** The shell's own prefix for a registry inside a plugin settings tab. */\nconst PROPERTIES = '_properties'\n\nexport function shippingRegistryPath(registryId: string): string {\n return `${SHIPPING_SETTINGS_ROUTE}/${PROPERTIES}/${registryId}`\n}\n\n/**\n * Straight to the form of ONE record.\n *\n * A summary row that names a place and then lands on the list of places makes\n * the reader find it again, open it, and click \"editar\" — three steps to reach\n * what the row was already pointing at.\n */\nexport function shippingRecordPath(registryId: string, recordId: string, mode: 'view' | 'edit' = 'edit'): string {\n const base = `${shippingRegistryPath(registryId)}/${recordId}`\n return mode === 'edit' ? `${base}/edit` : base\n}\n\n/**\n * The registry the URL is asking for, or null for the tab's summary.\n *\n * Returns the raw id rather than validating against a list — the registry lookup\n * is the only list, and a second one here is what drifted when `zonas` was\n * renamed.\n */\nexport function shippingRegistryIdFromHash(hash?: string): string | null {\n const raw = hash ?? (typeof window === 'undefined' ? '' : window.location.hash)\n const path = raw.startsWith('#') ? raw.slice(1) : raw\n const marker = `${SHIPPING_SETTINGS_ROUTE}/${PROPERTIES}/`\n if (!path.startsWith(marker)) return null\n return path.slice(marker.length).split('/')[0] || null\n}\n","import React from 'react'\nimport { errorMessage } from '../settings/error-message'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport type { ShippingPackage, ShopProvider } from '@fayz-ai/shop'\nimport { adminNavigateTo, CrudFormPage } from '@fayz-ai/admin'\nimport { resolveDataProvider } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\nimport { Box, ChevronDown, Plus } from 'lucide-react'\nimport { Modal, ModalContent, ModalHeader, ModalTitle, ModalBody } from '@fayz-ai/ui'\nimport { packageMeasureLabel, packagesRegistry, PACKAGES_REGISTRY } from '../data/registries'\nimport { shippingRegistryPath } from '../data/registry-routes'\n\nconst PACKAGES_ROUTE = shippingRegistryPath(PACKAGES_REGISTRY)\n\n/**\n * Em que embalagem ESTE produto vai.\n *\n * A lista de embalagens da loja é a fonte (Configurações → Entrega →\n * Embalagens); aqui o produto só aponta para uma linha dela. Foi a correção do\n * founder sobre o Shopify: lá o produto se ASSOCIA a uma embalagem já\n * cadastrada, em vez de repetir altura e largura no cadastro de cada item — o\n * que ele escolhe não é uma medida, é o pacote em que a loja despacha.\n *\n * Vazio = «padrão da loja», que é um estado legítimo e o de toda loja no dia\n * seguinte à 0046. Não é «não preenchido».\n */\nexport function PackageSelect({ value, onChange, getProvider }: {\n value: string | null\n onChange: (next: string | null) => void\n getProvider?: () => ShopProvider\n}) {\n const shop = React.useMemo(() => getProvider?.() ?? getShopProvider(), [getProvider])\n const [rows, setRows] = React.useState<ShippingPackage[] | null>(null)\n const [open, setOpen] = React.useState(false)\n const [creating, setCreating] = React.useState(false)\n const ref = React.useRef<HTMLDivElement>(null)\n\n const load = React.useCallback(() => {\n if (typeof shop.listShippingPackages !== 'function') { setRows([]); return }\n void shop.listShippingPackages().then(setRows).catch(() => setRows([]))\n }, [shop])\n\n React.useEffect(load, [load])\n\n React.useEffect(() => {\n if (!open) return\n const away = (event: MouseEvent) => {\n if (ref.current && !ref.current.contains(event.target as Node)) setOpen(false)\n }\n document.addEventListener('mousedown', away)\n return () => document.removeEventListener('mousedown', away)\n }, [open])\n\n const selected = (rows ?? []).find((row) => row.id === value) ?? null\n const storeDefault = (rows ?? []).find((row) => row.isDefault) ?? null\n\n const label = selected\n ? `${selected.name} — ${packageMeasureLabel(selected)}`\n : storeDefault\n ? `Padrão da loja • ${storeDefault.name} — ${packageMeasureLabel(storeDefault)}`\n : 'Padrão da loja'\n\n return (\n <div className=\"relative\" ref={ref}>\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n className=\"flex h-9 w-full items-center gap-2 rounded-input border border-input bg-background px-3 text-left text-sm shadow-sm\"\n >\n <Box className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate\">{label}</span>\n <ChevronDown className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n </button>\n\n {open && (\n <div className=\"absolute z-30 mt-1 w-full overflow-hidden rounded-lg border bg-popover shadow-lg\">\n <button\n type=\"button\"\n onClick={() => { setOpen(false); setCreating(true) }}\n className=\"flex w-full items-center gap-2 px-3 py-2 text-left text-sm text-primary hover:bg-muted\"\n >\n <Plus className=\"h-4 w-4\" /> Adicionar embalagem\n </button>\n <div className=\"max-h-64 overflow-y-auto border-t\">\n <Option\n label=\"Padrão da loja\"\n hint={storeDefault ? packageMeasureLabel(storeDefault) : 'Nenhuma marcada — cai no piso da transportadora.'}\n active={value == null}\n onClick={() => { onChange(null); setOpen(false) }}\n />\n {(rows ?? []).map((row) => (\n <Option\n key={row.id}\n label={row.name}\n hint={packageMeasureLabel(row)}\n active={row.id === value}\n onClick={() => { onChange(row.id); setOpen(false) }}\n />\n ))}\n </div>\n <button\n type=\"button\"\n onClick={() => { setOpen(false); adminNavigateTo(PACKAGES_ROUTE) }}\n className=\"w-full border-t px-3 py-2 text-left text-xs text-muted-foreground hover:bg-muted\"\n >\n Gerenciar embalagens\n </button>\n </div>\n )}\n\n {creating && (\n <NewPackageModal\n onClose={() => setCreating(false)}\n onCreated={(id) => { setCreating(false); onChange(id); load() }}\n />\n )}\n </div>\n )\n}\n\n/**\n * Cadastrar uma caixa sem sair do produto.\n *\n * Monta o MESMO EntityDef do registry no `CrudFormPage` genérico e grava pelo\n * MESMO provider — não é um formulário paralelo com os mesmos seis campos\n * digitados de novo, que é como duas telas para uma tabela começam a discordar\n * sobre o que é obrigatório.\n */\nfunction NewPackageModal({ onClose, onCreated }: {\n onClose: () => void\n onCreated: (id: string) => void\n}) {\n const [error, setError] = React.useState<string | null>(null)\n const provider = React.useMemo(\n () => resolveDataProvider(packagesRegistry.entity as EntityDef<{ id: string }>),\n [],\n )\n\n // Pelo Modal da SDK, e não por uma caixa `fixed` solta: o formulário agora\n // mede a PRÓPRIA largura (container query), e um `fixed` dentro dele passaria\n // a cobrir só a coluna do formulário em vez da tela.\n return (\n <Modal open onOpenChange={(next) => { if (!next) onClose() }}>\n <ModalContent size=\"2xl\">\n <ModalHeader>\n <ModalTitle>Nova embalagem</ModalTitle>\n </ModalHeader>\n <ModalBody className=\"space-y-3\">\n {error && <p className=\"rounded-md border border-destructive/30 bg-destructive/5 px-3 py-2 text-xs text-destructive\">{error}</p>}\n <CrudFormPage\n entityDef={packagesRegistry.entity as EntityDef}\n mode=\"create\"\n namePlural=\"Embalagens\"\n embedded\n onCancel={onClose}\n onSubmit={async (data) => {\n try {\n const created = await provider.create(data as never)\n onCreated((created as { id: string }).id)\n } catch (e) {\n setError(errorMessage(e))\n }\n }}\n />\n </ModalBody>\n </ModalContent>\n </Modal>\n )\n}\n\nfunction Option({ label, hint, active, onClick }: {\n label: string\n hint: string\n active: boolean\n onClick: () => void\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={`flex w-full flex-col px-3 py-2 text-left hover:bg-muted ${active ? 'bg-muted/60' : ''}`}\n >\n <span className=\"text-sm\">{label}</span>\n <span className=\"text-xs text-muted-foreground\">{hint}</span>\n </button>\n )\n}\n","import React from 'react'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport type { ShippingProfile, ShopProvider } from '@fayz-ai/shop'\nimport { adminNavigateTo } from '@fayz-ai/admin'\nimport { ExternalLink } from 'lucide-react'\nimport { SHIPPING_PROFILES_REGISTRY } from '../data/registries'\nimport { shippingRegistryPath } from '../data/registry-routes'\n\n/**\n * Which zones this product ships through — it points at an existing profile, the\n * way it points at a package. Empty is the general profile, a real state, which\n * is why the empty option is named rather than blank.\n */\nexport function ShippingProfileSelect({ value, onChange, getProvider }: {\n value: string | null\n onChange: (next: string | null) => void\n getProvider?: () => ShopProvider\n}) {\n const shop = React.useMemo(() => getProvider?.() ?? getShopProvider(), [getProvider])\n const [rows, setRows] = React.useState<ShippingProfile[] | null>(null)\n\n React.useEffect(() => {\n let cancelled = false\n if (typeof shop.listShippingProfiles !== 'function') { setRows([]); return }\n void shop.listShippingProfiles()\n .then((list) => { if (!cancelled) setRows(list) })\n .catch(() => { if (!cancelled) setRows([]) })\n return () => { cancelled = true }\n }, [shop])\n\n const custom = (rows ?? []).filter((row) => !row.isDefault)\n const chosen = custom.find((row) => row.id === value) ?? null\n\n return (\n <div className=\"space-y-1.5\">\n <select\n value={value ?? ''}\n onChange={(event) => onChange(event.target.value || null)}\n disabled={rows == null}\n className=\"flex h-9 w-full rounded-input border border-input bg-background px-3 py-1.5 text-sm shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <option value=\"\">Geral — as zonas normais da loja</option>\n {custom.map((row) => (\n <option key={row.id} value={row.id}>\n {row.name}\n {row.carrierQuotes === false ? ' — só entrega própria' : ''}\n </option>\n ))}\n </select>\n\n <p className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n {chosen?.carrierQuotes === false\n ? 'Este produto não é cotado por transportadora: sai só pelas zonas do perfil.'\n : custom.length === 0\n ? 'Nenhum perfil além do geral.'\n : 'Perfil de entrega deste produto.'}\n <button\n type=\"button\"\n onClick={() => adminNavigateTo(shippingRegistryPath(SHIPPING_PROFILES_REGISTRY))}\n className=\"inline-flex items-center gap-1 text-primary hover:underline\"\n >\n {custom.length === 0 ? 'Criar um perfil' : 'Gerenciar perfis'}\n <ExternalLink className=\"h-3 w-3\" />\n </button>\n </p>\n </div>\n )\n}\n","import React from 'react'\nimport { Package } from 'lucide-react'\nimport { Thumbnail } from '@fayz-ai/ui'\nimport type { EntityDef, EntityImageConfig, FieldDef } from '@fayz-ai/core'\nimport type { Product, ShopProvider } from '@fayz-ai/shop'\nimport { ProductImagesTab } from './ProductImagesTab'\nimport { ProductVariantsTab } from './ProductVariantsTab'\nimport { PackageSelect } from './PackageSelect'\nimport { ShippingProfileSelect } from './ShippingProfileSelect'\n\n/** Tudo o que só faz sentido para algo que entra numa caixa. */\nconst physical = (values: Record<string, unknown>) => values.isPhysical !== false\n\n// ---------------------------------------------------------------------------\n// Storefront Product — the single source of truth for the shop product CRUD.\n// Drives the list columns AND the form sections via the generic CRUD scaffolding\n// (createCrudPage → CrudListView + CrudFormPage), same pattern plugin-inventory\n// uses for its ERP product.\n//\n// This is deliberately the STOREFRONT shape (what a shopper sees: name, price,\n// compare-at, images, publication status), not the ERP shape plugin-inventory\n// models (cost, margin, min/max levels). They are different products in\n// different tables — see the shop/inventory bridge note in the roadmap.\n//\n// VARIANTES vivem na aba \"Variantes\" e não aqui: os eixos e a matriz são uma\n// COLEÇÃO derivada do produto, não campos dele, do mesmo jeito que as fotos.\n// (Este cabeçalho dizia \"falta plg_shop_variants\" — as tabelas existem desde a\n// 0028 e a vitrine lê delas desde o M5; o que faltava era a tela.)\n//\n// Not modelled here because the schema has nowhere to put them yet:\n// • SEO title/description — needs columns on plg_shop_products\n// • multi-category — the column is a single category_id\n// ---------------------------------------------------------------------------\n\nconst STATUS_TONE: Record<string, string> = {\n active: 'bg-emerald-100 text-emerald-800',\n draft: 'bg-gray-100 text-gray-700',\n archived: 'bg-orange-100 text-orange-700',\n}\n\nconst STATUS_LABEL: Record<string, string> = {\n active: 'Ativo',\n draft: 'Rascunho',\n archived: 'Arquivado',\n}\n\nfunction money(value: unknown, currency = 'BRL') {\n const n = Number(value)\n if (!Number.isFinite(n)) return '—'\n return new Intl.NumberFormat('pt-BR', { style: 'currency', currency }).format(n)\n}\n\n/** `name` → `name-do-produto`, so the storefront URL is filled in for you. */\nexport function slugify(value: string): string {\n return value\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n}\n\n/**\n * Wires the form's image slot to the product's own images. `uploadProductImage`\n * has existed on the provider all along with nothing calling it — the slot was a\n * decorative square, so a product with a photo still showed an empty placeholder.\n */\nfunction productImage(getProvider: () => ShopProvider): EntityImageConfig {\n return {\n get: (row) => {\n const images = (row as Partial<Product>).images\n return images?.find((i) => i.isPrimary)?.url ?? images?.[0]?.url\n },\n upload: async (file, row) => {\n if (!row.id) throw new Error('Salve o produto antes de enviar a imagem.')\n const image = await getProvider().uploadProductImage(row.id, file)\n return image.url\n },\n accept: 'image/*',\n }\n}\n\nexport function buildShopProductEntity(\n currencyCode = 'BRL',\n getProvider?: () => ShopProvider,\n): EntityDef<Product> {\n const fields: FieldDef[] = [\n // — Geral —\n {\n key: 'name', label: 'Nome do produto', type: 'text', required: true,\n group: 'general', placeholder: 'Costela Bovina Defumada 400g',\n searchable: true, showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n <div className=\"flex items-center gap-3\">\n {/* Always the square, photo or not: a product without one used to\n render nothing and pull its name back against the rows that had\n one, so the column stopped reading as a column. */}\n <Thumbnail src={row.images?.[0]?.url} icon={Package} />\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium\">{row.name}</p>\n {row.sku && <p className=\"text-xs text-muted-foreground\">{row.sku}</p>}\n </div>\n </div>\n ),\n },\n {\n key: 'slug', label: 'URL', type: 'text', group: 'general',\n placeholder: 'gerado a partir do nome',\n hint: 'Endereço do produto na loja. Deixe em branco para gerar automaticamente.',\n showInTable: false,\n },\n {\n key: 'description', label: 'Descrição', type: 'textarea', group: 'general', span: 2,\n placeholder: 'Como é feito, como preparar, o que acompanha…',\n showInTable: false,\n },\n\n // — Preço —\n {\n key: 'price', label: 'Preço de venda', type: 'currency', required: true,\n group: 'pricing', currency: currencyCode, currencySymbol: 'R$', currencyLocale: 'pt-BR',\n showInTable: true, sortable: true,\n // O \"de\" riscado vai EMBAIXO do preço em vigor, não ao lado: lado a lado\n // as duas quantias competem na mesma linha e o olho lê a maior primeiro.\n renderCell: (v, row: any) => (\n <div className=\"flex flex-col items-end leading-tight\">\n <span className=\"font-medium\">{money(v, row.currency)}</span>\n {row.compareAtPrice > row.price && (\n <span className=\"text-xs text-muted-foreground line-through\">\n {money(row.compareAtPrice, row.currency)}\n </span>\n )}\n </div>\n ),\n },\n {\n key: 'compareAtPrice', label: 'Preço comparativo', type: 'currency', group: 'pricing',\n currency: currencyCode, currencySymbol: 'R$', currencyLocale: 'pt-BR',\n hint: 'Preço \"de\" riscado. Deixe vazio se não estiver em promoção.',\n showInTable: false,\n },\n {\n key: 'discount', label: 'Desconto', type: 'computed', group: 'pricing', showInTable: false,\n compute: (vals) => {\n const price = Number(vals.price) || 0\n const compare = Number(vals.compareAtPrice) || 0\n if (compare <= 0 || price <= 0 || compare <= price) return null\n const pct = ((compare - price) / compare) * 100\n return { display: `-${pct.toFixed(0)}%`, tone: 'positive' }\n },\n },\n\n // — Estoque —\n {\n key: 'sku', label: 'SKU', type: 'text', group: 'inventory',\n placeholder: 'ART-001', searchable: true, showInTable: false,\n },\n {\n key: 'inventoryCount', label: 'Estoque', type: 'number', group: 'inventory', min: 0,\n placeholder: '0', hint: 'Chega a zero e o produto aparece como esgotado na loja.',\n showInTable: true, sortable: true,\n renderCell: (v) => {\n const n = Number(v) || 0\n return (\n <span className={`block text-right ${n === 0 ? 'font-medium text-destructive' : n <= 3 ? 'text-orange-600' : ''}`}>\n {n}\n </span>\n )\n },\n },\n\n // — Publicação —\n {\n key: 'status', label: 'Status', type: 'segmented', required: true,\n group: 'publishing', span: 2,\n options: [\n { label: 'Rascunho', value: 'draft', description: 'Só você vê. Não aparece na loja.' },\n { label: 'Ativo', value: 'active', description: 'Publicado e à venda.' },\n { label: 'Arquivado', value: 'archived', description: 'Fora da loja, histórico preservado.' },\n ],\n showInTable: true, sortable: false,\n renderCell: (v) => {\n const s = String(v ?? 'draft')\n return (\n <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium ${STATUS_TONE[s] ?? STATUS_TONE.draft}`}>\n {STATUS_LABEL[s] ?? s}\n </span>\n )\n },\n },\n {\n key: 'sortOrder', label: 'Ordem na vitrine', type: 'number', group: 'publishing',\n placeholder: '0', hint: 'Menor aparece primeiro.', showInTable: false,\n },\n\n // — Envio —\n // O desenho é o do Shopify e a ordem importa: o interruptor primeiro, e o\n // resto da seção só existe depois dele. Perguntar altura de um e-book não é\n // um campo extra inofensivo — é um convite a preencher e pagar frete de um\n // download.\n {\n key: 'isPhysical', label: 'Produto físico', type: 'boolean', group: 'shipping', span: 2,\n hint: 'Desmarque para itens digitais. Eles saem do cálculo da caixa e não entram no frete.',\n showInTable: false, defaultValue: true,\n },\n {\n // Antes da embalagem de propósito: o perfil decide POR QUAIS ZONAS o item\n // sai, e a embalagem, em que caixa. A primeira pergunta é a que muda quem\n // pode levar.\n key: 'shippingProfileId', label: 'Perfil de entrega', type: 'custom', group: 'shipping', span: 2,\n hint: 'Por quais zonas este produto sai. \"Geral\" é o de todo produto que ninguém moveu.',\n showInTable: false,\n visibleWhen: (values) => values.isPhysical !== false,\n renderInput: ({ value, onChange }) => (\n <ShippingProfileSelect\n value={(value as string | null) ?? null}\n onChange={onChange}\n getProvider={getProvider}\n />\n ),\n },\n {\n key: 'packageId', label: 'Embalagem', type: 'custom', group: 'shipping', span: 2,\n hint: 'Em que a loja despacha este produto. \"Padrão da loja\" usa a embalagem marcada em Configurações → Entrega.',\n showInTable: false,\n visibleWhen: (values) => values.isPhysical !== false,\n renderInput: ({ value, onChange }) => (\n <PackageSelect\n value={(value as string | null) ?? null}\n onChange={onChange}\n getProvider={getProvider}\n />\n ),\n },\n {\n key: 'weight', label: 'Peso', type: 'number', group: 'shipping', min: 0, placeholder: '0,4',\n hint: 'Do produto embalado. A caixa vem do cadastro acima.',\n showInTable: false, visibleWhen: (values) => values.isPhysical !== false,\n },\n {\n key: 'weightUnit', label: 'Unidade', type: 'select', group: 'shipping', showInTable: false,\n hint: 'A cotação converte. Até agora ela assumia kg.',\n options: [{ label: 'kg', value: 'kg' }, { label: 'g', value: 'g' }, { label: 'lb', value: 'lb' }],\n visibleWhen: (values) => values.isPhysical !== false,\n },\n // Em centímetros, sem seletor de unidade: a coluna é `*_cm` e a caixa da\n // loja também. Duas unidades para a mesma medida é como o peso passou\n // quatro anos sendo lido errado.\n { key: 'heightCm', label: 'Altura (cm)', type: 'number', group: 'shipping', min: 0, placeholder: '10', showInTable: false, visibleWhen: physical },\n { key: 'widthCm', label: 'Largura (cm)', type: 'number', group: 'shipping', min: 0, placeholder: '20', showInTable: false, visibleWhen: physical },\n { key: 'lengthCm', label: 'Comprimento (cm)', type: 'number', group: 'shipping', min: 0, placeholder: '30', showInTable: false, visibleWhen: physical },\n {\n // Declarado aqui para poder viajar — para a transportadora, para o motoboy\n // ou para quem embala. O que a loja FAZ com um carrinho refrigerado é uma\n // decisão dela, em Configurações → Entrega.\n //\n // `visibleWhen: physical` junto com as medidas, e pelo mesmo motivo: um\n // download não tem caixa, e não há como exigir frio de um arquivo.\n key: 'handling', label: 'Exige cuidado especial', type: 'multiselect', group: 'shipping',\n showInTable: false, visibleWhen: physical,\n hint: 'Vai junto com o pedido para quem entrega. Refrigerado ou congelado também limita como a loja pode enviar.',\n options: [\n { label: 'Refrigerado', value: 'refrigerated' },\n { label: 'Congelado', value: 'frozen' },\n { label: 'Frágil', value: 'fragile' },\n ],\n },\n ]\n\n return {\n name: 'Produto',\n namePlural: 'Produtos',\n icon: 'Package',\n displayField: 'name',\n fields,\n fieldGroups: [\n // imageSlot renders the scaffolding's image uploader alongside the group.\n { id: 'general', label: 'Informações', columns: 2, imageSlot: true },\n { id: 'pricing', label: 'Preço', description: 'O preço comparativo vira o \"de\" riscado na vitrine.', columns: 3 },\n { id: 'inventory', label: 'Estoque', columns: 2 },\n { id: 'publishing', label: 'Publicação', description: 'Controla se o produto aparece na loja.', columns: 2 },\n {\n id: 'shipping',\n label: 'Envio',\n description:\n 'Peso e medidas do produto embalado. Sem eles a transportadora é consultada com a caixa padrão da loja, e o frete cotado pode não ser o frete pago.',\n columns: 3,\n },\n ],\n facets: [{ field: 'status', allLabel: 'Todos' }],\n image: getProvider ? productImage(getProvider) : undefined,\n // The form's image slot sets the COVER; this tab manages the rest of the\n // gallery. plg_shop_product_images has always held a collection, and until\n // now nothing in the admin could add a second row to it — so the storefront\n // carousel had exactly one slide for every product in the pool.\n detailTabs: getProvider\n ? [\n {\n id: 'images',\n label: 'Fotos',\n icon: 'Image',\n component: ProductImagesTab as never,\n props: { getProvider },\n },\n {\n id: 'variants',\n label: 'Variantes',\n icon: 'Layers',\n component: ProductVariantsTab as never,\n props: { getProvider },\n },\n ]\n : undefined,\n } as EntityDef<Product>\n}\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport type { ShopCustomer } from '@fayz-ai/shop'\nimport { ClientOrdersTab, createClientOrdersProvider, adminNavigateTo } from '@fayz-ai/admin'\nimport type { ClientDocument } from '@fayz-ai/admin'\n\n// ---------------------------------------------------------------------------\n// Shop customer — same declarative contract as the product entity, so the list\n// and the form both come from createCrudPage instead of a hand-rolled table.\n//\n// ordersCount / totalSpent are read-only: they are maintained server-side by the\n// shop_refresh_customer_stats trigger on every order insert/update/delete, so\n// putting them in the form would offer an edit the database would overwrite.\n// ---------------------------------------------------------------------------\n\nfunction money(value: unknown) {\n const n = Number(value)\n if (!Number.isFinite(n)) return 'R$ 0,00'\n return new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(n)\n}\n\nexport function buildShopCustomerEntity(): EntityDef<ShopCustomer> {\n const fields: FieldDef[] = [\n // — Contato —\n {\n key: 'firstName', label: 'Nome', type: 'text', required: true,\n group: 'contact', placeholder: 'Maria', searchable: true,\n showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium\">{[row.firstName, row.lastName].filter(Boolean).join(' ')}</p>\n {row.email && <p className=\"truncate text-xs text-muted-foreground\">{row.email}</p>}\n </div>\n ),\n },\n { key: 'lastName', label: 'Sobrenome', type: 'text', group: 'contact', placeholder: 'Silva', searchable: true, showInTable: false },\n {\n key: 'email', label: 'E-mail', type: 'text', group: 'contact',\n placeholder: 'maria@exemplo.com', searchable: true,\n hint: 'É por ele que o pedido é vinculado ao cliente no checkout.',\n showInTable: false,\n },\n {\n key: 'phone', label: 'Telefone', type: 'text', group: 'contact',\n placeholder: '(21) 99999-0000', searchable: true,\n showInTable: true, sortable: false,\n renderCell: (v) => <span className=\"text-muted-foreground\">{(v as string) || '—'}</span>,\n },\n // The column, the type and the provider all carried `document` already; the\n // form was the only place it could not be typed. Which meant a store could\n // see \"cliente sem CPF/CNPJ\" on every Bling run and have nowhere to fix it.\n {\n key: 'document', label: 'CPF / CNPJ', type: 'text', group: 'contact',\n placeholder: '000.000.000-00', searchable: true,\n hint: 'Necessário para emitir nota — sem ele o cliente não sobe para o ERP.',\n showInTable: false,\n },\n\n // — Histórico (somente leitura) —\n {\n key: 'ordersCount', label: 'Pedidos', type: 'number',\n showInForm: false, showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"block text-right\">{Number(v) || 0}</span>,\n },\n {\n key: 'totalSpent', label: 'Total gasto', type: 'number',\n showInForm: false, showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"block text-right font-medium\">{money(v)}</span>,\n },\n\n // — Interno —\n {\n key: 'notes', label: 'Observações', type: 'textarea', group: 'internal', span: 2,\n placeholder: 'Preferências, restrições, combinados de entrega…',\n hint: 'Visível só no admin. O cliente nunca vê.',\n showInTable: false,\n },\n ]\n\n return {\n name: 'Cliente',\n namePlural: 'Clientes',\n icon: 'Users',\n displayField: 'firstName',\n // `person` layout brings the shared archetype tabs — including Endereços,\n // which reads the core addresses table and therefore works in every app.\n layout: 'person',\n // Without archetypeKind the shell shows every person tab, including the\n // staff-only Agenda (its visibleFor filter only runs when a kind is set).\n data: { table: 'plg_shop_customers', archetypeKind: 'customer' },\n fields,\n // The SAME tab and the SAME provider beauty-saas uses. Since the shop's\n // orders now live in public.orders with party_id set, the canonical provider\n // already returns them — a shop-specific adapter would be a second\n // implementation of \"list this person's orders\", which is how two apps end\n // up with two different answers to the same question.\n detailTabs: [{\n id: 'orders',\n label: 'Pedidos',\n icon: 'ShoppingBag',\n aliases: ['appointments', 'quotes'],\n component: ClientOrdersTab as never,\n props: {\n provider: createClientOrdersProvider(),\n currency: { code: 'BRL', locale: 'pt-BR' },\n // The one part that legitimately differs per app: where a document\n // leads. Beauty sends a booking to the agenda and an invoice to\n // receivables; a shop order goes to the order screen.\n navigator: {\n onNavigate: (doc: ClientDocument) => adminNavigateTo(`/shop/orders/${doc.id}`),\n },\n },\n }],\n fieldGroups: [\n { id: 'contact', label: 'Contato', columns: 2 },\n { id: 'internal', label: 'Notas internas', columns: 1 },\n ],\n } as EntityDef<ShopCustomer>\n}\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport type { Discount } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Discount — declarative CRUD, same contract as products and customers.\n//\n// `timesUsed` is read-only: shop_place_order increments it inside the same\n// transaction that validates the coupon, so the admin must never write it.\n//\n// `buy_x_get_y` is deliberately absent from the type options: the enum value\n// exists in the database but shop_place_order records the code and applies no\n// monetary effect (0003:116), so offering it would create coupons that silently\n// do nothing.\n// ---------------------------------------------------------------------------\n\nconst STATUS_TONE: Record<string, string> = {\n active: 'bg-emerald-100 text-emerald-800',\n draft: 'bg-gray-100 text-gray-700',\n expired: 'bg-orange-100 text-orange-700',\n disabled: 'bg-red-100 text-red-700',\n}\n\nexport function buildShopDiscountEntity(): EntityDef<Discount> {\n const fields: FieldDef[] = [\n // — Cupom —\n {\n key: 'title', label: 'Nome interno', type: 'text', required: true,\n group: 'coupon', placeholder: 'Bem-vindo 10%',\n hint: 'Só o admin vê. Serve para você identificar a campanha.',\n searchable: true, showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium\">{row.title}</p>\n {row.code && <p className=\"font-mono text-xs text-muted-foreground\">{row.code}</p>}\n </div>\n ),\n },\n {\n key: 'code', label: 'Código', type: 'text', group: 'coupon',\n placeholder: 'ARTORIUS10',\n hint: 'O que o cliente digita no carrinho. Maiúsculas e minúsculas não importam.',\n searchable: true, showInTable: false,\n },\n\n // — Regra —\n {\n key: 'type', label: 'Tipo', type: 'segmented', required: true, group: 'rule', span: 2,\n options: [\n { label: 'Percentual', value: 'percentage', description: 'Desconta uma % do subtotal.' },\n { label: 'Valor fixo', value: 'fixed_amount', description: 'Desconta um valor em reais.' },\n { label: 'Frete grátis', value: 'free_shipping', description: 'Zera o frete do pedido.' },\n ],\n showInTable: true, sortable: false,\n renderCell: (v) => {\n const labels: Record<string, string> = {\n percentage: 'Percentual', fixed_amount: 'Valor fixo', free_shipping: 'Frete grátis', buy_x_get_y: 'Leve X pague Y',\n }\n return <span className=\"text-muted-foreground\">{labels[String(v)] ?? String(v)}</span>\n },\n },\n {\n key: 'value', label: 'Valor', type: 'number', group: 'rule', min: 0,\n placeholder: '10',\n hint: 'Percentual: 10 = 10%. Valor fixo: 10 = R$ 10,00. Frete grátis ignora este campo.',\n showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n <span className=\"block text-right font-medium\">\n {row.type === 'percentage'\n ? `${row.value}%`\n : row.type === 'free_shipping'\n ? '—'\n : new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(Number(row.value) || 0)}\n </span>\n ),\n },\n\n // — Limites —\n {\n key: 'minSubtotal', label: 'Pedido mínimo', type: 'currency', group: 'limits', min: 0,\n currency: 'BRL', currencySymbol: 'R$', currencyLocale: 'pt-BR',\n placeholder: 'sem mínimo',\n hint: 'Valor mínimo do pedido para o cupom valer. Deixe vazio para não exigir mínimo.',\n showInTable: false,\n },\n {\n key: 'usageLimit', label: 'Limite de usos', type: 'number', group: 'limits', min: 0,\n placeholder: 'sem limite', hint: 'Deixe vazio para uso ilimitado.', showInTable: false,\n },\n {\n key: 'oncePerCustomer', label: 'Uma vez por cliente', type: 'boolean', group: 'limits',\n hint: 'Só vale para quem se identifica no checkout — compra como visitante não é rastreada.',\n showInTable: false,\n },\n {\n key: 'timesUsed', label: 'Usos', type: 'number',\n showInForm: false, showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n <span className=\"block text-right text-muted-foreground\">\n {row.timesUsed}{row.usageLimit ? ` / ${row.usageLimit}` : ''}\n </span>\n ),\n },\n\n // — Vigência —\n { key: 'startsAt', label: 'Início', type: 'date', group: 'schedule', showInTable: false },\n {\n key: 'endsAt', label: 'Fim', type: 'date', group: 'schedule',\n hint: 'Vazio = sem data de expiração.', showInTable: false,\n },\n {\n key: 'status', label: 'Status', type: 'segmented', required: true, group: 'schedule', span: 2,\n options: [\n { label: 'Rascunho', value: 'draft', description: 'Não aceito no carrinho.' },\n { label: 'Ativo', value: 'active', description: 'Valendo agora.' },\n { label: 'Desativado', value: 'disabled', description: 'Suspenso sem apagar o histórico.' },\n ],\n showInTable: true, sortable: false,\n renderCell: (v) => {\n const s = String(v ?? 'draft')\n return (\n <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium ${STATUS_TONE[s] ?? STATUS_TONE.draft}`}>\n {s}\n </span>\n )\n },\n },\n ]\n\n return {\n name: 'Desconto',\n namePlural: 'Descontos',\n icon: 'Tag',\n displayField: 'title',\n fields,\n fieldGroups: [\n { id: 'coupon', label: 'Cupom', columns: 2 },\n { id: 'rule', label: 'Regra', description: 'O desconto é recalculado no servidor a cada pedido.', columns: 2 },\n { id: 'limits', label: 'Limites de uso', columns: 2 },\n { id: 'schedule', label: 'Vigência', columns: 2 },\n ],\n facets: [{ field: 'status', allLabel: 'Todos' }],\n } as EntityDef<Discount>\n}\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport type { Category } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Categoria — onde o produto mora na árvore do catálogo.\n//\n// Uma categoria só, um pai só: é ela que estrutura a navegação da vitrine. Para\n// agrupar produtos de forma editorial (uma vitrine de Natal, os mais vendidos),\n// o que existe é Coleção — o produto entra em quantas quiser.\n//\n// `parentId` fica como texto e não como relação: a lista de categorias é a\n// própria tabela sendo editada, e uma relação declarativa aqui pediria um\n// segundo read-model só para se auto-referenciar.\n// ---------------------------------------------------------------------------\n\nexport function buildShopCategoryEntity(): EntityDef<Category> {\n const fields: FieldDef[] = [\n {\n key: 'name', label: 'Nome', type: 'text', required: true, group: 'basic',\n placeholder: 'Camisetas',\n searchable: true, showInTable: true, sortable: true,\n },\n {\n key: 'slug', label: 'Identificador', type: 'text', group: 'basic',\n placeholder: 'camisetas',\n hint: 'Segmento de URL na vitrine. Deixe vazio para gerar a partir do nome.',\n searchable: true, showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"font-mono text-xs text-muted-foreground\">{String(v ?? '')}</span>,\n },\n {\n key: 'parentId', label: 'Categoria pai', type: 'text', group: 'basic',\n placeholder: 'sem pai — nível principal',\n hint: 'Deixe vazio para uma categoria de primeiro nível.',\n showInTable: false,\n },\n {\n key: 'description', label: 'Descrição', type: 'textarea', group: 'basic', span: 2,\n placeholder: 'Descrição opcional',\n showInTable: false,\n },\n {\n key: 'sortOrder', label: 'Ordem', type: 'number', group: 'basic', min: 0,\n hint: 'Menor aparece primeiro na vitrine.',\n showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"block text-right text-muted-foreground\">{Number(v ?? 0)}</span>,\n },\n ]\n\n return {\n name: 'Categoria',\n namePlural: 'Categorias',\n icon: 'FolderTree',\n displayField: 'name',\n defaultSort: 'sortOrder',\n fields,\n fieldGroups: [\n { id: 'basic', label: 'Categoria', columns: 2 },\n ],\n } as EntityDef<Category>\n}\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport type { Collection } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Coleção — agrupamento de merchandising (\"Verão 2026\", \"Mais vendidos\").\n//\n// Não é categoria: a categoria diz onde o produto MORA no catálogo (um pai só,\n// estrutura a navegação); a coleção é um conjunto curado e o produto entra em\n// quantas quiser. Sair de uma coleção não muda nada sobre o que o produto é.\n//\n// `productIds` não aparece no formulário: escolher membros é um multiselect com\n// busca sobre o catálogo, que o EntityDef declarativo não expressa. A associação\n// já está pronta no provider — falta só o campo customizado. Até lá a coluna\n// mostra quantos produtos a coleção tem.\n// ---------------------------------------------------------------------------\n\nexport function buildShopCollectionEntity(): EntityDef<Collection> {\n const fields: FieldDef[] = [\n {\n key: 'title', label: 'Título', type: 'text', required: true, group: 'basic',\n placeholder: 'Verão 2026',\n searchable: true, showInTable: true, sortable: true,\n },\n {\n key: 'handle', label: 'Identificador', type: 'text', group: 'basic',\n placeholder: 'verao-2026',\n hint: 'Segmento de URL na vitrine. Deixe vazio para gerar a partir do título.',\n searchable: true, showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"font-mono text-xs text-muted-foreground\">{String(v ?? '')}</span>,\n },\n {\n key: 'description', label: 'Descrição', type: 'textarea', group: 'basic', span: 2,\n placeholder: 'Como esta coleção é apresentada na loja',\n showInTable: false,\n },\n {\n key: 'productIds', label: 'Produtos', type: 'text',\n showInForm: false, showInTable: true, sortable: false,\n renderCell: (v) => {\n const count = Array.isArray(v) ? v.length : 0\n return (\n <span className=\"block text-right text-muted-foreground\">\n {count === 1 ? '1 produto' : `${count} produtos`}\n </span>\n )\n },\n },\n {\n key: 'published', label: 'Publicada', type: 'boolean', group: 'basic',\n hint: 'Coleção despublicada some da vitrine, mas continua aqui.',\n // Rotula os dois estados para as abas do cabeçalho: \"true\"/\"false\" cru\n // seria o que o lojista leria no topo da própria lista.\n options: [\n { value: 'true', label: 'Publicadas' },\n { value: 'false', label: 'Rascunhos' },\n ],\n showInTable: true, sortable: true,\n renderCell: (v) => (\n <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium ${\n v ? 'bg-emerald-100 text-emerald-800' : 'bg-gray-100 text-gray-700'\n }`}>\n {v ? 'Publicada' : 'Rascunho'}\n </span>\n ),\n },\n {\n key: 'sortOrder', label: 'Ordem', type: 'number', group: 'basic', min: 0,\n hint: 'Menor aparece primeiro.', showInTable: false,\n },\n\n // — SEO —\n {\n key: 'seoTitle', label: 'Título da página', type: 'text', group: 'seo', span: 2,\n placeholder: 'Título exibido nos resultados de busca',\n hint: 'Vazio usa o título da coleção.',\n showInTable: false,\n },\n {\n key: 'seoDescription', label: 'Meta descrição', type: 'textarea', group: 'seo', span: 2,\n placeholder: 'Descreva esta coleção para os buscadores',\n showInTable: false,\n },\n ]\n\n return {\n name: 'Coleção',\n namePlural: 'Coleções',\n icon: 'Layers',\n displayField: 'title',\n defaultSort: 'sortOrder',\n fields,\n fieldGroups: [\n { id: 'basic', label: 'Coleção', columns: 2 },\n { id: 'seo', label: 'Busca (SEO)', description: 'Como esta coleção aparece nos resultados de busca.', columns: 2 },\n ],\n // Sem facet de \"publicada\": como booleano ele vira uma tira de abas\n // \"Todas · Sim · Não\", que não diz de QUE é o sim — e uma loja com dez\n // coleções não precisa filtrar por isso; a coluna já mostra o estado.\n\n } as EntityDef<Collection>\n}\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport type { GiftCard } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Vale-presente — dinheiro já pago que ainda não virou pedido.\n//\n// Dois saldos e não um: `initialBalance` é o valor de face, imutável (a prova\n// de quanto entrou) e `balance` é o que sobrou. Só o saldo restante apagaria o\n// valor emitido no primeiro resgate parcial — e é esse número que conciliação e\n// suporte precisam.\n//\n// `initialBalance` só existe no formulário de criação: mudar o valor de face de\n// um cartão já emitido reescreveria o histórico financeiro. Ajuste depois se\n// faz, é no saldo restante.\n// ---------------------------------------------------------------------------\n\nconst STATUS_TONE: Record<string, string> = {\n active: 'bg-emerald-100 text-emerald-800',\n redeemed: 'bg-gray-100 text-gray-700',\n expired: 'bg-orange-100 text-orange-700',\n disabled: 'bg-red-100 text-red-700',\n}\n\nconst STATUS_LABEL: Record<string, string> = {\n active: 'Ativo', redeemed: 'Resgatado', expired: 'Expirado', disabled: 'Desativado',\n}\n\nexport function buildShopGiftCardEntity(currencyCode = 'BRL'): EntityDef<GiftCard> {\n const money = (v: unknown) =>\n new Intl.NumberFormat('pt-BR', { style: 'currency', currency: currencyCode }).format(Number(v) || 0)\n\n const fields: FieldDef[] = [\n {\n key: 'code', label: 'Código', type: 'text', group: 'card', span: 2,\n placeholder: 'gerado automaticamente',\n hint: 'O que o cliente digita no checkout. Deixe vazio para gerar um código.',\n searchable: true, showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"font-mono text-xs font-medium\">{String(v ?? '')}</span>,\n },\n {\n key: 'initialBalance', label: 'Valor', type: 'currency', required: true, group: 'card', min: 0,\n currency: currencyCode, currencySymbol: 'R$', currencyLocale: 'pt-BR',\n hint: 'Valor de face do cartão. Não muda depois de emitido.',\n showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"block text-right text-muted-foreground\">{money(v)}</span>,\n },\n {\n key: 'balance', label: 'Saldo', type: 'currency', group: 'card', min: 0,\n currency: currencyCode, currencySymbol: 'R$', currencyLocale: 'pt-BR',\n hint: 'O que ainda pode ser gasto. Cai a cada resgate.',\n showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"block text-right font-medium\">{money(v)}</span>,\n },\n {\n key: 'status', label: 'Status', type: 'segmented', group: 'card', span: 2,\n options: [\n { label: 'Ativo', value: 'active', description: 'Aceito no checkout.' },\n { label: 'Desativado', value: 'disabled', description: 'Suspenso sem apagar o saldo.' },\n ],\n showInTable: true, sortable: false,\n renderCell: (v) => {\n const s = String(v ?? 'active')\n return (\n <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium ${STATUS_TONE[s] ?? STATUS_TONE.active}`}>\n {STATUS_LABEL[s] ?? s}\n </span>\n )\n },\n },\n\n // — Destinatário —\n {\n key: 'customerEmail', label: 'E-mail do destinatário', type: 'email', group: 'recipient',\n placeholder: 'opcional',\n searchable: true, showInTable: true, sortable: false,\n renderCell: (v) => <span className=\"text-muted-foreground\">{String(v ?? '—')}</span>,\n },\n {\n key: 'expiresAt', label: 'Validade', type: 'date', group: 'recipient',\n hint: 'Vazio = não expira.', showInTable: false,\n },\n {\n key: 'note', label: 'Observação', type: 'textarea', group: 'recipient', span: 2,\n placeholder: 'Só o admin vê.', showInTable: false,\n },\n ]\n\n return {\n name: 'Vale-presente',\n namePlural: 'Gift Cards',\n icon: 'CreditCard',\n displayField: 'code',\n defaultSort: 'createdAt',\n defaultSortDir: 'desc',\n fields,\n fieldGroups: [\n { id: 'card', label: 'Cartão', columns: 2 },\n { id: 'recipient', label: 'Destinatário', columns: 2 },\n ],\n facets: [{ field: 'status', allLabel: 'Todos', display: 'tabs' }],\n } as EntityDef<GiftCard>\n}\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport type { CustomerGroup } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Grupo de clientes — associação MANUAL.\n//\n// O lojista põe e tira gente; a associação é estável e não muda porque o\n// cliente comprou (ou parou de comprar). Para \"todo mundo que gastou mais de\n// X\", o que existe é Segmento — lá a associação é a própria regra.\n//\n// `customerIds` fica fora do formulário: escolher membros é um multiselect com\n// busca sobre a base de clientes, que o EntityDef declarativo não expressa. A\n// associação já está pronta no provider — falta o campo customizado.\n// ---------------------------------------------------------------------------\n\nconst SWATCH: Record<string, string> = {\n slate: 'bg-slate-200 text-slate-800',\n emerald: 'bg-emerald-100 text-emerald-800',\n amber: 'bg-amber-100 text-amber-800',\n rose: 'bg-rose-100 text-rose-800',\n violet: 'bg-violet-100 text-violet-800',\n}\n\nexport function buildShopCustomerGroupEntity(): EntityDef<CustomerGroup> {\n const fields: FieldDef[] = [\n {\n key: 'name', label: 'Nome', type: 'text', required: true, group: 'basic',\n placeholder: 'Atacado',\n searchable: true, showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium ${SWATCH[row.color] ?? SWATCH.slate}`}>\n {row.name}\n </span>\n ),\n },\n {\n key: 'color', label: 'Cor', type: 'select', group: 'basic',\n options: [\n { value: 'slate', label: 'Neutro' },\n { value: 'emerald', label: 'Verde' },\n { value: 'amber', label: 'Âmbar' },\n { value: 'rose', label: 'Rosa' },\n { value: 'violet', label: 'Violeta' },\n ],\n hint: 'Só para reconhecer o grupo de relance na lista.',\n showInTable: false,\n },\n {\n key: 'description', label: 'Descrição', type: 'textarea', group: 'basic', span: 2,\n placeholder: 'Para que serve este grupo',\n searchable: true, showInTable: true, sortable: false,\n renderCell: (v) => <span className=\"text-muted-foreground\">{String(v ?? '—')}</span>,\n },\n {\n key: 'customerIds', label: 'Clientes', type: 'text',\n showInForm: false, showInTable: true, sortable: false,\n renderCell: (v) => {\n const count = Array.isArray(v) ? v.length : 0\n return (\n <span className=\"block text-right text-muted-foreground\">\n {count === 1 ? '1 cliente' : `${count} clientes`}\n </span>\n )\n },\n },\n ]\n\n return {\n name: 'Grupo',\n namePlural: 'Grupos',\n icon: 'UsersRound',\n displayField: 'name',\n defaultSort: 'name',\n fields,\n fieldGroups: [{ id: 'basic', label: 'Grupo', columns: 2 }],\n } as EntityDef<CustomerGroup>\n}\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport type { CustomerSegment } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Segmento de clientes — uma REGRA, não uma lista.\n//\n// A associação é recalculada dos números do próprio cliente, então ninguém é\n// \"adicionado\" a um segmento e sair dele não é uma ação. Para uma lista que o\n// lojista controla à mão, o que existe é Grupo.\n//\n// Os critérios são campos explícitos e não um JSON livre: cada um é uma\n// condição que a lista de clientes sabe avaliar, então um segmento salvo sempre\n// tem associação real e conferível.\n// ---------------------------------------------------------------------------\n\n/** Legenda humana da regra — é o que a lista mostra em vez de seis colunas de\n * números soltos que ninguém lê como uma condição. */\nexport function describeSegment(s: Partial<CustomerSegment>, money: (v: number) => string): string {\n const parts: string[] = []\n if (s.minOrders != null && s.maxOrders != null) parts.push(`${s.minOrders}–${s.maxOrders} pedidos`)\n else if (s.minOrders != null) parts.push(`${s.minOrders}+ pedidos`)\n else if (s.maxOrders != null) parts.push(`até ${s.maxOrders} pedidos`)\n\n if (s.minSpent != null && s.maxSpent != null) parts.push(`gastou ${money(s.minSpent)}–${money(s.maxSpent)}`)\n else if (s.minSpent != null) parts.push(`gastou ${money(s.minSpent)}+`)\n else if (s.maxSpent != null) parts.push(`gastou até ${money(s.maxSpent)}`)\n\n if (s.joinedAfter) parts.push(`entrou após ${new Date(s.joinedAfter).toLocaleDateString('pt-BR')}`)\n if (s.joinedBefore) parts.push(`entrou antes de ${new Date(s.joinedBefore).toLocaleDateString('pt-BR')}`)\n\n return parts.length ? parts.join(' · ') : 'Todos os clientes'\n}\n\n/** The row the list actually shows: the stored rule plus how many customers\n * match it right now. `matchCount` is recomputed on every read (see the data\n * provider) — a segment's size is only true when it is derived. */\nexport type CustomerSegmentRow = CustomerSegment & { matchCount: number }\n\nexport function buildShopCustomerSegmentEntity(currencyCode = 'BRL'): EntityDef<CustomerSegmentRow> {\n const money = (v: number) =>\n new Intl.NumberFormat('pt-BR', { style: 'currency', currency: currencyCode }).format(v)\n\n const fields: FieldDef[] = [\n {\n key: 'name', label: 'Nome', type: 'text', required: true, group: 'basic', span: 2,\n placeholder: 'Clientes fiéis',\n searchable: true, showInTable: true, sortable: true,\n },\n {\n key: 'description', label: 'Descrição', type: 'textarea', group: 'basic', span: 2,\n placeholder: 'Para que serve este segmento',\n searchable: true, showInTable: false,\n },\n\n // — Regra —\n {\n key: 'minOrders', label: 'Mínimo de pedidos', type: 'number', group: 'rule', min: 0,\n placeholder: 'sem mínimo', showInTable: false,\n },\n {\n key: 'maxOrders', label: 'Máximo de pedidos', type: 'number', group: 'rule', min: 0,\n placeholder: 'sem máximo', showInTable: false,\n },\n {\n key: 'minSpent', label: 'Gasto mínimo', type: 'currency', group: 'rule', min: 0,\n currency: currencyCode, currencySymbol: 'R$', currencyLocale: 'pt-BR',\n placeholder: 'sem mínimo', showInTable: false,\n },\n {\n key: 'maxSpent', label: 'Gasto máximo', type: 'currency', group: 'rule', min: 0,\n currency: currencyCode, currencySymbol: 'R$', currencyLocale: 'pt-BR',\n placeholder: 'sem máximo', showInTable: false,\n },\n { key: 'joinedAfter', label: 'Entrou depois de', type: 'date', group: 'rule', showInTable: false },\n { key: 'joinedBefore', label: 'Entrou antes de', type: 'date', group: 'rule', showInTable: false },\n\n // Coluna derivada: a regra escrita por extenso.\n {\n key: 'minSpent_rule', label: 'Regra', type: 'text',\n showInForm: false, showInTable: true, sortable: false,\n renderCell: (_v, row: any) => (\n <span className=\"text-muted-foreground\">{describeSegment(row, money)}</span>\n ),\n },\n {\n key: 'matchCount', label: 'Clientes', type: 'number',\n showInForm: false, showInTable: true, sortable: true,\n renderCell: (v) => (\n <span className=\"block text-right font-medium\">\n {v == null ? '—' : Number(v)}\n </span>\n ),\n },\n ]\n\n return {\n name: 'Segmento',\n namePlural: 'Segmentos',\n icon: 'Filter',\n displayField: 'name',\n defaultSort: 'name',\n fields,\n fieldGroups: [\n { id: 'basic', label: 'Segmento', columns: 2 },\n {\n id: 'rule', label: 'Regra', columns: 2,\n description: 'Todos os critérios preenchidos valem juntos. Deixe vazio o que não quiser exigir.',\n },\n ],\n } as EntityDef<CustomerSegmentRow>\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type { CreateProductInput, Product, UpdateProductInput } from '@fayz-ai/shop'\nimport { slugify } from '../views/productEntity'\nimport { applyQuery, invalidateProductLists, listProductsDetailed, resolve, type ShopProviderResolver } from './shared'\n\nexport type { ShopProviderResolver }\n\n// ---------------------------------------------------------------------------\n// Bridges the generic CRUD scaffolding (DataProvider) to the shop provider, so\n// the product screens are the same createCrudPage machinery every other module\n// uses instead of a bespoke form.\n//\n// Which shop provider is injected decides whether writes work at all:\n// • createSupabaseShopProvider — authenticates as the merchant (their JWT),\n// full CRUD, subject to the tenant-member RLS policies.\n// • createFayzShopProvider — the storefront's anonymous REST client. Reads\n// work; every write throws FayzShopError 501 by design. The form surfaces\n// that message rather than pretending the save succeeded.\n// ---------------------------------------------------------------------------\n\nexport function createShopProductDataProvider(provider: ShopProviderResolver): DataProvider<Product> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<Product>> {\n const answer = await listProductsDetailed(\n provider,\n query.search ? { search: query.search } : undefined,\n )\n return {\n ...applyQuery(answer.rows, query, 'status'),\n ...(answer.cached && { cached: true }),\n ...(answer.stale && { stale: true }),\n }\n },\n\n async create(data): Promise<Product> {\n const input = data as unknown as Partial<Product>\n // The storefront URL is required by the table's UNIQUE(tenant_id, slug);\n // deriving it from the name keeps the merchant from having to know that.\n const slug = input.slug?.trim() || slugify(String(input.name ?? ''))\n const created = await resolve(provider).createProduct({\n ...(input as CreateProductInput),\n slug,\n } as CreateProductInput)\n invalidateProductLists()\n return created\n },\n\n async update(id: string, data: Partial<Product>): Promise<Product> {\n const patch = { ...data }\n if (patch.slug !== undefined && !String(patch.slug).trim()) {\n // Cleared on purpose → regenerate rather than write an empty slug.\n patch.slug = slugify(String(patch.name ?? ''))\n }\n const updated = await resolve(provider).updateProduct(id, patch as UpdateProductInput)\n invalidateProductLists()\n return updated\n },\n\n async remove(id: string): Promise<void> {\n await resolve(provider).deleteProduct(id)\n invalidateProductLists()\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type { CreateCustomerInput, ShopCustomer, UpdateCustomerInput } from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\nexport function createShopCustomerDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<ShopCustomer> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<ShopCustomer>> {\n const rows = await resolve(provider).listCustomers(\n query.search ? { search: query.search } : undefined,\n )\n return applyQuery(rows, query)\n },\n\n async create(data): Promise<ShopCustomer> {\n return resolve(provider).createCustomer(data as unknown as CreateCustomerInput)\n },\n\n async update(id: string, data: Partial<ShopCustomer>): Promise<ShopCustomer> {\n // ordersCount / totalSpent are trigger-maintained (shop_refresh_customer_stats);\n // never send them back or a stale form value would fight the database.\n const { ordersCount: _o, totalSpent: _t, ...patch } = data\n return resolve(provider).updateCustomer(id, patch as UpdateCustomerInput)\n },\n\n async remove(id: string): Promise<void> {\n await resolve(provider).deleteCustomer(id)\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type { CreateDiscountInput, Discount, UpdateDiscountInput } from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\nexport function createShopDiscountDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<Discount> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<Discount>> {\n const rows = await resolve(provider).listDiscounts()\n const term = query.search?.trim().toLowerCase()\n const filtered = term\n ? rows.filter((d) =>\n d.title.toLowerCase().includes(term) || (d.code ?? '').toLowerCase().includes(term))\n : rows\n return applyQuery(filtered, query, 'status')\n },\n\n async create(data): Promise<Discount> {\n const input = data as unknown as Partial<Discount>\n return resolve(provider).createDiscount({\n ...(input as CreateDiscountInput),\n // Codes are matched case-insensitively server-side; store them upper so\n // the admin list reads consistently.\n code: input.code ? String(input.code).trim().toUpperCase() : undefined,\n } as CreateDiscountInput)\n },\n\n async update(id: string, data: Partial<Discount>): Promise<Discount> {\n // timesUsed is incremented by shop_place_order inside the order transaction.\n const { timesUsed: _used, ...patch } = data\n if (patch.code !== undefined) {\n patch.code = patch.code ? String(patch.code).trim().toUpperCase() : null\n }\n return resolve(provider).updateDiscount(id, patch as UpdateDiscountInput)\n },\n\n async remove(id: string): Promise<void> {\n await resolve(provider).deleteDiscount(id)\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type { Category, CreateCategoryInput, UpdateCategoryInput } from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\nexport function createShopCategoryDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<Category> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<Category>> {\n const rows = await resolve(provider).listCategories()\n const term = query.search?.trim().toLowerCase()\n const filtered = term\n ? rows.filter((c) =>\n c.name.toLowerCase().includes(term) || (c.slug ?? '').toLowerCase().includes(term))\n : rows\n return applyQuery(filtered, query)\n },\n\n async create(data): Promise<Category> {\n const input = data as unknown as Partial<Category>\n return resolve(provider).createCategory({\n name: String(input.name ?? ''),\n slug: input.slug?.trim() || undefined,\n description: input.description ?? undefined,\n // The form writes '' for \"no parent\"; the column is a nullable FK, and\n // '' is not a uuid — it must go as absent, not as empty text.\n parentId: input.parentId?.trim() || undefined,\n sortOrder: input.sortOrder ?? undefined,\n } as CreateCategoryInput)\n },\n\n async update(id: string, data: Partial<Category>): Promise<Category> {\n const patch: UpdateCategoryInput = {}\n if (data.name !== undefined) patch.name = data.name\n if (data.slug !== undefined) patch.slug = data.slug?.trim() || undefined\n if (data.description !== undefined) patch.description = data.description\n if (data.parentId !== undefined) patch.parentId = data.parentId?.trim() || null\n if (data.sortOrder !== undefined) patch.sortOrder = data.sortOrder\n return resolve(provider).updateCategory(id, patch)\n },\n\n async remove(id: string): Promise<void> {\n await resolve(provider).deleteCategory(id)\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type { Collection, CreateCollectionInput, UpdateCollectionInput } from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\n/** Collections are optional on the provider contract. A provider without them\n * should read as \"no collections\", not blow up the list. */\nfunction requireCollections(p: ReturnType<typeof resolve>) {\n if (!p.listCollections) throw new Error('This store provider does not support collections')\n return p\n}\n\nexport function createShopCollectionDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<Collection> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<Collection>> {\n const p = resolve(provider)\n const rows = (await p.listCollections?.()) ?? []\n const term = query.search?.trim().toLowerCase()\n const filtered = term\n ? rows.filter((c) =>\n c.title.toLowerCase().includes(term) || (c.handle ?? '').toLowerCase().includes(term))\n : rows\n return applyQuery(filtered, query)\n },\n\n async create(data): Promise<Collection> {\n const p = requireCollections(resolve(provider))\n const input = data as unknown as Partial<Collection>\n return p.createCollection!({\n title: String(input.title ?? ''),\n handle: input.handle?.trim() || undefined,\n description: input.description ?? null,\n seoTitle: input.seoTitle ?? null,\n seoDescription: input.seoDescription ?? null,\n published: input.published ?? true,\n sortOrder: input.sortOrder ?? undefined,\n } as CreateCollectionInput)\n },\n\n async update(id: string, data: Partial<Collection>): Promise<Collection> {\n const p = requireCollections(resolve(provider))\n // productIds is not on the form (membership needs a product picker the\n // declarative EntityDef can't express), so it must never reach the patch\n // — an undefined there means \"leave the membership alone\", but a stale\n // value from the row would silently rewrite it.\n const { productIds: _members, ...patch } = data\n return p.updateCollection!(id, patch as UpdateCollectionInput)\n },\n\n async remove(id: string): Promise<void> {\n const p = requireCollections(resolve(provider))\n await p.deleteCollection!(id)\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type { GiftCard, CreateGiftCardInput, UpdateGiftCardInput } from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\nfunction requireGiftCards(p: ReturnType<typeof resolve>) {\n if (!p.listGiftCards) throw new Error('This store provider does not support gift cards')\n return p\n}\n\nexport function createShopGiftCardDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<GiftCard> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<GiftCard>> {\n const rows = (await resolve(provider).listGiftCards?.()) ?? []\n const term = query.search?.trim().toLowerCase()\n const filtered = term\n ? rows.filter((g) =>\n g.code.toLowerCase().includes(term) || (g.customerEmail ?? '').toLowerCase().includes(term))\n : rows\n return applyQuery(filtered, query, 'status')\n },\n\n async create(data): Promise<GiftCard> {\n const p = requireGiftCards(resolve(provider))\n const input = data as unknown as Partial<GiftCard>\n return p.createGiftCard!({\n code: input.code?.trim() || undefined,\n initialBalance: Number(input.initialBalance) || 0,\n status: input.status ?? 'active',\n expiresAt: input.expiresAt || null,\n customerEmail: input.customerEmail || null,\n note: input.note || null,\n } as CreateGiftCardInput)\n },\n\n async update(id: string, data: Partial<GiftCard>): Promise<GiftCard> {\n const p = requireGiftCards(resolve(provider))\n // initialBalance is the card's face value — the record of how much money\n // came in. Editing it after issue would rewrite financial history, so the\n // patch drops it and only the remaining balance is adjustable.\n const { initialBalance: _face, ...patch } = data\n return p.updateGiftCard!(id, patch as UpdateGiftCardInput)\n },\n\n async remove(id: string): Promise<void> {\n const p = requireGiftCards(resolve(provider))\n await p.deleteGiftCard!(id)\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type {\n CustomerGroup, CreateCustomerGroupInput, UpdateCustomerGroupInput,\n} from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\nfunction requireGroups(p: ReturnType<typeof resolve>) {\n if (!p.listCustomerGroups) throw new Error('This store provider does not support customer groups')\n return p\n}\n\nexport function createShopCustomerGroupDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<CustomerGroup> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<CustomerGroup>> {\n const rows = (await resolve(provider).listCustomerGroups?.()) ?? []\n const term = query.search?.trim().toLowerCase()\n const filtered = term\n ? rows.filter((g) =>\n g.name.toLowerCase().includes(term) || (g.description ?? '').toLowerCase().includes(term))\n : rows\n return applyQuery(filtered, query)\n },\n\n async create(data): Promise<CustomerGroup> {\n const p = requireGroups(resolve(provider))\n const input = data as unknown as Partial<CustomerGroup>\n return p.createCustomerGroup!({\n name: String(input.name ?? ''),\n description: input.description ?? null,\n color: input.color ?? null,\n } as CreateCustomerGroupInput)\n },\n\n async update(id: string, data: Partial<CustomerGroup>): Promise<CustomerGroup> {\n const p = requireGroups(resolve(provider))\n // customerIds is not on the form (membership needs a customer picker the\n // declarative EntityDef can't express). Passing the row's stale copy would\n // rewrite the membership on every rename; undefined leaves it alone.\n const { customerIds: _members, ...patch } = data\n return p.updateCustomerGroup!(id, patch as UpdateCustomerGroupInput)\n },\n\n async remove(id: string): Promise<void> {\n const p = requireGroups(resolve(provider))\n await p.deleteCustomerGroup!(id)\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type {\n CustomerSegment, CreateCustomerSegmentInput, UpdateCustomerSegmentInput, ShopCustomer,\n} from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\n/** A segment row plus how many customers currently match it. */\ntype SegmentRow = CustomerSegment & { matchCount: number }\n\nfunction requireSegments(p: ReturnType<typeof resolve>) {\n if (!p.listCustomerSegments) throw new Error('This store provider does not support customer segments')\n return p\n}\n\n/**\n * Does this customer satisfy the rule? All criteria AND together, and a null\n * criterion is \"don't check\", NOT zero — a segment with no bounds matches\n * everyone, which is different from one demanding at least R$0.\n */\nexport function customerMatchesSegment(c: ShopCustomer, s: CustomerSegment): boolean {\n const orders = c.ordersCount ?? 0\n const spent = c.totalSpent ?? 0\n if (s.minOrders != null && orders < s.minOrders) return false\n if (s.maxOrders != null && orders > s.maxOrders) return false\n if (s.minSpent != null && spent < s.minSpent) return false\n if (s.maxSpent != null && spent > s.maxSpent) return false\n // Compare on the calendar day: createdAt is a timestamp and the bounds are\n // dates, so a same-day signup must count as \"joined after\" that day.\n const joined = c.createdAt?.slice(0, 10)\n if (s.joinedAfter && (!joined || joined < s.joinedAfter)) return false\n if (s.joinedBefore && (!joined || joined > s.joinedBefore)) return false\n return true\n}\n\nexport function createShopCustomerSegmentDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<SegmentRow> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<SegmentRow>> {\n const p = resolve(provider)\n const rows = (await p.listCustomerSegments?.()) ?? []\n // One customer read for the whole page, then count in memory. A segment\n // is a rule, so its size is only true when it is recomputed — a stored\n // count would be a number that silently goes stale.\n const customers = rows.length ? await p.listCustomers().catch(() => [] as ShopCustomer[]) : []\n const withCounts: SegmentRow[] = rows.map((s) => ({\n ...s,\n matchCount: customers.filter((c) => customerMatchesSegment(c, s)).length,\n }))\n const term = query.search?.trim().toLowerCase()\n const filtered = term\n ? withCounts.filter((s) =>\n s.name.toLowerCase().includes(term) || (s.description ?? '').toLowerCase().includes(term))\n : withCounts\n return applyQuery(filtered, query)\n },\n\n async create(data): Promise<SegmentRow> {\n const p = requireSegments(resolve(provider))\n const input = data as unknown as Partial<CustomerSegment>\n const created = await p.createCustomerSegment!({\n name: String(input.name ?? ''),\n description: input.description ?? null,\n minOrders: input.minOrders ?? null,\n maxOrders: input.maxOrders ?? null,\n minSpent: input.minSpent ?? null,\n maxSpent: input.maxSpent ?? null,\n joinedAfter: input.joinedAfter || null,\n joinedBefore: input.joinedBefore || null,\n } as CreateCustomerSegmentInput)\n return { ...created, matchCount: 0 }\n },\n\n async update(id: string, data: Partial<SegmentRow>): Promise<SegmentRow> {\n const p = requireSegments(resolve(provider))\n // matchCount is derived, never stored — it must not reach the patch.\n const { matchCount: _count, ...patch } = data\n const updated = await p.updateCustomerSegment!(id, patch as UpdateCustomerSegmentInput)\n return { ...updated, matchCount: 0 }\n },\n\n async remove(id: string): Promise<void> {\n const p = requireSegments(resolve(provider))\n await p.deleteCustomerSegment!(id)\n },\n }\n}\n","import React from 'react'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport type { StoreSettings, UpdateStoreSettingsInput } from '@fayz-ai/shop'\nimport { resolve, type ShopProviderResolver } from '../data/shared'\nimport { errorMessage } from './error-message'\n\n// ---------------------------------------------------------------------------\n// useStoreSettings — the store's commercial policy, loaded and saved\n// ---------------------------------------------------------------------------\n// One hook behind all the Commerce settings screens, and the reason they can be\n// five screens instead of one: each renders a slice of the SAME tenant row, and\n// each save sends only the keys it touched (see storeSettingsPayload). Two\n// screens open in two tabs cannot overwrite each other's sections.\n//\n// AUTO-SAVE, no Save button. Every one of these is a single decision with an\n// immediate meaning (\"aceito boleto\"), and a form that batches ten of them\n// behind a button asks the merchant to remember which ones they changed. The\n// write is debounced so a burst of chip clicks collapses into one round trip.\n//\n// `undefined` is load-bearing throughout: it means the merchant has not decided,\n// which every reader treats as \"keep the app's own default\". A screen must\n// therefore never render `value ?? false` into the store — only into the\n// control. `defaults` exists for exactly that: it is what the UI shows while\n// nothing is chosen, and it is never written on its own.\n\nconst DEBOUNCE_MS = 400\n\nexport interface StoreSettingsHandle {\n /** Merged over `defaults`: what the controls render. */\n value: StoreSettings\n /** What is actually stored — `undefined` for anything undecided. */\n stored: StoreSettings | null\n set: (patch: UpdateStoreSettingsInput) => void\n loading: boolean\n /** True while a write is in flight or pending. Drives the \"saving…\" hint. */\n saving: boolean\n /** The provider refused the WRITE. Shown inline; the optimistic value stays\n * on screen so the merchant does not lose what they typed. */\n error: string | null\n /**\n * The provider refused the READ.\n *\n * Kept apart from `error` because the two need opposite copy and imply\n * opposite things. A failed save means \"your change did not stick\"; a failed\n * load means \"everything below is a default, not your settings\" — and showing\n * the save wording for a load failure, which is what this hook did at first,\n * tells the merchant a change was lost when they had not made one.\n */\n loadError: string | null\n /** False when the mounted provider has no store-settings support at all —\n * the screen says so instead of pretending the toggles work. */\n supported: boolean\n}\n\nexport function useStoreSettings(\n provider: ShopProviderResolver | undefined,\n defaults: StoreSettings = {},\n): StoreSettingsHandle {\n const shop = React.useMemo(\n () => (provider ? resolve(provider) : getShopProvider()),\n [provider],\n )\n const supported = typeof shop.getStoreSettings === 'function' && typeof shop.updateStoreSettings === 'function'\n\n const [stored, setStored] = React.useState<StoreSettings | null>(null)\n const [loading, setLoading] = React.useState(supported)\n const [saving, setSaving] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const [loadError, setLoadError] = React.useState<string | null>(null)\n\n React.useEffect(() => {\n if (!supported) return\n let cancelled = false\n setLoading(true)\n setLoadError(null)\n void shop\n .getStoreSettings!()\n .then((settings) => { if (!cancelled) setStored(settings) })\n .catch((e) => { if (!cancelled) setLoadError(errorMessage(e)) })\n .finally(() => { if (!cancelled) setLoading(false) })\n return () => { cancelled = true }\n }, [shop, supported])\n\n // The pending patch accumulates across the debounce window, so clicking three\n // chips sends one write with three keys rather than three writes racing to be\n // last. Kept in a ref: a re-render must not restart the timer.\n const pendingRef = React.useRef<UpdateStoreSettingsInput>({})\n const timerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n\n React.useEffect(() => () => { if (timerRef.current) clearTimeout(timerRef.current) }, [])\n\n const set = React.useCallback(\n (patch: UpdateStoreSettingsInput) => {\n // Optimistic: the control reflects the click without waiting for a server.\n setStored((current) => ({ ...(current ?? {}), ...patch }))\n if (!supported) return\n setError(null)\n setSaving(true)\n pendingRef.current = { ...pendingRef.current, ...patch }\n if (timerRef.current) clearTimeout(timerRef.current)\n timerRef.current = setTimeout(() => {\n const payload = pendingRef.current\n pendingRef.current = {}\n void shop\n .updateStoreSettings!(payload)\n // The server's answer wins over the optimistic guess — it is the row\n // that a CHECK constraint or a trigger may have had an opinion about.\n .then((saved) => setStored(saved))\n .catch((e) => setError(errorMessage(e)))\n .finally(() => setSaving(false))\n }, DEBOUNCE_MS)\n },\n [shop, supported],\n )\n\n const value = React.useMemo(() => ({ ...defaults, ...(stored ?? {}) }), [defaults, stored])\n\n return { value, stored, set, loading, saving, error, loadError, supported }\n}\n","import React from 'react'\nimport { Skeleton } from '@fayz-ai/ui'\nimport { AlertTriangle, Check, Loader2 } from 'lucide-react'\n\n/**\n * The three things every Commerce settings screen has to say, said once.\n *\n * Loading, saving and refused are not decoration on a settings screen that\n * writes to a server: without them a merchant cannot tell \"salvo\" from \"não\n * chegou\", and the whole reason these screens exist is that the previous ones\n * silently kept everything in React state. The saving/saved line is what\n * replaces the Save button the auto-save design removes.\n *\n * `supported: false` is its own case, and deliberately loud: it means the\n * mounted shop provider has no store-settings methods at all, so every control\n * below would be a toggle wired to nothing — which is exactly the bug this wave\n * fixes and must not be reintroduced silently by a bespoke provider.\n */\nexport function SettingsState({\n loading,\n saving,\n error,\n loadError,\n supported,\n children,\n}: {\n loading: boolean\n saving: boolean\n error: string | null\n /** The READ failed. Opposite copy from `error`, and shown ABOVE the controls\n * rather than below: what is on screen is defaults, not the store's settings,\n * and that has to be read before anything is clicked. */\n loadError?: string | null\n supported: boolean\n children: React.ReactNode\n}) {\n if (!supported) {\n return (\n <div className=\"rounded-lg border border-amber-500/30 bg-amber-500/5 p-4 text-sm\">\n <p className=\"flex items-center gap-2 font-medium text-amber-700 dark:text-amber-500\">\n <AlertTriangle className=\"h-4 w-4 shrink-0\" />\n Este app não guarda as configurações da loja\n </p>\n <p className=\"mt-1 text-muted-foreground\">\n O provedor de loja montado aqui não implementa <code>getStoreSettings</code>. As opções\n abaixo não seriam salvas, então não são mostradas.\n </p>\n </div>\n )\n }\n\n if (loading) {\n return (\n <div className=\"space-y-4\">\n <Skeleton className=\"h-28 w-full rounded-lg\" />\n <Skeleton className=\"h-40 w-full rounded-lg\" />\n </div>\n )\n }\n\n return (\n <div className=\"space-y-4\">\n {loadError && (\n <div className=\"rounded-lg border border-destructive/30 bg-destructive/5 p-3 text-sm\">\n <p className=\"flex items-center gap-2 font-medium text-destructive\">\n <AlertTriangle className=\"h-4 w-4 shrink-0\" />\n Não foi possível carregar as configurações da loja\n </p>\n <p className=\"mt-1 text-muted-foreground\">\n O que aparece abaixo são os valores padrão, não as suas escolhas. Recarregue a página\n antes de alterar algo — salvar agora sobrescreveria configurações que não conseguimos ler.\n </p>\n <p className=\"mt-1 text-xs text-muted-foreground\">{loadError}</p>\n </div>\n )}\n {children}\n <div className=\"flex min-h-5 items-center gap-1.5 px-1 text-xs text-muted-foreground\">\n {error ? (\n <span className=\"flex items-center gap-1.5 text-destructive\">\n <AlertTriangle className=\"h-3.5 w-3.5 shrink-0\" />\n Não foi possível salvar: {error}\n </span>\n ) : saving ? (\n <>\n <Loader2 className=\"h-3.5 w-3.5 shrink-0 animate-spin\" />\n Salvando…\n </>\n ) : (\n <>\n <Check className=\"h-3.5 w-3.5 shrink-0\" />\n As alterações são salvas automaticamente.\n </>\n )}\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport { SettingsGroup, SelectRow, ToggleRow } from '@fayz-ai/admin'\nimport type { ShopProviderResolver } from '../data/shared'\nimport { useStoreSettings } from './useStoreSettings'\nimport { SettingsState } from './SettingsState'\n\nexport interface StoreGeneralSettingsProps {\n currency?: { code?: string; locale?: string; symbol?: string }\n provider?: ShopProviderResolver\n}\n\nconst CURRENCIES = [\n { value: 'BRL', label: 'Real (R$)' },\n { value: 'USD', label: 'US Dollar ($)' },\n { value: 'EUR', label: 'Euro (€)' },\n { value: 'GBP', label: 'British Pound (£)' },\n]\n\nconst LOCALES = [\n { value: 'pt-BR', label: 'Português (Brasil)' },\n { value: 'en-US', label: 'English (US)' },\n { value: 'es-ES', label: 'Español' },\n]\n\n/**\n * Loja — moeda, formatação e as regras de catálogo.\n *\n * O `currency` que o app passa na criação do plugin é o VALOR INICIAL mostrado,\n * não o valor salvo: enquanto o lojista não escolhe, a vitrine segue com o que o\n * app declarou, e é isso que a coluna nula significa. Escolher grava.\n */\nexport function StoreGeneralSettings({ currency, provider }: StoreGeneralSettingsProps) {\n const settings = useStoreSettings(provider, {\n currency: currency?.code ?? 'BRL',\n locale: currency?.locale ?? 'pt-BR',\n showOutOfStock: true,\n requireSku: false,\n notifyNewOrder: true,\n notifyLowStock: false,\n })\n const { value, set } = settings\n\n return (\n <SettingsState {...settings}>\n <SettingsGroup title=\"Loja\" description=\"Moeda e formatação da vitrine.\">\n <SelectRow\n label=\"Moeda\"\n description=\"Moeda padrão para preços e checkout.\"\n value={value.currency ?? 'BRL'}\n options={CURRENCIES}\n onChange={(v) => set({ currency: v })}\n />\n <SelectRow\n label=\"Idioma / formato\"\n description=\"Formatação de números, preços e datas.\"\n value={value.locale ?? 'pt-BR'}\n options={LOCALES}\n onChange={(v) => set({ locale: v })}\n />\n </SettingsGroup>\n\n <SettingsGroup title=\"Catálogo\" description=\"Como os produtos aparecem e são gerenciados.\">\n <ToggleRow\n label=\"Mostrar produtos esgotados\"\n description=\"Exibir itens sem estoque na vitrine.\"\n checked={value.showOutOfStock ?? true}\n onChange={(v) => set({ showOutOfStock: v })}\n />\n <ToggleRow\n label=\"Exigir SKU\"\n description=\"Tornar o SKU obrigatório ao criar produtos.\"\n checked={value.requireSku ?? false}\n onChange={(v) => set({ requireSku: v })}\n />\n </SettingsGroup>\n\n {/* «Controlar estoque» saiu daqui. Era um interruptor local que não\n governava nada, e a decisão real — quem é dono do número, nosso livro\n ou um ERP — já existe como `stock_ownership` e é escrita pelo conector\n que assume o estoque. Dois controles para a mesma coisa é o caminho\n mais curto para eles discordarem. */}\n\n <SettingsGroup title=\"Notificações\" description=\"Avisos por e-mail da loja.\">\n <ToggleRow\n label=\"E-mail de novo pedido\"\n description=\"Notificar a equipe a cada novo pedido.\"\n checked={value.notifyNewOrder ?? true}\n onChange={(v) => set({ notifyNewOrder: v })}\n />\n <ToggleRow\n label=\"Alerta de estoque baixo\"\n description=\"Avisar quando produtos atingirem o mínimo.\"\n checked={value.notifyLowStock ?? false}\n onChange={(v) => set({ notifyLowStock: v })}\n />\n </SettingsGroup>\n </SettingsState>\n )\n}\n","/**\n * Which gateway should be charging, given what the store stored and what is\n * connected right now. Returns the slug to persist, or null for \"leave it\".\n *\n * The store must always have someone charging: a gateway just connected and\n * nobody named makes every order pending for no reason, and a named gateway\n * that went away makes the checkout promise a charge that cannot open.\n *\n * `''` is the one answer this never overrides — it is the merchant saying \"eu\n * confirmo à mão\", which is a decision. `undefined` is the absence of one.\n */\nexport function resolvePaymentProvider(\n current: string | undefined | null,\n live: readonly string[],\n): string | null {\n if (live.length === 0) return null\n if (current === '') return null\n if (current && live.includes(current)) return null\n return live[0]!\n}\n","import React from 'react'\nimport { ConnectorMark, StateChip, type UnifiedConnector } from '@fayz-ai/admin'\n\n/**\n * One payment gateway, where activating it IS choosing it.\n *\n * Shopify and Nuvemshop have no \"primary provider\" control: a provider is active\n * or it is not, and turning one on is what makes it charge. Ours were two\n * sections, so the gateway was chosen in one place and listed in another with\n * the relationship left to be guessed.\n *\n * The row body ONLY selects, and the named link beside it is the only way into\n * the connection's own screen — a row that sometimes selected and sometimes\n * opened a panel read as broken, which is what it was reported as.\n */\nexport function PaymentProviderRow({ connector, selected, onSelect, onOpen }: {\n connector: UnifiedConnector\n selected: boolean\n onSelect: (connector: UnifiedConnector) => void\n onOpen: (connector: UnifiedConnector) => void\n}) {\n const live = connector.state === 'connected'\n\n return (\n <li className={`flex items-start gap-1 transition-colors ${selected ? 'bg-primary/5' : ''}`}>\n {/* Not connected is not selectable, and the body never opens the panel:\n one row, one meaning. The link beside it is the way in. */}\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n disabled={!live}\n onClick={() => onSelect(connector)}\n className={`flex min-w-0 flex-1 items-start gap-3 p-4 text-left ${\n live ? 'hover:bg-muted/40' : 'cursor-default opacity-70'\n }`}\n >\n <span\n aria-hidden\n className={`mt-1.5 flex h-4 w-4 shrink-0 items-center justify-center rounded-full border ${\n selected ? 'border-primary' : 'border-muted-foreground/40'\n } ${live ? '' : 'opacity-30'}`}\n >\n {selected && <span className=\"h-2 w-2 rounded-full bg-primary\" />}\n </span>\n <ConnectorMark connector={connector} />\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex flex-wrap items-center gap-2\">\n <span className=\"font-medium text-foreground\">{connector.name}</span>\n <StateChip state={connector.state} />\n </span>\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">\n {selected\n ? 'Cobra os pedidos desta loja.'\n : live\n ? 'Conectado. Clique para passar a cobrança para ele.'\n : connector.description ?? 'Ainda não conectado.'}\n </span>\n </span>\n </button>\n {/* Named, not a chevron: the arrow said \"there is more here\" and the row\n already means something else now — one of the two had to say what it\n does. */}\n <button\n type=\"button\"\n onClick={() => onOpen(connector)}\n className=\"shrink-0 self-center whitespace-nowrap px-4 text-xs text-muted-foreground underline decoration-dotted underline-offset-4 hover:text-foreground\"\n >\n {live ? 'Configurar conexão' : 'Conectar'}\n </button>\n </li>\n )\n}\n\n/** The absence of a gateway, as a choice in the same list — Shopify's \"manual\n * payment methods only\". A separate section for it made it look like a setting\n * about something else. */\nexport function ManualChargeRow({ selected, onSelect }: {\n selected: boolean\n onSelect: () => void\n}) {\n return (\n <li className={selected ? 'bg-primary/5' : ''}>\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n onClick={onSelect}\n className=\"flex w-full items-start gap-3 p-4 text-left hover:bg-muted/40\"\n >\n <span\n aria-hidden\n className={`mt-1.5 flex h-4 w-4 shrink-0 items-center justify-center rounded-full border ${\n selected ? 'border-primary' : 'border-muted-foreground/40'\n }`}\n >\n {selected && <span className=\"h-2 w-2 rounded-full bg-primary\" />}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"font-medium text-foreground\">Nenhum — eu confirmo os pagamentos à mão</span>\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">\n Pix por chave, dinheiro na entrega, combinado com a loja. O pedido nasce pendente e\n espera você confirmar que o dinheiro caiu.\n </span>\n </span>\n </button>\n </li>\n )\n}\n","import React from 'react'\nimport {\n SettingsGroup, MultiSelectRow,\n useConnectors, ConnectorDetail, AddConnectorPanel, AddConnectorButton,\n openConnectorsPanel, useConnectorsPanelAvailable,\n type UnifiedConnector,\n} from '@fayz-ai/admin'\nimport type { PaymentMethodKind } from '@fayz-ai/shop'\nimport { AlertTriangle } from 'lucide-react'\nimport type { ShopProviderResolver } from '../data/shared'\nimport { useStoreSettings } from './useStoreSettings'\nimport { SettingsState } from './SettingsState'\nimport { resolvePaymentProvider } from './payment-provider'\nimport { ManualChargeRow, PaymentProviderRow } from './PaymentProviderRow'\n\nexport interface PaymentsSettingsProps {\n provider?: ShopProviderResolver\n}\n\n/**\n * Every method an order can record — the same list as the CHECK on\n * plg_shop_orders.payment_method_kind, and therefore the same list the trigger\n * from 0045 validates against. One vocabulary, three places, no drift.\n */\nconst METHODS: Array<{ value: PaymentMethodKind; label: string; hint: string }> = [\n { value: 'pix', label: 'Pix', hint: 'Chave ou QR Code' },\n { value: 'credit_card', label: 'Cartão de crédito', hint: 'Gateway ou maquininha' },\n { value: 'debit_card', label: 'Cartão de débito', hint: 'Gateway ou maquininha' },\n { value: 'boleto', label: 'Boleto', hint: 'Enviado por e-mail' },\n { value: 'cash', label: 'Dinheiro', hint: 'Na entrega ou no balcão' },\n { value: 'other', label: 'Combinar com a loja', hint: 'A loja acerta o pagamento' },\n]\n\n/**\n * Pagamentos — quem cobra e o que o comprador pode escolher.\n *\n * Duas coisas diferentes numa tela, e a distinção é o assunto:\n *\n * • QUEM COBRA é uma conexão. Já existe: os conectores de pagamento vêm do\n * manifesto do plugin, a credencial vai para o cofre e o estado é derivado\n * de plg_connections. Esta tela não reimplementa nada disso — ela FILTRA o\n * hub por `category === 'payments'` e reusa a mesma linha, a mesma marca e a\n * mesma jornada de conectar. Um cartão próprio aqui divergiria do hub na\n * primeira vez que qualquer um dos três mudasse.\n *\n * • O QUE O COMPRADOR ESCOLHE é política comercial, e muda com a estação. Fica\n * em plg_shop_settings.payment_methods, é lida pela vitrine em runtime e é\n * IMPOSTA no servidor: um pedido nomeando um método fora da lista é\n * recusado, não apenas escondido do formulário.\n *\n * Um método sem gateway ainda é legítimo — dinheiro na entrega, Pix por chave,\n * «combinar com a loja» — então nada aqui exige uma conexão para ser oferecido.\n * O que a tela faz é DIZER quando o pedido vai nascer pendente esperando o\n * lojista confirmar, em vez de deixar o lojista descobrir isso no primeiro\n * pedido.\n */\n/** The categories this screen is about — the same list its own filter uses. */\nconst PAYMENT_CATEGORIES = ['payments']\n\nexport function PaymentsSettings({ provider }: PaymentsSettingsProps) {\n const settings = useStoreSettings(provider)\n const { value, set } = settings\n const { connectors } = useConnectors({ hostPluginId: 'shop', includeGrants: false })\n const [adding, setAdding] = React.useState(false)\n const [selected, setSelected] = React.useState<UnifiedConnector | null>(null)\n const panelAvailable = useConnectorsPanelAvailable()\n\n const openJourney = React.useCallback(\n (connector: UnifiedConnector) => {\n // Same rule as the hub: the assistant's drawer owns the journey when one is\n // mounted, and the sheet is the fallback so the flow is never stranded.\n if (panelAvailable) openConnectorsPanel(connector)\n else setSelected(connector)\n },\n [panelAvailable],\n )\n\n const payment = React.useMemo(\n () => (connectors ?? []).filter((c) => c.category && PAYMENT_CATEGORIES.includes(c.category)),\n [connectors],\n )\n const live = React.useMemo(() => payment.filter((c) => c.state === 'connected'), [payment])\n\n const chosen = value.paymentMethods ?? []\n // A gateway went away (disconnected, or the app dropped the plugin) and the\n // store still names it — and there is nothing live to hand the charge to.\n const staleProvider = !!value.paymentProvider\n && !live.some((c) => c.slug === value.paymentProvider)\n && live.length === 0\n\n // Always someone charging — the rule itself is in resolvePaymentProvider, so\n // it can be argued with in a test instead of in a mounted screen.\n const movedFrom = React.useRef<string | null>(null)\n React.useEffect(() => {\n if (!settings.supported || settings.loading) return\n const next = resolvePaymentProvider(value.paymentProvider, live.map((c) => c.slug))\n if (!next) return\n // Only a REPLACEMENT is announced; adopting a gateway nobody had chosen is\n // not news.\n if (value.paymentProvider) movedFrom.current = value.paymentProvider\n set({ paymentProvider: next })\n }, [live, value.paymentProvider, settings.supported, settings.loading, set])\n\n return (\n <SettingsState {...settings}>\n <SettingsGroup\n title=\"Formas de pagamento\"\n description=\"O que o cliente pode escolher no checkout. Um pedido que chegar com outra forma é recusado pelo servidor.\"\n >\n <MultiSelectRow\n label=\"Aceito na loja\"\n description=\"Nada escolhido = a vitrine oferece o que o app declarou, como hoje.\"\n value={chosen}\n options={METHODS.map((m) => ({ value: m.value, label: m.label }))}\n onChange={(next) => set({ paymentMethods: next as PaymentMethodKind[] })}\n />\n {chosen.length > 0 && !value.paymentProvider && (\n <p className=\"flex items-start gap-2 py-3 text-xs text-muted-foreground\">\n <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n Sem um gateway cobrando, todo pedido nasce <strong className=\"font-medium\">pendente</strong> e\n espera você confirmar que o dinheiro caiu. Isso funciona — é como as lojas com Pix por\n chave e pagamento na entrega operam — mas a confirmação é sua.\n </p>\n )}\n </SettingsGroup>\n\n <div>\n <div className=\"flex items-start justify-between gap-4 px-1 pb-1 pt-4\">\n <div>\n <h3 className=\"text-sm font-semibold\">Quem cobra</h3>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n O provedor marcado é quem abre a cobrança quando o cliente finaliza a compra — só um\n cobra por vez. A credencial vai para o cofre, nunca para o banco da loja.\n </p>\n </div>\n <AddConnectorButton onClick={() => setAdding(true)} />\n </div>\n <div className=\"rounded-lg border bg-card shadow-sm\">\n {payment.length === 0 ? (\n <p className=\"p-4 text-sm text-muted-foreground\">\n Nenhum provedor de pagamento disponível para este app ainda.\n </p>\n ) : (\n <ul className=\"divide-y\" role=\"radiogroup\" aria-label=\"Quem cobra\">\n {payment.map((connector) => (\n <PaymentProviderRow\n key={connector.id}\n connector={connector}\n selected={value.paymentProvider === connector.slug}\n onSelect={(c) => { movedFrom.current = null; set({ paymentProvider: c.slug }) }}\n onOpen={openJourney}\n />\n ))}\n <ManualChargeRow\n selected={value.paymentProvider === ''}\n onSelect={() => { movedFrom.current = null; set({ paymentProvider: '' }) }}\n />\n </ul>\n )}\n </div>\n {movedFrom.current && (\n <p className=\"flex items-start gap-2 px-1 pt-2 text-xs text-muted-foreground\">\n <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0 text-amber-600\" />\n <span>\n <strong className=\"font-medium\">{movedFrom.current}</strong> não está mais conectado, então\n a cobrança passou para o provedor marcado acima. Reconecte-o para voltar.\n </span>\n </p>\n )}\n {staleProvider && (\n <p className=\"flex items-start gap-2 px-1 pt-2 text-xs text-destructive\">\n <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n A loja cobra por <strong className=\"font-medium\">{value.paymentProvider}</strong>, que não\n está conectado agora, e não há outro para assumir. Enquanto isso os pedidos nascem\n pendentes.\n </p>\n )}\n </div>\n\n <AddConnectorPanel\n open={adding}\n onOpenChange={setAdding}\n connectors={connectors}\n // The button lives under \"Provedores de pagamento\" and must offer only\n // those: it was listing the ERP and the carrier too.\n categories={PAYMENT_CATEGORIES}\n onSelect={(connector) => {\n setAdding(false)\n openJourney(connector)\n }}\n />\n <ConnectorDetail\n connector={selected}\n open={!!selected}\n onOpenChange={(open) => { if (!open) setSelected(null) }}\n />\n </SettingsState>\n )\n}\n","import React from 'react'\nimport { SettingsGroup, SelectRow, ToggleRow } from '@fayz-ai/admin'\nimport type { CheckoutFieldKey, CheckoutFieldPolicy } from '@fayz-ai/shop'\nimport type { ShopProviderResolver } from '../data/shared'\nimport { useStoreSettings } from './useStoreSettings'\nimport { SettingsState } from './SettingsState'\n\nexport interface CheckoutSettingsProps {\n provider?: ShopProviderResolver\n}\n\n/**\n * The fields the checkout form can ask for, and which of them a store may\n * actually turn off.\n *\n * `locked` is not a UI nicety — it is the delivery reality. A courier cannot\n * deliver to a street with no number and no district, and the checkout's own\n * validation refuses those today; offering a switch that promises otherwise\n * would be offering to break deliveries. The order those appear in is the order\n * of the form, so this list reads like the screen the shopper sees.\n */\nconst FIELDS: Array<{ key: CheckoutFieldKey; label: string; locked?: boolean; hint?: string }> = [\n { key: 'name', label: 'Nome completo', locked: true, hint: 'Sempre pedido — é para quem a entrega vai.' },\n { key: 'email', label: 'E-mail', locked: true, hint: 'Sempre pedido — é por onde o pedido é confirmado.' },\n { key: 'phone', label: 'Telefone', hint: 'Vai junto com o endereço — é por onde o entregador liga.' },\n // Back, now that 0050 gives it a column. Deliberately NOT locked: a store that\n // neither charges through a gateway nor issues an invoice has no use for it.\n // The checkout escalates it to required on its own when a gateway is on —\n // that is a fact about the charge, not a preference the merchant can waive.\n { key: 'document', label: 'CPF / CNPJ', hint: 'Obrigatório quando a loja cobra por gateway ou emite nota — nesse caso a vitrine já pede sozinha.' },\n { key: 'postalCode', label: 'CEP', locked: true, hint: 'Sempre pedido — é o que cota o frete.' },\n { key: 'street', label: 'Endereço', locked: true },\n { key: 'number', label: 'Número', locked: true, hint: 'Sem número o entregador não chega.' },\n { key: 'complement', label: 'Complemento' },\n { key: 'district', label: 'Bairro', locked: true },\n { key: 'city', label: 'Cidade', locked: true },\n { key: 'state', label: 'UF', locked: true },\n]\n\nconst REQUIREMENT = [\n { value: 'off', label: 'Não pedir' },\n { value: 'optional', label: 'Pedir (opcional)' },\n { value: 'required', label: 'Pedir (obrigatório)' },\n]\n\nfunction toRequirement(policy: CheckoutFieldPolicy | undefined, locked: boolean): string {\n if (locked) return 'required'\n if (policy?.visible === false) return 'off'\n return policy?.required ? 'required' : 'optional'\n}\n\nfunction fromRequirement(choice: string): CheckoutFieldPolicy {\n // 'off' writes both keys rather than only `visible`: a field nobody can see\n // cannot be required, and leaving a stale `required: true` behind is how a\n // hidden field later reappears as a blocking validation nobody can satisfy.\n if (choice === 'off') return { visible: false, required: false }\n return { visible: true, required: choice === 'required' }\n}\n\n/**\n * Checkout — quem pode comprar e o que é pedido no caminho.\n *\n * A honestidade sobre quem impõe o quê está nas descrições, e não é detalhe:\n * «compra sem cadastro» é recusada pelo SERVIDOR (trigger da 0045), então\n * desligá-la vale mesmo contra um POST direto no RPC. «Exigir e-mail\n * confirmado» e os campos do formulário são de INTERFACE — a vitrine obedece, e\n * um comprador determinado não é impedido pelo banco. Prometer imposição onde\n * ela não existe é pior do que não ter a opção.\n */\nexport function CheckoutSettings({ provider }: CheckoutSettingsProps) {\n const settings = useStoreSettings(provider, {\n guestCheckout: true,\n requireConfirmedEmail: false,\n marketingOptIn: false,\n discountsEnabled: true,\n })\n const { value, set } = settings\n const fields = value.checkoutFields ?? {}\n\n const setField = (key: CheckoutFieldKey, choice: string) =>\n set({ checkoutFields: { ...fields, [key]: fromRequirement(choice) } })\n\n return (\n <SettingsState {...settings}>\n <SettingsGroup\n title=\"Contas de cliente\"\n description=\"Se o comprador precisa de uma conta antes de finalizar.\"\n >\n <ToggleRow\n label=\"Permitir compra sem cadastro\"\n description=\"Desligado, o comprador precisa entrar ou criar conta. Esta é imposta no servidor: um pedido sem conta é recusado.\"\n checked={value.guestCheckout ?? true}\n onChange={(v) => set({ guestCheckout: v })}\n />\n <ToggleRow\n label=\"Exigir e-mail confirmado\"\n description=\"O comprador recebe um link ao se cadastrar e só finaliza depois de clicar. Vale na vitrine — confirmar e-mail é um fato da conta, não do pedido.\"\n checked={value.requireConfirmedEmail ?? false}\n onChange={(v) => set({ requireConfirmedEmail: v })}\n disabled={value.guestCheckout !== false}\n />\n {value.guestCheckout !== false && (\n <p className=\"py-3 text-xs text-muted-foreground\">\n «Exigir e-mail confirmado» só faz sentido com o cadastro obrigatório: enquanto a compra\n sem cadastro está liberada, não há conta cujo e-mail confirmar.\n </p>\n )}\n </SettingsGroup>\n\n <SettingsGroup title=\"Carrinho\" description=\"O que o comprador pode aplicar antes de pagar.\">\n <ToggleRow\n label=\"Cupons de desconto\"\n description=\"Mostrar o campo de código no carrinho e no checkout.\"\n checked={value.discountsEnabled ?? true}\n onChange={(v) => set({ discountsEnabled: v })}\n />\n </SettingsGroup>\n\n <SettingsGroup\n title=\"Consentimento de marketing\"\n description=\"Coleta de opt-in para e-mails, no padrão que a LGPD pede: marcado por quem quer, nunca por padrão.\"\n >\n <ToggleRow\n label=\"Mostrar caixa de opt-in\"\n description=\"Exibir a caixa «quero receber novidades» no checkout, desmarcada.\"\n checked={value.marketingOptIn ?? false}\n onChange={(v) => set({ marketingOptIn: v })}\n />\n </SettingsGroup>\n\n <SettingsGroup\n title=\"Campos do cliente\"\n description=\"O que o comprador vê e o que ele precisa preencher. Campos travados são os que a entrega não dispensa.\"\n >\n {FIELDS.map((field) => (\n <SelectRow\n key={field.key}\n label={field.label}\n description={field.hint}\n value={toRequirement(fields[field.key], !!field.locked)}\n options={field.locked ? [{ value: 'required', label: 'Pedir (obrigatório)' }] : REQUIREMENT}\n onChange={(choice) => setField(field.key, choice)}\n disabled={field.locked}\n />\n ))}\n </SettingsGroup>\n </SettingsState>\n )\n}\n","import React from 'react'\nimport { RegistryCrudView } from '@fayz-ai/admin'\nimport { packagesRegistry, PACKAGES_REGISTRY } from '../data/registries'\nimport { shippingRegistryPath } from '../data/registry-routes'\n\n/**\n * Embalagens — em que caixas a loja embala.\n *\n * É a metade que faltava do frete real. O produto declara o que ele É (peso e\n * medidas, na seção Envio do cadastro) e para onde ele VAI (a embalagem que\n * aponta); esta tela é o cadastro de onde essa escolha sai. Enquanto ela não\n * existia, a caixa da cotação era uma constante no código — 4×16×20cm e 300g\n * para toda loja da plataforma, que é o piso que a Correios aceita e não a\n * medida de nada que alguém vende. O frete cotado e o frete pago divergiam, e a\n * diferença saía da margem do lojista.\n *\n * A LISTA NÃO É DESTE ARQUIVO, e essa é a correção: era um CRUD escrito à mão,\n * com o seu próprio jeito de listar, criar, validar e apagar. Agora é\n * `PluginRegistryDef` + `RegistryCrudView`, o mesmo par que desenha feriados,\n * locais e categorias — uma interface a menos para o lojista aprender e umas\n * duzentas linhas a menos para manter sincronizadas com o resto do admin.\n */\nexport function PackagesSettings({ basePath = shippingRegistryPath(PACKAGES_REGISTRY) }: {\n basePath?: string\n}) {\n return (\n <div className=\"space-y-3\">\n <div className=\"px-1 pt-4\">\n <h3 className=\"text-sm font-semibold\">Embalagens</h3>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">{packagesRegistry.description}</p>\n </div>\n {/* Uma seção entre outras nesta aba: as ações ficam aqui, não na barra. */}\n <RegistryCrudView registry={packagesRegistry} basePath={basePath} embedded />\n </div>\n )\n}\n","import React from 'react'\nimport { SettingsGroup, TextRow, adminNavigateTo } from '@fayz-ai/admin'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport type { ShippingProfile } from '@fayz-ai/shop'\nimport { ArrowRight, Layers } from 'lucide-react'\nimport { resolve, type ShopProviderResolver } from '../data/shared'\nimport type { StoreSettingsHandle } from './useStoreSettings'\nimport { SHIPPING_PROFILES_REGISTRY } from '../data/registries'\nimport { shippingRegistryPath } from '../data/registry-routes'\n\nexport interface HandlingSettingsProps {\n /** The Entrega screen's own settings read, shared rather than repeated. */\n settings: StoreSettingsHandle\n provider?: ShopProviderResolver\n}\n\n/**\n * Shipping profiles, and the handling note that travels with the parcel.\n *\n * Replaces a three-way cold-chain radio: a profile answers refrigerated, fragile,\n * oversized and made-to-order with one mechanism. The note is separate because it\n * does not decide who may carry the box.\n */\nexport function HandlingSettings({ settings, provider }: HandlingSettingsProps) {\n const shop = React.useMemo(() => (provider ? resolve(provider) : getShopProvider()), [provider])\n const { value, set, loading, supported } = settings\n const [noteDraft, setNoteDraft] = React.useState<string | null>(null)\n const [profiles, setProfiles] = React.useState<ShippingProfile[] | null>(null)\n\n React.useEffect(() => {\n let cancelled = false\n void shop.listShippingProfiles?.()\n .then((list) => { if (!cancelled) setProfiles(list) })\n // Silent: a provider without profiles reads the same as a store with none.\n .catch(() => { if (!cancelled) setProfiles([]) })\n return () => { cancelled = true }\n }, [shop])\n\n if (!supported) return null\n\n const storedNote = value.handlingNote ?? ''\n // Null draft = not being edited, so a server answer cannot fight the typing.\n const note = noteDraft ?? storedNote\n const custom = (profiles ?? []).filter((p) => !p.isDefault)\n\n return (\n <div className=\"space-y-4\">\n <div className=\"px-1 pb-1 pt-4\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold\">\n <Layers className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n Produtos que vão de outro jeito\n </h3>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n Um perfil é um grupo de produtos com zonas próprias — refrigerados, frágeis, volumosos, sob\n encomenda. Um perfil com só as suas zonas e o gateway desligado é como se diz «isto não vai\n de transportadora». Produto sem perfil usa o geral, que é o de todos hoje.\n </p>\n </div>\n\n <div className=\"rounded-lg border bg-card px-5 shadow-sm\">\n <button\n type=\"button\"\n onClick={() => adminNavigateTo(shippingRegistryPath(SHIPPING_PROFILES_REGISTRY))}\n className=\"flex w-full items-center gap-3 py-3.5 text-left\"\n >\n <Layers className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-sm font-medium\">\n {profiles == null\n ? 'Carregando perfis…'\n : custom.length === 0\n ? 'Só o perfil geral'\n : `${custom.length} ${custom.length === 1 ? 'perfil' : 'perfis'} além do geral`}\n </span>\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">\n {custom.length === 0\n ? 'Todo produto entrega pelas mesmas zonas. Crie um perfil quando um grupo precisar de zonas diferentes.'\n : custom.slice(0, 3).map((p) => p.name).join(' · ')}\n {custom.length > 3 && ` e ${custom.length - 3} mais`}\n </span>\n </span>\n <ArrowRight className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n </button>\n </div>\n\n <SettingsGroup\n title=\"Recado para quem entrega\"\n description=\"Vai junto com o pedido — para você, para o motoboy, e na observação da etiqueta quando houver gateway. Não aparece para o cliente, e não decide quem pode levar.\"\n >\n <TextRow\n label=\"Instrução de manuseio\"\n description=\"Ex.: caixa térmica com gelo, entregar em até 24h.\"\n value={note}\n onChange={setNoteDraft}\n onBlurCommit={() => {\n const next = note.trim()\n if (next !== storedNote) set({ handlingNote: next })\n setNoteDraft(null)\n }}\n placeholder=\"Sem instrução\"\n disabled={loading}\n />\n </SettingsGroup>\n </div>\n )\n}\n","import React from 'react'\n\nexport interface Choice<T extends string> {\n value: T\n label: string\n description: string\n /** Optional lucide icon component, rendered before the label. */\n Icon?: React.ComponentType<{ className?: string }>\n}\n\nexport interface ChoiceCardsProps<T extends string> {\n label: string\n choices: ReadonlyArray<Choice<T>>\n value: T | undefined\n onChange: (value: T) => void\n disabled?: boolean\n}\n\n/**\n * Mutually exclusive policies with a paragraph each — a radio, not a dropdown:\n * choosing between two of these needs both on screen at once.\n */\nexport function ChoiceCards<T extends string>({\n label, choices, value, onChange, disabled,\n}: ChoiceCardsProps<T>) {\n return (\n <div className=\"space-y-2 py-3\" role=\"radiogroup\" aria-label={label}>\n {choices.map((choice) => {\n const chosen = value === choice.value\n const Icon = choice.Icon\n return (\n <button\n key={choice.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={chosen}\n disabled={disabled}\n onClick={() => onChange(choice.value)}\n className={`flex w-full items-start gap-3 rounded-lg border p-3 text-left transition-colors ${\n chosen ? 'border-primary bg-primary/5' : 'border-border hover:bg-muted/40'\n } ${disabled ? 'opacity-60' : ''}`}\n >\n <span\n aria-hidden\n className={`mt-0.5 flex h-4 w-4 shrink-0 items-center justify-center rounded-full border ${\n chosen ? 'border-primary' : 'border-muted-foreground/40'\n }`}\n >\n {chosen && <span className=\"h-2 w-2 rounded-full bg-primary\" />}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex items-center gap-2 text-sm font-medium\">\n {Icon && <Icon className=\"h-4 w-4 shrink-0 text-muted-foreground\" />}\n {choice.label}\n </span>\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">{choice.description}</span>\n </span>\n </button>\n )\n })}\n </div>\n )\n}\n","import React from 'react'\nimport {\n SettingsGroup, TextRow, RegistryCrudView,\n useConnectors, ConnectorRow, ConnectorDetail,\n openConnectorsPanel, useConnectorsPanelAvailable,\n type UnifiedConnector,\n} from '@fayz-ai/admin'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport type { ShippingSettings as ShippingSettingsRow, ShippingZone, StockLocation } from '@fayz-ai/shop'\nimport { AlertTriangle, ArrowRight, Car, Loader2, MapPin, Truck, Warehouse } from 'lucide-react'\nimport { resolve, type ShopProviderResolver } from '../data/shared'\nimport { errorMessage } from './error-message'\nimport { PackagesSettings } from './PackagesSettings'\nimport {\n buildShopRegistries, locationSummary, LOCATIONS_REGISTRY, SHIPPING_ZONES_REGISTRY,\n} from '../data/registries'\nimport { shippingRecordPath, shippingRegistryIdFromHash, shippingRegistryPath } from '../data/registry-routes'\nimport { HandlingSettings } from './HandlingSettings'\nimport { ChoiceCards } from './ChoiceCards'\nimport { useStoreSettings } from './useStoreSettings'\n\nexport interface ShippingSettingsProps {\n provider?: ShopProviderResolver\n}\n\n/** Money in, as typed: '12,50' and '12.50' are the same number to a shopkeeper. */\nfunction parseMoney(raw: string): number | null {\n const cleaned = raw.replace(/[^\\d,.-]/g, '').replace(',', '.')\n if (!cleaned.trim()) return null\n const n = Number(cleaned)\n return Number.isFinite(n) && n >= 0 ? Math.round(n * 100) / 100 : null\n}\n\nconst formatMoney = (v: number | null | undefined): string =>\n v == null ? '' : String(v).replace('.', ',')\n\ntype FreightSource = 'own' | 'gateway'\n\n/** Stored rather than inferred from \"no connection\": connecting a gateway must not\n * start quoting carriers for a store that dispatches by hand. */\nconst FREIGHT_SOURCE: ReadonlyArray<{\n value: FreightSource\n label: string\n description: string\n Icon: React.ComponentType<{ className?: string }>\n}> = [\n {\n value: 'own',\n label: 'Eu mesmo calculo e despacho',\n description:\n 'O frete sai do preço base e das suas faixas de CEP, e você despacha como quiser — carro próprio, motoboy, agência. Nenhum gateway é consultado, mesmo que exista um conectado.',\n Icon: Car,\n },\n {\n value: 'gateway',\n label: 'Perguntar a um gateway de frete',\n description:\n 'O preço e o prazo vêm da transportadora, calculados pelo CEP do comprador. Quando o gateway não responde a tempo, o checkout usa suas faixas — a compra nunca fica sem preço.',\n Icon: Truck,\n },\n]\n\n/**\n * Entrega — o preço base, as zonas e quem coleta.\n *\n * A ORDEM DE PRECEDÊNCIA é o assunto desta tela, e está escrita nela em vez de\n * só no SQL: uma ZONA que cobre o CEP ganha do preço base; o preço base é o que\n * a loja cobra para um endereço que nenhuma zona cobre. Sem isso dito, um\n * lojista que criou uma zona não entende por que o número que ele digitou aqui\n * não aparece no checkout.\n *\n * O preço base vive em public.shipping_settings desde a 0015 e, até agora, só\n * podia ser escrito por SQL à mão — a tabela existia, com RLS e leitura anônima,\n * e nenhuma tela. É este arquivo que fecha isso.\n *\n * ZONAS E EMBALAGENS SÃO CADASTROS, e desde a FAY-1407 são cadastros DAQUI. As\n * zonas moravam numa página de CRUD própria em /store/shipping, então clicar em\n * \"Zonas de entrega\" no meio de configurar a entrega jogava o lojista para fora\n * de Configurações e o trazia de volta pela seta do navegador. Agora as duas\n * abrem em `_properties/<id>` dentro desta mesma tela, pelo `RegistryCrudView`\n * genérico — o mesmo que desenha feriados e locais.\n */\n\nexport function ShippingSettings({ provider }: ShippingSettingsProps) {\n // A rota mais funda ganha: /settings/shop-shipping/_properties/zonas é a\n // mesma aba, mostrando o cadastro em vez do resumo. Sem isso a lista de zonas\n // apareceria inteira embaixo do preço base o tempo todo.\n const [registryId, setRegistryId] = React.useState(shippingRegistryIdFromHash)\n React.useEffect(() => {\n const handler = () => setRegistryId(shippingRegistryIdFromHash())\n window.addEventListener('hashchange', handler)\n return () => window.removeEventListener('hashchange', handler)\n }, [])\n\n const shop = React.useMemo(() => (provider ? resolve(provider) : getShopProvider()), [provider])\n const registries = React.useMemo(\n () => buildShopRegistries(provider ?? getShopProvider),\n [provider],\n )\n // One read of plg_shop_settings for the whole screen: both sections below are\n // slices of the same tenant row.\n const storeSettings = useStoreSettings(provider)\n const supported = typeof shop.getShippingSettings === 'function' && typeof shop.updateShippingSettings === 'function'\n\n const [row, setRow] = React.useState<ShippingSettingsRow | null>(null)\n const [zones, setZones] = React.useState<ShippingZone[] | null>(null)\n const [locations, setLocations] = React.useState<StockLocation[] | null>(null)\n const [loading, setLoading] = React.useState(supported)\n const [saving, setSaving] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const [loadError, setLoadError] = React.useState<string | null>(null)\n\n // Drafts, because these are TEXT inputs over numbers: committing on every\n // keystroke would turn '1' into a R$ 1,00 flat rate on the way to '15'. They\n // commit on blur, which is also when the parse refusal can be shown without\n // fighting the person still typing.\n const [flatDraft, setFlatDraft] = React.useState('')\n const [freeDraft, setFreeDraft] = React.useState('')\n const [flatBad, setFlatBad] = React.useState(false)\n const [freeBad, setFreeBad] = React.useState(false)\n\n const { connectors } = useConnectors({ hostPluginId: 'shop', includeGrants: false })\n const [selected, setSelected] = React.useState<UnifiedConnector | null>(null)\n const panelAvailable = useConnectorsPanelAvailable()\n const openJourney = React.useCallback(\n (connector: UnifiedConnector) => {\n if (panelAvailable) openConnectorsPanel(connector)\n else setSelected(connector)\n },\n [panelAvailable],\n )\n const carriers = React.useMemo(\n () => (connectors ?? []).filter((c) => c.category === 'logistics' || c.category === 'shipping'),\n [connectors],\n )\n // 'ready' means declared and installed, not connected.\n const carriersConnected = carriers.some((c) => c.state !== 'ready')\n\n React.useEffect(() => {\n let cancelled = false\n if (supported) {\n setLoading(true)\n void shop\n .getShippingSettings!()\n .then((settings) => {\n if (cancelled) return\n setRow(settings)\n setFlatDraft(formatMoney(settings?.flatRate ?? 0))\n setFreeDraft(formatMoney(settings?.freeAbove))\n })\n .catch((e) => { if (!cancelled) setLoadError(errorMessage(e)) })\n .finally(() => { if (!cancelled) setLoading(false) })\n }\n void shop.listShippingZones?.()\n .then((list) => { if (!cancelled) setZones(list) })\n .catch(() => { if (!cancelled) setZones([]) })\n void shop.listStockLocations?.()\n .then((list) => { if (!cancelled) setLocations(list) })\n .catch(() => { if (!cancelled) setLocations([]) })\n return () => { cancelled = true }\n }, [shop, supported])\n\n const save = React.useCallback(\n (patch: Partial<ShippingSettingsRow>) => {\n if (!supported) return\n setSaving(true)\n setError(null)\n void shop\n .updateShippingSettings!(patch)\n .then((saved) => setRow(saved))\n .catch((e) => setError(errorMessage(e)))\n .finally(() => setSaving(false))\n },\n [shop, supported],\n )\n\n const commitFlat = () => {\n const parsed = parseMoney(flatDraft)\n // Empty means zero here — \"I charge nothing\" is a decision a store makes, and\n // it is also the column's default, so there is nothing ambiguous to refuse.\n const next = flatDraft.trim() === '' ? 0 : parsed\n if (next == null) { setFlatBad(true); return }\n setFlatBad(false)\n setFlatDraft(formatMoney(next))\n if (next !== (row?.flatRate ?? 0)) save({ flatRate: next })\n }\n\n const commitFree = () => {\n // Empty is NULL, not zero: \"no threshold\" and \"free from R$ 0\" are opposite\n // policies, and a zero here would make every order's delivery free.\n if (freeDraft.trim() === '') {\n setFreeBad(false)\n if (row?.freeAbove != null) save({ freeAbove: null })\n return\n }\n const parsed = parseMoney(freeDraft)\n if (parsed == null) { setFreeBad(true); return }\n setFreeBad(false)\n setFreeDraft(formatMoney(parsed))\n if (parsed !== row?.freeAbove) save({ freeAbove: parsed })\n }\n\n // An exclusion is active and is NOT a delivery zone.\n const activeZones = (zones ?? []).filter((z) => z.active && !z.excluded)\n const excludedZones = (zones ?? []).filter((z) => z.active && z.excluded)\n // undefined = undecided, which asks the gateway if one is connected.\n const usesGateway = storeSettings.value.carrierQuotes !== false\n\n // Only active locations that dispatch: an archived warehouse and one that just\n // holds stock are both irrelevant to what the shopper is quoted.\n const dispatching = (locations ?? []).filter((l) => l.status === 'active' && l.shipsOnline !== false)\n const originCep = dispatching.find((l) => l.postalCode)?.postalCode ?? null\n\n // Looked up, never compared to a literal: a `registryId === 'zonas'` here kept\n // rendering Embalagens after the rename, with nothing visibly broken.\n const activeRegistry = registryId\n ? registries.find((candidate) => candidate.id === registryId) ?? null\n : null\n if (activeRegistry) {\n // No back button of its own: the shell draws the whole trail.\n return (\n <RegistryCrudView\n registry={activeRegistry}\n basePath={shippingRegistryPath(activeRegistry.id)}\n />\n )\n }\n\n return (\n <div className=\"space-y-4\">\n {loadError && (\n <div className=\"rounded-lg border border-destructive/30 bg-destructive/5 p-3 text-sm\">\n <p className=\"flex items-center gap-2 font-medium text-destructive\">\n <AlertTriangle className=\"h-4 w-4 shrink-0\" />\n Não foi possível carregar o preço base de entrega\n </p>\n <p className=\"mt-1 text-muted-foreground\">\n O valor abaixo é o padrão, não o da sua loja. Recarregue antes de alterá-lo — salvar\n agora sobrescreveria um preço que não conseguimos ler.\n </p>\n <p className=\"mt-1 text-xs text-muted-foreground\">{loadError}</p>\n </div>\n )}\n {!supported ? (\n <div className=\"rounded-lg border border-amber-500/30 bg-amber-500/5 p-4 text-sm\">\n <p className=\"flex items-center gap-2 font-medium text-amber-700 dark:text-amber-500\">\n <AlertTriangle className=\"h-4 w-4 shrink-0\" />\n Este app não guarda o preço base de entrega\n </p>\n <p className=\"mt-1 text-muted-foreground\">\n O provedor de loja montado aqui não implementa <code>getShippingSettings</code>.\n </p>\n </div>\n ) : (\n <SettingsGroup\n title=\"Preço base\"\n description=\"O que a loja cobra quando nenhuma zona cobre o endereço. Uma zona que cobre o CEP sempre ganha deste número.\"\n >\n <TextRow\n label=\"Frete padrão\"\n description=\"Em reais. Deixe 0 para entrega grátis.\"\n value={flatDraft}\n onChange={setFlatDraft}\n onBlurCommit={commitFlat}\n placeholder=\"0,00\"\n invalid={flatBad}\n hint={flatBad ? 'Informe um valor em reais (ex.: 19,90).' : undefined}\n disabled={loading}\n />\n <TextRow\n label=\"Frete grátis acima de\"\n description=\"Subtotal, já com desconto, a partir do qual a entrega sai de graça. Vazio = sem regra de frete grátis.\"\n value={freeDraft}\n onChange={setFreeDraft}\n onBlurCommit={commitFree}\n placeholder=\"Sem regra\"\n invalid={freeBad}\n hint={freeBad ? 'Informe um valor em reais, ou deixe vazio.' : undefined}\n disabled={loading}\n />\n </SettingsGroup>\n )}\n\n <div>\n <div className=\"px-1 pb-1 pt-4\">\n <h3 className=\"text-sm font-semibold\">De onde você despacha</h3>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n Os locais que guardam estoque e despacham pedidos. O CEP do local padrão é a origem que a\n transportadora usa para cotar o frete — é aqui que ele se cadastra, uma vez. Cada local\n pode ter o seu próprio despachante ou seguir a decisão da loja.\n </p>\n </div>\n <div className=\"rounded-lg border bg-card px-5 shadow-sm\">\n <button\n type=\"button\"\n // Named ONE place? Open it. The list is only the answer when there\n // is nothing specific to point at.\n onClick={() => {\n window.location.hash = dispatching.length === 1 && dispatching[0]\n ? shippingRecordPath(LOCATIONS_REGISTRY, dispatching[0].id)\n : shippingRegistryPath(LOCATIONS_REGISTRY)\n }}\n className=\"flex w-full items-center gap-3 py-3.5 text-left\"\n >\n <Warehouse className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-sm font-medium\">\n {locations == null\n ? 'Carregando locais…'\n : dispatching.length === 0\n ? 'Nenhum local despacha pedidos'\n : dispatching.length === 1\n ? dispatching[0]!.name\n : `${dispatching.length} locais despachando`}\n </span>\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">\n {locations == null\n ? ' '\n : dispatching.length === 0\n ? 'Cadastre o local de onde os pedidos saem.'\n : dispatching.slice(0, 2).map((l) => locationSummary(l)).join(' — ')}\n </span>\n </span>\n <ArrowRight className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n </button>\n </div>\n {/* The one failure this screen can predict: a gateway that is asked to\n quote from nowhere answers nothing, and the shopper sees the zone\n price forever without knowing why. */}\n {usesGateway && locations != null && dispatching.length > 0 && !originCep && (\n <div className=\"mt-2 flex items-start gap-2 rounded-lg border border-amber-500/30 bg-amber-500/5 p-3 text-xs\">\n <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0 text-amber-600\" />\n <span className=\"text-muted-foreground\">\n Nenhum local tem CEP de origem. Sem ele a transportadora não cota, e o checkout cai nas\n suas zonas — preencha o CEP do local padrão.\n </span>\n </div>\n )}\n </div>\n\n <div>\n <div className=\"px-1 pb-1 pt-4\">\n <h3 className=\"text-sm font-semibold\">Zonas de entrega</h3>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n Faixas de CEP com preço, prazo e frete grátis próprios. Um CEP fora de todas as zonas cai\n no preço base acima; se a loja não tiver preço base nem zona que o cubra, o checkout diz\n que não entrega ali. Uma faixa também pode ser uma recusa — «não entrego aqui» — e ela\n vence qualquer zona e qualquer gateway.\n </p>\n </div>\n <div className=\"rounded-lg border bg-card px-5 shadow-sm\">\n <button\n type=\"button\"\n onClick={() => { window.location.hash = shippingRegistryPath(SHIPPING_ZONES_REGISTRY) }}\n className=\"flex w-full items-center gap-3 py-3.5 text-left\"\n >\n <MapPin className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-sm font-medium\">\n {zones == null\n ? 'Carregando zonas…'\n : activeZones.length === 0\n ? 'Nenhuma zona ainda'\n : `${activeZones.length} ${activeZones.length === 1 ? 'zona ativa' : 'zonas ativas'}`}\n </span>\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">\n {activeZones.length === 0\n ? 'Sem zonas, toda entrega usa o preço base.'\n : activeZones.slice(0, 3).map((z) => z.name).join(' · ')}\n {activeZones.length > 3 && ` e ${activeZones.length - 3} mais`}\n {excludedZones.length > 0 && (\n <span className=\"mt-0.5 block text-red-700 dark:text-red-400\">\n {excludedZones.length === 1\n ? '1 região recusada'\n : `${excludedZones.length} regiões recusadas`}\n {' — '}\n {excludedZones.slice(0, 2).map((z) => z.name).join(' · ')}\n </span>\n )}\n </span>\n </span>\n <ArrowRight className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n </button>\n </div>\n </div>\n\n <PackagesSettings />\n\n {storeSettings.supported && (\n <div>\n <div className=\"px-1 pb-1 pt-4\">\n <h3 className=\"text-sm font-semibold\">Quem calcula o frete</h3>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n O Melhor Envio não é uma transportadora: é um gateway, uma conexão só que traz\n Correios, Jadlog, Loggi e outras. Então a escolha aqui não é qual transportadora — é\n se a loja calcula pelas próprias faixas ou se pergunta o preço a um gateway.\n </p>\n </div>\n <ChoiceCards\n label=\"Quem calcula o frete\"\n choices={FREIGHT_SOURCE}\n value={usesGateway ? 'gateway' : 'own'}\n onChange={(choice) => storeSettings.set({ carrierQuotes: choice === 'gateway' })}\n disabled={storeSettings.loading}\n />\n {/* Keeps the screen honest: with a gateway still connected the choice is\n recorded intent, not a guarantee. */}\n {!usesGateway && carriersConnected && (\n <div className=\"mt-2 flex items-start gap-2 rounded-lg border border-amber-500/30 bg-amber-500/5 p-3 text-xs\">\n <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0 text-amber-600\" />\n <span className=\"text-muted-foreground\">\n Há um gateway ainda conectado abaixo. Para garantir que nenhum preço de\n transportadora apareça no checkout, desconecte-o — a escolha acima vale para a\n vitrine, a conexão continua existindo.\n </span>\n </div>\n )}\n </div>\n )}\n\n {carriers.length > 0 && (\n <div className={usesGateway ? undefined : 'opacity-60'}>\n <div className=\"px-1 pb-1 pt-4\">\n <h3 className=\"text-sm font-semibold\">Gateway de frete</h3>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n Conectado, ele cota o frete para o CEP do comprador em vez de a loja adivinhar. O preço\n cotado é gravado no servidor e é ele que o pedido cobra — o navegador escolhe entre\n opções, nunca informa um valor. Quais transportadoras aparecem vem da conta do\n gateway, não desta lista.\n </p>\n {!carriersConnected && (\n <p className=\"mt-1 text-[10px] text-muted-foreground\">\n Nenhum conectado — a loja entrega por conta própria, pelo preço base e pelas zonas\n acima. Conectar é opcional e pode ficar para depois.\n </p>\n )}\n </div>\n <div className=\"rounded-lg border bg-card shadow-sm\">\n <ul className=\"divide-y\">\n {carriers.map((connector) => (\n <ConnectorRow key={connector.id} connector={connector} onOpen={openJourney} />\n ))}\n </ul>\n </div>\n </div>\n )}\n\n <HandlingSettings settings={storeSettings} provider={provider} />\n\n <div className=\"flex min-h-5 items-center gap-1.5 px-1 text-xs text-muted-foreground\">\n {error ? (\n <span className=\"flex items-center gap-1.5 text-destructive\">\n <AlertTriangle className=\"h-3.5 w-3.5 shrink-0\" />\n Não foi possível salvar: {error}\n </span>\n ) : saving ? (\n <>\n <Loader2 className=\"h-3.5 w-3.5 shrink-0 animate-spin\" />\n Salvando…\n </>\n ) : (\n 'As alterações são salvas ao sair do campo.'\n )}\n </div>\n\n <ConnectorDetail\n connector={selected}\n open={!!selected}\n onOpenChange={(open) => { if (!open) setSelected(null) }}\n />\n </div>\n )\n}\n","import React from 'react'\nimport { SettingsGroup } from '@fayz-ai/admin'\nimport { Info } from 'lucide-react'\nimport type { StoreSettings } from '@fayz-ai/shop'\nimport type { ShopProviderResolver } from '../data/shared'\nimport { useStoreSettings } from './useStoreSettings'\nimport { SettingsState } from './SettingsState'\nimport { ChoiceCards } from './ChoiceCards'\n\nexport interface FulfillmentSettingsProps {\n provider?: ShopProviderResolver\n}\n\ntype Policy = NonNullable<StoreSettings['autoFulfill']>\n\n/**\n * Three mutually exclusive policies with a paragraph each — a radio, not a\n * dropdown. The difference between them is a sentence long, and a dropdown shows\n * one option at a time: choosing between \"quando o pagamento cair\" and \"sempre\"\n * requires reading both, which means both have to be on screen.\n */\nconst POLICIES: ReadonlyArray<{ value: Policy; label: string; description: string }> = [\n {\n value: 'on_payment',\n label: 'Dar baixa quando o pagamento for confirmado',\n description:\n 'A remessa é criada assim que o pedido é pago — pelo gateway ou por você aqui no admin. É a opção segura: nada sai antes de o dinheiro entrar.',\n },\n {\n value: 'always',\n label: 'Dar baixa em todo pedido, automaticamente',\n description:\n 'A remessa nasce junto com o pedido, pago ou não. Para quem cobra na entrega ou separa antes de receber.',\n },\n {\n value: 'never',\n label: 'Não dar baixa automática',\n description: 'Cada remessa é criada à mão, na tela do pedido. É o padrão.',\n },\n]\n\n/**\n * Fulfillment — se a remessa nasce sozinha.\n *\n * Uma decisão só, e ela é sobre QUANDO um registro de remessa passa a existir —\n * não sobre quem entrega. `public.fulfillments` e `fulfillment_items` já existem\n * desde a 0018, com o `fulfillment_status` do pedido DERIVADO deles por trigger;\n * a política escolhida aqui é lida por um trigger da 0045 que insere a remessa\n * com os itens do pedido, exatamente como a tela do pedido faria à mão. Nada\n * aqui escreve `fulfillment_status`: ele continua derivado, que é o que o impede\n * de divergir da realidade.\n *\n * Pedidos que já existem não são afetados. A política vale para o que vem\n * depois, e isso é dito na tela: um lojista que liga a baixa automática\n * esperando ver os pedidos de ontem despacharem tem uma surpresa pior do que a\n * frase.\n */\nexport function FulfillmentSettings({ provider }: FulfillmentSettingsProps) {\n const settings = useStoreSettings(provider, { autoFulfill: 'never' })\n const { value, set } = settings\n const current: Policy = value.autoFulfill ?? 'never'\n\n return (\n <SettingsState {...settings}>\n <SettingsGroup\n title=\"Baixa automática\"\n description=\"Quando um registro de remessa é criado para um pedido novo.\"\n >\n <ChoiceCards\n label=\"Baixa automática\"\n choices={POLICIES}\n value={current}\n onChange={(autoFulfill) => set({ autoFulfill })}\n />\n </SettingsGroup>\n\n <div className=\"flex items-start gap-2 rounded-lg border bg-muted/30 p-3 text-xs text-muted-foreground\">\n <Info className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n <span>\n A remessa criada aqui nasce <strong className=\"font-medium\">pendente</strong>, com os itens\n do pedido e sem transportadora nem código de rastreio — quem despacha preenche isso na tela\n do pedido. Pedidos que já foram feitos não são afetados.\n </span>\n </div>\n </SettingsState>\n )\n}\n","// Melhor Envio as a unified ConnectorDefinition, surfaced in Loja → settings →\n// Integrações (rendered by the shared ConnectorsHub).\n//\n// The first REQUEST-plane connector: the buyer is on the page waiting for a\n// price, so it declares a latency budget and what to do when the budget is\n// spent. `onFailure: 'degrade'` is the whole point — FAY-1301 says quoting\n// freight never blocks the purchase, and the answer it degrades to is the\n// store's own shipping zones, which is what the store quoted before Melhor\n// Envio existed.\n//\n// It brings no SQL. The connection is a plg_connections row (packages/db 029);\n// the label it buys later is an effect, and effects are ordinary plg_sync_runs\n// rows claimed through plg_claim_effect (030). Quotes are neither.\nimport React, { useEffect, useState } from 'react'\nimport {\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\n\nexport const MELHOR_ENVIO_CONNECTOR_ID = 'melhor-envio'\n\n/**\n * Two and a half seconds, and the number moved because it was MEASURED.\n *\n * It said one second, \"chosen against the funnel, not against the carrier\",\n * with the claim that \"Melhor Envio answers well inside it on a good day\". The\n * first real quote refuted that: the carrier alone takes ~610ms from São Paulo\n * to Rio in the sandbox, before the credential redemption (43ms) and the two\n * database round trips the quote needs. Total ~850ms server-side on a GOOD run,\n * which the browser's own hop pushed past 1000ms — so the budget aborted every\n * real quote and the shopper saw the zone price, forever. A budget that only\n * ever fires is not a safety net, it is the feature being off.\n *\n * The funnel reasoning was still right, which is why this is 2.5s and not 10:\n * past a few seconds \"calculando\" reads as broken, and the zones answer\n * instantly. What changed is the evidence about where the line actually is.\n */\nexport const MELHOR_ENVIO_LATENCY_BUDGET_MS = 2500\n\n/**\n * Where the parcels leave from. The canonical REQUIRED-TO-OPERATE setting:\n * Melhor Envio cannot quote a single price without it, and it is still not what\n * authorizes the connection — that is the OAuth grant, which is asked for on\n * Melhor Envio's own screen and never in this form.\n *\n * It used to be a `ConnectorField`, which meant a merchant had to know which\n * warehouse they ship from before they were allowed to plug the carrier in. Now\n * the connection is made and the store reads \"conectado, falta configurar\"\n * (`plg_connections.status = 'pending'`) until a postcode is chosen — which is\n * true, and is the difference between an integration that is not ready and one\n * that is broken.\n *\n * The `pattern` is what a free-text box never had: eight digits, checked here\n * rather than discovered by the first buyer who gets no price.\n */\n// A agência de postagem NÃO mora aqui: ela é do local de despacho (Entrega ▸\n// Locais), porque uma loja com dois galpões entrega em duas agências e o\n// conector guarda uma conta, não um endereço. O seletor está no cadastro do\n// local, listando o que existe perto DELE.\nexport const MELHOR_ENVIO_SETTINGS: ConnectorSetting[] = [\n {\n key: 'originPostalCode',\n label: 'CEP de origem',\n description: 'De onde os pedidos saem. É o que a transportadora usa para calcular preço e prazo.',\n type: 'text',\n placeholder: '01310-100',\n pattern: '^\\\\d{5}-?\\\\d{3}$',\n patternHint: 'Use 8 dígitos, como 01310-100.',\n requiredToOperate: true,\n },\n]\n\nconst store = createConnectionStore(MELHOR_ENVIO_CONNECTOR_ID, {\n settings: MELHOR_ENVIO_SETTINGS,\n settingsKeys: ['services', 'extraDays'],\n})\n\nfunction MelhorEnvioExtraPanel() {\n const [connected, setConnected] = useState(false)\n const [loaded, setLoaded] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n void store\n .get()\n .then((c) => { if (!cancelled) setConnected(!!c?.active) })\n .catch(() => {})\n .finally(() => { if (!cancelled) setLoaded(true) })\n return () => { cancelled = true }\n }, [])\n\n if (!loaded || !connected) return null\n\n return (\n <div className=\"space-y-2 border-t pt-4 text-xs text-muted-foreground\">\n <p>\n A cotação acontece enquanto o cliente espera, com um limite de 1 segundo. Se a transportadora\n não responder a tempo, o checkout mostra o preço das suas faixas de CEP e a compra continua\n normalmente — o cliente nunca fica sem preço na tela.\n </p>\n <p>\n Não existe histórico de cotações aqui de propósito: cotar não movimenta nada. O que aparece no\n histórico é a compra da etiqueta, feita uma única vez por pedido.\n </p>\n </div>\n )\n}\n\nexport const melhorEnvioConnectorDef: ConnectorDefinition = {\n id: MELHOR_ENVIO_CONNECTOR_ID,\n hostPluginId: 'shop',\n name: 'Melhor Envio',\n description:\n 'Frete real no checkout: Correios e Jadlog numa integração só, com prazo e preço calculados pelo CEP do cliente.',\n icon: 'Truck',\n category: 'logistics',\n authKind: 'oauth',\n // Two planes, and they are different jobs: the quote is in the buyer's request\n // path, the label purchase and its tracking are an ordinary outbound sync.\n planes: ['request', 'sync'],\n direction: 'outbound',\n docsUrl: 'https://docs.melhorenvio.com.br',\n // A quote WRITES NOTHING — `createShippingQuoter` says so in as many words,\n // and 029_connections.sql is why: one row per quote would make plg_sync_runs\n // the largest table in the pool within weeks. So `order` is read-only here,\n // and the only write is the label, which is an effect with an idempotency key\n // (`createLabelBuyer`) because a label bought twice is money spent twice.\n permissions: [\n {\n kind: 'data',\n resource: 'order',\n actions: ['read'],\n reason:\n 'Ler o CEP de destino e o que está no carrinho para pedir o preço e o prazo à transportadora. A cotação não é guardada.',\n },\n {\n kind: 'data',\n resource: 'shipment',\n actions: ['write'],\n reason: 'Registrar a etiqueta comprada e o código de rastreio no pedido.',\n },\n ],\n latencyBudgetMs: MELHOR_ENVIO_LATENCY_BUDGET_MS,\n // The sale is never blocked by a carrier's API (FAY-1301).\n onFailure: 'degrade',\n /**\n * There is no form. Melhor Envio is OAuth, and the store authorizes on Melhor\n * Envio's own screen exactly as it does with Google Calendar.\n *\n * It got here in two wrong steps. First `fields: []` on the theory that a\n * platform-level token existed — none does, so Conectar wrote `active = true`\n * against an account nobody had linked. Then a pasted `token` password field,\n * as a stopgap to stop that lie. OAuth replaces both: the store's own account\n * is linked, per-merchant by nature (the labels are bought with THIS store's\n * balance), and no credential ever passes through this file.\n *\n * The origin postcode stays where it is — a `ConnectorSetting`, on the\n * Configurações tab. It is what the connection needs to WORK, not what\n * authorizes it, and it must never come back to the connect step.\n */\n // `melhorenvio` without the hyphen, and that is not a typo: the provider key\n // is the path Melhor Envio has registered on our app (`/redirect/melhorenvio`),\n // and changing it would mean editing the registration at their end. The\n // connector's own id keeps the hyphen.\n startOAuth: fayzConnectorOAuth(MELHOR_ENVIO_CONNECTOR_ID, { provider: 'melhorenvio' }),\n settings: MELHOR_ENVIO_SETTINGS,\n // The answer to \"o Melhor Envio é acionado em quais momentos?\". Both calls are\n // real, so both are stated plainly.\n invokedAt: [\n {\n key: 'shop.checkout.shipping_quote',\n label: 'O cliente informa o CEP e pede as opções de frete',\n touches: ['order'],\n },\n {\n key: 'shop.order.label_purchase',\n label: 'O pedido é confirmado e a etiqueta é comprada, uma única vez',\n plane: 'sync',\n trigger: 'on-write',\n touches: ['order', 'shipment'],\n },\n ],\n // Read from the row the list already batched — one request for N connectors.\n ...connectionStatus(\n MELHOR_ENVIO_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: (connection?.settings?.originPostalCode as string) ?? undefined,\n plane: 'request',\n ...settingsStatus(MELHOR_ENVIO_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n // This used to say the platform's redirect route writes `active = true`. It\n // does not, and says so itself: \"It does not touch `plg_connections` in the\n // tenant's pool. Per FAY-1388 ... the app writes its own.\" Bling shipped with\n // the same belief and looped — authorize, come back, still \"not connected\",\n // click again, forever.\n //\n // So the two halves are written by their owners: the platform files the\n // credential, and this runs on the way back to say the account is linked. No\n // values — the token is not ours to see, and nothing is configured yet.\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n ExtraPanel: MelhorEnvioExtraPanel,\n}\n","// AppMax as a unified ConnectorDefinition, surfaced in Loja → settings →\n// Integrações (rendered by the shared ConnectorsHub).\n//\n// The mirror image of Melhor Envio, and the reason `onFailure` is a field\n// instead of a habit: same plane, same budget mechanism, opposite verdict. A\n// carrier that does not answer must not stop a sale; a gateway that does not\n// answer must stop it, because an order that reads as confirmed without a\n// payment is worse than a refused checkout.\n//\n// It lives in plugin-shop rather than plugin-payments because plugin-payments\n// is provider-only — it ships no manifest and no admin surface — and because\n// the store's stack (who charges, who ships) is configured in the store's own\n// settings. commerce-stack.md §0: the admin is the control panel of the stack.\n//\n// No SQL. The connection is a plg_connections row (packages/db 029); a capture\n// is an effect claimed through plg_claim_effect (030). Opening a session is\n// neither — it is a quote by another name and files nothing.\nimport React, { useEffect, useState } from 'react'\nimport {\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\n\nexport const APPMAX_CONNECTOR_ID = 'appmax'\n\n/**\n * Six seconds. Longer than the freight budget on purpose: this one is spent\n * after the buyer pressed \"pagar\", where waiting is expected and a premature\n * refusal costs a sale that was about to happen. It is still a budget — beyond\n * it the buyer is told the payment did not go through, which is true, instead of\n * watching a spinner that resolves into a charge they already gave up on.\n */\nexport const APPMAX_LATENCY_BUDGET_MS = 6000\n\n/**\n * Which methods the storefront may offer — commercial policy, not a credential\n * and not an authorization.\n *\n * It used to be a `ConnectorField` labelled \"Formas de pagamento (pix, boleto,\n * credit_card)\": a free-text box on the connect screen, which asked a merchant\n * to decide what they accept before they were allowed to plug the gateway in,\n * and then made \"passei a aceitar boleto\" look like re-authorizing the account.\n * It is a multi-select over the three methods AppMax actually has, so the\n * misspelling that silently offered nothing is not expressible.\n *\n * Required to OPERATE and not to connect: a gateway with no method selected\n * cannot open a session, so the connection is made and reported as \"conectado,\n * falta configurar\" (`plg_connections.status = 'pending'`).\n */\nexport const APPMAX_SETTINGS: ConnectorSetting[] = [\n {\n key: 'methods',\n label: 'Formas de pagamento',\n description: 'O que o cliente pode escolher no checkout.',\n type: 'multi-select',\n options: [\n { value: 'pix', label: 'Pix' },\n { value: 'boleto', label: 'Boleto' },\n { value: 'credit_card', label: 'Cartão de crédito' },\n ],\n requiredToOperate: true,\n },\n]\n\nconst store = createConnectionStore(APPMAX_CONNECTOR_ID, {\n settings: APPMAX_SETTINGS,\n settingsKeys: ['maxInstallments', 'environment'],\n})\n\nconst METHOD_LABELS: Record<string, string> = { pix: 'Pix', boleto: 'Boleto', credit_card: 'Cartão' }\n\n/** The row's one-line summary. Tolerates the pre-split string a live row may still hold. */\nfunction methodsDetail(value: unknown): string | undefined {\n const list = Array.isArray(value) ? value : typeof value === 'string' ? value.split(',') : []\n const labels = list.map((v) => METHOD_LABELS[String(v).trim()] ?? String(v).trim()).filter(Boolean)\n return labels.length > 0 ? labels.join(', ') : undefined\n}\n\nfunction AppmaxExtraPanel() {\n const [connected, setConnected] = useState(false)\n const [loaded, setLoaded] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n void store\n .get()\n .then((c) => { if (!cancelled) setConnected(!!c?.active) })\n .catch(() => {})\n .finally(() => { if (!cancelled) setLoaded(true) })\n return () => { cancelled = true }\n }, [])\n\n if (!loaded || !connected) return null\n\n return (\n <div className=\"space-y-2 border-t pt-4 text-xs text-muted-foreground\">\n <p>\n Pix e boleto acontecem dentro da sua loja: o cliente vê o QR Code ou o código de barras sem sair\n da página. Cartão vai para a página segura da AppMax e volta com o resultado — assim nenhum\n número de cartão passa pelo seu site.\n </p>\n <p>\n O valor cobrado é sempre recalculado aqui no servidor a partir do pedido. Preço alterado no\n navegador não é aceito, e clicar duas vezes em \"pagar\" gera uma cobrança só.\n </p>\n </div>\n )\n}\n\nexport const appmaxConnectorDef: ConnectorDefinition = {\n id: APPMAX_CONNECTOR_ID,\n hostPluginId: 'shop',\n name: 'AppMax',\n description: 'Checkout de verdade: Pix, boleto e cartão parcelado, com o valor recalculado no servidor.',\n icon: 'CreditCard',\n category: 'payments',\n authKind: 'oauth',\n // The session is opened in the buyer's request path; the capture, the refund\n // and the webhook that reports them are outbound sync work.\n planes: ['request', 'sync'],\n direction: 'outbound',\n docsUrl: 'https://docs.appmax.com.br',\n // Grounded in the request plane's own code, not in an AppMax data plane —\n // there isn't one in this repo yet (see the header). `createCheckoutStarter`\n // recomputes the order total server-side before opening a session, which is a\n // read of the order and never a write of it; `createPaymentCapturer` files the\n // capture through the effect ledger, which is the write.\n permissions: [\n {\n kind: 'data',\n resource: 'order',\n actions: ['read'],\n reason:\n 'Ler o pedido para recalcular o valor no servidor antes de abrir a cobrança — o total nunca vem do navegador do cliente.',\n sensitive: true,\n },\n {\n kind: 'data',\n resource: 'payment',\n actions: ['write'],\n reason: 'Registrar aqui a cobrança aberta e a confirmação do pagamento. Dados do cartão não passam por este app.',\n sensitive: true,\n },\n ],\n latencyBudgetMs: APPMAX_LATENCY_BUDGET_MS,\n // The order does not confirm. FAY-1300.\n onFailure: 'block',\n /**\n * O lojista NÃO digita chave nenhuma — e essa é a correção.\n *\n * A tela pedia `client_id` e `client_secret` da AppMax, o que estava errado em\n * dois níveis. Primeiro porque é o par do APLICATIVO (nosso, um só para toda a\n * frota) que abre a instalação, e ele não pode passar pelo navegador de\n * lojista nenhum. Segundo porque o par da LOJA nem é mostrado ao lojista para\n * copiar: a AppMax o emite no fim da instalação e o entrega ao aplicativo.\n *\n * Foi exatamente por isso que o campo apareceu preenchido com um e-mail: não\n * havia o que colar ali, então colaram o que tinham.\n *\n * O caminho certo é o consentimento abaixo: o lojista autoriza a conta dele no\n * painel da AppMax e o par sai de lá para o cofre da plataforma sem nunca\n * passar por este pacote.\n */\n fields: [],\n /**\n * Um botão só: \"Conectar\" É o que abre o consentimento.\n *\n * Antes eram dois — um \"Abrir o painel da AppMax\" e um \"Conectar\" que apenas\n * marcava a linha. O segundo mentia: dizia conectado sem credencial atrás.\n *\n * E é consentimento de verdade, apesar do nome estranho na doc deles. O\n * círculo fecha: chamamos `/app/authorize` com o par do APLICATIVO e recebemos\n * um token; o lojista autoriza no painel da AppMax; a AppMax **devolve o\n * navegador dele** para o nosso callback com esse token na URL; e é o nosso\n * servidor que troca o token pelo par da LOJA em `/app/client/generate`.\n *\n * Ida, volta e troca no servidor — a mesma forma do Bling e do Melhor Envio.\n * Por isso passa pelo mesmo `fayzConnectorOAuth` e não por um link solto: o\n * par do aplicativo não pode sair do servidor, e o token que volta não vale\n * nada no navegador.\n */\n startOAuth: fayzConnectorOAuth(APPMAX_CONNECTOR_ID),\n settings: APPMAX_SETTINGS,\n // When the gateway is actually reached. Both are real calls, so both may be\n // stated plainly — see ConnectorPermissions for the events that may not.\n invokedAt: [\n {\n key: 'shop.checkout.session_open',\n label: 'O cliente finaliza a compra e a cobrança é aberta na AppMax (Pix, boleto ou cartão)',\n touches: ['order', 'payment'],\n },\n {\n key: 'shop.payment.capture',\n label: 'A AppMax avisa que o pagamento caiu e o pedido é liberado',\n plane: 'sync',\n trigger: 'webhook',\n touches: ['payment'],\n },\n ],\n // Read from the row the list already batched, so a screen with N connectors\n // costs one plg_connections request rather than N.\n ...connectionStatus(\n APPMAX_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: methodsDetail(connection?.settings?.methods),\n plane: 'request',\n ...settingsStatus(APPMAX_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n // Reached only AFTER the credential sink accepted the token — that ordering is\n // what makes `active = true` mean \"a credential was placed for this store\"\n // rather than \"somebody pressed a button\". The token itself never arrives\n // here: the hub splits it out before calling this.\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n ExtraPanel: AppmaxExtraPanel,\n}\n","// AbacatePay as a unified ConnectorDefinition, surfaced in Loja → settings →\n// Integrações (rendered by the shared ConnectorsHub).\n//\n// The second gateway, and the one that shows the shelf is not a special case:\n// it declares the same category, the same planes and the same `onFailure` as\n// AppMax, and differs only where the provider differs — how it authorizes.\n//\n// There is no consent screen and no app to install. AbacatePay issues API keys\n// in the merchant's own dashboard (Integrar → API Keys) and every call is\n// `Authorization: Bearer <key>`, so the connect step is a form with one box and\n// the key leaves for the platform vault instead of reaching this file.\n//\n// The same host serves dev and production — the KEY decides which. That is a\n// merchant-facing fact, not a base-URL switch, so it is said on the panel\n// rather than expressed as an `environment` setting nothing would honour.\n//\n// No SQL. The connection is a plg_connections row (packages/db 029); a capture\n// is an effect claimed through plg_claim_effect (030).\nimport React, { useEffect, useState } from 'react'\nimport {\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorField,\n type ConnectorSetting,\n} from '@fayz-ai/core'\n\nexport const ABACATEPAY_CONNECTOR_ID = 'abacatepay'\n\n/**\n * Six seconds, the same budget AppMax carries and for the same reason: it is\n * spent after the buyer pressed \"pagar\", where waiting is expected and a\n * premature refusal costs a sale that was about to happen.\n *\n * Measured, not guessed — `POST /v2/transparents/create` answered in 640–830ms\n * from São Paulo on the dev key, before credential redemption and the two\n * database round trips the checkout needs. The budget sits far above that so it\n * fires on a gateway that is actually down, never on a slow-but-alive one.\n */\nexport const ABACATEPAY_LATENCY_BUDGET_MS = 6000\n\n/**\n * The one thing that authorizes the connection.\n *\n * `type: 'password'` is what routes it to the platform's credential sink\n * (packages/admin/.../connect/credentials.ts) instead of to `saveConnection`;\n * `secret: true` states the same thing on the field itself, so the intent\n * survives a future change of input type. Either flag alone is enough — both\n * are here because a payment credential is the wrong place to be terse.\n *\n * The key is per-STORE and carries its own permissions and its own environment,\n * so nothing about it can be inferred, defaulted or shared across the fleet.\n */\nexport const ABACATEPAY_FIELDS: ConnectorField[] = [\n {\n key: 'apiKey',\n label: 'Chave de API',\n type: 'password',\n secret: true,\n placeholder: 'AbacatePay → Integrar → API Keys',\n },\n]\n\n/**\n * Which methods the storefront may offer — commercial policy, not a credential.\n *\n * The three the gateway really has, in AbacatePay's own vocabulary (uppercase),\n * because these values travel to it as `method` / `methods`: a translation\n * table between what the merchant picked and what the wire accepts is one more\n * place for a method to silently stop being offered.\n *\n * Required to OPERATE and not to connect: a gateway with no method selected\n * cannot open a charge, so the connection is made and reported as \"conectado,\n * falta configurar\" (`plg_connections.status = 'pending'`).\n */\nexport const ABACATEPAY_SETTINGS: ConnectorSetting[] = [\n {\n key: 'methods',\n label: 'Formas de pagamento',\n description: 'O que o cliente pode escolher no checkout.',\n type: 'multi-select',\n options: [\n { value: 'PIX', label: 'Pix' },\n { value: 'BOLETO', label: 'Boleto' },\n { value: 'CARD', label: 'Cartão de crédito' },\n ],\n requiredToOperate: true,\n },\n]\n\nconst store = createConnectionStore(ABACATEPAY_CONNECTOR_ID, {\n fields: ABACATEPAY_FIELDS,\n settings: ABACATEPAY_SETTINGS,\n})\n\nconst METHOD_LABELS: Record<string, string> = { PIX: 'Pix', BOLETO: 'Boleto', CARD: 'Cartão' }\n\n/** The row's one-line summary. Tolerates the pre-split string a live row may hold. */\nfunction methodsDetail(value: unknown): string | undefined {\n const list = Array.isArray(value) ? value : typeof value === 'string' ? value.split(',') : []\n const labels = list.map((v) => METHOD_LABELS[String(v).trim()] ?? String(v).trim()).filter(Boolean)\n return labels.length > 0 ? labels.join(', ') : undefined\n}\n\nfunction AbacatePayExtraPanel() {\n const [connected, setConnected] = useState(false)\n const [loaded, setLoaded] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n void store\n .get()\n .then((c) => { if (!cancelled) setConnected(!!c?.active) })\n .catch(() => {})\n .finally(() => { if (!cancelled) setLoaded(true) })\n return () => { cancelled = true }\n }, [])\n\n if (!loaded || !connected) return null\n\n return (\n <div className=\"space-y-2 border-t pt-4 text-xs text-muted-foreground\">\n <p>\n Pix e boleto acontecem dentro da sua loja: o cliente vê o QR Code ou a linha digitável sem sair\n da página. Cartão vai para a página segura da AbacatePay e volta com o resultado — assim nenhum\n número de cartão passa pelo seu site.\n </p>\n <p>\n Quem decide se a cobrança é de verdade é a chave. Uma chave de teste simula o pagamento e não\n movimenta dinheiro; a de produção cobra o cliente. É a mesma tela para as duas, então confira no\n painel da AbacatePay qual chave você colou aqui.\n </p>\n <p>\n O valor cobrado é sempre recalculado aqui no servidor a partir do pedido. Preço alterado no\n navegador não é aceito, e clicar duas vezes em \"pagar\" gera uma cobrança só.\n </p>\n </div>\n )\n}\n\nexport const abacatePayConnectorDef: ConnectorDefinition = {\n id: ABACATEPAY_CONNECTOR_ID,\n hostPluginId: 'shop',\n name: 'AbacatePay',\n description: 'Pix, boleto e cartão com uma chave só, sem contrato de adquirente e sem tirar o cliente da loja.',\n icon: 'CreditCard',\n category: 'payments',\n // One pasted key, no consent screen: AbacatePay has no OAuth and no app to\n // install, so inventing a `startOAuth` here would ship a button that could\n // never connect anything.\n authKind: 'api-key',\n // The charge is opened in the buyer's request path; the confirmation webhook\n // and the refund are outbound sync work.\n planes: ['request', 'sync'],\n direction: 'outbound',\n docsUrl: 'https://docs.abacatepay.com',\n // Where the key comes from. The connector declares the address because it is\n // a fact about THIS provider, and the doc names the path inside it\n // (Integrar → API Keys), which the field's placeholder repeats.\n providerInstall: { url: 'https://app.abacatepay.com' },\n // Grounded in what the request plane does, and padded with nothing: the total\n // is recomputed server-side from the order before the charge is opened, which\n // is a read of the order and never a write of it; the charge and its\n // confirmation are the write.\n permissions: [\n {\n kind: 'data',\n resource: 'order',\n actions: ['read'],\n reason:\n 'Ler o pedido para recalcular o valor no servidor antes de abrir a cobrança — o total nunca vem do navegador do cliente.',\n sensitive: true,\n },\n {\n kind: 'data',\n resource: 'payment',\n actions: ['write'],\n reason: 'Registrar aqui a cobrança aberta e a confirmação do pagamento. Dados do cartão não passam por este app.',\n sensitive: true,\n },\n ],\n latencyBudgetMs: ABACATEPAY_LATENCY_BUDGET_MS,\n // A gateway that does not answer must stop the sale: an order that reads as\n // confirmed without a payment is worse than a refused checkout. The opposite\n // verdict from the carrier next door, on purpose (FAY-1300/FAY-1301).\n onFailure: 'block',\n fields: ABACATEPAY_FIELDS,\n settings: ABACATEPAY_SETTINGS,\n // The two calls that exist. A refund endpoint exists too, but nothing in this\n // repo reaches it yet, and a declared moment that never arrives is a promise\n // the code cannot keep.\n invokedAt: [\n {\n key: 'shop.checkout.session_open',\n label: 'O cliente finaliza a compra e a cobrança é aberta na AbacatePay (Pix, boleto ou cartão)',\n touches: ['order', 'payment'],\n },\n {\n key: 'shop.payment.capture',\n label: 'A AbacatePay avisa que o pagamento caiu e o pedido é liberado',\n plane: 'sync',\n trigger: 'webhook',\n touches: ['payment'],\n },\n ],\n // Read from the row the list already batched, so a screen with N connectors\n // costs one plg_connections request rather than N.\n ...connectionStatus(\n ABACATEPAY_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: methodsDetail(connection?.settings?.methods),\n plane: 'request',\n ...settingsStatus(ABACATEPAY_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n // Reached only AFTER the credential sink accepted the key — that ordering is\n // what makes `active = true` mean \"a credential was placed for this store\"\n // rather than \"somebody pressed a button\". The key itself never arrives here:\n // the hub split it out before calling this, so `values` is empty.\n //\n // No `testConnection` either: the probe is handed the non-secret half, which\n // for this connector is nothing, and there is no useful call to make without\n // the key. Testing it belongs to the edge function that holds it.\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n ExtraPanel: AbacatePayExtraPanel,\n}\n","import React, { useEffect, useState } from 'react'\nimport {\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\n\nexport const STRIPE_CONNECT_CONNECTOR_ID = 'stripe-connect'\n\n/**\n * Six seconds, the same budget the other two gateways carry: it is spent after\n * the buyer pressed \"pagar\", where waiting is expected and a premature refusal\n * costs a sale that was about to happen.\n */\nexport const STRIPE_CONNECT_LATENCY_BUDGET_MS = 6000\n\n/**\n * Stripe's own vocabulary (lowercase), because these values travel to it as\n * `payment_method_types` — a translation table between what the merchant picked\n * and what the wire accepts is one more place for a method to silently stop\n * being offered.\n */\nexport const STRIPE_CONNECT_SETTINGS: ConnectorSetting[] = [\n {\n key: 'paymentMethods',\n label: 'Formas de pagamento',\n description: 'O que o cliente pode escolher no checkout.',\n type: 'multi-select',\n options: [\n { value: 'card', label: 'Cartão de crédito' },\n { value: 'pix', label: 'Pix' },\n { value: 'boleto', label: 'Boleto' },\n ],\n requiredToOperate: true,\n // Card is the one method every Stripe account can charge the moment it is\n // active; Pix and boleto in BR each need their own approval, so offering\n // them by default would promise a checkout option that may not settle.\n defaultValue: ['card'],\n },\n]\n\nconst store = createConnectionStore(STRIPE_CONNECT_CONNECTOR_ID, {\n settings: STRIPE_CONNECT_SETTINGS,\n})\n\nconst METHOD_LABELS: Record<string, string> = { card: 'Cartão', pix: 'Pix', boleto: 'Boleto' }\n\nfunction methodsDetail(value: unknown): string | undefined {\n const list = Array.isArray(value) ? value : []\n const labels = list.map((v) => METHOD_LABELS[String(v)] ?? String(v)).filter(Boolean)\n return labels.length > 0 ? labels.join(', ') : undefined\n}\n\nfunction StripeConnectExtraPanel() {\n const [connected, setConnected] = useState(false)\n const [loaded, setLoaded] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n void store\n .get()\n .then((c) => { if (!cancelled) setConnected(!!c?.active) })\n .catch(() => {})\n .finally(() => { if (!cancelled) setLoaded(true) })\n return () => { cancelled = true }\n }, [])\n\n if (!loaded) return null\n\n return (\n <div className=\"space-y-2 border-t pt-4 text-xs text-muted-foreground\">\n {connected ? (\n <>\n <p>\n A Stripe pede documentos e dados bancários antes de liberar cobranças. Se você fechou o\n cadastro no meio, a conexão fica de pé mas a loja ainda não cobra — clique em conectar de\n novo para voltar de onde parou, na mesma conta.\n </p>\n <p>\n O dinheiro cai na sua conta Stripe, não na Fayz. O que a Fayz retém é a taxa da\n plataforma, descontada na própria cobrança.\n </p>\n </>\n ) : (\n <p>\n Conectar abre o cadastro da Stripe numa aba. Você pode entrar com uma conta Stripe que já\n tenha ou criar uma na hora — em qualquer caso é sua, e é ela que recebe.\n </p>\n )}\n </div>\n )\n}\n\nexport const stripeConnectConnectorDef: ConnectorDefinition = {\n id: STRIPE_CONNECT_CONNECTOR_ID,\n // The catalogue has one Stripe row and this is not the Financeiro's `stripe`\n // connector, which is the tenant invoicing on their own account. Here Fayz is\n // the platform and the charge is opened on a connected account.\n catalogSlug: 'stripe',\n hostPluginId: 'shop',\n name: 'Stripe',\n description: 'Cartão, Pix e boleto pela Stripe. A loja recebe na conta dela e a Fayz retém a taxa na própria cobrança.',\n icon: 'CreditCard',\n category: 'payments',\n // Hosted onboarding rather than a pasted key: the merchant authorizes at\n // Stripe and nothing secret ever reaches this file.\n authKind: 'oauth',\n planes: ['request', 'sync'],\n direction: 'outbound',\n docsUrl: 'https://docs.stripe.com/connect',\n permissions: [\n {\n kind: 'data',\n resource: 'order',\n actions: ['read'],\n reason:\n 'Ler o pedido para recalcular o valor no servidor antes de abrir a cobrança — o total nunca vem do navegador do cliente.',\n sensitive: true,\n },\n {\n kind: 'data',\n resource: 'payment',\n actions: ['write'],\n reason: 'Registrar aqui a cobrança aberta e a confirmação do pagamento. Dados do cartão não passam por este app.',\n sensitive: true,\n },\n ],\n latencyBudgetMs: STRIPE_CONNECT_LATENCY_BUDGET_MS,\n // Same verdict as the other two gateways: an order that reads as confirmed\n // without a payment is worse than a refused checkout.\n onFailure: 'block',\n // OAuth-shaped: consent is the whole form, and no value is collected here.\n fields: [],\n settings: STRIPE_CONNECT_SETTINGS,\n invokedAt: [\n {\n key: 'shop.checkout.session_open',\n label: 'O cliente finaliza a compra e a cobrança é aberta na conta Stripe da loja',\n touches: ['order', 'payment'],\n },\n {\n key: 'shop.payment.capture',\n label: 'A Stripe avisa que o pagamento caiu e o pedido é liberado',\n plane: 'sync',\n trigger: 'webhook',\n touches: ['payment'],\n },\n ],\n ...connectionStatus(\n STRIPE_CONNECT_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: methodsDetail(connection?.settings?.paymentMethods),\n plane: 'request',\n ...settingsStatus(STRIPE_CONNECT_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n startOAuth: fayzConnectorOAuth(STRIPE_CONNECT_CONNECTOR_ID),\n // Reached with no values when the browser returns marked `connected`. It is\n // required even though nothing is collected here: the platform callback stores\n // the credential but deliberately never touches the pool, so this is the only\n // thing that writes the tenant's `plg_connections` row.\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: async () => { await store.disconnect() },\n ExtraPanel: StripeConnectExtraPanel,\n}\n","// Vindi as a unified ConnectorDefinition, surfaced in Loja → settings →\n// Integrações (rendered by the shared ConnectorsHub).\n//\n// The fourth gateway on the shelf, and the first whose provider name means two\n// different products. This connector is **Vindi Pagamentos** — the gateway, ex-\n// Yapay, `api.intermediador.yapay.com.br`. It is NOT Vindi Recorrência\n// (`app.vindi.com.br/api/v1`), which is subscriptions and invoices and\n// authenticates with HTTP Basic. Nothing here reaches that one.\n//\n// There is no consent screen, and that is a fact about Vindi rather than a\n// shortcut. Their `consumer_key` → CODE → `access_token` chain looks like OAuth\n// from a distance and is not: the authorize URL accepts only `consumer_key` —\n// no `redirect_uri`, no `state`, no scopes — and the instruction is literally to\n// open it in a browser and copy the CODE out of the address bar. That is the\n// account owner fetching their own credential, not a merchant authorizing a\n// platform, and our broker has nothing to sign or register against it. The path\n// that WOULD work is Vindi's Partner Accounts API, which provisions the\n// merchant's subaccount and hands the key straight to us — it needs a commercial\n// relationship with Vindi, and it is phase 2 (FAY-1416).\n//\n// Two hosts, unlike AbacatePay where one host serves both worlds and the key\n// decides. So the environment is a stored decision rather than something the\n// credential implies.\n//\n// No SQL. The connection is a plg_connections row (packages/db 029); a capture\n// is an effect claimed through plg_claim_effect (030).\nimport React, { useEffect, useState } from 'react'\nimport {\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorField,\n type ConnectorSetting,\n} from '@fayz-ai/core'\n\nexport const VINDI_CONNECTOR_ID = 'vindi'\n\n/**\n * Six seconds, the same budget the other three gateways carry: it is spent after\n * the buyer pressed \"pagar\", where waiting is expected and a premature refusal\n * costs a sale that was about to happen.\n *\n * Not measured against Vindi yet — no account exists to measure with. It is\n * copied from the two gateways that WERE measured (AbacatePay answered 640–830ms\n * from São Paulo) on the reading that a Brazilian gateway called from a Brazilian\n * pool sits in the same band. If a real sandbox says otherwise, this number moves\n * and this paragraph goes with it.\n */\nexport const VINDI_LATENCY_BUDGET_MS = 6000\n\n/**\n * The one thing that authorizes the connection.\n *\n * `type: 'password'` is what routes it to the platform's credential sink\n * (packages/admin/.../connect/credentials.ts) instead of to `saveConnection`;\n * `secret: true` states the same thing on the field itself, so the intent\n * survives a future change of input type.\n *\n * ── why there is no second field, and what it costs ─────────────────────────\n *\n * `token_account` opens a transaction and reads it back, which is the buyer's\n * whole path. It cannot CANCEL one: `PATCH /transactions/cancel` takes an\n * `access_token` and nothing else.\n *\n * Getting an access_token is not a matter of asking for one more secret. Vindi's\n * chain is consumer_key → **CODE** → access_token, the CODE is copied out of a\n * browser's address bar by the account owner \"uma vez por ambiente\", and the\n * resulting token lives 24 hours and has to be renewed daily against a refresh\n * token that would have to be written back somewhere. The platform refreshes\n * credentials for `oauth` connectors registered in its broker, and Vindi cannot\n * be one (see the file header). So the machinery does not exist, and asking a\n * merchant for a consumer pair we cannot turn into a token would be asking for a\n * secret in exchange for nothing.\n *\n * **The consequence, stated rather than hidden:** when a payment lands and the\n * order cannot be written, this connector does NOT give the money back by itself\n * — unlike the AbacatePay path, where *dinheiro recebido sem pedido tem um final\n * correto só*. `vindi-checkout-settle` marks the session failed and reports the\n * transaction id loudly; the merchant refunds in Vindi's own panel. Automatic\n * reversal is phase 2, and it arrives with the token lifecycle or not at all.\n */\nexport const VINDI_FIELDS: ConnectorField[] = [\n {\n key: 'tokenAccount',\n label: 'Token da conta',\n type: 'password',\n secret: true,\n placeholder: 'Vindi Pagamentos → Minha Conta → Token',\n },\n]\n\n/**\n * Which world the credential is valid against.\n *\n * Deliberately WITHOUT a `defaultValue`. Every other setting on this shelf can\n * afford a sensible default; this one decides whether a charge is real money or a\n * simulation, and a default here is a number nobody chose making that call. Until\n * the merchant answers, the connection reads \"conectado, falta configurar\" — which\n * is true, and is a state the column already has.\n *\n * A `select` and not a toggle: \"produção\" and \"não-sandbox\" are not the same\n * sentence to read at speed.\n */\nexport const VINDI_ENVIRONMENT_SETTING: ConnectorSetting = {\n key: 'environment',\n label: 'Ambiente',\n description: 'Sandbox simula o pagamento e não movimenta dinheiro. Produção cobra o cliente de verdade.',\n type: 'select',\n options: [\n { value: 'sandbox', label: 'Sandbox (teste)' },\n { value: 'production', label: 'Produção' },\n ],\n requiredToOperate: true,\n}\n\n/**\n * Which methods the storefront may offer — commercial policy, not a credential.\n *\n * The values are Vindi's own `payment_method_id`, as numbers-in-strings, because\n * that is what travels to it on the wire. A translation table between what the\n * merchant picked and what the API accepts is one more place for a method to\n * silently stop being offered.\n *\n * Credit card (`3`) is absent on purpose. Vindi's transparent card flow takes\n * `card_number` in the request body, which would put a PAN inside our edge\n * function — the same rule that already kept card off the AbacatePay path. Card\n * arrives through Vindi's hosted `url_payment` page, in phase 2, and offering it\n * here today would promise a checkout option nothing can open.\n */\nexport const VINDI_SETTINGS: ConnectorSetting[] = [\n VINDI_ENVIRONMENT_SETTING,\n {\n key: 'methods',\n label: 'Formas de pagamento',\n description: 'O que o cliente pode escolher no checkout.',\n type: 'multi-select',\n options: [\n { value: '27', label: 'Pix' },\n { value: '28', label: 'Bolepix (boleto com QR)' },\n { value: '6', label: 'Boleto' },\n ],\n requiredToOperate: true,\n },\n]\n\nconst store = createConnectionStore(VINDI_CONNECTOR_ID, {\n fields: VINDI_FIELDS,\n settings: VINDI_SETTINGS,\n})\n\nconst METHOD_LABELS: Record<string, string> = { '27': 'Pix', '28': 'Bolepix', '6': 'Boleto' }\nconst ENVIRONMENT_LABELS: Record<string, string> = { sandbox: 'Sandbox', production: 'Produção' }\n\n/**\n * The row's one-line summary — the environment first, because it is the one\n * mistake a merchant needs to catch from across the screen.\n */\nfunction connectionDetail(settings: Record<string, unknown> | undefined): string | undefined {\n const environment = ENVIRONMENT_LABELS[String(settings?.environment ?? '')]\n const raw = settings?.methods\n const list = Array.isArray(raw) ? raw : typeof raw === 'string' ? raw.split(',') : []\n const methods = list.map((v) => METHOD_LABELS[String(v).trim()] ?? String(v).trim()).filter(Boolean)\n\n const parts = [environment, methods.length > 0 ? methods.join(', ') : null].filter(Boolean)\n return parts.length > 0 ? parts.join(' · ') : undefined\n}\n\nfunction VindiExtraPanel() {\n const [connected, setConnected] = useState(false)\n const [loaded, setLoaded] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n void store\n .get()\n .then((c) => { if (!cancelled) setConnected(!!c?.active) })\n .catch(() => {})\n .finally(() => { if (!cancelled) setLoaded(true) })\n return () => { cancelled = true }\n }, [])\n\n if (!loaded) return null\n\n return (\n <div className=\"space-y-2 border-t pt-4 text-xs text-muted-foreground\">\n {connected ? (\n <>\n <p>\n Pix e boleto acontecem dentro da sua loja: o cliente vê o QR Code ou a linha digitável sem\n sair da página. Cartão ainda não — ele vai chegar pela página segura da Vindi, para que\n nenhum número de cartão passe pelo seu site.\n </p>\n <p>\n Sandbox e produção são contas diferentes, com tokens diferentes. Se você trocar o ambiente\n aqui, troque também as credenciais — as de teste não cobram em produção e as de produção\n não funcionam no sandbox.\n </p>\n <p>\n O valor cobrado é sempre recalculado aqui no servidor a partir do pedido. Preço alterado\n no navegador não é aceito, e clicar duas vezes em \"pagar\" gera uma cobrança só.\n </p>\n </>\n ) : (\n <p>\n O token da conta você pega no painel da Vindi Pagamentos, em Minha Conta. Confira se ele é o\n do mesmo ambiente que você vai escolher aqui — o token de sandbox não cobra em produção.\n </p>\n )}\n </div>\n )\n}\n\nexport const vindiConnectorDef: ConnectorDefinition = {\n id: VINDI_CONNECTOR_ID,\n hostPluginId: 'shop',\n name: 'Vindi',\n description: 'Pix e boleto pela Vindi. A loja recebe na conta dela, com o cliente pagando sem sair da página.',\n icon: 'CreditCard',\n // Declared rather than borrowed from the catalogue, because the catalogue row\n // is a change in another repo that has to be seeded before it exists anywhere:\n // until then `emit-connector-map` warns that `vindi` \"resolves to a slug the\n // platform catalogue does not carry\", and the shelf would render a grey plug.\n // The absolute URL on the assets bucket answers the same from any origin,\n // which a path would not — a tenant app is served from its own domain.\n logoUrl: 'https://assets.fayz.ai/connectors/vindi.png',\n category: 'payments',\n // Pasted keys, no consent screen: Vindi has no merchant-connect OAuth, so a\n // `startOAuth` here would ship a button that could never connect anything. See\n // the file header for why the flow that looks like OAuth is not one.\n authKind: 'api-key',\n // The charge is opened in the buyer's request path; the notification and the\n // refund are outbound sync work.\n planes: ['request', 'sync'],\n direction: 'outbound',\n docsUrl: 'https://developers.vindi.com.br/',\n // Where the token comes from. The consumer pair does NOT come from here — it\n // is requested from Vindi by form — which the fields' placeholders say.\n providerInstall: { url: 'https://app.vindi.com.br' },\n // Grounded in what the request plane does, and padded with nothing: the total\n // is recomputed server-side from the order before the charge is opened, which\n // is a read of the order and never a write of it; the charge and its\n // confirmation are the write.\n permissions: [\n {\n kind: 'data',\n resource: 'order',\n actions: ['read'],\n reason:\n 'Ler o pedido para recalcular o valor no servidor antes de abrir a cobrança — o total nunca vem do navegador do cliente.',\n sensitive: true,\n },\n {\n kind: 'data',\n resource: 'payment',\n actions: ['write'],\n reason: 'Registrar aqui a cobrança aberta e a confirmação do pagamento. Dados do cartão não passam por este app.',\n sensitive: true,\n },\n ],\n latencyBudgetMs: VINDI_LATENCY_BUDGET_MS,\n // A gateway that does not answer must stop the sale: an order that reads as\n // confirmed without a payment is worse than a refused checkout. Same verdict\n // as the other three gateways, opposite to the carrier next door.\n onFailure: 'block',\n fields: VINDI_FIELDS,\n settings: VINDI_SETTINGS,\n invokedAt: [\n {\n key: 'shop.checkout.session_open',\n label: 'O cliente finaliza a compra e a cobrança é aberta na Vindi (Pix ou boleto)',\n touches: ['order', 'payment'],\n },\n {\n key: 'shop.payment.capture',\n label: 'A Vindi avisa que o pagamento caiu, a cobrança é reconsultada e o pedido é liberado',\n plane: 'sync',\n trigger: 'webhook',\n touches: ['payment'],\n },\n ],\n // Read from the row the list already batched, so a screen with N connectors\n // costs one plg_connections request rather than N.\n ...connectionStatus(\n VINDI_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: connectionDetail(connection?.settings),\n plane: 'request',\n ...settingsStatus(VINDI_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n // Reached only AFTER the credential sink accepted the three keys — that\n // ordering is what makes `active = true` mean \"credentials were placed for\n // this store\" rather than \"somebody pressed a button\". They never arrive here:\n // the hub split them out before calling this, so `values` is empty.\n //\n // No `testConnection` either: the probe is handed the non-secret half, which\n // for this connector is nothing. Testing belongs to the edge function that\n // holds the credential.\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n ExtraPanel: VindiExtraPanel,\n}\n","import React from 'react'\nimport { Globe, MessageCircle, Camera, Music, ShoppingBag, MapPin, Link2, Plus, ExternalLink, Trash2, Check, X } from 'lucide-react'\nimport { Button, Input } from '@fayz-ai/ui'\nimport type { ShopProvider, SalesChannel, SalesChannelKind } from '@fayz-ai/shop'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport type { ShopProviderResolver } from './ShopPage'\n\n// ---------------------------------------------------------------------------\n// Canais de venda — the store's points of sale, Shopify-style. The online_store\n// channel points at the merchant's fayz storefront; the rest are external links\n// the merchant maintains (WhatsApp, Instagram, TikTok Shop…). Every enabled\n// channel with a URL also surfaces as an external link in the left menu (see\n// the \"Canais de venda\" nav group), so this page is where they are configured.\n// ---------------------------------------------------------------------------\n\ninterface KindMeta {\n label: string\n icon: React.ComponentType<{ className?: string }>\n hint: string\n placeholder: string\n}\n\nconst KIND_META: Record<SalesChannelKind, KindMeta> = {\n online_store: { label: 'Loja Online', icon: Globe, hint: 'Seu storefront fayz — a vitrine pública da loja.', placeholder: 'https://minhaloja.com.br/' },\n whatsapp: { label: 'WhatsApp', icon: MessageCircle, hint: 'Link direto para o WhatsApp Business.', placeholder: 'https://wa.me/5521999999999' },\n instagram: { label: 'Instagram', icon: Camera, hint: 'Perfil ou loja no Instagram.', placeholder: 'https://instagram.com/sualoja' },\n tiktok_shop: { label: 'TikTok Shop', icon: Music, hint: 'Sua vitrine no TikTok Shop.', placeholder: 'https://shop.tiktok.com/@sualoja' },\n marketplace: { label: 'Marketplace', icon: ShoppingBag, hint: 'Mercado Livre, Amazon, Shopee…', placeholder: 'https://…' },\n physical: { label: 'Loja Física', icon: MapPin, hint: 'Endereço ou ponto de venda físico.', placeholder: 'https://maps.google.com/…' },\n custom: { label: 'Outro canal', icon: Link2, hint: 'Qualquer outro ponto de venda com um link.', placeholder: 'https://…' },\n}\n\nconst ADDABLE_KINDS: SalesChannelKind[] = ['whatsapp', 'instagram', 'tiktok_shop', 'marketplace', 'physical', 'custom']\n\nfunction resolve(resolver?: ShopProviderResolver): ShopProvider {\n return typeof resolver === 'function' ? resolver() : resolver ?? getShopProvider()\n}\n\n// Let any runtime nav contributor (e.g. the app's ChannelsNav) refresh the\n// sidebar the moment channels change here, without coupling the two.\nfunction notifyChannelsChanged() {\n if (typeof window !== 'undefined') window.dispatchEvent(new Event('fayz:channels-changed'))\n}\n\nexport interface ChannelsPageProps {\n resolveProvider?: ShopProviderResolver\n}\n\nexport function ChannelsPage({ resolveProvider }: ChannelsPageProps) {\n const provider = React.useMemo(() => resolve(resolveProvider), [resolveProvider])\n const supported = typeof provider.listSalesChannels === 'function'\n\n const [channels, setChannels] = React.useState<SalesChannel[]>([])\n const [loading, setLoading] = React.useState(true)\n const [adding, setAdding] = React.useState<SalesChannelKind | null>(null)\n\n const reload = React.useCallback(async () => {\n if (!provider.listSalesChannels) { setLoading(false); return }\n setLoading(true)\n try {\n const rows = await provider.listSalesChannels()\n // Guarantee a Loja Online row exists so the storefront link is always\n // configurable — seed one on first visit if the store has none.\n if (!rows.some((c) => c.kind === 'online_store') && provider.createSalesChannel) {\n await provider.createSalesChannel({ kind: 'online_store', label: 'Loja Online', enabled: true, position: 0 })\n setChannels(await provider.listSalesChannels())\n } else {\n setChannels(rows)\n }\n } finally {\n setLoading(false)\n }\n }, [provider])\n\n React.useEffect(() => { void reload() }, [reload])\n\n const patch = async (id: string, input: Parameters<NonNullable<ShopProvider['updateSalesChannel']>>[1]) => {\n if (!provider.updateSalesChannel) return\n const updated = await provider.updateSalesChannel(id, input)\n setChannels((prev) => prev.map((c) => (c.id === id ? updated : c)))\n notifyChannelsChanged()\n }\n\n const remove = async (id: string) => {\n if (!provider.deleteSalesChannel) return\n await provider.deleteSalesChannel(id)\n setChannels((prev) => prev.filter((c) => c.id !== id))\n notifyChannelsChanged()\n }\n\n const add = async (kind: SalesChannelKind, label: string, url: string) => {\n if (!provider.createSalesChannel) return\n const created = await provider.createSalesChannel({ kind, label: label || KIND_META[kind].label, url: url || null, enabled: true, position: channels.length })\n setChannels((prev) => [...prev, created])\n setAdding(null)\n notifyChannelsChanged()\n }\n\n if (!supported) {\n return (\n <div className=\"mx-auto max-w-4xl p-6\">\n <h1 className=\"text-xl font-semibold text-foreground\">Canais de venda</h1>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n Este provedor de loja ainda não expõe canais de venda.\n </p>\n </div>\n )\n }\n\n const online = channels.find((c) => c.kind === 'online_store')\n const others = channels.filter((c) => c.kind !== 'online_store')\n\n return (\n <div className=\"mx-auto max-w-4xl p-6\">\n <div className=\"mb-6\">\n <h1 className=\"text-xl font-semibold text-foreground\">Canais de venda</h1>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n Onde sua loja vende. A Loja Online é o seu storefront fayz; os demais são links que aparecem no menu lateral.\n </p>\n </div>\n\n {loading ? (\n <p className=\"text-sm text-muted-foreground\">Carregando…</p>\n ) : (\n <div className=\"space-y-6\">\n {online && <OnlineStoreCard channel={online} onSave={(url) => patch(online.id, { url })} onToggle={(enabled) => patch(online.id, { enabled })} />}\n\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <h2 className=\"text-sm font-semibold text-foreground\">Outros canais</h2>\n </div>\n <div className=\"space-y-2\">\n {others.map((c) => (\n <ChannelRow key={c.id} channel={c} onSave={(url) => patch(c.id, { url })} onToggle={(enabled) => patch(c.id, { enabled })} onRemove={() => remove(c.id)} />\n ))}\n {others.length === 0 && (\n <p className=\"rounded-card border border-dashed border-border p-4 text-sm text-muted-foreground\">\n Nenhum canal adicional ainda. Adicione WhatsApp, Instagram, TikTok Shop e outros pontos de venda.\n </p>\n )}\n </div>\n\n {adding ? (\n <AddChannelForm kind={adding} onCancel={() => setAdding(null)} onAdd={(label, url) => add(adding, label, url)} onKind={setAdding} />\n ) : (\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {ADDABLE_KINDS.map((k) => {\n const Icon = KIND_META[k].icon\n return (\n <Button key={k} variant=\"outline\" size=\"sm\" onClick={() => setAdding(k)}>\n <Icon className=\"mr-1.5 h-3.5 w-3.5\" /> {KIND_META[k].label}\n </Button>\n )\n })}\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n )\n}\n\nfunction OnlineStoreCard({ channel, onSave, onToggle }: { channel: SalesChannel; onSave: (url: string | null) => void; onToggle: (enabled: boolean) => void }) {\n const [url, setUrl] = React.useState(channel.url ?? '')\n const dirty = (channel.url ?? '') !== url\n const meta = KIND_META.online_store\n return (\n <div className=\"rounded-card border border-border bg-card p-5\">\n <div className=\"flex items-start gap-3\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-primary/10\">\n <meta.icon className=\"h-5 w-5 text-primary\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-semibold text-foreground\">Loja Online</span>\n <span className={`rounded-full px-2 py-0.5 text-xs font-medium ${channel.enabled ? 'bg-emerald-100 text-emerald-800' : 'bg-muted text-muted-foreground'}`}>\n {channel.enabled ? 'Ativa' : 'Inativa'}\n </span>\n </div>\n <p className=\"mt-0.5 text-sm text-muted-foreground\">{meta.hint}</p>\n\n <div className=\"mt-3 flex flex-col gap-2 sm:flex-row sm:items-center\">\n <Input value={url} placeholder={meta.placeholder} onChange={(e) => setUrl(e.target.value)} className=\"flex-1\" />\n <div className=\"flex gap-2\">\n <Button size=\"sm\" disabled={!dirty} onClick={() => onSave(url.trim() || null)}>Salvar</Button>\n <Button size=\"sm\" variant=\"outline\" disabled={!channel.url} onClick={() => channel.url && window.open(channel.url, '_blank', 'noopener,noreferrer')}>\n <ExternalLink className=\"mr-1.5 h-3.5 w-3.5\" /> Ver loja\n </Button>\n </div>\n </div>\n <div className=\"mt-3\">\n <button type=\"button\" onClick={() => onToggle(!channel.enabled)} className=\"text-xs font-medium text-muted-foreground hover:text-foreground\">\n {channel.enabled ? 'Desativar canal' : 'Ativar canal'}\n </button>\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nfunction ChannelRow({ channel, onSave, onToggle, onRemove }: { channel: SalesChannel; onSave: (url: string | null) => void; onToggle: (enabled: boolean) => void; onRemove: () => void }) {\n const [url, setUrl] = React.useState(channel.url ?? '')\n const [editing, setEditing] = React.useState(false)\n const meta = KIND_META[channel.kind] ?? KIND_META.custom\n const Icon = meta.icon\n return (\n <div className=\"rounded-card border border-border bg-card p-3\">\n <div className=\"flex items-center gap-3\">\n <div className={`flex h-9 w-9 shrink-0 items-center justify-center rounded-full ${channel.enabled ? 'bg-primary/10' : 'bg-muted'}`}>\n <Icon className={`h-4 w-4 ${channel.enabled ? 'text-primary' : 'text-muted-foreground'}`} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-foreground\">{channel.label}</p>\n {editing ? (\n <Input value={url} placeholder={meta.placeholder} onChange={(e) => setUrl(e.target.value)} className=\"mt-1 h-8\" />\n ) : (\n <p className=\"truncate text-xs text-muted-foreground\">{channel.url || 'Sem link configurado'}</p>\n )}\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {editing ? (\n <>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => { onSave(url.trim() || null); setEditing(false) }}><Check className=\"h-4 w-4\" /></Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => { setUrl(channel.url ?? ''); setEditing(false) }}><X className=\"h-4 w-4\" /></Button>\n </>\n ) : (\n <>\n {channel.url && (\n <Button size=\"sm\" variant=\"ghost\" onClick={() => window.open(channel.url!, '_blank', 'noopener,noreferrer')}><ExternalLink className=\"h-4 w-4\" /></Button>\n )}\n <button type=\"button\" onClick={() => onToggle(!channel.enabled)} title={channel.enabled ? 'Desativar' : 'Ativar'} className={`rounded-full px-2 py-0.5 text-xs font-medium ${channel.enabled ? 'bg-emerald-100 text-emerald-800' : 'bg-muted text-muted-foreground'}`}>\n {channel.enabled ? 'Ativo' : 'Inativo'}\n </button>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => setEditing(true)}>Editar</Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={onRemove}><Trash2 className=\"h-4 w-4 text-red-500\" /></Button>\n </>\n )}\n </div>\n </div>\n </div>\n )\n}\n\nfunction AddChannelForm({ kind, onKind, onCancel, onAdd }: { kind: SalesChannelKind; onKind: (k: SalesChannelKind) => void; onCancel: () => void; onAdd: (label: string, url: string) => void }) {\n const meta = KIND_META[kind]\n const [label, setLabel] = React.useState(meta.label)\n const [url, setUrl] = React.useState('')\n React.useEffect(() => { setLabel(KIND_META[kind].label) }, [kind])\n return (\n <div className=\"mt-3 rounded-card border border-border bg-card p-4\">\n <div className=\"mb-3 flex flex-wrap gap-2\">\n {ADDABLE_KINDS.map((k) => {\n const Icon = KIND_META[k].icon\n return (\n <button key={k} type=\"button\" onClick={() => onKind(k)} className={`flex items-center gap-1.5 rounded-full px-3 py-1 text-xs font-medium ${k === kind ? 'bg-primary text-primary-foreground' : 'bg-muted text-muted-foreground hover:text-foreground'}`}>\n <Icon className=\"h-3.5 w-3.5\" /> {KIND_META[k].label}\n </button>\n )\n })}\n </div>\n <p className=\"mb-2 text-xs text-muted-foreground\">{meta.hint}</p>\n <div className=\"flex flex-col gap-2 sm:flex-row\">\n <Input value={label} placeholder=\"Nome do canal\" onChange={(e) => setLabel(e.target.value)} className=\"sm:w-48\" />\n <Input value={url} placeholder={meta.placeholder} onChange={(e) => setUrl(e.target.value)} className=\"flex-1\" />\n </div>\n <div className=\"mt-3 flex gap-2\">\n <Button size=\"sm\" onClick={() => onAdd(label, url)}><Plus className=\"mr-1.5 h-3.5 w-3.5\" /> Adicionar</Button>\n <Button size=\"sm\" variant=\"outline\" onClick={onCancel}>Cancelar</Button>\n </div>\n </div>\n )\n}\n","import type { MediaFile } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Os dois endereços que a biblioteca de conteúdo precisa saber montar: para\n// onde uma foto leva, e por onde ela desce. Fora do componente porque é o que\n// realmente pode quebrar sem ninguém ver — uma rota que mudou de forma, um\n// arquivo que abre em vez de baixar.\n// ---------------------------------------------------------------------------\n\n/** A tela onde a foto é gerenciada — a aba de fotos do produto, não a lista. */\nexport function recordRoute(reference: NonNullable<MediaFile['reference']>): string {\n return `#/products/${reference.id}/images`\n}\n\n/**\n * O endereço que baixa o arquivo em vez de abri-lo.\n *\n * O storage devolve o arquivo como anexo quando pedimos; o atributo `download`\n * do link sozinho é ignorado quando o arquivo vem de outro domínio — que é o\n * caso de toda foto da loja.\n */\nexport function downloadUrlOf(file: MediaFile): string {\n if (!/^https?:/i.test(file.url)) return file.url\n const separator = file.url.includes('?') ? '&' : '?'\n return `${file.url}${separator}download=${encodeURIComponent(file.name)}`\n}\n","import React from 'react'\nimport {\n ChevronLeft, ChevronRight, Download, Film, FileText, ImageOff,\n Package, RefreshCw, Sparkles, Trash2, Upload,\n} from 'lucide-react'\nimport { Button, Card, ConfirmDialog, Hint, PageHeader, PageHeaderActions, PageTabs, toast } from '@fayz-ai/ui'\nimport type { MediaFile, ShopProvider } from '@fayz-ai/shop'\nimport { getShopProvider, productImageToMediaFile } from '@fayz-ai/shop'\nimport { downloadUrlOf, recordRoute } from './media-links'\nimport type { ShopProviderResolver } from './ShopPage'\n\n// ---------------------------------------------------------------------------\n// Conteúdo — a biblioteca de arquivos da loja.\n//\n// Não é um depósito: é onde o lojista olha as fotos do catálogo todas juntas e\n// vê quais estão ruins. Por isso cada arquivo mostra a que registro pertence e\n// leva até ele — uma parede de miniaturas anônimas mostra o problema e não dá\n// para onde ir —, e por isso abrir uma foto acontece AQUI, com voltar, baixar e\n// trocar à mão: quem veio revisar o catálogo revisa dezenas, e cada ida a outra\n// aba é uma volta que ele não faz.\n//\n// Uma foto de produto é uma linha em plg_shop_product_images (é o provider que\n// junta as duas fontes); o que o lojista sobe aqui não pertence a nada e fica na\n// biblioteca.\n// ---------------------------------------------------------------------------\n\ntype MediaTab = 'all' | 'image' | 'video'\n\nconst TABS: { value: MediaTab; label: string }[] = [\n { value: 'all', label: 'Todos' },\n { value: 'image', label: 'Imagens' },\n { value: 'video', label: 'Vídeos' },\n]\n\n/** Abaixo disso a foto estoura no zoom do storefront e no retina de um celular. */\nconst LOW_RESOLUTION_PX = 800\n\nfunction resolve(resolver?: ShopProviderResolver): ShopProvider {\n return typeof resolver === 'function' ? resolver() : resolver ?? getShopProvider()\n}\n\nfunction formatSize(bytes: number): string {\n if (!bytes) return ''\n const units = ['B', 'KB', 'MB', 'GB']\n const i = Math.min(Math.floor(Math.log(bytes) / Math.log(1024)), units.length - 1)\n return `${(bytes / 1024 ** i).toFixed(i === 0 ? 0 : 1)} ${units[i]}`\n}\n\ninterface Dimensions { width: number; height: number }\n\nexport interface ContentPageProps {\n resolveProvider?: ShopProviderResolver\n}\n\nexport function ContentPage({ resolveProvider }: ContentPageProps) {\n const provider = React.useMemo(() => resolve(resolveProvider), [resolveProvider])\n const supported = typeof provider.listMediaFiles === 'function'\n\n const [files, setFiles] = React.useState<MediaFile[] | null>(null)\n const [tab, setTab] = React.useState<MediaTab>('all')\n const [uploading, setUploading] = React.useState(false)\n const [pendingDelete, setPendingDelete] = React.useState<MediaFile | null>(null)\n const [deleting, setDeleting] = React.useState(false)\n const [replacing, setReplacing] = React.useState(false)\n // A foto aberta é guardada por id, não por objeto: a lista recarrega a cada\n // troca e um objeto guardado ficaria mostrando o arquivo antigo.\n const [openId, setOpenId] = React.useState<string | null>(null)\n // Medidas do arquivo real, lidas do <img> depois que ele carrega: o tamanho em\n // bytes não diz se a foto está pequena, e é isso que o lojista veio ver.\n const [dimensions, setDimensions] = React.useState<Record<string, Dimensions>>({})\n\n const reload = React.useCallback(async () => {\n if (!provider.listMediaFiles) { setFiles([]); return }\n try {\n setFiles(await provider.listMediaFiles())\n } catch (err) {\n console.warn('[content] failed to list media', err)\n setFiles([])\n }\n }, [provider])\n\n React.useEffect(() => { void reload() }, [reload])\n\n const measure = React.useCallback((id: string, d: Dimensions) => {\n setDimensions((prev) => prev[id] ? prev : { ...prev, [id]: d })\n }, [])\n\n const handleUpload = async (picked: FileList | null) => {\n if (!picked?.length || !provider.uploadMediaFile) return\n setUploading(true)\n try {\n // Sequential, not Promise.all: a merchant dropping twenty photos on a\n // café connection should not open twenty parallel uploads that all\n // time out together.\n for (const file of Array.from(picked)) {\n await provider.uploadMediaFile(file)\n }\n toast.success(picked.length === 1 ? 'Arquivo enviado' : `${picked.length} arquivos enviados`)\n await reload()\n } catch (err) {\n console.warn('[content] upload failed', err)\n toast.error('Não foi possível enviar o arquivo')\n } finally {\n setUploading(false)\n }\n }\n\n const handleReplace = async (file: MediaFile, picked: File) => {\n setReplacing(true)\n try {\n let nextId: string\n if (file.reference) {\n if (!provider.replaceProductImage) throw new Error('unsupported')\n const image = await provider.replaceProductImage(file.reference.attachmentId, picked)\n // A troca escreve um arquivo novo, então a identidade muda — reabrir a\n // foto pelo id antigo cairia numa tela em branco.\n nextId = productImageToMediaFile(image, file.reference.label).id\n } else {\n if (!provider.uploadMediaFile) throw new Error('unsupported')\n // Sobe primeiro, apaga depois: se a subida falhar, o lojista continua\n // com o arquivo que tinha.\n const uploaded = await provider.uploadMediaFile(picked)\n if (provider.deleteMediaFile) await provider.deleteMediaFile(file.id)\n nextId = uploaded.id\n }\n await reload()\n setOpenId(nextId)\n toast.success('Arquivo trocado')\n } catch (err) {\n console.warn('[content] replace failed', err)\n toast.error('Não foi possível trocar o arquivo')\n } finally {\n setReplacing(false)\n }\n }\n\n const confirmDelete = async () => {\n const file = pendingDelete\n if (!file) return\n setDeleting(true)\n try {\n // Uma foto de produto se apaga desanexando: a linha é o que a torna a foto\n // daquele produto, e é o provider que leva o arquivo junto. Um arquivo da\n // biblioteca não tem linha nenhuma — só o objeto.\n if (file.reference) {\n await provider.deleteProductImage(file.reference.attachmentId)\n } else if (provider.deleteMediaFile) {\n await provider.deleteMediaFile(file.id)\n }\n setFiles((prev) => prev?.filter((f) => f.id !== file.id) ?? null)\n setPendingDelete(null)\n if (openId === file.id) setOpenId(null)\n } catch (err) {\n console.warn('[content] delete failed', err)\n toast.error('Não foi possível excluir o arquivo')\n } finally {\n setDeleting(false)\n }\n }\n\n const visible = (files ?? []).filter((f) => tab === 'all' || f.kind === tab)\n const openIndex = visible.findIndex((f) => f.id === openId)\n const open = openIndex >= 0 ? visible[openIndex]! : null\n\n const canDelete = (file: MediaFile) => Boolean(file.reference) || typeof provider.deleteMediaFile === 'function'\n const canReplace = (file: MediaFile) => file.reference\n ? typeof provider.replaceProductImage === 'function'\n : typeof provider.uploadMediaFile === 'function'\n\n // A foto aberta ocupa a página inteira: a grade atrás dela seria só ruído, e\n // voltar é um clique (ou Esc).\n if (open) {\n return (\n <>\n <MediaDetail\n file={open}\n dimensions={dimensions[open.id]}\n onMeasured={(d) => measure(open.id, d)}\n position={{ index: openIndex, total: visible.length }}\n onNavigate={(delta) => setOpenId(visible[openIndex + delta]?.id ?? open.id)}\n onBack={() => setOpenId(null)}\n onReplace={canReplace(open) ? (picked) => void handleReplace(open, picked) : undefined}\n onDelete={canDelete(open) ? () => setPendingDelete(open) : undefined}\n replacing={replacing}\n />\n <DeleteConfirm\n file={pendingDelete}\n loading={deleting}\n onConfirm={() => void confirmDelete()}\n onCancel={() => setPendingDelete(null)}\n />\n </>\n )\n }\n\n const attached = visible.filter((f) => f.reference)\n const loose = visible.filter((f) => !f.reference)\n const productCount = (files ?? []).filter((f) => f.reference).length\n const caption = files === null\n ? ''\n : [\n `${files.length} ${files.length === 1 ? 'arquivo' : 'arquivos'}`,\n productCount > 0\n ? `${productCount} ${productCount === 1 ? 'de produto' : 'de produtos'}`\n : '',\n ].filter(Boolean).join(' · ')\n\n const renderGrid = (list: MediaFile[]) => (\n <div className=\"fz-cards gap-4\">\n {list.map((file) => (\n <MediaCard\n key={file.id}\n file={file}\n dimensions={dimensions[file.id]}\n onMeasured={(d) => measure(file.id, d)}\n onOpen={() => setOpenId(file.id)}\n onDelete={canDelete(file) ? () => setPendingDelete(file) : undefined}\n />\n ))}\n </div>\n )\n\n return (\n <div className=\"space-y-6\">\n {/* No <h1>: the shell's top bar already names the page — and now it also\n carries the upload, like every other page's primary action. The tabs\n are the page's own band (PageTabs), the same strip every list draws,\n not a row of links floating on the content. The file count rides with\n them instead of under a duplicated heading. */}\n {supported && provider.uploadMediaFile && (\n <PageHeaderActions>\n <UploadButton uploading={uploading} onPick={handleUpload} />\n </PageHeaderActions>\n )}\n <PageTabs\n className=\"mb-0\"\n tabs={TABS}\n value={tab}\n onChange={setTab}\n aria-label=\"Arquivos\"\n actions={caption ? <span className=\"text-sm text-muted-foreground\">{caption}</span> : undefined}\n />\n\n {!supported ? (\n <Card className=\"p-12 text-center\">\n <ImageOff className=\"mx-auto h-8 w-8 text-muted-foreground\" />\n <p className=\"mt-3 font-medium\">Armazenamento não configurado</p>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n A biblioteca de arquivos precisa do storage da loja, que não está disponível neste modo.\n </p>\n </Card>\n ) : files === null ? (\n <div className=\"fz-cards gap-4\">\n {Array.from({ length: 5 }).map((_, i) => (\n <Card key={i} className=\"p-3\">\n <div className=\"aspect-square animate-pulse rounded-md bg-muted\" />\n <div className=\"mt-2 h-3.5 w-2/3 animate-pulse rounded bg-muted\" />\n </Card>\n ))}\n </div>\n ) : visible.length === 0 ? (\n <Card className=\"p-12 text-center\">\n <ImageOff className=\"mx-auto h-8 w-8 text-muted-foreground\" />\n <p className=\"mt-3 font-medium\">Nenhum arquivo ainda</p>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n As fotos dos seus produtos e o que você enviar aqui aparecem nesta biblioteca.\n </p>\n </Card>\n ) : attached.length && loose.length ? (\n // Só separa quando há os dois: um título sozinho em cima de tudo é\n // barulho, e a etiqueta em cada cartão já diz de quem é a foto.\n <div className=\"space-y-8\">\n <section className=\"space-y-3\">\n <SectionTitle title=\"Fotos de produtos\" count={attached.length} />\n {renderGrid(attached)}\n </section>\n <section className=\"space-y-3\">\n <SectionTitle title=\"Biblioteca\" count={loose.length} />\n {renderGrid(loose)}\n </section>\n </div>\n ) : (\n renderGrid(visible)\n )}\n\n <DeleteConfirm\n file={pendingDelete}\n loading={deleting}\n onConfirm={() => void confirmDelete()}\n onCancel={() => setPendingDelete(null)}\n />\n </div>\n )\n}\n\nfunction DeleteConfirm({ file, loading, onConfirm, onCancel }: {\n file: MediaFile | null\n loading: boolean\n onConfirm: () => void\n onCancel: () => void\n}) {\n return (\n <ConfirmDialog\n open={file !== null}\n loading={loading}\n variant=\"destructive\"\n title={file?.reference ? 'Excluir a foto do produto?' : 'Excluir arquivo?'}\n description={file?.reference\n ? `A foto sai de \"${file.reference.label}\" e da loja imediatamente.`\n : 'O arquivo sai da biblioteca. Se ele estiver em uso em algum lugar, o endereço para de funcionar.'}\n confirmLabel=\"Excluir\"\n cancelLabel=\"Cancelar\"\n onConfirm={onConfirm}\n onCancel={onCancel}\n />\n )\n}\n\nfunction SectionTitle({ title, count }: { title: string; count: number }) {\n return (\n <h2 className=\"text-sm font-semibold\">\n {title} <span className=\"font-normal text-muted-foreground\">({count})</span>\n </h2>\n )\n}\n\nfunction UploadButton({ uploading, onPick }: {\n uploading: boolean\n onPick: (files: FileList | null) => Promise<void>\n}) {\n const inputRef = React.useRef<HTMLInputElement>(null)\n return (\n <>\n <input\n ref={inputRef}\n type=\"file\"\n multiple\n className=\"hidden\"\n onChange={(e) => {\n void onPick(e.target.files).finally(() => {\n if (inputRef.current) inputRef.current.value = ''\n })\n }}\n />\n <Button onClick={() => inputRef.current?.click()} disabled={uploading}>\n <Upload className=\"mr-2 h-4 w-4\" />\n {uploading ? 'Enviando…' : 'Enviar arquivos'}\n </Button>\n </>\n )\n}\n\n/** O ícone que representa um arquivo que não é imagem. */\nfunction KindIcon({ kind, className }: { kind: MediaFile['kind']; className: string }) {\n const Icon = kind === 'video' ? Film : FileText\n return <Icon className={className} />\n}\n\nfunction MediaCard({ file, dimensions, onMeasured, onOpen, onDelete }: {\n file: MediaFile\n dimensions?: Dimensions\n onMeasured: (d: Dimensions) => void\n onOpen: () => void\n onDelete?: () => void\n}) {\n return (\n <Card className=\"group relative overflow-hidden p-3\">\n <button\n type=\"button\"\n onClick={onOpen}\n aria-label={`Abrir ${file.name}`}\n className=\"relative flex aspect-square w-full items-center justify-center overflow-hidden rounded-md bg-muted\"\n >\n {file.kind === 'image' ? (\n <img\n src={file.url}\n alt={file.name}\n loading=\"lazy\"\n className=\"h-full w-full object-contain\"\n onLoad={(e) => {\n const img = e.currentTarget\n if (img.naturalWidth) onMeasured({ width: img.naturalWidth, height: img.naturalHeight })\n }}\n />\n ) : (\n <KindIcon kind={file.kind} className=\"h-8 w-8 text-muted-foreground\" />\n )}\n {file.reference?.isCover && (\n <span className=\"absolute left-1.5 top-1.5 rounded-full bg-primary px-2 py-0.5 text-[11px] font-bold text-primary-foreground\">\n Capa\n </span>\n )}\n </button>\n\n {onDelete && (\n <Hint label=\"Excluir\">\n <button\n type=\"button\"\n aria-label=\"Excluir\"\n onClick={onDelete}\n className=\"absolute right-4 top-4 rounded-md bg-card/90 p-1.5 text-muted-foreground opacity-0 shadow-button transition-opacity hover:text-destructive group-hover:opacity-100\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </Hint>\n )}\n\n <p className=\"mt-2 truncate text-[13px] font-medium\" title={file.name}>{file.name}</p>\n <p className=\"text-[11px] text-muted-foreground\">\n <FileMeta file={file} dimensions={dimensions} />\n </p>\n\n {isLowResolution(file, dimensions) && (\n <p className=\"mt-1 text-[11px] font-medium text-warning\">Baixa resolução</p>\n )}\n\n {file.reference ? (\n <RecordLink reference={file.reference} className=\"mt-1.5 text-[11px]\" />\n ) : (\n <p className=\"mt-1.5 text-[11px] text-muted-foreground\">Biblioteca</p>\n )}\n </Card>\n )\n}\n\n/**\n * A foto aberta, dentro de /content.\n *\n * Abrir numa aba nova mostrava o arquivo e mais nada — nem de quem é, nem como\n * trocar. Aqui a revisão inteira acontece no mesmo lugar: olhar, baixar, trocar,\n * ir para a próxima.\n */\nfunction MediaDetail({\n file, dimensions, onMeasured, position, onNavigate, onBack, onReplace, onDelete, replacing,\n}: {\n file: MediaFile\n dimensions?: Dimensions\n onMeasured: (d: Dimensions) => void\n position: { index: number; total: number }\n onNavigate: (delta: number) => void\n onBack: () => void\n onReplace?: (picked: File) => void\n onDelete?: () => void\n replacing: boolean\n}) {\n const replaceRef = React.useRef<HTMLInputElement>(null)\n\n // As setas andam pelo conjunto que está na tela: revisar trinta fotos é uma\n // tarefa de teclado. O Escape não está aqui — o PageHeader já o liga ao\n // mesmo \"voltar\" que desenha na barra.\n React.useEffect(() => {\n function onKey(e: KeyboardEvent) {\n if (e.key === 'ArrowLeft') onNavigate(-1)\n if (e.key === 'ArrowRight') onNavigate(1)\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [onNavigate])\n\n return (\n <div className=\"space-y-4\">\n {/* A seta mora na barra da shell, como em toda tela de detalhe do app:\n \"← Conteúdo / foto.jpg\". Desenhá-la aqui dentro seria o segundo\n cabeçalho que o PageHeader existe para não deixar acontecer. */}\n <PageHeader title={file.name} parentLabel=\"Conteúdo\" onBack={onBack} />\n\n {position.total > 1 && (\n <div className=\"flex items-center justify-end gap-3\">\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <button\n type=\"button\"\n aria-label=\"Arquivo anterior\"\n disabled={position.index === 0}\n onClick={() => onNavigate(-1)}\n className=\"rounded-md border p-1 transition hover:bg-muted disabled:opacity-40\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n <span className=\"px-1 tabular-nums\">{position.index + 1} de {position.total}</span>\n <button\n type=\"button\"\n aria-label=\"Próximo arquivo\"\n disabled={position.index === position.total - 1}\n onClick={() => onNavigate(1)}\n className=\"rounded-md border p-1 transition hover:bg-muted disabled:opacity-40\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n )}\n\n <div className=\"fz-split\">\n <Card className=\"flex min-h-[320px] items-center justify-center overflow-hidden bg-muted p-2\">\n {file.kind === 'image' ? (\n <img\n key={file.url}\n src={file.url}\n alt={file.name}\n className=\"max-h-[70vh] w-auto max-w-full object-contain\"\n onLoad={(e) => {\n const img = e.currentTarget\n if (img.naturalWidth) onMeasured({ width: img.naturalWidth, height: img.naturalHeight })\n }}\n />\n ) : (\n <div className=\"flex flex-col items-center gap-2 p-12 text-muted-foreground\">\n <KindIcon kind={file.kind} className=\"h-10 w-10\" />\n <span className=\"text-sm\">Pré-visualização não disponível</span>\n </div>\n )}\n </Card>\n\n <Card className=\"space-y-4 p-4\">\n <div>\n <p className=\"break-words font-medium\" title={file.name}>{file.name}</p>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n <FileMeta file={file} dimensions={dimensions} />\n </p>\n {isLowResolution(file, dimensions) && (\n <p className=\"mt-2 rounded-md bg-warning/10 px-2 py-1.5 text-xs font-medium text-warning\">\n Baixa resolução — no zoom da loja essa foto fica borrada. Troque por uma\n de pelo menos {LOW_RESOLUTION_PX}px no lado maior.\n </p>\n )}\n </div>\n\n <div>\n <p className=\"text-[11px] uppercase tracking-wide text-muted-foreground\">Onde é usada</p>\n {file.reference ? (\n <RecordLink reference={file.reference} className=\"mt-1 text-sm\" />\n ) : (\n <p className=\"mt-1 text-sm text-muted-foreground\">\n Biblioteca — este arquivo não está preso a nenhum registro.\n </p>\n )}\n {file.reference?.isCover && (\n <p className=\"mt-1 text-xs text-muted-foreground\">\n É a capa: é ela que aparece no catálogo, no carrinho e no pedido.\n </p>\n )}\n </div>\n\n <div className=\"space-y-2\">\n {/* Desligado de propósito, e visível: o lugar onde a IA vai limpar\n fundo e subir resolução é aqui, e quem está olhando uma foto\n ruim é exatamente quem precisa saber que isso está vindo. */}\n <Button disabled className=\"w-full\" title=\"Em breve\">\n <Sparkles className=\"mr-2 h-4 w-4\" />\n Melhorar com IA\n </Button>\n\n <Button asChild variant=\"outline\" className=\"w-full\">\n <a href={downloadUrlOf(file)} download={file.name}>\n <Download className=\"mr-2 h-4 w-4\" />\n Baixar\n </a>\n </Button>\n\n {onReplace && (\n <>\n <input\n ref={replaceRef}\n type=\"file\"\n accept={file.kind === 'image' ? 'image/*' : undefined}\n className=\"hidden\"\n onChange={(e) => {\n const picked = e.target.files?.[0]\n e.target.value = ''\n if (picked) onReplace(picked)\n }}\n />\n <Button\n variant=\"outline\"\n className=\"w-full\"\n disabled={replacing}\n onClick={() => replaceRef.current?.click()}\n >\n <RefreshCw className={`mr-2 h-4 w-4 ${replacing ? 'animate-spin' : ''}`} />\n {replacing ? 'Trocando…' : 'Trocar arquivo'}\n </Button>\n {file.reference && (\n <p className=\"text-[11px] text-muted-foreground\">\n A troca mantém a posição da foto na galeria do produto.\n </p>\n )}\n </>\n )}\n\n {onDelete && (\n <Button variant=\"ghost\" className=\"w-full text-destructive hover:text-destructive\" onClick={onDelete}>\n <Trash2 className=\"mr-2 h-4 w-4\" />\n Excluir\n </Button>\n )}\n </div>\n </Card>\n </div>\n </div>\n )\n}\n\nfunction RecordLink({ reference, className = '' }: {\n reference: NonNullable<MediaFile['reference']>\n /** Quem chama define o tamanho: o mesmo link serve o cartão e o painel. */\n className?: string\n}) {\n return (\n <a\n href={recordRoute(reference)}\n title={`Abrir ${reference.label}`}\n className={`flex items-center gap-1 truncate font-medium text-primary hover:underline ${className}`}\n >\n <Package className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{reference.label}</span>\n </a>\n )\n}\n\nfunction FileMeta({ file, dimensions }: { file: MediaFile; dimensions?: Dimensions }) {\n const parts = [\n file.extension,\n dimensions ? `${dimensions.width}×${dimensions.height}` : '',\n formatSize(file.size),\n ].filter(Boolean)\n return <>{parts.join(' · ')}</>\n}\n\nfunction isLowResolution(file: MediaFile, dimensions?: Dimensions): boolean {\n return file.kind === 'image' && !!dimensions\n && Math.max(dimensions.width, dimensions.height) < LOW_RESOLUTION_PX\n}\n","// ---------------------------------------------------------------------------\n// Bling's constraints. They are shape, not implementation detail.\n// ---------------------------------------------------------------------------\n// Every number here changes what the connector IS, not how it is written:\n//\n// 3 req/s, 120k/day per account, summed across every module\n// → never one request per product, which is what forces the fast `sample`\n// and the background `backfill` apart.\n// a date filter wider than one year answers 400\n// → the window is always sliced; a backfill that reaches back two years is\n// two calls, decided by the client, not one call that fails.\n// authorization_code expires in 60 seconds, and 20 calls to /oauth/token in\n// 60 seconds block the IP for an hour\n// → refresh with days of slack, never in a loop, never at the deadline.\n// the refresh token lives 30 days and rotates on use\n// → scheduled renewal is a requirement; a tenant who does not shop for a\n// month otherwise comes back disconnected.\n// a webhook must be answered 2xx within 5 seconds or Bling DISABLES the\n// configuration\n// → receive, verify, enqueue, answer. No processing on the response path.\nimport type { RateLimitBudget } from '@fayz-ai/core/connector-runtime'\n\nexport const BLING_CONNECTOR_ID = 'bling'\n\n/** Per ACCOUNT, not per tenant: `instance_key` is the Bling company. */\nexport const BLING_RATE_LIMIT: RateLimitBudget = { perSecond: 3, perDay: 120_000 }\n\n/** Widest date filter Bling accepts. Anything longer answers 400. */\nexport const BLING_MAX_WINDOW_MS = 365 * 24 * 60 * 60_000\n\n/**\n * Re-read this much before the last window's end.\n *\n * Bling stamps `dataAlteracao` at second precision, so a product changed in the\n * same second the window closed is invisible for ever without an overlap. The\n * cost is an idempotent upsert; the cost of not having it is a price that never\n * updates and nobody can explain.\n */\nexport const BLING_WINDOW_OVERLAP_MS = 10 * 60_000\n\n/** Renew the token a week early. See the /oauth/token ban above. */\nexport const BLING_TOKEN_LEAD_MS = 7 * 24 * 60 * 60_000\n\n/** Bling's page size for the list endpoints. */\nexport const BLING_PAGE_SIZE = 100\n\n/**\n * A sample is one page, and one page only.\n *\n * At 3 req/s a ten-thousand-product catalogue is close to an hour. A connect\n * screen that waits for it is a connect screen nobody finishes, so the sample\n * answers with enough to design a storefront against and the backfill finishes\n * the mirror behind it.\n */\nexport const BLING_SAMPLE_SIZE = 100\n\n/** Bling signs its webhooks HMAC-SHA256 with the app's client secret. */\nexport const BLING_SIGNATURE_HEADER = 'x-bling-signature-256'\n\n/** Bling must see a 2xx before this, or it disables the tenant's webhook. */\nexport const BLING_WEBHOOK_DEADLINE_MS = 5_000\n","// The one place that names the Bling data plane. Same split as the Kiwify and\n// Stripe connectors: the definition declares WHAT the merchant can do, this file\n// knows how the call is made — and the credential path is what moves.\nimport {\n CONNECTOR_RUNTIME_TOKEN_HEADER,\n connectorRuntimeToken,\n getSupabaseClientOptional,\n type ConnectorDelivery,\n} from '@fayz-ai/core'\nimport { getShopTenantId } from '@fayz-ai/shop'\n\n/** The edge function that holds every Bling call this connector makes. */\nexport const BLING_FUNCTION = 'bling-sync'\n\n/** What a push leg answers with. Every field is a count the merchant can check. */\nexport interface BlingPushResult {\n runId?: string\n /** What the run settled as. The toast reads this, not \"it did not throw\". */\n status?: 'success' | 'partial' | 'error'\n filed: number\n skipped?: number\n stockPending?: number\n considered: number\n failures?: number\n message: string\n}\n\nexport interface BlingPullResult {\n runId?: string\n fetched: number\n inserted: number\n updated: number\n untouched: number\n sample: boolean\n}\n\ninterface MinimalClient {\n functions: {\n invoke: (\n name: string,\n options: { body: unknown; headers?: Record<string, string> },\n ) => Promise<{ data: unknown; error: { message: string } | null }>\n }\n from: (table: string) => any\n}\n\nfunction client(): MinimalClient {\n const supabase = getSupabaseClientOptional() as MinimalClient | null\n if (!supabase) throw new Error('Sem conexão com o banco para falar com o Bling.')\n return supabase\n}\n\n/**\n * One call to the data plane, carrying the two things it cannot derive: the\n * Supabase session (the gateway checks it) and the runtime token the function\n * FORWARDS to redeem this tenant's credential. Asked for here so a missing one\n * is refused before the round trip rather than as a failed run.\n */\nasync function invoke<T>(body: Record<string, unknown>): Promise<T> {\n const tenantId = getShopTenantId()\n if (!tenantId) throw new Error('Sem loja selecionada para sincronizar com o Bling.')\n const runtimeToken = await connectorRuntimeToken({ tenantId })\n\n const { data, error } = await client().functions.invoke(BLING_FUNCTION, {\n body: { ...body, tenantId },\n headers: { [CONNECTOR_RUNTIME_TOKEN_HEADER]: runtimeToken },\n })\n if (error) throw new Error(error.message)\n return data as T\n}\n\n/** Read one product. Writes nothing anywhere — the probe, not a sync. */\nexport function testBling(): Promise<{ ok: boolean; message?: string }> {\n return invoke({ action: 'test' })\n}\n\n/** Bring the catalogue down. `sample` is the seconds-long first answer. */\nexport function pullCatalogue(mode?: 'sample' | 'full'): Promise<BlingPullResult> {\n return invoke({ action: 'pull_products', ...(mode ? { mode } : {}) })\n}\n\n/** Send the products that exist only here. They come back linked — see the def. */\nexport function pushCatalogue(): Promise<BlingPushResult> {\n return invoke({ action: 'push_products' })\n}\n\n/** Send the buyers who have ordered, as Bling contacts. */\nexport function pushCustomers(): Promise<BlingPushResult> {\n return invoke({ action: 'push_customers' })\n}\n\n/** Send every paid order not filed yet, as a pedido de venda. */\nexport function pushOrders(): Promise<BlingPushResult> {\n return invoke({ action: 'push_orders' })\n}\n\n/** Lança o saldo dos produtos já vinculados. O reparo de um estoque que não subiu. */\nexport function pushStock(): Promise<{ sent: number; considered: number; message: string }> {\n return invoke({ action: 'push_stock' })\n}\n\n/**\n * Quantos registros ainda faltam subir, por fila.\n *\n * As mesmas ausências que a função usa como fila, contadas daqui: produto sem\n * vínculo, cliente que comprou e não virou contato, pedido pago sem pedido de\n * venda. É o que deixa a linha dizer \"em dia\" em vez de oferecer um botão que\n * não enviaria nada.\n */\nasync function countRows(table: string, apply: (q: any) => any): Promise<number | null> {\n const tenantId = getShopTenantId()\n const supabase = getSupabaseClientOptional() as MinimalClient | null\n if (!tenantId || !supabase) return null\n const { count, error } = await apply(\n supabase.from(table).select('id', { count: 'exact', head: true }).eq('tenant_id', tenantId),\n )\n return error ? null : (count ?? 0)\n}\n\nexport function pendingProducts(): Promise<number | null> {\n return countRows('plg_shop_products', (q: any) => q.is('external_source', null))\n}\n\nexport async function pendingCustomers(): Promise<number | null> {\n const tenantId = getShopTenantId()\n const supabase = getSupabaseClientOptional() as MinimalClient | null\n if (!tenantId || !supabase) return null\n const { data: linked } = await supabase\n .from('plg_shop_customer_links')\n .select('customer_id')\n .eq('tenant_id', tenantId)\n .eq('source', 'bling')\n const already = new Set((linked ?? []).map((row: any) => row.customer_id))\n const { data, error } = await supabase\n .from('plg_shop_customers')\n .select('id')\n .eq('tenant_id', tenantId)\n .gt('orders_count', 0)\n if (error) return null\n return (data ?? []).filter((row: any) => !already.has(row.id)).length\n}\n\nexport async function pendingOrders(): Promise<number | null> {\n const tenantId = getShopTenantId()\n const supabase = getSupabaseClientOptional() as MinimalClient | null\n if (!tenantId || !supabase) return null\n const { data: linked } = await supabase\n .from('plg_shop_order_links')\n .select('order_id')\n .eq('tenant_id', tenantId)\n .eq('source', 'bling')\n .eq('kind', 'sales_order')\n const already = new Set((linked ?? []).map((row: any) => row.order_id))\n const { data, error } = await supabase\n .from('plg_shop_orders')\n .select('id')\n .eq('tenant_id', tenantId)\n .neq('status', 'cancelled')\n if (error) return null\n return (data ?? []).filter((row: any) => !already.has(row.id)).length\n}\n\n/**\n * Which paid orders actually reached Bling — what a run's \"12 de 20\" cannot say.\n *\n * Read from the LINK TABLE, the same fact the push queue is built on: the link\n * exists exactly when Bling returned an id, so this screen cannot claim\n * \"enviado\" about something that was not.\n */\nexport async function listOrderDeliveries(limit = 10): Promise<ConnectorDelivery[]> {\n const tenantId = getShopTenantId()\n const supabase = getSupabaseClientOptional() as MinimalClient | null\n if (!tenantId || !supabase) return []\n\n const { data: orders } = await supabase\n .from('plg_shop_orders')\n .select('id,order_number,customer_name,customer_document,paid_at,created_at')\n .eq('tenant_id', tenantId)\n .neq('status', 'cancelled')\n .order('created_at', { ascending: false })\n .limit(limit)\n\n const rows = (orders ?? []) as Array<Record<string, any>>\n if (rows.length === 0) return []\n\n const { data: filed } = await supabase\n .from('plg_shop_order_links')\n .select('order_id,external_id,external_number,synced_at')\n .eq('tenant_id', tenantId)\n .eq('source', 'bling')\n .eq('kind', 'sales_order')\n .in('order_id', rows.map((row) => row.id))\n\n const byOrder = new Map<string, Record<string, any>>(\n ((filed ?? []) as Array<Record<string, any>>).map((row) => [row.order_id, row]),\n )\n\n return rows.map((order) => {\n const link = byOrder.get(order.id)\n const name = order.order_number ? `Pedido ${order.order_number}` : 'Pedido'\n if (link) {\n return {\n subject: name,\n subjectId: order.id,\n status: 'delivered',\n externalId: link.external_number ?? link.external_id,\n at: link.synced_at ?? order.paid_at,\n detail: order.customer_name ? String(order.customer_name) : undefined,\n }\n }\n // The one refusal explainable without asking Bling — and one the merchant\n // can fix.\n if (!String(order.customer_document ?? '').trim()) {\n return {\n subject: name,\n subjectId: order.id,\n status: 'failed',\n detail: 'sem CPF/CNPJ no pedido — o Bling não emite nota sem ele',\n at: order.paid_at ?? order.created_at,\n }\n }\n return {\n subject: name,\n subjectId: order.id,\n status: 'pending',\n detail: 'na fila — sobe na próxima sincronização',\n at: order.paid_at ?? order.created_at,\n }\n })\n}\n\n/** Both directions, everything pending. What the clock runs every fifteen minutes. */\nexport function reconcile(): Promise<{\n pull: BlingPullResult\n push: Record<string, BlingPushResult | { skipped: string }>\n}> {\n return invoke({ action: 'reconcile' })\n}\n","// Bling as a unified ConnectorDefinition, surfaced in Loja → configurações →\n// Integrações (rendered by the shared ConnectorsHub).\n//\n// It ships NO SQL. The connection is a row of plg_connections and the run\n// history is plg_sync_runs, both read through createConnectionStore — which is\n// what the gate in scripts/check-connector-tables.mjs exists to keep true.\nimport type { ConnectorDefinition } from '@fayz-ai/core'\nimport { connectionRuns, connectionStatus, createConnectionStore } from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\nimport {\n BLING_CONNECTOR_ID,\n BLING_RATE_LIMIT,\n BLING_SAMPLE_SIZE,\n} from './limits'\nimport {\n listOrderDeliveries,\n pendingCustomers,\n pendingOrders,\n pendingProducts,\n pullCatalogue,\n pushCatalogue,\n pushCustomers,\n pushOrders,\n pushStock,\n reconcile,\n} from './data'\n\n/**\n * `settingsKeys` and not `fields`: none of these is asked for in a form. Bling\n * authenticates by OAuth, so the connector's own code never sees a credential —\n * the hub routes secrets to the platform, and this connection has no secret\n * field to route in the first place.\n */\nexport const blingConnectionStore = () =>\n createConnectionStore(BLING_CONNECTOR_ID, {\n settingsKeys: ['companyId', 'backfillFrom', 'stockOwner', 'source', 'pushOrdersFrom'],\n })\n\nexport const blingConnectorDef: ConnectorDefinition = {\n id: BLING_CONNECTOR_ID,\n hostPluginId: 'shop',\n name: 'Bling',\n description:\n 'Traz o catálogo e o estoque do Bling para a loja e devolve cada pedido como pedido de venda, pronto para faturar.',\n // Quando sincroniza, em português e sem jargão. É a primeira pergunta de quem\n // conecta, e ela não tinha resposta em lugar nenhum da tela.\n howItSyncs: [\n 'Ao salvar um pedido, cliente ou produto aqui, a sincronização é antecipada e sobe em até um minuto.',\n 'De hora em hora, sozinho: traz do Bling o que mudou lá e envia o que estiver pendente daqui.',\n 'A qualquer momento, no botão Sincronizar agora.',\n 'Nada sobe duas vezes: cada registro guarda o número que recebeu no Bling.',\n ],\n icon: 'Boxes',\n authKind: 'oauth',\n // The catalogue files bling under `erp`, not `ecommerce`: Bling is the back\n // office, not the storefront. It shipped as 'commerce' — a word the catalogue\n // has never used — and the badge rendered nothing at all.\n category: 'erp',\n // Both ways, and the connector says so before anyone connects: the catalogue\n // comes in, the paid order goes out.\n direction: 'inbound',\n docsUrl: 'https://developer.bling.com.br/',\n // The catalogue is a MIRROR, which is why `shop_product` is read as well as\n // written: `reconcileMirror` has to see what is here before it decides what a\n // record missing from a page means. The consent also has to name what LEAVES:\n // the initial load sends the catalogue, the buyers who have ordered, and every\n // paid order up to Bling.\n permissions: [\n {\n kind: 'data',\n resource: 'shop_product',\n actions: ['read', 'write'],\n reason:\n 'Enviar ao Bling os produtos que ainda só existem aqui, e depois trazer de lá o catálogo, o preço e o estoque — comparando com o que já está na loja para não duplicar nem apagar produto por engano.',\n },\n {\n kind: 'data',\n resource: 'shop_customer',\n actions: ['read', 'write'],\n // `write` é o vínculo, não o cliente: sem ele cada pedido cria um contato\n // novo no Bling (o defeito que 0063 fecha).\n reason:\n 'Cadastrar como contato no Bling quem já comprou, para o pedido sair com nota. Nome, e-mail, telefone e CPF/CNPJ desse cliente vão para o Bling.',\n sensitive: true,\n },\n {\n kind: 'data',\n resource: 'shop_order',\n actions: ['read', 'write'],\n // Idem: grava-se o número que o pedido ganhou lá, que é o que permite\n // reenviar sem duplicar.\n reason:\n 'Ler o pedido pago para lançá-lo no Bling como pedido de venda, e guardar aqui o número que ele recebeu lá. O conteúdo do pedido não é alterado.',\n sensitive: true,\n },\n // Os momentos em que o ERP tem algo a fazer. `order_shipped` e\n // `order_delivered` ficam de fora de propósito: o pedido de venda já está\n // no Bling e o rastreio é outra história.\n {\n kind: 'event',\n // `order_confirmation` é o \"pedido feito\" no catálogo de fatos da loja\n // (packages/shop/src/lib/emails.ts). `shop.order_created` não existe, e\n // declarar um fato que ninguém publica é o bug que já aconteceu aqui.\n resource: 'shop.order_confirmation',\n actions: ['listen'],\n reason: 'Saber que um pedido foi feito, para lançá-lo no Bling como pedido de venda.',\n },\n {\n kind: 'event',\n resource: 'shop.order_paid',\n actions: ['listen'],\n reason: 'Saber que um pedido foi pago, para mandá-lo ao Bling como pedido de venda.',\n },\n {\n kind: 'event',\n resource: 'shop.order_cancelled',\n actions: ['listen'],\n reason: 'Saber que um pedido foi cancelado, para não lançá-lo no Bling.',\n },\n {\n kind: 'event',\n resource: 'shop.customer_welcome',\n actions: ['listen'],\n reason: 'Saber que um cliente foi cadastrado, para virar contato no Bling.',\n },\n ],\n // Declared, so the scheduler owns the clock. A `sleep` inside the connector\n // could not express the daily ceiling and could not be shared between the\n // catalogue pull and the order push running at the same time.\n rateLimit: BLING_RATE_LIMIT,\n // A ten-thousand-product catalogue at 3 req/s is close to an hour, so the\n // first load has two entries: a sample that answers in seconds, and a backfill\n // that finishes behind it.\n firstLoad: { sampleSize: BLING_SAMPLE_SIZE, samplePages: 1, stream: 'products' },\n // `shop.order_paid`, with an underscore. It shipped as `shop.order.paid`,\n // which is not a key anything publishes — the shop builds its facts as\n // `shop.${def.event}` over SHOP_EMAIL_EVENTS (packages/shop/src/lib/emails.ts),\n // and `eventKeyMatches` is exact for a pattern with no trailing star. The\n // managed automation was declared against a fact that could never arrive.\n subscribesTo: ['shop.order_confirmation', 'shop.order_paid', 'shop.order_cancelled', 'shop.customer_welcome'],\n managedAutomations: [\n { eventKey: 'shop.order_paid', label: 'Enviar o pedido para o Bling como pedido de venda' },\n { eventKey: 'shop.order_confirmation', label: 'Lançar o pedido novo no Bling como pedido de venda' },\n { eventKey: 'shop.order_cancelled', label: 'Parar de enviar ao Bling um pedido que foi cancelado' },\n { eventKey: 'shop.customer_welcome', label: 'Cadastrar como contato no Bling o cliente que comprou' },\n ],\n // O que ACONTECE, e não o que está declarado. Os dois primeiros são o gatilho\n // de escrita da migration 0064: salvar um pedido antecipa o próximo tique do\n // agendador, então a fila drena em até um minuto em vez de quinze.\n invokedAt: [\n {\n key: 'shop.order.wake',\n label: 'Um pedido é salvo ou pago aqui, e a sincronização é antecipada',\n plane: 'sync',\n trigger: 'on-write',\n touches: ['shop_order'],\n },\n {\n key: 'shop.order.push',\n label: 'O pedido pago sobe como pedido de venda no Bling',\n plane: 'sync',\n trigger: 'scheduled',\n touches: ['shop_order', 'shop_customer'],\n },\n {\n key: 'shop.catalogue.pull',\n label: 'O catálogo, o preço e o estoque do Bling descem para a loja',\n plane: 'sync',\n trigger: 'scheduled',\n touches: ['shop_product'],\n },\n ],\n // Read from the row the list already batched — one request for N connectors.\n ...connectionStatus(\n BLING_CONNECTOR_ID,\n (connection) => {\n if (!connection?.active) return { connected: false }\n const company = connection.settings?.companyId\n return {\n connected: connection.status === 'connected',\n detail: company ? `Empresa ${company}` : undefined,\n plane: 'sync',\n }\n },\n { store: blingConnectionStore },\n ),\n // The whole connect step. Declaring `authKind: 'oauth'` and no `startOAuth`\n // is what rendered the Conectar button DISABLED, with nothing on screen\n // saying why — the defect this connector was reported for. Bling ignores a\n // per-request `redirect_uri` and always uses what is registered on the app,\n // so the page to come back to travels inside the platform's signed state;\n // none of that is spelled here, which is the point of the helper.\n startOAuth: fayzConnectorOAuth(BLING_CONNECTOR_ID),\n // The other half of the consent, and the reason the first live test looped:\n // the platform stores the token and the pool stores \"is it on?\", and with\n // nobody writing the second the connector answered \"not connected\" to a\n // merchant who had just authorized. Called with no values — the credential is\n // not ours to see, and there is nothing to configure yet.\n saveConnection: async () => {\n await blingConnectionStore().save({ active: true })\n },\n // Disconnect FREEZES the mirror. It does not delete: a shopkeeper who unplugs\n // Bling still has a store, and a connector that empties the catalogue on\n // disconnect is a connector nobody dares to disconnect. `disconnect()` on the\n // shared store flips `active` and clears cursors — it never touches shop data.\n disconnect: async () => { await blingConnectionStore().disconnect() },\n // The one sentence that used to hang below Bling's own history panel, said\n // where the question is actually asked. It is the only thing in that panel\n // that was neither status, nor history, nor an act.\n disconnectNote:\n 'Desconectar congela o espelho: nenhum produto é apagado e o estoque para de ser atualizado.',\n // No panel of its own. The history is `plg_sync_runs` read through the shared\n // store, and the shared surface renders it — including the \"first load brings\n // a sample\" sentence, which it derives from `firstLoad` above rather than\n // repeating the number in prose.\n ...connectionRuns(blingConnectionStore),\n // Record by record, for the automations screen: the managed automation says a\n // paid order goes to Bling, and this is what says whether it arrived.\n listDeliveries: (options) => listOrderDeliveries(options?.limit ?? 10),\n // The same seam Google Calendar uses, so the two screens are one screen with\n // two sets of words. Before this, Bling's tab was a history with nothing that\n // could put a row in it. Ordered as somebody does them on the first day.\n syncActions: [\n {\n key: 'reconcile',\n label: 'Sincronizar agora',\n direction: 'inbound',\n // The one that is right on an ordinary day; the rest fold away.\n primary: true,\n description:\n 'Traz o que mudou no Bling e envia o que está pendente daqui — catálogo novo, clientes que compraram e pedidos pagos.',\n run: async () => {\n const result = await reconcile()\n const legs = Object.values(result.push ?? {})\n .map((leg: any) => (leg?.message ? String(leg.message) : null))\n .filter(Boolean)\n return [`${result.pull?.fetched ?? 0} produto(s) lidos do Bling`, ...legs].join(' · ')\n },\n },\n {\n key: 'pull_products',\n label: 'Trazer catálogo do Bling',\n direction: 'inbound',\n description: 'Preço e estoque do Bling passam a valer aqui. Nada é apagado da loja.',\n run: async () => {\n const result = await pullCatalogue('full')\n return `${result.fetched} produto(s) lidos, ${result.inserted} criado(s), ${result.updated} atualizado(s)`\n },\n },\n {\n key: 'push_products',\n label: 'Enviar catálogo para o Bling',\n direction: 'outbound',\n description:\n 'Sobe só o que ainda não existe lá. Depois de subir, quem manda no preço e no estoque passa a ser o Bling.',\n // Confirmed: a product filed at Bling cannot be taken back from here, and\n // the ownership handover is the part a merchant must agree to knowingly.\n confirm: {\n title: 'Enviar o catálogo para o Bling?',\n body:\n 'Os produtos que só existem aqui serão criados no Bling, com o saldo atual. A partir daí o Bling passa a mandar no preço e no estoque deles, e as mudanças vêm de lá para cá.',\n cta: 'Enviar catálogo',\n },\n pending: pendingProducts,\n run: async () => {\n const result = await pushCatalogue()\n return { message: result.message, status: result.status }\n },\n },\n {\n key: 'push_stock',\n label: 'Enviar saldo do estoque',\n direction: 'outbound',\n description:\n 'Lança no Bling o saldo dos produtos já enviados. Use quando um envio disser que o saldo não foi transferido.',\n run: async () => (await pushStock()).message,\n },\n {\n key: 'push_customers',\n label: 'Enviar clientes para o Bling',\n direction: 'outbound',\n description:\n 'Cadastra como contato quem já comprou. Cliente sem CPF/CNPJ fica de fora — o Bling precisa dele para emitir a nota.',\n confirm: {\n title: 'Enviar os clientes para o Bling?',\n body:\n 'Quem já comprou nesta loja será cadastrado como contato no Bling, com nome, e-mail, telefone e CPF/CNPJ. Quem não tem documento cadastrado não é enviado.',\n cta: 'Enviar clientes',\n },\n pending: pendingCustomers,\n run: async () => {\n const result = await pushCustomers()\n return { message: result.message, status: result.status }\n },\n },\n {\n key: 'push_orders',\n label: 'Enviar pedidos',\n direction: 'outbound',\n description:\n 'Cada pedido vira um pedido de venda no Bling, pago ou não — é lá que ele vira nota. Pedido cancelado não sobe.',\n confirm: {\n title: 'Enviar os pedidos para o Bling?',\n body:\n 'Cada pedido que ainda não subiu vira um pedido de venda no Bling, pago ou não. Pedido cancelado fica de fora, e um pedido já enviado não sobe duas vezes.',\n cta: 'Enviar pedidos',\n },\n pending: pendingOrders,\n run: async () => {\n const result = await pushOrders()\n return { message: result.message, status: result.status }\n },\n },\n ],\n}\n","// Bling ↔ canonical de-para. Pure, so the field-by-field agreement the brief\n// (docs/integrations/bling-integration-brief.md §5) settles is testable without\n// a Bling account.\nimport type { BlingProduto, MirroredProduct } from './types'\n\nfunction toNumber(value: unknown): number | null {\n if (value === null || value === undefined || value === '') return null\n const n = typeof value === 'number' ? value : Number(String(value).replace(',', '.'))\n return Number.isFinite(n) ? n : null\n}\n\n/**\n * One Bling product as the mirror stores it, or null when it carries no id.\n *\n * `situacao` is Bling's own on/off ('A' = ativo). It maps to archived rather\n * than to a delete: an inactive product in Bling is still a product, and this\n * connector has no vocabulary for deletion at all — see `pullProducts`.\n */\nexport function toMirroredProduct(raw: BlingProduto | null | undefined): MirroredProduct | null {\n if (!raw || raw.id === null || raw.id === undefined || raw.id === '') return null\n return {\n externalId: String(raw.id),\n sku: raw.codigo ? String(raw.codigo) : null,\n name: String(raw.nome ?? '').trim() || `Produto ${raw.id}`,\n price: toNumber(raw.preco),\n // Bling is the source of the stock number. The store mirrors it; it does not\n // decide it. See docs/integrations/bling-integration-brief.md §3.\n inventoryCount: toNumber(raw.estoque?.saldoVirtualTotal),\n status: String(raw.situacao ?? 'A').toUpperCase() === 'A' ? 'active' : 'archived',\n imageUrl: raw.imagemURL ? String(raw.imagemURL) : null,\n // Always null in practice: Bling does not return a change date at all (see\n // BlingProduto.dataAlteracao). Kept rather than deleted because the canonical\n // shape is shared with providers that do, and the run stamps its own\n // watermark either way.\n updatedAt: raw.dataAlteracao ? String(raw.dataAlteracao) : null,\n }\n}\n","// ---------------------------------------------------------------------------\n// Bling → canonical: the pull, and why it may never cancel anything.\n// ---------------------------------------------------------------------------\n// Bling has no memory of what it told us last time. There is no syncToken and\n// no tombstone: the only way to ask \"what changed\" is a date filter this client\n// computes, which is a `window` cursor. So the completeness of every run here is\n// `additive`, and that single word is what stops the engine from archiving a\n// product whose only crime was to fall outside the range.\n//\n// Everything is transport-injected — fetch, clock, sleep and the limiter — so\n// \"3000 SKUs enter without blowing 3 req/s\" is a proof rather than an impression.\n//\n// The import is split by subpath and that is load-bearing, not tidiness: the\n// edge function in ../../functions/bling-sync runs this file under Deno, where\n// `@fayz-ai/core` pulls React and the plugin registry and cannot load at all.\n// `@fayz-ai/core/connector-runtime` is the one entry written to be loadable\n// there, and it is the one specifier the app repos' functions-sync vendors.\n// `SyncResult` stays on the barrel because a type import is erased before Deno\n// ever sees it.\nimport {\n createRateLimiter,\n paginate,\n reconcileMirror,\n serializeCursor,\n sliceWindow,\n advanceWindow,\n type Completeness,\n type Cursor,\n type MirrorRecord,\n type RateLimiter,\n} from '@fayz-ai/core/connector-runtime'\nimport type { SyncResult } from '@fayz-ai/core'\nimport {\n BLING_MAX_WINDOW_MS,\n BLING_PAGE_SIZE,\n BLING_RATE_LIMIT,\n BLING_SAMPLE_SIZE,\n BLING_WINDOW_OVERLAP_MS,\n} from './limits'\nimport { toMirroredProduct } from './mapping'\nimport type { BlingProduto, MirroredProduct } from './types'\n\n/** One page of `GET /produtos`, as the caller's transport hands it over. */\nexport interface BlingProductPage {\n items: BlingProduto[]\n /** Bling has no next-page token: a short page is the last page. */\n short?: boolean\n}\n\nexport interface BlingPageRequest {\n pagina: number\n from: string\n to: string\n limite: number\n}\n\nexport interface PullProductsOptions {\n /** Where this run resumes. Absent = the first backfill. */\n cursor?: Cursor\n /** How far back a first run reaches. */\n backfillFrom?: string\n now?: number\n fetchPage(request: BlingPageRequest): Promise<BlingProductPage>\n /** Idempotent upsert into the canonical mirror. Returns whether it wrote. */\n upsert(product: MirroredProduct): Promise<boolean>\n /** Products already mirrored for this connection, for the reconciliation below. */\n linked?: MirrorRecord[]\n limiter?: RateLimiter\n pageSize?: number\n /** Stop after this many records — the `sample` phase. */\n maxRecords?: number\n maxPages?: number\n}\n\nexport interface PullProductsResult extends SyncResult {\n completeness: Completeness\n cursor: Cursor\n /** Local ids the run did NOT see and deliberately did not touch. */\n keptOutOfRange: string[]\n products: MirroredProduct[]\n pages: number\n /** Calls actually spent, so a caller can bill them against the daily budget. */\n calls: number\n}\n\n/** The window a first run asks for: `backfillFrom` (or a year back) until now. */\nexport function firstWindow(now: number, backfillFrom?: string): Extract<Cursor, { kind: 'window' }> {\n const parsed = backfillFrom ? Date.parse(backfillFrom) : NaN\n const from = Number.isFinite(parsed) ? parsed : now - BLING_MAX_WINDOW_MS\n return {\n kind: 'window',\n from: new Date(from).toISOString(),\n to: new Date(now).toISOString(),\n overlapMs: BLING_WINDOW_OVERLAP_MS,\n }\n}\n\n/** The window this run should ask for, given what the last one left behind. */\nexport function windowFor(options: Pick<PullProductsOptions, 'cursor' | 'backfillFrom' | 'now'>): Extract<Cursor, { kind: 'window' }> {\n const now = options.now ?? Date.now()\n const previous = options.cursor\n if (previous?.kind === 'window') return advanceWindow(previous, now)\n // A delta or period cursor arriving here is a connector mix-up, not a\n // recoverable state: starting over is the only honest answer.\n return firstWindow(now, options.backfillFrom)\n}\n\n/**\n * Pull the products Bling changed inside the window.\n *\n * `completeness` is hard-coded `additive` and it is not a default anyone should\n * \"improve\": Bling structurally cannot tell us a product was deleted, because\n * the question we asked was \"what changed between these two dates\". A run that\n * returned `authoritative` here would archive every product the store did not\n * happen to touch this week.\n */\nexport async function pullProducts(options: PullProductsOptions): Promise<PullProductsResult> {\n const now = options.now ?? Date.now()\n const cursor = windowFor({ cursor: options.cursor, backfillFrom: options.backfillFrom, now })\n const limiter = options.limiter ?? createRateLimiter(BLING_RATE_LIMIT)\n const limite = options.pageSize ?? BLING_PAGE_SIZE\n const maxRecords = options.maxRecords ?? Number.POSITIVE_INFINITY\n\n // A window wider than a year is a 400 from Bling, so it is sliced BEFORE the\n // first call. Discovering the cap in production means discovering it as a\n // backfill that never ran.\n const slices = sliceWindow(cursor.from, cursor.to, BLING_MAX_WINDOW_MS)\n\n const products: MirroredProduct[] = []\n const seen = new Set<string>()\n let pages = 0\n let calls = 0\n let written = 0\n let error: string | undefined\n\n try {\n for (const slice of slices) {\n if (products.length >= maxRecords) break\n const walked = await paginate<BlingProduto, BlingPageRequest>({\n first: { pagina: 1, from: slice.from, to: slice.to, limite },\n maxPages: options.maxPages ?? 1_000,\n fetchPage: async (request) => {\n await limiter.take()\n calls += 1\n const page = await options.fetchPage(request)\n pages += 1\n const items = page.items ?? []\n // Bling has no next-page token. The page is the last one when it came\n // back short — which is also why an off-by-one here silently drops a\n // whole page, the exact failure FAY-1377 was.\n const last = page.short === true || items.length < request.limite\n const enough = products.length + items.length >= maxRecords\n return { items, next: last || enough ? null : { ...request, pagina: request.pagina + 1 } }\n },\n })\n\n for (const raw of walked.items) {\n if (products.length >= maxRecords) break\n const mapped = toMirroredProduct(raw)\n if (!mapped) continue\n seen.add(mapped.externalId)\n products.push(mapped)\n if (await options.upsert(mapped)) written += 1\n }\n }\n } catch (caught) {\n error = String((caught as Error)?.message ?? caught)\n }\n\n // The whole point. Under `additive` this returns nothing to cancel and names\n // what it refused to touch, so the refusal is visible in the run rather than\n // being an absence of behaviour.\n const reconciled = reconcileMirror({\n completeness: 'additive',\n observed: seen,\n linked: options.linked ?? [],\n })\n\n const advanced: Cursor = error ? cursor : { ...cursor }\n return {\n status: error ? 'error' : products.length >= maxRecords ? 'partial' : 'success',\n completeness: 'additive',\n fetched: products.length,\n written,\n cursor: advanced,\n keptOutOfRange: reconciled.keptOutOfRange,\n products,\n pages,\n calls,\n error,\n stats: {\n pages,\n calls,\n window_from: cursor.from,\n window_to: cursor.to,\n slices: slices.length,\n kept_out_of_range: reconciled.keptOutOfRange.length,\n cursor: serializeCursor(advanced),\n },\n }\n}\n\n/**\n * The fast half of the first load: one page, seconds, enough to design against.\n *\n * It is a different call and not a flag because it makes a different promise —\n * `partial` by construction, never a basis for deciding anything is missing.\n */\nexport function sampleProducts(\n options: Omit<PullProductsOptions, 'maxRecords' | 'maxPages'> & { sampleSize?: number },\n): Promise<PullProductsResult> {\n return pullProducts({\n ...options,\n maxRecords: options.sampleSize ?? BLING_SAMPLE_SIZE,\n maxPages: 1,\n // A sample never reconciles: it saw one page of one window and knows less\n // about absence than any other run in the system.\n linked: [],\n })\n}\n","// ---------------------------------------------------------------------------\n// The two ways Bling reaches US, and neither of them knows a tenant.\n// ---------------------------------------------------------------------------\n// 1. OAuth started at the PROVIDER. The shopkeeper authorises inside Bling's\n// extension centre, so the callback arrives with no `state` and possibly no\n// Fayz account behind it at all. The ingress presumes a tenant in the URL,\n// which is exactly the premise this breaks. The answer is a connection that\n// exists before a tenant does, keyed by the account Bling DID name, and\n// claimed at signup — this is an acquisition channel, not an edge case.\n//\n// 2. Webhooks. Bling announces an account, never a tenant, and requires a 2xx\n// within 5 seconds or it DISABLES the tenant's configuration. So the\n// response path verifies, routes and enqueues; it processes nothing.\n//\n// Both land on `provider_account_key` and its partial unique index in\n// packages/db/migrations/029_connections.sql. Pure functions, so the routing is\n// provable without a Bling account and without a secret anywhere near a fixture.\nimport { BLING_CONNECTOR_ID } from './limits'\n\n/** What the platform learned from a Bling OAuth callback. */\nexport interface BlingCallback {\n /** Present only when Fayz started the flow. Absent on the Bling-first path. */\n state?: string | null\n /** Bling's own id for the authorising account. The only stable handle we get. */\n companyId?: string | null\n}\n\nexport type CallbackRoute =\n /** Fayz started it: the state names the tenant, and the connection is theirs. */\n | { mode: 'tenant'; state: string; providerAccountKey: string | null }\n /**\n * Bling started it: park the grant against the account, claimable at signup.\n * `source` is what makes the channel measurable instead of anecdotal.\n */\n | { mode: 'orphan'; providerAccountKey: string; source: string }\n /** Nothing identifies the grant. Nothing can be done with it later either. */\n | { mode: 'reject'; reason: string }\n\n/** Where Bling-first connections are attributed from. */\nexport const BLING_MARKETPLACE_SOURCE = 'bling_marketplace'\n\n/**\n * Decide what a callback becomes. A missing `state` is NOT an error — treating\n * it as one throws away the shopkeeper who arrived from Bling's own storefront.\n */\nexport function routeCallback(callback: BlingCallback): CallbackRoute {\n const account = callback.companyId ? String(callback.companyId).trim() : ''\n if (callback.state) return { mode: 'tenant', state: callback.state, providerAccountKey: account || null }\n if (account) return { mode: 'orphan', providerAccountKey: account, source: BLING_MARKETPLACE_SOURCE }\n return { mode: 'reject', reason: 'callback carried neither state nor companyId' }\n}\n\n/** The identity an orphan connection is stored under until someone claims it. */\nexport function orphanConnection(route: Extract<CallbackRoute, { mode: 'orphan' }>) {\n return {\n connectorId: BLING_CONNECTOR_ID,\n // The Bling company is the account, so it is also the instance key: two\n // companies are two connections, not two rows fighting over one.\n instanceKey: route.providerAccountKey,\n providerAccountKey: route.providerAccountKey,\n status: 'pending' as const,\n settings: { companyId: route.providerAccountKey, source: route.source, stockOwner: 'bling' as const },\n }\n}\n\n// ---------------------------------------------------------------------------\n// Webhooks\n// ---------------------------------------------------------------------------\n\nexport interface WebhookRequest {\n /** Raw body. Signed bytes, so it is verified before it is parsed. */\n body: string\n signature: string | null\n /** The account the event belongs to, read after verification. */\n providerAccountKey?: string | null\n}\n\nexport interface AcceptWebhookOptions {\n /**\n * Constant-time HMAC-SHA256 comparison, INJECTED. No key, no crypto import and\n * no fixture in this repo ever holds one — the secret lives in the platform\n * credential store and is handed to the edge function per call.\n */\n verify(body: string, signature: string | null): Promise<boolean> | boolean\n /** Find the tenant behind the account. Backed by uq_plg_connections_account_key. */\n resolve(providerAccountKey: string): Promise<{ tenantId: string; connectionId: string } | null>\n /** Hand the work to the queue. MUST NOT be awaited on the response path. */\n enqueue(job: { tenantId: string; connectionId: string; body: string }): Promise<void> | void\n onError?(error: unknown): void\n}\n\nexport interface WebhookVerdict {\n status: number\n /** Whether work was handed to the queue and is still outstanding. */\n queued: boolean\n reason?: string\n}\n\n/**\n * Answer Bling, then let the work happen.\n *\n * The 200 is not optimism: an unverified body was already rejected and a routed\n * job is already durable. What the 200 declines to wait for is the processing —\n * because a Bling webhook that has not been answered in 5 seconds does not\n * retry, it turns the tenant's integration off, and the tenant finds out weeks\n * later as \"Bling stopped working\".\n *\n * An unroutable account still answers 200. A 4xx there would make Bling disable\n * a configuration over an account we simply have not been given yet — the\n * orphan case above, arriving by webhook instead of by callback.\n */\nexport async function acceptWebhook(request: WebhookRequest, options: AcceptWebhookOptions): Promise<WebhookVerdict> {\n let ok = false\n try {\n ok = await options.verify(request.body, request.signature)\n } catch (error) {\n options.onError?.(error)\n ok = false\n }\n // The one refusal worth making: an unsigned body is not from Bling, and\n // answering 200 to it would let anyone move a tenant's stock.\n if (!ok) return { status: 401, queued: false, reason: 'signature' }\n\n const account = request.providerAccountKey ? String(request.providerAccountKey) : ''\n if (!account) return { status: 200, queued: false, reason: 'no account in payload' }\n\n let target: { tenantId: string; connectionId: string } | null = null\n try {\n target = await options.resolve(account)\n } catch (error) {\n options.onError?.(error)\n }\n if (!target) return { status: 200, queued: false, reason: 'unclaimed account' }\n\n try {\n await options.enqueue({ ...target, body: request.body })\n } catch (error) {\n options.onError?.(error)\n // Bling does not guarantee order and will re-deliver; a 5xx is the honest\n // answer when the job did not become durable, and it does not disable the\n // configuration the way a 4xx does.\n return { status: 500, queued: false, reason: 'enqueue failed' }\n }\n\n return { status: 200, queued: true }\n}\n","import type { AnalyticsCardDef, AnalyticsFilterDef, AnalyticsMeasure } from '@fayz-ai/core'\nimport { tl } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// The retail analytics pack.\n//\n// Owned by plugin-shop because shop owns the DATA: \"sales by product\" means the\n// same thing whether the tenant is a salon or a storefront, and declaring it\n// once here beats copying it into every vertical's config. A vertical pack\n// curates this list (order, placement, labels); it does not restate it.\n//\n// Every card reads a registered read model from migration 0066 and goes through\n// the generic analytics_run engine — no card needs its own SQL. A card is at\n// the same time a tile on /analytics, a row in /analytics/reports and a full\n// report at /analytics/reports/<id>: one definition, three sizes, which is what\n// stops a headline KPI and the report behind it from disagreeing.\n// ---------------------------------------------------------------------------\n\nconst ORDERS = 'plg_shop_rep_orders'\nconst ITEMS = 'plg_shop_rep_order_items'\nconst CUSTOMERS = 'plg_shop_rep_customers'\nconst PRODUCTS = 'plg_shop_rep_products'\n\nconst CANONICAL = 'public.plg_shop_orders'\n\n// --- Categories -------------------------------------------------------------\n// The chip on every report row and the grouping on the list. Declared once:\n// typing 'Vendas' in fourteen places is how a catalogue grows two categories\n// that differ by an accent.\n\nconst CAT = {\n sales: tl('Sales', 'Vendas'),\n orders: tl('Orders', 'Pedidos'),\n products: tl('Products', 'Produtos'),\n customers: tl('Customers', 'Clientes'),\n inventory: tl('Inventory', 'Estoque'),\n fulfillment: tl('Fulfillment', 'Entrega'),\n marketing: tl('Marketing', 'Marketing'),\n}\n\n// --- Shared filters, grouped for the categorized picker ---------------------\n\nconst financialStatus: AnalyticsFilterDef = {\n key: 'financial_status',\n label: tl('Payment status', 'Situação do pagamento'),\n type: 'multiselect',\n group: tl('Finance and payments', 'Financeiro e pagamentos'),\n options: [\n { label: tl('Paid', 'Pago'), value: 'paid' },\n { label: tl('Pending', 'Pendente'), value: 'pending' },\n { label: tl('Partially paid', 'Pago parcialmente'), value: 'partially_paid' },\n { label: tl('Refunded', 'Estornado'), value: 'refunded' },\n { label: tl('Partially refunded', 'Estornado parcialmente'), value: 'partially_refunded' },\n { label: tl('Voided', 'Cancelado'), value: 'voided' },\n ],\n}\n\nconst fulfillmentStatus: AnalyticsFilterDef = {\n key: 'fulfillment_status',\n label: tl('Fulfillment status', 'Situação da entrega'),\n type: 'multiselect',\n group: tl('Fulfillment', 'Entrega'),\n options: [\n { label: tl('Fulfilled', 'Enviado'), value: 'fulfilled' },\n { label: tl('Partially fulfilled', 'Enviado parcialmente'), value: 'partially_fulfilled' },\n { label: tl('Unfulfilled', 'Não enviado'), value: 'unfulfilled' },\n ],\n}\n\nconst orderStatus: AnalyticsFilterDef = {\n key: 'status',\n label: tl('Order status', 'Situação do pedido'),\n type: 'multiselect',\n group: tl('Orders', 'Pedidos'),\n options: [\n { label: tl('Open', 'Aberto'), value: 'open' },\n { label: tl('Archived', 'Arquivado'), value: 'archived' },\n { label: tl('Cancelled', 'Cancelado'), value: 'cancelled' },\n ],\n}\n\n// The items view carries the order's payment state under a prefixed name, so\n// the same picker narrows a line-item card without a second set of options.\nconst itemFinancialStatus: AnalyticsFilterDef = {\n ...financialStatus,\n key: 'order_financial_status',\n}\n\nconst productStatus: AnalyticsFilterDef = {\n key: 'status',\n label: tl('Product status', 'Situação do produto'),\n type: 'multiselect',\n group: tl('Inventory', 'Estoque'),\n options: [\n { label: tl('Active', 'Ativo'), value: 'active' },\n { label: tl('Draft', 'Rascunho'), value: 'draft' },\n { label: tl('Archived', 'Arquivado'), value: 'archived' },\n ],\n}\n\nconst orderFilters = [financialStatus, fulfillmentStatus, orderStatus]\n\n// --- Reusable measure fragments ---------------------------------------------\n\nconst M = {\n grossSales: { key: 'gross_sales', label: tl('Gross sales', 'Vendas brutas'), agg: 'sum', format: 'currency' },\n discounts: { key: 'discounts', label: tl('Discounts', 'Descontos'), agg: 'sum', format: 'currency' },\n netSales: { key: 'net_sales', label: tl('Net sales', 'Vendas líquidas'), agg: 'sum', format: 'currency' },\n shipping: { key: 'shipping', label: tl('Shipping', 'Frete'), agg: 'sum', format: 'currency' },\n taxes: { key: 'taxes', label: tl('Taxes', 'Impostos'), agg: 'sum', format: 'currency' },\n total: { key: 'total', label: tl('Total sales', 'Vendas totais'), agg: 'sum', format: 'currency' },\n paid: { key: 'paid_total', label: tl('Collected', 'Recebido'), agg: 'sum', format: 'currency' },\n orders: { key: 'orders', label: tl('Orders', 'Pedidos'), agg: 'count', format: 'number' },\n} satisfies Record<string, AnalyticsMeasure>\n\n/** Average order value — a ratio of two real measures, never an avg of ratios. */\nconst AOV: AnalyticsMeasure = {\n key: 'aov',\n label: tl('Average order value', 'Ticket médio'),\n agg: 'ratio',\n ratioOf: ['total', 'orders'],\n format: 'currency',\n}\n\nexport function buildShopAnalyticsCards(): AnalyticsCardDef[] {\n const base = { domain: 'shop', canonicalOwner: CANONICAL, compare: true }\n\n return [\n // =======================================================================\n // Row 1 — the four numbers a merchant opens the page for\n // =======================================================================\n {\n ...base,\n id: 'shop.total-sales',\n name: tl('Total sales', 'Vendas totais'),\n description: tl(\n 'Gross sales less discounts, plus shipping and taxes. What the store billed, paid or not.',\n 'Vendas brutas menos descontos, mais frete e impostos. O que a loja faturou, pago ou não.',\n ),\n icon: 'CircleDollarSign',\n category: CAT.sales,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [M.total],\n filters: orderFilters,\n },\n viz: { type: 'kpi', spark: true },\n dashboard: { span: 1, order: 0 },\n },\n {\n // Deliberately beside Total sales and not instead of it. A store on Pix\n // bills long before it is paid, and a merchant reading only the first\n // number sees money they cannot spend.\n ...base,\n id: 'shop.collected',\n name: tl('Collected', 'Recebido'),\n description: tl(\n 'Of everything billed in the period, the part that is actually paid.',\n 'De tudo o que foi faturado no período, a parte que já está paga.',\n ),\n icon: 'Banknote',\n category: CAT.sales,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [M.paid],\n filters: orderFilters,\n },\n viz: { type: 'kpi', spark: true },\n dashboard: { span: 1, order: 1 },\n },\n {\n ...base,\n id: 'shop.orders',\n name: tl('Orders', 'Pedidos'),\n description: tl(\n 'Orders placed in the period, cancellations included.',\n 'Pedidos feitos no período, cancelados inclusive.',\n ),\n icon: 'ShoppingCart',\n category: CAT.orders,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [M.orders],\n filters: orderFilters,\n },\n viz: { type: 'kpi', spark: true },\n dashboard: { span: 1, order: 2 },\n },\n {\n ...base,\n id: 'shop.aov',\n name: tl('Average order value', 'Ticket médio'),\n description: tl(\n 'Total sales over order count — the ratio of the totals, not the average of each order.',\n 'Vendas totais sobre número de pedidos — a razão dos totais, não a média de cada pedido.',\n ),\n icon: 'Receipt',\n category: CAT.sales,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n measures: [M.total, M.orders, AOV],\n filters: orderFilters,\n },\n viz: { type: 'kpi', measures: ['aov'] },\n dashboard: { span: 1, order: 3 },\n },\n\n // =======================================================================\n // Row 2 — basket and loyalty\n // =======================================================================\n {\n ...base,\n id: 'shop.units-per-order',\n name: tl('Items per order', 'Itens por pedido'),\n description: tl(\n 'Units sold over distinct orders. Rises when cross-sell works.',\n 'Unidades vendidas sobre pedidos distintos. Sobe quando a venda casada funciona.',\n ),\n icon: 'Boxes',\n category: CAT.orders,\n grain: 'order_item',\n query: {\n source: { kind: 'view', name: ITEMS },\n measures: [\n { key: 'units', label: tl('Units', 'Unidades'), agg: 'sum', column: 'quantity', format: 'number' },\n // count_distinct and not count(*): the row here is a LINE, and\n // counting lines would make \"items per order\" always exactly 1.\n { key: 'orders', label: tl('Orders', 'Pedidos'), agg: 'count_distinct', column: 'order_id', format: 'number' },\n {\n key: 'units_per_order', label: tl('Items per order', 'Itens por pedido'),\n agg: 'ratio', ratioOf: ['units', 'orders'], format: 'number',\n },\n ],\n filters: [itemFinancialStatus],\n },\n viz: { type: 'kpi', measures: ['units_per_order'] },\n dashboard: { span: 1, order: 4 },\n },\n {\n ...base,\n id: 'shop.units-sold',\n name: tl('Units sold', 'Unidades vendidas'),\n description: tl('Total units leaving the shelf in the period.', 'Total de unidades que saíram da prateleira no período.'),\n icon: 'Package',\n category: CAT.products,\n grain: 'order_item',\n query: {\n source: { kind: 'view', name: ITEMS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [{ key: 'units', label: tl('Units', 'Unidades'), agg: 'sum', column: 'quantity', format: 'number' }],\n filters: [itemFinancialStatus],\n },\n viz: { type: 'kpi', spark: true },\n dashboard: { span: 1, order: 5 },\n },\n {\n ...base,\n id: 'shop.returning-customer-rate',\n name: tl('Returning customer rate', 'Taxa de recompra'),\n description: tl(\n 'Share of orders placed by someone who had ordered before.',\n 'Fatia dos pedidos feitos por quem já havia comprado antes.',\n ),\n icon: 'Repeat',\n category: CAT.customers,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n measures: [\n { key: 'returning', label: tl('Returning orders', 'Pedidos de quem já comprou'), agg: 'sum', column: 'is_returning', format: 'number' },\n M.orders,\n {\n key: 'returning_rate', label: tl('Returning customer rate', 'Taxa de recompra'),\n agg: 'ratio', ratioOf: ['returning', 'orders'], scale: 100, format: 'percent',\n },\n ],\n filters: orderFilters,\n },\n viz: { type: 'kpi', measures: ['returning_rate'] },\n dashboard: { span: 1, order: 6 },\n },\n {\n ...base,\n id: 'shop.cancellation-rate',\n name: tl('Cancellation rate', 'Taxa de cancelamento'),\n description: tl(\n 'Share of orders in the period that were cancelled.',\n 'Fatia dos pedidos do período que acabaram cancelados.',\n ),\n icon: 'XCircle',\n category: CAT.orders,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n measures: [\n { key: 'cancelled', label: tl('Cancelled orders', 'Pedidos cancelados'), agg: 'sum', column: 'is_cancelled', format: 'number' },\n M.orders,\n {\n key: 'cancellation_rate', label: tl('Cancellation rate', 'Taxa de cancelamento'),\n agg: 'ratio', ratioOf: ['cancelled', 'orders'], scale: 100, format: 'percent',\n },\n ],\n filters: orderFilters,\n },\n viz: { type: 'kpi', measures: ['cancellation_rate'] },\n dashboard: { span: 1, order: 7 },\n },\n\n // =======================================================================\n // Row 3 — operations and what is sitting in the warehouse\n // =======================================================================\n {\n ...base,\n id: 'shop.days-to-fulfillment',\n name: tl('Time to dispatch', 'Tempo até o envio'),\n description: tl(\n 'Average time from order placed to first shipment. Orders never shipped are excluded, not counted as zero.',\n 'Tempo médio do pedido até a primeira remessa. Pedidos que nunca saíram ficam de fora, não entram como zero.',\n ),\n icon: 'Clock',\n category: CAT.fulfillment,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n measures: [{\n key: 'hours_to_fulfillment',\n label: tl('Time to dispatch', 'Tempo até o envio'),\n agg: 'avg',\n format: 'duration',\n }],\n filters: orderFilters,\n },\n viz: { type: 'kpi' },\n dashboard: { span: 1, order: 8 },\n },\n {\n ...base,\n id: 'shop.discounts-given',\n name: tl('Discounts given', 'Descontos concedidos'),\n description: tl(\n 'What coupons and promotions cost the store in the period.',\n 'Quanto os cupons e promoções custaram à loja no período.',\n ),\n icon: 'TicketPercent',\n category: CAT.marketing,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [M.discounts],\n filters: orderFilters,\n },\n viz: { type: 'kpi', spark: true },\n dashboard: { span: 1, order: 9 },\n },\n {\n // Snapshots: what is in the warehouse now, not what was created in the\n // last 30 days. `dateColumn: null` is what stops the range picker from\n // silently answering a different question.\n ...base,\n compare: false,\n id: 'shop.inventory-value',\n name: tl('Inventory value', 'Valor do estoque'),\n description: tl(\n 'Retail value of stock currently held. A snapshot — the date range does not apply.',\n 'Valor de venda do estoque parado hoje. É uma foto — o período selecionado não se aplica.',\n ),\n icon: 'Warehouse',\n category: CAT.inventory,\n grain: 'product',\n query: {\n source: { kind: 'view', name: PRODUCTS },\n dateColumn: null,\n measures: [{ key: 'inventory_retail_value', label: tl('Inventory value', 'Valor do estoque'), agg: 'sum', format: 'currency' }],\n filters: [productStatus],\n },\n viz: { type: 'kpi' },\n dashboard: { span: 1, order: 10 },\n },\n {\n ...base,\n compare: false,\n id: 'shop.out-of-stock',\n name: tl('Out of stock', 'Sem estoque'),\n description: tl(\n 'Active products with zero inventory — sales the storefront is turning away.',\n 'Produtos ativos com estoque zerado — vendas que a loja está recusando.',\n ),\n icon: 'PackageX',\n category: CAT.inventory,\n grain: 'product',\n query: {\n source: { kind: 'view', name: PRODUCTS },\n dateColumn: null,\n measures: [{ key: 'is_out_of_stock', label: tl('Out of stock', 'Sem estoque'), agg: 'sum', format: 'number' }],\n filters: [productStatus],\n },\n viz: { type: 'kpi' },\n dashboard: { span: 1, order: 11 },\n },\n\n // =======================================================================\n // Charts — the shape behind the headline numbers\n // =======================================================================\n {\n ...base,\n id: 'shop.sales-over-time',\n name: tl('Sales over time', 'Vendas ao longo do tempo'),\n description: tl(\n 'Billed against collected, bucketed by day, week or month depending on the range.',\n 'Faturado contra recebido, agrupado por dia, semana ou mês conforme o período.',\n ),\n icon: 'TrendingUp',\n category: CAT.sales,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [M.total, M.paid],\n filters: orderFilters,\n defaultSort: 'created_at',\n defaultSortDir: 'asc',\n },\n viz: { type: 'area' },\n dashboard: { span: 2, order: 20 },\n },\n {\n ...base,\n id: 'shop.orders-over-time',\n name: tl('Orders over time', 'Pedidos ao longo do tempo'),\n description: tl('Order volume across the period.', 'Volume de pedidos ao longo do período.'),\n icon: 'Activity',\n category: CAT.orders,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [M.orders],\n filters: orderFilters,\n defaultSort: 'created_at',\n defaultSortDir: 'asc',\n },\n viz: { type: 'line' },\n dashboard: { span: 2, order: 21 },\n },\n {\n ...base,\n id: 'shop.sales-by-product',\n name: tl('Sales by product', 'Vendas por produto'),\n description: tl(\n 'Revenue per product at line-item grain, so a multi-product order counts once per line.',\n 'Receita por produto no grão da linha, então um pedido com vários produtos conta uma vez por linha.',\n ),\n icon: 'Package',\n category: CAT.products,\n grain: 'order_item',\n query: {\n source: { kind: 'view', name: ITEMS },\n dimensions: [{ key: 'product_name', label: tl('Product', 'Produto') }],\n measures: [\n { key: 'revenue', label: tl('Revenue', 'Receita'), agg: 'sum', column: 'line_total', format: 'currency' },\n { key: 'units', label: tl('Units', 'Unidades'), agg: 'sum', column: 'quantity', format: 'number' },\n ],\n filters: [itemFinancialStatus],\n defaultSort: 'revenue',\n defaultSortDir: 'desc',\n },\n viz: { type: 'breakdown', measures: ['revenue'], limit: 6 },\n dashboard: { span: 2, order: 22 },\n },\n {\n ...base,\n id: 'shop.sales-by-category',\n name: tl('Sales by category', 'Vendas por categoria'),\n description: tl('Revenue split across catalogue categories.', 'Receita dividida entre as categorias do catálogo.'),\n icon: 'FolderTree',\n category: CAT.products,\n grain: 'order_item',\n query: {\n source: { kind: 'view', name: ITEMS },\n dimensions: [{ key: 'category_name', label: tl('Category', 'Categoria') }],\n measures: [{ key: 'revenue', label: tl('Revenue', 'Receita'), agg: 'sum', column: 'line_total', format: 'currency' }],\n filters: [itemFinancialStatus],\n defaultSort: 'revenue',\n defaultSortDir: 'desc',\n },\n viz: { type: 'donut' },\n dashboard: { span: 2, order: 23 },\n },\n {\n ...base,\n id: 'shop.sales-by-payment-status',\n name: tl('Sales by payment status', 'Vendas por situação do pagamento'),\n description: tl('Where the money sits: paid, pending, refunded.', 'Onde o dinheiro está: pago, pendente, estornado.'),\n icon: 'CreditCard',\n category: CAT.sales,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'financial_status', label: tl('Payment status', 'Situação do pagamento') }],\n measures: [M.total, M.orders],\n filters: [orderStatus],\n defaultSort: 'total',\n defaultSortDir: 'desc',\n },\n viz: { type: 'breakdown', measures: ['total'] },\n dashboard: { span: 2, order: 24 },\n },\n {\n ...base,\n id: 'shop.orders-by-fulfillment-status',\n name: tl('Orders by fulfillment status', 'Pedidos por situação da entrega'),\n description: tl(\n 'How much of the period is still waiting to leave the warehouse.',\n 'Quanto do período ainda está esperando para sair do estoque.',\n ),\n icon: 'Truck',\n category: CAT.fulfillment,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'fulfillment_status', label: tl('Fulfillment status', 'Situação da entrega') }],\n measures: [M.orders, M.total],\n filters: [financialStatus, orderStatus],\n defaultSort: 'orders',\n defaultSortDir: 'desc',\n },\n viz: { type: 'breakdown', measures: ['orders'] },\n dashboard: { span: 2, order: 25 },\n },\n {\n ...base,\n id: 'shop.new-customers',\n name: tl('New customers', 'Novos clientes'),\n description: tl('Customers acquired in the period, by signup date.', 'Clientes conquistados no período, pela data de cadastro.'),\n icon: 'UserPlus',\n category: CAT.customers,\n grain: 'customer',\n query: {\n source: { kind: 'view', name: CUSTOMERS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [{ key: 'customers', label: tl('New customers', 'Novos clientes'), agg: 'count', format: 'number' }],\n defaultSort: 'created_at',\n defaultSortDir: 'asc',\n },\n viz: { type: 'bar' },\n dashboard: { span: 2, order: 26 },\n },\n {\n ...base,\n id: 'shop.aov-over-time',\n name: tl('Average order value over time', 'Ticket médio ao longo do tempo'),\n description: tl(\n 'AOV per bucket, computed as that bucket’s total over its own order count.',\n 'Ticket médio por período, calculado como o total daquele período sobre os pedidos dele.',\n ),\n icon: 'LineChart',\n category: CAT.sales,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [M.total, M.orders, AOV],\n filters: orderFilters,\n defaultSort: 'created_at',\n defaultSortDir: 'asc',\n },\n viz: { type: 'line', measures: ['aov'] },\n dashboard: { span: 2, order: 27 },\n },\n\n // =======================================================================\n // Tables on the overview\n // =======================================================================\n {\n ...base,\n id: 'shop.sales-breakdown',\n name: tl('Sales breakdown', 'Composição das vendas'),\n description: tl(\n 'The money chain: gross sales → discounts → net sales → shipping and taxes → total.',\n 'A cadeia do dinheiro: vendas brutas → descontos → vendas líquidas → frete e impostos → total.',\n ),\n icon: 'Layers',\n category: CAT.sales,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n measures: [M.grossSales, M.discounts, M.netSales, M.shipping, M.taxes, M.total, M.paid],\n filters: orderFilters,\n },\n viz: { type: 'table' },\n dashboard: { span: 2, order: 30 },\n },\n {\n ...base,\n compare: false,\n id: 'shop.low-stock',\n name: tl('Running low', 'Estoque acabando'),\n description: tl(\n 'The products closest to zero, lowest first. A snapshot — the date range does not apply.',\n 'Os produtos mais perto do zero, do menor para o maior. É uma foto — o período não se aplica.',\n ),\n icon: 'PackageMinus',\n category: CAT.inventory,\n grain: 'product',\n query: {\n source: { kind: 'view', name: PRODUCTS },\n dateColumn: null,\n dimensions: [{ key: 'product_name', label: tl('Product', 'Produto') }],\n measures: [\n { key: 'inventory_count', label: tl('On hand', 'Em estoque'), agg: 'sum', format: 'number' },\n { key: 'units_sold', label: tl('Units sold', 'Vendidos'), agg: 'sum', format: 'number' },\n ],\n // Active products only by default: a draft with no stock is not a\n // shortage, it is a product that was never put on sale.\n filters: [{ ...productStatus, defaultValue: ['active'] }],\n defaultSort: 'inventory_count',\n defaultSortDir: 'asc',\n },\n viz: { type: 'table', limit: 6 },\n dashboard: { span: 2, order: 31 },\n },\n\n // =======================================================================\n // Report-list only — the long tail, reachable from /analytics/reports\n // =======================================================================\n {\n ...base,\n id: 'shop.sales-by-discount-code',\n name: tl('Sales by discount code', 'Vendas por cupom'),\n description: tl(\n 'Which coupons are actually being used, what they brought in and what they cost.',\n 'Quais cupons estão realmente sendo usados, o que trouxeram e o que custaram.',\n ),\n icon: 'TicketCheck',\n category: CAT.marketing,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'discount_code', label: tl('Discount code', 'Cupom') }],\n measures: [M.orders, M.discounts, M.total, M.paid],\n filters: orderFilters,\n defaultSort: 'discounts',\n defaultSortDir: 'desc',\n },\n viz: { type: 'table' },\n },\n {\n ...base,\n compare: false,\n id: 'shop.sell-through',\n name: tl('Sell-through by product', 'Giro por produto'),\n description: tl(\n 'Units sold as a share of everything ever held — sold plus still on hand. A snapshot; the date range does not apply.',\n 'Unidades vendidas sobre tudo o que já se teve — vendido mais o que está em estoque. É uma foto; o período não se aplica.',\n ),\n icon: 'Percent',\n category: CAT.inventory,\n grain: 'product',\n query: {\n source: { kind: 'view', name: PRODUCTS },\n dateColumn: null,\n dimensions: [{ key: 'product_name', label: tl('Product', 'Produto') }],\n measures: [\n { key: 'units_sold', label: tl('Units sold', 'Vendidos'), agg: 'sum', format: 'number' },\n { key: 'inventory_count', label: tl('On hand', 'Em estoque'), agg: 'sum', format: 'number' },\n // The denominator is a column on the read model, not sold+on-hand\n // recomputed here: summing the two separately and dividing is the same\n // arithmetic only while no product is missing from one of them.\n { key: 'units_ever_held', label: tl('Ever held', 'Total já tido'), agg: 'sum', format: 'number' },\n {\n key: 'sell_through', label: tl('Sell-through', 'Giro'),\n agg: 'ratio', ratioOf: ['units_sold', 'units_ever_held'], scale: 100, format: 'percent',\n },\n ],\n filters: [productStatus],\n defaultSort: 'units_sold',\n defaultSortDir: 'desc',\n },\n viz: { type: 'table' },\n },\n {\n ...base,\n compare: false,\n id: 'shop.top-customers',\n name: tl('Top customers by spend', 'Melhores clientes'),\n description: tl(\n 'Lifetime spend per customer. A snapshot of the customer base, not of the period.',\n 'Gasto de vida por cliente. Uma foto da base, não do período.',\n ),\n icon: 'Users',\n category: CAT.customers,\n grain: 'customer',\n query: {\n source: { kind: 'view', name: CUSTOMERS },\n dateColumn: null,\n dimensions: [\n {\n key: 'customer_name', label: tl('Customer', 'Cliente'),\n person: { idKey: 'customer_id', kind: 'shop_customer' },\n },\n // Grouped on but never shown. It is what the name links to — and also\n // what stops two customers called \"Silva\" from being reported as one.\n { key: 'customer_id', label: tl('Customer id', 'ID do cliente'), hidden: true },\n ],\n measures: [\n { key: 'total_spent', label: tl('Total spent', 'Total gasto'), agg: 'sum', format: 'currency' },\n { key: 'orders_count', label: tl('Orders', 'Pedidos'), agg: 'sum', format: 'number' },\n { key: 'avg_order_value', label: tl('Average order', 'Ticket médio'), agg: 'avg', format: 'currency' },\n ],\n defaultSort: 'total_spent',\n defaultSortDir: 'desc',\n },\n viz: { type: 'table' },\n },\n\n // --- Detail listings: raw rows, sortable, searchable, exportable --------\n // No dimensions and no measures, which is what routes them past the\n // aggregate engine to a plain paged SELECT over the read model.\n {\n ...base,\n id: 'shop.orders-detail',\n name: tl('Order list', 'Lista de pedidos'),\n description: tl(\n 'Every order in the period with its money breakdown and both statuses.',\n 'Todos os pedidos do período com a composição do valor e as duas situações.',\n ),\n icon: 'ShoppingBag',\n category: CAT.orders,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n filters: orderFilters,\n defaultSort: 'created_at',\n defaultSortDir: 'desc',\n },\n viz: { type: 'table' },\n columns: [\n { key: 'created_at', label: tl('Date', 'Data'), type: 'date', sortable: true },\n { key: 'order_number', label: tl('Order', 'Pedido'), type: 'number', sortable: true },\n {\n key: 'customer_name', label: tl('Customer', 'Cliente'),\n type: 'person', idKey: 'customer_id', personKind: 'shop_customer',\n },\n { key: 'customer_email', label: tl('Email', 'E-mail'), type: 'email' },\n { key: 'financial_status', label: tl('Payment', 'Pagamento'), type: 'text' },\n { key: 'fulfillment_status', label: tl('Fulfillment', 'Entrega'), type: 'text' },\n { key: 'net_sales', label: tl('Net sales', 'Vendas líquidas'), type: 'currency', aggregate: 'sum', sortable: true },\n { key: 'total', label: tl('Total', 'Total'), type: 'currency', aggregate: 'sum', sortable: true },\n ],\n },\n {\n ...base,\n id: 'shop.order-items-detail',\n name: tl('Sold items', 'Itens vendidos'),\n description: tl(\n 'Every line sold, joined to its product and category.',\n 'Cada linha vendida, ligada ao seu produto e categoria.',\n ),\n icon: 'List',\n category: CAT.products,\n grain: 'order_item',\n query: {\n source: { kind: 'view', name: ITEMS },\n filters: [itemFinancialStatus],\n defaultSort: 'created_at',\n defaultSortDir: 'desc',\n },\n viz: { type: 'table' },\n columns: [\n { key: 'created_at', label: tl('Date', 'Data'), type: 'date', sortable: true },\n { key: 'order_number', label: tl('Order', 'Pedido'), type: 'number', sortable: true },\n { key: 'product_name', label: tl('Product', 'Produto'), type: 'text' },\n { key: 'sku', label: 'SKU', type: 'text' },\n { key: 'category_name', label: tl('Category', 'Categoria'), type: 'text' },\n { key: 'quantity', label: tl('Qty', 'Qtd'), type: 'number', aggregate: 'sum', sortable: true },\n { key: 'unit_price', label: tl('Unit price', 'Preço unit.'), type: 'currency' },\n { key: 'line_total', label: tl('Total', 'Total'), type: 'currency', aggregate: 'sum', sortable: true },\n ],\n },\n {\n ...base,\n compare: false,\n id: 'shop.products-detail',\n name: tl('Catalogue and stock', 'Catálogo e estoque'),\n description: tl(\n 'Every product with price, stock on hand and lifetime sales. A snapshot — the date range does not apply.',\n 'Cada produto com preço, estoque e vendas de vida. É uma foto — o período não se aplica.',\n ),\n icon: 'Boxes',\n category: CAT.inventory,\n grain: 'product',\n query: {\n source: { kind: 'view', name: PRODUCTS },\n dateColumn: null,\n filters: [productStatus],\n defaultSort: 'revenue',\n defaultSortDir: 'desc',\n },\n viz: { type: 'table' },\n columns: [\n { key: 'product_name', label: tl('Product', 'Produto'), type: 'text' },\n { key: 'sku', label: 'SKU', type: 'text' },\n { key: 'category_name', label: tl('Category', 'Categoria'), type: 'text' },\n { key: 'status', label: tl('Status', 'Situação'), type: 'text' },\n { key: 'price', label: tl('Price', 'Preço'), type: 'currency', sortable: true },\n { key: 'inventory_count', label: tl('On hand', 'Em estoque'), type: 'number', aggregate: 'sum', sortable: true },\n { key: 'units_sold', label: tl('Units sold', 'Vendidos'), type: 'number', aggregate: 'sum', sortable: true },\n { key: 'revenue', label: tl('Revenue', 'Receita'), type: 'currency', aggregate: 'sum', sortable: true },\n { key: 'inventory_retail_value', label: tl('Stock value', 'Valor em estoque'), type: 'currency', aggregate: 'sum', sortable: true },\n ],\n },\n {\n ...base,\n id: 'shop.customers-detail',\n name: tl('Customer list', 'Lista de clientes'),\n description: tl(\n 'Customers acquired in the period, with what they have spent since.',\n 'Clientes conquistados no período, com o que gastaram desde então.',\n ),\n icon: 'Users',\n category: CAT.customers,\n grain: 'customer',\n query: {\n source: { kind: 'view', name: CUSTOMERS },\n defaultSort: 'total_spent',\n defaultSortDir: 'desc',\n },\n viz: { type: 'table' },\n columns: [\n {\n key: 'customer_name', label: tl('Customer', 'Cliente'),\n type: 'person', idKey: 'customer_id', personKind: 'shop_customer',\n },\n { key: 'email', label: tl('Email', 'E-mail'), type: 'email' },\n { key: 'created_at', label: tl('Since', 'Cliente desde'), type: 'date', sortable: true },\n { key: 'orders_count', label: tl('Orders', 'Pedidos'), type: 'number', aggregate: 'sum', sortable: true },\n { key: 'total_spent', label: tl('Total spent', 'Total gasto'), type: 'currency', aggregate: 'sum', sortable: true },\n { key: 'avg_order_value', label: tl('Average order', 'Ticket médio'), type: 'currency', sortable: true },\n { key: 'last_order_at', label: tl('Last order', 'Último pedido'), type: 'date', sortable: true },\n ],\n },\n ]\n}\n","import React from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport { registerMessageDefaults } from '@fayz-ai/core'\nimport {\n setShopTenantResolver, getShopProvider, registerShippingLabelProvider,\n buildShopDomainEvents, buildShopMessageDefaults,\n} from '@fayz-ai/shop'\nimport { createMelhorEnvioLabelProvider } from './integrations/melhor-envio/labelProvider'\nimport { shopCustomerLookup } from './views/customerLookup'\nimport {\n useOrganizationStore, createCrudPage, registerEntityPath, registerPersonLookup, adminNavigateTo,\n type CrudNavTab,\n} from '@fayz-ai/admin'\nimport {\n CircleDollarSign, CreditCard, Eye, FileEdit, FolderTree, Layers, Package, PackageX,\n Repeat, ShoppingBag, Tag, TicketCheck, Users, UsersRound, UserX, Filter,\n} from 'lucide-react'\nimport { buildShopProductEntity } from './views/productEntity'\nimport { buildShopCustomerEntity } from './views/customerEntity'\nimport { buildShopDiscountEntity } from './views/discountEntity'\nimport { buildShopCategoryEntity } from './views/categoryEntity'\nimport { buildShopCollectionEntity } from './views/collectionEntity'\nimport { buildShopGiftCardEntity } from './views/giftCardEntity'\nimport { buildShopCustomerGroupEntity } from './views/customerGroupEntity'\nimport { buildShopCustomerSegmentEntity } from './views/customerSegmentEntity'\nimport { createShopProductDataProvider } from './data/productDataProvider'\nimport { createShopCustomerDataProvider } from './data/customerDataProvider'\nimport { createShopDiscountDataProvider } from './data/discountDataProvider'\nimport { createShopCategoryDataProvider } from './data/categoryDataProvider'\nimport { createShopCollectionDataProvider } from './data/collectionDataProvider'\nimport { createShopGiftCardDataProvider } from './data/giftCardDataProvider'\nimport { createShopCustomerGroupDataProvider } from './data/customerGroupDataProvider'\nimport { createShopCustomerSegmentDataProvider } from './data/customerSegmentDataProvider'\nimport type { ShopProviderResolver } from './views/ShopPage'\nimport {\n StoreGeneralSettings, PaymentsSettings, CheckoutSettings,\n ShippingSettings, FulfillmentSettings,\n} from './settings'\nimport { melhorEnvioConnectorDef } from './integrations/melhor-envio/connectorDef'\nimport { appmaxConnectorDef } from './integrations/appmax/connectorDef'\nimport { abacatePayConnectorDef } from './integrations/abacatepay/connectorDef'\nimport { stripeConnectConnectorDef } from './integrations/stripe-connect/connectorDef'\nimport { vindiConnectorDef } from './integrations/vindi/connectorDef'\nimport { ChannelsPage } from './views/ChannelsPage'\nimport { ContentPage } from './views/ContentPage'\nimport { blingConnectorDef } from './integrations/bling'\nimport { SHIPPING_ZONES_REGISTRY } from './data/registries'\nimport { shippingRegistryPath } from './data/registry-routes'\nimport { buildShopAnalyticsCards } from './analytics/cards'\n\nconst ShopPage = React.lazy(() => import('./views/ShopPage').then((m) => ({ default: m.ShopPage })))\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface ShopPluginOptions {\n navPosition?: number\n navSection?: 'main' | 'secondary' | 'settings'\n navLabel?: string\n /** Override the nav labels of the store's groups and their children. */\n sectionLabels?: Partial<Record<\n | 'products' | 'orders' | 'customers' | 'discounts' | 'shipping'\n | 'collections' | 'categories' | 'giftCards' | 'content' | 'store' | 'emails'\n | 'customerGroups' | 'customerSegments' | 'stock', string>>\n scope?: PluginScope\n verticalId?: VerticalId\n currency?: { code?: string; locale?: string; symbol?: string }\n provider?: ShopProviderResolver\n /** Heading the store's settings screens are grouped under in the settings\n * rail. Default 'Commerce'. */\n settingsGroupLabel?: string\n /**\n * Contribute the retail analytics catalogue. Default TRUE — a store that\n * cannot report on its own sales is not a store. Pass false where the host\n * app supplies its own pack, so the two do not stack.\n */\n analyticsCards?: false\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createShopPlugin(options?: ShopPluginOptions): PluginManifest {\n const curr = { code: 'BRL', locale: 'pt-BR', symbol: 'R$', ...options?.currency }\n\n // Scope fallback shop queries to the active organization. Apps can inject a\n // provider when they want SDK-owned data access instead of the global runtime.\n setShopTenantResolver(() => useOrganizationStore.getState().currentOrg?.id)\n\n // O texto sugerido para cada fato. Os FATOS em si são declarados no\n // manifesto (`events`, abaixo): é de lá que webhook e auditoria leem, sem\n // passar por nada de mensageria.\n registerMessageDefaults(buildShopMessageDefaults())\n\n // Who can issue a label. Registered, not hard-coded: the order screen resolves\n // whichever carrier the store connected and calls the same four verbs.\n registerShippingLabelProvider(createMelhorEnvioLabelProvider(() =>\n (typeof options?.provider === 'function'\n ? options.provider()\n : options?.provider ?? getShopProvider())))\n\n // Teach the shared person-path registry where a SHOP customer lives. The\n // built-in map ships veterinary defaults (customer → /registry/tutors), so\n // without this PersonLink would resolve a shop customer to the wrong module.\n // Clientes sits under Pedidos — a customer is who a store has orders with.\n registerEntityPath('shop_customer', '/orders/customers')\n\n // And where to LOAD one from. A surface that only holds an id and a name — an\n // analytics cell — can now render the same card the order screen shows,\n // without every caller having to hand it the shop provider.\n registerPersonLookup('shop_customer', shopCustomerLookup(() => resolveProvider()))\n\n type ShopSection = 'products' | 'orders' | 'customers' | 'discounts' | 'shipping'\n\n // Orders keep the bespoke ShopPage rather than a generic CRUD: an order is not\n // a CRUD record — it needs fulfilment, refunds and a line-item view.\n const pageFor = (section?: ShopSection): React.ComponentType<unknown> => {\n const Wrapped: React.ComponentType<unknown> = () =>\n React.createElement(React.Suspense, { fallback: null },\n React.createElement(\n ShopPage as React.ComponentType<{ provider?: ShopProviderResolver; section?: ShopSection }>,\n { provider: options?.provider, section },\n )\n )\n Wrapped.displayName = section ? `ShopPage:${section}` : 'ShopPageWrapper'\n return Wrapped\n }\n\n // Products, customers and discounts all get the full generic CRUD (list +\n // form + detail + delete) from their EntityDef, rather than three bespoke\n // read-only tables. Orders stay on the custom page: an order is not a CRUD\n // record — it needs fulfilment, refunds and a line-item view, which is its\n // own screen.\n const resolveProvider = () =>\n typeof options?.provider === 'function'\n ? options.provider()\n : options?.provider ?? getShopProvider()\n\n const label = (key: keyof NonNullable<ShopPluginOptions['sectionLabels']>, fallback: string) =>\n options?.sectionLabels?.[key] ?? fallback\n\n // The heading the store's five settings screens are filed under. One constant\n // so the rail groups them: the shell keys the run off equal STRINGS, and five\n // hand-typed labels group as five sections the moment one of them is retyped.\n const COMMERCE_GROUP = options?.settingsGroupLabel ?? 'Commerce'\n\n // Each settings tab is a zero-prop component the shell instantiates, so the\n // props it actually needs (provider, currency) are closed over here. Named,\n // because an anonymous arrow makes every one of the five read as the same\n // frame in a React stack trace.\n const settingsTab = (\n name: string,\n render: () => React.ReactElement,\n ): React.ComponentType<unknown> => {\n const Tab: React.ComponentType<unknown> = () => render()\n Tab.displayName = name\n return Tab\n }\n\n // The header tab strip carries the STATUS FILTER of each list (Todos / Ativo /\n // Rascunho / Arquivado), declared per entity as `facets: [{ display: 'tabs' }]`.\n //\n // It deliberately does NOT carry sibling CRUDs here: the sidebar already lists\n // Produtos · Coleções · Categorias under \"Produtos\", and repeating those three\n // as tabs would give the same navigation twice on the same screen — two\n // controls that must be kept in sync and disagree the moment one is used. The\n // CrudListView `navTabs` slot exists for lists whose siblings are NOT in the\n // menu; nothing in this plugin is in that position.\n\n const ProductsCrudPage = createCrudPage(buildShopProductEntity(curr.code, resolveProvider), {\n dataProvider: createShopProductDataProvider(resolveProvider),\n feature: 'shop',\n stats: (items, total) => [\n { id: 'total', label: 'Produtos', value: total, icon: Package },\n { id: 'active', label: 'Ativos', value: items?.filter((p) => p.status === 'active').length ?? 0, icon: Eye },\n { id: 'draft', label: 'Rascunhos', value: items?.filter((p) => p.status === 'draft').length ?? 0, icon: FileEdit },\n { id: 'out-of-stock', label: 'Sem estoque', value: items?.filter((p) => (p.inventoryCount ?? 0) <= 0).length ?? 0, icon: PackageX },\n ],\n })\n\n // Clientes / Grupos / Segmentos are three DIFFERENT CRUDs about the same\n // people, and only \"Clientes\" is in the sidebar — so here the header strip\n // carries siblings rather than a status filter, and duplicates no menu entry.\n const customerTabs = (): CrudNavTab[] => [\n { id: 'customers', label: label('customers', 'Clientes'), icon: Users,\n onSelect: () => adminNavigateTo('/orders/customers') },\n { id: 'groups', label: label('customerGroups', 'Grupos'), icon: UsersRound,\n onSelect: () => adminNavigateTo('/orders/customers/groups') },\n { id: 'segments', label: label('customerSegments', 'Segmentos'), icon: Filter,\n onSelect: () => adminNavigateTo('/orders/customers/segments') },\n ]\n\n const CustomerGroupsCrudPage = createCrudPage(buildShopCustomerGroupEntity(), {\n dataProvider: createShopCustomerGroupDataProvider(resolveProvider),\n feature: 'shop',\n navTabs: customerTabs,\n activeNavTab: 'groups',\n stats: (items, total) => [\n { id: 'total', label: 'Grupos', value: total, icon: UsersRound },\n {\n id: 'members', label: 'Clientes agrupados', icon: Users,\n // Distinct people, not the sum: someone in two groups is still one\n // customer, and a sum would report more members than the store has.\n value: new Set((items ?? []).flatMap((g) => g.customerIds ?? [])).size,\n },\n {\n id: 'empty', label: 'Grupos vazios', icon: UserX,\n value: items?.filter((g) => (g.customerIds?.length ?? 0) === 0).length ?? 0,\n },\n { id: 'segments', label: 'Segmentos', pending: 'Ver aba', icon: Filter },\n ],\n })\n\n const CustomerSegmentsCrudPage = createCrudPage(buildShopCustomerSegmentEntity(curr.code), {\n dataProvider: createShopCustomerSegmentDataProvider(resolveProvider),\n feature: 'shop',\n navTabs: customerTabs,\n activeNavTab: 'segments',\n stats: (items, total) => [\n { id: 'total', label: 'Segmentos', value: total, icon: Filter },\n {\n id: 'matched', label: 'Maior segmento', icon: Users,\n value: items?.length ? Math.max(...items.map((s) => s.matchCount ?? 0)) : 0,\n },\n {\n id: 'empty', label: 'Sem ninguém', icon: UserX,\n value: items?.filter((s) => (s.matchCount ?? 0) === 0).length ?? 0,\n },\n { id: 'groups', label: 'Grupos', pending: 'Ver aba', icon: UsersRound },\n ],\n })\n\n const CustomersCrudPage = createCrudPage(buildShopCustomerEntity(), {\n dataProvider: createShopCustomerDataProvider(resolveProvider),\n feature: 'shop',\n navTabs: customerTabs,\n activeNavTab: 'customers',\n stats: (items, total) => [\n { id: 'total', label: 'Total de clientes', value: total, icon: Users },\n { id: 'with-orders', label: 'Com pedidos', value: items?.filter((c) => (c.ordersCount ?? 0) > 0).length ?? 0, icon: ShoppingBag },\n // Não computados ainda: um zero confiante aqui seria lido como medição.\n { id: 'repeat', label: 'Taxa de recompra', pending: 'Em breve', icon: Repeat },\n { id: 'aov', label: 'Ticket médio', pending: 'Em breve', icon: CircleDollarSign },\n ],\n })\n\n const DiscountsCrudPage = createCrudPage(buildShopDiscountEntity(), {\n dataProvider: createShopDiscountDataProvider(resolveProvider),\n feature: 'shop',\n stats: (items, total) => [\n { id: 'total', label: 'Total de cupons', value: total, icon: Tag },\n { id: 'active', label: 'Ativos agora', value: items?.filter((d) => d.status === 'active').length ?? 0, icon: Eye },\n { id: 'uses', label: 'Usos', value: items?.reduce((sum, d) => sum + (d.timesUsed ?? 0), 0) ?? 0, icon: TicketCheck },\n { id: 'draft', label: 'Rascunhos', value: items?.filter((d) => d.status === 'draft').length ?? 0, icon: FileEdit },\n ],\n })\n\n // Zonas de entrega NÃO têm mais página própria: viraram registry dentro de\n // Configurações → Entrega (buildShippingZonesRegistry). O EntityDef e o\n // dataProvider continuam os mesmos — só o lugar onde a tela abre mudou, e o\n // que mudou é o que estava errado: clicar em \"Zonas\" no meio de configurar a\n // entrega tirava o lojista de Configurações.\n\n const CategoriesCrudPage = createCrudPage(buildShopCategoryEntity(), {\n dataProvider: createShopCategoryDataProvider(resolveProvider),\n feature: 'shop',\n })\n\n const CollectionsCrudPage = createCrudPage(buildShopCollectionEntity(), {\n dataProvider: createShopCollectionDataProvider(resolveProvider),\n feature: 'shop',\n stats: (items, total) => [\n { id: 'total', label: 'Coleções', value: total, icon: Layers },\n { id: 'published', label: 'Publicadas', value: items?.filter((c) => c.published).length ?? 0, icon: Eye },\n { id: 'draft', label: 'Rascunhos', value: items?.filter((c) => !c.published).length ?? 0, icon: FileEdit },\n {\n id: 'members', label: 'Produtos agrupados', icon: Package,\n value: items?.reduce((sum, c) => sum + (c.productIds?.length ?? 0), 0) ?? 0,\n },\n ],\n })\n\n const GiftCardsCrudPage = createCrudPage(buildShopGiftCardEntity(curr.code), {\n dataProvider: createShopGiftCardDataProvider(resolveProvider),\n feature: 'shop',\n stats: (items, total) => {\n const money = (v: number) =>\n new Intl.NumberFormat(curr.locale, { style: 'currency', currency: curr.code }).format(v)\n const active = items?.filter((g) => g.status === 'active') ?? []\n return [\n { id: 'total', label: 'Cartões emitidos', value: total, icon: CreditCard },\n { id: 'active', label: 'Ativos', value: active.length, icon: Eye },\n // Saldo em aberto é passivo: dinheiro já recebido que a loja ainda deve\n // em produto. É o número que a conciliação procura aqui.\n {\n id: 'outstanding', label: 'Saldo em aberto', icon: CircleDollarSign,\n value: money(active.reduce((sum, g) => sum + (g.balance ?? 0), 0)),\n },\n {\n id: 'issued', label: 'Valor emitido', icon: TicketCheck,\n value: money(items?.reduce((sum, g) => sum + (g.initialBalance ?? 0), 0) ?? 0),\n },\n ]\n },\n })\n\n const ContentPageWrapped: React.ComponentType<unknown> = () =>\n React.createElement(ContentPage, { resolveProvider: options?.provider })\n ContentPageWrapped.displayName = 'ContentPage'\n\n\n\n\n\n\n\n\n // Canais de venda — wraps the ChannelsPage with the app's shop provider.\n const ChannelsPageWrapped: React.ComponentType<unknown> = () =>\n React.createElement(ChannelsPage, { resolveProvider: options?.provider })\n ChannelsPageWrapped.displayName = 'ChannelsPage'\n\n // -------------------------------------------------------------------------\n // Nav + routes\n // -------------------------------------------------------------------------\n // Routes are top-level (/products, /orders, /discounts) rather than nested\n // under /shop, because the shell nests nav by route PREFIX and only one level\n // deep: with everything under /shop the whole store collapsed into a single\n // \"Loja\" accordion. Top-level parents give the store its real shape — Pedidos\n // with Clientes under it, Produtos with Coleções and Categorias under it.\n //\n // `indexChild: false` on a parent means the parent is a plain link with\n // children beside it; leaving it on repeats the parent as its own first child\n // (Pedidos ▸ Pedidos · Clientes), which is what a group whose index IS a\n // destination should do.\n const navSection = options?.navSection ?? 'main'\n const navPosition = options?.navPosition ?? 6\n\n type NavEntry = {\n route: string\n label: string\n icon: string\n position: number\n indexChild?: boolean\n component: React.ComponentType<unknown>\n }\n\n const NAV: NavEntry[] = [\n // Pedidos ▸ Pedidos · Clientes\n { route: '/orders', label: label('orders', 'Pedidos'), icon: 'ShoppingBag',\n position: navPosition, component: pageFor('orders') },\n { route: '/orders/customers', label: label('customers', 'Clientes'), icon: 'Users',\n position: navPosition + 0.1, component: CustomersCrudPage as React.ComponentType<unknown> },\n\n // Produtos ▸ Produtos · Coleções · Categorias\n { route: '/products', label: label('products', 'Produtos'), icon: 'Package',\n position: navPosition + 1, component: ProductsCrudPage as React.ComponentType<unknown> },\n { route: '/products/collections', label: label('collections', 'Coleções'), icon: 'Layers',\n position: navPosition + 1.1, component: CollectionsCrudPage as React.ComponentType<unknown> },\n { route: '/products/categories', label: label('categories', 'Categorias'), icon: 'FolderTree',\n position: navPosition + 1.2, component: CategoriesCrudPage as React.ComponentType<unknown> },\n\n\n // Conteúdo — a biblioteca de arquivos (sem filhos).\n { route: '/content', label: label('content', 'Conteúdo'), icon: 'Image',\n position: navPosition + 2, indexChild: false, component: ContentPageWrapped },\n\n // Descontos ▸ Descontos · Gift Cards\n { route: '/discounts', label: label('discounts', 'Descontos'), icon: 'Tag',\n position: navPosition + 3, component: DiscountsCrudPage as React.ComponentType<unknown> },\n { route: '/discounts/gift-cards', label: label('giftCards', 'Gift Cards'), icon: 'CreditCard',\n position: navPosition + 3.1, component: GiftCardsCrudPage as React.ComponentType<unknown> },\n\n ]\n\n // Reachable but not in the nav. The storefront screens hang off the \"Seu site\"\n // widget in the sidebar footer (the app points its editRoute at /store), so\n // listing them again in the menu would be the same destination twice.\n // `title` + `parentRoute` são a definição de página: a barra da shell escreve\n // o título e desenha o \"←\" a partir daqui. Sem isso, uma tela fora do menu\n // casava só com o prefixo do pai e era rotulada com o nome dele — \"Pedidos\"\n // numa tela que não é a lista de pedidos —, e cada página acabava desenhando\n // a própria seta de voltar.\n const HIDDEN_ROUTES: Array<{\n path: string\n component: React.ComponentType<unknown>\n title?: string\n parentRoute?: string\n }> = [\n { path: '/store', component: ChannelsPageWrapped, title: label('store', 'Canais de venda') },\n // Reached from the Clientes tab strip, deliberately not from the menu:\n // three sidebar entries for one destination is the duplication the tab\n // strip exists to avoid. Nesting under /orders/customers also keeps\n // \"Clientes\" highlighted in the rail while you are on them.\n // Detalhe do modelo de e-mail. Sem entrada no menu: é uma linha da lista,\n // não um destino. Ganha do curinga /emails/* por especificidade de rota.\n { path: '/orders/customers/groups', component: CustomerGroupsCrudPage as React.ComponentType<unknown>,\n title: label('customerGroups', 'Grupos'), parentRoute: '/orders/customers' },\n { path: '/orders/customers/segments', component: CustomerSegmentsCrudPage as React.ComponentType<unknown>,\n title: label('customerSegments', 'Segmentos'), parentRoute: '/orders/customers' },\n ]\n\n // Where the store used to live. These REDIRECT rather than mounting the page\n // a second time: a generated CRUD page carries ONE `__crudBasePath`, so\n // mounting the same component at two paths left it with whichever was\n // registered last — and /orders/customers/new then resolved against\n // /customers and silently rendered the list instead of the form.\n const redirectTo = (target: string): React.ComponentType<unknown> => {\n const Redirect: React.ComponentType<unknown> = () => {\n React.useEffect(() => { adminNavigateTo(target) }, [])\n return null\n }\n Redirect.displayName = `Redirect(${target})`\n return Redirect\n }\n\n const LEGACY_ROUTES: Array<{ path: string; component: React.ComponentType<unknown> }> = [\n { path: '/shop', component: redirectTo('/products') },\n { path: '/shop/products', component: redirectTo('/products') },\n { path: '/shop/orders', component: redirectTo('/orders') },\n { path: '/shop/discounts', component: redirectTo('/discounts') },\n // As duas rotas antigas das zonas apontam para onde o cadastro passou a\n // viver. Existem em favorito e em link — tirá-las daria 404 para quem já\n // sabia o caminho.\n // Os dois redirects apontavam para `_properties/zonas`, que deixou de existir\n // quando o id virou slug em inglês — um link antigo caía numa aba vazia. A\n // rota vem do mesmo lugar que a tela usa.\n { path: '/shop/shipping', component: redirectTo(shippingRegistryPath(SHIPPING_ZONES_REGISTRY)) },\n { path: '/store/shipping', component: redirectTo(shippingRegistryPath(SHIPPING_ZONES_REGISTRY)) },\n { path: '/shop/channels', component: redirectTo('/store') },\n { path: '/customers', component: redirectTo('/orders/customers') },\n // A mensageria da loja virou parte de Automações — mesmos eventos, agora ao\n // lado dos do CRM e da agenda, e com WhatsApp além do e-mail.\n { path: '/emails', component: redirectTo('/automations') },\n { path: '/emails/:event', component: redirectTo('/automations') },\n ]\n\n const READ: { feature: 'shop'; action: 'read' } = { feature: 'shop', action: 'read' }\n\n return {\n id: 'shop',\n name: options?.navLabel ?? 'Shop',\n icon: 'ShoppingBag',\n version: '1.0.0',\n scope: options?.scope ?? 'vertical',\n verticalId: options?.verticalId,\n // Storefront/commerce-operator-console surface — targets the ecommerce\n // Panel world, not a saas admin app.\n scaffolds: ['ecommerce'],\n defaultEnabled: true,\n dependencies: [],\n navigation: NAV.map((entry) => ({\n section: navSection,\n position: entry.position,\n label: entry.label,\n route: entry.route,\n icon: entry.icon,\n permission: READ,\n ...(entry.indexChild === false ? { indexChild: false as const } : {}),\n })),\n routes: [\n ...NAV.map((entry) => ({ path: entry.route, component: entry.component, permission: READ })),\n ...HIDDEN_ROUTES.map((r) => ({ ...r, permission: READ })),\n ...LEGACY_ROUTES.map((r) => ({ ...r, permission: READ })),\n ],\n widgets: [],\n // Os ~28 cards de varejo. Ficam AQUI porque quem é dono do dado é dono do\n // número: \"vendas por produto\" quer dizer a mesma coisa numa loja e num\n // salão, e o plugin de Análises só sabe desenhar — ele não sabe o que é uma\n // venda. Cada card é ao mesmo tempo um bloco do painel, uma linha da lista\n // de relatórios e um relatório inteiro, então o KPI e o relatório atrás dele\n // não têm como discordar.\n analyticsCards: options?.analyticsCards === false ? [] : buildShopAnalyticsCards(),\n // Os fatos que a loja emite. Lidos por três consumidores — automações,\n // integrações e auditoria — e agregados pelo runtime só quando o plugin\n // está ATIVO, para um módulo desligado não anunciar eventos que não vêm.\n events: buildShopDomainEvents(),\n aiTools: [\n {\n id: 'shop.list-products',\n name: 'listProducts',\n description: 'Lists products in the shop catalog.',\n icon: 'Package',\n mode: 'read' as const,\n category: 'Shop',\n parameters: {\n type: 'object' as const,\n properties: {\n search: { type: 'string' as const, description: 'Filter by name' },\n status: { type: 'string' as const, enum: ['draft', 'active', 'archived'] },\n },\n },\n suggestions: [\n { label: 'What products are available?' },\n { label: 'Which products are out of stock?' },\n ],\n },\n {\n id: 'shop.list-orders',\n name: 'listOrders',\n description: 'Lists recent shop orders.',\n icon: 'ShoppingCart',\n mode: 'read' as const,\n category: 'Shop',\n parameters: {\n type: 'object' as const,\n properties: {\n financialStatus: { type: 'string' as const, enum: ['pending', 'paid', 'refunded', 'voided'] },\n fulfillmentStatus: { type: 'string' as const, enum: ['unfulfilled', 'partially_fulfilled', 'fulfilled'] },\n },\n },\n suggestions: [\n { label: 'Show me pending orders' },\n { label: 'How many orders were paid today?' },\n ],\n },\n ],\n // A loja não é UM ajuste. Era uma aba só, «Shop», com moeda, catálogo,\n // checkout e notificações empilhados num scroll — e nenhum deles gravava\n // nada. São cinco decisões de naturezas diferentes: quem cobra, quem pode\n // comprar, quanto custa entregar, quando a remessa nasce, e como a vitrine\n // se apresenta. Cada uma é uma tela, e as cinco se agrupam sob COMMERCE\n // (`group`), que é o que a rail de configurações passou a saber desenhar.\n //\n // `id: 'shop'` fica com a tela geral: /settings/shop é uma URL que já\n // existe, em favoritos e em links, e renumerá-la para ganhar simetria de\n // nomes seria quebrar o que funciona por estética.\n settings: [\n {\n id: 'shop',\n label: label('store', 'Loja'),\n icon: 'ShoppingBag',\n group: COMMERCE_GROUP,\n component: settingsTab('StoreGeneralSettings', () =>\n React.createElement(StoreGeneralSettings, { currency: curr, provider: options?.provider })),\n order: 30,\n permission: READ,\n },\n {\n id: 'shop-payments',\n label: 'Pagamentos',\n icon: 'CreditCard',\n group: COMMERCE_GROUP,\n component: settingsTab('PaymentsSettings', () =>\n React.createElement(PaymentsSettings, { provider: options?.provider })),\n order: 31,\n permission: READ,\n },\n {\n id: 'shop-checkout',\n label: 'Checkout',\n icon: 'ShoppingCart',\n group: COMMERCE_GROUP,\n component: settingsTab('CheckoutSettings', () =>\n React.createElement(CheckoutSettings, { provider: options?.provider })),\n order: 32,\n permission: READ,\n },\n {\n id: 'shop-shipping',\n label: label('shipping', 'Entrega'),\n icon: 'Truck',\n group: COMMERCE_GROUP,\n component: settingsTab('ShippingSettings', () =>\n React.createElement(ShippingSettings, { provider: options?.provider })),\n order: 33,\n permission: READ,\n },\n {\n id: 'shop-fulfillment',\n label: 'Fulfillment',\n icon: 'PackageCheck',\n group: COMMERCE_GROUP,\n component: settingsTab('FulfillmentSettings', () =>\n React.createElement(FulfillmentSettings, { provider: options?.provider })),\n order: 34,\n permission: READ,\n },\n ],\n // The store's stack, configured where the store is configured — zero new\n // screens (commerce-stack.md §0). Melhor Envio, AppMax and AbacatePay are\n // REQUEST-plane connectors: the buyer is waiting, so each declares a latency\n // budget and, because the carrier and the gateways want opposite answers to\n // the same failure, its own `onFailure`. Bling is the SYNC-plane one —\n // nobody is waiting on it, and what it declares instead is a call budget and\n // a windowed cursor.\n //\n // Two gateways on the shelf is the point: the store picks one, and the\n // second one arriving changed no contract — only how it authorizes.\n connectors: [\n melhorEnvioConnectorDef,\n appmaxConnectorDef,\n abacatePayConnectorDef,\n stripeConnectConnectorDef,\n vindiConnectorDef,\n blingConnectorDef,\n ],\n // What having a store makes plugable — the four above plus the ones still\n // to be built. Carried over from the Fayz plugin page's \"Integra com\" row,\n // minus Nuvemshop: the platform catalogue has no row for it, and a slug the\n // directory cannot back is refused rather than shown.\n integrations: ['shopify', 'stripe', 'mercadopago'],\n }\n}\n\nexport * from './integrations/bling'\n\n// The retail pack, exported so an app can curate it — reorder the overview,\n// relabel a card, drop one — by re-declaring an id in the analytics plugin's\n// `cards`, instead of forking the plugin to change one word.\nexport { buildShopAnalyticsCards } from './analytics/cards'\n\n// Re-export shop types so consumer apps only need @fayz-ai/plugin-shop\nexport type {\n Product, Order, ShopCustomer, Discount, Category,\n CreateProductInput, UpdateProductInput, ListProductsOptions,\n CreateOrderInput, UpdateOrderInput, ListOrdersOptions,\n} from '@fayz-ai/shop'\n\n// The store's stack on the request plane. Exported so an app can offer one and\n// not the other, and so the ConnectorsHub in a bespoke admin can render them.\nexport { melhorEnvioConnectorDef, MELHOR_ENVIO_CONNECTOR_ID, MELHOR_ENVIO_LATENCY_BUDGET_MS } from './integrations/melhor-envio/connectorDef'\nexport { appmaxConnectorDef, APPMAX_CONNECTOR_ID, APPMAX_LATENCY_BUDGET_MS } from './integrations/appmax/connectorDef'\nexport { abacatePayConnectorDef, ABACATEPAY_CONNECTOR_ID, ABACATEPAY_LATENCY_BUDGET_MS } from './integrations/abacatepay/connectorDef'\nexport { stripeConnectConnectorDef, STRIPE_CONNECT_CONNECTOR_ID, STRIPE_CONNECT_LATENCY_BUDGET_MS } from './integrations/stripe-connect/connectorDef'\nexport { vindiConnectorDef, VINDI_CONNECTOR_ID, VINDI_LATENCY_BUDGET_MS } from './integrations/vindi/connectorDef'\n"]}